From a994933ccbc957496522775a94aac3a83b19839f Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 30 Jun 2022 11:44:09 +0100 Subject: [PATCH 001/348] Nef_3: Fix conversion to a FaceGraph --- .../include/CGAL/Nef_3/SNC_const_decorator.h | 10 +++++ .../convert_nef_polyhedron_to_polygon_mesh.h | 20 +++++---- Nef_3/test/Nef_3/issue_6423.cpp | 44 +++++++++++++++++++ 3 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 Nef_3/test/Nef_3/issue_6423.cpp diff --git a/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h b/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h index a8b0123f3df2..910ba280e2fa 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h @@ -535,6 +535,16 @@ visit_shell_objects(typename Traits::SFace_handle f, Visitor& V) const } Halffacet_handle f = ec->twin()->facet(); if ( Done[f] ) continue; + Halffacet_handle tf = f->twin(); + if ((f->incident_volume() == tf->incident_volume()) && Done[tf]) { + continue; // for example when we have to do with the unbounded volume and a surface with boundaries + } + Volume_const_iterator unbounded = volumes_begin(); + Volume_const_iterator fit = f->incident_volume(); + Volume_const_iterator tfit = tf->incident_volume(); + if ((fit == unbounded) && (tfit != unbounded)) { + continue; // because we will later report it from the bounded side + } FacetCandidates.push_back(f); Done[f] = true; } } else if (fc.is_svertex() ) { 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 a5e5e6191207..f2a880c8872c 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 @@ -351,18 +351,22 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, typedef Cartesian_converter Converter; typename Nef_polyhedron::Volume_const_iterator vol_it = nef.volumes_begin(), vol_end = nef.volumes_end(); - if ( Nef_polyhedron::Infi_box::extended_kernel() ) ++vol_it; // skip Infi_box + + if (Nef_polyhedron::Infi_box::extended_kernel()) { + ++vol_it; // skip Infi_box + } + CGAL_assertion ( vol_it != vol_end ); - ++vol_it; // skip unbounded volume Converter to_output; for (;vol_it!=vol_end;++vol_it) - nef_to_pm::collect_polygon_mesh_info(points, - polygons, - nef, - vol_it->shells_begin(), - to_output, - triangulate_all_faces); + for(auto sit = vol_it->shells_begin(); sit != vol_it->shells_end(); ++sit) + nef_to_pm::collect_polygon_mesh_info(points, + polygons, + nef, + sit, + to_output, + triangulate_all_faces); } template diff --git a/Nef_3/test/Nef_3/issue_6423.cpp b/Nef_3/test/Nef_3/issue_6423.cpp new file mode 100644 index 000000000000..0ffad5bf0e1a --- /dev/null +++ b/Nef_3/test/Nef_3/issue_6423.cpp @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include +#include + +typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh SurfaceMesh; +typedef CGAL::Nef_polyhedron_3 NefPolyhedron; + + +int main(int argc, char* argv[]) +{ + SurfaceMesh surfaceMesh; + SurfaceMesh::Vertex_index v0 = surfaceMesh.add_vertex(Point_3(-1, 0, 0)); + SurfaceMesh::Vertex_index v1 = surfaceMesh.add_vertex(Point_3(1, 0, 0)); + SurfaceMesh::Vertex_index v2 = surfaceMesh.add_vertex(Point_3(0, 1, 0)); + + SurfaceMesh::Vertex_index v3 = surfaceMesh.add_vertex(Point_3(-1, 0, 1)); + SurfaceMesh::Vertex_index v4 = surfaceMesh.add_vertex(Point_3(1, 0, 1)); + SurfaceMesh::Vertex_index v5 = surfaceMesh.add_vertex(Point_3(0, 1, 1)); + + surfaceMesh.add_face(v0, v1, v2); + surfaceMesh.add_face(v3, v4, v5); + + make_tetrahedron(Point_3(-1, 0, 10), + Point_3(1, 0, 10), + Point_3(0, 1, 10), + Point_3(-1, 0, 11), + surfaceMesh); + + std::cout << "Before conversion, number_of_faces: " << surfaceMesh.number_of_faces() << std::endl; + + NefPolyhedron nefPoly(surfaceMesh); + std::cout << "NefPolyhedron, number_of_faces: " << nefPoly.number_of_facets() << std::endl; + std::cout << nefPoly << std::endl; + SurfaceMesh convertedSurfaceMesh; + CGAL::convert_nef_polyhedron_to_polygon_mesh(nefPoly, convertedSurfaceMesh, true); + std::cout << "After conversion, number_of_faces: " << convertedSurfaceMesh.number_of_faces() << std::endl; + std::cout << convertedSurfaceMesh << std::endl; + return EXIT_SUCCESS; +} From 07b04366a0e01015f0ccf2f9f49a43d4a7331dbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 6 Jul 2022 17:09:55 +0200 Subject: [PATCH 002/348] WIP --- Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h | 6 ------ .../graph/convert_nef_polyhedron_to_polygon_mesh.h | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h b/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h index 910ba280e2fa..c2c622a181e1 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h @@ -539,12 +539,6 @@ visit_shell_objects(typename Traits::SFace_handle f, Visitor& V) const if ((f->incident_volume() == tf->incident_volume()) && Done[tf]) { continue; // for example when we have to do with the unbounded volume and a surface with boundaries } - Volume_const_iterator unbounded = volumes_begin(); - Volume_const_iterator fit = f->incident_volume(); - Volume_const_iterator tfit = tf->incident_volume(); - if ((fit == unbounded) && (tfit != unbounded)) { - continue; // because we will later report it from the bounded side - } FacetCandidates.push_back(f); Done[f] = true; } } else if (fc.is_svertex() ) { 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 f2a880c8872c..bb11c0daacef 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 @@ -359,14 +359,28 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, CGAL_assertion ( vol_it != vol_end ); Converter to_output; + bool handling_unbounded_volume = true; + + auto shell_is_closed = [](typename Nef_polyhedron::SFace_const_handle sfh) + { + typename Nef_polyhedron::Halffacet_handle f = sfh; + return f->incident_volume()!=f->twin()->incident_volume(); + }; + for (;vol_it!=vol_end;++vol_it) + { for(auto sit = vol_it->shells_begin(); sit != vol_it->shells_end(); ++sit) + { + if ( (handling_unbounded_volume || sit!=vol_it->shells_begin()) && shell_is_closed(sit)) continue; nef_to_pm::collect_polygon_mesh_info(points, polygons, nef, sit, to_output, triangulate_all_faces); + } + handling_unbounded_volume = false; + } } template From 69c4af61a9a3aae06c00e79cada527659439f81f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 7 Jul 2022 09:21:10 +0200 Subject: [PATCH 003/348] fix types, still not valid --- .../CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 bb11c0daacef..98fb89d7192d 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 @@ -361,9 +361,9 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, Converter to_output; bool handling_unbounded_volume = true; - auto shell_is_closed = [](typename Nef_polyhedron::SFace_const_handle sfh) + auto shell_is_closed = [](typename Nef_polyhedron::Shell_entry_const_iterator sfh) { - typename Nef_polyhedron::Halffacet_handle f = sfh; + typename Nef_polyhedron::Halffacet_const_handle f = sfh; return f->incident_volume()!=f->twin()->incident_volume(); }; From 744a9643722d2d8a17685b41b0bf6b29f1ca8e91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 7 Jul 2022 09:36:39 +0200 Subject: [PATCH 004/348] fix compilation errors --- .../boost/graph/convert_nef_polyhedron_to_polygon_mesh.h | 8 ++++++-- Nef_3/test/Nef_3/issue_6423.cpp | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) 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 98fb89d7192d..c055798f877a 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 @@ -363,8 +363,12 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, auto shell_is_closed = [](typename Nef_polyhedron::Shell_entry_const_iterator sfh) { - typename Nef_polyhedron::Halffacet_const_handle f = sfh; - return f->incident_volume()!=f->twin()->incident_volume(); + typename Nef_polyhedron::Halffacet_const_handle f; + + if (CGAL::assign(f,*sfh)) + return f->incident_volume()!=f->twin()->incident_volume(); + else + return false; }; for (;vol_it!=vol_end;++vol_it) diff --git a/Nef_3/test/Nef_3/issue_6423.cpp b/Nef_3/test/Nef_3/issue_6423.cpp index 0ffad5bf0e1a..5eeb664f23b2 100644 --- a/Nef_3/test/Nef_3/issue_6423.cpp +++ b/Nef_3/test/Nef_3/issue_6423.cpp @@ -11,7 +11,7 @@ typedef CGAL::Surface_mesh SurfaceMesh; typedef CGAL::Nef_polyhedron_3 NefPolyhedron; -int main(int argc, char* argv[]) +int main() { SurfaceMesh surfaceMesh; SurfaceMesh::Vertex_index v0 = surfaceMesh.add_vertex(Point_3(-1, 0, 0)); From 31868332680d0219bbe94500ea460f9bdbe1fef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 7 Jul 2022 10:16:18 +0200 Subject: [PATCH 005/348] WIP working with simple soup example --- .../convert_nef_polyhedron_to_polygon_mesh.h | 80 +++++++++++++++++-- 1 file changed, 75 insertions(+), 5 deletions(-) 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 c055798f877a..218e7210866e 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 @@ -363,12 +363,82 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, auto shell_is_closed = [](typename Nef_polyhedron::Shell_entry_const_iterator sfh) { - typename Nef_polyhedron::Halffacet_const_handle f; + typename Nef_polyhedron::SFace_const_handle sf = sfh; - if (CGAL::assign(f,*sfh)) - return f->incident_volume()!=f->twin()->incident_volume(); - else - return false; + typename Nef_polyhedron::SFace_cycle_const_iterator fc; + for(fc = sf->sface_cycles_begin(); fc != sf->sface_cycles_end(); ++fc) + { + if (fc.is_shalfedge() ) { + typename Nef_polyhedron::SHalfedge_const_handle e(fc); + typename Nef_polyhedron::SHalfedge_around_sface_const_circulator ec(e),ee(e); + CGAL_For_all(ec,ee) + { + typename Nef_polyhedron::SVertex_const_handle vv = ec->twin()->source(); + //~ if ( !SD.is_isolated(vv) && !Done[vv] ) { + //~ V.visit(vv); // report edge + //~ Done[vv] = Done[vv->twin()] = true; + //~ } + typename Nef_polyhedron::Halffacet_const_handle f = ec->twin()->facet(); + return f->incident_volume()!=f->twin()->incident_volume(); + //~ if ( Done[f] ) continue; + //~ Halffacet_handle tf = f->twin(); + //~ } + //~ FacetCandidates.push_back(f); Done[f] = true; + } + } + +#if 0 + else if (fc.is_svertex() ) { + SVertex_handle v(fc); + if ( Done[v] ) continue; + V.visit(v); // report edge + V.visit(v->twin()); + Done[v] = Done[v->twin()] = true; + CGAL_assertion(SD.is_isolated(v)); + SFaceCandidates.push_back(v->twin()->incident_sface()); + Done[v->twin()->incident_sface()]=true; + // note that v is isolated, thus twin(v) is isolated too + // SM_const_decorator SD; + // SFace_const_handle fo; + // fo = v->twin()->incident_sface(); + /* + if(SD.is_isolated(v)) + fo = v->source()->sfaces_begin(); + else + fo = v->twin()->incident_sface(); + */ + } else if (fc.is_shalfloop() ) { + SHalfloop_handle l(fc); + V.visit(l); + Halffacet_handle f = l->twin()->facet(); + if ( Done[f] ) continue; + FacetCandidates.push_back(f); Done[f] = true; + } else CGAL_error_msg("Damn wrong handle."); +#endif + } + + return false; + + //~ typename Nef_polyhedron::SHalfedge_const_handle e(sf); + //~ typename Nef_polyhedron::SHalffacet_const_handle f = e->facet(); + //~ e->facet() + //~ SHalfedge_around_sface_circulator ec(e),ee(e); + //~ CGAL_For_all(ec,ee) { + //~ SVertex_handle vv = ec->twin()->source(); + //~ if ( !SD.is_isolated(vv) && !Done[vv] ) { + //~ V.visit(vv); // report edge + //~ Done[vv] = Done[vv->twin()] = true; + //~ } + //~ Halffacet_handle f = ec->twin()->facet(); + //~ if ( Done[f] ) continue; + + //~ if (CGAL::assign(f,*sfh)) + //~ { + //~ std::cout << "COUCOU\n"; + //~ return f->incident_volume()!=f->twin()->incident_volume(); + //~ } + //~ else + //~ return false; }; for (;vol_it!=vol_end;++vol_it) From 78730a1b8f7ce324204f31f10d18d4db0a355ea3 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 21 Nov 2023 17:34:19 +0100 Subject: [PATCH 006/348] add examples to try running Poisson reconstruction with Mesh_3 in parallel --- .../CMakeLists.txt | 15 ++ .../poisson_reconstruction_example.cpp | 29 ++- .../poisson_reconstruction_mesh3_example.cpp | 190 ++++++++++++++++++ 3 files changed, 228 insertions(+), 6 deletions(-) create mode 100644 Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt index d62b4bccd030..027f08be6172 100644 --- a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt @@ -18,6 +18,9 @@ if(MSVC) message(STATUS "USING RELEASE EXEFLAGS = '${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_RELEASE}'") endif() +# Activate Parallelism in Mesh_3 +option(CGAL_ACTIVATE_CONCURRENT_MESH_3 "Activate parallelism in Mesh_3" OFF) + # Find Eigen3 (requires 3.1.0 or greater) find_package(Eigen3 3.1.0 QUIET) include(CGAL_Eigen3_support) @@ -25,6 +28,8 @@ if(TARGET CGAL::Eigen3_support) # Executables that require Eigen 3 create_single_source_cgal_program("poisson_reconstruction_example.cpp") target_link_libraries(poisson_reconstruction_example PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("poisson_reconstruction_mesh3_example.cpp") + target_link_libraries(poisson_reconstruction_mesh3_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("poisson_reconstruction.cpp") target_link_libraries(poisson_reconstruction PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("poisson_reconstruction_function.cpp") @@ -34,3 +39,13 @@ if(TARGET CGAL::Eigen3_support) else() message("NOTICE: The examples require Eigen 3.1 (or greater) will not be compiled.") endif() + +# Use TBB for parallelism +if(CGAL_ACTIVATE_CONCURRENT_MESH_3) + find_package(TBB REQUIRED) + include(CGAL_TBB_support) + if(TARGET CGAL::TBB_support) + add_definitions(-DCGAL_CONCURRENT_MESH_3) + target_link_libraries(poisson_reconstruction_mesh3_example PUBLIC CGAL::TBB_support) + endif()#Find TBB +endif()#Parallelism in Mesh_3 diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp index 92fef2cc1105..d070b1b88b98 100644 --- a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp @@ -16,6 +16,8 @@ #include #include +#include + // Types typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef Kernel::FT FT; @@ -32,18 +34,19 @@ typedef CGAL::Surface_mesh_default_triangulation_3 STr; typedef CGAL::Surface_mesh_complex_2_in_triangulation_3 C2t3; typedef CGAL::Implicit_surface_3 Surface_3; -int main(void) +int main(int argc, char* argv[]) { // Poisson options FT sm_angle = 20.0; // Min triangle angle in degrees. - FT sm_radius = 30; // Max triangle size w.r.t. point set average spacing. - FT sm_distance = 0.375; // Surface Approximation error w.r.t. point set average spacing. + FT sm_radius = 100; // Max triangle size w.r.t. point set average spacing. + FT sm_distance = 0.25; // Surface Approximation error w.r.t. point set average spacing. // Reads the point set file in points[]. // Note: read_points() requires an iterator over points // + property maps to access each point's position and normal. PointList points; - if(!CGAL::IO::read_points(CGAL::data_file_path("points_3/kitten.xyz"), std::back_inserter(points), + char* filename = argv[1]; + if(!CGAL::IO::read_points(filename, std::back_inserter(points), CGAL::parameters::point_map(Point_map()) .normal_map (Normal_map()))) { @@ -51,11 +54,15 @@ int main(void) return EXIT_FAILURE; } + CGAL::Timer total_time; + total_time.start(); + // Creates implicit function from the read points using the default solver. // Note: this method requires an iterator over points // + property maps to access each point's position and normal. - Poisson_reconstruction_function function(points.begin(), points.end(), Point_map(), Normal_map()); + Poisson_reconstruction_function function(points.begin(), points.end(), + Point_map(), Normal_map()); // Computes the Poisson indicator function f() // at each vertex of the triangulation. @@ -73,10 +80,17 @@ int main(void) Sphere bsphere = function.bounding_sphere(); FT radius = std::sqrt(bsphere.squared_radius()); + std::cout << "inner_point = " << inner_point << std::endl; + std::cout << "bsphere = " << bsphere.center() + << "\tsqr = " << bsphere.squared_radius() << std::endl; + std::cout << "radius = " << radius << std::endl; + // Defines the implicit surface: requires defining a // conservative bounding sphere centered at inner point. FT sm_sphere_radius = 5.0 * radius; FT sm_dichotomy_error = sm_distance*average_spacing/1000.0; // Dichotomy error must be << sm_distance + std::cout << "dichotomy error = " << sm_dichotomy_error << std::endl; + Surface_3 surface(function, Sphere(inner_point,sm_sphere_radius*sm_sphere_radius), sm_dichotomy_error/sm_sphere_radius); @@ -101,8 +115,11 @@ int main(void) std::ofstream out("kitten_poisson-20-30-0.375.off"); Polyhedron output_mesh; CGAL::facets_in_complex_2_to_triangle_mesh(c2t3, output_mesh); - out << output_mesh; + total_time.stop(); + std::cout << "Total time : " << total_time.time() << " seconds." << std::endl; + + out << output_mesh; /// [PMP_distance_snippet] // computes the approximation error of the reconstruction diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp new file mode 100644 index 000000000000..69245b9a624b --- /dev/null +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp @@ -0,0 +1,190 @@ +#include + +#include +#include + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include + +// Types +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::FT FT; +typedef Kernel::Point_3 Point; + +typedef Kernel::Vector_3 Vector; +typedef std::pair Point_with_normal; +typedef CGAL::First_of_pair_property_map Point_map; +typedef CGAL::Second_of_pair_property_map Normal_map; +typedef Kernel::Sphere_3 Sphere; +typedef std::vector PointList; +typedef CGAL::Polyhedron_3 Polyhedron; +typedef CGAL::Poisson_reconstruction_function Poisson_reconstruction_function; +typedef CGAL::Implicit_surface_3 Surface_3; + +namespace params = CGAL::parameters; + +template +void poisson_reconstruction(const PointSet& points, const char* output) +{ + typedef CGAL::Labeled_mesh_domain_3 Mesh_domain; + typedef CGAL::Mesh_triangulation_3::type Tr; + typedef CGAL::Mesh_complex_3_in_triangulation_3 C3t3; + typedef CGAL::Mesh_criteria_3 Mesh_criteria; + + // Poisson options + FT sm_angle = 20.0; // Min triangle angle in degrees. + FT sm_radius = 100; // Max triangle size w.r.t. point set average spacing. + FT sm_distance = 0.25; // Surface Approximation error w.r.t. point set average spacing. + + CGAL::Timer time; + time.start(); + + CGAL::Timer total_time; + total_time.start(); + + // Creates implicit function from the read points using the default solver. + + // Note: this method requires an iterator over points + // + property maps to access each point's position and normal. + Poisson_reconstruction_function function(points.begin(), points.end(), + Point_map(), Normal_map()); + + // Computes the Poisson indicator function f() + // at each vertex of the triangulation. + if (!function.compute_implicit_function()) + { + std::cerr << "compute_implicit_function() failed." << std::endl; + return; + } + + time.stop(); + std::cout << "Compute_implicit_function : " << time.time() << " seconds." << std::endl; + time.reset(); + time.start(); + + // Computes average spacing + FT average_spacing = CGAL::compute_average_spacing + (points, 6 /* knn = 1 ring */, + CGAL::parameters::point_map (Point_map())); + + time.stop(); + std::cout << "Average spacing : " << time.time() << " seconds." << std::endl; + time.reset(); + time.start(); + + // Gets one point inside the implicit surface + // and computes implicit function bounding sphere radius. + Point inner_point = function.get_inner_point(); + Sphere bsphere = function.bounding_sphere(); + FT radius = std::sqrt(bsphere.squared_radius()); + + // Defines the implicit surface: requires defining a + // conservative bounding sphere centered at inner point. + FT sm_sphere_radius = 5.0 * radius; + FT sm_dichotomy_error = sm_distance * average_spacing / 1000.0; // Dichotomy error must be << sm_distance + std::cout << "dichotomy error = " << sm_dichotomy_error << std::endl; + std::cout << "sm_dichotomy_error / sm_sphere_radius = " << sm_dichotomy_error / sm_sphere_radius << std::endl; + + Sphere sm_sphere(inner_point, sm_sphere_radius * sm_sphere_radius); + + Surface_3 surface(function, + sm_sphere, + sm_dichotomy_error / sm_sphere_radius); + + time.stop(); + std::cout << "Surface created in " << time.time() << " seconds." << std::endl; + time.reset(); + time.start(); + + // Defines surface mesh generation criteria + CGAL::Mesh_criteria_3 criteria(params::facet_angle = sm_angle, + params::facet_size = sm_radius * average_spacing, + params::facet_distance = sm_distance * average_spacing); + + Mesh_domain domain = Mesh_domain::create_implicit_mesh_domain(surface, sm_sphere, + params::relative_error_bound(sm_dichotomy_error / sm_sphere_radius)); + + // Generates surface mesh with manifold option + std::cout << "Start meshing..."; + std::cout.flush(); + C3t3 c3t3 = CGAL::make_mesh_3(domain, criteria, + params::no_exude().no_perturb().manifold_with_boundary()); + const auto& tr = c3t3.triangulation(); + + time.stop(); + std::cout << "\nTet mesh created in " << time.time() << " seconds." << std::endl; + time.reset(); + time.start(); + + if (tr.number_of_vertices() == 0) + { + std::cerr << "Triangulation empty!" << std::endl; + return; + } + + // saves reconstructed surface mesh + Polyhedron output_mesh; + CGAL::facets_in_complex_3_to_triangle_mesh(c3t3, output_mesh); + + time.stop(); + std::cout << "Surface extracted in " << time.time() << " seconds." << std::endl; + time.reset(); + time.start(); + + total_time.stop(); + std::cout << "Total time : " << total_time.time() << " seconds." << std::endl; + + std::ofstream out(output); + out << output_mesh; + out.close(); + std::cout << "File written " << output << std::endl; +} + +int main(int argc, char* argv[]) +{ + const std::string file = (argc < 2) + ? CGAL::data_file_path("points_3/kitten.xyz") + : std::string(argv[1]); + + // Reads the point set file in points[]. + // Note: read_points() requires an iterator over points + // + property maps to access each point's position and normal. + PointList points; + if(!CGAL::IO::read_points(file, std::back_inserter(points), + CGAL::parameters::point_map(Point_map()) + .normal_map(Normal_map()))) + { + std::cerr << "Error: cannot read file input file!" << std::endl; + return EXIT_FAILURE; + } + std::cout << "File " << file << " has been read." << std::endl; + +#ifdef CGAL_LINKED_WITH_TBB + std::cout << "\n\n### Parallel mode ###" << std::endl; + poisson_reconstruction(points, "out_parallel.off"); +#endif + + std::cout << "\n\n### Sequential mode ###" << std::endl; + poisson_reconstruction(points, "out_sequential.off"); + + return EXIT_SUCCESS; +} From 64976a9f991ece21e0533a304e41c629dcecfbe8 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 23 Nov 2023 15:15:38 +0100 Subject: [PATCH 007/348] use Real_timer --- .../poisson_reconstruction_example.cpp | 6 ++++-- .../poisson_reconstruction_mesh3_example.cpp | 17 +++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp index d070b1b88b98..e19232017b6a 100644 --- a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp @@ -16,7 +16,7 @@ #include #include -#include +#include // Types typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -54,7 +54,7 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } - CGAL::Timer total_time; + CGAL::Real_timer total_time; total_time.start(); // Creates implicit function from the read points using the default solver. @@ -95,6 +95,8 @@ int main(int argc, char* argv[]) Sphere(inner_point,sm_sphere_radius*sm_sphere_radius), sm_dichotomy_error/sm_sphere_radius); + std::cout << "Surface created." << std::endl; + // Defines surface mesh generation criteria CGAL::Surface_mesh_default_criteria_3 criteria(sm_angle, // Min triangle angle (degrees) sm_radius*average_spacing, // Max triangle size diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp index 69245b9a624b..057b2a4858d9 100644 --- a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp @@ -23,7 +23,7 @@ #include #include -#include +#include // Types typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -52,13 +52,13 @@ void poisson_reconstruction(const PointSet& points, const char* output) // Poisson options FT sm_angle = 20.0; // Min triangle angle in degrees. - FT sm_radius = 100; // Max triangle size w.r.t. point set average spacing. + FT sm_radius = 1.; // Max triangle size w.r.t. point set average spacing. FT sm_distance = 0.25; // Surface Approximation error w.r.t. point set average spacing. - CGAL::Timer time; + CGAL::Real_timer time; time.start(); - CGAL::Timer total_time; + CGAL::Real_timer total_time; total_time.start(); // Creates implicit function from the read points using the default solver. @@ -176,15 +176,16 @@ int main(int argc, char* argv[]) std::cerr << "Error: cannot read file input file!" << std::endl; return EXIT_FAILURE; } - std::cout << "File " << file << " has been read." << std::endl; + std::cout << "File " << file << " has been read, " + << points.size() << " points." << std::endl; + + std::cout << "\n\n### Sequential mode ###" << std::endl; + poisson_reconstruction(points, "out_sequential.off"); #ifdef CGAL_LINKED_WITH_TBB std::cout << "\n\n### Parallel mode ###" << std::endl; poisson_reconstruction(points, "out_parallel.off"); #endif - std::cout << "\n\n### Sequential mode ###" << std::endl; - poisson_reconstruction(points, "out_sequential.off"); - return EXIT_SUCCESS; } From b3cbbd2a78fedcb947559baf414d0539ccc95b94 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 23 Nov 2023 15:22:20 +0000 Subject: [PATCH 008/348] Poisson Surface Reconstruction: Enable Structural Filtering --- .../include/CGAL/Reconstruction_triangulation_3.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Poisson_surface_reconstruction_3/include/CGAL/Reconstruction_triangulation_3.h b/Poisson_surface_reconstruction_3/include/CGAL/Reconstruction_triangulation_3.h index 9f605978f7ca..5b625f8042ec 100644 --- a/Poisson_surface_reconstruction_3/include/CGAL/Reconstruction_triangulation_3.h +++ b/Poisson_surface_reconstruction_3/include/CGAL/Reconstruction_triangulation_3.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -148,6 +149,12 @@ struct Reconstruction_triangulation_default_geom_traits_3 : public BaseGt }; +template < class BaseGt > +struct Triangulation_structural_filtering_traits > { + typedef typename Triangulation_structural_filtering_traits::Use_structural_filtering_tag Use_structural_filtering_tag; +}; + + /// \internal /// The Reconstruction_triangulation_3 class /// provides the interface requested by the Poisson_reconstruction_function class: From 2748170ff6d0e120b219571077871e214f9f05b3 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 23 Nov 2023 16:01:06 +0000 Subject: [PATCH 009/348] Add structural filtering to Robust_circumcenter_traits --- .../CGAL/Robust_weighted_circumcenter_filtered_traits_3.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Triangulation_3/include/CGAL/Robust_weighted_circumcenter_filtered_traits_3.h b/Triangulation_3/include/CGAL/Robust_weighted_circumcenter_filtered_traits_3.h index 0ab43248e21c..589f20d97bbc 100644 --- a/Triangulation_3/include/CGAL/Robust_weighted_circumcenter_filtered_traits_3.h +++ b/Triangulation_3/include/CGAL/Robust_weighted_circumcenter_filtered_traits_3.h @@ -18,6 +18,7 @@ #include #include #include +#include #include namespace CGAL { @@ -531,6 +532,12 @@ class Robust_circumcenter_filtered_traits_3 Robust_circumcenter_filtered_traits_3(const Kernel& k = Kernel()) : Kernel(k) { } }; + +template < class BaseGt > +struct Triangulation_structural_filtering_traits > { + typedef typename Triangulation_structural_filtering_traits::Use_structural_filtering_tag Use_structural_filtering_tag; +}; + template class Robust_weighted_circumcenter_filtered_traits_3 : public Robust_circumcenter_filtered_traits_3 From d1aabccbd4c9289bd7371348c94ac80f25cd4cf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 27 Nov 2023 11:46:55 +0100 Subject: [PATCH 010/348] add missing typename --- .../poisson_reconstruction_mesh3_example.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp index 057b2a4858d9..fd147a676598 100644 --- a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp @@ -46,7 +46,7 @@ template void poisson_reconstruction(const PointSet& points, const char* output) { typedef CGAL::Labeled_mesh_domain_3 Mesh_domain; - typedef CGAL::Mesh_triangulation_3::type Tr; + typedef typename CGAL::Mesh_triangulation_3::type Tr; typedef CGAL::Mesh_complex_3_in_triangulation_3 C3t3; typedef CGAL::Mesh_criteria_3 Mesh_criteria; From 36379f42f43fd18a54a6b8fc18be4352d2244399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 27 Nov 2023 11:47:26 +0100 Subject: [PATCH 011/348] WIP try with thread local static variable --- .../CGAL/Poisson_reconstruction_function.h | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h index 68c71a271519..bcc1910d5d36 100644 --- a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h +++ b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h @@ -249,7 +249,7 @@ class Poisson_reconstruction_function // locate, with conversions atomic/Cell_handle class Cell_hint { - std::atomic m_cell; + Cell* m_cell; public: Cell_hint() : m_cell(nullptr) { } @@ -279,7 +279,12 @@ class Poisson_reconstruction_function // contouring and meshing Point m_sink; // Point with the minimum value of operator() - mutable Cell_hint m_hint; // last cell found = hint for next search + + static Cell_hint& get_hint() + { + static thread_local Cell_hint m_hint; // last cell found = hint for next search + return m_hint; + } FT average_spacing; @@ -586,9 +591,9 @@ class Poisson_reconstruction_function boost::tuple special_func(const Point& p) const { - Cell_handle hint = m_hint.get(); + Cell_handle hint = get_hint().get(); hint = m_tr->locate(p, hint); // no hint when we use hierarchy - m_hint.set(hint); + get_hint().set(hint); if(m_tr->is_infinite(hint)) { int i = hint->index(m_tr->infinite_vertex()); @@ -613,9 +618,9 @@ class Poisson_reconstruction_function */ FT operator()(const Point& p) const { - Cell_handle hint = m_hint.get(); + Cell_handle hint = get_hint().get(); hint = m_tr->locate(p, hint); - m_hint.set(hint); + get_hint().set(hint); if(m_tr->is_infinite(hint)) { int i = hint->index(m_tr->infinite_vertex()); From bcb872f3848220d61db2cd3c33ad62f92ee76f23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Mon, 27 Nov 2023 17:17:35 +0100 Subject: [PATCH 012/348] Simplify hint mechanism It is threadsafe, but it still isn't optimal within each thread: when computing a refinement point for Mesh_3, the oracle will be successively asked about points that are close by, but when we switch from one dichotomy to the next, the hint is likely terrible. --- .../CGAL/Poisson_reconstruction_function.h | 33 +++---------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h index bcc1910d5d36..9bc4c8de1927 100644 --- a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h +++ b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h @@ -245,26 +245,6 @@ class Poisson_reconstruction_function FT& operator[] (const std::size_t& idx) { return m_bary[idx]; } }; - // Wrapper for thread safety of maintained cell hint for fast - // locate, with conversions atomic/Cell_handle - class Cell_hint - { - Cell* m_cell; - public: - - Cell_hint() : m_cell(nullptr) { } - - // Poisson_reconstruction_function should be copyable, although we - // don't need to copy that - Cell_hint(const Cell_hint&) : m_cell(nullptr) { } - - Cell_handle get() const - { - return Triangulation_data_structure::Cell_range::s_iterator_to(*m_cell); - } - void set (Cell_handle ch) { m_cell = ch.operator->(); } - }; - // Data members. // Warning: the Surface Mesh Generation package makes copies of implicit functions, // thus this class must be lightweight and stateless. @@ -280,15 +260,14 @@ class Poisson_reconstruction_function // contouring and meshing Point m_sink; // Point with the minimum value of operator() - static Cell_hint& get_hint() + static Cell_handle& get_hint() { - static thread_local Cell_hint m_hint; // last cell found = hint for next search + static thread_local Cell_handle m_hint{}; return m_hint; } FT average_spacing; - /// function to be used for the different constructors available that are /// doing the same thing but with default template parameters template special_func(const Point& p) const { - Cell_handle hint = get_hint().get(); - hint = m_tr->locate(p, hint); // no hint when we use hierarchy - get_hint().set(hint); + Cell_handle& hint = get_hint(); + hint = m_tr->locate(p, hint); if(m_tr->is_infinite(hint)) { int i = hint->index(m_tr->infinite_vertex()); @@ -618,9 +596,8 @@ class Poisson_reconstruction_function */ FT operator()(const Point& p) const { - Cell_handle hint = get_hint().get(); + Cell_handle& hint = get_hint(); hint = m_tr->locate(p, hint); - get_hint().set(hint); if(m_tr->is_infinite(hint)) { int i = hint->index(m_tr->infinite_vertex()); From e9e3287e63e2187d7ac583da1ad59dc1dfb7d634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Mon, 27 Nov 2023 17:20:22 +0100 Subject: [PATCH 013/348] Fix location hint potentially carrying over to the next reconstruction --- .../include/CGAL/Poisson_reconstruction_function.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h index 9bc4c8de1927..a7a4e6a15b4d 100644 --- a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h +++ b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h @@ -285,6 +285,8 @@ class Poisson_reconstruction_function CGAL::Timer task_timer; task_timer.start(); CGAL_TRACE_STREAM << "Creates Poisson triangulation...\n"; + get_hint() = Cell_handle{}; + // Inserts points in triangulation m_tr->insert( first,beyond, From 3df5e761991512ee0b241670ac038a92e125f0de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Tue, 28 Nov 2023 11:10:38 +0100 Subject: [PATCH 014/348] Use enumerable_thread_specific rather than a static hint value With a static hint and re-initialization in the constructor, we could still get issues if someone did something like: Poisson poisson_1(...); Poisson poisson_2(...) mesh(poisson_1); mesh(poisson_2); // problem: the static hint points to a cell of T1 --- .../CGAL/Poisson_reconstruction_function.h | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h index a7a4e6a15b4d..56ee84b9bd0c 100644 --- a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h +++ b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h @@ -22,20 +22,14 @@ # endif #endif -#include -#include -#include -#include -#include -#include - #include #include #include + #ifdef CGAL_EIGEN3_ENABLED -#include -#else + #include #endif + #include #include #include @@ -44,9 +38,20 @@ #include #include -#include +#ifdef CGAL_LINKED_WITH_TBB + #include +#endif + #include +#include +#include +#include +#include +#include +#include +#include + /*! \file Poisson_reconstruction_function.h */ @@ -260,11 +265,13 @@ class Poisson_reconstruction_function // contouring and meshing Point m_sink; // Point with the minimum value of operator() - static Cell_handle& get_hint() - { - static thread_local Cell_handle m_hint{}; - return m_hint; - } +#ifdef CGAL_LINKED_WITH_TBB + mutable tbb::enumerable_thread_specific m_hint; + Cell_handle& get_hint() const { return m_hint.local(); } +#else + mutable Cell_handle m_hint; + Cell_handle& get_hint() const { return m_hint; } +#endif FT average_spacing; @@ -285,8 +292,6 @@ class Poisson_reconstruction_function CGAL::Timer task_timer; task_timer.start(); CGAL_TRACE_STREAM << "Creates Poisson triangulation...\n"; - get_hint() = Cell_handle{}; - // Inserts points in triangulation m_tr->insert( first,beyond, From bdc800bbabb1f214f6d73d63d80434b8c15a3af0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Tue, 28 Nov 2023 11:41:49 +0100 Subject: [PATCH 015/348] Merge the test about Poisson w/ parallel Mesh_3 into the (new) example --- .../CMakeLists.txt | 6 +- ...le.cpp => poisson_and_parallel_mesh_3.cpp} | 64 +++++++-------- .../CMakeLists.txt | 9 --- .../poisson_and_parallel_mesh_3.cpp | 78 ------------------- 4 files changed, 33 insertions(+), 124 deletions(-) rename Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/{poisson_reconstruction_mesh3_example.cpp => poisson_and_parallel_mesh_3.cpp} (80%) delete mode 100644 Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt index 027f08be6172..4f00438a292a 100644 --- a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt @@ -28,8 +28,8 @@ if(TARGET CGAL::Eigen3_support) # Executables that require Eigen 3 create_single_source_cgal_program("poisson_reconstruction_example.cpp") target_link_libraries(poisson_reconstruction_example PUBLIC CGAL::Eigen3_support) - create_single_source_cgal_program("poisson_reconstruction_mesh3_example.cpp") - target_link_libraries(poisson_reconstruction_mesh3_example PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("poisson_and_parallel_mesh_3.cpp") + target_link_libraries(poisson_and_parallel_mesh_3 PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("poisson_reconstruction.cpp") target_link_libraries(poisson_reconstruction PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("poisson_reconstruction_function.cpp") @@ -46,6 +46,6 @@ if(CGAL_ACTIVATE_CONCURRENT_MESH_3) include(CGAL_TBB_support) if(TARGET CGAL::TBB_support) add_definitions(-DCGAL_CONCURRENT_MESH_3) - target_link_libraries(poisson_reconstruction_mesh3_example PUBLIC CGAL::TBB_support) + target_link_libraries(poisson_and_parallel_mesh_3 PUBLIC CGAL::TBB_support) endif()#Find TBB endif()#Parallelism in Mesh_3 diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp similarity index 80% rename from Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp rename to Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp index fd147a676598..e9f3ce3b5f65 100644 --- a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_mesh3_example.cpp +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp @@ -1,15 +1,10 @@ #include #include -#include #include -#include -#include -#include - -#include +#include #include #include #include @@ -17,13 +12,19 @@ #include #include +#include +#include +#include +#include +#include +#include + #include -#include +#include #include - #include -#include +#include // Types typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -70,21 +71,20 @@ void poisson_reconstruction(const PointSet& points, const char* output) // Computes the Poisson indicator function f() // at each vertex of the triangulation. - if (!function.compute_implicit_function()) + if(!function.compute_implicit_function()) { std::cerr << "compute_implicit_function() failed." << std::endl; return; } time.stop(); - std::cout << "Compute_implicit_function : " << time.time() << " seconds." << std::endl; + std::cout << "compute_implicit_function() : " << time.time() << " seconds." << std::endl; time.reset(); time.start(); // Computes average spacing FT average_spacing = CGAL::compute_average_spacing - (points, 6 /* knn = 1 ring */, - CGAL::parameters::point_map (Point_map())); + (points, 6 /* knn = 1 ring */, params::point_map (Point_map())); time.stop(); std::cout << "Average spacing : " << time.time() << " seconds." << std::endl; @@ -93,8 +93,8 @@ void poisson_reconstruction(const PointSet& points, const char* output) // Gets one point inside the implicit surface // and computes implicit function bounding sphere radius. - Point inner_point = function.get_inner_point(); - Sphere bsphere = function.bounding_sphere(); + const Point inner_point = function.get_inner_point(); + const Sphere bsphere = function.bounding_sphere(); FT radius = std::sqrt(bsphere.squared_radius()); // Defines the implicit surface: requires defining a @@ -105,10 +105,7 @@ void poisson_reconstruction(const PointSet& points, const char* output) std::cout << "sm_dichotomy_error / sm_sphere_radius = " << sm_dichotomy_error / sm_sphere_radius << std::endl; Sphere sm_sphere(inner_point, sm_sphere_radius * sm_sphere_radius); - - Surface_3 surface(function, - sm_sphere, - sm_dichotomy_error / sm_sphere_radius); + Surface_3 surface(function, sm_sphere, sm_dichotomy_error / sm_sphere_radius); time.stop(); std::cout << "Surface created in " << time.time() << " seconds." << std::endl; @@ -117,8 +114,8 @@ void poisson_reconstruction(const PointSet& points, const char* output) // Defines surface mesh generation criteria CGAL::Mesh_criteria_3 criteria(params::facet_angle = sm_angle, - params::facet_size = sm_radius * average_spacing, - params::facet_distance = sm_distance * average_spacing); + params::facet_size = sm_radius * average_spacing, + params::facet_distance = sm_distance * average_spacing); Mesh_domain domain = Mesh_domain::create_implicit_mesh_domain(surface, sm_sphere, params::relative_error_bound(sm_dichotomy_error / sm_sphere_radius)); @@ -127,15 +124,17 @@ void poisson_reconstruction(const PointSet& points, const char* output) std::cout << "Start meshing..."; std::cout.flush(); C3t3 c3t3 = CGAL::make_mesh_3(domain, criteria, - params::no_exude().no_perturb().manifold_with_boundary()); - const auto& tr = c3t3.triangulation(); + params::no_exude() + .no_perturb() + .manifold_with_boundary()); time.stop(); std::cout << "\nTet mesh created in " << time.time() << " seconds." << std::endl; time.reset(); time.start(); - if (tr.number_of_vertices() == 0) + const auto& tr = c3t3.triangulation(); + if(tr.number_of_vertices() == 0) { std::cerr << "Triangulation empty!" << std::endl; return; @@ -153,31 +152,28 @@ void poisson_reconstruction(const PointSet& points, const char* output) total_time.stop(); std::cout << "Total time : " << total_time.time() << " seconds." << std::endl; - std::ofstream out(output); - out << output_mesh; - out.close(); + CGAL::IO::write_polygon_mesh(output, output_mesh, params::stream_precision(17)); std::cout << "File written " << output << std::endl; } int main(int argc, char* argv[]) { - const std::string file = (argc < 2) - ? CGAL::data_file_path("points_3/kitten.xyz") - : std::string(argv[1]); + const std::string file = (argc < 2) ? CGAL::data_file_path("points_3/kitten.xyz") + : std::string(argv[1]); // Reads the point set file in points[]. // Note: read_points() requires an iterator over points // + property maps to access each point's position and normal. PointList points; if(!CGAL::IO::read_points(file, std::back_inserter(points), - CGAL::parameters::point_map(Point_map()) - .normal_map(Normal_map()))) + params::point_map(Point_map()) + .normal_map(Normal_map()))) { std::cerr << "Error: cannot read file input file!" << std::endl; return EXIT_FAILURE; } - std::cout << "File " << file << " has been read, " - << points.size() << " points." << std::endl; + + std::cout << "File " << file << " has been read, " << points.size() << " points." << std::endl; std::cout << "\n\n### Sequential mode ###" << std::endl; poisson_reconstruction(points, "out_sequential.off"); diff --git a/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/CMakeLists.txt b/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/CMakeLists.txt index efd978ee3a35..cff3ecba1378 100644 --- a/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/CMakeLists.txt +++ b/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/CMakeLists.txt @@ -24,15 +24,6 @@ if(TARGET CGAL::Eigen3_support) # Executables that require Eigen 3.1 create_single_source_cgal_program("poisson_reconstruction_test.cpp") target_link_libraries(poisson_reconstruction_test PUBLIC CGAL::Eigen3_support) - - find_package(TBB QUIET) - include(CGAL_TBB_support) - if (TBB_FOUND) - create_single_source_cgal_program( "poisson_and_parallel_mesh_3.cpp" ) - target_link_libraries(poisson_and_parallel_mesh_3 PUBLIC CGAL::Eigen3_support CGAL::TBB_support) - else() - message(STATUS "NOTICE: The test 'poisson_and_parallel_mesh_3' requires TBB, and will not be compiled.") - endif() else() message("NOTICE: Tests in this directory require Eigen 3.1 (or greater), and will not be compiled.") endif() diff --git a/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp b/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp deleted file mode 100644 index 6e584c7aa442..000000000000 --- a/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; -typedef Kernel::FT FT; -typedef Kernel::Point_3 Point_3; -typedef Kernel::Vector_3 Vector_3; - -typedef std::pair Pwn; -typedef CGAL::First_of_pair_property_map Point_map; -typedef CGAL::Second_of_pair_property_map Vector_map; - -typedef CGAL::Poisson_reconstruction_function Poisson; - -typedef CGAL::Labeled_mesh_domain_3 Implicit_domain; -typedef CGAL::Mesh_triangulation_3::type Mesh_tr; -typedef CGAL::Mesh_complex_3_in_triangulation_3 C3t3; -typedef CGAL::Mesh_criteria_3 Mesh_criteria; - -int main(int, char**) -{ - std::vector points; - - std::ifstream stream(CGAL::data_file_path("points_3/oni.pwn")); - if (!stream || - !CGAL::IO::read_XYZ - (stream, std::back_inserter(points), - CGAL::parameters:: - point_map(Point_map()). - normal_map(Vector_map()))) - { - std::cerr << "Error: cannot read file" << std::endl; - return EXIT_FAILURE; - } - - Poisson poisson (points.begin(), points.end(), Point_map(), Vector_map()); - if (!poisson.compute_implicit_function()) - { - std::cerr << "Error: cannot compute implicit function" << std::endl; - return EXIT_FAILURE; - } - - CGAL::Bbox_3 bbox - = CGAL::bbox_3 (boost::make_transform_iterator - (points.begin(), - CGAL::Property_map_to_unary_function()), - boost::make_transform_iterator - (points.end(), - CGAL::Property_map_to_unary_function())); - - Implicit_domain domain - = Implicit_domain::create_implicit_mesh_domain - (poisson, bbox); - - Mesh_criteria criteria (CGAL::parameters::facet_angle = 30, - CGAL::parameters::facet_size = 4, - CGAL::parameters::facet_distance = 0.1); - C3t3 c3t3 = CGAL::make_mesh_3 (domain, criteria, - CGAL::parameters::manifold()); - - return EXIT_SUCCESS; -} From 74bcf248b3468065107eb1cb5a74ede0e34a99ec Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 1 Dec 2023 07:16:53 +0000 Subject: [PATCH 016/348] const& --- .../include/CGAL/Poisson_implicit_surface_3.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_implicit_surface_3.h b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_implicit_surface_3.h index 79b070f16294..00a67f1b7370 100644 --- a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_implicit_surface_3.h +++ b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_implicit_surface_3.h @@ -56,7 +56,7 @@ namespace CGAL { gt.compute_squared_radius_3_object()(bounding_sphere); } - FT operator()(Point p) const + FT operator()(const Point& p) const { return func(p); } @@ -129,7 +129,7 @@ namespace CGAL { public: Poisson_implicit_function_wrapper(Poisson_implicit_function f) : function(f) {} - FT operator()(Point p) const + FT operator()(const Point& p) const { return function(p.x(), p.y(), p.z()); } From f2cc4ff509adcf9162f51f4eec29e178f4a167c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Tue, 12 Dec 2023 11:40:01 +0100 Subject: [PATCH 017/348] Fix indentation --- .../poisson_and_parallel_mesh_3.cpp | 46 ++-- .../poisson_reconstruction_example.cpp | 202 +++++++++--------- 2 files changed, 124 insertions(+), 124 deletions(-) diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp index e9f3ce3b5f65..edda8e71d466 100644 --- a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp @@ -84,7 +84,7 @@ void poisson_reconstruction(const PointSet& points, const char* output) // Computes average spacing FT average_spacing = CGAL::compute_average_spacing - (points, 6 /* knn = 1 ring */, params::point_map (Point_map())); + (points, 6 /* knn = 1 ring */, params::point_map(Point_map())); time.stop(); std::cout << "Average spacing : " << time.time() << " seconds." << std::endl; @@ -158,30 +158,30 @@ void poisson_reconstruction(const PointSet& points, const char* output) int main(int argc, char* argv[]) { - const std::string file = (argc < 2) ? CGAL::data_file_path("points_3/kitten.xyz") - : std::string(argv[1]); - - // Reads the point set file in points[]. - // Note: read_points() requires an iterator over points - // + property maps to access each point's position and normal. - PointList points; - if(!CGAL::IO::read_points(file, std::back_inserter(points), - params::point_map(Point_map()) - .normal_map(Normal_map()))) - { - std::cerr << "Error: cannot read file input file!" << std::endl; - return EXIT_FAILURE; - } - - std::cout << "File " << file << " has been read, " << points.size() << " points." << std::endl; - - std::cout << "\n\n### Sequential mode ###" << std::endl; - poisson_reconstruction(points, "out_sequential.off"); + const std::string file = (argc < 2) ? CGAL::data_file_path("points_3/kitten.xyz") + : std::string(argv[1]); + + // Reads the point set file in points[]. + // Note: read_points() requires an iterator over points + // + property maps to access each point's position and normal. + PointList points; + if(!CGAL::IO::read_points(file, std::back_inserter(points), + params::point_map(Point_map()) + .normal_map(Normal_map()))) + { + std::cerr << "Error: cannot read file input file!" << std::endl; + return EXIT_FAILURE; + } + + std::cout << "File " << file << " has been read, " << points.size() << " points." << std::endl; + + std::cout << "\n\n### Sequential mode ###" << std::endl; + poisson_reconstruction(points, "out_sequential.off"); #ifdef CGAL_LINKED_WITH_TBB - std::cout << "\n\n### Parallel mode ###" << std::endl; - poisson_reconstruction(points, "out_parallel.off"); + std::cout << "\n\n### Parallel mode ###" << std::endl; + poisson_reconstruction(points, "out_parallel.off"); #endif - return EXIT_SUCCESS; + return EXIT_SUCCESS; } diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp index e19232017b6a..b98ce0c8157c 100644 --- a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp @@ -36,105 +36,105 @@ typedef CGAL::Implicit_surface_3 Surfac int main(int argc, char* argv[]) { - // Poisson options - FT sm_angle = 20.0; // Min triangle angle in degrees. - FT sm_radius = 100; // Max triangle size w.r.t. point set average spacing. - FT sm_distance = 0.25; // Surface Approximation error w.r.t. point set average spacing. - - // Reads the point set file in points[]. - // Note: read_points() requires an iterator over points - // + property maps to access each point's position and normal. - PointList points; - char* filename = argv[1]; - if(!CGAL::IO::read_points(filename, std::back_inserter(points), - CGAL::parameters::point_map(Point_map()) - .normal_map (Normal_map()))) - { - std::cerr << "Error: cannot read file input file!" << std::endl; - return EXIT_FAILURE; - } - - CGAL::Real_timer total_time; - total_time.start(); - - // Creates implicit function from the read points using the default solver. - - // Note: this method requires an iterator over points - // + property maps to access each point's position and normal. - Poisson_reconstruction_function function(points.begin(), points.end(), - Point_map(), Normal_map()); - - // Computes the Poisson indicator function f() - // at each vertex of the triangulation. - if ( ! function.compute_implicit_function() ) - return EXIT_FAILURE; - - // Computes average spacing - FT average_spacing = CGAL::compute_average_spacing - (points, 6 /* knn = 1 ring */, - CGAL::parameters::point_map (Point_map())); - - // Gets one point inside the implicit surface - // and computes implicit function bounding sphere radius. - Point inner_point = function.get_inner_point(); - Sphere bsphere = function.bounding_sphere(); - FT radius = std::sqrt(bsphere.squared_radius()); - - std::cout << "inner_point = " << inner_point << std::endl; - std::cout << "bsphere = " << bsphere.center() - << "\tsqr = " << bsphere.squared_radius() << std::endl; - std::cout << "radius = " << radius << std::endl; - - // Defines the implicit surface: requires defining a - // conservative bounding sphere centered at inner point. - FT sm_sphere_radius = 5.0 * radius; - FT sm_dichotomy_error = sm_distance*average_spacing/1000.0; // Dichotomy error must be << sm_distance - std::cout << "dichotomy error = " << sm_dichotomy_error << std::endl; - - Surface_3 surface(function, - Sphere(inner_point,sm_sphere_radius*sm_sphere_radius), - sm_dichotomy_error/sm_sphere_radius); - - std::cout << "Surface created." << std::endl; - - // Defines surface mesh generation criteria - CGAL::Surface_mesh_default_criteria_3 criteria(sm_angle, // Min triangle angle (degrees) - sm_radius*average_spacing, // Max triangle size - sm_distance*average_spacing); // Approximation error - - // Generates surface mesh with manifold option - STr tr; // 3D Delaunay triangulation for surface mesh generation - C2t3 c2t3(tr); // 2D complex in 3D Delaunay triangulation - CGAL::make_surface_mesh(c2t3, // reconstructed mesh - surface, // implicit surface - criteria, // meshing criteria - CGAL::Manifold_with_boundary_tag()); // require manifold mesh - - if(tr.number_of_vertices() == 0) - return EXIT_FAILURE; - - // saves reconstructed surface mesh - std::ofstream out("kitten_poisson-20-30-0.375.off"); - Polyhedron output_mesh; - CGAL::facets_in_complex_2_to_triangle_mesh(c2t3, output_mesh); - - total_time.stop(); - std::cout << "Total time : " << total_time.time() << " seconds." << std::endl; - - out << output_mesh; - - /// [PMP_distance_snippet] - // computes the approximation error of the reconstruction - double max_dist = - CGAL::Polygon_mesh_processing::approximate_max_distance_to_point_set - (output_mesh, - CGAL::make_range (boost::make_transform_iterator - (points.begin(), CGAL::Property_map_to_unary_function()), - boost::make_transform_iterator - (points.end(), CGAL::Property_map_to_unary_function())), - 4000); - std::cout << "Max distance to point_set: " << max_dist << std::endl; - /// [PMP_distance_snippet] - - return EXIT_SUCCESS; + // Poisson options + FT sm_angle = 20.0; // Min triangle angle in degrees. + FT sm_radius = 100; // Max triangle size w.r.t. point set average spacing. + FT sm_distance = 0.25; // Surface Approximation error w.r.t. point set average spacing. + + // Reads the point set file in points[]. + // Note: read_points() requires an iterator over points + // + property maps to access each point's position and normal. + PointList points; + char* filename = argv[1]; + if(!CGAL::IO::read_points(filename, std::back_inserter(points), + CGAL::parameters::point_map(Point_map()) + .normal_map (Normal_map()))) + { + std::cerr << "Error: cannot read file input file!" << std::endl; + return EXIT_FAILURE; + } + + CGAL::Real_timer total_time; + total_time.start(); + + // Creates implicit function from the read points using the default solver. + + // Note: this method requires an iterator over points + // + property maps to access each point's position and normal. + Poisson_reconstruction_function function(points.begin(), points.end(), + Point_map(), Normal_map()); + + // Computes the Poisson indicator function f() + // at each vertex of the triangulation. + if (!function.compute_implicit_function()) + return EXIT_FAILURE; + + // Computes average spacing + FT average_spacing = CGAL::compute_average_spacing + (points, 6 /* knn = 1 ring */, + CGAL::parameters::point_map (Point_map())); + + // Gets one point inside the implicit surface + // and computes implicit function bounding sphere radius. + Point inner_point = function.get_inner_point(); + Sphere bsphere = function.bounding_sphere(); + FT radius = std::sqrt(bsphere.squared_radius()); + + std::cout << "inner_point = " << inner_point << std::endl; + std::cout << "bsphere = " << bsphere.center() + << "\tsqr = " << bsphere.squared_radius() << std::endl; + std::cout << "radius = " << radius << std::endl; + + // Defines the implicit surface: requires defining a + // conservative bounding sphere centered at inner point. + FT sm_sphere_radius = 5.0 * radius; + FT sm_dichotomy_error = sm_distance*average_spacing/1000.0; // Dichotomy error must be << sm_distance + std::cout << "dichotomy error = " << sm_dichotomy_error << std::endl; + + Surface_3 surface(function, + Sphere(inner_point,sm_sphere_radius*sm_sphere_radius), + sm_dichotomy_error/sm_sphere_radius); + + std::cout << "Surface created." << std::endl; + + // Defines surface mesh generation criteria + CGAL::Surface_mesh_default_criteria_3 criteria(sm_angle, // Min triangle angle (degrees) + sm_radius*average_spacing, // Max triangle size + sm_distance*average_spacing); // Approximation error + + // Generates surface mesh with manifold option + STr tr; // 3D Delaunay triangulation for surface mesh generation + C2t3 c2t3(tr); // 2D complex in 3D Delaunay triangulation + CGAL::make_surface_mesh(c2t3, // reconstructed mesh + surface, // implicit surface + criteria, // meshing criteria + CGAL::Manifold_with_boundary_tag()); // require manifold mesh + + if(tr.number_of_vertices() == 0) + return EXIT_FAILURE; + + // saves reconstructed surface mesh + std::ofstream out("kitten_poisson-20-30-0.375.off"); + Polyhedron output_mesh; + CGAL::facets_in_complex_2_to_triangle_mesh(c2t3, output_mesh); + + total_time.stop(); + std::cout << "Total time : " << total_time.time() << " seconds." << std::endl; + + out << output_mesh; + + /// [PMP_distance_snippet] + // computes the approximation error of the reconstruction + double max_dist = + CGAL::Polygon_mesh_processing::approximate_max_distance_to_point_set + (output_mesh, + CGAL::make_range (boost::make_transform_iterator + (points.begin(), CGAL::Property_map_to_unary_function()), + boost::make_transform_iterator + (points.end(), CGAL::Property_map_to_unary_function())), + 4000); + std::cout << "Max distance to point_set: " << max_dist << std::endl; + /// [PMP_distance_snippet] + + return EXIT_SUCCESS; } From 1c1fe07289b7bc38a5c9ffe187e3f88c81afb3b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Tue, 12 Dec 2023 11:43:22 +0100 Subject: [PATCH 018/348] Fix input reading --- .../poisson_and_parallel_mesh_3.cpp | 4 ++-- .../poisson_reconstruction_example.cpp | 20 ++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp index edda8e71d466..dc8f8df663c9 100644 --- a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp @@ -158,8 +158,8 @@ void poisson_reconstruction(const PointSet& points, const char* output) int main(int argc, char* argv[]) { - const std::string file = (argc < 2) ? CGAL::data_file_path("points_3/kitten.xyz") - : std::string(argv[1]); + const std::string file = (argc > 1) ? std::string(argv[1]) + : CGAL::data_file_path("points_3/kitten.xyz"); // Reads the point set file in points[]. // Note: read_points() requires an iterator over points diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp index b98ce0c8157c..cc1d801ead82 100644 --- a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_reconstruction_example.cpp @@ -36,24 +36,26 @@ typedef CGAL::Implicit_surface_3 Surfac int main(int argc, char* argv[]) { - // Poisson options - FT sm_angle = 20.0; // Min triangle angle in degrees. - FT sm_radius = 100; // Max triangle size w.r.t. point set average spacing. - FT sm_distance = 0.25; // Surface Approximation error w.r.t. point set average spacing. + const std::string file = (argc > 1) ? std::string(argv[1]) + : CGAL::data_file_path("points_3/kitten.xyz"); // Reads the point set file in points[]. // Note: read_points() requires an iterator over points // + property maps to access each point's position and normal. PointList points; - char* filename = argv[1]; - if(!CGAL::IO::read_points(filename, std::back_inserter(points), - CGAL::parameters::point_map(Point_map()) - .normal_map (Normal_map()))) + if(!CGAL::IO::read_points(file, std::back_inserter(points), + CGAL::parameters::point_map(Point_map()) + .normal_map(Normal_map()))) { std::cerr << "Error: cannot read file input file!" << std::endl; return EXIT_FAILURE; } + // Poisson options + FT sm_angle = 20.0; // Min triangle angle in degrees. + FT sm_radius = 100; // Max triangle size w.r.t. point set average spacing. + FT sm_distance = 0.25; // Surface Approximation error w.r.t. point set average spacing. + CGAL::Real_timer total_time; total_time.start(); @@ -114,7 +116,7 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; // saves reconstructed surface mesh - std::ofstream out("kitten_poisson-20-30-0.375.off"); + std::ofstream out("poisson_surface.off"); Polyhedron output_mesh; CGAL::facets_in_complex_2_to_triangle_mesh(c2t3, output_mesh); From 34b4b2cdf7ad7c62324a677533a4fbc5f74344a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 13 Dec 2023 09:39:51 +0100 Subject: [PATCH 019/348] Fix warning --- .../poisson_and_parallel_mesh_3.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp index dc8f8df663c9..a039694fcff1 100644 --- a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/poisson_and_parallel_mesh_3.cpp @@ -113,9 +113,9 @@ void poisson_reconstruction(const PointSet& points, const char* output) time.start(); // Defines surface mesh generation criteria - CGAL::Mesh_criteria_3 criteria(params::facet_angle = sm_angle, - params::facet_size = sm_radius * average_spacing, - params::facet_distance = sm_distance * average_spacing); + Mesh_criteria criteria(params::facet_angle = sm_angle, + params::facet_size = sm_radius * average_spacing, + params::facet_distance = sm_distance * average_spacing); Mesh_domain domain = Mesh_domain::create_implicit_mesh_domain(surface, sm_sphere, params::relative_error_bound(sm_dichotomy_error / sm_sphere_radius)); From 2edba4455953abd34fde56b1955c4db43a15be13 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 6 May 2024 15:29:07 +0200 Subject: [PATCH 020/348] Use lsb_release for system information retrieval --- Installation/CMakeLists.txt | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index 98d27538371c..90541b6ba890 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -361,13 +361,17 @@ include(${CGAL_MODULES_DIR}/CGAL_enable_end_of_configuration_hook.cmake) cgal_setup_module_path() if(RUNNING_CGAL_AUTO_TEST OR CGAL_TEST_SUITE) - message(STATUS "Operating system:") - execute_process( - COMMAND uname -a - TIMEOUT 5 - OUTPUT_VARIABLE uname_a - ERROR_VARIABLE uname_a) - message(STATUS "${uname_a}") + find_program(LSB_RELEASE_EXEC lsb_release) + if(LSB_RELEASE_EXEC) + execute_process( + COMMAND ${LSB_RELEASE_EXEC} -ds + OUTPUT_VARIABLE LSB_RELEASE_ID_SHORT + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + message(STATUS "Operating system: ${LSB_RELEASE_ID_SHORT} ${CMAKE_SYSTEM_PROCESSOR}") + else() + message(STATUS "Operating system: ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION}") + endif() cgal_display_compiler_version() endif() From 559df9b37f6e41f0298b760c53b37a9baabf0010 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 6 May 2024 15:29:29 +0200 Subject: [PATCH 021/348] Update platform descriptions with compiler and OS details --- Maintenance/test_handling/create_testresult_page | 9 ++++++++- Maintenance/test_handling/to_zipped_format | 6 +++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Maintenance/test_handling/create_testresult_page b/Maintenance/test_handling/create_testresult_page index 8d9a867592de..ba7afd3f2de0 100755 --- a/Maintenance/test_handling/create_testresult_page +++ b/Maintenance/test_handling/create_testresult_page @@ -462,7 +462,9 @@ sub print_platform_descriptions()

Platform Description and Summary

- + + + @@ -497,6 +499,9 @@ EOF chomp; my $compiler = $_; print OUTPUT " title=\"$compiler\">$pf_short"; + $_ = ; # OPERATING_SYSTEM + chomp; + my $operating_system = $_; $_ = ; # TESTER_NAME chomp; my $tester_name = $_; @@ -523,6 +528,8 @@ EOF $_ = ; chomp; print OUTPUT "\n"; + print OUTPUT "\n"; # Compiler + print OUTPUT "\n"; # Operating System print OUTPUT "\n"; print OUTPUT "\n"; print OUTPUT "\n"; diff --git a/Maintenance/test_handling/to_zipped_format b/Maintenance/test_handling/to_zipped_format index fdf62712b021..762ad4fae407 100755 --- a/Maintenance/test_handling/to_zipped_format +++ b/Maintenance/test_handling/to_zipped_format @@ -51,7 +51,7 @@ sub reformat_results($) $_ = $line; open (PLATFORM_INFO,">${platform}.info") or return; open (PLATFORM_NEW_RESULTS,">${platform}.new_results") or return; - my ($CGAL_VERSION,$LEDA_VERSION,$COMPILER,$TESTER_NAME,$TESTER_ADDRESS,$GMP,$MPFR,$ZLIB,$OPENGL,$BOOST,$QT,$CMAKE) = ("-","-","-","-","-","-","-","-","-","-","-","-","-","no"); + my ($CGAL_VERSION,$LEDA_VERSION,$COMPILER,$OS,$TESTER_NAME,$TESTER_ADDRESS,$GMP,$MPFR,$ZLIB,$OPENGL,$BOOST,$QT,$CMAKE) = ("-","-","-","-","-","-","-","-","-","-","-","-","-","no"); my ($LDFLAGS,$CXXFLAGS) = ("", ""); while (! /^------/) { if(/^\s*$/) { @@ -72,6 +72,9 @@ sub reformat_results($) if (/COMPILER_VERSION = '([^']+)'/) { $COMPILER = $1; } + if (/-- Operating system: (.*)/) { + $OS = $1; + } if (/^TESTER_NAME\s+(.*)$/) { $TESTER_NAME = $1; } @@ -144,6 +147,7 @@ NEXT: if(! ($_= )) { print PLATFORM_INFO <<"EOF"; $CGAL_VERSION $COMPILER +$OS $TESTER_NAME $TESTER_ADDRESS $CMAKE From 12455fbd559d2bbb6140fe36a3b69df0e9648121 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Fri, 17 May 2024 10:19:49 +0200 Subject: [PATCH 022/348] add example using allow_move_functor --- .../Polygon_mesh_processing/CMakeLists.txt | 1 + .../isotropic_remeshing_with_allow_move.cpp | 72 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_allow_move.cpp diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index 4bc63fcf8b30..10c328ae5e05 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -54,6 +54,7 @@ create_single_source_cgal_program("cc_compatible_orientations.cpp") create_single_source_cgal_program("hausdorff_distance_remeshing_example.cpp") create_single_source_cgal_program("hausdorff_bounded_error_distance_example.cpp") create_single_source_cgal_program("isotropic_remeshing_with_custom_sizing_example.cpp") +create_single_source_cgal_program("isotropic_remeshing_with_allow_move.cpp") create_single_source_cgal_program("triangle_mesh_autorefinement.cpp") create_single_source_cgal_program("soup_autorefinement.cpp") diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_allow_move.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_allow_move.cpp new file mode 100644 index 000000000000..b89401f43705 --- /dev/null +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_allow_move.cpp @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#include +#include + +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef CGAL::Surface_mesh Mesh; + +typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; +typedef boost::graph_traits::edge_descriptor edge_descriptor; + +namespace PMP = CGAL::Polygon_mesh_processing; + +struct Allow_no_surface_crossing +{ + using vertex_descriptor = typename boost::graph_traits::vertex_descriptor; + using Point_3 = typename K::Point_3; + + CGAL::Side_of_triangle_mesh m_side_of_tmesh; + + Allow_no_surface_crossing(const Mesh& mesh) + : m_side_of_tmesh(mesh) + {} + + bool operator()(vertex_descriptor v, Point_3 src, Point_3 tgt) const + { + const CGAL::Bounded_side s_src = m_side_of_tmesh(src); + const CGAL::Bounded_side s_tgt = m_side_of_tmesh(tgt); + return (s_src == s_tgt); + } +}; + +int main(int argc, char* argv[]) +{ + const std::string filename = (argc > 1) ? std::string(argv[1]) : CGAL::data_file_path("meshes/pig.off"); + + Mesh mesh; + if(!PMP::IO::read_polygon_mesh(filename, mesh) || !CGAL::is_triangle_mesh(mesh)) + { + std::cerr << "Invalid input." << std::endl; + return EXIT_FAILURE; + } + + double target_edge_length = (argc > 2) ? std::stod(std::string(argv[2])) : 0.05; + unsigned int nb_iter = (argc > 3) ? std::stoi(std::string(argv[3])) : 1; + + if (PMP::does_self_intersect(mesh)) + std::cout << "Input mesh self-intersects" << std::endl; + else + std::cout << "Input mesh does not self-intersect" << std::endl; + + Allow_no_surface_crossing shall_move(mesh); + PMP::isotropic_remeshing(faces(mesh), target_edge_length, mesh, + CGAL::parameters::number_of_iterations(nb_iter) + .allow_move_functor(shall_move) + ); + + if (PMP::does_self_intersect(mesh)) + std::cout << "Output mesh self-intersects" << std::endl; + else + std::cout << "Output mesh does not self-intersect" << std::endl; + + std::cout << "Remeshing done." << std::endl; + CGAL::IO::write_polygon_mesh("out.off", mesh, CGAL::parameters::stream_precision(17)); + + return EXIT_SUCCESS; +} From de9eccf316abc87d610a9f9724be470a7cca486b Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Fri, 17 May 2024 15:41:29 +0200 Subject: [PATCH 023/348] functor is not unary! --- .../include/CGAL/Polygon_mesh_processing/remesh.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 0a0fdfb45040..e7ef854319b5 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -174,7 +174,7 @@ namespace Polygon_mesh_processing { * \cgalParamNBegin{allow_move_functor} * \cgalParamDescription{A function object used to determinate if a vertex move should * be allowed or not during the relaxation step.} -* \cgalParamType{Unary functor that provides `bool operator()(vertex_descriptor v, Point_3 src, Point_3 tgt)` +* \cgalParamType{Functor that provides `bool operator()(vertex_descriptor v, Point_3 src, Point_3 tgt)` * returning `true` * if the vertex `v` can be moved from `src` to `tgt`; * `%Point_3` being the value type of the vertex point map } From ce37b7dbeddf4ea06133814e11a19bfc6db72ec7 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Wed, 22 May 2024 10:47:18 +0200 Subject: [PATCH 024/348] Refactor variable names --- Testsuite/test/post_process_ctest_results.py | 32 ++++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index 6da4d7de21c1..b7f020da30f2 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -3,12 +3,12 @@ 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\/') +input_report_file=sys.argv[1] +report_file_name=sys.argv[2] +global_report_file_name=sys.argv[3] +config_regex=re.compile('(.*Configuring (examples|demo|test)*( in )*(test\/|examples\/|demo\/)*)((?!done)\w+)') +demo_regex=re.compile('.*in demo\/') +examples_regex=re.compile('.*in examples\/') #open the Installation report @@ -20,13 +20,13 @@ name="" is_writing=False is_ignored=False -global_report=open(global_report_name, "a+") -with open(report_file, "rt") as test_report: +global_report=open(global_report_file_name, "a+") +with open(input_report_file, "rt") as test_report: for myline in test_report: - m=rx.match(myline) + match=config_regex.match(myline) if is_writing: - if m: + if match: is_writing=False test_report.close() if is_ignored: @@ -35,11 +35,11 @@ else: test_report.write(myline) if not is_writing: - if m: - name=m.group(0).replace(m.group(1), "") - if rx_demo.match(myline): + if match: + name=match.group(0).replace(match.group(1), "") + if demo_regex.match(myline): name="{str}_Demo".format(str=name) - elif rx_examples.match(myline): + elif examples_regex.match(myline): name="{str}_Examples".format(str=name) elif name == "libCGAL": name="libCGAL_shared" @@ -57,13 +57,13 @@ if not os.path.isdir(name): is_ignored=True os.mkdir(name) - test_report=open("{dir}/{file}".format(dir=name, file=report_name), "w+") + test_report=open("{dir}/{file}".format(dir=name, file=report_file_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=open("{dir}/{file}".format(dir=name, file=report_file_name), "a+") test_report.write(" --- CMake Results: --- \n\n") is_writing=True if is_writing: From fb276113568448baa0a618f568454a6055578a5e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 27 May 2024 12:36:49 +0100 Subject: [PATCH 025/348] Add to change log --- Installation/CHANGES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 9d673388d532..2869c7566dbb 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -141,6 +141,9 @@ Release date: June 2024 only affects custom point types where not all points in the same position are equivalent. +### [Poisson Surface Reconstruction](https://doc.cgal.org/6.0/Manual/packages.html#PkgPoissonSurfaceReconstruction3) +- Made the implicit function thread-safe so that the parallel version of `make_mesh_3()` can be used. + ### [CGAL and the Boost Graph Library (BGL)](https://doc.cgal.org/6.0/Manual/packages.html#PkgBGL) - Added the function `remove_all_elements()`, which removes vertices, halfedges, and faces From 0d9f25cd351591101232def2ecc90b8a3b1c435a Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Wed, 29 May 2024 09:58:09 +0200 Subject: [PATCH 026/348] Moved CMake logs in test results --- Testsuite/test/post_process_ctest_results.py | 115 ++++++++++++------- 1 file changed, 71 insertions(+), 44 deletions(-) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index b7f020da30f2..8923490ccdba 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -20,52 +20,79 @@ name="" is_writing=False is_ignored=False -global_report=open(global_report_file_name, "a+") +position = 0 +lines_to_write = [] + +global_report = open(global_report_file_name, "a+") + +def find_third_separator(contents): + separator_count = 0 + for i, line in enumerate(contents): + if line.strip() == '------------------------------------------------------------------': + separator_count += 1 + if separator_count == 3: + return i - 2 + return len(contents) + with open(input_report_file, "rt") as test_report: - for myline in test_report: - match=config_regex.match(myline) + for myline in test_report: + match = config_regex.match(myline) + if is_writing: + if match: + is_writing = False + if lines_to_write: + file_path = "{dir}/{file}".format(dir=name, file=report_file_name) + if os.path.exists(file_path): + with open(file_path, "r") as file: + contents = file.readlines() + else: + contents = [] + + position = find_third_separator(contents) - 2 + + if "--- CMake Results: ---" not in contents: + contents.insert(position - 1, " --- CMake Results: ---\n") + contents[position:position] = lines_to_write + + with open(file_path, "w") as file: + file.write("".join(contents)) + + lines_to_write = [] + + if is_ignored: + is_ignored = False + else: + if myline.strip() != "": + lines_to_write.append(myline) + if not is_writing: + if match: + name=match.group(0).replace(match.group(1), "") + if demo_regex.match(myline): + name="{str}_Demo".format(str=name) + elif examples_regex.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_Qt6": + name="libCGALQt6_shared" + if name=="incomplete": + is_writing=False + is_ignored=False + continue + else: + if not os.path.isdir(name): + is_ignored = True + os.mkdir(name) + with open("{dir}/{file}".format(dir=name, file=report_file_name), "w") as test_report: + test_report.write(open("{}/../../../../../.scm-branch".format(os.getcwd()), 'r').read()) + else: + is_ignored = False + is_writing = True - if is_writing: - if match: - 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 match: - name=match.group(0).replace(match.group(1), "") - if demo_regex.match(myline): - name="{str}_Demo".format(str=name) - elif examples_regex.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_Qt6": - name="libCGALQt6_shared" - 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_file_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_file_name), "a+") - test_report.write(" --- CMake Results: --- \n\n") - is_writing=True if is_writing: is_writing=False test_report.close() From 2d6af2f34efd1be6dbf9181eec90562111d04c91 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Wed, 29 May 2024 10:41:31 +0200 Subject: [PATCH 027/348] Adjusted separator position --- Testsuite/test/post_process_ctest_results.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index 8923490ccdba..038468afcc33 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -31,8 +31,8 @@ def find_third_separator(contents): if line.strip() == '------------------------------------------------------------------': separator_count += 1 if separator_count == 3: - return i - 2 - return len(contents) + return i + return len(contents) + 2 with open(input_report_file, "rt") as test_report: for myline in test_report: @@ -48,7 +48,7 @@ def find_third_separator(contents): else: contents = [] - position = find_third_separator(contents) - 2 + position = find_third_separator(contents) if "--- CMake Results: ---" not in contents: contents.insert(position - 1, " --- CMake Results: ---\n") From b1f145017ec5203b20e3d42efc13e31916954629 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Wed, 29 May 2024 15:21:22 +0200 Subject: [PATCH 028/348] Adding cmake logs in the test result --- Testsuite/test/post_process_ctest_results.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index 038468afcc33..26604994a042 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -22,8 +22,13 @@ is_ignored=False position = 0 lines_to_write = [] +installation_cmake_logs = [] -global_report = open(global_report_file_name, "a+") +with open ("{dir}/{file}".format(dir="Installation",file=report_file_name), "r") as file: + contents = file.readlines() +pattern = re.compile(re.escape("- Installation/ProgramOutput.test_config_file_non_standard_CleanupFixture") + '(.*?)' + re.escape("== Generating build files for tests =="), re.DOTALL) +installation_cmake_logs = pattern.findall("".join(contents)) +contents = [] def find_third_separator(contents): separator_count = 0 @@ -34,6 +39,7 @@ def find_third_separator(contents): return i return len(contents) + 2 +global_report = open(global_report_file_name, "a+") with open(input_report_file, "rt") as test_report: for myline in test_report: match = config_regex.match(myline) @@ -52,6 +58,10 @@ def find_third_separator(contents): if "--- CMake Results: ---" not in contents: contents.insert(position - 1, " --- CMake Results: ---\n") + for log in installation_cmake_logs: + contents.insert(position, log) + position += 1 + lines_to_write.insert(0, "\n") contents[position:position] = lines_to_write with open(file_path, "w") as file: From bfe1f2234d30d141ce00619eef8fe3308735f9a3 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 3 Jun 2024 09:38:18 +0200 Subject: [PATCH 029/348] Enhance CMake log parsing and display --- Testsuite/test/post_process_ctest_results.py | 31 +++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index 26604994a042..e882d535d8d4 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -9,6 +9,7 @@ config_regex=re.compile('(.*Configuring (examples|demo|test)*( in )*(test\/|examples\/|demo\/)*)((?!done)\w+)') demo_regex=re.compile('.*in demo\/') examples_regex=re.compile('.*in examples\/') +Separator = "------------------------------------------------------------------" #open the Installation report @@ -24,21 +25,33 @@ lines_to_write = [] installation_cmake_logs = [] -with open ("{dir}/{file}".format(dir="Installation",file=report_file_name), "r") as file: - contents = file.readlines() -pattern = re.compile(re.escape("- Installation/ProgramOutput.test_config_file_non_standard_CleanupFixture") + '(.*?)' + re.escape("== Generating build files for tests =="), re.DOTALL) -installation_cmake_logs = pattern.findall("".join(contents)) -contents = [] + def find_third_separator(contents): separator_count = 0 for i, line in enumerate(contents): - if line.strip() == '------------------------------------------------------------------': + if line.strip() == Separator: separator_count += 1 if separator_count == 3: return i return len(contents) + 2 +def find_last_separator(contents): + for i, line in enumerate(contents): + if line.strip() == Separator: + position = i + return position + +with open ("{dir}/{file}".format(dir="Installation",file=report_file_name), "r") as file: + contents = file.readlines() +position = find_last_separator(contents) +for i, line in enumerate(contents): + if i > position: + installation_cmake_logs.append(line) + if line.strip() == "== Generating build files for tests ==": + break +contents = [] + global_report = open(global_report_file_name, "a+") with open(input_report_file, "rt") as test_report: for myline in test_report: @@ -56,8 +69,10 @@ def find_third_separator(contents): position = find_third_separator(contents) - if "--- CMake Results: ---" not in contents: - contents.insert(position - 1, " --- CMake Results: ---\n") + if Separator + "\n- CMake Results \n" + Separator not in lines_to_write: + lines_to_write.insert(0,Separator + "\n- CMake Results \n" + Separator + "\n") + if Separator + "\n- CMake Logs \n" + Separator not in contents: + contents.insert(position - 1, Separator + "\n- CMake Logs \n" + Separator + "\n\n") for log in installation_cmake_logs: contents.insert(position, log) position += 1 From 0dfaf8a8ac4c687d7ecd594417315f9c7d61d0bd Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 3 Jun 2024 12:37:10 +0200 Subject: [PATCH 030/348] Refactor variable names and fix some warnings --- Testsuite/test/post_process_ctest_results.py | 107 +++++++++---------- 1 file changed, 53 insertions(+), 54 deletions(-) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index e882d535d8d4..23478df950b8 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -1,9 +1,8 @@ import sys -import io import re import os -input_report_file=sys.argv[1] +input_report_file_name=sys.argv[1] report_file_name=sys.argv[2] global_report_file_name=sys.argv[3] config_regex=re.compile('(.*Configuring (examples|demo|test)*( in )*(test\/|examples\/|demo\/)*)((?!done)\w+)') @@ -13,9 +12,9 @@ #open the Installation report -#For each NAME, check if NAME is a directory. If not, create one, create a +#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 +#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 skipped. name="" @@ -27,23 +26,23 @@ -def find_third_separator(contents): +def find_third_separator(inner_contents): separator_count = 0 - for i, line in enumerate(contents): - if line.strip() == Separator: + for j, inner_line in enumerate(inner_contents): + if inner_line.strip() == Separator: separator_count += 1 if separator_count == 3: - return i - return len(contents) + 2 + return j + return len(inner_contents) + 2 -def find_last_separator(contents): - for i, line in enumerate(contents): - if line.strip() == Separator: - position = i - return position +def find_last_separator(inner_contents): + for j, inner_line in enumerate(inner_contents): + if inner_line.strip() == Separator: + inner_position = j + return inner_position -with open ("{dir}/{file}".format(dir="Installation",file=report_file_name), "r") as file: - contents = file.readlines() +with open ("{dir}/{file}".format(dir="Installation",file=report_file_name), "r", encoding="utf-8") as file: + contents = file.readlines() position = find_last_separator(contents) for i, line in enumerate(contents): if i > position: @@ -52,9 +51,9 @@ def find_last_separator(contents): break contents = [] -global_report = open(global_report_file_name, "a+") -with open(input_report_file, "rt") as test_report: - for myline in test_report: +global_report = open(global_report_file_name, "a+", encoding="utf-8") +with open(input_report_file_name, "rt", encoding="utf-8") as input_report_file: + for myline in input_report_file: match = config_regex.match(myline) if is_writing: if match: @@ -62,24 +61,24 @@ def find_last_separator(contents): if lines_to_write: file_path = "{dir}/{file}".format(dir=name, file=report_file_name) if os.path.exists(file_path): - with open(file_path, "r") as file: + with open(file_path, "r", encoding="utf-8") as file: contents = file.readlines() else: contents = [] position = find_third_separator(contents) - if Separator + "\n- CMake Results \n" + Separator not in lines_to_write: - lines_to_write.insert(0,Separator + "\n- CMake Results \n" + Separator + "\n") - if Separator + "\n- CMake Logs \n" + Separator not in contents: - contents.insert(position - 1, Separator + "\n- CMake Logs \n" + Separator + "\n\n") + if not any(re.search("- CMake Results .*", content) for content in contents): + lines_to_write.insert(0, f"{Separator}\n- CMake Results for {name}\n{Separator}\n\n") + if not any(re.search("- CMake Logs .*", content) for content in contents): + contents.insert(position - 1, Separator + "\n- CMake Logs from Installation \n" + Separator + "\n\n") for log in installation_cmake_logs: contents.insert(position, log) position += 1 lines_to_write.insert(0, "\n") contents[position:position] = lines_to_write - with open(file_path, "w") as file: + with open(file_path, "w", encoding="utf-8") as file: file.write("".join(contents)) lines_to_write = [] @@ -90,38 +89,38 @@ def find_last_separator(contents): if myline.strip() != "": lines_to_write.append(myline) if not is_writing: - if match: - name=match.group(0).replace(match.group(1), "") - if demo_regex.match(myline): - name="{str}_Demo".format(str=name) - elif examples_regex.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_Qt6": - name="libCGALQt6_shared" - if name=="incomplete": - is_writing=False - is_ignored=False - continue - else: - if not os.path.isdir(name): - is_ignored = True - os.mkdir(name) - with open("{dir}/{file}".format(dir=name, file=report_file_name), "w") as test_report: - test_report.write(open("{}/../../../../../.scm-branch".format(os.getcwd()), 'r').read()) + if match: + name=match.group(0).replace(match.group(1), "") + if demo_regex.match(myline): + name="{str}_Demo".format(str=name) + elif examples_regex.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_Qt6": + name="libCGALQt6_shared" + if name=="incomplete": + is_writing=False + is_ignored=False + continue else: - is_ignored = False - is_writing = True + if not os.path.isdir(name): + is_ignored = True + os.mkdir(name) + with open("{dir}/{file}".format(dir=name, file=report_file_name), "w", encoding="utf-8") as input_report_file: + input_report_file.write(open("{}/../../../../../.scm-branch".format(os.getcwd()), 'r', encoding="utf-8").read()) + else: + is_ignored = False + is_writing = True if is_writing: is_writing=False - test_report.close() + input_report_file.close() if is_ignored: - print("{label} {result}".format(label=name, result='r'), file=global_report) - is_ignored=False + print("{label} {result}".format(label=name, result='r'), file=global_report) + is_ignored=False global_report.close() From 8613b04e930e4945611707350bba1ab919262f02 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 4 Jun 2024 09:48:40 +0200 Subject: [PATCH 031/348] add to examples list --- Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt index 3aca69fb0049..d257d82892d1 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt @@ -48,5 +48,6 @@ \example Polygon_mesh_processing/remesh_almost_planar_patches.cpp \example Polygon_mesh_processing/sample_example.cpp \example Polygon_mesh_processing/soup_autorefinement.cpp +\example Polygon_mesh_processing/isotropic_remeshing_with_allow_move.cpp */ */ From 6057206b0112a6953da29390a54fb867352c87d4 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Tue, 4 Jun 2024 15:43:09 +0200 Subject: [PATCH 032/348] Update regex patterns to use raw strings --- Testsuite/test/post_process_ctest_results.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index 23478df950b8..4b1f52c5463e 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -5,9 +5,9 @@ input_report_file_name=sys.argv[1] report_file_name=sys.argv[2] global_report_file_name=sys.argv[3] -config_regex=re.compile('(.*Configuring (examples|demo|test)*( in )*(test\/|examples\/|demo\/)*)((?!done)\w+)') -demo_regex=re.compile('.*in demo\/') -examples_regex=re.compile('.*in examples\/') +config_regex=re.compile(r'(.*Configuring (examples|demo|test)*( in )*(test/|examples/|demo/)*)((?!done)\w+)') +demo_regex=re.compile(r'.*in demo/') +examples_regex=re.compile(r'.*in examples/') Separator = "------------------------------------------------------------------" From ff30601f3690f5b6a286fc03f759dc75585f7934 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Tue, 4 Jun 2024 16:09:24 +0200 Subject: [PATCH 033/348] Add version details to some third-party libraries --- Installation/CMakeLists.txt | 8 ++++++++ TDS_3/test/TDS_3/CMakeLists.txt | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index 98d27538371c..9b630ea8f8f1 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -480,6 +480,14 @@ if(CMAKE_COMPILER_IS_GNUCXX) endif() +find_package(TBB QUIET) +if(TBB_FOUND) + message(STATUS "Using TBB version ${TBB_VERSION}") +endif() +find_package(Eigen3 QUIET) +if(Eigen3_FOUND) + message(STATUS "Using Eigen3 version ${EIGEN3_VERSION}") +endif() message("== Generate version files (DONE) ==\n") #-------------------------------------------------------------------------------------------------- diff --git a/TDS_3/test/TDS_3/CMakeLists.txt b/TDS_3/test/TDS_3/CMakeLists.txt index a80cd824ea39..1f407fd84a5e 100644 --- a/TDS_3/test/TDS_3/CMakeLists.txt +++ b/TDS_3/test/TDS_3/CMakeLists.txt @@ -12,6 +12,6 @@ create_single_source_cgal_program("test_triangulation_tds_3.cpp") create_single_source_cgal_program("test_io_tds3.cpp") if(TARGET CGAL::TBB_support) - message(STATUS "Found TBB") + message(STATUS "Found TBB ${TBB_VERSION}") target_link_libraries(test_triangulation_tds_3 PUBLIC CGAL::TBB_support) endif() From 2119d17df8f2c5e512e91024ff31dd433be99d9b Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Wed, 5 Jun 2024 09:49:01 +0200 Subject: [PATCH 034/348] Add 'r' label for ignored packages in testsuite --- Testsuite/test/post_process_ctest_results.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index 4b1f52c5463e..f7253ac4c081 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -58,6 +58,10 @@ def find_last_separator(inner_contents): if is_writing: if match: is_writing = False + input_report_file.close() + if is_ignored: + print("{label} {result}".format(label=name, result='r'), file=global_report) + is_ignored = False if lines_to_write: file_path = "{dir}/{file}".format(dir=name, file=report_file_name) if os.path.exists(file_path): From 05c3fc9e94f8a57329b210c1c429602e0d1f1264 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 11 Jun 2024 10:00:36 +0200 Subject: [PATCH 035/348] update CMakeLists.txt for recent VTK --- Mesh_3/examples/Mesh_3/CMakeLists.txt | 28 ++++++++++++--------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/Mesh_3/examples/Mesh_3/CMakeLists.txt b/Mesh_3/examples/Mesh_3/CMakeLists.txt index 6daadba75911..380202d4dff0 100644 --- a/Mesh_3/examples/Mesh_3/CMakeLists.txt +++ b/Mesh_3/examples/Mesh_3/CMakeLists.txt @@ -26,18 +26,14 @@ if(NOT TARGET CGAL::Eigen3_support) return() endif() -find_package(VTK QUIET COMPONENTS vtkImagingGeneral vtkIOImage NO_MODULE) +find_package(VTK + COMPONENTS ImagingGeneral IOImage + QUIET) if(VTK_FOUND) - if(VTK_USE_FILE) - include(${VTK_USE_FILE}) - endif() - if("${VTK_VERSION_MAJOR}" GREATER "5" OR VTK_VERSION VERSION_GREATER 5) - message(STATUS "VTK found") - if(TARGET VTK::IOImage) - set(VTK_LIBRARIES VTK::ImagingGeneral VTK::IOImage) - endif() + if("${VTK_VERSION_MAJOR}" GREATER "8" OR VTK_VERSION VERSION_GREATER 8) + message(STATUS "VTK ${VTK_VERSION} found ${VTK_LIBRARIES}") else() - message(STATUS "VTK version 6.0 or greater is required") + message(STATUS "VTK version 9.0 or greater is required") endif() else() message(STATUS "VTK was not found") @@ -123,13 +119,13 @@ create_single_source_cgal_program("mesh_polyhedral_complex_sm.cpp") target_link_libraries(mesh_polyhedral_complex_sm PUBLIC CGAL::Eigen3_support) if(TARGET CGAL::CGAL_ImageIO) - if(VTK_FOUND AND ("${VTK_VERSION_MAJOR}" GREATER "5" OR VTK_VERSION - VERSION_GREATER 5)) + if(VTK_FOUND AND ("${VTK_VERSION_MAJOR}" GREATER "8" OR VTK_VERSION + VERSION_GREATER 8)) create_single_source_cgal_program("mesh_3D_gray_vtk_image.cpp") - target_link_libraries( - mesh_3D_gray_vtk_image - PUBLIC CGAL::Eigen3_support CGAL::CGAL CGAL::CGAL_ImageIO ${VTK_LIBRARIES}) - cgal_add_test(mesh_3D_gray_vtk_image) + target_link_libraries(mesh_3D_gray_vtk_image + PUBLIC CGAL::Eigen3_support + CGAL::CGAL_ImageIO + PRIVATE ${VTK_LIBRARIES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS mesh_3D_gray_vtk_image) endif() From 3aa8e3ad73f320849ac3b4384320aa0cb1611eb7 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Tue, 11 Jun 2024 12:35:08 +0200 Subject: [PATCH 036/348] Update file closing method and include logs for ignored files --- Testsuite/test/post_process_ctest_results.py | 32 +++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index f7253ac4c081..b2f29f6ea89f 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -58,12 +58,11 @@ def find_last_separator(inner_contents): if is_writing: if match: is_writing = False - input_report_file.close() if is_ignored: print("{label} {result}".format(label=name, result='r'), file=global_report) is_ignored = False if lines_to_write: - file_path = "{dir}/{file}".format(dir=name, file=report_file_name) + file_path = f"{name}/{report_file_name}" if os.path.exists(file_path): with open(file_path, "r", encoding="utf-8") as file: contents = file.readlines() @@ -74,11 +73,6 @@ def find_last_separator(inner_contents): if not any(re.search("- CMake Results .*", content) for content in contents): lines_to_write.insert(0, f"{Separator}\n- CMake Results for {name}\n{Separator}\n\n") - if not any(re.search("- CMake Logs .*", content) for content in contents): - contents.insert(position - 1, Separator + "\n- CMake Logs from Installation \n" + Separator + "\n\n") - for log in installation_cmake_logs: - contents.insert(position, log) - position += 1 lines_to_write.insert(0, "\n") contents[position:position] = lines_to_write @@ -86,7 +80,6 @@ def find_last_separator(inner_contents): file.write("".join(contents)) lines_to_write = [] - if is_ignored: is_ignored = False else: @@ -115,15 +108,32 @@ def find_last_separator(inner_contents): if not os.path.isdir(name): is_ignored = True os.mkdir(name) - with open("{dir}/{file}".format(dir=name, file=report_file_name), "w", encoding="utf-8") as input_report_file: - input_report_file.write(open("{}/../../../../../.scm-branch".format(os.getcwd()), 'r', encoding="utf-8").read()) + report_file_handle=open("{dir}/{file}".format(dir=name, file=report_file_name), "w+", encoding="utf-8") + report_file_handle.write(open("{}/../../../../../.scm-branch".format(os.getcwd()), 'r', encoding="utf-8").read()) else: is_ignored = False + file_path = "{dir}/{file}".format(dir=name, file=report_file_name) + if os.path.exists(file_path): + with open(file_path, "r", encoding="utf-8") as file: + contents = file.readlines() + else: + contents = [] + + position = find_third_separator(contents) + + if not any(re.search("- CMake Logs .*", content) for content in contents): + contents.insert(position - 1, Separator + "\n- CMake Logs from Installation \n" + Separator + "\n\n") + for log in installation_cmake_logs: + contents.insert(position, log) + position += 1 + + with open(file_path, "w", encoding="utf-8") as file: + file.write("".join(contents)) + is_writing = True if is_writing: is_writing=False - input_report_file.close() if is_ignored: print("{label} {result}".format(label=name, result='r'), file=global_report) is_ignored=False From f3b409a807e539155199b32eaefd488338e5457b Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 11 Jun 2024 15:57:25 +0200 Subject: [PATCH 037/348] require VTK version 9.0 or later --- BGL/test/BGL/CMakeLists.txt | 29 ++++++------------- Installation/CMakeLists.txt | 2 +- Lab/demo/Lab/Plugins/IO/CMakeLists.txt | 33 ++++++---------------- Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt | 18 ++---------- Mesh_3/examples/Mesh_3/CMakeLists.txt | 11 ++------ 5 files changed, 25 insertions(+), 68 deletions(-) diff --git a/BGL/test/BGL/CMakeLists.txt b/BGL/test/BGL/CMakeLists.txt index 3b4304b5056b..0d995ff281d8 100644 --- a/BGL/test/BGL/CMakeLists.txt +++ b/BGL/test/BGL/CMakeLists.txt @@ -66,26 +66,15 @@ else() message(STATUS "NOTICE: Tests that use OpenMesh will not be compiled.") endif() -find_package(VTK QUIET COMPONENTS vtkCommonCore vtkIOCore vtkIOLegacy vtkIOXML vtkFiltersCore vtkFiltersSources) -if (VTK_FOUND) - if(VTK_USE_FILE) - include(${VTK_USE_FILE}) - endif() - - if ("${VTK_VERSION_MAJOR}" GREATER "5" OR VTK_VERSION VERSION_GREATER 5) - if(TARGET VTK::CommonCore) - set(VTK_LIBRARIES VTK::CommonCore VTK::IOCore VTK::IOLegacy VTK::IOXML VTK::FiltersCore VTK::FiltersSources) - endif() - - if(VTK_LIBRARIES) - target_link_libraries(test_bgl_read_write PRIVATE ${VTK_LIBRARIES}) - target_compile_definitions(test_bgl_read_write PRIVATE -DCGAL_USE_VTK -DNOMINMAX) - target_link_libraries(test_deprecated_io PRIVATE ${VTK_LIBRARIES}) - target_compile_definitions(test_deprecated_io PRIVATE -DCGAL_USE_VTK -DNOMINMAX) - else() - message(STATUS "Tests that use VTK will not be compiled.") - endif() - endif() +find_package(VTK 9.0 QUIET COMPONENTS CommonCore IOCore IOLegacy IOXML FiltersCore FiltersSources) +if (VTK_FOUND AND VTK_LIBRARIES) + message(STATUS "VTK ${VTK_VERSION} found ${VTK_LIBRARIES}") + target_link_libraries(test_bgl_read_write PRIVATE ${VTK_LIBRARIES}) + target_compile_definitions(test_bgl_read_write PRIVATE -DCGAL_USE_VTK -DNOMINMAX) + target_link_libraries(test_deprecated_io PRIVATE ${VTK_LIBRARIES}) + target_compile_definitions(test_deprecated_io PRIVATE -DCGAL_USE_VTK -DNOMINMAX) +else() + message(STATUS "Tests that use VTK will not be compiled.") endif() #VTK_FOUND find_path(3MF_INCLUDE_DIR diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index 98d27538371c..a44e7fb4cb54 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -934,7 +934,7 @@ if(CGAL_BRANCH_BUILD) find_package(Doxygen REQUIRED) find_package(Eigen3 REQUIRED) find_package(Qt6 COMPONENTS Core Widgets OpenGL Gui REQUIRED) - find_package(VTK COMPONENTS vtkImagingGeneral vtkIOImage NO_MODULE) + find_package(VTK COMPONENTS ImagingGeneral IOImage NO_MODULE) if(VTK_FOUND) get_target_property(VTK_INCLUDE_DIRS VTK::IOImage INTERFACE_INCLUDE_DIRECTORIES) endif() diff --git a/Lab/demo/Lab/Plugins/IO/CMakeLists.txt b/Lab/demo/Lab/Plugins/IO/CMakeLists.txt index c6247c39212e..6ed225c04908 100644 --- a/Lab/demo/Lab/Plugins/IO/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/IO/CMakeLists.txt @@ -43,38 +43,23 @@ target_link_libraries(surf_io_plugin PUBLIC scene_surface_mesh_item) cgal_lab_plugin(lcc_io_plugin lcc_io_plugin KEYWORDS Viewer) target_link_libraries(lcc_io_plugin PUBLIC scene_lcc_item) -find_package(VTK QUIET COMPONENTS vtkCommonCore vtkIOCore vtkIOLegacy vtkIOXML - vtkFiltersCore vtkFiltersSources) +find_package(VTK 9.0 QUIET COMPONENTS CommonCore IOCore IOLegacy IOXML FiltersCore FiltersSources) set_package_properties( VTK PROPERTIES DESCRIPTION "A library for image processing." - PURPOSE "Can be used for I/O (DICOM, VTU, VTP.") + PURPOSE "Can be used for I/O (DICOM, VTU, VTP).") cgal_lab_plugin(triangulation_3_io_plugin triangulation_3_io_plugin KEYWORDS Viewer) target_link_libraries(triangulation_3_io_plugin PUBLIC scene_triangulation_3_item) -if(VTK_FOUND) - if(VTK_USE_FILE) - include(${VTK_USE_FILE}) - endif() - if("${VTK_VERSION_MAJOR}" GREATER "5" OR VTK_VERSION VERSION_GREATER 5) - if(TARGET VTK::CommonCore) - set(VTK_LIBRARIES VTK::CommonCore VTK::IOCore VTK::IOLegacy VTK::IOXML - VTK::FiltersCore VTK::FiltersSources) - endif() - if(VTK_LIBRARIES) - cgal_lab_plugin(vtk_plugin VTK_io_plugin KEYWORDS Viewer Mesh_3) - target_link_libraries(vtk_plugin PUBLIC scene_surface_mesh_item scene_polylines_item scene_c3t3_item scene_points_with_normal_item - ${VTK_LIBRARIES}) - target_compile_definitions(vtk_plugin PRIVATE -DCGAL_USE_VTK -DNOMINMAX) - else() - message(STATUS "NOTICE: the vtk IO plugin needs VTK libraries and will not be compiled.") - endif() - else() - message(STATUS "NOTICE: the vtk IO plugin needs VTK 6.0 or greater and will not be compiled (incorrect version found).") - endif() +if(VTK_FOUND AND VTK_LIBRARIES) + message(STATUS "VTK ${VTK_VERSION} found ${VTK_LIBRARIES}") + cgal_lab_plugin(vtk_plugin VTK_io_plugin KEYWORDS Viewer Mesh_3) + target_link_libraries(vtk_plugin PUBLIC scene_surface_mesh_item scene_polylines_item scene_c3t3_item scene_points_with_normal_item + ${VTK_LIBRARIES}) + target_compile_definitions(vtk_plugin PRIVATE -DCGAL_USE_VTK -DNOMINMAX) else() - message(STATUS "NOTICE: the vtk IO plugin needs VTK 6.0 or greater and will not be compiled.") + message(STATUS "NOTICE: the vtk IO plugin needs VTK 9.0 or greater and will not be compiled.") endif() cgal_lab_plugin(xyz_plugin XYZ_io_plugin KEYWORDS Viewer PointSetProcessing Classification) target_link_libraries(xyz_plugin PUBLIC scene_points_with_normal_item) diff --git a/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt b/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt index 1f681a39e2c6..2234d34db36d 100644 --- a/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt @@ -37,21 +37,9 @@ if(ITK_FOUND) target_link_libraries(mesh_3_plugin PUBLIC CGAL::ITK_support) endif(ITK_FOUND) -find_package(VTK QUIET COMPONENTS vtkImagingGeneral vtkIOImage vtkIOXML NO_MODULE) -if(VTK_FOUND) - if(VTK_USE_FILE) - include(${VTK_USE_FILE}) - endif() - if("${VTK_VERSION_MAJOR}" GREATER "5" OR VTK_VERSION VERSION_GREATER 5) - if(TARGET VTK::IOImage) - set(VTK_LIBRARIES VTK::IOImage VTK::ImagingGeneral VTK::IOXML) - endif() - if(NOT VTK_LIBRARIES) - message(STATUS "NOTICE: DICOM files (.dcm) require the VTK libraries, and will not be readable.") - endif() - else() - message(STATUS "NOTICE: DICOM files (.dcm) require the VTK libraries, and will not be readable.") - endif() +find_package(VTK 9.0 QUIET COMPONENTS ImagingGeneral IOImage IOXML NO_MODULE) +if(VTK_FOUND AND VTK_LIBRARIES) + message(STATUS "VTK ${VTK_VERSION} found ${VTK_LIBRARIES}") else() message(STATUS "NOTICE: DICOM files (.dcm) require the VTK libraries, and will not be readable.") endif() diff --git a/Mesh_3/examples/Mesh_3/CMakeLists.txt b/Mesh_3/examples/Mesh_3/CMakeLists.txt index 380202d4dff0..88aceb7c0682 100644 --- a/Mesh_3/examples/Mesh_3/CMakeLists.txt +++ b/Mesh_3/examples/Mesh_3/CMakeLists.txt @@ -26,15 +26,11 @@ if(NOT TARGET CGAL::Eigen3_support) return() endif() -find_package(VTK +find_package(VTK 9.0 COMPONENTS ImagingGeneral IOImage QUIET) if(VTK_FOUND) - if("${VTK_VERSION_MAJOR}" GREATER "8" OR VTK_VERSION VERSION_GREATER 8) - message(STATUS "VTK ${VTK_VERSION} found ${VTK_LIBRARIES}") - else() - message(STATUS "VTK version 9.0 or greater is required") - endif() + message(STATUS "VTK ${VTK_VERSION} found ${VTK_LIBRARIES}") else() message(STATUS "VTK was not found") endif() @@ -119,8 +115,7 @@ create_single_source_cgal_program("mesh_polyhedral_complex_sm.cpp") target_link_libraries(mesh_polyhedral_complex_sm PUBLIC CGAL::Eigen3_support) if(TARGET CGAL::CGAL_ImageIO) - if(VTK_FOUND AND ("${VTK_VERSION_MAJOR}" GREATER "8" OR VTK_VERSION - VERSION_GREATER 8)) + if(VTK_FOUND) create_single_source_cgal_program("mesh_3D_gray_vtk_image.cpp") target_link_libraries(mesh_3D_gray_vtk_image PUBLIC CGAL::Eigen3_support From b2e6a4abb0819085294fa015d4df15cb2a3ea532 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Wed, 12 Jun 2024 09:30:23 +0200 Subject: [PATCH 038/348] Refactor file opening to use 'with' statement --- Testsuite/test/post_process_ctest_results.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index b2f29f6ea89f..5f2af05d5b56 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -108,8 +108,8 @@ def find_last_separator(inner_contents): if not os.path.isdir(name): is_ignored = True os.mkdir(name) - report_file_handle=open("{dir}/{file}".format(dir=name, file=report_file_name), "w+", encoding="utf-8") - report_file_handle.write(open("{}/../../../../../.scm-branch".format(os.getcwd()), 'r', encoding="utf-8").read()) + with open("{dir}/{file}".format(dir=name, file=report_file_name), "w+", encoding="utf-8") as report_file_handle: + report_file_handle.write(open("{}/../../../../../.scm-branch".format(os.getcwd()), 'r', encoding="utf-8").read()) else: is_ignored = False file_path = "{dir}/{file}".format(dir=name, file=report_file_name) From 46f4171ec0db5d9fc727b1a80e5febd07f5ff131 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Wed, 12 Jun 2024 11:02:01 +0200 Subject: [PATCH 039/348] display third party libraries in summary --- Installation/CMakeLists.txt | 4 +-- .../test_handling/create_testresult_page | 26 +++++++++++++++---- Maintenance/test_handling/to_zipped_format | 6 ++++- TDS_3/test/TDS_3/CMakeLists.txt | 2 +- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index 9b630ea8f8f1..c45306233a86 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -482,11 +482,11 @@ endif() find_package(TBB QUIET) if(TBB_FOUND) - message(STATUS "Using TBB version ${TBB_VERSION}") + message(STATUS "Third-parties libraries TBB ${TBB_VERSION}") endif() find_package(Eigen3 QUIET) if(Eigen3_FOUND) - message(STATUS "Using Eigen3 version ${EIGEN3_VERSION}") + message(STATUS "Third-parties libraries Eigen3 ${EIGEN3_VERSION}") endif() message("== Generate version files (DONE) ==\n") diff --git a/Maintenance/test_handling/create_testresult_page b/Maintenance/test_handling/create_testresult_page index ca62a5928286..d023b5c6996a 100755 --- a/Maintenance/test_handling/create_testresult_page +++ b/Maintenance/test_handling/create_testresult_page @@ -752,10 +752,22 @@ sub create_summary_page { my @letters = ('r', 'n', 'w', 'o'); my $letters_options = join("\n", map { "" } @letters); my $package_options = join("\n", map { "" } sort keys %test_directories); + my $third_party_libraries = ""; my @search_index; my ($platform_num, $platform) = (0, ""); foreach $platform (@platforms_to_do) { + if (open (PLATFORM_INFO, "results_${platform}.info")) { + my $line = ""; + while () { + $line = $_; + if ($line =~ /^TPL:/) { + $third_party_libraries = $line; + } + print "$line\n"; + } + close PLATFORM_INFO; + } foreach my $letter (@letters) { foreach my $test_directory (sort keys %test_directories) { my $resulttext = $testresults[$platform_num]->{$test_directory}; @@ -767,6 +779,7 @@ sub create_summary_page { content => $warnings_and_errors, release => $release_name, letters => $letter, + third_party_libraries => $third_party_libraries, }; } } @@ -791,11 +804,11 @@ sub create_summary_page { "https://www.w3.org/TR/html4/strict.dtd"> - - Summary - - - - - - - - - -
-

Summary Results of ${release_name}

- - - -
-
+ + + Summary + + + + + + + + + + +
+

Summary Results of ${release_name}

+ + + +
+
+ + +
+
+
+
+
+ EOF my $summary_page_path = "$testresult_dir/summary".substr($release_name,4).".html"; diff --git a/Maintenance/test_handling/testresult.css b/Maintenance/test_handling/testresult.css index f95a62452f92..94a1c213a850 100644 --- a/Maintenance/test_handling/testresult.css +++ b/Maintenance/test_handling/testresult.css @@ -89,4 +89,30 @@ TABLE.result TD > a.package_name { grid-template-columns: repeat(4, 1fr); gap: 20px; padding: 20px; - } \ No newline at end of file +} + +.toggle-button { + text-decoration: underline; + border: none; + color: #0000EE; + cursor: pointer; +} + +.summary-content{ + overflow: auto; + max-height: 600px; +} + +.directory_container{ + display: flex; + align-items: center; +} + +.platform-container { + display: flex; + align-items: center; +} + +.platform-link { + margin-right: 10px; +} \ No newline at end of file From e95ea7cde7d30ea6d6da40d66ff61336f5fa4a03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 4 Jul 2024 18:36:55 +0200 Subject: [PATCH 046/348] unused variable --- .../isotropic_remeshing_with_allow_move.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_allow_move.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_allow_move.cpp index 1f74ab88f3e8..7ee9fa7bcf7f 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_allow_move.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_allow_move.cpp @@ -28,7 +28,7 @@ struct Allow_no_surface_crossing : m_side_of_tmesh(mesh) {} - bool operator()(vertex_descriptor v, Point_3 src, Point_3 tgt) const + bool operator()(vertex_descriptor, Point_3 src, Point_3 tgt) const { const CGAL::Bounded_side s_src = m_side_of_tmesh(src); const CGAL::Bounded_side s_tgt = m_side_of_tmesh(tgt); From fa1f230364766baf05982221f1dcef4acb9d42fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 05:43:55 +0000 Subject: [PATCH 047/348] Bump fsfe/reuse-action from 3 to 4 Bumps [fsfe/reuse-action](https://github.com/fsfe/reuse-action) from 3 to 4. - [Release notes](https://github.com/fsfe/reuse-action/releases) - [Commits](https://github.com/fsfe/reuse-action/compare/v3...v4) --- updated-dependencies: - dependency-name: fsfe/reuse-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/reuse.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/reuse.yml b/.github/workflows/reuse.yml index f76a99b18dd1..e312e8a88ad2 100644 --- a/.github/workflows/reuse.yml +++ b/.github/workflows/reuse.yml @@ -12,15 +12,15 @@ jobs: steps: - uses: actions/checkout@v4 - name: REUSE version - uses: fsfe/reuse-action@v3 + uses: fsfe/reuse-action@v4 with: args: --version - name: REUSE lint - uses: fsfe/reuse-action@v3 + uses: fsfe/reuse-action@v4 with: args: --include-submodules lint - name: REUSE SPDX SBOM - uses: fsfe/reuse-action@v3 + uses: fsfe/reuse-action@v4 with: args: spdx - name: install dependencies @@ -30,6 +30,6 @@ jobs: mkdir -p ./release cmake -DDESTINATION=./release -DCGAL_VERSION=9.9 -P ./Scripts/developer_scripts/cgal_create_release_with_cmake.cmake - name: REUSE lint release tarball - uses: fsfe/reuse-action@v3 + uses: fsfe/reuse-action@v4 with: args: --root ./release/CGAL-9.9 --include-submodules lint From d8451ecfed86fcc2a3d0debebbd48babeb6230eb Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Wed, 10 Jul 2024 16:27:16 +0200 Subject: [PATCH 048/348] Update third-party library names and versions in CMakeLists.txt --- Installation/CMakeLists.txt | 55 ++++++++++++++++++++-- Maintenance/test_handling/to_zipped_format | 2 +- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index c45306233a86..744b24e7de24 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -482,14 +482,63 @@ endif() find_package(TBB QUIET) if(TBB_FOUND) - message(STATUS "Third-parties libraries TBB ${TBB_VERSION}") + message(STATUS "Third-party library TBB ${TBB_VERSION}") endif() find_package(Eigen3 QUIET) if(Eigen3_FOUND) - message(STATUS "Third-parties libraries Eigen3 ${EIGEN3_VERSION}") + message(STATUS "Third-party library Eigen3 ${EIGEN3_VERSION}") +endif() + +find_package(GMP QUIET) +if(GMP_FOUND) + message(STATUS "Third-party library GMP ${GMP_VERSION}") +endif() + +find_package(MPFR QUIET) +if(MPFR_FOUND) + message(STATUS "Third-party library MPFR ${MPFR_VERSION}") +endif() + +find_package(OpenGR QUIET) +if(OpenGR_FOUND) + message(STATUS "Third-party library OpenGR found") +endif() + +find_package(libpointmatcher QUIET) +if(libpointmatcher_FOUND) + message(STATUS "Third-party library libpointmatcher found") +endif() + +find_package(LEDA QUIET) +if(LEDA_FOUND) + message(STATUS "Third-party library LEDA found") endif() -message("== Generate version files (DONE) ==\n") +find_package(MPFI QUIET) +if(MPFI_FOUND) + message(STATUS "Third-party library MPFI found") +endif() + +find_package(NTL QUIET) +if(NTL_FOUND) + message(STATUS "Third-party library NTL found") +endif() + +find_package(OpenCV QUIET) +if(OpenCV_FOUND) + message(STATUS "Third-party library OpenCV ${OpenCV_VERSION}") +endif() + +find_package(METIS QUIET) +if(METIS_FOUND) + message(STATUS "Third-party library METIS found") +endif() + +find_package(ZLIB QUIET) +if(ZLIB_FOUND) + message(STATUS "Third-party library zlib ${ZLIB_VERSION_STRING}") +endif() +message("== Generate version files (DONE) ==\n") #-------------------------------------------------------------------------------------------------- # # -= External libraries =- diff --git a/Maintenance/test_handling/to_zipped_format b/Maintenance/test_handling/to_zipped_format index e04106ade2b1..b46fe121837c 100755 --- a/Maintenance/test_handling/to_zipped_format +++ b/Maintenance/test_handling/to_zipped_format @@ -132,7 +132,7 @@ sub reformat_results($) # print PLATFORM_NEW_RESULTS $_; # last; # } - if (/^-- Third-parties libraries ([\w\.]+ [\w\.\_\-]*)/) { + if (/^-- Third-party library ([\w\.]+ [\w\.\_\-]*)/) { $TPL = "$TPL $1,"; } NEXT: if(! ($_= )) { From fc9a08e93e8126ab13fab9ed6a6e29761178fd5b Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Thu, 11 Jul 2024 16:18:37 +0200 Subject: [PATCH 049/348] Update library check to use a function and loop --- Installation/CMakeLists.txt | 99 ++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 56 deletions(-) diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index 744b24e7de24..ae5b5ba58bce 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -479,65 +479,52 @@ if(CMAKE_COMPILER_IS_GNUCXX) endif() endif() +set(LIBRARIES_TO_CHECK + Boost GMP MPFR + #VTK + Qt6 + Eigen3 OpenGR libpointmatcher LEDA MPFI + NTL TBB OpenCV METIS ZLIB + Ceres GLPK SCIP OSQP +) -find_package(TBB QUIET) -if(TBB_FOUND) - message(STATUS "Third-party library TBB ${TBB_VERSION}") -endif() -find_package(Eigen3 QUIET) -if(Eigen3_FOUND) - message(STATUS "Third-party library Eigen3 ${EIGEN3_VERSION}") -endif() - -find_package(GMP QUIET) -if(GMP_FOUND) - message(STATUS "Third-party library GMP ${GMP_VERSION}") -endif() - -find_package(MPFR QUIET) -if(MPFR_FOUND) - message(STATUS "Third-party library MPFR ${MPFR_VERSION}") -endif() - -find_package(OpenGR QUIET) -if(OpenGR_FOUND) - message(STATUS "Third-party library OpenGR found") -endif() - -find_package(libpointmatcher QUIET) -if(libpointmatcher_FOUND) - message(STATUS "Third-party library libpointmatcher found") -endif() - -find_package(LEDA QUIET) -if(LEDA_FOUND) - message(STATUS "Third-party library LEDA found") -endif() - -find_package(MPFI QUIET) -if(MPFI_FOUND) - message(STATUS "Third-party library MPFI found") -endif() - -find_package(NTL QUIET) -if(NTL_FOUND) - message(STATUS "Third-party library NTL found") -endif() - -find_package(OpenCV QUIET) -if(OpenCV_FOUND) - message(STATUS "Third-party library OpenCV ${OpenCV_VERSION}") -endif() +function(check_library lib) + set(CMAKE_FIND_PACKAGE_QUIET TRUE) + find_package(${lib} QUIET) + set(CMAKE_FIND_PACKAGE_QUIET FALSE) + if(${lib}_FOUND) + set(version_var "") + if(${lib} STREQUAL "Eigen3") + set(version_var ${EIGEN3_VERSION}) + elseif(${lib} STREQUAL "GMP") + set(version_var ${GMP_VERSION}) + elseif(${lib} STREQUAL "MPFR") + set(version_var ${MPFR_VERSION}) + elseif(${lib} STREQUAL "METIS") + set(version_var ${METIS_VERSION}) + elseif(DEFINED ${lib}_VERSION) + set(version_var ${${lib}_VERSION}) + elseif(DEFINED ${lib}_VERSION_STRING) + set(version_var ${${lib}_VERSION_STRING}) + endif() -find_package(METIS QUIET) -if(METIS_FOUND) - message(STATUS "Third-party library METIS found") -endif() + if(version_var) + message(STATUS "Third-party library ${lib} ${version_var}") + else() + message(STATUS "Third-party library ${lib} found") + endif() + else() + message(STATUS "Third-party library ${lib} not found") + endif() +endfunction() -find_package(ZLIB QUIET) -if(ZLIB_FOUND) - message(STATUS "Third-party library zlib ${ZLIB_VERSION_STRING}") -endif() +foreach(lib IN LISTS LIBRARIES_TO_CHECK) + check_library(${lib}) +endforeach() +#find_package(VTK REQUIRED) +#if(VTK_FOUND) +# message(STATUS "Third-party library VTK ${VTK_VERSION}") +#endif() message("== Generate version files (DONE) ==\n") #-------------------------------------------------------------------------------------------------- # From 0babd3148ae833c6aae07b33059329994c87cfb4 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 11 Jul 2024 17:20:02 +0200 Subject: [PATCH 050/348] update to REUSE tools v4 --- .reuse/dep5 | 12 ------------ Installation/.reuse/dep5 | 12 ------------ Installation/REUSE.toml | 16 ++++++++++++++++ REUSE.toml | 16 ++++++++++++++++ 4 files changed, 32 insertions(+), 24 deletions(-) delete mode 100644 .reuse/dep5 delete mode 100644 Installation/.reuse/dep5 create mode 100644 Installation/REUSE.toml create mode 100644 REUSE.toml diff --git a/.reuse/dep5 b/.reuse/dep5 deleted file mode 100644 index 06784d71d6b2..000000000000 --- a/.reuse/dep5 +++ /dev/null @@ -1,12 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: CGAL -Upstream-Contact: CGAL Editorial Board -Source: https://github.com/CGAL/cgal - -Files: .* *.cmake *.md .github/* Maintenance/* */TODO */doc/* */deb/* */applications/* */doc_html/* */scripts/* */developer_scripts/* */demo/* */examples/* */src/* */test/* */benchmarks/* */benchmark/* */package_info/* */data/* */cmake/* -Copyright: 1995-2023 The CGAL Project -License: CC0-1.0 - -Files: CMakeLists.txt GraphicsView/include/CGAL/Qt/ImageInterface.ui GraphicsView/include/CGAL/Qt/resources/qglviewer-icon.xpm Installation/AUTHORS Installation/CMakeLists.txt Installation/README Installation/auxiliary/cgal_create_cmake_script.1 Installation/auxiliary/gmp/README Installation/include/CGAL/license/gpl_package_list.txt MacOSX/auxiliary/cgal_app.icns copyright -Copyright: 1995-2023 The CGAL Project -License: CC0-1.0 diff --git a/Installation/.reuse/dep5 b/Installation/.reuse/dep5 deleted file mode 100644 index ef2e017a3975..000000000000 --- a/Installation/.reuse/dep5 +++ /dev/null @@ -1,12 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: CGAL -Upstream-Contact: CGAL Editorial Board -Source: https://github.com/CGAL/cgal - -Files: *.cmake *.md doc/* doc_html/* scripts/* developer_scripts/* package_info/* demo/* examples/* src/* test/* benchmarks/* benchmark/* data/* cmake/* -Copyright: 1995-2023 The CGAL Project -License: CC0-1.0 - -Files: include/CGAL/Qt/ImageInterface.ui include/CGAL/Qt/resources/qglviewer-icon.xpm AUTHORS CMakeLists.txt README auxiliary/cgal_create_cmake_script.1 auxiliary/gmp/README include/CGAL/license/gpl_package_list.txt auxiliary/cgal_app.icns copyright VERSION -Copyright: 1995-2023 The CGAL Project -License: CC0-1.0 diff --git a/Installation/REUSE.toml b/Installation/REUSE.toml new file mode 100644 index 000000000000..f004d1d20546 --- /dev/null +++ b/Installation/REUSE.toml @@ -0,0 +1,16 @@ +version = 1 +SPDX-PackageName = "CGAL" +SPDX-PackageSupplier = "CGAL Editorial Board " +SPDX-PackageDownloadLocation = "https://github.com/CGAL/cgal" + +[[annotations]] +path = ["**.cmake", "**.md", "doc/**", "doc_html/**", "scripts/**", "developer_scripts/**", "package_info/**", "demo/**", "examples/**", "src/**", "test/**", "benchmarks/**", "benchmark/**", "data/**", "cmake/**"] +precedence = "aggregate" +SPDX-FileCopyrightText = "1995-2024 The CGAL Project" +SPDX-License-Identifier = "CC0-1.0" + +[[annotations]] +path = ["REUSE.toml", "include/CGAL/Qt/ImageInterface.ui", "include/CGAL/Qt/resources/qglviewer-icon.xpm", "AUTHORS", "CMakeLists.txt", "README", "auxiliary/cgal_create_cmake_script.1", "auxiliary/gmp/README", "include/CGAL/license/gpl_package_list.txt", "auxiliary/cgal_app.icns", "copyright", "VERSION"] +precedence = "aggregate" +SPDX-FileCopyrightText = "1995-2024 The CGAL Project" +SPDX-License-Identifier = "CC0-1.0" diff --git a/REUSE.toml b/REUSE.toml new file mode 100644 index 000000000000..a36f899b03c7 --- /dev/null +++ b/REUSE.toml @@ -0,0 +1,16 @@ +version = 1 +SPDX-PackageName = "CGAL" +SPDX-PackageSupplier = "CGAL Editorial Board " +SPDX-PackageDownloadLocation = "https://github.com/CGAL/cgal" + +[[annotations]] +path = [".**", "**.cmake", "**.md", ".github/**", "Maintenance/**", "**/TODO", "**/doc/**", "**/deb/**", "**/applications/**", "**/doc_html/**", "**/scripts/**", "**/developer_scripts/**", "**/demo/**", "**/examples/**", "**/src/**", "**/test/**", "**/benchmarks/**", "**/benchmark/**", "**/package_info/**", "**/data/**", "**/cmake/**"] +precedence = "aggregate" +SPDX-FileCopyrightText = "1995-2024 The CGAL Project" +SPDX-License-Identifier = "CC0-1.0" + +[[annotations]] +path = ["REUSE.toml", "CMakeLists.txt", "cmake_uninstall.cmake.in", "GraphicsView/include/CGAL/Qt/ImageInterface.ui", "GraphicsView/include/CGAL/Qt/resources/qglviewer-icon.xpm", "Installation/AUTHORS", "Installation/CMakeLists.txt", "Installation/README", "Installation/auxiliary/cgal_create_cmake_script.1", "Installation/auxiliary/gmp/README", "Installation/include/CGAL/license/gpl_package_list.txt", "MacOSX/auxiliary/cgal_app.icns", "copyright"] +precedence = "aggregate" +SPDX-FileCopyrightText = "1995-2024 The CGAL Project" +SPDX-License-Identifier = "CC0-1.0" From a965b13bfe4a4790b11e6bbbfa762a683924683d Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 11 Jul 2024 17:26:57 +0200 Subject: [PATCH 051/348] fix CI --- GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 1 + Installation/REUSE.toml | 2 +- Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h | 2 +- Scripts/developer_scripts/test_merge_of_branch | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index 7387b1f48745..92dd476a5a28 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -84,6 +84,7 @@ See the project main page for details on the project and installation steps. */ CGAL_INLINE_FUNCTION void CGAL::QGLViewer::defaultConstructor() { + return; setFocusPolicy(::Qt::StrongFocus); CGAL::QGLViewer::QGLViewerPool().append(this); diff --git a/Installation/REUSE.toml b/Installation/REUSE.toml index f004d1d20546..4ceda7b22792 100644 --- a/Installation/REUSE.toml +++ b/Installation/REUSE.toml @@ -10,7 +10,7 @@ SPDX-FileCopyrightText = "1995-2024 The CGAL Project" SPDX-License-Identifier = "CC0-1.0" [[annotations]] -path = ["REUSE.toml", "include/CGAL/Qt/ImageInterface.ui", "include/CGAL/Qt/resources/qglviewer-icon.xpm", "AUTHORS", "CMakeLists.txt", "README", "auxiliary/cgal_create_cmake_script.1", "auxiliary/gmp/README", "include/CGAL/license/gpl_package_list.txt", "auxiliary/cgal_app.icns", "copyright", "VERSION"] +path = ["REUSE.toml", "lib/cmake/CGAL/CGALConfig-installation-dirs.cmake.in", "include/CGAL/Qt/ImageInterface.ui", "include/CGAL/Qt/resources/qglviewer-icon.xpm", "AUTHORS", "CMakeLists.txt", "README", "auxiliary/cgal_create_cmake_script.1", "auxiliary/gmp/README", "include/CGAL/license/gpl_package_list.txt", "auxiliary/cgal_app.icns", "copyright", "VERSION"] precedence = "aggregate" SPDX-FileCopyrightText = "1995-2024 The CGAL Project" SPDX-License-Identifier = "CC0-1.0" diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index 9034d419963c..a6951a9275a0 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -313,7 +313,7 @@ template Date: Thu, 11 Jul 2024 18:07:00 +0200 Subject: [PATCH 052/348] oops! remove bad changes --- GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 1 - Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h | 2 +- Scripts/developer_scripts/test_merge_of_branch | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index 92dd476a5a28..7387b1f48745 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -84,7 +84,6 @@ See the project main page for details on the project and installation steps. */ CGAL_INLINE_FUNCTION void CGAL::QGLViewer::defaultConstructor() { - return; setFocusPolicy(::Qt::StrongFocus); CGAL::QGLViewer::QGLViewerPool().append(this); diff --git a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h index a6951a9275a0..9034d419963c 100644 --- a/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/draw_linear_cell_complex.h @@ -313,7 +313,7 @@ template Date: Fri, 12 Jul 2024 11:40:39 +0200 Subject: [PATCH 053/348] Fix issue with VTK/Qt5/Qt6 --- Installation/CMakeLists.txt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index ae5b5ba58bce..a2fabd96f78b 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -481,14 +481,14 @@ if(CMAKE_COMPILER_IS_GNUCXX) endif() set(LIBRARIES_TO_CHECK Boost GMP MPFR - #VTK + VTK Qt6 Eigen3 OpenGR libpointmatcher LEDA MPFI NTL TBB OpenCV METIS ZLIB Ceres GLPK SCIP OSQP ) - function(check_library lib) + set(QT_NO_CREATE_VERSIONLESS_TARGETS ON) set(CMAKE_FIND_PACKAGE_QUIET TRUE) find_package(${lib} QUIET) set(CMAKE_FIND_PACKAGE_QUIET FALSE) @@ -521,10 +521,6 @@ endfunction() foreach(lib IN LISTS LIBRARIES_TO_CHECK) check_library(${lib}) endforeach() -#find_package(VTK REQUIRED) -#if(VTK_FOUND) -# message(STATUS "Third-party library VTK ${VTK_VERSION}") -#endif() message("== Generate version files (DONE) ==\n") #-------------------------------------------------------------------------------------------------- # From 261629356370d3735756501e81c609a355e458d7 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 12 Jul 2024 11:59:07 +0200 Subject: [PATCH 054/348] Rename lib to cgal_3rdparty_lib Because FindVTK redefines `lib` to something else! --- Installation/CMakeLists.txt | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index a2fabd96f78b..0cf557baa9bb 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -487,39 +487,39 @@ set(LIBRARIES_TO_CHECK NTL TBB OpenCV METIS ZLIB Ceres GLPK SCIP OSQP ) -function(check_library lib) +function(check_library cgal_3rdparty_lib) set(QT_NO_CREATE_VERSIONLESS_TARGETS ON) set(CMAKE_FIND_PACKAGE_QUIET TRUE) - find_package(${lib} QUIET) + find_package(${cgal_3rdparty_lib} QUIET) set(CMAKE_FIND_PACKAGE_QUIET FALSE) - if(${lib}_FOUND) + if(${cgal_3rdparty_lib}_FOUND) set(version_var "") - if(${lib} STREQUAL "Eigen3") + if(${cgal_3rdparty_lib} STREQUAL "Eigen3") set(version_var ${EIGEN3_VERSION}) - elseif(${lib} STREQUAL "GMP") + elseif(${cgal_3rdparty_lib} STREQUAL "GMP") set(version_var ${GMP_VERSION}) - elseif(${lib} STREQUAL "MPFR") + elseif(${cgal_3rdparty_lib} STREQUAL "MPFR") set(version_var ${MPFR_VERSION}) - elseif(${lib} STREQUAL "METIS") + elseif(${cgal_3rdparty_lib} STREQUAL "METIS") set(version_var ${METIS_VERSION}) - elseif(DEFINED ${lib}_VERSION) - set(version_var ${${lib}_VERSION}) - elseif(DEFINED ${lib}_VERSION_STRING) - set(version_var ${${lib}_VERSION_STRING}) + elseif(DEFINED ${cgal_3rdparty_lib}_VERSION) + set(version_var ${${cgal_3rdparty_lib}_VERSION}) + elseif(DEFINED ${cgal_3rdparty_lib}_VERSION_STRING) + set(version_var ${${cgal_3rdparty_lib}_VERSION_STRING}) endif() if(version_var) - message(STATUS "Third-party library ${lib} ${version_var}") + message(STATUS "Third-party library ${cgal_3rdparty_lib} ${version_var}") else() - message(STATUS "Third-party library ${lib} found") + message(STATUS "Third-party library ${cgal_3rdparty_lib} found") endif() else() - message(STATUS "Third-party library ${lib} not found") + message(STATUS "Third-party library ${cgal_3rdparty_lib} not found") endif() endfunction() -foreach(lib IN LISTS LIBRARIES_TO_CHECK) - check_library(${lib}) +foreach(cgal_3rdparty_lib IN LISTS LIBRARIES_TO_CHECK) + check_library(${cgal_3rdparty_lib}) endforeach() message("== Generate version files (DONE) ==\n") #-------------------------------------------------------------------------------------------------- From e3fd9ed25f08c4c75a0b10fa4a83acb0bef79282 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Fri, 12 Jul 2024 16:30:55 +0200 Subject: [PATCH 055/348] Update library version checking logic for MPFR and METIS --- Installation/CMakeLists.txt | 43 +++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index 0cf557baa9bb..efd9b012625b 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -487,6 +487,7 @@ set(LIBRARIES_TO_CHECK NTL TBB OpenCV METIS ZLIB Ceres GLPK SCIP OSQP ) + function(check_library cgal_3rdparty_lib) set(QT_NO_CREATE_VERSIONLESS_TARGETS ON) set(CMAKE_FIND_PACKAGE_QUIET TRUE) @@ -498,10 +499,44 @@ function(check_library cgal_3rdparty_lib) set(version_var ${EIGEN3_VERSION}) elseif(${cgal_3rdparty_lib} STREQUAL "GMP") set(version_var ${GMP_VERSION}) - elseif(${cgal_3rdparty_lib} STREQUAL "MPFR") - set(version_var ${MPFR_VERSION}) - elseif(${cgal_3rdparty_lib} STREQUAL "METIS") - set(version_var ${METIS_VERSION}) + elseif(${cgal_3rdparty_lib} STREQUAL "MPFR" OR ${cgal_3rdparty_lib} STREQUAL "METIS") + set(header_name "") + set(version_macros "") + if(${cgal_3rdparty_lib} STREQUAL "MPFR") + set(header_name "mpfr.h") + set(version_macros "MPFR_VERSION_MAJOR;MPFR_VERSION_MINOR;MPFR_VERSION_PATCHLEVEL") + elseif(${cgal_3rdparty_lib} STREQUAL "METIS") + set(header_name "metis.h") + set(version_macros "METIS_VER_MAJOR;METIS_VER_MINOR;METIS_VER_SUBMINOR") + endif() + + find_path(INCLUDE_DIR + NAMES ${header_name} + PATHS ${${cgal_3rdparty_lib}_INCLUDE_DIRS} + PATH_SUFFIXES ${cgal_3rdparty_lib} + ) + + if(INCLUDE_DIR) + set(HEADER_PATH "${INCLUDE_DIR}/${header_name}") + + if(EXISTS ${HEADER_PATH}) + file(READ ${HEADER_PATH} HEADER_CONTENT) + + list(GET version_macros 0 major_macro) + list(GET version_macros 1 minor_macro) + list(GET version_macros 2 patchlevel_macro) + + string(REGEX MATCH "#define[ \t]+${major_macro}[ \t]+([0-9]+)" _major_match ${HEADER_CONTENT}) + string(REGEX MATCH "#define[ \t]+${minor_macro}[ \t]+([0-9]+)" _minor_match ${HEADER_CONTENT}) + string(REGEX MATCH "#define[ \t]+${patchlevel_macro}[ \t]+([0-9]+)" _patchlevel_match ${HEADER_CONTENT}) + + string(REGEX REPLACE ".*#define[ \t]+${major_macro}[ \t]+([0-9]+).*" "\\1" VERSION_MAJOR ${_major_match}) + string(REGEX REPLACE ".*#define[ \t]+${minor_macro}[ \t]+([0-9]+).*" "\\1" VERSION_MINOR ${_minor_match}) + string(REGEX REPLACE ".*#define[ \t]+${patchlevel_macro}[ \t]+([0-9]+).*" "\\1" VERSION_PATCHLEVEL ${_patchlevel_match}) + + set(version_var "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCHLEVEL}") + endif() + endif() elseif(DEFINED ${cgal_3rdparty_lib}_VERSION) set(version_var ${${cgal_3rdparty_lib}_VERSION}) elseif(DEFINED ${cgal_3rdparty_lib}_VERSION_STRING) From 00cc6ce69445cf12409333fa8378ca035be4b06f Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Tue, 16 Jul 2024 16:00:46 +0200 Subject: [PATCH 056/348] Update GMP and GLPK version checks in CMakeLists.txt --- Installation/CMakeLists.txt | 56 ++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index efd9b012625b..31753bc1133e 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -480,9 +480,7 @@ if(CMAKE_COMPILER_IS_GNUCXX) endif() set(LIBRARIES_TO_CHECK - Boost GMP MPFR - VTK - Qt6 + Boost GMP MPFR VTK Qt6 Eigen3 OpenGR libpointmatcher LEDA MPFI NTL TBB OpenCV METIS ZLIB Ceres GLPK SCIP OSQP @@ -498,7 +496,57 @@ function(check_library cgal_3rdparty_lib) if(${cgal_3rdparty_lib} STREQUAL "Eigen3") set(version_var ${EIGEN3_VERSION}) elseif(${cgal_3rdparty_lib} STREQUAL "GMP") - set(version_var ${GMP_VERSION}) + set(GMP_HEADER_PATH "${GMP_INCLUDE_DIR}/gmp.h") + file(READ "${GMP_HEADER_PATH}" GMP_HEADER_CONTENT) + string(REGEX MATCHALL "#include[ \t]+\"([^\"]+)\"" INCLUDED_HEADERS "${GMP_HEADER_CONTENT}") + set(GMP_VERSION_MAJOR "") + set(GMP_VERSION_MINOR "") + set(GMP_VERSION_PATCH "") + foreach(INCLUDED_HEADER ${INCLUDED_HEADERS}) + string(REGEX REPLACE "#include[ \t]+\"([^\"]+)\"" "\\1" GMP_ARCH_HEADER "${INCLUDED_HEADER}") + set(GMP_ARCH_HEADER_PATH "${GMP_INCLUDE_DIR}/${GMP_ARCH_HEADER}") + if(EXISTS "${GMP_ARCH_HEADER_PATH}") + file(READ "${GMP_ARCH_HEADER_PATH}" GMP_ARCH_HEADER_CONTENT) + string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION[ \t]+[0-9]+" GMP_VERSION_MAJOR_LINE "${GMP_ARCH_HEADER_CONTENT}") + string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION_MINOR[ \t]+[0-9]+" GMP_VERSION_MINOR_LINE "${GMP_ARCH_HEADER_CONTENT}") + string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION_PATCHLEVEL[ \t]+[0-9]+" GMP_VERSION_PATCH_LINE "${GMP_ARCH_HEADER_CONTENT}") + if(GMP_VERSION_MAJOR_LINE) + string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_MAJOR "${GMP_VERSION_MAJOR_LINE}") + endif() + if(GMP_VERSION_MINOR_LINE) + string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_MINOR "${GMP_VERSION_MINOR_LINE}") + endif() + if(GMP_VERSION_PATCH_LINE) + string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_PATCH "${GMP_VERSION_PATCH_LINE}") + endif() + if(GMP_VERSION_MAJOR AND GMP_VERSION_MINOR AND GMP_VERSION_PATCH) + set(GMP_VERSION "${GMP_VERSION_MAJOR}.${GMP_VERSION_MINOR}.${GMP_VERSION_PATCH}") + break() + endif() + endif() + endforeach() + if(GMP_VERSION) + set(version_var ${GMP_VERSION}) + endif() + elseif(${cgal_3rdparty_lib} STREQUAL "GLPK") + set(GLPK_HEADER_PATH "${GLPK_INCLUDE_DIR}/glpk.h") + if(EXISTS "${GLPK_HEADER_PATH}") + file(READ "${GLPK_HEADER_PATH}" GLPK_HEADER_CONTENT) + string(REGEX MATCH "#define[ \t]+GLP_MAJOR_VERSION[ \t]+[0-9]+" GLPK_VERSION_MAJOR_LINE "${GLPK_HEADER_CONTENT}") + string(REGEX MATCH "#define[ \t]+GLP_MINOR_VERSION[ \t]+[0-9]+" GLPK_VERSION_MINOR_LINE "${GLPK_HEADER_CONTENT}") + set(GLPK_VERSION_MAJOR "") + set(GLPK_VERSION_MINOR "") + if(GLPK_VERSION_MAJOR_LINE) + string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GLPK_VERSION_MAJOR "${GLPK_VERSION_MAJOR_LINE}") + endif() + if(GLPK_VERSION_MINOR_LINE) + string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GLPK_VERSION_MINOR "${GLPK_VERSION_MINOR_LINE}") + endif() + if(NOT GLPK_VERSION_MAJOR STREQUAL "" AND NOT GLPK_VERSION_MINOR STREQUAL "") + set(GLPK_VERSION "${GLPK_VERSION_MAJOR}.${GLPK_VERSION_MINOR}") + set(version_var ${GLPK_VERSION}) + endif() + endif() elseif(${cgal_3rdparty_lib} STREQUAL "MPFR" OR ${cgal_3rdparty_lib} STREQUAL "METIS") set(header_name "") set(version_macros "") From 26bab26adf0827d917458aa424bfa727a8432aec Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Thu, 18 Jul 2024 10:19:03 +0200 Subject: [PATCH 057/348] Improve regex pattern for third-party library detection --- Maintenance/test_handling/to_zipped_format | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maintenance/test_handling/to_zipped_format b/Maintenance/test_handling/to_zipped_format index b46fe121837c..6327afb83932 100755 --- a/Maintenance/test_handling/to_zipped_format +++ b/Maintenance/test_handling/to_zipped_format @@ -132,7 +132,7 @@ sub reformat_results($) # print PLATFORM_NEW_RESULTS $_; # last; # } - if (/^-- Third-party library ([\w\.]+ [\w\.\_\-]*)/) { + if (/^-- Third-party library (.+)$/) { $TPL = "$TPL $1,"; } NEXT: if(! ($_= )) { From 47b5f73a9617712972be972dbc2901f2738abf2e Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 23 Jul 2024 10:18:27 +0200 Subject: [PATCH 058/348] document example weighted image + feature detection --- Mesh_3/doc/Mesh_3/examples.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Mesh_3/doc/Mesh_3/examples.txt b/Mesh_3/doc/Mesh_3/examples.txt index 7f9cb5dc94fd..4b853a9847b0 100644 --- a/Mesh_3/doc/Mesh_3/examples.txt +++ b/Mesh_3/doc/Mesh_3/examples.txt @@ -7,6 +7,7 @@ \example Mesh_3/mesh_3D_image_with_detection_of_features.cpp \example Mesh_3/mesh_3D_image_with_input_features.cpp \example Mesh_3/mesh_3D_weighted_image.cpp +\example Mesh_3/mesh_3D_weighted_image_with_detection_of_features.cpp \example Mesh_3/random_labeled_image.h \example CGAL/Mesh_3/initialize_triangulation_from_gray_image.h \example CGAL/Mesh_3/initialize_triangulation_from_labeled_image.h From a93f78d8ada20c14b718e0b442604a85b0e9f748 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 23 Jul 2024 10:18:40 +0200 Subject: [PATCH 059/348] remove debug macros --- .../mesh_3D_weighted_image_with_detection_of_features.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/Mesh_3/examples/Mesh_3/mesh_3D_weighted_image_with_detection_of_features.cpp b/Mesh_3/examples/Mesh_3/mesh_3D_weighted_image_with_detection_of_features.cpp index e9f8d339ab92..fb27688f919a 100644 --- a/Mesh_3/examples/Mesh_3/mesh_3D_weighted_image_with_detection_of_features.cpp +++ b/Mesh_3/examples/Mesh_3/mesh_3D_weighted_image_with_detection_of_features.cpp @@ -1,6 +1,3 @@ -#define CGAL_MESH_3_WEIGHTED_IMAGES_DEBUG -#define CGAL_MESH_3_VERBOSE 1 - #include #include From 5771547e364e24e500dfb0e9e1efef80c0ac9179 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 23 Jul 2024 10:56:46 +0200 Subject: [PATCH 060/348] replace typedef's by using's --- ...h_3D_weighted_image_with_detection_of_features.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Mesh_3/examples/Mesh_3/mesh_3D_weighted_image_with_detection_of_features.cpp b/Mesh_3/examples/Mesh_3/mesh_3D_weighted_image_with_detection_of_features.cpp index fb27688f919a..9d9033a69095 100644 --- a/Mesh_3/examples/Mesh_3/mesh_3D_weighted_image_with_detection_of_features.cpp +++ b/Mesh_3/examples/Mesh_3/mesh_3D_weighted_image_with_detection_of_features.cpp @@ -20,18 +20,17 @@ using Mesh_domain = CGAL::Mesh_domain_with_polyline_features_3; /// [Domain definition] #ifdef CGAL_CONCURRENT_MESH_3 -typedef CGAL::Parallel_tag Concurrency_tag; +using Concurrency_tag = CGAL::Parallel_tag; #else -typedef CGAL::Sequential_tag Concurrency_tag; +using Concurrency_tag = CGAL::Sequential_tag; #endif // Triangulation -typedef CGAL::Mesh_triangulation_3::type Tr; - -typedef CGAL::Mesh_complex_3_in_triangulation_3
C3t3; +using Tr = CGAL::Mesh_triangulation_3::type; +using C3t3 = CGAL::Mesh_complex_3_in_triangulation_3; // Criteria -typedef CGAL::Mesh_criteria_3 Mesh_criteria; +using Mesh_criteria = CGAL::Mesh_criteria_3; // To avoid verbose function and named parameters call using namespace CGAL::parameters; From 76de0f3f8cbfc0263c02b234a002d1f05bb483c8 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 25 Jul 2024 12:18:39 +0200 Subject: [PATCH 061/348] this assertion is invalid it would break for example when the function takes a far vertex, inserted by parallel version of Mesh_3 --- .../include/CGAL/Adaptive_remeshing_sizing_field.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Tetrahedral_remeshing/include/CGAL/Adaptive_remeshing_sizing_field.h b/Tetrahedral_remeshing/include/CGAL/Adaptive_remeshing_sizing_field.h index c651f9b26199..62f97115f82b 100644 --- a/Tetrahedral_remeshing/include/CGAL/Adaptive_remeshing_sizing_field.h +++ b/Tetrahedral_remeshing/include/CGAL/Adaptive_remeshing_sizing_field.h @@ -497,7 +497,6 @@ average_edge_length_around(const Vertex_handle v, const Tr& tr, break; } - CGAL_assertion(!edges.empty()); if (edges.empty()) return 0; From 565d5413b0c8f4f258ea417dffd09ff9c767dc57 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 5 Aug 2024 15:51:05 +0200 Subject: [PATCH 062/348] Restructure third party libraries in a table format --- Installation/CMakeLists.txt | 3 +- Maintenance/test_handling/Summary_Script.js | 21 ++++++++++++-- Maintenance/test_handling/testresult.css | 32 +++++++++++++++++++++ TDS_3/test/TDS_3/CMakeLists.txt | 2 +- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index 31753bc1133e..3fcf60bf4d41 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -482,8 +482,7 @@ endif() set(LIBRARIES_TO_CHECK Boost GMP MPFR VTK Qt6 Eigen3 OpenGR libpointmatcher LEDA MPFI - NTL TBB OpenCV METIS ZLIB - Ceres GLPK SCIP OSQP + TBB OpenCV METIS ZLIB GLPK SCIP ) function(check_library cgal_3rdparty_lib) diff --git a/Maintenance/test_handling/Summary_Script.js b/Maintenance/test_handling/Summary_Script.js index 67d49d752159..a16f4861f60d 100644 --- a/Maintenance/test_handling/Summary_Script.js +++ b/Maintenance/test_handling/Summary_Script.js @@ -167,12 +167,29 @@ function packageContainer(platforms) { } } - function platformContainer(platforms) { platforms.forEach(platform => { const $container = $('
', { class: 'platform ' + platform.name }).appendTo($platformContainer); $container.html("

Results of " + platform.name + "

"); - $('

', { class: 'tplinfo', html: platform.third_party_libraries }).appendTo($container); + + // Parse third_party_libraries and structure them in a table format + const tplString = platform.third_party_libraries.replace("TPL: ", "").trim(); + const tplArray = tplString.split(",").map(tpl => tpl.trim()).filter(tpl => tpl.length > 0); + + const $tplTable = $('

OS and compilerPlatform NameCompilerOperating System Tester y t$compiler$operating_system$tester_name$county$countt
', { class: 'tpl-table' }).appendTo($container); + const $thead = $('').appendTo($tplTable); + const $tbody = $('').appendTo($tplTable); + + $('').append('').appendTo($thead); + + let $row = $('').appendTo($tbody); + tplArray.forEach((tpl, index) => { + if (index > 0 && index % 5 === 0) { + $row = $('').appendTo($tbody); + } + $('\n\n"; - print OUTPUT "\n"; # Compiler - print OUTPUT "\n"; # Operating System - print OUTPUT "\n"; - print OUTPUT "\n"; - print OUTPUT "\n"; - print OUTPUT "\n"; - print OUTPUT "\n"; - print OUTPUT "\n"; - print OUTPUT "\n"; - print OUTPUT "\n"; - $index = 8; - while ($index) { - $index--; - $_ = $tmp[$index]; + $_ = ; # OPERATING_SYSTEM + chomp; + my $operating_system = $_; + $_ = ; # TESTER_NAME + chomp; + my $tester_name = $_; + $_ = ; # TESTER_ADDRESS + chomp; + my $tester_address = $_; + + my $county = $testresults[$platform_num]->{"y"}; + my $countt = $testresults[$platform_num]->{"t"}; + my $countw = $testresults[$platform_num]->{"w"}; + my $counto = $testresults[$platform_num]->{"o"}; + my $countn = $testresults[$platform_num]->{"n"}; + my $countr = $testresults[$platform_num]->{"r"}; + + my $index = 8; + my @tmp; + while ($index) { + $index--; + $_ = ; + chomp; + $tmp[$index] = $_; + } + ($platform_is_optimized{$pf}) = ($tmp[1] =~ m|([-/]x?O[1-9])|); + $_ = ; + chomp; + my $build_type = $platform_is_optimized{$pf} ? " - " : "YES"; + print OUTPUT "\n"; + print OUTPUT "\n"; # Compiler + print OUTPUT "\n"; # Operating System + print OUTPUT "\n"; + print OUTPUT "\n"; + print OUTPUT "\n"; + print OUTPUT "\n"; + print OUTPUT "\n"; + print OUTPUT "\n"; + print OUTPUT "\n"; + print OUTPUT "\n"; + $index = 8; + while ($index) { + $index--; + $_ = $tmp[$index]; if($index > 2) { print OUTPUT "\n"; } else { print OUTPUT "\n"; } - } - } else { + } + } else { print OUTPUT ">$pf_short"; - my $index = 12; - while ($index) { + my $index = 12; + while ($index) { $index--; - print OUTPUT "\n"; - } - } - ++$platform_num; + print OUTPUT "\n"; + } + } + ++$platform_num; } print OUTPUT "
Third Party Libraries
').text(tpl).appendTo($row); + }); + const letters = ['n', 'w', 'o', 'r']; letters.forEach(letter => { const $letterContainer = $('
', { class: 'letter_container ' + letter }).appendTo($container); diff --git a/Maintenance/test_handling/testresult.css b/Maintenance/test_handling/testresult.css index 94a1c213a850..faece0618c68 100644 --- a/Maintenance/test_handling/testresult.css +++ b/Maintenance/test_handling/testresult.css @@ -115,4 +115,36 @@ TABLE.result TD > a.package_name { .platform-link { margin-right: 10px; +} + +/* Summary Page */ + +.tpl-table { + width: auto; + border-collapse: collapse; + margin-top: 10px; + table-layout: fixed; +} + +.tpl-table th, .tpl-table td { + border: 1px solid #e0e0e0; /* Couleur légèrement différente */ + padding: 4px 8px; + text-align: left; + white-space: nowrap; +} + +.tpl-table tr:nth-child(even) { + background-color: #fafafa; +} + +.tpl-table tr:hover { + background-color: #f5f5f5; +} + +.tpl-table th { + padding-top: 8px; + padding-bottom: 8px; + background-color: #f7f7f7; + color: #333; + font-weight: normal; } \ No newline at end of file diff --git a/TDS_3/test/TDS_3/CMakeLists.txt b/TDS_3/test/TDS_3/CMakeLists.txt index f35a84763a5b..a80cd824ea39 100644 --- a/TDS_3/test/TDS_3/CMakeLists.txt +++ b/TDS_3/test/TDS_3/CMakeLists.txt @@ -12,6 +12,6 @@ create_single_source_cgal_program("test_triangulation_tds_3.cpp") create_single_source_cgal_program("test_io_tds3.cpp") if(TARGET CGAL::TBB_support) - message(STATUS "Third-parties libraries TBB ${TBB_VERSION}") + message(STATUS "Found TBB") target_link_libraries(test_triangulation_tds_3 PUBLIC CGAL::TBB_support) endif() From 3c56db979de6e9f0dcd33f1bc842232f16ea0b03 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 5 Aug 2024 15:59:53 +0200 Subject: [PATCH 063/348] Improve third party libraries display toggle functionality --- Maintenance/test_handling/Summary_Script.js | 14 ++++++---- Maintenance/test_handling/testresult.css | 29 +++++++++++++++------ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/Maintenance/test_handling/Summary_Script.js b/Maintenance/test_handling/Summary_Script.js index a16f4861f60d..4c28e55f1092 100644 --- a/Maintenance/test_handling/Summary_Script.js +++ b/Maintenance/test_handling/Summary_Script.js @@ -170,13 +170,17 @@ function packageContainer(platforms) { function platformContainer(platforms) { platforms.forEach(platform => { const $container = $('
', { class: 'platform ' + platform.name }).appendTo($platformContainer); - $container.html("

Results of " + platform.name + "

"); - - // Parse third_party_libraries and structure them in a table format + $container.html(`

Results of ${platform.name}

`); const tplString = platform.third_party_libraries.replace("TPL: ", "").trim(); const tplArray = tplString.split(",").map(tpl => tpl.trim()).filter(tpl => tpl.length > 0); - - const $tplTable = $('', { class: 'tpl-table' }).appendTo($container); + const $toggleButton = $('
', { class: 'tpl-table', css: { display: 'none' } }).appendTo($container); const $thead = $('').appendTo($tplTable); const $tbody = $('').appendTo($tplTable); diff --git a/Maintenance/test_handling/testresult.css b/Maintenance/test_handling/testresult.css index faece0618c68..718cdfe21cb5 100644 --- a/Maintenance/test_handling/testresult.css +++ b/Maintenance/test_handling/testresult.css @@ -124,27 +124,40 @@ TABLE.result TD > a.package_name { border-collapse: collapse; margin-top: 10px; table-layout: fixed; + border: 1px solid #ccc; } .tpl-table th, .tpl-table td { - border: 1px solid #e0e0e0; /* Couleur légèrement différente */ - padding: 4px 8px; + border: 1px solid #ddd; + padding: 6px 12px; text-align: left; white-space: nowrap; } .tpl-table tr:nth-child(even) { - background-color: #fafafa; -} - -.tpl-table tr:hover { - background-color: #f5f5f5; + background-color: #a6a6a6; } .tpl-table th { padding-top: 8px; padding-bottom: 8px; - background-color: #f7f7f7; + background-color: #a6a6a6; color: #333; font-weight: normal; +} + +.tpl-toggle-button { + display: inline-block; + margin-bottom: 10px; + padding: 6px 12px; + font-size: 14px; + color: #333; + background-color: #f0f0f0; + border: 1px solid #ccc; + cursor: pointer; + text-align: center; +} + +.tpl-toggle-button:hover { + background-color: #e0e0e0; } \ No newline at end of file From ff89ba08adfb37604df0f9cebbe52f9875d8c37b Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 6 Aug 2024 08:06:41 +0100 Subject: [PATCH 064/348] Deal with duplicate lines --- .../include/CGAL/Periodic_3_regular_triangulation_3.h | 2 +- .../include/CGAL/Triangulation_2/insert_constraints.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_regular_triangulation_3.h b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_regular_triangulation_3.h index 63fb94044699..4dba83f38470 100644 --- a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_regular_triangulation_3.h +++ b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_regular_triangulation_3.h @@ -931,7 +931,7 @@ class Periodic_3_regular_triangulation_3 CGAL_assertion(this->int_to_off(offsets[i])[0] == 0 || this->int_to_off(offsets[i])[0] == 1); CGAL_assertion(this->int_to_off(offsets[i])[1] == 0 || this->int_to_off(offsets[i])[1] == 1); - CGAL_assertion(this->int_to_off(offsets[i])[1] == 0 || this->int_to_off(offsets[i])[1] == 1); + CGAL_assertion(this->int_to_off(offsets[i])[2] == 0 || this->int_to_off(offsets[i])[2] == 1); } c->set_offsets(offsets[0], offsets[1], offsets[2], offsets[3]); diff --git a/Triangulation_2/include/CGAL/Triangulation_2/insert_constraints.h b/Triangulation_2/include/CGAL/Triangulation_2/insert_constraints.h index dc08e642db73..9fbd223ac259 100644 --- a/Triangulation_2/include/CGAL/Triangulation_2/insert_constraints.h +++ b/Triangulation_2/include/CGAL/Triangulation_2/insert_constraints.h @@ -84,7 +84,6 @@ namespace CGAL { ConstraintIterator first, ConstraintIterator beyond) { - typedef typename T::Point Point; typedef typename T::Point Point; std::vector points; for (ConstraintIterator s_it=first; s_it!=beyond; ++s_it) From 37eb0eaa173499227e109cb1cf46cdb08d0dd273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Tue, 6 Aug 2024 10:33:14 +0200 Subject: [PATCH 065/348] Tentative fix for L3R3 do_intersect --- .../Intersections_3/internal/Line_3_Ray_3_do_intersect.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Line_3_Ray_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Line_3_Ray_3_do_intersect.h index e6e125107f0a..4659dda8c452 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Line_3_Ray_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Line_3_Ray_3_do_intersect.h @@ -38,11 +38,8 @@ do_intersect(const typename K::Line_3& l, if(p0p1s == COLLINEAR) return true; - CGAL::Orientation stp0 = pred(r.source(), r.second_point(), l.point(0)); - if(stp0 == COLLINEAR) - return Ray_3_has_on_collinear_Point_3(r,l.point(0),k); - - return (p0p1s != stp0); + typename K::Point_3 lst = l.point(0) + (r.point(1) - r.point(0)); + return (pred(l.point(0), l.point(1), r.point(0), lst) != CGAL::POSITIVE); } template From c1e5926e707bebe5e17da489ba2e9f757ddee57a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Tue, 6 Aug 2024 10:26:10 +0200 Subject: [PATCH 066/348] Add new Intersection_3 test cases --- .../Intersections_3/test_intersections_Line_3.cpp | 4 ++++ .../Intersections_3/test_intersections_Ray_3.cpp | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/Intersections_3/test/Intersections_3/test_intersections_Line_3.cpp b/Intersections_3/test/Intersections_3/test_intersections_Line_3.cpp index 6fe55a406546..936e077e018e 100644 --- a/Intersections_3/test/Intersections_3/test_intersections_Line_3.cpp +++ b/Intersections_3/test/Intersections_3/test_intersections_Line_3.cpp @@ -232,6 +232,10 @@ struct Line_3_intersection_tester check_no_intersection(L(p(0,0,0),p(1,0,0)), R(p(3,0,1),p(6,0,1))); check_no_intersection(L(p(0,0,0),p(1,0,0)), R(p(0,2,0),p(0,4,0))); check_no_intersection(L(p(0,0,0),p(1,0,0)), R(p(6,2,0),p(5,4,0))); + check_no_intersection(L(p(0,0,0),p(0,1,0)), R(p(1,-1,0),p(1,0,0))); + check_no_intersection(L(p(0,-10,0),p(0,-9,0)), R(p(1,-1,0),p(2,0,0))); + check_no_intersection(L(p(0,-10,0),p(0,0,0)), R(p(1,-1,0),p(2,0,0))); + check_no_intersection(L(p(0,0,0),p(0,1,0)), R(p(1,-1,0),p(2,0,0))); // Point intersection check_intersection (L(p(0,0,0),p(1,0,0)), R(p(3,0,0),p(6,4,0)), diff --git a/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp b/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp index e1d603d4a5e7..777c514bd493 100644 --- a/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp +++ b/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp @@ -74,6 +74,14 @@ struct Ray_3_intersection_tester check_no_intersection (R(p(0,0,0), p(1,0,0)), R(p(0,1,0), p(0,2,0))); check_no_intersection (R(p(0,0,0), p(1,0,0)), R(p(-1,0,0), p(-1,-1,0))); + check_no_intersection (R(p(1,-1,0), p(2,0,0)), R(p(2,-1,0), p(3,0,0))); + check_no_intersection (R(p(1,-1,0), p(2,0,0)), R(p(2,-1,0), p(3,-1,0))); + check_no_intersection (R(p(1,-1,0), p(2,0,0)), R(p(2,-1,0), p(3,-2,0))); + check_no_intersection (R(p(0,0,0), p(0,1,0)), R(p(0,-1,0), p(1,-1,0))); + check_no_intersection (R(p(0,0,0), p(0,1,0)), R(p(-1,-3,0),p(2,0,0))); + check_no_intersection (R(p(0,0,0), p(0,1,0)), R(p(-2,-4,0),p(-1,-3,0))); + check_no_intersection (R(p(0,0,0), p(0,1,0)), R(p(1,-1,0), p(2,0,0))); + // Point check_intersection (R(p(0,0,0), p(1,0,0)), R(p(0,0,0), p(-1,0,0)), p(0,0,0)); @@ -88,6 +96,10 @@ struct Ray_3_intersection_tester check_intersection (R(p(0,0,0), p(1,0,0)), R(p(1,-2,0), p(1,-1,0)), p(1,0,0)); + check_intersection (R(p(0,0,0), p(1,0,0)), R(p(1,-2,0), p(1,-1,0)), + p(1,0,0)); + + // Segment check_intersection (R(p(0,0,0), p(1,0,0)), R(p(2,0,0), p(-3,0,0)), S(p(0,0,0), p(2,0,0)), false); From bf10f945a96208e487c438eb742bb476239d60fa Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Wed, 7 Aug 2024 10:00:59 +0200 Subject: [PATCH 067/348] Remove deprecated Qt version checks and unused code --- .../CurveInputMethods.cpp | 13 ---------- GraphicsView/include/CGAL/Qt/qglviewer.h | 9 ------- GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 24 ------------------- Lab/demo/Lab/CGAL_Lab.cpp | 5 ---- Lab/demo/Lab/MainWindow.cpp | 9 ------- 5 files changed, 60 deletions(-) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp index 91a64dad22e9..82e7958b2ab7 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp @@ -109,15 +109,6 @@ void CurveInputMethod::beginInput_() for (auto& item : items) this->getScene()->addItem(item); } -static inline void clearPainterPath(QPainterPath& ppath) -{ -#if (QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)) - ppath.clear(); -#else - ppath = {}; -#endif -} - void CurveInputMethod::reset() { this->resetInput(); @@ -193,7 +184,6 @@ PolylineInputMethod::PolylineInputMethod() : void PolylineInputMethod::beginInput() { - clearPainterPath(this->painterPath); this->polylineGuide.setPath(this->painterPath); this->lastLine.setLine(0, 0, 0, 0); QPen pen = this->polylineGuide.pen(); @@ -356,8 +346,6 @@ BezierInputMethod::BezierInputMethod() : CurveInputMethod(CurveType::Bezier, -1) void BezierInputMethod::beginInput() { - clearPainterPath(this->painterOldPath); - clearPainterPath(this->painterPath); this->bezierGuide.setPath(this->painterPath); this->bezierOldGuide.setPath(this->painterOldPath); @@ -407,7 +395,6 @@ static void updateBezierPainterPath( const std::vector& controlPoints, std::vector& cache, const QTransform& worldTransform, QPainterPath& painterPath) { - clearPainterPath(painterPath); if (controlPoints.size() < 2) return; float pixel_len = approx_pixel_length(controlPoints, worldTransform); diff --git a/GraphicsView/include/CGAL/Qt/qglviewer.h b/GraphicsView/include/CGAL/Qt/qglviewer.h index 8ee3b4135f29..5c0726d5344c 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer.h @@ -478,15 +478,6 @@ public Q_SLOTS: qreal bufferTextureMaxU() const { return bufferTextureMaxU_; } /*! Same as bufferTextureMaxU(), but for the v texture coordinate. */ qreal bufferTextureMaxV() const { return bufferTextureMaxV_; } -#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)) - // These methods are part of the QGLWidget public API. - // As of version 2.7.0, the use of QOpenGLWidget instead means that they have - // to be provided for backward compatibility. - void renderText(int x, int y, const QString &str, - const QFont &font = QFont()); - void renderText(double x, double y, double z, const QString &str, - const QFont &font = QFont()); -#endif public Q_SLOTS: void copyBufferToTexture(GLint, GLenum = GL_NONE); diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index 7387b1f48745..dc25f1d8675e 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -720,30 +720,6 @@ CGAL_INLINE_FUNCTION void CGAL::QGLViewer::drawLight(GLenum, qreal ) const { } -#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)) -CGAL_INLINE_FUNCTION -void CGAL::QGLViewer::renderText(int x, int y, const QString &str, - const QFont &font) { - QColor fontColor = QColor(0, 0, - 0, 255); - - // Render text - QPainter painter(this); - painter.setPen(fontColor); - painter.setFont(font); - painter.drawText(x, y, str); - painter.end(); -} - -CGAL_INLINE_FUNCTION -void CGAL::QGLViewer::renderText(double x, double y, double z, const QString &str, - const QFont &font) { - using CGAL::qglviewer::Vec; - const Vec proj = camera_->projectedCoordinatesOf(Vec(x, y, z)); - renderText(int(proj.x), int(proj.y), str, font); -} -#endif - /*! Draws \p text at position \p x, \p y (expressed in screen coordinates pixels, origin in the upper left corner of the widget). diff --git a/Lab/demo/Lab/CGAL_Lab.cpp b/Lab/demo/Lab/CGAL_Lab.cpp index 6f1504ab668a..d54813edda90 100644 --- a/Lab/demo/Lab/CGAL_Lab.cpp +++ b/Lab/demo/Lab/CGAL_Lab.cpp @@ -27,11 +27,6 @@ int& code_to_call_before_creation_of_QCoreApplication(int& i) { fmt.setOption(QSurfaceFormat::DebugContext); QSurfaceFormat::setDefaultFormat(fmt); - //for windows -#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) - QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL); -#endif - return i; } diff --git a/Lab/demo/Lab/MainWindow.cpp b/Lab/demo/Lab/MainWindow.cpp index 2269b4a28398..7eff95e0b3dd 100644 --- a/Lab/demo/Lab/MainWindow.cpp +++ b/Lab/demo/Lab/MainWindow.cpp @@ -663,15 +663,6 @@ void MainWindow::loadPlugins() } } QString env_path = qgetenv("LAB_DEMO_PLUGINS_PATH"); -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - QChar separator = QDir::listSeparator(); -#else -#if defined(_WIN32) - QChar separator = ';'; -#else - QChar separator = ':'; -#endif -#endif if(!env_path.isEmpty()) { #if defined(_WIN32) QString path = qgetenv("PATH"); From f8de6e72b8a887aa4a429ab5d67441d90f60c8d1 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 8 Aug 2024 15:26:59 +0200 Subject: [PATCH 068/348] take min_size into account inside Mesh_edge_criteria_3 --- Mesh_3/include/CGAL/Mesh_edge_criteria_3.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h b/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h index 8d6215cd512f..f743eb3f0fa3 100644 --- a/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h @@ -177,7 +177,13 @@ class Mesh_edge_criteria_3 /// Returns size of tuple (p,dim,index) FT sizing_field(const Point_3& p, const int dim, const Index& index) const - { return (*p_size_)(p,dim,index); } + { + const FT s = (*p_size_)(p, dim, index); + if (min_length_bound_ == FT(0)) + return s; + else + return (std::max)(s, min_length_bound_); + } FT distance_field(const Point_3& p, const int dim, const Index& index) const { From 0bc365889363ae47988a1b89113909b2fe34c34f Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 8 Aug 2024 15:28:09 +0200 Subject: [PATCH 069/348] use the 5 parameters version to avoid re-calling locate(p) and locate(q) --- Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 61eb0682d831..ddb1ba1109f6 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -252,8 +252,8 @@ class Polyline : (- negative_distance); } else { return (pit <= qit) - ? curve_segment_length(p, q, CGAL::POSITIVE) - : ( - curve_segment_length(p, q, CGAL::NEGATIVE) ); + ? curve_segment_length(p, q, CGAL::POSITIVE, pit, qit) + : ( - curve_segment_length(p, q, CGAL::NEGATIVE, pit, qit) ); } } From 4d38aa566ecba7e5bb164e7c1af7b61a10649994 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 8 Aug 2024 17:30:22 +0200 Subject: [PATCH 070/348] improve Mesh_3 log in demo --- Lab/demo/Lab/Plugins/Mesh_3/Mesh_function.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Lab/demo/Lab/Plugins/Mesh_3/Mesh_function.h b/Lab/demo/Lab/Plugins/Mesh_3/Mesh_function.h index 68c8300f9eea..ec38a369ea01 100644 --- a/Lab/demo/Lab/Plugins/Mesh_3/Mesh_function.h +++ b/Lab/demo/Lab/Plugins/Mesh_3/Mesh_function.h @@ -171,8 +171,10 @@ log() const .arg(detect_connected_components); res << QString("use weights: %1").arg(weights_ptr != nullptr); } - res << QString("use aabb tree: %1").arg(use_sizing_field_with_aabb_tree); - res << QString("manifold: %1").arg(manifold); + if(use_sizing_field_with_aabb_tree) + res << QString("use sizing field with aabb tree: %1").arg(use_sizing_field_with_aabb_tree); + if(manifold) + res << QString("manifold: %1").arg(manifold); return res; } From fa97ae8612db76041bf88bf05e1fca7fccf0b757 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 8 Aug 2024 17:31:14 +0200 Subject: [PATCH 071/348] add missing not-nullptr check --- Lab/demo/Lab/Plugins/Mesh_3/Mesh_3_plugin.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lab/demo/Lab/Plugins/Mesh_3/Mesh_3_plugin.cpp b/Lab/demo/Lab/Plugins/Mesh_3/Mesh_3_plugin.cpp index d84bd9fc6f6a..2aadc7619572 100644 --- a/Lab/demo/Lab/Plugins/Mesh_3/Mesh_3_plugin.cpp +++ b/Lab/demo/Lab/Plugins/Mesh_3/Mesh_3_plugin.cpp @@ -750,7 +750,9 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, } } - if(mesh_type != Mesh_type::SURFACE_ONLY && !material_ids_valid) + if(mesh_type != Mesh_type::SURFACE_ONLY + && !material_ids_valid + && bounding_sm_item != nullptr) { sm_items.removeAll(make_not_null(bounding_sm_item)); } From 0de76f0c82978d96dcc3aa478f161a94a409a1d5 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 9 Aug 2024 12:18:09 +0200 Subject: [PATCH 072/348] updated crontab (automated commit) --- .../infrastructure/cgal.geometryfactory.com/crontab | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/crontab b/Maintenance/infrastructure/cgal.geometryfactory.com/crontab index 758fd180e8e0..cfe168932f70 100644 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/crontab +++ b/Maintenance/infrastructure/cgal.geometryfactory.com/crontab @@ -11,6 +11,8 @@ PATH=/home/lrineau/bin-cmake3:/bin:/usr/bin:/home/lrineau/bin LC_CTYPE=en_US.UTF-8 +DOCKER_HOST=unix:///run/podman/podman.sock +CONTAINER_HOST=unix:///run/podman/podman.sock # Update testsuite result pages 5,15,25,35,45,55 * * * * cd $HOME/CGAL/collect_and_public_testresults; ./treat_result_collection || echo ERROR @@ -71,10 +73,10 @@ LC_CTYPE=en_US.UTF-8 #0 * * * * docker inspect --format='{{json .State.Health.Status}}' cgal-mediawiki-docker_wiki_1 | grep -q '"healthy"' || docker logs cgal-mediawiki-docker_wiki_1 # cgal->cgal2 with git-multimail -*/5 * * * * cd $HOME/Git/cgal-dev-pusher.git && $HOME/bin/git-fetch-and-push-to-multimail cgal-dev cgal-dev-receiver -*/5 * * * * cd $HOME/Git/cgal-pusher.git && $HOME/bin/git-fetch-and-push-to-multimail cgal cgal-receiver -*/5 * * * * cd $HOME/Git/cgal-students-pusher.git && $HOME/bin/git-fetch-and-push-to-multimail cgal-public-dev cgal-students-receiver -*/5 * * * * cd $HOME/Git/cgal-web-pusher.git && $HOME/bin/git-fetch-and-push-to-multimail cgal-web cgal-web-receiver +#*/5 * * * * cd $HOME/Git/cgal-dev-pusher.git && $HOME/bin/git-fetch-and-push-to-multimail cgal-dev cgal-dev-receiver +#*/5 * * * * cd $HOME/Git/cgal-pusher.git && $HOME/bin/git-fetch-and-push-to-multimail cgal cgal-receiver +#*/5 * * * * cd $HOME/Git/cgal-students-pusher.git && $HOME/bin/git-fetch-and-push-to-multimail cgal-public-dev cgal-students-receiver +#*/5 * * * * cd $HOME/Git/cgal-web-pusher.git && $HOME/bin/git-fetch-and-push-to-multimail cgal-web cgal-web-receiver #################################### # Old stuff From 12468ccf4a32eebf5488fd7ceb75a47ac224b1ad Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 9 Aug 2024 11:32:26 +0100 Subject: [PATCH 073/348] Address #8401 --- .../ArrangementDemoTab.h | 1 - .../Arr_geodesic_arc_on_sphere_traits_2.h | 8 ++-- BGL/test/BGL/test_Euler_operations.cpp | 1 - .../CGAL/Boolean_set_operations_2.h | 2 +- Circulator/test/Circulator/test_circ1.cpp | 12 ------ Circulator/test/Circulator/test_circ2.cpp | 10 ----- .../include/CGAL/Combinatorial_map.h | 1 - .../test/Distance_3/test_distance_3.cpp | 8 ++-- .../doc/Generator/CGAL/point_generators_2.h | 1 - .../Intrinsic_Delaunay_triangulation_3.h | 1 - Kernel_23/test/Kernel_23/Dimension.cpp | 1 - ..._corrected_principal_curvatures_plugin.cpp | 1 - .../Lab/Scene_textured_surface_mesh_item.cpp | 2 +- Mesh_2/test/Mesh_2/test_meshing.cpp | 1 - .../test/Number_types/Interval_nt_new.cpp | 2 +- Orthtree/include/CGAL/Orthtree/Traversals.h | 1 - .../demo/Periodic_Lloyd_3/MainWindow.cpp | 6 +-- .../include/CGAL/IO/write_off_points.h | 1 - .../doc/Polygon_mesh_processing/examples.txt | 2 +- Polyhedron/doc/Polyhedron/Polyhedron.txt | 42 +++++++++---------- .../shortest_paths_multiple_sources.cpp | 1 - .../internal/Common.h | 1 - .../Concepts/DelaunayTriangulationTraits_2.h | 1 - 23 files changed, 34 insertions(+), 73 deletions(-) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/ArrangementDemoTab.h b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/ArrangementDemoTab.h index 54ece4964c25..febc992fd59f 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/ArrangementDemoTab.h +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/ArrangementDemoTab.h @@ -38,7 +38,6 @@ namespace Qt { class Callback; class ArrangementGraphicsItemBase; -class ArrangementGraphicsItemBase; class GraphicsViewCurveInputBase; class GraphicsViewNavigation; enum class CurveType; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h index ed552b8c9fc4..65ab748e0eea 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h @@ -641,8 +641,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \param[in] plane the containing plane. * \param[in] source the source-point direction. * \param[in] target the target-point direction. - * \pre Both endpoint lie on the given plane. - * \pre Both endpoint lie on the given plane. + * \pre Both endpoints lie on the given plane. */ X_monotone_curve_2 operator()(const Point_2& source, const Point_2& target, const Direction_3& normal) const @@ -3113,7 +3112,7 @@ class Arr_x_monotone_geodesic_arc_on_sphere_3 { * \param is_directed_right is the arc directed from left to right? * \param is_full is the arc a full circle? * \param is_degenerate is the arc degenerate (single point)? - * \pre Both endpoint lie on the given plane. + * \pre Both endpoints lie on the given plane. */ Arr_x_monotone_geodesic_arc_on_sphere_3 (const Arr_extended_direction_3& src, @@ -3312,8 +3311,7 @@ class Arr_x_monotone_geodesic_arc_on_sphere_3 { * \param plane the containing plane. * \param source the source-point direction. * \param target the target-point direction. - * \pre Both endpoint lie on the given plane. - * \pre Both endpoint lie on the given plane. + * \pre Both endpoints lie on the given plane. */ Arr_x_monotone_geodesic_arc_on_sphere_3 (const Arr_extended_direction_3& source, diff --git a/BGL/test/BGL/test_Euler_operations.cpp b/BGL/test/BGL/test_Euler_operations.cpp index 941758cb1c33..5cbb3697f3a6 100644 --- a/BGL/test/BGL/test_Euler_operations.cpp +++ b/BGL/test/BGL/test_Euler_operations.cpp @@ -17,7 +17,6 @@ test_copy_face_graph_nm_umbrella() T g; Kernel::Point_3 p(0,0,0); - CGAL::make_tetrahedron(p, p, p, p, g); CGAL::make_tetrahedron(p, p, p, p, g); std::vector verts(vertices(g).begin(), vertices(g).end()); diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Boolean_set_operations_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Boolean_set_operations_2.h index 32fbfe7a1292..39faf23e21ab 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Boolean_set_operations_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Boolean_set_operations_2.h @@ -1104,7 +1104,7 @@ do_intersect(const General_polygon_with_holes_2>& p * \param traits a traits object. * \return `true` if `pgn1` and `pgn2` intersect in their interior and `false` * otherwise. - * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. + * * \pre `GpsTraits` must be a model of the concept `GeneralPolygonSetTraits_2`. */ template diff --git a/Circulator/test/Circulator/test_circ1.cpp b/Circulator/test/Circulator/test_circ1.cpp index a3ffa58158f9..9fdf36155dc5 100644 --- a/Circulator/test/Circulator/test_circ1.cpp +++ b/Circulator/test/Circulator/test_circ1.cpp @@ -2380,7 +2380,6 @@ void test_circulator_from_iterator() { assert( ! (i == nullptr)); assert( i != nullptr); assert( i == c); - assert( i == c); // Do I reach myself. ++i; Circulator j = i; @@ -2493,7 +2492,6 @@ void test_circulator_from_iterator() { assert( ! (i == nullptr)); assert( i != nullptr); assert( i == c); - assert( i == c); // Do I reach myself. ++i; Circulator j = i; @@ -2735,7 +2733,6 @@ void test_circulator_from_iterator() { assert( ! (i == nullptr)); assert( i != nullptr); assert( i == c); - assert( i == c); // Do I reach myself. ++i; Circulator j = i; @@ -2897,7 +2894,6 @@ void test_circulator_from_iterator() { assert( ! (i == nullptr)); assert( i != nullptr); assert( i == c); - assert( i == c); // Do I reach myself. ++i; Circulator j = i; @@ -3308,7 +3304,6 @@ void test_circulator_from_iterator() { assert( ! (i == nullptr)); assert( i != nullptr); assert( i == c); - assert( i == c); // Do I reach myself. ++i; Circulator j = i; @@ -3533,7 +3528,6 @@ void test_circulator_from_iterator() { assert( ! (i == nullptr)); assert( i != nullptr); assert( i == c); - assert( i == c); // Do I reach myself. ++i; Circulator j = i; @@ -3742,7 +3736,6 @@ void test_circulator_from_container() { assert( ! (i == nullptr)); assert( i != nullptr); assert( i == c); - assert( i == c); // Do I reach myself. ++i; Circulator j = i; @@ -3855,7 +3848,6 @@ void test_circulator_from_container() { assert( ! (i == nullptr)); assert( i != nullptr); assert( i == c); - assert( i == c); // Do I reach myself. ++i; Circulator j = i; @@ -4097,7 +4089,6 @@ void test_circulator_from_container() { assert( ! (i == nullptr)); assert( i != nullptr); assert( i == c); - assert( i == c); // Do I reach myself. ++i; Circulator j = i; @@ -4260,7 +4251,6 @@ void test_circulator_from_container() { assert( ! (i == nullptr)); assert( i != nullptr); assert( i == c); - assert( i == c); // Do I reach myself. ++i; Circulator j = i; @@ -4671,7 +4661,6 @@ void test_circulator_from_container() { assert( ! (i == nullptr)); assert( i != nullptr); assert( i == c); - assert( i == c); // Do I reach myself. ++i; Circulator j = i; @@ -4897,7 +4886,6 @@ void test_circulator_from_container() { assert( ! (i == nullptr)); assert( i != nullptr); assert( i == c); - assert( i == c); // Do I reach myself. ++i; Circulator j = i; diff --git a/Circulator/test/Circulator/test_circ2.cpp b/Circulator/test/Circulator/test_circ2.cpp index 697363d1cb61..1dd55f406c3e 100644 --- a/Circulator/test/Circulator/test_circ2.cpp +++ b/Circulator/test/Circulator/test_circ2.cpp @@ -304,7 +304,6 @@ void test_struct(){ assert( ! (i == nullptr)); assert( i != nullptr); assert( i == start); - assert( i == start); // Do I reach myself. ++i; Struct_circulator j = i; @@ -413,7 +412,6 @@ void test_struct(){ assert( ! (i == nullptr)); assert( i != nullptr); assert( i == start); - assert( i == start); // Do I reach myself. ++i; Struct_const_circulator j = i; @@ -651,7 +649,6 @@ void test_struct(){ assert( ! (i == nullptr)); assert( i != nullptr); assert( i == start); - assert( i == start); // Do I reach myself. ++i; Struct_bi_circulator j = i; @@ -809,7 +806,6 @@ void test_struct(){ assert( ! (i == nullptr)); assert( i != nullptr); assert( i == start); - assert( i == start); // Do I reach myself. ++i; Struct_bi_const_circulator j = i; @@ -969,7 +965,6 @@ void test_class(){ assert( ! (i == nullptr)); assert( i != nullptr); assert( i == start); - assert( i == start); // Do I reach myself. ++i; Class_circulator j = i; @@ -1078,7 +1073,6 @@ void test_class(){ assert( ! (i == nullptr)); assert( i != nullptr); assert( i == start); - assert( i == start); // Do I reach myself. ++i; Class_const_circulator j = i; @@ -1316,7 +1310,6 @@ void test_class(){ assert( ! (i == nullptr)); assert( i != nullptr); assert( i == start); - assert( i == start); // Do I reach myself. ++i; Class_bi_circulator j = i; @@ -1474,7 +1467,6 @@ void test_class(){ assert( ! (i == nullptr)); assert( i != nullptr); assert( i == start); - assert( i == start); // Do I reach myself. ++i; Class_bi_const_circulator j = i; @@ -1891,7 +1883,6 @@ void test_array() { assert( ! (i == nullptr)); assert( i != nullptr); assert( i == start); - assert( i == start); // Do I reach myself. ++i; Circulator j = i; @@ -2119,7 +2110,6 @@ void test_array() { assert( ! (i == nullptr)); assert( i != nullptr); assert( i == start); - assert( i == start); // Do I reach myself. ++i; Circulator j = i; diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map.h b/Combinatorial_map/include/CGAL/Combinatorial_map.h index aaa360677b74..7bf8295c6656 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map.h @@ -1780,7 +1780,6 @@ namespace CGAL { void basic_link_beta_for_involution(Dart_descriptor adart1, Dart_descriptor adart2, unsigned int i) { - CGAL_assertion( i>=2 && i<=dimension ); CGAL_assertion( i>=2 && i<=dimension ); dart_link_beta(adart1, adart2, i); dart_link_beta(adart2, adart1, i); diff --git a/Distance_3/test/Distance_3/test_distance_3.cpp b/Distance_3/test/Distance_3/test_distance_3.cpp index ab67ad18d79a..e977faabe0fe 100644 --- a/Distance_3/test/Distance_3/test_distance_3.cpp +++ b/Distance_3/test/Distance_3/test_distance_3.cpp @@ -160,7 +160,7 @@ struct Test assert(are_equal(res_o2o1, expected_result)); do_intersect_check(o1, o2); - do_intersect_check(o1, o2); + do_intersect_check(o2, o1); } template @@ -170,7 +170,7 @@ struct Test const FT res_o2o1 = CGAL::squared_distance(o2, o1); do_intersect_check(o1, o2); - do_intersect_check(o1, o2); + do_intersect_check(o2, o1); assert(res_o1o2 <= ubound); assert(res_o2o1 <= ubound); @@ -324,7 +324,7 @@ struct Test check_squared_distance(S{p2, p3}, S{p4, p5}, 0); check_squared_distance(S{p2, p3}, S{p5, p4}, 0); check_squared_distance(S{p3, p2}, S{p4, p5}, 0); - check_squared_distance(S{p3, p2}, S{p4, p5}, 0); + check_squared_distance(S{p3, p2}, S{p5, p4}, 0); const double lambda_6 = r.get_double(0, 1); const P p6 = p3 + FT(lambda_6) * V{p3 - p2}; @@ -332,7 +332,7 @@ struct Test check_squared_distance(S{p2, p3}, S{p6, p5}, 0); check_squared_distance(S{p2, p3}, S{p5, p6}, 0); check_squared_distance(S{p3, p2}, S{p6, p5}, 0); - check_squared_distance(S{p3, p2}, S{p6, p5}, 0); + check_squared_distance(S{p3, p2}, S{p, p6}, 0); const double lambda_7 = r.get_double(1, 2); const P p7 = p3 + FT(lambda_7) * V{p3 - p2}; diff --git a/Generator/doc/Generator/CGAL/point_generators_2.h b/Generator/doc/Generator/CGAL/point_generators_2.h index 10319fca7379..b273f9323147 100644 --- a/Generator/doc/Generator/CGAL/point_generators_2.h +++ b/Generator/doc/Generator/CGAL/point_generators_2.h @@ -30,7 +30,6 @@ are needed from `rnd` for each point. \sa `CGAL::points_on_segment_2()` \sa `CGAL::points_on_square_grid_2()` \sa `CGAL::random_selection()` -\sa `CGAL::random_selection()` \sa `std::random_shuffle()` */ diff --git a/Heat_method_3/include/CGAL/Heat_method_3/internal/Intrinsic_Delaunay_triangulation_3.h b/Heat_method_3/include/CGAL/Heat_method_3/internal/Intrinsic_Delaunay_triangulation_3.h index 65d78512514d..77a399704ec1 100644 --- a/Heat_method_3/include/CGAL/Heat_method_3/internal/Intrinsic_Delaunay_triangulation_3.h +++ b/Heat_method_3/include/CGAL/Heat_method_3/internal/Intrinsic_Delaunay_triangulation_3.h @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include diff --git a/Kernel_23/test/Kernel_23/Dimension.cpp b/Kernel_23/test/Kernel_23/Dimension.cpp index ab9086f0e222..e5b7315d6909 100644 --- a/Kernel_23/test/Kernel_23/Dimension.cpp +++ b/Kernel_23/test/Kernel_23/Dimension.cpp @@ -9,7 +9,6 @@ #include #include -#include #include template < typename K > diff --git a/Lab/demo/Lab/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp b/Lab/demo/Lab/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp index 4a75dfd7a3be..dbe630ad09f0 100644 --- a/Lab/demo/Lab/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp +++ b/Lab/demo/Lab/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp @@ -59,7 +59,6 @@ void compute(SMesh* sMesh, namespace PMP = CGAL::Polygon_mesh_processing; typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel; typedef Epic_kernel::Point_3 Point; - typedef Epic_kernel::Point_3 Point; typedef Epic_kernel::Vector_3 Vector; typedef boost::graph_traits::vertex_descriptor Vertex_descriptor; diff --git a/Lab/demo/Lab/Scene_textured_surface_mesh_item.cpp b/Lab/demo/Lab/Scene_textured_surface_mesh_item.cpp index d3fdcb2996d5..5ebdf60c6dfe 100644 --- a/Lab/demo/Lab/Scene_textured_surface_mesh_item.cpp +++ b/Lab/demo/Lab/Scene_textured_surface_mesh_item.cpp @@ -74,7 +74,7 @@ Scene_textured_surface_mesh_item_priv::compute_normals_and_vertices(void) const faces_buffer.resize(0); typedef boost::graph_traits::face_iterator face_iterator; - typedef boost::graph_traits::face_iterator face_iterator; + const CGAL::qglviewer::Vec offset = static_cast(CGAL::QGLViewer::QGLViewerPool().first())->offset(); //Faces diff --git a/Mesh_2/test/Mesh_2/test_meshing.cpp b/Mesh_2/test/Mesh_2/test_meshing.cpp index 2654f78aca9b..48d6ccffaf05 100644 --- a/Mesh_2/test/Mesh_2/test_meshing.cpp +++ b/Mesh_2/test/Mesh_2/test_meshing.cpp @@ -10,7 +10,6 @@ #include #include #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 c2481700c7da..0b4e7b06495a 100644 --- a/Number_types/test/Number_types/Interval_nt_new.cpp +++ b/Number_types/test/Number_types/Interval_nt_new.cpp @@ -122,7 +122,7 @@ int main() { CGAL_catch_error((bool)(I<=J),CGAL::Uncertain_conversion_exception&); CGAL_catch_error((bool)(I>=J),CGAL::Uncertain_conversion_exception&); CGAL_catch_error((bool)(J> I),CGAL::Uncertain_conversion_exception&); - CGAL_catch_error((bool)(J> I),CGAL::Uncertain_conversion_exception&); + CGAL_catch_error((bool)(J< I),CGAL::Uncertain_conversion_exception&); CGAL_catch_error((bool)(J>=I),CGAL::Uncertain_conversion_exception&); CGAL_catch_error((bool)(J<=I),CGAL::Uncertain_conversion_exception&); diff --git a/Orthtree/include/CGAL/Orthtree/Traversals.h b/Orthtree/include/CGAL/Orthtree/Traversals.h index acd1db941f61..7e06e798351e 100644 --- a/Orthtree/include/CGAL/Orthtree/Traversals.h +++ b/Orthtree/include/CGAL/Orthtree/Traversals.h @@ -143,7 +143,6 @@ struct Leaves_traversal { \tparam Tree an instance of `Orthtree` - All tree nodes at another depth are ignored. If the selected depth is All tree nodes at another depth are ignored. If the selected depth is higher than the maximum depth of the orthtree, no node will be traversed. diff --git a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/MainWindow.cpp b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/MainWindow.cpp index f4eb7aeb793a..fb49efad8c42 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/MainWindow.cpp +++ b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/MainWindow.cpp @@ -119,7 +119,7 @@ MainWindow::loadPoints() for (int i=0 ; i<8 ; i++) { cx += dom[i].x(); cy += dom[i].y(); - cy += dom[i].y(); + cz += dom[i].z(); } CGAL::qglviewer::Vec center(cx/8.,cy/8.,cz/8.); viewer->setSceneCenter(center); @@ -188,7 +188,7 @@ MainWindow::newPoints(int n) for (int i=0 ; i<8 ; i++) { cx += dom[i].x(); cy += dom[i].y(); - cy += dom[i].y(); + cz += dom[i].z(); } CGAL::qglviewer::Vec center(cx/8.,cy/8.,cz/8.); viewer->setSceneCenter(center); @@ -223,5 +223,3 @@ void MainWindow::help() { tr("Could not start Qt Assistant from %1.").arg(app)); } } - - diff --git a/Point_set_processing_3/include/CGAL/IO/write_off_points.h b/Point_set_processing_3/include/CGAL/IO/write_off_points.h index 941bc16d518a..e99a2c90bce9 100644 --- a/Point_set_processing_3/include/CGAL/IO/write_off_points.h +++ b/Point_set_processing_3/include/CGAL/IO/write_off_points.h @@ -25,7 +25,6 @@ #include #include -#include #include #include diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt index 3aca69fb0049..08109123fa5b 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt @@ -48,5 +48,5 @@ \example Polygon_mesh_processing/remesh_almost_planar_patches.cpp \example Polygon_mesh_processing/sample_example.cpp \example Polygon_mesh_processing/soup_autorefinement.cpp -*/ + */ diff --git a/Polyhedron/doc/Polyhedron/Polyhedron.txt b/Polyhedron/doc/Polyhedron/Polyhedron.txt index e9d9cb1a5b35..9e7ac47116ec 100644 --- a/Polyhedron/doc/Polyhedron/Polyhedron.txt +++ b/Polyhedron/doc/Polyhedron/Polyhedron.txt @@ -385,20 +385,20 @@ polyhedral surface gives alias names renaming face to facet. class Polyhedron_items_3 { public: -template < class Refs, class Traits> -struct Vertex_wrapper { -typedef typename Traits::Point_3 Point; -typedef CGAL::HalfedgeDS_vertex_base Vertex; -}; -template < class Refs, class Traits> -struct Halfedge_wrapper { -typedef CGAL::HalfedgeDS_halfedge_base Halfedge; -}; -template < class Refs, class Traits> -struct Face_wrapper { -typedef typename Traits::Plane_3 Plane; -typedef CGAL::HalfedgeDS_face_base Face; -}; + template < class Refs, class Traits> + struct Vertex_wrapper { + typedef typename Traits::Point_3 Point; + typedef CGAL::HalfedgeDS_vertex_base Vertex; + }; + template < class Refs, class Traits> + struct Halfedge_wrapper { + typedef CGAL::HalfedgeDS_halfedge_base Halfedge; + }; + template < class Refs, class Traits> + struct Face_wrapper { + typedef typename Traits::Plane_3 Plane; + typedef CGAL::HalfedgeDS_face_base Face; + }; }; \endcode @@ -426,7 +426,7 @@ faces but would be for vertices - and add the color attribute. template struct My_face : public CGAL::HalfedgeDS_face_base { -CGAL::IO::Color color; + CGAL::IO::Color color; }; \endcode @@ -440,10 +440,10 @@ used. \code{.cpp} struct My_items : public CGAL::Polyhedron_items_3 { -template -struct Face_wrapper { -typedef My_face Face; -}; + template + struct Face_wrapper { + typedef My_face Face; + }; }; \endcode @@ -479,8 +479,8 @@ works as illustrated above. template struct My_face : public CGAL::HalfedgeDS_face_base { -typedef typename Refs::Vertex_handle Vertex_handle; -Vertex_handle vertex_ref; + typedef typename Refs::Vertex_handle Vertex_handle; + Vertex_handle vertex_ref; }; \endcode diff --git a/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/shortest_paths_multiple_sources.cpp b/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/shortest_paths_multiple_sources.cpp index 4b1a99fabbd3..a0a05111c91b 100644 --- a/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/shortest_paths_multiple_sources.cpp +++ b/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/shortest_paths_multiple_sources.cpp @@ -6,7 +6,6 @@ #include -#include #include #include #include diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h index 4ed45a02d1e6..2d3158a70959 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h @@ -29,7 +29,6 @@ #include #include #include -#include #include namespace CGAL { diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/DelaunayTriangulationTraits_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/DelaunayTriangulationTraits_2.h index f76e24c327a2..0ec0e42e70d5 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/DelaunayTriangulationTraits_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/DelaunayTriangulationTraits_2.h @@ -26,7 +26,6 @@ required if the method `nearest_vertex()` is used. \cgalHasModelsBare{All models of the \cgal concept `Kernel`} \cgalHasModelsBare{`CGAL::Projection_traits_3` (not for dual Voronoi functions)} \cgalHasModelsBare{`CGAL::Projection_traits_xy_3` (not for dual Voronoi functions)} -\cgalHasModelsBare{`CGAL::Projection_traits_xy_3` (not for dual Voronoi functions)} \cgalHasModelsBare{`CGAL::Projection_traits_yz_3` (not for dual Voronoi functions)} \cgalHasModelsBare{`CGAL::Projection_traits_xz_3` (not for dual Voronoi functions)} \cgalHasModelsEnd From 6c54f7731107d7115b2360bdb455e4fe7ec40e19 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Sat, 10 Aug 2024 17:28:48 +0200 Subject: [PATCH 074/348] updated crontab (automated commit) --- Maintenance/infrastructure/cgal.geometryfactory.com/crontab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/crontab b/Maintenance/infrastructure/cgal.geometryfactory.com/crontab index cfe168932f70..9cb5358db660 100644 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/crontab +++ b/Maintenance/infrastructure/cgal.geometryfactory.com/crontab @@ -63,7 +63,7 @@ CONTAINER_HOST=unix:///run/podman/podman.sock # Launch our Docker testsuite , at 21:36, # after a pull of all new images at 20:23. 06 20 * * * for i in $(cat /home/lrineau/.config/CGAL/test_cgal_docker_images); do docker pull $i; done; docker rmi $(docker images | awk '// {print $3}') -36 21 * * * cd /home/lrineau/Git/cgal-testsuite-dockerfiles && /usr/bin/time ./test_cgal.py --use-fedora-selinux-policy --force-rm --max-cpus 12 --container-cpus 4 --jobs 5 --upload-results --images $($HOME/bin/docker_images_to_test_today) +36 21 * * * cd /home/lrineau/Git/cgal-testsuite-dockerfiles && /usr/bin/time ./test_cgal.py --use-fedora-selinux-policy --force-rm --max-cpus 20 --container-cpus 8 --jobs 10 --upload-results --images $($HOME/bin/docker_images_to_test_today) # Dump the crontab to SVN every hour at minute 18 From eeffa4b752baeb49d68244024cd80500695f897b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 26 Jul 2024 06:03:37 +0200 Subject: [PATCH 075/348] speed up copy_face_graph mostly when tm is not empty and almost make it less dependent on tm size --- BGL/include/CGAL/boost/graph/copy_face_graph.h | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/copy_face_graph.h b/BGL/include/CGAL/boost/graph/copy_face_graph.h index 2a4850647ce6..9d9e9359c4cb 100644 --- a/BGL/include/CGAL/boost/graph/copy_face_graph.h +++ b/BGL/include/CGAL/boost/graph/copy_face_graph.h @@ -64,13 +64,15 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, const tm_face_descriptor tm_null_face = boost::graph_traits::null_face(); const tm_vertex_descriptor tm_null_vertex = boost::graph_traits::null_vertex(); - reserve(tm, static_cast::vertices_size_type>(vertices(tm).size()+vertices(sm).size()), - static_cast::edges_size_type>(edges(tm).size()+edges(sm).size()), - static_cast::faces_size_type>(faces(tm).size()+faces(sm).size()) ); + reserve(tm, static_cast::vertices_size_type>(internal::exact_num_vertices(tm)+internal::exact_num_vertices(sm)), + static_cast::edges_size_type>(internal::exact_num_edges(tm)+internal::exact_num_edges(sm)), + static_cast::faces_size_type>(internal::exact_num_faces(tm)+internal::exact_num_faces(sm)) ); //insert halfedges and create each vertex when encountering its halfedge std::vector new_edges; - new_edges.reserve(edges(sm).size()); + std::vector new_vertices; + new_edges.reserve(internal::exact_num_edges(sm)); + new_vertices.reserve(internal::exact_num_vertices(sm)); for(sm_edge_descriptor sm_e : edges(sm)) { tm_edge_descriptor tm_e = add_edge(tm); @@ -108,6 +110,7 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, tm_vertex_descriptor tm_h_tgt = add_vertex(tm); *v2v++=std::make_pair(sm_h_tgt, tm_h_tgt); set_halfedge(tm_h_tgt, tm_h, tm); + new_vertices.push_back(tm_h); set_target(tm_h, tm_h_tgt, tm); put(tm_vpm, tm_h_tgt, conv(get(sm_vpm, sm_h_tgt))); } @@ -118,6 +121,7 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, tm_vertex_descriptor tm_h_src = add_vertex(tm); *v2v++=std::make_pair(sm_h_src, tm_h_src); set_halfedge(tm_h_src, tm_h_opp, tm); + new_vertices.push_back(tm_h_opp); set_target(tm_h_opp, tm_h_src, tm); put(tm_vpm, tm_h_src, conv(get(sm_vpm, sm_h_src))); } @@ -165,11 +169,9 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, } } // update halfedge vertex of all but the vertex halfedge - for(tm_vertex_descriptor v : vertices(tm)) + for(tm_halfedge_descriptor h : new_vertices) { - tm_halfedge_descriptor h = halfedge(v, tm); - if (h==boost::graph_traits::null_halfedge()) - continue; + tm_vertex_descriptor v = target(h, tm); tm_halfedge_descriptor next_around_vertex=h; do{ next_around_vertex=opposite(next(next_around_vertex, tm), tm); From fd498e398aafd12a6661ac796b7b3ae4ae5d153d Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Fri, 9 Aug 2024 15:45:24 +0200 Subject: [PATCH 076/348] fix approx_is_too_large(edge) that needs the corresponding curve_index to be valid use minimal_size instead of 0 fix 5e64bced8e37ce076f26317e9ea7638a14c9696c fix approx_is_too_large(edge) that needs the corresponding curve_index to be valid and fix the default edge_min_size --- .../CGAL/Mesh_3/Protect_edges_sizing_field.h | 71 +++++++++---------- 1 file changed, 35 insertions(+), 36 deletions(-) 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 4a0e3f131dee..366f1b3a91e8 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 @@ -152,7 +152,7 @@ class Protect_edges_sizing_field Protect_edges_sizing_field(C3T3& c3t3, const MeshDomain& domain, SizingFunction size=SizingFunction(), - const FT minimal_size = FT(-1), + const FT minimal_size = FT(0), const Distance_Function edge_distance = Distance_Function(), const std::size_t maximal_number_of_vertices = 0, Mesh_error_code* error_code = 0 @@ -273,8 +273,7 @@ class Protect_edges_sizing_field /// Returns `true` if the edge `(va,vb)` is a not good enough approximation /// of its feature. - bool approx_is_too_large(const Vertex_handle& va, - const Vertex_handle& vb, + bool approx_is_too_large(const Edge& e, const bool is_edge_in_complex) const; /// Returns `true` if the balls of `va` and `vb` intersect. @@ -458,10 +457,12 @@ class Protect_edges_sizing_field dim = -1 - dim; const FT s = field(p, dim, index); - if(s <= FT(0)) { + if(s < minimal_size_) + { std::stringstream msg; msg.precision(17); - msg << "Error: the field is null at "; + msg << "Error: the field is smaller than minimal size (" + << minimal_size_ << ") at "; if(dim == 0) msg << "corner ("; else msg << "point ("; msg << p << ")"; @@ -493,7 +494,7 @@ class Protect_edges_sizing_field bool use_minimal_size() const { - return minimal_size_ != FT(-1); + return minimal_size_ != FT(0); } Weight minimal_weight() const { @@ -645,7 +646,10 @@ insert_corners() #endif // Get weight (the ball radius is given by the 'query_size' function) - FT w = CGAL::square(query_size(p, 0, p_index)); + const FT query_weight = CGAL::square(query_size(p, 0, p_index)); + FT w = use_minimal_size() + ? (std::min)(minimal_weight_, query_weight) + : query_weight; #if CGAL_MESH_3_PROTECTION_DEBUG & 1 std::cerr << "Weight from sizing field: " << w << std::endl; @@ -1178,12 +1182,12 @@ insert_balls(const Vertex_handle& vp, const Weighted_point& vp_wp = c3t3_.triangulation().point(vp); #if ! defined(CGAL_NO_PRECONDITIONS) - if(sp <= 0) { - std::stringstream msg;; + if(sp <= minimal_size_) { + std::stringstream msg; msg.precision(17); - msg << "Error: the mesh sizing field is null at point ("; - msg << cp(vp_wp) << ")!"; - CGAL_precondition_msg(sp > 0, msg.str().c_str()); + msg << "Error: the mesh sizing field is smaller than minimal size "; + msg << " at point (" << cp(vp_wp) << ")!"; + CGAL_precondition_msg(sp > minimal_size_, msg.str().c_str()); } #endif // ! CGAL_NO_PRECONDITIONS @@ -1428,7 +1432,7 @@ refine_balls() if( // topology condition non_adjacent_but_intersect(va, vb, is_edge_in_complex) // approximation condition - || (use_distance_field() && approx_is_too_large(va, vb, is_edge_in_complex))) + || (use_distance_field() && approx_is_too_large(*eit, is_edge_in_complex))) { using CGAL::Mesh_3::internal::distance_divisor; @@ -1557,34 +1561,29 @@ do_balls_intersect(const Vertex_handle& va, const Vertex_handle& vb) const template bool Protect_edges_sizing_field:: -approx_is_too_large(const Vertex_handle& va, const Vertex_handle& vb, const bool is_edge_in_complex) const +approx_is_too_large(const Edge& e, const bool is_edge_in_complex) const { if ( ! is_edge_in_complex ) - { return false; - } - typedef typename Kernel::Point_3 Point_3; - Curve_index curve_index = domain_.curve_index((va->in_dimension() < vb->in_dimension()) ? vb->index() : va->index()); + const auto& [va, vb] = c3t3_.triangulation().vertices(e); - const Point_3& pa = va->point().point(); - const Point_3& pb = vb->point().point(); - const Point_3& segment_middle = CGAL::midpoint(pa, pb); - // Obtain the geodesic middle point - FT signed_geodesic_distance = domain_.signed_geodesic_distance(pa, pb, curve_index); - Point_3 geodesic_middle; - if (signed_geodesic_distance >= FT(0)) - { - geodesic_middle = domain_.construct_point_on_curve(pa, curve_index, signed_geodesic_distance / 2); - } - else - { - geodesic_middle = domain_.construct_point_on_curve(pb, curve_index, -signed_geodesic_distance / 2); - } - // Compare distance to the parameter's distance - FT squared_evaluated_distance = CGAL::squared_distance(segment_middle, geodesic_middle); - FT segment_middle_edge_distance = query_distance(segment_middle, 1, curve_index); - return squared_evaluated_distance > CGAL::square(segment_middle_edge_distance); + const Bare_point& pa = va->point().point(); + const Bare_point& pb = vb->point().point(); + + // Construct the geodesic middle point + const Curve_index curve_index = c3t3_.curve_index(e); + const FT signed_geodesic_distance = domain_.signed_geodesic_distance(pa, pb, curve_index); + const Bare_point geodesic_middle = (signed_geodesic_distance >= FT(0)) + ? domain_.construct_point_on_curve(pa, curve_index, signed_geodesic_distance / 2) + : domain_.construct_point_on_curve(pb, curve_index, -signed_geodesic_distance / 2); + + const Bare_point edge_middle = CGAL::midpoint(pa, pb); + const FT squared_evaluated_distance = CGAL::squared_distance(edge_middle, geodesic_middle); + + // Compare distance to the distance field from criteria + const FT max_distance_to_curve = query_distance(edge_middle, 1, curve_index); + return squared_evaluated_distance > CGAL::square(max_distance_to_curve); } template From fb4416fff556e8e06ce37530dd07703b137b2808 Mon Sep 17 00:00:00 2001 From: Sebastien Loriot Date: Mon, 12 Aug 2024 18:10:40 +0200 Subject: [PATCH 077/348] typo --- Distance_3/test/Distance_3/test_distance_3.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Distance_3/test/Distance_3/test_distance_3.cpp b/Distance_3/test/Distance_3/test_distance_3.cpp index e977faabe0fe..4f68e2278dad 100644 --- a/Distance_3/test/Distance_3/test_distance_3.cpp +++ b/Distance_3/test/Distance_3/test_distance_3.cpp @@ -332,7 +332,7 @@ struct Test check_squared_distance(S{p2, p3}, S{p6, p5}, 0); check_squared_distance(S{p2, p3}, S{p5, p6}, 0); check_squared_distance(S{p3, p2}, S{p6, p5}, 0); - check_squared_distance(S{p3, p2}, S{p, p6}, 0); + check_squared_distance(S{p3, p2}, S{p5, p6}, 0); const double lambda_7 = r.get_double(1, 2); const P p7 = p3 + FT(lambda_7) * V{p3 - p2}; From 35195e311a6ba0c3799c9311a88d87dd2c1b6993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 12 Aug 2024 18:11:39 +0200 Subject: [PATCH 078/348] undo incorrect simplification --- BGL/test/BGL/test_Euler_operations.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/BGL/test/BGL/test_Euler_operations.cpp b/BGL/test/BGL/test_Euler_operations.cpp index 5cbb3697f3a6..941758cb1c33 100644 --- a/BGL/test/BGL/test_Euler_operations.cpp +++ b/BGL/test/BGL/test_Euler_operations.cpp @@ -17,6 +17,7 @@ test_copy_face_graph_nm_umbrella() T g; Kernel::Point_3 p(0,0,0); + CGAL::make_tetrahedron(p, p, p, p, g); CGAL::make_tetrahedron(p, p, p, p, g); std::vector verts(vertices(g).begin(), vertices(g).end()); From f63c99d34223a1767de13c8913840ba9bb0bbb0f Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 13 Aug 2024 08:48:31 +0100 Subject: [PATCH 079/348] remove duplicates --- Distance_3/test/Distance_3/test_distance_3.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Distance_3/test/Distance_3/test_distance_3.cpp b/Distance_3/test/Distance_3/test_distance_3.cpp index 4f68e2278dad..f297e93016b3 100644 --- a/Distance_3/test/Distance_3/test_distance_3.cpp +++ b/Distance_3/test/Distance_3/test_distance_3.cpp @@ -160,7 +160,6 @@ struct Test assert(are_equal(res_o2o1, expected_result)); do_intersect_check(o1, o2); - do_intersect_check(o2, o1); } template @@ -170,7 +169,6 @@ struct Test const FT res_o2o1 = CGAL::squared_distance(o2, o1); do_intersect_check(o1, o2); - do_intersect_check(o2, o1); assert(res_o1o2 <= ubound); assert(res_o2o1 <= ubound); From 99539be5c5b4bb59ade022933f731c0f10fd5261 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 13 Aug 2024 08:50:04 +0100 Subject: [PATCH 080/348] explain why duplicate --- BGL/test/BGL/test_Euler_operations.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/BGL/test/BGL/test_Euler_operations.cpp b/BGL/test/BGL/test_Euler_operations.cpp index 941758cb1c33..615a4fd756dc 100644 --- a/BGL/test/BGL/test_Euler_operations.cpp +++ b/BGL/test/BGL/test_Euler_operations.cpp @@ -17,6 +17,7 @@ test_copy_face_graph_nm_umbrella() T g; Kernel::Point_3 p(0,0,0); + // make two connected components CGAL::make_tetrahedron(p, p, p, p, g); CGAL::make_tetrahedron(p, p, p, p, g); From a8d7bd1850fa8ce9d07c686351105d9f068a31b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 13 Aug 2024 13:57:44 +0200 Subject: [PATCH 081/348] move point cloud to the right directory --- .../examples/Classification/example_classification.cpp | 2 +- .../examples/Classification/example_cluster_classification.cpp | 2 +- Classification/examples/Classification/example_feature.cpp | 2 +- Data/data/{meshes => points_3}/b9.ply | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename Data/data/{meshes => points_3}/b9.ply (100%) diff --git a/Classification/examples/Classification/example_classification.cpp b/Classification/examples/Classification/example_classification.cpp index 1d94295a6456..2926a11fb854 100644 --- a/Classification/examples/Classification/example_classification.cpp +++ b/Classification/examples/Classification/example_classification.cpp @@ -48,7 +48,7 @@ typedef Classification::Feature::Vertical_dispersion int main (int argc, char** argv) { - const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/b9.ply"); + const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("points_3/b9.ply"); std::cerr << "Reading input" << std::endl; std::vector pts; diff --git a/Classification/examples/Classification/example_cluster_classification.cpp b/Classification/examples/Classification/example_cluster_classification.cpp index 51c7e642b78d..a036f878f0b7 100644 --- a/Classification/examples/Classification/example_cluster_classification.cpp +++ b/Classification/examples/Classification/example_cluster_classification.cpp @@ -48,7 +48,7 @@ typedef Classification::Cluster Clu int main (int argc, char** argv) { - std::string filename = CGAL::data_file_path("meshes/b9.ply"); + std::string filename = CGAL::data_file_path("points_3/b9.ply"); std::string filename_config = "data/b9_clusters_config.bin"; if (argc > 1) diff --git a/Classification/examples/Classification/example_feature.cpp b/Classification/examples/Classification/example_feature.cpp index b0cdcd900540..d8bed02141b6 100644 --- a/Classification/examples/Classification/example_feature.cpp +++ b/Classification/examples/Classification/example_feature.cpp @@ -66,7 +66,7 @@ class My_feature : public CGAL::Classification::Feature_base int main (int argc, char** argv) { - std::string filename (argc > 1 ? argv[1] : CGAL::data_file_path("meshes/b9.ply")); + std::string filename (argc > 1 ? argv[1] : CGAL::data_file_path("points_3/b9.ply")); std::vector pts; std::cerr << "Reading input" << std::endl; diff --git a/Data/data/meshes/b9.ply b/Data/data/points_3/b9.ply similarity index 100% rename from Data/data/meshes/b9.ply rename to Data/data/points_3/b9.ply From 2c31defc6528bef74194e135fe3736b9f55d282b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 13 Aug 2024 16:14:23 +0200 Subject: [PATCH 082/348] backport f7a48360395d819bbd15b48071bd89fc0bdd9648 to the deprecated test --- Mesh_3/test/Mesh_3/test_meshing_3D_gray_image_deprecated.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Mesh_3/test/Mesh_3/test_meshing_3D_gray_image_deprecated.cpp b/Mesh_3/test/Mesh_3/test_meshing_3D_gray_image_deprecated.cpp index b2ba365111f8..b20e573cf670 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_3D_gray_image_deprecated.cpp +++ b/Mesh_3/test/Mesh_3/test_meshing_3D_gray_image_deprecated.cpp @@ -68,7 +68,6 @@ struct Image_tester : public Tester Mesh_criteria criteria(facet_angle = 30, facet_size = 6, facet_distance = 2, - facet_topology = CGAL::MANIFOLD, cell_radius_edge_ratio = 3, cell_size = 8); From 5b731118f9c2f7ad6d5e756ef5a47ca8559c2adf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 13 Aug 2024 16:22:36 +0200 Subject: [PATCH 083/348] add validation for the range case --- .../CGAL/Boolean_set_operations_2/Gps_on_surface_base_2.h | 2 ++ 1 file changed, 2 insertions(+) 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 81c6f421171d..d1b75253aefb 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 @@ -642,6 +642,7 @@ class Gps_on_surface_base_2 unsigned int i = 1; for (InputIterator itr = begin; itr != end; ++itr, ++i) { + ValidationPolicy::is_valid((*itr), *m_traits); arr_vec[i].first = new Aos_2(m_traits); _insert(*itr, *(arr_vec[i].first)); } @@ -666,6 +667,7 @@ class Gps_on_surface_base_2 unsigned int i = 1; for (InputIterator itr = begin; itr!=end; ++itr, ++i) { + ValidationPolicy::is_valid((*itr), *m_traits); arr_vec[i].first = new Aos_2(m_traits); _insert(*itr, *(arr_vec[i].first)); } From 8c70d6120f71282183037973d0607f98af652006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 14 Aug 2024 14:37:24 +0200 Subject: [PATCH 084/348] hide PMP usage behind a macro --- .../Least_squares_plane_fit_region.h | 47 +++++++++++++------ .../Region_growing/internal/utils.h | 36 ++++++++++---- 2 files changed, 59 insertions(+), 24 deletions(-) diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Least_squares_plane_fit_region.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Least_squares_plane_fit_region.h index 601444031149..0ab7463a08ec 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Least_squares_plane_fit_region.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Least_squares_plane_fit_region.h @@ -19,7 +19,9 @@ // Internal includes. #include #include +#ifdef CGAL_SD_RG_USE_PMP #include +#endif namespace CGAL { namespace Shape_detection { @@ -163,8 +165,36 @@ namespace Polygon_mesh { m_scalar_product_3(m_traits.compute_scalar_product_3_object()), m_cross_product_3(m_traits.construct_cross_product_vector_3_object()) { +#ifdef CGAL_SD_RG_USE_PMP + auto get_face_normal = [this](Item face, const PolygonMesh& pmesh) + { + return Polygon_mesh_processing::compute_face_normal(face, pmesh, parameters::vertex_point_map(m_vertex_to_point_map)); + }; +#else + auto get_face_normal = [this](Item face, const PolygonMesh& pmesh) -> Vector_3 + { + const auto hedge = halfedge(face, pmesh); + const auto vertices = vertices_around_face(hedge, pmesh); + CGAL_precondition(vertices.size() >= 3); + + auto vertex = vertices.begin(); + const Point_3& p1 = get(m_vertex_to_point_map, *vertex); ++vertex; + const Point_3& p2 = get(m_vertex_to_point_map, *vertex); ++vertex; + Point_3 p3 = get(m_vertex_to_point_map, *vertex); + while(collinear(p1, p2, p3)) + { + if (++vertex == vertices.end()) return NULL_VECTOR; + p3 = get(m_vertex_to_point_map, *vertex); + } + + const Vector_3 u = p2 - p1; + const Vector_3 v = p3 - p1; + return m_cross_product_3(u, v); + }; +#endif + for (const Item &i : faces(pmesh)) { - m_face_normals[i] = Polygon_mesh_processing::compute_face_normal(i, pmesh); + m_face_normals[i] = get_face_normal(i, pmesh); std::vector pts; auto h = halfedge(i, pmesh); auto s = h; @@ -174,20 +204,7 @@ namespace Polygon_mesh { h = next(h, pmesh); } while (h != s); - std::vector> output; - - Polygon_mesh_processing::triangulate_hole_polyline(pts, std::back_inserter(output), parameters::use_2d_constrained_delaunay_triangulation(true)); - - // Create entry in map. In case of degenerate polygonal faces, the list stays empty. - std::vector& tris = m_face_triangulations[i]; - - // If the output is empty, the polygon is degenerate. - if (output.empty()) - continue; - - tris.reserve(output.size()); - for (const auto& t : output) - tris.push_back(Triangle_3(pts[t.first], pts[t.second], pts[t.third])); + internal::triangulate_face(pts, m_face_triangulations[i]); } CGAL_precondition(faces(m_face_graph).size() > 0); diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h index 328c49031b2a..8a0d8690893e 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h @@ -46,7 +46,9 @@ #include #include #include +#ifdef CGAL_SD_RG_USE_PMP #include +#endif namespace CGAL { namespace Shape_detection { @@ -330,6 +332,30 @@ namespace internal { return create_plane(tmp, item_map, traits); } + template + void + triangulate_face(const std::vector& points, + std::vector& triangles) + { +#ifdef CGAL_SD_RG_USE_PMP + std::vector> output; + + Polygon_mesh_processing::triangulate_hole_polyline(points, std::back_inserter(output), parameters::use_2d_constrained_delaunay_triangulation(true)); + + triangles.reserve(output.size()); + for (const auto& t : output) + triangles.emplace_back(points[t.first], points[t.second], points[t.third]); +#else + //use a triangulation using the centroid + std::size_t nb_edges = points.size(); + Point_3 c = CGAL::centroid(points.begin(), points.end()); + triangles.reserve(nb_edges); + for (std::size_t i=0; i> output; - - Polygon_mesh_processing::triangulate_hole_polyline(points, std::back_inserter(output), parameters::use_2d_constrained_delaunay_triangulation(true)); - - assert(!output.empty()); - for (const auto& t : output) - triangles.push_back(ITriangle_3(points[t.first], points[t.second], points[t.third])); - } + triangulate_face(points, triangles); } CGAL_precondition(triangles.size() >= region.size()); IPlane_3 fitted_plane; From 7d0969d15f3b1547b6bb0dd96ccef23acfa5c76c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 14 Aug 2024 15:47:16 +0200 Subject: [PATCH 085/348] use dynamic property maps --- .../Least_squares_plane_fit_region.h | 23 +++++++++++-------- .../Region_growing/internal/utils.h | 2 +- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Least_squares_plane_fit_region.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Least_squares_plane_fit_region.h index 0ab7463a08ec..2c8801ea5e6a 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Least_squares_plane_fit_region.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Least_squares_plane_fit_region.h @@ -93,9 +93,6 @@ namespace Polygon_mesh { using Scalar_product_3 = typename GeomTraits::Compute_scalar_product_3; using Cross_product_3 = typename GeomTraits::Construct_cross_product_vector_3; - std::unordered_map > m_face_normals; - std::unordered_map, internal::hash_item > m_face_triangulations; - public: /// \name Initialization /// @{ @@ -163,7 +160,10 @@ namespace Polygon_mesh { m_squared_length_3(m_traits.compute_squared_length_3_object()), m_squared_distance_3(m_traits.compute_squared_distance_3_object()), m_scalar_product_3(m_traits.compute_scalar_product_3_object()), - m_cross_product_3(m_traits.construct_cross_product_vector_3_object()) { + m_cross_product_3(m_traits.construct_cross_product_vector_3_object()), + m_face_normals( get(CGAL::dynamic_face_property_t(), pmesh) ), + m_face_triangulations( get(CGAL::dynamic_face_property_t>(), pmesh) ) + { #ifdef CGAL_SD_RG_USE_PMP auto get_face_normal = [this](Item face, const PolygonMesh& pmesh) @@ -194,7 +194,7 @@ namespace Polygon_mesh { #endif for (const Item &i : faces(pmesh)) { - m_face_normals[i] = get_face_normal(i, pmesh); + put(m_face_normals, i, get_face_normal(i, pmesh)); std::vector pts; auto h = halfedge(i, pmesh); auto s = h; @@ -204,7 +204,9 @@ namespace Polygon_mesh { h = next(h, pmesh); } while (h != s); - internal::triangulate_face(pts, m_face_triangulations[i]); + std::vector face_triangulation; + internal::triangulate_face(pts, face_triangulation); + put(m_face_triangulations, i, face_triangulation); } CGAL_precondition(faces(m_face_graph).size() > 0); @@ -283,7 +285,7 @@ namespace Polygon_mesh { const FT squared_distance_threshold = m_distance_threshold * m_distance_threshold; - const Vector_3 face_normal = m_face_normals.at(query); + const Vector_3 face_normal = get(m_face_normals, query); const FT cos_value = m_scalar_product_3(face_normal, m_normal_of_best_fit); const FT squared_cos_value = cos_value * cos_value; @@ -333,7 +335,7 @@ namespace Polygon_mesh { // The best fit plane will be a plane through this face centroid with // its normal being the face's normal. const Point_3 face_centroid = get_face_centroid(face); - const Vector_3 face_normal = m_face_normals.at(face); + const Vector_3 face_normal = get(m_face_normals, face); if (face_normal == CGAL::NULL_VECTOR) return false; CGAL_precondition(face_normal != CGAL::NULL_VECTOR); @@ -374,7 +376,7 @@ namespace Polygon_mesh { // Approach: each face gets one vote to keep or flip the current plane normal. long votes_to_keep_normal = 0; for (const auto &face : region) { - const Vector_3 face_normal = m_face_normals.at(face); + const Vector_3 face_normal = get(m_face_normals, face); const bool agrees = m_scalar_product_3(face_normal, unoriented_normal_of_best_fit) > FT(0); votes_to_keep_normal += (agrees ? 1 : -1); @@ -406,6 +408,9 @@ namespace Polygon_mesh { const Scalar_product_3 m_scalar_product_3; const Cross_product_3 m_cross_product_3; + typename boost::property_map >::const_type m_face_normals; + typename boost::property_map> >::const_type m_face_triangulations; + Plane_3 m_plane_of_best_fit; Vector_3 m_normal_of_best_fit; diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h index 8a0d8690893e..09f87c109a8f 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h @@ -442,7 +442,7 @@ namespace internal { const IConverter iconverter = IConverter(); for (const typename Region::value_type face : region) { - const std::vector& tris = face_to_triangles_map.at(face); + const std::vector& tris = get(face_to_triangles_map, face); // Degenerate polygons are omitted. if (tris.empty()) From e931d1258b5647d84ca32401102c0cacce0f859a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 14 Aug 2024 16:52:42 +0200 Subject: [PATCH 086/348] add missing include --- .../CGAL/Shape_detection/Region_growing/internal/utils.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h index 09f87c109a8f..3cd71111d2c7 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h @@ -48,6 +48,8 @@ #include #ifdef CGAL_SD_RG_USE_PMP #include +#else +#include #endif namespace CGAL { From 6e5f37474fcd35c05c38c13f20673d97b2b2b4e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 14 Aug 2024 17:20:06 +0200 Subject: [PATCH 087/348] bad type --- .../CGAL/Shape_detection/Region_growing/internal/utils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h index 3cd71111d2c7..de1827fa3769 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/internal/utils.h @@ -350,7 +350,7 @@ namespace internal { #else //use a triangulation using the centroid std::size_t nb_edges = points.size(); - Point_3 c = CGAL::centroid(points.begin(), points.end()); + typename Traits::Point_3 c = CGAL::centroid(points.begin(), points.end()); triangles.reserve(nb_edges); for (std::size_t i=0; i Date: Wed, 14 Aug 2024 18:18:26 +0200 Subject: [PATCH 088/348] clean up and move skip test to export header --- .../include/CGAL/Nef_3/SNC_const_decorator.h | 4 - .../convert_nef_polyhedron_to_polygon_mesh.h | 81 ++++--------------- Nef_3/test/Nef_3/issue_6423.cpp | 1 + 3 files changed, 18 insertions(+), 68 deletions(-) diff --git a/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h b/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h index c2c622a181e1..a8b0123f3df2 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h @@ -535,10 +535,6 @@ visit_shell_objects(typename Traits::SFace_handle f, Visitor& V) const } Halffacet_handle f = ec->twin()->facet(); if ( Done[f] ) continue; - Halffacet_handle tf = f->twin(); - if ((f->incident_volume() == tf->incident_volume()) && Done[tf]) { - continue; // for example when we have to do with the unbounded volume and a surface with boundaries - } FacetCandidates.push_back(f); Done[f] = true; } } else if (fc.is_svertex() ) { 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 218e7210866e..8b03c7555074 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 @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -81,6 +82,7 @@ struct Shell_polygons_visitor Vertex_index_map& vertex_indices; PolygonRange& polygons; bool triangulate_all_faces; + CGAL::Generic_handle_map Done; Shell_polygons_visitor(Vertex_index_map& vertex_indices, PolygonRange& polygons, @@ -88,6 +90,7 @@ struct Shell_polygons_visitor : vertex_indices( vertex_indices ) , polygons(polygons) , triangulate_all_faces(triangulate_all_faces) + , Done(false) {} std::size_t get_cycle_length( typename Nef_polyhedron::Halffacet_cycle_const_iterator hfc) const @@ -103,6 +106,14 @@ struct Shell_polygons_visitor void visit(typename Nef_polyhedron::Halffacet_const_handle opposite_facet) { + typename Nef_polyhedron::Halffacet_const_handle twin_facet = opposite_facet->twin(); + + // skip when we have to do with the unbounded volume and a surface with boundaries + if ((twin_facet->incident_volume() == opposite_facet->incident_volume()) && Done[twin_facet]) + return; + + Done[opposite_facet] = true; + bool is_marked=opposite_facet->incident_volume()->mark(); CGAL_assertion(Nef_polyhedron::Infi_box::is_standard(opposite_facet->plane())); @@ -352,11 +363,9 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, typename Nef_polyhedron::Volume_const_iterator vol_it = nef.volumes_begin(), vol_end = nef.volumes_end(); - if (Nef_polyhedron::Infi_box::extended_kernel()) { - ++vol_it; // skip Infi_box - } + if (Nef_polyhedron::Infi_box::extended_kernel()) ++vol_it; // skip Infi_box - CGAL_assertion ( vol_it != vol_end ); + if ( vol_it == vol_end ) return; Converter to_output; bool handling_unbounded_volume = true; @@ -374,71 +383,15 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, CGAL_For_all(ec,ee) { typename Nef_polyhedron::SVertex_const_handle vv = ec->twin()->source(); - //~ if ( !SD.is_isolated(vv) && !Done[vv] ) { - //~ V.visit(vv); // report edge - //~ Done[vv] = Done[vv->twin()] = true; - //~ } + typename Nef_polyhedron::Halffacet_const_handle f = ec->twin()->facet(); - return f->incident_volume()!=f->twin()->incident_volume(); - //~ if ( Done[f] ) continue; - //~ Halffacet_handle tf = f->twin(); - //~ } - //~ FacetCandidates.push_back(f); Done[f] = true; + if (f->incident_volume()==f->twin()->incident_volume()) + return false; } } - -#if 0 - else if (fc.is_svertex() ) { - SVertex_handle v(fc); - if ( Done[v] ) continue; - V.visit(v); // report edge - V.visit(v->twin()); - Done[v] = Done[v->twin()] = true; - CGAL_assertion(SD.is_isolated(v)); - SFaceCandidates.push_back(v->twin()->incident_sface()); - Done[v->twin()->incident_sface()]=true; - // note that v is isolated, thus twin(v) is isolated too - // SM_const_decorator SD; - // SFace_const_handle fo; - // fo = v->twin()->incident_sface(); - /* - if(SD.is_isolated(v)) - fo = v->source()->sfaces_begin(); - else - fo = v->twin()->incident_sface(); - */ - } else if (fc.is_shalfloop() ) { - SHalfloop_handle l(fc); - V.visit(l); - Halffacet_handle f = l->twin()->facet(); - if ( Done[f] ) continue; - FacetCandidates.push_back(f); Done[f] = true; - } else CGAL_error_msg("Damn wrong handle."); -#endif } - return false; - - //~ typename Nef_polyhedron::SHalfedge_const_handle e(sf); - //~ typename Nef_polyhedron::SHalffacet_const_handle f = e->facet(); - //~ e->facet() - //~ SHalfedge_around_sface_circulator ec(e),ee(e); - //~ CGAL_For_all(ec,ee) { - //~ SVertex_handle vv = ec->twin()->source(); - //~ if ( !SD.is_isolated(vv) && !Done[vv] ) { - //~ V.visit(vv); // report edge - //~ Done[vv] = Done[vv->twin()] = true; - //~ } - //~ Halffacet_handle f = ec->twin()->facet(); - //~ if ( Done[f] ) continue; - - //~ if (CGAL::assign(f,*sfh)) - //~ { - //~ std::cout << "COUCOU\n"; - //~ return f->incident_volume()!=f->twin()->incident_volume(); - //~ } - //~ else - //~ return false; + return true; }; for (;vol_it!=vol_end;++vol_it) diff --git a/Nef_3/test/Nef_3/issue_6423.cpp b/Nef_3/test/Nef_3/issue_6423.cpp index 5eeb664f23b2..87e7f7dff618 100644 --- a/Nef_3/test/Nef_3/issue_6423.cpp +++ b/Nef_3/test/Nef_3/issue_6423.cpp @@ -40,5 +40,6 @@ int main() CGAL::convert_nef_polyhedron_to_polygon_mesh(nefPoly, convertedSurfaceMesh, true); std::cout << "After conversion, number_of_faces: " << convertedSurfaceMesh.number_of_faces() << std::endl; std::cout << convertedSurfaceMesh << std::endl; + std::ofstream("out.off") << convertedSurfaceMesh; return EXIT_SUCCESS; } From 30fc15064bc66a8f6bcf4222878139b201272d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 14 Aug 2024 18:22:04 +0200 Subject: [PATCH 089/348] add assertions --- Nef_3/test/Nef_3/issue_6423.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Nef_3/test/Nef_3/issue_6423.cpp b/Nef_3/test/Nef_3/issue_6423.cpp index 87e7f7dff618..441dd0b7939d 100644 --- a/Nef_3/test/Nef_3/issue_6423.cpp +++ b/Nef_3/test/Nef_3/issue_6423.cpp @@ -35,11 +35,11 @@ int main() NefPolyhedron nefPoly(surfaceMesh); std::cout << "NefPolyhedron, number_of_faces: " << nefPoly.number_of_facets() << std::endl; - std::cout << nefPoly << std::endl; SurfaceMesh convertedSurfaceMesh; CGAL::convert_nef_polyhedron_to_polygon_mesh(nefPoly, convertedSurfaceMesh, true); std::cout << "After conversion, number_of_faces: " << convertedSurfaceMesh.number_of_faces() << std::endl; - std::cout << convertedSurfaceMesh << std::endl; std::ofstream("out.off") << convertedSurfaceMesh; + assert(vertices(convertedSurfaceMesh).size()==10); + assert(faces(convertedSurfaceMesh).size()==6); return EXIT_SUCCESS; } From d20cef2f911a2e9773e6394708a14e5d3544222d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 19 Aug 2024 09:02:24 +0200 Subject: [PATCH 090/348] remove unused variable --- .../CGAL/boost/graph/convert_nef_polyhedron_to_polygon_mesh.h | 2 -- 1 file changed, 2 deletions(-) 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 8b03c7555074..3ecd0e1b8053 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 @@ -382,8 +382,6 @@ void convert_nef_polyhedron_to_polygon_soup(const Nef_polyhedron& nef, typename Nef_polyhedron::SHalfedge_around_sface_const_circulator ec(e),ee(e); CGAL_For_all(ec,ee) { - typename Nef_polyhedron::SVertex_const_handle vv = ec->twin()->source(); - typename Nef_polyhedron::Halffacet_const_handle f = ec->twin()->facet(); if (f->incident_volume()==f->twin()->incident_volume()) return false; From 926dab060e12fe23da736c6c1ee822c7d68bd74c Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 19 Aug 2024 09:43:55 +0200 Subject: [PATCH 091/348] Reintroduce QPainterPath reset logic --- .../Arrangement_on_surface_2/CurveInputMethods.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp index 82e7958b2ab7..87908978b60a 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp @@ -109,6 +109,12 @@ void CurveInputMethod::beginInput_() for (auto& item : items) this->getScene()->addItem(item); } +static inline void clearPainterPath(QPainterPath& ppath) +{ + ppath = {}; +} + + void CurveInputMethod::reset() { this->resetInput(); @@ -184,6 +190,7 @@ PolylineInputMethod::PolylineInputMethod() : void PolylineInputMethod::beginInput() { + clearPainterPath(this->painterPath); this->polylineGuide.setPath(this->painterPath); this->lastLine.setLine(0, 0, 0, 0); QPen pen = this->polylineGuide.pen(); @@ -346,6 +353,8 @@ BezierInputMethod::BezierInputMethod() : CurveInputMethod(CurveType::Bezier, -1) void BezierInputMethod::beginInput() { + clearPainterPath(this->painterOldPath); + clearPainterPath(this->painterPath); this->bezierGuide.setPath(this->painterPath); this->bezierOldGuide.setPath(this->painterOldPath); @@ -395,6 +404,7 @@ static void updateBezierPainterPath( const std::vector& controlPoints, std::vector& cache, const QTransform& worldTransform, QPainterPath& painterPath) { + clearPainterPath(painterPath); if (controlPoints.size() < 2) return; float pixel_len = approx_pixel_length(controlPoints, worldTransform); From 1286d8b6366201a5df3f5c1bbc3a6310a0d4e1f8 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 19 Aug 2024 12:02:19 +0200 Subject: [PATCH 092/348] Remove deprecated Qt version checks --- .../GridGraphicsItem.cpp | 4 ---- GraphicsView/include/CGAL/Qt/qglviewer.h | 7 ++++++ GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 22 +++++++++++++++++++ Lab/demo/Lab/CGAL_Lab.cpp | 3 +++ Lab/demo/Lab/MainWindow.cpp | 6 +++++ 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GridGraphicsItem.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GridGraphicsItem.cpp index 535f46849759..01723db026eb 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GridGraphicsItem.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GridGraphicsItem.cpp @@ -67,11 +67,7 @@ void GridGraphicsItem::setSpacing(int spacing_) static inline qreal horizontalAdvance(const QFontMetrics& fm, const QString& text) { -#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) return fm.horizontalAdvance(text); -#else - return fm.boundingRect(text).width(); -#endif } void GridGraphicsItem::paint( diff --git a/GraphicsView/include/CGAL/Qt/qglviewer.h b/GraphicsView/include/CGAL/Qt/qglviewer.h index 5c0726d5344c..e24a5fcd6d7f 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer.h @@ -478,6 +478,13 @@ public Q_SLOTS: qreal bufferTextureMaxU() const { return bufferTextureMaxU_; } /*! Same as bufferTextureMaxU(), but for the v texture coordinate. */ qreal bufferTextureMaxV() const { return bufferTextureMaxV_; } + // These methods are part of the QGLWidget public API. + // As of version 2.7.0, the use of QOpenGLWidget instead means that they have + // to be provided for backward compatibility. + void renderText(int x, int y, const QString &str, + const QFont &font = QFont()); + void renderText(double x, double y, double z, const QString &str, + const QFont &font = QFont()); public Q_SLOTS: void copyBufferToTexture(GLint, GLenum = GL_NONE); diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index dc25f1d8675e..508444710add 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -720,6 +720,28 @@ CGAL_INLINE_FUNCTION void CGAL::QGLViewer::drawLight(GLenum, qreal ) const { } +CGAL_INLINE_FUNCTION +void CGAL::QGLViewer::renderText(int x, int y, const QString &str, + const QFont &font) { + QColor fontColor = QColor(0, 0, + 0, 255); + + // Render text + QPainter painter(this); + painter.setPen(fontColor); + painter.setFont(font); + painter.drawText(x, y, str); + painter.end(); +} + +CGAL_INLINE_FUNCTION +void CGAL::QGLViewer::renderText(double x, double y, double z, const QString &str, + const QFont &font) { + using CGAL::qglviewer::Vec; + const Vec proj = camera_->projectedCoordinatesOf(Vec(x, y, z)); + renderText(int(proj.x), int(proj.y), str, font); +} + /*! Draws \p text at position \p x, \p y (expressed in screen coordinates pixels, origin in the upper left corner of the widget). diff --git a/Lab/demo/Lab/CGAL_Lab.cpp b/Lab/demo/Lab/CGAL_Lab.cpp index d54813edda90..85880fb8addd 100644 --- a/Lab/demo/Lab/CGAL_Lab.cpp +++ b/Lab/demo/Lab/CGAL_Lab.cpp @@ -27,6 +27,9 @@ int& code_to_call_before_creation_of_QCoreApplication(int& i) { fmt.setOption(QSurfaceFormat::DebugContext); QSurfaceFormat::setDefaultFormat(fmt); + // for windows + QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL); + return i; } diff --git a/Lab/demo/Lab/MainWindow.cpp b/Lab/demo/Lab/MainWindow.cpp index 7eff95e0b3dd..806f8b912cb0 100644 --- a/Lab/demo/Lab/MainWindow.cpp +++ b/Lab/demo/Lab/MainWindow.cpp @@ -663,6 +663,12 @@ void MainWindow::loadPlugins() } } QString env_path = qgetenv("LAB_DEMO_PLUGINS_PATH"); + QChar separator = QDir::listSeparator(); + #if defined(_WIN32) + QChar separator = ';'; + #else + QChar separator = ':'; + #endif if(!env_path.isEmpty()) { #if defined(_WIN32) QString path = qgetenv("PATH"); From 14a9db6d00af5aae18c2266d7f4af571e42ba7b8 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 19 Aug 2024 12:23:32 +0200 Subject: [PATCH 093/348] weight_modifier was likely to make the weight too small let's keep the minimal weight as given in meshing criteria --- Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 366f1b3a91e8..7f9fface33e5 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 @@ -720,7 +720,10 @@ insert_point(const Bare_point& p, const Weight& w, int dim, const Index& index, typename GT::Construct_weighted_point_3 cwp = c3t3_.triangulation().geom_traits().construct_weighted_point_3_object(); - const Weighted_point wp = cwp(p,w*weight_modifier); + const FT wwm = use_minimal_size() + ? (std::max)(w * weight_modifier, minimal_weight()) + : w * weight_modifier; + const Weighted_point wp = cwp(p, wwm); typename Tr::Locate_type lt; int li, lj; @@ -1182,7 +1185,7 @@ insert_balls(const Vertex_handle& vp, const Weighted_point& vp_wp = c3t3_.triangulation().point(vp); #if ! defined(CGAL_NO_PRECONDITIONS) - if(sp <= minimal_size_) { + if(sp < minimal_size_) { std::stringstream msg; msg.precision(17); msg << "Error: the mesh sizing field is smaller than minimal size "; From 481de41e2f980dbf75cb2175e2133cc17647292f Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 19 Aug 2024 12:24:32 +0200 Subject: [PATCH 094/348] use c++11 for loops --- .../CGAL/Mesh_3/Protect_edges_sizing_field.h | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) 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 7f9fface33e5..a1cd7aca8bc5 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 @@ -867,13 +867,11 @@ smart_insert_point(const Bare_point& p, Weight w, int dim, const Index& index, std::back_inserter(cells_in_conflicts), CGAL::Emptyset_iterator()); - for(typename std::vector::const_iterator - it = cells_in_conflicts.begin(), - end = cells_in_conflicts.end(); it != end; ++it) + for(Cell_handle cit : cells_in_conflicts) { for(int i=0, d=tr.dimension(); i<=d; ++i) { - const Vertex_handle v = (*it)->vertex(i); + const Vertex_handle v = cit->vertex(i); if(c3t3_.triangulation().is_infinite(v)) continue; if(!vertices_in_conflict_zone_set.insert(v).second) @@ -1030,21 +1028,20 @@ insert_balls_on_edges() domain_.get_curves(std::back_inserter(input_features)); // Iterate on edges - for ( typename Input_features::iterator fit = input_features.begin(), - end = input_features.end() ; fit != end ; ++fit ) + for (const Feature_tuple& ft : input_features) { if(forced_stop()) break; - const Curve_index& curve_index = std::get<0>(*fit); + const Curve_index& curve_index = std::get<0>(ft); if ( ! is_treated(curve_index) ) { #if CGAL_MESH_3_PROTECTION_DEBUG & 1 std::cerr << "\n** treat curve #" << curve_index << std::endl; #endif - const Bare_point& p = std::get<1>(*fit).first; - const Bare_point& q = std::get<2>(*fit).first; + const Bare_point& p = std::get<1>(ft).first; + const Bare_point& q = std::get<2>(ft).first; - const Index& p_index = std::get<1>(*fit).second; - const Index& q_index = std::get<2>(*fit).second; + const Index& p_index = std::get<1>(ft).second; + const Index& q_index = std::get<2>(ft).second; Vertex_handle vp,vq; if ( ! domain_.is_loop(curve_index) ) @@ -1487,14 +1484,11 @@ refine_balls() new_sizes.clear(); // Update size of balls - for ( typename std::vector >::iterator - it = new_sizes_copy.begin(), - end = new_sizes_copy.end(); - it != end ; ++it ) + for (const std::pair& it : new_sizes_copy) { if(forced_stop()) break; - const Vertex_handle v = it->first; - const FT new_size = it->second; + const Vertex_handle v = it.first; + const FT new_size = it.second; // Set size of the ball to new value if(use_minimal_size() && new_size < minimal_size_) { if(!is_special(v)) { From 4a35823f1f8bd9a7231e31a55fa5ea40951781e5 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 19 Aug 2024 12:24:59 +0200 Subject: [PATCH 095/348] ease dump code reading --- Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a1cd7aca8bc5..918d48f83245 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 @@ -741,7 +741,7 @@ insert_point(const Bare_point& p, const Weight& w, int dim, const Index& index, std::cerr << "SPECIAL "; std::cerr << "protecting ball "; if(v == Vertex_handle()) - std::cerr << cwp(p,w*weight_modifier); + std::cerr << cwp(p, wwm); else std::cerr << disp_vert(v); From ac9a7013420ba0eadaae15549d48e1d62eebd732 Mon Sep 17 00:00:00 2001 From: Sebastien Loriot Date: Mon, 19 Aug 2024 12:53:37 +0200 Subject: [PATCH 096/348] remove leftover --- Lab/demo/Lab/MainWindow.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Lab/demo/Lab/MainWindow.cpp b/Lab/demo/Lab/MainWindow.cpp index 806f8b912cb0..909a130e46d5 100644 --- a/Lab/demo/Lab/MainWindow.cpp +++ b/Lab/demo/Lab/MainWindow.cpp @@ -664,11 +664,6 @@ void MainWindow::loadPlugins() } QString env_path = qgetenv("LAB_DEMO_PLUGINS_PATH"); QChar separator = QDir::listSeparator(); - #if defined(_WIN32) - QChar separator = ';'; - #else - QChar separator = ':'; - #endif if(!env_path.isEmpty()) { #if defined(_WIN32) QString path = qgetenv("PATH"); From 2bc86f90ca6726a0ad89b3711c4d74ee8475ad36 Mon Sep 17 00:00:00 2001 From: Sebastien Loriot Date: Mon, 19 Aug 2024 12:54:46 +0200 Subject: [PATCH 097/348] keep correct variant --- .../demo/Arrangement_on_surface_2/CurveInputMethods.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp index 87908978b60a..06ebae10a207 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CurveInputMethods.cpp @@ -111,7 +111,7 @@ void CurveInputMethod::beginInput_() static inline void clearPainterPath(QPainterPath& ppath) { - ppath = {}; + ppath.clear(); } From a1a7b652752bf79e92b6f0167a2ea86e139f542d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 19 Aug 2024 13:01:09 +0200 Subject: [PATCH 098/348] remove remaining QT_VERSION_CHECK --- Lab/demo/Lab/MainWindow.cpp | 7 ------- Lab/demo/Lab/Plugins/Mesh_3/Io_image_plugin.cpp | 12 ------------ Lab/demo/Lab/Plugins/PMP/Engrave_text_plugin.cpp | 4 ---- .../Plugins/Surface_mesh/Parameterization_plugin.cpp | 4 ---- Lab/demo/Lab/Viewer.cpp | 8 +------- Three/include/CGAL/Three/TextRenderer.h | 5 ----- Three/include/CGAL/Three/Three.h | 4 ---- 7 files changed, 1 insertion(+), 43 deletions(-) diff --git a/Lab/demo/Lab/MainWindow.cpp b/Lab/demo/Lab/MainWindow.cpp index 909a130e46d5..dd133dbf44f9 100644 --- a/Lab/demo/Lab/MainWindow.cpp +++ b/Lab/demo/Lab/MainWindow.cpp @@ -2644,17 +2644,10 @@ void MainWindow::resetHeader() sceneView->header()->setSectionResizeMode(Scene::RenderingModeColumn, QHeaderView::ResizeToContents); sceneView->header()->setSectionResizeMode(Scene::ABColumn, QHeaderView::Fixed); sceneView->header()->setSectionResizeMode(Scene::VisibleColumn, QHeaderView::Fixed); -#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) sceneView->header()->resizeSection(Scene::ColorColumn, sceneView->header()->fontMetrics().horizontalAdvance("_#_")); sceneView->resizeColumnToContents(Scene::RenderingModeColumn); sceneView->header()->resizeSection(Scene::ABColumn, sceneView->header()->fontMetrics().horizontalAdvance(QString("_AB_"))); sceneView->header()->resizeSection(Scene::VisibleColumn, sceneView->header()->fontMetrics().horizontalAdvance(QString("_View_"))); -#else - sceneView->header()->resizeSection(Scene::ColorColumn, sceneView->header()->fontMetrics().width("_#_")); - sceneView->resizeColumnToContents(Scene::RenderingModeColumn); - sceneView->header()->resizeSection(Scene::ABColumn, sceneView->header()->fontMetrics().width(QString("_AB_"))); - sceneView->header()->resizeSection(Scene::VisibleColumn, sceneView->header()->fontMetrics().width(QString("_View_"))); -#endif } void MainWindow::reset_default_loaders() diff --git a/Lab/demo/Lab/Plugins/Mesh_3/Io_image_plugin.cpp b/Lab/demo/Lab/Plugins/Mesh_3/Io_image_plugin.cpp index 4720d8aa35bd..780511846aa8 100644 --- a/Lab/demo/Lab/Plugins/Mesh_3/Io_image_plugin.cpp +++ b/Lab/demo/Lab/Plugins/Mesh_3/Io_image_plugin.cpp @@ -705,11 +705,7 @@ public Q_SLOTS: // Find the right width for the label to accommodate at least 9999 QFontMetrics metric = x_cubeLabel->fontMetrics(); -#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) x_cubeLabel->setFixedWidth(metric.horizontalAdvance(QString(".9999."))); -#else - x_cubeLabel->setFixedWidth(metric.width(QString(".9999."))); -#endif x_cubeLabel->setText("0"); x_cubeLabel->setValidator(validator); @@ -735,11 +731,7 @@ public Q_SLOTS: // Find the right width for the label to accommodate at least 9999 QFontMetrics metric = y_cubeLabel->fontMetrics(); -#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) y_cubeLabel->setFixedWidth(metric.horizontalAdvance(QString(".9999."))); -#else - y_cubeLabel->setFixedWidth(metric.width(QString(".9999."))); -#endif y_cubeLabel->setText("0"); y_cubeLabel->setValidator(validator); y_slider = new QSlider(mw); @@ -764,11 +756,7 @@ public Q_SLOTS: // Find the right width for the label to accommodate at least 9999 QFontMetrics metric = z_cubeLabel->fontMetrics(); -#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) z_cubeLabel->setFixedWidth(metric.horizontalAdvance(QString(".9999."))); -#else - z_cubeLabel->setFixedWidth(metric.width(QString(".9999."))); -#endif z_cubeLabel->setText("0"); z_cubeLabel->setValidator(validator); z_slider = new QSlider(mw); diff --git a/Lab/demo/Lab/Plugins/PMP/Engrave_text_plugin.cpp b/Lab/demo/Lab/Plugins/PMP/Engrave_text_plugin.cpp index 27a3ba46f0df..1adc2ae81ea1 100644 --- a/Lab/demo/Lab/Plugins/PMP/Engrave_text_plugin.cpp +++ b/Lab/demo/Lab/Plugins/PMP/Engrave_text_plugin.cpp @@ -250,11 +250,7 @@ class Navigation : public CGAL::Qt::GraphicsViewNavigation } case QEvent::Wheel: { QWheelEvent* event = static_cast(ev); -#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) - QPoint pos = event->pos(); -#else QPointF pos = event->position(); -#endif QPointF old_pos = v->mapToScene(pos.x(), pos.y()); if(event->angleDelta().y() <0) v->scale(1.2, 1.2); diff --git a/Lab/demo/Lab/Plugins/Surface_mesh/Parameterization_plugin.cpp b/Lab/demo/Lab/Plugins/Surface_mesh/Parameterization_plugin.cpp index d9ec9149133a..38d593c2b402 100644 --- a/Lab/demo/Lab/Plugins/Surface_mesh/Parameterization_plugin.cpp +++ b/Lab/demo/Lab/Plugins/Surface_mesh/Parameterization_plugin.cpp @@ -142,11 +142,7 @@ class Navigation : public CGAL::Qt::GraphicsViewNavigation } case QEvent::Wheel: { QWheelEvent* event = static_cast(ev); -#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) - QPoint pos = event->pos(); -#else QPointF pos = event->position(); -#endif QPointF old_pos = v->mapToScene(pos.x(), pos.y()); if(event->angleDelta().y() <0) v->scale(1.2, 1.2); diff --git a/Lab/demo/Lab/Viewer.cpp b/Lab/demo/Lab/Viewer.cpp index 70c2b60e8385..b93cb2cb7b1c 100644 --- a/Lab/demo/Lab/Viewer.cpp +++ b/Lab/demo/Lab/Viewer.cpp @@ -1152,13 +1152,7 @@ void Viewer::drawVisualHints() //Prints the displayMessage QFont font = QFont(); QFontMetrics fm(font); - TextItem *message_text = new TextItem(float(10 + - #if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) - fm.horizontalAdvance(d->message)/2) - #else - fm.width(d->message)/2) - #endif - , + TextItem *message_text = new TextItem(float(10 + fm.horizontalAdvance(d->message)/2), float(height()-20), 0, d->message, false, QFont(), Qt::gray ); diff --git a/Three/include/CGAL/Three/TextRenderer.h b/Three/include/CGAL/Three/TextRenderer.h index c5c729ec0329..f04535841f7c 100644 --- a/Three/include/CGAL/Three/TextRenderer.h +++ b/Three/include/CGAL/Three/TextRenderer.h @@ -52,12 +52,7 @@ public : :x(p_x), y(p_y), z(p_z),_3D(p_3D), _is_always_visible(always_visible), m_text(p_text), m_font(font), m_color(p_color) { QFontMetrics fm(m_font); -#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) _width = float(fm.horizontalAdvance(m_text)+2); -#else - _width = float(fm.width(m_text)+2); -#endif - _height = float(fm.height()); } //!\brief Accessor for the string diff --git a/Three/include/CGAL/Three/Three.h b/Three/include/CGAL/Three/Three.h index 3dac95792a3e..e3e6366d5b6a 100644 --- a/Three/include/CGAL/Three/Three.h +++ b/Three/include/CGAL/Three/Three.h @@ -31,11 +31,7 @@ # define THREE_EXPORT Q_DECL_IMPORT #endif -#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) -#define CGAL_QT_SKIP_EMPTY_PARTS QString::SkipEmptyParts -#else #define CGAL_QT_SKIP_EMPTY_PARTS ::Qt::SkipEmptyParts -#endif namespace CGAL{ namespace Three{ From ca2907fbfc0cbfcdf093d73774826a0e858a15ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 20 Aug 2024 10:09:23 +0200 Subject: [PATCH 099/348] avoid creating degenerate planes --- .../test/Intersections_3/test_intersections_Ray_3.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp b/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp index e1d603d4a5e7..6a3dd24bcea0 100644 --- a/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp +++ b/Intersections_3/test/Intersections_3/test_intersections_Ray_3.cpp @@ -161,6 +161,8 @@ struct Ray_3_intersection_tester for(int i=0; i Date: Tue, 20 Aug 2024 10:58:38 +0200 Subject: [PATCH 100/348] vertices(edge) is not available in P3T3 --- Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 918d48f83245..e84e7dd933fe 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 @@ -1563,10 +1563,8 @@ approx_is_too_large(const Edge& e, const bool is_edge_in_complex) const if ( ! is_edge_in_complex ) return false; - const auto& [va, vb] = c3t3_.triangulation().vertices(e); - - const Bare_point& pa = va->point().point(); - const Bare_point& pb = vb->point().point(); + const Bare_point& pa = e.first->vertex(e.second)->point().point(); + const Bare_point& pb = e.first->vertex(e.third)->point().point(); // Construct the geodesic middle point const Curve_index curve_index = c3t3_.curve_index(e); From d5e411648547e7f5ec6d005737d29b6ad2e6425e Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 20 Aug 2024 15:46:21 +0200 Subject: [PATCH 101/348] bug fixes to adapt to the new cgal.geometryfactory.com machine --- .../cgal.geometryfactory.com/bin/cgal_release.py | 2 +- Maintenance/test_handling/create_testresult_page | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py index a835da2c812f..daa87aa614a0 100644 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py +++ b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py @@ -19,7 +19,7 @@ def command(self): """return the command to create and publish the release""" return ( f"PATH=/home/lrineau/bin-cmake3:/bin:/usr/bin:/home/lrineau/bin; cd {self.cwd} &&" - + " /usr/bin/time scl enable rh-git29 -- " + + " /usr/bin/time -v bash -x " + f"$HOME/bin/create_release {self.repo}{self.extra_options} --do-it" ) diff --git a/Maintenance/test_handling/create_testresult_page b/Maintenance/test_handling/create_testresult_page index ca62a5928286..a2825253e703 100755 --- a/Maintenance/test_handling/create_testresult_page +++ b/Maintenance/test_handling/create_testresult_page @@ -103,13 +103,13 @@ sub write_select() print OUTPUTV '\n"; my %results; foreach $_ (glob("results-*.shtml")) { - my $ctime = (stat($_))[10]; - $results{$_} = $ctime; + my $mtime = (stat($_))[9]; + $results{$_} = $mtime; } foreach $_ (sort { $results{$b} <=> $results{$a} } keys %results) { $_ =~ /results-${pattern}(\.\d+)?(-.*|)\.shtml/ || next; - my $ctime = (stat($_))[10]; - my $date = time2str('%a %Y/%m/%d', $ctime); + my $mtime = (stat($_))[9]; + my $date = time2str('%a %Y/%m/%d', $mtime); print OUTPUTV '\n", $filename, $date; From 152fd4d74e5c9ce0a36e5f0ba357511f5a3dbc9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 20 Aug 2024 17:25:32 +0200 Subject: [PATCH 102/348] do no flip if creating a degenerate face --- .../Isotropic_remeshing/remesh_impl.h | 37 +++++++------------ 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index 4d5622c6f0d8..dbb4946edad5 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -1704,28 +1704,21 @@ namespace internal { return true; bool done = false; + while(!degenerate_faces.empty()) { halfedge_descriptor h = *(degenerate_faces.begin()); degenerate_faces.erase(degenerate_faces.begin()); - if (!is_degenerate_triangle_face(face(h, mesh_), mesh_, - parameters::vertex_point_map(vpmap_) - .geom_traits(gt_))) - //this can happen when flipping h has consequences further in the mesh - continue; - - //check that opposite is not also degenerate - degenerate_faces.erase(opposite(h, mesh_)); - if(is_border(h, mesh_)) continue; for(halfedge_descriptor hf : halfedges_around_face(h, mesh_)) { - if(face(opposite(hf, mesh_), mesh_) == boost::graph_traits::null_face()) - continue; + halfedge_descriptor hfo = opposite(hf, mesh_); + + if(is_border(hfo, mesh_)) continue; vertex_descriptor vc = target(hf, mesh_); vertex_descriptor va = target(next(hf, mesh_), mesh_); @@ -1734,7 +1727,6 @@ namespace internal { Vector_3 ac(get(vpmap_,va), get(vpmap_,vc)); if (ab * ac < 0) { - halfedge_descriptor hfo = opposite(hf, mesh_); halfedge_descriptor h_ab = prev(hf, mesh_); halfedge_descriptor h_ca = next(hf, mesh_); @@ -1746,6 +1738,16 @@ namespace internal { if (!is_flip_topologically_allowed(edge(hf, mesh_))) continue; + // geometric condition for flip --> do not create new degenerate face + vertex_descriptor vd = target(next(hfo, mesh_), mesh_); + if ( collinear( get(vpmap_, va), get(vpmap_, vb), get(vpmap_, vd) ) || + collinear( get(vpmap_, va), get(vpmap_, vc), get(vpmap_, vd) ) ) continue; + + // remove opposite face from the queue (if degenerate) + degenerate_faces.erase(hfo); + degenerate_faces.erase(next(hfo, mesh_)); + degenerate_faces.erase(prev(hfo, mesh_)); + CGAL::Euler::flip_edge(hf, mesh_); done = true; @@ -1769,17 +1771,6 @@ namespace internal { short_edges.insert(typename Bimap::value_type(hf, sqlen.value())); } - if(!is_border(hf, mesh_) && - is_degenerate_triangle_face(face(hf, mesh_), mesh_, - parameters::vertex_point_map(vpmap_) - .geom_traits(gt_))) - degenerate_faces.insert(hf); - if(!is_border(hfo, mesh_) && - is_degenerate_triangle_face(face(hfo, mesh_), mesh_, - parameters::vertex_point_map(vpmap_) - .geom_traits(gt_))) - degenerate_faces.insert(hfo); - break; } } From 286be1cfd05d0fe5ce742c44013f1b0ad333792b Mon Sep 17 00:00:00 2001 From: Donghao Chu <799017701@qq.com> Date: Wed, 21 Aug 2024 14:38:16 +0800 Subject: [PATCH 103/348] Pass random instance to GeneratorOnObject in Generic_random_point_generator for consistency --- .../CGAL/Generator/internal/Generic_random_point_generator.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Generator/include/CGAL/Generator/internal/Generic_random_point_generator.h b/Generator/include/CGAL/Generator/internal/Generic_random_point_generator.h index 958915aa6356..2c6bfaf40e6a 100644 --- a/Generator/include/CGAL/Generator/internal/Generic_random_point_generator.h +++ b/Generator/include/CGAL/Generator/internal/Generic_random_point_generator.h @@ -105,7 +105,7 @@ void Generic_random_point_generator: ); // generate the points - GeneratorOnObject pointCreator(object_from_id_map(ids[target])); + GeneratorOnObject pointCreator(object_from_id_map(ids[target]), random); this->d_item = *pointCreator; } From 35b5c086afbc8132c22cdadfda9d824e65d204f0 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Wed, 21 Aug 2024 16:13:38 +0200 Subject: [PATCH 104/348] Add condition to check if CXXFLAGS variable is empty --- Maintenance/test_handling/to_zipped_format | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maintenance/test_handling/to_zipped_format b/Maintenance/test_handling/to_zipped_format index fdf62712b021..9131d1000650 100755 --- a/Maintenance/test_handling/to_zipped_format +++ b/Maintenance/test_handling/to_zipped_format @@ -117,7 +117,7 @@ sub reformat_results($) # if (/BOOST_BIMAP_VERSION = '([^']+)'/) { # $BOOST="$BOOST+bimap"; # } - if (/USING +CXXFLAGS = '([^']*)'/) { + if (/USING +CXXFLAGS = '([^']*)'/ && !$CXXFLAGS) { $CXXFLAGS="$CXXFLAGS $1"; } if (/USING +LDFLAGS = '([^']*)'/) { From 49cb591951e3c56c27974c80a5956c99aa185701 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 21 Aug 2024 16:28:23 +0200 Subject: [PATCH 105/348] move the code to a CMake module --- Installation/CMakeLists.txt | 123 +---------------- .../display-third-party-libs-versions.cmake | 124 ++++++++++++++++++ 2 files changed, 125 insertions(+), 122 deletions(-) create mode 100644 Installation/cmake/modules/display-third-party-libs-versions.cmake diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index 3fcf60bf4d41..2b93d7d1206c 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -479,130 +479,9 @@ if(CMAKE_COMPILER_IS_GNUCXX) endif() endif() -set(LIBRARIES_TO_CHECK - Boost GMP MPFR VTK Qt6 - Eigen3 OpenGR libpointmatcher LEDA MPFI - TBB OpenCV METIS ZLIB GLPK SCIP -) - -function(check_library cgal_3rdparty_lib) - set(QT_NO_CREATE_VERSIONLESS_TARGETS ON) - set(CMAKE_FIND_PACKAGE_QUIET TRUE) - find_package(${cgal_3rdparty_lib} QUIET) - set(CMAKE_FIND_PACKAGE_QUIET FALSE) - if(${cgal_3rdparty_lib}_FOUND) - set(version_var "") - if(${cgal_3rdparty_lib} STREQUAL "Eigen3") - set(version_var ${EIGEN3_VERSION}) - elseif(${cgal_3rdparty_lib} STREQUAL "GMP") - set(GMP_HEADER_PATH "${GMP_INCLUDE_DIR}/gmp.h") - file(READ "${GMP_HEADER_PATH}" GMP_HEADER_CONTENT) - string(REGEX MATCHALL "#include[ \t]+\"([^\"]+)\"" INCLUDED_HEADERS "${GMP_HEADER_CONTENT}") - set(GMP_VERSION_MAJOR "") - set(GMP_VERSION_MINOR "") - set(GMP_VERSION_PATCH "") - foreach(INCLUDED_HEADER ${INCLUDED_HEADERS}) - string(REGEX REPLACE "#include[ \t]+\"([^\"]+)\"" "\\1" GMP_ARCH_HEADER "${INCLUDED_HEADER}") - set(GMP_ARCH_HEADER_PATH "${GMP_INCLUDE_DIR}/${GMP_ARCH_HEADER}") - if(EXISTS "${GMP_ARCH_HEADER_PATH}") - file(READ "${GMP_ARCH_HEADER_PATH}" GMP_ARCH_HEADER_CONTENT) - string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION[ \t]+[0-9]+" GMP_VERSION_MAJOR_LINE "${GMP_ARCH_HEADER_CONTENT}") - string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION_MINOR[ \t]+[0-9]+" GMP_VERSION_MINOR_LINE "${GMP_ARCH_HEADER_CONTENT}") - string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION_PATCHLEVEL[ \t]+[0-9]+" GMP_VERSION_PATCH_LINE "${GMP_ARCH_HEADER_CONTENT}") - if(GMP_VERSION_MAJOR_LINE) - string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_MAJOR "${GMP_VERSION_MAJOR_LINE}") - endif() - if(GMP_VERSION_MINOR_LINE) - string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_MINOR "${GMP_VERSION_MINOR_LINE}") - endif() - if(GMP_VERSION_PATCH_LINE) - string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_PATCH "${GMP_VERSION_PATCH_LINE}") - endif() - if(GMP_VERSION_MAJOR AND GMP_VERSION_MINOR AND GMP_VERSION_PATCH) - set(GMP_VERSION "${GMP_VERSION_MAJOR}.${GMP_VERSION_MINOR}.${GMP_VERSION_PATCH}") - break() - endif() - endif() - endforeach() - if(GMP_VERSION) - set(version_var ${GMP_VERSION}) - endif() - elseif(${cgal_3rdparty_lib} STREQUAL "GLPK") - set(GLPK_HEADER_PATH "${GLPK_INCLUDE_DIR}/glpk.h") - if(EXISTS "${GLPK_HEADER_PATH}") - file(READ "${GLPK_HEADER_PATH}" GLPK_HEADER_CONTENT) - string(REGEX MATCH "#define[ \t]+GLP_MAJOR_VERSION[ \t]+[0-9]+" GLPK_VERSION_MAJOR_LINE "${GLPK_HEADER_CONTENT}") - string(REGEX MATCH "#define[ \t]+GLP_MINOR_VERSION[ \t]+[0-9]+" GLPK_VERSION_MINOR_LINE "${GLPK_HEADER_CONTENT}") - set(GLPK_VERSION_MAJOR "") - set(GLPK_VERSION_MINOR "") - if(GLPK_VERSION_MAJOR_LINE) - string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GLPK_VERSION_MAJOR "${GLPK_VERSION_MAJOR_LINE}") - endif() - if(GLPK_VERSION_MINOR_LINE) - string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GLPK_VERSION_MINOR "${GLPK_VERSION_MINOR_LINE}") - endif() - if(NOT GLPK_VERSION_MAJOR STREQUAL "" AND NOT GLPK_VERSION_MINOR STREQUAL "") - set(GLPK_VERSION "${GLPK_VERSION_MAJOR}.${GLPK_VERSION_MINOR}") - set(version_var ${GLPK_VERSION}) - endif() - endif() - elseif(${cgal_3rdparty_lib} STREQUAL "MPFR" OR ${cgal_3rdparty_lib} STREQUAL "METIS") - set(header_name "") - set(version_macros "") - if(${cgal_3rdparty_lib} STREQUAL "MPFR") - set(header_name "mpfr.h") - set(version_macros "MPFR_VERSION_MAJOR;MPFR_VERSION_MINOR;MPFR_VERSION_PATCHLEVEL") - elseif(${cgal_3rdparty_lib} STREQUAL "METIS") - set(header_name "metis.h") - set(version_macros "METIS_VER_MAJOR;METIS_VER_MINOR;METIS_VER_SUBMINOR") - endif() - - find_path(INCLUDE_DIR - NAMES ${header_name} - PATHS ${${cgal_3rdparty_lib}_INCLUDE_DIRS} - PATH_SUFFIXES ${cgal_3rdparty_lib} - ) - if(INCLUDE_DIR) - set(HEADER_PATH "${INCLUDE_DIR}/${header_name}") +include(display-third-party-libs-versions) - if(EXISTS ${HEADER_PATH}) - file(READ ${HEADER_PATH} HEADER_CONTENT) - - list(GET version_macros 0 major_macro) - list(GET version_macros 1 minor_macro) - list(GET version_macros 2 patchlevel_macro) - - string(REGEX MATCH "#define[ \t]+${major_macro}[ \t]+([0-9]+)" _major_match ${HEADER_CONTENT}) - string(REGEX MATCH "#define[ \t]+${minor_macro}[ \t]+([0-9]+)" _minor_match ${HEADER_CONTENT}) - string(REGEX MATCH "#define[ \t]+${patchlevel_macro}[ \t]+([0-9]+)" _patchlevel_match ${HEADER_CONTENT}) - - string(REGEX REPLACE ".*#define[ \t]+${major_macro}[ \t]+([0-9]+).*" "\\1" VERSION_MAJOR ${_major_match}) - string(REGEX REPLACE ".*#define[ \t]+${minor_macro}[ \t]+([0-9]+).*" "\\1" VERSION_MINOR ${_minor_match}) - string(REGEX REPLACE ".*#define[ \t]+${patchlevel_macro}[ \t]+([0-9]+).*" "\\1" VERSION_PATCHLEVEL ${_patchlevel_match}) - - set(version_var "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCHLEVEL}") - endif() - endif() - elseif(DEFINED ${cgal_3rdparty_lib}_VERSION) - set(version_var ${${cgal_3rdparty_lib}_VERSION}) - elseif(DEFINED ${cgal_3rdparty_lib}_VERSION_STRING) - set(version_var ${${cgal_3rdparty_lib}_VERSION_STRING}) - endif() - - if(version_var) - message(STATUS "Third-party library ${cgal_3rdparty_lib} ${version_var}") - else() - message(STATUS "Third-party library ${cgal_3rdparty_lib} found") - endif() - else() - message(STATUS "Third-party library ${cgal_3rdparty_lib} not found") - endif() -endfunction() - -foreach(cgal_3rdparty_lib IN LISTS LIBRARIES_TO_CHECK) - check_library(${cgal_3rdparty_lib}) -endforeach() message("== Generate version files (DONE) ==\n") #-------------------------------------------------------------------------------------------------- # diff --git a/Installation/cmake/modules/display-third-party-libs-versions.cmake b/Installation/cmake/modules/display-third-party-libs-versions.cmake new file mode 100644 index 000000000000..8e52b3792c67 --- /dev/null +++ b/Installation/cmake/modules/display-third-party-libs-versions.cmake @@ -0,0 +1,124 @@ +set(LIBRARIES_TO_CHECK + Boost GMP MPFR VTK Qt6 + Eigen3 OpenGR libpointmatcher LEDA MPFI + TBB OpenCV METIS ZLIB GLPK SCIP +) + +function(check_library cgal_3rdparty_lib) + set(QT_NO_CREATE_VERSIONLESS_TARGETS ON) + set(CMAKE_FIND_PACKAGE_QUIET TRUE) + find_package(${cgal_3rdparty_lib} QUIET) + set(CMAKE_FIND_PACKAGE_QUIET FALSE) + if(${cgal_3rdparty_lib}_FOUND) + set(version_var "") + if(${cgal_3rdparty_lib} STREQUAL "Eigen3") + set(version_var ${EIGEN3_VERSION}) + elseif(${cgal_3rdparty_lib} STREQUAL "GMP") + set(GMP_HEADER_PATH "${GMP_INCLUDE_DIR}/gmp.h") + file(READ "${GMP_HEADER_PATH}" GMP_HEADER_CONTENT) + string(REGEX MATCHALL "#include[ \t]+\"([^\"]+)\"" INCLUDED_HEADERS "${GMP_HEADER_CONTENT}") + set(GMP_VERSION_MAJOR "") + set(GMP_VERSION_MINOR "") + set(GMP_VERSION_PATCH "") + foreach(INCLUDED_HEADER ${INCLUDED_HEADERS}) + string(REGEX REPLACE "#include[ \t]+\"([^\"]+)\"" "\\1" GMP_ARCH_HEADER "${INCLUDED_HEADER}") + set(GMP_ARCH_HEADER_PATH "${GMP_INCLUDE_DIR}/${GMP_ARCH_HEADER}") + if(EXISTS "${GMP_ARCH_HEADER_PATH}") + file(READ "${GMP_ARCH_HEADER_PATH}" GMP_ARCH_HEADER_CONTENT) + string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION[ \t]+[0-9]+" GMP_VERSION_MAJOR_LINE "${GMP_ARCH_HEADER_CONTENT}") + string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION_MINOR[ \t]+[0-9]+" GMP_VERSION_MINOR_LINE "${GMP_ARCH_HEADER_CONTENT}") + string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION_PATCHLEVEL[ \t]+[0-9]+" GMP_VERSION_PATCH_LINE "${GMP_ARCH_HEADER_CONTENT}") + if(GMP_VERSION_MAJOR_LINE) + string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_MAJOR "${GMP_VERSION_MAJOR_LINE}") + endif() + if(GMP_VERSION_MINOR_LINE) + string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_MINOR "${GMP_VERSION_MINOR_LINE}") + endif() + if(GMP_VERSION_PATCH_LINE) + string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_PATCH "${GMP_VERSION_PATCH_LINE}") + endif() + if(GMP_VERSION_MAJOR AND GMP_VERSION_MINOR AND GMP_VERSION_PATCH) + set(GMP_VERSION "${GMP_VERSION_MAJOR}.${GMP_VERSION_MINOR}.${GMP_VERSION_PATCH}") + break() + endif() + endif() + endforeach() + if(GMP_VERSION) + set(version_var ${GMP_VERSION}) + endif() + elseif(${cgal_3rdparty_lib} STREQUAL "GLPK") + set(GLPK_HEADER_PATH "${GLPK_INCLUDE_DIR}/glpk.h") + if(EXISTS "${GLPK_HEADER_PATH}") + file(READ "${GLPK_HEADER_PATH}" GLPK_HEADER_CONTENT) + string(REGEX MATCH "#define[ \t]+GLP_MAJOR_VERSION[ \t]+[0-9]+" GLPK_VERSION_MAJOR_LINE "${GLPK_HEADER_CONTENT}") + string(REGEX MATCH "#define[ \t]+GLP_MINOR_VERSION[ \t]+[0-9]+" GLPK_VERSION_MINOR_LINE "${GLPK_HEADER_CONTENT}") + set(GLPK_VERSION_MAJOR "") + set(GLPK_VERSION_MINOR "") + if(GLPK_VERSION_MAJOR_LINE) + string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GLPK_VERSION_MAJOR "${GLPK_VERSION_MAJOR_LINE}") + endif() + if(GLPK_VERSION_MINOR_LINE) + string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GLPK_VERSION_MINOR "${GLPK_VERSION_MINOR_LINE}") + endif() + if(NOT GLPK_VERSION_MAJOR STREQUAL "" AND NOT GLPK_VERSION_MINOR STREQUAL "") + set(GLPK_VERSION "${GLPK_VERSION_MAJOR}.${GLPK_VERSION_MINOR}") + set(version_var ${GLPK_VERSION}) + endif() + endif() + elseif(${cgal_3rdparty_lib} STREQUAL "MPFR" OR ${cgal_3rdparty_lib} STREQUAL "METIS") + set(header_name "") + set(version_macros "") + if(${cgal_3rdparty_lib} STREQUAL "MPFR") + set(header_name "mpfr.h") + set(version_macros "MPFR_VERSION_MAJOR;MPFR_VERSION_MINOR;MPFR_VERSION_PATCHLEVEL") + elseif(${cgal_3rdparty_lib} STREQUAL "METIS") + set(header_name "metis.h") + set(version_macros "METIS_VER_MAJOR;METIS_VER_MINOR;METIS_VER_SUBMINOR") + endif() + + find_path(INCLUDE_DIR + NAMES ${header_name} + PATHS ${${cgal_3rdparty_lib}_INCLUDE_DIRS} + PATH_SUFFIXES ${cgal_3rdparty_lib} + ) + + if(INCLUDE_DIR) + set(HEADER_PATH "${INCLUDE_DIR}/${header_name}") + + if(EXISTS ${HEADER_PATH}) + file(READ ${HEADER_PATH} HEADER_CONTENT) + + list(GET version_macros 0 major_macro) + list(GET version_macros 1 minor_macro) + list(GET version_macros 2 patchlevel_macro) + + string(REGEX MATCH "#define[ \t]+${major_macro}[ \t]+([0-9]+)" _major_match ${HEADER_CONTENT}) + string(REGEX MATCH "#define[ \t]+${minor_macro}[ \t]+([0-9]+)" _minor_match ${HEADER_CONTENT}) + string(REGEX MATCH "#define[ \t]+${patchlevel_macro}[ \t]+([0-9]+)" _patchlevel_match ${HEADER_CONTENT}) + + string(REGEX REPLACE ".*#define[ \t]+${major_macro}[ \t]+([0-9]+).*" "\\1" VERSION_MAJOR ${_major_match}) + string(REGEX REPLACE ".*#define[ \t]+${minor_macro}[ \t]+([0-9]+).*" "\\1" VERSION_MINOR ${_minor_match}) + string(REGEX REPLACE ".*#define[ \t]+${patchlevel_macro}[ \t]+([0-9]+).*" "\\1" VERSION_PATCHLEVEL ${_patchlevel_match}) + + set(version_var "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCHLEVEL}") + endif() + endif() + elseif(DEFINED ${cgal_3rdparty_lib}_VERSION) + set(version_var ${${cgal_3rdparty_lib}_VERSION}) + elseif(DEFINED ${cgal_3rdparty_lib}_VERSION_STRING) + set(version_var ${${cgal_3rdparty_lib}_VERSION_STRING}) + endif() + + if(version_var) + message(STATUS "Third-party library ${cgal_3rdparty_lib} ${version_var}") + else() + message(STATUS "Third-party library ${cgal_3rdparty_lib} found") + endif() + else() + message(STATUS "Third-party library ${cgal_3rdparty_lib} not found") + endif() +endfunction() + +foreach(cgal_3rdparty_lib IN LISTS LIBRARIES_TO_CHECK) + check_library(${cgal_3rdparty_lib}) +endforeach() From 2fad60090a94209960df4f4096a6878dc2460a8f Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Thu, 22 Aug 2024 09:13:09 +0200 Subject: [PATCH 106/348] Add sed command to extract third-party library info --- Scripts/developer_scripts/run_testsuite_with_ctest | 1 + 1 file changed, 1 insertion(+) diff --git a/Scripts/developer_scripts/run_testsuite_with_ctest b/Scripts/developer_scripts/run_testsuite_with_ctest index 1785c96e63b4..2ed82f533357 100644 --- a/Scripts/developer_scripts/run_testsuite_with_ctest +++ b/Scripts/developer_scripts/run_testsuite_with_ctest @@ -372,6 +372,7 @@ run_test_on_platform() grep -e "^-- USING " "${CGAL_BINARY_DIR}/installation.log"|sort -u >> $RESULT_FILE #Use sed to get the content of DEBUG or RELEASE CXX FLAGS so that Multiconfiguration platforms do provide their CXXXFLAGS to the testsuite page (that greps USING CXXFLAGS to get info) sed -i -E 's/(^-- USING )(DEBUG|RELEASE) (CXXFLAGS)/\1\3/' $RESULT_FILE + sed -n '/^-- Third-party library /p' "${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 From ae10e2e7d43f276c25a1ee852e715ec45f457c17 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Thu, 22 Aug 2024 10:48:40 +0200 Subject: [PATCH 107/348] Refactor library version extraction logic --- .../display-third-party-libs-versions.cmake | 142 ++++++------------ 1 file changed, 50 insertions(+), 92 deletions(-) diff --git a/Installation/cmake/modules/display-third-party-libs-versions.cmake b/Installation/cmake/modules/display-third-party-libs-versions.cmake index 8e52b3792c67..682c3cf64c4f 100644 --- a/Installation/cmake/modules/display-third-party-libs-versions.cmake +++ b/Installation/cmake/modules/display-third-party-libs-versions.cmake @@ -4,109 +4,67 @@ set(LIBRARIES_TO_CHECK TBB OpenCV METIS ZLIB GLPK SCIP ) +function(get_library_version header_path major_macro minor_macro patchlevel_macro version_var) + if(EXISTS ${header_path}) + file(READ ${header_path} HEADER_CONTENT) + if("${HEADER_CONTENT}" MATCHES "#define[ \t]+${major_macro}[ \t]+([0-9]+)") + set(VERSION_MAJOR ${CMAKE_MATCH_1}) + endif() + if("${HEADER_CONTENT}" MATCHES "#define[ \t]+${minor_macro}[ \t]+([0-9]+)") + set(VERSION_MINOR ${CMAKE_MATCH_1}) + endif() + if("${HEADER_CONTENT}" MATCHES "#define[ \t]+${patchlevel_macro}[ \t]+([0-9]+)") + set(VERSION_PATCHLEVEL ${CMAKE_MATCH_1}) + else() + set(VERSION_PATCHLEVEL "") + endif() + if(VERSION_PATCHLEVEL) + set(${version_var} "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCHLEVEL}" PARENT_SCOPE) + elseif(VERSION_MAJOR AND VERSION_MINOR) + set(${version_var} "${VERSION_MAJOR}.${VERSION_MINOR}" PARENT_SCOPE) + endif() + endif() +endfunction() + function(check_library cgal_3rdparty_lib) set(QT_NO_CREATE_VERSIONLESS_TARGETS ON) set(CMAKE_FIND_PACKAGE_QUIET TRUE) + string(TOUPPER ${cgal_3rdparty_lib} cgal_3rdparty_lib_upper) find_package(${cgal_3rdparty_lib} QUIET) set(CMAKE_FIND_PACKAGE_QUIET FALSE) if(${cgal_3rdparty_lib}_FOUND) set(version_var "") - if(${cgal_3rdparty_lib} STREQUAL "Eigen3") - set(version_var ${EIGEN3_VERSION}) + if(DEFINED ${cgal_3rdparty_lib}_VERSION) + set(version_var ${${cgal_3rdparty_lib}_VERSION}) + elseif(DEFINED ${cgal_3rdparty_lib}_VERSION_STRING) + set(version_var ${${cgal_3rdparty_lib}_VERSION_STRING}) + elseif(DEFINED ${cgal_3rdparty_lib_upper}_VERSION) + set(version_var ${${cgal_3rdparty_lib_upper}_VERSION}) + elseif(DEFINED ${cgal_3rdparty_lib_upper}_VERSION_STRING) + set(version_var ${${cgal_3rdparty_lib_upper}_VERSION_STRING}) elseif(${cgal_3rdparty_lib} STREQUAL "GMP") - set(GMP_HEADER_PATH "${GMP_INCLUDE_DIR}/gmp.h") - file(READ "${GMP_HEADER_PATH}" GMP_HEADER_CONTENT) - string(REGEX MATCHALL "#include[ \t]+\"([^\"]+)\"" INCLUDED_HEADERS "${GMP_HEADER_CONTENT}") - set(GMP_VERSION_MAJOR "") - set(GMP_VERSION_MINOR "") - set(GMP_VERSION_PATCH "") - foreach(INCLUDED_HEADER ${INCLUDED_HEADERS}) - string(REGEX REPLACE "#include[ \t]+\"([^\"]+)\"" "\\1" GMP_ARCH_HEADER "${INCLUDED_HEADER}") - set(GMP_ARCH_HEADER_PATH "${GMP_INCLUDE_DIR}/${GMP_ARCH_HEADER}") - if(EXISTS "${GMP_ARCH_HEADER_PATH}") - file(READ "${GMP_ARCH_HEADER_PATH}" GMP_ARCH_HEADER_CONTENT) - string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION[ \t]+[0-9]+" GMP_VERSION_MAJOR_LINE "${GMP_ARCH_HEADER_CONTENT}") - string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION_MINOR[ \t]+[0-9]+" GMP_VERSION_MINOR_LINE "${GMP_ARCH_HEADER_CONTENT}") - string(REGEX MATCH "#define[ \t]+__GNU_MP_VERSION_PATCHLEVEL[ \t]+[0-9]+" GMP_VERSION_PATCH_LINE "${GMP_ARCH_HEADER_CONTENT}") - if(GMP_VERSION_MAJOR_LINE) - string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_MAJOR "${GMP_VERSION_MAJOR_LINE}") - endif() - if(GMP_VERSION_MINOR_LINE) - string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_MINOR "${GMP_VERSION_MINOR_LINE}") - endif() - if(GMP_VERSION_PATCH_LINE) - string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GMP_VERSION_PATCH "${GMP_VERSION_PATCH_LINE}") - endif() - if(GMP_VERSION_MAJOR AND GMP_VERSION_MINOR AND GMP_VERSION_PATCH) - set(GMP_VERSION "${GMP_VERSION_MAJOR}.${GMP_VERSION_MINOR}.${GMP_VERSION_PATCH}") - break() + set(version_var "") + get_library_version("${GMP_INCLUDE_DIR}/gmp.h" "__GNU_MP_VERSION" "__GNU_MP_VERSION_MINOR" "__GNU_MP_VERSION_PATCHLEVEL" version_var) + if(NOT version_var) + file(READ "${GMP_INCLUDE_DIR}/gmp.h" GMP_HEADER_CONTENT) + string(REGEX MATCHALL "#include[ \t]+\"([^\"]+)\"" INCLUDED_HEADERS "${GMP_HEADER_CONTENT}") + foreach(INCLUDED_HEADER ${INCLUDED_HEADERS}) + string(REGEX REPLACE "#include[ \t]+\"([^\"]+)\"" "\\1" GMP_ARCH_HEADER "${INCLUDED_HEADER}") + set(GMP_ARCH_HEADER_PATH "${GMP_INCLUDE_DIR}/${GMP_ARCH_HEADER}") + if(EXISTS ${GMP_ARCH_HEADER_PATH}) + get_library_version("${GMP_ARCH_HEADER_PATH}" "__GNU_MP_VERSION" "__GNU_MP_VERSION_MINOR" "__GNU_MP_VERSION_PATCHLEVEL" version_var) + if(version_var) + break() + endif() endif() - endif() - endforeach() - if(GMP_VERSION) - set(version_var ${GMP_VERSION}) + endforeach() endif() elseif(${cgal_3rdparty_lib} STREQUAL "GLPK") - set(GLPK_HEADER_PATH "${GLPK_INCLUDE_DIR}/glpk.h") - if(EXISTS "${GLPK_HEADER_PATH}") - file(READ "${GLPK_HEADER_PATH}" GLPK_HEADER_CONTENT) - string(REGEX MATCH "#define[ \t]+GLP_MAJOR_VERSION[ \t]+[0-9]+" GLPK_VERSION_MAJOR_LINE "${GLPK_HEADER_CONTENT}") - string(REGEX MATCH "#define[ \t]+GLP_MINOR_VERSION[ \t]+[0-9]+" GLPK_VERSION_MINOR_LINE "${GLPK_HEADER_CONTENT}") - set(GLPK_VERSION_MAJOR "") - set(GLPK_VERSION_MINOR "") - if(GLPK_VERSION_MAJOR_LINE) - string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GLPK_VERSION_MAJOR "${GLPK_VERSION_MAJOR_LINE}") - endif() - if(GLPK_VERSION_MINOR_LINE) - string(REGEX REPLACE ".*[ \t]+([0-9]+).*" "\\1" GLPK_VERSION_MINOR "${GLPK_VERSION_MINOR_LINE}") - endif() - if(NOT GLPK_VERSION_MAJOR STREQUAL "" AND NOT GLPK_VERSION_MINOR STREQUAL "") - set(GLPK_VERSION "${GLPK_VERSION_MAJOR}.${GLPK_VERSION_MINOR}") - set(version_var ${GLPK_VERSION}) - endif() - endif() - elseif(${cgal_3rdparty_lib} STREQUAL "MPFR" OR ${cgal_3rdparty_lib} STREQUAL "METIS") - set(header_name "") - set(version_macros "") - if(${cgal_3rdparty_lib} STREQUAL "MPFR") - set(header_name "mpfr.h") - set(version_macros "MPFR_VERSION_MAJOR;MPFR_VERSION_MINOR;MPFR_VERSION_PATCHLEVEL") - elseif(${cgal_3rdparty_lib} STREQUAL "METIS") - set(header_name "metis.h") - set(version_macros "METIS_VER_MAJOR;METIS_VER_MINOR;METIS_VER_SUBMINOR") - endif() - - find_path(INCLUDE_DIR - NAMES ${header_name} - PATHS ${${cgal_3rdparty_lib}_INCLUDE_DIRS} - PATH_SUFFIXES ${cgal_3rdparty_lib} - ) - - if(INCLUDE_DIR) - set(HEADER_PATH "${INCLUDE_DIR}/${header_name}") - - if(EXISTS ${HEADER_PATH}) - file(READ ${HEADER_PATH} HEADER_CONTENT) - - list(GET version_macros 0 major_macro) - list(GET version_macros 1 minor_macro) - list(GET version_macros 2 patchlevel_macro) - - string(REGEX MATCH "#define[ \t]+${major_macro}[ \t]+([0-9]+)" _major_match ${HEADER_CONTENT}) - string(REGEX MATCH "#define[ \t]+${minor_macro}[ \t]+([0-9]+)" _minor_match ${HEADER_CONTENT}) - string(REGEX MATCH "#define[ \t]+${patchlevel_macro}[ \t]+([0-9]+)" _patchlevel_match ${HEADER_CONTENT}) - - string(REGEX REPLACE ".*#define[ \t]+${major_macro}[ \t]+([0-9]+).*" "\\1" VERSION_MAJOR ${_major_match}) - string(REGEX REPLACE ".*#define[ \t]+${minor_macro}[ \t]+([0-9]+).*" "\\1" VERSION_MINOR ${_minor_match}) - string(REGEX REPLACE ".*#define[ \t]+${patchlevel_macro}[ \t]+([0-9]+).*" "\\1" VERSION_PATCHLEVEL ${_patchlevel_match}) - - set(version_var "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCHLEVEL}") - endif() - endif() - elseif(DEFINED ${cgal_3rdparty_lib}_VERSION) - set(version_var ${${cgal_3rdparty_lib}_VERSION}) - elseif(DEFINED ${cgal_3rdparty_lib}_VERSION_STRING) - set(version_var ${${cgal_3rdparty_lib}_VERSION_STRING}) + get_library_version("${GLPK_INCLUDE_DIR}/glpk.h" "GLP_MAJOR_VERSION" "GLP_MINOR_VERSION" "" version_var) + elseif(${cgal_3rdparty_lib} STREQUAL "MPFR") + get_library_version("${MPFR_INCLUDE_DIR}/mpfr.h" "MPFR_VERSION_MAJOR" "MPFR_VERSION_MINOR" "MPFR_VERSION_PATCHLEVEL" version_var) + elseif(${cgal_3rdparty_lib} STREQUAL "METIS") + get_library_version("${METIS_INCLUDE_DIR}/metis.h" "METIS_VER_MAJOR" "METIS_VER_MINOR" "METIS_VER_SUBMINOR" version_var) endif() if(version_var) From 44053f5c7b5dfd07dd7404fb05dde558d6e2a556 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Fri, 23 Aug 2024 09:31:34 +0200 Subject: [PATCH 108/348] Update library versions and add new third-party libraries --- .../display-third-party-libs-versions.cmake | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Installation/cmake/modules/display-third-party-libs-versions.cmake b/Installation/cmake/modules/display-third-party-libs-versions.cmake index 682c3cf64c4f..f9d6b05b5e8f 100644 --- a/Installation/cmake/modules/display-third-party-libs-versions.cmake +++ b/Installation/cmake/modules/display-third-party-libs-versions.cmake @@ -1,7 +1,9 @@ set(LIBRARIES_TO_CHECK - Boost GMP MPFR VTK Qt6 - Eigen3 OpenGR libpointmatcher LEDA MPFI - TBB OpenCV METIS ZLIB GLPK SCIP + Eigen3 Qt6 TBB OpenMesh Boost + GMP Threads SuiteSparse MPFI METIS + VTK SCIP OSQP LASLIB GLPK + ITT Ceres MPFR libpointmatcher ITK + OpenGR OpenCV ZLIB ) function(get_library_version header_path major_macro minor_macro patchlevel_macro version_var) @@ -20,7 +22,7 @@ function(get_library_version header_path major_macro minor_macro patchlevel_macr endif() if(VERSION_PATCHLEVEL) set(${version_var} "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCHLEVEL}" PARENT_SCOPE) - elseif(VERSION_MAJOR AND VERSION_MINOR) + elseif(VERSION_MAJOR GREATER_EQUAL 0 OR VERSION_MINOR GREATER_EQUAL 0) set(${version_var} "${VERSION_MAJOR}.${VERSION_MINOR}" PARENT_SCOPE) endif() endif() @@ -65,8 +67,11 @@ function(check_library cgal_3rdparty_lib) get_library_version("${MPFR_INCLUDE_DIR}/mpfr.h" "MPFR_VERSION_MAJOR" "MPFR_VERSION_MINOR" "MPFR_VERSION_PATCHLEVEL" version_var) elseif(${cgal_3rdparty_lib} STREQUAL "METIS") get_library_version("${METIS_INCLUDE_DIR}/metis.h" "METIS_VER_MAJOR" "METIS_VER_MINOR" "METIS_VER_SUBMINOR" version_var) + elseif(${cgal_3rdparty_lib} STREQUAL "SuiteSparse") + get_library_version("${SuiteSparse_Config_INCLUDE_DIR}/SuiteSparse_config.h" "SUITESPARSE_MAIN_VERSION" "SUITESPARSE_SUB_VERSION" "SUITESPARSE_SUBSUB_VERSION" version_var) + elseif(${cgal_3rdparty_lib} STREQUAL "LASLIB") + get_library_version("${LASLIB_INCLUDE_DIR}/lasdefinitions.hpp" "LAS_TOOLS_VERSION" "" "" version_var) endif() - if(version_var) message(STATUS "Third-party library ${cgal_3rdparty_lib} ${version_var}") else() From 13b5f3676a2a7d5ce8df2ce4cac18535e983bc05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 23 Aug 2024 10:09:10 +0200 Subject: [PATCH 109/348] remove extra wording --- .../doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt index e8d94344cfc1..49823e27292d 100644 --- a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt +++ b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt @@ -156,7 +156,7 @@ setting the named parameter `remesh_boundaries` to `false`. It is also possible to define the polyline features as the ones stored as complex edges in a `Mesh_complex_3_in_triangulation_3` -(e.g., generated by the \ref PkgMesh3 package mesh generation algorithms). +(e.g., generated by the \ref PkgMesh3 package). \cgalExample{Tetrahedral_remeshing/mesh_and_remesh_c3t3.cpp } From 483d43cdf2c0ab390f5b862860d38bc2e41dbff4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 23 Aug 2024 11:12:01 +0200 Subject: [PATCH 110/348] use default that is fine for most of the packages --- Scripts/developer_scripts/cgal_create_package_dir.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Scripts/developer_scripts/cgal_create_package_dir.py b/Scripts/developer_scripts/cgal_create_package_dir.py index 90900b1304d3..e2445915d5b0 100755 --- a/Scripts/developer_scripts/cgal_create_package_dir.py +++ b/Scripts/developer_scripts/cgal_create_package_dir.py @@ -26,9 +26,8 @@ doxystring = \ r"""@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS} + PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - Put title of project here" -INPUT = ${CMAKE_SOURCE_DIR}/PACKAGENAME/doc/PACKAGENAME/ \ - ${CMAKE_SOURCE_DIR}/PACKAGENAME/include """ descrstring = \ From 02a38472a14dd731ae399276bed877d446a87d55 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 23 Aug 2024 15:43:53 +0200 Subject: [PATCH 111/348] reformat the REUSE.toml file (readability), add natvis files --- Installation/REUSE.toml | 35 +++++++++++++++++++++++++++++++++-- REUSE.toml | 41 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/Installation/REUSE.toml b/Installation/REUSE.toml index 4ceda7b22792..34a4baee4359 100644 --- a/Installation/REUSE.toml +++ b/Installation/REUSE.toml @@ -4,13 +4,44 @@ SPDX-PackageSupplier = "CGAL Editorial Board " SPDX-PackageDownloadLocation = "https://github.com/CGAL/cgal" [[annotations]] -path = ["**.cmake", "**.md", "doc/**", "doc_html/**", "scripts/**", "developer_scripts/**", "package_info/**", "demo/**", "examples/**", "src/**", "test/**", "benchmarks/**", "benchmark/**", "data/**", "cmake/**"] +path = [ + "**.cmake", + "**.md", + "doc/**", + "doc_html/**", + "scripts/**", + "developer_scripts/**", + "package_info/**", + "demo/**", + "examples/**", + "src/**", + "test/**", + "benchmarks/**", + "benchmark/**", + "data/**", + "cmake/**", + "**/*.natvis", +] precedence = "aggregate" SPDX-FileCopyrightText = "1995-2024 The CGAL Project" SPDX-License-Identifier = "CC0-1.0" [[annotations]] -path = ["REUSE.toml", "lib/cmake/CGAL/CGALConfig-installation-dirs.cmake.in", "include/CGAL/Qt/ImageInterface.ui", "include/CGAL/Qt/resources/qglviewer-icon.xpm", "AUTHORS", "CMakeLists.txt", "README", "auxiliary/cgal_create_cmake_script.1", "auxiliary/gmp/README", "include/CGAL/license/gpl_package_list.txt", "auxiliary/cgal_app.icns", "copyright", "VERSION"] +path = [ + "REUSE.toml", + "lib/cmake/CGAL/CGALConfig-installation-dirs.cmake.in", + "include/CGAL/Qt/ImageInterface.ui", + "include/CGAL/Qt/resources/qglviewer-icon.xpm", + "AUTHORS", + "CMakeLists.txt", + "README", + "auxiliary/cgal_create_cmake_script.1", + "auxiliary/gmp/README", + "include/CGAL/license/gpl_package_list.txt", + "auxiliary/cgal_app.icns", + "copyright", + "VERSION", +] precedence = "aggregate" SPDX-FileCopyrightText = "1995-2024 The CGAL Project" SPDX-License-Identifier = "CC0-1.0" diff --git a/REUSE.toml b/REUSE.toml index a36f899b03c7..5cca2b91384e 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -4,13 +4,50 @@ SPDX-PackageSupplier = "CGAL Editorial Board " SPDX-PackageDownloadLocation = "https://github.com/CGAL/cgal" [[annotations]] -path = [".**", "**.cmake", "**.md", ".github/**", "Maintenance/**", "**/TODO", "**/doc/**", "**/deb/**", "**/applications/**", "**/doc_html/**", "**/scripts/**", "**/developer_scripts/**", "**/demo/**", "**/examples/**", "**/src/**", "**/test/**", "**/benchmarks/**", "**/benchmark/**", "**/package_info/**", "**/data/**", "**/cmake/**"] +path = [ + ".**", + "**.cmake", + "**.md", + ".github/**", + "Maintenance/**", + "**/TODO", + "**/doc/**", + "**/deb/**", + "**/applications/**", + "**/doc_html/**", + "**/scripts/**", + "**/developer_scripts/**", + "**/demo/**", + "**/examples/**", + "**/src/**", + "**/test/**", + "**/benchmarks/**", + "**/benchmark/**", + "**/package_info/**", + "**/data/**", + "**/cmake/**", + "**/*.natvis", +] precedence = "aggregate" SPDX-FileCopyrightText = "1995-2024 The CGAL Project" SPDX-License-Identifier = "CC0-1.0" [[annotations]] -path = ["REUSE.toml", "CMakeLists.txt", "cmake_uninstall.cmake.in", "GraphicsView/include/CGAL/Qt/ImageInterface.ui", "GraphicsView/include/CGAL/Qt/resources/qglviewer-icon.xpm", "Installation/AUTHORS", "Installation/CMakeLists.txt", "Installation/README", "Installation/auxiliary/cgal_create_cmake_script.1", "Installation/auxiliary/gmp/README", "Installation/include/CGAL/license/gpl_package_list.txt", "MacOSX/auxiliary/cgal_app.icns", "copyright"] +path = [ + "REUSE.toml", + "CMakeLists.txt", + "cmake_uninstall.cmake.in", + "GraphicsView/include/CGAL/Qt/ImageInterface.ui", + "GraphicsView/include/CGAL/Qt/resources/qglviewer-icon.xpm", + "Installation/AUTHORS", + "Installation/CMakeLists.txt", + "Installation/README", + "Installation/auxiliary/cgal_create_cmake_script.1", + "Installation/auxiliary/gmp/README", + "Installation/include/CGAL/license/gpl_package_list.txt", + "MacOSX/auxiliary/cgal_app.icns", + "copyright", +] precedence = "aggregate" SPDX-FileCopyrightText = "1995-2024 The CGAL Project" SPDX-License-Identifier = "CC0-1.0" From ac46e562361650d6613549deecb0f5c9afd0cd66 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 23 Aug 2024 15:49:20 +0200 Subject: [PATCH 112/348] fix SELinux contexts so that the web server can offer the files --- Scripts/developer_scripts/run_doxygen_testsuite | 1 + 1 file changed, 1 insertion(+) diff --git a/Scripts/developer_scripts/run_doxygen_testsuite b/Scripts/developer_scripts/run_doxygen_testsuite index ec3a58556203..271fb9699aa7 100755 --- a/Scripts/developer_scripts/run_doxygen_testsuite +++ b/Scripts/developer_scripts/run_doxygen_testsuite @@ -65,6 +65,7 @@ bash -$- ./process_doc.sh /home/cgal-testsuite/bin/doxygen_1_8_13 /home/cgal-tes if head -2 ../../.scm-branch | grep -q cgal/master; then rsync -a --delete "/srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID}/output2/" /srv/CGAL/www/doc/master/ fi +restorecon -R /srv/CGAL/www/doc/master/ /srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID} rm -rf "${CGAL_DOC_BUILD}" # Then gzip the log file, to save space exec From 7838b95b948fadfb25b4d49ad1ae46b1d04e2362 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 23 Aug 2024 15:55:55 +0200 Subject: [PATCH 113/348] generate review of the code --- .../developer_scripts/run_doxygen_testsuite | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Scripts/developer_scripts/run_doxygen_testsuite b/Scripts/developer_scripts/run_doxygen_testsuite index 271fb9699aa7..22d9aab978ff 100755 --- a/Scripts/developer_scripts/run_doxygen_testsuite +++ b/Scripts/developer_scripts/run_doxygen_testsuite @@ -6,7 +6,7 @@ cd /home/cgal-testsuite # Rotate log files on one month: the logfile name contains the number of # the day -LOGFILE=$PWD/doxygen_testsuite-`date '+%d'`.log +LOGFILE=$PWD/doxygen_testsuite-$(date '+%d').log exec > "$LOGFILE" @@ -31,8 +31,8 @@ if [ -r "${CGAL_DOC_BUILD}" ]; then rm -rf "${CGAL_DOC_BUILD}" fi -mkdir ${CGAL_DOC_BUILD} -cd ${CGAL_DOC_BUILD} +mkdir "${CGAL_DOC_BUILD}" +cd "${CGAL_DOC_BUILD}" if [ -r "LATEST" ]; then rm -rf LATEST @@ -44,12 +44,12 @@ if [ ! -f "LATEST" ]; then error "COULD NOT DOWNLOAD LATEST!" fi -for i in `cat LATEST` +for i in $(cat LATEST) do CGAL_LOCATION="${CGAL_URL}/${i}"; CGAL_ZIPFILE="${i}"; done -CGAL_RELEASE_ID=`echo $CGAL_ZIPFILE | sed "s/.tar.gz//"` +CGAL_RELEASE_ID=$(echo "$CGAL_ZIPFILE" | sed "s/.tar.gz//") curl ${CURL_OPTS} "${CGAL_LOCATION}" tar xvzf "${CGAL_ZIPFILE}" && rm "${CGAL_ZIPFILE}" @@ -60,12 +60,16 @@ cd "${CGAL_RELEASE_ID}" PATH=/home/cgal-testsuite/local/bin:$PATH export PATH -cd "$PWD/doc/scripts" +cd "${PWD}/doc/scripts" bash -$- ./process_doc.sh /home/cgal-testsuite/bin/doxygen_1_8_13 /home/cgal-testsuite/bin/doxygen_1_9_6 /srv/CGAL/www/Members/Manual_doxygen_test if head -2 ../../.scm-branch | grep -q cgal/master; then rsync -a --delete "/srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID}/output2/" /srv/CGAL/www/doc/master/ fi -restorecon -R /srv/CGAL/www/doc/master/ /srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID} +if sestatus &>/dev/null && [ -d "/srv/CGAL/www/doc/master/" ] && [ -d "/srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID}" ]; then + restorecon -R /srv/CGAL/www/doc/master/ /srv/CGAL/www/Members/Manual_doxygen_test/${CGAL_RELEASE_ID} || error "restorecon command failed" +else + error "SELinux is not enabled or the paths do not exist" +fi rm -rf "${CGAL_DOC_BUILD}" # Then gzip the log file, to save space exec From 2a1e5ee9e703a2f6432d53ab79e6b239bc49983e Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 23 Aug 2024 16:42:03 +0200 Subject: [PATCH 114/348] only display the 3rd-party versions with CGAL_TEST_SUITE @SaillantNicolas I have pushed this commit directly. --- Installation/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index 2b93d7d1206c..210d11f6915e 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -480,7 +480,9 @@ if(CMAKE_COMPILER_IS_GNUCXX) endif() -include(display-third-party-libs-versions) +if(CGAL_TEST_SUITE) + include(display-third-party-libs-versions) +endif() message("== Generate version files (DONE) ==\n") #-------------------------------------------------------------------------------------------------- From 9d2670f017601dacf08181c165ee9cf919c27d4e Mon Sep 17 00:00:00 2001 From: Giles Bathgate Date: Sun, 25 Aug 2024 18:58:24 +0100 Subject: [PATCH 115/348] Remove commented out code --- .../External_structure_builder.h | 47 ------------------- 1 file changed, 47 deletions(-) diff --git a/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h b/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h index 8c4c546590d4..7bbf805248b5 100644 --- a/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h +++ b/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h @@ -77,51 +77,7 @@ class External_structure_builder : public Modifier_base sedge2sface; - /* - SFace_iterator sfi; - CGAL_forall_sfaces(sfi, *sncp) { - SFace_cycle_iterator sfc; - for(sfc = sfi->sface_cycles_begin(); sfc != sfi->sface_cycles_end(); ++sfc) { - if(sfc.is_shalfedge()){ - SHalfedge_around_sface_circulator eaf(sfc), end(eaf); - CGAL_For_all(eaf,end) { - SHalfedge_handle se(eaf); - sedge2sface[eaf] = sfi; - } - } - } - } - - // CGAL::SNC_io_parser O0(std::cerr, *sncp, false); - // O0.print(); - - SHalfedge_iterator sei; - CGAL_forall_shalfedges(sei, *sncp) { - SHalfedge_handle se(sei); - if(sedge2sface[se] == SFace_handle()) { - SM_decorator SD(&*sei->source()->source()); - SFace_handle sf_new = SD.new_sface(); - sf_new->mark() = sei->incident_sface()->mark(); - - CGAL_NEF_TRACEN("new entry sedge " << sei->source()->point() - << "->" << sei->twin()->source()->point() - << " at " << sei->source()->source()->point()); - - SD.link_as_face_cycle(sei, sf_new); - - SHalfedge_around_sface_circulator eaf(se), end(eaf); - CGAL_For_all(eaf,end) { - SHalfedge_handle se(eaf); - sedge2sface[eaf] = sf_new; - } - - // TODO: relink inner sface cycles - } - } - */ SNC_point_locator* old_pl = pl; pl = pl->clone(); sncpl.pl = pl; @@ -129,9 +85,6 @@ class External_structure_builder : public Modifier_base Ox(std::cerr, *sncp, false); - // Ox.print(); } }; From 44b92c11dbe57e5cc12b1ede80e295d8c248caee Mon Sep 17 00:00:00 2001 From: Giles Bathgate Date: Sun, 25 Aug 2024 18:58:55 +0100 Subject: [PATCH 116/348] Move the delete to the end of the function --- .../CGAL/Convex_decomposition_3/External_structure_builder.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h b/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h index 7bbf805248b5..f43609baafdb 100644 --- a/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h +++ b/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h @@ -81,10 +81,10 @@ class External_structure_builder : public Modifier_baseclone(); sncpl.pl = pl; - delete old_pl; SNC_external_structure C(*sncp,pl); C.clear_external_structure(); C.build_external_structure(); + delete old_pl; } }; From 8ef79af9e244abe0937cd45c5e10584c9350d4b2 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 26 Aug 2024 09:49:27 +0200 Subject: [PATCH 117/348] Add ITT library version --- .../cmake/modules/display-third-party-libs-versions.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Installation/cmake/modules/display-third-party-libs-versions.cmake b/Installation/cmake/modules/display-third-party-libs-versions.cmake index f9d6b05b5e8f..b9550dbaa4fc 100644 --- a/Installation/cmake/modules/display-third-party-libs-versions.cmake +++ b/Installation/cmake/modules/display-third-party-libs-versions.cmake @@ -71,6 +71,8 @@ function(check_library cgal_3rdparty_lib) get_library_version("${SuiteSparse_Config_INCLUDE_DIR}/SuiteSparse_config.h" "SUITESPARSE_MAIN_VERSION" "SUITESPARSE_SUB_VERSION" "SUITESPARSE_SUBSUB_VERSION" version_var) elseif(${cgal_3rdparty_lib} STREQUAL "LASLIB") get_library_version("${LASLIB_INCLUDE_DIR}/lasdefinitions.hpp" "LAS_TOOLS_VERSION" "" "" version_var) + elseif(${cgal_3rdparty_lib} STREQUAL "ITT") + get_library_version("${ITT_INCLUDE_DIR}/ittnotify.h" "ITT_MAJOR" "ITT_MINOR" "" version_var) endif() if(version_var) message(STATUS "Third-party library ${cgal_3rdparty_lib} ${version_var}") From c7ce0e43b8c1729e74ab436bcd7a6c1f69e41a42 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Fri, 23 Aug 2024 14:18:56 +0200 Subject: [PATCH 118/348] remove boundary degenerate faces --- .../internal/Isotropic_remeshing/remesh_impl.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index dbb4946edad5..8750a1798e4f 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -1711,7 +1711,10 @@ namespace internal { degenerate_faces.erase(degenerate_faces.begin()); if(is_border(h, mesh_)) + { + CGAL::Euler::remove_face(h, mesh_); continue; + } for(halfedge_descriptor hf : halfedges_around_face(h, mesh_)) From eabb4dc756f8f79558a9af05434242eba84085b1 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 26 Aug 2024 10:21:41 +0200 Subject: [PATCH 119/348] remove border degenerate faces, fixed --- .../internal/Isotropic_remeshing/remesh_impl.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index 8750a1798e4f..ae97e8836b8a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -1710,7 +1710,7 @@ namespace internal { halfedge_descriptor h = *(degenerate_faces.begin()); degenerate_faces.erase(degenerate_faces.begin()); - if(is_border(h, mesh_)) + if(is_border(opposite(h, mesh_), mesh_)) { CGAL::Euler::remove_face(h, mesh_); continue; @@ -1721,8 +1721,11 @@ namespace internal { { halfedge_descriptor hfo = opposite(hf, mesh_); - if(is_border(hfo, mesh_)) continue; - + if(is_border(hfo, mesh_)) + { + CGAL::Euler::remove_face(h, mesh_); + break; + } vertex_descriptor vc = target(hf, mesh_); vertex_descriptor va = target(next(hf, mesh_), mesh_); vertex_descriptor vb = target(next(next(hf, mesh_), mesh_), mesh_); From cf30f4dfab94a732c93f1cff3a5a9d5584343132 Mon Sep 17 00:00:00 2001 From: Giles Bathgate Date: Mon, 26 Aug 2024 09:29:21 +0100 Subject: [PATCH 120/348] Remove unused hashmap --- .../CGAL/Convex_decomposition_3/External_structure_builder.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h b/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h index f43609baafdb..c6ecee86c0b6 100644 --- a/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h +++ b/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h @@ -76,8 +76,6 @@ class External_structure_builder : public Modifier_base sedge2sface; SNC_point_locator* old_pl = pl; pl = pl->clone(); sncpl.pl = pl; From 62cb850d5bcd70ac7871deed9f7c1bad92870fb6 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 26 Aug 2024 15:38:45 +0200 Subject: [PATCH 121/348] create_new_release with SELinux: call restorecon --- Scripts/developer_scripts/create_new_release | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Scripts/developer_scripts/create_new_release b/Scripts/developer_scripts/create_new_release index 692ed94e7fa4..2b0e0f2ff2b6 100755 --- a/Scripts/developer_scripts/create_new_release +++ b/Scripts/developer_scripts/create_new_release @@ -323,6 +323,9 @@ if [ -n "$DO_PUBLIC" ]; then zip -q -r ${public_release_name}-library.zip ${public_release_name} mv ${public_release_name}*.tar.xz "${HTML_DIR}/${release_name}-public/" mv ${public_release_name}*.zip "${HTML_DIR}/${release_name}-public/" + if command -v sestatus >/dev/null 2>&1; then + sestatus && restorecon -R "${HTML_DIR}/${release_name}-public" + fi rm -f "$HTML_DIR/CGAL-last-public" ln -s "${release_name}-public" "$HTML_DIR/CGAL-last-public" fi From 328c919d673723ef3f6f9965cdc686f15e43eadc Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 25 Jul 2024 10:54:30 +0200 Subject: [PATCH 122/348] wip CGAL_OpenMesh_support --- .../cmake/modules/CGAL_OpenMesh_support.cmake | 23 +++++++++++++++++++ Installation/cmake/modules/FindOpenMesh.cmake | 14 +++++------ Installation/cmake/modules/UseOpenMesh.cmake | 2 ++ 3 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 Installation/cmake/modules/CGAL_OpenMesh_support.cmake diff --git a/Installation/cmake/modules/CGAL_OpenMesh_support.cmake b/Installation/cmake/modules/CGAL_OpenMesh_support.cmake new file mode 100644 index 000000000000..1154b2f2cffa --- /dev/null +++ b/Installation/cmake/modules/CGAL_OpenMesh_support.cmake @@ -0,0 +1,23 @@ + +if(OpenMesh_FOUND AND NOT TARGET CGAL::OpenMesh_support) + + add_library(CGAL::OpenMesh_support UNKNOWN IMPORTED) + + set_target_properties(OpenMesh::OpenMesh PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "CGAL_USE_OPENMESH;NOMINMAX;_USE_MATH_DEFINES" + INTERFACE_INCLUDE_DIRECTORIES "${OPENMESH_INCLUDE_DIRS}") + + if(OPENMESH_CORE_LIBRARY_RELEASE) + set_property(TARGET OpenMesh::OpenMesh APPEND PROPERTY + IMPORTED_CONFIGURATIONS RELEASE) + set_target_properties(OpenMesh::OpenMesh PROPERTIES + IMPORTED_LOCATION_RELEASE "${OPENMESH_CORE_LIBRARY_RELEASE}") + endif() + + if(OPENMESH_CORE_LIBRARY_DEBUG) + set_property(TARGET OpenMesh::OpenMesh APPEND PROPERTY + IMPORTED_CONFIGURATIONS DEBUG) + set_target_properties(OpenMesh::OpenMesh PROPERTIES + IMPORTED_LOCATION_DEBUG "${OPENMESH_CORE_LIBRARY_DEBUG}") + endif() +endif() diff --git a/Installation/cmake/modules/FindOpenMesh.cmake b/Installation/cmake/modules/FindOpenMesh.cmake index df51ed716ce6..1c9d2198ed9c 100644 --- a/Installation/cmake/modules/FindOpenMesh.cmake +++ b/Installation/cmake/modules/FindOpenMesh.cmake @@ -65,28 +65,28 @@ if (NOT OpenMesh_FOUND) #target OpenMesh::OpenMesh if(OpenMesh_FOUND AND NOT TARGET OpenMesh::OpenMesh) - add_library(OpenMesh::OpenMesh UNKNOWN IMPORTED) + add_library(CGAL_OpenMesh::CGAL_OpenMesh UNKNOWN IMPORTED) if(TARGET OpenMeshCore) - target_link_libraries(OpenMesh::OpenMesh INTERFACE OpenMeshCore) + target_link_libraries(CGAL_OpenMesh::CGAL_OpenMesh INTERFACE OpenMeshCore) return() endif() - set_target_properties(OpenMesh::OpenMesh PROPERTIES + set_target_properties(CGAL_OpenMesh::CGAL_OpenMesh PROPERTIES INTERFACE_COMPILE_DEFINITIONS "CGAL_USE_OPENMESH;NOMINMAX;_USE_MATH_DEFINES" INTERFACE_INCLUDE_DIRECTORIES "${OPENMESH_INCLUDE_DIRS}") if(OPENMESH_CORE_LIBRARY_RELEASE) - set_property(TARGET OpenMesh::OpenMesh APPEND PROPERTY + set_property(TARGET CGAL_OpenMesh::CGAL_OpenMesh APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) - set_target_properties(OpenMesh::OpenMesh PROPERTIES + set_target_properties(CGAL_OpenMesh::CGAL_OpenMesh PROPERTIES IMPORTED_LOCATION_RELEASE "${OPENMESH_CORE_LIBRARY_RELEASE}") endif() if(OPENMESH_CORE_LIBRARY_DEBUG) - set_property(TARGET OpenMesh::OpenMesh APPEND PROPERTY + set_property(TARGET CGAL_OpenMesh::CGAL_OpenMesh APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) - set_target_properties(OpenMesh::OpenMesh PROPERTIES + set_target_properties(CGAL_OpenMesh::CGAL_OpenMesh PROPERTIES IMPORTED_LOCATION_DEBUG "${OPENMESH_CORE_LIBRARY_DEBUG}") endif() endif() diff --git a/Installation/cmake/modules/UseOpenMesh.cmake b/Installation/cmake/modules/UseOpenMesh.cmake index 23449d7cdf99..2d08d3f98fec 100644 --- a/Installation/cmake/modules/UseOpenMesh.cmake +++ b/Installation/cmake/modules/UseOpenMesh.cmake @@ -3,3 +3,5 @@ include_directories ( ${OPENMESH_INCLUDE_DIR} ) add_definitions( -DNOMINMAX -D_USE_MATH_DEFINES ) + +message(DEPRECATION "This file UseOpenMesh.cmake is deprecated, and the imported target `CGAL::Eigen3_support` from CGAL_OpenMesh_support.cmake should be used instead.") From 603f6a5a032ab9b61537d18a0f532b593a7b108f Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 27 Aug 2024 14:00:46 +0200 Subject: [PATCH 123/348] OpenMesh >= 10.0 have a OpenMeshConfig.cmake file so we do not need FindOpenMesh.cmake anymore We add the target CGAL::OpenMesh_support to make it uniform with other dependencies --- .../cmake/modules/CGAL_OpenMesh_support.cmake | 24 ++--- Installation/cmake/modules/FindOpenMesh.cmake | 98 ------------------- Installation/cmake/modules/UseOpenMesh.cmake | 7 -- 3 files changed, 9 insertions(+), 120 deletions(-) delete mode 100644 Installation/cmake/modules/FindOpenMesh.cmake delete mode 100644 Installation/cmake/modules/UseOpenMesh.cmake diff --git a/Installation/cmake/modules/CGAL_OpenMesh_support.cmake b/Installation/cmake/modules/CGAL_OpenMesh_support.cmake index 1154b2f2cffa..97df95c8115b 100644 --- a/Installation/cmake/modules/CGAL_OpenMesh_support.cmake +++ b/Installation/cmake/modules/CGAL_OpenMesh_support.cmake @@ -1,23 +1,17 @@ if(OpenMesh_FOUND AND NOT TARGET CGAL::OpenMesh_support) - add_library(CGAL::OpenMesh_support UNKNOWN IMPORTED) + add_library(CGAL::OpenMesh_support INTERFACE IMPORTED) - set_target_properties(OpenMesh::OpenMesh PROPERTIES - INTERFACE_COMPILE_DEFINITIONS "CGAL_USE_OPENMESH;NOMINMAX;_USE_MATH_DEFINES" - INTERFACE_INCLUDE_DIRECTORIES "${OPENMESH_INCLUDE_DIRS}") - - if(OPENMESH_CORE_LIBRARY_RELEASE) - set_property(TARGET OpenMesh::OpenMesh APPEND PROPERTY - IMPORTED_CONFIGURATIONS RELEASE) - set_target_properties(OpenMesh::OpenMesh PROPERTIES - IMPORTED_LOCATION_RELEASE "${OPENMESH_CORE_LIBRARY_RELEASE}") + if(TARGET OpenMeshCore) + target_link_libraries(CGAL::OpenMesh_support INTERFACE OpenMeshCore) endif() - if(OPENMESH_CORE_LIBRARY_DEBUG) - set_property(TARGET OpenMesh::OpenMesh APPEND PROPERTY - IMPORTED_CONFIGURATIONS DEBUG) - set_target_properties(OpenMesh::OpenMesh PROPERTIES - IMPORTED_LOCATION_DEBUG "${OPENMESH_CORE_LIBRARY_DEBUG}") + if(TARGET OpenMeshTools) + target_link_libraries(CGAL::OpenMesh_support INTERFACE OpenMeshTools) endif() + + target_compile_definitions(CGAL::OpenMesh_support + INTERFACE "CGAL_USE_OPENMESH;NOMINMAX;_USE_MATH_DEFINES") + endif() diff --git a/Installation/cmake/modules/FindOpenMesh.cmake b/Installation/cmake/modules/FindOpenMesh.cmake deleted file mode 100644 index 1c9d2198ed9c..000000000000 --- a/Installation/cmake/modules/FindOpenMesh.cmake +++ /dev/null @@ -1,98 +0,0 @@ -#This modules tries to find OpenMesh -# Once done this will define -# -# OpenMesh_FOUND - system has OpenMesh -# OPENMESH_INCLUDE_DIR - OpenMesh include directory -# OPENMESH_LIBRARIES - OpenMesh libraries -# - -find_package(OpenMesh NO_MODULE QUIET) - -# Is it already configured? -if (NOT OpenMesh_FOUND) - - find_path(OPENMESH_INCLUDE_DIR - NAMES OpenMesh/Core/Mesh/ArrayKernel.hh - HINTS ENV OPENMESH_INC_DIR - ENV OPENMESH_DIR - /usr/include - /usr/local/include - PATH_SUFFIXES src include - DOC "The directory containing the OpenMesh header files WITHOUT the OpenMesh prefix" - ) - - find_library(OPENMESH_CORE_LIBRARY_RELEASE NAMES "OpenMeshCore" - HINTS ENV OPENMESH_LIB_DIR - ENV OPENMESH_DIR - PATH_SUFFIXES lib - DOC "Path to the OpenMeshCore library" - ) - - find_library(OPENMESH_CORE_LIBRARY_DEBUG NAMES "OpenMeshCored" - HINTS ENV OPENMESH_LIB_DIR - ENV OPENMESH_DIR - PATH_SUFFIXES lib - DOC "Path to the OpenMeshCored library" - ) - - find_library(OPENMESH_TOOLS_LIBRARY_RELEASE NAMES "OpenMeshTools" - HINTS ENV OPENMESH_LIB_DIR - ENV OPENMESH_DIR - PATH_SUFFIXES lib - DOC "Path to the OpenMeshTools library" - ) - - find_library(OPENMESH_TOOLS_LIBRARY_DEBUG NAMES "OpenMeshToolsd" - HINTS ENV OPENMESH_LIB_DIR - ENV OPENMESH_DIR - PATH_SUFFIXES lib - DOC "Path to the OpenMeshToolsd library" - ) - - #select configuration depending on platform (optimized... on windows) - include(SelectLibraryConfigurations) - select_library_configurations( OPENMESH_TOOLS ) - select_library_configurations( OPENMESH_CORE ) - - set(OPENMESH_LIBRARIES ${OPENMESH_CORE_LIBRARY} ${OPENMESH_TOOLS_LIBRARY} ) - set(OPENMESH_INCLUDE_DIRS ${OPENMESH_INCLUDE_DIR} ) - - include( FindPackageHandleStandardArgs ) - find_package_handle_standard_args(OpenMesh - REQUIRED_VARS OPENMESH_INCLUDE_DIRS OPENMESH_LIBRARIES - FOUND_VAR OpenMesh_FOUND - ) - - #target OpenMesh::OpenMesh - if(OpenMesh_FOUND AND NOT TARGET OpenMesh::OpenMesh) - add_library(CGAL_OpenMesh::CGAL_OpenMesh UNKNOWN IMPORTED) - - if(TARGET OpenMeshCore) - target_link_libraries(CGAL_OpenMesh::CGAL_OpenMesh INTERFACE OpenMeshCore) - return() - endif() - - set_target_properties(CGAL_OpenMesh::CGAL_OpenMesh PROPERTIES - INTERFACE_COMPILE_DEFINITIONS "CGAL_USE_OPENMESH;NOMINMAX;_USE_MATH_DEFINES" - INTERFACE_INCLUDE_DIRECTORIES "${OPENMESH_INCLUDE_DIRS}") - - if(OPENMESH_CORE_LIBRARY_RELEASE) - set_property(TARGET CGAL_OpenMesh::CGAL_OpenMesh APPEND PROPERTY - IMPORTED_CONFIGURATIONS RELEASE) - set_target_properties(CGAL_OpenMesh::CGAL_OpenMesh PROPERTIES - IMPORTED_LOCATION_RELEASE "${OPENMESH_CORE_LIBRARY_RELEASE}") - endif() - - if(OPENMESH_CORE_LIBRARY_DEBUG) - set_property(TARGET CGAL_OpenMesh::CGAL_OpenMesh APPEND PROPERTY - IMPORTED_CONFIGURATIONS DEBUG) - set_target_properties(CGAL_OpenMesh::CGAL_OpenMesh PROPERTIES - IMPORTED_LOCATION_DEBUG "${OPENMESH_CORE_LIBRARY_DEBUG}") - endif() - endif() - -endif() - -if(OpenMesh_FOUND) - message(STATUS "OpenMesh found") -endif() \ No newline at end of file diff --git a/Installation/cmake/modules/UseOpenMesh.cmake b/Installation/cmake/modules/UseOpenMesh.cmake deleted file mode 100644 index 2d08d3f98fec..000000000000 --- a/Installation/cmake/modules/UseOpenMesh.cmake +++ /dev/null @@ -1,7 +0,0 @@ -# This module setups the compiler for using the OpenMesh library. -# It assumes that find_package(OpenMesh) was already called. - -include_directories ( ${OPENMESH_INCLUDE_DIR} ) -add_definitions( -DNOMINMAX -D_USE_MATH_DEFINES ) - -message(DEPRECATION "This file UseOpenMesh.cmake is deprecated, and the imported target `CGAL::Eigen3_support` from CGAL_OpenMesh_support.cmake should be used instead.") From 3f6083e6ffbcc52807c2ac2d69163de7e2d5d9a4 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 27 Aug 2024 14:02:37 +0200 Subject: [PATCH 124/348] use CGAL::OpenMesh_support in examples and tests --- BGL/examples/BGL_OpenMesh/CMakeLists.txt | 6 ++-- BGL/examples/BGL_polyhedron_3/CMakeLists.txt | 6 ++-- BGL/test/BGL/CMakeLists.txt | 28 +++++++------------ .../test/Combinatorial_map/CMakeLists.txt | 11 ++++---- .../examples/Convex_hull_3/CMakeLists.txt | 8 +++--- .../Polygon_mesh_processing/CMakeLists.txt | 19 ++++++------- .../Polygon_mesh_processing/CMakeLists.txt | 6 ++-- Property_map/test/Property_map/CMakeLists.txt | 8 ++---- .../test/STL_Extension/CMakeLists.txt | 6 ++-- .../Surface_mesh_deformation/CMakeLists.txt | 6 ++-- .../Surface_mesh_deformation/CMakeLists.txt | 6 ++-- .../Surface_mesh_segmentation/CMakeLists.txt | 6 ++-- .../Surface_mesh_shortest_path/CMakeLists.txt | 6 ++-- .../CMakeLists.txt | 6 ++-- .../CMakeLists.txt | 6 ++-- 15 files changed, 61 insertions(+), 73 deletions(-) diff --git a/BGL/examples/BGL_OpenMesh/CMakeLists.txt b/BGL/examples/BGL_OpenMesh/CMakeLists.txt index d11ac1444c9c..36a1968b7520 100644 --- a/BGL/examples/BGL_OpenMesh/CMakeLists.txt +++ b/BGL/examples/BGL_OpenMesh/CMakeLists.txt @@ -7,11 +7,11 @@ project(BGL_OpenMesh_Examples) # CGAL and its components find_package(CGAL REQUIRED) -find_package(OpenMesh) +find_package(OpenMesh CONFIG) if(OpenMesh_FOUND) - include(UseOpenMesh) + include(CGAL_OpenMesh_support) create_single_source_cgal_program("TriMesh.cpp") - target_link_libraries(TriMesh PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(TriMesh PRIVATE CGAL::OpenMesh_support) else() message("NOTICE: This project requires OpenMesh and will not be compiled.") endif() diff --git a/BGL/examples/BGL_polyhedron_3/CMakeLists.txt b/BGL/examples/BGL_polyhedron_3/CMakeLists.txt index 7c901c71d8e9..cd6f6827467c 100644 --- a/BGL/examples/BGL_polyhedron_3/CMakeLists.txt +++ b/BGL/examples/BGL_polyhedron_3/CMakeLists.txt @@ -16,10 +16,10 @@ create_single_source_cgal_program("range.cpp") create_single_source_cgal_program("transform_iterator.cpp") create_single_source_cgal_program("copy_polyhedron.cpp") -find_package(OpenMesh QUIET) +find_package(OpenMesh CONFIG QUIET) if(OpenMesh_FOUND) - target_link_libraries(copy_polyhedron PRIVATE ${OPENMESH_LIBRARIES}) - target_compile_definitions(copy_polyhedron PRIVATE -DCGAL_USE_OPENMESH) + include(CGAL_OpenMesh_support) + target_link_libraries(copy_polyhedron PRIVATE CGAL::OpenMesh_support) else() message(STATUS "NOTICE: The example 'copy_polyhedron' will not use OpenMesh.") endif() diff --git a/BGL/test/BGL/CMakeLists.txt b/BGL/test/BGL/CMakeLists.txt index fd43a685fe57..1f5bbb9ecd9e 100644 --- a/BGL/test/BGL/CMakeLists.txt +++ b/BGL/test/BGL/CMakeLists.txt @@ -40,28 +40,20 @@ create_single_source_cgal_program("bench_read_from_stream_vs_add_face_and_add_fa create_single_source_cgal_program("graph_traits_inheritance.cpp" ) create_single_source_cgal_program("test_deprecated_io.cpp") -find_package(OpenMesh QUIET) +find_package(OpenMesh CONFIG QUIET) if(OpenMesh_FOUND) - include(UseOpenMesh) - add_definitions(-DCGAL_USE_OPENMESH) + include(CGAL_OpenMesh_support) - target_link_libraries(test_clear PRIVATE ${OPENMESH_LIBRARIES}) - target_compile_definitions(test_clear PRIVATE -DCGAL_USE_OPENMESH) - target_link_libraries(test_Euler_operations PRIVATE ${OPENMESH_LIBRARIES}) - target_compile_definitions(test_Euler_operations PRIVATE -DCGAL_USE_OPENMESH) - target_link_libraries(test_Collapse_edge PRIVATE ${OPENMESH_LIBRARIES}) - target_compile_definitions(test_Collapse_edge PRIVATE -DCGAL_USE_OPENMESH) - target_link_libraries(test_Face_filtered_graph PRIVATE ${OPENMESH_LIBRARIES}) - target_compile_definitions(test_Face_filtered_graph PRIVATE -DCGAL_USE_OPENMESH) - target_link_libraries(test_graph_traits PRIVATE ${OPENMESH_LIBRARIES} ) - target_compile_definitions(test_graph_traits PRIVATE -DCGAL_USE_OPENMESH) - target_link_libraries(test_Properties PRIVATE ${OPENMESH_LIBRARIES}) - target_compile_definitions(test_Properties PRIVATE -DCGAL_USE_OPENMESH) - target_link_libraries(test_bgl_read_write PRIVATE ${OPENMESH_LIBRARIES}) - target_compile_definitions(test_bgl_read_write PRIVATE -DCGAL_USE_OPENMESH) + target_link_libraries(test_clear PRIVATE CGAL::OpenMesh_support) + target_link_libraries(test_Euler_operations PRIVATE CGAL::OpenMesh_support) + target_link_libraries(test_Collapse_edge PRIVATE CGAL::OpenMesh_support) + target_link_libraries(test_Face_filtered_graph PRIVATE CGAL::OpenMesh_support) + target_link_libraries(test_graph_traits PRIVATE CGAL::OpenMesh_support ) + target_link_libraries(test_Properties PRIVATE CGAL::OpenMesh_support) + target_link_libraries(test_bgl_read_write PRIVATE CGAL::OpenMesh_support) create_single_source_cgal_program("graph_concept_OpenMesh.cpp") - target_link_libraries(graph_concept_OpenMesh PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(graph_concept_OpenMesh PRIVATE CGAL::OpenMesh_support) else() message(STATUS "NOTICE: Tests that use OpenMesh will not be compiled.") endif() diff --git a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt index d0c26ec31c5e..17d31b5fbcf2 100644 --- a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt +++ b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt @@ -27,14 +27,13 @@ cgal_add_compilation_test(Combinatorial_map_copy_test_index) create_single_source_cgal_program(cmap_test_split_attribute.cpp) # Link with OpenMesh if possible -find_package(OpenMesh QUIET) -if(TARGET OpenMesh::OpenMesh) +find_package(OpenMesh CONFIG QUIET) +if(OpenMesh_FOUND) message(STATUS "Found OpenMesh") + include(CGAL_OpenMesh_support) - target_link_libraries(Combinatorial_map_copy_test PRIVATE OpenMesh::OpenMesh) - target_compile_definitions(Combinatorial_map_copy_test PRIVATE -DCGAL_USE_OPENMESH) - target_link_libraries(Combinatorial_map_copy_test_index PRIVATE OpenMesh::OpenMesh) - target_compile_definitions(Combinatorial_map_copy_test_index PRIVATE -DCGAL_USE_OPENMESH) + target_link_libraries(Combinatorial_map_copy_test PRIVATE CGAL::OpenMesh_support) + target_link_libraries(Combinatorial_map_copy_test_index PRIVATE CGAL::OpenMesh_support) else() message(STATUS "NOTICE: Tests will not use OpenMesh.") endif() diff --git a/Convex_hull_3/examples/Convex_hull_3/CMakeLists.txt b/Convex_hull_3/examples/Convex_hull_3/CMakeLists.txt index 4b6f08ba252d..7a72a7c4caf3 100644 --- a/Convex_hull_3/examples/Convex_hull_3/CMakeLists.txt +++ b/Convex_hull_3/examples/Convex_hull_3/CMakeLists.txt @@ -19,15 +19,15 @@ create_single_source_cgal_program("quickhull_any_dim_3.cpp") create_single_source_cgal_program("extreme_points_3_sm.cpp") create_single_source_cgal_program("extreme_indices_3.cpp") -find_package(OpenMesh QUIET) +find_package(OpenMesh CONFIG QUIET) if(OpenMesh_FOUND) - include(UseOpenMesh) + include(CGAL_OpenMesh_support) message(STATUS "Found OpenMesh") create_single_source_cgal_program("quickhull_OM_3.cpp") - target_link_libraries(quickhull_OM_3 PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(quickhull_OM_3 PRIVATE CGAL::OpenMesh_support) create_single_source_cgal_program("dynamic_hull_OM_3.cpp") - target_link_libraries(dynamic_hull_OM_3 PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(dynamic_hull_OM_3 PRIVATE CGAL::OpenMesh_support) else() message(STATUS "NOTICE: Examples that use OpenMesh will not be compiled.") endif() diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index 718ab1096a9d..911ea62ce07e 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -93,32 +93,31 @@ else() message(STATUS "NOTICE: Examples that use Eigen will not be compiled.") endif() -find_package(OpenMesh QUIET) +find_package(OpenMesh CONFIG QUIET) if(OpenMesh_FOUND) - include(UseOpenMesh) + include(CGAL_OpenMesh_support) create_single_source_cgal_program("compute_normals_example_OM.cpp") - target_link_libraries(compute_normals_example_OM PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(compute_normals_example_OM PRIVATE CGAL::OpenMesh_support) create_single_source_cgal_program("corefinement_OM_union.cpp") - target_link_libraries(corefinement_OM_union PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(corefinement_OM_union PRIVATE CGAL::OpenMesh_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("hole_filling_example_OM.cpp") - target_link_libraries(hole_filling_example_OM PRIVATE CGAL::Eigen3_support ${OPENMESH_LIBRARIES}) + target_link_libraries(hole_filling_example_OM PRIVATE CGAL::Eigen3_support CGAL::OpenMesh_support) endif() create_single_source_cgal_program("point_inside_example_OM.cpp") - target_link_libraries(point_inside_example_OM PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(point_inside_example_OM PRIVATE CGAL::OpenMesh_support) create_single_source_cgal_program("stitch_borders_example_OM.cpp") - target_link_libraries(stitch_borders_example_OM PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(stitch_borders_example_OM PRIVATE CGAL::OpenMesh_support) #create_single_source_cgal_program("remove_degeneracies_example.cpp") - #target_link_libraries(remove_degeneracies_example PRIVATE ${OPENMESH_LIBRARIES}) - #target_compile_definitions(remove_degeneracies_example PRIVATE -DCGAL_USE_OPENMESH) + #target_link_libraries(remove_degeneracies_example PRIVATE CGAL::OpenMesh_support) create_single_source_cgal_program("triangulate_faces_example_OM.cpp") - target_link_libraries(triangulate_faces_example_OM PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(triangulate_faces_example_OM PRIVATE CGAL::OpenMesh_support) else() message(STATUS "NOTICE: Examples that use OpenMesh will not be compiled.") endif() diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt index f814501997cf..3d78756fba85 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt @@ -112,11 +112,11 @@ else() message(STATUS "NOTICE: Intel TBB was not found. Tests will use sequential code.") endif() -find_package(OpenMesh QUIET) +find_package(OpenMesh CONFIG QUIET) if(OpenMesh_FOUND) - include(UseOpenMesh) + include(CGAL_OpenMesh_support) create_single_source_cgal_program("remeshing_test_P_SM_OM.cpp") - target_link_libraries(remeshing_test_P_SM_OM PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(remeshing_test_P_SM_OM PRIVATE CGAL::OpenMesh_support) else() message(STATUS "NOTICE: Tests that use OpenMesh will not be compiled.") endif() diff --git a/Property_map/test/Property_map/CMakeLists.txt b/Property_map/test/Property_map/CMakeLists.txt index 92a3eb097d5e..78f43581afcc 100644 --- a/Property_map/test/Property_map/CMakeLists.txt +++ b/Property_map/test/Property_map/CMakeLists.txt @@ -10,13 +10,11 @@ create_single_source_cgal_program("dynamic_properties_test.cpp") create_single_source_cgal_program("kernel_converter_properties_test.cpp") create_single_source_cgal_program("test_Property_container.cpp") -find_package(OpenMesh QUIET) +find_package(OpenMesh CONFIG QUIET) if(OpenMesh_FOUND) message(STATUS "Found OpenMesh") - include(UseOpenMesh) - - target_link_libraries(dynamic_properties_test PRIVATE ${OPENMESH_LIBRARIES}) - target_compile_definitions(dynamic_properties_test PRIVATE -DCGAL_USE_OPENMESH) + include(CGAL_OpenMesh_support) + target_link_libraries(dynamic_properties_test PRIVATE CGAL::OpenMesh_support) else() message(STATUS "NOTICE: Tests will not use OpenMesh.") endif() diff --git a/STL_Extension/test/STL_Extension/CMakeLists.txt b/STL_Extension/test/STL_Extension/CMakeLists.txt index ee9785300775..902664e75c8c 100644 --- a/STL_Extension/test/STL_Extension/CMakeLists.txt +++ b/STL_Extension/test/STL_Extension/CMakeLists.txt @@ -61,13 +61,13 @@ if(TARGET CGAL::TBB_support) target_link_libraries(test_for_each PUBLIC CGAL::TBB_support) endif() -find_package(OpenMesh QUIET) +find_package(OpenMesh CONFIG QUIET) if(OpenMesh_FOUND) message(STATUS "Found OpenMesh") - include(UseOpenMesh) + include(CGAL_OpenMesh_support) create_single_source_cgal_program("test_hash_OpenMesh.cpp") - target_link_libraries(test_hash_OpenMesh PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(test_hash_OpenMesh PRIVATE CGAL::OpenMesh_support) else() message(STATUS "NOTICE: Tests that use OpenMesh will not be compiled.") endif() diff --git a/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt b/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt index ab336b9fb261..0d93d45eda93 100644 --- a/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt +++ b/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt @@ -31,14 +31,14 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() - find_package(OpenMesh QUIET) + find_package(OpenMesh CONFIG QUIET) if(OpenMesh_FOUND) - include(UseOpenMesh) + include(CGAL_OpenMesh_support) message(STATUS "Found OpenMesh") create_single_source_cgal_program("all_roi_assign_example_with_OpenMesh.cpp") target_link_libraries(all_roi_assign_example_with_OpenMesh - PRIVATE ${OPENMESH_LIBRARIES} CGAL::Eigen3_support) + PRIVATE CGAL::OpenMesh_support CGAL::Eigen3_support) else() message(STATUS "NOTICE: Examples that use OpenMesh will not be compiled.") endif() diff --git a/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt b/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt index 398dd703748b..b34653b68ec3 100644 --- a/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt +++ b/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt @@ -16,14 +16,14 @@ if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("Symmetry_test.cpp") target_link_libraries(Symmetry_test PUBLIC CGAL::Eigen3_support) - find_package(OpenMesh QUIET) + find_package(OpenMesh CONFIG QUIET) if(OpenMesh_FOUND) - include(UseOpenMesh) + include(CGAL_OpenMesh_support) message(STATUS "Found OpenMesh") create_single_source_cgal_program("Cactus_deformation_session_OpenMesh.cpp") target_link_libraries(Cactus_deformation_session_OpenMesh - PRIVATE ${OPENMESH_LIBRARIES} CGAL::Eigen3_support) + PRIVATE CGAL::OpenMesh_support CGAL::Eigen3_support) else() message(STATUS "NOTICE: Examples that use OpenMesh will not be compiled.") endif() diff --git a/Surface_mesh_segmentation/examples/Surface_mesh_segmentation/CMakeLists.txt b/Surface_mesh_segmentation/examples/Surface_mesh_segmentation/CMakeLists.txt index 5ef633bb5397..f944ad20b2fb 100644 --- a/Surface_mesh_segmentation/examples/Surface_mesh_segmentation/CMakeLists.txt +++ b/Surface_mesh_segmentation/examples/Surface_mesh_segmentation/CMakeLists.txt @@ -15,13 +15,13 @@ create_single_source_cgal_program("segmentation_from_sdf_values_SM_example.cpp") create_single_source_cgal_program("segmentation_from_sdf_values_LCC_example.cpp") create_single_source_cgal_program("extract_segmentation_into_mesh_example.cpp") -find_package(OpenMesh QUIET) +find_package(OpenMesh CONFIG QUIET) if(OpenMesh_FOUND) - include(UseOpenMesh) + include(CGAL_OpenMesh_support) message(STATUS "Found OpenMesh") create_single_source_cgal_program("segmentation_from_sdf_values_OpenMesh_example.cpp") - target_link_libraries(segmentation_from_sdf_values_OpenMesh_example PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(segmentation_from_sdf_values_OpenMesh_example PRIVATE CGAL::OpenMesh_support) else() message(STATUS "NOTICE: Examples that use OpenMesh will not be compiled.") endif() diff --git a/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/CMakeLists.txt b/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/CMakeLists.txt index 5238bd06c184..e605b7cbaf4d 100644 --- a/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/CMakeLists.txt +++ b/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/CMakeLists.txt @@ -13,13 +13,13 @@ create_single_source_cgal_program("shortest_paths_with_id.cpp") create_single_source_cgal_program("shortest_paths.cpp") create_single_source_cgal_program("shortest_path_with_locate.cpp") -find_package(OpenMesh QUIET) +find_package(OpenMesh CONFIG QUIET) if(OpenMesh_FOUND) - include(UseOpenMesh) + include(CGAL_OpenMesh_support) message(STATUS "Found OpenMesh") create_single_source_cgal_program("shortest_paths_OpenMesh.cpp") - target_link_libraries(shortest_paths_OpenMesh PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(shortest_paths_OpenMesh PRIVATE CGAL::OpenMesh_support) else() message(STATUS "NOTICE: Examples that use OpenMesh will not be compiled.") endif() diff --git a/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt b/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt index 60135e84d4db..fbf0c06996a8 100644 --- a/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt +++ b/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt @@ -28,13 +28,13 @@ else() message(STATUS "NOTICE: Garland-Heckbert polices require the Eigen library, which has not been found; related examples will not be compiled.") endif() -find_package(OpenMesh QUIET) +find_package(OpenMesh CONFIG QUIET) if(OpenMesh_FOUND) - include(UseOpenMesh) + include(CGAL_OpenMesh_support) message(STATUS "Found OpenMesh") create_single_source_cgal_program("edge_collapse_OpenMesh.cpp") - target_link_libraries(edge_collapse_OpenMesh PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(edge_collapse_OpenMesh PRIVATE CGAL::OpenMesh_support) else() message(STATUS "NOTICE: Examples that use OpenMesh will not be compiled.") endif() diff --git a/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt b/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt index 674ac89feff4..6c50f2d1b8d2 100644 --- a/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt +++ b/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt @@ -29,13 +29,13 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() - find_package(OpenMesh QUIET) + find_package(OpenMesh CONFIG QUIET) if(OpenMesh_FOUND) - include(UseOpenMesh) + include(CGAL_OpenMesh_support) message(STATUS "Found OpenMesh") create_single_source_cgal_program("MCF_Skeleton_om_example.cpp") - target_link_libraries(MCF_Skeleton_om_example PUBLIC CGAL::Eigen3_support PRIVATE ${OPENMESH_LIBRARIES}) + target_link_libraries(MCF_Skeleton_om_example PUBLIC CGAL::Eigen3_support PRIVATE CGAL::OpenMesh_support) else() message(STATUS "NOTICE: Examples that use OpenMesh will not be compiled.") endif() From b5fc288336301f7b930ae892c6caf270a8236d12 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 27 Aug 2024 14:06:46 +0200 Subject: [PATCH 125/348] update Linear_cell_complex benchmark wrt OpenMesh --- .../Linear_cell_complex_2/CMakeLists.txt | 10 ++--- .../cmake/FindOpenMesh.cmake | 40 ------------------- 2 files changed, 4 insertions(+), 46 deletions(-) delete mode 100644 Linear_cell_complex/benchmark/Linear_cell_complex_2/cmake/FindOpenMesh.cmake diff --git a/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt b/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt index ce0dd87df2f3..9c2ae7efb0c8 100644 --- a/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt +++ b/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt @@ -18,10 +18,8 @@ include_directories(BEFORE "/usr/include/libxml2/") # add_definitions("-g") # OpenMesh -set(OPENMESH_DIR "${CMAKE_CURRENT_SOURCE_DIR}/openmesh") -find_package(OpenMesh REQUIRED) -include_directories(${OPENMESH_INCLUDE_DIR}) -link_directories(${OPENMESH_LIBRARY_DIR}) +find_package(OpenMesh CONFIG REQUIRED) +include(CGAL_OpenMesh_support) # Polyhedron add_executable(polyhedron_performance performance_2.h polyhedron_performance.h @@ -42,7 +40,7 @@ target_link_libraries(surface_mesh_performance surface_mesh) # Open_mesh add_executable(openmesh_performance performance_2.h openmesh_performance.h openmesh_performance.cpp) -target_link_libraries(openmesh_performance ${OPENMESH_LIBRARIES}) +target_link_libraries(openmesh_performance CGAL::OpenMesh_support) # CGoGN find_package(Qt REQUIRED) @@ -91,4 +89,4 @@ target_link_libraries( Zinri z ${QT_LIBRARIES} - ${OPENMESH_LIBRARIES}) + CGAL::OpenMesh_support) diff --git a/Linear_cell_complex/benchmark/Linear_cell_complex_2/cmake/FindOpenMesh.cmake b/Linear_cell_complex/benchmark/Linear_cell_complex_2/cmake/FindOpenMesh.cmake deleted file mode 100644 index 98aefc13d236..000000000000 --- a/Linear_cell_complex/benchmark/Linear_cell_complex_2/cmake/FindOpenMesh.cmake +++ /dev/null @@ -1,40 +0,0 @@ -# Find OpenMesh. If found, this will define -# -# OPENMESH_FOUND - Successfully found OpenMesh -# OPENMESH_INCLUDE_DIR - OpenMesh include directory -# OPENMESH_LIBRARIES - OpenMesh libraries -# OPENMESH_LIBRARY_DIR - OpenMesh library directory -# - -if(DEFINED OPENMESH_INCLUDE_DIR) - set(OPENMESH_FIND_QUIETLY TRUE) -else() - - find_path(OPENMESH_INCLUDE_DIR OpenMesh/Core/Mesh/PolyMeshT.hh - PATHS - /usr/local/include - /usr/include - $ENV{OPENMESH_DIR}/include - ${OPENMESH_DIR}/include - ) - - if(DEFINED OPENMESH_INCLUDE_DIR) - - message(STATUS "Found OpenMesh: " ${OPENMESH_INCLUDE_DIR}) - set(OPENMESH_FOUND true) - - if(WIN32) - set(OPENMESH_LIBRARY_DIR "${OPENMESH_INCLUDE_DIR}/../lib" - CACHE PATH "OpenMesh library directory") - else() - set(OPENMESH_LIBRARY_DIR "${OPENMESH_INCLUDE_DIR}/../lib/OpenMesh" - CACHE PATH "OpenMesh library directory") - endif() - - set(OPENMESH_LIBRARIES "OpenMeshCore;OpenMeshTools" - CACHE STRING "OpenMesh libraries") - - else() - set(OPENMESH_FOUND FALSE) - endif() -endif() From 261bf3aa81b003fdbe31ac1bae3aacc4740f3fe9 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 27 Aug 2024 17:53:22 +0200 Subject: [PATCH 126/348] try to create bug-fixes releases --- .../bin/create_internal_release_of_the_day.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py index f2a97610321a..ab1b640f42a9 100644 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py +++ b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py @@ -13,8 +13,8 @@ # Define a dictionary that maps day of the week to an action actions = { "Monday": integration, - "Tuesday": integration, - "Wednesday": integration, + "Tuesday": release("5.5"), #integration, + "Wednesday": release("5.6"), #integration, "Thursday": integration, "Friday": release("5.5"), "Saturday": release("5.6"), From 4eb51f79d0c7dad473dfe77f7b6ca3f765529e11 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Wed, 28 Aug 2024 10:46:59 +0200 Subject: [PATCH 127/348] fixed saving paths --- .../polyfit_example_model_complexty_control.cpp | 6 +++--- .../polyfit_example_user_provided_planes.cpp | 2 +- .../polyfit_example_with_region_growing.cpp | 2 +- .../polyfit_example_without_input_planes.cpp | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_model_complexty_control.cpp b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_model_complexty_control.cpp index 64fd9a9784ae..e132d62975df 100644 --- a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_model_complexty_control.cpp +++ b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_model_complexty_control.cpp @@ -90,7 +90,7 @@ int main() return EXIT_FAILURE; } else { - const std::string& output_file = "data/building_result-0.05.off"; + const std::string& output_file = "building_result-0.05.off"; if (CGAL::IO::write_OFF(output_file, model)) { std::cout << " Done. Saved to " << output_file << ". Time: " << t.time() << " sec." << std::endl; } @@ -108,7 +108,7 @@ int main() return EXIT_FAILURE; } else { - const std::string& output_file = "data/building_result-0.5.off"; + const std::string& output_file = "building_result-0.5.off"; if (CGAL::IO::write_OFF(output_file, model)) std::cout << " Done. Saved to " << output_file << ". Time: " << t.time() << " sec." << std::endl; else { @@ -125,7 +125,7 @@ int main() return EXIT_FAILURE; } else { - const std::string& output_file = "data/building_result-0.7.off"; + const std::string& output_file = "building_result-0.7.off"; if (CGAL::IO::write_OFF(output_file, model)){ std::cout << " Done. Saved to " << output_file << ". Time: " << t.time() << " sec." << std::endl; } diff --git a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_user_provided_planes.cpp b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_user_provided_planes.cpp index 733f01137492..2f2ed2df2c97 100644 --- a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_user_provided_planes.cpp +++ b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_user_provided_planes.cpp @@ -89,7 +89,7 @@ int main() } // Saves the mesh model - const std::string& output_file("data/ball_result.off"); + const std::string& output_file("user_provided_planes_result.off"); if (CGAL::IO::write_OFF(output_file, model)) std::cout << " Done. Saved to " << output_file << ". Time: " << t.time() << " sec." << std::endl; else { diff --git a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_with_region_growing.cpp b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_with_region_growing.cpp index 8dc81bd3c1ed..493c8c138aa9 100644 --- a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_with_region_growing.cpp +++ b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_with_region_growing.cpp @@ -172,7 +172,7 @@ int main() std::cout << "Saving..."; t.reset(); - const std::string& output_file("data/cube_result.off"); + const std::string& output_file("with_region_growing_result.off"); if (CGAL::IO::write_OFF(output_file, model)) std::cout << " Done. Saved to " << output_file << ". Time: " << t.time() << " sec." << std::endl; else { diff --git a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp index 85e474d99d7d..b04ba46dd0be 100644 --- a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp +++ b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp @@ -138,7 +138,7 @@ int main() // Also stores the candidate faces as a surface mesh to a file Surface_mesh candidate_faces; algo.output_candidate_faces(candidate_faces); - const std::string& candidate_faces_file("data/cube_candidate_faces.off"); + const std::string& candidate_faces_file("without_input_planes_result.off"); std::ofstream candidate_stream(candidate_faces_file.c_str()); if (CGAL::IO::write_OFF(candidate_stream, candidate_faces)) std::cout << "Candidate faces saved to " << candidate_faces_file << "." << std::endl; From 860f60b090c05b83378885d81cc81598e14fa996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 28 Aug 2024 11:23:06 +0200 Subject: [PATCH 128/348] need c++17 --- Triangulation_3/test/Triangulation_3/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Triangulation_3/test/Triangulation_3/CMakeLists.txt b/Triangulation_3/test/Triangulation_3/CMakeLists.txt index d5156f0d1e63..2da2b2aeecc2 100644 --- a/Triangulation_3/test/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/test/Triangulation_3/CMakeLists.txt @@ -23,10 +23,11 @@ create_single_source_cgal_program( "test_RT_cell_base_with_weighted_circumcenter_3.cpp") create_single_source_cgal_program("test_robust_weighted_circumcenter.cpp") create_single_source_cgal_program("test_simplex_3.cpp") -create_single_source_cgal_program( "test_simplex_iterator_3.cpp" ) -create_single_source_cgal_program( "test_segment_cell_traverser_3.cpp" ) create_single_source_cgal_program( "test_segment_simplex_traverser_3.cpp" ) if(cxx_std_17 IN_LIST CMAKE_CXX_COMPILE_FEATURES) + create_single_source_cgal_program( "test_simplex_iterator_3.cpp" ) + create_single_source_cgal_program( "test_segment_cell_traverser_3.cpp" ) + target_compile_features(test_simplex_iterator_3 PRIVATE cxx_std_17) target_compile_features(test_segment_simplex_traverser_3 PRIVATE cxx_std_17) else() message( From 377e2f11bcdf71ec0126ef244c4f160bda27bc28 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 26 Aug 2024 15:38:45 +0200 Subject: [PATCH 129/348] create_new_release with SELinux: call restorecon --- Scripts/developer_scripts/create_new_release | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Scripts/developer_scripts/create_new_release b/Scripts/developer_scripts/create_new_release index 692ed94e7fa4..2b0e0f2ff2b6 100755 --- a/Scripts/developer_scripts/create_new_release +++ b/Scripts/developer_scripts/create_new_release @@ -323,6 +323,9 @@ if [ -n "$DO_PUBLIC" ]; then zip -q -r ${public_release_name}-library.zip ${public_release_name} mv ${public_release_name}*.tar.xz "${HTML_DIR}/${release_name}-public/" mv ${public_release_name}*.zip "${HTML_DIR}/${release_name}-public/" + if command -v sestatus >/dev/null 2>&1; then + sestatus && restorecon -R "${HTML_DIR}/${release_name}-public" + fi rm -f "$HTML_DIR/CGAL-last-public" ln -s "${release_name}-public" "$HTML_DIR/CGAL-last-public" fi From 706c5f12ae1b12d5ed952733a5e43e4224da891e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 28 Aug 2024 11:49:05 +0200 Subject: [PATCH 130/348] backport of https://github.com/CGAL/cgal/pull/7499 --- .../CGAL/OSQP_quadratic_program_traits.h | 126 ++++++++---------- .../CGAL/SCIP_mixed_integer_program_traits.h | 5 + 2 files changed, 60 insertions(+), 71 deletions(-) diff --git a/Solver_interface/include/CGAL/OSQP_quadratic_program_traits.h b/Solver_interface/include/CGAL/OSQP_quadratic_program_traits.h index 002b6acba839..261c4c514b03 100644 --- a/Solver_interface/include/CGAL/OSQP_quadratic_program_traits.h +++ b/Solver_interface/include/CGAL/OSQP_quadratic_program_traits.h @@ -44,9 +44,9 @@ namespace CGAL { number type that `FieldNumberType` \note The `FT` type is provided for convenience. Internally, this FT type is converted - to `c_float` type that can be set either to `float` or `double`. By default, the `double` - type is used. After the optimization is complete, the `c_float` type is converted back to `FT`. - See more about `c_float` here. + to `OSQPFloat` type that can be set either to `float` or `double`. By default, the `double` + type is used. After the optimization is complete, the `OSQPFloat` type is converted back to `FT`. + See more about `OSQPFloat` here. \cgalModels `QuadraticProgramTraits` */ @@ -192,27 +192,27 @@ class OSQP_quadratic_program_traits CGAL_precondition(q_vec.size() == n); CGAL_precondition(l_vec.size() == m && l_vec.size() == m); - const c_int P_nnz = static_cast(P_vec.size()); - auto P_x = std::make_unique(P_nnz); - auto P_i = std::make_unique(P_nnz); - auto P_p = std::make_unique(n + 1); + const OSQPInt P_nnz = static_cast(P_vec.size()); + auto P_x = std::make_unique(P_nnz); + auto P_i = std::make_unique(P_nnz); + auto P_p = std::make_unique(n + 1); set_matrix_from_triplets("P", P_vec, P_x.get(), P_i.get(), P_p.get()); if(verbose) std::cout << "P_nnz: " << P_nnz << std::endl; - const c_int A_nnz = static_cast(A_vec.size()); - auto A_x = std::make_unique(A_nnz); - auto A_i = std::make_unique(A_nnz); - auto A_p = std::make_unique(n + 1); + const OSQPInt A_nnz = static_cast(A_vec.size()); + auto A_x = std::make_unique(A_nnz); + auto A_i = std::make_unique(A_nnz); + auto A_p = std::make_unique(n + 1); set_matrix_from_triplets("A", A_vec, A_x.get(), A_i.get(), A_p.get()); if(verbose) std::cout << "A_nnz: " << A_nnz << std::endl; - const c_int q_size = static_cast(q_vec.size()); - const c_int l_size = static_cast(l_vec.size()); - const c_int u_size = static_cast(u_vec.size()); + const OSQPInt q_size = static_cast(q_vec.size()); + const OSQPInt l_size = static_cast(l_vec.size()); + const OSQPInt u_size = static_cast(u_vec.size()); - auto q_x = std::make_unique(q_size); - auto l_x = std::make_unique(l_size); - auto u_x = std::make_unique(u_size); + auto q_x = std::make_unique(q_size); + auto l_x = std::make_unique(l_size); + auto u_x = std::make_unique(u_size); set_qlu_data(q_x.get(), l_x.get(), u_x.get()); // Problem settings. @@ -220,22 +220,11 @@ class OSQP_quadratic_program_traits CGAL_assertion(settings); // Structures. - OSQPWorkspace *work; - OSQPData *data = (OSQPData *) malloc(sizeof(OSQPData)); - CGAL_assertion(data); + OSQPCscMatrix* P = static_cast(malloc(sizeof(OSQPCscMatrix))); + OSQPCscMatrix* A = static_cast(malloc(sizeof(OSQPCscMatrix))); - // Populate data. - data->n = static_cast(n); - data->m = static_cast(m); - data->P = csc_matrix(data->n, data->n, P_nnz, P_x.get(), P_i.get(), P_p.get()); - CGAL_assertion(data->P); - - data->q = q_x.get(); - data->A = csc_matrix(data->m, data->n, A_nnz, A_x.get(), A_i.get(), A_p.get()); - CGAL_assertion(data->A); - - data->l = l_x.get(); - data->u = u_x.get(); + csc_set_data(A, m, n, A_nnz, A_x.get(), A_i.get(), A_p.get()); + csc_set_data(P, n, n, P_nnz, P_x.get(), P_i.get(), P_p.get()); // Set solver settings. osqp_set_default_settings(settings); @@ -243,38 +232,33 @@ class OSQP_quadratic_program_traits settings->eps_rel = eps_rel; settings->verbose = verbose; - // Set workspace. - osqp_setup(&work, data, settings); + OSQPSolver* solver = NULL; + OSQPInt exitflag = osqp_setup(&solver, P, q_x.get(), A, l_x.get(), u_x.get(), m, n, settings); - // Solve problem. - c_int exitflag = -1; try { - exitflag = osqp_solve(work); + if (!exitflag) + exitflag = osqp_solve(solver); + + const OSQPFloat* x = solver->solution->x; + for (std::size_t i = 0; i < n; ++i) + { + const FT value{ x[i] }; + *(++solution) = value; + } } - catch(std::exception& e) + catch (std::exception& e) { std::cerr << "ERROR: OSQP solver has thrown an exception!" << std::endl; std::cerr << e.what() << std::endl; } - const bool success = (exitflag == 0); - - // Create solution. - const c_float *x = work->solution->x; - for(std::size_t i=0; iA); - c_free(data->P); - c_free(data); - c_free(settings); + osqp_cleanup(solver); + if (A) free(A); + if (P) free(P); + if (settings) free(settings); - return success; + return (exitflag == 0); } /// \endcond @@ -282,9 +266,9 @@ class OSQP_quadratic_program_traits // Based on the code in scipy, function coo_tocsr() void set_matrix_from_triplets(const std::string /* name */, const std::vector& triplets, - c_float *M_x, - c_int *M_i, - c_int *M_p) const + OSQPFloat *M_x, + OSQPInt *M_i, + OSQPInt *M_p) const { const std::size_t nnz = triplets.size(); @@ -296,10 +280,10 @@ class OSQP_quadratic_program_traits } // Fill M_p - c_int cumsum = 0; + OSQPInt cumsum = 0; for(std::size_t j=0; j(std::get<1>(triplets[k])); - const c_int dest = M_p[col]; + const OSQPInt col = static_cast(std::get<1>(triplets[k])); + const OSQPInt dest = M_p[col]; - M_i[dest] = static_cast(std::get<0>(triplets[k])); - M_x[dest] = c_float(CGAL::to_double(std::get<2>(triplets[k]))); + M_i[dest] = static_cast(std::get<0>(triplets[k])); + M_x[dest] = OSQPFloat(CGAL::to_double(std::get<2>(triplets[k]))); M_p[col]++; } - c_int last = 0; + OSQPInt last = 0; for(std::size_t j=0; j<=n; ++j) { - const c_int tmp = M_p[j]; + const OSQPInt tmp = M_p[j]; M_p[j] = last; last = tmp; } @@ -341,19 +325,19 @@ class OSQP_quadratic_program_traits // std::cout << std::endl; } - void set_qlu_data(c_float *q_x, - c_float *l_x, - c_float *u_x) const + void set_qlu_data(OSQPFloat *q_x, + OSQPFloat *l_x, + OSQPFloat *u_x) const { for(std::size_t i=0; i Date: Wed, 28 Aug 2024 11:58:03 +0200 Subject: [PATCH 131/348] backport of https://github.com/CGAL/cgal/pull/7382 --- BGL/test/BGL/CMakeLists.txt | 4 ++-- Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt | 2 +- Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/BGL/test/BGL/CMakeLists.txt b/BGL/test/BGL/CMakeLists.txt index da8baf25ccbd..4f76ac1664ef 100644 --- a/BGL/test/BGL/CMakeLists.txt +++ b/BGL/test/BGL/CMakeLists.txt @@ -130,9 +130,9 @@ if (VTK_FOUND) if(VTK_LIBRARIES) target_link_libraries(test_bgl_read_write PRIVATE ${VTK_LIBRARIES}) - target_compile_definitions(test_bgl_read_write PRIVATE -DCGAL_USE_VTK) + target_compile_definitions(test_bgl_read_write PRIVATE -DCGAL_USE_VTK -DNOMINMAX) target_link_libraries(test_deprecated_io PRIVATE ${VTK_LIBRARIES}) - target_compile_definitions(test_deprecated_io PRIVATE -DCGAL_USE_VTK) + target_compile_definitions(test_deprecated_io PRIVATE -DCGAL_USE_VTK -DNOMINMAX) else() message(STATUS "Tests that use VTK will not be compiled.") endif() diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt index d7ed3ec6bb8b..bfe4bee7b745 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt @@ -66,7 +66,7 @@ if(VTK_FOUND) polyhedron_demo_plugin(vtk_plugin VTK_io_plugin KEYWORDS Viewer Mesh_3) target_link_libraries(vtk_plugin PUBLIC scene_surface_mesh_item scene_polylines_item scene_c3t3_item scene_points_with_normal_item ${VTK_LIBRARIES}) - target_compile_definitions(vtk_plugin PRIVATE -DCGAL_USE_VTK) + target_compile_definitions(vtk_plugin PRIVATE -DCGAL_USE_VTK -DNOMINMAX) else() message( STATUS diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt index 89d05476c462..d60aeb2f6d0c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt @@ -73,7 +73,7 @@ if(Boost_FILESYSTEM_FOUND) KEYWORDS Viewer Mesh_3) target_link_libraries(io_image_plugin PUBLIC scene_image_item ${VTK_LIBRARIES} CGAL::CGAL_ImageIO) if(VTK_LIBRARIES) - target_compile_definitions(io_image_plugin PRIVATE CGAL_USE_VTK) + target_compile_definitions(io_image_plugin PRIVATE -DCGAL_USE_VTK -DNOMINMAX) endif() if(TARGET Boost::filesystem) target_link_libraries(io_image_plugin PUBLIC Boost::filesystem From af8e134aa6d26da08eab18e1436ac693066c33ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 28 Aug 2024 14:04:57 +0200 Subject: [PATCH 132/348] doc boost mp as gmp replacement --- .../doc/Documentation/Third_party.txt | 31 +++++++++++++------ Documentation/doc/Documentation/Usage.txt | 2 +- Documentation/doc/Documentation/windows.txt | 2 +- Installation/CHANGES.md | 2 ++ 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/Documentation/doc/Documentation/Third_party.txt b/Documentation/doc/Documentation/Third_party.txt index d2eeb5d9b7e5..eaafe426bddc 100644 --- a/Documentation/doc/Documentation/Third_party.txt +++ b/Documentation/doc/Documentation/Third_party.txt @@ -72,23 +72,34 @@ As there is no canonical directory for where to find \boost on Windows, we recommend that you define the environment variable `BOOST_ROOT` and set it to where you have installed \boost, e.g., `C:\boost\boost_1_70_0`. -\subsection thirdpartyMPFR GNU Multiple Precision Arithmetic (GMP) and GNU Multiple Precision Floating-Point Reliably (MPFR) Libraries -GMP Version 5.0.1 or later, MPFR Version 3.0.0 or later +\subsection thirdpartyMP Multi Precision Number Type Library -The components \cgal, `CGAL_Core`, and `CGAL_Qt6` require -\gmp and \mpfr which are libraries for multi precision integers and rational numbers, -and for multi precision floating point numbers. - -\cgal combines floating point arithmetic with exact arithmetic -in order to be efficient and reliable. \cgal has a built-in -number type for that, but \gmp and \mpfr provide a faster -solution, and we recommend using them. +GNU Multiple Precision Arithmetic (GMP) and GNU Multiple Precision Floating-Point Reliably (MPFR) Libraries +are libraries for multi precision integers and rational numbers, and for multi precision floating point numbers. These libraries can be obtained from `https://gmplib.org/` and `https://www.mpfr.org/`. Since Visual \cpp is not properly supported by the \gmp and \mpfr projects, we provide precompiled versions of \gmp and \mpfr, which can be downloaded from the assets of a release. +Version supported are GMP Version 5.0.1 or later, MPFR Version 3.0.0 or later. + +The \boost library also provides a module for multi precision integers and rational numbers: +\boost multiprecision. +Versions supported are \boost Version 1.72 or later. + +The components \cgal, and `CGAL_Qt6` require either \gmp and \mpfr, or \boost multiprecision +for multi precision numbers. `CGAL_Core` requires \boost multiprecision. + +\cgal combines floating point arithmetic with exact arithmetic +in order to be efficient and reliable. \cgal has a built-in +number type for that, but previous alternatives are faster +solutions, and we recommend using one of them. + +The CMake variable `CGAL_CMAKE_EXACT_NT_BACKEND` can be used to select +the library that will be used internally for multi precision number types. +The variable `CGAL_CMAKE_EXACT_NT_BACKEND-STRINGS` contains all the possible +values. \section secoptional3rdpartysoftware Optional Third Party Libraries diff --git a/Documentation/doc/Documentation/Usage.txt b/Documentation/doc/Documentation/Usage.txt index 68a3ae850018..8547affb6918 100644 --- a/Documentation/doc/Documentation/Usage.txt +++ b/Documentation/doc/Documentation/Usage.txt @@ -36,7 +36,7 @@ Using \cgal requires a few core components to be previously installed:
  • a supported compiler (see Section \ref seccompilers),
  • \ref seccmake,
  • \ref thirdpartyBoost,
  • -
  • \ref thirdpartyMPFR.
  • +
  • a \ref thirdpartyMP.
  • Optional third-party software might be required to build examples and demos shipped with \cgal, diff --git a/Documentation/doc/Documentation/windows.txt b/Documentation/doc/Documentation/windows.txt index c7d613e5c3ae..b0b8875c2eeb 100644 --- a/Documentation/doc/Documentation/windows.txt +++ b/Documentation/doc/Documentation/windows.txt @@ -6,7 +6,7 @@ 15.9, 16.0, 17.0 (\visualstudio 2017, 2019, and 2022). \cgal is a library that has mandatory dependencies that must be first installed: -\ref thirdpartyBoost and \ref thirdpartyMPFR. +\ref thirdpartyBoost and a \ref thirdpartyMP. You have two options to install \cgal and its dependencies: you can either use the *Vcpkg library manager*, which will automatically install an appropriate version of diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index a8ddd38c1a1c..6526c913414c 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -13,6 +13,8 @@ Release date: June 2024 - LLVM Clang version 15.0.7 or later (on Linux) - Apple Clang compiler versions 10.0.1, 12.0.5, and 15.0.0 (on macOS) - The minimal supported version of Boost is now 1.72.0. +- GMP/MPFR are no longer mandatory to use CGAL, [Boost.Multiprecision](https://www.boost.org/doc/libs/1_72_0/libs/multiprecision/doc/html/index.html). + can be used instead. - The CGAL `Core` library is no longer based on GMP, but on [Boost.Multiprecision](https://www.boost.org/doc/libs/1_72_0/libs/multiprecision/doc/html/index.html). Either GMP backend or Boost backend can be used. From 6917edd6973b181a892b11caea9622c0ab55334d Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Wed, 28 Aug 2024 16:16:25 +0200 Subject: [PATCH 133/348] added test for formerly unused OutputIteratorValueType --- .../test/Stream_support/data/simple_ascii.ply | 16 ++++++ .../test/Stream_support/issue8155.cpp | 50 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 Stream_support/test/Stream_support/data/simple_ascii.ply create mode 100644 Stream_support/test/Stream_support/issue8155.cpp diff --git a/Stream_support/test/Stream_support/data/simple_ascii.ply b/Stream_support/test/Stream_support/data/simple_ascii.ply new file mode 100644 index 000000000000..5bc4a19d34f2 --- /dev/null +++ b/Stream_support/test/Stream_support/data/simple_ascii.ply @@ -0,0 +1,16 @@ +ply +format ascii 1.0 +comment VCGLIB generated +element vertex 3 +property float x +property float y +property float z +property float nx +property float ny +property float nz +element face 0 +property list uchar int vertex_indices +end_header +1 1 1 2 2 2 +3 3 3 4 4 4 +5 5 5 6 6 6 diff --git a/Stream_support/test/Stream_support/issue8155.cpp b/Stream_support/test/Stream_support/issue8155.cpp new file mode 100644 index 000000000000..f92bf9cca843 --- /dev/null +++ b/Stream_support/test/Stream_support/issue8155.cpp @@ -0,0 +1,50 @@ +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::FT FT; +typedef Kernel::Point_3 Point_3; +typedef Kernel::Vector_3 Vector_3; +typedef std::pair PointVectorPair; +typedef CGAL::First_of_pair_property_map Point_map; +typedef CGAL::Second_of_pair_property_map Normal_map; + +int main() +{ + std::vector pv_pairs; + const std::function lambda = + [&](const PointVectorPair& p) { + FT len = p.second.squared_length(); + if (len > 0 || len != 1.0) { + Vector_3 n = p.second * (1.0 / CGAL::sqrt(len)); + pv_pairs.push_back(std::make_pair(p.first, n)); + } + else pv_pairs.push_back(p); + }; + + pv_pairs.clear(); + std::ifstream file("data/simple_ascii.ply"); + CGAL::IO::read_PLY_with_properties(file, boost::function_output_iterator(lambda), + CGAL::make_ply_point_reader(Point_map()), + CGAL::make_ply_normal_reader(Normal_map())); + + assert(pv_pairs[0].first == Point_3(1, 1, 1)); + assert(pv_pairs[1].first == Point_3(3, 3, 3)); + assert(pv_pairs[2].first == Point_3(5, 5, 5)); + + for (std::size_t i = 0; i < pv_pairs.size(); i++) { + FT dev = CGAL::abs(1.0 - pv_pairs[i].second.squared_length()); + assert(dev < 0.01); + } + + return 0; +} From fdd8f7f3749493daafd94bc8bb9e67aa5f7f7497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Aug 2024 09:08:14 +0200 Subject: [PATCH 134/348] data dir does not exist --- .../polyfit_example_without_input_planes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp index b04ba46dd0be..c676fd83bbfc 100644 --- a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp +++ b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/polyfit_example_without_input_planes.cpp @@ -125,7 +125,7 @@ int main() return EXIT_FAILURE; } - const std::string& output_file("data/cube_result.off"); + const std::string& output_file("cube_result.off"); if (CGAL::IO::write_OFF(output_file, model)) std::cout << " Done. Saved to " << output_file << ". Time: " << t.time() << " sec." << std::endl; else { From abd99b68eb30fd4c7d13362091680e7720d19700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Aug 2024 10:10:20 +0200 Subject: [PATCH 135/348] handle nested holes in convex decomposition --- .../cd_nested_holes_test.cpp | 53 ++++++ .../test/Convex_decomposition_3/data/in1.off | 117 ++++++++++++ .../test/Convex_decomposition_3/data/in2.off | 144 ++++++++++++++ .../test/Convex_decomposition_3/data/in3.off | 180 ++++++++++++++++++ .../test/Convex_decomposition_3/data/in4.off | 180 ++++++++++++++++++ Nef_3/include/CGAL/Nef_polyhedron_3.h | 98 +++++++++- 6 files changed, 764 insertions(+), 8 deletions(-) create mode 100644 Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp create mode 100644 Convex_decomposition_3/test/Convex_decomposition_3/data/in1.off create mode 100644 Convex_decomposition_3/test/Convex_decomposition_3/data/in2.off create mode 100644 Convex_decomposition_3/test/Convex_decomposition_3/data/in3.off create mode 100644 Convex_decomposition_3/test/Convex_decomposition_3/data/in4.off diff --git a/Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp b/Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp new file mode 100644 index 000000000000..3c69b2a5339e --- /dev/null +++ b/Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include +#include +#include + +typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel; +typedef CGAL::Polyhedron_3 Polyhedron_3; +typedef CGAL::Nef_polyhedron_3 Nef_polyhedron_3; +typedef Nef_polyhedron_3::Volume_const_iterator Volume_const_iterator; + +std::size_t run(std::string path) +{ + Polyhedron_3 input; + std::ifstream(path) >> input; + + Nef_polyhedron_3 N(input); + + CGAL::convex_decomposition_3(N); + std::list convex_parts; + + Volume_const_iterator ci = ++N.volumes_begin(); + for( ; ci != N.volumes_end(); ++ci) { + if(ci->mark()) { + Polyhedron_3 P; + N.convert_inner_shell_to_polyhedron(ci->shells_begin(), P); + convex_parts.push_back(P); + } + } + +// int i=0; + for (const Polyhedron_3& P : convex_parts) + { +// std::ofstream("out_"+std::to_string(i++)+".off") << std::setprecision(17) << P; + CGAL_assertion(P.size_of_vertices()!=0); + } + + return convex_parts.size(); +} + +int main() +{ + std::size_t val = run("data/in1.off"); + assert(val==9); + val = run("data/in2.off"); + assert(val==10); + val = run("data/in3.off"); + assert(val==13); + val = run("data/in4.off"); + assert(val==17); +} diff --git a/Convex_decomposition_3/test/Convex_decomposition_3/data/in1.off b/Convex_decomposition_3/test/Convex_decomposition_3/data/in1.off new file mode 100644 index 000000000000..dabda4d9d3eb --- /dev/null +++ b/Convex_decomposition_3/test/Convex_decomposition_3/data/in1.off @@ -0,0 +1,117 @@ +OFF 40 76 0 +5 -5 4 +5 -5 2 +5 5 2 +5 5 4 +5 -5 -2 +5 -5 -4 +5 5 -4 +5 5 -2 +-5 5 4 +-5 -5 4 +-4 -4 4 +-4 4 4 +4 4 4 +4 -4 4 +-5 -5 -4 +-5 5 -4 +-4 4 -4 +-4 -4 -4 +4 -4 -4 +4 4 -4 +-5 5 2 +-5 -5 2 +-5 -5 -2 +-5 5 -2 +4 4 2 +4 -4 2 +4 -4 -2 +4 4 -2 +-4 4 2 +-4 -4 2 +-4 4 -2 +-4 -4 -2 +6 -6 2 +6 -6 -2 +6 6 -2 +6 6 2 +-6 6 2 +-6 -6 2 +-6 -6 -2 +-6 6 -2 +3 0 2 3 +3 2 0 1 +3 4 6 7 +3 6 4 5 +3 3 12 0 +3 3 11 12 +3 11 8 10 +3 8 11 3 +3 13 0 12 +3 10 0 13 +3 10 9 0 +3 9 10 8 +3 5 18 6 +3 5 17 18 +3 17 14 16 +3 14 17 5 +3 19 6 18 +3 16 6 19 +3 16 15 6 +3 15 16 14 +3 21 8 20 +3 8 21 9 +3 14 23 15 +3 23 14 22 +3 2 8 3 +3 8 2 20 +3 6 23 7 +3 23 6 15 +3 21 0 9 +3 0 21 1 +3 14 4 22 +3 4 14 5 +3 25 12 24 +3 12 25 13 +3 18 27 19 +3 27 18 26 +3 10 28 11 +3 28 10 29 +3 31 16 30 +3 16 31 17 +3 28 12 11 +3 12 28 24 +3 16 27 30 +3 27 16 19 +3 25 10 13 +3 10 25 29 +3 18 31 26 +3 31 18 17 +3 32 34 35 +3 34 32 33 +3 35 2 32 +3 35 20 2 +3 20 36 21 +3 36 20 35 +3 1 32 2 +3 21 32 1 +3 21 37 32 +3 37 21 36 +3 28 25 24 +3 25 28 29 +3 33 4 34 +3 33 22 4 +3 22 38 23 +3 38 22 33 +3 7 34 4 +3 23 34 7 +3 23 39 34 +3 39 23 38 +3 31 27 26 +3 27 31 30 +3 38 36 39 +3 36 38 37 +3 34 36 35 +3 36 34 39 +3 38 32 37 +3 32 38 33 diff --git a/Convex_decomposition_3/test/Convex_decomposition_3/data/in2.off b/Convex_decomposition_3/test/Convex_decomposition_3/data/in2.off new file mode 100644 index 000000000000..d09ff781d581 --- /dev/null +++ b/Convex_decomposition_3/test/Convex_decomposition_3/data/in2.off @@ -0,0 +1,144 @@ +OFF +48 92 0 + +2 2 2 +2 -2 2 +-2 2 2 +-2 -2 2 +-2 2 4 +2 2 4 +-2 -2 4 +2 -2 4 +5 -5 4 +-4 4 4 +5 5 4 +4 -4 4 +-5 -5 4 +-4 -4 -4 +5 -5 -4 +4 4 -4 +-5 5 -4 +-5 5 4 +5 5 -4 +-5 -5 -4 +4 4 4 +4 -4 -2 +-4 -4 4 +-4 4 -2 +-4 4 -4 +4 4 -2 +4 -4 -4 +6 -6 2 +5 5 2 +-5 5 2 +6 6 2 +5 -5 2 +-5 -5 2 +-6 -6 2 +5 -5 -2 +-5 -5 -2 +6 -6 -2 +5 5 -2 +-5 5 -2 +-6 6 -2 +-4 -4 -2 +-6 6 2 +6 6 -2 +-6 -6 -2 +-4 -4 2 +-4 4 2 +4 4 2 +4 -4 2 +3 2 4 5 +3 7 6 3 +3 5 7 1 +3 6 7 5 +3 3 6 4 +3 5 0 2 +3 3 1 7 +3 1 0 5 +3 5 4 6 +3 4 2 3 +3 8 28 10 +3 28 8 31 +3 34 18 37 +3 18 34 14 +3 10 20 8 +3 10 9 20 +3 9 17 22 +3 17 9 10 +3 11 8 20 +3 22 8 11 +3 22 12 8 +3 12 22 17 +3 14 26 18 +3 14 13 26 +3 13 19 24 +3 19 13 14 +3 15 18 26 +3 24 18 15 +3 24 16 18 +3 16 24 19 +3 32 17 29 +3 17 32 12 +3 19 38 16 +3 38 19 35 +3 28 17 10 +3 17 28 29 +3 18 38 37 +3 38 18 16 +3 32 8 12 +3 8 32 31 +3 19 34 35 +3 34 19 14 +3 47 20 46 +3 20 47 11 +3 26 25 15 +3 25 26 21 +3 22 45 9 +3 45 22 44 +3 40 24 23 +3 24 40 13 +3 45 20 9 +3 20 45 46 +3 24 25 23 +3 25 24 15 +3 47 22 11 +3 22 47 44 +3 26 40 21 +3 40 26 13 +3 27 42 30 +3 42 27 36 +3 30 28 27 +3 30 29 28 +3 29 41 32 +3 41 29 30 +3 31 27 28 +3 32 27 31 +3 32 33 27 +3 33 32 41 +3 2 0 45 +3 1 44 47 +3 36 34 42 +3 36 35 34 +3 35 43 38 +3 43 35 36 +3 37 42 34 +3 38 42 37 +3 38 39 42 +3 39 38 43 +3 40 25 21 +3 25 40 23 +3 43 41 39 +3 41 43 33 +3 42 41 30 +3 41 42 39 +3 43 27 33 +3 27 43 36 +3 44 1 3 +3 44 3 45 +3 45 3 2 +3 46 45 0 +3 46 0 47 +3 47 0 1 + diff --git a/Convex_decomposition_3/test/Convex_decomposition_3/data/in3.off b/Convex_decomposition_3/test/Convex_decomposition_3/data/in3.off new file mode 100644 index 000000000000..7685150981d6 --- /dev/null +++ b/Convex_decomposition_3/test/Convex_decomposition_3/data/in3.off @@ -0,0 +1,180 @@ +OFF +60 116 0 + +1 1 4 +1 0.33333333333333337 4 +1 -1 4 +0.33333333333333337 -1 4 +-1 -1 4 +-1 0.33333333333333337 4 +-1 1 4 +0.33333333333333337 1 4 +-2 2 2 +5 -5 4 +-4 4 4 +5 5 4 +4 -4 4 +-5 -5 4 +-4 -4 -4 +5 -5 -4 +4 4 -4 +-5 5 -4 +-5 5 4 +5 5 -4 +-5 -5 -4 +4 4 4 +4 -4 -2 +-4 -4 4 +-4 4 -2 +-4 4 -4 +4 4 -2 +4 -4 -4 +6 -6 2 +5 5 2 +-5 5 2 +6 6 2 +5 -5 2 +-5 -5 2 +-6 -6 2 +5 -5 -2 +-5 -5 -2 +6 -6 -2 +5 5 -2 +-5 5 -2 +-6 6 -2 +-4 -4 -2 +-6 6 2 +6 6 -2 +-6 -6 -2 +-2 -2 2 +-4 -4 2 +-4 4 2 +4 4 2 +4 -4 2 +2 -2 2 +2 2 2 +-2 2 4 +2 2 4 +2 -2 4 +-2 -2 4 +1 1 2 +1 -1 2 +-1 -1 2 +-1 1 2 +3 8 52 53 +3 54 55 45 +3 53 54 50 +3 0 1 53 +3 45 55 52 +3 53 51 8 +3 45 50 54 +3 50 51 53 +3 4 5 55 +3 52 8 45 +3 9 29 11 +3 29 9 32 +3 35 19 38 +3 19 35 15 +3 11 21 9 +3 11 10 21 +3 10 18 23 +3 18 10 11 +3 12 9 21 +3 23 9 12 +3 23 13 9 +3 13 23 18 +3 15 27 19 +3 15 14 27 +3 14 20 25 +3 20 14 15 +3 16 19 27 +3 25 19 16 +3 25 17 19 +3 17 25 20 +3 33 18 30 +3 18 33 13 +3 20 39 17 +3 39 20 36 +3 29 18 11 +3 18 29 30 +3 19 39 38 +3 39 19 17 +3 33 9 13 +3 9 33 32 +3 20 35 36 +3 35 20 15 +3 49 21 48 +3 21 49 12 +3 27 26 16 +3 26 27 22 +3 23 47 10 +3 47 23 46 +3 41 25 24 +3 25 41 14 +3 47 21 10 +3 21 47 48 +3 25 26 24 +3 26 25 16 +3 49 23 12 +3 23 49 46 +3 27 41 22 +3 41 27 14 +3 28 43 31 +3 43 28 37 +3 31 29 28 +3 31 30 29 +3 30 42 33 +3 42 30 31 +3 32 28 29 +3 33 28 32 +3 33 34 28 +3 34 33 42 +3 8 51 47 +3 50 46 49 +3 37 35 43 +3 37 36 35 +3 36 44 39 +3 44 36 37 +3 38 43 35 +3 39 43 38 +3 39 40 43 +3 40 39 44 +3 41 26 22 +3 26 41 24 +3 44 42 40 +3 42 44 34 +3 43 42 31 +3 42 43 40 +3 44 28 34 +3 28 44 37 +3 46 50 45 +3 46 45 47 +3 47 45 8 +3 48 47 51 +3 48 51 49 +3 49 51 50 +3 52 55 5 +3 52 7 53 +3 52 5 6 +3 53 7 0 +3 52 6 7 +3 54 53 1 +3 54 2 3 +3 54 1 2 +3 55 54 3 +3 55 3 4 +3 58 57 56 +3 59 56 7 +3 2 57 3 +3 0 56 1 +3 5 59 6 +3 56 59 58 +3 57 1 56 +3 57 2 1 +3 58 5 4 +3 7 56 0 +3 58 3 57 +3 4 3 58 +3 59 5 58 +3 7 6 59 + diff --git a/Convex_decomposition_3/test/Convex_decomposition_3/data/in4.off b/Convex_decomposition_3/test/Convex_decomposition_3/data/in4.off new file mode 100644 index 000000000000..1a7bbd1ba82e --- /dev/null +++ b/Convex_decomposition_3/test/Convex_decomposition_3/data/in4.off @@ -0,0 +1,180 @@ +OFF +60 116 0 + +1 1 4 +1 0.5 4 +1 -1 4 +0.5 -1 4 +-1 -1 4 +-1 0.5 4 +-1 1 4 +0.5 1 4 +-2 2 2 +5 -5 4 +-4 4 4 +5 5 4 +4 -4 4 +-5 -5 4 +-4 -4 -4 +5 -5 -4 +4 4 -4 +-5 5 -4 +-5 5 4 +5 5 -4 +-5 -5 -4 +4 4 4 +4 -4 -2 +-4 -4 4 +-4 4 -2 +-4 4 -4 +4 4 -2 +4 -4 -4 +6 -6 2 +5 5 2 +-5 5 2 +6 6 2 +5 -5 2 +-5 -5 2 +-6 -6 2 +5 -5 -2 +-5 -5 -2 +6 -6 -2 +5 5 -2 +-5 5 -2 +-6 6 -2 +-4 -4 -2 +-6 6 2 +6 6 -2 +-6 -6 -2 +-2 -2 2 +-4 -4 2 +-4 4 2 +4 4 2 +4 -4 2 +2 -2 2 +2 2 2 +-2 2 4 +2 2 4 +2 -2 4 +-2 -2 4 +1 1 1 +1 -1 1 +-1 -1 1 +-1 1 1 +3 8 52 53 +3 54 55 45 +3 53 54 50 +3 0 1 53 +3 45 55 52 +3 53 51 8 +3 45 50 54 +3 50 51 53 +3 4 5 55 +3 52 8 45 +3 9 29 11 +3 29 9 32 +3 35 19 38 +3 19 35 15 +3 11 21 9 +3 11 10 21 +3 10 18 23 +3 18 10 11 +3 12 9 21 +3 23 9 12 +3 23 13 9 +3 13 23 18 +3 15 27 19 +3 15 14 27 +3 14 20 25 +3 20 14 15 +3 16 19 27 +3 25 19 16 +3 25 17 19 +3 17 25 20 +3 33 18 30 +3 18 33 13 +3 20 39 17 +3 39 20 36 +3 29 18 11 +3 18 29 30 +3 19 39 38 +3 39 19 17 +3 33 9 13 +3 9 33 32 +3 20 35 36 +3 35 20 15 +3 49 21 48 +3 21 49 12 +3 27 26 16 +3 26 27 22 +3 23 47 10 +3 47 23 46 +3 41 25 24 +3 25 41 14 +3 47 21 10 +3 21 47 48 +3 25 26 24 +3 26 25 16 +3 49 23 12 +3 23 49 46 +3 27 41 22 +3 41 27 14 +3 28 43 31 +3 43 28 37 +3 31 29 28 +3 31 30 29 +3 30 42 33 +3 42 30 31 +3 32 28 29 +3 33 28 32 +3 33 34 28 +3 34 33 42 +3 8 51 47 +3 50 46 49 +3 37 35 43 +3 37 36 35 +3 36 44 39 +3 44 36 37 +3 38 43 35 +3 39 43 38 +3 39 40 43 +3 40 39 44 +3 41 26 22 +3 26 41 24 +3 44 42 40 +3 42 44 34 +3 43 42 31 +3 42 43 40 +3 44 28 34 +3 28 44 37 +3 46 50 45 +3 46 45 47 +3 47 45 8 +3 48 47 51 +3 48 51 49 +3 49 51 50 +3 52 55 5 +3 52 7 53 +3 52 5 6 +3 53 7 0 +3 52 6 7 +3 54 53 1 +3 54 2 3 +3 54 1 2 +3 55 54 3 +3 55 3 4 +3 58 57 56 +3 59 56 7 +3 2 57 3 +3 0 56 1 +3 5 59 6 +3 56 59 58 +3 57 1 56 +3 57 2 1 +3 58 5 4 +3 7 56 0 +3 58 3 57 +3 4 3 58 +3 59 5 58 +3 7 6 59 + diff --git a/Nef_3/include/CGAL/Nef_polyhedron_3.h b/Nef_3/include/CGAL/Nef_polyhedron_3.h index 05ef4dea9234..7b129f9dda28 100644 --- a/Nef_3/include/CGAL/Nef_polyhedron_3.h +++ b/Nef_3/include/CGAL/Nef_polyhedron_3.h @@ -904,10 +904,11 @@ class Nef_polyhedron_3 : public CGAL::Handle_for< Nef_polyhedron_3_rep& omit_vertex; int nov, nof; + bool hh; public: Find_holes(Unique_hash_map& omit_vertex_) - : omit_vertex(omit_vertex_), nov(0), nof(0) {} + : omit_vertex(omit_vertex_), nov(0), nof(0), hh(false) {} void visit(Halffacet_const_handle f) { ++nof; @@ -920,10 +921,11 @@ class Nef_polyhedron_3 : public CGAL::Handle_for< Nef_polyhedron_3_repsource()->source()] = true; --nov; + hh=true; } } else if(fc.is_shalfloop()) { SHalfloop_const_handle sl(fc); - omit_vertex[sl->incident_sface()->center_vertex()]; + omit_vertex[sl->incident_sface()->center_vertex()] = true; --nov; } else CGAL_error_msg( "wrong handle type"); @@ -943,6 +945,63 @@ class Nef_polyhedron_3 : public CGAL::Handle_for< Nef_polyhedron_3_rep& omit_vertex; + int norv, nof; + + public: + Nested_holes(Unique_hash_map& omit_vertex_) + : omit_vertex(omit_vertex_), norv(0), nof(0) {} + + void visit(Halffacet_const_handle f) { + Halffacet_cycle_const_iterator fc = f->facet_cycles_begin(); + CGAL_assertion(fc.is_shalfedge()); + + SHalfedge_around_facet_const_circulator sfc(fc), send(sfc); + bool all_in=true; + bool all_out=true; + CGAL_For_all(sfc, send) { + if (omit_vertex[sfc->source()->source()]) + all_in=false; + else + all_out=false; + } + if (!all_in && !all_out) + { + SHalfedge_around_facet_const_circulator sfc(fc), send(sfc); + ++nof; + CGAL_For_all(sfc, send) { + if (!omit_vertex[sfc->source()->source()]) + { + omit_vertex[sfc->source()->source()]=true; + ++norv; + } + } + } + if (all_in) + ++nof; + } + + void visit(Vertex_const_handle) {} + void visit(SFace_const_handle) {} + void visit(Halfedge_const_handle) {} + void visit(SHalfedge_const_handle) {} + void visit(SHalfloop_const_handle) {} + + int number_of_removed_vertices() const { + return norv; + } + + int number_of_facets() const { + return nof; + } }; class Add_vertices { @@ -1001,14 +1060,19 @@ class Nef_polyhedron_3 : public CGAL::Handle_for< Nef_polyhedron_3_repsource()->source()]) return; - B.begin_facet(); + SHalfedge_around_facet_const_circulator hc_start(se); SHalfedge_around_facet_const_circulator hc_end(hc_start); + std::vector vids; CGAL_For_all(hc_start,hc_end) { - CGAL_NEF_TRACEN(" add vertex " << hc_start->source()->center_vertex()->point()); - B.add_vertex_to_facet(VI[hc_start->source()->center_vertex()]); + if (omit_vertex[hc_start->source()->center_vertex()]) + { + std::cout << "issue with " << se->source()->source()->point() << "\n"; + return; + } + vids.push_back(VI[hc_start->source()->center_vertex()]); } - B.end_facet(); + B.add_facet (vids.begin(), vids.end()); } void visit(SFace_const_handle) {} @@ -1033,11 +1097,29 @@ class Nef_polyhedron_3 : public CGAL::Handle_for< Nef_polyhedron_3_rep B(hds, true); + // first mark vertices of holes of each halffacet as omitted. Find_holes F(omit_vertex); scd.visit_shell_objects(sf, F); + std::size_t nb_v = F.number_of_vertices(); + std::size_t nb_f = F.number_of_facets(); + + // then if a halffacet contains a vertex marked as omitted, all its vertices + // must be marked as such + if (F.holes_detected()) + { + while(true) + { + Nested_holes F2(omit_vertex); + scd.visit_shell_objects(sf, F2); + if (F2.number_of_removed_vertices()==0) break; + nb_v-=F2.number_of_removed_vertices(); + nb_f=F2.number_of_facets(); + } + } + - B.begin_surface(F.number_of_vertices(), - F.number_of_facets(), + B.begin_surface(nb_v, + nb_f, F.number_of_vertices()+F.number_of_facets()-2); Add_vertices A(B,omit_vertex, VI); From a82fb5088b4ad48cd01237b74a84cc6e230da6a6 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Fri, 30 Aug 2024 10:14:36 +0200 Subject: [PATCH 136/348] allow use of Rapidlasso Laslib as alternative to CGALs fork --- .../cmake/modules/CGAL_LASLIB_support.cmake | 4 +- .../Point_set_processing_3/CMakeLists.txt | 2 + .../write_las_example.cpp | 45 +++++++++ .../include/CGAL/IO/read_las_points.h | 6 +- .../include/CGAL/IO/write_las_points.h | 95 ++++++++++++------ .../test/Stream_support/CMakeLists.txt | 14 ++- .../Stream_support/data/colored_points.las | Bin 0 -> 397 bytes .../test/Stream_support/test_LAS.cpp | 63 ++++++++++++ 8 files changed, 196 insertions(+), 33 deletions(-) create mode 100644 Point_set_processing_3/examples/Point_set_processing_3/write_las_example.cpp create mode 100644 Stream_support/test/Stream_support/data/colored_points.las create mode 100644 Stream_support/test/Stream_support/test_LAS.cpp diff --git a/Installation/cmake/modules/CGAL_LASLIB_support.cmake b/Installation/cmake/modules/CGAL_LASLIB_support.cmake index 7c65da9ebf04..e541326fdd83 100644 --- a/Installation/cmake/modules/CGAL_LASLIB_support.cmake +++ b/Installation/cmake/modules/CGAL_LASLIB_support.cmake @@ -2,7 +2,7 @@ if(LASLIB_FOUND AND NOT TARGET CGAL::LASLIB_support) add_library(CGAL::LASLIB_support INTERFACE IMPORTED) set_target_properties(CGAL::LASLIB_support PROPERTIES INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_LASLIB" - INTERFACE_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR};${LASZIP_INCLUDE_DIR}" - INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR};${LASZIP_INCLUDE_DIR}" + INTERFACE_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR}" + INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR}" INTERFACE_LINK_LIBRARIES "${LASLIB_LIBRARIES}") endif() 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 0e684584b131..de0b1a236930 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 @@ -71,7 +71,9 @@ find_package(LASLIB) include(CGAL_LASLIB_support) if(TARGET CGAL::LASLIB_support) create_single_source_cgal_program("read_las_example.cpp") + create_single_source_cgal_program("write_las_example.cpp") target_link_libraries(read_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support) + target_link_libraries(write_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support) else() message( STATUS diff --git a/Point_set_processing_3/examples/Point_set_processing_3/write_las_example.cpp b/Point_set_processing_3/examples/Point_set_processing_3/write_las_example.cpp new file mode 100644 index 000000000000..200d31cc7e48 --- /dev/null +++ b/Point_set_processing_3/examples/Point_set_processing_3/write_las_example.cpp @@ -0,0 +1,45 @@ +#include + +#include +#include +#include + +#include +#include +#include + +// types +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::FT FT; +typedef Kernel::Point_3 Point; +typedef std::array Color; +typedef std::pair PointWithColor; + +int main(int argc, char*argv[]) +{ + const char* fname = "colored_points.las"; + + std::ofstream os(fname, std::ios::binary); + + std::vector points; // store points + points.push_back(std::make_pair(Point(0, 0, 0), Color{ 65535, 0, 0, 0 })); + points.push_back(std::make_pair(Point(1, 0, 0), Color{ 0, 65535, 0, 0 })); + points.push_back(std::make_pair(Point(0, 1, 0), Color{ 0, 0, 65535, 0 })); + points.push_back(std::make_pair(Point(1, 1, 0), Color{ 0, 65535, 65535, 0 })); + points.push_back(std::make_pair(Point(1, 1, 1), Color{ 65535, 65535, 0, 0 })); + + // Writes a .las point set file with colors + if(!CGAL::IO::write_LAS_with_properties(os, points, + CGAL::IO::make_las_point_writer(CGAL::First_of_pair_property_map()), + std::make_tuple(CGAL::Second_of_pair_property_map(), + CGAL::IO::LAS_property::R(), + CGAL::IO::LAS_property::G(), + CGAL::IO::LAS_property::B(), + CGAL::IO::LAS_property::I()))) + { + std::cerr << "Error: cannot write file " << fname << std::endl; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/Point_set_processing_3/include/CGAL/IO/read_las_points.h b/Point_set_processing_3/include/CGAL/IO/read_las_points.h index beb35f44355f..e7d70470ff13 100644 --- a/Point_set_processing_3/include/CGAL/IO/read_las_points.h +++ b/Point_set_processing_3/include/CGAL/IO/read_las_points.h @@ -44,7 +44,7 @@ # pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif -#define USE_AS_DLL +#define USE_AS_DLL 1 #include #undef USE_AS_DLL @@ -385,7 +385,11 @@ bool read_LAS_with_properties(std::istream& is, if(!is) return false; +#if LAS_TOOLS_VERSION <= 170805 LASreaderLAS lasreader; +#else + LASreaderLAS lasreader(nullptr); +#endif lasreader.open(is); while(lasreader.read_point()) diff --git a/Point_set_processing_3/include/CGAL/IO/write_las_points.h b/Point_set_processing_3/include/CGAL/IO/write_las_points.h index aa153ec4c443..661bdf86977d 100644 --- a/Point_set_processing_3/include/CGAL/IO/write_las_points.h +++ b/Point_set_processing_3/include/CGAL/IO/write_las_points.h @@ -84,41 +84,41 @@ make_las_point_writer(PointMap point_map) namespace internal { namespace LAS { - inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::Intensity&) + inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::Intensity&) { r.set_intensity(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Return_number&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Return_number&) { r.set_return_number(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Number_of_returns&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Number_of_returns&) { r.set_number_of_returns(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Scan_direction_flag&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Scan_direction_flag&) { r.set_scan_direction_flag(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Edge_of_flight_line&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Edge_of_flight_line&) { r.set_edge_of_flight_line(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Classification&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Classification&) { r.set_classification(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Synthetic_flag&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Synthetic_flag&) { r.set_synthetic_flag(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Keypoint_flag&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Keypoint_flag&) { r.set_keypoint_flag(v); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::Withheld_flag&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::Withheld_flag&) { r.set_withheld_flag(v); } - inline void output_value(LASpoint& r, const float& v, LAS_property::Scan_angle&) + inline void output_value(LASpoint& r, const float& v, const LAS_property::Scan_angle&) { r.set_scan_angle_rank(char(v)); } - inline void output_value(LASpoint& r, const unsigned char& v, LAS_property::User_data&) + inline void output_value(LASpoint& r, const unsigned char& v, const LAS_property::User_data&) { r.set_user_data(v); } - inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::Point_source_ID&) + inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::Point_source_ID&) { r.set_point_source_ID(v); } - inline void output_value(LASpoint& r, const unsigned int& v, LAS_property::Deleted_flag&) + inline void output_value(LASpoint& r, const unsigned int& v, const LAS_property::Deleted_flag&) { r.set_deleted_flag(v); } - inline void output_value(LASpoint& r, const double& v, LAS_property::GPS_time&) + inline void output_value(LASpoint& r, const double& v, const LAS_property::GPS_time&) { r.set_gps_time(v); } - inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::R&) + inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::R&) { r.set_R(v); } - inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::G&) + inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::G&) { r.set_G(v); } - inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::B&) + inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::B&) { r.set_B(v); } - inline void output_value(LASpoint& r, const unsigned short& v, LAS_property::I&) + inline void output_value(LASpoint& r, const unsigned short& v, const LAS_property::I&) { r.set_I(v); } template @@ -134,20 +134,57 @@ namespace LAS { output_value (point, get(current.first, *it), current.second); } + template + void output_tuple(LASpoint& point, const Value& v, const Tuple& t, std::index_sequence) { + output_value(point, std::get(v), std::get(t)); + } + + template + void output_tuple(LASpoint& point, const Value& v, const Tuple& t, std::index_sequence) { + output_value(point, std::get(v), std::get(t)); + output_tuple(point, v, t, std::index_sequence()); + } + template + typename PropertyMap, + typename ... T> void output_properties(LASpoint& point, - ForwardIterator it, - std::pair&& current, - NextPropertyHandler&& next, - PropertyHandler&& ... properties) + ForwardIterator it, + std::tuple&& current) { - output_value (point, get(current.first, *it), current.second); - output_properties (point, it, std::forward(next), - std::forward(properties)...); + output_tuple(point, get(std::get<0>(current), *it), std::tuple(), std::index_sequence_for{}); + } + + template + void output_properties(LASpoint& point, + ForwardIterator it, + std::pair&& current, + NextPropertyHandler&& next, + PropertyHandler&& ... properties) + { + output_value(point, get(current.first, *it), current.second); + output_properties(point, it, std::forward(next), + std::forward(properties)...); + } + + template + void output_properties(LASpoint& point, + ForwardIterator it, + std::tuple&& current, + NextPropertyHandler&& next, + PropertyHandler&& ... properties) + { + output_tuple(point, get(std::get<0>(current), *it), std::tuple(), std::index_sequence_for{}); + output_properties(point, it, std::forward(next), + std::forward(properties)...); } } // namespace LAS diff --git a/Stream_support/test/Stream_support/CMakeLists.txt b/Stream_support/test/Stream_support/CMakeLists.txt index ade4d2c88f8c..9c41b5b2dac3 100644 --- a/Stream_support/test/Stream_support/CMakeLists.txt +++ b/Stream_support/test/Stream_support/CMakeLists.txt @@ -13,6 +13,9 @@ find_library( NAMES 3MF DOC "Path to the lib3MF library") +find_package(LASLIB QUIET) +include(CGAL_LASLIB_support) + # create a target per cppfile file( GLOB cppfiles @@ -33,6 +36,15 @@ foreach(cppfile ${cppfiles}) ) endif() else() - create_single_source_cgal_program("${cppfile}") + if("${cppfile}" STREQUAL "test_LAS.cpp") + if(TARGET CGAL::LASLIB_support) + create_single_source_cgal_program("test_LAS.cpp") + target_link_libraries(test_LAS PRIVATE ${CGAL_libs} CGAL::LASLIB_support) + else() + message(STATUS "NOTICE: Some tests require the LASlib library, and will not be compiled.") + endif() + else() + create_single_source_cgal_program("${cppfile}") + endif() endif() endforeach() diff --git a/Stream_support/test/Stream_support/data/colored_points.las b/Stream_support/test/Stream_support/data/colored_points.las new file mode 100644 index 0000000000000000000000000000000000000000..102aee9443e3685f2351986e4b253a9f6da7a3cd GIT binary patch literal 397 zcmeZq40dC{0vMUF2$C%HnBg&053>>jE077o=wRwKwHMraf_CUMx;hwtVSm~G|Nr0H z6U&FGgV3BP-2eYU-2W$MStEo|RRCqdYLHc-s{pA1nSn3|T?J4ct^%S8RRu_zfdK$t C+dcmP literal 0 HcmV?d00001 diff --git a/Stream_support/test/Stream_support/test_LAS.cpp b/Stream_support/test/Stream_support/test_LAS.cpp new file mode 100644 index 000000000000..555e80f533ab --- /dev/null +++ b/Stream_support/test/Stream_support/test_LAS.cpp @@ -0,0 +1,63 @@ +#include + +#include +#include + +#include +#include +#include + +// types +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::FT FT; +typedef Kernel::Point_3 Point; +typedef std::array Color; +typedef std::pair PointWithColor; + +int main(int argc, char* argv[]) +{ + std::ifstream is("data/colored_points.las"); + + // Reads a .las point set file with normal vectors and colors + std::vector points; // store points + if (!CGAL::IO::read_LAS_with_properties(is, std::back_inserter(points), + CGAL::IO::make_las_point_reader(CGAL::First_of_pair_property_map()), + std::make_tuple(CGAL::Second_of_pair_property_map(), + CGAL::Construct_array(), + CGAL::IO::LAS_property::R(), + CGAL::IO::LAS_property::G(), + CGAL::IO::LAS_property::B(), + CGAL::IO::LAS_property::I()))) + { + std::cerr << "Error: cannot read file data/colored_points.las" << std::endl; + return EXIT_FAILURE; + } + + CGAL_assertion(points.size() == 5); + CGAL_assertion(points[0].second[0] == 65535); + CGAL_assertion(points[0].second[1] == 0); + CGAL_assertion(points[0].second[2] == 0); + CGAL_assertion(points[0].second[3] == 0); + + CGAL_assertion(points[1].second[0] == 0); + CGAL_assertion(points[1].second[1] == 65535); + CGAL_assertion(points[1].second[2] == 0); + CGAL_assertion(points[1].second[3] == 0); + + CGAL_assertion(points[2].second[0] == 0); + CGAL_assertion(points[2].second[1] == 0); + CGAL_assertion(points[2].second[2] == 65535); + CGAL_assertion(points[2].second[3] == 0); + + CGAL_assertion(points[3].second[0] == 0); + CGAL_assertion(points[3].second[1] == 65535); + CGAL_assertion(points[3].second[2] == 65535); + CGAL_assertion(points[3].second[3] == 0); + + CGAL_assertion(points[4].second[0] == 65535); + CGAL_assertion(points[4].second[1] == 65535); + CGAL_assertion(points[4].second[2] == 0); + CGAL_assertion(points[4].second[3] == 0); + + return EXIT_SUCCESS; +} From ee4dbad0b3102d71db165b13712ac07a461c2508 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 28 Aug 2024 17:06:05 +0200 Subject: [PATCH 137/348] doc fix --- Ridges_3/doc/Ridges_3/Ridges_3.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Ridges_3/doc/Ridges_3/Ridges_3.txt b/Ridges_3/doc/Ridges_3/Ridges_3.txt index e6ef0d7877d0..3eacadc8a7a6 100644 --- a/Ridges_3/doc/Ridges_3/Ridges_3.txt +++ b/Ridges_3/doc/Ridges_3/Ridges_3.txt @@ -44,8 +44,8 @@ functions of the package are provided in Section \ref Ridges_3Examples. For a detailed introduction to ridges and related topics, the reader may consult -\cgalCite{cgal:hgygm-ttdpf-99},cgal:p-gd-01, as well as -the following survey article \cgalCite{cgal:cp-ssulc-05}. +\cgalCite{cgal:hgygm-ttdpf-99}, as well as +the survey article \cgalCite{cgal:cp-ssulc-05}. In the sequel, we just introduce the basic notions so as to explain our algorithms. Consider a smooth embedded surface, and denote \f$ k_1\f$ and \f$ k_2\f$ the principal curvatures, with \f$ k_1\geq k_2\f$. Umbilics are @@ -399,7 +399,7 @@ neighborhood. \subsection Ridges_3Exampleprogram Example Program The following program computes ridges and umbilics from an off -file.\cgalFootnote{Model data may be downloaded via ftp://ftp.mpi-sb.mpg.de/pub/outgoing/CGAL/Ridges_3_datafiles.tgz . The mechanical part model has been provided courtesy of Dassault System to produce \cgalFigureRef{figmechanical_crest_filteredintro}, due to copyright issues the available model is not the same, it is provided by the AIM\@SHAPE Shape Repository.} It uses the package \ref PkgJetFitting3 to estimate the differential +file. It uses the package \ref PkgJetFitting3 to estimate the differential quantities. The default output file gives rough data for visualization purpose, a verbose output file may also be asked for. Parameters are @@ -536,7 +536,7 @@ Ridges on the ellipsoid, normals pointing outward. Color coding : of crest ridges on a mechanical model, and has been computed as follows: \code{.cpp} -./Compute_Ridges_Umbilics -f data/mecanic.off -d 4 -m 4 -a 4 -t 4 +./Compute_Ridges_Umbilics -f data/rocker-arm.off -d 4 -m 4 -a 4 -t 4 \endcode \cgalFigureBegin{figmechanical_crest_filteredintro,mecanic-sub1_crest-jpg.png} From 24ca2df2b38dc88e7c832a93b011ca02b728a64c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 30 Aug 2024 15:35:47 +0200 Subject: [PATCH 138/348] do not mention data that does not exist --- Ridges_3/doc/Ridges_3/Ridges_3.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Ridges_3/doc/Ridges_3/Ridges_3.txt b/Ridges_3/doc/Ridges_3/Ridges_3.txt index 3eacadc8a7a6..90854893a013 100644 --- a/Ridges_3/doc/Ridges_3/Ridges_3.txt +++ b/Ridges_3/doc/Ridges_3/Ridges_3.txt @@ -533,11 +533,7 @@ Ridges on the ellipsoid, normals pointing outward. Color coding : \subsection Ridges_3ExampleFilteringofCrestRidgesona Example: Filtering of Crest Ridges on a Mechanical Part \cgalFigureRef{figmechanical_crest_filteredintro} illustrates the filtering -of crest ridges on a mechanical model, and has been computed as follows: - -\code{.cpp} -./Compute_Ridges_Umbilics -f data/rocker-arm.off -d 4 -m 4 -a 4 -t 4 -\endcode +of crest ridges on a mechanical model. \cgalFigureBegin{figmechanical_crest_filteredintro,mecanic-sub1_crest-jpg.png} Mechanical part (37k pts). Left: All crest lines. Middle: crests filtered From 04e90b7eb43d8457784df46ce956b4f2f6879397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 30 Aug 2024 15:58:57 +0200 Subject: [PATCH 139/348] do not use empty variable --- Stream_support/test/Stream_support/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Stream_support/test/Stream_support/CMakeLists.txt b/Stream_support/test/Stream_support/CMakeLists.txt index 9c41b5b2dac3..a58a12410cc1 100644 --- a/Stream_support/test/Stream_support/CMakeLists.txt +++ b/Stream_support/test/Stream_support/CMakeLists.txt @@ -39,7 +39,7 @@ foreach(cppfile ${cppfiles}) if("${cppfile}" STREQUAL "test_LAS.cpp") if(TARGET CGAL::LASLIB_support) create_single_source_cgal_program("test_LAS.cpp") - target_link_libraries(test_LAS PRIVATE ${CGAL_libs} CGAL::LASLIB_support) + target_link_libraries(test_LAS PRIVATE CGAL::LASLIB_support) else() message(STATUS "NOTICE: Some tests require the LASlib library, and will not be compiled.") endif() From 21f0f805c7a55a6908b8dec13d4c3feb6286b1aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 30 Aug 2024 16:17:38 +0200 Subject: [PATCH 140/348] fix condition --- .../test/Point_set_processing_3/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 895fae529074..733ce26de22a 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 @@ -39,7 +39,7 @@ create_single_source_cgal_program( "structuring_test.cpp" ) #Use LAS #disable if MSVC 2017 -if(NOT MSVC_VERSION OR (MSVC_VERSION GREATER_EQUAL 1919 AND MSVC_VERSION LESS 1910)) +if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910) find_package(LASLIB) include(CGAL_LASLIB_support) if (TARGET CGAL::LASLIB_support) From ce3e8ae0dea37bb15d285a47f5c4976cd494dfe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 30 Aug 2024 16:23:27 +0200 Subject: [PATCH 141/348] update macro --- Point_set_processing_3/include/CGAL/IO/write_las_points.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Point_set_processing_3/include/CGAL/IO/write_las_points.h b/Point_set_processing_3/include/CGAL/IO/write_las_points.h index 661bdf86977d..22e93b232b98 100644 --- a/Point_set_processing_3/include/CGAL/IO/write_las_points.h +++ b/Point_set_processing_3/include/CGAL/IO/write_las_points.h @@ -38,7 +38,7 @@ # pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif -#define USE_AS_DLL +#define USE_AS_DLL 1 #include #include #include From 830d13734d2cedd45690353a7dc2fc714f6e4a11 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Fri, 30 Aug 2024 16:29:43 +0200 Subject: [PATCH 142/348] copy from siggraph24 branch added parameter estimation --- .../include/CGAL/KSP_3/Data_structure.h | 12 - .../include/CGAL/Kinetic_space_partition_3.h | 10 +- .../ksr_parameters.cpp | 37 +- .../CGAL/Kinetic_surface_reconstruction_3.h | 60 +- Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt | 9 + .../Kinetic_surface_reconstruction_plugin.cpp | 603 ++++++++++++++++++ .../Kinetic_surface_reconstruction_plugin.ui | 425 ++++++++++++ .../Point_set_normal_estimation_plugin.cpp | 1 + Point_set_3/include/CGAL/Point_set_3.h | 2 +- .../Least_squares_plane_fit_sorting.h | 68 +- 10 files changed, 1184 insertions(+), 43 deletions(-) create mode 100644 Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp create mode 100644 Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.ui diff --git a/Kinetic_space_partition/include/CGAL/KSP_3/Data_structure.h b/Kinetic_space_partition/include/CGAL/KSP_3/Data_structure.h index 5a64606321a9..25a855079e54 100644 --- a/Kinetic_space_partition/include/CGAL/KSP_3/Data_structure.h +++ b/Kinetic_space_partition/include/CGAL/KSP_3/Data_structure.h @@ -205,13 +205,6 @@ class Data_structure { } }; - struct Reconstructed_model { - std::vector pfaces; - void clear() { - pfaces.clear(); - } - }; - private: std::vector m_support_planes; std::vector m_initial_support_planes; @@ -239,7 +232,6 @@ class Data_structure { std::vector m_face2sp; std::vector > m_sp2input_polygon; std::map m_input_polygon_map; // Maps index of input polygon onto support plane indices. - Reconstructed_model m_reconstructed_model; public: Data_structure(const Parameters& parameters, const std::string &prefix) : to_exact(), from_exact(), m_parameters(parameters), m_prefix(prefix) { @@ -266,7 +258,6 @@ class Data_structure { m_volumes.clear(); m_pface_neighbors.clear(); m_input_polygon_map.clear(); - m_reconstructed_model.clear(); } void precompute_iedge_data() { @@ -594,9 +585,6 @@ class Data_structure { const std::vector &face(std::size_t face_index) const { return m_face2vertices[face_index]; } const Point_3& vertex(std::size_t vertex_index) const { return m_vertices[vertex_index]; } - Reconstructed_model& reconstructed_model() { return m_reconstructed_model; } - const Reconstructed_model& reconstructed_model() const { return m_reconstructed_model; } - /******************************* ** SUPPORT PLANES ** ********************************/ diff --git a/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h b/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h index ab53a84a6d93..547ebc0a97a8 100644 --- a/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h +++ b/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h @@ -566,7 +566,15 @@ class Kinetic_space_partition_3 { #ifndef DOXYGEN_RUNNING void partition(std::size_t k, FT& partition_time, FT& finalization_time, FT& conformal_time) { - m_volumes.clear(); + if (!m_volumes.empty()) { + for (Sub_partition& node : m_partition_nodes) { + node.m_data->reset_to_initialization(); + node.face_neighbors.clear(); + node.face2vertices.clear(); + node.volumes.clear(); + } + m_volumes.clear(); + } Timer timer; timer.start(); partition_time = 0; diff --git a/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/ksr_parameters.cpp b/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/ksr_parameters.cpp index 123c7066af31..9ac52e26b9cc 100644 --- a/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/ksr_parameters.cpp +++ b/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/ksr_parameters.cpp @@ -13,19 +13,19 @@ #include "include/Parameters.h" #include "include/Terminal_parser.h" -using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel; -using FT = typename Kernel::FT; -using Point_3 = typename Kernel::Point_3; -using Vector_3 = typename Kernel::Vector_3; +using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel; +using FT = typename Kernel::FT; +using Point_3 = typename Kernel::Point_3; +using Vector_3 = typename Kernel::Vector_3; using Segment_3 = typename Kernel::Segment_3; -using Point_set = CGAL::Point_set_3; -using Point_map = typename Point_set::Point_map; -using Normal_map = typename Point_set::Vector_map; +using Point_set = CGAL::Point_set_3; +using Point_map = typename Point_set::Point_map; +using Normal_map = typename Point_set::Vector_map; using KSR = CGAL::Kinetic_surface_reconstruction_3; -using Parameters = CGAL::KSR::All_parameters; +using Parameters = CGAL::KSR::All_parameters; using Terminal_parser = CGAL::KSR::Terminal_parser; using Timer = CGAL::Real_timer; @@ -50,10 +50,10 @@ void parse_terminal(Terminal_parser& parser, Parameters& parameters) { parser.add_str_parameter("-data", parameters.data); // Shape detection. - parser.add_val_parameter("-kn" , parameters.k_neighbors); - parser.add_val_parameter("-dist" , parameters.maximum_distance); + parser.add_val_parameter("-kn", parameters.k_neighbors); + parser.add_val_parameter("-dist", parameters.maximum_distance); parser.add_val_parameter("-angle", parameters.maximum_angle); - parser.add_val_parameter("-minp" , parameters.min_region_size); + parser.add_val_parameter("-minp", parameters.min_region_size); // Shape regularization. @@ -167,10 +167,18 @@ int main(const int argc, const char** argv) { // Algorithm. KSR ksr(point_set, param); + FT max_d, max_dev; + std::size_t num; + ksr.estimate_detection_parameters(max_d, max_dev, num); + std::cout << "d: " << max_d << std::endl; + std::cout << "dev: " << max_dev << std::endl; + std::cout << "num: " << num << std::endl; + Timer timer; timer.start(); std::size_t num_shapes = ksr.detect_planar_shapes(param); + std::cout << num_shapes << " detected planar shapes" << std::endl; FT after_shape_detection = timer.time(); @@ -198,12 +206,12 @@ int main(const int argc, const char** argv) { FT after_reconstruction = timer.time(); if (polylist.size() > 0) - CGAL::IO::write_polygon_soup("polylist_" + std::to_string(parameters.graphcut_lambda) + (parameters.use_ground ? "_g" : "_") + ".off", vtx, polylist); + CGAL::IO::write_polygon_soup("building_c_" + std::to_string(parameters.graphcut_lambda) + (parameters.use_ground ? "_g" : "_") + ".off", vtx, polylist); timer.stop(); const FT time = static_cast(timer.time()); - std::vector lambdas{0.3, 0.5, 0.6, 0.7, 0.73, 0.75, 0.77, 0.8, 0.9, 0.95, 0.99}; + std::vector lambdas{ 0.3, 0.5, 0.6, 0.7, 0.73, 0.75, 0.77, 0.8, 0.9, 0.95, 0.99 }; bool non_empty = false; @@ -214,7 +222,6 @@ int main(const int argc, const char** argv) { vtx.clear(); polylist.clear(); - if (parameters.use_ground) ksr.reconstruct_with_ground(l, std::back_inserter(vtx), std::back_inserter(polylist)); else @@ -223,7 +230,7 @@ int main(const int argc, const char** argv) { if (polylist.size() > 0) { non_empty = true; - CGAL::IO::write_polygon_soup("polylist_" + std::to_string(l) + (parameters.use_ground ? "_g" : "_") + ".off", vtx, polylist); + CGAL::IO::write_polygon_soup("building_c_" + std::to_string(l) + (parameters.use_ground ? "_g" : "_") + ".off", vtx, polylist); } } diff --git a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h index 7df975df13c3..94db973672da 100644 --- a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h +++ b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h @@ -94,6 +94,9 @@ class Kinetic_surface_reconstruction_3 { const NamedParameters& np = CGAL::parameters::default_values()) : m_points(points), m_ground_polygon_index(-1), m_kinetic_partition(np) { m_verbose = parameters::choose_parameter(parameters::get_parameter(np, internal_np::verbose), false); m_debug = parameters::choose_parameter(parameters::get_parameter(np, internal_np::debug), false); + + m_point_map = Point_set_processing_3_np_helper::get_point_map(m_points, np); + m_normal_map = Point_set_processing_3_np_helper::get_normal_map(m_points, np); } /*! @@ -189,9 +192,6 @@ class Kinetic_surface_reconstruction_3 { m_regions.clear(); m_planar_regions.clear(); - m_point_map = Point_set_processing_3_np_helper::get_point_map(m_points, np); - m_normal_map = Point_set_processing_3_np_helper::get_normal_map(m_points, np); - create_planar_shapes(np); CGAL_assertion(m_planes.size() == m_polygons.size()); @@ -323,6 +323,31 @@ class Kinetic_surface_reconstruction_3 { partition(k); } + void estimate_detection_parameters(FT& max_distance, FT& normal_dev, std::size_t& min_inliers) { + if (!m_neighbor_query) { + m_neighbor_query = std::unique_ptr(new Neighbor_query(m_points, parameters::point_map(m_point_map).k_neighbors(12))); + m_sorting = std::unique_ptr(new Sorting(m_points, *m_neighbor_query, parameters::point_map(m_point_map))); + m_sorting->sort(); + } + + max_distance = 2 * m_sorting->mean_distance(); + normal_dev = m_sorting->mean_deviation(); + min_inliers = m_points.size() * 0.005; // difficult to estimate as it depends on the kind of data, e.g., object scan vs. large scale urban acquisition + } + + std::size_t estimate_max_subdivision_depth() { + std::size_t max_depth = 1; + std::size_t num_shapes = m_polygon_indices.size(); + + if (num_shapes > 60) + while (num_shapes > 20) { + max_depth++; + num_shapes >>= 3; + } + + return max_depth; + } + /*! \brief initializes the kinetic partition. @@ -347,8 +372,6 @@ class Kinetic_surface_reconstruction_3 { */ template void initialize_partition(const CGAL_NP_CLASS& np = parameters::default_values()) { - m_kinetic_partition.insert(m_polygon_pts, m_polygon_indices, np); - m_kinetic_partition.initialize(np); } @@ -408,6 +431,9 @@ class Kinetic_surface_reconstruction_3 { */ template void reconstruct_with_ground(FT lambda, OutputPointIterator pit, OutputPolygonIterator polyit) { + if (m_kinetic_partition.number_of_volumes() == 0) + return; + KSR_3::Graphcut gc(lambda); // add ground consideration here @@ -482,6 +508,9 @@ class Kinetic_surface_reconstruction_3 { */ template void reconstruct(FT lambda, std::map external_nodes, OutputPointIterator pit, OutputPolygonIterator polyit) { + if (m_kinetic_partition.number_of_volumes() == 0) + return; + KSR_3::Graphcut gc(lambda); // add node consideration here @@ -565,6 +594,9 @@ class Kinetic_surface_reconstruction_3 { bool m_verbose; bool m_debug; + std::unique_ptr m_neighbor_query; + std::unique_ptr m_sorting; + Point_range &m_points; Point_map m_point_map; Normal_map m_normal_map; @@ -1785,8 +1817,9 @@ class Kinetic_surface_reconstruction_3 { m_detection_distance_tolerance = max_distance_to_plane; // Region growing. - Neighbor_query neighbor_query = CGAL::Shape_detection::Point_set::make_k_neighbor_query( - m_points, CGAL::parameters::k_neighbors(k)); + if (!m_neighbor_query) { + m_neighbor_query = std::unique_ptr(new Neighbor_query(m_points, parameters::point_map(m_point_map).k_neighbors(k))); + } Region_type region_type = CGAL::Shape_detection::Point_set::make_least_squares_plane_fit_region( m_points, @@ -1795,11 +1828,13 @@ class Kinetic_surface_reconstruction_3 { maximum_angle(max_accepted_angle). minimum_region_size(min_region_size)); - Sorting sorting = CGAL::Shape_detection::Point_set::make_least_squares_plane_fit_sorting(m_points, neighbor_query); - sorting.sort(); + if (!m_sorting) { + m_sorting = std::unique_ptr(new Sorting(m_points, *m_neighbor_query, parameters::point_map(m_point_map))); + m_sorting->sort(); + } Region_growing region_growing( - m_points, sorting.ordered(), neighbor_query, region_type); + m_points, m_sorting->ordered(), *m_neighbor_query, region_type); region_growing.detect(std::back_inserter(m_regions)); std::size_t unassigned = 0; @@ -1818,6 +1853,9 @@ class Kinetic_surface_reconstruction_3 { std::size_t num_shapes = m_regions.size(); + if (m_regions.empty()) + return; + const bool regularize_axis_symmetry = parameters::choose_parameter(parameters::get_parameter(np, internal_np::regularize_axis_symmetry), false); const bool regularize_coplanarity = parameters::choose_parameter(parameters::get_parameter(np, internal_np::regularize_coplanarity), false); const bool regularize_orthogonality = parameters::choose_parameter(parameters::get_parameter(np, internal_np::regularize_orthogonality), false); @@ -1936,6 +1974,8 @@ class Kinetic_surface_reconstruction_3 { } num_shapes = m_planar_regions.size(); + + m_kinetic_partition = KSP(m_polygon_pts, m_polygon_indices); } void map_points_to_faces(const std::size_t polygon_index, const std::vector& pts, std::vector > >& face_to_points) { diff --git a/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt b/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt index 59d2285660b4..d3c10fbcb5bd 100644 --- a/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt @@ -65,6 +65,15 @@ if(TARGET CGAL::Eigen3_support) features_detection_plugin PUBLIC scene_points_with_normal_item CGAL::Eigen3_support) + qt6_wrap_ui(kinetic_surface_reconstruction_pluginUI_FILES Kinetic_surface_reconstruction_plugin.ui) + cgal_lab_plugin( + kinetic_surface_reconstruction_plugin Kinetic_surface_reconstruction_plugin + ${kinetic_surface_reconstruction_pluginUI_FILES} KEYWORDS PointSetProcessing) + target_link_libraries( + kinetic_surface_reconstruction_plugin PUBLIC scene_points_with_normal_item + CGAL::Eigen3_support scene_polygon_soup_item + scene_surface_mesh_item scene_points_with_normal_item) + cgal_lab_plugin(point_set_smoothing_plugin Point_set_smoothing_plugin KEYWORDS PointSetProcessing) target_link_libraries( diff --git a/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp b/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp new file mode 100644 index 000000000000..b851e8f052fd --- /dev/null +++ b/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp @@ -0,0 +1,603 @@ + +#include "ui_Kinetic_surface_reconstruction_plugin.h" + +#include "Color_map.h" +#include "Color_ramp.h" +#include "id_printing.h" +#include "Messages_interface.h" + +#include "Scene.h" +#include "Scene_polygon_soup_item.h" +#include "Scene_surface_mesh_item.h" +#include "Scene_points_with_normal_item.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 + +using namespace CGAL::Three; + +using FT = typename Kernel::FT; +using Point_3 = typename Kernel::Point_3; +using Vector_3 = typename Kernel::Vector_3; +using Segment_3 = typename Kernel::Segment_3; + +using Point_map = typename Point_set::Point_map; +using Normal_map = typename Point_set::Vector_map; + +using KSR = CGAL::Kinetic_surface_reconstruction_3; + +Viewer_interface* (&getActiveViewer)() = Three::activeViewer; + +class DockWidget + : public QDockWidget, + public Ui::KineticSurfaceReconstructionWidget +{ +public: + DockWidget(const QString& name, QWidget* parent) + : QDockWidget(name, parent) + { + setupUi(this); + } +}; + +class Kinetic_surface_reconstruction_plugin + : public QObject, + public CGAL_Lab_plugin_helper +{ + Q_OBJECT + Q_INTERFACES(CGAL::Three::CGAL_Lab_plugin_interface) + Q_PLUGIN_METADATA(IID "com.geometryfactory.CGALLab.PluginInterface/1.0") +private: + QAction* actionKineticSurfaceReconstruction; + + DockWidget* dock_widget; + + Scene_points_with_normal_item* m_pwn_item = nullptr; + + // A dock widget allows switching between items which makes managing parameters and intermediate results a mess. + // I could create a map from item to KSR and also reference intermediate results (in case they are recalculated with changed parameters)? + + KSR *m_ksr = nullptr; + bool m_known_file = false; + +public: + virtual ~Kinetic_surface_reconstruction_plugin() { + if (m_ksr) + delete m_ksr; + m_ksr = nullptr; + } + + bool applicable(QAction*) const override + { + Scene_item* item = scene->item(scene->mainSelectionIndex()); + if (!item) + return false; + + Scene_points_with_normal_item* pwn_item = qobject_cast(item); + + if (pwn_item != nullptr && pwn_item->has_normals()) + return true; + else + return false; + +/* + if (pwn_item == nullptr && m_pwn_item == nullptr) { + enable_detection(false); + enable_regularization(false); + enable_partition(false); + enable_reconstruction(false); + }*/ + + //return pwn_item != nullptr; + } + + QList actions() const override + { + return QList() << actionKineticSurfaceReconstruction; + } + + void init(QMainWindow* mw, + Scene_interface* sc, + Messages_interface*) override + { + this->scene = sc; + this->mw = mw; + + // Main action + actionKineticSurfaceReconstruction = new QAction(QString("Kinetic Surface Reconstruction"), mw); + actionKineticSurfaceReconstruction->setObjectName("actionKineticSurfaceReconstruction"); + + connect(actionKineticSurfaceReconstruction, SIGNAL(triggered()), + this, SLOT(openDialog())); + + Scene* scene_item = static_cast(scene); + connect(scene_item, SIGNAL(itemIndexSelected(int)), + this, SLOT(onItemIndexSelected(int))); + + // Dock Widget + dock_widget = new DockWidget("Kinetic Surface Reconstruction", mw); + addDockWidget(dock_widget); + + dock_widget->setVisible(false); + //dock_widget->setEnabled(false); + + connect(dock_widget->sdRunButton, SIGNAL(clicked(bool)), this, SLOT(run_detection())); + connect(dock_widget->partRunButton, SIGNAL(clicked(bool)), this, SLOT(run_partition())); + connect(dock_widget->recRunButton, SIGNAL(clicked(bool)), this, SLOT(run_reconstruction())); + connect(dock_widget->partSubdivisionCheck, SIGNAL(stateChanged(int)), this, SLOT(onSubdivisionStateChanged(int))); + } +private Q_SLOTS: + void openDialog() + { + if (!dock_widget->isVisible()) + dock_widget->show(); + dock_widget->raise(); + } + + void closure() override + { + dock_widget->hide(); + if (m_ksr) { + delete m_ksr; + m_ksr = nullptr; + } + } + + void onItemIndexSelected(int item_index) { + Scene_points_with_normal_item *selection = qobject_cast(scene->item(item_index)); + if (selection == nullptr) { + // Keep old reference if no new point cloud has been selected. + if (m_pwn_item == nullptr) + dock_widget->setEnabled(false); + + return; + } + + if (m_pwn_item == selection) { + // The point cloud may have normals added after loading. + if (m_pwn_item->has_normals()) { + enable_detection(true); + enable_regularization(true); + } + return; + } + + QObject* scene_obj = dynamic_cast(scene); + + if (m_pwn_item) { + disconnect(m_pwn_item, nullptr, this, SLOT(onItemChanged())); + + if (scene_obj) + disconnect(scene_obj, SIGNAL(itemAboutToBeDestroyed(CGAL::Three::Scene_item*)), this, SLOT(onItemDestroyed(CGAL::Three::Scene_item*))); + } + + m_pwn_item = selection; + connect(m_pwn_item, SIGNAL(itemChanged()), this, SLOT(onItemChanged())); + + if (scene_obj) + connect(scene_obj, SIGNAL(itemAboutToBeDestroyed(CGAL::Three::Scene_item*)), this, SLOT(onItemDestroyed(CGAL::Three::Scene_item*))); + + if (m_ksr) { + delete m_ksr; + m_ksr = nullptr; + } + + dock_widget->setEnabled(true); + + if (m_pwn_item && m_pwn_item->has_normals()) { + enable_detection(true); + enable_regularization(true); + } + else { + enable_detection(false); + enable_regularization(false); + } + + enable_partition(false); + enable_reconstruction(false); + + prefill_parameters(); + } + + void onItemChanged() { + // Enable detection if the point set item has normals now + assert(m_pwn_item); + Point_set* points = m_pwn_item->point_set(); + std::cout << "item changed" << std::endl; + if (m_pwn_item->has_normals()) + enable_detection(true); + } + + void onItemDestroyed(CGAL::Three::Scene_item* item) { + if (m_pwn_item == item) { + m_pwn_item = nullptr; + if (m_ksr) { + delete m_ksr; + m_ksr = nullptr; + } + + enable_detection(false); + enable_regularization(false); + enable_partition(false); + enable_reconstruction(false); + dock_widget->hide(); + } + } + + void run_detection() { + assert(m_pwn_item); + + if (!m_pwn_item->has_normals()) + return; + + m_ksr->detect_planar_shapes(CGAL::parameters::maximum_distance(dock_widget->sdMaxDistanceBox->value()) + .maximum_angle(dock_widget->sdMaxAngleBox->value()) + .k_neighbors(dock_widget->sdkNeighborsBox->value()) + .minimum_region_size(dock_widget->sdMinRegionSizeBox->value()) + .regularize_parallelism(dock_widget->srParallelismCheck->isChecked()) + .regularize_coplanarity(dock_widget->srCoplanarityCheck->isChecked()) + .regularize_orthogonality(dock_widget->srOrthogonalityCheck->isChecked()) + .regularize_axis_symmetry(false) + .angle_tolerance(dock_widget->srAngleToleranceBox->value()) + .maximum_offset(dock_widget->srMaxOffsetBox->value())); + + CGAL::Three::Three::information(QString::number(m_ksr->detected_planar_shapes().size()) + " regularized planar shapes detected"); + + if (m_ksr->detected_planar_shapes().empty()) { + enable_partition(false); + enable_reconstruction(false); + + return; + } + + const std::vector &planes = m_ksr->detected_planar_shapes(); + const std::vector> ®ions = m_ksr->detected_planar_shape_indices(); + + SMesh* mesh = new SMesh(); + std::vector > polys; + for (std::size_t i = 0; i < regions.size(); i++) + convex_hull(regions[i], planes[i], polys); + + for (std::size_t i = 0; i < polys.size(); i++) { + std::vector vtx(polys[i].size()); + for (std::size_t j = 0; j < polys[i].size(); j++) + vtx[j] = mesh->add_vertex(polys[i][j]); + mesh->add_face(vtx); + } + + Scene_surface_mesh_item* new_item = new Scene_surface_mesh_item(mesh); + new_item->setName(tr("%1 convex shapes d%2 a%3").arg(m_pwn_item->name()).arg(dock_widget->sdMaxDistanceBox->value()).arg(dock_widget->sdMaxAngleBox->value())); + new_item->setColor(Qt::darkCyan); + scene->addItem(new_item); + + if (!m_known_file) { + std::size_t max_depth = m_ksr->estimate_max_subdivision_depth(); + dock_widget->partReorientCheck->setChecked(true); + dock_widget->partSubdivisionCheck->setChecked(true); + dock_widget->partMaxDepthBox->setValue(max_depth); + dock_widget->partPolygonsPerNodeBox->setValue(40); + dock_widget->partKBox->setValue(2); + } + + enable_partition(true); + enable_reconstruction(false); + } + + void run_partition() { + assert(m_pwn_item); + assert(m_ksr); + assert(!m_ksr->detected_planar_shapes().empty()); + + m_ksr->initialize_partition(CGAL::parameters::reorient_bbox(dock_widget->partReorientCheck->checkState() == Qt::Checked) + .max_octree_depth(dock_widget->partSubdivisionCheck->checkState() == Qt::Checked ? dock_widget->partMaxDepthBox->value() : 0) + .max_octree_node_size(dock_widget->partPolygonsPerNodeBox->value())); + + m_ksr->partition(dock_widget->partKBox->value()); + + CGAL::Three::Three::information(QString::number(m_ksr->kinetic_partition().number_of_volumes()) + " volumes in partition"); + + if (m_ksr->kinetic_partition().number_of_volumes() != 0) + enable_reconstruction(true); + else std::cout << "kinetic partition is empty!" << std::endl; + } + + void run_reconstruction() { + assert(m_pwn_item); + assert(m_ksr); + assert(m_ksr->kinetic_partition().number_of_volumes() != 0); + + std::vector vtx; + std::vector > polylist; + + std::map external_nodes; + + if (dock_widget->recGroundCheck->checkState() == Qt::Checked) { + external_nodes[KSR::KSP::Face_support::ZMIN] = false; + m_ksr->reconstruct_with_ground(dock_widget->recLambdaBox->value(), std::back_inserter(vtx), std::back_inserter(polylist)); + } + else { + m_ksr->reconstruct(dock_widget->recLambdaBox->value(), external_nodes, std::back_inserter(vtx), std::back_inserter(polylist)); + } + + if (!polylist.empty()) + { + // Add polygon mesh to scene + Scene_polygon_soup_item* new_item = new Scene_polygon_soup_item(); + new_item->load(vtx, polylist); + new_item->setName(tr("%1 ksr lambda %2").arg(m_pwn_item->name()).arg(dock_widget->recLambdaBox->value())); + new_item->setColor(Qt::darkGray); + new_item->invalidateOpenGLBuffers(); + scene->addItem(new_item); + } + } + + void onSubdivisionStateChanged(int state) { + dock_widget->partMaxDepthBox->setEnabled(state != 0); + dock_widget->partPolygonsPerNodeBox->setEnabled(state != 0); + } + +private: + void convex_hull(const std::vector& region, const CGAL::Epick::Plane_3& plane, std::vector > &polys) { + if (m_pwn_item == nullptr) + return; + + Point_set* points = m_pwn_item->point_set(); + + std::vector pts2d; + pts2d.reserve(region.size()); + for (const std::size_t idx : region) { + CGAL_assertion(idx < points->size()); + const auto& p = points->point(idx); + const auto q = plane.projection(p); + const auto point = plane.to_2d(q); + pts2d.push_back(point); + } + CGAL_assertion(pts2d.size() == region.size()); + + std::vector ch; + CGAL::convex_hull_2(pts2d.begin(), pts2d.end(), std::back_inserter(ch)); + + std::vector polygon; + for (const auto& p : ch) { + const auto point = plane.to_3d(p); + polygon.push_back(point); + } + + polys.push_back(polygon); + } + void enable_detection(bool enable) { + dock_widget->shapeDetectionGroup->setEnabled(enable); + dock_widget->sdRunButton->setEnabled(enable); + } + + void enable_regularization(bool enable) { + dock_widget->shapeRegularizationGroup->setEnabled(enable); + } + + void enable_partition(bool enable) { + dock_widget->kineticPartitionGroup->setEnabled(enable); + dock_widget->partRunButton->setEnabled(enable); + } + + void enable_reconstruction(bool enable) { + dock_widget->kineticReconstructionGroup->setEnabled(enable); + dock_widget->recRunButton->setEnabled(enable); + } + + void prefill_parameters() { + if (m_pwn_item == nullptr) + return; + + std::string filename = m_pwn_item->name().toStdString(); + + m_known_file = true; + + if (m_ksr) { + delete m_ksr; + m_ksr = nullptr; + } + + Point_set* points = m_pwn_item->point_set(); + m_ksr = new KSR(*points); + + /*if (filename == "foam_box" || filename == "foam_box_new") { + // Shape detection parameters + dock_widget->sdMaxDistanceBox->setValue(0.05); + dock_widget->sdMaxAngleBox->setValue(15); + dock_widget->sdMinRegionSizeBox->setValue(250); + dock_widget->sdkNeighborsBox->setValue(12); + // Shape regularization parameters + dock_widget->srParallelismCheck->setChecked(true); + dock_widget->srOrthogonalityCheck->setChecked(false); + dock_widget->srCoplanarityCheck->setChecked(true); + dock_widget->srAngleToleranceBox->setValue(10); + dock_widget->srMaxOffsetBox->setValue(0.01); + // Partition parameters + dock_widget->partReorientCheck->setChecked(false); + dock_widget->partSubdivisionCheck->setChecked(true); + dock_widget->partMaxDepthBox->setValue(3); + dock_widget->partPolygonsPerNodeBox->setValue(40); + dock_widget->partKBox->setValue(2); + // Reconstruction parameters + dock_widget->recGroundCheck->setChecked(false); + dock_widget->recLambdaBox->setValue(0.7); + } + else if (filename == "lans") { + // Shape detection parameters + dock_widget->sdMaxDistanceBox->setValue(0.15); + dock_widget->sdMaxAngleBox->setValue(20); + dock_widget->sdMinRegionSizeBox->setValue(300); + dock_widget->sdkNeighborsBox->setValue(12); + // Shape regularization parameters + dock_widget->srParallelismCheck->setChecked(true); + dock_widget->srOrthogonalityCheck->setChecked(false); + dock_widget->srCoplanarityCheck->setChecked(true); + dock_widget->srAngleToleranceBox->setValue(8); + dock_widget->srMaxOffsetBox->setValue(0.08); + // Partition parameters + dock_widget->partReorientCheck->setChecked(false); + dock_widget->partSubdivisionCheck->setChecked(true); + dock_widget->partMaxDepthBox->setValue(3); + dock_widget->partPolygonsPerNodeBox->setValue(40); + dock_widget->partKBox->setValue(2); + // Reconstruction parameters + dock_widget->recGroundCheck->setChecked(false); + dock_widget->recLambdaBox->setValue(0.7); + } + else if (filename == "building_c_1M") { + // Shape detection parameters + dock_widget->sdMaxDistanceBox->setValue(1.1); + dock_widget->sdMaxAngleBox->setValue(26); + dock_widget->sdMinRegionSizeBox->setValue(500); + dock_widget->sdkNeighborsBox->setValue(15); + // Shape regularization parameters + dock_widget->srParallelismCheck->setChecked(true); + dock_widget->srOrthogonalityCheck->setChecked(false); + dock_widget->srCoplanarityCheck->setChecked(true); + dock_widget->srAngleToleranceBox->setValue(3); + dock_widget->srMaxOffsetBox->setValue(0.5); + // Partition parameters + dock_widget->partReorientCheck->setChecked(false); + dock_widget->partSubdivisionCheck->setChecked(true); + dock_widget->partMaxDepthBox->setValue(3); + dock_widget->partPolygonsPerNodeBox->setValue(40); + dock_widget->partKBox->setValue(2); + // Reconstruction parameters + dock_widget->recGroundCheck->setChecked(true); + dock_widget->recLambdaBox->setValue(0.77); + } + else if (filename == "dragon") { + // Shape detection parameters + dock_widget->sdMaxDistanceBox->setValue(0.7); + dock_widget->sdMaxAngleBox->setValue(26); + dock_widget->sdMinRegionSizeBox->setValue(150); + dock_widget->sdkNeighborsBox->setValue(10); + // Shape regularization parameters + dock_widget->srParallelismCheck->setChecked(false); + dock_widget->srOrthogonalityCheck->setChecked(false); + dock_widget->srCoplanarityCheck->setChecked(false); + dock_widget->srAngleToleranceBox->setValue(0); + dock_widget->srMaxOffsetBox->setValue(0); + // Partition parameters + dock_widget->partReorientCheck->setChecked(false); + dock_widget->partSubdivisionCheck->setChecked(true); + dock_widget->partMaxDepthBox->setValue(3); + dock_widget->partPolygonsPerNodeBox->setValue(40); + dock_widget->partKBox->setValue(1); + // Reconstruction parameters + dock_widget->recGroundCheck->setChecked(false); + dock_widget->recLambdaBox->setValue(0.75); + } + else if (filename == "full_thing_pds_1M") { + // Shape detection parameters + dock_widget->sdMaxDistanceBox->setValue(0.3); + dock_widget->sdMaxAngleBox->setValue(36); + dock_widget->sdMinRegionSizeBox->setValue(30); + dock_widget->sdkNeighborsBox->setValue(12); + // Shape regularization parameters + dock_widget->srParallelismCheck->setChecked(true); + dock_widget->srOrthogonalityCheck->setChecked(false); + dock_widget->srCoplanarityCheck->setChecked(true); + dock_widget->srAngleToleranceBox->setValue(3); + dock_widget->srMaxOffsetBox->setValue(0.05); + // Partition parameters + dock_widget->partReorientCheck->setChecked(false); + dock_widget->partSubdivisionCheck->setChecked(true); + dock_widget->partMaxDepthBox->setValue(3); + dock_widget->partPolygonsPerNodeBox->setValue(40); + dock_widget->partKBox->setValue(3); + // Reconstruction parameters + dock_widget->recGroundCheck->setChecked(false); + dock_widget->recLambdaBox->setValue(0.5); + } + else if (filename == "hilbert_cube2_pds_100k") { + // Shape detection parameters + dock_widget->sdMaxDistanceBox->setValue(0.3); + dock_widget->sdMaxAngleBox->setValue(10); + dock_widget->sdMinRegionSizeBox->setValue(10); + dock_widget->sdkNeighborsBox->setValue(12); + // Shape regularization parameters + dock_widget->srParallelismCheck->setChecked(true); + dock_widget->srOrthogonalityCheck->setChecked(true); + dock_widget->srCoplanarityCheck->setChecked(true); + dock_widget->srAngleToleranceBox->setValue(5); + dock_widget->srMaxOffsetBox->setValue(0.03); + // Partition parameters + dock_widget->partReorientCheck->setChecked(false); + dock_widget->partSubdivisionCheck->setChecked(true); + dock_widget->partMaxDepthBox->setValue(3); + dock_widget->partPolygonsPerNodeBox->setValue(40); + dock_widget->partKBox->setValue(4); + // Reconstruction parameters + dock_widget->recGroundCheck->setChecked(false); + dock_widget->recLambdaBox->setValue(0.5); + } + else if (filename == "Meetingroom_3M") { + // Shape detection parameters + dock_widget->sdMaxDistanceBox->setValue(0.03); + dock_widget->sdMaxAngleBox->setValue(19); + dock_widget->sdMinRegionSizeBox->setValue(100); + dock_widget->sdkNeighborsBox->setValue(15); + // Shape regularization parameters + dock_widget->srParallelismCheck->setChecked(true); + dock_widget->srOrthogonalityCheck->setChecked(true); + dock_widget->srCoplanarityCheck->setChecked(true); + dock_widget->srAngleToleranceBox->setValue(10); + dock_widget->srMaxOffsetBox->setValue(0.03); + // Partition parameters + dock_widget->partReorientCheck->setChecked(false); + dock_widget->partSubdivisionCheck->setChecked(true); + dock_widget->partMaxDepthBox->setValue(3); + dock_widget->partPolygonsPerNodeBox->setValue(40); + dock_widget->partKBox->setValue(3); + // Reconstruction parameters + dock_widget->recGroundCheck->setChecked(false); + dock_widget->recLambdaBox->setValue(0.5); + } + else */{ + m_known_file = false; + FT max_distance, max_angle; + std::size_t min_region_size; + m_ksr->estimate_detection_parameters(max_distance, max_angle, min_region_size); + dock_widget->sdMaxDistanceBox->setValue(max_distance); + dock_widget->sdMaxAngleBox->setValue(max_angle); + dock_widget->sdMinRegionSizeBox->setValue(points->number_of_points() * 0.01); + dock_widget->sdkNeighborsBox->setValue(12); + dock_widget->srCoplanarityCheck->setChecked(true); + dock_widget->srMaxOffsetBox->setValue(max_distance * 0.5); + } + } +}; + +#include "Kinetic_surface_reconstruction_plugin.moc" diff --git a/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.ui b/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.ui new file mode 100644 index 000000000000..96d63e2d3258 --- /dev/null +++ b/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.ui @@ -0,0 +1,425 @@ + + + KineticSurfaceReconstructionWidget + + + true + + + + 0 + 0 + 372 + 590 + + + + + 0 + 0 + + + + + 372 + 590 + + + + Kinetic Surface Reconstruction + + + + + + + partition + + + + + + + false + + + Shape Detection + + + + + + Maximum angle + + + + + + + Maximum distance + + + + + + + Smallest allowed size for a primitive + + + 5 + + + 10000 + + + 50 + + + 500 + + + + + + + Minimum region size + + + + + + + Maximum distance from a point to a plane. + + + 1.0 + + + false + + + + + + + Maximum angle in degrees between the normal of a point and the normal of a plane. + + + 25 + + + + + + + k neighbors + + + + + + + K neighborhood of a point considered for region growing + + + 100 + + + 5 + + + 12 + + + + + + + + + + false + + + Shape Regularization + + + + + + Maximum allowed orthogonal distance between two parallel planes such that they are considered to be coplanar. + + + 25 + + + + + + + Angle tolerance + + + + + + + Maximum allowed angle in degrees between plane normals used for parallelism and orthogonality. + + + 1.0 + + + false + + + + + + + Maximum offset + + + + + + + + + Planes, which are detected as near parallel, are made exactly parallel. + + + Parallelism + + + + + + + Parallel planes, which are detected as near coplanar, are made exactly coplanar. + + + Coplanarity + + + + + + + Planes, which are detected as near orthogonal, are made exactly orthogonal. + + + Orthogonality + + + + + + + + + + + + false + + + Kinetic Surface Reconstruction + + + + + + Estimates a ground level from the detected shapes. Sets the outside label of all faces on the bounding box below the ground level to inside. + + + Estimate ground + + + + + + + + + + Lambda + + + + + + + + + + Lambda trades data faithfulness for low complexity in the energy minimization. + + + 0.7 + + + false + + + + + + + + + + false + + + Kinetic Space Partition + + + + + + K + + + + + + + Maximum depth + + + + + + + Maximum number of intersections that can occur for a polygon before its expansion stops + + + 1 + + + 100 + + + 1 + + + 2 + + + + + + + + + Aligns the x-axis of the bounding box with the direction of the largest variation in horizontal direction of the input data while maintaining the z-axis. + + + Bounding box reorientation + + + + + + + The kinetic partition is split into subpartitions using an octree if the number of intersecting polygons per node is larger than specified. + + + Subdivision + + + true + + + + + + + + + Maximum octree depth for subdivision + + + 1 + + + 100 + + + 1 + + + 3 + + + + + + + Polygons per Node + + + + + + + Maximum number of intersecting polygons for an octree node before it is split + + + 1 + + + 100 + + + 1 + + + 40 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + detect and regularize + + + + + + + reconstruct + + + + + + + + + DoubleEdit + QLineEdit +
    CGAL_double_edit.h
    +
    +
    + + +
    diff --git a/Lab/demo/Lab/Plugins/Point_set/Point_set_normal_estimation_plugin.cpp b/Lab/demo/Lab/Plugins/Point_set/Point_set_normal_estimation_plugin.cpp index 505e7e6d769f..5ebd97614e1b 100644 --- a/Lab/demo/Lab/Plugins/Point_set/Point_set_normal_estimation_plugin.cpp +++ b/Lab/demo/Lab/Plugins/Point_set/Point_set_normal_estimation_plugin.cpp @@ -287,6 +287,7 @@ void CGAL_Lab_point_set_normal_estimation_plugin::on_actionNormalEstimation_trig // Updates scene item->invalidateOpenGLBuffers(); scene->itemChanged(index); + item->itemChanged(); QApplication::restoreOverrideCursor(); } diff --git a/Point_set_3/include/CGAL/Point_set_3.h b/Point_set_3/include/CGAL/Point_set_3.h index cda736435349..f3cd2f206e7c 100644 --- a/Point_set_3/include/CGAL/Point_set_3.h +++ b/Point_set_3/include/CGAL/Point_set_3.h @@ -161,7 +161,7 @@ class Point_set_3 #ifdef DOXYGEN_RUNNING typedef unspecified_type iterator; ///< Iterator type of the point set with value type `Index` is model of `RandomAccessIterator` - typedef unspecified_type const_iterator; ///< Constant iterator type of the point set with value type `Index` is model of `RandomA.ccessIterator` + typedef unspecified_type const_iterator; ///< Constant iterator type of the point set with value type `Index` is model of `RandomAccessIterator` #else typedef typename Index_map::iterator iterator; ///< Iterator type of the point set typedef typename Index_map::const_iterator const_iterator; ///< Constant iterator type of the point set diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_sorting.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_sorting.h index 209f2cf6186d..6b46b3bcece6 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_sorting.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_sorting.h @@ -44,12 +44,17 @@ namespace Point_set { \tparam PointMap a model of `ReadablePropertyMap` whose key type is the value type of the input range and value type is `Kernel::Point_3` + + \tparam NormalMap + a model of `ReadablePropertyMap` whose key type is the value type of the input + range and value type is `Kernel::Vector_3` */ template< typename GeomTraits, typename Item_, typename NeighborQuery, - typename PointMap> + typename PointMap, + typename NormalMap> class Least_squares_plane_fit_sorting { public: @@ -60,6 +65,7 @@ namespace Point_set { using Traits = GeomTraits; using Neighbor_query = NeighborQuery; using Point_map = PointMap; + using Normal_map = NormalMap; /// \endcond /// Item type. @@ -108,6 +114,10 @@ namespace Point_set { \cgalParamDescription{an instance of `PointMap` that maps an item to `Kernel::Point_3`} \cgalParamDefault{`PointMap()`} \cgalParamNEnd + \cgalParamNBegin{normal_map} + \cgalParamDescription{an instance of `NormalMap` that maps an item to `Kernel::Vector_3`} + \cgalParamDefault{`NormalMap()`} + \cgalParamNEnd \cgalParamNBegin{geom_traits} \cgalParamDescription{an instance of `GeomTraits`} \cgalParamDefault{`GeomTraits()`} @@ -123,6 +133,7 @@ namespace Point_set { const CGAL_NP_CLASS& np = parameters::default_values()) : m_neighbor_query(neighbor_query), m_point_map(Point_set_processing_3_np_helper::get_const_point_map(input_range, np)), + m_normal_map(Point_set_processing_3_np_helper::get_normal_map(input_range, np)), m_traits(parameters::choose_parameter(parameters::get_parameter(np, internal_np::geom_traits))) { CGAL_precondition(input_range.size() > 0); @@ -174,28 +185,76 @@ namespace Point_set { const Seed_range &ordered() { return m_ordered; } + + /*! + \brief the average of the maximal point to fitted plane distance in each neighborhood. + */ + + const FT mean_distance() { + return mean_d; + } + + /*! + \brief the average of the maximal normal deviation to fitted plane in each neighborhood. + */ + const FT mean_deviation() { + return mean_dev; + } /// @} private: Neighbor_query& m_neighbor_query; const Point_map m_point_map; + const Normal_map m_normal_map; const Traits m_traits; Seed_range m_ordered; std::vector m_scores; + FT mean_d; + FT mean_dev; + void compute_scores() { std::vector neighbors; std::size_t idx = 0; + + mean_d = 0; + mean_dev = 0; + for (const Item& item : m_ordered) { neighbors.clear(); m_neighbor_query(item, neighbors); neighbors.push_back(item); - m_scores[idx++] = internal::create_plane( - neighbors, m_point_map, m_traits).second; + auto p = internal::create_plane( + neighbors, m_point_map, m_traits); + + auto plane = p.first; + + FT max_dist = 0; + FT max_dev = 0; + + for (const Item &n : neighbors) { + FT d = (get(m_point_map, n) - plane.point()) * plane.orthogonal_vector(); + FT dev = acos(CGAL::abs(get(m_normal_map, n) * plane.orthogonal_vector())); + + if (d > max_dist) + max_dist = d; + + if (dev > max_dev) + max_dev = dev; + } + + mean_d += max_dist; + mean_dev += max_dev; + + m_scores[idx++] = p.second; } + + mean_d /= m_scores.size(); + mean_dev /= m_scores.size(); + mean_dev *= 180 / CGAL_PI; } }; @@ -210,7 +269,8 @@ using Least_squares_plane_fit_sorting_for_point_set = Least_squares_plane_fit_sorting::Kernel, typename PointSet3::Index, NeighborQuery, - typename PointSet3::Point_map>; + typename PointSet3::Point_map, + typename PointSet3::Vector_map>; /*! \ingroup PkgShapeDetectionRGOnPointSet3 From b67bb2529dd093e714abc4a400bd0746c1e90473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 2 Sep 2024 09:03:30 +0200 Subject: [PATCH 143/348] use assert in test --- .../test/Convex_decomposition_3/cd_nested_holes_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp b/Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp index 3c69b2a5339e..37a3c68264fe 100644 --- a/Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp +++ b/Convex_decomposition_3/test/Convex_decomposition_3/cd_nested_holes_test.cpp @@ -34,7 +34,7 @@ std::size_t run(std::string path) for (const Polyhedron_3& P : convex_parts) { // std::ofstream("out_"+std::to_string(i++)+".off") << std::setprecision(17) << P; - CGAL_assertion(P.size_of_vertices()!=0); + assert(P.size_of_vertices()!=0); } return convex_parts.size(); From b76177cdf51c7e4e468f18fd3c28f49af4f0626f Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 2 Sep 2024 09:03:45 +0200 Subject: [PATCH 144/348] Add version check for OpenMesh library --- .../cmake/modules/display-third-party-libs-versions.cmake | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Installation/cmake/modules/display-third-party-libs-versions.cmake b/Installation/cmake/modules/display-third-party-libs-versions.cmake index b9550dbaa4fc..de66bcd446cf 100644 --- a/Installation/cmake/modules/display-third-party-libs-versions.cmake +++ b/Installation/cmake/modules/display-third-party-libs-versions.cmake @@ -73,6 +73,12 @@ function(check_library cgal_3rdparty_lib) get_library_version("${LASLIB_INCLUDE_DIR}/lasdefinitions.hpp" "LAS_TOOLS_VERSION" "" "" version_var) elseif(${cgal_3rdparty_lib} STREQUAL "ITT") get_library_version("${ITT_INCLUDE_DIR}/ittnotify.h" "ITT_MAJOR" "ITT_MINOR" "" version_var) + elseif(${cgal_3rdparty_lib} STREQUAL "OpenMesh") + set(CONFIG_FILE_PATH "${OpenMesh_DIR}/OpenMeshConfig-release.cmake") + file(READ ${CONFIG_FILE_PATH} FILE_CONTENT) + if("${FILE_CONTENT}" MATCHES "IMPORTED_LOCATION_RELEASE[ \t]+\".*\\.so\\.([0-9]+\\.[0-9]+)\"") + set(version_var "${CMAKE_MATCH_1}") + endif() endif() if(version_var) message(STATUS "Third-party library ${cgal_3rdparty_lib} ${version_var}") From 37218301bbfd6d9179a9eccf7a34a22a7331f2bf Mon Sep 17 00:00:00 2001 From: albert-github Date: Mon, 2 Sep 2024 12:32:30 +0200 Subject: [PATCH 145/348] Spelling corrections Spelling corrections --- .../include/CGAL/Test/_test_algebraic_structure.h | 2 +- .../Arrangement_on_surface_2/data/circle_segments/intersect | 2 +- Documentation/doc/biblio/geom.bib | 2 +- .../Square_border_parameterizer_3.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h b/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h index 56c421eee1f4..08412f96ea48 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h @@ -426,7 +426,7 @@ void test_algebraic_structure_intern( //commutative assert(a+b+c==c+b+a); assert(a*b*c==c*b*a); - //distributiv + //distributive assert((a-b)*c==a*c-b*c); assert((a+b)*c==a*c+b*c); //binom diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/circle_segments/intersect b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/circle_segments/intersect index b0e0bbe6a460..6a3783c9cfc6 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/circle_segments/intersect +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/circle_segments/intersect @@ -1,6 +1,6 @@ # Input is based on the curves and points indexes from intersect.pt # intersect.xcv. The first two numbers are the numbers of the input curves -# to be intersected. After that there is the number of intesections and +# to be intersected. After that there is the number of intersections and # 2-3 numbers representing each intersection. Meaning, the input is of the form: # intersect \ # [ \ diff --git a/Documentation/doc/biblio/geom.bib b/Documentation/doc/biblio/geom.bib index d6b9488ec1f6..ab364082bf86 100644 --- a/Documentation/doc/biblio/geom.bib +++ b/Documentation/doc/biblio/geom.bib @@ -92400,7 +92400,7 @@ @article{kd-pamm-82 @inproceedings{kn-afrmt-97 , author = "Yoshiyuki Kusakari and Takao Nishizeki" -, title = "An Algorithm for Finding a Region with the Minimum Total {$L_1$}-Distance from Prescibed Terminals" +, title = "An Algorithm for Finding a Region with the Minimum Total {$L_1$}-Distance from Prescribed Terminals" , booktitle = "Proc. 8th Annu. Internat. Sympos. Algorithms Comput." , nickname = "ISAAC '97" , site = "Singapore" diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Square_border_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Square_border_parameterizer_3.h index cb97d65430ab..35c16dae10aa 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Square_border_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Square_border_parameterizer_3.h @@ -234,7 +234,7 @@ class Square_border_parameterizer_3 // If the target is a corner vertex, we have the complete length of a side in 'len' // and we must "normalize" the previous entries if(get(vpmap, vt)) { - // If both extremeties of a segment are corners, offsets are already correct + // If both extremities of a segment are corners, offsets are already correct if(!get(vpmap, vs)) { CGAL_assertion(len != 0.0); double ld = 1.0 / len; From 93dd87c3ccb293235635ff043d0cf9b8fbbdfbfe Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 2 Sep 2024 17:51:06 +0200 Subject: [PATCH 146/348] simple fix to remove the segfault with Qt>=6.7 --- GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index 508444710add..01e8a68433d4 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -354,7 +354,6 @@ camera is manipulated) : main drawing method. Should be overloaded. \arg postDraw() : display of visual hints (world axis, FPS...) */ CGAL_INLINE_FUNCTION void CGAL::QGLViewer::paintGL() { - makeCurrent(); // Clears screen, set model view matrix... preDraw(); // Used defined method. Default calls draw() @@ -364,7 +363,6 @@ void CGAL::QGLViewer::paintGL() { draw(); // Add visual hints: axis, camera, grid... postDraw(); - doneCurrent(); Q_EMIT drawFinished(true); } From e7ab525ead58b88030210df81f82e89ed04889e3 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Tue, 3 Sep 2024 09:05:55 +0200 Subject: [PATCH 147/348] Update file writing to use stored scm branch content --- Testsuite/test/post_process_ctest_results.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index 5f2af05d5b56..3f89dd2188f3 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -108,8 +108,11 @@ def find_last_separator(inner_contents): if not os.path.isdir(name): is_ignored = True os.mkdir(name) + with open("{}/../../../../../.scm-branch".format(os.getcwd()), 'r', encoding="utf-8") as scm_branch_file: + scm_branch_content = scm_branch_file.read() + with open("{dir}/{file}".format(dir=name, file=report_file_name), "w+", encoding="utf-8") as report_file_handle: - report_file_handle.write(open("{}/../../../../../.scm-branch".format(os.getcwd()), 'r', encoding="utf-8").read()) + report_file_handle.write(scm_branch_content) else: is_ignored = False file_path = "{dir}/{file}".format(dir=name, file=report_file_name) From e791122b35571b00bbed673b70552615e2b68ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 3 Sep 2024 09:59:02 +0200 Subject: [PATCH 148/348] handle cases when LASZIP and LASLIB have different include paths --- Installation/cmake/modules/FindLASLIB.cmake | 11 +++++++---- Installation/cmake/modules/UseLASLIB.cmake | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Installation/cmake/modules/FindLASLIB.cmake b/Installation/cmake/modules/FindLASLIB.cmake index 2353480c2452..9c557a6dce5b 100644 --- a/Installation/cmake/modules/FindLASLIB.cmake +++ b/Installation/cmake/modules/FindLASLIB.cmake @@ -9,14 +9,15 @@ # first look in user defined locations find_path(LASLIB_INCLUDE_DIR NAMES lasreader.hpp - PATHS /usr/local/include/LASlib/ + PATHS /usr/local/include/LASlib/ ENV LASLIB_INC_DIR ) - + find_path(LASZIP_INCLUDE_DIR NAMES mydefs.hpp PATHS /usr/local/include/LASzip/ ${LASLIB_INCLUDE_DIR}/../../LASzip/src + ${LASLIB_INCLUDE_DIR} ) find_library(LASLIB_LIBRARIES @@ -28,8 +29,10 @@ find_library(LASLIB_LIBRARIES ENV LASLIB_LIB_DIR ) -if(LASLIB_LIBRARIES AND LASLIB_INCLUDE_DIR) +if(LASLIB_LIBRARIES AND LASLIB_INCLUDE_DIR AND LASZIP_INCLUDE_DIR) + if (NOT ${LASLIB_INCLUDE_DIR} STREQUAL ${LASZIP_INCLUDE_DIR}) + list(APPEND LASLIB_INCLUDE_DIR ${LASZIP_INCLUDE_DIR}) + endif() set(LASLIB_FOUND TRUE) set(LASLIB_USE_FILE "UseLASLIB") endif() - diff --git a/Installation/cmake/modules/UseLASLIB.cmake b/Installation/cmake/modules/UseLASLIB.cmake index 1af7a023ceb0..f1ffb0bd9065 100644 --- a/Installation/cmake/modules/UseLASLIB.cmake +++ b/Installation/cmake/modules/UseLASLIB.cmake @@ -3,4 +3,4 @@ add_definitions(-DCGAL_LINKED_WITH_LASLIB) -message(DEPRECATION "This file UseLASLIB.cmake is deprecated, and the imported target `CGAL::TBB_support` from CGAL_LASLIB_support.cmake should be used instead.") +message(DEPRECATION "This file UseLASLIB.cmake is deprecated, and the imported target `CGAL::LASLIB_support` from CGAL_LASLIB_support.cmake should be used instead.") From cb78abd603526cb0af3f4f0b696e08470dc0bc2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 3 Sep 2024 14:20:20 +0200 Subject: [PATCH 149/348] fixes for latest version of LAStools + be compatible with CONFIG mode provided CMAKE_FIND_PACKAGE_PREFER_CONFIG is set to TRUE --- .../cmake/modules/CGAL_LASLIB_support.cmake | 25 +++++++++++++------ Installation/cmake/modules/FindLASLIB.cmake | 11 ++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/Installation/cmake/modules/CGAL_LASLIB_support.cmake b/Installation/cmake/modules/CGAL_LASLIB_support.cmake index e541326fdd83..e471c93f02b9 100644 --- a/Installation/cmake/modules/CGAL_LASLIB_support.cmake +++ b/Installation/cmake/modules/CGAL_LASLIB_support.cmake @@ -1,8 +1,19 @@ -if(LASLIB_FOUND AND NOT TARGET CGAL::LASLIB_support) - add_library(CGAL::LASLIB_support INTERFACE IMPORTED) - set_target_properties(CGAL::LASLIB_support PROPERTIES - INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_LASLIB" - INTERFACE_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR}" - INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES "${LASLIB_LIBRARIES}") +if(LASLIB_FOUND) + if (NOT TARGET CGAL::LASLIB_support) + if (NOT TARGET LASlib) + # message(STATUS "Found using MODULE mode") + add_library(CGAL::LASLIB_support INTERFACE IMPORTED) + set_target_properties(CGAL::LASLIB_support PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_LASLIB" + INTERFACE_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR}" + INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LASLIB_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "${LASLIB_LIBRARIES}") + else() + # message(STATUS "Found using CONFIG mode") + add_library(CGAL::LASLIB_support INTERFACE IMPORTED) + set_target_properties(CGAL::LASLIB_support PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_LASLIB") + target_link_libraries(CGAL::LASLIB_support INTERFACE LASlib) + endif() + endif() endif() diff --git a/Installation/cmake/modules/FindLASLIB.cmake b/Installation/cmake/modules/FindLASLIB.cmake index 9c557a6dce5b..00377657ee75 100644 --- a/Installation/cmake/modules/FindLASLIB.cmake +++ b/Installation/cmake/modules/FindLASLIB.cmake @@ -28,6 +28,17 @@ find_library(LASLIB_LIBRARIES ${LASLIB_INCLUDE_DIR}/../../lib ENV LASLIB_LIB_DIR ) +if (NOT LASLIB_LIBRARIES) + #library was renamed in recent versions of LAStools + find_library(LASLIB_LIBRARIES + NAMES LASlib + PATHS ENV LD_LIBRARY_PATH + ENV LIBRARY_PATH + /usr/local/lib + ${LASLIB_INCLUDE_DIR}/../../lib + ENV LASLIB_LIB_DIR + ) +endif() if(LASLIB_LIBRARIES AND LASLIB_INCLUDE_DIR AND LASZIP_INCLUDE_DIR) if (NOT ${LASLIB_INCLUDE_DIR} STREQUAL ${LASZIP_INCLUDE_DIR}) From b46e4359b1ca49926d5c682c46e7a9620a33b242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 3 Sep 2024 15:52:51 +0200 Subject: [PATCH 150/348] make it work also for installed version --- Installation/cmake/modules/FindLASLIB.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/Installation/cmake/modules/FindLASLIB.cmake b/Installation/cmake/modules/FindLASLIB.cmake index 00377657ee75..76c090e7edd8 100644 --- a/Installation/cmake/modules/FindLASLIB.cmake +++ b/Installation/cmake/modules/FindLASLIB.cmake @@ -17,6 +17,7 @@ find_path(LASZIP_INCLUDE_DIR NAMES mydefs.hpp PATHS /usr/local/include/LASzip/ ${LASLIB_INCLUDE_DIR}/../../LASzip/src + ${LASLIB_INCLUDE_DIR}/../LASzip ${LASLIB_INCLUDE_DIR} ) From d7601bc1325f855a89378c448418b95cdffdbd24 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Tue, 3 Sep 2024 16:01:37 +0200 Subject: [PATCH 151/348] update CMakeLists.txt condition for Visual Studio 2017 --- Point_set_3/test/Point_set_3/CMakeLists.txt | 6 +++--- .../test/Point_set_processing_3/CMakeLists.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Point_set_3/test/Point_set_3/CMakeLists.txt b/Point_set_3/test/Point_set_3/CMakeLists.txt index bb283d437711..82424d516a6f 100644 --- a/Point_set_3/test/Point_set_3/CMakeLists.txt +++ b/Point_set_3/test/Point_set_3/CMakeLists.txt @@ -32,7 +32,7 @@ create_single_source_cgal_program("test_deprecated_io_ps.cpp") #Use LAS #disable if MSVC 2017 -if(NOT MSVC_VERSION OR (MSVC_VERSION GREATER_EQUAL 1919 AND MSVC_VERSION LESS 1910)) +if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910) find_package(LASLIB) include(CGAL_LASLIB_support) if (TARGET CGAL::LASLIB_support) @@ -41,5 +41,5 @@ if(NOT MSVC_VERSION OR (MSVC_VERSION GREATER_EQUAL 1919 AND MSVC_VERSION LESS 1 message(STATUS "NOTICE : the LAS reader test requires LASlib and will not be compiled.") endif() else() - message(STATUS "NOTICE : the LAS reader does not work with Visual Studio 2017.") -endif() + message(STATUS "NOTICE : the LAS reader does not work with your version of Visual Studio 2017.") +endif() \ No newline at end of file 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 733ce26de22a..4112a9e035aa 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 @@ -49,7 +49,7 @@ if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910 message(STATUS "NOTICE : the LAS reader test requires LASlib and will not be compiled.") endif() else() - message(STATUS "NOTICE : the LAS reader does not work with Visual Studio 2017.") + message(STATUS "NOTICE : the LAS reader does not work with your version of Visual Studio 2017.") endif() # Use Eigen From 1cf6fe884d965eb20c46b3b9adb50729b7292642 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Tue, 3 Sep 2024 16:05:37 +0200 Subject: [PATCH 152/348] missing end of line --- Point_set_3/test/Point_set_3/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Point_set_3/test/Point_set_3/CMakeLists.txt b/Point_set_3/test/Point_set_3/CMakeLists.txt index 82424d516a6f..75a8b79c7bf7 100644 --- a/Point_set_3/test/Point_set_3/CMakeLists.txt +++ b/Point_set_3/test/Point_set_3/CMakeLists.txt @@ -42,4 +42,4 @@ if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910 endif() else() message(STATUS "NOTICE : the LAS reader does not work with your version of Visual Studio 2017.") -endif() \ No newline at end of file +endif() From a0276c9d74c033c970fb968c1db2c50536460246 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 4 Sep 2024 08:15:02 +0200 Subject: [PATCH 153/348] Update CHANGES.md Some changes for Mesh 3 are in the wrong place. --- Installation/CHANGES.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index a8ddd38c1a1c..04de99365db2 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -144,10 +144,6 @@ Release date: June 2024 to the [`GenericMap`](https://doc.cgal.org/6.0/Combinatorial_map/classGenericMap.html) concept, which enables users to insert an edge between two different faces in order to create faces with holes. -- Added new meshing criterion `edge_distance`, an upper bound for the distance from the edge to the 1D feature. -- **Breaking change**: the concept `MeshEdgeCriteria_3` was modified to include the new meshing criterion `edge_distance`. - - ### [Quadtrees, Octrees, and Orthtrees](https://doc.cgal.org/6.0/Manual/packages.html#PkgOrthtree) - **Breaking change**: @@ -225,6 +221,9 @@ Release date: June 2024 as well as the class `Triangle_accessor`. These were no longer used for several releases. - **Breaking change**: Removed the class templates `CGAL::Gray_image_mesh_domain_3`, `CGAL::Implicit_mesh_domain_3`, and `CGAL::Labeled_image_mesh_domain_3`, which were deprecated since CGAL-4.13. +- Added new meshing criterion `edge_distance`, an upper bound for the distance from the edge to the 1D feature. +- **Breaking change**: the concept `MeshEdgeCriteria_3` was modified to include the new meshing criterion `edge_distance`. + ### [3D Surface Mesh Generation](https://doc.cgal.org/6.0/Manual/packages.html#PkgSurfaceMesher3) From e3b65d3c7557f00de8b7940bb48679fe27422844 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Wed, 4 Sep 2024 10:39:53 +0200 Subject: [PATCH 154/348] changing LAS_TOOLS_VERSION check to proper version --- Point_set_processing_3/include/CGAL/IO/read_las_points.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Point_set_processing_3/include/CGAL/IO/read_las_points.h b/Point_set_processing_3/include/CGAL/IO/read_las_points.h index e7d70470ff13..e22ffa59369e 100644 --- a/Point_set_processing_3/include/CGAL/IO/read_las_points.h +++ b/Point_set_processing_3/include/CGAL/IO/read_las_points.h @@ -385,7 +385,7 @@ bool read_LAS_with_properties(std::istream& is, if(!is) return false; -#if LAS_TOOLS_VERSION <= 170805 +#if LAS_TOOLS_VERSION < 240319 LASreaderLAS lasreader; #else LASreaderLAS lasreader(nullptr); From 4cf1f4b214be5a790f6719b2d2682e23de7aa92c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 4 Sep 2024 14:48:07 +0200 Subject: [PATCH 155/348] CONFIG options is only needed if a FindXXX.cmake exists --- BGL/examples/BGL_OpenMesh/CMakeLists.txt | 2 +- BGL/examples/BGL_polyhedron_3/CMakeLists.txt | 2 +- BGL/test/BGL/CMakeLists.txt | 2 +- Combinatorial_map/test/Combinatorial_map/CMakeLists.txt | 2 +- Convex_hull_3/examples/Convex_hull_3/CMakeLists.txt | 2 +- .../benchmark/Linear_cell_complex_2/CMakeLists.txt | 2 +- .../examples/Polygon_mesh_processing/CMakeLists.txt | 2 +- .../test/Polygon_mesh_processing/CMakeLists.txt | 2 +- Property_map/test/Property_map/CMakeLists.txt | 2 +- STL_Extension/test/STL_Extension/CMakeLists.txt | 2 +- .../examples/Surface_mesh_deformation/CMakeLists.txt | 2 +- .../test/Surface_mesh_deformation/CMakeLists.txt | 2 +- .../examples/Surface_mesh_segmentation/CMakeLists.txt | 2 +- .../examples/Surface_mesh_shortest_path/CMakeLists.txt | 2 +- .../examples/Surface_mesh_simplification/CMakeLists.txt | 2 +- .../examples/Surface_mesh_skeletonization/CMakeLists.txt | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/BGL/examples/BGL_OpenMesh/CMakeLists.txt b/BGL/examples/BGL_OpenMesh/CMakeLists.txt index 36a1968b7520..f461d55efb10 100644 --- a/BGL/examples/BGL_OpenMesh/CMakeLists.txt +++ b/BGL/examples/BGL_OpenMesh/CMakeLists.txt @@ -7,7 +7,7 @@ project(BGL_OpenMesh_Examples) # CGAL and its components find_package(CGAL REQUIRED) -find_package(OpenMesh CONFIG) +find_package(OpenMesh) if(OpenMesh_FOUND) include(CGAL_OpenMesh_support) create_single_source_cgal_program("TriMesh.cpp") diff --git a/BGL/examples/BGL_polyhedron_3/CMakeLists.txt b/BGL/examples/BGL_polyhedron_3/CMakeLists.txt index cd6f6827467c..eabe0b1bd405 100644 --- a/BGL/examples/BGL_polyhedron_3/CMakeLists.txt +++ b/BGL/examples/BGL_polyhedron_3/CMakeLists.txt @@ -16,7 +16,7 @@ create_single_source_cgal_program("range.cpp") create_single_source_cgal_program("transform_iterator.cpp") create_single_source_cgal_program("copy_polyhedron.cpp") -find_package(OpenMesh CONFIG QUIET) +find_package(OpenMesh QUIET) if(OpenMesh_FOUND) include(CGAL_OpenMesh_support) target_link_libraries(copy_polyhedron PRIVATE CGAL::OpenMesh_support) diff --git a/BGL/test/BGL/CMakeLists.txt b/BGL/test/BGL/CMakeLists.txt index 1f5bbb9ecd9e..9594accd1fd2 100644 --- a/BGL/test/BGL/CMakeLists.txt +++ b/BGL/test/BGL/CMakeLists.txt @@ -40,7 +40,7 @@ create_single_source_cgal_program("bench_read_from_stream_vs_add_face_and_add_fa create_single_source_cgal_program("graph_traits_inheritance.cpp" ) create_single_source_cgal_program("test_deprecated_io.cpp") -find_package(OpenMesh CONFIG QUIET) +find_package(OpenMesh QUIET) if(OpenMesh_FOUND) include(CGAL_OpenMesh_support) diff --git a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt index 17d31b5fbcf2..8df873f5de3d 100644 --- a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt +++ b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt @@ -27,7 +27,7 @@ cgal_add_compilation_test(Combinatorial_map_copy_test_index) create_single_source_cgal_program(cmap_test_split_attribute.cpp) # Link with OpenMesh if possible -find_package(OpenMesh CONFIG QUIET) +find_package(OpenMesh QUIET) if(OpenMesh_FOUND) message(STATUS "Found OpenMesh") include(CGAL_OpenMesh_support) diff --git a/Convex_hull_3/examples/Convex_hull_3/CMakeLists.txt b/Convex_hull_3/examples/Convex_hull_3/CMakeLists.txt index 7a72a7c4caf3..add02f31d300 100644 --- a/Convex_hull_3/examples/Convex_hull_3/CMakeLists.txt +++ b/Convex_hull_3/examples/Convex_hull_3/CMakeLists.txt @@ -19,7 +19,7 @@ create_single_source_cgal_program("quickhull_any_dim_3.cpp") create_single_source_cgal_program("extreme_points_3_sm.cpp") create_single_source_cgal_program("extreme_indices_3.cpp") -find_package(OpenMesh CONFIG QUIET) +find_package(OpenMesh QUIET) if(OpenMesh_FOUND) include(CGAL_OpenMesh_support) message(STATUS "Found OpenMesh") diff --git a/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt b/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt index 9c2ae7efb0c8..986cd4f2fdb5 100644 --- a/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt +++ b/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt @@ -18,7 +18,7 @@ include_directories(BEFORE "/usr/include/libxml2/") # add_definitions("-g") # OpenMesh -find_package(OpenMesh CONFIG REQUIRED) +find_package(OpenMesh REQUIRED) include(CGAL_OpenMesh_support) # Polyhedron diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index 911ea62ce07e..69c6d25a52f1 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -93,7 +93,7 @@ else() message(STATUS "NOTICE: Examples that use Eigen will not be compiled.") endif() -find_package(OpenMesh CONFIG QUIET) +find_package(OpenMesh QUIET) if(OpenMesh_FOUND) include(CGAL_OpenMesh_support) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt index 3d78756fba85..0ac926c0f30e 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt @@ -112,7 +112,7 @@ else() message(STATUS "NOTICE: Intel TBB was not found. Tests will use sequential code.") endif() -find_package(OpenMesh CONFIG QUIET) +find_package(OpenMesh QUIET) if(OpenMesh_FOUND) include(CGAL_OpenMesh_support) create_single_source_cgal_program("remeshing_test_P_SM_OM.cpp") diff --git a/Property_map/test/Property_map/CMakeLists.txt b/Property_map/test/Property_map/CMakeLists.txt index 78f43581afcc..a51a39b66d00 100644 --- a/Property_map/test/Property_map/CMakeLists.txt +++ b/Property_map/test/Property_map/CMakeLists.txt @@ -10,7 +10,7 @@ create_single_source_cgal_program("dynamic_properties_test.cpp") create_single_source_cgal_program("kernel_converter_properties_test.cpp") create_single_source_cgal_program("test_Property_container.cpp") -find_package(OpenMesh CONFIG QUIET) +find_package(OpenMesh QUIET) if(OpenMesh_FOUND) message(STATUS "Found OpenMesh") include(CGAL_OpenMesh_support) diff --git a/STL_Extension/test/STL_Extension/CMakeLists.txt b/STL_Extension/test/STL_Extension/CMakeLists.txt index 902664e75c8c..781a6285d451 100644 --- a/STL_Extension/test/STL_Extension/CMakeLists.txt +++ b/STL_Extension/test/STL_Extension/CMakeLists.txt @@ -61,7 +61,7 @@ if(TARGET CGAL::TBB_support) target_link_libraries(test_for_each PUBLIC CGAL::TBB_support) endif() -find_package(OpenMesh CONFIG QUIET) +find_package(OpenMesh QUIET) if(OpenMesh_FOUND) message(STATUS "Found OpenMesh") include(CGAL_OpenMesh_support) diff --git a/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt b/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt index 0d93d45eda93..b6013ffce75d 100644 --- a/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt +++ b/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt @@ -31,7 +31,7 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() - find_package(OpenMesh CONFIG QUIET) + find_package(OpenMesh QUIET) if(OpenMesh_FOUND) include(CGAL_OpenMesh_support) message(STATUS "Found OpenMesh") diff --git a/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt b/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt index b34653b68ec3..e8819b7a22b3 100644 --- a/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt +++ b/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt @@ -16,7 +16,7 @@ if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("Symmetry_test.cpp") target_link_libraries(Symmetry_test PUBLIC CGAL::Eigen3_support) - find_package(OpenMesh CONFIG QUIET) + find_package(OpenMesh QUIET) if(OpenMesh_FOUND) include(CGAL_OpenMesh_support) message(STATUS "Found OpenMesh") diff --git a/Surface_mesh_segmentation/examples/Surface_mesh_segmentation/CMakeLists.txt b/Surface_mesh_segmentation/examples/Surface_mesh_segmentation/CMakeLists.txt index f944ad20b2fb..e3f63874b1fd 100644 --- a/Surface_mesh_segmentation/examples/Surface_mesh_segmentation/CMakeLists.txt +++ b/Surface_mesh_segmentation/examples/Surface_mesh_segmentation/CMakeLists.txt @@ -15,7 +15,7 @@ create_single_source_cgal_program("segmentation_from_sdf_values_SM_example.cpp") create_single_source_cgal_program("segmentation_from_sdf_values_LCC_example.cpp") create_single_source_cgal_program("extract_segmentation_into_mesh_example.cpp") -find_package(OpenMesh CONFIG QUIET) +find_package(OpenMesh QUIET) if(OpenMesh_FOUND) include(CGAL_OpenMesh_support) message(STATUS "Found OpenMesh") diff --git a/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/CMakeLists.txt b/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/CMakeLists.txt index e605b7cbaf4d..ba5a6455d263 100644 --- a/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/CMakeLists.txt +++ b/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/CMakeLists.txt @@ -13,7 +13,7 @@ create_single_source_cgal_program("shortest_paths_with_id.cpp") create_single_source_cgal_program("shortest_paths.cpp") create_single_source_cgal_program("shortest_path_with_locate.cpp") -find_package(OpenMesh CONFIG QUIET) +find_package(OpenMesh QUIET) if(OpenMesh_FOUND) include(CGAL_OpenMesh_support) message(STATUS "Found OpenMesh") diff --git a/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt b/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt index fbf0c06996a8..0f63efb7b068 100644 --- a/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt +++ b/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt @@ -28,7 +28,7 @@ else() message(STATUS "NOTICE: Garland-Heckbert polices require the Eigen library, which has not been found; related examples will not be compiled.") endif() -find_package(OpenMesh CONFIG QUIET) +find_package(OpenMesh QUIET) if(OpenMesh_FOUND) include(CGAL_OpenMesh_support) message(STATUS "Found OpenMesh") diff --git a/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt b/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt index 6c50f2d1b8d2..9b86386660b0 100644 --- a/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt +++ b/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt @@ -29,7 +29,7 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() - find_package(OpenMesh CONFIG QUIET) + find_package(OpenMesh QUIET) if(OpenMesh_FOUND) include(CGAL_OpenMesh_support) message(STATUS "Found OpenMesh") From 248f648118ef437623da014571784d9b45b8c7d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 4 Sep 2024 15:11:37 +0200 Subject: [PATCH 156/348] do not doc internal variable --- Documentation/doc/Documentation/Third_party.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/Documentation/doc/Documentation/Third_party.txt b/Documentation/doc/Documentation/Third_party.txt index eaafe426bddc..e012763b266e 100644 --- a/Documentation/doc/Documentation/Third_party.txt +++ b/Documentation/doc/Documentation/Third_party.txt @@ -98,8 +98,6 @@ solutions, and we recommend using one of them. The CMake variable `CGAL_CMAKE_EXACT_NT_BACKEND` can be used to select the library that will be used internally for multi precision number types. -The variable `CGAL_CMAKE_EXACT_NT_BACKEND-STRINGS` contains all the possible -values. \section secoptional3rdpartysoftware Optional Third Party Libraries From 8e6670d8ead500ff0df3c93f9346685882acdf0e Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 4 Sep 2024 18:21:03 +0200 Subject: [PATCH 157/348] remove problems detected by the linter --- Testsuite/test/post_process_ctest_results.py | 275 +++++++++++-------- 1 file changed, 156 insertions(+), 119 deletions(-) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index 3f89dd2188f3..1d7d900a70bf 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -1,121 +1,74 @@ import sys import re import os +import collections -input_report_file_name=sys.argv[1] -report_file_name=sys.argv[2] -global_report_file_name=sys.argv[3] -config_regex=re.compile(r'(.*Configuring (examples|demo|test)*( in )*(test/|examples/|demo/)*)((?!done)\w+)') -demo_regex=re.compile(r'.*in demo/') -examples_regex=re.compile(r'.*in examples/') -Separator = "------------------------------------------------------------------" +CONFIG_REGEX = re.compile( + r"(.*Configuring (examples|demo|test)*( in )*(test/|examples/|demo/)*)((?!done)\w+)" +) +DEMO_REGEX = re.compile(r".*in demo/") +EXAMPLES_REGEX = re.compile(r'.*in examples/') +SEPARATOR = "------------------------------------------------------------------" -#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 skipped. +# 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 skipped. -name="" -is_writing=False -is_ignored=False -position = 0 -lines_to_write = [] -installation_cmake_logs = [] - - - -def find_third_separator(inner_contents): +def find_third_separator(contents): separator_count = 0 - for j, inner_line in enumerate(inner_contents): - if inner_line.strip() == Separator: + for j, line in enumerate(contents): + if line.strip() == SEPARATOR: separator_count += 1 if separator_count == 3: return j - return len(inner_contents) + 2 - -def find_last_separator(inner_contents): - for j, inner_line in enumerate(inner_contents): - if inner_line.strip() == Separator: - inner_position = j - return inner_position - -with open ("{dir}/{file}".format(dir="Installation",file=report_file_name), "r", encoding="utf-8") as file: - contents = file.readlines() -position = find_last_separator(contents) -for i, line in enumerate(contents): - if i > position: - installation_cmake_logs.append(line) - if line.strip() == "== Generating build files for tests ==": - break -contents = [] - -global_report = open(global_report_file_name, "a+", encoding="utf-8") -with open(input_report_file_name, "rt", encoding="utf-8") as input_report_file: - for myline in input_report_file: - match = config_regex.match(myline) - if is_writing: - if match: - is_writing = False - if is_ignored: - print("{label} {result}".format(label=name, result='r'), file=global_report) - is_ignored = False - if lines_to_write: - file_path = f"{name}/{report_file_name}" - if os.path.exists(file_path): - with open(file_path, "r", encoding="utf-8") as file: - contents = file.readlines() - else: - contents = [] - - position = find_third_separator(contents) - - if not any(re.search("- CMake Results .*", content) for content in contents): - lines_to_write.insert(0, f"{Separator}\n- CMake Results for {name}\n{Separator}\n\n") - lines_to_write.insert(0, "\n") - contents[position:position] = lines_to_write - - with open(file_path, "w", encoding="utf-8") as file: - file.write("".join(contents)) - - lines_to_write = [] - if is_ignored: - is_ignored = False - else: - if myline.strip() != "": - lines_to_write.append(myline) - if not is_writing: - if match: - name=match.group(0).replace(match.group(1), "") - if demo_regex.match(myline): - name="{str}_Demo".format(str=name) - elif examples_regex.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_Qt6": - name="libCGALQt6_shared" - if name=="incomplete": - is_writing=False - is_ignored=False - continue - else: - if not os.path.isdir(name): - is_ignored = True - os.mkdir(name) - with open("{}/../../../../../.scm-branch".format(os.getcwd()), 'r', encoding="utf-8") as scm_branch_file: - scm_branch_content = scm_branch_file.read() - - with open("{dir}/{file}".format(dir=name, file=report_file_name), "w+", encoding="utf-8") as report_file_handle: - report_file_handle.write(scm_branch_content) - else: + return len(contents) + 2 + +def last(iterator): + return collections.deque(iterator, maxlen=1).pop() + +def find_last_separator(contents): + position, _ = last(filter(lambda x: x[1].strip() == SEPARATOR, enumerate(contents))) + return position + +def process_report(input_report_file_name, report_file_name, global_report_file_name): + name = "" + is_writing = False + is_ignored = False + position = 0 + lines_to_write = [] + installation_cmake_logs = [] + + file_path = f"Installation/{report_file_name}" + print(f"Debug: Opening file {file_path}") + with open(file_path, "r", encoding="utf-8") as file: + contents = file.readlines() + position = find_last_separator(contents) + print(f"Debug: Position is {position}") + print(f"Debug: Length of contents is {len(contents)}") + for i, line in enumerate(contents): + if i > position: + if line.strip() == "== Generating build files for tests ==": + print(f"Debug: Found the line {line} at position {i}") + break + installation_cmake_logs.append(line) + contents = [] + print(f"Debug: Length of installation CMake logs is {len(installation_cmake_logs)}") + print(f"Debug: Installation CMake logs are {"".join(installation_cmake_logs)}") + global_report = open(global_report_file_name, "a+", encoding="utf-8") + with open(input_report_file_name, "rt", encoding="utf-8") as input_report_file: + for line in input_report_file: + match = CONFIG_REGEX.match(line) + if is_writing: + if match: + is_writing = False + if is_ignored: + print(f"{name} r", file=global_report) is_ignored = False - file_path = "{dir}/{file}".format(dir=name, file=report_file_name) + if lines_to_write: + file_path = f"{name}/{report_file_name}" if os.path.exists(file_path): with open(file_path, "r", encoding="utf-8") as file: contents = file.readlines() @@ -124,20 +77,104 @@ def find_last_separator(inner_contents): position = find_third_separator(contents) - if not any(re.search("- CMake Logs .*", content) for content in contents): - contents.insert(position - 1, Separator + "\n- CMake Logs from Installation \n" + Separator + "\n\n") - for log in installation_cmake_logs: - contents.insert(position, log) - position += 1 + if not any( + re.search("- CMake Results .*", content) + for content in contents + ): + lines_to_write.insert( + 0, + f"{SEPARATOR}\n- CMake Results for {name}\n{SEPARATOR}\n\n", + ) + lines_to_write.insert(0, "\n") + contents[position:position] = lines_to_write with open(file_path, "w", encoding="utf-8") as file: file.write("".join(contents)) - is_writing = True - -if is_writing: - is_writing=False - if is_ignored: - print("{label} {result}".format(label=name, result='r'), file=global_report) - is_ignored=False -global_report.close() + lines_to_write = [] + if is_ignored: + is_ignored = False + else: + if line.strip() != "": + lines_to_write.append(line) + if not is_writing: + if match: + name = match.group(0).replace(match.group(1), "") + print(f"Debug: Found name {name}") + if DEMO_REGEX.match(line): + name = f"{name}_Demo" + elif EXAMPLES_REGEX.match(line): + name = f"{name}_Examples" + elif name == "libCGAL": + name = "libCGAL_shared" + elif name == "libCGAL_Core": + name = "libCGALCore_shared" + elif name == "libCGAL_ImageIO": + name = "libCGALimageIO_shared" + elif name == "libCGAL_Qt6": + name = "libCGALQt6_shared" + if name == "incomplete": + is_writing = False + is_ignored = False + continue + else: + if not os.path.isdir(name): + is_ignored = True + os.mkdir(name) + with open( + f"{os.getcwd()}/../../../../../.scm-branch", + "r", + encoding="utf-8", + ) as scm_branch_file: + scm_branch_content = scm_branch_file.read() + + with open( + f"{name}/{report_file_name}", "w+", encoding="utf-8" + ) as report_file_handle: + report_file_handle.write(scm_branch_content) + else: + is_ignored = False + file_path = f"{name}/{report_file_name}" + if os.path.exists(file_path): + with open(file_path, "r", encoding="utf-8") as file: + contents = file.readlines() + else: + contents = [] + + position = find_third_separator(contents) + + if not any( + re.search("- CMake Logs .*", content) + for content in contents + ): + contents.insert( + position - 1, + SEPARATOR + + "\n- CMake Logs from Installation \n" + + SEPARATOR + + "\n\n", + ) + for log in installation_cmake_logs: + contents.insert(position, log) + position += 1 + + with open(file_path, "w", encoding="utf-8") as file: + file.write("".join(contents)) + + is_writing = True + + if is_writing: + is_writing = False + if is_ignored: + print(f"{name} r", file=global_report) + is_ignored = False + global_report.close() + +def main(): + input_report_file_name = sys.argv[1] + report_file_name = sys.argv[2] + global_report_file_name = sys.argv[3] + process_report(input_report_file_name, report_file_name, global_report_file_name) + +if __name__ == "__main__": + main() From 281c02690a5f4fd52fe064ff1af138d85a12a396 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 6 Sep 2024 14:38:01 +0200 Subject: [PATCH 158/348] new implementation --- Testsuite/test/post_process_ctest_results.py | 292 +++++++++---------- 1 file changed, 139 insertions(+), 153 deletions(-) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index 1d7d900a70bf..7349f1d125f0 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -2,179 +2,165 @@ import re import os import collections +import logging +from itertools import islice CONFIG_REGEX = re.compile( - r"(.*Configuring (examples|demo|test)*( in )*(test/|examples/|demo/)*)((?!done)\w+)" + r"(.*Configuring (examples|demo|test) *in *(test/|examples/|demo/))((?!done)\w+)" ) DEMO_REGEX = re.compile(r".*in demo/") EXAMPLES_REGEX = re.compile(r'.*in examples/') SEPARATOR = "------------------------------------------------------------------" - -# 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 skipped. - def find_third_separator(contents): - separator_count = 0 - for j, line in enumerate(contents): - if line.strip() == SEPARATOR: - separator_count += 1 - if separator_count == 3: - return j - return len(contents) + 2 + """Find the position of the third separator line in the contents. + If there are less than 3 separators, then return the position where the third separator + should be inserted. + """ + separator_positions = ( + i for i, line in enumerate(contents) if line.strip() == SEPARATOR + ) + return next(islice(separator_positions, 2, None), len(contents) + 2) def last(iterator): + """Return the last item of an iterator or None if empty.""" return collections.deque(iterator, maxlen=1).pop() -def find_last_separator(contents): - position, _ = last(filter(lambda x: x[1].strip() == SEPARATOR, enumerate(contents))) +def find_last(contents, query_string): + """Find the number of the last line matching the query string.""" + position, _ = last(filter(lambda x: x[1].strip() == query_string, enumerate(contents))) return position -def process_report(input_report_file_name, report_file_name, global_report_file_name): - name = "" - is_writing = False - is_ignored = False - position = 0 - lines_to_write = [] - installation_cmake_logs = [] - - file_path = f"Installation/{report_file_name}" - print(f"Debug: Opening file {file_path}") - with open(file_path, "r", encoding="utf-8") as file: - contents = file.readlines() - position = find_last_separator(contents) - print(f"Debug: Position is {position}") - print(f"Debug: Length of contents is {len(contents)}") - for i, line in enumerate(contents): - if i > position: - if line.strip() == "== Generating build files for tests ==": - print(f"Debug: Found the line {line} at position {i}") - break - installation_cmake_logs.append(line) - contents = [] - print(f"Debug: Length of installation CMake logs is {len(installation_cmake_logs)}") - print(f"Debug: Installation CMake logs are {"".join(installation_cmake_logs)}") - global_report = open(global_report_file_name, "a+", encoding="utf-8") - with open(input_report_file_name, "rt", encoding="utf-8") as input_report_file: - for line in input_report_file: - match = CONFIG_REGEX.match(line) - if is_writing: - if match: - is_writing = False - if is_ignored: - print(f"{name} r", file=global_report) - is_ignored = False - if lines_to_write: - file_path = f"{name}/{report_file_name}" - if os.path.exists(file_path): - with open(file_path, "r", encoding="utf-8") as file: - contents = file.readlines() - else: - contents = [] - - position = find_third_separator(contents) - - if not any( - re.search("- CMake Results .*", content) - for content in contents - ): - lines_to_write.insert( - 0, - f"{SEPARATOR}\n- CMake Results for {name}\n{SEPARATOR}\n\n", - ) - lines_to_write.insert(0, "\n") - contents[position:position] = lines_to_write - - with open(file_path, "w", encoding="utf-8") as file: - file.write("".join(contents)) - - lines_to_write = [] - if is_ignored: - is_ignored = False - else: - if line.strip() != "": - lines_to_write.append(line) - if not is_writing: - if match: - name = match.group(0).replace(match.group(1), "") - print(f"Debug: Found name {name}") - if DEMO_REGEX.match(line): - name = f"{name}_Demo" - elif EXAMPLES_REGEX.match(line): - name = f"{name}_Examples" - elif name == "libCGAL": - name = "libCGAL_shared" - elif name == "libCGAL_Core": - name = "libCGALCore_shared" - elif name == "libCGAL_ImageIO": - name = "libCGALimageIO_shared" - elif name == "libCGAL_Qt6": - name = "libCGALQt6_shared" - if name == "incomplete": - is_writing = False - is_ignored = False - continue - else: - if not os.path.isdir(name): - is_ignored = True - os.mkdir(name) - with open( - f"{os.getcwd()}/../../../../../.scm-branch", - "r", - encoding="utf-8", - ) as scm_branch_file: - scm_branch_content = scm_branch_file.read() - - with open( - f"{name}/{report_file_name}", "w+", encoding="utf-8" - ) as report_file_handle: - report_file_handle.write(scm_branch_content) - else: - is_ignored = False - file_path = f"{name}/{report_file_name}" - if os.path.exists(file_path): - with open(file_path, "r", encoding="utf-8") as file: - contents = file.readlines() - else: - contents = [] - - position = find_third_separator(contents) - - if not any( - re.search("- CMake Logs .*", content) - for content in contents - ): - contents.insert( - position - 1, - SEPARATOR - + "\n- CMake Logs from Installation \n" - + SEPARATOR - + "\n\n", - ) - for log in installation_cmake_logs: - contents.insert(position, log) - position += 1 - - with open(file_path, "w", encoding="utf-8") as file: - file.write("".join(contents)) - - is_writing = True - - if is_writing: - is_writing = False - if is_ignored: +def read_file_lines(file_path): + """Read the lines of a file and return them as a list.""" + try: + with open(file_path, "r", encoding="utf-8") as file: + return file.readlines() + except IOError as e: + print(f"Error opening file {file_path}: {e}") + return [] + +def write_file_lines(file_path, contents): + """Write the contents to a file. The contents should be a list of strings.""" + try: + with open(file_path, "w", encoding="utf-8") as file: + file.write("".join(contents)) + except IOError as e: + print(f"Error writing to file {file_path}: {e}") + +def mark_package_as_missing_requirements(global_report_file_name, name): + """Mark a package as missing requirements in the global report file.""" + try: + with open(global_report_file_name, "a+", encoding="utf-8") as global_report: print(f"{name} r", file=global_report) - is_ignored = False - global_report.close() + except IOError as e: + print(f"Error opening global report file {global_report_file_name}: {e}") + +def handle_end_of_package(package_name, report_file_name, lines_to_write): + if not lines_to_write: + return + + file_path = f"{package_name}/{report_file_name}" + contents = read_file_lines(file_path) + position = find_third_separator(contents) + + if not any(re.search("- CMake Results .*", content) for content in contents): + lines_to_write.insert(0, f"""{SEPARATOR} + - CMake Results for {package_name} + {SEPARATOR} + + """) + lines_to_write.insert(0, "\n") + contents[position:position] = lines_to_write + + write_file_lines(file_path, contents) + + +SCM_BRANCH_FILE_CONTENT = read_file_lines(f"{os.getcwd()}/../../../../../.scm-branch") + +def handle_new_package__is_ignored(name, report_file_name, cmake_logs): + if not os.path.isdir(name): + os.mkdir(name) + write_file_lines(f"{name}/{report_file_name}", SCM_BRANCH_FILE_CONTENT) + return True + else: + file_path = f"{name}/{report_file_name}" + contents = read_file_lines(file_path) + position = find_third_separator(contents) + + if not any(re.search("- CMake Logs .*", content) for content in contents): + contents.insert( + position - 1, + SEPARATOR + "\n- CMake Logs from Installation \n" + SEPARATOR + "\n\n", + ) + for log in cmake_logs: + contents.insert(position, log) + position += 1 + + write_file_lines(file_path, contents) + return False + +def retrieve_cmake_logs(file_path): + logging.debug("Opening file %s", file_path) + contents = read_file_lines(file_path) + + position_begin = find_last(contents, SEPARATOR) + position_end = 1 + find_last(contents, "== Generating build files for tests ==") + + cmake_logs = contents[position_begin:position_end] + + logging.debug("CMake log beginning is at line %d", position_begin) + logging.debug("CMake log end is at line %d", position_end) + logging.debug("Length of contents is %d", len(contents)) + logging.debug("Length of installation CMake logs is %d", len(cmake_logs)) + logging.debug("Installation CMake logs are %s", "".join(cmake_logs)) + return cmake_logs def main(): input_report_file_name = sys.argv[1] report_file_name = sys.argv[2] global_report_file_name = sys.argv[3] - process_report(input_report_file_name, report_file_name, global_report_file_name) + + cmake_logs = retrieve_cmake_logs(f"Installation/{report_file_name}") + + package_name = "" + lines_to_write = [] + + for line in read_file_lines(input_report_file_name): + + line_matches_new_package = CONFIG_REGEX.match(line) + if line_matches_new_package: + logging.debug("Found new package %s", line_matches_new_package.group(0)) + logging.debug(" group 1 %s", line_matches_new_package.group(1)) + new_package_name = line_matches_new_package.group(0).replace( + line_matches_new_package.group(1), "" + ) + + if package_name and not line_matches_new_package and line.strip() != "": + lines_to_write.append(line) + + if package_name and line_matches_new_package: + handle_end_of_package( + package_name, + report_file_name, + lines_to_write, + ) + lines_to_write = [] + if not package_name: + if line_matches_new_package: + package_name = new_package_name + if DEMO_REGEX.match(line): + package_name = f"{package_name}_Demo" + elif EXAMPLES_REGEX.match(line): + package_name = f"{package_name}_Examples" + + if package_name == "incomplete": + package_name = "" + continue + else: + is_ignored = handle_new_package__is_ignored(package_name, report_file_name, cmake_logs) + if is_ignored: + mark_package_as_missing_requirements(global_report_file_name, package_name) if __name__ == "__main__": main() From 22151a582f354c6c9db143231d838e25d0a24377 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Sun, 8 Sep 2024 12:26:21 +0100 Subject: [PATCH 159/348] STL_extension: Add conversion operator --- STL_Extension/include/CGAL/hash_openmesh.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/STL_Extension/include/CGAL/hash_openmesh.h b/STL_Extension/include/CGAL/hash_openmesh.h index 700f58e87eb2..eb9c71d58f11 100644 --- a/STL_Extension/include/CGAL/hash_openmesh.h +++ b/STL_Extension/include/CGAL/hash_openmesh.h @@ -37,6 +37,10 @@ class OMesh_edge { } } + operator OpenMesh::EdgeHandle () const { + return OpenMesh::EdgeHandle(idx()); + } + bool operator<(const OMesh_edge& other) const { return this->idx() < other.idx(); From 977b7906b9437d3652c6f5eba38f87b166744855 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Mon, 9 Sep 2024 13:16:47 +0300 Subject: [PATCH 160/348] Used locate_impl(p, ...) instead of locate(p, ...) in case p is on the boundary of the parameter space. --- Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 488ed21dea79..bab73408a4fb 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 @@ -591,8 +591,7 @@ class Arr_polycurve_traits_2 : Comparison_result dir = cmp_seg_endpts(xcv[0]); // Locate the subcurve on the polycurve xcv that contains p. - std::size_t i = m_poly_traits.locate(xcv, p); - + auto i = m_poly_traits.locate_impl(xcv, p, All_sides_oblivious_category()); CGAL_precondition(i != Polycurve_traits_2::INVALID_INDEX); // Clear the output curves. From 1528bd05da6c4cfd1c97aaa14d10b9b2627772eb Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Mon, 9 Sep 2024 13:17:44 +0300 Subject: [PATCH 161/348] Used 'auto' instead of 'Point_2' in case it is a reference. --- .../include/CGAL/Surface_sweep_2/Surface_sweep_2_impl.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 fe1060f71eba..182b7cbd8115 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 @@ -762,7 +762,7 @@ void Surface_sweep_2::_intersect(Subcurve* c1, Subcurve* c2, Multiplicity multiplicity = 0; const Intersection_point* xp_point = std::get_if(&(*vi)); if (xp_point != nullptr) { - Point_2 xp = xp_point->first; + auto xp = xp_point->first; multiplicity = xp_point->second; CGAL_SS_PRINT_TEXT("Found an intersection point"); CGAL_SS_PRINT_EOL(); @@ -919,7 +919,7 @@ _create_overlapping_curve(const X_monotone_curve_2& overlap_cv, left_event = c1->left_event(); } else { - Point_2 left_end = + auto left_end = this->m_traits->construct_min_vertex_2_object()(overlap_cv); left_event = this->_push_event(left_end, Event::DEFAULT, ARR_INTERIOR, ARR_INTERIOR).first; @@ -940,7 +940,7 @@ _create_overlapping_curve(const X_monotone_curve_2& overlap_cv, } else { auto max_vertex = this->m_traits->construct_max_vertex_2_object(); - Point_2 right_end = max_vertex(overlap_cv); + auto right_end = max_vertex(overlap_cv); right_event = this->_push_event(right_end, Event::DEFAULT, ARR_INTERIOR, ARR_INTERIOR).first; } From 45143bb138b9a5796178137753252125ee403c2a Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Mon, 9 Sep 2024 13:18:14 +0300 Subject: [PATCH 162/348] Cleaned up. Added missing functors. Fixed some issues with functors that accept points, which could lie on the boundary of the parameter space. --- .../CGAL/Arr_polycurve_basic_traits_2.h | 1288 ++++++++--------- 1 file changed, 622 insertions(+), 666 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h index 30c326b18761..e43f1af2a85a 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h @@ -40,41 +40,41 @@ namespace CGAL { template > class Arr_polycurve_basic_traits_2 { public: - typedef SubcurveTraits_2 Subcurve_traits_2; + using Subcurve_traits_2 = SubcurveTraits_2; /// \name Types and functors inherited from the subcurve geometry traits. //@{ - typedef typename Subcurve_traits_2::Has_left_category Has_left_category; - typedef typename Subcurve_traits_2::Has_do_intersect_category - Has_do_intersect_category; + using Has_left_category = typename Subcurve_traits_2::Has_left_category; + using Has_do_intersect_category = + typename Subcurve_traits_2::Has_do_intersect_category; - typedef typename Subcurve_traits_2::Left_side_category Left_side_category; - typedef typename Subcurve_traits_2::Bottom_side_category Bottom_side_category; - typedef typename Subcurve_traits_2::Top_side_category Top_side_category; - typedef typename Subcurve_traits_2::Right_side_category Right_side_category; + using Left_side_category = typename Subcurve_traits_2::Left_side_category; + using Bottom_side_category = typename Subcurve_traits_2::Bottom_side_category; + using Top_side_category = typename Subcurve_traits_2::Top_side_category; + using Right_side_category = typename Subcurve_traits_2::Right_side_category; - typedef typename Arr_all_sides_oblivious_category::result - All_sides_oblivious_category; + using All_sides_oblivious_category = + typename Arr_all_sides_oblivious_category::result; - typedef typename Arr_two_sides_category::result - Bottom_or_top_sides_category; + using Bottom_or_top_sides_category = + typename Arr_two_sides_category::result; - typedef typename Subcurve_traits_2::Point_2 Point_2; - typedef typename Subcurve_traits_2::X_monotone_curve_2 X_monotone_subcurve_2; - typedef typename Subcurve_traits_2::Multiplicity Multiplicity; + using Point_2 = typename Subcurve_traits_2::Point_2; + using X_monotone_subcurve_2 = typename Subcurve_traits_2::X_monotone_curve_2; + using Multiplicity = typename Subcurve_traits_2::Multiplicity; //@} // Backward compatibility: - typedef X_monotone_subcurve_2 X_monotone_segment_2; + using X_monotone_segment_2 = X_monotone_subcurve_2; private: - typedef Arr_polycurve_basic_traits_2 Self; + using Self = Arr_polycurve_basic_traits_2; // Data members: const Subcurve_traits_2* m_subcurve_traits; // The base segment-traits class. @@ -130,27 +130,28 @@ class Arr_polycurve_basic_traits_2 { * curve which is either strongly x-monotone or vertical. Again, * the polycurve is without degenerated subcurves. */ - typedef internal::X_monotone_polycurve_2 - X_monotone_curve_2; - typedef typename X_monotone_curve_2::Size Size; - typedef typename X_monotone_curve_2::size_type size_type; + using X_monotone_curve_2 = + internal::X_monotone_polycurve_2; + using Size = typename X_monotone_curve_2::Size; + using size_type = typename X_monotone_curve_2::size_type; - - /*! Compare the x-coordinates of two points. */ + //! Compare the x-coordinates of two points. class Compare_x_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Compare_x_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Compare the x-coordinates of two directional points. * \param p1 the first directional point. * \param p2 the second directional point. @@ -171,8 +172,7 @@ class Arr_polycurve_basic_traits_2 { * \param p2 the second curve end. */ Comparison_result operator()(const X_monotone_subcurve_2& xs1, - Arr_curve_end ce1, - const Point_2& p2) + Arr_curve_end ce1, const Point_2& p2) { return operator()(xs1, ce1, p2, All_sides_oblivious_category()); } /*! Compare two ends of x-monotone curves in x. @@ -194,12 +194,10 @@ class Arr_polycurve_basic_traits_2 { private: // Oblivious implementation Comparison_result operator()(const X_monotone_subcurve_2& xs1, - Arr_curve_end ce1, - const Point_2& p2, - Arr_all_sides_oblivious_tag) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - const Point_2& p1 = (ce1 == ARR_MAX_END) ? + Arr_curve_end ce1, const Point_2& p2, + Arr_all_sides_oblivious_tag) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto p1 = (ce1 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs1) : geom_traits->construct_min_vertex_2_object()(xs1); return geom_traits->compare_x_2_object()(p1, p2); @@ -207,13 +205,10 @@ class Arr_polycurve_basic_traits_2 { // Boundary implementation Comparison_result operator()(const X_monotone_subcurve_2& xs1, - Arr_curve_end ce1, - const Point_2& p2, - Arr_not_all_sides_oblivious_tag) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Parameter_space_in_x_2 ps_x = - geom_traits->parameter_space_in_x_2_object(); + Arr_curve_end ce1, const Point_2& p2, + Arr_not_all_sides_oblivious_tag) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto ps_x = geom_traits->parameter_space_in_x_2_object(); const Arr_parameter_space ps_x1 = ps_x(xs1, ce1); if (ps_x1 != ARR_INTERIOR) { @@ -221,17 +216,15 @@ class Arr_polycurve_basic_traits_2 { if (ps_x1 == ARR_RIGHT_BOUNDARY) return LARGER; } - typename Subcurve_traits_2::Parameter_space_in_y_2 ps_y = - geom_traits->parameter_space_in_y_2_object(); + auto ps_y = geom_traits->parameter_space_in_y_2_object(); const Arr_parameter_space ps_y1 = ps_y(xs1, ce1); if (ps_y1 == ARR_INTERIOR) { - const Point_2& p1 = (ce1 == ARR_MAX_END) ? + auto p1 = (ce1 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs1) : geom_traits->construct_min_vertex_2_object()(xs1); return geom_traits->compare_x_2_object()(p1, p2); } - typename Subcurve_traits_2::Compare_x_on_boundary_2 cmp_x_on_bnd = - geom_traits->compare_x_on_boundary_2_object(); + auto cmp_x_on_bnd = geom_traits->compare_x_on_boundary_2_object(); return opposite(cmp_x_on_bnd(p2, xs1, ce1)); } @@ -240,13 +233,12 @@ class Arr_polycurve_basic_traits_2 { Arr_curve_end ce1, const X_monotone_subcurve_2& xs2, Arr_curve_end ce2, - Arr_all_sides_oblivious_tag) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - const Point_2& p1 = (ce1 == ARR_MAX_END) ? + Arr_all_sides_oblivious_tag) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto p1 = (ce1 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs1) : geom_traits->construct_min_vertex_2_object()(xs1); - const Point_2& p2 = (ce2 == ARR_MAX_END) ? + auto p2 = (ce2 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs2) : geom_traits->construct_min_vertex_2_object()(xs2); return geom_traits->compare_x_2_object()(p1, p2); @@ -257,11 +249,9 @@ class Arr_polycurve_basic_traits_2 { Arr_curve_end ce1, const X_monotone_subcurve_2& xs2, Arr_curve_end ce2, - Arr_not_all_sides_oblivious_tag) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Parameter_space_in_x_2 ps_x = - geom_traits->parameter_space_in_x_2_object(); + Arr_not_all_sides_oblivious_tag) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto ps_x = geom_traits->parameter_space_in_x_2_object(); const Arr_parameter_space ps_x1 = ps_x(xs1, ce1); const Arr_parameter_space ps_x2 = ps_x(xs2, ce2); @@ -275,30 +265,27 @@ class Arr_polycurve_basic_traits_2 { // ps_x1 == ps_x2 if (ps_x1 != ARR_INTERIOR) return EQUAL; - typename Subcurve_traits_2::Parameter_space_in_y_2 ps_y = - geom_traits->parameter_space_in_y_2_object(); + auto ps_y = geom_traits->parameter_space_in_y_2_object(); const Arr_parameter_space ps_y1 = ps_y(xs1, ce1); const Arr_parameter_space ps_y2 = ps_y(xs2, ce2); if (ps_y1 == ARR_INTERIOR) { - const Point_2& p1 = (ce1 == ARR_MAX_END) ? + auto p1 = (ce1 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs1) : geom_traits->construct_min_vertex_2_object()(xs1); if (ps_y2 == ARR_INTERIOR) { - const Point_2& p2 = (ce2 == ARR_MAX_END) ? + auto p2 = (ce2 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs2) : geom_traits->construct_min_vertex_2_object()(xs2); return geom_traits->compare_x_2_object()(p1, p2); } - typename Subcurve_traits_2::Compare_x_on_boundary_2 cmp_x_on_bnd = - geom_traits->compare_x_on_boundary_2_object(); + auto cmp_x_on_bnd = geom_traits->compare_x_on_boundary_2_object(); return cmp_x_on_bnd(p1, xs2, ce2); } if (ps_y2 == ARR_INTERIOR) { - const Point_2& p2 = (ce2 == ARR_MAX_END) ? + auto p2 = (ce2 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs2) : geom_traits->construct_min_vertex_2_object()(xs2); - typename Subcurve_traits_2::Compare_x_on_boundary_2 cmp_x_on_bnd = - geom_traits->compare_x_on_boundary_2_object(); + auto cmp_x_on_bnd = geom_traits->compare_x_on_boundary_2_object(); return opposite(cmp_x_on_bnd(p2, xs1, ce1)); } return geom_traits->compare_x_on_boundary_2_object()(xs1, ce1, xs2, ce2); @@ -306,24 +293,25 @@ class Arr_polycurve_basic_traits_2 { }; /*! Obtain a Compare_x_2 functor object. */ - Compare_x_2 compare_x_2_object() const - { return Compare_x_2(*this); } + Compare_x_2 compare_x_2_object() const { return Compare_x_2(*this); } - /*! Compare two curve-ends or points lexigoraphically: by x, then by y. */ + //! Compare two curve-ends or points lexigoraphically: by x, then by y. class Compare_xy_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Compare_xy_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Compare two directional points lexigoraphically: by x, then by y. * \param p1 the first endpoint directional point. * \param p2 the second endpoint directional point. @@ -346,8 +334,7 @@ class Arr_polycurve_basic_traits_2 { * \param p2 the second curve end. */ Comparison_result operator()(const X_monotone_subcurve_2& xs1, - Arr_curve_end ce1, - const Point_2& p2) + Arr_curve_end ce1, const Point_2& p2) { return operator()(xs1, ce1, p2, All_sides_oblivious_category()); } /*! Compare two ends of x-monotone curves lexicographically. @@ -369,12 +356,10 @@ class Arr_polycurve_basic_traits_2 { private: // Oblivious implementation Comparison_result operator()(const X_monotone_subcurve_2& xs1, - Arr_curve_end ce1, - const Point_2& p2, - Arr_all_sides_oblivious_tag) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - const Point_2& p1 = (ce1 == ARR_MAX_END) ? + Arr_curve_end ce1, const Point_2& p2, + Arr_all_sides_oblivious_tag) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto p1 = (ce1 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs1) : geom_traits->construct_min_vertex_2_object()(xs1); return geom_traits->compare_xy_2_object()(p1, p2); @@ -382,15 +367,11 @@ class Arr_polycurve_basic_traits_2 { // Boundary implementation Comparison_result operator()(const X_monotone_subcurve_2& xs1, - Arr_curve_end ce1, - const Point_2& p2, - Arr_not_all_sides_oblivious_tag) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Parameter_space_in_x_2 ps_x = - geom_traits->parameter_space_in_x_2_object(); - typename Subcurve_traits_2::Parameter_space_in_y_2 ps_y = - geom_traits->parameter_space_in_y_2_object(); + Arr_curve_end ce1, const Point_2& p2, + Arr_not_all_sides_oblivious_tag) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto ps_x = geom_traits->parameter_space_in_x_2_object(); + auto ps_y = geom_traits->parameter_space_in_y_2_object(); const Arr_parameter_space ps_x1 = ps_x(xs1, ce1); const Arr_parameter_space ps_y1 = ps_y(xs1, ce1); @@ -400,15 +381,14 @@ class Arr_polycurve_basic_traits_2 { } if (ps_y1 == ARR_INTERIOR) { - const Point_2& p1 = (ce1 == ARR_MAX_END) ? + auto p1 = (ce1 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs1) : geom_traits->construct_min_vertex_2_object()(xs1); return geom_traits->compare_xy_2_object()(p1, p2); } // EFEF: missing implementation for open boundary. - typename Subcurve_traits_2::Compare_x_on_boundary_2 cmp_x_on_bnd = - geom_traits->compare_x_on_boundary_2_object(); + auto cmp_x_on_bnd = geom_traits->compare_x_on_boundary_2_object(); Comparison_result res = opposite(cmp_x_on_bnd(p2, xs1, ce1)); if (res != EQUAL) return res; if (ps_y1 == ARR_TOP_BOUNDARY) return LARGER; @@ -421,13 +401,12 @@ class Arr_polycurve_basic_traits_2 { Arr_curve_end ce1, const X_monotone_subcurve_2& xs2, Arr_curve_end ce2, - Arr_all_sides_oblivious_tag) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - const Point_2& p1 = (ce1 == ARR_MAX_END) ? + Arr_all_sides_oblivious_tag) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto p1 = (ce1 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs1) : geom_traits->construct_min_vertex_2_object()(xs1); - const Point_2& p2 = (ce2 == ARR_MAX_END) ? + auto p2 = (ce2 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs2) : geom_traits->construct_min_vertex_2_object()(xs2); return geom_traits->compare_xy_2_object()(p1, p2); @@ -438,13 +417,10 @@ class Arr_polycurve_basic_traits_2 { Arr_curve_end ce1, const X_monotone_subcurve_2& xs2, Arr_curve_end ce2, - Arr_not_all_sides_oblivious_tag) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Parameter_space_in_x_2 ps_x = - geom_traits->parameter_space_in_x_2_object(); - typename Subcurve_traits_2::Parameter_space_in_y_2 ps_y = - geom_traits->parameter_space_in_y_2_object(); + Arr_not_all_sides_oblivious_tag) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto ps_x = geom_traits->parameter_space_in_x_2_object(); + auto ps_y = geom_traits->parameter_space_in_y_2_object(); const Arr_parameter_space ps_x1 = ps_x(xs1, ce1); const Arr_parameter_space ps_y1 = ps_y(xs1, ce1); const Arr_parameter_space ps_x2 = ps_x(xs2, ce2); @@ -458,13 +434,13 @@ class Arr_polycurve_basic_traits_2 { } if ((ps_x1 == ARR_INTERIOR) && (ps_y1 == ARR_INTERIOR)) { - const Point_2& p1 = (ce1 == ARR_MAX_END) ? + auto p1 = (ce1 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs1) : geom_traits->construct_min_vertex_2_object()(xs1); // ps1 == ARR_INTERIOR if ((ps_x2 == ARR_INTERIOR) && (ps_y2 == ARR_INTERIOR)) { - const Point_2& p2 = (ce2 == ARR_MAX_END) ? + auto p2 = (ce2 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs2) : geom_traits->construct_min_vertex_2_object()(xs2); @@ -480,8 +456,7 @@ class Arr_polycurve_basic_traits_2 { // ps_y2 != ARR_INTERIOR CGAL_assertion(ps_x2 == ARR_INTERIOR); // EFEF: missing implementation for open boundary. - typename Subcurve_traits_2::Compare_x_on_boundary_2 cmp_x_on_bnd = - geom_traits->compare_x_on_boundary_2_object(); + auto cmp_x_on_bnd = geom_traits->compare_x_on_boundary_2_object(); Comparison_result res = cmp_x_on_bnd(p1, xs2, ce2); if (res != EQUAL) return res; if (ps_y2 == ARR_TOP_BOUNDARY) return SMALLER; @@ -491,7 +466,7 @@ class Arr_polycurve_basic_traits_2 { // ps1 != ARR_INTERIOR if ((ps_x2 == ARR_INTERIOR) && (ps_y2 == ARR_INTERIOR)) { - const Point_2& p2 = (ce2 == ARR_MAX_END) ? + auto p2 = (ce2 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs2) : geom_traits->construct_min_vertex_2_object()(xs2); @@ -501,8 +476,7 @@ class Arr_polycurve_basic_traits_2 { // ps_y1 != ARR_INTERIOR // ps2 == ARR_INTERIOR CGAL_assertion(ps_x1 == ARR_INTERIOR); - typename Subcurve_traits_2::Compare_x_on_boundary_2 cmp_x_on_bnd = - geom_traits->compare_x_on_boundary_2_object(); + auto cmp_x_on_bnd = geom_traits->compare_x_on_boundary_2_object(); Comparison_result res = cmp_x_on_bnd(p2, xs1, ce1); if (res != EQUAL) return opposite(res); if (ps_y1 == ARR_TOP_BOUNDARY) return LARGER; @@ -524,10 +498,10 @@ class Arr_polycurve_basic_traits_2 { } CGAL_assertion(ce1 == ce2); - const Point_2& p1 = (ce1 == ARR_MAX_END) ? + auto p1 = (ce1 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs1) : geom_traits->construct_min_vertex_2_object()(xs1); - const Point_2& p2 = (ce2 == ARR_MAX_END) ? + auto p2 = (ce2 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs2) : geom_traits->construct_min_vertex_2_object()(xs2); return geom_traits->compare_y_on_boundary_2_object()(p1, p2); @@ -535,34 +509,40 @@ class Arr_polycurve_basic_traits_2 { }; /*! Obtain a Compare_xy_2 functor object. */ - Compare_xy_2 compare_xy_2_object() const - { return Compare_xy_2(*this); } + Compare_xy_2 compare_xy_2_object() const { return Compare_xy_2(*this); } + /*! A functor that obtain the lexicographically left endpoint of an + * \f$x\f$-monotone curve. + */ class Construct_min_vertex_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /* Constructor. */ Construct_min_vertex_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} - /*! Obtain the left endpoint of the x-monotone polycurve. - * \todo: is it possible to make the return type const reference if the - * return type of the subcurve traits is const reference? + public: + /*! Obtain the left endpoint of the x-monotone polycurve. The return type + * is the same as the return type of the corresponding operator in the + * functor of the subtraits, which is either by value or by reference. * \param cv The polycurve curve. - * \return The left endpoint. + * \return The left lexicographically endpoint. */ - Point_2 operator()(const X_monotone_curve_2& cv) const - { + using Subcurve_ctr = typename Subcurve_traits_2::Construct_min_vertex_2; + decltype(std::declval(). + operator()(std::declval())) + operator()(const X_monotone_curve_2& cv) const { CGAL_assertion(cv.number_of_subcurves() > 0); - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); if (geom_traits->compare_endpoints_xy_2_object()(cv[0]) == SMALLER) return geom_traits->construct_min_vertex_2_object()(cv[0]); @@ -576,37 +556,41 @@ class Arr_polycurve_basic_traits_2 { Construct_min_vertex_2 construct_min_vertex_2_object() const { return Construct_min_vertex_2(*this); } + /*! A functor that obtain the lexicographically right endpoint of an + * \f$x\f$-monotone curve. + */ class Construct_max_vertex_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Construct_max_vertex_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} - /*! Obtain the right endpoint of the x-monotone polycurve. - * \todo: is it possible to make the return type const reference if the - * return type of the subcurve traits is const reference? + public: + /*! Obtain the right endpoint of the x-monotone polycurve. The return type + * is the same as the return type of the corresponding operator in the + * functor of the subtraits, which is either by value or by reference. * \param cv The polycurve. - * \return The right endpoint. + * \return The right lexicographically endpoint. */ - Point_2 operator()(const X_monotone_curve_2& cv) const - { - CGAL_assertion(cv.number_of_subcurves() > 0); - - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - - if (geom_traits->compare_endpoints_xy_2_object()(cv[0]) == SMALLER) - return geom_traits-> - construct_max_vertex_2_object()(cv[cv.number_of_subcurves()-1]); - else - return geom_traits->construct_max_vertex_2_object()(cv[0]); + using Subcurve_ctr = typename Subcurve_traits_2::Construct_max_vertex_2; + decltype(std::declval(). + operator()(std::declval())) + operator()(const X_monotone_curve_2& xcv) const { + CGAL_assertion(xcv.number_of_subcurves() > 0); + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto ctr_max_vertex = geom_traits->construct_max_vertex_2_object(); + if (geom_traits->compare_endpoints_xy_2_object()(xcv[0]) == SMALLER) + return ctr_max_vertex(xcv[xcv.number_of_subcurves()-1]); + else return ctr_max_vertex(xcv[0]); } }; @@ -614,26 +598,28 @@ class Arr_polycurve_basic_traits_2 { Construct_max_vertex_2 construct_max_vertex_2_object() const { return Construct_max_vertex_2(*this); } + /*! A functor that checks whether an \f$x\f$-monotone curve is a vertical. */ class Is_vertical_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Is_vertical_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Check whether the given x-monotone curve is a vertical segment. * \param cv The curve. * \return (true) if the curve is a vertical segment;(false) otherwise. */ - bool operator()(const X_monotone_curve_2& cv) const - { + bool operator()(const X_monotone_curve_2& cv) const { // An x-monotone polycurve can represent a vertical segment only if it // comprises vertical segments. If the first subcurve is vertical, // all subcurves are vertical in an x-monotone polycurve @@ -642,19 +628,20 @@ class Arr_polycurve_basic_traits_2 { }; /*! Obtain an Is_vertical_2 functor object. */ - Is_vertical_2 is_vertical_2_object() const - { return Is_vertical_2(*this); } + Is_vertical_2 is_vertical_2_object() const { return Is_vertical_2(*this); } + /*! A functor that compares the \f$y\f$-coordinates of a point and an + * \f$x\f$-monotone curve at the point \f$x\f$-coordinate + */ class Compare_y_at_x_2 { private: // Oblivious implementation Comparison_result operator()(const X_monotone_subcurve_2& xs1, Arr_curve_end ce1, const X_monotone_subcurve_2& xs2, - Arr_all_sides_oblivious_tag) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - const Point_2& p = (ce1 == ARR_MAX_END) ? + Arr_all_sides_oblivious_tag) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto p = (ce1 == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs1) : geom_traits->construct_min_vertex_2_object()(xs1); return geom_traits->compare_y_at_x_2_object()(p, xs2); @@ -664,17 +651,12 @@ class Arr_polycurve_basic_traits_2 { Comparison_result operator()(const X_monotone_subcurve_2& xs1, Arr_curve_end ce1, const X_monotone_subcurve_2& xs2, - Arr_not_all_sides_oblivious_tag) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Parameter_space_in_x_2 ps_x = - geom_traits->parameter_space_in_x_2_object(); - typename Subcurve_traits_2::Parameter_space_in_y_2 ps_y = - geom_traits->parameter_space_in_y_2_object(); - typename Subcurve_traits_2::Construct_min_vertex_2 min_vertex = - geom_traits->construct_min_vertex_2_object(); - typename Subcurve_traits_2::Construct_max_vertex_2 max_vertex = - geom_traits->construct_max_vertex_2_object(); + Arr_not_all_sides_oblivious_tag) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto ps_x = geom_traits->parameter_space_in_x_2_object(); + auto ps_y = geom_traits->parameter_space_in_y_2_object(); + auto min_vertex = geom_traits->construct_min_vertex_2_object(); + auto max_vertex = geom_traits->construct_max_vertex_2_object(); const Arr_parameter_space ps_x1 = ps_x(xs1, ce1); const Arr_parameter_space ps_y1 = ps_y(xs1, ce1); @@ -684,48 +666,102 @@ class Arr_polycurve_basic_traits_2 { if (ps_x1 == ARR_INTERIOR) { if (ps_y1 == ARR_TOP_BOUNDARY) { - typename Subcurve_traits_2::Equal_2 equal = - geom_traits->equal_2_object(); - const Point_2& p = (ce1 == ARR_MAX_END) ? + auto equal = geom_traits->equal_2_object(); + auto p = (ce1 == ARR_MAX_END) ? max_vertex(xs1) : min_vertex(xs1); if (equal(p, max_vertex(xs2))) return EQUAL; if (equal(p, min_vertex(xs2))) return EQUAL; return LARGER; } if (ps_y1 == ARR_BOTTOM_BOUNDARY) { - typename Subcurve_traits_2::Equal_2 equal = - geom_traits->equal_2_object(); - const Point_2& p = (ce1 == ARR_MAX_END) ? + auto equal = geom_traits->equal_2_object(); + auto p = (ce1 == ARR_MAX_END) ? max_vertex(xs1) : min_vertex(xs1); if (equal(p, max_vertex(xs2))) return EQUAL; if (equal(p, min_vertex(xs2))) return EQUAL; return SMALLER; } // ps_y1 == ARR_INTERIOR - const Point_2& p = (ce1 == ARR_MAX_END) ? - max_vertex(xs1) : min_vertex(xs1); + auto p = (ce1 == ARR_MAX_END) ? max_vertex(xs1) : min_vertex(xs1); return geom_traits->compare_y_at_x_2_object()(p, xs2); } // ps_x1 == ARR_RIGHT_BOUNDARY || ARR_LEFT_BOUNDARY - const Point_2& p1 = (ce1 == ARR_MAX_END) ? - max_vertex(xs1) : min_vertex(xs1); - const Point_2& p2 = (ce1 == ARR_MAX_END) ? - max_vertex(xs2) : min_vertex(xs2); + auto p1 = (ce1 == ARR_MAX_END) ? max_vertex(xs1) : min_vertex(xs1); + auto p2 = (ce1 == ARR_MAX_END) ? max_vertex(xs2) : min_vertex(xs2); return geom_traits->compare_y_on_boundary_2_object()(p1, p2); } + // Compare vertical + Comparison_result compare_vertical(const Point_2& p, + const X_monotone_curve_2& xcv) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); +#ifdef CGAL_ALWAYS_LEFT_TO_RIGHT + const Comparison_result l2r_smaller = SMALLER; + const Comparison_result l2r_larger = LARGER; +#else + auto cmp_endpints_xy = m_poly_traits.compare_endpoints_xy_2_object(); + const bool l2r = cmp_endpints_xy(xcv[0]) == SMALLER; + const Comparison_result l2r_smaller = l2r ? SMALLER : LARGER; + const Comparison_result l2r_larger = l2r ? LARGER : SMALLER; +#endif + Comparison_result rc = geom_traits->compare_y_at_x_2_object()(p, xcv[0]); + if (rc == l2r_smaller) return l2r_smaller; + std::size_t n = xcv.number_of_subcurves(); + rc = geom_traits->compare_y_at_x_2_object()(p, xcv[n-1]); + return (rc == l2r_larger) ? l2r_larger : EQUAL; + } + + // Compare non_vertical + Comparison_result compare_non_vertical(const Point_2& p, + const X_monotone_curve_2& xcv) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + // Get the index of the subcurve in xcv containing p. + auto i = m_poly_traits.locate_impl(xcv, p, All_sides_oblivious_category()); + CGAL_precondition(i != INVALID_INDEX); + + // Compare the subcurve xcv[i] and p. + return geom_traits->compare_y_at_x_2_object()(p, xcv[i]); + } + + // Oblivious implementation + Comparison_result operator()(const Point_2& p, + const X_monotone_curve_2& xcv, + Arr_all_sides_oblivious_tag) const { + if (! m_poly_traits.is_vertical_2_object()(xcv)) + return compare_non_vertical(p, xcv); + return compare_vertical(p, xcv); + } + + // Boundary implementation + Comparison_result operator()(const Point_2& p, + const X_monotone_curve_2& xcv, + Arr_not_all_sides_oblivious_tag) const { + if (! m_poly_traits.is_vertical_2_object()(xcv)) { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + if (geom_traits->is_on_y_identification_2_object()(p)) { + auto cmp_y = geom_traits->compare_y_on_boundary_2_object(); + return cmp_y(p, m_poly_traits.construct_min_vertex_2_object()(xcv)); + } + return compare_non_vertical(p, xcv); + } + return compare_vertical(p, xcv); + } + protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Compare_y_at_x_2(const Polycurve_basic_traits_2& traits) : - m_poly_traits(traits) {} + m_poly_traits(traits) + {} + public: /*! Obtain the location of the given point with respect to the input curve. * \param p The point. * \param xcv The polycurve curve. @@ -736,36 +772,7 @@ class Arr_polycurve_basic_traits_2 { */ Comparison_result operator()(const Point_2& p, const X_monotone_curve_2& xcv) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - if (! m_poly_traits.is_vertical_2_object()(xcv)) { - // Get the index of the subcurve in xcv containing p. - std::size_t i = - m_poly_traits.locate_impl(xcv, p, All_sides_oblivious_category()); - CGAL_precondition(i != INVALID_INDEX); - - // Compare the subcurve xcv[i] and p. - return geom_traits->compare_y_at_x_2_object()(p, xcv[i]); - } - // The curve is vertical - #ifdef CGAL_ALWAYS_LEFT_TO_RIGHT - const Comparison_result SMLLR = SMALLER; - const Comparison_result LRGR = LARGER; - #else - const bool is_left_to_right = m_poly_traits.subcurve_traits_2()-> - compare_endpoints_xy_2_object()(xcv[0]) - == SMALLER; - const Comparison_result SMLLR = is_left_to_right?SMALLER:LARGER; - const Comparison_result LRGR = is_left_to_right?LARGER:SMALLER; - #endif - - Comparison_result rc = geom_traits->compare_y_at_x_2_object()(p, xcv[0]); - if (rc == SMLLR) return SMLLR; - std::size_t n = xcv.number_of_subcurves(); - rc = geom_traits->compare_y_at_x_2_object()(p, xcv[n-1]); - if (rc == LRGR) return LRGR; - return EQUAL; - } + { return operator()(p, xcv, All_sides_oblivious_category()); } /*! Obtain the location of the given curve_end with respect to the input * curve. @@ -791,20 +798,25 @@ class Arr_polycurve_basic_traits_2 { Compare_y_at_x_2 compare_y_at_x_2_object() const { return Compare_y_at_x_2(*this); } + /*! A functor that compares the \f$y\f$-coordinates of two \f$x\f$-monotone + * curves immediately to the left of their intersection point. + */ class Compare_y_at_x_left_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Compare_y_at_x_left_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Compare the y value of two x-monotone curves immediately to the left * of their intersection point. * \param cv1 The first polycurve curve. @@ -817,8 +829,7 @@ class Arr_polycurve_basic_traits_2 { */ Comparison_result operator()(const X_monotone_curve_2& cv1, const X_monotone_curve_2& cv2, - const Point_2& p) const - { + const Point_2& p) const { // Get the indices of the subcurves in cv1 and cv2 containing p and // defined to its left. std::size_t i1 = m_poly_traits.locate_side(cv1, p, false); @@ -828,8 +839,8 @@ class Arr_polycurve_basic_traits_2 { CGAL_precondition(i2 != INVALID_INDEX); // Compare cv1[i1] and cv2[i2] at p's left. - return m_poly_traits.subcurve_traits_2()-> - compare_y_at_x_left_2_object()(cv1[i1], cv2[i2], p); + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + return geom_traits->compare_y_at_x_left_2_object()(cv1[i1], cv2[i2], p); } }; @@ -837,20 +848,25 @@ class Arr_polycurve_basic_traits_2 { Compare_y_at_x_left_2 compare_y_at_x_left_2_object() const { return Compare_y_at_x_left_2(*this); } + /*! A functor that compares the \f$y\f$-coordinates of two \f$x\f$-monotone + * curves immediately to the right of their intersection point. + */ class Compare_y_at_x_right_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Compare_y_at_x_right_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Compare the y value of two x-monotone curves immediately to the right * of their intersection point. * \param cv1 The first curve. @@ -863,19 +879,18 @@ class Arr_polycurve_basic_traits_2 { */ Comparison_result operator()(const X_monotone_curve_2& cv1, const X_monotone_curve_2& cv2, - const Point_2& p) const - { + const Point_2& p) const { // Get the indices of the subcurves in cv1 and cv2 containing p and // defined to its right. - std::size_t i1=m_poly_traits.locate_side(cv1, p, true); - std::size_t i2=m_poly_traits.locate_side(cv2, p, true); + std::size_t i1 = m_poly_traits.locate_side(cv1, p, true); + std::size_t i2 = m_poly_traits.locate_side(cv2, p, true); CGAL_precondition(i1 != INVALID_INDEX); CGAL_precondition(i2 != INVALID_INDEX); // Compare cv1[i1] and cv2[i2] at p's right. - return m_poly_traits.subcurve_traits_2()-> - compare_y_at_x_right_2_object()(cv1[i1], cv2[i2], p); + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + return geom_traits->compare_y_at_x_right_2_object()(cv1[i1], cv2[i2], p); } }; @@ -884,18 +899,23 @@ class Arr_polycurve_basic_traits_2 { Compare_y_at_x_right_2 compare_y_at_x_right_2_object() const { return Compare_y_at_x_right_2(*this); } + /*! A functor that checks whether two points and two \f$x\f$-monotone + * curves are identical. + */ class Equal_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Equal_2(const Polycurve_basic_traits_2& poly_tr) : m_poly_traits(poly_tr) {} + public: /*! Check whether the two points are the same. * \param p1 The first point. * \param p2 The second point. @@ -911,31 +931,23 @@ class Arr_polycurve_basic_traits_2 { * \return(true) if the two curves are the same;(false) otherwise. */ bool operator()(const X_monotone_curve_2& cv1, - const X_monotone_curve_2& cv2) const - { + const X_monotone_curve_2& cv2) const { // Check the pairwise equality of the contained subcurves. - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Equal_2 equal = - geom_traits->equal_2_object(); - typename Subcurve_traits_2::Compare_x_2 compare_x = - geom_traits->compare_x_2_object(); - typename Subcurve_traits_2::Compare_y_at_x_2 compare_y_at_x = - geom_traits->compare_y_at_x_2_object(); - typename Subcurve_traits_2::Construct_max_vertex_2 max_vertex = - geom_traits->construct_max_vertex_2_object(); - typename Subcurve_traits_2::Compare_endpoints_xy_2 comp_endpt = - geom_traits->compare_endpoints_xy_2_object(); - Is_vertical_2 is_vertical = m_poly_traits.is_vertical_2_object(); - Construct_min_vertex_2 xpoly_min_v = - m_poly_traits.construct_min_vertex_2_object(); - Construct_max_vertex_2 xpoly_max_v = - m_poly_traits.construct_max_vertex_2_object(); + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto equal = geom_traits->equal_2_object(); + auto cmp_x = geom_traits->compare_x_2_object(); + auto cmp_y_at_x = geom_traits->compare_y_at_x_2_object(); + auto max_vertex = geom_traits->construct_max_vertex_2_object(); + auto cmp_endpt = geom_traits->compare_endpoints_xy_2_object(); + auto is_vertical = m_poly_traits.is_vertical_2_object(); + auto xpoly_min_v = m_poly_traits.construct_min_vertex_2_object(); + auto xpoly_max_v = m_poly_traits.construct_max_vertex_2_object(); // The first and last points of the subcurves should be equal. bool res = equal(xpoly_min_v(cv1), xpoly_min_v(cv2)); - if (!res) return false; + if (! res) return false; res = equal(xpoly_max_v(cv1), xpoly_max_v(cv2)); - if (!res) return false; + if (! res) return false; // If the first and last points are equal and the curves are vertical, // it means that it is equal. @@ -952,29 +964,16 @@ class Arr_polycurve_basic_traits_2 { std::size_t j = 0; std::size_t n1 = cv1.number_of_subcurves(); std::size_t n2 = cv2.number_of_subcurves(); - Comparison_result is_cv1_left_to_right = comp_endpt(cv1[0]); - Comparison_result is_cv2_left_to_right = comp_endpt(cv2[0]); + Comparison_result is_cv1_left_to_right = cmp_endpt(cv1[0]); + Comparison_result is_cv2_left_to_right = cmp_endpt(cv2[0]); while ((i < (n1-1)) || (j < (n2-1))) { - Point_2 point1, point2; - std::size_t cv1_seg_ind, cv2_seg_ind; - if (SMALLER == is_cv1_left_to_right) { - cv1_seg_ind = i; - point1 = max_vertex(cv1[cv1_seg_ind]); - } - else { - cv1_seg_ind = n1 - 1 - i; - point1 = max_vertex(cv1[cv1_seg_ind]); - } - if (SMALLER == is_cv2_left_to_right) { - cv2_seg_ind = j; - point2 = max_vertex(cv2[cv2_seg_ind]); - } - else { - cv2_seg_ind = n2 - 1 - j; - point2 = max_vertex(cv2[cv2_seg_ind]); - } - + std::size_t cv1_seg_ind = (SMALLER == is_cv1_left_to_right) ? + i : cv1_seg_ind = n1 - 1 - i; + auto point1 = max_vertex(cv1[cv1_seg_ind]); + std::size_t cv2_seg_ind = (SMALLER == is_cv2_left_to_right) ? + j : cv2_seg_ind = n2 - 1 - j; + auto point2 = max_vertex(cv2[cv2_seg_ind]); bool res = equal(point1, point2); // Easy case - the two points are equal if (res) { @@ -982,18 +981,16 @@ class Arr_polycurve_basic_traits_2 { ++j; } else { - Comparison_result res_x = compare_x(point1,point2); + Comparison_result res_x = cmp_x(point1,point2); // Check if the different point is a collinear point situated on // the line between its two neighbors. if (SMALLER == res_x) { - Comparison_result res_y_at_x = - compare_y_at_x(point1, cv2[cv2_seg_ind]); + Comparison_result res_y_at_x = cmp_y_at_x(point1, cv2[cv2_seg_ind]); if (EQUAL == res_y_at_x) ++i; else return false; } else if (LARGER == res_x) { - Comparison_result res_y_at_x = - compare_y_at_x(point2,cv1[cv1_seg_ind]); + Comparison_result res_y_at_x = cmp_y_at_x(point2,cv1[cv1_seg_ind]); if (EQUAL == res_y_at_x) ++j; else return false; } @@ -1007,31 +1004,33 @@ class Arr_polycurve_basic_traits_2 { /*! Obtain an Equal_2 functor object. */ Equal_2 equal_2_object() const { return Equal_2(*this); } + /*! A functor that lexicographically compares the endpoints of a curve. */ class Compare_endpoints_xy_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; /*! The traits (in case it has state). */ const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Compare_endpoints_xy_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Compare the endpoints of an \(x\)-monotone curve lexicographically. * (assuming the curve has a designated source and target points). * \param cv The curve. * \return SMALLER if the curve is oriented left-to-right; * LARGER if the curve is oriented right-to-left. */ - Comparison_result operator()(const X_monotone_curve_2& xcv) const - { - return (m_poly_traits.subcurve_traits_2()-> - compare_endpoints_xy_2_object()(xcv[0]) == SMALLER) ? - (SMALLER) : (LARGER); + Comparison_result operator()(const X_monotone_curve_2& xcv) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_endpt = geom_traits->compare_endpoints_xy_2_object(); + return (cmp_endpt(xcv[0]) == SMALLER) ? (SMALLER) : (LARGER); } }; //@} @@ -1043,20 +1042,25 @@ class Arr_polycurve_basic_traits_2 { Compare_endpoints_xy_2 compare_endpoints_xy_2_object() const { return Compare_endpoints_xy_2(*this); } + /*! A functor that construct an \f$x\f$-monotone curve with the same endpoints + * of a given curve, but directed in the opposite direction. + */ class Construct_opposite_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The traits (in case it has state). */ + //! The traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor */ Construct_opposite_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Construct the reversed \(x\)-monotone polycurve of the input. * Note that the functor constructs the opposites of _all_ subcurves * constituting xcv. @@ -1065,15 +1069,12 @@ class Arr_polycurve_basic_traits_2 { * \return An \(x\)-monotone polycurve with the same graph as the input xcv * only with a reverse orientation. */ - X_monotone_curve_2 operator()(const X_monotone_curve_2& xcv) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Construct_opposite_2 const_op = - geom_traits->construct_opposite_2_object(); + X_monotone_curve_2 operator()(const X_monotone_curve_2& xcv) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto const_op = geom_traits->construct_opposite_2_object(); std::vector rev_segs(xcv.number_of_subcurves());; - typename X_monotone_curve_2::Subcurve_const_iterator sit; - typename X_monotone_curve_2::Subcurve_iterator tit = rev_segs.begin(); - for (sit = xcv.subcurves_begin(); sit != xcv.subcurves_end(); ++sit) + auto tit = rev_segs.begin(); + for (auto sit = xcv.subcurves_begin(); sit != xcv.subcurves_end(); ++sit) *tit++ = const_op(*sit); return X_monotone_curve_2(rev_segs.rbegin(), rev_segs.rend()); } @@ -1135,44 +1136,73 @@ class Arr_polycurve_basic_traits_2 { return approximate_2_object_impl(Is_void()); } - // - class Construct_x_monotone_curve_2 { + //! A functor that constructs a point. + class Construct_point_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; + /*! Constructor. */ + Construct_point_2(const Polycurve_basic_traits_2& traits) : + m_poly_traits(traits) + {} + + friend class Arr_polycurve_basic_traits_2; + public: + /*! Construct a point. + * Apply perfect forwarding. + */ + template + Point_2 operator()(Args ... args) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto ctr_point = geom_traits->construct_point_2_object(); + return ctr_point(std::forward(args)...); + } + }; + + /*! Obtain a Construct_x_monotone_curve_2 functor object. */ + Construct_point_2 construct_point_2_object() const + { return Construct_point_2(*this); } + + //! A functor that constructs an \f$x\f$-monotone curve. + class Construct_x_monotone_curve_2 { + protected: + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; + + //! The polycurve traits (in case it has state). + const Polycurve_basic_traits_2& m_poly_traits; + + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Construct_x_monotone_curve_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Obtain an x-monotone polycurve that consists of one given subcurve. * \param seg input subcurve. * \pre seg is not degenerated. * \return An x-monotone polycurve with one subcurve. */ - X_monotone_curve_2 operator()(const X_monotone_subcurve_2& seg) const - { + X_monotone_curve_2 operator()(const X_monotone_subcurve_2& seg) const { CGAL_precondition_code ( /* Test that the subcurve is not degenerated. We do this test * independently from the subcurve traits in use, as we do not * allow a polycurve with degenerated subcurves. */ - const Subcurve_traits_2* geom_traits = - m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Construct_min_vertex_2 get_min_v = - geom_traits->construct_min_vertex_2_object(); - typename Subcurve_traits_2::Construct_max_vertex_2 get_max_v = - geom_traits->construct_max_vertex_2_object(); - typename Subcurve_traits_2::Equal_2 equal = - geom_traits->equal_2_object(); - - CGAL_precondition_msg(!equal(get_min_v(seg),get_max_v(seg)), + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto get_min_v = geom_traits->construct_min_vertex_2_object(); + auto get_max_v = geom_traits->construct_max_vertex_2_object(); + auto equal = geom_traits->equal_2_object(); + + CGAL_precondition_msg(! equal(get_min_v(seg),get_max_v(seg)), "Cannot construct a degenerated subcurve"); ); @@ -1192,10 +1222,9 @@ class Arr_polycurve_basic_traits_2 { */ template X_monotone_curve_2 operator()(ForwardIterator begin, - ForwardIterator end) const - { - typedef typename std::iterator_traits::value_type VT; - typedef typename std::is_same::type Is_point; + ForwardIterator end) const { + using VT = typename std::iterator_traits::value_type; + using Is_point = typename std::is_same::type; // Dispatch the range to the appropriate implementation. return constructor_impl(begin, end, Is_point()); @@ -1234,8 +1263,7 @@ class Arr_polycurve_basic_traits_2 { template X_monotone_curve_2 constructor_impl(ForwardIterator begin, ForwardIterator end, - std::false_type) const - { + std::false_type) const { CGAL_precondition_msg ( begin != end, @@ -1244,16 +1272,11 @@ class Arr_polycurve_basic_traits_2 { CGAL_precondition_code ( - const Subcurve_traits_2* geom_traits = - m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Compare_endpoints_xy_2 cmp_seg_endpts = - geom_traits->compare_endpoints_xy_2_object(); - typename Subcurve_traits_2::Construct_min_vertex_2 get_min_v = - geom_traits->construct_min_vertex_2_object(); - typename Subcurve_traits_2::Construct_max_vertex_2 get_max_v = - geom_traits->construct_max_vertex_2_object(); - typename Subcurve_traits_2::Equal_2 equal = - geom_traits->equal_2_object(); + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_seg_endpts = geom_traits->compare_endpoints_xy_2_object(); + auto get_min_v = geom_traits->construct_min_vertex_2_object(); + auto get_max_v = geom_traits->construct_max_vertex_2_object(); + auto equal = geom_traits->equal_2_object(); ForwardIterator curr = begin; ForwardIterator next = begin; @@ -1263,7 +1286,7 @@ class Arr_polycurve_basic_traits_2 { CGAL_precondition_msg ( - (next != end) || !equal(get_max_v(*curr),get_min_v(*curr)), + (next != end) || ! equal(get_max_v(*curr),get_min_v(*curr)), "Cannot construct a polycurve with degenerated subcurve" ); @@ -1329,18 +1352,20 @@ class Arr_polycurve_basic_traits_2 { */ class Parameter_space_in_x_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Parameter_space_in_x_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Obtains the parameter space at the end of a curve along the x-axis . * Note that if the curve-end coincides with a pole, then unless the curve * coincides with the identification curve, the curve-end is considered to @@ -1361,11 +1386,10 @@ class Arr_polycurve_basic_traits_2 { * \pre xcv does not coincide with the vertical identification curve. */ Arr_parameter_space operator()(const X_monotone_curve_2& xcv, - Arr_curve_end ce) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - Comparison_result direction = - geom_traits->compare_endpoints_xy_2_object()(xcv[0]); + Arr_curve_end ce) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_endpt = geom_traits->compare_endpoints_xy_2_object(); + Comparison_result direction = cmp_endpt(xcv[0]); const X_monotone_subcurve_2& xs = (((direction == SMALLER) && (ce == ARR_MAX_END)) || ((direction == LARGER) && (ce == ARR_MIN_END))) ? @@ -1378,9 +1402,8 @@ class Arr_polycurve_basic_traits_2 { * \return the parameter space at p. * \pre p does not lie on the vertical identification curve. */ - Arr_parameter_space operator()(const Point_2 p) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); + Arr_parameter_space operator()(const Point_2 p) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); return geom_traits->parameter_space_in_x_2_object()(p); } }; @@ -1394,18 +1417,20 @@ class Arr_polycurve_basic_traits_2 { */ class Parameter_space_in_y_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Parameter_space_in_y_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Obtains the parameter space at the end of an curve along the y-axis . * Note that if the curve-end coincides with a pole, then unless the curve * coincides with the identification curve, the curve-end is considered to @@ -1426,11 +1451,10 @@ class Arr_polycurve_basic_traits_2 { * There are no horizontal identification curves! */ Arr_parameter_space operator()(const X_monotone_curve_2& xcv, - Arr_curve_end ce) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - Comparison_result direction = - geom_traits->compare_endpoints_xy_2_object()(xcv[0]); + Arr_curve_end ce) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_endpt = geom_traits->compare_endpoints_xy_2_object(); + Comparison_result direction = cmp_endpt(xcv[0]); const X_monotone_subcurve_2& xs = (((direction == SMALLER) && (ce == ARR_MAX_END)) || ((direction == LARGER) && (ce == ARR_MIN_END))) ? @@ -1444,9 +1468,8 @@ class Arr_polycurve_basic_traits_2 { * \pre p does not lie on the horizontal identification curve. * There are no horizontal identification curves! */ - Arr_parameter_space operator()(const Point_2 p) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); + Arr_parameter_space operator()(const Point_2 p) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); return geom_traits->parameter_space_in_y_2_object()(p); } }; @@ -1460,18 +1483,20 @@ class Arr_polycurve_basic_traits_2 { */ class Compare_x_on_boundary_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Compare_x_on_boundary_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Compare the x-coordinates of a point with the x-coordinate of an * x-curve-end on the boundary. * \param point the point. @@ -1526,11 +1551,10 @@ class Arr_polycurve_basic_traits_2 { Comparison_result operator()(const Point_2& point, const X_monotone_curve_2& xcv, Arr_curve_end ce, - Arr_boundary_cond_tag) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - Comparison_result direction = - geom_traits->compare_endpoints_xy_2_object()(xcv[0]); + Arr_boundary_cond_tag) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_endpt = geom_traits->compare_endpoints_xy_2_object(); + Comparison_result direction = cmp_endpt(xcv[0]); const X_monotone_subcurve_2& xs = (((direction == SMALLER) && (ce == ARR_MAX_END)) || ((direction == LARGER) && (ce == ARR_MIN_END))) ? @@ -1545,17 +1569,15 @@ class Arr_polycurve_basic_traits_2 { Arr_curve_end ce1, const X_monotone_curve_2& xcv2, Arr_curve_end ce2, - Arr_boundary_cond_tag) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - Comparison_result direction1 = - geom_traits->compare_endpoints_xy_2_object()(xcv1[0]); + Arr_boundary_cond_tag) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_endpt = geom_traits->compare_endpoints_xy_2_object(); + Comparison_result direction1 = cmp_endpt(xcv1[0]); const X_monotone_subcurve_2& xs1 = (((direction1 == SMALLER) && (ce1 == ARR_MAX_END)) || ((direction1 == LARGER) && (ce1 == ARR_MIN_END))) ? xcv1[0] : xcv1[xcv1.number_of_subcurves()-1]; - Comparison_result direction2 = - geom_traits->compare_endpoints_xy_2_object()(xcv2[0]); + Comparison_result direction2 = cmp_endpt(xcv2[0]); const X_monotone_subcurve_2& xs2 = (((direction2 == SMALLER) && (ce2 == ARR_MAX_END)) || ((direction2 == LARGER) && (ce2 == ARR_MIN_END))) ? @@ -1564,8 +1586,7 @@ class Arr_polycurve_basic_traits_2 { } size_type get_curve_index(const X_monotone_curve_2& xcv, - const Arr_curve_end ce) const - { + const Arr_curve_end ce) const { //waqar:: dont know why it is opposite in Parameter_space_in_x... // I think this is because of the way the subcurves are stored in the // curve_vector. @@ -1587,14 +1608,12 @@ class Arr_polycurve_basic_traits_2 { Comparison_result operator()(const Point_2& p, const X_monotone_curve_2& xcv, Arr_curve_end ce, - Arr_has_open_side_tag) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Compare_x_on_boundary_2 - compare_x_on_boundary = geom_traits->compare_x_on_boundary_2_object(); + Arr_has_open_side_tag) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_x_on_boundary = geom_traits->compare_x_on_boundary_2_object(); size_type index = this->get_curve_index(xcv, ce); - return compare_x_on_boundary(p, xcv[index], ce ); + return cmp_x_on_boundary(p, xcv[index], ce ); } /*! Given two x-monotone curves C1(t) = (X1(t),Y1(t)) and @@ -1610,28 +1629,22 @@ class Arr_polycurve_basic_traits_2 { Arr_curve_end ce1/* for xcv1 */, const X_monotone_curve_2 & xcv2, Arr_curve_end ce2/*! for xcv2 */, - Arr_has_open_side_tag) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Compare_x_at_on_boundary - compare_x_on_boundary = geom_traits->compare_x_on_boundary_2_object(); - + Arr_has_open_side_tag) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_x_on_boundary = geom_traits->compare_x_on_boundary_2_object(); size_type index_1 = this->get_curve_index(xcv1, ce1); size_type index_2 = this->get_curve_index(xcv2, ce2); - return compare_x_on_boundary(xcv1[index_1], ce1, xcv2[index_2], ce2); + return cmp_x_on_boundary(xcv1[index_1], ce1, xcv2[index_2], ce2); } Comparison_result operator()(const X_monotone_curve_2& xcv, Arr_curve_end ce1/* for xcv */, const X_monotone_subcurve_2& xseg, - Arr_curve_end ce2/*! for xseg */) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Compare_x_on_boundary_2 - compare_x_on_boundary = geom_traits->compare_x_on_boundary_2_object(); - + Arr_curve_end ce2/*! for xseg */) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_x_on_boundary = geom_traits->compare_x_on_boundary_2_object(); size_type index = this->get_curve_index(xcv, ce1 ); - return compare_x_on_boundary(xcv[index], ce1, xseg, ce2); + return cmp_x_on_boundary(xcv[index], ce1, xseg, ce2); } }; @@ -1639,22 +1652,26 @@ class Arr_polycurve_basic_traits_2 { Compare_x_on_boundary_2 compare_x_on_boundary_2_object() const { return Compare_x_on_boundary_2(*this); } - class Compare_x_near_boundary_2{ + /*! A functor that compares the \f$x-\f$coordinates of curve ends near the + * boundary of the parameter space. + */ + class Compare_x_near_boundary_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + Compare_x_near_boundary_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: size_type get_curve_index(const X_monotone_curve_2& xcv, - const Arr_curve_end ce) const - { + const Arr_curve_end ce) const { //waqar:: dont know why it is opposite in Parameter_space_in_x... // I think this is because of the way the subcurves are stored in the // curve_vector. @@ -1669,12 +1686,9 @@ class Arr_polycurve_basic_traits_2 { Comparison_result operator()(const X_monotone_curve_2 xcv1, const X_monotone_curve_2 xcv2, - Arr_curve_end ce) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Compare_x_near_boundary_2 - cmp_x_near_boundary = geom_traits->compare_x_near_boundary_2_object(); - + Arr_curve_end ce) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_x_near_boundary = geom_traits->compare_x_near_boundary_2_object(); size_type index_1 = this->get_curve_index(xcv1, ce); size_type index_2 = this->get_curve_index(xcv2, ce); @@ -1690,18 +1704,20 @@ class Arr_polycurve_basic_traits_2 { */ class Compare_y_on_boundary_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Compare_y_on_boundary_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Compare the y-coordinate of two given points that lie on the vertical * identification curve. * \param p1 the first point. @@ -1712,9 +1728,8 @@ class Arr_polycurve_basic_traits_2 { * \pre p1 lies on the vertical identification curve. * \pre p2 lies on the vertical identification curve. */ - Comparison_result operator()(const Point_2& p1, const Point_2& p2) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); + Comparison_result operator()(const Point_2& p1, const Point_2& p2) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); return geom_traits->compare_y_on_boundary_2_object()(p1, p2); } }; @@ -1728,18 +1743,20 @@ class Arr_polycurve_basic_traits_2 { */ class Compare_y_near_boundary_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Compare_y_near_boundary_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Compare the y-coordinates of 2 curves at their ends near the boundary * of the parameter space. * \param xcv1 the first curve. @@ -1755,17 +1772,15 @@ class Arr_polycurve_basic_traits_2 { */ Comparison_result operator()(const X_monotone_curve_2& xcv1, const X_monotone_curve_2& xcv2, - Arr_curve_end ce) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - Comparison_result direction1 = - geom_traits->compare_endpoints_xy_2_object()(xcv1[0]); + Arr_curve_end ce) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_endpt = geom_traits->compare_endpoints_xy_2_object(); + Comparison_result direction1 = cmp_endpt(xcv1[0]); const X_monotone_subcurve_2& xs1 = (((direction1 == SMALLER) && (ce == ARR_MAX_END)) || ((direction1 == LARGER) && (ce == ARR_MIN_END))) ? xcv1[0] : xcv1[xcv1.number_of_subcurves()-1]; - Comparison_result direction2 = - geom_traits->compare_endpoints_xy_2_object()(xcv2[0]); + Comparison_result direction2 = cmp_endpt(xcv2[0]); const X_monotone_subcurve_2& xs2 = (((direction2 == SMALLER) && (ce == ARR_MAX_END)) || ((direction2 == LARGER) && (ce == ARR_MIN_END))) ? @@ -1783,25 +1798,26 @@ class Arr_polycurve_basic_traits_2 { */ class Is_on_y_identification_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Is_on_y_identification_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Determine whether a point lies in the vertical boundary. * \param p the point. * \return a Boolean indicating whether p lies in the vertical boundary. */ - bool operator()(const Point_2& p) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); + bool operator()(const Point_2& p) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); return geom_traits->is_on_y_identification_2_object()(p); } @@ -1809,11 +1825,9 @@ class Arr_polycurve_basic_traits_2 { * \param xcv the x-monotone curve. * \return a Boolean indicating whether xcv lies in the vertical boundary. */ - bool operator()(const X_monotone_curve_2& xcv) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - typename X_monotone_curve_2::Subcurve_const_iterator it; - for (it = xcv.subcurves_begin(); it != xcv.subcurves_end(); ++it) + bool operator()(const X_monotone_curve_2& xcv) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + for (auto it = xcv.subcurves_begin(); it != xcv.subcurves_end(); ++it) if (! geom_traits->is_on_y_identification_2_object()(*it)) return false; return true; } @@ -1828,25 +1842,26 @@ class Arr_polycurve_basic_traits_2 { */ class Is_on_x_identification_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Is_on_x_identification_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Determine whether a point lies in the vertical boundary. * \param p the point. * \return a Boolean indicating whether p lies in the vertical boundary. */ - bool operator()(const Point_2& p) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); + bool operator()(const Point_2& p) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); return geom_traits->is_on_x_identification_2_object()(p); } @@ -1854,11 +1869,9 @@ class Arr_polycurve_basic_traits_2 { * \param xcv the x-monotone curve. * \return a Boolean indicating whether xcv lies in the vertical boundary. */ - bool operator()(const X_monotone_curve_2& xcv) const - { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - typename X_monotone_curve_2::Subcurve_const_iterator it; - for (it = xcv.subcurves_begin(); it != xcv.subcurves_end(); ++it) + bool operator()(const X_monotone_curve_2& xcv) const { + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + for (auto it = xcv.subcurves_begin(); it != xcv.subcurves_end(); ++it) if (! geom_traits->is_on_x_identification_2_object()(*it)) return false; return true; } @@ -1878,8 +1891,7 @@ class Arr_polycurve_basic_traits_2 { */ class Number_of_points_2 { public: - size_type operator()(const X_monotone_curve_2& cv) const - { + size_type operator()(const X_monotone_curve_2& cv) const { size_type num_seg = cv.number_of_subcurves(); return (num_seg == 0) ? 0 : num_seg + 1; } @@ -1893,18 +1905,20 @@ class Arr_polycurve_basic_traits_2 { */ class Push_back_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The traits (in case it has state). */ + //! The traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Push_back_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /*! Append a subcurve to an existing x-monotone polycurve at the back. */ void operator()(X_monotone_curve_2& xcv, const X_monotone_subcurve_2& seg) @@ -1916,37 +1930,30 @@ class Arr_polycurve_basic_traits_2 { template void push_back_2_impl(X_monotone_curve_2& xcv, const X_monotone_subcurve_2& seg, - Arr_all_sides_oblivious_tag) const - { + Arr_all_sides_oblivious_tag) const { CGAL_precondition_code ( - typedef typename X_monotone_curve_2::size_type size_type; + using size_type = typename X_monotone_curve_2::size_type; size_type num_seg = xcv.number_of_subcurves(); - const Subcurve_traits_2* geom_traits = - m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Compare_endpoints_xy_2 cmp_seg_endpts = - geom_traits->compare_endpoints_xy_2_object(); - Comparison_result dir = cmp_seg_endpts(seg); - typename Subcurve_traits_2::Construct_max_vertex_2 get_max_v = - geom_traits->construct_max_vertex_2_object(); - typename Subcurve_traits_2::Construct_min_vertex_2 get_min_v = - geom_traits->construct_min_vertex_2_object(); - typename Subcurve_traits_2::Equal_2 equal = - geom_traits->equal_2_object(); - typename Subcurve_traits_2::Is_vertical_2 is_vertical = - geom_traits->is_vertical_2_object(); + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_endpts = geom_traits->compare_endpoints_xy_2_object(); + Comparison_result dir = cmp_endpts(seg); + auto get_max_v = geom_traits->construct_max_vertex_2_object(); + auto get_min_v = geom_traits->construct_min_vertex_2_object(); + auto equal = geom_traits->equal_2_object(); + auto is_vertical = geom_traits->is_vertical_2_object(); CGAL_precondition_msg((num_seg == 0) || ((is_vertical(xcv[0]) && is_vertical(seg)) || - (!is_vertical(xcv[0]) && !is_vertical(seg))), + (! is_vertical(xcv[0]) && ! is_vertical(seg))), "xcv is vertical and seg is not or vice versa!"); CGAL_precondition_msg((num_seg == 0) || - (cmp_seg_endpts(xcv[0]) == dir), + (cmp_endpts(xcv[0]) == dir), "xcv and seg do not have the same orientation!"); CGAL_precondition_msg((num_seg == 0) || - !equal(get_min_v(seg), get_max_v(seg)), + ! equal(get_min_v(seg), get_max_v(seg)), "Seg degenerates to a point!"); CGAL_precondition_msg((num_seg == 0) || @@ -1966,40 +1973,31 @@ class Arr_polycurve_basic_traits_2 { } // Boundary implementation - template + template void push_back_2_impl(X_monotone_curve_2& xcv, const X_monotone_subcurve_2& seg, - Arr_not_all_sides_oblivious_tag) const - { + Arr_not_all_sides_oblivious_tag) const { CGAL_precondition_code ( - typedef typename X_monotone_curve_2::size_type size_type; + using size_type = typename X_monotone_curve_2::size_type; size_type num_seg = xcv.number_of_subcurves(); - const Subcurve_traits_2* geom_traits = - m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Compare_endpoints_xy_2 cmp_seg_endpts = - geom_traits->compare_endpoints_xy_2_object(); - Comparison_result dir = cmp_seg_endpts(seg); - typename Subcurve_traits_2::Construct_max_vertex_2 get_max_v = - geom_traits->construct_max_vertex_2_object(); - typename Subcurve_traits_2::Construct_min_vertex_2 get_min_v = - geom_traits->construct_min_vertex_2_object(); - typename Subcurve_traits_2::Equal_2 equal = - geom_traits->equal_2_object(); - typename Subcurve_traits_2::Is_vertical_2 is_vertical = - geom_traits->is_vertical_2_object(); - typename Subcurve_traits_2::Parameter_space_in_x_2 ps_x = - geom_traits->parameter_space_in_x_2_object(); - typename Subcurve_traits_2::Parameter_space_in_y_2 ps_y = - geom_traits->parameter_space_in_y_2_object(); + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_endpts = geom_traits->compare_endpoints_xy_2_object(); + Comparison_result dir = cmp_endpts(seg); + auto get_max_v = geom_traits->construct_max_vertex_2_object(); + auto get_min_v = geom_traits->construct_min_vertex_2_object(); + auto equal = geom_traits->equal_2_object(); + auto is_vertical = geom_traits->is_vertical_2_object(); + auto ps_x = geom_traits->parameter_space_in_x_2_object(); + auto ps_y = geom_traits->parameter_space_in_y_2_object(); CGAL_precondition_msg((num_seg == 0) || ((is_vertical(xcv[0]) && is_vertical(seg)) || - (!is_vertical(xcv[0]) && !is_vertical(seg))), + (! is_vertical(xcv[0]) && ! is_vertical(seg))), "xcv is vertical and seg is not or vice versa!"); CGAL_precondition_msg((num_seg == 0) || - (cmp_seg_endpts(xcv[0]) == dir), + (cmp_endpts(xcv[0]) == dir), "xcv and seg do not have the same orientation!"); const Arr_parameter_space min_x_seg = ps_x(seg, ARR_MIN_END); @@ -2055,7 +2053,7 @@ class Arr_polycurve_basic_traits_2 { (max_x_seg == ARR_INTERIOR) && (max_y_seg == ARR_INTERIOR)) { CGAL_precondition_msg((num_seg == 0) || - !equal(get_min_v(seg), get_max_v(seg)), + ! equal(get_min_v(seg), get_max_v(seg)), "Seg degenerates to a point!"); } @@ -2088,18 +2086,20 @@ class Arr_polycurve_basic_traits_2 { */ class Push_front_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /*! The traits (in case it has state). */ + //! The traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; - public: + friend class Arr_polycurve_basic_traits_2; + /*! Constructor. */ Push_front_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + public: /* Append a subcurve `seg` to an existing polycurve `xcv` at the front. */ void operator()(X_monotone_curve_2& xcv, const X_monotone_subcurve_2& seg) const @@ -2110,39 +2110,31 @@ class Arr_polycurve_basic_traits_2 { template void push_front_2_impl(X_monotone_curve_2& xcv, const X_monotone_subcurve_2& seg, - Arr_all_sides_oblivious_tag) - const - { + Arr_all_sides_oblivious_tag) const { CGAL_precondition_code ( - typedef typename X_monotone_curve_2::size_type size_type; + using size_type = typename X_monotone_curve_2::size_type; size_type num_seg = xcv.number_of_subcurves(); - const Subcurve_traits_2* geom_traits = - m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Compare_endpoints_xy_2 cmp_seg_endpts = - geom_traits->compare_endpoints_xy_2_object(); - Comparison_result dir = cmp_seg_endpts(seg); - typename Subcurve_traits_2::Construct_max_vertex_2 get_max_v = - geom_traits->construct_max_vertex_2_object(); - typename Subcurve_traits_2::Construct_min_vertex_2 get_min_v = - geom_traits->construct_min_vertex_2_object(); - typename Subcurve_traits_2::Equal_2 equal = - geom_traits->equal_2_object(); - typename Subcurve_traits_2::Is_vertical_2 is_vertical = - geom_traits->is_vertical_2_object(); + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_endpts = geom_traits->compare_endpoints_xy_2_object(); + Comparison_result dir = cmp_endpts(seg); + auto get_max_v = geom_traits->construct_max_vertex_2_object(); + auto get_min_v = geom_traits->construct_min_vertex_2_object(); + auto equal = geom_traits->equal_2_object(); + auto is_vertical = geom_traits->is_vertical_2_object(); CGAL_precondition_msg((num_seg == 0) || ((is_vertical(xcv[0]) && is_vertical(seg)) || - (!is_vertical(xcv[0]) && !is_vertical(seg))), + (! is_vertical(xcv[0]) && !is_vertical(seg))), "xcv is vertical and seg is not or vice versa!"); CGAL_precondition_msg((num_seg == 0) || - (cmp_seg_endpts(xcv[0]) == dir), + (cmp_endpts(xcv[0]) == dir), "xcv and seg do not have the same orientation!"); CGAL_precondition_msg((num_seg == 0) || - !equal(get_min_v(seg), get_max_v(seg)), + ! equal(get_min_v(seg), get_max_v(seg)), "Seg degenerates to a point!"); CGAL_precondition_msg((num_seg == 0) || (((dir != SMALLER) || @@ -2158,41 +2150,31 @@ class Arr_polycurve_basic_traits_2 { } // Boundary implementation - template + template void push_front_2_impl(X_monotone_curve_2& xcv, const X_monotone_subcurve_2& seg, - Arr_not_all_sides_oblivious_tag) - const - { + Arr_not_all_sides_oblivious_tag) const { CGAL_precondition_code ( - typedef typename X_monotone_curve_2::size_type size_type; + using size_type = typename X_monotone_curve_2::size_type; size_type num_seg = xcv.number_of_subcurves(); - const Subcurve_traits_2* geom_traits = - m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Compare_endpoints_xy_2 cmp_seg_endpts = - geom_traits->compare_endpoints_xy_2_object(); - Comparison_result dir = cmp_seg_endpts(seg); - typename Subcurve_traits_2::Construct_max_vertex_2 get_max_v = - geom_traits->construct_max_vertex_2_object(); - typename Subcurve_traits_2::Construct_min_vertex_2 get_min_v = - geom_traits->construct_min_vertex_2_object(); - typename Subcurve_traits_2::Equal_2 equal = - geom_traits->equal_2_object(); - typename Subcurve_traits_2::Parameter_space_in_x_2 ps_x = - geom_traits->parameter_space_in_x_2_object(); - typename Subcurve_traits_2::Parameter_space_in_y_2 ps_y = - geom_traits->parameter_space_in_y_2_object(); - typename Subcurve_traits_2::Is_vertical_2 is_vertical = - geom_traits->is_vertical_2_object(); + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto cmp_endpts = geom_traits->compare_endpoints_xy_2_object(); + Comparison_result dir = cmp_endpts(seg); + auto get_max_v = geom_traits->construct_max_vertex_2_object(); + auto get_min_v = geom_traits->construct_min_vertex_2_object(); + auto equal = geom_traits->equal_2_object(); + auto ps_x = geom_traits->parameter_space_in_x_2_object(); + auto ps_y = geom_traits->parameter_space_in_y_2_object(); + auto is_vertical = geom_traits->is_vertical_2_object(); CGAL_precondition_msg((num_seg == 0) || ((is_vertical(xcv[0]) && is_vertical(seg)) || - (!is_vertical(xcv[0]) && !is_vertical(seg))), + (! is_vertical(xcv[0]) && ! is_vertical(seg))), "xcv is vertical and seg is not or vice versa!"); CGAL_precondition_msg((num_seg == 0) || - (cmp_seg_endpts(xcv[0]) == dir), + (cmp_endpts(xcv[0]) == dir), "xcv and seg do not have the same orientation!"); const Arr_parameter_space min_x_seg = ps_x(seg, ARR_MIN_END); @@ -2227,7 +2209,7 @@ class Arr_polycurve_basic_traits_2 { (max_x_seg == ARR_INTERIOR) && (max_y_seg == ARR_INTERIOR)) { CGAL_precondition_msg((num_seg == 0) || - !equal(get_min_v(seg), get_max_v(seg)), + ! equal(get_min_v(seg), get_max_v(seg)), "Seg degenerates to a point!"); } @@ -2253,60 +2235,61 @@ class Arr_polycurve_basic_traits_2 { /*! Obtain a Push_front_2 functor object. */ Push_front_2 push_front_2_object() const { return Push_front_2(*this); } + //! A functor that trimps an \f$x\f$-monotone curve. class Trim_2 { protected: - typedef Arr_polycurve_basic_traits_2 - Polycurve_basic_traits_2; + using Polycurve_basic_traits_2 = + Arr_polycurve_basic_traits_2; - /* The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Polycurve_basic_traits_2& m_poly_traits; + friend class Arr_polycurve_basic_traits_2; + + /*! Constructor. */ + Trim_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} + + public: /*! \brief returns a trimmed version of the polycurve with src and tgt as * end points. */ - public: - /*! Constructor. */ - Trim_2(const Polycurve_basic_traits_2& traits) : - m_poly_traits(traits) - {} - X_monotone_curve_2 operator()(const X_monotone_curve_2& xcv, - const Point_2& src, - const Point_2& tgt)const + const Point_2& source, + const Point_2& target)const { - const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); - typename Subcurve_traits_2::Trim_2 trim = geom_traits->trim_2_object(); + const auto* geom_traits = m_poly_traits.subcurve_traits_2(); + auto min_vertex = geom_traits->construct_min_vertex_2_object(); + auto max_vertex = geom_traits->construct_max_vertex_2_object(); + auto trim = geom_traits->trim_2_object(); //check whether src and tgt lies on the polycurve/polycurve. - CGAL_precondition(m_poly_traits.compare_y_at_x_2_object()(src, xcv) == - EQUAL); - CGAL_precondition(m_poly_traits.compare_y_at_x_2_object()(tgt, xcv) == - EQUAL); + CGAL_precondition_code + (auto cmp_y_at_x_2 = m_poly_traits.compare_y_at_x_2_object()); + CGAL_precondition(cmp_y_at_x_2(source, xcv) == EQUAL); + CGAL_precondition(cmp_y_at_x_2(target, xcv) == EQUAL); /* Check whether the source and the target conform with the * direction of the polycurve. * since the direction of the poly-line/curve should not be changed. * we will interchange the source and the target. */ - Point_2 source = src; - Point_2 target = tgt; + Point_2 src = source; + Point_2 trg = target; // If curve is oriented from right to left but points are left to right. if (m_poly_traits.compare_endpoints_xy_2_object()(xcv) == LARGER && - m_poly_traits.compare_x_2_object()(src, tgt) == SMALLER ) - { - source = tgt; - target = src; + m_poly_traits.compare_x_2_object()(source, target) == SMALLER) { + src = target; + trg = source; } /* If curve is oriented from left to right but points are from right * to left. */ else if (m_poly_traits.compare_endpoints_xy_2_object()(xcv) == SMALLER && - m_poly_traits.compare_x_2_object()(src, tgt) == LARGER ) - { - source = tgt; - target = src; + m_poly_traits.compare_x_2_object()(source, target) == LARGER) { + src = target; + trg = source; } // std::cout << "**************the new source: " << source @@ -2317,8 +2300,8 @@ class Arr_polycurve_basic_traits_2 { * source and target) along with complete * subcurves in between them. */ - std::size_t source_id = m_poly_traits.locate(xcv, source); - std::size_t target_id = m_poly_traits.locate(xcv, target); + std::size_t src_id = m_poly_traits.locate(xcv, src); + std::size_t trg_id = m_poly_traits.locate(xcv, trg); // std::cout << "source number: " << source_id << " Target number : " // << target_id << std::endl; // std::cout << "target subcurve: " << xcv[target_id] << std::endl; @@ -2328,52 +2311,44 @@ class Arr_polycurve_basic_traits_2 { Comparison_result orientation = m_poly_traits.compare_endpoints_xy_2_object()(xcv); - Point_2 source_max_vertex = - geom_traits->construct_max_vertex_2_object()(xcv[source_id]); - Point_2 source_min_vertex = - geom_traits->construct_min_vertex_2_object()(xcv[source_id]); - Point_2 target_min_vertex = - geom_traits->construct_min_vertex_2_object()(xcv[target_id]); - Point_2 target_max_vertex = - geom_traits->construct_max_vertex_2_object()(xcv[target_id]); + auto src_max_vertex = max_vertex(xcv[src_id]); + auto src_min_vertex = min_vertex(xcv[src_id]); + auto trg_min_vertex = min_vertex(xcv[trg_id]); + auto trg_max_vertex = max_vertex(xcv[trg_id]); //push the trimmed version of the source subcurve. - // if(sorientation == SMALLER && source != source_max_vertex) + // if(sorientation == SMALLER && source != src_max_vertex) if ((orientation == SMALLER) && - ! geom_traits->equal_2_object()(source, source_max_vertex) ) + ! geom_traits->equal_2_object()(src, src_max_vertex) ) { - if (source_id != target_id ) - trimmed_subcurves.push_back(trim(xcv[source_id], - source, source_max_vertex)); - else trimmed_subcurves.push_back(trim(xcv[source_id], source, target)); + if (src_id != trg_id ) + trimmed_subcurves.push_back(trim(xcv[src_id], src, src_max_vertex)); + else trimmed_subcurves.push_back(trim(xcv[src_id], src, trg)); } - //else if(orientation == LARGER && source != source_min_vertex) + //else if(orientation == LARGER && source != src_min_vertex) else if ((orientation == LARGER) && - ! geom_traits->equal_2_object()(source, source_min_vertex)) + ! geom_traits->equal_2_object()(src, src_min_vertex)) { - if (source_id != target_id ) - trimmed_subcurves.push_back(trim(xcv[source_id], - source, source_min_vertex)); - else trimmed_subcurves.push_back(trim(xcv[source_id], source, target)); + if (src_id != trg_id ) + trimmed_subcurves.push_back(trim(xcv[src_id], src, src_min_vertex)); + else trimmed_subcurves.push_back(trim(xcv[src_id], src, trg)); } //push the middle subcurves as they are. - for (size_t i = source_id+1; iequal_2_object()(target, target_min_vertex)) - trimmed_subcurves.push_back(trim(xcv[target_id], - target_min_vertex, target)); + ! geom_traits->equal_2_object()(trg, trg_min_vertex)) + trimmed_subcurves.push_back(trim(xcv[trg_id], trg_min_vertex, trg)); - //else if (orientation == LARGER && target != target_max_vertex) + //else if (orientation == LARGER && target != trg_max_vertex) else if ((orientation == LARGER) && - ! geom_traits->equal_2_object()(target, target_max_vertex)) - trimmed_subcurves.push_back(trim(xcv[target_id], - target_max_vertex, target)); + ! geom_traits->equal_2_object()(trg, trg_max_vertex)) + trimmed_subcurves.push_back(trim(xcv[trg_id], trg_max_vertex, trg)); } return X_monotone_curve_2(trimmed_subcurves.begin(), @@ -2401,8 +2376,7 @@ class Arr_polycurve_basic_traits_2 { * If q is not in the x-range of cv, returns INVALID_INDEX. */ template - std::size_t locate_gen(const X_monotone_curve_2& cv, Compare compare) const - { + std::size_t locate_gen(const X_monotone_curve_2& cv, Compare compare) const { // The direction of cv. SMALLER means left-to-right and // otherwise right-to-left Comparison_result direction = @@ -2466,11 +2440,10 @@ class Arr_polycurve_basic_traits_2 { template class Compare_points { private: - /*! The polycurve traits (in case it has state). */ + //! The polycurve traits (in case it has state). const Subcurve_traits_2& m_subcurve_traits; const Point_2& m_point; - Comparer m_compare; public: @@ -2484,9 +2457,8 @@ class Arr_polycurve_basic_traits_2 { // Compare the given curve-end with the stored point. Comparison_result operator()(const X_monotone_subcurve_2& xs, - Arr_curve_end ce) - { - const Point_2& p = (ce == ARR_MAX_END) ? + Arr_curve_end ce) { + auto p = (ce == ARR_MAX_END) ? m_subcurve_traits.construct_max_vertex_2_object()(xs) : m_subcurve_traits.construct_min_vertex_2_object()(xs); return m_compare(p, m_point); @@ -2498,7 +2470,6 @@ class Arr_polycurve_basic_traits_2 { class Compare_point_curve_end { private: const Point_2& m_point; - Comparer m_compare; public: @@ -2519,9 +2490,7 @@ class Arr_polycurve_basic_traits_2 { class Compare_curve_ends { private: const X_monotone_subcurve_2& m_x_monotone_subcurve; - Arr_curve_end m_curve_end; - Comparer m_compare; public: @@ -2550,13 +2519,12 @@ class Arr_polycurve_basic_traits_2 { std::size_t locate_impl(const X_monotone_curve_2& xcv, const X_monotone_subcurve_2& xs, Arr_curve_end ce, - Arr_not_all_sides_oblivious_tag) const - { + Arr_not_all_sides_oblivious_tag) const { const Subcurve_traits_2* geom_traits = subcurve_traits_2(); if (geom_traits->is_vertical_2_object()(xcv[0])) { // Verify that q has the same x-coord as xcv (which is vertical) - Compare_x_2 compare_x = compare_x_2_object(); - Comparison_result res = compare_x(xcv[0], ARR_MIN_END, xs, ce); + Compare_x_2 cmp_x = compare_x_2_object(); + Comparison_result res = cmp_x(xcv[0], ARR_MIN_END, xs, ce); if (res != EQUAL) return INVALID_INDEX; Compare_curve_ends compare(compare_xy_2_object(), xs, ce); @@ -2578,10 +2546,9 @@ class Arr_polycurve_basic_traits_2 { std::size_t locate_impl(const X_monotone_curve_2& xcv, const X_monotone_subcurve_2& xs, Arr_curve_end ce, - Arr_all_sides_oblivious_tag) const - { + Arr_all_sides_oblivious_tag) const { const Subcurve_traits_2* geom_traits = subcurve_traits_2(); - const Point_2& p = (ce == ARR_MAX_END) ? + auto p = (ce == ARR_MAX_END) ? geom_traits->construct_max_vertex_2_object()(xs) : geom_traits->construct_min_vertex_2_object()(xs); return locate(xcv, p); @@ -2596,13 +2563,12 @@ class Arr_polycurve_basic_traits_2 { */ std::size_t locate_impl(const X_monotone_curve_2& xcv, const Point_2& p, - Arr_not_all_sides_oblivious_tag) const - { + Arr_not_all_sides_oblivious_tag) const { const Subcurve_traits_2* geom_traits = subcurve_traits_2(); if (geom_traits->is_vertical_2_object()(xcv[0])) { // Verify that q has the same x-coord as xcv (which is vertical) - Compare_x_2 compare_x = compare_x_2_object(); - Comparison_result res = compare_x(xcv[0], ARR_MIN_END, p); + auto cmp_x = compare_x_2_object(); + Comparison_result res = cmp_x(xcv[0], ARR_MIN_END, p); if (res != EQUAL) return INVALID_INDEX; Compare_point_curve_end compare(compare_xy_2_object(), p); @@ -2625,24 +2591,21 @@ class Arr_polycurve_basic_traits_2 { { return locate(xcv, p); } // - std::size_t locate(const X_monotone_curve_2& xcv, const Point_2& q) const - { + std::size_t locate(const X_monotone_curve_2& xcv, const Point_2& q) const { const Subcurve_traits_2* geom_traits = subcurve_traits_2(); if (geom_traits->is_vertical_2_object()(xcv[0])) { // Verify that q has the same x-coord as cv (which is vertical) - typename Subcurve_traits_2::Construct_min_vertex_2 min_vertex = - geom_traits->construct_min_vertex_2_object(); - typename Subcurve_traits_2::Compare_x_2 compare_x = - geom_traits->compare_x_2_object(); - Comparison_result res = compare_x(min_vertex(xcv[0]), q); + auto min_vertex = geom_traits->construct_min_vertex_2_object(); + auto cmp_x = geom_traits->compare_x_2_object(); + Comparison_result res = cmp_x(min_vertex(xcv[0]), q); if (res != EQUAL) return INVALID_INDEX; - Compare_points compare(*geom_traits, + Compare_pointscompare(*geom_traits, compare_xy_2_object(), q); return locate_gen(xcv, compare); } - Compare_points compare(*geom_traits, compare_x_2_object(), q); + Compare_pointscompare(*geom_traits, compare_x_2_object(), q); return locate_gen(xcv, compare); } @@ -2656,28 +2619,21 @@ class Arr_polycurve_basic_traits_2 { * right) of q, or INVALID_INDEX if no such subcurve exists. */ std::size_t locate_side(const X_monotone_curve_2& cv, - const Point_2& q, const bool& to_right) const - { + const Point_2& q, const bool& to_right) const { // First locate a subcurve subcurves[i] that contains q in its x-range. std::size_t i = locate(cv, q); if (i == INVALID_INDEX) return INVALID_INDEX; - typename Subcurve_traits_2::Equal_2 equal = - subcurve_traits_2()->equal_2_object(); - typename Subcurve_traits_2::Compare_endpoints_xy_2 cmp_seg_endpts = - subcurve_traits_2()->compare_endpoints_xy_2_object(); - typename Subcurve_traits_2::Compare_x_2 comp_x = - subcurve_traits_2()->compare_x_2_object(); - typename Subcurve_traits_2::Is_vertical_2 is_vert = - subcurve_traits_2()->is_vertical_2_object(); - typename Subcurve_traits_2::Construct_max_vertex_2 get_max_v = - subcurve_traits_2()->construct_max_vertex_2_object(); - typename Subcurve_traits_2::Construct_min_vertex_2 get_min_v = - subcurve_traits_2()->construct_min_vertex_2_object(); - - Comparison_result direction = cmp_seg_endpts(cv[i]); - - if ((!is_vert(cv[0]) && (comp_x(get_min_v(cv[i]), q) == EQUAL)) || + auto equal = subcurve_traits_2()->equal_2_object(); + auto cmp_endpts = subcurve_traits_2()->compare_endpoints_xy_2_object(); + auto cmp_x = subcurve_traits_2()->compare_x_2_object(); + auto is_vert = subcurve_traits_2()->is_vertical_2_object(); + auto get_max_v = subcurve_traits_2()->construct_max_vertex_2_object(); + auto get_min_v = subcurve_traits_2()->construct_min_vertex_2_object(); + + Comparison_result direction = cmp_endpts(cv[i]); + + if ((! is_vert(cv[0]) && (cmp_x(get_min_v(cv[i]), q) == EQUAL)) || (is_vert(cv[0]) && equal(get_min_v(cv[i]), q))){ // q is the left endpoint of the i'th subcurve: if (to_right) return i; @@ -2694,11 +2650,11 @@ class Arr_polycurve_basic_traits_2 { } } - if ((!is_vert(cv[0]) && (comp_x(get_max_v(cv[i]), q) == EQUAL)) || + if ((! is_vert(cv[0]) && (cmp_x(get_max_v(cv[i]), q) == EQUAL)) || (is_vert(cv[0]) && equal(get_max_v(cv[i]), q))) { // q is the right endpoint of the i'th subcurve: - if (!to_right) return i; + if (! to_right) return i; else { if (direction == SMALLER) { if (i == (cv.number_of_subcurves() - 1)) return INVALID_INDEX; From a1e63b0027940601d28064f08e48cc711710fb09 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 9 Sep 2024 12:33:41 +0200 Subject: [PATCH 163/348] Refactor handling of package names in script --- Testsuite/test/post_process_ctest_results.py | 55 +++++++++----------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index 7349f1d125f0..5de5471ff5eb 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -65,12 +65,12 @@ def handle_end_of_package(package_name, report_file_name, lines_to_write): position = find_third_separator(contents) if not any(re.search("- CMake Results .*", content) for content in contents): - lines_to_write.insert(0, f"""{SEPARATOR} - - CMake Results for {package_name} - {SEPARATOR} + lines_to_write.insert(0, f""" +{SEPARATOR} +- CMake Results for {package_name} +{SEPARATOR} - """) - lines_to_write.insert(0, "\n") +""") contents[position:position] = lines_to_write write_file_lines(file_path, contents) @@ -104,7 +104,7 @@ def retrieve_cmake_logs(file_path): logging.debug("Opening file %s", file_path) contents = read_file_lines(file_path) - position_begin = find_last(contents, SEPARATOR) + position_begin = 1 + find_last(contents, SEPARATOR) position_end = 1 + find_last(contents, "== Generating build files for tests ==") cmake_logs = contents[position_begin:position_end] @@ -129,38 +129,35 @@ def main(): for line in read_file_lines(input_report_file_name): line_matches_new_package = CONFIG_REGEX.match(line) + if package_name and line_matches_new_package: + handle_end_of_package(package_name, report_file_name, lines_to_write) + lines_to_write = [] + package_name = "" + if line_matches_new_package: logging.debug("Found new package %s", line_matches_new_package.group(0)) logging.debug(" group 1 %s", line_matches_new_package.group(1)) new_package_name = line_matches_new_package.group(0).replace( line_matches_new_package.group(1), "" ) + logging.debug("Setting package name to %s", new_package_name) + package_name = new_package_name + if DEMO_REGEX.match(line): + package_name = f"{package_name}_Demo" + elif EXAMPLES_REGEX.match(line): + package_name = f"{package_name}_Examples" + + if package_name == "incomplete": + package_name = "" + continue + else: + is_ignored = handle_new_package__is_ignored(package_name, report_file_name, cmake_logs) + logging.debug("Is package %s ignored? %s", package_name, is_ignored) + if is_ignored: + mark_package_as_missing_requirements(global_report_file_name, package_name) if package_name and not line_matches_new_package and line.strip() != "": lines_to_write.append(line) - if package_name and line_matches_new_package: - handle_end_of_package( - package_name, - report_file_name, - lines_to_write, - ) - lines_to_write = [] - if not package_name: - if line_matches_new_package: - package_name = new_package_name - if DEMO_REGEX.match(line): - package_name = f"{package_name}_Demo" - elif EXAMPLES_REGEX.match(line): - package_name = f"{package_name}_Examples" - - if package_name == "incomplete": - package_name = "" - continue - else: - is_ignored = handle_new_package__is_ignored(package_name, report_file_name, cmake_logs) - if is_ignored: - mark_package_as_missing_requirements(global_report_file_name, package_name) - if __name__ == "__main__": main() From 7e11bd0c7ed1d8f5bda27bbb63c86554471f92c7 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Mon, 9 Sep 2024 14:04:42 +0300 Subject: [PATCH 164/348] Further clean up --- .../CGAL/Arr_polycurve_basic_traits_2.h | 69 ++++++++----------- 1 file changed, 29 insertions(+), 40 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h index e43f1af2a85a..dfbcd18d40bb 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -1613,7 +1614,7 @@ class Arr_polycurve_basic_traits_2 { auto cmp_x_on_boundary = geom_traits->compare_x_on_boundary_2_object(); size_type index = this->get_curve_index(xcv, ce); - return cmp_x_on_boundary(p, xcv[index], ce ); + return cmp_x_on_boundary(p, xcv[index], ce); } /*! Given two x-monotone curves C1(t) = (X1(t),Y1(t)) and @@ -1643,7 +1644,7 @@ class Arr_polycurve_basic_traits_2 { Arr_curve_end ce2/*! for xseg */) const { const auto* geom_traits = m_poly_traits.subcurve_traits_2(); auto cmp_x_on_boundary = geom_traits->compare_x_on_boundary_2_object(); - size_type index = this->get_curve_index(xcv, ce1 ); + size_type index = this->get_curve_index(xcv, ce1); return cmp_x_on_boundary(xcv[index], ce1, xseg, ce2); } }; @@ -1927,7 +1928,7 @@ class Arr_polycurve_basic_traits_2 { private: // Oblivious implementation - template + template void push_back_2_impl(X_monotone_curve_2& xcv, const X_monotone_subcurve_2& seg, Arr_all_sides_oblivious_tag) const { @@ -2028,7 +2029,7 @@ class Arr_polycurve_basic_traits_2 { ((max_x_cv == ARR_INTERIOR) && (max_y_cv == ARR_INTERIOR))), "Polycurve reaches the boundary to the right." - "Can not push back any subcurve further." ); + "Can not push back any subcurve further."); // A subcurve should not be pushed if the polycurve is directed to // the left and reaches the boundary. @@ -2036,7 +2037,7 @@ class Arr_polycurve_basic_traits_2 { ((min_x_cv == ARR_INTERIOR) && (min_y_cv == ARR_INTERIOR))), "Polycurve reaches the boundary to the left." - "Can not push back any subcurve further." ); + "Can not push back any subcurve further."); // Something like a line should not be pushed if there is already a // subcurve present in the polycurve. @@ -2044,7 +2045,7 @@ class Arr_polycurve_basic_traits_2 { (min_y_seg == ARR_INTERIOR)) || ((max_x_seg == ARR_INTERIOR) && (max_y_seg == ARR_INTERIOR)) || - (num_seg == 0) ), + (num_seg == 0)), "Subcurve reaching the boundary at both ends " "can not be pushed if there is already one or " "more subcurves present in the polycurve."); @@ -2065,7 +2066,7 @@ class Arr_polycurve_basic_traits_2 { "Seg does not connect to the right!"); } - if ((max_x_seg == ARR_INTERIOR) && (max_y_seg == ARR_INTERIOR) ) { + if ((max_x_seg == ARR_INTERIOR) && (max_y_seg == ARR_INTERIOR)) { CGAL_precondition_msg((num_seg == 0) || (((dir != LARGER) || equal(get_min_v(xcv[num_seg-1]), @@ -2107,7 +2108,7 @@ class Arr_polycurve_basic_traits_2 { private: // Oblivious implementation - template + template void push_front_2_impl(X_monotone_curve_2& xcv, const X_monotone_subcurve_2& seg, Arr_all_sides_oblivious_tag) const { @@ -2273,29 +2274,21 @@ class Arr_polycurve_basic_traits_2 { * since the direction of the poly-line/curve should not be changed. * we will interchange the source and the target. */ - Point_2 src = source; - Point_2 trg = target; - - // If curve is oriented from right to left but points are left to right. - if (m_poly_traits.compare_endpoints_xy_2_object()(xcv) == LARGER && - m_poly_traits.compare_x_2_object()(source, target) == SMALLER) { - src = target; - trg = source; - } - /* If curve is oriented from left to right but points are from right - * to left. + /* If the curve is oriented from right to left but points are left to + * right or if the curve is oriented from left to right but points are + * from right to left, reverse. */ - else if (m_poly_traits.compare_endpoints_xy_2_object()(xcv) == SMALLER && - m_poly_traits.compare_x_2_object()(source, target) == LARGER) { - src = target; - trg = source; - } + auto [src, trg] = + (((m_poly_traits.compare_endpoints_xy_2_object()(xcv) == LARGER) && + (m_poly_traits.compare_x_2_object()(source, target) == SMALLER)) || + ((m_poly_traits.compare_endpoints_xy_2_object()(xcv) == SMALLER) && + (m_poly_traits.compare_x_2_object()(source, target) == LARGER))) ? + std::make_tuple(target, source) : std::make_tuple(source, target); // std::cout << "**************the new source: " << source // << "the new target: " << target << std::endl; - /* - * Get the source and target subcurve numbers from the polycurve. + /* Get the source and target subcurve numbers from the polycurve. * The trimmed polycurve will have trimmed end subcurves(containing * source and target) along with complete * subcurves in between them. @@ -2319,24 +2312,22 @@ class Arr_polycurve_basic_traits_2 { //push the trimmed version of the source subcurve. // if(sorientation == SMALLER && source != src_max_vertex) if ((orientation == SMALLER) && - ! geom_traits->equal_2_object()(src, src_max_vertex) ) - { - if (src_id != trg_id ) + ! geom_traits->equal_2_object()(src, src_max_vertex)) { + if (src_id != trg_id) trimmed_subcurves.push_back(trim(xcv[src_id], src, src_max_vertex)); else trimmed_subcurves.push_back(trim(xcv[src_id], src, trg)); } //else if(orientation == LARGER && source != src_min_vertex) else if ((orientation == LARGER) && - ! geom_traits->equal_2_object()(src, src_min_vertex)) - { - if (src_id != trg_id ) + ! geom_traits->equal_2_object()(src, src_min_vertex)) { + if (src_id != trg_id) trimmed_subcurves.push_back(trim(xcv[src_id], src, src_min_vertex)); else trimmed_subcurves.push_back(trim(xcv[src_id], src, trg)); } //push the middle subcurves as they are. - for (size_t i = src_id+1; i from)) || - ((direction == LARGER) && (to < from))) - { + ((direction == LARGER) && (to < from))) { std::size_t mid = (from + to) / 2; if (((direction == SMALLER) && (mid > from)) || - ((direction == LARGER) && (mid < from))) - { + ((direction == LARGER) && (mid < from))) { Comparison_result res_mid = compare(cv[mid], ARR_MIN_END); if (res_mid == EQUAL) { // Ensure that the returned subcurve contains the query point @@ -2600,12 +2589,12 @@ class Arr_polycurve_basic_traits_2 { Comparison_result res = cmp_x(min_vertex(xcv[0]), q); if (res != EQUAL) return INVALID_INDEX; - Compare_pointscompare(*geom_traits, + Compare_points compare(*geom_traits, compare_xy_2_object(), q); return locate_gen(xcv, compare); } - Compare_pointscompare(*geom_traits, compare_x_2_object(), q); + Compare_points compare(*geom_traits, compare_x_2_object(), q); return locate_gen(xcv, compare); } From a6c965b87f646b56e31b526a6e1713dc6a103983 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Mon, 9 Sep 2024 15:25:21 +0300 Subject: [PATCH 165/348] Further clean up --- .../CGAL/Arr_polycurve_basic_traits_2.h | 556 +++++++++--------- 1 file changed, 277 insertions(+), 279 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h index dfbcd18d40bb..fc7b8064c564 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h @@ -78,7 +78,7 @@ class Arr_polycurve_basic_traits_2 { using Self = Arr_polycurve_basic_traits_2; // Data members: - const Subcurve_traits_2* m_subcurve_traits; // The base segment-traits class. + const Subcurve_traits_2* m_subcurve_traits; // the base segment-traits class. bool m_own_traits; protected: @@ -92,8 +92,8 @@ class Arr_polycurve_basic_traits_2 { {} /*! Construct from a subcurve traits. - * \param seg_traits an already existing subcurve tarits which is passed will - * be used by the class. + * \param seg_traits an already existing subcurve tarits, which is passed in; + * it will be used by the class. */ Arr_polycurve_basic_traits_2(const Subcurve_traits_2* geom_traits) : m_subcurve_traits(geom_traits), m_own_traits(false) {} @@ -127,8 +127,8 @@ class Arr_polycurve_basic_traits_2 { // ArrangementBasicTraits concept. //@{ - /*! An x monotone polycurve represents a continuous piecewise-linear - * curve which is either strongly x-monotone or vertical. Again, + /*! An \f$x\f$-monotone polycurve represents a continuous piecewise-linear + * curve which is either strongly \f$x\f$-monotone or vertical. Again, * the polycurve is without degenerated subcurves. */ using X_monotone_curve_2 = @@ -136,7 +136,7 @@ class Arr_polycurve_basic_traits_2 { using Size = typename X_monotone_curve_2::Size; using size_type = typename X_monotone_curve_2::size_type; - //! Compare the x-coordinates of two points. + //! Compare the \f$x\f$-coordinates of two points. class Compare_x_2 { protected: using Polycurve_basic_traits_2 = @@ -153,38 +153,41 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Compare the x-coordinates of two directional points. + /*! Compare the \f$x\f$-coordinates of two directional points. * \param p1 the first directional point. * \param p2 the second directional point. - * \return SMALLER - x(p1) < x(p2); - * EQUAL - x(p1) = x(p2); - * LARGER - x(p1) > x(p2). + * \return `SMALLER` - \f$x\f$(`p1`) < \f$x\f$(`p2`); + * `EQUAL` - \f$x\f$(`p1`) = \f$x\f$(`p2`); + * `LARGER` - \f$x\f$(`p1`) > \f$x\f$(`p2`). * \pre p1 does not lie on the boundary. * \pre p2 does not lie on the boundary. */ Comparison_result operator()(const Point_2& p1, const Point_2& p2) const { return m_poly_traits.subcurve_traits_2()->compare_x_2_object()(p1, p2); } - /*! Compare two ends of x-monotone curves in x. + /*! Compare two ends of \f$x\f$-monotone curves in \f$x\f$. * \param xs1 the first curve. - * \param ce1 the curve-end indicator of the first x-monotone curve xs1: - * ARR_MIN_END - the minimal end of xs1 or - * ARR_MAX_END - the maximal end of xs1. + * \param ce1 the curve-end indicator of the first \f$x\f$-monotone curve + * `xs1`: + * `ARR_MIN_END` - the minimal end of `xs1` or + * `ARR_MAX_END` - the maximal end of `xs1`. * \param p2 the second curve end. */ Comparison_result operator()(const X_monotone_subcurve_2& xs1, Arr_curve_end ce1, const Point_2& p2) { return operator()(xs1, ce1, p2, All_sides_oblivious_category()); } - /*! Compare two ends of x-monotone curves in x. + /*! Compare two ends of \f$x\f$-monotone curves in x. * \param xs1 the first curve. - * \param ce1 the curve-end indicator of the first x-monotone curve xs1: - * ARR_MIN_END - the minimal end of xs1 or - * ARR_MAX_END - the maximal end of xs1. + * \param ce1 the curve-end indicator of the first \f$x\f$-monotone curve + * `xs1`: + * `ARR_MIN_END` - the minimal end of `xs1` or + * `ARR_MAX_END` - the maximal end of `xs1`. * \param xs2 the second curve. - * \param ce2 the curve-end indicator of the second x-monoton curve xs2: - * ARR_MIN_END - the minimal end of xs2 or - * ARR_MAX_END - the maximal end of xs2. + * \param ce2 the curve-end indicator of the second \f$x\f$-monoton curve + * `xs2`: + * `ARR_MIN_END` - the minimal end of `xs2` or + * `ARR_MAX_END` - the maximal end of `xs2`. */ Comparison_result operator()(const X_monotone_subcurve_2& xs1, Arr_curve_end ce1, @@ -313,40 +316,45 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Compare two directional points lexigoraphically: by x, then by y. + /*! Compare two directional points lexigoraphically: by \f$x\f$, then by + * \f$y\f$. * \param p1 the first endpoint directional point. * \param p2 the second endpoint directional point. - * \return SMALLER - x(p1) < x(p2); - * SMALLER - x(p1) = x(p2) and y(p1) < y(p2); - * EQUAL - x(p1) = x(p2) and y(p1) = y(p2); - * LARGER - x(p1) = x(p2) and y(p1) > y(p2); - * LARGER - x(p1) > x(p2). - * \pre p1 does not lie on the boundary. - * \pre p2 does not lie on the boundary. + * \return + * `SMALLER` - \f$x\f$(p1) < \f$x\f$(p2); + * `SMALLER` - \f$x\f$(p1) = \f$x\f$(p2) and \f$y\f$(p1) < \f$y\f$(p2); + * `EQUAL` - \f$x\f$(p1) = \f$x\f$(p2) and \f$y\f$(p1) = \f$y\f$(p2); + * `LARGER` - \f$x\f$(p1) = \f$x\f$(p2) and \f$y\f$(p1) > \f$y\f$(p2); + * `LARGER` - \f$x\f$(p1) > \f$x\f$(p2). + * \pre `p1` does not lie on the boundary. + * \pre `p2` does not lie on the boundary. */ Comparison_result operator()(const Point_2& p1, const Point_2& p2) const { return m_poly_traits.subcurve_traits_2()->compare_xy_2_object()(p1, p2); } - /*! Compare two ends of x-monotone curves lexicographically. + /*! Compare two ends of \f$x\f$-monotone curves lexicographically. * \param xs1 the first curve. - * \param ce1 the curve-end indicator of the first x-monotone curve xs1: - * ARR_MIN_END - the minimal end of xs1 or - * ARR_MAX_END - the maximal end of xs1. + * \param ce1 the curve-end indicator of the first \f$x\f$-monotone curve + * `xs1`: + * `ARR_MIN_END` - the lexicographically smallest end of `xs1` or + * `ARR_MAX_END` - the lexicographically largest end of `xs1`. * \param p2 the second curve end. */ Comparison_result operator()(const X_monotone_subcurve_2& xs1, Arr_curve_end ce1, const Point_2& p2) { return operator()(xs1, ce1, p2, All_sides_oblivious_category()); } - /*! Compare two ends of x-monotone curves lexicographically. + /*! Compare two ends of \f$x\f$-monotone curves lexicographically. * \param xs1 the first curve. - * \param ce1 the curve-end indicator of the first x-monotone curve xs1: - * ARR_MIN_END - the minimal end of xs1 or - * ARR_MAX_END - the maximal end of xs1. + * \param ce1 the curve-end indicator of the first \f$x\f$-monotone curve + * `xs1`: + * `ARR_MIN_END` - the minimal end of `xs1` or + * `ARR_MAX_END` - the maximal end of `xs1`. * \param xs2 the second curve. - * \param ce2 the curve-end indicator of the second x-monoton curve xs2: - * ARR_MIN_END - the minimal end of xs2 or - * ARR_MAX_END - the maximal end of xs2. + * \param ce2 the curve-end indicator of the second \f$x\f$-monoton curve + * `xs2`: + * `ARR_MIN_END` - the minimal end of `xs2` or + * `ARR_MAX_END` - the maximal end of `xs2`. */ Comparison_result operator()(const X_monotone_subcurve_2& xs1, Arr_curve_end ce1, @@ -512,7 +520,7 @@ class Arr_polycurve_basic_traits_2 { /*! Obtain a Compare_xy_2 functor object. */ Compare_xy_2 compare_xy_2_object() const { return Compare_xy_2(*this); } - /*! A functor that obtain the lexicographically left endpoint of an + /*! A functor that obtain the lexicographically smallest endpoint of an * \f$x\f$-monotone curve. */ class Construct_min_vertex_2 { @@ -531,25 +539,25 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Obtain the left endpoint of the x-monotone polycurve. The return type - * is the same as the return type of the corresponding operator in the + /*! Obtain the left endpoint of the \f$x\f$-monotone polycurve. The return + * type is the same as the return type of the corresponding operator in the * functor of the subtraits, which is either by value or by reference. - * \param cv The polycurve curve. - * \return The left lexicographically endpoint. + * \param xcv the polycurve curve. + * \return the lexicographically smallest endpoint. */ using Subcurve_ctr = typename Subcurve_traits_2::Construct_min_vertex_2; decltype(std::declval(). operator()(std::declval())) - operator()(const X_monotone_curve_2& cv) const { - CGAL_assertion(cv.number_of_subcurves() > 0); + operator()(const X_monotone_curve_2& xcv) const { + CGAL_assertion(xcv.number_of_subcurves() > 0); const auto* geom_traits = m_poly_traits.subcurve_traits_2(); - if (geom_traits->compare_endpoints_xy_2_object()(cv[0]) == SMALLER) - return geom_traits->construct_min_vertex_2_object()(cv[0]); + if (geom_traits->compare_endpoints_xy_2_object()(xcv[0]) == SMALLER) + return geom_traits->construct_min_vertex_2_object()(xcv[0]); else return geom_traits-> - construct_min_vertex_2_object()(cv[cv.number_of_subcurves()-1]); + construct_min_vertex_2_object()(xcv[xcv.number_of_subcurves()-1]); } }; @@ -557,7 +565,7 @@ class Arr_polycurve_basic_traits_2 { Construct_min_vertex_2 construct_min_vertex_2_object() const { return Construct_min_vertex_2(*this); } - /*! A functor that obtain the lexicographically right endpoint of an + /*! A functor that obtain the lexicographically largest endpoint of an * \f$x\f$-monotone curve. */ class Construct_max_vertex_2 { @@ -576,11 +584,11 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Obtain the right endpoint of the x-monotone polycurve. The return type - * is the same as the return type of the corresponding operator in the + /*! Obtain the right endpoint of the \f$x\f$-monotone polycurve. The return + * type is the same as the return type of the corresponding operator in the * functor of the subtraits, which is either by value or by reference. - * \param cv The polycurve. - * \return The right lexicographically endpoint. + * \param xcv the polycurve. + * \return the lexicographically largest endpoint. */ using Subcurve_ctr = typename Subcurve_traits_2::Construct_max_vertex_2; decltype(std::declval(). @@ -616,14 +624,15 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Check whether the given x-monotone curve is a vertical segment. - * \param cv The curve. - * \return (true) if the curve is a vertical segment;(false) otherwise. + /*! Check whether the given \f$x\f$-monotone curve is a vertical segment. + * \param cv the curve. + * \return `true` if the curve is a vertical segment; `false` otherwise. */ bool operator()(const X_monotone_curve_2& cv) const { - // An x-monotone polycurve can represent a vertical segment only if it - // comprises vertical segments. If the first subcurve is vertical, - // all subcurves are vertical in an x-monotone polycurve + /* An \f$x\f$-monotone polycurve can represent a vertical segment only if + * it comprises vertical segments. If the first subcurve is vertical, + * all subcurves are vertical in an \f$x\f$-monotone polycurve + */ return m_poly_traits.subcurve_traits_2()->is_vertical_2_object()(cv[0]); } }; @@ -764,12 +773,13 @@ class Arr_polycurve_basic_traits_2 { public: /*! Obtain the location of the given point with respect to the input curve. - * \param p The point. - * \param xcv The polycurve curve. - * \pre p is in the x-range of cv. - * \return SMALLER if y(p) < cv(x(p)), i.e. the point is below the curve; - * LARGER if y(p) > cv(x(p)), i.e. the point is above the curve; - * EQUAL if p lies on the curve. + * \param p the point. + * \param xcv the polycurve curve. + * \pre `p` is in the \f$x\f$-range of `xcv`. + * \return + * `SMALLER` if \f$y\f$(p) < cv(x(p)), i.e. the point is below the curve; + * `LARGER` if \f$y\f$(p) > cv(x(p)), i.e. the point is above the curve; + * `EQUAL` if `p` lies on the curve. */ Comparison_result operator()(const Point_2& p, const X_monotone_curve_2& xcv) const @@ -778,16 +788,16 @@ class Arr_polycurve_basic_traits_2 { /*! Obtain the location of the given curve_end with respect to the input * curve. * \param xcv The polycurve curve. - * \param ce the curve-end indicator of the x-monotone subcurve xl: - * ARR_MIN_END - the minimal end of xl or - * ARR_MAX_END - the maximal end of xl. + * \param ce the curve-end indicator of the \f$x\f$-monotone subcurve xl: + * `ARR_MIN_END` - the minimal end of xl or + * `ARR_MAX_END` - the maximal end of xl. * \param xcv The polycurve curve. - * \pre the curve-end is in the x-range of xcv. - * \return SMALLER if if y(xs, ce) < cv(x(xs, ce)), i.e. the curve-end - * is below the curve xcv; - * LARGER if y(xs, ce) > cv(x(xs, ce)), i.e. the curve-end is - * above the curve xcv; - * EQUAL if the curve-end lies on the curve xcv. + * \pre the curve-end is in the \f$x\f$-range of `xcv`. + * \return `SMALLER` if if \f$y\f$(xs, ce) < cv(x(xs, ce)), i.e. the + * curve-end is below the curve xcv; + * `LARGER` if \f$y\f$(xs, ce) > cv(x(xs, ce)), i.e. the curve-end + * is above the curve `xcv`; + * `EQUAL` if the curve-end lies on the curve `xcv`. */ Comparison_result operator()(const X_monotone_subcurve_2& xs1, Arr_curve_end ce1, @@ -818,15 +828,15 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Compare the y value of two x-monotone curves immediately to the left - * of their intersection point. - * \param cv1 The first polycurve curve. - * \param cv2 The second polycurve curve. - * \param p The intersection point. - * \pre The point p lies on both curves, and both of them must be also be - * defined(lexicographically) to its left. - * \return The relative position of cv1 with respect to cv2 immdiately to - * the left of p: SMALLER, LARGER or EQUAL. + /*! Compare the y value of two \f$x\f$-monotone curves immediately to the + * left of their intersection point. + * \param cv1 the first polycurve curve. + * \param cv2 the second polycurve curve. + * \param p the intersection point. + * \pre the point `p` lies on both curves, and both of them must be also be + * defined (lexicographically) to its left. + * \return the relative position of `cv1` with respect to `cv2` immdiately + * to the left of `p`: `SMALLER`, `LARGER`, or `EQUAL`. */ Comparison_result operator()(const X_monotone_curve_2& cv1, const X_monotone_curve_2& cv2, @@ -868,15 +878,15 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Compare the y value of two x-monotone curves immediately to the right - * of their intersection point. - * \param cv1 The first curve. - * \param cv2 The second curve. - * \param p The intersection point. - * \pre The point p lies on both curves, and both of them must be also be - * defined(lexicographically) to its right. - * \return The relative position of cv1 with respect to cv2 immdiately to - * the right of p: SMALLER, LARGER or EQUAL. + /*! Compare the \f$y\f$-value of two \f$x\f$-monotone curves immediately to + * the right of their intersection point. + * \param cv1 the first curve. + * \param cv2 the second curve. + * \param p the intersection point. + * \pre the point `p` lies on both curves, and both of them must be also be + * defined (lexicographically) to its right. + * \return the relative position of `cv1` with respect to `cv2` immdiately + * to the right of `p`: `SMALLER`, `LARGER`, or `EQUAL`. */ Comparison_result operator()(const X_monotone_curve_2& cv1, const X_monotone_curve_2& cv2, @@ -918,18 +928,18 @@ class Arr_polycurve_basic_traits_2 { public: /*! Check whether the two points are the same. - * \param p1 The first point. - * \param p2 The second point. - * \return (true) if the two point are the same;(false) otherwise. + * \param p1 the first point. + * \param p2 the second point. + * \return `true` if the two point are the same; `false` otherwise. */ bool operator()(const Point_2& p1, const Point_2& p2) const { return m_poly_traits.subcurve_traits_2()->equal_2_object()(p1, p2); } - /*! Check whether the two x-monotone curves are the same (have the same - * graph). - * \param cv1 The first curve. - * \param cv2 The second curve. - * \return(true) if the two curves are the same;(false) otherwise. + /*! Check whether the two \f$x\f$-monotone curves are the same (have the + * same graph). + * \param cv1 the first curve. + * \param cv2 the second curve. + * \return `true` if the two curves are the same; `false` otherwise. */ bool operator()(const X_monotone_curve_2& cv1, const X_monotone_curve_2& cv2) const { @@ -1024,9 +1034,9 @@ class Arr_polycurve_basic_traits_2 { public: /*! Compare the endpoints of an \(x\)-monotone curve lexicographically. * (assuming the curve has a designated source and target points). - * \param cv The curve. - * \return SMALLER if the curve is oriented left-to-right; - * LARGER if the curve is oriented right-to-left. + * \param cv the curve. + * \return `SMALLER` if `cv` is oriented left-to-right; + * `LARGER` if `cv` is oriented right-to-left. */ Comparison_result operator()(const X_monotone_curve_2& xcv) const { const auto* geom_traits = m_poly_traits.subcurve_traits_2(); @@ -1062,13 +1072,13 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Construct the reversed \(x\)-monotone polycurve of the input. + /*! Construct the reversed \f$x\f$-monotone polycurve of the input. * Note that the functor constructs the opposites of _all_ subcurves - * constituting xcv. - * \param xcv the \(x\)-monotone polycurve to be reveres + * constituting `xcv`. + * \param xcv the \f$x\f$-monotone polycurve to be reveres * \pre xcv contains at least one subcurve - * \return An \(x\)-monotone polycurve with the same graph as the input xcv - * only with a reverse orientation. + * \return an \f$x\f$-monotone polycurve with the same graph as the input + * `xcv` only with a reverse orientation. */ X_monotone_curve_2 operator()(const X_monotone_curve_2& xcv) const { const auto* geom_traits = m_poly_traits.subcurve_traits_2(); @@ -1186,10 +1196,10 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Obtain an x-monotone polycurve that consists of one given subcurve. + /*! Obtain an \f$x\f$-monotone polycurve that consists of one given subcurve. * \param seg input subcurve. * \pre seg is not degenerated. - * \return An x-monotone polycurve with one subcurve. + * \return an \f$x\f$-monotone polycurve with one subcurve. */ X_monotone_curve_2 operator()(const X_monotone_subcurve_2& seg) const { CGAL_precondition_code @@ -1217,9 +1227,10 @@ class Arr_polycurve_basic_traits_2 { return X_monotone_curve_2(seg); } - /*! Construct an x-monotone polycurve which is well-oriented from a range of - * elements. - * \pre Range should from a continuous well-oriented x-monotone polycurve. + /*! Construct an \f$x\f$-monotone polycurve, which is well-oriented, from a + * range of elements. + * \pre the elements in the range should form a continuous well-oriented + * \f$x\f$-monotone polycurve. */ template X_monotone_curve_2 operator()(ForwardIterator begin, @@ -1231,14 +1242,14 @@ class Arr_polycurve_basic_traits_2 { return constructor_impl(begin, end, Is_point()); } - /*! Construct an x-monotone polycurve from a range of points. + /*! Construct an \f$x\f$-monotone polycurve from a range of points. * The polycurve may be oriented left-to-right or right-to-left - * depending on the lexicographical order of the points in the - * input. - * \pre Range contains at least two points. - * \pre No two consecutive points are the same. - * \pre The points form an continuous well-oriented x-monotone polycurve. - * \post By the construction the returned polycurve is well-oriented. + * depending on the lexicographical order of the points in the input. + * \pre range contains at least two points. + * \pre no two consecutive points are the same. + * \pre the points form an continuous well-oriented \f$x\f$-monotone + * polycurve. + * \post by the construction the returned polycurve is well-oriented. */ template X_monotone_curve_2 constructor_impl(ForwardIterator /* begin */, @@ -1246,18 +1257,18 @@ class Arr_polycurve_basic_traits_2 { std::true_type) const { CGAL_error_msg("Cannot construct a polycurve from a range of points!"); } - /*! Obtain an x-monotone polycurve from a range of subcurves. + /*! Obtain an \f$x\f$-monotone polycurve from a range of subcurves. * \param begin An iterator pointing to the first subcurve in the range. * \param end An iterator pointing to the past-the-end subcurve * in the range. - * \pre The range contains at least one subcurve. - * \pre Subcurves correspond to a well-oriented polycurve. That + * \pre the range contains at least one subcurve. + * \pre subcurves correspond to a well-oriented polycurve. That * is, the target of the i-th subcurve is an source of the * (i+1)th subcurve. - * \pre The sequence of subcurves in the range forms a weak x-monotone + * \pre the sequence of subcurves in the range forms a weak \f$x\f$-monotone * polycurve. - * \pre The container should support bidirectional iteration. - * \return A continuous, well-oriented x-monotone polycurve which + * \pre the container should support bidirectional iteration. + * \return a continuous, well-oriented \f$x\f$-monotone polycurve ,which * is directed either left-to-right or right-to-left * depending on the subcurves in the input. */ @@ -1349,7 +1360,7 @@ class Arr_polycurve_basic_traits_2 { //@{ /*! A function object that obtains the parameter space of a geometric - * entity along the x-axis + * entity along the \f$x\f$-axis */ class Parameter_space_in_x_2 { protected: @@ -1367,23 +1378,23 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Obtains the parameter space at the end of a curve along the x-axis . - * Note that if the curve-end coincides with a pole, then unless the curve - * coincides with the identification curve, the curve-end is considered to - * be approaching the boundary, but not on the boundary. + /*! Obtains the parameter space at the end of a curve along the + * \f$x\f$-axis. Note that if the curve-end coincides with a pole, then + * unless the curve coincides with the identification curve, the curve-end + * is considered to be approaching the boundary, but not on the boundary. * If the curve coincides with the identification curve, it is assumed to * be smaller than any other object. * \param xcv the curve * \param ce the curve-end indicator: - * ARR_MIN_END - the minimal end of xc or - * ARR_MAX_END - the maximal end of xc + * `ARR_MIN_END` - the minimal end of `xcv` or + * `ARR_MAX_END` - the maximal end of `xcv` * \return the parameter space at the ce end of the curve xcv. - * ARR_LEFT_BOUNDARY - the curve approaches the identification curve - * from the right at the curve left end. - * ARR_INTERIOR - the curve does not approache the identification - * curve. - * ARR_RIGHT_BOUNDARY - the curve approaches the identification curve - * from the left at the curve right end. + * `ARR_LEFT_BOUNDARY` - the curve approaches the identification curve + * from the right at the curve left end. + * `ARR_INTERIOR` - the curve does not approache the identification + * curve. + * `ARR_RIGHT_BOUNDARY` - the curve approaches the identification curve + * from the left at the curve right end. * \pre xcv does not coincide with the vertical identification curve. */ Arr_parameter_space operator()(const X_monotone_curve_2& xcv, @@ -1398,10 +1409,10 @@ class Arr_polycurve_basic_traits_2 { return geom_traits->parameter_space_in_x_2_object()(xs, ce); } - /*! Obtains the parameter space at a point along the x-axis. + /*! Obtains the parameter space at a point along the \f$x\f$-axis. * \param p the point. - * \return the parameter space at p. - * \pre p does not lie on the vertical identification curve. + * \return the parameter space at `p`. + * \pre `p` does not lie on the vertical identification curve. */ Arr_parameter_space operator()(const Point_2 p) const { const auto* geom_traits = m_poly_traits.subcurve_traits_2(); @@ -1414,7 +1425,7 @@ class Arr_polycurve_basic_traits_2 { { return Parameter_space_in_x_2(*this); } /*! A function object that obtains the parameter space of a geometric - * entity along the y-axis + * entity along the \f$y\f$-axis */ class Parameter_space_in_y_2 { protected: @@ -1432,23 +1443,23 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Obtains the parameter space at the end of an curve along the y-axis . - * Note that if the curve-end coincides with a pole, then unless the curve - * coincides with the identification curve, the curve-end is considered to - * be approaching the boundary, but not on the boundary. + /*! Obtains the parameter space at the end of an curve along the + * \f$y\f$-axis. Note that if the curve-end coincides with a pole, then + * unless the curve coincides with the identification curve, the curve-end + * is considered to be approaching the boundary, but not on the boundary. * If the curve coincides with the identification curve, it is assumed to * be smaller than any other object. * \param xcv the curve * \param ce the curve-end indicator: - * ARR_MIN_END - the minimal end of xcv or - * ARR_MAX_END - the maximal end of xcv + * `ARR_MIN_END` - the minimal end of `xcv` or + * `ARR_MAX_END` - the maximal end of `xcv` * \return the parameter space at the ce end of the curve xcv. - * ARR_BOTTOM_BOUNDARY - the curve approaches the south pole at the - * curve left end. - * ARR_INTERIOR - the curve does not approache a contraction - * point. - * ARR_TOP_BOUNDARY - the curve approaches the north pole at the - * curve right end. + * `ARR_BOTTOM_BOUNDARY` - the curve approaches the south pole at the + * curve left end. + * `ARR_INTERIOR` - the curve does not approache a contraction + * point. + * `ARR_TOP_BOUNDARY` - the curve approaches the north pole at the + * curve right end. * There are no horizontal identification curves! */ Arr_parameter_space operator()(const X_monotone_curve_2& xcv, @@ -1463,9 +1474,9 @@ class Arr_polycurve_basic_traits_2 { return geom_traits->parameter_space_in_y_2_object()(xs, ce); } - /*! Obtains the parameter space at a point along the y-axis. + /*! Obtains the parameter space at a point along the \f$y\f$-axis. * \param p the point. - * \return the parameter space at p. + * \return the parameter space at `p`. * \pre p does not lie on the horizontal identification curve. * There are no horizontal identification curves! */ @@ -1479,8 +1490,8 @@ class Arr_polycurve_basic_traits_2 { Parameter_space_in_y_2 parameter_space_in_y_2_object() const { return Parameter_space_in_y_2(*this); } - /*! A functor that compares the x-coordinate of curve-ends and points on the - * boundary of the parameter space. + /*! A functor that compares the \f$x\f$-coordinate of curve-ends and points on + * the boundary of the parameter space. */ class Compare_x_on_boundary_2 { protected: @@ -1498,46 +1509,46 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Compare the x-coordinates of a point with the x-coordinate of an - * x-curve-end on the boundary. + /*! Compare the \f$x\f$-coordinates of a point with the \f$x\f$-coordinate + * of an \f$x\f$-curve-end on the boundary. * \param point the point. - * \param xcv the x-curve, the endpoint of which is compared. - * \param ce the x-curve-end indicator: - * ARR_MIN_END - the minimal end of xcv or - * ARR_MAX_END - the maximal end of xcv. + * \param xcv the \f$x\f$-monotone curve, the endpoint of which is compared. + * \param ce the \f$x\f$-monotone curve-end indicator: + * `ARR_MIN_END` - the minimal end of xcv or + * `ARR_MAX_END` - the maximal end of xcv. * \return the comparison result: - * SMALLER - x(p) < x(xcv, ce); - * EQUAL - x(p) = x(xcv, ce); - * LARGER - x(p) > x(xcv, ce). - * \pre p lies in the interior of the parameter space. - * \pre the ce end of the x-curve xcv lies on the top boundary. - * \pre xcv does not coincide with the vertical identification curve. + * `SMALLER` - \f$x\f$(`p`) < \f$x\f$(`xcv`, `ce`); + * `EQUAL` - \f$x\f$(`p`) = \f$x\f$(`xcv`, `ce`); + * `LARGER` - \f$x\f$(`p`) > \f$x\f$(`xcv`, `ce`). + * \pre `p` lies in the interior of the parameter space. + * \pre the `ce` end of `xcv` lies on the top boundary. + * \pre `xcv` does not coincide with the vertical identification curve. */ Comparison_result operator()(const Point_2& point, const X_monotone_curve_2& xcv, Arr_curve_end ce) const { return operator()(point, xcv, ce, Bottom_or_top_sides_category()); } - /*! Compare the x-coordinates of 2 curve-ends on the boundary of the + /*! Compare the \f$x\f$-coordinates of 2 curve-ends on the boundary of the * parameter space. * \param xcv1 the first curve. * \param ce1 the first curve-end indicator: - * ARR_MIN_END - the minimal end of xcv1 or - * ARR_MAX_END - the maximal end of xcv1. + * `ARR_MIN_END` - the minimal end of `xcv1` or + * `ARR_MAX_END` - the maximal end of `xcv1`. * \param xcv2 the second curve. * \param ce2 the second curve-end indicator: - * ARR_MIN_END - the minimal end of xcv2 or - * ARR_MAX_END - the maximal end of xcv2. + * `ARR_MIN_END` - the minimal end of `xcv2` or + * `ARR_MAX_END` - the maximal end of `xcv2`. * \return the second comparison result: - * SMALLER - x(xcv1, ce1) < x(xcv2, ce2); - * EQUAL - x(xcv1, ce1) = x(xcv2, ce2); - * LARGER - x(xcv1, ce1) > x(xcv2, ce2). - * \pre the ce1 end of the curve xcv1 lies on a pole (implying ce1 is + * `SMALLER` - \f$\f$x(`xcv1`, `ce1`) < \f$x\f$(`xcv2`, `ce2`); + * `EQUAL` - \f$x\f$(`xcv1`, `ce1`) = \f$x\f$(`xcv2`, `ce2`); + * `LARGER` - \f$x\f$(`xcv1`, `ce1`) > \f$x\f$(`xcv2`, `ce2`). + * \pre the `ce1` end of `xcv1` lies on a pole (implying `xcv1` is * vertical). - * \pre the ce2 end of the curve xcv2 lies on a pole (implying ce2 is + * \pre the `ce2` end of `xcv2` lies on a pole (implying `xcv2` is * vertical). - * \pre xcv1 does not coincide with the vertical identification curve. - * \pre xcv2 does not coincide with the vertical identification curve. + * \pre `xcv1` does not coincide with the vertical identification curve. + * \pre `xcv2` does not coincide with the vertical identification curve. */ Comparison_result operator()(const X_monotone_curve_2& xcv1, Arr_curve_end ce1, @@ -1546,8 +1557,8 @@ class Arr_polycurve_basic_traits_2 { { return operator()(xcv1, ce1, xcv2, ce2, Bottom_or_top_sides_category()); } private: - /*! \brief compares the x-coordinates of a point with the x-coordinate of - * an x-curve-end on the boundary. + /*! \brief compares the \f$x\f$-coordinates of a point with the + * \f$x\f$-coordinate of an \f$x\f$-monotone curve-end on the boundary. */ Comparison_result operator()(const Point_2& point, const X_monotone_curve_2& xcv, @@ -1563,8 +1574,8 @@ class Arr_polycurve_basic_traits_2 { return geom_traits->compare_x_on_boundary_2_object()(point, xs, ce); } - /*! \brief compares the x-coordinates of 2 curve-ends on the boundary of - * the parameter space. + /*! \brief compares the \f$x\f$-coordinates of 2 curve-ends on the boundary + * of the parameter space. */ Comparison_result operator()(const X_monotone_curve_2& xcv1, Arr_curve_end ce1, @@ -1587,24 +1598,16 @@ class Arr_polycurve_basic_traits_2 { } size_type get_curve_index(const X_monotone_curve_2& xcv, - const Arr_curve_end ce) const { - //waqar:: dont know why it is opposite in Parameter_space_in_x... - // I think this is because of the way the subcurves are stored in the - // curve_vector. - // I am assuming that min end depends upon the direction and not the - // x-value. - // and also that min end subcurve is always placed at position 0 of the - // vector. - // Confirm with Eric. - return (ce == ARR_MIN_END) ? 0 : xcv.number_of_subcurves() - 1; - } + const Arr_curve_end ce) const + { return (ce == ARR_MIN_END) ? 0 : xcv.number_of_subcurves() - 1; } - /*! Given a point p, an x-monotone curve C(t) = (X(t),Y(t)), + /*! Given a point \f$p\f$, an x-monotone curve \f$C(t) = (X(t),Y(t))\f$, * and an enumerator that specifies either the minimum end or the * maximum end of the curve, and thus maps to a parameter value - * d in {0,1}, compare x_p and limit{t => d} X(t). - * If the parameter space is unbounded, a precondition ensures that C has - * a vertical asymptote at its d-end; that is limit{t => d} X(t) is finite. + * \f$d \in \{0,1\}\f$, compare x_p and limit{t => d} X(t). + * If the parameter space is unbounded, a precondition ensures that \f$C\f$ + * has a vertical asymptote at its \f$d\f$-end; that is + * limit{t => d} X(t) is finite. */ Comparison_result operator()(const Point_2& p, const X_monotone_curve_2& xcv, @@ -1617,14 +1620,15 @@ class Arr_polycurve_basic_traits_2 { return cmp_x_on_boundary(p, xcv[index], ce); } - /*! Given two x-monotone curves C1(t) = (X1(t),Y1(t)) and - * C2(t) = (X2(t),Y2(t)) and two enumerators that specify either the - * minimum ends or the maximum ends of the curves, and thus map to - * parameter values d1 in {0,1} and d2 in {0,1} for C1 and for C2, - * respectively, compare limit{t => d1} X1(t) and limit{t => d2} X2(t). + /*! Given two \f$x\f$-monotone curves \f$C_1(t) = (X_1(t),Y_1(t))\f$ and + * \f$C2_(t) = (X_2(t),Y_2(t))\f$ and two enumerators that specify either + * the minimum ends or the maximum ends of the curves, and thus map to + * parameter values \f$d_1 \in \{0,1\}\f$ and \f$d_2 \in \{0,1\}\f$ for + * \f$C_1\f$ and for \f$C_2\f$, respectively, compare + * limit{t => d1} X1(t) and limit{t => d2} X2(t). * If the parameter space is unbounded, a precondition ensures that - * C1 and C2 have vertical asymptotes at their respective ends; - * that is, limit{t => d1} X1(t) and limit{t =? d2} X2(t) are finite. + * \f$C_1\f$ and \f$C_2\f$ have vertical asymptotes at their respective + * ends; that is, limit{t => d1} X1(t) and limit{t =? d2} X2(t) are finite. */ Comparison_result operator()(const X_monotone_curve_2& xcv1, Arr_curve_end ce1/* for xcv1 */, @@ -1653,7 +1657,7 @@ class Arr_polycurve_basic_traits_2 { Compare_x_on_boundary_2 compare_x_on_boundary_2_object() const { return Compare_x_on_boundary_2(*this); } - /*! A functor that compares the \f$x-\f$coordinates of curve ends near the + /*! A functor that compares the \f$x\f$-coordinates of curve ends near the * boundary of the parameter space. */ class Compare_x_near_boundary_2 { @@ -1672,18 +1676,8 @@ class Arr_polycurve_basic_traits_2 { public: size_type get_curve_index(const X_monotone_curve_2& xcv, - const Arr_curve_end ce) const { - //waqar:: dont know why it is opposite in Parameter_space_in_x... - // I think this is because of the way the subcurves are stored in the - // curve_vector. - // I am assuming that min end depends upon the direction and not the - // x-value. - // and also that min end subcurve is always placed at position 0 of the - // vector. - // Confirm with Eric. - size_type index = (ce == ARR_MIN_END) ? 0 : xcv.number_of_subcurves() - 1; - return index; - } + const Arr_curve_end ce) const + { return (ce == ARR_MIN_END) ? 0 : xcv.number_of_subcurves() - 1; } Comparison_result operator()(const X_monotone_curve_2 xcv1, const X_monotone_curve_2 xcv2, @@ -1700,7 +1694,7 @@ class Arr_polycurve_basic_traits_2 { Compare_x_near_boundary_2 compare_x_near_boundary_2_object() const { return Compare_x_near_boundary_2(*this); } - /*! A functor that compares the y-coordinate of two given points + /*! A functor that compares the \f$y\f$-coordinate of two given points * that lie on the vertical identification curve. */ class Compare_y_on_boundary_2 { @@ -1719,15 +1713,15 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Compare the y-coordinate of two given points that lie on the vertical - * identification curve. + /*! Compare the \f$y\f$-coordinate of two given points that lie on the + * vertical identification curve. * \param p1 the first point. * \param p2 the second point. - * \return SMALLER - p1 is lexicographically smaller than p2; - * EQUAL - p1 and p2 coincides; - * LARGER - p1 is lexicographically larger than p2; - * \pre p1 lies on the vertical identification curve. - * \pre p2 lies on the vertical identification curve. + * \return `SMALLER` - `p1` is lexicographically smaller than `p2`; + * `EQUAL` - `p1` and `p2` coincides; + * `LARGER` - `p1` is lexicographically larger than `p2`; + * \pre `p1` lies on the vertical identification curve. + * \pre `p2` lies on the vertical identification curve. */ Comparison_result operator()(const Point_2& p1, const Point_2& p2) const { const auto* geom_traits = m_poly_traits.subcurve_traits_2(); @@ -1739,7 +1733,7 @@ class Arr_polycurve_basic_traits_2 { Compare_y_on_boundary_2 compare_y_on_boundary_2_object() const { return Compare_y_on_boundary_2(*this); } - /*! A functor that compares the y-coordinates of curve-ends near the + /*! A functor that compares the \f$y\f$-coordinates of curve-ends near the * boundary of the parameter space. */ class Compare_y_near_boundary_2 { @@ -1758,15 +1752,15 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Compare the y-coordinates of 2 curves at their ends near the boundary - * of the parameter space. + /*! Compare the \f$y\f$-coordinates of 2 curves at their ends near the + * boundary of the parameter space. * \param xcv1 the first curve. * \param xcv2 the second curve. * \param ce the curve-end indicator: - * ARR_MIN_END - the minimal end or - * ARR_MAX_END - the maximal end + * `ARR_MIN_END` - the minimal end or + * `ARR_MAX_END` - the maximal end * \return the second comparison result. - * \pre the ce ends of the curves xcv1 and xcv2 lie either on the left + * \pre the `ce` ends of the curves `xcv1` and `xcv2` lie either on the left * boundary or on the right boundary of the parameter space (implying * that they cannot be vertical). * There is no horizontal identification curve! @@ -1815,16 +1809,17 @@ class Arr_polycurve_basic_traits_2 { public: /*! Determine whether a point lies in the vertical boundary. * \param p the point. - * \return a Boolean indicating whether p lies in the vertical boundary. + * \return a Boolean indicating whether `p` lies in the vertical boundary. */ bool operator()(const Point_2& p) const { const auto* geom_traits = m_poly_traits.subcurve_traits_2(); return geom_traits->is_on_y_identification_2_object()(p); } - /*! Determine whether an x-monotone curve lies in the vertical boundary. - * \param xcv the x-monotone curve. - * \return a Boolean indicating whether xcv lies in the vertical boundary. + /*! Determine whether an \f$x\f$-monotone curve lies in the vertical + * boundary. + * \param xcv the \f$x\f$-monotone curve. + * \return a Boolean indicating whether `xcv` lies in the vertical boundary. */ bool operator()(const X_monotone_curve_2& xcv) const { const auto* geom_traits = m_poly_traits.subcurve_traits_2(); @@ -1859,16 +1854,17 @@ class Arr_polycurve_basic_traits_2 { public: /*! Determine whether a point lies in the vertical boundary. * \param p the point. - * \return a Boolean indicating whether p lies in the vertical boundary. + * \return a Boolean indicating whether `p` lies in the vertical boundary. */ bool operator()(const Point_2& p) const { const auto* geom_traits = m_poly_traits.subcurve_traits_2(); return geom_traits->is_on_x_identification_2_object()(p); } - /*! Determine whether an x-monotone curve lies in the vertical boundary. - * \param xcv the x-monotone curve. - * \return a Boolean indicating whether xcv lies in the vertical boundary. + /*! Determine whether an \f$x\f$-monotone curve lies in the vertical + * boundary. + * \param `xcv` the \f$x\f$-monotone curve. + * \return a Boolean indicating whether `xcv` lies in the vertical boundary. */ bool operator()(const X_monotone_curve_2& xcv) const { const auto* geom_traits = m_poly_traits.subcurve_traits_2(); @@ -1920,7 +1916,7 @@ class Arr_polycurve_basic_traits_2 { {} public: - /*! Append a subcurve to an existing x-monotone polycurve at the back. + /*! Append a subcurve to an existing \f$x\f$-monotone polycurve at the back. */ void operator()(X_monotone_curve_2& xcv, const X_monotone_subcurve_2& seg) const @@ -2251,12 +2247,12 @@ class Arr_polycurve_basic_traits_2 { Trim_2(const Polycurve_basic_traits_2& traits) : m_poly_traits(traits) {} public: - /*! \brief returns a trimmed version of the polycurve with src and tgt as - * end points. + /*! \brief returns a trimmed version of the polycurve with `source` and + * `target` as end points. */ X_monotone_curve_2 operator()(const X_monotone_curve_2& xcv, const Point_2& source, - const Point_2& target)const + const Point_2& target) const { const auto* geom_traits = m_poly_traits.subcurve_traits_2(); auto min_vertex = geom_traits->construct_min_vertex_2_object(); @@ -2309,15 +2305,15 @@ class Arr_polycurve_basic_traits_2 { auto trg_min_vertex = min_vertex(xcv[trg_id]); auto trg_max_vertex = max_vertex(xcv[trg_id]); - //push the trimmed version of the source subcurve. - // if(sorientation == SMALLER && source != src_max_vertex) + // Push the trimmed version of the source subcurve. + // if (sorientation == SMALLER && source != src_max_vertex) if ((orientation == SMALLER) && ! geom_traits->equal_2_object()(src, src_max_vertex)) { if (src_id != trg_id) trimmed_subcurves.push_back(trim(xcv[src_id], src, src_max_vertex)); else trimmed_subcurves.push_back(trim(xcv[src_id], src, trg)); } - //else if(orientation == LARGER && source != src_min_vertex) + // else if(orientation == LARGER && source != src_min_vertex) else if ((orientation == LARGER) && ! geom_traits->equal_2_object()(src, src_min_vertex)) { if (src_id != trg_id) @@ -2325,18 +2321,18 @@ class Arr_polycurve_basic_traits_2 { else trimmed_subcurves.push_back(trim(xcv[src_id], src, trg)); } - //push the middle subcurves as they are. + // Push the middle subcurves as they are. for (size_t i = src_id+1; i < trg_id; ++i) trimmed_subcurves.push_back(xcv[i]); - //push the appropriately trimmed target subcurve. + // Push the appropriately trimmed target subcurve. if (src_id != trg_id) { - //if(orientation == SMALLER && target != trg_min_vertex) + // if (orientation == SMALLER && target != trg_min_vertex) if ((orientation == SMALLER) && ! geom_traits->equal_2_object()(trg, trg_min_vertex)) trimmed_subcurves.push_back(trim(xcv[trg_id], trg_min_vertex, trg)); - //else if (orientation == LARGER && target != trg_max_vertex) + // else if (orientation == LARGER && target != trg_max_vertex) else if ((orientation == LARGER) && ! geom_traits->equal_2_object()(trg, trg_max_vertex)) trimmed_subcurves.push_back(trim(xcv[trg_id], trg_max_vertex, trg)); @@ -2357,14 +2353,16 @@ class Arr_polycurve_basic_traits_2 { * Roadmap: locate() should return an iterator to the located subcurve */ - /*! Obtain the index of the subcurve in the polycurve that contains the - * point q in its x-range. The function performs a binary search, so if the - * point q is in the x-range of the polycurve with n subcurves, the subcurve - * containing it can be located in \cgalBigO{log n} operations. - * \param cv The polycurve curve. - * \param q The point. - * \return An index i such that q is in the x-range of cv[i]. - * If q is not in the x-range of cv, returns INVALID_INDEX. + /*! Obtain the index of the subcurve in the polycurve that contains a point + * \f$q\f$ in its \f$x\f$-range. The function performs a binary search, so if + * the point \f$q\f$ is in the \f$x\f$-range of the polycurve with \f$n\f$ + * subcurves, the subcurve containing it can be located in \cgalBigO{log n} + * operations. + * \param cv the polycurve curve. + * \param q the point. + * \return an index \f$i\f$ such that \f$q\f$ is in the \f$x\f$-range of + * `cv[i]`. If \f$q\f$ is not in the \f$x\f$-range of `cv`, returns + * `INVALID_INDEX`. */ template std::size_t locate_gen(const X_monotone_curve_2& cv, Compare compare) const { @@ -2501,9 +2499,9 @@ class Arr_polycurve_basic_traits_2 { * of a curve. * This implementation is used in the case where at least one side of the * parameter space is not oblivious. - * \param xcv (in) the given polycurve. - * \param xs (in) the given curve. - * \param cd (in) the curve-end indicator. + * \param(in) xcv the given polycurve. + * \param(in) xs the given curve. + * \param(in) ce the curve-end indicator. */ std::size_t locate_impl(const X_monotone_curve_2& xcv, const X_monotone_subcurve_2& xs, @@ -2547,8 +2545,8 @@ class Arr_polycurve_basic_traits_2 { * of a curve. * This implementation is used in the case where at least one side of the * parameter space is not oblivious. - * \param xcv (in) the given polycurve. - * \param p (in) the endpoint of a curve. + * \param(in) xcv the given polycurve. + * \param(in) p the endpoint of a curve. */ std::size_t locate_impl(const X_monotone_curve_2& xcv, const Point_2& p, @@ -2572,8 +2570,8 @@ class Arr_polycurve_basic_traits_2 { * of a curve. * This implementation is used in the case where all sides of the parameter * space is oblivious. - * \param xcv (in) the given polycurve. - * \param p (in) the endpoint of a curve. + * \param(in) xcv the given polycurve. + * \param(in) p the endpoint of a curve. */ std::size_t locate_impl(const X_monotone_curve_2& xcv, const Point_2& p, Arr_all_sides_oblivious_tag) const @@ -2599,13 +2597,13 @@ class Arr_polycurve_basic_traits_2 { } /*! Find the index of the subcurve in the polycurve that is defined to the - * left(or to the right) of the point q. - * \param cv The polycurve curve. - * \param q The point. - * \param to_right(true) if we wish to locate a subcurve to the right of q, - * (false) if we wish to locate a subcurve to its right. - * \return An index i such that subcurves[i] is defined to the left(or to the - * right) of q, or INVALID_INDEX if no such subcurve exists. + * left (or to the right) of the point `q`. + * \param cv the polycurve curve. + * \param q the point. + * \param to_right `true` if we wish to locate a subcurve to the right of q, + * `false` if we wish to locate a subcurve to its right. + * \return an index \f$i\f$ such that subcurves[i] is defined to the left (or + * to the right) of `q`, or `INVALID_INDEX` if no such subcurve exists. */ std::size_t locate_side(const X_monotone_curve_2& cv, const Point_2& q, const bool& to_right) const { From 7c8d5a09cc5c1d41347104a1e4739d577e2d95d8 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 9 Sep 2024 14:51:30 +0200 Subject: [PATCH 166/348] Fix some Pylint warnings --- Testsuite/test/post_process_ctest_results.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index 5de5471ff5eb..45ea579532bc 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -57,6 +57,7 @@ def mark_package_as_missing_requirements(global_report_file_name, name): print(f"Error opening global report file {global_report_file_name}: {e}") def handle_end_of_package(package_name, report_file_name, lines_to_write): + """Handle the end of a package by inserting the lines to write into the report file.""" if not lines_to_write: return @@ -79,6 +80,7 @@ def handle_end_of_package(package_name, report_file_name, lines_to_write): SCM_BRANCH_FILE_CONTENT = read_file_lines(f"{os.getcwd()}/../../../../../.scm-branch") def handle_new_package__is_ignored(name, report_file_name, cmake_logs): + """Handle new package creation or update logs if package already exists.""" if not os.path.isdir(name): os.mkdir(name) write_file_lines(f"{name}/{report_file_name}", SCM_BRANCH_FILE_CONTENT) @@ -101,6 +103,7 @@ def handle_new_package__is_ignored(name, report_file_name, cmake_logs): return False def retrieve_cmake_logs(file_path): + """Retrieve the CMake logs from a file and return them as a list.""" logging.debug("Opening file %s", file_path) contents = read_file_lines(file_path) @@ -117,6 +120,7 @@ def retrieve_cmake_logs(file_path): return cmake_logs def main(): + """Main function that processes the input report file and performs necessary operations.""" input_report_file_name = sys.argv[1] report_file_name = sys.argv[2] global_report_file_name = sys.argv[3] @@ -151,7 +155,9 @@ def main(): package_name = "" continue else: - is_ignored = handle_new_package__is_ignored(package_name, report_file_name, cmake_logs) + is_ignored = handle_new_package__is_ignored( + package_name, report_file_name, cmake_logs + ) logging.debug("Is package %s ignored? %s", package_name, is_ignored) if is_ignored: mark_package_as_missing_requirements(global_report_file_name, package_name) From d226b11a562e5108b8c5d26b607e5985bcb9a565 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Mon, 9 Sep 2024 15:57:51 +0300 Subject: [PATCH 167/348] Fixed bug in Compare_y_near_boundary --- .../include/CGAL/Arr_polycurve_basic_traits_2.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h index fc7b8064c564..027748fc9278 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h @@ -1772,13 +1772,13 @@ class Arr_polycurve_basic_traits_2 { auto cmp_endpt = geom_traits->compare_endpoints_xy_2_object(); Comparison_result direction1 = cmp_endpt(xcv1[0]); const X_monotone_subcurve_2& xs1 = - (((direction1 == SMALLER) && (ce == ARR_MAX_END)) || - ((direction1 == LARGER) && (ce == ARR_MIN_END))) ? + (((direction1 == SMALLER) && (ce == ARR_MIN_END)) || + ((direction1 == LARGER) && (ce == ARR_MAX_END))) ? xcv1[0] : xcv1[xcv1.number_of_subcurves()-1]; Comparison_result direction2 = cmp_endpt(xcv2[0]); const X_monotone_subcurve_2& xs2 = - (((direction2 == SMALLER) && (ce == ARR_MAX_END)) || - ((direction2 == LARGER) && (ce == ARR_MIN_END))) ? + (((direction2 == SMALLER) && (ce == ARR_MIN_END)) || + ((direction2 == LARGER) && (ce == ARR_MAX_END))) ? xcv2[0] : xcv2[xcv2.number_of_subcurves()-1]; return geom_traits->compare_y_near_boundary_2_object()(xs1, xs2, ce); } From 22e73c9eaa0fd747bcc391e15432f16df5a71fc9 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Mon, 9 Sep 2024 16:34:45 +0300 Subject: [PATCH 168/348] Fixed typos --- .../include/CGAL/Arr_counting_traits_2.h | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_counting_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_counting_traits_2.h index 4707748fff63..0b9c916a3f25 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_counting_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_counting_traits_2.h @@ -563,7 +563,7 @@ class Arr_counting_traits_2 : public Base_traits { */ class Is_on_x_identification_2 { private: - typename Base::Is_on_x_identificiation_2 m_object; + typename Base::Is_on_x_identification_2 m_object; size_t& m_counter1; size_t& m_counter2; @@ -571,17 +571,17 @@ class Arr_counting_traits_2 : public Base_traits { /*! Construct */ Is_on_x_identification_2(const Base* base, size_t& counter1, size_t& counter2) : - m_object(base->is_on_x_identificiation_2_object()), + m_object(base->is_on_x_identification_2_object()), m_counter1(counter1), m_counter2(counter2) {} /*! Operate */ - Arr_parameter_space operator()(const Point_2& p) const + bool operator()(const Point_2& p) const { ++m_counter1; return m_object(p); } /*! Operate */ - Arr_parameter_space operator()(const X_monotone_curve_2& xc) const + bool operator()(const X_monotone_curve_2& xc) const { ++m_counter2; return m_object(xc); } }; @@ -666,7 +666,7 @@ class Arr_counting_traits_2 : public Base_traits { */ class Is_on_y_identification_2 { private: - typename Base::Is_on_y_identificiation_2 m_object; + typename Base::Is_on_y_identification_2 m_object; size_t& m_counter1; size_t& m_counter2; @@ -674,18 +674,18 @@ class Arr_counting_traits_2 : public Base_traits { /*! Construct */ Is_on_y_identification_2(const Base* base, size_t& counter1, size_t& counter2) : - m_object(base->is_on_y_identificiation_2_object()), + m_object(base->is_on_y_identification_2_object()), m_counter1(counter1), m_counter2(counter2) {} /*! Operate */ - Arr_parameter_space operator()(const Point_2& p) const + bool operator()(const Point_2& p) const { ++m_counter1; return m_object(p); } /*! Operate */ - Arr_parameter_space operator()(const X_monotone_curve_2& xc) const + bool operator()(const X_monotone_curve_2& xc) const { ++m_counter2; return m_object(xc); } }; @@ -943,7 +943,7 @@ Out_stream& operator<<(Out_stream& os, << traits.count_parameter_space_in_x_point() << std::endl << "# of PARAMETER_SPACE_IN_X curve operation = " << traits.count_parameter_space_in_x_curve() << std::endl - << "# of IS_ON_X_IDENTIFICIATION point operation = " + << "# of IS_ON_X_IDENTIFICATION point operation = " << traits.count_is_on_x_identification_point() << std::endl << "# of IS_ON_X_IDENTIFICATION curve operation = " << traits.count_is_on_x_identification_curve() << std::endl @@ -958,7 +958,7 @@ Out_stream& operator<<(Out_stream& os, << traits.count_parameter_space_in_y_point() << std::endl << "# of PARAMETER_SPACE_IN_Y curve operation = " << traits.count_parameter_space_in_y_curve() << std::endl - << "# of IS_ON_Y_IDENTIFICIATION point operation = " + << "# of IS_ON_Y_IDENTIFICATION point operation = " << traits.count_is_on_y_identification_point() << std::endl << "# of IS_ON_Y_IDENTIFICATION curve operation = " << traits.count_is_on_y_identification_curve() << std::endl From cc2bec0a968072675a7894239324629683e24c48 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Mon, 9 Sep 2024 16:17:40 +0200 Subject: [PATCH 169/348] Prevent usage of LASlib with msvc 2017 --- .../Point_set_processing_3/CMakeLists.txt | 26 ++++++++++++------- .../demo/Polyhedron/Plugins/IO/CMakeLists.txt | 17 +++++++----- .../test/Stream_support/CMakeLists.txt | 9 +++++-- 3 files changed, 34 insertions(+), 18 deletions(-) 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 de0b1a236930..7b3ba89e14d5 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 @@ -67,17 +67,23 @@ foreach( target_link_libraries(${target} PRIVATE ${CGAL_libs}) endforeach() -find_package(LASLIB) -include(CGAL_LASLIB_support) -if(TARGET CGAL::LASLIB_support) - create_single_source_cgal_program("read_las_example.cpp") - create_single_source_cgal_program("write_las_example.cpp") - target_link_libraries(read_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support) - target_link_libraries(write_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support) + +#disable if MSVC 2017 +if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910) + find_package(LASLIB) + include(CGAL_LASLIB_support) + if (TARGET CGAL::LASLIB_support) + create_single_source_cgal_program("read_las_example.cpp") + create_single_source_cgal_program("write_las_example.cpp") + target_link_libraries(read_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support) + target_link_libraries(write_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support) + else() + message( + STATUS + "NOTICE : the LAS reader test requires LASlib and will not be compiled.") + endif() else() - message( - STATUS - "NOTICE : the LAS reader test requires LASlib and will not be compiled.") + message(STATUS "NOTICE : the LAS reader does not work with your version of Visual Studio 2017.") endif() # Use Eigen diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt index bfe4bee7b745..f5a2c6741377 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt @@ -1,12 +1,16 @@ include(polyhedron_demo_macros) -find_package(LASLIB) -set_package_properties( - LASLIB PROPERTIES - DESCRIPTION "A library for some I/O." - PURPOSE "Requiered for reading or writing LAS files.") +if (NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910) + find_package(LASLIB) + set_package_properties( + LASLIB PROPERTIES + DESCRIPTION "A library for some I/O." + PURPOSE "Requiered for reading or writing LAS files.") + include(CGAL_LASLIB_support) +else() + message(STATUS "NOTICE : the LAS reader does not work with your version of Visual Studio 2017.") +endif() -include(CGAL_LASLIB_support) polyhedron_demo_plugin(gocad_plugin GOCAD_io_plugin KEYWORDS Viewer) target_link_libraries(gocad_plugin PUBLIC scene_surface_mesh_item) @@ -103,6 +107,7 @@ else() target_link_libraries(ply_plugin PUBLIC scene_points_with_normal_item scene_polygon_soup_item scene_surface_mesh_item scene_textured_item) target_compile_features(ply_plugin PRIVATE ${needed_cxx_features}) + #disable if MSVC 2017 if (TARGET CGAL::LASLIB_support) polyhedron_demo_plugin(las_plugin LAS_io_plugin KEYWORDS Viewer PointSetProcessing Classification) target_link_libraries(las_plugin PUBLIC scene_points_with_normal_item CGAL::LASLIB_support) diff --git a/Stream_support/test/Stream_support/CMakeLists.txt b/Stream_support/test/Stream_support/CMakeLists.txt index a58a12410cc1..bccc6e12ba43 100644 --- a/Stream_support/test/Stream_support/CMakeLists.txt +++ b/Stream_support/test/Stream_support/CMakeLists.txt @@ -13,8 +13,12 @@ find_library( NAMES 3MF DOC "Path to the lib3MF library") -find_package(LASLIB QUIET) -include(CGAL_LASLIB_support) +if (NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910) + find_package(LASLIB QUIET) + include(CGAL_LASLIB_support) +else() + message(STATUS "NOTICE : the LAS reader does not work with your version of Visual Studio 2017.") +endif() # create a target per cppfile file( @@ -37,6 +41,7 @@ foreach(cppfile ${cppfiles}) endif() else() if("${cppfile}" STREQUAL "test_LAS.cpp") + #disable if MSVC 2017 if(TARGET CGAL::LASLIB_support) create_single_source_cgal_program("test_LAS.cpp") target_link_libraries(test_LAS PRIVATE CGAL::LASLIB_support) From a76ab58c30f0dbcbaa884b7048f14442d0cce34f Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Mon, 9 Sep 2024 16:26:17 +0200 Subject: [PATCH 170/348] OpenGR does not work with msvc2015 --- .../Point_set_processing_3/CMakeLists.txt | 55 ++++++++++--------- 1 file changed, 30 insertions(+), 25 deletions(-) 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 de0b1a236930..9824e5bb47f4 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 @@ -120,33 +120,38 @@ if(TARGET CGAL::Eigen3_support) ) endif() # Executables that require OpenGR - find_package(OpenGR QUIET) - include(CGAL_OpenGR_support) - if(TARGET CGAL::OpenGR_support) - create_single_source_cgal_program("registration_with_OpenGR.cpp") - target_link_libraries(registration_with_OpenGR PRIVATE ${CGAL_libs} - CGAL::OpenGR_support) + if (NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1910) + find_package(OpenGR QUIET) + include(CGAL_OpenGR_support) + if(TARGET CGAL::OpenGR_support) + create_single_source_cgal_program("registration_with_OpenGR.cpp") + target_link_libraries(registration_with_OpenGR PRIVATE ${CGAL_libs} + CGAL::OpenGR_support) + else() + message( + STATUS + "NOTICE : registration_with_OpenGR requires OpenGR, and will not be compiled." + ) + endif() + # Executables that require both libpointmatcher and OpenGR + if (TARGET CGAL::pointmatcher_support AND + TARGET CGAL::OpenGR_support) + create_single_source_cgal_program("registration_with_opengr_pointmatcher_pipeline.cpp") + target_link_libraries( + registration_with_opengr_pointmatcher_pipeline PRIVATE ${CGAL_libs} + CGAL::pointmatcher_support CGAL::OpenGR_support) + else() + message( + STATUS + "NOTICE : registration_with_opengr_pointmatcher_pipeline requires libpointmatcher and OpenGR, and will not be compiled." + ) + endif() else() - message( - STATUS - "NOTICE : registration_with_OpenGR requires OpenGR, and will not be compiled." - ) - endif() - - # Executables that require both libpointmatcher and OpenGR - if (TARGET CGAL::pointmatcher_support AND - TARGET CGAL::OpenGR_support) - create_single_source_cgal_program("registration_with_opengr_pointmatcher_pipeline.cpp") - target_link_libraries( - registration_with_opengr_pointmatcher_pipeline PRIVATE ${CGAL_libs} - CGAL::pointmatcher_support CGAL::OpenGR_support) - else() - message( - STATUS - "NOTICE : registration_with_opengr_pointmatcher_pipeline requires libpointmatcher and OpenGR, and will not be compiled." - ) + message( + STATUS + "NOTICE : your compiler does not support OpenGR, registration_with_OpenGR will not be compiled." + ) endif() - else() message( STATUS From 49eebabbfab1216c4fd7f42d9d2c499a0323b01f Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Mon, 9 Sep 2024 17:46:14 +0300 Subject: [PATCH 171/348] Added missing reference in passed parameters --- .../include/CGAL/Arr_polycurve_basic_traits_2.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h index 027748fc9278..614a86398bc9 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h @@ -1632,7 +1632,7 @@ class Arr_polycurve_basic_traits_2 { */ Comparison_result operator()(const X_monotone_curve_2& xcv1, Arr_curve_end ce1/* for xcv1 */, - const X_monotone_curve_2 & xcv2, + const X_monotone_curve_2& xcv2, Arr_curve_end ce2/*! for xcv2 */, Arr_has_open_side_tag) const { const auto* geom_traits = m_poly_traits.subcurve_traits_2(); @@ -1679,8 +1679,8 @@ class Arr_polycurve_basic_traits_2 { const Arr_curve_end ce) const { return (ce == ARR_MIN_END) ? 0 : xcv.number_of_subcurves() - 1; } - Comparison_result operator()(const X_monotone_curve_2 xcv1, - const X_monotone_curve_2 xcv2, + Comparison_result operator()(const X_monotone_curve_2& xcv1, + const X_monotone_curve_2& xcv2, Arr_curve_end ce) const { const auto* geom_traits = m_poly_traits.subcurve_traits_2(); auto cmp_x_near_boundary = geom_traits->compare_x_near_boundary_2_object(); From cc7ba6ef9810b8c8de007ca23fd3d260ccb6c71c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 9 Sep 2024 17:10:23 +0200 Subject: [PATCH 172/348] also disable OpenGR with MSVC2015 in CGALlab --- .../examples/Point_set_processing_3/CMakeLists.txt | 4 ++-- .../demo/Polyhedron/Plugins/Point_set/CMakeLists.txt | 12 +++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) 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 9824e5bb47f4..7bb1ede702bd 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 @@ -145,11 +145,11 @@ if(TARGET CGAL::Eigen3_support) STATUS "NOTICE : registration_with_opengr_pointmatcher_pipeline requires libpointmatcher and OpenGR, and will not be compiled." ) - endif() + endif() else() message( STATUS - "NOTICE : your compiler does not support OpenGR, registration_with_OpenGR will not be compiled." + "NOTICE : OpenGR does not support your compiler, registration_with_OpenGR will not be compiled." ) endif() else() diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Point_set/CMakeLists.txt index 0c562c8a6f29..c99b9fa1eeba 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/CMakeLists.txt @@ -97,9 +97,15 @@ if(TARGET CGAL::Eigen3_support) point_set_shape_detection_plugin PUBLIC scene_surface_mesh_item scene_points_with_normal_item scene_polygon_soup_item scene_callback_signaler CGAL::Eigen3_support) - - find_package(OpenGR QUIET) - include(CGAL_OpenGR_support) + if (NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1910) + find_package(OpenGR QUIET) + include(CGAL_OpenGR_support) + else() + message( + STATUS + "NOTICE : OpenGR does not support your compiler." + ) + endif() find_package(libpointmatcher QUIET) include(CGAL_pointmatcher_support) From 19372fe0d14ded9c1df7ce2a1f67aed973802885 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 9 Sep 2024 17:15:43 +0200 Subject: [PATCH 173/348] fix comment --- Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt | 1 - Stream_support/test/Stream_support/CMakeLists.txt | 1 - 2 files changed, 2 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt index f5a2c6741377..b6c0bbded88d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt @@ -107,7 +107,6 @@ else() target_link_libraries(ply_plugin PUBLIC scene_points_with_normal_item scene_polygon_soup_item scene_surface_mesh_item scene_textured_item) target_compile_features(ply_plugin PRIVATE ${needed_cxx_features}) - #disable if MSVC 2017 if (TARGET CGAL::LASLIB_support) polyhedron_demo_plugin(las_plugin LAS_io_plugin KEYWORDS Viewer PointSetProcessing Classification) target_link_libraries(las_plugin PUBLIC scene_points_with_normal_item CGAL::LASLIB_support) diff --git a/Stream_support/test/Stream_support/CMakeLists.txt b/Stream_support/test/Stream_support/CMakeLists.txt index bccc6e12ba43..e78b33b77d09 100644 --- a/Stream_support/test/Stream_support/CMakeLists.txt +++ b/Stream_support/test/Stream_support/CMakeLists.txt @@ -41,7 +41,6 @@ foreach(cppfile ${cppfiles}) endif() else() if("${cppfile}" STREQUAL "test_LAS.cpp") - #disable if MSVC 2017 if(TARGET CGAL::LASLIB_support) create_single_source_cgal_program("test_LAS.cpp") target_link_libraries(test_LAS PRIVATE CGAL::LASLIB_support) From c1deec6c3dedce9bf63183366f83107d3e138604 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Mon, 9 Sep 2024 18:36:15 +0300 Subject: [PATCH 174/348] Fixed more typos when computing the direction --- .../CGAL/Arr_polycurve_basic_traits_2.h | 68 +++++++++++-------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h index 614a86398bc9..d2e93d05ba0d 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h @@ -992,7 +992,7 @@ class Arr_polycurve_basic_traits_2 { ++j; } else { - Comparison_result res_x = cmp_x(point1,point2); + Comparison_result res_x = cmp_x(point1, point2); // Check if the different point is a collinear point situated on // the line between its two neighbors. if (SMALLER == res_x) { @@ -1213,7 +1213,7 @@ class Arr_polycurve_basic_traits_2 { auto get_max_v = geom_traits->construct_max_vertex_2_object(); auto equal = geom_traits->equal_2_object(); - CGAL_precondition_msg(! equal(get_min_v(seg),get_max_v(seg)), + CGAL_precondition_msg(! equal(get_min_v(seg), get_max_v(seg)), "Cannot construct a degenerated subcurve"); ); @@ -1403,9 +1403,9 @@ class Arr_polycurve_basic_traits_2 { auto cmp_endpt = geom_traits->compare_endpoints_xy_2_object(); Comparison_result direction = cmp_endpt(xcv[0]); const X_monotone_subcurve_2& xs = - (((direction == SMALLER) && (ce == ARR_MAX_END)) || - ((direction == LARGER) && (ce == ARR_MIN_END))) ? - xcv[xcv.number_of_subcurves()-1] : xcv[0]; + (((direction == SMALLER) && (ce == ARR_MIN_END)) || + ((direction == LARGER) && (ce == ARR_MAX_END))) ? + xcv[0] : xcv[xcv.number_of_subcurves()-1]; return geom_traits->parameter_space_in_x_2_object()(xs, ce); } @@ -1468,9 +1468,9 @@ class Arr_polycurve_basic_traits_2 { auto cmp_endpt = geom_traits->compare_endpoints_xy_2_object(); Comparison_result direction = cmp_endpt(xcv[0]); const X_monotone_subcurve_2& xs = - (((direction == SMALLER) && (ce == ARR_MAX_END)) || - ((direction == LARGER) && (ce == ARR_MIN_END))) ? - xcv[xcv.number_of_subcurves()-1] : xcv[0]; + (((direction == SMALLER) && (ce == ARR_MIN_END)) || + ((direction == LARGER) && (ce == ARR_MAX_END))) ? + xcv[0] : xcv[xcv.number_of_subcurves()-1]; return geom_traits->parameter_space_in_y_2_object()(xs, ce); } @@ -1568,8 +1568,8 @@ class Arr_polycurve_basic_traits_2 { auto cmp_endpt = geom_traits->compare_endpoints_xy_2_object(); Comparison_result direction = cmp_endpt(xcv[0]); const X_monotone_subcurve_2& xs = - (((direction == SMALLER) && (ce == ARR_MAX_END)) || - ((direction == LARGER) && (ce == ARR_MIN_END))) ? + (((direction == SMALLER) && (ce == ARR_MIN_END)) || + ((direction == LARGER) && (ce == ARR_MAX_END))) ? xcv[0] : xcv[xcv.number_of_subcurves()-1]; return geom_traits->compare_x_on_boundary_2_object()(point, xs, ce); } @@ -1586,13 +1586,13 @@ class Arr_polycurve_basic_traits_2 { auto cmp_endpt = geom_traits->compare_endpoints_xy_2_object(); Comparison_result direction1 = cmp_endpt(xcv1[0]); const X_monotone_subcurve_2& xs1 = - (((direction1 == SMALLER) && (ce1 == ARR_MAX_END)) || - ((direction1 == LARGER) && (ce1 == ARR_MIN_END))) ? + (((direction1 == SMALLER) && (ce1 == ARR_MIN_END)) || + ((direction1 == LARGER) && (ce1 == ARR_MAX_END))) ? xcv1[0] : xcv1[xcv1.number_of_subcurves()-1]; Comparison_result direction2 = cmp_endpt(xcv2[0]); const X_monotone_subcurve_2& xs2 = - (((direction2 == SMALLER) && (ce2 == ARR_MAX_END)) || - ((direction2 == LARGER) && (ce2 == ARR_MIN_END))) ? + (((direction2 == SMALLER) && (ce2 == ARR_MIN_END)) || + ((direction2 == LARGER) && (ce2 == ARR_MAX_END))) ? xcv2[0] : xcv2[xcv2.number_of_subcurves()-1]; return geom_traits->compare_x_on_boundary_2_object()(xs1, ce1, xs2, ce2); } @@ -2509,10 +2509,13 @@ class Arr_polycurve_basic_traits_2 { Arr_not_all_sides_oblivious_tag) const { const Subcurve_traits_2* geom_traits = subcurve_traits_2(); if (geom_traits->is_vertical_2_object()(xcv[0])) { - // Verify that q has the same x-coord as xcv (which is vertical) - Compare_x_2 cmp_x = compare_x_2_object(); - Comparison_result res = cmp_x(xcv[0], ARR_MIN_END, xs, ce); - if (res != EQUAL) return INVALID_INDEX; + CGAL_precondition_code + ( + // Verify that q has the same x-coord as xcv (which is vertical) + Compare_x_2 cmp_x = compare_x_2_object(); + Comparison_result res = cmp_x(xcv[0], ARR_MIN_END, xs, ce); + if (res != EQUAL) return INVALID_INDEX; + ); Compare_curve_ends compare(compare_xy_2_object(), xs, ce); return locate_gen(xcv, compare); @@ -2553,10 +2556,13 @@ class Arr_polycurve_basic_traits_2 { Arr_not_all_sides_oblivious_tag) const { const Subcurve_traits_2* geom_traits = subcurve_traits_2(); if (geom_traits->is_vertical_2_object()(xcv[0])) { - // Verify that q has the same x-coord as xcv (which is vertical) - auto cmp_x = compare_x_2_object(); - Comparison_result res = cmp_x(xcv[0], ARR_MIN_END, p); - if (res != EQUAL) return INVALID_INDEX; + CGAL_precondition_code + ( + // Verify that q has the same x-coord as xcv (which is vertical) + auto cmp_x = compare_x_2_object(); + Comparison_result res = cmp_x(xcv[0], ARR_MIN_END, p); + if (res != EQUAL) return INVALID_INDEX; + ); Compare_point_curve_end compare(compare_xy_2_object(), p); return locate_gen(xcv, compare); @@ -2581,11 +2587,14 @@ class Arr_polycurve_basic_traits_2 { std::size_t locate(const X_monotone_curve_2& xcv, const Point_2& q) const { const Subcurve_traits_2* geom_traits = subcurve_traits_2(); if (geom_traits->is_vertical_2_object()(xcv[0])) { - // Verify that q has the same x-coord as cv (which is vertical) - auto min_vertex = geom_traits->construct_min_vertex_2_object(); - auto cmp_x = geom_traits->compare_x_2_object(); - Comparison_result res = cmp_x(min_vertex(xcv[0]), q); - if (res != EQUAL) return INVALID_INDEX; + CGAL_precondition_code + ( + // Verify that q has the same x-coord as cv (which is vertical) + auto min_vertex = geom_traits->construct_min_vertex_2_object(); + auto cmp_x = geom_traits->compare_x_2_object(); + Comparison_result res = cmp_x(min_vertex(xcv[0]), q); + if (res != EQUAL) return INVALID_INDEX; + ); Compare_points compare(*geom_traits, compare_xy_2_object(), q); @@ -2621,7 +2630,7 @@ class Arr_polycurve_basic_traits_2 { Comparison_result direction = cmp_endpts(cv[i]); if ((! is_vert(cv[0]) && (cmp_x(get_min_v(cv[i]), q) == EQUAL)) || - (is_vert(cv[0]) && equal(get_min_v(cv[i]), q))){ + (is_vert(cv[0]) && equal(get_min_v(cv[i]), q))) { // q is the left endpoint of the i'th subcurve: if (to_right) return i; else { @@ -2638,8 +2647,7 @@ class Arr_polycurve_basic_traits_2 { } if ((! is_vert(cv[0]) && (cmp_x(get_max_v(cv[i]), q) == EQUAL)) || - (is_vert(cv[0]) && equal(get_max_v(cv[i]), q))) - { + (is_vert(cv[0]) && equal(get_max_v(cv[i]), q))) { // q is the right endpoint of the i'th subcurve: if (! to_right) return i; else { From 8448129a3afb2df9da48ffcefae833ba001716c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 9 Sep 2024 09:38:08 +0200 Subject: [PATCH 175/348] fix conditional compilation --- GraphicsView/demo/Polygon/Polygon_2.cpp | 2 ++ .../Triangulation_2/Constrained_Delaunay_triangulation_2.cpp | 2 ++ GraphicsView/demo/Triangulation_2/Delaunay_triangulation_2.cpp | 2 ++ GraphicsView/include/CGAL/Qt/DemosMainWindow.h | 2 ++ .../Polyline_simplification_2/Polyline_simplification_2.cpp | 2 ++ 5 files changed, 10 insertions(+) diff --git a/GraphicsView/demo/Polygon/Polygon_2.cpp b/GraphicsView/demo/Polygon/Polygon_2.cpp index 9463c2e979b6..88f0f7aa31aa 100644 --- a/GraphicsView/demo/Polygon/Polygon_2.cpp +++ b/GraphicsView/demo/Polygon/Polygon_2.cpp @@ -179,7 +179,9 @@ MainWindow::MainWindow() this->setupOptionsMenu(); this->addAboutDemo(":/cgal/help/about_Polygon_2.html"); this->addAboutCGAL(); +#if QT_SVG_LIB this->setupExportSVG(action_Export_SVG, graphicsView); +#endif this->addRecentFiles(this->menuFile, this->actionQuit); connect(this, SIGNAL(openRecentFile(QString)), diff --git a/GraphicsView/demo/Triangulation_2/Constrained_Delaunay_triangulation_2.cpp b/GraphicsView/demo/Triangulation_2/Constrained_Delaunay_triangulation_2.cpp index 5429cf3ff642..b19f9aa3aec6 100644 --- a/GraphicsView/demo/Triangulation_2/Constrained_Delaunay_triangulation_2.cpp +++ b/GraphicsView/demo/Triangulation_2/Constrained_Delaunay_triangulation_2.cpp @@ -339,7 +339,9 @@ MainWindow::MainWindow() this->setupOptionsMenu(); this->addAboutDemo(":/cgal/help/about_Constrained_Delaunay_triangulation_2.html"); this->addAboutCGAL(); +#if QT_SVG_LIB this->setupExportSVG(this->actionExport_SVG, this->graphicsView); +#endif this->addRecentFiles(this->menuFile, this->actionQuit); connect(this, SIGNAL(openRecentFile(QString)), diff --git a/GraphicsView/demo/Triangulation_2/Delaunay_triangulation_2.cpp b/GraphicsView/demo/Triangulation_2/Delaunay_triangulation_2.cpp index e00d9fa260fd..2e503290c90e 100644 --- a/GraphicsView/demo/Triangulation_2/Delaunay_triangulation_2.cpp +++ b/GraphicsView/demo/Triangulation_2/Delaunay_triangulation_2.cpp @@ -179,7 +179,9 @@ MainWindow::MainWindow() this->setupOptionsMenu(); this->addAboutDemo(":/cgal/help/about_Delaunay_triangulation_2.html"); this->addAboutCGAL(); +#if QT_SVG_LIB this->setupExportSVG(actionExport_SVG, graphicsView); +#endif this->addRecentFiles(this->menuFile, this->actionQuit); connect(this, SIGNAL(openRecentFile(QString)), diff --git a/GraphicsView/include/CGAL/Qt/DemosMainWindow.h b/GraphicsView/include/CGAL/Qt/DemosMainWindow.h index 8ea7d1e3f70c..726db60df66c 100644 --- a/GraphicsView/include/CGAL/Qt/DemosMainWindow.h +++ b/GraphicsView/include/CGAL/Qt/DemosMainWindow.h @@ -79,7 +79,9 @@ public Q_SLOTS: void setupOptionsMenu(QMenu* menu = nullptr); void addAboutCGAL(QMenu* menu = nullptr); void addAboutDemo(QString htmlResourceName, QMenu* menu = nullptr); +#if QT_SVG_LIB void setupExportSVG(QAction*, QGraphicsView*); +#endif void addRecentFiles(QMenu* menu, QAction* insertBefore = nullptr); diff --git a/Polyline_simplification_2/demo/Polyline_simplification_2/Polyline_simplification_2.cpp b/Polyline_simplification_2/demo/Polyline_simplification_2/Polyline_simplification_2.cpp index 2e15255eaef6..9a675251926f 100644 --- a/Polyline_simplification_2/demo/Polyline_simplification_2/Polyline_simplification_2.cpp +++ b/Polyline_simplification_2/demo/Polyline_simplification_2/Polyline_simplification_2.cpp @@ -201,7 +201,9 @@ MainWindow::MainWindow() this->setupOptionsMenu(); this->addAboutDemo(":/cgal/help/about_Polyline_simplification_2.html"); this->addAboutCGAL(); +#if QT_SVG_LIB this->setupExportSVG(action_Export_SVG, graphicsView); +#endif this->addRecentFiles(this->menuFile, this->actionQuit); connect(this, SIGNAL(openRecentFile(QString)), this, SLOT(open(QString))); From 87ae85e050ffeadf9449e9786e59c024cd1baea3 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Mon, 9 Sep 2024 22:55:17 +0300 Subject: [PATCH 176/348] Fixed mixup between equal-points and equal-curves counters --- .../include/CGAL/Arr_counting_traits_2.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_counting_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_counting_traits_2.h index 0b9c916a3f25..55a75efd7de0 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_counting_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_counting_traits_2.h @@ -342,13 +342,13 @@ class Arr_counting_traits_2 : public Base_traits { {} /*! Operate */ - bool operator()(const X_monotone_curve_2& xc1, - const X_monotone_curve_2& xc2) const - { ++m_counter1; return m_object(xc1, xc2); } + bool operator()(const Point_2& p1, const Point_2& p2) const + { ++m_counter1; return m_object(p1, p2); } /*! Operate */ - bool operator()(const Point_2& p1, const Point_2& p2) const - { ++m_counter2; return m_object(p1, p2); } + bool operator()(const X_monotone_curve_2& xc1, + const X_monotone_curve_2& xc2) const + { ++m_counter2; return m_object(xc1, xc2); } }; /*! A functor that compares compares the y-coordinates of two x-monotone @@ -824,10 +824,10 @@ class Arr_counting_traits_2 : public Base_traits { m_counters[IS_ON_X_IDENTIFICATION_CURVE_OP]); } - Compare_y_on_boundary_2 compare_on_boundary_2_object() const + Compare_y_on_boundary_2 compare_y_on_boundary_2_object() const { return Compare_y_on_boundary_2(this, m_counters[COMPARE_Y_ON_BOUNDARY_OP]); } - Compare_y_near_boundary_2 compare_near_boundary_2_object() const + Compare_y_near_boundary_2 compare_y_near_boundary_2_object() const { return Compare_y_near_boundary_2(this, m_counters[COMPARE_Y_NEAR_BOUNDARY_OP]); From 791c0ad05199c4899f62a7b922b1e2476bfcbdb1 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Mon, 9 Sep 2024 22:55:52 +0300 Subject: [PATCH 177/348] Cleaned up --- .../include/CGAL/Arr_polycurve_basic_traits_2.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h index d2e93d05ba0d..24b538810970 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h @@ -675,24 +675,20 @@ class Arr_polycurve_basic_traits_2 { ((ce1 == ARR_MIN_END) && (ps_x1 != ARR_RIGHT_BOUNDARY))); if (ps_x1 == ARR_INTERIOR) { + auto p = (ce1 == ARR_MAX_END) ? max_vertex(xs1) : min_vertex(xs1); if (ps_y1 == ARR_TOP_BOUNDARY) { auto equal = geom_traits->equal_2_object(); - auto p = (ce1 == ARR_MAX_END) ? - max_vertex(xs1) : min_vertex(xs1); if (equal(p, max_vertex(xs2))) return EQUAL; if (equal(p, min_vertex(xs2))) return EQUAL; return LARGER; } if (ps_y1 == ARR_BOTTOM_BOUNDARY) { auto equal = geom_traits->equal_2_object(); - auto p = (ce1 == ARR_MAX_END) ? - max_vertex(xs1) : min_vertex(xs1); if (equal(p, max_vertex(xs2))) return EQUAL; if (equal(p, min_vertex(xs2))) return EQUAL; return SMALLER; } // ps_y1 == ARR_INTERIOR - auto p = (ce1 == ARR_MAX_END) ? max_vertex(xs1) : min_vertex(xs1); return geom_traits->compare_y_at_x_2_object()(p, xs2); } // ps_x1 == ARR_RIGHT_BOUNDARY || ARR_LEFT_BOUNDARY From 9393be402917330c0d3ee108bbdcac74bb169c1b Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Mon, 9 Sep 2024 23:08:58 +0300 Subject: [PATCH 178/348] Cleaned up --- .../CGAL/Arr_polycurve_basic_traits_2.h | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h index 24b538810970..eb4cbf5c710f 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h @@ -997,7 +997,7 @@ class Arr_polycurve_basic_traits_2 { else return false; } else if (LARGER == res_x) { - Comparison_result res_y_at_x = cmp_y_at_x(point2,cv1[cv1_seg_ind]); + Comparison_result res_y_at_x = cmp_y_at_x(point2, cv1[cv1_seg_ind]); if (EQUAL == res_y_at_x) ++j; else return false; } @@ -2525,9 +2525,9 @@ class Arr_polycurve_basic_traits_2 { * of a curve. * This implementation is used in the case where all sides of the parameter * space is oblivious. - * \param xcv (in) the given polycurve. - * \param xs (in) the given curve. - * \param cd (in) the curve-end indicator. + * \param(in) xcv the given polycurve. + * \param(in) xs the given curve. + * \param(in) cd the curve-end indicator. */ std::size_t locate_impl(const X_monotone_curve_2& xcv, const X_monotone_subcurve_2& xs, @@ -2540,12 +2540,11 @@ class Arr_polycurve_basic_traits_2 { return locate(xcv, p); } - /*! Locate the index of a curve in a polycurve that contains an endpoint - * of a curve. + /*! Locate the index of a curve in a polycurve that contains a point. * This implementation is used in the case where at least one side of the * parameter space is not oblivious. * \param(in) xcv the given polycurve. - * \param(in) p the endpoint of a curve. + * \param(in) p the query point. */ std::size_t locate_impl(const X_monotone_curve_2& xcv, const Point_2& p, @@ -2568,12 +2567,11 @@ class Arr_polycurve_basic_traits_2 { return locate_gen(xcv, compare); } - /*! Locate the index of a curve in a polycurve that contains an endpoint - * of a curve. + /*! Locate the index of a curve in a polycurve that contains a point. * This implementation is used in the case where all sides of the parameter - * space is oblivious. + * space are oblivious. * \param(in) xcv the given polycurve. - * \param(in) p the endpoint of a curve. + * \param(in) p the query point. */ std::size_t locate_impl(const X_monotone_curve_2& xcv, const Point_2& p, Arr_all_sides_oblivious_tag) const From 726b9c9485c810403dbc34b4a3870df9e5d650f8 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 10 Sep 2024 08:34:52 +0100 Subject: [PATCH 179/348] Show the problem in a test --- BGL/test/BGL/CMakeLists.txt | 3 +++ BGL/test/BGL/test_OpenMesh.cpp | 23 ++++++++++++++++++++++ STL_Extension/include/CGAL/hash_openmesh.h | 4 ++-- 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 BGL/test/BGL/test_OpenMesh.cpp diff --git a/BGL/test/BGL/CMakeLists.txt b/BGL/test/BGL/CMakeLists.txt index 074bce74ac25..ed88e574158c 100644 --- a/BGL/test/BGL/CMakeLists.txt +++ b/BGL/test/BGL/CMakeLists.txt @@ -62,6 +62,9 @@ if(OpenMesh_FOUND) create_single_source_cgal_program("graph_concept_OpenMesh.cpp") target_link_libraries(graph_concept_OpenMesh PRIVATE ${OPENMESH_LIBRARIES}) + + create_single_source_cgal_program("test_OpenMesh.cpp") + target_link_libraries(test_OpenMesh PRIVATE ${OPENMESH_LIBRARIES}) else() message(STATUS "NOTICE: Tests that use OpenMesh will not be compiled.") endif() diff --git a/BGL/test/BGL/test_OpenMesh.cpp b/BGL/test/BGL/test_OpenMesh.cpp new file mode 100644 index 000000000000..bafe9002ee66 --- /dev/null +++ b/BGL/test/BGL/test_OpenMesh.cpp @@ -0,0 +1,23 @@ +#include +#include +#include + +#include + + +typedef OpenMesh::PolyMesh_ArrayKernelT<> Om; +typedef boost::graph_traits< Om > Traits; +typedef Traits::edge_descriptor edge_descriptor; +typedef Traits::halfedge_descriptor halfedge_descriptor; +typedef Traits::vertex_descriptor vertex_descriptor; +typedef Traits::face_descriptor face_descriptor; +//typedef Kernel::Point_3 Point_3; + +int main() +{ + Om om; + for (Om::EdgeHandle ed : edges(om)) { + std::cout << "edge" << std::endl; + } + return 0; +} diff --git a/STL_Extension/include/CGAL/hash_openmesh.h b/STL_Extension/include/CGAL/hash_openmesh.h index eb9c71d58f11..49ae372f3abe 100644 --- a/STL_Extension/include/CGAL/hash_openmesh.h +++ b/STL_Extension/include/CGAL/hash_openmesh.h @@ -36,11 +36,11 @@ class OMesh_edge { return false; } } - + /* operator OpenMesh::EdgeHandle () const { return OpenMesh::EdgeHandle(idx()); } - + */ bool operator<(const OMesh_edge& other) const { return this->idx() < other.idx(); From 82805a0c69b2f4c4604546f002b9b915a93a1206 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 10 Sep 2024 08:35:23 +0100 Subject: [PATCH 180/348] Re-add the fix --- STL_Extension/include/CGAL/hash_openmesh.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STL_Extension/include/CGAL/hash_openmesh.h b/STL_Extension/include/CGAL/hash_openmesh.h index 49ae372f3abe..eb9c71d58f11 100644 --- a/STL_Extension/include/CGAL/hash_openmesh.h +++ b/STL_Extension/include/CGAL/hash_openmesh.h @@ -36,11 +36,11 @@ class OMesh_edge { return false; } } - /* + operator OpenMesh::EdgeHandle () const { return OpenMesh::EdgeHandle(idx()); } - */ + bool operator<(const OMesh_edge& other) const { return this->idx() < other.idx(); From f2249ab9fdf86d513f03b7f5afc773d85ac22fa0 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 10 Sep 2024 08:54:03 +0100 Subject: [PATCH 181/348] untabify --- BGL/test/BGL/test_OpenMesh.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/BGL/test/BGL/test_OpenMesh.cpp b/BGL/test/BGL/test_OpenMesh.cpp index bafe9002ee66..0dede3e68ed4 100644 --- a/BGL/test/BGL/test_OpenMesh.cpp +++ b/BGL/test/BGL/test_OpenMesh.cpp @@ -4,7 +4,6 @@ #include - typedef OpenMesh::PolyMesh_ArrayKernelT<> Om; typedef boost::graph_traits< Om > Traits; typedef Traits::edge_descriptor edge_descriptor; @@ -17,7 +16,7 @@ int main() { Om om; for (Om::EdgeHandle ed : edges(om)) { - std::cout << "edge" << std::endl; + std::cout << "edge" << std::endl; } return 0; } From 1f2c7f0804999a850e7bb3ba9404ac394010d4f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 10 Sep 2024 13:50:23 +0200 Subject: [PATCH 182/348] add extra path --- Installation/cmake/modules/FindLASLIB.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/Installation/cmake/modules/FindLASLIB.cmake b/Installation/cmake/modules/FindLASLIB.cmake index 76c090e7edd8..b39a65c41180 100644 --- a/Installation/cmake/modules/FindLASLIB.cmake +++ b/Installation/cmake/modules/FindLASLIB.cmake @@ -26,6 +26,7 @@ find_library(LASLIB_LIBRARIES PATHS ENV LD_LIBRARY_PATH ENV LIBRARY_PATH /usr/local/lib + /usr/local/lib/LASlib ${LASLIB_INCLUDE_DIR}/../../lib ENV LASLIB_LIB_DIR ) From 073309a07f8c59253a8953d80e1f89daf5acf682 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Tue, 10 Sep 2024 14:36:58 +0200 Subject: [PATCH 183/348] fix crash on repeating steps in the reconstruction pipeline --- .../include/CGAL/Kinetic_space_partition_3.h | 2 ++ .../CGAL/Kinetic_surface_reconstruction_3.h | 8 +++++++- .../Kinetic_surface_reconstruction_plugin.cpp | 16 +++------------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h b/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h index 547ebc0a97a8..d231b48e1ee5 100644 --- a/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h +++ b/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h @@ -2279,6 +2279,7 @@ class Kinetic_space_partition_3 { m_points.clear(); m_points.reserve(count); + m_polygons.clear(); m_polygons.reserve(m_input_polygons.size()); To_exact to_exact; @@ -2321,6 +2322,7 @@ class Kinetic_space_partition_3 { max_count = (std::max)(max_count, node); } + m_partition_nodes.clear(); m_partition_nodes.resize(leaf_count); m_node2partition.resize(max_count + 1, std::size_t(-1)); diff --git a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h index 94db973672da..21b8c276153e 100644 --- a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h +++ b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h @@ -330,7 +330,7 @@ class Kinetic_surface_reconstruction_3 { m_sorting->sort(); } - max_distance = 2 * m_sorting->mean_distance(); + max_distance = 4 * m_sorting->mean_distance(); normal_dev = m_sorting->mean_deviation(); min_inliers = m_points.size() * 0.005; // difficult to estimate as it depends on the kind of data, e.g., object scan vs. large scale urban acquisition } @@ -651,7 +651,9 @@ class Kinetic_surface_reconstruction_3 { m_face_inliers.clear(); auto face_range = m_lcc.template one_dart_per_cell<2>(); + m_faces_lcc.clear(); m_faces_lcc.reserve(face_range.size()); + m_attrib2index_lcc.clear(); for (auto& d : face_range) { typename LCC::Dart_descriptor dh = m_lcc.dart_descriptor(d); @@ -675,9 +677,13 @@ class Kinetic_surface_reconstruction_3 { // Create value arrays for graph cut m_face_inliers.resize(m_faces_lcc.size()); m_face_area.resize(m_faces_lcc.size()); + m_face_area_lcc.clear(); m_face_area_lcc.resize(m_faces_lcc.size()); + m_face_neighbors_lcc.clear(); m_face_neighbors_lcc.resize(m_faces_lcc.size(), std::pair(-1, -1)); + m_neighbors2index_lcc.clear(); + m_cost_matrix.clear(); m_cost_matrix.resize(2); m_cost_matrix[0].resize(m_kinetic_partition.number_of_volumes() + 6, 0); m_cost_matrix[1].resize(m_kinetic_partition.number_of_volumes() + 6, 0); diff --git a/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp b/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp index b851e8f052fd..f107f602b3d9 100644 --- a/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp +++ b/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp @@ -110,16 +110,6 @@ class Kinetic_surface_reconstruction_plugin return true; else return false; - -/* - if (pwn_item == nullptr && m_pwn_item == nullptr) { - enable_detection(false); - enable_regularization(false); - enable_partition(false); - enable_reconstruction(false); - }*/ - - //return pwn_item != nullptr; } QList actions() const override @@ -431,7 +421,7 @@ private Q_SLOTS: Point_set* points = m_pwn_item->point_set(); m_ksr = new KSR(*points); - /*if (filename == "foam_box" || filename == "foam_box_new") { + if (filename == "foam_box" || filename == "foam_box_new") { // Shape detection parameters dock_widget->sdMaxDistanceBox->setValue(0.05); dock_widget->sdMaxAngleBox->setValue(15); @@ -585,14 +575,14 @@ private Q_SLOTS: dock_widget->recGroundCheck->setChecked(false); dock_widget->recLambdaBox->setValue(0.5); } - else */{ + else { m_known_file = false; FT max_distance, max_angle; std::size_t min_region_size; m_ksr->estimate_detection_parameters(max_distance, max_angle, min_region_size); dock_widget->sdMaxDistanceBox->setValue(max_distance); dock_widget->sdMaxAngleBox->setValue(max_angle); - dock_widget->sdMinRegionSizeBox->setValue(points->number_of_points() * 0.01); + dock_widget->sdMinRegionSizeBox->setValue(min_region_size); dock_widget->sdkNeighborsBox->setValue(12); dock_widget->srCoplanarityCheck->setChecked(true); dock_widget->srMaxOffsetBox->setValue(max_distance * 0.5); From 6b71686a09740e6aa1e270c84bea368ccb0f0557 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Tue, 10 Sep 2024 14:57:09 +0200 Subject: [PATCH 184/348] Add DEBUG/RELEASE build type to test result page --- Maintenance/test_handling/create_testresult_page | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Maintenance/test_handling/create_testresult_page b/Maintenance/test_handling/create_testresult_page index a2825253e703..9519b5dce1ee 100755 --- a/Maintenance/test_handling/create_testresult_page +++ b/Maintenance/test_handling/create_testresult_page @@ -472,6 +472,7 @@ sub print_platform_descriptions()
    + @@ -524,6 +525,7 @@ EOF ($platform_is_optimized{$pf}) = ($tmp[1] =~ m|([-/]x?O[1-9])|); $_ = ; chomp; + my $build_type = $platform_is_optimized{$pf} ? "RELEASE" : "DEBUG"; print OUTPUT "\n"; print OUTPUT "\n"; print OUTPUT "\n"; @@ -532,6 +534,7 @@ EOF print OUTPUT "\n"; print OUTPUT "\n"; print OUTPUT "\n"; + print OUTPUT "\n"; $index = 8; while ($index) { $index--; From 0c89b1a6febcd31d55c6fb31a3801751c984fbc4 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 10 Sep 2024 17:24:28 +0100 Subject: [PATCH 185/348] trailing whitespace --- BGL/test/BGL/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BGL/test/BGL/CMakeLists.txt b/BGL/test/BGL/CMakeLists.txt index 92241fa5a3df..53d474d67e25 100644 --- a/BGL/test/BGL/CMakeLists.txt +++ b/BGL/test/BGL/CMakeLists.txt @@ -54,7 +54,7 @@ if(OpenMesh_FOUND) create_single_source_cgal_program("graph_concept_OpenMesh.cpp") target_link_libraries(graph_concept_OpenMesh PRIVATE CGAL::OpenMesh_support) - + create_single_source_cgal_program("test_OpenMesh.cpp") target_link_libraries(test_OpenMesh PRIVATE CGAL::OpenMesh_support) From 10fe101cc99d618b03c14f4617772947faa9a2fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 10 Sep 2024 18:39:53 +0200 Subject: [PATCH 186/348] add extra PATH --- Installation/cmake/modules/FindLASLIB.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/Installation/cmake/modules/FindLASLIB.cmake b/Installation/cmake/modules/FindLASLIB.cmake index b39a65c41180..89a8d7fc6930 100644 --- a/Installation/cmake/modules/FindLASLIB.cmake +++ b/Installation/cmake/modules/FindLASLIB.cmake @@ -37,6 +37,7 @@ if (NOT LASLIB_LIBRARIES) PATHS ENV LD_LIBRARY_PATH ENV LIBRARY_PATH /usr/local/lib + /usr/local/lib/LASlib ${LASLIB_INCLUDE_DIR}/../../lib ENV LASLIB_LIB_DIR ) From e012bdd11ecb5151ce125b3b891ec6d9d2761cb4 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Wed, 11 Sep 2024 14:41:07 +0200 Subject: [PATCH 187/348] removing some unnecessary includes --- Kinetic_space_partition/include/CGAL/KSP/utils.h | 1 - .../include/CGAL/KSP_3/Initializer.h | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Kinetic_space_partition/include/CGAL/KSP/utils.h b/Kinetic_space_partition/include/CGAL/KSP/utils.h index d8e99ddddc28..64a2d9972965 100644 --- a/Kinetic_space_partition/include/CGAL/KSP/utils.h +++ b/Kinetic_space_partition/include/CGAL/KSP/utils.h @@ -41,7 +41,6 @@ #include #include #include -#include // Boost includes. #include diff --git a/Kinetic_space_partition/include/CGAL/KSP_3/Initializer.h b/Kinetic_space_partition/include/CGAL/KSP_3/Initializer.h index be34da2cb05e..74b29a5d4611 100644 --- a/Kinetic_space_partition/include/CGAL/KSP_3/Initializer.h +++ b/Kinetic_space_partition/include/CGAL/KSP_3/Initializer.h @@ -17,14 +17,14 @@ // CGAL includes. #include -#include -#include +//#include +//#include #include #include #include #include -#include -#include +//#include +//#include // Internal includes. #include @@ -74,7 +74,7 @@ class Initializer { using From_exact = CGAL::Cartesian_converter; using Bbox_3 = CGAL::Bbox_3; - using OBB_traits = CGAL::Oriented_bounding_box_traits_3; + //using OBB_traits = CGAL::Oriented_bounding_box_traits_3; using Parameters = KSP::internal::Parameters_3; From 7c5cb1be31c4e35dbf287640238a911723b027b1 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Wed, 11 Sep 2024 15:23:40 +0200 Subject: [PATCH 188/348] updated dependencies --- .../package_info/Kinetic_space_partition/dependencies | 7 ------- .../Kinetic_surface_reconstruction/dependencies | 7 ------- 2 files changed, 14 deletions(-) diff --git a/Kinetic_space_partition/package_info/Kinetic_space_partition/dependencies b/Kinetic_space_partition/package_info/Kinetic_space_partition/dependencies index 737b0d92b95e..831b16749e83 100644 --- a/Kinetic_space_partition/package_info/Kinetic_space_partition/dependencies +++ b/Kinetic_space_partition/package_info/Kinetic_space_partition/dependencies @@ -1,20 +1,16 @@ Algebraic_foundations Arithmetic_kernel -Arrangement_on_surface_2 BGL -Boolean_set_operations_2 Bounding_volumes CGAL_Core Cartesian_kernel Circulator Combinatorial_map Convex_hull_2 -Convex_hull_3 Distance_2 Distance_3 Filtered_kernel Generalized_map -HalfedgeDS Hash_map Homogeneous_kernel Installation @@ -27,7 +23,6 @@ Kinetic_space_partition Linear_cell_complex Modular_arithmetic Number_types -Optimal_bounding_box Orthtree Point_set_3 Point_set_processing_3 @@ -43,7 +38,5 @@ Solver_interface Spatial_sorting Stream_support Surface_mesh -Surface_sweep_2 TDS_2 Triangulation_2 -Union_find diff --git a/Kinetic_surface_reconstruction/package_info/Kinetic_surface_reconstruction/dependencies b/Kinetic_surface_reconstruction/package_info/Kinetic_surface_reconstruction/dependencies index 50beb4822f2a..485a6ca615ef 100644 --- a/Kinetic_surface_reconstruction/package_info/Kinetic_surface_reconstruction/dependencies +++ b/Kinetic_surface_reconstruction/package_info/Kinetic_surface_reconstruction/dependencies @@ -1,20 +1,16 @@ Algebraic_foundations Arithmetic_kernel -Arrangement_on_surface_2 BGL -Boolean_set_operations_2 Bounding_volumes Cartesian_kernel CGAL_Core Circulator Combinatorial_map Convex_hull_2 -Convex_hull_3 Distance_2 Distance_3 Filtered_kernel Generalized_map -HalfedgeDS Hash_map Homogeneous_kernel Installation @@ -28,7 +24,6 @@ Kinetic_surface_reconstruction Linear_cell_complex Modular_arithmetic Number_types -Optimal_bounding_box Orthtree Point_set_3 Point_set_processing_3 @@ -48,9 +43,7 @@ Spatial_sorting Stream_support Surface_mesh Surface_mesh_segmentation -Surface_sweep_2 TDS_2 TDS_3 Triangulation_2 Triangulation_3 -Union_find From d24a35eb56ae6151ea958f44a963ef44cd19fde3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 30 Aug 2024 16:24:27 +0200 Subject: [PATCH 189/348] use c++17 fold expression + indicate official LASlib is supported --- .../doc/Documentation/Third_party.txt | 5 +- .../read_las_example.cpp | 2 +- .../include/CGAL/IO/write_las_points.h | 60 +++++++++---------- 3 files changed, 30 insertions(+), 37 deletions(-) diff --git a/Documentation/doc/Documentation/Third_party.txt b/Documentation/doc/Documentation/Third_party.txt index e012763b266e..0a47a9f2dd60 100644 --- a/Documentation/doc/Documentation/Third_party.txt +++ b/Documentation/doc/Documentation/Third_party.txt @@ -248,9 +248,8 @@ imported target `CGAL::LASLIB_support` provided in \laslib information can be obtained from https://lastools.github.io/ and https://rapidlasso.de/product-overview/. -\laslib is usually distributed along with LAStools: for simplicity, \cgal -provides a fork with a -CMake based install procedure. +\laslib is usually distributed along with LAStools. Current versions of \laslib provide CMake support. +BUILD_SHARED_LIBS needs to be set to true on windows to create a dynamic linked library. \subsection thirdpartyOpenCV OpenCV diff --git a/Point_set_processing_3/examples/Point_set_processing_3/read_las_example.cpp b/Point_set_processing_3/examples/Point_set_processing_3/read_las_example.cpp index 11d266a2d5bc..b15265bcb5f5 100644 --- a/Point_set_processing_3/examples/Point_set_processing_3/read_las_example.cpp +++ b/Point_set_processing_3/examples/Point_set_processing_3/read_las_example.cpp @@ -21,7 +21,7 @@ int main(int argc, char*argv[]) // Reads a .las point set file with normal vectors and colors std::ifstream in(fname, std::ios_base::binary); std::vector points; // store points - if(!CGAL::IO::read_LAS_with_properties(in, std::back_inserter (points), + if (!CGAL::IO::read_LAS_with_properties(in, std::back_inserter(points), CGAL::IO::make_las_point_reader(CGAL::First_of_pair_property_map()), std::make_tuple(CGAL::Second_of_pair_property_map(), CGAL::Construct_array(), diff --git a/Point_set_processing_3/include/CGAL/IO/write_las_points.h b/Point_set_processing_3/include/CGAL/IO/write_las_points.h index 3c1425fb41f0..f3a96c919fdc 100644 --- a/Point_set_processing_3/include/CGAL/IO/write_las_points.h +++ b/Point_set_processing_3/include/CGAL/IO/write_las_points.h @@ -134,57 +134,51 @@ namespace LAS { output_value (point, get(current.first, *it), current.second); } - template - void output_tuple(LASpoint& point, const Value& v, const Tuple& t, std::index_sequence) { - output_value(point, std::get(v), std::get(t)); - } - - template - void output_tuple(LASpoint& point, const Value& v, const Tuple& t, std::index_sequence) { - output_value(point, std::get(v), std::get(t)); - output_tuple(point, v, t, std::index_sequence()); + template + void output_tuple(LASpoint& point, const Value& v, const Tuple& t, std::index_sequence) { + (output_value(point, std::get(v), std::get(t)), ...); } template + typename PropertyMap, + typename ... T> void output_properties(LASpoint& point, - ForwardIterator it, - std::tuple&& current) + ForwardIterator it, + std::tuple&& current) { output_tuple(point, get(std::get<0>(current), *it), std::tuple(), std::index_sequence_for{}); } template + typename PropertyMap, + typename T, + typename NextPropertyHandler, + typename ... PropertyHandler> void output_properties(LASpoint& point, - ForwardIterator it, - std::pair&& current, - NextPropertyHandler&& next, - PropertyHandler&& ... properties) + ForwardIterator it, + std::pair&& current, + NextPropertyHandler&& next, + PropertyHandler&& ... properties) { - output_value(point, get(current.first, *it), current.second); - output_properties(point, it, std::forward(next), - std::forward(properties)...); + output_value (point, get(current.first, *it), current.second); + output_properties (point, it, std::forward(next), + std::forward(properties)...); } template + typename PropertyMap, + typename ... T, + typename NextPropertyHandler, + typename ... PropertyHandler> void output_properties(LASpoint& point, - ForwardIterator it, - std::tuple&& current, - NextPropertyHandler&& next, - PropertyHandler&& ... properties) + ForwardIterator it, + std::tuple&& current, + NextPropertyHandler&& next, + PropertyHandler&& ... properties) { output_tuple(point, get(std::get<0>(current), *it), std::tuple(), std::index_sequence_for{}); output_properties(point, it, std::forward(next), - std::forward(properties)...); + std::forward(properties)...); } } // namespace LAS From 40581dd25266275e80cd1d0e230a8438f3b3c316 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Thu, 12 Sep 2024 16:04:10 +0200 Subject: [PATCH 190/348] bug fixes --- .../ksr_basic.cpp | 8 ++-- .../CGAL/Kinetic_surface_reconstruction_3.h | 41 +++++++++++++------ .../Least_squares_plane_fit_sorting.h | 18 ++++---- ...on_growing_on_point_set_3_with_sorting.cpp | 2 +- .../test_region_growing_strict.cpp | 2 +- 5 files changed, 44 insertions(+), 27 deletions(-) diff --git a/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/ksr_basic.cpp b/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/ksr_basic.cpp index ce3ef97db1d6..d34ab8a44efc 100644 --- a/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/ksr_basic.cpp +++ b/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/ksr_basic.cpp @@ -25,23 +25,23 @@ int main() { auto param = CGAL::parameters::maximum_distance(0.5) .maximum_angle(10) .k_neighbors(12) - .minimum_region_size(50); + .minimum_region_size(250); // Algorithm. KSR ksr(point_set, param); ksr.detection_and_partition(1, param); - std::cout << ksr.detect_planar_shapes() << " planar shapes detected" << std::endl; + std::cout << ksr.detected_planar_shapes().size() << " planar shapes detected" << std::endl; std::vector vtx; std::vector > polylist; - ksr.reconstruct_with_ground(0.5, std::back_inserter(vtx), std::back_inserter(polylist)); + ksr.reconstruct_with_ground(0.7, std::back_inserter(vtx), std::back_inserter(polylist)); if (polylist.size() > 0) { std::cout << polylist.size() << " faces in reconstruction" << std::endl; - CGAL::IO::write_polygon_soup("building_0.5.ply", vtx, polylist); + CGAL::IO::write_polygon_soup("building_0.7.ply", vtx, polylist); return EXIT_SUCCESS; } else { diff --git a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h index 21b8c276153e..7a2b2c98ea81 100644 --- a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h +++ b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h @@ -136,7 +136,7 @@ class Kinetic_surface_reconstruction_3 { \cgalParamNBegin{minimum_region_size} \cgalParamDescription{Shape detection: minimum number of 3D points a region must have} \cgalParamType{`std::size_t`} - \cgalParamDefault{1% of input points} + \cgalParamDefault{0.5% of input points} \cgalParamNEnd \cgalParamNBegin{angle_tolerance} \cgalParamDescription{Shape regularization: maximum allowed angle in degrees between plane normals used for parallelism, orthogonality, and axis symmetry} @@ -266,7 +266,7 @@ class Kinetic_surface_reconstruction_3 { \cgalParamNBegin{minimum_region_size} \cgalParamDescription{Shape detection: minimum number of 3D points a region must have} \cgalParamType{`std::size_t`} - \cgalParamDefault{1% of input points} + \cgalParamDefault{0.5% of input points} \cgalParamNEnd \cgalParamNBegin{angle_tolerance} \cgalParamDescription{Shape regularization: maximum allowed angle in degrees between plane normals used for parallelism, orthogonality, and axis symmetry} @@ -1725,13 +1725,8 @@ class Kinetic_surface_reconstruction_3 { m_volumes[i] = 0; } -// std::size_t count_faces = 0; -// std::size_t count_points = 0; - From_exact from_exact; -// std::size_t idx = 0; - for (std::size_t i = 0; i < m_faces_lcc.size(); i++) { std::size_t v[] = { std::size_t(-1), std::size_t(-1) }; Point_3 c[2]; @@ -1814,11 +1809,33 @@ class Kinetic_surface_reconstruction_3 { } if (m_verbose) std::cout << "* getting planar shapes using region growing" << std::endl; + FT xmin, ymin, zmin, xmax, ymax, zmax; + auto pit = m_points.begin(); + const Point_3& p = get(m_point_map, *pit); + xmin = xmax = p.x(); + ymin = ymax = p.y(); + zmin = zmax = p.z(); + + pit++; + + while (pit != m_points.end()) { + const Point_3& p = get(m_point_map, *pit); + xmin = (std::min)(xmin, p.x()); + xmax = (std::max)(xmax, p.x()); + ymin = (std::min)(ymin, p.y()); + ymax = (std::max)(ymax, p.y()); + zmin = (std::min)(zmin, p.z()); + zmax = (std::max)(zmax, p.z()); + pit++; + } + + FT diag = CGAL::sqrt((xmax - xmin) * (xmax - xmin) + (ymax - ymin) * (ymax - ymin) + (zmax - zmin) * (zmax - zmin)); + // Parameters. const std::size_t k = parameters::choose_parameter(parameters::get_parameter(np, internal_np::k_neighbors), 12); - const FT max_distance_to_plane = parameters::choose_parameter(parameters::get_parameter(np, internal_np::maximum_distance), FT(1)); + const FT max_distance_to_plane = parameters::choose_parameter(parameters::get_parameter(np, internal_np::maximum_distance), diag * 0.02); const FT max_accepted_angle = parameters::choose_parameter(parameters::get_parameter(np, internal_np::maximum_angle), FT(15)); - const std::size_t min_region_size = parameters::choose_parameter(parameters::get_parameter(np, internal_np::minimum_region_size), 50); + const std::size_t min_region_size = parameters::choose_parameter(parameters::get_parameter(np, internal_np::minimum_region_size), m_points.size() * 0.005); m_detection_distance_tolerance = max_distance_to_plane; @@ -1863,11 +1880,11 @@ class Kinetic_surface_reconstruction_3 { return; const bool regularize_axis_symmetry = parameters::choose_parameter(parameters::get_parameter(np, internal_np::regularize_axis_symmetry), false); - const bool regularize_coplanarity = parameters::choose_parameter(parameters::get_parameter(np, internal_np::regularize_coplanarity), false); + const bool regularize_coplanarity = parameters::choose_parameter(parameters::get_parameter(np, internal_np::regularize_coplanarity), true); const bool regularize_orthogonality = parameters::choose_parameter(parameters::get_parameter(np, internal_np::regularize_orthogonality), false); const bool regularize_parallelism = parameters::choose_parameter(parameters::get_parameter(np, internal_np::regularize_parallelism), false); - const FT angle_tolerance = parameters::choose_parameter(parameters::get_parameter(np, internal_np::angle_tolerance), 25); - const FT maximum_offset = parameters::choose_parameter(parameters::get_parameter(np, internal_np::maximum_offset), 0.01); + const FT angle_tolerance = parameters::choose_parameter(parameters::get_parameter(np, internal_np::angle_tolerance), 5); + const FT maximum_offset = parameters::choose_parameter(parameters::get_parameter(np, internal_np::maximum_offset), max_distance_to_plane * 0.5); // Regularize detected planes. diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_sorting.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_sorting.h index 6b46b3bcece6..3f26a942ded8 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_sorting.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_sorting.h @@ -133,7 +133,7 @@ namespace Point_set { const CGAL_NP_CLASS& np = parameters::default_values()) : m_neighbor_query(neighbor_query), m_point_map(Point_set_processing_3_np_helper::get_const_point_map(input_range, np)), - m_normal_map(Point_set_processing_3_np_helper::get_normal_map(input_range, np)), + m_normal_map(Point_set_processing_3_np_helper::get_normal_map(input_range, np)), m_traits(parameters::choose_parameter(parameters::get_parameter(np, internal_np::geom_traits))) { CGAL_precondition(input_range.size() > 0); @@ -190,14 +190,14 @@ namespace Point_set { \brief the average of the maximal point to fitted plane distance in each neighborhood. */ - const FT mean_distance() { + const double mean_distance() { return mean_d; } /*! \brief the average of the maximal normal deviation to fitted plane in each neighborhood. */ - const FT mean_deviation() { + const double mean_deviation() { return mean_dev; } /// @} @@ -211,8 +211,8 @@ namespace Point_set { Seed_range m_ordered; std::vector m_scores; - FT mean_d; - FT mean_dev; + double mean_d; + double mean_dev; void compute_scores() { @@ -232,12 +232,12 @@ namespace Point_set { auto plane = p.first; - FT max_dist = 0; - FT max_dev = 0; + double max_dist = 0; + double max_dev = 0; for (const Item &n : neighbors) { - FT d = (get(m_point_map, n) - plane.point()) * plane.orthogonal_vector(); - FT dev = acos(CGAL::abs(get(m_normal_map, n) * plane.orthogonal_vector())); + double d = CGAL::to_double((get(m_point_map, n) - plane.point()) * plane.orthogonal_vector()); + double dev = acos(CGAL::to_double(CGAL::abs(get(m_normal_map, n) * plane.orthogonal_vector()))); if (d > max_dist) max_dist = d; diff --git a/Shape_detection/test/Shape_detection/test_region_growing_on_point_set_3_with_sorting.cpp b/Shape_detection/test/Shape_detection/test_region_growing_on_point_set_3_with_sorting.cpp index a110f376a22f..811f4095f768 100644 --- a/Shape_detection/test/Shape_detection/test_region_growing_on_point_set_3_with_sorting.cpp +++ b/Shape_detection/test/Shape_detection/test_region_growing_on_point_set_3_with_sorting.cpp @@ -30,7 +30,7 @@ using Normal_map = typename Input_range::Vector_map; using Neighbor_query = SD::Point_set::K_neighbor_query; using Plane_region = SD::Point_set::Least_squares_plane_fit_region; -using Plane_sorting = SD::Point_set::Least_squares_plane_fit_sorting; +using Plane_sorting = SD::Point_set::Least_squares_plane_fit_sorting; using Sphere_region = SD::Point_set::Least_squares_sphere_fit_region; using Sphere_sorting = SD::Point_set::Least_squares_sphere_fit_sorting; using Cylinder_region = SD::Point_set::Least_squares_cylinder_fit_region; diff --git a/Shape_detection/test/Shape_detection/test_region_growing_strict.cpp b/Shape_detection/test/Shape_detection/test_region_growing_strict.cpp index 82ed06f3ca44..7f6030e1876b 100644 --- a/Shape_detection/test/Shape_detection/test_region_growing_strict.cpp +++ b/Shape_detection/test/Shape_detection/test_region_growing_strict.cpp @@ -312,7 +312,7 @@ bool test_planes_points_with_normals() { using Neighbor_query = CGAL::Shape_detection::Point_set::K_neighbor_query; using Region_type = CGAL::Shape_detection::Point_set::Least_squares_plane_fit_region; - using Sorting_type = CGAL::Shape_detection::Point_set::Least_squares_plane_fit_sorting; + using Sorting_type = CGAL::Shape_detection::Point_set::Least_squares_plane_fit_sorting; using Region_growing = CGAL::Shape_detection::Region_growing; // Create parameter classes. From 78af7b96f0faf5b23fc77f2446b8b82c867ef0c8 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Fri, 13 Sep 2024 10:11:18 +0200 Subject: [PATCH 191/348] Update OpenMesh version extraction logic in CMake script --- .../display-third-party-libs-versions.cmake | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Installation/cmake/modules/display-third-party-libs-versions.cmake b/Installation/cmake/modules/display-third-party-libs-versions.cmake index de66bcd446cf..fa344cc04d6f 100644 --- a/Installation/cmake/modules/display-third-party-libs-versions.cmake +++ b/Installation/cmake/modules/display-third-party-libs-versions.cmake @@ -74,10 +74,19 @@ function(check_library cgal_3rdparty_lib) elseif(${cgal_3rdparty_lib} STREQUAL "ITT") get_library_version("${ITT_INCLUDE_DIR}/ittnotify.h" "ITT_MAJOR" "ITT_MINOR" "" version_var) elseif(${cgal_3rdparty_lib} STREQUAL "OpenMesh") - set(CONFIG_FILE_PATH "${OpenMesh_DIR}/OpenMeshConfig-release.cmake") - file(READ ${CONFIG_FILE_PATH} FILE_CONTENT) - if("${FILE_CONTENT}" MATCHES "IMPORTED_LOCATION_RELEASE[ \t]+\".*\\.so\\.([0-9]+\\.[0-9]+)\"") - set(version_var "${CMAKE_MATCH_1}") + if (TARGET OpenMeshCore) + get_target_property(OpenMesh_INCLUDE_DIRS OpenMeshCore INTERFACE_INCLUDE_DIRECTORIES) + set(CONFIG_FILE_PATH "${OpenMesh_INCLUDE_DIRS}/OpenMesh/Core/System/config.h") + if(EXISTS ${CONFIG_FILE_PATH}) + file(READ ${CONFIG_FILE_PATH} CONFIG_CONTENT) + if("${CONFIG_CONTENT}" MATCHES "#define[ \t]+OM_VERSION[ \t]+(0x[0-9A-F]+)") + set(VERSION_HEX ${CMAKE_MATCH_1}) + math(EXPR VERSION_MAJOR "(${VERSION_HEX} & 0xF0000) >> 16") + math(EXPR VERSION_MINOR "(${VERSION_HEX} & 0x0FF00) >> 8") + math(EXPR VERSION_PATCH "(${VERSION_HEX} & 0x000FF)") + set(version_var "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") + endif() + endif() endif() endif() if(version_var) From 021eeb6ee7df6816ac1309d5d0bdadab743d4c04 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Fri, 13 Sep 2024 11:58:10 +0200 Subject: [PATCH 192/348] Update build type display in test result page --- Maintenance/test_handling/create_testresult_page | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Maintenance/test_handling/create_testresult_page b/Maintenance/test_handling/create_testresult_page index 9519b5dce1ee..6338c5f2fa89 100755 --- a/Maintenance/test_handling/create_testresult_page +++ b/Maintenance/test_handling/create_testresult_page @@ -472,7 +472,7 @@ sub print_platform_descriptions() - + @@ -525,7 +525,7 @@ EOF ($platform_is_optimized{$pf}) = ($tmp[1] =~ m|([-/]x?O[1-9])|); $_ = ; chomp; - my $build_type = $platform_is_optimized{$pf} ? "RELEASE" : "DEBUG"; + my $build_type = $platform_is_optimized{$pf} ? " - " : "YES"; print OUTPUT "\n"; print OUTPUT "\n"; print OUTPUT "\n"; @@ -534,7 +534,7 @@ EOF print OUTPUT "\n"; print OUTPUT "\n"; print OUTPUT "\n"; - print OUTPUT "\n"; + print OUTPUT "\n"; $index = 8; while ($index) { $index--; From f7320ae1c1af11cdef3da5b3520626088e3912f0 Mon Sep 17 00:00:00 2001 From: albert-github Date: Fri, 13 Sep 2024 17:53:05 +0200 Subject: [PATCH 193/348] Spelling corrections Spelling corrections --- .../demo/CGAL_ipelets/include/CGAL_ipelets/k_delaunay.h | 6 +++--- Kernel_23/include/CGAL/Kernel/function_objects.h | 4 ++-- .../test/Polygon_mesh_processing/test_pmp_clip.cpp | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CGAL_ipelets/demo/CGAL_ipelets/include/CGAL_ipelets/k_delaunay.h b/CGAL_ipelets/demo/CGAL_ipelets/include/CGAL_ipelets/k_delaunay.h index 7709eb5df26b..567ca6c42ad0 100644 --- a/CGAL_ipelets/demo/CGAL_ipelets/include/CGAL_ipelets/k_delaunay.h +++ b/CGAL_ipelets/demo/CGAL_ipelets/include/CGAL_ipelets/k_delaunay.h @@ -30,17 +30,17 @@ void k_delaunay(Regular& rt,input_DS& input_wpt,int order){ typedef typename Kernel::Point_2 Point_2; typedef typename Kernel::Weighted_point_2 Weighted_point_2; - std::vector Current_sel;//DS that will contain all possible combinaisons of k points (iterator), where k is the order + std::vector Current_sel;//DS that will contain all possible combinations of k points (iterator), where k is the order typename input_DS::iterator it_wpt = input_wpt.begin(); typename input_DS::iterator stop_combi = input_wpt.end(); for(int i=0;i FT operator()( const T1& t1, const T2& t2) const @@ -1108,7 +1108,7 @@ namespace CommonKernelFunctors { public: typedef FT result_type; - // There are 25 combinaisons, we use a template. + // There are 25 combinations, we use a template. template FT operator()( const T1& t1, const T2& t2) const diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_clip.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_clip.cpp index c95af371fcbd..1c00e06c2006 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_clip.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_clip.cpp @@ -387,7 +387,7 @@ void test() assert(vertices(tm1).size() == 0); } - // test combinaison of use_compact_clipper and clip_volume + // test combinations of use_compact_clipper and clip_volume { TriangleMesh tm1; std::ifstream("data-coref/cube.off") >> tm1; From 0306f70bb083ea1f58482955d542d49cd2acdd51 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Sun, 15 Sep 2024 21:06:26 +0200 Subject: [PATCH 194/348] update the Github Action workflows for /build:* of doc --- .github/workflows/build_doc.yml | 192 ++++++++++++++++++++----------- .github/workflows/delete_doc.yml | 16 ++- 2 files changed, 134 insertions(+), 74 deletions(-) diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index 9735cd3d3c84..9e3eadd8464f 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -1,56 +1,104 @@ name: Documentation on: + workflow_dispatch: + inputs: + pr_number: + description: 'Pull request number for which the documentation should be built' + type: number + required: true + doc_version: + description: 'Version number of the documentation build' + type: string + required: true + force_build: + description: 'Force the build of the documentation' + type: boolean + required: false + default: false + issue_comment: - types: [created] + types: [created] + +env: + author_association: ${{ github.event.comment.author_association }} + comment_body: ${{ github.event.comment.body }} permissions: contents: read # to fetch code (actions/checkout) jobs: - build: + pre_build_checks: + runs-on: ubuntu-latest + name: Checks if the workflow should be executed + outputs: + force_build: ${{ steps.check_comment_body.outputs.force_build }} + pr_number: ${{ steps.get_pr_number.outputs.pr_number }} + doc_version: ${{ steps.get_doc_version.outputs.result }} + steps: + - name: Display inputs + run: | + echo "pr_number=${{ inputs.pr_number || github.event.issue.number }}" + echo "doc_version=${{ inputs.doc_version }}" + echo "force_build=${{ inputs.force_build || startsWith(env.comment_body, '/force-build:') }}" + - name: Check comment body + id: check_comment_body + env: + trigger_build: ${{ inputs.pr_number || startsWith(env.comment_body, '/build:') || startsWith(env.comment_body, '/force-build:') }} + force_build: ${{ inputs.force_build || startsWith(env.comment_body, '/force-build:') }} + if: inputs.pr_number || startsWith(env.comment_body, '/build:') || startsWith(env.comment_body, '/force-build:') + run: | + if [ "${trigger_build}" = "false" ]; then + echo "No build requested" + exit 1 + fi + echo "force_build=${force_build}" >> $GITHUB_OUTPUT + + - name: Check permissions + id: check_permissions + if: inputs.pr_number || env.author_association == 'OWNER' || env.author_association == 'MEMBER' + run: echo "Authorized" + + - name: Get PR number + id: get_pr_number + env: + pr_number: ${{ inputs.pr_number || github.event.issue.number }} + run: echo "pr_number=${{ inputs.pr_number }}" >> $GITHUB_OUTPUT + - name: Get doc version + uses: actions/github-script@v7 + id: get_doc_version + with: + result-encoding: string + script: | + if ( context.payload.inputs.doc_version ) { + return context.payload.inputs.doc_version + } + const body = context.payload.comment.body + const re = /\/(force-)?build:(\w+)\s*/; + if(re.test(body)) { + const res = re.exec(body) + return res[2] + } + throw new Error('No version found') + + build_doc: + name: Build PR Documentation + needs: pre_build_checks permissions: contents: read # to fetch code (actions/checkout) pull-requests: write # to create comment - runs-on: ubuntu-latest + env: + force_build: ${{ needs.pre_build_checks.outputs.force_build }} + pr_number: ${{ needs.pre_build_checks.outputs.pr_number }} + doc_version: ${{ needs.pre_build_checks.outputs.doc_version }} steps: - - uses: actions/github-script@v7 - id: get_round - with: - result-encoding: string - script: | - const asso = context.payload.comment.author_association - if(asso == 'OWNER' || asso == 'MEMBER') { - const body = context.payload.comment.body - if(body.includes("build:")) { - const re = /\/(force-)?build:(\w+)\s*/; - if(re.test(body)){ - const res = re.exec(body) - if(body.includes("force-")) { - return res[2]+":yes" - } - else{ - return res[2]+":no" - } - } - } - } - return 'stop' - - uses: actions/github-script@v7 - if: steps.get_round.outputs.result != 'stop' - id: get_pr_number - with: - result-encoding: string - script: | - //get pullrequest url - const pr_number = context.payload.issue.number - return pr_number - name: Emoji-comment + if: github.event_name == 'issue_comment' + continue-on-error: true uses: actions/github-script@v7 - if: steps.get_round.outputs.result != 'stop' with: script: | github.rest.reactions.createForIssueComment({ @@ -62,17 +110,23 @@ jobs: - uses: actions/checkout@v4 name: "checkout branch" - if: steps.get_round.outputs.result != 'stop' with: - repository: ${{ github.repository }} - ref: refs/pull/${{ steps.get_pr_number.outputs.result }}/merge - fetch-depth: 2 + repository: ${{ github.repository }} + ref: refs/pull/${{ env.pr_number }}/head + fetch-depth: 0 - - name: install dependencies - if: steps.get_round.outputs.result != 'stop' + - name: Install dependencies run: | set -x - sudo apt-get update && sudo apt-get install -y graphviz ssh bibtex2html + + # Install Github CLI `gh` + (type -p wget >/dev/null || (sudo apt update && sudo apt-get install wget -y)) + sudo mkdir -p -m 755 /etc/apt/keyrings + wget -qO- https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null + sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null + + sudo apt-get update && sudo apt-get install -y gh cmake graphviz ssh bibtex2html sudo pip install lxml sudo pip install pyquery wget --no-verbose -O doxygen_exe https://cgal.geometryfactory.com/~cgaltest/doxygen_1_9_6_patched/doxygen @@ -81,36 +135,40 @@ jobs: git config --global user.email "cgal@geometryfactory.com" git config --global user.name "cgaltest" - - name: configure all - if: steps.get_round.outputs.result != 'stop' + - name: CMake configuration of Documentation/doc run: | set -ex mkdir -p build_doc && cd build_doc && cmake ../Documentation/doc - - name: Build and Upload Doc + - name: Build and upload Doc id: build_and_run - if: steps.get_round.outputs.result != 'stop' + env: + GH_TOKEN: ${{ github.token }} run: | set -ex - PR_NUMBER=${{ steps.get_pr_number.outputs.result }} - TMP_ROUND=${{ steps.get_round.outputs.result }} - ROUND=$(echo $TMP_ROUND | cut -d ":" -f 1) - force=$(echo $TMP_ROUND | cut -d ":" -f 2) - wget --no-verbose cgal.github.io -O tmp.html - if ! egrep -q "\/$PR_NUMBER\/$ROUND" tmp.html || [ "$force" = "yes" ]; then + PR_NUMBER=$pr_number + ROUND=$doc_version + force=$force_build + wget --no-verbose cgal.github.io -O index.html + if ! egrep -qF "/$PR_NUMBER/$ROUND" index.html || [ "$force" = "yes" ]; then #list impacted packages - LIST_OF_PKGS=$(git diff --name-only HEAD^1 HEAD |cut -s -d/ -f1 |sort -u | xargs -I {} echo {} && ls -d {}/package_info 2>/dev/null |cut -d/ -f1 |egrep -v Installation||true) + LIST_OF_PKGS=$(git diff --name-only origin/master...HEAD |cut -s -d/ -f1 |sort -u | xargs -I {} echo {} && ls -d {}/package_info 2>/dev/null |cut -d/ -f1 |egrep -v Installation||true) if [ "$LIST_OF_PKGS" = "" ]; then echo "DoxygenError=No package affected." >> $GITHUB_OUTPUT exit 1 fi + for p in $LIST_OF_PKGS; do + if [ -f $p/doc/$p/dependencies ]; then + LIST_OF_PKGS="$LIST_OF_PKGS $(cat $p/doc/$p/dependencies)" + fi + done + LIST_OF_PKGS=$(echo $LIST_OF_PKGS | tr ' ' '\n' | sort -u) cd build_doc && make -j$(nproc) doc - make -j$(nproc) doc_with_postprocessing 2>tmp.log - if [ -s tmp.log ]; then - content=`cat ./tmp.log` + make -j$(nproc) doc_with_postprocessing 2>build.log + if [ -s build.log ]; then delimiter="$(openssl rand -hex 8)" echo "DoxygenError<<${delimiter}" >> "${GITHUB_OUTPUT}" - cat tmp.log >> "${GITHUB_OUTPUT}" + cat build.log >> "${GITHUB_OUTPUT}" echo "${delimiter}" >> "${GITHUB_OUTPUT}" exit 1 fi @@ -118,18 +176,16 @@ jobs: git clone https://CGAL:${{ secrets.PUSH_TO_CGAL_GITHUB_IO_TOKEN }}@github.com/CGAL/cgal.github.io.git mkdir -p cgal.github.io/${PR_NUMBER}/$ROUND rm cgal.github.io/${PR_NUMBER}/$ROUND/* -rf - for f in $LIST_OF_PKGS + for f in $LIST_OF_PKGS Manual do if [ -d ./build_doc/doc_output/$f ]; then cp -r ./build_doc/doc_output/$f ./cgal.github.io/${PR_NUMBER}/$ROUND fi done - cp -r ./build_doc/doc_output/Manual ./cgal.github.io/${PR_NUMBER}/$ROUND cd ./cgal.github.io - egrep -v " ${PR_NUMBER}\." index.html > tmp.html || true - echo "
  • Manual for PR ${PR_NUMBER} ($ROUND).
  • " >> ./tmp.html - mv tmp.html index.html - git add ${PR_NUMBER}/$ROUND index.html && git commit -q --amend -m "base commit" && git push -q -f -u origin master + echo "
  • Manual for PR ${PR_NUMBER} ($ROUND).
  • " >> ./index.html + ./cleanup.bash + git add ${PR_NUMBER}/$ROUND index.html && git commit -q --amend -m "sole commit" && git push -q -f -u origin master else echo "DoxygenError=This round already exists. Overwrite it with /force-build." >> $GITHUB_OUTPUT exit 1 @@ -137,13 +193,11 @@ jobs: - name: Post address uses: actions/github-script@v7 - if: ${{ success() && steps.get_round.outputs.result != 'stop' }} + if: ${{ success() }} with: script: | - const tmp_round = "${{ steps.get_round.outputs.result }}"; - const id = tmp_round.indexOf(":"); - const round = tmp_round.substring(0,id); - const address = "The documentation is built. It will be available, after a few minutes, here: https://cgal.github.io/${{ steps.get_pr_number.outputs.result }}/"+round+"/Manual/index.html" + const round = ${{ env.doc_version }} + const address = "The documentation is built. It will be available, after a few minutes, here: https://cgal.github.io/${{ env.pr_number }}/"+round+"/Manual/index.html" github.rest.issues.createComment({ owner: "CGAL", repo: "cgal", @@ -155,7 +209,7 @@ jobs: env: ERRORMSG: ${{steps.build_and_run.outputs.DoxygenError}} uses: actions/github-script@v7 - if: ${{ failure() && steps.get_round.outputs.result != 'stop' }} + if: ${{ failure() }} with: script: | const error = process.env.ERRORMSG diff --git a/.github/workflows/delete_doc.yml b/.github/workflows/delete_doc.yml index 0910e74ef3be..00fd3bac27a3 100644 --- a/.github/workflows/delete_doc.yml +++ b/.github/workflows/delete_doc.yml @@ -1,27 +1,33 @@ name: Documentation Removal on: + workflow_dispatch: + inputs: + PR_NUMBER: + description: 'Pull request number for which the documentation should be removed' + type: number + required: true pull_request_target: - types: [closed, removed, workflow_dispatch] + types: [closed] permissions: contents: read jobs: - build: - + delete_doc: permissions: contents: write # for Git to git push runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: delete directory + - name: delete directory ${{ github.event.inputs.PR_NUMBER || github.event.pull_request.number }}/ in cgal.github.io + env: + PR_NUMBER: ${{ github.event.inputs.PR_NUMBER || github.event.pull_request.number }} run: | set -x git config --global user.email "cgal@geometryfactory.com" git config --global user.name "cgaltest" git clone https://CGAL:${{ secrets.PUSH_TO_CGAL_GITHUB_IO_TOKEN }}@github.com/CGAL/cgal.github.io.git - PR_NUMBER=$(python -c "import json; import os; y = json.load(open(os.environ['GITHUB_EVENT_PATH'])); print(y[\"number\"])") cd cgal.github.io/ egrep -v " ${PR_NUMBER}\." index.html > tmp.html || true if [ -n "$(diff -q ./index.html ./tmp.html)" ]; then From 5e6f624dc927847088684c4ced657fbea1ca5a6c Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Sun, 15 Sep 2024 22:14:19 +0200 Subject: [PATCH 195/348] Update build_doc.yml --- .github/workflows/build_doc.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index 9e3eadd8464f..83a228fe3bca 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -44,8 +44,8 @@ jobs: - name: Check comment body id: check_comment_body env: - trigger_build: ${{ inputs.pr_number || startsWith(env.comment_body, '/build:') || startsWith(env.comment_body, '/force-build:') }} - force_build: ${{ inputs.force_build || startsWith(env.comment_body, '/force-build:') }} + trigger_build: ${{ inputs && inputs.pr_number || startsWith(env.comment_body, '/build:') || startsWith(env.comment_body, '/force-build:') }} + force_build: ${{ inputs && inputs.force_build || startsWith(env.comment_body, '/force-build:') }} if: inputs.pr_number || startsWith(env.comment_body, '/build:') || startsWith(env.comment_body, '/force-build:') run: | if [ "${trigger_build}" = "false" ]; then @@ -55,15 +55,20 @@ jobs: echo "force_build=${force_build}" >> $GITHUB_OUTPUT - name: Check permissions - id: check_permissions if: inputs.pr_number || env.author_association == 'OWNER' || env.author_association == 'MEMBER' run: echo "Authorized" + - name: No permissions + if: ! inputs.pr_number && env.author_association != 'OWNER' || env.author_association != 'MEMBER' + run: | + echo "Not Authorized" + exit 1 + - name: Get PR number id: get_pr_number env: pr_number: ${{ inputs.pr_number || github.event.issue.number }} - run: echo "pr_number=${{ inputs.pr_number }}" >> $GITHUB_OUTPUT + run: echo "pr_number=$pr_number" >> $GITHUB_OUTPUT - name: Get doc version uses: actions/github-script@v7 From 71dd7188faa8a65589505abbd291711b1911fadd Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Sun, 15 Sep 2024 22:22:01 +0200 Subject: [PATCH 196/348] update --- .github/workflows/build_doc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index 83a228fe3bca..fa8b803f041d 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -59,7 +59,7 @@ jobs: run: echo "Authorized" - name: No permissions - if: ! inputs.pr_number && env.author_association != 'OWNER' || env.author_association != 'MEMBER' + if: ${{ ! inputs.pr_number && env.author_association != 'OWNER' && env.author_association != 'MEMBER' }} run: | echo "Not Authorized" exit 1 From e20d663ef790cc72c131f71da359a7032cd8276e Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Sun, 15 Sep 2024 22:24:29 +0200 Subject: [PATCH 197/348] update --- .github/workflows/build_doc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index fa8b803f041d..017e8b66e883 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -76,7 +76,7 @@ jobs: with: result-encoding: string script: | - if ( context.payload.inputs.doc_version ) { + if ( context.payload.input && context.payload.inputs.doc_version ) { return context.payload.inputs.doc_version } const body = context.payload.comment.body From d73be1db7f78cef878f83e04af5ad09678a9ca4f Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Sun, 15 Sep 2024 22:30:38 +0200 Subject: [PATCH 198/348] update --- .github/workflows/build_doc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index 017e8b66e883..05a3946044d2 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -201,7 +201,7 @@ jobs: if: ${{ success() }} with: script: | - const round = ${{ env.doc_version }} + const round = "${{ env.doc_version }}"" const address = "The documentation is built. It will be available, after a few minutes, here: https://cgal.github.io/${{ env.pr_number }}/"+round+"/Manual/index.html" github.rest.issues.createComment({ owner: "CGAL", From 420ed32ef66f40be3593843320e9794c84a17c57 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Sun, 15 Sep 2024 22:37:57 +0200 Subject: [PATCH 199/348] [skip ci] update --- .github/workflows/build_doc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index 05a3946044d2..ba15781ddeb9 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -201,7 +201,7 @@ jobs: if: ${{ success() }} with: script: | - const round = "${{ env.doc_version }}"" + const round = "${{ env.doc_version }}" const address = "The documentation is built. It will be available, after a few minutes, here: https://cgal.github.io/${{ env.pr_number }}/"+round+"/Manual/index.html" github.rest.issues.createComment({ owner: "CGAL", From a69ff37004d027cc79b42f8afd6dadc9e45bf544 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 17 Sep 2024 09:51:55 +0100 Subject: [PATCH 200/348] Cleanup as suggested in Issue 8399 --- BGL/include/CGAL/boost/graph/IO/3MF.h | 6 +++--- HalfedgeDS/include/CGAL/HalfedgeDS_const_decorator.h | 4 ++-- Nef_S2/include/CGAL/Nef_S2/SM_io_parser.h | 5 ++--- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/IO/3MF.h b/BGL/include/CGAL/boost/graph/IO/3MF.h index 33e6c6a823fd..6246950a0d11 100644 --- a/BGL/include/CGAL/boost/graph/IO/3MF.h +++ b/BGL/include/CGAL/boost/graph/IO/3MF.h @@ -59,9 +59,9 @@ bool write_3MF(const std::string& filename, const GraphRange& gs, const std::vector& names #ifndef DOXYGEN_RUNNING - , std::enable_if_t::type>::value>* = nullptr + , std::enable_if_t< + ! internal::is_Point_set_or_Range_or_Iterator< + typename boost::range_value::type>::value>* = nullptr #endif ) { diff --git a/HalfedgeDS/include/CGAL/HalfedgeDS_const_decorator.h b/HalfedgeDS/include/CGAL/HalfedgeDS_const_decorator.h index 14093079bcee..6e3428f98618 100644 --- a/HalfedgeDS/include/CGAL/HalfedgeDS_const_decorator.h +++ b/HalfedgeDS/include/CGAL/HalfedgeDS_const_decorator.h @@ -133,8 +133,8 @@ normalized_border_is_valid( bool verb) const { Halfedge_const_iterator e = hds->halfedges_begin(); size_type count = 0; - while( e != hds->halfedges_end() && ! e->is_border() && ! - e->opposite()->is_border()) { + while( e != hds->halfedges_end() && ! e->is_border() && + ! e->opposite()->is_border()) { ++e; ++e; ++count; diff --git a/Nef_S2/include/CGAL/Nef_S2/SM_io_parser.h b/Nef_S2/include/CGAL/Nef_S2/SM_io_parser.h index 994c6a41b806..06909c029b9d 100644 --- a/Nef_S2/include/CGAL/Nef_S2/SM_io_parser.h +++ b/Nef_S2/include/CGAL/Nef_S2/SM_io_parser.h @@ -241,9 +241,8 @@ bool SM_io_parser::read_edge(SHalfedge_handle e) !(in >> m) || !check_sep(",") || !(in >> k) || !check_sep("}") ) return false; - if (! - (eo >= 0 && eo < en && epr >= 0 && epr < en && ene >= 0 && ene < en && - v >= 0 && v < vn && f >= 0 && f < fn )) + if (! (eo >= 0 && eo < en && epr >= 0 && epr < en && ene >= 0 && ene < en && + v >= 0 && v < vn && f >= 0 && f < fn )) { std::cerr<<"wrong index in read_edge"< Date: Wed, 18 Sep 2024 15:57:37 +0200 Subject: [PATCH 201/348] Add modal popup for TPL version display across platforms --- Maintenance/test_handling/Summary_Script.js | 52 +++++++++++---- .../test_handling/create_testresult_page | 34 +++++++++- Maintenance/test_handling/testresult.css | 63 +++++++++++++++++-- 3 files changed, 131 insertions(+), 18 deletions(-) diff --git a/Maintenance/test_handling/Summary_Script.js b/Maintenance/test_handling/Summary_Script.js index 4c28e55f1092..9b637be6d697 100644 --- a/Maintenance/test_handling/Summary_Script.js +++ b/Maintenance/test_handling/Summary_Script.js @@ -171,8 +171,7 @@ function platformContainer(platforms) { platforms.forEach(platform => { const $container = $('
    ', { class: 'platform ' + platform.name }).appendTo($platformContainer); $container.html(`

    Results of ${platform.name}

    `); - const tplString = platform.third_party_libraries.replace("TPL: ", "").trim(); - const tplArray = tplString.split(",").map(tpl => tpl.trim()).filter(tpl => tpl.length > 0); + const tplArray = platform.tpl; const $toggleButton = $('
    o n rDEBUG/RELEASE CMake BOOST MPFR$tester_name$county$counto$countn$countr$build_typeo n rDEBUG/RELEASEDEBUG? CMake BOOST MPFR$tester_name$county$counto$countn$countr$build_type$build_type
    ', { class: 'tpl-table', css: { display: 'none' } }).appendTo($container); const $thead = $('').appendTo($tplTable); const $tbody = $('').appendTo($tplTable); - - $('').append('').appendTo($thead); - - let $row = $('').appendTo($tbody); - tplArray.forEach((tpl, index) => { - if (index > 0 && index % 5 === 0) { - $row = $('').appendTo($tbody); - } - $('').append('').appendTo($thead); + tplArray.forEach(tpl => { + $('').append( + $('\n
    Third Party Libraries
    ').text(tpl).appendTo($row); + $('
    LibraryVersionStatus
    ').html(`${tpl.name}`), + $('').text(tpl.version || 'N/A'), + $('').text(tpl.status) + ).appendTo($tbody); + }); + $('.tpl-link').click(function(event) { + event.preventDefault(); + const tplName = $(this).data('tpl'); + showVersionsForTPL(tplName); }); const letters = ['n', 'w', 'o', 'r']; @@ -244,6 +246,34 @@ function closeAll() { $('.toggle-button').text('Show More'); } +function showVersionsForTPL(tplName) { + const $modal = $('#tplModal'); + const $modalTitle = $('#tplModalTitle'); + const $modalBody = $('#tplModalBody'); + $modalTitle.text(`Versions of ${tplName} across platforms`); + $modalBody.empty(); + let tplFound = false; + window.data.platforms.forEach(platform => { + const matchingTPL = platform.tpl.find(tpl => tpl.name === tplName); + if (matchingTPL) { + tplFound = true; + $modalBody.append(`

    Platform: ${platform.name} | Version: ${matchingTPL.version || 'N/A'} | Status: ${matchingTPL.status}

    `); + } + }); + if (!tplFound) { + $modalBody.append('

    No versions of this TPL found across platforms.

    '); + } + $modal.show(); + $('.close').click(function() { + $modal.hide(); + }); + $(window).click(function(event) { + if (event.target == $modal[0]) { + $modal.hide(); + } + }); +} + function main() { const url = searchURLs["current"]; $.getJSON(url, data => { diff --git a/Maintenance/test_handling/create_testresult_page b/Maintenance/test_handling/create_testresult_page index 5c2db003f028..dee712a8af69 100755 --- a/Maintenance/test_handling/create_testresult_page +++ b/Maintenance/test_handling/create_testresult_page @@ -754,19 +754,40 @@ sub create_summary_page { my ($platform_num, $platform) = (0, ""); foreach $platform (@platforms_to_do) { my $third_party_libraries = ""; - if (open (PLATFORM_INFO, "results_${platform}.info")) { + my @tpl_list = (); + if (open(PLATFORM_INFO, "results_${platform}.info")) { my $line = ""; while () { $line = $_; if ($line =~ /^TPL:/) { $third_party_libraries = $line; + if ($third_party_libraries =~ /^TPL:\s*(.*)/) { + my $tpl_data = $1; + my @tpls = split /,\s*/, $tpl_data; + foreach my $tpl (@tpls) { + if ($tpl =~ /(.+)\s+not found/i) { + push @tpl_list, { + name => $1, + version => undef, + status => "not found" + }; + } + elsif ($tpl =~ /(.+)\s+(\S+)/) { + push @tpl_list, { + name => $1, + version => $2, + status => "found" + }; + } + } + } } } close PLATFORM_INFO; } my $platform_info = { name => $platform, - third_party_libraries => $third_party_libraries, + tpl => \@tpl_list, test_directories => [], }; foreach my $letter (@letters) { @@ -791,7 +812,7 @@ sub create_summary_page { platforms => \@platforms_data, }; my $json = JSON->new->allow_nonref; - my $json_text = $json->pretty->encode($final_data); + my $json_text = $json->encode($final_data); open my $fh, '>', "$testresult_dir/$release_name/search_index.json" or die "Could not open file: $!"; print $fh $json_text; close $fh; @@ -818,6 +839,13 @@ sub create_summary_page { + ', { class: 'tpl-table', css: { display: 'none' } }).appendTo($container); const $thead = $('').appendTo($tplTable); const $tbody = $('').appendTo($tplTable); - $('').append('').appendTo($thead); + const $headerRow = $(''); + $('').append( $(' + + + + + `); } }); if (!tplFound) { - $modalBody.append('

    No versions of this TPL found across platforms.

    '); + $modalBody.append(''); } $modal.show(); $('.close').click(function() { @@ -272,6 +285,28 @@ function showVersionsForTPL(tplName) { $modal.hide(); } }); + const $thead = $modalTable.find('thead'); + initializeTableSorting($thead, $modalBody); + $thead.find('.sortable').first().click(); +} + +function initializeTableSorting($thead, $tbody) { + let sortOrder = 1; + $thead.find('.sortable').click(function() { + const columnIndex = $(this).data('sort'); + const rows = $tbody.find('tr').get(); + rows.sort((a, b) => { + const keyA = $(a).children('td').eq(columnIndex).text().toUpperCase(); + const keyB = $(b).children('td').eq(columnIndex).text().toUpperCase(); + if (keyA < keyB) return -1 * sortOrder; + if (keyA > keyB) return 1 * sortOrder; + return 0; + }); + $.each(rows, (_index, row) => { + $tbody.append(row); + }); + sortOrder *= -1; + }); } function main() { diff --git a/Maintenance/test_handling/create_testresult_page b/Maintenance/test_handling/create_testresult_page index dee712a8af69..93751be0aae2 100755 --- a/Maintenance/test_handling/create_testresult_page +++ b/Maintenance/test_handling/create_testresult_page @@ -843,7 +843,16 @@ sub create_summary_page {
    LibraryVersionStatus
    ', { class: 'sortable', 'data-sort': 0, text: 'Library' }).appendTo($headerRow); + $('', { class: 'sortable', 'data-sort': 1, text: 'Version' }).appendTo($headerRow); + $('', { class: 'sortable', 'data-sort': 2, text: 'Status' }).appendTo($headerRow); + $headerRow.appendTo($thead); tplArray.forEach(tpl => { $('
    ').html(`${tpl.name}`), @@ -190,6 +194,8 @@ function platformContainer(platforms) { $('').text(tpl.status) ).appendTo($tbody); }); + initializeTableSorting($thead, $tbody); + $thead.find('.sortable').first().click(); $('.tpl-link').click(function(event) { event.preventDefault(); const tplName = $(this).data('tpl'); @@ -249,19 +255,26 @@ function closeAll() { function showVersionsForTPL(tplName) { const $modal = $('#tplModal'); const $modalTitle = $('#tplModalTitle'); - const $modalBody = $('#tplModalBody'); - $modalTitle.text(`Versions of ${tplName} across platforms`); + const $modalTable = $modal.find('table'); + const $modalBody = $modalTable.find('tbody'); $modalBody.empty(); + $modalTitle.text(`Versions of ${tplName} across platforms`); let tplFound = false; window.data.platforms.forEach(platform => { const matchingTPL = platform.tpl.find(tpl => tpl.name === tplName); if (matchingTPL) { tplFound = true; - $modalBody.append(`

    Platform: ${platform.name} | Version: ${matchingTPL.version || 'N/A'} | Status: ${matchingTPL.status}

    `); + $modalBody.append(` +
    No versions of this TPL found across platforms.
    + + + + + + + + +
    PlatformVersionStatus
    diff --git a/Maintenance/test_handling/testresult.css b/Maintenance/test_handling/testresult.css index e4ebd6a74350..7eb5096eba89 100644 --- a/Maintenance/test_handling/testresult.css +++ b/Maintenance/test_handling/testresult.css @@ -170,6 +170,11 @@ TABLE.result TD > a.package_name { color: #1A0DAB; } +.sortable{ + cursor: pointer; + text-decoration: underline; +} + /* TPL Modal */ .modal { display: none; @@ -215,4 +220,26 @@ TABLE.result TD > a.package_name { margin: 10px 0; font-size: 14px; color: #555; +} + +.modaltable{ + border-collapse: collapse; + cellspacing: 0; +} + +.modalHeader{ + text-align: center; + width: auto; +} + +.modalBody { + text-align: center; +} + +.modal-table-row { + border-bottom: 2px ridge #000; +} + +.modal-table-row td { + padding: 7px; } \ No newline at end of file From 7171e826508702a8a310aca7f8496143282f267e Mon Sep 17 00:00:00 2001 From: albert-github Date: Sat, 21 Sep 2024 18:09:38 +0200 Subject: [PATCH 204/348] Correcting permanent redirect in Algebraic_kernel_d Address is a https adddress --- Documentation/doc/biblio/cgal_manual.bib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index 25bb729e33dd..123d187116cc 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -2778,7 +2778,7 @@ @incollection{msri52:liu-snoeyink-05 editor = "Jacob E. Goodman, J\'anos Pach and Emo Welzl", year = {2005}, pages = {439-458}, - URL = {http://library.slmath.org/books/Book52/files/23liu.pdf}, + URL = {https://library.slmath.org/books/Book52/files/23liu.pdf}, publisher = {MSRI Publications} } From 2c8491b2f7526396bc925b03b3dbd3f593a3ef6f Mon Sep 17 00:00:00 2001 From: albert-github Date: Sat, 21 Sep 2024 18:12:15 +0200 Subject: [PATCH 205/348] Incorrect documentation for enums in Three package Documentation of enums in Three package is incorrect due to usage of wrong doxygen comment signs --- Three/include/CGAL/Three/Scene_item.h | 38 ++++++++++---------- Three/include/CGAL/Three/Viewer_interface.h | 40 ++++++++++----------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/Three/include/CGAL/Three/Scene_item.h b/Three/include/CGAL/Three/Scene_item.h index b517a9c91083..4fbe0558392d 100644 --- a/Three/include/CGAL/Three/Scene_item.h +++ b/Three/include/CGAL/Three/Scene_item.h @@ -64,25 +64,25 @@ class SCENE_ITEM_EXPORT Scene_item : public QObject{ */ enum OpenGL_program_IDs { - ROGRAM_WITH_LIGHT = 0, //! Used to render a surface or an edge affected by the light. It uses a per fragment lighting model, and renders the selected item brighter. - PROGRAM_WITHOUT_LIGHT, //! Used to render a polyhedron edge or points. It renders in a uniform color and is not affected by light. \attention It renders the selected item in black. - PROGRAM_NO_SELECTION, //! Used to render a polyline or a surface that is not affected by light, like a cutting plane. It renders in a uniform color that does not change with selection. - PROGRAM_WITH_TEXTURE, //! Used to render a textured polyhedron. Affected by light. - PROGRAM_PLANE_TWO_FACES, //! Used to render a two-faced plane. The two faces have a different color. Not affected by light. - PROGRAM_WITH_TEXTURED_EDGES, //! Used to render the edges of a textured polyhedron. Not affected by light. - PROGRAM_INSTANCED, //! Used to display instanced rendered spheres.Affected by light. - PROGRAM_INSTANCED_WIRE, //! Used to display instanced rendered wired spheres. Not affected by light. - PROGRAM_C3T3, //! Used to render a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Affected by light. - PROGRAM_C3T3_EDGES, //! Used to render the edges of a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Not affected by light. - PROGRAM_CUTPLANE_SPHERES, //! Used to render the spheres of an item with a cut plane. - PROGRAM_SPHERES, //! Used to render one or several spheres. - PROGRAM_DARK_SPHERES, //! Used to render one or several spheres without light (for picking for example). - PROGRAM_FLAT, /** Used to render flat shading without pre computing normals*/ - PROGRAM_OLD_FLAT, /** Used to render flat shading without pre computing normals without geometry shader*/ - PROGRAM_SOLID_WIREFRAME, //! Used to render edges with width superior to 1. - PROGRAM_NO_INTERPOLATION, //! Used to render faces without interpolating their color. - PROGRAM_HEAT_INTENSITY, //! Used to render special item in Heat_method_plugin - NB_OF_PROGRAMS //! Holds the number of different programs in this enum. + ROGRAM_WITH_LIGHT = 0, //!< Used to render a surface or an edge affected by the light. It uses a per fragment lighting model, and renders the selected item brighter. + PROGRAM_WITHOUT_LIGHT, //!< Used to render a polyhedron edge or points. It renders in a uniform color and is not affected by light. \attention It renders the selected item in black. + PROGRAM_NO_SELECTION, //!< Used to render a polyline or a surface that is not affected by light, like a cutting plane. It renders in a uniform color that does not change with selection. + PROGRAM_WITH_TEXTURE, //!< Used to render a textured polyhedron. Affected by light. + PROGRAM_PLANE_TWO_FACES, //!< Used to render a two-faced plane. The two faces have a different color. Not affected by light. + PROGRAM_WITH_TEXTURED_EDGES, //!< Used to render the edges of a textured polyhedron. Not affected by light. + PROGRAM_INSTANCED, //!< Used to display instanced rendered spheres.Affected by light. + PROGRAM_INSTANCED_WIRE, //!< Used to display instanced rendered wired spheres. Not affected by light. + PROGRAM_C3T3, //!< Used to render a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Affected by light. + PROGRAM_C3T3_EDGES, //!< Used to render the edges of a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Not affected by light. + PROGRAM_CUTPLANE_SPHERES, //!< Used to render the spheres of an item with a cut plane. + PROGRAM_SPHERES, //!< Used to render one or several spheres. + PROGRAM_DARK_SPHERES, //!< Used to render one or several spheres without light (for picking for example). + PROGRAM_FLAT, //!< Used to render flat shading without pre computing normals + PROGRAM_OLD_FLAT, //!< Used to render flat shading without pre computing normals without geometry shader + PROGRAM_SOLID_WIREFRAME, //!< Used to render edges with width superior to 1. + PROGRAM_NO_INTERPOLATION, //!< Used to render faces without interpolating their color. + PROGRAM_HEAT_INTENSITY, //!< Used to render special item in Heat_method_plugin + NB_OF_PROGRAMS //!< Holds the number of different programs in this enum. }; typedef CGAL::Bbox_3 Bbox; typedef CGAL::qglviewer::ManipulatedFrame ManipulatedFrame; diff --git a/Three/include/CGAL/Three/Viewer_interface.h b/Three/include/CGAL/Three/Viewer_interface.h index 2bdba0aadd39..63d6824d6132 100644 --- a/Three/include/CGAL/Three/Viewer_interface.h +++ b/Three/include/CGAL/Three/Viewer_interface.h @@ -53,26 +53,26 @@ class VIEWER_EXPORT Viewer_interface : public CGAL::QGLViewer{ */ enum OpenGL_program_IDs { - PROGRAM_WITH_LIGHT = 0, //! Used to render a surface or an edge affected by the light. It uses a per fragment lighting model, and renders the selected item brighter. - PROGRAM_WITHOUT_LIGHT, //! Used to render a polyhedron edge or points. It renders in a uniform color and is not affected by light. \attention It renders the selected item in black. - PROGRAM_NO_SELECTION, //! Used to render a polyline or a surface that is not affected by light, like a cutting plane. It renders in a uniform color that does not change with selection. - PROGRAM_WITH_TEXTURE, //! Used to render a textured polyhedron. Affected by light. - PROGRAM_PLANE_TWO_FACES, //! Used to render a two-faced plane. The two faces have a different color. Not affected by light. - PROGRAM_WITH_TEXTURED_EDGES, //! Used to render the edges of a textured polyhedron. Not affected by light. - PROGRAM_INSTANCED, //! Used to display instanced rendered spheres.Affected by light. - PROGRAM_INSTANCED_WIRE, //! Used to display instanced rendered wired spheres. Not affected by light. - PROGRAM_C3T3, //! Used to render a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Affected by light. - PROGRAM_C3T3_EDGES, //! Used to render the edges of a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Not affected by light. - PROGRAM_CUTPLANE_SPHERES, //! Used to render the spheres of an item with a cut plane. - PROGRAM_SPHERES, //! Used to render one or several spheres. - PROGRAM_DARK_SPHERES, //! Used to render one or several spheres without light (for picking for example). - PROGRAM_FLAT, /** Used to render flat shading without pre computing normals*/ - PROGRAM_OLD_FLAT, /** Used to render flat shading without pre computing normals without geometry shader*/ - PROGRAM_SOLID_WIREFRAME, //! Used to render edges with width superior to 1. - PROGRAM_NO_INTERPOLATION, //! Used to render faces without interpolating their color. - PROGRAM_HEAT_INTENSITY, //! Used to render special item in Heat_method_plugin - PROGRAM_TETRA_FILTERING, //! Used in Scene_tetrahedra_item with Tetrahedra_filtering_plugin - NB_OF_PROGRAMS //! Holds the number of different programs in this enum. + PROGRAM_WITH_LIGHT = 0, //!< Used to render a surface or an edge affected by the light. It uses a per fragment lighting model, and renders the selected item brighter. + PROGRAM_WITHOUT_LIGHT, //!< Used to render a polyhedron edge or points. It renders in a uniform color and is not affected by light. \attention It renders the selected item in black. + PROGRAM_NO_SELECTION, //!< Used to render a polyline or a surface that is not affected by light, like a cutting plane. It renders in a uniform color that does not change with selection. + PROGRAM_WITH_TEXTURE, //!< Used to render a textured polyhedron. Affected by light. + PROGRAM_PLANE_TWO_FACES, //!< Used to render a two-faced plane. The two faces have a different color. Not affected by light. + PROGRAM_WITH_TEXTURED_EDGES, //!< Used to render the edges of a textured polyhedron. Not affected by light. + PROGRAM_INSTANCED, //!< Used to display instanced rendered spheres.Affected by light. + PROGRAM_INSTANCED_WIRE, //!< Used to display instanced rendered wired spheres. Not affected by light. + PROGRAM_C3T3, //!< Used to render a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Affected by light. + PROGRAM_C3T3_EDGES, //!< Used to render the edges of a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Not affected by light. + PROGRAM_CUTPLANE_SPHERES, //!< Used to render the spheres of an item with a cut plane. + PROGRAM_SPHERES, //!< Used to render one or several spheres. + PROGRAM_DARK_SPHERES, //!< Used to render one or several spheres without light (for picking for example). + PROGRAM_FLAT, //!< Used to render flat shading without pre computing normals + PROGRAM_OLD_FLAT, //!< Used to render flat shading without pre computing normals without geometry shader + PROGRAM_SOLID_WIREFRAME, //!< Used to render edges with width superior to 1. + PROGRAM_NO_INTERPOLATION, //!< Used to render faces without interpolating their color. + PROGRAM_HEAT_INTENSITY, //!< Used to render special item in Heat_method_plugin + PROGRAM_TETRA_FILTERING, //!< Used in Scene_tetrahedra_item with Tetrahedra_filtering_plugin + NB_OF_PROGRAMS //!< Holds the number of different programs in this enum. }; //! \brief The viewer's QPainter From 25bd968aa3e58f3270427b1ac880421d044451f9 Mon Sep 17 00:00:00 2001 From: albert-github Date: Sat, 21 Sep 2024 18:52:13 +0200 Subject: [PATCH 206/348] Incorrect documentation of color components in Stream_support The zero-th component is 0, and consequently the first is green, the second is blue and the alpha component is the 3rd. --- Stream_support/include/CGAL/IO/Color.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Stream_support/include/CGAL/IO/Color.h b/Stream_support/include/CGAL/IO/Color.h index daee2d37b403..4345c3dd9d95 100644 --- a/Stream_support/include/CGAL/IO/Color.h +++ b/Stream_support/include/CGAL/IO/Color.h @@ -151,13 +151,13 @@ class Color /*! returns the \f$i^{th}\f$ component of the rgb color (the - \f$0^{th}\f$ is red, the \f$1^{st}\f$ is blue, etc.). + \f$0^{th}\f$ is red, the \f$1^{st}\f$ is green, the \f$2^{nd}\f$ is blue and the \f$3^{rd}\f$ is alpha). */ unsigned char operator[] (std::size_t i) const { return m_data[i]; } /*! - returns a reference on the \f$i^{th}\f$ component of `c` (the - \f$0^{th}\f$ is red, the \f$1^{st}\f$ is blue, etc.). + returns a reference on the \f$i^{th}\f$ component of the rgb color (the + \f$0^{th}\f$ is red, the \f$1^{st}\f$ is green, the \f$2^{nd}\f$ is blue and the \f$3^{rd}\f$ is alpha). */ unsigned char& operator[] (std::size_t i) { return m_data[i]; } From 264278b6cc080558d88bf6429dcf425edaf1f0b7 Mon Sep 17 00:00:00 2001 From: rachit mehta <23110261@iitgn.ac.in> Date: Mon, 23 Sep 2024 11:38:02 +0530 Subject: [PATCH 207/348] Issue #8488 --- Three/include/CGAL/Three/Triangle_container.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Three/include/CGAL/Three/Triangle_container.h b/Three/include/CGAL/Three/Triangle_container.h index cc9ded272b47..5bd1a1dc31a8 100644 --- a/Three/include/CGAL/Three/Triangle_container.h +++ b/Three/include/CGAL/Three/Triangle_container.h @@ -49,7 +49,7 @@ struct DEMO_FRAMEWORK_EXPORT Triangle_container :public Primitive_container VColors, //!< Designates the buffer that contains the colors of the smooth vertices. FColors, //!< Designates the buffer that contains the colors of the flat vertices. Texture_map, //!< Designates the buffer that contains the UV map for the texture. - Distances, + Distances, //!< Designates the buffer that contains the distance values for vertices or facets Subdomain_indices, //!< Designates the buffer that contains the subdomains of both cells defining a c3t3 facet. NbOfVbos //!< Designates the size of the VBOs vector for `Triangle_container`s }; From e9c84037e58a0c68913c01cdf581a5a5524f659f Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 23 Sep 2024 12:18:48 +0200 Subject: [PATCH 208/348] try to fix build_doc [skip ci] --- .github/workflows/build_doc.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index ba15781ddeb9..7bc426e252eb 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -32,6 +32,7 @@ jobs: runs-on: ubuntu-latest name: Checks if the workflow should be executed outputs: + trigger_build: ${{ steps.get_doc_version.outputs.result && steps.get_doc_version.outputs.result != '' }} force_build: ${{ steps.check_comment_body.outputs.force_build }} pr_number: ${{ steps.get_pr_number.outputs.pr_number }} doc_version: ${{ steps.get_doc_version.outputs.result }} @@ -53,24 +54,27 @@ jobs: exit 1 fi echo "force_build=${force_build}" >> $GITHUB_OUTPUT + echo "trigger_build=${trigger_build}" >> $GITHUB_OUTPUT - name: Check permissions - if: inputs.pr_number || env.author_association == 'OWNER' || env.author_association == 'MEMBER' + if: ${{ fromJSON(steps.check_comment_body.outputs.trigger_build) }} && (inputs.pr_number || env.author_association == 'OWNER' || env.author_association == 'MEMBER') run: echo "Authorized" - name: No permissions - if: ${{ ! inputs.pr_number && env.author_association != 'OWNER' && env.author_association != 'MEMBER' }} + if: ${{ fromJSON(steps.check_comment_body.outputs.trigger_build) }} && (! inputs.pr_number && env.author_association != 'OWNER' && env.author_association != 'MEMBER' ) run: | - echo "Not Authorized" + echo 'ERROR: User ${{ github.actor }} is not allowed to trigger the build of the documentation with /build:* or /force-build:*' exit 1 - name: Get PR number + if: ${{ fromJSON(steps.check_comment_body.outputs.trigger_build) }} id: get_pr_number env: pr_number: ${{ inputs.pr_number || github.event.issue.number }} run: echo "pr_number=$pr_number" >> $GITHUB_OUTPUT - name: Get doc version + if: ${{ fromJSON(steps.check_comment_body.outputs.trigger_build) }} uses: actions/github-script@v7 id: get_doc_version with: @@ -98,6 +102,7 @@ jobs: force_build: ${{ needs.pre_build_checks.outputs.force_build }} pr_number: ${{ needs.pre_build_checks.outputs.pr_number }} doc_version: ${{ needs.pre_build_checks.outputs.doc_version }} + if: ${{ fromJSON(needs.pre_build_checks.outputs.trigger_build) }} steps: - name: Emoji-comment From c64394274bcc9b33b888918dc09a22ce8279c5ec Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 23 Sep 2024 15:22:48 +0200 Subject: [PATCH 209/348] Add logic to copy Summary_Script.js to test result dir --- Maintenance/test_handling/create_testresult_page | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Maintenance/test_handling/create_testresult_page b/Maintenance/test_handling/create_testresult_page index 4cca82479b4e..63e7a74101eb 100755 --- a/Maintenance/test_handling/create_testresult_page +++ b/Maintenance/test_handling/create_testresult_page @@ -17,6 +17,7 @@ use Cwd; use strict; use Date::Format; use JSON; +use File::Copy; my $server_url="https://cgal.geometryfactory.com/"; my $cgal_members="${server_url}CGAL/Members/"; @@ -752,7 +753,9 @@ sub create_summary_page { my @letters = ('r', 'n', 'w', 'o'); my $letters_options = join("\n", map { "" } @letters); my $package_options = join("\n", map { "" } sort keys %test_directories); - + my $summary_script_src = "$testresult_dir/../Summary_Script.js"; + my $summary_script_dest = "$testresult_dir/$release_name/Summary_Script.js"; + my $summary_page_path = "$testresult_dir/summary".substr($release_name,4).".html"; my @platforms_data; my ($platform_num, $platform) = (0, ""); foreach $platform (@platforms_to_do) { @@ -887,10 +890,13 @@ sub create_summary_page {
    - + EOF - - my $summary_page_path = "$testresult_dir/summary".substr($release_name,4).".html"; + if (-e $summary_script_src) { + copy($summary_script_src, $summary_script_dest) or die "Copy failed: $!"; + } else { + die "Source file $summary_script_src does not exist."; + } open(my $out, '>', $summary_page_path) or die "Could not open file '$summary_page_path' $!"; print $out $Summary_output; From 634e9ac787dd04ba741e173cdd6004c3b9bd63a5 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 23 Sep 2024 14:35:38 +0200 Subject: [PATCH 210/348] actual fix of build_doc.yml [skip ci] --- .github/workflows/build_doc.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index 7bc426e252eb..cf84d97dfd11 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -1,4 +1,4 @@ -name: Documentation +name: Build Documentation on: workflow_dispatch: @@ -30,7 +30,7 @@ permissions: jobs: pre_build_checks: runs-on: ubuntu-latest - name: Checks if the workflow should be executed + name: Trigger the build? outputs: trigger_build: ${{ steps.get_doc_version.outputs.result && steps.get_doc_version.outputs.result != '' }} force_build: ${{ steps.check_comment_body.outputs.force_build }} @@ -57,24 +57,24 @@ jobs: echo "trigger_build=${trigger_build}" >> $GITHUB_OUTPUT - name: Check permissions - if: ${{ fromJSON(steps.check_comment_body.outputs.trigger_build) }} && (inputs.pr_number || env.author_association == 'OWNER' || env.author_association == 'MEMBER') + if: ( steps.check_comment_body.outputs.trigger_build || false ) && (inputs.pr_number || env.author_association == 'OWNER' || env.author_association == 'MEMBER') run: echo "Authorized" - name: No permissions - if: ${{ fromJSON(steps.check_comment_body.outputs.trigger_build) }} && (! inputs.pr_number && env.author_association != 'OWNER' && env.author_association != 'MEMBER' ) + if: ( steps.check_comment_body.outputs.trigger_build || false ) && (! inputs.pr_number && env.author_association != 'OWNER' && env.author_association != 'MEMBER' ) run: | echo 'ERROR: User ${{ github.actor }} is not allowed to trigger the build of the documentation with /build:* or /force-build:*' exit 1 - name: Get PR number - if: ${{ fromJSON(steps.check_comment_body.outputs.trigger_build) }} + if: ( steps.check_comment_body.outputs.trigger_build || false ) id: get_pr_number env: pr_number: ${{ inputs.pr_number || github.event.issue.number }} run: echo "pr_number=$pr_number" >> $GITHUB_OUTPUT - name: Get doc version - if: ${{ fromJSON(steps.check_comment_body.outputs.trigger_build) }} + if: ( steps.check_comment_body.outputs.trigger_build || false ) uses: actions/github-script@v7 id: get_doc_version with: @@ -92,7 +92,8 @@ jobs: throw new Error('No version found') build_doc: - name: Build PR Documentation + name: | + ${{ format('{0}: Build Documentation version "{1}"', github.actor, needs.pre_build_checks.outputs.doc_version) }} needs: pre_build_checks permissions: contents: read # to fetch code (actions/checkout) From 6b366985e18fba5d3694d76e2c67a1a8f0c0d268 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 23 Sep 2024 14:35:38 +0200 Subject: [PATCH 211/348] actual fix of build_doc.yml [skip ci] --- .github/workflows/build_doc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index cf84d97dfd11..e0813de02369 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -103,7 +103,7 @@ jobs: force_build: ${{ needs.pre_build_checks.outputs.force_build }} pr_number: ${{ needs.pre_build_checks.outputs.pr_number }} doc_version: ${{ needs.pre_build_checks.outputs.doc_version }} - if: ${{ fromJSON(needs.pre_build_checks.outputs.trigger_build) }} + if: ${{ fromJSON(needs.pre_build_checks.outputs.trigger_build || false) }} steps: - name: Emoji-comment From 4dfb8d30fc728d2acf2b5ddfc1e1a5c130575f14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 24 Sep 2024 15:37:04 +0200 Subject: [PATCH 212/348] update tested branches --- .../bin/create_internal_release_of_the_day.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py index ab1b640f42a9..8448203c6738 100644 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py +++ b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py @@ -8,17 +8,17 @@ import datetime import locale import argparse -from cgal_release import release, integration, master, beta_release, master, beta_release_from_master +from cgal_release import release, integration, master, beta_release, beta_release_from_master # Define a dictionary that maps day of the week to an action actions = { "Monday": integration, - "Tuesday": release("5.5"), #integration, - "Wednesday": release("5.6"), #integration, + "Tuesday": integration, + "Wednesday": integration, "Thursday": integration, "Friday": release("5.5"), "Saturday": release("5.6"), - "Sunday": beta_release_from_master(2), + "Sunday": master, } From 4b17391d0e5b38ca93b206a21b4eed4e84443b8b Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 24 Sep 2024 15:21:23 +0100 Subject: [PATCH 213/348] Arrangmement: Use precondition_code if later comes a precondition --- .../CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h index d787e922f872..e1a38671d28d 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h @@ -1551,7 +1551,7 @@ split_edge(Halfedge_handle e, // o---------e-------->o if (_are_equal(source, cv1, ARR_MIN_END)) { const Point_2& p = m_geom_traits->construct_max_vertex_2_object()(cv1); - CGAL_postcondition_code + CGAL_precondition_code (const Point_2& q = m_geom_traits->construct_min_vertex_2_object()(cv2)); CGAL_precondition(m_geom_traits->equal_2_object()(p, q)); CGAL_precondition(_are_equal(he1->vertex(), cv2, ARR_MAX_END)); @@ -1562,7 +1562,7 @@ split_edge(Halfedge_handle e, // o<--------e---------o if (_are_equal(source, cv1, ARR_MAX_END)) { const Point_2& p = m_geom_traits->construct_min_vertex_2_object()(cv1); - CGAL_postcondition_code + CGAL_precondition_code (const Point_2& q = m_geom_traits->construct_max_vertex_2_object()(cv2)); CGAL_precondition(m_geom_traits->equal_2_object()(p, q)); CGAL_precondition(_are_equal(he1->vertex(), cv2, ARR_MIN_END)); @@ -1573,7 +1573,7 @@ split_edge(Halfedge_handle e, // o---------e-------->o if (_are_equal(source, cv2, ARR_MIN_END)) { const Point_2& p = m_geom_traits->construct_max_vertex_2_object()(cv2); - CGAL_postcondition_code + CGAL_precondition_code (const Point_2& q = m_geom_traits->construct_min_vertex_2_object()(cv1)); CGAL_precondition(m_geom_traits->equal_2_object()(p, q)); CGAL_precondition(_are_equal(he1->vertex(), cv1, ARR_MAX_END)); @@ -1584,7 +1584,7 @@ split_edge(Halfedge_handle e, // o<--------e---------o CGAL_precondition(_are_equal(source, cv2, ARR_MAX_END)); const Point_2& p = m_geom_traits->construct_min_vertex_2_object()(cv2); - CGAL_postcondition_code + CGAL_precondition_code (const Point_2& q = m_geom_traits->construct_max_vertex_2_object()(cv1)); CGAL_precondition(m_geom_traits->equal_2_object()(p, q)); CGAL_precondition(_are_equal(he1->vertex(), cv1, ARR_MIN_END)); From a43efbfdb3109ad1076919049ccd9fd2031a6e8e Mon Sep 17 00:00:00 2001 From: Sebastien Loriot Date: Tue, 24 Sep 2024 16:22:53 +0200 Subject: [PATCH 214/348] Fix warning --- .../Point_set/Least_squares_plane_fit_sorting.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_sorting.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_sorting.h index 3f26a942ded8..51f633fd204a 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_sorting.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_sorting.h @@ -190,14 +190,14 @@ namespace Point_set { \brief the average of the maximal point to fitted plane distance in each neighborhood. */ - const double mean_distance() { + double mean_distance() { return mean_d; } /*! \brief the average of the maximal normal deviation to fitted plane in each neighborhood. */ - const double mean_deviation() { + double mean_deviation() { return mean_dev; } /// @} From e4ed5d1dab7606d8d8fb2da7e205005f20afc3f9 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 24 Sep 2024 15:25:11 +0100 Subject: [PATCH 215/348] Add a trivial documntation fix of Polytop_distance to avoid an extra PR --- .../doc/Polytope_distance_d/Concepts/WidthTraits_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h index 5686aec87e15..7d391dec7732 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h @@ -4,7 +4,7 @@ \cgalConcept This concept defines the requirements for traits classes of -`Width_3`. +`CGAL::Width_3`. \cgalHeading{Operations} From 57545072e58e8643ba9cc5d3b52ebec79e77d4a4 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 24 Sep 2024 16:08:53 +0100 Subject: [PATCH 216/348] more unifications in dependencies --- .../include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h | 2 +- .../include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h | 2 +- Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Real_roots.h | 2 +- .../include/CGAL/Algebraic_kernel_d/Status_line_CPA_1.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h index 6fecb592a121..c2f42122c0d1 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h @@ -520,7 +520,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { void set_event_lines(InputIterator1 event_begin, InputIterator1 event_end, InputIterator2 intermediate_begin, - InputIterator2 CGAL_precondition_code(intermediate_end)) const { + InputIterator2 CGAL_assertion_code(intermediate_end)) const { if(! this->ptr()->event_coordinates) { diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h index 868da2d3c9a6..0c5fe43e44fc 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h @@ -875,7 +875,7 @@ class Curve_pair_analysis_2 : * Checks intersection with symbolic methods */ bool check_candidate_symbolically(Status_line_CA_1& e1,size_type , - Status_line_CA_1& CGAL_precondition_code(e2),size_type , + Status_line_CA_1& CGAL_assertion_code(e2),size_type , size_type k) const { Polynomial_1 p = -coprincipal_subresultants(k-1); Polynomial_1 q = principal_subresultants(k)*Coefficient(k); diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Real_roots.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Real_roots.h index f4a346b4f604..bd45b4aa7442 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Real_roots.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Real_roots.h @@ -65,7 +65,7 @@ template < class PolynomialIterator, int gen_agebraic_reals_with_mults( PolynomialIterator fac, PolynomialIterator fac_end, IntIterator mul, - IntIterator CGAL_precondition_code(mul_end), + IntIterator CGAL_assertion_code(mul_end), AlgebraicRealOutputIterator oi_root, IntOutputIterator oi_mult){ diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CPA_1.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CPA_1.h index c3fb08048e7a..916ac3c511ec 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CPA_1.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CPA_1.h @@ -331,7 +331,7 @@ class Status_line_CPA_1 : const typename Curve_pair_analysis_2 ::Curve_analysis_2& c1, const typename Curve_pair_analysis_2 - ::Curve_analysis_2& CGAL_precondition_code(c2)) const + ::Curve_analysis_2& CGAL_assertion_code(c2)) const { CGAL_precondition(0 <= j && j < number_of_events()); From 735077fcc22ef637af7d69ddb832c0263d603c2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 24 Sep 2024 17:28:22 +0200 Subject: [PATCH 217/348] remove files moved to another git repo currently https://github.com/CGAL/cgal-testsuite-cgal-gf --- .../.autocgal_with_cmake_rc | 26 ---- .../cgal.geometryfactory.com/.autocgalrc | 40 ------ .../.cgal_create_new_release_rc | 5 - .../cgal.geometryfactory.com/.cgalmanualrc | 24 ---- .../bin/cgal_diff_results | 26 ---- .../bin/cgal_release.py | 87 ------------- .../bin/collect_data_directories | 23 ---- .../bin/create_internal_release_of_the_day.py | 52 -------- .../bin/create_release | 73 ----------- .../cgal.geometryfactory.com/bin/dump_crontab | 17 --- .../bin/update_manual_tools | 21 ---- .../cgal.geometryfactory.com/crontab | 118 ------------------ .../partition-table-sda.txt | 12 -- 13 files changed, 524 deletions(-) delete mode 100644 Maintenance/infrastructure/cgal.geometryfactory.com/.autocgal_with_cmake_rc delete mode 100644 Maintenance/infrastructure/cgal.geometryfactory.com/.autocgalrc delete mode 100644 Maintenance/infrastructure/cgal.geometryfactory.com/.cgal_create_new_release_rc delete mode 100644 Maintenance/infrastructure/cgal.geometryfactory.com/.cgalmanualrc delete mode 100755 Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_diff_results delete mode 100644 Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py delete mode 100755 Maintenance/infrastructure/cgal.geometryfactory.com/bin/collect_data_directories delete mode 100644 Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py delete mode 100755 Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_release delete mode 100755 Maintenance/infrastructure/cgal.geometryfactory.com/bin/dump_crontab delete mode 100755 Maintenance/infrastructure/cgal.geometryfactory.com/bin/update_manual_tools delete mode 100644 Maintenance/infrastructure/cgal.geometryfactory.com/crontab delete mode 100644 Maintenance/infrastructure/cgal.geometryfactory.com/partition-table-sda.txt diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/.autocgal_with_cmake_rc b/Maintenance/infrastructure/cgal.geometryfactory.com/.autocgal_with_cmake_rc deleted file mode 100644 index 4f6e7b4a2de6..000000000000 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/.autocgal_with_cmake_rc +++ /dev/null @@ -1,26 +0,0 @@ -# -*- mode: shell-script -*- -source $HOME/.autocgalrc - -CGAL_ROOT=/home/lrineau/CGAL/releases-and-testsuites-with-cmake -LOGS_DIR="${CGAL_ROOT}/AUTOTEST_LOGS" -LOCK_FILE="${CGAL_ROOT}/autotest_cgal_with_cmake.lock" - -REFERENCE_PLATFORMS_DIR=/home/lrineau/CGAL/releases-and-testsuites-with-cmake/reference-platforms - -COMPILERS_localhost="" -#COMPILERS_localhost="$COMPILERS_localhost i686_Linux-2.6_g++-3.4.6_CentOS-5.1-O2" -#COMPILERS_localhost="$COMPILERS_localhost i686_Linux-2.6_g++-4.1.2_CentOS-5.1" -#COMPILERS_localhost="$COMPILERS_localhost i686_Linux-2.6_g++-4.1.2_CentOS-5.1-O2" -#COMPILERS_localhost="$COMPILERS_localhost i686_Linux-2.6_g++-4.1.2_CentOS-5.1-O3" -#COMPILERS_localhost="$COMPILERS_localhost i686_Linux-2.6_g++-4.3.3_CentOS-5.1" -#COMPILERS_localhost="$COMPILERS_localhost i686_Linux-2.6_g++-4.3.3_CentOS-5.1-O2-NO-DEPRECATED" -#COMPILERS_localhost="$COMPILERS_localhost i686_Linux-2.6_g++-4.3.3_CentOS-5.1-O3" -# Ignored: i686_Linux-2.6_g++-4.1.2_CentOS-5.1-NOGMP -#COMPILERS_localhost="$COMPILERS_localhost x86_64_Linux-x.y_IntelCompiler-15.0_CentOS-7.x" - -# ignore COMPILERS_localhost and use all ref platformes: -USE_REFERENCE_PLATFORMS=yes - -# TAUCS -#CGAL_TAUCS_DIR=$HOME/CGAL/taucs_full -#export CGAL_TAUCS_DIR diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/.autocgalrc b/Maintenance/infrastructure/cgal.geometryfactory.com/.autocgalrc deleted file mode 100644 index 34bbd7db8087..000000000000 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/.autocgalrc +++ /dev/null @@ -1,40 +0,0 @@ -# -*- mode: shell-script -*- -BUILD_HOSTS="localhost" -PROCESSORS_localhost=4 -#PROCESSORS_localhost=2 -#COMPILERS_localhost="i686_Linux-2.6_g++-4.1.2_CentOS-5.1-O3 i686_Linux-2.6_g++-4.1.2_CentOS-5.1-O2 i686_Linux-2.6_g++-4.1.2_CentOS-5.1 i686_Linux-2.6_g++-4.3.2_CentOS-5.1-O3 i686_Linux-2.6_g++-4.3.2_CentOS-5.1" -COMPILERS_localhost="i686_Linux-2.6_g++-4.3.2_CentOS-5.1" -CGAL_TESTER="lrineau" -CGAL_TESTER_NAME="cgal (GF)" -CGAL_TESTER_ADDRESS=Laurent.Rineau__cgal_testsuite@normalesup.org - -CGAL_ROOT=/home/lrineau/CGAL/releases-and-testsuites -LOGS_DIR="${CGAL_ROOT}/AUTOTEST_LOGS" -LOCK_FILE="${CGAL_ROOT}/autotest_cgal_with_cmake.lock" - -# Do not output anything on console (otherwise crond sens emails) -CONSOLE_OUTPUT="" - -# QTDIR -source /etc/profile.d/qt.sh - -# set locale -LC_ALL=C -LANG=C -export LC_ALL -export LANG - -# pass QTDIR and locale to the shell -MYSHELL="QTDIR=$QTDIR LC_ALL=C LANG=C /bin/sh -c" - -# Prevent core files : -# ulimit -c 0 -# 3 hours maximum per process. -# ulimit -t 10800 -# Maximum memory to be used : 2GB -# ulimit -v 2000000 -# Maximum files size : 500MB -ULIMIT_OPTIONS="-H -c 0 -t 10800 -v 2000000 -t 500000" - - -UPLOAD_RESULT_DESTINATION="cgaltest@cgaltest.geometryfactory.com:incoming" diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/.cgal_create_new_release_rc b/Maintenance/infrastructure/cgal.geometryfactory.com/.cgal_create_new_release_rc deleted file mode 100644 index a4701211aab5..000000000000 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/.cgal_create_new_release_rc +++ /dev/null @@ -1,5 +0,0 @@ -#TMPDIR=$HOME/CGAL/create_internal_release -HTML_DIR=/srv/CGAL/www/Members/Releases -#MAKENSIS=$HOME/CGAL/NSIS-3.4/makensis.exe -#WINE=wine -CGAL_MANUAL=$HOME/bin/cgal_manual diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/.cgalmanualrc b/Maintenance/infrastructure/cgal.geometryfactory.com/.cgalmanualrc deleted file mode 100644 index 0e4fc5e8ec32..000000000000 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/.cgalmanualrc +++ /dev/null @@ -1,24 +0,0 @@ -export TEXINPUTS=".:$HOME/CGAL/Manual_tools-installed/sty:$HOME/CGAL/last-release-branch/Manual/doc_tex:$TEXINPUTS" -export BIBINPUTS="$HOME/CGAL/last-release-branch/Manual/doc_tex:$BIBINPUTS" -export LATEX_CONV_CONFIG=$HOME/CGAL/Manual_tools-installed/latex_conv_config -export LATEX_CONV_INPUTS=$LATEX_CONV_CONFIG/html:$HOME/CGAL/last-release-branch/Manual/doc_tex: - -# Use makeindex from Fedora 10: -# kpathsea-2007-35.fc10.i386 -# texlive-2007-35.fc10.i386 -export PATH=$HOME/bin:$PATH -export LD_PRELOAD=$HOME/bin/libkpathsea.so.4 - -# Selects the different output formats supported -MakePS=0 -MakePDF=1 -MakeHTML=1 - -# Number of older test-suite results kept. Test-suite results beyond this -# number are deleted. -TestSuiteHistory=20 - -# Number of older test-suites for which the full results will be kept. Older -# test suites will have their manuals removed to save space. -TestSuiteFullHistory=10 - diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_diff_results b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_diff_results deleted file mode 100755 index ba09b59b1851..000000000000 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_diff_results +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/zsh - -cd /srv/CGAL/www/testsuite - -if [ -z "$1" -o -z "$2" ]; then - printf "Example usage: %s 4.5-I-149 4.6-Ic-30 [DIFF_OPTION]...\n" "$0" - exit 1 -fi - -from="CGAL-$1" -to="CGAL-$2" -pager=${PAGER:-less} - -shift -shift - -if ! [ -e "./$from" ]; then - printf "The CGAL release %s was not tested!\n" "$from" - exit 1 -fi -if ! [ -e "./$to" ]; then - printf "The CGAL release %s was not tested!\n" "$to" - exit 1 -fi - -for f in ${from}/results*txt; do diff -U0 ${1+"$@"} $f ${f/$from/$to}; done |& less -p '^\+[^\+].* [^y]|CGAL-.*|diff' diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py deleted file mode 100644 index daa87aa614a0..000000000000 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py +++ /dev/null @@ -1,87 +0,0 @@ -"""Python module to create and publish CGAL releases from a branch""" - -import os - - -class Release: - """class to create a CGAL release from a branch - optionally, the release can be internal - """ - - def __init__(self, branch, internal=False): - self.branch = branch - self.internal = internal - self.cwd = f"$HOME/CGAL/create_internal_release-{self.branch}-branch" - self.repo = f"$HOME/CGAL/branches/CGAL-{self.branch}-branch.git" - self.extra_options = " --public" - - def command(self): - """return the command to create and publish the release""" - return ( - f"PATH=/home/lrineau/bin-cmake3:/bin:/usr/bin:/home/lrineau/bin; cd {self.cwd} &&" - + " /usr/bin/time -v bash -x " - + f"$HOME/bin/create_release {self.repo}{self.extra_options} --do-it" - ) - - def __str__(self): - msg = ( - f"{'internal ' if self.internal else ''}release from {self.branch}\n" - f"cwd: {self.cwd}\nrepo: {self.repo}\n" - f"command:\n{self.command()}" - ) - return msg - - def __call__(self): - if os.system(self.command()) != 0: - raise RuntimeError( - "Error while creating " + - f"{'internal ' if self.internal else ''}release from {self.branch}" - ) - - INTERNAL = True - - -class InternalRelease(Release): - """class to create an internal CGAL release from a branch""" - - def __init__(self, branch): - super().__init__(branch, Release.INTERNAL) - self.extra_options = " --integration" - - -class BetaRelease(Release): - """class to create an internal CGAL release from a branch""" - - def __init__(self, branch, beta_number): - super().__init__(branch, Release.INTERNAL) - self.extra_options = f" --public --beta {beta_number}" - - -integration = InternalRelease("integration") -integration.repo = "$HOME/CGAL/branches/integration.git" -integration.cwd = "$HOME/CGAL/create_internal_release" -master = Release("master") -master.repo = "$HOME/CGAL/branches/master.git" -master.cwd = "$HOME/CGAL/create_internal_release" - - -def beta_release_from_master(beta_number): - """Convenience function to create a beta release from master""" - rel = BetaRelease("master", beta_number) - rel.repo = "$HOME/CGAL/branches/master.git" - rel.cwd = "$HOME/CGAL/create_internal_release" - return rel - -def beta_release(branch, beta_number): - """Convenience function to create a beta release from a branch""" - return BetaRelease(branch, beta_number) - -def release(branch): - """Convenience function to create a release from a branch""" - return Release(branch) - - -if __name__ == "__main__": - print( - "This file is a Python module. Use create_internal_release_of_the_day.py instead." - ) diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/collect_data_directories b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/collect_data_directories deleted file mode 100755 index d3f3cdc237b6..000000000000 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/collect_data_directories +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/zsh - -set -e - -setopt extendedglob - -[ -d ./data ] || mkdir data - -for d in (examples|demo)/*/data(/); do - example_or_demo=${d%%/*} - pkg_plus_data=${d#*/} - pkg=${pkg_plus_data%/data} - [ "$d" = "${example_or_demo}/${pkg}/data" ] || echo WRONG $d - ls -d --color "${example_or_demo}/${pkg}/data" - echo example_or_demo=${example_or_demo} - echo pkg=${pkg} - dest_dir=data/data-${pkg} - [ -d "$dest_dir" ] || mkdir "$dest_dir" - ls -d --color "$dest_dir" - cp -a "$d"/* "${dest_dir}/" -done -cd data -zip -r ../data.zip * diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py deleted file mode 100644 index 8448203c6738..000000000000 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py +++ /dev/null @@ -1,52 +0,0 @@ -#! /bin/python3 - -"""This script is called by a cron job every day. - It creates and publish a release tarball. -""" - -import os -import datetime -import locale -import argparse -from cgal_release import release, integration, master, beta_release, beta_release_from_master - -# Define a dictionary that maps day of the week to an action -actions = { - "Monday": integration, - "Tuesday": integration, - "Wednesday": integration, - "Thursday": integration, - "Friday": release("5.5"), - "Saturday": release("5.6"), - "Sunday": master, -} - - -def main(): - """Entry point of the script.""" - # Get the current day of the week, or get it from the command line - locale.setlocale(locale.LC_ALL, "en_US.UTF-8") - - day_help = f"Day of the week (default: {datetime.datetime.now().strftime('%A')})" - day_help += f" possible values: ({', '.join(actions.keys())})" - parser = argparse.ArgumentParser() - parser.add_argument( - "day", help=day_help, nargs="?", default=datetime.datetime.now().strftime("%A") - ) - parser.add_argument("-n", "--dry-run", action="store_true") - args = parser.parse_args() - - # Look up the action for the current day of the week in the dictionary - create_release = actions[args.day] - - if args.dry_run: - print(create_release) - return - - # Then create the release tarball - if os.system(create_release.command()) != 0: - raise RuntimeError("ERROR while creating release tarball") - - -if __name__ == "__main__": - main() diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_release b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_release deleted file mode 100755 index 7657e924bef6..000000000000 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_release +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/sh - -LC_ALL=POSIX; -export LC_ALL - -# Returns an error once a command returns an error -set -e - -DRY_RUN= -QUIET=--quiet - -if [ "x$1" = "x--dry-run" -o "x$1" = "x-n" ]; then - DRY_RUN=--dry-run - shift -fi - -if [ -n "DRY_RUN" ]; then - QUIET= -fi - -pushd "$1" > /dev/null -branch=`git rev-parse --abbrev-ref HEAD` -remote=`git config branch.${branch}.remote` -git fetch $DRY_RUN $QUIET -p --all -[ -z "$DRY_RUN" ] && git reset $QUIET --hard "$remote/$branch" -git clean $DRY_RUN $QUIET -f -d -x - -ln -s -n -f "$1" $HOME/latest-internal-release-branch - -# Hard-reset integration "every day", if today's "$branch" is integration -# and create testsuite-Monday, testsuite-Tuesday, and so on... -if [ x"$branch" = "xintegration" ]; then - git push $DRY_RUN $QUIET -f cgal-dev "$remote/$branch:refs/heads/`date '+testsuite-%A'`" cgal/master:integration -elif [ x"$branch" = "xintegration-4.5" ]; then - git push $DRY_RUN $QUIET -f cgal-dev "$remote/$branch:refs/heads/`date '+testsuite-%A'`" cgal/releases/CGAL-4.5-branch:integration-4.5 -else - git push $DRY_RUN $QUIET -f cgal-dev "$remote/$branch:refs/heads/`date '+testsuite-%A'`" -fi - -popd > /dev/null - -# Update the symbolic links, using $1 and $2 -rm "$HOME/CGAL/last-release-branch" - -ln -s "$1" "$HOME/CGAL/last-release-branch" - -## That was for LaTeX documentation -#rm "$HOME/CGAL/last-manual_tools-branch" -#rm "$HOME/CGAL/last-manual-branch" - - -## That was for LaTeX documentation -# # Search the Manual and Manual_tools package in candidates, if any. -# # Else use the main branch. -# if [ -d "$2" -a -d "$2/Manual_tools" ]; then -# ln -s "$2" "$HOME/CGAL/last-manual_tools-branch"; -# else -# ln -s "$1" "$HOME/CGAL/last-manual_tools-branch"; -# fi -# if [ -d "$2" -a -d "$2/Manual" ]; then -# ln -s "$2" "$HOME/CGAL/last-manual-branch"; -# else -# ln -s "$1" "$HOME/CGAL/last-manual-branch"; -# fi - -## That was for LaTeX documentation -# # Update the manual tools -# # They are used in create_new_release to build the installation manual. -# "$HOME/bin/update_manual_tools" - -# Launch create_new_release, from the branch itself -[ -z "$DRY_RUN" ] && exec bash -$- "$HOME/CGAL/last-release-branch/Scripts/developer_scripts/create_new_release" --no-scm-update "$@" -# --no-scm-update because branches have already been updated diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/dump_crontab b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/dump_crontab deleted file mode 100755 index 478770cf1068..000000000000 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/dump_crontab +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/zsh - -cd $HOME/infrastructure -crontab -l >| crontab -if [ -d ../../../.git ]; then - git pull --ff-only --quiet || exit $? - git diff --cached --quiet || exit $? - git add crontab - if git commit -m 'updated crontab (automated commit)' > /dev/null; then - git push cgal master - else - true - fi -else - svn add -q crontab - [ -n "`svn st crontab`" ] && svn ci -m 'updated crontab (automated commit)' crontab -fi diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/update_manual_tools b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/update_manual_tools deleted file mode 100755 index d7185498bfdc..000000000000 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/update_manual_tools +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -LC_ALL=POSIX; -export LC_ALL - -rm -rf "$HOME/CGAL/Manual_tools-src" -cp -a "$HOME/CGAL/last-manual_tools-branch/Manual_tools" "$HOME/CGAL/Manual_tools-src" -cp -a "$HOME/CGAL/last-manual-branch/Manual/developer_scripts/cgal_manual" "$HOME/bin" - -pushd "$HOME/CGAL/Manual_tools-src" - -cat > install.config <<'EOF' -export LATEX_CONV_BIN=$HOME/bin -MANUAL_TOOLS_PREFIX=$HOME/CGAL/Manual_tools-installed -export LATEX_CONV_CONFIG=$MANUAL_TOOLS_PREFIX/latex_conv_config -export STYLE_FILES=$MANUAL_TOOLS_PREFIX/sty -EOF - -sh install.sh - -popd diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/crontab b/Maintenance/infrastructure/cgal.geometryfactory.com/crontab deleted file mode 100644 index aea33b8c03ec..000000000000 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/crontab +++ /dev/null @@ -1,118 +0,0 @@ -# For details see man 4 crontabs - -# Example of job definition: -# .---------------- minute (0 - 59) -# | .------------- hour (0 - 23) -# | | .---------- day of month (1 - 31) -# | | | .------- month (1 - 12) OR jan,feb,mar,apr ... -# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat -# | | | | | -# * * * * * command to be executed - -PATH=/home/lrineau/bin-cmake3:/bin:/usr/bin:/home/lrineau/bin -LC_CTYPE=en_US.UTF-8 -DOCKER_HOST=unix:///run/podman/podman.sock -CONTAINER_HOST=unix:///run/podman/podman.sock - -# Update testsuite result pages -5,15,25,35,45,55 * * * * cd $HOME/CGAL/collect_and_public_testresults; ./treat_result_collection || echo ERROR - -# Create internal release -0 21 * * * python3 /home/lrineau/CGAL/branches/local-master.git/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py - -30 16 * * * echo ESSAI; false -## Older stuff - -## "master" alone -#0 21 * * Sun cd $HOME/CGAL/create_internal_release && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/master.git --do-it --public || echo ERROR -## "integration" -#0 21 * * Mon,Tue,Wed cd $HOME/CGAL/create_internal_release && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/integration.git $HOME/CGAL/branches/empty-dir --do-it || echo ERROR -## from branch 5.5 -#0 21 * * Fri cd $HOME/CGAL/create_internal_release-5.5-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-5.5-branch.git --public --do-it || echo ERROR -## from branch 5.4 -#0 21 * * Sat,Thu cd $HOME/CGAL/create_internal_release-5.4-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-5.4-branch.git --public --do-it || echo ERROR - -# from branch 5.3 -#0 21 * * Sat cd $HOME/CGAL/create_internal_release-5.3-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-5.3-branch.git --public --do-it || echo ERROR -# from branch 5.2 -#0 21 * * Fri cd $HOME/CGAL/create_internal_release-5.2-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-5.2-branch.git --public --do-it || echo ERROR -# from branch 5.1 -#0 21 * * Fri cd $HOME/CGAL/create_internal_release-5.1-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-5.1-branch.git --public --do-it || echo ERROR -# from branch 5.0 -#0 21 * * Fri cd $HOME/CGAL/create_internal_release-5.0-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-5.0-branch.git --public --do-it || echo ERROR -# from branch 4.14 -#0 21 * * Fri cd $HOME/CGAL/create_internal_release-4.14-branch && /usr/bin/time scl enable rh-git29 -- $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 scl enable rh-git29 -- $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 scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.12-branch.git --public --do-it || echo ERROR -# from branch 4.11 -#0 21 * * Sat cd $HOME/CGAL/create_internal_release-4.11-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.11-branch.git --public --do-it || echo ERROR -# from branch 4.10 -#0 21 * * Mon,Tue cd $HOME/CGAL/create_internal_release-4.10-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.10-branch.git --public --do-it || echo ERROR -# from branch 4.9 -#0 21 * * Sat cd $HOME/CGAL/create_internal_release-4.9-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.9-branch.git --public --do-it -# from branch 4.8 -#0 21 * * Sat cd $HOME/CGAL/create_internal_release-4.8-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.8-branch.git --public --do-it -# from branch 4.7 -#0 21 * * Sat cd $HOME/CGAL/create_internal_release-4.7-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.7-branch.git --public --do-it -# from branch 4.6 -#0 21 * * Sat cd $HOME/CGAL/create_internal_release-4.6-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.6-branch.git --public --do-it -# from branch 4.5 -#0 21 * * Sat cd $HOME/CGAL/create_internal_release-4.5-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.5-branch.git --public --do-it - -# Launch our Docker testsuite , at 21:36, -# after a pull of all new images at 20:23. -06 20 * * * for i in $(cat /home/lrineau/.config/CGAL/test_cgal_docker_images); do docker pull $i; done; docker rmi $(docker images | awk '// {print $3}') -36 21 * * * cd /home/lrineau/Git/cgal-testsuite-dockerfiles && /usr/bin/time ./test_cgal.py --use-fedora-selinux-policy --force-rm --max-cpus 20 --container-cpus 8 --jobs 10 --upload-results --images $($HOME/bin/docker_images_to_test_today) - - -# Dump the crontab to SVN every hour at minute 18 -18 * * * * $HOME/bin/dump_crontab - -# Docker check every hour -#0 * * * * docker inspect --format='{{json .State.Health.Status}}' cgal-mediawiki-docker_wiki_1 | grep -q '"healthy"' || docker logs cgal-mediawiki-docker_wiki_1 - -# cgal->cgal2 with git-multimail -#*/5 * * * * cd $HOME/Git/cgal-dev-pusher.git && $HOME/bin/git-fetch-and-push-to-multimail cgal-dev cgal-dev-receiver -#*/5 * * * * cd $HOME/Git/cgal-pusher.git && $HOME/bin/git-fetch-and-push-to-multimail cgal cgal-receiver -#*/5 * * * * cd $HOME/Git/cgal-students-pusher.git && $HOME/bin/git-fetch-and-push-to-multimail cgal-public-dev cgal-students-receiver -#*/5 * * * * cd $HOME/Git/cgal-web-pusher.git && $HOME/bin/git-fetch-and-push-to-multimail cgal-web cgal-web-receiver - -#################################### -# Old stuff -#################################### - -## Manual Test suite, at 9:40pm -#40 21 * * * cd $HOME/CGAL/releases-and-testsuites-with-cmake/CGAL-I/doc_tex; nice -19 $HOME/bin/cgal_manual -testsuite || true -## Doxygen Test suite, at 9:05pm -#20 21 * * * time $HOME/CGAL/python-3.3/bin/python3 $HOME/CGAL/doxy-port-pmoeller/Documentation/testsuite.py --doxyassist $HOME/CGAL/doxyassist/doxyassist.py --doxygen $HOME/Git/doxygen-fixes/bin/doxygen --documentation $HOME/CGAL/doxy-port-pmoeller/Documentation --publish /var/CGAL/www/Members/Doxygen_test/ --do-update --do-purge-rebuild - -# "next" alone -#0 21 * * Sat cd $HOME/CGAL/create_internal_release && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/next.svn --public --do-it -# "next" + candidates -#0 21 * * Mon,Tue,Wed,Thu,Fri cd $HOME/CGAL/create_internal_release && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/next.svn $HOME/CGAL/candidate-packages --public --do-it -# from branch 4.1 -#0 21 * * Sun cd $HOME/CGAL/create_internal_release-4.1-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/CGAL-4.1-branch --public --do-it -# from branch 4.4 -#0 21 * * Sun cd $HOME/CGAL/create_internal_release-4.4-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/CGAL-4.4-branch.git --public --do-it -# "integration-4.5" -#0 21 * * Sat,Mon cd $HOME/CGAL/create_internal_release-4.5-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/branches/integration-4.5.git $HOME/CGAL/branches/empty-dir --do-it --public - -# - from branch 3.4 -#0 21 * * Sat cd $HOME/CGAL/create_internal_release-3.4-branch; scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/CGAL-3.4-branch --public --do-it -# - from branch 3.7 -#0 21 * * Fri cd $HOME/CGAL/create_internal_release-3.7-branch; scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/CGAL-3.7-branch --public --do-it -# - from branch 3.9 -#0 21 * * Sat cd $HOME/CGAL/create_internal_release-3.9-branch; scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/CGAL-3.9-branch --public --do-it -# - from branch 4.0 -#0 21 * * Sun cd $HOME/CGAL/create_internal_release-4.0-branch && /usr/bin/time scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/CGAL-4.0-branch --public --do-it -# - on trunk -#0 21 * * Sat cd $HOME/CGAL/create_internal_release; scl enable rh-git29 -- $HOME/bin/create_release $HOME/CGAL/trunk --public --do-it - -# Check the links of http://www.cgal.org/projects.html every sunday at 17:42 -#42 17 * * Sun linklint -host www.cgal.org -http /projects.html -net -no_anchors -quiet -silent -error - -# A test that does not work -#30 21 * * * grep 'conflicts with' $HOME/CGAL/create_internal_release/create_release.log.`date '+%Y-%m-%d'`* --no-filename - diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/partition-table-sda.txt b/Maintenance/infrastructure/cgal.geometryfactory.com/partition-table-sda.txt deleted file mode 100644 index 7ba18c16b032..000000000000 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/partition-table-sda.txt +++ /dev/null @@ -1,12 +0,0 @@ -# partition table of /dev/sda -unit: sectors - -/dev/sda1 : start= 63, size= 20482812, Id=fd, bootable -/dev/sda2 : start= 20482875, size= 16383174, Id=fd -/dev/sda3 : start= 36866049, size=2893406016, Id= f -/dev/sda4 : start= 0, size= 0, Id= 0 -/dev/sda5 : start= 36866050, size=2893406015, Id=fd -# -# Restore with: -# sfdisk --force /dev/sda < partition-table-sda.txt -# From 74d79bb3c3070dc1b4b3bd108695bd2ed086a539 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 24 Sep 2024 16:35:44 +0100 Subject: [PATCH 218/348] Perform a consistency check in the entire testsuite --- STL_Extension/include/CGAL/assertions.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/STL_Extension/include/CGAL/assertions.h b/STL_Extension/include/CGAL/assertions.h index cf793f466bee..cd076d29fe35 100644 --- a/STL_Extension/include/CGAL/assertions.h +++ b/STL_Extension/include/CGAL/assertions.h @@ -19,6 +19,9 @@ #ifndef CGAL_ASSERTIONS_H #define CGAL_ASSERTIONS_H +// this define is only for one run of the testsuite +#define CGAL_NO_POSTCONDITIONS + #include // #include // for backward compatibility From 7e8443fb17554c21c997a50d282959c746c6560d Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 25 Sep 2024 08:18:01 +0200 Subject: [PATCH 219/348] updated crontab (automated commit) --- Maintenance/infrastructure/cgal.geometryfactory.com/crontab | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/crontab b/Maintenance/infrastructure/cgal.geometryfactory.com/crontab index aea33b8c03ec..ff33e80a3b13 100644 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/crontab +++ b/Maintenance/infrastructure/cgal.geometryfactory.com/crontab @@ -18,7 +18,9 @@ CONTAINER_HOST=unix:///run/podman/podman.sock 5,15,25,35,45,55 * * * * cd $HOME/CGAL/collect_and_public_testresults; ./treat_result_collection || echo ERROR # Create internal release -0 21 * * * python3 /home/lrineau/CGAL/branches/local-master.git/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py +#0 21 * * * python3 /home/lrineau/CGAL/branches/local-master.git/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py +0 21 * * * python3 /home/lrineau/CGAL/cgal-testsuite-cgal-gf.git/bin/create_internal_release_of_the_day.py + 30 16 * * * echo ESSAI; false ## Older stuff From 052e2a3e152dc6123a00a0af3403685bd76c07c0 Mon Sep 17 00:00:00 2001 From: albert-github Date: Wed, 25 Sep 2024 10:27:40 +0200 Subject: [PATCH 220/348] Remove double entry from bib file The entry `cgal:l-lsqp-82` was twice, identical, in the bib file. (Found based on #8320 and proposed pull request https://github.com/doxygen/doxygen/pull/11157). --- Documentation/doc/biblio/cgal_manual.bib | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index 25bb729e33dd..95af0ea9a154 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -1545,17 +1545,6 @@ @book{ cgal:l-lscsd-96 ,update = "97.04 kettner" } -@article{cgal:l-lsqp-82, - title={Least squares quantization in PCM}, - author={Lloyd, Stuart}, - journal={IEEE transactions on information theory}, - volume={28}, - number={2}, - pages={129--137}, - year={1982}, - publisher={IEEE} -} - @InProceedings{ cgal:lprm-lscm-02, author = {Bruno L{\'e}vy and Sylvain Petitjean and Nicolas Ray and J{\'e}rome Maillot}, From de1872f46c173ed7c7b7199a08793729c17da448 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 25 Sep 2024 13:10:57 +0200 Subject: [PATCH 221/348] fix the error ``` Source file /home/lrineau/CGAL/collect_and_public_testresults/TESTRESULTS/../Summary_Script.js does not exist. at ./create_testresult_page line 898. ``` .. and another fix about `/usr/sbin/restorecon`. --- Scripts/developer_scripts/create_new_release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/developer_scripts/create_new_release b/Scripts/developer_scripts/create_new_release index 2b0e0f2ff2b6..bb88cc894ede 100755 --- a/Scripts/developer_scripts/create_new_release +++ b/Scripts/developer_scripts/create_new_release @@ -136,7 +136,7 @@ HTML_DIR="/u/agrion/geometrica/CGAL/Members/Releases" URL="http://cgal.inria.fr/CGAL/Members/Releases" -PATH=$PATH:/usr/local/bin:/usr/bin/gnu +PATH=$PATH:/usr/local/bin:/usr/sbin # Working dir TMPDIR="`pwd`" From 341fd5f396ca60cc6b42bd25647c6ede37ead3d1 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 25 Sep 2024 12:27:35 +0100 Subject: [PATCH 222/348] Use Exact_integer --- .../doc/Polytope_distance_d/CGAL/Width_3.h | 2 +- .../examples/Polytope_distance_d/width_simplex.cpp | 13 ++----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_3.h b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_3.h index 45bacc2bcea4..9c5af8218d6d 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_3.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_3.h @@ -54,7 +54,7 @@ Because there is no need for dividing values during the algorithm, the numbers can get really huge (all the computations are made using a lot of multiplications). Therefore it is strongly recommended to use a number type that can handle numbers of arbitrary length (e.g., -`leda_integer` in combination with the homogeneous representation +`Exact_integer` in combination with the homogeneous representation of the points). But these large numbers have a disadvantage: Operations on them are slower as greater the number gets. Therefore it is possible to shorten the numbers by using the compiler flag diff --git a/Polytope_distance_d/examples/Polytope_distance_d/width_simplex.cpp b/Polytope_distance_d/examples/Polytope_distance_d/width_simplex.cpp index b909f263d9ce..7463a9296415 100644 --- a/Polytope_distance_d/examples/Polytope_distance_d/width_simplex.cpp +++ b/Polytope_distance_d/examples/Polytope_distance_d/width_simplex.cpp @@ -1,20 +1,11 @@ #include #include #include +#include #include #include -#if defined(CGAL_USE_GMP) -#include -typedef CGAL::Gmpz RT; -#elif defined (CGAL_USE_LEDA) -#include -typedef leda_integer RT; -#else -#include -typedef CGAL::MP_Float RT; -#endif - +typedef CGAL::Exact_integer RT; typedef CGAL::Homogeneous Kernel; typedef Kernel::Point_3 Point_3; typedef Kernel::Plane_3 Plane_3; From ef77c4a6ff8dc2b7d36ade8800cf6b696b7c3985 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 25 Sep 2024 16:18:42 +0200 Subject: [PATCH 223/348] Prepare CGAL-6.0 --- Installation/include/CGAL/version.h | 6 +++--- Installation/lib/cmake/CGAL/CGALConfigVersion.cmake | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Installation/include/CGAL/version.h b/Installation/include/CGAL/version.h index 6840e2546e38..8a5f4d052b09 100644 --- a/Installation/include/CGAL/version.h +++ b/Installation/include/CGAL/version.h @@ -17,12 +17,12 @@ #define CGAL_VERSION_H #ifndef SWIG -#define CGAL_VERSION 6.0-beta2 +#define CGAL_VERSION 6.0 #define CGAL_GIT_HASH abcdef #endif -#define CGAL_VERSION_NR 1060000920 +#define CGAL_VERSION_NR 1060001000 #define CGAL_SVN_REVISION 99999 -#define CGAL_RELEASE_DATE 20240701 +#define CGAL_RELEASE_DATE 20240925 #include diff --git a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake index df15f9e31080..310f88038daa 100644 --- a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake +++ b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake @@ -2,7 +2,7 @@ set(CGAL_MAJOR_VERSION 6) set(CGAL_MINOR_VERSION 0) set(CGAL_BUGFIX_VERSION 0) include(${CMAKE_CURRENT_LIST_DIR}/CGALConfigBuildVersion.cmake) -set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "6.0-beta2") +set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "6.0") set(CGAL_VERSION_PUBLIC_RELEASE_NAME "CGAL-${CGAL_VERSION_PUBLIC_RELEASE_VERSION}") if (CGAL_BUGFIX_VERSION AND CGAL_BUGFIX_VERSION GREATER 0) From 58cf16de67d5d7e259ed90d064f19b43711994e2 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Wed, 25 Sep 2024 16:21:06 +0200 Subject: [PATCH 224/348] Use jQuery TableSorter for sorting tables --- Maintenance/test_handling/Summary_Script.js | 44 +++++---------- .../test_handling/create_testresult_page | 11 ++-- Maintenance/test_handling/testresult.css | 56 +++++++++++++------ 3 files changed, 58 insertions(+), 53 deletions(-) diff --git a/Maintenance/test_handling/Summary_Script.js b/Maintenance/test_handling/Summary_Script.js index dfac558e195d..90a87da08e5c 100644 --- a/Maintenance/test_handling/Summary_Script.js +++ b/Maintenance/test_handling/Summary_Script.js @@ -179,23 +179,25 @@ function platformContainer(platforms) { $tplTable.toggle(); } }).appendTo($container); - const $tplTable = $('', { class: 'tpl-table', css: { display: 'none' } }).appendTo($container); + const $tplTable = $('
    ', { + class: 'tablesorter', + css: { + display: 'none', + maxWidth: '300px' + } + }).appendTo($container); const $thead = $('').appendTo($tplTable); const $tbody = $('').appendTo($tplTable); const $headerRow = $(''); - $('').append( $(' - `); } @@ -276,6 +277,7 @@ function showVersionsForTPL(tplName) { if (!tplFound) { $modalBody.append(''); } + $modalTable.trigger("update"); $modal.show(); $('.close').click(function() { $modal.hide(); @@ -285,28 +287,6 @@ function showVersionsForTPL(tplName) { $modal.hide(); } }); - const $thead = $modalTable.find('thead'); - initializeTableSorting($thead, $modalBody); - $thead.find('.sortable').first().click(); -} - -function initializeTableSorting($thead, $tbody) { - let sortOrder = 1; - $thead.find('.sortable').click(function() { - const columnIndex = $(this).data('sort'); - const rows = $tbody.find('tr').get(); - rows.sort((a, b) => { - const keyA = $(a).children('td').eq(columnIndex).text().toUpperCase(); - const keyB = $(b).children('td').eq(columnIndex).text().toUpperCase(); - if (keyA < keyB) return -1 * sortOrder; - if (keyA > keyB) return 1 * sortOrder; - return 0; - }); - $.each(rows, (_index, row) => { - $tbody.append(row); - }); - sortOrder *= -1; - }); } function main() { @@ -319,7 +299,9 @@ function main() { platformContainer(data.platforms); packageContainer(data.platforms); $packageContainer.hide(); - + $(document).ready(function() { + $("table.tablesorter").tablesorter(); + }); const urlParams = new URLSearchParams(window.location.search); const platform = urlParams.get('platform'); if (platform) { diff --git a/Maintenance/test_handling/create_testresult_page b/Maintenance/test_handling/create_testresult_page index 63e7a74101eb..cbdf6f1c03fb 100755 --- a/Maintenance/test_handling/create_testresult_page +++ b/Maintenance/test_handling/create_testresult_page @@ -838,6 +838,7 @@ sub create_summary_page { Summary + + EOF if (-e $summary_script_src) { copy($summary_script_src, $summary_script_dest) or die "Copy failed: $!"; diff --git a/Maintenance/test_handling/testresult.css b/Maintenance/test_handling/testresult.css index 7eb5096eba89..0345403739eb 100644 --- a/Maintenance/test_handling/testresult.css +++ b/Maintenance/test_handling/testresult.css @@ -170,11 +170,6 @@ TABLE.result TD > a.package_name { color: #1A0DAB; } -.sortable{ - cursor: pointer; - text-decoration: underline; -} - /* TPL Modal */ .modal { display: none; @@ -222,24 +217,51 @@ TABLE.result TD > a.package_name { color: #555; } -.modaltable{ +table.tablesorter { + width: 100%; + margin: 20px 0; border-collapse: collapse; - cellspacing: 0; + background-color: #f0f0f0; + color: #333; + font-family: Arial, sans-serif; } -.modalHeader{ - text-align: center; - width: auto; +table.tablesorter thead th { + background-color: #d9d9d9; + color: #333; + font-weight: bold; + padding: 10px; + border: 1px solid #ccc; + text-align: left; + cursor: pointer; } -.modalBody { - text-align: center; +table.tablesorter thead th.tablesorter-headerAsc { + background-repeat: no-repeat; + background-position: right center; + padding-right: 20px; +} + +table.tablesorter thead th.tablesorter-headerDesc { + background-repeat: no-repeat; + background-position: right center; + padding-right: 20px; +} + +table.tablesorter tbody tr:nth-child(odd) { + background-color: #e6e6e6; } -.modal-table-row { - border-bottom: 2px ridge #000; +table.tablesorter tbody tr:nth-child(even) { + background-color: #f0f0f0; +} + +table.tablesorter tbody td { + padding: 8px; + border: 1px solid #ccc; + text-align: left; } -.modal-table-row td { - padding: 7px; -} \ No newline at end of file +table.tablesorter tbody tr:hover { + background-color: #d1d1d1 +} From 885c906910051491c04ee502d90b304714ed758b Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 25 Sep 2024 17:13:04 +0200 Subject: [PATCH 225/348] fix the error ``` Source file /home/lrineau/CGAL/collect_and_public_testresults/TESTRESULTS/../Summary_Script.js does not exist. at ./create_testresult_page line 898. ``` --- Maintenance/test_handling/create_testresult_page | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Maintenance/test_handling/create_testresult_page b/Maintenance/test_handling/create_testresult_page index cbdf6f1c03fb..a1805aa9ec99 100755 --- a/Maintenance/test_handling/create_testresult_page +++ b/Maintenance/test_handling/create_testresult_page @@ -18,6 +18,7 @@ use strict; use Date::Format; use JSON; use File::Copy; +use FindBin; my $server_url="https://cgal.geometryfactory.com/"; my $cgal_members="${server_url}CGAL/Members/"; @@ -753,7 +754,7 @@ sub create_summary_page { my @letters = ('r', 'n', 'w', 'o'); my $letters_options = join("\n", map { "" } @letters); my $package_options = join("\n", map { "" } sort keys %test_directories); - my $summary_script_src = "$testresult_dir/../Summary_Script.js"; + my $summary_script_src = $FindBin::RealBin . "/Summary_Script.js"; my $summary_script_dest = "$testresult_dir/$release_name/Summary_Script.js"; my $summary_page_path = "$testresult_dir/summary".substr($release_name,4).".html"; my @platforms_data; From 9b4c27d470203f1dc7b39bda6bd221a8b71ce9ff Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 25 Sep 2024 19:28:49 +0200 Subject: [PATCH 226/348] Refactor indentation in a few developer scripts (remove tabs) I have ignored the scripts that I do not use. NOTE: `Scripts/developer_scripts/create_internal_release` seems not used anymore, but I have updated it anyway.` --- .../test_handling/create_testresult_page | 420 +++++++++--------- Maintenance/test_handling/to_zipped_format | 154 +++---- .../developer_scripts/create_internal_release | 178 ++++---- Scripts/developer_scripts/create_new_release | 4 +- .../developer_scripts/test_merge_of_branch | 10 +- 5 files changed, 383 insertions(+), 383 deletions(-) diff --git a/Maintenance/test_handling/create_testresult_page b/Maintenance/test_handling/create_testresult_page index bfac578fcc9a..f26fd7c30de4 100755 --- a/Maintenance/test_handling/create_testresult_page +++ b/Maintenance/test_handling/create_testresult_page @@ -125,8 +125,8 @@ sub list_platforms() { my ($filename, @result); foreach $_ (glob("results_*.txt")) { - ($filename) = m/results_(.*?)\.txt\s*/; - push(@result, $filename) if $filename; + ($filename) = m/results_(.*?)\.txt\s*/; + push(@result, $filename) if $filename; } return @result; } @@ -140,9 +140,9 @@ sub list_packages($) my $test_result="results_${platform}.txt"; open(TESTRESULT, $test_result) or return 0; while () { - if (/^\s*(.*?)\s+(\w)\s*$/) { - $test_directories{$1} = ''; - } + if (/^\s*(.*?)\s+(\w)\s*$/) { + $test_directories{$1} = ''; + } } close TESTRESULT or return 0; return 1; @@ -158,31 +158,31 @@ sub collect_results_of_platform($) my $resulttext; open(TESTRESULT, $test_result) or return $platform_results; while () { - if (/^\s*(.*?)\s+(\w)\s*$/) { - #($package,$succes) = ($1,$2); - if ($2 eq 'y' or $2 eq 'Y') { - $resulttext = 'y'; - ++$yeahs; - } elsif ($2 eq 'w' or $2 eq 'W') { - $resulttext = 'w'; - ++$warnings; - } elsif ($2 eq 't' or $2 eq 'T') { - $resulttext = 't'; - ++$third_party_warnings; - } elsif ($2 eq 'n' or $2 eq 'N') { - $resulttext = 'n'; - ++$nays; - } elsif ($2 eq 'o' or $2 eq 'O') { - $resulttext = 'o'; - ++$timeout; + if (/^\s*(.*?)\s+(\w)\s*$/) { + #($package,$succes) = ($1,$2); + if ($2 eq 'y' or $2 eq 'Y') { + $resulttext = 'y'; + ++$yeahs; + } elsif ($2 eq 'w' or $2 eq 'W') { + $resulttext = 'w'; + ++$warnings; + } elsif ($2 eq 't' or $2 eq 'T') { + $resulttext = 't'; + ++$third_party_warnings; + } elsif ($2 eq 'n' or $2 eq 'N') { + $resulttext = 'n'; + ++$nays; + } elsif ($2 eq 'o' or $2 eq 'O') { + $resulttext = 'o'; + ++$timeout; } elsif ($2 eq 'r') { - $resulttext = 'r'; - ++$reqs; - } else { - $resulttext = ' '; - } - $platform_results->{$1} = $resulttext; - } + $resulttext = 'r'; + ++$reqs; + } else { + $resulttext = ' '; + } + $platform_results->{$1} = $resulttext; + } } close TESTRESULT; $platform_results->{"y"} = $yeahs; @@ -198,10 +198,10 @@ sub collect_results() { my $platform; foreach $platform (@platforms_to_do) { - list_packages($platform); + list_packages($platform); } foreach $platform (@platforms_to_do) { - push(@testresults, collect_results_of_platform($platform)); + push(@testresults, collect_results_of_platform($platform)); } } @@ -225,66 +225,66 @@ EOF my $test_directory; my $test_num = 0; foreach $test_directory (sort keys %test_directories) { - if ($PLATFORMS_REF_BETWEEN_RESULTS) { - $test_num++; - if ($test_num == 15) { - $test_num = 0; - print OUTPUT "\n\n"; - } - } - # my $version; - # if ( -r "$test_directory/version" ) { - # open(VERSION, "$test_directory/version"); - # while() { - # ($version) = /^\s*([^\s]*)\s/; - # last if $version; - # } - # close VERSION; - # } - print OUTPUT "\n\n"; + if ($PLATFORMS_REF_BETWEEN_RESULTS) { + $test_num++; + if ($test_num == 15) { + $test_num = 0; + print OUTPUT "\n\n"; + } + } + # my $version; + # if ( -r "$test_directory/version" ) { + # open(VERSION, "$test_directory/version"); + # while() { + # ($version) = /^\s*([^\s]*)\s/; + # last if $version; + # } + # close VERSION; + # } + print OUTPUT "\n\n"; print OUTPUT "\n"; - # if ( $version ) { - # print OUTPUT "\n"; - # } else { - # print OUTPUT "\n"; - # } - my ($platform_num,$platform)=(0,""); - $platform_num=0; - foreach $platform (@platforms_to_do) { - my ($result,$resulttext); - $resulttext = $testresults[$platform_num]->{$test_directory}; - if (! defined($resulttext)) { - $resulttext = ' '; - } - print OUTPUT '\n"; + # } else { + # print OUTPUT "\n"; + # } + my ($platform_num,$platform)=(0,""); + $platform_num=0; + foreach $platform (@platforms_to_do) { + my ($result,$resulttext); + $resulttext = $testresults[$platform_num]->{$test_directory}; + if (! defined($resulttext)) { + $resulttext = ' '; + } + print OUTPUT '\n"; - ++$platform_num; - - } - print OUTPUT "\n"; + print OUTPUT ' class="timeout"'; + } elsif ($resulttext eq 'n') { + print OUTPUT ' class="error"'; + } elsif ($resulttext eq 'r') { + print OUTPUT ' class="requirements"'; + } + else { + print OUTPUT ' class="na"'; + } + print OUTPUT '> ', "$resulttext\n"; + ++$platform_num; + + } + print OUTPUT "\n"; } print OUTPUT "
    ', { class: 'sortable', 'data-sort': 0, text: 'Library' }).appendTo($headerRow); - $('', { class: 'sortable', 'data-sort': 1, text: 'Version' }).appendTo($headerRow); - $('', { class: 'sortable', 'data-sort': 2, text: 'Status' }).appendTo($headerRow); + $('', { text: 'Library' }).appendTo($headerRow); + $('', { text: 'Version' }).appendTo($headerRow); $headerRow.appendTo($thead); tplArray.forEach(tpl => { $('
    ').html(`${tpl.name}`), $('').text(tpl.version || 'N/A'), - $('').text(tpl.status) ).appendTo($tbody); }); - initializeTableSorting($thead, $tbody); - $thead.find('.sortable').first().click(); $('.tpl-link').click(function(event) { event.preventDefault(); const tplName = $(this).data('tpl'); @@ -268,7 +270,6 @@ function showVersionsForTPL(tplName) {
    No versions of this TPL found across platforms.
    \n"; - print OUTPUT "Platform Description"; - print OUTPUT "\n"; - print_platforms_numbers(); - print OUTPUT "\n
    \n"; + print OUTPUT "Platform Description"; + print OUTPUT "\n"; + print_platforms_numbers(); + print OUTPUT "\n
    $test_directory$version?.?$version?.? ', "$resulttext
    \n"; } @@ -297,7 +297,7 @@ sub print_resultpage() print OUTPUT '

    In the table below, each column is numbered, and corresponds to a platform. '; print OUTPUT 'Each column number is a link to the platform description table.

    ', "\n"; if ($PLATFORMS_BESIDE_RESULTS) { - print OUTPUT <<"EOF"; + print OUTPUT <<"EOF";
    @@ -307,17 +307,17 @@ EOF print_result_table(); if ($PLATFORMS_BESIDE_RESULTS) { - print OUTPUT "\n\n"; - if ($platform_count > 0) { - my $repeat_count = (1 + 1.1/16.5)*scalar(keys %test_directories)/($platform_count+0.25); - while ($repeat_count >= 1) { - $repeat_count--; - print OUTPUT "\n
    \n"; + print OUTPUT "\n\n"; + if ($platform_count > 0) { + my $repeat_count = (1 + 1.1/16.5)*scalar(keys %test_directories)/($platform_count+0.25); + while ($repeat_count >= 1) { + $repeat_count--; + print OUTPUT "\n"; - } - } - print OUTPUT "
    \n"; print_platforms(); print OUTPUT "
    \n
    \n"; + } + } + print OUTPUT "
    \n
    \n"; } } @@ -390,7 +390,7 @@ sub parse_platform_2($) # splice(@list,0,@list-3); # } while (@list < 3) { - push(@list,'?'); + push(@list,'?'); } return @list; } @@ -400,19 +400,19 @@ sub short_pfname($) my @pflist = parse_platform_2($_[0]); my $shortpf; if(@pflist < 4) { - $shortpf = join('_', $pflist[1], $pflist[2]); + $shortpf = join('_', $pflist[1], $pflist[2]); } elsif($pflist[2] !~ /Linux/i) { - $shortpf = join('_', $pflist[3], $pflist[2]); - if(@pflist >= 5) { - $shortpf = join('_', $shortpf, $pflist[4]); - } + $shortpf = join('_', $pflist[3], $pflist[2]); + if(@pflist >= 5) { + $shortpf = join('_', $shortpf, $pflist[4]); + } } else { - $shortpf = $pflist[3]; - if(@pflist >= 5) { - $shortpf = join('_', $shortpf, $pflist[4]); - } + $shortpf = $pflist[3]; + if(@pflist >= 5) { + $shortpf = join('_', $shortpf, $pflist[4]); + } } return $shortpf; } @@ -425,22 +425,22 @@ sub choose_platforms() my $index = 0; # Put all known platforms in a hash table. for ($index=0; $index < @known_platforms; $index += 1) { - $pf = $known_platforms[$index]; - $platform_index{$pf} = 1; + $pf = $known_platforms[$index]; + $platform_index{$pf} = 1; } # Check if there are platforms listed that are not known. Warn about this # and add those platforms at the end of the list of known platforms. foreach (@available_platforms) { - $pf = $_; - my $shortpf = short_pfname($pf); - $pf =~ s/^[^_]*_//; - $pf =~ s/_LEDA$//; - if (!exists $platform_index{$shortpf}) { - # print STDERR "Warning: Platform $_ is unknown!\n"; - $platform_index{$shortpf} = 1; - push(@known_platforms,$shortpf); # ??? - $platform_short_names{$shortpf} = $shortpf; - } + $pf = $_; + my $shortpf = short_pfname($pf); + $pf =~ s/^[^_]*_//; + $pf =~ s/_LEDA$//; + if (!exists $platform_index{$shortpf}) { + # print STDERR "Warning: Platform $_ is unknown!\n"; + $platform_index{$shortpf} = 1; + push(@known_platforms,$shortpf); # ??? + $platform_short_names{$shortpf} = $shortpf; + } } # Make a list of all the platforms that are to be treated, in the order they @@ -448,14 +448,14 @@ sub choose_platforms() @platforms_to_do = (); @known_platforms = sort sort_pf @known_platforms; for ($index=0; $index < @known_platforms; $index += 1) { - $pf = $known_platforms[$index]; - my $ind2 = 0; - foreach (@available_platforms) { - my $apf = short_pfname($_); - if ($apf eq $pf) { - push(@platforms_to_do, $_); - } - } + $pf = $known_platforms[$index]; + my $ind2 = 0; + foreach (@available_platforms) { + my $apf = short_pfname($_); + if ($apf eq $pf) { + push(@platforms_to_do, $_); + } + } } } @@ -489,80 +489,80 @@ sub print_platform_descriptions() EOF my ($platform_num)=(0); foreach $pf (@platforms_to_do) { - my $pf_num_plus_one = $platform_num + 1; - print OUTPUT "
    $pf_no\n"; - $pf_no++; - # my $pf_short = join('_',parse_platform_2($pf)); - (my $pf_short) = ($pf =~ m/_(.*)/); - print OUTPUT "\n$pf_no\n"; + $pf_no++; + # my $pf_short = join('_',parse_platform_2($pf)); + (my $pf_short) = ($pf =~ m/_(.*)/); + print OUTPUT "; # CGAL_VERSION - $_ = ; # COMPILER + $_ = ; # CGAL_VERSION + $_ = ; # COMPILER chomp; my $compiler = $_; print OUTPUT " title=\"$compiler\">$pf_short"; - $_ = ; # OPERATING_SYSTEM - chomp; - my $operating_system = $_; - $_ = ; # TESTER_NAME - chomp; - my $tester_name = $_; - $_ = ; # TESTER_ADDRESS - chomp; - my $tester_address = $_; - - my $county = $testresults[$platform_num]->{"y"}; - my $countt = $testresults[$platform_num]->{"t"}; - my $countw = $testresults[$platform_num]->{"w"}; - my $counto = $testresults[$platform_num]->{"o"}; - my $countn = $testresults[$platform_num]->{"n"}; - my $countr = $testresults[$platform_num]->{"r"}; - - my $index = 8; - my @tmp; - while ($index) { - $index--; - $_ = ; - chomp; - $tmp[$index] = $_; - } - ($platform_is_optimized{$pf}) = ($tmp[1] =~ m|([-/]x?O[1-9])|); - $_ = ; - chomp; - my $build_type = $platform_is_optimized{$pf} ? " - " : "YES"; - print OUTPUT "$compiler$operating_system$tester_name$county$countt$countw$counto$countn$countr$build_type$compiler$operating_system$tester_name$county$countt$countw$counto$countn$countr$build_type$_$_??
    \n

    \n"; } @@ -572,15 +572,15 @@ sub print_platforms_numbers() my ($platform_num,$platform)=(0,""); my $release_version = substr($release_name, 5); foreach $platform (@platforms_to_do) { - ++$platform_num; - my $pf_short = short_pfname($platform); - my $class = ""; - my $tag = ""; + ++$platform_num; + my $pf_short = short_pfname($platform); + my $class = ""; + my $tag = ""; my $platformlink = $platform; - if($platform_is_optimized{$platform} || $platform_is_64bits{$platform}) - { - $class = " class=\""; - $tag = " ( "; + if($platform_is_optimized{$platform} || $platform_is_64bits{$platform}) + { + $class = " class=\""; + $tag = " ( "; if($platform_is_64bits{$platform}) { $class = "$class os64bits"; $tag = $tag . "64 bits "; @@ -591,8 +591,8 @@ sub print_platforms_numbers() } $class = $class . "\""; $tag = $tag . " )"; - } - print OUTPUT "$platform_num\n"; + } + print OUTPUT "$platform_num\n"; } } @@ -601,11 +601,11 @@ sub print_platforms() my ($pf_no,$pf) = (1,""); print OUTPUT '',"\n"; foreach $pf (@platforms_to_do) { - print OUTPUT "\n\n"; + print OUTPUT "\n\n"; } print OUTPUT "
    $pf_no\n"; - $pf_no++; - my $pf_short = short_pfname($pf); - print OUTPUT "$platform_short_names{$pf_short}"; - print OUTPUT "\n
    $pf_no\n"; + $pf_no++; + my $pf_short = short_pfname($pf); + print OUTPUT "$platform_short_names{$pf_short}"; + print OUTPUT "\n
    \n"; } @@ -658,8 +658,8 @@ EOF sub main() { if (scalar(@ARGV) != 1 ) { - print STDERR "usage: $0 directory\n"; - exit 1; + print STDERR "usage: $0 directory\n"; + exit 1; } $release_name =shift(@ARGV); @@ -668,8 +668,8 @@ sub main() $release_name =~ s<(/)$><>; chdir $testresult_dir or die; if ( ! -d $release_name ) { - print STDERR "$release_name is not a valid directory\n"; - exit 1; + print STDERR "$release_name is not a valid directory\n"; + exit 1; } # init_known_platforms(); @@ -728,9 +728,9 @@ sub init_known_platforms() @known_platforms = (); while() { ($short_name, $full_name) =split; - $full_name = short_pfname($full_name); - push(@known_platforms,$full_name); - $platform_short_names{$full_name} = $full_name; + $full_name = short_pfname($full_name); + push(@known_platforms,$full_name); + $platform_short_names{$full_name} = $full_name; } close(PLATFORMS); } diff --git a/Maintenance/test_handling/to_zipped_format b/Maintenance/test_handling/to_zipped_format index 44d1651a2dfb..f09af68afebd 100755 --- a/Maintenance/test_handling/to_zipped_format +++ b/Maintenance/test_handling/to_zipped_format @@ -32,8 +32,8 @@ sub make_tempdir() my $dirno = 1; $TMPDIR = "TMP$dirno"; while ( -f $TMPDIR or -d $TMPDIR ) { - ++$dirno; - $TMPDIR = "TMP$dirno"; + ++$dirno; + $TMPDIR = "TMP$dirno"; } mkdir($TMPDIR,0770) or die "Cannot create temporary directory $TMPDIR\n"; } @@ -57,60 +57,60 @@ sub reformat_results($) if(/^\s*$/) { goto NEXT; } - if(/^-- USING CMake version: ([\w\.-]+)/) { - $CMAKE = $1; - } - if (/^CGAL_VERSION\s+([\w\.-]+)/) { - $CGAL_VERSION = $1; - } - if (/LEDA_VERSION = '([^']+)'/) { - $LEDA_VERSION="$1"; - } - if (/LEDAWIN_VERSION = '([^']+)'/) { - $LEDA_VERSION="$LEDA_VERSION+win"; - } - if (/COMPILER_VERSION = '([^']+)'/) { - $COMPILER = $1; - } - if (/-- Operating system: (.*)/) { - $OS = $1; - } - if (/^TESTER_NAME\s+(.*)$/) { - $TESTER_NAME = $1; - } - if (/^TESTER_ADDRESS\s+(.*)$/) { - $TESTER_ADDRESS = $1; - } - if (/MPFR_VERSION = '([^']+)'/) { - $MPFR="$1"; - } - if (/ZLIB_VERSION = '([^']+)'/) { - $ZLIB="$1"; - } - if (/OPENGL_VERSION = '([^']+)'/) { - $OPENGL="$1"; - } - if (/GMP_VERSION = '([^']+)'/) { - $GMP="$1"; - } - if (/GMPXX_VERSION = '([^']+)'/) { - $GMP="$GMP+gmpxx"; - } - if (/QT_VERSION = '([^']+)'/) { - $QT="$1"; - } - if (/QT4_VERSION = '([^']+)'/) { - $QT="$1"; - } - if (/Qt5_VERSION = '([^']+)'/) { - $QT="$1"; - } - if (/Qt6_VERSION = '([^']+)'/) { - $QT="$1"; - } - if (/BOOST_VERSION = '([^']+)'/) { - $BOOST="$1"; - } + if(/^-- USING CMake version: ([\w\.-]+)/) { + $CMAKE = $1; + } + if (/^CGAL_VERSION\s+([\w\.-]+)/) { + $CGAL_VERSION = $1; + } + if (/LEDA_VERSION = '([^']+)'/) { + $LEDA_VERSION="$1"; + } + if (/LEDAWIN_VERSION = '([^']+)'/) { + $LEDA_VERSION="$LEDA_VERSION+win"; + } + if (/COMPILER_VERSION = '([^']+)'/) { + $COMPILER = $1; + } + if (/-- Operating system: (.*)/) { + $OS = $1; + } + if (/^TESTER_NAME\s+(.*)$/) { + $TESTER_NAME = $1; + } + if (/^TESTER_ADDRESS\s+(.*)$/) { + $TESTER_ADDRESS = $1; + } + if (/MPFR_VERSION = '([^']+)'/) { + $MPFR="$1"; + } + if (/ZLIB_VERSION = '([^']+)'/) { + $ZLIB="$1"; + } + if (/OPENGL_VERSION = '([^']+)'/) { + $OPENGL="$1"; + } + if (/GMP_VERSION = '([^']+)'/) { + $GMP="$1"; + } + if (/GMPXX_VERSION = '([^']+)'/) { + $GMP="$GMP+gmpxx"; + } + if (/QT_VERSION = '([^']+)'/) { + $QT="$1"; + } + if (/QT4_VERSION = '([^']+)'/) { + $QT="$1"; + } + if (/Qt5_VERSION = '([^']+)'/) { + $QT="$1"; + } + if (/Qt6_VERSION = '([^']+)'/) { + $QT="$1"; + } + if (/BOOST_VERSION = '([^']+)'/) { + $BOOST="$1"; + } # if (/BOOST_THREAD_VERSION = '([^']+)'/) { # $BOOST="$BOOST+thread"; # } @@ -120,12 +120,12 @@ sub reformat_results($) # if (/BOOST_BIMAP_VERSION = '([^']+)'/) { # $BOOST="$BOOST+bimap"; # } - if (/USING +CXXFLAGS = '([^']*)'/ && !$CXXFLAGS) { - $CXXFLAGS="$CXXFLAGS $1"; - } - if (/USING +LDFLAGS = '([^']*)'/) { - $LDFLAGS="$LDFLAGS $1"; - } + if (/USING +CXXFLAGS = '([^']*)'/ && !$CXXFLAGS) { + $CXXFLAGS="$CXXFLAGS $1"; + } + if (/USING +LDFLAGS = '([^']*)'/) { + $LDFLAGS="$LDFLAGS $1"; + } # if(/^CGAL_TEST_PLATFORM /) { # # should be the last one of the header # last; @@ -144,7 +144,7 @@ NEXT: if(! ($_= )) { } } while () { - print PLATFORM_NEW_RESULTS $_; + print PLATFORM_NEW_RESULTS $_; } rename("${platform}.new_results","${platform}.txt") or die "cannot rename!"; print PLATFORM_INFO <<"EOF"; @@ -170,7 +170,7 @@ EOF if ($version && $version ne "CGAL-$CGAL_VERSION" && ($version !~ /^CGAL-${CGAL_VERSION}-Ic?-[\d]+$/)) { - die "Wrong version in $platform: $CGAL_VERSION instead of $version.\n"; + die "Wrong version in $platform: $CGAL_VERSION instead of $version.\n"; } } @@ -178,20 +178,20 @@ sub one_archive($) { my $archive = shift; if (! -f $archive) { - print STDERR "$archive is not a valid filename\n"; - return 0; + print STDERR "$archive is not a valid filename\n"; + return 0; } if ( $archive =~ m/\.gz$/ ) { - system("gunzip", "$archive") == 0 or return 0; - $archive =~ s/\.gz$//; + system("gunzip", "$archive") == 0 or return 0; + $archive =~ s/\.gz$//; } if ( $archive =~ m/.*\.tgz$/ ) { - system("gunzip", "$archive") == 0 or return 0; - $archive =~ s/\.tgz$/.tar/; + system("gunzip", "$archive") == 0 or return 0; + $archive =~ s/\.tgz$/.tar/; } if ( $archive !~ /\.tar$/) { - print STDERR "$0: $archive not a tar file\n"; - return 0; + print STDERR "$0: $archive not a tar file\n"; + return 0; } make_tempdir(); rename("$archive","$TMPDIR/$archive") or die "cannot rename(\"$archive\",\"$TMPDIR/$archive\")"; @@ -211,13 +211,13 @@ sub one_archive($) sub all_archives() { my $archive; foreach $archive (@ARGV) { - if (one_archive($archive)) { + if (one_archive($archive)) { my $date=`date`; chop $date; - print_log("$final_version : $archive successfully reformatted. [ $date ]\n"); - } else { - print_log_err("$final_version : Could not reformat $archive\n"); - } + print_log("$final_version : $archive successfully reformatted. [ $date ]\n"); + } else { + print_log_err("$final_version : Could not reformat $archive\n"); + } } } diff --git a/Scripts/developer_scripts/create_internal_release b/Scripts/developer_scripts/create_internal_release index 2db9f7f9ef87..2e9d5cf9b295 100755 --- a/Scripts/developer_scripts/create_internal_release +++ b/Scripts/developer_scripts/create_internal_release @@ -30,7 +30,7 @@ usage: $0 (-h|-r) [-n version number] [-d releasedir] [-a allpackagesdir] - [-c candidatesdir] + [-c candidatesdir] [-l lockfile] Exactly one of the options -h or -r must be present. @@ -96,11 +96,11 @@ sub termination_signal_handler { sub lock() { if (system("$LOCKCMD", "-r", '10', "$LOCKFILE") != 0) { - print STDERR <<"TOTHIER"; + print STDERR <<"TOTHIER"; The script could not proceed because it could not acquire the needed lock on file $LOCKFILE. TOTHIER - exit 1; + exit 1; } $SIG{QUIT} = \&termination_signal_handler; $SIG{HUP} = \&termination_signal_handler; @@ -153,12 +153,12 @@ sub install_packages() { # option instead of --exclude=.svn # -- Laurent Rineau, 2009/12/04 (idea by Sylvain Pion) if( -f $dont_submit ) { - @command = (@command, "--exclude-from=$dont_submit"); + @command = (@command, "--exclude-from=$dont_submit"); } @command = (@command, @global_dont_submit_tar_options); @command = (@command, "-C", "$package_name", "."); foreach( @command ) { - print "$_ "; + print "$_ "; } print "\n"; system(@command); @@ -186,15 +186,15 @@ sub install_packages() { my $filename = $_->name(); if( ! $_->is_dir() ) { - if(exists($files{$_->name()})) + if(exists($files{$_->name()})) { - print LOG_CONFLICTS "File ", $_->name(), " from package ", $package_name; - print LOG_CONFLICTS " conflicts with one from package ", $files{$_->name()}. "\n"; - } - else - { - $files{$_->name()} = $package_name; - } + print LOG_CONFLICTS "File ", $_->name(), " from package ", $package_name; + print LOG_CONFLICTS " conflicts with one from package ", $files{$_->name()}. "\n"; + } + else + { + $files{$_->name()} = $package_name; + } } else { # is_dir() returned true next if ($filename !~ /^\.\/?$/) and ($filename =~ /^\.\.?\/?$/); @@ -323,10 +323,10 @@ sub CreateExampleTestDirs() chdir 'examples' or return; print "Creating $VERSION/test/example directories ...\n"; foreach $DIR (glob("*")) { - if ( -d $DIR ) { - print "Creating test/${DIR}_Examples ...\n"; - dircopy("$DIR", "../test/${DIR}_Examples"); - } + if ( -d $DIR ) { + print "Creating test/${DIR}_Examples ...\n"; + dircopy("$DIR", "../test/${DIR}_Examples"); + } } chdir '..'; } @@ -343,16 +343,16 @@ sub CreateDemoTestDirs() chdir 'demo' or return; print "Creating $VERSION/test/demo directories ...\n"; foreach $DIR (glob("*")) { - if ( -d $DIR) { - if( ("$DIR" ne "icons") && ("$DIR" ne "resources") ) { - print "Creating test/${DIR}_Demo ...\n"; - dircopy("$DIR", "../test/${DIR}_Demo"); - } - else { - print "Creating test/${DIR}...\n"; - dircopy("$DIR", "../test/${DIR}"); - } - } + if ( -d $DIR) { + if( ("$DIR" ne "icons") && ("$DIR" ne "resources") ) { + print "Creating test/${DIR}_Demo ...\n"; + dircopy("$DIR", "../test/${DIR}_Demo"); + } + else { + print "Creating test/${DIR}...\n"; + dircopy("$DIR", "../test/${DIR}"); + } + } } chdir '..'; } @@ -371,38 +371,38 @@ sub make_testscripts() chdir 'test'; foreach $DIR (glob("*")) { - if ( (-d $DIR) && ("$DIR" ne "icons") && ("$DIR" ne "resources") ) { - chdir $DIR; - if ( -f 'Makefile') { - rename 'Makefile', 'makefile'; - } - if ( -f 'makefile' ) { + if ( (-d $DIR) && ("$DIR" ne "icons") && ("$DIR" ne "resources") ) { + chdir $DIR; + if ( -f 'Makefile') { + rename 'Makefile', 'makefile'; + } + if ( -f 'makefile' ) { open MAKEFILE, "makefile"; open NEW_MAKEFILE, ">makefile.new"; - while () { - s/\.o\b/\$(OBJ_EXT)/g; - s/-g\b/\$(DEBUG_OPT)/g; - print NEW_MAKEFILE $_; - } - close NEW_MAKEFILE; - close MAKEFILE; - rename("makefile.new","makefile"); - } else { + while () { + s/\.o\b/\$(OBJ_EXT)/g; + s/-g\b/\$(DEBUG_OPT)/g; + print NEW_MAKEFILE $_; + } + close NEW_MAKEFILE; + close MAKEFILE; + rename("makefile.new","makefile"); + } else { my $options = '-t'; - if ( -f 'cgal_create_makefile_options') { - if (open(OPTIONS, "; - chomp; - if (/^[\w\s-]+$/) { $options = $_; - } else { - print STDERR "Rejected cgal_create_makefile_options in $DIR\n"; - } - close OPTIONS; - } - } - system("$SCRIPTSDIR/cgal_create_makefile", $options) == 0 or die "Execution of $SCRIPTSDIR/cgal_create_makefile failed"; - } - if ( ! -f 'cgal_test' ) { + if ( -f 'cgal_create_makefile_options') { + if (open(OPTIONS, "; + chomp; + if (/^[\w\s-]+$/) { $options = $_; + } else { + print STDERR "Rejected cgal_create_makefile_options in $DIR\n"; + } + close OPTIONS; + } + } + system("$SCRIPTSDIR/cgal_create_makefile", $options) == 0 or die "Execution of $SCRIPTSDIR/cgal_create_makefile failed"; + } + if ( ! -f 'cgal_test' ) { $_ = $DIR; # chomp; if (/_Demo$/) { @@ -410,48 +410,48 @@ sub make_testscripts() } else { system("$DEVELSCRIPTSDIR/create_cgal_test") == 0 or die "Execution of $DEVELSCRIPTSDIR/create_cgal_test failed"; } - } - chdir '..'; - } + } + chdir '..'; + } } chdir $BASEDIR; chdir 'examples'; print "Creating makefiles in examples\n"; foreach $DIR (glob("*")) { - if ( -d $DIR ) { - chdir $DIR; - if ( -f 'Makefile') { - rename 'Makefile', 'makefile'; - } - if ( -f 'makefile' ) { + if ( -d $DIR ) { + chdir $DIR; + if ( -f 'Makefile') { + rename 'Makefile', 'makefile'; + } + if ( -f 'makefile' ) { open MAKEFILE, "makefile"; open NEW_MAKEFILE, ">makefile.new"; - while () { - s/\.o\b/\$(OBJ_EXT)/g; - s/-g\b/\$(DEBUG_OPT)/g; - print NEW_MAKEFILE $_; - } - close NEW_MAKEFILE; - close MAKEFILE; - rename("makefile.new","makefile"); - } else { + while () { + s/\.o\b/\$(OBJ_EXT)/g; + s/-g\b/\$(DEBUG_OPT)/g; + print NEW_MAKEFILE $_; + } + close NEW_MAKEFILE; + close MAKEFILE; + rename("makefile.new","makefile"); + } else { my $options = '-d'; - if ( -f 'cgal_create_makefile_options') { - if (open(OPTIONS, "; - chomp; - if (/^[\w\s-]+$/) { $options = $_; - } else { - print STDERR "Rejected cgal_create_makefile_options in $DIR\n"; - } - close OPTIONS; - } - } - system("$SCRIPTSDIR/cgal_create_makefile", $options) == 0 or die "Execution of $SCRIPTSDIR/cgal_create_makefile failed"; - } - chdir '..'; - } + if ( -f 'cgal_create_makefile_options') { + if (open(OPTIONS, "; + chomp; + if (/^[\w\s-]+$/) { $options = $_; + } else { + print STDERR "Rejected cgal_create_makefile_options in $DIR\n"; + } + close OPTIONS; + } + } + system("$SCRIPTSDIR/cgal_create_makefile", $options) == 0 or die "Execution of $SCRIPTSDIR/cgal_create_makefile failed"; + } + chdir '..'; + } } chdir $BASEDIR; } diff --git a/Scripts/developer_scripts/create_new_release b/Scripts/developer_scripts/create_new_release index bb88cc894ede..e5f91c488773 100755 --- a/Scripts/developer_scripts/create_new_release +++ b/Scripts/developer_scripts/create_new_release @@ -301,10 +301,10 @@ if [ -n "$DO_PUBLIC" ]; then public_release_version="${public_release_version}-beta${BETA}" fi if [ -r "${NUMBERS_DIR}/public_release_name" ]; then - public_release_name=`cat "${NUMBERS_DIR}/public_release_name"` + public_release_name=`cat "${NUMBERS_DIR}/public_release_name"` public_release_version=${public_release_name#CGAL-} else - public_release_name="CGAL-${public_release_version}" + public_release_name="CGAL-${public_release_version}" fi if ! [ -f ${NUMBERS_DIR}/MAJOR_NUMBER ]; then eval $(cmake -DCGALCONFIGVERSIONFILE=${SOURCES_DIR}/CGALConfigVersion.cmake -P ${SOURCES_DIR}/Scripts/developer_scripts/create_new_release_evaluate_versions.cmake 2>&1) diff --git a/Scripts/developer_scripts/test_merge_of_branch b/Scripts/developer_scripts/test_merge_of_branch index 2b3d91ecd0b5..64739b8cac64 100755 --- a/Scripts/developer_scripts/test_merge_of_branch +++ b/Scripts/developer_scripts/test_merge_of_branch @@ -14,7 +14,7 @@ fi git=git if hub --version 2> /dev/null > /dev/null; then case "$(hub --version)" in - *hub\ version*) git=hub;; + *hub\ version*) git=hub;; esac fi @@ -63,11 +63,11 @@ if [ -d build ] && \ cmake_output=$(cmake build 2>&1) cmake_exit_code=$? if [ "$cmake_exit_code" -ne 0 ]; then - echo 'CMake error:' - printf '%s\n' "${cmake_output}" - exit 1 + echo 'CMake error:' + printf '%s\n' "${cmake_output}" + exit 1 else - echo OK + echo OK fi else echo '.. Skip the CMake test (please configure a build/ CMake binary directory,' From 8afe80430e90f5b224d1952261e7713bba125a9c Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 26 Sep 2024 13:14:14 +0200 Subject: [PATCH 227/348] fix the CMake bug in https://cgal.geometryfactory.com/CGAL/testsuite/results-6.0-I-333.shtml --- .../cmake/modules/display-third-party-libs-versions.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Installation/cmake/modules/display-third-party-libs-versions.cmake b/Installation/cmake/modules/display-third-party-libs-versions.cmake index fa344cc04d6f..96ef4e149929 100644 --- a/Installation/cmake/modules/display-third-party-libs-versions.cmake +++ b/Installation/cmake/modules/display-third-party-libs-versions.cmake @@ -6,6 +6,8 @@ set(LIBRARIES_TO_CHECK OpenGR OpenCV ZLIB ) +include(${CMAKE_CURRENT_LIST_DIR}/CGAL_TweakFindBoost.cmake) + function(get_library_version header_path major_macro minor_macro patchlevel_macro version_var) if(EXISTS ${header_path}) file(READ ${header_path} HEADER_CONTENT) From d8a4cb6ae70d9bd22cfe1dd402a747c34a9e9fa9 Mon Sep 17 00:00:00 2001 From: albert-github Date: Thu, 26 Sep 2024 13:14:19 +0200 Subject: [PATCH 228/348] Layout of how to cite CGAL page Small, in my opinion, improvement of CGAL how to cite page --- Documentation/doc/scripts/generate_how_to_cite.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/doc/scripts/generate_how_to_cite.py b/Documentation/doc/scripts/generate_how_to_cite.py index ece849f18a92..409678ebb918 100644 --- a/Documentation/doc/scripts/generate_how_to_cite.py +++ b/Documentation/doc/scripts/generate_how_to_cite.py @@ -65,7 +65,7 @@ The \cgal Project. \cgal User and Reference Manual. \cgal Editorial Board, ${CGAL_CREATED_VERSION_NUM} edition, ${CGAL_BUILD_YEAR4}. -[ bib | +[ bib | http ] @@ -160,7 +160,7 @@ def gen_txt_entry(title, authors, bib, anchor, k): + '.\n\ In \\cgal User and Reference Manual. \\cgal Editorial Board,\n\ ${CGAL_CREATED_VERSION_NUM} edition, ${CGAL_BUILD_YEAR4}.\n\ -[ bib | \n\ ::max)()) > ::CORE::bitLength(m)); + CGAL_assertion(std::size_t((std::numeric_limits::max)()) > ::CORE::bitLength(m)); shift = static_cast(::CORE::bitLength(m)) - rel_prec - 3; }else shift = CGAL::relative_precision(x) - rel_prec -1; diff --git a/Number_types/include/CGAL/cpp_float.h b/Number_types/include/CGAL/cpp_float.h index 8f5fc9a89c27..9a180bc8773a 100644 --- a/Number_types/include/CGAL/cpp_float.h +++ b/Number_types/include/CGAL/cpp_float.h @@ -178,7 +178,7 @@ class cpp_float { man.backend().negate(); } #ifdef CGAL_DEBUG_CPPF - assert(rat.sign() == man.sign()); + CGAL_assertion(rat.sign() == man.sign()); #endif // std::cout << "m = " << m << " * 2^" << exp << std::endl; // fmt(m); @@ -353,7 +353,7 @@ class cpp_float { #endif cpp_float d = b-a; #ifdef CGAL_DEBUG_CPPF - assert(qres == d.is_positive()); + CGAL_assertion(qres == d.is_positive()); #endif return d.is_positive(); } @@ -379,18 +379,18 @@ class cpp_float { if(shift > 0){ Mantissa ac = a.man << shift; #ifdef CGAL_DEBUG_CPPF - assert( qres == (ac == b.man)); + CGAL_assertion( qres == (ac == b.man)); #endif return ac == b.man; }else if(shift < 0){ Mantissa bc = b.man << -shift; #ifdef CGAL_DEBUG_CPPF - assert(qres == (a.man == bc)); + CGAL_assertion(qres == (a.man == bc)); #endif return a.man == bc; } #ifdef CGAL_DEBUG_CPPF - assert(qres == (a.man == b.man)); + CGAL_assertion(qres == (a.man == b.man)); #endif return a.man==b.man; } @@ -489,7 +489,7 @@ class cpp_float { Type operator()( const Type& /* x */, const Type& /* y */ ) const { - assert(false); + CGAL_assertion(false); return Type(); // cpp_float_gcd(x, y); } }; @@ -506,7 +506,7 @@ class cpp_float { Type operator()( const Type& /* x */, const Type& /* y */ ) const { - assert(false); + CGAL_assertion(false); return Type(); // x / y; } }; @@ -514,7 +514,7 @@ class cpp_float { struct Sqrt : public CGAL::cpp98::unary_function< Type, Type > { Type operator()( const Type& /* x */) const { - assert(false); + CGAL_assertion(false); return Type(); // cpp_float_sqrt(x); } }; @@ -523,11 +523,11 @@ class cpp_float { : public CGAL::cpp98::binary_function< Type, Type&, bool > { bool operator()( const Type& /* x */, Type& /* y */ ) const { // TODO: avoid doing 2 calls. - assert(false); + CGAL_assertion(false); return true; } bool operator()( const Type& /* x */) const { - assert(false); + CGAL_assertion(false); return true; } }; From 3347a952e348ba3bf71f86863de68f74da9adb14 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Fri, 27 Sep 2024 15:44:52 +0200 Subject: [PATCH 231/348] Update button styles and add toggle functionality --- Maintenance/test_handling/Summary_Script.js | 16 ++++----- .../test_handling/create_testresult_page | 4 +-- Maintenance/test_handling/testresult.css | 36 ++++++++----------- 3 files changed, 23 insertions(+), 33 deletions(-) diff --git a/Maintenance/test_handling/Summary_Script.js b/Maintenance/test_handling/Summary_Script.js index 90a87da08e5c..413f0b94d7d9 100644 --- a/Maintenance/test_handling/Summary_Script.js +++ b/Maintenance/test_handling/Summary_Script.js @@ -174,7 +174,7 @@ function platformContainer(platforms) { const tplArray = platform.tpl; const $toggleButton = $(' - + +

    diff --git a/Maintenance/test_handling/testresult.css b/Maintenance/test_handling/testresult.css index 0345403739eb..8c460cdea6b7 100644 --- a/Maintenance/test_handling/testresult.css +++ b/Maintenance/test_handling/testresult.css @@ -92,7 +92,12 @@ TABLE.result TD > a.package_name { } .toggle-button { - text-decoration: underline; + color: #333; + background-color: #f0f0f0; + border: 1px solid #ccc; + cursor: pointer; + text-align: center; + border-radius: 5px; } .summary-content{ @@ -145,29 +150,20 @@ TABLE.result TD > a.package_name { .tpl-toggle-button { display: inline-block; - margin-bottom: 10px; - padding: 6px 12px; + padding: 0.3em 0.5em; font-size: 14px; - color: #333; - background-color: #f0f0f0; - border: 1px solid #ccc; - cursor: pointer; - text-align: center; - text-decoration: underline; } -.tpl-toggle-button:hover { +.toggle-button:hover { background-color: #e0e0e0; } -.tpl-link { - color: #0000EE; - text-decoration: underline; +.tpl-row { cursor: pointer; } -.tpl-link:hover { - color: #1A0DAB; +.tpl-row:hover td { + background-color: #d1d1d1 !important; } /* TPL Modal */ @@ -248,11 +244,11 @@ table.tablesorter thead th.tablesorter-headerDesc { padding-right: 20px; } -table.tablesorter tbody tr:nth-child(odd) { +table.tablesorter tbody tr:nth-child(odd) td { background-color: #e6e6e6; } -table.tablesorter tbody tr:nth-child(even) { +table.tablesorter tbody tr:nth-child(even) td { background-color: #f0f0f0; } @@ -260,8 +256,4 @@ table.tablesorter tbody td { padding: 8px; border: 1px solid #ccc; text-align: left; -} - -table.tablesorter tbody tr:hover { - background-color: #d1d1d1 -} +} \ No newline at end of file From 68a28b61c193181f5f3cf090b818982f2a52cc34 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 27 Sep 2024 15:46:07 +0200 Subject: [PATCH 232/348] update the release date in CHANGES.md --- Installation/CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index d1e95e2a7712..5b10c290afaa 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -2,7 +2,7 @@ ## [Release 6.0](https://github.com/CGAL/cgal/releases/tag/v6.0) -Release date: June 2024 +Release date: September 2024 ### General Changes From 5705d05c7a7b19f054e628d687ec5f5ea01c7f8f Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 27 Sep 2024 16:59:34 +0100 Subject: [PATCH 233/348] Explain that duplicates may be reported --- Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_3.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_3.h b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_3.h index 9c5af8218d6d..b30c8553a672 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_3.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_3.h @@ -25,9 +25,10 @@ width-planes. \f$ \mathcal{W(S)}=\mathcal{W}_{d_{opt}}\mathcal{(S)}\f$ -Note: There might be several optimal build directions. Hence +\Note There might be several optimal build directions. Hence neither the width-planes nor the direction \f$ \mathbf{d}_{opt}\f$ are -unique - only the width is. +unique - only the width is. There may also be duplicates reported, +different vectors having the same or the opposite directions. \tparam Traits must be a model for `WidthTraits_3`. From 918744dade81c27cff74fac4329a7173a3c6b5a3 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 27 Sep 2024 18:12:46 +0200 Subject: [PATCH 234/348] prepare the announcement of CGAL-6.0 --- .../doc/resources/1.10.0/menu_version.js | 46 +-- .../doc/resources/1.8.13/menu_version.js | 46 +-- .../doc/resources/1.9.6/menu_version.js | 46 +-- .../announcement/announcement.md | 325 +++++++++++++----- .../md_annoucement_remove_line_breaks.md | 5 + 5 files changed, 311 insertions(+), 157 deletions(-) create mode 100644 Maintenance/public_release/announcement/md_annoucement_remove_line_breaks.md diff --git a/Documentation/doc/resources/1.10.0/menu_version.js b/Documentation/doc/resources/1.10.0/menu_version.js index 5b8d97efba0b..74c82c3d818c 100644 --- a/Documentation/doc/resources/1.10.0/menu_version.js +++ b/Documentation/doc/resources/1.10.0/menu_version.js @@ -5,29 +5,29 @@ var url_local = /.*\/doc_output\//; var current_version_local = 'master' var all_versions = [ - 'master', - '6.0-beta1', - '5.6.1', - 'latest', - '5.5.4', - '5.4.4', - '5.3.2', - '5.2.4', - '5.1.5', - '5.0.4', - '4.14.3', - '4.13.2', - '4.12.2', - '4.11.3', - '4.10.2', - '4.9.1', - '4.8.2', - '4.7', - '4.6.3', - '4.5.2', - '4.4', - '4.3' - ]; + 'master', + '6.0', + 'latest', + '5.6.1', + '5.5.4', + '5.4.5', + '5.3.2', + '5.2.4', + '5.1.5', + '5.0.4', + '4.14.3', + '4.13.2', + '4.12.2', + '4.11.3', + '4.10.2', + '4.9.1', + '4.8.2', + '4.7', + '4.6.3', + '4.5.2', + '4.4', + '4.3' +]; function build_select(current_version) { if( current_version == 'master') { diff --git a/Documentation/doc/resources/1.8.13/menu_version.js b/Documentation/doc/resources/1.8.13/menu_version.js index 5b8d97efba0b..74c82c3d818c 100644 --- a/Documentation/doc/resources/1.8.13/menu_version.js +++ b/Documentation/doc/resources/1.8.13/menu_version.js @@ -5,29 +5,29 @@ var url_local = /.*\/doc_output\//; var current_version_local = 'master' var all_versions = [ - 'master', - '6.0-beta1', - '5.6.1', - 'latest', - '5.5.4', - '5.4.4', - '5.3.2', - '5.2.4', - '5.1.5', - '5.0.4', - '4.14.3', - '4.13.2', - '4.12.2', - '4.11.3', - '4.10.2', - '4.9.1', - '4.8.2', - '4.7', - '4.6.3', - '4.5.2', - '4.4', - '4.3' - ]; + 'master', + '6.0', + 'latest', + '5.6.1', + '5.5.4', + '5.4.5', + '5.3.2', + '5.2.4', + '5.1.5', + '5.0.4', + '4.14.3', + '4.13.2', + '4.12.2', + '4.11.3', + '4.10.2', + '4.9.1', + '4.8.2', + '4.7', + '4.6.3', + '4.5.2', + '4.4', + '4.3' +]; function build_select(current_version) { if( current_version == 'master') { diff --git a/Documentation/doc/resources/1.9.6/menu_version.js b/Documentation/doc/resources/1.9.6/menu_version.js index 5b8d97efba0b..74c82c3d818c 100644 --- a/Documentation/doc/resources/1.9.6/menu_version.js +++ b/Documentation/doc/resources/1.9.6/menu_version.js @@ -5,29 +5,29 @@ var url_local = /.*\/doc_output\//; var current_version_local = 'master' var all_versions = [ - 'master', - '6.0-beta1', - '5.6.1', - 'latest', - '5.5.4', - '5.4.4', - '5.3.2', - '5.2.4', - '5.1.5', - '5.0.4', - '4.14.3', - '4.13.2', - '4.12.2', - '4.11.3', - '4.10.2', - '4.9.1', - '4.8.2', - '4.7', - '4.6.3', - '4.5.2', - '4.4', - '4.3' - ]; + 'master', + '6.0', + 'latest', + '5.6.1', + '5.5.4', + '5.4.5', + '5.3.2', + '5.2.4', + '5.1.5', + '5.0.4', + '4.14.3', + '4.13.2', + '4.12.2', + '4.11.3', + '4.10.2', + '4.9.1', + '4.8.2', + '4.7', + '4.6.3', + '4.5.2', + '4.4', + '4.3' +]; function build_select(current_version) { if( current_version == 'master') { diff --git a/Maintenance/public_release/announcement/announcement.md b/Maintenance/public_release/announcement/announcement.md index eb9cd301033a..aa1996752509 100644 --- a/Maintenance/public_release/announcement/announcement.md +++ b/Maintenance/public_release/announcement/announcement.md @@ -1,108 +1,257 @@ -The CGAL Open Source Project is pleased to announce the release 5.6 of CGAL, the Computational Geometry Algorithms Library. +The CGAL Open Source Project is pleased to announce the release 6.0 of CGAL, the Computational Geometry Algorithms Library. -Besides fixes and general enhancement to existing packages, the following has changed since CGAL 5.5: +Besides fixes and general enhancement to existing packages, the following has changed since CGAL 5.6: ### General Changes -- **Breaking change**: Package-specific assertions, preconditions, and postconditions (such as `CGAL_triangulation_assertion`) have been removed. Corresponding CGAL-wide versions (such as `CGAL_assertion`) should be used instead. +- CGAL 6.0 is the first release of CGAL that requires a C++ compiler + with the support of C++17 or later. The new list of supported compilers is: + - Visual C++ 15.9, 16.10, 17.0 (from Visual Studio 2017, 2019 and 2022) or later + - Gnu g++ 11.4.0 or later (on Linux or macOS) + - LLVM Clang version 15.0.7 or later (on Linux) + - Apple Clang compiler versions 10.0.1, 12.0.5, and 15.0.0 (on macOS) +- The minimal supported version of Boost is now 1.72.0. +- GMP/MPFR are no longer mandatory to use CGAL, [Boost.Multiprecision](https://www.boost.org/doc/libs/1_72_0/libs/multiprecision/doc/html/index.html). + can be used instead. +- The CGAL `Core` library is no longer based on GMP, but on + [Boost.Multiprecision](https://www.boost.org/doc/libs/1_72_0/libs/multiprecision/doc/html/index.html). + Either GMP backend or Boost backend can be used. +- All demos are now based on Qt6. +- **Breaking change**: The CMake file `UseCGAL.cmake` has been removed from CGAL. + Usages of the CMake variables `${CGAL_USE_FILE}` and `${CGAL_LIBRARIES}` must be replaced + by a link to the imported target `CGAL::CGAL`, for example: + `target_link_library(your_target PRIVATE CGAL::CGAL)`. + +### [Kinetic Space Partition](https://doc.cgal.org/6.0/Manual/packages.html#PkgKineticSpacePartition) (new package) + +- This package implements kinetic space partition: based on a set of planar input shapes, + the bounding box of the input data is split into convex volumes. The complexity of the partition + can be adjusted with a single parameter. + +### [Kinetic Surface Reconstruction](https://doc.cgal.org/6.0/Manual/packages.html#PkgKineticSurfaceReconstruction) (new package) + +- The package implements a piece-wise planar surface reconstruction pipeline from point clouds + combining methods from the [Shape Detection](https://doc.cgal.org/6.0/Manual/packages.html#PkgShapeDetection), + [Shape Regularization](https://doc.cgal.org/6.0/Manual/packages.html#PkgShapeRegularization) + and [Kinetic Shape Partition](https://doc.cgal.org/6.0/Manual/packages.html#PkgKineticSpacePartition) packages + and graph-cut to reconstruct surfaces from point clouds. + +### [Basic Viewer](https://doc.cgal.org/6.0/Basic_viewer/index.html#Chapter_Basic_viewer) (new package) + +- The basic viewer package provides interactive visualization for most CGAL packages, + such as [2D Arrangements](https://doc.cgal.org/6.0/Manual/packages.html#PkgArrangementOnSurface2), + [2D Regularized Boolean Set-Operations](https://doc.cgal.org/6.0/Manual/packages.html#PkgBooleanSetOperations2), + [Linear Cell Complex](https://doc.cgal.org/6.0/Manual/packages.html#PkgLinearCellComplex), + [3D Boolean Operations on Nef Polyhedra](https://doc.cgal.org/6.0/Manual/packages.html#PkgNef3), + [2D Periodic Triangulations](https://doc.cgal.org/6.0/Manual/packages.html#PkgPeriodic2Triangulation2), + [3D Point Set](https://doc.cgal.org/6.0/Manual/packages.html#PkgPointSet3), + [2D Polygons](https://doc.cgal.org/6.0/Manual/packages.html#PkgPolygon2), + [3D Polyhedral Surface](https://doc.cgal.org/6.0/Manual/packages.html#PkgPolyhedron), + [2D Straight Skeleton and Polygon Offsetting](https://doc.cgal.org/6.0/Manual/packages.html#PkgStraightSkeleton2), + [Surface Mesh](https://doc.cgal.org/6.0/Manual/packages.html#PkgSurfaceMesh), + [2D Triangulations](https://doc.cgal.org/6.0/Manual/packages.html#PkgTriangulation2), + [3D Triangulations](https://doc.cgal.org/6.0/Manual/packages.html#PkgTriangulation3), + [2D Voronoi Diagrams](https://doc.cgal.org/6.0/Manual/packages.html#PkgVoronoiDiagram2), + and more. + The most simple use case of the basic viewer is the call of the global `CGAL::draw()` function. + There is one such `draw()` function for each CGAL package that has a basic viewer. Such a call opens + an interactive window showing the given model and allowing to navigate in the scene, + show or hide some specific cells, show the interior of the model if any, etc. + The `Basic_viewer` is based on Qt6. + +### [Polygon Repair](https://doc.cgal.org/6.0/Manual/packages.html#PkgPolygonRepair) (new package) + +- This package provides algorithms to repair 2D polygons, polygons with holes, + and multipolygons with holes, by selecting faces of the arrangement of the input + using the odd-even heuristic. + +### [2D and 3D Linear Geometry Kernel](https://doc.cgal.org/6.0/Manual/packages.html#PkgKernel23) + +- **Breaking change**: Replaced all instances of `boost::variant` with `std::variant` + in the intersection functions. +- **Breaking change**: Replaced all instances of `boost::optional` with `std::optional` + in the intersection functions. + +### [3D Polyhedral Surface](https://doc.cgal.org/6.0/Manual/packages.html#PkgPolyhedron) + +- The demo of this package, also known as "Polyhedron Demo" has been renamed "CGAL Lab" + and moved to its own package ("Lab"). + +### [2D and 3D Fast Intersection and Distance Computation (AABB Tree)](https://doc.cgal.org/6.0/Manual/packages.html#PkgAABBTree) + +- The AABB tree can now be used with 2D or 3D primitives: + - The concepts `AABBGeomTraits` and `AABBRayIntersectionGeomTraits` + have been replaced by [`AABBGeomTraits_3`](https://doc.cgal.org/6.0/AABB_tree/classAABBGeomTraits__3.html) + and by [`AABBRayIntersectionGeomTraits_3`](https://doc.cgal.org/6.0/AABB_tree/classAABBRayIntersectionGeomTraits__3.html), + respectively. + - The concepts [`AABBGeomTraits_2`](https://doc.cgal.org/6.0/AABB_tree/classAABBGeomTraits__2.html) + and [`AABBRayIntersectionGeomTraits_2`](https://doc.cgal.org/6.0/AABB_tree/classAABBRayIntersectionGeomTraits__2.html) + have been introduced, as the 2D counterparts. + - The class [`CGAL::AABB_traits`](https://doc.cgal.org/6.0/AABB_tree/group__PkgAABBTreeRef.html#ga764f0fc59c96355877536810aa1aca5b) + is deprecated and replaced by [`CGAL::AABB_traits_3`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__traits__3.html). + - The class [`CGAL::AABB_traits_2`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__traits__2.html) is introduced as the 2D counterpart. + - The class [`CGAL::AABB_segment_primitive`](https://doc.cgal.org/6.0/AABB_tree/group__PkgAABBTreeRef.html#gad0acfd5c4a3c081b7570cc6bd4594c8d) + has been deprecated and replaced by the class [`CGAL::AABB_segment_primitive_3`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__segment__primitive__3.html). + - The class [`CGAL::AABB_triangle_primitive`](https://doc.cgal.org/6.0/AABB_tree/group__PkgAABBTreeRef.html#ga54a56f01dc8024624f7d83ee0a01add0) + has been deprecated and replaced by the class [`CGAL::AABB_triangle_primitive_3`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__triangle__primitive__3.html). + - The following 2D primitive classes have been added: + [`CGAL::AABB_segment_primitive_2`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__segment__primitive__2.html), + [`CGAL::AABB_polyline_segment_primitive_2`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__polyline__segment__primitive__2.html), + [`CGAL::AABB_triangle_primitive_2`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__triangle__primitive__2.html), + [`CGAL::AABB_indexed_triangle_primitive_2`](https://doc.cgal.org/6.0/AABB_tree/classCGAL_1_1AABB__indexed__triangle__primitive__2.html). +- **Breaking change**: The concept [`AABBTraits`](https://doc.cgal.org/6.0/AABB_tree/classAABBTraits.html) + now refines the concept [`SearchTraits`](https://doc.cgal.org/6.0/Spatial_searching/classSearchTraits.html). +- **Breaking change**: Replaced all instances of `boost::optional` with `std::optional`. + +### [2D Arrangements](https://doc.cgal.org/6.0/Manual/packages.html#PkgArrangementOnSurface2) + +- **Breaking change**: Replaced all instances of `boost::variant` with `std::variant`. +- **Breaking change**: The type of the result of point location queries has been changed to + `std::variant`. Support for the old macro `CGAL_ARR_POINT_LOCATION_VERSION` + has been removed. +- **Breaking change**: Eliminated the error-prone C-type casting that was used to define observers. + In general, backward compatibility was maintained; however, the class template + [`CGAL::Arr_observer`](https://doc.cgal.org/6.0/Arrangement_on_surface_2/group__PkgArrangementOnSurface2Ref.html#ga8019f986f5469920136c4b92290b7b1b) + has been replaced by an alias template. (The class `CGAL::Arr_observer` + was renamed to [`CGAL::Aos_observer`](https://doc.cgal.org/6.0/Arrangement_on_surface_2/classCGAL_1_1Aos__observer.html)). +- Introduced [`Arr_dcel`](https://doc.cgal.org/6.0/Arrangement_on_surface_2/classCGAL_1_1Arr__dcel.html), + which essentially replaces the former `CGAL::Arr_default_dcel`. + Backward compatibility was maintained by the introduction of the alias template + [`CGAL::Arr_default_dcel`](https://doc.cgal.org/6.0/Arrangement_on_surface_2/group__PkgArrangementOnSurface2DCEL.html#gaf9635869a3794a46d7dcfce63d7de2a6). + `CGAL::Arr_dcel`, as opposed to the former `CGAL::Arr_default_dcel` is templated + (in addition to the geometry traits) by `Vertex`, `Halfedge`, and `Face` template parameters, + and they have default type values. All this enables the layered extension of DCEL records. +- Fixed a bug in the zone construction code applied to arrangements of geodesic arcs on a sphere, + when inserting an arc that lies on the identification curve. +- Introduced a new interactive program that demonstrates 2D arrangements embedded on the sphere + called `earth`. The program (i) reads a database of all administrative boundaries of the countries + in the world, (ii) displays the globe with all countries and land covered by water (which is land + not covered by countries) on a window, and (ii) enables interaction with the user. + +### [3D Envelopes](https://doc.cgal.org/6.0/Manual/packages.html#PkgEnvelope3) + +- **Breaking change**: [`Construct_projected_boundary_2`](https://doc.cgal.org/6.0/Envelope_3/classEnvelopeTraits__3.html#ac7b8f72870f0572834a0a3de62c67bc1) + in [`EnvelopeTraits_3`](https://doc.cgal.org/6.0/Envelope_3/classEnvelopeTraits__3.html) + now uses `std::variant` instead of [`CGAL::Object`](https://doc.cgal.org/6.0/STL_Extension/classCGAL_1_1Object.html). +- Passed the base class of [`CGAL::Env_plane_traits_3`](https://doc.cgal.org/6.0/Envelope_3/classCGAL_1_1Env__plane__traits__3.html) + as a template parameter with a default value (being the 2D arrangement linear traits). + Similarly, passed the base class of `CGAL::Env_triangle_traits_3` as a template parameter + with a default value (being the 2D arrangement segment traits). + +### [Combinatorial Maps](https://doc.cgal.org/6.0/Manual/packages.html#PkgCombinatorialMaps) and [Generalized Maps](https://doc.cgal.org/6.0/Manual/packages.html#PkgGeneralizedMaps) + +- Added the function [`insert_cell_1_between_two_cells_2()`](https://doc.cgal.org/6.0/Combinatorial_map/classGenericMap.html#aa29570a0812094c7876e24a228373f12) + to the [`GenericMap`](https://doc.cgal.org/6.0/Combinatorial_map/classGenericMap.html) + concept, which enables users to insert an edge between two different faces in order to create faces with holes. + +### [Quadtrees, Octrees, and Orthtrees](https://doc.cgal.org/6.0/Manual/packages.html#PkgOrthtree) + +- **Breaking change**: + - Node splitting behavior and per-node data are now customizable via the Traits class. + - Nodes are now stored as a property map, with properties of each node accessed by index. + - Nearest neighbors functions only work for Orthtrees which provide the necessary functionality. + +### [CGAL and the Boost Graph Library (BGL)](https://doc.cgal.org/6.0/Manual/packages.html#PkgBGL) + +- Added the function [`CGAL::remove_all_elements()`](https://doc.cgal.org/6.0/BGL/group__PkgBGLHelperFct.html#gac7e199820c95ed1fc6ab536750749358), + which removes vertices, halfedges, and faces without collecting garbage and without removing properties. +- [Dynamic property maps](https://doc.cgal.org/6.0/BGL/group__PkgBGLPropertiesDynamic.html) + can now have a default value. +- The class [`CGAL::Face_filtered_graph`](https://doc.cgal.org/6.0/BGL/structCGAL_1_1Face__filtered__graph.html) + now supports patch IDs of any type and not just `faces_size_type`. The only requirement is that + the type is hashable. + +### [Polygon Mesh Processing](https://doc.cgal.org/6.0/Manual/packages.html#PkgPolygonMeshProcessing) + +- Added the function [`CGAL::Polygon_mesh_processing::autorefine_triangle_soup()`](https://doc.cgal.org/6.0/Polygon_mesh_processing/group__PMP__corefinement__grp.html#gaec85370aa0b2acc0919e5f8406cfb74c), + which can be used to refine a soup of triangles such that no pair of triangles intersects + in their interiors. Also added, the function [`CGAL::Polygon_mesh_processing::autorefine()`](https://doc.cgal.org/6.0/Polygon_mesh_processing/group__PMP__corefinement__grp.html#ga3e3a0a82b6c04bdc3a6c070e8da4aed5) + operating directly on a triangle mesh and updating it using the aforementioned function on a triangle soup. +- Added the class [`CGAL::Corefinement::Non_manifold_output_visitor`](https://doc.cgal.org/6.0/Polygon_mesh_processing/structCGAL_1_1Polygon__mesh__processing_1_1Corefinement_1_1Non__manifold__output__visitor.html), + which can be used in corefinement based functions to deal with non-manifold outputs. +- Added the option to use a variable sizing field for [`CGAL::Polygon_mesh_processing::isotropic_remeshing()`](https://doc.cgal.org/6.0/Polygon_mesh_processing/group__PMP__meshing__grp.html#ga66cb01cf228ed22f0a2a474cfa2aeb3f), + and a sizing function based on a measure of local curvature for adaptive remeshing. +- Added the function [`CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()`](https://doc.cgal.org/6.0/Polygon_mesh_processing/group__PMP__corrected__curvatures__grp.html#ga22665c9ce92aaedab07df1b05f20bdb2) + which can be used to compute the mean and Gaussian curvatures, as well as the principal curvature + and directions. +- Added the function [`CGAL::Polygon_mesh_processing::refine_mesh_at_isolevel()`](https://doc.cgal.org/6.0/Polygon_mesh_processing/group__PkgPolygonMeshProcessingRef.html#ga396505d5a60b5f6d29792b214fa59352) + which can be used to refine a polygon mesh along an isocurve. +- Added the function [`CGAL::Polygon_mesh_processing::add_bbox()`](https://doc.cgal.org/6.0/Polygon_mesh_processing/group__PkgPolygonMeshProcessingRef.html#gabaf98d2fd9ae599ff1f3a5a6cde79cf3), + which enables adding a tight or extended, triangulated or not, bounding box to a face graph. + +### [2D Triangulations](https://doc.cgal.org/6.0/Manual/packages.html#PkgTriangulation2) +- **Breaking change**: the concept [`TriangulationTraits_2`](https://doc.cgal.org/6.0/Triangulation_2/classTriangulationTraits__2.html) now requires an additional functor `Compare_xy_2`. + +### [3D Triangulations](https://doc.cgal.org/6.0/Manual/packages.html#PkgTriangulation3) + +- Added three member functions [`vertices()`](https://doc.cgal.org/6.0/Triangulation_3/classCGAL_1_1Triangulation__3.html#a02faf334255e1ca8caa1a6f412533759) + to the class [`CGAL::Triangulation_3`](https://doc.cgal.org/6.0/Triangulation_3/classCGAL_1_1Triangulation__3.html). + Each of them returns an array containing the vertices of the given triangulation simplex. + +### [dD Triangulations](https://doc.cgal.org/6.0/Manual/packages.html#PkgTriangulations) + +- **Breaking change**: `CGAL::TDS_full_cell_mirror_storage_policy` is now unsupported in dimension larger than 127. +- **Breaking change**: Inserting multiple unweighted points in the same + position now keeps the first one, instead of switching to the latest. This + only affects custom point types where not all points in the same position + are equivalent. + +### [Tetrahedral Remeshing](https://doc.cgal.org/6.0/Manual/packages.html#PkgTetrahedralRemeshing) + +- Added a sizing field as new parameter of [`CGAL::tetrahedral_isotropic_remeshing()`](https://doc.cgal.org/6.0/Tetrahedral_remeshing/group__PkgTetrahedralRemeshingRef.html#ga263775c52eeb483a86a16aeb9eb31af0), + which can be used to perform non-uniform and adaptive remeshing. +- **Breaking change**: The template parameters of + [`CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3`](https://doc.cgal.org/6.0/Tetrahedral_remeshing/classCGAL_1_1Tetrahedral__remeshing_1_1Remeshing__cell__base__3.html) + have been modified, reverting changes introduced in CGAL 5.6. +- **Breaking change**: The vertex base of + [`CGAL::Tetrahedral_remeshing::Remeshing_vertex_base_3`](https://doc.cgal.org/6.0/Tetrahedral_remeshing/classCGAL_1_1Tetrahedral__remeshing_1_1Remeshing__vertex__base__3.html) + must now be a model of the concept + [`SimplicialMeshVertexBase_3`](https://doc.cgal.org/6.0/SMDS_3/classSimplicialMeshVertexBase__3.html) + (and not only [`TriangulationVertexBase_3`](https://doc.cgal.org/6.0/Triangulation_3/classTriangulationVertexBase__3.html)). + +### [3D Simplicial Mesh Data Structure](https://doc.cgal.org/6.0/Manual/packages.html#PkgSMDS3) + +- **Breaking change**: The template parameters of + [`CGAL::Simplicial_mesh_cell_base_3`](https://doc.cgal.org/6.0/SMDS_3/classCGAL_1_1Simplicial__mesh__cell__base__3.html) + have been modified to enable passing a geometric traits and a custom cell base class. -### [Shape Detection](https://doc.cgal.org/5.6/Manual/packages.html#PkgShapeDetection) (major changes) +### [3D Mesh Generation](https://doc.cgal.org/6.0/Manual/packages.html#PkgMesh3) -- **Breaking change**: The region growing part of the package have been reworked to fix design issues introduced with the handling of `FaceGraph` models. In particular, the notion of `Item` has been introduced to reference an element in the input range of elements. Region maps now operates on `Item` and no longer on the value type of the input range. -- **Breaking change**: The method `update()` in the concept `RegionType` now returns a `Boolean` instead of `void`, that is used inside the class `Region_growing` for detecting if the input conditions for the new region are satisfied. This change affects only user-defined types of regions. -- **Breaking change**: The constructors of all models used together with the region growing algorithm now enable users to provide parameters through the [named parameters](https://doc.cgal.org/5.6/BGL/group__bgl__namedparameters.html) mechanism. -- All fitting classes in the region growing framework are now using better versions of the region conditions, more precise and faster, including the correct normal orientations. -- Added new models of the concept `RegionType` for getting linear regions in a set of 2D and 3D segments and on 2D and 3D polylines. -- Added the class `Polyline_graph` for extracting a set of polylines from a face graph, which splits this graph into a set of user-defined regions. -- Added new shapes to the Region Growing algorithm on a point set: circles in 2D, spheres in 3D, and cylinders in 3D. +- **Breaking change**: Removed the concept `TriangleAccessor`, the template parameter `TriangleAccessor`, + as well as the class `Triangle_accessor`. These were no longer used for several releases. +- **Breaking change**: Removed the class templates `CGAL::Gray_image_mesh_domain_3`, `CGAL::Implicit_mesh_domain_3`, + and `CGAL::Labeled_image_mesh_domain_3`, which were deprecated since CGAL-4.13. +- Added new meshing criterion `edge_distance`, an upper bound for the distance from the edge to the 1D feature. +- **Breaking change**: the concept `MeshEdgeCriteria_3` was modified to include the new meshing criterion `edge_distance`. -### [2D Straight Skeleton and Polygon Offsetting](https://doc.cgal.org/5.6/Manual/packages.html#PkgStraightSkeleton2) (major changes) -- Added weighted straight skeletons: weighted straight skeletons are a generalization of straight skeletons. Contour edges are assigned a positive weight, which can be understood as assigning a speed to the wavefront spawned from the contour edge. -- Added straight skeleton extrusion: this CGAL package now implements the extrusion of weighted straight skeletons of polygons with holes. The output is a closed, combinatorially 2-manifold surface triangle mesh. - See also the [news entry](https://www.cgal.org/2023/05/09/improved_straight_skeleton/). -### [2D and 3D Linear Geometry Kernel](https://doc.cgal.org/5.6/Manual/packages.html#PkgKernel23) +### [3D Surface Mesh Generation](https://doc.cgal.org/6.0/Manual/packages.html#PkgSurfaceMesher3) -- Added the functor [`CompareAngle_3`](https://doc.cgal.org/5.6/Kernel_23/classKernel_1_1CompareAngle__3.html) to the concept [`Kernel`](https://doc.cgal.org/5.6/Kernel_23/classKernel.html) to compare an angle defined by three points to the cosinus of another angle. +- This package is deprecated and the package [3D Mesh Generation](https://doc.cgal.org/6.0/Manual/packages.html#PkgMesh3) should + be used instead. -### [Combinatorial Maps](https://doc.cgal.org/5.6/Manual/packages.html#PkgCombinatorialMaps), [Generalized Maps](https://doc.cgal.org/5.6/Manual/packages.html#PkgGeneralizedMaps), and [Linear Cell Complex](https://doc.cgal.org/5.6/Manual/packages.html#PkgLinearCellComplex) +### [Surface Mesh Parameterization](https://doc.cgal.org/6.0/Manual/packages.html#PkgSurfaceMeshParameterization) -- Added a version that uses indices instead of handles as dart and attribute descriptors. As the indices are integers convertible from and to `std::size_t`, they can be used as index into vectors which store properties. To use the index version, `Use_index` must be defined and be equal to `CGAL::Tag_true` in the item class. +- **Breaking change**: The method [`CGAL::Surface_mesh_parameterization::LSCM_parameterizer_3`](https://doc.cgal.org/6.0/Surface_mesh_parameterization/classCGAL_1_1Surface__mesh__parameterization_1_1LSCM__parameterizer__3.html) + now requires the Eigen library. +- **Breaking change**: CGAL no longer ships its own version of OpenNL. -### [Linear Cell Complex](https://doc.cgal.org/5.6/Manual/packages.html#PkgLinearCellComplex) +### [Surface Mesh](https://doc.cgal.org/6.0/Manual/packages.html#PkgSurfaceMesh) -- Added the class [`Linear_cell_complex_incremental_builder_3`](https://doc.cgal.org/5.6/Linear_cell_complex/classCGAL_1_1Linear__cell__complex__incremental__builder__3.html). +- **Breaking change**: The return type of [`CGAL::Surface_mesh::property_map()`](https://doc.cgal.org/6.0/Surface_mesh/classCGAL_1_1Surface__mesh.html#afc99c7ea179dc1c21a2ab59ed183184a) + has been changed to `std::optional`. -### [2D Arrangements](https://doc.cgal.org/5.6/Manual/packages.html#PkgArrangementOnSurface2) +### [3D Point Set](https://doc.cgal.org/6.0/Manual/packages.html#PkgPointSet3) -- Introduced an overload function template, namely `draw(arr)`, that renders arrangements based on the `Basic_viewer_qt` class template. As of now, only 2D arrangements on the plane induced by (i) segments, (ii) conics, and (iii) circular arcs or (linear) segments are supported. -- Improved the traits class template that handles conics, namely [`Arr_conic_traits_2`](https://doc.cgal.org/5.6/Arrangement_on_surface_2/classCGAL_1_1Arr__conic__traits__2.html). This includes the following: 1. Fixed a couple of bugs and slightly optimized some functions. 2. Introduced functionality that approximates conics with polylines. (This is used to draw conic curves.) 3. **Breaking change**: Changed the interface to generate conic curves. In the past, curves where generated directly using the constructors of the conic and x-monotone conic constructs. Now, they are constructed via function objects provided by the traits. This eliminates the constructions of temporary kernels. The old functionality is obsolete, but still supported for a limited number of versions. It depends on a static member function of the traits. In a future version this function will no longer be static, implying that the old functionality will no longer be supported. -- Introduced functionality that approximates circular segments with polylines. (This is used to draw conic curves.) +- **Breaking change**: The return type of [`CGAL::Point_set_3::property_map()`](https://doc.cgal.org/6.0/Point_set_3/classCGAL_1_1Point__set__3.html#a571ecc603cd32d78c7effaf86fe120ad) + has been changed to `std::optional`. -### [Polygon Mesh Processing](https://doc.cgal.org/5.6/Manual/packages.html#PkgPolygonMeshProcessing) +### [Shape Detection](https://doc.cgal.org/6.0/Manual/packages.html#PkgShapeDetection) -- Added functions [`CGAL::Polygon_mesh_processing::region_growing_of_planes_on_faces()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PkgPolygonMeshProcessingRef.html#ga50dcd2f6295f584d2e378b57290ae2af) and [`CGAL::Polygon_mesh_processing::detect_corners_of_regions()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PkgPolygonMeshProcessingRef.html#gac8e445730d718a2fc49604e865017d2e), which enable partitioning a mesh into planar regions using the region growing algorithm from the [Shape Detection](https://doc.cgal.org/5.6/Manual/packages.html#PkgShapeDetection) package. +- **Breaking change**: Replaced all instances of `boost::shared_ptr` with `std::shared_ptr`. -- Added the functions [`CGAL::Polygon_mesh_processing::remesh_planar_patches()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__meshing__grp.html#ga7fca6fa2db94560ab6d32e6a77fc35b6) and [`CGAL::Polygon_mesh_processing::remesh_almost_planar_patches()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__meshing__grp.html#ga0e6da479548199a5d82c3cf0ed36e8a0), which can be used to remesh patches of coplanar faces in a mesh. +### [2D Straight Skeleton and Polygon Offsetting](https://doc.cgal.org/6.0/Manual/packages.html#PkgStraightSkeleton2) -- Added the function [`CGAL::Polygon_mesh_processing::surface_Delaunay_remeshing()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__meshing__grp.html#gaff62f9415d2fe96d1d3095351f156ced), which can be used to remesh a surface triangle mesh using the Delaunay refinement algorithm from the [3D Mesh Generation](https://doc.cgal.org/5.6/Manual/packages.html#PkgMesh3) package. +- **Breaking change**: Replaced all instances of `boost::shared_ptr` with `std::shared_ptr`. +- **Breaking change**: Replaced all instances of `boost::optional` with `std::optional`. -- Added the function [`CGAL::Polygon_mesh_processing::remove_almost_degenerate_faces()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__geometric__repair__grp.html#ga48008d2b66de8a68a7068f29db15dad6), which can be used to remove badly shaped triangles faces in a mesh. - -- Added the functions [`CGAL::Polygon_mesh_processing::does_triangle_soup_self_intersect()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__intersection__grp.html#ga4909920dc48b8285e69feb845feb1e53) and [`CGAL::Polygon_mesh_processing::triangle_soup_self_intersections()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__intersection__grp.html#ga1c5fee17bd0d92d5a2fba77ed94d4b4d) to identify and report self-intersections in a triangle soup, similarly to existing functions on triangle meshes. - -- Added the function [`CGAL::Polygon_mesh_processing::triangulate_polygons()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__meshing__grp.html#ga8b7db6aa8c3e79526b594739ba926d82), which allows users to triangulate polygon soups. - -- Added a named parameter to [`CGAL::Polygon_mesh_processing::smooth_shape()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__meshing__grp.html#ga57fa999abe8dc557003482444df2a189) to disable the scaling, which otherwise aims to compensate volume loss during smoothing. - -- Deprecated the overloads of functions [`CGAL::Polygon_mesh_processing::triangulate_hole()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__hole__filling__grp.html#ga3abdf2d0558822e85f060966b69cae98), [`CGAL::Polygon_mesh_processing::triangulate_and_refine_hole()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__hole__filling__grp.html#ga9868fac4d9dca77462ad7828bc99d8a1), and [`CGAL::Polygon_mesh_processing::triangulate_refine_and_fair_hole()`](https://doc.cgal.org/5.6/Polygon_mesh_processing/group__PMP__hole__filling__grp.html#ga18eac756a8f8e5d5f73e645fd4e26cad) which have output iterators for vertices and faces as parameter. They are replaced by overloads with two additional named parameters. - -### [2D Convex Hulls](https://doc.cgal.org/5.6/Manual/packages.html#PkgConvexHull2) - -- **Breaking change**: The concept [`ConvexHullTraits_2`](https://doc.cgal.org/5.6/Convex_hull_2/classConvexHullTraits__2.html) no longer requires the functor `Less_signed_distance_to_line_2`, but requires the functor `Compare_signed_distance_to_line_2` instead. -- The long-deprecated classes `Convex_hull_projective_xy_traits_2`, `Convex_hull_projective_xz_traits_2`, and `Convex_hull_projective_yz_traits_2` have been removed. Users should use [`Projection_traits_xy_3`](https://doc.cgal.org/5.6/Kernel_23/classCGAL_1_1Projection__traits__xy__3.html), [`Projection_traits_xz_3`](https://doc.cgal.org/5.6/Kernel_23/classCGAL_1_1Projection__traits__xz__3.html), and [`Projection_traits_yz_3`](https://doc.cgal.org/5.6/Kernel_23/classCGAL_1_1Projection__traits__yz__3.html) instead. - -### [2D Triangulations](https://doc.cgal.org/5.6/Manual/packages.html#PkgTriangulation2) - -- Added the function [`CGAL::mark_domain_in_triangulation()`](https://doc.cgal.org/5.6/Triangulation_2/group__PkgTriangulation2Miscellaneous.html#ga0409755d0eb89100810230443a85e7eb) to mark faces connected with non-constrained edges as inside of the domain based on the nesting level. - -### [2D Conforming Triangulations and Meshes](https://doc.cgal.org/5.6/Manual/packages.html#PkgMesh2) - -- Added new overloads to the function [`write_VTU()`](https://doc.cgal.org/5.6/Mesh_2/group__PkgMesh2IO.html), with property maps for specifying the domain. -- Deprecated usage of boost parameters in favor of function named parameters in [`CGAL::lloyd_optimize_mesh_2()`](https://doc.cgal.org/5.6/Mesh_2/group__PkgMesh2Functions.html#gafeaf59d3fa014da287f8514913b38d05). -- Deprecated two overloads of the function [`refine_Delaunay_mesh()`](https://doc.cgal.org/5.6/Mesh_2/group__PkgMesh2Functions.html), and replaced them with versions using function named parameters. - -### [2D Hyperbolic Triangulations](https://doc.cgal.org/5.6/Manual/packages.html#PkgHyperbolicTriangulation2) - -- **Breaking change**: the concept [`HyperbolicTriangulationFaceBase_2`](https://doc.cgal.org/5.6/Hyperbolic_triangulation_2/classHyperbolicTriangulationFaceBase__2.html) has been modified to better reflect the triangulation's requirements and avoid a conflict with the requirements described by the concept `TriangulationDataStructure_2::Face`. The model [`CGAL::Hyperbolic_triangulation_face_base_2`](https://doc.cgal.org/5.6/Hyperbolic_triangulation_2/classCGAL_1_1Hyperbolic__triangulation__face__base__2.html) has been adapted correspondingly. - -### [3D Simplicial Mesh Data Structure](https://doc.cgal.org/5.6/Manual/packages.html#PkgSMDS3) (new package) - -- This new package wraps all the existing code that deals with a [`MeshComplex_3InTriangulation_3`](https://doc.cgal.org/5.6/SMDS_3/classMeshComplex__3InTriangulation__3.html) to describe 3D simplicial meshes, and makes the data structure independent from the [tetrahedral mesh generation](https://doc.cgal.org/5.6/Manual/packages.html#PkgMesh3) package. - -### [Tetrahedral Remeshing](https://doc.cgal.org/5.6/Manual/packages.html#PkgTetrahedralRemeshing) -- **Breaking change**: The template parameters of [`CGAL::Tetrahedral_remeshing::Remeshing_vertex_base_3`](https://doc.cgal.org/5.6/Tetrahedral_remeshing/group__PkgTetrahedralRemeshingClasses.html#ga7ef4f8c0c1ed715c34389ea4ee851a92) and [`CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3`](https://doc.cgal.org/5.6/Tetrahedral_remeshing/classCGAL_1_1Tetrahedral__remeshing_1_1Remeshing__cell__base__3.html) have been modified. - -### [3D Mesh Generation](https://doc.cgal.org/5.6/Manual/packages.html#PkgMesh3) - -- Added two new named parameters to the named constructor [`CGAL::create_labeled_image_mesh_domain()`](https://doc.cgal.org/5.6/Mesh_3/classCGAL_1_1Labeled__mesh__domain__3.html#aec3f58e9883a8036a1b3e379df7d8fa9) for automatic detection and protection of 1D-curves that lie at the intersection of three or more subdomains extracted from labeled images. -- Added [`CGAL::Sizing_field_with_aabb_tree`](https://doc.cgal.org/5.6/Mesh_3/structCGAL_1_1Sizing__field__with__aabb__tree.html), a geometry-aware sizing field for feature edges in polyhedral domains. -- Added new meshing criterion [`edge_min_size`](https://doc.cgal.org/5.6/Mesh_3/classCGAL_1_1Mesh__criteria__3.html#a5f1c2649cb7ea346a3b6a2a8724b4df1) to avoid subdividing sharp edges that are shorter than a prescribed size bound. -- Added new meshing criteria [`facet_min_size`](https://doc.cgal.org/5.6/Mesh_3/classCGAL_1_1Mesh__criteria__3.html#a5f1c2649cb7ea346a3b6a2a8724b4df1) and [`cell_min_size`](https://doc.cgal.org/5.6/Mesh_3/classCGAL_1_1Mesh__criteria__3.html#a5f1c2649cb7ea346a3b6a2a8724b4df1) to prevent Delaunay refinement from creating simplices smaller than a prescribed bound. -- Deprecated usage of boost parameters in favor of function named parameters. - -### [3D Periodic Mesh Generation](https://doc.cgal.org/5.6/Manual/packages.html#PkgPeriodic3Mesh3) - -- Periodic Mesh Generation now supports non-cubic domains. -- Deprecated usage of boost parameters in favor of function named parameters. - -### [Surface Mesh Simplification](https://doc.cgal.org/5.6/Manual/packages.html#PkgSurfaceMeshSimplification) -- The stop predicates [`Count_stop_predicate`](https://doc.cgal.org/5.6/Surface_mesh_simplification/classCGAL_1_1Surface__mesh__simplification_1_1Count__stop__predicate.html) and [`Count_ratio_stop_predicate`](https://doc.cgal.org/5.6/Surface_mesh_simplification/classCGAL_1_1Surface__mesh__simplification_1_1Count__ratio__stop__predicate.html) are renamed to [`Edge_count_stop_predicate`](https://doc.cgal.org/5.6/Surface_mesh_simplification/classCGAL_1_1Surface__mesh__simplification_1_1Edge__count__stop__predicate.html) and [`Edge_count_ratio_stop_predicate`](https://doc.cgal.org/5.6/Surface_mesh_simplification/classCGAL_1_1Surface__mesh__simplification_1_1Edge__count__ratio__stop__predicate.html). Older versions have been deprecated. -- Introduced [`Face_count_stop_predicate`](https://doc.cgal.org/5.6/Surface_mesh_simplification/classCGAL_1_1Surface__mesh__simplification_1_1Face__count__stop__predicate.html) and [`Face_count_ratio_stop_predicate`](https://doc.cgal.org/5.6/Surface_mesh_simplification/classCGAL_1_1Surface__mesh__simplification_1_1Face__count__ratio__stop__predicate.html), which can be used to stop the simplification algorithm based on a desired number of faces in the output, or a ratio between input and output face numbers. - -### [2D Regularized Boolean Set Operations](https://doc.cgal.org/5.6/Manual/packages.html#PkgBooleanSetOperations2) -- Exposed all required member functions of the [`GeneralPolygonWithHoles_2`](https://doc.cgal.org/5.6/Polygon/classGeneralPolygonWithHoles__2.html) concept (e.g., [`clear_outer_boundary()`](https://doc.cgal.org/5.6/Polygon/classGeneralPolygonWithHoles__2.html#a9f5f035047505a2ccab3e68770f51bc6), [`clear_holes()`](https://cgal.geometryfactory.com/CGAL/doc/master/Polygon/classGeneralPolygonWithHoles__2.html#a2a507be648f127ac605da8c670ea2580), and [`clear()`](https://doc.cgal.org/5.6/Polygon/classGeneralPolygonWithHoles__2.html#a2ca4d9b43cc9216c1b2cdb080a915944) ). - -### Known Bug - -- MSVC 2015 is still supported by this version of CGAL, but the feature _Segment Cell Iterator_ of the class [`CGAL::Triangulation_3`](https://doc.cgal.org/5.6/Triangulation_3/classCGAL_1_1Triangulation__3.html) does not compile with MSVC 2015. diff --git a/Maintenance/public_release/announcement/md_annoucement_remove_line_breaks.md b/Maintenance/public_release/announcement/md_annoucement_remove_line_breaks.md new file mode 100644 index 000000000000..4d564f28a10d --- /dev/null +++ b/Maintenance/public_release/announcement/md_annoucement_remove_line_breaks.md @@ -0,0 +1,5 @@ +# Convert Markdown to Github Markdown with long lines + +```shell + pandoc -f markdown -t gfm+hard_line_breaks +``` From 30e1848c0ac07d179fa875ea3d61f2fc5d24b11e Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 27 Sep 2024 18:16:36 +0200 Subject: [PATCH 235/348] this branch will now target 6.0.1 --- Installation/include/CGAL/version.h | 4 ++-- Installation/lib/cmake/CGAL/CGALConfigVersion.cmake | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Installation/include/CGAL/version.h b/Installation/include/CGAL/version.h index 8a5f4d052b09..8cdee7a0aa3f 100644 --- a/Installation/include/CGAL/version.h +++ b/Installation/include/CGAL/version.h @@ -17,10 +17,10 @@ #define CGAL_VERSION_H #ifndef SWIG -#define CGAL_VERSION 6.0 +#define CGAL_VERSION 6.0.1 #define CGAL_GIT_HASH abcdef #endif -#define CGAL_VERSION_NR 1060001000 +#define CGAL_VERSION_NR 1060011000 #define CGAL_SVN_REVISION 99999 #define CGAL_RELEASE_DATE 20240925 diff --git a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake index 310f88038daa..e5e2176a20b3 100644 --- a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake +++ b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake @@ -1,8 +1,8 @@ set(CGAL_MAJOR_VERSION 6) set(CGAL_MINOR_VERSION 0) -set(CGAL_BUGFIX_VERSION 0) +set(CGAL_BUGFIX_VERSION 1) include(${CMAKE_CURRENT_LIST_DIR}/CGALConfigBuildVersion.cmake) -set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "6.0") +set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "6.0.1") set(CGAL_VERSION_PUBLIC_RELEASE_NAME "CGAL-${CGAL_VERSION_PUBLIC_RELEASE_VERSION}") if (CGAL_BUGFIX_VERSION AND CGAL_BUGFIX_VERSION GREATER 0) From c3530e21dcef2794ffc9e827a106cec0a3b774bb Mon Sep 17 00:00:00 2001 From: albert-github Date: Sat, 28 Sep 2024 11:49:56 +0200 Subject: [PATCH 236/348] Spelling correction Spelling correction --- Documentation/doc/biblio/geom.bib | 2 +- .../include/CGAL/Periodic_2_triangulation_2.h | 2 +- Triangulation_2/TODO | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/doc/biblio/geom.bib b/Documentation/doc/biblio/geom.bib index ab364082bf86..9170696f3127 100644 --- a/Documentation/doc/biblio/geom.bib +++ b/Documentation/doc/biblio/geom.bib @@ -9513,7 +9513,7 @@ @article{ass-ctsp-93 , number = 1 , year = 1993 , pages = "27--35" -, keywords = "polygon, triagulation" +, keywords = "polygon, triangulation" , update = "95.05 korneenko" } diff --git a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h index 2d2e3878f82a..160cbfc0a67d 100644 --- a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h @@ -469,7 +469,7 @@ class Periodic_2_triangulation_2 { return construct_segment(ps[0].first, ps[1].first, ps[0].second, ps[1].second); } - /// Converts the Periodic_triangle pt to a Triagle in \f$R^2\f$. + /// Converts the Periodic_triangle pt to a Triangle in \f$R^2\f$. Triangle triangle(const Periodic_triangle &pt) const { Triangle triang = construct_triangle(pt[0].first, pt[1].first, pt[2].first, diff --git a/Triangulation_2/TODO b/Triangulation_2/TODO index a93ed96ea5b9..1737fbc42f3b 100644 --- a/Triangulation_2/TODO +++ b/Triangulation_2/TODO @@ -53,7 +53,7 @@ ou de la face infini - Check if copy constructor and assignment operator of - constrained triangulation transfers the contrained marks. + constrained triangulation transfers the contained marks. - Something still tobe done for remove in Constrained Delaunay_constrained and Constrained_triangulation_plus - Harmoniser find_conflicts() avec le 3d From 0444375c58736ffeddfb8df536708785425683c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 30 Sep 2024 10:11:28 +0200 Subject: [PATCH 237/348] remove leftovers --- Kinetic_space_partition/readme.md | 193 ----------------------------- Kinetic_space_partition/timings.md | 134 -------------------- Kinetic_space_partition/todo.md | 26 ---- 3 files changed, 353 deletions(-) delete mode 100644 Kinetic_space_partition/readme.md delete mode 100644 Kinetic_space_partition/timings.md delete mode 100644 Kinetic_space_partition/todo.md diff --git a/Kinetic_space_partition/readme.md b/Kinetic_space_partition/readme.md deleted file mode 100644 index b654465de42c..000000000000 --- a/Kinetic_space_partition/readme.md +++ /dev/null @@ -1,193 +0,0 @@ -** GENERAL ** - -All the test data are placed in the folder examples/data. The name of the folder indicates the type of data or its complexity. -The complexity 1 is low while the complexity 6 is high. - -Examples are the entry point to the package: -- kinetic_2d_example: 2D kinetic algorithm on a random set of segments -- kinetic_precomputed_shapes_example: 3D kinetic algorithm on a set of user-defined polygons read from a file -- kinetic_random_shapes_example: 3D kinetic algorithm on a set of random polygons, you can provide the number - of input polygons to be generated and the number of vertices each polygon should have -- kinetic_reconstruction_example: given a ply with classified point cloud, it first fits polygons using Region Growing, - then runs 3D kinetic, and finally filters out exterior volumes creating a reconstructed model - -Tests: -- kinetic_2d_stress_test: tests the 2D kinetic algorithm -- kinetic_3d_test_all: tests the 3D kinetic algorithm on all data from the examples folder - -The 3D algorithm is running on macOS with zero warnings. On Windows and Linux, it compiles and works, -but can generate warnings related to conversions between std:size_t and int e.g. or similar warnings. -The 2D algorithm should work on all platforms as well. - - -** CURRENT ISSUES ** - - --- EPICK versus EPECK -- - -By running: -./kinetic_precomputed_shapes_example data/stress-test-4/test-9-rnd-polygons-12-4.off - -first with EPICK and then with EPECK shows a huge difference in runtime. This -data set contains 12 random polygons, each having 4 vertices. The time for EPICK is -milliseconds while for EPECK is about 3 minutes. It can also be noticed that most of -the time is spent at the last iterations while the first iterations are very fast. -It is even slower for `Simple_cartesian`. - -It is probably happening because at the latest iterations the computation involves -all operations carried out from the first iteration. Evaluating these cascading operations -is a slow process. E.g. computing an intersection between two lines at the first iterations -takes seconds while at the higher iterations it takes minutes. - -Another issue shows up when running the code with the following data set: -./kinetic_precomputed_shapes_example data/real-data-test/test-40-polygons.ply 6 -that is with k = 6, where k is the number of allowed intersections between support planes -of the input polygons. Here, at about 5300 iteration, assertions start failing but not because -some parts of the algorithm are not implemented (as indicated in the TODO) but because -the scaling is no longer uniform due to the accumulating errors. It leads to wrong configurations -and hence to the wrong events, which in practice with the correct precision cannot happen. - - --- Possible solutions -- - -- Use EPICK and compute always with respect to the input. E.g. intersections between lines should be -done not between lines at the current and previous iterations but between lines at the current -and first iterations. The reason for this optimization is that if we use simply EPICK, -when the number of input polygons grow, we bump into an issue of the accumulating error that gets -bigger and bigger with each iteration and at some point can break the results. It does not happen -with EPECK but we lose speed there. - -- Use EPECK only when it is absolutely necessary like when computing intersections and -use EPICK for all other computations. This way we avoid accumulating errors and should -preserve speed. - -A few ideas shortly after the meeting with Sebastien: -- speed up kinetic with EPECK by optimizing the parts, which are slow, vtune it -- use different speed for each polygon edge during the uniform scaling, a similar - trick to what is used in the straight skeleton now -- point_2() wrapper inside Support_plane.h: it can compute point not based on the point constructed - at the previous event (which is cascading) but based on the interesting polygon edge and intersection graph edge -- avoid certain events in the queue or keep track only of the last 10 events instead of all of them - - -** INTERNALS ** - - --- File descriptions -- - -- KSR sub-folder, used in both KSR2 and KSR3: - - - conversions.h: the kinetic_traits class that performs intersections, all intersections - in the code are called from this class, here the hybrid mode could be potentially implemented. - - - debug.h: a file with a bunch of functions which enable to export / dump to a file - different intermediate steps, events, data structure, etc. - - - enum.h: enumerations used by the reconstruction code from the Reconstruction.h. - - - parameters.h: internal parameters used in the code. - - - property_map.h: property maps used by the reconstruction code from the Reconstruction.h. - - - utils.h: different internal utilities such as normals, distances, angles, etc. - the most important one is tolerance(): this is a global tolerance used everywhere in the code - -- KSR_2 sub-folder, 2D kinetic algorithm, works and tested, fully implemented by Simon. - -- KSR_3 sub-folder, 3D kinetic algorithm + 3D reconstruction algorithm: - - - Data_structure.h: a class with all conversions and all basic operations, which are - performed on the polygons and during events, it also stores the main intersection graph - and all support planes. - - - Event_queue.h: a wrapper around boost multi_index_container that represents a queue of - all events, which can be sorted by time or vertex type. It is based on doubles so even - when we use EPECK globally, we need to convert to double here because boost multi_index_container - fails to work with EPECK due to the fact that values represented by EPECK can vary when converted - to_double() or to_interval(). - - - Event.h: represents different event types used in the propagation. - - - Intersection_graph.h: a boost adjacency_list graph that stores an initial intersection graph - fully in 3D that is used as constraints for kinetic propagation. - - - Support_plane.h: a wrapper around a support plane for each input polygon that stores a 2D - surface mesh that represents an input polygon. So, initially this mesh has only 1 face that is - input polygon while during propagation it is updated and new vertices, faces are added. We preserve - the uniform scaling of the input polygon and validity of this mesh after each event. If any of these - two fails, the whole algorithm fails. At the end of the support plane header, there is an overload - of the operator()== that is used to compare if two planes are equal. It heavily depends on the - tolerance parameters and in case two planes are found to be equal, they are merged at the initialization step. - - - Initializer.h: a class that gets input polygons, creates an enlarged bounding box, removes all - near-collinear vertices of each polygon, merges all near-coplanar support planes, then inserts each - support plane and intersects it with the bounding box. At the final step, it calls Polygon_splitter - class in order to intersect all polygons within the bounding box, one support plane at a time. - - - Polygon_splitter.h: given a support plane, its original polygon, and a set of intersection edges created - by intersecting all support planes with the bounding box (see Initializer.h), it builds a CDT, inserts all these edges - in the CDT, marks all interior and exterior faces and creates a proper 2D surface mesh. This class can be parameterized - by any kernel independently of the input kernel. - - - Propagation.h: is called after Initializer.h has done its work, this class creates an initial queue of - events for all vertices of all polygons and handles these events one by one. This is the most time-consuming - part of the total algorithm. The queue is updated and rebuilt until no valid events show up. This class can be parameterized - by any kernel independently of the input kernel. - - - Finalizer.h: is called after Propagation.h, this class receives a set of 2D surface meshes from the propagation - and an initial intersection graph and does three things: first it checks the validity of the results, it then searches - for dangling / hanging faces if any and fills the gaps; and finally creates 3D volumes bounded by all faces of the 2D surface meshes. - This class can be parameterized by any kernel independently of the input kernel. - - - Reconstruction.h: this class first gets a point cloud with or without semantic labels. If the labels are missing, some - parts of the code have to be still finished. However, if labels are present, it assumes they come from urban areas that is they are - walls, roofs, ground, and trees. It removes all tree points, fits a polygon to the ground points, runs region growing - separately for wall and roof points and detects convex planar polygons, which approximate the input point cloud. - Next, it runs 3D kinetic on these input polygons + ground polygon and gets a set of volumes, which partition the 3D space. - It then estimates a probability of each volume to be inside or outside the point cloud using Visibility.h and runs the graph cut - algorithm on these estimations using Graphcut.h. At the end, it removes all volumes, which have been labeled as exterior volumes - and returns a reconstructed model: 3D surface mesh that approximates the input point cloud (or buildings in case labels are urban related). - - - Visibility.h: estimates a probability of each partition volume to be inside or outside a point cloud by using normals - of the input points and sampling each volume. - - - Graphcut.h: takes initially estimated probabilities for each volume to be interior or exterior with respect to the point cloud, - computed by Visibility.h, creates a graph where each node is a volume and each edge connects volumes to their neighboring volumes, - and runs the mincut - maxflow Boykov optimization algorithm to define which volumes are inside and outside the point cloud. - All edges are weighted by the face area that adjacent to two incident volumes and all nodes are weighted by the volume itself. - -- Kinetic_shape_reconstruction_2.h: is an entry point to the 2D kinetic propagation. - -- Kinetic_shape_reconstruction_3.h: is an entry point to the 3D kinetic propagation and 3D kinetic reconstruction algorithms. - - --- Epsilon usage inside the code -- - -Note that epsilon tolerance is used throughout the code. It is defined inside utils.h -in the function tolerance(). It is used everywhere where we expect a result of certain precision -but it may not be the case. We check if we outside this tolerance and apply different sub-algorithms -in order to be sure we that will generate the right results. This is mostly used for EPICK. When using EPECK, -the precision is higher and the tolerance should be satisfied until there is a bug. - - --- Important parts of the code -- - - - point_2() wrapper from the Support_plane.h. Currently all original points are 3D, - this wrapper takes a point, and constructs the corresponding 2D point for the chosen - 2D support plane and at the chosen time step. That means all these points are constructed - that is a weak point when using EPECK because it is slow. - - - operator==() at the bottom of the Support_plane.h: controls if two near-coplanar planes should - be merged. If we merge too many planes because our input parameters are very weak, we fail to create - a valid partition. If we do not merge at all, the near-coplanar support planes may lead to intricated - errors in the kinetic propagation due to numerical instabilities. - - - parameters: all all explained in the parameters.h. The parameters used in the Reconstruction.h are defined - in the file examples/include/Parameters.h. - - - FUTURE POINTS AND DIRECTIONS section at the bottom of the Data_structure.h, this is where the future points - are computed and this is a part of the code that leads to multiple precision issues, identifying a future - point from the previous event is hard, so instead we simply translate the lines and intersect them at the next - time step to get the point at which our current vertex will be later, but these intersections are imprecise. - If we lose precision here, we fail to scale polygon uniformly so our point can end up behind the bounding box - or in the direction opposite to the one we need, especially if the lines that we intersect are near parallel. diff --git a/Kinetic_space_partition/timings.md b/Kinetic_space_partition/timings.md deleted file mode 100644 index 66c0257e24af..000000000000 --- a/Kinetic_space_partition/timings.md +++ /dev/null @@ -1,134 +0,0 @@ -Latest timings in Debug/Release for k = 1, sec.: - -# stress test 0 -test-6-polygons : 0.25661897659301757812 / 0.067038059234619140625 - -# stress test 1 -test-8-rnd-polygons-3-4 : 0.11995100975036621094 / 0.041974067687988281250 - -# stress test 2 -test-6-rnd-polygons-3-4 : 0.09911918640136718750 / 0.033115148544311523438 - -# stress test 3 -test-5-rnd-polygons-1-3 : 1.00860095024108886720 / 0.023632049560546875000 -test-10-rnd-polygons-5-4: 0.38532781600952148438 / 0.081948041915893554688 - -# stress test 4 -test-4-rnd-polygons-4-6 : 0.12927484512329101562 / 0.057893991470336914062 -test-5-rnd-polygons-6-4 : 1.25370502471923828120 / 0.145575046539306640620 -test-6-rnd-polygons-5-6 : 0.22723698616027832031 / 0.079273939132690429688 -test-8-rnd-polygons-7-8 : 0.33871507644653320312 / 0.106122970581054687500 -test-9-rnd-polygons-12-4: 3.80337786674499511720 / 0.498121976852416992190 - -# stress test 5 -test-1-rnd-polygons-15-6: 7.18183803558349609380 / 1.013967990875244140600 -test-2-rnd-polygons-20-4: 39.7726359367370605470 / 2.458597183227539062500 - -# real data -test-10-polygons : 1.63361907005310058590 / 0.273458003997802734380 -test-15-polygons : 4.62825703620910644530 / 0.625633955001831054690 -test-20-polygons : 21.0442938804626464840 / 1.322691202163696289100 - ----------------------------------------- - -Initial timings in Debug/Release for k = 1, sec.: - -# stress test 0 -test-6-polygons : 1.74040412902832031250 / 0.93602585792541503906 // uniform - -# stress test 1 -test-8-rnd-polygons-3-4 : 0.56194806098937988281 / 0.32906508445739746094 // random - -# stress test 2 -test-6-rnd-polygons-3-4 : 0.45945405960083007812 / 0.30190992355346679688 // random - -# stress test 3 -test-5-rnd-polygons-1-3 : 5.19128680229187011720 / 2.26561689376831054690 // long queue -test-10-rnd-polygons-5-4: 1.91159391403198242190 / 0.86900997161865234375 // random - -# stress test 4 -test-4-rnd-polygons-4-6 : 0.65437197685241699219 / 0.40509605407714843750 // random -test-5-rnd-polygons-6-4 : 5.85984015464782714840 / 1.62112498283386230470 // long queue -test-6-rnd-polygons-5-6 : 1.26136302947998046880 / 0.79284501075744628906 // random -test-8-rnd-polygons-7-8 : 1.93336105346679687500 / 1.18615603446960449220 // random -test-9-rnd-polygons-12-4: 20.0204198360443115230 / 10.0104908943176269530 // random - -# stress test 5 -test-1-rnd-polygons-15-6: 33.7394499778747558590 / 19.8511409759521484380 // random -test-2-rnd-polygons-20-4: 146.272709131240844730 / 81.1140849590301513670 // random - -# real data -test-10-polygons : 12.0924539566040039060 / 7.11851215362548828120 // real -test-15-polygons : 23.6766490936279296880 / 14.2001228332519531250 // real -test-20-polygons : 99.7220361232757568360 / 56.3559079170227050780 // real - ----------------------------------------- - -Kinetic Release (Ours) exact(inexact) timings in Release for k = 1, sec.: - -# stress test 0 -test-6-polygons : 0.070086956024169921875(0.0031790733337402343750)/0.0007059574127197265625/0.0011909008026123046875 - -# stress test 1 -test-8-rnd-polygons-3-4 : 0.036616086959838867188(0.0014970302581787109375)/0.0005979537963867187500/0.0005519390106201171875 - -# stress test 2 -test-6-rnd-polygons-3-4 : 0.031713008880615234375(0.0014698505401611328125)/0.0004079341888427734375/0.0003998279571533203125 - -# stress test 3 -test-5-rnd-polygons-1-3 : 0.013506889343261718750(0.0007200241088867187500)/0.0159411430358886718750/0.0001947879791259765625 -test-10-rnd-polygons-5-4: 0.082195997238159179688(0.0027201175689697265625)/0.0013699531555175781250/0.0011131763458251953125 - -# stress test 4 -test-4-rnd-polygons-4-6 : 0.057297945022583007812(0.0021529197692871093750)/0.0004389286041259765625/0.0008690357208251953125 -test-5-rnd-polygons-6-4 : 0.143490076065063476560(0.0038468837738037109375)/0.0038821697235107421875/0.0029499530792236328125 -test-6-rnd-polygons-5-6 : 0.079412937164306640625(0.0025489330291748046875)/0.0006108283996582031250/0.0010251998901367187500 -test-8-rnd-polygons-7-8 : 0.107537984848022460940(0.0038201808929443359375)/0.0009238719940185546875/0.0017449855804443359375 -test-9-rnd-polygons-12-4: 0.496004104614257812500(0.0116169452667236328120)/0.0060429573059082031250/0.0100910663604736328120 - -# stress test 5 -test-1-rnd-polygons-15-6: 0.980010986328125000000(0.0224440097808837890620)/0.0067451000213623046875/0.0224370956420898437500 -test-2-rnd-polygons-20-4: 2.400671005249023437500(0.0474650859832763671880)/0.0210092067718505859380/0.0636138916015625000000 - -# real data -test-10-polygons : 0.270509958267211914060(0.0079689025878906250000)/0.0023949146270751953125/0.0052959918975830078125 -test-15-polygons : 0.587618112564086914060(0.0166199207305908203120)/0.0055429935455322265625/0.0223670005798339843750 -test-20-polygons : 1.292979955673217773400(0.0307259559631347656250)/0.0119550228118896484380/0.0364160537719726562500 - ----------------------------------------- - -Kinetic Release (JPs) timings in Release for k = 1, sec.: - -# stress test 0 -test-6-polygons : 0.0278370000000000006320/0.0347570000000000031700/0.0290839999999999987420 -> 0.093272999999999994802 - -# stress test 1 -test-8-rnd-polygons-3-4 : 0.0131030000000000000640/0.0126979999999999992180/0.0144899999999999994080 -> 0.041284000000000001251 - -# stress test 2 -test-6-rnd-polygons-3-4 : 0.0152639999999999997900/0.0097359999999999998627/0.0176100000000000006530 -> 0.043695999999999998731 - -# stress test 3 -test-5-rnd-polygons-1-3 : 0.0081639999999999993824/0.0024559999999999998499/0.0104040000000000000540 -> 0.021806999999999999995 -test-10-rnd-polygons-5-4: 0.0250879999999999991900/0.0397320000000000034260/0.0229740000000000013650 -> 0.089145000000000002016 - -# stress test 4 -test-4-rnd-polygons-4-6 : 0.0208039999999999995760/0.0158930000000000008760/0.0158310000000000013210 -> 0.053793000000000000538 -test-5-rnd-polygons-6-4 : 0.0386820000000000011050/0.0381319999999999992290/0.0235430000000000014260 -> 0.101880999999999999340 -test-6-rnd-polygons-5-6 : 0.0302249999999999983960/0.0265990000000000011150/0.0220519999999999986860 -> 0.080500000000000002109 -test-8-rnd-polygons-7-8 : 0.0391299999999999981170/0.0386449999999999987970/0.0259939999999999997450 -> 0.105458999999999997190 -test-9-rnd-polygons-12-4: 0.0950430000000000024810/0.1412920000000000009300/0.0490410000000000012580 -> 0.289791000000000020800 - -# stress test 5 -test-1-rnd-polygons-15-6: 0.1477860000000000007000/0.2010520000000000084800/0.0595559999999999978290 -> 0.413885000000000002900 -test-2-rnd-polygons-20-4: 0.2607679999999999997900/0.4968259999999999898500/0.0970730000000000065040 -> 0.864171000000000022470 - -# real data -test-10-polygons : 0.0910910000000000052990/0.1207400000000000001000/0.0345089999999999980100 -> 0.249154999999999987590 -test-15-polygons : 0.1489729999999999943100/0.1405540000000000122600/0.0711249999999999937830 -> 0.366400999999999976710 -test-20-polygons : 0.2263779999999999958900/0.5643979999999999552800/0.1116729999999999944900 -> 0.912132000000000053850 - -# Many polygons: - -50 polygons : 24.09685707092285156250/0.20391988754272460938/4.08338499069213867188 -50 polygons : 16.14023399353027343750/0.12071609497070312500/1.23236894607543945312 diff --git a/Kinetic_space_partition/todo.md b/Kinetic_space_partition/todo.md deleted file mode 100644 index 72100cda68bb..000000000000 --- a/Kinetic_space_partition/todo.md +++ /dev/null @@ -1,26 +0,0 @@ -TODO: - -- Try to add a custom exact queue that supports EPECK, because now we convert to doubles there. - -- What about accumulating errors in EPICK? Maybe we could use hybrid mode doing only important computations exactly like intersections e.g. Another idea is to compute intersections with respect to the original input data instead of the data obtained from the previous iteration. - -- Fix case with touching along an edge polygons at the initialization step, they should propagate while now they do not. See e.g. the edge-case-test/test-same-time.off data set. - -- Can we avoid any inexact computations such as sqrt completely? - -- Fix stress-test-6 cases - they are random, their results may depend on an initial unlucky configuration so we probably need to implement random perturbation before running them as in the original paper. - -- Should we also add random perturbation that can be on or off depending on the input. - -- EPICK fails: 40 polygons k = 1 and coplanarity = 0.1 or 40 polygons k = 6 and coplanarity = 0.5; 40 polygons - the one from real-data-test; coplanarity is from Support_plane.h operator==(). - -- EPECK stress-test-5/test-2-rnd-polygons-20-4 runs extremely slow, does it actually finish? Btw real data with the same number of polygons work much faster! Maybe we better test it from now on only on real data because this is what is going to be most-likely used in real life. Can this speed issue be related to conversion from exact to inexact when creating a queue? It seems to hang at the end of each event that is when we check and continue execution with the next event. Maybe the event queue access is so slow? Do we utilize the technique from the paper, storing and accessing only the last three events? The values maybe grow so much that each intersection takes very long time if we use exact type everywhere. - -- Try to avoid errors by using a smaller step. - -- Make intersections a part of kinetic traits that is exact. - -- Try to find out where we lose precision the most. - -- In naive hybrid mode, we manage to succeed for more events, which means that making more exact computations improves the algorithm, that is a good sign, -however doing them all exactly is very slow, so the trade-off must be found. \ No newline at end of file From 82800848b323fe34fe36b2d2172624fc0075718b Mon Sep 17 00:00:00 2001 From: albert-github Date: Mon, 30 Sep 2024 12:51:01 +0200 Subject: [PATCH 238/348] Update Triangulation_2/TODO Co-authored-by: Andreas Fabri --- Triangulation_2/TODO | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Triangulation_2/TODO b/Triangulation_2/TODO index 1737fbc42f3b..bbab622affc3 100644 --- a/Triangulation_2/TODO +++ b/Triangulation_2/TODO @@ -54,7 +54,7 @@ ou de la face infini - Check if copy constructor and assignment operator of constrained triangulation transfers the contained marks. -- Something still tobe done for remove in Constrained +- Something still to be done for remove in Constrained Delaunay_constrained and Constrained_triangulation_plus - Harmoniser find_conflicts() avec le 3d - tester entree vrml From 0a1d294965eb256e93ac82550a58b8c0069461d5 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Tue, 1 Oct 2024 09:51:57 +0200 Subject: [PATCH 239/348] KSP, KSR: assert -> CGAL_assertion --- .../include/Terminal_parser.h | 4 +- .../include/CGAL/KSP/debug.h | 2 +- .../include/CGAL/KSP_3/Initializer.h | 4 +- .../include/CGAL/KSP_3/Support_plane.h | 4 +- .../include/CGAL/Kinetic_space_partition_3.h | 38 +++++++++---------- .../kinetic_3d_test_all.cpp | 3 +- .../include/Terminal_parser.h | 4 +- .../include/CGAL/KSR_3/Graphcut.h | 6 +-- .../CGAL/Kinetic_surface_reconstruction_3.h | 6 +-- 9 files changed, 36 insertions(+), 35 deletions(-) diff --git a/Kinetic_space_partition/examples/Kinetic_space_partition/include/Terminal_parser.h b/Kinetic_space_partition/examples/Kinetic_space_partition/include/Terminal_parser.h index 2011d6508714..33c136f051c6 100644 --- a/Kinetic_space_partition/examples/Kinetic_space_partition/include/Terminal_parser.h +++ b/Kinetic_space_partition/examples/Kinetic_space_partition/include/Terminal_parser.h @@ -163,7 +163,7 @@ namespace KSR { const char** parameters, Input_parameters& input_parameters) { - assert(num_parameters > 0); + CGAL_assertion(num_parameters > 0); for (int i = 1; i < num_parameters; ++i) { std::string str = static_cast(parameters[i]); @@ -232,7 +232,7 @@ namespace KSR { bool does_parameter_have_default_value( const std::string parameter_name, const Input_parameters& input_parameters) { - assert(does_parameter_exist(parameter_name, input_parameters)); + CGAL_assertion(does_parameter_exist(parameter_name, input_parameters)); return input_parameters.at(parameter_name) == "default"; } diff --git a/Kinetic_space_partition/include/CGAL/KSP/debug.h b/Kinetic_space_partition/include/CGAL/KSP/debug.h index d2f8b408ea37..7dced2973520 100644 --- a/Kinetic_space_partition/include/CGAL/KSP/debug.h +++ b/Kinetic_space_partition/include/CGAL/KSP/debug.h @@ -539,7 +539,7 @@ class Saver { const std::vector& vertices, const std::vector& tris, const std::string file_name) const { - assert((tris.size() % 3) == 0); + CGAL_assertion((tris.size() % 3) == 0); std::stringstream stream; initialize(stream); diff --git a/Kinetic_space_partition/include/CGAL/KSP_3/Initializer.h b/Kinetic_space_partition/include/CGAL/KSP_3/Initializer.h index be34da2cb05e..f8e38728d2d6 100644 --- a/Kinetic_space_partition/include/CGAL/KSP_3/Initializer.h +++ b/Kinetic_space_partition/include/CGAL/KSP_3/Initializer.h @@ -440,7 +440,7 @@ class Initializer { minp = from_exact(intersection); //min = proj; typename Intersection_kernel::FT p = dir * edge_dir; - assert(p != 0); + CGAL_assertion(p != 0); min_speed = CGAL::approximate_sqrt(edge_dir * edge_dir) / from_exact(p); } if (emax < eproj) { @@ -449,7 +449,7 @@ class Initializer { maxp = from_exact(intersection); //max = proj; typename Intersection_kernel::FT p = dir * edge_dir; - assert(p != 0); + CGAL_assertion(p != 0); max_speed = CGAL::approximate_sqrt(edge_dir * edge_dir) / from_exact(p); } } diff --git a/Kinetic_space_partition/include/CGAL/KSP_3/Support_plane.h b/Kinetic_space_partition/include/CGAL/KSP_3/Support_plane.h index b15330727372..10ef59f9cfc8 100644 --- a/Kinetic_space_partition/include/CGAL/KSP_3/Support_plane.h +++ b/Kinetic_space_partition/include/CGAL/KSP_3/Support_plane.h @@ -404,9 +404,9 @@ class Support_plane { for (std::size_t i = 0; i < m_data->original_directions.size(); i++) { for (std::size_t j = 0; j < m_data->original_directions.size(); j++) { if (j < i) - assert(m_data->original_directions[j] < m_data->original_directions[i]); + CGAL_assertion(m_data->original_directions[j] < m_data->original_directions[i]); if (j > i) - assert(m_data->original_directions[i] < m_data->original_directions[j]); + CGAL_assertion(m_data->original_directions[i] < m_data->original_directions[j]); } } diff --git a/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h b/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h index ab53a84a6d93..4a8353e90a3e 100644 --- a/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h +++ b/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h @@ -501,8 +501,8 @@ class Kinetic_space_partition_3 { for (auto p : m_input2regularized) n.insert(p); - assert(m_regularized2input.size() == m_input_polygons.size()); - assert(m_regularized2input.size() == n.size()); + CGAL_assertion(m_regularized2input.size() == m_input_polygons.size()); + CGAL_assertion(m_regularized2input.size() == n.size()); if (m_parameters.bbox_dilation_ratio < FT(1)) { CGAL_warning_msg(m_parameters.bbox_dilation_ratio >= FT(1), @@ -963,7 +963,7 @@ class Kinetic_space_partition_3 { lcc.template info<2>(face_dart).plane = m_partition_nodes[faces_of_volume[j].first].m_data->support_plane(m_partition_nodes[faces_of_volume[j].first].m_data->face_to_support_plane()[faces_of_volume[j].second]).exact_plane(); } else { - assert(lcc.template info<2>(face_dart).part_of_initial_polygon == m_partition_nodes[faces_of_volume[j].first].m_data->face_is_part_of_input_polygon()[faces_of_volume[j].second]); + CGAL_assertion(lcc.template info<2>(face_dart).part_of_initial_polygon == m_partition_nodes[faces_of_volume[j].first].m_data->face_is_part_of_input_polygon()[faces_of_volume[j].second]); } vtx_of_face.clear(); @@ -1031,7 +1031,7 @@ class Kinetic_space_partition_3 { }; const Point_3& volume_centroid(std::size_t volume_index) const { - assert(volume_index < m_volumes.size()); + CGAL_assertion(volume_index < m_volumes.size()); auto p = m_volumes[volume_index]; return m_partition_nodes[p.first].m_data->volumes()[p.second].centroid; } @@ -1135,7 +1135,7 @@ class Kinetic_space_partition_3 { template void faces_of_input_polygon(const std::size_t polygon_index, OutputIterator it) const { if (polygon_index >= m_input_planes.size()) { - assert(false); + CGAL_assertion(false); } for (std::size_t idx : m_partitions) { @@ -1190,14 +1190,14 @@ class Kinetic_space_partition_3 { const auto &p = m_partition_nodes[face_index.first].face_neighbors[face_index.second]; if (p.second.second >= std::size_t(-6)) { // Faces on the boundary box are neighbors with an infinite outside volume auto it = m_index2volume.find(p.first); - assert(it != m_index2volume.end()); + CGAL_assertion(it != m_index2volume.end()); return std::pair(static_cast(it->second), static_cast(p.second.second)); } else { auto it1 = m_index2volume.find(p.first); - assert(it1 != m_index2volume.end()); + CGAL_assertion(it1 != m_index2volume.end()); auto it2 = m_index2volume.find(p.second); - assert(it2 != m_index2volume.end()); + CGAL_assertion(it2 != m_index2volume.end()); return std::pair(static_cast(it1->second), static_cast(it2->second)); } } @@ -1288,8 +1288,8 @@ class Kinetic_space_partition_3 { } vertices.back()->info().idA2 = pts_idx[f][v]; - assert(pts_idx[f][v].first != static_cast(-1)); - assert(pts_idx[f][v].second != static_cast(-1)); + CGAL_assertion(pts_idx[f][v].first != static_cast(-1)); + CGAL_assertion(pts_idx[f][v].second != static_cast(-1)); vertices.back()->info().adjacent.insert(faces[f]); vertices.back()->info().set_point(pts[f][v]); face2vtx[pts_idx[f][v]] = vertices.size() - 1; @@ -1805,7 +1805,7 @@ class Kinetic_space_partition_3 { for (std::size_t j = 0; j < vtx.size(); j++) { auto it = vtx2index.find(vtx[j]); - assert(it != vtx2index.end()); + CGAL_assertion(it != vtx2index.end()); if (vertices_of_volume.find(vtx[j]) == vertices_of_volume.end() && added_vertices[it->second]) return false; } @@ -1872,7 +1872,7 @@ class Kinetic_space_partition_3 { From_exact from_exact; auto pair = replaced.insert(f); std::size_t idx; - assert(m_partition_nodes[f.first].face_neighbors[f.second].first.first == f.first); + CGAL_assertion(m_partition_nodes[f.first].face_neighbors[f.second].first.first == f.first); std::size_t vol_idx = m_partition_nodes[f.first].face_neighbors[f.second].first.second; if (!pair.second) { @@ -1890,11 +1890,11 @@ class Kinetic_space_partition_3 { else { idx = f.second; // All boundary faces should have a negative second neighbor. - assert(m_partition_nodes[f.first].face_neighbors[idx].second.second >= std::size_t(-6)); + CGAL_assertion(m_partition_nodes[f.first].face_neighbors[idx].second.second >= std::size_t(-6)); } std::vector& vertices = m_partition_nodes[f.first].face2vertices[idx]; // First neighbor of other face should point to the inside volume in the other partition and thus cannot be negative - assert(m_partition_nodes[other.first].face_neighbors[other.second].first.second < std::size_t(-6)); + CGAL_assertion(m_partition_nodes[other.first].face_neighbors[other.second].first.second < std::size_t(-6)); m_partition_nodes[f.first].face_neighbors[idx].second = m_partition_nodes[other.first].face_neighbors[other.second].first; vertices.resize(polygon.size()); for (std::size_t i = 0; i < polygon.size(); i++) { @@ -1961,7 +1961,7 @@ class Kinetic_space_partition_3 { auto eit = cdt.incident_edges(face.back(), last); auto first = eit; - assert(!cdt.is_infinite(eit->first)); + CGAL_assertion(!cdt.is_infinite(eit->first)); do { // Export tri @@ -1984,7 +1984,7 @@ class Kinetic_space_partition_3 { break; } eit++; - assert(eit != first); + CGAL_assertion(eit != first); } while (eit != first); // If last vertex is equal to first vertex, stop // Take last vertex and face @@ -1992,7 +1992,7 @@ class Kinetic_space_partition_3 { // Check if opposite face of next edge, if not same, add next vertex and reloop // if not, check next face - assert(face.size() < 100); + CGAL_assertion(face.size() < 100); } // The last vertex is equal to the first one, so it should be removed. @@ -2055,7 +2055,7 @@ class Kinetic_space_partition_3 { } void adapt_internal_edges(const CDTplus& cdtC, const std::vector &faces_node, std::vector >& c) { - assert(faces_node.size() == c.size()); + CGAL_assertion(faces_node.size() == c.size()); //std::size_t not_skipped = 0; @@ -2092,7 +2092,7 @@ class Kinetic_space_partition_3 { // Check length of constraint // size 2 means it has not been split, thus there are no t-junctions. - assert (vertices_of_edge.size() >= 2); + CGAL_assertion(vertices_of_edge.size() >= 2); faces_of_volume.clear(); faces(volume, std::back_inserter(faces_of_volume)); diff --git a/Kinetic_space_partition/test/Kinetic_space_partition/kinetic_3d_test_all.cpp b/Kinetic_space_partition/test/Kinetic_space_partition/kinetic_3d_test_all.cpp index 77531de7cc0f..1fb8898a1535 100644 --- a/Kinetic_space_partition/test/Kinetic_space_partition/kinetic_3d_test_all.cpp +++ b/Kinetic_space_partition/test/Kinetic_space_partition/kinetic_3d_test_all.cpp @@ -33,6 +33,7 @@ bool run_test( input_file_ply.close(); else { std::cerr << "ERROR: can't read the OFF/PLY file " << filename << "!" << std::endl; + different++; return false; } @@ -278,7 +279,7 @@ void run_all_tests() { const auto kernel_name = boost::typeindex::type_id().pretty_name(); if (different != 0) { - std::cout << std::endl << kernel_name << different << " TESTS differ from typical values!" << std::endl << std::endl; + std::cout << std::endl << kernel_name << " " << different << " TESTS differ from typical values!" << std::endl << std::endl; } std::cout << std::endl << kernel_name << " TESTS SUCCESS!" << std::endl << std::endl; } diff --git a/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/include/Terminal_parser.h b/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/include/Terminal_parser.h index 248abe895c0f..126ab1fe03a4 100644 --- a/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/include/Terminal_parser.h +++ b/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/include/Terminal_parser.h @@ -163,7 +163,7 @@ namespace KSR { const char** parameters, Input_parameters& input_parameters) { - assert(num_parameters > 0); + CGAL_assertion(num_parameters > 0); for (int i = 1; i < num_parameters; ++i) { std::string str = static_cast(parameters[i]); @@ -232,7 +232,7 @@ namespace KSR { bool does_parameter_have_default_value( const std::string parameter_name, const Input_parameters& input_parameters) { - assert(does_parameter_exist(parameter_name, input_parameters)); + CGAL_assertion(does_parameter_exist(parameter_name, input_parameters)); return input_parameters.at(parameter_name) == "default"; } diff --git a/Kinetic_surface_reconstruction/include/CGAL/KSR_3/Graphcut.h b/Kinetic_surface_reconstruction/include/CGAL/KSR_3/Graphcut.h index 4c9453d4cb2d..1ab1a8fcb6cf 100644 --- a/Kinetic_surface_reconstruction/include/CGAL/KSR_3/Graphcut.h +++ b/Kinetic_surface_reconstruction/include/CGAL/KSR_3/Graphcut.h @@ -46,12 +46,12 @@ namespace KSR_3 { const FT beta) : m_beta(beta) { } void solve(const std::vector >& edges, const std::vector& edge_weights, const std::vector > &cost_matrix, std::vector &labels) { - assert(edges.size() == edge_weights.size()); - assert(!cost_matrix.empty()); + CGAL_assertion(edges.size() == edge_weights.size()); + CGAL_assertion(!cost_matrix.empty()); labels.resize(cost_matrix[0].size()); for (std::size_t i = 0; i < cost_matrix[0].size(); i++) { // Verify quadratic size - assert(cost_matrix[0].size() == cost_matrix[1].size()); + CGAL_assertion(cost_matrix[0].size() == cost_matrix[1].size()); labels[i] = (cost_matrix[0][i] > cost_matrix[1][0]) ? 1 : 0; } compute_graphcut(edges, edge_weights, cost_matrix, labels); diff --git a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h index 7df975df13c3..30c2f6f4e30f 100644 --- a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h +++ b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h @@ -653,7 +653,7 @@ class Kinetic_surface_reconstruction_3 { for (std::size_t i = 0; i < m_faces_lcc.size(); i++) { auto n = m_lcc.template one_dart_per_incident_cell<3, 2>(m_faces_lcc[i]); - assert(n.size() == 1 || n.size() == 2); + CGAL_assertion(n.size() == 1 || n.size() == 2); auto it = n.begin(); // auto& finf = m_lcc.template info<2>(m_faces_lcc[i]); @@ -1585,7 +1585,7 @@ class Kinetic_surface_reconstruction_3 { other_faces.push_back(dh); // Contains faces originating from the octree decomposition as well as bbox faces } - assert(m_kinetic_partition.input_planes().size() == m_regions.size()); + CGAL_assertion(m_kinetic_partition.input_planes().size() == m_regions.size()); for (std::size_t i = 0; i < m_kinetic_partition.input_planes().size(); i++) { @@ -1942,7 +1942,7 @@ class Kinetic_surface_reconstruction_3 { std::vector faces; if (polygon_index >= m_kinetic_partition.input_planes().size()) - assert(false); + CGAL_assertion(false); From_exact from_exact; From 463bfcd59ebab13e94d3d6eba40a226890713a24 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Tue, 1 Oct 2024 10:10:38 +0200 Subject: [PATCH 240/348] Orthtree: assert -> CGAL_assertion --- Orthtree/include/CGAL/Orthtree_traits_polygons.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Orthtree/include/CGAL/Orthtree_traits_polygons.h b/Orthtree/include/CGAL/Orthtree_traits_polygons.h index c28326a24bfc..4030d0bba1e6 100644 --- a/Orthtree/include/CGAL/Orthtree_traits_polygons.h +++ b/Orthtree/include/CGAL/Orthtree_traits_polygons.h @@ -94,7 +94,7 @@ struct Orthtree_traits_polygons : public Orthtree_traits_base Point_d interpolate(FT a, FT b, FT l, const Point_d pa, const Point_d pb) const { FT f = CGAL::abs((a - l) / (a - b)); - assert(f <= 1.0); + CGAL_assertion(f <= 1.0); return Point_d((1 - f) * pa.x() + f * pb.x(), (1 - f) * pa.y() + f * pb.y(), (1 - f) * pa.z() + f * pb.z()); } From f91765503c7786fc970f7f0af1578d5236843889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 1 Oct 2024 11:55:57 +0200 Subject: [PATCH 241/348] demo improvement and various clean-ups --- Basic_viewer/doc/Basic_viewer/dependencies | 1 + Data/data/wkt/norway-MP.wkt | 1 + .../Qt/GraphicsViewPolygonWithHolesInput.h | 6 + .../CGAL/Qt/GraphicsViewPolylineInput.h | 6 + .../CGAL/Qt/GraphicsViewPolylineInput_impl.h | 4 + .../Qt/MultipolygonWithHolesGraphicsItem.h | 235 ++++++++++++++++++ .../Concepts/GeneralPolygonWithHoles_2.h | 1 + .../include/CGAL/Multipolygon_with_holes_2.h | 1 + .../Polygon_repair/repair_polygon_2.cpp | 8 +- 9 files changed, 261 insertions(+), 2 deletions(-) create mode 100644 Data/data/wkt/norway-MP.wkt create mode 100644 GraphicsView/include/CGAL/Qt/MultipolygonWithHolesGraphicsItem.h diff --git a/Basic_viewer/doc/Basic_viewer/dependencies b/Basic_viewer/doc/Basic_viewer/dependencies index c684a90bb27f..6f09e538dbbc 100644 --- a/Basic_viewer/doc/Basic_viewer/dependencies +++ b/Basic_viewer/doc/Basic_viewer/dependencies @@ -14,3 +14,4 @@ Triangulation_3 Voronoi_diagram_2 Kernel_23 Arrangement_on_surface_2 +Stream_support \ No newline at end of file diff --git a/Data/data/wkt/norway-MP.wkt b/Data/data/wkt/norway-MP.wkt new file mode 100644 index 000000000000..ac9cbbaa26ff --- /dev/null +++ b/Data/data/wkt/norway-MP.wkt @@ -0,0 +1 @@ +MULTIPOLYGON(((4.65016 61.0338,4.65527 61.0225,4.66775 61.0169,4.67118 61.021,4.67568 61.0221,4.67807 61.0126,4.67244 61.0077,4.67845 61.0037,4.67919 61,4.67955 60.9982,4.68768 60.9954,4.69209 60.9969,4.69391 61,4.69916 61.0088,4.70842 61.0168,4.70739 61.0243,4.70993 61.0281,4.71724 61.02,4.71495 61.0125,4.70521 61.0022,4.7031 61,4.70013 60.9969,4.71082 60.993,4.70964 60.9895,4.71453 60.9863,4.72109 60.9889,4.72444 60.9934,4.72184 60.997,4.72339 60.9986,4.73255 60.9977,4.73565 61,4.74171 61.0181,4.74982 61.0272,4.74382 61.0336,4.72371 61.0373,4.72057 61.0458,4.70889 61.0522,4.70979 61.0547,4.71636 61.0551,4.71849 61.0586,4.71729 61.0622,4.70676 61.0652,4.70859 61.0669,4.71274 61.0707,4.70576 61.0819,4.69517 61.0828,4.6567 61.067,4.6548 61.0623,4.65951 61.0554,4.65271 61.0539,4.65167 61.052,4.6627 61.0443,4.65511 61.0421,4.65434 61.0388,4.66032 61.0327,4.65016 61.0338)),((4.66676 61.2983,4.66849 61.2945,4.6865 61.2903,4.69255 61.291,4.6832 61.2995,4.6834 61.3032,4.67386 61.3032,4.66676 61.2983)),((4.6925 61.3006,4.70192 61.2942,4.70449 61.2886,4.71859 61.2872,4.72825 61.2913,4.73583 61.2891,4.75236 61.2903,4.75463 61.2904,4.75475 61.2875,4.7589 61.2858,4.76519 61.2877,4.77113 61.2866,4.77251 61.2821,4.7797 61.2842,4.77747 61.2954,4.75425 61.2971,4.74356 61.3005,4.73383 61.3157,4.72863 61.3154,4.72387 61.3177,4.7182 61.3175,4.71543 61.3123,4.71729 61.3078,4.70804 61.3087,4.70574 61.3036,4.69687 61.305,4.69332 61.3037,4.6925 61.3006)),((4.69289 61.1741,4.69778 61.1734,4.70348 61.1757,4.70538 61.1804,4.70018 61.185,4.69651 61.1844,4.69289 61.1741)),((4.69556 60.7773,4.70386 60.7756,4.69789 60.7702,4.70428 60.7664,4.70348 60.7634,4.71519 60.7564,4.71382 60.7515,4.7205 60.7509,4.72635 60.7521,4.73678 60.7491,4.74198 60.756,4.75071 60.7569,4.75158 60.762,4.74569 60.7704,4.74082 60.7713,4.74887 60.7733,4.74718 60.7772,4.73438 60.7825,4.72564 60.7817,4.71831 60.7832,4.713 60.7815,4.7053 60.7848,4.69721 60.7831,4.69556 60.7773)),((4.71016 61.1143,4.71845 61.1107,4.72719 61.1121,4.73451 61.111,4.73757 61.1123,4.7185 61.1199,4.71016 61.1143)),((4.72577 60.7148,4.73117 60.7112,4.74242 60.7087,4.7523 60.7085,4.73235 60.7147,4.7269 60.7185,4.72577 60.7148)),((4.73048 61.0814,4.73785 61.0754,4.74134 61.0484,4.7445 61.0444,4.75678 61.0445,4.75914 61.0469,4.75643 61.0558,4.75847 61.0598,4.76213 61.0604,4.76735 61.0556,4.76304 61.0487,4.77179 61.0285,4.78597 61.021,4.78709 61.0205,4.79346 61.0265,4.77863 61.0345,4.78019 61.0362,4.79087 61.0372,4.7917 61.0473,4.78297 61.0508,4.7857 61.0585,4.79402 61.0619,4.79362 61.0711,4.79621 61.0723,4.80093 61.07,4.80454 61.0589,4.81002 61.0576,4.81317 61.0536,4.81888 61.0534,4.8163 61.0641,4.82617 61.0716,4.82643 61.0751,4.81756 61.0793,4.8166 61.0818,4.81977 61.0866,4.82169 61.0896,4.81754 61.0986,4.8138 61.1007,4.80929 61.0996,4.80833 61.0853,4.80046 61.0819,4.79773 61.0862,4.79899 61.0917,4.78968 61.1005,4.75791 61.1006,4.75548 61.0962,4.76269 61.079,4.76289 61.0685,4.75609 61.0741,4.75168 61.082,4.75177 61.0881,4.75178 61.0886,4.74678 61.0923,4.74195 61.0928,4.73145 61.0861,4.73048 61.0814)),((4.73396 61.2226,4.74573 61.2138,4.74198 61.2088,4.762 61.2037,4.76842 61.2049,4.77943 61.1974,4.7921 61.1934,4.79272 61.1999,4.78259 61.2054,4.78301 61.2104,4.77319 61.2143,4.76471 61.214,4.75684 61.22,4.74453 61.2245,4.73732 61.2249,4.73396 61.2226)),((4.73493 61.5564,4.74272 61.5535,4.75401 61.5547,4.75762 61.5535,4.77025 61.5553,4.76722 61.5654,4.76019 61.567,4.76154 61.5698,4.75721 61.5698,4.74835 61.5637,4.73915 61.5616,4.73493 61.5564)),((4.74512 60.6879,4.74775 60.6864,4.76781 60.6867,4.76946 60.6902,4.75708 60.6889,4.74959 60.6914,4.74512 60.6879)),((4.74799 61.3211,4.76409 61.3122,4.77331 61.3138,4.782 61.3133,4.79216 61.3197,4.78756 61.3236,4.77587 61.3272,4.76075 61.3288,4.75474 61.3279,4.74799 61.3211)),((4.76527 61.1327,4.76942 61.1285,4.77951 61.1278,4.7911 61.1316,4.79312 61.15,4.77803 61.1496,4.77707 61.1472,4.78449 61.1457,4.78588 61.1435,4.77989 61.1402,4.78117 61.1362,4.76527 61.1327)),((4.77631 61.6467,4.77663 61.638,4.78498 61.6372,4.78925 61.6351,4.80999 61.6374,4.8055 61.643,4.80628 61.651,4.7956 61.6586,4.79235 61.658,4.78665 61.6504,4.77631 61.6467)),((4.77749 60.5969,4.78197 60.5906,4.79279 60.5925,4.79778 60.598,4.79877 60.5882,4.82682 60.5902,4.84023 60.586,4.84366 60.5827,4.84696 60.585,4.84839 60.5944,4.85204 60.5997,4.8439 60.608,4.84526 60.6106,4.85469 60.6101,4.86074 60.615,4.85438 60.6214,4.8553 60.6262,4.84537 60.6317,4.84707 60.6206,4.83297 60.6259,4.81077 60.6243,4.79659 60.6233,4.79473 60.6209,4.8015 60.6125,4.79778 60.5981,4.79401 60.6006,4.77749 60.5969)),((4.78229 61.6171,4.78282 61.6121,4.78694 61.6084,4.79467 61.6083,4.79814 61.6125,4.79459 61.6158,4.789 61.6149,4.78229 61.6171)),((4.78571 61.5596,4.79562 61.5605,4.80007 61.5575,4.809 61.5609,4.81485 61.5605,4.82535 61.5633,4.83781 61.5611,4.85389 61.5648,4.87658 61.5667,4.88904 61.5693,4.86801 61.576,4.84679 61.5739,4.82993 61.574,4.81561 61.5711,4.80828 61.5717,4.80073 61.5686,4.79181 61.5675,4.78571 61.5596)),((4.78692 61.587,4.80595 61.5833,4.81705 61.5831,4.85003 61.5889,4.85694 61.5881,4.86177 61.5904,4.88675 61.5906,4.88846 61.5941,4.88605 61.5965,4.88006 61.5976,4.8861 61.6011,4.87938 61.6059,4.87966 61.6093,4.87657 61.6103,4.87066 61.6062,4.86408 61.6102,4.84931 61.6119,4.85285 61.6038,4.85122 61.6023,4.83999 61.6055,4.82725 61.6042,4.81851 61.5974,4.81933 61.5933,4.81613 61.5925,4.80952 61.5942,4.80037 61.5943,4.79492 61.5913,4.79257 61.59,4.78789 61.5894,4.78692 61.587)),((4.78804 60.6479,4.7901 60.6446,4.79541 60.6437,4.79426 60.6376,4.79802 60.6279,4.80014 60.6266,4.80769 60.6286,4.81545 60.6271,4.82864 60.6289,4.83025 60.6326,4.83715 60.6332,4.83719 60.6378,4.83357 60.642,4.82775 60.6431,4.82459 60.6521,4.81954 60.6565,4.80985 60.6606,4.81388 60.6663,4.80278 60.6729,4.79819 60.6725,4.79489 60.6655,4.78898 60.6622,4.78897 60.6599,4.79515 60.657,4.79447 60.6533,4.78804 60.6479)),((4.78809 60.8721,4.7967 60.8642,4.80886 60.8646,4.81481 60.863,4.8185 60.8634,4.81189 60.8707,4.79815 60.8712,4.79044 60.8745,4.78809 60.8721)),((4.78937 60.9278,4.79809 60.9217,4.80532 60.9209,4.81287 60.9137,4.81153 60.9109,4.81511 60.9094,4.82347 60.91,4.82409 60.9117,4.81715 60.9182,4.82112 60.9244,4.81511 60.931,4.81158 60.9322,4.79111 60.9308,4.78937 60.9278)),((4.78992 61.1255,4.79041 61.1159,4.80437 61.1124,4.79926 61.1239,4.79458 61.126,4.78992 61.1255)),((4.79598 61.7929,4.80666 61.7904,4.81322 61.7843,4.83221 61.7789,4.83767 61.7734,4.84996 61.7701,4.84576 61.7621,4.84807 61.7578,4.84236 61.7525,4.84626 61.7499,4.8572 61.7557,4.87101 61.7568,4.87738 61.766,4.90087 61.7744,4.90446 61.7783,4.90186 61.7816,4.88919 61.7845,4.88542 61.789,4.8879 61.7934,4.88468 61.7973,4.87494 61.7976,4.8698 61.8015,4.86429 61.8024,4.85922 61.8084,4.85092 61.8087,4.84264 61.8113,4.83722 61.8118,4.82511 61.8046,4.82012 61.8032,4.8063 61.7994,4.79598 61.7929)),((4.7982 61.1388,4.81062 61.1288,4.80749 61.1254,4.81217 61.1185,4.81901 61.1271,4.81636 61.1357,4.81372 61.1395,4.79997 61.1419,4.7982 61.1388)),((4.79932 61.6234,4.8046 61.6211,4.81224 61.6215,4.81631 61.618,4.81939 61.6218,4.81685 61.6249,4.81141 61.6255,4.808 61.6282,4.80127 61.6281,4.79932 61.6234)),((4.80076 60.5493,4.81331 60.5542,4.81907 60.5533,4.82251 60.562,4.81972 60.5644,4.80503 60.5584,4.80076 60.5493)),((4.801 60.9524,4.80602 60.9485,4.81505 60.9505,4.82377 60.9493,4.8312 60.9547,4.82697 60.9571,4.81099 60.9568,4.802 60.9545,4.801 60.9524)),((4.80412 60.939,4.81893 60.9356,4.84956 60.9356,4.85099 60.938,4.83326 60.9394,4.80927 60.9415,4.80465 60.9411,4.80412 60.939)),((4.81217 61.1185,4.81776 61.1071,4.82489 61.1021,4.82782 61.1041,4.81696 61.1183,4.81217 61.1185)),((4.81217 61.1569,4.82403 61.1521,4.82488 61.143,4.8312 61.1398,4.82995 61.1317,4.83398 61.1257,4.82425 61.1246,4.82682 61.1187,4.83356 61.1158,4.83385 61.112,4.83464 61.0959,4.83404 61.0949,4.83112 61.0898,4.83604 61.0744,4.82258 61.0634,4.82185 61.0599,4.84384 61.0467,4.85135 61.0471,4.85777 61.0529,4.86327 61.0538,4.86097 61.0631,4.8668 61.0696,4.86707 61.0779,4.87152 61.0817,4.90142 61.096,4.9024 61.0988,4.89888 61.1047,4.89786 61.1065,4.89988 61.1076,4.90839 61.1012,4.91518 61.1007,4.92065 61.0872,4.91843 61.0742,4.92577 61.0681,4.92657 61.0567,4.93139 61.0562,4.94118 61.0594,4.94707 61.073,4.96112 61.086,4.97068 61.0855,5 61.0947,5.00909 61.0976,5.01278 61.0995,5.01987 61.1031,5.0266 61.1101,5.03241 61.1218,5.02377 61.1373,5.02414 61.1527,5.01306 61.166,5.0151 61.1702,5.00485 61.1741,5 61.1812,4.9943 61.1895,5 61.1949,5.00112 61.196,5 61.1964,4.99186 61.1997,4.9893 61.1957,4.98524 61.1946,4.97207 61.1988,4.97441 61.199,4.98522 61.1996,4.98559 61.2026,4.98022 61.2058,4.96955 61.207,4.95691 61.2059,4.95226 61.203,4.95507 61.1983,4.96742 61.1885,4.97659 61.1852,4.98435 61.1844,4.98282 61.1825,4.97708 61.1827,4.97569 61.1776,4.973 61.1768,4.96536 61.1794,4.95345 61.1895,4.94912 61.1897,4.95487 61.1503,4.95781 61.1474,4.96011 61.1452,4.95069 61.1326,4.94718 61.1336,4.94579 61.1384,4.94848 61.1465,4.93436 61.168,4.93722 61.1752,4.929 61.1833,4.93744 61.1961,4.93462 61.2008,4.92044 61.2077,4.91406 61.2137,4.903 61.2143,4.88758 61.2129,4.8856 61.2048,4.88364 61.1967,4.88985 61.1917,4.90127 61.1867,4.90158 61.1803,4.89327 61.1741,4.89512 61.1623,4.90335 61.1542,4.90674 61.1465,4.91309 61.1431,4.90517 61.1327,4.90217 61.1334,4.89679 61.144,4.88914 61.1491,4.88732 61.1633,4.88386 61.1689,4.87244 61.1735,4.86531 61.1763,4.86275 61.1748,4.8647 61.1673,4.85421 61.1627,4.86048 61.1501,4.85 61.1552,4.84211 61.1663,4.82663 61.1654,4.81217 61.1569)),((4.81686 60.9821,4.81693 60.9793,4.82669 60.9777,4.83455 60.9737,4.85016 60.9783,4.84945 60.982,4.85796 60.9819,4.85961 60.9783,4.86433 60.9783,4.86827 60.9847,4.85988 60.9914,4.83764 60.9941,4.82628 60.9846,4.81686 60.9821)),((4.81817 61.8557,4.82908 61.8497,4.83854 61.8485,4.8843 61.8501,4.89066 61.8474,4.89583 61.841,4.90381 61.8375,4.91337 61.8381,4.92383 61.8367,4.93549 61.8391,4.94489 61.8381,4.95426 61.8422,4.96392 61.8424,4.97124 61.8397,4.98595 61.838,4.9886 61.8377,4.98817 61.835,4.9766 61.8347,4.96425 61.8309,4.95058 61.829,4.94666 61.8267,4.94725 61.8238,4.95798 61.8185,4.95346 61.8144,4.93324 61.8211,4.92245 61.8217,4.90451 61.8193,4.90213 61.8167,4.92544 61.792,4.92146 61.7877,4.92495 61.7872,4.94077 61.7904,4.9355 61.795,4.94242 61.7992,4.95025 61.798,4.9519 61.7978,4.95123 61.7939,4.95532 61.7878,4.96655 61.7849,4.95493 61.78,4.95764 61.7785,5 61.7861,5.02327 61.7968,5.03297 61.7967,5.04356 61.802,5.05024 61.8025,5.0583 61.8084,5.06952 61.8105,5.0816 61.8156,5.09602 61.8162,5.10916 61.8234,5.11868 61.833,5.12256 61.8369,5.12956 61.8408,5.13594 61.8429,5.14757 61.843,5.14927 61.8442,5.14622 61.8475,5.15151 61.8528,5.14923 61.857,5.14097 61.8622,5.14281 61.8653,5.15313 61.8595,5.16121 61.8502,5.16073 61.8451,5.14687 61.8365,5.13375 61.8341,5.13074 61.8322,5.12869 61.8277,5.13218 61.8247,5.13791 61.8251,5.14455 61.8309,5.15049 61.8328,5.16308 61.8329,5.17619 61.8302,5.18884 61.8309,5.19056 61.831,5.20766 61.8354,5.21714 61.834,5.25167 61.8359,5.25501 61.8388,5.25176 61.8483,5.25745 61.8618,5.25502 61.8645,5.23653 61.8699,5.20272 61.8742,5.16412 61.8756,5.14264 61.8788,5.12334 61.8782,5.08762 61.8797,5.07453 61.8846,5.05044 61.8886,5.03267 61.8893,5.03135 61.8894,5.00572 61.8938,5 61.8957,4.98077 61.9021,4.94261 61.9108,4.93297 61.9104,4.91732 61.906,4.903 61.8999,4.89939 61.896,4.90787 61.8925,4.91997 61.8903,4.92613 61.8862,4.92268 61.884,4.91519 61.885,4.90939 61.8825,4.8998 61.8818,4.88793 61.8829,4.87796 61.8769,4.87228 61.8762,4.86401 61.8771,4.85839 61.8777,4.85019 61.8702,4.82149 61.8609,4.81817 61.8557)),((4.81865 60.8003,4.82023 60.7946,4.82756 60.7883,4.83746 60.788,4.82831 60.7989,4.81865 60.8003)),((4.82321 61.2139,4.82579 61.208,4.83998 61.1988,4.8472 61.2104,4.8482 61.2173,4.84439 61.2222,4.83564 61.2232,4.82567 61.2207,4.82321 61.2139)),((4.82554 61.6944,4.8291 61.6911,4.82678 61.6834,4.83041 61.6726,4.84211 61.6719,4.83838 61.6665,4.84773 61.6607,4.85568 61.662,4.85852 61.655,4.86252 61.6543,4.86724 61.662,4.88126 61.6643,4.88751 61.6595,4.89259 61.6606,4.89524 61.6716,4.88986 61.6816,4.88396 61.6846,4.88746 61.6937,4.87355 61.6981,4.87152 61.701,4.88825 61.7091,4.88374 61.7124,4.87821 61.7135,4.87281 61.7188,4.85739 61.7089,4.86368 61.7016,4.85869 61.7,4.85062 61.7017,4.83945 61.7015,4.83092 61.7013,4.82625 61.6981,4.82554 61.6944)),((4.82659 61.3433,4.83562 61.3387,4.83175 61.3342,4.835 61.3322,4.85896 61.3414,4.86343 61.3526,4.86068 61.3568,4.85225 61.356,4.8465 61.3585,4.8296 61.3522,4.82659 61.3433)),((4.82875 60.9215,4.83496 60.9211,4.83798 60.9105,4.84303 60.9063,4.83234 60.9056,4.83568 60.8934,4.85328 60.8901,4.86103 60.8865,4.86611 60.887,4.8698 60.8922,4.87618 60.8957,4.87671 60.8881,4.88146 60.8831,4.88014 60.8777,4.87634 60.8755,4.88036 60.8718,4.87914 60.8704,4.87767 60.8687,4.88104 60.8658,4.87999 60.8639,4.88862 60.8607,4.91836 60.8577,4.92448 60.8552,4.92934 60.8568,4.92888 60.8616,4.93344 60.8648,4.93114 60.867,4.9164 60.8654,4.91431 60.8664,4.92732 60.8746,4.89702 60.912,4.88618 60.9194,4.88053 60.9193,4.87806 60.9151,4.88606 60.9127,4.88311 60.9109,4.87793 60.9109,4.87686 60.9068,4.87341 60.9075,4.87015 60.9122,4.86204 60.9127,4.86119 60.9171,4.87091 60.918,4.8702 60.9205,4.86929 60.9239,4.8636 60.9289,4.84967 60.9326,4.83164 60.9309,4.82875 60.9215)),((4.82876 60.5586,4.83325 60.545,4.83846 60.5446,4.84789 60.5464,4.85732 60.553,4.86125 60.5592,4.86574 60.5649,4.87192 60.5643,4.87258 60.5657,4.86874 60.5784,4.86009 60.5773,4.83676 60.5702,4.82919 60.566,4.82876 60.5586)),((4.83616 61.6342,4.84199 61.6292,4.83903 61.6247,4.85174 61.6166,4.85103 61.6322,4.84803 61.6375,4.8393 61.6378,4.83616 61.6342)),((4.83966 60.8754,4.84957 60.8729,4.85418 60.8685,4.86158 60.8668,4.86759 60.8673,4.85165 60.8767,4.84048 60.8784,4.83966 60.8754)),((4.85435 61.2199,4.86048 61.2105,4.85965 61.2075,4.87315 61.2017,4.87696 61.2016,4.8771 61.2058,4.87031 61.2137,4.86082 61.2209,4.85435 61.2199)),((4.85617 60.9428,4.86825 60.9364,4.88634 60.938,4.88721 60.9408,4.87435 60.9487,4.86758 60.9447,4.85755 60.9454,4.85617 60.9428)),((4.85673 61.1934,4.86114 61.183,4.87298 61.1808,4.88026 61.1752,4.88243 61.1762,4.87841 61.187,4.85673 61.1934)),((4.85832 60.5382,4.86335 60.5242,4.86265 60.5181,4.86565 60.5146,4.87117 60.5174,4.87996 60.5297,4.88613 60.5243,4.89631 60.5197,4.9119 60.5209,4.91679 60.5246,4.91145 60.533,4.9071 60.5363,4.89667 60.5397,4.89819 60.5439,4.89518 60.5474,4.88367 60.5492,4.87557 60.5599,4.87099 60.5594,4.85832 60.5382)),((4.85985 59.3055,4.87103 59.2984,4.88242 59.2999,4.88916 59.2949,4.89492 59.2977,4.90375 59.2961,4.91051 59.3008,4.91227 59.3034,4.90739 59.308,4.9073 59.3158,4.89315 59.3195,4.88847 59.3181,4.88605 59.3118,4.88285 59.3121,4.88091 59.3177,4.87795 59.3192,4.87415 59.3179,4.87288 59.315,4.86541 59.3142,4.85985 59.3055)),((4.8615 60.785,4.87502 60.7758,4.90683 60.7705,4.91425 60.7693,4.91305 60.7658,4.90336 60.7626,4.90169 60.7591,4.90467 60.7558,4.91763 60.7518,4.93517 60.7434,4.94471 60.7424,4.9677 60.7324,4.97453 60.7334,4.97786 60.7357,4.98459 60.7323,4.99016 60.7325,4.98782 60.735,4.99173 60.739,4.98948 60.741,4.96833 60.7488,4.96971 60.7514,4.98176 60.7496,4.96305 60.7687,4.96256 60.7692,4.96746 60.7706,4.96888 60.7729,4.96313 60.7809,4.94751 60.7841,4.93757 60.7919,4.92974 60.7936,4.9262 60.7974,4.92622 60.8022,4.91891 60.8134,4.91272 60.8138,4.91559 60.8038,4.90949 60.8037,4.91358 60.7947,4.92054 60.7902,4.9167 60.7882,4.87746 60.8043,4.86793 60.8051,4.87083 60.8022,4.86667 60.7995,4.86901 60.7971,4.86401 60.7938,4.86607 60.7905,4.8615 60.785)),((4.8646 60.8247,4.87368 60.8166,4.87944 60.8159,4.88128 60.8185,4.87169 60.8268,4.865 60.8274,4.8646 60.8247)),((4.86905 60.509,4.88275 60.5055,4.87803 60.5035,4.88314 60.4987,4.88223 60.4961,4.88783 60.4936,4.89263 60.4952,4.89358 60.4975,4.88887 60.5003,4.89232 60.5041,4.88945 60.5118,4.8711 60.5105,4.86905 60.509)),((4.87164 61.057,4.87376 61.0485,4.87922 61.0424,4.88489 61.0424,4.88862 61.0451,4.89188 61.0429,4.91253 61.051,4.90254 61.0708,4.88276 61.08,4.87565 61.0776,4.88072 61.0734,4.87283 61.0726,4.87415 61.0683,4.8815 61.067,4.88156 61.0643,4.87164 61.057)),((4.87383 60.7141,4.87842 60.7049,4.89487 60.7045,4.89254 60.7118,4.87383 60.7141)),((4.8742 60.8308,4.88643 60.8211,4.8928 60.8124,4.90125 60.8149,4.87689 60.8339,4.8742 60.8308)),((4.88111 61.3428,4.89295 61.336,4.90079 61.335,4.91536 61.3361,4.92222 61.3327,4.93596 61.3308,4.95207 61.3191,4.9449 61.3168,4.95142 61.3127,4.95623 61.3124,4.96816 61.3175,4.96944 61.3181,4.98005 61.3199,5 61.3183,5.00958 61.3175,5.01056 61.325,5.03481 61.3253,5.02743 61.334,5.02183 61.3358,5.01981 61.3488,5.02814 61.3526,5.01603 61.3709,5.00747 61.3781,5.00238 61.3797,5 61.3795,4.99532 61.3792,4.98696 61.3705,4.96618 61.3668,4.96038 61.3721,4.95077 61.3724,4.93643 61.3798,4.93502 61.3796,4.92851 61.3787,4.91829 61.3796,4.90619 61.3731,4.91719 61.3706,4.91786 61.3672,4.89953 61.3535,4.88989 61.354,4.88206 61.3525,4.88111 61.3428)),((4.88436 60.7323,4.89412 60.7254,4.91753 60.7157,4.92878 60.7082,4.92789 60.7067,4.92192 60.7076,4.90509 60.7168,4.90221 60.7167,4.90059 60.7129,4.90368 60.7088,4.91139 60.7049,4.91909 60.7041,4.93229 60.6987,4.92952 60.698,4.91658 60.702,4.90885 60.7024,4.90662 60.7011,4.90549 60.7004,4.90681 60.6984,4.917 60.6941,4.92083 60.6887,4.9444 60.6804,4.94614 60.6786,4.94162 60.6729,4.94611 60.669,4.95564 60.668,4.9787 60.6574,4.99091 60.657,5 60.654,5.00137 60.6536,5 60.6528,4.99507 60.6499,5 60.6464,5.00744 60.6412,5.04257 60.6332,5.0678 60.6256,5.07095 60.6241,5.07597 60.6218,5.07867 60.6148,5.09551 60.6096,5.13941 60.6042,5.14875 60.6067,5.18139 60.5863,5.20612 60.5759,5.21845 60.5645,5.22638 60.5619,5.2292 60.5643,5.22432 60.5758,5.22025 60.5791,5.21119 60.5865,5.20869 60.5951,5.20201 60.601,5.19896 60.6075,5.19278 60.6107,5.19086 60.6161,5.13626 60.6415,5.124 60.6514,5.13626 60.6491,5.14375 60.6439,5.16997 60.6359,5.17754 60.6302,5.20215 60.6258,5.20871 60.6231,5.2082 60.6208,5.20138 60.6198,5.20075 60.6181,5.20492 60.6157,5.20701 60.6145,5.20599 60.6099,5.21772 60.5941,5.23061 60.5898,5.23338 60.5874,5.22976 60.5843,5.23692 60.5628,5.27466 60.5497,5.28063 60.5424,5.29225 60.5425,5.30544 60.5442,5.31357 60.5482,5.31839 60.5551,5.32399 60.5576,5.33662 60.5611,5.34973 60.5647,5.38154 60.5665,5.38652 60.5699,5.38491 60.5737,5.37721 60.5778,5.37526 60.5809,5.38069 60.5818,5.38222 60.5837,5.37508 60.5899,5.36548 60.594,5.36831 60.5965,5.38221 60.5943,5.39082 60.5878,5.39702 60.5896,5.40652 60.5859,5.41087 60.5877,5.40399 60.595,5.40621 60.5983,5.40478 60.6037,5.40744 60.6045,5.41421 60.6005,5.42031 60.6003,5.42411 60.5972,5.43809 60.5964,5.44058 60.5963,5.44463 60.6024,5.45558 60.6038,5.47008 60.6115,5.47229 60.6176,5.49717 60.6274,5.49669 60.6328,5.50449 60.6309,5.52364 60.6307,5.52852 60.6268,5.54346 60.624,5.55086 60.6298,5.56317 60.6315,5.58129 60.6428,5.57669 60.6506,5.58296 60.66,5.58441 60.6491,5.58971 60.6482,5.59808 60.651,5.59912 60.6559,5.60631 60.6575,5.60766 60.6606,5.5825 60.6903,5.57561 60.6896,5.57365 60.6874,5.58139 60.6804,5.58167 60.6733,5.5857 60.6661,5.58296 60.663,5.56716 60.6816,5.56618 60.6873,5.5534 60.6992,5.55714 60.7019,5.57336 60.6973,5.58284 60.6965,5.59134 60.6987,5.60445 60.7041,5.62592 60.718,5.63784 60.7194,5.64102 60.7227,5.64698 60.7234,5.65426 60.7302,5.6665 60.7297,5.67402 60.7378,5.68713 60.7462,5.69974 60.7575,5.71344 60.7651,5.72212 60.7664,5.72859 60.7641,5.72858 60.7586,5.71211 60.7591,5.70298 60.7521,5.70367 60.7452,5.68265 60.7338,5.66884 60.7158,5.67468 60.7062,5.68848 60.7019,5.7156 60.7019,5.7282 60.6964,5.73668 60.7016,5.75927 60.7006,5.7643 60.705,5.77601 60.7153,5.77779 60.7243,5.79458 60.7288,5.78977 60.7197,5.7824 60.7162,5.78219 60.7119,5.77631 60.705,5.76791 60.7021,5.76447 60.6946,5.74837 60.6931,5.74341 60.6892,5.742 60.6837,5.74717 60.6694,5.7441 60.6654,5.74611 60.6645,5.76169 60.6663,5.77212 60.6653,5.78211 60.6614,5.79408 60.6596,5.80221 60.6555,5.79911 60.6545,5.78355 60.6555,5.77291 60.6606,5.77188 60.6606,5.76109 60.6615,5.75544 60.6589,5.7426 60.6575,5.74102 60.6558,5.73861 60.6422,5.74122 60.6377,5.73707 60.6318,5.73532 60.6031,5.73754 60.5981,5.73158 60.5779,5.72655 60.5718,5.72334 60.5547,5.73185 60.5509,5.73388 60.55,5.72809 60.5457,5.72356 60.5365,5.72294 60.5094,5.73067 60.4964,5.73075 60.4847,5.74276 60.4682,5.74086 60.4629,5.73281 60.4554,5.72306 60.4528,5.6976 60.4524,5.68229 60.458,5.66325 60.4609,5.65415 60.4599,5.6432 60.4532,5.63625 60.4421,5.61868 60.4309,5.58971 60.4295,5.58292 60.4312,5.56942 60.4288,5.56118 60.4255,5.51258 60.4251,5.49919 60.4356,5.48241 60.4408,5.48155 60.441,5.46868 60.451,5.46196 60.4524,5.45834 60.4465,5.47116 60.4234,5.47005 60.4217,5.46495 60.4217,5.45798 60.4272,5.4509 60.4519,5.44561 60.4583,5.43384 60.4673,5.42295 60.4711,5.40187 60.4879,5.38461 60.5017,5.36477 60.5114,5.35612 60.5103,5.32393 60.5188,5.32077 60.5235,5.31214 60.525,5.29905 60.5253,5.28883 60.52,5.27788 60.5189,5.2759 60.517,5.27912 60.5146,5.26352 60.5031,5.2583 60.4857,5.25936 60.4775,5.25952 60.4763,5.27335 60.4691,5.27539 60.4655,5.27056 60.4639,5.27594 60.4573,5.29894 60.4532,5.30291 60.4518,5.29641 60.4492,5.31881 60.4433,5.31405 60.4387,5.28246 60.4468,5.2848 60.4363,5.28289 60.4314,5.29995 60.4216,5.32252 60.412,5.32489 60.4083,5.32571 60.4071,5.31836 60.4015,5.32419 60.3974,5.30981 60.3974,5.31506 60.394,5.31479 60.3903,5.32099 60.3867,5.33535 60.3841,5.3413 60.3871,5.35287 60.3818,5.34259 60.3798,5.32768 60.3803,5.2934 60.3908,5.26969 60.3939,5.25652 60.3924,5.24705 60.3961,5.23832 60.3957,5.22724 60.3929,5.21822 60.3941,5.2175 60.3937,5.20655 60.387,5.19948 60.385,5.19642 60.3789,5.18339 60.3768,5.17582 60.3725,5.17472 60.3687,5.17848 60.3605,5.1763 60.3546,5.17855 60.3524,5.1859 60.3553,5.19086 60.3509,5.18948 60.3483,5.17901 60.3474,5.17871 60.3439,5.19438 60.3391,5.20296 60.3326,5.21393 60.3333,5.22041 60.3384,5.23242 60.3385,5.23481 60.3407,5.22268 60.3438,5.22911 60.3466,5.24104 60.3471,5.2432 60.3429,5.24163 60.3362,5.2506 60.3248,5.26135 60.3242,5.26443 60.3225,5.261 60.3199,5.26262 60.3171,5.25233 60.3178,5.24567 60.3214,5.23145 60.3208,5.22165 60.3187,5.21927 60.3166,5.21973 60.3012,5.20296 60.2917,5.2044 60.2838,5.21189 60.2807,5.21155 60.2774,5.21508 60.2757,5.22054 60.2762,5.2295 60.2674,5.24124 60.2663,5.25183 60.2716,5.25953 60.2724,5.25022 60.2651,5.23855 60.2607,5.23549 60.2554,5.23362 60.2522,5.2349 60.2477,5.24367 60.2476,5.25485 60.2444,5.26837 60.2462,5.27439 60.2538,5.28478 60.2602,5.28063 60.2628,5.2703 60.2612,5.26844 60.2639,5.271 60.2676,5.27795 60.2675,5.29839 60.2615,5.30909 60.261,5.31342 60.2626,5.32296 60.2713,5.3277 60.2706,5.33297 60.2616,5.33204 60.259,5.32496 60.2574,5.30977 60.2494,5.3038 60.2445,5.29971 60.2411,5.29126 60.2394,5.28556 60.2299,5.2568 60.231,5.24989 60.2284,5.2438 60.2237,5.24956 60.2199,5.24858 60.2125,5.25181 60.2099,5.26016 60.2095,5.26713 60.2066,5.28368 60.2094,5.28421 60.2168,5.29019 60.2168,5.29124 60.2187,5.28918 60.2225,5.29086 60.226,5.30469 60.2234,5.31023 60.226,5.31432 60.2211,5.33931 60.2281,5.34242 60.229,5.35356 60.2285,5.36103 60.2332,5.36859 60.2269,5.38437 60.2184,5.36998 60.2058,5.36583 60.2059,5.35632 60.2128,5.33939 60.2095,5.33904 60.2063,5.35086 60.1961,5.34455 60.1964,5.34045 60.2005,5.3334 60.2017,5.33259 60.1985,5.33687 60.1924,5.34326 60.1902,5.35259 60.1895,5.36358 60.1819,5.3739 60.1799,5.37598 60.1794,5.39832 60.1806,5.4039 60.1777,5.40697 60.1732,5.40689 60.1631,5.40401 60.1611,5.38821 60.1673,5.38117 60.1682,5.37815 60.1644,5.38333 60.1584,5.38222 60.1542,5.38744 60.1533,5.39691 60.1544,5.40601 60.1576,5.42073 60.1655,5.42525 60.1659,5.42984 60.1634,5.42899 60.1523,5.43927 60.1381,5.44308 60.1373,5.45248 60.1414,5.456 60.145,5.45719 60.1568,5.4489 60.1569,5.44775 60.1582,5.45317 60.1614,5.45812 60.1621,5.4611 60.1661,5.45777 60.1694,5.44946 60.1723,5.45861 60.1779,5.4574 60.1822,5.49507 60.1936,5.49809 60.1945,5.50945 60.1927,5.5235 60.194,5.54936 60.2097,5.5428 60.2131,5.5589 60.2241,5.56608 60.2361,5.574 60.2411,5.57381 60.245,5.56497 60.2563,5.56645 60.2612,5.57713 60.2635,5.61273 60.2821,5.61338 60.283,5.61728 60.2881,5.62404 60.2918,5.62809 60.3007,5.62797 60.3124,5.63558 60.3221,5.62679 60.3222,5.63168 60.3343,5.64408 60.3403,5.64806 60.3497,5.64903 60.3688,5.65891 60.3733,5.6666 60.3688,5.65572 60.3619,5.66223 60.3562,5.66222 60.3541,5.66222 60.348,5.66562 60.3442,5.67301 60.347,5.68859 60.3701,5.69503 60.3732,5.71054 60.3745,5.72212 60.38,5.72363 60.3849,5.72131 60.391,5.72157 60.3977,5.7299 60.398,5.73555 60.3941,5.7504 60.3955,5.76233 60.3926,5.77022 60.3858,5.76758 60.3765,5.75819 60.3745,5.75193 60.3704,5.74252 60.3742,5.742 60.3689,5.7288 60.3704,5.7109 60.3667,5.69777 60.3678,5.68462 60.3551,5.6895 60.3479,5.6877 60.3449,5.67411 60.3432,5.66198 60.3356,5.65891 60.3263,5.66154 60.3188,5.65891 60.3136,5.6553 60.3064,5.66328 60.3028,5.66588 60.2983,5.66121 60.2903,5.65598 60.2968,5.63924 60.2809,5.61992 60.2668,5.61542 60.2662,5.61145 60.2679,5.60381 60.2666,5.59359 60.2616,5.58707 60.2538,5.60134 60.2512,5.60394 60.2467,5.59834 60.2416,5.6009 60.2401,5.60685 60.2404,5.62157 60.2481,5.62252 60.2486,5.63435 60.2523,5.64091 60.2571,5.65979 60.285,5.66292 60.2856,5.66636 60.2843,5.66471 60.2804,5.66883 60.2778,5.66428 60.2719,5.66539 60.268,5.64278 60.2487,5.62676 60.2398,5.62451 60.2367,5.63439 60.2355,5.6414 60.2404,5.66468 60.2446,5.66583 60.2445,5.69553 60.2419,5.71709 60.2426,5.73319 60.2455,5.75145 60.241,5.74621 60.2364,5.73305 60.2352,5.72289 60.2325,5.69319 60.231,5.68743 60.2324,5.67797 60.2311,5.66585 60.232,5.65627 60.2286,5.62497 60.2092,5.61715 60.2085,5.60321 60.2072,5.59833 60.2088,5.59338 60.2081,5.59083 60.2041,5.60269 60.1993,5.60696 60.1903,5.59877 60.187,5.59494 60.1797,5.59806 60.1748,5.59392 60.1721,5.5874 60.1753,5.58136 60.1675,5.58385 60.1554,5.5893 60.1531,5.59725 60.1523,5.59843 60.1507,5.59121 60.1472,5.59706 60.1452,5.60349 60.1452,5.61658 60.1494,5.63171 60.1496,5.64947 60.1526,5.66211 60.1547,5.68126 60.1613,5.68888 60.1652,5.69728 60.1812,5.69745 60.1913,5.69963 60.1921,5.70631 60.1822,5.71934 60.1869,5.73442 60.1875,5.7434 60.186,5.76345 60.19,5.76741 60.1884,5.76191 60.1854,5.74366 60.1817,5.72677 60.1753,5.72342 60.1698,5.72314 60.1694,5.72521 60.1624,5.73493 60.1536,5.74491 60.1487,5.74394 60.1434,5.75695 60.1425,5.76491 60.136,5.76504 60.1323,5.7696 60.1297,5.76301 60.1279,5.74469 60.1276,5.7351 60.1244,5.7368 60.1224,5.74239 60.122,5.7442 60.1193,5.73611 60.1183,5.735 60.1166,5.73887 60.1154,5.73868 60.1138,5.72746 60.1122,5.72532 60.1084,5.73006 60.1047,5.73424 60.1044,5.7401 60.1079,5.74291 60.1075,5.73936 60.1012,5.74474 60.0879,5.75167 60.082,5.76281 60.0783,5.77768 60.077,5.78225 60.08,5.79165 60.0927,5.79663 60.0932,5.79873 60.0871,5.80007 60.0832,5.80363 60.0811,5.81256 60.0826,5.81571 60.0887,5.83193 60.0962,5.83331 60.0933,5.82085 60.0852,5.8229 60.0782,5.79963 60.0632,5.79816 60.0581,5.79501 60.0578,5.78661 60.0701,5.77896 60.072,5.75171 60.0732,5.75064 60.0714,5.75802 60.0655,5.75411 60.0642,5.7413 60.0696,5.72866 60.0797,5.71921 60.0813,5.71654 60.078,5.71457 60.0621,5.70805 60.0488,5.72048 60.0316,5.72003 60.0203,5.7268 60.0153,5.73002 60.004,5.76017 60.0128,5.76486 60.0036,5.763 60.0019,5.76075 60,5.75483 59.9949,5.76308 59.9835,5.76962 59.9826,5.78125 59.9927,5.79384 60,5.79969 60.0034,5.82043 60.0193,5.82827 60.0189,5.81524 60.0118,5.80889 60,5.80843 59.9991,5.81156 59.9976,5.81381 59.9922,5.81811 59.991,5.81057 59.9896,5.81309 59.9853,5.82524 59.9865,5.84269 59.9918,5.85009 60,5.85092 60,5.86832 60.0031,5.86953 60.007,5.87655 60.0089,5.88841 60.0151,5.89895 60.0206,5.91697 60.0369,5.91156 60.0422,5.92402 60.0445,5.92667 60.0481,5.91821 60.0523,5.92069 60.0627,5.91356 60.0673,5.91621 60.0708,5.91321 60.0753,5.92166 60.0827,5.92315 60.0878,5.91639 60.0958,5.91952 60.1022,5.91742 60.1096,5.90617 60.1227,5.90605 60.1243,5.90538 60.1335,5.90027 60.1367,5.90151 60.1434,5.9055 60.1473,5.90047 60.1558,5.90918 60.1646,5.91675 60.169,5.92204 60.1647,5.91735 60.1594,5.92251 60.153,5.92813 60.1523,5.94309 60.1565,5.95087 60.1626,5.95199 60.1759,5.96286 60.1974,5.97127 60.1996,5.96471 60.2032,5.9691 60.2075,5.96603 60.2125,5.96788 60.2153,5.97883 60.2159,5.99465 60.2266,6.01042 60.2318,6.01028 60.2357,6.00397 60.2408,6.02258 60.2573,6.02148 60.2674,6.03065 60.2737,6.04059 60.269,6.0566 60.2609,6.07013 60.2598,6.08394 60.2539,6.10819 60.255,6.12363 60.2535,6.13452 60.2546,6.14313 60.2586,6.1457 60.2569,6.14047 60.2519,6.13975 60.2475,6.14193 60.2453,6.14999 60.2437,6.18117 60.263,6.19557 60.2807,6.19279 60.2839,6.19095 60.2843,6.18278 60.286,6.18086 60.2896,6.17392 60.2928,6.17735 60.3037,6.17378 60.3121,6.19105 60.323,6.21025 60.3274,6.22399 60.3343,6.21563 60.3439,6.19544 60.3491,6.1829 60.3495,6.16903 60.3557,6.15753 60.3644,6.15916 60.3659,6.17925 60.3653,6.18331 60.3652,6.20773 60.3688,6.20933 60.3705,6.20194 60.3796,6.20638 60.3839,6.22718 60.381,6.24085 60.373,6.25099 60.3701,6.2728 60.379,6.27832 60.3792,6.27902 60.3838,6.27288 60.3909,6.24313 60.4103,6.23236 60.4174,6.22661 60.428,6.22295 60.4462,6.21369 60.4584,6.22084 60.4695,6.24543 60.4415,6.24572 60.4365,6.23808 60.4318,6.24053 60.4216,6.25566 60.4164,6.25761 60.4147,6.26191 60.411,6.27113 60.3995,6.27674 60.3961,6.28882 60.3926,6.29717 60.3924,6.32138 60.3977,6.3369 60.3991,6.36621 60.4107,6.39141 60.4125,6.40375 60.4158,6.40908 60.4184,6.41036 60.4256,6.41727 60.429,6.4306 60.4297,6.44294 60.4276,6.45374 60.4298,6.51578 60.4496,6.52573 60.4513,6.53477 60.4562,6.56175 60.4555,6.57649 60.4528,6.59592 60.453,6.60618 60.4559,6.61072 60.4599,6.61075 60.4616,6.61082 60.4659,6.62243 60.4725,6.638 60.4739,6.68671 60.501,6.70382 60.515,6.71765 60.5192,6.71892 60.5167,6.70137 60.5024,6.66193 60.4786,6.65871 60.4716,6.63384 60.4637,6.62954 60.4512,6.63653 60.4475,6.65861 60.4452,6.66941 60.4408,6.67985 60.4288,6.68593 60.4283,6.68976 60.4288,6.70231 60.4304,6.71045 60.4387,6.72354 60.4412,6.73667 60.4503,6.74952 60.4512,6.76232 60.456,6.7627 60.467,6.76658 60.4692,6.79391 60.4728,6.84732 60.4862,6.87973 60.4865,6.88684 60.4888,6.89265 60.4906,6.91385 60.5096,6.91814 60.5159,6.91076 60.5299,6.91567 60.5422,6.91313 60.5618,6.92084 60.5669,6.93724 60.5731,6.94644 60.5738,6.95146 60.571,6.94611 60.5656,6.94037 60.5648,6.93332 60.5638,6.92543 60.5601,6.92322 60.5557,6.92975 60.5447,6.92021 60.5322,6.92209 60.5284,6.92724 60.5281,7.01128 60.5795,7.02512 60.584,7.03332 60.5854,7.03766 60.5842,7.02297 60.5789,7.00329 60.5655,6.99849 60.5557,6.99276 60.5533,6.98177 60.552,6.97405 60.5433,6.9572 60.5334,6.93872 60.511,6.91945 60.4985,6.91715 60.4948,6.92611 60.49,6.94135 60.4932,6.98754 60.5029,7.00288 60.5027,7.04575 60.4937,7.05862 60.4872,7.07417 60.4851,7.09259 60.4862,7.10388 60.4883,7.09506 60.4812,7.08368 60.4795,7.06772 60.4662,7.06218 60.466,7.02923 60.4813,7.01289 60.4822,6.98896 60.4807,6.95626 60.4745,6.94597 60.4725,6.91831 60.4715,6.89342 60.4668,6.87758 60.4674,6.85918 60.4735,6.83936 60.4726,6.82519 60.4676,6.81055 60.4591,6.80066 60.4499,6.78189 60.4447,6.76135 60.4355,6.74958 60.427,6.74105 60.4143,6.73279 60.4069,6.71473 60.4035,6.70736 60.3999,6.70513 60.3959,6.71323 60.3872,6.72628 60.3796,6.72266 60.3756,6.70339 60.3814,6.69525 60.3869,6.69147 60.3874,6.68715 60.3852,6.66183 60.35,6.65646 60.3425,6.65383 60.3245,6.64993 60.3159,6.64193 60.3069,6.63646 60.293,6.62241 60.2845,6.61891 60.2798,6.62171 60.2728,6.61831 60.2573,6.62084 60.2489,6.60962 60.23,6.60401 60.2206,6.6044 60.2078,6.59263 60.1897,6.58589 60.1886,6.56917 60.1766,6.57444 60.1651,6.56927 60.1559,6.57398 60.1517,6.56377 60.1459,6.55101 60.1221,6.5561 60.1151,6.54676 60.1031,6.55017 60.0851,6.54411 60.076,6.53791 60.081,6.52822 60.0848,6.52599 60.091,6.5211 60.0952,6.51868 60.0973,6.52025 60.0992,6.52433 60.0996,6.5334 60.0937,6.53764 60.0962,6.53148 60.1042,6.53719 60.1159,6.53398 60.1291,6.53497 60.1417,6.5484 60.1607,6.55107 60.1911,6.5567 60.2002,6.5596 60.2013,6.57022 60.2055,6.57068 60.2122,6.57737 60.2236,6.57215 60.2315,6.57573 60.2488,6.59079 60.2731,6.60618 60.2885,6.60465 60.2896,6.61521 60.3067,6.61403 60.3186,6.61358 60.3195,6.60897 60.3285,6.61331 60.3339,6.62026 60.3337,6.62786 60.3356,6.63115 60.3419,6.63217 60.358,6.64952 60.3764,6.64937 60.3876,6.67122 60.4037,6.6663 60.4093,6.65889 60.4127,6.65137 60.4136,6.64128 60.4197,6.63014 60.4233,6.62519 60.4256,6.6053 60.4288,6.58351 60.4356,6.57147 60.4357,6.55832 60.4336,6.55327 60.43,6.54523 60.4279,6.53669 60.4211,6.52596 60.4135,6.517 60.4114,6.50932 60.4033,6.5013 60.3948,6.5 60.3876,6.49704 60.3857,6.42725 60.3693,6.4076 60.3677,6.35326 60.3695,6.34773 60.3631,6.35562 60.3565,6.35672 60.3489,6.37474 60.3457,6.37449 60.3411,6.34784 60.3369,6.33699 60.3322,6.32946 60.3237,6.32202 60.3209,6.31544 60.3154,6.30141 60.3135,6.28642 60.3056,6.27209 60.3058,6.24464 60.3011,6.22654 60.2956,6.22371 60.293,6.23054 60.2905,6.2444 60.2903,6.2454 60.2836,6.24562 60.2821,6.25109 60.2764,6.24818 60.2742,6.23324 60.2755,6.23015 60.2591,6.22482 60.2577,6.20466 60.257,6.20183 60.2544,6.20543 60.2488,6.1987 60.2414,6.19285 60.2405,6.19094 60.2379,6.19622 60.2303,6.19385 60.2277,6.17369 60.221,6.16421 60.2197,6.14493 60.2225,6.12436 60.2215,6.11862 60.2199,6.11619 60.2159,6.10976 60.2055,6.09761 60.1978,6.07875 60.1947,6.08001 60.1925,6.09116 60.1888,6.09442 60.1795,6.10394 60.1744,6.10375 60.1695,6.10828 60.164,6.11928 60.1612,6.13217 60.1458,6.14727 60.1432,6.15676 60.1351,6.1712 60.1276,6.16465 60.1223,6.16064 60.1217,6.1426 60.1194,6.13715 60.116,6.14027 60.1136,6.20742 60.1186,6.22283 60.126,6.25592 60.135,6.26174 60.1391,6.26632 60.1517,6.27281 60.1606,6.28343 60.1665,6.29162 60.1671,6.29519 60.1647,6.29478 60.1612,6.28515 60.1517,6.28337 60.1388,6.28799 60.1355,6.29898 60.1352,6.30828 60.1349,6.31142 60.1322,6.30954 60.1294,6.27098 60.1232,6.24468 60.1211,6.21509 60.1072,6.20302 60.1081,6.19495 60.1069,6.18867 60.1089,6.17597 60.108,6.16922 60.1041,6.16241 60.1036,6.1545 60.0983,6.13437 60.098,6.11533 60.0996,6.10823 60.0949,6.10033 60.0896,6.08925 60.0871,6.08672 60.0827,6.07308 60.0819,6.0634 60.0763,6.0497 60.076,6.02475 60.0624,6.01566 60.0412,6.00441 60.0281,5.99664 60.0251,5.98109 60,5.9801 59.9984,5.97945 59.9974,5.9846 59.9936,6.00278 59.9914,6.01429 59.9879,6.01038 59.9836,5.99355 59.9743,5.98746 59.9575,5.98013 59.9577,5.97219 59.9617,5.96811 59.9616,5.96523 59.9537,5.96174 59.9526,5.94054 59.9539,5.91586 59.9598,5.91142 59.9589,5.91207 59.9548,5.8753 59.9476,5.868 59.9476,5.86489 59.9412,5.85486 59.9383,5.8548 59.9358,5.85181 59.9345,5.83359 59.9343,5.82711 59.9377,5.82169 59.9345,5.81036 59.9368,5.79007 59.9295,5.78032 59.922,5.76996 59.9184,5.76079 59.9017,5.76808 59.8933,5.7672 59.8818,5.7599 59.8762,5.74668 59.8706,5.74408 59.8726,5.7493 59.8769,5.7461 59.8798,5.74124 59.8817,5.73245 59.8803,5.73146 59.8801,5.72337 59.8738,5.73268 59.8698,5.73263 59.8673,5.71199 59.8626,5.70652 59.8626,5.69763 59.8668,5.68679 59.8579,5.69025 59.8507,5.68651 59.8485,5.66858 59.8551,5.66439 59.8528,5.67144 59.8487,5.67004 59.8434,5.67244 59.8398,5.68179 59.8411,5.68977 59.8369,5.69757 59.8365,5.70801 59.8395,5.71751 59.8399,5.72582 59.8448,5.73941 59.8469,5.75133 59.8644,5.75537 59.8648,5.76094 59.8529,5.743 59.8427,5.72837 59.8403,5.72485 59.8367,5.71226 59.8357,5.7031 59.8305,5.71078 59.8281,5.73849 59.8341,5.78065 59.8351,5.7852 59.8323,5.7763 59.831,5.7724 59.8269,5.77323 59.8269,5.78942 59.8258,5.8095 59.8112,5.81369 59.7992,5.82121 59.792,5.84622 59.7833,5.85797 59.7751,5.87175 59.7713,5.88356 59.7713,5.89269 59.7797,5.9066 59.7837,5.91101 59.7932,5.91757 59.7949,5.92807 59.7946,5.95235 59.8109,5.95854 59.8196,5.96506 59.8286,5.96862 59.8526,5.97293 59.8572,5.99239 59.8579,5.9813 59.8501,5.98354 59.8445,5.98323 59.8112,5.9698 59.8013,5.95425 59.7899,5.962 59.778,5.96666 59.7773,5.97766 59.7649,6.01049 59.7552,6.04104 59.7573,6.05471 59.7569,6.05645 59.7604,6.06486 59.7648,6.07152 59.7628,6.07916 59.7633,6.07739 59.766,6.088 59.7865,6.08863 59.7878,6.09204 59.7893,6.09941 59.7886,6.11111 59.7833,6.12753 59.792,6.14053 59.7932,6.15577 59.8006,6.15837 59.8076,6.16432 59.8103,6.17156 59.8106,6.18284 59.8142,6.22468 59.8358,6.28138 59.8431,6.29124 59.8442,6.32846 59.8542,6.33674 59.8568,6.33476 59.8579,6.34122 59.8636,6.3578 59.8718,6.36796 59.874,6.37172 59.8732,6.36477 59.8677,6.34285 59.8586,6.34567 59.8548,6.33185 59.8466,6.30985 59.8382,6.28662 59.8353,6.27222 59.8311,6.24164 59.8318,6.23816 59.8307,6.21504 59.8148,6.21379 59.8078,6.19687 59.8024,6.19498 59.8013,6.18011 59.7928,6.17058 59.7897,6.15122 59.7885,6.13647 59.7838,6.13009 59.7749,6.12317 59.7696,6.12086 59.7637,6.1136 59.7607,6.11417 59.7509,6.10292 59.7472,6.08837 59.7384,6.08028 59.7379,6.06318 59.743,6.05162 59.7414,6.0467 59.7439,6.03625 59.744,6.02419 59.742,6.01759 59.7385,6.00155 59.7454,5.99381 59.7456,5.99114 59.7422,5.99368 59.7375,5.98983 59.736,5.97584 59.7384,5.95956 59.744,5.95737 59.7552,5.93502 59.7646,5.93451 59.7708,5.93138 59.7734,5.92548 59.7704,5.92562 59.7608,5.92914 59.7586,5.93931 59.7574,5.94308 59.7537,5.94003 59.7499,5.93299 59.7485,5.92867 59.7442,5.93318 59.741,5.93786 59.7376,5.9335 59.7336,5.91999 59.7358,5.90609 59.7405,5.90225 59.739,5.90143 59.7355,5.87761 59.7341,5.86895 59.7315,5.85865 59.7306,5.856 59.7273,5.86203 59.7206,5.85888 59.7148,5.84922 59.7128,5.83258 59.7119,5.8249 59.7088,5.81021 59.6986,5.78594 59.6916,5.78018 59.688,5.77803 59.6844,5.77852 59.6823,5.78108 59.671,5.77889 59.6677,5.78424 59.6654,5.78346 59.659,5.78745 59.6538,5.80551 59.6541,5.8291 59.6567,5.84209 59.6604,5.86455 59.6615,5.89068 59.6711,5.91026 59.6732,5.93205 59.6729,5.94141 59.671,5.9446 59.6679,5.94146 59.6648,5.9104 59.6666,5.90456 59.6634,5.8954 59.6612,5.88599 59.6518,5.89081 59.65,5.90341 59.6502,5.91562 59.6505,5.9168 59.6487,5.91218 59.6465,5.87872 59.6463,5.86267 59.6447,5.84931 59.652,5.84391 59.6518,5.83579 59.6487,5.80196 59.648,5.79273 59.6463,5.78772 59.6408,5.79056 59.623,5.80604 59.611,5.79043 59.6039,5.78953 59.6039,5.77265 59.6021,5.74653 59.6015,5.74407 59.6027,5.74636 59.6054,5.76193 59.6069,5.77134 59.6103,5.78343 59.6195,5.78489 59.6274,5.77649 59.6431,5.77071 59.6481,5.75792 59.6545,5.73899 59.6539,5.73143 59.6559,5.72211 59.6604,5.71341 59.6609,5.70488 59.6661,5.69796 59.6663,5.68666 59.6667,5.68063 59.6703,5.6755 59.6713,5.66091 59.6718,5.65427 59.6681,5.64494 59.6725,5.63448 59.6728,5.61377 59.6802,5.60664 59.6877,5.59786 59.6887,5.58586 59.6873,5.58328 59.6837,5.57204 59.6777,5.56882 59.6726,5.56283 59.6705,5.54962 59.6573,5.54505 59.644,5.54753 59.64,5.55292 59.6402,5.5542 59.638,5.54863 59.6334,5.54709 59.6209,5.55003 59.6142,5.54582 59.6069,5.55133 59.6009,5.55063 59.597,5.5531 59.5957,5.56215 59.5956,5.56874 59.5968,5.57611 59.5932,5.55802 59.5851,5.55438 59.5772,5.55906 59.5707,5.5577 59.5626,5.5468 59.544,5.54348 59.5423,5.54381 59.541,5.54702 59.5291,5.54423 59.5269,5.53796 59.5374,5.53516 59.538,5.52908 59.5366,5.52205 59.5273,5.51608 59.5253,5.51341 59.5196,5.50786 59.5178,5.50407 59.5135,5.49403 59.5142,5.48791 59.513,5.4817 59.5178,5.47621 59.5183,5.46492 59.5129,5.46392 59.5056,5.4666 59.4976,5.46008 59.4829,5.45646 59.483,5.45415 59.4886,5.45741 59.493,5.45819 59.4941,5.45206 59.5117,5.44544 59.5135,5.44453 59.5162,5.45393 59.5246,5.45325 59.526,5.44881 59.5256,5.44378 59.5233,5.44034 59.525,5.44354 59.5274,5.44183 59.5322,5.45363 59.5317,5.45626 59.5348,5.44685 59.5425,5.44736 59.5448,5.45322 59.5448,5.47111 59.5297,5.48771 59.525,5.49492 59.525,5.50814 59.5323,5.50481 59.5407,5.50422 59.5422,5.49388 59.55,5.49626 59.5519,5.50994 59.5512,5.51262 59.554,5.51046 59.5615,5.527 59.568,5.52956 59.5743,5.51552 59.5906,5.51771 59.5965,5.51432 59.6032,5.51966 59.628,5.5085 59.6406,5.51203 59.6465,5.51607 59.6462,5.51754 59.6461,5.51944 59.6482,5.52368 59.658,5.51816 59.664,5.52741 59.6763,5.53206 59.6919,5.52944 59.6994,5.5344 59.7104,5.53284 59.7169,5.5287 59.72,5.51711 59.7188,5.5136 59.7235,5.51889 59.7244,5.52476 59.7327,5.52336 59.7356,5.51833 59.7358,5.51011 59.7334,5.49303 59.7217,5.49253 59.7215,5.46948 59.7133,5.46624 59.7084,5.46037 59.7056,5.45679 59.708,5.45179 59.708,5.44991 59.695,5.44099 59.6942,5.43196 59.6913,5.43483 59.6877,5.43015 59.6859,5.42718 59.6821,5.43836 59.675,5.43913 59.6705,5.43626 59.6687,5.42932 59.6696,5.41531 59.6614,5.40931 59.6673,5.40432 59.6673,5.40291 59.665,5.40686 59.6578,5.42752 59.6509,5.42912 59.6511,5.43856 59.6525,5.43989 59.6501,5.43406 59.6471,5.43449 59.6446,5.4422 59.6391,5.45337 59.6373,5.46709 59.6285,5.46097 59.6165,5.45427 59.616,5.43844 59.608,5.43614 59.6109,5.44043 59.615,5.43699 59.6192,5.42959 59.6122,5.43372 59.5906,5.43071 59.587,5.42494 59.589,5.42158 59.5928,5.42213 59.5997,5.42287 59.6092,5.42957 59.6202,5.42784 59.6225,5.41935 59.6271,5.41372 59.6283,5.40765 59.6241,5.40148 59.6231,5.39949 59.6242,5.40529 59.63,5.40853 59.6375,5.40094 59.6527,5.39617 59.6541,5.39435 59.6515,5.39675 59.6454,5.393 59.6409,5.38391 59.6543,5.36857 59.646,5.36915 59.6401,5.36505 59.6376,5.36193 59.6369,5.36026 59.6365,5.35594 59.6379,5.35059 59.6374,5.34255 59.6316,5.3301 59.6329,5.32158 59.6272,5.31057 59.6228,5.30962 59.6205,5.31385 59.617,5.31489 59.6058,5.30894 59.6062,5.31176 59.6004,5.30919 59.5996,5.30051 59.6026,5.29834 59.5995,5.2832 59.5904,5.28503 59.5877,5.28018 59.5792,5.27886 59.5661,5.27364 59.5649,5.27003 59.57,5.26783 59.5697,5.26169 59.5635,5.26195 59.562,5.26301 59.556,5.25307 59.556,5.24634 59.5531,5.23329 59.5349,5.22102 59.5277,5.22964 59.5248,5.24473 59.5237,5.2464 59.5219,5.23898 59.5179,5.22832 59.517,5.22725 59.5153,5.23168 59.5132,5.24295 59.5133,5.25431 59.5154,5.25728 59.5139,5.25088 59.5118,5.2466 59.5079,5.2496 59.5062,5.26156 59.5074,5.26774 59.5056,5.26948 59.5034,5.25492 59.5042,5.25259 59.502,5.25519 59.5,5.25252 59.4997,5.25035 59.4994,5.23223 59.505,5.21908 59.5028,5.21635 59.5004,5.22159 59.4962,5.22092 59.4898,5.22672 59.485,5.22236 59.4816,5.23215 59.4797,5.2343 59.4777,5.23336 59.4754,5.22763 59.4747,5.22823 59.4713,5.23607 59.4702,5.24513 59.4725,5.2483 59.4699,5.2394 59.4692,5.23529 59.467,5.23377 59.4628,5.23934 59.4516,5.23355 59.4435,5.23511 59.4371,5.24731 59.4317,5.25332 59.4249,5.28092 59.3937,5.28768 59.391,5.30122 59.3673,5.32731 59.3331,5.33484 59.3337,5.34102 59.3317,5.34327 59.329,5.33396 59.3206,5.33433 59.3151,5.33574 59.2945,5.35434 59.2696,5.3598 59.2717,5.35893 59.2794,5.36316 59.2835,5.37259 59.2807,5.38686 59.2864,5.38635 59.2894,5.38051 59.2921,5.37792 59.2968,5.3744 59.2964,5.36785 59.2901,5.36531 59.2919,5.37446 59.304,5.37682 59.3156,5.37835 59.3232,5.37216 59.328,5.37562 59.3314,5.36609 59.3346,5.36671 59.3362,5.37612 59.339,5.36593 59.3644,5.36638 59.3828,5.37431 59.3864,5.37533 59.3988,5.36436 59.4078,5.36504 59.4117,5.3774 59.421,5.38142 59.4211,5.3833 59.418,5.38234 59.4158,5.37942 59.4091,5.38734 59.3943,5.39553 59.3885,5.40479 59.3868,5.40437 59.384,5.39913 59.3831,5.39849 59.379,5.39347 59.3794,5.39184 59.3837,5.3856 59.3835,5.38298 59.3804,5.38196 59.3626,5.39291 59.3431,5.40443 59.3414,5.40757 59.3387,5.39397 59.3395,5.38948 59.3343,5.39393 59.3292,5.39113 59.3272,5.38954 59.326,5.39097 59.3229,5.39771 59.3202,5.39728 59.3174,5.39291 59.3167,5.39155 59.3142,5.40059 59.3005,5.41488 59.2929,5.4217 59.2923,5.43066 59.295,5.45483 59.2951,5.45763 59.2998,5.44852 59.3247,5.44973 59.3335,5.4402 59.3395,5.44204 59.3419,5.44965 59.342,5.45517 59.3438,5.458 59.3498,5.46542 59.3656,5.46046 59.3844,5.46579 59.3902,5.47233 59.3914,5.47412 59.3807,5.46877 59.3724,5.47612 59.3661,5.47201 59.3558,5.45847 59.3375,5.46097 59.328,5.45717 59.3159,5.45926 59.3144,5.46789 59.3081,5.46464 59.2981,5.46966 59.2948,5.46777 59.2874,5.47268 59.2849,5.47151 59.2812,5.488 59.2736,5.50052 59.2737,5.51394 59.2711,5.52869 59.2712,5.54746 59.2769,5.54939 59.2733,5.55429 59.2735,5.55565 59.2761,5.5635 59.2773,5.56998 59.2815,5.57715 59.2924,5.58723 59.2965,5.59342 59.3025,5.59395 59.3043,5.59911 59.3224,5.61091 59.3243,5.61444 59.3275,5.61814 59.3377,5.61238 59.3455,5.61205 59.3503,5.61546 59.3514,5.6155 59.3594,5.61085 59.3604,5.60609 59.3647,5.60794 59.3781,5.60006 59.3824,5.60207 59.3839,5.6079 59.3839,5.61653 59.3806,5.61883 59.383,5.61823 59.3894,5.62169 59.3957,5.61027 59.4051,5.62321 59.4084,5.62492 59.4062,5.63185 59.4051,5.63307 59.4031,5.62805 59.398,5.62775 59.3943,5.63627 59.3807,5.64626 59.3745,5.65335 59.364,5.65896 59.3543,5.65713 59.3462,5.66655 59.3379,5.67212 59.3368,5.6759 59.33,5.68399 59.3299,5.68398 59.3244,5.67934 59.3226,5.66116 59.3241,5.65336 59.3224,5.64925 59.3257,5.64624 59.3249,5.64431 59.3202,5.64798 59.3114,5.64174 59.3029,5.64367 59.2993,5.65146 59.2983,5.65223 59.2962,5.64207 59.2953,5.64025 59.2872,5.64441 59.2865,5.63838 59.2798,5.63151 59.2722,5.63147 59.2696,5.64558 59.2627,5.66414 59.2614,5.65818 59.2733,5.65875 59.2836,5.65749 59.2859,5.66243 59.2914,5.68802 59.3021,5.69344 59.3019,5.69611 59.2992,5.70638 59.2994,5.71183 59.3017,5.71348 59.3082,5.72697 59.3163,5.73306 59.3175,5.74873 59.3317,5.74217 59.3362,5.74214 59.3392,5.74691 59.3431,5.75842 59.3328,5.76257 59.332,5.77399 59.3364,5.78834 59.3335,5.79093 59.3272,5.79128 59.3263,5.80121 59.3316,5.80553 59.3496,5.81022 59.3512,5.81622 59.3473,5.81841 59.3334,5.82233 59.3313,5.82775 59.331,5.8297 59.3357,5.8353 59.3401,5.84546 59.3439,5.86409 59.3366,5.87262 59.3365,5.88653 59.3451,5.89463 59.3594,5.89321 59.3685,5.89678 59.3774,5.89493 59.3835,5.88958 59.389,5.87734 59.3937,5.8595 59.4005,5.85411 59.4119,5.84411 59.4242,5.84518 59.4345,5.8421 59.4369,5.83753 59.4374,5.81847 59.4328,5.79944 59.4308,5.77298 59.4247,5.7587 59.4184,5.75268 59.4195,5.71124 59.4055,5.71004 59.4051,5.70245 59.4048,5.69582 59.4013,5.67409 59.3967,5.66993 59.3975,5.67495 59.4025,5.7038 59.4104,5.72838 59.4197,5.75087 59.4337,5.74652 59.4468,5.73618 59.4523,5.74094 59.4592,5.73667 59.4634,5.73805 59.466,5.73372 59.4761,5.73995 59.4766,5.75419 59.4664,5.76008 59.4464,5.77029 59.4388,5.79603 59.4495,5.81363 59.4521,5.82069 59.4558,5.82459 59.4566,5.84292 59.4604,5.85675 59.4726,5.85523 59.4852,5.85155 59.4915,5.84184 59.4959,5.82669 59.5148,5.81323 59.5229,5.81724 59.5261,5.82839 59.5298,5.8347 59.5298,5.84103 59.5268,5.84547 59.5272,5.84635 59.5417,5.85288 59.5461,5.86073 59.5478,5.86559 59.5485,5.86965 59.5456,5.87068 59.539,5.86637 59.532,5.86672 59.5068,5.87438 59.4981,5.89171 59.4967,5.89817 59.4929,5.89747 59.4887,5.88902 59.4852,5.88896 59.4826,5.89535 59.4792,5.90948 59.4752,5.92724 59.4768,5.93427 59.475,5.97093 59.4767,6.09652 59.4768,6.12872 59.4812,6.15961 59.4824,6.16546 59.4916,6.18986 59.4879,6.19337 59.4816,6.19475 59.4791,6.19419 59.4768,6.18957 59.4746,6.12855 59.4702,6.11529 59.4656,6.09702 59.4644,6.05617 59.4578,6.03673 59.4524,6.02871 59.4519,6.02125 59.4477,6.01059 59.4468,6.00264 59.4488,5.98294 59.4453,5.97279 59.4448,5.96196 59.4442,5.94455 59.4463,5.92423 59.4526,5.91794 59.4496,5.91176 59.4489,5.922 59.4408,5.92298 59.4374,5.91212 59.4349,5.91221 59.4228,5.91818 59.4161,5.91915 59.407,5.91573 59.4029,5.93042 59.395,5.93598 59.3764,5.94228 59.3675,5.94746 59.3602,5.96155 59.3531,5.96768 59.3571,5.97699 59.3519,5.98106 59.3546,5.97673 59.3595,5.98594 59.3697,5.99804 59.3757,6.02066 59.3805,6.02436 59.3827,6.01801 59.3861,6.02381 59.3893,6.018 59.3921,6.02301 59.4005,6.01803 59.4038,6.01116 59.4017,6.00951 59.4037,6.0229 59.4102,6.02644 59.4105,6.02902 59.4024,6.04283 59.3972,6.06083 59.3999,6.05255 59.4042,6.05705 59.4071,6.08399 59.4072,6.08849 59.4102,6.10698 59.4097,6.11051 59.4071,6.12057 59.4059,6.12626 59.413,6.12373 59.418,6.12858 59.4216,6.14403 59.4265,6.15992 59.4285,6.16708 59.4318,6.18474 59.4525,6.18663 59.4547,6.21966 59.475,6.21701 59.4901,6.20843 59.4902,6.20398 59.496,6.20899 59.5049,6.22948 59.5158,6.25134 59.5235,6.25716 59.5331,6.26757 59.539,6.26917 59.5544,6.26927 59.5553,6.26664 59.5609,6.27162 59.5671,6.27879 59.5706,6.28099 59.5741,6.28711 59.5755,6.29658 59.5818,6.30508 59.5823,6.30597 59.5856,6.29495 59.5994,6.28782 59.6019,6.29285 59.6108,6.29324 59.6206,6.30747 59.6411,6.32182 59.6451,6.32806 59.6458,6.33682 59.6509,6.34679 59.6508,6.35727 59.647,6.36432 59.642,6.34896 59.6387,6.34168 59.6327,6.32848 59.6302,6.32416 59.6257,6.32819 59.6164,6.33302 59.5985,6.32765 59.5886,6.30779 59.5698,6.29411 59.5645,6.28538 59.5499,6.2809 59.5466,6.28026 59.5385,6.27245 59.5302,6.2704 59.5226,6.27284 59.5213,6.28322 59.5212,6.30765 59.5299,6.30919 59.5301,6.32174 59.5322,6.33047 59.5374,6.35754 59.5404,6.36305 59.5429,6.36256 59.5463,6.37355 59.5516,6.3882 59.55,6.42144 59.551,6.43763 59.5578,6.45302 59.5606,6.48129 59.5584,6.52454 59.5588,6.53114 59.5595,6.54988 59.5615,6.55106 59.5595,6.55378 59.5593,6.56154 59.5587,6.57748 59.5608,6.60769 59.561,6.60982 59.5585,6.60641 59.557,6.56637 59.5563,6.52746 59.5506,6.51532 59.5504,6.49692 59.553,6.47544 59.5518,6.45342 59.548,6.44358 59.5442,6.43021 59.5415,6.40676 59.5367,6.39485 59.5285,6.38725 59.528,6.37822 59.5313,6.37325 59.5314,6.35427 59.5254,6.33249 59.5232,6.30216 59.5148,6.28545 59.5151,6.26888 59.5113,6.25208 59.5028,6.24549 59.4955,6.25265 59.4896,6.24846 59.4844,6.24658 59.4818,6.25354 59.471,6.25231 59.4671,6.24311 59.4592,6.22081 59.4301,6.21415 59.4111,6.20836 59.4076,6.2053 59.4071,6.20449 59.4096,6.21434 59.4221,6.21656 59.4407,6.21399 59.4429,6.20719 59.4434,6.20609 59.4426,6.1888 59.4307,6.17893 59.4214,6.1746 59.4203,6.16733 59.424,6.15137 59.4224,6.1384 59.419,6.13389 59.416,6.13227 59.4119,6.13573 59.4067,6.12234 59.397,6.11475 59.3967,6.10624 59.3996,6.09407 59.3939,6.0849 59.3921,6.07312 59.3869,6.06333 59.3863,6.05015 59.3784,6.04784 59.3751,6.04201 59.3669,6.04459 59.3617,6.0306 59.3533,6.02135 59.3404,6.03208 59.3316,6.04573 59.3273,6.06993 59.3273,6.07856 59.3295,6.08484 59.3265,6.08837 59.3269,6.08817 59.3342,6.09264 59.3434,6.08976 59.3446,6.08129 59.3443,6.08269 59.3469,6.10557 59.362,6.1061 59.3553,6.11196 59.3521,6.09987 59.34,6.10034 59.3368,6.10631 59.3359,6.09972 59.3319,6.10311 59.3302,6.10485 59.3246,6.11149 59.3221,6.11705 59.3239,6.13043 59.3152,6.14738 59.3127,6.18004 59.316,6.19278 59.3392,6.1963 59.3427,6.2044 59.3456,6.20798 59.3432,6.21233 59.3404,6.20892 59.3361,6.20171 59.3333,6.20368 59.329,6.19279 59.3238,6.19335 59.3199,6.19897 59.3183,6.2109 59.3194,6.22573 59.3253,6.24041 59.326,6.24144 59.3281,6.23403 59.3329,6.22967 59.3444,6.22032 59.3471,6.21906 59.3495,6.22722 59.3551,6.22879 59.3598,6.21721 59.3839,6.21861 59.3897,6.2317 59.3769,6.23963 59.3469,6.2481 59.341,6.25538 59.331,6.26033 59.3277,6.29503 59.32,6.28727 59.3179,6.28029 59.3197,6.27412 59.319,6.27171 59.3171,6.27204 59.3148,6.28461 59.3146,6.28949 59.3118,6.28529 59.3098,6.27479 59.3113,6.27158 59.3086,6.28075 59.3009,6.28022 59.2984,6.27716 59.2978,6.26047 59.3112,6.25479 59.3133,6.21514 59.3118,6.18212 59.308,6.17683 59.3074,6.13647 59.3077,6.11852 59.3049,6.11776 59.301,6.12745 59.2839,6.13209 59.2797,6.14365 59.2772,6.16181 59.2602,6.17115 59.2606,6.19345 59.2701,6.21023 59.2717,6.23163 59.2766,6.26393 59.284,6.28565 59.2917,6.33731 59.303,6.35498 59.3142,6.3664 59.319,6.38929 59.3219,6.40193 59.3212,6.43268 59.3255,6.44834 59.3224,6.47642 59.3234,6.49538 59.3191,6.5559 59.3187,6.54964 59.3152,6.51835 59.3151,6.50355 59.315,6.48392 59.3177,6.47001 59.3179,6.43675 59.3156,6.39222 59.3041,6.37523 59.304,6.35797 59.2962,6.32758 59.2864,6.32613 59.284,6.33904 59.2687,6.33274 59.2689,6.32214 59.2775,6.31558 59.2795,6.3035 59.2795,6.27438 59.2704,6.22209 59.2656,6.20178 59.2601,6.18628 59.2582,6.17753 59.2505,6.17742 59.2452,6.18453 59.2363,6.16329 59.2348,6.15554 59.2359,6.13853 59.227,6.13581 59.2212,6.13116 59.2194,6.12256 59.2232,6.11366 59.2169,6.1096 59.2201,6.10242 59.2173,6.10095 59.2122,6.09141 59.2103,6.08881 59.2067,6.09046 59.2064,6.09851 59.2046,6.10059 59.2026,6.09464 59.1975,6.08713 59.197,6.07101 59.1914,6.07145 59.1854,6.06698 59.1795,6.05964 59.1838,6.05763 59.1823,6.05329 59.1725,6.03174 59.1586,6.02742 59.1458,6.0491 59.138,6.05789 59.1418,6.07562 59.1454,6.0897 59.1511,6.09203 59.152,6.09899 59.1532,6.11094 59.1447,6.12895 59.1466,6.13237 59.1506,6.16929 59.1511,6.17931 59.1405,6.09052 59.1412,6.08741 59.1351,6.09293 59.1339,6.09408 59.1322,6.08751 59.1314,6.07843 59.1333,6.07302 59.1329,6.06212 59.1284,6.06038 59.1251,6.03262 59.1171,6.00311 59.1178,5.98604 59.1217,5.97548 59.1208,5.96697 59.1182,5.96145 59.1194,5.9556 59.1168,5.95435 59.1133,5.93523 59.1073,5.93153 59.1023,5.91999 59.1021,5.91328 59.0936,5.90339 59.0913,5.8917 59.0863,5.89295 59.0818,5.89371 59.079,5.88813 59.0719,5.90129 59.0644,5.91272 59.0653,5.91743 59.0607,5.91388 59.0548,5.92128 59.0501,5.92928 59.0385,5.9354 59.0362,5.93878 59.0315,5.96031 59.0243,5.97692 59.0262,6.00084 59.0237,6.03525 59.0253,6.04425 59.0185,6.05916 59.0108,6.06833 59.0089,6.08078 59.0027,6.09106 58.9903,6.09024 58.9868,6.08301 58.9907,6.08013 58.9951,6.06113 59.0036,6.05536 59.0036,6.05267 58.9977,6.04921 58.9971,6.04378 59.0008,6.03882 59.0013,6.03984 58.9945,6.03523 58.9927,6.02332 58.9922,6.02044 58.9848,6.01525 58.9839,6.01766 58.9766,6.00993 58.9779,6.00654 58.9769,6.00596 58.9748,6.00698 58.9745,6.01702 58.972,6.01578 58.9655,6.00841 58.9673,6.00696 58.9622,6.01501 58.9559,6.02115 58.9444,6.02556 58.9416,6.03915 58.9396,6.03586 58.9379,6.02929 58.9374,6.03285 58.9343,6.044 58.9368,6.04681 58.9358,6.0482 58.9324,6.04393 58.9283,6.06171 58.913,6.0762 58.9078,6.08131 58.9092,6.08349 58.9214,6.09086 58.9258,6.09732 58.9297,6.10096 58.9411,6.11117 58.947,6.13726 58.9565,6.18186 58.9791,6.20504 58.9876,6.24624 59.0066,6.26152 59.0113,6.26706 59.0131,6.30066 59.0141,6.33468 59.0184,6.35806 59.0194,6.37885 59.0264,6.42714 59.0316,6.47424 59.0367,6.48903 59.0423,6.49929 59.042,6.50735 59.0448,6.51445 59.0448,6.53004 59.0413,6.54283 59.0419,6.55475 59.0458,6.57688 59.0464,6.59043 59.0514,6.61333 59.0529,6.64888 59.0596,6.65363 59.0573,6.65078 59.0553,6.62534 59.0494,6.61081 59.0485,6.59762 59.0441,6.58594 59.0451,6.57594 59.0401,6.56684 59.0384,6.54562 59.0377,6.53718 59.0344,6.52913 59.0348,6.50378 59.0318,6.43593 59.0182,6.42303 59.0184,6.4011 59.01,6.38846 59.0084,6.33976 59.0075,6.31983 59.004,6.31599 59.0038,6.29388 59.0024,6.2783 58.9965,6.24712 58.988,6.23137 58.9803,6.20414 58.9754,6.18558 58.9657,6.18066 58.966,6.17839 58.9572,6.16937 58.9582,6.14913 58.9572,6.15314 58.9509,6.14938 58.9494,6.14186 58.9523,6.13627 58.9512,6.13993 58.9494,6.14056 58.9491,6.14059 58.9459,6.13754 58.9455,6.13141 58.948,6.12089 58.9412,6.1224 58.9369,6.11816 58.9326,6.10945 58.9316,6.10714 58.9292,6.1093 58.9236,6.10536 58.9142,6.09753 58.9073,6.09018 58.9061,6.08628 58.9025,6.092 58.8997,6.10314 58.8992,6.10716 58.8959,6.10596 58.886,6.15687 58.8614,6.17208 58.851,6.17856 58.8489,6.18874 58.8489,6.21386 58.8524,6.2425 58.853,6.28113 58.8485,6.28765 58.843,6.28246 58.8391,6.27373 58.8384,6.23934 58.8442,6.1883 58.8427,6.18464 58.8375,6.17554 58.8362,6.16978 58.8394,6.16218 58.8401,6.15729 58.8421,6.15512 58.843,6.13843 58.8575,6.12782 58.8575,6.12271 58.8562,6.10403 58.866,6.10019 58.8741,6.08271 58.8787,6.07956 58.882,6.08112 58.8864,6.06996 58.8872,6.06854 58.8937,6.0613 58.8948,6.05545 58.8985,6.04556 58.8965,6.01655 58.9041,5.99915 58.902,5.98915 58.9047,5.98256 58.9064,5.97369 58.9065,5.97125 58.908,5.97297 58.9113,5.97007 58.9187,5.97311 58.9251,5.98512 58.9276,5.98137 58.9408,5.96955 58.9398,5.96533 58.9472,5.94021 58.9579,5.93496 58.9575,5.93569 58.9527,5.9301 58.9516,5.92588 58.956,5.91845 58.9552,5.89929 58.9645,5.89838 58.9705,5.88962 58.9726,5.88654 58.9725,5.88786 58.9712,5.89018 58.969,5.86502 58.9682,5.86114 58.9646,5.86727 58.9593,5.86613 58.9581,5.85765 58.9585,5.85083 58.9538,5.84926 58.9496,5.85671 58.9444,5.85491 58.9389,5.85067 58.9348,5.84364 58.9373,5.84047 58.9348,5.84354 58.9322,5.82957 58.928,5.80026 58.9341,5.79427 58.9412,5.78936 58.9414,5.79229 58.934,5.7835 58.9279,5.7819 58.9239,5.78354 58.9214,5.78424 58.9203,5.77413 58.9142,5.77962 58.913,5.7817 58.9026,5.77633 58.8888,5.77085 58.8842,5.7723 58.8806,5.76705 58.8774,5.76564 58.8723,5.7531 58.8677,5.75137 58.8561,5.74537 58.8549,5.74295 58.8562,5.74793 58.8752,5.75334 58.883,5.75233 58.8979,5.74966 58.901,5.74258 58.9092,5.74238 58.9161,5.73542 58.9181,5.73158 58.9227,5.73765 58.9264,5.7463 58.925,5.75331 58.9282,5.75874 58.9388,5.74383 58.9547,5.74451 58.9616,5.75055 58.957,5.759 58.9569,5.774 58.9631,5.76976 58.9675,5.75165 58.9754,5.74125 58.9739,5.73083 58.978,5.72987 58.9768,5.72788 58.9742,5.7197 58.9782,5.71798 58.9834,5.68638 58.9979,5.68157 59.003,5.67517 58.9986,5.66002 58.9989,5.65834 59.0011,5.66429 59.0055,5.66198 59.0089,5.64544 59.0123,5.62893 59.021,5.61587 59.022,5.60351 59.027,5.59971 59.034,5.58094 59.0373,5.57397 59.0324,5.57216 59.0312,5.57378 59.0294,5.5804 59.0297,5.58107 59.0256,5.59009 59.0221,5.58527 59.0189,5.57667 59.0171,5.57115 59.021,5.56504 59.0203,5.56186 59.0126,5.56659 58.9972,5.56106 58.9903,5.5632 58.9826,5.56669 58.983,5.56812 58.9851,5.57169 58.985,5.57614 58.9822,5.58568 58.9863,5.6031 58.9884,5.60821 58.9871,5.60494 58.9826,5.61005 58.9757,5.59011 58.9727,5.591 58.9706,5.59228 58.9676,5.59684 58.9668,5.59864 58.9639,5.6087 58.9621,5.60261 58.9586,5.59063 58.964,5.58579 58.9638,5.56208 58.9405,5.57082 58.9331,5.57438 58.933,5.57915 58.9365,5.58157 58.9324,5.59155 58.931,5.60131 58.9337,5.60568 58.9286,5.6037 58.9244,5.59431 58.9222,5.5799 58.9236,5.57942 58.9211,5.59201 58.9145,5.58718 58.9116,5.58483 58.9115,5.5797 58.9112,5.57472 58.9037,5.58111 58.8998,5.58353 58.8958,5.59072 58.8924,5.59197 58.8874,5.5878 58.8804,5.5826 58.8769,5.55691 58.8689,5.55505 58.8668,5.55901 58.8642,5.55747 58.8628,5.55176 58.8625,5.54739 58.8541,5.5604 58.8475,5.56129 58.842,5.55409 58.8346,5.54277 58.8282,5.54073 58.8244,5.55331 58.8125,5.55108 58.7962,5.53729 58.7859,5.53526 58.7794,5.52961 58.7789,5.52146 58.7724,5.52024 58.7714,5.51243 58.7706,5.48888 58.7528,5.5099 58.743,5.51517 58.7377,5.51509 58.7301,5.5213 58.7272,5.52416 58.7231,5.52116 58.7145,5.52314 58.7105,5.54774 58.6973,5.55256 58.6893,5.55265 58.6833,5.54576 58.6715,5.55064 58.6685,5.56017 58.6559,5.57943 58.651,5.58304 58.6449,5.59294 58.638,5.59116 58.6354,5.59375 58.6302,5.60947 58.6144,5.61674 58.6074,5.63364 58.5923,5.64221 58.588,5.65698 58.5696,5.66056 58.5608,5.66197 58.5575,5.67133 58.551,5.68115 58.547,5.68267 58.543,5.70224 58.5328,5.70999 58.5308,5.74626 58.5342,5.75344 58.5331,5.76373 58.5317,5.78204 58.5238,5.80283 58.5111,5.79881 58.5059,5.80205 58.5019,5.7951 58.5016,5.79086 58.495,5.79343 58.4926,5.80457 58.4912,5.81517 58.4878,5.82011 58.4841,5.82492 58.484,5.83042 58.4767,5.83353 58.4764,5.83956 58.4798,5.84984 58.4784,5.85665 58.4739,5.86353 58.4746,5.86885 58.4799,5.87363 58.4801,5.88059 58.4771,5.87335 58.4762,5.87213 58.4727,5.87798 58.4658,5.88592 58.4625,5.89872 58.4616,5.90069 58.4631,5.92123 58.466,5.92477 58.4687,5.9315 58.4646,5.94814 58.4673,5.9511 58.4709,5.96437 58.4698,5.97006 58.4668,5.9832 58.4667,5.98765 58.4632,5.99197 58.4606,5.99021 58.4548,5.99546 58.4488,6.00271 58.4471,6.00756 58.4438,6.00009 58.4382,5.99914 58.427,6.00305 58.4212,6.00936 58.4168,6.01116 58.4194,6.00839 58.4264,6.01299 58.4307,6.02542 58.4175,6.01898 58.4168,6.01141 58.4119,6.00994 58.407,6.01165 58.4043,6.01979 58.4023,6.02975 58.3851,6.03692 58.3838,6.05015 58.3737,6.05539 58.3737,6.05979 58.3764,6.06146 58.3829,6.06769 58.382,6.07562 58.3725,6.09292 58.3704,6.1069 58.3581,6.11742 58.3546,6.13527 58.3517,6.13839 58.3497,6.14438 58.3458,6.16268 58.3397,6.18292 58.3382,6.19133 58.3341,6.21627 58.3333,6.22716 58.327,6.24438 58.3222,6.24874 58.3221,6.24974 58.3242,6.24555 58.3294,6.24789 58.3313,6.25492 58.3277,6.2581 58.3298,6.25539 58.3336,6.26383 58.3418,6.27017 58.3214,6.27316 58.3217,6.27575 58.325,6.27781 58.3243,6.28717 58.3211,6.29217 58.3165,6.30682 58.3175,6.31883 58.3124,6.3298 58.3117,6.33856 58.3208,6.3427 58.3223,6.35188 58.3219,6.35714 58.3249,6.35931 58.3218,6.35634 58.318,6.351 58.3157,6.34235 58.3154,6.32714 58.2995,6.35745 58.2846,6.37759 58.2771,6.42601 58.266,6.43647 58.2657,6.44528 58.2681,6.45256 58.2624,6.46262 58.2619,6.46688 58.2657,6.47878 58.2579,6.48551 58.2563,6.4919 58.2572,6.49949 58.2557,6.52989 58.2588,6.53279 58.2566,6.53005 58.251,6.53341 58.2486,6.54874 58.2481,6.55652 58.2479,6.57751 58.2434,6.59154 58.2423,6.62449 58.2425,6.63694 58.2402,6.64945 58.234,6.66343 58.24,6.6698 58.2411,6.65846 58.2518,6.64938 58.265,6.65714 58.279,6.65457 58.2922,6.65507 58.2938,6.65581 58.2961,6.66232 58.2996,6.66445 58.3168,6.66841 58.3131,6.67031 58.3017,6.66522 58.2871,6.66621 58.2827,6.67386 58.2807,6.67536 58.2757,6.66681 58.2713,6.66388 58.2636,6.66605 58.2603,6.67527 58.2594,6.67856 58.2575,6.68452 58.2618,6.68758 58.2548,6.6926 58.2529,6.70288 58.2574,6.70642 58.2569,6.70628 58.2546,6.69778 58.2497,6.6958 58.2448,6.70943 58.2297,6.71017 58.2293,6.72242 58.2231,6.73252 58.222,6.74885 58.2336,6.76325 58.2364,6.77466 58.2423,6.78907 58.2451,6.78985 58.2492,6.79753 58.2538,6.80969 58.2538,6.81727 58.2557,6.82581 58.2603,6.84065 58.2597,6.84847 58.2631,6.85922 58.2639,6.86405 58.2671,6.87899 58.2692,6.88651 58.2752,6.89703 58.2744,6.91488 58.2812,6.91651 58.2785,6.8871 58.2667,6.84666 58.2566,6.83243 58.2488,6.83122 58.2489,6.82149 58.2496,6.81433 58.2443,6.79323 58.2395,6.78557 58.2349,6.74968 58.2201,6.74274 58.2132,6.73453 58.2129,6.72124 58.2049,6.70792 58.204,6.69029 58.196,6.67884 58.194,6.67453 58.1904,6.68299 58.1887,6.69024 58.1827,6.68918 58.1809,6.68073 58.1782,6.68002 58.178,6.66369 58.177,6.64284 58.1808,6.62956 58.1797,6.62548 58.1777,6.61934 58.1548,6.59754 58.1293,6.58875 58.1237,6.57641 58.1221,6.57436 58.1179,6.56314 58.1177,6.55753 58.1143,6.563 58.1122,6.56335 58.1095,6.57454 58.1032,6.59225 58.0933,6.59519 58.0907,6.59216 58.0873,6.59736 58.0839,6.60221 58.0831,6.6091 58.09,6.61952 58.0863,6.61781 58.0828,6.62344 58.0793,6.62636 58.07,6.6315 58.067,6.64214 58.0648,6.64551 58.0689,6.6604 58.074,6.66826 58.0733,6.69114 58.0666,6.70077 58.0655,6.70707 58.0669,6.72776 58.0672,6.7283 58.0628,6.72839 58.0622,6.73163 58.0604,6.73524 58.0626,6.74745 58.0651,6.75415 58.0633,6.75739 58.065,6.7659 58.066,6.76955 58.0714,6.78069 58.0686,6.77708 58.0664,6.78433 58.0636,6.79173 58.0561,6.8013 58.0555,6.8043 58.0627,6.81874 58.0646,6.82196 58.0665,6.81756 58.0707,6.82847 58.0768,6.82684 58.0795,6.81822 58.0829,6.80858 58.0805,6.79694 58.0803,6.79508 58.0814,6.80868 58.0867,6.81021 58.0918,6.80732 58.0942,6.78845 58.0931,6.78117 58.0961,6.77076 58.0964,6.76614 58.0988,6.76093 58.1059,6.75393 58.1066,6.75114 58.0943,6.74856 58.0943,6.74494 58.0989,6.73929 58.0992,6.73505 58.102,6.73551 58.1053,6.7498 58.1094,6.75122 58.1102,6.75113 58.1145,6.75001 58.1181,6.74137 58.1275,6.73773 58.1289,6.73224 58.1278,6.72969 58.131,6.73388 58.1355,6.74419 58.136,6.7446 58.137,6.7462 58.1407,6.74345 58.1454,6.74888 58.1538,6.74099 58.165,6.74163 58.1841,6.74997 58.1901,6.75846 58.1915,6.76041 58.1898,6.75704 58.1855,6.7543 58.1694,6.76367 58.1628,6.769 58.1591,6.76276 58.1536,6.76134 58.1408,6.75938 58.1375,6.75311 58.127,6.75546 58.1178,6.75388 58.1123,6.75764 58.1096,6.7681 58.1073,6.77627 58.1007,6.78433 58.0985,6.7964 58.0987,6.80056 58.0999,6.79905 58.1017,6.79205 58.1024,6.79633 58.1062,6.78641 58.1095,6.77944 58.11,6.77838 58.1116,6.78326 58.114,6.78932 58.114,6.80374 58.1092,6.81871 58.107,6.83074 58.1076,6.84281 58.1149,6.8592 58.1152,6.86623 58.1214,6.86789 58.129,6.85785 58.1378,6.85095 58.1438,6.84157 58.1463,6.83464 58.1462,6.80947 58.1539,6.80767 58.1579,6.81367 58.1655,6.81167 58.1711,6.79985 58.1826,6.80441 58.1878,6.81254 58.1851,6.82562 58.1844,6.82483 58.1803,6.82822 58.1774,6.83466 58.1779,6.84934 58.1852,6.86627 58.1886,6.87196 58.1952,6.87662 58.196,6.87895 58.1947,6.87627 58.1882,6.86698 58.1863,6.84402 58.1757,6.84191 58.1717,6.84652 58.1655,6.85795 58.1502,6.86295 58.1484,6.87865 58.1473,6.89119 58.1438,6.89223 58.1388,6.90846 58.1297,6.91463 58.1288,6.92477 58.1307,6.93824 58.1266,6.96657 58.1248,6.97857 58.1293,6.99313 58.1305,7.03127 58.1445,7.0503 58.1371,7.04585 58.1345,7.03533 58.1357,7.03273 58.1283,7.02646 58.1265,7.00726 58.1243,6.99601 58.1207,6.97548 58.1189,6.96859 58.115,6.96211 58.115,6.95953 58.1113,6.95431 58.1115,6.9515 58.1169,6.94638 58.12,6.92528 58.1229,6.91505 58.1217,6.90907 58.1247,6.87697 58.1112,6.86299 58.1089,6.86278 58.1083,6.86142 58.1041,6.8525 58.1029,6.84933 58.1005,6.83817 58.0999,6.82769 58.0972,6.82258 58.0931,6.83125 58.0893,6.83518 58.089,6.83834 58.0914,6.84141 58.091,6.84423 58.0856,6.85074 58.0854,6.8571 58.0829,6.86518 58.0838,6.87014 58.0821,6.8882 58.0828,6.8916 58.0797,6.89945 58.079,6.90641 58.0822,6.91805 58.0824,6.90998 58.0741,6.8999 58.0717,6.90193 58.0692,6.92162 58.0706,6.92266 58.0769,6.92287 58.0782,6.93439 58.0866,6.93784 58.0938,6.944 58.0965,6.95145 58.0956,6.95628 58.1022,6.95927 58.1025,6.96089 58.0998,6.95589 58.091,6.94597 58.0872,6.93851 58.081,6.93959 58.0792,6.96018 58.0803,6.96217 58.0781,6.94677 58.0769,6.94532 58.0746,6.9478 58.0682,6.95178 58.0675,6.9388 58.0533,6.94311 58.0498,6.95519 58.0497,6.96009 58.05,6.96376 58.0502,6.9684 58.0547,6.97388 58.0558,6.9781 58.064,6.97514 58.0671,6.9796 58.0695,6.98747 58.0686,6.99336 58.0773,7.00239 58.0776,7.00887 58.0849,7.0132 58.0958,7.02474 58.0969,7.02913 58.1037,7.02862 58.108,7.03137 58.1104,7.04273 58.1131,7.04927 58.1162,7.05041 58.1213,7.05916 58.1205,7.06028 58.1145,7.05491 58.1086,7.04329 58.1027,7.04145 58.1018,7.03641 58.0931,7.01857 58.0832,7.01715 58.0769,7.01107 58.0735,7.01502 58.0656,7.0122 58.065,7.00894 58.0659,6.99532 58.0643,6.99006 58.0577,6.99454 58.0563,7.00139 58.0567,7.00473 58.0614,7.0122 58.064,7.01155 58.0584,7.00478 58.0536,6.98477 58.0477,6.9758 58.036,6.97854 58.0347,6.98351 58.0364,6.9898 58.0297,6.99688 58.0291,7.00185 58.0309,7.01468 58.0317,7.04916 58.0542,7.06313 58.0564,7.06994 58.061,7.07613 58.0559,7.08789 58.0625,7.09506 58.0714,7.1072 58.0672,7.10919 58.0687,7.10823 58.0808,7.11368 58.0784,7.12021 58.078,7.12428 58.0726,7.12927 58.078,7.1357 58.0785,7.13606 58.0781,7.13766 58.0765,7.12905 58.0686,7.13666 58.07,7.14413 58.0689,7.14143 58.066,7.1277 58.0654,7.11442 58.0569,7.10284 58.0563,7.09927 58.0498,7.09103 58.0502,7.08431 58.0486,7.04869 58.0285,7.04001 58.0179,7.03519 58.0038,7.03558 57.9936,7.03561 57.9928,7.03951 57.9851,7.04697 57.984,7.058 57.9779,7.06527 57.9784,7.07013 57.9847,7.07641 57.9863,7.09188 57.9866,7.10039 57.9912,7.10832 58.0047,7.1151 58.0095,7.11482 58.0157,7.10927 58.0265,7.11147 58.0337,7.11012 58.0404,7.12383 58.0275,7.12834 58.0294,7.13095 58.0349,7.13321 58.0397,7.13999 58.0408,7.13968 58.0321,7.14416 58.0306,7.14695 58.0364,7.15367 58.038,7.15783 58.0432,7.17381 58.043,7.18012 58.0482,7.17697 58.0532,7.18073 58.0581,7.18465 58.0578,7.1924 58.0502,7.19992 58.0486,7.1981 58.0456,7.20283 58.0419,7.20638 58.0333,7.22581 58.0329,7.22801 58.0364,7.23742 58.0372,7.24937 58.0499,7.25779 58.0479,7.25984 58.045,7.25506 58.0375,7.26221 58.0274,7.26488 58.0266,7.26853 58.0288,7.26595 58.0326,7.2719 58.0412,7.2697 58.0455,7.28109 58.0557,7.28969 58.056,7.28928 58.0518,7.28069 58.0397,7.2826 58.0301,7.29966 58.0318,7.29644 58.0376,7.29862 58.0414,7.30548 58.0338,7.31306 58.0315,7.30744 58.0277,7.31322 58.026,7.31921 58.0264,7.32192 58.0292,7.32317 58.0435,7.32327 58.0446,7.32762 58.0443,7.33026 58.0398,7.3402 58.0396,7.33639 58.0349,7.34111 58.0312,7.35734 58.0246,7.37979 58.0202,7.40763 58.0096,7.41796 58.0097,7.42363 58.013,7.42117 58.0159,7.40672 58.0141,7.40191 58.0188,7.41702 58.0186,7.41978 58.0209,7.41735 58.0236,7.38384 58.0342,7.37878 58.0417,7.37159 58.0445,7.38054 58.0454,7.39231 58.0362,7.41982 58.0287,7.42622 58.0294,7.42579 58.0369,7.41046 58.0436,7.41196 58.0462,7.43443 58.0374,7.43734 58.0343,7.42783 58.0223,7.42821 58.0187,7.43759 58.0155,7.45663 58.0229,7.4599 58.0205,7.46501 58.017,7.4758 58.0168,7.48067 58.0197,7.48537 58.0201,7.4972 58.0181,7.50083 58.0205,7.50182 58.0277,7.50559 58.0287,7.51094 58.027,7.51201 58.025,7.5002 58.01,7.5048 58.0071,7.51506 58.0079,7.51855 58.0117,7.52919 58.0129,7.5342 58.0103,7.55009 58.0107,7.57614 58.0087,7.57671 58.0088,7.58898 58.0095,7.60068 58.0131,7.60846 58.0128,7.61692 58.0101,7.62246 58.0107,7.62569 58.0128,7.61931 58.0163,7.62062 58.0205,7.61643 58.0236,7.62278 58.0377,7.61682 58.0412,7.58496 58.0408,7.57791 58.0381,7.56207 58.02,7.56003 58.0231,7.56119 58.043,7.56129 58.0447,7.5707 58.0454,7.57843 58.05,7.58247 58.0442,7.61177 58.0443,7.61974 58.0466,7.63762 58.0445,7.63997 58.0425,7.62976 58.0411,7.62443 58.0298,7.62873 58.0212,7.64418 58.0175,7.65711 58.0174,7.66699 58.0133,7.66993 58.0141,7.66686 58.019,7.65908 58.0236,7.6601 58.0264,7.67507 58.0231,7.67549 58.0241,7.67997 58.0347,7.67798 58.0374,7.66703 58.0392,7.66452 58.0428,7.65431 58.0457,7.65325 58.0477,7.65646 58.0501,7.66515 58.0494,7.67477 58.0437,7.68896 58.0441,7.6906 58.0494,7.70608 58.0498,7.69652 58.0594,7.69216 58.0687,7.66563 58.0971,7.66727 58.1024,7.68864 58.0869,7.69931 58.0838,7.70741 58.076,7.70287 58.0738,7.69392 58.0816,7.69323 58.0754,7.71303 58.0537,7.71796 58.0518,7.72057 58.0534,7.717 58.0552,7.71806 58.0572,7.72267 58.0573,7.72901 58.0555,7.72905 58.0518,7.73317 58.0506,7.74006 58.064,7.7486 58.065,7.75613 58.0629,7.75675 58.0654,7.75216 58.0683,7.76178 58.0715,7.76314 58.0663,7.77365 58.0736,7.78092 58.0743,7.78821 58.0793,7.78946 58.0752,7.78667 58.0683,7.79803 58.0713,7.80091 58.0773,7.8059 58.0793,7.80943 58.0785,7.81279 58.0749,7.81791 58.0755,7.82224 58.08,7.82585 58.0782,7.82288 58.0685,7.82656 58.0661,7.83788 58.065,7.84397 58.0737,7.85512 58.0744,7.858 58.0713,7.87691 58.072,7.881 58.0744,7.89204 58.0717,7.90357 58.0729,7.9068 58.0707,7.91837 58.0714,7.92267 58.0764,7.91951 58.0797,7.92858 58.0873,7.93682 58.101,7.93915 58.0992,7.93846 58.0877,7.94354 58.0855,7.94476 58.0849,7.94507 58.0815,7.94925 58.0782,7.9584 58.0773,7.95849 58.0857,7.96801 58.0855,7.97299 58.0877,7.97726 58.0931,7.97543 58.099,7.98614 58.0999,7.98417 58.1026,7.97896 58.1029,7.97532 58.1049,7.96942 58.113,7.96055 58.1107,7.95743 58.1118,7.96229 58.1154,7.96324 58.1193,7.97222 58.1202,7.97756 58.1281,7.97559 58.1308,7.9659 58.1328,7.96699 58.1352,7.97852 58.1366,7.9847 58.1399,7.99035 58.1396,8.00195 58.1356,8.01383 58.143,8.01713 58.1398,8.0259 58.1384,8.03293 58.142,8.03991 58.1413,8.04268 58.1441,8.03421 58.1519,8.04458 58.157,8.05094 58.1732,8.04295 58.1803,8.04715 58.1818,8.05241 58.181,8.05179 58.1881,8.04255 58.1947,8.04449 58.1973,8.05473 58.1989,8.05673 58.2008,8.05079 58.2093,8.05225 58.2123,8.04353 58.2229,8.033 58.2293,8.03883 58.2319,8.04703 58.2273,8.0558 58.2163,8.06536 58.211,8.07688 58.198,8.08319 58.1952,8.08863 58.1974,8.0974 58.2061,8.11452 58.2134,8.11702 58.2196,8.12472 58.2257,8.15843 58.2522,8.1678 58.2439,8.1536 58.2427,8.14656 58.2388,8.13539 58.2276,8.12391 58.22,8.11983 58.2121,8.09821 58.2018,8.09145 58.194,8.08099 58.1912,8.08027 58.1898,8.08701 58.1862,8.08764 58.185,8.08856 58.1832,8.08529 58.176,8.07888 58.1702,8.08535 58.1638,8.09211 58.1606,8.12694 58.1514,8.12587 58.1502,8.10863 58.1526,8.07603 58.1632,8.0713 58.1629,8.06552 58.1598,8.05796 58.1523,8.0547 58.1451,8.05592 58.141,8.06332 58.1355,8.07066 58.1404,8.07668 58.1408,8.07902 58.1388,8.07873 58.1384,8.06566 58.1186,8.06645 58.1145,8.0707 58.1153,8.09014 58.1302,8.09208 58.1277,8.08905 58.1228,8.0898 58.1192,8.10058 58.1144,8.11539 58.1129,8.11997 58.1048,8.12837 58.1075,8.13149 58.1114,8.13666 58.1116,8.13983 58.1048,8.14513 58.1033,8.15371 58.104,8.15865 58.1068,8.15664 58.1102,8.16832 58.1151,8.16778 58.1175,8.16761 58.1182,8.14552 58.1292,8.1485 58.1297,8.15879 58.1256,8.1783 58.1247,8.18684 58.1311,8.18828 58.1396,8.19773 58.1455,8.19768 58.1512,8.18904 58.1563,8.19194 58.163,8.19528 58.1644,8.21114 58.1609,8.20805 58.1565,8.2125 58.1497,8.20603 58.1496,8.20503 58.1409,8.2108 58.1442,8.213 58.1438,8.21559 58.1386,8.20901 58.1337,8.21238 58.1252,8.21647 58.1228,8.22499 58.1241,8.23254 58.1227,8.24256 58.1207,8.24582 58.123,8.24552 58.1267,8.25493 58.1278,8.25937 58.1316,8.25939 58.1366,8.25519 58.1404,8.24883 58.1389,8.24666 58.1443,8.22856 58.1489,8.23221 58.1518,8.24022 58.149,8.24537 58.1496,8.24159 58.1534,8.24082 58.1627,8.236 58.1635,8.22219 58.158,8.22041 58.1586,8.23123 58.1689,8.22888 58.1712,8.22013 58.1723,8.20744 58.1794,8.20323 58.1832,8.20512 58.1864,8.21038 58.1856,8.21748 58.1782,8.22123 58.1799,8.22814 58.1801,8.23775 58.1842,8.23916 58.1828,8.23333 58.1749,8.23911 58.173,8.24506 58.1743,8.24544 58.1697,8.25037 58.1675,8.25998 58.1664,8.26058 58.1643,8.25022 58.1641,8.24977 58.1538,8.27366 58.1578,8.27599 58.161,8.271 58.1639,8.28121 58.1659,8.28313 58.1742,8.28998 58.1803,8.28843 58.1835,8.29521 58.1854,8.30577 58.1885,8.31015 58.1931,8.30768 58.197,8.28687 58.1974,8.28765 58.1931,8.26581 58.2008,8.26829 58.2023,8.27613 58.2018,8.27327 58.2049,8.27707 58.2061,8.28295 58.203,8.28806 58.2041,8.29961 58.2004,8.30601 58.2015,8.29481 58.2063,8.29256 58.2126,8.3007 58.2137,8.30648 58.2118,8.31334 58.2126,8.32298 58.2113,8.32669 58.2081,8.34734 58.2201,8.36353 58.2295,8.35295 58.2318,8.34975 58.234,8.37382 58.2364,8.3855 58.2421,8.39129 58.2512,8.39759 58.2538,8.4042 58.2524,8.40771 58.2463,8.4166 58.2435,8.42618 58.2428,8.43295 58.245,8.43954 58.2495,8.43308 58.2601,8.43266 58.2656,8.42684 58.268,8.42056 58.2651,8.41858 58.2683,8.42875 58.2769,8.43943 58.2847,8.44097 58.2847,8.44378 58.2846,8.4448 58.2825,8.43932 58.2749,8.44144 58.2699,8.44712 58.2693,8.44593 58.2622,8.46617 58.2583,8.47781 58.2649,8.47853 58.261,8.47374 58.2557,8.47557 58.2543,8.48738 58.2587,8.50677 58.2603,8.51604 58.2639,8.52069 58.2596,8.53327 58.2654,8.53916 58.2737,8.53437 58.2798,8.53635 58.2824,8.53449 58.2839,8.52184 58.2791,8.52058 58.279,8.51538 58.2785,8.50701 58.2744,8.49798 58.2733,8.49525 58.2751,8.52566 58.286,8.51889 58.2896,8.52203 58.294,8.52093 58.2972,8.52434 58.2979,8.5306 58.2896,8.53428 58.2926,8.5289 58.3008,8.53604 58.3098,8.53492 58.3132,8.52191 58.3189,8.5168 58.3174,8.51156 58.3121,8.50676 58.3124,8.50163 58.3171,8.48597 58.3133,8.49253 58.3186,8.4884 58.3198,8.47574 58.315,8.46715 58.3137,8.44831 58.3046,8.43511 58.3013,8.4291 58.306,8.43064 58.3086,8.44455 58.3084,8.45533 58.315,8.45421 58.3182,8.46789 58.3267,8.48068 58.3243,8.5054 58.3248,8.52598 58.3341,8.53035 58.3337,8.53196 58.3297,8.52819 58.322,8.52925 58.3213,8.53323 58.3185,8.54153 58.3177,8.54519 58.3153,8.54631 58.3119,8.53727 58.2991,8.53976 58.2948,8.54692 58.292,8.55204 58.2989,8.55302 58.3092,8.56381 58.3042,8.56816 58.3041,8.58433 58.3145,8.5909 58.3256,8.59796 58.3301,8.6104 58.3443,8.61619 58.358,8.61671 58.3593,8.61923 58.3605,8.62455 58.359,8.60977 58.3349,8.61127 58.3321,8.61985 58.3337,8.61944 58.3273,8.63059 58.3293,8.63295 58.3388,8.64502 58.3401,8.65807 58.3461,8.6653 58.3545,8.67528 58.3547,8.67741 58.3678,8.68577 58.3663,8.6877 58.3636,8.69117 58.3637,8.69648 58.3686,8.69992 58.3691,8.70226 58.373,8.70276 58.373,8.71274 58.3723,8.72426 58.3819,8.72593 58.3893,8.73229 58.3917,8.73087 58.3933,8.71154 58.3897,8.70789 58.3921,8.71219 58.3991,8.71102 58.4034,8.7219 58.4098,8.72274 58.4164,8.728 58.4223,8.72097 58.4295,8.71482 58.4302,8.71385 58.4316,8.72862 58.4385,8.74573 58.4432,8.76295 58.4527,8.76645 58.4538,8.79964 58.4645,8.8029 58.468,8.81984 58.469,8.8296 58.4731,8.83947 58.4822,8.84513 58.4823,8.84713 58.4851,8.85324 58.4849,8.86116 58.4906,8.8677 58.4907,8.86132 58.4949,8.86363 58.4995,8.86577 58.5003,8.87238 58.4926,8.88854 58.4991,8.88861 58.5048,8.88582 58.5075,8.89828 58.5173,8.89726 58.5196,8.89301 58.5205,8.88929 58.5213,8.89217 58.5241,8.91667 58.5302,8.9237 58.5365,8.92653 58.5331,8.94293 58.5432,8.94995 58.5429,8.96336 58.552,8.96821 58.5583,8.96917 58.564,8.96102 58.5685,8.96551 58.5736,8.96356 58.5768,8.97082 58.5867,8.97138 58.5918,8.96679 58.5951,8.96063 58.5957,8.95172 58.5912,8.94217 58.583,8.94021 58.5864,8.94545 58.6005,8.93777 58.6111,8.94002 58.6171,8.94521 58.6181,8.95232 58.6235,8.95472 58.6201,8.94662 58.6097,8.9515 58.6086,8.95615 58.6043,8.96932 58.6036,8.9734 58.6014,8.97712 58.5909,8.98454 58.5913,8.99101 58.5857,8.99721 58.5844,9.00406 58.5939,9.00964 58.5958,9.00981 58.6002,9.01395 58.6057,9.01507 58.6071,9.01345 58.6121,9.02258 58.6132,9.02703 58.6192,9.03361 58.6191,9.03444 58.6127,9.04168 58.616,9.04801 58.6127,9.05663 58.6149,9.0589 58.6209,9.06229 58.6228,9.0678 58.6185,9.0772 58.6225,9.07833 58.6255,9.0969 58.6302,9.1027 58.6358,9.11618 58.6376,9.12207 58.6418,9.13036 58.6424,9.14201 58.6455,9.14148 58.6471,9.12776 58.6494,9.12541 58.6521,9.1371 58.6557,9.14609 58.6584,9.15098 58.6649,9.15419 58.6624,9.16589 58.6649,9.17074 58.6645,9.17845 58.6598,9.17688 58.6566,9.17918 58.6548,9.18532 58.6546,9.19484 58.6646,9.20453 58.6638,9.20754 58.665,9.20784 58.6676,9.20241 58.6704,9.20276 58.6721,9.20932 58.6724,9.21273 58.6743,9.21506 58.6796,9.22298 58.6792,9.22546 58.682,9.2294 58.6821,9.23102 58.6846,9.22509 58.6886,9.209 58.6939,9.17999 58.6948,9.16762 58.6942,9.1441 58.6931,9.12412 58.6896,9.11358 58.6897,9.06889 58.6812,9.05162 58.6766,9.02626 58.6753,9.00081 58.6682,8.99742 58.6734,8.98874 58.6719,8.9856 58.673,9.01202 58.6858,9.01481 58.6831,9.00948 58.6771,9.01217 58.6762,9.03209 58.6804,9.05008 58.6802,9.07171 58.6854,9.1005 58.6957,9.12008 58.6987,9.12773 58.6954,9.15125 58.6985,9.16189 58.6966,9.18007 58.7002,9.2053 58.7053,9.21449 58.7059,9.21856 58.7036,9.22777 58.7038,9.23783 58.7124,9.24641 58.7242,9.24496 58.7267,9.2401 58.7271,9.21703 58.7233,9.21118 58.7259,9.21408 58.729,9.22584 58.7307,9.23527 58.735,9.233 58.7363,9.16287 58.7351,9.15488 58.7349,9.14032 58.7359,9.1158 58.7419,9.10396 58.7415,9.0993 58.7387,9.11204 58.7311,9.12226 58.7292,9.13231 58.73,9.14082 58.7272,9.15533 58.7269,9.16222 58.7218,9.16945 58.7258,9.19544 58.7246,9.20394 58.7217,9.19999 58.7139,9.19069 58.7153,9.18776 58.7206,9.17764 58.7209,9.17471 58.7202,9.1629 58.7174,9.15148 58.7175,9.14256 58.7199,9.12941 58.7195,9.12141 58.7212,9.11549 58.7247,9.10771 58.7226,9.06436 58.7276,9.08293 58.7405,9.06792 58.7489,9.07147 58.7559,9.07582 58.7566,9.08033 58.7546,9.07933 58.7493,9.08162 58.7478,9.09757 58.7455,9.10272 58.7476,9.11144 58.7471,9.11199 58.7471,9.11495 58.749,9.12963 58.746,9.13609 58.7406,9.13832 58.741,9.1461 58.7424,9.15947 58.7391,9.16961 58.7386,9.17651 58.7408,9.17712 58.7456,9.18804 58.7469,9.19135 58.7426,9.20776 58.7479,9.21274 58.7452,9.22652 58.7424,9.24283 58.7415,9.24958 58.7466,9.25618 58.7465,9.26568 58.7414,9.27498 58.7401,9.28902 58.7406,9.31254 58.7446,9.31804 58.7485,9.32975 58.7514,9.33657 58.7556,9.34581 58.7555,9.3539 58.752,9.3552 58.7609,9.36254 58.7635,9.36703 58.7705,9.37233 58.7699,9.37387 58.7742,9.38038 58.7759,9.38538 58.7815,9.39104 58.7827,9.3873 58.787,9.40516 58.7906,9.42754 58.8008,9.43931 58.803,9.43553 58.8084,9.42282 58.8071,9.41124 58.801,9.39408 58.8008,9.38119 58.7972,9.37933 58.7967,9.37574 58.798,9.37655 58.7994,9.38861 58.8046,9.39868 58.8057,9.40209 58.808,9.39833 58.8128,9.40082 58.8158,9.44761 58.8225,9.4615 58.8266,9.46565 58.8319,9.45955 58.8396,9.45422 58.8405,9.44822 58.8461,9.42113 58.8501,9.40041 58.8503,9.37476 58.8463,9.35755 58.8436,9.3328 58.8366,9.32091 58.8364,9.31152 58.839,9.29796 58.837,9.2891 58.838,9.29271 58.8447,9.29934 58.8444,9.30314 58.8474,9.29764 58.8514,9.30229 58.8551,9.30031 58.8592,9.3078 58.8676,9.31002 58.8756,9.30023 58.8856,9.30189 58.8876,9.31585 58.8823,9.32157 58.8742,9.32438 58.8727,9.33564 58.8666,9.35547 58.8669,9.36315 58.8633,9.40979 58.8653,9.41939 58.8675,9.42184 58.8714,9.41844 58.8778,9.40941 58.8818,9.42355 58.8815,9.42692 58.8934,9.42489 58.8989,9.42171 58.9007,9.41325 58.9022,9.39633 58.8962,9.39445 58.8898,9.38852 58.8849,9.37542 58.8822,9.37436 58.8856,9.37575 58.893,9.39499 58.9054,9.42586 58.906,9.4296 58.9017,9.4405 58.9046,9.44322 58.9032,9.44076 58.8993,9.44928 58.8967,9.45167 58.8928,9.4593 58.8879,9.45495 58.8804,9.44471 58.8817,9.44294 58.8798,9.44498 58.8754,9.44388 58.8651,9.47155 58.8672,9.47498 58.8735,9.47433 58.8765,9.47402 58.878,9.46385 58.8886,9.46874 58.8958,9.46688 58.8978,9.45847 58.8982,9.46137 58.9021,9.46741 58.9052,9.46937 58.9102,9.47709 58.9057,9.48262 58.9102,9.4811 58.9143,9.48324 58.9156,9.50447 58.9211,9.51156 58.9215,9.513 58.924,9.51104 58.9266,9.50508 58.9288,9.49026 58.9287,9.48236 58.9255,9.47898 58.9324,9.47183 58.9334,9.46922 58.9366,9.47503 58.9381,9.48403 58.9372,9.49621 58.9345,9.50742 58.932,9.51121 58.93,9.53954 58.9301,9.54579 58.9288,9.56559 58.9304,9.57684 58.9259,9.58255 58.9267,9.58664 58.924,9.62898 58.9357,9.63623 58.9417,9.63435 58.9442,9.62509 58.9439,9.62271 58.9377,9.60941 58.9387,9.6057 58.9324,9.59893 58.9358,9.59652 58.9404,9.59762 58.9454,9.59857 58.9455,9.6082 58.946,9.61852 58.9525,9.62269 58.9482,9.6311 58.9478,9.63544 58.9497,9.63345 58.9547,9.64429 58.9597,9.6545 58.9589,9.65651 58.9635,9.66087 58.9649,9.65944 58.9674,9.65453 58.9685,9.66006 58.9736,9.66914 58.9679,9.68882 58.9734,9.69283 58.9725,9.69577 58.9657,9.70055 58.9678,9.70768 58.9773,9.70489 58.9804,9.69296 58.9801,9.69068 58.9817,9.6923 58.9853,9.69707 58.9877,9.70367 58.9879,9.71254 58.9881,9.71504 58.992,9.71396 58.9966,9.70033 59.0051,9.7011 59.0079,9.7059 59.0095,9.71761 59.0046,9.72723 59.0077,9.73831 58.9966,9.74407 58.9962,9.75313 58.991,9.75221 59.0031,9.74881 59.0107,9.74184 59.0186,9.72219 59.0335,9.70394 59.0424,9.69007 59.0492,9.66342 59.0502,9.65509 59.0481,9.6484 59.0489,9.64304 59.0526,9.63431 59.0539,9.63554 59.0567,9.64614 59.0588,9.64074 59.0621,9.63095 59.0627,9.62597 59.0651,9.62666 59.0798,9.62031 59.0829,9.6123 59.0833,9.58749 59.1022,9.58296 59.104,9.56563 59.1043,9.55882 59.1076,9.55331 59.1114,9.55802 59.1154,9.55116 59.1196,9.52782 59.1246,9.51816 59.1222,9.51443 59.1258,9.51787 59.1284,9.53836 59.1298,9.56112 59.1253,9.57917 59.1191,9.58761 59.1192,9.58205 59.1241,9.59838 59.1251,9.60923 59.1224,9.61703 59.117,9.62865 59.1153,9.64303 59.1013,9.63793 59.0859,9.64256 59.0767,9.64424 59.0734,9.65123 59.0657,9.6658 59.0569,9.68761 59.0548,9.69304 59.0522,9.69965 59.0531,9.70204 59.0598,9.69364 59.0698,9.69343 59.0746,9.69937 59.0813,9.69514 59.0975,9.70113 59.1028,9.70271 59.1074,9.7075 59.1097,9.71375 59.1091,9.71712 59.1027,9.70963 59.0905,9.71526 59.0725,9.72403 59.0642,9.73162 59.0738,9.73652 59.0732,9.75305 59.0594,9.75708 59.0586,9.7628 59.0485,9.76871 59.0447,9.77315 59.0445,9.77534 59.0565,9.78128 59.0631,9.78392 59.0751,9.79119 59.082,9.78884 59.0854,9.79394 59.0912,9.7967 59.0887,9.79262 59.0795,9.80211 59.0636,9.80074 59.053,9.80656 59.0403,9.81454 59.0401,9.82006 59.0349,9.82271 59.0352,9.8339 59.044,9.83787 59.0445,9.84243 59.0173,9.84444 59.0172,9.85263 59.017,9.85526 58.9939,9.85099 58.9897,9.84441 58.988,9.84238 58.9832,9.83715 58.9811,9.83376 58.9772,9.82015 58.9745,9.82021 58.9729,9.83455 58.9681,9.84744 58.9661,9.84858 58.9595,9.85872 58.9603,9.8586 58.9635,9.86423 58.9665,9.86321 58.9704,9.86573 58.9741,9.87232 58.9753,9.88744 58.9731,9.89024 58.9688,9.904 58.9676,9.90486 58.9692,9.90649 58.9722,9.918 58.9718,9.91998 58.9782,9.92262 58.9787,9.92833 58.9673,9.93262 58.971,9.93572 58.9708,9.94033 58.9656,9.95308 58.9678,9.96118 58.9635,9.97352 58.965,9.97567 58.9666,9.96912 58.9773,9.97241 58.9846,9.97591 58.9858,9.97948 58.9852,9.98187 58.9797,9.98586 58.9795,9.9838 58.9747,9.98836 58.9706,9.99316 58.9727,10 58.9731,10.0055 58.9735,10.012 58.9788,10.0267 58.9776,10.035 58.9769,10.039 58.9781,10.0411 58.9806,10.0343 58.987,10.0351 58.9891,10.0466 58.9905,10.0537 58.9876,10.0598 58.9927,10.0584 58.995,10.0486 58.9956,10.048 59.0011,10.0408 59.0051,10.045 59.0104,10.0382 59.0181,10.0323 59.0204,10.0277 59.0254,10.0328 59.033,10.0314 59.0371,10.0237 59.0411,10.0222 59.0448,10.0244 59.0473,10.0319 59.0471,10.0463 59.0413,10.0526 59.0368,10.0611 59.0346,10.0688 59.0284,10.075 59.0294,10.0757 59.0212,10.079 59.0164,10.0836 59.0161,10.1145 59.0242,10.1219 59.0289,10.1239 59.0335,10.1408 59.04,10.1609 59.0517,10.1717 59.0509,10.1755 59.0485,10.1778 59.0396,10.1741 59.0352,10.1452 59.0252,10.1386 59.0248,10.137 59.0218,10.1395 59.0107,10.1403 59.0074,10.1568 59.0092,10.1668 59.0072,10.1804 59.0139,10.1857 59.019,10.1894 59.0199,10.2011 59.0183,10.201 59.0236,10.2051 59.0254,10.2134 59.0236,10.2178 59.0259,10.2176 59.0309,10.2211 59.0334,10.2256 59.0312,10.23 59.0321,10.2342 59.0399,10.2334 59.0564,10.2399 59.0615,10.2272 59.0699,10.2211 59.0682,10.2165 59.0718,10.2195 59.0769,10.2338 59.0975,10.2306 59.1204,10.2326 59.1231,10.2392 59.1238,10.243 59.1226,10.2359 59.112,10.2414 59.1047,10.2421 59.096,10.2509 59.0997,10.2585 59.0966,10.2653 59.0744,10.257 59.0662,10.2591 59.0646,10.2607 59.0634,10.2637 59.0474,10.2687 59.042,10.2768 59.04,10.2863 59.0487,10.2762 59.0615,10.2823 59.067,10.2838 59.0789,10.2775 59.0816,10.2767 59.0965,10.263 59.1106,10.2654 59.1216,10.2716 59.1209,10.2792 59.1159,10.2856 59.1116,10.2901 59.0934,10.2977 59.0923,10.2956 59.0852,10.3008 59.074,10.3085 59.0649,10.3042 59.06,10.3074 59.0575,10.3126 59.0599,10.3164 59.0709,10.3091 59.0788,10.3165 59.0857,10.3163 59.0905,10.3071 59.1067,10.3 59.1136,10.2994 59.1142,10.3006 59.1177,10.2888 59.1283,10.2899 59.1375,10.3059 59.1358,10.3087 59.1326,10.3148 59.1358,10.3179 59.1356,10.3203 59.1281,10.3314 59.1284,10.3327 59.1325,10.3294 59.1393,10.3227 59.142,10.3159 59.1482,10.3337 59.165,10.3318 59.1689,10.3325 59.1696,10.3362 59.1735,10.3343 59.1787,10.3372 59.1854,10.3322 59.1915,10.3413 59.2019,10.3438 59.2085,10.341 59.2147,10.345 59.2177,10.3589 59.2127,10.3782 59.2231,10.3784 59.2355,10.3716 59.2432,10.381 59.2593,10.3813 59.2657,10.3749 59.2723,10.3794 59.2741,10.3879 59.2721,10.3985 59.2747,10.4028 59.2637,10.3899 59.2616,10.3887 59.2531,10.3844 59.246,10.3874 59.2344,10.3869 59.2311,10.3858 59.2243,10.3688 59.2068,10.3664 59.1924,10.3622 59.1846,10.3664 59.1741,10.3773 59.1623,10.3817 59.1615,10.3923 59.1722,10.4021 59.1688,10.4209 59.1661,10.4312 59.1612,10.4383 59.1626,10.4505 59.172,10.4555 59.1693,10.4524 59.1656,10.4575 59.1583,10.4626 59.1684,10.455 59.172,10.458 59.1773,10.4659 59.1801,10.465 59.1851,10.468 59.1886,10.4539 59.2029,10.459 59.2151,10.4519 59.2213,10.4442 59.2241,10.4355 59.236,10.431 59.2376,10.4326 59.2426,10.4263 59.2478,10.4256 59.2597,10.4305 59.2611,10.4344 59.2675,10.4507 59.2516,10.449 59.2489,10.4513 59.2452,10.4597 59.2423,10.4669 59.2464,10.478 59.246,10.4836 59.2577,10.4885 59.26,10.5011 59.2525,10.5047 59.2535,10.5051 59.2558,10.496 59.2646,10.4954 59.2694,10.5012 59.2727,10.5014 59.283,10.5067 59.2873,10.5218 59.2911,10.5231 59.2929,10.5222 59.2981,10.5248 59.3024,10.5291 59.3094,10.5277 59.3144,10.5218 59.3192,10.5146 59.3198,10.5044 59.3177,10.4997 59.3278,10.4761 59.3503,10.4691 59.3631,10.4704 59.3681,10.4831 59.3785,10.4947 59.4083,10.4963 59.4094,10.5048 59.4154,10.5036 59.4326,10.4872 59.4259,10.4922 59.4218,10.49 59.4195,10.4828 59.4197,10.4688 59.4249,10.4664 59.4315,10.4623 59.4349,10.4465 59.4405,10.4474 59.4431,10.4612 59.4447,10.4571 59.4486,10.4513 59.4502,10.4414 59.4487,10.4358 59.4403,10.4173 59.4429,10.4123 59.4491,10.4091 59.4482,10.406 59.4474,10.3977 59.4387,10.3923 59.4375,10.3699 59.4573,10.3632 59.4767,10.3583 59.4774,10.353 59.4705,10.3472 59.4709,10.3356 59.485,10.3229 59.4934,10.3133 59.4972,10.2971 59.5194,10.2887 59.5309,10.278 59.5281,10.2698 59.5306,10.2599 59.5481,10.25 59.5513,10.2498 59.5579,10.2425 59.5627,10.2396 59.5682,10.2422 59.5739,10.248 59.5764,10.2544 59.5714,10.2596 59.5623,10.2623 59.5607,10.2736 59.5613,10.2841 59.5517,10.2919 59.5488,10.2988 59.5418,10.3106 59.5375,10.3458 59.5313,10.3552 59.532,10.363 59.527,10.3773 59.5287,10.3899 59.5281,10.3943 59.5327,10.3929 59.5382,10.3964 59.5398,10.4009 59.5479,10.4068 59.5586,10.4135 59.5598,10.4139 59.5641,10.4048 59.5666,10.4025 59.5714,10.4045 59.5828,10.4207 59.6035,10.4212 59.622,10.3942 59.6641,10.3876 59.6742,10.3716 59.6854,10.3524 59.6933,10.3293 59.6963,10.287 59.7091,10.2801 59.7141,10.2734 59.726,10.2523 59.7328,10.2229 59.7373,10.2165 59.7414,10.235 59.7424,10.2436 59.7443,10.2552 59.7506,10.271 59.7516,10.2752 59.7477,10.2819 59.7489,10.2882 59.7524,10.3139 59.7237,10.3425 59.7147,10.3674 59.7127,10.3786 59.714,10.396 59.7011,10.4026 59.6903,10.4103 59.692,10.4286 59.6809,10.4331 59.6832,10.4376 59.6827,10.4385 59.6751,10.4387 59.6734,10.4469 59.6693,10.4439 59.6603,10.4454 59.6553,10.44 59.6532,10.4387 59.6496,10.4411 59.6445,10.4394 59.6372,10.4432 59.6304,10.4482 59.6267,10.4478 59.6235,10.4447 59.6217,10.4294 59.6186,10.4263 59.6154,10.4282 59.6134,10.4395 59.6123,10.4454 59.6098,10.4469 59.6029,10.441 59.5807,10.4329 59.5674,10.4136 59.5358,10.4224 59.5216,10.4301 59.521,10.4355 59.5185,10.4472 59.5179,10.4512 59.5204,10.4557 59.5197,10.4594 59.5168,10.4738 59.5161,10.4786 59.5203,10.4916 59.5219,10.4971 59.5183,10.5078 59.5243,10.5142 59.5163,10.5213 59.5248,10.5262 59.5276,10.5293 59.5283,10.5365 59.5299,10.5642 59.5353,10.5955 59.5498,10.6075 59.5572,10.6217 59.5689,10.6244 59.5735,10.6279 59.5765,10.6317 59.5952,10.6187 59.6242,10.6199 59.635,10.6099 59.6686,10.6062 59.6702,10.5931 59.6706,10.5937 59.6667,10.5874 59.6655,10.5837 59.6671,10.5813 59.6749,10.5776 59.676,10.5641 59.6801,10.55 59.6869,10.5451 59.6823,10.536 59.6868,10.5312 59.6989,10.5329 59.7065,10.5311 59.7079,10.5333 59.7095,10.5298 59.7316,10.5229 59.7382,10.5249 59.7504,10.5233 59.7641,10.5176 59.7619,10.5191 59.7563,10.5133 59.754,10.511 59.7675,10.515 59.7748,10.5088 59.7881,10.5121 59.805,10.5058 59.8056,10.4896 59.822,10.49 59.8248,10.5048 59.8345,10.5161 59.8391,10.5142 59.8411,10.5088 59.8413,10.4862 59.8362,10.4839 59.838,10.5027 59.8475,10.5039 59.8589,10.5134 59.8594,10.517 59.8622,10.5151 59.8649,10.5176 59.8768,10.5351 59.8886,10.5378 59.8906,10.5614 59.8923,10.5656 59.8892,10.576 59.8897,10.6117 59.9019,10.6145 59.9015,10.6136 59.8992,10.6064 59.8964,10.6133 59.8889,10.6091 59.8849,10.6107 59.878,10.6265 59.8786,10.6323 59.8807,10.6383 59.8887,10.6391 59.8958,10.644 59.9034,10.6481 59.9045,10.6534 59.9112,10.6716 59.9156,10.677 59.9147,10.6739 59.9113,10.6785 59.9053,10.6749 59.9007,10.6878 59.8951,10.6973 59.8962,10.7095 59.904,10.704 59.9075,10.7002 59.9148,10.7057 59.9146,10.7208 59.9066,10.7426 59.9078,10.749 59.9026,10.7531 59.903,10.7608 59.9083,10.7627 59.9033,10.7605 59.8882,10.7706 59.8877,10.7733 59.8848,10.7679 59.8774,10.7725 59.8768,10.7793 59.8782,10.7861 59.8768,10.788 59.8743,10.7908 59.8635,10.7868 59.8519,10.7919 59.8468,10.781 59.8452,10.7766 59.8333,10.7716 59.8285,10.7537 59.8124,10.7439 59.7944,10.7409 59.7774,10.7424 59.766,10.7385 59.7548,10.7344 59.7529,10.7359 59.7413,10.747 59.7205,10.7466 59.7116,10.7435 59.7125,10.7393 59.7216,10.7348 59.722,10.728 59.7179,10.7266 59.7227,10.7329 59.7294,10.7258 59.7543,10.7208 59.7572,10.7296 59.7744,10.7205 59.7835,10.7163 59.7934,10.7084 59.8206,10.7006 59.8478,10.6965 59.8528,10.6874 59.8557,10.6791 59.8653,10.6663 59.8714,10.6631 59.8705,10.6601 59.8582,10.6508 59.8401,10.6427 59.8339,10.6365 59.8229,10.6239 59.8178,10.6186 59.8102,10.6128 59.802,10.6147 59.7958,10.6013 59.7832,10.5885 59.763,10.5914 59.7493,10.5893 59.741,10.5976 59.7319,10.5955 59.7207,10.5983 59.7159,10.6088 59.7091,10.6155 59.6912,10.6163 59.689,10.6228 59.6817,10.6295 59.686,10.637 59.6987,10.6537 59.7049,10.6442 59.6967,10.6354 59.6838,10.6359 59.6787,10.6301 59.6744,10.645 59.6438,10.6542 59.6324,10.6584 59.6237,10.663 59.6146,10.6604 59.6056,10.6646 59.5972,10.6652 59.5846,10.658 59.5809,10.6561 59.5564,10.6699 59.5364,10.6659 59.5311,10.6737 59.5204,10.6795 59.5211,10.6907 59.5261,10.6957 59.5261,10.6948 59.5202,10.6873 59.5101,10.687 59.5039,10.6893 59.4984,10.688 59.4909,10.6949 59.4804,10.6936 59.4756,10.6851 59.4698,10.6773 59.4492,10.6703 59.4385,10.66 59.438,10.6625 59.4517,10.6602 59.4599,10.6709 59.4609,10.6706 59.4621,10.6681 59.4723,10.6716 59.478,10.6805 59.4836,10.6704 59.4954,10.6699 59.5018,10.6546 59.5054,10.6515 59.5013,10.6579 59.4929,10.6539 59.4871,10.6468 59.4844,10.6473 59.4816,10.6392 59.4825,10.6356 59.4804,10.6335 59.474,10.6426 59.4667,10.6421 59.464,10.6239 59.4539,10.6197 59.4452,10.6142 59.4408,10.5932 59.4352,10.592 59.4295,10.6012 59.4158,10.6115 59.4158,10.6288 59.4239,10.6338 59.4184,10.6414 59.4194,10.6557 59.427,10.6615 59.4268,10.666 59.4224,10.6561 59.3954,10.6598 59.3805,10.6573 59.3728,10.6618 59.3687,10.668 59.3742,10.6709 59.357,10.6763 59.3575,10.6764 59.3543,10.6666 59.3502,10.6677 59.3316,10.6768 59.3177,10.6884 59.3209,10.6893 59.3182,10.6845 59.3141,10.6886 59.3024,10.6971 59.3024,10.7033 59.3112,10.7083 59.3144,10.7219 59.3233,10.725 59.3272,10.7374 59.333,10.7427 59.3394,10.7552 59.3383,10.7527 59.3284,10.7603 59.325,10.7577 59.3134,10.769 59.3033,10.7859 59.3141,10.8037 59.3174,10.8088 59.3197,10.8126 59.3195,10.8121 59.3173,10.7845 59.3053,10.7496 59.2829,10.7523 59.2767,10.7497 59.2731,10.753 59.2582,10.7494 59.255,10.7454 59.2598,10.7418 59.2586,10.7361 59.2515,10.7393 59.2454,10.7391 59.2273,10.7452 59.2266,10.7424 59.2196,10.7481 59.2198,10.7515 59.222,10.756 59.229,10.7627 59.2328,10.7653 59.2342,10.794 59.259,10.7967 59.256,10.7861 59.2482,10.7706 59.232,10.7716 59.2269,10.7891 59.2135,10.7985 59.2089,10.8035 59.2016,10.8026 59.1975,10.7956 59.1906,10.7996 59.1867,10.8058 59.1854,10.808 59.192,10.8133 59.192,10.8178 59.19,10.8165 59.187,10.8197 59.1831,10.829 59.1841,10.8295 59.182,10.825 59.1802,10.8237 59.1774,10.8268 59.1751,10.8255 59.1717,10.8327 59.1671,10.8301 59.163,10.8306 59.1525,10.8408 59.155,10.8381 59.1578,10.8398 59.1626,10.8443 59.1619,10.8514 59.1679,10.8572 59.1665,10.8642 59.1715,10.8619 59.1807,10.8659 59.1843,10.8695 59.1777,10.8731 59.1754,10.8784 59.1754,10.8878 59.1757,10.8962 59.1771,10.9064 59.184,10.9087 59.1821,10.9034 59.1759,10.9074 59.1679,10.9145 59.1645,10.9212 59.1636,10.9062 59.1547,10.9174 59.1414,10.9178 59.1339,10.9228 59.1277,10.9321 59.1325,10.9396 59.1298,10.9532 59.139,10.9547 59.1362,10.9481 59.1289,10.9526 59.1238,10.9579 59.1271,10.9614 59.1332,10.96 59.1394,10.954 59.139,10.9533 59.1474,10.9502 59.1543,10.9551 59.1572,10.9572 59.1666,10.9519 59.1689,10.9554 59.1744,10.9607 59.1753,10.956 59.1768,10.9651 59.1763,10.9705 59.1769,10.9838 59.1849,10.9945 59.1843,10.9972 59.1788,11.003 59.1788,11.0146 59.1838,11.023 59.1822,11.0141 59.1779,11.0101 59.1719,11.0142 59.1646,11.0199 59.1644,11.0186 59.1571,11.0218 59.1509,11.0249 59.1497,11.0289 59.1564,11.0351 59.1589,11.0386 59.1582,11.0333 59.1447,11.0347 59.1404,11.0285 59.1324,11.0307 59.1298,11.0372 59.1326,11.0409 59.1342,11.0578 59.1363,11.0676 59.1392,11.0689 59.1253,11.0747 59.1257,11.0818 59.1278,11.092 59.1342,11.1014 59.1349,11.1036 59.1379,11.1018 59.1434,11.1045 59.1461,11.0996 59.1589,11.096 59.1617,11.0996 59.1665,11.0911 59.1731,11.0889 59.1774,11.0817 59.1818,11.0844 59.1857,11.0902 59.1852,11.1022 59.1806,11.1036 59.1742,11.1056 59.1731,11.1098 59.1706,11.1173 59.1486,11.1222 59.1486,11.1382 59.1571,11.1569 59.1591,11.1623 59.1619,11.1636 59.1689,11.1569 59.1861,11.1463 59.1911,11.144 59.1939,11.1467 59.1953,11.1538 59.1948,11.1805 59.1861,11.1814 59.1943,11.1859 59.1957,11.1865 59.1914,11.1885 59.1772,11.1805 59.1687,11.1796 59.1641,11.172 59.1586,11.1938 59.1495,11.2027 59.1499,11.2138 59.1449,11.2058 59.141,11.2044 59.1351,11.1938 59.1314,11.1978 59.1442,11.1778 59.1449,11.1725 59.1417,11.1747 59.1383,11.1689 59.1344,11.1707 59.1285,11.1742 59.1282,11.1764 59.125,11.18 59.1248,11.1826 59.1191,11.2031 59.1202,11.2129 59.1314,11.2244 59.1369,11.2267 59.1343,11.2148 59.1249,11.2137 59.1241,11.1977 59.0982,11.1995 59.095,11.2132 59.1069,11.2172 59.1042,11.2154 59.098,11.2088 59.0934,11.208 59.0904,11.2079 59.0898,11.2077 59.0866,11.2118 59.0869,11.2345 59.088,11.2541 59.0908,11.2742 59.0926,11.293 59.0949,11.306 59.0991,11.3164 59.1024,11.3258 59.1042,11.3356 59.1059,11.345 59.106,11.356 59.1043,11.3608 59.1013,11.3673 59.0982,11.3725 59.0943,11.3767 59.0894,11.3796 59.0853,11.386 59.0779,11.3879 59.0703,11.3916 59.0638,11.3988 59.0567,11.4054 59.0458,11.4213 59.0338,11.4346 59.0224,11.4435 59.015,11.4546 59.0057,11.4632 59.0001,11.4715 58.9963,11.4718 58.9934,11.4597 58.8929,11.4733 58.8909,11.4777 58.8906,11.4886 58.8879,11.4982 58.8855,11.5057 58.8841,11.5135 58.8819,11.5187 58.8793,11.5341 58.8784,11.5421 58.8786,11.5465 58.879,11.5506 58.8819,11.5512 58.8858,11.5502 58.8908,11.5489 58.8929,11.5499 58.8954,11.5522 58.897,11.5571 58.8969,11.5613 58.8936,11.563 58.8906,11.5663 58.8869,11.5725 58.8862,11.5765 58.8868,11.5783 58.8886,11.5828 58.8899,11.5881 58.8896,11.6073 58.893,11.6131 58.8945,11.6199 58.8983,11.6249 58.901,11.6334 58.9032,11.6414 58.904,11.6476 58.9046,11.6569 58.9047,11.6552 58.907,11.6549 58.9095,11.6546 58.9118,11.6556 58.915,11.6589 58.9184,11.6631 58.9225,11.6673 58.9272,11.6752 58.9333,11.6872 58.9441,11.6889 58.9507,11.6938 58.9605,11.6933 58.9765,11.6942 58.9847,11.7009 58.9945,11.7078 59.0078,11.7109 59.0149,11.7172 59.0267,11.722 59.0324,11.7262 59.0357,11.7332 59.0434,11.7416 59.0499,11.7509 59.0585,11.7591 59.0698,11.7797 59.0892,11.7807 59.0924,11.7827 59.0967,11.7825 59.1001,11.7826 59.1031,11.7763 59.1084,11.7708 59.1147,11.7697 59.1186,11.7711 59.1204,11.7744 59.1231,11.7799 59.1267,11.7832 59.1296,11.7857 59.1346,11.7864 59.1383,11.7861 59.1424,11.7855 59.1474,11.7841 59.1536,11.7816 59.1575,11.7836 59.1692,11.7852 59.174,11.7882 59.1799,11.7913 59.1871,11.7929 59.1926,11.7916 59.2006,11.7928 59.2068,11.7954 59.2122,11.8001 59.2179,11.8084 59.2221,11.8158 59.2275,11.8228 59.232,11.8284 59.236,11.8318 59.2421,11.8317 59.2481,11.8317 59.2549,11.832 59.2678,11.8304 59.2877,11.8302 59.3076,11.8325 59.3165,11.8303 59.3245,11.828 59.3319,11.823 59.3384,11.8193 59.3444,11.8152 59.3511,11.7941 59.3816,11.7824 59.398,11.7814 59.4035,11.7829 59.4071,11.7835 59.4094,11.7827 59.4108,11.781 59.4126,11.7758 59.4159,11.7702 59.4201,11.7668 59.424,11.7653 59.4293,11.7631 59.4381,11.7674 59.4581,11.7685 59.4625,11.7661 59.4675,11.7659 59.4716,11.7643 59.4758,11.76 59.48,11.7558 59.4848,11.7421 59.4974,11.7317 59.5122,11.7182 59.5373,11.7121 59.5504,11.7073 59.561,11.7031 59.5759,11.7004 59.5833,11.6995 59.5918,11.7035 59.6006,11.7047 59.6047,11.708 59.6084,11.7109 59.6122,11.7166 59.6176,11.7214 59.6226,11.7284 59.6268,11.7345 59.6304,11.7432 59.6337,11.7548 59.6379,11.7626 59.6403,11.7857 59.6413,11.8174 59.6439,11.8379 59.6463,11.8594 59.6508,11.8663 59.6539,11.8692 59.6561,11.8721 59.6597,11.8741 59.6636,11.8761 59.6668,11.8791 59.6706,11.8875 59.6831,11.8928 59.688,11.8993 59.6918,11.9075 59.6926,11.9144 59.6934,11.9231 59.6953,11.929 59.6962,11.9348 59.6954,11.9417 59.6969,11.9432 59.6994,11.9433 59.7012,11.9427 59.7053,11.9398 59.7097,11.9371 59.7178,11.9335 59.7329,11.9312 59.7481,11.9341 59.7505,11.9392 59.7518,11.9456 59.7531,11.9463 59.757,11.9422 59.763,11.9381 59.7668,11.9383 59.7714,11.9434 59.7787,11.9351 59.7888,11.9335 59.7979,11.9005 59.824,11.8929 59.8266,11.8757 59.8269,11.8717 59.83,11.8695 59.8311,11.8624 59.8333,11.8548 59.8366,11.8486 59.839,11.8507 59.8429,11.8536 59.8474,11.8592 59.8498,11.8672 59.8534,11.8752 59.8576,11.885 59.8634,11.8866 59.8661,11.8863 59.87,11.8854 59.8734,11.8848 59.8753,11.8868 59.8782,11.8896 59.8791,11.8974 59.8792,11.9037 59.8789,11.9118 59.8781,11.9189 59.8814,11.9279 59.8872,11.9438 59.8954,11.9537 59.901,11.9658 59.9049,11.9781 59.9043,11.9867 59.9035,11.993 59.902,11.9996 59.8991,12.0099 59.896,12.0193 59.8945,12.0306 59.8925,12.0427 59.8897,12.0485 59.8885,12.0562 59.8881,12.0741 59.8895,12.1025 59.892,12.1221 59.8964,12.1377 59.8978,12.1768 59.8932,12.1839 59.8977,12.1937 59.9021,12.2041 59.9067,12.2157 59.9163,12.2325 59.9288,12.2493 59.9354,12.2635 59.9425,12.2799 59.9479,12.2915 59.9516,12.3013 59.9541,12.3143 59.9578,12.3206 59.9625,12.3368 59.9663,12.3453 59.97,12.3501 59.9736,12.3565 59.9788,12.3606 59.9849,12.376 59.9953,12.3802 60,12.3869 60.0073,12.4063 60.017,12.4211 60.0242,12.4332 60.0336,12.4463 60.043,12.4589 60.0526,12.4679 60.0622,12.476 60.0721,12.4921 60.0917,12.5184 60.1278,12.5244 60.1572,12.5387 60.1869,12.535 60.1989,12.5301 60.2061,12.5257 60.2201,12.5133 60.244,12.5076 60.2585,12.4974 60.2692,12.4943 60.2771,12.4967 60.2905,12.497 60.3235,12.5077 60.3358,12.5178 60.3407,12.532 60.3459,12.5408 60.3514,12.5532 60.3571,12.5626 60.3643,12.5731 60.3739,12.58 60.3797,12.5862 60.3881,12.5913 60.393,12.6002 60.4001,12.6054 60.4069,12.6079 60.4151,12.6107 60.4267,12.6111 60.4372,12.6124 60.4809,12.6122 60.5063,12.6091 60.5196,12.6024 60.528,12.5952 60.5366,12.5814 60.555,12.5672 60.5694,12.5455 60.5884,12.5301 60.5983,12.5223 60.606,12.5177 60.6123,12.5158 60.6176,12.5182 60.6242,12.519 60.629,12.5202 60.6321,12.5196 60.6356,12.519 60.6395,12.5169 60.6432,12.514 60.6478,12.5125 60.652,12.5007 60.6614,12.4924 60.6691,12.4779 60.6796,12.4062 60.73,12.3968 60.7464,12.364 60.795,12.3447 60.8304,12.3375 60.8468,12.3322 60.8581,12.3315 60.8668,12.3291 60.8783,12.3286 60.8908,12.3265 60.9007,12.3256 60.9065,12.3227 60.9118,12.3129 60.9197,12.3059 60.9258,12.2897 60.9426,12.2708 60.9669,12.256 60.9823,12.2509 60.9897,12.2425 60.9974,12.2205 61.0121,12.3161 61.0306,12.395 61.0452,12.4334 61.0482,12.4491 61.0497,12.4762 61.0533,12.4919 61.0544,12.5051 61.0541,12.5215 61.0529,12.5459 61.0511,12.5726 61.0496,12.5878 61.0502,12.6039 61.0506,12.619 61.0508,12.6313 61.0517,12.6417 61.0524,12.6508 61.054,12.6652 61.0569,12.6764 61.0606,12.6824 61.0648,12.6856 61.0689,12.6888 61.0734,12.6927 61.0799,12.6988 61.0903,12.7016 61.0946,12.7056 61.1032,12.7097 61.118,12.7027 61.1403,12.7897 61.1925,12.874 61.3603,12.575 61.5714,12.4237 61.5616,12.1319 61.7258,12.2195 61.9999,12.3106 62.266,12.1278 62.5199,12.0531 62.6102,12.1397 62.7626,12.076 62.9034,12.2248 63.0029,12.0738 63.1724,11.9795 63.2699,12.0568 63.3366,12.1191 63.3962,12.215 63.4835,12.1485 63.5964,12.2629 63.6491,12.341 63.7307,12.3724 63.7501,12.5106 63.8504,12.6873 63.98,12.747 64,12.7594 64.006,12.9198 64.057,13.2003 64.0978,13.4947 64.0693,13.6552 64.0543,13.9562 64.012,14.1235 64.1731,14.1324 64.1923,14.1001 64.4672,13.9554 64.4934,13.6373 64.5858,13.8946 64.7931,14.1084 64.9575,14.1696 65,14.3406 65.1186,14.3919 65.2512,14.5119 65.3047,14.504 65.4801,14.5358 65.6928,14.5764 65.7356,14.6234 65.8093,14.5983 65.8679,14.5174 66.1335,15 66.145,15.0217 66.1455,15.495 66.2817,15.4806 66.3194,15.4703 66.3403,15.4656 66.3532,15.4489 66.3785,15.4317 66.3991,15.4072 66.4313,15.3919 66.4635,15.3762 66.4848,15.4887 66.5337,15.5824 66.5723,15.6255 66.5902,15.6464 66.6067,15.6601 66.6181,15.6996 66.6476,15.7726 66.7058,15.8778 66.7779,15.978 66.8469,16.0098 66.8796,16.0561 66.9109,16.1594 66.9578,16.3197 67.0179,16.4001 67.0443,16.3975 67.0454,16.4093 67.2042,16.1008 67.4338,16.1693 67.5179,16.3994 67.5329,16.4209 67.5357,16.4534 67.5594,16.4801 67.5752,16.5121 67.6065,16.5771 67.6634,16.6044 67.695,16.6062 67.7128,16.6296 67.7432,16.7412 67.9209,16.8461 67.9466,16.9163 67.9647,16.9801 67.99,17.1415 68.0473,17.1688 68.0624,17.215 68.0867,17.2464 68.1028,17.2832 68.1202,17.4061 68.0968,17.5183 68.0737,17.638 68.0483,17.7817 68.0117,17.9016 67.9689,18.087 68.1475,18.1235 68.1768,18.1556 68.2034,18.1069 68.4097,18.1081 68.4271,18.1251 68.5383,18.4178 68.5844,18.6187 68.5078,18.9894 68.52,19.9587 68.3511,19.9975 68.3907,20 68.3911,20.0171 68.3935,20.0469 68.4051,20.0727 68.4146,20.1107 68.4265,20.1624 68.4443,20.2109 68.4646,20.2639 68.491,20.2075 68.5022,20.0987 68.5251,20.0728 68.5286,20 68.552,19.9715 68.5611,20 68.5719,20.0577 68.5936,20.0661 68.5964,20.1019 68.615,20.1387 68.636,20.2022 68.6752,20.2139 68.684,20.2244 68.7003,20.2494 68.7297,20.2727 68.7498,20.2854 68.7628,20.3077 68.7751,20.3472 68.814,20.3432 68.8599,20.3363 68.8815,20.3435 68.8925,20.3403 68.908,20.3391 68.9213,20.3371 68.9304,20.3233 68.9355,20.0612 69.0596,20.5573 69.0625,20.7205 69.1214,21.0603 69.0443,21.1281 69.104,21.0681 69.1232,21.0217 69.1843,21.0237 69.2056,21.0247 69.2232,21.0408 69.234,21.1065 69.2571,21.1787 69.2817,21.2159 69.2856,21.2871 69.308,21.644 69.2701,21.8237 69.1562,21.8748 69.1307,21.8916 69.1237,21.9007 69.1123,21.9439 69.0918,22.1747 68.9612,22.1984 68.916,22.3365 68.832,22.3739 68.7205,22.5213 68.7441,22.7983 68.6911,23.0416 68.697,23.1608 68.629,23.4461 68.6974,23.6645 68.7133,23.7122 68.7518,23.7457 68.7819,23.7679 68.8224,23.874 68.8394,23.9231 68.8367,23.9591 68.8352,24.0028 68.8286,24.032 68.8143,24.0513 68.8018,24.1525 68.7966,24.1411 68.759,24.1499 68.7578,24.1846 68.7519,24.2155 68.7445,24.2403 68.733,24.2675 68.7276,24.3047 68.7276,24.4652 68.7085,24.6127 68.6882,24.6531 68.6836,24.7794 68.644,24.8049 68.6311,24.82 68.6155,24.8409 68.5894,24.8518 68.575,24.8664 68.5611,24.9036 68.558,24.8998 68.5815,24.9111 68.5941,24.9132 68.5983,24.9161 68.6098,24.9333 68.6144,24.9783 68.619,25 68.6184,25.0035 68.6183,25.0321 68.6215,25.0659 68.6329,25.124 68.6463,25.1235 68.647,25.1172 68.6567,25.119 68.6661,25.1141 68.6721,25.1074 68.6788,25.1048 68.6933,25.1106 68.7094,25.1309 68.7157,25.13 68.7182,25.1221 68.7302,25.1256 68.7403,25.1213 68.7464,25.1225 68.7573,25.1291 68.7687,25.1309 68.7718,25.1354 68.782,25.1377 68.7874,25.1382 68.7917,25.1421 68.7965,25.1526 68.7999,25.1647 68.8028,25.1785 68.8062,25.2064 68.8149,25.2203 68.8195,25.2314 68.8279,25.2461 68.8379,25.2501 68.8433,25.2692 68.8485,25.2815 68.8532,25.2921 68.8572,25.3012 68.8625,25.3116 68.8654,25.3512 68.8721,25.3722 68.879,25.3846 68.8836,25.3917 68.8866,25.4069 68.8863,25.4086 68.8869,25.4108 68.8905,25.4145 68.8935,25.428 68.8932,25.4417 68.8954,25.4556 68.8988,25.4695 68.9016,25.4784 68.9051,25.4885 68.9056,25.5017 68.9029,25.5144 68.8972,25.5224 68.894,25.5255 68.8922,25.5417 68.8876,25.5619 68.8873,25.5802 68.8857,25.5901 68.8843,25.602 68.8853,25.6092 68.8883,25.6246 68.8898,25.6336 68.8945,25.636 68.8966,25.6413 68.901,25.6553 68.905,25.6708 68.9193,25.6716 68.9248,25.6809 68.9307,25.6887 68.9384,25.6947 68.945,25.6996 68.9526,25.7304 68.9916,25.771 69.0135,25.7834 69.0203,25.7351 69.1075,25.7425 69.1259,25.751 69.1389,25.7513 69.1403,25.7532 69.1492,25.7358 69.1688,25.7268 69.1813,25.7186 69.1947,25.7068 69.2057,25.7168 69.2199,25.7233 69.2331,25.7161 69.2359,25.7172 69.2471,25.7096 69.2555,25.7287 69.2631,25.741 69.2702,25.737 69.2765,25.7434 69.2805,25.7499 69.2849,25.7468 69.2901,25.7547 69.2976,25.7457 69.3026,25.7553 69.3079,25.7456 69.315,25.7557 69.337,25.7706 69.345,25.7885 69.354,25.7875 69.3599,25.8019 69.3648,25.8181 69.3683,25.8177 69.3787,25.8369 69.3927,25.8357 69.4001,25.8266 69.4089,25.8265 69.4172,25.8069 69.4238,25.8123 69.4275,25.8065 69.4336,25.8171 69.4464,25.818 69.4475,25.8292 69.4608,25.8428 69.4729,25.8646 69.4779,25.868 69.4828,25.857 69.495,25.8626 69.5132,25.884 69.5226,25.8699 69.5336,25.8506 69.547,25.8574 69.555,25.8773 69.5579,25.9168 69.5674,25.9494 69.5801,25.9504 69.5805,25.9616 69.5951,25.9808 69.6096,25.9712 69.6289,25.9639 69.6466,25.9451 69.6535,25.9291 69.6549,25.9106 69.6615,25.9022 69.6717,25.9091 69.6774,25.9326 69.6839,25.948 69.6932,25.9591 69.704,25.9789 69.7155,25.9971 69.7219,26.0577 69.7289,26.1025 69.7362,26.1498 69.7495,26.1584 69.7517,26.1637 69.7536,26.1956 69.7726,26.2576 69.8,26.258 69.8072,26.2584 69.8151,26.2755 69.822,26.302 69.8288,26.3658 69.8497,26.3959 69.8616,26.4203 69.879,26.4234 69.89,26.4152 69.902,26.4125 69.9058,26.4467 69.914,26.4648 69.9253,26.4647 69.9391,26.6826 69.9657,26.6989 69.9534,26.7157 69.9491,26.7321 69.9487,26.7393 69.9513,26.7832 69.9599,26.8492 69.9615,26.8588 69.9592,26.8478 69.948,26.8539 69.9384,26.862 69.9345,26.8763 69.9342,26.9089 69.9364,26.9225 69.9379,26.9343 69.9393,26.961 69.9388,26.9803 69.9353,27.0002 69.928,27.0112 69.921,27.0155 69.916,27.0379 69.9103,27.0588 69.9143,27.0947 69.9183,27.147 69.9336,27.1719 69.94,27.2062 69.9471,27.2148 69.9482,27.2678 69.9551,27.2891 69.9633,27.2717 69.9815,27.2758 69.9849,27.2953 69.9882,27.3368 69.9908,27.3534 69.9928,27.3727 70,27.3745 70.0007,27.3925 70.0083,27.4474 70.022,27.5079 70.0259,27.5197 70.029,27.5356 70.0368,27.5567 70.0632,27.5587 70.0657,27.5826 70.0754,27.609 70.0782,27.6564 70.0798,27.7137 70.0736,27.7339 70.0675,27.7611 70.0689,27.8864 70.0864,27.9093 70.0901,27.9331 70.094,27.9632 70.0961,27.9778 70.0926,27.9772 70.085,27.9762 70.0718,27.9785 70.0557,27.982 70.0414,28.0016 70.022,28.04 70.0008,28.0415 70,28.0681 69.9859,28.118 69.9533,28.1903 69.9252,28.2505 69.9065,28.3526 69.8813,28.3547 69.8489,28.4179 69.8283,28.4285 69.8211,29.1351 69.6969,29.1372 69.6766,29.2864 69.5349,29.3024 69.5216,29.3144 69.5081,29.3329 69.4905,29.3362 69.4844,29.3092 69.4639,29.2233 69.4106,29.1952 69.3981,29.0123 69.3134,28.939 69.28,28.8246 69.2292,28.8272 69.2273,28.8294 69.2106,28.8273 69.193,28.8264 69.1791,28.8178 69.159,28.8139 69.1439,28.8077 69.1274,28.8181 69.1061,28.832 69.0923,28.8584 69.0773,28.9269 69.0574,28.9465 69.05,28.9668 69.045,29.0059 69.0385,29.0294 69.023,29.0352 69.0168,29.0749 69.0273,29.0938 69.0322,29.1529 69.0593,29.1856 69.0734,29.2366 69.1106,29.2552 69.1183,29.2589 69.1198,29.2694 69.151,29.2699 69.1525,29.3097 69.1821,29.312 69.2071,29.3273 69.2326,29.3273 69.2428,29.3063 69.2438,29.3009 69.2467,29.2947 69.2501,29.3007 69.2588,29.3061 69.2712,29.3035 69.2934,29.315 69.3028,29.3421 69.3104,29.3933 69.3159,29.431 69.3157,29.448 69.316,29.487 69.3277,29.5009 69.3285,29.5472 69.3153,29.6166 69.334,29.6652 69.3524,29.7046 69.3705,29.7185 69.3766,29.7553 69.3906,29.7689 69.3955,29.7806 69.3997,29.8018 69.4043,29.8183 69.4123,29.8304 69.4187,29.8623 69.4221,29.9011 69.4227,29.9494 69.4151,29.9711 69.4118,30 69.4192,30.0172 69.4236,30.0494 69.4367,30.0756 69.453,30.1099 69.4627,30.1182 69.4677,30.1292 69.4743,30.1402 69.4901,30.1372 69.5067,30.1483 69.519,30.1535 69.5248,30.1731 69.5315,30.1919 69.5351,30.1947 69.5468,30.1868 69.5627,30.1843 69.5785,30.1722 69.5941,30.1575 69.6061,30.1511 69.6187,30.1514 69.631,30.152 69.6353,30.1522 69.6371,30.1431 69.6438,30.12 69.6439,30.1074 69.6419,30.1005 69.6556,30.1113 69.6634,30.1454 69.6715,30.195 69.6661,30.2608 69.6456,30.3192 69.6303,30.3658 69.6171,30.397 69.6053,30.5012 69.5535,30.5355 69.5415,30.6162 69.5423,30.6694 69.5453,30.7141 69.5417,30.8201 69.5417,30.8574 69.5525,30.9017 69.5626,30.9294 69.5723,30.9456 69.5862,30.9448 69.5957,30.9429 69.614,30.9454 69.6413,30.9259 69.6571,30.9238 69.6634,30.9313 69.6868,30.8978 69.6958,30.8815 69.7079,30.8785 69.717,30.8826 69.724,30.8934 69.7357,30.8354 69.7852,30.8247 69.7841,30.8076 69.7863,30.7948 69.7843,30.7833 69.7786,30.7681 69.7754,30.7603 69.7707,30.7188 69.7614,30.7011 69.7585,30.6862 69.7663,30.6987 69.7731,30.723 69.7794,30.7374 69.796,30.7345 69.7989,30.7156 69.7984,30.7049 69.7998,30.6949 69.7981,30.6896 69.791,30.6797 69.7878,30.6618 69.7881,30.6534 69.7906,30.6517 69.793,30.65 69.7956,30.6554 69.7993,30.6846 69.8078,30.6782 69.8102,30.6513 69.8061,30.6423 69.807,30.6354 69.8099,30.6161 69.8098,30.6038 69.8145,30.5902 69.8154,30.5821 69.8134,30.6041 69.8062,30.5965 69.8019,30.5608 69.8098,30.5436 69.8101,30.5206 69.8074,30.517 69.8085,30.5233 69.8165,30.5195 69.8188,30.5063 69.821,30.5011 69.8201,30.4635 69.8134,30.4458 69.8161,30.4268 69.8095,30.4308 69.8025,30.4197 69.7974,30.4375 69.786,30.443 69.7759,30.4413 69.7693,30.4322 69.761,30.4333 69.7549,30.4622 69.7412,30.4662 69.736,30.4388 69.73,30.4363 69.7271,30.4341 69.7245,30.4363 69.7196,30.449 69.711,30.45 69.7081,30.4413 69.7007,30.4512 69.6878,30.4516 69.6818,30.4443 69.6782,30.4374 69.6756,30.4098 69.6724,30.3951 69.6685,30.4024 69.6649,30.3957 69.6629,30.3799 69.6632,30.3502 69.667,30.3219 69.6655,30.3137 69.6684,30.3556 69.6762,30.3956 69.6809,30.411 69.6848,30.4172 69.691,30.4087 69.7583,30.4042 69.772,30.4024 69.7775,30.3965 69.7777,30.3721 69.771,30.3683 69.7753,30.3806 69.7833,30.3803 69.7916,30.3895 69.7969,30.3742 69.8169,30.3875 69.8242,30.3783 69.8428,30.3744 69.8448,30.3576 69.8444,30.328 69.8364,30.3037 69.8393,30.3013 69.8389,30.2872 69.8361,30.2754 69.8403,30.268 69.84,30.2504 69.8357,30.2415 69.837,30.2424 69.8392,30.2762 69.8463,30.2894 69.8476,30.328 69.8565,30.3336 69.8592,30.3202 69.8644,30.305 69.863,30.297 69.8668,30.3013 69.8767,30.2972 69.8783,30.2864 69.8781,30.2673 69.8731,30.242 69.8754,30.2216 69.8726,30.2129 69.8732,30.1764 69.8842,30.1493 69.872,30.1484 69.8619,30.1307 69.8477,30.1511 69.8358,30.1536 69.8295,30.1691 69.8226,30.1692 69.8191,30.151 69.8091,30.1657 69.7942,30.1806 69.7882,30.1872 69.7855,30.1961 69.777,30.1969 69.7717,30.1878 69.7668,30.1502 69.7657,30.1063 69.7542,30.1016 69.7503,30.1174 69.7273,30.1201 69.714,30.1143 69.7032,30.1226 69.693,30.1217 69.6884,30.117 69.6866,30.114 69.6855,30.1044 69.6901,30.0994 69.7023,30.0786 69.7149,30.0708 69.7267,30.0595 69.7304,30.0518 69.731,30.0303 69.7282,30 69.7208,29.9464 69.7078,29.9268 69.7049,29.9504 69.7138,30 69.7248,30.0092 69.7268,30.0327 69.7352,30.0407 69.7411,30.0415 69.7473,30.0329 69.7511,30.0574 69.755,30.0681 69.7567,30.0683 69.7611,30.0792 69.7657,30.0736 69.7744,30.0679 69.777,30.0593 69.7771,30.0417 69.7744,30.0226 69.7787,30.0134 69.777,30.021 69.7723,30.0129 69.7699,30 69.7708,29.9889 69.7716,29.9686 69.7706,29.9525 69.768,29.937 69.7579,29.9107 69.7546,29.9015 69.7453,29.8906 69.7423,29.8785 69.7341,29.8734 69.7331,29.8707 69.7326,29.8581 69.7384,29.8401 69.7403,29.8262 69.7461,29.8054 69.7454,29.7818 69.7482,29.7713 69.7465,29.7482 69.7468,29.7293 69.7418,29.6881 69.7416,29.6703 69.7377,29.6554 69.7307,29.6394 69.7146,29.6268 69.7064,29.5996 69.7022,29.5804 69.6981,29.574 69.6947,29.5485 69.6709,29.5337 69.662,29.5059 69.6555,29.487 69.6563,29.4955 69.6663,29.5322 69.6899,29.5381 69.6982,29.5322 69.7002,29.5206 69.6993,29.5077 69.6962,29.4685 69.6998,29.4663 69.701,29.4713 69.7022,29.4977 69.7021,29.521 69.7064,29.5473 69.704,29.555 69.7053,29.5853 69.7232,29.5964 69.7326,29.6139 69.7397,29.617 69.7503,29.6445 69.75,29.6476 69.7533,29.642 69.7586,29.6182 69.763,29.6134 69.7664,29.6203 69.7694,29.6535 69.7713,29.6687 69.7753,29.685 69.7822,29.7171 69.8027,29.7494 69.8157,29.7418 69.8208,29.7319 69.8233,29.7308 69.8259,29.7577 69.829,29.7627 69.8296,29.7719 69.8334,29.7717 69.8366,29.7594 69.8417,29.7563 69.8501,29.7463 69.8521,29.73 69.8514,29.7278 69.8526,29.7468 69.8576,29.7532 69.8647,29.7481 69.8911,29.7281 69.8993,29.7291 69.9022,29.7385 69.9064,29.7344 69.9101,29.721 69.912,29.71 69.917,29.6967 69.9171,29.6823 69.9121,29.682 69.9106,29.6809 69.906,29.6767 69.9055,29.6674 69.9095,29.6479 69.9071,29.6389 69.9081,29.6249 69.9144,29.6133 69.9156,29.607 69.9188,29.5958 69.9172,29.5715 69.9043,29.5712 69.9156,29.5635 69.9187,29.536 69.9202,29.5255 69.919,29.5187 69.9165,29.5141 69.9064,29.4959 69.9039,29.4702 69.8885,29.4145 69.8627,29.3943 69.8598,29.3645 69.8602,29.3505 69.8667,29.3595 69.8719,29.3703 69.8742,29.4095 69.8759,29.4138 69.8811,29.4014 69.8861,29.4012 69.8896,29.4168 69.8945,29.4288 69.902,29.4293 69.9023,29.4735 69.9068,29.4855 69.9109,29.4866 69.9205,29.5223 69.9235,29.5549 69.9312,29.6018 69.9477,29.6368 69.9542,29.6528 69.966,29.6775 69.9758,29.6794 69.9794,29.6759 69.9786,29.6483 69.9726,29.6453 69.9798,29.6383 69.9808,29.6242 69.9767,29.6135 69.9767,29.6056 69.9832,29.5972 69.9842,29.5802 69.9817,29.563 69.9823,29.5482 69.9903,29.5392 69.9913,29.5231 69.9892,29.5051 69.9897,29.4979 69.9922,29.5033 69.9964,29.4997 70,29.4982 70,29.4774 70.0054,29.4434 70.0104,29.4211 70.0099,29.4064 70.0127,29.3876 70.0162,29.3771 70.0212,29.3528 70.0143,29.3367 70.0124,29.3242 70.0131,29.3099 70.0166,29.2921 70.0175,29.2791 70.0107,29.2647 70.0117,29.2405 70.0181,29.2257 70.02,29.2084 70.0163,29.1984 70.0185,29.2015 70.0241,29.1975 70.0284,29.1919 70.03,29.1791 70.0275,29.1699 70.0283,29.1672 70.0304,29.1706 70.0369,29.1606 70.0437,29.1576 70.0443,29.1479 70.0461,29.1112 70.0467,29.102 70.0498,29.0994 70.0609,29.0819 70.0608,29.066 70.055,29.0429 70.0563,29.0193 70.0606,28.9979 70.0609,28.9796 70.0648,28.9483 70.0656,28.9064 70.074,28.8753 70.0778,28.848 70.0767,28.8347 70.0793,28.7829 70.0817,28.7576 70.0847,28.7231 70.0934,28.7297 70.0976,28.7574 70.0934,28.827 70.0896,28.838 70.0906,28.8442 70.0932,28.8459 70.0968,28.8293 70.1042,28.7928 70.1108,28.7769 70.1112,28.7661 70.1115,28.7404 70.1089,28.7159 70.1104,28.6617 70.0999,28.6502 70.0996,28.6372 70.106,28.6115 70.1101,28.5955 70.1154,28.5723 70.1169,28.5664 70.1196,28.5816 70.1232,28.6593 70.1335,28.6717 70.1369,28.6756 70.139,28.6845 70.1436,28.7244 70.151,28.7401 70.1562,28.7514 70.1624,28.7409 70.1681,28.7187 70.1663,28.6925 70.1667,28.6798 70.1649,28.5895 70.1654,28.5754 70.1633,28.5685 70.1697,28.572 70.1726,28.5637 70.1766,28.5925 70.1804,28.5941 70.1804,28.6145 70.1797,28.6311 70.181,28.6473 70.1806,28.6592 70.1777,28.6851 70.1782,28.731 70.176,28.7555 70.1719,28.7985 70.1599,28.846 70.1539,28.8544 70.1456,28.8659 70.1479,28.882 70.1478,28.8945 70.1511,28.9286 70.1411,28.9542 70.1412,28.966 70.1398,28.991 70.1315,29.0052 70.1267,29.015 70.1259,29.0437 70.1292,29.0511 70.1269,29.0693 70.1272,29.0807 70.1291,29.0865 70.1325,29.1127 70.1323,29.137 70.13,29.1525 70.1235,29.1686 70.1233,29.1912 70.1156,29.2595 70.1186,29.2914 70.117,29.3189 70.1125,29.341 70.1034,29.3811 70.1005,29.4077 70.0951,29.4263 70.0944,29.4464 70.1001,29.4629 70.1013,29.4915 70.0981,29.5437 70.0946,29.595 70.0911,29.6305 70.0905,29.6526 70.0841,29.6859 70.083,29.7318 70.077,29.7719 70.0761,29.8304 70.0643,29.8422 70.0652,29.8704 70.0632,29.8901 70.0635,29.9738 70.0679,30 70.0706,30.0185 70.0725,30.0382 70.0772,30.0398 70.0776,30.0738 70.0822,30.0869 70.0809,30.0931 70.0777,30.0918 70.0701,30.1018 70.07,30.1273 70.0733,30.157 70.0697,30.162 70.0725,30.1505 70.0778,30.0934 70.0823,30.0897 70.087,30.1001 70.0916,30.1201 70.0947,30.1261 70.1002,30.1581 70.1067,30.1688 70.1081,30.1749 70.107,30.1852 70.1051,30.1974 70.1087,30.2051 70.1151,30.2153 70.1192,30.2483 70.1208,30.2814 70.1261,30.3331 70.1399,30.3553 70.1413,30.3635 70.1435,30.3566 70.156,30.3361 70.1591,30.3312 70.1623,30.3252 70.1718,30.3303 70.1783,30.3292 70.1843,30.3281 70.1906,30.3355 70.1921,30.3505 70.1907,30.3584 70.1936,30.3581 70.1982,30.3729 70.2017,30.3967 70.2016,30.456 70.208,30.4764 70.2081,30.4792 70.2137,30.4901 70.2192,30.4858 70.2256,30.5094 70.2377,30.5265 70.2434,30.545 70.2419,30.5509 70.2432,30.5573 70.2492,30.5812 70.2513,30.6065 70.2481,30.6216 70.2486,30.6433 70.2518,30.6651 70.252,30.679 70.2509,30.6912 70.2471,30.6992 70.2468,30.7214 70.2566,30.7399 70.2587,30.7609 70.2601,30.7894 70.2581,30.8007 70.2643,30.8031 70.2648,30.8103 70.2664,30.825 70.2655,30.841 70.2613,30.8585 70.2676,30.8775 70.2675,30.9397 70.2731,30.9659 70.2772,30.9731 70.2831,30.9852 70.2844,31.0152 70.2811,31.0563 70.2866,31.0652 70.2901,31.0495 70.295,31.0363 70.3104,31.0541 70.318,31.055 70.3219,31.0441 70.3329,31.04 70.3371,31.0357 70.3484,31.0519 70.3561,31.0522 70.3603,31.0469 70.364,31.0274 70.3667,31.0173 70.3704,31.016 70.3739,31.0289 70.3821,31.027 70.3942,31.0103 70.4021,31.0001 70.4157,30.9923 70.4186,30.9694 70.4212,30.9603 70.4242,30.9511 70.4338,30.9601 70.4377,30.9577 70.4398,30.9132 70.4505,30.8896 70.4447,30.8578 70.4408,30.8332 70.4413,30.8259 70.44,30.7871 70.4288,30.775 70.4209,30.7753 70.4195,30.7645 70.4229,30.7613 70.4295,30.7504 70.4328,30.7428 70.4329,30.7231 70.4285,30.7124 70.4308,30.7112 70.4332,30.7252 70.4408,30.7195 70.4473,30.735 70.4673,30.7065 70.4734,30.6923 70.4743,30.6838 70.477,30.6761 70.4837,30.6454 70.4932,30.6275 70.4933,30.6142 70.5,30.6132 70.5006,30.6013 70.5036,30.586 70.5052,30.578 70.5092,30.5873 70.5102,30.5927 70.5171,30.6104 70.5235,30.6118 70.5271,30.6034 70.5339,30.6114 70.5384,30.6267 70.5389,30.6305 70.5415,30.6264 70.5451,30.6144 70.5461,30.6081 70.5493,30.5985 70.5495,30.5904 70.5464,30.5922 70.5422,30.5831 70.5401,30.5566 70.5394,30.5373 70.5411,30.5165 70.5411,30.5036 70.5486,30.4796 70.5455,30.45 70.5474,30.4428 70.5521,30.4161 70.5507,30.4013 70.5481,30.3778 70.5498,30.3313 70.5454,30.2781 70.534,30.2246 70.5291,30.1418 70.51,30.1169 70.506,30.1112 70.5074,30.1102 70.5094,30.1084 70.5128,30.1016 70.5149,30.0394 70.5218,30.0263 70.5276,30.0114 70.5303,29.9818 70.5303,29.9941 70.5377,30 70.5375,30.0125 70.5371,30.0276 70.5349,30.0401 70.5296,30.052 70.53,30.0663 70.5334,30.0901 70.5326,30.1058 70.5304,30.1161 70.532,30.1308 70.5309,30.136 70.5319,30.1334 70.534,30.0862 70.539,30.0795 70.5413,30.0824 70.5474,30.0862 70.5484,30.13 70.5475,30.1646 70.5496,30.1877 70.5525,30.1935 70.5532,30.2128 70.5533,30.2184 70.5554,30.2107 70.5624,30.2193 70.5671,30.2817 70.5769,30.3142 70.59,30.3215 70.6111,30.2523 70.6296,30.2355 70.6384,30.2045 70.6406,30.1931 70.6454,30.1464 70.6446,30.1191 70.642,30.1032 70.6422,30.0948 70.6455,30.0986 70.6484,30.1237 70.6545,30.1627 70.6607,30.1805 70.6618,30.2042 70.6698,30.2046 70.6744,30.1953 70.6775,30.1837 70.678,30.1717 70.6831,30.1423 70.6856,30.1415 70.6857,30.1161 70.6941,30.0982 70.6964,30.0872 70.7042,30.0766 70.7058,30.059 70.7051,30.0404 70.7073,30.0093 70.7078,30 70.706,29.9958 70.7051,29.9715 70.707,29.9625 70.7051,29.9507 70.7051,29.9381 70.701,29.9202 70.684,29.9046 70.6833,29.8857 70.6691,29.8726 70.6644,29.8555 70.6583,29.8437 70.6484,29.8241 70.6398,29.7888 70.6299,29.7415 70.6253,29.7072 70.6161,29.6895 70.6149,29.6893 70.6205,29.6964 70.625,29.7141 70.6241,29.7219 70.6265,29.7247 70.6326,29.7477 70.6373,29.768 70.6477,29.7915 70.6535,29.7838 70.6552,29.7687 70.6555,29.7895 70.6676,29.7934 70.6784,29.809 70.6893,29.7925 70.6975,29.7975 70.7107,29.8014 70.7209,29.7964 70.7245,29.7826 70.7287,29.7711 70.7296,29.7539 70.7282,29.7092 70.7336,29.6833 70.733,29.5884 70.7095,29.5348 70.703,29.5231 70.7012,29.515 70.7015,29.493 70.7025,29.4807 70.7009,29.4631 70.7023,29.4468 70.7013,29.4356 70.6989,29.4208 70.6919,29.4062 70.6897,29.3952 70.6922,29.3864 70.6968,29.3815 70.6968,29.3734 70.689,29.342 70.6801,29.3373 70.6743,29.3199 70.6699,29.3228 70.6638,29.316 70.6602,29.3041 70.6576,29.2797 70.6569,29.2622 70.6522,29.2426 70.6536,29.2531 70.6581,29.2884 70.6623,29.2792 70.6661,29.2645 70.6678,29.2501 70.666,29.24 70.6668,29.2402 70.6696,29.2765 70.679,29.3001 70.6812,29.3227 70.6888,29.3401 70.6912,29.3519 70.6953,29.3673 70.698,29.3646 70.7002,29.3504 70.7014,29.3134 70.6986,29.2997 70.7032,29.2922 70.7043,29.2825 70.7057,29.2798 70.7083,29.2922 70.712,29.3008 70.7172,29.3295 70.7157,29.3471 70.7208,29.3624 70.7209,29.3881 70.7271,29.4144 70.7289,29.4034 70.7334,29.3891 70.7344,29.3792 70.7297,29.3677 70.7283,29.3419 70.7301,29.3343 70.7283,29.3344 70.7244,29.3284 70.721,29.3199 70.7204,29.3222 70.7251,29.3122 70.7287,29.3026 70.729,29.2737 70.7255,29.2462 70.7263,29.2401 70.729,29.2471 70.7313,29.2603 70.7313,29.2679 70.7333,29.271 70.7364,29.266 70.7382,29.2508 70.7385,29.2485 70.7399,29.2841 70.7488,29.3477 70.7602,29.3526 70.7626,29.349 70.7664,29.3635 70.7702,29.3762 70.7792,29.3893 70.7807,29.3859 70.7832,29.3329 70.7851,29.3227 70.7861,29.2958 70.7887,29.2768 70.7924,29.2596 70.7992,29.2665 70.8056,29.2532 70.8201,29.2649 70.824,29.2651 70.8268,29.2437 70.8337,29.2419 70.8391,29.2328 70.841,29.2287 70.8499,29.1912 70.8526,29.1749 70.8497,29.1425 70.8511,29.1224 70.858,29.113 70.8576,29.1011 70.8571,29.1077 70.8647,29.0969 70.8681,29.0913 70.8724,29.0731 70.8736,29.0188 70.8728,29.0004 70.87,28.993 70.8707,28.991 70.8733,28.9967 70.8782,28.9947 70.8808,28.9511 70.8823,28.9241 70.8807,28.8928 70.8813,28.8548 70.8761,28.8333 70.8766,28.7577 70.8539,28.751 70.8518,28.7417 70.8441,28.7322 70.8426,28.7193 70.8322,28.6772 70.8105,28.6608 70.7929,28.6692 70.7839,28.6632 70.78,28.5956 70.7654,28.5688 70.7535,28.5573 70.7483,28.5531 70.7437,28.5263 70.7301,28.5256 70.7253,28.5346 70.711,28.5479 70.7019,28.5628 70.6959,28.6028 70.6861,28.6261 70.6828,28.6272 70.6773,28.5922 70.678,28.584 70.676,28.5689 70.6767,28.5391 70.6836,28.504 70.6866,28.5001 70.6826,28.5112 70.6756,28.506 70.6718,28.5139 70.661,28.5003 70.6498,28.4869 70.6334,28.4811 70.6263,28.4811 70.6094,28.4707 70.6044,28.4743 70.5977,28.4481 70.5905,28.4393 70.5862,28.4218 70.5535,28.4147 70.5478,28.3999 70.5439,28.4369 70.5338,28.4435 70.528,28.4525 70.5254,28.4669 70.5211,28.4697 70.5139,28.4755 70.5103,28.5165 70.5071,28.548 70.5093,28.5526 70.5062,28.5495 70.5026,28.5149 70.4943,28.513 70.4855,28.4903 70.4757,28.491 70.4731,28.5149 70.4659,28.512 70.4605,28.5232 70.4517,28.517 70.4491,28.5057 70.4502,28.4946 70.4475,28.4696 70.458,28.4543 70.4692,28.4551 70.4745,28.4669 70.4874,28.4653 70.4914,28.4549 70.4958,28.4423 70.4971,28.4311 70.4964,28.3834 70.4875,28.3571 70.4794,28.3398 70.4688,28.3423 70.4533,28.3365 70.4484,28.3325 70.4451,28.2897 70.4286,28.2622 70.4331,28.2847 70.4551,28.3066 70.4652,28.3169 70.4802,28.3427 70.4891,28.3562 70.4983,28.3666 70.5006,28.3694 70.5013,28.3747 70.5055,28.3748 70.5158,28.3707 70.5207,28.3564 70.5209,28.3176 70.5075,28.3086 70.5071,28.2945 70.513,28.2745 70.5104,28.2543 70.5118,28.2453 70.504,28.2293 70.5004,28.2207 70.4942,28.2079 70.49,28.1808 70.4911,28.1611 70.4841,28.1363 70.4786,28.1232 70.4757,28.0966 70.4632,28.0765 70.4567,28.0663 70.4492,28.0541 70.4264,28.0477 70.4252,28.0425 70.4263,28.0413 70.4296,28.0477 70.4408,28.0413 70.4529,28.0503 70.4588,28.0926 70.4738,28.1026 70.478,28.135 70.4916,28.1555 70.4914,28.1645 70.4966,28.1859 70.4971,28.1962 70.4998,28.2029 70.5044,28.2018 70.5079,28.1948 70.5099,28.1753 70.5114,28.141 70.5088,28.1056 70.5021,28.0809 70.5019,28.0534 70.4988,28.0106 70.4848,28.0053 70.4839,27.9999 70.483,27.9784 70.4846,27.965 70.4831,27.9457 70.4775,27.9253 70.4646,27.9185 70.4648,27.9394 70.4848,27.954 70.491,27.9836 70.4995,27.9886 70.5028,27.9836 70.5048,27.9703 70.5061,27.9586 70.5032,27.9389 70.5015,27.9341 70.4962,27.9049 70.484,27.8775 70.4651,27.8824 70.4331,27.8775 70.43,27.8706 70.4298,27.8608 70.4316,27.8545 70.4444,27.8385 70.446,27.8332 70.4494,27.8377 70.4536,27.84 70.468,27.8594 70.4853,27.8501 70.4859,27.8473 70.4861,27.8292 70.4823,27.8204 70.4853,27.8301 70.4886,27.8326 70.4932,27.8583 70.497,27.8934 70.5056,27.9009 70.5136,27.9092 70.5164,27.9299 70.5197,28.0105 70.542,28.0466 70.5488,28.0725 70.5559,28.1312 70.5721,28.217 70.6014,28.2368 70.6111,28.2773 70.6352,28.2911 70.6525,28.2946 70.6541,28.3021 70.6574,28.2965 70.667,28.3102 70.6915,28.2972 70.7018,28.2929 70.7163,28.2838 70.721,28.2759 70.7226,28.2452 70.7167,28.1556 70.6891,28.1205 70.6783,28.1021 70.6742,28.0667 70.6709,28.0093 70.6577,27.9149 70.6399,27.8804 70.6347,27.8274 70.6296,27.7531 70.6193,27.7321 70.6178,27.6818 70.6178,27.6569 70.6204,27.6355 70.6203,27.6372 70.6243,27.6689 70.6244,27.6905 70.6281,27.7283 70.6305,27.7585 70.6379,27.8017 70.6369,27.8285 70.6474,27.8595 70.6552,27.8835 70.6573,27.8884 70.6603,27.8872 70.6636,27.8683 70.6653,27.8642 70.6684,27.8718 70.6711,27.8942 70.674,27.9083 70.6758,27.9521 70.6848,27.9768 70.6864,28.0155 70.6917,28.048 70.6994,28.0769 70.7091,28.0907 70.7192,28.1162 70.7238,28.1384 70.7343,28.138 70.738,28.1445 70.7415,28.1388 70.7458,28.1285 70.749,28.1189 70.7508,28.0842 70.757,28.0468 70.7572,28.0274 70.7497,28.0013 70.7429,27.9953 70.7438,27.9926 70.7466,28.0021 70.7509,28.0257 70.7564,28.0326 70.7613,28.0102 70.766,27.9739 70.7678,27.93 70.7752,27.9021 70.7774,27.8902 70.7771,27.8813 70.7753,27.7989 70.7593,27.7769 70.7491,27.7673 70.7496,27.7677 70.754,27.7817 70.7655,27.8098 70.7695,27.8119 70.7749,27.8298 70.7797,27.8304 70.7847,27.8201 70.7882,27.804 70.7903,27.7989 70.795,27.8016 70.7972,27.8114 70.7974,27.824 70.8005,27.833 70.8004,27.8436 70.7985,27.8496 70.7975,27.8595 70.7979,27.8789 70.803,27.8865 70.803,27.8881 70.7984,27.9057 70.7993,27.921 70.7941,27.9323 70.7946,27.9317 70.7974,27.9355 70.7987,27.9571 70.799,27.9605 70.8039,27.9675 70.8069,27.9651 70.8109,27.9889 70.8191,28.0069 70.8188,28.0236 70.8215,28.0119 70.8166,28.0099 70.8093,28.0189 70.8013,28.037 70.7962,28.0637 70.7922,28.0658 70.7919,28.0753 70.7912,28.0774 70.7961,28.0969 70.8043,28.1058 70.8035,28.1006 70.7973,28.1099 70.7931,28.1584 70.7898,28.1843 70.7907,28.1969 70.7885,28.2267 70.788,28.2396 70.7894,28.2825 70.8035,28.2967 70.8044,28.3037 70.8097,28.3116 70.8104,28.3129 70.8152,28.293 70.8185,28.2886 70.8203,28.2798 70.8237,28.2664 70.8257,28.2521 70.8344,28.2291 70.8342,28.2135 70.8383,28.2195 70.8423,28.2408 70.8414,28.2833 70.8339,28.299 70.8275,28.3177 70.8274,28.3374 70.8231,28.3682 70.8334,28.3772 70.8381,28.3703 70.8432,28.3533 70.8446,28.3486 70.8477,28.3323 70.8494,28.3355 70.8513,28.3374 70.8524,28.3743 70.8499,28.4002 70.85,28.4265 70.8591,28.4344 70.8671,28.4569 70.8751,28.4568 70.8769,28.3743 70.8843,28.3595 70.8838,28.34 70.8888,28.3631 70.8915,28.377 70.8913,28.4 70.8862,28.4205 70.8845,28.4219 70.8844,28.4374 70.8848,28.4744 70.8896,28.4892 70.8995,28.4741 70.9055,28.4789 70.9074,28.4951 70.908,28.5026 70.9119,28.5107 70.9132,28.5013 70.9195,28.5164 70.9234,28.5229 70.9287,28.5297 70.9303,28.5264 70.9359,28.5416 70.959,28.5373 70.9635,28.5498 70.9679,28.5408 70.9728,28.5476 70.9775,28.5487 70.9783,28.5446 70.9809,28.5324 70.9827,28.5165 70.9882,28.4792 70.9928,28.4196 71.0029,28.3876 71.0039,28.3197 71.0001,28.3053 71.0039,28.2959 71.0005,28.2906 70.9918,28.2676 70.9847,28.251 70.9756,28.2469 70.9755,28.2425 70.9754,28.2313 70.9805,28.2246 70.9791,28.2204 70.974,28.2128 70.9719,28.2235 70.9675,28.221 70.9664,28.2098 70.9663,28.1994 70.959,28.1922 70.9585,28.1822 70.9605,28.226 71.0017,28.2254 71.0121,28.2186 71.013,28.1887 70.9992,28.1907 70.9962,28.1736 70.985,28.1687 70.9927,28.191 71.0071,28.1915 71.014,28.2043 71.0178,28.206 71.0184,28.2018 71.0233,28.2073 71.028,28.2044 71.0301,28.1777 71.0327,28.1693 71.0357,28.1782 71.0373,28.2004 71.036,28.2388 71.0451,28.2524 71.0456,28.2662 71.0523,28.2566 71.0558,28.2651 71.0583,28.252 71.0619,28.2497 71.0661,28.2689 71.0666,28.2716 71.0689,28.2652 71.0711,28.2487 71.0727,28.2451 71.0749,28.2496 71.0782,28.2421 71.0892,28.2195 71.0913,28.2118 71.0919,28.1885 71.0972,28.1617 71.0946,28.1436 71.0903,28.1314 71.0845,28.1316 71.0801,28.1103 71.0695,28.1067 71.0639,28.0981 71.061,28.0931 71.0556,28.0758 71.0488,28.067 71.0502,28.0609 71.0538,28.0701 71.0588,28.0606 71.0627,28.0615 71.0714,28.0679 71.0742,28.0628 71.0789,28.0675 71.0831,28.0648 71.0887,28.06 71.0891,28.055 71.088,28.0231 71.0808,28.0105 71.0759,28.0107 71.071,27.982 71.0563,27.9583 71.065,27.9759 71.073,27.9747 71.0764,27.978 71.0785,27.9824 71.0812,27.9824 71.084,27.9714 71.085,27.964 71.0836,27.9592 71.0739,27.9387 71.0681,27.93 71.0672,27.9243 71.0644,27.9349 71.062,27.9324 71.0605,27.9176 71.0577,27.9126 71.0521,27.8915 71.0467,27.8914 71.041,27.8741 71.0397,27.8672 71.0536,27.8581 71.0536,27.8523 71.0451,27.8469 71.0457,27.8358 71.0439,27.8469 71.0404,27.8508 71.0364,27.8423 71.0316,27.8385 71.0315,27.8368 71.0343,27.8393 71.0381,27.833 71.0383,27.8247 71.0337,27.8197 71.0334,27.8078 71.0417,27.8071 71.047,27.7927 71.0431,27.7847 71.0447,27.7978 71.0521,27.8097 71.0518,27.8139 71.0542,27.8103 71.0595,27.8138 71.0622,27.8018 71.0703,27.8016 71.0747,27.7839 71.0745,27.7875 71.0693,27.7709 71.0622,27.7589 71.0541,27.7421 71.0543,27.7311 71.05,27.7206 71.0531,27.7202 71.0604,27.7199 71.0666,27.7041 71.0629,27.6848 71.0616,27.6848 71.0646,27.7154 71.0766,27.7243 71.0839,27.7196 71.0904,27.7442 71.1037,27.7447 71.1087,27.755 71.1128,27.7391 71.1169,27.725 71.1143,27.708 71.117,27.682 71.123,27.6584 71.133,27.6456 71.1329,27.6383 71.1318,27.6368 71.1315,27.6331 71.128,27.6401 71.1136,27.6396 71.1033,27.6302 71.0994,27.6009 71.1066,27.5856 71.1073,27.5578 71.1034,27.502 71.0889,27.4947 71.0847,27.4882 71.0696,27.4814 71.0649,27.4937 71.052,27.494 71.0493,27.4946 71.044,27.5359 71.0344,27.5444 71.0292,27.5588 71.0249,27.5673 71.0192,27.568 71.0137,27.5569 71.0025,27.5575 70.9851,27.5528 70.9745,27.5562 70.9685,27.5644 70.9646,27.5614 70.961,27.544 70.9557,27.51 70.9598,27.5073 70.9633,27.5087 70.9651,27.5123 70.9696,27.5004 70.9841,27.4979 70.9938,27.512 71.0058,27.5102 71.0099,27.5003 71.0125,27.4699 71.0144,27.4491 71.0214,27.4361 71.0231,27.4052 71.023,27.3814 71.0174,27.3717 71.0179,27.3684 71.0278,27.3251 71.0348,27.3204 71.0361,27.2907 71.0442,27.2729 71.0462,27.252 71.0383,27.2355 71.0366,27.2283 71.0329,27.2151 71.0305,27.2107 71.0235,27.2011 71.0182,27.2023 71.0143,27.2092 71.0107,27.2502 71.0029,27.2691 70.9964,27.3005 70.9778,27.3044 70.9644,27.3057 70.9638,27.3187 70.9568,27.3473 70.9471,27.3372 70.946,27.33 70.948,27.3102 70.9471,27.2945 70.9491,27.257 70.9624,27.2319 70.9692,27.2128 70.9715,27.1907 70.9789,27.1548 70.9812,27.146 70.9798,27.1481 70.9701,27.1285 70.961,27.1266 70.9575,27.1249 70.9542,27.1289 70.9503,27.1269 70.9444,27.1203 70.9397,27.1045 70.9351,27.1025 70.9321,27.1241 70.9163,27.1421 70.9122,27.1696 70.9012,27.2047 70.8958,27.2725 70.8902,27.2941 70.8929,27.3178 70.89,27.337 70.8925,27.3423 70.8933,27.3947 70.9111,27.4113 70.9222,27.4156 70.9195,27.415 70.9143,27.4252 70.9129,27.4152 70.909,27.4182 70.9041,27.3667 70.8812,27.3675 70.8787,27.3757 70.878,27.3853 70.88,27.394 70.8784,27.4094 70.879,27.4246 70.8838,27.4605 70.8833,27.4614 70.8833,27.4744 70.885,27.4775 70.8836,27.4621 70.8776,27.4654 70.8736,27.457 70.8709,27.4739 70.8686,27.4954 70.868,27.5107 70.8649,27.5295 70.8648,27.5312 70.8632,27.51 70.8562,27.5114 70.8534,27.5025 70.8513,27.4966 70.8469,27.4649 70.8455,27.4398 70.8422,27.4461 70.8396,27.4636 70.837,27.4788 70.828,27.5166 70.8231,27.5216 70.8216,27.5413 70.816,27.5818 70.8138,27.6205 70.8098,27.667 70.8012,27.655 70.8003,27.6185 70.8016,27.5869 70.8033,27.5199 70.8106,27.5091 70.8091,27.4968 70.8101,27.4895 70.8146,27.4554 70.8146,27.4415 70.8176,27.366 70.8336,27.348 70.8309,27.3276 70.833,27.3018 70.8327,27.2922 70.8302,27.2852 70.8121,27.2928 70.7998,27.2768 70.7906,27.2812 70.7706,27.2724 70.7653,27.2758 70.7633,27.2773 70.7624,27.3118 70.7618,27.3256 70.7585,27.3525 70.755,27.3529 70.7536,27.3378 70.7515,27.3289 70.7366,27.3152 70.7345,27.3059 70.7304,27.2971 70.731,27.2957 70.7373,27.2704 70.7413,27.252 70.7519,27.2326 70.7519,27.2206 70.7481,27.2022 70.7494,27.1715 70.7486,27.1509 70.7491,27.126 70.7497,27.1159 70.7479,27.1041 70.7384,27.1 70.7259,27.0857 70.7173,27.0819 70.7094,27.074 70.7082,27.0662 70.7043,27.0756 70.6997,27.087 70.6983,27.1195 70.6982,27.1578 70.6872,27.1629 70.679,27.1744 70.6746,27.2014 70.6687,27.207 70.666,27.1884 70.6663,27.1419 70.6807,27.1162 70.6864,27.0984 70.687,27.087 70.6857,27.0822 70.6824,27.0866 70.6805,27.1172 70.6815,27.1331 70.6786,27.1603 70.667,27.1599 70.6656,27.1427 70.6686,27.1244 70.6736,27.1093 70.6673,27.0838 70.6645,27.082 70.6561,27.0797 70.6456,27.0825 70.6428,27.1032 70.6366,27.1091 70.6319,27.1285 70.6328,27.1484 70.6293,27.1897 70.6166,27.2058 70.6146,27.2394 70.6051,27.2441 70.5983,27.2538 70.5926,27.2743 70.5918,27.2811 70.5884,27.2676 70.5867,27.2478 70.5872,27.2279 70.5907,27.2252 70.5916,27.1972 70.6006,27.1796 70.602,27.1614 70.6008,27.1022 70.6069,27.079 70.6143,27.0702 70.6147,27.0594 70.6127,27.0579 70.615,27.0677 70.6189,27.0476 70.6249,27.0284 70.619,27.0408 70.6127,27.0346 70.6094,27.0159 70.6085,27.0049 70.6056,26.9829 70.593,26.9814 70.5922,26.9727 70.5901,26.9674 70.5911,26.9615 70.589,26.9696 70.5817,26.96 70.5755,26.989 70.5696,27.004 70.5692,27.0095 70.5627,27.0067 70.5559,26.9803 70.5515,26.9571 70.5518,26.9559 70.5493,26.9871 70.5319,26.9972 70.5245,27.0022 70.5157,27.0324 70.5095,27.0318 70.5076,27.0296 70.4997,27.0348 70.495,27.071 70.4852,27.0895 70.4884,27.0967 70.4871,27.1062 70.4805,27.1079 70.4727,27.1008 70.468,27.0932 70.468,27.0907 70.4754,27.067 70.4794,27.0336 70.4832,27.024 70.4829,26.9887 70.4714,26.9621 70.4588,26.9588 70.4586,26.9545 70.4583,26.9419 70.4632,26.9168 70.464,26.9155 70.4679,26.9422 70.4812,26.9444 70.4853,26.9371 70.4894,26.9316 70.4893,26.9199 70.4825,26.8947 70.4796,26.8444 70.4845,26.8393 70.4864,26.8405 70.4919,26.8325 70.4964,26.8214 70.499,26.7996 70.4828,26.7869 70.4842,26.779 70.4873,26.7711 70.4905,26.7519 70.4903,26.7501 70.4882,26.7564 70.4854,26.7473 70.4812,26.749 70.4793,26.759 70.4777,26.7614 70.4729,26.7779 70.4698,26.7639 70.4651,26.7583 70.4508,26.7687 70.4448,26.7561 70.4396,26.734 70.4383,26.7307 70.4354,26.7405 70.4265,26.735 70.4227,26.7215 70.4198,26.7085 70.4199,26.6998 70.4173,26.6912 70.4182,26.6863 70.4245,26.6731 70.4219,26.6667 70.4254,26.653 70.4289,26.6405 70.4276,26.6374 70.4324,26.6293 70.4329,26.6198 70.4299,26.6102 70.4189,26.5925 70.4085,26.614 70.4,26.622 70.4024,26.626 70.4018,26.6221 70.3957,26.6278 70.3867,26.6075 70.3839,26.5924 70.3866,26.5858 70.3878,26.5811 70.3916,26.5839 70.3954,26.5793 70.3962,26.5602 70.3857,26.5433 70.3821,26.5374 70.3763,26.5243 70.372,26.5153 70.3603,26.5143 70.351,26.5036 70.3521,26.4841 70.3606,26.4777 70.3625,26.4817 70.3659,26.4754 70.3719,26.5001 70.3806,26.4949 70.3855,26.501 70.3929,26.525 70.3972,26.5325 70.4007,26.5233 70.4242,26.5141 70.4262,26.516 70.4326,26.5262 70.436,26.5168 70.4403,26.518 70.4433,26.5307 70.4563,26.5643 70.4639,26.5657 70.4642,26.5744 70.4739,26.5947 70.4839,26.5894 70.4884,26.5633 70.4912,26.5589 70.4929,26.5619 70.5018,26.5554 70.507,26.5551 70.5161,26.5589 70.5218,26.6183 70.5561,26.6089 70.5607,26.6123 70.5709,26.6101 70.5722,26.6067 70.5742,26.6178 70.5925,26.6283 70.6003,26.6251 70.6088,26.6299 70.6158,26.6268 70.6207,26.6156 70.6271,26.6346 70.6324,26.6437 70.647,26.6291 70.6501,26.6246 70.6552,26.6124 70.6598,26.6061 70.6627,26.6142 70.6689,26.6308 70.6693,26.638 70.6744,26.636 70.682,26.6236 70.6818,26.605 70.6751,26.5838 70.6758,26.5778 70.6734,26.5798 70.6695,26.5922 70.6623,26.5877 70.6604,26.5694 70.6621,26.5267 70.6697,26.5144 70.6702,26.4247 70.6588,26.3604 70.6505,26.3424 70.6498,26.3235 70.652,26.3297 70.656,26.3848 70.6672,26.4093 70.6802,26.4379 70.6855,26.4587 70.686,26.5162 70.6944,26.5355 70.6979,26.5631 70.707,26.6224 70.7216,26.6526 70.7308,26.6801 70.7439,26.6895 70.7526,26.6894 70.7538,26.6893 70.7585,26.6774 70.7686,26.6801 70.7752,26.6899 70.7862,26.7162 70.7995,26.7191 70.8034,26.7167 70.819,26.7217 70.823,26.7328 70.8232,26.7388 70.8253,26.7325 70.8321,26.7356 70.8371,26.7268 70.8416,26.6957 70.8359,26.6714 70.8291,26.6546 70.8305,26.6516 70.8307,26.6492 70.8326,26.6651 70.8356,26.6713 70.8387,26.6637 70.8428,26.675 70.8505,26.6722 70.8536,26.6616 70.8563,26.6689 70.8582,26.6725 70.862,26.6841 70.8647,26.7139 70.8844,26.7182 70.8989,26.7309 70.9096,26.7288 70.9133,26.7159 70.915,26.7062 70.9189,26.7085 70.9232,26.7262 70.9349,26.7252 70.936,26.7171 70.9447,26.7015 70.9471,26.6989 70.9554,26.686 70.9641,26.6761 70.9671,26.6619 70.9628,26.6449 70.9614,26.6296 70.9553,26.6152 70.9531,26.5909 70.9541,26.58 70.952,26.5645 70.9514,26.5431 70.9455,26.4965 70.9286,26.4716 70.9172,26.4207 70.8936,26.4262 70.8894,26.4201 70.8868,26.4003 70.8849,26.3355 70.8586,26.3162 70.848,26.3065 70.8372,26.2915 70.835,26.2782 70.8302,26.2696 70.8249,26.2691 70.8183,26.2474 70.8139,26.2246 70.7986,26.2223 70.7925,26.2207 70.7882,26.2026 70.7842,26.196 70.7784,26.1682 70.778,26.1333 70.7686,26.1258 70.7651,26.136 70.7599,26.1374 70.7557,26.1232 70.7498,26.1237 70.745,26.1118 70.7357,26.1128 70.7295,26.1027 70.7189,26.0955 70.7175,26.088 70.7183,26.0904 70.7237,26.0706 70.7294,26.0629 70.7291,26.0488 70.7236,26.0466 70.7227,26.0217 70.7061,26.0272 70.7018,26.0389 70.7014,26.0428 70.6997,26.0407 70.6956,26.0229 70.688,26.018 70.6837,26.019 70.6771,26.0122 70.6736,26.0024 70.66,25.971 70.633,25.9709 70.6279,25.9796 70.6177,25.9782 70.6103,25.9288 70.5928,25.9094 70.5792,25.8873 70.5755,25.8654 70.5746,25.8011 70.5446,25.7719 70.5282,25.7535 70.5242,25.7416 70.5182,25.6738 70.4991,25.6627 70.4938,25.6598 70.4833,25.6525 70.4754,25.6332 70.4648,25.6127 70.4599,25.6074 70.4563,25.6155 70.4415,25.6021 70.4381,25.6014 70.4376,25.5749 70.4196,25.5642 70.4161,25.5533 70.4161,25.5449 70.4144,25.5372 70.4083,25.5403 70.4058,25.549 70.4047,25.5543 70.3994,25.5426 70.398,25.5367 70.3901,25.5331 70.3887,25.5168 70.3938,25.5062 70.4004,25.4973 70.3998,25.4936 70.3981,25.4953 70.391,25.4892 70.386,25.4633 70.3757,25.4689 70.3715,25.4656 70.3674,25.4489 70.3703,25.4411 70.3717,25.4365 70.3679,25.441 70.3617,25.4274 70.3562,25.4337 70.3529,25.4346 70.3492,25.4246 70.3455,25.3967 70.34,25.3878 70.3337,25.3789 70.3332,25.3752 70.3312,25.3777 70.3295,25.3948 70.3309,25.3993 70.3285,25.3914 70.3254,25.3953 70.324,25.4318 70.3232,25.4562 70.3137,25.4656 70.3131,25.4719 70.3148,25.5253 70.3185,25.5332 70.3168,25.5184 70.3127,25.4861 70.2899,25.4885 70.2873,25.5031 70.2857,25.477 70.2724,25.4492 70.2667,25.4332 70.2583,25.4054 70.2528,25.4022 70.2489,25.4064 70.2452,25.397 70.2408,25.395 70.2358,25.402 70.2327,25.4014 70.2279,25.3901 70.2192,25.3879 70.2181,25.3605 70.2044,25.3297 70.1952,25.3202 70.1892,25.31 70.1889,25.299 70.1971,25.294 70.1953,25.2874 70.1858,25.2898 70.1835,25.2735 70.1764,25.282 70.1694,25.2711 70.1634,25.273 70.1568,25.245 70.1426,25.246 70.1398,25.2462 70.1309,25.2299 70.1079,25.2315 70.0987,25.2202 70.0945,25.1915 70.0899,25.1691 70.082,25.1516 70.0702,25.142 70.0678,25.1246 70.0685,25.0866 70.0807,25.0716 70.09,25.0701 70.0945,25.0686 70.0987,25.0725 70.109,25.0701 70.1117,25.0579 70.1103,25.0555 70.1133,25.0655 70.1182,25.0895 70.117,25.105 70.1177,25.1147 70.126,25.1271 70.1228,25.1317 70.1278,25.1434 70.1249,25.1454 70.1303,25.1371 70.1334,25.1387 70.1359,25.1301 70.1367,25.1293 70.1413,25.1187 70.1367,25.1053 70.1373,25.0868 70.1286,25.0666 70.1223,25.0587 70.1233,25.0577 70.1266,25.0548 70.1362,25.0703 70.1423,25.0805 70.1436,25.0823 70.1582,25.0738 70.161,25.0691 70.1547,25.0561 70.1469,25.0459 70.1463,25.0419 70.1521,25.0282 70.1555,25.0055 70.151,25 70.1476,24.999 70.147,24.9944 70.1306,24.9862 70.1287,24.9867 70.1154,24.9804 70.1076,24.9781 70.1048,24.9872 70.0964,25 70.0936,25.0238 70.0884,25.0301 70.0846,25.025 70.0754,25.028 70.0659,25.0174 70.0613,25.009 70.0582,25.0113 70.0543,25 70.0541,24.9959 70.054,24.9805 70.0485,24.9703 70.0526,24.9786 70.055,24.9923 70.0696,24.994 70.0735,24.9897 70.0765,24.9839 70.0784,24.9764 70.0774,24.976 70.0641,24.9704 70.0623,24.9667 70.0656,24.9672 70.0791,24.9622 70.0821,24.9314 70.0823,24.927 70.0785,24.9184 70.0802,24.9099 70.0881,24.9238 70.1231,24.9131 70.1358,24.9113 70.1438,24.8991 70.1552,24.9212 70.1606,24.9356 70.1693,24.9546 70.177,24.9342 70.1871,24.9196 70.2015,24.9228 70.206,24.9373 70.2092,24.9396 70.2113,24.9394 70.2215,24.9334 70.2221,24.9392 70.2325,24.9548 70.2389,25 70.2515,25.0217 70.2575,25.0238 70.2597,25.0278 70.2638,25.0395 70.2657,25.063 70.264,25.0753 70.2652,25.0836 70.2726,25.1139 70.2831,25.1047 70.2913,25.117 70.2973,25.1222 70.2906,25.1316 70.29,25.1418 70.296,25.1565 70.294,25.1763 70.3012,25.1698 70.3034,25.1764 70.3078,25.1687 70.3166,25.1812 70.3244,25.1736 70.3313,25.1535 70.3365,25.1434 70.3371,25.0736 70.3203,25.0452 70.32,25.0442 70.3232,25.0675 70.3311,25.0735 70.336,25.0694 70.342,25.0741 70.3467,25.1069 70.3607,25.1059 70.3632,25.0963 70.3629,25.0849 70.358,25.0697 70.3559,25.0508 70.3562,25.0464 70.3542,25.0389 70.3593,25.0589 70.3682,25.083 70.3706,25.0916 70.3746,25.0913 70.3773,25.1078 70.3908,25.136 70.4043,25.1522 70.4094,25.1748 70.4102,25.1791 70.4063,25.1684 70.3973,25.1703 70.3961,25.1806 70.3966,25.1981 70.4007,25.2115 70.3932,25.2215 70.3924,25.2302 70.3966,25.2427 70.3983,25.2408 70.4049,25.249 70.4105,25.2459 70.4128,25.2168 70.4146,25.2056 70.4171,25.2003 70.4173,25.1819 70.4181,25.1689 70.4231,25.1693 70.4267,25.2014 70.4379,25.2167 70.4457,25.2201 70.4516,25.2306 70.4537,25.2356 70.4607,25.2306 70.4644,25.2402 70.4648,25.2529 70.4625,25.2567 70.4659,25.2766 70.4715,25.2579 70.4748,25.249 70.4692,25.2306 70.4699,25.2297 70.4791,25.2199 70.482,25.1932 70.4814,25.192 70.4813,25.149 70.4779,25.1094 70.4778,25.0832 70.475,25.0703 70.4815,25.079 70.4862,25.062 70.4926,25.0644 70.4949,25.0726 70.495,25.0755 70.4965,25.0706 70.5014,25.0424 70.5061,25.0414 70.5084,25.0732 70.5174,25.1033 70.535,25.122 70.5386,25.1412 70.5422,25.1935 70.5607,25.2322 70.5686,25.2437 70.5725,25.2497 70.5765,25.2473 70.5798,25.2548 70.5902,25.2929 70.5981,25.3384 70.6147,25.3614 70.629,25.3646 70.631,25.3445 70.6297,25.3534 70.6348,25.3799 70.642,25.3802 70.6445,25.3684 70.6488,25.3954 70.655,25.4102 70.663,25.4113 70.6657,25.3954 70.6701,25.397 70.6721,25.4121 70.6714,25.424 70.673,25.444 70.6727,25.4596 70.6759,25.4855 70.6837,25.5006 70.6933,25.5112 70.6945,25.5214 70.6989,25.5252 70.7039,25.5274 70.7068,25.5444 70.7047,25.5513 70.7053,25.5758 70.7168,25.611 70.726,25.6276 70.7358,25.6477 70.7405,25.6577 70.7383,25.6616 70.7272,25.6692 70.7267,25.6837 70.7315,25.6891 70.7355,25.6836 70.7449,25.6959 70.7573,25.6943 70.7605,25.6882 70.7615,25.6726 70.7545,25.6631 70.7558,25.6561 70.755,25.6212 70.7435,25.6144 70.7442,25.6134 70.7518,25.6058 70.7519,25.5978 70.7491,25.5904 70.751,25.6051 70.7563,25.6092 70.7608,25.6068 70.7631,25.63 70.7755,25.6543 70.7801,25.6803 70.7822,25.6968 70.7865,25.7142 70.7819,25.7316 70.7871,25.7489 70.7868,25.7618 70.79,25.7677 70.7967,25.7562 70.812,25.7732 70.8186,25.778 70.8272,25.7936 70.8286,25.809 70.8301,25.8135 70.832,25.8128 70.8362,25.8317 70.837,25.8383 70.8394,25.8347 70.8426,25.8738 70.8524,25.8966 70.8603,25.9077 70.8688,25.9047 70.8757,25.8916 70.8764,25.86 70.8705,25.8342 70.8703,25.8319 70.8733,25.835 70.8755,25.8547 70.877,25.8648 70.8832,25.8839 70.8893,25.8847 70.894,25.8849 70.8957,25.8924 70.8989,25.8809 70.9012,25.8698 70.8971,25.8516 70.8962,25.8476 70.8975,25.8594 70.9018,25.8591 70.9041,25.8261 70.9026,25.7977 70.8995,25.766 70.8927,25.7525 70.8916,25.7546 70.8789,25.7433 70.868,25.726 70.8639,25.723 70.8674,25.7329 70.8768,25.7306 70.8801,25.7212 70.8827,25.7176 70.8864,25.6829 70.892,25.6944 70.8941,25.7147 70.8945,25.7113 70.9046,25.7002 70.9091,25.6769 70.9118,25.6366 70.9083,25.6208 70.9097,25.6122 70.9087,25.5834 70.9006,25.573 70.8977,25.5552 70.8857,25.5248 70.8731,25.4977 70.8585,25.4878 70.8625,25.4909 70.8648,25.5073 70.8768,25.5021 70.8799,25.4937 70.8791,25.4843 70.8669,25.4661 70.8613,25.4491 70.849,25.4374 70.8455,25.4306 70.8463,25.4276 70.8498,25.4393 70.8589,25.42 70.8599,25.4078 70.8571,25.3966 70.8566,25.3941 70.8587,25.4136 70.8643,25.4241 70.8697,25.4659 70.8819,25.4924 70.8896,25.5306 70.9039,25.5503 70.9145,25.5407 70.9204,25.5143 70.926,25.4991 70.937,25.4839 70.9432,25.4514 70.9503,25.4377 70.9622,25.4262 70.9653,25.3822 70.97,25.3759 70.9706,25.3627 70.9658,25.3544 70.9668,25.3629 70.9724,25.3592 70.9761,25.3431 70.9814,25.3249 70.9814,25.3064 70.9787,25.2942 70.9714,25.3035 70.9466,25.3078 70.9424,25.3329 70.937,25.3572 70.9255,25.3597 70.9133,25.3804 70.9059,25.381 70.9057,25.3952 70.8923,25.3933 70.8889,25.3748 70.8855,25.3693 70.8812,25.3578 70.8787,25.3546 70.8757,25.3593 70.8638,25.3536 70.8632,25.3367 70.8664,25.3241 70.8662,25.3203 70.8637,25.3254 70.8604,25.3561 70.8554,25.3569 70.8515,25.3378 70.8331,25.3243 70.8307,25.331 70.824,25.3324 70.8135,25.3261 70.8134,25.3142 70.8179,25.3047 70.8244,25.2933 70.8278,25.2857 70.8279,25.2804 70.8245,25.282 70.8211,25.2636 70.8129,25.2521 70.8154,25.2465 70.8148,25.2412 70.8116,25.2387 70.8025,25.2271 70.799,25.2245 70.8057,25.2307 70.8164,25.2384 70.822,25.2415 70.8246,25.2355 70.8371,25.2388 70.8516,25.2321 70.8593,25.2304 70.8734,25.2138 70.8796,25.2045 70.8941,25.1843 70.9045,25.1794 70.905,25.1684 70.9006,25.1561 70.9019,25.1522 70.9042,25.1548 70.9083,25.1335 70.9168,25.1231 70.9245,25.1143 70.931,25.1048 70.9272,25.1005 70.9204,25.0942 70.9208,25.089 70.9238,25.0447 70.9091,25.0418 70.9021,25.0166 70.8891,25.0132 70.8844,25.0238 70.8678,25.0147 70.8673,25.0047 70.8715,25 70.8719,24.9944 70.8723,24.9817 70.8707,24.9683 70.8752,24.9557 70.8749,24.9464 70.8722,24.9371 70.8766,24.9318 70.8791,24.92 70.879,24.8958 70.8743,24.8848 70.8751,24.8886 70.8784,24.9136 70.8841,24.934 70.8918,24.9558 70.9054,25 70.9228,25.0121 70.9276,25.0321 70.9376,25.0486 70.9529,25.0449 70.9568,25.0348 70.9599,25.0323 70.9601,25.0188 70.961,25.025 70.9662,25.0199 70.9701,25 70.9761,24.9936 70.978,24.9823 70.9775,24.9743 70.9751,24.9507 70.9761,24.9491 70.9745,24.9621 70.9659,24.9454 70.9549,24.9379 70.9445,24.9233 70.939,24.9098 70.9364,24.9461 70.9241,24.9471 70.9209,24.9141 70.9188,24.9046 70.9155,24.9038 70.9135,24.9018 70.9091,24.8906 70.9086,24.8848 70.9127,24.8886 70.9157,24.9067 70.9214,24.8979 70.9242,24.8966 70.9306,24.8747 70.9284,24.8713 70.9227,24.8592 70.921,24.8482 70.9159,24.8246 70.9167,24.8055 70.9144,24.7958 70.9152,24.7906 70.9187,24.7952 70.9223,24.8079 70.9233,24.8384 70.9215,24.8406 70.9231,24.8252 70.929,24.826 70.9358,24.8126 70.9457,24.8049 70.9475,24.7881 70.9468,24.782 70.9484,24.7755 70.9531,24.7823 70.9583,24.7567 70.9675,24.7573 70.9732,24.7697 70.9842,24.7645 70.9879,24.7671 70.9929,24.7381 70.99,24.7263 70.9838,24.7073 70.9833,24.6705 70.9646,24.668 70.9746,24.6771 70.9816,24.6758 70.9825,24.6712 70.9858,24.692 70.9906,24.6811 70.9934,24.6335 70.9933,24.5783 70.9795,24.5572 70.9786,24.5415 70.9755,24.5314 70.9718,24.5366 70.9683,24.5596 70.9669,24.5667 70.9616,24.5764 70.9608,24.5935 70.9633,24.6278 70.9639,24.6423 70.9626,24.6421 70.9608,24.6169 70.9602,24.6134 70.9602,24.5879 70.9566,24.5481 70.9565,24.5416 70.9541,24.5391 70.9498,24.5447 70.9429,24.54 70.9374,24.5446 70.9306,24.5428 70.9266,24.56 70.9203,24.5825 70.9226,24.5949 70.9209,24.611 70.9216,24.6122 70.9196,24.5928 70.9134,24.5773 70.9119,24.5439 70.9048,24.5443 70.9025,24.5815 70.8978,24.6177 70.8907,24.6552 70.8899,24.6648 70.8877,24.6988 70.8736,24.6965 70.8716,24.6838 70.8697,24.6772 70.8659,24.6224 70.8749,24.6178 70.8743,24.6111 70.8735,24.5868 70.8733,24.5786 70.8679,24.5592 70.8686,24.5541 70.8663,24.5702 70.8527,24.5758 70.8392,24.5882 70.8381,24.589 70.8322,24.5683 70.8331,24.5698 70.8267,24.5896 70.8235,24.6049 70.824,24.6157 70.8207,24.6213 70.8147,24.624 70.806,24.6202 70.7965,24.608 70.7916,24.5999 70.7873,24.5929 70.7863,24.5676 70.7899,24.563 70.7925,24.5654 70.7957,24.5483 70.7979,24.5384 70.803,24.4979 70.8156,24.4623 70.82,24.4457 70.8207,24.4384 70.8248,24.4234 70.828,24.4365 70.8345,24.4339 70.8365,24.4257 70.8373,24.4393 70.8422,24.4261 70.8505,24.4107 70.8486,24.4017 70.8494,24.3911 70.8477,24.3871 70.8486,24.3869 70.8492,24.3844 70.8585,24.3925 70.8636,24.3887 70.8671,24.3661 70.8717,24.356 70.8759,24.3435 70.8762,24.3128 70.8665,24.3126 70.8635,24.3218 70.8579,24.3423 70.8532,24.3338 70.8512,24.3207 70.8531,24.3106 70.856,24.3067 70.8597,24.2977 70.8602,24.2305 70.8369,24.2409 70.8326,24.2621 70.824,24.2592 70.8138,24.2671 70.8087,24.2512 70.8011,24.2398 70.779,24.2436 70.7754,24.2558 70.7716,24.3053 70.7679,24.3113 70.7654,24.3091 70.7638,24.3159 70.7621,24.3258 70.7652,24.3622 70.7619,24.3642 70.7603,24.3495 70.7586,24.3482 70.7518,24.3548 70.7514,24.4562 70.7448,24.4722 70.7467,24.5054 70.7459,24.5162 70.7508,24.5231 70.7512,24.5268 70.7463,24.5349 70.7442,24.5174 70.7419,24.5268 70.7388,24.523 70.7347,24.5255 70.7317,24.5094 70.7303,24.5072 70.729,24.5208 70.7261,24.528 70.7217,24.5554 70.7198,24.5675 70.7165,24.5595 70.7122,24.5501 70.7129,24.5403 70.7135,24.5419 70.7081,24.5486 70.7062,24.5722 70.7073,24.5784 70.715,24.584 70.7154,24.6014 70.7095,24.6273 70.7064,24.6324 70.7026,24.6597 70.696,24.6153 70.6968,24.5972 70.6947,24.5877 70.6891,24.6101 70.6854,24.6269 70.674,24.6428 70.6681,24.6574 70.6552,24.6809 70.6497,24.6813 70.6465,24.6741 70.6434,24.6881 70.6395,24.6912 70.6354,24.6879 70.63,24.6652 70.6236,24.6404 70.6157,24.6232 70.6126,24.6073 70.6128,24.6006 70.6155,24.5954 70.6267,24.5746 70.6315,24.5581 70.6385,24.5569 70.641,24.5664 70.6468,24.5625 70.6489,24.535 70.6563,24.5193 70.6581,24.4999 70.6644,24.474 70.6675,24.4682 70.6712,24.4663 70.681,24.4563 70.6845,24.4285 70.6825,24.4114 70.6834,24.3988 70.6814,24.3955 70.6829,24.3959 70.6835,24.3994 70.6878,24.3786 70.6869,24.365 70.6886,24.3501 70.6838,24.3483 70.6867,24.3643 70.6975,24.3624 70.6994,24.3428 70.6952,24.336 70.688,24.3232 70.6842,24.3192 70.685,24.3182 70.6895,24.3128 70.6914,24.2938 70.6873,24.2915 70.6836,24.276 70.6797,24.2701 70.6751,24.2832 70.6661,24.2796 70.6641,24.2499 70.6635,24.2427 70.6597,24.2381 70.6536,24.2281 70.6404,24.233 70.6328,24.225 70.6183,24.233 70.6068,24.23 70.6027,24.2124 70.6063,24.2021 70.6061,24.1936 70.6023,24.1882 70.5944,24.1748 70.5906,24.1773 70.5867,24.1655 70.5759,24.125 70.566,24.102 70.5513,24.0957 70.5397,24.1261 70.5345,24.1405 70.5348,24.1533 70.5313,24.1804 70.5281,24.1903 70.5249,24.2004 70.5217,24.2268 70.5183,24.2449 70.514,24.2764 70.4975,24.2971 70.4921,24.3105 70.4796,24.3145 70.4711,24.3085 70.4646,24.3241 70.4544,24.3204 70.4517,24.2961 70.4544,24.2842 70.4586,24.2765 70.4646,24.2718 70.4823,24.2644 70.4843,24.2554 70.4826,24.2385 70.4842,24.2241 70.4831,24.2211 70.4884,24.1924 70.488,24.1577 70.4894,24.1252 70.4943,24.1021 70.4952,24.089 70.5033,24.0386 70.5146,24.0104 70.513,23.9894 70.5054,23.9822 70.5101,23.9659 70.5116,23.952 70.5111,23.9488 70.511,23.9114 70.5031,23.8812 70.501,23.8626 70.4979,23.8263 70.485,23.8084 70.4819,23.7901 70.4722,23.7763 70.4691,23.7717 70.4595,23.7882 70.4503,23.7811 70.4449,23.7744 70.447,23.7739 70.4504,23.7664 70.4507,23.7601 70.4466,23.7313 70.4416,23.7209 70.4398,23.6891 70.4308,23.6655 70.4223,23.6529 70.4144,23.6453 70.4122,23.6256 70.4114,23.6159 70.4078,23.6115 70.4028,23.5928 70.3949,23.5904 70.3876,23.4828 70.3538,23.4783 70.3524,23.4526 70.3383,23.4342 70.3161,23.4361 70.3138,23.4421 70.3128,23.4839 70.3245,23.5017 70.3283,23.5098 70.3278,23.511 70.3248,23.4884 70.3174,23.4724 70.3074,23.4757 70.3056,23.4871 70.3033,23.5255 70.3003,23.5435 70.295,23.5993 70.3024,23.606 70.2996,23.597 70.2958,23.5772 70.2925,23.5474 70.2906,23.533 70.2852,23.4837 70.2866,23.4528 70.2916,23.4406 70.2912,23.412 70.2858,23.3788 70.2828,23.3713 70.2798,23.3745 70.2766,23.4007 70.2715,23.4128 70.2708,23.4201 70.2673,23.4166 70.265,23.3915 70.2664,23.3749 70.2673,23.3594 70.2694,23.3092 70.2618,23.2795 70.2615,23.2501 70.2511,23.2722 70.2442,23.3086 70.2452,23.3301 70.2426,23.3668 70.249,23.3903 70.2467,23.3991 70.2475,23.3966 70.2526,23.4235 70.2495,23.4259 70.2495,23.4417 70.2501,23.4551 70.247,23.503 70.2475,23.5117 70.2456,23.4987 70.2427,23.4462 70.2437,23.4332 70.2389,23.4109 70.2381,23.4033 70.2322,23.3917 70.2295,23.3655 70.231,23.3142 70.2292,23.2965 70.224,23.2601 70.2235,23.2156 70.223,23.2062 70.2241,23.1959 70.2185,23.1805 70.2192,23.1804 70.2174,23.2059 70.212,23.2044 70.2077,23.2083 70.2036,23.2283 70.1962,23.2538 70.1927,23.2718 70.1871,23.3356 70.1844,23.3591 70.1847,23.3751 70.1805,23.3272 70.1769,23.2828 70.1764,23.2761 70.1741,23.2832 70.1677,23.273 70.1629,23.2996 70.1555,23.3466 70.1352,23.3824 70.1234,23.373 70.121,23.3735 70.1187,23.3809 70.1182,23.3605 70.1103,23.3535 70.1023,23.3455 70.1019,23.3262 70.1075,23.318 70.1023,23.2813 70.1051,23.2276 70.1035,23.2169 70.1017,23.204 70.0963,23.1912 70.0943,23.1792 70.0946,23.1663 70.0905,23.1456 70.0906,23.1408 70.0881,23.1481 70.083,23.1822 70.0712,23.1845 70.0704,23.1857 70.0642,23.2202 70.0542,23.2234 70.0499,23.238 70.0453,23.2593 70.0438,23.2871 70.0369,23.3085 70.0349,23.3229 70.0285,23.3647 70.0215,23.3721 70.0217,23.3823 70.0266,23.3903 70.0277,23.4109 70.0256,23.435 70.0271,23.4743 70.027,23.4958 70.027,23.5216 70.0223,23.5294 70.0172,23.5077 70,23.4949 69.9898,23.4652 69.979,23.4586 69.9822,23.4298 69.9782,23.4169 69.9719,23.4123 69.9726,23.4002 69.969,23.3942 69.9684,23.3829 69.9707,23.391 69.9736,23.3686 69.9806,23.3533 69.9816,23.3339 69.9789,23.324 69.979,23.3061 69.9841,23.3016 69.9884,23.2924 69.9914,23.2717 69.9922,23.2677 69.9904,23.2661 69.9815,23.2594 69.9792,23.2552 69.9749,23.2452 69.9733,23.2464 69.9688,23.2337 69.9659,23.2202 69.9597,23.2035 69.958,23.194 69.953,23.1868 69.952,23.1728 69.9549,23.1634 69.9524,23.1251 69.9329,23.1157 69.9311,23.0952 69.9339,23.0966 69.9373,23.1072 69.938,23.1126 69.9423,23.1107 69.9453,23.1001 69.9462,23.0914 69.9449,23.0727 69.9394,23.0634 69.9388,23.0519 69.9299,23.0312 69.9249,23.0192 69.9229,23.022 69.9305,23.0361 69.9391,23.0515 69.9429,23.0596 69.9484,23.0997 69.9563,23.1204 69.9624,23.1278 69.9628,23.139 69.9598,23.1457 69.9607,23.1379 69.968,23.1427 69.9767,23.1395 69.9817,23.1309 69.9824,23.1182 69.9793,23.1082 69.9798,23.1016 69.9823,23.104 70,23.1002 70.0053,23.0801 70.0333,23.0667 70.0335,23.0397 70.0172,23.0137 70.0213,22.9992 70.0296,22.9719 70.0344,22.9753 70.0369,22.9727 70.0408,22.958 70.0441,22.9597 70.0446,22.9641 70.0461,22.9821 70.0474,22.9965 70.0632,22.9854 70.0812,22.9945 70.1033,22.9914 70.1173,22.9958 70.1367,22.9904 70.1394,22.979 70.1399,22.9622 70.137,22.9446 70.1281,22.94 70.1267,22.9237 70.1218,22.8949 70.1179,22.8867 70.1097,22.8746 70.1056,22.8364 70.0998,22.7941 70.0955,22.7492 70.093,22.7372 70.0915,22.7144 70.0839,22.6976 70.0814,22.622 70.0739,22.5946 70.0712,22.5478 70.0696,22.5237 70.0664,22.4689 70.0628,22.4148 70.0609,22.3535 70.0462,22.3089 70.0313,22.3009 70.0304,22.2929 70.0327,22.2787 70.0397,22.2913 70.045,22.3173 70.0517,22.3293 70.051,22.3607 70.0572,22.368 70.0616,22.3659 70.0654,22.3732 70.0695,22.414 70.0746,22.4474 70.0831,22.4607 70.0833,22.4882 70.0785,22.515 70.0776,22.5779 70.0806,22.5845 70.0815,22.61 70.0849,22.6455 70.0959,22.6582 70.0956,22.6716 70.0931,22.689 70.0938,22.7151 70.0997,22.7855 70.1042,22.8137 70.108,22.8345 70.1148,22.8144 70.1165,22.8071 70.119,22.8426 70.1224,22.8756 70.1323,22.8953 70.1497,22.9161 70.1537,22.9048 70.1617,22.9089 70.1665,22.9304 70.161,22.9391 70.1614,22.9581 70.1737,22.9725 70.1906,22.958 70.2009,22.9532 70.2043,22.9452 70.2059,22.8954 70.2101,22.8442 70.2098,22.8307 70.2073,22.8058 70.208,22.7924 70.2128,22.7823 70.2144,22.7594 70.2154,22.7372 70.2197,22.7244 70.2179,22.7143 70.2182,22.678 70.2241,22.6443 70.2239,22.6284 70.2154,22.6267 70.2146,22.6187 70.2125,22.6012 70.2123,22.5769 70.2075,22.5722 70.2091,22.6018 70.2189,22.6099 70.2255,22.6072 70.228,22.562 70.2367,22.5526 70.2365,22.5196 70.228,22.5115 70.2299,22.5236 70.2406,22.5229 70.2438,22.5087 70.2509,22.4959 70.2518,22.4831 70.2497,22.4689 70.2506,22.4611 70.2537,22.4499 70.2581,22.4304 70.2604,22.3696 70.2617,22.354 70.2654,22.3487 70.2624,22.3455 70.2439,22.3544 70.2348,22.3504 70.2343,22.3362 70.2373,22.3261 70.2352,22.3234 70.2318,22.3305 70.2099,22.3259 70.1925,22.3254 70.1905,22.3134 70.179,22.2994 70.1747,22.3082 70.1706,22.3029 70.1678,22.2881 70.1662,22.2895 70.1628,22.3003 70.1585,22.3131 70.1567,22.4333 70.1531,22.4945 70.1374,22.5162 70.1302,22.5516 70.1183,22.553 70.116,22.5443 70.1151,22.5235 70.1212,22.5141 70.1214,22.5014 70.118,22.4926 70.1244,22.4819 70.1274,22.3999 70.1419,22.3321 70.1414,22.3255 70.1327,22.3155 70.1302,22.3168 70.135,22.315 70.1354,22.3114 70.1364,22.2872 70.1356,22.2664 70.1393,22.2563 70.1386,22.2202 70.1305,22.2122 70.1309,22.204 70.135,22.1886 70.1366,22.1859 70.1387,22.1959 70.1419,22.2381 70.1463,22.2494 70.1534,22.246 70.1554,22.2332 70.1545,22.2318 70.1572,22.2424 70.1657,22.2422 70.1771,22.2581 70.1924,22.2696 70.2246,22.2656 70.2274,22.2581 70.2278,22.2313 70.2207,22.2246 70.2202,22.2225 70.2227,22.2318 70.2291,22.2479 70.2351,22.2641 70.236,22.2633 70.2404,22.274 70.2468,22.2618 70.2506,22.2743 70.2675,22.2909 70.2819,22.2923 70.2831,22.2882 70.2867,22.27 70.2858,22.2327 70.2933,22.1529 70.2936,22.1354 70.2892,22.1315 70.2826,22.133 70.2762,22.1175 70.2766,22.1107 70.275,22.1035 70.269,22.0987 70.2444,22.078 70.2368,22.0712 70.2378,22.0705 70.2379,22.0677 70.2411,22.0789 70.2512,22.0833 70.264,22.0796 70.2779,22.0821 70.2847,22.0928 70.2916,22.0906 70.2968,22.0965 70.3035,22.0917 70.3083,22.0657 70.3185,22.0576 70.3175,22.0254 70.3072,21.9913 70.2931,21.9846 70.2913,21.9726 70.2881,21.9645 70.2878,21.9498 70.2807,21.9458 70.2807,21.9436 70.2848,21.9541 70.293,21.9929 70.3071,21.9986 70.3221,21.995 70.3278,21.9902 70.3303,21.9732 70.333,21.938 70.332,21.9187 70.3221,21.8879 70.3115,21.8772 70.3064,21.8228 70.2807,21.7848 70.2677,21.7818 70.2591,21.7732 70.254,21.7564 70.2526,21.7551 70.251,21.7654 70.2469,21.7862 70.2326,21.8155 70.2245,21.8399 70.2203,21.8595 70.2201,21.8649 70.2178,21.8576 70.2149,21.8253 70.2145,21.818 70.2122,21.8128 70.2074,21.8199 70.1976,21.8162 70.1884,21.855 70.1756,21.8578 70.1726,21.8475 70.16,21.8492 70.1568,21.8533 70.1486,21.8488 70.1438,21.8394 70.1447,21.8249 70.1725,21.8195 70.1741,21.8074 70.1738,21.7822 70.1819,21.768 70.2161,21.7583 70.2217,21.7414 70.2246,21.732 70.2244,21.7159 70.2209,21.709 70.2254,21.715 70.227,21.7153 70.2353,21.6963 70.2374,21.684 70.242,21.6735 70.2494,21.6469 70.2557,21.6391 70.2648,21.6316 70.2666,21.6067 70.2644,21.5974 70.2753,21.5664 70.2866,21.5553 70.2929,21.5431 70.2933,21.5348 70.2966,21.5495 70.2999,21.5592 70.3122,21.5654 70.3201,21.5625 70.3242,21.5542 70.3264,21.5275 70.3206,21.4984 70.3193,21.4838 70.3139,21.4661 70.3031,21.4824 70.2911,21.4842 70.2827,21.4767 70.2705,21.4864 70.2535,21.4809 70.2443,21.4658 70.2375,21.4651 70.2371,21.4661 70.2307,21.4617 70.225,21.4934 70.2113,21.4793 70.2103,21.4755 70.2075,21.479 70.2043,21.4906 70.2008,21.4921 70.1987,21.4875 70.1966,21.4662 70.2045,21.4645 70.2111,21.4365 70.2173,21.4248 70.2218,21.4204 70.2401,21.4332 70.2606,21.4268 70.2691,21.4149 70.2768,21.4088 70.2772,21.3922 70.273,21.3774 70.2717,21.3668 70.2685,21.3445 70.2679,21.3363 70.258,21.325 70.2561,21.3017 70.2614,21.293 70.2607,21.2559 70.249,21.2435 70.243,21.2333 70.2438,21.2261 70.2417,21.1999 70.229,21.1925 70.2296,21.1847 70.2338,21.1841 70.2341,21.1715 70.2303,21.1825 70.2277,21.1847 70.2247,21.173 70.2185,21.1788 70.2126,21.1779 70.2057,21.1822 70.2033,21.1902 70.2038,21.2032 70.2107,21.2133 70.2108,21.2184 70.2056,21.2152 70.2021,21.2195 70.1992,21.2406 70.1957,21.2476 70.1907,21.2433 70.1854,21.2561 70.1837,21.2563 70.1817,21.2444 70.1784,21.2592 70.1773,21.2739 70.1695,21.2848 70.1666,21.3187 70.1648,21.3199 70.1647,21.3409 70.1619,21.3684 70.1623,21.3964 70.1655,21.4183 70.1709,21.4364 70.1719,21.4623 70.1775,21.4702 70.1691,21.4474 70.156,21.4347 70.1541,21.4106 70.1532,21.402 70.1505,21.4009 70.1468,21.4335 70.1278,21.436 70.1224,21.4435 70.106,21.449 70.1028,21.4646 70.0992,21.5338 70.0958,21.5478 70.0963,21.5726 70.1094,21.578 70.1095,21.5842 70.1054,21.5917 70.1038,21.5931 70.1013,21.5802 70.0915,21.5797 70.0889,21.5865 70.0862,21.6337 70.078,21.6427 70.0731,21.6474 70.0723,21.6649 70.0693,21.6783 70.0687,21.7176 70.0584,21.7323 70.0584,21.8061 70.0683,21.8153 70.0722,21.8118 70.0752,21.7949 70.0811,21.8001 70.0852,21.7979 70.0895,21.8045 70.0916,21.8311 70.0778,21.8899 70.0811,21.9006 70.0817,21.9441 70.0812,21.9845 70.0966,21.9916 70.1051,21.9976 70.1055,22.007 70.1035,22.0177 70.1047,22.0397 70.1116,22.0428 70.118,22.0647 70.1292,22.0668 70.1245,22.0552 70.1068,22.0439 70.102,22.0246 70.0981,22.0232 70.0973,22.0035 70.0864,21.9971 70.0781,21.9818 70.074,21.9545 70.0705,21.8577 70.0649,21.8479 70.0587,21.8142 70.0483,21.7936 70.0466,21.775 70.0424,21.7738 70.0403,21.782 70.0353,21.8001 70.0291,21.8429 70.0144,21.8761 70.0165,21.9088 70.016,21.9367 70.0211,21.9654 70.0226,21.9819 70.0281,22.0045 70.0295,22.0344 70.0344,22.0485 70.0329,22.0698 70.0336,22.0739 70.0309,22.072 70.0284,22.0271 70.0235,22.0201 70.0227,22.0088 70.0197,22.0063 70.0156,22.031 70,22.0355 69.9972,22.041 69.9902,22.034 69.9769,22.0423 69.9671,22.0366 69.9564,22.0469 69.9459,22.0398 69.9363,22.0325 69.9372,22.0177 69.9435,21.9976 69.9478,21.9955 69.9512,22.0091 69.9631,22.0108 69.9736,22.0044 69.9878,21.9949 69.9928,21.9735 69.9968,21.9588 69.9961,21.939 69.9912,21.8911 69.9888,21.8752 69.9855,21.8675 69.9772,21.8734 69.9714,21.8858 69.9677,21.8981 69.9609,21.9188 69.9578,21.9182 69.9546,21.911 69.9516,21.8885 69.9499,21.8753 69.9467,21.8662 69.9403,21.8638 69.9334,21.8749 69.9184,21.8752 69.9108,21.886 69.9054,21.8877 69.8945,21.8839 69.8903,21.8968 69.8822,21.8989 69.8778,21.9203 69.8713,21.9231 69.8711,21.988 69.8679,22.0074 69.8611,22.0216 69.852,22.0217 69.8488,22.0125 69.8465,21.9749 69.8427,21.9636 69.8438,21.9438 69.8421,21.8965 69.8509,21.8823 69.8403,21.8884 69.8367,21.9231 69.8254,21.9373 69.8166,21.9493 69.8143,21.9597 69.8196,21.9516 69.8244,21.9575 69.8273,21.9782 69.8181,21.9944 69.8122,22.0816 69.7805,22.0844 69.7768,22.0766 69.7722,22.041 69.7708,22.0345 69.7691,22.0405 69.7664,22.0523 69.7674,22.0563 69.7639,22.0801 69.7617,22.1338 69.7518,22.1411 69.748,22.1399 69.7448,22.1202 69.7395,22.115 69.7381,22.0906 69.7403,22.0702 69.7368,22.0637 69.7345,22.0599 69.7302,22.0567 69.7258,22.0494 69.7263,22.0428 69.7301,22.0322 69.7294,22.0086 69.7275,21.9921 69.7295,21.9822 69.7315,21.9615 69.7406,21.9694 69.7411,21.9866 69.737,22.0301 69.7369,22.0531 69.7388,22.051 69.7418,22.0378 69.7424,22.0318 69.7445,22.0488 69.7518,22.0236 69.7575,22.0169 69.7616,22.0042 69.7647,22.0042 69.7672,22.0206 69.7702,22.0133 69.7718,21.9897 69.7676,21.9876 69.7677,21.9718 69.7683,21.9452 69.775,21.9297 69.7868,21.9108 69.7984,21.9046 69.8078,21.8885 69.8145,21.8695 69.828,21.872 69.833,21.8625 69.8389,21.8709 69.8432,21.8622 69.846,21.8364 69.8468,21.8323 69.8509,21.8157 69.8526,21.8088 69.8588,21.8106 69.8636,21.8072 69.867,21.7696 69.8778,21.7603 69.8836,21.7581 69.885,21.719 69.8846,21.6547 69.8989,21.6291 69.9072,21.6164 69.909,21.5918 69.9096,21.5797 69.9118,21.5701 69.9186,21.5594 69.9324,21.5716 69.9423,21.5627 69.9473,21.5664 69.9517,21.5644 69.9537,21.547 69.9547,21.5411 69.9568,21.5368 69.9583,21.5246 69.9598,21.5245 69.9647,21.5119 69.9776,21.5165 69.9774,21.5224 69.9806,21.4922 69.9964,21.4801 69.9993,21.4726 70,21.4721 70,21.4546 70.0015,21.4445 70.0041,21.431 70.0182,21.4043 70.0187,21.3914 70.0223,21.3412 70.0247,21.3306 70.0228,21.3113 70.0227,21.2863 70.0166,21.2384 70.0144,21.2218 70,21.2138 69.993,21.2126 69.9859,21.2124 69.9845,21.203 69.9756,21.2022 69.9678,21.1927 69.9595,21.1918 69.9435,21.1814 69.9405,21.1795 69.9382,21.181 69.9363,21.2202 69.9266,21.2505 69.9206,21.2844 69.9193,21.3354 69.911,21.3389 69.9092,21.3197 69.9072,21.3113 69.9042,21.3035 69.9016,21.2676 69.9023,21.2411 69.9007,21.2279 69.9008,21.2017 69.9054,21.1945 69.9031,21.1836 69.8873,21.198 69.8803,21.2198 69.8626,21.2244 69.8526,21.2144 69.8441,21.1821 69.8318,21.179 69.8298,21.1726 69.8258,21.1505 69.8199,21.1284 69.8055,21.1276 69.8263,21.132 69.8296,21.1456 69.8338,21.15 69.8375,21.1476 69.8422,21.1609 69.8512,21.186 69.8617,21.1904 69.8661,21.1878 69.875,21.181 69.8777,21.1482 69.8824,21.1412 69.8819,21.1086 69.8794,21.0966 69.8797,21.0858 69.8828,21.0719 69.882,21.0526 69.8739,21.0464 69.8777,21.0385 69.8765,21.039 69.8699,21.0262 69.8636,21.0265 69.86,21.051 69.8515,21.0573 69.8463,21.0488 69.8362,21.0366 69.8311,21.02 69.8316,21.011 69.8279,21.0019 69.8264,20.9919 69.8268,20.9856 69.8233,20.9899 69.8155,20.9917 69.8122,20.9973 69.8093,21.042 69.7934,21.0389 69.7909,21.0228 69.7946,21.0182 69.7941,21.0105 69.7822,20.9909 69.7795,20.9761 69.7753,20.9686 69.7786,20.963 69.7909,20.9514 69.7954,20.9414 69.7964,20.9233 69.817,20.9156 69.822,20.9069 69.8233,20.9026 69.8278,20.9183 69.8382,20.9415 69.8378,20.9492 69.8399,20.9524 69.8422,20.9389 69.8457,20.9438 69.8497,20.937 69.8519,20.913 69.8539,20.9059 69.8538,20.8807 69.8532,20.8656 69.851,20.8583 69.8516,20.8492 69.8565,20.8517 69.8591,20.8765 69.8632,20.899 69.8725,20.9151 69.8857,20.9293 69.8906,20.9481 69.9052,20.9676 69.9104,20.984 69.9213,21.0301 69.9344,21.0693 69.9455,21.0663 69.9496,21.0776 69.9586,21.0574 69.9625,21.0438 69.9579,21.0331 69.9582,20.9948 69.9456,20.9841 69.9375,20.958 69.9309,20.8763 69.9223,20.861 69.9161,20.8352 69.8978,20.8268 69.8954,20.7945 69.8921,20.7782 69.889,20.7673 69.8845,20.7478 69.8649,20.7527 69.862,20.7778 69.8549,20.7835 69.8507,20.7848 69.8438,20.7771 69.8255,20.7626 69.8166,20.7586 69.8151,20.7038 69.7943,20.6862 69.7919,20.6466 69.7917,20.605 69.7844,20.5807 69.7766,20.5565 69.7736,20.5327 69.7676,20.4604 69.7652,20.4571 69.7587,20.46 69.7562,20.4773 69.7546,20.5121 69.7425,20.5222 69.7359,20.5269 69.7328,20.5308 69.7262,20.5299 69.715,20.5367 69.706,20.5015 69.6761,20.4893 69.6737,20.474 69.6621,20.4652 69.6524,20.461 69.6414,20.4631 69.6336,20.4771 69.6178,20.4896 69.6113,20.511 69.6063,20.5408 69.6027,20.553 69.5992,20.5888 69.5731,20.5909 69.5716,20.6422 69.5401,20.6758 69.5293,20.7003 69.525,20.7466 69.5248,20.7904 69.5165,20.8225 69.5064,20.8458 69.4959,20.8523 69.4929,20.8687 69.491,20.8943 69.4812,20.9168 69.476,20.9112 69.4729,20.8901 69.4757,20.8626 69.4866,20.8526 69.4891,20.8422 69.489,20.8253 69.4968,20.8101 69.4985,20.7621 69.5112,20.7384 69.5149,20.7247 69.515,20.7059 69.5129,20.6483 69.5158,20.6196 69.5301,20.6189 69.5305,20.609 69.5393,20.596 69.5451,20.5801 69.5477,20.5664 69.5471,20.5473 69.5432,20.539 69.5602,20.5305 69.5674,20.521 69.5704,20.517 69.5716,20.4931 69.5759,20.4546 69.588,20.4333 69.591,20.4231 69.589,20.4125 69.5834,20.3889 69.5528,20.3821 69.5358,20.3743 69.5293,20.368 69.5152,20.3691 69.508,20.3516 69.4974,20.3288 69.4601,20.3189 69.4559,20.3132 69.4481,20.2956 69.4419,20.2911 69.4354,20.2717 69.4231,20.2705 69.3977,20.2601 69.3921,20.2441 69.3839,20.2059 69.3895,20.1867 69.3879,20.0763 69.356,20.0556 69.3447,20.0232 69.3337,20 69.3124,19.9985 69.311,19.9947 69.3075,19.9709 69.2959,19.9514 69.2762,19.9256 69.2703,19.9171 69.2711,19.9101 69.2756,19.9333 69.2972,19.9887 69.3362,19.9951 69.3473,19.9988 69.354,20 69.3543,20.0107 69.3578,20.0178 69.3634,20.0621 69.3777,20.0883 69.3806,20.1273 69.3912,20.1546 69.4019,20.1724 69.4339,20.1666 69.4452,20.1759 69.4612,20.189 69.4832,20.1941 69.484,20.1953 69.4735,20.2012 69.4669,20.1987 69.4598,20.2037 69.4565,20.2154 69.4562,20.2282 69.4579,20.243 69.4711,20.2423 69.4782,20.2506 69.4916,20.2469 69.4957,20.2293 69.495,20.226 69.4961,20.2281 69.5,20.2213 69.5031,20.2249 69.5059,20.2152 69.5105,20.2242 69.5123,20.2295 69.5169,20.2392 69.5177,20.2428 69.521,20.2317 69.5265,20.2404 69.5367,20.2747 69.5458,20.2802 69.5489,20.2746 69.552,20.2438 69.5473,20.2384 69.549,20.24 69.5518,20.231 69.5626,20.2334 69.5704,20.2244 69.5753,20.2369 69.5805,20.2412 69.5804,20.271 69.5798,20.2836 69.5836,20.2787 69.5872,20.2815 69.5914,20.3043 69.5864,20.313 69.59,20.3246 69.5919,20.3277 69.5995,20.3572 69.6182,20.3579 69.6367,20.3521 69.6419,20.3244 69.6488,20.2945 69.6528,20.2853 69.6584,20.2736 69.6818,20.268 69.6844,20.2881 69.6995,20.2899 69.7071,20.2736 69.7176,20.2754 69.719,20.2886 69.7187,20.2931 69.7204,20.3068 69.7701,20.3099 69.774,20.3213 69.7882,20.3627 69.8216,20.3689 69.844,20.3789 69.8567,20.3961 69.8697,20.4038 69.8913,20.4015 69.8939,20.4 69.8958,20.3813 69.9029,20.374 69.9094,20.3666 69.9413,20.3535 69.9459,20.3443 69.9566,20.3278 69.9619,20.3197 69.9688,20.2922 69.9767,20.265 69.9752,20.2665 69.9684,20.2572 69.9619,20.2421 69.9581,20.2397 69.9575,20.2194 69.9486,20.2028 69.937,20.196 69.9268,20.1897 69.9233,20.1816 69.9017,20.1852 69.8876,20.2109 69.8713,20.2138 69.8631,20.2107 69.8553,20.2041 69.855,20.1929 69.8608,20.1711 69.889,20.1739 69.9165,20.1703 69.9361,20.1617 69.9417,20.142 69.9387,20.1331 69.9349,20.1242 69.9263,20.1141 69.9047,20.1032 69.8957,20.0894 69.8902,20.0817 69.8871,20.0537 69.8605,20.0493 69.8421,20.0082 69.7993,20 69.7806,19.9984 69.777,19.9901 69.7705,19.9839 69.7658,19.9701 69.7603,19.9584 69.759,19.9563 69.7599,19.9587 69.7721,19.9696 69.78,19.9667 69.7877,19.9913 69.8132,19.9945 69.8352,20 69.8412,20.0045 69.8461,20 69.8476,19.9968 69.8487,19.984 69.8451,19.9718 69.8369,19.9267 69.8065,19.9071 69.7836,19.8989 69.7805,19.8709 69.7774,19.857 69.7724,19.8405 69.752,19.8498 69.7364,19.8453 69.7304,19.8397 69.7282,19.8167 69.7222,19.8109 69.7168,19.8013 69.7142,19.7949 69.7081,19.7918 69.6966,19.784 69.6906,19.7721 69.6863,19.7717 69.6792,19.7748 69.6756,19.791 69.6731,19.8 69.6696,19.8195 69.6555,19.8272 69.6268,19.8377 69.6187,19.8389 69.6178,19.8548 69.616,19.8619 69.6122,19.9233 69.6079,19.9541 69.6026,20 69.5924,20.0167 69.5887,20.1153 69.5905,20.1421 69.5854,20.1046 69.5867,20.0683 69.5842,20.0108 69.5838,20 69.585,19.9929 69.5858,19.9667 69.5859,19.9089 69.5976,19.8853 69.5977,19.8766 69.5994,19.8611 69.5981,19.8492 69.5988,19.842 69.6035,19.8246 69.6053,19.7998 69.6056,19.7887 69.6104,19.7782 69.6109,19.763 69.6068,19.7513 69.6062,19.7387 69.6074,19.7353 69.6034,19.7542 69.5893,19.7531 69.5829,19.7211 69.5531,19.7204 69.5485,19.7377 69.536,19.7353 69.53,19.7225 69.5221,19.719 69.52,19.7139 69.5048,19.7334 69.4955,19.734 69.4909,19.7263 69.4849,19.6943 69.4757,19.6855 69.4732,19.6662 69.4619,19.6476 69.4461,19.6455 69.4378,19.6604 69.4239,19.6529 69.4213,19.645 69.422,19.6255 69.4318,19.6174 69.4342,19.607 69.4342,19.5931 69.4312,19.5231 69.4043,19.5062 69.3977,19.494 69.3973,19.4876 69.4006,19.491 69.4043,19.5413 69.4249,19.5684 69.4407,19.6093 69.4548,19.6615 69.4776,19.672 69.4864,19.6755 69.4893,19.6633 69.4928,19.6498 69.5008,19.6403 69.5084,19.6383 69.5186,19.6461 69.5325,19.6482 69.546,19.6517 69.5488,19.6669 69.5525,19.6753 69.5629,19.6878 69.567,19.6994 69.5779,19.6951 69.5854,19.7179 69.6059,19.7204 69.6119,19.7113 69.6166,19.7084 69.6181,19.7173 69.6251,19.7394 69.6362,19.7446 69.6417,19.7402 69.6446,19.716 69.6488,19.7005 69.6568,19.6863 69.6598,19.6569 69.6586,19.6507 69.6608,19.6508 69.6647,19.6656 69.686,19.6722 69.7048,19.6921 69.7232,19.6984 69.7352,19.6984 69.74,19.674 69.754,19.697 69.7596,19.7244 69.7769,19.7226 69.7799,19.7331 69.7903,19.7374 69.8025,19.7264 69.8108,19.7119 69.8154,19.7045 69.8161,19.6944 69.8172,19.6629 69.8157,19.6422 69.812,19.6121 69.8099,19.5928 69.8061,19.5688 69.798,19.561 69.7971,19.548 69.8001,19.5355 69.7997,19.5156 69.7957,19.4815 69.7935,19.4571 69.7846,19.4436 69.7865,19.4305 69.7855,19.4069 69.7796,19.3827 69.7781,19.3646 69.7757,19.3517 69.778,19.3419 69.7773,19.3211 69.7795,19.3022 69.7778,19.275 69.7784,19.2633 69.7768,19.2437 69.7714,19.2166 69.7677,19.202 69.7636,19.1897 69.754,19.1675 69.7444,19.1531 69.7439,19.1431 69.7485,19.1234 69.7481,19.1183 69.7466,19.1134 69.7406,19.1004 69.7356,19.0961 69.7293,19.0927 69.7061,19.0826 69.6956,19.0437 69.6761,19.0148 69.6561,19.004 69.6517,18.9761 69.6405,18.9535 69.6263,18.9409 69.6082,18.9412 69.5794,18.9624 69.5437,18.9891 69.5388,18.9961 69.5375,19.0037 69.5347,19.0063 69.5308,19.0242 69.5335,19.045 69.5497,19.0574 69.554,19.077 69.5579,19.1015 69.5602,19.1211 69.5605,19.1312 69.5628,19.1515 69.5625,19.1756 69.5714,19.1811 69.5697,19.1857 69.5529,19.2159 69.5387,19.2344 69.53,19.2432 69.5242,19.2433 69.5192,19.2347 69.52,19.2145 69.5319,19.1917 69.5402,19.1638 69.555,19.1441 69.5518,19.0896 69.5492,19.0751 69.5455,19.0545 69.5279,19.0408 69.524,19.0114 69.52,19.0041 69.5171,19.0077 69.5151,19.0007 69.5136,19.002 69.4942,18.9793 69.4784,18.9681 69.4635,18.9819 69.4549,18.994 69.4526,19.0045 69.4446,19.0236 69.4429,19.0416 69.4364,19.0529 69.4272,19.0562 69.4108,19.0591 69.4067,19.068 69.3944,19.0788 69.388,19.0964 69.383,19.1225 69.3785,19.1408 69.3773,19.1881 69.378,19.2001 69.3798,19.2734 69.3798,19.3165 69.3733,19.3327 69.3734,19.3666 69.3767,19.3688 69.3752,19.3586 69.3654,19.3754 69.3483,19.4097 69.3219,19.4089 69.3184,19.4007 69.282,19.4061 69.2631,19.4129 69.2564,19.4304 69.2464,19.4744 69.2319,19.5526 69.2209,19.5428 69.2173,19.5163 69.2184,19.489 69.2244,19.4728 69.225,19.4601 69.2286,19.4451 69.2297,19.4255 69.236,19.3481 69.2408,19.3271 69.2395,19.3057 69.2277,19.2728 69.2275,19.2576 69.23,19.2434 69.2347,19.2375 69.2396,19.245 69.2453,19.2366 69.2495,19.2512 69.255,19.2533 69.2621,19.2706 69.2677,19.2752 69.2751,19.2896 69.2779,19.2926 69.2839,19.328 69.2935,19.3375 69.2987,19.3436 69.3184,19.3445 69.3212,19.338 69.33,19.3139 69.3435,19.2943 69.3489,19.2398 69.3536,19.1144 69.3518,19.0906 69.3553,19.0683 69.3608,19.0556 69.365,19.0347 69.372,19.0017 69.391,18.9913 69.4258,18.9834 69.4302,18.9612 69.4311,18.956 69.4386,18.9394 69.4409,18.9173 69.4522,18.9079 69.4693,18.9068 69.4712,18.8983 69.4753,18.9035 69.4791,18.8929 69.4917,18.8888 69.4927,18.8773 69.4916,18.8733 69.4883,18.8541 69.4861,18.8411 69.4931,18.8432 69.4959,18.8752 69.5108,18.8702 69.5175,18.8754 69.5252,18.8636 69.5364,18.8607 69.5491,18.8508 69.5572,18.8367 69.5612,18.8247 69.5646,18.8165 69.5628,18.8124 69.5561,18.8024 69.557,18.7934 69.5488,18.7771 69.5451,18.7489 69.5456,18.7256 69.544,18.7034 69.5405,18.6637 69.5394,18.6342 69.5362,18.6031 69.5351,18.5847 69.5285,18.5521 69.5282,18.5369 69.5227,18.5331 69.5214,18.4495 69.5178,18.4448 69.5152,18.4377 69.5045,18.4581 69.5002,18.4796 69.487,18.4818 69.4822,18.474 69.4719,18.4604 69.4682,18.4556 69.4589,18.4474 69.4544,18.4521 69.4502,18.4454 69.4445,18.4704 69.4408,18.4722 69.4406,18.4766 69.4411,18.478 69.4478,18.492 69.446,18.5126 69.4403,18.5571 69.4251,18.585 69.4113,18.5962 69.4038,18.5929 69.3966,18.5993 69.394,18.595 69.3891,18.6106 69.3783,18.6383 69.3723,18.65 69.3652,18.6761 69.3605,18.6998 69.3587,18.725 69.3522,18.7541 69.3522,18.8078 69.3378,18.8198 69.3362,18.8228 69.3413,18.8312 69.3415,18.8583 69.3345,18.883 69.3336,18.8978 69.3305,18.9186 69.3298,18.9438 69.3225,18.9501 69.3158,18.9663 69.3118,18.9764 69.3015,18.9949 69.2955,18.9965 69.2934,18.9912 69.2908,18.979 69.2901,18.9663 69.2924,18.9529 69.2918,18.9458 69.2956,18.9494 69.3012,18.8951 69.3083,18.8729 69.3081,18.859 69.308,18.8567 69.31,18.8596 69.3119,18.8697 69.3134,18.8784 69.3191,18.8942 69.3215,18.8924 69.3244,18.8806 69.3249,18.8689 69.3292,18.8338 69.3298,18.8274 69.3258,18.804 69.3267,18.7942 69.3308,18.7775 69.33,18.7557 69.3325,18.7416 69.3317,18.7216 69.3274,18.6712 69.327,18.6548 69.3209,18.6484 69.3201,18.6409 69.3192,18.6376 69.3159,18.6542 69.3028,18.6755 69.296,18.6836 69.2904,18.7169 69.2816,18.7109 69.275,18.7168 69.2674,18.7107 69.2617,18.6953 69.258,18.6955 69.2671,18.6959 69.2797,18.6765 69.2868,18.6451 69.2928,18.6303 69.2991,18.6192 69.2997,18.5762 69.3189,18.5709 69.3231,18.5842 69.3422,18.5763 69.3537,18.5647 69.3603,18.5535 69.3612,18.5435 69.3591,18.5417 69.3574,18.5325 69.3486,18.5316 69.3394,18.5434 69.3216,18.5427 69.3081,18.5305 69.2938,18.5339 69.2859,18.5317 69.2804,18.5102 69.2643,18.5048 69.2552,18.503 69.2403,18.4974 69.2361,18.4932 69.2376,18.4975 69.2425,18.4914 69.2542,18.5006 69.2771,18.4878 69.2901,18.4977 69.3031,18.4945 69.3095,18.4998 69.3196,18.5007 69.3213,18.4983 69.327,18.486 69.334,18.491 69.3417,18.482 69.3481,18.4861 69.3571,18.4955 69.3624,18.4988 69.3689,18.4933 69.3742,18.4587 69.3855,18.4391 69.3894,18.4064 69.4008,18.3964 69.4017,18.3844 69.4,18.3681 69.3905,18.3482 69.3891,18.3604 69.4063,18.355 69.4142,18.3681 69.4235,18.37 69.4601,18.3462 69.4653,18.3372 69.4715,18.3321 69.4724,18.3156 69.4753,18.304 69.481,18.2895 69.4818,18.2784 69.4849,18.2654 69.4848,18.2559 69.4864,18.2392 69.4851,18.2308 69.4817,18.2297 69.4711,18.2128 69.471,18.1768 69.4618,18.167 69.4682,18.1584 69.4689,18.1425 69.4637,18.1304 69.4625,18.1259 69.4589,18.1342 69.4507,18.1525 69.4468,18.1562 69.4384,18.1594 69.4197,18.1515 69.4078,18.1545 69.4024,18.172 69.3965,18.1708 69.3928,18.1629 69.39,18.1578 69.3902,18.1115 69.3903,18.0902 69.3836,18.0997 69.3752,18.1038 69.3652,18.1012 69.3555,18.1057 69.3529,18.0786 69.3428,18.0557 69.3253,17.985 69.3106,17.9853 69.306,17.9858 69.3056,17.9941 69.2983,17.9857 69.2795,17.9948 69.2642,17.9691 69.2332,17.9776 69.2298,18.042 69.2363,18.0818 69.2311,18.0725 69.2245,18.0706 69.2231,18.0531 69.2201,18.0628 69.2078,18.0488 69.1852,18.0751 69.1765,18.0679 69.1678,18.0875 69.1631,18.111 69.1643,18.1253 69.1604,18.1404 69.1621,18.1453 69.1602,18.1395 69.1573,18.1522 69.1517,18.1388 69.1513,18.1354 69.1487,18.1269 69.1462,18.1147 69.1466,18.0787 69.1402,18.0692 69.1397,18.0655 69.1419,18.0516 69.1502,18.0335 69.1536,18.0081 69.1523,17.9912 69.156,17.9772 69.1556,17.9656 69.1525,17.9411 69.1501,17.8749 69.1352,17.85 69.1346,17.84 69.1333,17.8268 69.1316,17.786 69.1216,17.7734 69.1205,17.7552 69.1214,17.7325 69.1196,17.7165 69.1222,17.7051 69.1216,17.6458 69.1115,17.6293 69.1048,17.6228 69.0996,17.6291 69.0972,17.6485 69.0992,17.6649 69.0921,17.6794 69.0932,17.6862 69.0885,17.6788 69.0844,17.642 69.0715,17.5976 69.0526,17.5366 69.0341,17.513 69.0141,17.4722 68.9974,17.4706 68.9932,17.4809 68.9889,17.4819 68.9885,17.4783 68.9849,17.4814 68.9823,17.519 68.9799,17.534 68.9843,17.5426 68.9827,17.5386 68.9725,17.5417 68.9698,17.5547 68.9661,17.5538 68.9619,17.55 68.9588,17.5292 68.9608,17.4962 68.9598,17.4676 68.9569,17.4658 68.9534,17.4746 68.9406,17.4719 68.9327,17.454 68.9218,17.4446 68.9161,17.4422 68.9101,17.4572 68.8947,17.4639 68.8933,17.5037 68.9055,17.5257 68.9093,17.5521 68.9108,17.5788 68.9161,17.6358 68.9233,17.6554 68.9296,17.6848 68.9318,17.6911 68.9345,17.6935 68.9355,17.7096 68.9348,17.7137 68.9248,17.702 68.9201,17.6971 68.9138,17.7 68.9118,17.7169 68.9102,17.7252 68.9132,17.741 68.9077,17.7591 68.9064,17.778 68.9014,17.7926 68.8927,17.8082 68.8883,17.8212 68.8779,17.85 68.8679,17.8442 68.8657,17.8242 68.8672,17.8006 68.8647,17.7577 68.872,17.7461 68.873,17.7273 68.8718,17.7168 68.8761,17.686 68.8805,17.6961 68.8838,17.7112 68.8842,17.719 68.8863,17.7244 68.8935,17.7202 68.8984,17.7066 68.9024,17.682 68.8985,17.6598 68.8985,17.6447 68.8947,17.6325 68.8952,17.6153 68.8899,17.6078 68.8895,17.5962 68.8837,17.5946 68.8829,17.5832 68.8801,17.5796 68.8763,17.5618 68.8707,17.5478 68.8598,17.4743 68.8372,17.4702 68.8334,17.4833 68.8285,17.5031 68.825,17.5293 68.8242,17.544 68.8209,17.5549 68.8148,17.594 68.8073,17.5988 68.8057,17.6063 68.8033,17.6219 68.804,17.6461 68.8005,17.7371 68.7956,17.7567 68.7927,17.7856 68.7848,17.7938 68.7788,17.791 68.7744,17.8104 68.7518,17.8098 68.7488,17.7863 68.7553,17.7756 68.7609,17.7644 68.7716,17.7427 68.7783,17.7237 68.7814,17.6785 68.7831,17.6564 68.7855,17.6254 68.7855,17.613 68.7872,17.5887 68.7943,17.5352 68.804,17.5245 68.8071,17.4924 68.8164,17.4677 68.8194,17.4512 68.8193,17.4149 68.815,17.3977 68.8072,17.3697 68.8024,17.3566 68.7986,17.3261 68.786,17.2853 68.7817,17.2675 68.7771,17.2566 68.7669,17.2506 68.7646,17.2387 68.7601,17.255 68.7551,17.2709 68.7547,17.3067 68.745,17.307 68.7411,17.319 68.7388,17.3491 68.7422,17.3759 68.7435,17.3948 68.7466,17.4074 68.7465,17.437 68.7417,17.4559 68.7365,17.4645 68.7319,17.46 68.7238,17.4663 68.7187,17.4648 68.7141,17.4687 68.7114,17.4738 68.7079,17.4753 68.7016,17.4802 68.6992,17.5035 68.6967,17.5209 68.6919,17.5319 68.6906,17.5487 68.6916,17.5612 68.6977,17.5826 68.6979,17.625 68.6913,17.6753 68.6804,17.6808 68.6753,17.6691 68.674,17.6483 68.6771,17.6179 68.685,17.6055 68.6882,17.5787 68.69,17.5682 68.6892,17.5618 68.6865,17.5504 68.6868,17.5293 68.683,17.4914 68.6805,17.4811 68.6816,17.4758 68.6853,17.4582 68.691,17.4536 68.6915,17.4401 68.6872,17.4302 68.6919,17.4289 68.6974,17.4351 68.7146,17.4187 68.7251,17.4158 68.7296,17.3958 68.7342,17.3664 68.7304,17.3503 68.7264,17.3408 68.7266,17.3296 68.7311,17.3124 68.7291,17.3043 68.7314,17.295 68.7387,17.2685 68.7383,17.2452 68.733,17.226 68.7313,17.201 68.727,17.1715 68.722,17.1242 68.7166,17.1164 68.715,17.1096 68.7067,17.108 68.6954,17.1019 68.6893,17.1052 68.6836,17.1278 68.6736,17.1446 68.6721,17.1839 68.6632,17.199 68.663,17.2035 68.6599,17.1805 68.6487,17.1718 68.6479,17.138 68.6498,17.1159 68.6606,17.1207 68.6665,17.1102 68.671,17.1088 68.6769,17.0847 68.6772,17.0757 68.6806,17.0614 68.6797,17.0579 68.6812,17.06 68.6856,17.0497 68.689,17.0406 68.7027,17.0481 68.7183,17.0432 68.7199,17.0381 68.7199,16.9778 68.7189,16.9669 68.7172,16.9478 68.7081,16.934 68.7051,16.9217 68.699,16.9021 68.6894,16.8689 68.6862,16.8485 68.6917,16.8372 68.6918,16.8259 68.6891,16.7997 68.6878,16.7865 68.6827,16.757 68.6801,16.7299 68.6753,16.7177 68.6712,16.7126 68.6666,16.7132 68.6547,16.7074 68.6532,16.6885 68.6553,16.6573 68.6529,16.6484 68.6523,16.6186 68.6459,16.6095 68.6424,16.606 68.6368,16.5974 68.636,16.5905 68.6332,16.5625 68.6068,16.5659 68.594,16.5568 68.5857,16.5614 68.5826,16.5773 68.5795,16.5851 68.5764,16.5972 68.5756,16.601 68.5707,16.6259 68.5643,16.6362 68.5701,16.6385 68.5714,16.6444 68.5704,16.6495 68.5653,16.6424 68.5614,16.6327 68.5601,16.6278 68.5574,16.6263 68.5395,16.6143 68.5375,16.6036 68.5401,16.5903 68.5405,16.5686 68.5489,16.5557 68.5572,16.5426 68.5615,16.5177 68.5611,16.5082 68.5566,16.5058 68.5515,16.4709 68.544,16.4633 68.5442,16.462 68.5372,16.4618 68.5361,16.4697 68.53,16.4668 68.5223,16.4558 68.5123,16.4604 68.509,16.5126 68.4944,16.5256 68.4831,16.5166 68.4654,16.5169 68.4573,16.5085 68.4538,16.4995 68.4526,16.4988 68.4505,16.5036 68.449,16.5191 68.4494,16.5417 68.4536,16.5528 68.4501,16.5553 68.4493,16.5743 68.4504,16.5803 68.4562,16.5897 68.456,16.5989 68.4539,16.6137 68.4592,16.6304 68.4572,16.6371 68.4609,16.6451 68.4589,16.6574 68.4596,16.67 68.457,16.7343 68.4616,16.7576 68.4633,16.7838 68.4681,16.8138 68.468,16.8624 68.4708,16.881 68.4765,16.8885 68.4836,16.9111 68.4908,16.9162 68.4978,16.935 68.5049,16.9348 68.5131,16.9889 68.5269,17.0028 68.5165,17.0174 68.5131,17.0561 68.511,17.0698 68.5061,17.0753 68.4962,17.0963 68.4898,17.099 68.4862,17.0957 68.4818,17.0856 68.4798,17.0585 68.4782,17.0153 68.461,17.0171 68.4565,17.0313 68.4519,17.0543 68.4522,17.055 68.4523,17.0816 68.4554,17.1978 68.4621,17.2569 68.4683,17.2814 68.473,17.3498 68.4953,17.3603 68.4997,17.413 68.5218,17.4374 68.5274,17.4731 68.53,17.4923 68.5336,17.5092 68.5391,17.5223 68.5473,17.5378 68.5482,17.547 68.5515,17.5616 68.5478,17.56 68.5468,17.5713 68.538,17.5607 68.5214,17.5424 68.5138,17.5362 68.5026,17.519 68.4956,17.4795 68.4796,17.4734 68.4711,17.4836 68.4673,17.4967 68.4673,17.5251 68.4738,17.542 68.4737,17.5491 68.4755,17.5489 68.4794,17.5608 68.4788,17.5697 68.4754,17.6498 68.4743,17.6618 68.4708,17.6824 68.4679,17.6954 68.4626,17.7039 68.4491,17.7178 68.4513,17.8009 68.4239,17.8055 68.4233,17.8162 68.422,17.8862 68.4236,17.9063 68.4225,17.9136 68.4204,17.8522 68.4166,17.829 68.4116,17.8131 68.4103,17.8016 68.4118,17.7687 68.4232,17.7558 68.4254,17.731 68.4361,17.7195 68.4378,17.7183 68.4386,17.7092 68.4449,17.6987 68.4388,17.6902 68.4377,17.6749 68.4395,17.6357 68.4505,17.6263 68.4509,17.6144 68.4483,17.535 68.4576,17.5236 68.4557,17.4797 68.4571,17.449 68.4523,17.4173 68.4522,17.3942 68.449,17.3873 68.4467,17.379 68.4366,17.3826 68.4344,17.4028 68.4334,17.4158 68.4311,17.4266 68.4168,17.4752 68.4027,17.5152 68.3988,17.5901 68.3836,17.5949 68.3815,17.5855 68.3794,17.5682 68.3789,17.5534 68.3812,17.5288 68.3885,17.4713 68.3977,17.451 68.3996,17.4325 68.4046,17.402 68.4181,17.3731 68.427,17.3578 68.4286,17.3447 68.4287,17.3041 68.4242,17.3037 68.4237,17.3022 68.4216,17.3077 68.4165,17.2982 68.4068,17.2773 68.4055,17.257 68.4021,17.2467 68.3983,17.2524 68.3822,17.2485 68.375,17.2746 68.3563,17.2756 68.3414,17.289 68.3345,17.2848 68.3312,17.2687 68.3286,17.2671 68.3249,17.2733 68.3223,17.2758 68.3221,17.3023 68.32,17.3274 68.3107,17.4014 68.2743,17.4022 68.2601,17.3952 68.2555,17.3698 68.2639,17.3609 68.2625,17.3601 68.2469,17.342 68.2346,17.3383 68.2292,17.3429 68.225,17.3608 68.2196,17.369 68.2137,17.3597 68.2056,17.3503 68.2012,17.3368 68.198,17.3226 68.198,17.319 68.2007,17.3357 68.2163,17.3162 68.2258,17.3105 68.2396,17.3142 68.2425,17.3277 68.2454,17.3345 68.2537,17.3326 68.2589,17.34 68.2673,17.3368 68.2865,17.3223 68.2902,17.3071 68.2915,17.2797 68.3001,17.2723 68.3003,17.2724 68.3009,17.273 68.3049,17.25 68.3106,17.2381 68.3189,17.2312 68.3428,17.2447 68.3542,17.2432 68.3578,17.2343 68.3638,17.2352 68.3707,17.2183 68.3765,17.2017 68.3886,17.1803 68.395,17.1583 68.3957,17.1374 68.3947,17.1319 68.3944,17.1076 68.3867,17.0916 68.389,17.0498 68.3867,17.0426 68.3855,17.0354 68.3798,17.0323 68.3645,17.0258 68.3606,17.0148 68.3598,17.004 68.3631,16.9929 68.363,16.9732 68.3596,16.9495 68.3599,16.94 68.3585,16.9184 68.3504,16.9061 68.3498,16.8919 68.352,16.8813 68.3486,16.8712 68.3454,16.8567 68.3437,16.8439 68.3403,16.8345 68.3409,16.8944 68.3666,16.8981 68.374,16.8951 68.3884,16.8765 68.393,16.8535 68.3932,16.8414 68.3989,16.7963 68.4052,16.7775 68.4032,16.7763 68.4038,16.769 68.4072,16.7767 68.416,16.7603 68.4166,16.7542 68.4233,16.725 68.4229,16.6932 68.4159,16.6757 68.409,16.6602 68.411,16.6521 68.4181,16.6311 68.4245,16.6209 68.4232,16.6077 68.4236,16.6032 68.4219,16.5934 68.4259,16.5841 68.424,16.5801 68.4171,16.5624 68.4089,16.5525 68.4017,16.5394 68.3991,16.5259 68.3987,16.5624 68.4158,16.562 68.4174,16.5428 68.4167,16.5189 68.4108,16.4842 68.4098,16.4585 68.4015,16.4137 68.3917,16.4067 68.3902,16.3911 68.3836,16.3469 68.3836,16.3254 68.3782,16.3072 68.3808,16.2749 68.3763,16.2732 68.3733,16.278 68.3675,16.2669 68.3648,16.265 68.3603,16.2726 68.3556,16.2919 68.3487,16.2735 68.3391,16.2855 68.3361,16.3028 68.3365,16.3303 68.3395,16.3347 68.34,16.3389 68.336,16.3546 68.3354,16.3794 68.3311,16.3744 68.3291,16.3417 68.3283,16.3459 68.3243,16.3665 68.3237,16.3956 68.3152,16.4332 68.3136,16.44 68.3159,16.4469 68.3157,16.4501 68.3061,16.5082 68.3046,16.5149 68.3007,16.532 68.3016,16.5343 68.3011,16.5405 68.2998,16.5457 68.2942,16.6086 68.2862,16.617 68.2826,16.6137 68.2763,16.6285 68.274,16.633 68.2689,16.6295 68.2633,16.6093 68.2552,16.6061 68.251,16.6352 68.2414,16.6477 68.2316,16.632 68.2184,16.6393 68.2141,16.6479 68.2117,16.7224 68.1913,16.7564 68.1762,16.8149 68.1619,16.8188 68.1586,16.8156 68.1567,16.8104 68.1554,16.7992 68.1559,16.7663 68.1619,16.7346 68.1628,16.7238 68.1663,16.7209 68.1683,16.6977 68.184,16.6676 68.193,16.6197 68.2016,16.6118 68.206,16.6136 68.2271,16.6088 68.2407,16.5788 68.2468,16.5687 68.2521,16.5614 68.2654,16.5601 68.2658,16.5285 68.2753,16.5186 68.282,16.4898 68.2878,16.4721 68.2893,16.4506 68.286,16.435 68.2865,16.4126 68.2937,16.4129 68.2972,16.4409 68.2943,16.4503 68.2986,16.4328 68.3039,16.4128 68.3043,16.3988 68.3102,16.3821 68.3121,16.3695 68.3174,16.3649 68.317,16.358 68.3165,16.3548 68.3146,16.3609 68.3102,16.3593 68.3072,16.3741 68.3008,16.3715 68.2989,16.3353 68.3042,16.3334 68.3066,16.3394 68.3117,16.337 68.3139,16.3133 68.3208,16.2859 68.3232,16.2839 68.3193,16.2768 68.3158,16.2639 68.3155,16.2468 68.319,16.2369 68.3253,16.2396 68.3291,16.2576 68.3293,16.2604 68.3326,16.2512 68.3354,16.2573 68.3389,16.2513 68.3426,16.2431 68.3388,16.2488 68.3361,16.2185 68.3356,16.2028 68.3295,16.1919 68.322,16.1743 68.3293,16.1689 68.3287,16.1589 68.3173,16.1572 68.3154,16.1477 68.3093,16.1523 68.3039,16.1491 68.2999,16.1308 68.2946,16.1393 68.2866,16.1587 68.2881,16.1874 68.2853,16.249 68.2757,16.256 68.2727,16.2575 68.2673,16.2775 68.2621,16.295 68.2662,16.3148 68.2685,16.3285 68.2748,16.3393 68.2738,16.3403 68.2734,16.3476 68.2707,16.3475 68.2642,16.3543 68.2555,16.3508 68.2501,16.3442 68.2494,16.3185 68.2528,16.3032 68.2522,16.2582 68.2402,16.2429 68.2396,16.219 68.2433,16.2066 68.2433,16.1722 68.2381,16.171 68.236,16.185 68.2278,16.1855 68.2216,16.1923 68.2172,16.1987 68.2166,16.2042 68.218,16.2142 68.2206,16.2267 68.2202,16.2418 68.215,16.2521 68.2133,16.3042 68.2238,16.3437 68.2287,16.3742 68.2301,16.404 68.2275,16.4453 68.2279,16.4468 68.2362,16.454 68.2413,16.4641 68.2451,16.4755 68.2467,16.4766 68.2426,16.4753 68.2417,16.4589 68.2302,16.4738 68.2232,16.4701 68.2137,16.4764 68.2088,16.5016 68.2022,16.5212 68.2004,16.5492 68.1927,16.5827 68.1872,16.6081 68.187,16.5957 68.1824,16.5734 68.1828,16.5595 68.1795,16.5478 68.1795,16.5334 68.1861,16.5188 68.1909,16.4676 68.198,16.4394 68.2084,16.419 68.2109,16.4123 68.2104,16.409 68.2068,16.4231 68.1956,16.4396 68.194,16.4681 68.1936,16.4772 68.1919,16.4774 68.1683,16.4614 68.1789,16.4601 68.1798,16.4467 68.1837,16.4362 68.184,16.4257 68.1815,16.3707 68.1843,16.3692 68.1808,16.3791 68.1761,16.4112 68.1713,16.4157 68.1683,16.4089 68.1618,16.4093 68.1556,16.4175 68.1481,16.4147 68.1448,16.4106 68.144,16.4025 68.1467,16.3683 68.175,16.3645 68.176,16.3583 68.1776,16.3312 68.166,16.3258 68.1566,16.3361 68.1506,16.3289 68.1476,16.2961 68.1461,16.2888 68.1477,16.2727 68.1569,16.2622 68.157,16.2585 68.1527,16.2467 68.1486,16.2354 68.1403,16.2799 68.1354,16.288 68.1327,16.2898 68.1243,16.2821 68.1228,16.2837 68.1194,16.3247 68.1022,16.3418 68.0982,16.3511 68.0981,16.3592 68.0952,16.3742 68.099,16.395 68.1083,16.4058 68.1094,16.4234 68.1171,16.4241 68.1236,16.439 68.1324,16.4841 68.1364,16.4993 68.1346,16.514 68.128,16.528 68.1261,16.5287 68.1261,16.5425 68.1089,16.5564 68.1025,16.571 68.0987,16.6245 68.0937,16.7149 68.0933,16.7219 68.0875,16.7312 68.0897,16.7382 68.0888,16.7247 68.0837,16.7181 68.0835,16.694 68.0889,16.6642 68.0876,16.6529 68.0883,16.6505 68.0859,16.6571 68.0816,16.6664 68.0791,16.6856 68.0782,16.6858 68.0753,16.6709 68.0688,16.6601 68.0677,16.6421 68.0829,16.6307 68.0841,16.5804 68.0839,16.5417 68.0864,16.5398 68.0868,16.5272 68.0897,16.5132 68.0963,16.4894 68.1212,16.4818 68.1243,16.4697 68.1257,16.4521 68.1223,16.4587 68.1187,16.4486 68.108,16.4406 68.1058,16.4382 68.0963,16.4295 68.0921,16.4211 68.0913,16.4004 68.0931,16.3799 68.0778,16.3687 68.073,16.3607 68.0696,16.3494 68.0501,16.3582 68.0426,16.371 68.0408,16.4011 68.0426,16.4184 68.0398,16.4344 68.0397,16.4727 68.0317,16.4986 68.0334,16.5106 68.0297,16.491 68.0136,16.4666 68.0039,16.4617 67.9973,16.4673 67.9925,16.4832 67.9853,16.4784 67.9805,16.4953 67.9768,16.5107 67.981,16.5347 67.9805,16.524 67.9744,16.5205 67.9692,16.5024 67.966,16.484 67.9688,16.4689 67.9746,16.4238 68.0106,16.384 68.0335,16.3709 68.0229,16.3633 68.024,16.3452 68.0341,16.3326 68.0331,16.3119 68.0349,16.3097 68.0295,16.3381 67.9994,16.3646 67.9802,16.3982 67.9559,16.4063 67.9528,16.4176 67.9564,16.4382 67.957,16.4463 67.9586,16.4726 67.9585,16.4755 67.9567,16.4591 67.9543,16.4473 67.9412,16.4456 67.9315,16.4497 67.9278,16.4675 67.9227,16.468 67.9184,16.4391 67.9239,16.4323 67.9292,16.4198 67.9391,16.4135 67.9487,16.3975 67.9515,16.3879 67.9555,16.3683 67.9693,16.3473 67.9767,16.3174 68.0011,16.2936 68.0121,16.2678 68.0325,16.2609 68.0335,16.2473 68.0354,16.2368 68.04,16.2286 68.0411,16.2232 68.0407,16.2306 68.0315,16.2225 68.0253,16.1891 68.0286,16.184 68.0272,16.1819 68.0239,16.1888 68.021,16.2115 68.0166,16.2169 68.0101,16.2225 68.0078,16.2216 68.0045,16.2502 68.005,16.2602 68.0021,16.2877 67.9889,16.2687 67.9889,16.2659 67.9858,16.2739 67.9826,16.2748 67.9822,16.2901 67.9691,16.2898 67.9633,16.2687 67.9446,16.2584 67.9196,16.2466 67.9072,16.2493 67.9062,16.2747 67.9069,16.3077 67.8935,16.3185 67.8918,16.3424 67.8911,16.3506 67.8897,16.3584 67.8883,16.3956 67.8794,16.4114 67.8701,16.4292 67.865,16.4677 67.8646,16.4712 67.8627,16.4468 67.8517,16.4444 67.8447,16.4498 67.8401,16.4822 67.8303,16.5186 67.8236,16.5157 67.8209,16.4966 67.8193,16.4658 67.8258,16.4212 67.8427,16.4113 67.8501,16.387 67.8545,16.3571 67.8685,16.3492 67.8707,16.3263 67.8719,16.3145 67.8749,16.2793 67.897,16.2694 67.8996,16.2597 67.8995,16.2438 67.8952,16.2283 67.8941,16.2168 67.898,16.2082 67.9094,16.211 67.9215,16.2364 67.9539,16.2393 67.9669,16.2337 67.9738,16.2055 67.9897,16.1937 68.0012,16.1718 68.0093,16.147 68.0278,16.1356 68.0313,16.1177 68.034,16.08 68.0523,16.0667 68.0493,16.0524 68.0524,16.0669 68.066,16.1045 68.0914,16.0931 68.0949,16.0969 68.1074,16.1038 68.1134,16.1088 68.1242,16.0994 68.1312,16.1081 68.1416,16.1147 68.1447,16.1175 68.1544,16.1256 68.1615,16.1382 68.1724,16.1318 68.1779,16.1358 68.1877,16.1328 68.1915,16.1206 68.1998,16.1062 68.2027,16.1018 68.2009,16.1077 68.1954,16.1054 68.1925,16.0918 68.1927,16.0859 68.1851,16.0509 68.1865,16.0372 68.1825,16.0203 68.1919,16.0192 68.1979,16.0263 68.1991,16.0437 68.1986,16.0572 68.2046,16.0585 68.2052,16.0665 68.2053,16.0812 68.2102,16.107 68.2084,16.1098 68.2095,16.079 68.2266,16.0661 68.2264,16.0604 68.2245,16.0422 68.2296,16.0568 68.237,16.0526 68.2472,16.0617 68.2565,16.0557 68.2625,16.0502 68.2641,16.034 68.2623,16.0282 68.2653,15.979 68.2671,15.9762 68.2672,15.9624 68.2698,15.9526 68.2653,15.9423 68.2647,15.9386 68.2625,15.9445 68.259,15.9331 68.2579,15.9327 68.2549,15.948 68.2449,15.945 68.2404,15.939 68.2397,15.9522 68.2329,15.9554 68.2282,15.9499 68.2174,15.9547 68.2114,15.9371 68.2082,15.9351 68.2044,15.9212 68.2034,15.9165 68.2007,15.9007 68.204,15.8882 68.2023,15.8844 68.2047,15.8859 68.21,15.8684 68.2118,15.863 68.2123,15.8495 68.2056,15.8454 68.1902,15.8522 68.1841,15.8511 68.1794,15.8637 68.1786,15.8785 68.172,15.8673 68.1684,15.8657 68.1653,15.8797 68.1618,15.9099 68.1618,15.9264 68.1581,15.9162 68.1552,15.9063 68.1552,15.892 68.1579,15.8745 68.1565,15.8725 68.1527,15.8839 68.1518,15.8857 68.1498,15.8732 68.144,15.8795 68.1424,15.8872 68.1405,15.8602 68.1256,15.8516 68.1252,15.8426 68.1203,15.8317 68.1198,15.8107 68.1219,15.7957 68.1124,15.8019 68.1041,15.7989 68.1017,15.769 68.1051,15.7624 68.1064,15.7514 68.1122,15.7441 68.1121,15.7263 68.1077,15.7212 68.1042,15.7252 68.0971,15.7313 68.095,15.7264 68.0909,15.7034 68.0936,15.7025 68.0936,15.686 68.0924,15.6726 68.0939,15.647 68.083,15.6607 68.0741,15.648 68.0674,15.6479 68.0616,15.6445 68.0608,15.6366 68.0625,15.6306 68.066,15.6313 68.0699,15.6207 68.0725,15.6168 68.0769,15.6094 68.0791,15.6157 68.0826,15.6337 68.0843,15.6445 68.0891,15.6436 68.092,15.6205 68.0991,15.631 68.1032,15.6106 68.1116,15.6085 68.1121,15.5947 68.1153,15.6066 68.1206,15.6182 68.1149,15.681 68.1088,15.6914 68.109,15.712 68.1144,15.7156 68.1268,15.7037 68.1316,15.7019 68.1437,15.6888 68.1505,15.6874 68.1548,15.6889 68.156,15.6978 68.1552,15.706 68.1526,15.7171 68.1546,15.7179 68.1643,15.7168 68.1653,15.7044 68.1762,15.6897 68.1779,15.686 68.1759,15.6551 68.1801,15.6521 68.1816,15.6597 68.1831,15.6814 68.183,15.6821 68.1888,15.6783 68.191,15.6639 68.1917,15.6438 68.1907,15.6287 68.1937,15.6194 68.1936,15.6154 68.1906,15.5961 68.1889,15.593 68.1869,15.5992 68.1851,15.6141 68.1869,15.6156 68.184,15.6113 68.1817,15.63 68.1811,15.6208 68.1771,15.6254 68.1699,15.6231 68.168,15.621 68.1663,15.6261 68.1596,15.6237 68.1514,15.614 68.1467,15.6041 68.1469,15.5969 68.1542,15.5917 68.1552,15.5766 68.1501,15.5742 68.1478,15.5838 68.1426,15.5771 68.1384,15.5763 68.135,15.5656 68.1338,15.5607 68.1297,15.5544 68.1299,15.5404 68.1394,15.5303 68.1381,15.5177 68.1272,15.5274 68.1177,15.5227 68.115,15.5131 68.1141,15.4988 68.1186,15.4972 68.121,15.4964 68.1221,15.5026 68.136,15.5102 68.1393,15.5114 68.1435,15.5199 68.148,15.5184 68.1507,15.5068 68.1541,15.4785 68.1579,15.4682 68.1573,15.4551 68.1558,15.4545 68.1516,15.4297 68.1501,15.4216 68.1465,15.406 68.147,15.4022 68.1454,15.4163 68.1359,15.4189 68.1314,15.4067 68.1291,15.3796 68.1173,15.376 68.1119,15.3754 68.1109,15.3696 68.1098,15.3536 68.1137,15.3398 68.1087,15.3235 68.0863,15.3273 68.0821,15.3269 68.0757,15.3339 68.0767,15.3413 68.071,15.3386 68.0698,15.2945 68.069,15.282 68.0659,15.2743 68.0609,15.274 68.0543,15.2782 68.0489,15.2909 68.0417,15.2914 68.0382,15.2837 68.0298,15.2881 68.0286,15.3221 68.0191,15.3513 68.0197,15.3692 68.0235,15.3749 68.021,15.3665 68.0086,15.3714 68.0066,15.3925 68.004,15.4083 68.0043,15.4122 68.0058,15.4134 68.0137,15.4201 68.0177,15.4335 68.0198,15.4351 68.0266,15.4327 68.0283,15.4097 68.0315,15.3994 68.0347,15.3932 68.0429,15.3955 68.0453,15.4056 68.0451,15.4103 68.0451,15.424 68.0505,15.4338 68.0504,15.443 68.0485,15.4622 68.0521,15.4766 68.0592,15.484 68.0591,15.489 68.0567,15.4984 68.0583,15.4955 68.0616,15.499 68.0643,15.5066 68.0655,15.5227 68.075,15.5168 68.0782,15.5242 68.0842,15.5167 68.1023,15.5225 68.1016,15.5337 68.0931,15.5461 68.0888,15.5613 68.0876,15.5699 68.0834,15.5864 68.08,15.5883 68.0778,15.5851 68.0762,15.5706 68.0752,15.5682 68.073,15.5785 68.0695,15.5791 68.0597,15.5836 68.0569,15.5791 68.0516,15.584 68.0495,15.6122 68.0512,15.6257 68.052,15.6363 68.0494,15.6671 68.051,15.6967 68.0485,15.7199 68.049,15.7332 68.0418,15.7416 68.04,15.7615 68.0395,15.8136 68.0416,15.8191 68.0437,15.8042 68.0484,15.7822 68.0461,15.7554 68.0493,15.77 68.0582,15.7809 68.0554,15.7893 68.0533,15.8147 68.0566,15.829 68.054,15.8447 68.0445,15.8621 68.0415,15.8781 68.0415,15.9287 68.0362,15.935 68.0295,15.9434 68.028,15.9427 68.0241,15.9489 68.0218,15.9583 68.0211,15.9642 68.0176,15.9454 68.0125,15.945 68.0033,15.9537 67.9986,15.9665 68.0012,15.9771 68.0005,15.9846 68.0022,15.9903 68.0035,15.9927 68.0015,15.987 67.9979,15.9754 67.9956,15.9624 67.9962,15.9579 67.9949,15.9589 67.9912,15.968 67.9854,15.9808 67.9811,15.9801 67.9771,15.9593 67.9834,15.9474 67.9843,15.947 67.9818,15.9584 67.976,15.9488 67.9731,15.9245 67.9767,15.917 67.9815,15.9023 67.9836,15.8929 67.9782,15.9356 67.9682,15.9211 67.962,15.9052 67.955,15.8985 67.9483,15.8829 67.941,15.8817 67.9369,15.8944 67.9291,15.8873 67.9219,15.8905 67.917,15.8856 67.9152,15.8711 67.9208,15.8528 67.9249,15.8358 67.9497,15.8191 67.9628,15.7934 67.9712,15.7787 67.9731,15.7478 67.9741,15.7314 67.9718,15.6931 67.9709,15.6559 67.9643,15.6576 67.9614,15.6596 67.958,15.6508 67.9567,15.6118 67.9564,15.6048 67.9552,15.5963 67.9509,15.5867 67.9301,15.5678 67.9302,15.5438 67.9165,15.5412 67.9192,15.5515 67.9293,15.5657 67.937,15.5628 67.9406,15.5529 67.945,15.5419 67.9449,15.4992 67.9404,15.4857 67.9366,15.4608 67.9362,15.4471 67.9328,15.4352 67.9318,15.4149 67.9245,15.3846 67.9177,15.3584 67.9096,15.3563 67.9065,15.343 67.9082,15.3433 67.909,15.3451 67.9132,15.362 67.9214,15.3587 67.9225,15.3316 67.9211,15.3155 67.916,15.2897 67.9047,15.2856 67.8965,15.273 67.8881,15.2146 67.8627,15.2044 67.8544,15.1976 67.8567,15.2031 67.8643,15.1987 67.8705,15.2007 67.8736,15.2206 67.8789,15.2468 67.886,15.2563 67.8906,15.2593 67.8949,15.2563 67.8966,15.2447 67.8965,15.2232 67.893,15.2123 67.8967,15.229 67.9018,15.2279 67.905,15.2184 67.9061,15.1934 67.9041,15.1707 67.8987,15.1343 67.898,15.1193 67.9028,15.102 67.9034,15.0958 67.9054,15.0916 67.911,15.0621 67.9115,15.0079 67.9124,15 67.9108,14.9548 67.9012,14.9067 67.8932,14.8855 67.8874,14.882 67.8849,14.8923 67.878,14.8462 67.868,14.8469 67.8658,14.8596 67.8643,14.9194 67.8643,14.9419 67.8682,14.9608 67.8683,14.9717 67.8705,14.991 67.8675,15 67.8689,15.0374 67.8749,15.0889 67.8777,15.123 67.8763,15.1408 67.8739,15.166 67.8734,15.1762 67.8702,15.1719 67.8665,15.1472 67.8656,15.1417 67.8662,15.1088 67.8692,15.1002 67.8598,15.0909 67.8566,15.0845 67.8577,15.0925 67.8632,15.0852 67.8649,15.0764 67.862,15.0695 67.8623,15.07 67.8686,15.0646 67.8702,15.0467 67.8686,15.0022 67.8592,15 67.8593,14.9541 67.8609,14.9416 67.8599,14.9184 67.8528,14.9012 67.8511,14.8976 67.8493,14.8985 67.8485,14.9052 67.8427,14.8979 67.8392,14.8896 67.8383,14.8722 67.8393,14.8376 67.8499,14.8127 67.8549,14.7965 67.8477,14.7975 67.8422,14.7811 67.8419,14.7714 67.8401,14.7671 67.8366,14.7787 67.8328,14.7773 67.8316,14.7671 67.8311,14.771 67.8251,14.7518 67.8133,14.7604 67.8078,14.7722 67.8069,14.7707 67.8043,14.7792 67.799,14.7844 67.8015,14.7903 67.8021,14.7945 67.7986,14.8173 67.8031,14.8409 67.8128,14.8511 67.8151,14.853 67.8131,14.8454 67.801,14.8461 67.8007,14.8557 67.796,14.8758 67.7958,14.8769 67.7942,14.8433 67.7875,14.8307 67.7814,14.8268 67.7766,14.832 67.7757,14.966 67.7915,14.9926 67.7978,15 67.797,15.0203 67.7949,15.033 67.7972,15.0416 67.7987,15.0478 67.7962,15.0419 67.7939,15.0328 67.7939,15.026 67.7922,15.004 67.7833,15.0022 67.7796,15.0154 67.7726,15.033 67.7782,15.0463 67.7766,15.0289 67.7686,15.0304 67.7639,15.077 67.7681,15.1288 67.7695,15.1485 67.7725,15.1504 67.7703,15.1382 67.7667,15.1354 67.7665,15.1198 67.7654,15.1034 67.7617,15.0527 67.755,15.0052 67.7555,15 67.7553,14.9645 67.7537,14.9313 67.7493,14.899 67.7425,14.8422 67.747,14.819 67.7443,14.792 67.7411,14.7719 67.7411,14.7651 67.7271,14.7683 67.7266,14.7879 67.7333,14.7956 67.7339,14.8176 67.7262,14.8117 67.7222,14.8143 67.7217,14.8331 67.7235,14.8529 67.7221,14.8808 67.7242,14.9095 67.7181,14.8586 67.7047,14.8565 67.7041,14.8153 67.6987,14.7492 67.6845,14.7456 67.6806,14.7478 67.6777,14.7671 67.6708,14.7772 67.6695,14.7671 67.6653,14.7686 67.6628,14.8101 67.6635,14.8287 67.6586,14.8404 67.658,14.8948 67.6608,14.9022 67.6612,14.9184 67.6654,14.956 67.6706,14.9873 67.6785,15 67.6837,15.0175 67.6954,15.0252 67.6962,15.0308 67.6937,15.0277 67.6885,15.0305 67.6854,15.0394 67.6858,15.0671 67.694,15.1076 67.7092,15.1254 67.7102,15.1339 67.7143,15.1486 67.7212,15.1553 67.721,15.1641 67.7161,15.1884 67.7274,15.1918 67.734,15.2165 67.7459,15.2038 67.7534,15.2043 67.7576,15.2146 67.7633,15.2543 67.7683,15.301 67.7822,15.3192 67.7938,15.325 67.7966,15.3678 67.8037,15.3771 67.8071,15.3887 67.8148,15.4104 67.839,15.4076 67.8418,15.4054 67.8427,15.3911 67.848,15.3848 67.8546,15.3869 67.8695,15.3758 67.8775,15.3764 67.8814,15.3845 67.8809,15.3903 67.8779,15.3988 67.8564,15.4073 67.8487,15.4135 67.8465,15.4316 67.8509,15.4374 67.854,15.4339 67.8671,15.4372 67.8684,15.454 67.8535,15.4569 67.8496,15.4532 67.8404,15.4448 67.8359,15.422 67.8349,15.4186 67.8281,15.4356 67.8164,15.4445 67.8133,15.4513 67.815,15.4599 67.8145,15.4676 67.8074,15.5181 67.7933,15.5665 67.7841,15.5914 67.784,15.6153 67.7874,15.6217 67.7842,15.6387 67.7803,15.658 67.7786,15.6776 67.7739,15.6808 67.7725,15.7126 67.7581,15.7365 67.7532,15.7855 67.7474,15.7968 67.7401,15.7906 67.726,15.7961 67.7175,15.8049 67.7124,15.825 67.7077,15.8342 67.7071,15.8449 67.7101,15.8517 67.7095,15.8478 67.7022,15.8369 67.696,15.8434 67.6924,15.8309 67.6895,15.8223 67.694,15.811 67.6954,15.8017 67.7044,15.7833 67.7073,15.7715 67.7126,15.7696 67.7316,15.7658 67.7342,15.7172 67.7365,15.7007 67.739,15.6442 67.7557,15.6239 67.7642,15.6137 67.7684,15.5862 67.767,15.5614 67.7708,15.5351 67.7715,15.5074 67.7705,15.4828 67.7679,15.4594 67.7611,15.4421 67.7601,15.4294 67.7618,15.4141 67.7582,15.4114 67.7551,15.4184 67.7503,15.4411 67.7417,15.4537 67.7321,15.4573 67.7263,15.4605 67.725,15.4739 67.7196,15.5165 67.7231,15.5561 67.7241,15.5695 67.7219,15.6592 67.6934,15.6571 67.6903,15.6426 67.6901,15.5897 67.7012,15.58 67.7046,15.5579 67.7122,15.5436 67.7135,15.5108 67.7058,15.5089 67.7023,15.5196 67.6929,15.5359 67.6869,15.5329 67.6849,15.5006 67.6918,15.4818 67.6997,15.4754 67.7008,15.4633 67.6989,15.4307 67.7083,15.4101 67.7083,15.3951 67.7196,15.3449 67.7369,15.315 67.7414,15.306 67.7412,15.2952 67.7271,15.2705 67.7191,15.2514 67.7026,15.2597 67.7017,15.2671 67.7008,15.3336 67.7012,15.3429 67.6966,15.3406 67.6924,15.3326 67.6908,15.2794 67.6926,15.2392 67.6876,15.221 67.6725,15.1939 67.6625,15.1786 67.647,15.1761 67.6444,15.1717 67.6355,15.1782 67.6303,15.1954 67.6274,15.2484 67.6298,15.2871 67.643,15.296 67.6358,15.3198 67.6312,15.3519 67.619,15.3772 67.6192,15.4114 67.6106,15.4119 67.6104,15.4297 67.6133,15.4371 67.6129,15.4407 67.603,15.4458 67.6002,15.4612 67.597,15.4513 67.5823,15.4456 67.5792,15.4396 67.581,15.4398 67.596,15.4272 67.6037,15.406 67.6021,15.3658 67.6111,15.3251 67.618,15.3139 67.6225,15.312 67.6232,15.2476 67.6187,15.2433 67.6153,15.2594 67.6103,15.2553 67.6078,15.2311 67.606,15.2235 67.6036,15.2181 67.5996,15.2281 67.5964,15.2158 67.5936,15.2147 67.5894,15.2373 67.5846,15.239 67.5829,15.2348 67.5811,15.2218 67.58,15.2221 67.5736,15.2165 67.5701,15.2191 67.5583,15.2278 67.5534,15.26 67.5466,15.2943 67.5352,15.307 67.5406,15.3502 67.5352,15.3713 67.535,15.382 67.5362,15.4021 67.5384,15.4114 67.5336,15.4242 67.5331,15.4408 67.5337,15.4535 67.5375,15.4637 67.5375,15.4786 67.5322,15.4838 67.5269,15.4879 67.5257,15.5147 67.5179,15.5253 67.5126,15.5739 67.5347,15.6279 67.5474,15.6704 67.5621,15.7021 67.5687,15.7278 67.5696,15.7409 67.572,15.7428 67.5737,15.7889 67.5765,15.7953 67.5796,15.7921 67.582,15.7949 67.5848,15.8058 67.5825,15.819 67.5829,15.8316 67.5871,15.8521 67.587,15.8713 67.5935,15.8853 67.595,15.886 67.5928,15.8731 67.5892,15.8675 67.5858,15.8697 67.5845,15.8914 67.5843,15.8948 67.581,15.8913 67.5783,15.8564 67.5764,15.8445 67.5736,15.811 67.5731,15.791 67.5713,15.7772 67.5673,15.7556 67.5669,15.7325 67.5615,15.7096 67.5599,15.6862 67.5554,15.6621 67.5458,15.6239 67.5304,15.6 67.5239,15.5352 67.4838,15.5344 67.4806,15.5526 67.4738,15.5637 67.4747,15.5836 67.4823,15.594 67.4816,15.5714 67.4707,15.5657 67.4679,15.5515 67.4652,15.5345 67.4643,15.524 67.4613,15.5158 67.4508,15.5208 67.4459,15.5333 67.4401,15.5495 67.4359,15.5555 67.4281,15.5785 67.4131,15.5924 67.4104,15.6191 67.4111,15.6318 67.4126,15.6651 67.4214,15.6758 67.4219,15.6787 67.4199,15.6709 67.4168,15.6557 67.4107,15.664 67.4071,15.7498 67.3892,15.7715 67.3802,15.7765 67.3754,15.7743 67.3727,15.7677 67.3709,15.7749 67.3645,15.7732 67.3619,15.7413 67.3651,15.7341 67.3632,15.7201 67.35,15.7127 67.3467,15.707 67.3499,15.7105 67.3527,15.7326 67.3703,15.734 67.3779,15.7192 67.3918,15.6939 67.3987,15.6537 67.4032,15.6368 67.4039,15.6211 67.4004,15.5972 67.4005,15.5952 67.3972,15.6152 67.3882,15.6142 67.3794,15.6323 67.3743,15.6331 67.374,15.6357 67.3712,15.62 67.3597,15.604 67.3535,15.6615 67.3344,15.6845 67.3328,15.7014 67.3301,15.7101 67.3268,15.6856 67.3149,15.627 67.3301,15.6119 67.3446,15.5909 67.3531,15.5893 67.3606,15.5916 67.363,15.5829 67.3682,15.5836 67.3719,15.5794 67.374,15.5654 67.3729,15.5522 67.3772,15.5499 67.4026,15.5449 67.4095,15.5237 67.4323,15.4875 67.4452,15.4831 67.4517,15.4859 67.4564,15.4848 67.4675,15.4842 67.474,15.4794 67.4798,15.4655 67.4863,15.4577 67.4942,15.4393 67.4992,15.3857 67.5037,15.3793 67.5071,15.3556 67.506,15.3135 67.508,15.2956 67.5116,15.2898 67.5111,15.2845 67.5067,15.2704 67.5056,15.2621 67.5016,15.2418 67.4993,15.2367 67.4965,15.231 67.4935,15.227 67.4871,15.2304 67.4819,15.226 67.4769,15.2115 67.4716,15.2007 67.464,15.1705 67.4589,15.1637 67.4559,15.1607 67.4463,15.1439 67.4368,15.1414 67.4392,15.1486 67.4487,15.1484 67.4531,15.1405 67.461,15.1423 67.4627,15.1604 67.4645,15.1701 67.4677,15.182 67.4758,15.1829 67.4777,15.1859 67.4843,15.179 67.4909,15.1545 67.4962,15.1593 67.5001,15.1845 67.5001,15.2128 67.5055,15.2481 67.5078,15.2507 67.5112,15.2307 67.5135,15.204 67.5191,15.2078 67.5267,15.209 67.5291,15.2041 67.5332,15.1963 67.5351,15.1716 67.5372,15.1586 67.5364,15.1383 67.5283,15.1159 67.5232,15.0934 67.5127,15.0624 67.5138,15.0425 67.5082,15.0307 67.4982,15 67.4896,14.9983 67.4891,14.9809 67.4869,14.9563 67.4888,14.9536 67.4896,14.9444 67.4923,14.9483 67.495,14.9751 67.4975,15 67.5015,15.0048 67.5023,15.0252 67.5079,15.0523 67.5209,15.083 67.5301,15.088 67.5331,15.0821 67.5368,15.049 67.5424,15.0402 67.5454,15.0345 67.5574,15.0243 67.5647,15.0102 67.5599,15.0086 67.5594,15.0012 67.5615,15 67.5625,14.9965 67.565,15 67.5701,15.0059 67.5788,15.0103 67.5799,15.0234 67.5787,15.0421 67.5713,15.0893 67.5461,15.1017 67.5432,15.1137 67.5431,15.159 67.5523,15.1593 67.5682,15.1549 67.5708,15.1395 67.5716,15.1341 67.5719,15.1284 67.5744,15.128 67.5815,15.0765 67.5973,15.0613 67.5975,15.0445 67.5935,15.0078 67.5895,15 67.588,14.9316 67.5755,14.897 67.5672,14.8902 67.5641,14.8897 67.5583,14.885 67.5569,14.8683 67.5518,14.8476 67.5506,14.8344 67.5433,14.7941 67.5289,14.7778 67.5272,14.7577 67.5225,14.7531 67.5165,14.7341 67.5119,14.7129 67.5019,14.6928 67.4991,14.6933 67.4975,14.7011 67.4958,14.6797 67.4881,14.6622 67.4865,14.6553 67.4824,14.6547 67.482,14.6348 67.475,14.6272 67.471,14.6294 67.4697,14.632 67.4691,14.6463 67.4731,14.6513 67.4724,14.654 67.4698,14.6508 67.4579,14.6564 67.4538,14.6673 67.4534,14.671 67.4549,14.6744 67.4627,14.6805 67.466,14.7294 67.4509,14.7404 67.4501,14.7592 67.4496,14.7857 67.4529,14.8123 67.4632,14.8329 67.4644,14.8842 67.4561,14.9449 67.4484,14.956 67.4491,14.9911 67.4575,15 67.4575,15.018 67.4576,15.053 67.4606,15.0637 67.4574,15.0571 67.4537,15.012 67.4502,15 67.4493,14.9857 67.4483,14.9733 67.4458,14.9483 67.4322,14.9356 67.4291,14.9257 67.43,14.9146 67.429,14.9009 67.4217,14.8668 67.4085,14.855 67.4008,14.8542 67.3833,14.8445 67.3853,14.8166 67.3867,14.8165 67.3888,14.8284 67.3954,14.8438 67.4039,14.8693 67.4337,14.8643 67.4365,14.8423 67.4393,14.8165 67.4466,14.8008 67.4472,14.7891 67.4391,14.773 67.4369,14.7443 67.442,14.7187 67.4398,14.6841 67.4427,14.6802 67.4423,14.6614 67.4407,14.6388 67.4421,14.6306 67.438,14.6223 67.4164,14.6146 67.4125,14.6013 67.4112,14.5736 67.4116,14.5703 67.4073,14.5728 67.4052,14.5812 67.4033,14.6274 67.403,14.6287 67.3992,14.6113 67.3833,14.584 67.3773,14.5668 67.3735,14.5605 67.364,14.5671 67.3604,14.53 67.3482,14.4985 67.3424,14.4872 67.3372,14.4741 67.3267,14.4509 67.3211,14.4465 67.3167,14.4339 67.3117,14.4197 67.3096,14.3999 67.3116,14.3884 67.3087,14.3833 67.3045,14.3867 67.298,14.3879 67.2979,14.4009 67.2967,14.4054 67.2941,14.4035 67.2908,14.3265 67.2707,14.3105 67.2687,14.3061 67.266,14.3193 67.2639,14.321 67.2607,14.3141 67.2567,14.3178 67.2546,14.3267 67.2546,14.3889 67.2643,14.4035 67.2685,14.4226 67.2685,14.4429 67.2715,14.4469 67.2721,14.5228 67.2768,14.5733 67.2771,14.6199 67.2856,14.6336 67.2856,14.6552 67.2888,14.6769 67.2949,14.6885 67.296,14.7148 67.2938,14.7177 67.2905,14.7155 67.2865,14.7084 67.2845,14.7115 67.2805,14.7079 67.2748,14.7024 67.2722,14.7099 67.2638,14.7066 67.2559,14.7029 67.2474,14.7055 67.245,14.7135 67.2424,14.728 67.2417,14.7748 67.253,14.7915 67.2601,14.7989 67.2626,14.8247 67.2663,14.8435 67.2688,14.8503 67.2709,14.8553 67.2769,14.8578 67.2797,14.8627 67.2824,14.8531 67.2853,14.8318 67.2871,14.8135 67.2831,14.8098 67.2823,14.8068 67.2826,14.8023 67.2857,14.7888 67.2902,14.7865 67.2918,14.7895 67.2931,14.8013 67.2941,14.8212 67.2933,14.8285 67.2921,14.8433 67.2942,14.8606 67.2943,14.879 67.2943,14.9062 67.2921,14.9317 67.2899,14.9475 67.2909,14.9705 67.2927,14.9788 67.2922,14.9923 67.2895,14.9986 67.2914,15 67.2915,15.0149 67.2928,15.0292 67.2948,15.0362 67.2965,15.0339 67.2981,15.0185 67.2976,15 67.2971,14.9923 67.2968,14.9896 67.2978,14.9902 67.2996,14.9968 67.3042,15 67.3052,15.0047 67.3068,15.0137 67.3092,15.0223 67.3129,15.0341 67.3193,15.0424 67.3203,15.0493 67.3207,15.0569 67.3221,15.0671 67.3226,15.0823 67.322,15.0998 67.3213,15.1128 67.3221,15.1262 67.3234,15.14 67.3273,15.149 67.328,15.1608 67.329,15.1695 67.3307,15.1746 67.331,15.1773 67.3297,15.1785 67.3278,15.1721 67.315,15.1669 67.3095,15.1614 67.3065,15.1576 67.3021,15.1557 67.2989,15.1549 67.2962,15.1584 67.296,15.1661 67.2972,15.1742 67.2989,15.1787 67.2973,15.1661 67.2916,15.1628 67.291,15.1564 67.2914,15.1486 67.2924,15.1453 67.2918,15.1434 67.2906,15.1421 67.2892,15.1366 67.2885,15.1223 67.2863,15.1147 67.283,15.1082 67.2798,15.1004 67.2788,15.0969 67.2809,15.0943 67.2838,15.0919 67.284,15.0874 67.282,15.0745 67.2807,15.0586 67.2799,15.0507 67.2778,15.0472 67.2761,15.0465 67.2723,15.0551 67.2692,15.0659 67.2688,15.0793 67.2715,15.1026 67.2712,15.121 67.2735,15.132 67.271,15.1465 67.2678,15.1464 67.2643,15.1521 67.2613,15.1689 67.2589,15.1772 67.2554,15.1853 67.2541,15.2018 67.2584,15.2233 67.26,15.2492 67.2684,15.2587 67.2686,15.2807 67.2647,15.2938 67.2644,15.3067 67.2671,15.3151 67.2649,15.3301 67.2663,15.3498 67.2624,15.3531 67.2591,15.352 67.2512,15.3453 67.2477,15.3215 67.2444,15.3123 67.2432,15.2922 67.2446,15.2611 67.2397,15.2576 67.2375,15.2615 67.2344,15.2951 67.2334,15.3057 67.2298,15.3142 67.2292,15.3285 67.2366,15.3527 67.243,15.3654 67.25,15.3957 67.258,15.4323 67.2608,15.4385 67.2579,15.425 67.2476,15.4146 67.2405,15.3912 67.2373,15.3593 67.2253,15.3735 67.2195,15.3824 67.2197,15.3932 67.2232,15.4029 67.2243,15.4063 67.2228,15.3996 67.2175,15.4034 67.2149,15.4152 67.215,15.4329 67.2095,15.4478 67.1994,15.4583 67.198,15.4803 67.1877,15.4766 67.1765,15.4796 67.1723,15.4806 67.1719,15.4869 67.1696,15.4897 67.1642,15.4877 67.163,15.4786 67.1637,15.4658 67.1533,15.4538 67.1518,15.4497 67.1496,15.4568 67.1418,15.4535 67.133,15.458 67.1258,15.4568 67.1221,15.4465 67.1191,15.4464 67.1154,15.4596 67.1128,15.4772 67.1053,15.472 67.1009,15.463 67.1014,15.4569 67.106,15.4356 67.108,15.4287 67.1093,15.4031 67.1061,15.3983 67.1084,15.4047 67.1186,15.4297 67.1376,15.4278 67.1399,15.4188 67.1383,15.3994 67.1303,15.3915 67.1327,15.4225 67.1672,15.4244 67.1728,15.4118 67.1833,15.412 67.1858,15.4121 67.1879,15.3984 67.1923,15.3687 67.1905,15.3503 67.1925,15.3363 67.1918,15.3201 67.1943,15.311 67.1932,15.2989 67.1998,15.2848 67.2012,15.2757 67.2056,15.2687 67.2131,15.2269 67.2236,15.2164 67.2229,15.202 67.2176,15.1753 67.2157,15.1632 67.2126,15.153 67.2131,15.148 67.2153,15.1433 67.2174,15.1347 67.2297,15.1244 67.2324,15.1079 67.2337,15.0919 67.2376,15.0754 67.237,15.0651 67.234,15.0554 67.2369,15.038 67.2371,15.0298 67.2349,15.0308 67.2296,15.0251 67.2215,15.0123 67.2115,15 67.2086,14.9775 67.2034,14.944 67.1857,14.9267 67.1788,14.9178 67.166,14.9472 67.1593,14.9615 67.1589,14.9692 67.1572,14.9726 67.1539,14.9703 67.1503,14.9679 67.1465,14.9767 67.1426,14.9914 67.1375,14.9994 67.1331,15 67.1311,15 67.1301,14.9964 67.1258,14.9844 67.1206,14.9775 67.1201,14.971 67.122,14.9467 67.1386,14.9446 67.1533,14.9397 67.1548,14.9225 67.1549,14.893 67.1639,14.8904 67.1681,14.8933 67.174,14.9002 67.1783,14.9328 67.1932,14.9456 67.1991,14.9478 67.207,14.9402 67.2179,14.9436 67.2239,14.9587 67.223,14.9644 67.2256,14.9709 67.2259,14.9867 67.234,14.9901 67.2381,14.9876 67.2423,14.9717 67.2492,14.9481 67.2448,14.9043 67.2314,14.8897 67.2289,14.8624 67.2289,14.8519 67.2279,14.8485 67.2276,14.8444 67.2292,14.8463 67.2346,14.8427 67.2399,14.8368 67.2417,14.8241 67.2423,14.7895 67.2392,14.7726 67.2363,14.7599 67.2315,14.7511 67.224,14.7259 67.2176,14.6832 67.2155,14.6658 67.2197,14.6377 67.222,14.5976 67.2209,14.5872 67.2198,14.5363 67.2142,14.538 67.2163,14.5648 67.2214,14.605 67.2254,14.6074 67.2272,14.6023 67.2299,14.5989 67.2383,14.5951 67.2409,14.555 67.2398,14.543 67.2419,14.5066 67.2387,14.5042 67.2423,14.489 67.238,14.4598 67.233,14.3879 67.2206,14.3563 67.2123,14.3576 67.1951,14.3635 67.1917,14.3804 67.1873,14.4208 67.1995,14.4381 67.2027,14.4893 67.2092,14.4966 67.2087,14.4889 67.2051,14.4531 67.2021,14.4185 67.1941,14.385 67.1811,14.3699 67.1817,14.3406 67.1772,14.3271 67.1716,14.3209 67.1674,14.3201 67.1627,14.334 67.1519,14.3172 67.1388,14.3116 67.1283,14.3104 67.126,14.2942 67.113,14.2827 67.1154,14.2763 67.1065,14.263 67.1007,14.2502 67.0984,14.2459 67.0954,14.2545 67.0927,14.2661 67.0917,14.3018 67.0945,14.3249 67.0892,14.3182 67.0866,14.2947 67.0844,14.2596 67.0816,14.2442 67.0834,14.238 67.0826,14.2315 67.0774,14.2544 67.071,14.2621 67.0643,14.2748 67.0601,14.274 67.0471,14.2636 67.033,14.2314 67.0151,14.2288 67.0109,14.2338 67.0049,14.2321 67.0016,14.2281 66.9995,14.2138 66.9981,14.2129 66.9982,14.2028 66.9993,14.1901 67.0035,14.1818 67.0021,14.1673 66.9914,14.1582 66.9887,14.1654 67.0017,14.1655 67.0116,14.1534 67.0124,14.1465 67.0035,14.1407 67.0032,14.1412 67.0103,14.1237 67.0415,14.1113 67.0562,14.0993 67.065,14.081 67.0733,14.0655 67.0854,14.0561 67.0883,14.0494 67.0845,14.0458 67.0825,14.0419 67.062,14.0375 67.0578,14.0307 67.0586,14.0276 67.064,14.0236 67.0635,14.0193 67.0559,14.0205 67.0377,14.0255 67.0253,14.0403 67.0086,14.0529 67.0033,14.0571 66.9964,14.0392 66.9938,14.0331 66.9877,14.0267 66.9851,14.0243 66.9842,14.0192 66.9904,14.0033 66.987,13.9859 66.9863,13.9802 66.9841,13.9743 66.9741,13.9443 66.9563,13.9273 66.956,13.9105 66.9535,13.9125 66.9642,13.9092 66.9703,13.8948 66.9757,13.8985 66.9787,13.9285 66.9704,13.9365 66.9697,13.9504 66.9751,13.9526 66.9771,13.9584 66.9824,13.9983 67.0026,14.0007 67.0074,13.9939 67.0116,13.9636 67.0187,13.9551 67.0192,13.9274 67.0126,13.8867 67.0094,13.875 67.0041,13.8669 66.9926,13.8601 66.9902,13.8196 66.9911,13.8078 66.9914,13.7871 66.9882,13.7431 66.9876,13.7306 66.9848,13.7229 66.9786,13.7312 66.9751,13.7476 66.9724,13.7756 66.9714,13.7808 66.9685,13.7809 66.965,13.7403 66.9553,13.7182 66.9532,13.6547 66.9571,13.6205 66.9592,13.5898 66.9563,13.5521 66.9453,13.5434 66.9464,13.5527 66.9546,13.5431 66.9598,13.5001 66.9613,13.4917 66.9587,13.4857 66.9528,13.4867 66.9438,13.4947 66.9383,13.5063 66.9357,13.5185 66.936,13.5271 66.9381,13.5336 66.9366,13.5353 66.9337,13.5251 66.9107,13.53 66.9071,13.5443 66.9051,13.5544 66.9094,13.5668 66.9108,13.5813 66.91,13.6005 66.9121,13.6198 66.9109,13.6333 66.9077,13.6418 66.9006,13.6422 66.8948,13.6497 66.8874,13.6723 66.8802,13.6929 66.8786,13.6971 66.8735,13.7085 66.8681,13.7083 66.8637,13.6952 66.8595,13.6912 66.8545,13.7051 66.8469,13.6969 66.8423,13.6681 66.8377,13.67 66.8343,13.6803 66.8333,13.6985 66.8348,13.7168 66.8391,13.7401 66.8492,13.7454 66.8476,13.7484 66.8441,13.7431 66.8362,13.7591 66.8276,13.7803 66.8242,13.7989 66.8167,13.7999 66.8164,13.8103 66.8141,13.8387 66.8118,13.8746 66.8129,13.9045 66.8094,13.9305 66.8118,13.9464 66.815,13.9568 66.8121,13.9775 66.8114,13.9858 66.8077,13.9857 66.8031,13.9705 66.8048,13.9497 66.8041,13.9308 66.7998,13.912 66.7983,13.8614 66.8024,13.8199 66.7992,13.8 66.8038,13.7533 66.8053,13.7462 66.807,13.7287 66.8067,13.7158 66.8085,13.6951 66.8171,13.683 66.818,13.6744 66.8176,13.6386 66.8161,13.6109 66.8166,13.6015 66.8105,13.5959 66.8098,13.5712 66.8086,13.5498 66.8108,13.5288 66.8107,13.4962 66.807,13.4859 66.8002,13.5098 66.7865,13.5089 66.7779,13.5172 66.7761,13.5241 66.7795,13.5295 66.7794,13.5407 66.7733,13.5471 66.7698,13.5541 66.7697,13.5727 66.7733,13.6065 66.775,13.6373 66.774,13.6638 66.7689,13.722 66.763,13.7396 66.7628,13.7466 66.7597,13.7446 66.7571,13.6718 66.7599,13.6557 66.7614,13.6227 66.7644,13.5669 66.7605,13.5556 66.7564,13.5559 66.7495,13.5489 66.7493,13.5378 66.7524,13.4987 66.7508,13.4713 66.7476,13.4669 66.7436,13.4957 66.7416,13.5294 66.7422,13.5509 66.7363,13.5527 66.734,13.5616 66.717,13.5682 66.7149,13.5911 66.7144,13.6616 66.7177,13.6739 66.7207,13.68 66.7264,13.6964 66.7278,13.7037 66.7303,13.7292 66.7322,13.7727 66.7347,13.7868 66.7327,13.8168 66.7332,13.8865 66.7344,13.8898 66.7334,13.8836 66.7296,13.8641 66.7269,13.8013 66.7266,13.7534 66.7237,13.6935 66.723,13.685 66.7209,13.6836 66.7183,13.6896 66.7147,13.7003 66.7121,13.7146 66.7085,13.692 66.7017,13.6785 66.7037,13.6034 66.7001,13.5596 66.7003,13.5343 66.7074,13.5262 66.7134,13.5264 66.7238,13.5194 66.7268,13.4953 66.7257,13.4804 66.7218,13.4721 66.7222,13.4705 66.7232,13.454 66.7332,13.4458 66.7345,13.4281 66.7321,13.3995 66.7367,13.3546 66.7379,13.303 66.7356,13.2734 66.7396,13.2584 66.7389,13.2073 66.7305,13.196 66.7266,13.1942 66.7237,13.2001 66.7216,13.2078 66.7188,13.2203 66.7197,13.2276 66.722,13.2409 66.7224,13.2617 66.7169,13.2774 66.7125,13.2793 66.7059,13.2905 66.6997,13.3061 66.6969,13.3406 66.6953,13.3732 66.6907,13.3979 66.6901,13.4193 66.6875,13.4395 66.6882,13.4472 66.6861,13.4525 66.68,13.4619 66.6782,13.463 66.6782,13.4809 66.6786,13.5243 66.6747,13.5309 66.6712,13.531 66.6647,13.5406 66.6576,13.5565 66.6509,13.5544 66.6488,13.5331 66.6482,13.5124 66.6521,13.5153 66.6552,13.5256 66.6575,13.5221 66.6589,13.4991 66.6596,13.4902 66.6619,13.4372 66.6664,13.4263 66.6692,13.4207 66.6672,13.3959 66.6586,13.386 66.6587,13.3723 66.6625,13.3685 66.6572,13.3793 66.6518,13.3759 66.65,13.3648 66.6501,13.3597 66.6528,13.3634 66.6659,13.3585 66.6696,13.3479 66.6715,13.3155 66.6725,13.3019 66.6759,13.2735 66.6726,13.2408 66.6727,13.2322 66.674,13.2297 66.6759,13.2318 66.6825,13.2291 66.683,13.21 66.6861,13.2074 66.6838,13.2117 66.6802,13.2081 66.6774,13.1946 66.6747,13.1885 66.6693,13.166 66.6642,13.1623 66.6619,13.1843 66.6547,13.1963 66.6462,13.2023 66.6368,13.212 66.6312,13.2171 66.6301,13.2289 66.6357,13.2467 66.6347,13.2851 66.6455,13.2998 66.6466,13.3086 66.6449,13.3199 66.6428,13.3334 66.6438,13.3559 66.6368,13.3537 66.6349,13.3431 66.6338,13.3271 66.6344,13.316 66.6331,13.2984 66.6364,13.2962 66.6333,13.3058 66.6308,13.306 66.6274,13.2979 66.6225,13.2748 66.6313,13.2699 66.6275,13.2778 66.622,13.2714 66.6158,13.2675 66.6156,13.2583 66.6197,13.2538 66.627,13.2483 66.6262,13.2326 66.6156,13.2269 66.6152,13.2189 66.6147,13.2166 66.6118,13.2351 66.6016,13.2352 66.5968,13.2217 66.6015,13.2165 66.6014,13.2082 66.5884,13.1925 66.5764,13.1919 66.5646,13.201 66.5605,13.212 66.5589,13.2211 66.5594,13.2478 66.5518,13.2717 66.5484,13.2869 66.5498,13.306 66.5544,13.3105 66.5548,13.329 66.5564,13.3422 66.5628,13.3506 66.5635,13.3847 66.5609,13.4365 66.5619,13.4451 66.5636,13.4988 66.5922,13.5274 66.598,13.5504 66.6095,13.5629 66.6098,13.5723 66.6101,13.6297 66.6166,13.6677 66.6142,13.7098 66.6152,13.7405 66.6089,13.7374 66.6062,13.7195 66.6061,13.7111 66.6035,13.6995 66.6036,13.6843 66.6071,13.6563 66.6076,13.6486 66.6094,13.6197 66.6091,13.6025 66.6054,13.5778 66.6062,13.5626 66.6049,13.5572 66.6037,13.5541 66.5979,13.5417 66.5956,13.5274 66.5888,13.5134 66.5889,13.4987 66.5848,13.4978 66.5762,13.4893 66.5773,13.4834 66.576,13.4705 66.5686,13.4663 66.5628,13.477 66.5606,13.5398 66.5602,13.5551 66.5569,13.6189 66.5435,13.6454 66.5393,13.6531 66.5356,13.6585 66.5209,13.6665 66.5149,13.6585 66.5147,13.5989 66.5334,13.5681 66.5399,13.5128 66.5486,13.5112 66.5487,13.4363 66.5501,13.4103 66.5421,13.3724 66.5413,13.3551 66.5458,13.3374 66.5466,13.3315 66.5453,13.3284 66.5319,13.3246 66.5299,13.3131 66.5296,13.2766 66.5327,13.2591 66.5315,13.2566 66.5274,13.2597 66.5249,13.2757 66.5124,13.2859 66.5083,13.2995 66.5062,13.3028 66.5034,13.2763 66.4879,13.2679 66.4888,13.265 66.4872,13.2774 66.4776,13.274 66.4727,13.2632 66.4709,13.259 66.4681,13.2979 66.4661,13.3367 66.4721,13.3705 66.4714,13.3774 66.47,13.299 66.4558,13.2507 66.4445,13.2496 66.4452,13.244 66.4485,13.2459 66.4512,13.2418 66.4542,13.2174 66.4548,13.2063 66.4564,13.2125 66.46,13.2305 66.4627,13.2413 66.4812,13.2331 66.489,13.219 66.4927,13.2143 66.4959,13.2125 66.5004,13.2172 66.5079,13.2149 66.5138,13.1892 66.5295,13.184 66.5308,13.1751 66.5268,13.1612 66.5295,13.1532 66.531,13.1418 66.5366,13.1293 66.539,13.1261 66.5428,13.116 66.5463,13.1187 66.5483,13.1158 66.5514,13.0607 66.5498,13.0236 66.5321,13.0168 66.5316,13.0045 66.5348,12.9677 66.5341,12.9669 66.5258,12.9749 66.5233,12.9821 66.5182,12.9907 66.5168,12.9966 66.5135,13.002 66.5104,13.0078 66.5103,13.0139 66.5081,13.0157 66.5034,13.0311 66.4967,13.0387 66.4951,13.0722 66.4967,13.0808 66.4954,13.0879 66.4921,13.0976 66.4791,13.1052 66.4742,13.1262 66.4709,13.1532 66.4698,13.1611 66.4673,13.1607 66.4654,13.1333 66.46,13.109 66.4615,13.0851 66.4655,13.0818 66.4661,13.071 66.4656,13.0739 66.4626,13.0969 66.4541,13.1198 66.4398,13.1331 66.4367,13.1347 66.4294,13.1439 66.4191,13.1437 66.4121,13.1183 66.39,13.1025 66.3876,13.0619 66.3749,13.053 66.3734,13.0419 66.3714,13.0202 66.3636,13.0082 66.3635,12.9995 66.359,12.9937 66.3533,13.0025 66.3442,13.0014 66.3365,13.0042 66.3339,13.0188 66.3304,13.0496 66.3266,13.0821 66.3154,13.098 66.3143,13.1101 66.3232,13.1466 66.3344,13.1583 66.331,13.1512 66.3238,13.1405 66.3174,13.1319 66.3154,13.1231 66.3133,13.1142 66.3095,13.1279 66.3039,13.1373 66.3033,13.1583 66.3053,13.216 66.3063,13.2859 66.3173,13.3274 66.326,13.3665 66.3321,13.3745 66.3381,13.3997 66.3385,13.427 66.3484,13.4408 66.3483,13.4642 66.3442,13.4783 66.348,13.4866 66.3474,13.4726 66.3421,13.472 66.3419,13.432 66.3335,13.4288 66.3312,13.4568 66.3225,13.4681 66.3213,13.504 66.3221,13.5454 66.3111,13.5576 66.3107,13.5646 66.3088,13.5596 66.3053,13.5387 66.3089,13.5137 66.31,13.4667 66.3046,13.4619 66.3041,13.3865 66.3063,13.344 66.3033,13.2737 66.2905,13.2223 66.2866,13.2062 66.2838,13.1738 66.2734,13.1372 66.2617,13.1176 66.2517,13.1252 66.2513,13.1638 66.2641,13.1716 66.2632,13.1668 66.2594,13.1298 66.2467,13.1092 66.2422,13.1008 66.2387,13.0941 66.2309,13.08 66.2228,13.0577 66.2161,13.0226 66.2056,13.0146 66.2012,13.0139 66.194,13.0243 66.1819,13.0414 66.1763,13.0512 66.176,13.0776 66.1815,13.1094 66.1911,13.1707 66.1996,13.1936 66.2056,13.2003 66.2089,13.211 66.2141,13.2581 66.2271,13.281 66.2392,13.2982 66.2437,13.3172 66.2527,13.3298 66.2541,13.3452 66.2528,13.3846 66.2392,13.4007 66.239,13.4108 66.2412,13.4434 66.2443,13.4504 66.2461,13.4596 66.2483,13.4769 66.2558,13.5272 66.2639,13.5615 66.2749,13.5616 66.2793,13.5702 66.284,13.5699 66.2911,13.6003 66.2927,13.6133 66.29,13.6334 66.29,13.6355 66.289,13.6007 66.2758,13.5895 66.27,13.5776 66.2639,13.5741 66.2593,13.6039 66.2483,13.6264 66.2432,13.6396 66.2444,13.6523 66.2489,13.6702 66.2501,13.6873 66.2551,13.71 66.2557,13.7204 66.2584,13.7442 66.2591,13.7522 66.2609,13.7778 66.2725,13.7963 66.272,13.8137 66.2754,13.8182 66.2762,13.8775 66.2755,13.8913 66.2721,13.9007 66.2715,13.9087 66.2747,13.9097 66.2817,13.9167 66.2909,13.9337 66.2997,13.9461 66.3034,13.9763 66.3055,13.9963 66.3108,14.0223 66.3086,14.0603 66.3185,14.1022 66.331,14.1206 66.3341,14.1229 66.3393,14.1293 66.3424,14.1454 66.3421,14.1625 66.3391,14.1727 66.3344,14.1711 66.329,14.158 66.3373,14.1418 66.3392,14.1388 66.3362,14.1395 66.3355,14.1477 66.3273,14.1544 66.3242,14.1542 66.3216,14.1323 66.317,14.1283 66.3119,14.1143 66.3061,14.0821 66.2964,14.0485 66.2909,14.0256 66.2792,14.014 66.2763,13.9961 66.2753,13.9822 66.2724,13.9689 66.2613,13.9722 66.2518,13.9227 66.2381,13.8996 66.2389,13.8636 66.2339,13.8459 66.2243,13.8015 66.2125,13.7981 66.2105,13.7935 66.2077,13.79 66.2015,13.7909 66.1942,13.7854 66.1936,13.7701 66.1964,13.7772 66.2086,13.7818 66.2116,13.7931 66.2137,13.8061 66.2204,13.8098 66.2278,13.8212 66.2326,13.8241 66.2374,13.8104 66.2389,13.7872 66.2461,13.7776 66.2474,13.7541 66.2444,13.7276 66.2447,13.7074 66.2423,13.704 66.242,13.6883 66.2429,13.6708 66.2375,13.6637 66.2318,13.6559 66.2311,13.6392 66.2377,13.6248 66.2364,13.6005 66.2311,13.5989 66.2291,13.6049 66.2267,13.635 66.2241,13.6396 66.2209,13.6322 66.2145,13.6362 66.2128,13.6476 66.2131,13.6491 66.212,13.6229 66.1991,13.6134 66.1877,13.6202 66.1831,13.6246 66.1831,13.6299 66.1832,13.6455 66.1889,13.6559 66.1902,13.66 66.1946,13.6685 66.1916,13.6748 66.1821,13.6812 66.1786,13.7086 66.1815,13.722 66.1858,13.7386 66.1856,13.7629 66.1893,13.7895 66.1869,13.808 66.1765,13.8341 66.1687,13.8403 66.1642,13.8314 66.1556,13.8277 66.1515,13.8286 66.1426,13.8239 66.1414,13.8189 66.1443,13.8112 66.1563,13.8002 66.1601,13.7989 66.1637,13.78 66.1638,13.7734 66.1664,13.7663 66.1736,13.758 66.1759,13.7143 66.1643,13.696 66.1628,13.6777 66.1629,13.6569 66.1654,13.6443 66.1639,13.6096 66.1543,13.5932 66.1429,13.5784 66.1381,13.5682 66.1301,13.5673 66.1284,13.5574 66.1096,13.5515 66.1086,13.5469 66.1134,13.5416 66.114,13.54 66.1356,13.5524 66.1516,13.5794 66.1652,13.5827 66.1732,13.593 66.1778,13.5974 66.1831,13.5981 66.1937,13.6083 66.2028,13.6062 66.2044,13.5931 66.2011,13.5818 66.2009,13.5695 66.2031,13.5579 66.202,13.5437 66.197,13.5142 66.1934,13.4894 66.1956,13.491 66.1975,13.5127 66.1975,13.5223 66.1994,13.5433 66.2092,13.5562 66.2114,13.5767 66.2116,13.583 66.2148,13.5811 66.2355,13.5762 66.2379,13.5703 66.2383,13.5499 66.2396,13.5307 66.2435,13.5227 66.2433,13.5154 66.2385,13.4937 66.2337,13.4357 66.2296,13.4147 66.2244,13.3941 66.2229,13.3824 66.2192,13.3769 66.22,13.3617 66.227,13.3476 66.2296,13.3246 66.2284,13.2954 66.2202,13.2522 66.208,13.2373 66.2004,13.2351 66.1957,13.2414 66.1912,13.2319 66.1876,13.2146 66.188,13.2019 66.1837,13.1907 66.1846,13.1376 66.1726,13.12 66.1708,13.0994 66.1651,13.083 66.1558,13.0913 66.1519,13.0875 66.15,13.0769 66.1447,13.0663 66.1515,13.0759 66.1579,13.066 66.1598,13.0184 66.1559,13.0045 66.152,12.9796 66.1499,12.9726 66.1474,12.9319 66.1448,12.9162 66.1413,12.8867 66.1392,12.8432 66.1325,12.837 66.1301,12.8303 66.1275,12.8221 66.1207,12.8066 66.1153,12.7838 66.1122,12.7553 66.1037,12.7173 66.0887,12.7021 66.0868,12.6765 66.0712,12.6758 66.0686,12.6807 66.0648,12.6927 66.0633,12.7415 66.0653,12.7475 66.0645,12.7458 66.0642,12.7014 66.0558,12.6747 66.0528,12.6679 66.0512,12.6635 66.0468,12.7897 66.067,12.7984 66.0639,12.7908 66.0616,12.7381 66.054,12.6841 66.0463,12.6599 66.0373,12.6661 66.0359,12.7508 66.0504,12.7961 66.0552,12.8341 66.0556,12.8682 66.0523,12.869 66.0523,12.9031 66.0552,12.9331 66.0615,12.9511 66.0633,12.9615 66.0674,13.0355 66.079,13.048 66.0792,13.045 66.0766,13.0397 66.0726,13.0257 66.0676,12.9708 66.0581,12.9595 66.052,12.9499 66.0503,12.9452 66.0435,12.9507 66.0381,12.9431 66.0283,12.9423 66.0202,12.9469 66.0129,12.9431 66.0034,12.9353 65.9973,12.9016 65.9862,12.9036 65.9819,12.9046 65.9799,12.9085 65.9771,12.9395 65.9719,12.9775 65.9526,12.998 65.9465,13.0205 65.9468,13.0418 65.9491,13.0566 65.9473,13.0648 65.9436,13.0707 65.9371,13.0805 65.9351,13.0982 65.9346,13.1146 65.9407,13.1339 65.945,13.1371 65.9232,13.1525 65.9168,13.1699 65.9126,13.1695 65.9063,13.1581 65.8945,13.1708 65.8759,13.176 65.8725,13.1932 65.8687,13.1925 65.8648,13.1819 65.8657,13.1819 65.8627,13.1906 65.8586,13.1957 65.8528,13.1898 65.8477,13.19 65.8369,13.2095 65.8314,13.2088 65.8272,13.1837 65.8356,13.168 65.8549,13.1435 65.8765,13.128 65.8963,13.0946 65.8921,13.0807 65.8931,13.0665 65.8977,13.0488 65.9084,13.0518 65.9152,13.0522 65.916,13.0336 65.9259,13.0176 65.9295,13.0054 65.9301,12.9924 65.9286,12.9823 65.9312,12.961 65.9295,12.946 65.9303,12.9438 65.9387,12.9382 65.9416,12.9203 65.9439,12.9139 65.9516,12.904 65.9553,12.8955 65.964,12.8893 65.9653,12.8763 65.9637,12.8703 65.9647,12.8674 65.9719,12.8545 65.9716,12.8501 65.9729,12.8462 65.9784,12.8185 65.9725,12.749 65.9464,12.7276 65.9383,12.6939 65.932,12.6648 65.9224,12.641 65.8956,12.6379 65.8751,12.6319 65.8673,12.6372 65.8611,12.6304 65.8542,12.6147 65.8511,12.6088 65.8468,12.6042 65.8434,12.6042 65.8249,12.6099 65.8191,12.616 65.8181,12.6319 65.8277,12.6627 65.8284,12.6734 65.824,12.6766 65.8244,12.6887 65.8437,12.6952 65.8317,12.6946 65.8233,12.7053 65.8175,12.7111 65.81,12.7353 65.81,12.7297 65.8057,12.7177 65.8019,12.7107 65.8024,12.6943 65.8082,12.6895 65.8019,12.7049 65.7958,12.7179 65.7841,12.7145 65.7784,12.7069 65.7778,12.6977 65.7796,12.6862 65.7887,12.6838 65.8064,12.6779 65.8141,12.6509 65.8181,12.6275 65.8103,12.6255 65.8099,12.6144 65.8078,12.6056 65.7903,12.5979 65.7829,12.5844 65.7771,12.576 65.7685,12.5429 65.757,12.5424 65.7525,12.5619 65.7404,12.6034 65.7266,12.604 65.718,12.6089 65.7142,12.6215 65.7137,12.6218 65.7132,12.6231 65.711,12.6193 65.7063,12.6289 65.7019,12.6454 65.7014,12.6556 65.697,12.6728 65.6932,12.6689 65.683,12.6475 65.6719,12.6478 65.6655,12.6557 65.6539,12.6609 65.6522,12.6905 65.6553,12.7016 65.6542,12.7306 65.6474,12.7566 65.6438,12.779 65.6395,12.7815 65.6373,12.7788 65.6357,12.7611 65.6367,12.7048 65.6475,12.6872 65.6496,12.6634 65.6487,12.6495 65.6498,12.6438 65.6543,12.6384 65.6722,12.6182 65.6595,12.6143 65.6637,12.6172 65.6706,12.6247 65.6746,12.6478 65.687,12.6328 65.6964,12.6276 65.6981,12.6085 65.6968,12.6021 65.6987,12.6035 65.7023,12.5832 65.7125,12.5828 65.7206,12.5782 65.7251,12.5302 65.7367,12.5118 65.7447,12.5051 65.7447,12.4905 65.7363,12.4804 65.7278,12.4513 65.7121,12.4296 65.6963,12.3604 65.6331,12.3685 65.6201,12.3679 65.6062,12.3777 65.5849,12.3891 65.5801,12.3994 65.5825,12.405 65.581,12.3825 65.5702,12.3822 65.56,12.3863 65.5552,12.4285 65.5308,12.4338 65.5293,12.443 65.5267,12.4492 65.5266,12.4819 65.5495,12.4942 65.5535,12.5148 65.5649,12.5262 65.5798,12.5393 65.5848,12.5418 65.5827,12.5241 65.5625,12.5094 65.5562,12.4883 65.5435,12.485 65.5416,12.4704 65.5292,12.4661 65.5206,12.4721 65.5166,12.5026 65.5088,12.5154 65.5117,12.543 65.5277,12.5561 65.5327,12.5602 65.5407,12.5574 65.5604,12.5641 65.5687,12.5633 65.5765,12.565 65.5799,12.5687 65.5868,12.5714 65.587,12.5748 65.5826,12.5746 65.5662,12.5699 65.5584,12.5716 65.5514,12.5813 65.5381,12.5801 65.5325,12.5931 65.5265,12.6023 65.5259,12.6139 65.5276,12.6187 65.5266,12.6067 65.5218,12.5917 65.5215,12.5775 65.5252,12.5695 65.5228,12.5694 65.5188,12.5559 65.5135,12.5557 65.5112,12.5762 65.4973,12.5927 65.4781,12.5975 65.4759,12.6082 65.4754,12.6431 65.4845,12.6591 65.4863,12.6655 65.4841,12.6622 65.4811,12.6594 65.4804,12.6411 65.4753,12.6091 65.4704,12.6083 65.4669,12.6145 65.4622,12.6299 65.457,12.642 65.4546,12.651 65.4556,12.6666 65.4613,12.6973 65.4611,12.7317 65.4671,12.7537 65.4662,12.7699 65.4673,12.7686 65.4649,12.7639 65.4633,12.7608 65.4623,12.7449 65.4601,12.7293 65.4602,12.6743 65.4503,12.6555 65.4499,12.6462 65.4482,12.6488 65.4372,12.6431 65.432,12.627 65.4376,12.6158 65.4378,12.5952 65.4436,12.5871 65.443,12.5824 65.4394,12.5851 65.4311,12.582 65.4207,12.5883 65.4147,12.589 65.4084,12.5845 65.4086,12.5629 65.4168,12.5612 65.4213,12.5702 65.4365,12.5694 65.4427,12.5472 65.4539,12.5337 65.4572,12.5246 65.4575,12.5194 65.4567,12.5313 65.4533,12.5314 65.4517,12.5197 65.4516,12.5077 65.4496,12.4969 65.4531,12.4781 65.4485,12.4734 65.4494,12.4712 65.452,12.4734 65.4535,12.4947 65.4573,12.4995 65.4593,12.4933 65.4621,12.4686 65.4613,12.4649 65.4594,12.4599 65.4496,12.4632 65.4454,12.4723 65.441,12.4762 65.4324,12.4947 65.421,12.5057 65.4169,12.5068 65.41,12.5251 65.4043,12.5169 65.4026,12.5027 65.4035,12.4899 65.4063,12.4909 65.4108,12.4714 65.4225,12.4558 65.4264,12.455 65.434,12.4388 65.4482,12.4407 65.4545,12.4529 65.4658,12.453 65.4725,12.4416 65.4842,12.4124 65.5044,12.3844 65.5199,12.3604 65.5293,12.3281 65.5419,12.3308 65.5502,12.325 65.5577,12.3273 65.5754,12.3225 65.5818,12.2968 65.5913,12.285 65.5887,12.2693 65.5818,12.2419 65.5628,12.2351 65.5535,12.2418 65.549,12.2438 65.5444,12.2523 65.5468,12.2561 65.5445,12.2464 65.5327,12.2426 65.5228,12.2506 65.5196,12.2339 65.5087,12.2375 65.5025,12.2121 65.487,12.2183 65.4854,12.2386 65.4889,12.2562 65.4964,12.2636 65.4974,12.2658 65.4933,12.2591 65.4892,12.2434 65.4841,12.2423 65.4788,12.2412 65.4731,12.2479 65.4731,12.2564 65.4781,12.2624 65.4783,12.2586 65.4741,12.261 65.471,12.2793 65.4753,12.2905 65.4805,12.3054 65.4913,12.3063 65.4796,12.3265 65.4902,12.3229 65.4749,12.3287 65.473,12.3409 65.4743,12.346 65.4728,12.3421 65.4686,12.3278 65.4613,12.3125 65.4579,12.3016 65.4532,12.2879 65.4444,12.2771 65.4423,12.2568 65.4416,12.2415 65.4368,12.1976 65.418,12.1904 65.4149,12.173 65.4018,12.1661 65.3914,12.1666 65.3875,12.1815 65.3795,12.1944 65.3807,12.2612 65.3967,12.2648 65.3946,12.2378 65.3735,12.2338 65.3726,12.2355 65.3806,12.2325 65.3824,12.2212 65.3804,12.1943 65.3756,12.1934 65.3723,12.2093 65.359,12.2074 65.3557,12.2 65.3547,12.1954 65.3578,12.1886 65.3703,12.1765 65.3688,12.168 65.3719,12.1629 65.3775,12.1495 65.3752,12.135 65.3577,12.1266 65.3525,12.1205 65.3324,12.1141 65.3284,12.1121 65.3271,12.0937 65.3221,12.0884 65.3187,12.0865 65.3112,12.0892 65.3088,12.0982 65.3071,12.1329 65.3087,12.1413 65.3058,12.1249 65.2905,12.1099 65.2881,12.108 65.2858,12.1106 65.2849,12.1264 65.2855,12.1299 65.2837,12.1193 65.2758,12.1165 65.2691,12.1075 65.2668,12.1047 65.2629,12.1112 65.2578,12.1094 65.2556,12.1004 65.2545,12.0962 65.2502,12.0957 65.2498,12.0885 65.2485,12.0834 65.2394,12.0645 65.2371,12.0588 65.2321,12.0574 65.2234,12.0437 65.2205,12.0392 65.2181,12.0352 65.2211,12.0342 65.2275,12.025 65.2363,12.0252 65.2401,12.0117 65.2432,12.0031 65.2412,11.9854 65.2307,11.9843 65.2267,11.9946 65.2205,12.0001 65.2139,12.0136 65.2119,12.017 65.2077,12.0278 65.2067,12.0336 65.2062,12.0468 65.2103,12.0638 65.2093,12.0718 65.2101,12.0983 65.218,12.1232 65.2232,12.1382 65.2296,12.203 65.2428,12.2214 65.2518,12.2604 65.2758,12.2634 65.2776,12.2717 65.29,12.2642 65.2948,12.2459 65.3005,12.2288 65.3166,12.2336 65.3295,12.2375 65.3293,12.2404 65.3263,12.2395 65.3202,12.243 65.3172,12.2689 65.3132,12.2746 65.3199,12.2913 65.318,12.3078 65.321,12.3206 65.3266,12.3381 65.3285,12.3405 65.3297,12.3839 65.3509,12.4056 65.3577,12.4192 65.3665,12.4303 65.3638,12.4384 65.3644,12.4429 65.3628,12.4429 65.3586,12.4285 65.3433,12.4188 65.3399,12.3996 65.3284,12.3996 65.3242,12.4141 65.3169,12.4203 65.318,12.4236 65.326,12.4243 65.3275,12.4438 65.3326,12.457 65.3314,12.4516 65.3271,12.4367 65.3242,12.4369 65.3138,12.43 65.3103,12.4148 65.3095,12.3912 65.3118,12.3712 65.3106,12.3527 65.3059,12.3377 65.2977,12.3301 65.2904,12.3262 65.2728,12.3052 65.2604,12.2975 65.259,12.2939 65.2555,12.2831 65.2536,12.2812 65.2524,12.2693 65.2452,12.2545 65.2395,12.2505 65.233,12.255 65.2301,12.274 65.2282,12.3086 65.2547,12.3212 65.2576,12.3409 65.2595,12.3621 65.2658,12.3681 65.266,12.3632 65.2617,12.3653 65.2593,12.3747 65.2577,12.3822 65.2584,12.3974 65.2646,12.4141 65.2686,12.4241 65.271,12.4351 65.2683,12.4447 65.2623,12.4429 65.2585,12.4375 65.2567,12.4286 65.257,12.4077 65.2609,12.4046 65.259,12.408 65.2547,12.4241 65.2516,12.4214 65.25,12.4033 65.2497,12.3911 65.247,12.3706 65.2458,12.3558 65.2401,12.3385 65.2366,12.3357 65.2339,12.3372 65.2318,12.3417 65.2257,12.3578 65.2241,12.3722 65.2267,12.3927 65.2279,12.4039 65.2317,12.4201 65.2324,12.4408 65.2192,12.4223 65.2103,12.4288 65.2077,12.4403 65.2092,12.4526 65.2075,12.4688 65.1999,12.4804 65.1972,12.5051 65.2001,12.5075 65.1981,12.4962 65.192,12.4827 65.191,12.4705 65.19,12.4494 65.1863,12.4357 65.1876,12.4242 65.1931,12.41 65.1928,12.3696 65.1807,12.3606 65.1757,12.3539 65.1662,12.3554 65.1584,12.3647 65.1517,12.3801 65.146,12.3948 65.145,12.4297 65.1361,12.4459 65.1368,12.4502 65.137,12.494 65.1317,12.5033 65.1333,12.5169 65.1407,12.5921 65.1732,12.6088 65.1771,12.6263 65.1857,12.6432 65.1903,12.6581 65.1918,12.67 65.1965,12.6798 65.1983,12.7066 65.2073,12.7378 65.2219,12.7665 65.2421,12.7838 65.2472,12.8023 65.2565,12.823 65.2674,12.8308 65.2747,12.8737 65.3022,12.9112 65.3169,12.9177 65.3231,12.9354 65.3319,12.9556 65.3281,12.9575 65.3246,12.9514 65.3158,12.9444 65.3124,12.9269 65.3091,12.9161 65.304,12.9103 65.296,12.9048 65.2938,12.8945 65.2897,12.8805 65.2814,12.8613 65.2752,12.7857 65.2221,12.7917 65.2135,12.7903 65.2116,12.7871 65.2111,12.7755 65.2184,12.7699 65.2174,12.7557 65.2055,12.755 65.2053,12.6934 65.1871,12.6905 65.1861,12.6517 65.1629,12.6391 65.1556,12.6021 65.1433,12.5829 65.1305,12.5756 65.1295,12.5665 65.1319,12.5592 65.1309,12.5492 65.1325,12.5254 65.1274,12.5171 65.1204,12.498 65.1216,12.484 65.1139,12.454 65.1121,12.444 65.1095,12.4282 65.1022,12.4249 65.1018,12.4056 65.0997,12.4019 65.0953,12.4176 65.0931,12.433 65.0875,12.4422 65.0877,12.4486 65.0895,12.4797 65.1067,12.4923 65.0983,12.4814 65.0869,12.4575 65.0753,12.4447 65.0786,12.4317 65.0781,12.4232 65.0803,12.413 65.0879,12.3965 65.091,12.3842 65.0957,12.3769 65.0919,12.3693 65.0916,12.362 65.0839,12.3466 65.084,12.3245 65.0815,12.3158 65.0677,12.2842 65.0671,12.2743 65.0645,12.2574 65.0562,12.2523 65.0565,12.2557 65.063,12.2537 65.064,12.253 65.0644,12.2189 65.0578,12.1842 65.0528,12.1763 65.0478,12.1666 65.0491,12.1648 65.0493,12.1554 65.0468,12.1365 65.0487,12.1235 65.047,12.1185 65.0527,12.1015 65.0607,12.0705 65.0694,12.0844 65.0718,12.1291 65.0535,12.1539 65.0559,12.1587 65.0602,12.1732 65.0569,12.1824 65.0573,12.1961 65.0613,12.2133 65.0634,12.235 65.0654,12.321 65.0931,12.3302 65.0976,12.336 65.1036,12.3367 65.1101,12.3416 65.1144,12.3207 65.1201,12.2614 65.1171,12.243 65.1123,12.2433 65.1144,12.2436 65.1177,12.2557 65.1218,12.2633 65.1274,12.2669 65.1337,12.2768 65.1348,12.279 65.1405,12.2903 65.1439,12.2967 65.1485,12.3024 65.1658,12.2919 65.1713,12.2793 65.1711,12.2749 65.1724,12.2743 65.1796,12.2664 65.1841,12.2655 65.1917,12.2518 65.2039,12.2391 65.2095,12.2331 65.2146,12.2289 65.2158,12.2232 65.2174,12.2071 65.2162,12.1781 65.2089,12.1485 65.1949,12.1219 65.1926,12.1149 65.1895,12.1091 65.1794,12.1105 65.1679,12.1162 65.1593,12.1107 65.135,12.1201 65.1255,12.1196 65.1238,12.1186 65.1199,12.1053 65.1173,12.097 65.1188,12.0934 65.1236,12.0943 65.1334,12.0875 65.1366,12.0823 65.1346,12.0687 65.1209,12.0612 65.1069,12.068 65.0944,12.0625 65.0836,12.051 65.0796,12.044 65.0818,12.0417 65.0861,12.0449 65.0918,12.0321 65.0949,12.0243 65.0992,12.0145 65.1008,12.0137 65.1009,12.0185 65.1066,12.0217 65.1214,12.0334 65.1466,12.0406 65.1518,12.031 65.1564,12.0281 65.1634,12.0196 65.1681,12.0066 65.1701,11.9985 65.1684,11.9796 65.1582,11.9189 65.1409,11.9123 65.1359,11.9038 65.1142,11.8749 65.1056,11.8673 65.1067,11.8768 65.1194,11.8744 65.1227,11.8588 65.1165,11.8521 65.1102,11.8421 65.1064,11.8133 65.086,11.8126 65.0811,11.7939 65.0715,11.7688 65.0586,11.7636 65.0515,11.7469 65.0414,11.7393 65.0258,11.7411 65.0176,11.7475 65.0116,11.758 65.0112,11.7787 65.0181,11.8029 65.0296,11.8333 65.0356,11.857 65.0441,11.861 65.0455,11.8754 65.0463,11.8621 65.0363,11.8423 65.0298,11.829 65.0223,11.8094 65.0206,11.7926 65.0124,11.7865 65.0059,11.7566 65.0041,11.7453 65.001,11.7315 65.0013,11.7237 65.0056,11.7207 65.0165,11.6999 65.0191,11.6913 65.0122,11.6884 65.0112,11.6842 65.0096,11.678 65.0022,11.6717 65,11.6681 65.0035,11.6754 65.0097,11.6624 65.0105,11.6614 65.013,11.6754 65.0187,11.6802 65.0228,11.671 65.0251,11.6548 65.0206,11.6403 65.0188,11.6209 65.0127,11.6172 65.0085,11.6318 65.0064,11.6339 65.0042,11.6213 65,11.6123 64.997,11.6068 64.9866,11.5954 64.9825,11.594 64.9794,11.6086 64.9807,11.6109 64.9809,11.6246 64.9782,11.6439 64.9818,11.6894 64.9829,11.7145 64.9741,11.7215 64.9756,11.7235 64.9827,11.7274 64.985,11.7361 64.9864,11.7647 64.9837,11.7867 64.9832,11.766 64.9791,11.7568 64.9738,11.7368 64.9705,11.7305 64.9672,11.7216 64.9559,11.718 64.9567,11.7116 64.9588,11.6984 64.9564,11.6825 64.9566,11.6699 64.9541,11.6672 64.9552,11.6752 64.9621,11.6586 64.9653,11.6543 64.9703,11.6482 64.9717,11.6301 64.9691,11.6176 64.9691,11.6115 64.9666,11.6455 64.9432,11.648 64.936,11.6283 64.9386,11.6257 64.941,11.6278 64.9488,11.6024 64.9624,11.5935 64.9613,11.5798 64.9512,11.5709 64.9477,11.5685 64.9494,11.5724 64.9543,11.5694 64.9576,11.5624 64.9587,11.5074 64.9503,11.4966 64.9448,11.4779 64.9401,11.4762 64.9365,11.4896 64.9288,11.4965 64.9249,11.5117 64.9212,11.5281 64.9085,11.5418 64.9044,11.551 64.9047,11.5613 64.9099,11.5697 64.9198,11.6105 64.9317,11.6175 64.9292,11.6009 64.9208,11.599 64.9151,11.5865 64.9111,11.5896 64.9062,11.5875 64.9035,11.5848 64.9036,11.5813 64.9091,11.5842 64.91,11.5745 64.9109,11.5636 64.8982,11.57 64.892,11.5643 64.8902,11.5538 64.8931,11.5437 64.8911,11.5196 64.909,11.5021 64.913,11.4865 64.9264,11.4684 64.9317,11.4634 64.9369,11.4402 64.9324,11.4295 64.9269,11.4057 64.9225,11.4036 64.9221,11.3871 64.9125,11.3554 64.9024,11.3497 64.8954,11.2951 64.8754,11.2828 64.8661,11.2815 64.859,11.2842 64.8564,11.2909 64.8549,11.3188 64.8596,11.367 64.8647,11.4069 64.869,11.5577 64.8788,11.5837 64.8868,11.6254 64.8927,11.647 64.8984,11.6725 64.9051,11.6807 64.9053,11.6838 64.903,11.6664 64.8924,11.651 64.8903,11.632 64.8849,11.606 64.8818,11.5675 64.8709,11.5571 64.8699,11.5473 64.871,11.506 64.8669,11.471 64.8658,11.4611 64.8664,11.452 64.8669,11.4296 64.8645,11.4066 64.8648,11.3829 64.8627,11.3689 64.8598,11.3397 64.858,11.2987 64.852,11.2733 64.8465,11.2702 64.8423,11.2793 64.8365,11.2629 64.8341,11.2567 64.8308,11.2563 64.8268,11.2686 64.8197,11.2656 64.8167,11.259 64.8163,11.2443 64.8155,11.2413 64.8124,11.2459 64.8082,11.2691 64.8086,11.2807 64.8058,11.2863 64.8067,11.3033 64.8189,11.317 64.8212,11.32 64.8181,11.3088 64.8163,11.3055 64.8138,11.3261 64.8091,11.3571 64.8053,11.3725 64.8049,11.3905 64.8074,11.4063 64.8061,11.4387 64.813,11.4395 64.8125,11.4417 64.8112,11.4004 64.7996,11.3833 64.7925,11.3751 64.7812,11.3618 64.7794,11.3595 64.7746,11.3327 64.7611,11.2946 64.7563,11.2876 64.7525,11.2809 64.7529,11.2821 64.7551,11.279 64.756,11.2673 64.7541,11.2563 64.7556,11.2266 64.7511,11.2176 64.7497,11.1895 64.7419,11.1868 64.7394,11.2039 64.7326,11.2106 64.7334,11.2168 64.7367,11.2281 64.7357,11.2392 64.7375,11.2411 64.7358,11.2174 64.7302,11.2147 64.7277,11.2486 64.7322,11.2607 64.7318,11.302 64.7429,11.3469 64.7472,11.382 64.7539,11.4111 64.767,11.4193 64.7746,11.4548 64.7881,11.4589 64.7912,11.4533 64.7928,11.447 64.7923,11.4458 64.7938,11.4603 64.7968,11.4703 64.8027,11.4709 64.8065,11.5035 64.809,11.5182 64.8154,11.5304 64.8161,11.5405 64.813,11.5411 64.8128,11.5541 64.8154,11.5697 64.8222,11.6073 64.826,11.618 64.8291,11.6322 64.8367,11.6567 64.8613,11.6515 64.8632,11.6348 64.8615,11.6211 64.8641,11.62 64.8668,11.6336 64.8669,11.6763 64.8767,11.6885 64.8782,11.7198 64.8823,11.7491 64.893,11.7722 64.8989,11.8015 64.9046,11.8347 64.914,11.8668 64.9197,11.8995 64.929,11.9378 64.9432,11.9501 64.9478,11.9638 64.9491,11.9726 64.9462,11.9971 64.9492,12.0123 64.948,12.032 64.9573,12.0326 64.9624,12.0418 64.964,12.0535 64.9702,12.0613 64.9698,12.0669 64.967,12.1147 64.9716,12.1393 64.9702,12.153 64.966,12.124 64.9674,12.1038 64.9662,12.0964 64.9615,12.0701 64.9591,12.0658 64.9563,12.0564 64.951,12.0422 64.9483,12.0284 64.9366,12.0212 64.9343,11.9987 64.9372,11.9629 64.9353,11.9414 64.9319,11.8663 64.9101,11.8197 64.9014,11.7621 64.8905,11.7413 64.8829,11.6963 64.8733,11.6927 64.8702,11.7118 64.8689,11.7141 64.8672,11.7101 64.8651,11.6767 64.8628,11.6653 64.8575,11.653 64.839,11.6676 64.8366,11.6719 64.837,11.7 64.8397,11.7386 64.8399,11.7529 64.8421,11.7923 64.8601,11.8027 64.8625,11.8068 64.8605,11.7845 64.8475,11.7549 64.8388,11.7439 64.8338,11.6981 64.831,11.6946 64.8307,11.6769 64.8262,11.6459 64.8222,11.629 64.8184,11.6408 64.8151,11.6498 64.8155,11.6744 64.8204,11.6886 64.8138,11.6878 64.8119,11.6768 64.8095,11.6781 64.8077,11.742 64.8084,11.7458 64.807,11.735 64.8016,11.7301 64.7952,11.7328 64.794,11.7393 64.794,11.7505 64.7972,11.7514 64.7969,11.7598 64.7944,11.7736 64.7952,11.7896 64.7999,11.8014 64.8001,11.817 64.798,11.8396 64.7985,11.8477 64.7959,11.827 64.7883,11.8157 64.7866,11.8095 64.7833,11.7961 64.7816,11.7868 64.7777,11.7312 64.7744,11.7286 64.7807,11.7261 64.784,11.7069 64.7883,11.693 64.7813,11.7037 64.7779,11.6964 64.7757,11.6592 64.7724,11.6513 64.7783,11.6376 64.7787,11.6358 64.7727,11.6185 64.7698,11.6036 64.7742,11.5849 64.7709,11.5685 64.7699,11.5652 64.7636,11.5752 64.7593,11.6102 64.7629,11.6205 64.7639,11.627 64.7614,11.6268 64.7568,11.6145 64.7523,11.6041 64.7448,11.6257 64.74,11.6393 64.7399,11.6209 64.7345,11.5861 64.7451,11.5705 64.746,11.5476 64.7565,11.5307 64.7529,11.529 64.7504,11.5341 64.7462,11.5311 64.7429,11.5176 64.7391,11.5094 64.7341,11.5051 64.7314,11.4731 64.725,11.4281 64.7111,11.4217 64.7108,11.4048 64.7136,11.4026 64.7061,11.4262 64.7002,11.4288 64.6967,11.4246 64.6888,11.4043 64.6844,11.3934 64.6833,11.395 64.6883,11.3902 64.6895,11.3865 64.6881,11.3809 64.677,11.3802 64.6708,11.3794 64.6641,11.3842 64.658,11.4076 64.6501,11.3927 64.6457,11.3997 64.6321,11.4133 64.6266,11.4209 64.6191,11.4278 64.6194,11.4306 64.6178,11.4312 64.6127,11.4398 64.605,11.4534 64.5998,11.4356 64.5985,11.4349 64.6026,11.4063 64.6242,11.3885 64.6317,11.3849 64.63,11.3825 64.618,11.3721 64.6232,11.3711 64.6433,11.3613 64.6446,11.356 64.643,11.3588 64.6214,11.3657 64.6155,11.3656 64.6142,11.3654 64.6085,11.3746 64.6011,11.3715 64.5958,11.362 64.5901,11.3562 64.5936,11.3527 64.5929,11.3415 64.5788,11.3403 64.5678,11.3446 64.5653,11.358 64.5666,11.3546 64.5622,11.3713 64.5558,11.3652 64.5512,11.3577 64.5511,11.3421 64.5561,11.3371 64.555,11.3361 64.5524,11.3377 64.5448,11.3154 64.5428,11.3077 64.5408,11.2996 64.5409,11.2733 64.5467,11.2694 64.5508,11.2791 64.5683,11.2805 64.5837,11.2731 64.5922,11.2428 64.6134,11.2432 64.6188,11.2233 64.6249,11.2225 64.6247,11.2162 64.6236,11.2173 64.6211,11.2312 64.6164,11.2221 64.6139,11.1601 64.6196,11.1508 64.6286,11.1295 64.6401,11.1125 64.6529,11.1014 64.656,11.0746 64.6554,11.0652 64.651,11.0626 64.6408,11.0582 64.6397,11.0451 64.6401,11.039 64.6403,11.0346 64.6369,11.0309 64.6294,11.0216 64.6221,11.028 64.609,11.027 64.6014,11.0525 64.5975,11.0798 64.5909,11.0981 64.5886,11.1939 64.5942,11.2094 64.5913,11.2174 64.5898,11.2289 64.5796,11.226 64.5763,11.2067 64.5711,11.1937 64.5884,11.1855 64.5901,11.1748 64.5822,11.1638 64.5779,11.1483 64.5787,11.1406 64.5716,11.13 64.5687,11.1282 64.5641,11.1355 64.5561,11.1364 64.5467,11.1543 64.5317,11.1694 64.5191,11.1948 64.5079,11.2011 64.5094,11.2069 64.5136,11.2284 64.5185,11.2494 64.5186,11.2876 64.5161,11.2901 64.5142,11.2828 64.511,11.2817 64.5049,11.3 64.4873,11.3095 64.4853,11.344 64.4855,11.3475 64.4855,11.3666 64.4864,11.3869 64.4903,11.3936 64.4896,11.3953 64.487,11.3893 64.4796,11.395 64.4763,11.4043 64.4759,11.4123 64.4786,11.4209 64.4888,11.4231 64.5038,11.4429 64.5206,11.4469 64.5251,11.446 64.5285,11.4321 64.5372,11.3995 64.5441,11.398 64.5447,11.3848 64.5495,11.3823 64.5528,11.3989 64.5517,11.4163 64.5464,11.4351 64.5465,11.4368 64.5489,11.4274 64.5519,11.4285 64.5531,11.4393 64.5519,11.4514 64.5538,11.4603 64.5519,11.4696 64.554,11.493 64.5637,11.488 64.5666,11.4786 64.5659,11.4694 64.5712,11.4692 64.5779,11.477 64.5887,11.5114 64.5738,11.5213 64.5745,11.5287 64.5712,11.5377 64.5714,11.5904 64.5873,11.6092 64.5899,11.6147 64.5885,11.6052 64.5815,11.6031 64.5748,11.6053 64.5722,11.6157 64.5758,11.6274 64.5839,11.6401 64.5869,11.6505 64.5866,11.6785 64.5945,11.6966 64.5977,11.7112 64.5949,11.7368 64.5932,11.7605 64.5945,11.7849 64.594,11.7847 64.5908,11.7791 64.5899,11.7618 64.5892,11.717 64.5875,11.6168 64.5719,11.6053 64.5685,11.5752 64.5502,11.5643 64.5468,11.5464 64.5368,11.5421 64.5367,11.5357 64.5481,11.5358 64.5504,11.5449 64.5481,11.5546 64.5493,11.5739 64.5559,11.5739 64.5584,11.5688 64.5617,11.5564 64.5603,11.547 64.5621,11.5366 64.5599,11.5175 64.5619,11.52 64.5522,11.5064 64.5511,11.4978 64.5486,11.4866 64.5482,11.486 64.5458,11.4901 64.5438,11.5003 64.5402,11.4924 64.5345,11.4964 64.5327,11.5163 64.538,11.5215 64.537,11.5223 64.5315,11.531 64.5273,11.5273 64.5247,11.5117 64.5207,11.4972 64.5193,11.4793 64.5209,11.4566 64.5175,11.4431 64.5112,11.435 64.5024,11.4362 64.4983,11.4515 64.4914,11.4462 64.4901,11.4366 64.4912,11.4265 64.4791,11.4251 64.4775,11.4357 64.473,11.4377 64.4683,11.4323 64.4607,11.4414 64.457,11.451 64.457,11.4637 64.4613,11.4791 64.4745,11.4915 64.4667,11.5021 64.4696,11.5125 64.4679,11.5249 64.4702,11.5395 64.4674,11.5549 64.473,11.5567 64.4753,11.5763 64.4759,11.5951 64.4822,11.611 64.4841,11.62 64.4836,11.6335 64.4828,11.6403 64.4808,11.6532 64.4716,11.666 64.4693,11.6871 64.4703,11.6893 64.4688,11.6821 64.4655,11.6564 64.4679,11.6499 64.4693,11.6302 64.4793,11.6146 64.4793,11.6019 64.4776,11.5878 64.4703,11.5626 64.4688,11.5322 64.4581,11.52 64.4564,11.5198 64.4518,11.4994 64.4481,11.4934 64.4495,11.4864 64.4457,11.4771 64.4449,11.4724 64.4409,11.4586 64.4405,11.4565 64.4397,11.4498 64.437,11.436 64.4369,11.4311 64.4432,11.4241 64.4433,11.4187 64.4371,11.4122 64.4373,11.4043 64.4418,11.4055 64.4467,11.4011 64.4494,11.3853 64.4435,11.3753 64.4369,11.3738 64.4315,11.3602 64.4244,11.3481 64.4213,11.3589 64.4175,11.3772 64.4072,11.3793 64.3997,11.3893 64.3889,11.3779 64.3931,11.3701 64.3936,11.3716 64.3991,11.3677 64.4006,11.3289 64.3948,11.3282 64.3864,11.3173 64.3755,11.2964 64.3694,11.2766 64.3607,11.2639 64.359,11.2534 64.3498,11.2522 64.3413,11.238 64.3272,11.2294 64.3216,11.2246 64.3185,11.218 64.3177,11.2127 64.3212,11.2152 64.3267,11.248 64.3551,11.2534 64.3597,11.2476 64.3632,11.2593 64.366,11.277 64.3746,11.2996 64.3894,11.3268 64.421,11.332 64.4377,11.3394 64.448,11.3391 64.4626,11.3342 64.4652,11.3316 64.4641,11.316 64.4575,11.3009 64.4563,11.2987 64.4527,11.3012 64.4508,11.3198 64.4448,11.3155 64.4412,11.293 64.4448,11.2894 64.4468,11.2887 64.4572,11.3006 64.4647,11.2948 64.467,11.2668 64.4645,11.2633 64.4626,11.261 64.4529,11.2445 64.4565,11.2347 64.4566,11.1977 64.4509,11.1945 64.4504,11.1881 64.4478,11.1835 64.4421,11.1746 64.4441,11.1555 64.4449,11.1773 64.4553,11.1836 64.463,11.1887 64.4724,11.176 64.4781,11.1855 64.4859,11.1656 64.4982,11.1471 64.5011,11.1341 64.5063,11.1147 64.5184,11.1155 64.5255,11.0965 64.5295,11.0923 64.5194,11.0859 64.518,11.0691 64.5194,11.0768 64.5351,11.0665 64.545,11.064 64.5543,11.0727 64.5652,11.0854 64.5695,11.0854 64.572,11.0556 64.5733,11.0488 64.5765,11.0471 64.5803,11.0262 64.5886,11.0146 64.5896,11.0015 64.5908,11.0021 64.5955,10.9919 64.6037,10.9834 64.6058,10.9748 64.6107,10.9575 64.6118,10.9472 64.6033,10.9458 64.5992,10.9338 64.5911,10.9236 64.5909,10.9077 64.5792,10.9151 64.5761,10.9257 64.5753,10.9317 64.5728,10.953 64.5515,10.9676 64.5429,10.9698 64.5415,10.9682 64.5379,10.9472 64.5257,10.9474 64.5216,10.9603 64.5131,10.9614 64.5083,10.9592 64.506,10.9433 64.5115,10.9067 64.5199,10.9003 64.5172,10.9193 64.5097,10.9056 64.5054,10.8927 64.5101,10.8904 64.5092,10.8994 64.4836,10.9027 64.4742,10.8909 64.4693,10.8872 64.4741,10.8895 64.4822,10.8746 64.4986,10.8753 64.5019,10.8661 64.5044,10.8513 64.5039,10.8444 64.5085,10.8278 64.5129,10.7985 64.5158,10.7886 64.515,10.7874 64.5081,10.7845 64.5074,10.774 64.5114,10.7715 64.511,10.7724 64.5006,10.7685 64.4975,10.7625 64.4963,10.7543 64.4991,10.7518 64.4938,10.7678 64.4858,10.7669 64.4795,10.76 64.4803,10.757 64.4787,10.7581 64.4678,10.7507 64.4605,10.7338 64.4609,10.731 64.4646,10.7325 64.4685,10.7264 64.4726,10.7046 64.4826,10.697 64.4815,10.6909 64.4771,10.6898 64.4689,10.6856 64.4639,10.66 64.4598,10.653 64.4534,10.6498 64.4504,10.6561 64.4458,10.6829 64.4413,10.694 64.4299,10.7001 64.4283,10.7177 64.4298,10.7235 64.4324,10.7399 64.4342,10.7407 64.4397,10.7373 64.4436,10.7382 64.4453,10.7427 64.4459,10.7503 64.4363,10.7778 64.4372,10.7997 64.4411,10.8013 64.4389,10.7966 64.4325,10.8083 64.422,10.8065 64.4189,10.8049 64.4187,10.7984 64.4177,10.7974 64.4116,10.7791 64.4092,10.784 64.4019,10.7958 64.3971,10.8155 64.3938,10.8183 64.3913,10.8174 64.3861,10.8334 64.3754,10.8317 64.372,10.82 64.3719,10.8183 64.3709,10.8093 64.3729,10.8166 64.377,10.8082 64.3802,10.799 64.3876,10.7936 64.3876,10.7727 64.3817,10.7625 64.3815,10.751 64.3917,10.755 64.3972,10.7474 64.4021,10.7478 64.4047,10.7547 64.4097,10.7476 64.4147,10.7403 64.4166,10.7261 64.4159,10.6978 64.4191,10.6839 64.4165,10.6775 64.4177,10.6745 64.4183,10.642 64.4474,10.6268 64.4524,10.617 64.4597,10.6113 64.4615,10.6006 64.4602,10.5825 64.441,10.5643 64.4443,10.5567 64.4444,10.5476 64.442,10.5793 64.4279,10.598 64.4281,10.601 64.4263,10.6012 64.4223,10.6061 64.4211,10.6188 64.4215,10.623 64.4193,10.6213 64.4171,10.6088 64.4128,10.6098 64.409,10.6212 64.4068,10.6308 64.3986,10.6301 64.3955,10.6194 64.393,10.6138 64.3983,10.6076 64.4001,10.6 64.4036,10.5753 64.4213,10.5551 64.4268,10.5437 64.434,10.5357 64.4363,10.5196 64.4431,10.5118 64.4354,10.4945 64.4309,10.4849 64.4227,10.4605 64.4162,10.4565 64.413,10.4636 64.4036,10.4822 64.3994,10.4789 64.397,10.4813 64.3942,10.4887 64.3946,10.4989 64.4004,10.5288 64.4055,10.546 64.4067,10.5683 64.4014,10.5695 64.3987,10.562 64.3927,10.5659 64.3914,10.5916 64.3939,10.5927 64.3902,10.5997 64.3903,10.6086 64.3883,10.6118 64.3849,10.6141 64.3812,10.6227 64.3774,10.6217 64.375,10.608 64.3732,10.6063 64.3698,10.611 64.3678,10.6217 64.3678,10.6301 64.366,10.6516 64.3682,10.6714 64.3636,10.6731 64.361,10.6517 64.3597,10.6357 64.356,10.6212 64.3478,10.6111 64.3474,10.6119 64.3516,10.5932 64.3586,10.5789 64.3677,10.5718 64.3701,10.5392 64.3722,10.5129 64.3792,10.5084 64.3775,10.5098 64.3697,10.5063 64.3608,10.5493 64.3442,10.5748 64.3329,10.5705 64.3307,10.5648 64.3314,10.5547 64.3356,10.5348 64.3398,10.5275 64.347,10.5113 64.3492,10.5036 64.355,10.4899 64.3603,10.4818 64.3617,10.4729 64.3612,10.4657 64.3582,10.4671 64.3551,10.4888 64.35,10.5006 64.3428,10.4973 64.3419,10.4786 64.3475,10.4626 64.3498,10.4452 64.356,10.4422 64.3555,10.4443 64.3487,10.4442 64.3454,10.4675 64.3368,10.4643 64.3344,10.445 64.3332,10.4444 64.3299,10.4543 64.3235,10.446 64.3089,10.4484 64.3049,10.4627 64.3075,10.4725 64.3049,10.4969 64.3077,10.4987 64.3062,10.4905 64.3018,10.4946 64.2973,10.4934 64.2973,10.4884 64.2934,10.4728 64.2945,10.4642 64.2972,10.4561 64.3009,10.4467 64.3003,10.4458 64.2977,10.4543 64.2896,10.4544 64.2847,10.4505 64.283,10.4402 64.2845,10.4354 64.2889,10.4354 64.2935,10.4338 64.3006,10.4274 64.3017,10.4095 64.2997,10.3998 64.2942,10.4021 64.2867,10.4007 64.2817,10.3944 64.2802,10.3973 64.2774,10.4079 64.2769,10.4044 64.2724,10.4089 64.2686,10.4134 64.2678,10.421 64.2601,10.4094 64.2615,10.3723 64.2876,10.3617 64.2862,10.3509 64.2771,10.3386 64.2749,10.3339 64.2698,10.336 64.2689,10.3431 64.2697,10.3531 64.2631,10.3553 64.2608,10.3427 64.2578,10.3279 64.2505,10.3058 64.2509,10.2979 64.2495,10.279 64.2374,10.2809 64.233,10.3823 64.208,10.3882 64.2045,10.3882 64.1999,10.3661 64.1796,10.3591 64.1794,10.3563 64.1834,10.3656 64.1921,10.3681 64.1984,10.3653 64.2021,10.3537 64.2064,10.322 64.209,10.3032 64.2139,10.2989 64.2128,10.2982 64.2097,10.3045 64.2027,10.3013 64.2007,10.2923 64.1993,10.2971 64.1919,10.2902 64.1919,10.2844 64.1986,10.2865 64.203,10.2841 64.2081,10.2754 64.2092,10.2656 64.2065,10.2516 64.2071,10.2472 64.1989,10.2521 64.1952,10.2601 64.194,10.2639 64.1904,10.2592 64.1879,10.2501 64.188,10.2279 64.2035,10.2173 64.2068,10.2115 64.2077,10.2015 64.2057,10.1944 64.1973,10.1961 64.1848,10.2071 64.1846,10.2139 64.18,10.2204 64.1785,10.2066 64.1647,10.2175 64.1596,10.2257 64.1535,10.2252 64.1512,10.2059 64.1525,10.1902 64.1588,10.1823 64.1597,10.1721 64.1542,10.1768 64.152,10.1953 64.1511,10.2084 64.146,10.2036 64.1425,10.1925 64.1434,10.1682 64.1487,10.1564 64.1488,10.1486 64.1474,10.1302 64.1367,10.1176 64.126,10.1341 64.1159,10.1559 64.1125,10.1661 64.1078,10.2014 64.1063,10.2068 64.1084,10.2206 64.1096,10.2309 64.1138,10.2519 64.1189,10.2541 64.106,10.237 64.1041,10.2094 64.0981,10.1806 64.0902,10.1725 64.086,10.1729 64.0807,10.1625 64.0858,10.1547 64.0854,10.148 64.0815,10.1426 64.0726,10.1315 64.0703,10.1296 64.0719,10.1402 64.0824,10.1395 64.0861,10.0908 64.106,10.0735 64.11,10.0529 64.104,10.0371 64.1037,10.0269 64.0937,10.033 64.0898,10.0294 64.0872,10.0261 64.0873,10.0227 64.0801,10.0258 64.078,10.0473 64.0639,10.057 64.0603,10.0724 64.058,10.0789 64.0544,10.0776 64.0515,10.0557 64.0416,10.0316 64.0408,10.0346 64.039,10.0459 64.0377,10.0406 64.0309,10.0569 64.0252,10.0625 64.0191,10.0612 64.016,10.0324 64.0308,10.0234 64.0301,10.0028 64.021,10.0049 64.0198,10.0225 64.0197,10.0354 64.0114,10.0309 64.0086,10.0256 64.0104,10.0172 64.0139,10.0088 64.0143,10.0059 64.0117,10.0249 64.0032,10.0084 64,10 64,10 63.9984,10.0059 63.9946,10.002 63.9888,10.0036 63.9879,10.0094 63.9846,10.0043 63.9829,10 63.9827,9.98362 63.9819,9.97953 63.9805,9.98541 63.9759,9.97563 63.974,9.97014 63.9688,9.96043 63.9655,9.95439 63.9611,9.95978 63.9557,9.95577 63.9525,9.95996 63.9514,9.97017 63.9551,9.98569 63.9554,10 63.96,10.0138 63.9645,10.0262 63.9655,10.0288 63.9669,10.0276 63.9699,10.015 63.9734,10.0202 63.9748,10.0448 63.9688,10.048 63.9664,10.0597 63.9697,10.0987 63.9811,10.1265 63.9865,10.1297 63.9842,10.0865 63.9748,10.083 63.9725,10.0918 63.9719,10.1036 63.9752,10.1078 63.9745,10.1089 63.9729,10.1043 63.9708,10.1079 63.9697,10.1224 63.9723,10.1235 63.9698,10.1102 63.9636,10.1063 63.9572,10.0961 63.9541,10.0604 63.9498,10.0446 63.9444,10.0307 63.9432,10.0154 63.9365,10.0051 63.9357,10 63.9335,9.98525 63.9269,9.9796 63.926,9.96766 63.9268,9.96262 63.9235,9.97257 63.9204,9.95276 63.9114,9.97003 63.9063,9.97675 63.9063,9.99308 63.9119,9.99507 63.914,9.98818 63.918,9.99016 63.9206,10 63.9217,10.0128 63.9232,10.0356 63.9306,10.0409 63.9323,10.0487 63.9319,10.0614 63.9245,10.0757 63.9296,10.0963 63.9331,10.1003 63.9355,10.0982 63.9382,10.0877 63.9408,10.0989 63.9459,10.1045 63.9508,10.1092 63.9497,10.1119 63.9453,10.1294 63.9477,10.1669 63.9584,10.1818 63.9604,10.1936 63.9636,10.1978 63.9632,10.1887 63.9572,10.1897 63.9561,10.2093 63.961,10.2104 63.9611,10.2216 63.9622,10.2235 63.9513,10.2199 63.951,10.2161 63.9574,10.2048 63.9534,10.2019 63.9482,10.2114 63.9416,10.2254 63.9415,10.2296 63.9394,10.2241 63.9328,10.2155 63.9277,10.2097 63.9318,10.1966 63.9351,10.1865 63.9444,10.1772 63.9435,10.1704 63.9462,10.1653 63.9438,10.1607 63.9263,10.1546 63.9235,10.1512 63.9314,10.1547 63.936,10.152 63.9394,10.1227 63.9329,10.1074 63.9257,10.0672 63.9211,10.0333 63.9147,10.0064 63.9027,10 63.9015,9.99609 63.9008,9.9865 63.895,9.95035 63.8812,9.94119 63.8778,9.93528 63.8834,9.9254 63.8849,9.92431 63.8865,9.95995 63.8996,9.95363 63.9025,9.94041 63.8972,9.93627 63.8971,9.93083 63.9039,9.91809 63.8993,9.8979 63.9,9.85604 63.8878,9.83728 63.8797,9.84014 63.8733,9.84868 63.867,9.85388 63.8665,9.86061 63.8657,9.86646 63.8619,9.87525 63.8615,9.88534 63.8671,9.88947 63.8671,9.89114 63.8644,9.88711 63.8618,9.88463 63.8595,9.85443 63.8536,9.84842 63.8494,9.84427 63.8499,9.84293 63.8569,9.83673 63.8571,9.82964 63.8538,9.82492 63.844,9.81182 63.837,9.79838 63.8376,9.79657 63.8369,9.77405 63.8283,9.76057 63.8298,9.73076 63.8277,9.72468 63.8253,9.70662 63.8256,9.70111 63.8222,9.69595 63.8223,9.69325 63.8248,9.69915 63.8306,9.72024 63.8319,9.72778 63.8361,9.74001 63.8392,9.755 63.8386,9.77491 63.8431,9.79916 63.8431,9.81232 63.8487,9.81861 63.8576,9.82397 63.8652,9.82169 63.8702,9.81239 63.8704,9.79914 63.8664,9.77965 63.8635,9.76603 63.8565,9.76183 63.8581,9.76635 63.8608,9.76532 63.8718,9.7547 63.8669,9.73327 63.8617,9.71911 63.8554,9.70471 63.8543,9.67713 63.8484,9.67428 63.8433,9.66276 63.8364,9.65035 63.8344,9.63973 63.8327,9.63134 63.8254,9.62217 63.8232,9.61824 63.8193,9.62038 63.818,9.62605 63.818,9.64018 63.8239,9.6631 63.8296,9.66683 63.8273,9.67659 63.8281,9.68028 63.8263,9.67885 63.824,9.66002 63.819,9.6542 63.8117,9.63922 63.8124,9.6143 63.8058,9.60717 63.7943,9.59328 63.794,9.57531 63.7851,9.56266 63.7788,9.56191 63.7736,9.5692 63.7721,9.572 63.7677,9.60564 63.7642,9.61144 63.7615,9.68121 63.7656,9.71618 63.7662,9.75141 63.7722,9.76999 63.771,9.79571 63.7714,9.79833 63.7703,9.80359 63.7679,9.79337 63.7662,9.76401 63.7668,9.74512 63.7637,9.72815 63.7633,9.72371 63.7594,9.70464 63.7601,9.69492 63.7589,9.66835 63.7447,9.65593 63.7419,9.61804 63.7331,9.59754 63.732,9.58333 63.7284,9.55616 63.7272,9.55385 63.7222,9.54461 63.7221,9.5427 63.7193,9.53243 63.7192,9.5315 63.7174,9.54565 63.7123,9.56178 63.7181,9.57598 63.7119,9.58242 63.7067,9.5808 63.6982,9.58548 63.6873,9.58258 63.6839,9.57546 63.6827,9.57466 63.6822,9.55458 63.6701,9.54848 63.6692,9.54706 63.6669,9.55186 63.6635,9.56486 63.66,9.5723 63.655,9.57722 63.659,9.57447 63.6626,9.58964 63.6764,9.59867 63.6804,9.61193 63.6821,9.64833 63.6827,9.66693 63.6802,9.66893 63.6813,9.66512 63.6856,9.67044 63.6923,9.66501 63.6982,9.67566 63.701,9.67714 63.704,9.67845 63.7067,9.69684 63.709,9.70471 63.7054,9.71964 63.7046,9.73418 63.7013,9.74134 63.7018,9.74771 63.7083,9.78971 63.7109,9.82123 63.7183,9.8231 63.7224,9.84196 63.726,9.84917 63.7256,9.85808 63.7215,9.86408 63.7255,9.87578 63.7281,9.88278 63.7329,9.88305 63.7386,9.89346 63.7428,9.89518 63.7435,9.91309 63.7457,9.93484 63.7545,9.95522 63.7595,9.99475 63.7616,10 63.7627,10.03 63.7689,10.0585 63.7771,10.0953 63.7837,10.104 63.7874,10.1158 63.7878,10.122 63.7867,10.1226 63.7848,10.1123 63.7834,10.1079 63.7786,10.1064 63.777,10.0848 63.7766,10.0792 63.7736,10.082 63.7684,10.0538 63.7636,10.0483 63.7606,10.042 63.7512,10.0318 63.7473,10.0225 63.7363,10.0251 63.734,10.043 63.7366,10.1122 63.7574,10.1395 63.7578,10.1201 63.7524,10.1141 63.7485,10.0996 63.7486,10.092 63.7461,10.0835 63.7399,10.0703 63.7343,10.041 63.7225,10.0317 63.7219,10.0217 63.7155,10 63.7116,9.99925 63.7114,9.99203 63.7121,9.98674 63.7161,9.98858 63.7216,9.98178 63.7248,9.95537 63.7168,9.94634 63.7115,9.95058 63.7084,9.9619 63.7078,9.96659 63.706,9.96471 63.7016,9.93753 63.7007,9.92499 63.7061,9.91933 63.7063,9.91428 63.7042,9.90308 63.7031,9.89434 63.7022,9.88631 63.6978,9.87557 63.6847,9.86683 63.6851,9.8651 63.6897,9.85724 63.6932,9.84545 63.6929,9.83666 63.6944,9.82395 63.6916,9.82337 63.6815,9.82924 63.6764,9.80973 63.6652,9.81145 63.6611,9.82132 63.6583,9.83305 63.6597,9.84423 63.6502,9.85822 63.6467,9.8512 63.643,9.84305 63.642,9.8153 63.6322,9.81287 63.6292,9.81921 63.6249,9.82697 63.6232,9.82737 63.614,9.83889 63.6082,9.8434 63.5987,9.86993 63.5884,9.87596 63.5909,9.89629 63.5941,9.91422 63.5935,9.92074 63.5966,9.92892 63.5968,9.93084 63.5873,9.95447 63.5847,9.96414 63.5857,9.97546 63.5842,9.98809 63.5882,9.99243 63.595,10 63.5999,10.0061 63.5995,10.0109 63.594,10.012 63.5918,10 63.5864,9.98483 63.5797,9.97487 63.573,9.96676 63.5711,9.9563 63.5642,9.94972 63.5625,9.93923 63.5693,9.94114 63.5727,9.95931 63.5786,9.9587 63.5811,9.94945 63.5822,9.93724 63.5807,9.92538 63.5831,9.9162 63.5826,9.90967 63.5796,9.90244 63.569,9.92198 63.5537,9.92317 63.5496,9.92223 63.5486,9.91631 63.5424,9.91717 63.5338,9.92995 63.5206,9.93867 63.5068,9.95012 63.5012,9.97765 63.5011,9.98448 63.4959,9.99135 63.4896,9.99852 63.4887,10 63.4893,10.0126 63.4936,10.0294 63.4951,10.0489 63.4923,10.0722 63.4968,10.1123 63.4985,10.1466 63.5119,10.151 63.5169,10.153 63.5199,10.163 63.525,10.1757 63.528,10.2114 63.5433,10.2168 63.5522,10.2389 63.5562,10.2493 63.5581,10.3136 63.5598,10.3385 63.5648,10.3648 63.5752,10.3735 63.5768,10.4062 63.576,10.4201 63.5736,10.4278 63.5739,10.4328 63.5773,10.4311 63.5823,10.4386 63.5894,10.4691 63.6012,10.4787 63.6049,10.5083 63.6105,10.5402 63.6261,10.5729 63.6308,10.586 63.6399,10.6166 63.6519,10.6139 63.6594,10.6237 63.6711,10.6321 63.6732,10.6546 63.6757,10.6643 63.6783,10.7046 63.6944,10.7374 63.7024,10.7522 63.7084,10.7768 63.7123,10.8009 63.7142,10.8781 63.7308,10.8799 63.7312,10.9445 63.742,10.9645 63.7582,10.9927 63.7751,10.9953 63.7792,10.9927 63.7849,11.0147 63.8048,11.008 63.8105,11.0137 63.8121,11.0157 63.815,11.0121 63.8191,11.0104 63.821,11.0214 63.8264,11.0425 63.8296,11.0585 63.8358,11.0667 63.8429,11.0672 63.8464,11.0677 63.8499,11.0584 63.8613,11.0486 63.867,11.0527 63.8755,11.0465 63.8798,11.0506 63.8846,11.048 63.8866,11.0299 63.8882,11.0186 63.8928,10.986 63.8957,10.9746 63.9007,10.9725 63.9069,10.9497 63.911,10.9286 63.9041,10.9032 63.8926,10.8812 63.8826,10.8523 63.8742,10.8519 63.8707,10.838 63.8636,10.8256 63.8648,10.8194 63.8609,10.7855 63.8517,10.7617 63.8514,10.7545 63.8537,10.7148 63.8477,10.7108 63.8424,10.7056 63.8419,10.6973 63.8465,10.689 63.8467,10.6813 63.8428,10.6762 63.8403,10.682 63.8369,10.681 63.8332,10.6754 63.8293,10.678 63.8264,10.6703 63.822,10.6585 63.8215,10.6452 63.8153,10.6303 63.8132,10.6062 63.8063,10.6014 63.8131,10.6214 63.8182,10.6568 63.8331,10.67 63.8425,10.6931 63.8513,10.7011 63.853,10.7188 63.8568,10.7518 63.8626,10.7986 63.8741,10.8589 63.8885,10.9065 63.9033,10.9167 63.9064,10.9569 63.9238,10.9904 63.9414,11.0075 63.945,11.0225 63.9505,11.0251 63.958,11.0421 63.9646,11.0691 63.971,11.095 63.9804,11.1084 63.9877,11.1172 63.9861,11.1261 63.9879,11.139 63.9877,11.1577 63.9952,11.1701 63.9972,11.1779 64,11.1745 64,11.1807 64.004,11.2108 64.0104,11.2201 64.0195,11.2195 64.0322,11.2106 64.0468,11.2109 64.0524,11.2169 64.058,11.2181 64.0676,11.2221 64.0721,11.2233 64.0741,11.2318 64.0766,11.2501 64.0783,11.2766 64.0833,11.3227 64.0972,11.3273 64.1001,11.322 64.1025,11.3039 64.1028,11.3028 64.1041,11.3117 64.1069,11.3131 64.1098,11.3094 64.1138,11.3123 64.1161,11.3273 64.1102,11.3377 64.1118,11.3849 64.1105,11.3622 64.1015,11.3446 64.1006,11.3329 64.0943,11.3075 64.0892,11.2814 64.0809,11.2655 64.0733,11.2605 64.0752,11.2374 64.0722,11.2345 64.0703,11.2308 64.0566,11.2366 64.0304,11.2434 64.0283,11.2457 64.0276,11.2581 64.0284,11.2808 64.0386,11.3076 64.0401,11.3123 64.0365,11.3215 64.0361,11.3383 64.0402,11.3614 64.0403,11.3668 64.0377,11.3648 64.0312,11.3708 64.0268,11.3665 64.0246,11.3411 64.0221,11.3402 64.0193,11.3493 64.0191,11.363 64.0216,11.3807 64.0209,11.3936 64.0231,11.3982 64.0272,11.4318 64.0289,11.4393 64.0263,11.4393 64.0198,11.4341 64.0185,11.4364 64.0168,11.4624 64.0126,11.4651 64.0149,11.4627 64.017,11.4675 64.0195,11.4754 64.0194,11.4851 64.011,11.4907 64.0093,11.4706 64,11.4267 63.9825,11.4199 63.9741,11.4136 63.9738,11.3997 63.9812,11.3919 63.9805,11.3836 63.9698,11.3773 63.9694,11.3717 63.9735,11.3587 63.974,11.3401 63.9722,11.3229 63.9667,11.3116 63.9729,11.3007 63.9745,11.2966 63.9777,11.2872 63.9775,11.2853 63.9757,11.2763 63.9672,11.2659 63.9634,11.2654 63.9586,11.255 63.9536,11.2192 63.9445,11.2125 63.9411,11.2151 63.9397,11.2239 63.9397,11.2254 63.9383,11.2145 63.9336,11.2036 63.919,11.1948 63.9147,11.1922 63.9144,11.1897 63.9181,11.186 63.919,11.1534 63.9092,11.1441 63.909,11.1307 63.911,11.1218 63.9064,11.1085 63.8994,11.0842 63.8937,11.079 63.8903,11.0765 63.8716,11.0724 63.8657,11.078 63.8554,11.091 63.8435,11.1162 63.8431,11.1312 63.8406,11.1477 63.8438,11.1673 63.8442,11.1812 63.8488,11.1909 63.8565,11.1957 63.8604,11.2066 63.8597,11.2117 63.8626,11.2221 63.8642,11.2381 63.8715,11.2515 63.8651,11.2582 63.8656,11.2675 63.8697,11.298 63.8719,11.2995 63.8632,11.3216 63.8568,11.3196 63.8534,11.3092 63.8491,11.3128 63.8463,11.3411 63.8381,11.354 63.8396,11.37 63.8344,11.3771 63.8348,11.3969 63.8434,11.4005 63.8487,11.4062 63.8471,11.4149 63.8384,11.4349 63.8331,11.44 63.8283,11.4385 63.8253,11.4338 63.8244,11.4246 63.8269,11.4106 63.8236,11.4008 63.8234,11.4013 63.8197,11.4383 63.8157,11.4491 63.8084,11.4702 63.8052,11.4789 63.8022,11.4835 63.7962,11.4803 63.794,11.4686 63.8013,11.4619 63.8015,11.4499 63.7863,11.4509 63.782,11.4549 63.7792,11.4529 63.7776,11.4395 63.7797,11.4348 63.7742,11.4178 63.7734,11.4102 63.7784,11.3953 63.7839,11.3881 63.7842,11.3818 63.7782,11.3726 63.7755,11.3432 63.7749,11.3386 63.7726,11.3493 63.7699,11.3498 63.768,11.3349 63.7662,11.3297 63.7621,11.3211 63.7624,11.3205 63.7624,11.3029 63.7559,11.2963 63.7576,11.286 63.7681,11.2799 63.7684,11.2572 63.7625,11.2407 63.7602,11.2181 63.7609,11.2114 63.7557,11.2098 63.7402,11.2221 63.7324,11.2134 63.7269,11.2082 63.7205,11.2005 63.7203,11.1876 63.7151,11.1733 63.7149,11.1625 63.7188,11.1589 63.7147,11.1614 63.711,11.1578 63.7098,11.1568 63.7094,11.1378 63.7124,11.1306 63.7115,11.1101 63.7124,11.0947 63.7087,11.0895 63.7126,11.0824 63.711,11.0798 63.7058,11.0516 63.7005,11.0454 63.7014,11.0433 63.7065,11.05 63.7138,11.0438 63.716,11.0269 63.7185,11.0089 63.7167,11.0012 63.7174,11.0074 63.7115,10.9992 63.7076,10.9853 63.708,10.9807 63.7069,10.9715 63.7039,10.9597 63.7041,10.9315 63.6964,10.9003 63.6826,10.8962 63.6783,10.8824 63.6723,10.8799 63.6639,10.8748 63.6621,10.8651 63.6616,10.861 63.6589,10.8595 63.6529,10.8477 63.6481,10.8396 63.641,10.8278 63.6405,10.7946 63.6325,10.7843 63.6382,10.7756 63.6377,10.7415 63.6244,10.7261 63.6235,10.7084 63.6068,10.7136 63.6022,10.6786 63.5852,10.6813 63.5748,10.6781 63.567,10.6768 63.5638,10.6428 63.5546,10.6362 63.55,10.6567 63.543,10.6624 63.5425,10.6792 63.546,10.7421 63.5749,10.7493 63.5752,10.7575 63.572,10.7718 63.5702,10.785 63.577,10.7952 63.5784,10.8049 63.583,10.8081 63.5835,10.8202 63.5851,10.8212 63.5878,10.813 63.589,10.812 63.5903,10.8196 63.5922,10.8437 63.5936,10.8707 63.603,10.8899 63.596,10.8928 63.5932,10.9004 63.593,10.9086 63.5953,10.9183 63.593,10.9173 63.5882,10.9122 63.5868,10.9005 63.5889,10.8815 63.5879,10.8723 63.5923,10.8687 63.5897,10.8749 63.5861,10.8729 63.5843,10.8561 63.5799,10.852 63.5769,10.8551 63.5751,10.8663 63.5758,10.8694 63.5722,10.8597 63.5674,10.8618 63.5662,10.8746 63.566,10.8805 63.5674,10.8838 63.5681,10.893 63.5649,10.8991 63.5654,10.9052 63.5699,10.9175 63.5642,10.9257 63.5652,10.9262 63.5631,10.9099 63.5588,10.8941 63.5524,10.8635 63.5519,10.8461 63.5461,10.8109 63.5474,10.8027 63.5451,10.7834 63.544,10.7778 63.5414,10.7712 63.5323,10.7565 63.5241,10.7554 63.5211,10.7546 63.5188,10.7588 63.5079,10.7777 63.4997,10.7824 63.4897,10.8351 63.4731,10.8478 63.474,10.8605 63.4791,10.8743 63.4793,10.8885 63.4821,10.8931 63.4803,10.8804 63.4768,10.8855 63.4748,10.8937 63.4745,10.9079 63.4773,10.911 63.4762,10.9054 63.4666,10.8984 63.4586,10.8826 63.4522,10.8664 63.4501,10.8507 63.4435,10.8125 63.4404,10.8065 63.4356,10.8071 63.426,10.801 63.4224,10.7857 63.431,10.7637 63.4394,10.7434 63.4373,10.7311 63.4398,10.7179 63.4405,10.7087 63.4439,10.6954 63.4431,10.6852 63.4456,10.6725 63.4449,10.6593 63.4469,10.6348 63.4464,10.6134 63.4495,10.5744 63.4416,10.5612 63.4368,10.553 63.4377,10.5424 63.4388,10.5348 63.4362,10.5164 63.4398,10.4984 63.4464,10.4847 63.4468,10.472 63.4449,10.4521 63.4464,10.4448 63.4546,10.4371 63.4557,10.4326 63.452,10.4353 63.4477,10.4313 63.4449,10.4227 63.4429,10.417 63.4458,10.4094 63.4464,10.3928 63.4359,10.3751 63.4337,10.3652 63.4403,10.3594 63.4483,10.3496 63.4537,10.3404 63.4562,10.3057 63.4594,10.2925 63.4564,10.2848 63.4591,10.27 63.4608,10.2528 63.4584,10.2415 63.4593,10.2283 63.4603,10.2197 63.4555,10.1892 63.456,10.1852 63.4544,10.1869 63.4489,10.1697 63.4454,10.1598 63.4369,10.1512 63.4334,10.1319 63.4319,10.1133 63.4275,10.0892 63.4179,10.0712 63.408,10.0656 63.3947,10.0674 63.3879,10.0693 63.3855,10.0769 63.3761,10.0816 63.3745,10.0892 63.375,10.1061 63.369,10.1057 63.3658,10.1161 63.3592,10.1278 63.3589,10.1406 63.3532,10.1534 63.3501,10.1672 63.3488,10.2148 63.351,10.2646 63.3469,10.2659 63.3396,10.2748 63.3296,10.2651 63.3293,10.259 63.3316,10.2521 63.3418,10.2399 63.3427,10.2313 63.3412,10.2203 63.3364,10.208 63.3256,10.1885 63.3175,10.1819 63.3165,10.1748 63.316,10.1636 63.3194,10.1563 63.3237,10.1425 63.3272,10.1298 63.3285,10.1124 63.3334,10.0976 63.3318,10.0837 63.3335,10.0657 63.35,10.0503 63.3542,10.0406 63.3558,10.0123 63.3521,10 63.3532,9.9711 63.355,9.96252 63.3538,9.94363 63.3441,9.91963 63.3352,9.89144 63.3302,9.87499 63.3237,9.86337 63.3227,9.85851 63.3176,9.85092 63.3173,9.85372 63.3231,9.85165 63.3242,9.8304 63.3231,9.85682 63.3336,9.87016 63.3419,9.88072 63.3443,9.90166 63.3531,9.92672 63.3609,9.93048 63.3638,9.94296 63.3738,9.97432 63.4162,9.97633 63.4299,9.98246 63.4425,9.98068 63.4491,9.93684 63.4634,9.93104 63.4684,9.91946 63.4651,9.9121 63.4705,9.91241 63.4755,9.90566 63.4785,9.8811 63.481,9.87011 63.4878,9.85826 63.4906,9.85455 63.494,9.85819 63.5043,9.8534 63.5088,9.84669 63.5106,9.84337 63.5049,9.83927 63.5053,9.83646 63.5114,9.82968 63.5148,9.82389 63.5189,9.82321 63.5227,9.83317 63.5283,9.83864 63.5434,9.83697 63.5466,9.83022 63.549,9.82638 63.5552,9.80133 63.5668,9.79214 63.5779,9.76509 63.588,9.76194 63.5897,9.76272 63.595,9.75742 63.5988,9.76279 63.6046,9.75225 63.6111,9.74944 63.6166,9.74312 63.6202,9.73033 63.62,9.72871 63.6219,9.74026 63.6265,9.74465 63.6314,9.74386 63.6373,9.74997 63.649,9.74784 63.6508,9.72677 63.652,9.71777 63.6471,9.69037 63.6414,9.66717 63.6338,9.66227 63.6295,9.64141 63.6265,9.60395 63.628,9.57098 63.6121,9.56188 63.61,9.54401 63.6091,9.52604 63.6005,9.53395 63.5962,9.5099 63.5868,9.50609 63.5818,9.5148 63.5814,9.54905 63.5914,9.56466 63.5863,9.56237 63.5812,9.56357 63.5796,9.5679 63.5735,9.57469 63.5706,9.57677 63.5506,9.58484 63.5427,9.58779 63.5352,9.58432 63.5331,9.5786 63.5351,9.57263 63.5419,9.5734 63.5467,9.56463 63.5676,9.55302 63.5745,9.5357 63.5732,9.52594 63.574,9.50979 63.5702,9.4994 63.5733,9.50323 63.5779,9.4985 63.5803,9.49038 63.5791,9.48191 63.5751,9.48279 63.5685,9.47257 63.5684,9.46799 63.5681,9.45757 63.5625,9.46687 63.5606,9.46753 63.5581,9.45605 63.5532,9.44736 63.5442,9.43964 63.5452,9.43562 63.544,9.42884 63.5376,9.41883 63.534,9.41515 63.5272,9.42179 63.5181,9.4319 63.5109,9.42804 63.507,9.4199 63.5067,9.4063 63.5125,9.39925 63.5197,9.40547 63.5268,9.3941 63.5292,9.40628 63.5567,9.41288 63.5575,9.41483 63.5591,9.41165 63.5611,9.4045 63.561,9.40075 63.564,9.39509 63.5646,9.38366 63.559,9.37132 63.5602,9.36227 63.5578,9.36005 63.5521,9.33055 63.5415,9.32858 63.5319,9.32375 63.5261,9.3224 63.5245,9.30975 63.5225,9.30304 63.5238,9.30036 63.5258,9.30718 63.5312,9.30038 63.5338,9.29064 63.5344,9.25273 63.5282,9.24992 63.5243,9.26013 63.5162,9.26897 63.5136,9.27121 63.5104,9.26657 63.503,9.25918 63.4988,9.25548 63.5009,9.26217 63.508,9.25787 63.5116,9.24173 63.5167,9.24237 63.5226,9.23096 63.5254,9.21792 63.5218,9.21371 63.5192,9.20075 63.5111,9.19118 63.5092,9.18936 63.5057,9.18239 63.5031,9.18011 63.499,9.15733 63.4964,9.15294 63.4934,9.16489 63.4901,9.17604 63.4912,9.18022 63.4896,9.17455 63.4827,9.17451 63.4756,9.18444 63.4719,9.17805 63.4684,9.18171 63.4668,9.19255 63.4647,9.22268 63.4637,9.22888 63.4622,9.2313 63.4563,9.23752 63.4545,9.25027 63.4542,9.26542 63.456,9.29376 63.4593,9.30518 63.4558,9.3169 63.4557,9.3284 63.4593,9.33529 63.4632,9.33673 63.4731,9.31466 63.4758,9.29033 63.4737,9.28663 63.4757,9.30196 63.4834,9.30431 63.4866,9.29153 63.4871,9.29423 63.4929,9.28582 63.4969,9.28819 63.4999,9.2959 63.4988,9.32149 63.4891,9.32164 63.4866,9.32068 63.486,9.31032 63.4801,9.31346 63.4787,9.33682 63.4801,9.34816 63.478,9.34982 63.4757,9.34122 63.4663,9.34239 63.4638,9.34808 63.4622,9.36786 63.4638,9.38289 63.4681,9.39311 63.4676,9.43104 63.4726,9.44595 63.4791,9.47232 63.4815,9.48575 63.4875,9.51311 63.4906,9.51218 63.489,9.4946 63.4842,9.50197 63.48,9.49411 63.4746,9.49677 63.4726,9.49329 63.471,9.47706 63.4696,9.45594 63.4737,9.44531 63.4725,9.43598 63.4662,9.42071 63.466,9.40475 63.4602,9.37803 63.4555,9.36633 63.4552,9.35816 63.4555,9.34164 63.4508,9.33179 63.4536,9.32741 63.4504,9.31476 63.4491,9.30338 63.4437,9.29184 63.4418,9.28826 63.4412,9.28636 63.4471,9.27958 63.4498,9.27297 63.4497,9.26552 63.4467,9.2647 63.4434,9.26027 63.4411,9.25047 63.443,9.2403 63.4429,9.23196 63.438,9.22588 63.4375,9.21796 63.4419,9.20828 63.4421,9.20698 63.4386,9.19745 63.4364,9.18871 63.4299,9.19001 63.4256,9.18261 63.4221,9.18144 63.4166,9.19919 63.4018,9.20755 63.3982,9.21146 63.3928,9.22746 63.3889,9.23536 63.3926,9.24007 63.3904,9.23946 63.384,9.23417 63.3794,9.24566 63.3743,9.25334 63.3734,9.30341 63.3768,9.32558 63.3798,9.37279 63.3804,9.40346 63.3857,9.42376 63.3862,9.42713 63.3894,9.43418 63.3906,9.44693 63.3899,9.46089 63.3946,9.46348 63.3949,9.47805 63.3968,9.49392 63.4039,9.50198 63.4053,9.51033 63.4013,9.4928 63.3965,9.43623 63.3813,9.41262 63.3767,9.39186 63.3756,9.3792 63.375,9.37434 63.3712,9.35196 63.3719,9.34458 63.3679,9.32893 63.3664,9.32163 63.3695,9.30807 63.367,9.29842 63.3671,9.29069 63.3607,9.28115 63.359,9.27604 63.3596,9.24146 63.3525,9.23919 63.3482,9.24263 63.342,9.24022 63.34,9.23366 63.3394,9.22738 63.3425,9.21974 63.3429,9.21548 63.346,9.20588 63.3455,9.18839 63.3334,9.18354 63.3301,9.15045 63.3242,9.14239 63.3234,9.12985 63.3139,9.13381 63.3078,9.12948 63.3043,9.09776 63.2938,9.09607 63.2963,9.09219 63.3013,9.09204 63.3109,9.09536 63.3141,9.09312 63.3173,9.10615 63.3282,9.11135 63.3326,9.13772 63.3478,9.13657 63.3498,9.12777 63.3524,9.1255 63.3561,9.13065 63.3625,9.14 63.367,9.17947 63.3769,9.1808 63.3798,9.17436 63.385,9.16359 63.3865,9.15153 63.3845,9.15595 63.4099,9.14445 63.4145,9.14123 63.4195,9.13708 63.4258,9.13084 63.4278,9.11448 63.429,9.11237 63.4301,9.11875 63.4336,9.11663 63.4347,9.103 63.4332,9.09304 63.4374,9.09028 63.4405,9.09395 63.4463,9.09172 63.4492,9.07852 63.4486,9.06364 63.4502,9.05634 63.4526,9.03497 63.4523,9.02762 63.4554,9.02488 63.4654,9.01329 63.4707,9.00618 63.4704,8.99826 63.4671,8.99447 63.4632,9.00054 63.4566,8.99575 63.4524,8.99 63.4517,8.98944 63.4551,8.98352 63.4596,8.97843 63.4595,8.97126 63.453,8.97243 63.451,8.98918 63.4517,8.98076 63.4484,8.97942 63.4458,8.99527 63.4378,8.99702 63.4347,8.99215 63.4316,8.987 63.4312,8.98224 63.4349,8.97548 63.4369,8.95668 63.4295,8.95632 63.4275,8.96195 63.4271,8.97491 63.4307,8.98562 63.4312,8.97875 63.4269,8.98139 63.4255,8.99415 63.425,9.00296 63.4229,9.02068 63.424,9.02961 63.42,9.01958 63.4181,9.01023 63.4136,8.99435 63.4152,8.98045 63.4105,8.96761 63.4121,8.97525 63.4191,8.97105 63.4208,8.961 63.4191,8.95106 63.4228,8.93673 63.424,8.93946 63.4284,8.93778 63.4304,8.9245 63.4311,8.92208 63.4294,8.91628 63.4253,8.92189 63.4183,8.91904 63.4155,8.9083 63.4163,8.90099 63.412,8.89399 63.4172,8.88938 63.4176,8.88242 63.4154,8.90028 63.4079,8.90901 63.4001,8.9031 63.3975,8.89353 63.3962,8.88079 63.4101,8.87355 63.4116,8.87916 63.425,8.87786 63.4286,8.87071 63.4289,8.87223 63.4358,8.84557 63.4315,8.84294 63.4321,8.83213 63.4343,8.81074 63.4344,8.8048 63.4323,8.7977 63.4319,8.78475 63.4347,8.77028 63.4311,8.76462 63.4319,8.75768 63.4295,8.74151 63.4281,8.73857 63.4267,8.74055 63.421,8.73727 63.4175,8.71445 63.4229,8.69248 63.4177,8.6707 63.4165,8.65744 63.4108,8.65517 63.4075,8.66067 63.3964,8.66633 63.3956,8.66578 63.3899,8.66654 63.3892,8.67237 63.3841,8.71082 63.3673,8.71591 63.361,8.71141 63.3539,8.71409 63.3521,8.7301 63.3551,8.73825 63.3547,8.7471 63.3519,8.82224 63.3583,8.83652 63.3576,8.84231 63.355,8.83646 63.3517,8.80466 63.3518,8.79889 63.3518,8.7904 63.3501,8.77819 63.3504,8.75301 63.3415,8.74239 63.3411,8.7105 63.3337,8.70131 63.3345,8.6668 63.3285,8.6515 63.3234,8.60616 63.3197,8.5928 63.3158,8.57254 63.3155,8.56507 63.314,8.55229 63.3151,8.54902 63.3137,8.53664 63.3085,8.52759 63.3076,8.52965 63.3015,8.52468 63.2946,8.51421 63.2925,8.49989 63.2941,8.49496 63.2867,8.48204 63.284,8.49615 63.279,8.50485 63.278,8.50815 63.2751,8.51134 63.279,8.51486 63.2793,8.527 63.2679,8.52336 63.2632,8.52612 63.2605,8.53808 63.2569,8.54831 63.2557,8.55469 63.2521,8.55295 63.243,8.56501 63.2379,8.57016 63.2309,8.57947 63.2286,8.58083 63.2185,8.59177 63.2146,8.59107 63.205,8.60336 63.2091,8.60706 63.2071,8.59817 63.1987,8.60147 63.1956,8.61552 63.1906,8.61785 63.187,8.62871 63.1899,8.64442 63.1892,8.65586 63.1913,8.67984 63.2006,8.68369 63.1967,8.69877 63.1977,8.70558 63.1946,8.73917 63.1976,8.74321 63.1978,8.77895 63.1992,8.83941 63.2077,8.89039 63.2082,8.9744 63.2131,8.97857 63.2113,8.96925 63.2075,8.94474 63.2042,8.93987 63.2016,8.88586 63.2013,8.87295 63.1983,8.85046 63.2019,8.82677 63.2013,8.81857 63.1961,8.80912 63.1944,8.76493 63.1912,8.72104 63.1907,8.71795 63.1902,8.7081 63.1885,8.66741 63.186,8.65122 63.1802,8.61834 63.1751,8.59663 63.1752,8.57823 63.1719,8.55946 63.1672,8.55024 63.163,8.54902 63.1595,8.55778 63.1515,8.5571 63.1418,8.565 63.1319,8.56912 63.1309,8.57706 63.1324,8.58627 63.1307,8.59837 63.1307,8.60192 63.1243,8.61423 63.1218,8.62404 63.1069,8.61546 63.101,8.61034 63.1021,8.60716 63.1065,8.60578 63.1084,8.59635 63.1128,8.58867 63.1262,8.5682 63.124,8.55033 63.1326,8.54161 63.1402,8.53115 63.1387,8.52652 63.134,8.51903 63.1332,8.51128 63.1353,8.50267 63.1416,8.48656 63.1413,8.47583 63.1372,8.46071 63.1429,8.45439 63.1403,8.44579 63.1406,8.44071 63.1466,8.43356 63.1477,8.41729 63.1436,8.40299 63.14,8.39034 63.1405,8.37948 63.138,8.37283 63.139,8.35865 63.1451,8.35307 63.1455,8.34369 63.1542,8.3355 63.1554,8.29033 63.153,8.2654 63.1553,8.25688 63.1494,8.25702 63.1428,8.27372 63.1314,8.28735 63.126,8.31061 63.1226,8.31647 63.1217,8.32689 63.118,8.32916 63.1153,8.31964 63.1095,8.32105 63.1051,8.33884 63.0979,8.33509 63.0949,8.32421 63.0929,8.32333 63.0915,8.32706 63.0893,8.33964 63.089,8.34385 63.0873,8.34007 63.0847,8.32659 63.0835,8.30743 63.0786,8.2969 63.0782,8.28931 63.084,8.29152 63.0872,8.31627 63.0971,8.31647 63.1003,8.30127 63.1066,8.28516 63.1065,8.2852 63.1075,8.2853 63.1104,8.26381 63.1244,8.2611 63.1316,8.25583 63.134,8.24782 63.1439,8.23992 63.1474,8.23111 63.1448,8.2206 63.1439,8.21249 63.1391,8.20153 63.1378,8.1921 63.1362,8.18113 63.1322,8.17507 63.13,8.17225 63.1228,8.17424 63.1128,8.18536 63.1073,8.19628 63.0986,8.18775 63.0932,8.19606 63.0906,8.20079 63.0834,8.21547 63.0825,8.23571 63.0761,8.24061 63.067,8.23684 63.0592,8.24099 63.0526,8.23794 63.0478,8.22546 63.0416,8.23077 63.0335,8.24019 63.0324,8.24551 63.0317,8.25693 63.0278,8.26458 63.0213,8.27711 63.0216,8.31199 63.0138,8.32302 63.014,8.35881 63.0234,8.37901 63.0221,8.39866 63.0159,8.4402 63.0173,8.46091 63.0216,8.47252 63.0209,8.48698 63.022,8.48785 63.0216,8.49332 63.0185,8.49245 63.0169,8.4553 63.0112,8.43277 63.0106,8.3793 63.0135,8.37245 63.0115,8.35885 63.0119,8.33952 63.0093,8.32452 63.0033,8.32214 63.0019,8.3234 62.9937,8.3266 62.9917,8.3362 62.9909,8.35592 62.9838,8.36681 62.9744,8.37874 62.97,8.38831 62.9695,8.40266 62.9716,8.42482 62.9761,8.44407 62.9852,8.45048 62.9864,8.46354 62.9862,8.46692 62.9876,8.46412 62.991,8.46892 62.9934,8.48225 62.9959,8.49044 62.994,8.49303 62.9989,8.50604 63.005,8.53267 63.0105,8.563 63.0197,8.58146 63.0212,8.58807 63.0202,8.50901 62.9939,8.49469 62.9913,8.46987 62.9827,8.46117 62.9727,8.45894 62.9701,8.46071 62.9672,8.48088 62.9714,8.48953 62.97,8.52389 62.9727,8.5373 62.98,8.55477 62.981,8.56541 62.9855,8.57822 62.9882,8.59716 62.9897,8.61838 62.9878,8.62969 62.9905,8.64875 62.9906,8.65259 62.9865,8.64815 62.9796,8.64896 62.9757,8.65998 62.9759,8.66667 62.9737,8.6663 62.9721,8.64871 62.9727,8.60048 62.9681,8.53536 62.956,8.52036 62.9555,8.47344 62.9592,8.45153 62.9519,8.44133 62.954,8.42604 62.9513,8.42437 62.9476,8.42832 62.9421,8.43181 62.9372,8.444 62.9296,8.45588 62.9255,8.45879 62.9153,8.47501 62.9014,8.49055 62.901,8.5115 62.8902,8.51715 62.8885,8.52815 62.8884,8.53349 62.8844,8.53592 62.8794,8.58737 62.8856,8.6033 62.8804,8.61808 62.8648,8.61693 62.8607,8.62893 62.8424,8.6542 62.8385,8.67412 62.8329,8.6897 62.8315,8.69516 62.8257,8.68561 62.8203,8.67427 62.8249,8.66475 62.8254,8.65755 62.828,8.64318 62.8269,8.63502 62.829,8.60518 62.8459,8.57747 62.8667,8.57085 62.8681,8.56717 62.8644,8.5589 62.8677,8.5509 62.8678,8.54574 62.8638,8.52926 62.8638,8.51201 62.8669,8.49844 62.8738,8.48482 62.8808,8.47512 62.8831,8.46106 62.8838,8.44776 62.8872,8.4237 62.8991,8.41915 62.8997,8.4179 62.8969,8.42514 62.8886,8.43599 62.8847,8.45243 62.874,8.49072 62.8647,8.50215 62.8596,8.51301 62.8495,8.5135 62.8438,8.50925 62.8401,8.50793 62.8389,8.50558 62.8373,8.49558 62.8376,8.4886 62.8432,8.45937 62.8463,8.44916 62.8488,8.4301 62.8611,8.43119 62.8657,8.40181 62.8756,8.38494 62.8854,8.37727 62.8873,8.36435 62.8864,8.35427 62.8818,8.34993 62.8747,8.33584 62.8703,8.32274 62.8607,8.32011 62.8594,8.31606 62.8573,8.30611 62.8569,8.31735 62.8649,8.31107 62.868,8.32874 62.8823,8.33116 62.8885,8.34515 62.894,8.33781 62.9029,8.33051 62.9118,8.32217 62.9153,8.30893 62.9178,8.30801 62.9223,8.30234 62.924,8.29418 62.931,8.30584 62.9401,8.32179 62.9463,8.33234 62.9568,8.34116 62.959,8.33727 62.9686,8.32248 62.9713,8.30841 62.9769,8.28172 62.9835,8.26103 62.9742,8.24978 62.9817,8.26008 62.9895,8.2669 62.9917,8.27008 62.9952,8.26823 62.9988,8.23647 63.0107,8.21025 63.0171,8.18588 63.0301,8.14967 63.0355,8.13212 63.0452,8.14161 63.0509,8.13735 63.0533,8.13349 63.0534,8.12476 63.0535,8.11951 63.0557,8.13051 63.0564,8.13484 63.0583,8.13612 63.0656,8.14672 63.0805,8.13773 63.0849,8.14643 63.0885,8.13239 63.093,8.13235 63.0985,8.12577 63.0988,8.12049 63.1062,8.12216 63.1097,8.11921 63.114,8.10529 63.1171,8.10282 63.1216,8.09116 63.1223,8.03834 63.1096,8.02133 63.1056,8.01312 63.107,8.03581 63.1166,8.03457 63.1189,8.02956 63.1185,8.00985 63.1094,7.99546 63.1073,7.99065 63.1051,7.98969 63.0999,7.97567 63.0943,7.97014 63.0894,7.97553 63.0813,7.97307 63.076,7.9766 63.071,7.97333 63.0639,7.97481 63.0593,7.97042 63.0533,7.9487 63.0494,7.93962 63.0502,7.93652 63.0505,7.92114 63.0486,7.90387 63.0361,7.8899 63.0305,7.88738 63.0259,7.89378 63.0178,7.88597 63.011,7.89082 63.0033,7.8846 63.0005,7.88392 62.9975,7.89613 62.9959,7.9221 62.9972,7.93313 63.002,7.94909 63.003,7.9555 63.0089,7.96334 63.0106,7.96931 63.016,7.98165 63.0181,7.98443 63.021,7.99071 63.0274,7.98604 63.0337,7.98052 63.0336,7.9645 63.0283,7.96035 63.0295,7.96457 63.0324,7.96734 63.0395,7.97345 63.0435,7.98031 63.0453,7.98198 63.0437,7.97892 63.0393,7.98317 63.0371,7.99435 63.036,7.99976 63.0322,8.00182 63.027,7.99162 63.014,7.99619 63.0086,8.02979 62.9992,8.03753 62.9923,8.03531 62.9895,8.04077 62.9837,8.04206 62.9824,8.05525 62.976,8.0695 62.974,8.1149 62.9562,8.13868 62.9439,8.15205 62.9352,8.16199 62.9208,8.16225 62.9131,8.17496 62.911,8.19144 62.9114,8.20325 62.9134,8.20783 62.9126,8.20896 62.9112,8.19653 62.9053,8.18763 62.9042,8.16558 62.8944,8.16156 62.8895,8.17009 62.8789,8.17404 62.8692,8.16274 62.8571,8.16958 62.8535,8.18543 62.8498,8.19093 62.8394,8.19842 62.8342,8.2059 62.8239,8.22119 62.8205,8.22399 62.8195,8.25274 62.8088,8.26049 62.8112,8.28053 62.8103,8.28684 62.8067,8.31352 62.804,8.32537 62.7999,8.34149 62.7872,8.35772 62.7841,8.37264 62.7789,8.39624 62.7768,8.43295 62.7617,8.43643 62.7557,8.44221 62.7527,8.45179 62.7513,8.45331 62.7566,8.47793 62.7484,8.50123 62.7435,8.52475 62.7362,8.53356 62.732,8.55313 62.7006,8.55356 62.6896,8.54476 62.6821,8.54555 62.6787,8.5596 62.6769,8.56178 62.6747,8.55793 62.6732,8.54828 62.6698,8.52878 62.6716,8.52197 62.6758,8.51045 62.6943,8.5037 62.6976,8.50684 62.7016,8.50401 62.7056,8.50808 62.7103,8.50231 62.7195,8.49018 62.7218,8.47106 62.7302,8.44259 62.7315,8.43684 62.7291,8.43379 62.7242,8.42855 62.7216,8.40388 62.7472,8.3674 62.7598,8.34603 62.7649,8.32902 62.7712,8.30958 62.782,8.29246 62.784,8.27298 62.7793,8.26547 62.7796,8.25203 62.7848,8.23381 62.7876,8.22151 62.7913,8.2135 62.7916,8.19997 62.7975,8.18876 62.8,8.18404 62.8024,8.18041 62.809,8.15829 62.8158,8.13366 62.8329,8.11896 62.8502,8.11914 62.8585,8.11028 62.8722,8.11435 62.8865,8.10918 62.8876,8.10106 62.8894,8.09677 62.8923,8.10609 62.8991,8.10913 62.9038,8.10777 62.9074,8.11805 62.9197,8.12563 62.924,8.124 62.9253,8.115 62.9251,8.11064 62.9287,8.09942 62.9308,8.08571 62.9376,8.07145 62.9498,8.05448 62.954,8.04076 62.9656,8.03458 62.9673,8.02152 62.9675,7.99671 62.9742,7.98283 62.9779,7.97687 62.9773,7.96646 62.9714,7.95398 62.9709,7.94946 62.9662,7.93713 62.9689,7.91504 62.9646,7.87936 62.9606,7.86582 62.9514,7.85937 62.9508,7.84835 62.9553,7.83735 62.9551,7.82157 62.9481,7.80491 62.9447,7.784 62.9344,7.77362 62.9333,7.76078 62.9271,7.74213 62.9237,7.70838 62.9121,7.69518 62.905,7.68916 62.905,7.68538 62.9075,7.6912 62.9136,7.71114 62.9232,7.71796 62.9293,7.73817 62.9366,7.74408 62.942,7.74656 62.9429,7.75561 62.9464,7.76095 62.9524,7.79722 62.9645,7.76736 62.9759,7.75706 62.9738,7.75057 62.978,7.72723 62.9759,7.70796 62.9777,7.69136 62.9737,7.6759 62.9729,7.66661 62.9708,7.65502 62.9625,7.63965 62.961,7.62576 62.9561,7.59058 62.9434,7.58598 62.9399,7.59212 62.9345,7.58802 62.931,7.56465 62.9295,7.55996 62.9269,7.55105 62.926,7.54218 62.9205,7.51955 62.9129,7.51049 62.9133,7.50291 62.9097,7.49531 62.9104,7.47596 62.9091,7.46794 62.905,7.44357 62.9037,7.43894 62.9047,7.43655 62.9078,7.45211 62.9117,7.45208 62.9126,7.45175 62.9229,7.44867 62.9276,7.45072 62.9354,7.43856 62.9406,7.43547 62.9453,7.4086 62.96,7.39224 62.9625,7.38475 62.9703,7.3791 62.9713,7.37612 62.9751,7.3667 62.9742,7.34354 62.9789,7.32691 62.9794,7.31796 62.9867,7.32372 62.9928,7.32249 62.9985,7.31855 63.0014,7.31306 63.0055,7.29884 63.0068,7.29716 63.0081,7.30866 63.0125,7.30578 63.0154,7.29002 63.0168,7.26889 63.0131,7.23458 63.0103,7.2097 63.0008,7.19872 63.0002,7.16443 63.005,7.15946 63.0047,7.14245 63.0003,7.15722 62.995,7.15846 62.9818,7.15431 62.9828,7.14993 62.9893,7.14463 62.9915,7.13656 62.9917,7.12642 62.9887,7.12289 62.9964,7.11855 62.9988,7.10937 62.996,7.09727 62.9963,7.09163 62.9934,7.10212 62.9864,7.08875 62.9812,7.08753 62.9792,7.09638 62.973,7.09219 62.9706,7.07518 62.9777,7.04777 62.9762,7.04548 62.9746,7.03492 62.9747,7.03264 62.9731,7.04316 62.9695,7.03969 62.9655,7.02624 62.9609,7.02291 62.9597,7.02453 62.9552,7.02072 62.9537,7.00826 62.9532,7.00679 62.9492,6.99798 62.9476,6.98393 62.9477,6.98159 62.9428,6.98868 62.9387,6.98157 62.9357,6.96415 62.9348,6.95033 62.9296,6.93558 62.9275,6.92496 62.9211,6.90061 62.916,6.8971 62.9125,6.90756 62.9057,6.91978 62.9079,6.92771 62.9049,6.92759 62.9021,6.95022 62.9014,6.95486 62.9023,6.95998 62.9033,6.96706 62.9028,6.96827 62.9012,6.96046 62.8962,6.97635 62.8935,6.96338 62.8787,6.96977 62.8759,6.99858 62.8774,7.00054 62.874,6.99198 62.8671,6.99344 62.8638,7.00303 62.8595,7.0096 62.8589,7.00894 62.8491,6.99867 62.8474,6.9968 62.8428,6.9913 62.8392,6.99982 62.8353,7.00831 62.8353,7.03205 62.8408,7.03467 62.8401,7.04922 62.8358,7.06058 62.8368,7.10421 62.8506,7.13001 62.852,7.15704 62.8479,7.16848 62.8407,7.17839 62.8375,7.19951 62.8365,7.2008 62.8342,7.17941 62.8259,7.17827 62.8231,7.20144 62.8139,7.20755 62.8129,7.21632 62.8134,7.23134 62.8142,7.23705 62.8126,7.23181 62.8067,7.21771 62.8077,7.18392 62.8066,7.17049 62.8101,7.15894 62.8182,7.15012 62.8207,7.13871 62.8202,7.12271 62.8166,7.11211 62.8174,7.10332 62.8197,7.07904 62.8183,7.0768 62.8201,7.07867 62.8211,7.10928 62.8237,7.1155 62.8257,7.11467 62.8282,7.10659 62.8289,7.10175 62.8315,7.09422 62.8318,7.07875 62.8279,7.07419 62.8322,7.06333 62.8272,7.05302 62.8224,7.0404 62.8234,7.03026 62.8209,7.0167 62.8141,6.9974 62.8092,6.9932 62.8033,6.98348 62.7978,6.98118 62.7927,6.98687 62.7803,6.98306 62.7754,6.98557 62.7679,7.00172 62.7629,7.00171 62.7519,6.99328 62.7516,6.99101 62.75,6.99846 62.7465,6.97684 62.737,6.97716 62.7347,6.98872 62.7302,6.98591 62.7254,6.9877 62.7231,7.00726 62.7257,7.01457 62.7232,7.02297 62.7237,7.07134 62.7342,7.09633 62.7335,7.11342 62.736,7.15099 62.7343,7.21502 62.7358,7.21603 62.736,7.24874 62.7408,7.27013 62.7409,7.28152 62.7453,7.30343 62.7494,7.324 62.7522,7.34543 62.752,7.37068 62.7573,7.42092 62.762,7.44103 62.7687,7.46513 62.7713,7.47025 62.7742,7.47728 62.778,7.49979 62.7816,7.51036 62.7807,7.55295 62.7831,7.57494 62.7869,7.6263 62.7911,7.64627 62.7952,7.65619 62.7957,7.65611 62.792,7.66436 62.7897,7.66284 62.7855,7.66493 62.7847,7.71162 62.7906,7.71185 62.7885,7.68495 62.784,7.6642 62.7824,7.64007 62.7841,7.62482 62.7823,7.59688 62.7826,7.56704 62.7777,7.54365 62.7774,7.53194 62.7753,7.51202 62.7668,7.47489 62.7606,7.45989 62.7566,7.45704 62.7558,7.44327 62.7543,7.43015 62.7476,7.37434 62.7398,7.37159 62.7379,7.37508 62.7338,7.3701 62.7298,7.38267 62.7288,7.38791 62.7266,7.40039 62.7304,7.4139 62.7298,7.41611 62.728,7.40545 62.7216,7.40719 62.7196,7.41761 62.7198,7.42307 62.7158,7.41943 62.713,7.42362 62.7113,7.43062 62.711,7.42399 62.7083,7.39524 62.7061,7.38113 62.7049,7.37389 62.7032,7.36303 62.6985,7.3523 62.6969,7.35939 62.6918,7.39025 62.6914,7.40152 62.6888,7.42172 62.6902,7.43347 62.6958,7.43801 62.6952,7.45236 62.6875,7.45597 62.6824,7.47969 62.6834,7.49321 62.6867,7.50711 62.6868,7.51474 62.6896,7.52606 62.6905,7.54159 62.6946,7.57525 62.7034,7.59633 62.706,7.74252 62.7371,7.77888 62.7414,7.7919 62.744,7.8076 62.7473,7.82389 62.7486,7.85479 62.7575,7.95642 62.7714,7.96719 62.7684,7.97807 62.7691,7.98669 62.7677,7.99604 62.7688,8.01466 62.7669,8.02301 62.768,8.02907 62.7672,8.04217 62.7707,8.04797 62.7714,8.0707 62.7743,8.07448 62.7714,8.03176 62.7604,8.02363 62.7522,8.02954 62.748,8.0496 62.7416,8.05803 62.737,8.07636 62.7378,8.0971 62.7344,8.11426 62.7219,8.12132 62.7209,8.12522 62.7166,8.1337 62.7164,8.14066 62.7062,8.14302 62.7047,8.14596 62.7029,8.14741 62.6881,8.14507 62.6866,8.13063 62.687,8.12529 62.6908,8.12312 62.6976,8.11952 62.6989,8.10908 62.6989,8.09613 62.7092,8.08574 62.7087,8.07021 62.7148,8.05543 62.7184,8.0052 62.7427,7.99191 62.7461,7.96904 62.7458,7.95244 62.7427,7.9449 62.7387,7.94105 62.7326,7.94185 62.7299,7.94262 62.7272,7.93607 62.728,7.92952 62.7287,7.91904 62.7338,7.90736 62.736,7.88078 62.7379,7.85454 62.7367,7.78166 62.7252,7.76524 62.7207,7.72653 62.7155,7.71491 62.7127,7.70276 62.7058,7.69396 62.7044,7.69129 62.7016,7.6719 62.7016,7.63352 62.6982,7.61446 62.6867,7.60236 62.6839,7.56927 62.6822,7.55038 62.6781,7.54046 62.6737,7.50597 62.663,7.50483 62.6559,7.52202 62.6323,7.54809 62.6131,7.5503 62.607,7.54794 62.5975,7.55146 62.5928,7.54371 62.5871,7.53872 62.5875,7.53387 62.5908,7.52588 62.5913,7.51991 62.5957,7.51925 62.6047,7.51911 62.6066,7.51237 62.6133,7.50395 62.6175,7.50195 62.6218,7.50484 62.6308,7.50296 62.6341,7.49409 62.6378,7.48499 62.6392,7.42186 62.636,7.4073 62.6333,7.40272 62.6302,7.41329 62.6209,7.42069 62.6033,7.4293 62.5911,7.43305 62.5897,7.44955 62.5834,7.46389 62.5823,7.46436 62.5727,7.49449 62.5637,7.52338 62.5621,7.55795 62.5543,7.57264 62.5556,7.60239 62.5636,7.61881 62.5629,7.63751 62.5681,7.65276 62.569,7.66002 62.5711,7.6676 62.5734,7.705 62.5798,7.72125 62.5806,7.72973 62.5845,7.74413 62.5841,7.76402 62.5789,7.78721 62.5751,7.78255 62.5725,7.77473 62.5716,7.72343 62.5699,7.69563 62.5707,7.67728 62.5666,7.67557 62.5642,7.68235 62.5612,7.70351 62.5578,7.70732 62.5547,7.67439 62.5571,7.65733 62.5505,7.63648 62.5512,7.60608 62.5445,7.59411 62.5454,7.57084 62.5414,7.56612 62.5394,7.56377 62.5341,7.56787 62.5244,7.56743 62.5154,7.57097 62.5105,7.56466 62.5009,7.55736 62.5001,7.54832 62.5056,7.53479 62.5325,7.52237 62.5413,7.52583 62.5455,7.50652 62.5457,7.49436 62.5481,7.48896 62.5478,7.48059 62.5391,7.46955 62.5363,7.46065 62.5363,7.44986 62.5397,7.43338 62.5574,7.38422 62.5749,7.38373 62.587,7.37843 62.5978,7.36229 62.6081,7.34369 62.6102,7.33119 62.6071,7.3095 62.6061,7.29134 62.6086,7.28088 62.6129,7.27996 62.6139,7.2745 62.6203,7.25694 62.6218,7.2519 62.6146,7.24719 62.6127,7.25106 62.5979,7.24739 62.5955,7.23344 62.6116,7.22242 62.6164,7.19037 62.6265,7.17373 62.6285,7.16828 62.6323,7.14832 62.6331,7.15167 62.6227,7.14936 62.6176,7.1456 62.6156,7.12986 62.6074,7.13505 62.6018,7.13417 62.5972,7.15032 62.5798,7.15367 62.5655,7.14729 62.5612,7.15261 62.5508,7.14902 62.548,7.14793 62.5336,7.1436 62.5289,7.1378 62.5278,7.13313 62.5295,7.13062 62.5335,7.13594 62.5383,7.13355 62.5414,7.13665 62.5442,7.13179 62.5473,7.13512 62.5535,7.13816 62.5591,7.12748 62.5689,7.1254 62.581,7.11572 62.583,7.1018 62.6096,7.10418 62.6179,7.09974 62.6215,7.07067 62.62,7.03799 62.6158,7.03166 62.6186,7.03664 62.6222,7.05676 62.6276,7.06511 62.6279,7.07304 62.6283,7.08521 62.6263,7.09402 62.6273,7.09944 62.6313,7.09818 62.6333,7.08903 62.6349,7.09478 62.644,7.08615 62.6529,7.03612 62.6556,7.02217 62.6522,7.01061 62.6533,6.99821 62.6568,6.98331 62.6569,6.95217 62.6521,6.92493 62.6515,6.91869 62.65,6.91782 62.6492,6.91209 62.6438,6.91245 62.6377,6.91849 62.6335,6.93994 62.6291,6.94292 62.6255,6.94176 62.6159,6.93022 62.6132,6.92803 62.6111,6.93044 62.608,6.92079 62.6024,6.93559 62.5958,6.93644 62.5896,6.92637 62.5799,6.92418 62.5815,6.92667 62.585,6.89116 62.6123,6.8884 62.6132,6.86308 62.6216,6.82481 62.6431,6.81923 62.6509,6.79896 62.6538,6.78706 62.6571,6.75722 62.6573,6.74725 62.6506,6.71105 62.6433,6.70585 62.6381,6.67257 62.6348,6.66803 62.6285,6.68055 62.6074,6.67713 62.6071,6.66961 62.6109,6.66809 62.6152,6.66455 62.6252,6.6476 62.6325,6.63623 62.6321,6.63179 62.6285,6.63284 62.618,6.62512 62.6132,6.63823 62.6017,6.63883 62.5976,6.62696 62.584,6.62855 62.5799,6.61988 62.5682,6.61852 62.5606,6.61612 62.5601,6.60928 62.5628,6.60705 62.5678,6.61392 62.5799,6.61767 62.5864,6.61113 62.5938,6.59903 62.5918,6.59345 62.596,6.5832 62.5982,6.57848 62.6166,6.58371 62.6248,6.58149 62.6263,6.57045 62.6271,6.54052 62.6248,6.53344 62.6191,6.51658 62.619,6.50536 62.6209,6.47442 62.6188,6.46937 62.6161,6.46736 62.613,6.47257 62.6078,6.47379 62.6066,6.46695 62.567,6.47876 62.5546,6.47629 62.5513,6.46687 62.5579,6.46266 62.566,6.46284 62.5907,6.46556 62.5956,6.4638 62.5974,6.45654 62.5962,6.45326 62.5982,6.45687 62.607,6.46058 62.6087,6.45757 62.6102,6.45627 62.6109,6.45134 62.6107,6.44599 62.6165,6.42979 62.6153,6.42524 62.6126,6.40909 62.6112,6.40246 62.6091,6.38609 62.609,6.3675 62.6137,6.34701 62.6146,6.33449 62.6121,6.26908 62.5866,6.26552 62.581,6.27928 62.5669,6.28151 62.5646,6.28004 62.5551,6.28354 62.5518,6.27479 62.5476,6.27378 62.5446,6.28254 62.5394,6.27812 62.5361,6.2648 62.5326,6.26596 62.5315,6.29271 62.5283,6.3021 62.5284,6.31602 62.5312,6.38528 62.5346,6.42239 62.5347,6.44101 62.5326,6.44505 62.5322,6.46355 62.5342,6.4808 62.5379,6.51384 62.5388,6.52821 62.542,6.5714 62.5445,6.57705 62.543,6.58624 62.5312,6.56104 62.5277,6.54307 62.5287,6.52975 62.5317,6.52437 62.5313,6.50197 62.5224,6.49374 62.5206,6.47847 62.5175,6.4772 62.5161,6.48525 62.5152,6.51318 62.5202,6.53431 62.5179,6.62404 62.5232,6.62425 62.5184,6.60953 62.5143,6.6075 62.5113,6.61811 62.5098,6.6181 62.5031,6.65855 62.5037,6.65905 62.5034,6.66828 62.498,6.69639 62.5019,6.7019 62.5014,6.71342 62.4969,6.72638 62.4962,6.73244 62.4918,6.72752 62.4882,6.71165 62.4852,6.70723 62.4816,6.71864 62.4744,6.74631 62.4778,6.76559 62.4777,6.78313 62.4828,6.79596 62.4829,6.81152 62.4811,6.81843 62.4777,6.8139 62.4748,6.7875 62.4694,6.77665 62.4659,6.77743 62.4638,6.79633 62.4594,6.80921 62.4625,6.82752 62.4628,6.82989 62.4629,6.84302 62.4608,6.85853 62.4628,6.87852 62.4575,6.89275 62.4474,6.91313 62.4427,6.92764 62.434,6.94355 62.4294,6.95483 62.3972,6.9687 62.3894,6.98798 62.3888,6.98431 62.3832,6.98219 62.3806,6.97741 62.3795,6.94297 62.3795,6.94126 62.3776,6.96455 62.351,6.96443 62.3409,6.96768 62.3351,6.98485 62.328,6.99302 62.3184,7.00256 62.3132,7.01417 62.3119,7.01553 62.3117,7.02403 62.3143,7.04712 62.3142,7.06303 62.3165,7.0769 62.3119,7.09499 62.3087,7.10732 62.3008,7.14852 62.3011,7.15998 62.2998,7.17343 62.2944,7.18905 62.2912,7.22245 62.291,7.2326 62.2922,7.25398 62.3017,7.26627 62.3015,7.29478 62.2973,7.33032 62.2996,7.35077 62.2969,7.36301 62.2931,7.3739 62.2843,7.42323 62.2615,7.43024 62.2562,7.42197 62.2475,7.42781 62.2397,7.42516 62.2373,7.41731 62.2414,7.41219 62.2491,7.40953 62.2531,7.39251 62.2603,7.38211 62.2691,7.3741 62.2705,7.36958 62.2754,7.33948 62.285,7.32961 62.2934,7.31305 62.2884,7.26839 62.2885,7.24937 62.2798,7.24149 62.2645,7.23537 62.2586,7.21818 62.2666,7.18286 62.2668,7.16182 62.2779,7.15592 62.2779,7.13907 62.2868,7.12943 62.2818,7.12072 62.2808,7.08245 62.2846,7.06057 62.283,7.05398 62.2847,7.04081 62.2804,7.03478 62.2704,7.03939 62.2632,7.04778 62.2499,7.04155 62.2415,7.04943 62.2301,7.04303 62.2155,7.0478 62.2017,7.04768 62.184,7.03792 62.1691,7.01965 62.1594,7.00152 62.1525,6.99721 62.1481,6.96888 62.119,6.97371 62.1157,6.99261 62.1131,7.02037 62.1024,7.03288 62.1,7.06109 62.1006,7.08558 62.1036,7.09923 62.1074,7.10653 62.1113,7.12528 62.1288,7.127 62.1304,7.13776 62.1303,7.161 62.1279,7.18216 62.1228,7.20445 62.1124,7.21158 62.1062,7.20992 62.1039,7.20318 62.1032,7.19614 62.1049,7.18352 62.1121,7.17127 62.1163,7.1533 62.1195,7.14206 62.1196,7.12319 62.1145,7.11227 62.1085,7.10251 62.0972,7.09354 62.0961,7.07997 62.0943,7.04537 62.0867,7.0254 62.0866,7.01044 62.0891,6.99471 62.0937,6.96172 62.1069,6.95072 62.1089,6.94 62.1088,6.88448 62.0902,6.88064 62.0933,6.87936 62.0956,6.88657 62.0999,6.90146 62.1051,6.91644 62.1134,6.92342 62.1195,6.93677 62.1254,6.94037 62.1349,6.97751 62.1639,7.01771 62.1813,7.01885 62.1949,7.02346 62.2044,7.00926 62.2264,7.01354 62.2458,7.01111 62.253,7.01267 62.2634,7.00556 62.2762,7.01121 62.2926,7.00898 62.2946,6.97588 62.2962,6.9702 62.2983,6.9657 62.3024,6.95787 62.3096,6.9463 62.3152,6.93919 62.3242,6.93024 62.3285,6.92503 62.3343,6.92129 62.3472,6.89954 62.3624,6.89194 62.3819,6.91808 62.4174,6.91681 62.4194,6.90411 62.4186,6.89215 62.4267,6.87189 62.4341,6.86204 62.4341,6.84824 62.4376,6.82978 62.438,6.80666 62.4386,6.79044 62.4347,6.77519 62.4345,6.75417 62.44,6.75785 62.4488,6.75582 62.4527,6.74298 62.4527,6.72978 62.4553,6.71786 62.4558,6.69912 62.4523,6.69297 62.4471,6.66903 62.4454,6.65384 62.4413,6.62059 62.4359,6.61002 62.4324,6.56464 62.4174,6.55261 62.4154,6.55092 62.4135,6.55781 62.4103,6.58049 62.4069,6.58574 62.4048,6.58384 62.3976,6.57816 62.3961,6.57562 62.3933,6.58013 62.3794,6.57593 62.3713,6.5779 62.3679,6.59084 62.3603,6.59232 62.3569,6.58808 62.349,6.59422 62.3407,6.59179 62.3372,6.58202 62.3468,6.58194 62.3573,6.57721 62.3626,6.57297 62.364,6.56739 62.3658,6.55823 62.3744,6.56335 62.3897,6.56116 62.3944,6.5303 62.3998,6.52194 62.403,6.51241 62.4041,6.50674 62.4025,6.4841 62.4022,6.47297 62.4042,6.44634 62.401,6.43807 62.3971,6.42645 62.3958,6.41678 62.3849,6.42805 62.3757,6.42692 62.3734,6.42581 62.371,6.41884 62.3651,6.40481 62.3603,6.43995 62.3397,6.44421 62.3343,6.44827 62.3141,6.45898 62.305,6.47607 62.2797,6.49315 62.2706,6.50548 62.2669,6.50609 62.2596,6.53578 62.2315,6.53648 62.2235,6.54236 62.2202,6.54046 62.2165,6.53278 62.2121,6.53595 62.2106,6.5522 62.21,6.56307 62.2126,6.57169 62.2106,6.58862 62.2121,6.61492 62.2097,6.64877 62.2025,6.65893 62.1967,6.65168 62.196,6.63783 62.2004,6.59712 62.2075,6.57772 62.2032,6.56064 62.1993,6.56222 62.1952,6.57356 62.188,6.58092 62.1779,6.60436 62.1615,6.61068 62.1551,6.6144 62.1463,6.61306 62.132,6.59876 62.1263,6.59299 62.1257,6.58037 62.1285,6.57658 62.1277,6.57048 62.1227,6.5628 62.1217,6.56095 62.1111,6.55684 62.1092,6.55133 62.1101,6.54865 62.1151,6.55074 62.1241,6.55781 62.1291,6.57321 62.134,6.58044 62.1413,6.58371 62.149,6.58009 62.1536,6.55004 62.1783,6.52188 62.19,6.5037 62.2068,6.49643 62.2096,6.48916 62.2091,6.48836 62.2093,6.48404 62.2106,6.48304 62.214,6.48643 62.2175,6.498 62.222,6.49814 62.2243,6.49102 62.2293,6.47755 62.2504,6.46867 62.2572,6.44204 62.2646,6.42367 62.2725,6.42168 62.2759,6.42686 62.2925,6.4233 62.2974,6.41394 62.3008,6.40522 62.3136,6.40315 62.3167,6.40133 62.3253,6.3928 62.3296,6.3836 62.3415,6.36484 62.3514,6.35818 62.3594,6.35799 62.3692,6.3534 62.3744,6.33869 62.3803,6.33225 62.3805,6.29089 62.3679,6.25004 62.3647,6.24316 62.3626,6.23547 62.3603,6.2153 62.348,6.20078 62.3433,6.18437 62.3414,6.1613 62.3319,6.14929 62.3301,6.12351 62.3223,6.0987 62.3086,6.07389 62.3041,6.06182 62.2968,6.03525 62.2871,6.01318 62.279,5.99433 62.2772,5.98192 62.2692,5.96522 62.2516,5.97142 62.2498,5.9871 62.2499,6.0073 62.2405,6.01478 62.231,6.01643 62.2239,6.02198 62.22,6.03623 62.2168,6.07971 62.2111,6.12087 62.2056,6.12701 62.201,6.11703 62.1931,6.09572 62.1947,6.0813 62.199,6.06958 62.1988,6.05055 62.2043,6.03425 62.2021,6.01255 62.2089,6.00104 62.2163,5.98973 62.2312,5.98042 62.2341,5.96677 62.2336,5.93729 62.2252,5.93836 62.2188,5.94509 62.2195,5.94608 62.2195,5.95183 62.2145,5.96349 62.2122,5.96489 62.2097,5.95595 62.2046,5.96863 62.1961,5.98021 62.1942,5.99026 62.1898,6.01717 62.1692,6.03102 62.1653,6.07459 62.1412,6.07825 62.1338,6.08965 62.1298,6.09297 62.1258,6.09632 62.1218,6.11003 62.1186,6.12708 62.1098,6.13623 62.1076,6.14223 62.1037,6.14214 62.0982,6.14691 62.0959,6.16271 62.0978,6.17462 62.0966,6.18117 62.1014,6.20412 62.0983,6.21247 62.0949,6.23003 62.0919,6.25567 62.0902,6.25601 62.085,6.26395 62.0841,6.28144 62.0877,6.30056 62.0846,6.31048 62.0829,6.32336 62.0754,6.31579 62.0707,6.31805 62.0656,6.31097 62.061,6.30115 62.0645,6.2998 62.0732,6.2789 62.0821,6.27086 62.0743,6.2606 62.0744,6.23219 62.0844,6.22883 62.084,6.22578 62.0787,6.21149 62.0795,6.18503 62.0864,6.16624 62.0819,6.11743 62.082,6.11545 62.0814,6.09644 62.076,6.09133 62.0714,6.08863 62.061,6.08262 62.059,6.0764 62.0613,6.07454 62.0667,6.07865 62.0744,6.07641 62.0792,6.0894 62.0833,6.09515 62.0869,6.09632 62.0918,6.09043 62.101,6.06994 62.1099,6.05033 62.1133,6.03781 62.1211,6.02435 62.1347,6.01375 62.1455,5.99359 62.1491,5.97098 62.1439,5.96651 62.1385,5.97422 62.1186,5.97051 62.1086,5.94894 62.0915,5.93901 62.0809,5.93142 62.0767,5.92793 62.0713,5.92174 62.0617,5.90689 62.0485,5.88688 62.04,5.86203 62.0198,5.8592 62.0135,5.85608 62.0118,5.8502 62.012,5.84704 62.0163,5.87948 62.0491,5.90553 62.0682,5.91109 62.0757,5.92051 62.0806,5.9277 62.0931,5.9457 62.1109,5.95204 62.1256,5.94987 62.13,5.94535 62.1393,5.95083 62.1533,5.94952 62.164,5.94617 62.1723,5.92934 62.188,5.91348 62.2007,5.90076 62.2035,5.88334 62.2051,5.87653 62.2019,5.86911 62.2023,5.85714 62.2064,5.81986 62.2009,5.81492 62.2011,5.80952 62.2012,5.79477 62.1865,5.77098 62.1833,5.7448 62.1846,5.74159 62.1833,5.74003 62.1782,5.73179 62.1749,5.71343 62.1735,5.67854 62.177,5.67655 62.1717,5.68415 62.1591,5.68414 62.1536,5.69403 62.1419,5.69521 62.124,5.70999 62.1172,5.72338 62.1111,5.73255 62.1089,5.7482 62.0976,5.73682 62.0928,5.73088 62.0933,5.68525 62.1168,5.67854 62.1243,5.6773 62.1314,5.68156 62.1405,5.67728 62.1481,5.66433 62.1549,5.64891 62.1729,5.64393 62.1734,5.62468 62.1688,5.60956 62.1684,5.58752 62.1703,5.57029 62.1717,5.55585 62.1785,5.53979 62.1806,5.51732 62.1964,5.4958 62.2016,5.48765 62.2006,5.48216 62.1957,5.46509 62.1953,5.44492 62.1771,5.43826 62.1601,5.42989 62.1577,5.42196 62.1484,5.40735 62.1313,5.42777 62.1161,5.43617 62.1049,5.45159 62.1035,5.46406 62.0994,5.48058 62.1026,5.4983 62.1019,5.50779 62.1034,5.53804 62.1037,5.56308 62.0976,5.57595 62.0885,5.58796 62.0841,5.60983 62.082,5.61799 62.0773,5.62175 62.0698,5.61751 62.0635,5.6209 62.0554,5.61416 62.0549,5.61012 62.0584,5.60341 62.0742,5.59743 62.0776,5.59282 62.0788,5.58002 62.0739,5.56955 62.0751,5.56004 62.0819,5.54917 62.0826,5.54385 62.0796,5.52609 62.0804,5.52465 62.0805,5.52063 62.0757,5.52938 62.057,5.52763 62.0478,5.52183 62.0448,5.52312 62.043,5.51466 62.0413,5.51202 62.0343,5.49732 62.0294,5.49366 62.0254,5.4939 62.016,5.48916 62.0126,5.46347 62.0065,5.45742 62.0076,5.46119 62.011,5.47706 62.0148,5.48039 62.018,5.48163 62.0272,5.4918 62.0356,5.49157 62.0422,5.48194 62.0469,5.4763 62.0538,5.47983 62.0585,5.47756 62.0603,5.46936 62.0597,5.4645 62.0623,5.46083 62.0619,5.45446 62.0612,5.45016 62.0633,5.44628 62.0712,5.4367 62.0729,5.42975 62.0788,5.41274 62.0783,5.39865 62.0885,5.37004 62.0979,5.35767 62.1066,5.33031 62.1169,5.31942 62.1254,5.31673 62.132,5.32203 62.1402,5.31809 62.1456,5.31054 62.1501,5.30872 62.1512,5.3108 62.1531,5.32654 62.1553,5.33428 62.1584,5.33519 62.1692,5.33015 62.1674,5.32273 62.1678,5.31554 62.1695,5.30524 62.1696,5.29739 62.1722,5.29411 62.1689,5.30074 62.1623,5.29587 62.1596,5.28848 62.165,5.28781 62.1737,5.28358 62.1754,5.25814 62.1777,5.23273 62.1927,5.22991 62.2075,5.22857 62.2081,5.22673 62.2088,5.21735 62.2091,5.20749 62.2119,5.19179 62.2119,5.18197 62.2145,5.18289 62.2072,5.17399 62.2025,5.18371 62.1978,5.20365 62.1961,5.20179 62.1931,5.18764 62.1927,5.17009 62.1947,5.15417 62.1934,5.14467 62.1994,5.12517 62.2013,5.11686 62.1962,5.0975 62.1924,5.09516 62.1868,5.10025 62.1808,5.10248 62.1797,5.11219 62.1749,5.11378 62.1717,5.1091 62.1681,5.09223 62.1667,5.10111 62.1613,5.10399 62.1541,5.12112 62.1516,5.12435 62.1476,5.13688 62.1461,5.14593 62.1398,5.14968 62.1306,5.15766 62.1272,5.1532 62.1224,5.13648 62.1229,5.1236 62.1262,5.11637 62.1257,5.11385 62.1235,5.11638 62.1106,5.114 62.1027,5.11665 62.1014,5.11832 62.1006,5.13957 62.0994,5.17069 62.1002,5.1847 62.0985,5.21534 62.1019,5.23637 62.1018,5.24623 62.0988,5.26772 62.0834,5.30403 62.0773,5.31964 62.0722,5.33417 62.065,5.34226 62.0584,5.34511 62.0561,5.3505 62.0455,5.34628 62.0394,5.34807 62.0376,5.35764 62.0359,5.38153 62.036,5.40087 62.0343,5.40548 62.0331,5.40905 62.0295,5.41692 62.0292,5.4305 62.0189,5.42206 62.0145,5.41355 62.0157,5.39363 62.0259,5.38204 62.028,5.35928 62.0245,5.35639 62.0322,5.35165 62.0341,5.34742 62.0332,5.34704 62.0309,5.34581 62.0235,5.33526 62.0096,5.33168 62,5.31697 61.9928,5.31438 61.9858,5.31647 61.9824,5.31395 61.9803,5.30965 61.9798,5.2988 61.9883,5.28391 61.9873,5.27243 61.9836,5.26965 61.9803,5.28108 61.9738,5.28496 61.9687,5.29162 61.9669,5.29098 61.9626,5.29821 61.9603,5.29974 61.9574,5.28895 61.9501,5.28309 61.9524,5.28002 61.9536,5.24814 61.9833,5.2333 61.982,5.22218 61.979,5.20537 61.9803,5.20167 61.9767,5.2006 61.9696,5.2048 61.9629,5.20281 61.9554,5.21539 61.9507,5.2236 61.9382,5.22004 61.9364,5.19659 61.9538,5.19513 61.9549,5.19344 61.9892,5.16735 61.9881,5.16299 61.9804,5.1568 61.9797,5.15364 61.9708,5.15807 61.9655,5.15069 61.9583,5.14638 61.9427,5.13362 61.9383,5.13783 61.9291,5.12718 61.9314,5.12337 61.9258,5.1192 61.9198,5.13288 61.9169,5.14453 61.9195,5.17626 61.9188,5.18138 61.9174,5.17884 61.9129,5.15785 61.9109,5.15045 61.9115,5.14703 61.909,5.16283 61.9001,5.17847 61.8996,5.19139 61.9006,5.22227 61.917,5.22959 61.9169,5.23986 61.9113,5.25922 61.9103,5.27079 61.9096,5.29118 61.9148,5.29955 61.9143,5.31516 61.9087,5.34499 61.9155,5.35585 61.9145,5.37482 61.9249,5.38497 61.9279,5.41097 61.9344,5.43179 61.9376,5.4535 61.9384,5.44955 61.9335,5.45439 61.9309,5.45381 61.9261,5.4879 61.9283,5.49946 61.9316,5.50687 61.9309,5.51505 61.926,5.54126 61.9261,5.55185 61.9213,5.58726 61.9215,5.59469 61.9234,5.60503 61.9227,5.62019 61.9194,5.63369 61.9144,5.64446 61.9139,5.6558 61.9157,5.67204 61.9132,5.68822 61.9108,5.70209 61.912,5.71386 61.9113,5.74747 61.9162,5.7699 61.9157,5.78491 61.9188,5.79218 61.9188,5.81041 61.9145,5.83939 61.9153,5.85079 61.9139,5.86397 61.9135,5.88329 61.917,5.93411 61.9179,5.97711 61.9104,5.98302 61.9069,5.97154 61.9001,5.95959 61.8989,5.89616 61.9039,5.88081 61.9029,5.85309 61.8975,5.84853 61.8979,5.82009 61.9004,5.74162 61.8968,5.73623 61.8943,5.73751 61.8925,5.76999 61.8813,5.7694 61.8763,5.77224 61.8738,5.79358 61.871,5.8044 61.8673,5.80992 61.8576,5.83848 61.8658,5.84413 61.8674,5.85509 61.8742,5.87068 61.8766,5.88159 61.8752,5.90415 61.8795,5.91117 61.8839,5.91889 61.8812,5.96474 61.8737,5.97616 61.875,5.9938 61.8738,6.02264 61.8753,6.03821 61.875,6.05908 61.8718,6.07376 61.868,6.07815 61.8656,6.08758 61.8605,6.12176 61.8528,6.13508 61.8482,6.16516 61.8479,6.18042 61.8493,6.20046 61.8574,6.21143 61.8584,6.22427 61.8538,6.22858 61.8572,6.22523 61.8601,6.22573 61.863,6.23051 61.8634,6.25476 61.8602,6.29265 61.8626,6.30068 61.8624,6.31843 61.8619,6.3424 61.8572,6.37606 61.8416,6.40239 61.8352,6.4386 61.8293,6.45404 61.8295,6.46674 61.832,6.49425 61.8325,6.50463 61.831,6.51027 61.8321,6.519 61.8386,6.5225 61.8465,6.5259 61.8541,6.53818 61.8628,6.53976 61.8686,6.56392 61.8822,6.61726 61.8852,6.63082 61.8887,6.64636 61.8885,6.66167 61.8864,6.67908 61.8867,6.68277 61.888,6.69369 61.9032,6.7018 61.9076,6.70756 61.9046,6.69997 61.9,6.70429 61.8935,6.70416 61.8841,6.70992 61.8811,6.73542 61.8789,6.74813 61.8816,6.75401 61.8811,6.75783 61.8745,6.76416 61.8743,6.77644 61.8696,6.81345 61.8751,6.82702 61.8751,6.83945 61.8727,6.83866 61.8679,6.82941 61.8683,6.82029 61.8712,6.81614 61.8697,6.8045 61.8558,6.80272 61.8407,6.79848 61.8398,6.79306 61.844,6.78323 61.8591,6.77559 61.8618,6.75024 61.8665,6.73246 61.8655,6.71003 61.8693,6.68881 61.8729,6.6536 61.8717,6.63978 61.8736,6.57887 61.8694,6.57314 61.8655,6.57364 61.8621,6.58126 61.8596,6.5965 61.858,6.60433 61.8541,6.59678 61.8461,6.55084 61.8277,6.54512 61.8254,6.53092 61.8167,6.50731 61.8063,6.49593 61.8048,6.44615 61.808,6.43082 61.8102,6.36324 61.8254,6.35457 61.8283,6.3338 61.8406,6.32828 61.8413,6.27849 61.8477,6.25901 61.8484,6.24186 61.8466,6.22857 61.8418,6.21348 61.8392,6.19591 61.834,6.18543 61.833,6.17018 61.8345,6.15385 61.8337,6.13037 61.8292,6.11856 61.8304,6.10879 61.834,6.08675 61.8444,6.07682 61.8491,6.07825 61.8372,6.10359 61.8241,6.11631 61.8143,6.14602 61.8039,6.15848 61.7924,6.17643 61.7859,6.21125 61.7796,6.2167 61.7756,6.2114 61.7725,6.20364 61.7727,6.1972 61.7706,6.19424 61.768,6.18901 61.7644,6.18122 61.7648,6.12688 61.7784,6.11794 61.7829,6.11345 61.7929,6.10311 61.7971,6.09997 61.8016,6.07394 61.813,6.07661 61.8175,6.07432 61.8197,6.06536 61.8212,6.05541 61.8259,6.04108 61.8396,6.03863 61.8457,6.03215 61.8468,6.00735 61.8415,6.00217 61.8377,5.99261 61.8173,5.98569 61.8025,5.98097 61.7989,5.98582 61.7928,5.97612 61.7842,5.97865 61.7777,5.97497 61.7707,5.95593 61.7514,5.92671 61.7354,5.91915 61.7257,5.91556 61.7096,5.91961 61.7027,5.92563 61.6925,5.92416 61.6897,5.91028 61.7036,5.90781 61.7127,5.91213 61.7273,5.91925 61.7368,5.91811 61.7436,5.92281 61.7502,5.94212 61.7619,5.94743 61.7736,5.96528 61.7884,5.97183 61.8067,5.98085 61.8319,5.98768 61.8404,5.98204 61.8482,5.96714 61.8504,5.96035 61.8533,5.9468 61.8533,5.92699 61.8588,5.89972 61.8596,5.88413 61.8572,5.86038 61.8572,5.82164 61.8457,5.80434 61.842,5.78567 61.8464,5.77359 61.8434,5.77241 61.8433,5.70717 61.8381,5.69197 61.8336,5.68435 61.8329,5.67712 61.8243,5.66694 61.8189,5.66557 61.8129,5.64009 61.8174,5.65556 61.8258,5.66691 61.8274,5.67128 61.8301,5.66547 61.8328,5.66648 61.8354,5.67269 61.8386,5.69961 61.8454,5.72672 61.8455,5.739 61.8474,5.74965 61.853,5.77484 61.8531,5.77605 61.8545,5.77048 61.8559,5.74778 61.8582,5.73628 61.8631,5.7196 61.881,5.66662 61.8886,5.64895 61.8911,5.61216 61.8989,5.59167 61.8994,5.55308 61.8926,5.54039 61.8931,5.53364 61.8955,5.5416 61.9053,5.53987 61.9068,5.47373 61.9074,5.45383 61.9153,5.44756 61.9163,5.43682 61.918,5.42661 61.9181,5.39746 61.9128,5.38254 61.9094,5.36909 61.9034,5.35782 61.9013,5.35247 61.8935,5.33808 61.8899,5.33381 61.8868,5.33357 61.8829,5.30616 61.8737,5.30005 61.8675,5.29944 61.8604,5.30629 61.8574,5.31916 61.8586,5.33042 61.8554,5.34065 61.8552,5.34744 61.8539,5.38039 61.8474,5.37106 61.8454,5.35211 61.8483,5.33046 61.8474,5.29938 61.8399,5.29306 61.8349,5.2982 61.8332,5.31572 61.8328,5.31991 61.8312,5.3122 61.8283,5.28095 61.8245,5.24881 61.8176,5.23719 61.8176,5.21957 61.8109,5.2028 61.81,5.19599 61.8127,5.19547 61.8129,5.16834 61.8104,5.1321 61.7973,5.11154 61.7859,5.09929 61.7767,5.09926 61.7668,5.09495 61.7641,5.10001 61.7629,5.10838 61.7647,5.11597 61.7629,5.1253 61.7647,5.13206 61.7572,5.1372 61.7581,5.14051 61.7635,5.15644 61.7713,5.17314 61.7725,5.17415 61.7723,5.19246 61.7701,5.20302 61.773,5.26934 61.7779,5.29243 61.7708,5.29389 61.7678,5.27037 61.7646,5.25525 61.7679,5.24914 61.7644,5.22323 61.7633,5.2162 61.7596,5.20238 61.7586,5.19109 61.7595,5.1862 61.7572,5.17548 61.7577,5.16794 61.7617,5.15416 61.7554,5.15346 61.7489,5.14979 61.7453,5.1565 61.738,5.18129 61.7372,5.19479 61.7348,5.21425 61.729,5.21759 61.7266,5.21328 61.7239,5.18519 61.7243,5.17647 61.7219,5.17255 61.7171,5.17075 61.7038,5.16591 61.6987,5.15865 61.6989,5.1546 61.7024,5.16314 61.7133,5.16284 61.7174,5.14852 61.7342,5.13724 61.7351,5.12382 61.7421,5.11894 61.7424,5.11633 61.7409,5.11851 61.7346,5.11664 61.7242,5.12192 61.7118,5.10703 61.7063,5.10437 61.7101,5.10788 61.7272,5.10936 61.7344,5.10657 61.7414,5.09383 61.7523,5.08615 61.7545,5.0671 61.7555,5.05484 61.7589,5.04542 61.7601,5.03352 61.7591,5.01634 61.7481,5.00476 61.7455,5 61.7428,4.98955 61.7368,4.98734 61.7332,5 61.7266,5.00725 61.7229,5.00691 61.7196,5.00165 61.7194,5 61.72,4.9845 61.7255,4.9791 61.726,4.97773 61.7252,4.97563 61.724,4.97148 61.7254,4.96874 61.7246,4.96974 61.7171,4.98077 61.7052,4.96893 61.6819,4.97031 61.6749,4.9768 61.6639,4.98896 61.656,5 61.6515,5.00833 61.6481,5 61.6451,4.99662 61.6439,4.99854 61.6415,4.99397 61.6353,4.9858 61.6352,4.98408 61.6316,4.98896 61.6289,4.99296 61.6281,5 61.6293,5.00276 61.6297,5.00439 61.6291,5.00642 61.6283,5.01027 61.6307,5.00127 61.6349,5.00408 61.6378,5.02138 61.633,5.03966 61.6332,5.0497 61.6311,5.08321 61.6371,5.09901 61.6376,5.11222 61.634,5.15356 61.6294,5.16953 61.6289,5.20237 61.6335,5.22929 61.6337,5.22972 61.6314,5.21755 61.627,5.22445 61.6262,5.25064 61.6277,5.25833 61.6304,5.26682 61.6261,5.28776 61.6275,5.30591 61.636,5.33186 61.6336,5.33591 61.6352,5.33046 61.6386,5.33208 61.6403,5.36996 61.6412,5.37445 61.6377,5.38035 61.637,5.38839 61.6431,5.39421 61.6429,5.39805 61.6403,5.40572 61.6431,5.40824 61.6425,5.40742 61.6391,5.40473 61.6379,5.39579 61.6342,5.38467 61.6345,5.37408 61.6292,5.36712 61.6278,5.35867 61.6293,5.31851 61.6303,5.30039 61.6268,5.29385 61.6231,5.28443 61.622,5.27869 61.6193,5.2707 61.6183,5.26658 61.6197,5.25141 61.6158,5.24352 61.6169,5.21552 61.6148,5.20467 61.6162,5.19421 61.6155,5.18661 61.6099,5.17125 61.6097,5.1688 61.6089,5.1604 61.606,5.13688 61.6057,5.12907 61.6088,5.12252 61.6078,5.10764 61.6102,5.08512 61.6097,5.07856 61.6112,5.07101 61.6104,5.06633 61.6072,5.07042 61.6035,5.0614 61.6029,5.05438 61.5968,5.04714 61.597,5.04145 61.599,5.0486 61.6019,5.03723 61.606,5.02518 61.6011,5.00726 61.6017,5 61.6001,4.99942 61.6,4.99591 61.5883,4.99866 61.5841,5 61.5839,5.00313 61.5834,5.00224 61.578,5.0207 61.5795,5.02931 61.5847,5.03846 61.5847,5.04859 61.5895,5.09256 61.5935,5.10713 61.5978,5.13983 61.5978,5.15671 61.6026,5.16977 61.6023,5.21034 61.6091,5.23627 61.6105,5.2432 61.6109,5.29327 61.6107,5.3032 61.6091,5.3388 61.6117,5.40573 61.6034,5.41436 61.5983,5.42297 61.5959,5.41917 61.593,5.42647 61.5898,5.4542 61.588,5.45287 61.5847,5.44384 61.5788,5.44437 61.5759,5.45305 61.573,5.45085 61.5692,5.4403 61.5718,5.41608 61.5729,5.38448 61.5775,5.36559 61.5784,5.36192 61.5748,5.36563 61.5729,5.35912 61.5717,5.33711 61.579,5.33483 61.581,5.34015 61.586,5.36394 61.5847,5.3839 61.5913,5.39782 61.5914,5.39952 61.5926,5.39325 61.5953,5.38133 61.5972,5.36011 61.6004,5.26279 61.6064,5.24131 61.6055,5.23783 61.6036,5.2366 61.5973,5.21253 61.6,5.20147 61.5974,5.1806 61.5959,5.17518 61.594,5.18554 61.5901,5.18601 61.5851,5.19077 61.5827,5.19839 61.5819,5.20256 61.5814,5.22966 61.583,5.26358 61.5764,5.26092 61.5726,5.27837 61.5692,5.28969 61.5704,5.29625 61.5661,5.31137 61.5649,5.32222 61.5607,5.33586 61.5597,5.35333 61.5613,5.354 61.5577,5.36018 61.5554,5.39151 61.5521,5.401 61.5475,5.39159 61.5464,5.39007 61.547,5.38184 61.5499,5.3682 61.5509,5.35156 61.5553,5.34329 61.5559,5.3395 61.553,5.32153 61.5463,5.30555 61.547,5.27708 61.5529,5.27249 61.5518,5.27374 61.5502,5.29265 61.5467,5.29343 61.5398,5.28962 61.5396,5.2789 61.5431,5.26339 61.5413,5.24555 61.5417,5.23318 61.5437,5.21367 61.553,5.17625 61.5553,5.17455 61.549,5.17897 61.546,5.17779 61.542,5.18125 61.5364,5.1777 61.5349,5.16948 61.5403,5.16727 61.5393,5.169 61.5352,5.16579 61.5344,5.15956 61.5369,5.15792 61.5354,5.16207 61.5313,5.17894 61.5258,5.1779 61.5237,5.16838 61.5233,5.16634 61.5213,5.1704 61.5151,5.17914 61.512,5.19384 61.5104,5.21867 61.511,5.22139 61.5092,5.21732 61.5054,5.21913 61.5034,5.22631 61.5035,5.24376 61.4973,5.25284 61.4975,5.26524 61.4953,5.29343 61.4958,5.32331 61.4897,5.35061 61.4871,5.366 61.4868,5.39952 61.4896,5.44239 61.4884,5.46268 61.4901,5.47139 61.4923,5.4737 61.4901,5.45964 61.4804,5.42928 61.4734,5.42261 61.4759,5.41413 61.4751,5.37373 61.4812,5.33276 61.48,5.33076 61.4778,5.33309 61.4764,5.33941 61.4724,5.35016 61.4713,5.37525 61.465,5.37362 61.4608,5.358 61.4624,5.35362 61.4602,5.33286 61.4611,5.26882 61.4734,5.26841 61.4782,5.25822 61.4814,5.24426 61.4817,5.23613 61.4791,5.23288 61.476,5.23965 61.4731,5.24825 61.4732,5.25291 61.4713,5.24107 61.4672,5.23942 61.4666,5.23722 61.4553,5.22585 61.452,5.21865 61.4547,5.18743 61.4552,5.15112 61.4523,5.13553 61.4537,5.11999 61.4523,5.10453 61.453,5.09206 61.4507,5.08243 61.4509,5.05913 61.4426,5.01671 61.433,5.00363 61.43,5 61.4277,4.99301 61.4231,4.98448 61.4202,4.98036 61.4168,4.98141 61.4139,4.99231 61.407,5 61.4044,5.01022 61.4009,5.01652 61.4005,5.03421 61.408,5.04805 61.4081,5.05752 61.4136,5.07851 61.4214,5.14049 61.425,5.15184 61.4282,5.15592 61.4276,5.15775 61.4273,5.14441 61.4219,5.13657 61.423,5.12096 61.4145,5.10948 61.4119,5.10548 61.4079,5.1055 61.3851,5.11073 61.3626,5.10682 61.3531,5.11014 61.3431,5.10864 61.341,5.09689 61.34,5.0919 61.3412,5.07413 61.3392,5.07233 61.3333,5.07208 61.3325,5.07907 61.3234,5.08384 61.3208,5.09601 61.3221,5.11286 61.3288,5.14903 61.3317,5.15988 61.3349,5.17338 61.3341,5.18243 61.3444,5.18326 61.3527,5.19149 61.3572,5.20336 61.3549,5.22964 61.3599,5.249 61.3585,5.27002 61.361,5.28371 61.3618,5.30825 61.3685,5.36554 61.3712,5.39317 61.3742,5.403 61.3805,5.41617 61.3843,5.4285 61.3848,5.46746 61.3779,5.48334 61.3799,5.50484 61.3771,5.52412 61.3788,5.57886 61.3689,5.58194 61.3704,5.62045 61.374,5.63307 61.3729,5.62175 61.3692,5.61033 61.3686,5.59667 61.368,5.58969 61.3642,5.5774 61.3635,5.57089 61.3598,5.56737 61.3663,5.55868 61.3669,5.54243 61.3724,5.50593 61.371,5.49747 61.3729,5.47626 61.3714,5.44195 61.3764,5.43286 61.3765,5.42379 61.3738,5.40504 61.3719,5.40322 61.3661,5.38666 61.3626,5.3803 61.3635,5.37632 61.3618,5.37616 61.3574,5.36626 61.3515,5.35646 61.3529,5.32154 61.3507,5.30896 61.3569,5.29234 61.3564,5.29562 61.349,5.30317 61.3442,5.334 61.3347,5.3399 61.3286,5.35816 61.3199,5.34835 61.3188,5.33056 61.3275,5.3272 61.3329,5.31467 61.331,5.30533 61.3377,5.29484 61.3402,5.29125 61.3442,5.28064 61.3474,5.24023 61.3492,5.23054 61.3448,5.21784 61.3438,5.2005 61.3447,5.19924 61.3362,5.20168 61.3333,5.20822 61.3315,5.21471 61.3325,5.21746 61.3305,5.21314 61.3205,5.20591 61.3183,5.20629 61.3163,5.21441 61.3136,5.22163 61.3132,5.22665 61.3093,5.22169 61.3052,5.21026 61.3052,5.20626 61.3036,5.18314 61.3049,5.17321 61.302,5.16187 61.304,5.1611 61.3106,5.15294 61.316,5.14572 61.3189,5.13664 61.319,5.13527 61.3162,5.13888 61.3122,5.13235 61.3064,5.13346 61.303,5.13566 61.3015,5.14833 61.3025,5.15211 61.3002,5.14751 61.2967,5.14038 61.2992,5.13467 61.2916,5.13179 61.2917,5.1259 61.2976,5.11353 61.2976,5.10408 61.2946,5.09673 61.2982,5.07962 61.3004,5.06371 61.3064,5.05572 61.3058,5.05366 61.3041,5.06102 61.3006,5.04775 61.2977,5.03861 61.2931,5.04879 61.2922,5.07151 61.2955,5.07327 61.2937,5.05014 61.2877,5 61.2855,4.98637 61.2849,4.98208 61.2776,4.97955 61.2733,4.98468 61.2689,4.98369 61.2593,4.99004 61.2609,4.99659 61.2541,5 61.2541,5.00565 61.254,5.00937 61.257,5.01246 61.2681,5.01665 61.271,5.02506 61.2719,5.031 61.2682,5.0202 61.265,5.03318 61.2569,5.01629 61.2531,5.01317 61.2495,5.01881 61.245,5.02735 61.2426,5.07883 61.2432,5.08431 61.2433,5.09216 61.2445,5.10287 61.2558,5.10832 61.2546,5.11043 61.2511,5.10335 61.2432,5.10362 61.2368,5.10045 61.2334,5.09543 61.2323,5.09127 61.2342,5.0944 61.2377,5.08972 61.2398,5.07968 61.2401,5.07626 61.2381,5.03007 61.2383,5.02006 61.231,5.01286 61.2289,5.01004 61.2262,5.01383 61.2239,5.04821 61.2206,5.05566 61.2207,5.06339 61.2208,5.08563 61.2213,5.10603 61.224,5.15451 61.2266,5.18075 61.2261,5.21092 61.2224,5.22298 61.2137,5.26357 61.2049,5.28645 61.1967,5.29426 61.1949,5.31319 61.1907,5.31608 61.1878,5.31316 61.1856,5.29753 61.1854,5.26332 61.1959,5.2548 61.1958,5.25162 61.1924,5.25738 61.1869,5.26965 61.1822,5.28411 61.1809,5.2933 61.1774,5.29396 61.1738,5.25035 61.1735,5.24146 61.1755,5.22432 61.186,5.21063 61.1907,5.19488 61.1937,5.17746 61.2005,5.15382 61.205,5.13218 61.2063,5.10866 61.2051,5.09924 61.2021,5.09265 61.1968,5.0924 61.1881,5.08579 61.1844,5.08081 61.1816,5.07641 61.1747,5.07805 61.1711,5.08575 61.168,5.10707 61.1657,5.13873 61.1589,5.16007 61.1513,5.17191 61.1488,5.18196 61.1483,5.18581 61.1506,5.1842 61.1542,5.18869 61.158,5.20256 61.1625,5.21429 61.1633,5.22856 61.1579,5.2481 61.1549,5.26709 61.1477,5.29596 61.1369,5.29167 61.1344,5.28048 61.136,5.27008 61.1333,5.24993 61.1398,5.23786 61.1487,5.22901 61.1504,5.21331 61.1481,5.20014 61.15,5.20204 61.1373,5.20592 61.1342,5.23018 61.1261,5.23218 61.123,5.21972 61.116,5.22146 61.1117,5.22856 61.109,5.2332 61.1072,5.25676 61.1052,5.26106 61.1102,5.27352 61.1171,5.27281 61.121,5.27654 61.1239,5.2811 61.1223,5.28222 61.1136,5.28562 61.1105,5.29147 61.1097,5.30124 61.1158,5.31761 61.117,5.32869 61.1211,5.33477 61.1294,5.34366 61.1353,5.349 61.1346,5.35127 61.1298,5.34548 61.12,5.35235 61.1054,5.35395 61.102,5.35687 61.0989,5.38613 61.0888,5.39268 61.0813,5.39111 61.0769,5.39678 61.0716,5.40458 61.0703,5.44161 61.0749,5.45579 61.0803,5.48656 61.0962,5.50526 61.103,5.52121 61.1011,5.53142 61.1022,5.53974 61.1059,5.54547 61.1085,5.55401 61.1084,5.55933 61.1132,5.57691 61.1183,5.6079 61.1362,5.61785 61.15,5.62272 61.152,5.6337 61.1405,5.64225 61.1404,5.66697 61.1482,5.67842 61.1478,5.70625 61.1402,5.71578 61.1398,5.72168 61.1435,5.7265 61.1465,5.73483 61.1477,5.72919 61.153,5.73451 61.158,5.72832 61.1637,5.73136 61.1682,5.75806 61.1702,5.77774 61.1659,5.81221 61.1668,5.81541 61.1703,5.81411 61.1838,5.80148 61.1941,5.80576 61.1998,5.8296 61.2105,5.8326 61.2068,5.82167 61.1926,5.82137 61.1887,5.82733 61.1813,5.82187 61.1742,5.83462 61.166,5.84223 61.1659,5.84943 61.1682,5.86255 61.1691,5.86933 61.1683,5.87795 61.1619,5.88415 61.1617,5.91026 61.1673,5.95445 61.1667,5.97412 61.1711,5.98478 61.1753,5.99597 61.1797,6.01126 61.1878,6.05813 61.1973,6.06419 61.204,6.06492 61.2143,6.06946 61.2186,6.07454 61.2195,6.0794 61.2158,6.07677 61.1964,6.06908 61.1881,6.05395 61.1818,6.02893 61.1782,6.0173 61.1738,6.01342 61.1684,6.01709 61.1633,6.02329 61.1601,6.04308 61.1578,6.05069 61.1517,6.06025 61.1481,6.07648 61.1503,6.08648 61.15,6.1053 61.1569,6.12599 61.1579,6.14099 61.1559,6.15455 61.16,6.17007 61.1608,6.18244 61.1636,6.19647 61.1801,6.20664 61.1848,6.22125 61.1886,6.2229 61.187,6.20488 61.1717,6.20587 61.1683,6.2142 61.1665,6.21723 61.1623,6.23408 61.1557,6.25251 61.1484,6.26369 61.1403,6.27891 61.1367,6.29698 61.1362,6.31573 61.1311,6.32909 61.1305,6.34232 61.1243,6.35261 61.1219,6.35777 61.1159,6.36177 61.1144,6.38413 61.1104,6.41415 61.1185,6.43664 61.1135,6.45134 61.1141,6.47567 61.1151,6.47998 61.118,6.47572 61.1245,6.48064 61.1297,6.48701 61.1315,6.52213 61.1341,6.54246 61.1375,6.5455 61.1394,6.54476 61.1577,6.54943 61.1615,6.54575 61.1674,6.54665 61.1743,6.53643 61.1794,6.538 61.185,6.53067 61.1964,6.5329 61.1999,6.53725 61.2067,6.53527 61.2106,6.52669 61.2142,6.50204 61.2173,6.49257 61.2204,6.4879 61.2264,6.54277 61.2145,6.55192 61.2169,6.55893 61.2143,6.56611 61.2139,6.56868 61.2158,6.5687 61.219,6.55092 61.2338,6.55689 61.2418,6.5557 61.2468,6.54364 61.2613,6.53488 61.266,6.52121 61.2686,6.504 61.2758,6.5037 61.2778,6.51134 61.2776,6.52636 61.2724,6.53872 61.2723,6.54873 61.2754,6.55267 61.2877,6.55188 61.2998,6.5574 61.3011,6.56474 61.2732,6.56999 61.2631,6.56888 61.2575,6.57245 61.2558,6.58009 61.2556,6.59349 61.2615,6.61132 61.2665,6.6274 61.2771,6.64205 61.2844,6.65347 61.2878,6.669 61.3137,6.67506 61.3238,6.68952 61.3327,6.69978 61.3445,6.71929 61.355,6.72422 61.3606,6.732 61.3801,6.74087 61.3884,6.74347 61.3972,6.7417 61.3996,6.74421 61.4091,6.74867 61.4113,6.75631 61.4113,6.75801 61.4059,6.74926 61.3898,6.74893 61.3715,6.74165 61.3586,6.74354 61.3553,6.73955 61.3496,6.72918 61.342,6.72248 61.3388,6.7155 61.3376,6.69895 61.3197,6.68402 61.3073,6.67853 61.2963,6.67807 61.2954,6.6768 61.2842,6.64195 61.2649,6.5983 61.2448,6.59291 61.2423,6.58178 61.2304,6.58795 61.2238,6.59558 61.2201,6.59319 61.2136,6.59506 61.2105,6.60593 61.2074,6.61789 61.2067,6.6282 61.2109,6.63825 61.2103,6.65497 61.206,6.68904 61.2032,6.69672 61.1991,6.70897 61.186,6.71885 61.1831,6.74395 61.1832,6.76477 61.1834,6.80189 61.1857,6.80872 61.1878,6.84217 61.1893,6.84481 61.1802,6.84827 61.1791,6.85368 61.1811,6.86526 61.176,6.87446 61.1781,6.88204 61.1781,6.89373 61.1721,6.90281 61.1643,6.93952 61.1625,6.94682 61.1645,6.98712 61.1605,6.98936 61.1651,6.99576 61.1669,7.00115 61.1764,7.00101 61.1813,7.00407 61.1832,7.01457 61.1826,7.0172 61.1879,7.01832 61.1902,7.03108 61.198,7.05206 61.2006,7.05469 61.2023,7.05284 61.2057,7.06206 61.2115,7.07962 61.2113,7.08554 61.2133,7.0901 61.2185,7.1053 61.2258,7.10603 61.2313,7.1116 61.236,7.11206 61.2436,7.1199 61.253,7.13398 61.2543,7.14264 61.261,7.15556 61.2602,7.16181 61.2634,7.16563 61.2632,7.16686 61.261,7.16033 61.2562,7.13239 61.2481,7.1275 61.2379,7.11746 61.2309,7.12036 61.2267,7.11259 61.2168,7.11485 61.2139,7.12025 61.2125,7.144 61.2122,7.15339 61.2091,7.16395 61.208,7.16788 61.2031,7.1283 61.2013,7.11617 61.2034,7.10079 61.2014,7.07709 61.2014,7.0638 61.1941,7.04391 61.194,7.03945 61.1918,7.02365 61.1746,7.00681 61.1656,6.99485 61.1553,6.99361 61.1542,6.97811 61.1533,6.9726 61.1557,6.96546 61.1559,6.93059 61.1475,6.9262 61.1449,6.92527 61.1412,6.9437 61.1268,6.94062 61.1215,6.94732 61.1137,6.95938 61.1154,6.99235 61.1091,6.99738 61.1104,7.00336 61.1227,7.01266 61.1275,7.0271 61.1309,7.03057 61.1317,7.04887 61.1403,7.06445 61.1405,7.07773 61.1366,7.08631 61.1398,7.10813 61.1393,7.13335 61.1457,7.1525 61.1477,7.17489 61.1465,7.17584 61.158,7.18883 61.1716,7.19788 61.1712,7.2296 61.1739,7.24098 61.1749,7.24351 61.1775,7.24076 61.1845,7.25128 61.1837,7.25537 61.1813,7.25453 61.1764,7.26072 61.1723,7.29768 61.1641,7.31294 61.1632,7.32464 61.1603,7.33579 61.1661,7.34556 61.1675,7.38003 61.1803,7.38618 61.1844,7.38476 61.1885,7.37121 61.1909,7.35774 61.1967,7.34038 61.2152,7.33136 61.2392,7.33343 61.2537,7.32964 61.2616,7.31827 61.2693,7.28641 61.2776,7.27538 61.2824,7.25285 61.3038,7.25174 61.3048,7.2827 61.3162,7.2846 61.3202,7.30586 61.3292,7.31806 61.3307,7.34039 61.343,7.33989 61.3631,7.33692 61.3681,7.30578 61.3814,7.28654 61.3908,7.28322 61.3946,7.28744 61.399,7.30202 61.3928,7.31572 61.39,7.33533 61.3893,7.33823 61.3851,7.35276 61.3791,7.35743 61.3799,7.3692 61.3891,7.36884 61.3962,7.37821 61.3976,7.39647 61.4045,7.42843 61.4086,7.43516 61.4122,7.44488 61.4312,7.45228 61.4373,7.46129 61.4419,7.52687 61.4615,7.54942 61.4733,7.56208 61.4839,7.5707 61.488,7.58588 61.4891,7.58604 61.4834,7.58083 61.4787,7.58029 61.475,7.56067 61.4667,7.55318 61.4569,7.54179 61.452,7.54011 61.4518,7.51459 61.4477,7.48953 61.4331,7.47704 61.4213,7.47984 61.4136,7.47323 61.4088,7.45888 61.4009,7.45239 61.3993,7.4409 61.3997,7.409 61.3831,7.39478 61.3662,7.38674 61.3606,7.38422 61.3588,7.3838 61.3542,7.38967 61.3489,7.38892 61.3432,7.3923 61.3387,7.38781 61.3324,7.34614 61.3106,7.32477 61.3064,7.31442 61.3015,7.31202 61.2978,7.31786 61.2927,7.33333 61.2865,7.34489 61.2852,7.35097 61.2819,7.35974 61.2721,7.35801 61.2707,7.37074 61.2715,7.37382 61.2493,7.38072 61.231,7.37912 61.2204,7.3827 61.2141,7.39532 61.2076,7.41233 61.2039,7.43034 61.2028,7.43666 61.2025,7.46404 61.2034,7.51523 61.2116,7.5433 61.2108,7.61299 61.2148,7.62336 61.2197,7.63761 61.2411,7.64657 61.2459,7.65237 61.2449,7.67525 61.2352,7.68102 61.2344,7.69208 61.2374,7.70084 61.2353,7.70497 61.2322,7.70066 61.2282,7.6794 61.2231,7.67034 61.2236,7.65576 61.2269,7.64645 61.2253,7.64274 61.2202,7.64419 61.2156,7.63314 61.2039,7.61637 61.1971,7.60406 61.197,7.59055 61.1992,7.5645 61.1992,7.54896 61.1983,7.54021 61.196,7.51458 61.1965,7.5062 61.1951,7.47327 61.1808,7.44712 61.1776,7.43938 61.1748,7.43307 61.1639,7.42401 61.1605,7.39386 61.1558,7.37428 61.1527,7.37035 61.1499,7.37293 61.1481,7.39617 61.1476,7.4045 61.1451,7.4134 61.1336,7.41476 61.1179,7.42599 61.1147,7.45758 61.1153,7.46501 61.1123,7.47085 61.1067,7.46844 61.103,7.45075 61.109,7.4367 61.1079,7.42668 61.1047,7.4154 61.1041,7.39393 61.11,7.37885 61.1258,7.37196 61.1281,7.34627 61.1295,7.33508 61.1242,7.32427 61.1236,7.30161 61.1313,7.26916 61.1453,7.25921 61.1495,7.2462 61.1515,7.24012 61.1508,7.23635 61.1468,7.23497 61.1349,7.22591 61.1278,7.21105 61.1216,7.19717 61.1192,7.15245 61.1177,7.14007 61.1146,7.08084 61.1083,7.06449 61.1142,7.06314 61.1141,7.05886 61.1138,7.04662 61.1098,7.03549 61.1081,7.03216 61.1045,7.03204 61.0981,7.02391 61.0915,7.03355 61.0826,7.04346 61.0604,7.03698 61.052,7.03515 61.0441,7.03805 61.0362,7.04794 61.0289,7.0481 61.0239,7.05491 61.0223,7.06117 61.0138,7.06301 61.0052,7.0658 60.9921,7.08117 60.9747,7.10582 60.9658,7.12345 60.9565,7.13859 60.9558,7.14397 60.9541,7.15838 60.9554,7.16652 60.9543,7.17499 60.9504,7.18397 60.9424,7.18752 60.9288,7.18651 60.9217,7.17945 60.9138,7.17576 60.9097,7.15966 60.8993,7.15146 60.8973,7.15333 60.8898,7.13623 60.8762,7.1344 60.872,7.12732 60.8686,7.12165 60.8689,7.11807 60.8713,7.13385 60.8878,7.13534 60.8947,7.14187 60.9027,7.15702 60.9169,7.1502 60.9266,7.14975 60.9378,7.14415 60.9413,7.09632 60.9552,7.08488 60.9602,7.05426 60.9829,7.04421 60.9878,7.01682 60.9701,7.00328 60.9652,7.00152 60.9646,6.98231 60.9603,6.96221 60.9593,6.94907 60.9517,6.93339 60.9458,6.92085 60.9374,6.90121 60.9365,6.87912 60.9258,6.87536 60.9151,6.88152 60.9112,6.88121 60.9064,6.85866 60.8887,6.84629 60.8828,6.85166 60.8919,6.867 60.9073,6.86698 60.9181,6.86805 60.9206,6.87342 60.9334,6.87821 60.9363,6.91796 60.9451,6.92589 60.9492,6.93328 60.9575,6.94429 60.9596,6.96206 60.9677,6.98784 60.9722,7.00873 60.9781,7.02072 60.9837,7.0349 61.0018,7.03421 61.0047,7.03084 61.0188,7.02407 61.0239,7.0234 61.0291,7.00957 61.0413,7.00585 61.0483,7.00885 61.0654,7.00135 61.0722,6.98498 61.0784,6.97389 61.0874,6.96653 61.0895,6.95683 61.0878,6.95321 61.0903,6.94644 61.0914,6.94111 61.0816,6.92644 61.0782,6.92183 61.0774,6.913 61.0799,6.90847 61.0851,6.90799 61.0857,6.88286 61.0899,6.8777 61.0932,6.8714 61.1015,6.87883 61.1132,6.87116 61.1317,6.86016 61.1433,6.85411 61.1461,6.83653 61.1501,6.81177 61.1512,6.80236 61.1472,6.78578 61.1474,6.76429 61.1522,6.75524 61.1526,6.69116 61.1572,6.67044 61.1632,6.6388 61.1794,6.63352 61.1799,6.6326 61.173,6.62633 61.167,6.62211 61.1566,6.6218 61.1488,6.61082 61.1427,6.60901 61.1388,6.61097 61.1349,6.6019 61.1262,6.59765 61.1221,6.58583 61.0954,6.57957 61.0929,6.57511 61.0943,6.57052 61.1033,6.56441 61.1063,6.55625 61.1072,6.53894 61.106,6.52179 61.0973,6.4962 61.0844,6.48602 61.0829,6.45515 61.0839,6.43681 61.0769,6.43208 61.0737,6.42203 61.0456,6.39969 61.0242,6.41947 61.0116,6.41327 61.0089,6.4063 61.0082,6.39933 61.0107,6.38103 61.0133,6.3741 61.0124,6.36784 61.0069,6.36201 61.0048,6.35513 61.0099,6.36233 61.0154,6.38462 61.0178,6.39091 61.0198,6.39141 61.0292,6.41841 61.0606,6.41448 61.0713,6.40951 61.0729,6.40437 61.0725,6.39692 61.0718,6.37251 61.074,6.35458 61.0738,6.34589 61.0719,6.31708 61.053,6.30942 61.0443,6.29679 61.0404,6.27288 61.0393,6.26928 61.0412,6.27356 61.0441,6.29509 61.0454,6.30618 61.0501,6.30949 61.0658,6.31644 61.0697,6.32343 61.0736,6.32825 61.0793,6.32313 61.0851,6.31093 61.0876,6.30507 61.092,6.30586 61.0962,6.30299 61.0995,6.2963 61.1,6.27652 61.1057,6.23133 61.1043,6.22265 61.1054,6.18935 61.1189,6.16424 61.1221,6.15682 61.1211,6.14145 61.1135,6.13426 61.1201,6.12623 61.12,6.10515 61.1126,6.08934 61.1109,6.07989 61.1108,6.06806 61.1168,6.05905 61.1169,6.05207 61.1102,6.04476 61.1086,6.03922 61.1107,6.03194 61.1177,5.98573 61.1314,5.95666 61.1296,5.93525 61.1331,5.90177 61.1294,5.88384 61.1174,5.86883 61.1166,5.8628 61.113,5.86641 61.1083,5.88694 61.0985,5.88564 61.098,5.88027 61.096,5.87365 61.096,5.85998 61.1014,5.85242 61.1013,5.84907 61.0987,5.84841 61.0826,5.84048 61.0791,5.82026 61.0756,5.81457 61.0728,5.81332 61.0519,5.80639 61.0509,5.80188 61.0553,5.80392 61.0715,5.82407 61.084,5.82728 61.0903,5.82625 61.1136,5.82937 61.1176,5.82572 61.1226,5.81506 61.124,5.80454 61.1275,5.78396 61.1203,5.77883 61.1198,5.77548 61.1172,5.78358 61.114,5.78251 61.1119,5.75765 61.1078,5.73624 61.1,5.72026 61.0994,5.70795 61.0966,5.69964 61.0926,5.69698 61.0944,5.69855 61.099,5.68371 61.0973,5.67478 61.0997,5.67784 61.1039,5.67546 61.1068,5.66566 61.106,5.64752 61.1014,5.63746 61.0938,5.62669 61.0904,5.62673 61.0874,5.63264 61.0833,5.66211 61.0714,5.68029 61.068,5.68554 61.0671,5.68874 61.0622,5.67719 61.0605,5.66401 61.063,5.63596 61.0722,5.62763 61.0794,5.61784 61.0814,5.61279 61.086,5.60766 61.0855,5.60109 61.0825,5.58325 61.0708,5.56972 61.067,5.55658 61.0665,5.53103 61.0666,5.52067 61.0637,5.51099 61.0568,5.49564 61.0528,5.49108 61.0491,5.49043 61.0447,5.50061 61.0325,5.49856 61.0173,5.49209 61.0138,5.49343 61.0008,5.48496 60.9927,5.48065 60.9957,5.48263 61.0059,5.47959 61.0124,5.46979 61.0198,5.47648 61.0274,5.46829 61.031,5.45969 61.0315,5.44572 61.0278,5.42617 61.0288,5.41712 61.0266,5.40583 61.0263,5.3893 61.0316,5.3661 61.0345,5.35093 61.0348,5.33915 61.032,5.33336 61.0327,5.32805 61.0359,5.33397 61.0424,5.3305 61.0459,5.32548 61.0475,5.31359 61.0479,5.30754 61.05,5.30547 61.0536,5.31131 61.0605,5.30869 61.0645,5.28231 61.0691,5.26537 61.0686,5.25018 61.0663,5.23884 61.0688,5.21612 61.0791,5.20769 61.0792,5.19667 61.0794,5.18991 61.0725,5.18407 61.0708,5.16833 61.0791,5.16428 61.0856,5.1601 61.0877,5.15596 61.0871,5.15297 61.0828,5.15399 61.0773,5.14542 61.0726,5.09507 61.0736,5.08454 61.0692,5.05375 61.0644,5.04694 61.0544,5.04935 61.0502,5.02935 61.0333,5.03916 61.0314,5.04954 61.0294,5.05133 61.0274,5.03804 61.0277,5.03715 61.0249,5.04241 61.0196,5.03884 61.016,5.02986 61.0136,5.02845 61.0036,5.0362 61,5.03585 60.9895,5.04639 60.9812,5.05128 60.9803,5.06957 60.9809,5.08077 60.9791,5.08506 60.9813,5.08663 60.9855,5.09297 60.9844,5.09681 60.974,5.10417 60.9725,5.1114 60.9667,5.12993 60.9694,5.14032 60.9709,5.15563 60.9748,5.16878 60.9802,5.17029 60.9949,5.1757 61.0014,5.18103 61.0032,5.18739 60.9918,5.18496 60.9896,5.17934 60.9894,5.17836 60.987,5.18487 60.9825,5.18409 60.974,5.18591 60.9717,5.19374 60.9703,5.19913 60.9666,5.21686 60.9676,5.22436 60.9704,5.26138 60.9768,5.27664 60.9837,5.29572 60.9955,5.3075 60.9911,5.27815 60.978,5.25443 60.971,5.24603 60.9654,5.19593 60.9635,5.18603 60.966,5.17962 60.9701,5.1467 60.9671,5.13594 60.9641,5.13415 60.961,5.13959 60.9571,5.13313 60.9538,5.13237 60.9478,5.13895 60.9378,5.13042 60.9255,5.13339 60.9121,5.12486 60.9048,5.12728 60.9019,5.12439 60.8972,5.13127 60.8881,5.13034 60.8805,5.12461 60.8784,5.1185 60.8783,5.11935 60.8965,5.11425 60.9036,5.12192 60.9205,5.11746 60.9267,5.12171 60.9318,5.11742 60.9345,5.12566 60.9384,5.12574 60.953,5.12217 60.957,5.10609 60.9572,5.09019 60.9616,5.0771 60.9585,5.06613 60.9591,5.05031 60.9605,5.04055 60.9636,5.03627 60.9649,5.01709 60.9666,5.01022 60.9606,5.01372 60.957,5.00901 60.9545,5.0083 60.9508,5.02219 60.9299,5.03965 60.9297,5.0431 60.9264,5.04964 60.9267,5.05117 60.9236,5.04094 60.9229,5.0292 60.9153,5.03838 60.9115,5.03473 60.8985,5.04702 60.8883,5.05284 60.8874,5.05521 60.8807,5.05886 60.8704,5.06827 60.8679,5.07014 60.8654,5.06108 60.8611,5.06156 60.8561,5.0689 60.8546,5.07488 60.8477,5.0698 60.8447,5.07125 60.842,5.08269 60.8412,5.08502 60.8387,5.08333 60.8352,5.08681 60.8342,5.09802 60.8446,5.10077 60.8424,5.09705 60.8372,5.1024 60.8313,5.10752 60.8315,5.10895 60.8364,5.11467 60.8359,5.11781 60.8317,5.12878 60.8308,5.1378 60.8379,5.14449 60.8398,5.14749 60.8362,5.15054 60.8375,5.15504 60.8437,5.16965 60.8434,5.17745 60.8444,5.18262 60.8469,5.18876 60.8468,5.19942 60.8399,5.20703 60.8496,5.20795 60.865,5.21355 60.8653,5.23613 60.8626,5.24359 60.8604,5.24345 60.8585,5.224 60.8595,5.21807 60.8611,5.21319 60.857,5.21488 60.8376,5.21877 60.8343,5.21168 60.8294,5.21265 60.8267,5.21726 60.8246,5.22489 60.829,5.23374 60.8269,5.26575 60.829,5.28282 60.8203,5.28486 60.8142,5.29226 60.8122,5.30534 60.8125,5.31141 60.8153,5.31305 60.829,5.31534 60.8299,5.32308 60.8312,5.33132 60.8325,5.34579 60.8434,5.34189 60.8494,5.3458 60.8512,5.34328 60.8548,5.34899 60.8596,5.34253 60.8642,5.34336 60.8674,5.35331 60.8722,5.36287 60.874,5.36956 60.8786,5.38297 60.8799,5.39605 60.8777,5.4202 60.8794,5.42913 60.882,5.46564 60.8856,5.48507 60.8977,5.48981 60.9006,5.52037 60.9115,5.52341 60.9103,5.52265 60.9066,5.49109 60.8933,5.48826 60.8826,5.49827 60.8792,5.51239 60.8791,5.51644 60.8774,5.50498 60.873,5.51471 60.8711,5.5329 60.8746,5.54582 60.8733,5.55605 60.874,5.56759 60.8779,5.57514 60.8777,5.58891 60.8741,5.58468 60.8714,5.55847 60.8681,5.5438 60.8714,5.53824 60.8709,5.5247 60.8623,5.52461 60.8548,5.51637 60.8535,5.51129 60.8611,5.51726 60.8646,5.50995 60.8661,5.50264 60.8649,5.49273 60.8732,5.47217 60.8779,5.46386 60.877,5.44922 60.8721,5.42999 60.8692,5.42021 60.866,5.4108 60.8661,5.39573 60.8689,5.38305 60.8689,5.37677 60.8672,5.36914 60.8625,5.3683 60.8515,5.35418 60.8438,5.35329 60.8382,5.35475 60.8369,5.36386 60.829,5.37903 60.8255,5.38442 60.8216,5.38281 60.8149,5.36362 60.8198,5.33847 60.8188,5.33762 60.8173,5.33415 60.8115,5.33696 60.8063,5.33376 60.8032,5.32569 60.8038,5.31865 60.8012,5.3049 60.802,5.28185 60.7842,5.28143 60.7762,5.27273 60.7673,5.27361 60.765,5.28372 60.7583,5.29317 60.7553,5.31574 60.7496,5.32279 60.7495,5.33598 60.7516,5.349 60.7653,5.35369 60.7652,5.3545 60.7648,5.35735 60.7631,5.34867 60.754,5.35475 60.741,5.37247 60.7387,5.38378 60.7488,5.3915 60.7423,5.38154 60.7324,5.38788 60.7284,5.39497 60.728,5.3998 60.7351,5.40368 60.7343,5.40547 60.7321,5.40141 60.7259,5.40488 60.7222,5.40165 60.7193,5.40708 60.7177,5.40971 60.7134,5.41852 60.7085,5.42877 60.7087,5.43382 60.7119,5.44093 60.7123,5.45328 60.713,5.43018 60.706,5.42703 60.7027,5.42852 60.6995,5.44621 60.692,5.44966 60.683,5.45733 60.6792,5.47189 60.6761,5.47484 60.6726,5.46754 60.6716,5.46647 60.6697,5.47423 60.6627,5.47019 60.6591,5.46117 60.6626,5.45305 60.6716,5.44237 60.674,5.43558 60.678,5.417 60.6929,5.41272 60.6964,5.40338 60.6937,5.39677 60.6993,5.39317 60.6985,5.38829 60.6944,5.38785 60.6863,5.39366 60.6799,5.40858 60.6748,5.41658 60.6692,5.42227 60.6607,5.43509 60.6569,5.46429 60.6421,5.46691 60.635,5.44833 60.6372,5.42286 60.6513,5.38575 60.6718,5.37699 60.6712,5.37029 60.6773,5.36446 60.6759,5.36927 60.6647,5.38106 60.6535,5.3999 60.6446,5.39219 60.6434,5.37673 60.6489,5.36988 60.656,5.35811 60.6591,5.3596 60.6732,5.35616 60.6779,5.3469 60.6906,5.33872 60.6971,5.34033 60.6986,5.34818 60.6991,5.35515 60.7072,5.3341 60.7203,5.32995 60.7252,5.31572 60.7315,5.30618 60.7325,5.2986 60.7356,5.28477 60.7292,5.2797 60.7288,5.27861 60.74,5.27528 60.7428,5.25558 60.7482,5.249 60.7484,5.24825 60.7396,5.19237 60.7558,5.1803 60.7628,5.15846 60.772,5.13902 60.7757,5.12828 60.7805,5.12228 60.775,5.11187 60.7805,5.10731 60.7798,5.10752 60.7761,5.12718 60.7586,5.12004 60.7592,5.1181 60.7546,5.1154 60.754,5.11214 60.7564,5.11182 60.7573,5.10893 60.7661,5.10135 60.774,5.08511 60.7832,5.05922 60.8061,5.03868 60.813,5.0286 60.8142,5.0149 60.8122,5 60.8149,4.99253 60.8162,4.98024 60.8118,4.97769 60.8055,4.96997 60.809,4.95176 60.811,4.94954 60.8079,4.95117 60.8056,4.95209 60.8043,4.97772 60.7905,4.98279 60.791,4.98906 60.7975,5 60.7928,5.00745 60.7896,5 60.7891,4.99726 60.7889,4.99579 60.7868,5 60.7841,5.0155 60.7743,5.02401 60.7715,5.03106 60.7714,5.03885 60.7673,5.0441 60.7669,5.04527 60.7706,5.03628 60.781,5.04546 60.7796,5.05033 60.7761,5.05575 60.7697,5.05454 60.7662,5.06266 60.7604,5.06961 60.7508,5.08753 60.7426,5.11233 60.7277,5.11672 60.7318,5.12174 60.7299,5.13631 60.7322,5.1469 60.7306,5.15163 60.7354,5.15889 60.7341,5.16478 60.7243,5.17834 60.7175,5.18836 60.7062,5.18911 60.7021,5.1771 60.709,5.16693 60.7108,5.15821 60.7175,5.14669 60.7216,5.1361 60.7232,5.13323 60.721,5.14621 60.7143,5.14609 60.7117,5.14153 60.7112,5.1328 60.7157,5.1255 60.7172,5.12213 60.7153,5.11234 60.7176,5.1093 60.7163,5.11074 60.7136,5.12711 60.7111,5.12825 60.7075,5.13791 60.7033,5.15113 60.7001,5.1619 60.6975,5.17649 60.6919,5.22099 60.6684,5.24531 60.6605,5.24977 60.6566,5.24526 60.6557,5.24118 60.6576,5.23078 60.6583,5.23079 60.6479,5.23976 60.6371,5.25682 60.6279,5.26766 60.6247,5.27039 60.6226,5.2671 60.6201,5.26032 60.6209,5.24901 60.6221,5.23794 60.6317,5.23045 60.6344,5.22393 60.6343,5.22053 60.6376,5.21321 60.6394,5.2102 60.6482,5.19229 60.6619,5.16407 60.668,5.13424 60.6777,5.12779 60.6772,5.13003 60.6701,5.11928 60.6701,5.12042 60.6665,5.11613 60.6619,5.12165 60.6574,5.12309 60.6514,5.11838 60.6524,5.10033 60.6722,5.09394 60.6722,5.09594 60.6643,5.11573 60.6478,5.1203 60.6417,5.11883 60.6398,5.0644 60.6812,5.067 60.6848,5.05848 60.6936,5.04904 60.7033,5.03974 60.7104,5.02195 60.7179,5 60.7243,4.9838 60.729,4.97573 60.7296,4.97228 60.7281,4.96481 60.7279,4.96423 60.7261,4.9763 60.7168,4.97369 60.7157,4.96718 60.718,4.95621 60.7264,4.93633 60.7324,4.93132 60.7365,4.92015 60.7411,4.89921 60.7452,4.89875 60.7448,4.89636 60.743,4.91096 60.7328,4.90987 60.7312,4.90573 60.7308,4.88678 60.7368,4.88436 60.7323),(10.0115 64,10.0418 64,10.0556 63.9976,10.0609 63.9938,10.0574 63.9913,10.0448 63.9944,10.0193 63.9972,10.0115 64)),((4.89788 60.8347,4.89897 60.8315,4.91519 60.8254,4.91757 60.8301,4.91556 60.8332,4.90948 60.8354,4.90272 60.834,4.89788 60.8347)),((4.89804 60.5131,4.90093 60.5077,4.90876 60.5081,4.91774 60.4952,4.92758 60.4899,4.93234 60.4991,4.92531 60.5043,4.92754 60.5097,4.92102 60.5121,4.91894 60.5157,4.89804 60.5131)),((4.90008 60.923,4.92946 60.905,4.93483 60.8978,4.93707 60.8948,4.94878 60.8878,4.95413 60.8868,4.96193 60.8879,4.96463 60.891,4.95927 60.8944,4.94623 60.8961,4.94515 60.8993,4.95567 60.9009,4.95743 60.904,4.95398 60.9146,4.94306 60.9298,4.93408 60.9323,4.93193 60.9361,4.91343 60.9392,4.90613 60.938,4.90264 60.9341,4.90534 60.9299,4.90008 60.923)),((4.90144 60.9646,4.90619 60.9595,4.90291 60.9546,4.90963 60.954,4.91718 60.9564,4.9145 60.9629,4.90654 60.9651,4.90144 60.9646)),((4.90303 61.3041,4.9095 61.2954,4.91592 61.2992,4.918 61.3032,4.91501 61.3062,4.9043 61.3074,4.90303 61.3041)),((4.90631 60.6669,4.90642 60.664,4.91469 60.6549,4.92326 60.6516,4.93986 60.6503,4.93727 60.6468,4.95144 60.6435,4.96115 60.6391,4.961 60.635,4.96914 60.6315,4.98477 60.6278,4.99334 60.6319,4.96411 60.6432,4.93851 60.6574,4.91293 60.6666,4.90631 60.6669)),((4.90857 61.3902,4.90901 61.3879,4.92196 61.3853,4.92794 61.3865,4.93513 61.3937,4.9281 61.3955,4.92432 61.3928,4.92521 61.3882,4.90857 61.3902)),((4.91095 60.4528,4.91198 60.4426,4.92493 60.4331,4.92578 60.4432,4.91982 60.4526,4.9168 60.4538,4.91095 60.4528)),((4.91802 61.5272,4.92775 61.5217,4.93352 61.5119,4.96447 61.5008,4.97154 61.5039,4.98642 61.5039,4.99084 61.5107,4.98748 61.5182,4.98358 61.5185,4.98083 61.5153,4.97693 61.5156,4.97249 61.5138,4.96841 61.515,4.9511 61.525,4.93604 61.5308,4.93268 61.5357,4.92521 61.5395,4.9202 61.5381,4.92334 61.5344,4.91802 61.5272)),((4.91958 61.7753,4.92217 61.7719,4.93419 61.7747,4.94691 61.779,4.94506 61.781,4.94962 61.7848,4.9472 61.7873,4.93992 61.7874,4.93138 61.784,4.91958 61.7753)),((4.92454 61.0086,4.93112 61.0038,4.92911 61,4.92595 60.994,4.93982 60.9735,4.94519 60.9726,4.95197 60.9765,4.96062 60.9733,4.96704 60.9742,4.97135 60.9788,4.97916 60.975,5 60.9771,5.00832 60.9779,5.01974 60.975,5.03365 60.9738,5.03789 60.9788,5.02172 60.9918,5.00299 60.9935,5 60.9948,4.99578 60.9967,5 60.9998,5.00709 60.9992,5.01634 60.9953,5.01908 61,5.0199 61.0014,5.01392 61.0055,5.01015 61.0129,5 61.0149,4.99199 61.0165,4.98744 61.0156,4.98226 61.0105,4.98111 61.0017,4.97782 61,4.97254 60.9972,4.97154 60.9926,4.95991 60.9941,4.95934 60.9971,4.96251 61,4.96616 61.0034,4.96637 61.009,4.96646 61.0116,4.96368 61.0138,4.95112 61.0128,4.93958 61.0139,4.92668 61.0121,4.92454 61.0086)),((4.9261 60.3341,4.94715 60.3353,4.97137 60.3468,4.97405 60.3522,4.97031 60.3573,4.9631 60.3563,4.95552 60.3591,4.95315 60.3599,4.94924 60.3588,4.93209 60.3562,4.92977 60.3538,4.94318 60.3441,4.92813 60.3429,4.9261 60.3341)),((4.92815 60.4722,4.93266 60.4681,4.93184 60.4651,4.93912 60.4585,4.9548 60.4542,4.9572 60.4587,4.96428 60.4581,4.96311 60.4667,4.96759 60.475,4.96472 60.4778,4.9686 60.4819,4.96287 60.4876,4.95994 60.4958,4.9373 60.4975,4.93567 60.4889,4.94406 60.4815,4.93563 60.4818,4.92815 60.4722)),((4.93427 60.9631,4.93981 60.9613,4.94611 60.9531,4.95138 60.9526,4.97372 60.9566,4.97881 60.9596,4.97445 60.9626,4.96331 60.9642,4.95219 60.9681,4.94023 60.9689,4.93553 60.9664,4.93427 60.9631)),((4.93949 60.3758,4.93985 60.3715,4.95061 60.366,4.94776 60.3689,4.95038 60.3697,4.94869 60.3737,4.9442 60.3779,4.93949 60.3758)),((4.9443 60.5757,4.94508 60.5716,4.95508 60.5631,4.95992 60.5621,4.96135 60.5693,4.9657 60.5734,4.97693 60.5781,4.97512 60.5803,4.96333 60.5834,4.95483 60.5791,4.9479 60.5788,4.9443 60.5757)),((4.94607 60.6104,4.95534 60.601,4.96106 60.6003,4.97152 60.5944,4.98655 60.5888,4.99818 60.5914,4.99933 60.5878,4.99586 60.584,5 60.5819,5.00099 60.5815,5.00752 60.581,5.01327 60.5806,5.01836 60.5783,5.02236 60.5744,5.01245 60.5751,5.00296 60.5735,5.00995 60.5685,5 60.5646,5.01464 60.5609,5.02104 60.5566,5.02809 60.5588,5.03793 60.5684,5.04368 60.5675,5.04621 60.564,5.03163 60.5548,5.03269 60.5517,5.04235 60.5498,5.05576 60.5428,5.07406 60.537,5.08368 60.5354,5.08988 60.5395,5.0963 60.5401,5.10229 60.5378,5.11834 60.5316,5.15287 60.5286,5.16696 60.5228,5.18432 60.5194,5.19718 60.5126,5.20795 60.5122,5.2307 60.5047,5.23373 60.5085,5.24491 60.5057,5.25162 60.5175,5.24879 60.5229,5.25255 60.5304,5.24866 60.5339,5.22513 60.5508,5.21869 60.5606,5.19221 60.5705,5.14248 60.5951,5.13453 60.5927,5.10943 60.5974,5.09666 60.5933,5.08854 60.5944,5.07815 60.6001,5.07109 60.6005,5.06735 60.6032,5.06136 60.6076,5.04818 60.6132,5.0401 60.614,5.00963 60.6073,5.00473 60.6037,5 60.6037,4.99678 60.6038,4.97146 60.6143,4.95366 60.6147,4.94648 60.6132,4.94607 60.6104)),((4.94675 61.273,4.95076 61.2695,4.95945 61.2664,4.97233 61.2663,4.97284 61.276,4.96934 61.2793,4.96453 61.2795,4.95 61.2759,4.94675 61.273)),((4.9472 60.2836,4.95375 60.2807,4.95635 60.2767,4.95175 60.2742,4.95781 60.269,4.9568 60.2645,4.96452 60.2603,4.95908 60.2573,4.97313 60.2513,4.98702 60.2535,4.99027 60.2509,4.98851 60.2456,4.98269 60.2446,4.98675 60.2377,4.98205 60.2308,4.99168 60.2237,4.99816 60.2235,5 60.2222,5.00317 60.2189,5.00219 60.2143,5.01175 60.2149,5.01787 60.2216,5.02286 60.2221,5.0223 60.2152,5.03067 60.2098,5.04107 60.2059,5.04788 60.2065,5.05235 60.2097,5.05711 60.2188,5.05792 60.2269,5.05245 60.2391,5.05876 60.2423,5.05652 60.2569,5.0544 60.2584,5.04853 60.2577,5.04239 60.2535,5.03036 60.2537,5.01823 60.2615,5.01777 60.2618,5.00641 60.2733,5.00814 60.2763,5.01614 60.2755,5.0254 60.2705,5.0316 60.2719,5.03295 60.2795,5.03953 60.2764,5.04225 60.2717,5.04126 60.2696,5.03477 60.2697,5.02841 60.2667,5.0365 60.2604,5.04215 60.2623,5.0469 60.2616,5.04955 60.2647,5.05609 60.2659,5.06193 60.2715,5.06479 60.2683,5.06175 60.2611,5.06547 60.256,5.06508 60.2431,5.06152 60.2349,5.06401 60.231,5.08548 60.1974,5.10128 60.179,5.11112 60.1806,5.11527 60.1831,5.11228 60.1869,5.11668 60.188,5.13042 60.1833,5.1364 60.1834,5.15616 60.1886,5.16343 60.1892,5.16145 60.2026,5.16294 60.2045,5.17295 60.2027,5.17291 60.2054,5.16365 60.2082,5.16337 60.2088,5.16096 60.213,5.16137 60.2157,5.16678 60.219,5.16662 60.2224,5.15216 60.2309,5.1527 60.2355,5.12267 60.2661,5.11593 60.2677,5.11052 60.267,5.10145 60.2709,5.09936 60.2689,5.10288 60.2656,5.10161 60.2634,5.08795 60.2793,5.07761 60.2852,5.07948 60.2876,5.08956 60.2855,5.09364 60.2885,5.09648 60.2851,5.09776 60.2836,5.09677 60.279,5.10044 60.2766,5.11501 60.2727,5.1193 60.277,5.13149 60.2759,5.13541 60.2773,5.14153 60.2918,5.13653 60.2989,5.14108 60.317,5.13578 60.3257,5.11889 60.3422,5.0857 60.3591,5.0825 60.3617,5.0791 60.3645,5.06112 60.3793,5.0616 60.3867,5.0547 60.3914,5.05119 60.3904,5.04949 60.3845,5.04153 60.38,5.0381 60.381,5.04384 60.39,5.0434 60.3974,5.0505 60.3991,5.03682 60.4053,5.01728 60.4106,5.01003 60.4147,5.00318 60.4141,5.00325 60.4187,5.0112 60.4283,5.01834 60.4297,5.01611 60.4342,5.00728 60.4368,5.00616 60.4378,5.00223 60.4414,5 60.4415,4.9952 60.4418,4.98816 60.4546,4.98122 60.4519,4.98083 60.4466,4.97627 60.4462,4.97576 60.4391,4.96434 60.4307,4.96191 60.424,4.97395 60.4068,4.97353 60.3992,4.97828 60.3937,4.99103 60.3924,4.99338 60.3898,4.99056 60.3851,4.97684 60.389,4.96587 60.3858,4.97415 60.3781,4.98215 60.3707,4.98417 60.3673,4.98148 60.3602,4.98046 60.3575,4.98589 60.3458,4.99326 60.3411,4.99742 60.3312,5 60.3296,5.00838 60.3246,5.01361 60.3188,5.01171 60.3142,5.01989 60.3099,5.02458 60.3046,5.037 60.3024,5.04195 60.3057,5.04946 60.3,5.06027 60.3115,5.0669 60.3107,5.06803 60.3071,5.05506 60.2922,5.06442 60.2791,5.05564 60.2792,5.04827 60.294,5.01519 60.2955,5.00694 60.2878,5 60.2875,4.99269 60.2873,4.97947 60.2913,4.97345 60.3003,4.97305 60.3009,4.95626 60.3017,4.95035 60.3012,4.94936 60.2991,4.96229 60.2967,4.96363 60.2945,4.95706 60.2926,4.95438 60.2872,4.9472 60.2836)),((4.95087 61.2592,4.95591 61.2553,4.95262 61.2526,4.95517 61.2493,4.95343 61.246,4.96772 61.2459,4.97606 61.2495,4.98697 61.2472,4.99091 61.249,4.98281 61.2565,4.97222 61.262,4.95566 61.2614,4.95087 61.2592)),((4.95173 60.794,4.96409 60.7833,4.98282 60.7761,4.99656 60.7654,5 60.7639,5.00782 60.7604,5.01277 60.7591,5.01466 60.7614,5.02945 60.76,5.03931 60.7575,5.04048 60.7587,5.03215 60.7631,5.01336 60.7708,5 60.778,4.99455 60.781,4.95515 60.7957,4.95173 60.794)),((4.95199 60.6578,4.96345 60.6491,4.97551 60.6446,4.97736 60.6472,4.95843 60.6583,4.95199 60.6578)),((4.95244 60.3293,4.95872 60.3255,4.96949 60.3223,4.97351 60.3181,4.97705 60.319,4.98286 60.325,4.97849 60.331,4.96722 60.3344,4.958 60.3342,4.95244 60.3293)),((4.95415 60.4502,4.96245 60.4408,4.96631 60.4474,4.96041 60.454,4.9548 60.4542,4.95415 60.4502)),((4.95485 61.6407,4.96136 61.6345,4.97053 61.632,4.97491 61.6342,4.96984 61.6404,4.96224 61.6399,4.96105 61.6435,4.95591 61.6451,4.95485 61.6407)),((4.95771 60.9295,4.95857 60.9201,4.96152 60.917,4.96854 60.9148,4.96309 60.9088,4.97017 60.9014,4.96643 60.8964,4.97562 60.8901,4.97645 60.8858,4.96711 60.878,4.96711 60.8707,4.972 60.8672,4.97059 60.8623,4.97548 60.8589,4.97537 60.8545,4.98246 60.8518,4.98604 60.8479,4.99524 60.8464,5 60.8476,5.00874 60.8496,5.02523 60.8469,5.04048 60.8482,5.02693 60.8727,5.02514 60.8995,5.02732 60.9078,5.02172 60.9174,5.00295 60.9393,5 60.9404,4.99585 60.942,4.98872 60.9398,4.96528 60.9441,4.96287 60.941,4.96187 60.9398,4.96262 60.9334,4.95771 60.9295)),((4.96256 61.383,4.97363 61.3826,4.97908 61.3791,4.98463 61.3801,4.98617 61.382,4.98176 61.385,4.9743 61.3865,4.96478 61.3863,4.96256 61.383)),((4.96515 60.5566,4.97674 60.552,4.97763 60.5473,4.98423 60.5444,4.97984 60.5405,4.98558 60.5348,4.98446 60.5309,4.98845 60.5294,4.99722 60.5298,5 60.5276,5.00547 60.5231,5.00856 60.5166,5.01468 60.5162,5.02814 60.5039,5.03364 60.5019,5.03686 60.5045,5.04715 60.4967,5.06195 60.4921,5.06492 60.4962,5.0756 60.4987,5.08093 60.4976,5.08537 60.4987,5.09648 60.4939,5.09288 60.4908,5.07981 60.4886,5.0785 60.4827,5.07777 60.4795,5.0701 60.4858,5.06574 60.4868,5.06218 60.4859,5.06127 60.4783,5.06598 60.473,5.07754 60.4708,5.07964 60.467,5.08542 60.4658,5.11313 60.4692,5.11443 60.4671,5.08079 60.4558,5.0851 60.4525,5.08343 60.4515,5.08126 60.4507,5.07485 60.4527,5.07298 60.4453,5.07637 60.442,5.09674 60.4473,5.10051 60.4495,5.09988 60.4529,5.10658 60.4519,5.11072 60.447,5.11528 60.45,5.12215 60.448,5.12717 60.4434,5.13357 60.4439,5.14035 60.4424,5.14692 60.4445,5.15667 60.4445,5.17486 60.4388,5.16691 60.4341,5.16908 60.4273,5.15327 60.425,5.14971 60.4284,5.14767 60.4303,5.14424 60.4287,5.14231 60.4241,5.1444 60.4177,5.1614 60.4033,5.16545 60.3939,5.1837 60.3903,5.1878 60.3958,5.19508 60.3991,5.19967 60.3968,5.20824 60.3981,5.22265 60.3978,5.22773 60.4056,5.23388 60.4074,5.23837 60.4134,5.24415 60.4148,5.25141 60.4105,5.25667 60.4096,5.25734 60.411,5.24527 60.4273,5.23036 60.4475,5.23209 60.4508,5.24351 60.4492,5.24402 60.4515,5.23647 60.4599,5.22727 60.4646,5.22544 60.4695,5.22764 60.4754,5.22028 60.4801,5.22331 60.4839,5.219 60.4872,5.20576 60.4884,5.18156 60.5014,5.16719 60.5062,5.16304 60.5035,5.15595 60.5041,5.15075 60.5021,5.13981 60.5092,5.1386 60.51,5.12094 60.5175,5.10543 60.5209,5.09251 60.5204,5.08949 60.5166,5.08166 60.5137,5.07623 60.5254,5.06351 60.5262,5.05277 60.5289,5.03746 60.5287,5.02652 60.5374,5 60.5485,4.98355 60.5554,4.9706 60.5599,4.96703 60.559,4.96515 60.5566)),((4.96589 61.2332,4.96681 61.2309,4.97553 61.2277,4.98607 61.2272,4.99018 61.2306,4.96589 61.2332)),((4.97564 60.3414,4.98366 60.3318,4.9879 60.3337,4.98193 60.3445,4.97796 60.3443,4.97564 60.3414)),((4.97664 60.7593,4.99016 60.7498,5 60.7451,5.0051 60.7426,5.01431 60.741,5.01689 60.7422,5.00777 60.7508,5.00084 60.7528,5 60.7533,4.9879 60.7609,4.97691 60.7652,4.97664 60.7593)),((4.97731 62.0156,4.98799 62.0059,4.98526 61.9976,4.98827 61.9922,5 61.9888,5.00481 61.9874,5.03397 61.9877,5.04113 61.986,5.05014 61.9822,5.05425 61.9737,5.06475 61.9698,5.06204 61.9662,5.05064 61.9623,5.04772 61.9548,5.04281 61.9525,5.03978 61.9531,5.03097 61.9658,5.02395 61.9644,5.01083 61.9518,5.00505 61.9491,5.00878 61.9401,5.02051 61.9373,5.03326 61.9342,5.03944 61.935,5.04401 61.9315,5.05344 61.9305,5.06042 61.9271,5.07519 61.9262,5.082 61.9212,5.1103 61.9281,5.11775 61.9374,5.14103 61.9503,5.14288 61.9559,5.13533 61.9723,5.13783 61.9795,5.15699 61.9939,5.15588 61.9947,5.14794 62.0004,5.14399 62.0133,5.13995 62.0141,5.13529 62.018,5.13687 62.0224,5.12399 62.031,5.11225 62.0287,5.11441 62.0215,5.09208 62.0171,5.08275 62.0199,5.08043 62.0168,5.08492 62.0138,5.09503 62.0119,5.09134 62.0083,5.07921 62.008,5.02508 62.0226,5.00739 62.0336,5 62.033,4.99683 62.0327,4.97731 62.0156)),((4.97736 60.3075,4.98324 60.3057,4.9957 60.3058,4.99719 60.3077,4.99081 60.3098,4.993 60.3128,4.98891 60.3149,4.97825 60.3126,4.97736 60.3075)),((4.98894 60.5614,4.99277 60.5583,5 60.5545,5.00313 60.5528,5.01014 60.5527,5.01307 60.5544,5.01025 60.5571,5 60.5609,4.9922 60.5638,4.98894 60.5614)),((5.00808 61.9164,5.01617 61.9099,5.01478 61.907,5.02507 61.9066,5.02996 61.899,5.04403 61.8966,5.05204 61.8979,5.06369 61.8954,5.07551 61.8957,5.08979 61.896,5.10757 61.892,5.12211 61.8997,5.1136 61.9035,5.09722 61.9078,5.0906 61.9069,5.0814 61.9117,5.06768 61.9148,5.05559 61.9145,5.04581 61.9173,5.03275 61.917,5.02437 61.9201,5.02203 61.9246,5.01817 61.9244,5.00808 61.9164)),((5.01987 61.1998,5.02169 61.1953,5.031 61.1888,5.04007 61.1786,5.0658 61.1731,5.07145 61.1759,5.0697 61.19,5.07457 61.1969,5.0711 61.2002,5.05247 61.2008,5.03922 61.2029,5.02462 61.2023,5.01987 61.1998)),((5.02456 61.1704,5.03451 61.1605,5.02887 61.1478,5.03788 61.1379,5.03751 61.1352,5.03671 61.1291,5.04237 61.1218,5.06734 61.1151,5.09604 61.1187,5.101 61.12,5.10223 61.1235,5.09406 61.1342,5.08121 61.1469,5.06995 61.1538,5.06304 61.1627,5.05726 61.1656,5.0287 61.1735,5.02456 61.1704)),((5.02616 61.3778,5.03603 61.3591,5.03669 61.3578,5.04247 61.3525,5.0582 61.3452,5.08901 61.3438,5.09878 61.3451,5.10303 61.3529,5.10297 61.3683,5.09342 61.3984,5.07863 61.4032,5.03778 61.3943,5.02616 61.3778)),((5.03543 60.0201,5.03813 60.0179,5.05018 60.0196,5.07254 60.0151,5.07151 60.0133,5.04569 60.003,5.0438 60,5.04161 59.9965,5.04534 59.9937,5.0595 59.9913,5.07069 59.9877,5.0808 59.9875,5.08517 59.9886,5.08869 60,5.08978 60.0035,5.1008 60.0033,5.10393 60.0113,5.09466 60.0183,5.09277 60.0197,5.07166 60.0199,5.05629 60.0238,5.03712 60.0234,5.03543 60.0201)),((5.03549 60.1664,5.0372 60.1647,5.04168 60.1653,5.04615 60.1685,5.05611 60.1669,5.06412 60.1684,5.0694 60.1664,5.07155 60.1655,5.08013 60.1689,5.08622 60.1784,5.07179 60.1917,5.0756 60.196,5.07105 60.2082,5.06822 60.2111,5.06498 60.2112,5.06013 60.205,5.05134 60.2002,5.04253 60.1881,5.04951 60.1852,5.0455 60.1795,5.03878 60.1785,5.03549 60.1664)),((5.04002 60.1345,5.04833 60.1293,5.0449 60.123,5.04753 60.1187,5.05726 60.1208,5.06302 60.1194,5.06766 60.1217,5.06338 60.1275,5.06756 60.1297,5.08434 60.1284,5.09031 60.131,5.09207 60.1439,5.08962 60.1473,5.06255 60.1444,5.04996 60.1404,5.04002 60.1345)),((5.04487 60.9743,5.06973 60.9676,5.081 60.9678,5.08941 60.9707,5.07894 60.9762,5.04491 60.9766,5.04487 60.9743)),((5.05269 59.8914,5.05603 59.8881,5.07894 59.89,5.08517 59.9034,5.08262 59.9074,5.0734 59.9079,5.06558 59.9032,5.0562 59.9021,5.05269 59.8914)),((5.05511 61.4984,5.05539 61.4895,5.06026 61.4815,5.06238 61.4781,5.06239 61.473,5.07712 61.4737,5.08723 61.4759,5.10559 61.4751,5.11082 61.4728,5.11579 61.4744,5.11915 61.4794,5.12525 61.4801,5.12844 61.4885,5.14746 61.4868,5.15758 61.484,5.16445 61.4857,5.15196 61.4884,5.14552 61.497,5.1313 61.4987,5.12723 61.4949,5.11954 61.495,5.1124 61.4972,5.09048 61.494,5.08667 61.4989,5.07525 61.5009,5.07278 61.5038,5.06401 61.4995,5.05511 61.4984)),((5.05637 61.5641,5.0625 61.5573,5.10063 61.5488,5.10626 61.552,5.11371 61.5508,5.11323 61.5482,5.12052 61.5474,5.1358 61.5457,5.1432 61.5422,5.15822 61.5414,5.16753 61.543,5.16944 61.5456,5.13783 61.5628,5.10269 61.5707,5.08669 61.5764,5.08062 61.5755,5.06807 61.5658,5.05779 61.5692,5.05637 61.5641)),((5.05935 60.7131,5.06991 60.7067,5.0751 60.7065,5.08354 60.7014,5.08354 60.7064,5.07974 60.7092,5.06201 60.714,5.05935 60.7131)),((5.06067 59.8527,5.06421 59.8508,5.07021 59.8504,5.06504 59.8462,5.0777 59.8468,5.08086 59.8495,5.07555 59.8536,5.06255 59.8574,5.06067 59.8527)),((5.06356 59.8269,5.0653 59.8223,5.07705 59.8153,5.07116 59.8077,5.07391 59.805,5.09101 59.8162,5.07748 59.828,5.06356 59.8269)),((5.06583 60.696,5.07645 60.6822,5.08711 60.6778,5.10949 60.6728,5.11102 60.674,5.0893 60.6851,5.08779 60.687,5.09482 60.6898,5.08343 60.695,5.07202 60.6971,5.06583 60.696)),((5.06766 60.6113,5.07448 60.6073,5.0866 60.6048,5.08903 60.6068,5.06955 60.6137,5.06766 60.6113)),((5.06801 60.3996,5.06903 60.3916,5.07262 60.3897,5.08214 60.3934,5.07946 60.4004,5.07172 60.4046,5.06801 60.3996)),((5.07225 59.4416,5.08505 59.433,5.09483 59.4362,5.09275 59.4403,5.09949 59.4429,5.09546 59.4477,5.08667 59.4478,5.08284 59.4479,5.07225 59.4416)),((5.07301 61.63,5.07428 61.6259,5.08058 61.6232,5.094 61.6211,5.10537 61.6245,5.10745 61.6262,5.10371 61.6281,5.09889 61.6282,5.0922 61.6329,5.07301 61.63)),((5.07639 59.8665,5.078 59.8601,5.08574 59.8552,5.08859 59.8445,5.10023 59.8357,5.10919 59.834,5.12504 59.8419,5.12549 59.8421,5.12796 59.8385,5.12122 59.832,5.1317 59.8357,5.14229 59.8399,5.14455 59.8425,5.1524 59.8419,5.1515 59.8469,5.15467 59.8496,5.14382 59.8567,5.13798 59.8638,5.12306 59.8707,5.11101 59.8743,5.09953 59.8747,5.07639 59.8665)),((5.07756 60.0703,5.08572 60.0683,5.08853 60.0655,5.09677 60.0631,5.10012 60.0648,5.10185 60.0679,5.0893 60.0763,5.08256 60.0755,5.07756 60.0703)),((5.0783 59.8836,5.0862 59.8777,5.09229 59.8794,5.0945 59.8848,5.09162 59.8881,5.0783 59.8836)),((5.07871 60.7373,5.09639 60.7295,5.09751 60.7329,5.09344 60.7362,5.08422 60.7389,5.07871 60.7373)),((5.07956 60.7293,5.07976 60.7282,5.09639 60.7198,5.10179 60.7189,5.10379 60.7207,5.10103 60.7231,5.09271 60.7273,5.0836 60.7295,5.07956 60.7293)),((5.08417 60.3799,5.08563 60.377,5.10051 60.3717,5.1104 60.3733,5.1141 60.366,5.12051 60.3535,5.1314 60.3421,5.14567 60.3324,5.15096 60.3338,5.15906 60.3401,5.16499 60.3482,5.1491 60.3617,5.16078 60.3611,5.16458 60.3631,5.16505 60.3682,5.16331 60.3802,5.15876 60.3874,5.13859 60.3963,5.12576 60.393,5.12054 60.3962,5.10976 60.3969,5.10274 60.3947,5.11194 60.3825,5.10935 60.379,5.10133 60.3823,5.08922 60.3827,5.08417 60.3799)),((5.08507 59.8062,5.09596 59.8015,5.10014 59.8035,5.09657 59.8056,5.10136 59.8093,5.09955 59.8117,5.09496 59.812,5.08507 59.8062)),((5.08701 61.5046,5.09108 61.5034,5.09964 61.5038,5.1044 61.5015,5.11049 61.5047,5.10275 61.5076,5.09034 61.5073,5.08701 61.5046)),((5.09049 59.9018,5.09658 59.8984,5.1009 59.9048,5.10938 59.9034,5.11757 59.906,5.10933 59.9112,5.09583 59.9126,5.0913 59.9099,5.09431 59.9059,5.09049 59.9018)),((5.09324 60.702,5.09329 60.6993,5.10122 60.6943,5.12842 60.6838,5.13719 60.6819,5.14368 60.6822,5.14575 60.6837,5.12517 60.6938,5.11012 60.6968,5.09961 60.703,5.09324 60.702)),((5.09357 60.3652,5.09769 60.3632,5.10579 60.3536,5.11347 60.3512,5.11293 60.3575,5.10744 60.3639,5.10444 60.3656,5.09357 60.3652)),((5.09612 60.0973,5.09651 60.0951,5.10962 60.0901,5.11344 60.0833,5.11942 60.084,5.12047 60.0879,5.11625 60.0921,5.11933 60.0944,5.11645 60.1008,5.11026 60.1062,5.10914 60.1027,5.10504 60.1012,5.09946 60.1031,5.09612 60.0973)),((5.09985 59.8804,5.10352 59.8778,5.11787 59.8766,5.1205 59.8797,5.12593 59.88,5.12573 59.8837,5.12025 59.8887,5.12268 59.8904,5.11642 59.8972,5.1114 59.8972,5.10754 59.8934,5.10033 59.8954,5.09985 59.8804)),((5.1004 59.993,5.10052 59.9898,5.1087 59.9851,5.11502 59.9755,5.12034 59.9739,5.1427 59.9742,5.14835 59.9759,5.14909 59.9793,5.14992 59.9793,5.15557 59.9789,5.15969 59.9764,5.17884 59.9768,5.20856 59.9845,5.21186 59.9865,5.20972 59.9883,5.21584 59.9924,5.21083 60,5.20836 60.0037,5.21394 60.0107,5.20265 60.0201,5.19505 60.0216,5.18046 60.0186,5.16584 60.0184,5.15952 60.0154,5.14721 60.0151,5.14238 60.0139,5.13383 60.008,5.10922 60.0033,5.10638 60,5.1004 59.993)),((5.10048 59.7865,5.10438 59.7851,5.11726 59.7893,5.11907 59.7869,5.10344 59.7802,5.10078 59.7723,5.1037 59.7713,5.11218 59.7746,5.11199 59.7606,5.11572 59.7601,5.12026 59.7626,5.12219 59.762,5.12063 59.758,5.12318 59.754,5.13707 59.7576,5.13375 59.7609,5.13461 59.7637,5.14035 59.7647,5.14843 59.7793,5.14962 59.7814,5.15532 59.7851,5.15856 59.7797,5.1506 59.7684,5.15252 59.7652,5.15564 59.7656,5.16454 59.7717,5.16774 59.7717,5.17048 59.7665,5.16592 59.7589,5.16887 59.7526,5.17953 59.7591,5.18551 59.7587,5.18928 59.7692,5.19238 59.7714,5.19916 59.7691,5.1953 59.7548,5.20945 59.7621,5.22204 59.7628,5.23573 59.7606,5.23654 59.7605,5.23431 59.7551,5.22485 59.7547,5.21791 59.7503,5.21695 59.7454,5.22468 59.7402,5.2207 59.7371,5.20597 59.7408,5.19987 59.7444,5.19679 59.7438,5.1956 59.7403,5.1906 59.7378,5.18028 59.7371,5.17392 59.7269,5.16683 59.7234,5.16539 59.7187,5.16199 59.7174,5.15953 59.7084,5.16955 59.7056,5.17037 59.7036,5.15748 59.6995,5.15453 59.6856,5.14944 59.6803,5.14765 59.6784,5.15222 59.6655,5.14511 59.6572,5.1661 59.6386,5.16682 59.6295,5.1765 59.6311,5.17706 59.6279,5.1633 59.6213,5.16265 59.6173,5.1697 59.6158,5.1724 59.6134,5.17828 59.616,5.1799 59.6119,5.16447 59.597,5.16801 59.5948,5.18058 59.5997,5.18628 59.6001,5.18723 59.598,5.18497 59.5971,5.17723 59.5939,5.18828 59.5928,5.18342 59.5896,5.17677 59.5888,5.17652 59.5826,5.18014 59.5775,5.18654 59.5771,5.19494 59.5781,5.20987 59.5832,5.21632 59.5876,5.22165 59.5984,5.23052 59.6046,5.23284 59.6017,5.23148 59.5991,5.23511 59.599,5.24435 59.6056,5.24306 59.6104,5.24576 59.613,5.24051 59.6146,5.21996 59.608,5.21245 59.607,5.21258 59.6088,5.22259 59.6136,5.22295 59.6166,5.22351 59.6212,5.23524 59.6266,5.23974 59.6318,5.2367 59.6388,5.22276 59.6485,5.22347 59.6548,5.22953 59.6589,5.24409 59.6612,5.24692 59.6657,5.24472 59.6679,5.226 59.6661,5.22239 59.6609,5.21405 59.6594,5.20308 59.6522,5.19802 59.6527,5.20764 59.6648,5.21963 59.6688,5.22778 59.674,5.22875 59.6776,5.22914 59.6791,5.23409 59.6819,5.23565 59.6962,5.24407 59.7076,5.2389 59.7163,5.23905 59.7232,5.23509 59.7276,5.23653 59.7426,5.24072 59.7471,5.25068 59.7474,5.25617 59.7497,5.27106 59.7322,5.27482 59.7314,5.28295 59.7343,5.28833 59.7295,5.2973 59.7301,5.30712 59.7285,5.31005 59.7312,5.31103 59.7321,5.30555 59.7349,5.29589 59.7356,5.29287 59.7373,5.30632 59.7487,5.30938 59.7468,5.30802 59.7442,5.32468 59.7346,5.31896 59.7309,5.31792 59.7265,5.3283 59.7164,5.33047 59.7091,5.32084 59.7071,5.32931 59.7001,5.33524 59.6999,5.3355 59.6958,5.32649 59.6929,5.31913 59.6935,5.31804 59.6893,5.3256 59.6875,5.32542 59.6859,5.3212 59.6841,5.31382 59.6875,5.30895 59.6868,5.30692 59.6825,5.30663 59.6819,5.29279 59.6781,5.29654 59.6748,5.30022 59.6745,5.3069 59.6778,5.31376 59.6774,5.35 59.6854,5.35281 59.6901,5.3638 59.6947,5.36515 59.7001,5.37956 59.7007,5.38646 59.7054,5.38505 59.7083,5.38725 59.7114,5.3847 59.7156,5.3815 59.7157,5.37718 59.7118,5.36091 59.7141,5.35748 59.7103,5.35467 59.7109,5.34485 59.7256,5.34322 59.7315,5.33993 59.7435,5.33325 59.7506,5.33446 59.7541,5.34091 59.7562,5.33802 59.7597,5.33237 59.7609,5.32847 59.7676,5.32013 59.7711,5.31086 59.7696,5.31454 59.7823,5.30925 59.7917,5.2878 59.8103,5.27871 59.8154,5.27559 59.8151,5.27152 59.8045,5.26856 59.8033,5.26169 59.8087,5.2636 59.8107,5.27088 59.8185,5.26388 59.8246,5.25423 59.8251,5.25964 59.8307,5.24568 59.8323,5.24047 59.836,5.24146 59.8381,5.25133 59.839,5.2555 59.8463,5.25272 59.8492,5.24495 59.8493,5.24303 59.8524,5.22924 59.8513,5.22507 59.8509,5.22362 59.8463,5.21478 59.8447,5.20847 59.8545,5.18767 59.8741,5.18224 59.8763,5.17179 59.8761,5.1646 59.8781,5.15929 59.8771,5.1514 59.8805,5.15213 59.8663,5.17155 59.8469,5.19562 59.8397,5.20329 59.835,5.20126 59.8304,5.19909 59.8254,5.19112 59.8267,5.18541 59.8255,5.1846 59.8301,5.17848 59.8337,5.16439 59.8386,5.15643 59.8373,5.15847 59.8309,5.17589 59.819,5.17502 59.8172,5.17062 59.8174,5.17166 59.8136,5.16894 59.8133,5.14919 59.8319,5.14447 59.8328,5.14184 59.8222,5.15156 59.8136,5.14877 59.8114,5.12205 59.8083,5.12024 59.8081,5.12181 59.802,5.10048 59.7865)),((5.10151 61.5769,5.13606 61.5721,5.15482 61.572,5.15799 61.5731,5.1576 61.5751,5.14564 61.5774,5.14624 61.5818,5.12951 61.5813,5.11867 61.5826,5.10259 61.5787,5.10151 61.5769)),((5.10324 59.6934,5.10639 59.6885,5.10966 59.6879,5.1115 59.6903,5.10753 59.6947,5.11661 59.6972,5.10834 59.7003,5.10372 59.6982,5.10324 59.6934)),((5.11315 59.7315,5.11778 59.7285,5.12315 59.729,5.12949 59.7366,5.13678 59.7365,5.14034 59.7394,5.14145 59.7484,5.14453 59.7515,5.14014 59.7532,5.13351 59.7522,5.1299 59.747,5.13183 59.7413,5.12199 59.7404,5.11913 59.7387,5.11315 59.7315)),((5.11762 60.1375,5.12222 60.135,5.12815 60.1352,5.12914 60.1323,5.12508 60.1294,5.13656 60.1244,5.13851 60.1212,5.13507 60.1124,5.14198 60.1021,5.13776 60.0975,5.14385 60.0969,5.14853 60.1015,5.15325 60.0982,5.16202 60.1005,5.16316 60.0986,5.16463 60.0962,5.17175 60.0975,5.17868 60.1049,5.17141 60.1197,5.16606 60.1188,5.15869 60.124,5.16147 60.1264,5.15973 60.1309,5.15115 60.1351,5.15265 60.137,5.1594 60.1378,5.16115 60.1409,5.16861 60.1428,5.1716 60.1466,5.16613 60.1489,5.16281 60.1469,5.15162 60.1503,5.15058 60.156,5.14424 60.153,5.14311 60.149,5.13789 60.1474,5.13627 60.1411,5.12976 60.1415,5.12504 60.1473,5.12085 60.1475,5.11762 60.1375)),((5.12062 61.8897,5.12406 61.8879,5.15026 61.886,5.16031 61.8822,5.16343 61.885,5.15548 61.8907,5.1465 61.8917,5.12062 61.8897)),((5.12221 59.8216,5.12845 59.8191,5.13195 59.814,5.13561 59.813,5.14009 59.8139,5.13987 59.8169,5.1273 59.824,5.12221 59.8216)),((5.12521 61.6164,5.13476 61.6118,5.14639 61.6114,5.15194 61.6125,5.16261 61.6121,5.17408 61.6151,5.16184 61.6187,5.13949 61.6198,5.12629 61.6183,5.12521 61.6164)),((5.12602 60.0284,5.12606 60.0256,5.1304 60.0244,5.14701 60.0314,5.14527 60.0334,5.14023 60.0334,5.13668 60.0353,5.12602 60.0284)),((5.12881 59.8944,5.13926 59.8845,5.15415 59.8854,5.1549 59.8889,5.14614 59.897,5.13864 59.8955,5.13329 59.8973,5.12881 59.8944)),((5.13795 59.5985,5.14452 59.5871,5.15215 59.595,5.14668 59.5978,5.14758 59.6003,5.14473 59.6011,5.13795 59.5985)),((5.13882 59.6468,5.14192 59.632,5.14984 59.6358,5.14233 59.6474,5.13882 59.6468)),((5.14348 59.3829,5.14778 59.3764,5.14781 59.3712,5.15405 59.3714,5.15341 59.3801,5.15698 59.3879,5.15467 59.3908,5.14956 59.3917,5.14348 59.3829)),((5.14547 59.7438,5.14952 59.7414,5.15005 59.7385,5.16251 59.7425,5.15985 59.7472,5.16116 59.75,5.15715 59.7521,5.14813 59.7492,5.14547 59.7438)),((5.15227 60.2911,5.15569 60.2901,5.16102 60.2913,5.16923 60.2969,5.16574 60.3009,5.15249 60.2975,5.15227 60.2911)),((5.15468 59.4009,5.16116 59.3922,5.1655 59.3906,5.17028 59.3915,5.16299 59.3971,5.16368 59.4008,5.15939 59.4048,5.15537 59.4046,5.15468 59.4009)),((5.15697 60.8206,5.159 60.8172,5.16865 60.8158,5.17461 60.8115,5.17677 60.8125,5.17471 60.8186,5.1786 60.8229,5.18103 60.8326,5.17732 60.8401,5.16782 60.8355,5.15859 60.8346,5.15753 60.8277,5.16019 60.8235,5.15697 60.8206)),((5.15892 60.3206,5.16424 60.3091,5.16362 60.3049,5.17415 60.3029,5.18697 60.3163,5.19564 60.3194,5.18577 60.3254,5.18549 60.3295,5.19095 60.33,5.19091 60.3328,5.18566 60.3362,5.17899 60.3373,5.17327 60.3306,5.16359 60.3279,5.15892 60.3206)),((5.16459 59.9162,5.182 59.9108,5.18681 59.9069,5.19151 59.9087,5.1809 59.9169,5.17283 59.9212,5.16756 59.92,5.16459 59.9162)),((5.16724 59.2283,5.17514 59.219,5.16973 59.2116,5.16875 59.2045,5.17 59.2024,5.17129 59.2002,5.17729 59.1991,5.17237 59.1915,5.1747 59.1859,5.17275 59.1792,5.17803 59.1746,5.18745 59.1769,5.19092 59.1749,5.18881 59.1666,5.19593 59.1616,5.18878 59.1514,5.19131 59.1472,5.20061 59.1451,5.20849 59.1459,5.22179 59.1516,5.22625 59.149,5.23526 59.1485,5.24353 59.142,5.25937 59.1459,5.26737 59.1461,5.27094 59.1435,5.27437 59.1443,5.2741 59.1484,5.28835 59.1486,5.29293 59.1454,5.29411 59.1411,5.29706 59.1421,5.29966 59.1477,5.29895 59.1596,5.3153 59.1684,5.31562 59.171,5.31884 59.1973,5.32442 59.2065,5.32876 59.2333,5.333 59.2399,5.32904 59.2604,5.33225 59.2704,5.32789 59.2776,5.3123 59.2874,5.31564 59.2915,5.31508 59.2919,5.31202 59.2943,5.30207 59.2948,5.29905 59.2967,5.3072 59.3015,5.30459 59.3036,5.29836 59.3034,5.29348 59.3057,5.29414 59.3096,5.29896 59.3103,5.30886 59.31,5.31734 59.3076,5.32188 59.3099,5.32372 59.3201,5.32077 59.3216,5.31441 59.3195,5.30847 59.3201,5.29687 59.3302,5.28402 59.3344,5.2798 59.3406,5.28896 59.3447,5.29744 59.3554,5.29328 59.3587,5.28644 59.3593,5.28515 59.3615,5.28732 59.3671,5.2889 59.3683,5.2933 59.3716,5.28941 59.381,5.28201 59.3848,5.27952 59.3888,5.26234 59.4023,5.25477 59.4045,5.24931 59.41,5.24258 59.4124,5.23354 59.4127,5.22984 59.4082,5.23165 59.4055,5.22917 59.4017,5.21939 59.3985,5.21645 59.3897,5.22183 59.3846,5.22048 59.3795,5.22532 59.3724,5.23829 59.3727,5.24132 59.3708,5.2356 59.3676,5.22934 59.3597,5.21517 59.3637,5.21035 59.363,5.20816 59.3601,5.21525 59.3478,5.20793 59.3486,5.1894 59.3545,5.18478 59.3526,5.19505 59.3478,5.19573 59.344,5.18865 59.3434,5.1875 59.3371,5.19741 59.3319,5.19647 59.3245,5.20196 59.3187,5.20802 59.3174,5.21328 59.3181,5.2191 59.3156,5.22127 59.3109,5.21177 59.3114,5.21132 59.3088,5.2234 59.3039,5.22229 59.2999,5.21761 59.3011,5.21482 59.2995,5.20866 59.2959,5.20646 59.2854,5.20003 59.2838,5.19401 59.2849,5.19114 59.2859,5.18575 59.2758,5.19362 59.2692,5.1861 59.2661,5.17907 59.2653,5.17656 59.2593,5.18038 59.2502,5.19254 59.2524,5.1971 59.2494,5.19156 59.2452,5.18465 59.2438,5.1809 59.2397,5.18533 59.2349,5.18306 59.2325,5.17625 59.2331,5.16947 59.2309,5.16724 59.2283)),((5.16743 60.1595,5.17476 60.1546,5.18157 60.1576,5.18419 60.1609,5.18116 60.1649,5.17577 60.1668,5.16743 60.1595)),((5.16751 60.2429,5.16775 60.2339,5.17286 60.2312,5.18965 60.2301,5.19499 60.2363,5.19142 60.2407,5.18339 60.2417,5.17853 60.2406,5.17146 60.244,5.16751 60.2429)),((5.1716 60.1466,5.18308 60.1416,5.19009 60.1435,5.18425 60.1504,5.18027 60.147,5.1716 60.1466)),((5.17713 60.06,5.19616 60.0614,5.203 60.0718,5.20739 60.0729,5.21231 60.071,5.20493 60.0661,5.21167 60.0643,5.20723 60.0574,5.20665 60.0565,5.19817 60.0578,5.18506 60.0567,5.18187 60.0515,5.18389 60.048,5.19282 60.0467,5.19442 60.0429,5.19736 60.0419,5.201 60.0446,5.20554 60.0423,5.20124 60.0382,5.20743 60.0343,5.20114 60.0285,5.20868 60.0222,5.2251 60.0149,5.23414 60.013,5.25211 60.0124,5.25854 60.0097,5.24753 60.0037,5.24829 60,5.24883 59.9973,5.2585 60,5.26285 59.9931,5.27049 60,5.271 60,5.28813 60.0158,5.28314 60.0181,5.27781 60.0172,5.27782 60.0197,5.28632 60.0261,5.29404 60.0239,5.3048 60.0356,5.30486 60.0404,5.29916 60.0494,5.30582 60.0584,5.29534 60.0788,5.27874 60.0871,5.26906 60.0898,5.2657 60.0778,5.25929 60.088,5.25333 60.088,5.24493 60.0998,5.25609 60.0957,5.26317 60.0972,5.25181 60.1042,5.24319 60.114,5.23342 60.1172,5.21957 60.1278,5.2078 60.1269,5.20153 60.1208,5.20608 60.116,5.21522 60.1111,5.21164 60.1054,5.21445 60.1026,5.22707 60.0963,5.22221 60.0926,5.2284 60.0837,5.22833 60.0763,5.23879 60.0717,5.23348 60.0681,5.24144 60.062,5.24721 60.0657,5.2515 60.0622,5.25662 60.0617,5.25388 60.0591,5.25539 60.0532,5.2456 60.0541,5.24868 60.0497,5.23739 60.0487,5.23485 60.0424,5.22762 60.0444,5.22446 60.0518,5.22141 60.0527,5.21962 60.0532,5.22272 60.0667,5.21687 60.0738,5.21021 60.093,5.20665 60.0924,5.19164 60.0814,5.18844 60.0762,5.18273 60.0748,5.1812 60.0731,5.18644 60.0669,5.17713 60.06)),((5.17956 59.9015,5.18445 59.8971,5.19461 59.8939,5.19843 59.8904,5.19741 59.8881,5.20612 59.8882,5.20614 59.8958,5.20326 59.8991,5.19338 59.8982,5.18174 59.9046,5.17956 59.9015)),((5.17991 59.8924,5.18878 59.8831,5.19267 59.8808,5.19548 59.8814,5.19702 59.8842,5.19406 59.8879,5.19067 59.8906,5.18207 59.8933,5.17991 59.8924)),((5.1814 62.014,5.18289 62.0113,5.19365 62.0085,5.2035 62.008,5.21059 62.0143,5.21368 62.0211,5.20837 62.0234,5.20075 62.0198,5.19187 62.0204,5.18786 62.0158,5.1814 62.014)),((5.182 59.9388,5.19373 59.9294,5.20177 59.933,5.20425 59.937,5.20079 59.941,5.19494 59.943,5.19288 59.9393,5.18427 59.9414,5.182 59.9388)),((5.1843 60.8124,5.18832 60.8084,5.19644 60.8076,5.19721 60.8136,5.19426 60.8169,5.18571 60.8175,5.1843 60.8124)),((5.19626 61.8827,5.21744 61.881,5.24359 61.8762,5.26058 61.8762,5.26874 61.8715,5.29302 61.8713,5.30664 61.8815,5.3307 61.8931,5.3259 61.8954,5.31545 61.8915,5.30868 61.894,5.27289 61.8907,5.23335 61.8893,5.22507 61.8869,5.19784 61.8846,5.19626 61.8827)),((5.19766 61.8166,5.20909 61.8125,5.22684 61.8186,5.21937 61.8196,5.19766 61.8166)),((5.20057 60.1594,5.20234 60.1546,5.21373 60.145,5.21722 60.1486,5.20919 60.1575,5.20646 60.1599,5.20057 60.1594)),((5.20445 60.7563,5.22028 60.7517,5.22675 60.7522,5.21899 60.7588,5.20636 60.7587,5.20445 60.7563)),((5.20565 60.2462,5.21129 60.2379,5.2174 60.2373,5.22219 60.2414,5.22183 60.246,5.21827 60.2504,5.21486 60.2514,5.20945 60.2507,5.20565 60.2462)),((5.20837 59.9037,5.21745 59.8938,5.21891 59.8881,5.23107 59.8788,5.23311 59.8749,5.24035 59.8753,5.25481 59.8605,5.25921 59.8589,5.26902 59.8653,5.24822 59.8901,5.23178 59.8978,5.22659 59.8988,5.21851 59.9057,5.20983 59.9083,5.20837 59.9037)),((5.20999 61.57,5.22861 61.5655,5.24784 61.5629,5.25339 61.5641,5.24777 61.5684,5.21216 61.5713,5.20999 61.57)),((5.21205 60.7865,5.22193 60.7837,5.22351 60.7879,5.22897 60.7913,5.22408 60.7976,5.21495 60.7962,5.21219 60.7934,5.21205 60.7865)),((5.21955 59.9255,5.21998 59.918,5.23165 59.9089,5.24075 59.909,5.25312 59.8995,5.2562 59.9002,5.25428 59.9073,5.23802 59.9192,5.23334 59.9225,5.21955 59.9255)),((5.23377 59.9303,5.24149 59.9228,5.25205 59.9173,5.25565 59.9203,5.2374 59.933,5.23377 59.9303)),((5.23822 60.548,5.24029 60.5461,5.2478 60.5461,5.25595 60.5425,5.25754 60.54,5.25364 60.5358,5.2625 60.5313,5.26862 60.5327,5.27309 60.5369,5.27167 60.5451,5.26564 60.5466,5.24304 60.5502,5.23897 60.5503,5.23822 60.548)),((5.23881 59.6731,5.24015 59.6707,5.24882 59.6704,5.25661 59.6673,5.25951 59.6766,5.25144 59.6838,5.25215 59.6875,5.24476 59.6934,5.24165 59.693,5.24087 59.6897,5.24576 59.6851,5.24132 59.6769,5.24883 59.6754,5.24601 59.6734,5.23881 59.6731)),((5.23937 59.9423,5.24542 59.9326,5.2538 59.9301,5.25765 59.9309,5.25843 59.9333,5.24174 59.9424,5.23937 59.9423)),((5.2414 60.8132,5.24412 60.806,5.24161 60.8018,5.2547 60.7943,5.26924 60.7917,5.27212 60.812,5.2756 60.8161,5.27375 60.8185,5.26948 60.8188,5.26671 60.8237,5.25681 60.8265,5.24859 60.8252,5.24265 60.8218,5.2414 60.8132)),((5.2463 59.9446,5.25304 59.9376,5.27015 59.9416,5.27731 59.9398,5.28797 59.9286,5.29209 59.9285,5.29425 59.9318,5.28009 59.9526,5.2657 59.9616,5.25642 59.9623,5.25047 59.9598,5.25097 59.9492,5.2463 59.9446)),((5.24771 60.1401,5.26033 60.1338,5.26299 60.1369,5.25688 60.1428,5.25009 60.1448,5.24771 60.1401)),((5.2482 59.7048,5.2564 59.6994,5.26173 59.7026,5.26283 59.7119,5.2714 59.7251,5.26891 59.7264,5.25456 59.7227,5.24928 59.7115,5.2482 59.7048)),((5.24825 60.7756,5.25496 60.7723,5.25701 60.7687,5.26179 60.7682,5.2655 60.7762,5.26162 60.7794,5.25642 60.7797,5.24825 60.7756)),((5.25064 62.0164,5.25636 62.0068,5.25304 62.0011,5.25804 61.9979,5.26836 61.9974,5.27865 61.9997,5.28902 61.999,5.3205 62.0103,5.32325 62.0139,5.32155 62.0177,5.30993 62.0225,5.29829 62.0248,5.28615 62.0245,5.27505 62.0291,5.26691 62.0283,5.26501 62.0255,5.26402 62.0204,5.25504 62.0189,5.25064 62.0164)),((5.25076 61.99,5.26184 61.9829,5.26575 61.9828,5.26681 61.985,5.26291 61.9875,5.26149 61.9925,5.25881 61.9938,5.2531 61.9931,5.25076 61.99)),((5.27009 59.8876,5.27903 59.8887,5.28398 59.8917,5.28684 59.8961,5.28373 59.9008,5.28664 59.9076,5.29404 59.9045,5.30146 59.9064,5.30361 59.9097,5.30699 59.9087,5.31321 59.9019,5.32244 59.9039,5.32595 59.8996,5.32767 59.8975,5.3289 59.8904,5.33823 59.8814,5.33712 59.8747,5.33132 59.874,5.32931 59.8751,5.32962 59.8785,5.32433 59.8826,5.29373 59.901,5.29183 59.8989,5.29667 59.8928,5.29512 59.8905,5.28857 59.8889,5.28142 59.8803,5.28619 59.8713,5.29396 59.8634,5.29504 59.8573,5.30014 59.8568,5.30541 59.8501,5.30307 59.8427,5.31019 59.8384,5.30645 59.8364,5.31566 59.8228,5.32267 59.8217,5.33368 59.816,5.34078 59.8276,5.34457 59.8424,5.3474 59.8419,5.35019 59.8363,5.34642 59.8239,5.34669 59.8145,5.35719 59.8012,5.35523 59.7968,5.34707 59.7966,5.33752 59.8123,5.32834 59.8075,5.32682 59.8006,5.32274 59.7979,5.33003 59.7874,5.33564 59.7865,5.33996 59.7825,5.34444 59.783,5.35116 59.7888,5.35842 59.7889,5.35768 59.7826,5.36173 59.7803,5.3731 59.7771,5.38007 59.782,5.3837 59.7794,5.37794 59.7707,5.38137 59.7692,5.38863 59.7693,5.39328 59.766,5.40614 59.7652,5.4089 59.7624,5.39698 59.763,5.39659 59.7547,5.44871 59.7501,5.46833 59.7576,5.47207 59.7623,5.4854 59.7668,5.49679 59.7666,5.49606 59.7709,5.5104 59.7775,5.50941 59.7785,5.50655 59.7815,5.5004 59.7856,5.50084 59.7883,5.50888 59.7919,5.5146 59.7931,5.52157 59.7895,5.53447 59.7912,5.53145 59.7956,5.53211 59.7998,5.52683 59.8041,5.52938 59.8079,5.52496 59.8126,5.52546 59.8204,5.52118 59.8269,5.52591 59.8339,5.52685 59.8445,5.51985 59.8861,5.51966 59.8872,5.50047 59.9116,5.49271 59.917,5.47795 59.9233,5.46152 59.9366,5.43265 59.9477,5.41233 59.9517,5.40037 59.9521,5.38913 59.9642,5.3695 59.9693,5.36057 59.9742,5.35433 59.9776,5.34976 59.9777,5.34421 59.9754,5.3256 59.9745,5.31914 59.9853,5.30873 59.9821,5.29758 59.9726,5.28316 59.9662,5.28364 59.9635,5.29866 59.9639,5.3019 59.9611,5.2979 59.956,5.29978 59.9552,5.31224 59.9595,5.32665 59.9424,5.31948 59.9417,5.32008 59.9383,5.32529 59.9346,5.32042 59.9337,5.312 59.9374,5.31228 59.9358,5.31424 59.9247,5.30092 59.9225,5.29083 59.9227,5.28487 59.9255,5.28046 59.9246,5.28086 59.9223,5.28538 59.92,5.28433 59.9156,5.27366 59.9036,5.27009 59.8876)),((5.27028 61.8426,5.2796 61.8368,5.28458 61.8361,5.28992 61.8464,5.2867 61.8481,5.28053 61.8474,5.27028 61.8426)),((5.282 59.6879,5.30948 59.6942,5.30594 59.6988,5.29049 59.7016,5.28745 59.6983,5.28936 59.6951,5.282 59.6879)),((5.28929 62.0545,5.29934 62.0478,5.3144 62.0429,5.32272 62.0428,5.32682 62.0443,5.32661 62.0533,5.31782 62.0559,5.3094 62.0539,5.29733 62.0585,5.29084 62.0566,5.28929 62.0545)),((5.30449 60.1777,5.30789 60.1689,5.31674 60.1709,5.32316 60.1762,5.31998 60.1786,5.30449 60.1777)),((5.30909 60.1596,5.3174 60.1542,5.32533 60.1639,5.3238 60.1648,5.31623 60.1608,5.30909 60.1596)),((5.3208 61.3574,5.32668 61.3539,5.34529 61.3566,5.35198 61.3591,5.34777 61.3613,5.3322 61.3629,5.32955 61.3591,5.3208 61.3574)),((5.33097 60.1633,5.33297 60.1572,5.35207 60.1479,5.36161 60.1485,5.36524 60.1514,5.36287 60.1571,5.37043 60.1585,5.37195 60.1683,5.37741 60.1712,5.35527 60.1795,5.34792 60.1794,5.3433 60.1769,5.33911 60.1772,5.33673 60.175,5.33695 60.1711,5.33097 60.1633)),((5.33687 60.0304,5.34159 60.0244,5.3472 60.0237,5.35038 60.016,5.36502 60.0082,5.36068 60,5.35921 59.9972,5.36361 59.996,5.3681 59.9966,5.37216 60,5.37634 60.0035,5.38134 60.0038,5.38151 60.0081,5.3816 60.0103,5.37262 60.0197,5.37701 60.0209,5.39041 60.0175,5.40067 60.0191,5.39922 60.0142,5.40136 60.0125,5.40908 60.0128,5.42359 60.019,5.42952 60.0165,5.43398 60.0171,5.44318 60.0248,5.43864 60.0432,5.44121 60.0523,5.43116 60.0574,5.43326 60.0612,5.42488 60.0672,5.41909 60.0768,5.4085 60.0797,5.38494 60.0859,5.36604 60.089,5.35965 60.0862,5.35382 60.0802,5.35768 60.0634,5.35454 60.0578,5.35498 60.05,5.35151 60.0436,5.33687 60.0304)),((5.34594 60.5363,5.35022 60.5305,5.36349 60.5265,5.36619 60.5238,5.36857 60.5214,5.39891 60.5128,5.41014 60.5071,5.40663 60.5033,5.41519 60.4995,5.42614 60.5007,5.42915 60.4994,5.43323 60.492,5.43114 60.488,5.44712 60.4763,5.45401 60.4741,5.45945 60.4695,5.46986 60.4683,5.48071 60.4566,5.49581 60.4552,5.50223 60.4529,5.49291 60.4505,5.50384 60.4436,5.50707 60.4432,5.51993 60.4417,5.53164 60.4383,5.53972 60.429,5.54705 60.4295,5.56169 60.4361,5.57984 60.4385,5.58897 60.4365,5.60279 60.4399,5.6115 60.4377,5.62305 60.4462,5.62604 60.4532,5.63425 60.4595,5.64236 60.4637,5.64877 60.4642,5.66161 60.4735,5.68186 60.4773,5.68904 60.4732,5.69122 60.473,5.70129 60.4721,5.71008 60.4695,5.71454 60.4706,5.71731 60.4734,5.71156 60.4773,5.71116 60.4881,5.70493 60.5032,5.70388 60.5318,5.71387 60.5696,5.71984 60.5814,5.72088 60.5835,5.71785 60.5905,5.72189 60.5998,5.72061 60.6103,5.71623 60.617,5.73181 60.6635,5.73044 60.6717,5.7329 60.6794,5.72851 60.6861,5.70727 60.6958,5.69741 60.6966,5.6959 60.6967,5.68289 60.6907,5.67689 60.6847,5.67356 60.6851,5.67021 60.6939,5.64991 60.7061,5.61834 60.6966,5.61363 60.6941,5.61305 60.6893,5.61684 60.6834,5.62272 60.6818,5.63563 60.6883,5.64337 60.6868,5.64209 60.6833,5.61635 60.6671,5.6177 60.6647,5.62265 60.663,5.61921 60.6588,5.60065 60.636,5.59023 60.6287,5.58958 60.6215,5.57897 60.6209,5.57041 60.6164,5.5595 60.6148,5.55596 60.611,5.55256 60.6117,5.55059 60.6151,5.54445 60.6155,5.52482 60.6131,5.5147 60.615,5.50161 60.6099,5.50053 60.608,5.5027 60.6062,5.51528 60.6035,5.51702 60.5935,5.50304 60.5989,5.48272 60.5978,5.47513 60.5798,5.4782 60.5756,5.47281 60.5745,5.4635 60.5851,5.45894 60.5739,5.44377 60.5648,5.46604 60.5492,5.46918 60.5445,5.49179 60.5321,5.49592 60.5268,5.49659 60.5259,5.48912 60.526,5.47798 60.5313,5.46133 60.5442,5.45598 60.5508,5.43235 60.5608,5.42811 60.5611,5.42441 60.5557,5.41453 60.5589,5.40973 60.5571,5.40822 60.5525,5.38241 60.5484,5.36289 60.5482,5.34896 60.5428,5.34594 60.5363)),((5.34749 62.216,5.35146 62.2079,5.36875 62.2073,5.38238 62.2025,5.39236 62.2016,5.4114 62.1941,5.41923 62.1942,5.42953 62.1994,5.42918 62.204,5.41741 62.2172,5.40627 62.2191,5.3982 62.2229,5.3825 62.2177,5.37073 62.2177,5.35673 62.2217,5.35146 62.221,5.34749 62.216)),((5.34894 62.2344,5.36676 62.231,5.37583 62.2245,5.37472 62.2304,5.3654 62.2383,5.35845 62.2387,5.35015 62.2359,5.34894 62.2344)),((5.35064 59.7341,5.36403 59.7276,5.3674 59.7238,5.37502 59.7244,5.37772 59.7298,5.37319 59.7323,5.36628 59.733,5.36849 59.7386,5.3658 59.741,5.35994 59.7407,5.35107 59.7369,5.35064 59.7341)),((5.35501 60.1416,5.36569 60.1331,5.37185 60.1373,5.38114 60.1367,5.38758 60.1446,5.38379 60.1479,5.36467 60.1468,5.35501 60.1416)),((5.36881 59.989,5.3711 59.9864,5.39706 59.9765,5.40665 59.9739,5.41449 59.9736,5.43446 59.9676,5.43666 59.9669,5.46521 59.9471,5.47682 59.9459,5.48102 59.9535,5.4885 59.9552,5.49084 59.9576,5.48704 59.9611,5.47468 59.9665,5.47668 59.9682,5.4863 59.9654,5.48887 59.9664,5.49116 59.9798,5.49676 59.9792,5.49963 59.9703,5.49542 59.9656,5.50112 59.9589,5.49811 59.9551,5.50129 59.9525,5.50006 59.949,5.50461 59.9464,5.5116 59.9456,5.5138 59.9434,5.51597 59.9414,5.51413 59.936,5.51028 59.9345,5.50939 59.9317,5.53051 59.9067,5.53037 59.9021,5.54058 59.8956,5.55403 59.8943,5.55886 59.8955,5.56714 59.9032,5.56834 59.9096,5.57822 59.916,5.59112 59.9317,5.60635 59.9362,5.60877 59.9244,5.61085 59.9226,5.61675 59.9176,5.62026 59.9102,5.6319 59.9116,5.6404 59.9237,5.64516 59.9225,5.64738 59.92,5.63862 59.9123,5.63545 59.9039,5.63858 59.9016,5.64692 59.9063,5.65799 59.9056,5.66883 59.909,5.67079 59.9109,5.6603 59.9192,5.66375 59.9288,5.65858 59.9352,5.65541 59.9351,5.65328 59.9258,5.65026 59.9248,5.64395 59.9325,5.63299 59.9325,5.62872 59.9363,5.63197 59.9414,5.63023 59.9437,5.61602 59.9412,5.61504 59.9444,5.62554 59.9526,5.63254 59.9601,5.63848 59.9738,5.65237 59.9783,5.65658 59.9833,5.66967 59.9843,5.67566 59.9868,5.68202 59.9926,5.69415 59.9968,5.69879 60,5.70425 60.0038,5.69869 60.0165,5.70921 60.0277,5.70908 60.0369,5.70428 60.0438,5.70186 60.0474,5.70443 60.0569,5.69696 60.0772,5.69327 60.0773,5.68512 60.0822,5.67666 60.0835,5.67085 60.0826,5.66515 60.0755,5.66765 60.0714,5.66529 60.069,5.65892 60.0715,5.65998 60.0734,5.65331 60.0777,5.63923 60.0742,5.63095 60.0688,5.63733 60.0663,5.63304 60.0645,5.63311 60.0613,5.62591 60.0578,5.61309 60.0605,5.60796 60.0637,5.59228 60.0589,5.58703 60.0573,5.58529 60.054,5.57384 60.0513,5.5819 60.0605,5.5987 60.0642,5.60363 60.0676,5.60226 60.0703,5.57476 60.0676,5.56162 60.0693,5.55358 60.0681,5.54002 60.0615,5.53858 60.0592,5.54375 60.0557,5.54986 60.0548,5.5629 60.0563,5.5664 60.0546,5.55176 60.0517,5.54536 60.0489,5.53439 60.0514,5.52648 60.0467,5.51734 60.0542,5.51157 60.059,5.50459 60.0596,5.48284 60.0555,5.46482 60.0402,5.46147 60.0277,5.47276 60.0206,5.46803 60.0188,5.47051 60.015,5.47435 60.014,5.48169 60,5.48317 59.9972,5.48004 59.9941,5.46267 59.994,5.45487 60,5.45029 60.0035,5.44729 60,5.44019 59.9917,5.43508 59.9913,5.43342 59.9911,5.42766 59.998,5.42998 60,5.43444 60.0038,5.42391 60.0038,5.41887 60,5.4146 59.9968,5.40651 59.996,5.40773 60,5.40884 60.0036,5.40723 60.0061,5.4001 60.0071,5.39047 60.004,5.39145 60,5.39355 59.9915,5.39012 59.9902,5.37811 59.9961,5.37228 59.9954,5.36881 59.989)),((5.37027 59.226,5.38272 59.2185,5.37281 59.2137,5.37233 59.2086,5.37659 59.2019,5.38938 59.1977,5.39638 59.1906,5.38992 59.1892,5.37467 59.1922,5.37201 59.1868,5.37925 59.1731,5.38767 59.1682,5.38975 59.1655,5.3911 59.1638,5.39584 59.1621,5.40245 59.1627,5.40728 59.1684,5.39622 59.1757,5.39725 59.1776,5.41295 59.1771,5.41394 59.1792,5.40718 59.1849,5.42288 59.1844,5.43835 59.1748,5.44077 59.171,5.43352 59.1663,5.44165 59.1658,5.44814 59.1617,5.45515 59.1624,5.45818 59.1683,5.45531 59.1748,5.45831 59.181,5.46423 59.1856,5.47638 59.1877,5.47095 59.1962,5.47221 59.202,5.45754 59.2229,5.44456 59.2283,5.41874 59.2435,5.40365 59.2428,5.39183 59.2479,5.38626 59.2503,5.38026 59.2409,5.39243 59.2377,5.3926 59.2341,5.37778 59.2318,5.37066 59.229,5.37027 59.226)),((5.38644 59.0674,5.39072 59.0604,5.40298 59.0617,5.41469 59.0608,5.42107 59.0652,5.42008 59.0711,5.42402 59.0715,5.43129 59.068,5.43301 59.071,5.42756 59.077,5.42131 59.0744,5.41243 59.0743,5.40932 59.0769,5.40008 59.071,5.39379 59.0739,5.38644 59.0674)),((5.39374 59.2828,5.39544 59.278,5.39656 59.2767,5.40916 59.2764,5.40686 59.2714,5.42182 59.273,5.42157 59.2771,5.41497 59.2844,5.40285 59.2899,5.39739 59.2903,5.39374 59.2828)),((5.39503 62.2611,5.41025 62.2532,5.41022 62.2516,5.41014 62.2458,5.41543 62.2438,5.43607 62.2437,5.45824 62.2379,5.47361 62.2424,5.49037 62.2367,5.49719 62.2369,5.4969 62.2465,5.49039 62.25,5.47913 62.2497,5.46062 62.2543,5.45883 62.256,5.46309 62.2569,5.47855 62.2529,5.49025 62.2534,5.49325 62.2558,5.49187 62.2633,5.47753 62.2692,5.46307 62.2677,5.4446 62.2692,5.43825 62.2717,5.42559 62.2685,5.41685 62.2679,5.41229 62.2634,5.40576 62.2615,5.39503 62.2611)),((5.39624 59.7462,5.39796 59.7415,5.40642 59.7345,5.41456 59.7426,5.41172 59.7459,5.39624 59.7462)),((5.40496 60.1451,5.41387 60.1441,5.4226 60.1468,5.42373 60.1535,5.41971 60.1581,5.41697 60.158,5.41012 60.1472,5.40496 60.1451)),((5.42739 60.0793,5.42823 60.0717,5.43072 60.0679,5.43814 60.0648,5.44196 60.0666,5.43625 60.0757,5.44026 60.0791,5.43082 60.0833,5.42739 60.0793)),((5.45038 59.2469,5.45524 59.2446,5.4532 59.2381,5.46126 59.2327,5.46601 59.2231,5.48038 59.212,5.48715 59.2116,5.49291 59.2146,5.49835 59.2141,5.50152 59.2166,5.50647 59.2163,5.50868 59.2192,5.49645 59.2255,5.50457 59.2305,5.50238 59.2329,5.487 59.2366,5.47824 59.2436,5.47611 59.2483,5.46546 59.2531,5.45383 59.2531,5.45038 59.2469)),((5.45395 62.2212,5.46399 62.2173,5.46451 62.2118,5.46866 62.2106,5.47782 62.2114,5.48253 62.2205,5.46615 62.2242,5.45499 62.2236,5.45395 62.2212)),((5.46225 59.2723,5.46476 59.26,5.47452 59.2551,5.48418 59.2562,5.48527 59.2604,5.48229 59.2649,5.47141 59.271,5.46225 59.2723)),((5.48135 62.3367,5.48316 62.3277,5.49121 62.3206,5.50887 62.3236,5.51968 62.3291,5.52162 62.3319,5.51443 62.3389,5.49578 62.3467,5.48135 62.3367)),((5.49612 58.9184,5.50491 58.9107,5.51334 58.9107,5.52308 58.9134,5.52725 58.9177,5.52199 58.9227,5.51681 58.9246,5.50761 58.9239,5.51242 58.9216,5.51328 58.9191,5.49612 58.9184)),((5.50511 62.3656,5.53074 62.3602,5.52832 62.3542,5.52702 62.3509,5.51668 62.3482,5.51881 62.3446,5.52905 62.3397,5.534 62.3342,5.54228 62.332,5.54969 62.3318,5.56797 62.3369,5.59205 62.3399,5.60504 62.3443,5.6107 62.3539,5.59398 62.362,5.57567 62.3624,5.56147 62.3674,5.5581 62.3778,5.54203 62.3767,5.52752 62.3725,5.50929 62.3697,5.50511 62.3656)),((5.52966 62.2283,5.55873 62.2141,5.56786 62.2124,5.58184 62.1974,5.60975 62.1865,5.61454 62.1872,5.61774 62.1912,5.63132 62.1919,5.63968 62.1946,5.66904 62.1975,5.68486 62.1968,5.69643 62.2006,5.72069 62.202,5.73242 62.205,5.73802 62.2052,5.74533 62.2054,5.77815 62.2069,5.80085 62.2174,5.81853 62.2286,5.81891 62.2378,5.81272 62.2424,5.79788 62.2459,5.79576 62.2525,5.80962 62.2604,5.80918 62.2686,5.82073 62.2699,5.83164 62.2779,5.8362 62.2856,5.83388 62.2906,5.82151 62.2897,5.80913 62.2888,5.80184 62.294,5.77878 62.2881,5.7753 62.2912,5.75971 62.2904,5.7499 62.2875,5.74538 62.288,5.74595 62.2988,5.74316 62.3035,5.75391 62.3039,5.7551 62.3055,5.75234 62.3073,5.73943 62.3079,5.73069 62.3101,5.71764 62.3032,5.71796 62.2986,5.71275 62.2975,5.69648 62.3006,5.68806 62.3037,5.6837 62.3006,5.66486 62.3014,5.6588 62.3051,5.657 62.3049,5.6496 62.3043,5.63885 62.3011,5.56565 62.2981,5.54953 62.2867,5.5496 62.2727,5.56336 62.2645,5.57996 62.2597,5.57732 62.258,5.56695 62.2582,5.5522 62.2611,5.54098 62.2607,5.53384 62.2567,5.53259 62.2528,5.53529 62.2487,5.53766 62.2473,5.54298 62.2442,5.56821 62.2376,5.59494 62.2336,5.61362 62.2334,5.63266 62.2285,5.65081 62.2257,5.65259 62.2239,5.65199 62.2219,5.61882 62.2263,5.6003 62.2311,5.59174 62.2269,5.54909 62.2348,5.53298 62.2317,5.53138 62.2301,5.52966 62.2283)),((5.54478 59.8625,5.55128 59.8591,5.55292 59.8512,5.55368 59.8475,5.56175 59.8456,5.56334 59.8415,5.55838 59.8358,5.56536 59.8294,5.56662 59.8246,5.5774 59.8173,5.58399 59.8187,5.59127 59.8378,5.59704 59.8388,5.58877 59.8474,5.59597 59.8479,5.59672 59.8516,5.61338 59.8583,5.60418 59.8616,5.59436 59.8768,5.58262 59.8815,5.57715 59.8815,5.56731 59.8777,5.56004 59.8721,5.55098 59.8717,5.54478 59.8625)),((5.55777 60.0786,5.56685 60.0764,5.58149 60.0793,5.57739 60.0819,5.56919 60.0816,5.56546 60.0846,5.55958 60.0842,5.55777 60.0786)),((5.56175 59.1003,5.56726 59.0939,5.56568 59.0899,5.57181 59.0851,5.57707 59.0842,5.58463 59.0829,5.59483 59.0914,5.59482 59.0969,5.60301 59.0958,5.60887 59.0927,5.60681 59.0889,5.61968 59.0754,5.63953 59.0765,5.64031 59.0717,5.65696 59.0734,5.67012 59.0801,5.67641 59.0769,5.66292 59.0667,5.66947 59.0647,5.68479 59.0635,5.69336 59.06,5.6987 59.06,5.70708 59.0688,5.70204 59.0725,5.68305 59.08,5.67315 59.089,5.6468 59.095,5.63884 59.1001,5.60824 59.102,5.6047 59.1074,5.59636 59.1093,5.57431 59.1079,5.56175 59.1003)),((5.57196 59.1223,5.57256 59.1186,5.57795 59.1157,5.58551 59.1185,5.59241 59.1172,5.60063 59.1215,5.60749 59.1204,5.62246 59.114,5.6381 59.1074,5.65587 59.105,5.67076 59.0983,5.69166 59.0985,5.70063 59.1009,5.70228 59.0989,5.69832 59.0902,5.70274 59.0877,5.71485 59.0843,5.72044 59.0799,5.72781 59.0784,5.7335 59.0734,5.74787 59.0726,5.75452 59.0699,5.76624 59.0717,5.77974 59.0764,5.78389 59.0812,5.78027 59.0872,5.78125 59.0923,5.77758 59.0958,5.78508 59.0991,5.78635 59.1024,5.78061 59.1134,5.75756 59.1239,5.74185 59.1246,5.73518 59.1274,5.71215 59.1264,5.71019 59.122,5.70358 59.1214,5.70316 59.1157,5.69686 59.1161,5.68787 59.1222,5.6777 59.1245,5.66379 59.1278,5.64538 59.1286,5.64947 59.1336,5.64475 59.1353,5.63224 59.1327,5.62958 59.1298,5.61375 59.1312,5.60655 59.1426,5.58729 59.1376,5.58512 59.1346,5.58812 59.1271,5.5773 59.1278,5.57196 59.1223)),((5.57226 59.8944,5.576 59.8911,5.58465 59.8885,5.58952 59.8839,5.60322 59.8783,5.61054 59.8781,5.61477 59.8801,5.61748 59.8858,5.62091 59.9036,5.60111 59.9239,5.58741 59.913,5.57226 59.8944)),((5.58587 62.4151,5.61606 62.3954,5.61533 62.3912,5.6117 62.3895,5.61602 62.3874,5.62394 62.3872,5.65259 62.3924,5.66186 62.3985,5.67041 62.4087,5.66755 62.4109,5.6421 62.4042,5.63125 62.4042,5.61524 62.4109,5.59493 62.4168,5.58901 62.4168,5.58587 62.4151)),((5.59348 60.6889,5.60675 60.6768,5.60683 60.6819,5.59785 60.6935,5.59433 60.6922,5.59348 60.6889)),((5.60106 62.3316,5.60595 62.3283,5.61679 62.3283,5.62852 62.3232,5.63939 62.3229,5.64879 62.3199,5.65714 62.3199,5.66086 62.3267,5.66635 62.3263,5.66993 62.3227,5.69262 62.3252,5.69889 62.3231,5.72561 62.3251,5.74043 62.3247,5.74513 62.3288,5.73594 62.3335,5.73849 62.3414,5.75414 62.3504,5.75358 62.3648,5.74429 62.3673,5.73658 62.3663,5.72984 62.3626,5.72504 62.3647,5.72541 62.3681,5.70119 62.3659,5.69783 62.3665,5.68895 62.3681,5.68434 62.3664,5.6765 62.3578,5.70045 62.3477,5.69845 62.3451,5.68972 62.3443,5.69052 62.3343,5.68709 62.3314,5.67731 62.3283,5.67181 62.3288,5.66575 62.3324,5.67838 62.3361,5.68194 62.3438,5.68097 62.3465,5.67424 62.3483,5.65301 62.3487,5.63768 62.3462,5.60106 62.3316)),((5.61872 62.3723,5.64499 62.3633,5.65612 62.3616,5.66966 62.3658,5.6779 62.3666,5.6824 62.3745,5.68073 62.3756,5.66229 62.374,5.64581 62.3752,5.63598 62.3806,5.61876 62.3749,5.61872 62.3723)),((5.62161 59.8113,5.6395 59.7995,5.6647 59.7954,5.66403 59.7913,5.6574 59.7874,5.65992 59.7858,5.67493 59.7858,5.68141 59.7879,5.69254 59.7865,5.70346 59.792,5.70717 59.7972,5.71142 59.7962,5.71547 59.7909,5.72437 59.7864,5.72451 59.7828,5.72819 59.7797,5.74111 59.7841,5.74445 59.7831,5.74039 59.7717,5.73033 59.7665,5.73123 59.7638,5.74144 59.7596,5.7306 59.7424,5.73276 59.7364,5.73473 59.7309,5.73759 59.7301,5.74027 59.7247,5.77098 59.7312,5.77342 59.7386,5.79017 59.7616,5.79479 59.7611,5.80525 59.7553,5.82135 59.7569,5.83212 59.7548,5.83656 59.7554,5.83439 59.7691,5.82507 59.7763,5.80932 59.7839,5.80507 59.7875,5.79987 59.7918,5.78453 59.7939,5.76489 59.7945,5.75805 59.7974,5.73852 59.7973,5.73146 59.8044,5.73341 59.812,5.72691 59.8184,5.71915 59.8186,5.71238 59.8211,5.6946 59.8185,5.69309 59.8166,5.70234 59.8128,5.70519 59.8038,5.68948 59.7969,5.68278 59.7962,5.67432 59.8089,5.66774 59.8103,5.65237 59.8041,5.64526 59.8059,5.65031 59.8112,5.6531 59.8191,5.65167 59.8222,5.62451 59.8186,5.62214 59.8164,5.62161 59.8113)),((5.62504 59.3587,5.63296 59.3514,5.62586 59.3509,5.6262 59.3406,5.64342 59.3367,5.65275 59.3511,5.64128 59.3692,5.63678 59.3665,5.63229 59.3638,5.62616 59.3628,5.62504 59.3587)),((5.62528 59.0491,5.63963 59.0345,5.65031 59.0373,5.65818 59.0353,5.66603 59.0446,5.66345 59.0468,5.64446 59.0487,5.6371 59.053,5.62922 59.055,5.62528 59.0491)),((5.63955 59.7329,5.63959 59.7244,5.64589 59.7192,5.67555 59.7154,5.68573 59.7197,5.69596 59.7173,5.69658 59.7171,5.69151 59.7121,5.69574 59.7056,5.70013 59.7065,5.70205 59.7086,5.70943 59.705,5.71912 59.7068,5.71489 59.7133,5.71832 59.7173,5.707 59.7228,5.7105 59.7264,5.70517 59.7285,5.70199 59.7341,5.69034 59.7359,5.65887 59.7479,5.65252 59.7479,5.63955 59.7329)),((5.64413 59.0563,5.66452 59.0512,5.67272 59.0444,5.67454 59.0525,5.67767 59.0552,5.6709 59.0586,5.64413 59.0563)),((5.65963 59.7571,5.68198 59.7427,5.69017 59.7426,5.69602 59.7401,5.7008 59.7414,5.70546 59.7407,5.7148 59.7335,5.71931 59.7364,5.71492 59.7523,5.71237 59.7568,5.7076 59.7582,5.70526 59.7531,5.69786 59.7539,5.69095 59.76,5.67798 59.7588,5.66686 59.763,5.65963 59.7571)),((5.66256 59.2767,5.668 59.2735,5.66939 59.2626,5.67577 59.2642,5.67441 59.2726,5.67642 59.2768,5.67409 59.2829,5.66965 59.2827,5.66256 59.2767)),((5.67025 59.9336,5.67593 59.913,5.68053 59.9099,5.68372 59.9156,5.68127 59.9194,5.6831 59.9305,5.68594 59.9327,5.67952 59.9356,5.67025 59.9336)),((5.682 59.0448,5.68968 59.0385,5.70093 59.0348,5.70859 59.0342,5.72004 59.0377,5.75673 59.039,5.77652 59.046,5.77146 59.0499,5.76186 59.0516,5.73844 59.0506,5.73458 59.0525,5.72902 59.0511,5.72086 59.0437,5.71195 59.041,5.70154 59.0422,5.6978 59.0489,5.69452 59.0499,5.68801 59.049,5.682 59.0448)),((5.70251 59.9262,5.70489 59.9229,5.71017 59.9212,5.71546 59.9224,5.72167 59.9263,5.72802 59.9266,5.72465 59.9388,5.71872 59.9416,5.71214 59.9399,5.70861 59.9336,5.70403 59.9309,5.70251 59.9262)),((5.70752 59.0018,5.71161 58.9928,5.7136 58.9915,5.7215 58.9948,5.72738 58.9942,5.72682 58.9893,5.73415 58.985,5.73909 58.9875,5.73716 58.9941,5.74726 58.992,5.7516 58.9926,5.75162 58.9982,5.74814 59.0033,5.75345 59.0063,5.75175 59.0142,5.74303 59.0132,5.73423 59.0098,5.71975 59.0115,5.71569 59.0063,5.70918 59.0053,5.70752 59.0018)),((5.71981 59.683,5.72519 59.6777,5.72391 59.6744,5.72885 59.6719,5.73238 59.6725,5.73078 59.6768,5.73322 59.6785,5.74726 59.6814,5.73448 59.6847,5.72746 59.6833,5.72075 59.6855,5.71981 59.683)),((5.77273 59.1606,5.77963 59.1508,5.77861 59.1459,5.78207 59.1438,5.79439 59.142,5.80386 59.1385,5.82386 59.1446,5.82723 59.1401,5.83377 59.1411,5.84162 59.1393,5.84298 59.1449,5.84986 59.1465,5.84967 59.1507,5.86378 59.1632,5.87669 59.1662,5.87968 59.1815,5.87604 59.1877,5.87128 59.1896,5.86056 59.1896,5.85163 59.1925,5.83782 59.2009,5.8257 59.2013,5.8167 59.1989,5.81409 59.1955,5.80928 59.1949,5.80895 59.1885,5.80621 59.1861,5.80808 59.1769,5.81234 59.1725,5.80998 59.1702,5.80158 59.17,5.79691 59.1657,5.79281 59.1662,5.78417 59.1757,5.77938 59.1778,5.77567 59.1758,5.77575 59.1669,5.77273 59.1606)),((5.77606 62.3235,5.78824 62.3242,5.79556 62.3209,5.79163 62.3103,5.79324 62.3067,5.77652 62.3011,5.77965 62.3,5.79468 62.3013,5.80251 62.2986,5.81335 62.3013,5.81978 62.3011,5.82187 62.3032,5.81607 62.3055,5.82988 62.3081,5.83424 62.3142,5.84968 62.3102,5.84088 62.3042,5.84759 62.2966,5.84327 62.2903,5.84456 62.2885,5.85349 62.2909,5.86093 62.2905,5.87207 62.2799,5.86582 62.2726,5.86428 62.2709,5.8559 62.2653,5.84355 62.2658,5.83986 62.2615,5.82823 62.2606,5.82386 62.2575,5.81361 62.2543,5.8153 62.253,5.84638 62.2521,5.86047 62.2558,5.86813 62.2541,5.90146 62.2544,5.91697 62.2584,5.92461 62.2625,5.93568 62.2755,5.95375 62.2819,5.95756 62.2915,5.9582 62.2917,5.97235 62.297,6.00086 62.3029,6.05969 62.3276,6.08005 62.3384,6.12689 62.3529,6.12795 62.3555,6.12593 62.3588,6.09975 62.3563,6.08788 62.3526,6.08243 62.3509,6.07836 62.3517,6.07769 62.3528,6.08967 62.3578,6.08752 62.3619,6.04354 62.3718,6.03724 62.377,6.04199 62.3841,6.04033 62.3881,6.02751 62.3941,6.01702 62.4068,6.01058 62.4247,6.00722 62.4271,6.00036 62.4238,5.95807 62.4272,5.94634 62.4281,5.93061 62.4277,5.90896 62.4244,5.86425 62.4118,5.85205 62.3967,5.82382 62.3803,5.82238 62.3658,5.83249 62.3529,5.82956 62.3471,5.82139 62.3431,5.82309 62.3424,5.82509 62.3416,5.84326 62.3418,5.84659 62.3454,5.85449 62.3452,5.86239 62.3336,5.86976 62.3279,5.86733 62.3248,5.85871 62.3206,5.85375 62.3209,5.85508 62.3246,5.85228 62.3266,5.84377 62.3274,5.8399 62.3328,5.83624 62.334,5.8161 62.331,5.78872 62.33,5.77606 62.3235)),((5.78101 59.0033,5.79583 58.9908,5.79415 58.9988,5.78845 59.0068,5.78331 59.0084,5.78101 59.0033)),((5.78829 59.2516,5.79323 59.2459,5.80332 59.2442,5.80591 59.242,5.81779 59.2432,5.82191 59.2512,5.83482 59.2544,5.84419 59.2603,5.84781 59.26,5.85461 59.2509,5.86422 59.2494,5.8766 59.2504,5.88284 59.2534,5.88768 59.2655,5.87402 59.2785,5.86474 59.2807,5.86105 59.2785,5.8605 59.2734,5.85055 59.2711,5.8462 59.2675,5.84131 59.2673,5.83508 59.2728,5.82714 59.272,5.82268 59.2691,5.82244 59.2672,5.82187 59.2629,5.8115 59.2634,5.80991 59.2649,5.79464 59.2624,5.79706 59.2584,5.78829 59.2516)),((5.79234 59.9381,5.79536 59.9364,5.82856 59.9458,5.84547 59.9485,5.86548 59.9617,5.89282 59.9639,5.90034 59.9683,5.91418 59.9675,5.92386 59.9688,5.9285 59.9694,5.94602 59.9655,5.95066 59.968,5.95562 59.9772,5.95023 59.9825,5.94078 59.9844,5.92642 59.9827,5.89034 59.9709,5.86623 59.9649,5.8547 59.9594,5.83527 59.9552,5.83284 59.9533,5.82111 59.9524,5.79234 59.9381)),((5.79309 59.2326,5.79752 59.23,5.83473 59.2207,5.83478 59.229,5.82515 59.2277,5.81034 59.2337,5.80197 59.2329,5.79595 59.2343,5.79309 59.2326)),((5.79492 59.1216,5.79754 59.1134,5.80892 59.1118,5.81852 59.1074,5.82376 59.1081,5.82821 59.1053,5.8354 59.1049,5.84039 59.1014,5.8449 59.1039,5.85714 59.1025,5.85942 59.1079,5.85335 59.1155,5.8465 59.1166,5.83391 59.1144,5.81338 59.1175,5.80757 59.1205,5.79492 59.1216)),((5.79876 59.0857,5.80335 59.082,5.81554 59.0809,5.82219 59.0782,5.82613 59.0843,5.81323 59.09,5.79934 59.0905,5.79876 59.0857)),((5.80137 58.9582,5.80264 58.9558,5.81221 58.9541,5.81144 58.9476,5.82598 58.9425,5.83273 58.9419,5.83925 58.9456,5.84186 58.9516,5.83979 58.9564,5.8332 58.9646,5.82567 58.9645,5.81848 58.9594,5.80137 58.9582)),((5.81366 59.053,5.82003 59.0464,5.82026 59.0421,5.83191 59.0386,5.83751 59.0398,5.83691 59.0437,5.8335 59.0456,5.83763 59.0476,5.82255 59.0559,5.81511 59.0552,5.81366 59.053)),((5.82309 58.9896,5.83386 58.9832,5.8318 58.9765,5.83656 58.9744,5.84178 58.975,5.84388 58.9815,5.83514 58.9892,5.82516 58.9906,5.82309 58.9896)),((5.84311 59.2243,5.84856 59.2208,5.85256 59.221,5.85007 59.2255,5.85885 59.2323,5.85576 59.2349,5.84373 59.2346,5.84311 59.2243)),((5.86381 62.2362,5.87276 62.2327,5.88003 62.2332,5.90399 62.2423,5.917 62.2524,5.91159 62.2524,5.89413 62.2484,5.88524 62.2487,5.8739 62.2433,5.87692 62.2399,5.87329 62.2382,5.86586 62.2386,5.86381 62.2362)),((5.86662 58.4284,5.87174 58.4263,5.88291 58.4362,5.88286 58.4394,5.88752 58.4433,5.8772 58.4422,5.87357 58.4402,5.86662 58.4284)),((5.87641 59.1276,5.8774 59.1232,5.87791 59.1208,5.88588 59.1211,5.88918 59.1229,5.89063 59.1193,5.88823 59.1146,5.89498 59.1142,5.89846 59.1205,5.91218 59.1211,5.93583 59.1296,5.94062 59.1332,5.94737 59.1328,5.9502 59.1347,5.94524 59.138,5.94683 59.1422,5.92905 59.1594,5.91844 59.1587,5.904 59.154,5.89887 59.1497,5.90209 59.1317,5.89971 59.1297,5.8882 59.1293,5.88515 59.1317,5.87641 59.1276)),((5.88031 59.2409,5.89012 59.2266,5.89401 59.2275,5.89856 59.2327,5.90201 59.2335,5.90323 59.2373,5.90082 59.2413,5.88031 59.2409)),((5.88401 58.4232,5.89265 58.4238,5.89643 58.4219,5.90214 58.4216,5.91127 58.4248,5.91683 58.4284,5.91594 58.4319,5.9127 58.4443,5.91587 58.4522,5.91874 58.4535,5.92815 58.4491,5.93144 58.4533,5.93675 58.4529,5.93844 58.4474,5.94715 58.4388,5.94386 58.4346,5.94946 58.4263,5.95491 58.4249,5.95114 58.4209,5.97516 58.412,5.96873 58.4083,5.97367 58.4074,5.98315 58.4082,5.98665 58.4111,5.982 58.416,5.986 58.4184,5.99074 58.4158,5.99635 58.4163,5.9941 58.422,5.98886 58.4256,5.99282 58.4283,5.99145 58.4317,5.98303 58.4355,5.98436 58.4383,5.99097 58.4409,5.98629 58.443,5.98641 58.448,5.98044 58.4588,5.96472 58.4646,5.95165 58.4643,5.92541 58.4586,5.91762 58.4581,5.9126 58.4595,5.89847 58.4518,5.9028 58.4462,5.89706 58.4379,5.89129 58.4356,5.89896 58.4311,5.88538 58.4285,5.88401 58.4232)),((5.88617 62.2288,5.89061 62.2258,5.90125 62.2266,5.90797 62.2333,5.90567 62.2353,5.89311 62.2341,5.88617 62.2288)),((5.88698 59.0274,5.89891 59.0191,5.9021 59.0273,5.90046 59.0293,5.892 59.0294,5.88698 59.0274)),((5.90009 58.9912,5.90295 58.9899,5.91235 58.9894,5.92438 58.9832,5.93423 58.9827,5.9397 58.9788,5.95525 58.9757,5.9641 58.9759,5.96527 58.9828,5.95632 58.9921,5.94375 58.9959,5.932 58.9973,5.92582 59,5.90394 58.995,5.90009 58.9912)),((5.92137 59.2036,5.93252 59.2008,5.94523 59.1878,5.95888 59.186,5.95807 59.1825,5.96873 59.1771,5.97515 59.1789,5.97728 59.1854,5.97153 59.1939,5.95947 59.1968,5.94881 59.2111,5.94235 59.2124,5.93586 59.211,5.93075 59.2065,5.92283 59.2057,5.92137 59.2036)),((5.92138 59.2646,5.93245 59.2478,5.93003 59.2374,5.92662 59.2334,5.93036 59.2324,5.93359 59.2346,5.93657 59.2326,5.93351 59.2293,5.93683 59.228,5.9451 59.2265,5.97186 59.2269,5.97702 59.2288,5.98542 59.2318,5.99649 59.2325,6.00879 59.2369,6.01515 59.2362,6.06944 59.2438,6.08842 59.2514,6.09714 59.2529,6.10605 59.2592,6.10756 59.2641,6.10368 59.2752,6.0683 59.2933,6.05652 59.2972,6.05445 59.2974,6.04748 59.2978,6.02187 59.2924,6.01628 59.2938,6.00964 59.2933,6.00205 59.2903,5.994 59.2902,5.98472 59.2923,5.9701 59.2913,5.96367 59.2894,5.9593 59.2858,5.94992 59.2857,5.94439 59.2779,5.93703 59.2792,5.9316 59.2767,5.92138 59.2646)),((5.9286 60.1406,5.93072 60.1271,5.94476 60.105,5.95513 60.1003,5.95985 60.0936,5.97233 60.093,5.97311 60.0909,5.96348 60.0851,5.96467 60.0796,5.96508 60.0778,5.97049 60.0725,5.97508 60.0724,5.97952 60.0793,5.99441 60.0837,5.99229 60.0914,6.00823 60.101,6.02205 60.1066,6.03573 60.116,6.03973 60.1228,6.04622 60.1254,6.05556 60.1333,6.05865 60.149,6.06164 60.1505,6.03686 60.1652,6.02238 60.1697,6.01616 60.1694,6.00048 60.1686,5.98151 60.1635,5.9286 60.1406)),((5.93312 59.1735,5.93655 59.1686,5.93595 59.1638,5.93944 59.1614,5.95056 59.1616,5.94939 59.1664,5.94244 59.1739,5.9352 59.1745,5.93312 59.1735)),((5.93996 62.4716,5.9419 62.4689,5.97147 62.4651,5.98484 62.4634,6.00425 62.4684,6.02915 62.4702,6.03886 62.4683,6.04419 62.4689,6.05031 62.4737,6.05228 62.4827,6.03768 62.4872,6.02211 62.4858,5.97411 62.4919,5.96218 62.4834,5.9478 62.4779,5.93996 62.4716)),((5.95137 59.3376,5.95783 59.3335,5.95698 59.3302,5.96181 59.3309,5.96705 59.3348,5.97949 59.3325,5.98425 59.3366,5.985 59.3405,5.97522 59.3429,5.96854 59.3397,5.95301 59.3386,5.95137 59.3376)),((5.96982 59.164,5.97075 59.1608,5.97697 59.1581,5.98906 59.1636,5.98585 59.1671,5.97484 59.1662,5.96982 59.164)),((5.97166 58.9787,5.98728 58.9722,5.99382 58.9729,5.99996 58.9764,5.99388 58.9784,5.99493 58.9803,6.00748 58.9824,6.00724 58.987,6.00156 58.9923,5.9912 58.9962,5.97672 58.9892,5.97166 58.9787)),((5.9855 58.9251,5.99104 58.9178,5.99543 58.9209,6.00211 58.9207,6.00489 58.9139,6.01062 58.9112,6.02535 58.9074,6.03137 58.9086,6.02222 58.9194,6.01454 58.9205,6.00173 58.9262,5.99511 58.9349,5.99169 58.9341,5.9855 58.9251)),((5.99137 59.2073,6.00638 59.1996,6.01556 59.2009,6.01785 59.1975,6.01482 59.194,6.00908 59.1935,6.01131 59.1876,6.00749 59.1863,5.99919 59.1881,5.99394 59.1874,5.99142 59.1834,5.99794 59.1786,6.01242 59.1744,6.0163 59.1812,6.02995 59.1884,6.03537 59.1879,6.03783 59.1834,6.04534 59.1839,6.05811 59.2,6.06812 59.2018,6.07464 59.2059,6.07987 59.2128,6.09094 59.2164,6.10261 59.2281,6.09944 59.2315,6.08365 59.2324,6.07456 59.2305,6.07018 59.2328,6.06188 59.2316,6.06071 59.2244,6.05251 59.2225,6.04598 59.2184,6.00704 59.2189,6.00297 59.2162,6.00162 59.2104,5.99137 59.2073)),((6.01409 62.5455,6.02255 62.5364,6.02819 62.5352,6.06694 62.5405,6.07232 62.5469,6.07733 62.5496,6.08631 62.5492,6.0923 62.5519,6.09915 62.5524,6.10764 62.549,6.108 62.5486,6.11557 62.5399,6.12866 62.5326,6.14051 62.5328,6.14193 62.5392,6.13264 62.5476,6.13398 62.5515,6.14351 62.5599,6.12897 62.5669,6.12803 62.5697,6.13109 62.5782,6.14059 62.5838,6.12741 62.5916,6.10714 62.5912,6.10213 62.5885,6.07939 62.5857,6.09608 62.5794,6.10624 62.5755,6.10556 62.5737,6.08569 62.5709,6.07253 62.5725,6.06316 62.5692,6.04436 62.5661,6.03617 62.5587,6.02189 62.5552,6.02079 62.5528,6.03152 62.548,6.04262 62.5467,6.04368 62.5433,6.03641 62.5424,6.01837 62.5466,6.01409 62.5455)),((6.02745 62.513,6.04536 62.5006,6.06684 62.4993,6.07604 62.5065,6.07427 62.5172,6.05959 62.5132,6.0351 62.5146,6.02882 62.5167,6.02745 62.513)),((6.0309 59.4671,6.05761 59.4721,6.05913 59.474,6.03541 59.473,6.0309 59.4671)),((6.06587 62.4365,6.08295 62.4193,6.0848 62.4174,6.12155 62.4038,6.1459 62.3996,6.17964 62.3983,6.21644 62.3993,6.26709 62.4063,6.2927 62.4065,6.30845 62.4097,6.32793 62.4113,6.33142 62.4142,6.33755 62.416,6.34452 62.4155,6.36793 62.4204,6.37108 62.4224,6.3709 62.4267,6.36391 62.4336,6.34856 62.4308,6.33341 62.4317,6.31419 62.4328,6.3059 62.4259,6.28735 62.4278,6.29992 62.4326,6.30141 62.4388,6.29316 62.4411,6.29422 62.4468,6.31096 62.444,6.31978 62.4507,6.3155 62.4528,6.30592 62.4509,6.29206 62.4511,6.28609 62.4452,6.27153 62.4468,6.26381 62.4456,6.25097 62.4394,6.24566 62.4418,6.24814 62.4448,6.24367 62.4481,6.24852 62.4517,6.24623 62.4537,6.24042 62.4539,6.23083 62.4543,6.22113 62.4563,6.21575 62.4529,6.2293 62.4515,6.23159 62.4495,6.22984 62.4481,6.19914 62.4487,6.19928 62.4448,6.13138 62.4433,6.09272 62.4443,6.08011 62.4429,6.06587 62.4365)),((6.09583 62.4584,6.0987 62.4559,6.10864 62.4556,6.11971 62.4574,6.14085 62.4549,6.16746 62.4583,6.17189 62.4615,6.16797 62.4643,6.13204 62.4635,6.12471 62.466,6.1231 62.4698,6.1926 62.4709,6.20533 62.4686,6.21948 62.4727,6.23701 62.4712,6.24928 62.4749,6.2703 62.4763,6.26301 62.4817,6.25577 62.4813,6.2444 62.4807,6.21507 62.4817,6.20582 62.4839,6.17234 62.48,6.13938 62.4791,6.12659 62.4757,6.10274 62.4735,6.09929 62.4704,6.10151 62.4659,6.09583 62.4584)),((6.10008 62.5137,6.10438 62.5086,6.10158 62.5046,6.10989 62.4992,6.11696 62.4983,6.12297 62.4948,6.13894 62.497,6.14573 62.5038,6.14187 62.5154,6.14658 62.5229,6.13542 62.5246,6.12861 62.5298,6.1204 62.5286,6.11089 62.5292,6.10252 62.5259,6.10452 62.5198,6.10008 62.5137)),((6.13202 62.63,6.1517 62.619,6.15708 62.6135,6.17431 62.6113,6.18238 62.6075,6.18701 62.6069,6.19808 62.6055,6.20864 62.5985,6.23194 62.6048,6.22853 62.6198,6.20816 62.6322,6.18924 62.6386,6.17467 62.6365,6.15433 62.6425,6.14946 62.6419,6.14104 62.6356,6.13207 62.6328,6.13202 62.63)),((6.15573 62.5092,6.15891 62.508,6.17782 62.5164,6.17317 62.5176,6.16283 62.5143,6.15573 62.5092)),((6.16952 62.6682,6.17959 62.6582,6.17786 62.6536,6.19468 62.6533,6.20576 62.6532,6.22061 62.6505,6.26309 62.6304,6.27474 62.6289,6.28148 62.6303,6.28904 62.6358,6.28857 62.6388,6.27443 62.6434,6.25644 62.6533,6.25004 62.6622,6.22489 62.6671,6.20328 62.6808,6.19105 62.6857,6.18465 62.6852,6.17954 62.683,6.17745 62.6744,6.16952 62.6682)),((6.17441 62.4948,6.18317 62.4925,6.19838 62.4933,6.20966 62.4969,6.21874 62.4958,6.22606 62.4995,6.24448 62.4988,6.26245 62.4945,6.27229 62.4949,6.29157 62.4887,6.29774 62.4902,6.30969 62.4897,6.3206 62.4958,6.35067 62.4964,6.36658 62.4989,6.37354 62.4987,6.3825 62.4951,6.41047 62.5029,6.4625 62.5119,6.46528 62.5132,6.46726 62.5196,6.46497 62.5216,6.45555 62.5218,6.4283 62.5188,6.41437 62.5129,6.41227 62.5131,6.40383 62.5139,6.39388 62.5111,6.3732 62.5136,6.36471 62.5078,6.3299 62.5121,6.31859 62.518,6.29901 62.5166,6.28691 62.518,6.27807 62.5145,6.25651 62.5163,6.24723 62.5156,6.23806 62.5079,6.21784 62.5045,6.1929 62.5027,6.17759 62.4961,6.17441 62.4948)),((6.19717 62.5253,6.20003 62.5229,6.21866 62.5302,6.21652 62.5342,6.2075 62.5318,6.19717 62.5253)),((6.22992 62.5525,6.23586 62.5495,6.24472 62.5498,6.24546 62.5576,6.26258 62.5683,6.265 62.5718,6.26164 62.5742,6.25502 62.5722,6.24805 62.5724,6.24157 62.5603,6.23146 62.5553,6.22992 62.5525)),((6.23221 62.6896,6.23606 62.6842,6.26384 62.6723,6.26757 62.6695,6.27401 62.6646,6.28784 62.6621,6.30313 62.6535,6.31645 62.6509,6.34333 62.6507,6.34767 62.6515,6.35783 62.6596,6.36173 62.6728,6.35946 62.6746,6.34949 62.6747,6.34125 62.6797,6.3195 62.682,6.28589 62.69,6.27681 62.6876,6.26867 62.6887,6.235 62.697,6.23221 62.6896)),((6.24798 62.4675,6.24891 62.4648,6.2645 62.463,6.26104 62.4598,6.26062 62.4594,6.26382 62.458,6.29557 62.4602,6.31136 62.4634,6.32831 62.4624,6.34336 62.4641,6.3506 62.462,6.3611 62.458,6.35226 62.4545,6.3529 62.4504,6.3602 62.4479,6.36407 62.4421,6.35404 62.4399,6.35525 62.4354,6.38 62.4348,6.38863 62.4365,6.39508 62.4298,6.40455 62.4324,6.40623 62.4311,6.3966 62.4232,6.40031 62.4215,6.40921 62.4213,6.42755 62.4304,6.43993 62.4333,6.4475 62.4322,6.4524 62.4292,6.459 62.4312,6.47341 62.4305,6.48432 62.4334,6.4947 62.4333,6.52266 62.4376,6.53766 62.4362,6.56319 62.4437,6.57149 62.4476,6.5837 62.4485,6.59531 62.4534,6.59891 62.454,6.60497 62.4549,6.61009 62.4603,6.62572 62.4615,6.62315 62.4655,6.63376 62.4672,6.65087 62.465,6.6754 62.4729,6.68074 62.4769,6.68788 62.4787,6.70394 62.4872,6.71565 62.4883,6.72264 62.4912,6.72136 62.4933,6.68885 62.4925,6.68416 62.4908,6.68063 62.4845,6.66437 62.4842,6.64996 62.4881,6.64192 62.4924,6.6414 62.4932,6.6375 62.4989,6.63291 62.4999,6.62599 62.4965,6.62012 62.4961,6.60423 62.4999,6.60103 62.5049,6.59689 62.5061,6.58725 62.4978,6.57703 62.5,6.5545 62.4986,6.53991 62.5036,6.52933 62.5049,6.52709 62.5067,6.53226 62.5084,6.52985 62.5113,6.51923 62.5096,6.5137 62.5069,6.51259 62.5012,6.50637 62.4998,6.49983 62.5005,6.48818 62.5056,6.48333 62.505,6.47059 62.4978,6.46054 62.4956,6.45612 62.4958,6.44462 62.4962,6.41641 62.4932,6.39951 62.4874,6.38708 62.4879,6.38093 62.4861,6.37603 62.4763,6.3728 62.4749,6.34366 62.4748,6.3342 62.4784,6.31216 62.474,6.28022 62.4729,6.27037 62.4696,6.25545 62.4703,6.24798 62.4675)),((6.25248 62.554,6.26447 62.5503,6.26998 62.553,6.26979 62.5635,6.26296 62.5628,6.25248 62.554)),((6.318 62.4369,6.34028 62.4333,6.34459 62.4341,6.3426 62.4436,6.33621 62.4466,6.32892 62.4459,6.318 62.4369)),((6.3264 62.7044,6.32864 62.7029,6.3516 62.6993,6.36052 62.6964,6.36932 62.6973,6.39018 62.6908,6.40491 62.6861,6.43525 62.6894,6.44186 62.6949,6.44343 62.7041,6.43233 62.7115,6.42475 62.7122,6.42139 62.7146,6.39305 62.7112,6.38742 62.7089,6.37925 62.7102,6.33195 62.7071,6.3264 62.7044)),((6.3451 62.4877,6.35072 62.4865,6.3713 62.4908,6.36603 62.493,6.34577 62.4898,6.3451 62.4877)),((6.36394 62.7475,6.36777 62.7454,6.38831 62.7479,6.38806 62.7495,6.37265 62.7524,6.36394 62.7475)),((6.38328 62.7546,6.38887 62.7538,6.40985 62.7568,6.41067 62.758,6.39787 62.7601,6.38391 62.7569,6.38328 62.7546)),((6.4151 62.7648,6.41737 62.763,6.43416 62.7586,6.45113 62.7542,6.45195 62.7522,6.44068 62.7509,6.43614 62.7448,6.43089 62.7433,6.4316 62.7387,6.44289 62.7302,6.44951 62.7292,6.44752 62.726,6.45251 62.7227,6.46047 62.7227,6.47216 62.7245,6.49967 62.7498,6.48284 62.7653,6.48485 62.7782,6.48246 62.7841,6.47511 62.7832,6.47047 62.7874,6.45316 62.7831,6.44957 62.7773,6.43254 62.7713,6.41613 62.7678,6.4151 62.7648)),((6.49161 62.7993,6.49539 62.7941,6.50699 62.7933,6.51542 62.797,6.51745 62.8001,6.51451 62.803,6.50823 62.8016,6.49311 62.8025,6.49161 62.7993)),((6.50204 58.2266,6.51352 58.2218,6.5216 58.223,6.52365 58.2272,6.52949 58.229,6.52613 58.2314,6.503 58.2292,6.50204 58.2266)),((6.52366 62.8184,6.53421 62.8114,6.54206 62.8123,6.5447 62.8147,6.54133 62.8171,6.52729 62.8208,6.52366 62.8184)),((6.52494 62.6392,6.52903 62.6384,6.56247 62.6472,6.56365 62.6493,6.55862 62.653,6.54905 62.6539,6.52591 62.6426,6.52494 62.6392)),((6.52655 58.2349,6.5366 58.2343,6.53967 58.2308,6.53795 58.2241,6.54032 58.2225,6.54682 58.2225,6.54836 58.2208,6.54074 58.2193,6.53888 58.217,6.55273 58.2106,6.5661 58.2111,6.56974 58.2165,6.55976 58.2331,6.56413 58.2328,6.58036 58.2148,6.58817 58.2048,6.5938 58.2015,6.60663 58.1995,6.61865 58.2004,6.62309 58.1996,6.62707 58.1956,6.63434 58.1964,6.63695 58.1996,6.63222 58.2061,6.64117 58.2174,6.63753 58.2221,6.62291 58.2312,6.60714 58.2357,6.57746 58.2404,6.55047 58.241,6.53906 58.2429,6.53185 58.244,6.52655 58.2349)),((6.55872 62.5134,6.56096 62.5116,6.57469 62.5091,6.58309 62.5091,6.59345 62.5127,6.59413 62.5147,6.57656 62.5165,6.56337 62.5154,6.55872 62.5134)),((6.5799 62.6636,6.59017 62.6614,6.58056 62.6558,6.58005 62.6526,6.58903 62.649,6.59817 62.6476,6.6145 62.6548,6.62468 62.6565,6.64282 62.6548,6.66003 62.6594,6.67526 62.6606,6.67697 62.6624,6.6682 62.6711,6.66594 62.6733,6.65214 62.6759,6.65065 62.6893,6.65996 62.7038,6.65368 62.7059,6.64462 62.6999,6.61305 62.6879,6.61186 62.6826,6.60421 62.6806,6.60121 62.6773,6.60413 62.6744,6.60249 62.672,6.58839 62.6666,6.58252 62.6659,6.5799 62.6636)),((6.58341 62.823,6.58637 62.8199,6.59393 62.8128,6.60245 62.8126,6.60406 62.8151,6.60139 62.8196,6.60934 62.8233,6.60087 62.8265,6.59607 62.8252,6.58657 62.8286,6.58341 62.823)),((6.59117 62.628,6.59529 62.627,6.62177 62.6292,6.62345 62.6313,6.61972 62.633,6.59906 62.6316,6.5933 62.6303,6.59117 62.628)),((6.63737 62.7825,6.64404 62.7779,6.65275 62.7798,6.66569 62.78,6.67052 62.7845,6.6672 62.7867,6.64134 62.7861,6.63737 62.7825)),((6.65306 62.7169,6.65773 62.7122,6.66995 62.7172,6.67916 62.7188,6.67645 62.7203,6.66019 62.7192,6.65306 62.7169)),((6.65364 58.225,6.65444 58.2154,6.65969 58.2082,6.65369 58.2009,6.65608 58.1992,6.66327 58.2006,6.684 58.2148,6.68563 58.219,6.67733 58.2263,6.67929 58.2314,6.67652 58.2327,6.65591 58.2276,6.65364 58.225)),((6.66224 62.6883,6.66759 62.6857,6.66982 62.6808,6.67995 62.676,6.67831 62.6703,6.68637 62.6662,6.68637 62.6627,6.69049 62.6617,6.6998 62.6627,6.70952 62.6676,6.72628 62.6685,6.75021 62.675,6.77278 62.6795,6.79804 62.6846,6.81861 62.6869,6.82524 62.6857,6.85404 62.6895,6.86703 62.6926,6.89306 62.695,6.94167 62.7104,6.94095 62.7156,6.94556 62.7219,6.93844 62.7302,6.9434 62.734,6.93228 62.7423,6.93112 62.7474,6.9298 62.753,6.90386 62.7461,6.89427 62.747,6.86892 62.743,6.8552 62.7449,6.84544 62.7435,6.82117 62.7354,6.80993 62.734,6.78001 62.7342,6.76146 62.7316,6.75015 62.7272,6.74172 62.72,6.7395 62.7147,6.74178 62.7093,6.73788 62.7053,6.73253 62.7044,6.72628 62.7063,6.73273 62.7168,6.73511 62.7278,6.74519 62.7339,6.74103 62.7351,6.72976 62.7339,6.72665 62.7347,6.72807 62.7386,6.71689 62.7435,6.70165 62.7353,6.68169 62.7287,6.68649 62.7266,6.69581 62.7276,6.70374 62.7244,6.69874 62.7229,6.68752 62.7195,6.68544 62.7167,6.6944 62.7133,6.69711 62.7084,6.70465 62.7045,6.69419 62.6978,6.66224 62.6883)),((6.7711 62.8102,6.77404 62.807,6.80566 62.8059,6.83105 62.7994,6.84255 62.7992,6.84266 62.7949,6.84904 62.7921,6.85942 62.7929,6.86397 62.7889,6.86296 62.7854,6.86729 62.783,6.87855 62.7829,6.88278 62.7828,6.8942 62.776,6.92032 62.7747,6.93135 62.7959,6.93743 62.7988,6.93467 62.8008,6.91099 62.7987,6.90564 62.8013,6.9073 62.8073,6.91777 62.811,6.9145 62.813,6.90044 62.8135,6.89565 62.8157,6.89835 62.8178,6.91489 62.8174,6.93489 62.8136,6.95054 62.8195,6.96104 62.8267,6.96321 62.8327,6.96003 62.8413,6.96647 62.8465,6.97172 62.8508,6.96782 62.8536,6.94643 62.8601,6.93728 62.8576,6.93006 62.8592,6.90825 62.8542,6.89445 62.8493,6.88076 62.8399,6.87299 62.8383,6.86361 62.841,6.84617 62.8513,6.81352 62.8558,6.80069 62.8477,6.78651 62.8454,6.78701 62.842,6.79897 62.8352,6.81845 62.8283,6.81831 62.8258,6.79876 62.8192,6.78643 62.8216,6.77904 62.8209,6.77685 62.8188,6.78493 62.8147,6.79544 62.8145,6.79318 62.8129,6.7711 62.8102)),((6.77717 62.7957,6.78787 62.7942,6.78889 62.7906,6.79266 62.7886,6.79853 62.7929,6.79245 62.7971,6.77996 62.7972,6.77717 62.7957)),((6.81523 62.8929,6.82064 62.8901,6.83827 62.8964,6.83555 62.8979,6.81906 62.8976,6.81523 62.8929)),((6.86054 58.0759,6.87433 58.069,6.87301 58.0621,6.87649 58.0583,6.8813 58.0578,6.88478 58.0611,6.88141 58.064,6.89412 58.0731,6.88914 58.075,6.88512 58.0726,6.8728 58.0744,6.86723 58.0777,6.86109 58.0784,6.86054 58.0759)),((6.87273 62.6697,6.87456 62.6672,6.89243 62.6709,6.91544 62.6734,6.92407 62.6758,6.92666 62.6786,6.92229 62.6814,6.91626 62.6819,6.87809 62.674,6.87273 62.6697)),((6.903 58.0603,6.90951 58.0564,6.92815 58.0593,6.92363 58.0647,6.91354 58.066,6.91141 58.0622,6.90345 58.0638,6.903 58.0603)),((6.94748 62.9393,6.94879 62.9371,6.97048 62.9397,6.97054 62.9429,6.96299 62.9432,6.94748 62.9393)),((6.98215 58.0188,6.98306 58.0147,6.99871 58.0136,6.999 58.0221,6.98215 58.0188)),((7.00547 58.0257,7.00802 58.0187,7.01599 58.0206,7.02087 58.0157,7.02391 58.0155,7.02568 58.0188,7.02227 58.0258,7.01337 58.0283,7.00547 58.0257)),((7.12347 62.7127,7.12709 62.7117,7.14382 62.7131,7.15187 62.7124,7.15864 62.7139,7.18072 62.7125,7.18246 62.7143,7.17916 62.7168,7.16808 62.7178,7.16437 62.7196,7.12474 62.7144,7.12347 62.7127)),((7.12508 62.8251,7.13191 62.8225,7.1408 62.8232,7.14553 62.8291,7.1369 62.8263,7.12521 62.8278,7.12508 62.8251)),((7.12806 62.8327,7.13393 62.8299,7.14227 62.8311,7.15324 62.835,7.15051 62.8368,7.12806 62.8327)),((7.17233 58.037,7.17414 58.0286,7.17795 58.0292,7.17936 58.032,7.18831 58.029,7.19091 58.0328,7.1869 58.0416,7.18309 58.041,7.18132 58.0375,7.17233 58.037)),((7.19261 62.7167,7.19914 62.7162,7.21507 62.72,7.24567 62.722,7.2464 62.7241,7.24476 62.7252,7.20929 62.7224,7.19339 62.7183,7.19261 62.7167)),((7.2091 62.7084,7.21126 62.7071,7.2506 62.7107,7.35023 62.7295,7.31216 62.7354,7.27614 62.7329,7.27161 62.7293,7.27846 62.7263,7.29714 62.7243,7.28638 62.7225,7.26399 62.7188,7.25442 62.7158,7.24345 62.716,7.23342 62.7127,7.22056 62.7122,7.2091 62.7084)),((7.22842 62.6625,7.23812 62.6605,7.24018 62.6521,7.24639 62.6502,7.277 62.6475,7.30782 62.6472,7.34723 62.6496,7.37659 62.6531,7.39893 62.6612,7.39768 62.6633,7.3872 62.6637,7.37872 62.668,7.37703 62.6682,7.35211 62.6703,7.32575 62.6706,7.30428 62.6794,7.27325 62.6811,7.24106 62.6724,7.23771 62.6675,7.22842 62.6625)),((7.32618 58.0019,7.32983 57.9999,7.34448 57.9999,7.34967 57.9957,7.35889 57.9981,7.3655 57.9967,7.3816 57.9871,7.38761 57.9872,7.39085 57.9892,7.37865 57.9945,7.37161 58.0039,7.36751 58.0061,7.37148 58.0092,7.36818 58.0118,7.34578 58.0199,7.34322 58.0196,7.34264 58.017,7.34687 58.0137,7.34103 58.012,7.34219 58.0092,7.35035 58.0054,7.35098 58.0035,7.34636 58.0025,7.32762 58.0044,7.32618 58.0019)),((7.35393 62.9881,7.36646 62.9801,7.38278 62.9781,7.39782 62.9782,7.4379 62.9705,7.46544 62.9628,7.47955 62.9622,7.49048 62.9547,7.49612 62.9537,7.49417 62.9491,7.50001 62.938,7.50848 62.9384,7.53373 62.9452,7.551 62.9475,7.60202 62.9613,7.60948 62.964,7.62801 62.9706,7.64465 62.9785,7.66185 62.9817,7.72713 62.999,7.73548 63.0051,7.7318 63.011,7.71683 63.0145,7.71073 63.0196,7.69383 63.0224,7.68548 63.0296,7.68548 63.0339,7.67953 63.042,7.68102 63.047,7.6817 63.0494,7.67706 63.0547,7.67952 63.0596,7.67765 63.0627,7.66946 63.0596,7.66386 63.0601,7.65312 63.0574,7.62943 63.0577,7.62679 63.0588,7.62811 63.0604,7.66939 63.0646,7.68178 63.0706,7.68223 63.0754,7.67595 63.0776,7.67929 63.0923,7.67687 63.1002,7.66304 63.1109,7.67207 63.1157,7.67012 63.1202,7.66929 63.1222,7.64164 63.1216,7.64243 63.1234,7.6382 63.1251,7.61034 63.1176,7.60823 63.1141,7.59201 63.1149,7.58826 63.1125,7.57972 63.1123,7.58166 63.1087,7.57538 63.1022,7.58157 63.1009,7.59811 63.1059,7.60581 63.1047,7.61729 63.1057,7.63427 63.1026,7.63543 63.1013,7.62935 63.0973,7.63964 63.0911,7.63129 63.0893,7.61567 63.0894,7.61331 63.088,7.61477 63.0841,7.61178 63.0816,7.60973 63.0799,7.62976 63.0765,7.6416 63.0786,7.64678 63.0773,7.63764 63.0737,7.63473 63.0684,7.61181 63.0665,7.59123 63.0575,7.57721 63.0569,7.57388 63.0553,7.57365 63.053,7.59123 63.0404,7.59121 63.0362,7.59443 63.0345,7.58771 63.0318,7.59099 63.0296,7.59864 63.0286,7.58902 63.025,7.59549 63.0213,7.58002 63.0161,7.57546 63.0164,7.57839 63.0233,7.58018 63.0275,7.56864 63.0316,7.557 63.0407,7.55557 63.0443,7.55095 63.0451,7.54486 63.0498,7.5097 63.0494,7.49877 63.0441,7.49504 63.0458,7.48195 63.0459,7.47716 63.0481,7.48042 63.0502,7.50232 63.0521,7.51802 63.0555,7.52273 63.0581,7.51238 63.0647,7.49967 63.0658,7.47656 63.0613,7.46396 63.0615,7.45851 63.0597,7.44847 63.0565,7.43852 63.0556,7.43147 63.0515,7.45632 63.0499,7.45805 63.0481,7.45273 63.0463,7.44323 63.0459,7.43345 63.0477,7.43022 63.0453,7.43895 63.0398,7.43502 63.039,7.43611 63.0343,7.43054 63.0346,7.42091 63.0311,7.41919 63.0288,7.42943 63.0272,7.45571 63.0302,7.46125 63.026,7.45902 63.0236,7.44439 63.0201,7.42655 63.018,7.41491 63.0187,7.41653 63.0137,7.38084 63.0018,7.37044 63.0006,7.35393 62.9881)),((7.39792 63.0543,7.40241 63.0506,7.41852 63.0464,7.42673 63.0532,7.42439 63.0559,7.41466 63.0573,7.40659 63.0534,7.39792 63.0543)),((7.41264 62.6669,7.41886 62.6647,7.43267 62.6655,7.44752 62.6741,7.4298 62.6769,7.42694 62.6718,7.41264 62.6669)),((7.41521 63.0651,7.42006 63.0624,7.43601 63.0596,7.45407 63.0642,7.45476 63.0667,7.44732 63.07,7.44476 63.0663,7.43093 63.0682,7.41847 63.0672,7.41521 63.0651)),((7.45819 63.0716,7.47113 63.0646,7.48169 63.0647,7.50324 63.0695,7.50249 63.0716,7.49061 63.0699,7.48836 63.0719,7.49865 63.0784,7.49777 63.0815,7.47743 63.0749,7.47464 63.0688,7.4701 63.069,7.46193 63.074,7.45819 63.0716)),((7.4971 57.99,7.49855 57.9884,7.50881 57.9892,7.51011 57.9849,7.51666 57.9839,7.51908 57.9771,7.52768 57.973,7.53547 57.9725,7.54371 57.9762,7.55004 57.9816,7.54852 57.9839,7.53962 57.9825,7.53958 57.9871,7.55456 57.988,7.55394 57.9898,7.54299 57.9959,7.5356 57.9966,7.52769 58.0023,7.52059 58.0044,7.50878 58.002,7.50682 58.0001,7.51187 57.997,7.4971 57.99)),((7.56246 63.071,7.5851 63.0667,7.58305 63.0628,7.58968 63.062,7.60373 63.0667,7.60639 63.0698,7.60132 63.0872,7.59129 63.0911,7.58292 63.0895,7.57564 63.0914,7.56412 63.0909,7.56539 63.0887,7.57259 63.0875,7.57079 63.0856,7.56248 63.0836,7.56782 63.0809,7.56778 63.0771,7.56246 63.071)),((7.57897 57.9806,7.58817 57.9791,7.59061 57.9761,7.5994 57.9787,7.60088 57.981,7.58213 57.9835,7.57897 57.9806)),((7.58106 57.9898,7.58865 57.9871,7.60078 57.9863,7.60189 57.9881,7.58808 57.9928,7.58123 57.9924,7.58106 57.9898)),((7.61243 57.9731,7.61696 57.9666,7.62774 57.9749,7.62456 57.9766,7.6139 57.9757,7.61243 57.9731)),((7.69053 63.1172,7.70685 63.1155,7.72168 63.1093,7.72438 63.1098,7.73105 63.1111,7.73473 63.1141,7.73112 63.1193,7.73341 63.1214,7.74889 63.1138,7.73982 63.1092,7.72307 63.1059,7.72476 63.1043,7.73806 63.1026,7.74607 63.103,7.76513 63.1082,7.79295 63.1072,7.81969 63.1115,7.85347 63.1113,7.8697 63.1149,7.87303 63.1168,7.87037 63.1227,7.86548 63.1305,7.8549 63.1351,7.85709 63.1381,7.8464 63.139,7.8416 63.1415,7.83327 63.1392,7.84094 63.1337,7.83716 63.1313,7.82293 63.1369,7.81027 63.1379,7.8092 63.138,7.80829 63.1325,7.79512 63.1285,7.78972 63.1227,7.76908 63.1179,7.75287 63.1276,7.74568 63.1377,7.73246 63.1342,7.73668 63.1281,7.73366 63.128,7.7228 63.1349,7.69915 63.13,7.71066 63.1264,7.69697 63.1226,7.69053 63.1172)),((7.70127 63.0409,7.70728 63.0367,7.73178 63.0334,7.74356 63.027,7.75884 63.0296,7.77496 63.0293,7.80814 63.0246,7.81558 63.0254,7.82716 63.0298,7.83042 63.0368,7.83797 63.0413,7.85169 63.0445,7.88718 63.0604,7.88915 63.0655,7.89397 63.0674,7.89637 63.0732,7.89206 63.0758,7.89719 63.0796,7.89077 63.0831,7.90162 63.0945,7.90171 63.0984,7.89423 63.1024,7.88921 63.1023,7.88311 63.1074,7.87696 63.1084,7.85549 63.1066,7.84677 63.1073,7.84532 63.1075,7.80029 63.1001,7.7957 63.0961,7.8002 63.0918,7.79558 63.0881,7.77353 63.0871,7.75991 63.0918,7.74479 63.092,7.72133 63.0857,7.71509 63.0741,7.72945 63.0585,7.72249 63.0533,7.71224 63.0594,7.70743 63.0575,7.70723 63.0505,7.70127 63.0409)),((7.71945 58.0143,7.7283 58.0118,7.73209 58.0082,7.73774 58.0077,7.74085 58.0112,7.73397 58.0156,7.7363 58.0182,7.74051 58.0192,7.73509 58.0218,7.72783 58.0211,7.72483 58.0165,7.71945 58.0143)),((7.76773 63.13,7.77193 63.1285,7.7834 63.1296,7.79142 63.1346,7.7898 63.1355,7.77042 63.133,7.76773 63.13)),((7.79055 62.9794,7.81565 62.9701,7.84139 62.9778,7.8576 62.9763,7.86957 62.9816,7.87796 62.9829,7.88109 62.9864,7.86974 62.994,7.86258 62.9952,7.85763 62.9992,7.85861 63.004,7.85591 63.0058,7.84511 63.0035,7.84041 63.0052,7.836 63.0042,7.82555 62.9987,7.81234 62.9957,7.79055 62.9794)),((7.7943 63.3851,7.80833 63.3793,7.81776 63.3754,7.82902 63.3747,7.82818 63.364,7.83249 63.3618,7.85127 63.362,7.84981 63.3706,7.85627 63.3719,7.86481 63.3682,7.88623 63.3769,7.89275 63.3777,7.89712 63.3748,7.92636 63.3819,7.92955 63.3806,7.91982 63.3765,7.90097 63.3722,7.88441 63.3702,7.87018 63.3656,7.86645 63.3625,7.87154 63.3587,7.89572 63.3597,7.91265 63.3628,7.96265 63.3561,7.979 63.3553,7.98483 63.3529,7.98245 63.3515,7.96548 63.3534,7.95699 63.3521,7.94313 63.3534,7.93645 63.3494,7.96689 63.3402,7.9708 63.3321,7.97557 63.3301,8.01763 63.3266,8.01022 63.324,7.99558 63.3232,7.99589 63.3203,7.99011 63.3174,7.98984 63.3151,7.99656 63.3091,8.01603 63.3072,8.03226 63.3121,8.05887 63.3147,8.05452 63.3224,8.04674 63.3241,8.02536 63.3248,8.02 63.3266,8.02344 63.3286,8.01905 63.3317,8.02144 63.3331,8.03159 63.3331,8.05143 63.3278,8.06436 63.3304,8.07185 63.3365,8.07976 63.3337,8.08724 63.335,8.1002 63.3322,8.1081 63.3345,8.12138 63.3336,8.10913 63.3393,8.08101 63.3412,8.07168 63.3431,8.07405 63.3447,8.09578 63.3444,8.11627 63.344,8.16717 63.3478,8.16707 63.3539,8.15237 63.3536,8.14965 63.3554,8.1535 63.3575,8.18334 63.3588,8.19852 63.3646,8.19366 63.3675,8.195 63.3693,8.20592 63.372,8.20615 63.3748,8.21879 63.3807,8.21554 63.3827,8.20533 63.3832,8.19954 63.3852,8.20756 63.3915,8.20563 63.4008,8.19751 63.3994,8.19663 63.3993,8.19214 63.4035,8.17706 63.4044,8.17374 63.406,8.17233 63.4134,8.17698 63.4178,8.17292 63.4228,8.16627 63.4231,8.15998 63.4351,8.15319 63.4368,8.14969 63.4413,8.15191 63.4445,8.13967 63.4548,8.13306 63.4597,8.10121 63.4721,8.08997 63.4723,8.07985 63.4666,8.06907 63.4673,8.06315 63.4654,8.04065 63.4647,8.03774 63.4646,8.02933 63.4669,8.02152 63.4734,8.01229 63.4739,7.99605 63.4635,7.98716 63.4608,7.98357 63.4562,7.97805 63.4602,7.96054 63.4571,7.95241 63.4521,7.9462 63.4435,7.95186 63.4381,7.94637 63.4371,7.93823 63.4417,7.92822 63.4402,7.91528 63.4467,7.9093 63.4455,7.91009 63.4382,7.90035 63.4341,7.89504 63.436,7.89145 63.441,7.88073 63.4422,7.87288 63.4431,7.87353 63.4371,7.86597 63.4317,7.86021 63.4378,7.85419 63.437,7.84793 63.429,7.82063 63.4227,7.81552 63.4183,7.80336 63.4178,7.79681 63.4126,7.81621 63.4076,7.82855 63.4065,7.82926 63.4047,7.82017 63.404,7.8155 63.4002,7.82608 63.3966,7.80279 63.391,7.79518 63.3909,7.7943 63.3851)),((7.84888 63.3468,7.85057 63.3453,7.86435 63.3446,7.85616 63.3406,7.85732 63.3347,7.8697 63.3329,7.87387 63.3412,7.8783 63.3424,7.88448 63.3417,7.89368 63.3457,7.89734 63.3495,7.90523 63.3517,7.8994 63.3539,7.88137 63.3562,7.85354 63.3551,7.85562 63.3502,7.84888 63.3468)),((7.85107 63.1794,7.85278 63.1776,7.86636 63.1781,7.87651 63.1822,7.87175 63.1842,7.85611 63.1841,7.85107 63.1794)),((7.88773 63.1719,7.89061 63.1686,7.89977 63.1633,7.91389 63.1634,7.92179 63.1603,7.95187 63.1621,7.95377 63.1633,7.95307 63.1651,7.93916 63.1678,7.92929 63.1751,7.91387 63.173,7.9036 63.1746,7.89 63.1743,7.88773 63.1719)),((7.9122 63.1791,7.91444 63.1771,7.9232 63.1798,7.92715 63.181,7.94654 63.1744,7.9607 63.1646,7.97254 63.1624,7.97171 63.1607,7.95986 63.1582,7.95905 63.1563,7.96739 63.1538,8.02166 63.151,8.0734 63.1533,8.08521 63.1512,8.13495 63.1582,8.14234 63.1584,8.18826 63.1599,8.20047 63.164,8.19855 63.166,8.20534 63.166,8.21745 63.1607,8.22406 63.1602,8.25078 63.1657,8.27645 63.1664,8.28431 63.1686,8.31571 63.1674,8.33278 63.1684,8.34058 63.1713,8.33214 63.1753,8.3311 63.181,8.32369 63.1847,8.31857 63.1908,8.30924 63.1933,8.30377 63.1978,8.29279 63.2017,8.27479 63.205,8.26483 63.2121,8.26286 63.2135,8.25905 63.2216,8.25053 63.226,8.24234 63.2375,8.23328 63.2371,8.20398 63.2315,8.18782 63.2262,8.17341 63.2236,8.17014 63.2208,8.1747 63.2156,8.19404 63.2092,8.19265 63.2027,8.19607 63.1884,8.20207 63.1787,8.19855 63.167,8.19206 63.1675,8.18815 63.1713,8.18548 63.1934,8.17894 63.2034,8.1726 63.2062,8.16876 63.2144,8.15466 63.2189,8.14962 63.2238,8.15144 63.2309,8.14506 63.234,8.14147 63.2447,8.13571 63.2466,8.12586 63.2439,8.1131 63.245,8.08533 63.2394,8.07854 63.2365,8.06594 63.236,8.05823 63.2274,8.05183 63.2257,8.04863 63.2224,8.04365 63.2217,8.03679 63.2147,8.03191 63.213,8.01923 63.2134,8.0039 63.2101,7.98481 63.209,7.97849 63.2066,7.99124 63.2055,7.99141 63.2039,7.96046 63.2003,7.94923 63.1966,7.93283 63.194,7.93157 63.1916,7.9436 63.1878,7.94173 63.1864,7.92111 63.1855,7.9122 63.1791)),((7.95746 63.0999,7.95823 63.0974,7.9643 63.097,7.97665 63.0994,7.97943 63.1065,7.97725 63.1081,7.96825 63.1074,7.95746 63.0999)),((7.9633 58.0659,7.96894 58.0656,7.97605 58.0681,7.97785 58.0624,7.98494 58.0603,7.99074 58.063,8.00135 58.06,8.00996 58.065,8.01218 58.0692,8.00858 58.0758,8.01227 58.0779,8.02485 58.0771,8.02797 58.0808,8.02015 58.0863,8.01322 58.0866,8.00373 58.0914,7.9977 58.0913,7.99263 58.0804,7.99236 58.0737,7.98687 58.0773,7.97477 58.0774,7.9633 58.0659)),((7.97306 63.2101,7.99394 63.2135,8.00655 63.2138,8.02378 63.2183,8.02164 63.2194,7.99591 63.2188,7.98666 63.2154,7.97318 63.2138,7.97306 63.2101)),((7.99258 58.1195,7.99303 58.1145,8.0116 58.1097,8.01447 58.1114,8.00629 58.116,7.99258 58.1195)),((8.03477 63.288,8.03799 63.2862,8.05596 63.2889,8.06968 63.2884,8.09381 63.2953,8.09645 63.2993,8.11259 63.3051,8.1108 63.3078,8.09047 63.3033,8.07168 63.3036,8.05478 63.3003,8.0489 63.2983,8.04588 63.2932,8.03648 63.291,8.03477 63.288)),((8.10472 63.4776,8.12441 63.4696,8.12809 63.4735,8.13975 63.4742,8.13744 63.4769,8.12973 63.4774,8.12025 63.4804,8.11259 63.4805,8.10472 63.4776)),((8.11115 63.2843,8.11642 63.2823,8.12897 63.2835,8.21904 63.3106,8.23195 63.3186,8.22301 63.3271,8.21519 63.3293,8.21021 63.3283,8.18989 63.3183,8.18677 63.3139,8.19026 63.3094,8.18837 63.308,8.17696 63.3105,8.15996 63.3081,8.15053 63.3029,8.14026 63.2972,8.13757 63.2937,8.11731 63.2885,8.11115 63.2843)),((8.16332 63.2437,8.17109 63.2368,8.18009 63.2379,8.18455 63.2336,8.19469 63.2334,8.20601 63.2366,8.22002 63.2382,8.22796 63.245,8.2242 63.2472,8.22591 63.2504,8.21025 63.2501,8.20606 63.2517,8.20473 63.2548,8.19751 63.2563,8.17488 63.2547,8.17111 63.2519,8.17062 63.2466,8.16332 63.2437)),((8.2069 58.1132,8.20962 58.1117,8.22163 58.1126,8.22438 58.1159,8.22155 58.1188,8.21799 58.1201,8.21158 58.1193,8.2069 58.1132)),((8.24222 63.4954,8.24747 63.4939,8.2581 63.4948,8.25486 63.4913,8.25756 63.4898,8.26405 63.4912,8.26817 63.4961,8.27118 63.4966,8.26972 63.5012,8.26534 63.5043,8.25435 63.5018,8.24902 63.5042,8.24222 63.4954)),((8.25801 63.2746,8.26807 63.27,8.27037 63.2671,8.27648 63.2667,8.28052 63.2615,8.27946 63.2567,8.29051 63.2524,8.28976 63.2496,8.28301 63.2461,8.27003 63.2442,8.26884 63.2408,8.27446 63.2349,8.27123 63.2264,8.27833 63.2208,8.2902 63.2183,8.29517 63.2153,8.34483 63.1853,8.36007 63.168,8.37497 63.1651,8.40572 63.1654,8.42263 63.1625,8.43836 63.1672,8.45039 63.1681,8.47111 63.162,8.48544 63.1598,8.54369 63.1745,8.56662 63.1779,8.57249 63.18,8.57602 63.186,8.5674 63.1982,8.56832 63.1994,8.57836 63.2,8.57869 63.2021,8.57641 63.2052,8.56424 63.2057,8.5583 63.2102,8.54737 63.2255,8.54152 63.2288,8.51372 63.2288,8.5054 63.2314,8.50263 63.2337,8.49831 63.2372,8.48521 63.2425,8.48094 63.2506,8.48205 63.2552,8.475 63.2663,8.46632 63.2727,8.47034 63.2788,8.4574 63.2819,8.45191 63.2866,8.43053 63.2822,8.41045 63.2802,8.39978 63.275,8.39969 63.2704,8.40633 63.2698,8.40278 63.2643,8.40983 63.2592,8.40889 63.2473,8.41077 63.2424,8.41748 63.225,8.41478 63.2159,8.40391 63.2186,8.40152 63.2227,8.399 63.2336,8.40503 63.2451,8.40317 63.2545,8.39947 63.2617,8.38722 63.2738,8.37248 63.2745,8.36266 63.2656,8.35628 63.2634,8.34715 63.2637,8.34075 63.2618,8.3416 63.2689,8.33975 63.2686,8.32362 63.2662,8.30855 63.281,8.26089 63.2762,8.25801 63.2746)),((8.2816 63.6691,8.28196 63.6675,8.30974 63.6708,8.30669 63.6742,8.30095 63.6746,8.2816 63.6691)),((8.28642 63.6835,8.29314 63.6777,8.31433 63.6762,8.32563 63.6707,8.31616 63.6678,8.33369 63.667,8.34173 63.6688,8.3511 63.6673,8.36366 63.6703,8.39041 63.6806,8.40118 63.6808,8.41113 63.6842,8.43751 63.6821,8.45329 63.6893,8.46074 63.6898,8.47216 63.6907,8.48349 63.6941,8.48589 63.6919,8.45336 63.6829,8.44446 63.6791,8.44514 63.6772,8.473 63.6814,8.47934 63.6794,8.48445 63.6798,8.55675 63.6924,8.56222 63.6886,8.55071 63.6852,8.53891 63.685,8.5249 63.6809,8.50649 63.6801,8.5011 63.6792,8.47668 63.6748,8.46768 63.6722,8.46967 63.6672,8.49936 63.6679,8.50736 63.6703,8.54332 63.6758,8.57211 63.6753,8.65064 63.6814,8.66577 63.6846,8.68108 63.692,8.68626 63.6914,8.6848 63.69,8.67958 63.6853,8.69439 63.6862,8.69716 63.6899,8.71251 63.6906,8.72756 63.695,8.73337 63.693,8.74202 63.6941,8.756 63.6927,8.76244 63.6955,8.77043 63.692,8.78335 63.6975,8.79078 63.6944,8.79854 63.7002,8.80411 63.7012,8.80836 63.6994,8.8193 63.7039,8.82748 63.7045,8.83838 63.7097,8.8425 63.7162,8.84298 63.7232,8.83633 63.7359,8.83652 63.7395,8.83736 63.7558,8.8198 63.7631,8.79663 63.7632,8.79498 63.7645,8.79948 63.7662,8.81382 63.7671,8.81749 63.7728,8.81497 63.7851,8.81672 63.8023,8.81148 63.8033,8.79429 63.7926,8.79057 63.8005,8.78025 63.8006,8.77161 63.8055,8.76632 63.8008,8.76777 63.7986,8.76985 63.7954,8.76624 63.7889,8.75538 63.7895,8.75292 63.788,8.75799 63.7826,8.75114 63.7782,8.76025 63.7738,8.74591 63.7729,8.73487 63.7693,8.69758 63.7657,8.6655 63.7554,8.65274 63.754,8.63461 63.7494,8.62029 63.7423,8.623 63.7408,8.65144 63.7451,8.65372 63.7424,8.65802 63.7423,8.66352 63.7421,8.6601 63.74,8.62641 63.737,8.61738 63.7343,8.60454 63.7341,8.60316 63.7322,8.60697 63.7298,8.59205 63.7263,8.58972 63.721,8.58577 63.7192,8.58165 63.7193,8.57401 63.7126,8.5804 63.704,8.58877 63.7023,8.58334 63.6997,8.56791 63.6999,8.56906 63.7045,8.56398 63.7097,8.55174 63.7145,8.5355 63.7121,8.52873 63.7132,8.50702 63.7087,8.49718 63.7097,8.49617 63.7094,8.48513 63.7065,8.47893 63.7068,8.46479 63.6984,8.46052 63.7001,8.4761 63.7098,8.47086 63.7108,8.43987 63.7068,8.44207 63.7053,8.45391 63.705,8.44353 63.7005,8.4054 63.6962,8.38115 63.6973,8.3598 63.6949,8.35786 63.6937,8.36111 63.6919,8.36626 63.6918,8.36643 63.69,8.35109 63.6893,8.34057 63.6918,8.33301 63.6909,8.31923 63.6893,8.30791 63.6896,8.29079 63.6861,8.28642 63.6835)),((8.2878 63.5202,8.28802 63.518,8.29821 63.5182,8.30615 63.5206,8.31916 63.5288,8.31748 63.5304,8.30002 63.526,8.29627 63.5225,8.2878 63.5202)),((8.2997 63.4545,8.30012 63.4501,8.30432 63.4488,8.31391 63.4497,8.3178 63.4464,8.31645 63.4445,8.33173 63.4391,8.33626 63.4396,8.33759 63.4417,8.33367 63.4455,8.34371 63.4525,8.34182 63.4564,8.31928 63.4576,8.31342 63.455,8.3076 63.4571,8.2997 63.4545)),((8.30154 63.494,8.30651 63.49,8.30184 63.4856,8.30597 63.485,8.31143 63.4867,8.3204 63.4941,8.3378 63.499,8.34446 63.5042,8.35673 63.5039,8.35843 63.5021,8.3349 63.4919,8.32186 63.4896,8.32289 63.4841,8.31621 63.4792,8.32655 63.4778,8.32687 63.4744,8.32569 63.4728,8.3183 63.4626,8.36354 63.4584,8.36278 63.4556,8.37795 63.4514,8.36556 63.4477,8.36793 63.4441,8.37581 63.4415,8.38806 63.4413,8.38371 63.4387,8.38593 63.4367,8.39858 63.4321,8.40896 63.4355,8.4133 63.4326,8.42903 63.4331,8.43737 63.431,8.4563 63.4299,8.46774 63.4329,8.48363 63.4318,8.49719 63.4338,8.50062 63.434,8.53678 63.4352,8.55261 63.4405,8.5649 63.4398,8.57238 63.4475,8.57837 63.4489,8.58404 63.4541,8.59637 63.4588,8.60195 63.4592,8.60622 63.4629,8.63288 63.467,8.64275 63.4708,8.68112 63.4753,8.69289 63.4748,8.71052 63.4774,8.71742 63.4802,8.7333 63.4793,8.73733 63.4811,8.7397 63.4822,8.74736 63.4821,8.76071 63.4873,8.76331 63.4803,8.77398 63.4807,8.77879 63.4844,8.79782 63.4888,8.81505 63.4902,8.82143 63.4869,8.83778 63.4864,8.84226 63.4813,8.8474 63.4806,8.85731 63.4845,8.86449 63.4839,8.87856 63.4866,8.88248 63.4887,8.89479 63.4877,8.9489 63.5009,8.96508 63.5029,8.96558 63.5029,8.97035 63.5076,8.97912 63.5063,8.9865 63.5101,9.0109 63.5113,9.04584 63.5152,9.12426 63.533,9.1458 63.5392,9.15707 63.5464,9.19479 63.5633,9.20301 63.5705,9.19761 63.575,9.18763 63.579,9.18267 63.5766,9.17459 63.5762,9.17197 63.576,9.1605 63.5716,9.15439 63.5635,9.14423 63.5627,9.13028 63.5572,9.12918 63.5584,9.14092 63.5663,9.13318 63.5673,9.13309 63.5687,9.14409 63.5723,9.15325 63.5806,9.14138 63.5823,9.14674 63.5862,9.14561 63.5878,9.13739 63.5884,9.12445 63.598,9.11622 63.5986,9.11085 63.6024,9.10107 63.6032,9.09156 63.6074,9.08541 63.6075,9.06522 63.6034,9.051 63.6064,9.04703 63.6072,9.04051 63.6053,9.02215 63.6044,9.01394 63.5974,9.00393 63.5943,9.00673 63.5909,9.00379 63.5891,8.98793 63.5891,8.97529 63.5871,8.96399 63.5876,8.97586 63.5932,8.97357 63.5966,8.97691 63.5999,8.98245 63.6011,8.98618 63.6062,8.97828 63.6093,8.98575 63.6121,8.98579 63.6187,8.97702 63.6195,8.97309 63.6243,8.94585 63.6255,8.94419 63.627,8.9594 63.6293,8.97176 63.6283,8.98586 63.6317,8.99156 63.638,8.99853 63.6408,9.00014 63.6541,8.99462 63.6595,8.98748 63.6589,8.9812 63.6607,8.97002 63.6591,8.96426 63.6609,8.95824 63.659,8.94693 63.6593,8.9402 63.6532,8.92423 63.6473,8.91409 63.6458,8.91181 63.6421,8.90445 63.6445,8.9073 63.6475,8.90457 63.6497,8.8982 63.6458,8.89081 63.6486,8.87813 63.6468,8.88151 63.6428,8.87863 63.6402,8.88498 63.6376,8.87857 63.6343,8.88072 63.633,8.89195 63.6336,8.89065 63.6304,8.90446 63.6308,8.91383 63.6289,8.91502 63.6266,8.89834 63.6236,8.89254 63.6258,8.88634 63.6198,8.87982 63.6179,8.88518 63.6148,8.87719 63.6121,8.87537 63.6091,8.86769 63.609,8.86091 63.6174,8.85523 63.618,8.85823 63.6255,8.86687 63.6332,8.85949 63.6358,8.85603 63.6408,8.85863 63.647,8.84486 63.6461,8.82769 63.6427,8.80952 63.6413,8.78642 63.6395,8.76588 63.6399,8.75338 63.636,8.7427 63.635,8.7325 63.6343,8.72725 63.6359,8.69754 63.6294,8.69172 63.6255,8.6631 63.6246,8.64035 63.621,8.63764 63.6166,8.61032 63.6187,8.59247 63.6177,8.58169 63.612,8.56175 63.6058,8.5607 63.6051,8.55151 63.5999,8.54247 63.5979,8.54825 63.5962,8.55949 63.5964,8.56688 63.5937,8.57858 63.5946,8.59549 63.5885,8.60516 63.5891,8.62304 63.5835,8.6322 63.5841,8.64908 63.578,8.66882 63.5744,8.68683 63.5731,8.69218 63.5702,8.70855 63.5703,8.72882 63.5663,8.73846 63.5671,8.74213 63.566,8.73331 63.5613,8.73107 63.5574,8.73731 63.5497,8.74082 63.5379,8.7363 63.5369,8.72925 63.5421,8.73174 63.5492,8.72562 63.5552,8.72831 63.5577,8.72915 63.5619,8.70472 63.567,8.6961 63.5662,8.67854 63.5682,8.66753 63.5714,8.64485 63.5736,8.63954 63.5698,8.61449 63.5696,8.5941 63.5629,8.56964 63.56,8.55848 63.555,8.55324 63.5565,8.55092 63.5597,8.53199 63.5598,8.52662 63.5627,8.50659 63.5637,8.48645 63.5602,8.48166 63.5624,8.47657 63.562,8.4692 63.5587,8.46649 63.5548,8.45905 63.5579,8.44217 63.5523,8.41872 63.5517,8.40631 63.5475,8.39925 63.541,8.36274 63.5271,8.36316 63.5226,8.37245 63.5216,8.36563 63.518,8.36367 63.5177,8.35356 63.516,8.33586 63.5088,8.32128 63.5065,8.31083 63.4983,8.30154 63.494)),((8.30944 58.1858,8.31444 58.1774,8.32439 58.1829,8.31944 58.1906,8.31553 58.1855,8.30944 58.1858)),((8.31111 63.5168,8.32537 63.5118,8.3339 63.5133,8.33557 63.5173,8.31503 63.5185,8.31111 63.5168)),((8.32269 63.5239,8.32597 63.5216,8.33958 63.5235,8.34591 63.5268,8.34486 63.5325,8.32269 63.5239)),((8.33901 58.2057,8.34984 58.2002,8.35776 58.193,8.37016 58.1894,8.38066 58.199,8.38262 58.2071,8.393 58.2073,8.39934 58.2147,8.39398 58.2169,8.38657 58.2174,8.37436 58.2241,8.36189 58.2229,8.3559 58.2166,8.34707 58.2132,8.34486 58.2083,8.33928 58.2077,8.33901 58.2057)),((8.35111 63.5639,8.3706 63.5743,8.36787 63.5761,8.35598 63.572,8.35111 63.5639)),((8.36029 63.5314,8.38748 63.5413,8.39028 63.5441,8.38858 63.5459,8.36097 63.5406,8.36029 63.5314)),((8.36687 63.3132,8.37438 63.3088,8.38151 63.3084,8.3869 63.3049,8.39599 63.3053,8.40331 63.3084,8.41577 63.3052,8.4268 63.3065,8.43195 63.3057,8.43769 63.3095,8.45648 63.3091,8.47122 63.3144,8.48271 63.3278,8.46579 63.3298,8.45342 63.3376,8.44288 63.3363,8.43141 63.3397,8.42287 63.3387,8.42449 63.3321,8.42117 63.3295,8.41707 63.3299,8.40849 63.335,8.40431 63.3308,8.39734 63.3293,8.39 63.3319,8.37396 63.3243,8.37486 63.32,8.37021 63.316,8.36687 63.3132)),((8.3726 63.5858,8.3753 63.5842,8.3849 63.5855,8.3803 63.58,8.39237 63.5713,8.4023 63.5744,8.4064 63.58,8.42205 63.5878,8.42078 63.5905,8.4071 63.5946,8.40077 63.5911,8.37481 63.5895,8.3726 63.5858)),((8.37814 58.231,8.39503 58.2311,8.39701 58.2335,8.39321 58.2377,8.38835 58.239,8.37814 58.231)),((8.3883 62.9145,8.39642 62.9078,8.40526 62.904,8.41027 62.9039,8.40656 62.9118,8.39657 62.9171,8.38953 62.9175,8.3883 62.9145)),((8.40264 63.678,8.41424 63.6722,8.42076 63.6739,8.42513 63.6747,8.42716 63.677,8.42469 63.6799,8.40916 63.6797,8.40264 63.678)),((8.40798 63.5738,8.42209 63.5707,8.42901 63.5733,8.43924 63.5733,8.444 63.5772,8.43036 63.5809,8.42215 63.5812,8.40798 63.5738)),((8.44514 63.6154,8.44835 63.6138,8.47537 63.6152,8.47621 63.6173,8.46207 63.6207,8.45293 63.6199,8.45115 63.6168,8.44514 63.6154)),((8.4475 58.2531,8.45557 58.2496,8.46067 58.2508,8.4642 58.25,8.46664 58.2464,8.47253 58.2488,8.44751 58.2586,8.4475 58.2531)),((8.44877 63.3441,8.46019 63.3414,8.47353 63.3341,8.50866 63.3269,8.54156 63.3277,8.54643 63.3301,8.5395 63.3398,8.53255 63.3438,8.52165 63.3466,8.52753 63.349,8.53565 63.3491,8.55259 63.3469,8.56197 63.3441,8.56178 63.3434,8.55964 63.3358,8.56509 63.3313,8.55959 63.3246,8.56156 63.3194,8.5652 63.3183,8.62097 63.3245,8.63314 63.3307,8.6559 63.3315,8.67483 63.3357,8.69653 63.3372,8.70903 63.3456,8.7084 63.3472,8.6976 63.3488,8.69023 63.3583,8.69568 63.3662,8.68843 63.3679,8.67629 63.3672,8.65639 63.3744,8.64996 63.3797,8.64494 63.3838,8.64561 63.388,8.6292 63.3897,8.62024 63.3935,8.60743 63.3887,8.5972 63.3894,8.58644 63.3963,8.56355 63.3964,8.53741 63.393,8.51105 63.3864,8.49718 63.3765,8.50598 63.3689,8.49332 63.3628,8.49968 63.3597,8.51129 63.3606,8.51404 63.3581,8.51251 63.3524,8.51173 63.3524,8.48689 63.3551,8.47107 63.3503,8.45493 63.3491,8.44877 63.3441)),((8.46888 63.5907,8.46952 63.5836,8.4783 63.5769,8.4838 63.5784,8.48728 63.5853,8.47661 63.5901,8.46888 63.5907)),((8.48991 63.2521,8.50428 63.2385,8.51681 63.2339,8.52845 63.2339,8.53168 63.2373,8.51703 63.2487,8.51727 63.2576,8.51226 63.2628,8.50806 63.2646,8.49975 63.2635,8.50116 63.2624,8.48991 63.2521)),((8.50174 63.5723,8.50351 63.5696,8.50933 63.5674,8.52226 63.5658,8.53958 63.5666,8.55895 63.5614,8.56964 63.5612,8.58104 63.5661,8.61012 63.573,8.61044 63.5734,8.61523 63.579,8.61348 63.5815,8.60324 63.5816,8.58751 63.5861,8.58297 63.5913,8.57522 63.5861,8.56772 63.5901,8.54679 63.5836,8.54046 63.5858,8.54944 63.5884,8.53078 63.5911,8.52752 63.5874,8.51945 63.5861,8.50174 63.5723)),((8.50407 63.1487,8.50626 63.1467,8.5189 63.1462,8.52585 63.1475,8.5332 63.1442,8.54267 63.1455,8.55047 63.1486,8.5493 63.1504,8.54469 63.1512,8.54474 63.1565,8.54211 63.1578,8.52884 63.1537,8.52181 63.1533,8.51851 63.1508,8.50407 63.1487)),((8.54194 63.6214,8.54212 63.6193,8.55369 63.6159,8.58334 63.6226,8.5775 63.625,8.56685 63.6236,8.56106 63.6254,8.55191 63.6245,8.54194 63.6214)),((8.56359 63.7205,8.56377 63.7183,8.58557 63.7238,8.58762 63.726,8.57423 63.7266,8.56359 63.7205)),((8.56664 63.7558,8.57755 63.7546,8.59249 63.7544,8.59487 63.7567,8.58718 63.7623,8.56664 63.7558)),((8.62216 63.6301,8.64155 63.6249,8.65582 63.632,8.65748 63.6366,8.64933 63.636,8.64037 63.6329,8.62558 63.6319,8.62216 63.6301)),((8.62429 63.786,8.63077 63.7824,8.65367 63.7858,8.6778 63.7992,8.681 63.7979,8.67526 63.7925,8.67557 63.7889,8.68189 63.7872,8.69493 63.7915,8.69392 63.7974,8.70821 63.7992,8.71315 63.8018,8.70707 63.8067,8.70201 63.8055,8.69116 63.8058,8.6883 63.803,8.6728 63.8034,8.66157 63.796,8.63922 63.7922,8.63492 63.7882,8.62429 63.786)),((8.64075 63.8652,8.65245 63.8613,8.66108 63.863,8.67338 63.8703,8.67578 63.8726,8.67044 63.8746,8.66553 63.8716,8.66027 63.8726,8.65647 63.8687,8.64363 63.8678,8.64075 63.8652)),((8.66429 63.7636,8.70139 63.7694,8.70359 63.774,8.72556 63.7824,8.72731 63.7799,8.71702 63.7736,8.72379 63.7725,8.74589 63.7795,8.74765 63.7832,8.74041 63.7835,8.73798 63.788,8.74702 63.7909,8.74718 63.7953,8.75692 63.8023,8.75436 63.8084,8.74855 63.8101,8.74414 63.8073,8.74251 63.802,8.73567 63.8038,8.72699 63.8027,8.71951 63.7996,8.71258 63.7948,8.70196 63.7875,8.69281 63.786,8.68178 63.7762,8.67124 63.7728,8.66429 63.7636)),((8.66723 63.6427,8.67379 63.6377,8.67578 63.6323,8.68253 63.6313,8.6947 63.6328,8.7162 63.6393,8.72703 63.6386,8.73644 63.6426,8.76049 63.6432,8.78059 63.6419,8.80555 63.6439,8.81003 63.6456,8.81985 63.6446,8.8258 63.6472,8.83242 63.6478,8.83579 63.6505,8.84957 63.6514,8.8595 63.6557,8.85208 63.6588,8.85685 63.6634,8.84183 63.6652,8.83084 63.6614,8.82623 63.6614,8.82494 63.6648,8.81213 63.6646,8.79762 63.6664,8.78238 63.6646,8.78614 63.6623,8.80122 63.6598,8.80917 63.6565,8.80877 63.6552,8.80213 63.6548,8.77767 63.6592,8.75211 63.6582,8.73969 63.6532,8.73784 63.6506,8.73177 63.6496,8.71581 63.6567,8.71573 63.6514,8.71081 63.6488,8.70311 63.6489,8.70043 63.6441,8.68941 63.6454,8.68697 63.6457,8.66723 63.6427)),((8.72915 58.412,8.73387 58.4066,8.7447 58.4075,8.74744 58.4119,8.7446 58.4152,8.73657 58.4181,8.7327 58.4173,8.72915 58.412)),((8.73039 58.4319,8.74353 58.4244,8.74607 58.4192,8.75054 58.4174,8.77341 58.4206,8.77778 58.4268,8.78898 58.4351,8.78238 58.4425,8.78392 58.4455,8.77528 58.4508,8.7663 58.4484,8.74729 58.4395,8.74328 58.4344,8.73149 58.4349,8.73039 58.4319)),((8.78987 58.4543,8.79585 58.4365,8.81296 58.4348,8.81876 58.4393,8.81999 58.4471,8.8272 58.4435,8.8374 58.4443,8.83803 58.4444,8.84036 58.4422,8.8325 58.4358,8.83107 58.431,8.83418 58.4301,8.88941 58.4517,8.90325 58.4602,8.90303 58.4636,8.89283 58.4664,8.9196 58.4843,8.91968 58.4898,8.93248 58.4943,8.93474 58.5001,8.94167 58.5009,8.94791 58.5058,8.93082 58.5069,8.92567 58.5054,8.89591 58.493,8.89495 58.4927,8.86809 58.4847,8.85629 58.4784,8.8472 58.4706,8.84188 58.4719,8.83845 58.4712,8.83573 58.4661,8.83005 58.4662,8.82037 58.461,8.81411 58.4634,8.80482 58.4589,8.79491 58.4571,8.78987 58.4543)),((8.79213 63.8133,8.79563 63.8081,8.80744 63.8087,8.80571 63.8176,8.79956 63.8171,8.79213 63.8133)),((8.82959 63.7696,8.83333 63.7678,8.84494 63.7707,8.8542 63.7709,8.85452 63.7668,8.85969 63.7664,8.86759 63.7708,8.87036 63.7684,8.869 63.7658,8.87367 63.7655,8.89253 63.7746,8.89455 63.782,8.89127 63.7844,8.88352 63.7848,8.87399 63.7814,8.86965 63.7775,8.86548 63.7781,8.8632 63.7811,8.85436 63.7821,8.84899 63.7783,8.84276 63.7789,8.83806 63.7731,8.82959 63.7696)),((8.86601 63.738,8.8741 63.7331,8.8726 63.7257,8.87796 63.7228,8.8852 63.7223,8.89746 63.7234,8.90158 63.73,8.91072 63.7315,8.91711 63.7355,8.92616 63.7382,8.92635 63.7425,8.91347 63.7428,8.90445 63.7465,8.87531 63.744,8.87557 63.7406,8.87155 63.7394,8.86739 63.74,8.86601 63.738)),((8.88088 63.4426,8.89139 63.445,8.91377 63.4385,8.92291 63.4384,8.93591 63.442,8.94305 63.4419,8.94946 63.4447,8.94678 63.4465,8.92406 63.4439,8.92179 63.4471,8.92357 63.4505,8.94194 63.4569,8.93775 63.4585,8.90642 63.455,8.90067 63.457,8.88375 63.4517,8.88506 63.4479,8.88088 63.4426)),((8.90766 58.5209,8.91496 58.516,8.91435 58.5119,8.92575 58.5111,8.92987 58.5149,8.93463 58.5156,8.93433 58.5204,8.94392 58.5206,8.94851 58.517,8.95554 58.5233,8.97272 58.5279,8.98125 58.5384,8.99582 58.5501,8.99802 58.557,8.99164 58.5754,8.98104 58.5841,8.9773 58.5809,8.97393 58.5719,8.9803 58.5608,8.97983 58.5595,8.97768 58.5537,8.9698 58.5469,8.95668 58.54,8.94636 58.5373,8.94575 58.5332,8.91733 58.5268,8.90766 58.5209)),((8.90928 58.4683,8.92548 58.4741,8.92686 58.4798,8.92455 58.4818,8.91324 58.4745,8.90928 58.4683)),((9.00189 58.5724,9.00614 58.5672,9.01185 58.5668,9.01866 58.5699,9.01927 58.5742,9.02347 58.5771,9.0215 58.5807,9.03728 58.5947,9.00956 58.5899,9.0031 58.5811,9.00724 58.5777,9.00218 58.5747,9.00189 58.5724)),((9.00982 63.6193,9.01095 63.6177,9.02129 63.6165,9.06842 63.6162,9.09653 63.617,9.10053 63.6185,9.10231 63.6224,9.10994 63.6232,9.10913 63.6275,9.11834 63.6276,9.12457 63.6341,9.13055 63.6364,9.14003 63.6327,9.14982 63.6319,9.15887 63.6345,9.16368 63.6392,9.17072 63.6413,9.17344 63.6466,9.17791 63.6487,9.17867 63.6528,9.17439 63.6555,9.16667 63.6559,9.1576 63.6535,9.15568 63.6591,9.14301 63.6569,9.13219 63.6577,9.13292 63.6545,9.10684 63.6535,9.10673 63.6551,9.11358 63.6564,9.12039 63.6578,9.11989 63.6651,9.11673 63.6664,9.10172 63.6682,9.08221 63.6684,9.06235 63.6663,9.05406 63.6676,9.04744 63.6668,9.04933 63.6618,9.04229 63.6599,9.04394 63.6583,9.05172 63.6571,9.0466 63.6497,9.04117 63.6467,9.04705 63.6433,9.0603 63.6444,9.06246 63.6428,9.04804 63.6365,9.03901 63.6409,9.02565 63.6414,9.02476 63.6396,9.03078 63.6342,9.00989 63.6255,9.01379 63.625,9.02436 63.6236,9.02446 63.6222,9.00982 63.6193)),((9.02704 63.6796,9.02776 63.6766,9.04455 63.6713,9.06985 63.6692,9.1081 63.6724,9.11247 63.6761,9.11603 63.6766,9.1136 63.6821,9.10637 63.6827,9.10347 63.6801,9.0903 63.685,9.06652 63.6874,9.04607 63.6862,9.02704 63.6796)),((9.03096 58.5834,9.03153 58.5811,9.03785 58.578,9.04408 58.5833,9.04762 58.5827,9.05138 58.5784,9.07136 58.5881,9.08002 58.597,9.0773 58.5987,9.06628 58.5999,9.0586 58.5966,9.04901 58.596,9.03096 58.5834)),((9.03752 63.4667,9.03875 63.4638,9.04642 63.4634,9.04871 63.4598,9.05933 63.4609,9.06471 63.4641,9.05564 63.4699,9.03752 63.4667)),((9.052 63.9802,9.06416 63.9758,9.07397 63.9771,9.08356 63.9818,9.08714 63.9878,9.08306 63.9897,9.07334 63.987,9.07161 63.9831,9.05772 63.9836,9.05385 63.9822,9.052 63.9802)),((9.05934 58.6062,9.06691 58.6041,9.07287 58.6069,9.0808 58.6061,9.08575 58.6112,9.09929 58.6117,9.12578 58.6231,9.12215 58.6253,9.10903 58.6249,9.09408 58.6185,9.06987 58.6133,9.05934 58.6062)),((9.06389 63.5125,9.06765 63.5098,9.08339 63.511,9.10372 63.5197,9.10928 63.5204,9.11124 63.5216,9.10854 63.5238,9.06389 63.5125)),((9.09789 63.4856,9.10457 63.4848,9.11351 63.4883,9.13249 63.4865,9.144 63.4899,9.13557 63.4938,9.14702 63.4981,9.15235 63.5023,9.16443 63.5047,9.16636 63.5063,9.16366 63.5086,9.13896 63.5042,9.11378 63.5068,9.10376 63.5042,9.09846 63.4995,9.10376 63.4966,9.1042 63.4902,9.09789 63.4856)),((9.10776 63.9841,9.12114 63.9781,9.12789 63.9855,9.12464 63.9875,9.10864 63.9864,9.10776 63.9841)),((9.12859 63.4764,9.1345 63.4719,9.13216 63.4687,9.13425 63.468,9.15028 63.4721,9.15318 63.4744,9.15153 63.4763,9.14338 63.4761,9.13811 63.4788,9.12999 63.4783,9.12859 63.4764)),((9.13032 63.6702,9.15992 63.6649,9.17247 63.6689,9.17493 63.6706,9.17329 63.6721,9.16156 63.6711,9.15625 63.6737,9.15756 63.6772,9.15018 63.6801,9.13849 63.6783,9.13729 63.6733,9.13032 63.6702)),((9.13482 63.4518,9.14604 63.4518,9.15624 63.4592,9.1546 63.4608,9.14652 63.4598,9.13757 63.4564,9.13482 63.4518)),((9.15504 64,9.15977 63.9973,9.16483 63.9992,9.17532 63.9975,9.17812 64,9.15504 64)),((9.19474 63.5562,9.1995 63.5538,9.20143 63.5477,9.20906 63.5482,9.21826 63.5561,9.2093 63.5603,9.20384 63.5577,9.19611 63.5588,9.19474 63.5562)),((9.26034 58.7184,9.27454 58.7239,9.27518 58.7282,9.26552 58.7281,9.2646 58.7208,9.26034 58.7184)),((9.29586 63.5739,9.29805 63.5714,9.31149 63.5691,9.32766 63.5722,9.33144 63.5773,9.34588 63.5839,9.35711 63.5842,9.37115 63.589,9.37193 63.5931,9.31697 63.5881,9.3035 63.5827,9.29586 63.5739)),((9.31369 63.6417,9.31787 63.6404,9.32238 63.642,9.33536 63.6392,9.33545 63.6463,9.34316 63.6459,9.34791 63.6521,9.34565 63.6555,9.33643 63.6554,9.32175 63.6523,9.32298 63.6489,9.31369 63.6417)),((9.35973 63.7885,9.36504 63.7858,9.37272 63.7866,9.37808 63.7917,9.38187 63.8059,9.37721 63.8063,9.36337 63.7965,9.36196 63.7942,9.36884 63.7911,9.35973 63.7885)),((9.37166 58.8522,9.37919 58.8514,9.39623 58.8544,9.40098 58.8565,9.39381 58.8572,9.37458 58.8554,9.37166 58.8522)),((9.37404 63.6696,9.38142 63.6662,9.38235 63.6592,9.39077 63.6568,9.39487 63.6556,9.40096 63.6566,9.40335 63.6596,9.39947 63.6646,9.40594 63.6681,9.41529 63.6659,9.41903 63.6634,9.42626 63.6626,9.42693 63.6599,9.41632 63.657,9.41491 63.655,9.42979 63.6458,9.44072 63.6429,9.45556 63.6433,9.46254 63.6468,9.46539 63.6507,9.46034 63.6584,9.43904 63.6632,9.43585 63.6741,9.44011 63.6803,9.43627 63.6846,9.42253 63.6916,9.42069 63.6968,9.41061 63.6935,9.40869 63.6912,9.39952 63.6899,9.39812 63.6876,9.40187 63.6849,9.39551 63.6796,9.38282 63.6772,9.37404 63.6696)),((9.38389 63.5898,9.3972 63.5897,9.40215 63.5925,9.40191 63.5966,9.40537 63.5987,9.39905 63.6018,9.38711 63.596,9.38389 63.5898)),((9.38785 63.792,9.39098 63.7914,9.39903 63.7947,9.4073 63.7941,9.41327 63.7978,9.39975 63.7999,9.4068 63.8027,9.41548 63.804,9.42178 63.802,9.42996 63.8032,9.437 63.8063,9.44724 63.8253,9.44496 63.8292,9.42962 63.8269,9.42537 63.8289,9.43336 63.8336,9.42961 63.8358,9.42094 63.8341,9.40969 63.8237,9.40303 63.823,9.40593 63.8175,9.39394 63.811,9.39036 63.7999,9.38785 63.792)),((9.41483 63.5502,9.42071 63.5457,9.42891 63.5453,9.4392 63.553,9.43184 63.5566,9.41483 63.5502)),((9.44848 58.8587,9.45753 58.854,9.45809 58.8515,9.47603 58.8542,9.48802 58.8526,9.49364 58.8549,9.50428 58.8535,9.51037 58.8547,9.51476 58.8556,9.51849 58.8513,9.50667 58.8496,9.50417 58.8466,9.50915 58.8437,9.51577 58.8435,9.51912 58.8472,9.52966 58.848,9.53331 58.855,9.53141 58.8579,9.53518 58.8621,9.52107 58.8621,9.52187 58.864,9.53186 58.8671,9.52415 58.8718,9.51841 58.8719,9.50978 58.8679,9.49695 58.8687,9.48649 58.866,9.48366 58.8607,9.47217 58.8613,9.45641 58.8588,9.45198 58.86,9.44848 58.8587)),((9.45587 58.8486,9.46568 58.8441,9.48043 58.8431,9.49247 58.8391,9.4952 58.8415,9.46824 58.8502,9.45587 58.8486)),((9.46357 63.8284,9.46992 63.8255,9.46965 63.8212,9.48048 63.8211,9.48328 63.8172,9.49856 63.8206,9.51289 63.8319,9.51016 63.8346,9.49533 63.8322,9.49188 63.8294,9.48715 63.831,9.49137 63.8386,9.48861 63.8417,9.48503 63.8412,9.48112 63.8373,9.47598 63.837,9.46357 63.8284)),((9.48382 58.8942,9.48572 58.891,9.55601 58.9081,9.54961 58.9128,9.53591 58.9131,9.51617 58.9103,9.5033 58.9116,9.49206 58.9066,9.4902 58.8993,9.48382 58.8942)),((9.48673 58.8795,9.49316 58.8741,9.49977 58.8742,9.50748 58.8791,9.51242 58.8867,9.5225 58.8882,9.5266 58.8855,9.54537 58.8899,9.54706 58.8915,9.5517 58.8961,9.55869 58.8978,9.55752 58.904,9.55223 58.9039,9.54425 58.8997,9.53775 58.9001,9.49289 58.8892,9.48861 58.8864,9.48673 58.8795)),((9.5035 63.6475,9.5047 63.6443,9.51099 63.6418,9.52793 63.6413,9.55511 63.6505,9.55703 63.6531,9.55226 63.656,9.53617 63.6501,9.52538 63.6504,9.51707 63.6524,9.5035 63.6475)),((9.53937 58.8754,9.54249 58.8745,9.55317 58.8773,9.56609 58.8784,9.57088 58.8821,9.5429 58.8796,9.53937 58.8754)),((9.55272 58.8353,9.56536 58.8384,9.58429 58.8487,9.6047 58.8654,9.61507 58.8703,9.61442 58.8751,9.61858 58.8807,9.61759 58.8832,9.61449 58.8834,9.60971 58.8817,9.58064 58.8612,9.5772 58.8591,9.57575 58.8523,9.55432 58.839,9.55272 58.8353)),((9.57413 58.8935,9.58225 58.891,9.58719 58.891,9.59942 58.9019,9.59906 58.9031,9.59754 58.9025,9.58898 58.9005,9.58174 58.8961,9.57677 58.8969,9.57413 58.8935)),((9.64243 58.9006,9.64258 58.8972,9.64574 58.8954,9.65411 58.8957,9.66044 58.9026,9.6595 58.904,9.65553 58.904,9.64992 58.9009,9.64243 58.9006)),((9.70484 63.8623,9.70906 63.8603,9.71678 63.8608,9.72525 63.8673,9.74274 63.8688,9.76503 63.8782,9.75408 63.8803,9.73687 63.8727,9.71323 63.8704,9.70816 63.8683,9.70484 63.8623)),((9.72068 59.0593,9.7322 59.0487,9.74021 59.0481,9.74506 59.0486,9.74001 59.0529,9.73894 59.0574,9.72952 59.0601,9.72068 59.0593)),((9.74281 59.0385,9.75433 59.0274,9.76035 59.0321,9.75022 59.0416,9.74441 59.0426,9.74281 59.0385)),((9.75568 63.9342,9.76252 63.9208,9.76814 63.9224,9.7705 63.9272,9.76897 63.938,9.76524 63.9402,9.76058 63.9402,9.75568 63.9342)),((9.76967 59.0317,9.77147 59.0198,9.77826 59.0162,9.77981 59.0217,9.77555 59.0285,9.76967 59.0317)),((9.78256 63.8899,9.7842 63.8881,9.82106 63.8957,9.82302 63.8983,9.81978 63.9014,9.81506 63.9028,9.7952 63.8962,9.79119 63.8934,9.78606 63.8927,9.78256 63.8899)),((9.79483 58.9999,9.80303 58.994,9.8061 58.9948,9.80858 58.9994,9.81525 58.9985,9.81786 58.9997,9.81013 59.0051,9.80435 59.0057,9.79564 59.002,9.79483 58.9999)),((9.79898 63.8812,9.80629 63.8796,9.82735 63.8823,9.82573 63.8839,9.80861 63.8854,9.79898 63.8812)),((9.80524 59.0286,9.81383 59.0241,9.8255 59.0085,9.83068 59.0119,9.82886 59.025,9.82159 59.0297,9.8074 59.03,9.80524 59.0286)),((9.83504 63.8954,9.84194 63.8914,9.83537 63.8879,9.83854 63.8863,9.84625 63.8873,9.86147 63.8938,9.8531 63.896,9.85552 63.8999,9.86689 63.8998,9.87371 63.8975,9.8778 63.8987,9.87168 63.9087,9.83849 63.8991,9.83504 63.8954)),((9.84442 64.0247,9.86669 64.0252,9.88598 64.0247,9.87953 64.0127,9.87434 64.0054,9.88836 64.0014,9.90866 64,9.92116 64.0017,9.93258 64.0067,9.94538 64.0088,9.9517 64.0145,9.95132 64.0186,9.93585 64.0289,9.91962 64.0295,9.91753 64.0312,9.92457 64.0336,9.92557 64.0373,9.91056 64.0401,9.90065 64.0524,9.89093 64.0527,9.88099 64.0506,9.88519 64.0427,9.87977 64.0378,9.87146 64.037,9.86012 64.039,9.85023 64.0343,9.84442 64.0247)),((9.91939 63.9305,9.92264 63.9269,9.94031 63.9252,9.95381 63.9367,9.95105 63.941,9.94116 63.9423,9.92269 63.9383,9.92959 63.9342,9.92034 63.9326,9.91939 63.9305)),((9.92563 64.0627,9.93508 64.0596,9.95071 64.0591,9.94158 64.0504,9.94971 64.0467,9.98289 64.0394,9.99125 64.0397,10 64.0439,10.0095 64.0484,10.0242 64.0509,10.0363 64.0501,10.0474 64.0548,10.0464 64.058,10 64.0786,9.99457 64.081,9.98926 64.082,9.94033 64.0742,9.93595 64.0734,9.93481 64.0691,9.92563 64.0627)),((9.95335 64.1117,9.9773 64.1174,9.97522 64.1196,9.95949 64.1179,9.95513 64.1159,9.95335 64.1117)),((10.0012 64.1729,10.0242 64.1782,10.0318 64.1836,10.044 64.1881,10.0413 64.1916,10.0322 64.195,10.0192 64.1966,10.0113 64.1941,10.0109 64.1894,10.0249 64.1913,10.0301 64.1904,10.0281 64.1879,10.0129 64.184,10.0043 64.1785,10.0012 64.1729)),((10.0807 64.1979,10.0834 64.1947,10.0953 64.1966,10.1022 64.1956,10.1123 64.2001,10.1115 64.2017,10.1022 64.2012,10.0983 64.2047,10.093 64.2084,10.0884 64.2005,10.0807 64.1979)),((10.0941 59.011,10.0946 59.0078,10.1017 59.0059,10.1071 59.0059,10.1144 59.0137,10.1114 59.0173,10.1055 59.0175,10.1002 59.016,10.0941 59.011)),((10.1647 64.1698,10.1699 64.1656,10.1778 64.1623,10.1943 64.1647,10.1954 64.1669,10.1692 64.1797,10.1656 64.1771,10.1647 64.1698)),((10.2365 64.2597,10.2493 64.2585,10.2453 64.2488,10.246 64.2461,10.2624 64.2463,10.2628 64.2571,10.255 64.2636,10.2377 64.2617,10.2365 64.2597)),((10.2466 64.2243,10.2667 64.2167,10.2775 64.2174,10.2762 64.2192,10.2677 64.2228,10.252 64.2252,10.2466 64.2243)),((10.2649 64.2882,10.276 64.2885,10.2787 64.2874,10.2912 64.2891,10.3019 64.2926,10.3046 64.2938,10.301 64.297,10.2658 64.2897,10.2649 64.2882)),((10.2707 64.3011,10.2715 64.2981,10.301 64.3005,10.3027 64.3025,10.2824 64.307,10.2707 64.3011)),((10.2767 64.249,10.305 64.2561,10.3036 64.2602,10.3088 64.2686,10.3009 64.273,10.2829 64.2702,10.2784 64.2681,10.2853 64.2593,10.2767 64.249)),((10.3149 59.53,10.3236 59.5215,10.3256 59.5157,10.3299 59.5186,10.33 59.5251,10.3257 59.5311,10.3169 59.5331,10.3149 59.53)),((10.3381 59.1448,10.3382 59.1402,10.3458 59.1388,10.3557 59.1471,10.3571 59.1439,10.3539 59.1393,10.3588 59.1379,10.3624 59.1334,10.3685 59.1407,10.3664 59.1576,10.3606 59.1639,10.3539 59.1659,10.3468 59.1634,10.3381 59.1448)),((10.3465 59.5208,10.3575 59.5126,10.3601 59.5131,10.3623 59.5165,10.3591 59.5213,10.3541 59.5233,10.3478 59.523,10.3465 59.5208)),((10.3467 64.329,10.3597 64.3248,10.3605 64.3231,10.3836 64.3239,10.3785 64.3288,10.3573 64.3389,10.3467 64.329)),((10.3544 59.1149,10.3615 59.1122,10.3625 59.1038,10.3658 59.1064,10.3685 59.1167,10.3672 59.1227,10.3647 59.1233,10.3544 59.1149)),((10.3731 59.4983,10.3967 59.4842,10.4017 59.4847,10.3975 59.489,10.3798 59.4994,10.3748 59.5003,10.3731 59.4983)),((10.378 59.1547,10.3807 59.1337,10.3828 59.1184,10.3818 59.0996,10.386 59.0925,10.3907 59.0999,10.407 59.0867,10.4004 59.083,10.3987 59.078,10.3947 59.0766,10.3946 59.0644,10.3996 59.0581,10.4006 59.0514,10.4108 59.052,10.4231 59.0591,10.4257 59.0668,10.4277 59.0726,10.4307 59.0736,10.4381 59.058,10.447 59.0597,10.4541 59.0579,10.4575 59.0664,10.4508 59.0915,10.4481 59.0931,10.4446 59.0915,10.4465 59.0858,10.4431 59.0768,10.4372 59.0823,10.4398 59.0876,10.4321 59.0951,10.4368 59.1047,10.4321 59.1143,10.4292 59.1076,10.4213 59.1035,10.4181 59.1071,10.4224 59.1138,10.4351 59.1225,10.4336 59.1303,10.4172 59.1266,10.423 59.1465,10.4261 59.1474,10.4306 59.1445,10.4435 59.1443,10.4442 59.1557,10.4397 59.1562,10.4349 59.1543,10.4192 59.1611,10.3933 59.1653,10.3863 59.1607,10.3881 59.1589,10.378 59.1547)),((10.3898 64.368,10.3905 64.3664,10.4171 64.368,10.42 64.3699,10.4033 64.3747,10.3898 64.368)),((10.3902 64.3364,10.4258 64.3311,10.4345 64.333,10.4313 64.337,10.4237 64.3387,10.4146 64.3433,10.404 64.3454,10.3958 64.3453,10.3902 64.3364)),((10.4185 64.3767,10.4192 64.374,10.4335 64.3734,10.4422 64.3753,10.4433 64.3777,10.4355 64.3805,10.4268 64.3772,10.4185 64.3767)),((10.4431 59.2401,10.4456 59.2325,10.4571 59.2235,10.4609 59.2231,10.4633 59.2248,10.4608 59.2316,10.4507 59.2389,10.4459 59.2413,10.4431 59.2401)),((10.4612 59.0815,10.4678 59.0621,10.4748 59.0658,10.472 59.0722,10.4764 59.0772,10.4745 59.0795,10.4612 59.0815)),((10.462 59.2007,10.467 59.1968,10.4736 59.1971,10.4753 59.2021,10.4676 59.2078,10.4637 59.2055,10.462 59.2007)),((10.4768 59.4434,10.4839 59.4365,10.4888 59.4452,10.4854 59.4476,10.4781 59.4461,10.4768 59.4434)),((10.4892 59.199,10.492 59.1933,10.4968 59.1962,10.5016 59.2024,10.4966 59.2077,10.4892 59.199)),((10.5013 59.1915,10.5067 59.1901,10.5094 59.1867,10.5196 59.1918,10.5088 59.199,10.5013 59.1915)),((10.5163 59.3757,10.5236 59.3686,10.5362 59.3643,10.5422 59.3801,10.5399 59.3819,10.5296 59.383,10.5246 59.3869,10.5206 59.3846,10.5216 59.38,10.5163 59.3757)),((10.521 59.0603,10.5269 59.0562,10.53 59.056,10.5312 59.0637,10.5235 59.0699,10.521 59.0603)),((10.5235 59.872,10.5252 59.8609,10.5417 59.8641,10.5443 59.8676,10.5508 59.8695,10.5527 59.873,10.5469 59.8755,10.5396 59.8751,10.5346 59.8778,10.5361 59.8807,10.5334 59.8822,10.5246 59.8766,10.5235 59.872)),((10.5366 59.8577,10.5389 59.855,10.5512 59.855,10.5547 59.8603,10.5619 59.8631,10.5573 59.8679,10.5366 59.8577)),((10.5392 59.7087,10.54 59.7052,10.5464 59.6965,10.5497 59.6972,10.5473 59.7086,10.5429 59.7106,10.5392 59.7087)),((10.5433 59.209,10.5505 59.207,10.563 59.2066,10.5656 59.2077,10.562 59.2107,10.5446 59.2127,10.5433 59.209)),((10.558 59.7171,10.5645 59.7117,10.56 59.7077,10.5656 59.6991,10.5697 59.6982,10.5775 59.687,10.5894 59.6806,10.5984 59.6791,10.6065 59.6809,10.6069 59.6844,10.5977 59.6949,10.5859 59.7005,10.5732 59.7039,10.5709 59.7082,10.5739 59.7169,10.5806 59.7193,10.5765 59.722,10.5675 59.7215,10.5594 59.7194,10.558 59.7171)),((10.5668 59.872,10.5738 59.8599,10.5856 59.8611,10.5945 59.868,10.5849 59.8753,10.5799 59.8766,10.5722 59.8759,10.5668 59.872)),((10.5697 59.2018,10.5756 59.1984,10.578 59.1939,10.58 59.1968,10.5782 59.2019,10.5728 59.2055,10.5697 59.2018)),((10.5919 63.5692,10.5966 63.5672,10.6117 63.5755,10.6255 63.5773,10.6448 63.5886,10.6432 63.5895,10.6258 63.5892,10.6243 63.5871,10.6285 63.5844,10.6091 63.5821,10.5919 63.5692)),((10.6526 64.4869,10.6571 64.4794,10.6561 64.4732,10.6735 64.468,10.6779 64.4702,10.677 64.4757,10.6727 64.4828,10.6584 64.4883,10.6526 64.4869)),((10.6598 64.5479,10.6687 64.5475,10.6729 64.55,10.6843 64.5416,10.6989 64.5403,10.7033 64.5425,10.7065 64.5521,10.7044 64.5544,10.699 64.5556,10.688 64.5538,10.6799 64.5561,10.675 64.5513,10.6667 64.5518,10.6598 64.5479)),((10.6636 64.8621,10.6676 64.8606,10.6782 64.8626,10.7018 64.8755,10.7111 64.8765,10.7181 64.884,10.721 64.8871,10.7164 64.8888,10.7099 64.8876,10.7052 64.8811,10.6913 64.8793,10.672 64.87,10.6636 64.8621)),((10.6782 64.5325,10.6956 64.5214,10.703 64.5195,10.7361 64.5167,10.7452 64.5179,10.7511 64.5205,10.7531 64.5232,10.7262 64.5326,10.7254 64.5378,10.7166 64.5406,10.7149 64.5384,10.7189 64.5354,10.7159 64.5315,10.6992 64.5277,10.6852 64.5373,10.6792 64.5386,10.6782 64.5325)),((10.6874 59.2292,10.6942 59.2157,10.7045 59.2114,10.7116 59.2137,10.6999 59.2213,10.7061 59.2274,10.7033 59.24,10.7072 59.2489,10.6979 59.2427,10.6908 59.242,10.6874 59.2292)),((10.6906 64.8618,10.6977 64.8617,10.7051 64.8681,10.7022 64.8698,10.6906 64.8618)),((10.6955 64.4861,10.7038 64.4844,10.7138 64.4848,10.7284 64.4765,10.7354 64.4801,10.7458 64.4773,10.7474 64.4786,10.7452 64.4846,10.7289 64.4849,10.7195 64.4867,10.7117 64.4907,10.7051 64.4873,10.6955 64.4884,10.6955 64.4861)),((10.6981 64.51,10.6993 64.5073,10.7204 64.5012,10.7258 64.5012,10.7397 64.5063,10.7429 64.5088,10.7366 64.512,10.7244 64.5115,10.7214 64.5098,10.7137 64.5101,10.7039 64.5128,10.6981 64.51)),((10.7177 64.874,10.736 64.8771,10.7402 64.881,10.74 64.8838,10.746 64.8852,10.7423 64.8895,10.7378 64.8887,10.7365 64.8838,10.73 64.8829,10.7177 64.874)),((10.7288 59.3044,10.7315 59.3005,10.7409 59.301,10.7507 59.3069,10.7524 59.3106,10.7488 59.3175,10.7288 59.3044)),((10.7292 64.8382,10.7512 64.838,10.7614 64.8407,10.7752 64.8427,10.7769 64.8449,10.7695 64.8492,10.761 64.8488,10.7429 64.8489,10.7311 64.8461,10.7292 64.8382)),((10.7326 59.2662,10.7379 59.2674,10.7422 59.2664,10.7441 59.2691,10.7474 59.2747,10.7402 59.2784,10.7326 59.2701,10.7326 59.2662)),((10.7334 64.9399,10.7367 64.9391,10.7434 64.9398,10.7581 64.9447,10.7614 64.9483,10.7561 64.9504,10.7471 64.9497,10.7371 64.944,10.7334 64.9399)),((10.742 64.8639,10.7442 64.8615,10.7501 64.8606,10.7857 64.8736,10.7872 64.8716,10.7526 64.8539,10.76 64.851,10.8127 64.8562,10.8571 64.868,10.896 64.8835,10.9132 64.8925,10.918 64.9013,10.9413 64.9115,10.95 64.9092,10.9602 64.911,10.9846 64.9199,11.0193 64.9255,11.0208 64.9233,11.0083 64.9183,10.983 64.9137,10.9523 64.9029,10.93 64.8979,10.9191 64.8833,10.9095 64.8816,10.9017 64.8733,10.864 64.8649,10.8432 64.8518,10.8414 64.8449,10.8458 64.8411,10.8595 64.8387,10.8719 64.839,10.8839 64.8535,10.8908 64.8563,10.9057 64.8585,10.9133 64.8633,10.9308 64.867,10.9377 64.8711,10.9537 64.8719,10.9668 64.8767,10.9776 64.8831,10.9916 64.8812,10.9993 64.8835,11.0137 64.8906,11.0212 64.8943,11.0184 64.908,11.0262 64.9065,11.0335 64.9011,11.0669 64.9107,11.0725 64.9086,11.0378 64.8914,11.0563 64.8892,11.0661 64.8905,11.1104 64.9088,11.1064 64.8983,11.0982 64.8955,11.094 64.8941,11.1042 64.8884,11.0791 64.8748,11.0651 64.8534,11.069 64.8496,11.0832 64.8547,11.0909 64.8532,11.0817 64.8469,11.087 64.8447,11.0967 64.8451,11.1 64.8437,11.0894 64.8368,11.0867 64.8331,11.0885 64.8302,11.0956 64.8303,11.1229 64.8388,11.1258 64.8323,11.1305 64.8315,11.1367 64.8332,11.1378 64.8335,11.14 64.8323,11.1373 64.8286,11.1405 64.826,11.1461 64.8258,11.2279 64.8569,11.2439 64.8614,11.2832 64.8863,11.2895 64.8882,11.2963 64.885,11.3014 64.8858,11.3087 64.8904,11.3121 64.895,11.306 64.9038,11.305 64.9052,11.3091 64.9108,11.3239 64.922,11.3361 64.9254,11.3624 64.9391,11.3723 64.9466,11.3696 64.9478,11.3611 64.9483,11.347 64.9444,11.3314 64.9425,11.3003 64.9322,11.2879 64.9231,11.2885 64.9166,11.2838 64.9086,11.2769 64.9057,11.265 64.9041,11.2606 64.9054,11.2596 64.9116,11.2359 64.9281,11.2267 64.9304,11.2065 64.9304,11.2181 64.9338,11.2298 64.9394,11.2301 64.9413,11.2226 64.9435,11.1887 64.9422,11.1751 64.9444,11.1673 64.9472,11.1589 64.9587,11.1516 64.9604,11.1565 64.9643,11.1282 64.9651,11.1446 64.9687,11.1578 64.9737,11.1603 64.979,11.1568 64.9808,11.1394 64.978,11.1301 64.9791,11.0928 64.9786,11.0321 64.969,10.9931 64.9608,10.9769 64.9553,10.9709 64.9553,10.9631 64.9579,10.9537 64.9569,10.916 64.9409,10.9004 64.9391,10.8903 64.936,10.8673 64.9202,10.8582 64.9162,10.8563 64.9179,10.8654 64.927,10.8598 64.9284,10.8538 64.9258,10.8462 64.9185,10.8292 64.9162,10.8467 64.9283,10.8431 64.9301,10.828 64.9298,10.8134 64.9281,10.8062 64.9222,10.7984 64.919,10.7643 64.9108,10.7614 64.9101,10.7635 64.9066,10.7795 64.9051,10.7834 64.911,10.7899 64.9111,10.8008 64.909,10.8005 64.9048,10.7898 64.9029,10.7857 64.8989,10.7612 64.8962,10.7547 64.8924,10.7535 64.889,10.7656 64.8828,10.752 64.8745,10.7583 64.8739,10.766 64.8761,10.7869 64.889,10.8008 64.8897,10.8113 64.8919,10.8285 64.8984,10.8356 64.9034,10.8476 64.9119,10.8531 64.9118,10.8495 64.9041,10.8462 64.9029,10.8393 64.8963,10.8125 64.8855,10.8012 64.8816,10.7925 64.8839,10.7872 64.881,10.7816 64.8779,10.742 64.8639)),((10.7476 64.5044,10.761 64.502,10.7615 64.5081,10.7591 64.5135,10.7476 64.5044)),((10.7504 59.8658,10.7531 59.8643,10.7612 59.8635,10.7662 59.8649,10.7696 59.8728,10.7684 59.8744,10.7638 59.874,10.7608 59.8674,10.7527 59.8674,10.7504 59.8658)),((10.7606 59.2134,10.7647 59.2068,10.7709 59.2066,10.7768 59.1942,10.784 59.1901,10.7928 59.1991,10.7928 59.2039,10.7887 59.205,10.7685 59.2223,10.7659 59.2217,10.7606 59.2134)),((10.7635 59.1103,10.7689 59.1002,10.7808 59.1044,10.767 59.1112,10.7635 59.1103)),((10.7705 64.98,10.7715 64.9779,10.781 64.9798,10.8036 64.9868,10.7989 64.9911,10.7792 64.9897,10.7768 64.9877,10.7807 64.9852,10.7705 64.98)),((10.7712 64.5344,10.7882 64.5303,10.78 64.5245,10.7809 64.5225,10.8287 64.5181,10.8432 64.5183,10.8117 64.5332,10.7993 64.5428,10.7904 64.547,10.7852 64.5465,10.7858 64.5403,10.7712 64.5344)),((10.7827 64.5712,10.7889 64.5682,10.8034 64.5685,10.8118 64.5666,10.8324 64.5676,10.8382 64.569,10.8418 64.5731,10.8422 64.5796,10.8368 64.5854,10.8324 64.5858,10.7974 64.5782,10.7924 64.5736,10.7832 64.5738,10.7827 64.5712)),((10.8056 64.9716,10.8174 64.9684,10.8336 64.9584,10.8249 64.9497,10.8321 64.9496,10.8447 64.9555,10.8516 64.9693,10.8857 64.9856,10.8709 64.986,10.8797 64.9956,10.8769 64.997,10.8524 64.994,10.8455 64.9912,10.844 64.9885,10.8562 64.9869,10.8508 64.9832,10.8268 64.9803,10.8074 64.9748,10.8056 64.9716)),((10.8228 64.9963,10.826 64.9954,10.8351 64.9971,10.8405 65,10.8492 65.0047,10.8504 65.0069,10.8459 65.0084,10.8392 65.0074,10.8283 65,10.8228 64.9963)),((10.8347 59.093,10.844 59.0894,10.8512 59.0745,10.857 59.0727,10.8544 59.0668,10.8611 59.0643,10.869 59.0686,10.8748 59.0691,10.8845 59.0764,10.8867 59.075,10.8832 59.0714,10.8854 59.0652,10.8956 59.0712,10.9194 59.0927,10.9229 59.0993,10.922 59.1053,10.9194 59.1079,10.9135 59.1137,10.9078 59.1112,10.9033 59.1126,10.8962 59.1085,10.8887 59.1075,10.8878 59.1046,10.8847 59.1036,10.8763 59.1064,10.8767 59.1125,10.8731 59.1141,10.8687 59.1134,10.8572 59.1082,10.8475 59.0999,10.8381 59.0994,10.8347 59.093)),((10.8531 64.5226,10.8768 64.5118,10.888 64.5195,10.877 64.5246,10.8957 64.525,10.8932 64.5271,10.874 64.529,10.8694 64.5321,10.8563 64.5287,10.8531 64.5226)),((10.8579 64.9638,10.8801 64.961,10.8982 64.9657,10.9198 64.9688,10.9286 64.9663,10.9493 64.9691,10.9558 64.9729,10.9438 64.9789,10.9439 64.9835,10.9563 64.989,10.9493 64.991,10.9355 64.9887,10.9287 64.9893,10.9217 64.9917,10.9027 64.9853,10.9096 64.9829,10.8723 64.972,10.8587 64.9669,10.8579 64.9638)),((10.8653 64.552,10.8746 64.5493,10.8909 64.5467,10.8927 64.5487,10.8719 64.5542,10.8656 64.5539,10.8653 64.552)),((10.8669 64.6088,10.8686 64.6001,10.8766 64.5992,10.8884 64.6006,10.8923 64.6039,10.8894 64.6081,10.8899 64.613,10.8837 64.616,10.873 64.6133,10.8669 64.6088)),((10.8763 59.04,10.8785 59.0384,10.8887 59.038,10.891 59.0318,10.9029 59.0373,10.8962 59.0483,10.8895 59.0474,10.8842 59.0508,10.8763 59.04)),((10.8783 64.9904,10.8888 64.9874,10.9015 64.9907,10.9066 64.9938,10.8891 64.9924,10.8783 64.9904)),((10.8851 64.5622,10.8924 64.5531,10.9264 64.5482,10.9276 64.5504,10.9012 64.5624,10.8915 64.5634,10.8851 64.5622)),((10.8982 59.0624,10.8999 59.0602,10.9117 59.058,10.9209 59.058,10.9235 59.0615,10.9285 59.0628,10.9353 59.0706,10.9403 59.0841,10.9488 59.0897,10.9513 59.0993,10.9344 59.0971,10.9268 59.0932,10.9032 59.0689,10.8982 59.0624)),((10.921 59.047,10.937 59.0426,10.9366 59.0392,10.9428 59.0392,10.9517 59.0255,10.9557 59.0257,10.9566 59.0308,10.9734 59.0303,10.9756 59.0358,10.9738 59.0434,10.9631 59.0507,10.9666 59.0562,10.9599 59.0717,10.9634 59.0777,10.9594 59.0811,10.9408 59.0808,10.9444 59.0744,10.9377 59.0696,10.9307 59.0557,10.924 59.0496,10.921 59.047)),((10.9515 58.9852,10.955 58.9825,10.9533 58.9798,10.9617 58.9763,10.9652 58.9816,10.9532 58.9882,10.9515 58.9852)),((10.9571 59.0946,10.966 59.0898,10.9634 59.0937,10.9669 59.0992,10.9633 59.1024,10.9571 59.0946)),((10.983 59.0587,10.9901 59.0578,10.9879 59.0527,10.9981 59.058,10.9896 59.0653,10.9843 59.0642,10.983 59.0587)),((10.9835 64.8601,10.987 64.8586,11.0127 64.8743,11.0156 64.8776,11.0109 64.8784,10.9873 64.8713,10.9835 64.8601)),((10.9865 59.0779,10.9871 59.0773,10.9918 59.0724,10.9958 59.0713,11.0043 59.0589,11.0008 59.0525,10.995 59.0491,10.9942 59.0447,10.9977 59.0367,10.9938 59.0301,10.9973 59.0267,11.0093 59.0276,11.0155 59.026,11.0111 59.0228,11.0115 59.0196,11.0235 59.0175,11.035 59.0242,11.043 59.0235,11.0553 59.0281,11.0589 59.0539,11.0695 59.0558,11.0796 59.0637,11.0805 59.0644,11.0832 59.0688,11.0801 59.0841,11.0654 59.0814,11.0752 59.0777,11.077 59.0741,11.0734 59.0736,11.0579 59.0777,11.0473 59.0772,11.0358 59.0686,11.0322 59.0706,11.0353 59.0768,11.0322 59.0836,11.0366 59.0912,11.0281 59.0955,11.0033 59.0889,10.9869 59.0809,10.9865 59.0779)),((10.9891 64.838,10.9985 64.8293,11.0073 64.8302,11.0087 64.8345,10.9971 64.8445,10.9927 64.8446,10.9891 64.838)),((11.0047 63.7534,11.0067 63.748,11.0185 63.7505,11.0355 63.7491,11.0437 63.7507,11.055 63.7578,11.0571 63.7626,11.0735 63.7646,11.0921 63.7717,11.1049 63.7783,11.1075 63.7831,11.1204 63.7865,11.1327 63.7872,11.1523 63.8036,11.1894 63.7993,11.2017 63.7942,11.2105 63.7981,11.2121 63.7998,11.2157 63.8033,11.2373 63.8092,11.2337 63.8124,11.2209 63.8166,11.2271 63.8193,11.226 63.8207,11.192 63.8211,11.1647 63.8127,11.141 63.8084,11.0977 63.8039,11.0858 63.8002,11.0596 63.8039,11.0539 63.8029,11.0423 63.7917,11.0375 63.7763,11.0169 63.768,11.0092 63.7616,11.0047 63.7534)),((11.0188 64.8251,11.0218 64.8247,11.0292 64.8276,11.0361 64.8365,11.0382 64.8392,11.0348 64.8408,11.0276 64.8372,11.0188 64.8251)),((11.0258 64.8731,11.0352 64.8692,11.0292 64.8631,11.0354 64.8613,11.0429 64.8617,11.0541 64.877,11.0554 64.8803,11.0527 64.8815,11.0377 64.8796,11.0273 64.876,11.0258 64.8731)),((11.0314 65.0136,11.0424 65.0098,11.059 65.0118,11.071 65.0146,11.08 65.0202,11.0809 65.0231,11.076 65.0255,11.0506 65.0269,11.0468 65.0257,11.0486 65.0228,11.0583 65.0196,11.052 65.0178,11.0464 65.018,11.0314 65.0136)),((11.0355 58.9944,11.0514 58.9883,11.0554 58.9903,11.0567 58.9938,11.055 58.9967,11.0483 58.9999,11.0474 59.0061,11.0443 59.0054,11.0355 58.9944)),((11.0357 64.9867,11.0482 64.981,11.0609 64.9843,11.0695 64.9916,11.0637 64.9929,11.0455 64.9905,11.0357 64.9867)),((11.0575 64.9802,11.0607 64.976,11.0725 64.9786,11.102 64.9848,11.1059 64.9878,11.0926 64.9857,11.0709 64.9851,11.0575 64.9802)),((11.058 59.0109,11.0669 59.0059,11.0647 59.0031,11.0709 58.9981,11.0837 58.9993,11.0846 59.0098,11.0895 59.013,11.0996 59.0139,11.1041 59.0169,11.1112 59.0162,11.1147 59.0176,11.1098 59.0242,11.1001 59.0233,11.0762 59.021,11.0669 59.0164,11.0629 59.0198,11.0593 59.0192,11.058 59.0109)),((11.0902 65.0059,11.0907 65.0025,11.0992 65,11.102 64.9992,11.1367 64.9978,11.1454 64.9992,11.1465 65,11.149 65.002,11.1447 65.0105,11.1325 65.0207,11.1219 65.0224,11.1077 65.0222,11.1003 65.0202,11.0978 65.0172,11.1018 65.0131,11.0902 65.0059)),((11.1081 64.748,11.1086 64.7443,11.119 64.7428,11.1172 64.7397,11.1241 64.74,11.1564 64.7456,11.1627 64.7498,11.1553 64.7518,11.1345 64.7508,11.1254 64.7517,11.1135 64.7505,11.1081 64.748)),((11.1147 59.1102,11.1222 59.1026,11.1275 59.1005,11.1369 59.1079,11.1351 59.1109,11.1449 59.1175,11.1427 59.1195,11.1271 59.1221,11.116 59.1145,11.1147 59.1102)),((11.1193 63.7343,11.1368 63.7377,11.1373 63.7445,11.1214 63.7377,11.1193 63.7343)),((11.1209 59.1399,11.1293 59.1344,11.1329 59.1351,11.1378 59.1429,11.1325 59.1477,11.1209 59.1399)),((11.1543 64.6639,11.1571 64.6623,11.1877 64.6594,11.1934 64.6573,11.1918 64.656,11.1732 64.6552,11.1653 64.6511,11.1753 64.6468,11.1645 64.6418,11.1665 64.6384,11.2038 64.6384,11.2218 64.6345,11.2292 64.636,11.2351 64.6411,11.2447 64.6414,11.2488 64.6401,11.2541 64.6385,11.2618 64.6384,11.2572 64.6338,11.2698 64.6186,11.2769 64.6147,11.3011 64.6074,11.3128 64.6004,11.3283 64.6132,11.3293 64.6173,11.3396 64.6197,11.3372 64.6415,11.3549 64.6645,11.3556 64.6669,11.3576 64.6745,11.3556 64.6806,11.3485 64.683,11.3258 64.6805,11.3049 64.6838,11.289 64.6816,11.2898 64.6835,11.298 64.686,11.3145 64.6878,11.3209 64.6906,11.3144 64.6931,11.2972 64.689,11.2214 64.6839,11.199 64.6793,11.1867 64.6751,11.1667 64.6729,11.1656 64.6727,11.166 64.6704,11.1714 64.6692,11.1927 64.6702,11.1948 64.669,11.191 64.6666,11.1589 64.6657,11.1543 64.6639)),((11.1566 64.8155,11.1582 64.8133,11.1688 64.8102,11.1807 64.8116,11.2498 64.8365,11.2429 64.8388,11.2219 64.8381,11.2278 64.842,11.2545 64.8446,11.267 64.8483,11.2675 64.8523,11.2643 64.8546,11.2542 64.8564,11.2383 64.8554,11.2253 64.8515,11.2034 64.8405,11.2009 64.8362,11.1647 64.8207,11.1566 64.8155)),((11.1602 64.7257,11.1689 64.7234,11.1838 64.7327,11.184 64.7348,11.1728 64.733,11.1602 64.7257)),((11.1898 64.4586,11.1948 64.4583,11.2024 64.4642,11.2137 64.4617,11.2204 64.4636,11.2347 64.4629,11.2504 64.4651,11.2586 64.4676,11.2628 64.4688,11.276 64.4757,11.2768 64.4774,11.2647 64.4794,11.2708 64.4876,11.2651 64.4922,11.2405 64.4956,11.2337 64.4925,11.2217 64.4955,11.2115 64.4942,11.207 64.4908,11.2044 64.482,11.2133 64.4714,11.2091 64.4699,11.1989 64.4698,11.1898 64.4586)),((11.2167 64.7729,11.2299 64.77,11.245 64.7742,11.2409 64.7773,11.2167 64.7729)),((11.234 64.7931,11.2407 64.7926,11.2566 64.7974,11.2599 64.7997,11.2482 64.8004,11.2422 64.7993,11.234 64.7931)),((11.2433 64.7868,11.261 64.7847,11.2766 64.7864,11.3013 64.7935,11.3066 64.7962,11.3084 64.801,11.3075 64.8042,11.2673 64.8003,11.2626 64.796,11.2463 64.791,11.2433 64.7868)),((11.3379 64.4027,11.347 64.4013,11.3541 64.4035,11.3606 64.4021,11.364 64.4029,11.3565 64.4104,11.3479 64.4093,11.3379 64.4027)),((11.3633 64.9132,11.3734 64.9126,11.3878 64.9172,11.3887 64.92,11.3749 64.9178,11.3634 64.9153,11.3633 64.9132)),((11.3981 64.9488,11.402 64.9461,11.3993 64.941,11.4082 64.9382,11.4196 64.937,11.4427 64.943,11.4519 64.9472,11.4594 64.9552,11.4605 64.959,11.4554 64.9618,11.446 64.9634,11.4403 64.9625,11.4239 64.955,11.4022 64.9533,11.3981 64.9488)),((11.4771 64.9776,11.49 64.9742,11.4904 64.9798,11.4919 64.9825,11.4815 64.9852,11.4771 64.9776)),((11.4816 64.5754,11.4967 64.5677,11.5012 64.5686,11.5018 64.5723,11.4926 64.5786,11.4866 64.5802,11.4816 64.5754)),((11.4932 64.7987,11.5154 64.7978,11.533 64.7999,11.5352 64.8035,11.5319 64.8063,11.5116 64.8054,11.4942 64.8015,11.4932 64.7987)),((11.5155 65.0553,11.5187 65.053,11.5469 65.0461,11.545 65.0427,11.5516 65.039,11.5627 65.0373,11.5888 65.0404,11.604 65.0446,11.628 65.0592,11.6808 65.0759,11.7108 65.0828,11.7231 65.0888,11.7265 65.0894,11.736 65.0909,11.7492 65.0972,11.7812 65.1075,11.7879 65.1203,11.7844 65.1235,11.7526 65.114,11.7372 65.1128,11.7332 65.1065,11.7246 65.1049,11.719 65.1063,11.7153 65.1137,11.7046 65.1171,11.6837 65.1169,11.6717 65.1193,11.6537 65.1188,11.6385 65.1145,11.6145 65.1089,11.5957 65.1077,11.586 65.11,11.5742 65.1091,11.5644 65.1063,11.5586 65.0982,11.5634 65.0946,11.5599 65.0925,11.5535 65.0909,11.5424 65.0923,11.5281 65.0873,11.5272 65.0842,11.5348 65.0792,11.5378 65.0697,11.5304 65.0652,11.5286 65.0597,11.5282 65.0588,11.5155 65.0553)),((11.5237 64.971,11.5303 64.9697,11.5418 64.9722,11.547 64.9753,11.5486 64.978,11.5451 64.9798,11.5237 64.971)),((11.6468 64.7995,11.6489 64.7983,11.6765 64.8013,11.682 64.8024,11.6829 64.8041,11.6723 64.8047,11.6497 64.803,11.6468 64.7995)),((11.648 65.0549,11.6601 65.056,11.6614 65.0531,11.6524 65.0471,11.6481 65.0403,11.6545 65.0396,11.6718 65.0428,11.7054 65.0606,11.7067 65.0639,11.6881 65.0704,11.6792 65.0693,11.6575 65.0621,11.649 65.0577,11.648 65.0549)),((11.6829 65.128,11.6877 65.127,11.7134 65.1326,11.7195 65.1326,11.7285 65.1358,11.7311 65.1388,11.7226 65.1421,11.6854 65.1312,11.6829 65.128)),((11.7137 65.6749,11.7312 65.6656,11.7374 65.6644,11.7615 65.6685,11.7625 65.6725,11.7571 65.676,11.7277 65.6829,11.7137 65.6749)),((11.7379 64.7895,11.7427 64.7832,11.7487 64.7806,11.7735 64.7797,11.7733 64.7815,11.7637 64.7838,11.7567 64.7914,11.7379 64.7895)),((11.7597 65.6203,11.7671 65.6162,11.7776 65.614,11.7984 65.6139,11.8315 65.6165,11.8409 65.6153,11.8456 65.6136,11.8437 65.6088,11.8506 65.6058,11.8607 65.607,11.8659 65.6053,11.8606 65.6008,11.866 65.5986,11.889 65.5984,11.8924 65.5959,11.8897 65.5904,11.9039 65.5919,11.9207 65.5938,11.9401 65.6009,11.9529 65.6118,12.007 65.6391,12.0245 65.6521,12.0202 65.6583,12.0261 65.6671,12.0172 65.6709,12.0052 65.6714,12.0063 65.6754,11.9998 65.6789,12.0023 65.6823,12.0124 65.6823,12.0149 65.6791,12.016 65.6777,12.0382 65.6689,12.0563 65.6699,12.0604 65.6656,12.0663 65.6648,12.0723 65.6708,12.081 65.6673,12.1096 65.6702,12.122 65.6755,12.1304 65.6849,12.1319 65.6936,12.1293 65.6957,12.1027 65.6975,12.0923 65.6929,12.0799 65.6943,12.0658 65.697,12.06 65.6908,12.0542 65.6897,12.0516 65.684,12.0369 65.6801,12.0228 65.691,12.0216 65.7031,12.0242 65.7091,12.0179 65.7147,12.0094 65.7173,12.0061 65.7106,11.9821 65.7142,11.9393 65.7103,11.9238 65.711,11.9097 65.7137,11.8902 65.7132,11.8828 65.7095,11.8655 65.7091,11.8523 65.7059,11.8273 65.6971,11.818 65.6913,11.8085 65.6793,11.8003 65.6736,11.7916 65.6559,11.7913 65.6553,11.7597 65.6203)),((11.9129 67.4564,11.9189 67.4551,11.9371 67.4614,11.9446 67.4675,11.9471 67.47,11.9421 67.4718,11.9235 67.4661,11.9129 67.4564)),((11.9963 67.4788,12.0062 67.4744,12.012 67.4736,12.0214 67.4849,12.024 67.4871,12.0206 67.4892,12.0021 67.4887,11.9963 67.4788)),((11.9977 66.0426,12.0011 66.04,12.0476 66.0581,12.0378 66.0595,12.0252 66.057,12.0243 66.059,12.0397 66.0673,12.0347 66.0695,12.0209 66.0644,12.0127 66.0557,12.0118 66.051,11.9977 66.0426)),((12.0041 65.3963,12.0122 65.3929,12.0198 65.3935,12.0247 65.3962,12.0269 65.4016,12.0356 65.402,12.0376 65.4026,12.0219 65.4096,12.0141 65.407,12.0077 65.4077,12.0041 65.3963)),((12.0044 66.5075,12.0205 66.5052,12.0147 66.4985,12.0198 66.4963,12.0405 66.4994,12.0558 66.5041,12.0581 66.5071,12.0502 66.5118,12.0507 66.516,12.0469 66.5167,12.0263 66.5079,12.0061 66.5116,12.0044 66.5075)),((12.022 65.4548,12.0439 65.4585,12.0475 65.4606,12.049 65.4623,12.0453 65.4632,12.0273 65.4596,12.023 65.4579,12.022 65.4548)),((12.024 66.5307,12.031 66.5254,12.0403 66.5225,12.0537 66.5225,12.062 66.5235,12.0631 66.525,12.0543 66.5304,12.0357 66.5317,12.0253 66.5342,12.024 66.5307)),((12.0322 65.8198,12.042 65.8193,12.0504 65.8261,12.0526 65.8277,12.0464 65.8291,12.0327 65.8226,12.0322 65.8198)),((12.0437 65.4242,12.0465 65.4054,12.0559 65.4042,12.0798 65.4149,12.0868 65.4236,12.0895 65.4216,12.0885 65.4128,12.0791 65.4084,12.0761 65.4038,12.0799 65.3971,12.0993 65.3932,12.1073 65.3967,12.1126 65.4149,12.1081 65.4204,12.1219 65.4302,12.1259 65.4393,12.1469 65.4519,12.1561 65.466,12.1641 65.4737,12.17 65.4795,12.1663 65.4817,12.1561 65.4822,12.146 65.4771,12.1398 65.4636,12.1352 65.4573,12.1225 65.4515,12.1183 65.4455,12.1026 65.4365,12.0996 65.4383,12.1108 65.4449,12.1133 65.4523,12.1224 65.4585,12.1279 65.4681,12.1192 65.4664,12.1062 65.4559,12.103 65.4502,12.0827 65.4388,12.0437 65.4242)),((12.0449 65.8084,12.0494 65.8071,12.0593 65.8145,12.0601 65.8192,12.0561 65.8207,12.0449 65.8084)),((12.0457 65.7489,12.0537 65.7499,12.0685 65.7563,12.071 65.7583,12.0662 65.7605,12.0516 65.7523,12.0459 65.7512,12.0457 65.7489)),((12.0462 66.0733,12.0485 66.0719,12.0617 66.08,12.0642 66.082,12.06 66.0838,12.0489 66.0777,12.0462 66.0733)),((12.0628 66.496,12.0897 66.5009,12.0914 66.5038,12.087 66.5058,12.0684 66.5006,12.0628 66.496)),((12.0709 67.5213,12.0746 67.5157,12.1023 67.5162,12.1193 67.5201,12.1298 67.5263,12.1315 67.5294,12.1248 67.5322,12.1019 67.5319,12.0895 67.5353,12.0828 67.5325,12.0709 67.5213)),((12.074 65.4731,12.0786 65.4649,12.0829 65.4638,12.0904 65.4659,12.1033 65.4657,12.1508 65.4907,12.1627 65.4957,12.1581 65.4999,12.1604 65.5013,12.1584 65.5037,12.1482 65.5018,12.1413 65.5021,12.1328 65.4995,12.1137 65.4945,12.0897 65.4809,12.0779 65.4773,12.074 65.4731)),((12.0773 65.9033,12.0879 65.9106,12.0898 65.9128,12.0834 65.9158,12.0789 65.9143,12.0773 65.9033)),((12.0833 65.4911,12.1055 65.4953,12.1148 65.5001,12.1206 65.5061,12.1396 65.5155,12.1534 65.5281,12.1549 65.5337,12.1511 65.5337,12.1285 65.5194,12.1032 65.5023,12.0889 65.4978,12.0833 65.4911)),((12.112 65.9111,12.1173 65.9094,12.1257 65.915,12.1264 65.92,12.1219 65.9227,12.118 65.9212,12.117 65.9154,12.112 65.9111)),((12.12 65.4199,12.1217 65.413,12.1266 65.4134,12.1282 65.4216,12.1201 65.4228,12.12 65.4199)),((12.1246 65.6097,12.134 65.6059,12.1318 65.6034,12.1316 65.5998,12.1357 65.6001,12.1508 65.6033,12.1589 65.6081,12.1862 65.6425,12.1678 65.6502,12.1371 65.6284,12.1332 65.6228,12.1376 65.6175,12.1369 65.614,12.1246 65.6097)),((12.1324 65.4288,12.1367 65.4224,12.1398 65.4217,12.1437 65.4229,12.154 65.4399,12.1502 65.4438,12.138 65.4302,12.1324 65.4288)),((12.1399 66.0136,12.1422 66.0096,12.1505 66.0073,12.1596 66.0087,12.1678 66.0136,12.1657 66.0172,12.1514 66.0174,12.1399 66.0136)),((12.1546 65.9136,12.1615 65.9106,12.1709 65.9112,12.1727 65.9137,12.1614 65.9217,12.1572 65.9209,12.1546 65.9136)),((12.1837 65.4517,12.1877 65.4499,12.2015 65.453,12.2099 65.4584,12.2269 65.4631,12.2205 65.4663,12.2273 65.4717,12.2203 65.4807,12.2141 65.4807,12.1926 65.4667,12.1876 65.4612,12.1925 65.4586,12.1837 65.4517)),((12.195 65.4377,12.1998 65.4341,12.2095 65.4361,12.2203 65.4439,12.2102 65.4441,12.2007 65.4413,12.195 65.4377)),((12.2009 66.0092,12.2019 66.0067,12.2135 66.0022,12.2159 65.9938,12.2048 65.9863,12.2083 65.9833,12.2159 65.9868,12.231 65.9874,12.2425 65.9926,12.2472 65.9992,12.2456 66.003,12.2295 66.013,12.221 66.0157,12.2125 66.0156,12.2044 66.0132,12.2009 66.0092)),((12.2062 65.938,12.2092 65.9363,12.2722 65.9567,12.2836 65.9621,12.2752 65.9631,12.2167 65.9496,12.2062 65.938)),((12.2157 65.7955,12.2186 65.7939,12.226 65.7951,12.2278 65.8003,12.2281 65.8091,12.2249 65.8126,12.2157 65.7955)),((12.2234 65.9635,12.2433 65.9649,12.2435 65.963,12.2363 65.9612,12.2386 65.9583,12.2633 65.9644,12.2727 65.9636,12.2795 65.9692,12.2866 65.9699,12.2872 65.9725,12.2775 65.9878,12.284 65.9941,12.271 65.9966,12.2602 65.9938,12.2507 65.9881,12.2464 65.9834,12.2493 65.9803,12.2468 65.9769,12.2254 65.9669,12.2234 65.9635)),((12.2372 65.8457,12.2405 65.8433,12.2459 65.8439,12.2496 65.8553,12.2638 65.8607,12.2609 65.864,12.2717 65.8744,12.2829 65.8775,12.2909 65.8855,12.294 65.8931,12.314 65.9009,12.3185 65.8969,12.3229 65.8985,12.3278 65.9114,12.3472 65.9206,12.3576 65.9201,12.3648 65.9258,12.3743 65.9333,12.3635 65.9377,12.3509 65.9393,12.3444 65.9384,12.3363 65.9346,12.3273 65.9359,12.3144 65.9329,12.3034 65.9224,12.3114 65.9209,12.3045 65.917,12.3191 65.9145,12.3104 65.9083,12.2903 65.8993,12.2831 65.8921,12.2733 65.887,12.2639 65.8769,12.2523 65.8708,12.2423 65.8689,12.244 65.8642,12.2372 65.8457)),((12.2497 66.2527,12.2539 66.2509,12.2637 66.2523,12.2685 66.2559,12.2668 66.2585,12.2642 66.2618,12.2593 66.2613,12.2519 66.2571,12.2497 66.2527)),((12.2512 66.2422,12.2586 66.2411,12.2685 66.2422,12.2871 66.2511,12.2772 66.2502,12.2518 66.2436,12.2512 66.2422)),((12.2527 65.8384,12.2568 65.8366,12.2649 65.8376,12.2667 65.8428,12.2684 65.8469,12.2651 65.8494,12.2585 65.849,12.2527 65.8384)),((12.2538 65.938,12.2612 65.9381,12.2895 65.9451,12.3036 65.9468,12.3076 65.948,12.3007 65.9496,12.2837 65.9468,12.2571 65.941,12.2538 65.938)),((12.2674 65.9096,12.2696 65.9083,12.2743 65.9091,12.2974 65.9232,12.2876 65.9251,12.3034 65.9308,12.2954 65.9323,12.2772 65.9297,12.2709 65.9216,12.2752 65.9194,12.2791 65.9168,12.2674 65.9096)),((12.2739 66.032,12.2837 66.029,12.2744 66.0226,12.2782 66.0217,12.2937 66.0255,12.2965 66.0324,12.3043 66.0369,12.303 66.0428,12.2841 66.0432,12.2777 66.042,12.2739 66.039,12.2775 66.0358,12.2739 66.032)),((12.2744 66.128,12.2766 66.1242,12.3036 66.1306,12.3128 66.1361,12.3265 66.1403,12.3335 66.1537,12.341 66.1563,12.3554 66.1559,12.3757 66.1649,12.3765 66.1651,12.3918 66.1676,12.3931 66.1728,12.3857 66.1781,12.3738 66.1752,12.3627 66.1701,12.3429 66.178,12.342 66.1758,12.3318 66.1742,12.2837 66.1413,12.2842 66.1347,12.2744 66.128)),((12.2782 65.4669,12.2852 65.4662,12.2949 65.4697,12.3002 65.4744,12.2975 65.477,12.2938 65.4765,12.2782 65.4669)),((12.2852 65.6554,12.2872 65.6532,12.2927 65.6534,12.2977 65.6632,12.2947 65.6651,12.2899 65.6631,12.2852 65.6554)),((12.2893 65.984,12.2976 65.9721,12.3141 65.979,12.3193 65.9761,12.3251 65.9783,12.3339 65.9875,12.3386 65.9885,12.3423 65.9862,12.3409 65.9829,12.3476 65.9845,12.3474 65.9891,12.3433 65.9909,12.3268 65.991,12.3244 65.9924,12.337 65.9965,12.3492 66.0054,12.3617 66.0095,12.3788 66.0123,12.3839 66.0152,12.3874 66.0175,12.3819 66.0185,12.3258 66.0113,12.2979 65.9989,12.2893 65.984)),((12.303 66.3615,12.3064 66.3589,12.316 66.3566,12.3486 66.356,12.3637 66.3695,12.3649 66.3735,12.352 66.374,12.3436 66.3788,12.3235 66.3772,12.303 66.3615)),((12.3046 65.6572,12.3114 65.653,12.3325 65.6494,12.3398 65.6494,12.3457 65.6512,12.3517 65.653,12.3623 65.6602,12.3732 65.6721,12.4084 65.6932,12.4521 65.7254,12.4534 65.7292,12.4503 65.7313,12.4363 65.7271,12.4064 65.716,12.3932 65.7029,12.3822 65.6982,12.3523 65.6917,12.3299 65.6805,12.3073 65.6643,12.3046 65.6572)),((12.3066 66.2265,12.3129 66.2264,12.3347 66.2307,12.3246 66.2328,12.3133 66.2311,12.3073 66.2289,12.3066 66.2265)),((12.3075 66.0209,12.31 66.019,12.315 66.0179,12.3878 66.0291,12.4198 66.0315,12.5333 66.0573,12.547 66.0604,12.5619 66.0658,12.5807 66.077,12.5885 66.086,12.5959 66.0888,12.6414 66.0932,12.6502 66.097,12.6609 66.1045,12.6561 66.1164,12.6541 66.1228,12.6414 66.1245,12.6072 66.1174,12.6044 66.1186,12.628 66.1252,12.623 66.129,12.6368 66.1374,12.6423 66.1379,12.6201 66.1462,12.6101 66.1442,12.5982 66.1325,12.5854 66.1275,12.559 66.1264,12.5526 66.135,12.5558 66.1371,12.5774 66.1409,12.5851 66.1423,12.6163 66.1515,12.6244 66.1569,12.6178 66.1646,12.6283 66.1868,12.6089 66.2052,12.6058 66.2142,12.5916 66.2293,12.5836 66.2292,12.5736 66.2258,12.5554 66.2239,12.5484 66.2213,12.5541 66.2187,12.5561 66.2191,12.5706 66.2219,12.5724 66.2201,12.5529 66.2117,12.5457 66.2056,12.5311 66.2007,12.4727 66.1978,12.4608 66.1961,12.4563 66.193,12.463 66.1907,12.4731 66.1897,12.4756 66.1878,12.4554 66.1716,12.4301 66.1607,12.4278 66.158,12.4336 66.1579,12.4497 66.1646,12.4525 66.1652,12.4679 66.169,12.4908 66.1772,12.5032 66.1792,12.5193 66.1791,12.5295 66.1766,12.5349 66.1702,12.5609 66.1724,12.569 66.1708,12.563 66.1686,12.5454 66.167,12.539 66.1631,12.5483 66.1625,12.5675 66.1661,12.5694 66.1642,12.5333 66.1546,12.5057 66.1396,12.5032 66.1377,12.4831 66.1221,12.4873 66.1173,12.4819 66.1111,12.4708 66.1118,12.3773 66.0988,12.3616 66.094,12.3359 66.0777,12.3408 66.0769,12.3595 66.0812,12.3899 66.0809,12.3926 66.0814,12.4196 66.0861,12.4306 66.0859,12.448 66.0906,12.4637 66.0914,12.446 66.0844,12.381 66.0678,12.377 66.065,12.3875 66.0618,12.3714 66.0579,12.3617 66.0482,12.3504 66.0453,12.335 66.0469,12.3143 66.0404,12.3229 66.0384,12.3294 66.037,12.332 66.0346,12.3094 66.0261,12.3075 66.0209)),((12.3091 65.2026,12.315 65.2016,12.3289 65.2068,12.3293 65.2126,12.32 65.2207,12.3149 65.2211,12.3091 65.2026)),((12.3163 65.8182,12.3241 65.8143,12.3425 65.8327,12.3438 65.8351,12.341 65.8366,12.33 65.8372,12.3163 65.8182)),((12.3165 65.1332,12.3347 65.1317,12.3499 65.1282,12.3939 65.11,12.4044 65.1112,12.414 65.1136,12.4373 65.1195,12.4552 65.1256,12.458 65.1269,12.4561 65.1305,12.4505 65.132,12.4209 65.1248,12.3985 65.1316,12.3612 65.1368,12.3428 65.1418,12.3325 65.1413,12.3236 65.1388,12.3165 65.1332)),((12.3179 65.8612,12.3195 65.8587,12.3368 65.8673,12.3392 65.8698,12.3365 65.871,12.3287 65.8679,12.3179 65.8612)),((12.3191 65.2408,12.3264 65.2392,12.3427 65.2439,12.3527 65.2439,12.3635 65.2485,12.3667 65.2502,12.3569 65.2511,12.3413 65.2502,12.3309 65.2472,12.3191 65.2408)),((12.3247 66.0827,12.3257 66.0803,12.3325 66.0816,12.3425 66.0879,12.3428 66.0911,12.3351 66.0892,12.3247 66.0827)),((12.3273 65.1916,12.3431 65.1754,12.3511 65.1773,12.3631 65.1874,12.3642 65.1928,12.3664 65.1958,12.3494 65.2024,12.3411 65.2012,12.3283 65.1959,12.3273 65.1916)),((12.3309 65.8433,12.3376 65.8407,12.3445 65.8431,12.3559 65.8663,12.3558 65.8679,12.3501 65.868,12.3404 65.8615,12.3309 65.8433)),((12.3449 66.1344,12.3465 66.1333,12.3555 66.1351,12.3742 66.141,12.3978 66.1449,12.4004 66.1467,12.4019 66.15,12.3954 66.1588,12.3617 66.1492,12.352 66.1434,12.3449 66.1344)),((12.3801 65.7464,12.3839 65.7453,12.3934 65.751,12.4069 65.7538,12.4159 65.7593,12.4337 65.7653,12.4457 65.7651,12.4514 65.7649,12.4789 65.7804,12.4913 65.807,12.4912 65.8113,12.4843 65.8102,12.4583 65.7978,12.4435 65.7968,12.4067 65.7792,12.408 65.7747,12.4029 65.7718,12.4047 65.7661,12.3805 65.7494,12.3801 65.7464)),((12.3801 65.8985,12.3827 65.8961,12.3932 65.8982,12.3953 65.8972,12.3884 65.8879,12.3907 65.8851,12.3999 65.8846,12.4054 65.8877,12.4365 65.8947,12.4808 65.8994,12.5143 65.9008,12.5248 65.9004,12.5276 65.899,12.5258 65.8965,12.5076 65.8939,12.4984 65.8901,12.4958 65.8839,12.488 65.8864,12.4813 65.8847,12.482 65.8816,12.4718 65.8804,12.4624 65.8762,12.4603 65.8752,12.447 65.8759,12.4369 65.8716,12.4366 65.8681,12.4197 65.8611,12.417 65.8579,12.4255 65.8564,12.4494 65.8618,12.47 65.8583,12.502 65.8755,12.5103 65.8774,12.5195 65.8855,12.5365 65.8924,12.5375 65.8998,12.5567 65.9083,12.5737 65.9137,12.5954 65.9206,12.6042 65.9281,12.6267 65.9342,12.6781 65.9575,12.6974 65.9616,12.7329 65.9736,12.7766 65.9824,12.7805 65.9812,12.7783 65.9796,12.7581 65.9746,12.7571 65.9719,12.7798 65.9785,12.8236 65.9839,12.8304 65.9854,12.8435 65.9882,12.8515 65.9852,12.8773 65.9948,12.9237 66.0068,12.9268 66.009,12.9237 66.0139,12.9309 66.0232,12.9253 66.0258,12.9168 66.026,12.8987 66.0227,12.8944 66.0236,12.9067 66.033,12.9227 66.0414,12.9205 66.044,12.9075 66.0409,12.8836 66.0382,12.877 66.0352,12.873 66.0333,12.8481 66.0287,12.8264 66.0276,12.803 66.0233,12.747 66.0199,12.7174 66.0142,12.6916 66.0019,12.6485 65.9889,12.6182 65.9839,12.6163 65.9856,12.6222 65.9875,12.6355 65.9917,12.6327 65.9929,12.6227 65.9911,12.6194 65.9923,12.6297 65.9962,12.6403 66.0039,12.6629 66.0127,12.6675 66.0181,12.7022 66.0294,12.7022 66.0311,12.663 66.0252,12.638 66.0194,12.633 66.0205,12.6474 66.0258,12.6436 66.0281,12.6273 66.025,12.6148 66.0262,12.6057 66.0253,12.5856 66.0155,12.5412 66.0017,12.4943 65.9814,12.491 65.9768,12.4669 65.9636,12.4548 65.9542,12.4582 65.9501,12.4517 65.9408,12.4618 65.9313,12.4572 65.9276,12.4528 65.9276,12.4322 65.9277,12.4276 65.9251,12.4176 65.9258,12.4059 65.9241,12.4015 65.9182,12.3825 65.9077,12.3837 65.9036,12.3801 65.8985)),((12.3851 66.0039,12.4039 65.9997,12.4091 66.0007,12.4224 66.0099,12.4237 66.0137,12.4206 66.0158,12.4102 66.0133,12.4063 66.0077,12.3933 66.0075,12.3854 66.0058,12.3851 66.0039)),((12.3886 65.8431,12.394 65.8325,12.3919 65.8252,12.4034 65.8193,12.4168 65.8195,12.4249 65.8219,12.4422 65.8321,12.4474 65.8332,12.4525 65.8303,12.4597 65.8294,12.4803 65.8356,12.5063 65.8496,12.5086 65.8523,12.504 65.8553,12.5072 65.8599,12.4997 65.8631,12.4718 65.8552,12.4692 65.849,12.463 65.849,12.4597 65.853,12.4577 65.8526,12.4408 65.8494,12.4335 65.8438,12.4092 65.8354,12.4049 65.8418,12.4146 65.8541,12.4072 65.857,12.4003 65.8573,12.3923 65.8519,12.3886 65.8431)),((12.3983 66.0173,12.4063 66.016,12.4212 66.0226,12.42 66.0255,12.41 66.0248,12.3983 66.0173)),((12.4169 66.4163,12.4184 66.4155,12.4519 66.4198,12.4544 66.4221,12.4522 66.4233,12.4232 66.4207,12.4169 66.4163)),((12.4723 66.1401,12.4751 66.1389,12.488 66.1409,12.4889 66.1387,12.4839 66.1342,12.4886 66.1324,12.5061 66.1456,12.5079 66.1481,12.505 66.1497,12.4723 66.1401)),((12.4954 66.3745,12.4985 66.3726,12.5039 66.3735,12.5139 66.3801,12.5158 66.3824,12.5097 66.3833,12.4954 66.3745)),((12.5129 66.0461,12.5152 66.0373,12.5199 66.0345,12.5533 66.0377,12.5712 66.0456,12.5824 66.0475,12.5856 66.0507,12.5779 66.0557,12.5725 66.0565,12.5467 66.0511,12.5292 66.0509,12.5129 66.0461)),((12.5187 66.3335,12.5432 66.3439,12.5582 66.3481,12.5781 66.3598,12.5937 66.3627,12.6015 66.3676,12.6023 66.3713,12.597 66.3745,12.5828 66.3724,12.5759 66.3666,12.5696 66.3653,12.5641 66.3575,12.5523 66.3512,12.539 66.3485,12.5227 66.3418,12.5187 66.3335)),((12.5193 66.374,12.524 66.3722,12.5417 66.3799,12.568 66.386,12.5692 66.3886,12.5648 66.3911,12.5552 66.3919,12.5451 66.3898,12.5399 66.3913,12.5307 66.387,12.5285 66.3811,12.5193 66.374)),((12.52 65.7904,12.5264 65.7869,12.535 65.7879,12.5537 65.8022,12.562 65.7978,12.5774 65.8171,12.5756 65.8184,12.5743 65.8192,12.5665 65.8164,12.5652 65.8182,12.5764 65.8296,12.5807 65.8428,12.5761 65.846,12.5404 65.832,12.5335 65.8269,12.528 65.8152,12.5346 65.8115,12.5279 65.8071,12.52 65.7904)),((12.5211 66.364,12.5215 66.3617,12.5265 66.362,12.543 66.3723,12.5451 66.3743,12.5421 66.376,12.5211 66.364)),((12.542 66.3227,12.5468 66.3224,12.5724 66.3303,12.5904 66.3396,12.6045 66.3433,12.6205 66.3536,12.6164 66.3549,12.6011 66.3488,12.5842 66.3449,12.5834 66.347,12.6136 66.3577,12.6106 66.3594,12.5912 66.356,12.5516 66.3403,12.5562 66.3387,12.5821 66.3446,12.551 66.3291,12.542 66.3227)),((12.5505 66.3696,12.5512 66.368,12.5574 66.3682,12.5693 66.3715,12.5739 66.3774,12.575 66.3802,12.5694 66.3812,12.5505 66.3696)),((12.5605 67.6579,12.5622 67.6489,12.5666 67.6465,12.5674 67.6403,12.573 67.6344,12.5952 67.6337,12.5966 67.6347,12.5885 67.6393,12.6006 67.6438,12.5935 67.6505,12.5997 67.6585,12.6077 67.6607,12.621 67.6642,12.6288 67.6631,12.6445 67.6548,12.6491 67.6553,12.6437 67.6652,12.6487 67.6692,12.6692 67.6695,12.6856 67.6583,12.6863 67.6451,12.6918 67.6422,12.6994 67.6459,12.7047 67.6576,12.6982 67.663,12.6988 67.6672,12.7154 67.6596,12.7233 67.6596,12.7314 67.662,12.7153 67.6684,12.7166 67.6726,12.7112 67.6753,12.6993 67.676,12.7042 67.6802,12.7015 67.6824,12.71 67.6866,12.7121 67.6918,12.7206 67.6974,12.6891 67.6999,12.6399 67.6869,12.6268 67.6792,12.6163 67.6767,12.6103 67.6694,12.5967 67.6641,12.583 67.6649,12.5605 67.6579)),((12.5967 65.855,12.6064 65.8563,12.626 65.8694,12.618 65.8722,12.6213 65.8742,12.6257 65.88,12.6272 65.8834,12.625 65.8846,12.6209 65.8837,12.6155 65.8722,12.6123 65.8655,12.5967 65.855)),((12.5971 66.5791,12.6038 66.5742,12.6205 66.5729,12.6141 66.5702,12.6036 66.5702,12.6007 66.5661,12.6008 66.5573,12.6088 66.5548,12.611 66.5522,12.6184 66.5541,12.6277 66.5512,12.6351 66.5531,12.6389 66.5607,12.6436 66.5619,12.6509 66.5612,12.6555 66.5641,12.6533 66.5667,12.6626 66.5731,12.6696 66.578,12.6686 66.5818,12.6632 66.5852,12.6765 66.5967,12.6554 66.6081,12.6441 66.6106,12.6243 66.6077,12.6197 66.6034,12.6114 66.6008,12.6158 66.5944,12.6116 66.5918,12.606 66.5914,12.5971 66.5791)),((12.6078 66.3025,12.6117 66.3014,12.6215 66.3027,12.6297 66.3125,12.6298 66.3151,12.6221 66.3141,12.6078 66.3025)),((12.6191 66.3697,12.6198 66.3665,12.6292 66.3618,12.636 66.365,12.6386 66.37,12.6401 66.3747,12.6365 66.378,12.6316 66.3772,12.6191 66.3697)),((12.6765 66.1779,12.6804 66.174,12.6904 66.176,12.6927 66.1746,12.6888 66.1657,12.6971 66.1607,12.6926 66.1507,12.6859 66.1475,12.6971 66.1447,12.7197 66.1444,12.7342 66.1481,12.7439 66.1453,12.7573 66.1445,12.775 66.1459,12.7981 66.1525,12.797 66.1538,12.8036 66.1561,12.8016 66.1582,12.8065 66.1632,12.8038 66.1655,12.7875 66.165,12.7821 66.1628,12.7661 66.1712,12.7537 66.1737,12.7399 66.1725,12.7321 66.1748,12.7283 66.1626,12.7274 66.1595,12.7224 66.1589,12.7242 66.1745,12.7279 66.1782,12.7481 66.1805,12.7535 66.1843,12.7477 66.1874,12.7391 66.1873,12.7271 66.1844,12.7004 66.1896,12.6886 66.1891,12.6792 66.1855,12.6765 66.1779)),((12.6982 66.2494,12.721 66.2483,12.7301 66.2457,12.752 66.2469,12.7529 66.2418,12.7438 66.2329,12.7434 66.2283,12.7557 66.2274,12.7605 66.2241,12.7697 66.2226,12.7751 66.2192,12.7751 66.2162,12.7817 66.2155,12.7921 66.2166,12.7995 66.221,12.8101 66.2219,12.8153 66.2246,12.8217 66.2215,12.8091 66.2115,12.8211 66.2167,12.852 66.2304,12.8605 66.2379,12.8758 66.2456,12.8851 66.248,12.8874 66.2699,12.8915 66.2785,12.89 66.2851,12.8801 66.287,12.8714 66.2959,12.8308 66.2954,12.8265 66.2974,12.8273 66.3042,12.8223 66.3039,12.8186 66.2958,12.8138 66.2948,12.8094 66.2973,12.8095 66.3042,12.7998 66.3011,12.7893 66.3015,12.7881 66.2987,12.7934 66.297,12.7887 66.2929,12.7595 66.2841,12.723 66.2691,12.7223 66.2675,12.7194 66.261,12.6982 66.2494)),((12.7034 66.2336,12.7261 66.2343,12.7282 66.2361,12.7305 66.239,12.705 66.2369,12.7034 66.2336)),((12.7203 66.6106,12.7256 66.6091,12.7346 66.6113,12.7427 66.6113,12.7437 66.6146,12.7366 66.6193,12.7243 66.6194,12.7203 66.6106)),((12.7382 67.7492,12.754 67.7423,12.7603 67.7431,12.7683 67.7503,12.7617 67.7543,12.7642 67.757,12.7652 67.7605,12.7596 67.7634,12.7431 67.755,12.7382 67.7492)),((12.791 66.5436,12.7995 66.54,12.792 66.5353,12.8087 66.5285,12.8062 66.5175,12.8279 66.5254,12.8476 66.5254,12.877 66.5419,12.8793 66.5448,12.8764 66.5464,12.8583 66.5467,12.8431 66.5499,12.8348 66.5473,12.8013 66.5498,12.7913 66.5457,12.791 66.5436)),((12.7942 67.8432,12.7979 67.8405,12.8138 67.8391,12.8131 67.8363,12.8005 67.8341,12.8008 67.8321,12.8057 67.8307,12.8538 67.8327,12.8717 67.8368,12.8736 67.8424,12.8833 67.8456,12.8862 67.8504,12.9044 67.8582,12.9068 67.8611,12.8972 67.8649,12.8994 67.8685,12.9054 67.8681,12.9158 67.8674,12.9251 67.87,12.9267 67.875,12.9408 67.8795,12.9528 67.8772,12.9614 67.8814,12.976 67.8802,12.9875 67.8867,12.9977 67.8886,13.0141 67.8875,13.0283 67.8888,13.0327 67.896,13.0267 67.9015,13.0273 67.9045,13.0325 67.9053,13.0469 67.9031,13.0554 67.9064,13.0497 67.9097,13.052 67.9131,13.0633 67.914,13.064 67.9152,13.0607 67.9173,13.0414 67.9208,13.0444 67.924,13.0691 67.9214,13.0701 67.9213,13.0734 67.9222,13.0728 67.928,13.0778 67.9308,13.0886 67.93,13.0918 67.9341,13.0886 67.9374,13.0835 67.9378,13.0768 67.9347,13.0711 67.9366,13.0715 67.9401,13.0929 67.9435,13.0952 67.9466,13.0878 67.9482,13.0699 67.9454,13.0571 67.9451,13.0384 67.9502,13.0183 67.9527,12.9948 67.953,12.9836 67.9472,12.9739 67.9469,12.9745 67.95,12.9938 67.9613,12.9819 67.9675,12.9821 67.97,12.9821 67.9714,12.9875 67.9718,13.0199 67.9621,13.0239 67.9658,13.0175 67.9707,13.0173 67.9758,13.008 67.9831,12.998 67.9865,13.0052 67.9929,13.0106 67.9946,13.018 67.9918,13.0372 67.9781,13.037 67.9654,13.0548 67.9581,13.0622 67.9565,13.0759 67.9561,13.0842 67.9584,13.09 67.9713,13.0935 67.9727,13.0947 67.9731,13.105 67.9617,13.1275 67.9503,13.1316 67.9508,13.1386 67.9607,13.1458 67.9641,13.1578 67.965,13.1825 67.9798,13.1675 67.9864,13.1635 67.9931,13.1646 68.0008,13.1784 68.0078,13.1729 68.0167,13.1807 68.0262,13.1665 68.0381,13.1683 68.0458,13.1615 68.0487,13.1539 68.0491,13.105 68.0288,13.0854 68.0239,13.0832 68.0291,13.0673 68.0317,13.0527 68.0371,13.0537 68.0406,13.082 68.0364,13.0941 68.0371,13.098 68.0397,13.091 68.043,13.1015 68.0489,13.1119 68.0449,13.1195 68.0458,13.1228 68.0513,13.1675 68.0642,13.1702 68.0681,13.1642 68.0722,13.1447 68.0699,13.1352 68.0615,13.1265 68.0617,13.1411 68.0787,13.1562 68.0812,13.1642 68.0872,13.1842 68.0911,13.1911 68.0954,13.1926 68.1038,13.171 68.1067,13.15 68.1018,13.149 68.1016,13.1417 68.1028,13.1438 68.1126,13.1365 68.1168,13.1235 68.1181,13.1035 68.1142,13.0836 68.1172,13.0748 68.116,13.0696 68.1109,13.0744 68.1051,13.0886 68.0965,13.0873 68.0906,13.0932 68.0854,13.0794 68.0768,13.061 68.0794,13.0528 68.0784,13.0452 68.0759,13.0412 68.0706,13.0319 68.0661,13.0192 68.0626,13.0176 68.0551,13.0171 68.0528,12.9967 68.0456,12.9957 68.0347,12.9897 68.0313,12.9806 68.031,12.9647 68.0349,12.9616 68.0306,12.9658 68.0251,12.9637 68.0168,12.9565 68.012,12.9546 67.9902,12.9578 67.9855,12.9541 67.9839,12.9432 67.9835,12.9206 67.9875,12.8984 67.9728,12.9011 67.9688,12.9067 67.9605,12.9015 67.9567,12.9029 67.949,12.8957 67.9458,12.8825 67.9434,12.8777 67.9403,12.8915 67.9337,12.8886 67.9248,12.8731 67.9206,12.8677 67.9145,12.8543 67.9128,12.8494 67.9083,12.8439 67.9068,12.8426 67.9028,12.8537 67.8998,12.854 67.8975,12.8436 67.8946,12.8458 67.8822,12.8524 67.8724,12.8435 67.8638,12.8284 67.8624,12.8275 67.8601,12.8326 67.8569,12.8302 67.8567,12.8376 67.8537,12.8257 67.8528,12.8114 67.8475,12.7969 67.8457,12.7942 67.8432)),((12.7988 66.5559,12.8038 66.5537,12.8325 66.5532,12.8344 66.557,12.831 66.5598,12.8218 66.5608,12.7988 66.5559)),((12.8029 66.3929,12.8049 66.3907,12.8166 66.3889,12.822 66.3827,12.8341 66.3798,12.8357 66.3757,12.8419 66.3745,12.8578 66.3795,12.882 66.3824,12.8828 66.3877,12.8771 66.3934,12.8622 66.3975,12.8437 66.3948,12.828 66.3993,12.8029 66.3929)),((12.8253 66.4308,12.8376 66.4288,12.8347 66.4201,12.8412 66.4154,12.8496 66.4118,12.8693 66.4072,12.8882 66.3946,12.8947 66.3971,12.8956 66.402,12.8788 66.4125,12.8795 66.416,12.8812 66.4237,12.8783 66.4268,12.894 66.4382,12.89 66.4467,12.8955 66.4519,12.8976 66.4553,12.8916 66.4586,12.88 66.4602,12.8428 66.4507,12.8315 66.4469,12.8281 66.4426,12.83 66.4362,12.8253 66.4308)),((12.8311 66.9618,12.8318 66.9586,12.843 66.9572,12.8551 66.9637,12.855 66.9667,12.8356 66.9637,12.8311 66.9618)),((12.8447 66.566,12.8503 66.5638,12.8455 66.5598,12.8537 66.5566,12.8529 66.5542,12.858 66.5532,12.8662 66.5574,12.8683 66.5607,12.8601 66.5653,12.8594 66.5715,12.8454 66.5686,12.8447 66.566)),((12.8527 66.1705,12.8534 66.1674,12.8587 66.1654,12.8804 66.164,12.9038 66.1699,12.9292 66.17,12.9307 66.17,12.9659 66.1835,12.9682 66.1968,12.9695 66.2022,12.9578 66.2161,12.9345 66.2114,12.9125 66.2104,12.8994 66.2031,12.8832 66.2005,12.8773 66.1966,12.8722 66.185,12.8645 66.1826,12.8625 66.1763,12.8527 66.1705)),((12.8604 66.3644,12.8796 66.3637,12.8931 66.3588,12.9003 66.3595,12.9019 66.3614,12.8858 66.3699,12.8756 66.3739,12.8683 66.372,12.8604 66.3644)),((12.8728 66.487,12.8956 66.485,12.9047 66.4897,12.9066 66.4924,12.8991 66.4965,12.891 66.4967,12.8728 66.487)),((12.8864 66.5896,12.8904 66.5839,12.9069 66.5805,12.9137 66.5765,12.9298 66.5856,12.933 66.5937,12.9356 66.5959,12.9329 66.5969,12.922 66.5965,12.9159 66.6017,12.9062 66.6027,12.8864 66.5896)),((12.8982 66.4072,12.922 66.3965,12.9376 66.3993,12.9431 66.4084,12.9442 66.4104,12.9514 66.4376,12.9663 66.4571,12.9633 66.4631,12.956 66.4624,12.9423 66.4576,12.9345 66.4643,12.9182 66.4587,12.921 66.4544,12.9345 66.4495,12.9377 66.446,12.9133 66.4318,12.9085 66.4308,12.9017 66.4317,12.8993 66.4276,12.9019 66.4123,12.8982 66.4072)),((12.9089 66.6748,12.9251 66.6721,12.9362 66.6721,12.9412 66.6742,12.9414 66.6765,12.9229 66.6775,12.9089 66.6748)),((12.9183 66.4788,12.9229 66.4775,12.9334 66.4788,12.9617 66.4891,12.9636 66.4916,12.9593 66.4938,12.9416 66.4916,12.9279 66.4926,12.9183 66.4788)),((12.9208 66.2332,12.9335 66.23,12.9694 66.2304,13.0042 66.2352,13.0312 66.241,13.0802 66.2566,13.1012 66.2616,13.1257 66.2707,13.1335 66.2714,13.1354 66.2739,13.1603 66.2791,13.1837 66.284,13.1861 66.2853,13.1773 66.2873,13.1538 66.2856,13.1346 66.2895,13.108 66.2914,13.0725 66.2898,13.0321 66.2815,13.0086 66.2798,12.9978 66.2766,12.9848 66.276,12.9654 66.2584,12.9386 66.2433,12.9208 66.2332)),((12.9282 66.6834,12.9303 66.6823,12.9429 66.6829,12.9507 66.6794,12.968 66.6844,12.968 66.6902,12.9663 66.6945,12.9529 66.6946,12.9295 66.686,12.9282 66.6834)),((12.9672 66.6571,12.9694 66.6531,12.9857 66.6488,12.9998 66.6483,13.0258 66.6533,13.0273 66.6569,13.0226 66.6598,12.9994 66.6612,12.9826 66.6594,12.9747 66.6601,12.9672 66.6571)),((12.9773 66.6684,12.9782 66.6661,13.0049 66.6664,13.0117 66.6712,13.0177 66.6723,13.0166 66.6752,13.0113 66.6781,13.0115 66.6807,13.0065 66.6815,13.0006 66.6802,12.9863 66.6722,12.9773 66.6684)),((12.9836 66.6158,12.995 66.6119,12.9954 66.608,13.0334 66.609,13.0377 66.6127,13.0375 66.6252,13.0442 66.6362,13.0481 66.6388,13.0543 66.6431,13.0563 66.6455,13.05 66.6465,13.0331 66.6422,13.0264 66.649,12.9935 66.6421,12.9938 66.6384,13.004 66.6363,13.0082 66.6331,12.9937 66.6255,12.9981 66.6232,12.9869 66.6206,12.9836 66.6158)),((12.9893 66.391,12.9977 66.3857,13.0117 66.3838,13.0362 66.3861,13.0531 66.3896,13.1055 66.4005,13.1114 66.4078,13.1105 66.4145,13.1031 66.4232,13.0892 66.4307,13.0746 66.4356,13.0607 66.4373,13.051 66.4369,13.0406 66.4339,13.0134 66.4119,12.993 66.3993,12.9893 66.391)),((12.9956 66.5692,12.9971 66.5595,13.0018 66.558,13.0143 66.5601,13.0281 66.5603,13.0368 66.5634,13.0435 66.5684,13.0555 66.5703,13.0578 66.5749,13.0527 66.5789,13.0429 66.5818,13.0448 66.5902,13.0344 66.5931,13.0275 66.5885,13.0246 66.5811,12.9992 66.5733,12.9956 66.5692)),((13.0305 66.6784,13.0332 66.673,13.0419 66.6717,13.0569 66.6735,13.0587 66.6718,13.0405 66.6679,13.0396 66.6657,13.043 66.6643,13.0682 66.6654,13.0753 66.6624,13.0826 66.6631,13.0883 66.6722,13.0837 66.6796,13.0856 66.6836,13.0932 66.6866,13.0797 66.6897,13.0823 66.7023,13.0852 66.7053,13.0802 66.7061,13.0695 66.7006,13.0657 66.6895,13.0615 66.6884,13.0575 66.6911,13.0587 66.6986,13.056 66.6993,13.0484 66.698,13.036 66.688,13.0305 66.6784)),((13.0883 66.6218,13.0962 66.5971,13.1029 66.5917,13.1006 66.5844,13.1073 66.5834,13.1243 66.6085,13.119 66.6131,13.1237 66.6205,13.1158 66.6258,13.1206 66.6314,13.1225 66.6338,13.1137 66.6356,13.1082 66.6332,13.1027 66.6266,13.0917 66.625,13.0883 66.6218)),((13.0929 66.7557,13.0993 66.7556,13.1173 66.7634,13.117 66.7657,13.1036 66.7642,13.0929 66.7557)),((13.1335 66.7489,13.1368 66.7452,13.156 66.7498,13.1583 66.7514,13.1543 66.7541,13.1425 66.7543,13.1335 66.7489)),((13.1743 68.0492,13.1842 68.0312,13.184 68.0241,13.199 68.0115,13.2121 68.0113,13.2256 68.0234,13.2226 68.0307,13.2355 68.0476,13.2327 68.0664,13.2355 68.0672,13.2422 68.066,13.2517 68.0561,13.2517 68.0506,13.2518 68.0106,13.2638 68.0053,13.3161 68.0193,13.3176 68.0231,13.3266 68.0268,13.3303 68.0328,13.3346 68.0345,13.3501 68.0344,13.3536 68.0364,13.3435 68.04,13.3447 68.0491,13.3495 68.0496,13.356 68.0412,13.3638 68.0383,13.369 68.0364,13.3806 68.0366,13.393 68.0396,13.3931 68.044,13.3995 68.048,13.4029 68.0611,13.3944 68.0683,13.3968 68.0717,13.4105 68.0745,13.4088 68.0816,13.4175 68.0862,13.4259 68.0975,13.4168 68.1049,13.4252 68.1162,13.4266 68.1251,13.4311 68.1292,13.4423 68.1322,13.4447 68.1385,13.4504 68.1423,13.457 68.1466,13.4569 68.1501,13.453 68.1549,13.4324 68.16,13.4257 68.1643,13.4076 68.1661,13.3957 68.1726,13.3868 68.1746,13.3384 68.1761,13.3249 68.1804,13.3177 68.1797,13.3128 68.1612,13.3052 68.1525,13.3037 68.1455,13.2879 68.1402,13.2956 68.1351,13.303 68.1335,13.3335 68.1273,13.3374 68.1252,13.3379 68.1148,13.3315 68.1047,13.3394 68.0867,13.3374 68.0824,13.3292 68.0829,13.2952 68.0905,13.3086 68.0956,13.3238 68.1085,13.3024 68.12,13.2966 68.1203,13.2839 68.1136,13.2752 68.114,13.2662 68.1145,13.23 68.1122,13.2279 68.1098,13.2351 68.1058,13.2317 68.1021,13.2223 68.1009,13.2205 68.0902,13.2313 68.085,13.2285 68.0827,13.2187 68.0854,13.2065 68.085,13.1975 68.0828,13.1982 68.0752,13.1758 68.0529,13.1743 68.0492)),((13.1876 66.8067,13.202 66.8014,13.2103 66.8012,13.2297 66.807,13.2258 66.8155,13.1951 66.8132,13.1876 66.8067)),((13.2158 67.9947,13.2214 67.9945,13.2306 67.9992,13.2333 68.0061,13.2349 68.0126,13.2312 68.0157,13.2242 68.0148,13.2158 67.9947)),((13.2391 66.8521,13.2439 66.8519,13.2527 66.8596,13.2548 66.8632,13.2505 66.8653,13.243 66.8602,13.2391 66.8521)),((13.2395 66.7546,13.2405 66.7519,13.2454 66.7515,13.2555 66.7556,13.285 66.7518,13.3118 66.755,13.3214 66.7539,13.3443 66.7512,13.3613 66.754,13.3815 66.7518,13.3964 66.7554,13.4387 66.7611,13.4583 66.7664,13.4771 66.777,13.4735 66.7819,13.4677 66.7834,13.4183 66.7826,13.3892 66.7836,13.3782 66.7848,13.3734 66.7899,13.3613 66.7913,13.3516 66.7932,13.3443 66.7923,13.3384 66.7818,13.2513 66.7618,13.2395 66.7546)),((13.3336 66.8247,13.3403 66.8212,13.3383 66.8157,13.3475 66.8147,13.3493 66.8145,13.3777 66.8153,13.3856 66.8176,13.39 66.8213,13.4073 66.8207,13.4185 66.8251,13.4347 66.8226,13.4708 66.8293,13.4901 66.8279,13.5501 66.8334,13.5734 66.8417,13.5758 66.8432,13.569 66.8456,13.5019 66.854,13.4299 66.8505,13.4024 66.8472,13.3862 66.8421,13.3665 66.8414,13.3468 66.8347,13.3466 66.8306,13.3423 66.828,13.3345 66.8271,13.3336 66.8247)),((13.3849 66.9083,13.3915 66.9048,13.4016 66.9093,13.4101 66.9071,13.4154 66.9085,13.4158 66.9152,13.4184 66.9177,13.4137 66.9193,13.3981 66.9184,13.3849 66.9083)),((13.4013 66.7964,13.4029 66.7923,13.4329 66.7871,13.4409 66.7878,13.4492 66.792,13.4631 66.7894,13.4671 66.7912,13.4683 66.7943,13.4651 66.7964,13.4436 66.7991,13.4338 66.8017,13.4183 66.801,13.4013 66.7964)),((13.404 66.9307,13.4113 66.9284,13.4208 66.9282,13.4397 66.9388,13.443 66.9411,13.4373 66.9421,13.4142 66.9378,13.4042 66.9333,13.404 66.9307)),((13.4074 66.8773,13.4123 66.8767,13.4265 66.8794,13.432 66.8758,13.4577 66.8747,13.4779 66.8819,13.4797 66.8848,13.4749 66.8866,13.4468 66.8863,13.4314 66.8882,13.4083 66.8795,13.4074 66.8773)),((13.4253 66.9241,13.4332 66.919,13.4298 66.9124,13.4342 66.9117,13.4693 66.9216,13.4706 66.9242,13.4531 66.9347,13.4378 66.9332,13.4253 66.9241)),((13.4518 68.0916,13.4772 68.0807,13.4784 68.0798,13.4843 68.0751,13.4879 68.0661,13.4952 68.0619,13.5332 68.0704,13.5369 68.075,13.5557 68.0791,13.5623 68.0843,13.5577 68.0866,13.5334 68.0839,13.53 68.0846,13.5348 68.0881,13.5467 68.0908,13.568 68.0901,13.5813 68.0862,13.587 68.0872,13.5798 68.0915,13.5812 68.0943,13.5772 68.0966,13.5837 68.1005,13.5805 68.1054,13.5845 68.1125,13.574 68.1129,13.5638 68.1132,13.5676 68.1146,13.568 68.1197,13.5755 68.1243,13.5701 68.127,13.5607 68.1258,13.5531 68.1277,13.5546 68.1303,13.5495 68.1337,13.5589 68.1381,13.5735 68.1357,13.5817 68.1368,13.5951 68.1422,13.6124 68.1422,13.6339 68.1473,13.616 68.1394,13.6187 68.1372,13.6289 68.138,13.6376 68.1364,13.6336 68.1276,13.6487 68.1209,13.6276 68.1146,13.6301 68.1099,13.6292 68.1086,13.6238 68.1006,13.627 68.1003,13.641 68.1057,13.655 68.1032,13.6398 68.0929,13.6418 68.0909,13.6619 68.095,13.6756 68.093,13.6829 68.0934,13.6981 68.0972,13.7015 68.0852,13.708 68.0844,13.7185 68.0893,13.7256 68.0899,13.7367 68.0884,13.7451 68.0907,13.7321 68.0972,13.7345 68.1038,13.7452 68.108,13.7379 68.1109,13.7326 68.1166,13.7251 68.1173,13.7198 68.1178,13.7195 68.1233,13.7242 68.127,13.735 68.128,13.7414 68.1307,13.7422 68.1427,13.747 68.1465,13.7483 68.1541,13.7537 68.1563,13.7582 68.151,13.7675 68.1494,13.7655 68.1403,13.7729 68.1372,13.7732 68.1299,13.7792 68.1209,13.7865 68.1211,13.7934 68.124,13.8452 68.1261,13.8516 68.1289,13.8684 68.1319,13.8646 68.1351,13.8638 68.1358,13.862 68.1438,13.8576 68.1454,13.8444 68.1461,13.8431 68.1509,13.849 68.1533,13.8469 68.1589,13.8681 68.1536,13.8698 68.1555,13.865 68.1617,13.8566 68.1627,13.8311 68.1613,13.8045 68.1627,13.7938 68.1649,13.8092 68.1715,13.8436 68.174,13.8527 68.1777,13.8577 68.1872,13.8713 68.1923,13.8543 68.1947,13.8299 68.1982,13.8344 68.2009,13.8559 68.2,13.8788 68.2017,13.8841 68.2105,13.8895 68.2094,13.8932 68.2063,13.8871 68.1899,13.8942 68.1843,13.927 68.1892,13.9376 68.1955,13.9508 68.2001,13.9615 68.1998,13.9563 68.1937,13.96 68.1939,13.9782 68.2032,13.9869 68.2045,13.9947 68.2012,14.0025 68.198,14.0141 68.1967,14.0188 68.1907,14.0255 68.1895,14.0266 68.1997,14.0312 68.2006,14.0382 68.197,14.0404 68.1976,14.0436 68.204,14.0565 68.2077,14.0653 68.2206,14.0829 68.2268,14.0834 68.2353,14.0889 68.2354,14.0993 68.2292,14.0996 68.2219,14.1053 68.2182,14.1174 68.2239,14.1206 68.2271,14.1156 68.2322,14.1222 68.2362,14.1237 68.2413,14.1249 68.2455,14.1582 68.2597,14.166 68.267,14.1389 68.2813,14.1432 68.285,14.1528 68.2843,14.1612 68.2799,14.1592 68.2754,14.173 68.2685,14.1985 68.2617,14.2184 68.2634,14.2423 68.2695,14.2556 68.277,14.2677 68.2882,14.2799 68.2856,14.2862 68.2887,14.2821 68.2915,14.2733 68.2899,14.2729 68.2909,14.2673 68.3046,14.2462 68.3162,14.2321 68.3273,14.1999 68.33,14.183 68.3354,14.1668 68.3454,14.1499 68.3506,14.135 68.3519,14.1269 68.3469,14.1183 68.3481,14.1056 68.3472,14.0877 68.3481,14.0818 68.3455,14.0776 68.3368,14.091 68.3323,14.0991 68.3295,14.0886 68.3292,14.0761 68.3261,14.0596 68.3301,14.0546 68.3284,14.0582 68.3173,14.0681 68.3125,14.0687 68.3075,14.089 68.3048,14.1006 68.3073,14.1272 68.3095,14.1404 68.3125,14.1485 68.3125,14.138 68.2972,14.1422 68.2944,14.128 68.2856,14.1206 68.2854,14.0909 68.2915,14.0804 68.2915,14.0559 68.2838,14.0434 68.2838,14.0372 68.2821,14.0349 68.2783,14.0458 68.2724,14.0417 68.2701,14.03 68.2714,14.021 68.2704,14.0181 68.2684,14.0326 68.2646,14.0277 68.2627,14.0194 68.2632,13.9895 68.2764,13.9942 68.2806,14.0254 68.282,14.0073 68.3018,14.0162 68.3096,14.0169 68.3143,14.0149 68.3165,14.0062 68.326,13.9927 68.3354,13.9911 68.3462,13.9772 68.3514,13.9401 68.3521,13.9257 68.349,13.91 68.3491,13.9083 68.3472,13.9194 68.3392,13.9152 68.3339,13.9072 68.3321,13.8863 68.3345,13.88 68.333,13.8681 68.3218,13.8581 68.3187,13.863 68.3155,13.8411 68.3101,13.838 68.3094,13.8285 68.3114,13.8244 68.3105,13.833 68.3045,13.838 68.2948,13.8231 68.2931,13.8182 68.2977,13.8044 68.2898,13.7921 68.291,13.7866 68.2956,13.7756 68.2966,13.7597 68.3006,13.7444 68.2936,13.7382 68.2935,13.7346 68.2914,13.7412 68.2874,13.7286 68.2814,13.724 68.2819,13.7171 68.2884,13.7207 68.2935,13.7147 68.3024,13.6943 68.3109,13.6879 68.3136,13.6646 68.3156,13.5982 68.2943,13.5687 68.2917,13.5648 68.2874,13.5827 68.2784,13.583 68.2761,13.5779 68.2733,13.5524 68.2715,13.5353 68.2675,13.5066 68.2507,13.5363 68.2512,13.5651 68.2491,13.5802 68.2515,13.5821 68.2518,13.5925 68.2506,13.641 68.2571,13.6441 68.2554,13.6125 68.2505,13.6114 68.2486,13.6438 68.2436,13.6537 68.2453,13.6588 68.2435,13.6467 68.2394,13.5815 68.2375,13.5668 68.2355,13.5264 68.2276,13.5097 68.2195,13.5052 68.2184,13.4796 68.2125,13.4781 68.2085,13.4835 68.2058,13.4941 68.2041,13.5231 68.2048,13.5322 68.2022,13.5351 68.1996,13.5314 68.1948,13.5183 68.1902,13.4924 68.1915,13.4631 68.1855,13.4625 68.1839,13.4889 68.183,13.5084 68.1792,13.5447 68.1785,13.5465 68.1772,13.5413 68.1746,13.5284 68.1743,13.5183 68.1763,13.5082 68.1749,13.4959 68.1732,13.4884 68.1627,13.4767 68.1593,13.4813 68.154,13.493 68.1541,13.5166 68.1573,13.5359 68.1664,13.5748 68.1778,13.5751 68.1817,13.5921 68.1843,13.6023 68.1913,13.6099 68.191,13.606 68.182,13.6227 68.1758,13.6165 68.1743,13.5937 68.177,13.585 68.1748,13.5768 68.1728,13.5704 68.1685,13.5574 68.1685,13.5515 68.1631,13.5361 68.1581,13.5306 68.1532,13.5408 68.1524,13.5421 68.1508,13.5129 68.1462,13.4984 68.1422,13.4857 68.1353,13.4732 68.1138,13.4518 68.0916)),((13.5626 66.8847,13.5766 66.8675,13.5844 66.8689,13.5965 66.8772,13.6165 66.8786,13.6331 66.8876,13.6361 66.8906,13.6295 66.8943,13.6155 66.8956,13.6047 66.8992,13.5923 66.8978,13.5707 66.8912,13.5626 66.8847)),((13.5725 66.8347,13.5816 66.8325,13.5997 66.831,13.6162 66.8354,13.6156 66.837,13.5871 66.8381,13.5785 66.8376,13.5725 66.8347)),((13.5975 67.0407,13.6038 67.0399,13.615 67.0431,13.6222 67.0491,13.6246 67.052,13.6217 67.0534,13.6158 67.0519,13.5975 67.0407)),((13.6104 66.8542,13.6149 66.842,13.6281 66.8398,13.6495 66.8389,13.6632 66.8416,13.6731 66.8463,13.68 66.8547,13.6755 66.8637,13.6819 66.8671,13.6846 66.8693,13.6782 66.8722,13.662 66.8731,13.6504 66.8697,13.6384 66.8688,13.6236 66.8628,13.6104 66.8542)),((13.7484 67.0548,13.7489 67.0518,13.7524 67.0504,13.775 67.0563,13.8118 67.0576,13.833 67.0617,13.8516 67.0652,13.8647 67.0663,13.8717 67.0716,13.8729 67.0749,13.8303 67.091,13.8089 67.0912,13.7722 67.0864,13.7609 67.0832,13.7556 67.0769,13.7569 67.07,13.764 67.0654,13.7484 67.0548)),((13.7563 67.1596,13.763 67.1574,13.7729 67.1612,13.7757 67.1599,13.7747 67.1564,13.7812 67.1533,13.7869 67.1539,13.8081 67.1638,13.7974 67.1672,13.7854 67.1658,13.7724 67.1674,13.7668 67.1664,13.7563 67.1596)),((13.7852 68.3297,13.7868 68.3272,13.8123 68.3306,13.815 68.3317,13.812 68.3329,13.802 68.3328,13.7941 68.3357,13.7852 68.3297)),((13.8357 67.1132,13.8385 67.1104,13.8631 67.1096,13.8779 67.1047,13.9064 67.1046,13.9168 67.1068,13.9203 67.1102,13.9224 67.1143,13.9088 67.1142,13.8683 67.1293,13.8568 67.1301,13.8482 67.1259,13.8357 67.1132)),((13.8554 67.4034,13.8557 67.3995,13.8616 67.3982,13.8723 67.4016,13.8932 67.4101,13.9051 67.4183,13.9077 67.421,13.9039 67.4231,13.8924 67.4202,13.8752 67.4133,13.8707 67.4075,13.8554 67.4034)),((13.8632 67.3888,13.8738 67.3862,13.8833 67.3865,13.8977 67.3963,13.9175 67.4026,13.9232 67.4082,13.9178 67.41,13.9054 67.4077,13.8782 67.3987,13.8744 67.3959,13.8632 67.3888)),((13.8636 68.3384,13.8698 68.3369,13.9008 68.3406,13.8904 68.3481,13.8854 68.3432,13.8709 68.342,13.8636 68.3384)),((13.9155 67.2618,13.9294 67.2595,13.9404 67.262,13.9424 67.2582,13.9533 67.2595,13.9628 67.2627,13.9666 67.2639,13.9805 67.2699,14.0223 67.2812,14.0248 67.2841,14.0185 67.2867,13.974 67.291,13.9479 67.2825,13.9224 67.2737,13.936 67.2724,13.931 67.2698,13.9219 67.2686,13.9155 67.2618)),((13.9195 67.0181,13.9284 67.0179,13.9499 67.0223,13.9602 67.0264,13.961 67.0437,13.966 67.056,13.963 67.0644,13.9564 67.0631,13.9527 67.0553,13.9381 67.0402,13.9425 67.0346,13.9406 67.0318,13.9208 67.021,13.9195 67.0181)),((13.9384 67.1274,13.9439 67.127,13.9673 67.1426,13.9942 67.1452,13.9922 67.149,13.9728 67.1551,13.967 67.1612,13.9601 67.1558,13.9532 67.1436,13.9395 67.1325,13.9384 67.1274)),((13.9398 67.0663,13.9442 67.064,13.9515 67.0716,13.9485 67.0767,13.9452 67.0761,13.9398 67.0663)),((13.9446 67.4318,13.9513 67.4282,13.9501 67.4233,13.9551 67.421,13.9831 67.4278,13.9828 67.4357,13.9717 67.4365,13.9568 67.4329,13.9471 67.4347,13.9446 67.4318)),((13.9587 67.4146,13.9625 67.4122,13.9802 67.4165,13.9879 67.4217,13.9808 67.4231,13.9663 67.42,13.9587 67.4146)),((13.9825 67.1628,13.9896 67.1595,13.9849 67.1546,13.9929 67.152,14.0027 67.1528,14.0092 67.1561,14.0108 67.1615,14.0185 67.1649,14.0202 67.1669,14.0096 67.1698,13.997 67.1702,13.9834 67.1667,13.9825 67.1628)),((13.9965 67.1042,14.0123 67.1,14.0123 67.0966,14.0198 67.0921,14.0308 67.0913,14.0403 67.096,14.0583 67.0954,14.0678 67.0922,14.0836 67.0827,14.1093 67.0801,14.1277 67.0749,14.1334 67.0706,14.1413 67.0567,14.1544 67.0479,14.1493 67.0389,14.1561 67.0247,14.1731 67.0157,14.175 67.0147,14.1764 67.0108,14.1901 67.0102,14.2054 67.0154,14.2271 67.0257,14.2349 67.0324,14.2253 67.0427,14.2277 67.0495,14.2401 67.0529,14.2417 67.0549,14.239 67.0577,14.244 67.0654,14.2406 67.0682,14.2183 67.0712,14.2136 67.0794,14.2228 67.0887,14.2222 67.0921,14.2147 67.0966,14.2133 67.1039,14.2145 67.1074,14.222 67.1108,14.2512 67.1241,14.2636 67.1363,14.2632 67.1457,14.2667 67.1477,14.2768 67.1492,14.2906 67.1554,14.286 67.1773,14.3027 67.1872,14.3021 67.1922,14.2897 67.1989,14.2869 67.2034,14.2796 67.204,14.2477 67.1936,14.2348 67.1894,14.2336 67.1778,14.196 67.1396,14.1703 67.1302,14.1607 67.1288,14.1562 67.1299,14.1514 67.1368,14.1292 67.1441,14.1142 67.1528,14.1001 67.1543,14.0904 67.163,14.0852 67.1648,14.079 67.1668,14.072 67.1664,14.069 67.1598,14.0616 67.1557,14.0639 67.1492,14.0497 67.1443,14.0475 67.1255,14.027 67.1149,14.0148 67.1128,13.997 67.116,13.9965 67.1042)),((14.1778 67.1776,14.1783 67.1661,14.1901 67.1665,14.1924 67.1682,14.1862 67.1758,14.1778 67.1776)),((14.1783 68.2273,14.182 68.2205,14.1892 68.2214,14.1894 68.2292,14.192 68.2321,14.1889 68.2338,14.1819 68.2325,14.1783 68.2273)),((14.198 68.1808,14.2084 68.176,14.2206 68.1752,14.2224 68.1751,14.2304 68.1769,14.2395 68.1757,14.2908 68.1845,14.3022 68.1855,14.3149 68.1846,14.3323 68.1861,14.3418 68.1889,14.3295 68.1954,14.3329 68.1965,14.3369 68.1958,14.3386 68.198,14.335 68.2008,14.3362 68.2096,14.3298 68.2185,14.3371 68.2191,14.3423 68.2168,14.3432 68.204,14.3521 68.1966,14.3565 68.1998,14.3695 68.1981,14.3776 68.2013,14.3832 68.2014,14.3955 68.2017,14.3995 68.2042,14.3894 68.2083,14.3981 68.2134,14.3993 68.2185,14.4029 68.2189,14.4212 68.2163,14.4243 68.2146,14.4192 68.2098,14.422 68.2072,14.4383 68.2119,14.4464 68.21,14.4629 68.2124,14.4785 68.2104,14.4828 68.2159,14.4911 68.2186,14.4924 68.2235,14.5038 68.2229,14.5122 68.2272,14.526 68.227,14.5304 68.2284,14.5341 68.232,14.5309 68.2357,14.5373 68.2423,14.5341 68.2442,14.5255 68.244,14.5099 68.2403,14.5072 68.2397,14.4986 68.2411,14.5075 68.2457,14.5326 68.2503,14.5478 68.246,14.5462 68.2365,14.5527 68.2338,14.5632 68.2339,14.5806 68.2428,14.5691 68.2452,14.5707 68.2462,14.6252 68.25,14.6305 68.2419,14.6368 68.2418,14.6394 68.243,14.6377 68.2462,14.6422 68.2494,14.6485 68.2474,14.6433 68.2425,14.6492 68.2401,14.6623 68.2432,14.6597 68.2489,14.6604 68.2498,14.6651 68.2567,14.6755 68.2607,14.6819 68.2762,14.6792 68.2786,14.6593 68.2804,14.6406 68.2786,14.6285 68.2812,14.6235 68.2849,14.6255 68.288,14.6346 68.287,14.6629 68.2895,14.6738 68.2868,14.6853 68.2897,14.6925 68.3029,14.7145 68.3201,14.7072 68.3232,14.6942 68.3247,14.6924 68.326,14.6908 68.3273,14.6955 68.3316,14.712 68.3363,14.7084 68.3394,14.7107 68.3508,14.7046 68.3592,14.7085 68.3624,14.7422 68.355,14.747 68.352,14.7391 68.3424,14.749 68.3392,14.7527 68.3339,14.7824 68.3362,14.7904 68.3347,14.7847 68.3314,14.7526 68.3233,14.7441 68.3192,14.7368 68.3111,14.7073 68.2783,14.7149 68.2759,14.7121 68.2679,14.7236 68.2671,14.7268 68.2615,14.7422 68.2652,14.7461 68.2721,14.7526 68.2749,14.7972 68.2841,14.8055 68.2873,14.8186 68.298,14.8359 68.3037,14.8467 68.3012,14.8509 68.3041,14.8553 68.3071,14.8788 68.3146,14.8908 68.3216,14.9109 68.3265,14.9191 68.3317,14.945 68.3379,14.9626 68.3468,14.9877 68.3647,14.9829 68.3698,14.9839 68.3742,14.9939 68.3853,15 68.3862,15.0173 68.3751,15.0235 68.3733,15.0326 68.3739,15.0367 68.3749,15.051 68.3786,15.0779 68.3934,15.0807 68.4002,15.0919 68.404,15.1009 68.4108,15.1193 68.4192,15.1378 68.4332,15.1728 68.4522,15.1897 68.4656,15.1886 68.4688,15.178 68.4706,15.1897 68.475,15.1873 68.4768,15.1832 68.4762,15.1795 68.4757,15.1617 68.4782,15.1544 68.4758,15.1583 68.4716,15.1554 68.4689,15.0899 68.4662,15.0604 68.4684,15.0501 68.4674,15.045 68.464,15.0395 68.4522,15.004 68.4499,15 68.4456,14.9976 68.443,14.9876 68.4391,14.9658 68.4517,14.9547 68.4514,14.9411 68.4545,14.94 68.4543,14.9293 68.4523,14.9004 68.4526,14.9032 68.4573,14.8957 68.4609,14.8871 68.4623,14.878 68.4615,14.8751 68.4588,14.8875 68.4539,14.8771 68.4476,14.8893 68.4394,14.887 68.4333,14.8642 68.4159,14.8746 68.4127,14.8786 68.4067,14.8919 68.397,14.889 68.3927,14.8712 68.3974,14.8579 68.3977,14.8509 68.396,14.8487 68.3954,14.84 68.39,14.8243 68.3865,14.8105 68.3796,14.7996 68.3786,14.7792 68.3726,14.7745 68.3736,14.7763 68.3755,14.8068 68.3884,14.8276 68.3933,14.8334 68.3963,14.8306 68.3992,14.8385 68.4088,14.8392 68.4178,14.8317 68.4214,14.8386 68.4323,14.836 68.4342,14.8254 68.4305,14.8063 68.4375,14.8053 68.4379,14.7982 68.4387,14.7655 68.4374,14.7485 68.4394,14.7458 68.4436,14.7407 68.4438,14.7321 68.4434,14.7248 68.4392,14.7172 68.4393,14.7069 68.4365,14.6921 68.4305,14.691 68.4268,14.6978 68.4197,14.6998 68.4085,14.7141 68.3963,14.7102 68.3931,14.6976 68.3918,14.6701 68.4044,14.6886 68.4137,14.6858 68.4153,14.681 68.4178,14.6768 68.4314,14.6619 68.4381,14.6477 68.4411,14.6026 68.4396,14.5909 68.4338,14.5655 68.4312,14.5295 68.4198,14.5366 68.4139,14.5512 68.4134,14.5551 68.4111,14.5534 68.4055,14.5778 68.3965,14.5847 68.3913,14.5806 68.3872,14.5737 68.3858,14.5624 68.3836,14.5567 68.3838,14.5538 68.3797,14.5572 68.3736,14.5492 68.3751,14.5436 68.3804,14.545 68.385,14.5295 68.3988,14.5257 68.406,14.5146 68.4089,14.5035 68.4086,14.475 68.4008,14.4468 68.401,14.4254 68.3963,14.4115 68.3984,14.4103 68.3949,14.4196 68.3898,14.4182 68.3886,14.4011 68.3875,14.4007 68.3852,14.4136 68.3825,14.4344 68.3783,14.4231 68.3734,14.4234 68.3706,14.443 68.3683,14.4349 68.3647,14.4282 68.3644,14.4273 68.3616,14.4379 68.3547,14.4764 68.3536,14.4772 68.3564,14.4657 68.3625,14.4547 68.3652,14.4583 68.3675,14.4793 68.3611,14.4871 68.3569,14.4893 68.3524,14.4831 68.3454,14.4931 68.3348,14.4862 68.3297,14.4897 68.3268,14.4821 68.328,14.4779 68.3286,14.4721 68.3255,14.4563 68.333,14.4637 68.3385,14.4575 68.3455,14.4579 68.3495,14.4457 68.3521,14.4384 68.3483,14.4377 68.3432,14.4451 68.3383,14.4415 68.3328,14.4442 68.3304,14.4387 68.3283,14.4121 68.3279,14.4053 68.3294,14.4038 68.325,14.4077 68.321,14.418 68.3183,14.4241 68.3084,14.4205 68.3064,14.412 68.309,14.3944 68.3215,14.3918 68.326,14.3865 68.3347,14.3752 68.3418,14.3627 68.3453,14.3372 68.3486,14.3279 68.3449,14.3065 68.325,14.3043 68.3023,14.2996 68.2981,14.3093 68.2935,14.3413 68.2861,14.3434 68.2821,14.3404 68.2799,14.308 68.2835,14.295 68.285,14.2778 68.2793,14.2845 68.2746,14.2691 68.2692,14.2678 68.2627,14.2766 68.2573,14.2972 68.2535,14.3078 68.2536,14.3282 68.2606,14.3653 68.2661,14.3747 68.2661,14.3796 68.2645,14.3666 68.2609,14.343 68.2593,14.3212 68.2543,14.3179 68.2513,14.2778 68.2502,14.2742 68.2501,14.2633 68.2461,14.2429 68.2457,14.231 68.2426,14.211 68.2414,14.2047 68.2381,14.2043 68.2224,14.2091 68.2194,14.2151 68.2185,14.2128 68.2129,14.2241 68.2107,14.211 68.2042,14.2057 68.1968,14.2142 68.1956,14.2318 68.2,14.2325 68.198,14.2088 68.1901,14.1995 68.185,14.198 68.1808)),((14.2128 67.3814,14.213 67.3775,14.2199 67.3733,14.2315 67.3725,14.2721 67.3762,14.311 67.3865,14.3507 67.3877,14.3766 67.3925,14.4182 67.4209,14.4195 67.4239,14.4116 67.426,14.3926 67.4205,14.3865 67.4206,14.3859 67.424,14.4 67.4317,14.3987 67.4355,14.3813 67.4459,14.3767 67.4469,14.3699 67.4458,14.357 67.438,14.3265 67.4309,14.2695 67.4091,14.2593 67.4007,14.2566 67.3946,14.2476 67.3924,14.2417 67.391,14.2368 67.388,14.2194 67.3864,14.2128 67.3814)),((14.2842 67.2876,14.2875 67.2832,14.2943 67.281,14.3064 67.2821,14.3326 67.2975,14.3458 67.3026,14.3497 67.3049,14.344 67.3076,14.3245 67.302,14.3036 67.2919,14.2981 67.2904,14.2878 67.2908,14.2842 67.2876)),((14.3011 68.5983,14.3091 68.5955,14.3152 68.5976,14.3181 68.6019,14.3238 68.6034,14.3266 68.6044,14.3202 68.6064,14.307 68.6028,14.3011 68.5983)),((14.3183 68.6183,14.3212 68.6104,14.3265 68.6097,14.334 68.6133,14.3357 68.6208,14.3411 68.6233,14.3438 68.6262,14.3405 68.6284,14.3334 68.6271,14.3183 68.6183)),((14.3236 67.2839,14.3257 67.2831,14.3418 67.2849,14.3577 67.2889,14.3621 67.2933,14.3656 67.2953,14.3544 67.2966,14.3416 67.2906,14.3252 67.2863,14.3236 67.2839)),((14.3621 68.6896,14.3705 68.6891,14.3802 68.6905,14.3855 68.6879,14.3981 68.6881,14.4163 68.6834,14.4136 68.6805,14.3943 68.6814,14.3898 68.6799,14.3886 68.6676,14.394 68.6667,14.4058 68.6691,14.4185 68.6672,14.4254 68.6689,14.4387 68.6815,14.4433 68.6859,14.457 68.6916,14.4675 68.6924,14.4722 68.6898,14.466 68.6844,14.4537 68.6799,14.4574 68.6716,14.4546 68.6687,14.4389 68.6649,14.4331 68.6619,14.4219 68.6614,14.4212 68.6597,14.4305 68.6569,14.419 68.6502,14.4237 68.6444,14.4226 68.6404,14.4316 68.6383,14.433 68.6345,14.4217 68.6272,14.4322 68.6261,14.436 68.621,14.4429 68.6195,14.4239 68.6126,14.4322 68.6107,14.4384 68.6115,14.4563 68.6139,14.4483 68.608,14.4649 68.6058,14.4717 68.6131,14.4783 68.6106,14.4769 68.6059,14.4866 68.6034,14.5063 68.6048,14.5184 68.6098,14.5244 68.6052,14.5356 68.6108,14.5494 68.6147,14.5579 68.6227,14.5657 68.6254,14.5993 68.627,14.5964 68.6208,14.6 68.6196,14.6073 68.6204,14.6231 68.6309,14.6358 68.6341,14.6538 68.6387,14.6538 68.6404,14.6402 68.6432,14.6402 68.6503,14.633 68.6527,14.6257 68.6519,14.6122 68.658,14.6111 68.6628,14.6247 68.6653,14.6361 68.6582,14.6457 68.6598,14.6501 68.6632,14.6544 68.6618,14.6548 68.6572,14.662 68.6582,14.6721 68.6638,14.6713 68.6695,14.6623 68.67,14.6691 68.674,14.6607 68.6762,14.6731 68.6804,14.6786 68.6936,14.6716 68.699,14.6722 68.7026,14.6745 68.7157,14.6851 68.7144,14.6887 68.7097,14.6805 68.6987,14.6867 68.6974,14.7043 68.7031,14.7078 68.7023,14.7087 68.6996,14.7 68.6939,14.6996 68.686,14.7042 68.6855,14.7222 68.6901,14.7267 68.6898,14.7302 68.6817,14.7143 68.675,14.7128 68.6719,14.7159 68.6704,14.7095 68.6669,14.726 68.6633,14.74 68.6665,14.7716 68.6638,14.778 68.6646,14.7803 68.667,14.7733 68.6724,14.7854 68.6886,14.7873 68.6977,14.7983 68.6986,14.8043 68.7015,14.8036 68.7051,14.7958 68.7094,14.8044 68.7176,14.8218 68.7128,14.8147 68.7079,14.8206 68.7038,14.8053 68.6967,14.794 68.6874,14.7973 68.6781,14.8083 68.6775,14.8101 68.6704,14.8143 68.6692,14.8221 68.6717,14.8377 68.6765,14.8473 68.6815,14.8505 68.687,14.849 68.6968,14.8522 68.6983,14.8561 68.6981,14.8656 68.6872,14.8774 68.6841,14.903 68.685,14.9163 68.6886,14.9265 68.6957,14.9335 68.705,14.9215 68.7102,14.9335 68.7197,14.952 68.7229,14.958 68.7312,14.9591 68.7336,14.948 68.7384,14.9488 68.7398,14.9499 68.7419,14.9577 68.7413,14.9724 68.7337,14.9714 68.7201,14.9572 68.719,14.9554 68.715,14.9594 68.7124,14.9703 68.714,14.9748 68.7119,14.969 68.7066,14.9824 68.7026,14.9926 68.7042,15 68.7067,15.0221 68.7143,15.0409 68.728,15.0563 68.7331,15.0524 68.737,15.0561 68.7393,15.0627 68.7384,15.0635 68.7343,15.075 68.7376,15.0807 68.7413,15.0764 68.7421,15.0624 68.7448,15.0359 68.7651,15.0273 68.7679,15.0321 68.7707,15.0546 68.7643,15.0649 68.7636,15.0752 68.7594,15.0881 68.7589,15.0902 68.7601,15.0864 68.7638,15.0941 68.7637,15.1052 68.7608,15.1172 68.7611,15.1408 68.757,15.1337 68.7498,15.1383 68.7454,15.1312 68.7327,15.1389 68.7284,15.1427 68.7228,15.1476 68.7214,15.137 68.7152,15.1393 68.7123,15.1734 68.7012,15.1714 68.6976,15.1513 68.703,15.1418 68.703,15.1329 68.7068,15.1188 68.7091,15.1218 68.7134,15.114 68.7158,15.0978 68.7169,15.089 68.7131,15.0885 68.7126,15.0801 68.7037,15.0549 68.696,15.0518 68.6866,15.0645 68.6826,15.0631 68.6811,15.0563 68.6806,15.0399 68.6824,15.0351 68.6799,15.0382 68.6779,15.0364 68.6742,15.03 68.6744,15.0217 68.6781,15.0098 68.6797,15 68.678,14.9901 68.6763,14.9664 68.6754,14.965 68.674,14.9763 68.6632,14.9697 68.6602,14.9545 68.6696,14.932 68.6688,14.9201 68.6668,14.9135 68.6657,14.8962 68.6589,14.8644 68.6524,14.8568 68.6525,14.8557 68.6538,14.8739 68.6577,14.8777 68.6595,14.872 68.6613,14.8657 68.6612,14.8522 68.6564,14.8315 68.6562,14.827 68.6528,14.8186 68.6515,14.8174 68.6475,14.7874 68.6431,14.7857 68.6354,14.7908 68.6352,14.8051 68.6395,14.8142 68.6367,14.8156 68.6292,14.8113 68.6235,14.8223 68.6173,14.8285 68.6179,14.8552 68.6204,14.8776 68.6088,14.8748 68.6077,14.8502 68.6094,14.8482 68.6081,14.8526 68.6044,14.846 68.6016,14.8448 68.5979,14.8517 68.5943,14.8472 68.5908,14.8497 68.5891,14.8765 68.5901,14.9034 68.587,14.919 68.5872,14.9387 68.5904,14.9512 68.5907,14.9735 68.5881,14.9853 68.5849,15 68.5852,15.0041 68.5853,15.0254 68.5818,15.0307 68.581,15.0457 68.583,15.0841 68.6017,15.106 68.608,15.1267 68.6101,15.1289 68.6148,15.1395 68.6171,15.1524 68.6142,15.1764 68.6199,15.2045 68.6303,15.2291 68.632,15.2393 68.6355,15.2621 68.6372,15.285 68.6462,15.2885 68.6468,15.318 68.6515,15.3509 68.6628,15.3792 68.6691,15.3919 68.6786,15.408 68.6855,15.4205 68.6959,15.4162 68.7309,15.4113 68.7362,15.3843 68.7458,15.3748 68.7492,15.3443 68.7532,15.3297 68.7514,15.312 68.755,15.2809 68.7571,15.2742 68.76,15.312 68.7686,15.316 68.7717,15.3089 68.7779,15.3139 68.7861,15.3038 68.7917,15.2703 68.8008,15.2708 68.8029,15.2973 68.8036,15.3297 68.7992,15.3359 68.7983,15.3454 68.7983,15.3561 68.8026,15.3696 68.8039,15.3823 68.8118,15.3676 68.816,15.3781 68.8305,15.3989 68.8468,15.3897 68.8574,15.3586 68.8612,15.3474 68.866,15.3401 68.8728,15.3313 68.8745,15.3303 68.8696,15.3205 68.8685,15.3148 68.8588,15.3128 68.8577,15.3062 68.8539,15.2889 68.8483,15.2875 68.8411,15.2686 68.8327,15.2587 68.8318,15.2549 68.8377,15.2646 68.8429,15.2652 68.8489,15.273 68.8522,15.2711 68.8561,15.287 68.8581,15.2919 68.8606,15.2852 68.8636,15.2928 68.8676,15.3047 68.8798,15.3076 68.8884,15.3028 68.8933,15.306 68.8989,15.2971 68.9027,15.2721 68.9012,15.2786 68.9086,15.2797 68.9167,15.2929 68.9193,15.314 68.9193,15.3128 68.9227,15.3035 68.9239,15.2811 68.922,15.2649 68.9246,15.2593 68.9223,15.2593 68.9165,15.2546 68.9154,15.2469 68.9165,15.2304 68.9226,15.2256 68.9217,15.2026 68.9258,15.2057 68.9278,15.2173 68.9294,15.2129 68.9313,15.1964 68.929,15.1881 68.9328,15.1749 68.9341,15.1771 68.9369,15.1845 68.9416,15.2127 68.9355,15.2166 68.9372,15.2125 68.944,15.2185 68.9451,15.2306 68.9433,15.2417 68.9388,15.2666 68.9332,15.2757 68.9363,15.2839 68.9369,15.2908 68.9448,15.2995 68.9474,15.3011 68.9523,15.2987 68.9547,15.2965 68.9567,15.3026 68.9614,15.2952 68.9645,15.2862 68.9607,15.2698 68.9639,15.2589 68.9618,15.2508 68.9536,15.2406 68.9534,15.229 68.9575,15.2234 68.9571,15.2192 68.9507,15.207 68.9488,15.1949 68.9487,15.1681 68.9598,15.1741 68.9628,15.1821 68.9638,15.1796 68.9692,15.1447 68.9645,15.1358 68.9567,15.1252 68.9579,15.1103 68.9566,15.1043 68.9575,15.1061 68.9588,15.1084 68.9604,15.1313 68.9646,15.1417 68.9697,15.1647 68.9718,15.1669 68.9804,15.1779 68.9802,15.1879 68.9845,15.1757 68.9865,15.184 68.9924,15.1826 68.9986,15.1888 69.0048,15.182 69.0135,15.185 69.018,15.1645 69.0217,15.1569 69.0269,15.1498 69.0273,15.141 69.0246,15.1183 69.0255,15.0959 69.0194,15.091 69.0152,15.0895 69.0139,15.069 69.0063,15.0145 69.0044,15.0087 68.9988,15.0251 68.9922,15.0093 68.9784,15.0098 68.9715,15.02 68.9586,15.0063 68.9446,15.012 68.9428,15.0303 68.9416,15.038 68.938,15.0437 68.927,15.0519 68.9243,15.089 68.9121,15.0834 68.9078,15.059 68.9177,15.0482 68.9156,15.0393 68.9116,15.0372 68.9085,15.0428 68.9053,15.0471 68.902,15.0433 68.8982,15.0371 68.8954,15.0305 68.8925,15.0453 68.8904,15.0578 68.8986,15.0693 68.9023,15.0814 68.9026,15.0795 68.8857,15.0592 68.874,15.0935 68.8668,15.1149 68.8583,15.1352 68.8548,15.1406 68.8502,15.1395 68.8308,15.149 68.825,15.1478 68.824,15.1456 68.8221,15.148 68.8185,15.1365 68.8187,15.1237 68.8267,15.118 68.8379,15.1123 68.8416,15.1128 68.8455,15.0981 68.8497,15.0784 68.8608,15.0482 68.8613,15.0405 68.8596,15.0352 68.8548,15.0398 68.843,15.0359 68.8339,15.0424 68.828,15.0395 68.8179,15.0331 68.8142,15.0338 68.8086,15.0342 68.8055,15.029 68.8039,15.0169 68.804,15.0121 68.8068,15.0177 68.8165,15.0071 68.8213,15.0181 68.8303,15.0139 68.837,15.0155 68.8415,15.0117 68.8434,15.0018 68.8443,15.0079 68.8487,15 68.8503,14.9929 68.8518,14.9887 68.8546,14.9917 68.8607,14.9852 68.8648,14.9603 68.8706,14.9439 68.8664,14.9176 68.8558,14.9013 68.8548,14.8968 68.8514,14.8973 68.8495,14.8984 68.845,14.9093 68.8356,14.9457 68.8243,14.9536 68.818,14.9634 68.8171,14.9628 68.8152,14.9345 68.8126,14.9256 68.8069,14.9236 68.8017,14.9376 68.7961,14.9406 68.7928,14.9535 68.7922,14.9751 68.787,14.9853 68.7812,14.9839 68.7798,14.9747 68.7808,14.9533 68.7874,14.9374 68.7892,14.9284 68.7877,14.9251 68.7861,14.907 68.7779,14.9163 68.7751,14.9017 68.7676,14.906 68.7643,14.9067 68.7551,14.8954 68.7457,14.8969 68.7411,14.8942 68.7398,14.8893 68.7412,14.8826 68.7478,14.8886 68.7525,14.8888 68.7645,14.8845 68.7677,14.887 68.7734,14.8844 68.7753,14.8684 68.7721,14.8666 68.7736,14.8876 68.7881,14.8872 68.7911,14.8742 68.7958,14.8654 68.7989,14.8495 68.7991,14.8358 68.7964,14.8258 68.7922,14.7991 68.7887,14.7894 68.7855,14.7688 68.7843,14.7565 68.778,14.7542 68.7701,14.7483 68.7705,14.743 68.773,14.7298 68.7636,14.7324 68.7599,14.7284 68.7585,14.7168 68.7589,14.7024 68.7532,14.6977 68.7539,14.7057 68.76,14.7027 68.7629,14.7083 68.767,14.6991 68.7714,14.681 68.7688,14.678 68.77,14.6801 68.7715,14.6876 68.7769,14.6891 68.7922,14.7049 68.8051,14.6988 68.8078,14.7059 68.8111,14.7056 68.8173,14.6975 68.8188,14.7039 68.8258,14.7006 68.8279,14.6926 68.8287,14.7035 68.8393,14.6967 68.8404,14.6849 68.8396,14.6786 68.8412,14.6714 68.8381,14.656 68.8385,14.6439 68.835,14.6263 68.8325,14.6235 68.8174,14.622 68.8157,14.6168 68.8093,14.6261 68.8031,14.6238 68.797,14.6303 68.7931,14.6496 68.7906,14.6525 68.7879,14.6517 68.7867,14.6235 68.7873,14.6166 68.7835,14.6177 68.7716,14.6139 68.7698,14.6012 68.7696,14.6033 68.7587,14.5978 68.7527,14.6134 68.7446,14.631 68.745,14.6373 68.7469,14.644 68.7442,14.6356 68.7395,14.6122 68.7335,14.6059 68.7319,14.6066 68.7388,14.5928 68.7437,14.5896 68.7491,14.5793 68.7476,14.5811 68.762,14.5914 68.7669,14.5909 68.7701,14.5801 68.7737,14.5846 68.7788,14.584 68.7891,14.5912 68.7993,14.5861 68.8046,14.5713 68.8102,14.5725 68.8139,14.5656 68.8173,14.5666 68.8196,14.5456 68.8248,14.5323 68.8152,14.5434 68.8116,14.4972 68.7901,14.4796 68.7895,14.4649 68.7846,14.4517 68.7874,14.4465 68.786,14.4526 68.7817,14.4469 68.7745,14.4538 68.7714,14.4502 68.7673,14.4571 68.7642,14.4694 68.7636,14.4612 68.76,14.4622 68.7573,14.4798 68.7524,14.5035 68.7535,14.5176 68.7514,14.5291 68.7444,14.5398 68.7428,14.5412 68.7431,14.5541 68.7455,14.5769 68.7455,14.5839 68.7419,14.5821 68.74,14.5607 68.7412,14.5369 68.7334,14.5243 68.7312,14.5191 68.737,14.5096 68.7368,14.5066 68.7398,14.498 68.7392,14.4883 68.7362,14.4783 68.7373,14.4497 68.7288,14.4423 68.725,14.43 68.7256,14.4186 68.7204,14.4207 68.7148,14.4173 68.7118,14.4246 68.7092,14.4362 68.7121,14.4392 68.7074,14.4515 68.7053,14.4608 68.7038,14.4577 68.7018,14.4514 68.7001,14.43 68.703,14.4156 68.7028,14.4072 68.7049,14.3961 68.7039,14.3638 68.692,14.3621 68.6896)),((14.5145 67.3674,14.5211 67.3638,14.5375 67.3684,14.554 67.3743,14.5629 67.3798,14.5609 67.382,14.5558 67.3831,14.5334 67.3785,14.5145 67.3674)),((14.5679 67.727,14.5721 67.7254,14.5881 67.7264,14.5949 67.7297,14.6002 67.7371,14.6018 67.7413,14.5976 67.743,14.5798 67.7363,14.5766 67.7316,14.5679 67.727)),((14.6051 68.5595,14.6127 68.5541,14.6252 68.5526,14.6518 68.5415,14.6591 68.5404,14.6736 68.5296,14.6923 68.5245,14.7042 68.5177,14.7238 68.5119,14.7252 68.5115,14.71 68.5064,14.7195 68.5027,14.722 68.4989,14.7344 68.4977,14.7443 68.5018,14.7543 68.5018,14.7632 68.4978,14.7823 68.5008,14.8037 68.4986,14.8359 68.5019,14.8838 68.5011,14.8998 68.5039,14.9198 68.5097,14.9598 68.5267,14.9716 68.5301,14.9895 68.5354,14.9989 68.5485,15 68.5541,14.9879 68.5606,14.9799 68.5619,14.9664 68.5608,14.9516 68.5636,14.9316 68.5634,14.92 68.5661,14.9086 68.5718,14.8842 68.573,14.868 68.5761,14.8476 68.5715,14.8146 68.5797,14.7775 68.5812,14.7674 68.583,14.7287 68.5803,14.7114 68.5835,14.699 68.5858,14.6903 68.5909,14.6756 68.5898,14.6468 68.5804,14.6315 68.5792,14.6082 68.5684,14.6051 68.5595)),((14.6115 67.2364,14.6132 67.233,14.6303 67.2263,14.658 67.2251,14.6736 67.2266,14.7046 67.2258,14.7103 67.2323,14.7051 67.2373,14.6885 67.2407,14.6641 67.2372,14.6534 67.2371,14.634 67.2384,14.6152 67.243,14.6115 67.2364)),((14.647 67.5669,14.6901 67.5625,14.6854 67.5606,14.6645 67.5613,14.6519 67.5595,14.6525 67.5577,14.6844 67.5576,14.7128 67.5648,14.7066 67.567,14.6789 67.5687,14.6507 67.5684,14.647 67.5669)),((14.6492 67.8086,14.6529 67.8069,14.6678 67.8079,14.6728 67.8109,14.6895 67.8101,14.6956 67.812,14.6988 67.8186,14.706 67.8208,14.7063 67.8234,14.6875 67.8213,14.6767 67.8226,14.6741 67.8197,14.6664 67.8189,14.6683 67.8151,14.6555 67.8135,14.6492 67.8086)),((14.6599 68.1666,14.6691 68.1597,14.6934 68.1664,14.7105 68.167,14.7134 68.1694,14.7078 68.1712,14.6997 68.1713,14.695 68.1761,14.6904 68.1768,14.6624 68.1702,14.6599 68.1666)),((14.7059 68.2036,14.7095 68.2022,14.7182 68.2039,14.7384 68.1992,14.7623 68.198,14.7779 68.1994,14.7833 68.2038,14.7862 68.2131,14.7948 68.217,14.8012 68.2166,14.8036 68.2149,14.7984 68.2108,14.8066 68.2097,14.824 68.2168,14.8256 68.2196,14.8204 68.2221,14.781 68.2265,14.771 68.2251,14.7564 68.2295,14.7435 68.2291,14.7314 68.2265,14.7266 68.2225,14.7269 68.218,14.717 68.2126,14.7131 68.206,14.7059 68.2036)),((14.715 67.5923,14.7192 67.5904,14.7363 67.5936,14.7562 67.6005,14.7547 67.6032,14.7417 67.6007,14.7153 67.5948,14.715 67.5923)),((14.7199 68.7915,14.7259 68.7888,14.737 68.7882,14.7485 68.7896,14.7764 68.7953,14.7954 68.8046,14.7982 68.8075,14.781 68.8167,14.7413 68.8063,14.7233 68.7963,14.7199 68.7915)),((14.729 68.8229,14.7319 68.8186,14.7539 68.8159,14.7752 68.8222,14.7741 68.838,14.7861 68.8454,14.7845 68.8481,14.7729 68.8522,14.7701 68.8617,14.7644 68.8617,14.7602 68.8555,14.7423 68.8485,14.7451 68.8459,14.76 68.8436,14.7564 68.8392,14.7456 68.8339,14.7476 68.8301,14.729 68.8229)),((14.7842 68.2388,14.788 68.237,14.8038 68.2398,14.8113 68.2397,14.8239 68.2336,14.8301 68.2334,14.8421 68.2383,14.8472 68.2324,14.8647 68.2283,14.8716 68.2374,14.8674 68.2407,14.8791 68.2518,14.8936 68.2474,14.9064 68.2535,14.9158 68.2533,14.919 68.2569,14.9156 68.2613,14.9244 68.2663,14.9277 68.2734,14.9338 68.2771,14.9315 68.2804,14.9163 68.2814,14.9167 68.2825,14.9169 68.283,14.9517 68.2867,14.9597 68.2907,14.961 68.2961,14.9563 68.3007,14.9438 68.3047,14.9413 68.3083,14.9215 68.3136,14.8706 68.306,14.8549 68.2974,14.844 68.2946,14.8171 68.2825,14.8089 68.2718,14.7941 68.266,14.7927 68.2593,14.7868 68.2549,14.7903 68.2502,14.7885 68.2464,14.7945 68.2432,14.7913 68.2419,14.7842 68.2388)),((14.7877 68.8264,14.7928 68.8193,14.8084 68.8165,14.8155 68.8125,14.8087 68.8066,14.815 68.8049,14.8465 68.8058,14.854 68.8135,14.8556 68.8161,14.8517 68.818,14.8416 68.818,14.8387 68.8207,14.8445 68.8278,14.8429 68.8361,14.8227 68.8356,14.8136 68.8398,14.792 68.8377,14.79 68.8343,14.7931 68.831,14.7877 68.8264)),((14.8104 67.9018,14.8168 67.9026,14.8325 67.9123,14.8373 67.9162,14.8301 67.9159,14.8132 67.9079,14.8104 67.9018)),((14.8171 68.8459,14.8245 68.843,14.8407 68.8442,14.8452 68.8458,14.8468 68.8487,14.8296 68.8523,14.8171 68.8459)),((14.8212 68.8705,14.8244 68.8688,14.8489 68.8736,14.8471 68.8768,14.836 68.8756,14.8229 68.8731,14.8212 68.8705)),((14.828 68.8895,14.8323 68.8862,14.8582 68.8853,14.8658 68.8836,14.8774 68.8777,14.8956 68.8766,14.9279 68.8774,14.9806 68.8818,14.9903 68.8852,14.9935 68.8907,14.988 68.8976,14.9896 68.9039,14.9907 68.912,14.9779 68.9284,14.9647 68.9336,14.9547 68.9345,14.9351 68.9286,14.9266 68.9289,14.9144 68.9327,14.9035 68.9401,14.8953 68.9418,14.8817 68.9421,14.861 68.9354,14.8645 68.9291,14.8593 68.9275,14.8454 68.9289,14.8486 68.9217,14.8609 68.9158,14.842 68.906,14.8386 68.902,14.828 68.8895)),((14.8435 68.4251,14.8511 68.4232,14.8694 68.4316,14.8629 68.4361,14.8522 68.4361,14.8491 68.4288,14.8435 68.4251)),((14.861 67.9093,14.8719 67.9079,14.8847 67.9134,14.8877 67.9154,14.8818 67.9167,14.8758 67.9162,14.861 67.9093)),((14.8676 68.8072,14.8761 68.8046,14.8822 68.8056,14.8879 68.8109,14.8984 68.8137,14.9022 68.8176,14.905 68.8204,14.8973 68.8224,14.8676 68.8072)),((14.9234 68.5727,14.9319 68.5698,14.9603 68.5677,14.9637 68.569,14.9515 68.5733,14.9521 68.5751,14.9344 68.5771,14.926 68.576,14.9234 68.5727)),((14.9258 67.9111,14.9316 67.9105,14.9641 67.9247,14.9631 67.9266,14.9367 67.9188,14.9258 67.9111)),((14.9505 67.9549,14.9738 67.9435,14.9785 67.9313,14.9739 67.9231,14.9862 67.9227,15 67.9247,15.0148 67.9268,15.0386 67.9233,15.0654 67.922,15.1109 67.925,15.1166 67.9243,15.1051 67.9164,15.1148 67.9146,15.1238 67.9189,15.1399 67.915,15.1437 67.914,15.1561 67.9137,15.2011 67.9164,15.2454 67.923,15.2514 67.9196,15.2614 67.9207,15.2857 67.9289,15.2987 67.9304,15.3074 67.9338,15.3155 67.9335,15.3269 67.9379,15.3297 67.9387,15.3155 67.9507,15.2512 67.949,15.2396 67.9547,15.2094 67.957,15.19 67.9622,15.175 67.9573,15.1661 67.9567,15.1473 67.9598,15.1365 67.9591,15.1319 67.9602,15.1464 67.9646,15.1312 67.9756,15.1095 67.9838,15.1149 67.9867,15.1299 67.9947,15.1346 68.0029,15.1276 68.0074,15.0716 67.989,15.0634 67.984,15.0573 67.9748,15.0511 67.9731,15.0391 67.9739,15.0226 67.9778,15 67.9776,14.9993 67.9776,14.9832 67.9799,14.9729 67.9796,14.9711 67.9777,14.9762 67.9734,14.9848 67.9696,14.9843 67.9657,14.9728 67.9633,14.963 67.9633,14.9613 67.9627,14.9548 67.9604,14.9505 67.9549)),((14.9784 68.2775,14.9855 68.273,15 68.2688,15.0013 68.2684,15.0096 68.2697,15.0312 68.2795,15.0402 68.2803,15.0543 68.2867,15.0644 68.2881,15.0726 68.2915,15.0852 68.2927,15.0943 68.297,15.0823 68.2997,15.0592 68.2998,15.0507 68.3031,15.0523 68.3057,15.069 68.306,15.0793 68.3086,15.0995 68.304,15.1094 68.3079,15.1177 68.3089,15.1231 68.3096,15.1365 68.3183,15.1306 68.3268,15.1358 68.3277,15.1703 68.3288,15.1739 68.3275,15.1669 68.3222,15.1734 68.3213,15.1766 68.3173,15.1995 68.3349,15.213 68.3352,15.2248 68.341,15.2363 68.3422,15.2423 68.3524,15.2526 68.3591,15.2492 68.3637,15.2254 68.3701,15.2185 68.37,15.2122 68.3683,15.2094 68.3675,15.1966 68.3702,15.1871 68.367,15.1807 68.3713,15.1865 68.3746,15.2064 68.3747,15.2199 68.3733,15.2321 68.3743,15.2437 68.3711,15.2522 68.3719,15.2924 68.3903,15.3047 68.3926,15.3195 68.4009,15.3281 68.3994,15.3348 68.402,15.3467 68.4018,15.3577 68.4085,15.367 68.4105,15.3684 68.4283,15.3686 68.4308,15.3772 68.4314,15.3801 68.4262,15.3934 68.4197,15.404 68.4199,15.4258 68.4298,15.4391 68.4331,15.4774 68.4522,15.4961 68.4565,15.5051 68.4617,15.5037 68.4683,15.5085 68.4708,15.5212 68.4723,15.532 68.4757,15.5419 68.4839,15.5633 68.4936,15.5654 68.4981,15.5682 68.5041,15.5748 68.5069,15.5452 68.5153,15.5378 68.5192,15.5523 68.5188,15.5684 68.5154,15.5799 68.5108,15.5834 68.5057,15.58 68.4984,15.6055 68.4928,15.6124 68.4889,15.6036 68.487,15.58 68.4864,15.5684 68.4834,15.5145 68.4569,15.5088 68.454,15.4937 68.4403,15.4903 68.4314,15.4666 68.4194,15.4524 68.413,15.4346 68.4081,15.4099 68.4052,15.3815 68.3904,15.3717 68.3879,15.3664 68.3849,15.3648 68.3784,15.3559 68.373,15.3677 68.3712,15.3532 68.3621,15.3451 68.3633,15.3368 68.3646,15.3263 68.3643,15.32 68.3625,15.3192 68.3553,15.3249 68.3512,15.3441 68.3476,15.3591 68.3474,15.3753 68.3513,15.3845 68.3519,15.3896 68.3572,15.3965 68.3552,15.4061 68.3584,15.4132 68.3575,15.4174 68.3542,15.4244 68.3536,15.4344 68.3495,15.4394 68.3554,15.4441 68.3563,15.448 68.3539,15.4432 68.3452,15.4516 68.3463,15.4653 68.3425,15.4717 68.3437,15.4761 68.3517,15.4893 68.3573,15.4992 68.3573,15.5064 68.3541,15.4987 68.3471,15.5085 68.3436,15.5123 68.3374,15.5271 68.3359,15.5446 68.3394,15.5508 68.3358,15.5688 68.3358,15.5732 68.3337,15.5854 68.3342,15.59 68.3317,15.6002 68.3307,15.5991 68.3284,15.5741 68.3262,15.5724 68.3261,15.5713 68.3217,15.5596 68.3173,15.5668 68.3162,15.5807 68.3175,15.5796 68.3128,15.5841 68.3126,15.5976 68.315,15.6191 68.312,15.6581 68.3143,15.6538 68.3162,15.6571 68.3197,15.647 68.3221,15.6382 68.3265,15.6467 68.3313,15.642 68.3343,15.6532 68.3343,15.6633 68.3379,15.6711 68.3387,15.6824 68.3364,15.6901 68.3377,15.6894 68.342,15.6975 68.3442,15.699 68.3493,15.7151 68.3536,15.7141 68.3588,15.713 68.3648,15.7319 68.3722,15.7268 68.3748,15.7134 68.3738,15.7028 68.3694,15.699 68.3697,15.6943 68.3751,15.6806 68.3791,15.683 68.3813,15.7081 68.3809,15.717 68.3843,15.7355 68.385,15.7539 68.392,15.7546 68.3959,15.7385 68.4017,15.7401 68.4149,15.7566 68.4224,15.7688 68.4355,15.7693 68.436,15.7747 68.4367,15.7787 68.4339,15.7765 68.4164,15.7819 68.4108,15.789 68.41,15.7922 68.4057,15.7985 68.4035,15.8062 68.409,15.8224 68.4069,15.8323 68.4073,15.8385 68.4115,15.8349 68.4153,15.8344 68.4293,15.8245 68.4312,15.8204 68.4344,15.8087 68.4358,15.788 68.4446,15.7836 68.4488,15.7897 68.4532,15.772 68.4603,15.7769 68.4626,15.7797 68.4623,15.784 68.4619,15.7938 68.4584,15.8082 68.4418,15.8161 68.4384,15.8261 68.4381,15.8333 68.4352,15.846 68.4364,15.8523 68.4385,15.8732 68.454,15.8707 68.4604,15.8784 68.466,15.8693 68.4778,15.8728 68.4889,15.8677 68.4977,15.8696 68.5166,15.8805 68.5113,15.878 68.5032,15.8809 68.4932,15.8803 68.4911,15.8759 68.4764,15.8861 68.4674,15.8929 68.4677,15.8952 68.4664,15.8887 68.4567,15.8912 68.4524,15.8999 68.4484,15.8803 68.4449,15.8778 68.4429,15.8756 68.4376,15.8816 68.4282,15.8711 68.413,15.877 68.4098,15.8601 68.3956,15.8585 68.3861,15.8622 68.3842,15.8748 68.3858,15.876 68.3855,15.8836 68.3834,15.8955 68.3853,15.9094 68.3847,15.914 68.386,15.9168 68.3914,15.9254 68.3941,15.9224 68.3958,15.9256 68.3975,15.9343 68.3953,15.9477 68.3986,15.9586 68.3956,15.999 68.4107,15.9997 68.4232,16.0089 68.4366,16.0121 68.4492,16.0392 68.4633,16.0484 68.4655,16.0726 68.4713,16.0833 68.4754,16.0852 68.4837,16.0915 68.4879,16.0809 68.4943,16.0964 68.4993,16.1053 68.5162,16.1108 68.5166,16.1232 68.5127,16.1301 68.5146,16.1224 68.5198,16.1117 68.5219,16.1083 68.525,16.1175 68.5389,16.1173 68.544,16.1094 68.5494,16.0884 68.5548,16.0925 68.5582,16.0936 68.5581,16.1047 68.5573,16.1212 68.5522,16.127 68.5473,16.1252 68.536,16.1306 68.5325,16.1493 68.531,16.1628 68.5317,16.1945 68.5483,16.2247 68.5609,16.2359 68.5636,16.2588 68.5626,16.2778 68.5574,16.2913 68.5563,16.308 68.5592,16.3175 68.5657,16.3242 68.5666,16.3394 68.5684,16.4004 68.5699,16.4246 68.5665,16.451 68.5596,16.4618 68.5591,16.5162 68.5689,16.5171 68.5746,16.5266 68.5791,16.5122 68.5813,16.5088 68.5847,16.5104 68.5971,16.5002 68.6094,16.5004 68.6133,16.5302 68.6143,16.5431 68.6178,16.5686 68.6329,16.5756 68.6442,16.5955 68.6499,16.5935 68.6549,16.5964 68.6582,16.587 68.6607,16.5865 68.6648,16.6004 68.6669,16.6079 68.6742,16.5926 68.6772,16.5916 68.6833,16.5469 68.6877,16.5526 68.6923,16.5637 68.6931,16.5642 68.6947,16.5651 68.6973,16.5783 68.6973,16.5872 68.6995,16.5844 68.7051,16.592 68.7145,16.6003 68.7187,16.5937 68.7247,16.5957 68.7337,16.5919 68.7361,16.5793 68.7313,16.5715 68.7225,16.5502 68.722,16.5453 68.7237,16.5602 68.7338,16.5786 68.7386,16.5715 68.7485,16.5651 68.7508,16.573 68.7591,16.568 68.7662,16.5637 68.7723,16.566 68.7781,16.5799 68.7758,16.5916 68.7864,16.591 68.7907,16.5998 68.8004,16.5851 68.801,16.5742 68.8039,16.5621 68.8039,16.5527 68.8013,16.5494 68.7902,16.5422 68.7887,16.5376 68.7916,16.5403 68.8002,16.5554 68.8193,16.5602 68.8227,16.5769 68.8267,16.5925 68.8277,16.5928 68.8281,16.5988 68.8346,16.5968 68.8375,16.5602 68.8413,16.5495 68.8363,16.5418 68.8248,16.5214 68.8183,16.516 68.8218,16.4926 68.8239,16.4863 68.8283,16.4945 68.8467,16.4841 68.8572,16.4745 68.8616,16.4576 68.861,16.4363 68.855,16.4233 68.8569,16.4039 68.8598,16.3595 68.8749,16.3417 68.8842,16.3045 68.8961,16.2895 68.9041,16.2834 68.9165,16.2754 68.9224,16.27 68.9231,16.2623 68.9212,16.2558 68.9237,16.2499 68.9065,16.243 68.9019,16.2459 68.8954,16.2465 68.894,16.2434 68.8895,16.275 68.8859,16.2873 68.8829,16.3441 68.8418,16.3431 68.8342,16.3358 68.8328,16.3199 68.8329,16.3084 68.8357,16.2913 68.8421,16.2804 68.8535,16.2722 68.8581,16.2652 68.8621,16.2563 68.8645,16.2086 68.8687,16.1889 68.8687,16.1602 68.8538,16.1218 68.8457,16.1105 68.8345,16.1011 68.8295,16.0881 68.8263,16.0886 68.8183,16.106 68.8063,16.117 68.7948,16.1179 68.7944,16.1265 68.7905,16.1426 68.7875,16.1557 68.7818,16.1942 68.7713,16.2086 68.7695,16.2386 68.7621,16.248 68.7581,16.2408 68.7523,16.2428 68.7497,16.2658 68.7445,16.2608 68.7421,16.2451 68.7417,16.2282 68.7388,16.1966 68.7408,16.1786 68.7374,16.1661 68.7371,16.1466 68.7384,16.13 68.7395,16.081 68.7488,16.0657 68.7492,16.0618 68.7476,16.0532 68.7423,16.0399 68.7016,16.026 68.6953,16.025 68.6879,16.0312 68.684,16.066 68.6773,16.0772 68.6734,16.0792 68.6688,16.0777 68.6651,16.0829 68.6605,16.08 68.6574,16.0931 68.6512,16.0818 68.6405,16.0735 68.6385,16.0622 68.6406,16.0525 68.6393,16.049 68.6403,16.0568 68.6482,16.0471 68.6683,16.0395 68.6749,16.0336 68.6758,16.0153 68.6737,16.0048 68.6793,15.9919 68.6781,15.9573 68.665,15.9454 68.6614,15.8915 68.6445,15.9042 68.6402,15.8976 68.637,15.8782 68.6385,15.8643 68.6366,15.8378 68.6284,15.8245 68.6265,15.8076 68.6201,15.8178 68.5968,15.8167 68.586,15.826 68.5801,15.8253 68.5739,15.8234 68.5714,15.8162 68.5625,15.8052 68.5616,15.798 68.5583,15.7884 68.5591,15.7759 68.5547,15.7586 68.5455,15.7474 68.5349,15.7344 68.5365,15.7222 68.5353,15.7176 68.5381,15.7199 68.5407,15.7406 68.5491,15.7476 68.5547,15.7489 68.563,15.7608 68.561,15.8015 68.5697,15.7765 68.6147,15.7592 68.6197,15.7712 68.6239,15.7734 68.6329,15.7748 68.6336,15.7817 68.637,15.8526 68.6545,15.8808 68.6529,15.8927 68.6575,15.8884 68.6612,15.8911 68.6648,15.9149 68.6719,15.9203 68.6811,15.9415 68.6883,15.9557 68.6981,15.9832 68.7097,15.9847 68.7151,15.9887 68.7174,15.9917 68.7192,15.9929 68.7324,16.0011 68.7387,15.9981 68.7617,16.0095 68.779,15.9996 68.7866,15.9926 68.7971,15.9712 68.7968,15.9561 68.8006,15.9474 68.7998,15.9413 68.7908,15.9298 68.7846,15.9261 68.778,15.9207 68.7769,15.8919 68.7737,15.8684 68.7633,15.8423 68.7575,15.8368 68.7545,15.8376 68.7479,15.8016 68.7414,15.7705 68.7395,15.7635 68.7417,15.766 68.7439,15.7789 68.7451,15.7939 68.7501,15.8078 68.752,15.8167 68.7562,15.8236 68.7669,15.8353 68.7701,15.8395 68.7748,15.8485 68.7771,15.8672 68.7819,15.8753 68.7866,15.8931 68.8031,15.9344 68.8666,15.9515 68.8773,15.9638 68.8957,15.9622 68.8989,15.9487 68.9054,15.913 68.9225,15.9098 68.929,15.9203 68.9554,15.9123 68.965,15.9048 68.9686,15.8945 68.9707,15.8637 68.9713,15.7876 68.9566,15.7837 68.9569,15.7759 68.9614,15.7683 68.9614,15.7565 68.9579,15.7458 68.9616,15.7497 68.9696,15.7402 68.9736,15.7223 68.9733,15.7181 68.9665,15.6889 68.9656,15.6722 68.9619,15.6332 68.9578,15.6285 68.9544,15.6313 68.9518,15.6446 68.9521,15.6308 68.9409,15.6073 68.9285,15.6073 68.9184,15.6036 68.9141,15.6051 68.9121,15.6068 68.9098,15.6008 68.9027,15.6061 68.896,15.6173 68.8907,15.6037 68.8876,15.5883 68.8919,15.5782 68.8917,15.5701 68.8888,15.548 68.8624,15.5495 68.8597,15.595 68.8425,15.6284 68.8335,15.6412 68.8333,15.6602 68.8295,15.6577 68.8271,15.6753 68.8195,15.653 68.8177,15.6203 68.8228,15.6072 68.8221,15.5854 68.8267,15.5746 68.8267,15.5697 68.8281,15.5548 68.8268,15.5405 68.8221,15.5419 68.8076,15.5387 68.8057,15.5348 68.8057,15.5127 68.8195,15.4911 68.8175,15.4637 68.8196,15.4581 68.8152,15.4616 68.8133,15.4681 68.8099,15.4644 68.7936,15.4788 68.7882,15.4793 68.783,15.477 68.7801,15.4635 68.7747,15.4588 68.758,15.4628 68.7554,15.4869 68.7513,15.5007 68.7439,15.5103 68.7415,15.511 68.7372,15.5187 68.735,15.5218 68.7312,15.5275 68.7312,15.5371 68.7369,15.556 68.7393,15.5837 68.7397,15.587 68.7407,15.6115 68.7477,15.6256 68.7492,15.6462 68.7462,15.6576 68.7464,15.6477 68.7393,15.6491 68.733,15.6592 68.7251,15.7033 68.703,15.7012 68.6997,15.6913 68.7009,15.6529 68.7168,15.6347 68.7336,15.6298 68.7381,15.6211 68.7394,15.5636 68.7311,15.5515 68.7273,15.5168 68.725,15.4954 68.7246,15.4711 68.7274,15.4572 68.7312,15.4507 68.7298,15.4337 68.7158,15.4341 68.7126,15.4402 68.7034,15.468 68.6837,15.4778 68.6767,15.4767 68.6741,15.464 68.6706,15.463 68.6676,15.4892 68.6567,15.4994 68.6486,15.5134 68.6462,15.5638 68.6423,15.5763 68.6387,15.5924 68.6276,15.6228 68.6209,15.6137 68.6179,15.6018 68.6177,15.588 68.6215,15.5839 68.6183,15.5841 68.6117,15.5792 68.6123,15.5749 68.6129,15.5688 68.6163,15.5705 68.6329,15.5604 68.6351,15.5443 68.6342,15.5316 68.6304,15.5112 68.6293,15.4872 68.6292,15.4604 68.6323,15.4289 68.6284,15.4275 68.6267,15.475 68.6083,15.4643 68.6062,15.4546 68.609,15.4439 68.6072,15.442 68.6113,15.4446 68.6127,15.4302 68.6165,15.4138 68.6245,15.401 68.6192,15.389 68.6056,15.381 68.6029,15.355 68.6055,15.3519 68.6037,15.3434 68.5986,15.3202 68.5964,15.303 68.5913,15.3021 68.5883,15.3079 68.5858,15.3257 68.5833,15.3361 68.5745,15.3324 68.5723,15.2897 68.5799,15.2325 68.5816,15.2187 68.5778,15.2022 68.578,15.2009 68.5763,15.2083 68.569,15.2087 68.5621,15.193 68.5536,15.1911 68.5526,15.1883 68.544,15.1757 68.5402,15.1725 68.5366,15.1808 68.5326,15.2026 68.5313,15.2417 68.5344,15.2626 68.5318,15.2733 68.5281,15.2768 68.5212,15.2846 68.5164,15.2842 68.512,15.2913 68.5073,15.3078 68.505,15.34 68.508,15.3595 68.504,15.3512 68.4968,15.336 68.5012,15.3346 68.501,15.3191 68.4991,15.3026 68.5016,15.2882 68.5014,15.2799 68.504,15.2553 68.5237,15.2414 68.5219,15.2362 68.5187,15.2267 68.5169,15.2453 68.5081,15.2437 68.5052,15.2197 68.5079,15.2124 68.5034,15.2259 68.4966,15.2342 68.4961,15.2414 68.4932,15.2525 68.4842,15.2867 68.4753,15.2604 68.4675,15.2382 68.4723,15.2197 68.4715,15.2078 68.4678,15.1998 68.4614,15.2027 68.4489,15.1992 68.4462,15.1863 68.4415,15.1763 68.4418,15.1584 68.4315,15.1535 68.4256,15.1408 68.4261,15.1144 68.4059,15.1269 68.4018,15.1226 68.4005,15.1032 68.3943,15.089 68.3863,15.0735 68.373,15.0681 68.3573,15.0476 68.3516,15.0411 68.3448,15.0292 68.3413,15.0102 68.331,15 68.3284,14.9971 68.3276,14.9789 68.3169,14.9906 68.297,14.989 68.2945,14.9784 68.2775)),((15.0123 68.3656,15.0139 68.3538,15.0174 68.3519,15.0263 68.3518,15.0362 68.3596,15.0333 68.3627,15.0395 68.3664,15.037 68.3683,15.0305 68.3692,15.0123 68.3656)),((15.0188 67.6432,15.0249 67.6393,15.0359 67.6407,15.0556 67.6472,15.0631 67.6464,15.0727 67.6408,15.1054 67.6539,15.1193 67.6632,15.1292 67.6677,15.1341 67.6699,15.135 67.6727,15.1142 67.6699,15.0981 67.671,15.068 67.6687,15.0589 67.6648,15.0475 67.6629,15.0406 67.6561,15.0192 67.6476,15.0188 67.6432)),((15.1341 68.4898,15.1343 68.4836,15.1409 68.4807,15.1544 68.4797,15.1688 68.4833,15.1973 68.4843,15.1996 68.487,15.1814 68.4947,15.1726 68.4947,15.1548 68.4898,15.1494 68.491,15.1427 68.4884,15.1341 68.4898)),((15.1381 67.616,15.1524 67.6052,15.1764 67.6056,15.1978 67.6026,15.2085 67.6052,15.2102 67.6092,15.2038 67.6142,15.1952 67.6166,15.1921 67.6208,15.1818 67.6189,15.1461 67.6228,15.1403 67.6202,15.1381 67.616)),((15.1672 68.0196,15.1742 68.0093,15.169 68.0026,15.1888 67.9888,15.1877 67.9846,15.1922 67.9781,15.1899 67.9757,15.1982 67.9729,15.2411 67.973,15.2474 67.9744,15.254 67.971,15.2707 67.9722,15.3118 67.9644,15.3209 67.9645,15.3244 67.9672,15.2935 67.9969,15.2669 68.0033,15.2553 68.009,15.2451 68.018,15.2387 68.0341,15.2255 68.0464,15.2191 68.0454,15.2174 68.0409,15.2215 68.036,15.2175 68.0331,15.1855 68.0236,15.1809 68.0233,15.1711 68.0227,15.1672 68.0196)),((15.2531 68.3076,15.2589 68.3071,15.2923 68.321,15.3009 68.3193,15.3062 68.3202,15.3091 68.3229,15.3054 68.3266,15.3138 68.3277,15.3148 68.3305,15.2912 68.3304,15.2758 68.3258,15.2633 68.3241,15.2612 68.3229,15.2675 68.3208,15.2576 68.3149,15.2531 68.3076)),((15.2904 68.9096,15.2938 68.9069,15.331 68.9104,15.3326 68.9126,15.3233 68.9136,15.2927 68.9122,15.2904 68.9096)),((15.4133 68.9046,15.4134 68.9003,15.4312 68.8907,15.4741 68.8743,15.4955 68.8752,15.5061 68.8839,15.515 68.8884,15.5422 68.9024,15.5626 68.9166,15.5781 68.9319,15.5791 68.9388,15.5841 68.9413,15.5899 68.9533,15.5893 68.9611,15.5957 68.9692,15.5986 68.9881,15.5858 68.9943,15.5627 68.9984,15.5594 69,15.5452 69.0069,15.5484 69.0091,15.6166 68.9999,15.625 68.9959,15.624 68.9887,15.6284 68.9831,15.6208 68.9787,15.6325 68.9679,15.6496 68.9847,15.6614 68.9881,15.6659 68.9837,15.6727 68.9847,15.6752 68.9928,15.687 68.9901,15.7096 68.9956,15.7106 68.9958,15.7225 68.9933,15.7324 68.9965,15.7454 68.9979,15.7689 69.0067,15.7741 69.0106,15.7961 69.0139,15.8243 69.016,15.8343 69.021,15.845 69.0216,15.8552 69.0261,15.8759 69.0297,15.8796 69.0324,15.8756 69.035,15.863 69.0361,15.8591 69.0385,15.8681 69.0427,15.8754 69.0501,15.8896 69.0479,15.8941 69.0541,15.9024 69.0565,15.9101 69.0669,15.9058 69.0706,15.9187 69.0745,15.9321 69.0895,15.9431 69.0937,15.9588 69.097,15.9831 69.1145,16.014 69.123,16.0234 69.1323,16.0616 69.1448,16.0691 69.1453,16.0993 69.1588,16.1051 69.1781,16.1001 69.182,16.0928 69.1827,16.0934 69.185,16.0855 69.1898,16.108 69.2053,16.1116 69.2105,16.1081 69.2159,16.1176 69.2272,16.122 69.2386,16.13 69.2445,16.18 69.2635,16.1836 69.2666,16.1765 69.271,16.1763 69.276,16.1824 69.2817,16.1806 69.2899,16.1653 69.3002,16.1613 69.3014,16.1474 69.3057,16.1403 69.31,16.1326 69.3185,16.1354 69.3243,16.1276 69.3286,16.1176 69.3273,16.105 69.3193,16.0978 69.3174,16.0809 69.3175,16.066 69.3089,16.0407 69.3024,16.0312 69.3014,16.0063 69.3044,15.9859 69.3034,15.984 69.3008,15.9928 69.2956,15.992 69.2917,15.9793 69.2866,15.9682 69.2869,15.955 69.2811,15.9463 69.2777,15.9097 69.2704,15.8792 69.258,15.8699 69.2567,15.8489 69.2593,15.8465 69.2567,15.8554 69.2511,15.8513 69.2475,15.8391 69.2452,15.836 69.2425,15.8411 69.2409,15.8522 69.2427,15.8581 69.2422,15.8656 69.2391,15.8631 69.2346,15.8422 69.2267,15.8437 69.224,15.8557 69.2208,15.8592 69.2094,15.8528 69.2052,15.8421 69.2025,15.8217 69.1972,15.8211 69.1824,15.8151 69.181,15.8106 69.1705,15.7902 69.1612,15.7588 69.1524,15.7586 69.151,15.7364 69.1499,15.7219 69.1507,15.7149 69.1465,15.7026 69.1424,15.6874 69.1438,15.6617 69.1394,15.6693 69.1358,15.6593 69.1328,15.6362 69.1344,15.614 69.1294,15.6085 69.1262,15.593 69.1224,15.6038 69.1189,15.5795 69.1142,15.574 69.1094,15.5645 69.107,15.5641 69.0982,15.5498 69.0905,15.5616 69.0857,15.557 69.0823,15.5271 69.0736,15.5176 69.0708,15.5259 69.0649,15.517 69.0568,15.508 69.0527,15.5005 69.0303,15.4942 69.028,15.4767 69.0266,15.4592 69.0231,15.4603 69.0098,15.455 69.0004,15.4397 68.9963,15.4249 68.9828,15.4342 68.9738,15.4331 68.9673,15.4338 68.9664,15.4406 68.9582,15.4325 68.9514,15.435 68.9419,15.4242 68.9101,15.4133 68.9046)),((15.4153 68.0388,15.431 68.034,15.4605 68.0318,15.4631 68.0333,15.4404 68.0411,15.4275 68.0391,15.4179 68.0406,15.4153 68.0388)),((15.4411 67.9838,15.4525 67.9825,15.4777 67.9824,15.4919 67.984,15.4962 67.986,15.4994 67.9875,15.4809 67.9936,15.4724 67.9955,15.4626 67.9956,15.4415 67.9864,15.4411 67.9838)),((15.4725 68.0109,15.4795 68.0023,15.4885 68.0011,15.5063 68.003,15.5319 67.9964,15.5415 67.9939,15.5626 67.995,15.5974 67.9896,15.6731 67.9924,15.7023 67.9993,15.7623 68.0016,15.781 68.0005,15.8091 67.9946,15.8279 67.993,15.8458 67.9877,15.8589 67.9837,15.8695 67.983,15.8849 67.9845,15.9143 67.9908,15.9235 67.9951,15.9264 67.9979,15.9155 68.0058,15.918 68.0139,15.903 68.0257,15.89 68.0241,15.8819 68.0263,15.8729 68.0319,15.8536 68.0308,15.8158 68.0362,15.8028 68.0345,15.771 68.0364,15.7461 68.0313,15.7163 68.0346,15.6855 68.0409,15.6803 68.0409,15.672 68.0408,15.6597 68.0348,15.6312 68.0357,15.6058 68.0344,15.5716 68.0299,15.555 68.0299,15.5527 68.0254,15.5212 68.0241,15.5036 68.0116,15.4953 68.0087,15.4725 68.0109)),((15.5123 68.0628,15.518 68.0603,15.5351 68.0668,15.5356 68.0691,15.5298 68.0718,15.5147 68.067,15.5123 68.0628)),((15.7441 68.147,15.7563 68.1372,15.7712 68.1387,15.8132 68.1303,15.8176 68.1321,15.8105 68.135,15.824 68.1416,15.8128 68.1441,15.8226 68.1484,15.8181 68.1551,15.814 68.1568,15.8104 68.1582,15.8123 68.1602,15.8293 68.159,15.8329 68.1615,15.8364 68.1641,15.8308 68.1664,15.8226 68.1649,15.8098 68.1686,15.7738 68.1632,15.7725 68.1613,15.78 68.1588,15.7758 68.1564,15.7595 68.1573,15.752 68.1554,15.7441 68.147)),((15.813 68.6334,15.8131 68.6309,15.8191 68.6297,15.8346 68.6329,15.8423 68.6364,15.8437 68.6381,15.8361 68.6403,15.8192 68.6359,15.813 68.6334)),((15.8485 68.4282,15.854 68.4158,15.8595 68.4162,15.8614 68.4184,15.8638 68.4249,15.8605 68.4276,15.8533 68.4289,15.8485 68.4282)),((15.9646 68.8294,15.9717 68.8292,15.9843 68.8336,16.0024 68.8455,16.0143 68.8483,16.0355 68.8624,16.0378 68.8655,16.03 68.8723,16.0198 68.8703,16.0039 68.8619,15.9836 68.8551,15.9759 68.8512,15.9736 68.8355,15.9646 68.8294)),((16.0328 68.1936,16.0386 68.1906,16.0546 68.1908,16.0747 68.1984,16.073 68.2021,16.0328 68.1936)),((16.04 68.3404,16.0406 68.3361,16.0443 68.3342,16.0575 68.3335,16.0714 68.3371,16.0795 68.3351,16.1656 68.3405,16.1717 68.343,16.1733 68.3459,16.1746 68.3482,16.1762 68.351,16.1691 68.3544,16.1399 68.3609,16.1242 68.3591,16.1099 68.3611,16.0935 68.3598,16.0478 68.3458,16.04 68.3404)),((16.0569 68.7771,16.0725 68.7694,16.0802 68.7626,16.0924 68.7598,16.123 68.7569,16.1566 68.7503,16.1686 68.751,16.1721 68.7512,16.1747 68.7533,16.1666 68.7571,16.1426 68.7657,16.1083 68.7724,16.0849 68.7832,16.0741 68.7918,16.0668 68.791,16.0569 68.7771)),((16.0723 68.4161,16.0756 68.4133,16.0848 68.4116,16.1067 68.4115,16.1082 68.4083,16.097 68.4017,16.0996 68.3993,16.1139 68.3994,16.1299 68.3935,16.1231 68.3896,16.1458 68.3882,16.1554 68.3915,16.1711 68.3933,16.1894 68.399,16.1987 68.4058,16.2211 68.4101,16.2307 68.4139,16.2323 68.4142,16.2546 68.4176,16.2462 68.4209,16.2692 68.4255,16.2882 68.4223,16.3164 68.4217,16.3267 68.4228,16.3223 68.4252,16.3264 68.4283,16.3484 68.4232,16.3758 68.4233,16.3916 68.4204,16.4015 68.4205,16.4471 68.4339,16.4588 68.4392,16.4622 68.445,16.4558 68.4503,16.4475 68.4534,16.4419 68.4555,16.4216 68.4589,16.4262 68.4628,16.4367 68.4652,16.4658 68.4686,16.5009 68.4705,16.506 68.4723,16.5053 68.4817,16.4872 68.4911,16.4701 68.4965,16.461 68.5024,16.4455 68.5064,16.4393 68.5105,16.4393 68.5131,16.4567 68.5247,16.4453 68.5323,16.4323 68.537,16.3777 68.5569,16.3674 68.5579,16.3262 68.5571,16.2789 68.5492,16.2474 68.5496,16.2356 68.5471,16.2247 68.5412,16.209 68.5236,16.1851 68.5197,16.1761 68.5129,16.1701 68.5083,16.1764 68.506,16.1752 68.5037,16.1631 68.5023,16.1545 68.4995,16.1522 68.4966,16.1441 68.4834,16.1506 68.4759,16.1399 68.4762,16.1329 68.4745,16.1276 68.4626,16.1196 68.4556,16.1266 68.4529,16.1437 68.4543,16.154 68.451,16.2114 68.4511,16.2384 68.453,16.2407 68.4513,16.2256 68.4476,16.2203 68.4464,16.1443 68.4455,16.1322 68.4421,16.1268 68.4304,16.121 68.4267,16.1085 68.4311,16.0915 68.4231,16.0763 68.4195,16.0723 68.4161)),((16.1479 68.0552,16.1724 68.049,16.1762 68.0508,16.1645 68.0554,16.1509 68.0576,16.1479 68.0552)),((16.169 68.0675,16.1736 68.0642,16.1881 68.0632,16.1933 68.0641,16.2178 68.0577,16.2381 68.0575,16.2452 68.0587,16.2632 68.0558,16.2635 68.0552,16.2675 68.049,16.2921 68.0488,16.3041 68.0454,16.3089 68.0481,16.3178 68.067,16.3166 68.0759,16.3205 68.0772,16.3225 68.0791,16.3159 68.083,16.3033 68.0839,16.2708 68.0992,16.264 68.0994,16.2232 68.0894,16.2112 68.0882,16.2003 68.0809,16.1901 68.0778,16.1781 68.0768,16.1695 68.0726,16.169 68.0675)),((16.2551 68.9637,16.2676 68.9561,16.281 68.9561,16.2935 68.9527,16.3174 68.9494,16.342 68.9416,16.3554 68.9235,16.3804 68.9117,16.3805 68.9069,16.4072 68.9003,16.4166 68.8938,16.4228 68.8928,16.4439 68.8897,16.4627 68.8837,16.4817 68.8842,16.5508 68.8756,16.5861 68.8814,16.6201 68.8922,16.6375 68.896,16.6388 68.8986,16.6337 68.901,16.6234 68.9013,16.617 68.9038,16.6147 68.9074,16.6176 68.9227,16.6271 68.9273,16.6379 68.9325,16.6371 68.9353,16.6267 68.934,16.6222 68.9412,16.6097 68.9472,16.6152 68.9552,16.6097 68.9589,16.6105 68.963,16.5985 68.9672,16.5929 68.9714,16.5862 68.9725,16.5764 68.9708,16.5671 68.9677,16.5619 68.9634,16.561 68.9572,16.5689 68.9469,16.5647 68.9435,16.5485 68.9471,16.5253 68.9548,16.5192 68.9585,16.5036 68.9618,16.4984 68.9663,16.4977 68.9669,16.4883 68.9684,16.4741 68.9622,16.4526 68.9635,16.4239 68.9679,16.4128 68.9781,16.4035 68.9794,16.3882 68.9882,16.3792 68.9904,16.3354 68.9895,16.3181 68.9942,16.3086 68.9936,16.2697 68.9844,16.2603 68.9769,16.2551 68.9637)),((16.3235 68.2011,16.3246 68.1993,16.3419 68.199,16.3674 68.2032,16.376 68.2077,16.3725 68.2091,16.3533 68.2073,16.3235 68.2011)),((16.4315 68.998,16.4369 68.9946,16.4353 68.9913,16.4459 68.9901,16.468 68.9819,16.4855 68.9878,16.5166 68.991,16.53 68.9887,16.5407 68.9893,16.553 68.984,16.5622 68.9832,16.5693 68.9852,16.5706 68.9896,16.5657 68.9982,16.5692 69.0018,16.5714 69.0057,16.5684 69.0072,16.559 69.0064,16.5452 69.0007,16.5383 69.0002,16.5285 69.0033,16.5462 69.0205,16.5404 69.023,16.5535 69.029,16.5531 69.0326,16.5427 69.0378,16.5121 69.0418,16.4931 69.0248,16.4664 69.0197,16.4508 69.0065,16.4359 69.0017,16.4332 69.0009,16.4315 68.998)),((16.4691 69.049,16.4737 69.0461,16.4721 69.0426,16.4782 69.0417,16.5059 69.048,16.5077 69.0508,16.5017 69.0538,16.4734 69.0521,16.4691 69.049)),((16.4861 69.0845,16.4935 69.0813,16.4968 69.0784,16.4957 69.0733,16.5156 69.0731,16.5182 69.0755,16.5075 69.0792,16.5058 69.0831,16.5036 69.0862,16.4905 69.0871,16.4861 69.0845)),((16.507 69.0604,16.5313 69.0537,16.5378 69.0601,16.5401 69.0636,16.5364 69.0653,16.5304 69.066,16.5238 69.0644,16.5195 69.0684,16.515 69.0685,16.507 69.0604)),((16.6266 68.7199,16.6322 68.7178,16.6444 68.7242,16.6571 68.7237,16.6665 68.7286,16.6689 68.7317,16.6553 68.7422,16.6503 68.7421,16.6412 68.736,16.6288 68.7326,16.634 68.725,16.6266 68.7199)),((16.639 68.9567,16.6445 68.953,16.6405 68.9464,16.6557 68.9446,16.6597 68.9416,16.6565 68.9346,16.6657 68.931,16.6762 68.9323,16.7296 68.95,16.753 68.9578,16.7557 68.9595,16.7488 68.9616,16.7352 68.9623,16.7303 68.9685,16.7134 68.9673,16.7068 68.9728,16.684 68.9745,16.6772 68.9738,16.6708 68.9665,16.6488 68.9632,16.639 68.9567)),((16.6649 68.8628,16.6751 68.8604,16.7261 68.8766,16.7267 68.8789,16.7041 68.8802,16.6824 68.8783,16.6738 68.8746,16.6649 68.8628)),((16.6685 68.885,16.6757 68.882,16.6865 68.8819,16.6979 68.8844,16.71 68.894,16.7135 68.8977,16.7103 68.8999,16.6738 68.8987,16.6685 68.885)),((16.7718 69.1014,16.7786 69.0952,16.7752 69.0781,16.7742 69.073,16.7795 69.0702,16.7989 69.0695,16.7828 69.06,16.7921 69.0564,16.8235 69.054,16.8599 69.0571,16.8931 69.0572,16.9028 69.0619,16.9162 69.0621,16.9362 69.0667,16.9583 69.0779,16.997 69.0797,17.0145 69.074,17.0205 69.0741,17.0356 69.0742,17.0732 69.0777,17.1034 69.0826,17.1367 69.0852,17.1536 69.0844,17.152 69.0804,17.1395 69.0791,17.1308 69.0757,17.1242 69.0686,17.1174 69.0702,17.1069 69.0687,17.0968 69.0704,17.0782 69.063,17.0708 69.0618,17.0584 69.0628,17.0534 69.0597,17.0322 69.0572,17.0237 69.0528,17.0299 69.0514,17.0355 69.0442,17.0166 69.0379,17.019 69.0361,17.0407 69.0363,17.0458 69.034,17.0282 69.0148,17.033 69.0113,17.0436 69.0096,17.0978 69.0102,17.1191 69.0145,17.1352 69.0143,17.1441 69.0171,17.1527 69.0179,17.166 69.019,17.1838 69.0246,17.1964 69.0252,17.2077 69.0237,17.2198 69.0264,17.2261 69.0374,17.223 69.0473,17.211 69.0573,17.2031 69.0605,17.1983 69.0592,17.1898 69.0468,17.1831 69.0456,17.1729 69.0531,17.1737 69.0577,17.1969 69.0782,17.1959 69.082,17.1836 69.085,17.182 69.089,17.2004 69.0898,17.2437 69.0991,17.2623 69.1068,17.2837 69.1191,17.3126 69.1248,17.3194 69.1285,17.3202 69.1384,17.3284 69.1416,17.3487 69.1429,17.3964 69.1615,17.401 69.1664,17.3962 69.1702,17.4078 69.1728,17.415 69.1779,17.4266 69.1807,17.4421 69.1965,17.463 69.2063,17.4793 69.2084,17.4889 69.2114,17.5036 69.2066,17.5284 69.2055,17.5319 69.1985,17.4964 69.1876,17.4879 69.1828,17.4945 69.1795,17.505 69.1784,17.5265 69.18,17.5178 69.1703,17.5172 69.1648,17.5125 69.1658,17.5109 69.1697,17.4937 69.1744,17.4857 69.1728,17.464 69.1637,17.4701 69.1628,17.4887 69.1656,17.4873 69.1633,17.475 69.1583,17.472 69.1543,17.4778 69.1518,17.4924 69.1524,17.5339 69.1623,17.5402 69.163,17.5602 69.1597,17.5756 69.1599,17.6 69.1656,17.6022 69.1597,17.6053 69.1509,17.6101 69.1496,17.6233 69.1509,17.6852 69.1644,17.7163 69.1693,17.7298 69.1693,17.7552 69.1652,17.7841 69.1653,17.816 69.1604,17.8427 69.1618,17.8799 69.1683,17.903 69.1741,17.919 69.1781,17.9342 69.1764,17.946 69.1781,17.997 69.1928,18.0064 69.1969,17.971 69.206,17.9375 69.1999,17.9311 69.2057,17.9193 69.2097,17.9189 69.2177,17.9124 69.221,17.8964 69.2203,17.8738 69.2236,17.8614 69.2329,17.8825 69.2329,17.8892 69.233,17.9307 69.2377,17.9522 69.2461,17.9607 69.2543,17.9588 69.2575,17.9434 69.263,17.9474 69.2684,17.9418 69.2763,17.9333 69.2799,17.9176 69.2809,17.9001 69.2781,17.8959 69.2794,17.8946 69.2826,17.9021 69.2867,17.9236 69.2861,17.9287 69.2894,17.9265 69.2933,17.9061 69.3069,17.8939 69.3093,17.8879 69.3103,17.8777 69.3185,17.8804 69.3211,17.9106 69.319,17.922 69.3202,17.912 69.3247,17.9192 69.3302,17.9196 69.3343,17.9346 69.3432,17.9596 69.3445,17.9663 69.3465,17.9797 69.3473,17.9889 69.3501,18.0338 69.3524,18.0661 69.3562,18.0818 69.3555,18.0908 69.3653,18.0834 69.3695,18.0729 69.3669,18.064 69.3692,18.062 69.382,18.0525 69.3868,18.0605 69.3923,18.0576 69.4029,18.0511 69.406,18.053 69.409,18.0638 69.4102,18.069 69.4133,18.0695 69.4234,18.0796 69.4344,18.077 69.4373,18.0452 69.4429,18.0404 69.4474,18.0249 69.4465,18.0141 69.4424,18.0077 69.4326,18.0015 69.429,17.9944 69.4249,17.9942 69.4102,17.9883 69.4078,17.9708 69.4105,17.9479 69.426,17.9634 69.4298,17.9761 69.4434,17.9927 69.448,18.0051 69.454,18.009 69.4631,18.0175 69.466,18.0173 69.4731,18.0385 69.4778,18.0657 69.4911,18.0635 69.4954,18.0543 69.4988,18.0331 69.5033,18.001 69.5162,17.9764 69.5196,17.9706 69.5205,17.9608 69.5236,17.9411 69.5211,17.9336 69.5106,17.908 69.5021,17.899 69.4922,17.8843 69.485,17.8905 69.4687,17.8835 69.4588,17.8786 69.4571,17.8805 69.4546,17.8694 69.4518,17.8467 69.4512,17.8178 69.461,17.8191 69.464,17.8362 69.4603,17.8424 69.4619,17.8428 69.469,17.8506 69.4747,17.8464 69.4908,17.8528 69.4976,17.8698 69.5034,17.9016 69.5104,17.8996 69.5163,17.9105 69.5205,17.9147 69.5241,17.916 69.5252,17.9067 69.5348,17.915 69.5476,17.9146 69.5526,17.9011 69.5635,17.8899 69.5664,17.8686 69.5828,17.8444 69.5826,17.844 69.5785,17.8587 69.5683,17.8523 69.5647,17.8375 69.5696,17.832 69.5736,17.8115 69.5744,17.81 69.5664,17.8005 69.5609,17.7926 69.5565,17.7909 69.5379,17.7832 69.5343,17.7683 69.5421,17.7517 69.5462,17.7496 69.5524,17.736 69.5575,17.7212 69.5678,17.6986 69.5922,17.6861 69.598,17.6784 69.5974,17.6696 69.593,17.6584 69.5929,17.6309 69.5983,17.6213 69.6001,17.6153 69.5977,17.6435 69.5836,17.6569 69.5569,17.6655 69.551,17.6648 69.5395,17.6726 69.5287,17.6856 69.5231,17.7053 69.52,17.7092 69.5171,17.6987 69.5145,17.6804 69.5143,17.6594 69.5178,17.6486 69.5164,17.6526 69.5127,17.6784 69.4888,17.6763 69.4867,17.6659 69.4864,17.6482 69.4925,17.6185 69.5164,17.62 69.5268,17.6152 69.536,17.5927 69.5457,17.5879 69.558,17.5686 69.571,17.5661 69.5727,17.543 69.5787,17.5191 69.5911,17.4998 69.5978,17.4964 69.6039,17.485 69.6075,17.4735 69.6035,17.4711 69.5995,17.4794 69.5899,17.4788 69.5839,17.4617 69.5759,17.4592 69.5726,17.4836 69.5529,17.4839 69.5463,17.4926 69.5399,17.5011 69.5385,17.5191 69.5356,17.536 69.5308,17.5571 69.5218,17.604 69.4943,17.6215 69.4865,17.6521 69.4754,17.6681 69.4738,17.6758 69.4715,17.6709 69.4705,17.6507 69.4729,17.6093 69.466,17.5954 69.461,17.586 69.4649,17.571 69.4679,17.5505 69.4774,17.553 69.4892,17.5488 69.4929,17.5344 69.4987,17.5157 69.503,17.5014 69.5028,17.492 69.5009,17.4843 69.5062,17.4851 69.511,17.4809 69.5148,17.4737 69.5174,17.4452 69.5191,17.4246 69.526,17.4068 69.5266,17.3796 69.5361,17.3681 69.5353,17.3577 69.5346,17.3326 69.5407,17.3179 69.5419,17.307 69.5411,17.3019 69.538,17.324 69.5224,17.3587 69.5035,17.387 69.4921,17.3973 69.4844,17.391 69.4808,17.3763 69.4824,17.35 69.4913,17.3316 69.4942,17.329 69.4889,17.3224 69.4756,17.3407 69.4651,17.3382 69.4621,17.3266 69.4587,17.318 69.467,17.3012 69.4717,17.2864 69.4869,17.2503 69.4979,17.2324 69.5093,17.1961 69.5027,17.1949 69.4999,17.2078 69.4927,17.2081 69.4892,17.2087 69.4813,17.2221 69.4746,17.2208 69.467,17.2352 69.464,17.2415 69.4573,17.2513 69.4546,17.2619 69.4536,17.2844 69.4472,17.3402 69.4429,17.3641 69.4358,17.372 69.4353,17.4481 69.4444,17.4622 69.4376,17.4665 69.4356,17.4849 69.4322,17.4851 69.4286,17.4576 69.4316,17.4281 69.4324,17.4163 69.4302,17.4074 69.4238,17.377 69.4229,17.3344 69.4186,17.3126 69.4278,17.2893 69.4271,17.2874 69.4243,17.2935 69.4206,17.3175 69.4131,17.3188 69.4104,17.3159 69.4089,17.305 69.4084,17.2898 69.4116,17.2851 69.4126,17.2791 69.4103,17.2872 69.4069,17.3147 69.4034,17.3416 69.3971,17.3807 69.3966,17.4037 69.3904,17.4018 69.3739,17.3959 69.3716,17.4016 69.3695,17.3938 69.3668,17.3864 69.3679,17.3395 69.3842,17.3213 69.3949,17.2982 69.4017,17.2709 69.4066,17.25 69.4177,17.2356 69.4177,17.2287 69.4196,17.2133 69.4184,17.2031 69.4204,17.1981 69.4188,17.1946 69.4176,17.1819 69.4165,17.1625 69.421,17.1561 69.4183,17.1439 69.4174,17.1379 69.4154,17.1362 69.4117,17.1222 69.4053,17.1188 69.3983,17.1136 69.3984,17.1053 69.3951,17.1018 69.3882,17.0937 69.387,17.0824 69.3928,17.0712 69.3959,17.058 69.407,17.0403 69.4073,17.0324 69.4052,17.0168 69.4052,17.0016 69.3983,16.985 69.3971,16.9713 69.3999,16.9621 69.4043,16.952 69.4091,16.9308 69.408,16.9276 69.4051,16.9344 69.3991,16.9209 69.3982,16.9133 69.3952,16.9126 69.3904,16.9253 69.3865,16.9199 69.3849,16.908 69.3756,16.8932 69.3802,16.8803 69.3795,16.8603 69.3814,16.8574 69.3778,16.8705 69.37,16.8923 69.3661,16.9354 69.3678,16.9769 69.367,17.0181 69.3748,17.0358 69.3742,17.1072 69.3645,17.1786 69.3596,17.1826 69.3567,17.1794 69.3539,17.1619 69.3538,17.0599 69.3652,17.0562 69.3656,17.023 69.366,17.014 69.3604,17.0406 69.348,17.0607 69.3431,17.0724 69.3379,17.0849 69.3372,17.1005 69.3397,17.1214 69.347,17.1451 69.343,17.1416 69.3415,17.1311 69.3418,17.1236 69.3384,17.0919 69.3303,17.0972 69.3222,17.1085 69.3184,17.1237 69.3148,17.1264 69.3148,17.1451 69.3145,17.1474 69.3132,17.1293 69.3106,17.1159 69.312,17.0923 69.3184,17.0663 69.3286,17.0297 69.3348,16.9918 69.331,16.9749 69.331,16.9532 69.3248,16.9081 69.3235,16.8971 69.3209,16.892 69.3154,16.9091 69.3064,16.9116 69.3051,16.9342 69.3005,16.9516 69.3009,16.9935 69.3091,17.0069 69.31,17.0127 69.3079,17.0058 69.3044,16.983 69.2996,16.9701 69.2946,16.949 69.2909,16.9448 69.2871,16.9542 69.281,16.962 69.2808,17.0024 69.2871,17.0165 69.2878,17.0338 69.2835,17.0604 69.2832,17.0641 69.2815,17.0602 69.2806,17.0561 69.2797,17.0255 69.2805,17.0144 69.2786,17.0099 69.2759,17.0488 69.2652,17.0548 69.2647,17.0724 69.2692,17.1044 69.2835,17.1226 69.2882,17.1491 69.2885,17.1623 69.2901,17.1671 69.2891,17.1415 69.2826,17.113 69.27,17.1028 69.2624,17.0988 69.2594,17.0984 69.2558,17.1107 69.2481,17.1462 69.2534,17.1455 69.2513,17.1244 69.2424,17.114 69.2324,17.089 69.2319,17.0712 69.2334,17.0101 69.2475,16.9982 69.2482,16.974 69.247,16.9268 69.2415,16.92 69.2407,16.9017 69.2417,16.8786 69.2361,16.8729 69.2284,16.8787 69.2258,16.9143 69.2205,16.9296 69.2164,16.9335 69.2138,16.9245 69.211,16.8848 69.2125,16.8831 69.2064,16.8796 69.2052,16.8905 69.2028,16.9386 69.2041,16.9785 69.1944,16.9972 69.1941,17.0497 69.1932,17.0748 69.1858,17.092 69.1866,17.1966 69.2043,17.2065 69.2007,17.191 69.1954,17.1519 69.1868,17.1377 69.1845,17.1176 69.1848,17.1074 69.1798,17.1067 69.1795,17.0878 69.1752,17.0574 69.1746,17.0643 69.1689,17.0493 69.157,17.0614 69.1523,17.075 69.1518,17.0767 69.1455,17.059 69.1465,17.0507 69.1414,17.0382 69.1422,17.0242 69.1392,17.0139 69.1416,16.991 69.1533,16.9744 69.1479,16.9794 69.1435,16.9732 69.1424,16.9554 69.1441,16.9191 69.1427,16.9061 69.1407,16.8984 69.1374,16.8951 69.136,16.8925 69.1313,16.9072 69.1217,16.9108 69.1129,16.9066 69.109,16.8867 69.1139,16.8431 69.1212,16.8159 69.129,16.8066 69.1278,16.793 69.1207,16.7841 69.1084,16.7718 69.1014)),((16.8234 68.728,16.8268 68.7268,16.8572 68.7289,16.8947 68.7281,16.9218 68.7357,16.9442 68.7371,16.9577 68.7412,16.9861 68.744,17.0457 68.748,17.067 68.7464,17.082 68.7471,17.1028 68.7521,17.126 68.7531,17.1292 68.7544,17.1553 68.7648,17.1737 68.7672,17.1801 68.7697,17.181 68.7789,17.177 68.7822,17.1814 68.7877,17.1778 68.7944,17.147 68.7939,17.1131 68.8077,17.1022 68.8083,17.0868 68.8145,17.0867 68.8197,17.078 68.824,17.0712 68.8364,17.0646 68.8424,17.0563 68.8451,17.041 68.8506,17.0431 68.8596,17.04 68.8671,17.032 68.8709,17.0257 68.871,17.0157 68.8677,16.9965 68.8558,16.9812 68.8507,16.9615 68.8401,16.9516 68.8348,16.9437 68.8286,16.9387 68.8184,16.9293 68.8155,16.9183 68.8014,16.9194 68.7874,16.9137 68.7824,16.8906 68.7812,16.8615 68.7738,16.8536 68.7577,16.8452 68.7535,16.8403 68.7408,16.8289 68.7342,16.8271 68.7332,16.8234 68.728)),((16.8794 69.0288,16.8817 69.0273,16.8882 69.027,16.9176 69.0346,16.9217 69.0361,16.9026 69.038,16.8847 69.0331,16.886 69.0306,16.8794 69.0288)),((16.9045 68.4798,16.9079 68.4787,16.9453 68.4814,16.9568 68.4854,16.9662 68.4929,16.9688 68.4948,16.9553 68.5014,16.9144 68.4875,16.9045 68.4798)),((17.084 68.9072,17.0976 68.9013,17.1129 68.891,17.1188 68.8832,17.1204 68.8811,17.1274 68.8783,17.1732 68.8367,17.1653 68.8252,17.1742 68.8145,17.1733 68.8078,17.1781 68.8038,17.2003 68.8036,17.2226 68.8004,17.2708 68.8003,17.2799 68.8017,17.2862 68.8037,17.3637 68.8277,17.4226 68.8496,17.447 68.8538,17.4605 68.8588,17.4918 68.8772,17.4846 68.8806,17.4469 68.8882,17.438 68.89,17.4187 68.8961,17.4091 68.902,17.397 68.9156,17.3765 68.9244,17.3701 68.9242,17.3626 68.9265,17.3249 68.9271,17.2999 68.9305,17.265 68.9299,17.247 68.9332,17.2315 68.9341,17.2062 68.9308,17.1987 68.9276,17.1916 68.92,17.1814 68.92,17.1734 68.9213,17.1472 68.9219,17.1226 68.9287,17.1113 68.9253,17.1042 68.9155,17.084 68.9072)),((17.0984 69.4555,17.106 69.4486,17.0999 69.4468,17.1023 69.4453,17.1186 69.4451,17.1289 69.4484,17.0984 69.4555)),((17.3348 69.0003,17.3369 68.997,17.3581 68.9882,17.3725 68.9879,17.4068 68.9956,17.4191 69.0006,17.4313 69.011,17.4339 69.0125,17.4708 69.0333,17.4845 69.0381,17.5032 69.04,17.5208 69.0439,17.5335 69.0528,17.5373 69.0614,17.5532 69.0703,17.5419 69.0805,17.5613 69.088,17.5729 69.0904,17.578 69.0933,17.5751 69.0975,17.5633 69.0988,17.5306 69.0949,17.5121 69.0927,17.5022 69.094,17.4949 69.0924,17.4613 69.0905,17.4219 69.0862,17.4067 69.0827,17.3451 69.0346,17.3431 69.0272,17.3541 69.0158,17.3488 69.01,17.3348 69.0003)),((17.3997 69.1474,17.4135 69.1434,17.4423 69.1441,17.4442 69.1469,17.4363 69.1505,17.4032 69.1489,17.3997 69.1474)),((17.7407 68.9004,17.742 68.8974,17.7609 68.8897,17.7663 68.8908,17.7688 68.8941,17.7552 68.901,17.746 68.9026,17.7407 68.9004)),((17.8092 69.5993,17.8214 69.5946,17.8447 69.5934,17.8472 69.5939,17.8433 69.5966,17.8322 69.5995,17.8289 69.6021,17.8093 69.6018,17.8092 69.5993)),((17.8885 69.6239,17.8917 69.6182,17.9073 69.6159,17.9187 69.6116,17.9241 69.614,17.9276 69.616,17.9137 69.6225,17.9115 69.6268,17.8992 69.6257,17.8957 69.6238,17.8885 69.6239)),((17.9485 69.647,17.9521 69.6393,17.9624 69.6375,17.9699 69.6331,17.9885 69.6381,17.9844 69.6419,18.003 69.6442,17.9971 69.6471,17.9761 69.647,17.9732 69.6483,17.9612 69.6457,17.9485 69.647)),((18.0021 69.636,18.0234 69.6287,18.0402 69.6271,18.0436 69.6295,18.0405 69.6315,18.0272 69.6323,18.0114 69.6385,18.0048 69.6388,18.0021 69.636)),((18.0042 69.5836,18.0085 69.5727,18.0059 69.5665,18.0403 69.5527,18.0723 69.5528,18.0896 69.5578,18.0995 69.5574,18.1602 69.5267,18.2122 69.5204,18.2138 69.5202,18.2469 69.5244,18.2696 69.5255,18.2897 69.5294,18.355 69.5298,18.3931 69.5323,18.4588 69.5444,18.4996 69.5462,18.5194 69.5485,18.5463 69.5484,18.5539 69.55,18.5936 69.558,18.6041 69.5646,18.6244 69.5715,18.6315 69.5721,18.6451 69.5729,18.6719 69.5588,18.6834 69.5568,18.6978 69.5566,18.7196 69.5592,18.7335 69.5583,18.7489 69.5602,18.7844 69.5738,18.8042 69.5841,18.8184 69.5999,18.8401 69.5997,18.8404 69.6054,18.8356 69.6101,18.8276 69.6109,18.8218 69.6177,18.8169 69.6235,18.809 69.6272,18.8116 69.6311,18.8059 69.6338,18.7917 69.6362,18.7763 69.634,18.7702 69.6316,18.7619 69.6335,18.7364 69.633,18.7357 69.6371,18.7564 69.6535,18.7633 69.666,18.7563 69.672,18.7621 69.6802,18.7801 69.679,18.8096 69.683,18.8365 69.6838,18.8478 69.6855,18.8653 69.6881,18.8785 69.6918,18.8894 69.6973,18.9187 69.7027,18.9395 69.7042,18.9588 69.7149,18.9566 69.7279,18.9876 69.7315,19.025 69.7446,19.0259 69.7506,19.0502 69.7673,19.0523 69.7749,19.0331 69.7946,19.0124 69.8075,18.9763 69.8248,18.9623 69.8293,18.9595 69.8302,18.9448 69.8308,18.9244 69.8263,18.9081 69.836,18.8992 69.8381,18.8723 69.8362,18.866 69.8422,18.8489 69.8487,18.8371 69.848,18.8203 69.8418,18.8058 69.8414,18.7951 69.8453,18.8012 69.8487,18.8196 69.8529,18.8251 69.8595,18.8091 69.8781,18.7958 69.882,18.7656 69.8838,18.7483 69.8805,18.7436 69.8804,18.737 69.8802,18.7376 69.8773,18.7572 69.8642,18.7388 69.8599,18.7264 69.8695,18.7028 69.8823,18.693 69.8811,18.6812 69.8733,18.6715 69.872,18.6549 69.8611,18.6533 69.8558,18.6484 69.8534,18.659 69.85,18.6651 69.8423,18.6875 69.8355,18.6806 69.8337,18.6681 69.8332,18.6646 69.8304,18.6685 69.8287,18.6863 69.8206,18.7145 69.8116,18.7317 69.8081,18.7303 69.8007,18.7339 69.7992,18.7787 69.8004,18.7798 69.7981,18.7729 69.7925,18.7798 69.7871,18.7771 69.7839,18.7651 69.7843,18.7533 69.7875,18.7363 69.7862,18.732 69.7845,18.733 69.7827,18.7566 69.7798,18.7616 69.7778,18.7344 69.7747,18.7198 69.7678,18.7188 69.7643,18.7178 69.7611,18.7241 69.7555,18.7097 69.7365,18.7096 69.7156,18.689 69.7054,18.6875 69.6996,18.6993 69.6928,18.7109 69.6903,18.7484 69.6906,18.752 69.6887,18.7459 69.6862,18.7354 69.6858,18.7293 69.6831,18.6951 69.6865,18.6756 69.6862,18.6682 69.6861,18.6546 69.6888,18.6511 69.6933,18.6569 69.712,18.6559 69.7204,18.6456 69.73,18.6487 69.7381,18.6427 69.7455,18.6156 69.7564,18.6275 69.7596,18.6408 69.7592,18.6473 69.7633,18.6346 69.7751,18.6448 69.7842,18.6426 69.7888,18.6482 69.7919,18.6552 69.7957,18.6555 69.8012,18.6492 69.8031,18.6281 69.8061,18.6058 69.8049,18.591 69.8064,18.5794 69.8045,18.5604 69.7966,18.5395 69.7954,18.5289 69.7885,18.5283 69.7778,18.5141 69.7724,18.5152 69.7669,18.501 69.7618,18.5027 69.7564,18.4881 69.743,18.4773 69.7441,18.4701 69.7504,18.4703 69.7511,18.4734 69.7676,18.4591 69.7833,18.4441 69.7822,18.4295 69.776,18.4015 69.7767,18.4099 69.7847,18.3905 69.7959,18.3771 69.7965,18.3623 69.7945,18.3527 69.7893,18.3278 69.785,18.3003 69.7674,18.3017 69.7655,18.3111 69.753,18.311 69.7439,18.3219 69.7357,18.3161 69.7184,18.3205 69.7164,18.3368 69.7141,18.3771 69.7136,18.3919 69.7122,18.4195 69.7126,18.4605 69.7083,18.5294 69.7101,18.5314 69.7099,18.5461 69.7088,18.5669 69.7034,18.5873 69.7034,18.6058 69.6996,18.613 69.6996,18.6164 69.6955,18.6134 69.6907,18.4523 69.6996,18.3781 69.6983,18.3577 69.6949,18.3449 69.69,18.3338 69.6895,18.318 69.6926,18.3056 69.6923,18.2967 69.6971,18.2749 69.7008,18.2742 69.7009,18.2575 69.6984,18.2389 69.7023,18.2263 69.7029,18.197 69.7107,18.188 69.7098,18.177 69.6992,18.2149 69.6752,18.2174 69.6627,18.2223 69.6582,18.2342 69.6548,18.2438 69.64,18.2553 69.6352,18.2628 69.6274,18.2636 69.6267,18.2735 69.6231,18.2898 69.6205,18.3125 69.6217,18.3839 69.636,18.3942 69.6367,18.3991 69.6354,18.3314 69.6123,18.3109 69.6098,18.2976 69.6042,18.2826 69.5876,18.2786 69.5879,18.2771 69.592,18.284 69.6036,18.2632 69.6187,18.2503 69.6207,18.2335 69.6257,18.2268 69.6299,18.21 69.6316,18.2093 69.629,18.2145 69.6257,18.2045 69.6232,18.1896 69.6254,18.163 69.6334,18.1512 69.6333,18.1399 69.6276,18.1208 69.6248,18.0869 69.6143,18.0842 69.6209,18.0799 69.6224,18.059 69.6219,18.0552 69.606,18.0351 69.6045,18.0231 69.6054,18.017 69.6004,18.0235 69.5974,18.0345 69.5981,18.0363 69.5959,18.0196 69.5926,18.0187 69.5924,18.0145 69.5875,18.0042 69.5836)),((18.0503 69.7402,18.0582 69.737,18.0777 69.7325,18.093 69.7319,18.0973 69.7362,18.0891 69.7472,18.0548 69.7438,18.0503 69.7402)),((18.0633 69.6483,18.0704 69.6455,18.0839 69.6454,18.104 69.6452,18.1153 69.6478,18.1313 69.6468,18.1515 69.6539,18.1642 69.6561,18.1702 69.659,18.1691 69.6642,18.1722 69.6682,18.1604 69.6743,18.1294 69.6779,18.1089 69.6845,18.0998 69.684,18.0732 69.6758,18.0739 69.6724,18.0802 69.6709,18.1139 69.67,18.1351 69.6664,18.1226 69.6631,18.0919 69.665,18.0852 69.6626,18.0853 69.6592,18.0929 69.6541,18.0871 69.6507,18.0653 69.6509,18.0633 69.6483)),((18.1162 69.7719,18.1262 69.7653,18.1288 69.7591,18.1525 69.7629,18.1551 69.7662,18.1584 69.7693,18.1547 69.7712,18.1434 69.7714,18.1265 69.7765,18.1207 69.7759,18.1162 69.7719)),((18.1357 69.7014,18.1528 69.6826,18.1629 69.6812,18.1721 69.6844,18.1742 69.6872,18.163 69.6934,18.1561 69.7047,18.1505 69.7059,18.1376 69.7049,18.1357 69.7014)),((18.1551 69.744,18.1603 69.7414,18.1723 69.741,18.179 69.737,18.2203 69.7259,18.2449 69.7281,18.252 69.7319,18.2561 69.7346,18.2403 69.7406,18.2235 69.7612,18.2173 69.7629,18.1964 69.7581,18.179 69.756,18.1612 69.7496,18.1551 69.744)),((18.4085 69.8354,18.4171 69.8317,18.4147 69.8276,18.4222 69.8261,18.4279 69.8274,18.4267 69.8304,18.4182 69.8334,18.4239 69.841,18.4213 69.8478,18.4184 69.8489,18.411 69.8462,18.4085 69.8354)),((18.4409 69.8323,18.4478 69.8242,18.4611 69.8206,18.4849 69.8209,18.5244 69.8255,18.5428 69.8261,18.5441 69.826,18.5652 69.8234,18.5777 69.8242,18.5979 69.8294,18.5986 69.8329,18.5776 69.842,18.5838 69.8442,18.5975 69.8454,18.6005 69.8473,18.5844 69.855,18.5762 69.8562,18.5572 69.8551,18.5365 69.8594,18.5198 69.8599,18.5108 69.8618,18.5043 69.861,18.504 69.8555,18.4993 69.8526,18.4637 69.8481,18.4504 69.8446,18.4409 69.8323)),((18.4788 70.104,18.4822 70.0972,18.4944 70.0998,18.5021 70.0984,18.5144 70.1041,18.518 70.1063,18.5143 70.1083,18.4906 70.1057,18.4838 70.1062,18.4788 70.104)),((18.5002 69.9714,18.5109 69.9675,18.526 69.9687,18.5355 69.9678,18.5385 69.9695,18.5278 69.9731,18.5249 69.9779,18.5029 69.9742,18.5002 69.9714)),((18.5172 70.0415,18.5262 70.0333,18.5248 70.0303,18.55 70.0242,18.569 70.0402,18.5747 70.0419,18.5764 70.0437,18.5684 70.0468,18.5642 70.0515,18.5462 70.0545,18.5383 70.0534,18.5274 70.0546,18.5226 70.0519,18.5259 70.0486,18.5204 70.0459,18.5234 70.044,18.5172 70.0415)),((18.5416 69.8915,18.5569 69.8846,18.5706 69.8856,18.5811 69.8828,18.5843 69.8833,18.5876 69.8839,18.5809 69.8874,18.5667 69.8921,18.5466 69.893,18.5416 69.8915)),((18.6096 69.8411,18.6115 69.8382,18.6243 69.8332,18.6237 69.8261,18.6363 69.8294,18.6393 69.8349,18.6255 69.8412,18.6166 69.8426,18.6096 69.8411)),((18.6343 70.0384,18.6455 70.032,18.649 70.0316,18.6507 70.033,18.6432 70.0445,18.6343 70.0384)),((18.6571 70.0521,18.6627 70.0472,18.6595 70.0394,18.6675 70.0325,18.671 70.0316,18.6752 70.0306,18.7124 70.0359,18.7178 70.0322,18.7117 70.0288,18.6904 70.0279,18.685 70.0248,18.6896 70.0217,18.6832 70.0168,18.6744 70.0139,18.6781 70.0119,18.6691 70.0099,18.6676 70.0071,18.6882 70,18.6977 69.989,18.7167 69.9871,18.7181 69.9905,18.7292 69.9956,18.727 70,18.7316 70.0043,18.7421 70.0055,18.7484 70.0147,18.7595 70.0161,18.7662 70.0268,18.7732 70.029,18.7811 70.0262,18.791 70.0268,18.81 70.0362,18.8222 70.0389,18.8296 70.0427,18.8605 70.0457,18.9191 70.0473,18.9275 70.0527,18.9471 70.0554,18.9495 70.0578,18.9551 70.0633,18.9522 70.0651,18.9637 70.072,18.9866 70.0791,18.9701 70.0893,18.9653 70.086,18.9571 70.0869,18.9461 70.0961,18.9282 70.0985,18.9278 70.0932,18.9235 70.0908,18.914 70.0916,18.9087 70.0951,18.9145 70.1115,18.9111 70.1155,18.9065 70.1152,18.8985 70.1109,18.8872 70.1102,18.8826 70.1021,18.8657 70.0952,18.8652 70.0947,18.8587 70.0893,18.8403 70.0837,18.8362 70.0767,18.8247 70.0737,18.8209 70.0574,18.8016 70.0566,18.7932 70.0699,18.7973 70.0915,18.7855 70.1047,18.788 70.1096,18.7823 70.1113,18.769 70.1106,18.7635 70.1148,18.7507 70.1152,18.7399 70.1199,18.7368 70.1213,18.7246 70.1217,18.7079 70.1177,18.7033 70.1135,18.7072 70.107,18.7224 70.0972,18.7205 70.0935,18.7071 70.0893,18.7111 70.086,18.7277 70.0868,18.7311 70.083,18.7254 70.0776,18.7117 70.0757,18.6823 70.0749,18.6571 70.0521)),((18.6979 69.5488,18.7038 69.5455,18.7111 69.545,18.7314 69.5484,18.7561 69.549,18.7569 69.5522,18.7511 69.5553,18.7306 69.5525,18.7033 69.5517,18.6979 69.5488)),((18.705 69.9278,18.7115 69.9216,18.783 69.9016,18.8259 69.8956,18.871 69.8849,18.8811 69.8807,18.8848 69.8749,18.8928 69.8709,18.91 69.8708,18.9291 69.868,18.9224 69.8644,18.9238 69.8594,18.9242 69.8578,18.9314 69.8546,18.9705 69.8471,18.9983 69.8399,19.01 69.8335,19.0173 69.8254,19.0418 69.8135,19.063 69.7975,19.0758 69.7922,19.1102 69.7881,19.1359 69.7886,19.1538 69.7921,19.1788 69.7933,19.2001 69.7964,19.2505 69.7997,19.2624 69.8038,19.294 69.8092,19.3554 69.8272,19.3635 69.8348,19.3849 69.8549,19.4172 69.8694,19.428 69.8863,19.4441 69.8941,19.472 69.9026,19.4852 69.9124,19.4923 69.9274,19.4792 69.9439,19.4808 69.9469,19.4855 69.9506,19.5207 69.9517,19.5459 69.9557,19.5636 69.9586,19.6114 69.96,19.6372 69.9707,19.6631 69.976,19.6809 69.9776,19.6708 69.9829,19.6785 69.9947,19.6729 70,19.6708 70.0019,19.6349 70.0109,19.6216 70.0194,19.5916 70.0194,19.571 70.0114,19.5694 70.0108,19.5634 70.0061,19.5628 70,19.5624 69.9951,19.5351 69.985,19.5328 69.9873,19.5429 69.9955,19.5423 70,19.5419 70.003,19.5291 70.0263,19.5401 70.0331,19.5469 70.0419,19.5229 70.05,19.5082 70.0504,19.4903 70.0533,19.4746 70.0512,19.4563 70.053,19.4452 70.0461,19.4382 70.0442,19.4176 70.0432,19.413 70.0383,19.404 70.0361,19.4029 70.0296,19.3913 70.0185,19.3884 70.0111,19.3906 70.0013,19.3923 70,19.4011 69.9935,19.3976 69.99,19.3795 69.9908,19.3757 69.9892,19.3617 69.9894,19.3449 69.9985,19.3432 70,19.3341 70.0081,19.3183 70.0151,19.299 70.0189,19.3057 70.0234,19.3043 70.0274,19.294 70.0337,19.2754 70.0374,19.273 70.0399,19.2843 70.044,19.2864 70.0477,19.2792 70.0551,19.288 70.0671,19.3065 70.0773,19.3013 70.0809,19.3073 70.0853,19.303 70.0869,19.2791 70.0812,19.2456 70.0771,19.2182 70.0645,19.2035 70.0642,19.2039 70.0681,19.204 70.069,19.2109 70.0763,19.2254 70.0818,19.2233 70.0909,19.1957 70.0913,19.1721 70.0879,19.1483 70.0778,19.1424 70.0784,19.1456 70.0821,19.1425 70.0846,19.1223 70.0849,19.1023 70.0804,19.0867 70.0737,19.0711 70.0631,19.0568 70.0601,19.0452 70.0772,19.0412 70.0774,19.0299 70.0726,19.0302 70.0552,19.0458 70.0464,19.0826 70.0343,19.0849 70.0319,19.0907 70.0255,19.0884 70.0237,19.0613 70.0218,19.0562 70.0123,19.0454 70.0132,19.0339 70.0336,19.0175 70.0355,19.0041 70.0435,18.9935 70.0431,18.9832 70.0404,18.9561 70.0195,18.9496 70.0182,18.9389 70.0184,18.9406 70.0237,18.9484 70.025,18.9507 70.0271,18.9414 70.0308,18.9254 70.0309,18.8972 70.0311,18.8448 70.0286,18.8314 70.0249,18.8426 70.0224,18.8499 70.0187,18.8418 70.0153,18.8182 70.0128,18.8084 70.0082,18.8071 70,18.8069 69.9981,18.8187 69.9808,18.8392 69.9743,18.8493 69.9663,18.8696 69.9681,18.9013 69.9665,18.8984 69.9639,18.8859 69.9627,18.8715 69.9574,18.8649 69.9534,18.8588 69.9425,18.8515 69.9389,18.813 69.953,18.7575 69.9614,18.7434 69.9618,18.7279 69.9553,18.7136 69.9408,18.7111 69.9382,18.7125 69.9344,18.7063 69.9315,18.705 69.9278)),((18.7772 69.6622,18.7787 69.6572,18.7883 69.6512,18.8021 69.6476,18.812 69.6476,18.8221 69.6499,18.8381 69.6635,18.8393 69.6676,18.8328 69.6709,18.8244 69.6701,18.8047 69.6623,18.7897 69.6618,18.7822 69.6634,18.7772 69.6622)),((18.7831 70.1655,18.7901 70.1492,18.7985 70.1475,18.8138 70.1522,18.856 70.1494,18.867 70.1446,18.8871 70.145,18.8873 70.1456,18.8924 70.1565,18.8875 70.1615,18.8913 70.1629,18.888 70.1665,18.8955 70.1733,18.8873 70.1775,18.8965 70.1829,18.893 70.1872,18.8968 70.1889,18.8996 70.1919,18.8952 70.1941,18.8755 70.1907,18.8759 70.1962,18.8635 70.1939,18.8503 70.1961,18.8339 70.1935,18.8237 70.1867,18.8206 70.1779,18.798 70.1688,18.7885 70.1693,18.7831 70.1655)),((18.7966 70.1324,18.8058 70.1257,18.803 70.1117,18.8186 70.1036,18.8169 70.0868,18.8214 70.0844,18.8293 70.0853,18.855 70.1064,18.8564 70.1101,18.8478 70.1168,18.8504 70.1319,18.8466 70.1343,18.8247 70.1366,18.8015 70.135,18.7966 70.1324)),((18.8448 69.6366,18.8494 69.6287,18.8568 69.6282,18.86 69.6321,18.858 69.636,18.8595 69.639,18.8471 69.6419,18.8448 69.6366)),((18.9049 69.6493,18.9071 69.637,18.9125 69.632,18.9133 69.6312,18.923 69.6284,18.9299 69.6304,18.9786 69.6719,19.0091 69.6864,19.0232 69.6963,19.0244 69.7126,19.0221 69.7146,19.005 69.7142,18.9833 69.7067,18.9724 69.7008,18.9459 69.698,18.9321 69.694,18.9231 69.689,18.9127 69.6881,18.9053 69.6816,18.9081 69.6766,18.9146 69.6735,18.9049 69.6493)),((18.9532 70.1282,18.9621 70.1234,18.9642 70.1154,18.9701 70.1121,18.968 70.1091,18.9823 70.1037,18.9827 70.1014,18.9952 70.0991,19.0056 70.1012,19.0137 70.1009,19.026 70.0956,19.0335 70.0951,19.0344 70.0976,19.0259 70.1002,19.0276 70.1018,19.0375 70.1027,19.0406 70.1041,19.0246 70.1075,19.0166 70.111,19.0057 70.1197,19.0063 70.1245,18.9874 70.1326,18.9586 70.132,18.9532 70.1282)),((18.9534 70.1808,18.9564 70.1756,18.9697 70.1686,18.9725 70.1643,18.9862 70.1664,19.0059 70.1732,19.0293 70.1782,19.0321 70.1817,19.0257 70.1875,19.0017 70.1784,18.996 70.1798,19.0105 70.1938,19.0073 70.1963,18.9956 70.1938,18.9745 70.1952,18.972 70.1901,18.958 70.1896,18.955 70.187,18.9588 70.1846,18.9534 70.1808)),((18.9834 70.1556,19.0365 70.1443,19.094 70.1221,19.1139 70.1117,19.1234 70.1107,19.1428 70.1136,19.1719 70.1178,19.1927 70.118,19.1998 70.1199,19.1955 70.1258,19.1995 70.1298,19.2259 70.133,19.2302 70.1351,19.2283 70.139,19.2353 70.1455,19.2243 70.151,19.2315 70.1564,19.2258 70.1627,19.2598 70.1812,19.2569 70.1868,19.2459 70.1921,19.2443 70.2103,19.2442 70.211,19.2383 70.2144,19.1899 70.2215,19.1923 70.2231,19.2084 70.2236,19.229 70.2215,19.2411 70.2217,19.2462 70.2237,19.2415 70.2277,19.2484 70.2354,19.2364 70.2386,19.2019 70.2633,19.196 70.2627,19.1882 70.2566,19.1774 70.2603,19.168 70.2599,19.1638 70.2567,19.1553 70.2549,19.1595 70.2499,19.1519 70.2471,19.1498 70.2434,19.1361 70.2488,19.1274 70.248,19.1263 70.2427,19.1219 70.2408,19.1177 70.2414,19.1145 70.2484,19.0854 70.2449,19.0855 70.2403,19.0962 70.2332,19.1175 70.2246,19.1222 70.2227,19.1159 70.2201,19.1053 70.2188,19.0966 70.2147,19.0981 70.2095,19.1058 70.2083,19.119 70.2099,19.1434 70.2092,19.1579 70.2069,19.1616 70.205,19.1596 70.2006,19.1185 70.2007,19.1053 70.1986,19.0946 70.1946,19.0914 70.1895,19.1103 70.1772,19.105 70.1605,19.1074 70.1546,19.0973 70.1541,19.0888 70.157,19.0864 70.1606,19.0806 70.1694,19.0734 70.1722,19.0489 70.174,19.0422 70.1695,19.0317 70.1682,19.0223 70.1641,19.0111 70.163,19.0023 70.1594,18.9904 70.1582,18.9834 70.1556)),((19.3359 70.1295,19.3406 70.125,19.3665 70.1145,19.3984 70.1118,19.4249 70.105,19.476 70.1002,19.4966 70.0966,19.5099 70.0975,19.5266 70.1026,19.5387 70.1021,19.5541 70.098,19.5654 70.0985,19.5766 70.1046,19.5836 70.112,19.5858 70.1152,19.577 70.1201,19.5572 70.123,19.5377 70.1323,19.473 70.1467,19.4546 70.1578,19.431 70.1666,19.4185 70.1691,19.4025 70.1684,19.3878 70.1633,19.3679 70.1614,19.343 70.1408,19.3393 70.1378,19.3359 70.1295)),((19.3414 70.0644,19.3439 70.0613,19.3622 70.0557,19.3689 70.0553,19.3819 70.0581,19.3839 70.0622,19.3975 70.065,19.3849 70.0732,19.3811 70.0805,19.3693 70.083,19.3613 70.0831,19.3556 70.0807,19.3595 70.0769,19.3556 70.072,19.361 70.0675,19.3547 70.0649,19.3414 70.0644)),((19.4088 69.8418,19.4108 69.84,19.4142 69.8367,19.4296 69.8358,19.4592 69.837,19.4868 69.8432,19.5421 69.8457,19.551 69.8484,19.6071 69.8498,19.6435 69.8545,19.6641 69.8541,19.6899 69.8502,19.7265 69.8535,19.7382 69.8617,19.7514 69.8709,19.7624 69.8877,19.7731 69.897,19.7866 69.9198,19.8042 69.9327,19.8619 69.9596,19.8873 69.9743,19.8879 69.9746,19.8895 69.9781,19.8836 69.9823,19.8645 69.9852,19.8437 69.997,19.8338 70,19.8263 70.0023,19.8006 70.0046,19.7807 70.0091,19.7748 70.0083,19.7577 70,19.7447 69.9937,19.729 69.9765,19.6946 69.9653,19.6817 69.9573,19.6633 69.9536,19.6584 69.9526,19.6191 69.9384,19.6113 69.9374,19.5903 69.9355,19.5736 69.9308,19.5462 69.9274,19.5309 69.9224,19.5099 69.9119,19.4355 69.8624,19.42 69.8558,19.4088 69.8418)),((19.5045 70.2378,19.5068 70.2314,19.5142 70.2263,19.5226 70.2205,19.5457 70.2147,19.5829 70.2098,19.5962 70.2064,19.6079 70.1995,19.614 70.1902,19.6547 70.1737,19.6631 70.162,19.6593 70.1553,19.6486 70.1549,19.6478 70.1514,19.6622 70.1444,19.6672 70.1376,19.6833 70.133,19.6901 70.1323,19.6949 70.1318,19.6982 70.1276,19.6963 70.1218,19.7071 70.1163,19.7102 70.1038,19.7004 70.102,19.6842 70.1027,19.6792 70.1001,19.6879 70.0952,19.7017 70.0924,19.7077 70.0877,19.7011 70.0723,19.7079 70.0669,19.7352 70.0587,19.7522 70.0566,19.7816 70.0564,19.7966 70.0546,19.8264 70.0543,19.8529 70.0541,19.8848 70.05,19.9113 70.0524,19.9408 70.0522,19.9646 70.0539,20 70.0676,19.9833 70.0701,19.981 70.0726,20 70.0806,20.0103 70.0849,20.0567 70.0887,20.1002 70.0974,20.1156 70.1005,20.1181 70.1019,20.1143 70.106,20.1038 70.1093,20.0885 70.1081,20.0763 70.1094,20.073 70.1143,20.0528 70.1205,20.0296 70.1188,20.0225 70.1214,20.0122 70.1181,20 70.1223,19.9869 70.1268,19.9667 70.1279,19.9691 70.1298,19.9945 70.1311,19.9852 70.1353,19.9957 70.1372,19.9871 70.1417,19.993 70.1482,19.9848 70.1544,19.9745 70.1564,19.9582 70.152,19.9632 70.1474,19.9697 70.1414,19.9642 70.137,19.9521 70.1369,19.9445 70.1386,19.9337 70.1446,19.9133 70.1509,19.9142 70.1596,19.905 70.1636,19.8893 70.1652,19.8893 70.1752,19.8952 70.1769,19.9147 70.1772,19.9201 70.1819,19.9084 70.189,19.9097 70.1947,19.9047 70.1969,19.8759 70.2006,19.8557 70.2008,19.8396 70.2051,19.8313 70.2106,19.8285 70.2125,19.8233 70.2113,19.8198 70.2073,19.8227 70.201,19.8163 70.1931,19.8167 70.1801,19.8129 70.1787,19.8021 70.1835,19.7977 70.181,19.8017 70.1767,19.7911 70.1703,19.7903 70.166,19.7944 70.1608,19.7859 70.1588,19.7664 70.1592,19.75 70.1661,19.7428 70.1744,19.7426 70.2038,19.7426 70.205,19.7336 70.2163,19.7148 70.2258,19.7189 70.2302,19.7097 70.2331,19.6746 70.2378,19.6772 70.2291,19.6724 70.2252,19.6635 70.2259,19.6538 70.2422,19.6604 70.2481,19.6609 70.2583,19.651 70.2662,19.6523 70.2717,19.6382 70.2804,19.6402 70.2852,19.6363 70.2859,19.6235 70.2881,19.611 70.2861,19.5933 70.2867,19.5849 70.2841,19.5718 70.2766,19.5709 70.2688,19.5556 70.2621,19.5541 70.2589,19.5696 70.2546,19.5694 70.2512,19.5862 70.2471,19.5881 70.2437,19.5855 70.2425,19.5726 70.2432,19.5249 70.2555,19.5045 70.2378)),((19.7033 70.2455,19.7085 70.2415,19.7303 70.2359,19.7336 70.2264,19.7593 70.2311,19.7569 70.2333,19.7735 70.25,19.768 70.2561,19.7711 70.2578,19.7748 70.2606,19.7683 70.2637,19.7512 70.265,19.727 70.2644,19.7225 70.2623,19.7202 70.2547,19.7046 70.2501,19.7033 70.2455)),((19.7525 70.2998,19.7642 70.2938,19.7726 70.2918,19.7779 70.2924,19.7821 70.2961,19.7701 70.3,19.7549 70.3021,19.7525 70.2998)),((19.8553 70.0203,19.86 70.0096,19.8936 70.003,19.899 70,19.9101 69.9937,19.9196 69.9924,19.9552 69.9962,19.9739 69.9955,19.9763 69.9983,19.974 70,19.9704 70.0028,19.9737 70.0081,19.9653 70.0114,19.941 70.0081,19.9045 70.0164,19.8953 70.0209,19.8785 70.0218,19.8553 70.0203)),((19.9369 70.1663,19.948 70.1635,19.9582 70.163,19.9708 70.1586,19.9903 70.1591,20 70.1575,20.0006 70.1574,20.0308 70.1469,20.0389 70.1468,20.0446 70.1546,20.0524 70.1572,20.0561 70.16,20.0507 70.1654,20.0337 70.1723,20.0202 70.1725,20.0077 70.176,20 70.1768,19.9954 70.1772,19.9851 70.1839,19.9745 70.1829,19.9531 70.1764,19.9472 70.1699,19.9373 70.1686,19.9369 70.1663)),((20.1515 70.1661,20.1594 70.1562,20.1688 70.1558,20.1726 70.1577,20.1623 70.1653,20.1629 70.1717,20.1569 70.1712,20.1515 70.1661)),((20.1632 70.2953,20.1787 70.29,20.1886 70.2806,20.1866 70.2652,20.1865 70.2641,20.203 70.2211,20.2085 70.2194,20.2166 70.2199,20.2268 70.2308,20.2439 70.2404,20.2793 70.2554,20.2868 70.261,20.2891 70.2645,20.2853 70.2683,20.2692 70.2672,20.2374 70.2794,20.2283 70.2941,20.2063 70.3034,20.1957 70.3131,20.1881 70.3141,20.1754 70.3128,20.1701 70.3114,20.1716 70.3045,20.1632 70.2953)),((20.3472 69.663,20.3543 69.6579,20.3603 69.6568,20.3674 69.658,20.382 69.6628,20.3842 69.6674,20.3868 69.6743,20.3826 69.6763,20.3672 69.6788,20.3561 69.678,20.3518 69.6752,20.3472 69.663)),((20.3604 70.0867,20.3734 70.0711,20.3907 70.0597,20.3948 70.0589,20.4105 70.056,20.4237 70.0509,20.4381 70.0481,20.4668 70.0487,20.4918 70.052,20.4962 70.0552,20.4835 70.0679,20.4866 70.0704,20.5265 70.067,20.5341 70.0709,20.5397 70.0824,20.5325 70.0942,20.5327 70.1052,20.5375 70.1114,20.5469 70.1042,20.5465 70.1036,20.5428 70.098,20.5448 70.0918,20.5701 70.0791,20.5317 70.041,20.5375 70.0363,20.5451 70.0343,20.5757 70.0351,20.6193 70.0404,20.6315 70.046,20.6331 70.0574,20.6407 70.0614,20.6455 70.0607,20.6489 70.0542,20.6512 70.0496,20.6607 70.0479,20.7035 70.0476,20.7265 70.0451,20.7461 70.0499,20.774 70.0525,20.7896 70.0569,20.7972 70.0616,20.7947 70.0675,20.761 70.0861,20.7445 70.1051,20.7505 70.1213,20.7537 70.1301,20.7836 70.1564,20.8073 70.1939,20.8 70.2153,20.7935 70.22,20.7738 70.2219,20.7559 70.226,20.7517 70.2281,20.7564 70.2345,20.7042 70.2392,20.6847 70.2383,20.6655 70.2338,20.6002 70.2334,20.5769 70.2301,20.5453 70.2289,20.5308 70.2255,20.5079 70.2125,20.5117 70.2011,20.5069 70.1949,20.4984 70.1927,20.4693 70.1947,20.4555 70.1911,20.4388 70.19,20.4252 70.1843,20.412 70.1821,20.4104 70.1776,20.4074 70.1688,20.3975 70.1603,20.389 70.1586,20.377 70.1447,20.3788 70.1345,20.3682 70.1199,20.3679 70.0919,20.3604 70.0867)),((20.5138 69.8389,20.5327 69.8019,20.5476 69.7913,20.5584 69.7889,20.5696 69.7888,20.6209 69.7978,20.6499 69.8059,20.6897 69.8116,20.7019 69.8148,20.7059 69.8158,20.7205 69.8226,20.7315 69.8323,20.7289 69.8387,20.7183 69.8466,20.6908 69.8575,20.6845 69.862,20.6953 69.8884,20.739 69.9048,20.7393 69.9089,20.7276 69.9138,20.6915 69.9091,20.6779 69.9044,20.6369 69.9033,20.5852 69.9087,20.58 69.9079,20.5741 69.9003,20.5592 69.896,20.5533 69.8889,20.5579 69.8825,20.5468 69.8742,20.5455 69.8673,20.5235 69.8533,20.5193 69.8506,20.5138 69.8389)),((20.6085 69.9576,20.6215 69.9463,20.6548 69.9391,20.6647 69.9406,20.6719 69.9476,20.6824 69.9577,20.6858 69.9641,20.6814 69.9684,20.6588 69.975,20.6437 69.9938,20.6282 69.9964,20.6169 69.9887,20.6277 69.9795,20.6177 69.9654,20.61 69.9631,20.6085 69.9576)),((20.6637 69.9218,20.672 69.92,20.678 69.9181,20.6962 69.9151,20.702 69.9172,20.6891 69.92,20.672 69.9213,20.6697 69.9224,20.6835 69.9239,20.688 69.9257,20.6832 69.9271,20.67 69.9262,20.6669 69.9239,20.6637 69.9218)),((20.7077 70.0091,20.7151 70.0012,20.7168 70,20.7428 69.9823,20.7483 69.9723,20.7491 69.9709,20.748 69.9613,20.7684 69.9483,20.7781 69.9367,20.7924 69.9325,20.8342 69.9254,20.8469 69.9246,20.8647 69.9263,20.915 69.9371,20.9505 69.9511,20.9623 69.9619,20.9556 69.9651,20.9401 69.9725,20.9487 69.9735,20.9581 69.9726,20.9771 69.976,21.0044 69.9847,21.0442 69.9873,21.0554 69.9902,21.0695 69.9969,21.071 70,21.0713 70.0006,21.0612 70.0014,21.0477 70,21.0394 69.9991,21.0374 70,21.0352 70.0009,21.0409 70.0058,21.0314 70.008,21.0059 70,21.0014 69.9986,20.9915 69.9976,20.9765 70,20.9712 70.0008,20.9679 70,20.9647 69.9992,20.959 69.9943,20.9709 69.9871,20.9619 69.9834,20.9461 69.9808,20.9387 69.9816,20.9025 70,20.9041 70.0055,20.8788 70.013,20.8738 70.0177,20.8629 70.028,20.8525 70.0331,20.8436 70.0353,20.8059 70.0386,20.7929 70.0417,20.7352 70.0295,20.7185 70.0229,20.7086 70.0141,20.7077 70.0091)),((20.7693 70.1136,20.7713 70.1113,20.7916 70.0882,20.8279 70.0703,20.8449 70.068,20.8615 70.0686,20.876 70.0712,20.8884 70.0759,20.9236 70.0952,20.928 70.0996,20.9158 70.109,20.9051 70.1163,20.8914 70.1205,20.8689 70.141,20.8557 70.1462,20.8406 70.1574,20.8332 70.1578,20.8201 70.1536,20.7708 70.1193,20.7693 70.1136)),((20.9167 70.0154,20.9218 70.0098,20.9348 70.0062,20.9408 70.0058,20.9598 70.0101,20.9879 70.0183,20.9969 70.0228,20.998 70.0257,20.9938 70.028,20.9875 70.0282,20.9757 70.0285,20.9709 70.0305,20.9818 70.0368,21.008 70.043,21.0105 70.0455,21.0048 70.0498,21.0079 70.053,20.9898 70.0622,20.9797 70.0628,20.9726 70.0605,20.9597 70.045,20.9208 70.0228,20.9167 70.0154)),((21.1923 70.0451,21.2028 70.0379,21.222 70.0305,21.24 70.0311,21.2701 70.0404,21.2734 70.0409,21.2671 70.0454,21.2673 70.053,21.2544 70.0554,21.2357 70.0557,21.1947 70.0483,21.1923 70.0451)),((21.2813 70.1163,21.2858 70.109,21.2947 70.1064,21.3493 70.1001,21.3567 70.1006,21.3592 70.1029,21.3608 70.1105,21.349 70.1175,21.325 70.1251,21.2915 70.1241,21.289 70.1212,21.2926 70.1182,21.2813 70.1163)),((21.3415 70.3162,21.3417 70.3133,21.3493 70.3108,21.3455 70.3069,21.3511 70.3047,21.3687 70.3034,21.3828 70.3051,21.3875 70.3065,21.3864 70.3138,21.3889 70.3166,21.3738 70.3206,21.3482 70.3181,21.3415 70.3162)),((21.3847 70.3642,21.3851 70.3578,21.3909 70.3524,21.4074 70.3477,21.4028 70.3445,21.3898 70.3355,21.4082 70.3333,21.3976 70.3296,21.4018 70.3283,21.4119 70.329,21.4237 70.3346,21.454 70.338,21.4625 70.3437,21.4672 70.3453,21.4603 70.3478,21.4412 70.3495,21.4376 70.3525,21.4496 70.369,21.4383 70.3757,21.4403 70.3888,21.4366 70.3938,21.4168 70.3959,21.4087 70.3831,21.4146 70.3761,21.3966 70.37,21.3898 70.3697,21.3847 70.3642)),((21.5464 70.0196,21.5599 70.0169,21.5977 70.0136,21.6061 70.0128,21.6204 70.0061,21.6512 70.0039,21.6619 70,21.677 69.9945,21.6857 69.9936,21.7048 69.9978,21.7072 70,21.7093 70.0019,21.7078 70.006,21.7248 70.0141,21.728 70.0171,21.7043 70.025,21.6862 70.0265,21.6679 70.0328,21.6595 70.0403,21.6487 70.0427,21.6387 70.0431,21.6258 70.0481,21.5787 70.041,21.573 70.035,21.5511 70.0324,21.5491 70.031,21.5666 70.0281,21.5643 70.0208,21.5483 70.0212,21.5464 70.0196)),((21.6221 69.928,21.6589 69.9236,21.6797 69.9187,21.7268 69.9184,21.7321 69.9205,21.7292 69.9246,21.733 69.9285,21.7197 69.9451,21.7117 69.9467,21.6777 69.9477,21.647 69.9354,21.6338 69.9331,21.6221 69.928)),((21.6705 70.2871,21.674 70.283,21.6892 70.2769,21.7005 70.2644,21.7127 70.2654,21.7663 70.2914,21.772 70.2996,21.7741 70.3145,21.7965 70.3315,21.8108 70.347,21.814 70.3516,21.809 70.3562,21.7974 70.36,21.7762 70.3638,21.7431 70.3755,21.7389 70.3782,21.7409 70.381,21.7195 70.3893,21.7104 70.3952,21.7035 70.3959,21.6963 70.3908,21.7022 70.379,21.6977 70.3755,21.6808 70.3729,21.6769 70.37,21.6867 70.3629,21.6841 70.3593,21.6918 70.3545,21.6879 70.3421,21.6705 70.2871)),((21.781 69.9269,21.7859 69.9189,21.7967 69.914,21.7997 69.906,21.8284 69.8835,21.8357 69.8831,21.8393 69.8936,21.8445 69.8968,21.8234 69.9109,21.812 69.9133,21.8132 69.9188,21.8064 69.9227,21.7856 69.9272,21.781 69.9269)),((21.9296 70.6453,21.9395 70.6389,21.9691 70.6358,21.9726 70.6338,21.97 70.6283,21.9803 70.6286,22.0014 70.6355,22.0173 70.6323,22.0338 70.6324,22.038 70.631,22.0355 70.6223,22.0213 70.6134,22.0117 70.6138,22.0006 70.617,21.9951 70.6163,21.9908 70.614,21.9789 70.6078,21.9882 70.5966,21.9828 70.595,21.9766 70.5955,21.9753 70.5936,21.998 70.5901,22.0284 70.581,22.0359 70.5851,22.0478 70.5986,22.074 70.5935,22.0825 70.5832,22.0874 70.5819,22.097 70.5826,22.1037 70.586,22.1055 70.5958,22.1349 70.6011,22.1522 70.6068,22.1669 70.6117,22.1718 70.6087,22.1992 70.6122,22.2294 70.6123,22.2542 70.6087,22.2816 70.6076,22.2933 70.6085,22.3022 70.6081,22.3043 70.6065,22.2934 70.6005,22.2914 70.5964,22.2115 70.5812,22.204 70.5773,22.2069 70.5675,22.2192 70.5707,22.2295 70.5705,22.2376 70.568,22.2405 70.5671,22.2549 70.5671,22.2537 70.5601,22.2292 70.5502,22.2155 70.549,22.2026 70.5449,22.1889 70.5442,22.1672 70.5389,22.1652 70.5346,22.1427 70.5293,22.1252 70.521,22.1232 70.5174,22.111 70.5153,22.1103 70.5128,22.1309 70.5085,22.1229 70.5028,22.1161 70.5021,22.1168 70.5,22.1237 70.498,22.1346 70.4973,22.1184 70.4886,22.1043 70.4879,22.0912 70.4872,22.0783 70.4846,22.077 70.4828,22.0872 70.481,22.0975 70.4819,22.1078 70.4779,22.129 70.4761,22.1461 70.472,22.1577 70.4727,22.1712 70.4771,22.1479 70.4848,22.1601 70.4876,22.2065 70.4876,22.2243 70.4836,22.2325 70.4834,22.2434 70.4864,22.2467 70.49,22.2411 70.498,22.2498 70.5076,22.2634 70.515,22.2721 70.5197,22.2652 70.5263,22.2692 70.5304,22.2835 70.5341,22.2959 70.5305,22.2878 70.5225,22.2859 70.5159,22.2833 70.5065,22.2847 70.5015,22.293 70.4962,22.3156 70.4892,22.332 70.4892,22.3653 70.5025,22.3543 70.5066,22.3584 70.5091,22.3816 70.5107,22.3883 70.5192,22.3931 70.5192,22.4062 70.5128,22.4001 70.5016,22.4022 70.498,22.3955 70.4927,22.4057 70.4893,22.4248 70.4886,22.4392 70.4889,22.4412 70.4892,22.4555 70.4918,22.4725 70.5019,22.4554 70.5057,22.452 70.5101,22.4655 70.5272,22.4744 70.5311,22.4785 70.5265,22.4888 70.524,22.4922 70.5208,22.495 70.5103,22.5128 70.5055,22.5196 70.5001,22.5326 70.5046,22.5387 70.5046,22.5429 70.4982,22.5654 70.4989,22.5804 70.5062,22.5858 70.5117,22.5855 70.5126,22.5817 70.5224,22.5865 70.524,22.6091 70.5094,22.6159 70.5103,22.6255 70.5176,22.6145 70.5254,22.6186 70.5272,22.6186 70.5336,22.6084 70.5359,22.6125 70.5407,22.6132 70.5548,22.6385 70.5461,22.6474 70.5452,22.6494 70.5466,22.6399 70.5544,22.6522 70.5594,22.659 70.5575,22.6686 70.5502,22.6776 70.552,22.7056 70.5577,22.7097 70.557,22.6932 70.5488,22.6912 70.5418,22.6802 70.5418,22.6754 70.5386,22.6795 70.5342,22.6911 70.5297,22.6836 70.5238,22.6842 70.5139,22.6883 70.5091,22.6972 70.5069,22.7054 70.5075,22.7129 70.5105,22.7206 70.5374,22.7186 70.5479,22.7234 70.5513,22.7358 70.5537,22.7384 70.5481,22.7459 70.5461,22.7644 70.5463,22.7548 70.5415,22.7451 70.5178,22.7478 70.5148,22.7717 70.5182,22.7875 70.5237,22.7998 70.5234,22.8011 70.5193,22.836 70.5208,22.8319 70.527,22.845 70.5341,22.8484 70.5336,22.8545 70.5254,22.9016 70.5319,22.9148 70.5337,22.9243 70.5339,22.9271 70.536,22.9326 70.5364,22.9292 70.5401,22.9314 70.5455,22.9206 70.5606,22.9118 70.5634,22.8864 70.5623,22.8762 70.5678,22.8831 70.5721,22.8804 70.5764,22.8941 70.5748,22.9127 70.5798,22.9202 70.5766,22.9139 70.5723,22.9187 70.5709,22.927 70.572,22.9324 70.5706,22.9516 70.5706,22.9877 70.5609,23.0001 70.5641,23.0059 70.5679,23.0133 70.5727,22.9965 70.5933,22.9911 70.5954,22.9788 70.5959,22.9727 70.5998,22.9796 70.6045,22.9885 70.6013,22.9974 70.6013,23.0158 70.5976,23.0274 70.593,23.036 70.5791,23.053 70.572,23.0592 70.5717,23.0635 70.5788,23.0746 70.5879,23.0857 70.5924,23.0948 70.6015,23.0938 70.6052,23.0936 70.6061,23.0977 70.609,23.1074 70.611,23.1138 70.6208,23.1118 70.6243,23.0912 70.622,23.0754 70.6251,23.0714 70.6285,23.0556 70.6276,23.0494 70.6295,23.0578 70.6331,23.1443 70.6328,23.1499 70.6369,23.148 70.641,23.1836 70.6594,23.1781 70.6615,23.1685 70.662,23.1405 70.6611,23.1299 70.6607,23.1286 70.6619,23.1314 70.6646,23.1403 70.6652,23.1585 70.6739,23.1578 70.6764,23.1462 70.6771,23.1359 70.6799,23.1387 70.6833,23.1512 70.6869,23.1529 70.6976,23.1598 70.6969,23.1754 70.6873,23.2068 70.6776,23.213 70.6778,23.2166 70.6837,23.2228 70.6848,23.2275 70.6786,23.235 70.6779,23.2488 70.6781,23.2696 70.683,23.2773 70.6869,23.2706 70.6908,23.2603 70.6924,23.2587 70.693,23.2392 70.7005,23.2495 70.7018,23.2681 70.6999,23.2743 70.7013,23.2779 70.7047,23.272 70.7134,23.2749 70.7172,23.2934 70.714,23.3042 70.7071,23.3389 70.7145,23.3219 70.7196,23.3287 70.7369,23.3219 70.741,23.3089 70.7434,23.3096 70.7452,23.3179 70.7456,23.3146 70.749,23.3209 70.7506,23.3256 70.7465,23.342 70.7421,23.3431 70.7409,23.3473 70.7361,23.3555 70.7336,23.3505 70.7288,23.3545 70.7265,23.3742 70.736,23.4021 70.742,23.403 70.7471,23.4093 70.7511,23.398 70.7621,23.4002 70.766,23.4065 70.7667,23.436 70.7617,23.4485 70.7628,23.4549 70.766,23.4516 70.7706,23.4387 70.7752,23.409 70.779,23.3828 70.7798,23.3773 70.7816,23.3858 70.7857,23.3933 70.7864,23.4045 70.7874,23.4095 70.792,23.4321 70.7846,23.4611 70.7833,23.4901 70.7795,23.4991 70.7813,23.5048 70.7854,23.494 70.7911,23.5095 70.797,23.5061 70.7993,23.4633 70.8022,23.4456 70.8101,23.4526 70.8121,23.4643 70.8104,23.4735 70.8136,23.4466 70.8176,23.4412 70.8215,23.4267 70.8222,23.4365 70.8247,23.4404 70.827,23.4479 70.8315,23.4341 70.8336,23.4187 70.8312,23.4 70.8328,23.3784 70.8288,23.3674 70.8323,23.3689 70.8364,23.3837 70.8425,23.3542 70.8511,23.3467 70.8559,23.326 70.8605,23.3208 70.8704,23.3111 70.8709,23.3061 70.8682,23.3079 70.8588,23.2985 70.8461,23.2995 70.8369,23.2913 70.8344,23.2855 70.8326,23.3013 70.8264,23.3031 70.8196,23.3168 70.8143,23.2994 70.8109,23.2937 70.8066,23.2977 70.8018,23.3211 70.7976,23.3256 70.7878,23.2848 70.7907,23.282 70.7877,23.2995 70.7728,23.2939 70.7712,23.2816 70.7759,23.2708 70.7853,23.2468 70.7936,23.2381 70.7944,23.2296 70.7952,23.2216 70.808,23.2053 70.8172,23.1922 70.8198,23.1812 70.8264,23.1743 70.8264,23.1644 70.821,23.1753 70.8105,23.1998 70.7972,23.1914 70.7917,23.1933 70.7867,23.187 70.7833,23.1501 70.8032,23.1371 70.8081,23.1204 70.8103,23.0908 70.8141,23.0687 70.8195,23.0561 70.8154,23.0526 70.8122,23.0581 70.8097,23.0803 70.8094,23.0865 70.8078,23.0877 70.8002,23.1007 70.7959,23.0923 70.7918,23.0524 70.8031,23.0392 70.8029,23.012 70.7911,23.0168 70.7874,23.032 70.7881,23.0382 70.7865,23.045 70.7819,23.0708 70.7735,23.0718 70.7731,23.0834 70.7658,23.0931 70.7637,23.118 70.7646,23.1248 70.7623,23.1213 70.7607,23.1027 70.7616,23.1005 70.7562,23.1039 70.7537,23.1205 70.7538,23.1485 70.743,23.1693 70.7446,23.174 70.7391,23.1809 70.7372,23.1746 70.7359,23.1622 70.7361,23.1512 70.7396,23.1367 70.7401,23.1251 70.7451,23.1175 70.7447,23.1048 70.7347,23.0874 70.7263,23.0928 70.7236,23.09 70.7222,23.0838 70.722,23.0681 70.7275,23.0536 70.7285,23.0418 70.7267,23.0334 70.7208,23.0338 70.7066,23.0254 70.7009,23.0281 70.6977,23.0391 70.6943,23.0418 70.6904,23.0067 70.6939,22.9976 70.6889,22.9846 70.6908,22.9797 70.6871,22.9954 70.6828,23.0008 70.6759,22.9987 70.6723,22.9883 70.6684,22.9662 70.6655,22.9436 70.6692,22.9471 70.6751,22.937 70.6881,22.9281 70.6911,22.9129 70.6909,22.9032 70.6891,22.875 70.6914,22.9055 70.7012,22.9131 70.7071,22.9263 70.7105,22.9361 70.723,22.9327 70.7265,22.921 70.729,22.912 70.7272,22.8886 70.727,22.8747 70.725,22.8623 70.7266,22.854 70.7234,22.8443 70.7232,22.8437 70.728,22.8505 70.7306,22.8687 70.7375,22.859 70.7428,22.8294 70.7511,22.8191 70.7513,22.8107 70.7493,22.81 70.7408,22.8003 70.7376,22.7955 70.7468,22.7838 70.7472,22.7838 70.7511,22.7998 70.7632,22.7985 70.7678,22.795 70.7691,22.7833 70.7687,22.7729 70.7664,22.759 70.766,22.7389 70.7594,22.7126 70.7583,22.6906 70.751,22.6808 70.7478,22.6767 70.7432,22.6863 70.7286,22.7021 70.7234,22.7139 70.7227,22.7243 70.73,22.7381 70.7311,22.7415 70.7293,22.7235 70.7195,22.7249 70.7126,22.7435 70.7094,22.7386 70.7062,22.7255 70.7056,22.7255 70.7031,22.7331 70.7017,22.7441 70.7021,22.7662 70.7062,22.7765 70.7057,22.7765 70.7032,22.7613 70.7016,22.7606 70.6987,22.7744 70.6932,22.7709 70.6911,22.7693 70.6909,22.7489 70.6884,22.7488 70.6855,22.7736 70.6793,22.7866 70.6692,22.792 70.661,22.8016 70.6582,22.8264 70.6582,22.8278 70.6559,22.816 70.6528,22.8009 70.6507,22.7899 70.6514,22.7768 70.6478,22.7685 70.6478,22.7528 70.6556,22.7473 70.6563,22.7369 70.6469,22.7204 70.6394,22.7045 70.6383,22.7066 70.6335,22.7121 70.631,22.7196 70.6305,22.7196 70.6253,22.712 70.6196,22.7189 70.615,22.7141 70.6132,22.7058 70.6139,22.7004 70.6193,22.6908 70.6235,22.6826 70.6522,22.6867 70.6602,22.6778 70.6618,22.6496 70.6522,22.6379 70.6552,22.6124 70.6561,22.6042 70.6536,22.5904 70.6527,22.5891 70.6509,22.5937 70.6488,22.6289 70.6502,22.6255 70.6443,22.5767 70.6399,22.5636 70.6351,22.5616 70.6393,22.567 70.6507,22.5608 70.6548,22.5478 70.6577,22.5663 70.6609,22.5766 70.6691,22.6042 70.6691,22.611 70.6712,22.5973 70.673,22.6028 70.6751,22.6386 70.675,22.6496 70.6803,22.651 70.6835,22.6549 70.6846,22.6627 70.6869,22.6545 70.6885,22.6338 70.683,22.6296 70.6833,22.629 70.6851,22.6427 70.6887,22.6421 70.6924,22.6331 70.6949,22.6248 70.6949,22.6076 70.6908,22.6035 70.6924,22.6028 70.6974,22.6186 70.7002,22.6103 70.7038,22.6021 70.7061,22.5917 70.7061,22.5828 70.6999,22.5745 70.6999,22.5662 70.7031,22.5621 70.7079,22.5476 70.7125,22.5427 70.7193,22.5344 70.7209,22.5165 70.7214,22.5172 70.715,22.5117 70.7109,22.5165 70.7079,22.5103 70.7053,22.5069 70.7038,22.4883 70.7022,22.4787 70.6997,22.4649 70.6999,22.4642 70.6981,22.4815 70.6954,22.4884 70.6881,22.4795 70.6846,22.4912 70.681,22.5098 70.6805,22.5112 70.678,22.4898 70.6778,22.4795 70.6728,22.472 70.6721,22.4657 70.6773,22.4526 70.6773,22.4319 70.6837,22.4278 70.6871,22.4422 70.6887,22.4194 70.6967,22.4098 70.6942,22.4063 70.6955,22.4083 70.7003,22.4013 70.7088,22.3923 70.7195,22.3791 70.7231,22.3647 70.7183,22.3778 70.7151,22.3573 70.7039,22.3492 70.6889,22.3375 70.6857,22.359 70.6766,22.3839 70.6697,22.3674 70.6643,22.3647 70.6604,22.371 70.6526,22.3813 70.6504,22.3863 70.638,22.3932 70.6346,22.3953 70.631,22.3836 70.6296,22.3698 70.6339,22.3623 70.633,22.345 70.6414,22.3029 70.65,22.2476 70.6662,22.2385 70.6748,22.2054 70.6793,22.193 70.6788,22.1938 70.6731,22.1973 70.6713,22.2152 70.6697,22.2242 70.6654,22.2189 70.6577,22.2256 70.6524,22.2349 70.6451,22.2268 70.6403,22.1979 70.6428,22.1738 70.643,22.1417 70.6336,22.1293 70.6326,22.1197 70.6356,22.1243 70.6404,22.1222 70.6429,22.1276 70.6461,22.1214 70.6483,22.0993 70.6515,22.0746 70.6498,22.0656 70.653,22.0456 70.6523,22.0277 70.6536,22.0147 70.6519,21.9904 70.6605,21.9822 70.6672,21.9769 70.6714,21.9599 70.6673,21.9566 70.6625,21.9415 70.6602,21.9348 70.6553,21.9459 70.6526,21.946 70.6501,21.9296 70.6453)),((21.9608 69.8036,21.969 69.7968,21.981 69.7934,21.9968 69.7935,22.0095 69.7894,22.0114 69.7919,22.0073 69.7944,21.9921 69.7975,21.9779 69.8071,21.966 69.808,21.9608 69.8036)),((22.3382 70.3379,22.3417 70.3315,22.3784 70.3206,22.3901 70.3021,22.3955 70.2987,22.4233 70.2946,22.4537 70.2944,22.4594 70.2929,22.4666 70.291,22.472 70.2853,22.516 70.278,22.5525 70.2783,22.5579 70.2746,22.5579 70.2675,22.5714 70.2652,22.6004 70.2634,22.6065 70.2659,22.622 70.265,22.6403 70.2597,22.6639 70.26,22.676 70.2577,22.705 70.2588,22.7408 70.2489,22.7599 70.2497,22.7731 70.2503,22.7961 70.2475,22.8932 70.2501,22.9161 70.2489,22.9565 70.2429,22.9788 70.2453,22.9949 70.2391,23.0154 70.2562,23.0148 70.2601,23.0036 70.2745,22.9985 70.2777,22.9836 70.2871,22.9783 70.2953,22.9669 70.2979,22.9561 70.3034,22.9474 70.3038,22.9222 70.295,22.9121 70.2971,22.9094 70.2994,22.9347 70.3137,22.9538 70.3285,22.9525 70.3321,22.9431 70.336,22.9186 70.3297,22.9165 70.3247,22.9091 70.3222,22.8935 70.322,22.8745 70.3177,22.8738 70.3204,22.8889 70.332,22.8869 70.3348,22.8747 70.3375,22.8653 70.3433,22.8484 70.3417,22.8314 70.3451,22.8225 70.3308,22.8157 70.3283,22.8103 70.3299,22.8029 70.3374,22.7887 70.3438,22.7881 70.3482,22.7766 70.3516,22.7895 70.3584,22.7909 70.3623,22.7788 70.368,22.7972 70.3796,22.7972 70.3833,22.787 70.3855,22.7809 70.3867,22.7735 70.3931,22.7579 70.395,22.7348 70.3916,22.7253 70.3886,22.7286 70.3831,22.7238 70.3692,22.7258 70.3521,22.7054 70.3425,22.7013 70.33,22.6945 70.341,22.7014 70.3549,22.6932 70.3659,22.6906 70.3695,22.6967 70.3804,22.6961 70.3891,22.6791 70.3969,22.6472 70.3958,22.6445 70.3894,22.6587 70.3652,22.6532 70.3583,22.6458 70.3581,22.6383 70.3647,22.6329 70.3841,22.6248 70.3896,22.6091 70.391,22.6022 70.3895,22.5916 70.3856,22.5874 70.3814,22.5834 70.359,22.5759 70.3563,22.5671 70.3647,22.5745 70.381,22.5743 70.3829,22.5738 70.3864,22.5684 70.3883,22.5535 70.3873,22.5399 70.3844,22.5311 70.3778,22.5386 70.3689,22.5366 70.365,22.5217 70.36,22.5142 70.359,22.5101 70.3718,22.504 70.3755,22.4904 70.3759,22.4544 70.372,22.449 70.3679,22.477 70.3435,22.4758 70.3298,22.4506 70.3433,22.4502 70.3437,22.4451 70.3497,22.4376 70.3526,22.422 70.3531,22.4064 70.3585,22.3732 70.356,22.3543 70.3509,22.3428 70.3448,22.3382 70.3379)),((22.8111 70.4132,22.8246 70.4063,22.8409 70.4019,22.8491 70.4004,22.8849 70.3937,22.8903 70.3886,22.8833 70.3736,22.8907 70.3692,22.9373 70.3564,22.9454 70.3509,22.9671 70.3504,22.9632 70.3602,22.966 70.3652,22.9714 70.3659,22.9795 70.3611,22.9827 70.3542,22.9799 70.3465,23.0103 70.3398,23.0176 70.3413,23.0198 70.3418,23.0369 70.3522,23.0623 70.3636,23.0822 70.3777,23.1114 70.4043,23.1168 70.4043,23.1234 70.3963,23.1163 70.3837,23.0963 70.3694,23.0961 70.3598,23.0879 70.3543,23.0851 70.3523,23.0584 70.3405,23.0617 70.3362,23.0494 70.3305,23.0486 70.3271,23.0599 70.3177,23.0531 70.3125,23.0631 70.3063,23.0596 70.3006,23.0736 70.2926,23.085 70.2905,23.0937 70.285,23.1475 70.2761,23.1691 70.2752,23.2071 70.28,23.2162 70.282,23.2533 70.2899,23.2623 70.2965,23.2705 70.2988,23.2772 70.298,23.2956 70.3005,23.344 70.3133,23.3503 70.3194,23.3465 70.3254,23.3346 70.3327,23.3238 70.3346,23.2899 70.3356,23.2833 70.3386,23.2983 70.3429,23.2855 70.3457,23.2869 70.3475,23.3289 70.3448,23.3334 70.3458,23.348 70.3489,23.3725 70.3511,23.3989 70.3512,23.4222 70.3581,23.4136 70.3641,23.4199 70.367,23.443 70.3676,23.458 70.3716,23.474 70.3807,23.4667 70.3846,23.4417 70.3884,23.4278 70.3976,23.4293 70.3994,23.4636 70.3919,23.4882 70.3945,23.5079 70.394,23.5424 70.4077,23.5536 70.4143,23.568 70.4169,23.5854 70.4262,23.6255 70.4381,23.6333 70.444,23.6395 70.459,23.6288 70.4791,23.6151 70.4904,23.6186 70.4929,23.624 70.4922,23.6342 70.491,23.6405 70.4932,23.6234 70.5079,23.6079 70.5112,23.5602 70.5144,23.5494 70.5168,23.5348 70.5269,23.5358 70.5344,23.5508 70.5332,23.5496 70.5362,23.5334 70.5413,23.5466 70.5465,23.5558 70.5533,23.5524 70.5546,23.5357 70.5488,23.5368 70.557,23.5596 70.5605,23.5611 70.5617,23.5645 70.5644,23.562 70.5685,23.5669 70.571,23.5609 70.574,23.5902 70.585,23.5917 70.5875,23.5808 70.5899,23.5872 70.5939,23.5804 70.5963,23.5577 70.5955,23.5439 70.6095,23.5694 70.6253,23.5661 70.6283,23.5286 70.62,23.4928 70.6182,23.4846 70.6193,23.48 70.6223,23.4843 70.6278,23.485 70.6287,23.4797 70.6319,23.4666 70.6324,23.4328 70.6283,23.3916 70.6291,23.3502 70.625,23.3488 70.6227,23.3549 70.6202,23.3876 70.6136,23.3889 70.6116,23.384 70.6093,23.3867 70.6075,23.4039 70.6081,23.4392 70.6155,23.4488 70.6156,23.4534 70.6122,23.4477 70.607,23.4221 70.6009,23.4266 70.5924,23.431 70.584,23.4413 70.5833,23.4675 70.5863,23.475 70.5859,23.4844 70.581,23.4842 70.5762,23.4565 70.5691,23.4557 70.5666,23.4631 70.5635,23.4849 70.5598,23.5022 70.5483,23.5224 70.542,23.5112 70.5361,23.5038 70.5369,23.4792 70.5546,23.4452 70.5611,23.4438 70.5616,23.433 70.5653,23.4172 70.564,23.3931 70.5593,23.3689 70.5528,23.3674 70.5496,23.3851 70.5468,23.3929 70.5358,23.4031 70.5335,23.3899 70.529,23.3796 70.5286,23.375 70.5341,23.3623 70.5396,23.3308 70.54,23.3207 70.5437,23.3113 70.5503,23.2984 70.5533,23.247 70.5526,23.2499 70.5504,23.2738 70.5318,23.2701 70.5251,23.2742 70.5229,23.2878 70.5233,23.3099 70.5284,23.3146 70.5259,23.2855 70.516,23.2806 70.5103,23.2825 70.505,23.2755 70.4993,23.2801 70.4941,23.2696 70.4861,23.2707 70.4786,23.2638 70.4747,23.2323 70.4721,23.2269 70.4731,23.2298 70.4781,23.2353 70.4815,23.2423 70.4858,23.2459 70.494,23.2465 70.5136,23.2399 70.5214,23.2071 70.543,23.2072 70.5468,23.1888 70.5526,23.1731 70.5529,23.1518 70.5507,23.1533 70.5543,23.1492 70.5555,23.1293 70.5537,23.1141 70.5492,23.1126 70.5428,23.1289 70.538,23.1314 70.5355,23.1376 70.5293,23.1519 70.5258,23.2031 70.5243,23.2154 70.5224,23.2112 70.521,23.1558 70.5203,23.1476 70.5176,23.1563 70.513,23.145 70.4957,23.1409 70.4964,23.1337 70.5085,23.1214 70.5111,23.0936 70.521,23.0745 70.5196,23.0626 70.5164,23.0539 70.514,23.0079 70.505,22.9838 70.4955,22.9769 70.4898,22.989 70.4783,22.9842 70.4777,22.9624 70.4811,22.9522 70.478,22.9403 70.4631,22.9328 70.4613,22.9042 70.4644,22.8824 70.4603,22.8631 70.4473,22.8583 70.4403,22.863 70.4332,22.8812 70.4199,22.892 70.4172,22.9104 70.4169,22.9449 70.4065,22.9367 70.4047,22.9082 70.4041,22.8919 70.4062,22.8688 70.4056,22.8566 70.4079,22.8403 70.4166,22.8254 70.4198,22.8227 70.4186,22.8267 70.415,22.8131 70.4148,22.8111 70.4132)),((22.9165 70.75,22.9275 70.7461,22.9475 70.7465,22.9588 70.7602,22.9616 70.7622,22.9582 70.7645,22.9417 70.7691,22.9333 70.7669,22.929 70.7539,22.9165 70.75)),((22.9748 70.8425,22.9796 70.8377,22.9982 70.8331,23.0585 70.8302,23.0697 70.8354,23.0726 70.8388,23.0644 70.8443,23.052 70.8482,23.0388 70.8494,23.0241 70.8435,23.0089 70.8486,22.9804 70.8484,22.9748 70.8425)),((23.0508 70.8597,23.0514 70.8523,23.0666 70.8482,23.0715 70.8516,23.0619 70.8578,23.0564 70.8599,23.0508 70.8597)),((23.1705 70.1494,23.1782 70.1357,23.1869 70.1318,23.2022 70.1299,23.2291 70.1295,23.2372 70.1336,23.2361 70.1412,23.2429 70.1427,23.2831 70.1412,23.2885 70.1428,23.2565 70.1484,23.223 70.151,23.1928 70.152,23.1705 70.1494)),((23.3271 70.5708,23.3298 70.5694,23.3435 70.5696,23.3987 70.5796,23.4158 70.5809,23.42 70.5816,23.4126 70.5866,23.3901 70.5899,23.3639 70.5866,23.3535 70.5823,23.3425 70.5805,23.3492 70.5766,23.3271 70.5708)),((23.405 70.6574,23.4146 70.6557,23.4449 70.6549,23.4546 70.6569,23.4581 70.6578,23.4549 70.6638,23.4301 70.6632,23.4086 70.6596,23.405 70.6574)),((23.598 70.6057,23.6089 70.6034,23.6274 70.6024,23.6248 70.6058,23.6267 70.6063,23.6414 70.6098,23.6461 70.6071,23.6439 70.6036,23.657 70.6045,23.6676 70.598,23.6766 70.5861,23.6898 70.5758,23.6882 70.5717,23.6798 70.5676,23.7048 70.562,23.7273 70.5468,23.7203 70.5434,23.7316 70.5372,23.7285 70.5306,23.7478 70.5209,23.7593 70.5199,23.7782 70.514,23.8156 70.5117,23.8622 70.5137,23.8872 70.5094,23.9015 70.5088,23.9649 70.5168,23.9847 70.5221,23.9955 70.525,23.9992 70.5289,24.0021 70.5521,24.0174 70.5547,24.0247 70.5618,24.099 70.5851,24.1387 70.612,24.1377 70.6168,24.1072 70.6225,24.1148 70.624,24.1217 70.6235,24.1234 70.629,24.1291 70.6312,24.1252 70.634,24.0981 70.6306,24.0971 70.6354,24.1065 70.6412,24.0934 70.6502,24.0622 70.6473,24.0486 70.6492,24.0591 70.6526,24.0793 70.6558,24.0851 70.6596,24.057 70.6815,24.039 70.6895,24.0234 70.6935,24.0104 70.6945,24.0082 70.6943,23.9951 70.6932,23.9876 70.6949,23.9851 70.6976,23.9889 70.7026,23.9849 70.7049,23.9553 70.707,23.9322 70.7113,23.9183 70.7098,23.8662 70.7154,23.8565 70.7148,23.8228 70.7052,23.8204 70.7002,23.8098 70.6953,23.8038 70.6994,23.7816 70.6982,23.7811 70.7,23.7958 70.7036,23.7912 70.7072,23.7955 70.7109,23.8382 70.7202,23.8475 70.7269,23.8373 70.7288,23.8317 70.728,23.821 70.721,23.8147 70.7201,23.8099 70.7215,23.8153 70.731,23.8024 70.7345,23.8103 70.7395,23.8065 70.7452,23.7873 70.7483,23.7679 70.7476,23.7556 70.7499,23.7396 70.7482,23.7148 70.7504,23.7002 70.7473,23.6923 70.7477,23.6774 70.7483,23.6725 70.7472,23.6563 70.7282,23.6431 70.7255,23.6234 70.7049,23.6304 70.6932,23.6261 70.688,23.6365 70.6765,23.6508 70.6739,23.6486 70.67,23.6533 70.6684,23.6657 70.6688,23.6824 70.6712,23.6865 70.6707,23.6856 70.6664,23.6647 70.6619,23.6582 70.6567,23.6388 70.6539,23.6295 70.6464,23.6205 70.6439,23.63 70.6425,23.6468 70.6484,23.6612 70.6478,23.6702 70.6491,23.6721 70.6459,23.6664 70.6421,23.6759 70.6391,23.6723 70.6368,23.66 70.6371,23.6521 70.6312,23.6539 70.626,23.6002 70.6085,23.598 70.6057)),((23.6732 70.9206,23.6738 70.9183,23.6903 70.9155,23.7112 70.9154,23.6881 70.9251,23.681 70.9242,23.6732 70.9206)),((23.8502 70.9996,23.8597 70.9959,23.8743 70.9935,23.8778 70.993,23.8899 70.9858,23.9503 70.9902,23.9755 70.9893,23.99 70.9867,24.0033 70.9877,24.019 70.9913,24.0265 70.9892,23.9932 70.9826,23.9562 70.9835,23.9378 70.9805,23.92 70.976,23.9141 70.9704,23.8906 70.9632,23.881 70.956,23.8865 70.9541,23.8941 70.954,23.9137 70.9537,23.9337 70.9504,23.9443 70.9519,23.9432 70.9457,23.9494 70.9448,23.9593 70.9459,23.9627 70.9447,23.9393 70.9387,23.9267 70.9386,23.9279 70.9356,23.9545 70.9263,23.9664 70.9264,23.9798 70.9288,23.9841 70.921,24.0068 70.9156,24.0443 70.9144,24.0772 70.9169,24.0802 70.9187,24.0776 70.9223,24.0899 70.9277,24.0835 70.9299,24.0797 70.9312,24.0925 70.9355,24.1146 70.9316,24.1444 70.9293,24.1577 70.9386,24.1747 70.9423,24.2077 70.9452,24.2185 70.9492,24.2104 70.9523,24.1882 70.9541,24.2006 70.961,24.2102 70.9584,24.2278 70.9608,24.2253 70.9649,24.2127 70.9643,24.2013 70.9701,24.1734 70.9713,24.1659 70.9732,24.1475 70.9701,24.1331 70.9737,24.1121 70.973,24.0902 70.9699,24.0453 70.968,24.0428 70.9721,24.0538 70.9789,24.0644 70.9811,24.0667 70.984,24.0608 70.9889,24.0637 70.9914,24.1058 70.9929,24.1116 70.9955,24.1339 70.9944,24.136 70.9989,24.1364 70.9999,24.1546 70.9995,24.1634 70.9958,24.1991 70.9957,24.2069 70.997,24.2092 70.9995,24.2032 71.0034,24.1655 71.0042,24.1182 71.0087,24.0711 71.0059,24.0578 71.0067,24.0489 71.0086,24.0469 71.0109,24.0514 71.0147,24.0808 71.0238,24.0782 71.0271,24.061 71.0313,24.0394 71.0338,24.0303 71.0341,24.0129 71.0347,24.0165 71.0271,24.0095 71.026,24.0004 71.0265,23.9694 71.0343,23.9463 71.0356,23.9308 71.0346,23.9067 71.0302,23.9017 71.0279,23.907 71.0238,23.9229 71.02,23.9375 71.019,23.9408 71.016,23.935 71.0122,23.9216 71.0105,23.897 71.0104,23.8952 71.0036,23.8846 71.0018,23.8531 71.0016,23.8502 70.9996)),((23.9355 71.0731,23.9492 71.068,23.9531 71.0636,23.9504 71.055,23.9601 71.0531,23.9805 71.044,23.9945 71.0435,24.0166 71.0479,24.0507 71.0439,24.0766 71.0433,24.0936 71.0452,24.1059 71.0501,24.0843 71.053,24.0789 71.056,24.0805 71.059,24.1235 71.0707,24.1343 71.0727,24.1492 71.0755,24.1531 71.0807,24.1484 71.084,24.1359 71.085,24.1381 71.0866,24.1313 71.0903,24.1137 71.0893,24.1021 71.0841,24.0878 71.082,24.0798 71.0777,24.0728 71.0775,24.0612 71.0835,24.0541 71.0914,24.0371 71.0899,24.0326 71.0861,24.016 71.0796,24.052 71.0622,24.0448 71.0604,24.0211 71.0629,24.0182 71.0611,24.0234 71.0553,24.0182 71.0534,24.0108 71.0537,23.9846 71.0732,23.9603 71.0773,23.9579 71.0771,23.9455 71.0764,23.9355 71.0731)),((24.1773 70.8588,24.1853 70.8537,24.2033 70.8538,24.2445 70.8648,24.2692 70.8689,24.2994 70.881,24.303 70.8823,24.2969 70.8837,24.2812 70.8791,24.2264 70.8725,24.205 70.8656,24.1839 70.8628,24.1773 70.8588)),((24.2271 70.8816,24.24 70.8772,24.2488 70.883,24.2518 70.8857,24.2491 70.8871,24.2372 70.8868,24.2271 70.8816)),((24.4152 70.9312,24.4243 70.924,24.434 70.9232,24.4267 70.9354,24.4205 70.9352,24.4152 70.9312)),((24.4647 70.9229,24.4804 70.9196,24.4924 70.9206,24.5046 70.9173,24.5076 70.9193,24.4872 70.9252,24.4697 70.9247,24.4647 70.9229)),((24.54 71.0112,24.5988 71.0035,24.6205 70.9961,24.6718 70.9979,24.6839 71.0002,24.6944 71.0001,24.6959 71.0015,24.6842 71.0034,24.6729 71.0026,24.6389 71.0119,24.6139 71.0147,24.583 71.0214,24.5677 71.0225,24.54 71.0112)),((24.6009 71.0676,24.6129 71.0613,24.6049 71.0577,24.6594 71.0491,24.6714 71.0501,24.6722 71.0501,24.6765 71.0444,24.7014 71.0409,24.7146 71.033,24.7425 71.0317,24.7569 71.0286,24.7727 71.0316,24.7764 71.0341,24.7721 71.0394,24.7751 71.0478,24.7881 71.0513,24.7906 71.0549,24.7802 71.0621,24.7685 71.0648,24.7661 71.0684,24.7846 71.071,24.8 71.0763,24.8376 71.0795,24.8253 71.083,24.8148 71.0834,24.8093 71.0861,24.8081 71.0867,24.8099 71.0903,24.8234 71.091,24.8427 71.1002,24.8466 71.1042,24.8295 71.1081,24.8171 71.1041,24.7908 71.1017,24.7859 71.0958,24.7803 71.0961,24.7738 71.1014,24.7614 71.1039,24.7645 71.1063,24.7561 71.1135,24.7492 71.1145,24.7426 71.1123,24.7156 71.1165,24.6993 71.1155,24.6926 71.1115,24.6987 71.1025,24.7197 71.0948,24.7348 71.0918,24.7442 71.0872,24.7452 71.0833,24.732 71.0784,24.7422 71.0749,24.7435 71.0744,24.7242 71.0714,24.7079 71.076,24.6908 71.0736,24.6854 71.0764,24.6998 71.0799,24.7024 71.0845,24.6964 71.088,24.6733 71.0951,24.6513 71.0932,24.6411 71.0902,24.6448 71.0844,24.6223 71.078,24.6147 71.0722,24.6019 71.0705,24.6009 71.0676)),((24.9258 71.0279,24.9487 71.0192,24.9577 71.0129,24.9687 71.0105,24.9819 71.0101,24.9796 71.0079,24.9654 71.0062,24.9472 71.0062,24.9475 71.0035,24.9554 70.9998,24.9602 70.9976,25 71.0021,25.0134 71.0035,25.0223 71.008,25.0201 71.0185,25.0317 71.0218,25.0294 71.0264,25.0443 71.0335,25.0484 71.038,25.0459 71.0408,25.0278 71.0419,25.0213 71.0404,25.0151 71.0355,25.0054 71.0367,25 71.0386,24.9771 71.0462,24.9692 71.0511,24.9551 71.0504,24.9505 71.047,24.9386 71.0474,24.9363 71.0454,24.9451 71.0425,24.9258 71.0279)),((24.9785 70.2279,24.9857 70.2257,24.9991 70.2251,25 70.2254,25.0222 70.2328,25.0265 70.2343,25.0233 70.2362,25.0139 70.237,25 70.235,24.9961 70.2345,24.9808 70.2304,24.9785 70.2279)),((24.9825 70.2098,24.9888 70.2061,25 70.2086,25.0103 70.211,25.0113 70.2135,25 70.2134,24.989 70.2134,24.9825 70.2098)),((25.0655 70.2279,25.072 70.2257,25.0796 70.227,25.0917 70.2325,25.0954 70.2354,25.093 70.2378,25.0848 70.237,25.0655 70.2279)),((25.0735 70.5087,25.0785 70.5045,25.0905 70.5021,25.1412 70.4975,25.1525 70.4952,25.176 70.4974,25.213 70.5033,25.2144 70.5035,25.2301 70.5092,25.2367 70.518,25.2415 70.5234,25.2345 70.5274,25.2193 70.5318,25.2035 70.5311,25.1485 70.5236,25.1111 70.5203,25.0816 70.5138,25.0735 70.5087)),((25.0768 70.1692,25.0793 70.1674,25.0984 70.1701,25.106 70.1711,25.0962 70.1735,25.1029 70.1789,25.0993 70.1828,25.0768 70.1692)),((25.1185 70.2477,25.1236 70.2403,25.1336 70.2443,25.1334 70.2486,25.1318 70.2521,25.1185 70.2477)),((25.1586 70.2222,25.1644 70.2201,25.1725 70.2206,25.2034 70.2302,25.2077 70.2322,25.2017 70.233,25.1714 70.228,25.1586 70.2222)),((25.1746 70.1932,25.1878 70.1916,25.1964 70.1958,25.2008 70.1983,25.1959 70.202,25.1746 70.1932)),((25.1883 70.3109,25.1884 70.3056,25.2036 70.3084,25.207 70.3143,25.2046 70.3161,25.1992 70.3164,25.1883 70.3109)),((25.2298 70.2472,25.2596 70.2481,25.2779 70.2538,25.3027 70.2573,25.3118 70.2652,25.3247 70.2676,25.3298 70.2686,25.3411 70.2828,25.3403 70.2871,25.3407 70.2901,25.3089 70.2952,25.3069 70.3009,25.2955 70.2963,25.2783 70.294,25.2688 70.2884,25.2695 70.2836,25.251 70.2764,25.2522 70.2645,25.2298 70.2472)),((25.2477 71.0387,25.2547 71.0277,25.2835 71.0179,25.3204 71.0153,25.3388 71.0168,25.354 71.0207,25.3652 71.0203,25.3796 71.0229,25.3934 71.0265,25.4074 71.0266,25.4176 71.0291,25.4248 71.0352,25.4322 71.0333,25.4475 71.0323,25.4503 71.0335,25.4609 71.0378,25.4702 71.0388,25.477 71.0374,25.4898 71.0383,25.5172 71.034,25.5335 71.0349,25.5389 71.0337,25.5386 71.0271,25.5265 71.0256,25.3985 70.9972,25.3903 70.9937,25.3982 70.9902,25.4668 70.9752,25.4714 70.9731,25.4633 70.9705,25.4643 70.9675,25.4867 70.9626,25.4922 70.9522,25.502 70.949,25.5503 70.9335,25.5635 70.9335,25.6161 70.9397,25.6206 70.9419,25.611 70.9478,25.6162 70.9498,25.6247 70.9501,25.6396 70.9473,25.6537 70.9478,25.6858 70.9431,25.714 70.9447,25.7333 70.9476,25.7235 70.9519,25.7215 70.9569,25.6934 70.9565,25.6784 70.9588,25.6753 70.9616,25.6944 70.9631,25.7103 70.9711,25.7081 70.9745,25.7377 70.9898,25.7517 70.985,25.758 70.9803,25.7767 70.9747,25.801 70.9739,25.8044 70.9777,25.8464 70.9774,25.9064 70.9679,25.915 70.9689,25.9127 70.9762,25.9198 70.9809,25.9326 70.9835,25.9335 70.9836,25.9369 70.9875,25.9293 70.9919,25.9403 70.9949,25.9571 70.995,25.9666 70.9974,25.9732 70.9948,25.9667 70.9897,25.9718 70.9825,25.967 70.9787,25.9876 70.9724,26.0002 70.9724,26.0154 70.9751,26.0241 70.9809,26.0383 70.9783,26.0768 70.9822,26.1184 70.9921,26.1378 71.0025,26.1697 71.0088,26.196 71.0224,26.2176 71.0336,26.214 71.0604,26.208 71.0619,26.1938 71.0615,26.1754 71.0568,26.1614 71.0571,26.1505 71.0553,26.1335 71.0501,26.1148 71.0477,26.0917 71.0404,26.0627 71.0229,26.0543 71.0143,26.0448 71.012,26.0329 71.0149,26.0272 71.0162,26.0172 71.0107,26.0047 71.0157,25.9597 71.0102,25.9179 71.0122,25.9001 71.0107,25.895 71.0136,25.8974 71.0153,25.8868 71.0194,25.8858 71.0222,25.8944 71.0273,25.9 71.0274,25.9075 71.0218,25.9175 71.0271,25.9319 71.0248,25.9419 71.0258,25.9563 71.0239,25.9631 71.0303,25.9638 71.0344,25.9322 71.0399,25.931 71.0449,25.903 71.0502,25.8905 71.0422,25.8766 71.039,25.8715 71.0416,25.8841 71.0457,25.887 71.055,25.8944 71.0572,25.8761 71.0614,25.8679 71.0673,25.8478 71.0649,25.8405 71.0721,25.8494 71.0747,25.8843 71.0775,25.9039 71.0769,25.9155 71.0788,25.9154 71.0829,25.9269 71.0834,25.936 71.0839,25.9513 71.0872,25.9727 71.0865,25.9895 71.0882,26.0033 71.095,26.0158 71.098,26.0413 71.1112,26.0501 71.1131,26.0423 71.121,26.0347 71.1221,26.0238 71.1287,26.0009 71.135,25.9963 71.1408,25.9821 71.1411,25.9706 71.1392,25.9435 71.1164,25.9375 71.1142,25.9327 71.1148,25.9267 71.1213,25.9306 71.1278,25.927 71.1318,25.9178 71.1315,25.9002 71.1274,25.8855 71.1151,25.8645 71.1114,25.8353 71.1098,25.8328 71.1115,25.8389 71.1146,25.8387 71.1176,25.8476 71.1206,25.8445 71.1229,25.8673 71.1287,25.8598 71.1307,25.8429 71.1273,25.8292 71.1246,25.7906 71.112,25.7806 71.111,25.7829 71.1171,25.779 71.1188,25.7531 71.1156,25.7522 71.1186,25.7954 71.1425,25.7932 71.1462,25.8059 71.1551,25.794 71.1603,25.8099 71.1623,25.8165 71.1684,25.8147 71.1705,25.7865 71.1751,25.7675 71.1754,25.7663 71.175,25.7563 71.1717,25.7401 71.1724,25.7391 71.1656,25.718 71.1575,25.7102 71.1569,25.7007 71.1594,25.6901 71.1552,25.6859 71.1553,25.6844 71.1592,25.6937 71.1693,25.6906 71.1719,25.6817 71.1739,25.681 71.1876,25.6754 71.1881,25.6623 71.1854,25.6582 71.1774,25.6507 71.1744,25.6023 71.1676,25.5968 71.1636,25.5852 71.1619,25.5746 71.1571,25.5669 71.1574,25.5555 71.1709,25.5301 71.1614,25.535 71.1563,25.5475 71.1548,25.5516 71.149,25.603 71.139,25.6042 71.1379,25.5808 71.1369,25.6081 71.126,25.611 71.1216,25.6464 71.118,25.6681 71.1124,25.6735 71.1062,25.6863 71.101,25.7304 71.0831,25.7345 71.0773,25.7274 71.0729,25.7116 71.0704,25.7032 71.071,25.7028 71.0728,25.7095 71.075,25.69 71.0808,25.6435 71.0994,25.6086 71.1061,25.5979 71.1001,25.5795 71.0995,25.5688 71.0954,25.5577 71.0946,25.5516 71.0965,25.5648 71.1002,25.5642 71.1052,25.5707 71.1117,25.569 71.114,25.552 71.1182,25.5168 71.1189,25.4967 71.1163,25.4896 71.1107,25.4791 71.1111,25.4486 71.1243,25.4425 71.1212,25.4449 71.1134,25.4392 71.1078,25.4554 71.098,25.4515 71.0905,25.4479 71.0899,25.4336 71.0933,25.4236 71.0918,25.4219 71.0925,25.4089 71.0975,25.3816 71.0986,25.356 71.0967,25.3402 71.0995,25.3083 71.0981,25.2916 71.0993,25.2703 71.1034,25.2653 71.1026,25.2768 71.094,25.2721 71.0909,25.274 71.089,25.2885 71.0868,25.2877 71.0811,25.3046 71.081,25.3114 71.0739,25.3067 71.0707,25.2676 71.0667,25.2497 71.0538,25.2481 71.0526,25.2584 71.0509,25.2726 71.0516,25.2923 71.0467,25.2794 71.0446,25.2554 71.0441,25.2477 71.0387)),((25.2638 70.4838,25.2725 70.4773,25.2797 70.4799,25.2905 70.4896,25.2923 70.493,25.2861 70.4929,25.2638 70.4838)),((25.2695 70.922,25.2767 70.9184,25.297 70.9138,25.3041 70.9144,25.3093 70.9168,25.2982 70.9227,25.2832 70.9257,25.2712 70.9242,25.2695 70.922)),((25.3187 71.1436,25.3349 71.1388,25.3525 71.1433,25.3521 71.1456,25.3367 71.1516,25.3187 71.1436)),((25.3681 70.2721,25.3771 70.2688,25.3853 70.2691,25.3973 70.273,25.4042 70.2745,25.3943 70.276,25.3892 70.2786,25.3681 70.2721)),((25.7786 70.6746,25.8014 70.6662,25.8193 70.6661,25.8553 70.6755,25.8745 70.6853,25.8838 70.6901,25.8884 70.6932,25.8835 70.6967,25.8643 70.7018,25.8687 70.7077,25.8644 70.7112,25.8543 70.7132,25.8439 70.7129,25.8136 70.7043,25.7995 70.7027,25.7788 70.694,25.7786 70.6746)),((25.8 70.8208,25.8017 70.8142,25.813 70.8154,25.8244 70.8129,25.8349 70.8132,25.8393 70.8147,25.8299 70.8169,25.8189 70.8175,25.8056 70.8217,25.8 70.8208)),((25.8077 70.7597,25.827 70.7548,25.8382 70.7553,25.8583 70.7602,25.8614 70.762,25.8556 70.7648,25.8454 70.7661,25.8077 70.7597)),((25.8297 70.9606,25.8385 70.9543,25.8637 70.9547,25.8676 70.9569,25.8637 70.9591,25.8515 70.9613,25.8349 70.9625,25.8297 70.9606)),((25.9253 71.053,25.9401 71.0491,25.967 71.0532,25.9747 71.0544,25.9798 71.0552,25.9678 71.0576,25.9436 71.0572,25.9253 71.053)),((26.557 70.4189,26.568 70.4191,26.5906 70.4234,26.5849 70.4293,26.5966 70.4404,26.6291 70.4459,26.6326 70.4467,26.6317 70.449,26.6096 70.4514,26.5795 70.4438,26.5641 70.438,26.5651 70.4324,26.5578 70.4303,26.557 70.4189)),((26.7312 70.5067,26.7349 70.5044,26.7612 70.499,26.7685 70.4947,26.7786 70.494,26.7831 70.4994,26.7852 70.5025,26.7714 70.5088,26.7405 70.5086,26.7312 70.5067)),((26.848 70.5118,26.8649 70.511,26.9012 70.514,26.9042 70.5153,26.8903 70.5211,26.848 70.5118)),((26.8936 70.5897,26.8949 70.586,26.9011 70.5863,26.9197 70.593,26.9247 70.597,26.9032 70.6027,26.9006 70.6005,26.9063 70.5949,26.8936 70.5897)),((26.9311 70.5623,26.9451 70.5567,26.9615 70.5567,26.966 70.5582,26.9604 70.5613,26.934 70.5631,26.9311 70.5623)),((27.1557 70.7833,27.158 70.781,27.1884 70.7772,27.1968 70.7779,27.2081 70.7877,27.2131 70.7915,27.2052 70.7995,27.2009 70.8021,27.1908 70.8035,27.1807 70.8019,27.1666 70.7947,27.1557 70.7833)),((27.8945 70.6677,27.8975 70.6635,27.9214 70.6651,27.9299 70.6683,27.9347 70.6711,27.9324 70.6728,27.9235 70.6731,27.8945 70.6677)),((28.7301 70.1336,28.7364 70.132,28.7557 70.1311,28.7782 70.1365,28.8069 70.1358,28.8076 70.138,28.7963 70.1407,28.7807 70.1406,28.7483 70.1359,28.7313 70.1354,28.7301 70.1336)),((29.6924 69.7605,29.6956 69.7583,29.6992 69.757,29.7046 69.7572,29.7789 69.7593,29.8149 69.7578,29.8359 69.7609,29.8443 69.7663,29.8399 69.7708,29.823 69.7759,29.8156 69.7872,29.8027 69.7944,29.8054 69.7964,29.8216 69.7971,29.8306 69.7827,29.8595 69.7719,29.869 69.7717,29.8714 69.7716,29.9028 69.7781,29.9564 69.7929,30 69.8007,30.0089 69.8022,30.0944 69.8129,30.0988 69.8159,30.0966 69.819,30.0856 69.8218,30.0858 69.8337,30.078 69.8361,30.0505 69.8342,30.0397 69.8334,30.0274 69.821,30.0168 69.8173,30 69.8182,29.9965 69.8184,29.9764 69.8238,29.9572 69.8242,29.9407 69.8265,29.9254 69.8207,29.9165 69.8199,29.9106 69.8222,29.9093 69.8243,29.9172 69.8297,29.9344 69.8332,29.9537 69.8333,29.996 69.8304,30 69.8322,30.0055 69.8348,30.0126 69.8435,30.0205 69.8471,30.0119 69.8511,30 69.8531,29.9924 69.8544,29.9848 69.8594,30 69.8638,29.9838 69.8661,29.9883 69.8696,29.9869 69.8733,29.9803 69.8754,29.958 69.8708,29.9512 69.8723,29.9499 69.8741,29.9742 69.8846,29.9732 69.8874,29.9522 69.8982,29.9349 69.9024,29.9281 69.9031,29.9123 69.9047,29.9091 69.9032,29.9165 69.8992,29.9144 69.8972,29.9043 69.8951,29.8895 69.9006,29.8755 69.9025,29.8707 69.9098,29.8259 69.914,29.8019 69.908,29.7922 69.8953,29.8041 69.8811,29.8045 69.8764,29.7953 69.869,29.8014 69.8635,29.8032 69.8492,29.8034 69.8475,29.7983 69.8404,29.8015 69.8343,29.8007 69.818,29.8082 69.8105,29.8025 69.8075,29.7965 69.8076,29.7738 69.8152,29.7577 69.8107,29.7381 69.798,29.7247 69.7778,29.7126 69.7675,29.6958 69.7629,29.6924 69.7605)),((29.7534 70.0691,29.7542 70.0636,29.7654 70.0598,29.774 70.0611,29.7718 70.0666,29.7574 70.0717,29.7534 70.0691)),((29.774 69.9085,29.7751 69.8981,29.7828 69.8971,29.7852 69.8984,29.791 69.9036,29.7867 69.9066,29.774 69.9085)),((30.0177 69.8791,30.0274 69.8746,30.0295 69.869,30.0254 69.8611,30.031 69.8581,30.0564 69.8527,30.0714 69.8534,30.0831 69.8564,30.0879 69.8587,30.0862 69.8615,30.0757 69.8638,30.0742 69.8671,30.0812 69.8737,30.0798 69.8775,30.072 69.8799,30.048 69.8799,30.0308 69.8843,30.0177 69.8791)),((30.1113 69.7947,30.1173 69.7889,30.1135 69.782,30.1185 69.7792,30.1273 69.7779,30.1394 69.7783,30.1558 69.7813,30.1672 69.7817,30.1722 69.7827,30.1597 69.7887,30.1571 69.7925,30.1335 69.8011,30.124 69.8004,30.1113 69.7947)),((31.0604 70.3988,31.0691 70.3782,31.0835 70.3664,31.0916 70.3679,31.0972 70.3715,31.0692 70.4051,31.0623 70.4034,31.0604 70.3988)),((31.1086 70.3742,31.1121 70.366,31.1179 70.3653,31.1245 70.3696,31.121 70.3762,31.1147 70.3774,31.1086 70.3742)),((31.1097 70.397,31.1135 70.3894,31.1246 70.3898,31.1332 70.3924,31.1382 70.3945,31.1354 70.3976,31.1269 70.3987,31.1097 70.397))) diff --git a/GraphicsView/include/CGAL/Qt/GraphicsViewPolygonWithHolesInput.h b/GraphicsView/include/CGAL/Qt/GraphicsViewPolygonWithHolesInput.h index 96342b3fa585..e97c999ee10f 100644 --- a/GraphicsView/include/CGAL/Qt/GraphicsViewPolygonWithHolesInput.h +++ b/GraphicsView/include/CGAL/Qt/GraphicsViewPolygonWithHolesInput.h @@ -59,6 +59,11 @@ class GraphicsViewPolygonWithHolesInput : public GraphicsViewInput public Q_SLOTS: void processInput(CGAL::Object o); + void setZValue(int z) + { + pi->setZValue(z); + } + typedef CGAL::Polygon_2 Polygon; typedef CGAL::Polygon_with_holes_2 Polygon_with_holes; @@ -89,6 +94,7 @@ GraphicsViewPolygonWithHolesInput::GraphicsViewPolygonWithHolesInput(QObject { pwhItem = new CGAL::Qt::PolygonWithHolesGraphicsItem(&pwh); pwhItem->setBrush(::Qt::yellow); + pwhItem->setZValue(8); scene_->addItem(pwhItem); pwhItem->hide(); diff --git a/GraphicsView/include/CGAL/Qt/GraphicsViewPolylineInput.h b/GraphicsView/include/CGAL/Qt/GraphicsViewPolylineInput.h index 08c78981df1c..1fbb3ee324e9 100644 --- a/GraphicsView/include/CGAL/Qt/GraphicsViewPolylineInput.h +++ b/GraphicsView/include/CGAL/Qt/GraphicsViewPolylineInput.h @@ -50,6 +50,11 @@ class CGAL_QT_EXPORT GraphicsViewPolylineInput_non_templated_base : public Graph bool eventFilter(QObject *obj, QEvent *event); + void setZValue(int v) + { + z = v; + } + protected: // protected constructor GraphicsViewPolylineInput_non_templated_base(QObject* parent, @@ -80,6 +85,7 @@ class CGAL_QT_EXPORT GraphicsViewPolylineInput_non_templated_base : public Graph int n_; QPointF sp; QGraphicsScene *scene_; + int z; }; // end class GraphicsViewPolylineInput_non_templated_base template diff --git a/GraphicsView/include/CGAL/Qt/GraphicsViewPolylineInput_impl.h b/GraphicsView/include/CGAL/Qt/GraphicsViewPolylineInput_impl.h index acbe44cb9e0e..507ff7dc51bd 100644 --- a/GraphicsView/include/CGAL/Qt/GraphicsViewPolylineInput_impl.h +++ b/GraphicsView/include/CGAL/Qt/GraphicsViewPolylineInput_impl.h @@ -82,6 +82,7 @@ GraphicsViewPolylineInput_non_templated_base::mousePressEvent(QGraphicsSceneMous qpp.addPolygon(polygon); path_item = new QGraphicsPathItem(qpp); path_item->setPen(QPen(::Qt::red, 0, ::Qt::SolidLine, ::Qt::RoundCap, ::Qt::RoundJoin)); + path_item->setZValue(z); scene_->addItem(path_item); return true; } @@ -98,11 +99,13 @@ GraphicsViewPolylineInput_non_templated_base::rubberbands(const QPointF& p) } if(!b && closed_ ){ b = new QGraphicsLineItem(); + b->setZValue(z); b->setPen(QPen(::Qt::red, 0, ::Qt::SolidLine, ::Qt::RoundCap, ::Qt::RoundJoin)); scene_->addItem(b); } if( !e){ e = new QGraphicsLineItem(); + e->setZValue(z); e->setPen(QPen(::Qt::red, 0, ::Qt::SolidLine, ::Qt::RoundCap, ::Qt::RoundJoin)); scene_->addItem(e); } @@ -165,6 +168,7 @@ GraphicsViewPolylineInput_non_templated_base::keyPressEvent ( QKeyEvent * event QPainterPath qpp; qpp.addPolygon(polygon); path_item = new QGraphicsPathItem(qpp); + path_item->setZValue(z); path_item->setPen(QPen(::Qt::red, 0, ::Qt::SolidLine, ::Qt::RoundCap, ::Qt::RoundJoin)); scene_->addItem(path_item); rubberbands(sp); diff --git a/GraphicsView/include/CGAL/Qt/MultipolygonWithHolesGraphicsItem.h b/GraphicsView/include/CGAL/Qt/MultipolygonWithHolesGraphicsItem.h new file mode 100644 index 000000000000..50e3dbfcb370 --- /dev/null +++ b/GraphicsView/include/CGAL/Qt/MultipolygonWithHolesGraphicsItem.h @@ -0,0 +1,235 @@ +// Copyright (c) 2024 GeometryFactory Sarl (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// +// Author(s) : Andreas Fabri +// Laurent Rineau + +#ifndef CGAL_QT_MULTIPOLYGON_WITH_HOLES_GRAPHICS_ITEM_H +#define CGAL_QT_MULTIPOLYGON_WITH_HOLES_GRAPHICS_ITEM_H + +#include + + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace CGAL { +namespace Qt { + +template +class MultipolygonWithHolesGraphicsItem : public GraphicsItem +{ + typedef typename P::Traits Traits; +public: + MultipolygonWithHolesGraphicsItem(P* p_); + + void modelChanged(); + +public: + QRectF boundingRect() const; + + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + + + const QBrush& brush() const + { + return brush_; + } + + + void setBrush(const QBrush& b) + { + brush_ = b; + } + + const QPen& verticesPen() const + { + return vertices_pen; + } + + const QPen& edgesPen() const + { + return edges_pen; + } + + void setVerticesPen(const QPen& pen) + { + vertices_pen = pen; + } + + void setEdgesPen(const QPen& pen) + { + edges_pen = pen; + } + + bool drawVertices() const + { + return draw_vertices; + } + + void setDrawVertices(const bool b) + { + draw_vertices = b; + update(); + } + + +protected: + void updateBoundingBox(); + + P * poly; + QPainter* m_painter; + PainterOstream painterostream; + + typename Traits::Point_2 p; + QRectF bounding_rect; + + QBrush brush_; + QPen vertices_pen; + QPen edges_pen; + bool draw_vertices; +}; + + +template +MultipolygonWithHolesGraphicsItem

    ::MultipolygonWithHolesGraphicsItem(P * p_) + : poly(p_), painterostream(0), + draw_vertices(true) +{ + setVerticesPen(QPen(::Qt::red, 3.)); + if(poly->number_of_polygons_with_holes() == 0){ + this->hide(); + } + updateBoundingBox(); + setZValue(0); +} + +template +QRectF +MultipolygonWithHolesGraphicsItem

    ::boundingRect() const +{ + return bounding_rect; +} + + + + +template +void +MultipolygonWithHolesGraphicsItem

    ::paint(QPainter *painter, + const QStyleOptionGraphicsItem * /*option*/, + QWidget * /*widget*/) +{ + using Polygon_with_holes_2 = typename P::Polygon_with_holes_2; + using General_polygon_2 = typename Polygon_with_holes_2::General_polygon_2; + Converter convert; + + for(const auto& pwh : poly->polygons_with_holes()){ + QPainterPath border; + General_polygon_2 boundary = pwh.outer_boundary(); + painter->setPen(this->edgesPen()); + + typename General_polygon_2::Vertex_iterator it = pwh.outer_boundary().vertices_begin(); + QPointF firstPoint = convert(*it); + border.moveTo(firstPoint); + painterostream = PainterOstream(painter); + + for(++it; + it != pwh.outer_boundary().vertices_end(); + ++it){ + border.lineTo(convert(*it)); + } + border.lineTo(firstPoint); + + + for(typename Polygon_with_holes_2::Hole_const_iterator hit = pwh.holes_begin(); + hit != pwh.holes_end(); + ++hit){ + typename General_polygon_2::Vertex_iterator it = hit->vertices_begin(); + QPointF firstPoint = convert(*it); + border.moveTo(firstPoint); + for(++it; + it != hit->vertices_end(); + ++it){ + border.lineTo(convert(*it)); + } + border.lineTo(firstPoint); + } + + painter->setBrush(this->brush()); + painter->drawPath(border); + } + + + if(drawVertices()) { + painter->setPen(verticesPen()); + QTransform matrix = painter->worldTransform(); + painter->resetTransform(); + + for(const auto& pwh : poly->polygons_with_holes()){ + for(typename General_polygon_2::Vertex_iterator it = pwh.outer_boundary().vertices_begin(); + it != pwh.outer_boundary().vertices_end(); + it++){ + QPointF point = matrix.map(convert(*it)); + painter->drawPoint(point); + } + for(typename Polygon_with_holes_2::Hole_const_iterator hit = pwh.holes_begin(); + hit != pwh.holes_end(); + ++hit){ + for(typename General_polygon_2::Vertex_iterator it = hit->vertices_begin(); + it != hit->vertices_end(); + it++){ + QPointF point = matrix.map(convert(*it)); + painter->drawPoint(point); + } + } + } + } +} + +// We let the bounding box only grow, so that when vertices get removed +// the maximal bbox gets refreshed in the GraphicsView +template +void +MultipolygonWithHolesGraphicsItem

    ::updateBoundingBox() +{ + Converter convert; + prepareGeometryChange(); + if(poly->number_of_polygons_with_holes() == 0){ + return; + } + bounding_rect = convert(poly->bbox()); +} + + +template +void +MultipolygonWithHolesGraphicsItem

    ::modelChanged() +{ + if((poly->number_of_polygons_with_holes() == 0) ){ + this->hide(); + } else if((poly->number_of_polygons_with_holes() > 0) && (! this->isVisible())){ + this->show(); + } + updateBoundingBox(); + update(); +} + + +} // namespace Qt +} // namespace CGAL + +#endif // CGAL_QT_MYLTIPOLYGON_WITH_HOLES_GRAPHICS_ITEM_H diff --git a/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h b/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h index c27e8b4a7067..58b3ce765c83 100644 --- a/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h +++ b/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h @@ -85,6 +85,7 @@ Hole_const_iterator holes_end() const; /*! returns the range of holes. */ + const Holes_container& holes() const; /// @} diff --git a/Polygon/include/CGAL/Multipolygon_with_holes_2.h b/Polygon/include/CGAL/Multipolygon_with_holes_2.h index a8b6a32ca2d0..bdfd3cb47bc1 100644 --- a/Polygon/include/CGAL/Multipolygon_with_holes_2.h +++ b/Polygon/include/CGAL/Multipolygon_with_holes_2.h @@ -46,6 +46,7 @@ class Multipolygon_with_holes_2 { /// @} + using Traits = Kernel; using value_type = Polygon_with_holes_2; using Polygon_with_holes_container = std::deque; diff --git a/Polygon_repair/examples/Polygon_repair/repair_polygon_2.cpp b/Polygon_repair/examples/Polygon_repair/repair_polygon_2.cpp index be6a011b4a0c..0cc87355c7b7 100644 --- a/Polygon_repair/examples/Polygon_repair/repair_polygon_2.cpp +++ b/Polygon_repair/examples/Polygon_repair/repair_polygon_2.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -11,8 +12,11 @@ using Polygon_2 = CGAL::Polygon_2; using Polygon_with_holes_2 = CGAL::Polygon_with_holes_2; using Multipolygon_with_holes_2 = CGAL::Multipolygon_with_holes_2; -int main() { - std::ifstream in("data/bridge-edge.wkt"); +int main(int argc, char* argv[]) { + + char* filename = (argc > 1) ? argv[1] : "data/bridge-edge.wkt"; + + std::ifstream in(filename); Polygon_with_holes_2 pin; CGAL::IO::read_polygon_WKT(in, pin); From a661671fdf27fddb9f725ba4a3c3fa908c34cbc2 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 1 Oct 2024 11:15:16 +0100 Subject: [PATCH 242/348] unnecessary change --- Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h b/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h index 58b3ce765c83..c27e8b4a7067 100644 --- a/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h +++ b/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h @@ -85,7 +85,6 @@ Hole_const_iterator holes_end() const; /*! returns the range of holes. */ - const Holes_container& holes() const; /// @} From 2ca0e52a85cbb9e93962d901b3f25b385a79c06d Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 1 Oct 2024 16:31:06 +0200 Subject: [PATCH 243/348] fixes post-CGAL-6.0 [skip ci] --- Classification/doc/Classification/PackageDescription.txt | 2 +- Maintenance/public_release/scripts/precompiled_demos_zips | 1 + Scripts/developer_scripts/tag_pr_per_release.sh | 6 ++++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Classification/doc/Classification/PackageDescription.txt b/Classification/doc/Classification/PackageDescription.txt index 0771dcd89c27..247844956837 100644 --- a/Classification/doc/Classification/PackageDescription.txt +++ b/Classification/doc/Classification/PackageDescription.txt @@ -75,7 +75,7 @@ Data structures specialized to classify clusters. \cgalPkgDependsOn{\ref PkgSolverInterface, \ref PkgSpatialSearchingD} \cgalPkgBib{cgal:lm-clscm-12} \cgalPkgLicense{\ref licensesGPL "GPL"} -\cgalPkgDemo{Operations on Polyhedra,polyhedron_3.zip} +\cgalPkgDemo{CGAL Lab,CGALlab.zip} \cgalPkgShortInfoEnd \cgalPkgDescriptionEnd diff --git a/Maintenance/public_release/scripts/precompiled_demos_zips b/Maintenance/public_release/scripts/precompiled_demos_zips index c1bd62810762..405e0e806b60 100755 --- a/Maintenance/public_release/scripts/precompiled_demos_zips +++ b/Maintenance/public_release/scripts/precompiled_demos_zips @@ -76,6 +76,7 @@ pushd Triangulation_on_sphere_2_Demo_with_dlls; zip -r ../triangulation_on_spher # CGAL-6.0 pushd Lab_Demo_with_dlls; zip -r ../CGALlab.zip *; popd +pushd Arrangement_on_surface_2_earth_Demo_with_dlls; zip -r ../arrangements_2_earth.zip *; popd # check echo CHECK now. The following lines should be empty. diff --git a/Scripts/developer_scripts/tag_pr_per_release.sh b/Scripts/developer_scripts/tag_pr_per_release.sh index 9ff54e99349b..e2206e36798f 100644 --- a/Scripts/developer_scripts/tag_pr_per_release.sh +++ b/Scripts/developer_scripts/tag_pr_per_release.sh @@ -21,6 +21,12 @@ set -e # Exit the script on first error, for safety +err_report() { + echo "Error (code $?) on line $(caller)" +} + +trap 'err_report $LINENO' ERR + PREVIOUS_MAJOR_RELEASE=$1 CURRENT_RELEASE=$2 From 41346b3555095e9e04704411f89815fc337ceaf6 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 2 Oct 2024 07:30:09 +0100 Subject: [PATCH 244/348] Add const in example code --- .../Polygon_repair/repair_polygon_2.cpp | 2 +- .../include/CGAL/Polygon_repair/Union_rule.h | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 Polygon_repair/include/CGAL/Polygon_repair/Union_rule.h diff --git a/Polygon_repair/examples/Polygon_repair/repair_polygon_2.cpp b/Polygon_repair/examples/Polygon_repair/repair_polygon_2.cpp index 0cc87355c7b7..53f6612e0eae 100644 --- a/Polygon_repair/examples/Polygon_repair/repair_polygon_2.cpp +++ b/Polygon_repair/examples/Polygon_repair/repair_polygon_2.cpp @@ -14,7 +14,7 @@ using Multipolygon_with_holes_2 = CGAL::Multipolygon_with_holes_2; int main(int argc, char* argv[]) { - char* filename = (argc > 1) ? argv[1] : "data/bridge-edge.wkt"; + const char* filename = (argc > 1) ? argv[1] : "data/bridge-edge.wkt"; std::ifstream in(filename); Polygon_with_holes_2 pin; diff --git a/Polygon_repair/include/CGAL/Polygon_repair/Union_rule.h b/Polygon_repair/include/CGAL/Polygon_repair/Union_rule.h new file mode 100644 index 000000000000..1e9d08fb5d7b --- /dev/null +++ b/Polygon_repair/include/CGAL/Polygon_repair/Union_rule.h @@ -0,0 +1,35 @@ +// Copyright (c) 2024 GeometryFactory. +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Andreas Fabri + +#ifndef CGAL_POLYGON_REPAIR_UNION_RULE_H +#define CGAL_POLYGON_REPAIR_UNION_RULE_H + +#include + +namespace CGAL { + +namespace Polygon_repair { + +/// \addtogroup PkgPolygonRepairRef +/// @{ + +/*! + Tag class to select the union rule when calling `CGAL::Polygon_repair::repair()`. + */ + struct Union_rule {}; + +///@} + +} // namespace Polygon_repair + +} // namespace CGAL + +#endif // CGAL_POLYGON_REPAIR_UNION_RULE_H From 85a898dec1d69aabcca3ec61ab80df094b3bc5f1 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 2 Oct 2024 08:02:55 +0100 Subject: [PATCH 245/348] lowercase \Note --- Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_3.h b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_3.h index b30c8553a672..b240e3a3bd57 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_3.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_3.h @@ -25,7 +25,7 @@ width-planes. \f$ \mathcal{W(S)}=\mathcal{W}_{d_{opt}}\mathcal{(S)}\f$ -\Note There might be several optimal build directions. Hence +\note There might be several optimal build directions. Hence neither the width-planes nor the direction \f$ \mathbf{d}_{opt}\f$ are unique - only the width is. There may also be duplicates reported, different vectors having the same or the opposite directions. From bea1dffa9993c6d15312e9734536c012bb22fd75 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 2 Oct 2024 08:06:35 +0100 Subject: [PATCH 246/348] Use \note --- .../Concepts/AllFurthestNeighborsTraits_2.h | 6 +----- .../doc/Polytope_distance_d/Concepts/WidthTraits_3.h | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h index 874782161e7a..452ade88fee4 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h @@ -16,14 +16,10 @@ convex polygon using the function `all_furthest_neighbors_2()`. \sa `CGAL::all_furthest_neighbors_2()` -\cgalHeading{Notes} - -

      -
    • `AllFurthestNeighborsTraits_2::Less_xy_2` and +\note `AllFurthestNeighborsTraits_2::Less_xy_2` and `AllFurthestNeighborsTraits_2::Orientation_2` are used for (expensive) precondition checking only. Therefore, they need not to be specified, in case that precondition checking is disabled. -
    */ diff --git a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h index 5686aec87e15..8699ebd7b323 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h @@ -24,7 +24,7 @@ class WidthTraits_3 { public: /// \name Types -/// Notes: If you want to compute the width of a polyhedron then you have to make sure that the point type in the traits class and the point type in the polyhedron class are the same! The same holds for `Traits::Plane_3` and `Polyhedron::Plane_3`. +/// \note If you want to compute the width of a polyhedron then you have to make sure that the point type in the traits class and the point type in the polyhedron class are the same! The same holds for `Traits::Plane_3` and `Polyhedron::Plane_3`. /// @{ /*! From d33a080988f688ce4d4b93dc628fed121e695d2f Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 2 Oct 2024 09:09:20 +0100 Subject: [PATCH 247/348] Remove accidentally added file --- .../include/CGAL/Polygon_repair/Union_rule.h | 35 ------------------- 1 file changed, 35 deletions(-) delete mode 100644 Polygon_repair/include/CGAL/Polygon_repair/Union_rule.h diff --git a/Polygon_repair/include/CGAL/Polygon_repair/Union_rule.h b/Polygon_repair/include/CGAL/Polygon_repair/Union_rule.h deleted file mode 100644 index 1e9d08fb5d7b..000000000000 --- a/Polygon_repair/include/CGAL/Polygon_repair/Union_rule.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2024 GeometryFactory. -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Andreas Fabri - -#ifndef CGAL_POLYGON_REPAIR_UNION_RULE_H -#define CGAL_POLYGON_REPAIR_UNION_RULE_H - -#include - -namespace CGAL { - -namespace Polygon_repair { - -/// \addtogroup PkgPolygonRepairRef -/// @{ - -/*! - Tag class to select the union rule when calling `CGAL::Polygon_repair::repair()`. - */ - struct Union_rule {}; - -///@} - -} // namespace Polygon_repair - -} // namespace CGAL - -#endif // CGAL_POLYGON_REPAIR_UNION_RULE_H From f6d2a275d855c23351bb316c2dad5ea3d06b687f Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Thu, 3 Oct 2024 10:34:24 +0200 Subject: [PATCH 248/348] removing warning and some unused code --- .../kinetic_partition.cpp | 2 +- .../include/CGAL/KSP_3/Data_structure.h | 3 --- .../include/CGAL/KSP_3/Intersection_graph.h | 19 +------------------ .../include/CGAL/Kinetic_space_partition_3.h | 10 +++------- 4 files changed, 5 insertions(+), 29 deletions(-) diff --git a/Kinetic_space_partition/examples/Kinetic_space_partition/kinetic_partition.cpp b/Kinetic_space_partition/examples/Kinetic_space_partition/kinetic_partition.cpp index 2eaaf47bbe0a..dafdd2fb4787 100644 --- a/Kinetic_space_partition/examples/Kinetic_space_partition/kinetic_partition.cpp +++ b/Kinetic_space_partition/examples/Kinetic_space_partition/kinetic_partition.cpp @@ -40,7 +40,7 @@ int main(int argc, char** argv) // Initialization of Kinetic_space_partition_3 object. // 'debug' set to true exports intermediate results into files in the working directory. // The resulting volumes are exported into a volumes folder, if the folder already exists. - KSP ksp(CGAL::parameters::verbose(true).debug(true)); + KSP ksp(CGAL::parameters::verbose(true).debug(false)); // Providing input polygons. ksp.insert(input_vertices, input_faces); diff --git a/Kinetic_space_partition/include/CGAL/KSP_3/Data_structure.h b/Kinetic_space_partition/include/CGAL/KSP_3/Data_structure.h index 5a64606321a9..b53cec6921aa 100644 --- a/Kinetic_space_partition/include/CGAL/KSP_3/Data_structure.h +++ b/Kinetic_space_partition/include/CGAL/KSP_3/Data_structure.h @@ -572,9 +572,6 @@ class Data_structure { m_support_planes[sp_idx].get_border(m_intersection_graph, border); for (IEdge edge : border) { - if (m_intersection_graph.has_crossed(edge, sp_idx)) - continue; - Face_event fe; IkFT t = calculate_edge_intersection_time(sp_idx, edge, fe); if (t > 0) { diff --git a/Kinetic_space_partition/include/CGAL/KSP_3/Intersection_graph.h b/Kinetic_space_partition/include/CGAL/KSP_3/Intersection_graph.h index e86d696bc0b8..3dffb18c35f9 100644 --- a/Kinetic_space_partition/include/CGAL/KSP_3/Intersection_graph.h +++ b/Kinetic_space_partition/include/CGAL/KSP_3/Intersection_graph.h @@ -59,7 +59,6 @@ class Intersection_graph { std::size_t order; std::map > faces; // For each intersecting support plane there is one pair of adjacent faces (or less if the edge is on the bbox) std::set planes; - std::set crossed; std::map intervals; // Maps support plane index to the kinetic interval. std::pair is the barycentric coordinate and intersection time. Edge_property() : line(std::size_t(-1)), order(edge_counter++) { } @@ -67,10 +66,8 @@ class Intersection_graph { const Edge_property& operator=(const Edge_property& other) { line = other.line; - // order = other.order; faces = other.faces; planes = other.planes; - crossed = other.crossed; intervals = other.intervals; return *this; @@ -137,7 +134,6 @@ class Intersection_graph { std::vector m_initial_part_of_partition; std::vector > m_initial_intervals; - std::vector > m_initial_crossed; public: Intersection_graph() : @@ -290,13 +286,11 @@ class Intersection_graph { void initialization_done() { auto e = edges(); - m_initial_crossed.resize(e.size()); m_initial_intervals.resize(e.size()); std::size_t idx = 0; for (const auto& edge : e) { - m_initial_intervals[idx] = m_graph[edge].intervals; - m_initial_crossed[idx++] = m_graph[edge].crossed; + m_initial_intervals[idx++] = m_graph[edge].intervals; } m_initial_part_of_partition.resize(m_ifaces.size()); @@ -306,13 +300,11 @@ class Intersection_graph { void reset_to_initialization() { auto e = edges(); - CGAL_assertion(e.size() == m_initial_crossed.size()); CGAL_assertion(e.size() == m_initial_intervals.size()); std::size_t idx = 0; for (auto edge : e) { m_graph[edge].intervals = m_initial_intervals[idx]; - m_graph[edge].crossed = m_initial_crossed[idx++]; } CGAL_assertion(m_ifaces.size() == m_initial_part_of_partition.size()); @@ -414,15 +406,6 @@ class Intersection_graph { m_graph[boost::source(edge, m_graph)].point, m_graph[boost::target(edge, m_graph)].point); } - - bool has_crossed(const Edge_descriptor& edge, std::size_t sp_idx) { - return m_graph[edge].crossed.count(sp_idx) == 1; - } - - void set_crossed(const Edge_descriptor& edge, std::size_t sp_idx) { - CGAL_assertion(false); - m_graph[edge].crossed.insert(sp_idx); - } }; template std::size_t Intersection_graph::Edge_property::edge_counter = 0; diff --git a/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h b/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h index ab53a84a6d93..d1f0e5509a8e 100644 --- a/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h +++ b/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h @@ -2054,11 +2054,7 @@ class Kinetic_space_partition_3 { return std::make_pair(-1, -1); } - void adapt_internal_edges(const CDTplus& cdtC, const std::vector &faces_node, std::vector >& c) { - assert(faces_node.size() == c.size()); - - //std::size_t not_skipped = 0; - + void adapt_internal_edges(const CDTplus& cdtC, std::vector >& c) { for (std::size_t f = 0; f < c.size(); f++) { std::vector faces_of_volume; // The face index is probably no longer valid and the full face has been replaced by a smaller face using merged indices @@ -2222,13 +2218,13 @@ class Kinetic_space_partition_3 { idx = 0; for (auto& p : a_sets) { - adapt_internal_edges(cdtC, p.second, a_constraints[idx]); + adapt_internal_edges(cdtC, a_constraints[idx]); idx++; } idx = 0; for (auto& p : b_sets) { - adapt_internal_edges(cdtC, p.second, b_constraints[idx]); + adapt_internal_edges(cdtC, b_constraints[idx]); idx++; } } From 809c6463a12f747e59cc9926f7376ef899346ec3 Mon Sep 17 00:00:00 2001 From: Joachim Reichel Date: Tue, 10 Sep 2024 13:26:40 +0200 Subject: [PATCH 249/348] Remove stale Debian packaging data. - The Debian packaging for unstable is tracked at https://salsa.debian.org/reichel/cgal. - No real need to track the Debian packaging for stable and testing in VCS, the changes are usually minimal and can be recovered from the published packages or the description in README. - Remove stale tagging information from README. - Remote stale uploading information from README. - Update announcement text. --- Maintenance/deb/ANNOUNCEMENT.beta | 23 -- Maintenance/deb/ANNOUNCEMENT.final | 23 +- Maintenance/deb/README | 52 +-- Maintenance/deb/TODO | 3 - Maintenance/deb/sid/debian/NEWS.Debian | 9 - Maintenance/deb/sid/debian/README.Debian | 50 --- Maintenance/deb/sid/debian/README.source | 11 - Maintenance/deb/sid/debian/changelog | 348 ----------------- Maintenance/deb/sid/debian/compat | 1 - Maintenance/deb/sid/debian/control | 120 ------ Maintenance/deb/sid/debian/copyright | 351 ------------------ .../deb/sid/debian/libcgal-demo.install | 2 - .../deb/sid/debian/libcgal-dev.install | 11 - .../deb/sid/debian/libcgal-ipelets.install | 2 - .../debian/libcgal-ipelets.lintian-overrides | 1 - .../deb/sid/debian/libcgal-qt4-10.install | 1 - .../debian/libcgal-qt4-10.lintian-overrides | 1 - .../deb/sid/debian/libcgal-qt4-10.shlibs | 1 - .../deb/sid/debian/libcgal-qt4-dev.install | 5 - Maintenance/deb/sid/debian/libcgal10.install | 4 - .../sid/debian/libcgal10.lintian-overrides | 1 - Maintenance/deb/sid/debian/libcgal10.shlibs | 3 - ...ink-example-with-qt4-support-library.patch | 12 - Maintenance/deb/sid/debian/patches/series | 1 - Maintenance/deb/sid/debian/rules | 96 ----- Maintenance/deb/sid/debian/source/format | 1 - Maintenance/deb/sid/debian/tests/Makefile | 14 - .../deb/sid/debian/tests/rounding_modes1.cpp | 66 ---- .../deb/sid/debian/tests/rounding_modes2.cpp | 95 ----- Maintenance/deb/sid/debian/watch | 10 - Maintenance/deb/squeeze/debian/NEWS.Debian | 9 - Maintenance/deb/squeeze/debian/README.Debian | 50 --- Maintenance/deb/squeeze/debian/README.source | 11 - Maintenance/deb/squeeze/debian/changelog | 348 ----------------- Maintenance/deb/squeeze/debian/compat | 1 - Maintenance/deb/squeeze/debian/control | 120 ------ Maintenance/deb/squeeze/debian/copyright | 351 ------------------ .../deb/squeeze/debian/libcgal-demo.install | 2 - .../deb/squeeze/debian/libcgal-dev.install | 11 - .../squeeze/debian/libcgal-ipelets.install | 2 - .../debian/libcgal-ipelets.lintian-overrides | 1 - .../deb/squeeze/debian/libcgal-qt4-10.install | 1 - .../debian/libcgal-qt4-10.lintian-overrides | 1 - .../deb/squeeze/debian/libcgal-qt4-10.shlibs | 1 - .../squeeze/debian/libcgal-qt4-dev.install | 5 - .../deb/squeeze/debian/libcgal10.install | 4 - .../debian/libcgal10.lintian-overrides | 1 - .../deb/squeeze/debian/libcgal10.shlibs | 3 - ...ink-example-with-qt4-support-library.patch | 12 - Maintenance/deb/squeeze/debian/patches/series | 1 - Maintenance/deb/squeeze/debian/rules | 96 ----- Maintenance/deb/squeeze/debian/source/format | 1 - Maintenance/deb/squeeze/debian/tests/Makefile | 14 - .../squeeze/debian/tests/rounding_modes1.cpp | 66 ---- .../squeeze/debian/tests/rounding_modes2.cpp | 95 ----- Maintenance/deb/squeeze/debian/watch | 10 - Maintenance/deb/wheezy/debian/NEWS.Debian | 9 - Maintenance/deb/wheezy/debian/README.Debian | 50 --- Maintenance/deb/wheezy/debian/README.source | 11 - Maintenance/deb/wheezy/debian/changelog | 348 ----------------- Maintenance/deb/wheezy/debian/compat | 1 - Maintenance/deb/wheezy/debian/control | 120 ------ Maintenance/deb/wheezy/debian/copyright | 351 ------------------ .../deb/wheezy/debian/libcgal-demo.install | 2 - .../deb/wheezy/debian/libcgal-dev.install | 11 - .../deb/wheezy/debian/libcgal-ipelets.install | 2 - .../debian/libcgal-ipelets.lintian-overrides | 1 - .../deb/wheezy/debian/libcgal-qt4-10.install | 1 - .../debian/libcgal-qt4-10.lintian-overrides | 1 - .../deb/wheezy/debian/libcgal-qt4-10.shlibs | 1 - .../deb/wheezy/debian/libcgal-qt4-dev.install | 5 - .../deb/wheezy/debian/libcgal10.install | 4 - .../wheezy/debian/libcgal10.lintian-overrides | 1 - .../deb/wheezy/debian/libcgal10.shlibs | 3 - ...ink-example-with-qt4-support-library.patch | 12 - Maintenance/deb/wheezy/debian/patches/series | 1 - Maintenance/deb/wheezy/debian/rules | 96 ----- Maintenance/deb/wheezy/debian/source/format | 1 - Maintenance/deb/wheezy/debian/tests/Makefile | 14 - .../wheezy/debian/tests/rounding_modes1.cpp | 66 ---- .../wheezy/debian/tests/rounding_modes2.cpp | 95 ----- Maintenance/deb/wheezy/debian/watch | 10 - 82 files changed, 16 insertions(+), 3736 deletions(-) delete mode 100644 Maintenance/deb/ANNOUNCEMENT.beta delete mode 100644 Maintenance/deb/TODO delete mode 100644 Maintenance/deb/sid/debian/NEWS.Debian delete mode 100644 Maintenance/deb/sid/debian/README.Debian delete mode 100644 Maintenance/deb/sid/debian/README.source delete mode 100644 Maintenance/deb/sid/debian/changelog delete mode 100644 Maintenance/deb/sid/debian/compat delete mode 100644 Maintenance/deb/sid/debian/control delete mode 100644 Maintenance/deb/sid/debian/copyright delete mode 100644 Maintenance/deb/sid/debian/libcgal-demo.install delete mode 100644 Maintenance/deb/sid/debian/libcgal-dev.install delete mode 100644 Maintenance/deb/sid/debian/libcgal-ipelets.install delete mode 100644 Maintenance/deb/sid/debian/libcgal-ipelets.lintian-overrides delete mode 100644 Maintenance/deb/sid/debian/libcgal-qt4-10.install delete mode 100644 Maintenance/deb/sid/debian/libcgal-qt4-10.lintian-overrides delete mode 100644 Maintenance/deb/sid/debian/libcgal-qt4-10.shlibs delete mode 100644 Maintenance/deb/sid/debian/libcgal-qt4-dev.install delete mode 100644 Maintenance/deb/sid/debian/libcgal10.install delete mode 100644 Maintenance/deb/sid/debian/libcgal10.lintian-overrides delete mode 100644 Maintenance/deb/sid/debian/libcgal10.shlibs delete mode 100644 Maintenance/deb/sid/debian/patches/do-not-link-example-with-qt4-support-library.patch delete mode 100644 Maintenance/deb/sid/debian/patches/series delete mode 100755 Maintenance/deb/sid/debian/rules delete mode 100644 Maintenance/deb/sid/debian/source/format delete mode 100644 Maintenance/deb/sid/debian/tests/Makefile delete mode 100644 Maintenance/deb/sid/debian/tests/rounding_modes1.cpp delete mode 100644 Maintenance/deb/sid/debian/tests/rounding_modes2.cpp delete mode 100644 Maintenance/deb/sid/debian/watch delete mode 100644 Maintenance/deb/squeeze/debian/NEWS.Debian delete mode 100644 Maintenance/deb/squeeze/debian/README.Debian delete mode 100644 Maintenance/deb/squeeze/debian/README.source delete mode 100644 Maintenance/deb/squeeze/debian/changelog delete mode 100644 Maintenance/deb/squeeze/debian/compat delete mode 100644 Maintenance/deb/squeeze/debian/control delete mode 100644 Maintenance/deb/squeeze/debian/copyright delete mode 100644 Maintenance/deb/squeeze/debian/libcgal-demo.install delete mode 100644 Maintenance/deb/squeeze/debian/libcgal-dev.install delete mode 100644 Maintenance/deb/squeeze/debian/libcgal-ipelets.install delete mode 100644 Maintenance/deb/squeeze/debian/libcgal-ipelets.lintian-overrides delete mode 100644 Maintenance/deb/squeeze/debian/libcgal-qt4-10.install delete mode 100644 Maintenance/deb/squeeze/debian/libcgal-qt4-10.lintian-overrides delete mode 100644 Maintenance/deb/squeeze/debian/libcgal-qt4-10.shlibs delete mode 100644 Maintenance/deb/squeeze/debian/libcgal-qt4-dev.install delete mode 100644 Maintenance/deb/squeeze/debian/libcgal10.install delete mode 100644 Maintenance/deb/squeeze/debian/libcgal10.lintian-overrides delete mode 100644 Maintenance/deb/squeeze/debian/libcgal10.shlibs delete mode 100644 Maintenance/deb/squeeze/debian/patches/do-not-link-example-with-qt4-support-library.patch delete mode 100644 Maintenance/deb/squeeze/debian/patches/series delete mode 100755 Maintenance/deb/squeeze/debian/rules delete mode 100644 Maintenance/deb/squeeze/debian/source/format delete mode 100644 Maintenance/deb/squeeze/debian/tests/Makefile delete mode 100644 Maintenance/deb/squeeze/debian/tests/rounding_modes1.cpp delete mode 100644 Maintenance/deb/squeeze/debian/tests/rounding_modes2.cpp delete mode 100644 Maintenance/deb/squeeze/debian/watch delete mode 100644 Maintenance/deb/wheezy/debian/NEWS.Debian delete mode 100644 Maintenance/deb/wheezy/debian/README.Debian delete mode 100644 Maintenance/deb/wheezy/debian/README.source delete mode 100644 Maintenance/deb/wheezy/debian/changelog delete mode 100644 Maintenance/deb/wheezy/debian/compat delete mode 100644 Maintenance/deb/wheezy/debian/control delete mode 100644 Maintenance/deb/wheezy/debian/copyright delete mode 100644 Maintenance/deb/wheezy/debian/libcgal-demo.install delete mode 100644 Maintenance/deb/wheezy/debian/libcgal-dev.install delete mode 100644 Maintenance/deb/wheezy/debian/libcgal-ipelets.install delete mode 100644 Maintenance/deb/wheezy/debian/libcgal-ipelets.lintian-overrides delete mode 100644 Maintenance/deb/wheezy/debian/libcgal-qt4-10.install delete mode 100644 Maintenance/deb/wheezy/debian/libcgal-qt4-10.lintian-overrides delete mode 100644 Maintenance/deb/wheezy/debian/libcgal-qt4-10.shlibs delete mode 100644 Maintenance/deb/wheezy/debian/libcgal-qt4-dev.install delete mode 100644 Maintenance/deb/wheezy/debian/libcgal10.install delete mode 100644 Maintenance/deb/wheezy/debian/libcgal10.lintian-overrides delete mode 100644 Maintenance/deb/wheezy/debian/libcgal10.shlibs delete mode 100644 Maintenance/deb/wheezy/debian/patches/do-not-link-example-with-qt4-support-library.patch delete mode 100644 Maintenance/deb/wheezy/debian/patches/series delete mode 100755 Maintenance/deb/wheezy/debian/rules delete mode 100644 Maintenance/deb/wheezy/debian/source/format delete mode 100644 Maintenance/deb/wheezy/debian/tests/Makefile delete mode 100644 Maintenance/deb/wheezy/debian/tests/rounding_modes1.cpp delete mode 100644 Maintenance/deb/wheezy/debian/tests/rounding_modes2.cpp delete mode 100644 Maintenance/deb/wheezy/debian/watch diff --git a/Maintenance/deb/ANNOUNCEMENT.beta b/Maintenance/deb/ANNOUNCEMENT.beta deleted file mode 100644 index ec79d927b551..000000000000 --- a/Maintenance/deb/ANNOUNCEMENT.beta +++ /dev/null @@ -1,23 +0,0 @@ -Debian packages for CGAL 4.1 Beta 1 are now available for i386 and -amd64. To download the packages via apt-get you need to add - - deb http://www.joachim-reichel.de/debian/repository squeeze main - deb-src http://www.joachim-reichel.de/debian/repository squeeze main - - deb http://www.joachim-reichel.de/debian/repository wheezy main - deb-src http://www.joachim-reichel.de/debian/repository wheezy main - - deb http://www.joachim-reichel.de/debian/repository sid main - deb-src http://www.joachim-reichel.de/debian/repository sid main - -to /etc/apt/sources.list (you only need the pair of lines corresponding -to the release you are using). The packages are called libcgal10, -libcgal-dev, libcgal-demo, and libcgal-ipelets. - -In case you want to download the packages manually, have a look at -http://www.joachim-reichel.de/debian/repository/pool/main/c/cgal/ - -For the final 4.1 release, similar packages will be uploaded to the -official Debian repository and/or be available from the CGAL web site. - -See also https://www.cgal.org/FAQ.html#debian_packages . diff --git a/Maintenance/deb/ANNOUNCEMENT.final b/Maintenance/deb/ANNOUNCEMENT.final index 6e42416b3e0a..1a59493934b5 100644 --- a/Maintenance/deb/ANNOUNCEMENT.final +++ b/Maintenance/deb/ANNOUNCEMENT.final @@ -1,18 +1,19 @@ -Debian packages for CGAL 4.1 are now available as well. Simply add +Debian packages for CGAL 6.0 are now available as well. Simply add - deb ftp://ftp.mpi-sb.mpg.de/pub/outgoing/CGAL/debian squeeze main - deb-src ftp://ftp.mpi-sb.mpg.de/pub/outgoing/CGAL/debian squeeze main + deb http://debian.cgal.org bullseye main + deb-src http://debian.cgal.org bullseye main - deb ftp://ftp.mpi-sb.mpg.de/pub/outgoing/CGAL/debian wheezy main - deb-src ftp://ftp.mpi-sb.mpg.de/pub/outgoing/CGAL/debian wheezy main + deb http://debian.cgal.org bookworm main + deb-src http://debian.cgal.org bookworm main -to /etc/apt/sources list (you only need the pair of lines corresponding -to the release you are using). For sid, packages should be available -from the official Debian repository in a few days. The packages are called -libcgal10, libcgal-dev, libcgal-qt4-10. libcgal-qt4-dev, libcgal-demo, and -libcgal-ipelets. +to /etc/apt/sources.list (you only need the pair of lines +corresponding to the release you are using) and make sure that the +package apt-transport-https is installed. For sid/unstable, +packages are available from the official Debian repository. The +packages are called libcgal-dev, libcgal-qt6-dev, libcgal-demo, +and libcgal-ipelets. In case you want to download the packages manually, have a look at -ftp://ftp.mpi-sb.mpg.de/pub/outgoing/CGAL/debian/pool/main/c/cgal/ +https://debian.cgal.org/pool/main/c/cgal/ . See also https://www.cgal.org/FAQ.html#debian_packages . diff --git a/Maintenance/deb/README b/Maintenance/deb/README index dbac2f074961..13c620b938f8 100644 --- a/Maintenance/deb/README +++ b/Maintenance/deb/README @@ -4,54 +4,10 @@ README Backports --------- -backport for wheezy: +backport for trixie: - debian/changelog: - * adjust version suffix from -X to -X~wheezy1 - * adjust suite from unstable to testing + * add new section with version suffix ...-X~deb13u1 and suite testing -backport for squeeze: +backport for bookworm: - debian/changelog: - * adjust version suffix from -X to -X~squeeze1 - * adjust suite from unstable to stable -- debian/control - * adjust Standards-Version from 3.9.3 to 3.9.1 - * replace libgmp10-dev by libgmp3-dev (twice) - * adjust debhelper minimum version from 9 to 8 -- debian/compat - * adjust debhelper compatibility version from 9 to 8 - - -Tags ----- - -svn copy $SVNROOT/branches/next/Maintenance/deb/sid/debian $SVNROOT/tags/debian/4.1-1 -m "Tag for revision 4.1-1" -svn copy $SVNROOT/branches/next/Maintenance/deb/wheezy/debian $SVNROOT/tags/debian/4.1-1~wheezy1 -m "Tag for revision 4.1-1~wheezy1" -svn copy $SVNROOT/branches/next/Maintenance/deb/squeeze/debian $SVNROOT/tags/debian/4.1-1~squeeze1 -m "Tag for revision 4.1-1~squeeze1" - - -FTP server ----------- - -# on my server -cd /var/tmp -tar xjf cgal.org-debian-repository.tar.bz2 -cd cgal.org-debian-repository -mv pool/main/c/cgal/* archive -reprepro -b . include wheezy|squeeze /path/to/*.changes -cd .. -tar cjf cgal.org-debian-repository.tar.bz2 cgal.org-debian-repository -cd cgal.org-debian-repository -rm -fr archive conf db -tar cjf /srv/www/www.joachim-reichel.de/tmp/cgal.tar.bz2 . -cd .. -rm -fr cgal.org-debian-repository - -# on MPI machine -cd /tmp -wget http://www.joachim-reichel.de/tmp/cgal.tar.bz2 -su cgal -cd /ftp/pub/outgoing/CGAL/debian -mv pool/main/c/cgal/* archive -rm -fr dists pool -tar xjf /tmp/cgal.tar.bz2 -# There should be 3 subdirectories "archive", "dists", and "pool" now. + * add new section with version suffix ...-X~deb12u1 and suite stable diff --git a/Maintenance/deb/TODO b/Maintenance/deb/TODO deleted file mode 100644 index d82dbbb34ce3..000000000000 --- a/Maintenance/deb/TODO +++ /dev/null @@ -1,3 +0,0 @@ -TODO -==== - diff --git a/Maintenance/deb/sid/debian/NEWS.Debian b/Maintenance/deb/sid/debian/NEWS.Debian deleted file mode 100644 index 938dde2d1feb..000000000000 --- a/Maintenance/deb/sid/debian/NEWS.Debian +++ /dev/null @@ -1,9 +0,0 @@ -cgal (4.2-1) unstable; urgency=low - - The Qt4 support library libCGAL_Qt4.so.10.0.0 has been moved from the package - libcgal10 to the new package libcgal-qt4-10. Similarly, the corresponding - headers and the static library have been moved from the package libcgal-dev - to the new package libcgal-qt4-dev. That is the packages libcgal10 and - libcgal-dev do not any longer depend on the Qt packages. - - -- Joachim Reichel Sun, 02 Sep 2012 12:31:08 +0200 diff --git a/Maintenance/deb/sid/debian/README.Debian b/Maintenance/deb/sid/debian/README.Debian deleted file mode 100644 index def38fe860be..000000000000 --- a/Maintenance/deb/sid/debian/README.Debian +++ /dev/null @@ -1,50 +0,0 @@ -README.Debian -------------- - -The homepage of CGAL (https://www.cgal.org/) offers more information about CGAL. -In particular, a mailing list and the documentation for the library (in PDF and -HTML) are available. The authors ask you to give some feedback about your usage -of CGAL in a short questionnaire (in the download section). - - -Documentation -------------- - -Note that the CGAL documentation cannot be packaged for Debian due to unclear -license conditions. The complete documentation in PDF and HTML is available at -https://www.cgal.org/. - - -Demos and examples ------------------- - -Tarballs with demos and examples can be found in /usr/share/doc/libcgal-demo. -Extract the tarballs somewhere and call "cmake ." to configure the -demos/examples. Call "make" to build them, either in the top-level directory -to build all demos/examples (which takes some time and needs quite some disk -space), or in the subdirectory of the desired demo/example. The cmake option --DCMAKE_VERBOSE_MAKEFILE=ON is useful to generate verbose makefiles that show -each executed command. - - -Demos using libQGLViewer ------------------------- - -The Debian package of libQGLViewer uses non-standard library names to offer the -library in a Qt3 and Qt4 flavor. The build system of CGAL has been patched to -handle the non-standard library name. If your libQGLViewer packages are older -than 2.3.1-4 you need to work around another problem with the non-standard -include directory. Create an include directory with the expected name -"QGLViewer", e.g., - - mkdir -p /some/dir - ln -s /usr/include/qglviewer-qt4 /some/dir/QGLViewer - -and pass the option - - -DQGLVIEWER_INCLUDE_DIR=/some/dir - -to cmake. See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=522659 for more -information. - - -- Joachim Reichel Sat, 06 Feb 2010 12:29:02 +0100 diff --git a/Maintenance/deb/sid/debian/README.source b/Maintenance/deb/sid/debian/README.source deleted file mode 100644 index 662cd01c5daf..000000000000 --- a/Maintenance/deb/sid/debian/README.source +++ /dev/null @@ -1,11 +0,0 @@ -normalize-audio for Debian --------------------------- - -This package uses quilt to manage all modifications to the upstream source. -Changes are stored in the source package as diffs in debian/patches and -applied during the build. - -See /usr/share/doc/quilt/README.source for a detailed explanation. - - -- Joachim Reichel Sun, 15 Jan 2012 14:38:04 +0100 - diff --git a/Maintenance/deb/sid/debian/changelog b/Maintenance/deb/sid/debian/changelog deleted file mode 100644 index aafd8ca8c0cc..000000000000 --- a/Maintenance/deb/sid/debian/changelog +++ /dev/null @@ -1,348 +0,0 @@ -cgal (4.1-1) unstable; urgency=low - - * New upstream release. - * Rename binary package libcgal9 to libcgal10 to reflect SONAME change. - * Configure CGAL using -DCGAL_ENABLE_PRECONFIG=OFF since we do not want - that the accidental presence of optional libraries (for demos and - examples) influences the build of the library. - * Move the Qt4 support library and the corresponding headers into new - binary packages libcgal-qt4-10 and libcgal-qt4-dev (Closes: #683214). - * Add libboost-system-dev to Builds-Depends: of cgal. - * Move libmpfi-dev from Suggests: of cgal-demo to Build-Depends: of cgal. - - -- Joachim Reichel Wed, 24 Oct 2012 19:08:35 +0200 - -cgal (4.0.2-1) unstable; urgency=low - - * New upstream release. - * Remove gcc-4.7 patch (fixed upstream). - - -- Joachim Reichel Wed, 04 Jul 2012 19:45:28 +0200 - -cgal (4.0-4) unstable; urgency=low - - * Add Suggests: libeigen3-dev (>= 3.1.0~beta1-1), libmpfi-dev to - libcgal-demo. - - -- Joachim Reichel Tue, 12 Jun 2012 23:53:14 +0200 - -cgal (4.0-3) unstable; urgency=low - - * Change Build-Depends: debhelper (>= 8) to debhelper (>= 9), update - debian/compat to get the default build flags for hardening. Inject - CPPFLAGS into CFLAGS and CXXFLAGS, since CPPFLAGS is ignored by cmake. - * Add lintian override to silence incorrect warnings about - hardening-no-fortify-functions for some libraries (all libraries are - built with the same flags). - - -- Joachim Reichel Sun, 10 Jun 2012 15:36:27 +0200 - -cgal (4.0-2) unstable; urgency=low - - * Add patch gcc-4.7 to fix a syntax error in template code which is - not instantiated during the package build itself (Closes: #673554). - * Fix debian/watch. - - -- Joachim Reichel Sun, 20 May 2012 22:47:56 +0200 - -cgal (4.0-1) unstable; urgency=low - - * New upstream release. - * Move from non-free to main due to upstream license change from QPL - to GPL 3+ (and from LGPL 2.1 to LGPL 3+), updated debian/copyright - accordingly. - * Rename binary package libcgal8 to libcgal9 to reflect SONAME change. - * Update Standards-Version to 3.9.3 (no changes needed). - * Remove fix-ipe-version-detection.dpatch and - fix-qt-moc-parse-error.dpatch (fixed upstream). - * Removed libmagick++9-dev from Suggests: of libcgal-demo, because - that package does no longer exists. - - -- Joachim Reichel Mon, 12 Mar 2012 19:14:55 +0100 - -cgal (3.9-4) unstable; urgency=low - - * Rebuild against boost 1.48 (Closes: #659358). - * Add fix-qt-moc-parse-error.dpatch as workaround for - https://bugreports.qt-project.org/browse/QTBUG-22829. - - -- Joachim Reichel Fri, 10 Feb 2012 22:41:26 +0100 - -cgal (3.9-3) unstable; urgency=low - - * Fix FTBFS when building only architecture dependent packages caused - by recent transition to the new packaging format (Closes: #658191). - - -- Joachim Reichel Wed, 01 Feb 2012 00:07:03 +0100 - -cgal (3.9-2) unstable; urgency=low - - * Changed packaging format to "3.0 (quilt)". - * Add fix-ipe-version-detection.dpatch: upstream patch for bug #643278. - Remove workaround. - * Tighten Depends: of libcgal-ipelets on ipe (Closes: #657720). - * Move libcgal-ipelets to Section: graphics. - * Add libqt4-opengl-dev to Suggests: of libcgal-demo. - - -- Joachim Reichel Mon, 30 Jan 2012 19:04:18 +0100 - -cgal (3.9-1) unstable; urgency=low - - * New upstream release. - * Rename binary package libcgal7 to libcgal8 to reflect SONAME change. - * Add workaround for bug #643278. - - -- Joachim Reichel Wed, 28 Sep 2011 19:51:35 +0200 - -cgal (3.8-1) unstable; urgency=low - - * New upstream release. - * Rename binary package libcgal6 to libcgal7 to reflect SONAME change. - * Update Standards-Version to 3.9.2 (no changes needed). - - -- Joachim Reichel Thu, 21 Apr 2011 18:45:25 +0200 - -cgal (3.7-5) unstable; urgency=low - - * Upload to unstable. - - -- Joachim Reichel Sun, 06 Mar 2011 17:26:11 +0100 - -cgal (3.7-4) experimental; urgency=low - - * Build with libgmp10 (Closes: #614797). Thanks to Christian M. Amsüss. - - -- Joachim Reichel Sun, 27 Feb 2011 16:36:22 +0100 - -cgal (3.7-3) unstable; urgency=low - - * Disable support for Qt3 because Qt3 has been removed from the repository - (Closes: #604478). - - -- Joachim Reichel Thu, 10 Feb 2011 21:06:09 +0100 - -cgal (3.7-2) unstable; urgency=low - - * Upload to unstable. - - -- Joachim Reichel Sun, 06 Feb 2011 13:53:00 +0100 - -cgal (3.7-1) experimental; urgency=low - - * New upstream release. - * Rename binary package libcgal5 to libcgal6 to reflect SONAME change. - * Rename binary package libcgal5-ipelets to libcgal-ipelets because it is - not possible to install the ipelets for different SONAMEs in parallel. - * Remove ipe-default-to-version-7.dpatch: the Ipe version is now - auto-detected. - * Remove fix-core-64bit.dpatch (fixed upstream). - * Add qt4-dev-tools to Suggests: of libcgal-demo for qcollectiongenerator. - * Update Standards-Version to 3.9.1 (-D_REENTRANT no longer needed). - - -- Joachim Reichel Sun, 17 Oct 2010 14:27:54 +0200 - -cgal (3.6.1-2) unstable; urgency=low - - * Add fix-core-64bit.dpatch: use CORE::CHUNK_BIT instead of hard-coded - constant 14. - - -- Joachim Reichel Tue, 24 Aug 2010 19:46:36 +0200 - -cgal (3.6.1-1) unstable; urgency=low - - * New upstream release. - * Set SOVERSION explicitly to 5.0.1 as told by upstream. - * Remove architecture exceptions from Suggests: for libcgal-demo which is no - longer allowed by dpkg-gencontrol (see #560071). - * Fix debian/watch file. - * Change license of packaging to LGPL 2.1 or later because referencing the - BSD license in /usr/share/common-licenses is deprecated. - * Update Standards-Version to 3.9.0 (no changes needed). - - -- Joachim Reichel Thu, 01 Jul 2010 23:37:41 +0200 - -cgal (3.6-1) unstable; urgency=low - - * New upstream release. - * Rename binary package libcgal4 to libcgal5 to reflect SONAME change. - * Remove fix-cmake-qglviewer-detection.dpatch (fixed upstream). - * New binary package libcgal5-ipelets which contains plugins for Ipe 7.x - (Closes: #557643). - * Add ipe-default-to-version-7.dpatch: change default of WITH_IPE_7 to ON. - * Remove libboost-graph1.35-dev from Build-Depends: and Suggests: of - libcgal-demo (not needed). - - -- Joachim Reichel Mon, 22 Mar 2010 19:09:15 +0100 - - -cgal (3.5.1-2) unstable; urgency=low - - * Add fix-cmake-qglviewer-detection.dpatch (Closes: #564126), thanks to - Marc Glisse for the patch. - * Update Standards-Version to 3.8.4 (no changes needed). - - -- Joachim Reichel Sat, 06 Feb 2010 12:29:02 +0100 - -cgal (3.5.1-1) unstable; urgency=low - - * New upstream release. - * Fix error in handling of "debug" and "nostrip" in $(DEB_BUILD_OPTIONS) - (see also #552961). - * Unset QTDIR before calling cmake to reduce problems in non-clean build - environments. - * Add ${misc:Depends} to Depends: of all binary packages as found by - lintian. - - -- Joachim Reichel Sun, 22 Nov 2009 22:31:00 +0100 - -cgal (3.5-1) unstable; urgency=low - - * New upstream release. - * Rename binary package libcgal3 to libcgal4 to reflect SONAME change. - * Remove fix-FindCGAL-cmake.dpatch (fixed upstream). - * Remove fix-demos-examples-configuration.dpatch (fixed upstream). - * Remove add-cmake-2.6.3-support.dpatch (fixed upstream). - * Remove fix-demo-polyheron-3.dpatch (fixed upstream). - * Remove "-mieee -mfp-rounding-mode=d" from CGAL_CXX_FLAGS on alpha - (fixed upstream). - - -- Joachim Reichel Sat, 03 Oct 2009 16:43:08 +0200 - -cgal (3.4-5) unstable; urgency=low - - * Return to unversioned boost dependencies. - * Re-add working watch file. - * Update Standards-Version to 3.8.3 (no changes needed). - - -- Joachim Reichel Wed, 16 Sep 2009 19:25:09 +0200 - -cgal (3.4-4) unstable; urgency=low - - * Add patch fix-demos-examples-configuration.dpatch. - * Add patch add-cmake-2.6.3-support.dpatch. - * Add patch fix-demo-polyheron-3.dpatch. - * Fix support for nocheck in DEB_BUILD_OPTIONS (was broken in 3.4-3). - - -- Joachim Reichel Fri, 01 May 2009 17:31:00 +0200 - -cgal (3.4-3) unstable; urgency=low - - * Update boost dependencies to 1.38. - * Remove watch file (new upstream location uses unpredictable paths). - * Update Standards-Version to 3.8.1 (add support for nocheck in - DEB_BUILD_OPTIONS). - * Change Suggests: dependency of libcgal-demo from libqglviewer-dev - to libqglviewer-qt4-dev (all demos using libQGLViewer use Qt4). - * Add workaround for #522659 to README.Debian. - - -- Joachim Reichel Sat, 18 Apr 2009 11:46:19 +0200 - -cgal (3.4-2) unstable; urgency=low - - * Add "-mieee -mfp-rounding-mode=d" to CGAL_CXX_FLAGS on alpha (got lost - during the transition to cmake). - - -- Joachim Reichel Sun, 15 Feb 2009 15:06:31 +0100 - -cgal (3.4-1) unstable; urgency=low - - * New upstream release. - * Adapt debian/rules to the new cmake-based build system. - * Downgrade LAPACK- and BLAS-related Build-Depends: to Suggests: for - libcgal-demo, since it is now possible to configure demos and examples - independently of the library. - - -- Joachim Reichel Thu, 22 Jan 2009 18:39:44 +0100 - -cgal (3.3.1-4) unstable; urgency=low - - * Remove fortran-transition.dpatch, update build-library.dpatch: - Do not link with -lg2c in configuration tests (Closes: #475721). - * Update cgal_create_makefile.dpatch to remove bashisms (Closes: #486045). - * Update debian/tests/rounding_modes2.cpp to stop constant propagation. - * Update Standards-Version to 3.8.0 (explain in debian/copyright why package - is in non-free). - - -- Joachim Reichel Sun, 15 Jun 2008 22:11:14 +0200 - -cgal (3.3.1-3) unstable; urgency=low - - * Add patch fortran-transition.dpatch (Closes: #470359), thanks to Kumar - Appaiah for the patch. - * debian/rules: s/lapack3-dev/liblapack-dev/, - s/atlas3-base-dev/libatlas-base-dev/, s/libatlas-3.so/libatlas.so.3gf/ . - * Fix manpage w.r.t. makefile vs. cgal.mk (Closes: #466430). - * Add second test for FPU rounding modes. - - -- Joachim Reichel Wed, 19 Mar 2008 20:27:34 +0100 - -cgal (3.3.1-2) unstable; urgency=low - - * debian/control: Really really drop support for atlas and lapack on arm - and m68k, fix atlas and lapack support on other architectures. - * debian/control: Extend exclusions for arm to variants armeb and armel - (Closes: #460141). - * debian/control: Remove virtual dependency liblapack-3.so which is - provided by atlas3-base-dev (which does *not* provide - /usr/lib/liblapack.so, just /usr/lib/atlas/liblapack.so). - * debian/control: Replace virtual dependency libblas-3.so by - libatlas-3.so. - * Add patch qt-compatibility-headers.dpatch (Closes: #464251). - * debian/control: Add Homepage: field, adjust Description: accordingly. - * Update Standards-Version to 3.7.3 (no changes needed). - - -- Joachim Reichel Wed, 06 Feb 2008 18:37:52 +0100 - -cgal (3.3.1-1) unstable; urgency=low - - * New upstream release. - * Remove patch bugfix-fpu-rounding-mode-alpha.dpatch (included by - upstream). - * Fail build if FPU rounding mode test fails. - * Really drop support for atlas and lapack on arm and m68k. - * Fix cgal_create_makefile w.r.t. makefile vs. cgal.mk. - - -- Joachim Reichel Mon, 3 Sep 2007 18:57:36 +0200 - -cgal (3.3-2) unstable; urgency=low - - * Add patch bugfix-fpu-rounding-mode-alpha.dpatch (Closes: #431230). - * debian/control: Add versioned depends on libboost-program-options-dev, - drop build-dependency on libboost-graph-dev. - * Drop support for atlas on arm and m68k. - - -- Joachim Reichel Mon, 16 Jul 2007 15:32:35 +0200 - -cgal (3.3-1) unstable; urgency=low - - * New upstream release. - - -- Joachim Reichel Sun, 3 Jun 2007 09:36:36 +0200 - -cgal (3.2.1-2) unstable; urgency=low - - * Fix FTBFS on hppa (and probably also on other architectures) related - to FPU rounding modes (Closes: #404464). - * debian/control: Add tag XS-Autobuild. - * debian/copyright: Add note about autobuilding. - * debian/control: Make package binNMU-safe. - * Remove linda override for bug #369977 (no longer needed). - * Add watch file. - - -- Joachim Reichel Fri, 26 Jan 2007 19:16:36 +0100 - -cgal (3.2.1-1) unstable; urgency=low - - * New upstream release. - * Add linda override for bug #369977. - * Remove patch bugfix-demo-examples-makefiles.dpatch (no longer needed). - - -- Joachim Reichel Fri, 14 Jul 2006 21:20:16 +0200 - -cgal (3.2-1) unstable; urgency=low - - * New upstream release. - * First upload to Debian archive. (Closes: #251885) - - -- Joachim Reichel Mon, 29 May 2006 20:24:27 +0200 -5~ diff --git a/Maintenance/deb/sid/debian/compat b/Maintenance/deb/sid/debian/compat deleted file mode 100644 index ec635144f600..000000000000 --- a/Maintenance/deb/sid/debian/compat +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/Maintenance/deb/sid/debian/control b/Maintenance/deb/sid/debian/control deleted file mode 100644 index 865bd762a156..000000000000 --- a/Maintenance/deb/sid/debian/control +++ /dev/null @@ -1,120 +0,0 @@ -Source: cgal -Priority: optional -Maintainer: Joachim Reichel -# "ipe" is only needed because it contains goodies.lua which is needed by FindIPE.cmake -Build-Depends: debhelper (>= 9), dpkg-awk, cmake, zlib1g-dev, libboost-dev, - libboost-thread-dev, libboost-program-options-dev, libboost-system-dev, - libgmp10-dev, libmpfr-dev, libmpfi-dev, libqt4-dev, libqt4-opengl-dev, - libipe-dev (>= 7), ipe -Standards-Version: 3.9.3 -Section: libs -Homepage: https://www.cgal.org/ -XS-Autobuild: yes - -Package: libcgal10 -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: C++ library for computational geometry - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - The CGAL library contains: - - the Kernel with geometric primitives such as points, vectors, lines, - predicates for testing things such as relative positions of points, and - operations such as intersections and distance calculation. - - the Basic Library which is a collection of standard data structures and - geometric algorithms, such as convex hull in 2D/3D, (Delaunay) - triangulation in 2D/3D, planar map, polyhedron, smallest enclosing circle, - and multidimensional query structures. - - the Support Library which offers interfaces to other packages, e.g., for - visualisation, and I/O, and other support facilities. - . - This package contains the main library libCGAL.so as well as two support - libraries libCGAL_Core.so (from the CORE project) and libCGAL_ImageIO.so - (image I/O). The library libCGAL_Qt4.so used for visualization in demos - can be found in the package libcgal-qt4-10. - -Package: libcgal-qt4-10 -Architecture: any -Depends: libcgal10 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Description: C++ library for computational geometry (support for Qt4) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - The CGAL library contains: - - the Kernel with geometric primitives such as points, vectors, lines, - predicates for testing things such as relative positions of points, and - operations such as intersections and distance calculation. - - the Basic Library which is a collection of standard data structures and - geometric algorithms, such as convex hull in 2D/3D, (Delaunay) - triangulation in 2D/3D, planar map, polyhedron, smallest enclosing circle, - and multidimensional query structures. - - the Support Library which offers interfaces to other packages, e.g., for - visualisation, and I/O, and other support facilities. - . - This package contains libCGAL_Qt4.so used for visualization in demos. - -Package: libcgal-dev -Section: libdevel -Architecture: any -Depends: libcgal10 (= ${binary:Version}), libboost-dev, libboost-thread-dev, - libboost-program-options-dev, libgmp10-dev, libmpfr-dev, zlib1g-dev, ${misc:Depends} -Description: C++ library for computational geometry (development files) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - This package contains the header files and static libraries for libCGAL.so, - libCGAL_Core.so, and libCGAL_ImageIO.so. The header files and static - libraries for libCGAL_Qt4.so can be found in the package libcgal-qt4-dev. - -Package: libcgal-qt4-dev -Section: libdevel -Architecture: any -Depends: libcgal10 (= ${binary:Version}), libcgal-qt4-10 (= ${binary:Version}), - libcgal-dev, libqt4-dev, ${misc:Depends} -Description: C++ library for computational geometry (development files, support for Qt4) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - This package contains the header files and static libraries for - libCGAL_Qt.so. - -Package: libcgal-demo -Section: devel -Architecture: all -Depends: libcgal-dev (>= ${binary:Version}), libcgal10 (>= ${binary:Version}), - ${misc:Depends} -Recommends: libcgal-qt4-dev (>= ${binary:Version}), libcgal10-qt4 (>= ${binary:Version}) -Suggests: liblapack-dev, libatlas-base-dev | libatlas.so.3gf, gfortran, - geomview, libqglviewer-qt4-dev, libipe-dev (>= 7), libglew1.5-dev | libglew-dev, - libmagick++-dev, qt4-dev-tools, libqt4-opengl-dev, libeigen3-dev (>= 3.1.0~beta1-1) -Description: C++ library for computational geometry (demos) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - This package contains the demos and examples. - -Package: libcgal-ipelets -Section: graphics -Architecture: any -Depends: libcgal10 (>= ${binary:Version}), ipe (>= ${Ipe-Version}), ipe (<< ${Ipe-Version}+), - ${shlibs:Depends}, ${misc:Depends} -Conflicts: libcgal5-ipelets -Replaces: libcgal5-ipelets -Description: C++ library for computational geometry (ipelets) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - This package contains the ipelets, i.e., plugins for ipe. diff --git a/Maintenance/deb/sid/debian/copyright b/Maintenance/deb/sid/debian/copyright deleted file mode 100644 index 382b30cd2b54..000000000000 --- a/Maintenance/deb/sid/debian/copyright +++ /dev/null @@ -1,351 +0,0 @@ -This package was debianized by Joachim Reichel on -Thu, 29 Apr 2004 18:43:18 +0200. - -It was downloaded from https://www.cgal.org/download/index.html. - -The Debian packaging is Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, -2010, 2011, 2012 Joachim Reichel and is licensed -under the LGPL license, version 2.1 or later (at your option), which can -be found in /usr/share/common-licenses/LGPL-2.1. - - - -Authors -======= - -Pierre Alliez -Matthias Bäsken -Eric Berberich -Olivier Billet -Jean-Daniel Boissonnat -Carine Bonetto -Mario Botsch -Hervé Brönnimann -Fernando Cacciola -Manuel Caroli -Nicolas Carrez -Frédéric Cazals -Raphaëlle Chaine -Tran Kai Frank Da -Christophe Delage -Olivier Devillers -Katrin Dobrindt -Arno Eigenwillig -Eti Ezra -Andreas Fabri -Frédéric Fichel -Kaspar Fischer -Eyal Flato -Julia Flötotto -Efi Fogel -Wolfgang Freiseisen -Bernd Gärtner -Geert-Jan Giezeman -Marc Glisse -Shlomo Golubev -Miguel Granados -Gael Guennebaud -Philippe Guigue -Ankit Gupta -Peter Hachenberger -Iddo Hanniel -Idit Haran -Sariel Har-Peled -Julien Hazebrouck -Michael Hemmer -Thomas Herrmann -Susan Hert -Shai Hirsch -Michael Hoffmann -Dominik Huelse -Marcel Janer -Athanasios Kakargias -Menelaos Karavelas -Michael Kerber -Lutz Kettner -Nico Kruithof -Sylvain Lazard -Eran Leiserowitz -Bruno Lévy -Sebastian Limbach -Kapelushnik Lior -Eugene Lipovetsky -Sébastien Loriot -Pedro Machado -Bastien Manuel -Naama Mayer -Abdelkrim Mebarki -Kurt Mehlhorn -Naceur Meskini -Andreas Meyer -Michal Meyerovitch -Oren Nechushtan -Gabriele Neyer -Ralf Osbild -Steve Oudot -Eli Packer -Dmitrii Pasechnik -Luis Peñaranda -Sylvain Pion -Marc Pouget -Sigal Raab -François Rebufat -Joachim Reichel -David Rey -Laurent Rineau -Daniel Russel -Niv Sabath -Laurent Saboret -Nader Salman -Stefan Schirra -Sven Schönherr -Michael Seel -Ophir Setter -Le-Jeng Shiue -Hans Tangelder -Stéphane Tayeb -Monique Teillaud -Jane Tournois -Constantinos Tsirogiannis -Radu Ursu -Carl Van Geem -Remco Veltkamp -Ron Wein -Wieger Wesselink -Camille Wormser -Mariette Yvinec -Afra Zomorodian -Guy Zucker -Baruch Zukerman -Tali Zvi - - - -Copyright holders -================= - -Utrecht University (The Netherlands) -ETH Zurich (Switzerland) -Freie Universitaet Berlin (Germany) -INRIA Sophia-Antipolis (France) -Martin-Luther-University Halle-Wittenberg (Germany) -Max-Planck-Institute Saarbruecken (Germany) -RISC Linz (Austria) -Tel-Aviv University (Israel) - -Stanford University (USA) -Foundation for Research and Technology-Hellas (Greece) - -GeometryFactory - -Fernando Luis Cacciola Carballal -Le-Jeng Shiue - - - -Copyright (from upstream file LICENSE) -====================================== - - The CGAL software consists of several parts, each of which is licensed under - an open source license. It is also possible to obtain commercial licenses - from GeometryFactory (www.geometryfactory.com) for all or parts of CGAL. - - The source code of the CGAL library can be found in the directories - "src/CGAL", "src/CGALQt", "src/CGALQt4" and "include/CGAL" (with the - exception of "include/CGAL/CORE"). - It is specified in each file of the CGAL library which - license applies to it. This is either the GNU General Public License - or 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). The texts of both licenses can be found in the files LICENSE.GPL - and LICENSE.LGPL. - - Distributed along with CGAL (for the users' convenience), but not part of - CGAL, are the following third-party libraries, available under their own - licenses: - - - CORE, in the directories "include/CGAL/CORE" and "src/CGALCore", is - licensed under the LGPL (see LICENSE.LGPL). - - ImageIO, in the directory "src/CGALimageIO", is licensed under the LGPL - (see LICENSE.LGPL). - - All other files that do not have an explicit copyright notice (e.g., all - examples and some demos) are licensed under a very permissive license. The - exact license text can be found in the file LICENSE.FREE_USE. - - More information on the CGAL license can be found at - https://www.cgal.org/license.html - - - -Copyright statements for LGPL'd files -===================================== - -The following copyright statement is taken from include/CGAL/config.h. The -year numbers and the set of copyright holders (see list above) varies from -file to file. - - Copyright (c) 1997-2010 - 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. - - - -Copyright statement for GPL'd files -=================================== - -The following copyright statement is taken from include/CGAL/Width_3.h. The -year numbers and the set of copyright holders (see list above) varies from -file to file. - - Copyright (c) 1997-2000 ETH Zurich (Switzerland). - 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. - - - -Copyright statement for files under the FREE_USE license -======================================================== - - Copyright (c) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007 - Utrecht University (The Netherlands), - ETH Zurich (Switzerland), - INRIA Sophia-Antipolis (France), - Max-Planck-Institute Saarbruecken (Germany), - and Tel-Aviv University (Israel). All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -The following copyright statements apply to third-party libraries -distributed with CGAL: - - - -Boost -===== - -The following files are modified versions originating from Boost: - - ./include/CGAL/STL_Extension/internal/boost/mutable_heap.hpp - ./include/CGAL/STL_Extension/internal/boost/array_binary_tree.hpp - ./include/CGAL/STL_Extension/internal/boost/mutable_queue.hpp - Copyright 1997, 1998, 1999, 2000 University of Notre Dame. - - ./include/CGAL/internal/container_fwd_fixed.hpp - Copyright 2005-2008 Daniel James. - - ./include/CGAL/auto_link/auto_link.h - (C) Copyright John Maddock 2003. - -All of these files are distributed under the Boost Software License, -version 1.0. - - Boost Software License - Version 1.0 - August 17th, 2003 - - Permission is hereby granted, free of charge, to any person or organization - obtaining a copy of the software and accompanying documentation covered by - this license (the "Software") to use, reproduce, display, distribute, - execute, and transmit the Software, and to prepare derivative works of the - Software, and to permit third-parties to whom the Software is furnished to - do so, all subject to the following: - - The copyright notices in the Software and this entire statement, including - the above license grant, this restriction and the following disclaimer, - must be included in all copies of the Software, in whole or in part, and - all derivative works of the Software, unless such copies or derivative - works are solely in the form of machine-executable object code generated by - a source language processor. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT - SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE - FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - - -CORE -==== - -The following copyright statement applies to the CORE library in -src/CGALCore and include/CGAL/CORE. - - Core Library Version 1.7, August 2004 - Copyright (c) 1995-2004 Exact Computation Project - All rights reserved. - - This file is part of CORE (https://cs.nyu.edu/exact/core/). - 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. - - - -ImageIO -======= - -The following copyright statement applies to the ImageIO library in -src/CGALimageIO. - - Copyright (c) 2005, 2006 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) - All rights reserved. - - The files in this directory are part of the ImageIO Library. - You can redistribute them and/or modify them 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. - - These files are provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. diff --git a/Maintenance/deb/sid/debian/libcgal-demo.install b/Maintenance/deb/sid/debian/libcgal-demo.install deleted file mode 100644 index 239a1b25f460..000000000000 --- a/Maintenance/deb/sid/debian/libcgal-demo.install +++ /dev/null @@ -1,2 +0,0 @@ -usr/share/doc/cgal/demo.tar.gz usr/share/doc/libcgal10 -usr/share/doc/cgal/examples.tar.gz usr/share/doc/libcgal10 diff --git a/Maintenance/deb/sid/debian/libcgal-dev.install b/Maintenance/deb/sid/debian/libcgal-dev.install deleted file mode 100644 index d1af7ba0074e..000000000000 --- a/Maintenance/deb/sid/debian/libcgal-dev.install +++ /dev/null @@ -1,11 +0,0 @@ -usr/bin/* -usr/include/* -usr/lib/libCGAL.a -usr/lib/libCGAL_Core.a -usr/lib/libCGAL_ImageIO.a -usr/lib/libCGAL.so -usr/lib/libCGAL_Core.so -usr/lib/libCGAL_ImageIO.so -usr/lib/CGAL/* -usr/share/cmake-2.8/Modules/* -usr/share/man/man1/cgal_create_cmake_script.1 diff --git a/Maintenance/deb/sid/debian/libcgal-ipelets.install b/Maintenance/deb/sid/debian/libcgal-ipelets.install deleted file mode 100644 index dc8f242677f5..000000000000 --- a/Maintenance/deb/sid/debian/libcgal-ipelets.install +++ /dev/null @@ -1,2 +0,0 @@ -# use wildcard to avoid hard-coding the Ipe version -usr/lib/ipe/* usr/lib/ipe diff --git a/Maintenance/deb/sid/debian/libcgal-ipelets.lintian-overrides b/Maintenance/deb/sid/debian/libcgal-ipelets.lintian-overrides deleted file mode 100644 index 1aa24c692516..000000000000 --- a/Maintenance/deb/sid/debian/libcgal-ipelets.lintian-overrides +++ /dev/null @@ -1 +0,0 @@ -libcgal-ipelets: hardening-no-fortify-functions usr/lib/ipe/*/ipelets/libCGAL_*.so diff --git a/Maintenance/deb/sid/debian/libcgal-qt4-10.install b/Maintenance/deb/sid/debian/libcgal-qt4-10.install deleted file mode 100644 index b748a7e2d96c..000000000000 --- a/Maintenance/deb/sid/debian/libcgal-qt4-10.install +++ /dev/null @@ -1 +0,0 @@ -usr/lib/libCGAL_Qt4.so.* usr/lib diff --git a/Maintenance/deb/sid/debian/libcgal-qt4-10.lintian-overrides b/Maintenance/deb/sid/debian/libcgal-qt4-10.lintian-overrides deleted file mode 100644 index 930bb4415eac..000000000000 --- a/Maintenance/deb/sid/debian/libcgal-qt4-10.lintian-overrides +++ /dev/null @@ -1 +0,0 @@ -libcgal-qt4-10: hardening-no-fortify-functions usr/lib/libCGAL_Qt4.so.* diff --git a/Maintenance/deb/sid/debian/libcgal-qt4-10.shlibs b/Maintenance/deb/sid/debian/libcgal-qt4-10.shlibs deleted file mode 100644 index 69742b6438b9..000000000000 --- a/Maintenance/deb/sid/debian/libcgal-qt4-10.shlibs +++ /dev/null @@ -1 +0,0 @@ -libCGAL_Qt4 10 libcgal-qt4-10 diff --git a/Maintenance/deb/sid/debian/libcgal-qt4-dev.install b/Maintenance/deb/sid/debian/libcgal-qt4-dev.install deleted file mode 100644 index 6fd829ac9226..000000000000 --- a/Maintenance/deb/sid/debian/libcgal-qt4-dev.install +++ /dev/null @@ -1,5 +0,0 @@ -# The next entry is disabled here because it overlaps with the corresponding -# entry in libcgal-dev.install. The files are moved in debian/rules. -# usr/include/CGAL/Qt -usr/lib/libCGAL_Qt4.a -usr/lib/libCGAL_Qt4.so diff --git a/Maintenance/deb/sid/debian/libcgal10.install b/Maintenance/deb/sid/debian/libcgal10.install deleted file mode 100644 index f383cfa6ebcd..000000000000 --- a/Maintenance/deb/sid/debian/libcgal10.install +++ /dev/null @@ -1,4 +0,0 @@ -usr/lib/libCGAL.so.* usr/lib -usr/lib/libCGAL_Core.so.* usr/lib -usr/lib/libCGAL_ImageIO.so.* usr/lib -usr/share/doc/cgal/changelog usr/share/doc/libcgal10 diff --git a/Maintenance/deb/sid/debian/libcgal10.lintian-overrides b/Maintenance/deb/sid/debian/libcgal10.lintian-overrides deleted file mode 100644 index 37afa24ac1b4..000000000000 --- a/Maintenance/deb/sid/debian/libcgal10.lintian-overrides +++ /dev/null @@ -1 +0,0 @@ -libcgal10: hardening-no-fortify-functions usr/lib/libCGAL.so.* diff --git a/Maintenance/deb/sid/debian/libcgal10.shlibs b/Maintenance/deb/sid/debian/libcgal10.shlibs deleted file mode 100644 index 395a4c6b5ffc..000000000000 --- a/Maintenance/deb/sid/debian/libcgal10.shlibs +++ /dev/null @@ -1,3 +0,0 @@ -libCGAL 10 libcgal10 -libCGAL_Core 10 libcgal10 -libCGAL_ImageIO 10 libcgal10 diff --git a/Maintenance/deb/sid/debian/patches/do-not-link-example-with-qt4-support-library.patch b/Maintenance/deb/sid/debian/patches/do-not-link-example-with-qt4-support-library.patch deleted file mode 100644 index 04b469305b88..000000000000 --- a/Maintenance/deb/sid/debian/patches/do-not-link-example-with-qt4-support-library.patch +++ /dev/null @@ -1,12 +0,0 @@ -Description: Avoid -lCGAL_Qt4 in linker command of Linear_cell_complex example ---- cgal-4.1~beta1.orig/examples/Linear_cell_complex/CMakeLists.txt -+++ cgal-4.1~beta1/examples/Linear_cell_complex/CMakeLists.txt -@@ -12,7 +12,7 @@ if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR - endif() - endif() - --find_package(CGAL QUIET COMPONENTS Core Qt4) -+find_package(CGAL QUIET COMPONENTS Core) - - # For Gprof. - # ADD_DEFINITIONS("-pg") diff --git a/Maintenance/deb/sid/debian/patches/series b/Maintenance/deb/sid/debian/patches/series deleted file mode 100644 index 68417a3f7a9d..000000000000 --- a/Maintenance/deb/sid/debian/patches/series +++ /dev/null @@ -1 +0,0 @@ -do-not-link-example-with-qt4-support-library.patch diff --git a/Maintenance/deb/sid/debian/rules b/Maintenance/deb/sid/debian/rules deleted file mode 100755 index a3533b8b2cbd..000000000000 --- a/Maintenance/deb/sid/debian/rules +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/make -f - -# export DH_VERBOSE=1 - -# See https://wiki.debian.org/Hardening#Notes_for_packages_using_CMake -CFLAGS := $(CFLAGS) $(CPPFLAGS) -CXXFLAGS := $(CXXFLAGS) $(CPPFLAGS) - -# The build system links all four libraries against all dependencies. -LDFLAGS += -Wl,--as-needed - -ifeq ($(DEB_BUILD_ARCH),alpha) - IEEE_FPU_OPTION = -mieee -mfp-rounding-mode=d -endif - -%: - dh $@ - -override_dh_auto_configure: - mkdir -p static - cd static && QTDIR= cmake .. \ - -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release \ - -DWITH_CGAL_Qt3=OFF -DWITH_demos=OFF -DWITH_examples=OFF \ - -DCGAL_ENABLE_PRECONFIG=OFF -DBUILD_SHARED_LIBS=FALSE - mkdir -p shared - cd shared && QTDIR= cmake .. \ - -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release \ - -DWITH_CGAL_Qt3=OFF -DWITH_demos=OFF -DWITH_examples=OFF \ - -DCGAL_ENABLE_PRECONFIG=OFF -DBUILD_SHARED_LIBS=TRUE -DCMAKE_SKIP_RPATH=TRUE - mkdir -p shared/demo/CGAL_ipelets - cd shared/demo/CGAL_ipelets && QTDIR= cmake ../../../demo/CGAL_ipelets \ - -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release \ - -DCGAL_DIR=$(CURDIR)/shared - -override_dh_auto_build: - $(MAKE) -C static - $(MAKE) -C shared - $(MAKE) -C shared/demo/CGAL_ipelets - -override_dh_auto_test: -ifneq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS))) - $(MAKE) -C debian/tests IEEE_FPU_OPTION="$(IEEE_FPU_OPTION)" rounding_modes1 - LD_LIBRARY_PATH=shared/lib debian/tests/rounding_modes1 - $(MAKE) -C debian/tests IEEE_FPU_OPTION="$(IEEE_FPU_OPTION)" rounding_modes2 - LD_LIBRARY_PATH=shared/lib debian/tests/rounding_modes2 -endif - -override_dh_auto_clean: - dh_auto_clean - rm -fr shared static - -override_dh_install: - $(MAKE) -C static DESTDIR=$(CURDIR)/debian/tmp install - $(MAKE) -C shared DESTDIR=$(CURDIR)/debian/tmp install - $(MAKE) -C shared/demo/CGAL_ipelets DESTDIR=$(CURDIR)/debian/tmp install - - mkdir -p debian/tmp/usr/share/cmake-2.8/Modules - cp cmake/modules/FindCGAL.cmake debian/tmp/usr/share/cmake-2.8/Modules - - mv debian/tmp/usr/share/doc/CGAL-`cat VERSION` debian/tmp/usr/share/doc/cgal - mv debian/tmp/usr/share/doc/cgal/CHANGES debian/tmp/usr/share/doc/cgal/changelog - rm debian/tmp/usr/share/doc/cgal/LICENSE* - rm debian/tmp/usr/share/doc/cgal/AUTHORS - - tar cf - examples | gzip --best >debian/tmp/usr/share/doc/cgal/examples.tar.gz - tar cf - demo | gzip --best >debian/tmp/usr/share/doc/cgal/demo.tar.gz - - rm debian/tmp/usr/bin/cgal_make_macosx_app - - dh_install --sourcedir=debian/tmp --list-missing - - mkdir -p debian/libcgal-qt4-dev/usr/include/CGAL - mv debian/libcgal-dev/usr/include/CGAL/Qt debian/libcgal-qt4-dev/usr/include/CGAL - - mkdir -p debian/libcgal-qt4-10/usr/share/doc - ln -s libcgal10 debian/libcgal-qt4-10/usr/share/doc/libcgal-qt4-10 - mkdir -p debian/libcgal-dev/usr/share/doc - ln -s libcgal10 debian/libcgal-dev/usr/share/doc/libcgal-dev - mkdir -p debian/libcgal-qt4-dev/usr/share/doc - ln -s libcgal10 debian/libcgal-qt4-dev/usr/share/doc/libcgal-qt4-dev - mkdir -p debian/libcgal-demo/usr/share/doc - ln -s libcgal10 debian/libcgal-demo/usr/share/doc/libcgal-demo - mkdir -p debian/libcgal-ipelets/usr/share/doc - ln -s libcgal10 debian/libcgal-ipelets/usr/share/doc/libcgal-ipelets - -override_dh_installdocs: - dh_installdocs -plibcgal10 debian/copyright - -override_dh_installchangelogs: - dh_installchangelogs -plibcgal10 - -override_dh_shlibdeps: # TODO Is that really needed? - dh_shlibdeps -a -ldebian/libcgal10/usr/lib - -override_dh_gencontrol: - dh_gencontrol -- -VIpe-Version=`dpkg-awk 'Package:^ipe$$' -- Version | grep Version | sed 's/Version: //;s/-[^-]*$$//'` diff --git a/Maintenance/deb/sid/debian/source/format b/Maintenance/deb/sid/debian/source/format deleted file mode 100644 index 163aaf8d82b6..000000000000 --- a/Maintenance/deb/sid/debian/source/format +++ /dev/null @@ -1 +0,0 @@ -3.0 (quilt) diff --git a/Maintenance/deb/sid/debian/tests/Makefile b/Maintenance/deb/sid/debian/tests/Makefile deleted file mode 100644 index 7f1b7c747e5f..000000000000 --- a/Maintenance/deb/sid/debian/tests/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -rounding_modes1: rounding_modes1.o - g++ $^ -o $@ - -rounding_modes2: rounding_modes2.o - g++ $^ -o $@ -lCGAL -L../../shared/lib - -rounding_modes1.o: rounding_modes1.cpp - g++ -c $< -o $@ -O2 -frounding-math $(IEEE_FPU_OPTION) - -rounding_modes2.o: rounding_modes2.cpp - g++ -c $< -o $@ -O2 -frounding-math $(IEEE_FPU_OPTION) -I../../include -I../../shared/include - -clean: - rm -f *.o rounding_modes1 rounding_modes2 diff --git a/Maintenance/deb/sid/debian/tests/rounding_modes1.cpp b/Maintenance/deb/sid/debian/tests/rounding_modes1.cpp deleted file mode 100644 index 0c497a77dc3d..000000000000 --- a/Maintenance/deb/sid/debian/tests/rounding_modes1.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include -#include - -int modes[4] = { FE_TOWARDZERO, FE_UPWARD, FE_DOWNWARD, FE_TONEAREST }; - -std::string str (int mode) -{ - switch (mode) - { - case FE_TOWARDZERO: return "FE_TOWARDZERO"; - case FE_UPWARD: return "FE_UPWARD"; - case FE_DOWNWARD: return "FE_DOWNWARD"; - case FE_TONEAREST: return "FE_TONEAREST"; - default: throw __LINE__; - } -} - -int fetestround () -{ - volatile double eps = std::numeric_limits::denorm_min(); - - double x = -1.0; - double y = 1.0; - volatile double x_plus_eps = x + eps; - volatile double y_minus_eps = y - eps; - - if ((x == x_plus_eps) && (y == y_minus_eps)) - return FE_TONEAREST; - if (y == y_minus_eps) - return FE_UPWARD; - if (x == x_plus_eps) - return FE_DOWNWARD; - return FE_TOWARDZERO; -} - -int main (int argc, char* argv[]) -{ - int errors = 0; - - int mode_get = fegetround(); - std::cout << "fegetround() = " << str(mode_get) << " " << std::endl; - - for (int i=0; i<4; i++) - { - int mode_set = modes[i]; - fesetround (mode_set); - std::cout << "fesetround (" << str(mode_set) << ")" << std::endl; - - int mode_get = fegetround(); - std::cout << "fegetround() = " << str(mode_get) << " "; - bool ok_get = mode_get == mode_set; - if (!ok_get) - errors++; - std::cout << (ok_get ? "(ok)" : "(error)") << std::endl; - - int mode_test = fetestround(); - std::cout << "fetestround() = " << str(mode_test) << " "; - bool ok_test = mode_test == mode_set; - if (!ok_test) - errors++; - std::cout << (ok_test ? "(ok)" : "(error)") << std::endl; - } - - return errors; -} diff --git a/Maintenance/deb/sid/debian/tests/rounding_modes2.cpp b/Maintenance/deb/sid/debian/tests/rounding_modes2.cpp deleted file mode 100644 index 7892a99a83be..000000000000 --- a/Maintenance/deb/sid/debian/tests/rounding_modes2.cpp +++ /dev/null @@ -1,95 +0,0 @@ -// This tests the rounding mode functions. - -#include -#include -#include - -typedef CGAL::Interval_nt_advanced NT_adv; -typedef CGAL::Interval_nt<> NT; - -void print_res (bool res) -{ std::cout << (res ? "ok" : "ERROR") << std::endl; } - -// The results of 1-epsilon and -1+epsilon are enough -// to detect exactly the current rounding mode. -// 1-MIN_DOUBLE -// +------+-------+ -// | 1 | 1-ulp | -// +--------+------+-------+ -// -1+MIN_DOUBLE | -1 | near | -inf | -// | -1+ulp | +inf | zero | -// +--------+------+-------+ - -// I use a global variable here to avoid constant propagation. -double IA_min_double; - -CGAL::FPU_CW_t -FPU_empiric_test() -{ - IA_min_double = CGAL_IA_STOP_CPROP(CGAL_IA_MIN_DOUBLE); - double y = 1.0, z = -1.0; - double ye, ze; - ye = y - IA_min_double; - ze = z + IA_min_double; - if (y == ye && z == ze) return CGAL_FE_TONEAREST; - if (y == ye) return CGAL_FE_UPWARD; - if (z == ze) return CGAL_FE_DOWNWARD; - return CGAL_FE_TOWARDZERO; -} - -void print_rounding_name (CGAL::FPU_CW_t r) -{ - switch (r) { - case CGAL_FE_TONEAREST: std::cout << "NEAR\n"; break; - case CGAL_FE_DOWNWARD: std::cout << "DOWN\n"; break; - case CGAL_FE_UPWARD: std::cout << "UP\n"; break; - case CGAL_FE_TOWARDZERO: std::cout << "ZERO\n"; break; - default: std::cout << "unknown !\n"; - } -} - -int main() -{ - bool flag = true; - - flag = flag && (FPU_empiric_test() == CGAL_FE_TONEAREST); - std::cout << "default: "; - print_res(flag); - - // Should be a no-op. - CGAL::FPU_set_cw(CGAL::FPU_get_cw()); - flag = flag && (FPU_empiric_test() == CGAL_FE_TONEAREST); - std::cout << "get/set: "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - // Rounding to zero. - CGAL::FPU_set_cw(CGAL_FE_TOWARDZERO); - flag = flag && (FPU_empiric_test() == CGAL_FE_TOWARDZERO); - std::cout << "zero : "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - // Rounding to infinity. - CGAL::FPU_set_cw(CGAL_FE_UPWARD); - flag = flag && (FPU_empiric_test() == CGAL_FE_UPWARD); - std::cout << "+inf : "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - // Rounding to minus infinity. - CGAL::FPU_set_cw(CGAL_FE_DOWNWARD); - flag = flag && (FPU_empiric_test() == CGAL_FE_DOWNWARD); - std::cout << "-inf : "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - // Rounding to nearest. - CGAL::FPU_set_cw(CGAL_FE_TONEAREST); - flag = flag && (FPU_empiric_test() == CGAL_FE_TONEAREST); - std::cout << "near : "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - return (int) !flag; -} diff --git a/Maintenance/deb/sid/debian/watch b/Maintenance/deb/sid/debian/watch deleted file mode 100644 index 36047492bc67..000000000000 --- a/Maintenance/deb/sid/debian/watch +++ /dev/null @@ -1,10 +0,0 @@ -# Note that the file URLs contain unpredictable IDs as directory. The -# uversionmagle options strips this ID. -# -# Note that only digits and "." are used to match the version number. -# Therefore we do not match beta releases. -# -version=3 -opts=uversionmangle=s/(\d+).([\d\.]+)/$2/ \ - https://gforge.inria.fr/frs/?group_id=52 \ - /frs/download.php/(\d+)/CGAL-([\d\.]+).tar.gz diff --git a/Maintenance/deb/squeeze/debian/NEWS.Debian b/Maintenance/deb/squeeze/debian/NEWS.Debian deleted file mode 100644 index 938dde2d1feb..000000000000 --- a/Maintenance/deb/squeeze/debian/NEWS.Debian +++ /dev/null @@ -1,9 +0,0 @@ -cgal (4.2-1) unstable; urgency=low - - The Qt4 support library libCGAL_Qt4.so.10.0.0 has been moved from the package - libcgal10 to the new package libcgal-qt4-10. Similarly, the corresponding - headers and the static library have been moved from the package libcgal-dev - to the new package libcgal-qt4-dev. That is the packages libcgal10 and - libcgal-dev do not any longer depend on the Qt packages. - - -- Joachim Reichel Sun, 02 Sep 2012 12:31:08 +0200 diff --git a/Maintenance/deb/squeeze/debian/README.Debian b/Maintenance/deb/squeeze/debian/README.Debian deleted file mode 100644 index def38fe860be..000000000000 --- a/Maintenance/deb/squeeze/debian/README.Debian +++ /dev/null @@ -1,50 +0,0 @@ -README.Debian -------------- - -The homepage of CGAL (https://www.cgal.org/) offers more information about CGAL. -In particular, a mailing list and the documentation for the library (in PDF and -HTML) are available. The authors ask you to give some feedback about your usage -of CGAL in a short questionnaire (in the download section). - - -Documentation -------------- - -Note that the CGAL documentation cannot be packaged for Debian due to unclear -license conditions. The complete documentation in PDF and HTML is available at -https://www.cgal.org/. - - -Demos and examples ------------------- - -Tarballs with demos and examples can be found in /usr/share/doc/libcgal-demo. -Extract the tarballs somewhere and call "cmake ." to configure the -demos/examples. Call "make" to build them, either in the top-level directory -to build all demos/examples (which takes some time and needs quite some disk -space), or in the subdirectory of the desired demo/example. The cmake option --DCMAKE_VERBOSE_MAKEFILE=ON is useful to generate verbose makefiles that show -each executed command. - - -Demos using libQGLViewer ------------------------- - -The Debian package of libQGLViewer uses non-standard library names to offer the -library in a Qt3 and Qt4 flavor. The build system of CGAL has been patched to -handle the non-standard library name. If your libQGLViewer packages are older -than 2.3.1-4 you need to work around another problem with the non-standard -include directory. Create an include directory with the expected name -"QGLViewer", e.g., - - mkdir -p /some/dir - ln -s /usr/include/qglviewer-qt4 /some/dir/QGLViewer - -and pass the option - - -DQGLVIEWER_INCLUDE_DIR=/some/dir - -to cmake. See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=522659 for more -information. - - -- Joachim Reichel Sat, 06 Feb 2010 12:29:02 +0100 diff --git a/Maintenance/deb/squeeze/debian/README.source b/Maintenance/deb/squeeze/debian/README.source deleted file mode 100644 index 662cd01c5daf..000000000000 --- a/Maintenance/deb/squeeze/debian/README.source +++ /dev/null @@ -1,11 +0,0 @@ -normalize-audio for Debian --------------------------- - -This package uses quilt to manage all modifications to the upstream source. -Changes are stored in the source package as diffs in debian/patches and -applied during the build. - -See /usr/share/doc/quilt/README.source for a detailed explanation. - - -- Joachim Reichel Sun, 15 Jan 2012 14:38:04 +0100 - diff --git a/Maintenance/deb/squeeze/debian/changelog b/Maintenance/deb/squeeze/debian/changelog deleted file mode 100644 index b13607d6678c..000000000000 --- a/Maintenance/deb/squeeze/debian/changelog +++ /dev/null @@ -1,348 +0,0 @@ -cgal (4.1-1~squeeze1) stable; urgency=low - - * New upstream release. - * Rename binary package libcgal9 to libcgal10 to reflect SONAME change. - * Configure CGAL using -DCGAL_ENABLE_PRECONFIG=OFF since we do not want - that the accidental presence of optional libraries (for demos and - examples) influences the build of the library. - * Move the Qt4 support library and the corresponding headers into new - binary packages libcgal-qt4-10 and libcgal-qt4-dev (Closes: #683214). - * Add libboost-system-dev to Builds-Depends: of cgal. - * Move libmpfi-dev from Suggests: of cgal-demo to Build-Depends: of cgal. - - -- Joachim Reichel Wed, 24 Oct 2012 19:08:35 +0200 - -cgal (4.0.2-1) unstable; urgency=low - - * New upstream release. - * Remove gcc-4.7 patch (fixed upstream). - - -- Joachim Reichel Wed, 04 Jul 2012 19:45:28 +0200 - -cgal (4.0-4) unstable; urgency=low - - * Add Suggests: libeigen3-dev (>= 3.1.0~beta1-1), libmpfi-dev to - libcgal-demo. - - -- Joachim Reichel Tue, 12 Jun 2012 23:53:14 +0200 - -cgal (4.0-3) unstable; urgency=low - - * Change Build-Depends: debhelper (>= 8) to debhelper (>= 9), update - debian/compat to get the default build flags for hardening. Inject - CPPFLAGS into CFLAGS and CXXFLAGS, since CPPFLAGS is ignored by cmake. - * Add lintian override to silence incorrect warnings about - hardening-no-fortify-functions for some libraries (all libraries are - built with the same flags). - - -- Joachim Reichel Sun, 10 Jun 2012 15:36:27 +0200 - -cgal (4.0-2) unstable; urgency=low - - * Add patch gcc-4.7 to fix a syntax error in template code which is - not instantiated during the package build itself (Closes: #673554). - * Fix debian/watch. - - -- Joachim Reichel Sun, 20 May 2012 22:47:56 +0200 - -cgal (4.0-1) unstable; urgency=low - - * New upstream release. - * Move from non-free to main due to upstream license change from QPL - to GPL 3+ (and from LGPL 2.1 to LGPL 3+), updated debian/copyright - accordingly. - * Rename binary package libcgal8 to libcgal9 to reflect SONAME change. - * Update Standards-Version to 3.9.3 (no changes needed). - * Remove fix-ipe-version-detection.dpatch and - fix-qt-moc-parse-error.dpatch (fixed upstream). - * Removed libmagick++9-dev from Suggests: of libcgal-demo, because - that package does no longer exists. - - -- Joachim Reichel Mon, 12 Mar 2012 19:14:55 +0100 - -cgal (3.9-4) unstable; urgency=low - - * Rebuild against boost 1.48 (Closes: #659358). - * Add fix-qt-moc-parse-error.dpatch as workaround for - https://bugreports.qt-project.org/browse/QTBUG-22829. - - -- Joachim Reichel Fri, 10 Feb 2012 22:41:26 +0100 - -cgal (3.9-3) unstable; urgency=low - - * Fix FTBFS when building only architecture dependent packages caused - by recent transition to the new packaging format (Closes: #658191). - - -- Joachim Reichel Wed, 01 Feb 2012 00:07:03 +0100 - -cgal (3.9-2) unstable; urgency=low - - * Changed packaging format to "3.0 (quilt)". - * Add fix-ipe-version-detection.dpatch: upstream patch for bug #643278. - Remove workaround. - * Tighten Depends: of libcgal-ipelets on ipe (Closes: #657720). - * Move libcgal-ipelets to Section: graphics. - * Add libqt4-opengl-dev to Suggests: of libcgal-demo. - - -- Joachim Reichel Mon, 30 Jan 2012 19:04:18 +0100 - -cgal (3.9-1) unstable; urgency=low - - * New upstream release. - * Rename binary package libcgal7 to libcgal8 to reflect SONAME change. - * Add workaround for bug #643278. - - -- Joachim Reichel Wed, 28 Sep 2011 19:51:35 +0200 - -cgal (3.8-1) unstable; urgency=low - - * New upstream release. - * Rename binary package libcgal6 to libcgal7 to reflect SONAME change. - * Update Standards-Version to 3.9.2 (no changes needed). - - -- Joachim Reichel Thu, 21 Apr 2011 18:45:25 +0200 - -cgal (3.7-5) unstable; urgency=low - - * Upload to unstable. - - -- Joachim Reichel Sun, 06 Mar 2011 17:26:11 +0100 - -cgal (3.7-4) experimental; urgency=low - - * Build with libgmp10 (Closes: #614797). Thanks to Christian M. Amsüss. - - -- Joachim Reichel Sun, 27 Feb 2011 16:36:22 +0100 - -cgal (3.7-3) unstable; urgency=low - - * Disable support for Qt3 because Qt3 has been removed from the repository - (Closes: #604478). - - -- Joachim Reichel Thu, 10 Feb 2011 21:06:09 +0100 - -cgal (3.7-2) unstable; urgency=low - - * Upload to unstable. - - -- Joachim Reichel Sun, 06 Feb 2011 13:53:00 +0100 - -cgal (3.7-1) experimental; urgency=low - - * New upstream release. - * Rename binary package libcgal5 to libcgal6 to reflect SONAME change. - * Rename binary package libcgal5-ipelets to libcgal-ipelets because it is - not possible to install the ipelets for different SONAMEs in parallel. - * Remove ipe-default-to-version-7.dpatch: the Ipe version is now - auto-detected. - * Remove fix-core-64bit.dpatch (fixed upstream). - * Add qt4-dev-tools to Suggests: of libcgal-demo for qcollectiongenerator. - * Update Standards-Version to 3.9.1 (-D_REENTRANT no longer needed). - - -- Joachim Reichel Sun, 17 Oct 2010 14:27:54 +0200 - -cgal (3.6.1-2) unstable; urgency=low - - * Add fix-core-64bit.dpatch: use CORE::CHUNK_BIT instead of hard-coded - constant 14. - - -- Joachim Reichel Tue, 24 Aug 2010 19:46:36 +0200 - -cgal (3.6.1-1) unstable; urgency=low - - * New upstream release. - * Set SOVERSION explicitly to 5.0.1 as told by upstream. - * Remove architecture exceptions from Suggests: for libcgal-demo which is no - longer allowed by dpkg-gencontrol (see #560071). - * Fix debian/watch file. - * Change license of packaging to LGPL 2.1 or later because referencing the - BSD license in /usr/share/common-licenses is deprecated. - * Update Standards-Version to 3.9.0 (no changes needed). - - -- Joachim Reichel Thu, 01 Jul 2010 23:37:41 +0200 - -cgal (3.6-1) unstable; urgency=low - - * New upstream release. - * Rename binary package libcgal4 to libcgal5 to reflect SONAME change. - * Remove fix-cmake-qglviewer-detection.dpatch (fixed upstream). - * New binary package libcgal5-ipelets which contains plugins for Ipe 7.x - (Closes: #557643). - * Add ipe-default-to-version-7.dpatch: change default of WITH_IPE_7 to ON. - * Remove libboost-graph1.35-dev from Build-Depends: and Suggests: of - libcgal-demo (not needed). - - -- Joachim Reichel Mon, 22 Mar 2010 19:09:15 +0100 - - -cgal (3.5.1-2) unstable; urgency=low - - * Add fix-cmake-qglviewer-detection.dpatch (Closes: #564126), thanks to - Marc Glisse for the patch. - * Update Standards-Version to 3.8.4 (no changes needed). - - -- Joachim Reichel Sat, 06 Feb 2010 12:29:02 +0100 - -cgal (3.5.1-1) unstable; urgency=low - - * New upstream release. - * Fix error in handling of "debug" and "nostrip" in $(DEB_BUILD_OPTIONS) - (see also #552961). - * Unset QTDIR before calling cmake to reduce problems in non-clean build - environments. - * Add ${misc:Depends} to Depends: of all binary packages as found by - lintian. - - -- Joachim Reichel Sun, 22 Nov 2009 22:31:00 +0100 - -cgal (3.5-1) unstable; urgency=low - - * New upstream release. - * Rename binary package libcgal3 to libcgal4 to reflect SONAME change. - * Remove fix-FindCGAL-cmake.dpatch (fixed upstream). - * Remove fix-demos-examples-configuration.dpatch (fixed upstream). - * Remove add-cmake-2.6.3-support.dpatch (fixed upstream). - * Remove fix-demo-polyheron-3.dpatch (fixed upstream). - * Remove "-mieee -mfp-rounding-mode=d" from CGAL_CXX_FLAGS on alpha - (fixed upstream). - - -- Joachim Reichel Sat, 03 Oct 2009 16:43:08 +0200 - -cgal (3.4-5) unstable; urgency=low - - * Return to unversioned boost dependencies. - * Re-add working watch file. - * Update Standards-Version to 3.8.3 (no changes needed). - - -- Joachim Reichel Wed, 16 Sep 2009 19:25:09 +0200 - -cgal (3.4-4) unstable; urgency=low - - * Add patch fix-demos-examples-configuration.dpatch. - * Add patch add-cmake-2.6.3-support.dpatch. - * Add patch fix-demo-polyheron-3.dpatch. - * Fix support for nocheck in DEB_BUILD_OPTIONS (was broken in 3.4-3). - - -- Joachim Reichel Fri, 01 May 2009 17:31:00 +0200 - -cgal (3.4-3) unstable; urgency=low - - * Update boost dependencies to 1.38. - * Remove watch file (new upstream location uses unpredictable paths). - * Update Standards-Version to 3.8.1 (add support for nocheck in - DEB_BUILD_OPTIONS). - * Change Suggests: dependency of libcgal-demo from libqglviewer-dev - to libqglviewer-qt4-dev (all demos using libQGLViewer use Qt4). - * Add workaround for #522659 to README.Debian. - - -- Joachim Reichel Sat, 18 Apr 2009 11:46:19 +0200 - -cgal (3.4-2) unstable; urgency=low - - * Add "-mieee -mfp-rounding-mode=d" to CGAL_CXX_FLAGS on alpha (got lost - during the transition to cmake). - - -- Joachim Reichel Sun, 15 Feb 2009 15:06:31 +0100 - -cgal (3.4-1) unstable; urgency=low - - * New upstream release. - * Adapt debian/rules to the new cmake-based build system. - * Downgrade LAPACK- and BLAS-related Build-Depends: to Suggests: for - libcgal-demo, since it is now possible to configure demos and examples - independently of the library. - - -- Joachim Reichel Thu, 22 Jan 2009 18:39:44 +0100 - -cgal (3.3.1-4) unstable; urgency=low - - * Remove fortran-transition.dpatch, update build-library.dpatch: - Do not link with -lg2c in configuration tests (Closes: #475721). - * Update cgal_create_makefile.dpatch to remove bashisms (Closes: #486045). - * Update debian/tests/rounding_modes2.cpp to stop constant propagation. - * Update Standards-Version to 3.8.0 (explain in debian/copyright why package - is in non-free). - - -- Joachim Reichel Sun, 15 Jun 2008 22:11:14 +0200 - -cgal (3.3.1-3) unstable; urgency=low - - * Add patch fortran-transition.dpatch (Closes: #470359), thanks to Kumar - Appaiah for the patch. - * debian/rules: s/lapack3-dev/liblapack-dev/, - s/atlas3-base-dev/libatlas-base-dev/, s/libatlas-3.so/libatlas.so.3gf/ . - * Fix manpage w.r.t. makefile vs. cgal.mk (Closes: #466430). - * Add second test for FPU rounding modes. - - -- Joachim Reichel Wed, 19 Mar 2008 20:27:34 +0100 - -cgal (3.3.1-2) unstable; urgency=low - - * debian/control: Really really drop support for atlas and lapack on arm - and m68k, fix atlas and lapack support on other architectures. - * debian/control: Extend exclusions for arm to variants armeb and armel - (Closes: #460141). - * debian/control: Remove virtual dependency liblapack-3.so which is - provided by atlas3-base-dev (which does *not* provide - /usr/lib/liblapack.so, just /usr/lib/atlas/liblapack.so). - * debian/control: Replace virtual dependency libblas-3.so by - libatlas-3.so. - * Add patch qt-compatibility-headers.dpatch (Closes: #464251). - * debian/control: Add Homepage: field, adjust Description: accordingly. - * Update Standards-Version to 3.7.3 (no changes needed). - - -- Joachim Reichel Wed, 06 Feb 2008 18:37:52 +0100 - -cgal (3.3.1-1) unstable; urgency=low - - * New upstream release. - * Remove patch bugfix-fpu-rounding-mode-alpha.dpatch (included by - upstream). - * Fail build if FPU rounding mode test fails. - * Really drop support for atlas and lapack on arm and m68k. - * Fix cgal_create_makefile w.r.t. makefile vs. cgal.mk. - - -- Joachim Reichel Mon, 3 Sep 2007 18:57:36 +0200 - -cgal (3.3-2) unstable; urgency=low - - * Add patch bugfix-fpu-rounding-mode-alpha.dpatch (Closes: #431230). - * debian/control: Add versioned depends on libboost-program-options-dev, - drop build-dependency on libboost-graph-dev. - * Drop support for atlas on arm and m68k. - - -- Joachim Reichel Mon, 16 Jul 2007 15:32:35 +0200 - -cgal (3.3-1) unstable; urgency=low - - * New upstream release. - - -- Joachim Reichel Sun, 3 Jun 2007 09:36:36 +0200 - -cgal (3.2.1-2) unstable; urgency=low - - * Fix FTBFS on hppa (and probably also on other architectures) related - to FPU rounding modes (Closes: #404464). - * debian/control: Add tag XS-Autobuild. - * debian/copyright: Add note about autobuilding. - * debian/control: Make package binNMU-safe. - * Remove linda override for bug #369977 (no longer needed). - * Add watch file. - - -- Joachim Reichel Fri, 26 Jan 2007 19:16:36 +0100 - -cgal (3.2.1-1) unstable; urgency=low - - * New upstream release. - * Add linda override for bug #369977. - * Remove patch bugfix-demo-examples-makefiles.dpatch (no longer needed). - - -- Joachim Reichel Fri, 14 Jul 2006 21:20:16 +0200 - -cgal (3.2-1) unstable; urgency=low - - * New upstream release. - * First upload to Debian archive. (Closes: #251885) - - -- Joachim Reichel Mon, 29 May 2006 20:24:27 +0200 -5~ diff --git a/Maintenance/deb/squeeze/debian/compat b/Maintenance/deb/squeeze/debian/compat deleted file mode 100644 index 45a4fb75db86..000000000000 --- a/Maintenance/deb/squeeze/debian/compat +++ /dev/null @@ -1 +0,0 @@ -8 diff --git a/Maintenance/deb/squeeze/debian/control b/Maintenance/deb/squeeze/debian/control deleted file mode 100644 index f2b2dc2a29f3..000000000000 --- a/Maintenance/deb/squeeze/debian/control +++ /dev/null @@ -1,120 +0,0 @@ -Source: cgal -Priority: optional -Maintainer: Joachim Reichel -# "ipe" is only needed because it contains goodies.lua which is needed by FindIPE.cmake -Build-Depends: debhelper (>= 8), dpkg-awk, cmake, zlib1g-dev, libboost-dev, - libboost-thread-dev, libboost-program-options-dev, libboost-system-dev, - libgmp3-dev, libmpfr-dev, libmpfi-dev, libqt4-dev, libqt4-opengl-dev, - libipe-dev (>= 7), ipe -Standards-Version: 3.9.1 -Section: libs -Homepage: https://www.cgal.org/ -XS-Autobuild: yes - -Package: libcgal10 -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: C++ library for computational geometry - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - The CGAL library contains: - - the Kernel with geometric primitives such as points, vectors, lines, - predicates for testing things such as relative positions of points, and - operations such as intersections and distance calculation. - - the Basic Library which is a collection of standard data structures and - geometric algorithms, such as convex hull in 2D/3D, (Delaunay) - triangulation in 2D/3D, planar map, polyhedron, smallest enclosing circle, - and multidimensional query structures. - - the Support Library which offers interfaces to other packages, e.g., for - visualisation, and I/O, and other support facilities. - . - This package contains the main library libCGAL.so as well as two support - libraries libCGAL_Core.so (from the CORE project) and libCGAL_ImageIO.so - (image I/O). The library libCGAL_Qt4.so used for visualization in demos - can be found in the package libcgal-qt4-10. - -Package: libcgal-qt4-10 -Architecture: any -Depends: libcgal10 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Description: C++ library for computational geometry (support for Qt4) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - The CGAL library contains: - - the Kernel with geometric primitives such as points, vectors, lines, - predicates for testing things such as relative positions of points, and - operations such as intersections and distance calculation. - - the Basic Library which is a collection of standard data structures and - geometric algorithms, such as convex hull in 2D/3D, (Delaunay) - triangulation in 2D/3D, planar map, polyhedron, smallest enclosing circle, - and multidimensional query structures. - - the Support Library which offers interfaces to other packages, e.g., for - visualisation, and I/O, and other support facilities. - . - This package contains libCGAL_Qt4.so used for visualization in demos. - -Package: libcgal-dev -Section: libdevel -Architecture: any -Depends: libcgal10 (= ${binary:Version}), libboost-dev, libboost-thread-dev, - libboost-program-options-dev, libgmp3-dev, libmpfr-dev, zlib1g-dev, ${misc:Depends} -Description: C++ library for computational geometry (development files) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - This package contains the header files and static libraries for libCGAL.so, - libCGAL_Core.so, and libCGAL_ImageIO.so. The header files and static - libraries for libCGAL_Qt4.so can be found in the package libcgal-qt4-dev. - -Package: libcgal-qt4-dev -Section: libdevel -Architecture: any -Depends: libcgal10 (= ${binary:Version}), libcgal-qt4-10 (= ${binary:Version}), - libcgal-dev, libqt4-dev, ${misc:Depends} -Description: C++ library for computational geometry (development files, support for Qt4) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - This package contains the header files and static libraries for - libCGAL_Qt.so. - -Package: libcgal-demo -Section: devel -Architecture: all -Depends: libcgal-dev (>= ${binary:Version}), libcgal10 (>= ${binary:Version}), - ${misc:Depends} -Recommends: libcgal-qt4-dev (>= ${binary:Version}), libcgal10-qt4 (>= ${binary:Version}) -Suggests: liblapack-dev, libatlas-base-dev | libatlas.so.3gf, gfortran, - geomview, libqglviewer-qt4-dev, libipe-dev (>= 7), libglew1.5-dev | libglew-dev, - libmagick++-dev, qt4-dev-tools, libqt4-opengl-dev, libeigen3-dev (>= 3.1.0~beta1-1) -Description: C++ library for computational geometry (demos) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - This package contains the demos and examples. - -Package: libcgal-ipelets -Section: graphics -Architecture: any -Depends: libcgal10 (>= ${binary:Version}), ipe (>= ${Ipe-Version}), ipe (<< ${Ipe-Version}+), - ${shlibs:Depends}, ${misc:Depends} -Conflicts: libcgal5-ipelets -Replaces: libcgal5-ipelets -Description: C++ library for computational geometry (ipelets) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - This package contains the ipelets, i.e., plugins for ipe. diff --git a/Maintenance/deb/squeeze/debian/copyright b/Maintenance/deb/squeeze/debian/copyright deleted file mode 100644 index 382b30cd2b54..000000000000 --- a/Maintenance/deb/squeeze/debian/copyright +++ /dev/null @@ -1,351 +0,0 @@ -This package was debianized by Joachim Reichel on -Thu, 29 Apr 2004 18:43:18 +0200. - -It was downloaded from https://www.cgal.org/download/index.html. - -The Debian packaging is Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, -2010, 2011, 2012 Joachim Reichel and is licensed -under the LGPL license, version 2.1 or later (at your option), which can -be found in /usr/share/common-licenses/LGPL-2.1. - - - -Authors -======= - -Pierre Alliez -Matthias Bäsken -Eric Berberich -Olivier Billet -Jean-Daniel Boissonnat -Carine Bonetto -Mario Botsch -Hervé Brönnimann -Fernando Cacciola -Manuel Caroli -Nicolas Carrez -Frédéric Cazals -Raphaëlle Chaine -Tran Kai Frank Da -Christophe Delage -Olivier Devillers -Katrin Dobrindt -Arno Eigenwillig -Eti Ezra -Andreas Fabri -Frédéric Fichel -Kaspar Fischer -Eyal Flato -Julia Flötotto -Efi Fogel -Wolfgang Freiseisen -Bernd Gärtner -Geert-Jan Giezeman -Marc Glisse -Shlomo Golubev -Miguel Granados -Gael Guennebaud -Philippe Guigue -Ankit Gupta -Peter Hachenberger -Iddo Hanniel -Idit Haran -Sariel Har-Peled -Julien Hazebrouck -Michael Hemmer -Thomas Herrmann -Susan Hert -Shai Hirsch -Michael Hoffmann -Dominik Huelse -Marcel Janer -Athanasios Kakargias -Menelaos Karavelas -Michael Kerber -Lutz Kettner -Nico Kruithof -Sylvain Lazard -Eran Leiserowitz -Bruno Lévy -Sebastian Limbach -Kapelushnik Lior -Eugene Lipovetsky -Sébastien Loriot -Pedro Machado -Bastien Manuel -Naama Mayer -Abdelkrim Mebarki -Kurt Mehlhorn -Naceur Meskini -Andreas Meyer -Michal Meyerovitch -Oren Nechushtan -Gabriele Neyer -Ralf Osbild -Steve Oudot -Eli Packer -Dmitrii Pasechnik -Luis Peñaranda -Sylvain Pion -Marc Pouget -Sigal Raab -François Rebufat -Joachim Reichel -David Rey -Laurent Rineau -Daniel Russel -Niv Sabath -Laurent Saboret -Nader Salman -Stefan Schirra -Sven Schönherr -Michael Seel -Ophir Setter -Le-Jeng Shiue -Hans Tangelder -Stéphane Tayeb -Monique Teillaud -Jane Tournois -Constantinos Tsirogiannis -Radu Ursu -Carl Van Geem -Remco Veltkamp -Ron Wein -Wieger Wesselink -Camille Wormser -Mariette Yvinec -Afra Zomorodian -Guy Zucker -Baruch Zukerman -Tali Zvi - - - -Copyright holders -================= - -Utrecht University (The Netherlands) -ETH Zurich (Switzerland) -Freie Universitaet Berlin (Germany) -INRIA Sophia-Antipolis (France) -Martin-Luther-University Halle-Wittenberg (Germany) -Max-Planck-Institute Saarbruecken (Germany) -RISC Linz (Austria) -Tel-Aviv University (Israel) - -Stanford University (USA) -Foundation for Research and Technology-Hellas (Greece) - -GeometryFactory - -Fernando Luis Cacciola Carballal -Le-Jeng Shiue - - - -Copyright (from upstream file LICENSE) -====================================== - - The CGAL software consists of several parts, each of which is licensed under - an open source license. It is also possible to obtain commercial licenses - from GeometryFactory (www.geometryfactory.com) for all or parts of CGAL. - - The source code of the CGAL library can be found in the directories - "src/CGAL", "src/CGALQt", "src/CGALQt4" and "include/CGAL" (with the - exception of "include/CGAL/CORE"). - It is specified in each file of the CGAL library which - license applies to it. This is either the GNU General Public License - or 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). The texts of both licenses can be found in the files LICENSE.GPL - and LICENSE.LGPL. - - Distributed along with CGAL (for the users' convenience), but not part of - CGAL, are the following third-party libraries, available under their own - licenses: - - - CORE, in the directories "include/CGAL/CORE" and "src/CGALCore", is - licensed under the LGPL (see LICENSE.LGPL). - - ImageIO, in the directory "src/CGALimageIO", is licensed under the LGPL - (see LICENSE.LGPL). - - All other files that do not have an explicit copyright notice (e.g., all - examples and some demos) are licensed under a very permissive license. The - exact license text can be found in the file LICENSE.FREE_USE. - - More information on the CGAL license can be found at - https://www.cgal.org/license.html - - - -Copyright statements for LGPL'd files -===================================== - -The following copyright statement is taken from include/CGAL/config.h. The -year numbers and the set of copyright holders (see list above) varies from -file to file. - - Copyright (c) 1997-2010 - 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. - - - -Copyright statement for GPL'd files -=================================== - -The following copyright statement is taken from include/CGAL/Width_3.h. The -year numbers and the set of copyright holders (see list above) varies from -file to file. - - Copyright (c) 1997-2000 ETH Zurich (Switzerland). - 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. - - - -Copyright statement for files under the FREE_USE license -======================================================== - - Copyright (c) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007 - Utrecht University (The Netherlands), - ETH Zurich (Switzerland), - INRIA Sophia-Antipolis (France), - Max-Planck-Institute Saarbruecken (Germany), - and Tel-Aviv University (Israel). All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -The following copyright statements apply to third-party libraries -distributed with CGAL: - - - -Boost -===== - -The following files are modified versions originating from Boost: - - ./include/CGAL/STL_Extension/internal/boost/mutable_heap.hpp - ./include/CGAL/STL_Extension/internal/boost/array_binary_tree.hpp - ./include/CGAL/STL_Extension/internal/boost/mutable_queue.hpp - Copyright 1997, 1998, 1999, 2000 University of Notre Dame. - - ./include/CGAL/internal/container_fwd_fixed.hpp - Copyright 2005-2008 Daniel James. - - ./include/CGAL/auto_link/auto_link.h - (C) Copyright John Maddock 2003. - -All of these files are distributed under the Boost Software License, -version 1.0. - - Boost Software License - Version 1.0 - August 17th, 2003 - - Permission is hereby granted, free of charge, to any person or organization - obtaining a copy of the software and accompanying documentation covered by - this license (the "Software") to use, reproduce, display, distribute, - execute, and transmit the Software, and to prepare derivative works of the - Software, and to permit third-parties to whom the Software is furnished to - do so, all subject to the following: - - The copyright notices in the Software and this entire statement, including - the above license grant, this restriction and the following disclaimer, - must be included in all copies of the Software, in whole or in part, and - all derivative works of the Software, unless such copies or derivative - works are solely in the form of machine-executable object code generated by - a source language processor. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT - SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE - FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - - -CORE -==== - -The following copyright statement applies to the CORE library in -src/CGALCore and include/CGAL/CORE. - - Core Library Version 1.7, August 2004 - Copyright (c) 1995-2004 Exact Computation Project - All rights reserved. - - This file is part of CORE (https://cs.nyu.edu/exact/core/). - 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. - - - -ImageIO -======= - -The following copyright statement applies to the ImageIO library in -src/CGALimageIO. - - Copyright (c) 2005, 2006 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) - All rights reserved. - - The files in this directory are part of the ImageIO Library. - You can redistribute them and/or modify them 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. - - These files are provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. diff --git a/Maintenance/deb/squeeze/debian/libcgal-demo.install b/Maintenance/deb/squeeze/debian/libcgal-demo.install deleted file mode 100644 index 239a1b25f460..000000000000 --- a/Maintenance/deb/squeeze/debian/libcgal-demo.install +++ /dev/null @@ -1,2 +0,0 @@ -usr/share/doc/cgal/demo.tar.gz usr/share/doc/libcgal10 -usr/share/doc/cgal/examples.tar.gz usr/share/doc/libcgal10 diff --git a/Maintenance/deb/squeeze/debian/libcgal-dev.install b/Maintenance/deb/squeeze/debian/libcgal-dev.install deleted file mode 100644 index d1af7ba0074e..000000000000 --- a/Maintenance/deb/squeeze/debian/libcgal-dev.install +++ /dev/null @@ -1,11 +0,0 @@ -usr/bin/* -usr/include/* -usr/lib/libCGAL.a -usr/lib/libCGAL_Core.a -usr/lib/libCGAL_ImageIO.a -usr/lib/libCGAL.so -usr/lib/libCGAL_Core.so -usr/lib/libCGAL_ImageIO.so -usr/lib/CGAL/* -usr/share/cmake-2.8/Modules/* -usr/share/man/man1/cgal_create_cmake_script.1 diff --git a/Maintenance/deb/squeeze/debian/libcgal-ipelets.install b/Maintenance/deb/squeeze/debian/libcgal-ipelets.install deleted file mode 100644 index dc8f242677f5..000000000000 --- a/Maintenance/deb/squeeze/debian/libcgal-ipelets.install +++ /dev/null @@ -1,2 +0,0 @@ -# use wildcard to avoid hard-coding the Ipe version -usr/lib/ipe/* usr/lib/ipe diff --git a/Maintenance/deb/squeeze/debian/libcgal-ipelets.lintian-overrides b/Maintenance/deb/squeeze/debian/libcgal-ipelets.lintian-overrides deleted file mode 100644 index 1aa24c692516..000000000000 --- a/Maintenance/deb/squeeze/debian/libcgal-ipelets.lintian-overrides +++ /dev/null @@ -1 +0,0 @@ -libcgal-ipelets: hardening-no-fortify-functions usr/lib/ipe/*/ipelets/libCGAL_*.so diff --git a/Maintenance/deb/squeeze/debian/libcgal-qt4-10.install b/Maintenance/deb/squeeze/debian/libcgal-qt4-10.install deleted file mode 100644 index b748a7e2d96c..000000000000 --- a/Maintenance/deb/squeeze/debian/libcgal-qt4-10.install +++ /dev/null @@ -1 +0,0 @@ -usr/lib/libCGAL_Qt4.so.* usr/lib diff --git a/Maintenance/deb/squeeze/debian/libcgal-qt4-10.lintian-overrides b/Maintenance/deb/squeeze/debian/libcgal-qt4-10.lintian-overrides deleted file mode 100644 index 930bb4415eac..000000000000 --- a/Maintenance/deb/squeeze/debian/libcgal-qt4-10.lintian-overrides +++ /dev/null @@ -1 +0,0 @@ -libcgal-qt4-10: hardening-no-fortify-functions usr/lib/libCGAL_Qt4.so.* diff --git a/Maintenance/deb/squeeze/debian/libcgal-qt4-10.shlibs b/Maintenance/deb/squeeze/debian/libcgal-qt4-10.shlibs deleted file mode 100644 index 69742b6438b9..000000000000 --- a/Maintenance/deb/squeeze/debian/libcgal-qt4-10.shlibs +++ /dev/null @@ -1 +0,0 @@ -libCGAL_Qt4 10 libcgal-qt4-10 diff --git a/Maintenance/deb/squeeze/debian/libcgal-qt4-dev.install b/Maintenance/deb/squeeze/debian/libcgal-qt4-dev.install deleted file mode 100644 index 6fd829ac9226..000000000000 --- a/Maintenance/deb/squeeze/debian/libcgal-qt4-dev.install +++ /dev/null @@ -1,5 +0,0 @@ -# The next entry is disabled here because it overlaps with the corresponding -# entry in libcgal-dev.install. The files are moved in debian/rules. -# usr/include/CGAL/Qt -usr/lib/libCGAL_Qt4.a -usr/lib/libCGAL_Qt4.so diff --git a/Maintenance/deb/squeeze/debian/libcgal10.install b/Maintenance/deb/squeeze/debian/libcgal10.install deleted file mode 100644 index f383cfa6ebcd..000000000000 --- a/Maintenance/deb/squeeze/debian/libcgal10.install +++ /dev/null @@ -1,4 +0,0 @@ -usr/lib/libCGAL.so.* usr/lib -usr/lib/libCGAL_Core.so.* usr/lib -usr/lib/libCGAL_ImageIO.so.* usr/lib -usr/share/doc/cgal/changelog usr/share/doc/libcgal10 diff --git a/Maintenance/deb/squeeze/debian/libcgal10.lintian-overrides b/Maintenance/deb/squeeze/debian/libcgal10.lintian-overrides deleted file mode 100644 index 37afa24ac1b4..000000000000 --- a/Maintenance/deb/squeeze/debian/libcgal10.lintian-overrides +++ /dev/null @@ -1 +0,0 @@ -libcgal10: hardening-no-fortify-functions usr/lib/libCGAL.so.* diff --git a/Maintenance/deb/squeeze/debian/libcgal10.shlibs b/Maintenance/deb/squeeze/debian/libcgal10.shlibs deleted file mode 100644 index 395a4c6b5ffc..000000000000 --- a/Maintenance/deb/squeeze/debian/libcgal10.shlibs +++ /dev/null @@ -1,3 +0,0 @@ -libCGAL 10 libcgal10 -libCGAL_Core 10 libcgal10 -libCGAL_ImageIO 10 libcgal10 diff --git a/Maintenance/deb/squeeze/debian/patches/do-not-link-example-with-qt4-support-library.patch b/Maintenance/deb/squeeze/debian/patches/do-not-link-example-with-qt4-support-library.patch deleted file mode 100644 index 04b469305b88..000000000000 --- a/Maintenance/deb/squeeze/debian/patches/do-not-link-example-with-qt4-support-library.patch +++ /dev/null @@ -1,12 +0,0 @@ -Description: Avoid -lCGAL_Qt4 in linker command of Linear_cell_complex example ---- cgal-4.1~beta1.orig/examples/Linear_cell_complex/CMakeLists.txt -+++ cgal-4.1~beta1/examples/Linear_cell_complex/CMakeLists.txt -@@ -12,7 +12,7 @@ if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR - endif() - endif() - --find_package(CGAL QUIET COMPONENTS Core Qt4) -+find_package(CGAL QUIET COMPONENTS Core) - - # For Gprof. - # ADD_DEFINITIONS("-pg") diff --git a/Maintenance/deb/squeeze/debian/patches/series b/Maintenance/deb/squeeze/debian/patches/series deleted file mode 100644 index 68417a3f7a9d..000000000000 --- a/Maintenance/deb/squeeze/debian/patches/series +++ /dev/null @@ -1 +0,0 @@ -do-not-link-example-with-qt4-support-library.patch diff --git a/Maintenance/deb/squeeze/debian/rules b/Maintenance/deb/squeeze/debian/rules deleted file mode 100755 index a3533b8b2cbd..000000000000 --- a/Maintenance/deb/squeeze/debian/rules +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/make -f - -# export DH_VERBOSE=1 - -# See https://wiki.debian.org/Hardening#Notes_for_packages_using_CMake -CFLAGS := $(CFLAGS) $(CPPFLAGS) -CXXFLAGS := $(CXXFLAGS) $(CPPFLAGS) - -# The build system links all four libraries against all dependencies. -LDFLAGS += -Wl,--as-needed - -ifeq ($(DEB_BUILD_ARCH),alpha) - IEEE_FPU_OPTION = -mieee -mfp-rounding-mode=d -endif - -%: - dh $@ - -override_dh_auto_configure: - mkdir -p static - cd static && QTDIR= cmake .. \ - -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release \ - -DWITH_CGAL_Qt3=OFF -DWITH_demos=OFF -DWITH_examples=OFF \ - -DCGAL_ENABLE_PRECONFIG=OFF -DBUILD_SHARED_LIBS=FALSE - mkdir -p shared - cd shared && QTDIR= cmake .. \ - -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release \ - -DWITH_CGAL_Qt3=OFF -DWITH_demos=OFF -DWITH_examples=OFF \ - -DCGAL_ENABLE_PRECONFIG=OFF -DBUILD_SHARED_LIBS=TRUE -DCMAKE_SKIP_RPATH=TRUE - mkdir -p shared/demo/CGAL_ipelets - cd shared/demo/CGAL_ipelets && QTDIR= cmake ../../../demo/CGAL_ipelets \ - -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release \ - -DCGAL_DIR=$(CURDIR)/shared - -override_dh_auto_build: - $(MAKE) -C static - $(MAKE) -C shared - $(MAKE) -C shared/demo/CGAL_ipelets - -override_dh_auto_test: -ifneq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS))) - $(MAKE) -C debian/tests IEEE_FPU_OPTION="$(IEEE_FPU_OPTION)" rounding_modes1 - LD_LIBRARY_PATH=shared/lib debian/tests/rounding_modes1 - $(MAKE) -C debian/tests IEEE_FPU_OPTION="$(IEEE_FPU_OPTION)" rounding_modes2 - LD_LIBRARY_PATH=shared/lib debian/tests/rounding_modes2 -endif - -override_dh_auto_clean: - dh_auto_clean - rm -fr shared static - -override_dh_install: - $(MAKE) -C static DESTDIR=$(CURDIR)/debian/tmp install - $(MAKE) -C shared DESTDIR=$(CURDIR)/debian/tmp install - $(MAKE) -C shared/demo/CGAL_ipelets DESTDIR=$(CURDIR)/debian/tmp install - - mkdir -p debian/tmp/usr/share/cmake-2.8/Modules - cp cmake/modules/FindCGAL.cmake debian/tmp/usr/share/cmake-2.8/Modules - - mv debian/tmp/usr/share/doc/CGAL-`cat VERSION` debian/tmp/usr/share/doc/cgal - mv debian/tmp/usr/share/doc/cgal/CHANGES debian/tmp/usr/share/doc/cgal/changelog - rm debian/tmp/usr/share/doc/cgal/LICENSE* - rm debian/tmp/usr/share/doc/cgal/AUTHORS - - tar cf - examples | gzip --best >debian/tmp/usr/share/doc/cgal/examples.tar.gz - tar cf - demo | gzip --best >debian/tmp/usr/share/doc/cgal/demo.tar.gz - - rm debian/tmp/usr/bin/cgal_make_macosx_app - - dh_install --sourcedir=debian/tmp --list-missing - - mkdir -p debian/libcgal-qt4-dev/usr/include/CGAL - mv debian/libcgal-dev/usr/include/CGAL/Qt debian/libcgal-qt4-dev/usr/include/CGAL - - mkdir -p debian/libcgal-qt4-10/usr/share/doc - ln -s libcgal10 debian/libcgal-qt4-10/usr/share/doc/libcgal-qt4-10 - mkdir -p debian/libcgal-dev/usr/share/doc - ln -s libcgal10 debian/libcgal-dev/usr/share/doc/libcgal-dev - mkdir -p debian/libcgal-qt4-dev/usr/share/doc - ln -s libcgal10 debian/libcgal-qt4-dev/usr/share/doc/libcgal-qt4-dev - mkdir -p debian/libcgal-demo/usr/share/doc - ln -s libcgal10 debian/libcgal-demo/usr/share/doc/libcgal-demo - mkdir -p debian/libcgal-ipelets/usr/share/doc - ln -s libcgal10 debian/libcgal-ipelets/usr/share/doc/libcgal-ipelets - -override_dh_installdocs: - dh_installdocs -plibcgal10 debian/copyright - -override_dh_installchangelogs: - dh_installchangelogs -plibcgal10 - -override_dh_shlibdeps: # TODO Is that really needed? - dh_shlibdeps -a -ldebian/libcgal10/usr/lib - -override_dh_gencontrol: - dh_gencontrol -- -VIpe-Version=`dpkg-awk 'Package:^ipe$$' -- Version | grep Version | sed 's/Version: //;s/-[^-]*$$//'` diff --git a/Maintenance/deb/squeeze/debian/source/format b/Maintenance/deb/squeeze/debian/source/format deleted file mode 100644 index 163aaf8d82b6..000000000000 --- a/Maintenance/deb/squeeze/debian/source/format +++ /dev/null @@ -1 +0,0 @@ -3.0 (quilt) diff --git a/Maintenance/deb/squeeze/debian/tests/Makefile b/Maintenance/deb/squeeze/debian/tests/Makefile deleted file mode 100644 index 7f1b7c747e5f..000000000000 --- a/Maintenance/deb/squeeze/debian/tests/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -rounding_modes1: rounding_modes1.o - g++ $^ -o $@ - -rounding_modes2: rounding_modes2.o - g++ $^ -o $@ -lCGAL -L../../shared/lib - -rounding_modes1.o: rounding_modes1.cpp - g++ -c $< -o $@ -O2 -frounding-math $(IEEE_FPU_OPTION) - -rounding_modes2.o: rounding_modes2.cpp - g++ -c $< -o $@ -O2 -frounding-math $(IEEE_FPU_OPTION) -I../../include -I../../shared/include - -clean: - rm -f *.o rounding_modes1 rounding_modes2 diff --git a/Maintenance/deb/squeeze/debian/tests/rounding_modes1.cpp b/Maintenance/deb/squeeze/debian/tests/rounding_modes1.cpp deleted file mode 100644 index 0c497a77dc3d..000000000000 --- a/Maintenance/deb/squeeze/debian/tests/rounding_modes1.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include -#include - -int modes[4] = { FE_TOWARDZERO, FE_UPWARD, FE_DOWNWARD, FE_TONEAREST }; - -std::string str (int mode) -{ - switch (mode) - { - case FE_TOWARDZERO: return "FE_TOWARDZERO"; - case FE_UPWARD: return "FE_UPWARD"; - case FE_DOWNWARD: return "FE_DOWNWARD"; - case FE_TONEAREST: return "FE_TONEAREST"; - default: throw __LINE__; - } -} - -int fetestround () -{ - volatile double eps = std::numeric_limits::denorm_min(); - - double x = -1.0; - double y = 1.0; - volatile double x_plus_eps = x + eps; - volatile double y_minus_eps = y - eps; - - if ((x == x_plus_eps) && (y == y_minus_eps)) - return FE_TONEAREST; - if (y == y_minus_eps) - return FE_UPWARD; - if (x == x_plus_eps) - return FE_DOWNWARD; - return FE_TOWARDZERO; -} - -int main (int argc, char* argv[]) -{ - int errors = 0; - - int mode_get = fegetround(); - std::cout << "fegetround() = " << str(mode_get) << " " << std::endl; - - for (int i=0; i<4; i++) - { - int mode_set = modes[i]; - fesetround (mode_set); - std::cout << "fesetround (" << str(mode_set) << ")" << std::endl; - - int mode_get = fegetround(); - std::cout << "fegetround() = " << str(mode_get) << " "; - bool ok_get = mode_get == mode_set; - if (!ok_get) - errors++; - std::cout << (ok_get ? "(ok)" : "(error)") << std::endl; - - int mode_test = fetestround(); - std::cout << "fetestround() = " << str(mode_test) << " "; - bool ok_test = mode_test == mode_set; - if (!ok_test) - errors++; - std::cout << (ok_test ? "(ok)" : "(error)") << std::endl; - } - - return errors; -} diff --git a/Maintenance/deb/squeeze/debian/tests/rounding_modes2.cpp b/Maintenance/deb/squeeze/debian/tests/rounding_modes2.cpp deleted file mode 100644 index 7892a99a83be..000000000000 --- a/Maintenance/deb/squeeze/debian/tests/rounding_modes2.cpp +++ /dev/null @@ -1,95 +0,0 @@ -// This tests the rounding mode functions. - -#include -#include -#include - -typedef CGAL::Interval_nt_advanced NT_adv; -typedef CGAL::Interval_nt<> NT; - -void print_res (bool res) -{ std::cout << (res ? "ok" : "ERROR") << std::endl; } - -// The results of 1-epsilon and -1+epsilon are enough -// to detect exactly the current rounding mode. -// 1-MIN_DOUBLE -// +------+-------+ -// | 1 | 1-ulp | -// +--------+------+-------+ -// -1+MIN_DOUBLE | -1 | near | -inf | -// | -1+ulp | +inf | zero | -// +--------+------+-------+ - -// I use a global variable here to avoid constant propagation. -double IA_min_double; - -CGAL::FPU_CW_t -FPU_empiric_test() -{ - IA_min_double = CGAL_IA_STOP_CPROP(CGAL_IA_MIN_DOUBLE); - double y = 1.0, z = -1.0; - double ye, ze; - ye = y - IA_min_double; - ze = z + IA_min_double; - if (y == ye && z == ze) return CGAL_FE_TONEAREST; - if (y == ye) return CGAL_FE_UPWARD; - if (z == ze) return CGAL_FE_DOWNWARD; - return CGAL_FE_TOWARDZERO; -} - -void print_rounding_name (CGAL::FPU_CW_t r) -{ - switch (r) { - case CGAL_FE_TONEAREST: std::cout << "NEAR\n"; break; - case CGAL_FE_DOWNWARD: std::cout << "DOWN\n"; break; - case CGAL_FE_UPWARD: std::cout << "UP\n"; break; - case CGAL_FE_TOWARDZERO: std::cout << "ZERO\n"; break; - default: std::cout << "unknown !\n"; - } -} - -int main() -{ - bool flag = true; - - flag = flag && (FPU_empiric_test() == CGAL_FE_TONEAREST); - std::cout << "default: "; - print_res(flag); - - // Should be a no-op. - CGAL::FPU_set_cw(CGAL::FPU_get_cw()); - flag = flag && (FPU_empiric_test() == CGAL_FE_TONEAREST); - std::cout << "get/set: "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - // Rounding to zero. - CGAL::FPU_set_cw(CGAL_FE_TOWARDZERO); - flag = flag && (FPU_empiric_test() == CGAL_FE_TOWARDZERO); - std::cout << "zero : "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - // Rounding to infinity. - CGAL::FPU_set_cw(CGAL_FE_UPWARD); - flag = flag && (FPU_empiric_test() == CGAL_FE_UPWARD); - std::cout << "+inf : "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - // Rounding to minus infinity. - CGAL::FPU_set_cw(CGAL_FE_DOWNWARD); - flag = flag && (FPU_empiric_test() == CGAL_FE_DOWNWARD); - std::cout << "-inf : "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - // Rounding to nearest. - CGAL::FPU_set_cw(CGAL_FE_TONEAREST); - flag = flag && (FPU_empiric_test() == CGAL_FE_TONEAREST); - std::cout << "near : "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - return (int) !flag; -} diff --git a/Maintenance/deb/squeeze/debian/watch b/Maintenance/deb/squeeze/debian/watch deleted file mode 100644 index 36047492bc67..000000000000 --- a/Maintenance/deb/squeeze/debian/watch +++ /dev/null @@ -1,10 +0,0 @@ -# Note that the file URLs contain unpredictable IDs as directory. The -# uversionmagle options strips this ID. -# -# Note that only digits and "." are used to match the version number. -# Therefore we do not match beta releases. -# -version=3 -opts=uversionmangle=s/(\d+).([\d\.]+)/$2/ \ - https://gforge.inria.fr/frs/?group_id=52 \ - /frs/download.php/(\d+)/CGAL-([\d\.]+).tar.gz diff --git a/Maintenance/deb/wheezy/debian/NEWS.Debian b/Maintenance/deb/wheezy/debian/NEWS.Debian deleted file mode 100644 index 938dde2d1feb..000000000000 --- a/Maintenance/deb/wheezy/debian/NEWS.Debian +++ /dev/null @@ -1,9 +0,0 @@ -cgal (4.2-1) unstable; urgency=low - - The Qt4 support library libCGAL_Qt4.so.10.0.0 has been moved from the package - libcgal10 to the new package libcgal-qt4-10. Similarly, the corresponding - headers and the static library have been moved from the package libcgal-dev - to the new package libcgal-qt4-dev. That is the packages libcgal10 and - libcgal-dev do not any longer depend on the Qt packages. - - -- Joachim Reichel Sun, 02 Sep 2012 12:31:08 +0200 diff --git a/Maintenance/deb/wheezy/debian/README.Debian b/Maintenance/deb/wheezy/debian/README.Debian deleted file mode 100644 index def38fe860be..000000000000 --- a/Maintenance/deb/wheezy/debian/README.Debian +++ /dev/null @@ -1,50 +0,0 @@ -README.Debian -------------- - -The homepage of CGAL (https://www.cgal.org/) offers more information about CGAL. -In particular, a mailing list and the documentation for the library (in PDF and -HTML) are available. The authors ask you to give some feedback about your usage -of CGAL in a short questionnaire (in the download section). - - -Documentation -------------- - -Note that the CGAL documentation cannot be packaged for Debian due to unclear -license conditions. The complete documentation in PDF and HTML is available at -https://www.cgal.org/. - - -Demos and examples ------------------- - -Tarballs with demos and examples can be found in /usr/share/doc/libcgal-demo. -Extract the tarballs somewhere and call "cmake ." to configure the -demos/examples. Call "make" to build them, either in the top-level directory -to build all demos/examples (which takes some time and needs quite some disk -space), or in the subdirectory of the desired demo/example. The cmake option --DCMAKE_VERBOSE_MAKEFILE=ON is useful to generate verbose makefiles that show -each executed command. - - -Demos using libQGLViewer ------------------------- - -The Debian package of libQGLViewer uses non-standard library names to offer the -library in a Qt3 and Qt4 flavor. The build system of CGAL has been patched to -handle the non-standard library name. If your libQGLViewer packages are older -than 2.3.1-4 you need to work around another problem with the non-standard -include directory. Create an include directory with the expected name -"QGLViewer", e.g., - - mkdir -p /some/dir - ln -s /usr/include/qglviewer-qt4 /some/dir/QGLViewer - -and pass the option - - -DQGLVIEWER_INCLUDE_DIR=/some/dir - -to cmake. See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=522659 for more -information. - - -- Joachim Reichel Sat, 06 Feb 2010 12:29:02 +0100 diff --git a/Maintenance/deb/wheezy/debian/README.source b/Maintenance/deb/wheezy/debian/README.source deleted file mode 100644 index 662cd01c5daf..000000000000 --- a/Maintenance/deb/wheezy/debian/README.source +++ /dev/null @@ -1,11 +0,0 @@ -normalize-audio for Debian --------------------------- - -This package uses quilt to manage all modifications to the upstream source. -Changes are stored in the source package as diffs in debian/patches and -applied during the build. - -See /usr/share/doc/quilt/README.source for a detailed explanation. - - -- Joachim Reichel Sun, 15 Jan 2012 14:38:04 +0100 - diff --git a/Maintenance/deb/wheezy/debian/changelog b/Maintenance/deb/wheezy/debian/changelog deleted file mode 100644 index 56c3f83f203a..000000000000 --- a/Maintenance/deb/wheezy/debian/changelog +++ /dev/null @@ -1,348 +0,0 @@ -cgal (4.1-1~wheezy1) testing; urgency=low - - * New upstream release. - * Rename binary package libcgal9 to libcgal10 to reflect SONAME change. - * Configure CGAL using -DCGAL_ENABLE_PRECONFIG=OFF since we do not want - that the accidental presence of optional libraries (for demos and - examples) influences the build of the library. - * Move the Qt4 support library and the corresponding headers into new - binary packages libcgal-qt4-10 and libcgal-qt4-dev (Closes: #683214). - * Add libboost-system-dev to Builds-Depends: of cgal. - * Move libmpfi-dev from Suggests: of cgal-demo to Build-Depends: of cgal. - - -- Joachim Reichel Wed, 24 Oct 2012 19:08:35 +0200 - -cgal (4.0.2-1) unstable; urgency=low - - * New upstream release. - * Remove gcc-4.7 patch (fixed upstream). - - -- Joachim Reichel Wed, 04 Jul 2012 19:45:28 +0200 - -cgal (4.0-4) unstable; urgency=low - - * Add Suggests: libeigen3-dev (>= 3.1.0~beta1-1), libmpfi-dev to - libcgal-demo. - - -- Joachim Reichel Tue, 12 Jun 2012 23:53:14 +0200 - -cgal (4.0-3) unstable; urgency=low - - * Change Build-Depends: debhelper (>= 8) to debhelper (>= 9), update - debian/compat to get the default build flags for hardening. Inject - CPPFLAGS into CFLAGS and CXXFLAGS, since CPPFLAGS is ignored by cmake. - * Add lintian override to silence incorrect warnings about - hardening-no-fortify-functions for some libraries (all libraries are - built with the same flags). - - -- Joachim Reichel Sun, 10 Jun 2012 15:36:27 +0200 - -cgal (4.0-2) unstable; urgency=low - - * Add patch gcc-4.7 to fix a syntax error in template code which is - not instantiated during the package build itself (Closes: #673554). - * Fix debian/watch. - - -- Joachim Reichel Sun, 20 May 2012 22:47:56 +0200 - -cgal (4.0-1) unstable; urgency=low - - * New upstream release. - * Move from non-free to main due to upstream license change from QPL - to GPL 3+ (and from LGPL 2.1 to LGPL 3+), updated debian/copyright - accordingly. - * Rename binary package libcgal8 to libcgal9 to reflect SONAME change. - * Update Standards-Version to 3.9.3 (no changes needed). - * Remove fix-ipe-version-detection.dpatch and - fix-qt-moc-parse-error.dpatch (fixed upstream). - * Removed libmagick++9-dev from Suggests: of libcgal-demo, because - that package does no longer exists. - - -- Joachim Reichel Mon, 12 Mar 2012 19:14:55 +0100 - -cgal (3.9-4) unstable; urgency=low - - * Rebuild against boost 1.48 (Closes: #659358). - * Add fix-qt-moc-parse-error.dpatch as workaround for - https://bugreports.qt-project.org/browse/QTBUG-22829. - - -- Joachim Reichel Fri, 10 Feb 2012 22:41:26 +0100 - -cgal (3.9-3) unstable; urgency=low - - * Fix FTBFS when building only architecture dependent packages caused - by recent transition to the new packaging format (Closes: #658191). - - -- Joachim Reichel Wed, 01 Feb 2012 00:07:03 +0100 - -cgal (3.9-2) unstable; urgency=low - - * Changed packaging format to "3.0 (quilt)". - * Add fix-ipe-version-detection.dpatch: upstream patch for bug #643278. - Remove workaround. - * Tighten Depends: of libcgal-ipelets on ipe (Closes: #657720). - * Move libcgal-ipelets to Section: graphics. - * Add libqt4-opengl-dev to Suggests: of libcgal-demo. - - -- Joachim Reichel Mon, 30 Jan 2012 19:04:18 +0100 - -cgal (3.9-1) unstable; urgency=low - - * New upstream release. - * Rename binary package libcgal7 to libcgal8 to reflect SONAME change. - * Add workaround for bug #643278. - - -- Joachim Reichel Wed, 28 Sep 2011 19:51:35 +0200 - -cgal (3.8-1) unstable; urgency=low - - * New upstream release. - * Rename binary package libcgal6 to libcgal7 to reflect SONAME change. - * Update Standards-Version to 3.9.2 (no changes needed). - - -- Joachim Reichel Thu, 21 Apr 2011 18:45:25 +0200 - -cgal (3.7-5) unstable; urgency=low - - * Upload to unstable. - - -- Joachim Reichel Sun, 06 Mar 2011 17:26:11 +0100 - -cgal (3.7-4) experimental; urgency=low - - * Build with libgmp10 (Closes: #614797). Thanks to Christian M. Amsüss. - - -- Joachim Reichel Sun, 27 Feb 2011 16:36:22 +0100 - -cgal (3.7-3) unstable; urgency=low - - * Disable support for Qt3 because Qt3 has been removed from the repository - (Closes: #604478). - - -- Joachim Reichel Thu, 10 Feb 2011 21:06:09 +0100 - -cgal (3.7-2) unstable; urgency=low - - * Upload to unstable. - - -- Joachim Reichel Sun, 06 Feb 2011 13:53:00 +0100 - -cgal (3.7-1) experimental; urgency=low - - * New upstream release. - * Rename binary package libcgal5 to libcgal6 to reflect SONAME change. - * Rename binary package libcgal5-ipelets to libcgal-ipelets because it is - not possible to install the ipelets for different SONAMEs in parallel. - * Remove ipe-default-to-version-7.dpatch: the Ipe version is now - auto-detected. - * Remove fix-core-64bit.dpatch (fixed upstream). - * Add qt4-dev-tools to Suggests: of libcgal-demo for qcollectiongenerator. - * Update Standards-Version to 3.9.1 (-D_REENTRANT no longer needed). - - -- Joachim Reichel Sun, 17 Oct 2010 14:27:54 +0200 - -cgal (3.6.1-2) unstable; urgency=low - - * Add fix-core-64bit.dpatch: use CORE::CHUNK_BIT instead of hard-coded - constant 14. - - -- Joachim Reichel Tue, 24 Aug 2010 19:46:36 +0200 - -cgal (3.6.1-1) unstable; urgency=low - - * New upstream release. - * Set SOVERSION explicitly to 5.0.1 as told by upstream. - * Remove architecture exceptions from Suggests: for libcgal-demo which is no - longer allowed by dpkg-gencontrol (see #560071). - * Fix debian/watch file. - * Change license of packaging to LGPL 2.1 or later because referencing the - BSD license in /usr/share/common-licenses is deprecated. - * Update Standards-Version to 3.9.0 (no changes needed). - - -- Joachim Reichel Thu, 01 Jul 2010 23:37:41 +0200 - -cgal (3.6-1) unstable; urgency=low - - * New upstream release. - * Rename binary package libcgal4 to libcgal5 to reflect SONAME change. - * Remove fix-cmake-qglviewer-detection.dpatch (fixed upstream). - * New binary package libcgal5-ipelets which contains plugins for Ipe 7.x - (Closes: #557643). - * Add ipe-default-to-version-7.dpatch: change default of WITH_IPE_7 to ON. - * Remove libboost-graph1.35-dev from Build-Depends: and Suggests: of - libcgal-demo (not needed). - - -- Joachim Reichel Mon, 22 Mar 2010 19:09:15 +0100 - - -cgal (3.5.1-2) unstable; urgency=low - - * Add fix-cmake-qglviewer-detection.dpatch (Closes: #564126), thanks to - Marc Glisse for the patch. - * Update Standards-Version to 3.8.4 (no changes needed). - - -- Joachim Reichel Sat, 06 Feb 2010 12:29:02 +0100 - -cgal (3.5.1-1) unstable; urgency=low - - * New upstream release. - * Fix error in handling of "debug" and "nostrip" in $(DEB_BUILD_OPTIONS) - (see also #552961). - * Unset QTDIR before calling cmake to reduce problems in non-clean build - environments. - * Add ${misc:Depends} to Depends: of all binary packages as found by - lintian. - - -- Joachim Reichel Sun, 22 Nov 2009 22:31:00 +0100 - -cgal (3.5-1) unstable; urgency=low - - * New upstream release. - * Rename binary package libcgal3 to libcgal4 to reflect SONAME change. - * Remove fix-FindCGAL-cmake.dpatch (fixed upstream). - * Remove fix-demos-examples-configuration.dpatch (fixed upstream). - * Remove add-cmake-2.6.3-support.dpatch (fixed upstream). - * Remove fix-demo-polyheron-3.dpatch (fixed upstream). - * Remove "-mieee -mfp-rounding-mode=d" from CGAL_CXX_FLAGS on alpha - (fixed upstream). - - -- Joachim Reichel Sat, 03 Oct 2009 16:43:08 +0200 - -cgal (3.4-5) unstable; urgency=low - - * Return to unversioned boost dependencies. - * Re-add working watch file. - * Update Standards-Version to 3.8.3 (no changes needed). - - -- Joachim Reichel Wed, 16 Sep 2009 19:25:09 +0200 - -cgal (3.4-4) unstable; urgency=low - - * Add patch fix-demos-examples-configuration.dpatch. - * Add patch add-cmake-2.6.3-support.dpatch. - * Add patch fix-demo-polyheron-3.dpatch. - * Fix support for nocheck in DEB_BUILD_OPTIONS (was broken in 3.4-3). - - -- Joachim Reichel Fri, 01 May 2009 17:31:00 +0200 - -cgal (3.4-3) unstable; urgency=low - - * Update boost dependencies to 1.38. - * Remove watch file (new upstream location uses unpredictable paths). - * Update Standards-Version to 3.8.1 (add support for nocheck in - DEB_BUILD_OPTIONS). - * Change Suggests: dependency of libcgal-demo from libqglviewer-dev - to libqglviewer-qt4-dev (all demos using libQGLViewer use Qt4). - * Add workaround for #522659 to README.Debian. - - -- Joachim Reichel Sat, 18 Apr 2009 11:46:19 +0200 - -cgal (3.4-2) unstable; urgency=low - - * Add "-mieee -mfp-rounding-mode=d" to CGAL_CXX_FLAGS on alpha (got lost - during the transition to cmake). - - -- Joachim Reichel Sun, 15 Feb 2009 15:06:31 +0100 - -cgal (3.4-1) unstable; urgency=low - - * New upstream release. - * Adapt debian/rules to the new cmake-based build system. - * Downgrade LAPACK- and BLAS-related Build-Depends: to Suggests: for - libcgal-demo, since it is now possible to configure demos and examples - independently of the library. - - -- Joachim Reichel Thu, 22 Jan 2009 18:39:44 +0100 - -cgal (3.3.1-4) unstable; urgency=low - - * Remove fortran-transition.dpatch, update build-library.dpatch: - Do not link with -lg2c in configuration tests (Closes: #475721). - * Update cgal_create_makefile.dpatch to remove bashisms (Closes: #486045). - * Update debian/tests/rounding_modes2.cpp to stop constant propagation. - * Update Standards-Version to 3.8.0 (explain in debian/copyright why package - is in non-free). - - -- Joachim Reichel Sun, 15 Jun 2008 22:11:14 +0200 - -cgal (3.3.1-3) unstable; urgency=low - - * Add patch fortran-transition.dpatch (Closes: #470359), thanks to Kumar - Appaiah for the patch. - * debian/rules: s/lapack3-dev/liblapack-dev/, - s/atlas3-base-dev/libatlas-base-dev/, s/libatlas-3.so/libatlas.so.3gf/ . - * Fix manpage w.r.t. makefile vs. cgal.mk (Closes: #466430). - * Add second test for FPU rounding modes. - - -- Joachim Reichel Wed, 19 Mar 2008 20:27:34 +0100 - -cgal (3.3.1-2) unstable; urgency=low - - * debian/control: Really really drop support for atlas and lapack on arm - and m68k, fix atlas and lapack support on other architectures. - * debian/control: Extend exclusions for arm to variants armeb and armel - (Closes: #460141). - * debian/control: Remove virtual dependency liblapack-3.so which is - provided by atlas3-base-dev (which does *not* provide - /usr/lib/liblapack.so, just /usr/lib/atlas/liblapack.so). - * debian/control: Replace virtual dependency libblas-3.so by - libatlas-3.so. - * Add patch qt-compatibility-headers.dpatch (Closes: #464251). - * debian/control: Add Homepage: field, adjust Description: accordingly. - * Update Standards-Version to 3.7.3 (no changes needed). - - -- Joachim Reichel Wed, 06 Feb 2008 18:37:52 +0100 - -cgal (3.3.1-1) unstable; urgency=low - - * New upstream release. - * Remove patch bugfix-fpu-rounding-mode-alpha.dpatch (included by - upstream). - * Fail build if FPU rounding mode test fails. - * Really drop support for atlas and lapack on arm and m68k. - * Fix cgal_create_makefile w.r.t. makefile vs. cgal.mk. - - -- Joachim Reichel Mon, 3 Sep 2007 18:57:36 +0200 - -cgal (3.3-2) unstable; urgency=low - - * Add patch bugfix-fpu-rounding-mode-alpha.dpatch (Closes: #431230). - * debian/control: Add versioned depends on libboost-program-options-dev, - drop build-dependency on libboost-graph-dev. - * Drop support for atlas on arm and m68k. - - -- Joachim Reichel Mon, 16 Jul 2007 15:32:35 +0200 - -cgal (3.3-1) unstable; urgency=low - - * New upstream release. - - -- Joachim Reichel Sun, 3 Jun 2007 09:36:36 +0200 - -cgal (3.2.1-2) unstable; urgency=low - - * Fix FTBFS on hppa (and probably also on other architectures) related - to FPU rounding modes (Closes: #404464). - * debian/control: Add tag XS-Autobuild. - * debian/copyright: Add note about autobuilding. - * debian/control: Make package binNMU-safe. - * Remove linda override for bug #369977 (no longer needed). - * Add watch file. - - -- Joachim Reichel Fri, 26 Jan 2007 19:16:36 +0100 - -cgal (3.2.1-1) unstable; urgency=low - - * New upstream release. - * Add linda override for bug #369977. - * Remove patch bugfix-demo-examples-makefiles.dpatch (no longer needed). - - -- Joachim Reichel Fri, 14 Jul 2006 21:20:16 +0200 - -cgal (3.2-1) unstable; urgency=low - - * New upstream release. - * First upload to Debian archive. (Closes: #251885) - - -- Joachim Reichel Mon, 29 May 2006 20:24:27 +0200 -5~ diff --git a/Maintenance/deb/wheezy/debian/compat b/Maintenance/deb/wheezy/debian/compat deleted file mode 100644 index ec635144f600..000000000000 --- a/Maintenance/deb/wheezy/debian/compat +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/Maintenance/deb/wheezy/debian/control b/Maintenance/deb/wheezy/debian/control deleted file mode 100644 index 865bd762a156..000000000000 --- a/Maintenance/deb/wheezy/debian/control +++ /dev/null @@ -1,120 +0,0 @@ -Source: cgal -Priority: optional -Maintainer: Joachim Reichel -# "ipe" is only needed because it contains goodies.lua which is needed by FindIPE.cmake -Build-Depends: debhelper (>= 9), dpkg-awk, cmake, zlib1g-dev, libboost-dev, - libboost-thread-dev, libboost-program-options-dev, libboost-system-dev, - libgmp10-dev, libmpfr-dev, libmpfi-dev, libqt4-dev, libqt4-opengl-dev, - libipe-dev (>= 7), ipe -Standards-Version: 3.9.3 -Section: libs -Homepage: https://www.cgal.org/ -XS-Autobuild: yes - -Package: libcgal10 -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: C++ library for computational geometry - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - The CGAL library contains: - - the Kernel with geometric primitives such as points, vectors, lines, - predicates for testing things such as relative positions of points, and - operations such as intersections and distance calculation. - - the Basic Library which is a collection of standard data structures and - geometric algorithms, such as convex hull in 2D/3D, (Delaunay) - triangulation in 2D/3D, planar map, polyhedron, smallest enclosing circle, - and multidimensional query structures. - - the Support Library which offers interfaces to other packages, e.g., for - visualisation, and I/O, and other support facilities. - . - This package contains the main library libCGAL.so as well as two support - libraries libCGAL_Core.so (from the CORE project) and libCGAL_ImageIO.so - (image I/O). The library libCGAL_Qt4.so used for visualization in demos - can be found in the package libcgal-qt4-10. - -Package: libcgal-qt4-10 -Architecture: any -Depends: libcgal10 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Description: C++ library for computational geometry (support for Qt4) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - The CGAL library contains: - - the Kernel with geometric primitives such as points, vectors, lines, - predicates for testing things such as relative positions of points, and - operations such as intersections and distance calculation. - - the Basic Library which is a collection of standard data structures and - geometric algorithms, such as convex hull in 2D/3D, (Delaunay) - triangulation in 2D/3D, planar map, polyhedron, smallest enclosing circle, - and multidimensional query structures. - - the Support Library which offers interfaces to other packages, e.g., for - visualisation, and I/O, and other support facilities. - . - This package contains libCGAL_Qt4.so used for visualization in demos. - -Package: libcgal-dev -Section: libdevel -Architecture: any -Depends: libcgal10 (= ${binary:Version}), libboost-dev, libboost-thread-dev, - libboost-program-options-dev, libgmp10-dev, libmpfr-dev, zlib1g-dev, ${misc:Depends} -Description: C++ library for computational geometry (development files) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - This package contains the header files and static libraries for libCGAL.so, - libCGAL_Core.so, and libCGAL_ImageIO.so. The header files and static - libraries for libCGAL_Qt4.so can be found in the package libcgal-qt4-dev. - -Package: libcgal-qt4-dev -Section: libdevel -Architecture: any -Depends: libcgal10 (= ${binary:Version}), libcgal-qt4-10 (= ${binary:Version}), - libcgal-dev, libqt4-dev, ${misc:Depends} -Description: C++ library for computational geometry (development files, support for Qt4) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - This package contains the header files and static libraries for - libCGAL_Qt.so. - -Package: libcgal-demo -Section: devel -Architecture: all -Depends: libcgal-dev (>= ${binary:Version}), libcgal10 (>= ${binary:Version}), - ${misc:Depends} -Recommends: libcgal-qt4-dev (>= ${binary:Version}), libcgal10-qt4 (>= ${binary:Version}) -Suggests: liblapack-dev, libatlas-base-dev | libatlas.so.3gf, gfortran, - geomview, libqglviewer-qt4-dev, libipe-dev (>= 7), libglew1.5-dev | libglew-dev, - libmagick++-dev, qt4-dev-tools, libqt4-opengl-dev, libeigen3-dev (>= 3.1.0~beta1-1) -Description: C++ library for computational geometry (demos) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - This package contains the demos and examples. - -Package: libcgal-ipelets -Section: graphics -Architecture: any -Depends: libcgal10 (>= ${binary:Version}), ipe (>= ${Ipe-Version}), ipe (<< ${Ipe-Version}+), - ${shlibs:Depends}, ${misc:Depends} -Conflicts: libcgal5-ipelets -Replaces: libcgal5-ipelets -Description: C++ library for computational geometry (ipelets) - CGAL (Computational Geometry Algorithms Library) makes the most important - of the solutions and methods developed in computational geometry available - to users in industry and academia in a C++ library. The goal is to provide - easy access to useful, reliable geometric algorithms. - . - This package contains the ipelets, i.e., plugins for ipe. diff --git a/Maintenance/deb/wheezy/debian/copyright b/Maintenance/deb/wheezy/debian/copyright deleted file mode 100644 index 382b30cd2b54..000000000000 --- a/Maintenance/deb/wheezy/debian/copyright +++ /dev/null @@ -1,351 +0,0 @@ -This package was debianized by Joachim Reichel on -Thu, 29 Apr 2004 18:43:18 +0200. - -It was downloaded from https://www.cgal.org/download/index.html. - -The Debian packaging is Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, -2010, 2011, 2012 Joachim Reichel and is licensed -under the LGPL license, version 2.1 or later (at your option), which can -be found in /usr/share/common-licenses/LGPL-2.1. - - - -Authors -======= - -Pierre Alliez -Matthias Bäsken -Eric Berberich -Olivier Billet -Jean-Daniel Boissonnat -Carine Bonetto -Mario Botsch -Hervé Brönnimann -Fernando Cacciola -Manuel Caroli -Nicolas Carrez -Frédéric Cazals -Raphaëlle Chaine -Tran Kai Frank Da -Christophe Delage -Olivier Devillers -Katrin Dobrindt -Arno Eigenwillig -Eti Ezra -Andreas Fabri -Frédéric Fichel -Kaspar Fischer -Eyal Flato -Julia Flötotto -Efi Fogel -Wolfgang Freiseisen -Bernd Gärtner -Geert-Jan Giezeman -Marc Glisse -Shlomo Golubev -Miguel Granados -Gael Guennebaud -Philippe Guigue -Ankit Gupta -Peter Hachenberger -Iddo Hanniel -Idit Haran -Sariel Har-Peled -Julien Hazebrouck -Michael Hemmer -Thomas Herrmann -Susan Hert -Shai Hirsch -Michael Hoffmann -Dominik Huelse -Marcel Janer -Athanasios Kakargias -Menelaos Karavelas -Michael Kerber -Lutz Kettner -Nico Kruithof -Sylvain Lazard -Eran Leiserowitz -Bruno Lévy -Sebastian Limbach -Kapelushnik Lior -Eugene Lipovetsky -Sébastien Loriot -Pedro Machado -Bastien Manuel -Naama Mayer -Abdelkrim Mebarki -Kurt Mehlhorn -Naceur Meskini -Andreas Meyer -Michal Meyerovitch -Oren Nechushtan -Gabriele Neyer -Ralf Osbild -Steve Oudot -Eli Packer -Dmitrii Pasechnik -Luis Peñaranda -Sylvain Pion -Marc Pouget -Sigal Raab -François Rebufat -Joachim Reichel -David Rey -Laurent Rineau -Daniel Russel -Niv Sabath -Laurent Saboret -Nader Salman -Stefan Schirra -Sven Schönherr -Michael Seel -Ophir Setter -Le-Jeng Shiue -Hans Tangelder -Stéphane Tayeb -Monique Teillaud -Jane Tournois -Constantinos Tsirogiannis -Radu Ursu -Carl Van Geem -Remco Veltkamp -Ron Wein -Wieger Wesselink -Camille Wormser -Mariette Yvinec -Afra Zomorodian -Guy Zucker -Baruch Zukerman -Tali Zvi - - - -Copyright holders -================= - -Utrecht University (The Netherlands) -ETH Zurich (Switzerland) -Freie Universitaet Berlin (Germany) -INRIA Sophia-Antipolis (France) -Martin-Luther-University Halle-Wittenberg (Germany) -Max-Planck-Institute Saarbruecken (Germany) -RISC Linz (Austria) -Tel-Aviv University (Israel) - -Stanford University (USA) -Foundation for Research and Technology-Hellas (Greece) - -GeometryFactory - -Fernando Luis Cacciola Carballal -Le-Jeng Shiue - - - -Copyright (from upstream file LICENSE) -====================================== - - The CGAL software consists of several parts, each of which is licensed under - an open source license. It is also possible to obtain commercial licenses - from GeometryFactory (www.geometryfactory.com) for all or parts of CGAL. - - The source code of the CGAL library can be found in the directories - "src/CGAL", "src/CGALQt", "src/CGALQt4" and "include/CGAL" (with the - exception of "include/CGAL/CORE"). - It is specified in each file of the CGAL library which - license applies to it. This is either the GNU General Public License - or 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). The texts of both licenses can be found in the files LICENSE.GPL - and LICENSE.LGPL. - - Distributed along with CGAL (for the users' convenience), but not part of - CGAL, are the following third-party libraries, available under their own - licenses: - - - CORE, in the directories "include/CGAL/CORE" and "src/CGALCore", is - licensed under the LGPL (see LICENSE.LGPL). - - ImageIO, in the directory "src/CGALimageIO", is licensed under the LGPL - (see LICENSE.LGPL). - - All other files that do not have an explicit copyright notice (e.g., all - examples and some demos) are licensed under a very permissive license. The - exact license text can be found in the file LICENSE.FREE_USE. - - More information on the CGAL license can be found at - https://www.cgal.org/license.html - - - -Copyright statements for LGPL'd files -===================================== - -The following copyright statement is taken from include/CGAL/config.h. The -year numbers and the set of copyright holders (see list above) varies from -file to file. - - Copyright (c) 1997-2010 - 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. - - - -Copyright statement for GPL'd files -=================================== - -The following copyright statement is taken from include/CGAL/Width_3.h. The -year numbers and the set of copyright holders (see list above) varies from -file to file. - - Copyright (c) 1997-2000 ETH Zurich (Switzerland). - 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. - - - -Copyright statement for files under the FREE_USE license -======================================================== - - Copyright (c) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007 - Utrecht University (The Netherlands), - ETH Zurich (Switzerland), - INRIA Sophia-Antipolis (France), - Max-Planck-Institute Saarbruecken (Germany), - and Tel-Aviv University (Israel). All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -The following copyright statements apply to third-party libraries -distributed with CGAL: - - - -Boost -===== - -The following files are modified versions originating from Boost: - - ./include/CGAL/STL_Extension/internal/boost/mutable_heap.hpp - ./include/CGAL/STL_Extension/internal/boost/array_binary_tree.hpp - ./include/CGAL/STL_Extension/internal/boost/mutable_queue.hpp - Copyright 1997, 1998, 1999, 2000 University of Notre Dame. - - ./include/CGAL/internal/container_fwd_fixed.hpp - Copyright 2005-2008 Daniel James. - - ./include/CGAL/auto_link/auto_link.h - (C) Copyright John Maddock 2003. - -All of these files are distributed under the Boost Software License, -version 1.0. - - Boost Software License - Version 1.0 - August 17th, 2003 - - Permission is hereby granted, free of charge, to any person or organization - obtaining a copy of the software and accompanying documentation covered by - this license (the "Software") to use, reproduce, display, distribute, - execute, and transmit the Software, and to prepare derivative works of the - Software, and to permit third-parties to whom the Software is furnished to - do so, all subject to the following: - - The copyright notices in the Software and this entire statement, including - the above license grant, this restriction and the following disclaimer, - must be included in all copies of the Software, in whole or in part, and - all derivative works of the Software, unless such copies or derivative - works are solely in the form of machine-executable object code generated by - a source language processor. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT - SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE - FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - - -CORE -==== - -The following copyright statement applies to the CORE library in -src/CGALCore and include/CGAL/CORE. - - Core Library Version 1.7, August 2004 - Copyright (c) 1995-2004 Exact Computation Project - All rights reserved. - - This file is part of CORE (https://cs.nyu.edu/exact/core/). - 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. - - - -ImageIO -======= - -The following copyright statement applies to the ImageIO library in -src/CGALimageIO. - - Copyright (c) 2005, 2006 ASCLEPIOS Project, INRIA Sophia-Antipolis (France) - All rights reserved. - - The files in this directory are part of the ImageIO Library. - You can redistribute them and/or modify them 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. - - These files are provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. diff --git a/Maintenance/deb/wheezy/debian/libcgal-demo.install b/Maintenance/deb/wheezy/debian/libcgal-demo.install deleted file mode 100644 index 239a1b25f460..000000000000 --- a/Maintenance/deb/wheezy/debian/libcgal-demo.install +++ /dev/null @@ -1,2 +0,0 @@ -usr/share/doc/cgal/demo.tar.gz usr/share/doc/libcgal10 -usr/share/doc/cgal/examples.tar.gz usr/share/doc/libcgal10 diff --git a/Maintenance/deb/wheezy/debian/libcgal-dev.install b/Maintenance/deb/wheezy/debian/libcgal-dev.install deleted file mode 100644 index d1af7ba0074e..000000000000 --- a/Maintenance/deb/wheezy/debian/libcgal-dev.install +++ /dev/null @@ -1,11 +0,0 @@ -usr/bin/* -usr/include/* -usr/lib/libCGAL.a -usr/lib/libCGAL_Core.a -usr/lib/libCGAL_ImageIO.a -usr/lib/libCGAL.so -usr/lib/libCGAL_Core.so -usr/lib/libCGAL_ImageIO.so -usr/lib/CGAL/* -usr/share/cmake-2.8/Modules/* -usr/share/man/man1/cgal_create_cmake_script.1 diff --git a/Maintenance/deb/wheezy/debian/libcgal-ipelets.install b/Maintenance/deb/wheezy/debian/libcgal-ipelets.install deleted file mode 100644 index dc8f242677f5..000000000000 --- a/Maintenance/deb/wheezy/debian/libcgal-ipelets.install +++ /dev/null @@ -1,2 +0,0 @@ -# use wildcard to avoid hard-coding the Ipe version -usr/lib/ipe/* usr/lib/ipe diff --git a/Maintenance/deb/wheezy/debian/libcgal-ipelets.lintian-overrides b/Maintenance/deb/wheezy/debian/libcgal-ipelets.lintian-overrides deleted file mode 100644 index 1aa24c692516..000000000000 --- a/Maintenance/deb/wheezy/debian/libcgal-ipelets.lintian-overrides +++ /dev/null @@ -1 +0,0 @@ -libcgal-ipelets: hardening-no-fortify-functions usr/lib/ipe/*/ipelets/libCGAL_*.so diff --git a/Maintenance/deb/wheezy/debian/libcgal-qt4-10.install b/Maintenance/deb/wheezy/debian/libcgal-qt4-10.install deleted file mode 100644 index b748a7e2d96c..000000000000 --- a/Maintenance/deb/wheezy/debian/libcgal-qt4-10.install +++ /dev/null @@ -1 +0,0 @@ -usr/lib/libCGAL_Qt4.so.* usr/lib diff --git a/Maintenance/deb/wheezy/debian/libcgal-qt4-10.lintian-overrides b/Maintenance/deb/wheezy/debian/libcgal-qt4-10.lintian-overrides deleted file mode 100644 index 930bb4415eac..000000000000 --- a/Maintenance/deb/wheezy/debian/libcgal-qt4-10.lintian-overrides +++ /dev/null @@ -1 +0,0 @@ -libcgal-qt4-10: hardening-no-fortify-functions usr/lib/libCGAL_Qt4.so.* diff --git a/Maintenance/deb/wheezy/debian/libcgal-qt4-10.shlibs b/Maintenance/deb/wheezy/debian/libcgal-qt4-10.shlibs deleted file mode 100644 index 69742b6438b9..000000000000 --- a/Maintenance/deb/wheezy/debian/libcgal-qt4-10.shlibs +++ /dev/null @@ -1 +0,0 @@ -libCGAL_Qt4 10 libcgal-qt4-10 diff --git a/Maintenance/deb/wheezy/debian/libcgal-qt4-dev.install b/Maintenance/deb/wheezy/debian/libcgal-qt4-dev.install deleted file mode 100644 index 6fd829ac9226..000000000000 --- a/Maintenance/deb/wheezy/debian/libcgal-qt4-dev.install +++ /dev/null @@ -1,5 +0,0 @@ -# The next entry is disabled here because it overlaps with the corresponding -# entry in libcgal-dev.install. The files are moved in debian/rules. -# usr/include/CGAL/Qt -usr/lib/libCGAL_Qt4.a -usr/lib/libCGAL_Qt4.so diff --git a/Maintenance/deb/wheezy/debian/libcgal10.install b/Maintenance/deb/wheezy/debian/libcgal10.install deleted file mode 100644 index f383cfa6ebcd..000000000000 --- a/Maintenance/deb/wheezy/debian/libcgal10.install +++ /dev/null @@ -1,4 +0,0 @@ -usr/lib/libCGAL.so.* usr/lib -usr/lib/libCGAL_Core.so.* usr/lib -usr/lib/libCGAL_ImageIO.so.* usr/lib -usr/share/doc/cgal/changelog usr/share/doc/libcgal10 diff --git a/Maintenance/deb/wheezy/debian/libcgal10.lintian-overrides b/Maintenance/deb/wheezy/debian/libcgal10.lintian-overrides deleted file mode 100644 index 37afa24ac1b4..000000000000 --- a/Maintenance/deb/wheezy/debian/libcgal10.lintian-overrides +++ /dev/null @@ -1 +0,0 @@ -libcgal10: hardening-no-fortify-functions usr/lib/libCGAL.so.* diff --git a/Maintenance/deb/wheezy/debian/libcgal10.shlibs b/Maintenance/deb/wheezy/debian/libcgal10.shlibs deleted file mode 100644 index 395a4c6b5ffc..000000000000 --- a/Maintenance/deb/wheezy/debian/libcgal10.shlibs +++ /dev/null @@ -1,3 +0,0 @@ -libCGAL 10 libcgal10 -libCGAL_Core 10 libcgal10 -libCGAL_ImageIO 10 libcgal10 diff --git a/Maintenance/deb/wheezy/debian/patches/do-not-link-example-with-qt4-support-library.patch b/Maintenance/deb/wheezy/debian/patches/do-not-link-example-with-qt4-support-library.patch deleted file mode 100644 index 04b469305b88..000000000000 --- a/Maintenance/deb/wheezy/debian/patches/do-not-link-example-with-qt4-support-library.patch +++ /dev/null @@ -1,12 +0,0 @@ -Description: Avoid -lCGAL_Qt4 in linker command of Linear_cell_complex example ---- cgal-4.1~beta1.orig/examples/Linear_cell_complex/CMakeLists.txt -+++ cgal-4.1~beta1/examples/Linear_cell_complex/CMakeLists.txt -@@ -12,7 +12,7 @@ if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR - endif() - endif() - --find_package(CGAL QUIET COMPONENTS Core Qt4) -+find_package(CGAL QUIET COMPONENTS Core) - - # For Gprof. - # ADD_DEFINITIONS("-pg") diff --git a/Maintenance/deb/wheezy/debian/patches/series b/Maintenance/deb/wheezy/debian/patches/series deleted file mode 100644 index 68417a3f7a9d..000000000000 --- a/Maintenance/deb/wheezy/debian/patches/series +++ /dev/null @@ -1 +0,0 @@ -do-not-link-example-with-qt4-support-library.patch diff --git a/Maintenance/deb/wheezy/debian/rules b/Maintenance/deb/wheezy/debian/rules deleted file mode 100755 index a3533b8b2cbd..000000000000 --- a/Maintenance/deb/wheezy/debian/rules +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/make -f - -# export DH_VERBOSE=1 - -# See https://wiki.debian.org/Hardening#Notes_for_packages_using_CMake -CFLAGS := $(CFLAGS) $(CPPFLAGS) -CXXFLAGS := $(CXXFLAGS) $(CPPFLAGS) - -# The build system links all four libraries against all dependencies. -LDFLAGS += -Wl,--as-needed - -ifeq ($(DEB_BUILD_ARCH),alpha) - IEEE_FPU_OPTION = -mieee -mfp-rounding-mode=d -endif - -%: - dh $@ - -override_dh_auto_configure: - mkdir -p static - cd static && QTDIR= cmake .. \ - -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release \ - -DWITH_CGAL_Qt3=OFF -DWITH_demos=OFF -DWITH_examples=OFF \ - -DCGAL_ENABLE_PRECONFIG=OFF -DBUILD_SHARED_LIBS=FALSE - mkdir -p shared - cd shared && QTDIR= cmake .. \ - -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release \ - -DWITH_CGAL_Qt3=OFF -DWITH_demos=OFF -DWITH_examples=OFF \ - -DCGAL_ENABLE_PRECONFIG=OFF -DBUILD_SHARED_LIBS=TRUE -DCMAKE_SKIP_RPATH=TRUE - mkdir -p shared/demo/CGAL_ipelets - cd shared/demo/CGAL_ipelets && QTDIR= cmake ../../../demo/CGAL_ipelets \ - -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release \ - -DCGAL_DIR=$(CURDIR)/shared - -override_dh_auto_build: - $(MAKE) -C static - $(MAKE) -C shared - $(MAKE) -C shared/demo/CGAL_ipelets - -override_dh_auto_test: -ifneq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS))) - $(MAKE) -C debian/tests IEEE_FPU_OPTION="$(IEEE_FPU_OPTION)" rounding_modes1 - LD_LIBRARY_PATH=shared/lib debian/tests/rounding_modes1 - $(MAKE) -C debian/tests IEEE_FPU_OPTION="$(IEEE_FPU_OPTION)" rounding_modes2 - LD_LIBRARY_PATH=shared/lib debian/tests/rounding_modes2 -endif - -override_dh_auto_clean: - dh_auto_clean - rm -fr shared static - -override_dh_install: - $(MAKE) -C static DESTDIR=$(CURDIR)/debian/tmp install - $(MAKE) -C shared DESTDIR=$(CURDIR)/debian/tmp install - $(MAKE) -C shared/demo/CGAL_ipelets DESTDIR=$(CURDIR)/debian/tmp install - - mkdir -p debian/tmp/usr/share/cmake-2.8/Modules - cp cmake/modules/FindCGAL.cmake debian/tmp/usr/share/cmake-2.8/Modules - - mv debian/tmp/usr/share/doc/CGAL-`cat VERSION` debian/tmp/usr/share/doc/cgal - mv debian/tmp/usr/share/doc/cgal/CHANGES debian/tmp/usr/share/doc/cgal/changelog - rm debian/tmp/usr/share/doc/cgal/LICENSE* - rm debian/tmp/usr/share/doc/cgal/AUTHORS - - tar cf - examples | gzip --best >debian/tmp/usr/share/doc/cgal/examples.tar.gz - tar cf - demo | gzip --best >debian/tmp/usr/share/doc/cgal/demo.tar.gz - - rm debian/tmp/usr/bin/cgal_make_macosx_app - - dh_install --sourcedir=debian/tmp --list-missing - - mkdir -p debian/libcgal-qt4-dev/usr/include/CGAL - mv debian/libcgal-dev/usr/include/CGAL/Qt debian/libcgal-qt4-dev/usr/include/CGAL - - mkdir -p debian/libcgal-qt4-10/usr/share/doc - ln -s libcgal10 debian/libcgal-qt4-10/usr/share/doc/libcgal-qt4-10 - mkdir -p debian/libcgal-dev/usr/share/doc - ln -s libcgal10 debian/libcgal-dev/usr/share/doc/libcgal-dev - mkdir -p debian/libcgal-qt4-dev/usr/share/doc - ln -s libcgal10 debian/libcgal-qt4-dev/usr/share/doc/libcgal-qt4-dev - mkdir -p debian/libcgal-demo/usr/share/doc - ln -s libcgal10 debian/libcgal-demo/usr/share/doc/libcgal-demo - mkdir -p debian/libcgal-ipelets/usr/share/doc - ln -s libcgal10 debian/libcgal-ipelets/usr/share/doc/libcgal-ipelets - -override_dh_installdocs: - dh_installdocs -plibcgal10 debian/copyright - -override_dh_installchangelogs: - dh_installchangelogs -plibcgal10 - -override_dh_shlibdeps: # TODO Is that really needed? - dh_shlibdeps -a -ldebian/libcgal10/usr/lib - -override_dh_gencontrol: - dh_gencontrol -- -VIpe-Version=`dpkg-awk 'Package:^ipe$$' -- Version | grep Version | sed 's/Version: //;s/-[^-]*$$//'` diff --git a/Maintenance/deb/wheezy/debian/source/format b/Maintenance/deb/wheezy/debian/source/format deleted file mode 100644 index 163aaf8d82b6..000000000000 --- a/Maintenance/deb/wheezy/debian/source/format +++ /dev/null @@ -1 +0,0 @@ -3.0 (quilt) diff --git a/Maintenance/deb/wheezy/debian/tests/Makefile b/Maintenance/deb/wheezy/debian/tests/Makefile deleted file mode 100644 index 7f1b7c747e5f..000000000000 --- a/Maintenance/deb/wheezy/debian/tests/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -rounding_modes1: rounding_modes1.o - g++ $^ -o $@ - -rounding_modes2: rounding_modes2.o - g++ $^ -o $@ -lCGAL -L../../shared/lib - -rounding_modes1.o: rounding_modes1.cpp - g++ -c $< -o $@ -O2 -frounding-math $(IEEE_FPU_OPTION) - -rounding_modes2.o: rounding_modes2.cpp - g++ -c $< -o $@ -O2 -frounding-math $(IEEE_FPU_OPTION) -I../../include -I../../shared/include - -clean: - rm -f *.o rounding_modes1 rounding_modes2 diff --git a/Maintenance/deb/wheezy/debian/tests/rounding_modes1.cpp b/Maintenance/deb/wheezy/debian/tests/rounding_modes1.cpp deleted file mode 100644 index 0c497a77dc3d..000000000000 --- a/Maintenance/deb/wheezy/debian/tests/rounding_modes1.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include -#include - -int modes[4] = { FE_TOWARDZERO, FE_UPWARD, FE_DOWNWARD, FE_TONEAREST }; - -std::string str (int mode) -{ - switch (mode) - { - case FE_TOWARDZERO: return "FE_TOWARDZERO"; - case FE_UPWARD: return "FE_UPWARD"; - case FE_DOWNWARD: return "FE_DOWNWARD"; - case FE_TONEAREST: return "FE_TONEAREST"; - default: throw __LINE__; - } -} - -int fetestround () -{ - volatile double eps = std::numeric_limits::denorm_min(); - - double x = -1.0; - double y = 1.0; - volatile double x_plus_eps = x + eps; - volatile double y_minus_eps = y - eps; - - if ((x == x_plus_eps) && (y == y_minus_eps)) - return FE_TONEAREST; - if (y == y_minus_eps) - return FE_UPWARD; - if (x == x_plus_eps) - return FE_DOWNWARD; - return FE_TOWARDZERO; -} - -int main (int argc, char* argv[]) -{ - int errors = 0; - - int mode_get = fegetround(); - std::cout << "fegetround() = " << str(mode_get) << " " << std::endl; - - for (int i=0; i<4; i++) - { - int mode_set = modes[i]; - fesetround (mode_set); - std::cout << "fesetround (" << str(mode_set) << ")" << std::endl; - - int mode_get = fegetround(); - std::cout << "fegetround() = " << str(mode_get) << " "; - bool ok_get = mode_get == mode_set; - if (!ok_get) - errors++; - std::cout << (ok_get ? "(ok)" : "(error)") << std::endl; - - int mode_test = fetestround(); - std::cout << "fetestround() = " << str(mode_test) << " "; - bool ok_test = mode_test == mode_set; - if (!ok_test) - errors++; - std::cout << (ok_test ? "(ok)" : "(error)") << std::endl; - } - - return errors; -} diff --git a/Maintenance/deb/wheezy/debian/tests/rounding_modes2.cpp b/Maintenance/deb/wheezy/debian/tests/rounding_modes2.cpp deleted file mode 100644 index 7892a99a83be..000000000000 --- a/Maintenance/deb/wheezy/debian/tests/rounding_modes2.cpp +++ /dev/null @@ -1,95 +0,0 @@ -// This tests the rounding mode functions. - -#include -#include -#include - -typedef CGAL::Interval_nt_advanced NT_adv; -typedef CGAL::Interval_nt<> NT; - -void print_res (bool res) -{ std::cout << (res ? "ok" : "ERROR") << std::endl; } - -// The results of 1-epsilon and -1+epsilon are enough -// to detect exactly the current rounding mode. -// 1-MIN_DOUBLE -// +------+-------+ -// | 1 | 1-ulp | -// +--------+------+-------+ -// -1+MIN_DOUBLE | -1 | near | -inf | -// | -1+ulp | +inf | zero | -// +--------+------+-------+ - -// I use a global variable here to avoid constant propagation. -double IA_min_double; - -CGAL::FPU_CW_t -FPU_empiric_test() -{ - IA_min_double = CGAL_IA_STOP_CPROP(CGAL_IA_MIN_DOUBLE); - double y = 1.0, z = -1.0; - double ye, ze; - ye = y - IA_min_double; - ze = z + IA_min_double; - if (y == ye && z == ze) return CGAL_FE_TONEAREST; - if (y == ye) return CGAL_FE_UPWARD; - if (z == ze) return CGAL_FE_DOWNWARD; - return CGAL_FE_TOWARDZERO; -} - -void print_rounding_name (CGAL::FPU_CW_t r) -{ - switch (r) { - case CGAL_FE_TONEAREST: std::cout << "NEAR\n"; break; - case CGAL_FE_DOWNWARD: std::cout << "DOWN\n"; break; - case CGAL_FE_UPWARD: std::cout << "UP\n"; break; - case CGAL_FE_TOWARDZERO: std::cout << "ZERO\n"; break; - default: std::cout << "unknown !\n"; - } -} - -int main() -{ - bool flag = true; - - flag = flag && (FPU_empiric_test() == CGAL_FE_TONEAREST); - std::cout << "default: "; - print_res(flag); - - // Should be a no-op. - CGAL::FPU_set_cw(CGAL::FPU_get_cw()); - flag = flag && (FPU_empiric_test() == CGAL_FE_TONEAREST); - std::cout << "get/set: "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - // Rounding to zero. - CGAL::FPU_set_cw(CGAL_FE_TOWARDZERO); - flag = flag && (FPU_empiric_test() == CGAL_FE_TOWARDZERO); - std::cout << "zero : "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - // Rounding to infinity. - CGAL::FPU_set_cw(CGAL_FE_UPWARD); - flag = flag && (FPU_empiric_test() == CGAL_FE_UPWARD); - std::cout << "+inf : "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - // Rounding to minus infinity. - CGAL::FPU_set_cw(CGAL_FE_DOWNWARD); - flag = flag && (FPU_empiric_test() == CGAL_FE_DOWNWARD); - std::cout << "-inf : "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - // Rounding to nearest. - CGAL::FPU_set_cw(CGAL_FE_TONEAREST); - flag = flag && (FPU_empiric_test() == CGAL_FE_TONEAREST); - std::cout << "near : "; - print_res(flag); - if (!flag) print_rounding_name(FPU_empiric_test()); - - return (int) !flag; -} diff --git a/Maintenance/deb/wheezy/debian/watch b/Maintenance/deb/wheezy/debian/watch deleted file mode 100644 index 36047492bc67..000000000000 --- a/Maintenance/deb/wheezy/debian/watch +++ /dev/null @@ -1,10 +0,0 @@ -# Note that the file URLs contain unpredictable IDs as directory. The -# uversionmagle options strips this ID. -# -# Note that only digits and "." are used to match the version number. -# Therefore we do not match beta releases. -# -version=3 -opts=uversionmangle=s/(\d+).([\d\.]+)/$2/ \ - https://gforge.inria.fr/frs/?group_id=52 \ - /frs/download.php/(\d+)/CGAL-([\d\.]+).tar.gz From 5fe32284af5ed7f148d18e1d462a697c4ed18f25 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 3 Oct 2024 11:23:23 +0100 Subject: [PATCH 250/348] Typo: labelled is UK English --- Documentation/doc/biblio/geom.bib | 10 +++++----- .../include/CGAL/Kinetic_surface_reconstruction_3.h | 4 ++-- Mesh_3/include/CGAL/Labeled_mesh_domain_3.h | 2 +- Orthtree/doc/Orthtree/Orthtree.txt | 2 +- Surface_mesher/doc/Surface_mesher/Surface_mesher.txt | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Documentation/doc/biblio/geom.bib b/Documentation/doc/biblio/geom.bib index ab364082bf86..10d1ccedb1ff 100644 --- a/Documentation/doc/biblio/geom.bib +++ b/Documentation/doc/biblio/geom.bib @@ -101937,7 +101937,7 @@ @inproceedings{mhn-fogis-82 @inproceedings{mp-drlvd-84 , author = "T. Matsuyama and T. Phillips" -, title = "Digital Realization of the Labelled {Voronoi} Diagram and its Application to Closed Boundary Detection" +, title = "Digital Realization of the Labeled {Voronoi} Diagram and its Application to Closed Boundary Detection" , booktitle = "Proc. IEEE Internat. Conf. Pattern Recogn." , year = 1984 , pages = "478--480" @@ -116182,7 +116182,7 @@ @article{p-culdo-96 @techreport{plvt-edecl-96 , author = "P. Parodi and R. Lancewicki and A. Vijh and J. K. Tsotsos" -, title = "Empirically-derived Estimates of the Complexity of Labelling Line Drawings of Polyhedral Scenes" +, title = "Empirically-derived Estimates of the Complexity of Labeling Line Drawings of Polyhedral Scenes" , number = "RBCV-TR-96-52" , institution = "Dept. Comput. Sci., Univ. Toronto" , address = "Toronto, ON" @@ -116759,7 +116759,7 @@ @article{p-farg-79 @article{p-rflg-72 , author = "T. Pavlidis" -, title = "Representation of figures by labelled graphs" +, title = "Representation of figures by labeled graphs" , journal = "Pattern Recogn." , volume = 4 , year = 1972 @@ -133630,7 +133630,7 @@ @inproceedings{skw-etgps-85 @inproceedings{sc-aipta-86 , author = "J. K. Sircar and J. A. Cerbrian" -, title = "Application of image processing techniques to the automated labelling of raster digitized contours" +, title = "Application of image processing techniques to the automated labeling of raster digitized contours" , booktitle = "Proc. 2nd Internat. Sympos. Spatial Data Handling" , year = 1986 , pages = "171--184" @@ -151991,7 +151991,7 @@ @article{bauchet2020kinetic articleno = {156}, numpages = {14}, keywords = {polygonal surface mesh, Surface reconstruction, kinetic framework, surface approximation} -} +} @article{levismooth, title={Smooth Rotation Enhanced As-Rigid-As-Possible Mesh Animation}, diff --git a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h index 7df975df13c3..e7c08b7b8567 100644 --- a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h +++ b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h @@ -2041,14 +2041,14 @@ class Kinetic_surface_reconstruction_3 { // 4 xmin // 5 zmax const double force = static_cast(m_total_inliers * 3); - // 0 - cost for labelled as outside + // 0 - cost for labeled as outside cost_matrix[0][0] = 0; cost_matrix[0][1] = 0; cost_matrix[0][2] = 0; cost_matrix[0][3] = 0; cost_matrix[0][4] = 0; cost_matrix[0][5] = 0; - // 1 - cost for labelled as inside + // 1 - cost for labeled as inside cost_matrix[1][0] = 0; cost_matrix[1][1] = 0; cost_matrix[1][2] = 0; diff --git a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h index ec47da8542dd..019716cb1ba8 100644 --- a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h @@ -1097,7 +1097,7 @@ class Labeled_mesh_domain_3 Surface_patch operator()(const Point_3& a, const Point_3& b) const { // If f(a) != f(b), then [a,b] intersects some surface. Here we consider - // [a,b] intersects surface_patch labelled (or ). + // [a,b] intersects surface_patch labeled (or ). // It may be false, further rafinement will improve precision const Subdomain_index value_a = r_domain_.function_(a); const Subdomain_index value_b = r_domain_.function_(b); diff --git a/Orthtree/doc/Orthtree/Orthtree.txt b/Orthtree/doc/Orthtree/Orthtree.txt index eb7b2559b2ac..38d979f1aed3 100644 --- a/Orthtree/doc/Orthtree/Orthtree.txt +++ b/Orthtree/doc/Orthtree/Orthtree.txt @@ -197,7 +197,7 @@ Figure \cgalFigureRef{Orthtree_traversal_fig} shows in which order nodes are visited depending on the traversal method used. \cgalFigureBegin{Orthtree_traversal_fig, quadtree_traversal.png} -%Quadtree visualized as a graph. Each node is labelled according to the +%Quadtree visualized as a graph. Each node is labeled according to the order in which it is visited by the traversal. When using leaves and level traversals, the quadtree is only partially traversed. \cgalFigureEnd diff --git a/Surface_mesher/doc/Surface_mesher/Surface_mesher.txt b/Surface_mesher/doc/Surface_mesher/Surface_mesher.txt index 658dc7bae53c..df31bc2de1e4 100644 --- a/Surface_mesher/doc/Surface_mesher/Surface_mesher.txt +++ b/Surface_mesher/doc/Surface_mesher/Surface_mesher.txt @@ -313,7 +313,7 @@ class is not yet documented because its interface and code have not yet been stabilized. The Surface Mesh Generator demo allows to mesh not only gray level images, -but also segmented images, when voxels are labelled with a domain +but also segmented images, when voxels are labeled with a domain index. Such images are for example the result of a segmentation of 3D medical images. From 42d8c22d7c962fbe2e68e96ae851c3c0c2559167 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Fri, 4 Oct 2024 09:18:07 +0200 Subject: [PATCH 251/348] remove warning fixed crash when estimating normals from context menu --- .../Kinetic_surface_reconstruction_plugin.cpp | 13 +++++++++++-- Lab/demo/Lab/Scene_item.cpp | 13 +++++++++++-- Three/include/CGAL/Three/Scene_item.h | 2 ++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp b/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp index f107f602b3d9..d0c694aa7461 100644 --- a/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp +++ b/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp @@ -146,6 +146,7 @@ class Kinetic_surface_reconstruction_plugin connect(dock_widget->partRunButton, SIGNAL(clicked(bool)), this, SLOT(run_partition())); connect(dock_widget->recRunButton, SIGNAL(clicked(bool)), this, SLOT(run_reconstruction())); connect(dock_widget->partSubdivisionCheck, SIGNAL(stateChanged(int)), this, SLOT(onSubdivisionStateChanged(int))); + connect(dock_widget, SIGNAL(visibilityChanged(bool)), this, SLOT(onVisibilityChanged(bool))); } private Q_SLOTS: void openDialog() @@ -165,6 +166,9 @@ private Q_SLOTS: } void onItemIndexSelected(int item_index) { + if (!dock_widget->isVisible()) + return; + Scene_points_with_normal_item *selection = qobject_cast(scene->item(item_index)); if (selection == nullptr) { // Keep old reference if no new point cloud has been selected. @@ -223,8 +227,7 @@ private Q_SLOTS: void onItemChanged() { // Enable detection if the point set item has normals now assert(m_pwn_item); - Point_set* points = m_pwn_item->point_set(); - std::cout << "item changed" << std::endl; + if (m_pwn_item->has_normals()) enable_detection(true); } @@ -357,6 +360,12 @@ private Q_SLOTS: dock_widget->partPolygonsPerNodeBox->setEnabled(state != 0); } + void onVisibilityChanged(bool visibility) { + if (!dock_widget->isVisible()) + return; + std::cout << "in visibility changed" << std::endl; + } + private: void convex_hull(const std::vector& region, const CGAL::Epick::Plane_3& plane, std::vector > &polys) { if (m_pwn_item == nullptr) diff --git a/Lab/demo/Lab/Scene_item.cpp b/Lab/demo/Lab/Scene_item.cpp index 1b54ec529938..104d2af1c10b 100644 --- a/Lab/demo/Lab/Scene_item.cpp +++ b/Lab/demo/Lab/Scene_item.cpp @@ -15,6 +15,7 @@ CGAL::Three::Scene_item::Scene_item(int buffers_size, int vaos_size) are_buffers_filled(false), rendering_mode(FlatPlusEdges), defaultContextMenu(nullptr), + context_menu_outdated(false), buffersSize(buffers_size), vaosSize(vaos_size), vaos(vaos_size) @@ -94,6 +95,11 @@ QString CGAL::Three::Scene_item::renderingModeName() const } QMenu* CGAL::Three::Scene_item::contextMenu() { + if (context_menu_outdated && defaultContextMenu) { + delete defaultContextMenu; + defaultContextMenu = nullptr; + } + if(defaultContextMenu) { defaultContextMenu->setTitle(name()); return defaultContextMenu; @@ -111,14 +117,17 @@ QMenu* CGAL::Three::Scene_item::contextMenu() slotName(RenderingMode(mode))); defaultContextMenu->actions().last()->setProperty("is_groupable", true); } + + context_menu_outdated = false; + return defaultContextMenu; } void CGAL::Three::Scene_item::resetMenu() { - delete defaultContextMenu; - defaultContextMenu = nullptr; + context_menu_outdated = true; } + CGAL::Three::Scene_group_item* CGAL::Three::Scene_item::parentGroup() const { return parent_group; } diff --git a/Three/include/CGAL/Three/Scene_item.h b/Three/include/CGAL/Three/Scene_item.h index b517a9c91083..b94d04fa6a9a 100644 --- a/Three/include/CGAL/Three/Scene_item.h +++ b/Three/include/CGAL/Three/Scene_item.h @@ -443,6 +443,8 @@ public Q_SLOTS: RenderingMode rendering_mode; //!The default context menu. QMenu* defaultContextMenu; + //!Specifies if the context menu should be rebuild on the next call. + bool context_menu_outdated = false; /*! Contains the previous RenderingMode. * This is used to determine if invalidateOpenGLBuffers should be called or not * in certain cases. From b77a4f349991e81d895d80600e533844d57e236f Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Fri, 4 Oct 2024 10:31:22 +0200 Subject: [PATCH 252/348] fixed warning --- .../include/CGAL/Kinetic_space_partition_3.h | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h b/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h index d1f0e5509a8e..f437f7fffa8b 100644 --- a/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h +++ b/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h @@ -2216,17 +2216,11 @@ class Kinetic_space_partition_3 { adapt_faces(cdtC); - idx = 0; - for (auto& p : a_sets) { + for (idx = 0; idx < a_sets.size(); idx++) adapt_internal_edges(cdtC, a_constraints[idx]); - idx++; - } - idx = 0; - for (auto& p : b_sets) { + for (idx = 0; idx < b_sets.size(); idx++) adapt_internal_edges(cdtC, b_constraints[idx]); - idx++; - } } void make_conformal(Octree_node node) { From 6e18225c2791631fb38133daa22afc374b4a3f56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 4 Oct 2024 16:04:59 +0200 Subject: [PATCH 253/348] remove extra template keyword --- AABB_tree/include/CGAL/AABB_tree.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AABB_tree/include/CGAL/AABB_tree.h b/AABB_tree/include/CGAL/AABB_tree.h index c63fdf38679d..9dd8460abd2d 100644 --- a/AABB_tree/include/CGAL/AABB_tree.h +++ b/AABB_tree/include/CGAL/AABB_tree.h @@ -551,7 +551,7 @@ namespace CGAL { traits.intersection(query, singleton_data()); break; default: // if(size() >= 2) - root_node()->template traversal_with_priority_and_group_traversal(m_primitives, query, traits, m_primitives.size(), 0, group_traversal_bound); + root_node()->traversal_with_priority_and_group_traversal(m_primitives, query, traits, m_primitives.size(), 0, group_traversal_bound); } } From 499bcadc4b4e9d416fb08e35bcd7acc9b5560b84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 4 Oct 2024 16:08:31 +0200 Subject: [PATCH 254/348] remove extra template keyword --- .../test/Intersections_3/test_intersections_Line_3.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Intersections_3/test/Intersections_3/test_intersections_Line_3.cpp b/Intersections_3/test/Intersections_3/test_intersections_Line_3.cpp index 936e077e018e..7285c22be726 100644 --- a/Intersections_3/test/Intersections_3/test_intersections_Line_3.cpp +++ b/Intersections_3/test/Intersections_3/test_intersections_Line_3.cpp @@ -156,9 +156,9 @@ struct Line_3_intersection_tester Pl pl(pl0, pl1, pl2); P pl3 = pl0 + FT(this->r.get_double()) * V(pl1 - pl0) + FT(this->r.get_double()) * V(pl1 - pl0); if(pl.has_on(l1)) - Base::template check_intersection(L(pl3, l1), pl, L(pl3, l1)); // both points on the plane + Base::check_intersection(L(pl3, l1), pl, L(pl3, l1)); // both points on the plane else - Base::template check_intersection(L(pl3, l1), pl, pl3); // single point on the plane + Base::check_intersection(L(pl3, l1), pl, pl3); // single point on the plane if(pl.oriented_side(l0) != pl.oriented_side(l1)) // l0 xor l1 on pl is fine { From 1ca47bdabf5832755b4d120edebee13be437324c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 4 Oct 2024 16:09:54 +0200 Subject: [PATCH 255/348] add missing include directive --- Hash_map/include/CGAL/Hash_map/internal/chained_map.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Hash_map/include/CGAL/Hash_map/internal/chained_map.h b/Hash_map/include/CGAL/Hash_map/internal/chained_map.h index bea9b0993f00..27e38ee59d5c 100644 --- a/Hash_map/include/CGAL/Hash_map/internal/chained_map.h +++ b/Hash_map/include/CGAL/Hash_map/internal/chained_map.h @@ -17,6 +17,7 @@ #define CGAL_HASH_MAP_INTERNAL_CHAINED_MAP_H #include +#include #include #include #include From e3bd371c3e942a55c66a60ba4a7185f2c9571c6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 4 Oct 2024 17:06:14 +0200 Subject: [PATCH 256/348] copy properties correctly --- Point_set_3/include/CGAL/Point_set_3.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Point_set_3/include/CGAL/Point_set_3.h b/Point_set_3/include/CGAL/Point_set_3.h index cda736435349..c7d127e0b86b 100644 --- a/Point_set_3/include/CGAL/Point_set_3.h +++ b/Point_set_3/include/CGAL/Point_set_3.h @@ -245,8 +245,8 @@ class Point_set_3 m_base = ps.m_base; m_indices = this->property_map ("index").value(); m_points = this->property_map ("point").value(); - m_normals = this->property_map ("normal").value(); m_nb_removed = ps.m_nb_removed; + copy_properties(ps); return *this; } @@ -257,7 +257,7 @@ class Point_set_3 m_base = ps.m_base; m_indices = this->property_map ("index").value(); m_points = this->property_map ("point").value(); - m_normals = this->property_map ("normal").value(); + copy_properties(ps); m_nb_removed = ps.m_nb_removed; } /// \endcond From 40f48328d882d627c577ebef212f0ed8cca4394d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 4 Oct 2024 17:31:06 +0200 Subject: [PATCH 257/348] test copy and assignement for properties --- .../test/Point_set_3/point_set_test.cpp | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/Point_set_3/test/Point_set_3/point_set_test.cpp b/Point_set_3/test/Point_set_3/point_set_test.cpp index b745fe6e94ec..086feabfaceb 100644 --- a/Point_set_3/test/Point_set_3/point_set_test.cpp +++ b/Point_set_3/test/Point_set_3/point_set_test.cpp @@ -28,6 +28,26 @@ void test (bool expr, const char* msg) ++ nb_success; } +bool copy_and_assignement() +{ + Point_set ps1; + ps1.add_property_map("prop", int(3)); + ps1.add_normal_map(); + Point_set ps2 = ps1; + if (!ps2.has_property_map("prop")) return false; + if (!ps2.has_normal_map()) return false; + Point_set ps3(ps1); + if (!ps3.has_property_map("prop")) return false; + if (!ps3.has_normal_map()) return false; + ps1=Point_set(); + Point_set ps4 = ps1; + if (ps4.has_property_map("prop")) return false; + if (ps4.has_normal_map()) return false; + Point_set ps5(ps1); + if (ps5.has_property_map("prop")) return false; + if (ps5.has_normal_map()) return false; + return true; +} int main (int, char**) { @@ -130,7 +150,9 @@ int main (int, char**) std::unordered_set std_hash; boost::unordered_set boost_hash; + test(copy_and_assignement(), "copy and assignement"); + std::cerr << nb_success << "/" << nb_test << " test(s) succeeded." << std::endl; - return EXIT_SUCCESS; + return nb_success==nb_test ? EXIT_SUCCESS : EXIT_FAILURE; } From dd02af92a2cf367552bef3aaebdca40f6ceb17a2 Mon Sep 17 00:00:00 2001 From: albert-github Date: Sat, 5 Oct 2024 11:28:29 +0200 Subject: [PATCH 258/348] issue #8515 Spelling mistakes found checking `en-GB` to `en-US` Spelling corrections, `en-GB` -> `en-US` --- .../CGAL/AABB_tree/internal/AABB_node.h | 2 +- .../Algebraic_kernel_d/Bitstream_descartes.h | 16 ++++++------- .../Bitstream_descartes_rndl_tree.h | 2 +- .../Algebraic_kernel_d/Curve_analysis_2.h | 2 +- .../CGAL/Algebraic_kernel_d/LRU_hashed_map.h | 4 ++-- .../CGAL/Algebraic_kernel_d/exceptions.h | 4 ++-- .../include/CGAL/Algebraic_kernel_d/flags.h | 2 +- .../Algebraic_kernel_d/Curve_analysis_2.cpp | 2 +- Alpha_shapes_3/include/CGAL/Alpha_shape_3.h | 2 +- .../include/CGAL/_count_alpha.h | 2 +- .../Arrangement_on_surface_2_earth/Aos.cpp | 2 +- .../CGAL/Arr_geometry_traits/Rational_arc_2.h | 6 ++--- .../CGAL/Arr_rat_arc/Rational_arc_d_1.h | 6 ++--- .../CGAL/Arrangement_2/Arr_traits_adaptor_2.h | 2 +- .../gfx/Curve_renderer_traits.h | 2 +- .../graph/Graph_with_descriptor_with_graph.h | 2 +- .../Boolean_set_operations_2.txt | 4 ++-- .../CGAL/Min_sphere_annulus_d_traits_2.h | 2 +- .../CGAL/Min_sphere_annulus_d_traits_3.h | 2 +- .../CGAL/Min_sphere_annulus_d_traits_d.h | 2 +- .../Khachiyan_approximation.h | 2 +- .../Min_sphere_of_spheres_d_pair.h | 2 +- .../include/CGAL/min_quadrilateral_2.h | 6 ++--- .../include/CGAL/rectangular_3_center_2.h | 2 +- .../test/Bounding_volumes/min_sphere_test.cpp | 2 +- .../min_sphere_traits_2_test.cpp | 2 +- .../min_sphere_traits_3_test.cpp | 2 +- .../Bounding_volumes/test_Min_annulus_d.h | 2 +- .../Bounding_volumes/test_Min_annulus_d_2.cpp | 2 +- .../Bounding_volumes/test_Min_annulus_d_3.cpp | 2 +- .../Bounding_volumes/test_Min_annulus_d_d.cpp | 2 +- .../test/Bounding_volumes/test_Min_circle.cpp | 2 +- .../Bounding_volumes/test_Min_ellipse_2.cpp | 2 +- CGAL_ImageIO/include/CGAL/ImageIO/analyze.h | 2 +- CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h | 14 +++++------ .../include/CGAL/ImageIO/recline_impl.h | 2 +- .../include/CGAL/Combinatorial_map.h | 4 ++-- .../Combinatorial_map_copy_functors.h | 12 +++++----- .../CGAL/Combinatorial_map_operations.h | 4 ++-- Combinatorial_map/include/CGAL/Dart.h | 4 ++-- .../include/CGAL/Compute_cone_boundaries_2.h | 2 +- .../include/CGAL/Construct_theta_graph_2.h | 2 +- .../include/CGAL/Construct_yao_graph_2.h | 2 +- .../include/CGAL/gnuplot_output_2.h | 2 +- .../Developer_manual/cmakelist_script.txt | 2 +- .../doc/Documentation/Preliminaries.txt | 2 +- .../Documentation/Tutorials/Tutorial_GIS.txt | 2 +- Documentation/doc/Documentation/main.txt | 2 +- Filtered_kernel/include/CGAL/Lazy.h | 2 +- .../include/CGAL/GMap_cell_iterators.h | 2 +- .../include/CGAL/GMap_dart_iterators.h | 2 +- .../include/CGAL/Generalized_map.h | 6 ++--- .../include/CGAL/Generalized_map_operations.h | 4 ++-- Generator/doc/Generator/CGAL/Random.h | 2 +- .../CGAL/Lipschitz_sizing_field_criteria_2.h | 2 +- GraphicsView/include/CGAL/Qt/camera_impl.h | 2 +- HalfedgeDS/include/CGAL/HalfedgeDS_vector.h | 2 +- Installation/CHANGES.md | 24 +++++++++---------- .../combinatorial_repair.h | 2 +- .../Jet_fitting_3/PolyhedralSurf_rings.h | 2 +- Lab/demo/Lab/Plugins/Mesh_2/mesh_2_dialog.ui | 2 +- Lab/demo/Lab/Plugins/Mesh_3/Volume_plane.h | 2 +- Lab/demo/Lab/Viewer.h | 6 ++--- .../demo/Linear_cell_complex/MainWindow.cpp | 2 +- .../Linear_cell_complex.txt | 2 +- .../doc/Matrix_search/Matrix_search.txt | 2 +- .../CGAL/Delaunay_mesh_size_criteria_2.h | 2 +- .../Mesh_3/Charting/run_benchmark.py | 2 +- .../Slivers_exuder_cell_attributes_traits.h | 2 +- Mesh_3/include/CGAL/Mesh_3/config.h | 2 +- .../Minkowski_sum_2/AABB_node_with_join.h | 4 ++-- Nef_2/include/CGAL/Nef_2/PM_point_locator.h | 2 +- Nef_2/include/CGAL/Nef_2/gen_point_location.h | 2 +- Nef_3/doc/Nef_3/Nef_3.txt | 2 +- Number_types/doc/Number_types/CGAL/Gmpfi.h | 2 +- .../Algebraic_extension_traits.h | 2 +- .../CGAL/Sqrt_extension/Fraction_traits.h | 2 +- Number_types/include/CGAL/boost_mp_type.h | 2 +- Number_types/include/CGAL/leda_integer.h | 2 +- .../test/Number_types/Sqrt_extension.h | 2 +- .../Optimisation_basic/description.txt | 2 +- Orthtree/include/CGAL/Orthtree.h | 2 +- .../include/CGAL/Periodic_2_triangulation_2.h | 4 ++-- .../CGAL/Periodic_2_triangulation_dummy_12.h | 4 ++-- .../Protect_edges_sizing_field.h | 2 +- .../include/CGAL/Periodic_3_mesh_3/config.h | 2 +- .../include/CGAL/Periodic_3_triangulation_3.h | 4 ++-- .../Periodic_3_triangulation_dummy_36.h | 4 ++-- .../include/CGAL/_count_alpha_periodic_3.h | 2 +- .../CGAL/Poisson_mesh_cell_criteria_3.h | 2 +- .../Polygon_2/Polygon_2_algorithms_impl.h | 2 +- .../Polygon_mesh_processing/autorefinement.h | 2 +- .../Polygon_mesh_processing/compute_normal.h | 2 +- .../CGAL/Polygon_mesh_processing/distance.h | 2 +- .../Ray_3_Triangle_3_traversal_traits.h | 2 +- .../repair_degeneracies.h | 2 +- .../include/CGAL/Polynomial/bezout_matrix.h | 2 +- .../include/CGAL/Polynomial/determinant.h | 4 ++-- .../CGAL/Polytope_distance_d_traits_2.h | 2 +- .../CGAL/Polytope_distance_d_traits_3.h | 2 +- .../CGAL/Polytope_distance_d_traits_d.h | 2 +- .../Concepts/PolytopeDistanceDTraits.h | 2 +- .../test/Polytope_distance_d/test_PD.cpp | 2 +- .../test_Polytope_distance_d.h | 2 +- .../test_Polytope_distance_d_2.cpp | 2 +- .../test_Polytope_distance_d_3.cpp | 2 +- .../Polytope_distance_d/test_width_cube.cpp | 2 +- .../test_width_simplex.cpp | 2 +- .../fig_src/documentation/algorithmicx.sty | 2 +- .../QP_solver/master_mps_to_derivatives.cpp | 2 +- .../examples/Ridges_3/PolyhedralSurf_rings.h | 2 +- Ridges_3/test/Ridges_3/PolyhedralSurf_rings.h | 2 +- .../doc/STL_Extension/PackageDescription.txt | 4 ++-- .../developer_scripts/create_internal_release | 2 +- Scripts/developer_scripts/licensecheck | 2 +- .../Segment_Delaunay_graph_2.txt | 2 +- .../doc/Stream_support/IOstream.txt | 4 ++-- .../include/CGAL/IO/OI/Inventor_ostream.h | 4 ++-- .../include/CGAL/IO/VRML/VRML_2_ostream.h | 4 ++-- Stream_support/include/CGAL/IO/io.h | 2 +- .../include/CGAL/Surface_mesh/Surface_mesh.h | 2 +- .../Iterative_authalic_parameterizer_3.h | 4 ++-- .../Surface_mesh_shortest_path.h | 6 ++--- .../include/CGAL/draw_face_graph_with_paths.h | 2 +- .../CGAL/Triangulation_ds_face_base_2.h | 2 +- TDS_3/include/CGAL/Triangulation_simplex_3.h | 2 +- Three/include/CGAL/Three/Scene_item.h | 2 +- .../CGAL/Three/Scene_item_rendering_helper.h | 6 ++--- .../include/CGAL/Triangulation_ds_vertex.h | 2 +- .../Constrained_Delaunay_triangulation_2.h | 2 +- .../CGAL/Constrained_triangulation_2.h | 2 +- .../include/CGAL/Regular_triangulation_2.h | 2 +- .../include/CGAL/Triangulation_2.h | 2 +- Triangulation_3/TODO | 2 +- .../Triangulation_benchmark_3.cpp | 2 +- .../CGAL/_test_cls_triangulation_simplex_3.h | 2 +- 136 files changed, 197 insertions(+), 197 deletions(-) diff --git a/AABB_tree/include/CGAL/AABB_tree/internal/AABB_node.h b/AABB_tree/include/CGAL/AABB_tree/internal/AABB_node.h index a5c09f42fb46..bf878268f59f 100644 --- a/AABB_tree/include/CGAL/AABB_tree/internal/AABB_node.h +++ b/AABB_tree/include/CGAL/AABB_tree/internal/AABB_node.h @@ -56,7 +56,7 @@ class AABB_node /** * @brief General traversal query * @param query the query - * @param traits the traversal traits that define the traversal behaviour + * @param traits the traversal traits that define the traversal behavior * @param nb_primitives the number of primitive * * General traversal query. The traits class allows using it for the various diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Bitstream_descartes.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Bitstream_descartes.h index 654ffa9a46d4..1527a3eb7d49 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Bitstream_descartes.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Bitstream_descartes.h @@ -65,7 +65,7 @@ class Bitstream_descartes; /* - * \brief Thrown whenever a non-specialised virtual member function is called + * \brief Thrown whenever a non-specialized virtual member function is called */ class Virtual_method_exception {}; @@ -128,7 +128,7 @@ class Generic_descartes_rep /*! * Constructor computing an interval containing all real roots of \c f, - * and initialising the Bitstream Descartes tree + * and initializing the Bitstream Descartes tree */ Generic_descartes_rep(Bitstream_descartes_type type, Polynomial f, @@ -170,7 +170,7 @@ class Generic_descartes_rep /*! * Constructor that copies the Bitstream tree given from outside - * and initialising the Bitstream Descartes tree + * and initializing the Bitstream Descartes tree * The tree must "fit" to the polynomial */ Generic_descartes_rep(Bitstream_descartes_type type, @@ -367,7 +367,7 @@ class Generic_descartes_rep /*! * \brief When does the isolation algorithm terminate? * - * This method must be specialised by derived classes + * This method must be specialized by derived classes */ virtual bool termination_condition() { throw Virtual_method_exception(); @@ -378,7 +378,7 @@ class Generic_descartes_rep * \brief gives an opportunity to process the nodes after * the subdivision steps are finished * - * This method must be specialised by derived classes, but can + * This method must be specialized by derived classes, but can * remain empty in many cases. */ virtual void process_nodes() { @@ -389,7 +389,7 @@ class Generic_descartes_rep /*! \brief returns whether the \c i th root is definitely a simple root * of the isolated polynomial * - * Must be specialised by derived class + * Must be specialized by derived class */ virtual bool is_certainly_simple_root(int) const { throw Virtual_method_exception(); @@ -399,7 +399,7 @@ class Generic_descartes_rep /*! \brief returns whether the \c i th root is definitely a multiple root * of the isolated polynomial * - * Must be specialised by derived class + * Must be specialized by derived class */ virtual bool is_certainly_multiple_root(int) const { throw Virtual_method_exception(); @@ -1082,7 +1082,7 @@ class Vert_line_adapter_descartes_rep * variant of the Bitstream Descartes method: The Square_free_descartes_tag * starts the usual Bitstream method for square free integer polynomials. * With the M_k_descartes tag, it is able to handle one multiple root in - * favourable situations, the Backshear_descartes_tag allows to isolate + * favorable situations, the Backshear_descartes_tag allows to isolate * even more complicated polynomials, if the multiple roots with even * multiplicity can be refined from outside. See the corresponding * constructors for more information. diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Bitstream_descartes_rndl_tree.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Bitstream_descartes_rndl_tree.h index a76e1c6cecae..8e64832546a1 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Bitstream_descartes_rndl_tree.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Bitstream_descartes_rndl_tree.h @@ -865,7 +865,7 @@ class Bitstream_descartes_rndl_tree_rep { by trying randomly and checking. This randomization means the same polynomial and same initial interval may give rise to different intervals each time this class is used. - As indicated in the paper, we favour subdivision ratios + As indicated in the paper, we favor subdivision ratios with a small denominator. Hence we first try denominator 2 (subdivision at midpoint), then denominator 16, and only then the "proper" denominator prescribed by theory. diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h index 6fecb592a121..a3dc59edfea8 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h @@ -469,7 +469,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { * (\c SHEAR_ONLY_AT_IRRATIONAL_STRATEGY) * is to \c shear the curve * if a degenerate situation is detected during the analysis, - * except at rational x-coordinates where the curve can be analysed + * except at rational x-coordinates where the curve can be analyzed * more directly. The analysis * is then performed in the sheared system, and finally translated back * into the original system. diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/LRU_hashed_map.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/LRU_hashed_map.h index e53c9100aec4..1a7100840582 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/LRU_hashed_map.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/LRU_hashed_map.h @@ -140,7 +140,7 @@ class LRU_hashed_map virtual ~LRU_hashed_map() { } - /*! \brief implements cache-like behaviour of the map + /*! \brief implements cache-like behavior of the map * * If the object is not in the map, it is constructed using \c Creator * and added to the map @@ -312,7 +312,7 @@ class LRU_hashed_map_with_kernel ~LRU_hashed_map_with_kernel() { } - /*! \brief implements cache-like behaviour of the map + /*! \brief implements cache-like behavior of the map * * If the object is not in the map, it is constructed using \c Creator * and added to the map diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/exceptions.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/exceptions.h index 4dd9c4b51225..6a184c377e8d 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/exceptions.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/exceptions.h @@ -25,7 +25,7 @@ namespace CGAL { /*! * \brief Exception class for not sufficiently generic positions. * - * Must be thrown whenever a curve cannot be analysed because its position + * Must be thrown whenever a curve cannot be analyzed because its position * is not "good enough". */ class Non_generic_position_exception { @@ -40,7 +40,7 @@ namespace CGAL { /*! * \brief Exception class for not sufficiently generic positions. * - * Must be thrown whenever a curve cannot be analysed because its position + * Must be thrown whenever a curve cannot be analyzed because its position * is not "good enough". */ template diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/flags.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/flags.h index 6b402fbfd234..0317bf7ea118 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/flags.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/flags.h @@ -76,7 +76,7 @@ /** * If set, the curve and curve pair analysis are using specialized code - * to analyse conic curves, i.e. curves of degree 2 + * to analyze conic curves, i.e. curves of degree 2 */ #ifndef CGAL_ACK_USE_SPECIAL_TREATMENT_FOR_CONIX #define CGAL_ACK_USE_SPECIAL_TREATMENT_FOR_CONIX 0 diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/Curve_analysis_2.cpp b/Algebraic_kernel_d/test/Algebraic_kernel_d/Curve_analysis_2.cpp index f8ba0d8495ef..9527a8876500 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/Curve_analysis_2.cpp +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/Curve_analysis_2.cpp @@ -330,7 +330,7 @@ template void test_routine() { #endif } - { // More tests...just analyse some curves and compute their segments + { // More tests...just analyze some curves and compute their segments Poly_int2 f = from_string("P[8(0,P[8(0,24)(1,-8)(2,-162)(3,204)(4,106)(5,-340)(6,240)(7,-72)(8,8)])(1,P[6(0,-60)(1,8)(2,304)(3,-400)(4,148)(5,8)(6,-8)])(2,P[6(0,18)(1,80)(2,-165)(3,-132)(4,367)(5,-212)(6,38)])(3,P[4(0,-30)(1,-136)(2,264)(3,-72)(4,-26)])(4,P[4(0,-15)(1,36)(2,89)(3,-144)(4,49)])(5,P[2(0,30)(1,-24)(2,-6)])(6,P[2(0,-6)(1,-28)(2,22)])(8,P[0(0,3)])]"); Curve_analysis_2 curve= construct_curve_2(f); #if CGAL_ACK_DEBUG_FLAG diff --git a/Alpha_shapes_3/include/CGAL/Alpha_shape_3.h b/Alpha_shapes_3/include/CGAL/Alpha_shape_3.h index a4a93f825158..f468f9056f8e 100644 --- a/Alpha_shapes_3/include/CGAL/Alpha_shape_3.h +++ b/Alpha_shapes_3/include/CGAL/Alpha_shape_3.h @@ -1638,7 +1638,7 @@ compute_edge_status( const Cell_handle& c, last=ccirc; while (is_infinite(ccirc) ) ++ccirc; //skip infinite incident cells alpha = (*ccirc).get_alpha(); - as.set_alpha_mid(alpha); // initialise as.alpha_mid to alpha value of an incident cell + as.set_alpha_mid(alpha); // initialize as.alpha_mid to alpha value of an incident cell as.set_alpha_max(alpha); // same for as.alpha_max while (++ccirc != last) { diff --git a/Alpha_shapes_3/test/Alpha_shapes_3/include/CGAL/_count_alpha.h b/Alpha_shapes_3/test/Alpha_shapes_3/include/CGAL/_count_alpha.h index f7c0fb41d4d1..c38cd3bb53e5 100644 --- a/Alpha_shapes_3/test/Alpha_shapes_3/include/CGAL/_count_alpha.h +++ b/Alpha_shapes_3/test/Alpha_shapes_3/include/CGAL/_count_alpha.h @@ -218,7 +218,7 @@ test_filtration(AS &A, bool verbose) typename AS::NT alpha; if(verbose) { std::cerr << std::endl; - std::cerr << "Analyse filtration " << std::endl; + std::cerr << "Analyze filtration " << std::endl; } for (; filtre_it != filtration.end(); filtre_it++) { if(assign(vertex, *filtre_it)) { diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2_earth/Aos.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2_earth/Aos.cpp index 27dd2a5968b4..2d782eec1ac8 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2_earth/Aos.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2_earth/Aos.cpp @@ -40,7 +40,7 @@ namespace { Flag(bool init) : v{ init } {} }; - // EXTENDED AOS for analysing the arrangement + // EXTENDED AOS for analyzing the arrangement using Ext_dcel = CGAL::Arr_extended_dcel; using Ext_topol_traits = CGAL::Arr_spherical_topology_traits_2; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Rational_arc_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Rational_arc_2.h index c1a690bcb8e7..aea70d5331a8 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Rational_arc_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Rational_arc_2.h @@ -339,7 +339,7 @@ class _Base_rational_arc_2 if (! valid) return; - // Analyze the behaviour of the rational function at x = -oo (the source). + // Analyze the behavior of the rational function at x = -oo (the source). Algebraic y0; const Arr_parameter_space inf_s = _analyze_at_minus_infinity (_numer, _denom, y0); @@ -351,7 +351,7 @@ class _Base_rational_arc_2 else // if (inf_s == ARR_INTERIOR) _ps = Point_2 (0, y0); - // Analyze the behaviour of the rational function at x = +oo (the target). + // Analyze the behavior of the rational function at x = +oo (the target). const Arr_parameter_space inf_t = _analyze_at_plus_infinity (_numer, _denom, y0); @@ -735,7 +735,7 @@ class _Base_rational_arc_2 */ Self split_at_pole (const Algebraic& x0) { - // Analyze the behaviour of the function near the given pole. + // Analyze the behavior of the function near the given pole. const std::pair signs = _analyze_near_pole (x0); const CGAL::Sign sign_left = signs.first; const CGAL::Sign sign_right = signs.second; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h index f3921b44149e..71af407c54e6 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h @@ -450,7 +450,7 @@ class Base_rational_arc_d_1 _info = (_info | IS_DIRECTED_RIGHT); - // Analyze the behaviour of the rational function at x = -oo (the source). + // Analyze the behavior of the rational function at x = -oo (the source). Algebraic_real_1 y0; const Arr_parameter_space inf_s = _analyze_at_minus_infinity(P, Q, y0); @@ -460,7 +460,7 @@ class Base_rational_arc_d_1 _info = (_info | SRC_AT_Y_PLUS_INFTY); else // if (inf_s == ARR_INTERIOR) _ps = Algebraic_point_2(); //the point is a dummy - //Analyze the behaviour of the rational function at x = +oo (the target). + //Analyze the behavior of the rational function at x = +oo (the target). const Arr_parameter_space inf_t = _analyze_at_plus_infinity(P, Q, y0); if (inf_t == ARR_BOTTOM_BOUNDARY) @@ -949,7 +949,7 @@ class Base_rational_arc_d_1 Self split_at_pole(const Algebraic_real_1& x0) { - // Analyze the behaviour of the function near the given pole. + // Analyze the behavior of the function near the given pole. const std::pair signs = _analyze_near_pole(x0); const CGAL::Sign sign_left = signs.first; const CGAL::Sign sign_right = signs.second; 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 97c9b5b0f5b8..d044c21edf03 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 @@ -1578,7 +1578,7 @@ class Arr_traits_basic_adaptor_2 : public ArrangementBasicTraits_ { return res; } - // otherwise: both ends have asymptotic behaviour + // otherwise: both ends have asymptotic behavior if (ps_y1 == ps_y2) { // need special y-comparison if (ce1 == ce2) { // both ends approach asymptote from one side Comparison_result res = m_self->compare_x_near_boundary_2_object()(xcv1, xcv2, ce2); diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_traits.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_traits.h index f2e6ecfc314f..4c8c1a382bbf 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_traits.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_traits.h @@ -24,7 +24,7 @@ * \brief * defines class Curve_renderer_traits. * - * provides specialisations of Curve_renderer_traits for different number + * provides specializations of Curve_renderer_traits for different number * types compatible with the curve renderer */ diff --git a/BGL/include/CGAL/boost/graph/Graph_with_descriptor_with_graph.h b/BGL/include/CGAL/boost/graph/Graph_with_descriptor_with_graph.h index b5d16f74d3b9..368c5fca5245 100644 --- a/BGL/include/CGAL/boost/graph/Graph_with_descriptor_with_graph.h +++ b/BGL/include/CGAL/boost/graph/Graph_with_descriptor_with_graph.h @@ -733,7 +733,7 @@ struct Graph_with_descriptor_with_graph_property_map { } }; // class Graph_with_descriptor_with_graph_property_map -//specialisation for lvaluepropertymaps +//specialization for lvaluepropertymaps template struct Graph_with_descriptor_with_graph_property_map { diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Boolean_set_operations_2.txt b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Boolean_set_operations_2.txt index d03add5708ad..661e4d89ae56 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Boolean_set_operations_2.txt +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Boolean_set_operations_2.txt @@ -542,13 +542,13 @@ boundary of each input (linear) polygon as a cyclic sequence of single (\f$x\f$-monotone) polylines. By default, `UsePolylines` is set to `CGAL::Tag_true`, which implies that the boundary of the each input (linear) polygon is treated as a cyclic sequence of (\f$x\f$-monotone) -polylines. In most cases this behaviour is superior (that is, less +polylines. In most cases this behavior is superior (that is, less time-consuming) because the number of events handled as part of the execution of the plane-sweep algorithm is reduced. In cases where the boundaries of the input polygons frequently intersect, treating them as polylines may become less efficient. In these cases substitute the `UsePolylines` template parameter with `CGAL::Tag_false` to restore -the original behaviour (where the boundary of each input linear +the original behavior (where the boundary of each input linear polygon is treated as a cyclic sequence of single \f$x\f$-monotone segments). diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_2.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_2.h index d3c56d3b0956..b28261807048 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_2.h @@ -5,7 +5,7 @@ namespace CGAL { \ingroup PkgBoundingVolumesRef The class `Min_sphere_annulus_d_traits_2` is a traits class for the \f$ d\f$-dimensional -optimisation algorithms using the two-dimensional \cgal kernel. +optimization algorithms using the two-dimensional \cgal kernel. \tparam K must bea model for `Kernel`. \tparam ET NT are models for `RingNumberType`. Their default type is `K::RT`. diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_3.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_3.h index 84284beefc55..5d57a716ada8 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_3.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_3.h @@ -5,7 +5,7 @@ namespace CGAL { \ingroup PkgBoundingVolumesRef The class `Min_sphere_annulus_d_traits_3` is a traits class for the \f$ d\f$-dimensional -optimisation algorithms using the three-dimensional \cgal kernel. +optimization algorithms using the three-dimensional \cgal kernel. \tparam K must be a model for `Kernel`. \tparam ET NT are models for `RingNumberType`. Their default type is `K::RT`. diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_d.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_d.h index f2bc035794b9..046cced2d58c 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_d.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_d.h @@ -5,7 +5,7 @@ namespace CGAL { \ingroup PkgBoundingVolumesRef The class `Min_sphere_annulus_d_traits_d` is a traits class for the \f$ d\f$-dimensional -optimisation algorithms using the \f$ d\f$-dimensional \cgal kernel. +optimization algorithms using the \f$ d\f$-dimensional \cgal kernel. \tparam K must be a model for `Kernel`. \tparam ET NT are models for `RingNumberType`. Their default type is `K::RT`. diff --git a/Bounding_volumes/include/CGAL/Approximate_min_ellipsoid_d/Khachiyan_approximation.h b/Bounding_volumes/include/CGAL/Approximate_min_ellipsoid_d/Khachiyan_approximation.h index 0fc9ef14af1d..e200621f7ea1 100644 --- a/Bounding_volumes/include/CGAL/Approximate_min_ellipsoid_d/Khachiyan_approximation.h +++ b/Bounding_volumes/include/CGAL/Approximate_min_ellipsoid_d/Khachiyan_approximation.h @@ -71,7 +71,7 @@ namespace CGAL { std::vector P; // input points int n; // number of input points, i.e., P.size() - // This class comes in two flavours: + // This class comes in two flavors: // // (i) When Embed is false, the input points are taken to be // ordinary points in R^{d_P}, where d_P is the dimension of the diff --git a/Bounding_volumes/include/CGAL/Min_sphere_of_spheres_d/Min_sphere_of_spheres_d_pair.h b/Bounding_volumes/include/CGAL/Min_sphere_of_spheres_d/Min_sphere_of_spheres_d_pair.h index b51de487eb32..be95cea772c5 100644 --- a/Bounding_volumes/include/CGAL/Min_sphere_of_spheres_d/Min_sphere_of_spheres_d_pair.h +++ b/Bounding_volumes/include/CGAL/Min_sphere_of_spheres_d/Min_sphere_of_spheres_d_pair.h @@ -33,7 +33,7 @@ namespace CGAL_MINIBALL_NAMESPACE { // they are convertible to double. // This is indeed the least invasive fix dropint the function that were // defined here and cause linkage bug. - // You can still have a behaviour of instantiating only if a type + // You can still have a behavior of instantiating only if a type // is convertibale to double (by using type_traits together with _if) // but until "the whole design should be overhauled at some point" // this is fine. diff --git a/Bounding_volumes/include/CGAL/min_quadrilateral_2.h b/Bounding_volumes/include/CGAL/min_quadrilateral_2.h index 081520c08462..8e78c9f42a34 100644 --- a/Bounding_volumes/include/CGAL/min_quadrilateral_2.h +++ b/Bounding_volumes/include/CGAL/min_quadrilateral_2.h @@ -376,7 +376,7 @@ min_rectangle_2( // quadruple of points defining the current rectangle ForwardIterator curr[4]; - // initialised to the points defining the bounding box + // initialized to the points defining the bounding box convex_bounding_box_2(f, l, curr, t); // curr[i] can be advanced (cyclically) until it reaches limit[i] @@ -482,7 +482,7 @@ min_parallelogram_2(ForwardIterator f, // quadruple of points defining the bounding box ForwardIterator curr[4]; - // initialised to the points defining the bounding box + // initialized to the points defining the bounding box convex_bounding_box_2(first, l, curr, t); @@ -659,7 +659,7 @@ min_strip_2(ForwardIterator f, // quadruple of points defining the bounding box ForwardIterator curr[4]; - // initialised to the points defining the bounding box + // initialized to the points defining the bounding box convex_bounding_box_2(first, l, curr, t); ForwardIterator low = curr[0]; diff --git a/Bounding_volumes/include/CGAL/rectangular_3_center_2.h b/Bounding_volumes/include/CGAL/rectangular_3_center_2.h index 276f286fcbf6..9d280f2eaf07 100644 --- a/Bounding_volumes/include/CGAL/rectangular_3_center_2.h +++ b/Bounding_volumes/include/CGAL/rectangular_3_center_2.h @@ -135,7 +135,7 @@ rectangular_3_center_2_type1( rad = sdist(v(r, 2), v(r, 0)); // init to prevent default constructor requirement Point bestpoint = *f; - // (initialisation avoids warning) + // (initialization avoids warning) unsigned int bestrun = 0; // two cases: top-left & bottom-right or top-right & bottom-left diff --git a/Bounding_volumes/test/Bounding_volumes/min_sphere_test.cpp b/Bounding_volumes/test/Bounding_volumes/min_sphere_test.cpp index ff82ea1bdb0e..816cb353d441 100644 --- a/Bounding_volumes/test/Bounding_volumes/min_sphere_test.cpp +++ b/Bounding_volumes/test/Bounding_volumes/min_sphere_test.cpp @@ -11,7 +11,7 @@ // release : $CGAL_Revision: CGAL-wip $ // release_date : $CGAL_Date$ // -// chapter : $CGAL_Chapter: Optimisation $ +// chapter : $CGAL_Chapter: Geometric Optimization $ // package : $CGAL_Package: MinSphere $ // file : min_sphere_test.C // source : web/Optimisation/Min_sphere_d.aw 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 0f137fd20ffa..cd79be09588f 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 @@ -12,7 +12,7 @@ // release : $CGAL_Revision: CGAL-wip $ // release_date : $CGAL_Date$ // -// chapter : $CGAL_Chapter: Optimisation $ +// chapter : $CGAL_Chapter: Geometric Optimization $ // package : $CGAL_Package: MinSphere $ // file : min_sphere_traits_2_test.C // source : web/Optimisation/Min_sphere_d.aw 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 efb0bed98c89..01fb795f2648 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 @@ -11,7 +11,7 @@ // release : $CGAL_Revision: CGAL-wip $ // release_date : $CGAL_Date$ // -// chapter : $CGAL_Chapter: Optimisation $ +// chapter : $CGAL_Chapter: Geometric Optimization $ // package : $CGAL_Package: MinSphere $ // file : min_sphere_traits_3_test.C // source : web/Optimisation/Min_sphere_d.aw diff --git a/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d.h b/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d.h index a1b3c9e88e08..f393618663f1 100644 --- a/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d.h +++ b/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d.h @@ -13,7 +13,7 @@ // // file : test/Min_annulus_d/test_Min_annulus_d.h // package : $CGAL_Package: Min_annulus_d $ -// chapter : Geometric Optimisation +// chapter : Geometric Optimization // // source : web/Min_annulus_d.aw // revision : $Id$ diff --git a/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d_2.cpp b/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d_2.cpp index 8592a9fe9771..b13bb42c0e47 100644 --- a/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d_2.cpp +++ b/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d_2.cpp @@ -13,7 +13,7 @@ // // file : test/Min_annulus_d/test_Min_annulus_d_2.cpp // package : $CGAL_Package: Min_annulus_d $ -// chapter : Geometric Optimisation +// chapter : Geometric Optimization // // revision : $Id$ // revision_date : $Date$ diff --git a/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d_3.cpp b/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d_3.cpp index 09dbce7b6802..b003679c0f96 100644 --- a/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d_3.cpp +++ b/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d_3.cpp @@ -13,7 +13,7 @@ // // file : test/Min_annulus_d/test_Min_annulus_d_3.cpp // package : $CGAL_Package: Min_annulus_d $ -// chapter : Geometric Optimisation +// chapter : Geometric Optimization // // revision : $Id$ // revision_date : $Date$ diff --git a/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d_d.cpp b/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d_d.cpp index 3d667bead471..4594b2b430e2 100644 --- a/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d_d.cpp +++ b/Bounding_volumes/test/Bounding_volumes/test_Min_annulus_d_d.cpp @@ -13,7 +13,7 @@ // // file : test/Min_annulus_d/test_Min_annulus_d_d.cpp // package : $CGAL_Package: Min_annulus_d $ -// chapter : Geometric Optimisation +// chapter : Geometric Optimization // // revision : $Id$ // revision_date : $Date$ diff --git a/Bounding_volumes/test/Bounding_volumes/test_Min_circle.cpp b/Bounding_volumes/test/Bounding_volumes/test_Min_circle.cpp index 01ce8cc429af..5d94946b23ec 100644 --- a/Bounding_volumes/test/Bounding_volumes/test_Min_circle.cpp +++ b/Bounding_volumes/test/Bounding_volumes/test_Min_circle.cpp @@ -13,7 +13,7 @@ // // file : test/Min_circle_2/test_Min_circle_2.C // package : $CGAL_Package: Min_circle_2 $ -// chapter : Geometric Optimisation +// chapter : Geometric Optimization // // source : web/Min_circle_2.aw // revision : $Id$ 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 535aa4674b1c..2410147ccb50 100644 --- a/Bounding_volumes/test/Bounding_volumes/test_Min_ellipse_2.cpp +++ b/Bounding_volumes/test/Bounding_volumes/test_Min_ellipse_2.cpp @@ -13,7 +13,7 @@ // // file : test/Min_ellipse_2/test_Min_ellipse_2.C // package : $CGAL_Package: Min_ellipse_2 $ -// chapter : Geometric Optimisation +// chapter : Geometric Optimization // // source : web/Min_ellipse_2.aw // revision : $Id$ diff --git a/CGAL_ImageIO/include/CGAL/ImageIO/analyze.h b/CGAL_ImageIO/include/CGAL/ImageIO/analyze.h index 98d27a0d9942..cbc4eae9109f 100644 --- a/CGAL_ImageIO/include/CGAL/ImageIO/analyze.h +++ b/CGAL_ImageIO/include/CGAL/ImageIO/analyze.h @@ -21,7 +21,7 @@ #include -/* read analyse format header +/* read analyze format header return: -1: error diff --git a/CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h b/CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h index 9c27b948b3d3..b6eb465253f6 100644 --- a/CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h +++ b/CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h @@ -108,8 +108,8 @@ typedef std::uint32_t CGAL_UINT32; */ /* - * Bitmapfileheader defines a single bitmap image. Its analogue in the - * Windows SDK is the Bitmapfileheader. Its analogues in the OS/2 Toolkit are + * Bitmapfileheader defines a single bitmap image. Its analog in the + * Windows SDK is the Bitmapfileheader. Its analogs in the OS/2 Toolkit are * the Bitmapfileheader and Bitmapfileheader2 structures. * * A BITMAPHEADER structure is always concatenated to the end of a @@ -128,7 +128,7 @@ typedef struct Bitmapfileheader /* * BITMAPARRAYHEADER is used to establish a linked list of Bitmapfileheader * structures for a bitmap file with multiple images in it. There is no - * equivalent structure in the Windows SDK. Its analogues in the OS/2 toolkit + * equivalent structure in the Windows SDK. Its analogs in the OS/2 toolkit * are the BITMAPARRAYFILEHEADER and BITMAPARRAYFILEHEADER2 structures. * * A Bitmapfileheader structure is always concatenated to the end of a @@ -145,9 +145,9 @@ typedef struct BITMAPARRAYHEADER /* - * BITMAPHEADER defines the properties of a bitmap. Its analogues in the + * BITMAPHEADER defines the properties of a bitmap. Its analogs in the * Windows SDK are the BITMAPCOREINFOHEADER and BITMAPINFOHEADER structures. - * Its analogues in the OS/2 Toolkit are the BITMAPINFOHEADER and + * Its analogs in the OS/2 Toolkit are the BITMAPINFOHEADER and * BITMAPINFOHEADER2 structures. * * A color table is concatenated to this structure. The number of elements in @@ -188,8 +188,8 @@ typedef struct BITMAPHEADER /* - * RGB defines a single color palette entry. Its analogues in the Windows SDK - * are the RGBTRIPLE and RGBQUAD structures. Its analogues in the OS/2 + * RGB defines a single color palette entry. Its analogs in the Windows SDK + * are the RGBTRIPLE and RGBQUAD structures. Its analogs in the OS/2 * Toolkit are the RGB and RGB2 structure. */ typedef struct RGB diff --git a/CGAL_ImageIO/include/CGAL/ImageIO/recline_impl.h b/CGAL_ImageIO/include/CGAL/ImageIO/recline_impl.h index 4b5374898e50..e4b694efa78a 100644 --- a/CGAL_ImageIO/include/CGAL/ImageIO/recline_impl.h +++ b/CGAL_ImageIO/include/CGAL/ImageIO/recline_impl.h @@ -283,7 +283,7 @@ RFcoefficientType * InitRecursiveCoefficients( double x, b0 /= x; b1 /= x; - /*--- normalisation ---*/ + /*--- normalization ---*/ switch ( derivative ) { default : CGAL_FALLTHROUGH; diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map.h b/Combinatorial_map/include/CGAL/Combinatorial_map.h index 7bf8295c6656..5473aeaf277b 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map.h @@ -662,7 +662,7 @@ namespace CGAL { } /** Create a new dart and add it to the map. - * The marks of the darts are initialised with mmask_marks, i.e. the dart + * The marks of the darts are initialized with mmask_marks, i.e. the dart * is unmarked for all the marks. * @return a Dart_descriptor on the new dart. */ @@ -4111,7 +4111,7 @@ namespace CGAL { } if (ah != null_descriptor) { - // We initialise the 0-atttrib to ah + // We initialize the 0-atttrib to ah internal::Set_i_attribute_of_dart_functor:: run(*this, d1, ah); } diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_copy_functors.h b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_copy_functors.h index 5cbf7b7861a6..f570d59b187b 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_copy_functors.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_copy_functors.h @@ -228,7 +228,7 @@ struct Call_functor_if_both_attributes_have_point const Pointconverter&) { return Map2::null_descriptor; } }; -// Specialisation with i==0 and both attributes have points. +// Specialization with i==0 and both attributes have points. template< typename Map1, typename Map2, typename Pointconverter > struct Call_functor_if_both_attributes_have_point @@ -285,7 +285,7 @@ struct Copy_attribute_functor_if_nonvoid cmap2.template set_attribute(dh2, res); } }; -// Specialisation when attr1 is void, and attr2 is non void i==0. Nothing to +// Specialization when attr1 is void, and attr2 is non void i==0. Nothing to // copy, but if 0-attributes has point and i==0, we need to create // vertex attributes. template(dh2, cmap2.template create_attribute<0>()); } }; -// Specialisation when attr1 is void, and attr2 is non void i!=0. +// Specialization when attr1 is void, and attr2 is non void i!=0. // Nothing to do. template @@ -360,7 +360,7 @@ struct Copy_dart_info_functor_if_nonvoid const DartInfoConverter& converter) { converter(map1, map2, dh1, dh2); } }; -// Specialisation when Info1 is void. +// Specialization when Info1 is void. template struct Copy_dart_info_functor_if_nonvoid struct Copy_dart_info_functor_if_nonvoid struct Copy_dart_info_functor_if_nonvoid diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h b/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h index 72c89d401422..c1ca6c1987e5 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h @@ -36,7 +36,7 @@ namespace CGAL { static bool run(const CMap& amap, typename CMap::Dart_const_descriptor adart) { - // TODO? Optimisation for dim-2, and to not test all the darts of the cell? + // TODO? Optimization for dim-2, and to not test all the darts of the cell? bool res = true; for ( CGAL::CMap_dart_const_iterator_of_cell it(amap, adart); res && it.cont(); ++it ) @@ -462,7 +462,7 @@ namespace CGAL { static bool run(const CMap& amap, typename CMap::Dart_const_descriptor adart) { - // TODO ? Optimisation possible to not test all the darts of the cell ? + // TODO ? Optimization possible to not test all the darts of the cell ? bool res = true; for ( CGAL::CMap_dart_const_iterator_of_cell it(amap, adart); res && it.cont(); ++it ) diff --git a/Combinatorial_map/include/CGAL/Dart.h b/Combinatorial_map/include/CGAL/Dart.h index 17ffde4b294d..0fb809b6d810 100644 --- a/Combinatorial_map/include/CGAL/Dart.h +++ b/Combinatorial_map/include/CGAL/Dart.h @@ -156,7 +156,7 @@ namespace CGAL { } protected: - /** Default constructor: no real initialisation, + /** Default constructor: no real initialization, * because this is done in the combinatorial map class. */ Dart_without_info() @@ -300,7 +300,7 @@ namespace CGAL { { return Base::operator==(other) && minfo==other.minfo; } protected: - /** Default constructor: no real initialisation, + /** Default constructor: no real initialization, * because this is done in the combinatorial or generalized map class. */ Dart()=default; // default => zero-initializing built-in types diff --git a/Cone_spanners_2/include/CGAL/Compute_cone_boundaries_2.h b/Cone_spanners_2/include/CGAL/Compute_cone_boundaries_2.h index 4256fd0dc179..a4069a1168a4 100644 --- a/Cone_spanners_2/include/CGAL/Compute_cone_boundaries_2.h +++ b/Cone_spanners_2/include/CGAL/Compute_cone_boundaries_2.h @@ -115,7 +115,7 @@ class Compute_cone_boundaries_2 { #if defined(CGAL_USE_LEDA) || defined(CGAL_USE_CORE) /* - The specialised functor for computing the directions of cone boundaries exactly + The specialized functor for computing the directions of cone boundaries exactly with a given cone number and a given initial direction. */ template <> diff --git a/Cone_spanners_2/include/CGAL/Construct_theta_graph_2.h b/Cone_spanners_2/include/CGAL/Construct_theta_graph_2.h index d4b47ed33c22..3d1ebc15efbd 100644 --- a/Cone_spanners_2/include/CGAL/Construct_theta_graph_2.h +++ b/Cone_spanners_2/include/CGAL/Construct_theta_graph_2.h @@ -199,7 +199,7 @@ class Construct_theta_graph_2 { std::vector S(vit, ve); std::sort(S.begin (), S.end (), orderD1); - // Step 2: Initialise an empty set to store vertices sorted by orderD2 + // Step 2: initialize an empty set to store vertices sorted by orderD2 typedef CGAL::ThetaDetail::Plane_scan_tree S(vit, ve); std::sort(S.begin (), S.end (), orderD1); - // Step 2: Initialise an empty set to store vertices sorted by orderD2 + // Step 2: initialize an empty set to store vertices sorted by orderD2 Point_set pst(orderD2); // Step 3: visit S in orderD1 diff --git a/Cone_spanners_2/include/CGAL/gnuplot_output_2.h b/Cone_spanners_2/include/CGAL/gnuplot_output_2.h index 65324f601341..d2cb402e37ae 100644 --- a/Cone_spanners_2/include/CGAL/gnuplot_output_2.h +++ b/Cone_spanners_2/include/CGAL/gnuplot_output_2.h @@ -93,7 +93,7 @@ std::string gnuplot_vertex_list (const Graph& g); /* This struct is defined to use partial specialization to generate arrow styles differently for * directed and undirected graphs. - * Note: Need to use structs because C++ before 11 doesn't allow partial specialisation + * Note: Need to use structs because C++ before 11 doesn't allow partial specialization * for functions */ template diff --git a/Documentation/doc/Documentation/Developer_manual/cmakelist_script.txt b/Documentation/doc/Documentation/Developer_manual/cmakelist_script.txt index 26c1f7c0ef4b..eeae486b2362 100644 --- a/Documentation/doc/Documentation/Developer_manual/cmakelist_script.txt +++ b/Documentation/doc/Documentation/Developer_manual/cmakelist_script.txt @@ -17,7 +17,7 @@ configuration. create a single executable for 'source' linked with compilations of all other source files (`*.cc`, `*.cp`, `*.cxx`, `*.cpp`, `*.CPP`, `*.c++`, or `*.C`). -This behaviour is usually needed for (graphical) demos. +This behavior is usually needed for (graphical) demos. If the parameter is not given, the script creates one executable for each given source file. diff --git a/Documentation/doc/Documentation/Preliminaries.txt b/Documentation/doc/Documentation/Preliminaries.txt index 2e2ae95e661e..f2006d051544 100644 --- a/Documentation/doc/Documentation/Preliminaries.txt +++ b/Documentation/doc/Documentation/Preliminaries.txt @@ -47,7 +47,7 @@ also avoid CMake to link with the native threads support library on your system. Much of the \cgal code contains assert statements for preconditions, and postconditions of functions as well as in the code. These assertions can be switched on and off per package -and the user can change the error behaviour. For details see Section \ref secchecks +and the user can change the error behavior. For details see Section \ref secchecks of Chapter \ref Chapter_STL_Extensions_for_CGAL. \section Preliminaries_flags Compile-time Flags to Control Inlining diff --git a/Documentation/doc/Documentation/Tutorials/Tutorial_GIS.txt b/Documentation/doc/Documentation/Tutorials/Tutorial_GIS.txt index 9ac43d3eb534..546e53c7cd8e 100644 --- a/Documentation/doc/Documentation/Tutorials/Tutorial_GIS.txt +++ b/Documentation/doc/Documentation/Tutorials/Tutorial_GIS.txt @@ -193,7 +193,7 @@ An example of a raster image with a rainbow ramp representing height is given in \cgalFigureRef{TutorialGISFigRastering}. \cgalFigureBegin{TutorialGISFigRastering, raster.jpg} -Raster visualisation of height using a rainbow ramp, ranging from +Raster visualization of height using a rainbow ramp, ranging from light blue for low values to dark red for high values. \cgalFigureEnd diff --git a/Documentation/doc/Documentation/main.txt b/Documentation/doc/Documentation/main.txt index 2026356b76cf..acb38973dadf 100644 --- a/Documentation/doc/Documentation/main.txt +++ b/Documentation/doc/Documentation/main.txt @@ -38,7 +38,7 @@ other contexts can be done by obtaining a commercial license from [GeometryFactory](https://www.geometryfactory.com). For more details see the \ref license "License" page. -

    Acknowledgement

    +

    Acknowledgment

    We provide bibtex entries for each package so that you can cite \cgal correctly in your publications, see the page \ref how_to_cite_cgal. diff --git a/Filtered_kernel/include/CGAL/Lazy.h b/Filtered_kernel/include/CGAL/Lazy.h index 2f1201ee239a..d8f714a1831a 100644 --- a/Filtered_kernel/include/CGAL/Lazy.h +++ b/Filtered_kernel/include/CGAL/Lazy.h @@ -1377,7 +1377,7 @@ struct Ith { typedef T2 result_type; // We keep a Sign member object - // for future utilisation, in case + // for future utilization, in case // we have pairs of 2 T2 objects e.g. // for a numeric_point vector returned // from a construction of a possible diff --git a/Generalized_map/include/CGAL/GMap_cell_iterators.h b/Generalized_map/include/CGAL/GMap_cell_iterators.h index 55dbbff83086..1dbef9dcd6ed 100644 --- a/Generalized_map/include/CGAL/GMap_cell_iterators.h +++ b/Generalized_map/include/CGAL/GMap_cell_iterators.h @@ -24,7 +24,7 @@ namespace CGAL { * - GMap_cell_iterator: one dart per each i-cell * - GMap_one_dart_per_incident_cell_iterator * - GMap_one_dart_per_cell_iterator - * - one specialisation of the CMap_cell_iterator for the + * - one specialization of the CMap_cell_iterator for the * GMap_dart_iterator_basic_of_all iterator */ diff --git a/Generalized_map/include/CGAL/GMap_dart_iterators.h b/Generalized_map/include/CGAL/GMap_dart_iterators.h index b2eaaf97b70a..3e8b843eb6f9 100644 --- a/Generalized_map/include/CGAL/GMap_dart_iterators.h +++ b/Generalized_map/include/CGAL/GMap_dart_iterators.h @@ -249,7 +249,7 @@ namespace CGAL { class GMap_dart_iterator_basic_of_two_alpha; /* Class CMap_dart_iterator_basic_of_two_alpha: to iterate * on the darts of the orbit : Ai:: run(*this, d1, ah); mark(*it, amark); @@ -3471,7 +3471,7 @@ namespace CGAL { , 0>:: run(*this,d1,d2); - // We initialise the 0-atttrib to ah + // We initialize the 0-atttrib to ah CGAL::internal::Set_i_attribute_of_dart_functor:: run(*this, d2, ah); } diff --git a/Generalized_map/include/CGAL/Generalized_map_operations.h b/Generalized_map/include/CGAL/Generalized_map_operations.h index 4c65af865db4..47fc476bfc99 100644 --- a/Generalized_map/include/CGAL/Generalized_map_operations.h +++ b/Generalized_map/include/CGAL/Generalized_map_operations.h @@ -35,7 +35,7 @@ namespace CGAL { static bool run(const GMap& amap, typename GMap::Dart_const_descriptor adart) { - // TODO? Optimisation for dim-2, and to not test all the darts of the cell? + // TODO? Optimization for dim-2, and to not test all the darts of the cell? bool res = true; for ( CGAL::GMap_dart_const_iterator_of_cell it(amap, adart); res && it.cont(); ++it ) @@ -258,7 +258,7 @@ namespace CGAL { static bool run(const GMap& amap, typename GMap::Dart_const_descriptor adart) { - // TODO ? Optimisation possible to not test all the darts of the cell ? + // TODO ? Optimization possible to not test all the darts of the cell ? bool res = true; for ( CGAL::GMap_dart_const_iterator_of_cell it(amap, adart); res && it.cont(); ++it ) diff --git a/Generator/doc/Generator/CGAL/Random.h b/Generator/doc/Generator/CGAL/Random.h index abf2e0da6ab7..d46697dc229a 100644 --- a/Generator/doc/Generator/CGAL/Random.h +++ b/Generator/doc/Generator/CGAL/Random.h @@ -15,7 +15,7 @@ a state that uniquely determines the subsequent numbers being produced. It can be very useful, e.g. for debugging, to reproduce a sequence of -random numbers. This can be done by either initialising with a fixed +random numbers. This can be done by either initializing with a fixed seed, or by using the state functions as described below. \note A `Random` object is not deterministic when used by several threads at diff --git a/GraphicsView/demo/Triangulation_2/include/CGAL/Lipschitz_sizing_field_criteria_2.h b/GraphicsView/demo/Triangulation_2/include/CGAL/Lipschitz_sizing_field_criteria_2.h index ad844db31acb..1df267ad9550 100644 --- a/GraphicsView/demo/Triangulation_2/include/CGAL/Lipschitz_sizing_field_criteria_2.h +++ b/GraphicsView/demo/Triangulation_2/include/CGAL/Lipschitz_sizing_field_criteria_2.h @@ -62,7 +62,7 @@ class Lipschitz_sizing_field_criteria_2 const double& size() const { return second; } const double& sine() const { return first; } - // q1pivotPoint(); } /*! Sets the Camera's position() and orientation() from an OpenGL ModelView matrix. -This enables a Camera initialisation from an other OpenGL application. \p +This enables a Camera initialization from an other OpenGL application. \p modelView is a 16 GLdouble vector representing a valid OpenGL ModelView matrix, such as one can get using: \code GLdouble mvm[16]; glGetDoublev(GL_MODELVIEW_MATRIX, mvm); diff --git a/HalfedgeDS/include/CGAL/HalfedgeDS_vector.h b/HalfedgeDS/include/CGAL/HalfedgeDS_vector.h index f13214b9bf92..871a27e91799 100644 --- a/HalfedgeDS/include/CGAL/HalfedgeDS_vector.h +++ b/HalfedgeDS/include/CGAL/HalfedgeDS_vector.h @@ -604,7 +604,7 @@ class HalfedgeDS_vector // This guard is needed here because, rr==ll==begin, might be true // at this point, causing the decrement to result in undefined - // behaviour. + // behavior. // [Fernando Cacciola] if ( ll < rr ) { diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 5b10c290afaa..6bef3dfa53a0 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -1915,7 +1915,7 @@ Release date: April 2018 after the observer is notified that the edge has been removed. This is symmetric (opposite) to the order of notification when an edge is inserted. - The user can restore old (non-symmetric) behaviour by defining the macro: + The user can restore old (non-symmetric) behavior by defining the macro: `CGAL_NON_SYMETRICAL_OBSERVER_EDGE_REMOVAL_BACKWARD_COMPATIBILITY` @@ -3456,7 +3456,7 @@ Release date: October 2013 vertices which would move of very small displacements. - Introduce new data structures and options for speed-up and compacity. Note that `Compact_mesh_cell_base_3` and - `Mesh_vertex_base_3` are now our favoured implementations of the + `Mesh_vertex_base_3` are now our favored implementations of the concepts MeshCellBase\_3 and MeshVertexBase\_3. - Introduce a new constructor for `Polyhedral_mesh_domain_3` that takes a bounding polyhedron to be meshed along with a polyhedral @@ -4567,9 +4567,9 @@ fixes for this release. - The new macro CGAL\_NO\_DEPRECATED\_CODE can be defined to disable deprecated code, helping users discover if they rely on code that may be removed in subsequent releases. -- Assertion behaviour: It is not possible anymore to set the CONTINUE +- Assertion behavior: It is not possible anymore to set the CONTINUE mode for assertion failures. Functions that allow to change the - assertion behaviour are now declared in + assertion behavior are now declared in ``. - Qt3 based demos are still there but the documentation has been removed as the CGAL::Qt\_Widget will be deprecated. @@ -5118,7 +5118,7 @@ static runtime (/ML). - 2D Placement of Streamlines (new package) Visualizing vector fields is important for many application domains. A good way to do it is to generate streamlines that describe the - flow behaviour. This package implements the "Farthest Point Seeding" + flow behavior. This package implements the "Farthest Point Seeding" 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 @@ -5140,7 +5140,7 @@ static runtime (/ML). structures. The package supports exact or inexact operations on primitives which move along polynomial trajectories. - Smallest Enclosing Ellipsoid (new package) - This algorithm is new in the chapter Geometric Optimisation. + This algorithm is new in the chapter Geometric Optimization. - 2D Arrangement (major revision) This package can be used to construct, maintain, alter, and display arrangements in the plane. Once an arrangement is constructed, the @@ -5155,9 +5155,9 @@ static runtime (/ML). construction history of the arrangement, such that it is possible to obtain the originating curve of an arrangement subcurve. -- Geometric Optimisation (major revision) +- Geometric Optimization (major revision) The underlying QP solver which is the foundation for several - algorithms in the Geometric Optimisation chapter has been completely + algorithms in the Geometric Optimization chapter has been completely rewritten. - 3D Triangulation (new functionality) Regular\_triangulation\_3 now offers vertex removal. @@ -5483,7 +5483,7 @@ The following functionality has been added or changed: Face\_handle or Vertex\_handle. - New classes Triangulation\_vertex\_base\_with\_info\_2 (and 3) and Triangulation\_face\_base\_with\_info\_2 (and 3) to make - easier the customisation of base classes in most cases. + easier the customization of base classes in most cases. - 2D Triangulation - Regular triangulation provides an easy access to hidden points. - The Triangulation\_hierarchy\_2, which provide an efficient @@ -5985,7 +5985,7 @@ kernels themselves can be used as traits classes in many instances. - The traits class requirements have been changed. - The simplicity test has a completely new implementation. - Properties like convexity, simplicity and area can now be cached - by polygons. You need to set a flag to select this behaviour. + by polygons. You need to set a flag to select this behavior. @@ -6158,7 +6158,7 @@ The following functionality has been added: stored within a class, debugging is easier using this kernel. This kernel can also be faster in some cases than the reference-counted Cartesian kernel. -- New optimisation algorithms +- New optimization algorithms - Min\_annulus\_d - Algorithm for computing the smallest enclosing annulus of points in arbitrary dimension - Polytope\_distance\_d - Algorithm for computing the (squared) @@ -6215,7 +6215,7 @@ The following functionality has been added: triangulations. - Triangulations in 3D were added, both Delaunay triangulations and regular triangulations. -- Min\_quadrilateral optimisations have been added. These are +- Min\_quadrilateral optimizations have been added. These are algorithms to compute the minimum enclosing rectangle/parallelogram (arbitrary orientation) and the minimum enclosing strip of a convex point set. diff --git a/Installation/include/CGAL/license/Polygon_mesh_processing/combinatorial_repair.h b/Installation/include/CGAL/license/Polygon_mesh_processing/combinatorial_repair.h index cf07529839b1..8f3640a725df 100644 --- a/Installation/include/CGAL/license/Polygon_mesh_processing/combinatorial_repair.h +++ b/Installation/include/CGAL/license/Polygon_mesh_processing/combinatorial_repair.h @@ -9,7 +9,7 @@ // // Author(s) : Andreas Fabri // -// Warning: this file is generated, see include/CGAL/licence/README.md +// Warning: this file is generated, see include/CGAL/license/README.md // not entirely true due to the backward compatibility issue #ifndef CGAL_LICENSE_POLYGON_MESH_PROCESSING_COMBINATORIAL_REPAIR_H diff --git a/Jet_fitting_3/examples/Jet_fitting_3/PolyhedralSurf_rings.h b/Jet_fitting_3/examples/Jet_fitting_3/PolyhedralSurf_rings.h index a5866bee2ad5..9c7e08268a85 100644 --- a/Jet_fitting_3/examples/Jet_fitting_3/PolyhedralSurf_rings.h +++ b/Jet_fitting_3/examples/Jet_fitting_3/PolyhedralSurf_rings.h @@ -19,7 +19,7 @@ template < class TPoly , class VertexPropertyMap> class T_PolyhedralSurf_rings // typedef typename boost::property_traits::value_type vpm_value_type; // typedef typename boost::property_traits::key_type vpm_key_type; - //vertex indices are initialised to -1 + //vertex indices are initialized to -1 static void reset_ring_indices(std::vector < Vertex * >&vces, VertexPropertyMap& vpm); diff --git a/Lab/demo/Lab/Plugins/Mesh_2/mesh_2_dialog.ui b/Lab/demo/Lab/Plugins/Mesh_2/mesh_2_dialog.ui index b809786a2b6c..fad384423b7f 100644 --- a/Lab/demo/Lab/Plugins/Mesh_2/mesh_2_dialog.ui +++ b/Lab/demo/Lab/Plugins/Mesh_2/mesh_2_dialog.ui @@ -66,7 +66,7 @@ - Run Lloyd Optimisation + Run Lloyd Optimization Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter diff --git a/Lab/demo/Lab/Plugins/Mesh_3/Volume_plane.h b/Lab/demo/Lab/Plugins/Mesh_3/Volume_plane.h index a5399210b43f..062755fb0cce 100644 --- a/Lab/demo/Lab/Plugins/Mesh_3/Volume_plane.h +++ b/Lab/demo/Lab/Plugins/Mesh_3/Volume_plane.h @@ -280,7 +280,7 @@ private : //according to the tag, a,b,c dim change but not the scale. We look for the max dimension of the whole image. //A high scale factor will often go with a low dimension, to compensate it. So we don't want a max being the - //higher scale * the higher dim, hence the tag specialisation. + //higher scale * the higher dim, hence the tag specialization. //TODO: set the scale factors according to the dimensipon to avoid doing that. double compute_maxDim(x_tag) const { diff --git a/Lab/demo/Lab/Viewer.h b/Lab/demo/Lab/Viewer.h index 9989344a4026..3af444f63b96 100644 --- a/Lab/demo/Lab/Viewer.h +++ b/Lab/demo/Lab/Viewer.h @@ -144,15 +144,15 @@ public Q_SLOTS: void paintEvent(QPaintEvent *)override; void paintGL()override; - //!Defines the behaviour for the mouse press events + //!Defines the behavior for the mouse press events void mousePressEvent(QMouseEvent*)override; void mouseDoubleClickEvent(QMouseEvent*)override; void wheelEvent(QWheelEvent *)override; - //!Defines the behaviour for the key press events + //!Defines the behavior for the key press events void keyPressEvent(QKeyEvent*)override; //!Deal with context menu events void contextMenuEvent(QContextMenuEvent*)override; - //!Defines the behaviour for the key release events + //!Defines the behavior for the key release events void keyReleaseEvent(QKeyEvent *)override; protected: diff --git a/Linear_cell_complex/demo/Linear_cell_complex/MainWindow.cpp b/Linear_cell_complex/demo/Linear_cell_complex/MainWindow.cpp index 9237d1913479..855d26e4bb69 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/MainWindow.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/MainWindow.cpp @@ -2780,7 +2780,7 @@ void MainWindow::sierpinski_carpet_copy_attributes_and_embed_vertex LCC::Helper::Foreach_enabled_attributes_except , 0>:: run(*(scene.lcc),sierpinskiCarpetSurfaces[0],it); - // We initialise the 0-atttrib to ah + // We initialize the 0-atttrib to ah scene.lcc->set_dart_attribute<0>(it, ah); } } diff --git a/Linear_cell_complex/doc/Linear_cell_complex/Linear_cell_complex.txt b/Linear_cell_complex/doc/Linear_cell_complex/Linear_cell_complex.txt index cac02fc6200d..d58e0f6e2e52 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/Linear_cell_complex.txt +++ b/Linear_cell_complex/doc/Linear_cell_complex/Linear_cell_complex.txt @@ -252,7 +252,7 @@ Before applying the sew operation, the eight vertices of the first cube are colo \subsection Linear_cell_complexAutomaticAttributesManagement Automatic Attribute Management \anchor ssecAttributesManagement -The following example illustrates the use of the automatic attributes management for a linear cell complex. An off file is loaded into a 2D linear cell complex embedded in 3D. Then, a certain percentage of edges is removed from the linear cell complex. The same method is applied twice: the first time by using the automatic attributes management (which is the default behaviour) and the second time by calling first \link GenericMap::set_automatic_attributes_management `set_automatic_attributes_management(false)`\endlink to disable the automatic updating of attributes. +The following example illustrates the use of the automatic attributes management for a linear cell complex. An off file is loaded into a 2D linear cell complex embedded in 3D. Then, a certain percentage of edges is removed from the linear cell complex. The same method is applied twice: the first time by using the automatic attributes management (which is the default behavior) and the second time by calling first \link GenericMap::set_automatic_attributes_management `set_automatic_attributes_management(false)`\endlink to disable the automatic updating of attributes. We can observe that the second run is faster than the first one. Indeed, updating attribute for each edge removal give a bigger complexity. Moreover, the gain increases when the percentage of removed edges increases. diff --git a/Matrix_search/doc/Matrix_search/Matrix_search.txt b/Matrix_search/doc/Matrix_search/Matrix_search.txt index 268c96cf7161..002c6110c97e 100644 --- a/Matrix_search/doc/Matrix_search/Matrix_search.txt +++ b/Matrix_search/doc/Matrix_search/Matrix_search.txt @@ -10,7 +10,7 @@ namespace CGAL { `monotone_matrix_search()` and `sorted_matrix_search()` are techniques that deal with the problem of efficiently finding largest entries in matrices with certain structural properties. Many -concrete problems can be modelled as matrix search problems, and for +concrete problems can be modeled as matrix search problems, and for some of them we provide explicit solutions that allow you to solve them without knowing about the matrix search technique. Examples are, the computation of all furthest neighbors for the vertices of a convex diff --git a/Mesh_2/include/CGAL/Delaunay_mesh_size_criteria_2.h b/Mesh_2/include/CGAL/Delaunay_mesh_size_criteria_2.h index eb3bb083b009..adf57dfe1947 100644 --- a/Mesh_2/include/CGAL/Delaunay_mesh_size_criteria_2.h +++ b/Mesh_2/include/CGAL/Delaunay_mesh_size_criteria_2.h @@ -58,7 +58,7 @@ class Delaunay_mesh_size_criteria_2 : const double& size() const { return second; } const double& sine() const { return first; } - // q1 { return c->slivers_exuder_restore_attributes(attr); } -}; // end partial specialisation Slivers_ex_att_t_aux +}; // end partial specialization Slivers_ex_att_t_aux template struct Slivers_exuder_cell_attributes_traits diff --git a/Mesh_3/include/CGAL/Mesh_3/config.h b/Mesh_3/include/CGAL/Mesh_3/config.h index cc2e5187f9be..3fd66c2f8666 100644 --- a/Mesh_3/include/CGAL/Mesh_3/config.h +++ b/Mesh_3/include/CGAL/Mesh_3/config.h @@ -18,7 +18,7 @@ //#define CGAL_MESH_3_VERBOSE 1 -// Use optimisations of Mesh_3 +// Use optimizations of Mesh_3 # define CGAL_CONSTRUCT_INTRUSIVE_LIST_RANGE_CONSTRUCTOR 1 # define CGAL_MESH_3_NEW_GET_FACETS 1 # define CGAL_MESH_3_GET_FACETS_USING_INTRUSIVE_LIST 1 diff --git a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_node_with_join.h b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_node_with_join.h index 0c828665cc2a..27a3bd4679dd 100644 --- a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_node_with_join.h +++ b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_node_with_join.h @@ -65,7 +65,7 @@ class AABB_node_with_join /** * @brief General traversal query * @param query the query - * @param traits the traversal traits that define the traversal behaviour + * @param traits the traversal traits that define the traversal behavior * @param nb_primitives the number of primitive * * General traversal query. The traits class allows using it for the various @@ -79,7 +79,7 @@ class AABB_node_with_join /** * @param other_node root node of a tree which we want to traverse in parallel - * @param traits the traversal traits that define the traversal behaviour + * @param traits the traversal traits that define the traversal behavior * @param nb_primitives the number of primitives in this tree * @param nb_primitives_other the number of primitives in the other tree * @param first_stationary if true, the other_node is the translatable tree's root diff --git a/Nef_2/include/CGAL/Nef_2/PM_point_locator.h b/Nef_2/include/CGAL/Nef_2/PM_point_locator.h index ed10484d5745..886e13a12e90 100644 --- a/Nef_2/include/CGAL/Nef_2/PM_point_locator.h +++ b/Nef_2/include/CGAL/Nef_2/PM_point_locator.h @@ -536,7 +536,7 @@ class PM_point_locator : public The efficiency of this point location module is mostly based on heuristics. Therefore worst case bounds are not very expressive. The query operations take up to linear time for subsequent query - operations though they are better in practise. They trigger a one-time + operations though they are better in practize. They trigger a one-time initialization which needs worst case $O(n^2)$ time though runtime tests often show subquadratic results. The necessary space for the query structure is subsumed in the storage space $O(n)$ of the input 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 1430b785ae07..622eb6b93a31 100644 --- a/Nef_2/include/CGAL/Nef_2/gen_point_location.h +++ b/Nef_2/include/CGAL/Nef_2/gen_point_location.h @@ -320,7 +320,7 @@ class PointLocator { If the ray does not intersect any node or edge of |G|, then |nil| is returned.\\ The class |\Mtype| is generic, it is parameterized with a traits class - |PLocTraits| which widely controls its behaviour. + |PLocTraits| which widely controls its behavior. 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 separate section. diff --git a/Nef_3/doc/Nef_3/Nef_3.txt b/Nef_3/doc/Nef_3/Nef_3.txt index a19fce2c5223..d205dd42a115 100644 --- a/Nef_3/doc/Nef_3/Nef_3.txt +++ b/Nef_3/doc/Nef_3/Nef_3.txt @@ -420,7 +420,7 @@ the symbolical value, large but finite, for the size of the infimaximal box. \subsection Nef_3DrawNefPolyhedron Draw a Nef Polyhedron -A nef polyhedron can be visualised by calling the \link PkgDrawNef3 CGAL::draw() \endlink function as shown in the following example. This function opens a new window showing the given Nef Polyhedron. +A nef polyhedron can be visualized by calling the \link PkgDrawNef3 CGAL::draw() \endlink function as shown in the following example. This function opens a new window showing the given Nef Polyhedron. \cgalExample{Nef_3/draw_nef_3.cpp} diff --git a/Number_types/doc/Number_types/CGAL/Gmpfi.h b/Number_types/doc/Number_types/CGAL/Gmpfi.h index b48623b22129..208361528182 100644 --- a/Number_types/doc/Number_types/CGAL/Gmpfi.h +++ b/Number_types/doc/Number_types/CGAL/Gmpfi.h @@ -26,7 +26,7 @@ All interval operations are performed by the \mpfi library. The class `Gmpfi` is counted, but its members are. The default precision of `Gmpfi` is local to each thread and independent of -the default precision of `Gmpfr` (in contrast to the behaviour of the \mpfi +the default precision of `Gmpfr` (in contrast to the behavior of the \mpfi and \mpfr libraries, which share a default precision). diff --git a/Number_types/include/CGAL/Sqrt_extension/Algebraic_extension_traits.h b/Number_types/include/CGAL/Sqrt_extension/Algebraic_extension_traits.h index 2e416946c20c..f68c10fc786e 100644 --- a/Number_types/include/CGAL/Sqrt_extension/Algebraic_extension_traits.h +++ b/Number_types/include/CGAL/Sqrt_extension/Algebraic_extension_traits.h @@ -22,7 +22,7 @@ template class Algebraic_extension_traits > { /* needed to 'add up' sqrt_extensions in iterator range such that all roots are collected in order to keep operation time minimal all scalar coeffs - are set to 1 by standardise. + are set to 1 by standardize. TODO .. find a better name, if you want to. */ template diff --git a/Number_types/include/CGAL/Sqrt_extension/Fraction_traits.h b/Number_types/include/CGAL/Sqrt_extension/Fraction_traits.h index 1f884370c744..73ed329a837f 100644 --- a/Number_types/include/CGAL/Sqrt_extension/Fraction_traits.h +++ b/Number_types/include/CGAL/Sqrt_extension/Fraction_traits.h @@ -37,7 +37,7 @@ namespace Intern{ /*! \ingroup CGAL_Sqrt_extension \ingroup CGAL_Fraction_traits_spec - \brief Specialisation of CGAL::Fraction_traits for CGAL::Sqrt_extension. + \brief Specialization of CGAL::Fraction_traits for CGAL::Sqrt_extension. * * Extensions provide suitable specializations of \c CGAL::Fraction_traits. * They are decomposable iff their coefficient type is. diff --git a/Number_types/include/CGAL/boost_mp_type.h b/Number_types/include/CGAL/boost_mp_type.h index cf18678c0114..9f21e7ba40fb 100644 --- a/Number_types/include/CGAL/boost_mp_type.h +++ b/Number_types/include/CGAL/boost_mp_type.h @@ -301,7 +301,7 @@ namespace Boost_MP_internal { const int64_t msb_num = static_cast(boost::multiprecision::msb(xnum)); const int64_t msb_den = static_cast(boost::multiprecision::msb(xden)); -#if 0 // Optimisation for the case of input that are double +#if 0 // Optimization for the case of input that are double // An alternative strategy would be to convert numerator and denominator to // intervals, then divide. However, this would require setting the rounding // mode (and dividing intervals is not completely free). An important diff --git a/Number_types/include/CGAL/leda_integer.h b/Number_types/include/CGAL/leda_integer.h index eedd073aa184..7d47b953c1c5 100644 --- a/Number_types/include/CGAL/leda_integer.h +++ b/Number_types/include/CGAL/leda_integer.h @@ -60,7 +60,7 @@ template <> class Algebraic_structure_traits< leda_integer > CGAL_IMPLICIT_INTEROPERABLE_BINARY_OPERATOR( Type ) }; - // Unfortunately the behaviour of leda has changed here several times + // Unfortunately the behavior of leda has changed here several times // The following Div_mod is invariant under these changes // However, the Div and Mod defined below might be more efficient // TODO: recover Div Mod implementation for all leda versions diff --git a/Number_types/test/Number_types/Sqrt_extension.h b/Number_types/test/Number_types/Sqrt_extension.h index 825ba19d2522..6bd28362bf43 100644 --- a/Number_types/test/Number_types/Sqrt_extension.h +++ b/Number_types/test/Number_types/Sqrt_extension.h @@ -575,7 +575,7 @@ void test_algebraic_extension_traits(){ typedef CGAL::Sqrt_extension RAT2_EXT; typedef CGAL::Sqrt_extension INT2_EXT; - // normalisation factor + // normalization factor typedef CGAL::Algebraic_extension_traits RAT1_EXT_ANT; typedef CGAL::Algebraic_extension_traits INT1_EXT_ANT; typedef CGAL::Algebraic_extension_traits RAT2_EXT_ANT; diff --git a/Optimisation_basic/package_info/Optimisation_basic/description.txt b/Optimisation_basic/package_info/Optimisation_basic/description.txt index 8516e6ed7288..28bb613c998f 100644 --- a/Optimisation_basic/package_info/Optimisation_basic/description.txt +++ b/Optimisation_basic/package_info/Optimisation_basic/description.txt @@ -1 +1 @@ -Basic stuff for geometric optimisation +Basic stuff for geometric optimization diff --git a/Orthtree/include/CGAL/Orthtree.h b/Orthtree/include/CGAL/Orthtree.h index 9774c6b5398c..074d90b8bc49 100644 --- a/Orthtree/include/CGAL/Orthtree.h +++ b/Orthtree/include/CGAL/Orthtree.h @@ -1410,7 +1410,7 @@ class Orthtree { } void dump_box_to_polylines(const Bbox_2& box, std::ostream& os) const { - // dump in 3D for visualisation + // dump in 3D for visualization os << "5 " << box.xmin() << " " << box.ymin() << " 0 " << box.xmin() << " " << box.ymax() << " 0 " diff --git a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h index 160cbfc0a67d..e50c12ae6f7c 100644 --- a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h @@ -2211,7 +2211,7 @@ Gt, Tds >::insert_first(const Point& p) /// Virtual faces, two per periodic domain Face_handle faces[3][3][2]; - // Initialise vertices: + // initialize vertices: vir_vertices[0][0] = _tds.create_vertex(); vir_vertices[0][0]->set_point(p); _virtual_vertices_reverse[vir_vertices[0][0]] = std::vector(); @@ -2221,7 +2221,7 @@ Gt, Tds >::insert_first(const Point& p) { if ((i != 0) || (j != 0)) { - // Initialise virtual vertices out of the domain for debugging + // initialize virtual vertices out of the domain for debugging vir_vertices[i][j] = _tds.create_vertex(); vir_vertices[i][j]->set_point(p); //+Offset(i,j)); _virtual_vertices[vir_vertices[i][j]] = Virtual_vertex( diff --git a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_dummy_12.h b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_dummy_12.h index 465ad8c83b08..562fc28b8bb6 100644 --- a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_dummy_12.h +++ b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_dummy_12.h @@ -25,12 +25,12 @@ Periodic_2_triangulation_2::insert_dummy_points() // 6 faces per row, 4 rows Face_handle faces[24]; - // Initialise vertices: + // initialize vertices: for (int i = 0; i < 4; i++) { for (int j = 0; j < 3; j++) { - // Initialise virtual vertices out of the domain for debugging + // initialize virtual vertices out of the domain for debugging vertices[3 * i + j] = _tds.create_vertex(); Point p(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()), 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 df3be1a4851e..33420371bfc1 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 @@ -1190,7 +1190,7 @@ Protect_edges_sizing_field:: try_to_move_dummy_vertex(const Vertex_handle dummy_vertex, const Weighted_point& new_position) { - // Insert first to maximise likeliness of success + // Insert first to maximize likeliness of success Vertex_handle new_dummy = insert_dummy_point(new_position); if(!try_to_remove_dummy_vertex(dummy_vertex)) diff --git a/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/config.h b/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/config.h index dc27a86fe57e..4b529afbce7c 100644 --- a/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/config.h +++ b/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/config.h @@ -35,7 +35,7 @@ // memory boolean in the vertex base #define CGAL_PERIODIC_TRIANGULATION_USE_VISITED_VERTEX_BOOLEAN -// Avoid optimisations of Mesh_3 +// Avoid optimizations of Mesh_3 #define CGAL_NO_STRUCTURAL_FILTERING #ifdef CGAL_MESH_3_SIZING_FIELD_INEXACT_LOCATE #undef CGAL_MESH_3_SIZING_FIELD_INEXACT_LOCATE diff --git a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3.h b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3.h index c1001de10c5c..5848af0a5274 100644 --- a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3.h +++ b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3.h @@ -2784,7 +2784,7 @@ Periodic_3_triangulation_3::create_initial_triangulation(const Point& p) /// Virtual cells, 6 per periodic instance Cell_handle cells[3][3][3][6]; - // Initialise vertices: + // initialize vertices: vir_vertices[0][0][0] = _tds.create_vertex(); vir_vertices[0][0][0]->set_point(p); virtual_vertices_reverse[vir_vertices[0][0][0]] = std::vector(); @@ -2792,7 +2792,7 @@ Periodic_3_triangulation_3::create_initial_triangulation(const Point& p) for(int j=0; j<_cover[1]; j++) { for(int k=0; k<_cover[2]; k++) { if((i!=0)||(j!=0)||(k!=0)) { - // Initialise virtual vertices out of the domain for debugging + // initialize virtual vertices out of the domain for debugging vir_vertices[i][j][k] = _tds.create_vertex(); vir_vertices[i][j][k]->set_point(p); //+Offset(i,j,k)); diff --git a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3/internal/Periodic_3_triangulation_dummy_36.h b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3/internal/Periodic_3_triangulation_dummy_36.h index 097a60163602..a1ce85ef1cb1 100644 --- a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3/internal/Periodic_3_triangulation_dummy_36.h +++ b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3/internal/Periodic_3_triangulation_dummy_36.h @@ -682,11 +682,11 @@ static const int O[216][4] = { Vertex_handle vertices[36]; Cell_handle cells[216]; - // Initialise vertices: + // initialize vertices: for (int i=0; i<4; i++) { for (int j=0; j<3; j++) { for (int k=0; k<3; k++) { - // Initialise virtual vertices out of the domain for debugging + // initialize virtual vertices out of the domain for debugging 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) ); diff --git a/Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/include/CGAL/_count_alpha_periodic_3.h b/Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/include/CGAL/_count_alpha_periodic_3.h index 7175cc850cfd..8ee0d2972730 100644 --- a/Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/include/CGAL/_count_alpha_periodic_3.h +++ b/Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/include/CGAL/_count_alpha_periodic_3.h @@ -264,7 +264,7 @@ test_filtration(AS &A, bool verbose) typename AS::NT alpha; if(verbose) { std::cerr << std::endl; - std::cerr << "Analyse filtration " << std::endl; + std::cerr << "Analyze filtration " << std::endl; } for (; filtre_it != filtration.end(); filtre_it++) { if(assign(vertex, *filtre_it)) { diff --git a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_mesh_cell_criteria_3.h b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_mesh_cell_criteria_3.h index 4c78d772ce5c..513d2be4376e 100644 --- a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_mesh_cell_criteria_3.h +++ b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_mesh_cell_criteria_3.h @@ -67,7 +67,7 @@ class Poisson_mesh_cell_criteria_3 double sq_size() const { return second; } double aspect() const { return first; } - // q1m_status.first=boost::logic::indeterminate; this->m_stop=true; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_degeneracies.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_degeneracies.h index 19adcd48319e..a21e4333ec0c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_degeneracies.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_degeneracies.h @@ -582,7 +582,7 @@ struct Filter_wrapper_for_cap_needle_removalm) ? NT(0) : -coeff(f,i+sub)*coeff(g,(j+sub)+1); diff --git a/Polynomial/include/CGAL/Polynomial/determinant.h b/Polynomial/include/CGAL/Polynomial/determinant.h index e7cd0be84efe..0c7cc5644d25 100644 --- a/Polynomial/include/CGAL/Polynomial/determinant.h +++ b/Polynomial/include/CGAL/Polynomial/determinant.h @@ -134,7 +134,7 @@ namespace internal { /*! \ingroup CGAL_determinant * \brief Will determine and execute a suitable determinant routine and * return the determinant of \a A. - * (specialisation for CGAL::Matrix_d) + * (specialization for CGAL::Matrix_d) */ template inline NT determinant(const internal::Simple_matrix& A) @@ -214,7 +214,7 @@ namespace internal { /*! \ingroup CGAL_determinant * \brief Computes the determinant of \a A according to the method proposed * by Berkowitz. - * (specialisation for CGAL::Matrix_d) + * (specialization for CGAL::Matrix_d) * * Note that this routine is completely free of divisions! */ diff --git a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_2.h b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_2.h index b5e189e51ce1..1128457fa926 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_2.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_2.h @@ -5,7 +5,7 @@ namespace CGAL { \ingroup PkgPolytopeDistanceDRef The class `Polytope_distance_d_traits_2` is a traits class for the \f$ d\f$-dimensional -optimisation algorithms using the two-dimensional \cgal kernel. +optimization algorithms using the two-dimensional \cgal kernel. \tparam K must be a model for `Kernel`. diff --git a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_3.h b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_3.h index 207b4a8bd7ba..e5ef4a3c86db 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_3.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_3.h @@ -5,7 +5,7 @@ namespace CGAL { \ingroup PkgPolytopeDistanceDRef The class `Polytope_distance_d_traits_3` is a traits class for the \f$ d\f$-dimensional -optimisation algorithms using the three-dimensional \cgal kernel. +optimization algorithms using the three-dimensional \cgal kernel. \tparam K must be a model for `Kernel`. diff --git a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_d.h b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_d.h index 37ad80ae56b1..18b5197a91f9 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_d.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_d.h @@ -5,7 +5,7 @@ namespace CGAL { \ingroup PkgPolytopeDistanceDRef The class `Polytope_distance_d_traits_d` is a traits class for the \f$ d\f$-dimensional -optimisation algorithms using the \f$ d\f$-dimensional \cgal kernel. +optimization algorithms using the \f$ d\f$-dimensional \cgal kernel. \tparam K must be a model for `Kernel`. diff --git a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h index 32004e174ba1..39d8b30417ca 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h @@ -4,7 +4,7 @@ \cgalConcept This concept defines the requirements for traits classes of \f$ d\f$-dimensional -optimisation algorithms. +optimization algorithms. \cgalHasModelsBegin \cgalHasModels{CGAL::Polytope_distance_d_traits_2} diff --git a/Polytope_distance_d/test/Polytope_distance_d/test_PD.cpp b/Polytope_distance_d/test/Polytope_distance_d/test_PD.cpp index 8ac737232828..64bb8f26197a 100644 --- a/Polytope_distance_d/test/Polytope_distance_d/test_PD.cpp +++ b/Polytope_distance_d/test/Polytope_distance_d/test_PD.cpp @@ -13,7 +13,7 @@ // // file : test/Polytope_distance_d/test_PD.C // package : $CGAL_Package: Polytope_distance_d $ -// chapter : Geometric Optimisation +// chapter : Geometric Optimization // // revision : $Id$ // revision_date : $Date$ diff --git a/Polytope_distance_d/test/Polytope_distance_d/test_Polytope_distance_d.h b/Polytope_distance_d/test/Polytope_distance_d/test_Polytope_distance_d.h index d0122d83486f..67e7ff08e2b1 100644 --- a/Polytope_distance_d/test/Polytope_distance_d/test_Polytope_distance_d.h +++ b/Polytope_distance_d/test/Polytope_distance_d/test_Polytope_distance_d.h @@ -13,7 +13,7 @@ // // file : test/Polytope_distance_d/test_Polytope_distance_d.h // package : $CGAL_Package: Polytope_distance_d $ -// chapter : Geometric Optimisation +// chapter : Geometric Optimization // // revision : $Id$ // revision_date : $Date$ diff --git a/Polytope_distance_d/test/Polytope_distance_d/test_Polytope_distance_d_2.cpp b/Polytope_distance_d/test/Polytope_distance_d/test_Polytope_distance_d_2.cpp index 86d75b83e579..11d7c1efecd8 100644 --- a/Polytope_distance_d/test/Polytope_distance_d/test_Polytope_distance_d_2.cpp +++ b/Polytope_distance_d/test/Polytope_distance_d/test_Polytope_distance_d_2.cpp @@ -13,7 +13,7 @@ // // file : test/Polytope_distance_d/test_Polytope_distance_d_2.C // package : $CGAL_Package: Polytope_distance_d $ -// chapter : Geometric Optimisation +// chapter : Geometric Optimization // // source : web/Polytope_distance_d.aw // revision : $Id$ diff --git a/Polytope_distance_d/test/Polytope_distance_d/test_Polytope_distance_d_3.cpp b/Polytope_distance_d/test/Polytope_distance_d/test_Polytope_distance_d_3.cpp index f2f2730a73bb..b4b516260d0d 100644 --- a/Polytope_distance_d/test/Polytope_distance_d/test_Polytope_distance_d_3.cpp +++ b/Polytope_distance_d/test/Polytope_distance_d/test_Polytope_distance_d_3.cpp @@ -13,7 +13,7 @@ // // file : test/Polytope_distance_d/test_Polytope_distance_d_3.C // package : $CGAL_Package: Polytope_distance_d $ -// chapter : Geometric Optimisation +// chapter : Geometric Optimization // // source : web/Polytope_distance_d.aw // revision : $Id$ diff --git a/Polytope_distance_d/test/Polytope_distance_d/test_width_cube.cpp b/Polytope_distance_d/test/Polytope_distance_d/test_width_cube.cpp index f72484d6f155..4b9f2597abcf 100644 --- a/Polytope_distance_d/test/Polytope_distance_d/test_width_cube.cpp +++ b/Polytope_distance_d/test/Polytope_distance_d/test_width_cube.cpp @@ -13,7 +13,7 @@ // // file : test/test_width_cube.C // package : Width_3 (1.6) -// chapter : Geometric Optimisation +// chapter : Geometric Optimization // // revision : $Id$ // revision_date : $Date$ diff --git a/Polytope_distance_d/test/Polytope_distance_d/test_width_simplex.cpp b/Polytope_distance_d/test/Polytope_distance_d/test_width_simplex.cpp index a2bdead6b097..ca13502c108d 100644 --- a/Polytope_distance_d/test/Polytope_distance_d/test_width_simplex.cpp +++ b/Polytope_distance_d/test/Polytope_distance_d/test_width_simplex.cpp @@ -13,7 +13,7 @@ // // file : test/test_width_simplex.C // package : Width_3 (1.6) -// chapter : Geometric Optimisation +// chapter : Geometric Optimization // // revision : $Id$ // revision_date : $Date$ diff --git a/QP_solver/doc/QP_solver/fig_src/documentation/algorithmicx.sty b/QP_solver/doc/QP_solver/fig_src/documentation/algorithmicx.sty index 0b681debab77..a56c52dd3011 100644 --- a/QP_solver/doc/QP_solver/fig_src/documentation/algorithmicx.sty +++ b/QP_solver/doc/QP_solver/fig_src/documentation/algorithmicx.sty @@ -6,7 +6,7 @@ % Based on Peter Williams's algorithmic.sty % % -% *** INITIALISING *** +% *** INITIALIZING *** % % \NeedsTeXFormat{LaTeX2e} diff --git a/QP_solver/test/QP_solver/master_mps_to_derivatives.cpp b/QP_solver/test/QP_solver/master_mps_to_derivatives.cpp index ad6fd7abc897..62ced5959a41 100644 --- a/QP_solver/test/QP_solver/master_mps_to_derivatives.cpp +++ b/QP_solver/test/QP_solver/master_mps_to_derivatives.cpp @@ -320,7 +320,7 @@ void create_free_instance(CGAL::Quadratic_program_from_mps& qp, const char *dir) { // This routine converts the given instance into an equivalent - // problem where all bounds are modelled by additional rows of A and + // problem where all bounds are modeled by additional rows of A and // where all variables are free. // // That is, the quantities c and D do not change, but A, b, and diff --git a/Ridges_3/examples/Ridges_3/PolyhedralSurf_rings.h b/Ridges_3/examples/Ridges_3/PolyhedralSurf_rings.h index 0b11736513ca..c3e5aefec98c 100644 --- a/Ridges_3/examples/Ridges_3/PolyhedralSurf_rings.h +++ b/Ridges_3/examples/Ridges_3/PolyhedralSurf_rings.h @@ -25,7 +25,7 @@ class T_PolyhedralSurf_rings typedef std::map Vertex2int_map; Vertex2int_map ring_index_map; - //vertex indices are initialised to -1 + //vertex indices are initialized to -1 void reset_ring_indices(std::vector &vces); //i >= 1; from a start vertex on the current i-1 ring, push non-visited neighbors diff --git a/Ridges_3/test/Ridges_3/PolyhedralSurf_rings.h b/Ridges_3/test/Ridges_3/PolyhedralSurf_rings.h index 0b11736513ca..c3e5aefec98c 100644 --- a/Ridges_3/test/Ridges_3/PolyhedralSurf_rings.h +++ b/Ridges_3/test/Ridges_3/PolyhedralSurf_rings.h @@ -25,7 +25,7 @@ class T_PolyhedralSurf_rings typedef std::map Vertex2int_map; Vertex2int_map ring_index_map; - //vertex indices are initialised to -1 + //vertex indices are initialized to -1 void reset_ring_indices(std::vector &vces); //i >= 1; from a start vertex on the current i-1 ring, push non-visited neighbors diff --git a/STL_Extension/doc/STL_Extension/PackageDescription.txt b/STL_Extension/doc/STL_Extension/PackageDescription.txt index 552378e03e6c..266a3b15f52b 100644 --- a/STL_Extension/doc/STL_Extension/PackageDescription.txt +++ b/STL_Extension/doc/STL_Extension/PackageDescription.txt @@ -7,7 +7,7 @@ /// \defgroup PkgSTLExtensionUtilities Utilities /// \ingroup PkgSTLExtensionRef -/// \defgroup PkgSTLExtensionAssertions Assertions and Failure Behaviour +/// \defgroup PkgSTLExtensionAssertions Assertions and Failure Behavior /// \ingroup PkgSTLExtensionRef /*! @@ -16,7 +16,7 @@ \cgalPkgPicture{plusplus.png} \cgalPkgSummaryBegin \cgalPkgAuthors{Michael Hoffmann, Lutz Kettner, Sylvain Pion, and Ron Wein} -\cgalPkgDesc{\cgal is designed in the spirit of the generic programming paradigm to work together with the Standard Template Library (\stl). This package provides non-geometric \stl-like algorithms and datastructures that are not in the \stl standard, as well as functions to change the failure behaviour of assertions.} +\cgalPkgDesc{\cgal is designed in the spirit of the generic programming paradigm to work together with the Standard Template Library (\stl). This package provides non-geometric \stl-like algorithms and datastructures that are not in the \stl standard, as well as functions to change the failure behavior of assertions.} \cgalPkgManuals{Chapter_STL_Extensions_for_CGAL,PkgSTLExtensionRef} \cgalPkgSummaryEnd \cgalPkgShortInfoBegin diff --git a/Scripts/developer_scripts/create_internal_release b/Scripts/developer_scripts/create_internal_release index 2db9f7f9ef87..e17165cec0a8 100755 --- a/Scripts/developer_scripts/create_internal_release +++ b/Scripts/developer_scripts/create_internal_release @@ -63,7 +63,7 @@ EOF my $TEMPFILE="TEMPFILE.$$"; #----------------------------------------------------# -# Initialisation # +# initialization # #----------------------------------------------------# my ( diff --git a/Scripts/developer_scripts/licensecheck b/Scripts/developer_scripts/licensecheck index c470c5b80576..e9a9f4c5be20 100755 --- a/Scripts/developer_scripts/licensecheck +++ b/Scripts/developer_scripts/licensecheck @@ -89,7 +89,7 @@ The two configuration files F and F<~/.devscripts> are sourced by a shell in that order to set configuration variables. Command line options can be used to override configuration file settings. Environment variable settings are -ignored for this purpose. The currently recognised variables are: +ignored for this purpose. The currently recognized variables are: =over 4 diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Segment_Delaunay_graph_2.txt b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Segment_Delaunay_graph_2.txt index db694f9de60b..c8e22d04b12a 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Segment_Delaunay_graph_2.txt +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Segment_Delaunay_graph_2.txt @@ -450,7 +450,7 @@ class is used, the possible values are `Field_with_sqrt_tag` and \section secsdg2hierarchy The Segment Delaunay Graph Hierarchy The `Segment_Delaunay_graph_hierarchy_2` -class is the analogue of the `Triangulation_hierarchy_2` or the +class is the analog of the `Triangulation_hierarchy_2` or the `Apollonius_graph_hierarchy_2` classes, applied to the segment Delaunay graph. It consists of a hierarchy of segment Delaunay graphs constructed in a manner analogous to the diff --git a/Stream_support/doc/Stream_support/IOstream.txt b/Stream_support/doc/Stream_support/IOstream.txt index fb4d9fe8afae..89a5ba1f98a4 100644 --- a/Stream_support/doc/Stream_support/IOstream.txt +++ b/Stream_support/doc/Stream_support/IOstream.txt @@ -210,11 +210,11 @@ of `Output_rep`. If you do not specialize `Output_rep` for `T`, `T`'s stream output operator is called from within `Output_rep`, by -default. If you want another behaviour for your type `T`, you +default. If you want another behavior for your type `T`, you have to provide a specialization for that type. Furthermore, you can provide specializations with a second template parameter (a formatting tag). The second template parameter defaults to `Null_tag` and means -default behaviour. +default behavior. For example, specializing `Output_rep` for `CORE::BigRat` (without a formatting tag parameter) could look like this: diff --git a/Stream_support/include/CGAL/IO/OI/Inventor_ostream.h b/Stream_support/include/CGAL/IO/OI/Inventor_ostream.h index 94c2f8b5787f..4a9a2bbda43e 100644 --- a/Stream_support/include/CGAL/IO/OI/Inventor_ostream.h +++ b/Stream_support/include/CGAL/IO/OI/Inventor_ostream.h @@ -59,9 +59,9 @@ class Inventor_ostream_base std::ostream& os() const { - // The behaviour if m_os == nullptr could be changed to return + // The behavior if m_os == nullptr could be changed to return // cerr or a file handle to /dev/null. The latter one would - // mimic the behaviour that one can still use a stream with + // mimic the behavior that one can still use a stream with // an invalid stream, but without producing any output. CGAL_assertion( m_os != nullptr ); return *m_os; diff --git a/Stream_support/include/CGAL/IO/VRML/VRML_2_ostream.h b/Stream_support/include/CGAL/IO/VRML/VRML_2_ostream.h index 23d94c3f9d56..a97f36ebff7a 100644 --- a/Stream_support/include/CGAL/IO/VRML/VRML_2_ostream.h +++ b/Stream_support/include/CGAL/IO/VRML/VRML_2_ostream.h @@ -55,9 +55,9 @@ class VRML_2_ostream std::ostream& os() const { - // The behaviour if m_os == nullptr could be changed to return + // The behavior if m_os == nullptr could be changed to return // cerr or a file handle to /dev/null. The latter one would - // mimic the behaviour that one can still use a stream with + // mimic the behavior that one can still use a stream with // an invalid stream, but without producing any output. CGAL_assertion( m_os != nullptr ); return *m_os; diff --git a/Stream_support/include/CGAL/IO/io.h b/Stream_support/include/CGAL/IO/io.h index aa7d650e72bf..74f8dd34babb 100644 --- a/Stream_support/include/CGAL/IO/io.h +++ b/Stream_support/include/CGAL/IO/io.h @@ -152,7 +152,7 @@ typedef IO_rep_is_not_specialized_aux IO_rep_is_not_specialized; The purpose of `Output_rep` is to provide a way to control output formatting that works independently of the object's stream output operator. -If you dont specialize `Output_rep` for `T`, `T`'s stream output operator is called from within `Output_rep`, by default. If you want another behaviour for your type `T`, you have to provide a specialization for that type. Furthermore, you can provide specializations with a second template parameter (a formatting tag). The second template parameter defaults to `Null_tag` and means *default behaviour*. +If you dont specialize `Output_rep` for `T`, `T`'s stream output operator is called from within `Output_rep`, by default. If you want another behavior for your type `T`, you have to provide a specialization for that type. Furthermore, you can provide specializations with a second template parameter (a formatting tag). The second template parameter defaults to `Null_tag` and means *default behavior*. Specializations of `Output_rep` should provide the following features: diff --git a/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h b/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h index cb949abcc303..83ca6a3b4b7d 100644 --- a/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h +++ b/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h @@ -870,7 +870,7 @@ class Surface_mesh #endif /// @cond CGAL_DOCUMENT_INTERNALS - // typedefs which make it easier to write the partial specialisation of boost::graph_traits + // typedefs which make it easier to write the partial specialization of boost::graph_traits typedef Vertex_index vertex_index; typedef P vertex_property_type; diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Iterative_authalic_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Iterative_authalic_parameterizer_3.h index b1794891ef5b..acd3a20707e6 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Iterative_authalic_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Iterative_authalic_parameterizer_3.h @@ -218,7 +218,7 @@ class Iterative_authalic_parameterizer_3 for(face_descriptor f : face_range) { - // get area in parameterised mesh + // get area in parameterized mesh const halfedge_descriptor h = halfedge(f, tmesh); const NT a_2D = abs(CGAL::area(get(uvmap, source(h, tmesh)), get(uvmap, target(h, tmesh)), @@ -531,7 +531,7 @@ class Iterative_authalic_parameterizer_3 theta_sum += theta; } - // Normalise the angle + // Normalize the angle double factor = 2. / theta_sum; factor *= CGAL_PI; for(int n=0; nm_type << " " << " time: " << event->m_distanceEstimate << " "; - std::cout << "cancelled? " << event->m_cancelled << " " ; + std::cout << "canceled? " << event->m_cancelled << " " ; if (!event->m_cancelled) { @@ -2200,7 +2200,7 @@ class Surface_mesh_shortest_path } else if (m_debugOutput) { - std::cout << "Found cancelled event for node: " << event->m_parent << std::endl; + std::cout << "Found canceled event for node: " << event->m_parent << std::endl; } delete event; @@ -2416,7 +2416,7 @@ class Surface_mesh_shortest_path \details No change to the internal shortest paths data structure occurs until either `Surface_mesh_shortest_path::build_sequence_tree()` or the first shortest path query is done. - Behaviour is undefined if the source point `it` was already removed. + Behavior is undefined if the source point `it` was already removed. \param it iterator to the source point to be removed */ diff --git a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h index 16caafb4f27b..c4aa3b41b052 100644 --- a/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/include/CGAL/draw_face_graph_with_paths.h @@ -67,7 +67,7 @@ namespace draw_function_for_lcc // template // struct LCC_geom_utils; -// Specialisation for face graph; otherwise use the LCC_geom_utils of LCC. +// Specialization for face graph; otherwise use the LCC_geom_utils of LCC. template struct LCC_geom_utils, Local_kernel, 3> { diff --git a/TDS_2/include/CGAL/Triangulation_ds_face_base_2.h b/TDS_2/include/CGAL/Triangulation_ds_face_base_2.h index bb4c448c6695..23b59e3affa1 100644 --- a/TDS_2/include/CGAL/Triangulation_ds_face_base_2.h +++ b/TDS_2/include/CGAL/Triangulation_ds_face_base_2.h @@ -340,7 +340,7 @@ operator<<(std::ostream &os, const Triangulation_ds_face_base_2 &) return os; } -// Specialisation for void. +// Specialization for void. template <> class Triangulation_ds_face_base_2 { diff --git a/TDS_3/include/CGAL/Triangulation_simplex_3.h b/TDS_3/include/CGAL/Triangulation_simplex_3.h index d00422df1bab..c6245e8bb9fb 100644 --- a/TDS_3/include/CGAL/Triangulation_simplex_3.h +++ b/TDS_3/include/CGAL/Triangulation_simplex_3.h @@ -43,7 +43,7 @@ class Triangulation_simplex_3 { // Constructors - // Default constructor initialises to undefined simplex: + // Default constructor initializes to undefined simplex: Triangulation_simplex_3() : ref(-1), ch() { } Triangulation_simplex_3(Vertex_handle vh) { diff --git a/Three/include/CGAL/Three/Scene_item.h b/Three/include/CGAL/Three/Scene_item.h index 4fbe0558392d..5a834a016cd0 100644 --- a/Three/include/CGAL/Three/Scene_item.h +++ b/Three/include/CGAL/Three/Scene_item.h @@ -375,7 +375,7 @@ public Q_SLOTS: //!Emits an aboutToBeDestroyed() signal. //!Override this function to delete what needs to be deleted on destruction. - //!This might be needed as items are not always deleted right away by Qt and this behaviour may cause simply a + //!This might be needed as items are not always deleted right away by Qt and this behavior may cause simply a //!memory leak, for example when multiple items are created at the same time. virtual void itemAboutToBeDestroyed(Scene_item*); //!Returns the alpha value for the item. diff --git a/Three/include/CGAL/Three/Scene_item_rendering_helper.h b/Three/include/CGAL/Three/Scene_item_rendering_helper.h index 83ee418e4054..e6928c3dcb6d 100644 --- a/Three/include/CGAL/Three/Scene_item_rendering_helper.h +++ b/Three/include/CGAL/Three/Scene_item_rendering_helper.h @@ -110,7 +110,7 @@ class DEMO_FRAMEWORK_EXPORT Scene_item_rendering_helper //! \brief setTriangleContainer sets the `id`th `Triangle_container` to `tc`. //! //! If `id` is bigger than the current size of the container vector, this vector is - //! resized accordingly. This means that for optimisation reasons, containers should be created + //! resized accordingly. This means that for optimization reasons, containers should be created //! decreasingly. //! void setTriangleContainer(std::size_t id, @@ -120,7 +120,7 @@ class DEMO_FRAMEWORK_EXPORT Scene_item_rendering_helper //! \brief setEdgeContainer sets the `id`th `Edge_container` to `tc`. //! //! If `id` is bigger than the current size of the container vector, this vector is - //! resized accordingly. This means that for optimisation reasons, containers should be created + //! resized accordingly. This means that for optimization reasons, containers should be created //! decreasingly. //! void setEdgeContainer(std::size_t id, @@ -130,7 +130,7 @@ class DEMO_FRAMEWORK_EXPORT Scene_item_rendering_helper //! \brief setPointContainer sets the `id`th `Point_container` to `tc`. //! //! If `id` is bigger than the current size of the container vector, this vector is - //! resized accordingly. This means that for optimisation reasons, containers should be created + //! resized accordingly. This means that for optimization reasons, containers should be created //! decreasingly. //! void setPointContainer(std::size_t id, diff --git a/Triangulation/include/CGAL/Triangulation_ds_vertex.h b/Triangulation/include/CGAL/Triangulation_ds_vertex.h index e6819f7431a9..00e9fd6f7304 100644 --- a/Triangulation/include/CGAL/Triangulation_ds_vertex.h +++ b/Triangulation/include/CGAL/Triangulation_ds_vertex.h @@ -75,7 +75,7 @@ class Triangulation_ds_vertex return false; } bool found(false); - // These two typename below are OK because TDS fulfils the + // These two typename below are OK because TDS fulfills 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/include/CGAL/Constrained_Delaunay_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h index 714e9295b61f..caed792fa5e5 100644 --- a/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h @@ -925,7 +925,7 @@ template < class Gt, class Tds, class Itag > typename Constrained_Delaunay_triangulation_2::Vertex_handle Constrained_Delaunay_triangulation_2:: insert(const Point& a, Locate_type lt, Face_handle loc, int li) -// insert a point p, whose localisation is known (lt, f, i) +// insert a point p, whose localization is known (lt, f, i) // constrained edges are updated // Delaunay property is restored { diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h index 90d6448f0e5b..65ebc4b0fb09 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h @@ -700,7 +700,7 @@ template < class Gt, class Tds, class Itag > typename Constrained_triangulation_2::Vertex_handle Constrained_triangulation_2:: insert(const Point& a, Locate_type lt, Face_handle loc, int li) -// insert a point p, whose localisation is known (lt, f, i) +// insert a point p, whose localization is known (lt, f, i) // in addition to what is done for non constrained triangulations // constrained edges are updated { diff --git a/Triangulation_2/include/CGAL/Regular_triangulation_2.h b/Triangulation_2/include/CGAL/Regular_triangulation_2.h index 54938928e5c4..d7cae81c69e7 100644 --- a/Triangulation_2/include/CGAL/Regular_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Regular_triangulation_2.h @@ -1491,7 +1491,7 @@ regularize(Vertex_handle v) if(dimension() < 1) return; - //initialise faces_around + //initialize faces_around if(dimension() == 1) { faces_around.push_back(v->face()); faces_around.push_back(v->face()->neighbor(1- v->face()->index(v))); diff --git a/Triangulation_2/include/CGAL/Triangulation_2.h b/Triangulation_2/include/CGAL/Triangulation_2.h index 433ea5cb5af3..5078301504be 100644 --- a/Triangulation_2/include/CGAL/Triangulation_2.h +++ b/Triangulation_2/include/CGAL/Triangulation_2.h @@ -1465,7 +1465,7 @@ template typename Triangulation_2::Vertex_handle Triangulation_2:: insert(const Point& p, Locate_type lt, Face_handle loc, int li) - // insert a point p, whose localisation is known (lt, f, i) + // insert a point p, whose localization is known (lt, f, i) { if(number_of_vertices() == 0) { return(insert_first(p)); diff --git a/Triangulation_3/TODO b/Triangulation_3/TODO index 01707e3e30c1..4e4042a5d812 100644 --- a/Triangulation_3/TODO +++ b/Triangulation_3/TODO @@ -32,7 +32,7 @@ Delaunay dual sont effectivement utilisees - remplacer les create_face du remove2D par des create_cell et virer les create_face de la tds -- optimiser remove : +- optimizer remove : - algo d'Olivier si constructions filtrees disponibles (cf Olivier rappel de la reunion a ce sujet) - pour la creation de la TDS_2, on devrait pouvoir faire plus simple, diff --git a/Triangulation_3/benchmark/Triangulation_3/Triangulation_benchmark_3.cpp b/Triangulation_3/benchmark/Triangulation_3/Triangulation_benchmark_3.cpp index fa052480c6b7..9d155f287fcc 100644 --- a/Triangulation_3/benchmark/Triangulation_3/Triangulation_benchmark_3.cpp +++ b/Triangulation_3/benchmark/Triangulation_3/Triangulation_benchmark_3.cpp @@ -306,7 +306,7 @@ void benchmark_remove(std::vector& pts, if (nb_pts > max_pts) { - std::cerr << "ERROR: nb_pts > max_pts. Cancelling..." << std::endl; + std::cerr << "ERROR: nb_pts > max_pts. Canceling..." << std::endl; return; } diff --git a/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_triangulation_simplex_3.h b/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_triangulation_simplex_3.h index 354b3934cb54..261276c8c15b 100644 --- a/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_triangulation_simplex_3.h +++ b/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_triangulation_simplex_3.h @@ -61,7 +61,7 @@ _test_cls_triangulation_simplex_3(const Triangulation &) //######################################################################## Cls t; - // Initialise to a 3D triangulation: + // initialize to a 3D triangulation: t.insert(Point(0,0,0)); t.insert(Point(1,0,0)); t.insert(Point(0,1,0)); From 151f612fb74e10f4515687545de721812acda6e9 Mon Sep 17 00:00:00 2001 From: albert-github Date: Sat, 5 Oct 2024 11:46:51 +0200 Subject: [PATCH 259/348] Update Nef_2/include/CGAL/Nef_2/PM_point_locator.h You found that problem quickly!!! Thanks. Must have been the sheer amount of changes. Co-authored-by: Andreas Fabri --- Nef_2/include/CGAL/Nef_2/PM_point_locator.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Nef_2/include/CGAL/Nef_2/PM_point_locator.h b/Nef_2/include/CGAL/Nef_2/PM_point_locator.h index 886e13a12e90..7777ff293db5 100644 --- a/Nef_2/include/CGAL/Nef_2/PM_point_locator.h +++ b/Nef_2/include/CGAL/Nef_2/PM_point_locator.h @@ -536,7 +536,7 @@ class PM_point_locator : public The efficiency of this point location module is mostly based on heuristics. Therefore worst case bounds are not very expressive. The query operations take up to linear time for subsequent query - operations though they are better in practize. They trigger a one-time + operations though they are better in practice. They trigger a one-time initialization which needs worst case $O(n^2)$ time though runtime tests often show subquadratic results. The necessary space for the query structure is subsumed in the storage space $O(n)$ of the input From bb51556a64d47c45fa727a41cd0b6246c1dc4eb0 Mon Sep 17 00:00:00 2001 From: albert-github Date: Sat, 5 Oct 2024 11:57:54 +0200 Subject: [PATCH 260/348] issue #8515 Spelling mistakes found checking `en-GB` to `en-US` After review. --- .../include/CGAL/Sqrt_extension/Algebraic_extension_traits.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Number_types/include/CGAL/Sqrt_extension/Algebraic_extension_traits.h b/Number_types/include/CGAL/Sqrt_extension/Algebraic_extension_traits.h index f68c10fc786e..074c3517ed8d 100644 --- a/Number_types/include/CGAL/Sqrt_extension/Algebraic_extension_traits.h +++ b/Number_types/include/CGAL/Sqrt_extension/Algebraic_extension_traits.h @@ -22,7 +22,7 @@ template class Algebraic_extension_traits > { /* needed to 'add up' sqrt_extensions in iterator range such that all roots are collected in order to keep operation time minimal all scalar coeffs - are set to 1 by standardize. + are set to 1 by default. TODO .. find a better name, if you want to. */ template From 3e57259b8cf70c17240e8b484e891de972b8b8bf Mon Sep 17 00:00:00 2001 From: albert-github Date: Sun, 6 Oct 2024 11:02:10 +0200 Subject: [PATCH 261/348] issue #8515 Spelling mistakes found checking `en-GB` to `en-US` The "bib" part. (checked as well as possible against google and mostly science direct as well) --- Documentation/doc/biblio/geom.bib | 53 ++++++++++++++++--------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/Documentation/doc/biblio/geom.bib b/Documentation/doc/biblio/geom.bib index 9170696f3127..5a12eb49283f 100644 --- a/Documentation/doc/biblio/geom.bib +++ b/Documentation/doc/biblio/geom.bib @@ -189,7 +189,7 @@ @manual{-t1-78 } @techreport{a-am3sa-91 -, author = "C. Aarmstrong" +, author = "C. Armstrong" , title = "Abstraction and meshing of 3d stress analysis models" , type = "Progress Report" , institution = "SERC Directorate" @@ -7875,7 +7875,7 @@ @article{aw-dtdch-76 @article{ah-epmfc-77 , author = "K. Appel and W. Haken" -, title = "Every planar map is four colourable, Part {I}: discharging" +, title = "Every planar map is four colorable, Part {I}: discharging" , journal = "Illinois J. Math." , volume = 21 , year = 1977 @@ -28105,7 +28105,7 @@ @inproceedings{b-rcga-90 } @inproceedings{b-afvab-91 -, author = "B. Bruenning" +, author = "L. Bruenning" , title = "Air Force Vulnerability Analyses from {BRL-CAD} models" , booktitle = "Proc. BRL-CAD Symposium `91" , publisher = "American Defense Preparadness Assoc." @@ -42334,7 +42334,7 @@ @article{d-dseti-87 , pages = "122--128" , annote = "Describes some choices for data structures for representing a triangulation, and methods for - point-location, edge-neighbour and vertex-neighbour + point-location, edge-neighbor and vertex-neighbor problems." } @@ -48823,7 +48823,7 @@ @article{d-clstf-82 @article{d-cpcp-89 , author = "Z. Drezner" -, title = "Conditional $p$-centre problems" +, title = "Conditional $p$-center problems" , journal = "Transp. Sci." , volume = 23 , number = 1 @@ -52672,13 +52672,14 @@ @article{es-otatd-91 , pages = "259--277" } -@article{es-nfnpp-? +@article{es-nfnpp-89 , author = "H. Edelsbrunner and Steven S. Skiena" , title = "On the number of furthest neighbour pairs in a point set" , journal = "Amer. Math. Monthly" -, volume = "?" -, year = "?" -, pages = "?" +, volume = "96" +, number = "7" +, year = "1989" +, pages = "614--618" , keywords = "pointset, furthest pair" , succeeds = "es-nfnpp-86" , update = "98.03 mitchell, 95.09 korneenko" @@ -52692,7 +52693,7 @@ @techreport{es-nfnpp-86 , institution = "Dept. Comput. Sci., Univ. Illinois" , address = "Urbana, IL" , year = 1986 -, precedes = "es-nfnpp-?" +, precedes = "es-nfnpp-89" , update = "98.03 mitchell, 95.09 korneenko" } @@ -58899,7 +58900,7 @@ @article{fcm-eergm-87 @inproceedings{fs-erqnn-95 , author = "Robin Y. Flatland and Charles V. Stewart" -, title = "Extending Range Queries and Nearest Neighbours" +, title = "Extending Range Queries and Nearest Neighbors" , booktitle = "Proc. 7th Canad. Conf. Comput. Geom." , year = 1995 , pages = "267--272" @@ -58908,7 +58909,7 @@ @inproceedings{fs-erqnn-95 @article{fs-erqnn-00 , author = "R. Y. Flatland and C. V. Stewart" -, title = "Extending range queries and nearest neighbours" +, title = "Extending range queries and nearest neighbors" , journal = "Comput. Geom. Theory Appl." , volume = 17 , year = 2000 @@ -61110,7 +61111,7 @@ @article{f-tbppf-77 , volume = 23 , year = 1977 , pages = "111--121" -, annote = "Uses Least Diagonal Neighbour Triangulation and Linear +, annote = "Uses Least Diagonal Neighbor Triangulation and Linear approximation over triangles to weighted VD to estimate area of weighted VD polygon of a given tree." } @@ -65127,7 +65128,7 @@ @techreport{gm-ctfma-85 , title = "A computational theoretic framework for {Minkowski} addition and decomposition of boundary represented regions" , type = "Report" , number = "??" -, institution = "National Centre Softw. Develop. Comput. Tech., Tata Inst. Fund. Res." +, institution = "National Centre for Softw. Develop. and Comput. Tech., Tata Inst. of Fund. Res." , address = "Bombay, India" , year = 1985 } @@ -70200,7 +70201,7 @@ @techreport{g-pcief-91 @article{g-pcief-92 , author = "S. Guha" -, title = "Parallel computation of internal and external farthest neighbours in simple polygons" +, title = "Parallel computation of internal and external farthest neighbors in simple polygons" , journal = "Internat. J. Comput. Geom. Appl." , volume = 2 , number = 2 @@ -76237,7 +76238,7 @@ @inproceedings{hns-saiia-89 @inproceedings{hns-saann-88 , author = "K. Hinrichs and J. Nievergelt and P. Schorn" -, title = "A sweep algorithm for the all-nearest-neighbours problem" +, title = "A sweep algorithm for the all-nearest-neighbors problem" , booktitle = "Computational Geometry and its Applications" , nickname = "CG '88" , site = "W{\"u}rzburg" @@ -76264,7 +76265,7 @@ @article{hns-arsa2-92 @inproceedings{hns-arsa2-90 , author = "K. Hinrichs and J. Nievergelt and P. Schorn" -, title = "An all-round sweep algorithm for $2$-dimensional nearest-neighbour problems" +, title = "An all-round sweep algorithm for $2$-dimensional nearest-neighbor problems" , booktitle = "Proc. 2nd Canad. Conf. Comput. Geom." , year = 1990 , pages = "343--346" @@ -101937,7 +101938,7 @@ @inproceedings{mhn-fogis-82 @inproceedings{mp-drlvd-84 , author = "T. Matsuyama and T. Phillips" -, title = "Digital Realization of the Labelled {Voronoi} Diagram and its Application to Closed Boundary Detection" +, title = "Digital Realization of the Labeled {Voronoi} Diagram and its Application to Closed Boundary Detection" , booktitle = "Proc. IEEE Internat. Conf. Pattern Recogn." , year = 1984 , pages = "478--480" @@ -102354,7 +102355,7 @@ @techreport{m-pst-81 , title = "Priority search trees" , type = "Technical {Report}" , number = "CSL-81-5" -, institution = "XEROX Palo Alto Research Centre" +, institution = "XEROX Palo Alto Research Center" , address = "Palo Alto, CA" , year = 1981 , update = "97.11 bibrelex" @@ -108313,7 +108314,7 @@ @inproceedings{mnrsy-paall-97 @inproceedings{mnsw-cnnsq-95 , author = "David M. Mount and Nathan S. Netanyahu and Ruth Silverman and Angela Y. Wu" -, title = "Chromatic Nearest Neighbour Searching: a Query Sensitive Approach" +, title = "Chromatic Nearest Neighbor Searching: a Query Sensitive Approach" , booktitle = "Proc. 7th Canad. Conf. Comput. Geom." , year = 1995 , pages = "261--266" @@ -108323,7 +108324,7 @@ @inproceedings{mnsw-cnnsq-95 @article{mnsw-cnnsq-00 , author = "David M. Mount and Nathan S. Netanyahu and Ruth Silverman and Angela Y. Wu" -, title = "Chromatic Nearest Neighbour Searching: a Query Sensitive Approach" +, title = "Chromatic Nearest Neighbor Searching: a Query Sensitive Approach" , journal = "Comput. Geom. Theory Appl." , volume = 17 , year = 2000 @@ -109256,7 +109257,7 @@ @incollection{m-spcgt-92 , update = "95.01 korneenko" , annote = "Exposition of author's research in CGeo \& CTop in three directions: geometric modelling algorithms via partition - of unity; discrete analogue of the index of vector field + of unity; discrete analog of the index of vector field rotation for singular point and separatrix search; distance functions and shortest paths on metric spaces." } @@ -116182,7 +116183,7 @@ @article{p-culdo-96 @techreport{plvt-edecl-96 , author = "P. Parodi and R. Lancewicki and A. Vijh and J. K. Tsotsos" -, title = "Empirically-derived Estimates of the Complexity of Labelling Line Drawings of Polyhedral Scenes" +, title = "Empirically-derived Estimates of the Complexity of Labeling Line Drawings of Polyhedral Scenes" , number = "RBCV-TR-96-52" , institution = "Dept. Comput. Sci., Univ. Toronto" , address = "Toronto, ON" @@ -116759,7 +116760,7 @@ @article{p-farg-79 @article{p-rflg-72 , author = "T. Pavlidis" -, title = "Representation of figures by labelled graphs" +, title = "Representation of figures by labeled graphs" , journal = "Pattern Recogn." , volume = 4 , year = 1972 @@ -133233,7 +133234,7 @@ @article{sdt-opsal-91 @incollection{s-bdnni-81 , author = "R. Sibson" -, title = "A Brief Description of Natural Neighbour Interpolation" +, title = "A Brief Description of Natural Neighbor Interpolation" , editor = "Vic Barnet" , booktitle = "Interpreting Multivariate Data" , publisher = "John Wiley \& Sons" @@ -141509,7 +141510,7 @@ @article{t-cvor-88 @incollection{ty-vrndt-88 , author = "J. Toriwaki and S. Yokoi" -, title = "Voronoi and related neighbours on digitized two-dimensional space with applications to texture analysis" +, title = "Voronoi and related neighbors on digitized two-dimensional space with applications to texture analysis" , editor = "G. T. Toussaint" , booktitle = "Computational Morphology" , publisher = "North-Holland" From 779df70cacb232402df532d09fcb7a57ce508d5b Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Mon, 7 Oct 2024 08:23:06 +0200 Subject: [PATCH 262/348] bugfix for empty point size/normal length sliders in context menu --- Lab/demo/Lab/Scene_points_with_normal_item.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lab/demo/Lab/Scene_points_with_normal_item.cpp b/Lab/demo/Lab/Scene_points_with_normal_item.cpp index 0423a7d99b99..a75bf57bf791 100644 --- a/Lab/demo/Lab/Scene_points_with_normal_item.cpp +++ b/Lab/demo/Lab/Scene_points_with_normal_item.cpp @@ -850,6 +850,7 @@ QMenu* Scene_points_with_normal_item::contextMenu() container->menuAction()->setProperty("is_groupable", true); container->addAction(sliderAction); menu->addMenu(container); + d->normal_Slider->show(); } QMenu *container = new QMenu(tr("Points Size")); QWidgetAction *sliderAction = new QWidgetAction(nullptr); @@ -861,6 +862,7 @@ QMenu* Scene_points_with_normal_item::contextMenu() container->menuAction()->setProperty("is_groupable", true); container->addAction(sliderAction); menu->addMenu(container); + d->point_Slider->show(); d->actionDeleteSelection = menu->addAction(tr("Delete Selection")); d->actionDeleteSelection->setObjectName("actionDeleteSelection"); From cab1117b50a322f8d99f10b11b9654d36e889548 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 7 Oct 2024 10:52:17 +0200 Subject: [PATCH 263/348] CGAL_Core: protect against macro `free` From vcpkg CI, there is this error: ``` 123456789101112131415161718192021222324252627C:\PROGRA~1\MICROS~1\2022\ENTERP~1\VC\Tools\MSVC\1441~1.341\bin\Hostx64\x64\cl.exe /TP -DBOOST_ATOMIC_DYN_LINK -DBOOST_ATOMIC_NO_LIB -DBOOST_CHRONO_DYN_LINK -DBOOST_CHRONO_NO_LIB -DBOOST_CONTAINER_DYN_LINK -DBOOST_CONTAINER_NO_LIB -DBOOST_DATE_TIME_DYN_LINK -DBOOST_DATE_TIME_NO_LIB -DBOOST_IOSTREAMS_DYN_LINK -DBOOST_IOSTREAMS_NO_LIB -DBOOST_PROGRAM_OPTIONS_DYN_LINK -DBOOST_PROGRAM_OPTIONS_NO_LIB -DBOOST_RANDOM_DYN_LINK -DBOOST_RANDOM_NO_LIB -DBOOST_SERIALIZATION_DYN_LINK -DBOOST_SERIALIZATION_NO_LIB -DBOOST_THREAD_DYN_LINK -DBOOST_THREAD_NO_LIB -DBOOST_THREAD_USE_DLL -DCGAL_USE_GMPXX=1 -DGFLAGS_IS_A_DLL=1 -DGLOG_NO_ABBREVIATED_SEVERITIES -DGLOG_USE_GFLAGS -DGLOG_USE_GLOG_EXPORT -DH5_BUILT_AS_DYNAMIC_LIB -D_LIB -D_USE_BOOST -D_USE_EIGEN -D_USE_FAST_CBRT -D_USE_FAST_FLOAT2INT -D_USE_NONFREE -D_USE_OPENGL -D_USE_SSE -ID:\b\openmvs\x64-windows-dbg\libs\MVS\MVS_autogen\include -ID:\b\openmvs\src\v2.1.0-1e694de437.clean -ID:\b\openmvs\x64-windows-dbg -external:ID:\installed\x64-windows\include -external:ID:\installed\x64-windows\include\eigen3 -external:W0 /nologo /DWIN32 /D_WINDOWS /utf-8 /GR /EHsc /MP /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi /Zm170 /Zc:__cplusplus /wd4231 /wd4251 /wd4308 /wd4396 /wd4503 /wd4661 /wd4996 /D_DEBUG /MDd /Z7 /Ob0 /Od /RTC1 -std:c++17 -D_SCL_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS /fp:strict /fp:except- /bigobj /Zc:__cplusplus /YuD:/b/openmvs/x64-windows-dbg/libs/MVS/CMakeFiles/MVS.dir/cmake_pch.hxx /FpD:/b/openmvs/x64-windows-dbg/libs/MVS/CMakeFiles/MVS.dir/./cmake_pch.cxx.pch /FID:/b/openmvs/x64-windows-dbg/libs/MVS/CMakeFiles/MVS.dir/cmake_pch.hxx /showIncludes /Folibs\MVS\CMakeFiles\MVS.dir\SceneReconstruct.cpp.obj /Fdlibs\MVS\CMakeFiles\MVS.dir\MVS.pdb /FS -c D:\b\openmvs\src\v2.1.0-1e694de437.clean\libs\MVS\SceneReconstruct.cpp D:\installed\x64-windows\include\CGAL/CORE/MemoryPool.h(76): error C2059: syntax error: 'constant' D:\installed\x64-windows\include\CGAL/CORE/MemoryPool.h(76): note: the template instantiation context (the oldest one first) is D:\installed\x64-windows\include\CGAL/CORE/MemoryPool.h(39): note: while compiling class template 'CORE::MemoryPool' D:\installed\x64-windows\include\CGAL/CORE/MemoryPool.h(119): error C2988: unrecognizable template declaration/definition D:\installed\x64-windows\include\CGAL/CORE/MemoryPool.h(119): error C2059: syntax error: 'constant' D:\installed\x64-windows\include\CGAL/CORE/Expr_impl.h(1217): error C2660: 'CORE::MemoryPool::_free_dbg': function does not take 2 arguments D:\installed\x64-windows\include\CGAL/CORE/MemoryPool.h(76): note: see declaration of 'CORE::MemoryPool::_free_dbg' D:\installed\x64-windows\include\CGAL/CORE/Expr_impl.h(1217): note: while trying to match the argument list '(void *, int)' ``` There is probably a macro named `free` somewhere. --- CGAL_Core/include/CGAL/CORE/ExprRep.h | 4 ++-- CGAL_Core/include/CGAL/CORE/Impl.h | 2 +- CGAL_Core/include/CGAL/CORE/MemoryPool.h | 2 +- CGAL_Core/include/CGAL/CORE/RealRep.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CGAL_Core/include/CGAL/CORE/ExprRep.h b/CGAL_Core/include/CGAL/CORE/ExprRep.h index 0e721dda16a8..a325930a2ab4 100644 --- a/CGAL_Core/include/CGAL/CORE/ExprRep.h +++ b/CGAL_Core/include/CGAL/CORE/ExprRep.h @@ -595,7 +595,7 @@ class CGAL_CORE_EXPORT ConstPolyRep : public ConstRep { } void operator delete( void *p, size_t ){ - MemoryPool::global_allocator().free(p); + (MemoryPool::global_allocator().free)(p); } private: @@ -1248,7 +1248,7 @@ void * AddSubRep::operator new( size_t size) template void AddSubRep::operator delete( void *p, size_t ) -{ MemoryPool >::global_allocator().free(p); } +{ (MemoryPool >::global_allocator().free)(p); } /// \typedef AddRep diff --git a/CGAL_Core/include/CGAL/CORE/Impl.h b/CGAL_Core/include/CGAL/CORE/Impl.h index 4ff8b4fa3d48..8ae4c53fe7d1 100644 --- a/CGAL_Core/include/CGAL/CORE/Impl.h +++ b/CGAL_Core/include/CGAL/CORE/Impl.h @@ -58,7 +58,7 @@ { return MemoryPool >::global_allocator().allocate(size); } \ template \ CGAL_INLINE_FUNCTION void C::operator delete( void *p, size_t ) \ - { MemoryPool >::global_allocator().free(p); } + { (MemoryPool >::global_allocator().free)(p); } #endif // include some common header files diff --git a/CGAL_Core/include/CGAL/CORE/MemoryPool.h b/CGAL_Core/include/CGAL/CORE/MemoryPool.h index 2db3de8736e1..d218a871bec5 100644 --- a/CGAL_Core/include/CGAL/CORE/MemoryPool.h +++ b/CGAL_Core/include/CGAL/CORE/MemoryPool.h @@ -73,7 +73,7 @@ class MemoryPool { void* allocate(std::size_t size); - void free(void* p); + void free BOOST_PREVENT_MACRO_SUBSTITUTION (void* p); // Access the corresponding static global allocator. static MemoryPool& global_allocator() { diff --git a/CGAL_Core/include/CGAL/CORE/RealRep.h b/CGAL_Core/include/CGAL/CORE/RealRep.h index 1c5d0f13a405..f2ec1e90cb3b 100644 --- a/CGAL_Core/include/CGAL/CORE/RealRep.h +++ b/CGAL_Core/include/CGAL/CORE/RealRep.h @@ -154,7 +154,7 @@ void * Realbase_for::operator new( size_t size) template void Realbase_for::operator delete( void *p, size_t ) -{ MemoryPool >::global_allocator().free(p); } +{ (MemoryPool >::global_allocator().free)(p); } typedef Realbase_for RealLong; typedef Realbase_for RealDouble; From 57858948d461b00f83e52236be08f04988cbb2b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 7 Oct 2024 15:41:32 +0200 Subject: [PATCH 264/348] fix deps --- Hash_map/package_info/Hash_map/dependencies | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Hash_map/package_info/Hash_map/dependencies b/Hash_map/package_info/Hash_map/dependencies index 25b30f26b795..b611de33d8e7 100644 --- a/Hash_map/package_info/Hash_map/dependencies +++ b/Hash_map/package_info/Hash_map/dependencies @@ -1,3 +1,5 @@ Hash_map Installation +Kernel_23 +Profiling_tools STL_Extension From 662330183c65e9bc7dd50fa79c1444667f9aa927 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Tue, 8 Oct 2024 09:01:00 +0200 Subject: [PATCH 265/348] removed unused parameter --- .../Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp b/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp index d0c694aa7461..f3d9561abda6 100644 --- a/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp +++ b/Lab/demo/Lab/Plugins/Point_set/Kinetic_surface_reconstruction_plugin.cpp @@ -360,7 +360,7 @@ private Q_SLOTS: dock_widget->partPolygonsPerNodeBox->setEnabled(state != 0); } - void onVisibilityChanged(bool visibility) { + void onVisibilityChanged(bool) { if (!dock_widget->isVisible()) return; std::cout << "in visibility changed" << std::endl; From 546d1301da401eb01b73b67dc1b498bd52de144d Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 8 Oct 2024 10:55:27 +0200 Subject: [PATCH 266/348] the patch was still incomplete --- CGAL_Core/include/CGAL/CORE/MemoryPool.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CGAL_Core/include/CGAL/CORE/MemoryPool.h b/CGAL_Core/include/CGAL/CORE/MemoryPool.h index d218a871bec5..1cfa96fa93d1 100644 --- a/CGAL_Core/include/CGAL/CORE/MemoryPool.h +++ b/CGAL_Core/include/CGAL/CORE/MemoryPool.h @@ -116,7 +116,7 @@ void* MemoryPool< T, nObjects >::allocate(std::size_t) { } template< class T, int nObjects > -void MemoryPool< T, nObjects >::free(void* t) { +void MemoryPool< T, nObjects >::free BOOST_PREVENT_MACRO_SUBSTITUTION (void* t) { CGAL_assertion(t != 0); if (t == 0) return; // for safety if(blocks.empty()){ From d907b362bdb8679fb450d762f10ff5cff40d3298 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 8 Oct 2024 12:45:21 +0200 Subject: [PATCH 267/348] the patch was still not complete --- BGL/include/CGAL/boost/graph/METIS/partition_dual_graph.h | 4 ++-- BGL/include/CGAL/boost/graph/METIS/partition_graph.h | 4 ++-- CGAL_Core/include/CGAL/CORE/Impl.h | 2 +- .../include/CGAL/Classification/Feature/Elevation.h | 4 ++-- .../include/CGAL/Classification/Feature/Height_above.h | 2 +- .../include/CGAL/Classification/Feature/Height_below.h | 2 +- .../include/CGAL/Classification/Feature/Vertical_range.h | 2 +- Classification/include/CGAL/Classification/Image.h | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/METIS/partition_dual_graph.h b/BGL/include/CGAL/boost/graph/METIS/partition_dual_graph.h index 53f8968f86f4..9a217389d82e 100644 --- a/BGL/include/CGAL/boost/graph/METIS/partition_dual_graph.h +++ b/BGL/include/CGAL/boost/graph/METIS/partition_dual_graph.h @@ -116,8 +116,8 @@ void partition_dual_graph(const TriangleMesh& tm, delete[] eptr; delete[] eind; - std::free(npart); - std::free(epart); + (std::free)(npart); + (std::free)(epart); } template diff --git a/BGL/include/CGAL/boost/graph/METIS/partition_graph.h b/BGL/include/CGAL/boost/graph/METIS/partition_graph.h index 08926a641169..42f8c240f011 100644 --- a/BGL/include/CGAL/boost/graph/METIS/partition_graph.h +++ b/BGL/include/CGAL/boost/graph/METIS/partition_graph.h @@ -151,8 +151,8 @@ void partition_graph(const TriangleMesh& tm, delete[] eptr; delete[] eind; - std::free(npart); - std::free(epart); + (std::free)(npart); + (std::free)(epart); } template diff --git a/CGAL_Core/include/CGAL/CORE/Impl.h b/CGAL_Core/include/CGAL/CORE/Impl.h index 8ae4c53fe7d1..2e21aab5ac0a 100644 --- a/CGAL_Core/include/CGAL/CORE/Impl.h +++ b/CGAL_Core/include/CGAL/CORE/Impl.h @@ -51,7 +51,7 @@ CGAL_INLINE_FUNCTION void *T::operator new( size_t size) \ { return MemoryPool::global_allocator().allocate(size); } \ CGAL_INLINE_FUNCTION void T::operator delete( void *p, size_t ) \ - { MemoryPool::global_allocator().free(p); } + { (MemoryPool::global_allocator().free)(p); } #define CORE_MEMORY_IMPL_TEMPLATE_WITH_ONE_ARG(C) \ template \ CGAL_INLINE_FUNCTION void *C::operator new( size_t size) \ diff --git a/Classification/include/CGAL/Classification/Feature/Elevation.h b/Classification/include/CGAL/Classification/Feature/Elevation.h index 175b20b6a44e..9ea9f267cc46 100644 --- a/Classification/include/CGAL/Classification/Feature/Elevation.h +++ b/Classification/include/CGAL/Classification/Feature/Elevation.h @@ -130,7 +130,7 @@ class Elevation : public Feature_base std::nth_element (z.begin(), z.begin() + (z.size() / 10), z.end()); dtm_x(i,j) = z[z.size() / 10]; } - dem.free(); + (dem.free)(); if (grid.width() * grid.height() > input.size()) values.resize (input.size(), compressed_float(0)); @@ -162,7 +162,7 @@ class Elevation : public Feature_base values[*it] = v; } } - dtm_x.free(); + (dtm_x.free)(); } diff --git a/Classification/include/CGAL/Classification/Feature/Height_above.h b/Classification/include/CGAL/Classification/Feature/Height_above.h index b59b108c1aca..3c85d27f91e2 100644 --- a/Classification/include/CGAL/Classification/Feature/Height_above.h +++ b/Classification/include/CGAL/Classification/Feature/Height_above.h @@ -100,7 +100,7 @@ class Height_above : public Feature_base std::size_t J = grid.y(i); values[i] = float(dtm(I,J) - get (point_map, *(input.begin() + i)).z()); } - dtm.free(); + (dtm.free)(); } } diff --git a/Classification/include/CGAL/Classification/Feature/Height_below.h b/Classification/include/CGAL/Classification/Feature/Height_below.h index 223719341555..f71195dd3489 100644 --- a/Classification/include/CGAL/Classification/Feature/Height_below.h +++ b/Classification/include/CGAL/Classification/Feature/Height_below.h @@ -100,7 +100,7 @@ class Height_below : public Feature_base std::size_t J = grid.y(i); values[i] = float(get (point_map, *(input.begin() + i)).z() - dtm(I,J)); } - dtm.free(); + (dtm.free)(); } } diff --git a/Classification/include/CGAL/Classification/Feature/Vertical_range.h b/Classification/include/CGAL/Classification/Feature/Vertical_range.h index 45b9c98d3ee7..a4df1591c13f 100644 --- a/Classification/include/CGAL/Classification/Feature/Vertical_range.h +++ b/Classification/include/CGAL/Classification/Feature/Vertical_range.h @@ -102,7 +102,7 @@ class Vertical_range : public Feature_base std::size_t J = grid.y(i); values[i] = dtm(I,J); } - dtm.free(); + (dtm.free)(); } } diff --git a/Classification/include/CGAL/Classification/Image.h b/Classification/include/CGAL/Classification/Image.h index 084e9572764a..3bd915f0b5d7 100644 --- a/Classification/include/CGAL/Classification/Image.h +++ b/Classification/include/CGAL/Classification/Image.h @@ -71,7 +71,7 @@ class Image { } - void free() + void free BOOST_PREVENT_MACRO_SUBSTITUTION () { m_raw.reset(); m_sparse.reset(); From 1f2f6c8e93701153d208e179a8fc4aab864884d0 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 8 Oct 2024 12:49:14 +0200 Subject: [PATCH 268/348] add testing with _CRTDBG_MAP_ALLOC --- Installation/include/CGAL/config.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Installation/include/CGAL/config.h b/Installation/include/CGAL/config.h index bd5dafbf0171..92a4ac768f58 100644 --- a/Installation/include/CGAL/config.h +++ b/Installation/include/CGAL/config.h @@ -37,6 +37,13 @@ #endif #ifdef CGAL_INCLUDE_WINDOWS_DOT_H + +#if defined(_MSC_VER) && defined(_DEBUG) +// Include support for memory leak detection +// This is only available in debug mode and when _CRTDBG_MAP_ALLOC is defined. +// It will include which will redefine `malloc` and `free`. +# define _CRTDBG_MAP_ALLOC 1 +#endif // Mimic users including this file which defines min max macros // and other names leading to name clashes #include From 527569346e885f5dcf8157a48f6cef48c2a55605 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 8 Oct 2024 17:02:41 +0100 Subject: [PATCH 269/348] CGAL: Modernize CMakeLists.txt --- .../Arrangement_on_surface_2/CMakeLists.txt | 18 ++--- BGL/examples/BGL_polyhedron_3/CMakeLists.txt | 2 +- BGL/examples/BGL_surface_mesh/CMakeLists.txt | 2 +- .../Barycentric_coordinates_2/CMakeLists.txt | 4 +- .../Barycentric_coordinates_2/CMakeLists.txt | 6 +- .../Barycentric_coordinates_2/CMakeLists.txt | 10 +-- .../examples/Basic_viewer/CMakeLists.txt | 16 ++--- .../Boolean_set_operations_2/CMakeLists.txt | 2 +- .../test/Box_intersection_d/CMakeLists.txt | 2 +- .../examples/Classification/CMakeLists.txt | 6 +- .../test/Classification/CMakeLists.txt | 4 +- .../examples/Heat_method_3/CMakeLists.txt | 8 +-- .../test/Heat_method_3/CMakeLists.txt | 8 +-- Installation/test/Installation/CMakeLists.txt | 2 +- .../examples/Jet_fitting_3/CMakeLists.txt | 4 +- .../test/Jet_fitting_3/CMakeLists.txt | 2 +- .../Kinetic_space_partition/CMakeLists.txt | 2 +- .../CMakeLists.txt | 2 +- .../CMakeLists.txt | 2 +- Lab/demo/Lab/CMakeLists.txt | 18 ++--- Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt | 2 +- .../Lab/Plugins/Classification/CMakeLists.txt | 6 +- Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt | 16 ++--- Lab/demo/Lab/Plugins/PMP/CMakeLists.txt | 10 +-- Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt | 12 ++-- .../Surface_mesh_deformation/CMakeLists.txt | 2 +- .../Tetrahedral_remeshing/CMakeLists.txt | 2 +- .../demo/Linear_cell_complex/CMakeLists.txt | 2 +- .../Linear_cell_complex/CMakeLists.txt | 6 +- Mesh_2/examples/Mesh_2/CMakeLists.txt | 4 +- Mesh_3/benchmark/Mesh_3/CMakeLists.txt | 2 +- Mesh_3/examples/Mesh_3/CMakeLists.txt | 72 +++++++++---------- Mesh_3/test/Mesh_3/CMakeLists.txt | 4 +- Nef_3/examples/Nef_3/CMakeLists.txt | 2 +- NewKernel_d/test/NewKernel_d/CMakeLists.txt | 2 +- Number_types/test/Number_types/CMakeLists.txt | 2 +- .../Optimal_bounding_box/CMakeLists.txt | 2 +- .../Optimal_bounding_box/CMakeLists.txt | 2 +- .../test/Optimal_bounding_box/CMakeLists.txt | 2 +- Orthtree/examples/Orthtree/CMakeLists.txt | 2 +- .../Periodic_2_triangulation_2/CMakeLists.txt | 2 +- .../examples/Periodic_3_mesh_3/CMakeLists.txt | 2 +- .../test/Periodic_3_mesh_3/CMakeLists.txt | 6 +- .../examples/Point_set_3/CMakeLists.txt | 4 +- Point_set_3/test/Point_set_3/CMakeLists.txt | 2 +- .../Point_set_processing_3/CMakeLists.txt | 16 ++--- .../CMakeLists.txt | 8 +-- .../CMakeLists.txt | 8 +-- Polygon/examples/Polygon/CMakeLists.txt | 8 +-- .../Polygon_mesh_processing/CMakeLists.txt | 4 +- .../Polygon_mesh_processing/CMakeLists.txt | 42 +++++------ .../Polygon_mesh_processing/CMakeLists.txt | 32 ++++----- .../test/Polygon_repair/CMakeLists.txt | 4 +- .../CMakeLists.txt | 6 +- .../CMakeLists.txt | 6 +- Polyhedron/examples/Polyhedron/CMakeLists.txt | 2 +- .../CMakeLists.txt | 2 +- .../CMakeLists.txt | 2 +- .../examples/Property_map/CMakeLists.txt | 2 +- Ridges_3/examples/Ridges_3/CMakeLists.txt | 6 +- Ridges_3/test/Ridges_3/CMakeLists.txt | 2 +- SMDS_3/test/SMDS_3/CMakeLists.txt | 2 +- .../CMakeLists.txt | 2 +- .../test/STL_Extension/CMakeLists.txt | 6 +- .../CMakeLists.txt | 18 ++--- .../benchmark/Shape_detection/CMakeLists.txt | 4 +- .../examples/Shape_detection/CMakeLists.txt | 4 +- .../test/Shape_detection/CMakeLists.txt | 2 +- .../Shape_regularization/CMakeLists.txt | 2 +- .../Shape_regularization/CMakeLists.txt | 4 +- .../test/Shape_regularization/CMakeLists.txt | 2 +- .../examples/Solver_interface/CMakeLists.txt | 12 ++-- .../Spatial_searching/CMakeLists.txt | 2 +- .../examples/Spatial_searching/CMakeLists.txt | 6 +- .../examples/Spatial_sorting/CMakeLists.txt | 2 +- .../test/Spatial_sorting/CMakeLists.txt | 2 +- .../Straight_skeleton_2/CMakeLists.txt | 12 ++-- .../test/Straight_skeleton_2/CMakeLists.txt | 12 ++-- .../CMakeLists.txt | 2 +- .../examples/Surface_mesh/CMakeLists.txt | 2 +- .../Surface_mesh_approximation/CMakeLists.txt | 12 ++-- .../Surface_mesh_approximation/CMakeLists.txt | 20 +++--- .../optimal_rotation/CMakeLists.txt | 2 +- .../Surface_mesh_deformation/CMakeLists.txt | 2 +- .../Surface_mesh_deformation/CMakeLists.txt | 2 +- .../Surface_mesh_deformation/CMakeLists.txt | 6 +- .../CMakeLists.txt | 16 ++--- .../CMakeLists.txt | 2 +- .../CMakeLists.txt | 4 +- .../CMakeLists.txt | 2 +- .../CMakeLists.txt | 4 +- .../CMakeLists.txt | 4 +- .../CMakeLists.txt | 4 +- .../Surface_mesh_topology/CMakeLists.txt | 26 +++---- .../test/Surface_mesh_topology/CMakeLists.txt | 8 +-- .../test/Surface_sweep_2/CMakeLists.txt | 4 +- TDS_3/test/TDS_3/CMakeLists.txt | 2 +- .../Tetrahedral_remeshing/CMakeLists.txt | 10 +-- .../test/Tetrahedral_remeshing/CMakeLists.txt | 12 ++-- .../applications/Triangulation/CMakeLists.txt | 4 +- .../benchmark/Triangulation/CMakeLists.txt | 4 +- .../examples/Triangulation/CMakeLists.txt | 2 +- .../test/Triangulation/CMakeLists.txt | 2 +- .../examples/Triangulation_2/CMakeLists.txt | 8 +-- .../demo/Triangulation_3/CMakeLists.txt | 2 +- .../examples/Triangulation_3/CMakeLists.txt | 8 +-- .../test/Triangulation_3/CMakeLists.txt | 2 +- .../Triangulation_on_sphere_2/CMakeLists.txt | 2 +- .../examples/Voronoi_diagram_2/CMakeLists.txt | 2 +- .../test/Voronoi_diagram_2/CMakeLists.txt | 2 +- Weights/examples/Weights/CMakeLists.txt | 2 +- 111 files changed, 360 insertions(+), 360 deletions(-) diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/CMakeLists.txt b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/CMakeLists.txt index 61f8002eb83f..2784310f4ede 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/CMakeLists.txt +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/CMakeLists.txt @@ -16,15 +16,15 @@ foreach(cppfile ${cppfiles}) endforeach() if(CGAL_Qt6_FOUND) - target_link_libraries(draw_arr PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(linear_conics PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(parabolas PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(ellipses PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(hyperbolas PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(polylines PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(circles PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(circular_arcs PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(spherical_insert PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_arr PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(linear_conics PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(parabolas PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(ellipses PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(hyperbolas PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(polylines PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(circles PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(circular_arcs PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(spherical_insert PRIVATE CGAL::CGAL_Basic_viewer) else() message( STATUS diff --git a/BGL/examples/BGL_polyhedron_3/CMakeLists.txt b/BGL/examples/BGL_polyhedron_3/CMakeLists.txt index eabe0b1bd405..8c5c669409b1 100644 --- a/BGL/examples/BGL_polyhedron_3/CMakeLists.txt +++ b/BGL/examples/BGL_polyhedron_3/CMakeLists.txt @@ -28,7 +28,7 @@ find_package(METIS QUIET) include(CGAL_METIS_support) if(TARGET CGAL::METIS_support) create_single_source_cgal_program("polyhedron_partition.cpp") - target_link_libraries(polyhedron_partition PUBLIC CGAL::METIS_support) + target_link_libraries(polyhedron_partition PRIVATE CGAL::METIS_support) else() message(STATUS "NOTICE: The example 'polyhedron_partition' requires the METIS library, and will not be compiled.") endif() diff --git a/BGL/examples/BGL_surface_mesh/CMakeLists.txt b/BGL/examples/BGL_surface_mesh/CMakeLists.txt index d1b34ec36026..921104583dc8 100644 --- a/BGL/examples/BGL_surface_mesh/CMakeLists.txt +++ b/BGL/examples/BGL_surface_mesh/CMakeLists.txt @@ -14,7 +14,7 @@ find_package(METIS QUIET) include(CGAL_METIS_support) if(TARGET CGAL::METIS_support) create_single_source_cgal_program("surface_mesh_partition.cpp") - target_link_libraries(surface_mesh_partition PUBLIC CGAL::METIS_support) + target_link_libraries(surface_mesh_partition PRIVATE CGAL::METIS_support) else() message(STATUS "NOTICE: Examples that use the METIS library will not be compiled.") endif() diff --git a/Barycentric_coordinates_2/benchmark/Barycentric_coordinates_2/CMakeLists.txt b/Barycentric_coordinates_2/benchmark/Barycentric_coordinates_2/CMakeLists.txt index fcffb885cd4b..11d40187de30 100644 --- a/Barycentric_coordinates_2/benchmark/Barycentric_coordinates_2/CMakeLists.txt +++ b/Barycentric_coordinates_2/benchmark/Barycentric_coordinates_2/CMakeLists.txt @@ -18,9 +18,9 @@ find_package(Eigen3 3.1.0 QUIET) # (3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("benchmark_hm_4_vertices.cpp") - target_link_libraries(benchmark_hm_4_vertices PUBLIC CGAL::Eigen3_support) + target_link_libraries(benchmark_hm_4_vertices PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("benchmark_hm_n_vertices.cpp") - target_link_libraries(benchmark_hm_n_vertices PUBLIC CGAL::Eigen3_support) + target_link_libraries(benchmark_hm_n_vertices PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: Several benchmarks require the Eigen library, and will not be compiled.") endif() diff --git a/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/CMakeLists.txt b/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/CMakeLists.txt index e7d800ca44ef..cd3533b5ca77 100644 --- a/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/CMakeLists.txt +++ b/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/CMakeLists.txt @@ -21,11 +21,11 @@ find_package(Eigen3 3.1.0 QUIET) # (3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("affine_coordinates.cpp") - target_link_libraries(affine_coordinates PUBLIC CGAL::Eigen3_support) + target_link_libraries(affine_coordinates PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("harmonic_coordinates.cpp") - target_link_libraries(harmonic_coordinates PUBLIC CGAL::Eigen3_support) + target_link_libraries(harmonic_coordinates PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("shape_deformation.cpp") - target_link_libraries(shape_deformation PUBLIC CGAL::Eigen3_support) + target_link_libraries(shape_deformation PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: Several examples require the Eigen library, and will not be compiled.") endif() diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/CMakeLists.txt b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/CMakeLists.txt index 110315938f9e..c50f052a490d 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/CMakeLists.txt +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/CMakeLists.txt @@ -46,15 +46,15 @@ find_package(Eigen3 3.1.0 QUIET) # (3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("test_hm_unit_square.cpp") - target_link_libraries(test_hm_unit_square PUBLIC CGAL::Eigen3_support) + target_link_libraries(test_hm_unit_square PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("test_hm_const_linear_precision.cpp") - target_link_libraries(test_hm_const_linear_precision PUBLIC CGAL::Eigen3_support) + target_link_libraries(test_hm_const_linear_precision PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("test_hm_triangle.cpp") - target_link_libraries(test_hm_triangle PUBLIC CGAL::Eigen3_support) + target_link_libraries(test_hm_triangle PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("test_bc_projection_traits.cpp") - target_link_libraries(test_bc_projection_traits PUBLIC CGAL::Eigen3_support) + target_link_libraries(test_bc_projection_traits PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("test_bc_all_coordinates.cpp") - target_link_libraries(test_bc_all_coordinates PUBLIC CGAL::Eigen3_support) + target_link_libraries(test_bc_all_coordinates PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: Several tests require the Eigen library, and will not be compiled.") endif() diff --git a/Basic_viewer/examples/Basic_viewer/CMakeLists.txt b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt index 29c492e88641..305e502bd477 100644 --- a/Basic_viewer/examples/Basic_viewer/CMakeLists.txt +++ b/Basic_viewer/examples/Basic_viewer/CMakeLists.txt @@ -23,19 +23,19 @@ create_single_source_cgal_program("draw_surface_mesh_vcolor.cpp") if(CGAL_Qt6_FOUND) #link it with the required CGAL libraries - target_link_libraries(draw_lcc PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(draw_mesh_and_points PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(draw_several_windows PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(draw_surface_mesh_height PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(draw_surface_mesh_small_faces PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(draw_surface_mesh_vcolor PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_lcc PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_mesh_and_points PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_several_windows PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_surface_mesh_height PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_surface_mesh_small_faces PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_surface_mesh_vcolor PRIVATE CGAL::CGAL_Basic_viewer) else() message("CGAL_Qt6 not configured: examples that require Qt will not be compiled.") endif() if(TARGET CGAL::Eigen3_support) - target_link_libraries(draw_mesh_and_points PUBLIC CGAL::Eigen3_support) - target_link_libraries(draw_several_windows PUBLIC CGAL::Eigen3_support) + target_link_libraries(draw_mesh_and_points PRIVATE CGAL::Eigen3_support) + target_link_libraries(draw_several_windows PRIVATE CGAL::Eigen3_support) endif() #end of the file diff --git a/Boolean_set_operations_2/examples/Boolean_set_operations_2/CMakeLists.txt b/Boolean_set_operations_2/examples/Boolean_set_operations_2/CMakeLists.txt index 94061c2d362c..aee59825ba1a 100644 --- a/Boolean_set_operations_2/examples/Boolean_set_operations_2/CMakeLists.txt +++ b/Boolean_set_operations_2/examples/Boolean_set_operations_2/CMakeLists.txt @@ -16,7 +16,7 @@ foreach(cppfile ${cppfiles}) endforeach() if(CGAL_Qt6_FOUND) - target_link_libraries(draw_polygon_set PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_polygon_set PRIVATE CGAL::CGAL_Basic_viewer) else() message(STATUS "NOTICE: The example 'draw_polygon_set' requires Qt and drawing will be disabled.") endif() diff --git a/Box_intersection_d/test/Box_intersection_d/CMakeLists.txt b/Box_intersection_d/test/Box_intersection_d/CMakeLists.txt index 5d9d3e4be8b0..a82e578f3453 100644 --- a/Box_intersection_d/test/Box_intersection_d/CMakeLists.txt +++ b/Box_intersection_d/test/Box_intersection_d/CMakeLists.txt @@ -15,7 +15,7 @@ create_single_source_cgal_program("test_Has_member_report.cpp") find_package(TBB QUIET) include(CGAL_TBB_support) if(TARGET CGAL::TBB_support) - target_link_libraries(test_box_grid PUBLIC CGAL::TBB_support) + target_link_libraries(test_box_grid PRIVATE CGAL::TBB_support) else() message(STATUS "NOTICE: Intel TBB was not found. Parallel code will not be used.") endif() diff --git a/Classification/examples/Classification/CMakeLists.txt b/Classification/examples/Classification/CMakeLists.txt index 3e68edb74956..61060474db98 100644 --- a/Classification/examples/Classification/CMakeLists.txt +++ b/Classification/examples/Classification/CMakeLists.txt @@ -52,7 +52,7 @@ if(TARGET CGAL::OpenCV_support) message(STATUS "Found OpenCV") create_single_source_cgal_program( "example_opencv_random_forest.cpp" ) - target_link_libraries(example_opencv_random_forest PUBLIC CGAL::OpenCV_support) + target_link_libraries(example_opencv_random_forest PRIVATE CGAL::OpenCV_support) else() message("NOTICE: OpenCV was not found. OpenCV random forest predicate for classification won't be available.") endif() @@ -68,11 +68,11 @@ foreach(target gis_tutorial_example example_deprecated_conversion) if(TARGET ${target}) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support CGAL::Boost_iostreams_support CGAL::Boost_serialization_support) if(TARGET CGAL::TBB_support) - target_link_libraries(${target} PUBLIC CGAL::TBB_support) + target_link_libraries(${target} PRIVATE CGAL::TBB_support) endif() endif() endforeach() diff --git a/Classification/test/Classification/CMakeLists.txt b/Classification/test/Classification/CMakeLists.txt index a50e55a9ecd7..8b3ccbf3da3c 100644 --- a/Classification/test/Classification/CMakeLists.txt +++ b/Classification/test/Classification/CMakeLists.txt @@ -41,10 +41,10 @@ create_single_source_cgal_program("test_classification_point_set.cpp") create_single_source_cgal_program("test_classification_io.cpp") foreach(target test_classification_point_set test_classification_io) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support CGAL::Boost_iostreams_support CGAL::Boost_serialization_support) if(TARGET CGAL::TBB_support) - target_link_libraries(${target} PUBLIC CGAL::TBB_support) + target_link_libraries(${target} PRIVATE CGAL::TBB_support) endif() endforeach() diff --git a/Heat_method_3/examples/Heat_method_3/CMakeLists.txt b/Heat_method_3/examples/Heat_method_3/CMakeLists.txt index 5eeb1961f16a..250921f012f7 100644 --- a/Heat_method_3/examples/Heat_method_3/CMakeLists.txt +++ b/Heat_method_3/examples/Heat_method_3/CMakeLists.txt @@ -18,10 +18,10 @@ endif() include_directories(BEFORE include) create_single_source_cgal_program("heat_method.cpp") -target_link_libraries(heat_method PUBLIC CGAL::Eigen3_support) +target_link_libraries(heat_method PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("heat_method_polyhedron.cpp") -target_link_libraries(heat_method_polyhedron PUBLIC CGAL::Eigen3_support) +target_link_libraries(heat_method_polyhedron PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("heat_method_surface_mesh.cpp") -target_link_libraries(heat_method_surface_mesh PUBLIC CGAL::Eigen3_support) +target_link_libraries(heat_method_surface_mesh PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("heat_method_surface_mesh_direct.cpp") -target_link_libraries(heat_method_surface_mesh_direct PUBLIC CGAL::Eigen3_support) +target_link_libraries(heat_method_surface_mesh_direct PRIVATE CGAL::Eigen3_support) diff --git a/Heat_method_3/test/Heat_method_3/CMakeLists.txt b/Heat_method_3/test/Heat_method_3/CMakeLists.txt index 314f023165cd..056f15040a38 100644 --- a/Heat_method_3/test/Heat_method_3/CMakeLists.txt +++ b/Heat_method_3/test/Heat_method_3/CMakeLists.txt @@ -18,10 +18,10 @@ endif() include_directories(BEFORE include) create_single_source_cgal_program("heat_method_concept.cpp") -target_link_libraries(heat_method_concept PUBLIC CGAL::Eigen3_support) +target_link_libraries(heat_method_concept PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("heat_method_surface_mesh_test.cpp") -target_link_libraries(heat_method_surface_mesh_test PUBLIC CGAL::Eigen3_support) +target_link_libraries(heat_method_surface_mesh_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("heat_method_surface_mesh_direct_test.cpp") -target_link_libraries(heat_method_surface_mesh_direct_test PUBLIC CGAL::Eigen3_support) +target_link_libraries(heat_method_surface_mesh_direct_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("heat_method_surface_mesh_intrinsic_test.cpp") -target_link_libraries(heat_method_surface_mesh_intrinsic_test PUBLIC CGAL::Eigen3_support) +target_link_libraries(heat_method_surface_mesh_intrinsic_test PRIVATE CGAL::Eigen3_support) diff --git a/Installation/test/Installation/CMakeLists.txt b/Installation/test/Installation/CMakeLists.txt index fa828e9e82b3..5fb67b8eae23 100644 --- a/Installation/test/Installation/CMakeLists.txt +++ b/Installation/test/Installation/CMakeLists.txt @@ -33,7 +33,7 @@ find_package(TBB QUIET) include(CGAL_TBB_support) create_single_source_cgal_program("test_TBB.cpp") if(TARGET CGAL::TBB_support) - target_link_libraries(test_TBB PUBLIC CGAL::TBB_support) + target_link_libraries(test_TBB PRIVATE CGAL::TBB_support) endif() create_link_to_program(CGAL) diff --git a/Jet_fitting_3/examples/Jet_fitting_3/CMakeLists.txt b/Jet_fitting_3/examples/Jet_fitting_3/CMakeLists.txt index d28114222f44..4785a6647bc6 100644 --- a/Jet_fitting_3/examples/Jet_fitting_3/CMakeLists.txt +++ b/Jet_fitting_3/examples/Jet_fitting_3/CMakeLists.txt @@ -15,7 +15,7 @@ if(TARGET CGAL::Eigen3_support) find_package(Boost QUIET COMPONENTS program_options) if(Boost_PROGRAM_OPTIONS_FOUND) create_single_source_cgal_program("Mesh_estimation.cpp") - target_link_libraries(Mesh_estimation PUBLIC CGAL::Eigen3_support) + target_link_libraries(Mesh_estimation PRIVATE CGAL::Eigen3_support) if(TARGET Boost::program_options) target_link_libraries(Mesh_estimation PRIVATE Boost::program_options) else() @@ -26,7 +26,7 @@ if(TARGET CGAL::Eigen3_support) endif() create_single_source_cgal_program("Single_estimation.cpp") - target_link_libraries(Single_estimation PUBLIC CGAL::Eigen3_support) + target_link_libraries(Single_estimation PRIVATE CGAL::Eigen3_support) else() message("NOTICE: These examples require Eigen 3.1 (or greater), and will not be compiled.") diff --git a/Jet_fitting_3/test/Jet_fitting_3/CMakeLists.txt b/Jet_fitting_3/test/Jet_fitting_3/CMakeLists.txt index 5995efe53892..114067d52478 100644 --- a/Jet_fitting_3/test/Jet_fitting_3/CMakeLists.txt +++ b/Jet_fitting_3/test/Jet_fitting_3/CMakeLists.txt @@ -11,7 +11,7 @@ find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("blind_1pt.cpp") - target_link_libraries(blind_1pt PUBLIC CGAL::Eigen3_support) + target_link_libraries(blind_1pt PRIVATE CGAL::Eigen3_support) else() message("NOTICE: This project requires Eigen 3.1 (or greater), and will not be compiled.") endif() diff --git a/Kinetic_space_partition/examples/Kinetic_space_partition/CMakeLists.txt b/Kinetic_space_partition/examples/Kinetic_space_partition/CMakeLists.txt index 344a8029ca7d..2c61e71ecb0b 100644 --- a/Kinetic_space_partition/examples/Kinetic_space_partition/CMakeLists.txt +++ b/Kinetic_space_partition/examples/Kinetic_space_partition/CMakeLists.txt @@ -17,7 +17,7 @@ if(Eigen3_FOUND) foreach(target ${targets}) create_single_source_cgal_program("${target}.cpp") - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen_support) endforeach() else() message(ERROR "This program requires the Eigen library, and will not be compiled.") diff --git a/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/CMakeLists.txt b/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/CMakeLists.txt index 90a1acd129e7..932827cf0549 100644 --- a/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/CMakeLists.txt +++ b/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/CMakeLists.txt @@ -17,7 +17,7 @@ if(Eigen3_FOUND) foreach(target ${targets}) create_single_source_cgal_program("${target}.cpp") - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen_support) endforeach() else() message(ERROR "This program requires the Eigen library, and will not be compiled.") diff --git a/Kinetic_surface_reconstruction/test/Kinetic_surface_reconstruction/CMakeLists.txt b/Kinetic_surface_reconstruction/test/Kinetic_surface_reconstruction/CMakeLists.txt index ada01e60017c..64b499f53154 100644 --- a/Kinetic_surface_reconstruction/test/Kinetic_surface_reconstruction/CMakeLists.txt +++ b/Kinetic_surface_reconstruction/test/Kinetic_surface_reconstruction/CMakeLists.txt @@ -17,7 +17,7 @@ if(Eigen3_FOUND) foreach(target ${targets}) create_single_source_cgal_program("${target}.cpp") - target_link_libraries(${target} PUBLIC CGAL::Eigen_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen_support) endforeach() else() message(ERROR "This program requires the Eigen library, and will not be compiled.") diff --git a/Lab/demo/Lab/CMakeLists.txt b/Lab/demo/Lab/CMakeLists.txt index eb2a5dc56b69..a1ff59c01b51 100644 --- a/Lab/demo/Lab/CMakeLists.txt +++ b/Lab/demo/Lab/CMakeLists.txt @@ -250,8 +250,8 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) scene_basic_objects ${TBB_LIBRARIES}) if(TARGET CGAL::TBB_support) - target_link_libraries(scene_c3t3_item PUBLIC CGAL::TBB_support) - target_link_libraries(scene_triangulation_3_item PUBLIC CGAL::TBB_support) + target_link_libraries(scene_c3t3_item PRIVATE CGAL::TBB_support) + target_link_libraries(scene_triangulation_3_item PRIVATE CGAL::TBB_support) endif() if(COMMAND target_precompile_headers) # Support for precompiled headers, for Mesh_3 (since CMake 3.16) @@ -278,7 +278,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_item(scene_surface_mesh_item Scene_surface_mesh_item.cpp) if(TBB_FOUND) - target_link_libraries(scene_surface_mesh_item PUBLIC CGAL::TBB_support) + target_link_libraries(scene_surface_mesh_item PRIVATE CGAL::TBB_support) endif() # special @@ -293,7 +293,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) target_link_libraries(scene_selection_item PUBLIC scene_item_decorator scene_k_ring_selection) if(TBB_FOUND) - target_link_libraries(scene_selection_item PUBLIC CGAL::TBB_support) + target_link_libraries(scene_selection_item PRIVATE CGAL::TBB_support) endif() add_item(scene_shortest_path_item @@ -307,9 +307,9 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) if(TARGET CGAL::Eigen3_support) add_item(scene_textured_item Scene_textured_surface_mesh_item.cpp texture.cpp) - target_link_libraries(scene_textured_item PUBLIC CGAL::Eigen3_support) + target_link_libraries(scene_textured_item PRIVATE CGAL::Eigen3_support) add_item(scene_mcf_item Plugins/PMP/Scene_mcf_item.cpp) - target_link_libraries(scene_mcf_item PUBLIC CGAL::Eigen3_support) + target_link_libraries(scene_mcf_item PRIVATE CGAL::Eigen3_support) endif() add_item(scene_implicit_function_item Scene_implicit_function_item.cpp) @@ -325,12 +325,12 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_item(scene_points_with_normal_item Scene_points_with_normal_item.cpp) if(TARGET CGAL::Eigen3_support) target_link_libraries(scene_points_with_normal_item - PUBLIC CGAL::Eigen3_support) + PRIVATE CGAL::Eigen3_support) endif() if(TBB_FOUND) target_link_libraries(scene_points_with_normal_item - PUBLIC CGAL::TBB_support) + PRIVATE CGAL::TBB_support) endif() add_item(scene_polylines_item Scene_polylines_item.cpp) @@ -381,7 +381,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) target_link_libraries(CGALlab PRIVATE demo_framework) # Link with CGAL - target_link_libraries(CGALlab PUBLIC CGAL::CGAL_Qt6) + target_link_libraries(CGALlab PRIVATE CGAL::CGAL_Qt6) add_to_cached_list(CGAL_EXECUTABLE_TARGETS CGALlab) diff --git a/Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt b/Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt index 7adb20e68eef..3a4f0aee0a30 100644 --- a/Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt @@ -8,5 +8,5 @@ cgal_lab_plugin(cut_plugin Cut_plugin) target_link_libraries(cut_plugin PUBLIC scene_surface_mesh_item scene_basic_objects scene_color_ramp) if(TARGET CGAL::TBB_support) - target_link_libraries(cut_plugin PUBLIC CGAL::TBB_support) + target_link_libraries(cut_plugin PRIVATE CGAL::TBB_support) endif() diff --git a/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt b/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt index 1152b97074ee..dabd10ef5276 100644 --- a/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt @@ -48,16 +48,16 @@ if(TARGET CGAL::Eigen3_support) endif() if(TARGET CGAL::Boost_serialization_support AND TARGET CGAL::Boost_iostreams_support) - target_link_libraries(classification_plugin PUBLIC CGAL::Boost_serialization_support + target_link_libraries(classification_plugin PRIVATE CGAL::Boost_serialization_support CGAL::Boost_iostreams_support) endif() if(TARGET CGAL::OpenCV_support) - target_link_libraries(classification_plugin PUBLIC CGAL::OpenCV_support) + target_link_libraries(classification_plugin PRIVATE CGAL::OpenCV_support) endif() if(TARGET CGAL::TBB_support) - target_link_libraries(classification_plugin PUBLIC CGAL::TBB_support) + target_link_libraries(classification_plugin PRIVATE CGAL::TBB_support) endif() add_dependencies(classification_plugin point_set_selection_plugin selection_plugin) diff --git a/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt b/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt index 2234d34db36d..6898456fc8ca 100644 --- a/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt @@ -34,7 +34,7 @@ if(ITK_FOUND) include(CGAL_ITK_support) message(STATUS "ITK found") include(${ITK_USE_FILE}) - target_link_libraries(mesh_3_plugin PUBLIC CGAL::ITK_support) + target_link_libraries(mesh_3_plugin PRIVATE CGAL::ITK_support) endif(ITK_FOUND) find_package(VTK 9.0 QUIET COMPONENTS ImagingGeneral IOImage IOXML NO_MODULE) @@ -83,7 +83,7 @@ target_link_libraries( find_package(Eigen3 3.1.0 QUIET) #(3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) - target_link_libraries(mesh_3_optimization_plugin PUBLIC CGAL::Eigen3_support) + target_link_libraries(mesh_3_optimization_plugin PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: The Mesh_3_optimization_plugin requires Eigen, which was not found." "A deprecated class will be used to replace it. Warnings are to be expected.") @@ -102,10 +102,10 @@ cgal_lab_plugin(c3t3_rib_exporter_plugin C3t3_rib_exporter_plugin target_link_libraries(c3t3_rib_exporter_plugin PUBLIC scene_c3t3_item) if(TBB_FOUND) - target_link_libraries(mesh_3_plugin PUBLIC CGAL::TBB_support) - target_link_libraries(mesh_3_optimization_plugin PUBLIC CGAL::TBB_support) - target_link_libraries(c3t3_io_plugin PUBLIC CGAL::TBB_support) - target_link_libraries(c3t3_rib_exporter_plugin PUBLIC CGAL::TBB_support) + target_link_libraries(mesh_3_plugin PRIVATE CGAL::TBB_support) + target_link_libraries(mesh_3_optimization_plugin PRIVATE CGAL::TBB_support) + target_link_libraries(c3t3_io_plugin PRIVATE CGAL::TBB_support) + target_link_libraries(c3t3_rib_exporter_plugin PRIVATE CGAL::TBB_support) endif() qt6_wrap_ui(offsetMeshingUI_FILES Offset_meshing_dialog.ui) @@ -115,8 +115,8 @@ target_link_libraries(offset_meshing_plugin PUBLIC scene_surface_mesh_item scene_polygon_soup_item scene_polylines_item) if(TARGET CGAL::Eigen3_support) - target_link_libraries(offset_meshing_plugin PUBLIC CGAL::Eigen3_support) + target_link_libraries(offset_meshing_plugin PRIVATE CGAL::Eigen3_support) endif() if(TARGET CGAL::TBB_support) - target_link_libraries(offset_meshing_plugin PUBLIC CGAL::TBB_support) + target_link_libraries(offset_meshing_plugin PRIVATE CGAL::TBB_support) endif() diff --git a/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt b/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt index 507cd7b1df16..7e8a8b3841db 100644 --- a/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt @@ -54,14 +54,14 @@ if(TARGET CGAL::Eigen3_support) find_package(Ceres QUIET) include(CGAL_Ceres_support) if(TARGET CGAL::Ceres_support) - target_link_libraries(smoothing_plugin PUBLIC CGAL::Ceres_support) + target_link_libraries(smoothing_plugin PRIVATE CGAL::Ceres_support) endif() set_package_properties( Ceres PROPERTIES DESCRIPTION "A large scale non-linear optimization library." PURPOSE "Can be used as a solver in the smoothing plugin.") - target_link_libraries(extrude_plugin PUBLIC CGAL::Eigen3_support) + target_link_libraries(extrude_plugin PRIVATE CGAL::Eigen3_support) qt6_wrap_ui(remeshPlanarPatchesUI_FILES Remesh_planar_patches_dialog.ui) cgal_lab_plugin(remesh_planar_patches_plugin Remesh_planar_patches_plugin @@ -135,7 +135,7 @@ qt6_wrap_ui( repairUI_FILES RemoveNeedlesDialog.ui SelfSnapDialog.ui AddBboxDial cgal_lab_plugin(repair_polyhedron_plugin Repair_polyhedron_plugin ${repairUI_FILES} KEYWORDS PMP) target_link_libraries(repair_polyhedron_plugin PUBLIC scene_points_with_normal_item scene_surface_mesh_item scene_polygon_soup_item) if(TARGET CGAL::TBB_support) - target_link_libraries(repair_polyhedron_plugin PUBLIC CGAL::TBB_support) + target_link_libraries(repair_polyhedron_plugin PRIVATE CGAL::TBB_support) endif() if(TARGET CGAL::Eigen3_support) @@ -146,7 +146,7 @@ if(TARGET CGAL::Eigen3_support) scene_selection_item CGAL::Eigen3_support) if(TARGET CGAL::TBB_support) - target_link_libraries(isotropic_remeshing_plugin PUBLIC CGAL::TBB_support) + target_link_libraries(isotropic_remeshing_plugin PRIVATE CGAL::TBB_support) endif() else() @@ -157,7 +157,7 @@ cgal_lab_plugin(distance_plugin Distance_plugin KEYWORDS PMP) target_link_libraries(distance_plugin PUBLIC scene_surface_mesh_item scene_color_ramp) if(TARGET CGAL::TBB_support) - target_link_libraries(distance_plugin PUBLIC CGAL::TBB_support) + target_link_libraries(distance_plugin PRIVATE CGAL::TBB_support) endif() cgal_lab_plugin(detect_sharp_edges_plugin Detect_sharp_edges_plugin KEYWORDS Viewer Mesh_3 PMP) diff --git a/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt b/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt index ff425160f4b4..55d67500fea9 100644 --- a/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt @@ -41,9 +41,9 @@ if(TARGET CGAL::Eigen3_support) scene_points_with_normal_item CGAL::Eigen3_support) if(TARGET CGAL::SCIP_support) - target_link_libraries(surface_reconstruction_plugin PUBLIC CGAL::SCIP_support) + target_link_libraries(surface_reconstruction_plugin PRIVATE CGAL::SCIP_support) elseif(TARGET CGAL::GLPK_support) - target_link_libraries(surface_reconstruction_plugin PUBLIC CGAL::GLPK_support) + target_link_libraries(surface_reconstruction_plugin PRIVATE CGAL::GLPK_support) endif() qt6_wrap_ui(point_set_normal_estimationUI_FILES @@ -109,14 +109,14 @@ if(TARGET CGAL::Eigen3_support) ${register_point_setsUI_FILES} KEYWORDS PointSetProcessing) target_link_libraries(register_point_sets_plugin PUBLIC scene_points_with_normal_item) - target_link_libraries(register_point_sets_plugin PUBLIC CGAL::Eigen3_support) + target_link_libraries(register_point_sets_plugin PRIVATE CGAL::Eigen3_support) if(TARGET CGAL::OpenGR_support) target_link_libraries(register_point_sets_plugin - PUBLIC CGAL::OpenGR_support) + PRIVATE CGAL::OpenGR_support) endif() if(TARGET CGAL::pointmatcher_support) target_link_libraries(register_point_sets_plugin - PUBLIC CGAL::pointmatcher_support) + PRIVATE CGAL::pointmatcher_support) endif() else() message(STATUS "NOTICE: OpenGR and libpointmatcher were not found. Registration plugin will not be available.") @@ -226,7 +226,7 @@ if(TARGET CGAL::TBB_support) alpha_shape_plugin point_set_to_mesh_distance_plugin) if(TARGET ${plugin}) - target_link_libraries(${plugin} PUBLIC CGAL::TBB_support) + target_link_libraries(${plugin} PRIVATE CGAL::TBB_support) endif() endforeach() endif() diff --git a/Lab/demo/Lab/Plugins/Surface_mesh_deformation/CMakeLists.txt b/Lab/demo/Lab/Plugins/Surface_mesh_deformation/CMakeLists.txt index e16feadef0da..56a87f647fd7 100644 --- a/Lab/demo/Lab/Plugins/Surface_mesh_deformation/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Surface_mesh_deformation/CMakeLists.txt @@ -7,7 +7,7 @@ if(TARGET CGAL::Eigen3_support AND "${EIGEN3_VERSION}" VERSION_GREATER "3.1.90") Scene_edit_polyhedron_item.cpp ${editionUI_FILES}) target_link_libraries( - scene_edit_item PUBLIC CGAL::Eigen3_support scene_surface_mesh_item + scene_edit_item PRIVATE CGAL::Eigen3_support scene_surface_mesh_item scene_k_ring_selection scene_basic_objects) cgal_lab_plugin(edit_plugin Edit_polyhedron_plugin Deform_mesh.ui) diff --git a/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt b/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt index faa1326b9569..1bd5a681ae3b 100644 --- a/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt @@ -17,5 +17,5 @@ target_link_libraries(tetrahedral_remeshing_plugin PUBLIC scene_c3t3_item find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) - target_link_libraries(tetrahedral_remeshing_plugin PUBLIC CGAL::Eigen3_support) + target_link_libraries(tetrahedral_remeshing_plugin PRIVATE CGAL::Eigen3_support) endif() diff --git a/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt index d0349077d7ff..33a5b9b4c1f7 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt @@ -61,7 +61,7 @@ else() add_to_cached_list(CGAL_EXECUTABLE_TARGETS Linear_cell_complex_3_demo) target_link_libraries(Linear_cell_complex_3_demo - PUBLIC CGAL::CGAL CGAL::CGAL_Qt6 Qt6::OpenGL) + PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::OpenGL) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Linear_cell_complex_3_demo) diff --git a/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt index 27ab5b842c5f..bec92c80e309 100644 --- a/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt @@ -30,7 +30,7 @@ create_single_source_cgal_program("voronoi_3.cpp") create_single_source_cgal_program("draw_linear_cell_complex.cpp") if(CGAL_Qt6_FOUND) - target_link_libraries(draw_linear_cell_complex PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(linear_cell_complex_3_incremental_builder PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(linear_cell_complex_3_insert PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_linear_cell_complex PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(linear_cell_complex_3_incremental_builder PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(linear_cell_complex_3_insert PRIVATE CGAL::CGAL_Basic_viewer) endif() diff --git a/Mesh_2/examples/Mesh_2/CMakeLists.txt b/Mesh_2/examples/Mesh_2/CMakeLists.txt index 1444754e8a01..474a477a39ab 100644 --- a/Mesh_2/examples/Mesh_2/CMakeLists.txt +++ b/Mesh_2/examples/Mesh_2/CMakeLists.txt @@ -13,6 +13,6 @@ foreach(cppfile ${cppfiles}) endforeach() if(CGAL_Qt6_FOUND) - target_link_libraries(mesh_with_seeds PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(mesh_marked_domain PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(mesh_with_seeds PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(mesh_marked_domain PRIVATE CGAL::CGAL_Basic_viewer) endif() diff --git a/Mesh_3/benchmark/Mesh_3/CMakeLists.txt b/Mesh_3/benchmark/Mesh_3/CMakeLists.txt index 16a0064cfd42..a74707749002 100644 --- a/Mesh_3/benchmark/Mesh_3/CMakeLists.txt +++ b/Mesh_3/benchmark/Mesh_3/CMakeLists.txt @@ -35,7 +35,7 @@ endif() create_single_source_cgal_program("benchmark_mesh_3.cpp") if(TARGET CGAL::TBB_support) - target_link_libraries(benchmark_mesh_3 PUBLIC CGAL::TBB_support) + target_link_libraries(benchmark_mesh_3 PRIVATE CGAL::TBB_support) endif() # Link with Boost.ProgramOptions (optional) diff --git a/Mesh_3/examples/Mesh_3/CMakeLists.txt b/Mesh_3/examples/Mesh_3/CMakeLists.txt index f259e406cc48..aadcc5060aed 100644 --- a/Mesh_3/examples/Mesh_3/CMakeLists.txt +++ b/Mesh_3/examples/Mesh_3/CMakeLists.txt @@ -36,33 +36,33 @@ else() endif() create_single_source_cgal_program("mesh_hybrid_mesh_domain.cpp") -target_link_libraries(mesh_hybrid_mesh_domain PUBLIC CGAL::Eigen3_support) +target_link_libraries(mesh_hybrid_mesh_domain PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_implicit_sphere.cpp") -target_link_libraries(mesh_implicit_sphere PUBLIC CGAL::Eigen3_support) +target_link_libraries(mesh_implicit_sphere PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_implicit_ellipsoid.cpp") -target_link_libraries(mesh_implicit_ellipsoid PUBLIC CGAL::Eigen3_support) +target_link_libraries(mesh_implicit_ellipsoid PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_implicit_sphere_variable_size.cpp") -target_link_libraries(mesh_implicit_sphere_variable_size PUBLIC CGAL::Eigen3_support) +target_link_libraries(mesh_implicit_sphere_variable_size PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_two_implicit_spheres_with_balls.cpp") -target_link_libraries(mesh_two_implicit_spheres_with_balls PUBLIC CGAL::Eigen3_support) +target_link_libraries(mesh_two_implicit_spheres_with_balls PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_implicit_domains_2.cpp" "implicit_functions.cpp") -target_link_libraries(mesh_implicit_domains_2 PUBLIC CGAL::Eigen3_support) +target_link_libraries(mesh_implicit_domains_2 PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_cubes_intersection.cpp") -target_link_libraries(mesh_cubes_intersection PUBLIC CGAL::Eigen3_support) +target_link_libraries(mesh_cubes_intersection PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_cubes_intersection_with_features.cpp") -target_link_libraries(mesh_cubes_intersection_with_features PUBLIC CGAL::Eigen3_support) +target_link_libraries(mesh_cubes_intersection_with_features PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_implicit_domains.cpp" "implicit_functions.cpp") -target_link_libraries(mesh_implicit_domains PUBLIC CGAL::Eigen3_support) +target_link_libraries(mesh_implicit_domains PRIVATE CGAL::Eigen3_support) find_package( ITT QUIET ) if(TARGET ITT::ITT) @@ -71,99 +71,99 @@ if(TARGET ITT::ITT) endif() create_single_source_cgal_program( "mesh_polyhedral_domain.cpp" ) -target_link_libraries(mesh_polyhedral_domain PUBLIC CGAL::Eigen3_support) +target_link_libraries(mesh_polyhedral_domain PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_polyhedral_domain_sm.cpp") -target_link_libraries(mesh_polyhedral_domain_sm PUBLIC CGAL::Eigen3_support) +target_link_libraries(mesh_polyhedral_domain_sm PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program( "mesh_polyhedral_domain_with_surface_inside.cpp") target_link_libraries(mesh_polyhedral_domain_with_surface_inside - PUBLIC CGAL::Eigen3_support) + PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("remesh_polyhedral_surface.cpp") -target_link_libraries(remesh_polyhedral_surface PUBLIC CGAL::Eigen3_support) +target_link_libraries(remesh_polyhedral_surface PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("remesh_polyhedral_surface_sm.cpp") -target_link_libraries(remesh_polyhedral_surface_sm PUBLIC CGAL::Eigen3_support) +target_link_libraries(remesh_polyhedral_surface_sm PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_polyhedral_domain_with_features.cpp") target_link_libraries(mesh_polyhedral_domain_with_features - PUBLIC CGAL::Eigen3_support) + PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_polyhedral_domain_with_features_sizing.cpp") target_link_libraries(mesh_polyhedral_domain_with_features_sizing - PUBLIC CGAL::Eigen3_support) + PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_polyhedral_domain_with_edge_distance.cpp") target_link_libraries(mesh_polyhedral_domain_with_edge_distance - PUBLIC CGAL::Eigen3_support) + PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_polyhedral_domain_with_features_sm.cpp") target_link_libraries(mesh_polyhedral_domain_with_features_sm - PUBLIC CGAL::Eigen3_support) + PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program( "mesh_polyhedral_domain_with_lipschitz_sizing.cpp") target_link_libraries(mesh_polyhedral_domain_with_lipschitz_sizing - PUBLIC CGAL::Eigen3_support) + PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_polyhedral_complex.cpp") -target_link_libraries(mesh_polyhedral_complex PUBLIC CGAL::Eigen3_support) +target_link_libraries(mesh_polyhedral_complex PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_polyhedral_complex_sm.cpp") -target_link_libraries(mesh_polyhedral_complex_sm PUBLIC CGAL::Eigen3_support) +target_link_libraries(mesh_polyhedral_complex_sm PRIVATE CGAL::Eigen3_support) if(TARGET CGAL::CGAL_ImageIO) if(VTK_FOUND) create_single_source_cgal_program("mesh_3D_gray_vtk_image.cpp") target_link_libraries(mesh_3D_gray_vtk_image - PUBLIC CGAL::Eigen3_support + PRIVATE CGAL::Eigen3_support CGAL::CGAL_ImageIO PRIVATE ${VTK_LIBRARIES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS mesh_3D_gray_vtk_image) endif() create_single_source_cgal_program("mesh_3D_gray_image.cpp") - target_link_libraries(mesh_3D_gray_image PUBLIC CGAL::Eigen3_support) + target_link_libraries(mesh_3D_gray_image PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_3D_gray_image_multiple_values.cpp") target_link_libraries(mesh_3D_gray_image_multiple_values - PUBLIC CGAL::Eigen3_support) + PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_3D_image_with_features.cpp") - target_link_libraries(mesh_3D_image_with_features PUBLIC CGAL::Eigen3_support) + target_link_libraries(mesh_3D_image_with_features PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_3D_image_with_input_features.cpp") - target_link_libraries(mesh_3D_image_with_input_features PUBLIC CGAL::Eigen3_support) + target_link_libraries(mesh_3D_image_with_input_features PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_3D_image_with_detection_of_features.cpp") - target_link_libraries(mesh_3D_image_with_detection_of_features PUBLIC CGAL::Eigen3_support) + target_link_libraries(mesh_3D_image_with_detection_of_features PRIVATE CGAL::Eigen3_support) if(CGAL_ImageIO_USE_ZLIB) create_single_source_cgal_program("mesh_optimization_example.cpp") - target_link_libraries(mesh_optimization_example PUBLIC CGAL::Eigen3_support) + target_link_libraries(mesh_optimization_example PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_optimization_lloyd_example.cpp") target_link_libraries(mesh_optimization_lloyd_example - PUBLIC CGAL::Eigen3_support) + PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_3D_image.cpp") - target_link_libraries(mesh_3D_image PUBLIC CGAL::Eigen3_support) + target_link_libraries(mesh_3D_image PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program( "mesh_3D_image_with_custom_initialization.cpp") target_link_libraries(mesh_3D_image_with_custom_initialization - PUBLIC CGAL::Eigen3_support) + PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program( "mesh_3D_gray_image_with_custom_initialization.cpp") target_link_libraries(mesh_3D_gray_image_with_custom_initialization - PUBLIC CGAL::Eigen3_support) + PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_3D_image_variable_size.cpp") target_link_libraries(mesh_3D_image_variable_size - PUBLIC CGAL::Eigen3_support) + PRIVATE CGAL::Eigen3_support) find_package(ITK NAMES ITK InsightToolkit QUIET COMPONENTS ITKCommon ITKThresholding ITKSmoothing ITKImageIntensity) @@ -174,11 +174,11 @@ if(TARGET CGAL::CGAL_ImageIO) create_single_source_cgal_program("mesh_3D_weighted_image.cpp") target_link_libraries(mesh_3D_weighted_image - PUBLIC CGAL::Eigen3_support CGAL::ITK_support) + PRIVATE CGAL::Eigen3_support CGAL::ITK_support) create_single_source_cgal_program("mesh_3D_weighted_image_with_detection_of_features.cpp") target_link_libraries(mesh_3D_weighted_image_with_detection_of_features - PUBLIC CGAL::Eigen3_support CGAL::ITK_support) + PRIVATE CGAL::Eigen3_support CGAL::ITK_support) else() message(STATUS "NOTICE: The examples that need ITK will not be compiled.") endif() @@ -219,7 +219,7 @@ if(CGAL_ACTIVATE_CONCURRENT_MESH_3 AND TARGET CGAL::TBB_support) mesh_polyhedral_domain_with_lipschitz_sizing mesh_two_implicit_spheres_with_balls) if(TARGET ${target}) - target_link_libraries(${target} PUBLIC CGAL::TBB_support) + target_link_libraries(${target} PRIVATE CGAL::TBB_support) endif() endforeach() endif() diff --git a/Mesh_3/test/Mesh_3/CMakeLists.txt b/Mesh_3/test/Mesh_3/CMakeLists.txt index 3deb1f35b660..38df3832193d 100644 --- a/Mesh_3/test/Mesh_3/CMakeLists.txt +++ b/Mesh_3/test/Mesh_3/CMakeLists.txt @@ -89,7 +89,7 @@ foreach(target test_meshing_polyhedral_complex_with_manifold_and_min_size ) if(TARGET ${target}) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endif() endforeach() @@ -115,7 +115,7 @@ if(TARGET CGAL::TBB_support) test_min_size_criteria ) if(TARGET ${target}) - target_link_libraries(${target} PUBLIC CGAL::TBB_support) + target_link_libraries(${target} PRIVATE CGAL::TBB_support) endif() endforeach() diff --git a/Nef_3/examples/Nef_3/CMakeLists.txt b/Nef_3/examples/Nef_3/CMakeLists.txt index f75cbdea24d6..6518c16a63a1 100644 --- a/Nef_3/examples/Nef_3/CMakeLists.txt +++ b/Nef_3/examples/Nef_3/CMakeLists.txt @@ -16,5 +16,5 @@ foreach(cppfile ${cppfiles}) endforeach() if(CGAL_Qt6_FOUND) - target_link_libraries(draw_nef_3 PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_nef_3 PRIVATE CGAL::CGAL_Basic_viewer) endif() diff --git a/NewKernel_d/test/NewKernel_d/CMakeLists.txt b/NewKernel_d/test/NewKernel_d/CMakeLists.txt index ac92d09a3a03..9bdfee783148 100644 --- a/NewKernel_d/test/NewKernel_d/CMakeLists.txt +++ b/NewKernel_d/test/NewKernel_d/CMakeLists.txt @@ -22,7 +22,7 @@ if(TARGET CGAL::Eigen3_support) foreach(cppfile ${cppfiles}) get_filename_component(target ${cppfile} NAME_WE) create_single_source_cgal_program("${cppfile}") - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() else() message("NOTICE: These programs require the Eigen3 library, and will not be compiled.") diff --git a/Number_types/test/Number_types/CMakeLists.txt b/Number_types/test/Number_types/CMakeLists.txt index 339285db0d76..cf016a80eb99 100644 --- a/Number_types/test/Number_types/CMakeLists.txt +++ b/Number_types/test/Number_types/CMakeLists.txt @@ -83,7 +83,7 @@ if(NOT CGAL_DISABLE_GMP) find_package(Eigen3 3.2.0 QUIET) #(requires 3.2.0 or greater) include(CGAL_Eigen3_support) if (TARGET CGAL::Eigen3_support) - target_link_libraries(test_eigen PUBLIC CGAL::Eigen3_support) + target_link_libraries(test_eigen PRIVATE CGAL::Eigen3_support) endif() else()#NOT CGAL_DISABLE_GMP message(STATUS "NOTICE: Some tests require the CGAL_Core library, and will not be compiled.") diff --git a/Optimal_bounding_box/benchmark/Optimal_bounding_box/CMakeLists.txt b/Optimal_bounding_box/benchmark/Optimal_bounding_box/CMakeLists.txt index 24d8eccb2a2d..3037ca8cb793 100644 --- a/Optimal_bounding_box/benchmark/Optimal_bounding_box/CMakeLists.txt +++ b/Optimal_bounding_box/benchmark/Optimal_bounding_box/CMakeLists.txt @@ -15,4 +15,4 @@ if(NOT TARGET CGAL::Eigen3_support) endif() create_single_source_cgal_program("bench_obb.cpp") -target_link_libraries(bench_obb PUBLIC CGAL::Eigen3_support) +target_link_libraries(bench_obb PRIVATE CGAL::Eigen3_support) diff --git a/Optimal_bounding_box/examples/Optimal_bounding_box/CMakeLists.txt b/Optimal_bounding_box/examples/Optimal_bounding_box/CMakeLists.txt index 8fc0f22e1e56..816d10c0403d 100644 --- a/Optimal_bounding_box/examples/Optimal_bounding_box/CMakeLists.txt +++ b/Optimal_bounding_box/examples/Optimal_bounding_box/CMakeLists.txt @@ -18,5 +18,5 @@ create_single_source_cgal_program("obb_with_point_maps_example.cpp") create_single_source_cgal_program("rotated_aabb_tree_example.cpp") foreach(target obb_example obb_with_point_maps_example rotated_aabb_tree_example) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() diff --git a/Optimal_bounding_box/test/Optimal_bounding_box/CMakeLists.txt b/Optimal_bounding_box/test/Optimal_bounding_box/CMakeLists.txt index 2c11f89fac1b..760507a79dda 100644 --- a/Optimal_bounding_box/test/Optimal_bounding_box/CMakeLists.txt +++ b/Optimal_bounding_box/test/Optimal_bounding_box/CMakeLists.txt @@ -18,5 +18,5 @@ create_single_source_cgal_program("test_nelder_mead.cpp") create_single_source_cgal_program("test_optimization_algorithms.cpp") foreach(target test_OBB_traits test_nelder_mead test_optimization_algorithms) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() diff --git a/Orthtree/examples/Orthtree/CMakeLists.txt b/Orthtree/examples/Orthtree/CMakeLists.txt index 476dfbfb5fcf..ff3377e59a43 100644 --- a/Orthtree/examples/Orthtree/CMakeLists.txt +++ b/Orthtree/examples/Orthtree/CMakeLists.txt @@ -22,5 +22,5 @@ find_package(Eigen3 3.1.91 QUIET) #(requires 3.1.91 or greater) include(CGAL_Eigen_support) if (TARGET CGAL::Eigen_support) create_single_source_cgal_program("orthtree_build.cpp") - target_link_libraries(orthtree_build PUBLIC CGAL::Eigen_support) + target_link_libraries(orthtree_build PRIVATE CGAL::Eigen_support) endif() diff --git a/Periodic_2_triangulation_2/examples/Periodic_2_triangulation_2/CMakeLists.txt b/Periodic_2_triangulation_2/examples/Periodic_2_triangulation_2/CMakeLists.txt index 77b3ecbfc104..671221a301bc 100644 --- a/Periodic_2_triangulation_2/examples/Periodic_2_triangulation_2/CMakeLists.txt +++ b/Periodic_2_triangulation_2/examples/Periodic_2_triangulation_2/CMakeLists.txt @@ -16,5 +16,5 @@ foreach(cppfile ${cppfiles}) endforeach() if(CGAL_Qt6_FOUND) - target_link_libraries(draw_periodic_2_triangulation_2 PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_periodic_2_triangulation_2 PRIVATE CGAL::CGAL_Basic_viewer) endif() diff --git a/Periodic_3_mesh_3/examples/Periodic_3_mesh_3/CMakeLists.txt b/Periodic_3_mesh_3/examples/Periodic_3_mesh_3/CMakeLists.txt index 4433ae373dce..1141a255ca41 100644 --- a/Periodic_3_mesh_3/examples/Periodic_3_mesh_3/CMakeLists.txt +++ b/Periodic_3_mesh_3/examples/Periodic_3_mesh_3/CMakeLists.txt @@ -30,5 +30,5 @@ foreach( mesh_implicit_shape_with_optimizers mesh_implicit_shape_with_features mesh_periodic_polyhedral_domain) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() diff --git a/Periodic_3_mesh_3/test/Periodic_3_mesh_3/CMakeLists.txt b/Periodic_3_mesh_3/test/Periodic_3_mesh_3/CMakeLists.txt index 1fb0f56e3968..aae24ad082f1 100644 --- a/Periodic_3_mesh_3/test/Periodic_3_mesh_3/CMakeLists.txt +++ b/Periodic_3_mesh_3/test/Periodic_3_mesh_3/CMakeLists.txt @@ -15,8 +15,8 @@ if(NOT TARGET CGAL::Eigen3_support) endif() create_single_source_cgal_program("test_implicit_shapes_bunch.cpp") -target_link_libraries(test_implicit_shapes_bunch PUBLIC CGAL::Eigen3_support) +target_link_libraries(test_implicit_shapes_bunch PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("test_implicit_shapes_with_features.cpp") -target_link_libraries(test_implicit_shapes_with_features PUBLIC CGAL::Eigen3_support) +target_link_libraries(test_implicit_shapes_with_features PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("test_triply_periodic_minimal_surfaces.cpp") -target_link_libraries(test_triply_periodic_minimal_surfaces PUBLIC CGAL::Eigen3_support) +target_link_libraries(test_triply_periodic_minimal_surfaces PRIVATE CGAL::Eigen3_support) diff --git a/Point_set_3/examples/Point_set_3/CMakeLists.txt b/Point_set_3/examples/Point_set_3/CMakeLists.txt index 95a6169ec510..a8246bf0f583 100644 --- a/Point_set_3/examples/Point_set_3/CMakeLists.txt +++ b/Point_set_3/examples/Point_set_3/CMakeLists.txt @@ -17,12 +17,12 @@ find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("point_set_algo.cpp") - target_link_libraries(point_set_algo PUBLIC CGAL::Eigen3_support) + target_link_libraries(point_set_algo PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: The example 'point_set_algo' requires the Eigen library, and will not be compiled.") endif() create_single_source_cgal_program("draw_point_set_3.cpp") if(CGAL_Qt6_FOUND) - target_link_libraries(draw_point_set_3 PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_point_set_3 PRIVATE CGAL::CGAL_Basic_viewer) endif() diff --git a/Point_set_3/test/Point_set_3/CMakeLists.txt b/Point_set_3/test/Point_set_3/CMakeLists.txt index 2546c7495a81..b2c092e2aadb 100644 --- a/Point_set_3/test/Point_set_3/CMakeLists.txt +++ b/Point_set_3/test/Point_set_3/CMakeLists.txt @@ -18,7 +18,7 @@ if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910 find_package(LASLIB QUIET) include(CGAL_LASLIB_support) if (TARGET CGAL::LASLIB_support) - target_link_libraries(test_deprecated_io_ps PUBLIC CGAL::LASLIB_support) + target_link_libraries(test_deprecated_io_ps PRIVATE CGAL::LASLIB_support) else() message(STATUS "NOTICE: the LAS reader test requires LASlib, and will not be compiled.") endif() 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 a15b69cad1ab..af87a391aa7d 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 @@ -52,25 +52,25 @@ include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) # Executables that require Eigen create_single_source_cgal_program( "normal_estimation_test.cpp" ) - target_link_libraries(normal_estimation_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(normal_estimation_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("hierarchy_simplification_test.cpp") - target_link_libraries(hierarchy_simplification_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(hierarchy_simplification_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("smoothing_test.cpp") - target_link_libraries(smoothing_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(smoothing_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vcm_plane_test.cpp") - target_link_libraries(vcm_plane_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(vcm_plane_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vcm_all_test.cpp") - target_link_libraries(vcm_all_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(vcm_all_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("jet_pointer_as_property_map.cpp") - target_link_libraries(jet_pointer_as_property_map PUBLIC CGAL::Eigen3_support) + target_link_libraries(jet_pointer_as_property_map PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("psp_jet_includes.cpp") - target_link_libraries(psp_jet_includes PUBLIC CGAL::Eigen3_support) + target_link_libraries(psp_jet_includes PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: Some tests require Eigen 3.1 (or greater), and will not be compiled.") endif() @@ -84,7 +84,7 @@ if(TARGET CGAL::TBB_support) wlop_simplify_and_regularize_test edge_aware_upsample_test normal_estimation_test) if(TARGET ${target}) - target_link_libraries(${target} PUBLIC CGAL::TBB_support) + target_link_libraries(${target} PRIVATE CGAL::TBB_support) endif() endforeach() else() diff --git a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt index 6d0b470175d1..2dcdf552ba33 100644 --- a/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt +++ b/Poisson_surface_reconstruction_3/examples/Poisson_surface_reconstruction_3/CMakeLists.txt @@ -24,13 +24,13 @@ include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) # Executables that require Eigen 3 create_single_source_cgal_program("poisson_reconstruction_example.cpp") - target_link_libraries(poisson_reconstruction_example PUBLIC CGAL::Eigen3_support) + target_link_libraries(poisson_reconstruction_example PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("poisson_reconstruction.cpp") - target_link_libraries(poisson_reconstruction PUBLIC CGAL::Eigen3_support) + target_link_libraries(poisson_reconstruction PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("poisson_reconstruction_function.cpp") - target_link_libraries(poisson_reconstruction_function PUBLIC CGAL::Eigen3_support) + target_link_libraries(poisson_reconstruction_function PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("tutorial_example.cpp") - target_link_libraries(tutorial_example PUBLIC CGAL::Eigen3_support) + target_link_libraries(tutorial_example PRIVATE CGAL::Eigen3_support) else() message("NOTICE: The examples require Eigen 3.1 (or greater) will not be compiled.") endif() diff --git a/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/CMakeLists.txt b/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/CMakeLists.txt index 8e56915cacab..59190449031e 100644 --- a/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/CMakeLists.txt +++ b/Poisson_surface_reconstruction_3/test/Poisson_surface_reconstruction_3/CMakeLists.txt @@ -23,19 +23,19 @@ include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) # Executables that require Eigen 3.1 create_single_source_cgal_program("poisson_reconstruction_test_surface_mesher.cpp") - target_link_libraries(poisson_reconstruction_test_surface_mesher PUBLIC CGAL::Eigen3_support) + target_link_libraries(poisson_reconstruction_test_surface_mesher PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("poisson_reconstruction_test_mesh_3.cpp") - target_link_libraries(poisson_reconstruction_test_mesh_3 PUBLIC CGAL::Eigen3_support) + target_link_libraries(poisson_reconstruction_test_mesh_3 PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("compare_mesh_3_vs_Poisson_implicit_surface_3.cpp") - target_link_libraries(compare_mesh_3_vs_Poisson_implicit_surface_3 PUBLIC CGAL::Eigen3_support) + target_link_libraries(compare_mesh_3_vs_Poisson_implicit_surface_3 PRIVATE CGAL::Eigen3_support) find_package(TBB QUIET) include(CGAL_TBB_support) if (TBB_FOUND) create_single_source_cgal_program( "poisson_and_parallel_mesh_3.cpp" ) - target_link_libraries(poisson_and_parallel_mesh_3 PUBLIC CGAL::Eigen3_support CGAL::TBB_support) + target_link_libraries(poisson_and_parallel_mesh_3 PRIVATE CGAL::Eigen3_support CGAL::TBB_support) else() message(STATUS "NOTICE: The test 'poisson_and_parallel_mesh_3' requires TBB, and will not be compiled.") endif() diff --git a/Polygon/examples/Polygon/CMakeLists.txt b/Polygon/examples/Polygon/CMakeLists.txt index 4ecfb2332558..55e730612942 100644 --- a/Polygon/examples/Polygon/CMakeLists.txt +++ b/Polygon/examples/Polygon/CMakeLists.txt @@ -16,8 +16,8 @@ foreach(cppfile ${cppfiles}) endforeach() if(CGAL_Qt6_FOUND) - target_link_libraries(draw_polygon PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(draw_polygon_with_holes PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(draw_polygon_with_holes_2 PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(draw_multipolygon_with_holes PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_polygon PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_polygon_with_holes PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_polygon_with_holes_2 PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_multipolygon_with_holes PRIVATE CGAL::CGAL_Basic_viewer) endif() diff --git a/Polygon_mesh_processing/benchmark/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/benchmark/Polygon_mesh_processing/CMakeLists.txt index 2a75ff4b830c..bb3be52226a4 100644 --- a/Polygon_mesh_processing/benchmark/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/benchmark/Polygon_mesh_processing/CMakeLists.txt @@ -29,7 +29,7 @@ if (FAST_ENVELOPE_BUILD_DIR) endif() create_single_source_cgal_program("fastE.cpp") - target_link_libraries( fastE PUBLIC CGAL::Eigen3_support) + target_link_libraries( fastE PRIVATE CGAL::Eigen3_support) target_link_libraries( fastE PUBLIC FastEnvelope IndirectPredicates geogram) else() @@ -39,5 +39,5 @@ endif() create_single_source_cgal_program("fast.cpp") create_single_source_cgal_program("polygon_mesh_slicer.cpp") -target_link_libraries(polygon_mesh_slicer PUBLIC CGAL::Eigen3_support) +target_link_libraries(polygon_mesh_slicer PRIVATE CGAL::Eigen3_support) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index b0958a8ff4f5..6f010df3bab4 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -63,33 +63,33 @@ find_package(Eigen3 3.2.0 QUIET) #(requires 3.2.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("hole_filling_example.cpp") - target_link_libraries(hole_filling_example PUBLIC CGAL::Eigen3_support) + target_link_libraries(hole_filling_example PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("hole_filling_example_SM.cpp") - target_link_libraries(hole_filling_example_SM PUBLIC CGAL::Eigen3_support) + target_link_libraries(hole_filling_example_SM PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("hole_filling_visitor_example.cpp") - target_link_libraries(hole_filling_visitor_example PUBLIC CGAL::Eigen3_support) + target_link_libraries(hole_filling_visitor_example PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("refine_fair_example.cpp") - target_link_libraries(refine_fair_example PUBLIC CGAL::Eigen3_support) + target_link_libraries(refine_fair_example PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("shape_smoothing_example.cpp") - target_link_libraries(shape_smoothing_example PUBLIC CGAL::Eigen3_support) + target_link_libraries(shape_smoothing_example PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("hole_filling_example_LCC.cpp") - target_link_libraries(hole_filling_example_LCC PUBLIC CGAL::Eigen3_support) + target_link_libraries(hole_filling_example_LCC PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_smoothing_example.cpp") - target_link_libraries(mesh_smoothing_example PUBLIC CGAL::Eigen3_support) + target_link_libraries(mesh_smoothing_example PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("isotropic_remeshing_with_sizing_example.cpp") - target_link_libraries(isotropic_remeshing_with_sizing_example PUBLIC CGAL::Eigen3_support) + target_link_libraries(isotropic_remeshing_with_sizing_example PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("delaunay_remeshing_example.cpp") - target_link_libraries(delaunay_remeshing_example PUBLIC CGAL::Eigen3_support) + target_link_libraries(delaunay_remeshing_example PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("remesh_almost_planar_patches.cpp") - target_link_libraries(remesh_almost_planar_patches PUBLIC CGAL::Eigen3_support) + target_link_libraries(remesh_almost_planar_patches PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("geodesic_isolevel_refinement.cpp") - target_link_libraries(geodesic_isolevel_refinement PUBLIC CGAL::Eigen3_support) + target_link_libraries(geodesic_isolevel_refinement PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("interpolated_corrected_curvatures_SM.cpp") - target_link_libraries(interpolated_corrected_curvatures_SM PUBLIC CGAL::Eigen3_support) + target_link_libraries(interpolated_corrected_curvatures_SM PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("interpolated_corrected_curvatures_PH.cpp") - target_link_libraries(interpolated_corrected_curvatures_PH PUBLIC CGAL::Eigen3_support) + target_link_libraries(interpolated_corrected_curvatures_PH PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("interpolated_corrected_curvatures_vertex.cpp") - target_link_libraries(interpolated_corrected_curvatures_vertex PUBLIC CGAL::Eigen3_support) + target_link_libraries(interpolated_corrected_curvatures_vertex PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: Examples that use Eigen will not be compiled.") endif() @@ -126,7 +126,7 @@ endif() find_package(METIS QUIET) include(CGAL_METIS_support) if(TARGET CGAL::METIS_support) - target_link_libraries(hausdorff_bounded_error_distance_example PUBLIC CGAL::METIS_support) + target_link_libraries(hausdorff_bounded_error_distance_example PRIVATE CGAL::METIS_support) else() message(STATUS "NOTICE: Examples that use the METIS library will not be compiled.") endif() @@ -134,13 +134,13 @@ endif() find_package(TBB QUIET) include(CGAL_TBB_support) if(TARGET CGAL::TBB_support) - target_link_libraries(self_intersections_example PUBLIC CGAL::TBB_support) - target_link_libraries(hausdorff_distance_remeshing_example PUBLIC CGAL::TBB_support) - target_link_libraries(hausdorff_bounded_error_distance_example PUBLIC CGAL::TBB_support) - target_link_libraries(soup_autorefinement PUBLIC CGAL::TBB_support) + target_link_libraries(self_intersections_example PRIVATE CGAL::TBB_support) + target_link_libraries(hausdorff_distance_remeshing_example PRIVATE CGAL::TBB_support) + target_link_libraries(hausdorff_bounded_error_distance_example PRIVATE CGAL::TBB_support) + target_link_libraries(soup_autorefinement PRIVATE CGAL::TBB_support) create_single_source_cgal_program("corefinement_parallel_union_meshes.cpp") - target_link_libraries(corefinement_parallel_union_meshes PUBLIC CGAL::TBB_support) + target_link_libraries(corefinement_parallel_union_meshes PRIVATE CGAL::TBB_support) else() message(STATUS "NOTICE: Intel TBB was not found. Sequential code will be used.") endif() @@ -148,7 +148,7 @@ endif() find_package(Ceres QUIET) include(CGAL_Ceres_support) if(TARGET CGAL::Ceres_support) - target_link_libraries(mesh_smoothing_example PUBLIC CGAL::Ceres_support) + target_link_libraries(mesh_smoothing_example PRIVATE CGAL::Ceres_support) else() message(STATUS "NOTICE: The example 'mesh_smoothing_example' uses the Ceres library, and will not be compiled.") endif() diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt index 0ac926c0f30e..3d121cbe5109 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt @@ -73,21 +73,21 @@ find_package(Eigen3 3.2.0 QUIET) #(requires 3.2.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("fairing_test.cpp") - target_link_libraries(fairing_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(fairing_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("triangulate_hole_Polyhedron_3_no_delaunay_test.cpp") - target_link_libraries(triangulate_hole_Polyhedron_3_no_delaunay_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(triangulate_hole_Polyhedron_3_no_delaunay_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("triangulate_hole_Polyhedron_3_test.cpp") - target_link_libraries(triangulate_hole_Polyhedron_3_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(triangulate_hole_Polyhedron_3_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("test_shape_smoothing.cpp") - target_link_libraries(test_shape_smoothing PUBLIC CGAL::Eigen3_support) + target_link_libraries(test_shape_smoothing PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("delaunay_remeshing_test.cpp") - target_link_libraries(delaunay_remeshing_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(delaunay_remeshing_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("test_interpolated_corrected_curvatures.cpp") - target_link_libraries(test_interpolated_corrected_curvatures PUBLIC CGAL::Eigen3_support) + target_link_libraries(test_interpolated_corrected_curvatures PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("test_decimation_of_planar_patches.cpp") - target_link_libraries(test_decimation_of_planar_patches PUBLIC CGAL::Eigen3_support) + target_link_libraries(test_decimation_of_planar_patches PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("remeshing_quality_test.cpp" ) - target_link_libraries(remeshing_quality_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(remeshing_quality_test PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: Tests that use the Eigen library will not be compiled.") endif() @@ -95,7 +95,7 @@ endif() find_package(METIS QUIET) include(CGAL_METIS_support) if(TARGET CGAL::METIS_support) - target_link_libraries(test_hausdorff_bounded_error_distance PUBLIC CGAL::METIS_support) + target_link_libraries(test_hausdorff_bounded_error_distance PRIVATE CGAL::METIS_support) else() message(STATUS "NOTICE: Tests are not using METIS.") endif() @@ -103,11 +103,11 @@ endif() find_package(TBB QUIET) include(CGAL_TBB_support) if(TARGET CGAL::TBB_support) - target_link_libraries(test_hausdorff_bounded_error_distance PUBLIC CGAL::TBB_support) - target_link_libraries(test_pmp_distance PUBLIC CGAL::TBB_support) - target_link_libraries(orient_polygon_soup_test PUBLIC CGAL::TBB_support) - target_link_libraries(self_intersection_surface_mesh_test PUBLIC CGAL::TBB_support) - target_link_libraries(test_autorefinement PUBLIC CGAL::TBB_support) + target_link_libraries(test_hausdorff_bounded_error_distance PRIVATE CGAL::TBB_support) + target_link_libraries(test_pmp_distance PRIVATE CGAL::TBB_support) + target_link_libraries(orient_polygon_soup_test PRIVATE CGAL::TBB_support) + target_link_libraries(self_intersection_surface_mesh_test PRIVATE CGAL::TBB_support) + target_link_libraries(test_autorefinement PRIVATE CGAL::TBB_support) else() message(STATUS "NOTICE: Intel TBB was not found. Tests will use sequential code.") endif() @@ -124,10 +124,10 @@ endif() find_package(Ceres QUIET) include(CGAL_Ceres_support) if(TARGET CGAL::Ceres_support AND TARGET CGAL::Eigen3_support) - target_link_libraries(test_mesh_smoothing PUBLIC CGAL::Eigen3_support CGAL::Ceres_support) + target_link_libraries(test_mesh_smoothing PRIVATE CGAL::Eigen3_support CGAL::Ceres_support) # target_compile_definitions(test_pmp_repair_self_intersections PUBLIC CGAL_PMP_USE_CERES_SOLVER) -# target_link_libraries(test_pmp_repair_self_intersections PUBLIC CGAL::Eigen3_support CGAL::Ceres_support) +# target_link_libraries(test_pmp_repair_self_intersections PRIVATE CGAL::Eigen3_support CGAL::Ceres_support) else() message(STATUS "NOTICE: Tests are not using Ceres.") endif() diff --git a/Polygon_repair/test/Polygon_repair/CMakeLists.txt b/Polygon_repair/test/Polygon_repair/CMakeLists.txt index 9c81f408cd5e..a1564d5dd162 100644 --- a/Polygon_repair/test/Polygon_repair/CMakeLists.txt +++ b/Polygon_repair/test/Polygon_repair/CMakeLists.txt @@ -20,6 +20,6 @@ create_single_source_cgal_program( "exact_test.cpp") create_single_source_cgal_program( "repair_polygon_2_test.cpp" ) if(CGAL_Qt6_FOUND) - target_link_libraries(draw_test_polygons PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(exact_test PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_test_polygons PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(exact_test PRIVATE CGAL::CGAL_Basic_viewer) endif() diff --git a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/CMakeLists.txt b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/CMakeLists.txt index 77915e0f0092..c2a83f6adaf0 100644 --- a/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/CMakeLists.txt +++ b/Polygonal_surface_reconstruction/examples/Polygonal_surface_reconstruction/CMakeLists.txt @@ -35,10 +35,10 @@ foreach( target polyfit_example_without_input_planes polyfit_example_user_provided_planes polyfit_example_model_complexity_control polyfit_example_with_region_growing) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) if(TARGET CGAL::SCIP_support) - target_link_libraries(${target} PUBLIC CGAL::SCIP_support) + target_link_libraries(${target} PRIVATE CGAL::SCIP_support) else() - target_link_libraries(${target} PUBLIC CGAL::GLPK_support) + target_link_libraries(${target} PRIVATE CGAL::GLPK_support) endif() endforeach() diff --git a/Polygonal_surface_reconstruction/test/Polygonal_surface_reconstruction/CMakeLists.txt b/Polygonal_surface_reconstruction/test/Polygonal_surface_reconstruction/CMakeLists.txt index a47b82f430d9..343c6c9bf8f8 100644 --- a/Polygonal_surface_reconstruction/test/Polygonal_surface_reconstruction/CMakeLists.txt +++ b/Polygonal_surface_reconstruction/test/Polygonal_surface_reconstruction/CMakeLists.txt @@ -27,9 +27,9 @@ if(NOT TARGET CGAL::SCIP_support) endif() create_single_source_cgal_program("polygonal_surface_reconstruction_test.cpp") -target_link_libraries(polygonal_surface_reconstruction_test PUBLIC CGAL::Eigen3_support) +target_link_libraries(polygonal_surface_reconstruction_test PRIVATE CGAL::Eigen3_support) if(TARGET CGAL::SCIP_support) - target_link_libraries(polygonal_surface_reconstruction_test PUBLIC CGAL::SCIP_support) + target_link_libraries(polygonal_surface_reconstruction_test PRIVATE CGAL::SCIP_support) else() - target_link_libraries(polygonal_surface_reconstruction_test PUBLIC CGAL::GLPK_support) + target_link_libraries(polygonal_surface_reconstruction_test PRIVATE CGAL::GLPK_support) endif() diff --git a/Polyhedron/examples/Polyhedron/CMakeLists.txt b/Polyhedron/examples/Polyhedron/CMakeLists.txt index ff8058e94150..3bd3c35604f0 100644 --- a/Polyhedron/examples/Polyhedron/CMakeLists.txt +++ b/Polyhedron/examples/Polyhedron/CMakeLists.txt @@ -16,5 +16,5 @@ foreach(cppfile ${cppfiles}) endforeach() if(CGAL_Qt6_FOUND) - target_link_libraries(draw_polyhedron PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_polyhedron PRIVATE CGAL::CGAL_Basic_viewer) endif() diff --git a/Principal_component_analysis/examples/Principal_component_analysis/CMakeLists.txt b/Principal_component_analysis/examples/Principal_component_analysis/CMakeLists.txt index 924a2b07a37c..a7b0a40595bc 100644 --- a/Principal_component_analysis/examples/Principal_component_analysis/CMakeLists.txt +++ b/Principal_component_analysis/examples/Principal_component_analysis/CMakeLists.txt @@ -22,5 +22,5 @@ file( foreach(cppfile ${cppfiles}) create_single_source_cgal_program("${cppfile}") get_filename_component(target ${cppfile} NAME_WE) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() diff --git a/Principal_component_analysis/test/Principal_component_analysis/CMakeLists.txt b/Principal_component_analysis/test/Principal_component_analysis/CMakeLists.txt index b61fbc8b755e..5541cb45dffb 100644 --- a/Principal_component_analysis/test/Principal_component_analysis/CMakeLists.txt +++ b/Principal_component_analysis/test/Principal_component_analysis/CMakeLists.txt @@ -22,5 +22,5 @@ file( foreach(cppfile ${cppfiles}) create_single_source_cgal_program("${cppfile}") get_filename_component(target ${cppfile} NAME_WE) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() diff --git a/Property_map/examples/Property_map/CMakeLists.txt b/Property_map/examples/Property_map/CMakeLists.txt index 7a890baba134..79bb88628151 100644 --- a/Property_map/examples/Property_map/CMakeLists.txt +++ b/Property_map/examples/Property_map/CMakeLists.txt @@ -10,7 +10,7 @@ find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("custom_property_map.cpp") - target_link_libraries(custom_property_map PUBLIC CGAL::Eigen3_support) + target_link_libraries(custom_property_map PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: The example 'custom_property_map' requires Eigen 3.1 (or greater), and will not be compiled.") endif() diff --git a/Ridges_3/examples/Ridges_3/CMakeLists.txt b/Ridges_3/examples/Ridges_3/CMakeLists.txt index 7c9dac3523f6..ef3d5b1e90ff 100644 --- a/Ridges_3/examples/Ridges_3/CMakeLists.txt +++ b/Ridges_3/examples/Ridges_3/CMakeLists.txt @@ -12,11 +12,11 @@ if(TARGET CGAL::Eigen3_support) find_package(Boost COMPONENTS program_options) if(Boost_PROGRAM_OPTIONS_FOUND) create_single_source_cgal_program(Compute_Ridges_Umbilics.cpp) - target_link_libraries(Compute_Ridges_Umbilics PUBLIC CGAL::Eigen3_support) + target_link_libraries(Compute_Ridges_Umbilics PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program(Ridges_Umbilics_SM.cpp) - target_link_libraries(Ridges_Umbilics_SM PUBLIC CGAL::Eigen3_support) + target_link_libraries(Ridges_Umbilics_SM PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program(Ridges_Umbilics_LCC.cpp) - target_link_libraries(Ridges_Umbilics_LCC PUBLIC CGAL::Eigen3_support) + target_link_libraries(Ridges_Umbilics_LCC PRIVATE CGAL::Eigen3_support) add_definitions("-DCGAL_USE_BOOST_PROGRAM_OPTIONS") if(TARGET Boost::program_options) diff --git a/Ridges_3/test/Ridges_3/CMakeLists.txt b/Ridges_3/test/Ridges_3/CMakeLists.txt index 5fe941c248be..9e7305e6953f 100644 --- a/Ridges_3/test/Ridges_3/CMakeLists.txt +++ b/Ridges_3/test/Ridges_3/CMakeLists.txt @@ -10,7 +10,7 @@ find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("ridge_test.cpp") - target_link_libraries(ridge_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(ridge_test PRIVATE CGAL::Eigen3_support) else() message("NOTICE: This project requires Eigen 3.1 (or greater), and will not be compiled.") endif() diff --git a/SMDS_3/test/SMDS_3/CMakeLists.txt b/SMDS_3/test/SMDS_3/CMakeLists.txt index 8f88df59ce48..75c24114c88c 100644 --- a/SMDS_3/test/SMDS_3/CMakeLists.txt +++ b/SMDS_3/test/SMDS_3/CMakeLists.txt @@ -26,7 +26,7 @@ if(TARGET CGAL::Eigen3_support) test_c3t3_extract_subdomains_boundaries test_c3t3_io_MEDIT) if(TARGET ${target}) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endif() endforeach() else() diff --git a/STL_Extension/benchmark/compact_container_benchmark/CMakeLists.txt b/STL_Extension/benchmark/compact_container_benchmark/CMakeLists.txt index dca323d0a784..785873363e7e 100644 --- a/STL_Extension/benchmark/compact_container_benchmark/CMakeLists.txt +++ b/STL_Extension/benchmark/compact_container_benchmark/CMakeLists.txt @@ -10,5 +10,5 @@ create_single_source_cgal_program("cc_benchmark.cpp") if(TARGET CGAL::TBB_support) message(STATUS "Found TBB") - target_link_libraries(cc_benchmark PUBLIC CGAL::TBB_support) + target_link_libraries(cc_benchmark PRIVATE CGAL::TBB_support) endif() diff --git a/STL_Extension/test/STL_Extension/CMakeLists.txt b/STL_Extension/test/STL_Extension/CMakeLists.txt index 781a6285d451..7e47f6c07be6 100644 --- a/STL_Extension/test/STL_Extension/CMakeLists.txt +++ b/STL_Extension/test/STL_Extension/CMakeLists.txt @@ -22,7 +22,7 @@ create_single_source_cgal_program("test_composition.cpp") create_single_source_cgal_program("test_Concatenate_iterator.cpp") create_single_source_cgal_program("test_Concurrent_compact_container.cpp") if(TARGET CGAL::TBB_support) - target_link_libraries(test_Concurrent_compact_container PUBLIC CGAL::TBB_support) + target_link_libraries(test_Concurrent_compact_container PRIVATE CGAL::TBB_support) endif() create_single_source_cgal_program("test_dispatch_output.cpp") create_single_source_cgal_program("test_Flattening_iterator.cpp") @@ -36,7 +36,7 @@ create_single_source_cgal_program("test_multiset.cpp") create_single_source_cgal_program("test_cgal_named_params.cpp") add_executable(test_multiset_cc "test_multiset.cpp") -target_link_libraries(test_multiset_cc PUBLIC CGAL::CGAL) +target_link_libraries(test_multiset_cc PRIVATE CGAL::CGAL) target_compile_options(test_multiset_cc PUBLIC -DCGAL_MULTISET_USE_COMPACT_CONTAINER_AS_DEFAULT) cgal_add_test(test_multiset_cc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS test_multiset_cc) @@ -58,7 +58,7 @@ create_single_source_cgal_program("test_fwd_make_array.cpp") if(TARGET CGAL::TBB_support) message(STATUS "Found TBB") - target_link_libraries(test_for_each PUBLIC CGAL::TBB_support) + target_link_libraries(test_for_each PRIVATE CGAL::TBB_support) endif() find_package(OpenMesh QUIET) diff --git a/Scale_space_reconstruction_3/examples/Scale_space_reconstruction_3/CMakeLists.txt b/Scale_space_reconstruction_3/examples/Scale_space_reconstruction_3/CMakeLists.txt index 02feca0ab2c9..194a7c45a7ac 100644 --- a/Scale_space_reconstruction_3/examples/Scale_space_reconstruction_3/CMakeLists.txt +++ b/Scale_space_reconstruction_3/examples/Scale_space_reconstruction_3/CMakeLists.txt @@ -18,23 +18,23 @@ find_package(Eigen3 3.1.0 QUIET) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("scale_space.cpp") - target_link_libraries(scale_space PUBLIC CGAL::Eigen3_support) + target_link_libraries(scale_space PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("scale_space_sm.cpp") - target_link_libraries(scale_space_sm PUBLIC CGAL::Eigen3_support) + target_link_libraries(scale_space_sm PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("scale_space_incremental.cpp") - target_link_libraries(scale_space_incremental PUBLIC CGAL::Eigen3_support) + target_link_libraries(scale_space_incremental PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("scale_space_manifold.cpp") - target_link_libraries(scale_space_manifold PUBLIC CGAL::Eigen3_support) + target_link_libraries(scale_space_manifold PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("scale_space_advancing_front.cpp") - target_link_libraries(scale_space_advancing_front PUBLIC CGAL::Eigen3_support) + target_link_libraries(scale_space_advancing_front PRIVATE CGAL::Eigen3_support) if(ACTIVATE_CONCURRENCY AND TARGET CGAL::TBB_support) message(STATUS "Found TBB") - target_link_libraries(scale_space PUBLIC CGAL::TBB_support) - target_link_libraries(scale_space_incremental PUBLIC CGAL::TBB_support) - target_link_libraries(scale_space_manifold PUBLIC CGAL::TBB_support) - target_link_libraries(scale_space_advancing_front PUBLIC CGAL::TBB_support) + target_link_libraries(scale_space PRIVATE CGAL::TBB_support) + target_link_libraries(scale_space_incremental PRIVATE CGAL::TBB_support) + target_link_libraries(scale_space_manifold PRIVATE CGAL::TBB_support) + target_link_libraries(scale_space_advancing_front PRIVATE CGAL::TBB_support) endif() else() message("NOTICE: Examples require Eigen 3.1 (or greater), and will not be compiled.") diff --git a/Shape_detection/benchmark/Shape_detection/CMakeLists.txt b/Shape_detection/benchmark/Shape_detection/CMakeLists.txt index 77e9dc7684f7..5b6beaced897 100644 --- a/Shape_detection/benchmark/Shape_detection/CMakeLists.txt +++ b/Shape_detection/benchmark/Shape_detection/CMakeLists.txt @@ -10,9 +10,9 @@ find_package(Eigen3 3.1.0 QUIET) # (3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("benchmark_region_growing_on_point_set_2.cpp") - target_link_libraries(benchmark_region_growing_on_point_set_2 PUBLIC CGAL::Eigen3_support) + target_link_libraries(benchmark_region_growing_on_point_set_2 PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("benchmark_region_growing_on_point_set_3.cpp") - target_link_libraries(benchmark_region_growing_on_point_set_3 PUBLIC CGAL::Eigen3_support) + target_link_libraries(benchmark_region_growing_on_point_set_3 PRIVATE CGAL::Eigen3_support) else() message("NOTICE: This project requires Eigen 3.1 (or greater), and will not be compiled.") endif() diff --git a/Shape_detection/examples/Shape_detection/CMakeLists.txt b/Shape_detection/examples/Shape_detection/CMakeLists.txt index 4a2cbea81839..bcbd16339b91 100644 --- a/Shape_detection/examples/Shape_detection/CMakeLists.txt +++ b/Shape_detection/examples/Shape_detection/CMakeLists.txt @@ -27,7 +27,7 @@ if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("region_growing_planes_on_polygon_mesh.cpp") add_executable(region_growing_planes_on_polyhedron region_growing_planes_on_polygon_mesh.cpp) target_compile_definitions(region_growing_planes_on_polyhedron PUBLIC -DUSE_POLYHEDRON) - target_link_libraries(region_growing_planes_on_polyhedron PUBLIC CGAL::CGAL CGAL::Eigen3_support) + target_link_libraries(region_growing_planes_on_polyhedron PRIVATE CGAL::CGAL CGAL::Eigen3_support) foreach( target @@ -42,6 +42,6 @@ if(TARGET CGAL::Eigen3_support) region_growing_planes_on_polygon_mesh region_growing_lines_on_segment_set) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() endif() diff --git a/Shape_detection/test/Shape_detection/CMakeLists.txt b/Shape_detection/test/Shape_detection/CMakeLists.txt index 35abd070d587..34d6f1c0ad53 100644 --- a/Shape_detection/test/Shape_detection/CMakeLists.txt +++ b/Shape_detection/test/Shape_detection/CMakeLists.txt @@ -45,7 +45,7 @@ if(TARGET CGAL::Eigen3_support) test_region_growing_on_point_set_3_with_sorting test_region_growing_on_polygon_mesh_with_sorting test_region_growing_on_degenerated_mesh) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() set(RANSAC_PROTO_DIR CACHE PATH "") diff --git a/Shape_regularization/benchmark/Shape_regularization/CMakeLists.txt b/Shape_regularization/benchmark/Shape_regularization/CMakeLists.txt index 645499957d9c..58f2ab7b2b04 100644 --- a/Shape_regularization/benchmark/Shape_regularization/CMakeLists.txt +++ b/Shape_regularization/benchmark/Shape_regularization/CMakeLists.txt @@ -17,7 +17,7 @@ if(TARGET CGAL::OSQP_support) foreach(osqp_target ${osqp_targets}) create_single_source_cgal_program("${osqp_target}.cpp") if(TARGET ${osqp_target}) - target_link_libraries(${osqp_target} PUBLIC CGAL::OSQP_support) + target_link_libraries(${osqp_target} PRIVATE CGAL::OSQP_support) endif() endforeach() else() diff --git a/Shape_regularization/examples/Shape_regularization/CMakeLists.txt b/Shape_regularization/examples/Shape_regularization/CMakeLists.txt index 5e9bf84f85fd..ed0104fe41af 100644 --- a/Shape_regularization/examples/Shape_regularization/CMakeLists.txt +++ b/Shape_regularization/examples/Shape_regularization/CMakeLists.txt @@ -22,7 +22,7 @@ if(TARGET CGAL::OSQP_support) foreach(osqp_target ${osqp_targets}) create_single_source_cgal_program("${osqp_target}.cpp") if(TARGET ${osqp_target}) - target_link_libraries(${osqp_target} PUBLIC CGAL::OSQP_support) + target_link_libraries(${osqp_target} PRIVATE CGAL::OSQP_support) endif() endforeach() @@ -33,7 +33,7 @@ if(TARGET CGAL::OSQP_support) message(STATUS "Found Eigen") create_single_source_cgal_program("regularize_real_data_2.cpp") - target_link_libraries(regularize_real_data_2 PUBLIC CGAL::Eigen3_support CGAL::OSQP_support) + target_link_libraries(regularize_real_data_2 PRIVATE CGAL::Eigen3_support CGAL::OSQP_support) else() message(STATUS "NOTICE: Eigen was not found. Eigen examples won't be available.") endif() diff --git a/Shape_regularization/test/Shape_regularization/CMakeLists.txt b/Shape_regularization/test/Shape_regularization/CMakeLists.txt index beb23ce81e2a..02762c7aa8a0 100644 --- a/Shape_regularization/test/Shape_regularization/CMakeLists.txt +++ b/Shape_regularization/test/Shape_regularization/CMakeLists.txt @@ -28,7 +28,7 @@ if(TARGET CGAL::OSQP_support) foreach(osqp_target ${osqp_targets}) create_single_source_cgal_program("${osqp_target}.cpp") if(TARGET ${osqp_target}) - target_link_libraries(${osqp_target} PUBLIC CGAL::OSQP_support) + target_link_libraries(${osqp_target} PRIVATE CGAL::OSQP_support) endif() endforeach() else() diff --git a/Solver_interface/examples/Solver_interface/CMakeLists.txt b/Solver_interface/examples/Solver_interface/CMakeLists.txt index 10fc026e719e..f097c4238f36 100644 --- a/Solver_interface/examples/Solver_interface/CMakeLists.txt +++ b/Solver_interface/examples/Solver_interface/CMakeLists.txt @@ -11,11 +11,11 @@ find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("singular_value_decomposition.cpp") - target_link_libraries(singular_value_decomposition PUBLIC CGAL::Eigen3_support) + target_link_libraries(singular_value_decomposition PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("sparse_solvers.cpp") - target_link_libraries(sparse_solvers PUBLIC CGAL::Eigen3_support) + target_link_libraries(sparse_solvers PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("diagonalize_matrix.cpp") - target_link_libraries(diagonalize_matrix PUBLIC CGAL::Eigen3_support) + target_link_libraries(diagonalize_matrix PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: Eigen3 was not found. Some examples won't be available.") endif() @@ -26,7 +26,7 @@ if(TARGET CGAL::OSQP_support) message(STATUS "Found OSQP") create_single_source_cgal_program("osqp_quadratic_program.cpp") - target_link_libraries(osqp_quadratic_program PUBLIC CGAL::OSQP_support) + target_link_libraries(osqp_quadratic_program PRIVATE CGAL::OSQP_support) message(STATUS "OSQP found and used") else() message(STATUS "NOTICE: OSQP was not found. OSQP examples won't be available.") @@ -38,7 +38,7 @@ if(TARGET CGAL::SCIP_support) message(STATUS "Found SCIP") create_single_source_cgal_program("mixed_integer_program.cpp") - target_link_libraries(mixed_integer_program PUBLIC CGAL::SCIP_support) + target_link_libraries(mixed_integer_program PRIVATE CGAL::SCIP_support) message(STATUS "SCIP found and used") else() find_package(GLPK QUIET) @@ -47,7 +47,7 @@ else() message(STATUS "Found GLPK") create_single_source_cgal_program("mixed_integer_program.cpp") - target_link_libraries(mixed_integer_program PUBLIC CGAL::GLPK_support) + target_link_libraries(mixed_integer_program PRIVATE CGAL::GLPK_support) message(STATUS "GLPK found and used") else() message(STATUS "NOTICE: This project requires either SCIP or GLPK, and will not be compiled. " diff --git a/Spatial_searching/benchmark/Spatial_searching/CMakeLists.txt b/Spatial_searching/benchmark/Spatial_searching/CMakeLists.txt index 4aaf189118f4..f22da9331745 100644 --- a/Spatial_searching/benchmark/Spatial_searching/CMakeLists.txt +++ b/Spatial_searching/benchmark/Spatial_searching/CMakeLists.txt @@ -46,5 +46,5 @@ foreach( sizeof # deque # see above ) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() diff --git a/Spatial_searching/examples/Spatial_searching/CMakeLists.txt b/Spatial_searching/examples/Spatial_searching/CMakeLists.txt index 18b828a05df4..587d9a232274 100644 --- a/Spatial_searching/examples/Spatial_searching/CMakeLists.txt +++ b/Spatial_searching/examples/Spatial_searching/CMakeLists.txt @@ -35,10 +35,10 @@ find_package(Eigen3 3.1.91 QUIET) #(requires 3.1.91 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("fuzzy_range_query.cpp") - target_link_libraries(fuzzy_range_query PUBLIC CGAL::Eigen3_support) + target_link_libraries(fuzzy_range_query PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("general_neighbor_searching.cpp") - target_link_libraries(general_neighbor_searching PUBLIC CGAL::Eigen3_support) + target_link_libraries(general_neighbor_searching PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: The examples 'fuzzy_range_query' and 'general_neighbor_searching'") message(STATUS "will not be compiled as they use CGAL::Epick_d, which requires the Eigen library.") @@ -50,7 +50,7 @@ if(TARGET CGAL::TBB_support) message(STATUS "Found TBB") create_single_source_cgal_program("parallel_kdtree.cpp") - target_link_libraries(parallel_kdtree PUBLIC CGAL::TBB_support) + target_link_libraries(parallel_kdtree PRIVATE CGAL::TBB_support) else() message(STATUS "NOTICE: The example 'parallel_kdtree' requires TBB, and will not be compiled") endif() diff --git a/Spatial_sorting/examples/Spatial_sorting/CMakeLists.txt b/Spatial_sorting/examples/Spatial_sorting/CMakeLists.txt index bee8717e29d0..1fc5703e5b23 100644 --- a/Spatial_sorting/examples/Spatial_sorting/CMakeLists.txt +++ b/Spatial_sorting/examples/Spatial_sorting/CMakeLists.txt @@ -18,5 +18,5 @@ find_package(TBB QUIET) include(CGAL_TBB_support) if(TARGET CGAL::TBB_support) message(STATUS "Found TBB") - target_link_libraries(parallel_spatial_sort_3 PUBLIC CGAL::TBB_support) + target_link_libraries(parallel_spatial_sort_3 PRIVATE CGAL::TBB_support) endif() diff --git a/Spatial_sorting/test/Spatial_sorting/CMakeLists.txt b/Spatial_sorting/test/Spatial_sorting/CMakeLists.txt index 57662ba95f7b..1aa81dc19290 100644 --- a/Spatial_sorting/test/Spatial_sorting/CMakeLists.txt +++ b/Spatial_sorting/test/Spatial_sorting/CMakeLists.txt @@ -13,5 +13,5 @@ find_package(TBB QUIET) include(CGAL_TBB_support) if(TARGET CGAL::TBB_support) message(STATUS "Found TBB") - target_link_libraries(test_hilbert PUBLIC CGAL::TBB_support) + target_link_libraries(test_hilbert PRIVATE CGAL::TBB_support) endif() diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/CMakeLists.txt b/Straight_skeleton_2/examples/Straight_skeleton_2/CMakeLists.txt index 3a8820e61a0a..e5caf454fd7f 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/CMakeLists.txt +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/CMakeLists.txt @@ -15,12 +15,12 @@ foreach(cppfile ${cppfiles}) endforeach() if(CGAL_Qt6_FOUND) - target_link_libraries(draw_straight_skeleton_2 PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(exterior_offset_of_multiple_polygons_with_holes PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(Create_straight_skeleton_2 PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(Show_offset_polygon PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(Show_straight_skeleton PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(extrude_skeleton PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_straight_skeleton_2 PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(exterior_offset_of_multiple_polygons_with_holes PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(Create_straight_skeleton_2 PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(Show_offset_polygon PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(Show_straight_skeleton PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(extrude_skeleton PRIVATE CGAL::CGAL_Basic_viewer) else() message(STATUS "NOTICE: The example 'draw_straight_skeleton_2' requires Qt and will not be compiled.") endif() diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/CMakeLists.txt b/Straight_skeleton_2/test/Straight_skeleton_2/CMakeLists.txt index c7395c3cc446..cbc1776327c4 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/CMakeLists.txt +++ b/Straight_skeleton_2/test/Straight_skeleton_2/CMakeLists.txt @@ -17,8 +17,8 @@ create_single_source_cgal_program("test_sls_traits.cpp") create_single_source_cgal_program("test_straight_skeleton_copy.cpp") if(CGAL_Qt6_FOUND) - target_link_libraries(issue4684 PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(test_sls_previous_issues PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(issue4684 PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(test_sls_previous_issues PRIVATE CGAL::CGAL_Basic_viewer) endif() if (CGAL_Core_FOUND OR LEDA_FOUND) @@ -28,10 +28,10 @@ if (CGAL_Core_FOUND OR LEDA_FOUND) create_single_source_cgal_program("test_sls_weighted_polygons_with_holes.cpp") create_single_source_cgal_program("issue7149.cpp") if(CGAL_Qt6_FOUND) - target_link_libraries(issue7149 PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(issue7284 PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(test_sls_offset PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(test_sls_weighted_polygons_with_holes PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(issue7149 PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(issue7284 PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(test_sls_offset PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(test_sls_weighted_polygons_with_holes PRIVATE CGAL::CGAL_Basic_viewer) endif() else() message("NOTICE: Some test require CGAL_Core (or LEDA), and will not be compiled.") diff --git a/Straight_skeleton_extrusion_2/test/Straight_skeleton_extrusion_2/CMakeLists.txt b/Straight_skeleton_extrusion_2/test/Straight_skeleton_extrusion_2/CMakeLists.txt index 1c26729e3272..a2ed8ab65714 100644 --- a/Straight_skeleton_extrusion_2/test/Straight_skeleton_extrusion_2/CMakeLists.txt +++ b/Straight_skeleton_extrusion_2/test/Straight_skeleton_extrusion_2/CMakeLists.txt @@ -12,7 +12,7 @@ include_directories(BEFORE "include") if (CGAL_Core_FOUND OR LEDA_FOUND) create_single_source_cgal_program("test_sls_extrude.cpp") if(CGAL_Qt6_FOUND) - target_link_libraries(test_sls_extrude PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(test_sls_extrude PRIVATE CGAL::CGAL_Basic_viewer) endif() else() message("NOTICE: Tests require CGAL_Core (or LEDA), and will not be compiled.") diff --git a/Surface_mesh/examples/Surface_mesh/CMakeLists.txt b/Surface_mesh/examples/Surface_mesh/CMakeLists.txt index 4ecd528f219f..6b8821ccb12d 100644 --- a/Surface_mesh/examples/Surface_mesh/CMakeLists.txt +++ b/Surface_mesh/examples/Surface_mesh/CMakeLists.txt @@ -30,7 +30,7 @@ create_single_source_cgal_program("draw_surface_mesh.cpp") if(CGAL_Qt6_FOUND) #link it with the required CGAL libraries - target_link_libraries(draw_surface_mesh PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_surface_mesh PRIVATE CGAL::CGAL_Basic_viewer) endif() diff --git a/Surface_mesh_approximation/examples/Surface_mesh_approximation/CMakeLists.txt b/Surface_mesh_approximation/examples/Surface_mesh_approximation/CMakeLists.txt index 35110d182d26..d45a9693351c 100644 --- a/Surface_mesh_approximation/examples/Surface_mesh_approximation/CMakeLists.txt +++ b/Surface_mesh_approximation/examples/Surface_mesh_approximation/CMakeLists.txt @@ -16,19 +16,19 @@ if(NOT TARGET CGAL::Eigen3_support) endif() create_single_source_cgal_program("vsa_approximation_2_example.cpp") -target_link_libraries(vsa_approximation_2_example PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_approximation_2_example PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vsa_approximation_example.cpp") -target_link_libraries(vsa_approximation_example PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_approximation_example PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vsa_class_interface_example.cpp") -target_link_libraries(vsa_class_interface_example PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_class_interface_example PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vsa_isotropic_metric_example.cpp") -target_link_libraries(vsa_isotropic_metric_example PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_isotropic_metric_example PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vsa_segmentation_example.cpp") -target_link_libraries(vsa_segmentation_example PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_segmentation_example PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vsa_simple_approximation_example.cpp") -target_link_libraries(vsa_simple_approximation_example PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_simple_approximation_example PRIVATE CGAL::Eigen3_support) diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/CMakeLists.txt b/Surface_mesh_approximation/test/Surface_mesh_approximation/CMakeLists.txt index aefc4da29fa2..d085b8cec23c 100644 --- a/Surface_mesh_approximation/test/Surface_mesh_approximation/CMakeLists.txt +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/CMakeLists.txt @@ -16,31 +16,31 @@ if(NOT TARGET CGAL::Eigen3_support) endif() create_single_source_cgal_program("vsa_border_test.cpp") -target_link_libraries(vsa_border_test PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_border_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vsa_class_interface_test.cpp") -target_link_libraries(vsa_class_interface_test PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_class_interface_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vsa_correctness_test.cpp") -target_link_libraries(vsa_correctness_test PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_correctness_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vsa_error_decrease_test.cpp") -target_link_libraries(vsa_error_decrease_test PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_error_decrease_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vsa_kernel_test.cpp") -target_link_libraries(vsa_kernel_test PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_kernel_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vsa_approximation_test.cpp") -target_link_libraries(vsa_approximation_test PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_approximation_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vsa_segmentation_test.cpp") -target_link_libraries(vsa_segmentation_test PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_segmentation_test PRIVATE CGAL::Eigen3_support) #create_single_source_cgal_program("vsa_meshing_manifold_test.cpp") -#target_link_libraries(vsa_meshing_manifold_test PUBLIC CGAL::Eigen3_support) +#target_link_libraries(vsa_meshing_manifold_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vsa_metric_test.cpp") -target_link_libraries(vsa_metric_test PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_metric_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("vsa_teleportation_test.cpp") -target_link_libraries(vsa_teleportation_test PUBLIC CGAL::Eigen3_support) +target_link_libraries(vsa_teleportation_test PRIVATE CGAL::Eigen3_support) diff --git a/Surface_mesh_deformation/benchmark/Surface_mesh_deformation/optimal_rotation/CMakeLists.txt b/Surface_mesh_deformation/benchmark/Surface_mesh_deformation/optimal_rotation/CMakeLists.txt index e76761f97874..19d66a7b1a3b 100644 --- a/Surface_mesh_deformation/benchmark/Surface_mesh_deformation/optimal_rotation/CMakeLists.txt +++ b/Surface_mesh_deformation/benchmark/Surface_mesh_deformation/optimal_rotation/CMakeLists.txt @@ -7,7 +7,7 @@ find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("benchmark_for_concept_models.cpp") - target_link_libraries(benchmark_for_concept_models PUBLIC CGAL::Eigen3_support) + target_link_libraries(benchmark_for_concept_models PRIVATE CGAL::Eigen3_support) else() message("NOTICE: This program requires requires Eigen 3.1 (or greater) or later and will not be compiled.") endif() diff --git a/Surface_mesh_deformation/demo/Surface_mesh_deformation/CMakeLists.txt b/Surface_mesh_deformation/demo/Surface_mesh_deformation/CMakeLists.txt index 98b5dc3c61f6..58874d3f2dca 100644 --- a/Surface_mesh_deformation/demo/Surface_mesh_deformation/CMakeLists.txt +++ b/Surface_mesh_deformation/demo/Surface_mesh_deformation/CMakeLists.txt @@ -12,7 +12,7 @@ find_package(Eigen3 3.1.91 QUIET) #(requires 3.1.91 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("deform_mesh_for_botsch08_format.cpp") - target_link_libraries(deform_mesh_for_botsch08_format PUBLIC CGAL::Eigen3_support) + target_link_libraries(deform_mesh_for_botsch08_format PRIVATE CGAL::Eigen3_support) else() message("NOTICE: This program requires requires Eigen 3.1.91 (or greater) or later and will not be compiled.") endif() diff --git a/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt b/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt index b6013ffce75d..bc5d23347f03 100644 --- a/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt +++ b/Surface_mesh_deformation/examples/Surface_mesh_deformation/CMakeLists.txt @@ -28,7 +28,7 @@ if(TARGET CGAL::Eigen3_support) k_ring_roi_translate_rotate_example k_ring_roi_translate_rotate_Surface_mesh deform_mesh_for_botsch08_format_sre_arap) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() find_package(OpenMesh QUIET) diff --git a/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt b/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt index e8819b7a22b3..b0c1b9bc196c 100644 --- a/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt +++ b/Surface_mesh_deformation/test/Surface_mesh_deformation/CMakeLists.txt @@ -10,11 +10,11 @@ find_package(Eigen3 3.1.91 QUIET) #(requires 3.1.91 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("Cactus_deformation_session.cpp") - target_link_libraries(Cactus_deformation_session PUBLIC CGAL::Eigen3_support) + target_link_libraries(Cactus_deformation_session PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("Cactus_performance_test.cpp") - target_link_libraries(Cactus_performance_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(Cactus_performance_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("Symmetry_test.cpp") - target_link_libraries(Symmetry_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(Symmetry_test PRIVATE CGAL::Eigen3_support) find_package(OpenMesh QUIET) if(OpenMesh_FOUND) diff --git a/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt b/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt index 9315c25e2871..49fdcfc45697 100644 --- a/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt +++ b/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt @@ -44,21 +44,21 @@ if(TARGET CGAL::Eigen3_support) # ------------------------------------------------------------------ create_single_source_cgal_program("ARAP_parameterization.cpp") - target_link_libraries(ARAP_parameterization PUBLIC CGAL::Eigen3_support) + target_link_libraries(ARAP_parameterization PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("discrete_authalic.cpp") - target_link_libraries(discrete_authalic PUBLIC CGAL::Eigen3_support) + target_link_libraries(discrete_authalic PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("lscm.cpp") - target_link_libraries(lscm PUBLIC CGAL::Eigen3_support) + target_link_libraries(lscm PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("orbifold.cpp") - target_link_libraries(orbifold PUBLIC CGAL::Eigen3_support) + target_link_libraries(orbifold PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("seam_Polyhedron_3.cpp") - target_link_libraries(seam_Polyhedron_3 PUBLIC CGAL::Eigen3_support) + target_link_libraries(seam_Polyhedron_3 PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("simple_parameterization.cpp") - target_link_libraries(simple_parameterization PUBLIC CGAL::Eigen3_support) + target_link_libraries(simple_parameterization PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("square_border_parameterizer.cpp") - target_link_libraries(square_border_parameterizer PUBLIC CGAL::Eigen3_support) + target_link_libraries(square_border_parameterizer PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program( "iterative_authalic_parameterizer.cpp" ) - target_link_libraries(iterative_authalic_parameterizer PUBLIC CGAL::Eigen3_support) + target_link_libraries(iterative_authalic_parameterizer PRIVATE CGAL::Eigen3_support) if(SuiteSparse_FOUND) target_link_libraries(ARAP_parameterization PRIVATE ${SuiteSparse_LIBRARIES}) target_link_libraries(orbifold PRIVATE ${SuiteSparse_LIBRARIES}) diff --git a/Surface_mesh_parameterization/test/Surface_mesh_parameterization/CMakeLists.txt b/Surface_mesh_parameterization/test/Surface_mesh_parameterization/CMakeLists.txt index 00278df2f7a4..36f681d45fd4 100644 --- a/Surface_mesh_parameterization/test/Surface_mesh_parameterization/CMakeLists.txt +++ b/Surface_mesh_parameterization/test/Surface_mesh_parameterization/CMakeLists.txt @@ -10,7 +10,7 @@ find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("extensive_parameterization_test.cpp") - target_link_libraries(extensive_parameterization_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(extensive_parameterization_test PRIVATE CGAL::Eigen3_support) else() message("NOTICE: The tests require Eigen 3.1 (or greater), and will not be compiled.") endif() diff --git a/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt b/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt index 0f63efb7b068..384067e6005b 100644 --- a/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt +++ b/Surface_mesh_simplification/examples/Surface_mesh_simplification/CMakeLists.txt @@ -23,7 +23,7 @@ find_package(Eigen3 3.1.0 QUIET) #(3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("edge_collapse_garland_heckbert.cpp") - target_link_libraries(edge_collapse_garland_heckbert PUBLIC CGAL::Eigen3_support) + target_link_libraries(edge_collapse_garland_heckbert PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: Garland-Heckbert polices require the Eigen library, which has not been found; related examples will not be compiled.") endif() @@ -48,7 +48,7 @@ if(TARGET CGAL::TBB_support AND TARGET CGAL::METIS_support) message(STATUS "Found METIS & TBB") create_single_source_cgal_program("collapse_small_edges_in_parallel.cpp") - target_link_libraries(collapse_small_edges_in_parallel PUBLIC CGAL::TBB_support CGAL::METIS_support) + target_link_libraries(collapse_small_edges_in_parallel PRIVATE CGAL::TBB_support CGAL::METIS_support) else() message(STATUS "NOTICE: The example 'collapse_small_edges_in_parallel' uses the METIS and TBB libraries, and will not be compiled.") endif() diff --git a/Surface_mesh_simplification/test/Surface_mesh_simplification/CMakeLists.txt b/Surface_mesh_simplification/test/Surface_mesh_simplification/CMakeLists.txt index cd3cee597296..6707d16ccd97 100644 --- a/Surface_mesh_simplification/test/Surface_mesh_simplification/CMakeLists.txt +++ b/Surface_mesh_simplification/test/Surface_mesh_simplification/CMakeLists.txt @@ -18,7 +18,7 @@ find_package(Eigen3 3.1.0 QUIET) #(3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("edge_collapse_garland_heckbert_variations.cpp") - target_link_libraries(edge_collapse_garland_heckbert_variations PUBLIC CGAL::Eigen3_support) + target_link_libraries(edge_collapse_garland_heckbert_variations PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: Garland-Heckbert polices require the Eigen library, which has not been found; related examples will not be compiled.") endif() diff --git a/Surface_mesh_skeletonization/benchmark/Surface_mesh_skeletonization/CMakeLists.txt b/Surface_mesh_skeletonization/benchmark/Surface_mesh_skeletonization/CMakeLists.txt index 21b285a0b973..66e08127abd5 100644 --- a/Surface_mesh_skeletonization/benchmark/Surface_mesh_skeletonization/CMakeLists.txt +++ b/Surface_mesh_skeletonization/benchmark/Surface_mesh_skeletonization/CMakeLists.txt @@ -11,9 +11,9 @@ find_package(Eigen3 3.2.0 QUIET) #(requires 3.2.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("solver_benchmark.cpp") - target_link_libraries(solver_benchmark PUBLIC CGAL::Eigen3_support) + target_link_libraries(solver_benchmark PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mcf_scale_invariance.cpp") - target_link_libraries(mcf_scale_invariance PUBLIC CGAL::Eigen3_support) + target_link_libraries(mcf_scale_invariance PRIVATE CGAL::Eigen3_support) else() message("NOTICE: This project requires Eigen 3.2.0 (or greater), and will not be compiled.") endif() diff --git a/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt b/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt index 9b86386660b0..b5b8d4cd23f5 100644 --- a/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt +++ b/Surface_mesh_skeletonization/examples/Surface_mesh_skeletonization/CMakeLists.txt @@ -26,7 +26,7 @@ if(TARGET CGAL::Eigen3_support) MCF_Skeleton_sm_example MCF_Skeleton_LCC_example segmentation_example) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() find_package(OpenMesh QUIET) @@ -35,7 +35,7 @@ if(TARGET CGAL::Eigen3_support) message(STATUS "Found OpenMesh") create_single_source_cgal_program("MCF_Skeleton_om_example.cpp") - target_link_libraries(MCF_Skeleton_om_example PUBLIC CGAL::Eigen3_support PRIVATE CGAL::OpenMesh_support) + target_link_libraries(MCF_Skeleton_om_example PRIVATE CGAL::Eigen3_support CGAL::OpenMesh_support) else() message(STATUS "NOTICE: Examples that use OpenMesh will not be compiled.") endif() diff --git a/Surface_mesh_skeletonization/test/Surface_mesh_skeletonization/CMakeLists.txt b/Surface_mesh_skeletonization/test/Surface_mesh_skeletonization/CMakeLists.txt index 86bc2ec13285..cfbd1507754e 100644 --- a/Surface_mesh_skeletonization/test/Surface_mesh_skeletonization/CMakeLists.txt +++ b/Surface_mesh_skeletonization/test/Surface_mesh_skeletonization/CMakeLists.txt @@ -10,9 +10,9 @@ find_package(Eigen3 3.2.0 QUIET) #(requires 3.2.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("MCF_Skeleton_test.cpp") - target_link_libraries(MCF_Skeleton_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(MCF_Skeleton_test PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("skeleton_connectivity_test.cpp") - target_link_libraries(skeleton_connectivity_test PUBLIC CGAL::Eigen3_support) + target_link_libraries(skeleton_connectivity_test PRIVATE CGAL::Eigen3_support) else() message("NOTICE: These tests require the Eigen library (3.2 or greater), and will not be compiled.") endif() diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt b/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt index c176292dfab6..d061af881979 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt @@ -32,17 +32,17 @@ foreach(cppfile ${SOURCE_FILES}) endforeach() if(CGAL_Qt6_FOUND) - target_link_libraries(edgewidth_lcc PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(edgewidth_surface_mesh PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(facewidth PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(open_path_homotopy PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(path_homotopy PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(path_homotopy_double_torus PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(path_homotopy_torus PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(path_homotopy_with_sm_and_polyhedron PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(path_simplicity_double_torus PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(path_simplicity_double_torus_2 PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(shortest_noncontractible_cycle_2 PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(shortest_noncontractible_cycle PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(unsew_edgewidth_repeatedly PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(edgewidth_lcc PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(edgewidth_surface_mesh PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(facewidth PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(open_path_homotopy PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(path_homotopy PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(path_homotopy_double_torus PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(path_homotopy_torus PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(path_homotopy_with_sm_and_polyhedron PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(path_simplicity_double_torus PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(path_simplicity_double_torus_2 PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(shortest_noncontractible_cycle_2 PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(shortest_noncontractible_cycle PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(unsew_edgewidth_repeatedly PRIVATE CGAL::CGAL_Basic_viewer) endif() diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt b/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt index bd8dd2a9535e..415d36cb6378 100644 --- a/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt +++ b/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt @@ -34,8 +34,8 @@ foreach(cppfile ${SOURCE_FILES}) endforeach() if(CGAL_Qt6_FOUND) - target_link_libraries(fundamental_group_of_the_circle PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(fundamental_group_of_the_torus PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(path_with_rle_deformation_tests PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(test_homotopy PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(fundamental_group_of_the_circle PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(fundamental_group_of_the_torus PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(path_with_rle_deformation_tests PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(test_homotopy PRIVATE CGAL::CGAL_Basic_viewer) endif() diff --git a/Surface_sweep_2/test/Surface_sweep_2/CMakeLists.txt b/Surface_sweep_2/test/Surface_sweep_2/CMakeLists.txt index ae1336034cb9..4cf76b876815 100644 --- a/Surface_sweep_2/test/Surface_sweep_2/CMakeLists.txt +++ b/Surface_sweep_2/test/Surface_sweep_2/CMakeLists.txt @@ -20,9 +20,9 @@ function(compile name source_file point_location traits) add_executable(${name} ${source_file}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS ${name}) if(TARGET CGAL::CGAL_Core) - target_link_libraries(${name} CGAL::CGAL CGAL::CGAL_Core) + target_link_libraries(${name} PRIVATE CGAL::CGAL CGAL::CGAL_Core) else() - target_link_libraries(${name} CGAL::CGAL) + target_link_libraries(${name} PRIVATE CGAL::CGAL) endif() target_compile_definitions( ${name} PRIVATE -DCGAL_ARR_TEST_POINT_LOCATION=${point_location} diff --git a/TDS_3/test/TDS_3/CMakeLists.txt b/TDS_3/test/TDS_3/CMakeLists.txt index 887a97215fba..5cca940fe982 100644 --- a/TDS_3/test/TDS_3/CMakeLists.txt +++ b/TDS_3/test/TDS_3/CMakeLists.txt @@ -13,5 +13,5 @@ create_single_source_cgal_program("test_io_tds3.cpp") if(TARGET CGAL::TBB_support) message(STATUS "Found TBB") - target_link_libraries(test_triangulation_tds_3 PUBLIC CGAL::TBB_support) + target_link_libraries(test_triangulation_tds_3 PRIVATE CGAL::TBB_support) endif() diff --git a/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt b/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt index 4a1e6db6cc7f..ed6255c74758 100644 --- a/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt +++ b/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt @@ -29,19 +29,19 @@ find_package(Eigen3 3.1.0 QUIET) #(3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program( "mesh_and_remesh_polyhedral_domain_with_features.cpp" ) - target_link_libraries(mesh_and_remesh_polyhedral_domain_with_features PUBLIC CGAL::Eigen3_support) + target_link_libraries(mesh_and_remesh_polyhedral_domain_with_features PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("mesh_and_remesh_c3t3.cpp") - target_link_libraries(mesh_and_remesh_c3t3 PUBLIC CGAL::Eigen3_support) + target_link_libraries(mesh_and_remesh_c3t3 PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program( "mesh_and_remesh_with_adaptive_sizing.cpp") - target_link_libraries(mesh_and_remesh_with_adaptive_sizing PUBLIC CGAL::Eigen3_support) + target_link_libraries(mesh_and_remesh_with_adaptive_sizing PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program( "mesh_and_remesh_with_sizing.cpp") - target_link_libraries(mesh_and_remesh_with_sizing PUBLIC CGAL::Eigen3_support) + target_link_libraries(mesh_and_remesh_with_sizing PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("tetrahedral_remeshing_with_features_and_sizing.cpp") - target_link_libraries(tetrahedral_remeshing_with_features_and_sizing PUBLIC CGAL::Eigen3_support) + target_link_libraries(tetrahedral_remeshing_with_features_and_sizing PRIVATE CGAL::Eigen3_support) if(CGAL_ACTIVATE_CONCURRENT_MESH_3 AND TARGET CGAL::TBB_support) message(STATUS "Found TBB") diff --git a/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt b/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt index 37afbe1c7a5c..1e4d38d7a86d 100644 --- a/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt +++ b/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt @@ -20,7 +20,7 @@ create_single_source_cgal_program("test_tetrahedral_remeshing_from_mesh_file.cpp # Test MLS projection add_executable(test_tetrahedral_remeshing_mls "test_tetrahedral_remeshing.cpp") -target_link_libraries(test_tetrahedral_remeshing_mls PUBLIC CGAL::CGAL CGAL::Data) +target_link_libraries(test_tetrahedral_remeshing_mls PRIVATE CGAL::CGAL CGAL::Data) target_compile_definitions(test_tetrahedral_remeshing_mls PUBLIC -DCGAL_TET_REMESHING_SMOOTHING_WITH_MLS) cgal_add_test(test_tetrahedral_remeshing_mls) @@ -31,26 +31,26 @@ find_package(Eigen3 3.1.0 QUIET) #(3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("test_mesh_and_remesh_polyhedron_with_features.cpp") - target_link_libraries(test_mesh_and_remesh_polyhedron_with_features PUBLIC CGAL::Eigen3_support) + target_link_libraries(test_mesh_and_remesh_polyhedron_with_features PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("test_mesh_and_remesh_with_sizing_field.cpp") - target_link_libraries(test_mesh_and_remesh_with_sizing_field PUBLIC CGAL::Eigen3_support) + target_link_libraries(test_mesh_and_remesh_with_sizing_field PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("features_and_adaptive_sizing.cpp") - target_link_libraries(features_and_adaptive_sizing PUBLIC CGAL::Eigen3_support) + target_link_libraries(features_and_adaptive_sizing PRIVATE CGAL::Eigen3_support) # with MLS projection add_executable(test_mesh_and_remesh_polyhedron_with_features_mls "test_mesh_and_remesh_polyhedron_with_features.cpp") target_link_libraries(test_mesh_and_remesh_polyhedron_with_features_mls - PUBLIC CGAL::CGAL CGAL::Data CGAL::Eigen3_support) + PRIVATE CGAL::CGAL CGAL::Data CGAL::Eigen3_support) target_compile_definitions(test_mesh_and_remesh_polyhedron_with_features_mls PUBLIC -DCGAL_TET_REMESHING_SMOOTHING_WITH_MLS) cgal_add_test(test_mesh_and_remesh_polyhedron_with_features_mls) if(CGAL_ImageIO_USE_ZLIB) create_single_source_cgal_program("test_mesh_and_remesh_image.cpp") - target_link_libraries(test_mesh_and_remesh_image PUBLIC CGAL::Eigen3_support) + target_link_libraries(test_mesh_and_remesh_image PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: The test 'test_mesh_and_remesh_image' uses zlib, and will not be compiled.") endif() diff --git a/Triangulation/applications/Triangulation/CMakeLists.txt b/Triangulation/applications/Triangulation/CMakeLists.txt index 034a38fa6974..262c38e3bda3 100644 --- a/Triangulation/applications/Triangulation/CMakeLists.txt +++ b/Triangulation/applications/Triangulation/CMakeLists.txt @@ -18,6 +18,6 @@ endif() include_directories(BEFORE include) create_single_source_cgal_program("points_to_RT_to_off.cpp") -target_link_libraries(points_to_RT_to_off PUBLIC CGAL::Eigen3_support) +target_link_libraries(points_to_RT_to_off PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("points_to_DT_to_off.cpp") -target_link_libraries(points_to_DT_to_off PUBLIC CGAL::Eigen3_support) +target_link_libraries(points_to_DT_to_off PRIVATE CGAL::Eigen3_support) diff --git a/Triangulation/benchmark/Triangulation/CMakeLists.txt b/Triangulation/benchmark/Triangulation/CMakeLists.txt index 9737bcc99c69..0abb1fc41f91 100644 --- a/Triangulation/benchmark/Triangulation/CMakeLists.txt +++ b/Triangulation/benchmark/Triangulation/CMakeLists.txt @@ -12,9 +12,9 @@ if(TARGET CGAL::Eigen3_support) include_directories(BEFORE "include") create_single_source_cgal_program("delaunay.cpp") - target_link_libraries(delaunay PUBLIC CGAL::Eigen3_support) + target_link_libraries(delaunay PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program("Td_vs_T2_and_T3.cpp") - target_link_libraries(Td_vs_T2_and_T3 PUBLIC CGAL::Eigen3_support) + target_link_libraries(Td_vs_T2_and_T3 PRIVATE CGAL::Eigen3_support) else() message("NOTICE: Executables in this directory require Eigen 3.1 (or greater), and will not be compiled.") endif() diff --git a/Triangulation/examples/Triangulation/CMakeLists.txt b/Triangulation/examples/Triangulation/CMakeLists.txt index bf1fcf87fb30..44e2a96f1e02 100644 --- a/Triangulation/examples/Triangulation/CMakeLists.txt +++ b/Triangulation/examples/Triangulation/CMakeLists.txt @@ -31,7 +31,7 @@ if(TARGET CGAL::Eigen3_support) triangulation triangulation_data_structure_dynamic triangulation_data_structure_static) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() else() message("NOTICE: Examples in this directory require Eigen 3.1 (or greater), and will not be compiled.") diff --git a/Triangulation/test/Triangulation/CMakeLists.txt b/Triangulation/test/Triangulation/CMakeLists.txt index 03a5deff1659..ed03cdab9001 100644 --- a/Triangulation/test/Triangulation/CMakeLists.txt +++ b/Triangulation/test/Triangulation/CMakeLists.txt @@ -26,7 +26,7 @@ if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("issue_8347.cpp") foreach(target test_triangulation test_delaunay test_regular test_tds test_torture test_insert_if_in_star simple_io_test issue_8347) - target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() else() diff --git a/Triangulation_2/examples/Triangulation_2/CMakeLists.txt b/Triangulation_2/examples/Triangulation_2/CMakeLists.txt index 3e3aafa5f56a..2e2b15634afb 100644 --- a/Triangulation_2/examples/Triangulation_2/CMakeLists.txt +++ b/Triangulation_2/examples/Triangulation_2/CMakeLists.txt @@ -16,10 +16,10 @@ foreach(cppfile ${cppfiles}) endforeach() if(CGAL_Qt6_FOUND) - target_link_libraries(constrained PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(draw_triangulation_2 PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(polygon_triangulation PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(star_conflict_zone PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(constrained PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_triangulation_2 PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(polygon_triangulation PRIVATE CGAL::CGAL_Basic_viewer) + target_link_libraries(star_conflict_zone PRIVATE CGAL::CGAL_Basic_viewer) else() message(STATUS "NOTICE: Several examples require Qt6 and will not be compiled.") endif() diff --git a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt index 2333c9a9ffcd..4cfc223e677e 100644 --- a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt @@ -57,7 +57,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) target_link_libraries(T3_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt6) target_link_libraries(T3_demo PRIVATE Qt6::OpenGL) if(TARGET CGAL::TBB_support) - target_link_libraries(T3_demo PUBLIC CGAL::TBB_support) + target_link_libraries(T3_demo PRIVATE CGAL::TBB_support) endif() include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) diff --git a/Triangulation_3/examples/Triangulation_3/CMakeLists.txt b/Triangulation_3/examples/Triangulation_3/CMakeLists.txt index 62631b150e2d..dd50b2ada79e 100644 --- a/Triangulation_3/examples/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/examples/Triangulation_3/CMakeLists.txt @@ -24,7 +24,7 @@ create_single_source_cgal_program("simplex.cpp") create_single_source_cgal_program("draw_triangulation_3.cpp") if(CGAL_Qt6_FOUND) - target_link_libraries(draw_triangulation_3 PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_triangulation_3 PRIVATE CGAL::CGAL_Basic_viewer) else() message(STATUS "NOTICE: The example 'draw_triangulation_3' requires Qt6, and will not be compiled.") endif() @@ -38,9 +38,9 @@ if(TARGET CGAL::TBB_support) create_single_source_cgal_program("parallel_insertion_and_removal_in_regular_3.cpp") create_single_source_cgal_program("parallel_insertion_in_delaunay_3.cpp") create_single_source_cgal_program("sequential_parallel.cpp") - target_link_libraries(parallel_insertion_and_removal_in_regular_3 PUBLIC CGAL::TBB_support) - target_link_libraries(parallel_insertion_in_delaunay_3 PUBLIC CGAL::TBB_support) - target_link_libraries(sequential_parallel PUBLIC CGAL::TBB_support) + target_link_libraries(parallel_insertion_and_removal_in_regular_3 PRIVATE CGAL::TBB_support) + target_link_libraries(parallel_insertion_in_delaunay_3 PRIVATE CGAL::TBB_support) + target_link_libraries(sequential_parallel PRIVATE CGAL::TBB_support) if(CGAL_ENABLE_TESTING) set_property(TEST diff --git a/Triangulation_3/test/Triangulation_3/CMakeLists.txt b/Triangulation_3/test/Triangulation_3/CMakeLists.txt index 31da9b483204..b90ecd55af3b 100644 --- a/Triangulation_3/test/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/test/Triangulation_3/CMakeLists.txt @@ -38,7 +38,7 @@ if(TARGET CGAL::TBB_support) foreach(target test_delaunay_3 test_regular_3 test_regular_insert_range_with_info) - target_link_libraries(${target} PUBLIC CGAL::TBB_support) + target_link_libraries(${target} PRIVATE CGAL::TBB_support) endforeach() if(CGAL_ENABLE_TESTING) diff --git a/Triangulation_on_sphere_2/test/Triangulation_on_sphere_2/CMakeLists.txt b/Triangulation_on_sphere_2/test/Triangulation_on_sphere_2/CMakeLists.txt index 79beea09c1e2..6120e72d3732 100644 --- a/Triangulation_on_sphere_2/test/Triangulation_on_sphere_2/CMakeLists.txt +++ b/Triangulation_on_sphere_2/test/Triangulation_on_sphere_2/CMakeLists.txt @@ -22,7 +22,7 @@ find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program( "test_dtos_dual.cpp" ) - target_link_libraries(test_dtos_dual PUBLIC CGAL::Eigen3_support) + target_link_libraries(test_dtos_dual PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: The Eigen library was not found. The test 'test_dtos_dual' will not be compiled.") endif() diff --git a/Voronoi_diagram_2/examples/Voronoi_diagram_2/CMakeLists.txt b/Voronoi_diagram_2/examples/Voronoi_diagram_2/CMakeLists.txt index 2d826a426b15..a0c18e3d250d 100644 --- a/Voronoi_diagram_2/examples/Voronoi_diagram_2/CMakeLists.txt +++ b/Voronoi_diagram_2/examples/Voronoi_diagram_2/CMakeLists.txt @@ -16,7 +16,7 @@ foreach(cppfile ${cppfiles}) endforeach() if(CGAL_Qt6_FOUND) - target_link_libraries(draw_voronoi_diagram_2 PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(draw_voronoi_diagram_2 PRIVATE CGAL::CGAL_Basic_viewer) else() message(STATUS "NOTICE: The Qt6 library was not found. The example 'draw_voronoi_diagram_2' will not be compiled.") endif() diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/CMakeLists.txt b/Voronoi_diagram_2/test/Voronoi_diagram_2/CMakeLists.txt index 1675ac213345..de9e0f7256ed 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/CMakeLists.txt +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/CMakeLists.txt @@ -16,7 +16,7 @@ find_package(Eigen3 3.2.0 QUIET) #(requires 3.2.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("vda_tos2.cpp") - target_link_libraries(vda_tos2 PUBLIC CGAL::Eigen3_support) + target_link_libraries(vda_tos2 PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: The Eigen library was not found. The test 'vda_tos2' will not be available.") endif() diff --git a/Weights/examples/Weights/CMakeLists.txt b/Weights/examples/Weights/CMakeLists.txt index d8218de53810..629ba82340df 100644 --- a/Weights/examples/Weights/CMakeLists.txt +++ b/Weights/examples/Weights/CMakeLists.txt @@ -15,7 +15,7 @@ find_package(Eigen3 3.1.0 QUIET) # (requires 3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("weighted_laplacian.cpp") - target_link_libraries(weighted_laplacian PUBLIC CGAL::Eigen3_support) + target_link_libraries(weighted_laplacian PRIVATE CGAL::Eigen3_support) else() message(STATUS "NOTICE: The example 'weighted_laplacian' requires the Eigen library, and will not be compiled.") endif() From 63928f50908ff47d7bc66ff0b184968f7ddeeaad Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 8 Oct 2024 17:10:02 +0100 Subject: [PATCH 270/348] Eigen_support -> Eigen3_support (concerns kinetic @soesau) --- .../examples/Kinetic_space_partition/CMakeLists.txt | 2 +- .../test/Kinetic_space_partition/CMakeLists.txt | 2 +- .../examples/Kinetic_surface_reconstruction/CMakeLists.txt | 2 +- .../test/Kinetic_surface_reconstruction/CMakeLists.txt | 2 +- Orthtree/examples/Orthtree/CMakeLists.txt | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Kinetic_space_partition/examples/Kinetic_space_partition/CMakeLists.txt b/Kinetic_space_partition/examples/Kinetic_space_partition/CMakeLists.txt index 2c61e71ecb0b..e78ac989659c 100644 --- a/Kinetic_space_partition/examples/Kinetic_space_partition/CMakeLists.txt +++ b/Kinetic_space_partition/examples/Kinetic_space_partition/CMakeLists.txt @@ -17,7 +17,7 @@ if(Eigen3_FOUND) foreach(target ${targets}) create_single_source_cgal_program("${target}.cpp") - target_link_libraries(${target} PRIVATE CGAL::Eigen_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() else() message(ERROR "This program requires the Eigen library, and will not be compiled.") diff --git a/Kinetic_space_partition/test/Kinetic_space_partition/CMakeLists.txt b/Kinetic_space_partition/test/Kinetic_space_partition/CMakeLists.txt index 39ac1e88597d..2a8dcd0c6dbb 100644 --- a/Kinetic_space_partition/test/Kinetic_space_partition/CMakeLists.txt +++ b/Kinetic_space_partition/test/Kinetic_space_partition/CMakeLists.txt @@ -27,7 +27,7 @@ if(Boost_FOUND) foreach(target ${targets}) create_single_source_cgal_program("${target}.cpp") if(TARGET ${target}) - target_link_libraries(${target} PUBLIC ${project_linked_libraries} CGAL::Eigen_support) + target_link_libraries(${target} PUBLIC ${project_linked_libraries} CGAL::Eigen3_support) target_compile_definitions(${target} PUBLIC ${project_compilation_definitions}) endif() endforeach() diff --git a/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/CMakeLists.txt b/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/CMakeLists.txt index 932827cf0549..2bfd8cbc41b2 100644 --- a/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/CMakeLists.txt +++ b/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/CMakeLists.txt @@ -17,7 +17,7 @@ if(Eigen3_FOUND) foreach(target ${targets}) create_single_source_cgal_program("${target}.cpp") - target_link_libraries(${target} PRIVATE CGAL::Eigen_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() else() message(ERROR "This program requires the Eigen library, and will not be compiled.") diff --git a/Kinetic_surface_reconstruction/test/Kinetic_surface_reconstruction/CMakeLists.txt b/Kinetic_surface_reconstruction/test/Kinetic_surface_reconstruction/CMakeLists.txt index 64b499f53154..4212c2866cde 100644 --- a/Kinetic_surface_reconstruction/test/Kinetic_surface_reconstruction/CMakeLists.txt +++ b/Kinetic_surface_reconstruction/test/Kinetic_surface_reconstruction/CMakeLists.txt @@ -17,7 +17,7 @@ if(Eigen3_FOUND) foreach(target ${targets}) create_single_source_cgal_program("${target}.cpp") - target_link_libraries(${target} PRIVATE CGAL::Eigen_support) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() else() message(ERROR "This program requires the Eigen library, and will not be compiled.") diff --git a/Orthtree/examples/Orthtree/CMakeLists.txt b/Orthtree/examples/Orthtree/CMakeLists.txt index ff3377e59a43..263619217b07 100644 --- a/Orthtree/examples/Orthtree/CMakeLists.txt +++ b/Orthtree/examples/Orthtree/CMakeLists.txt @@ -20,7 +20,7 @@ create_single_source_cgal_program("quadtree_build_manually.cpp") find_package(Eigen3 3.1.91 QUIET) #(requires 3.1.91 or greater) include(CGAL_Eigen_support) -if (TARGET CGAL::Eigen_support) +if (TARGET CGAL::Eigen3_support) create_single_source_cgal_program("orthtree_build.cpp") - target_link_libraries(orthtree_build PRIVATE CGAL::Eigen_support) + target_link_libraries(orthtree_build PRIVATE CGAL::Eigen3_support) endif() From eaa2dfc4561c3e4d4e36a0633a78467f6717dc7e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 8 Oct 2024 17:20:08 +0100 Subject: [PATCH 271/348] Eigen_support -> Eigen3_support (concerns kinetic @soesau) --- .../examples/Kinetic_space_partition/CMakeLists.txt | 2 +- .../test/Kinetic_space_partition/CMakeLists.txt | 2 +- .../examples/Kinetic_surface_reconstruction/CMakeLists.txt | 2 +- .../test/Kinetic_surface_reconstruction/CMakeLists.txt | 2 +- Orthtree/examples/Orthtree/CMakeLists.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Kinetic_space_partition/examples/Kinetic_space_partition/CMakeLists.txt b/Kinetic_space_partition/examples/Kinetic_space_partition/CMakeLists.txt index e78ac989659c..0ae368020c15 100644 --- a/Kinetic_space_partition/examples/Kinetic_space_partition/CMakeLists.txt +++ b/Kinetic_space_partition/examples/Kinetic_space_partition/CMakeLists.txt @@ -11,7 +11,7 @@ include(CGAL_CreateSingleSourceCGALProgram) find_package(Eigen3 3.1.0 REQUIRED) if(Eigen3_FOUND) message(STATUS "Found Eigen") - include(CGAL_Eigen_support) + include(CGAL_Eigen3_support) set(targets kinetic_partition) diff --git a/Kinetic_space_partition/test/Kinetic_space_partition/CMakeLists.txt b/Kinetic_space_partition/test/Kinetic_space_partition/CMakeLists.txt index 2a8dcd0c6dbb..9edaaea2384b 100644 --- a/Kinetic_space_partition/test/Kinetic_space_partition/CMakeLists.txt +++ b/Kinetic_space_partition/test/Kinetic_space_partition/CMakeLists.txt @@ -17,7 +17,7 @@ if(Boost_FOUND) find_package(Eigen3 3.1.0 REQUIRED) if(Eigen3_FOUND) message(STATUS "Found Eigen") - include(CGAL_Eigen_support) + include(CGAL_Eigen3_support) set(targets kinetic_3d_test_all) diff --git a/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/CMakeLists.txt b/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/CMakeLists.txt index 2bfd8cbc41b2..5445891abb0a 100644 --- a/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/CMakeLists.txt +++ b/Kinetic_surface_reconstruction/examples/Kinetic_surface_reconstruction/CMakeLists.txt @@ -11,7 +11,7 @@ include(CGAL_CreateSingleSourceCGALProgram) find_package(Eigen3 3.1.0 REQUIRED) if(Eigen3_FOUND) message(STATUS "Found Eigen") - include(CGAL_Eigen_support) + include(CGAL_Eigen3_support) set(targets ksr_basic ksr_building ksr_parameters) diff --git a/Kinetic_surface_reconstruction/test/Kinetic_surface_reconstruction/CMakeLists.txt b/Kinetic_surface_reconstruction/test/Kinetic_surface_reconstruction/CMakeLists.txt index 4212c2866cde..bf6b5fc9d132 100644 --- a/Kinetic_surface_reconstruction/test/Kinetic_surface_reconstruction/CMakeLists.txt +++ b/Kinetic_surface_reconstruction/test/Kinetic_surface_reconstruction/CMakeLists.txt @@ -11,7 +11,7 @@ include(CGAL_CreateSingleSourceCGALProgram) find_package(Eigen3 3.1.0 REQUIRED) if(Eigen3_FOUND) message(STATUS "Found Eigen") - include(CGAL_Eigen_support) + include(CGAL_Eigen3_support) set(targets ksr_test ksr_reorientation ksr_regularization) diff --git a/Orthtree/examples/Orthtree/CMakeLists.txt b/Orthtree/examples/Orthtree/CMakeLists.txt index 263619217b07..d3f055198e07 100644 --- a/Orthtree/examples/Orthtree/CMakeLists.txt +++ b/Orthtree/examples/Orthtree/CMakeLists.txt @@ -19,7 +19,7 @@ create_single_source_cgal_program("octree_surface_mesh.cpp") create_single_source_cgal_program("quadtree_build_manually.cpp") find_package(Eigen3 3.1.91 QUIET) #(requires 3.1.91 or greater) -include(CGAL_Eigen_support) +include(CGAL_Eigen3_support) if (TARGET CGAL::Eigen3_support) create_single_source_cgal_program("orthtree_build.cpp") target_link_libraries(orthtree_build PRIVATE CGAL::Eigen3_support) From 59903f107fbffd1ebdd1f57899f845a7365191cc Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 8 Oct 2024 22:19:57 +0100 Subject: [PATCH 272/348] I guess this was before inherited from one of the item classes @lrineau --- Lab/demo/Lab/Plugins/PCA/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lab/demo/Lab/Plugins/PCA/CMakeLists.txt b/Lab/demo/Lab/Plugins/PCA/CMakeLists.txt index 3ede90fe82b6..1311f8a77a52 100644 --- a/Lab/demo/Lab/Plugins/PCA/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/PCA/CMakeLists.txt @@ -31,7 +31,7 @@ cgal_lab_plugin(create_obb_mesh_plugin Create_obb_mesh_plugin) target_link_libraries(create_obb_mesh_plugin PUBLIC scene_surface_mesh_item scene_polygon_soup_item scene_selection_item - scene_points_with_normal_item) + scene_points_with_normal_item CGAL::Eigen3_support) qt6_wrap_ui(volumesUI_FILES Basic_generator_widget.ui) cgal_lab_plugin( From ad8ece612df4e5a00393b319265c47ff98be0a4a Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 8 Oct 2024 22:45:25 +0100 Subject: [PATCH 273/348] more plugins depend on Eigen --- Combinatorial_map/test/Combinatorial_map/CMakeLists.txt | 4 ++-- .../test/Kinetic_space_partition/CMakeLists.txt | 4 ++-- Lab/demo/Lab/Plugins/Display/CMakeLists.txt | 3 ++- Lab/demo/Lab/Plugins/PMP/CMakeLists.txt | 3 ++- Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt | 2 +- .../test/Point_set_processing_3/CMakeLists.txt | 4 ++-- 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt index 8df873f5de3d..b83c3b00df43 100644 --- a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt +++ b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt @@ -16,12 +16,12 @@ create_single_source_cgal_program(Combinatorial_map_copy_test.cpp ${hfiles}) # Same targets, defining USE_COMPACT_CONTAINER_WITH_INDEX to test index version add_executable(Combinatorial_map_test_index Combinatorial_map_test.cpp ${hfiles}) target_compile_definitions(Combinatorial_map_test_index PUBLIC USE_COMPACT_CONTAINER_WITH_INDEX) -target_link_libraries(Combinatorial_map_test_index PUBLIC CGAL CGAL::Data) +target_link_libraries(Combinatorial_map_test_index PRIVATE CGAL::CGAL CGAL::Data) cgal_add_compilation_test(Combinatorial_map_test_index) add_executable(Combinatorial_map_copy_test_index Combinatorial_map_copy_test.cpp ${hfiles}) target_compile_definitions(Combinatorial_map_copy_test_index PUBLIC USE_COMPACT_CONTAINER_WITH_INDEX) -target_link_libraries(Combinatorial_map_copy_test_index PUBLIC CGAL CGAL::Data) +target_link_libraries(Combinatorial_map_copy_test_index PRIVATE CGAL::CGAL CGAL::Data) cgal_add_compilation_test(Combinatorial_map_copy_test_index) create_single_source_cgal_program(cmap_test_split_attribute.cpp) diff --git a/Kinetic_space_partition/test/Kinetic_space_partition/CMakeLists.txt b/Kinetic_space_partition/test/Kinetic_space_partition/CMakeLists.txt index 9edaaea2384b..e8ce84945ce7 100644 --- a/Kinetic_space_partition/test/Kinetic_space_partition/CMakeLists.txt +++ b/Kinetic_space_partition/test/Kinetic_space_partition/CMakeLists.txt @@ -27,8 +27,8 @@ if(Boost_FOUND) foreach(target ${targets}) create_single_source_cgal_program("${target}.cpp") if(TARGET ${target}) - target_link_libraries(${target} PUBLIC ${project_linked_libraries} CGAL::Eigen3_support) - target_compile_definitions(${target} PUBLIC ${project_compilation_definitions}) + target_link_libraries(${target} PRIVATE ${project_linked_libraries} CGAL::Eigen3_support) + target_compile_definitions(${target} PRIVATE ${project_compilation_definitions}) endif() endforeach() else() diff --git a/Lab/demo/Lab/Plugins/Display/CMakeLists.txt b/Lab/demo/Lab/Plugins/Display/CMakeLists.txt index 9c9474d0cf7f..f1beddaf360e 100644 --- a/Lab/demo/Lab/Plugins/Display/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Display/CMakeLists.txt @@ -4,7 +4,8 @@ qt6_wrap_ui(display_propertyUI_FILES Display_property.ui) cgal_lab_plugin(display_property_plugin Display_property_plugin ${display_propertyUI_FILES} KEYWORDS Viewer) target_link_libraries(display_property_plugin PUBLIC scene_surface_mesh_item scene_points_with_normal_item - scene_color_ramp) + scene_color_ramp + CGAL::Eigen3_support) if(TARGET CGAL::Eigen3_support) qt6_wrap_ui(heat_methodUI_FILES Heat_method.ui) diff --git a/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt b/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt index 7e8a8b3841db..6d023a5b4ce5 100644 --- a/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt @@ -179,7 +179,8 @@ cgal_lab_plugin(engrave_text_plugin Engrave_text_plugin ${engravUI_FILES}) target_link_libraries( engrave_text_plugin PUBLIC scene_surface_mesh_item scene_selection_item - scene_polylines_item) + scene_polylines_item + CGAL::Eigen3_support) if(CGAL_ENABLE_TESTING AND NOT CMAKE_VS_MSBUILD_COMMAND) set_tests_properties( diff --git a/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt b/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt index 55d67500fea9..b088ff9a0f38 100644 --- a/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt @@ -179,7 +179,7 @@ cgal_lab_plugin(point_set_clustering_plugin Point_set_clustering_plugin KEYWORDS PointSetProcessing) target_link_libraries( point_set_clustering_plugin PUBLIC scene_points_with_normal_item - scene_callback_signaler) + scene_callback_signaler CGAL::Eigen3_support) cgal_lab_plugin(merge_point_sets_plugin Merge_point_sets_plugin KEYWORDS PointSetProcessing Classification) 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 af87a391aa7d..b4389a10e2ac 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 @@ -37,8 +37,8 @@ if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910 find_package(LASLIB QUIET) include(CGAL_LASLIB_support) if (TARGET CGAL::LASLIB_support) - target_link_libraries(test_read_write_point_set PUBLIC ${CGAL_libs} CGAL::LASLIB_support) - target_link_libraries(test_deprecated_io_point_set PUBLIC ${CGAL_libs} CGAL::LASLIB_support) + target_link_libraries(test_read_write_point_set PRIVATE ${CGAL_libs} CGAL::LASLIB_support) + target_link_libraries(test_deprecated_io_point_set PRIVATE ${CGAL_libs} CGAL::LASLIB_support) else() message(STATUS "NOTICE: the LAS reader test requires LASlib and will not be compiled.") endif() From 520a1af5e85909c9395baa22d46d7e49604b6806 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 07:18:49 +0100 Subject: [PATCH 274/348] Can we savely remove add_definitions(-DQT_NO_KEYWORDS) @lrineau ? --- .../demo/Optimal_transportation_reconstruction_2/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt index 865f2e74f8aa..97595c0cf1a3 100644 --- a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt +++ b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt @@ -28,7 +28,6 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) - add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) add_executable(Otr2_demo glviewer.cpp scene.cpp Otr2_demo.cpp window.cpp render.cpp dialog_options.cpp From 95616154d579b618b3514c3234dde09cb574932b Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 07:19:52 +0100 Subject: [PATCH 275/348] More PRIVATE in LCC and Generalized_map --- .../test/Combinatorial_map/CMakeLists.txt | 4 ++-- .../test/Generalized_map/CMakeLists.txt | 4 ++-- .../test/Linear_cell_complex/CMakeLists.txt | 16 ++++++++-------- .../Polygon_mesh_processing/CMakeLists.txt | 2 +- .../test/Polygon_mesh_processing/CMakeLists.txt | 2 +- STL_Extension/test/STL_Extension/CMakeLists.txt | 2 +- .../examples/Shape_detection/CMakeLists.txt | 2 +- .../test/Tetrahedral_remeshing/CMakeLists.txt | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt index b83c3b00df43..b440e2576362 100644 --- a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt +++ b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt @@ -15,12 +15,12 @@ create_single_source_cgal_program(Combinatorial_map_copy_test.cpp ${hfiles}) # Same targets, defining USE_COMPACT_CONTAINER_WITH_INDEX to test index version add_executable(Combinatorial_map_test_index Combinatorial_map_test.cpp ${hfiles}) -target_compile_definitions(Combinatorial_map_test_index PUBLIC USE_COMPACT_CONTAINER_WITH_INDEX) +target_compile_definitions(Combinatorial_map_test_index PRIVATE USE_COMPACT_CONTAINER_WITH_INDEX) target_link_libraries(Combinatorial_map_test_index PRIVATE CGAL::CGAL CGAL::Data) cgal_add_compilation_test(Combinatorial_map_test_index) add_executable(Combinatorial_map_copy_test_index Combinatorial_map_copy_test.cpp ${hfiles}) -target_compile_definitions(Combinatorial_map_copy_test_index PUBLIC USE_COMPACT_CONTAINER_WITH_INDEX) +target_compile_definitions(Combinatorial_map_copy_test_index PRIVATE USE_COMPACT_CONTAINER_WITH_INDEX) target_link_libraries(Combinatorial_map_copy_test_index PRIVATE CGAL::CGAL CGAL::Data) cgal_add_compilation_test(Combinatorial_map_copy_test_index) diff --git a/Generalized_map/test/Generalized_map/CMakeLists.txt b/Generalized_map/test/Generalized_map/CMakeLists.txt index 5839c02a6985..24ac67748cdc 100644 --- a/Generalized_map/test/Generalized_map/CMakeLists.txt +++ b/Generalized_map/test/Generalized_map/CMakeLists.txt @@ -15,8 +15,8 @@ set(hfiles Generalized_map_2_test.h create_single_source_cgal_program("Generalized_map_test.cpp" ${hfiles}) add_executable(Generalized_map_test_index Generalized_map_test.cpp ${hfiles}) -target_compile_definitions(Generalized_map_test_index PUBLIC USE_COMPACT_CONTAINER_WITH_INDEX) -target_link_libraries(Generalized_map_test_index PUBLIC CGAL CGAL::Data) +target_compile_definitions(Generalized_map_test_index PRIVATE USE_COMPACT_CONTAINER_WITH_INDEX) +target_link_libraries(Generalized_map_test_index PRIVATE CGAL CGAL::Data) cgal_add_compilation_test(Generalized_map_test_index) create_single_source_cgal_program("gmap_test_split_attribute.cpp") diff --git a/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt index dde51b6546b9..3f12de77ceea 100644 --- a/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt @@ -18,21 +18,21 @@ create_single_source_cgal_program(LCC_3_incremental_builder_test.cpp ${hfiles}) # Same targets, defining USE_COMPACT_CONTAINER_WITH_INDEX to test index version add_executable(Linear_cell_complex_2_test_index Linear_cell_complex_2_test.cpp ${hfiles}) -target_compile_definitions(Linear_cell_complex_2_test_index PUBLIC USE_COMPACT_CONTAINER_WITH_INDEX) -target_link_libraries(Linear_cell_complex_2_test_index PUBLIC CGAL CGAL::Data) +target_compile_definitions(Linear_cell_complex_2_test_index PRIVATE USE_COMPACT_CONTAINER_WITH_INDEX) +target_link_libraries(Linear_cell_complex_2_test_index PRIVATE CGAL CGAL::Data) cgal_add_compilation_test(Linear_cell_complex_2_test_index) add_executable(Linear_cell_complex_3_test_index Linear_cell_complex_3_test.cpp ${hfiles}) -target_compile_definitions(Linear_cell_complex_3_test_index PUBLIC USE_COMPACT_CONTAINER_WITH_INDEX) -target_link_libraries(Linear_cell_complex_3_test_index PUBLIC CGAL CGAL::Data) +target_compile_definitions(Linear_cell_complex_3_test_index PRIVATE USE_COMPACT_CONTAINER_WITH_INDEX) +target_link_libraries(Linear_cell_complex_3_test_index PRIVATE CGAL CGAL::Data) cgal_add_compilation_test(Linear_cell_complex_3_test_index) add_executable(Linear_cell_complex_4_test_index Linear_cell_complex_4_test.cpp ${hfiles}) -target_compile_definitions(Linear_cell_complex_4_test_index PUBLIC USE_COMPACT_CONTAINER_WITH_INDEX) -target_link_libraries(Linear_cell_complex_4_test_index PUBLIC CGAL CGAL::Data) +target_compile_definitions(Linear_cell_complex_4_test_index PRIVATE USE_COMPACT_CONTAINER_WITH_INDEX) +target_link_libraries(Linear_cell_complex_4_test_index PRIVATE CGAL CGAL::Data) cgal_add_compilation_test(Linear_cell_complex_4_test_index) add_executable(Linear_cell_complex_copy_test_index Linear_cell_complex_copy_test.cpp ${hfiles}) -target_compile_definitions(Linear_cell_complex_copy_test_index PUBLIC USE_COMPACT_CONTAINER_WITH_INDEX) -target_link_libraries(Linear_cell_complex_copy_test_index PUBLIC CGAL CGAL::Data) +target_compile_definitions(Linear_cell_complex_copy_test_index PRIVATE USE_COMPACT_CONTAINER_WITH_INDEX) +target_link_libraries(Linear_cell_complex_copy_test_index PRIVATE CGAL CGAL::Data) cgal_add_compilation_test(Linear_cell_complex_copy_test_index) diff --git a/Polygon_mesh_processing/benchmark/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/benchmark/Polygon_mesh_processing/CMakeLists.txt index bb3be52226a4..11c27fb7f81b 100644 --- a/Polygon_mesh_processing/benchmark/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/benchmark/Polygon_mesh_processing/CMakeLists.txt @@ -30,7 +30,7 @@ if (FAST_ENVELOPE_BUILD_DIR) create_single_source_cgal_program("fastE.cpp") target_link_libraries( fastE PRIVATE CGAL::Eigen3_support) - target_link_libraries( fastE PUBLIC FastEnvelope IndirectPredicates geogram) + target_link_libraries( fastE PRIVATE FastEnvelope IndirectPredicates geogram) else() message(STATUS "CMake variable FAST_ENVELOPE_BUILD_DIR is not defined; benchmark 'fastE' will not be built") diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt index 3d121cbe5109..0dd21ab22e1c 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt @@ -126,7 +126,7 @@ include(CGAL_Ceres_support) if(TARGET CGAL::Ceres_support AND TARGET CGAL::Eigen3_support) target_link_libraries(test_mesh_smoothing PRIVATE CGAL::Eigen3_support CGAL::Ceres_support) -# target_compile_definitions(test_pmp_repair_self_intersections PUBLIC CGAL_PMP_USE_CERES_SOLVER) +# target_compile_definitions(test_pmp_repair_self_intersections PRIVATE CGAL_PMP_USE_CERES_SOLVER) # target_link_libraries(test_pmp_repair_self_intersections PRIVATE CGAL::Eigen3_support CGAL::Ceres_support) else() message(STATUS "NOTICE: Tests are not using Ceres.") diff --git a/STL_Extension/test/STL_Extension/CMakeLists.txt b/STL_Extension/test/STL_Extension/CMakeLists.txt index 7e47f6c07be6..fafddb64a219 100644 --- a/STL_Extension/test/STL_Extension/CMakeLists.txt +++ b/STL_Extension/test/STL_Extension/CMakeLists.txt @@ -37,7 +37,7 @@ create_single_source_cgal_program("test_cgal_named_params.cpp") add_executable(test_multiset_cc "test_multiset.cpp") target_link_libraries(test_multiset_cc PRIVATE CGAL::CGAL) -target_compile_options(test_multiset_cc PUBLIC -DCGAL_MULTISET_USE_COMPACT_CONTAINER_AS_DEFAULT) +target_compile_options(test_multiset_cc PRIVATE -DCGAL_MULTISET_USE_COMPACT_CONTAINER_AS_DEFAULT) cgal_add_test(test_multiset_cc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS test_multiset_cc) diff --git a/Shape_detection/examples/Shape_detection/CMakeLists.txt b/Shape_detection/examples/Shape_detection/CMakeLists.txt index bcbd16339b91..0a9425927310 100644 --- a/Shape_detection/examples/Shape_detection/CMakeLists.txt +++ b/Shape_detection/examples/Shape_detection/CMakeLists.txt @@ -26,7 +26,7 @@ if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("region_growing_lines_on_segment_set.cpp") create_single_source_cgal_program("region_growing_planes_on_polygon_mesh.cpp") add_executable(region_growing_planes_on_polyhedron region_growing_planes_on_polygon_mesh.cpp) - target_compile_definitions(region_growing_planes_on_polyhedron PUBLIC -DUSE_POLYHEDRON) + target_compile_definitions(region_growing_planes_on_polyhedron PRIVATE -DUSE_POLYHEDRON) target_link_libraries(region_growing_planes_on_polyhedron PRIVATE CGAL::CGAL CGAL::Eigen3_support) foreach( diff --git a/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt b/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt index 1e4d38d7a86d..ba308112e328 100644 --- a/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt +++ b/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt @@ -22,7 +22,7 @@ add_executable(test_tetrahedral_remeshing_mls "test_tetrahedral_remeshing.cpp") target_link_libraries(test_tetrahedral_remeshing_mls PRIVATE CGAL::CGAL CGAL::Data) target_compile_definitions(test_tetrahedral_remeshing_mls - PUBLIC -DCGAL_TET_REMESHING_SMOOTHING_WITH_MLS) + PRIVATE -DCGAL_TET_REMESHING_SMOOTHING_WITH_MLS) cgal_add_test(test_tetrahedral_remeshing_mls) @@ -45,7 +45,7 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(test_mesh_and_remesh_polyhedron_with_features_mls PRIVATE CGAL::CGAL CGAL::Data CGAL::Eigen3_support) target_compile_definitions(test_mesh_and_remesh_polyhedron_with_features_mls - PUBLIC -DCGAL_TET_REMESHING_SMOOTHING_WITH_MLS) + PRIVATE -DCGAL_TET_REMESHING_SMOOTHING_WITH_MLS) cgal_add_test(test_mesh_and_remesh_polyhedron_with_features_mls) if(CGAL_ImageIO_USE_ZLIB) From 74e8e23b8523c2fcc333245e155eebcacc4dc34b Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 07:32:27 +0100 Subject: [PATCH 276/348] Use target_compile_definitions() --- .../examples/Point_set_processing_3/CMakeLists.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 dbbfd1efe866..85e72510b3b5 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 @@ -8,9 +8,6 @@ find_package(CGAL REQUIRED) # VisualC++ optimization for applications dealing with large data if(MSVC) - # Quit warning in the lasreader - add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS) - if(CMAKE_SIZEOF_VOID_P EQUAL 4) # Allow Windows 32bit applications to use up to 3GB of RAM set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE") @@ -63,6 +60,10 @@ if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910 create_single_source_cgal_program("write_las_example.cpp") target_link_libraries(read_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support) target_link_libraries(write_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support) + + target_compile_definitions(read_las_example PRIVATE -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS) + target_compile_definitions(write_las_example PRIVATE -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS) + else() message(STATUS "NOTICE : the LAS reader test requires LASlib and will not be compiled.") endif() From d817ddad248599470e24ab19c8f5dd850294c566 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 08:23:13 +0100 Subject: [PATCH 277/348] Use target_compile_definitions() --- .../examples/Surface_mesh_parameterization/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt b/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt index 49fdcfc45697..38b0f74f05fc 100644 --- a/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt +++ b/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt @@ -30,8 +30,6 @@ if(TARGET CGAL::Eigen3_support) if(SuiteSparse_UMFPACK_FOUND OR TARGET SuiteSparse::umfpack) message(STATUS "SuiteSparse_LIBS: ${SuiteSparse_LIBRARIES}") message(STATUS "Orbifold Tutte Embeddings will use UmfPackLU") - add_definitions(-DEIGEN_DONT_ALIGN_STATICALLY) - add_definitions(-DCGAL_SMP_USE_SUITESPARSE_SOLVERS) else() message(STATUS "NOTICE: The example `orbifold.cpp` will be compiled without the SuiteSparse library and UmfPack. Try setting SuiteSparse_UMF_INCLUDE_DIR and at least one of SuiteSparse_UMFPACK_LIBRARY_RELEASE and SuiteSparse_UMFPACK_LIBRARY_DEBUG to you UMFPACK installation.") endif() @@ -60,6 +58,8 @@ if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program( "iterative_authalic_parameterizer.cpp" ) target_link_libraries(iterative_authalic_parameterizer PRIVATE CGAL::Eigen3_support) if(SuiteSparse_FOUND) + target_compile_definitions(ARAP_parameterization PRIVATE -DEIGEN_DONT_ALIGN_STATICALLY -DCGAL_SMP_USE_SUITESPARSE_SOLVERS ) + target_compile_definitions(orbifold PRIVATE -DEIGEN_DONT_ALIGN_STATICALLY -DCGAL_SMP_USE_SUITESPARSE_SOLVERS ) target_link_libraries(ARAP_parameterization PRIVATE ${SuiteSparse_LIBRARIES}) target_link_libraries(orbifold PRIVATE ${SuiteSparse_LIBRARIES}) endif() From 4f0b40683e132a7d151f082f912330ef0ae92a0c Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 08:36:18 +0100 Subject: [PATCH 278/348] Spatial_searching: Do not quiet warning in CMakeLists.txt --- Spatial_searching/examples/Spatial_searching/CMakeLists.txt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Spatial_searching/examples/Spatial_searching/CMakeLists.txt b/Spatial_searching/examples/Spatial_searching/CMakeLists.txt index 18b828a05df4..8fbb2c2bfc55 100644 --- a/Spatial_searching/examples/Spatial_searching/CMakeLists.txt +++ b/Spatial_searching/examples/Spatial_searching/CMakeLists.txt @@ -7,11 +7,6 @@ project(Spatial_searching_Examples) # CGAL and its components find_package(CGAL REQUIRED) -if(MSVC) - # Turn off VC++ warning - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4244") -endif() - create_single_source_cgal_program("circular_query.cpp") create_single_source_cgal_program("distance_browsing.cpp") create_single_source_cgal_program("iso_rectangle_2_query.cpp") From 10b37057f41fa154583b8733d25fd91aaf0bebf2 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 09:07:08 +0100 Subject: [PATCH 279/348] Only link to Boost::program_options and not to Do the same later elsewhere, but let's first see a green testsuite --- Ridges_3/examples/Ridges_3/CMakeLists.txt | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/Ridges_3/examples/Ridges_3/CMakeLists.txt b/Ridges_3/examples/Ridges_3/CMakeLists.txt index ef3d5b1e90ff..eecde864e41b 100644 --- a/Ridges_3/examples/Ridges_3/CMakeLists.txt +++ b/Ridges_3/examples/Ridges_3/CMakeLists.txt @@ -19,15 +19,10 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(Ridges_Umbilics_LCC PRIVATE CGAL::Eigen3_support) add_definitions("-DCGAL_USE_BOOST_PROGRAM_OPTIONS") - if(TARGET Boost::program_options) - target_link_libraries(Compute_Ridges_Umbilics PRIVATE Boost::program_options) - target_link_libraries(Ridges_Umbilics_SM PRIVATE Boost::program_options) - target_link_libraries(Ridges_Umbilics_LCC PRIVATE Boost::program_options) - else() - target_link_libraries(Compute_Ridges_Umbilics PRIVATE ${Boost_PROGRAM_OPTIONS_LIBRARY}) - target_link_libraries(Ridges_Umbilics_SM PRIVATE ${Boost_PROGRAM_OPTIONS_LIBRARY}) - target_link_libraries(Ridges_Umbilics_LCC PRIVATE ${Boost_PROGRAM_OPTIONS_LIBRARY}) - endif() + target_link_libraries(Compute_Ridges_Umbilics PRIVATE Boost::program_options) + target_link_libraries(Ridges_Umbilics_SM PRIVATE Boost::program_options) + target_link_libraries(Ridges_Umbilics_LCC PRIVATE Boost::program_options) + else() message("NOTICE: This project requires Boost Program Options and will not be compiled.") endif() From 9cafc4dd4ca600a317b949f2c8b11daa3b518c79 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 9 Oct 2024 11:20:53 +0200 Subject: [PATCH 280/348] Embed cleanup.sh in the action It seems somebody removed it from the `cgal.github.io` repo. --- .github/workflows/build_doc.yml | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index e0813de02369..cf65f46fcb93 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -195,8 +195,26 @@ jobs: done cd ./cgal.github.io echo "
  • Manual for PR ${PR_NUMBER} ($ROUND).
  • " >> ./index.html - ./cleanup.bash + + exit_code=0 + for d in */; do + pr=${d%/} + STATE=$(GH_REPO=CGAL/cgal gh pr view "$pr" --json state --jq .state) + if [ $? -ne 0 ]; then + >&2 echo "ERROR: Failed to retrieve state for #$pr" + exit_code=1 + continue + fi + echo "#$pr: $STATE" + if [ "$STATE" != "OPEN" ]; then + echo "-> Deleting ./$pr/" + git rm -rf --quiet "./$pr" || >&2 echo "ERROR: Failed to delete ./$pr/" && exit_code=1 + sed -e "/$pr/d" -i index.html || >&2 echo "ERROR: Failed to remove $pr from index.html" && exit_code=1 + fi + done + cat index.html | grep -F "$(echo */ | tr ' ' '\n')" > index.html git add ${PR_NUMBER}/$ROUND index.html && git commit -q --amend -m "sole commit" && git push -q -f -u origin master + exit $exit_code else echo "DoxygenError=This round already exists. Overwrite it with /force-build." >> $GITHUB_OUTPUT exit 1 From 2b3e0a709802ceb170d91b066161ad2d6fd4df7d Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 9 Oct 2024 11:28:05 +0200 Subject: [PATCH 281/348] Update build_doc.yml --- .github/workflows/build_doc.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index cf65f46fcb93..705ead0028c1 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -214,7 +214,6 @@ jobs: done cat index.html | grep -F "$(echo */ | tr ' ' '\n')" > index.html git add ${PR_NUMBER}/$ROUND index.html && git commit -q --amend -m "sole commit" && git push -q -f -u origin master - exit $exit_code else echo "DoxygenError=This round already exists. Overwrite it with /force-build." >> $GITHUB_OUTPUT exit 1 From d3cb61284069f6a59c4a94d2e9ecb0261ce914f3 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Wed, 9 Oct 2024 12:51:14 +0200 Subject: [PATCH 282/348] using upper_bound_on_dart_ids() instead of number_of_darts() --- .../include/CGAL/Kinetic_surface_reconstruction_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h index 7df975df13c3..702589886d6f 100644 --- a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h +++ b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h @@ -1534,7 +1534,7 @@ class Kinetic_surface_reconstruction_3 { // Start extraction of a border from each dart (each dart is a 1/n-edge) // Search starting darts by searching faces //borders contains Attribute<0> handles casted to std::size_t - std::vector processed(m_lcc.number_of_darts(), false); + std::vector processed(m_lcc.upper_bound_on_dart_ids(), false); borders_per_region.resize(region_index.size()); From 9e75ab340d75f7cc7ac1f9695cb9b294f6981280 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 11:58:52 +0100 Subject: [PATCH 283/348] Use add_compile_definitions --- AABB_tree/demo/AABB_tree/CMakeLists.txt | 2 +- .../demo/Alpha_shapes_3/CMakeLists.txt | 2 +- .../Arrangement_on_surface_2/CMakeLists.txt | 2 +- .../CMakeLists.txt | 2 +- .../demo/Alpha_shapes_2/CMakeLists.txt | 2 +- .../demo/Apollonius_graph_2/CMakeLists.txt | 2 +- .../demo/Bounding_volumes/CMakeLists.txt | 2 +- .../demo/Circular_kernel_2/CMakeLists.txt | 2 +- GraphicsView/demo/Generator/CMakeLists.txt | 2 +- GraphicsView/demo/GraphicsView/CMakeLists.txt | 2 +- .../demo/L1_Voronoi_diagram_2/CMakeLists.txt | 2 +- .../demo/Largest_empty_rect_2/CMakeLists.txt | 2 +- .../Periodic_2_triangulation_2/CMakeLists.txt | 2 +- GraphicsView/demo/Polygon/CMakeLists.txt | 4 ++-- .../Segment_Delaunay_graph_2/CMakeLists.txt | 2 +- .../CMakeLists.txt | 2 +- .../demo/Snap_rounding_2/CMakeLists.txt | 2 +- .../demo/Spatial_searching_2/CMakeLists.txt | 2 +- .../demo/Stream_lines_2/CMakeLists.txt | 2 +- .../demo/Triangulation_2/CMakeLists.txt | 2 +- Kernel_23/test/Kernel_23/CMakeLists.txt | 2 +- Lab/demo/Lab/CMakeLists.txt | 10 ++++----- .../Linear_cell_complex_2/CMakeLists.txt | 6 ++--- .../Linear_cell_complex_3/CMakeLists.txt | 4 ++-- .../demo/Linear_cell_complex/CMakeLists.txt | 22 +++++++++---------- .../Linear_cell_complex/CMakeLists.txt | 2 +- Mesh_3/benchmark/Mesh_3/CMakeLists.txt | 6 ++--- Mesh_3/examples/Mesh_3/CMakeLists.txt | 6 ++--- .../Periodic_3_triangulation_3/CMakeLists.txt | 2 +- .../Polyline_simplification_2/CMakeLists.txt | 2 +- Ridges_3/examples/Ridges_3/CMakeLists.txt | 2 +- .../test/Shape_detection/CMakeLists.txt | 2 +- Surface_mesh/benchmark/CMakeLists.txt | 6 ++--- .../Surface_mesh_topology/CMakeLists.txt | 4 ++-- .../Surface_mesh_topology/CMakeLists.txt | 8 +++---- .../test/Surface_mesh_topology/CMakeLists.txt | 8 +++---- .../Tetrahedral_remeshing/CMakeLists.txt | 2 +- .../test/Tetrahedral_remeshing/CMakeLists.txt | 4 ++-- .../demo/Triangulation_3/CMakeLists.txt | 4 ++-- 39 files changed, 72 insertions(+), 72 deletions(-) diff --git a/AABB_tree/demo/AABB_tree/CMakeLists.txt b/AABB_tree/demo/AABB_tree/CMakeLists.txt index b276517937e0..6a8551246fc6 100644 --- a/AABB_tree/demo/AABB_tree/CMakeLists.txt +++ b/AABB_tree/demo/AABB_tree/CMakeLists.txt @@ -14,7 +14,7 @@ find_package(Qt6 QUIET COMPONENTS Gui OpenGL) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) # Instruct CMake to run moc/ui/rcc automatically when needed. set(CMAKE_AUTOMOC ON) diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt b/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt index a167cf634db7..ffd128922f99 100644 --- a/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt @@ -13,7 +13,7 @@ find_package(Qt6 QUIET COMPONENTS Widgets OpenGL) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) # Instruct CMake to run moc/ui/rcc automatically when needed. set(CMAKE_AUTOMOC ON) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt index 6d80cda629a1..f0546d39b6ba 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt @@ -20,7 +20,7 @@ if (CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_INCLUDE_CURRENT_DIR ON) # Arrangement package includes - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) option(COMPILE_UTILS_INCREMENTALLY "Compile files in Utils directory incrementally, or compile them all as a unit. \ Incremental compilation will be better for development and consume less \ diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2_earth/CMakeLists.txt b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2_earth/CMakeLists.txt index 5d0cf45b9523..47ac56dde951 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2_earth/CMakeLists.txt +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2_earth/CMakeLists.txt @@ -39,7 +39,7 @@ endif() -add_definitions(-DQT_NO_VERSION_TAGGING) +add_compile_definitions(-DQT_NO_VERSION_TAGGING) # AOS file(GLOB source_files_aos Aos.h Aos.cpp Aos_defs.h diff --git a/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt b/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt index 62a0eccf3822..da0637016798 100644 --- a/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt +++ b/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt b/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt index 157517fa35d7..9be2cac7fed4 100644 --- a/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt +++ b/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/Bounding_volumes/CMakeLists.txt b/GraphicsView/demo/Bounding_volumes/CMakeLists.txt index 42b98ccf55fd..3dc7150fa42a 100644 --- a/GraphicsView/demo/Bounding_volumes/CMakeLists.txt +++ b/GraphicsView/demo/Bounding_volumes/CMakeLists.txt @@ -19,7 +19,7 @@ endif() if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_INCLUDE_CURRENT_DIR ON) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) diff --git a/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt b/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt index 351fb788b3fa..d5d492cfae83 100644 --- a/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt +++ b/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/Generator/CMakeLists.txt b/GraphicsView/demo/Generator/CMakeLists.txt index fd3550dd5e68..6d58ed411ccc 100644 --- a/GraphicsView/demo/Generator/CMakeLists.txt +++ b/GraphicsView/demo/Generator/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/GraphicsView/CMakeLists.txt b/GraphicsView/demo/GraphicsView/CMakeLists.txt index f5df86dac284..2e96d21559a7 100644 --- a/GraphicsView/demo/GraphicsView/CMakeLists.txt +++ b/GraphicsView/demo/GraphicsView/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) qt_add_executable(min min.cpp) diff --git a/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt b/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt index 437603b1abbf..90b33fd63887 100644 --- a/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt +++ b/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt @@ -11,7 +11,7 @@ include_directories(BEFORE ./include) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt b/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt index 369d938d4676..1a54859e917f 100644 --- a/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt +++ b/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt @@ -10,7 +10,7 @@ find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt b/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt index ba2b3e85708d..6b7f60e065bc 100644 --- a/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt +++ b/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt @@ -8,7 +8,7 @@ include_directories(BEFORE ./include) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) diff --git a/GraphicsView/demo/Polygon/CMakeLists.txt b/GraphicsView/demo/Polygon/CMakeLists.txt index e3e4758a1cf2..e7f8e01c4449 100644 --- a/GraphicsView/demo/Polygon/CMakeLists.txt +++ b/GraphicsView/demo/Polygon/CMakeLists.txt @@ -16,13 +16,13 @@ endif() find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) if(CGAL_Core_FOUND) - add_definitions(-DCGAL_USE_CORE) + add_compile_definitions(-DCGAL_USE_CORE) endif() qt_add_executable(Polygon_2 Polygon_2.cpp diff --git a/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt b/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt index 4662d848a9e4..2839b7bc5bd8 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt +++ b/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt @@ -15,7 +15,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) qt_add_executable( diff --git a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt index 45d7de3f21b0..db839e832a7f 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt +++ b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt @@ -13,7 +13,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) qt_add_executable( Segment_voronoi_linf_2 Segment_voronoi_linf_2.cpp diff --git a/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt b/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt index 84a65d8d79d6..f69d4103c8fb 100644 --- a/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt +++ b/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt @@ -12,7 +12,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) qt_add_executable( Snap_rounding_2 Snap_rounding_2.cpp diff --git a/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt b/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt index a5cbfc4346cb..d486a7f0bf9b 100644 --- a/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt +++ b/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt @@ -10,7 +10,7 @@ find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/Stream_lines_2/CMakeLists.txt b/GraphicsView/demo/Stream_lines_2/CMakeLists.txt index 85a1a90d1454..586e84746253 100644 --- a/GraphicsView/demo/Stream_lines_2/CMakeLists.txt +++ b/GraphicsView/demo/Stream_lines_2/CMakeLists.txt @@ -10,7 +10,7 @@ find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/Triangulation_2/CMakeLists.txt b/GraphicsView/demo/Triangulation_2/CMakeLists.txt index 515dfca67812..31cad71c9b20 100644 --- a/GraphicsView/demo/Triangulation_2/CMakeLists.txt +++ b/GraphicsView/demo/Triangulation_2/CMakeLists.txt @@ -17,7 +17,7 @@ if(NOT CGAL_Qt6_FOUND OR NOT Qt6_FOUND) return() endif() -add_definitions(-DQT_NO_KEYWORDS) +add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) #-------------------------------- diff --git a/Kernel_23/test/Kernel_23/CMakeLists.txt b/Kernel_23/test/Kernel_23/CMakeLists.txt index e617a7882429..13ce4d27a38f 100644 --- a/Kernel_23/test/Kernel_23/CMakeLists.txt +++ b/Kernel_23/test/Kernel_23/CMakeLists.txt @@ -37,7 +37,7 @@ if(CGAL_KERNEL_23_TEST_RT_FT_PREDICATE_FLAGS) # - create a lot of possible combinations, which is expensive to test # - create issues because some combinations might be RT-sufficient whereas others will require FT # - # add_definitions(-DCGAL_KERNEL_23_TEST_RT_FT_PREDICATES_TEST_PREDICATES_WITH_TEMPLATED_OPERATORS) + # add_compile_definitions(-DCGAL_KERNEL_23_TEST_RT_FT_PREDICATES_TEST_PREDICATES_WITH_TEMPLATED_OPERATORS) create_single_source_cgal_program("atomic_compilation_test.cpp") target_precompile_headers(atomic_compilation_test PUBLIC [["atomic_RT_FT_predicate_headers.h"]]) diff --git a/Lab/demo/Lab/CMakeLists.txt b/Lab/demo/Lab/CMakeLists.txt index a1ff59c01b51..41b160690619 100644 --- a/Lab/demo/Lab/CMakeLists.txt +++ b/Lab/demo/Lab/CMakeLists.txt @@ -3,7 +3,7 @@ project(Lab_Demo) include(FeatureSummary) -add_definitions ( -DCGAL_NO_DEPRECATED_CODE ) +add_compile_definitions ( -DCGAL_NO_DEPRECATED_CODE ) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -48,8 +48,8 @@ set_package_properties( DESCRIPTION "To find this package, it should be sufficient to fill the Qt6_DIR variable with: ///lib/cmake/Qt6") if(Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) - add_definitions(-DSCENE_IMAGE_GL_BUFFERS_AVAILABLE) + add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DSCENE_IMAGE_GL_BUFFERS_AVAILABLE) endif(Qt6_FOUND) find_package(Eigen3 3.2.0 QUIET) #(requires 3.2.0 or greater) @@ -94,7 +94,7 @@ option(CGAL_ACTIVATE_CONCURRENT_MESH_3 "Activate parallelism in Mesh_3" OFF) # And add -DCGAL_CONCURRENT_MESH_3 if that option is ON if(CGAL_ACTIVATE_CONCURRENT_MESH_3 OR "$ENV{CGAL_ACTIVATE_CONCURRENT_MESH_3}") - add_definitions(-DCGAL_CONCURRENT_MESH_3) + add_compile_definitions(-DCGAL_CONCURRENT_MESH_3) if(NOT TBB_FOUND) find_package(TBB REQUIRED) include(CGAL_TBB_support) @@ -345,7 +345,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_to_cached_list(CGAL_EXECUTABLE_TARGETS ${lib}) endforeach() - add_definitions(-DUSE_FORWARD_DECL) + add_compile_definitions(-DUSE_FORWARD_DECL) add_library( cgal_lab SHARED MainWindow.cpp diff --git a/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt b/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt index 986cd4f2fdb5..23999e2d8470 100644 --- a/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt +++ b/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt @@ -13,9 +13,9 @@ link_directories(${CMAKE_CURRENT_SOURCE_DIR}/cgogn/lib/Release) include_directories(BEFORE "/usr/include/libxml2/") # For profilling with gprof -#add_definitions("-pg") +#add_compile_definitions("-pg") #SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") -# add_definitions("-g") +# add_compile_definitions("-g") # OpenMesh find_package(OpenMesh REQUIRED) @@ -47,7 +47,7 @@ find_package(Qt REQUIRED) set(QT_USE_QTSVG TRUE) set(QT_USE_QTXML TRUE) include(${QT_USE_FILE}) -add_definitions(${QT_DEFINITIONS}) +add_compile_definitions(${QT_DEFINITIONS}) set(CGoGN_EXT_INCLUDES ${CGoGN_EXT_INCLUDES} ${QT_INCLUDE_DIR}) set(CGoGN_EXT_LIBS ${CGoGN_EXT_LIBS} ${QT_LIBRARIES}) diff --git a/Linear_cell_complex/benchmark/Linear_cell_complex_3/CMakeLists.txt b/Linear_cell_complex/benchmark/Linear_cell_complex_3/CMakeLists.txt index 8bbdcaddddba..386bc33fafea 100644 --- a/Linear_cell_complex/benchmark/Linear_cell_complex_3/CMakeLists.txt +++ b/Linear_cell_complex/benchmark/Linear_cell_complex_3/CMakeLists.txt @@ -21,9 +21,9 @@ find_package(Qt REQUIRED) set(QT_USE_QTSVG TRUE) set(QT_USE_QTXML TRUE) include(${QT_USE_FILE}) -add_definitions(${QT_DEFINITIONS}) +add_compile_definitions(${QT_DEFINITIONS}) -add_definitions(-DINCLUDE_TEMPLATES) +add_compile_definitions(-DINCLUDE_TEMPLATES) # Performance_3 add_executable(performance_3 performance_3.cpp) diff --git a/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt index 33a5b9b4c1f7..1cba87aeb682 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt @@ -9,25 +9,25 @@ project(Linear_cell_complex_Demo) set(CMAKE_INCLUDE_CURRENT_DIR ON) ## To add expensive tests -# add_definitions("-DCGAL_CHECK_EXPENSIVE") -# add_definitions("-Wall -Wextra") -# add_definitions(-fsanitize=address) +# add_compile_definitions("-DCGAL_CHECK_EXPENSIVE") +# add_compile_definitions("-Wall -Wextra") +# add_compile_definitions(-fsanitize=address) # add_link_options(-fsanitize=address) -# add_definitions("-D_GLIBCXX_DEBUG") +# add_compile_definitions("-D_GLIBCXX_DEBUG") ## For profilling with gprof -# add_definitions("-pg") +# add_compile_definitions("-pg") # SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") ## To add an is_valid test after each operation (only in debug mode) -# add_definitions("-DCGAL_CMAP_TEST_VALID_REMOVALS") -# add_definitions("-DCGAL_CMAP_TEST_VALID_CONTRACTIONS") -# add_definitions("-DCGAL_CMAP_TEST_VALID_INSERTIONS") +# add_compile_definitions("-DCGAL_CMAP_TEST_VALID_REMOVALS") +# add_compile_definitions("-DCGAL_CMAP_TEST_VALID_CONTRACTIONS") +# add_compile_definitions("-DCGAL_CMAP_TEST_VALID_INSERTIONS") # Option allowing to profile each operation of the demo (cout times on stdout). -add_definitions(-DCGAL_PROFILE_LCC_DEMO) +add_compile_definitions(-DCGAL_PROFILE_LCC_DEMO) -add_definitions(-DCMAP_WITH_INDEX) # to use cc with index (handle otherwise) +add_compile_definitions(-DCMAP_WITH_INDEX) # to use cc with index (handle otherwise) ################## find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) @@ -40,7 +40,7 @@ if(NOT CGAL_Qt6_FOUND OR NOT Qt6_FOUND) else() - add_definitions(-DCGAL_USE_BASIC_VIEWER -DQT_NO_KEYWORDS) + add_compile_definitions(-DCGAL_USE_BASIC_VIEWER -DQT_NO_KEYWORDS) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) diff --git a/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt index bec92c80e309..da2c0144a6e1 100644 --- a/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt @@ -11,7 +11,7 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) # set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") # To use valgrind, we must disable rounding math check. -# add_definitions(-DCGAL_DISABLE_ROUNDING_MATH_CHECK) +# add_compile_definitions(-DCGAL_DISABLE_ROUNDING_MATH_CHECK) create_single_source_cgal_program("gmap_linear_cell_complex_3.cpp") create_single_source_cgal_program("linear_cell_complex_3.cpp") diff --git a/Mesh_3/benchmark/Mesh_3/CMakeLists.txt b/Mesh_3/benchmark/Mesh_3/CMakeLists.txt index a74707749002..bc7a8944cb7b 100644 --- a/Mesh_3/benchmark/Mesh_3/CMakeLists.txt +++ b/Mesh_3/benchmark/Mesh_3/CMakeLists.txt @@ -6,13 +6,13 @@ project(Mesh_3_benchmark) find_package(CGAL REQUIRED COMPONENTS ImageIO) -add_definitions(-DCGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX +add_compile_definitions(-DCGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX -DCGAL_MESH_3_NO_DEPRECATED_C3T3_ITERATORS) # Activate verbose mode? (turned OFF by default) option(CGAL_ACTIVATE_CONCURRENT_MESH_3 "Activate verbose mode in Mesh_3" OFF) if(MESH_3_VERBOSE) - add_definitions(-DCGAL_MESH_3_VERBOSE) + add_compile_definitions(-DCGAL_MESH_3_VERBOSE) endif() # Activate concurrency? (turned OFF by default) @@ -20,7 +20,7 @@ option(CGAL_ACTIVATE_CONCURRENT_MESH_3 "Activate parallelism in Mesh_3" OFF) # And add -DCGAL_CONCURRENT_MESH_3 if that option is ON if(CGAL_ACTIVATE_CONCURRENT_MESH_3) - add_definitions(-DCGAL_CONCURRENT_MESH_3) + add_compile_definitions(-DCGAL_CONCURRENT_MESH_3) find_package(TBB REQUIRED) include(CGAL_TBB_support) else() diff --git a/Mesh_3/examples/Mesh_3/CMakeLists.txt b/Mesh_3/examples/Mesh_3/CMakeLists.txt index aadcc5060aed..5ed6a9b95700 100644 --- a/Mesh_3/examples/Mesh_3/CMakeLists.txt +++ b/Mesh_3/examples/Mesh_3/CMakeLists.txt @@ -1,11 +1,11 @@ cmake_minimum_required(VERSION 3.12...3.29) project(Mesh_3_Examples) -add_definitions(-DCGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX +add_compile_definitions(-DCGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX -DCGAL_MESH_3_NO_DEPRECATED_C3T3_ITERATORS) if(CGAL_MESH_3_VERBOSE) - add_definitions(-DCGAL_MESH_3_VERBOSE) + add_compile_definitions(-DCGAL_MESH_3_VERBOSE) endif() find_package(CGAL REQUIRED COMPONENTS ImageIO) @@ -13,7 +13,7 @@ find_package(CGAL REQUIRED COMPONENTS ImageIO) option(CGAL_ACTIVATE_CONCURRENT_MESH_3 "Activate parallelism in Mesh_3" OFF) if(CGAL_ACTIVATE_CONCURRENT_MESH_3 OR "$ENV{CGAL_ACTIVATE_CONCURRENT_MESH_3}") - add_definitions(-DCGAL_CONCURRENT_MESH_3) + add_compile_definitions(-DCGAL_CONCURRENT_MESH_3) find_package(TBB REQUIRED) include(CGAL_TBB_support) endif() 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 e91b1e5719cc..30bc4d0c97f9 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 @@ -11,7 +11,7 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets OpenGL Help ToolsTools) if(Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) endif(Qt6_FOUND) diff --git a/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt b/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt index a07d8998706c..69e4a9748459 100644 --- a/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt +++ b/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt @@ -12,7 +12,7 @@ find_package(Qt6 QUIET COMPONENTS Widgets) include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) diff --git a/Ridges_3/examples/Ridges_3/CMakeLists.txt b/Ridges_3/examples/Ridges_3/CMakeLists.txt index eecde864e41b..22e25c7fd961 100644 --- a/Ridges_3/examples/Ridges_3/CMakeLists.txt +++ b/Ridges_3/examples/Ridges_3/CMakeLists.txt @@ -18,7 +18,7 @@ if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program(Ridges_Umbilics_LCC.cpp) target_link_libraries(Ridges_Umbilics_LCC PRIVATE CGAL::Eigen3_support) - add_definitions("-DCGAL_USE_BOOST_PROGRAM_OPTIONS") + add_compile_definitions("-DCGAL_USE_BOOST_PROGRAM_OPTIONS") target_link_libraries(Compute_Ridges_Umbilics PRIVATE Boost::program_options) target_link_libraries(Ridges_Umbilics_SM PRIVATE Boost::program_options) target_link_libraries(Ridges_Umbilics_LCC PRIVATE Boost::program_options) diff --git a/Shape_detection/test/Shape_detection/CMakeLists.txt b/Shape_detection/test/Shape_detection/CMakeLists.txt index 34d6f1c0ad53..2f4245f2f762 100644 --- a/Shape_detection/test/Shape_detection/CMakeLists.txt +++ b/Shape_detection/test/Shape_detection/CMakeLists.txt @@ -50,7 +50,7 @@ if(TARGET CGAL::Eigen3_support) set(RANSAC_PROTO_DIR CACHE PATH "") if(NOT RANSAC_PROTO_DIR STREQUAL "") - add_definitions(-DPOINTSWITHINDEX -DCGAL_TEST_RANSAC_PROTOTYPE) + add_compile_definitions(-DPOINTSWITHINDEX -DCGAL_TEST_RANSAC_PROTOTYPE) include_directories(${RANSAC_PROTO_DIR}) include_directories(${RANSAC_PROTO_DIR}/MiscLib/) file(GLOB proto_src "${RANSAC_PROTO_DIR}/*.cpp") diff --git a/Surface_mesh/benchmark/CMakeLists.txt b/Surface_mesh/benchmark/CMakeLists.txt index 6faf4b6b6fe4..c963412dd5b6 100644 --- a/Surface_mesh/benchmark/CMakeLists.txt +++ b/Surface_mesh/benchmark/CMakeLists.txt @@ -4,10 +4,10 @@ project(Surface_mesh_performance) find_package(CGAL REQUIRED) # For profilling with gprof -#add_definitions("-pg") +#add_compile_definitions("-pg") #SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") -# add_definitions("-g") -add_definitions("-std=c++1y") +# add_compile_definitions("-g") +add_compile_definitions("-std=c++1y") # Polyhedron add_executable(polyhedron_performance performance_2.h polyhedron_performance.h diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/CMakeLists.txt b/Surface_mesh_topology/benchmark/Surface_mesh_topology/CMakeLists.txt index 595aee92c9df..0459f5ea2490 100644 --- a/Surface_mesh_topology/benchmark/Surface_mesh_topology/CMakeLists.txt +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/CMakeLists.txt @@ -4,8 +4,8 @@ cmake_minimum_required(VERSION 3.12...3.29) find_package(CGAL REQUIRED) -# add_definitions(-DCGAL_TRACE_PATH_TESTS) -# add_definitions(-DCGAL_TRACE_CMAP_TOOLS) +# add_compile_definitions(-DCGAL_TRACE_PATH_TESTS) +# add_compile_definitions(-DCGAL_TRACE_CMAP_TOOLS) set(SOURCE_FILES quadrangulation_computation_benchmarks.cpp path_homotopy_with_schema.cpp) diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt b/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt index d061af881979..d18f19190b82 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt @@ -3,10 +3,10 @@ project(Surface_mesh_topology_Examples) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -# add_definitions(-DCGAL_TRACE_PATH_TESTS) -# add_definitions(-DCGAL_TRACE_CMAP_TOOLS) -# add_definitions("-Wall -Wextra") -# add_definitions("-D_GLIBCXX_DEBUG") +# add_compile_definitions(-DCGAL_TRACE_PATH_TESTS) +# add_compile_definitions(-DCGAL_TRACE_CMAP_TOOLS) +# add_compile_definitions("-Wall -Wextra") +# add_compile_definitions("-D_GLIBCXX_DEBUG") set(SOURCE_FILES edgewidth_lcc.cpp diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt b/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt index 415d36cb6378..7924745df87d 100644 --- a/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt +++ b/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt @@ -3,10 +3,10 @@ project(Surface_mesh_topology_Tests) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -# add_definitions(-DCGAL_TRACE_PATH_TESTS) -# add_definitions(-DCGAL_TRACE_CMAP_TOOLS) -# add_definitions("-Wall -Wextra") -# add_definitions("-D_GLIBCXX_DEBUG") +# add_compile_definitions(-DCGAL_TRACE_PATH_TESTS) +# add_compile_definitions(-DCGAL_TRACE_CMAP_TOOLS) +# add_compile_definitions("-Wall -Wextra") +# add_compile_definitions("-D_GLIBCXX_DEBUG") set(SOURCE_FILES fundamental_group_of_the_circle.cpp diff --git a/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt b/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt index ed6255c74758..cd7a9f7e7370 100644 --- a/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt +++ b/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt @@ -16,7 +16,7 @@ create_single_source_cgal_program("tetrahedral_remeshing_from_mesh.cpp") # Concurrent Mesh_3 option(CGAL_ACTIVATE_CONCURRENT_MESH_3 "Activate parallelism in Mesh_3" OFF) if(CGAL_ACTIVATE_CONCURRENT_MESH_3 OR "$ENV{CGAL_ACTIVATE_CONCURRENT_MESH_3}") - add_definitions(-DCGAL_CONCURRENT_MESH_3) + add_compile_definitions(-DCGAL_CONCURRENT_MESH_3) find_package(TBB REQUIRED) include(CGAL_TBB_support) else() diff --git a/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt b/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt index ba308112e328..07dfc6ea0f41 100644 --- a/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt +++ b/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt @@ -8,8 +8,8 @@ project(Tetrahedral_remeshing_Tests) # CGAL and its components find_package(CGAL REQUIRED COMPONENTS ImageIO) -add_definitions(-DCGAL_TETRAHEDRAL_REMESHING_VERBOSE) -#add_definitions(-DCGAL_CHECK_EXPENSIVE) #to activate expensive assertions +add_compile_definitions(-DCGAL_TETRAHEDRAL_REMESHING_VERBOSE) +#add_compile_definitions(-DCGAL_CHECK_EXPENSIVE) #to activate expensive assertions create_single_source_cgal_program("test_tetrahedral_remeshing.cpp") create_single_source_cgal_program("test_tetrahedral_remeshing_with_features.cpp") diff --git a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt index 4cfc223e677e..b4dfe997b885 100644 --- a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt @@ -12,7 +12,7 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets OpenGL) if(Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) endif(Qt6_FOUND) @@ -22,7 +22,7 @@ option(CGAL_ACTIVATE_CONCURRENT_TRIANGULATION_3 # And add -DCGAL_CONCURRENT_TRIANGULATION_3 if that option is ON if(CGAL_ACTIVATE_CONCURRENT_TRIANGULATION_3) - add_definitions(-DCGAL_CONCURRENT_TRIANGULATION_3) + add_compile_definitions(-DCGAL_CONCURRENT_TRIANGULATION_3) find_package(TBB REQUIRED) include(CGAL_TBB_support) else(CGAL_ACTIVATE_CONCURRENT_TRIANGULATION_3) From 5829760b0556c7483101f867dccc892de3a09675 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 13:12:52 +0100 Subject: [PATCH 284/348] No need to include from ../../include --- Triangulation_3/examples/Triangulation_3/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/Triangulation_3/examples/Triangulation_3/CMakeLists.txt b/Triangulation_3/examples/Triangulation_3/CMakeLists.txt index dd50b2ada79e..1c8eb7b15841 100644 --- a/Triangulation_3/examples/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/examples/Triangulation_3/CMakeLists.txt @@ -3,8 +3,6 @@ project(Triangulation_3_Examples) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -include_directories(BEFORE "../../include") - create_single_source_cgal_program("for_loop.cpp") create_single_source_cgal_program("adding_handles_3.cpp") create_single_source_cgal_program("color.cpp") From 9bf41340435c7a9cc0dc4df1836fa01a5220c25a Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 13:14:11 +0100 Subject: [PATCH 285/348] Only link with Boost::program_options - Supported the minimum required cmake --- Generator/benchmark/Generator/CMakeLists.txt | 9 ++------- Jet_fitting_3/examples/Jet_fitting_3/CMakeLists.txt | 8 ++------ Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt | 10 ++++------ 3 files changed, 8 insertions(+), 19 deletions(-) diff --git a/Generator/benchmark/Generator/CMakeLists.txt b/Generator/benchmark/Generator/CMakeLists.txt index a31ce5263695..e1daf72a2999 100644 --- a/Generator/benchmark/Generator/CMakeLists.txt +++ b/Generator/benchmark/Generator/CMakeLists.txt @@ -10,13 +10,8 @@ find_package(Boost COMPONENTS program_options) if(Boost_PROGRAM_OPTIONS_FOUND) create_single_source_cgal_program("random_grid.cpp") create_single_source_cgal_program("random_disc_2.cpp") - if(TARGET Boost::program_options) - target_link_libraries(random_grid PRIVATE Boost::program_options) - target_link_libraries(random_disc_2 PRIVATE Boost::program_options) - else() - target_link_libraries(random_grid PRIVATE ${Boost_PROGRAM_OPTIONS_LIBRARY}) - target_link_libraries(random_disc_2 PRIVATE ${Boost_PROGRAM_OPTIONS_LIBRARY}) - endif() + target_link_libraries(random_grid PRIVATE Boost::program_options) + target_link_libraries(random_disc_2 PRIVATE Boost::program_options) else() message("NOTICE: The benchmarks requires Boost Program Options, and will not be compiled.") endif() diff --git a/Jet_fitting_3/examples/Jet_fitting_3/CMakeLists.txt b/Jet_fitting_3/examples/Jet_fitting_3/CMakeLists.txt index 4785a6647bc6..a8bcc29b90cd 100644 --- a/Jet_fitting_3/examples/Jet_fitting_3/CMakeLists.txt +++ b/Jet_fitting_3/examples/Jet_fitting_3/CMakeLists.txt @@ -15,12 +15,8 @@ if(TARGET CGAL::Eigen3_support) find_package(Boost QUIET COMPONENTS program_options) if(Boost_PROGRAM_OPTIONS_FOUND) create_single_source_cgal_program("Mesh_estimation.cpp") - target_link_libraries(Mesh_estimation PRIVATE CGAL::Eigen3_support) - if(TARGET Boost::program_options) - target_link_libraries(Mesh_estimation PRIVATE Boost::program_options) - else() - target_link_libraries(Mesh_estimation PRIVATE ${Boost_PROGRAM_OPTIONS_LIBRARY}) - endif() + target_link_libraries(Mesh_estimation PRIVATE CGAL::Eigen3_support + Boost::program_options) else() message(STATUS "NOTICE: The example 'Mesh_estimation' requires Boost Program Options, and will not be compiled.") endif() diff --git a/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt b/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt index 6898456fc8ca..889c647ff9d8 100644 --- a/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt @@ -57,12 +57,10 @@ if(Boost_FILESYSTEM_FOUND) if(VTK_LIBRARIES) target_compile_definitions(io_image_plugin PRIVATE -DCGAL_USE_VTK -DNOMINMAX) endif() - if(TARGET Boost::filesystem) - target_link_libraries(io_image_plugin PUBLIC Boost::filesystem - Boost::system) - else() - target_link_libraries(io_image_plugin PUBLIC ${Boost_LIBRARIES}) - endif() + + target_link_libraries(io_image_plugin PUBLIC Boost::filesystem + Boost::system) + else() message(STATUS "NOTICE: the Io_image_plugin requires boost-filesystem, and will not be compiled") endif() From 63d2a26c00d79ead0a370e82588e190a2b5cf7a6 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 13:21:51 +0100 Subject: [PATCH 286/348] Use Boost::serialization and Boost::iostreams --- Classification/examples/Classification/CMakeLists.txt | 10 ++++------ Classification/test/Classification/CMakeLists.txt | 10 ++++------ Lab/demo/Lab/Plugins/Classification/CMakeLists.txt | 11 +++++------ Mesh_3/benchmark/Mesh_3/CMakeLists.txt | 7 ++----- 4 files changed, 15 insertions(+), 23 deletions(-) diff --git a/Classification/examples/Classification/CMakeLists.txt b/Classification/examples/Classification/CMakeLists.txt index 61060474db98..9be4f7fdad1b 100644 --- a/Classification/examples/Classification/CMakeLists.txt +++ b/Classification/examples/Classification/CMakeLists.txt @@ -10,15 +10,13 @@ find_package(CGAL REQUIRED) set(Classification_dependencies_met TRUE) find_package(Boost OPTIONAL_COMPONENTS serialization iostreams) -include(CGAL_Boost_serialization_support) -include(CGAL_Boost_iostreams_support) -if(NOT TARGET CGAL::Boost_serialization_support) +if(NOT TARGET Boost::serialization) message("NOTICE: This project requires Boost Serialization, and will not be compiled.") set(Classification_dependencies_met FALSE) endif() -if(NOT TARGET CGAL::Boost_iostreams_support) +if(NOT TARGET Boost::iostreams) message("NOTICE: This project requires Boost IO Streams, and will not be compiled.") set(Classification_dependencies_met FALSE) endif() @@ -69,8 +67,8 @@ foreach(target example_deprecated_conversion) if(TARGET ${target}) target_link_libraries(${target} PRIVATE CGAL::Eigen3_support - CGAL::Boost_iostreams_support - CGAL::Boost_serialization_support) + Boost::iostreams + Boost::serialization) if(TARGET CGAL::TBB_support) target_link_libraries(${target} PRIVATE CGAL::TBB_support) endif() diff --git a/Classification/test/Classification/CMakeLists.txt b/Classification/test/Classification/CMakeLists.txt index 8b3ccbf3da3c..aa5d323ba53a 100644 --- a/Classification/test/Classification/CMakeLists.txt +++ b/Classification/test/Classification/CMakeLists.txt @@ -10,15 +10,13 @@ find_package(CGAL REQUIRED) set(Classification_dependencies_met TRUE) find_package(Boost OPTIONAL_COMPONENTS serialization iostreams) -include(CGAL_Boost_serialization_support) -include(CGAL_Boost_iostreams_support) -if(NOT TARGET CGAL::Boost_serialization_support) +if(NOT TARGET Boost::serialization) message("NOTICE: This project requires Boost Serialization, and will not be compiled.") set(Classification_dependencies_met FALSE) endif() -if(NOT TARGET CGAL::Boost_iostreams_support) +if(NOT TARGET Boost::iostreams) message("NOTICE: This project requires Boost IO Streams, and will not be compiled.") set(Classification_dependencies_met FALSE) endif() @@ -42,8 +40,8 @@ create_single_source_cgal_program("test_classification_io.cpp") foreach(target test_classification_point_set test_classification_io) target_link_libraries(${target} PRIVATE CGAL::Eigen3_support - CGAL::Boost_iostreams_support - CGAL::Boost_serialization_support) + Boost::iostreams + Boost::serialization) if(TARGET CGAL::TBB_support) target_link_libraries(${target} PRIVATE CGAL::TBB_support) endif() diff --git a/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt b/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt index dabd10ef5276..ab5190aac749 100644 --- a/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt @@ -3,9 +3,8 @@ include(CGALlab_macros) if(TARGET CGAL::Eigen3_support) find_package(Boost QUIET OPTIONAL_COMPONENTS serialization iostreams) - include(CGAL_Boost_serialization_support) - include(CGAL_Boost_iostreams_support) - if(NOT TARGET CGAL::Boost_serialization_support OR NOT TARGET CGAL::Boost_iostreams_support) + + if(NOT TARGET Boost::serialization OR NOT TARGET Boost::iostreams message(STATUS "NOTICE: Boost IO Streams and/or Serialization not found, reading deprecated Classification config files won't be possible.") endif() @@ -47,9 +46,9 @@ if(TARGET CGAL::Eigen3_support) PROPERTIES RESOURCE_LOCK Selection_test_resources) endif() - if(TARGET CGAL::Boost_serialization_support AND TARGET CGAL::Boost_iostreams_support) - target_link_libraries(classification_plugin PRIVATE CGAL::Boost_serialization_support - CGAL::Boost_iostreams_support) + if(TARGET Boost::serialization AND TARGET Boost::iostreams) + target_link_libraries(classification_plugin PRIVATE Boost::serialization + Boost::iostreams) endif() if(TARGET CGAL::OpenCV_support) diff --git a/Mesh_3/benchmark/Mesh_3/CMakeLists.txt b/Mesh_3/benchmark/Mesh_3/CMakeLists.txt index bc7a8944cb7b..dcb7518f288a 100644 --- a/Mesh_3/benchmark/Mesh_3/CMakeLists.txt +++ b/Mesh_3/benchmark/Mesh_3/CMakeLists.txt @@ -41,9 +41,6 @@ endif() # Link with Boost.ProgramOptions (optional) find_package(Boost QUIET COMPONENTS program_options) if(Boost_PROGRAM_OPTIONS_FOUND) - if(TARGET Boost::program_options) - target_link_libraries(benchmark_mesh_3 PRIVATE Boost::program_options) - else() - target_link_libraries(benchmark_mesh_3 PRIVATE ${Boost_PROGRAM_OPTIONS_LIBRARY}) - endif() +target_link_libraries(benchmark_mesh_3 PRIVATE Boost::program_options) + endif() From 98d4690da7ace7349a056b121914a1ddfb6da060 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 13:45:26 +0100 Subject: [PATCH 287/348] Fix in Unique_hash_map --- Hash_map/include/CGAL/Hash_map/internal/chained_map.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Hash_map/include/CGAL/Hash_map/internal/chained_map.h b/Hash_map/include/CGAL/Hash_map/internal/chained_map.h index bea9b0993f00..bc94a3d3b0bd 100644 --- a/Hash_map/include/CGAL/Hash_map/internal/chained_map.h +++ b/Hash_map/include/CGAL/Hash_map/internal/chained_map.h @@ -16,6 +16,7 @@ #ifndef CGAL_HASH_MAP_INTERNAL_CHAINED_MAP_H #define CGAL_HASH_MAP_INTERNAL_CHAINED_MAP_H +#include #include #include #include @@ -257,7 +258,7 @@ chained_map::chained_map(chained_map&& D) noexcept(std::is_nothrow_move_constructible_v && std::is_nothrow_move_constructible_v) : table(std::exchange(D.table, nullptr)) , table_end(std::exchange(D.table_end, nullptr)) - , free(std::exchange(D.free, nullptr)) + , free BOOST_PREVENT_MACRO_SUBSTITUTION (std::exchange(D.free, nullptr)) , table_size(std::exchange(D.table_size, 0)) , table_size_1(std::exchange(D.table_size_1, 0)) , alloc(std::move(D.alloc)) From 42488c787697ad1e004671dc7abafc4e09e8a2f6 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 14:44:32 +0100 Subject: [PATCH 288/348] free -> freelist; Comment define of _CRTDBG_MAP_ALLOC --- .../CGAL/Hash_map/internal/chained_map.h | 29 +++++++++---------- Installation/include/CGAL/config.h | 2 +- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/Hash_map/include/CGAL/Hash_map/internal/chained_map.h b/Hash_map/include/CGAL/Hash_map/internal/chained_map.h index bc94a3d3b0bd..0451685d133d 100644 --- a/Hash_map/include/CGAL/Hash_map/internal/chained_map.h +++ b/Hash_map/include/CGAL/Hash_map/internal/chained_map.h @@ -16,7 +16,6 @@ #ifndef CGAL_HASH_MAP_INTERNAL_CHAINED_MAP_H #define CGAL_HASH_MAP_INTERNAL_CHAINED_MAP_H -#include #include #include #include @@ -45,7 +44,7 @@ class chained_map chained_map_elem* table; chained_map_elem* table_end; - chained_map_elem* free; + chained_map_elem* freelist; std::size_t table_size; std::size_t table_size_1; @@ -144,10 +143,10 @@ void chained_map::init_table(std::size_t n) std::allocator_traits::construct(alloc,table + i); } - free = table + t; + freelist = table + t; table_end = table + t + t/2; - for (Item p = table; p < free; ++p) + for (Item p = table; p < freelist; ++p) { p->succ = nullptr; p->k = nullkey; } @@ -161,10 +160,10 @@ inline void chained_map::insert(std::size_t x, T y) q->k = x; q->i = y; } else { - free->k = x; - free->i = y; - free->succ = q->succ; - q->succ = free++; + freelist->k = x; + freelist->i = y; + freelist->succ = q->succ; + q->succ = freelist++; } } @@ -214,7 +213,7 @@ T& chained_map::access(Item p, std::size_t x) // index x not present, insert it - if (free == table_end) // table full: rehash + if (freelist == table_end) // table full: rehash { rehash(); p = HASH(x); } @@ -225,7 +224,7 @@ T& chained_map::access(Item p, std::size_t x) return p->i; } - q = free++; + q = freelist++; q->k = x; init_inf(q->i); // initializes q->i to xdef q->succ = p->succ; @@ -246,7 +245,7 @@ chained_map::chained_map(const chained_map& D) { init_table(D.table_size); - for(Item p = D.table; p < D.free; ++p) + for(Item p = D.table; p < D.freelist; ++p) { if (p->k != nullkey || p >= D.table + D.table_size) { insert(p->k,p->i); //D.copy_inf(p->i); // see chapter Implementation @@ -258,7 +257,7 @@ chained_map::chained_map(chained_map&& D) noexcept(std::is_nothrow_move_constructible_v && std::is_nothrow_move_constructible_v) : table(std::exchange(D.table, nullptr)) , table_end(std::exchange(D.table_end, nullptr)) - , free BOOST_PREVENT_MACRO_SUBSTITUTION (std::exchange(D.free, nullptr)) + , freelist(std::exchange(D.freelist, nullptr)) , table_size(std::exchange(D.table_size, 0)) , table_size_1(std::exchange(D.table_size_1, 0)) , alloc(std::move(D.alloc)) @@ -273,7 +272,7 @@ chained_map& chained_map::operator=(const chained_ma init_table(D.table_size); - for(Item p = D.table; p < D.free; ++p) + for(Item p = D.table; p < D.freelist; ++p) { if (p->k != nullkey || p >= D.table + D.table_size) { insert(p->k,p->i); //copy_inf(p->i); // see chapter Implementation @@ -290,7 +289,7 @@ chained_map& chained_map::operator=(chained_map::statistics() const std::size_t n = 0; for (Item p = table; p < table + table_size; ++p) if (p ->k != nullkey) ++n; - std::size_t used_in_overflow = free - (table + table_size ); + std::size_t used_in_overflow = freelist - (table + table_size ); n += used_in_overflow; std::cout << "number of entries: " << n << "\n"; std::cout << "fraction of entries in first position: " << diff --git a/Installation/include/CGAL/config.h b/Installation/include/CGAL/config.h index 92a4ac768f58..64e68c535001 100644 --- a/Installation/include/CGAL/config.h +++ b/Installation/include/CGAL/config.h @@ -42,7 +42,7 @@ // Include support for memory leak detection // This is only available in debug mode and when _CRTDBG_MAP_ALLOC is defined. // It will include which will redefine `malloc` and `free`. -# define _CRTDBG_MAP_ALLOC 1 +// # define _CRTDBG_MAP_ALLOC 1 #endif // Mimic users including this file which defines min max macros // and other names leading to name clashes From 3deebceb97bc7c1026622113315b0a311a1e4bb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 9 Oct 2024 16:00:51 +0200 Subject: [PATCH 289/348] Revert "Embed cleanup.sh in the action" This reverts commit 9cafc4dd4ca600a317b949f2c8b11daa3b518c79. --- .github/workflows/build_doc.yml | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index 705ead0028c1..e0813de02369 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -195,24 +195,7 @@ jobs: done cd ./cgal.github.io echo "
  • Manual for PR ${PR_NUMBER} ($ROUND).
  • " >> ./index.html - - exit_code=0 - for d in */; do - pr=${d%/} - STATE=$(GH_REPO=CGAL/cgal gh pr view "$pr" --json state --jq .state) - if [ $? -ne 0 ]; then - >&2 echo "ERROR: Failed to retrieve state for #$pr" - exit_code=1 - continue - fi - echo "#$pr: $STATE" - if [ "$STATE" != "OPEN" ]; then - echo "-> Deleting ./$pr/" - git rm -rf --quiet "./$pr" || >&2 echo "ERROR: Failed to delete ./$pr/" && exit_code=1 - sed -e "/$pr/d" -i index.html || >&2 echo "ERROR: Failed to remove $pr from index.html" && exit_code=1 - fi - done - cat index.html | grep -F "$(echo */ | tr ' ' '\n')" > index.html + ./cleanup.bash git add ${PR_NUMBER}/$ROUND index.html && git commit -q --amend -m "sole commit" && git push -q -f -u origin master else echo "DoxygenError=This round already exists. Overwrite it with /force-build." >> $GITHUB_OUTPUT From da4febac627bc2f33d9579b1b9057a19ac3956da Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 15:38:18 +0100 Subject: [PATCH 290/348] Duplicate Lines --- .../CGAL/global_functions_spherical_kernel_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/global_functions_spherical_kernel_3.h b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/global_functions_spherical_kernel_3.h index b135dee42e22..3298cfac4c75 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/global_functions_spherical_kernel_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/global_functions_spherical_kernel_3.h @@ -25,7 +25,7 @@ Compares the \f$ \theta\f$-coordinates of `p` and `q` relatively to `sphere`. \sa \link compare_x_grp `CGAL::compare_x()` \endlink \sa \link compare_xy_grp `CGAL::compare_xy()` \endlink -\sa \link compare_xy_grp `CGAL::compare_xy()` \endlink +\sa \link compare_xy_grp `CGAL::compare_xyz()` \endlink \sa \link compare_x_at_y_grp `CGAL::compare_x_at_y()` \endlink \sa \link compare_y_grp `CGAL::compare_y()` \endlink \sa \link compare_yx_grp `CGAL::compare_yx()` \endlink From 7b958fb8f8536196bbae76cf588ba28b29c9cf25 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 16:52:11 +0200 Subject: [PATCH 291/348] Update Circular_kernel_3/doc/Circular_kernel_3/CGAL/global_functions_spherical_kernel_3.h Co-authored-by: Laurent Rineau --- .../CGAL/global_functions_spherical_kernel_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/global_functions_spherical_kernel_3.h b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/global_functions_spherical_kernel_3.h index 3298cfac4c75..2ed00af62f6d 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/global_functions_spherical_kernel_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/global_functions_spherical_kernel_3.h @@ -25,7 +25,7 @@ Compares the \f$ \theta\f$-coordinates of `p` and `q` relatively to `sphere`. \sa \link compare_x_grp `CGAL::compare_x()` \endlink \sa \link compare_xy_grp `CGAL::compare_xy()` \endlink -\sa \link compare_xy_grp `CGAL::compare_xyz()` \endlink +\sa \link compare_xyz_grp `CGAL::compare_xyz()` \endlink \sa \link compare_x_at_y_grp `CGAL::compare_x_at_y()` \endlink \sa \link compare_y_grp `CGAL::compare_y()` \endlink \sa \link compare_yx_grp `CGAL::compare_yx()` \endlink From a7ff1c0c79a518e8a32b7c855997cabe4c4299e0 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 16:16:04 +0100 Subject: [PATCH 292/348] Add one permution. In fact it should be any mix of types in any order --- Kernel_23/test/Kernel_23/include/CGAL/_test_new_2.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Kernel_23/test/Kernel_23/include/CGAL/_test_new_2.h b/Kernel_23/test/Kernel_23/include/CGAL/_test_new_2.h index 367be24d3226..d707b4bf9f55 100644 --- a/Kernel_23/test/Kernel_23/include/CGAL/_test_new_2.h +++ b/Kernel_23/test/Kernel_23/include/CGAL/_test_new_2.h @@ -490,7 +490,7 @@ test_new_2(const R& rep) typename R::Compare_squared_distance_2 compare_sq_dist = rep.compare_squared_distance_2_object(); - tmp34ab = compare_sq_dist(p1,p2,FT(1)); + tmp34ab = compare_sq_dist(p1, p2, FT(1)); tmp34ab = compare_sq_dist(p1, l2, FT(1)); tmp34ab = compare_sq_dist(p2, p1, FT(1)); tmp34ab = compare_sq_dist(l1, l2, FT(1)); @@ -500,7 +500,7 @@ test_new_2(const R& rep) tmp34ab = compare_sq_dist(t2, l1, FT(1)); tmp34ab = CGAL::compare_distance(t2, l1, s1, p1); - tmp34ab = CGAL::compare_distance(t2, l1, s1, p1); + tmp34ab = CGAL::compare_distance(t2, l1, p1, s1); tmp34ab = CGAL::compare_distance(t2, l1, s1); typename R::Compare_power_distance_2 compare_power_dist From 08f1bc37d44cf7e3d55a9807b48d58c26edb1427 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 16:26:11 +0100 Subject: [PATCH 293/348] test line and opposite line --- Intersections_2/test/Intersections_2/test_intersections_2.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Intersections_2/test/Intersections_2/test_intersections_2.cpp b/Intersections_2/test/Intersections_2/test_intersections_2.cpp index c86e91915394..8219881120dc 100644 --- a/Intersections_2/test/Intersections_2/test_intersections_2.cpp +++ b/Intersections_2/test/Intersections_2/test_intersections_2.cpp @@ -537,7 +537,7 @@ struct Test // point intersection check_intersection (S(p( 0, -1), p( 10, 0)), R(p( 2, 1), p( 8, -6)), P(3.42105, -0.657895)); check_intersection (S(p( 0, 0), p( 10, 0)), R(p( 1, 6), p( 1, -3)), P(1, 0)); - check_intersection (S(p( 0, 0), p( 10, 0)), R(p( 1, 6), p( 1, -3)), P(1, 0)); + check_intersection (S(p( 0, 0), p( 10, 0)), R(p( 1, -3), p( 1, 6)), P(1, 0)); check_intersection (S(p( 0, 0), p( 10, 0)), R(p( 0, 0), p(-10, 4)), P(0, 0)); // start of ray is exactly on the segment check_intersection (S(p( 0, 0), p( 10, 0)), R(p( 4, 0), p(-10, 4)), P(4, 0)); // start of ray is a segment extremity @@ -757,7 +757,7 @@ struct Test // segment intersection check_intersection (L(p( 18, 6), p( 0, 0)), Rec(p( 2, 0), p(6, 3))); - check_intersection (L(p( 18, 6), p( 0, 0)), Rec(p( 2, 0), p(6, 3))); + check_intersection (L(p( 0, 0), p( 18, 6)), Rec(p( 2, 0), p(6, 3))); check_intersection (L(p( 2, 14), p( 2, -14)), Rec(p( 2, 0), p(6, 3))); check_intersection (L(p( 6, 1), p( 6, 2)), Rec(p( 2, 0), p(6, 3))); check_intersection (L(p(-1, 3), p(-2, 3)), Rec(p( 2, 0), p(6, 3))); From 7572aee9ae2487ac090a3290d7449fd058364d72 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 16:36:13 +0100 Subject: [PATCH 294/348] Cartesian -> SimpleCartesian plus accidentally WS --- .../benchmark/data/benchArrSegments.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Arrangement_on_surface_2/benchmark/data/benchArrSegments.xml b/Arrangement_on_surface_2/benchmark/data/benchArrSegments.xml index 994b9ca30dcf..67109e375a06 100644 --- a/Arrangement_on_surface_2/benchmark/data/benchArrSegments.xml +++ b/Arrangement_on_surface_2/benchmark/data/benchArrSegments.xml @@ -24,18 +24,18 @@ - + - + - - - - - - + + + + + + @@ -150,7 +150,7 @@ - + From d0e2be831915e406956f8574ed4a6927d23c88a4 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 16:48:58 +0100 Subject: [PATCH 295/348] Remove duplicate which was a workaround for cmake 2.6 to see if it is still a problem --- Installation/cmake/modules/CGAL_Macros.cmake | 2 -- 1 file changed, 2 deletions(-) diff --git a/Installation/cmake/modules/CGAL_Macros.cmake b/Installation/cmake/modules/CGAL_Macros.cmake index 7ded524d97ca..596bc592a157 100644 --- a/Installation/cmake/modules/CGAL_Macros.cmake +++ b/Installation/cmake/modules/CGAL_Macros.cmake @@ -16,12 +16,10 @@ if( NOT CGAL_MACROS_FILE_INCLUDED ) macro( cache_set var ) set ( ${var} ${ARGN} CACHE INTERNAL "" ) - set ( ${var} ${ARGN} CACHE INTERNAL "" ) endmacro() macro( typed_cache_set type doc var ) set ( ${var} ${ARGN} CACHE ${type} ${doc} FORCE ) - set ( ${var} ${ARGN} CACHE ${type} ${doc} FORCE ) endmacro() macro( cache_get var ) From 2e4cff15866346d062c049759336c526f46b0c2b Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 17:17:26 +0100 Subject: [PATCH 296/348] Change _check_pt_arcno_and_coprimality(q, -1, c); --- .../include/CGAL/Curved_kernel_via_analysis_2/Arc_2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Arc_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Arc_2.h index 86b8f15ece7a..0ae8728f90b0 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Arc_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Arc_2.h @@ -571,7 +571,7 @@ class Arc_2 : compare_xy_2_object()(p, q, true) != CGAL::EQUAL); // check coprimality condition for supporting curves _check_pt_arcno_and_coprimality(p, -1, c); - _check_pt_arcno_and_coprimality(p, -1, c); + _check_pt_arcno_and_coprimality(q, -1, c); _fix_curve_ends_order(); } From 837f53e7b9d642b52a8306288f52a25e89d22400 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Oct 2024 17:19:25 +0100 Subject: [PATCH 297/348] Test with pgn_with_holes2 --- .../test/Boolean_set_operations_2/test_compilation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Boolean_set_operations_2/test/Boolean_set_operations_2/test_compilation.cpp b/Boolean_set_operations_2/test/Boolean_set_operations_2/test_compilation.cpp index 0707a56039a9..38b40217451b 100644 --- a/Boolean_set_operations_2/test/Boolean_set_operations_2/test_compilation.cpp +++ b/Boolean_set_operations_2/test/Boolean_set_operations_2/test_compilation.cpp @@ -234,7 +234,7 @@ void test() gps.oriented_side(pt); gps.oriented_side(pgn1); gps.oriented_side(pgn_with_holes1); - gps.oriented_side(pgn_with_holes1); + gps.oriented_side(pgn_with_holes2); gps.oriented_side(gps); gps.locate(pt, pgn_with_holes1); From 4bde1e658e6827589f0dc473718f82f5dfd42e4c Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 10 Oct 2024 07:39:00 +0100 Subject: [PATCH 298/348] missing ) --- Lab/demo/Lab/Plugins/Classification/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt b/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt index ab5190aac749..a048c4f7eb1b 100644 --- a/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt @@ -4,7 +4,7 @@ if(TARGET CGAL::Eigen3_support) find_package(Boost QUIET OPTIONAL_COMPONENTS serialization iostreams) - if(NOT TARGET Boost::serialization OR NOT TARGET Boost::iostreams + if(NOT TARGET Boost::serialization OR NOT TARGET Boost::iostreams) message(STATUS "NOTICE: Boost IO Streams and/or Serialization not found, reading deprecated Classification config files won't be possible.") endif() From ec895d6924ce82327b795a23ce6f4ad80c4cdaca Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 10 Oct 2024 09:27:15 +0100 Subject: [PATCH 299/348] Simplified CMakeLists of Point_set_processing @soesau please check --- .../Point_set_processing_3/CMakeLists.txt | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) 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 85e72510b3b5..e4e4c9962fe0 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 @@ -22,13 +22,9 @@ endif() # Activate concurrency? option(CGAL_ACTIVATE_CONCURRENT_PSP3 "Enable concurrency" OFF) -set(CGAL_libs CGAL::CGAL) if(CGAL_ACTIVATE_CONCURRENT_PSP3 OR "$ENV{CGAL_ACTIVATE_CONCURRENT_PSP3}") find_package(TBB REQUIRED) include(CGAL_TBB_support) - if(TARGET CGAL::TBB_support) - set(CGAL_TBB_target ${CGAL_libs} CGAL::TBB_support) - endif() endif() # Executables that do *not* require EIGEN @@ -48,7 +44,7 @@ foreach( read_ply_points_with_colors_example write_ply_points_example) create_single_source_cgal_program("${target}.cpp") - target_link_libraries(${target} PRIVATE ${CGAL_libs}) + target_link_libraries(${target} PRIVATE CGAL::CGAL) endforeach() #disable if MSVC 2017 @@ -58,8 +54,8 @@ if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910 if (TARGET CGAL::LASLIB_support) create_single_source_cgal_program("read_las_example.cpp") create_single_source_cgal_program("write_las_example.cpp") - target_link_libraries(read_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support) - target_link_libraries(write_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support) + target_link_libraries(read_las_example PRIVATE CGAL::CGAL CGAL::LASLIB_support) + target_link_libraries(write_las_example PRIVATE CGAL::CGAL CGAL::LASLIB_support) target_compile_definitions(read_las_example PRIVATE -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS) target_compile_definitions(write_las_example PRIVATE -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS) @@ -75,8 +71,6 @@ endif() find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) - set(CGAL_libs ${CGAL_libs} CGAL::Eigen3_support) - # Executables that require Eigen foreach( target @@ -90,11 +84,11 @@ if(TARGET CGAL::Eigen3_support) hierarchy_simplification_example normals_example) create_single_source_cgal_program("${target}.cpp") - target_link_libraries(${target} PRIVATE ${CGAL_libs}) + target_link_libraries(${target} PRIVATE CGAL::CGAL CGAL::Eigen3_support) endforeach() if (TARGET CGAL::Eigen3_support AND TARGET CGAL::LASLIB_support) create_single_source_cgal_program( "orient_scanlines_example.cpp" ) - target_link_libraries(orient_scanlines_example PRIVATE ${CGAL_libs} + target_link_libraries(orient_scanlines_example PRIVATE CGAL::CGAL CGAL::Eigen3_support CGAL::LASLIB_support) endif() @@ -103,7 +97,7 @@ if(TARGET CGAL::Eigen3_support) include(CGAL_pointmatcher_support) if(TARGET CGAL::pointmatcher_support) create_single_source_cgal_program("registration_with_pointmatcher.cpp") - target_link_libraries(registration_with_pointmatcher PRIVATE ${CGAL_libs} + target_link_libraries(registration_with_pointmatcher PRIVATE CGAL::CGAL CGAL::Eigen3_support CGAL::pointmatcher_support) else() message(STATUS "NOTICE: registration with pointmatcher requires libpointmatcher and will not be compiled.") @@ -121,7 +115,7 @@ if(TARGET CGAL::Eigen3_support) if(TARGET CGAL::OpenGR_support) create_single_source_cgal_program("registration_with_OpenGR.cpp") - target_link_libraries(registration_with_OpenGR PRIVATE ${CGAL_libs} + target_link_libraries(registration_with_OpenGR PRIVATE CGAL::CGAL CGAL::Eigen3_support CGAL::OpenGR_support) else() message(STATUS "NOTICE: registration_with_OpenGR requires OpenGR, and will not be compiled.") @@ -132,7 +126,7 @@ if(TARGET CGAL::Eigen3_support) TARGET CGAL::OpenGR_support) create_single_source_cgal_program("registration_with_opengr_pointmatcher_pipeline.cpp") target_link_libraries( - registration_with_opengr_pointmatcher_pipeline PRIVATE ${CGAL_libs} + registration_with_opengr_pointmatcher_pipeline PRIVATE CGAL::CGAL CGAL::Eigen3_support CGAL::pointmatcher_support CGAL::OpenGR_support) else() message(STATUS "NOTICE: registration with OpenGR and pointmatcher requires both libpointmatcher and OpenGR, and will not be compiled.") From 90e52d68f29068807585781921cfdee93fbb19d0 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Thu, 10 Oct 2024 12:56:54 +0200 Subject: [PATCH 300/348] documented that RegionType::Item and NeighborQuery::Item need to be hashable removed internal from example --- .../doc/Shape_detection/Concepts/NeighborQuery.h | 2 +- .../doc/Shape_detection/Concepts/RegionType.h | 2 +- .../region_growing_with_custom_classes.cpp | 9 ++++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h b/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h index 5495e5d0c9a9..ed56b4bd8ea0 100644 --- a/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h +++ b/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h @@ -15,7 +15,7 @@ class NeighborQuery { public: - /// The reference type to the elements of the input range, e.g., a const_iterator of the input range. + /// The reference type to the elements of the input range, e.g., a const_iterator of the input range. Must be a model of `Hashable`. typedef unspecified_type Item; /*! diff --git a/Shape_detection/doc/Shape_detection/Concepts/RegionType.h b/Shape_detection/doc/Shape_detection/Concepts/RegionType.h index f1366dc8aba6..b178993f8839 100644 --- a/Shape_detection/doc/Shape_detection/Concepts/RegionType.h +++ b/Shape_detection/doc/Shape_detection/Concepts/RegionType.h @@ -23,7 +23,7 @@ class RegionType { /// The parameters of the primitive covering the region. typedef unspecified_type Primitive; - /// The reference type to the elements of the input range, e.g., a const_iterator of the input range. + /// The reference type to the elements of the input range, e.g., a const_iterator of the input range. Must be a model of `Hashable`. typedef unspecified_type Item; // The region types is defined by a vector of Items. diff --git a/Shape_detection/examples/Shape_detection/region_growing_with_custom_classes.cpp b/Shape_detection/examples/Shape_detection/region_growing_with_custom_classes.cpp index a1d32efa020f..f7058906cfeb 100644 --- a/Shape_detection/examples/Shape_detection/region_growing_with_custom_classes.cpp +++ b/Shape_detection/examples/Shape_detection/region_growing_with_custom_classes.cpp @@ -69,7 +69,14 @@ namespace Custom { using Item = std::vector::const_iterator; using Region = std::vector; - using Region_unordered_map = std::unordered_map >; + struct hash_item { + std::size_t operator()(Item i) const { + using boost::hash_value; + return boost::hash_value(i.operator->()); + } + }; + + using Region_unordered_map = std::unordered_map; using Region_index_map = boost::associative_property_map; Region_index_map region_index_map() { From 133934f7b617a8b22af52a9c5bf3183ef0742e91 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 10 Oct 2024 13:19:23 +0100 Subject: [PATCH 301/348] Use --- .../examples/Straight_skeleton_2/include/CGAL/input_helpers.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h b/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h index ad41ff7a91f7..d459b60127c7 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h @@ -19,6 +19,7 @@ #include #include #include +#include template bool read_dat_polygon(const char* filename, @@ -36,7 +37,7 @@ bool read_dat_polygon(const char* filename, } bool is_number_of_CC_in_input = false; - if(CGAL::IO::internal::get_file_extension(filename) == "poly") + if(std::filesystem::path(filename).extension().string() == ".poly") { is_number_of_CC_in_input = true; } From 1d6b81d0150f5ae3e83b7afaef10d539780c1157 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 10 Oct 2024 13:20:54 +0100 Subject: [PATCH 302/348] cleanup in Polygon_repair/test --- .../Polygon_repair/repair_polygon_2_test.cpp | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/Polygon_repair/test/Polygon_repair/repair_polygon_2_test.cpp b/Polygon_repair/test/Polygon_repair/repair_polygon_2_test.cpp index 1f7e022becf0..b1293cebe8a9 100644 --- a/Polygon_repair/test/Polygon_repair/repair_polygon_2_test.cpp +++ b/Polygon_repair/test/Polygon_repair/repair_polygon_2_test.cpp @@ -4,18 +4,8 @@ #include -// work around for old compilers (Apple clang < 11 for example) -#define HAS_FILESYSTEM 1 -#if defined(__has_include) -#if !__has_include() -#undef HAS_FILESYSTEM -#define HAS_FILESYSTEM 0 -#endif -#endif -#if HAS_FILESYSTEM - #include #include #include @@ -94,12 +84,3 @@ int main() { return 0; } -#else - -int main() -{ - std::cout << "Warning: filesystem feature is not present on the system, nothing will be tested\n"; - return 0; -} - -#endif From 1c50e0bedeaa12100be6f7383b2ec81afdeabd66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 10 Oct 2024 14:21:34 +0200 Subject: [PATCH 303/348] Mac OS X cleaning --- .gitattributes | 1 - .gitignore | 2 +- .../doc/Documentation/Third_party.txt | 2 +- Installation/cmake/modules/FindCORE.cmake | 4 +- Installation/cmake/modules/FindGMP.cmake | 2 - Installation/cmake/modules/FindGMPXX.cmake | 2 - Installation/cmake/modules/FindMPFR.cmake | 2 - Installation/include/CGAL/config.h | 14 --- MacOSX/auxiliary/cgal_app.icns | Bin 418952 -> 0 bytes MacOSX/package_info/MacOSX/copyright | 1 - MacOSX/package_info/MacOSX/description.txt | 3 - MacOSX/package_info/MacOSX/maintainer | 1 - MacOSX/scripts/cgal_make_macosx_app | 102 ------------------ Profiling_tools/include/CGAL/Memory_sizer.h | 2 +- .../developer_scripts/create_macosx_installer | 78 -------------- copyright | 1 - 16 files changed, 4 insertions(+), 213 deletions(-) delete mode 100644 MacOSX/auxiliary/cgal_app.icns delete mode 100644 MacOSX/package_info/MacOSX/copyright delete mode 100644 MacOSX/package_info/MacOSX/description.txt delete mode 100644 MacOSX/package_info/MacOSX/maintainer delete mode 100755 MacOSX/scripts/cgal_make_macosx_app delete mode 100755 Scripts/developer_scripts/create_macosx_installer diff --git a/.gitattributes b/.gitattributes index 38320ad4f0b1..4211b302eb19 100644 --- a/.gitattributes +++ b/.gitattributes @@ -58,7 +58,6 @@ Scripts/developer_scripts/check_svn_keywords text eol=lf Scripts/developer_scripts/create_cgal_test text eol=lf Scripts/developer_scripts/create_cgal_test_with_cmake text eol=lf Scripts/developer_scripts/create_internal_release text eol=lf -Scripts/developer_scripts/create_macosx_installer text eol=lf Scripts/developer_scripts/create_new_release text eol=lf Scripts/developer_scripts/detect_files_with_mixed_eol_styles text eol=lf Scripts/developer_scripts/detect_packages_licenses text eol=lf diff --git a/.gitignore b/.gitignore index 90f003227c6f..b6fe952fd56b 100644 --- a/.gitignore +++ b/.gitignore @@ -1058,7 +1058,7 @@ cmake_install.cmake *~ .#* -# MacOS file https://en.wikipedia.org/wiki/.DS_Store +# macOS file https://en.wikipedia.org/wiki/.DS_Store .DS_Store # Binaries: diff --git a/Documentation/doc/Documentation/Third_party.txt b/Documentation/doc/Documentation/Third_party.txt index 0a47a9f2dd60..f94711ba8d20 100644 --- a/Documentation/doc/Documentation/Third_party.txt +++ b/Documentation/doc/Documentation/Third_party.txt @@ -15,7 +15,7 @@ supporting C++17 or later. | | `Clang` \cgalFootnote{\cgalFootnoteCode{https://clang.llvm.org/}} compiler version 15.0.7 | | \ms Windows | \gnu `g++` 11.4.0 or later\cgalFootnote{\cgalFootnoteCode{https://gcc.gnu.org/}} | | | \ms Visual `C++` 15.9, 16.10, 17.0 (\visualstudio 2017, 2019, and 2022)\cgalFootnote{\cgalFootnoteCode{https://visualstudio.microsoft.com/}} | -| MacOS X | \gnu `g++` 11.4.0 or later\cgalFootnote{\cgalFootnoteCode{https://gcc.gnu.org/}} | +| macOS | \gnu `g++` 11.4.0 or later\cgalFootnote{\cgalFootnoteCode{https://gcc.gnu.org/}} | | | Apple `Clang` compiler versions 10.0.1, 12.0.5, and 15.0.0 | diff --git a/Installation/cmake/modules/FindCORE.cmake b/Installation/cmake/modules/FindCORE.cmake index 6effa1d5e520..adb2ad05f15f 100644 --- a/Installation/cmake/modules/FindCORE.cmake +++ b/Installation/cmake/modules/FindCORE.cmake @@ -3,8 +3,6 @@ # CORE_INCLUDE_DIR - the CORE include directory # CORE_LIBRARIES - Libraries needed to use CORE -# TODO: support Windows and MacOSX - # CORE needs GMP include(FindPackageHandleStandardArgs) @@ -17,7 +15,7 @@ if(GMP_FOUND) find_path(CORE_INCLUDE_DIR NAMES CORE.h DOC "The directory containing the CORE include files") find_library(CORE_LIBRARIES NAMES core++ DOC "Path to the core++ library") - + get_filename_component(CORE_LIBRARIES_DIR ${CORE_LIBRARIES} PATH) FIND_PACKAGE_HANDLE_STANDARD_ARGS(CORE "DEFAULT_MSG" CORE_LIBRARIES CORE_INCLUDE_DIR ) diff --git a/Installation/cmake/modules/FindGMP.cmake b/Installation/cmake/modules/FindGMP.cmake index f452c0287f7e..38108f3420a1 100644 --- a/Installation/cmake/modules/FindGMP.cmake +++ b/Installation/cmake/modules/FindGMP.cmake @@ -5,8 +5,6 @@ # GMP_LIBRARIES_DIR - directory where the GMP libraries are located # GMP_LIBRARIES - Link these to use GMP -# TODO: support MacOSX - include(FindPackageHandleStandardArgs) include(${CMAKE_CURRENT_LIST_DIR}/CGAL_GeneratorSpecificSettings.cmake) diff --git a/Installation/cmake/modules/FindGMPXX.cmake b/Installation/cmake/modules/FindGMPXX.cmake index 277e4b19ef19..ce05fd703462 100644 --- a/Installation/cmake/modules/FindGMPXX.cmake +++ b/Installation/cmake/modules/FindGMPXX.cmake @@ -4,8 +4,6 @@ # GMPXX_INCLUDE_DIR - the GMPXX include directory # GMPXX_LIBRARIES - Libraries needed to use GMPXX -# TODO: support Windows and MacOSX - # GMPXX needs GMP find_package( GMP QUIET ) diff --git a/Installation/cmake/modules/FindMPFR.cmake b/Installation/cmake/modules/FindMPFR.cmake index 4d1bc43553d8..b0507120ce05 100644 --- a/Installation/cmake/modules/FindMPFR.cmake +++ b/Installation/cmake/modules/FindMPFR.cmake @@ -4,8 +4,6 @@ # MPFR_LIBRARIES_DIR - Directory where the MPFR libraries are located # MPFR_LIBRARIES - the MPFR libraries -# TODO: support MacOSX - include(FindPackageHandleStandardArgs) include(${CMAKE_CURRENT_LIST_DIR}/CGAL_GeneratorSpecificSettings.cmake) diff --git a/Installation/include/CGAL/config.h b/Installation/include/CGAL/config.h index bd5dafbf0171..3506137af1a4 100644 --- a/Installation/include/CGAL/config.h +++ b/Installation/include/CGAL/config.h @@ -243,20 +243,6 @@ # define CGAL_SUNPRO_INITIALIZE(C) #endif -//----------------------------------------------------------------------// -// MacOSX specific. -//----------------------------------------------------------------------// - -#ifdef __APPLE__ -# if defined(__GNUG__) && (__GNUG__ == 4) && (__GNUC_MINOR__ == 0) \ - && defined(__OPTIMIZE__) && !defined(CGAL_NO_WARNING_FOR_MACOSX_GCC_4_0_BUG) -# warning "Your configuration may exhibit run-time errors in CGAL code" -# warning "This appears with g++ 4.0 on MacOSX when optimizing" -# warning "You can disable this warning using -DCGAL_NO_WARNING_FOR_MACOSX_GCC_4_0_BUG" -# warning "For more information, see https://www.cgal.org/FAQ.html#mac_optimization_bug" -# endif -#endif - //-------------------------------------------------------------------// // When the global min and max are no longer defined (as macros) // because of NOMINMAX flag definition, we define our own global diff --git a/MacOSX/auxiliary/cgal_app.icns b/MacOSX/auxiliary/cgal_app.icns deleted file mode 100644 index 19cc33fadb1572b59654b760a69232fd7e5e5137..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 418952 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%0D9WfNse0x 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
    e_>Z2 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 diff --git a/MacOSX/scripts/cgal_make_macosx_app b/MacOSX/scripts/cgal_make_macosx_app deleted file mode 100755 index 045cec21c0a2..000000000000 --- a/MacOSX/scripts/cgal_make_macosx_app +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/sh - -# Copyright (c) 2005,2006,2013 -# Foundation for Research and Technology-Hellas (Greece). -# 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; 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-or-later OR LicenseRef-Commercial -# -# Authors: Herve Bronnimann -# Menelaos Karavelas -# Eric Berberich - -# This script creates the appropriate directory structure so that a CGAL -# Qt demo can be run on MacOSX - -usage() -{ - echo "Usage: cgal_make_macosx_app executable" -} - - -case $# in - 0) usage - exit 1 -esac - - -for i do - if [ -x "$i" ] ; then - EXECUTABLE=$i - else - usage - exit 1 - fi -done - -if [ -z "$EXECUTABLE.app" ] ; then - mkdir $EXECUTABLE.app -fi - -test -d $EXECUTABLE.app/Contents/MacOS/ || mkdir -p $EXECUTABLE.app/Contents/MacOS/ -strip $EXECUTABLE -cp $EXECUTABLE $EXECUTABLE.app/Contents/MacOS/$EXECUTABLE - -rm -f $EXECUTABLE.app/Contents/PkgInfo -echo "APPL????" > $EXECUTABLE.app/Contents/PkgInfo - -rm -f $EXECUTABLE.app/Contents/Info.plist -cat > $EXECUTABLE.app/Contents/Info.plist < - - - - CFBundleIconFile - cgal_app.icns - CFBundlePackageType - APPL - CFBundleGetInfoString - Created by CGAL - CFBundleSignature - ttxt - CFBundleExecutable - $EXECUTABLE -ENDINFO - -if [ -d "help" ] ; then -cat >> $EXECUTABLE.app/Contents/Info.plist <CFBundleHelpBookFolder - Help - CFBundleHelpBookName - Help -ENDINFO - test -d $EXECUTABLE.app/Contents/Resources/Help || mkdir -p $EXECUTABLE.app/Contents/Resources/Help - cp -r help/* $EXECUTABLE.app/Contents/Resources/Help - ln -s index.html $EXECUTABLE.app/Contents/Resources/Help/Help.html -fi - -cat >> $EXECUTABLE.app/Contents/Info.plist <NOTE - This file was generated by CGAL/scripts/cgal_make_macosx_app. - - -ENDINFO - -test -d $EXECUTABLE.app/Contents/Resources || mkdir -p $EXECUTABLE.app/Contents/Resources -DIR=$( cd "$( dirname "$0" )" && pwd ) -cp $DIR/../auxiliary/cgal_app.icns $EXECUTABLE.app/Contents/Resources -echo "created $EXECUTABLE.app ..." diff --git a/Profiling_tools/include/CGAL/Memory_sizer.h b/Profiling_tools/include/CGAL/Memory_sizer.h index 6d0551ef7f90..b7106f412e23 100644 --- a/Profiling_tools/include/CGAL/Memory_sizer.h +++ b/Profiling_tools/include/CGAL/Memory_sizer.h @@ -15,7 +15,7 @@ #include #include -// This has only been implemented for MacOSX/Darwin, Linux and VC++ for now. +// This has only been implemented for macOS/Darwin, Linux and VC++ for now. #if !defined _MSC_VER && !defined __linux__ && !defined __APPLE__ #include diff --git a/Scripts/developer_scripts/create_macosx_installer b/Scripts/developer_scripts/create_macosx_installer deleted file mode 100755 index 1fcdc60e1c93..000000000000 --- a/Scripts/developer_scripts/create_macosx_installer +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/tcsh -# -# create the MacOSX CGAL disk image and package -# -# For releases 3.2 and on -# -# The script assumes that the current directory is the MacOSX_Installer -# directory of the Maintenance package -# -# Author(s): Menelaos Karavelas, 2006 - -# Modify the following lines according to your release and configuration - -# modify the following line for your release -setenv CGALVER $2 - -# modify the following line to reflect the size of the disk image you -# want to create -setenv VOLSIZE 7m - -# modify the following lines if the MacOSX applications reside at different -# paths than the ones shown below -setenv HDIUTIL /usr/bin/hdiutil -setenv PACKAGEMAKERAPP /Developer/Applications/Utilities/PackageMaker.app -setenv PACKAGEMAKER ${PACKAGEMAKERAPP}/Contents/MacOS/PackageMaker - -# this is the directory where the script temporarily puts files -setenv TMP_ROOT /tmp/MacOSX_Installer - -####### DO NOT TOUCH ANYTHING BEYIND THIS POINT ####### -setenv CUR_DIR `pwd` -setenv VOLNAME CGAL-${CGALVER} - -# cleanup files that should not be there -rm -f ${VOLNAME}.dmg -rm -fr ${TMP_ROOT} - -# create a copy of the CGAL package structure -mkdir -p ${TMP_ROOT} -cp -rp Package_root ${TMP_ROOT} -cp -rp Resources ${TMP_ROOT} -cp -rp CGAL-absolute.pmproj ${TMP_ROOT} -cd ${TMP_ROOT} - -# copy the CGAL tarball at its correct place and uncompress it -cp -p $1 Package_root -cd Package_root -tar xvfz CGAL-${CGALVER}.tar.gz -rm -f CGAL-${CGALVER}.tar.gz - -# now the building phase starts -cd .. - -# build the package -${PACKAGEMAKER} -build -ds -proj CGAL-absolute.pmproj -p CGAL.pkg -v - -# create the disk image -${HDIUTIL} create -ov -size ${VOLSIZE} -fs HFS+ -type UDIF -volname ${VOLNAME} CGAL-tmp.dmg - -# mount the disk image -${HDIUTIL} attach CGAL-tmp.dmg - -# move the CGAL package to the disk image -mv CGAL.pkg /Volumes/${VOLNAME} - -# unmount the disk image -${HDIUTIL} detach /Volumes/${VOLNAME} - -# convert the disk image to a read-only one -${HDIUTIL} convert -ov CGAL-tmp.dmg -format UDRO -o CGAL-RO.dmg -rm -f CGAL-tmp.dmg - -# copy the converted disk image to the original directory -cp -p CGAL-RO.dmg ${CUR_DIR}/${VOLNAME}.dmg - -# cleanup temporary files -rm -fr ${TMP_ROOT} - diff --git a/copyright b/copyright index b32d3a58fc8a..79f539285786 100644 --- a/copyright +++ b/copyright @@ -69,7 +69,6 @@ R = RU Groningen LEDA ETIMU Largest_empty_rect_2 T Linear_cell_complex CNRS - MacOSX F Maintenance ETIMUG Manual ETIMU Manual_tools EIM, Modena Software, Silicon Graphics From 98d649fe8bfebf7d00d0a8048975d4fc1dfe485e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 10 Oct 2024 13:25:36 +0100 Subject: [PATCH 304/348] And another one --- .../Straight_skeleton_2/include/CGAL/input_helpers.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h b/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h index d459b60127c7..f4e3e7507a38 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h @@ -13,7 +13,6 @@ #include #include #include -#include #include #include @@ -110,8 +109,8 @@ template bool read_input_polygon(const char* filename, PolygonWithHoles& p) { - std::string ext = CGAL::IO::internal::get_file_extension(filename); - if(ext == "dat") + std::string ext = std::filesystem::path(filename).extension().string(); + if(ext == ".dat") { return read_dat_polygon(filename, p); } From 9edf6eadc7a93ef451b184d0b2cc3355fcec9412 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 10 Oct 2024 13:35:15 +0100 Subject: [PATCH 305/348] Cleanup in Shape_detection --- .../test/Shape_detection/CMakeLists.txt | 16 +--- .../test_validity_sampled_data.cpp | 79 ------------------- 2 files changed, 3 insertions(+), 92 deletions(-) diff --git a/Shape_detection/test/Shape_detection/CMakeLists.txt b/Shape_detection/test/Shape_detection/CMakeLists.txt index 2f4245f2f762..503af515ccfa 100644 --- a/Shape_detection/test/Shape_detection/CMakeLists.txt +++ b/Shape_detection/test/Shape_detection/CMakeLists.txt @@ -49,19 +49,9 @@ if(TARGET CGAL::Eigen3_support) endforeach() set(RANSAC_PROTO_DIR CACHE PATH "") - if(NOT RANSAC_PROTO_DIR STREQUAL "") - add_compile_definitions(-DPOINTSWITHINDEX -DCGAL_TEST_RANSAC_PROTOTYPE) - include_directories(${RANSAC_PROTO_DIR}) - include_directories(${RANSAC_PROTO_DIR}/MiscLib/) - file(GLOB proto_src "${RANSAC_PROTO_DIR}/*.cpp") - file(GLOB proto_misc_src "${RANSAC_PROTO_DIR}/MiscLib/*.cpp") - add_library(libproto STATIC ${proto_src} ${proto_misc_src}) - add_executable(test_validity_sampled_data "test_validity_sampled_data.cpp") - target_link_libraries(test_validity_sampled_data libproto CGAL::CGAL CGAL::Data CGAL::Eigen3_support) - else() - add_executable(test_validity_sampled_data "test_validity_sampled_data.cpp") - target_link_libraries(test_validity_sampled_data CGAL::CGAL CGAL::Data CGAL::Eigen3_support) - endif() + + add_executable(test_validity_sampled_data "test_validity_sampled_data.cpp") + target_link_libraries(test_validity_sampled_data CGAL::CGAL CGAL::Data CGAL::Eigen3_support) cgal_add_test(test_validity_sampled_data) else() message(STATUS "NOTICE: Some tests require Eigen 3.1 (or greater), and will not be compiled.") diff --git a/Shape_detection/test/Shape_detection/test_validity_sampled_data.cpp b/Shape_detection/test/Shape_detection/test_validity_sampled_data.cpp index 8e073a0750a6..6381eda2f673 100644 --- a/Shape_detection/test/Shape_detection/test_validity_sampled_data.cpp +++ b/Shape_detection/test/Shape_detection/test_validity_sampled_data.cpp @@ -4,12 +4,6 @@ #include #include -#ifdef CGAL_TEST_RANSAC_PROTOTYPE -#include -#include -#include -#include -#endif #include #include @@ -179,78 +173,5 @@ void test_copied_point_cloud (const Point_set& original_points, std::size_t nb) // RANSAC should detect at least 75% of shapes. assert (detected_ransac[detected_ransac.size() / 2] > std::size_t(0.75 * ground_truth)); -#ifdef CGAL_TEST_RANSAC_PROTOTYPE - { - CGAL::Real_timer timer; - double timeout = 120.; // 2 minutes timeout - timer.start(); - std::size_t nb_runs = 500; - std::vector detected_ransac; - std::vector times_ransac; - for (std::size_t run = 0; run < nb_runs; ++ run) - { - PointCloud proto_points; - proto_points.reserve (points.size()); - - Point Pt; - for (std::size_t i = 0; i < points.size(); ++i) - { - Pt.pos[0] = static_cast(points[i].first.x()); - Pt.pos[1] = static_cast(points[i].first.y()); - Pt.pos[2] = static_cast(points[i].first.z()); - Pt.normal[0] = static_cast(points[i].second.x()); - Pt.normal[1] = static_cast(points[i].second.y()); - Pt.normal[2] = static_cast(points[i].second.z()); -#ifdef POINTSWITHINDEX - Pt.index = i; -#endif - proto_points.push_back(Pt); - } - - // Manually set bounding box! - Vec3f cbbMin, cbbMax; - cbbMin[0] = static_cast(bbox.xmin()); - cbbMin[1] = static_cast(bbox.ymin()); - cbbMin[2] = static_cast(bbox.zmin()); - cbbMax[0] = static_cast(bbox.xmax()); - cbbMax[1] = static_cast(bbox.ymax()); - cbbMax[2] = static_cast(bbox.zmax()); - proto_points.setBBox(cbbMin, cbbMax); - - // Sets parameters for shape detection. - RansacShapeDetector::Options options; - options.m_epsilon = parameters.epsilon; - options.m_bitmapEpsilon = parameters.cluster_epsilon; - options.m_normalThresh = parameters.normal_threshold; - options.m_probability = parameters.probability; - options.m_minSupport = parameters.min_points; - - CGAL::Real_timer t; - t.start(); - RansacShapeDetector ransac (options); // the detector object - ransac.Add (new PlanePrimitiveShapeConstructor()); - MiscLib::Vector, std::size_t> > shapes; // stores the detected shapes - ransac.Detect (proto_points, 0, proto_points.size(), &shapes); - t.stop(); - - detected_ransac.emplace_back (shapes.size()); - times_ransac.emplace_back (t.time() * 1000); - if (timer.time() > timeout) - { - nb_runs = run + 1; - break; - } - } - - std::sort (detected_ransac.begin(), detected_ransac.end()); - std::sort (times_ransac.begin(), times_ransac.end()); - std::cerr << "RANSAC (proto) = " << detected_ransac[detected_ransac.size() / 2] - << " planes (" << times_ransac[times_ransac.size() / 2] << "ms) (on " - << nb_runs << " runs, planes[" - << detected_ransac.front() << ";" << detected_ransac.back() << "], time[" - << times_ransac.front() << ";" << times_ransac.back() << "])" << std::endl; - } -#endif - std::cerr << std::endl; } From 812a20a45a1aa701cb139b7c769279b596d57892 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Thu, 10 Oct 2024 14:38:59 +0200 Subject: [PATCH 306/348] doc fix --- .../Shape_detection/Concepts/NeighborQuery.h | 2 +- .../doc/Shape_detection/Concepts/RegionType.h | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h b/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h index ed56b4bd8ea0..f8f77632f1b7 100644 --- a/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h +++ b/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h @@ -15,7 +15,7 @@ class NeighborQuery { public: - /// The reference type to the elements of the input range, e.g., a const_iterator of the input range. Must be a model of `Hashable`. + /// The reference type to the elements of the input range, e.g., a `const_iterator` of the input range. Must be a model of `Hashable`. typedef unspecified_type Item; /*! diff --git a/Shape_detection/doc/Shape_detection/Concepts/RegionType.h b/Shape_detection/doc/Shape_detection/Concepts/RegionType.h index b178993f8839..6af2d59bf994 100644 --- a/Shape_detection/doc/Shape_detection/Concepts/RegionType.h +++ b/Shape_detection/doc/Shape_detection/Concepts/RegionType.h @@ -23,10 +23,10 @@ class RegionType { /// The parameters of the primitive covering the region. typedef unspecified_type Primitive; - /// The reference type to the elements of the input range, e.g., a const_iterator of the input range. Must be a model of `Hashable`. + /// The reference type to the elements of the input range, e.g., a `const_iterator` of the input range. Must be a model of `Hashable`. typedef unspecified_type Item; - // The region types is defined by a vector of Items. + // The Region type is defined by a `vector` of items. typedef std::vector Region; /*! @@ -37,11 +37,11 @@ class RegionType { typedef unspecified_type Region_index_map; /*! - checks if the item `i` can be added to the region represented by `region`. + checks if the `Item` `i` can be added to the `Region` represented by `region`. `CGAL::Shape_detection::Region_growing` calls this function each time when - trying to add a new item to a region. If this function returns `true`, the - item with the index `i`, is added to the region, otherwise ignored. + trying to add a new item to a `Region`. If this function returns `true`, the + item with the index `i`, is added to the `region`, otherwise ignored. */ bool is_part_of_region( const Item i, @@ -52,8 +52,8 @@ class RegionType { checks if `region` satisfies all necessary conditions. `CGAL::Shape_detection::Region_growing` calls this function at the end of each - propagation phase. If this function returns `true`, the region is accepted, - otherwise rejected. If the region is rejected, all its items are released and + propagation phase. If this function returns `true`, the `region` is accepted, + otherwise rejected. If the `region` is rejected, all its items are released and available for region growing again. */ bool is_valid_region( @@ -68,7 +68,7 @@ class RegionType { } /*! - enables to update any information about the region represented by the collection of Items `region`. + enables to update any information about the region represented by the collection of items `region`. `CGAL::Shape_detection::Region_growing` calls this function each time when a new seed item is selected. This case can be identified by checking the @@ -76,8 +76,8 @@ class RegionType { when enlarging the region. This case can be identified by checking the condition `region.size() > 1`. - This function also returns a Boolean at the first call when a new region - with one seed item is being created. When it is `true`, the new region is + This function also returns a boolean at the first call when a new `region` + with one seed item is being created. When it is `true`, the new `region` is further propagated, otherwise, it is rejected. */ bool update( From a755f851dc3c603c6be2d28245615e72740878bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 10 Oct 2024 17:18:00 +0200 Subject: [PATCH 307/348] clean up --- REUSE.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/REUSE.toml b/REUSE.toml index 5cca2b91384e..4efaf5271c5d 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -45,7 +45,6 @@ path = [ "Installation/auxiliary/cgal_create_cmake_script.1", "Installation/auxiliary/gmp/README", "Installation/include/CGAL/license/gpl_package_list.txt", - "MacOSX/auxiliary/cgal_app.icns", "copyright", ] precedence = "aggregate" From 49572692b3dd78568a955b6e352a956ce98901c7 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Sun, 13 Oct 2024 20:03:15 +0100 Subject: [PATCH 308/348] Add specialization of Evaluate<> for Lazy_exact_nt --- Filtered_kernel/include/CGAL/Lazy.h | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/Filtered_kernel/include/CGAL/Lazy.h b/Filtered_kernel/include/CGAL/Lazy.h index 1273248d0801..5d7b22ec37b8 100644 --- a/Filtered_kernel/include/CGAL/Lazy.h +++ b/Filtered_kernel/include/CGAL/Lazy.h @@ -111,14 +111,24 @@ templateinline std::enable_if_t::value, T> approx(T){r templateinline std::enable_if_t::value, int> depth(T){return -1;} namespace internal{ -template -struct Evaluate> -{ - void operator()(const Lazy& l) + + template + struct Evaluate> { - exact(l); - } + void operator()(const Lazy& l) + { + exact(l); + } }; + + template + struct Evaluate> + { + void operator()(const Lazy_exact_nt& l) + { + exact(l); + } + }; } // internal namespace // For an iterator, exact/approx applies to the objects it points to From 9b7c651867d089888b62fba2623ef38ab26cd1f9 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Mon, 14 Oct 2024 09:08:32 +0200 Subject: [PATCH 309/348] using correct dimensions for depth peeling framebuffers and shader --- Polyhedron/demo/Polyhedron/Scene.cpp | 18 ++++++++++++------ .../demo/Polyhedron/Triangle_container.cpp | 10 ++++++++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Scene.cpp b/Polyhedron/demo/Polyhedron/Scene.cpp index c70929ab4a5e..881f8082f9f9 100644 --- a/Polyhedron/demo/Polyhedron/Scene.cpp +++ b/Polyhedron/demo/Polyhedron/Scene.cpp @@ -766,8 +766,14 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer) fbos.resize(static_cast(viewer->total_pass())); depth_test.resize(static_cast(viewer->total_pass())-1); + int viewport[4]; + viewer->glGetIntegerv(GL_VIEWPORT, viewport); + + int w = viewport[2];// viewer->width(); + int h = viewport[3];// viewer->height(); + //first pass - fbos[0] = new QOpenGLFramebufferObject(viewer->width(), viewer->height(),QOpenGLFramebufferObject::Depth, GL_TEXTURE_2D, GL_RGBA32F); + fbos[0] = new QOpenGLFramebufferObject(w, h, QOpenGLFramebufferObject::Depth, GL_TEXTURE_2D, GL_RGBA32F); fbos[0]->bind(); viewer->glDisable(GL_BLEND); viewer->glEnable(GL_DEPTH_TEST); @@ -781,7 +787,8 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer) renderScene(opaque_items, viewer, picked_item_IDs, false, 0,false, nullptr); renderScene(transparent_items, viewer, picked_item_IDs, false, 0,false, nullptr); fbos[0]->release(); - depth_test[0] = new QOpenGLFramebufferObject(viewer->width(), viewer->height(),QOpenGLFramebufferObject::Depth, GL_TEXTURE_2D, GL_RGBA32F); + + depth_test[0] = new QOpenGLFramebufferObject(w, h,QOpenGLFramebufferObject::Depth, GL_TEXTURE_2D, GL_RGBA32F); depth_test[0]->bind(); viewer->glDisable(GL_BLEND); viewer->glEnable(GL_DEPTH_TEST); @@ -799,7 +806,7 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer) //other passes for(int i=1; itotal_pass()-1; ++i) { - fbos[i] = new QOpenGLFramebufferObject(viewer->width(), viewer->height(),QOpenGLFramebufferObject::Depth, GL_TEXTURE_2D, GL_RGBA32F); + fbos[i] = new QOpenGLFramebufferObject(w, h,QOpenGLFramebufferObject::Depth, GL_TEXTURE_2D, GL_RGBA32F); fbos[i]->bind(); viewer->glDisable(GL_BLEND); viewer->glEnable(GL_DEPTH_TEST); @@ -816,7 +823,7 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer) renderScene(transparent_items, viewer, picked_item_IDs, false, i, false, depth_test[i-1]); fbos[i]->release(); - depth_test[i] = new QOpenGLFramebufferObject(viewer->width(), viewer->height(),QOpenGLFramebufferObject::Depth, GL_TEXTURE_2D, GL_RGBA32F); + depth_test[i] = new QOpenGLFramebufferObject(w, h,QOpenGLFramebufferObject::Depth, GL_TEXTURE_2D, GL_RGBA32F); depth_test[i]->bind(); viewer->glDisable(GL_BLEND); viewer->glEnable(GL_DEPTH_TEST); @@ -832,9 +839,8 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer) depth_test[i]->release(); } - //last pass - fbos[static_cast(viewer->total_pass())-1] = new QOpenGLFramebufferObject(viewer->width(), viewer->height(),QOpenGLFramebufferObject::Depth, GL_TEXTURE_2D, GL_RGBA32F); + fbos[static_cast(viewer->total_pass())-1] = new QOpenGLFramebufferObject(w, h,QOpenGLFramebufferObject::Depth, GL_TEXTURE_2D, GL_RGBA32F); fbos[static_cast(viewer->total_pass())-1]->bind(); viewer->glDisable(GL_BLEND); viewer->glEnable(GL_DEPTH_TEST); diff --git a/Polyhedron/demo/Polyhedron/Triangle_container.cpp b/Polyhedron/demo/Polyhedron/Triangle_container.cpp index 182f401c04d2..062b3681e1cc 100644 --- a/Polyhedron/demo/Polyhedron/Triangle_container.cpp +++ b/Polyhedron/demo/Polyhedron/Triangle_container.cpp @@ -185,8 +185,11 @@ void Triangle_container::draw(Viewer_interface* viewer, getVao(viewer)->program->setUniformValue("far", static_cast(viewer->camera()->zFar())); getVao(viewer)->program->setUniformValue("writing", viewer->isDepthWriting()); getVao(viewer)->program->setUniformValue("alpha", d->alpha); - if( fbo) + if(fbo) { viewer->glBindTexture(GL_TEXTURE_2D, fbo->texture()); + getVao(viewer)->program->setUniformValue("width", fbo->width() * 1.0f); + getVao(viewer)->program->setUniformValue("height", fbo->height() * 1.0f); + } } if(getVao(viewer)->program->property("drawLinesAdjacency").toBool()) { @@ -225,8 +228,11 @@ void Triangle_container::draw(Viewer_interface* viewer, getVao(viewer)->program->setUniformValue("far", static_cast(viewer->camera()->zFar())); getVao(viewer)->program->setUniformValue("writing", viewer->isDepthWriting()); getVao(viewer)->program->setUniformValue("alpha", d->alpha); - if( fbo) + if(fbo) { viewer->glBindTexture(GL_TEXTURE_2D, fbo->texture()); + getVao(viewer)->program->setUniformValue("width", fbo->width() * 1.0f); + getVao(viewer)->program->setUniformValue("height", fbo->height() * 1.0f); + } } if(getVao(viewer)->program->property("isInstanced").toBool()) { From 1a146369f3840dd0091d19a8abed04f8fee60b78 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 14 Oct 2024 09:43:04 +0200 Subject: [PATCH 310/348] Update STL_Extension/include/CGAL/assertions.h --- STL_Extension/include/CGAL/assertions.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/STL_Extension/include/CGAL/assertions.h b/STL_Extension/include/CGAL/assertions.h index cd076d29fe35..d802ed3a3b9f 100644 --- a/STL_Extension/include/CGAL/assertions.h +++ b/STL_Extension/include/CGAL/assertions.h @@ -19,8 +19,6 @@ #ifndef CGAL_ASSERTIONS_H #define CGAL_ASSERTIONS_H -// this define is only for one run of the testsuite -#define CGAL_NO_POSTCONDITIONS #include From 9cdce85fbddc66cdae9753e52eb2d1aa209ed74c Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 14 Oct 2024 14:10:49 +0200 Subject: [PATCH 311/348] Re-add the test for `free`, since TBB has been updated on our Windows test machines --- Installation/include/CGAL/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Installation/include/CGAL/config.h b/Installation/include/CGAL/config.h index 64e68c535001..92a4ac768f58 100644 --- a/Installation/include/CGAL/config.h +++ b/Installation/include/CGAL/config.h @@ -42,7 +42,7 @@ // Include support for memory leak detection // This is only available in debug mode and when _CRTDBG_MAP_ALLOC is defined. // It will include which will redefine `malloc` and `free`. -// # define _CRTDBG_MAP_ALLOC 1 +# define _CRTDBG_MAP_ALLOC 1 #endif // Mimic users including this file which defines min max macros // and other names leading to name clashes From 94b28d5df27cf5576e5645488942e8bc0e82b99d Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 14 Oct 2024 15:42:15 +0200 Subject: [PATCH 312/348] update CHANGES.md --- Installation/CHANGES.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 7f8390b017cc..c0c0443e6232 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -1,9 +1,9 @@ # Release History -## [Release 6.1](https://github.com/CGAL/cgal/releases/tag/v6.1) +## [Release 6.0.1](https://github.com/CGAL/cgal/releases/tag/v6.0.1) -### [Poisson Surface Reconstruction](https://doc.cgal.org/6.1/Manual/packages.html#PkgPoissonSurfaceReconstruction3) -- Made the implicit function thread-safe so that the parallel version of `make_mesh_3()` can be used. +### [Poisson Surface Reconstruction](https://doc.cgal.org/6.0.1/Manual/packages.html#PkgPoissonSurfaceReconstruction3) +- Made the implicit function thread-safe so that the parallel version of `make_mesh_3()` can be used. ## [Release 6.0](https://github.com/CGAL/cgal/releases/tag/v6.0) From 2ca1c4edc18a5e4599481715926c6f59390799af Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 14 Oct 2024 17:37:19 +0200 Subject: [PATCH 313/348] first batch of modifications during my review [skip ci] (wait for the second batch of modifications) --- .../examples/Classification/CMakeLists.txt | 10 +-- .../test/Classification/CMakeLists.txt | 10 +-- .../CGAL_CreateSingleSourceCGALProgram.cmake | 4 -- Lab/demo/Lab/CMakeLists.txt | 62 +++++++++---------- Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt | 4 +- .../Lab/Plugins/Alpha_wrap_3/CMakeLists.txt | 2 +- .../Plugins/Camera_position/CMakeLists.txt | 2 +- .../Lab/Plugins/Classification/CMakeLists.txt | 13 ++-- .../Convex_decomposition/CMakeLists.txt | 2 +- .../Lab/Plugins/Convex_hull/CMakeLists.txt | 4 +- Lab/demo/Lab/Plugins/Display/CMakeLists.txt | 16 ++--- Lab/demo/Lab/Plugins/IO/CMakeLists.txt | 32 +++++----- .../Lab/Plugins/Isosurfacing_3/CMakeLists.txt | 2 +- Lab/demo/Lab/Plugins/Mesh_2/CMakeLists.txt | 2 +- Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt | 16 ++--- .../Operations_on_polyhedra/CMakeLists.txt | 12 ++-- Lab/demo/Lab/Plugins/PCA/CMakeLists.txt | 50 +++++++-------- Lab/demo/Lab/Plugins/PMP/CMakeLists.txt | 50 +++++++-------- Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt | 60 +++++++++--------- .../Subdivision_methods/CMakeLists.txt | 2 +- .../Lab/Plugins/Surface_mesh/CMakeLists.txt | 10 +-- .../Surface_mesh_deformation/CMakeLists.txt | 2 +- .../Tetrahedral_remeshing/CMakeLists.txt | 2 +- .../Lab/Plugins/Three_examples/CMakeLists.txt | 2 +- Lab/demo/Lab/Scene_image_item.cpp | 2 - 25 files changed, 186 insertions(+), 187 deletions(-) diff --git a/Classification/examples/Classification/CMakeLists.txt b/Classification/examples/Classification/CMakeLists.txt index 9be4f7fdad1b..61060474db98 100644 --- a/Classification/examples/Classification/CMakeLists.txt +++ b/Classification/examples/Classification/CMakeLists.txt @@ -10,13 +10,15 @@ find_package(CGAL REQUIRED) set(Classification_dependencies_met TRUE) find_package(Boost OPTIONAL_COMPONENTS serialization iostreams) +include(CGAL_Boost_serialization_support) +include(CGAL_Boost_iostreams_support) -if(NOT TARGET Boost::serialization) +if(NOT TARGET CGAL::Boost_serialization_support) message("NOTICE: This project requires Boost Serialization, and will not be compiled.") set(Classification_dependencies_met FALSE) endif() -if(NOT TARGET Boost::iostreams) +if(NOT TARGET CGAL::Boost_iostreams_support) message("NOTICE: This project requires Boost IO Streams, and will not be compiled.") set(Classification_dependencies_met FALSE) endif() @@ -67,8 +69,8 @@ foreach(target example_deprecated_conversion) if(TARGET ${target}) target_link_libraries(${target} PRIVATE CGAL::Eigen3_support - Boost::iostreams - Boost::serialization) + CGAL::Boost_iostreams_support + CGAL::Boost_serialization_support) if(TARGET CGAL::TBB_support) target_link_libraries(${target} PRIVATE CGAL::TBB_support) endif() diff --git a/Classification/test/Classification/CMakeLists.txt b/Classification/test/Classification/CMakeLists.txt index aa5d323ba53a..8b3ccbf3da3c 100644 --- a/Classification/test/Classification/CMakeLists.txt +++ b/Classification/test/Classification/CMakeLists.txt @@ -10,13 +10,15 @@ find_package(CGAL REQUIRED) set(Classification_dependencies_met TRUE) find_package(Boost OPTIONAL_COMPONENTS serialization iostreams) +include(CGAL_Boost_serialization_support) +include(CGAL_Boost_iostreams_support) -if(NOT TARGET Boost::serialization) +if(NOT TARGET CGAL::Boost_serialization_support) message("NOTICE: This project requires Boost Serialization, and will not be compiled.") set(Classification_dependencies_met FALSE) endif() -if(NOT TARGET Boost::iostreams) +if(NOT TARGET CGAL::Boost_iostreams_support) message("NOTICE: This project requires Boost IO Streams, and will not be compiled.") set(Classification_dependencies_met FALSE) endif() @@ -40,8 +42,8 @@ create_single_source_cgal_program("test_classification_io.cpp") foreach(target test_classification_point_set test_classification_io) target_link_libraries(${target} PRIVATE CGAL::Eigen3_support - Boost::iostreams - Boost::serialization) + CGAL::Boost_iostreams_support + CGAL::Boost_serialization_support) if(TARGET CGAL::TBB_support) target_link_libraries(${target} PRIVATE CGAL::TBB_support) endif() diff --git a/Installation/cmake/modules/CGAL_CreateSingleSourceCGALProgram.cmake b/Installation/cmake/modules/CGAL_CreateSingleSourceCGALProgram.cmake index c51173216b3f..d6d992267bb5 100644 --- a/Installation/cmake/modules/CGAL_CreateSingleSourceCGALProgram.cmake +++ b/Installation/cmake/modules/CGAL_CreateSingleSourceCGALProgram.cmake @@ -23,10 +23,6 @@ function(create_single_source_cgal_program firstfile ) if(EXISTS "${firstfile}") - if(CXX_FEATURES AND NOT COMMAND target_compile_features) - message(STATUS "NOTICE: ${exe_name}.cpp requires a CMake version >= 3.1 to detect C++ features, and will not be compiled.") - return() - endif() if(CXX_FEATURES) set(MISSING_CXX_FEATURES ${CXX_FEATURES}) if(CMAKE_CXX_COMPILE_FEATURES) diff --git a/Lab/demo/Lab/CMakeLists.txt b/Lab/demo/Lab/CMakeLists.txt index 41b160690619..f81c8c2a243d 100644 --- a/Lab/demo/Lab/CMakeLists.txt +++ b/Lab/demo/Lab/CMakeLists.txt @@ -49,7 +49,6 @@ set_package_properties( if(Qt6_FOUND) add_compile_definitions(-DQT_NO_KEYWORDS) - add_compile_definitions(-DSCENE_IMAGE_GL_BUFFERS_AVAILABLE) endif(Qt6_FOUND) find_package(Eigen3 3.2.0 QUIET) #(requires 3.2.0 or greater) @@ -186,10 +185,10 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) Primitive_container.cpp CGALlab_plugin_helper.cpp CGAL_double_edit.cpp) - target_link_libraries(demo_framework PUBLIC Qt6::OpenGLWidgets Qt6::Widgets Qt6::Gui Qt6::Qml - CGAL::CGAL_Qt6) + target_link_libraries(demo_framework PRIVATE Qt6::OpenGLWidgets Qt6::Widgets Qt6::Gui + PUBLIC CGAL::CGAL_Qt6) if(TARGET Qt6::WebSockets) - target_link_libraries(demo_framework PUBLIC Qt6::WebSockets) + target_link_libraries(demo_framework PRIVATE Qt6::WebSockets) message(STATUS "Qt6WebSockets was found. Using WebSockets is therefore possible.") endif() @@ -216,8 +215,8 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_library(scene_basic_objects SHARED Scene_plane_item.cpp Scene_spheres_item.cpp) target_link_libraries( - scene_basic_objects PUBLIC demo_framework CGAL::CGAL_Qt6 Qt6::OpenGLWidgets - Qt6::Gui Qt6::Widgets) + scene_basic_objects PRIVATE demo_framework CGAL::CGAL_Qt6 Qt6::OpenGLWidgets + Qt6::Gui Qt6::Widgets) add_library(scene_color_ramp SHARED Color_ramp.cpp) target_link_libraries(scene_color_ramp PRIVATE Qt6::Core) @@ -226,26 +225,26 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_library(point_dialog SHARED Show_point_dialog.cpp Show_point_dialog.ui ${Show_point_dialogUI_FILES}) - target_link_libraries(point_dialog PUBLIC Qt6::OpenGLWidgets Qt6::Gui + target_link_libraries(point_dialog PRIVATE Qt6::OpenGLWidgets Qt6::Gui Qt6::Widgets) cgal_add_compilation_test(point_dialog) macro(add_item item_name) add_library(${item_name} SHARED ${ARGN}) target_link_libraries( - ${item_name} PUBLIC demo_framework CGAL::CGAL_Qt6 Qt6::OpenGLWidgets Qt6::Gui - Qt6::Widgets) + ${item_name} PRIVATE demo_framework CGAL::CGAL_Qt6 Qt6::OpenGLWidgets Qt6::Gui + Qt6::Widgets) cgal_add_compilation_test(${item_name}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS ${item_name}) CGAL_install_hooks() endmacro(add_item) add_item(scene_triangulation_3_item Scene_triangulation_3_item.cpp) - target_link_libraries(scene_triangulation_3_item PUBLIC scene_basic_objects scene_edit_box_item) + target_link_libraries(scene_triangulation_3_item PRIVATE scene_basic_objects scene_edit_box_item) add_item(scene_c3t3_item Scene_c3t3_item.cpp) target_link_libraries( - scene_c3t3_item PUBLIC scene_triangulation_3_item + scene_c3t3_item PRIVATE scene_triangulation_3_item scene_surface_mesh_item scene_polygon_soup_item scene_basic_objects ${TBB_LIBRARIES}) @@ -258,19 +257,19 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) target_precompile_headers(scene_c3t3_item PUBLIC [["C3t3_type.h"]]) endif() add_item(scene_tetrahedra_item Scene_tetrahedra_item.cpp) - target_link_libraries(scene_tetrahedra_item PUBLIC scene_c3t3_item) + target_link_libraries(scene_tetrahedra_item PRIVATE scene_c3t3_item) add_item(scene_aff_transformed_item Plugins/PCA/Scene_aff_transformed_item.cpp) add_item(scene_aff_transformed_point_set_item Plugins/PCA/Scene_aff_transformed_point_set_item.cpp) - target_link_libraries(scene_aff_transformed_point_set_item PUBLIC scene_points_with_normal_item - scene_aff_transformed_item) + target_link_libraries(scene_aff_transformed_point_set_item PRIVATE scene_points_with_normal_item + scene_aff_transformed_item) add_item(scene_aff_transformed_polygon_soup_item Plugins/PCA/Scene_aff_transformed_polygon_soup_item.cpp) - target_link_libraries(scene_aff_transformed_polygon_soup_item PUBLIC scene_polygon_soup_item - scene_aff_transformed_item) + target_link_libraries(scene_aff_transformed_polygon_soup_item PRIVATE scene_polygon_soup_item + scene_aff_transformed_item) add_item(scene_aff_transformed_surface_mesh_item Plugins/PCA/Scene_aff_transformed_surface_mesh_item.cpp) - target_link_libraries(scene_aff_transformed_surface_mesh_item PUBLIC scene_surface_mesh_item - scene_aff_transformed_item) + target_link_libraries(scene_aff_transformed_surface_mesh_item PRIVATE scene_surface_mesh_item + scene_aff_transformed_item) add_item(scene_edit_box_item Plugins/PCA/Scene_edit_box_item.cpp) @@ -283,15 +282,15 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) # special add_item(scene_item_decorator Scene_polyhedron_item_decorator.cpp) - target_link_libraries(scene_item_decorator PUBLIC scene_surface_mesh_item) + target_link_libraries(scene_item_decorator PRIVATE scene_surface_mesh_item) add_item(scene_k_ring_selection Plugins/PMP/Scene_facegraph_item_k_ring_selection.cpp) - target_link_libraries(scene_k_ring_selection PUBLIC scene_surface_mesh_item) + target_link_libraries(scene_k_ring_selection PRIVATE scene_surface_mesh_item) add_item(scene_selection_item Scene_polyhedron_selection_item.cpp) - target_link_libraries(scene_selection_item PUBLIC scene_item_decorator - scene_k_ring_selection) + target_link_libraries(scene_selection_item PRIVATE scene_item_decorator + scene_k_ring_selection) if(TBB_FOUND) target_link_libraries(scene_selection_item PRIVATE CGAL::TBB_support) endif() @@ -300,7 +299,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) Plugins/Surface_mesh/Scene_polyhedron_shortest_path_item.cpp) target_link_libraries( scene_shortest_path_item - PUBLIC scene_item_decorator scene_surface_mesh_item scene_polylines_item) + PRIVATE scene_item_decorator scene_surface_mesh_item scene_polylines_item) add_item(scene_movable_sm_item Plugins/AABB_tree/Scene_movable_sm_item.cpp) @@ -313,14 +312,14 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) endif() add_item(scene_implicit_function_item Scene_implicit_function_item.cpp) - target_link_libraries(scene_implicit_function_item PUBLIC scene_color_ramp) + target_link_libraries(scene_implicit_function_item PRIVATE scene_color_ramp) add_item(scene_polygon_soup_item Scene_polygon_soup_item.cpp) - target_link_libraries(scene_polygon_soup_item PUBLIC scene_surface_mesh_item) + target_link_libraries(scene_polygon_soup_item PRIVATE scene_surface_mesh_item) add_item(scene_nef_polyhedron_item Scene_nef_polyhedron_item.cpp) target_link_libraries(scene_nef_polyhedron_item - PUBLIC scene_surface_mesh_item) + PRIVATE scene_surface_mesh_item) add_item(scene_points_with_normal_item Scene_points_with_normal_item.cpp) if(TARGET CGAL::Eigen3_support) @@ -335,8 +334,8 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_item(scene_polylines_item Scene_polylines_item.cpp) target_link_libraries( - scene_polylines_item PUBLIC scene_basic_objects - scene_points_with_normal_item) + scene_polylines_item PRIVATE scene_basic_objects + scene_points_with_normal_item) add_item(scene_lcc_item Scene_lcc_item.cpp) @@ -360,8 +359,9 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) ${statisticsUI_FILES} ${SubViewerUI_files}) target_link_libraries( - cgal_lab PUBLIC demo_framework point_dialog Qt6::Gui Qt6::OpenGLWidgets - Qt6::Widgets ) + cgal_lab PRIVATE demo_framework point_dialog Qt6::Widgets + PUBLIC Qt6::Gui Qt6::OpenGLWidgets Qt6::Qml + ) if(LIBSSH_FOUND) target_compile_definitions(cgal_lab PRIVATE -DCGAL_USE_SSH) target_link_libraries(cgal_lab PRIVATE ${LIBSSH_LIBRARIES}) @@ -420,7 +420,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) #WS Server if(TARGET Qt6::WebSockets AND TARGET Qt6::Network) add_executable(WS_server Server_ws.cpp) - target_link_libraries(WS_server PUBLIC Qt6::WebSockets Qt6::Widgets Qt6::Network) + target_link_libraries(WS_server PRIVATE Qt6::WebSockets Qt6::Widgets Qt6::Network) message(STATUS "Qt6WebSockets was found. Using WebSockets is therefore possible.") endif() # diff --git a/Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt b/Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt index 3a4f0aee0a30..a4c713f5d1be 100644 --- a/Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt @@ -1,11 +1,11 @@ include(CGALlab_macros) cgal_lab_plugin(do_trees_intersect_plugin Do_trees_intersect_plugin) -target_link_libraries(do_trees_intersect_plugin PUBLIC scene_surface_mesh_item +target_link_libraries(do_trees_intersect_plugin PRIVATE scene_surface_mesh_item scene_movable_sm_item) cgal_lab_plugin(cut_plugin Cut_plugin) -target_link_libraries(cut_plugin PUBLIC scene_surface_mesh_item +target_link_libraries(cut_plugin PRIVATE scene_surface_mesh_item scene_basic_objects scene_color_ramp) if(TARGET CGAL::TBB_support) target_link_libraries(cut_plugin PRIVATE CGAL::TBB_support) diff --git a/Lab/demo/Lab/Plugins/Alpha_wrap_3/CMakeLists.txt b/Lab/demo/Lab/Plugins/Alpha_wrap_3/CMakeLists.txt index f7097e719e9e..876265b7be1a 100644 --- a/Lab/demo/Lab/Plugins/Alpha_wrap_3/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Alpha_wrap_3/CMakeLists.txt @@ -5,4 +5,4 @@ qt6_wrap_ui(alpha_wrap_3UI_FILES alpha_wrap_3_dialog.ui) cgal_lab_plugin(alpha_wrap_3_plugin Alpha_wrap_3_plugin ${alpha_wrap_3UI_FILES}) #if the plugin uses external libraries like scene_items -target_link_libraries(alpha_wrap_3_plugin PUBLIC scene_surface_mesh_item scene_polygon_soup_item scene_points_with_normal_item scene_selection_item scene_polylines_item) +target_link_libraries(alpha_wrap_3_plugin PRIVATE scene_surface_mesh_item scene_polygon_soup_item scene_points_with_normal_item scene_selection_item scene_polylines_item) diff --git a/Lab/demo/Lab/Plugins/Camera_position/CMakeLists.txt b/Lab/demo/Lab/Plugins/Camera_position/CMakeLists.txt index 034f5a430505..840ccfa5bb8f 100644 --- a/Lab/demo/Lab/Plugins/Camera_position/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Camera_position/CMakeLists.txt @@ -8,4 +8,4 @@ cgal_lab_plugin(camera_positions_plugin KEYWORDS Viewer) add_dependencies(camera_positions_plugin demo_framework) -target_link_libraries(camera_positions_plugin PUBLIC demo_framework) +target_link_libraries(camera_positions_plugin PRIVATE demo_framework) diff --git a/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt b/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt index a048c4f7eb1b..a2e4c681a0f7 100644 --- a/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt @@ -3,8 +3,9 @@ include(CGALlab_macros) if(TARGET CGAL::Eigen3_support) find_package(Boost QUIET OPTIONAL_COMPONENTS serialization iostreams) - - if(NOT TARGET Boost::serialization OR NOT TARGET Boost::iostreams) + include(CGAL_Boost_serialization_support) + include(CGAL_Boost_iostreams_support) + if(NOT TARGET CGAL::Boost_serialization_support OR NOT TARGET CGAL::Boost_iostreams_support) message(STATUS "NOTICE: Boost IO Streams and/or Serialization not found, reading deprecated Classification config files won't be possible.") endif() @@ -32,7 +33,7 @@ if(TARGET CGAL::Eigen3_support) Classification) target_link_libraries( classification_plugin - PUBLIC scene_points_with_normal_item + PRIVATE scene_points_with_normal_item scene_polylines_item scene_polygon_soup_item scene_surface_mesh_item @@ -46,9 +47,9 @@ if(TARGET CGAL::Eigen3_support) PROPERTIES RESOURCE_LOCK Selection_test_resources) endif() - if(TARGET Boost::serialization AND TARGET Boost::iostreams) - target_link_libraries(classification_plugin PRIVATE Boost::serialization - Boost::iostreams) + if(TARGET CGAL::Boost_serialization_support AND TARGET CGAL::Boost_iostreams_support) + target_link_libraries(classification_plugin PRIVATE CGAL::Boost_serialization_support + CGAL::Boost_iostreams_support) endif() if(TARGET CGAL::OpenCV_support) diff --git a/Lab/demo/Lab/Plugins/Convex_decomposition/CMakeLists.txt b/Lab/demo/Lab/Plugins/Convex_decomposition/CMakeLists.txt index a4b630fad160..683824fbeaa6 100644 --- a/Lab/demo/Lab/Plugins/Convex_decomposition/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Convex_decomposition/CMakeLists.txt @@ -1,4 +1,4 @@ include(CGALlab_macros) cgal_lab_plugin(nef_plugin Nef_plugin) -target_link_libraries(nef_plugin PUBLIC scene_nef_polyhedron_item) +target_link_libraries(nef_plugin PRIVATE scene_nef_polyhedron_item) diff --git a/Lab/demo/Lab/Plugins/Convex_hull/CMakeLists.txt b/Lab/demo/Lab/Plugins/Convex_hull/CMakeLists.txt index 4222c6320c7f..019615e46379 100644 --- a/Lab/demo/Lab/Plugins/Convex_hull/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Convex_hull/CMakeLists.txt @@ -3,11 +3,11 @@ include(CGALlab_macros) cgal_lab_plugin(convex_hull_plugin Convex_hull_plugin KEYWORDS PointSetProcessing) target_link_libraries( - convex_hull_plugin PUBLIC scene_points_with_normal_item scene_polylines_item + convex_hull_plugin PRIVATE scene_points_with_normal_item scene_polylines_item scene_selection_item scene_surface_mesh_item) cgal_lab_plugin(kernel_plugin Kernel_plugin) -target_link_libraries(kernel_plugin PUBLIC scene_surface_mesh_item) +target_link_libraries(kernel_plugin PRIVATE scene_surface_mesh_item) if(CGAL_ENABLE_TESTING AND NOT CMAKE_VS_MSBUILD_COMMAND) diff --git a/Lab/demo/Lab/Plugins/Display/CMakeLists.txt b/Lab/demo/Lab/Plugins/Display/CMakeLists.txt index f1beddaf360e..392f1e33e4f3 100644 --- a/Lab/demo/Lab/Plugins/Display/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Display/CMakeLists.txt @@ -2,16 +2,16 @@ include(CGALlab_macros) qt6_wrap_ui(display_propertyUI_FILES Display_property.ui) cgal_lab_plugin(display_property_plugin Display_property_plugin ${display_propertyUI_FILES} KEYWORDS Viewer) -target_link_libraries(display_property_plugin PUBLIC scene_surface_mesh_item - scene_points_with_normal_item - scene_color_ramp - CGAL::Eigen3_support) +target_link_libraries(display_property_plugin PRIVATE scene_surface_mesh_item + scene_points_with_normal_item + scene_color_ramp + CGAL::Eigen3_support) if(TARGET CGAL::Eigen3_support) qt6_wrap_ui(heat_methodUI_FILES Heat_method.ui) cgal_lab_plugin(heat_method_plugin Heat_method_plugin ${heat_methodUI_FILES} KEYWORDS Viewer) - target_link_libraries(heat_method_plugin PUBLIC scene_surface_mesh_item - scene_selection_item - scene_color_ramp - CGAL::Eigen3_support) + target_link_libraries(heat_method_plugin PRIVATE scene_surface_mesh_item + scene_selection_item + scene_color_ramp + CGAL::Eigen3_support) endif() diff --git a/Lab/demo/Lab/Plugins/IO/CMakeLists.txt b/Lab/demo/Lab/Plugins/IO/CMakeLists.txt index 760a9c328972..91bd7c6e2614 100644 --- a/Lab/demo/Lab/Plugins/IO/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/IO/CMakeLists.txt @@ -13,39 +13,39 @@ endif() include(CGAL_LASLIB_support) cgal_lab_plugin(gocad_plugin GOCAD_io_plugin KEYWORDS Viewer) -target_link_libraries(gocad_plugin PUBLIC scene_surface_mesh_item) +target_link_libraries(gocad_plugin PRIVATE scene_surface_mesh_item) qt6_wrap_ui( funcUI_FILES Function_dialog.ui ) cgal_lab_plugin(io_implicit_function_plugin Implicit_function_io_plugin ${funcUI_FILES} KEYWORDS Viewer Mesh_3) -target_link_libraries(io_implicit_function_plugin PUBLIC scene_implicit_function_item) +target_link_libraries(io_implicit_function_plugin PRIVATE scene_implicit_function_item) cgal_lab_plugin(nef_io_plugin Nef_io_plugin KEYWORDS Viewer) -target_link_libraries(nef_io_plugin PUBLIC scene_nef_polyhedron_item) +target_link_libraries(nef_io_plugin PRIVATE scene_nef_polyhedron_item) cgal_lab_plugin(off_plugin OFF_io_plugin KEYWORDS Viewer Mesh_3 PointSetProcessing Classification PMP) -target_link_libraries(off_plugin PUBLIC scene_polygon_soup_item scene_points_with_normal_item scene_surface_mesh_item) +target_link_libraries(off_plugin PRIVATE scene_polygon_soup_item scene_points_with_normal_item scene_surface_mesh_item) cgal_lab_plugin(off_to_nef_plugin OFF_to_nef_io_plugin KEYWORDS Viewer) -target_link_libraries(off_to_nef_plugin PUBLIC scene_nef_polyhedron_item) +target_link_libraries(off_to_nef_plugin PRIVATE scene_nef_polyhedron_item) cgal_lab_plugin(polylines_io_plugin Polylines_io_plugin KEYWORDS Viewer Mesh_3) -target_link_libraries(polylines_io_plugin PUBLIC scene_polylines_item) +target_link_libraries(polylines_io_plugin PRIVATE scene_polylines_item) cgal_lab_plugin(wkt_plugin WKT_io_plugin KEYWORDS Viewer PointSetProcessing Mesh_3) -target_link_libraries(wkt_plugin PUBLIC scene_polylines_item) +target_link_libraries(wkt_plugin PRIVATE scene_polylines_item) cgal_lab_plugin(stl_plugin STL_io_plugin KEYWORDS Viewer PMP) -target_link_libraries(stl_plugin PUBLIC scene_surface_mesh_item scene_polygon_soup_item) +target_link_libraries(stl_plugin PRIVATE scene_surface_mesh_item scene_polygon_soup_item) cgal_lab_plugin(surf_io_plugin Surf_io_plugin KEYWORDS Viewer PMP) -target_link_libraries(surf_io_plugin PUBLIC scene_surface_mesh_item) +target_link_libraries(surf_io_plugin PRIVATE scene_surface_mesh_item) cgal_lab_plugin(lcc_io_plugin lcc_io_plugin KEYWORDS Viewer) -target_link_libraries(lcc_io_plugin PUBLIC scene_lcc_item) +target_link_libraries(lcc_io_plugin PRIVATE scene_lcc_item) find_package(VTK 9.0 QUIET COMPONENTS CommonCore IOCore IOLegacy IOXML FiltersCore FiltersSources) set_package_properties( @@ -54,29 +54,29 @@ set_package_properties( PURPOSE "Can be used for I/O (DICOM, VTU, VTP).") cgal_lab_plugin(triangulation_3_io_plugin triangulation_3_io_plugin KEYWORDS Viewer) -target_link_libraries(triangulation_3_io_plugin PUBLIC scene_triangulation_3_item) +target_link_libraries(triangulation_3_io_plugin PRIVATE scene_triangulation_3_item) if(VTK_FOUND AND VTK_LIBRARIES) message(STATUS "VTK ${VTK_VERSION} found ${VTK_LIBRARIES}") cgal_lab_plugin(vtk_plugin VTK_io_plugin KEYWORDS Viewer Mesh_3) - target_link_libraries(vtk_plugin PUBLIC scene_surface_mesh_item scene_polylines_item scene_c3t3_item scene_points_with_normal_item + target_link_libraries(vtk_plugin PRIVATE scene_surface_mesh_item scene_polylines_item scene_c3t3_item scene_points_with_normal_item ${VTK_LIBRARIES}) target_compile_definitions(vtk_plugin PRIVATE -DCGAL_USE_VTK -DNOMINMAX) else() message(STATUS "NOTICE: the vtk IO plugin needs VTK 9.0 or greater and will not be compiled.") endif() cgal_lab_plugin(xyz_plugin XYZ_io_plugin KEYWORDS Viewer PointSetProcessing Classification) -target_link_libraries(xyz_plugin PUBLIC scene_points_with_normal_item) +target_link_libraries(xyz_plugin PRIVATE scene_points_with_normal_item) cgal_lab_plugin(ply_plugin PLY_io_plugin KEYWORDS Viewer PointSetProcessing Classification PMP) -target_link_libraries(ply_plugin PUBLIC scene_points_with_normal_item scene_polygon_soup_item scene_surface_mesh_item scene_textured_item) +target_link_libraries(ply_plugin PRIVATE scene_points_with_normal_item scene_polygon_soup_item scene_surface_mesh_item scene_textured_item) if (TARGET CGAL::LASLIB_support) cgal_lab_plugin(las_plugin LAS_io_plugin KEYWORDS Viewer PointSetProcessing Classification) - target_link_libraries(las_plugin PUBLIC scene_points_with_normal_item CGAL::LASLIB_support) + target_link_libraries(las_plugin PRIVATE scene_points_with_normal_item CGAL::LASLIB_support) if(MSVC) target_compile_definitions( las_plugin - PUBLIC "-D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS") + PRIVATE "-D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS") endif() else() message(STATUS "NOTICE: the LAS IO plugin needs LAS libraries and will not be compiled.") diff --git a/Lab/demo/Lab/Plugins/Isosurfacing_3/CMakeLists.txt b/Lab/demo/Lab/Plugins/Isosurfacing_3/CMakeLists.txt index 110f77394888..1a8d1e429608 100644 --- a/Lab/demo/Lab/Plugins/Isosurfacing_3/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Isosurfacing_3/CMakeLists.txt @@ -3,4 +3,4 @@ include(CGALlab_macros) cgal_lab_plugin(isosurface_3_plugin Isosurface_3_plugin KEYWORDS Isosurface_3) target_link_libraries( - isosurface_3_plugin PUBLIC scene_polygon_soup_item scene_image_item ) + isosurface_3_plugin PRIVATE scene_polygon_soup_item scene_image_item ) diff --git a/Lab/demo/Lab/Plugins/Mesh_2/CMakeLists.txt b/Lab/demo/Lab/Plugins/Mesh_2/CMakeLists.txt index f5b4079bae5e..c2e925d04ffd 100644 --- a/Lab/demo/Lab/Plugins/Mesh_2/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Mesh_2/CMakeLists.txt @@ -4,5 +4,5 @@ qt6_wrap_ui(mesh_2UI_FILES mesh_2_dialog.ui) cgal_lab_plugin(mesh_2_plugin Mesh_2_plugin ${mesh_2UI_FILES}) #if the plugin uses external libraries like scene_items target_link_libraries( - mesh_2_plugin PUBLIC scene_surface_mesh_item scene_polylines_item + mesh_2_plugin PRIVATE scene_surface_mesh_item scene_polylines_item scene_points_with_normal_item) diff --git a/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt b/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt index 889c647ff9d8..8ca5ad54d5d9 100644 --- a/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt @@ -19,7 +19,7 @@ cgal_lab_plugin( Mesh_3) target_link_libraries( mesh_3_plugin - PUBLIC scene_polygon_soup_item + PRIVATE scene_polygon_soup_item scene_polylines_item scene_implicit_function_item scene_image_item @@ -53,12 +53,12 @@ if(Boost_FILESYSTEM_FOUND) ${imgUI_FILES} ${VOLUME_MOC_OUTFILES} KEYWORDS Viewer Mesh_3) - target_link_libraries(io_image_plugin PUBLIC scene_image_item ${VTK_LIBRARIES} CGAL::CGAL_ImageIO) + target_link_libraries(io_image_plugin PRIVATE scene_image_item ${VTK_LIBRARIES} CGAL::CGAL_ImageIO) if(VTK_LIBRARIES) target_compile_definitions(io_image_plugin PRIVATE -DCGAL_USE_VTK -DNOMINMAX) endif() - target_link_libraries(io_image_plugin PUBLIC Boost::filesystem + target_link_libraries(io_image_plugin PRIVATE Boost::filesystem Boost::system) else() @@ -74,7 +74,7 @@ cgal_lab_plugin( Mesh_3) target_link_libraries( mesh_3_optimization_plugin - PUBLIC scene_c3t3_item scene_surface_mesh_item scene_image_item + PRIVATE scene_c3t3_item scene_surface_mesh_item scene_image_item scene_implicit_function_item) # Use Eigen @@ -88,16 +88,16 @@ else() endif() cgal_lab_plugin(c3t3_io_plugin C3t3_io_plugin KEYWORDS Viewer Mesh_3) -target_link_libraries(c3t3_io_plugin PUBLIC scene_c3t3_item) +target_link_libraries(c3t3_io_plugin PRIVATE scene_c3t3_item) qt6_wrap_ui(tetraUI_FILES Tetrahedra_filter_widget.ui) cgal_lab_plugin(tetrahedra_filtering_plugin Tetrahedra_filtering_plugin ${tetraUI_FILES} KEYWORDS Mesh_3 Viewer) -target_link_libraries(tetrahedra_filtering_plugin PUBLIC scene_c3t3_item scene_tetrahedra_item) +target_link_libraries(tetrahedra_filtering_plugin PRIVATE scene_c3t3_item scene_tetrahedra_item) qt6_wrap_ui(ribUI_FILES Rib_dialog.ui) cgal_lab_plugin(c3t3_rib_exporter_plugin C3t3_rib_exporter_plugin ${ribUI_FILES} KEYWORDS Mesh_3) -target_link_libraries(c3t3_rib_exporter_plugin PUBLIC scene_c3t3_item) +target_link_libraries(c3t3_rib_exporter_plugin PRIVATE scene_c3t3_item) if(TBB_FOUND) target_link_libraries(mesh_3_plugin PRIVATE CGAL::TBB_support) @@ -109,7 +109,7 @@ endif() qt6_wrap_ui(offsetMeshingUI_FILES Offset_meshing_dialog.ui) cgal_lab_plugin(offset_meshing_plugin Offset_meshing_plugin ${offsetMeshingUI_FILES}) -target_link_libraries(offset_meshing_plugin PUBLIC scene_surface_mesh_item +target_link_libraries(offset_meshing_plugin PRIVATE scene_surface_mesh_item scene_polygon_soup_item scene_polylines_item) if(TARGET CGAL::Eigen3_support) diff --git a/Lab/demo/Lab/Plugins/Operations_on_polyhedra/CMakeLists.txt b/Lab/demo/Lab/Plugins/Operations_on_polyhedra/CMakeLists.txt index 3031fb3633e2..6ce91b90ed28 100644 --- a/Lab/demo/Lab/Plugins/Operations_on_polyhedra/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Operations_on_polyhedra/CMakeLists.txt @@ -3,34 +3,34 @@ qt6_wrap_ui(clip_polyhedronUI_FILES Clip_polyhedron_plugin.ui) cgal_lab_plugin(clip_polyhedron_plugin Clip_polyhedron_plugin ${clip_polyhedronUI_FILES}) target_link_libraries( - clip_polyhedron_plugin PUBLIC scene_surface_mesh_item scene_basic_objects + clip_polyhedron_plugin PRIVATE scene_surface_mesh_item scene_basic_objects scene_movable_sm_item) cgal_lab_plugin(point_set_from_vertices_plugin Point_set_from_vertices_plugin) target_link_libraries( point_set_from_vertices_plugin - PUBLIC scene_surface_mesh_item scene_polygon_soup_item + PRIVATE scene_surface_mesh_item scene_polygon_soup_item scene_points_with_normal_item) cgal_lab_plugin(point_set_from_sampling_plugin Point_set_from_sampling_plugin) target_link_libraries( point_set_from_sampling_plugin - PUBLIC scene_surface_mesh_item scene_polygon_soup_item + PRIVATE scene_surface_mesh_item scene_polygon_soup_item scene_points_with_normal_item) cgal_lab_plugin(diff_between_meshes_plugin Diff_between_meshes_plugin) -target_link_libraries(diff_between_meshes_plugin PUBLIC scene_surface_mesh_item) +target_link_libraries(diff_between_meshes_plugin PRIVATE scene_surface_mesh_item) qt6_wrap_ui( animateUI_FILES Animate_widget.ui ) cgal_lab_plugin(animate_mesh_plugin Animate_mesh_plugin ${animateUI_FILES}) - target_link_libraries(animate_mesh_plugin PUBLIC scene_surface_mesh_item) + target_link_libraries(animate_mesh_plugin PRIVATE scene_surface_mesh_item) if( TARGET CGAL::METIS_support ) qt6_wrap_ui( partitionUI_FILES PartitionDialog.ui ) cgal_lab_plugin(partition_plugin Partition_graph_plugin ${partitionUI_FILES}) - target_link_libraries(partition_plugin PUBLIC scene_surface_mesh_item CGAL::METIS_support ) + target_link_libraries(partition_plugin PRIVATE scene_surface_mesh_item CGAL::METIS_support ) else() message(STATUS "NOTICE: the Partition plugin needs METIS libraries and will not be compiled.") endif() diff --git a/Lab/demo/Lab/Plugins/PCA/CMakeLists.txt b/Lab/demo/Lab/Plugins/PCA/CMakeLists.txt index 1311f8a77a52..db919338b440 100644 --- a/Lab/demo/Lab/Plugins/PCA/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/PCA/CMakeLists.txt @@ -1,37 +1,37 @@ include(CGALlab_macros) cgal_lab_plugin(pca_plugin Pca_plugin KEYWORDS PointSetProcessing) target_link_libraries( - pca_plugin PUBLIC scene_surface_mesh_item scene_points_with_normal_item - scene_basic_objects) + pca_plugin PRIVATE scene_surface_mesh_item scene_points_with_normal_item + scene_basic_objects CGAL::Eigen3_support) qt6_wrap_ui(transformUI_FILES Transformation_widget.ui MeshOnGrid_dialog.ui) cgal_lab_plugin(affine_transform_plugin Affine_transform_plugin ${transformUI_FILES} KEYWORDS PointSetProcessing) -target_link_libraries(affine_transform_plugin PUBLIC scene_surface_mesh_item - scene_points_with_normal_item - scene_aff_transformed_item - scene_aff_transformed_point_set_item - scene_aff_transformed_polygon_soup_item - scene_aff_transformed_surface_mesh_item) +target_link_libraries(affine_transform_plugin PRIVATE scene_surface_mesh_item + scene_points_with_normal_item + scene_aff_transformed_item + scene_aff_transformed_point_set_item + scene_aff_transformed_polygon_soup_item + scene_aff_transformed_surface_mesh_item) cgal_lab_plugin(edit_box_plugin Edit_box_plugin) -target_link_libraries(edit_box_plugin PUBLIC scene_edit_box_item - scene_surface_mesh_item) +target_link_libraries(edit_box_plugin PRIVATE scene_edit_box_item + scene_surface_mesh_item) qt6_wrap_ui(clipUI_FILES Clipping_box_widget.ui) cgal_lab_plugin(clipping_box_plugin Clipping_box_plugin ${clipUI_FILES}) -target_link_libraries(clipping_box_plugin PUBLIC scene_edit_box_item - scene_basic_objects) +target_link_libraries(clipping_box_plugin PRIVATE scene_edit_box_item + scene_basic_objects) cgal_lab_plugin(create_bbox_mesh_plugin Create_bbox_mesh_plugin) -target_link_libraries(create_bbox_mesh_plugin PUBLIC scene_surface_mesh_item) +target_link_libraries(create_bbox_mesh_plugin PRIVATE scene_surface_mesh_item) cgal_lab_plugin(create_obb_mesh_plugin Create_obb_mesh_plugin) -target_link_libraries(create_obb_mesh_plugin PUBLIC scene_surface_mesh_item - scene_polygon_soup_item - scene_selection_item - scene_points_with_normal_item CGAL::Eigen3_support) +target_link_libraries(create_obb_mesh_plugin PRIVATE scene_surface_mesh_item + scene_polygon_soup_item + scene_selection_item + scene_points_with_normal_item CGAL::Eigen3_support) qt6_wrap_ui(volumesUI_FILES Basic_generator_widget.ui) cgal_lab_plugin( @@ -39,11 +39,11 @@ cgal_lab_plugin( PolygonMesh PointSetProcessing) target_link_libraries( basic_generator_plugin - PUBLIC scene_surface_mesh_item scene_points_with_normal_item - scene_polylines_item) - - if(CGAL_ENABLE_TESTING AND NOT CMAKE_VS_MSBUILD_COMMAND) - set_tests_properties( - "compilation of create_obb_mesh_plugin" - PROPERTIES RESOURCE_LOCK Selection_test_resources) - endif() + PRIVATE scene_surface_mesh_item scene_points_with_normal_item + scene_polylines_item) + +if(CGAL_ENABLE_TESTING AND NOT CMAKE_VS_MSBUILD_COMMAND) + set_tests_properties( + "compilation of create_obb_mesh_plugin" + PROPERTIES RESOURCE_LOCK Selection_test_resources) +endif() diff --git a/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt b/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt index 6d023a5b4ce5..dc5b8387f2ca 100644 --- a/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt @@ -3,7 +3,7 @@ include(CGALlab_macros) if(TARGET CGAL::Eigen3_support) cgal_lab_plugin(jet_fitting_plugin Jet_fitting_plugin) target_link_libraries( - jet_fitting_plugin PUBLIC scene_surface_mesh_item scene_polylines_item + jet_fitting_plugin PRIVATE scene_surface_mesh_item scene_polylines_item CGAL::Eigen3_support) else() message(STATUS "NOTICE: Eigen 3.1 (or greater) was not found. Jet fitting plugin will not be available.") @@ -13,7 +13,7 @@ if(TARGET CGAL::Eigen3_support) cgal_lab_plugin(interpolated_corrected_principal_curvatures_plugin Interpolated_corrected_principal_curvatures_plugin) target_link_libraries( - interpolated_corrected_principal_curvatures_plugin PUBLIC scene_surface_mesh_item scene_polylines_item + interpolated_corrected_principal_curvatures_plugin PRIVATE scene_surface_mesh_item scene_polylines_item CGAL::Eigen3_support) else() @@ -24,23 +24,23 @@ else() endif() cgal_lab_plugin(extrude_plugin Extrude_plugin KEYWORDS PMP) -target_link_libraries(extrude_plugin PUBLIC scene_surface_mesh_item +target_link_libraries(extrude_plugin PRIVATE scene_surface_mesh_item scene_selection_item) if(TARGET CGAL::Eigen3_support) if("${EIGEN3_VERSION}" VERSION_GREATER "3.1.90") qt6_wrap_ui( hole_fillingUI_FILES Hole_filling_widget.ui) cgal_lab_plugin(hole_filling_plugin Hole_filling_plugin ${hole_fillingUI_FILES} KEYWORDS PMP) - target_link_libraries(hole_filling_plugin PUBLIC scene_surface_mesh_item scene_polylines_item scene_selection_item CGAL::Eigen3_support) + target_link_libraries(hole_filling_plugin PRIVATE scene_surface_mesh_item scene_polylines_item scene_selection_item CGAL::Eigen3_support) qt6_wrap_ui( fairingUI_FILES Fairing_widget.ui) cgal_lab_plugin(fairing_plugin Fairing_plugin ${fairingUI_FILES} KEYWORDS PMP) - target_link_libraries(fairing_plugin PUBLIC scene_selection_item CGAL::Eigen3_support) + target_link_libraries(fairing_plugin PRIVATE scene_selection_item CGAL::Eigen3_support) qt6_wrap_ui( Mean_curvature_flow_skeleton_pluginUI_FILES Mean_curvature_flow_skeleton_plugin.ui) cgal_lab_plugin(mean_curvature_flow_skeleton_plugin Mean_curvature_flow_skeleton_plugin ${Mean_curvature_flow_skeleton_pluginUI_FILES}) target_link_libraries(mean_curvature_flow_skeleton_plugin - PUBLIC + PRIVATE scene_surface_mesh_item scene_points_with_normal_item scene_polylines_item @@ -50,7 +50,7 @@ if(TARGET CGAL::Eigen3_support) # The smoothing plugin can still do some things, even if Ceres is not found qt6_wrap_ui( smoothingUI_FILES Smoothing_plugin.ui Smoothing_tangential_relaxation.ui) cgal_lab_plugin(smoothing_plugin Smoothing_plugin ${smoothingUI_FILES}) - target_link_libraries(smoothing_plugin PUBLIC scene_surface_mesh_item scene_selection_item CGAL::Eigen3_support) + target_link_libraries(smoothing_plugin PRIVATE scene_surface_mesh_item scene_selection_item CGAL::Eigen3_support) find_package(Ceres QUIET) include(CGAL_Ceres_support) if(TARGET CGAL::Ceres_support) @@ -66,7 +66,7 @@ if(TARGET CGAL::Eigen3_support) qt6_wrap_ui(remeshPlanarPatchesUI_FILES Remesh_planar_patches_dialog.ui) cgal_lab_plugin(remesh_planar_patches_plugin Remesh_planar_patches_plugin ${remeshPlanarPatchesUI_FILES} KEYWORDS PMP) - target_link_libraries(remesh_planar_patches_plugin PUBLIC scene_surface_mesh_item CGAL::Eigen3_support) + target_link_libraries(remesh_planar_patches_plugin PRIVATE scene_surface_mesh_item CGAL::Eigen3_support) if(CGAL_ENABLE_TESTING AND NOT CMAKE_VS_MSBUILD_COMMAND) set_tests_properties( @@ -89,51 +89,51 @@ qt6_wrap_ui(soupUI_FILES Repair_soup.ui) cgal_lab_plugin(orient_soup_plugin Orient_soup_plugin ${soupUI_FILES} KEYWORDS Classification PMP) target_link_libraries( - orient_soup_plugin PUBLIC scene_polygon_soup_item scene_surface_mesh_item + orient_soup_plugin PRIVATE scene_polygon_soup_item scene_surface_mesh_item scene_polylines_item scene_points_with_normal_item) cgal_lab_plugin(inside_out_plugin Inside_out_plugin KEYWORDS PMP) -target_link_libraries(inside_out_plugin PUBLIC scene_surface_mesh_item scene_polygon_soup_item) +target_link_libraries(inside_out_plugin PRIVATE scene_surface_mesh_item scene_polygon_soup_item) cgal_lab_plugin(join_and_split_plugin Join_and_split_polyhedra_plugin KEYWORDS PMP) -target_link_libraries(join_and_split_plugin PUBLIC scene_surface_mesh_item scene_selection_item) +target_link_libraries(join_and_split_plugin PRIVATE scene_surface_mesh_item scene_selection_item) qt6_wrap_ui( point_inside_polyhedronUI_FILES Point_inside_polyhedron_widget.ui) cgal_lab_plugin(point_inside_polyhedron_plugin Point_inside_polyhedron_plugin ${point_inside_polyhedronUI_FILES}) -target_link_libraries(point_inside_polyhedron_plugin PUBLIC scene_surface_mesh_item scene_points_with_normal_item) +target_link_libraries(point_inside_polyhedron_plugin PRIVATE scene_surface_mesh_item scene_points_with_normal_item) qt6_wrap_ui( polyhedron_slicerUI_FILES Polyhedron_slicer_widget.ui) cgal_lab_plugin(polyhedron_slicer_plugin Polyhedron_slicer_plugin ${polyhedron_slicerUI_FILES}) -target_link_libraries(polyhedron_slicer_plugin PUBLIC scene_surface_mesh_item scene_basic_objects scene_polylines_item) +target_link_libraries(polyhedron_slicer_plugin PRIVATE scene_surface_mesh_item scene_basic_objects scene_polylines_item) cgal_lab_plugin(polyhedron_stitching_plugin Polyhedron_stitching_plugin KEYWORDS PMP) -target_link_libraries(polyhedron_stitching_plugin PUBLIC scene_surface_mesh_item scene_polylines_item) +target_link_libraries(polyhedron_stitching_plugin PRIVATE scene_surface_mesh_item scene_polylines_item) qt6_wrap_ui( selectionUI_FILES Selection_widget.ui) cgal_lab_plugin(selection_plugin Selection_plugin ${selectionUI_FILES} KEYWORDS PMP Viewer Classification Mesh_3) -target_link_libraries(selection_plugin PUBLIC scene_selection_item scene_points_with_normal_item scene_polylines_item) +target_link_libraries(selection_plugin PRIVATE scene_selection_item scene_points_with_normal_item scene_polylines_item) #to keep it simple to compile add_custom_target(self_intersection_plugin) add_dependencies(self_intersection_plugin selection_plugin) cgal_lab_plugin(triangulate_facets_plugin Triangulate_facets_plugin KEYWORDS PMP) -target_link_libraries(triangulate_facets_plugin PUBLIC scene_surface_mesh_item scene_selection_item scene_polygon_soup_item) +target_link_libraries(triangulate_facets_plugin PRIVATE scene_surface_mesh_item scene_selection_item scene_polygon_soup_item) cgal_lab_plugin(corefinement_plugin Corefinement_plugin KEYWORDS PMP) -target_link_libraries(corefinement_plugin PUBLIC scene_surface_mesh_item) +target_link_libraries(corefinement_plugin PRIVATE scene_surface_mesh_item) cgal_lab_plugin(surface_intersection_plugin Surface_intersection_plugin KEYWORDS PMP) target_link_libraries( surface_intersection_plugin - PUBLIC scene_surface_mesh_item scene_polylines_item + PRIVATE scene_surface_mesh_item scene_polylines_item scene_points_with_normal_item) qt6_wrap_ui( repairUI_FILES RemoveNeedlesDialog.ui SelfSnapDialog.ui AddBboxDialog.ui) cgal_lab_plugin(repair_polyhedron_plugin Repair_polyhedron_plugin ${repairUI_FILES} KEYWORDS PMP) -target_link_libraries(repair_polyhedron_plugin PUBLIC scene_points_with_normal_item scene_surface_mesh_item scene_polygon_soup_item) +target_link_libraries(repair_polyhedron_plugin PRIVATE scene_points_with_normal_item scene_surface_mesh_item scene_polygon_soup_item) if(TARGET CGAL::TBB_support) target_link_libraries(repair_polyhedron_plugin PRIVATE CGAL::TBB_support) endif() @@ -142,7 +142,7 @@ if(TARGET CGAL::Eigen3_support) qt6_wrap_ui(isotropicRemeshingUI_FILES Isotropic_remeshing_dialog.ui) cgal_lab_plugin(isotropic_remeshing_plugin Isotropic_remeshing_plugin ${isotropicRemeshingUI_FILES} KEYWORDS PMP) - target_link_libraries(isotropic_remeshing_plugin PUBLIC scene_surface_mesh_item + target_link_libraries(isotropic_remeshing_plugin PRIVATE scene_surface_mesh_item scene_selection_item CGAL::Eigen3_support) if(TARGET CGAL::TBB_support) @@ -154,31 +154,31 @@ else() endif() cgal_lab_plugin(distance_plugin Distance_plugin KEYWORDS PMP) -target_link_libraries(distance_plugin PUBLIC scene_surface_mesh_item +target_link_libraries(distance_plugin PRIVATE scene_surface_mesh_item scene_color_ramp) if(TARGET CGAL::TBB_support) target_link_libraries(distance_plugin PRIVATE CGAL::TBB_support) endif() cgal_lab_plugin(detect_sharp_edges_plugin Detect_sharp_edges_plugin KEYWORDS Viewer Mesh_3 PMP) -target_link_libraries(detect_sharp_edges_plugin PUBLIC scene_surface_mesh_item) +target_link_libraries(detect_sharp_edges_plugin PRIVATE scene_surface_mesh_item) qt6_wrap_ui(randomPerturbationUI_FILES Random_perturbation_dialog.ui) cgal_lab_plugin(random_perturbation_plugin Random_perturbation_plugin ${randomPerturbationUI_FILES} KEYWORDS PMP) -target_link_libraries(random_perturbation_plugin PUBLIC scene_surface_mesh_item +target_link_libraries(random_perturbation_plugin PRIVATE scene_surface_mesh_item scene_selection_item) cgal_lab_plugin(degenerated_faces_plugin Degenerated_faces_plugin KEYWORDS PMP) -target_link_libraries(degenerated_faces_plugin PUBLIC scene_surface_mesh_item +target_link_libraries(degenerated_faces_plugin PRIVATE scene_surface_mesh_item scene_selection_item) qt6_wrap_ui(engravUI_FILES Engrave_dock_widget.ui) cgal_lab_plugin(engrave_text_plugin Engrave_text_plugin ${engravUI_FILES}) target_link_libraries( - engrave_text_plugin PUBLIC scene_surface_mesh_item scene_selection_item + engrave_text_plugin PRIVATE scene_surface_mesh_item scene_selection_item scene_polylines_item CGAL::Eigen3_support) diff --git a/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt b/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt index b088ff9a0f38..6ea28f077af6 100644 --- a/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt @@ -37,8 +37,8 @@ if(TARGET CGAL::Eigen3_support) PointSetProcessing) target_link_libraries( surface_reconstruction_plugin - PUBLIC scene_polygon_soup_item scene_surface_mesh_item - scene_points_with_normal_item CGAL::Eigen3_support) + PRIVATE scene_polygon_soup_item scene_surface_mesh_item + scene_points_with_normal_item CGAL::Eigen3_support) if(TARGET CGAL::SCIP_support) target_link_libraries(surface_reconstruction_plugin PRIVATE CGAL::SCIP_support) @@ -54,31 +54,31 @@ if(TARGET CGAL::Eigen3_support) Classification) target_link_libraries( point_set_normal_estimation_plugin - PUBLIC scene_points_with_normal_item scene_callback_signaler - CGAL::Eigen3_support) + PRIVATE scene_points_with_normal_item scene_callback_signaler + CGAL::Eigen3_support) qt6_wrap_ui(features_detection_pluginUI_FILES Features_detection_plugin.ui) cgal_lab_plugin( features_detection_plugin Features_detection_plugin ${features_detection_pluginUI_FILES} KEYWORDS PointSetProcessing) target_link_libraries( - features_detection_plugin PUBLIC scene_points_with_normal_item - CGAL::Eigen3_support) + features_detection_plugin PRIVATE scene_points_with_normal_item + CGAL::Eigen3_support) cgal_lab_plugin(point_set_smoothing_plugin Point_set_smoothing_plugin KEYWORDS PointSetProcessing) target_link_libraries( point_set_smoothing_plugin - PUBLIC scene_points_with_normal_item scene_callback_signaler - CGAL::Eigen3_support) + PRIVATE scene_points_with_normal_item scene_callback_signaler + CGAL::Eigen3_support) cgal_lab_plugin( point_set_average_spacing_plugin Point_set_average_spacing_plugin KEYWORDS PointSetProcessing Classification) target_link_libraries( point_set_average_spacing_plugin - PUBLIC scene_points_with_normal_item scene_callback_signaler - CGAL::Eigen3_support) + PRIVATE scene_points_with_normal_item scene_callback_signaler + CGAL::Eigen3_support) qt6_wrap_ui(point_set_shape_detectionUI_FILES Point_set_shape_detection_plugin.ui) @@ -88,8 +88,8 @@ if(TARGET CGAL::Eigen3_support) Classification) target_link_libraries( point_set_shape_detection_plugin - PUBLIC scene_surface_mesh_item scene_points_with_normal_item - scene_polygon_soup_item scene_callback_signaler CGAL::Eigen3_support) + PRIVATE scene_surface_mesh_item scene_points_with_normal_item + scene_polygon_soup_item scene_callback_signaler CGAL::Eigen3_support) if (NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1910) find_package(OpenGR QUIET) include(CGAL_OpenGR_support) @@ -108,7 +108,7 @@ if(TARGET CGAL::Eigen3_support) register_point_sets_plugin Register_point_sets_plugin ${register_point_setsUI_FILES} KEYWORDS PointSetProcessing) target_link_libraries(register_point_sets_plugin - PUBLIC scene_points_with_normal_item) + PRIVATE scene_points_with_normal_item) target_link_libraries(register_point_sets_plugin PRIVATE CGAL::Eigen3_support) if(TARGET CGAL::OpenGR_support) target_link_libraries(register_point_sets_plugin @@ -135,67 +135,67 @@ cgal_lab_plugin( point_set_bilateral_smoothing_plugin Point_set_bilateral_smoothing_plugin ${point_set_bilateral_smoothingUI_FILES} KEYWORDS PointSetProcessing) target_link_libraries( - point_set_bilateral_smoothing_plugin PUBLIC scene_points_with_normal_item - scene_callback_signaler) + point_set_bilateral_smoothing_plugin PRIVATE scene_points_with_normal_item + scene_callback_signaler) qt6_wrap_ui(ps_outliers_removal_UI_FILES Point_set_outliers_removal_plugin.ui) cgal_lab_plugin( point_set_outliers_removal_plugin Point_set_outliers_removal_plugin ${ps_outliers_removal_UI_FILES} KEYWORDS PointSetProcessing) target_link_libraries( - point_set_outliers_removal_plugin PUBLIC scene_points_with_normal_item - scene_callback_signaler) + point_set_outliers_removal_plugin PRIVATE scene_points_with_normal_item + scene_callback_signaler) qt6_wrap_ui(point_set_selectionUI_FILES Point_set_selection_widget.ui) cgal_lab_plugin( point_set_selection_plugin Point_set_selection_plugin ${point_set_selectionUI_FILES} KEYWORDS PointSetProcessing Classification) target_link_libraries( - point_set_selection_plugin PUBLIC scene_points_with_normal_item - scene_polylines_item scene_edit_box_item) + point_set_selection_plugin PRIVATE scene_points_with_normal_item + scene_polylines_item scene_edit_box_item CGAL::Eigen3_support) qt6_wrap_ui(point_set_simplificationUI_FILES Point_set_simplification_plugin.ui) cgal_lab_plugin( point_set_simplification_plugin Point_set_simplification_plugin ${point_set_simplificationUI_FILES} KEYWORDS PointSetProcessing) target_link_libraries( - point_set_simplification_plugin PUBLIC scene_points_with_normal_item - scene_callback_signaler) + point_set_simplification_plugin PRIVATE scene_points_with_normal_item + scene_callback_signaler CGAL::Eigen3_support) qt6_wrap_ui(point_set_upsamplingUI_FILES Point_set_upsampling_plugin.ui) cgal_lab_plugin( point_set_upsampling_plugin Point_set_upsampling_plugin ${point_set_upsamplingUI_FILES} KEYWORDS PointSetProcessing) target_link_libraries(point_set_upsampling_plugin - PUBLIC scene_points_with_normal_item) + PRIVATE scene_points_with_normal_item) qt6_wrap_ui(point_set_wlopFILES Point_set_wlop_plugin.ui) cgal_lab_plugin(point_set_wlop_plugin Point_set_wlop_plugin ${point_set_wlopFILES} KEYWORDS PointSetProcessing) -target_link_libraries(point_set_wlop_plugin PUBLIC scene_points_with_normal_item - scene_callback_signaler) +target_link_libraries(point_set_wlop_plugin PRIVATE scene_points_with_normal_item + scene_callback_signaler) cgal_lab_plugin(point_set_clustering_plugin Point_set_clustering_plugin KEYWORDS PointSetProcessing) target_link_libraries( - point_set_clustering_plugin PUBLIC scene_points_with_normal_item - scene_callback_signaler CGAL::Eigen3_support) + point_set_clustering_plugin PRIVATE scene_points_with_normal_item + scene_callback_signaler CGAL::Eigen3_support) cgal_lab_plugin(merge_point_sets_plugin Merge_point_sets_plugin KEYWORDS PointSetProcessing Classification) target_link_libraries(merge_point_sets_plugin - PUBLIC scene_points_with_normal_item) + PRIVATE scene_points_with_normal_item) cgal_lab_plugin( point_set_interference_plugin Point_set_interference_plugin KEYWORDS PointSetProcessing) target_link_libraries(point_set_interference_plugin - PUBLIC scene_points_with_normal_item) + PRIVATE scene_points_with_normal_item) qt6_wrap_ui(alpha_shapeUI_FILES Alpha_shape_widget.ui) cgal_lab_plugin(alpha_shape_plugin Alpha_shape_plugin ${alpha_shapeUI_FILES} KEYWORDS PointSetProcessing) -target_link_libraries(alpha_shape_plugin PUBLIC scene_points_with_normal_item +target_link_libraries(alpha_shape_plugin PRIVATE scene_points_with_normal_item scene_c3t3_item) qt6_wrap_ui(distanceUI_FILES Point_set_to_mesh_distance_widget.ui) @@ -204,7 +204,7 @@ cgal_lab_plugin( ${distanceUI_FILES} KEYWORDS PointSetProcessing) target_link_libraries( point_set_to_mesh_distance_plugin - PUBLIC scene_points_with_normal_item scene_surface_mesh_item scene_color_ramp) + PRIVATE scene_points_with_normal_item scene_surface_mesh_item scene_color_ramp) if(TARGET CGAL::TBB_support) foreach( diff --git a/Lab/demo/Lab/Plugins/Subdivision_methods/CMakeLists.txt b/Lab/demo/Lab/Plugins/Subdivision_methods/CMakeLists.txt index 2e7afa092be1..c229e785147d 100644 --- a/Lab/demo/Lab/Plugins/Subdivision_methods/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Subdivision_methods/CMakeLists.txt @@ -1,4 +1,4 @@ include(CGALlab_macros) cgal_lab_plugin(subdivision_methods_plugin Subdivision_methods_plugin) -target_link_libraries(subdivision_methods_plugin PUBLIC scene_surface_mesh_item) +target_link_libraries(subdivision_methods_plugin PRIVATE scene_surface_mesh_item) diff --git a/Lab/demo/Lab/Plugins/Surface_mesh/CMakeLists.txt b/Lab/demo/Lab/Plugins/Surface_mesh/CMakeLists.txt index 2b8cabec2b6d..a08a9c5135c3 100644 --- a/Lab/demo/Lab/Plugins/Surface_mesh/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Surface_mesh/CMakeLists.txt @@ -11,7 +11,7 @@ if(NOT CGAL_DISABLE_GMP) cgal_lab_plugin(parameterization_plugin Parameterization_plugin ${parameterizationUI_FILES}) target_link_libraries( - parameterization_plugin PUBLIC scene_surface_mesh_item scene_textured_item + parameterization_plugin PRIVATE scene_surface_mesh_item scene_textured_item scene_selection_item CGAL::Eigen3_support) if(CGAL_ENABLE_TESTING AND NOT CMAKE_VS_MSBUILD_COMMAND) @@ -27,7 +27,7 @@ if(NOT CGAL_DISABLE_GMP) qt6_wrap_ui(segmentationUI_FILES Mesh_segmentation_widget.ui) cgal_lab_plugin(mesh_segmentation_plugin Mesh_segmentation_plugin ${segmentationUI_FILES}) - target_link_libraries(mesh_segmentation_plugin PUBLIC scene_surface_mesh_item) + target_link_libraries(mesh_segmentation_plugin PRIVATE scene_surface_mesh_item) if(CGAL_ENABLE_TESTING AND NOT CMAKE_VS_MSBUILD_COMMAND) set_tests_properties( @@ -37,13 +37,13 @@ if(NOT CGAL_DISABLE_GMP) qt6_wrap_ui( mesh_simplificationUI_FILES Mesh_simplification_dialog.ui) cgal_lab_plugin(mesh_simplification_plugin Mesh_simplification_plugin ${mesh_simplificationUI_FILES}) - target_link_libraries(mesh_simplification_plugin PUBLIC scene_surface_mesh_item scene_selection_item) + target_link_libraries(mesh_simplification_plugin PRIVATE scene_surface_mesh_item scene_selection_item) qt6_wrap_ui(shortestPathUI_FILES Shortest_path_widget.ui) cgal_lab_plugin(shortest_path_plugin Shortest_path_plugin ${shortestPathUI_FILES}) target_link_libraries( - shortest_path_plugin PUBLIC scene_surface_mesh_item scene_shortest_path_item + shortest_path_plugin PRIVATE scene_surface_mesh_item scene_shortest_path_item scene_basic_objects) qt6_wrap_ui(basicUI_FILES Surface_mesh_approximation_dockwidget.ui) @@ -52,7 +52,7 @@ if(NOT CGAL_DISABLE_GMP) ${basicUI_FILES} VSA_wrapper.cpp) target_link_libraries( surface_mesh_approximation_plugin - PUBLIC scene_surface_mesh_item scene_polygon_soup_item scene_polylines_item) + PRIVATE scene_surface_mesh_item scene_polygon_soup_item scene_polylines_item CGAL::Eigen3_support) else() message(STATUS "NOTICE: Some tests require the CGAL_Core library, and will not be compiled.") endif() diff --git a/Lab/demo/Lab/Plugins/Surface_mesh_deformation/CMakeLists.txt b/Lab/demo/Lab/Plugins/Surface_mesh_deformation/CMakeLists.txt index 56a87f647fd7..e4cfaa821d42 100644 --- a/Lab/demo/Lab/Plugins/Surface_mesh_deformation/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Surface_mesh_deformation/CMakeLists.txt @@ -11,7 +11,7 @@ if(TARGET CGAL::Eigen3_support AND "${EIGEN3_VERSION}" VERSION_GREATER "3.1.90") scene_k_ring_selection scene_basic_objects) cgal_lab_plugin(edit_plugin Edit_polyhedron_plugin Deform_mesh.ui) - target_link_libraries(edit_plugin PUBLIC scene_surface_mesh_item + target_link_libraries(edit_plugin PRIVATE scene_surface_mesh_item scene_edit_item scene_selection_item) if(CGAL_ENABLE_TESTING AND NOT CMAKE_VS_MSBUILD_COMMAND) diff --git a/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt b/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt index 1bd5a681ae3b..c79de635f857 100644 --- a/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt @@ -11,7 +11,7 @@ qt6_wrap_ui(tetRemeshingUI_FILES Tetrahedral_remeshing_dialog.ui) cgal_lab_plugin( tetrahedral_remeshing_plugin Tetrahedral_remeshing_plugin ${tetRemeshingUI_FILES} KEYWORDS Tetrahedral_remeshing) -target_link_libraries(tetrahedral_remeshing_plugin PUBLIC scene_c3t3_item +target_link_libraries(tetrahedral_remeshing_plugin PRIVATE scene_c3t3_item ${OPENGL_gl_LIBRARY}) find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) diff --git a/Lab/demo/Lab/Plugins/Three_examples/CMakeLists.txt b/Lab/demo/Lab/Plugins/Three_examples/CMakeLists.txt index a8548598c38b..71dab011d581 100644 --- a/Lab/demo/Lab/Plugins/Three_examples/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Three_examples/CMakeLists.txt @@ -28,5 +28,5 @@ if(RUNNING_CGAL_AUTO_TEST OR CGAL_TEST_SUITE) cgal_lab_plugin(basic_item_plugin Basic_item_plugin) # links the library containing the scene_plane_item with the plugin - target_link_libraries(basic_item_plugin PUBLIC scene_basic_objects) + target_link_libraries(basic_item_plugin PRIVATE scene_basic_objects) endif() diff --git a/Lab/demo/Lab/Scene_image_item.cpp b/Lab/demo/Lab/Scene_image_item.cpp index d68076d13029..25f58c09ce20 100644 --- a/Lab/demo/Lab/Scene_image_item.cpp +++ b/Lab/demo/Lab/Scene_image_item.cpp @@ -465,7 +465,6 @@ struct Scene_image_item_priv void draw_Bbox(Scene_item::Bbox bbox, std::vector *vertices); bool m_initialized; -//#ifdef SCENE_SEGMENTED_IMAGE_GL_BUFFERS_AVAILABLE int m_voxel_scale; std::vector v_box; std::size_t idx_size, box_size; @@ -476,7 +475,6 @@ struct Scene_image_item_priv Image m_image_weights; float m_sigma_weights; -//#endif // SCENE_SEGMENTED_IMAGE_GL_BUFFERS_AVAILABLE }; // ----------------------------------- // Scene_image_item From a5d2dbebec1f3506d10ad41f563efcccdc2fb9ff Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 14 Oct 2024 18:16:50 +0200 Subject: [PATCH 314/348] remove an added empty line --- STL_Extension/include/CGAL/assertions.h | 1 - 1 file changed, 1 deletion(-) diff --git a/STL_Extension/include/CGAL/assertions.h b/STL_Extension/include/CGAL/assertions.h index d802ed3a3b9f..cf793f466bee 100644 --- a/STL_Extension/include/CGAL/assertions.h +++ b/STL_Extension/include/CGAL/assertions.h @@ -19,7 +19,6 @@ #ifndef CGAL_ASSERTIONS_H #define CGAL_ASSERTIONS_H - #include // #include // for backward compatibility From ef659a464b0b618128777c3025a8c564deb558b5 Mon Sep 17 00:00:00 2001 From: Sebastien Loriot Date: Tue, 15 Oct 2024 09:29:48 +0200 Subject: [PATCH 315/348] fix typo Co-authored-by: Andreas Fabri --- .../include/CGAL/Arr_polycurve_basic_traits_2.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h index eb4cbf5c710f..f540146b2cb4 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h @@ -976,10 +976,10 @@ class Arr_polycurve_basic_traits_2 { while ((i < (n1-1)) || (j < (n2-1))) { std::size_t cv1_seg_ind = (SMALLER == is_cv1_left_to_right) ? - i : cv1_seg_ind = n1 - 1 - i; + i : n1 - 1 - i; auto point1 = max_vertex(cv1[cv1_seg_ind]); std::size_t cv2_seg_ind = (SMALLER == is_cv2_left_to_right) ? - j : cv2_seg_ind = n2 - 1 - j; + j : n2 - 1 - j; auto point2 = max_vertex(cv2[cv2_seg_ind]); bool res = equal(point1, point2); // Easy case - the two points are equal From 7d0c6014ddc3df91258b331f34902f1ac59a3f66 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 15 Oct 2024 08:37:58 +0100 Subject: [PATCH 316/348] Add a testcase that shows the reported issue (when disabling the fix) --- Polygon/test/Polygon/issue7934.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 Polygon/test/Polygon/issue7934.cpp diff --git a/Polygon/test/Polygon/issue7934.cpp b/Polygon/test/Polygon/issue7934.cpp new file mode 100644 index 000000000000..c43d3661362a --- /dev/null +++ b/Polygon/test/Polygon/issue7934.cpp @@ -0,0 +1,22 @@ +#include +#include +#include +#include + +using Kernel = CGAL::Exact_predicates_exact_constructions_kernel; +using Point_2 = Kernel::Point_2; +using Polygon_2 = CGAL::Polygon_2; + +int main() +{ + Polygon_2 polygon; + for (int i = 0; i < 200000; ++i) { + polygon.push_back(Point_2(i* 1.04663, 0)); + } + polygon.push_back(Point_2( 3.1415, 3.1415)); + + auto ar = CGAL::polygon_area_2(polygon.vertices_begin(), polygon.vertices_end(), Kernel()); + + std::cout << "done" << std::endl; + return 0; +} \ No newline at end of file From 8c18ff3d0f0cd4acebe97f4b2087e11949140f8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 15 Oct 2024 09:49:20 +0200 Subject: [PATCH 317/348] avoid collision with minor macro --- .../Policies/Edge_collapse/internal/Lindstrom_Turk_core.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h index d97688dde8bd..1d20c428152a 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h @@ -190,7 +190,7 @@ private : const FT ax=a.x(), ay=a.y(), az=a.z(); const FT bx=b.x(), by=b.y(), bz=b.z(); - auto minor = [](double ai, double bi, double aj, double bj) + auto compute_minor = [](double ai, double bi, double aj, double bj) { // The main idea is that we expect ai and bi (and aj and bj) to have roughly the same magnitude // since this function is used to compute the cross product of two vectors that are defined @@ -201,9 +201,9 @@ private : }; // ay* - FT x = minor(ay, by, az, bz); - FT y = minor(az, bz, ax, bx); - FT z = minor(ax, bx, ay, by); + FT x = compute_minor(ay, by, az, bz); + FT y = compute_minor(az, bz, ax, bx); + FT z = compute_minor(ax, bx, ay, by); return Vector(x, y, z); } From 67da146c62c8bc0ed8e567c40c884b205dc2e5ca Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 15 Oct 2024 08:49:25 +0100 Subject: [PATCH 318/348] WS --- Polygon/test/Polygon/issue7934.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon/test/Polygon/issue7934.cpp b/Polygon/test/Polygon/issue7934.cpp index c43d3661362a..ca9128cc8352 100644 --- a/Polygon/test/Polygon/issue7934.cpp +++ b/Polygon/test/Polygon/issue7934.cpp @@ -16,7 +16,7 @@ int main() polygon.push_back(Point_2( 3.1415, 3.1415)); auto ar = CGAL::polygon_area_2(polygon.vertices_begin(), polygon.vertices_end(), Kernel()); - + std::cout << "done" << std::endl; return 0; } \ No newline at end of file From db8b774729257b4e0959243206b73c99c8b08dfa Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 8 Oct 2024 16:09:04 +0200 Subject: [PATCH 319/348] method to allow to not correct attributes when changing automatic management mode. --- Combinatorial_map/include/CGAL/Combinatorial_map.h | 3 +++ Generalized_map/include/CGAL/Generalized_map.h | 3 +++ Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h | 6 +++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map.h b/Combinatorial_map/include/CGAL/Combinatorial_map.h index 5473aeaf277b..5135f5ec3273 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map.h @@ -3707,6 +3707,9 @@ namespace CGAL { this->automatic_attributes_management = newval; } + void set_automatic_attributes_management_without_correction(bool newval) + { this->automatic_attributes_management = newval; } + /** Create an half-edge. * @return a dart of the new half-edge. */ diff --git a/Generalized_map/include/CGAL/Generalized_map.h b/Generalized_map/include/CGAL/Generalized_map.h index 644c57c66857..4af0ee3a09ab 100644 --- a/Generalized_map/include/CGAL/Generalized_map.h +++ b/Generalized_map/include/CGAL/Generalized_map.h @@ -2946,6 +2946,9 @@ namespace CGAL { this->automatic_attributes_management = newval; } + void set_automatic_attributes_management_without_correction(bool newval) + { this->automatic_attributes_management = newval; } + /** Create an half-edge. * @return a dart of the new half-edge. */ diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h index 6681a4bb8b3c..b1943bca3c4b 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h @@ -836,7 +836,7 @@ namespace CGAL { /** Set the status of the management of the attributes of the Map */ - void set_update_attributes(bool newval) + void set_automatic_attributes_management(bool newval) { if (this->automatic_attributes_management == false && newval == true) { @@ -847,6 +847,10 @@ namespace CGAL { this->automatic_attributes_management = newval; } + + void set_automatic_attributes_management_without_correction(bool newval) + { this->automatic_attributes_management = newval; } + }; } // namespace CGAL From 5c04d1f56373024777215c041b230dc849e55fbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 15 Oct 2024 20:10:27 +0200 Subject: [PATCH 320/348] add some override keywords --- GraphicsView/include/CGAL/Qt/manipulatedFrame.h | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/manipulatedFrame.h b/GraphicsView/include/CGAL/Qt/manipulatedFrame.h index b763a646580e..52cc92105bad 100644 --- a/GraphicsView/include/CGAL/Qt/manipulatedFrame.h +++ b/GraphicsView/include/CGAL/Qt/manipulatedFrame.h @@ -270,13 +270,11 @@ private Q_SLOTS: /*! @name Mouse event handlers */ //@{ protected: - virtual void mousePressEvent(QMouseEvent *const event, Camera *const camera); - virtual void mouseMoveEvent(QMouseEvent *const event, Camera *const camera); - virtual void mouseReleaseEvent(QMouseEvent *const event, - Camera *const camera); - virtual void mouseDoubleClickEvent(QMouseEvent *const event, - Camera *const camera); - virtual void wheelEvent(QWheelEvent *const event, Camera *const camera); + void mousePressEvent (QMouseEvent *const event, Camera *const camera) override; + void mouseMoveEvent (QMouseEvent *const event, Camera *const camera) override; + void mouseReleaseEvent (QMouseEvent *const event, Camera *const camera) override; + void mouseDoubleClickEvent(QMouseEvent *const event, Camera *const camera) override; + void wheelEvent(QWheelEvent *const event, Camera *const camera) override; //@} public: @@ -299,7 +297,7 @@ private Q_SLOTS: /*! @name MouseGrabber implementation */ //@{ public: - virtual void checkIfGrabsMouse(int x, int y, const Camera *const camera); + void checkIfGrabsMouse(int x, int y, const Camera *const camera) override; //@} #ifndef DOXYGEN From b3762ede8840209251f1db0223aaa588bb11bcd4 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 16 Oct 2024 08:26:18 +0200 Subject: [PATCH 321/348] Rename set_update_attributes in set_automatic_attributes_management in LCC demo --- .../demo/Linear_cell_complex/MainWindow.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Linear_cell_complex/demo/Linear_cell_complex/MainWindow.cpp b/Linear_cell_complex/demo/Linear_cell_complex/MainWindow.cpp index 855d26e4bb69..04d956294943 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/MainWindow.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/MainWindow.cpp @@ -1012,7 +1012,7 @@ void MainWindow::on_actionMerge_coplanar_faces_triggered() timer.start(); #endif - scene.lcc->set_update_attributes(false); + scene.lcc->set_automatic_attributes_management(false); std::vector edges; LCC::size_type treated = scene.lcc->get_new_mark(); @@ -1073,7 +1073,7 @@ void MainWindow::on_actionMerge_coplanar_faces_triggered() scene.lcc->free_mark(treated); scene.lcc->free_mark(treated2); - scene.lcc->set_update_attributes(true); + scene.lcc->set_automatic_attributes_management(true); #ifdef CGAL_PROFILE_LCC_DEMO timer.stop(); @@ -1100,7 +1100,7 @@ void MainWindow::on_actionMerge_all_volumes_triggered() LCC::Dart_range::iterator prev; bool first = true; - scene.lcc->set_update_attributes(false); + scene.lcc->set_automatic_attributes_management(false); for (LCC::Dart_range::iterator it(scene.lcc->darts().begin()), itend=scene.lcc->darts().end(); it!=itend; ) @@ -1127,7 +1127,7 @@ void MainWindow::on_actionMerge_all_volumes_triggered() } } - scene.lcc->set_update_attributes(true); + scene.lcc->set_automatic_attributes_management(true); #ifdef CGAL_PROFILE_LCC_DEMO timer.stop(); @@ -1751,7 +1751,7 @@ void MainWindow::onMengerInc() if (!mengerUpdateAttributes) { - scene.lcc->set_update_attributes(false); + scene.lcc->set_automatic_attributes_management(false); } std::vector edges; @@ -1838,7 +1838,7 @@ void MainWindow::onMengerInc() update_volume_list_add(scene.lcc->attribute<3>(mengerVolumes[i])); } - scene.lcc->set_update_attributes(true); + scene.lcc->set_automatic_attributes_management(true); } #ifdef CGAL_PROFILE_LCC_DEMO From c0b59bd1179dcd8ec1d3971a5aac65a00cab3fcd Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 16 Oct 2024 17:34:26 +0200 Subject: [PATCH 322/348] second batch of modifications after review --- .../examples/Classification/CMakeLists.txt | 4 ++-- .../test/Classification/CMakeLists.txt | 4 ++-- Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt | 2 +- .../Lab/Plugins/Classification/CMakeLists.txt | 2 +- .../Lab/Plugins/Convex_hull/CMakeLists.txt | 2 +- Lab/demo/Lab/Plugins/Mesh_2/CMakeLists.txt | 2 +- Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt | 21 +++++++++---------- .../Operations_on_polyhedra/CMakeLists.txt | 6 +++--- Lab/demo/Lab/Plugins/PMP/CMakeLists.txt | 16 +++++++------- .../Lab/Plugins/Surface_mesh/CMakeLists.txt | 4 ++-- .../Surface_mesh_deformation/CMakeLists.txt | 4 ++-- .../Tetrahedral_remeshing/CMakeLists.txt | 2 +- 12 files changed, 34 insertions(+), 35 deletions(-) diff --git a/Classification/examples/Classification/CMakeLists.txt b/Classification/examples/Classification/CMakeLists.txt index 61060474db98..803d4279ead2 100644 --- a/Classification/examples/Classification/CMakeLists.txt +++ b/Classification/examples/Classification/CMakeLists.txt @@ -69,8 +69,8 @@ foreach(target example_deprecated_conversion) if(TARGET ${target}) target_link_libraries(${target} PRIVATE CGAL::Eigen3_support - CGAL::Boost_iostreams_support - CGAL::Boost_serialization_support) + CGAL::Boost_iostreams_support + CGAL::Boost_serialization_support) if(TARGET CGAL::TBB_support) target_link_libraries(${target} PRIVATE CGAL::TBB_support) endif() diff --git a/Classification/test/Classification/CMakeLists.txt b/Classification/test/Classification/CMakeLists.txt index 8b3ccbf3da3c..332dc9216d88 100644 --- a/Classification/test/Classification/CMakeLists.txt +++ b/Classification/test/Classification/CMakeLists.txt @@ -42,8 +42,8 @@ create_single_source_cgal_program("test_classification_io.cpp") foreach(target test_classification_point_set test_classification_io) target_link_libraries(${target} PRIVATE CGAL::Eigen3_support - CGAL::Boost_iostreams_support - CGAL::Boost_serialization_support) + CGAL::Boost_iostreams_support + CGAL::Boost_serialization_support) if(TARGET CGAL::TBB_support) target_link_libraries(${target} PRIVATE CGAL::TBB_support) endif() diff --git a/Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt b/Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt index a4c713f5d1be..d23f2fa03354 100644 --- a/Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/AABB_tree/CMakeLists.txt @@ -6,7 +6,7 @@ target_link_libraries(do_trees_intersect_plugin PRIVATE scene_surface_mesh_item cgal_lab_plugin(cut_plugin Cut_plugin) target_link_libraries(cut_plugin PRIVATE scene_surface_mesh_item - scene_basic_objects scene_color_ramp) + scene_basic_objects scene_color_ramp) if(TARGET CGAL::TBB_support) target_link_libraries(cut_plugin PRIVATE CGAL::TBB_support) endif() diff --git a/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt b/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt index a2e4c681a0f7..ac08fbe8cd35 100644 --- a/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Classification/CMakeLists.txt @@ -49,7 +49,7 @@ if(TARGET CGAL::Eigen3_support) if(TARGET CGAL::Boost_serialization_support AND TARGET CGAL::Boost_iostreams_support) target_link_libraries(classification_plugin PRIVATE CGAL::Boost_serialization_support - CGAL::Boost_iostreams_support) + CGAL::Boost_iostreams_support) endif() if(TARGET CGAL::OpenCV_support) diff --git a/Lab/demo/Lab/Plugins/Convex_hull/CMakeLists.txt b/Lab/demo/Lab/Plugins/Convex_hull/CMakeLists.txt index 019615e46379..1bee65e4e6f8 100644 --- a/Lab/demo/Lab/Plugins/Convex_hull/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Convex_hull/CMakeLists.txt @@ -4,7 +4,7 @@ cgal_lab_plugin(convex_hull_plugin Convex_hull_plugin KEYWORDS PointSetProcessing) target_link_libraries( convex_hull_plugin PRIVATE scene_points_with_normal_item scene_polylines_item - scene_selection_item scene_surface_mesh_item) + scene_selection_item scene_surface_mesh_item) cgal_lab_plugin(kernel_plugin Kernel_plugin) target_link_libraries(kernel_plugin PRIVATE scene_surface_mesh_item) diff --git a/Lab/demo/Lab/Plugins/Mesh_2/CMakeLists.txt b/Lab/demo/Lab/Plugins/Mesh_2/CMakeLists.txt index c2e925d04ffd..c028613b1e30 100644 --- a/Lab/demo/Lab/Plugins/Mesh_2/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Mesh_2/CMakeLists.txt @@ -5,4 +5,4 @@ cgal_lab_plugin(mesh_2_plugin Mesh_2_plugin ${mesh_2UI_FILES}) #if the plugin uses external libraries like scene_items target_link_libraries( mesh_2_plugin PRIVATE scene_surface_mesh_item scene_polylines_item - scene_points_with_normal_item) + scene_points_with_normal_item) diff --git a/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt b/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt index 8ca5ad54d5d9..acf4b0dfdc84 100644 --- a/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt @@ -20,12 +20,12 @@ cgal_lab_plugin( target_link_libraries( mesh_3_plugin PRIVATE scene_polygon_soup_item - scene_polylines_item - scene_implicit_function_item - scene_image_item - scene_surface_mesh_item - scene_c3t3_item - ${OPENGL_gl_LIBRARY}) + scene_polylines_item + scene_implicit_function_item + scene_image_item + scene_surface_mesh_item + scene_c3t3_item + ${OPENGL_gl_LIBRARY}) target_include_directories(mesh_3_plugin PRIVATE include) find_package(ITK NAMES ITK InsightToolkit @@ -58,8 +58,7 @@ if(Boost_FILESYSTEM_FOUND) target_compile_definitions(io_image_plugin PRIVATE -DCGAL_USE_VTK -DNOMINMAX) endif() - target_link_libraries(io_image_plugin PRIVATE Boost::filesystem - Boost::system) + target_link_libraries(io_image_plugin PRIVATE Boost::filesystem Boost::system) else() message(STATUS "NOTICE: the Io_image_plugin requires boost-filesystem, and will not be compiled") @@ -75,7 +74,7 @@ cgal_lab_plugin( target_link_libraries( mesh_3_optimization_plugin PRIVATE scene_c3t3_item scene_surface_mesh_item scene_image_item - scene_implicit_function_item) + scene_implicit_function_item) # Use Eigen find_package(Eigen3 3.1.0 QUIET) #(3.1.0 or greater) @@ -110,8 +109,8 @@ qt6_wrap_ui(offsetMeshingUI_FILES Offset_meshing_dialog.ui) cgal_lab_plugin(offset_meshing_plugin Offset_meshing_plugin ${offsetMeshingUI_FILES}) target_link_libraries(offset_meshing_plugin PRIVATE scene_surface_mesh_item - scene_polygon_soup_item - scene_polylines_item) + scene_polygon_soup_item + scene_polylines_item) if(TARGET CGAL::Eigen3_support) target_link_libraries(offset_meshing_plugin PRIVATE CGAL::Eigen3_support) endif() diff --git a/Lab/demo/Lab/Plugins/Operations_on_polyhedra/CMakeLists.txt b/Lab/demo/Lab/Plugins/Operations_on_polyhedra/CMakeLists.txt index 6ce91b90ed28..8e60e5f29d96 100644 --- a/Lab/demo/Lab/Plugins/Operations_on_polyhedra/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Operations_on_polyhedra/CMakeLists.txt @@ -4,21 +4,21 @@ cgal_lab_plugin(clip_polyhedron_plugin Clip_polyhedron_plugin ${clip_polyhedronUI_FILES}) target_link_libraries( clip_polyhedron_plugin PRIVATE scene_surface_mesh_item scene_basic_objects - scene_movable_sm_item) + scene_movable_sm_item) cgal_lab_plugin(point_set_from_vertices_plugin Point_set_from_vertices_plugin) target_link_libraries( point_set_from_vertices_plugin PRIVATE scene_surface_mesh_item scene_polygon_soup_item - scene_points_with_normal_item) + scene_points_with_normal_item) cgal_lab_plugin(point_set_from_sampling_plugin Point_set_from_sampling_plugin) target_link_libraries( point_set_from_sampling_plugin PRIVATE scene_surface_mesh_item scene_polygon_soup_item - scene_points_with_normal_item) + scene_points_with_normal_item) cgal_lab_plugin(diff_between_meshes_plugin Diff_between_meshes_plugin) target_link_libraries(diff_between_meshes_plugin PRIVATE scene_surface_mesh_item) diff --git a/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt b/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt index dc5b8387f2ca..07e6e1b55c01 100644 --- a/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt @@ -4,7 +4,7 @@ if(TARGET CGAL::Eigen3_support) cgal_lab_plugin(jet_fitting_plugin Jet_fitting_plugin) target_link_libraries( jet_fitting_plugin PRIVATE scene_surface_mesh_item scene_polylines_item - CGAL::Eigen3_support) + CGAL::Eigen3_support) else() message(STATUS "NOTICE: Eigen 3.1 (or greater) was not found. Jet fitting plugin will not be available.") endif() @@ -25,7 +25,7 @@ endif() cgal_lab_plugin(extrude_plugin Extrude_plugin KEYWORDS PMP) target_link_libraries(extrude_plugin PRIVATE scene_surface_mesh_item - scene_selection_item) + scene_selection_item) if(TARGET CGAL::Eigen3_support) if("${EIGEN3_VERSION}" VERSION_GREATER "3.1.90") @@ -66,7 +66,7 @@ if(TARGET CGAL::Eigen3_support) qt6_wrap_ui(remeshPlanarPatchesUI_FILES Remesh_planar_patches_dialog.ui) cgal_lab_plugin(remesh_planar_patches_plugin Remesh_planar_patches_plugin ${remeshPlanarPatchesUI_FILES} KEYWORDS PMP) - target_link_libraries(remesh_planar_patches_plugin PRIVATE scene_surface_mesh_item CGAL::Eigen3_support) + target_link_libraries(remesh_planar_patches_plugin PRIVATE scene_surface_mesh_item CGAL::Eigen3_support) if(CGAL_ENABLE_TESTING AND NOT CMAKE_VS_MSBUILD_COMMAND) set_tests_properties( @@ -90,7 +90,7 @@ cgal_lab_plugin(orient_soup_plugin Orient_soup_plugin ${soupUI_FILES} KEYWORDS Classification PMP) target_link_libraries( orient_soup_plugin PRIVATE scene_polygon_soup_item scene_surface_mesh_item - scene_polylines_item scene_points_with_normal_item) + scene_polylines_item scene_points_with_normal_item) cgal_lab_plugin(inside_out_plugin Inside_out_plugin KEYWORDS PMP) @@ -167,20 +167,20 @@ qt6_wrap_ui(randomPerturbationUI_FILES Random_perturbation_dialog.ui) cgal_lab_plugin(random_perturbation_plugin Random_perturbation_plugin ${randomPerturbationUI_FILES} KEYWORDS PMP) target_link_libraries(random_perturbation_plugin PRIVATE scene_surface_mesh_item - scene_selection_item) + scene_selection_item) cgal_lab_plugin(degenerated_faces_plugin Degenerated_faces_plugin KEYWORDS PMP) target_link_libraries(degenerated_faces_plugin PRIVATE scene_surface_mesh_item - scene_selection_item) + scene_selection_item) qt6_wrap_ui(engravUI_FILES Engrave_dock_widget.ui) cgal_lab_plugin(engrave_text_plugin Engrave_text_plugin ${engravUI_FILES}) target_link_libraries( engrave_text_plugin PRIVATE scene_surface_mesh_item scene_selection_item - scene_polylines_item - CGAL::Eigen3_support) + scene_polylines_item + CGAL::Eigen3_support) if(CGAL_ENABLE_TESTING AND NOT CMAKE_VS_MSBUILD_COMMAND) set_tests_properties( diff --git a/Lab/demo/Lab/Plugins/Surface_mesh/CMakeLists.txt b/Lab/demo/Lab/Plugins/Surface_mesh/CMakeLists.txt index a08a9c5135c3..dfa643eb52a4 100644 --- a/Lab/demo/Lab/Plugins/Surface_mesh/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Surface_mesh/CMakeLists.txt @@ -12,7 +12,7 @@ if(NOT CGAL_DISABLE_GMP) ${parameterizationUI_FILES}) target_link_libraries( parameterization_plugin PRIVATE scene_surface_mesh_item scene_textured_item - scene_selection_item CGAL::Eigen3_support) + scene_selection_item CGAL::Eigen3_support) if(CGAL_ENABLE_TESTING AND NOT CMAKE_VS_MSBUILD_COMMAND) set_tests_properties( @@ -44,7 +44,7 @@ if(NOT CGAL_DISABLE_GMP) ${shortestPathUI_FILES}) target_link_libraries( shortest_path_plugin PRIVATE scene_surface_mesh_item scene_shortest_path_item - scene_basic_objects) + scene_basic_objects) qt6_wrap_ui(basicUI_FILES Surface_mesh_approximation_dockwidget.ui) cgal_lab_plugin( diff --git a/Lab/demo/Lab/Plugins/Surface_mesh_deformation/CMakeLists.txt b/Lab/demo/Lab/Plugins/Surface_mesh_deformation/CMakeLists.txt index e4cfaa821d42..e02fc0459292 100644 --- a/Lab/demo/Lab/Plugins/Surface_mesh_deformation/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Surface_mesh_deformation/CMakeLists.txt @@ -8,11 +8,11 @@ if(TARGET CGAL::Eigen3_support AND "${EIGEN3_VERSION}" VERSION_GREATER "3.1.90") ${editionUI_FILES}) target_link_libraries( scene_edit_item PRIVATE CGAL::Eigen3_support scene_surface_mesh_item - scene_k_ring_selection scene_basic_objects) + scene_k_ring_selection scene_basic_objects) cgal_lab_plugin(edit_plugin Edit_polyhedron_plugin Deform_mesh.ui) target_link_libraries(edit_plugin PRIVATE scene_surface_mesh_item - scene_edit_item scene_selection_item) + scene_edit_item scene_selection_item) if(CGAL_ENABLE_TESTING AND NOT CMAKE_VS_MSBUILD_COMMAND) set_tests_properties( diff --git a/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt b/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt index c79de635f857..db89b35b63c4 100644 --- a/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt @@ -12,7 +12,7 @@ cgal_lab_plugin( tetrahedral_remeshing_plugin Tetrahedral_remeshing_plugin ${tetRemeshingUI_FILES} KEYWORDS Tetrahedral_remeshing) target_link_libraries(tetrahedral_remeshing_plugin PRIVATE scene_c3t3_item - ${OPENGL_gl_LIBRARY}) + ${OPENGL_gl_LIBRARY}) find_package(Eigen3 3.1.0 REQUIRED) #(3.1.0 or greater) include(CGAL_Eigen3_support) From d759e72d8d1008103c6f3a4cc03261abb0262159 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 17 Oct 2024 00:17:59 +0200 Subject: [PATCH 323/348] third batch of modifications --- .../cmake/modules/CGAL_SetupCGAL_Qt6Dependencies.cmake | 4 ++-- Installation/test/Installation/test_configuration.cmake.in | 2 +- .../test/Installation/test_configuration_qt.cmake.in | 2 +- Kernel_23/test/Kernel_23/CMakeLists.txt | 2 +- Three/doc/Three/Three.txt | 6 +++--- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Installation/cmake/modules/CGAL_SetupCGAL_Qt6Dependencies.cmake b/Installation/cmake/modules/CGAL_SetupCGAL_Qt6Dependencies.cmake index e8bc2f8c788e..fa87506ddcb4 100644 --- a/Installation/cmake/modules/CGAL_SetupCGAL_Qt6Dependencies.cmake +++ b/Installation/cmake/modules/CGAL_SetupCGAL_Qt6Dependencies.cmake @@ -76,9 +76,9 @@ if(NOT CGAL_Qt6_MISSING_DEPS) POSITION_INDEPENDENT_CODE TRUE EXCLUDE_FROM_ALL TRUE AUTOMOC TRUE) - target_link_libraries(CGAL_Qt6_moc_and_resources PUBLIC CGAL::CGAL Qt6::Widgets Qt6::OpenGLWidgets) + target_link_libraries(CGAL_Qt6_moc_and_resources PRIVATE CGAL::CGAL Qt6::Widgets Qt6::OpenGLWidgets) if(Qt6Svg_FOUND) - target_link_libraries(CGAL_Qt6_moc_and_resources PUBLIC Qt6::Svg) + target_link_libraries(CGAL_Qt6_moc_and_resources PRIVATE Qt6::Svg) endif() add_library(CGAL::CGAL_Qt6_moc_and_resources ALIAS CGAL_Qt6_moc_and_resources) add_library(CGAL::Qt6_moc_and_resources ALIAS CGAL_Qt6_moc_and_resources) diff --git a/Installation/test/Installation/test_configuration.cmake.in b/Installation/test/Installation/test_configuration.cmake.in index 4f4a08bc8dd6..fa820a795a5c 100644 --- a/Installation/test/Installation/test_configuration.cmake.in +++ b/Installation/test/Installation/test_configuration.cmake.in @@ -11,4 +11,4 @@ if(NOT ${CGAL_DIR_PATH} STREQUAL ${CGAL_GIVEN_DIR_PATH}) message( FATAL_ERROR "The CGAL_DIR is wrong !") endif() add_executable(test_configuration @CMAKE_CURRENT_SOURCE_DIR@/test_configuration.cpp) -target_link_libraries(test_configuration PUBLIC CGAL::CGAL) +target_link_libraries(test_configuration PRIVATE CGAL::CGAL) diff --git a/Installation/test/Installation/test_configuration_qt.cmake.in b/Installation/test/Installation/test_configuration_qt.cmake.in index 0001202e61c6..5dda5a91bc2f 100644 --- a/Installation/test/Installation/test_configuration_qt.cmake.in +++ b/Installation/test/Installation/test_configuration_qt.cmake.in @@ -11,4 +11,4 @@ if(NOT ${CGAL_DIR_PATH} STREQUAL ${CGAL_GIVEN_DIR_PATH}) message( FATAL_ERROR "The CGAL_DIR is wrong !") endif() add_executable(test_configuration @CMAKE_CURRENT_SOURCE_DIR@/test_configuration_qt.cpp) -target_link_libraries(test_configuration PUBLIC CGAL::CGAL CGAL::CGAL_Qt6) +target_link_libraries(test_configuration PRIVATE CGAL::CGAL CGAL::CGAL_Qt6) diff --git a/Kernel_23/test/Kernel_23/CMakeLists.txt b/Kernel_23/test/Kernel_23/CMakeLists.txt index 13ce4d27a38f..5ad54b946870 100644 --- a/Kernel_23/test/Kernel_23/CMakeLists.txt +++ b/Kernel_23/test/Kernel_23/CMakeLists.txt @@ -40,7 +40,7 @@ if(CGAL_KERNEL_23_TEST_RT_FT_PREDICATE_FLAGS) # add_compile_definitions(-DCGAL_KERNEL_23_TEST_RT_FT_PREDICATES_TEST_PREDICATES_WITH_TEMPLATED_OPERATORS) create_single_source_cgal_program("atomic_compilation_test.cpp") - target_precompile_headers(atomic_compilation_test PUBLIC [["atomic_RT_FT_predicate_headers.h"]]) + target_precompile_headers(atomic_compilation_test PRIVATE [["atomic_RT_FT_predicate_headers.h"]]) create_single_source_cgal_program("test_RT_or_FT_predicates.cpp") target_compile_definitions(test_RT_or_FT_predicates PRIVATE diff --git a/Three/doc/Three/Three.txt b/Three/doc/Three/Three.txt index 996cf95d13da..2156a47f8a97 100644 --- a/Three/doc/Three/Three.txt +++ b/Three/doc/Three/Three.txt @@ -199,7 +199,7 @@ Once your code is written, you will need to link the item's library to your plug cgal_lab_plugin(basic_item_plugin Basic_item_plugin) # links the library containing the scene_plane_item with the plugin - target_link_libraries(basic_item_plugin PUBLIC scene_basic_objects) + target_link_libraries(basic_item_plugin PRIVATE scene_basic_objects) \subsubsection exampleCreatingANewTypeItem Creating a new type of item @@ -252,7 +252,7 @@ After that, we can set the uniform values and actually draw the content of the c If you created your item in a specific file and you need to use it outside your plugin (like in another plugin), it is recommended to put it in the demo's root directory, and you will have to define your item in the general CGAL_Lab's CMakeLists.txt by using the macro add_item : add_item(scene_trivial_item Scene_trivial_item.cpp) - target_link_libraries(scene_trivial_item PUBLIC scene_dependances_item) + target_link_libraries(scene_trivial_item PRIVATE scene_dependances_item) \subsection exampleUsingAGroupItem Using a Scene_group_item @@ -353,7 +353,7 @@ Finally, you can declare your plugin If you need targets from the CGAL_Lab, you will have to add the prefix 'Lab_' to the target's name, as the exported targets belong to the namespace Lab_ cgal_lab_plugin(basic_item_plugin Basic_item_plugin) - target_link_libraries(basic_item_plugin PUBLIC Lab_scene_basic_objects) + target_link_libraries(basic_item_plugin PRIVATE Lab_scene_basic_objects) Notice that an external plugin will not be automatically loaded in the Lab. It must be built in its own project. From a0d79b755931d0c475ba505b91fff614f6711fc2 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 17 Oct 2024 00:49:27 +0200 Subject: [PATCH 324/348] fix the documentation --- .../Developer_manual/create_and_use_a_cmakelist.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt b/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt index f78ac8de15eb..dd6506eb4966 100644 --- a/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt +++ b/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt @@ -43,7 +43,7 @@ This section describes a minimal example of a program that uses \cgal and Qt6 fo \skip if(CGAL_Qt6_FOUND) -\until target_link_libraries(draw_surface_mesh PUBLIC CGAL::CGAL_Basic_viewer) +\until target_link_libraries(draw_surface_mesh PRIVATE CGAL::CGAL_Basic_viewer) \skip endif \until #end of the file From 439df7472bd70402a2301e949454d110baca7b93 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 17 Oct 2024 10:33:39 +0200 Subject: [PATCH 325/348] leftovers I had not pointed out I have reviewed all modifications. It should be the last batch. --- .../cmake/modules/CGAL_SetupCGAL_CoreDependencies.cmake | 2 +- Shape_detection/test/Shape_detection/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Installation/cmake/modules/CGAL_SetupCGAL_CoreDependencies.cmake b/Installation/cmake/modules/CGAL_SetupCGAL_CoreDependencies.cmake index 816ae656fb43..94d2d839375a 100644 --- a/Installation/cmake/modules/CGAL_SetupCGAL_CoreDependencies.cmake +++ b/Installation/cmake/modules/CGAL_SetupCGAL_CoreDependencies.cmake @@ -49,7 +49,7 @@ set_property(GLOBAL PROPERTY CGAL_Core_FOUND TRUE) function(CGAL_setup_CGAL_Core_dependencies target) find_package( Boost 1.72 REQUIRED ) - if (!CGAL_DISABLE_GMP AND GMP_FOUND) + if (NOT CGAL_DISABLE_GMP AND GMP_FOUND) use_CGAL_GMP_support(CGAL_Core INTERFACE) endif() target_compile_definitions(${target} INTERFACE CGAL_USE_CORE=1) diff --git a/Shape_detection/test/Shape_detection/CMakeLists.txt b/Shape_detection/test/Shape_detection/CMakeLists.txt index 503af515ccfa..85d23cf07d2b 100644 --- a/Shape_detection/test/Shape_detection/CMakeLists.txt +++ b/Shape_detection/test/Shape_detection/CMakeLists.txt @@ -51,7 +51,7 @@ if(TARGET CGAL::Eigen3_support) set(RANSAC_PROTO_DIR CACHE PATH "") add_executable(test_validity_sampled_data "test_validity_sampled_data.cpp") - target_link_libraries(test_validity_sampled_data CGAL::CGAL CGAL::Data CGAL::Eigen3_support) + target_link_libraries(test_validity_sampled_data PRIVATE CGAL::CGAL CGAL::Data CGAL::Eigen3_support) cgal_add_test(test_validity_sampled_data) else() message(STATUS "NOTICE: Some tests require Eigen 3.1 (or greater), and will not be compiled.") From d3e6fbccfacb71e2cbfa11ecdc643c9918278429 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Thu, 17 Oct 2024 15:27:24 +0200 Subject: [PATCH 326/348] updated CMakeLists.txt --- .../Point_set_processing_3/CMakeLists.txt | 60 +++++++++++++------ 1 file changed, 42 insertions(+), 18 deletions(-) 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 62353e6ae4f8..2fb6d482a86a 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 @@ -25,13 +25,9 @@ endif() # Activate concurrency? option(CGAL_ACTIVATE_CONCURRENT_PSP3 "Enable concurrency" OFF) -set(CGAL_libs CGAL::CGAL) if(CGAL_ACTIVATE_CONCURRENT_PSP3 OR "$ENV{CGAL_ACTIVATE_CONCURRENT_PSP3}") find_package(TBB REQUIRED) include(CGAL_TBB_support) - if(TARGET CGAL::TBB_support) - set(CGAL_TBB_target ${CGAL_libs} CGAL::TBB_support) - endif() endif() # Executables that do *not* require EIGEN @@ -61,8 +57,8 @@ if(NOT MSVC_VERSION OR MSVC_VERSION GREATER_EQUAL 1919 OR MSVC_VERSION LESS 1910 if (TARGET CGAL::LASLIB_support) create_single_source_cgal_program("read_las_example.cpp") create_single_source_cgal_program("write_las_example.cpp") - target_link_libraries(read_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support) - target_link_libraries(write_las_example PRIVATE ${CGAL_libs} CGAL::LASLIB_support) + target_link_libraries(read_las_example PRIVATE CGAL::LASLIB_support) + target_link_libraries(write_las_example PRIVATE CGAL::LASLIB_support) else() message(STATUS "NOTICE : the LAS reader test requires LASlib and will not be compiled.") endif() @@ -74,27 +70,43 @@ endif() find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) - set(CGAL_libs ${CGAL_libs} CGAL::Eigen3_support) # Executables that require Eigen foreach( target - jet_smoothing_example - normal_estimation + callback_example clustering_example edges_example - callback_example - scale_estimation_example - scale_estimation_2d_example hierarchy_simplification_example - normals_example) + jet_smoothing_example + normal_estimation + normals_example + scale_estimation_example + scale_estimation_2d_example) create_single_source_cgal_program("${target}.cpp") - target_link_libraries(${target} PRIVATE ${CGAL_libs}) + target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() + + if (TARGET CGAL::TBB_support) + foreach( + target + callback_example + clustering_example + jet_smoothing_example + normal_estimation + normals_example + scale_estimation_example) + target_link_libraries(${target} PRIVATE CGAL::TBB_support) + endforeach() + endif() + if (TARGET CGAL::Eigen3_support AND TARGET CGAL::LASLIB_support) create_single_source_cgal_program( "orient_scanlines_example.cpp" ) - target_link_libraries(orient_scanlines_example PRIVATE ${CGAL_libs} + target_link_libraries(orient_scanlines_example PRIVATE CGAL::Eigen3_support CGAL::LASLIB_support) + if (TARGET CGAL::TBB_support) + target_link_libraries(orient_scanlines_example PRIVATE CGAL::TBB_support) + endif() endif() # Executables that require libpointmatcher @@ -102,7 +114,7 @@ if(TARGET CGAL::Eigen3_support) include(CGAL_pointmatcher_support) if(TARGET CGAL::pointmatcher_support) create_single_source_cgal_program("registration_with_pointmatcher.cpp") - target_link_libraries(registration_with_pointmatcher PRIVATE ${CGAL_libs} + target_link_libraries(registration_with_pointmatcher PRIVATE CGAL::Eigen3_support CGAL::pointmatcher_support) else() message(STATUS "NOTICE: registration with pointmatcher requires libpointmatcher and will not be compiled.") @@ -120,7 +132,7 @@ if(TARGET CGAL::Eigen3_support) if(TARGET CGAL::OpenGR_support) create_single_source_cgal_program("registration_with_OpenGR.cpp") - target_link_libraries(registration_with_OpenGR PRIVATE ${CGAL_libs} + target_link_libraries(registration_with_OpenGR PRIVATE CGAL::Eigen3_support CGAL::OpenGR_support) else() message(STATUS "NOTICE: registration_with_OpenGR requires OpenGR, and will not be compiled.") @@ -131,7 +143,7 @@ if(TARGET CGAL::Eigen3_support) TARGET CGAL::OpenGR_support) create_single_source_cgal_program("registration_with_opengr_pointmatcher_pipeline.cpp") target_link_libraries( - registration_with_opengr_pointmatcher_pipeline PRIVATE ${CGAL_libs} + registration_with_opengr_pointmatcher_pipeline PRIVATE CGAL::Eigen3_support CGAL::pointmatcher_support CGAL::OpenGR_support) else() message(STATUS "NOTICE: registration with OpenGR and pointmatcher requires both libpointmatcher and OpenGR, and will not be compiled.") @@ -140,3 +152,15 @@ if(TARGET CGAL::Eigen3_support) else() message(STATUS "NOTICE: Some of the executables in this directory require Eigen 3.1 (or greater), and will not be compiled.") endif() + +if(CGAL_ACTIVATE_CONCURRENT_MESH_3 AND TARGET CGAL::TBB_support) + foreach( + target + average_spacing_example + bilateral_smooth_point_set_example + edge_aware_upsample_point_set_example + remove_outliers_example + wlop_simplify_and_regularize_point_set_example) + target_link_libraries(${target} PRIVATE CGAL::TBB_support) + endforeach() +endif() From ba33ac66e6945210ca55405ce4e5c50566191bd7 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Thu, 17 Oct 2024 15:43:57 +0200 Subject: [PATCH 327/348] removing trailing whitespaces --- .../examples/Point_set_processing_3/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 2fb6d482a86a..7d2b2c8b8727 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 @@ -86,7 +86,7 @@ if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("${target}.cpp") target_link_libraries(${target} PRIVATE CGAL::Eigen3_support) endforeach() - + if (TARGET CGAL::TBB_support) foreach( target @@ -99,7 +99,7 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(${target} PRIVATE CGAL::TBB_support) endforeach() endif() - + if (TARGET CGAL::Eigen3_support AND TARGET CGAL::LASLIB_support) create_single_source_cgal_program( "orient_scanlines_example.cpp" ) target_link_libraries(orient_scanlines_example PRIVATE From 73ea8d551d3e61a518c3cb9556747a6e72e85aab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 17 Oct 2024 15:28:39 +0200 Subject: [PATCH 328/348] fix parameter doc --- .../include/CGAL/Kinetic_surface_reconstruction_3.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h index 6cc639e6749e..6fdd83b13c3b 100644 --- a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h +++ b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h @@ -877,9 +877,12 @@ class Kinetic_surface_reconstruction_3 { \param pit an output iterator taking Point_3. - \param triit + \param polyit an output iterator taking std::vector. + \param lambda + trades data faithfulness of the reconstruction for low complexity. Must be in the range `[0, 1)`. + \pre successful reconstruction */ template @@ -1019,7 +1022,7 @@ class Kinetic_surface_reconstruction_3 { \param pit an output iterator taking `Point_3`. - \param triit + \param polyit an output iterator taking `std::vector`. \pre successful reconstruction From 04d70f36138422f9c53ed7e7198a6b66e4302401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 17 Oct 2024 17:36:24 +0200 Subject: [PATCH 329/348] missing doc of parameters --- .../include/CGAL/Variational_shape_approximation.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h index 1da8d0a23960..62f672ded71a 100644 --- a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h +++ b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h @@ -1528,6 +1528,7 @@ class Variational_shape_approximation { /*! * @brief finds and approximates the chord connecting the anchors. + * @param boundary_subdivision_ratio the chord subdivision ratio threshold to the chord length or average edge length for boundary edges * @param subdivision_ratio boundary chord approximation recursive split criterion * @param relative_to_chord set `true` if the subdivision_ratio is relative to the chord length (relative sense), * otherwise it's relative to the average edge length (absolute sense). @@ -1853,6 +1854,7 @@ class Variational_shape_approximation { * @param chord_begin begin iterator of the chord * @param chord_end end iterator of the chord * @param subdivision_ratio the chord recursive split error threshold + * @param boundary_subdivision_ratio the chord subdivision ratio threshold to the chord length or average edge length for boundary edges * @param relative_to_chord set `true` if the `subdivision_ratio` is relative to the chord length (relative sense), * otherwise it is relative to the average edge length (absolute sense). * @param with_dihedral_angle if set to `true` add dihedral angle weight to the distance. From 8df5564081f8f70ea622b930acc42e9e8be5cb0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 17 Oct 2024 17:58:19 +0200 Subject: [PATCH 330/348] documented non-doc parameters --- .../include/CGAL/Kinetic_space_partition_3.h | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h b/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h index 46c345a4c875..cabc3eabbd50 100644 --- a/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h +++ b/Kinetic_space_partition/include/CGAL/Kinetic_space_partition_3.h @@ -1048,11 +1048,13 @@ class Kinetic_space_partition_3 { /*! \brief Face indices of the volume. + \tparam OutputIterator output iterator accepting Index + \param volume_index index of the query volume. - @return - vector of face indices. + \param it + output iterator where faces of the volume are put \pre created partition */ @@ -1069,8 +1071,7 @@ class Kinetic_space_partition_3 { /*! \brief Mapping of a vertex index to its position. - @return - vector of points. + @return point of the vertex \pre created partition */ @@ -1093,11 +1094,12 @@ class Kinetic_space_partition_3 { /*! \brief Vertices of a face. - \param volume_index - index of the query volume. + \tparam OutputIterator output iterator accepting `Point_3` - @return - vector of face indices. + \param face_index + index of the query face. + + \param it output iterator where points of the face are put \pre created partition */ @@ -1116,11 +1118,12 @@ class Kinetic_space_partition_3 { /*! \brief Vertices of a face. - \param volume_index - index of the query volume. + \tparam OutputIterator output iterator accepting `EPECK::Point_3` - @return - vector of face indices. + \param face_index + index of the query face. + + \param it output iterator where points of the face are put \pre created partition */ From 38284f1d66cc9b31601c4ffec2b37fea2b63acad Mon Sep 17 00:00:00 2001 From: albert-github Date: Sat, 19 Oct 2024 14:35:14 +0200 Subject: [PATCH 331/348] Warnings regarding non closed tags. Added missing `\cgalParamNEnd` as they gave warnings when running a checker --- .../include/CGAL/Kinetic_surface_reconstruction_3.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h index 6fdd83b13c3b..a3b4ba33cda6 100644 --- a/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h +++ b/Kinetic_surface_reconstruction/include/CGAL/Kinetic_surface_reconstruction_3.h @@ -118,6 +118,7 @@ class Kinetic_surface_reconstruction_3 { \cgalParamDescription{a property map associating normals to the elements of the point set `points`} \cgalParamType{a model of `ReadablePropertyMap` whose key type is the value type of the iterator of `PointRange` and whose value type is `GeomTraits::Vector_3`} \cgalParamDefault{`NormalMap()`} + \cgalParamNEnd \cgalParamNBegin{k_neighbors} \cgalParamDescription{Shape detection: the number of neighbors for each point considered during region growing} \cgalParamType{`std::size_t`} @@ -248,6 +249,7 @@ class Kinetic_surface_reconstruction_3 { \cgalParamDescription{a property map associating normals to the elements of the point set `points`} \cgalParamType{a model of `ReadablePropertyMap` whose key type is the value type of the iterator of `PointRange` and whose value type is `GeomTraits::Vector_3`} \cgalParamDefault{`NormalMap()`} + \cgalParamNEnd \cgalParamNBegin{k_neighbors} \cgalParamDescription{Shape detection: the number of neighbors for each point considered during region growing} \cgalParamType{`std::size_t`} From 868e35140bb88eed1dca36a2fe420ce5cb5cd155 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 21 Oct 2024 16:18:10 +0200 Subject: [PATCH 332/348] fixes --- Lab/demo/Lab/CMakeLists.txt | 14 ++++++++++---- .../Plugins/Convex_decomposition/CMakeLists.txt | 3 ++- Lab/demo/Lab/Plugins/IO/CMakeLists.txt | 11 +++++++++-- Lab/demo/Lab/Plugins/PCA/CMakeLists.txt | 1 + Lab/demo/Lab/Plugins/PMP/CMakeLists.txt | 2 +- Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt | 3 ++- Lab/demo/Lab/Plugins/Surface_mesh/CMakeLists.txt | 9 ++++++--- 7 files changed, 31 insertions(+), 12 deletions(-) diff --git a/Lab/demo/Lab/CMakeLists.txt b/Lab/demo/Lab/CMakeLists.txt index f81c8c2a243d..644893829145 100644 --- a/Lab/demo/Lab/CMakeLists.txt +++ b/Lab/demo/Lab/CMakeLists.txt @@ -12,7 +12,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) #Defines flags to emulate windows behavior for linking error generation -if(CMAKE_CXX_COMPILER_ID EQUAL Clang +if(CMAKE_CXX_COMPILER_ID STREQUAL Clang OR CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) if(UNIX OR APPLE) @@ -244,7 +244,10 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_item(scene_c3t3_item Scene_c3t3_item.cpp) target_link_libraries( - scene_c3t3_item PRIVATE scene_triangulation_3_item + scene_c3t3_item + PUBLIC + scene_triangulation_3_item + PRIVATE scene_surface_mesh_item scene_polygon_soup_item scene_basic_objects ${TBB_LIBRARIES}) @@ -289,8 +292,11 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) target_link_libraries(scene_k_ring_selection PRIVATE scene_surface_mesh_item) add_item(scene_selection_item Scene_polyhedron_selection_item.cpp) - target_link_libraries(scene_selection_item PRIVATE scene_item_decorator - scene_k_ring_selection) + target_link_libraries(scene_selection_item + PUBLIC + scene_surface_mesh_item + scene_item_decorator + scene_k_ring_selection) if(TBB_FOUND) target_link_libraries(scene_selection_item PRIVATE CGAL::TBB_support) endif() diff --git a/Lab/demo/Lab/Plugins/Convex_decomposition/CMakeLists.txt b/Lab/demo/Lab/Plugins/Convex_decomposition/CMakeLists.txt index 683824fbeaa6..b17a2a80c140 100644 --- a/Lab/demo/Lab/Plugins/Convex_decomposition/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Convex_decomposition/CMakeLists.txt @@ -1,4 +1,5 @@ include(CGALlab_macros) cgal_lab_plugin(nef_plugin Nef_plugin) -target_link_libraries(nef_plugin PRIVATE scene_nef_polyhedron_item) +target_link_libraries(nef_plugin PRIVATE scene_nef_polyhedron_item scene_surface_mesh_item) + diff --git a/Lab/demo/Lab/Plugins/IO/CMakeLists.txt b/Lab/demo/Lab/Plugins/IO/CMakeLists.txt index 91bd7c6e2614..3938e505c923 100644 --- a/Lab/demo/Lab/Plugins/IO/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/IO/CMakeLists.txt @@ -59,8 +59,15 @@ target_link_libraries(triangulation_3_io_plugin PRIVATE scene_triangulation_3_it if(VTK_FOUND AND VTK_LIBRARIES) message(STATUS "VTK ${VTK_VERSION} found ${VTK_LIBRARIES}") cgal_lab_plugin(vtk_plugin VTK_io_plugin KEYWORDS Viewer Mesh_3) - target_link_libraries(vtk_plugin PRIVATE scene_surface_mesh_item scene_polylines_item scene_c3t3_item scene_points_with_normal_item - ${VTK_LIBRARIES}) + target_link_libraries(vtk_plugin + PRIVATE + scene_surface_mesh_item + scene_polygon_soup_item + scene_polylines_item + scene_c3t3_item + scene_points_with_normal_item + ${VTK_LIBRARIES} + ) target_compile_definitions(vtk_plugin PRIVATE -DCGAL_USE_VTK -DNOMINMAX) else() message(STATUS "NOTICE: the vtk IO plugin needs VTK 9.0 or greater and will not be compiled.") diff --git a/Lab/demo/Lab/Plugins/PCA/CMakeLists.txt b/Lab/demo/Lab/Plugins/PCA/CMakeLists.txt index db919338b440..afc4ad678d74 100644 --- a/Lab/demo/Lab/Plugins/PCA/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/PCA/CMakeLists.txt @@ -9,6 +9,7 @@ qt6_wrap_ui(transformUI_FILES Transformation_widget.ui MeshOnGrid_dialog.ui) cgal_lab_plugin(affine_transform_plugin Affine_transform_plugin ${transformUI_FILES} KEYWORDS PointSetProcessing) target_link_libraries(affine_transform_plugin PRIVATE scene_surface_mesh_item + scene_polygon_soup_item scene_points_with_normal_item scene_aff_transformed_item scene_aff_transformed_point_set_item diff --git a/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt b/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt index 07e6e1b55c01..f7efd5451286 100644 --- a/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/PMP/CMakeLists.txt @@ -112,7 +112,7 @@ target_link_libraries(polyhedron_stitching_plugin PRIVATE scene_surface_mesh_ite qt6_wrap_ui( selectionUI_FILES Selection_widget.ui) cgal_lab_plugin(selection_plugin Selection_plugin ${selectionUI_FILES} KEYWORDS PMP Viewer Classification Mesh_3) -target_link_libraries(selection_plugin PRIVATE scene_selection_item scene_points_with_normal_item scene_polylines_item) +target_link_libraries(selection_plugin PRIVATE scene_selection_item scene_surface_mesh_item scene_points_with_normal_item scene_polylines_item) #to keep it simple to compile add_custom_target(self_intersection_plugin) diff --git a/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt b/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt index e6ed10c00dc8..33f5adc3079b 100644 --- a/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Point_set/CMakeLists.txt @@ -205,7 +205,8 @@ qt6_wrap_ui(alpha_shapeUI_FILES Alpha_shape_widget.ui) cgal_lab_plugin(alpha_shape_plugin Alpha_shape_plugin ${alpha_shapeUI_FILES} KEYWORDS PointSetProcessing) target_link_libraries(alpha_shape_plugin PRIVATE scene_points_with_normal_item - scene_c3t3_item) + scene_polygon_soup_item + scene_c3t3_item) qt6_wrap_ui(distanceUI_FILES Point_set_to_mesh_distance_widget.ui) cgal_lab_plugin( diff --git a/Lab/demo/Lab/Plugins/Surface_mesh/CMakeLists.txt b/Lab/demo/Lab/Plugins/Surface_mesh/CMakeLists.txt index dfa643eb52a4..fd5079bd00fd 100644 --- a/Lab/demo/Lab/Plugins/Surface_mesh/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Surface_mesh/CMakeLists.txt @@ -42,9 +42,12 @@ if(NOT CGAL_DISABLE_GMP) qt6_wrap_ui(shortestPathUI_FILES Shortest_path_widget.ui) cgal_lab_plugin(shortest_path_plugin Shortest_path_plugin ${shortestPathUI_FILES}) - target_link_libraries( - shortest_path_plugin PRIVATE scene_surface_mesh_item scene_shortest_path_item - scene_basic_objects) + target_link_libraries(shortest_path_plugin + PRIVATE + scene_surface_mesh_item + scene_selection_item + scene_shortest_path_item + scene_basic_objects) qt6_wrap_ui(basicUI_FILES Surface_mesh_approximation_dockwidget.ui) cgal_lab_plugin( From 096075ecfc558ae180fd543c47eeb9afd92d2431 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 21 Oct 2024 17:45:41 +0200 Subject: [PATCH 333/348] master will now target 6.1 --- Installation/include/CGAL/version.h | 6 +++--- Installation/lib/cmake/CGAL/CGALConfigVersion.cmake | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Installation/include/CGAL/version.h b/Installation/include/CGAL/version.h index 8cdee7a0aa3f..57c2faa11bc5 100644 --- a/Installation/include/CGAL/version.h +++ b/Installation/include/CGAL/version.h @@ -17,12 +17,12 @@ #define CGAL_VERSION_H #ifndef SWIG -#define CGAL_VERSION 6.0.1 +#define CGAL_VERSION 6.1-dev #define CGAL_GIT_HASH abcdef #endif -#define CGAL_VERSION_NR 1060011000 +#define CGAL_VERSION_NR 1060100900 #define CGAL_SVN_REVISION 99999 -#define CGAL_RELEASE_DATE 20240925 +#define CGAL_RELEASE_DATE 20241130 #include diff --git a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake index e5e2176a20b3..d634917b94b8 100644 --- a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake +++ b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake @@ -1,8 +1,8 @@ set(CGAL_MAJOR_VERSION 6) -set(CGAL_MINOR_VERSION 0) -set(CGAL_BUGFIX_VERSION 1) +set(CGAL_MINOR_VERSION 1) +set(CGAL_BUGFIX_VERSION 0) include(${CMAKE_CURRENT_LIST_DIR}/CGALConfigBuildVersion.cmake) -set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "6.0.1") +set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "6.1-dev") set(CGAL_VERSION_PUBLIC_RELEASE_NAME "CGAL-${CGAL_VERSION_PUBLIC_RELEASE_VERSION}") if (CGAL_BUGFIX_VERSION AND CGAL_BUGFIX_VERSION GREATER 0) From fb605cdd39e8b353cb40953fc05edc8cc89364b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 22 Oct 2024 08:18:34 +0200 Subject: [PATCH 334/348] remove -D that is not compatible with "older" cmake versions --- AABB_tree/demo/AABB_tree/CMakeLists.txt | 2 +- .../demo/Alpha_shapes_3/CMakeLists.txt | 2 +- .../Arrangement_on_surface_2/CMakeLists.txt | 2 +- .../CMakeLists.txt | 2 +- .../demo/Alpha_shapes_2/CMakeLists.txt | 2 +- .../demo/Apollonius_graph_2/CMakeLists.txt | 2 +- .../demo/Bounding_volumes/CMakeLists.txt | 2 +- .../demo/Circular_kernel_2/CMakeLists.txt | 2 +- GraphicsView/demo/Generator/CMakeLists.txt | 2 +- GraphicsView/demo/GraphicsView/CMakeLists.txt | 2 +- .../demo/L1_Voronoi_diagram_2/CMakeLists.txt | 2 +- .../demo/Largest_empty_rect_2/CMakeLists.txt | 2 +- .../Periodic_2_triangulation_2/CMakeLists.txt | 2 +- GraphicsView/demo/Polygon/CMakeLists.txt | 4 ++-- .../Segment_Delaunay_graph_2/CMakeLists.txt | 2 +- .../CMakeLists.txt | 2 +- .../demo/Snap_rounding_2/CMakeLists.txt | 2 +- .../demo/Spatial_searching_2/CMakeLists.txt | 2 +- .../demo/Stream_lines_2/CMakeLists.txt | 2 +- .../demo/Triangulation_2/CMakeLists.txt | 2 +- Kernel_23/test/Kernel_23/CMakeLists.txt | 2 +- Lab/demo/Lab/CMakeLists.txt | 8 ++++---- .../Linear_cell_complex_3/CMakeLists.txt | 2 +- .../demo/Linear_cell_complex/CMakeLists.txt | 20 +++++++++---------- .../Linear_cell_complex/CMakeLists.txt | 2 +- Mesh_3/benchmark/Mesh_3/CMakeLists.txt | 6 +++--- Mesh_3/examples/Mesh_3/CMakeLists.txt | 6 +++--- .../Periodic_3_triangulation_3/CMakeLists.txt | 2 +- .../Polyline_simplification_2/CMakeLists.txt | 2 +- Ridges_3/examples/Ridges_3/CMakeLists.txt | 2 +- .../Surface_mesh_topology/CMakeLists.txt | 4 ++-- .../Surface_mesh_topology/CMakeLists.txt | 8 ++++---- .../test/Surface_mesh_topology/CMakeLists.txt | 8 ++++---- .../Tetrahedral_remeshing/CMakeLists.txt | 2 +- .../test/Tetrahedral_remeshing/CMakeLists.txt | 4 ++-- .../demo/Triangulation_3/CMakeLists.txt | 4 ++-- 36 files changed, 62 insertions(+), 62 deletions(-) diff --git a/AABB_tree/demo/AABB_tree/CMakeLists.txt b/AABB_tree/demo/AABB_tree/CMakeLists.txt index 6a8551246fc6..eabac21335c7 100644 --- a/AABB_tree/demo/AABB_tree/CMakeLists.txt +++ b/AABB_tree/demo/AABB_tree/CMakeLists.txt @@ -14,7 +14,7 @@ find_package(Qt6 QUIET COMPONENTS Gui OpenGL) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) # Instruct CMake to run moc/ui/rcc automatically when needed. set(CMAKE_AUTOMOC ON) diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt b/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt index ffd128922f99..1028c6f4ea4d 100644 --- a/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt @@ -13,7 +13,7 @@ find_package(Qt6 QUIET COMPONENTS Widgets OpenGL) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) # Instruct CMake to run moc/ui/rcc automatically when needed. set(CMAKE_AUTOMOC ON) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt index f0546d39b6ba..990e8d5092e7 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt @@ -20,7 +20,7 @@ if (CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_INCLUDE_CURRENT_DIR ON) # Arrangement package includes - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) option(COMPILE_UTILS_INCREMENTALLY "Compile files in Utils directory incrementally, or compile them all as a unit. \ Incremental compilation will be better for development and consume less \ diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2_earth/CMakeLists.txt b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2_earth/CMakeLists.txt index 47ac56dde951..fa18ff35df6f 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2_earth/CMakeLists.txt +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2_earth/CMakeLists.txt @@ -39,7 +39,7 @@ endif() -add_compile_definitions(-DQT_NO_VERSION_TAGGING) +add_compile_definitions(QT_NO_VERSION_TAGGING) # AOS file(GLOB source_files_aos Aos.h Aos.cpp Aos_defs.h diff --git a/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt b/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt index da0637016798..d421e758dc29 100644 --- a/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt +++ b/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt b/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt index 9be2cac7fed4..79a9c5843249 100644 --- a/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt +++ b/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/Bounding_volumes/CMakeLists.txt b/GraphicsView/demo/Bounding_volumes/CMakeLists.txt index 3dc7150fa42a..7a1c55e23755 100644 --- a/GraphicsView/demo/Bounding_volumes/CMakeLists.txt +++ b/GraphicsView/demo/Bounding_volumes/CMakeLists.txt @@ -19,7 +19,7 @@ endif() if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_INCLUDE_CURRENT_DIR ON) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) diff --git a/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt b/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt index d5d492cfae83..3689b6a44951 100644 --- a/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt +++ b/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/Generator/CMakeLists.txt b/GraphicsView/demo/Generator/CMakeLists.txt index 6d58ed411ccc..75ab3c6083e2 100644 --- a/GraphicsView/demo/Generator/CMakeLists.txt +++ b/GraphicsView/demo/Generator/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/GraphicsView/CMakeLists.txt b/GraphicsView/demo/GraphicsView/CMakeLists.txt index 2e96d21559a7..9568fd3efae4 100644 --- a/GraphicsView/demo/GraphicsView/CMakeLists.txt +++ b/GraphicsView/demo/GraphicsView/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) qt_add_executable(min min.cpp) diff --git a/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt b/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt index 90b33fd63887..0a682e80fa8e 100644 --- a/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt +++ b/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt @@ -11,7 +11,7 @@ include_directories(BEFORE ./include) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt b/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt index 1a54859e917f..2dbae37b6978 100644 --- a/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt +++ b/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt @@ -10,7 +10,7 @@ find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt b/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt index 6b7f60e065bc..f630c8c6e80c 100644 --- a/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt +++ b/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt @@ -8,7 +8,7 @@ include_directories(BEFORE ./include) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) diff --git a/GraphicsView/demo/Polygon/CMakeLists.txt b/GraphicsView/demo/Polygon/CMakeLists.txt index e7f8e01c4449..85a964989c82 100644 --- a/GraphicsView/demo/Polygon/CMakeLists.txt +++ b/GraphicsView/demo/Polygon/CMakeLists.txt @@ -16,13 +16,13 @@ endif() find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) if(CGAL_Core_FOUND) - add_compile_definitions(-DCGAL_USE_CORE) + add_compile_definitions(CGAL_USE_CORE) endif() qt_add_executable(Polygon_2 Polygon_2.cpp diff --git a/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt b/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt index 2839b7bc5bd8..7f805e60986a 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt +++ b/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt @@ -15,7 +15,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) qt_add_executable( diff --git a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt index db839e832a7f..fc773d81ace8 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt +++ b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt @@ -13,7 +13,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) qt_add_executable( Segment_voronoi_linf_2 Segment_voronoi_linf_2.cpp diff --git a/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt b/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt index f69d4103c8fb..9d3c41854bf3 100644 --- a/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt +++ b/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt @@ -12,7 +12,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) qt_add_executable( Snap_rounding_2 Snap_rounding_2.cpp diff --git a/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt b/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt index d486a7f0bf9b..fd02ea6c1e92 100644 --- a/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt +++ b/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt @@ -10,7 +10,7 @@ find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/Stream_lines_2/CMakeLists.txt b/GraphicsView/demo/Stream_lines_2/CMakeLists.txt index 586e84746253..3c76339638af 100644 --- a/GraphicsView/demo/Stream_lines_2/CMakeLists.txt +++ b/GraphicsView/demo/Stream_lines_2/CMakeLists.txt @@ -10,7 +10,7 @@ find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/GraphicsView/demo/Triangulation_2/CMakeLists.txt b/GraphicsView/demo/Triangulation_2/CMakeLists.txt index 31cad71c9b20..141852b3ed5c 100644 --- a/GraphicsView/demo/Triangulation_2/CMakeLists.txt +++ b/GraphicsView/demo/Triangulation_2/CMakeLists.txt @@ -17,7 +17,7 @@ if(NOT CGAL_Qt6_FOUND OR NOT Qt6_FOUND) return() endif() -add_compile_definitions(-DQT_NO_KEYWORDS) +add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) #-------------------------------- diff --git a/Kernel_23/test/Kernel_23/CMakeLists.txt b/Kernel_23/test/Kernel_23/CMakeLists.txt index 5ad54b946870..106eced3810c 100644 --- a/Kernel_23/test/Kernel_23/CMakeLists.txt +++ b/Kernel_23/test/Kernel_23/CMakeLists.txt @@ -37,7 +37,7 @@ if(CGAL_KERNEL_23_TEST_RT_FT_PREDICATE_FLAGS) # - create a lot of possible combinations, which is expensive to test # - create issues because some combinations might be RT-sufficient whereas others will require FT # - # add_compile_definitions(-DCGAL_KERNEL_23_TEST_RT_FT_PREDICATES_TEST_PREDICATES_WITH_TEMPLATED_OPERATORS) + # add_compile_definitions(CGAL_KERNEL_23_TEST_RT_FT_PREDICATES_TEST_PREDICATES_WITH_TEMPLATED_OPERATORS) create_single_source_cgal_program("atomic_compilation_test.cpp") target_precompile_headers(atomic_compilation_test PRIVATE [["atomic_RT_FT_predicate_headers.h"]]) diff --git a/Lab/demo/Lab/CMakeLists.txt b/Lab/demo/Lab/CMakeLists.txt index 644893829145..81f8702e76c3 100644 --- a/Lab/demo/Lab/CMakeLists.txt +++ b/Lab/demo/Lab/CMakeLists.txt @@ -3,7 +3,7 @@ project(Lab_Demo) include(FeatureSummary) -add_compile_definitions ( -DCGAL_NO_DEPRECATED_CODE ) +add_compile_definitions(CGAL_NO_DEPRECATED_CODE) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -48,7 +48,7 @@ set_package_properties( DESCRIPTION "To find this package, it should be sufficient to fill the Qt6_DIR variable with: ///lib/cmake/Qt6") if(Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) endif(Qt6_FOUND) find_package(Eigen3 3.2.0 QUIET) #(requires 3.2.0 or greater) @@ -93,7 +93,7 @@ option(CGAL_ACTIVATE_CONCURRENT_MESH_3 "Activate parallelism in Mesh_3" OFF) # And add -DCGAL_CONCURRENT_MESH_3 if that option is ON if(CGAL_ACTIVATE_CONCURRENT_MESH_3 OR "$ENV{CGAL_ACTIVATE_CONCURRENT_MESH_3}") - add_compile_definitions(-DCGAL_CONCURRENT_MESH_3) + add_compile_definitions(CGAL_CONCURRENT_MESH_3) if(NOT TBB_FOUND) find_package(TBB REQUIRED) include(CGAL_TBB_support) @@ -350,7 +350,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_to_cached_list(CGAL_EXECUTABLE_TARGETS ${lib}) endforeach() - add_compile_definitions(-DUSE_FORWARD_DECL) + add_compile_definitions(USE_FORWARD_DECL) add_library( cgal_lab SHARED MainWindow.cpp diff --git a/Linear_cell_complex/benchmark/Linear_cell_complex_3/CMakeLists.txt b/Linear_cell_complex/benchmark/Linear_cell_complex_3/CMakeLists.txt index 386bc33fafea..5166eee35aba 100644 --- a/Linear_cell_complex/benchmark/Linear_cell_complex_3/CMakeLists.txt +++ b/Linear_cell_complex/benchmark/Linear_cell_complex_3/CMakeLists.txt @@ -23,7 +23,7 @@ set(QT_USE_QTXML TRUE) include(${QT_USE_FILE}) add_compile_definitions(${QT_DEFINITIONS}) -add_compile_definitions(-DINCLUDE_TEMPLATES) +add_compile_definitions(INCLUDE_TEMPLATES) # Performance_3 add_executable(performance_3 performance_3.cpp) diff --git a/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt index 1cba87aeb682..16b346a75641 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt @@ -9,25 +9,25 @@ project(Linear_cell_complex_Demo) set(CMAKE_INCLUDE_CURRENT_DIR ON) ## To add expensive tests -# add_compile_definitions("-DCGAL_CHECK_EXPENSIVE") -# add_compile_definitions("-Wall -Wextra") -# add_compile_definitions(-fsanitize=address) +# add_compile_definitions(CGAL_CHECK_EXPENSIVE) +# add_definitions("-Wall -Wextra") +# add_definitions(-fsanitize=address) # add_link_options(-fsanitize=address) -# add_compile_definitions("-D_GLIBCXX_DEBUG") +# add_compile_definitions(_GLIBCXX_DEBUG) ## For profilling with gprof # add_compile_definitions("-pg") # SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") ## To add an is_valid test after each operation (only in debug mode) -# add_compile_definitions("-DCGAL_CMAP_TEST_VALID_REMOVALS") -# add_compile_definitions("-DCGAL_CMAP_TEST_VALID_CONTRACTIONS") -# add_compile_definitions("-DCGAL_CMAP_TEST_VALID_INSERTIONS") +# add_compile_definitions(CGAL_CMAP_TEST_VALID_REMOVALS) +# add_compile_definitions(CGAL_CMAP_TEST_VALID_CONTRACTIONS) +# add_compile_definitions(CGAL_CMAP_TEST_VALID_INSERTIONS) # Option allowing to profile each operation of the demo (cout times on stdout). -add_compile_definitions(-DCGAL_PROFILE_LCC_DEMO) +add_compile_definitions(CGAL_PROFILE_LCC_DEMO) -add_compile_definitions(-DCMAP_WITH_INDEX) # to use cc with index (handle otherwise) +add_compile_definitions(CMAP_WITH_INDEX) # to use cc with index (handle otherwise) ################## find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) @@ -40,7 +40,7 @@ if(NOT CGAL_Qt6_FOUND OR NOT Qt6_FOUND) else() - add_compile_definitions(-DCGAL_USE_BASIC_VIEWER -DQT_NO_KEYWORDS) + add_compile_definitions(CGAL_USE_BASIC_VIEWER QT_NO_KEYWORDS) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) diff --git a/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt index da2c0144a6e1..22760ad87b6f 100644 --- a/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/examples/Linear_cell_complex/CMakeLists.txt @@ -11,7 +11,7 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) # set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") # To use valgrind, we must disable rounding math check. -# add_compile_definitions(-DCGAL_DISABLE_ROUNDING_MATH_CHECK) +# add_compile_definitions(CGAL_DISABLE_ROUNDING_MATH_CHECK) create_single_source_cgal_program("gmap_linear_cell_complex_3.cpp") create_single_source_cgal_program("linear_cell_complex_3.cpp") diff --git a/Mesh_3/benchmark/Mesh_3/CMakeLists.txt b/Mesh_3/benchmark/Mesh_3/CMakeLists.txt index dcb7518f288a..7e195ce1ff1f 100644 --- a/Mesh_3/benchmark/Mesh_3/CMakeLists.txt +++ b/Mesh_3/benchmark/Mesh_3/CMakeLists.txt @@ -6,13 +6,13 @@ project(Mesh_3_benchmark) find_package(CGAL REQUIRED COMPONENTS ImageIO) -add_compile_definitions(-DCGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX +add_compile_definitions(CGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX -DCGAL_MESH_3_NO_DEPRECATED_C3T3_ITERATORS) # Activate verbose mode? (turned OFF by default) option(CGAL_ACTIVATE_CONCURRENT_MESH_3 "Activate verbose mode in Mesh_3" OFF) if(MESH_3_VERBOSE) - add_compile_definitions(-DCGAL_MESH_3_VERBOSE) + add_compile_definitions(CGAL_MESH_3_VERBOSE) endif() # Activate concurrency? (turned OFF by default) @@ -20,7 +20,7 @@ option(CGAL_ACTIVATE_CONCURRENT_MESH_3 "Activate parallelism in Mesh_3" OFF) # And add -DCGAL_CONCURRENT_MESH_3 if that option is ON if(CGAL_ACTIVATE_CONCURRENT_MESH_3) - add_compile_definitions(-DCGAL_CONCURRENT_MESH_3) + add_compile_definitions(CGAL_CONCURRENT_MESH_3) find_package(TBB REQUIRED) include(CGAL_TBB_support) else() diff --git a/Mesh_3/examples/Mesh_3/CMakeLists.txt b/Mesh_3/examples/Mesh_3/CMakeLists.txt index 5ed6a9b95700..e16b0fca3388 100644 --- a/Mesh_3/examples/Mesh_3/CMakeLists.txt +++ b/Mesh_3/examples/Mesh_3/CMakeLists.txt @@ -1,11 +1,11 @@ cmake_minimum_required(VERSION 3.12...3.29) project(Mesh_3_Examples) -add_compile_definitions(-DCGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX +add_compile_definitions(CGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX -DCGAL_MESH_3_NO_DEPRECATED_C3T3_ITERATORS) if(CGAL_MESH_3_VERBOSE) - add_compile_definitions(-DCGAL_MESH_3_VERBOSE) + add_compile_definitions(CGAL_MESH_3_VERBOSE) endif() find_package(CGAL REQUIRED COMPONENTS ImageIO) @@ -13,7 +13,7 @@ find_package(CGAL REQUIRED COMPONENTS ImageIO) option(CGAL_ACTIVATE_CONCURRENT_MESH_3 "Activate parallelism in Mesh_3" OFF) if(CGAL_ACTIVATE_CONCURRENT_MESH_3 OR "$ENV{CGAL_ACTIVATE_CONCURRENT_MESH_3}") - add_compile_definitions(-DCGAL_CONCURRENT_MESH_3) + add_compile_definitions(CGAL_CONCURRENT_MESH_3) find_package(TBB REQUIRED) include(CGAL_TBB_support) endif() 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 30bc4d0c97f9..c4c128de19ba 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 @@ -11,7 +11,7 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets OpenGL Help ToolsTools) if(Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) endif(Qt6_FOUND) diff --git a/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt b/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt index 69e4a9748459..97f1671d671d 100644 --- a/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt +++ b/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt @@ -12,7 +12,7 @@ find_package(Qt6 QUIET COMPONENTS Widgets) include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) diff --git a/Ridges_3/examples/Ridges_3/CMakeLists.txt b/Ridges_3/examples/Ridges_3/CMakeLists.txt index 22e25c7fd961..6eab0514fad7 100644 --- a/Ridges_3/examples/Ridges_3/CMakeLists.txt +++ b/Ridges_3/examples/Ridges_3/CMakeLists.txt @@ -18,7 +18,7 @@ if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program(Ridges_Umbilics_LCC.cpp) target_link_libraries(Ridges_Umbilics_LCC PRIVATE CGAL::Eigen3_support) - add_compile_definitions("-DCGAL_USE_BOOST_PROGRAM_OPTIONS") + add_compile_definitions(CGAL_USE_BOOST_PROGRAM_OPTIONS) target_link_libraries(Compute_Ridges_Umbilics PRIVATE Boost::program_options) target_link_libraries(Ridges_Umbilics_SM PRIVATE Boost::program_options) target_link_libraries(Ridges_Umbilics_LCC PRIVATE Boost::program_options) diff --git a/Surface_mesh_topology/benchmark/Surface_mesh_topology/CMakeLists.txt b/Surface_mesh_topology/benchmark/Surface_mesh_topology/CMakeLists.txt index 0459f5ea2490..ed4937594fc6 100644 --- a/Surface_mesh_topology/benchmark/Surface_mesh_topology/CMakeLists.txt +++ b/Surface_mesh_topology/benchmark/Surface_mesh_topology/CMakeLists.txt @@ -4,8 +4,8 @@ cmake_minimum_required(VERSION 3.12...3.29) find_package(CGAL REQUIRED) -# add_compile_definitions(-DCGAL_TRACE_PATH_TESTS) -# add_compile_definitions(-DCGAL_TRACE_CMAP_TOOLS) +# add_compile_definitions(CGAL_TRACE_PATH_TESTS) +# add_compile_definitions(CGAL_TRACE_CMAP_TOOLS) set(SOURCE_FILES quadrangulation_computation_benchmarks.cpp path_homotopy_with_schema.cpp) diff --git a/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt b/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt index d18f19190b82..ae6793d8270c 100644 --- a/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt +++ b/Surface_mesh_topology/examples/Surface_mesh_topology/CMakeLists.txt @@ -3,10 +3,10 @@ project(Surface_mesh_topology_Examples) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -# add_compile_definitions(-DCGAL_TRACE_PATH_TESTS) -# add_compile_definitions(-DCGAL_TRACE_CMAP_TOOLS) -# add_compile_definitions("-Wall -Wextra") -# add_compile_definitions("-D_GLIBCXX_DEBUG") +# add_compile_definitions(CGAL_TRACE_PATH_TESTS) +# add_compile_definitions(CGAL_TRACE_CMAP_TOOLS) +# add_definitions("-Wall -Wextra") +# add_compile_definitions(_GLIBCXX_DEBUG) set(SOURCE_FILES edgewidth_lcc.cpp diff --git a/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt b/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt index 7924745df87d..dc45d083c3e4 100644 --- a/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt +++ b/Surface_mesh_topology/test/Surface_mesh_topology/CMakeLists.txt @@ -3,10 +3,10 @@ project(Surface_mesh_topology_Tests) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -# add_compile_definitions(-DCGAL_TRACE_PATH_TESTS) -# add_compile_definitions(-DCGAL_TRACE_CMAP_TOOLS) -# add_compile_definitions("-Wall -Wextra") -# add_compile_definitions("-D_GLIBCXX_DEBUG") +# add_compile_definitions(CGAL_TRACE_PATH_TESTS) +# add_compile_definitions(CGAL_TRACE_CMAP_TOOLS) +# add_definitions("-Wall -Wextra") +# add_compile_definitions(_GLIBCXX_DEBUG) set(SOURCE_FILES fundamental_group_of_the_circle.cpp diff --git a/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt b/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt index cd7a9f7e7370..64bbdc1a1940 100644 --- a/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt +++ b/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/CMakeLists.txt @@ -16,7 +16,7 @@ create_single_source_cgal_program("tetrahedral_remeshing_from_mesh.cpp") # Concurrent Mesh_3 option(CGAL_ACTIVATE_CONCURRENT_MESH_3 "Activate parallelism in Mesh_3" OFF) if(CGAL_ACTIVATE_CONCURRENT_MESH_3 OR "$ENV{CGAL_ACTIVATE_CONCURRENT_MESH_3}") - add_compile_definitions(-DCGAL_CONCURRENT_MESH_3) + add_compile_definitions(CGAL_CONCURRENT_MESH_3) find_package(TBB REQUIRED) include(CGAL_TBB_support) else() diff --git a/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt b/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt index 07dfc6ea0f41..de0fb965c4ef 100644 --- a/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt +++ b/Tetrahedral_remeshing/test/Tetrahedral_remeshing/CMakeLists.txt @@ -8,8 +8,8 @@ project(Tetrahedral_remeshing_Tests) # CGAL and its components find_package(CGAL REQUIRED COMPONENTS ImageIO) -add_compile_definitions(-DCGAL_TETRAHEDRAL_REMESHING_VERBOSE) -#add_compile_definitions(-DCGAL_CHECK_EXPENSIVE) #to activate expensive assertions +add_compile_definitions(CGAL_TETRAHEDRAL_REMESHING_VERBOSE) +#add_compile_definitions(CGAL_CHECK_EXPENSIVE) #to activate expensive assertions create_single_source_cgal_program("test_tetrahedral_remeshing.cpp") create_single_source_cgal_program("test_tetrahedral_remeshing_with_features.cpp") diff --git a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt index b4dfe997b885..df83176883da 100644 --- a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt @@ -12,7 +12,7 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets OpenGL) if(Qt6_FOUND) - add_compile_definitions(-DQT_NO_KEYWORDS) + add_compile_definitions(QT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) endif(Qt6_FOUND) @@ -22,7 +22,7 @@ option(CGAL_ACTIVATE_CONCURRENT_TRIANGULATION_3 # And add -DCGAL_CONCURRENT_TRIANGULATION_3 if that option is ON if(CGAL_ACTIVATE_CONCURRENT_TRIANGULATION_3) - add_compile_definitions(-DCGAL_CONCURRENT_TRIANGULATION_3) + add_compile_definitions(CGAL_CONCURRENT_TRIANGULATION_3) find_package(TBB REQUIRED) include(CGAL_TBB_support) else(CGAL_ACTIVATE_CONCURRENT_TRIANGULATION_3) From 7a0cc29fa397008ce69f5570d169c5537f4eeea5 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 22 Oct 2024 12:23:00 +0200 Subject: [PATCH 335/348] update a comment in the script --- Scripts/developer_scripts/tag_pr_per_release.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Scripts/developer_scripts/tag_pr_per_release.sh b/Scripts/developer_scripts/tag_pr_per_release.sh index e2206e36798f..8f5bb568639c 100644 --- a/Scripts/developer_scripts/tag_pr_per_release.sh +++ b/Scripts/developer_scripts/tag_pr_per_release.sh @@ -1,8 +1,7 @@ #!/bin/bash -# this script requires ghi: https://github.com/stephencelis/ghi -# See the wiki for how to assign a token to connect without password: -# https://github.com/stephencelis/ghi/wiki/FAQ +# This script requires Github CLI to be installed and configured. +# https://cli.github.com/ # # example calls within a git repo # bash tag_pr_per_release.sh 4.12 4.12.1 From 8469e9201359b93e58dfda7a2e3275001a2e56b2 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 22 Oct 2024 12:35:12 +0200 Subject: [PATCH 336/348] this branch will now target 6.0.2 --- Installation/include/CGAL/version.h | 4 ++-- Installation/lib/cmake/CGAL/CGALConfigVersion.cmake | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Installation/include/CGAL/version.h b/Installation/include/CGAL/version.h index 8cdee7a0aa3f..ec6776d9cf63 100644 --- a/Installation/include/CGAL/version.h +++ b/Installation/include/CGAL/version.h @@ -17,10 +17,10 @@ #define CGAL_VERSION_H #ifndef SWIG -#define CGAL_VERSION 6.0.1 +#define CGAL_VERSION 6.0.2 #define CGAL_GIT_HASH abcdef #endif -#define CGAL_VERSION_NR 1060011000 +#define CGAL_VERSION_NR 1060021000 #define CGAL_SVN_REVISION 99999 #define CGAL_RELEASE_DATE 20240925 diff --git a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake index e5e2176a20b3..b53e55af1796 100644 --- a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake +++ b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake @@ -1,8 +1,8 @@ set(CGAL_MAJOR_VERSION 6) set(CGAL_MINOR_VERSION 0) -set(CGAL_BUGFIX_VERSION 1) +set(CGAL_BUGFIX_VERSION 2) include(${CMAKE_CURRENT_LIST_DIR}/CGALConfigBuildVersion.cmake) -set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "6.0.1") +set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "6.0.2") set(CGAL_VERSION_PUBLIC_RELEASE_NAME "CGAL-${CGAL_VERSION_PUBLIC_RELEASE_VERSION}") if (CGAL_BUGFIX_VERSION AND CGAL_BUGFIX_VERSION GREATER 0) From 8f98405adb906eef7e8d94d96ff0090d412b6b14 Mon Sep 17 00:00:00 2001 From: albert-github Date: Tue, 22 Oct 2024 13:07:21 +0200 Subject: [PATCH 337/348] Spelling correction Spelling correction --- .../include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h index 0c5fe43e44fc..7a4ddc35b8e9 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h @@ -1173,7 +1173,7 @@ class Curve_pair_analysis_2 : /* * \brief reduces the number of possible intersections * - * At the position given by the event lins \c e1 and \c e2 and the slice + * At the position given by the event lines \c e1 and \c e2 and the slice * info object \c slice, the points on the event lines are further refined * until there are only \c n possible intersection points. The method can * be interrupted if all possible intersection points are known to have From 8e4ee1e45d3d7040cc8bb741c7ad629e179a8344 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 22 Oct 2024 15:12:44 +0200 Subject: [PATCH 338/348] update versions in menu_version.js [skip ci] --- Documentation/doc/resources/1.10.0/menu_version.js | 6 +++--- Documentation/doc/resources/1.8.13/menu_version.js | 6 +++--- Documentation/doc/resources/1.9.6/menu_version.js | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Documentation/doc/resources/1.10.0/menu_version.js b/Documentation/doc/resources/1.10.0/menu_version.js index 74c82c3d818c..79c0a8d5d9fc 100644 --- a/Documentation/doc/resources/1.10.0/menu_version.js +++ b/Documentation/doc/resources/1.10.0/menu_version.js @@ -6,10 +6,10 @@ var current_version_local = 'master' var all_versions = [ 'master', - '6.0', + '6.0.1', 'latest', - '5.6.1', - '5.5.4', + '5.6.2', + '5.5.5', '5.4.5', '5.3.2', '5.2.4', diff --git a/Documentation/doc/resources/1.8.13/menu_version.js b/Documentation/doc/resources/1.8.13/menu_version.js index 74c82c3d818c..79c0a8d5d9fc 100644 --- a/Documentation/doc/resources/1.8.13/menu_version.js +++ b/Documentation/doc/resources/1.8.13/menu_version.js @@ -6,10 +6,10 @@ var current_version_local = 'master' var all_versions = [ 'master', - '6.0', + '6.0.1', 'latest', - '5.6.1', - '5.5.4', + '5.6.2', + '5.5.5', '5.4.5', '5.3.2', '5.2.4', diff --git a/Documentation/doc/resources/1.9.6/menu_version.js b/Documentation/doc/resources/1.9.6/menu_version.js index 74c82c3d818c..79c0a8d5d9fc 100644 --- a/Documentation/doc/resources/1.9.6/menu_version.js +++ b/Documentation/doc/resources/1.9.6/menu_version.js @@ -6,10 +6,10 @@ var current_version_local = 'master' var all_versions = [ 'master', - '6.0', + '6.0.1', 'latest', - '5.6.1', - '5.5.4', + '5.6.2', + '5.5.5', '5.4.5', '5.3.2', '5.2.4', From 1709486fba8b3195f4cbfb4b62d50d035a8aa46f Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 22 Oct 2024 16:36:00 +0200 Subject: [PATCH 339/348] next version will be 5.6.3 --- Installation/include/CGAL/version.h | 4 ++-- Installation/lib/cmake/CGAL/CGALConfigVersion.cmake | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Installation/include/CGAL/version.h b/Installation/include/CGAL/version.h index dabb620b5c7f..3fb11a9164c5 100644 --- a/Installation/include/CGAL/version.h +++ b/Installation/include/CGAL/version.h @@ -17,10 +17,10 @@ #define CGAL_VERSION_H #ifndef SWIG -#define CGAL_VERSION 5.6.2 +#define CGAL_VERSION 5.6.3 #define CGAL_GIT_HASH abcdef #endif -#define CGAL_VERSION_NR 1050621000 +#define CGAL_VERSION_NR 1050631000 #define CGAL_SVN_REVISION 99999 #define CGAL_RELEASE_DATE 20230630 diff --git a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake index b6c42b9d5a35..5140a1207f31 100644 --- a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake +++ b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake @@ -1,8 +1,8 @@ set(CGAL_MAJOR_VERSION 5) set(CGAL_MINOR_VERSION 6) -set(CGAL_BUGFIX_VERSION 2) +set(CGAL_BUGFIX_VERSION 3) include(${CMAKE_CURRENT_LIST_DIR}/CGALConfigBuildVersion.cmake) -set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "5.6.2") +set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "5.6.3") set(CGAL_VERSION_PUBLIC_RELEASE_NAME "CGAL-${CGAL_VERSION_PUBLIC_RELEASE_VERSION}") if (CGAL_BUGFIX_VERSION AND CGAL_BUGFIX_VERSION GREATER 0) From f63429f644dbafe23ae9a365854db68db5c37cf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 23 Oct 2024 09:02:16 +0200 Subject: [PATCH 340/348] check UmfPack is available --- .../examples/Surface_mesh_parameterization/CMakeLists.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt b/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt index 38b0f74f05fc..d7f18ecee2be 100644 --- a/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt +++ b/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt @@ -31,10 +31,10 @@ if(TARGET CGAL::Eigen3_support) message(STATUS "SuiteSparse_LIBS: ${SuiteSparse_LIBRARIES}") message(STATUS "Orbifold Tutte Embeddings will use UmfPackLU") else() - message(STATUS "NOTICE: The example `orbifold.cpp` will be compiled without the SuiteSparse library and UmfPack. Try setting SuiteSparse_UMF_INCLUDE_DIR and at least one of SuiteSparse_UMFPACK_LIBRARY_RELEASE and SuiteSparse_UMFPACK_LIBRARY_DEBUG to you UMFPACK installation.") + message(STATUS "NOTICE: Examples will be compiled without the SuiteSparse library and UmfPack. Try setting SuiteSparse_UMF_INCLUDE_DIR and at least one of SuiteSparse_UMFPACK_LIBRARY_RELEASE and SuiteSparse_UMFPACK_LIBRARY_DEBUG to you UMFPACK installation.") endif() else(SuiteSparse_FOUND) - message(STATUS "NOTICE: The example `orbifold.cpp` will not be compiled without the SuiteSparse library.") + message(STATUS "NOTICE: Examples will not be compiled without the SuiteSparse library.") endif(SuiteSparse_FOUND) # ------------------------------------------------------------------ @@ -57,11 +57,13 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(square_border_parameterizer PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program( "iterative_authalic_parameterizer.cpp" ) target_link_libraries(iterative_authalic_parameterizer PRIVATE CGAL::Eigen3_support) - if(SuiteSparse_FOUND) + if(SuiteSparse_UMFPACK_FOUND OR TARGET SuiteSparse::umfpack) target_compile_definitions(ARAP_parameterization PRIVATE -DEIGEN_DONT_ALIGN_STATICALLY -DCGAL_SMP_USE_SUITESPARSE_SOLVERS ) target_compile_definitions(orbifold PRIVATE -DEIGEN_DONT_ALIGN_STATICALLY -DCGAL_SMP_USE_SUITESPARSE_SOLVERS ) + target_compile_definitions(iterative_authalic_parameterizer PRIVATE -DEIGEN_DONT_ALIGN_STATICALLY -DCGAL_SMP_USE_SUITESPARSE_SOLVERS ) target_link_libraries(ARAP_parameterization PRIVATE ${SuiteSparse_LIBRARIES}) target_link_libraries(orbifold PRIVATE ${SuiteSparse_LIBRARIES}) + target_link_libraries(iterative_authalic_parameterizer PRIVATE ${SuiteSparse_LIBRARIES}) endif() else() From 071144bd763b41c7ecb0c493950d9ed043b2a91f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 23 Oct 2024 09:10:30 +0200 Subject: [PATCH 341/348] fix linking --- .../Surface_mesh_parameterization/CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt b/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt index d7f18ecee2be..5d74cdca6618 100644 --- a/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt +++ b/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/CMakeLists.txt @@ -57,13 +57,13 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(square_border_parameterizer PRIVATE CGAL::Eigen3_support) create_single_source_cgal_program( "iterative_authalic_parameterizer.cpp" ) target_link_libraries(iterative_authalic_parameterizer PRIVATE CGAL::Eigen3_support) - if(SuiteSparse_UMFPACK_FOUND OR TARGET SuiteSparse::umfpack) - target_compile_definitions(ARAP_parameterization PRIVATE -DEIGEN_DONT_ALIGN_STATICALLY -DCGAL_SMP_USE_SUITESPARSE_SOLVERS ) - target_compile_definitions(orbifold PRIVATE -DEIGEN_DONT_ALIGN_STATICALLY -DCGAL_SMP_USE_SUITESPARSE_SOLVERS ) - target_compile_definitions(iterative_authalic_parameterizer PRIVATE -DEIGEN_DONT_ALIGN_STATICALLY -DCGAL_SMP_USE_SUITESPARSE_SOLVERS ) + if(SuiteSparse_FOUND) target_link_libraries(ARAP_parameterization PRIVATE ${SuiteSparse_LIBRARIES}) target_link_libraries(orbifold PRIVATE ${SuiteSparse_LIBRARIES}) - target_link_libraries(iterative_authalic_parameterizer PRIVATE ${SuiteSparse_LIBRARIES}) + if(SuiteSparse_UMFPACK_FOUND OR TARGET SuiteSparse::umfpack) + target_compile_definitions(ARAP_parameterization PRIVATE EIGEN_DONT_ALIGN_STATICALLY CGAL_SMP_USE_SUITESPARSE_SOLVERS ) + target_compile_definitions(orbifold PRIVATE EIGEN_DONT_ALIGN_STATICALLY CGAL_SMP_USE_SUITESPARSE_SOLVERS ) + endif() endif() else() From 88381be445feb11702ae1b2c511c26e7b78aa886 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 23 Oct 2024 09:55:29 +0200 Subject: [PATCH 342/348] fix compilation error --- Lab/demo/Lab/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lab/demo/Lab/CMakeLists.txt b/Lab/demo/Lab/CMakeLists.txt index 81f8702e76c3..ee7d815cd030 100644 --- a/Lab/demo/Lab/CMakeLists.txt +++ b/Lab/demo/Lab/CMakeLists.txt @@ -366,7 +366,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) ${SubViewerUI_files}) target_link_libraries( cgal_lab PRIVATE demo_framework point_dialog Qt6::Widgets - PUBLIC Qt6::Gui Qt6::OpenGLWidgets Qt6::Qml + PUBLIC CGAL::CGAL Qt6::Gui Qt6::OpenGLWidgets Qt6::Qml ) if(LIBSSH_FOUND) target_compile_definitions(cgal_lab PRIVATE -DCGAL_USE_SSH) From 938ff88212da8f6ba131db8e9a2b7899561601b8 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 23 Oct 2024 10:07:27 +0200 Subject: [PATCH 343/348] tag_pr_per_release.sh: allow to relaunch the script if it failed and code review with GH Copilot --- .../developer_scripts/tag_pr_per_release.sh | 90 +++++++++++++------ 1 file changed, 64 insertions(+), 26 deletions(-) diff --git a/Scripts/developer_scripts/tag_pr_per_release.sh b/Scripts/developer_scripts/tag_pr_per_release.sh index 8f5bb568639c..fb7fbea9e90b 100644 --- a/Scripts/developer_scripts/tag_pr_per_release.sh +++ b/Scripts/developer_scripts/tag_pr_per_release.sh @@ -3,58 +3,96 @@ # This script requires Github CLI to be installed and configured. # https://cli.github.com/ # -# example calls within a git repo -# bash tag_pr_per_release.sh 4.12 4.12.1 -# bash tag_pr_per_release.sh 4.12 4.13 -# bash tag_pr_per_release.sh 4.13 4.13.1 +# Example calls within a git repo: +# +# bash tag_pr_per_release.sh 4.12 4.12.1 +# bash tag_pr_per_release.sh 4.12 4.13 +# bash tag_pr_per_release.sh 4.13 4.13.1 # # After the release of CGAL-5.0 the release manager needs to call: -# bash tag_pr_per_release.sh 4.14 5.0 +# +# bash tag_pr_per_release.sh 4.14 5.0 # # After the release of CGAL-4.14.1 the release manager needs to call: -# bash tag_pr_per_release.sh 4.14 4.14.1 +# +# bash tag_pr_per_release.sh 4.14 4.14.1 # # After the release of CGAL-4.14.2 the release manager needs to call: -# bash tag_pr_per_release.sh 4.14 4.14.2 +# +# bash tag_pr_per_release.sh 4.14 4.14.2 # -set -e # Exit the script on first error, for safety +set -e # Exit the script on the first error, for safety err_report() { - echo "Error (code $?) on line $(caller)" + echo "Error (code $?) on line $(caller)" } +# Check if GitHub CLI is installed +if ! command -v gh &> /dev/null; then + echo "GitHub CLI (gh) could not be found. Please install it from https://cli.github.com/" + exit 1 +fi + +# Check if GitHub CLI is authenticated +if ! gh auth status &> /dev/null; then + echo "GitHub CLI is not authenticated. Please run 'gh auth login' to authenticate." + exit 1 +fi + trap 'err_report $LINENO' ERR PREVIOUS_MAJOR_RELEASE=$1 CURRENT_RELEASE=$2 -REMOTE=`git config branch.releases/CGAL-${PREVIOUS_MAJOR_RELEASE}-branch.remote || git config branch.${PREVIOUS_MAJOR_RELEASE}.x-branch.remote` -# $REMOTE should be the "cgal" remote, but a CGAL developer may have keep the -# name "origin", or set to another one. +REMOTE=$(git config branch.releases/CGAL-${PREVIOUS_MAJOR_RELEASE}-branch.remote || git config branch.${PREVIOUS_MAJOR_RELEASE}.x-branch.remote) +# $REMOTE should be the "cgal" remote, but a CGAL developer may have kept the +# name "origin", or set it to another one. # Call git-fetch to refresh the branch, and fetch the references # refs/pull/*/head as well. -git fetch --tags "${REMOTE}" `git config --get-all "remote.${REMOTE}.fetch"` '+refs/pull/*/head:refs/pull/*/head' +git fetch --tags "${REMOTE}" $(git config --get-all "remote.${REMOTE}.fetch") '+refs/pull/*/head:refs/pull/*/head' -PR_LIST=`git log --pretty='%D' v${PREVIOUS_MAJOR_RELEASE}..v${CURRENT_RELEASE} | awk 'match($0, /refs\/pull\/([0-9]+)\/head/, a) {print a[1]}' | sort -u` +PR_LIST=$(git log --pretty='%D' v${PREVIOUS_MAJOR_RELEASE}..v${CURRENT_RELEASE} | awk 'match($0, /refs\/pull\/([0-9]+)\/head/, a) {print a[1]}' | sort -u) -echo gh api repos/CGAL/cgal/labels -F name=Merged_in_${CURRENT_RELEASE} -for i in ${PR_LIST}; do - echo gh pr edit $i --add-label Merged_in_${CURRENT_RELEASE} -done +echo_gh() { + echo "gh $@" +} -read -p "Please confirm operation by typing YES? " -n 4 -r -echo -if [[ $REPLY =~ ^YES$ ]]; then +exit_code=0 - gh api repos/CGAL/cgal/labels -F name=Merged_in_${CURRENT_RELEASE} +do_gh() { + set +e + gh $@ + local err=$? + set -e + case "$err" in + 0|1) + ;; + *) + exit $err + ;; + esac +} + +create_and_set_label() { + local GH=do_gh + if [ "$1" == "--dry-run" ]; then + GH=echo_gh + fi + $GH label create Merged_in_${CURRENT_RELEASE} for i in ${PR_LIST}; do - gh pr edit $i --add-label Merged_in_${CURRENT_RELEASE} + $GH pr edit $i --add-label Merged_in_${CURRENT_RELEASE} done +} +create_and_set_label --dry-run +read -p "Please confirm operation by typing YES? " -n 4 -r +echo +if [[ $REPLY =~ ^YES$ ]]; then + create_and_set_label else - - echo "Abort" - + echo "Aborted" + exit 1 fi +exit $exit_code From 3ad6e21f1469413ea77b0ac659e540552f9c920a Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 23 Oct 2024 10:50:00 +0200 Subject: [PATCH 344/348] fix #7623 [skip ci] --- Maintenance/public_release/scripts/prepare_release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maintenance/public_release/scripts/prepare_release b/Maintenance/public_release/scripts/prepare_release index 889c7e99da3e..26ed73686cb6 100755 --- a/Maintenance/public_release/scripts/prepare_release +++ b/Maintenance/public_release/scripts/prepare_release @@ -82,7 +82,7 @@ zip -q -r ../cgal_manual.zip * popd pushd /srv/CGAL/www/precompiled_libs/auxiliary/x64/ -cp CGAL-5.2-win64-auxiliary-libraries-gmp-mpfr.zip "$DEST_DIR/${PUBLIC_RELEASE_NAME}-win64-auxiliary-libraries-gmp-mpfr.zip" +cp CGAL-6.0.1-win64-auxiliary-libraries-gmp-mpfr.zip "$DEST_DIR/${PUBLIC_RELEASE_NAME}-win64-auxiliary-libraries-gmp-mpfr.zip" popd pushd "$DEST_DIR" From aef524f09ffc053d6b951abe98ada5558f09a21a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 23 Oct 2024 11:44:27 +0200 Subject: [PATCH 345/348] remove extra -D --- Mesh_3/examples/Mesh_3/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/examples/Mesh_3/CMakeLists.txt b/Mesh_3/examples/Mesh_3/CMakeLists.txt index e16b0fca3388..18924a5dfeb4 100644 --- a/Mesh_3/examples/Mesh_3/CMakeLists.txt +++ b/Mesh_3/examples/Mesh_3/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.12...3.29) project(Mesh_3_Examples) add_compile_definitions(CGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX - -DCGAL_MESH_3_NO_DEPRECATED_C3T3_ITERATORS) + CGAL_MESH_3_NO_DEPRECATED_C3T3_ITERATORS) if(CGAL_MESH_3_VERBOSE) add_compile_definitions(CGAL_MESH_3_VERBOSE) From 70f7e73f755e48ce4ef7b5f77b2013cb1cba1b71 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 23 Oct 2024 17:16:25 +0200 Subject: [PATCH 346/348] announcement for 5.5.5, 5.6.2, 6.0, and 6.0.1 [skip ci] --- .../public_release/announcement/mailing.eml | 236 +++++------------- 1 file changed, 65 insertions(+), 171 deletions(-) diff --git a/Maintenance/public_release/announcement/mailing.eml b/Maintenance/public_release/announcement/mailing.eml index eaa3f34962c1..32edf174721f 100644 --- a/Maintenance/public_release/announcement/mailing.eml +++ b/Maintenance/public_release/announcement/mailing.eml @@ -1,177 +1,71 @@ -Subject: CGAL 5.6 Released, Computational Geometry Algorithms Library +Subject: CGAL 5.5.5, 5.6.2, 6.0, and 6.0.1 Released, Computational Geometry Algorithms Library Content-Type: text/plain; charset="utf-8" Body: -The CGAL Open Source Project is pleased to announce the release 5.6 of -CGAL, the Computational Geometry Algorithms Library. - - -Besides fixes and general enhancement to existing packages, the -following has changed since CGAL 5.5: - -General Changes - -- Breaking change: Package-specific assertions, preconditions, and - postconditions (such as CGAL_triangulation_assertion) have been - removed. Corresponding CGAL-wide versions (such as CGAL_assertion) - should be used instead. - -Shape Detection (major changes) - -- Breaking change: The region growing part of the package have been - reworked to fix design issues introduced with the handling of - FaceGraph models. In particular, the notion of Item has been - introduced to reference an element in the input range of elements. - Region maps now operates on Item and no longer on the value type of - the input range. -- Breaking change: The method update() in the concept RegionType now - returns a Boolean instead of void, that is used inside the class - Region_growing for detecting if the input conditions for the new - region are satisfied. This change affects only user-defined types of - regions. -- Breaking change: The constructors of all models used together with - the region growing algorithm now enable users to provide parameters - through the named parameters mechanism. -- All fitting classes in the region growing framework are now using - better versions of the region conditions, more precise and faster, - including the correct normal orientations. -- Added new models of the concept RegionType for getting linear - regions in a set of 2D and 3D segments and on 2D and 3D polylines. -- Added the class Polyline_graph for extracting a set of polylines - from a face graph, which splits this graph into a set of - user-defined regions. -- Added new shapes to the Region Growing algorithm on a point set: - circles in 2D, spheres in 3D, and cylinders in 3D. - -2D Straight Skeleton and Polygon Offsetting (major changes) - -- Added weighted straight skeletons: weighted straight skeletons are a - generalization of straight skeletons. Contour edges are assigned a - positive weight, which can be understood as assigning a speed to the - wavefront spawned from the contour edge. -- Added straight skeleton extrusion: this CGAL package now implements - the extrusion of weighted straight skeletons of polygons with holes. - The output is a closed, combinatorially 2-manifold surface triangle - mesh. See also the news entry. - -Combinatorial Maps, Generalized Maps, and Linear Cell Complex - -- Added a version that uses indices instead of handles as dart and - attribute descriptors. As the indices are integers convertible from - and to std::size_t, they can be used as index into vectors which - store properties. To use the index version, Use_index must be - defined and be equal to CGAL::Tag_true in the item class. - -2D Arrangements - -- Introduced an overload function template, namely draw(arr), that - renders arrangements based on the Basic_viewer_qt class template. As - of now, only 2D arrangements on the plane induced by (i) - segments, (ii) conics, and (iii) circular arcs or (linear) segments - are supported. -- Improved the traits class template that handles conics, namely - Arr_conic_traits_2. This includes the following: 1. Fixed a couple - of bugs and slightly optimized some functions. 2. Introduced - functionality that approximates conics with polylines. (This is used - to draw conic curves.) 3. Breaking change: Changed the interface to - generate conic curves. In the past, curves where generated directly - using the constructors of the conic and x-monotone conic constructs. - Now, they are constructed via function objects provided by the - traits. This eliminates the constructions of temporary kernels. The - old functionality is obsolete, but still supported for a limited - number of versions. It depends on a static member function of the - traits. In a future version this function will no longer be static, - implying that the old functionality will no longer be supported. -- Introduced functionality that approximates circular segments with - polylines. (This is used to draw conic curves.) - -Polygon Mesh Processing - -- Added functions - CGAL::Polygon_mesh_processing::region_growing_of_planes_on_faces() - and CGAL::Polygon_mesh_processing::detect_corners_of_regions(), - which enable partitioning a mesh into planar regions using the - region growing algorithm from the Shape Detection package. - -- Added the functions - CGAL::Polygon_mesh_processing::remesh_planar_patches() and - CGAL::Polygon_mesh_processing::remesh_almost_planar_patches(), which - can be used to remesh patches of coplanar faces in a mesh. - -- Added the function - CGAL::Polygon_mesh_processing::surface_Delaunay_remeshing(), which - can be used to remesh a surface triangle mesh using the Delaunay - refinement algorithm from the 3D Mesh Generation package. - -- Added the function - CGAL::Polygon_mesh_processing::remove_almost_degenerate_faces(), - which can be used to remove badly shaped triangles faces in a mesh. - -- Added the functions - CGAL::Polygon_mesh_processing::does_triangle_soup_self_intersect() - and - CGAL::Polygon_mesh_processing::triangle_soup_self_intersections() to - identify and report self-intersections in a triangle soup, similarly - to existing functions on triangle meshes. - -- Added the function - CGAL::Polygon_mesh_processing::triangulate_polygons(), which allows - users to triangulate polygon soups. - -- Added a named parameter to - CGAL::Polygon_mesh_processing::smooth_shape() to disable the - scaling, which otherwise aims to compensate volume loss during - smoothing. - -- Deprecated the overloads of functions - CGAL::Polygon_mesh_processing::triangulate_hole(), - CGAL::Polygon_mesh_processing::triangulate_and_refine_hole(), and - CGAL::Polygon_mesh_processing::triangulate_refine_and_fair_hole() - which have output iterators for vertices and faces as parameter. - They are replaced by overloads with two additional named parameters. - - -Tetrahedral Remeshing - -- Breaking change: The template parameters of - CGAL::Tetrahedral_remeshing::Remeshing_vertex_base_3 and - CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3 have been - modified. - - -3D Mesh Generation - -- Added two new named parameters to the named constructor - CGAL::create_labeled_image_mesh_domain() for automatic detection and - protection of 1D-curves that lie at the intersection of three or - more subdomains extracted from labeled images. -- Added CGAL::Sizing_field_with_aabb_tree, a geometry-aware sizing - field for feature edges in polyhedral domains. -- Added new meshing criterion edge_min_size to avoid subdividing sharp - edges that are shorter than a prescribed size bound. -- Added new meshing criteria facet_min_size and cell_min_size to - prevent Delaunay refinement from creating simplices smaller than a - prescribed bound. -- Deprecated usage of boost parameters in favor of function named - parameters. - - -Known Bug - -- MSVC 2015 is still supported by this version of CGAL, but the - feature Segment Cell Iterator of the class CGAL::Triangulation_3 - does not compile with MSVC 2015. - - -See https://www.cgal.org/2023/07/28/cgal56/ for a complete list of changes. - - -The development of CGAL will then now on the future CGAL-6.0 (planned -for December 2023), with bug-fixes regularly backported to the branches -for CGAL-5.5.x and CGAL-5.6.x. - -CGAL-6.0 will be the first release of CGAL requiring C++17 or later. It -will also support Qt6. +The CGAL Open Source Project is pleased to announce the recent releases +of CGAL versions 5.5.5, 5.6.2, 6.0, and 6.0.1. + +## CGAL version 6.0 + +CGAL version 6.0 was released on September 27, 2024. Following the +discovery of early issues, version 6.0.1 was subsequently released on +October 22, 2024. + +This version is a major release, with many new features and +improvements. + +General changes + +- C++17 Requirement: CGAL 6.0 requires a C++17 compatible compiler. +- GMP/MPFR Optional: GMP/MPFR are no longer mandatory; + Boost.Multiprecision can be used. +- Qt6 Demos: All demos are now based on Qt6. +- Polyhedral Surface: The demo has been renamed to “CGAL Lab” and + moved to its own directory in demo/Lab/. + +New Packages + +- Kinetic Space Partition: Partition of the space from planar input + shapes. +- Kinetic Surface Reconstruction: Reconstructs surfaces from point + clouds. +- Basic Viewer: Interactive visualization for various CGAL packages. +- Polygon Repair: Algorithms to repair 2D polygons and multipolygons. + +Breaking Changes + +- CMake Changes: UseCGAL.cmake removed; use CGAL::CGAL target instead. +- Kernel: Replaced boost::variant with std::variant and + boost::optional with std::optional in the intersection functions. + +Enhancements + +- AABB Tree: Now supports 2D and 3D primitives. + +See the announcement of CGAL version 6.0.1 for more details: + + https://www.cgal.org/2024/10/22/cgal601/ + + + +## Bug-fix releases + +- CGAL version 5.5.5 has been published. This is the last bug-fix + release for CGAL-5.5. +- CGAL version 5.6.2 has been published. This is the second bug-fix + release for CGAL-5.6. + +These releases include various bug fixes and enhancements. For more details, +please visit: + + https://www.cgal.org/2024/10/22/cgal555/ + https://www.cgal.org/2024/10/22/cgal562/ + + + +The development of CGAL will now focus on the upcoming CGAL-6.1 release, +planned for late 2025. Bug fixes will continue to be backported to the +CGAL-5.6.x and CGAL-6.0.x branches. The CGAL project is a collaborative effort to develop a robust, From 77bfe7d46fecdfcccc8b9e4224e41485aad65662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 24 Oct 2024 14:49:18 +0200 Subject: [PATCH 347/348] add missing link to TBB --- Lab/demo/Lab/CMakeLists.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Lab/demo/Lab/CMakeLists.txt b/Lab/demo/Lab/CMakeLists.txt index ee7d815cd030..885cd774ce1c 100644 --- a/Lab/demo/Lab/CMakeLists.txt +++ b/Lab/demo/Lab/CMakeLists.txt @@ -251,16 +251,20 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) scene_surface_mesh_item scene_polygon_soup_item scene_basic_objects ${TBB_LIBRARIES}) + add_item(scene_tetrahedra_item Scene_tetrahedra_item.cpp) + target_link_libraries(scene_tetrahedra_item PRIVATE scene_c3t3_item) + + if(TARGET CGAL::TBB_support) target_link_libraries(scene_c3t3_item PRIVATE CGAL::TBB_support) target_link_libraries(scene_triangulation_3_item PRIVATE CGAL::TBB_support) + target_link_libraries(scene_tetrahedra_item PRIVATE CGAL::TBB_support) endif() + if(COMMAND target_precompile_headers) # Support for precompiled headers, for Mesh_3 (since CMake 3.16) target_precompile_headers(scene_c3t3_item PUBLIC [["C3t3_type.h"]]) endif() - add_item(scene_tetrahedra_item Scene_tetrahedra_item.cpp) - target_link_libraries(scene_tetrahedra_item PRIVATE scene_c3t3_item) add_item(scene_aff_transformed_item Plugins/PCA/Scene_aff_transformed_item.cpp) From 013214540ab6439ce8dcc255fb8145fb571a99b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 29 Oct 2024 20:27:59 +0100 Subject: [PATCH 348/348] PRIVATE was probably not a good idea for all scene_items ... --- Lab/demo/Lab/Plugins/IO/CMakeLists.txt | 6 ++++++ Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt | 3 +++ Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt | 3 +++ 3 files changed, 12 insertions(+) diff --git a/Lab/demo/Lab/Plugins/IO/CMakeLists.txt b/Lab/demo/Lab/Plugins/IO/CMakeLists.txt index 3938e505c923..e75932580170 100644 --- a/Lab/demo/Lab/Plugins/IO/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/IO/CMakeLists.txt @@ -55,6 +55,9 @@ set_package_properties( cgal_lab_plugin(triangulation_3_io_plugin triangulation_3_io_plugin KEYWORDS Viewer) target_link_libraries(triangulation_3_io_plugin PRIVATE scene_triangulation_3_item) +if(TARGET CGAL::TBB_support) + target_link_libraries(triangulation_3_io_plugin PRIVATE CGAL::TBB_support) +endif() if(VTK_FOUND AND VTK_LIBRARIES) message(STATUS "VTK ${VTK_VERSION} found ${VTK_LIBRARIES}") @@ -69,6 +72,9 @@ if(VTK_FOUND AND VTK_LIBRARIES) ${VTK_LIBRARIES} ) target_compile_definitions(vtk_plugin PRIVATE -DCGAL_USE_VTK -DNOMINMAX) + if(TARGET CGAL::TBB_support) + target_link_libraries(vtk_plugin PRIVATE CGAL::TBB_support) + endif() else() message(STATUS "NOTICE: the vtk IO plugin needs VTK 9.0 or greater and will not be compiled.") endif() diff --git a/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt b/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt index acf4b0dfdc84..6edbaf4da55a 100644 --- a/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Mesh_3/CMakeLists.txt @@ -92,6 +92,9 @@ target_link_libraries(c3t3_io_plugin PRIVATE scene_c3t3_item) qt6_wrap_ui(tetraUI_FILES Tetrahedra_filter_widget.ui) cgal_lab_plugin(tetrahedra_filtering_plugin Tetrahedra_filtering_plugin ${tetraUI_FILES} KEYWORDS Mesh_3 Viewer) target_link_libraries(tetrahedra_filtering_plugin PRIVATE scene_c3t3_item scene_tetrahedra_item) +if(TARGET CGAL::TBB_support) + target_link_libraries(tetrahedra_filtering_plugin PRIVATE CGAL::TBB_support) +endif() qt6_wrap_ui(ribUI_FILES Rib_dialog.ui) cgal_lab_plugin(c3t3_rib_exporter_plugin C3t3_rib_exporter_plugin diff --git a/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt b/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt index db89b35b63c4..a4b4f6570bb4 100644 --- a/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt +++ b/Lab/demo/Lab/Plugins/Tetrahedral_remeshing/CMakeLists.txt @@ -19,3 +19,6 @@ include(CGAL_Eigen3_support) if(TARGET CGAL::Eigen3_support) target_link_libraries(tetrahedral_remeshing_plugin PRIVATE CGAL::Eigen3_support) endif() +if(TARGET CGAL::TBB_support) + target_link_libraries(tetrahedral_remeshing_plugin PRIVATE CGAL::TBB_support) +endif()