diff --git a/CGAL_ImageIO/include/CGAL/ImageIO.h b/CGAL_ImageIO/include/CGAL/ImageIO.h index 45e82f5b38e..9e86bcea315 100644 --- a/CGAL_ImageIO/include/CGAL/ImageIO.h +++ b/CGAL_ImageIO/include/CGAL/ImageIO.h @@ -20,7 +20,7 @@ #include #include -#include // for uint32_t, etc. +#include // for uint32_t, etc. #ifdef CGAL_USE_ZLIB #include @@ -562,38 +562,50 @@ struct Word_type_generator template <> struct Word_type_generator { -// typedef boost::int8_t type; +// typedef std::int8_t type; typedef char type; }; template <> struct Word_type_generator { - typedef boost::uint8_t type; + typedef std::uint8_t type; }; template <> struct Word_type_generator { - typedef boost::int16_t type; + typedef std::int16_t type; }; template <> struct Word_type_generator { - typedef boost::uint16_t type; + typedef std::uint16_t type; }; template <> struct Word_type_generator { - typedef boost::int32_t type; + typedef std::int32_t type; }; template <> struct Word_type_generator { - typedef boost::uint32_t type; + typedef std::uint32_t type; +}; + +template <> +struct Word_type_generator +{ + typedef std::int64_t type; +}; + +template <> +struct Word_type_generator +{ + typedef std::uint64_t type; }; template diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index c16f83d01f6..89d062ddddf 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -3270,6 +3270,14 @@ pages = "207--221" year={1998} } + +@techreport{cgal:hssz-gmcabonbc-97, + title={A generalized marching cubes algorithm based on non-binary classifications}, + author={H-C. Hege and M. Seebass and D. Stalling and M. Zöckler}, + number={SC 97-05}, + year={1997} +} + % ---------------------------------------------------------------------------- % END OF BIBFILE % ---------------------------------------------------------------------------- diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index b7cccb78915..6baa48451f2 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -38,6 +38,13 @@ CGAL tetrahedral Delaunay refinement algorithm. - This new package wraps all the existing code that deals with a `MeshComplex_3InTriangulation_3` to describe 3D simplicial meshes, and makes the data structure independent from the tetrahedral mesh generation package. +### [Tetrahedral 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()` +for automatic detection and protection +of 1D-curves that lie at the intersection of three or more subdomains, +extracted from labeled images. + ### [Shape Detection](https://doc.cgal.org/5.6/Manual/packages.html#PkgShapeDetection) (breaking change, major changes) - **Breaking change**: The region growing part of the package have been reworked to fix design issues introduced with the handling `FaceGraph` models. @@ -59,6 +66,7 @@ CGAL tetrahedral Delaunay refinement algorithm. and cylinders in 3D. ### [2D Arrangements](https://doc.cgal.org/5.6/Manual/packages.html#PkgArrangementOnSurface2) + - Fixed some code that handles geodesic-curves on spheres that compare x- and y-coordinates on the boundary of the parameter space. It mainly effected the naive point-location. ### [2D Convex Hulls](https://doc.cgal.org/5.6/Manual/packages.html#PkgConvexHull2) diff --git a/Mesh_3/doc/Mesh_3/Doxyfile.in b/Mesh_3/doc/Mesh_3/Doxyfile.in index 13f34ec4653..d3608c7b5a0 100644 --- a/Mesh_3/doc/Mesh_3/Doxyfile.in +++ b/Mesh_3/doc/Mesh_3/Doxyfile.in @@ -18,7 +18,9 @@ INPUT += \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_facet_topology.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_vertex_base_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_cell_base_3.h \ - ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Compact_mesh_cell_base_3.h + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Compact_mesh_cell_base_3.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_3/Detect_features_in_image.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_3/Detect_features_on_image_bbox.h PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - 3D Mesh Generation" HTML_EXTRA_FILES = ${CGAL_PACKAGE_DOC_DIR}/fig/implicit_domain_3.jpg \ diff --git a/Mesh_3/doc/Mesh_3/Mesh_3.txt b/Mesh_3/doc/Mesh_3/Mesh_3.txt index 29ba32bd500..bdcfd189db7 100644 --- a/Mesh_3/doc/Mesh_3/Mesh_3.txt +++ b/Mesh_3/doc/Mesh_3/Mesh_3.txt @@ -735,7 +735,6 @@ Surface of the output mesh generated with a very small `facet_distance` without the weights (left, 25563 vertices) and with the weights (right, 19936 vertices). \cgalFigureEnd - \subsubsection Mesh_3DomainsFrom3DImagesWithCustomInitialization Domains From 3D Images, with a Custom Initialization The example \ref Mesh_3/mesh_3D_image_with_custom_initialization.cpp is a modification @@ -926,23 +925,27 @@ The first modification is the type of the mesh domain. Instead of being \snippet Mesh_3/mesh_3D_image_with_features.cpp Domain definition -Then, in the function `%main()`, after the `%domain` object has been created, -a dedicated function computes the 1D-features, and adds them to the domain. +In the %main() function, the domain is created with an additional argument - a +dedicated functor that computes the one-dimensional features, which are then +added to the domain. -\snippet Mesh_3/mesh_3D_image_with_features.cpp Call add_1D_features +\snippet Mesh_3/mesh_3D_image_with_detection_of_features.cpp Domain creation -The function template `%add_1D_features()` is defined in the example -file. It uses non-documented code from \cgal, that should be copy-pasted in -any user-code willing to use similar code. It uses the undocumented -function template `%CGAL::polylines_to_protect` that computes the -1D-features that correspond to the intersection of the bounding box of the -image with the surfaces defined by the image. At the same time, a few other -polylines are added as 1D-features, to protect 1D curves in the interior of -the image. Then, the method -`CGAL::Mesh_domain_with_polyline_features_3::add_features` is called twice -to add the computed 1D-features to the mesh domain. +The `CGAL::Mesh_3::Detect_features_in_image` functor is defined in its own +header file. It computes the one-dimensional features that correspond to the +intersections of the bounding box of the image with the surfaces defined by the +image, as well as polylines that lie at the intersection of three or more +subdomains (including the outside). It then constructs a graph of these polyline +features. The named constructor adds this feature graph to the domain for later +feature protection. The original feature detection algorithm was described in +\cgalCite{cgal:hssz-gmcabonbc-97}, which provides a list of possible voxel +configurations. The feature detection implemented in \cgal generalizes this +description. -\snippet Mesh_3/mesh_3D_image_with_features.cpp Add 1D features +The example \ref Mesh_3/mesh_3D_image_with_features.cpp shows how +user-specified input polylines can further be added as 1D features to the mesh domain. + +\snippet Mesh_3/mesh_3D_image_with_features.cpp Domain creation In the meshing criteria, if 1D features are added to the domain, the user can define the parameter `edge_size` of the criteria class @@ -970,7 +973,7 @@ protection of the 1D-features. Left: the mesh without any call to `%add_features()`. Middle: the mesh with only the 1D-features computed by -`%CGAL::polylines_to_protect()`. +`CGAL::Mesh_3::Detect_features_on_image_bbox()`. Right: the mesh with added 1D-features in the interior of the bounding box of the image. diff --git a/Mesh_3/doc/Mesh_3/PackageDescription.txt b/Mesh_3/doc/Mesh_3/PackageDescription.txt index 8cf21dda78d..df967f98afd 100644 --- a/Mesh_3/doc/Mesh_3/PackageDescription.txt +++ b/Mesh_3/doc/Mesh_3/PackageDescription.txt @@ -16,6 +16,10 @@ /// \ingroup PkgMesh3Ref /// The classes in this group are models of domain concepts and their associated classes. +/// \defgroup PkgMesh3FeatureDetection Feature Detection +/// \ingroup PkgMesh3Ref +/// The functors in this group perform polyline features detection in input domains. + /// \defgroup PkgMesh3Functions Mesh Generation Functions /// \ingroup PkgMesh3Ref /// The two main functions to generate a mesh are `make_mesh_3()` and `refine_mesh_3()`. @@ -103,6 +107,11 @@ and their associated classes: - `CGAL::Labeled_image_mesh_domain_3` (deprecated) - `CGAL::Gray_image_mesh_domain_3` (deprecated) +The following functors are available for feature detection: + +- `CGAL::Mesh_3::Detect_features_in_image` +- `CGAL::Mesh_3::Detect_features_on_image_bbox` + \cgalCRPSection{Function Templates} - `CGAL::make_mesh_3()` diff --git a/Mesh_3/doc/Mesh_3/examples.txt b/Mesh_3/doc/Mesh_3/examples.txt index aa44908504c..748bc156d00 100644 --- a/Mesh_3/doc/Mesh_3/examples.txt +++ b/Mesh_3/doc/Mesh_3/examples.txt @@ -4,6 +4,8 @@ \example Mesh_3/mesh_3D_gray_image_with_custom_initialization.cpp \example Mesh_3/mesh_3D_image_with_features.cpp \example Mesh_3/mesh_3D_image_with_custom_initialization.cpp +\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/random_labeled_image.h \example CGAL/Mesh_3/initialize_triangulation_from_gray_image.h diff --git a/Mesh_3/examples/Mesh_3/CMakeLists.txt b/Mesh_3/examples/Mesh_3/CMakeLists.txt index 335e98aa0de..3e00317b782 100644 --- a/Mesh_3/examples/Mesh_3/CMakeLists.txt +++ b/Mesh_3/examples/Mesh_3/CMakeLists.txt @@ -133,6 +133,12 @@ if(TARGET CGAL::CGAL_ImageIO) create_single_source_cgal_program("mesh_3D_image_with_features.cpp") target_link_libraries(mesh_3D_image_with_features PUBLIC 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) + + 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) + if(CGAL_ImageIO_USE_ZLIB) create_single_source_cgal_program("mesh_optimization_example.cpp") target_link_libraries(mesh_optimization_example PUBLIC CGAL::Eigen3_support) @@ -185,6 +191,8 @@ if(CGAL_ACTIVATE_CONCURRENT_MESH_3 AND TARGET CGAL::TBB_support) mesh_3D_image_with_custom_initialization mesh_3D_gray_image_with_custom_initialization mesh_3D_image_with_features + mesh_3D_image_with_detection_of_features + mesh_3D_image_with_input_features mesh_implicit_domains mesh_implicit_sphere mesh_implicit_sphere_variable_size diff --git a/Mesh_3/examples/Mesh_3/mesh_3D_image_variable_size.cpp b/Mesh_3/examples/Mesh_3/mesh_3D_image_variable_size.cpp index 2f07fbf3abf..c4d07143c0a 100644 --- a/Mesh_3/examples/Mesh_3/mesh_3D_image_variable_size.cpp +++ b/Mesh_3/examples/Mesh_3/mesh_3D_image_variable_size.cpp @@ -1,5 +1,3 @@ -#define CGAL_MESH_3_VERBOSE - #include #include diff --git a/Mesh_3/examples/Mesh_3/mesh_3D_image_with_detection_of_features.cpp b/Mesh_3/examples/Mesh_3/mesh_3D_image_with_detection_of_features.cpp new file mode 100644 index 00000000000..0ab73c9748e --- /dev/null +++ b/Mesh_3/examples/Mesh_3/mesh_3D_image_with_detection_of_features.cpp @@ -0,0 +1,86 @@ +#include +#include + +#include +#include +#include + +#include +#include + +/// [Domain definition] +#include +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef CGAL::Labeled_mesh_domain_3 Image_domain; +typedef CGAL::Mesh_domain_with_polyline_features_3 Mesh_domain; +/// [Domain definition] + +#include + +#ifdef CGAL_CONCURRENT_MESH_3 +typedef CGAL::Parallel_tag Concurrency_tag; +#else +typedef CGAL::Sequential_tag Concurrency_tag; +#endif + +// Triangulation +typedef CGAL::Mesh_triangulation_3::type Tr; + +typedef CGAL::Mesh_complex_3_in_triangulation_3 C3t3; + +// Criteria +typedef CGAL::Mesh_criteria_3 Mesh_criteria; + +// To avoid verbose function and named parameters call +namespace params = CGAL::parameters; + +int main(int argc, char* argv[]) +{ + const std::string fname = (argc>1)?argv[1]:CGAL::data_file_path("images/420.inr"); + + /// [Loads image] + CGAL::Image_3 image; + if(!image.read(fname)){ + std::cerr << "Error: Cannot read file " << fname << std::endl; + return EXIT_FAILURE; + } + /// [Loads image] + + /// [Domain creation] + Mesh_domain domain + = Mesh_domain::create_labeled_image_mesh_domain(image, + params::features_detector = CGAL::Mesh_3::Detect_features_in_image()); + /// [Domain creation] + + CGAL::Bbox_3 bbox = domain.bbox(); + double diag = CGAL::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) + + CGAL::square(bbox.ymax() - bbox.ymin()) + + CGAL::square(bbox.zmax() - bbox.zmin())); + double sizing_default = diag * 0.05; + + /// [Mesh criteria] + /// Note that `edge_size` is needed with 1D-features + Mesh_criteria criteria(params::edge_size = sizing_default, + params::facet_angle = 30, + params::facet_size = sizing_default, + params::facet_distance = sizing_default / 10, + params::facet_topology = CGAL::FACET_VERTICES_ON_SAME_SURFACE_PATCH, + params::cell_radius_edge_ratio = 0, + params::cell_size = 0 + ); + /// [Mesh criteria] + + /// [Meshing] + C3t3 c3t3 = CGAL::make_mesh_3(domain, criteria, + params::no_exude(), + params::no_perturb()); + /// [Meshing] + + // Output + CGAL::dump_c3t3(c3t3, "out"); + + return 0; +} diff --git a/Mesh_3/examples/Mesh_3/mesh_3D_image_with_features.cpp b/Mesh_3/examples/Mesh_3/mesh_3D_image_with_features.cpp index 15d8c843bcf..eab5ad9ef56 100644 --- a/Mesh_3/examples/Mesh_3/mesh_3D_image_with_features.cpp +++ b/Mesh_3/examples/Mesh_3/mesh_3D_image_with_features.cpp @@ -18,6 +18,8 @@ typedef CGAL::Labeled_mesh_domain_3 Image_domain; typedef CGAL::Mesh_domain_with_polyline_features_3 Mesh_domain; /// [Domain definition] +#include + #ifdef CGAL_CONCURRENT_MESH_3 typedef CGAL::Parallel_tag Concurrency_tag; #else @@ -34,40 +36,8 @@ typedef CGAL::Mesh_criteria_3 Mesh_criteria; namespace params = CGAL::parameters; -/// [Add 1D features] +// Read input features #include "read_polylines.h" -#include // undocumented header - -// Protect the intersection of the object with the box of the image, -// by declaring 1D-features. Note that `CGAL::polylines_to_protect` is -// not documented. -bool add_1D_features(const CGAL::Image_3& image, - Mesh_domain& domain, - const std::string lines_fname) -{ - typedef K::Point_3 Point_3; - typedef unsigned char Word_type; - - std::vector > features_inside; - if(!read_polylines(lines_fname, features_inside)) // see file "read_polylines.h" - { - std::cerr << "Error: Cannot read file " << lines_fname << std::endl; - return false; - } - - std::vector > polylines_on_bbox; - CGAL::polylines_to_protect(image, polylines_on_bbox, - features_inside.begin(), - features_inside.end()); - - domain.add_features(polylines_on_bbox.begin(), polylines_on_bbox.end()); - - // It is very important that the polylines from the file `lines_fname` - // contain only polylines in the inside of the box of the image. - domain.add_features(features_inside.begin(), features_inside.end()); - return true; -} -/// [Add 1D features] int main(int argc, char* argv[]) { @@ -79,21 +49,28 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } - // Domain - Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain(image); - - /// Declare 1D-features, see above [Call add_1D_features] - const std::string lines_fname = (argc>2)?argv[2]:CGAL::data_file_path("images/420.polylines.txt"); - - if(!add_1D_features(image, domain, lines_fname)) { + /// Load 1D-features + const std::string lines_fname = (argc > 2) ? argv[2] : CGAL::data_file_path("images/420.polylines.txt"); + std::vector > features_inside; + if (!read_polylines(lines_fname, features_inside)) // see file "read_polylines.h" + { + std::cerr << "Error: Cannot read file " << lines_fname << std::endl; return EXIT_FAILURE; } - /// [Call add_1D_features] + + /// [Domain creation] + Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain(image, + params::features_detector = CGAL::Mesh_3::Detect_features_on_image_bbox(), + params::input_features = std::cref(features_inside));//use std::cref to avoid a copy + /// [Domain creation] /// Note that `edge_size` is needed with 1D-features [Mesh criteria] - Mesh_criteria criteria(params::edge_size(6). - facet_angle(30).facet_size(6).facet_distance(4). - cell_radius_edge_ratio(3).cell_size(8)); + Mesh_criteria criteria(params::edge_size = 6., + params::facet_angle = 30, + params::facet_size = 6, + params::facet_distance = 4, + params::cell_radius_edge_ratio = 3, + params::cell_size = 8); /// [Mesh criteria] // Meshing @@ -104,5 +81,5 @@ int main(int argc, char* argv[]) CGAL::IO::write_MEDIT(medit_file, c3t3); medit_file.close(); - return 0; + return EXIT_SUCCESS; } diff --git a/Mesh_3/examples/Mesh_3/mesh_3D_image_with_input_features.cpp b/Mesh_3/examples/Mesh_3/mesh_3D_image_with_input_features.cpp new file mode 100644 index 00000000000..8a83efae986 --- /dev/null +++ b/Mesh_3/examples/Mesh_3/mesh_3D_image_with_input_features.cpp @@ -0,0 +1,82 @@ +#include +#include + +#include +#include +#include + +#include +#include + +/// [Domain definition] +#include +#include +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef CGAL::Labeled_mesh_domain_3 Image_domain; +typedef CGAL::Mesh_domain_with_polyline_features_3 Mesh_domain; +/// [Domain definition] + +#ifdef CGAL_CONCURRENT_MESH_3 +using Concurrency_tag = CGAL::Parallel_tag; +#else +using Concurrency_tag = CGAL::Sequential_tag; +#endif + +// Triangulation +typedef CGAL::Mesh_triangulation_3::type Tr; + +typedef CGAL::Mesh_complex_3_in_triangulation_3 C3t3; + +// Criteria +typedef CGAL::Mesh_criteria_3 Mesh_criteria; + +namespace params = CGAL::parameters; + +#include "read_polylines.h" + +int main(int argc, char* argv[]) +{ + const std::string fname = (argc>1)?argv[1]:CGAL::data_file_path("images/420.inr"); + // Loads image + CGAL::Image_3 image; + if(!image.read(fname)){ + std::cerr << "Error: Cannot read file " << fname << std::endl; + return EXIT_FAILURE; + } + + /// Declare 1D-features + const std::string lines_fname = (argc>2)?argv[2]:CGAL::data_file_path("images/420.polylines.txt"); + using Point_3 = K::Point_3; + std::vector > features_inside; + if (!read_polylines(lines_fname, features_inside)) // see file "read_polylines.h" + { + std::cerr << "Error: Cannot read file " << lines_fname << std::endl; + return EXIT_FAILURE; + } + + /// [Domain creation] + Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain(image, + params::input_features = std::cref(features_inside));//use std::cref to avoid a copy + /// [Domain creation] + + /// Note that `edge_size` is needed with 1D-features [Mesh criteria] + Mesh_criteria criteria(params::edge_size = 6, + params::facet_angle = 30, + params::facet_size = 6, + params::facet_distance = 4, + params::cell_radius_edge_ratio = 3, + params::cell_size = 8); + /// [Mesh criteria] + + // Meshing + C3t3 c3t3 = CGAL::make_mesh_3(domain, criteria); + + // Output + std::ofstream medit_file("out.mesh"); + CGAL::IO::write_MEDIT(medit_file, c3t3); + medit_file.close(); + + return EXIT_SUCCESS; +} diff --git a/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h b/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h index 764444851de..62c9eb47b5c 100644 --- a/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h @@ -24,6 +24,7 @@ #include #include +#include #include namespace CGAL { diff --git a/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h b/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h index bc2ff03ff73..d9bd487410a 100644 --- a/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include diff --git a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h index 6faf6ee86ba..c995f28aeb7 100644 --- a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -48,6 +49,11 @@ #endif #include +#include +#include + +#include + namespace CGAL { namespace Mesh_3 { namespace internal { @@ -117,15 +123,67 @@ namespace internal { } }; + // Detect_features_in_domain + template + struct Detect_features_in_domain { + std::vector> + operator()(const CGAL::Image_3& image, DetectFunctor functor) const { +#if defined(BOOST_MSVC) && (BOOST_MSVC < 1910) //before msvc2017 + return functor.operator()(image); +#else + return functor.template operator()(image); +#endif + } + }; + // specialization for `Null_functor`: create the default functor + template + struct Detect_features_in_domain { + std::vector> + operator()(const CGAL::Image_3&, Null_functor) const { + return std::vector>(); + } + }; + + template + std::vector> + detect_features(const CGAL::Image_3& image, DetectFunctor functor) + { + Detect_features_in_domain detector; + return detector(image, functor); + } + + template + struct Add_features_in_domain { + template + void operator()(const CGAL::Image_3&, MeshDomain&, const InputFeatureRange&, DetectFunctor) + {} + }; + + template<> + struct Add_features_in_domain + { + template + void operator()(const CGAL::Image_3& image, + MeshDomain& domain, + const InputFeatureRange& input_features, + DetectFunctor functor) + { + using P = typename MeshDomain::Point_3; + auto detected_feature_range + = CGAL::Mesh_3::internal::detect_features

(image, functor); + + CGAL::merge_and_snap_polylines(image, detected_feature_range, input_features); + + if (!input_features.empty()) + domain.add_features(input_features.begin(), input_features.end()); + domain.add_features(detected_feature_range.begin(), detected_feature_range.end()); + } + }; + } // end namespace CGAL::Mesh_3::internal } // end namespace CGAL::Mesh_3 #ifndef DOXYGEN_RUNNING -struct Null_subdomain_index { - template - bool operator()(const T& x) const { return 0 == x; } -}; - template struct Construct_pair_from_subdomain_indices { typedef std::pair result_type; @@ -539,6 +597,11 @@ public: * domain to be discretized is the union of voxels that have non-zero * values. * + * \returns either a `Labeled_mesh_domain_3`, + * or a `Mesh_domain_with_polyline_features_3` + * depending on whether one or more of the named parameters + * `features_detector` and `input_features` are provided. + * * \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * \param image_ the input 3D image. * \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below: @@ -565,6 +628,34 @@ public: * bound, relative to the diameter of the box of the image.} * \cgalParamDefault{FT(1e-3)} * \cgalParamNEnd + * + * \cgalParamNBegin{features_detector} + * \cgalParamDescription{ a functor that implements + * `std::vector> operator()(const Image_3& img) const`, + * where `%Point` matches the mesh domain point type. + * It returns a range of detected polyline features, which are added + * to the domain for feature protection. + * See \ref PkgMesh3FeatureDetection for a list of available functors.} + * \cgalParamDefault{CGAL::Null_functor()} + * \cgalParamExtra{The return type of the function depends on whether this parameter + or `input_features` are provided or not.} + * \cgalParamExtra{If `weights` is provided, this parameter is ignored} + * \cgalParamNEnd + * + * \cgalParamNBegin{input_features} + * \cgalParamDescription{ a `Range` of polyline features, represented as `Range`s of `Point_3`. + * Polyline features are added to the domain for further feature protection. + * Input polyline features must be different from the detected features + * and can intersect only at vertices, if they do. Otherwise, + * the meshing process may not terminate.} + * \cgalParamDefault{`std::vector>()`} + * \cgalParamExtra{The return type of the function depends on whether this parameter + or `input_features` are provided or not.} + * \cgalParamExtra{It is recommended to pass a const-reference for this parameter, + * possibly using `std::cref(polylines_range)` to avoid useless copies.} + * \cgalParamExtra{If `weights` is provided, this parameter is ignored} + * \cgalParamNEnd + * * \cgalNamedParamsEnd * * \cgalHeading{Example} @@ -578,13 +669,24 @@ public: * * \snippet Mesh_3/mesh_3D_weighted_image.cpp Domain creation * + * From the example (\ref Mesh_3/mesh_3D_image_with_detection_of_features.cpp) + * where the features are detected in `image`: + * + * \snippet Mesh_3/mesh_3D_image_with_detection_of_features.cpp Domain creation + * + * From the example (\ref Mesh_3/mesh_3D_image_with_input_features.cpp) + * where the features are provided by the user: + * + * \snippet Mesh_3/mesh_3D_image_with_input_features.cpp Domain creation */ template - static Labeled_mesh_domain_3 create_labeled_image_mesh_domain(const CGAL::Image_3& image_, const CGAL_NP_CLASS& np = parameters::default_values()) + static auto + create_labeled_image_mesh_domain(const CGAL::Image_3& image_, const CGAL_NP_CLASS& np = parameters::default_values()) { using parameters::get_parameter; using parameters::get_parameter_reference; using parameters::choose_parameter; + auto iso_value_ = choose_parameter(get_parameter(np, internal_np::iso_value_param), 0); auto value_outside_ = choose_parameter(get_parameter(np, internal_np::voxel_value), 0); FT relative_error_bound_ = choose_parameter(get_parameter(np, internal_np::error_bound), FT(1e-3)); @@ -592,41 +694,62 @@ public: CGAL::Random* p_rng_ = choose_parameter(get_parameter(np, internal_np::rng), nullptr); auto null_subdomain_index_ = choose_parameter(get_parameter(np, internal_np::null_subdomain_index_param), Null_functor()); auto construct_surface_patch_index_ = choose_parameter(get_parameter(np, internal_np::surface_patch_index), Null_functor()); - const CGAL::Image_3& weights_ = choose_parameter(get_parameter_reference(np, internal_np::weights_param), CGAL::Image_3()); + + using Image_ref_type = typename internal_np::Lookup_named_param_def::reference; + CGAL::Image_3 no_weights; + const Image_ref_type weights_ = choose_parameter(get_parameter_reference(np, internal_np::weights_param), no_weights); + auto features_detector_ = choose_parameter(get_parameter(np, internal_np::features_detector_param), Null_functor()); + + using Default_input_features = std::vector>; + using Input_features_ref_type = typename internal_np::Lookup_named_param_def::reference; + Default_input_features empty_vec; + Input_features_ref_type input_features_ + = choose_parameter(get_parameter_reference(np, internal_np::input_features_param), empty_vec); + CGAL_USE(iso_value_); namespace p = CGAL::parameters; + auto image_wrapper = weights_.is_valid() + ? create_weighted_labeled_image_wrapper(image_, + weights_, + image_values_to_subdomain_indices_, + value_outside_) + : create_labeled_image_wrapper(image_, + image_values_to_subdomain_indices_, + value_outside_); + + // warning : keep Return_type consistent with actual return type + const bool no_features + = CGAL::parameters::is_default_parameter::value + && CGAL::parameters::is_default_parameter::value; + using Return_type = std::conditional_t < + no_features, + Labeled_mesh_domain_3, + Mesh_domain_with_polyline_features_3 + >; + + Return_type domain + (p::function = image_wrapper, + p::bounding_object = Mesh_3::internal::compute_bounding_box(image_), + p::relative_error_bound = relative_error_bound_, + p::p_rng = p_rng_, + p::null_subdomain_index = + create_null_subdomain_index(null_subdomain_index_), + p::construct_surface_patch_index = + create_construct_surface_patch_index(construct_surface_patch_index_)); + if (weights_.is_valid()) - { - return Labeled_mesh_domain_3 - (p::function = create_weighted_labeled_image_wrapper - (image_, - weights_, - image_values_to_subdomain_indices_, - value_outside_), - p::bounding_object = Mesh_3::internal::compute_bounding_box(image_), - p::relative_error_bound = relative_error_bound_, - p::p_rng = p_rng_, - p::null_subdomain_index = - create_null_subdomain_index(null_subdomain_index_), - p::construct_surface_patch_index = - create_construct_surface_patch_index(construct_surface_patch_index_)); - } - else - { - return Labeled_mesh_domain_3 - (p::function = create_labeled_image_wrapper - (image_, - image_values_to_subdomain_indices_, - value_outside_), - p::bounding_object = Mesh_3::internal::compute_bounding_box(image_), - p::relative_error_bound = relative_error_bound_, - p::p_rng = p_rng_, - p::null_subdomain_index = - create_null_subdomain_index(null_subdomain_index_), - p::construct_surface_patch_index = - create_construct_surface_patch_index(construct_surface_patch_index_)); - } + return domain; + + // features + Mesh_3::internal::Add_features_in_domain() + (image_, domain, input_features_, features_detector_); + + return domain; } /// @} @@ -686,7 +809,7 @@ public: } template - static Labeled_mesh_domain_3 create_labeled_image_mesh_domain(const CGAL_NP_CLASS& np) + static auto create_labeled_image_mesh_domain(const CGAL_NP_CLASS& np) { static_assert(!parameters::is_default_parameter::value, "Value for required parameter not found"); using parameters::get_parameter_reference; @@ -698,10 +821,10 @@ public: template - static Labeled_mesh_domain_3 create_labeled_image_mesh_domain(const CGAL::Image_3& image_, - const CGAL_NP_CLASS_1& np1, - const CGAL_NP_CLASS_2& np2, - const NP& ... nps) + static auto create_labeled_image_mesh_domain(const CGAL::Image_3& image_, + const CGAL_NP_CLASS_1& np1, + const CGAL_NP_CLASS_2& np2, + const NP& ... nps) { return create_labeled_image_mesh_domain(image_, internal_np::combine_named_parameters(np1, np2, nps...)); } @@ -709,9 +832,9 @@ public: template - static Labeled_mesh_domain_3 create_labeled_image_mesh_domain(const CGAL_NP_CLASS_1& np1, - const CGAL_NP_CLASS_2& np2, - const NP& ... nps) + static auto create_labeled_image_mesh_domain(const CGAL_NP_CLASS_1& np1, + const CGAL_NP_CLASS_2& np2, + const NP& ... nps) { return create_labeled_image_mesh_domain(internal_np::combine_named_parameters(np1, np2, nps...)); } @@ -904,9 +1027,9 @@ public: // null(f(p)) means p is outside the domain Subdomain_index index = (r_domain_.function_)(p); if ( r_domain_.null(index) ) - return Subdomain(); + return Subdomain{}; else - return Subdomain(index); + return Subdomain{ index }; } private: const Labeled_mesh_domain_3& r_domain_; diff --git a/Mesh_3/include/CGAL/Mesh_3/Detect_features_in_image.h b/Mesh_3/include/CGAL/Mesh_3/Detect_features_in_image.h new file mode 100644 index 00000000000..d12c55b1d8a --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/Detect_features_in_image.h @@ -0,0 +1,290 @@ +// Copyright (c) 2022 GeometryFactory (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) : Sebastien Loriot, Jane Tournois +// +//****************************************************************************** +// +//****************************************************************************** + +#ifndef CGAL_MESH_3_DETECT_FEATURES_IN_IMAGE_H +#define CGAL_MESH_3_DETECT_FEATURES_IN_IMAGE_H + +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#ifdef CGAL_DEBUG_TRIPLE_LINES +#include +#endif + +namespace CGAL +{ +namespace Mesh_3 +{ +namespace internal +{ + +// Protect the intersection of the object with the box of the image, +// by declaring 1D-features. Note that `CGAL::polylines_to_protect` is +// not documented. +template +std::vector> +detect_features_in_image_with_know_word_type(const CGAL::Image_3& image) +{ + using Gt = typename CGAL::Kernel_traits

::Kernel; + using Point_3 = P; + using Vector_3 = typename Gt::Vector_3; + using Polyline_type = std::vector; + using Polylines = std::vector; + + CGAL::Mesh_3::Triple_line_extractor lines; + + Polylines features_inside; + + const double vx = image.vx(); + const double vy = image.vy(); + const double vz = image.vz(); + const double dist_bound = (std::min)(vx, (std::min)(vy, vz)) / 256; + const double sq_dist_bound = dist_bound * dist_bound; + + const std::size_t xdim = image.xdim(); + const std::size_t ydim = image.ydim(); + const std::size_t zdim = image.zdim(); + + const float tx = image.tx(); + const float ty = image.ty(); + const float tz = image.tz(); + + using CGAL::IMAGEIO::static_evaluate; + + using Del = CGAL::Delaunay_triangulation_3; + using Cell_handle = typename Del::Cell_handle; + using Vertex_handle = typename Del::Vertex_handle; + Del triangulation; + Cell_handle start_cell; + + using Word //use unsigned integral Word type to use it as an index + = typename CGAL::IMAGEIO::Word_type_generator::type; + + using Color_transform = internal::Color_transformation_helper; + typename Color_transform::type color_transformation; + std::array inv_color_transformation; + + using Permutation = internal::Permutation; + using Coord = internal::Coordinates; + + for (std::size_t k = 0, end_k = zdim - 1; k < end_k; ++k) + for (std::size_t j = 0, end_j = ydim - 1; j < end_j; ++j) + for (std::size_t i = 0, end_i = xdim - 1; i < end_i; ++i) + { + Vector_3 translation{ i * vx + tx, + j * vy + ty, + k * vz + tz }; + + const std::array cube = { + static_evaluate(image.image(), i , j , k), + static_evaluate(image.image(), i + 1, j , k), + static_evaluate(image.image(), i , j + 1, k), + static_evaluate(image.image(), i + 1, j + 1, k), + static_evaluate(image.image(), i , j , k + 1), + static_evaluate(image.image(), i + 1, j , k + 1), + static_evaluate(image.image(), i , j + 1, k + 1), + static_evaluate(image.image(), i + 1, j + 1, k + 1), + }; /// TODO: optimize the access to the image data + bool monocolor = (cube[0] == cube[1]); + for (int i = 2; i < 8; ++i) monocolor = monocolor && (cube[0] == cube[i]); + if (monocolor) continue; + + Color_transform::reset(color_transformation); + + std::uint8_t nb_color = 0; + for (int i = 0; i < 8; ++i) { + if (!Color_transform::is_valid(color_transformation, cube[i])) + { + color_transformation[cube[i]] = nb_color; + inv_color_transformation[nb_color] = cube[i]; + ++nb_color; + } + } + std::array reference_cube = { + color_transformation[cube[0]], + color_transformation[cube[1]], + color_transformation[cube[2]], + color_transformation[cube[3]], + color_transformation[cube[4]], + color_transformation[cube[5]], + color_transformation[cube[6]], + color_transformation[cube[7]] + }; + auto case_it = internal::find_case(internal::cases, reference_cube); + const bool case_found = (case_it != std::end(internal::cases)); + if (case_found) reference_cube = internal::combinations[(*case_it)[8]]; + else { + //std::cerr << "Warning: case not found: " << reference_cube << '\n'; + CGAL_error(); + }; +#ifdef CGAL_DEBUG_TRIPLE_LINES + CGAL::Mesh_3::internal::debug_cerr("Cube", cube); + CGAL::Mesh_3::internal::debug_cerr("reference cube", reference_cube); + CGAL::Mesh_3::internal::debug_cerr("with transformation", internal::cube_isometries[(*case_it)[9]]); +#endif // CGAL_DEBUG_TRIPLE_LINES + + auto fct_it = lines.create_polylines_fcts.find(reference_cube); + if (fct_it != lines.create_polylines_fcts.end()) + { +#ifdef CGAL_DEBUG_TRIPLE_LINES + CGAL::Mesh_3::internal::debug_cerr("Using the function of", Cube(fct_it->first)); +#endif // CGAL_DEBUG_TRIPLE_LINES + + Polylines cube_features = (fct_it->second)(10); + if (case_found) + { + const Permutation& transformation = internal::cube_isometries[(*case_it)[9]]; + + Coord a1 = internal::coordinates[transformation[0]]; + Coord u = internal::minus(internal::coordinates[transformation[1]], a1); + Coord v = internal::minus(internal::coordinates[transformation[2]], a1); + Coord w = internal::minus(internal::coordinates[transformation[4]], a1); + + const Point_3 pa{ a1[0], a1[1], a1[2] }; + const Vector_3 vu{ u[0], u[1], u[2] }; + const Vector_3 vv{ v[0], v[1], v[2] }; + const Vector_3 vw{ w[0], w[1], w[2] }; +#ifdef CGAL_DEBUG_TRIPLE_LINES + std::cerr << "pa: " << pa << "\n"; + std::cerr << "vu: " << vu << "\n"; + std::cerr << "vv: " << vv << "\n"; + std::cerr << "vw: " << vw << "\n"; +#endif // CGAL_DEBUG_TRIPLE_LINES + for (auto& polyline : cube_features) { + for (auto& point : polyline) { + point = pa + + point.x() * vu + + point.y() * vv + + point.z() * vw; + point = { vx * point.x(), + vy * point.y(), + vz * point.z(), }; + point = point + translation; + } + for (int i = 0; i < 2; ++i) { + Point_3& extremity = (i == 0) ? polyline.front() : polyline.back(); + Vertex_handle vh = triangulation.nearest_vertex(extremity, start_cell); + if (Vertex_handle() != vh) { + if (squared_distance(vh->point(), extremity) < sq_dist_bound) { + extremity = vh->point(); + } + } + vh = triangulation.insert(extremity, start_cell); + start_cell = vh->cell(); + } + features_inside.push_back(std::move(polyline)); + } // end loop on polylines + } // end case where the transformation is not the identity + } // end if the reference_cube has polylines + } + + // call the split_graph_into_polylines, to create long polylines from the + // short polylines that were generated per voxel. + Polylines polylines_inside; + CGAL::polylines_to_protect(polylines_inside, + features_inside.begin(), + features_inside.end()); + + Polylines polylines_on_bbox; + CGAL::polylines_to_protect(image, polylines_on_bbox, + polylines_inside.begin(), + polylines_inside.end()); + + polylines_inside.insert(polylines_inside.end(), + polylines_on_bbox.begin(), + polylines_on_bbox.end()); + +#ifdef CGAL_DEBUG_TRIPLE_LINES + std::ofstream output_polylines("out-generated.polylines.txt"); + output_polylines.precision(17); + for (auto poly : boost::range::join(polylines_on_bbox, polylines_inside)) { + output_polylines << poly.size(); + for (auto p : poly) output_polylines << " " << p; + output_polylines << std::endl; + } +#endif + + return polylines_inside; +} + + +}// namespace internal + +/*! +* \ingroup PkgMesh3FeatureDetection +* +* Functor for feature detection in labeled images. +*/ +struct Detect_features_in_image +{ +public: + /*! + * detects and constructs the polylines that lie at the + * intersection of three or more subdomains. + * + * Each subdomain inside the bounding box + * of the input labeled image is defined as the set of voxels + * with the same value. The outside of the bounding box + * of the image is considered as a subdomain with voxel value + * `value_outside` (see \link CGAL::Labeled_mesh_domain_3::create_labeled_image_mesh_domain `create_labeled_image_mesh_domain()` \endlink + * parameters description). Hence, this function also computes + * intersections with the image bounding box. + * + * \tparam Point class model of `Kernel::Point_3`. It + * must match the triangulation point type. + * + * \param image the input image + * + * \returns a `std::vector>` + * containing the constructed polylines for later feature protection. + */ + template + std::vector> + operator()(const CGAL::Image_3& image) const + { + CGAL_IMAGE_IO_CASE(image.image(), + return (internal::detect_features_in_image_with_know_word_type(image)); + ); + CGAL_error_msg("This place should never be reached, because it would mean " + "the image word type is a type that is not handled by " + "CGAL_ImageIO."); + + return std::vector>(); + } +}; + + +}//end namespace Mesh_3 +}//end namespace CGAL + + +#endif //CGAL_MESH_3_DETECT_FEATURES_IN_IMAGE_H diff --git a/Mesh_3/include/CGAL/Mesh_3/Detect_features_on_image_bbox.h b/Mesh_3/include/CGAL/Mesh_3/Detect_features_on_image_bbox.h new file mode 100644 index 00000000000..e6a7385659f --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/Detect_features_on_image_bbox.h @@ -0,0 +1,100 @@ +// Copyright (c) 2022 GeometryFactory (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) : Laurent Rineau, Jane Tournois +// +//****************************************************************************** +// +//****************************************************************************** + +#ifndef CGAL_MESH_3_DETECT_FEATURES_ON_IMAGE_BBOX_H +#define CGAL_MESH_3_DETECT_FEATURES_ON_IMAGE_BBOX_H + +#include + +#include + +#include + + +namespace CGAL +{ +namespace Mesh_3 +{ +namespace internal +{ + +template +std::vector> +detect_features_on_bbox(const CGAL::Image_3& image) +{ + using Point_3 = Point; + using Polyline_type = std::vector; + using Polylines = std::vector; + + Polylines polylines_on_bbox; + + CGAL_IMAGE_IO_CASE(image.image(), + { + (CGAL::polylines_to_protect(image, polylines_on_bbox)); + return polylines_on_bbox; + } + ); + CGAL_error_msg("This place should never be reached, because it would mean " + "the image word type is a type that is not handled by " + "CGAL_ImageIO."); + return Polylines(); +} + +}// namespace internal + +/*! +* \ingroup PkgMesh3FeatureDetection +* +* Functor for feature detection in labeled images. +*/ +struct Detect_features_on_image_bbox +{ +public: + + /*! + * detects and constructs the polylines that lie at the + * intersection of two or more subdomains and the bounding box + * of the input labeled image. + * + * Each subdomain inside the bounding box + * of the input labeled image is defined as the set of voxels + * with the same value. The outside of the bounding box + * of the image is considered as a subdomain with voxel value + * `value_outside` (see \link CGAL::Labeled_mesh_domain_3::create_labeled_image_mesh_domain `create_labeled_image_mesh_domain()` \endlink + * parameters description). Hence, this function computes + * intersections of "internal" subdomains with the image bounding box. + * + * \tparam Point class model of `Kernel::Point_3`. The point type + * must match the triangulation point type. + * + * \param image the input image + * + * \returns a `std::vector>` + * containing the constructed polylines for later feature protection. + */ + template + std::vector> + operator()(const CGAL::Image_3& image) const + { + return internal::detect_features_on_bbox(image); + } +}; + +}//end namespace Mesh_3 +}//end namespace CGAL + + +#endif //CGAL_MESH_3_DETECT_FEATURES_ON_IMAGE_BBOX_H diff --git a/Mesh_3/include/CGAL/Mesh_3/Null_subdomain_index.h b/Mesh_3/include/CGAL/Mesh_3/Null_subdomain_index.h new file mode 100644 index 00000000000..8889db81f44 --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/Null_subdomain_index.h @@ -0,0 +1,29 @@ +// Copyright (c) 2015 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) : Laurent Rineau + +#ifndef CGAL_MESH_3_NULL_SUBDOMAIN_INDEX +#define CGAL_MESH_3_NULL_SUBDOMAIN_INDEX + +#include + +#ifndef DOXYGEN_RUNNING + +namespace CGAL { + struct Null_subdomain_index { + template + bool operator()(const T& x) const { return 0 == x; } + }; +} + +#endif + +#endif //CGAL_MESH_3_NULL_SUBDOMAIN_INDEX diff --git a/Mesh_3/include/CGAL/Mesh_3/features_detection/cases_table.h b/Mesh_3/include/CGAL/Mesh_3/features_detection/cases_table.h new file mode 100644 index 00000000000..5510f6061bf --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/features_detection/cases_table.h @@ -0,0 +1,4204 @@ +// Copyright (c) 2022 GeometryFactory (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) : Sebastien Loriot +// +//****************************************************************************** +// +//****************************************************************************** + +#ifndef CGAL_MESH_3_FEATURES_DETECTION_CASES_TABLES_H +#define CGAL_MESH_3_FEATURES_DETECTION_CASES_TABLES_H + +#include + +#include +#include +#include +#include +#include + +namespace CGAL +{ +namespace Mesh_3 +{ +namespace internal +{ + +using Combination = std::array; +using Hash_combination = boost::hash; + +using Cases = std::array[4140]; + +inline auto find_case(const Cases& cases, Combination comb) { + using std::begin; + using std::end; + return std::lower_bound(begin(cases), end(cases), + std::array{ + comb[0], + comb[1], + comb[2], + comb[3], + comb[4], + comb[5], + comb[6], + comb[7], + 0, + 0 + }); +}; +const Cases cases = { +{ {0,0,0,0,0,0,0,0, 0,0} }, +{ {0,0,0,0,0,0,0,1, 1,0} }, +{ {0,0,0,0,0,0,1,0, 1,1} }, +{ {0,0,0,0,0,0,1,1, 2,0} }, +{ {0,0,0,0,0,0,1,2, 3,0} }, +{ {0,0,0,0,0,1,0,0, 1,6} }, +{ {0,0,0,0,0,1,0,1, 2,18} }, +{ {0,0,0,0,0,1,0,2, 3,19} }, +{ {0,0,0,0,0,1,1,0, 4,0} }, +{ {0,0,0,0,0,1,1,1, 5,0} }, +{ {0,0,0,0,0,1,1,2, 6,0} }, +{ {0,0,0,0,0,1,2,0, 7,0} }, +{ {0,0,0,0,0,1,2,1, 8,0} }, +{ {0,0,0,0,0,1,2,2, 8,19} }, +{ {0,0,0,0,0,1,2,3, 58,0} }, +{ {0,0,0,0,1,0,0,0, 1,7} }, +{ {0,0,0,0,1,0,0,1, 4,1} }, +{ {0,0,0,0,1,0,0,2, 7,1} }, +{ {0,0,0,0,1,0,1,0, 2,15} }, +{ {0,0,0,0,1,0,1,1, 5,1} }, +{ {0,0,0,0,1,0,1,2, 8,1} }, +{ {0,0,0,0,1,0,2,0, 3,14} }, +{ {0,0,0,0,1,0,2,1, 6,1} }, +{ {0,0,0,0,1,0,2,2, 8,14} }, +{ {0,0,0,0,1,0,2,3, 58,1} }, +{ {0,0,0,0,1,1,0,0, 2,6} }, +{ {0,0,0,0,1,1,0,1, 5,18} }, +{ {0,0,0,0,1,1,0,2, 8,18} }, +{ {0,0,0,0,1,1,1,0, 5,15} }, +{ {0,0,0,0,1,1,1,1, 9,0} }, +{ {0,0,0,0,1,1,1,2, 10,0} }, +{ {0,0,0,0,1,1,2,0, 8,15} }, +{ {0,0,0,0,1,1,2,1, 10,1} }, +{ {0,0,0,0,1,1,2,2, 11,0} }, +{ {0,0,0,0,1,1,2,3, 59,0} }, +{ {0,0,0,0,1,2,0,0, 3,6} }, +{ {0,0,0,0,1,2,0,1, 6,18} }, +{ {0,0,0,0,1,2,0,2, 8,17} }, +{ {0,0,0,0,1,2,0,3, 58,18} }, +{ {0,0,0,0,1,2,1,0, 8,16} }, +{ {0,0,0,0,1,2,1,1, 10,18} }, +{ {0,0,0,0,1,2,1,2, 11,18} }, +{ {0,0,0,0,1,2,1,3, 59,19} }, +{ {0,0,0,0,1,2,2,0, 6,15} }, +{ {0,0,0,0,1,2,2,1, 12,0} }, +{ {0,0,0,0,1,2,2,2, 10,15} }, +{ {0,0,0,0,1,2,2,3, 60,0} }, +{ {0,0,0,0,1,2,3,0, 58,15} }, +{ {0,0,0,0,1,2,3,1, 60,1} }, +{ {0,0,0,0,1,2,3,2, 59,14} }, +{ {0,0,0,0,1,2,3,3, 59,17} }, +{ {0,0,0,0,1,2,3,4, 124,0} }, +{ {0,0,0,1,0,0,0,0, 1,2} }, +{ {0,0,0,1,0,0,0,1, 2,12} }, +{ {0,0,0,1,0,0,0,2, 3,13} }, +{ {0,0,0,1,0,0,1,0, 4,3} }, +{ {0,0,0,1,0,0,1,1, 5,21} }, +{ {0,0,0,1,0,0,1,2, 6,21} }, +{ {0,0,0,1,0,0,2,0, 7,21} }, +{ {0,0,0,1,0,0,2,1, 8,21} }, +{ {0,0,0,1,0,0,2,2, 8,32} }, +{ {0,0,0,1,0,0,2,3, 58,21} }, +{ {0,0,0,1,0,1,0,0, 4,13} }, +{ {0,0,0,1,0,1,0,1, 5,13} }, +{ {0,0,0,1,0,1,0,2, 6,13} }, +{ {0,0,0,1,0,1,1,0, 13,0} }, +{ {0,0,0,1,0,1,1,1, 14,0} }, +{ {0,0,0,1,0,1,1,2, 15,0} }, +{ {0,0,0,1,0,1,2,0, 16,0} }, +{ {0,0,0,1,0,1,2,1, 17,0} }, +{ {0,0,0,1,0,1,2,2, 18,0} }, +{ {0,0,0,1,0,1,2,3, 61,0} }, +{ {0,0,0,1,0,2,0,0, 7,27} }, +{ {0,0,0,1,0,2,0,1, 8,40} }, +{ {0,0,0,1,0,2,0,2, 8,13} }, +{ {0,0,0,1,0,2,0,3, 58,40} }, +{ {0,0,0,1,0,2,1,0, 16,19} }, +{ {0,0,0,1,0,2,1,1, 17,19} }, +{ {0,0,0,1,0,2,1,2, 18,19} }, +{ {0,0,0,1,0,2,1,3, 61,19} }, +{ {0,0,0,1,0,2,2,0, 16,13} }, +{ {0,0,0,1,0,2,2,1, 18,13} }, +{ {0,0,0,1,0,2,2,2, 17,13} }, +{ {0,0,0,1,0,2,2,3, 61,13} }, +{ {0,0,0,1,0,2,3,0, 62,0} }, +{ {0,0,0,1,0,2,3,1, 63,0} }, +{ {0,0,0,1,0,2,3,2, 63,21} }, +{ {0,0,0,1,0,2,3,3, 63,40} }, +{ {0,0,0,1,0,2,3,4, 125,0} }, +{ {0,0,0,1,1,0,0,0, 19,0} }, +{ {0,0,0,1,1,0,0,1, 20,0} }, +{ {0,0,0,1,1,0,0,2, 21,0} }, +{ {0,0,0,1,1,0,1,0, 20,20} }, +{ {0,0,0,1,1,0,1,1, 22,0} }, +{ {0,0,0,1,1,0,1,2, 23,0} }, +{ {0,0,0,1,1,0,2,0, 21,20} }, +{ {0,0,0,1,1,0,2,1, 23,20} }, +{ {0,0,0,1,1,0,2,2, 24,0} }, +{ {0,0,0,1,1,0,2,3, 64,0} }, +{ {0,0,0,1,1,1,0,0, 20,26} }, +{ {0,0,0,1,1,1,0,1, 22,19} }, +{ {0,0,0,1,1,1,0,2, 23,19} }, +{ {0,0,0,1,1,1,1,0, 25,0} }, +{ {0,0,0,1,1,1,1,1, 5,5} }, +{ {0,0,0,1,1,1,1,2, 26,0} }, +{ {0,0,0,1,1,1,2,0, 27,0} }, +{ {0,0,0,1,1,1,2,1, 28,0} }, +{ {0,0,0,1,1,1,2,2, 29,0} }, +{ {0,0,0,1,1,1,2,3, 65,0} }, +{ {0,0,0,1,1,2,0,0, 21,26} }, +{ {0,0,0,1,1,2,0,1, 23,41} }, +{ {0,0,0,1,1,2,0,2, 24,19} }, +{ {0,0,0,1,1,2,0,3, 64,19} }, +{ {0,0,0,1,1,2,1,0, 27,19} }, +{ {0,0,0,1,1,2,1,1, 28,19} }, +{ {0,0,0,1,1,2,1,2, 29,19} }, +{ {0,0,0,1,1,2,1,3, 65,19} }, +{ {0,0,0,1,1,2,2,0, 30,0} }, +{ {0,0,0,1,1,2,2,1, 31,0} }, +{ {0,0,0,1,1,2,2,2, 32,0} }, +{ {0,0,0,1,1,2,2,3, 66,0} }, +{ {0,0,0,1,1,2,3,0, 67,0} }, +{ {0,0,0,1,1,2,3,1, 68,0} }, +{ {0,0,0,1,1,2,3,2, 69,0} }, +{ {0,0,0,1,1,2,3,3, 69,19} }, +{ {0,0,0,1,1,2,3,4, 126,0} }, +{ {0,0,0,1,2,0,0,0, 33,0} }, +{ {0,0,0,1,2,0,0,1, 34,0} }, +{ {0,0,0,1,2,0,0,2, 35,0} }, +{ {0,0,0,1,2,0,0,3, 70,0} }, +{ {0,0,0,1,2,0,1,0, 35,20} }, +{ {0,0,0,1,2,0,1,1, 28,39} }, +{ {0,0,0,1,2,0,1,2, 36,0} }, +{ {0,0,0,1,2,0,1,3, 71,0} }, +{ {0,0,0,1,2,0,2,0, 34,20} }, +{ {0,0,0,1,2,0,2,1, 37,0} }, +{ {0,0,0,1,2,0,2,2, 28,29} }, +{ {0,0,0,1,2,0,2,3, 72,0} }, +{ {0,0,0,1,2,0,3,0, 70,20} }, +{ {0,0,0,1,2,0,3,1, 72,20} }, +{ {0,0,0,1,2,0,3,2, 71,20} }, +{ {0,0,0,1,2,0,3,3, 73,0} }, +{ {0,0,0,1,2,0,3,4, 127,0} }, +{ {0,0,0,1,2,1,0,0, 35,26} }, +{ {0,0,0,1,2,1,0,1, 28,22} }, +{ {0,0,0,1,2,1,0,2, 36,19} }, +{ {0,0,0,1,2,1,0,3, 71,19} }, +{ {0,0,0,1,2,1,1,0, 38,0} }, +{ {0,0,0,1,2,1,1,1, 17,22} }, +{ {0,0,0,1,2,1,1,2, 39,0} }, +{ {0,0,0,1,2,1,1,3, 74,0} }, +{ {0,0,0,1,2,1,2,0, 40,0} }, +{ {0,0,0,1,2,1,2,1, 41,0} }, +{ {0,0,0,1,2,1,2,2, 42,0} }, +{ {0,0,0,1,2,1,2,3, 75,0} }, +{ {0,0,0,1,2,1,3,0, 76,0} }, +{ {0,0,0,1,2,1,3,1, 77,0} }, +{ {0,0,0,1,2,1,3,2, 78,0} }, +{ {0,0,0,1,2,1,3,3, 79,0} }, +{ {0,0,0,1,2,1,3,4, 128,0} }, +{ {0,0,0,1,2,2,0,0, 34,26} }, +{ {0,0,0,1,2,2,0,1, 37,19} }, +{ {0,0,0,1,2,2,0,2, 28,10} }, +{ {0,0,0,1,2,2,0,3, 72,19} }, +{ {0,0,0,1,2,2,1,0, 40,19} }, +{ {0,0,0,1,2,2,1,1, 41,19} }, +{ {0,0,0,1,2,2,1,2, 42,19} }, +{ {0,0,0,1,2,2,1,3, 75,19} }, +{ {0,0,0,1,2,2,2,0, 26,11} }, +{ {0,0,0,1,2,2,2,1, 43,0} }, +{ {0,0,0,1,2,2,2,2, 10,11} }, +{ {0,0,0,1,2,2,2,3, 80,0} }, +{ {0,0,0,1,2,2,3,0, 81,0} }, +{ {0,0,0,1,2,2,3,1, 82,0} }, +{ {0,0,0,1,2,2,3,2, 83,0} }, +{ {0,0,0,1,2,2,3,3, 84,0} }, +{ {0,0,0,1,2,2,3,4, 129,0} }, +{ {0,0,0,1,2,3,0,0, 70,26} }, +{ {0,0,0,1,2,3,0,1, 72,41} }, +{ {0,0,0,1,2,3,0,2, 71,41} }, +{ {0,0,0,1,2,3,0,3, 73,19} }, +{ {0,0,0,1,2,3,0,4, 127,19} }, +{ {0,0,0,1,2,3,1,0, 76,19} }, +{ {0,0,0,1,2,3,1,1, 77,19} }, +{ {0,0,0,1,2,3,1,2, 78,19} }, +{ {0,0,0,1,2,3,1,3, 79,19} }, +{ {0,0,0,1,2,3,1,4, 128,19} }, +{ {0,0,0,1,2,3,2,0, 81,19} }, +{ {0,0,0,1,2,3,2,1, 82,19} }, +{ {0,0,0,1,2,3,2,2, 83,19} }, +{ {0,0,0,1,2,3,2,3, 84,19} }, +{ {0,0,0,1,2,3,2,4, 129,19} }, +{ {0,0,0,1,2,3,3,0, 85,0} }, +{ {0,0,0,1,2,3,3,1, 86,0} }, +{ {0,0,0,1,2,3,3,2, 87,0} }, +{ {0,0,0,1,2,3,3,3, 88,0} }, +{ {0,0,0,1,2,3,3,4, 130,0} }, +{ {0,0,0,1,2,3,4,0, 131,0} }, +{ {0,0,0,1,2,3,4,1, 132,0} }, +{ {0,0,0,1,2,3,4,2, 133,0} }, +{ {0,0,0,1,2,3,4,3, 134,0} }, +{ {0,0,0,1,2,3,4,4, 134,19} }, +{ {0,0,0,1,2,3,4,5, 167,0} }, +{ {0,0,1,0,0,0,0,0, 1,3} }, +{ {0,0,1,0,0,0,0,1, 4,2} }, +{ {0,0,1,0,0,0,0,2, 7,20} }, +{ {0,0,1,0,0,0,1,0, 2,9} }, +{ {0,0,1,0,0,0,1,1, 5,20} }, +{ {0,0,1,0,0,0,1,2, 8,20} }, +{ {0,0,1,0,0,0,2,0, 3,8} }, +{ {0,0,1,0,0,0,2,1, 6,20} }, +{ {0,0,1,0,0,0,2,2, 8,43} }, +{ {0,0,1,0,0,0,2,3, 58,20} }, +{ {0,0,1,0,0,1,0,0, 19,1} }, +{ {0,0,1,0,0,1,0,1, 20,21} }, +{ {0,0,1,0,0,1,0,2, 21,21} }, +{ {0,0,1,0,0,1,1,0, 20,1} }, +{ {0,0,1,0,0,1,1,1, 22,1} }, +{ {0,0,1,0,0,1,1,2, 23,21} }, +{ {0,0,1,0,0,1,2,0, 21,1} }, +{ {0,0,1,0,0,1,2,1, 23,1} }, +{ {0,0,1,0,0,1,2,2, 24,1} }, +{ {0,0,1,0,0,1,2,3, 64,21} }, +{ {0,0,1,0,0,2,0,0, 33,1} }, +{ {0,0,1,0,0,2,0,1, 35,21} }, +{ {0,0,1,0,0,2,0,2, 34,21} }, +{ {0,0,1,0,0,2,0,3, 70,21} }, +{ {0,0,1,0,0,2,1,0, 34,1} }, +{ {0,0,1,0,0,2,1,1, 28,44} }, +{ {0,0,1,0,0,2,1,2, 37,1} }, +{ {0,0,1,0,0,2,1,3, 72,21} }, +{ {0,0,1,0,0,2,2,0, 35,1} }, +{ {0,0,1,0,0,2,2,1, 36,1} }, +{ {0,0,1,0,0,2,2,2, 28,30} }, +{ {0,0,1,0,0,2,2,3, 71,21} }, +{ {0,0,1,0,0,2,3,0, 70,1} }, +{ {0,0,1,0,0,2,3,1, 71,1} }, +{ {0,0,1,0,0,2,3,2, 72,1} }, +{ {0,0,1,0,0,2,3,3, 73,1} }, +{ {0,0,1,0,0,2,3,4, 127,21} }, +{ {0,0,1,0,1,0,0,0, 4,8} }, +{ {0,0,1,0,1,0,0,1, 13,1} }, +{ {0,0,1,0,1,0,0,2, 16,1} }, +{ {0,0,1,0,1,0,1,0, 5,8} }, +{ {0,0,1,0,1,0,1,1, 14,1} }, +{ {0,0,1,0,1,0,1,2, 17,1} }, +{ {0,0,1,0,1,0,2,0, 6,8} }, +{ {0,0,1,0,1,0,2,1, 15,1} }, +{ {0,0,1,0,1,0,2,2, 18,1} }, +{ {0,0,1,0,1,0,2,3, 61,1} }, +{ {0,0,1,0,1,1,0,0, 20,23} }, +{ {0,0,1,0,1,1,0,1, 25,1} }, +{ {0,0,1,0,1,1,0,2, 27,1} }, +{ {0,0,1,0,1,1,1,0, 22,14} }, +{ {0,0,1,0,1,1,1,1, 5,4} }, +{ {0,0,1,0,1,1,1,2, 28,1} }, +{ {0,0,1,0,1,1,2,0, 23,14} }, +{ {0,0,1,0,1,1,2,1, 26,1} }, +{ {0,0,1,0,1,1,2,2, 29,1} }, +{ {0,0,1,0,1,1,2,3, 65,1} }, +{ {0,0,1,0,1,2,0,0, 35,23} }, +{ {0,0,1,0,1,2,0,1, 38,1} }, +{ {0,0,1,0,1,2,0,2, 40,1} }, +{ {0,0,1,0,1,2,0,3, 76,1} }, +{ {0,0,1,0,1,2,1,0, 28,27} }, +{ {0,0,1,0,1,2,1,1, 17,27} }, +{ {0,0,1,0,1,2,1,2, 41,1} }, +{ {0,0,1,0,1,2,1,3, 77,1} }, +{ {0,0,1,0,1,2,2,0, 36,14} }, +{ {0,0,1,0,1,2,2,1, 39,1} }, +{ {0,0,1,0,1,2,2,2, 42,1} }, +{ {0,0,1,0,1,2,2,3, 78,1} }, +{ {0,0,1,0,1,2,3,0, 71,14} }, +{ {0,0,1,0,1,2,3,1, 74,1} }, +{ {0,0,1,0,1,2,3,2, 75,1} }, +{ {0,0,1,0,1,2,3,3, 79,1} }, +{ {0,0,1,0,1,2,3,4, 128,1} }, +{ {0,0,1,0,2,0,0,0, 7,22} }, +{ {0,0,1,0,2,0,0,1, 16,14} }, +{ {0,0,1,0,2,0,0,2, 16,8} }, +{ {0,0,1,0,2,0,0,3, 62,1} }, +{ {0,0,1,0,2,0,1,0, 8,35} }, +{ {0,0,1,0,2,0,1,1, 17,14} }, +{ {0,0,1,0,2,0,1,2, 18,8} }, +{ {0,0,1,0,2,0,1,3, 63,1} }, +{ {0,0,1,0,2,0,2,0, 8,8} }, +{ {0,0,1,0,2,0,2,1, 18,14} }, +{ {0,0,1,0,2,0,2,2, 17,8} }, +{ {0,0,1,0,2,0,2,3, 63,20} }, +{ {0,0,1,0,2,0,3,0, 58,35} }, +{ {0,0,1,0,2,0,3,1, 61,14} }, +{ {0,0,1,0,2,0,3,2, 61,8} }, +{ {0,0,1,0,2,0,3,3, 63,35} }, +{ {0,0,1,0,2,0,3,4, 125,1} }, +{ {0,0,1,0,2,1,0,0, 21,23} }, +{ {0,0,1,0,2,1,0,1, 27,14} }, +{ {0,0,1,0,2,1,0,2, 30,1} }, +{ {0,0,1,0,2,1,0,3, 67,1} }, +{ {0,0,1,0,2,1,1,0, 23,34} }, +{ {0,0,1,0,2,1,1,1, 28,14} }, +{ {0,0,1,0,2,1,1,2, 31,1} }, +{ {0,0,1,0,2,1,1,3, 68,1} }, +{ {0,0,1,0,2,1,2,0, 24,14} }, +{ {0,0,1,0,2,1,2,1, 29,14} }, +{ {0,0,1,0,2,1,2,2, 32,1} }, +{ {0,0,1,0,2,1,2,3, 69,1} }, +{ {0,0,1,0,2,1,3,0, 64,14} }, +{ {0,0,1,0,2,1,3,1, 65,14} }, +{ {0,0,1,0,2,1,3,2, 66,1} }, +{ {0,0,1,0,2,1,3,3, 69,14} }, +{ {0,0,1,0,2,1,3,4, 126,1} }, +{ {0,0,1,0,2,2,0,0, 34,23} }, +{ {0,0,1,0,2,2,0,1, 40,14} }, +{ {0,0,1,0,2,2,0,2, 26,10} }, +{ {0,0,1,0,2,2,0,3, 81,1} }, +{ {0,0,1,0,2,2,1,0, 37,14} }, +{ {0,0,1,0,2,2,1,1, 41,14} }, +{ {0,0,1,0,2,2,1,2, 43,1} }, +{ {0,0,1,0,2,2,1,3, 82,1} }, +{ {0,0,1,0,2,2,2,0, 28,11} }, +{ {0,0,1,0,2,2,2,1, 42,14} }, +{ {0,0,1,0,2,2,2,2, 10,10} }, +{ {0,0,1,0,2,2,2,3, 83,1} }, +{ {0,0,1,0,2,2,3,0, 72,14} }, +{ {0,0,1,0,2,2,3,1, 75,14} }, +{ {0,0,1,0,2,2,3,2, 80,1} }, +{ {0,0,1,0,2,2,3,3, 84,1} }, +{ {0,0,1,0,2,2,3,4, 129,1} }, +{ {0,0,1,0,2,3,0,0, 70,23} }, +{ {0,0,1,0,2,3,0,1, 76,14} }, +{ {0,0,1,0,2,3,0,2, 85,1} }, +{ {0,0,1,0,2,3,0,3, 81,14} }, +{ {0,0,1,0,2,3,0,4, 131,1} }, +{ {0,0,1,0,2,3,1,0, 72,34} }, +{ {0,0,1,0,2,3,1,1, 77,44} }, +{ {0,0,1,0,2,3,1,2, 86,1} }, +{ {0,0,1,0,2,3,1,3, 82,14} }, +{ {0,0,1,0,2,3,1,4, 132,1} }, +{ {0,0,1,0,2,3,2,0, 73,14} }, +{ {0,0,1,0,2,3,2,1, 79,14} }, +{ {0,0,1,0,2,3,2,2, 88,1} }, +{ {0,0,1,0,2,3,2,3, 84,14} }, +{ {0,0,1,0,2,3,2,4, 134,1} }, +{ {0,0,1,0,2,3,3,0, 71,34} }, +{ {0,0,1,0,2,3,3,1, 78,14} }, +{ {0,0,1,0,2,3,3,2, 87,1} }, +{ {0,0,1,0,2,3,3,3, 83,14} }, +{ {0,0,1,0,2,3,3,4, 133,1} }, +{ {0,0,1,0,2,3,4,0, 127,14} }, +{ {0,0,1,0,2,3,4,1, 128,14} }, +{ {0,0,1,0,2,3,4,2, 130,1} }, +{ {0,0,1,0,2,3,4,3, 129,14} }, +{ {0,0,1,0,2,3,4,4, 134,14} }, +{ {0,0,1,0,2,3,4,5, 167,1} }, +{ {0,0,1,1,0,0,0,0, 2,2} }, +{ {0,0,1,1,0,0,0,1, 5,2} }, +{ {0,0,1,1,0,0,0,2, 8,33} }, +{ {0,0,1,1,0,0,1,0, 5,3} }, +{ {0,0,1,1,0,0,1,1, 9,2} }, +{ {0,0,1,1,0,0,1,2, 10,21} }, +{ {0,0,1,1,0,0,2,0, 8,42} }, +{ {0,0,1,1,0,0,2,1, 10,20} }, +{ {0,0,1,1,0,0,2,2, 11,20} }, +{ {0,0,1,1,0,0,2,3, 59,21} }, +{ {0,0,1,1,0,1,0,0, 20,12} }, +{ {0,0,1,1,0,1,0,1, 22,12} }, +{ {0,0,1,1,0,1,0,2, 23,32} }, +{ {0,0,1,1,0,1,1,0, 25,21} }, +{ {0,0,1,1,0,1,1,1, 5,24} }, +{ {0,0,1,1,0,1,1,2, 26,21} }, +{ {0,0,1,1,0,1,2,0, 27,21} }, +{ {0,0,1,1,0,1,2,1, 28,21} }, +{ {0,0,1,1,0,1,2,2, 29,21} }, +{ {0,0,1,1,0,1,2,3, 65,21} }, +{ {0,0,1,1,0,2,0,0, 34,12} }, +{ {0,0,1,1,0,2,0,1, 28,7} }, +{ {0,0,1,1,0,2,0,2, 37,12} }, +{ {0,0,1,1,0,2,0,3, 72,32} }, +{ {0,0,1,1,0,2,1,0, 26,6} }, +{ {0,0,1,1,0,2,1,1, 10,6} }, +{ {0,0,1,1,0,2,1,2, 43,21} }, +{ {0,0,1,1,0,2,1,3, 80,21} }, +{ {0,0,1,1,0,2,2,0, 40,32} }, +{ {0,0,1,1,0,2,2,1, 42,32} }, +{ {0,0,1,1,0,2,2,2, 41,32} }, +{ {0,0,1,1,0,2,2,3, 75,32} }, +{ {0,0,1,1,0,2,3,0, 81,21} }, +{ {0,0,1,1,0,2,3,1, 83,21} }, +{ {0,0,1,1,0,2,3,2, 82,21} }, +{ {0,0,1,1,0,2,3,3, 84,21} }, +{ {0,0,1,1,0,2,3,4, 129,21} }, +{ {0,0,1,1,1,0,0,0, 20,9} }, +{ {0,0,1,1,1,0,0,1, 25,20} }, +{ {0,0,1,1,1,0,0,2, 27,20} }, +{ {0,0,1,1,1,0,1,0, 22,9} }, +{ {0,0,1,1,1,0,1,1, 5,25} }, +{ {0,0,1,1,1,0,1,2, 28,20} }, +{ {0,0,1,1,1,0,2,0, 23,43} }, +{ {0,0,1,1,1,0,2,1, 26,20} }, +{ {0,0,1,1,1,0,2,2, 29,20} }, +{ {0,0,1,1,1,0,2,3, 65,20} }, +{ {0,0,1,1,1,1,0,0, 44,0} }, +{ {0,0,1,1,1,1,0,1, 20,22} }, +{ {0,0,1,1,1,1,0,2, 45,0} }, +{ {0,0,1,1,1,1,1,0, 20,27} }, +{ {0,0,1,1,1,1,1,1, 2,4} }, +{ {0,0,1,1,1,1,1,2, 34,27} }, +{ {0,0,1,1,1,1,2,0, 45,1} }, +{ {0,0,1,1,1,1,2,1, 34,22} }, +{ {0,0,1,1,1,1,2,2, 46,0} }, +{ {0,0,1,1,1,1,2,3, 89,0} }, +{ {0,0,1,1,1,2,0,0, 45,6} }, +{ {0,0,1,1,1,2,0,1, 27,7} }, +{ {0,0,1,1,1,2,0,2, 47,0} }, +{ {0,0,1,1,1,2,0,3, 90,0} }, +{ {0,0,1,1,1,2,1,0, 23,45} }, +{ {0,0,1,1,1,2,1,1, 8,44} }, +{ {0,0,1,1,1,2,1,2, 37,27} }, +{ {0,0,1,1,1,2,1,3, 72,45} }, +{ {0,0,1,1,1,2,2,0, 48,0} }, +{ {0,0,1,1,1,2,2,1, 40,38} }, +{ {0,0,1,1,1,2,2,2, 29,5} }, +{ {0,0,1,1,1,2,2,3, 91,0} }, +{ {0,0,1,1,1,2,3,0, 92,0} }, +{ {0,0,1,1,1,2,3,1, 81,7} }, +{ {0,0,1,1,1,2,3,2, 93,0} }, +{ {0,0,1,1,1,2,3,3, 94,0} }, +{ {0,0,1,1,1,2,3,4, 135,0} }, +{ {0,0,1,1,2,0,0,0, 34,9} }, +{ {0,0,1,1,2,0,0,1, 26,7} }, +{ {0,0,1,1,2,0,0,2, 40,43} }, +{ {0,0,1,1,2,0,0,3, 81,20} }, +{ {0,0,1,1,2,0,1,0, 28,6} }, +{ {0,0,1,1,2,0,1,1, 10,7} }, +{ {0,0,1,1,2,0,1,2, 42,43} }, +{ {0,0,1,1,2,0,1,3, 83,20} }, +{ {0,0,1,1,2,0,2,0, 37,9} }, +{ {0,0,1,1,2,0,2,1, 43,20} }, +{ {0,0,1,1,2,0,2,2, 41,43} }, +{ {0,0,1,1,2,0,2,3, 82,20} }, +{ {0,0,1,1,2,0,3,0, 72,43} }, +{ {0,0,1,1,2,0,3,1, 80,20} }, +{ {0,0,1,1,2,0,3,2, 75,43} }, +{ {0,0,1,1,2,0,3,3, 84,20} }, +{ {0,0,1,1,2,0,3,4, 129,20} }, +{ {0,0,1,1,2,1,0,0, 45,7} }, +{ {0,0,1,1,2,1,0,1, 23,38} }, +{ {0,0,1,1,2,1,0,2, 48,1} }, +{ {0,0,1,1,2,1,0,3, 92,1} }, +{ {0,0,1,1,2,1,1,0, 27,6} }, +{ {0,0,1,1,2,1,1,1, 8,39} }, +{ {0,0,1,1,2,1,1,2, 40,45} }, +{ {0,0,1,1,2,1,1,3, 81,6} }, +{ {0,0,1,1,2,1,2,0, 47,1} }, +{ {0,0,1,1,2,1,2,1, 37,22} }, +{ {0,0,1,1,2,1,2,2, 29,4} }, +{ {0,0,1,1,2,1,2,3, 93,1} }, +{ {0,0,1,1,2,1,3,0, 90,1} }, +{ {0,0,1,1,2,1,3,1, 72,38} }, +{ {0,0,1,1,2,1,3,2, 91,1} }, +{ {0,0,1,1,2,1,3,3, 94,1} }, +{ {0,0,1,1,2,1,3,4, 135,1} }, +{ {0,0,1,1,2,2,0,0, 46,6} }, +{ {0,0,1,1,2,2,0,1, 29,7} }, +{ {0,0,1,1,2,2,0,2, 29,10} }, +{ {0,0,1,1,2,2,0,3, 94,17} }, +{ {0,0,1,1,2,2,1,0, 29,6} }, +{ {0,0,1,1,2,2,1,1, 11,6} }, +{ {0,0,1,1,2,2,1,2, 41,45} }, +{ {0,0,1,1,2,2,1,3, 84,6} }, +{ {0,0,1,1,2,2,2,0, 29,11} }, +{ {0,0,1,1,2,2,2,1, 41,38} }, +{ {0,0,1,1,2,2,2,2, 11,10} }, +{ {0,0,1,1,2,2,2,3, 84,11} }, +{ {0,0,1,1,2,2,3,0, 94,16} }, +{ {0,0,1,1,2,2,3,1, 84,7} }, +{ {0,0,1,1,2,2,3,2, 84,10} }, +{ {0,0,1,1,2,2,3,3, 95,0} }, +{ {0,0,1,1,2,2,3,4, 136,0} }, +{ {0,0,1,1,2,3,0,0, 89,6} }, +{ {0,0,1,1,2,3,0,1, 65,7} }, +{ {0,0,1,1,2,3,0,2, 91,17} }, +{ {0,0,1,1,2,3,0,3, 93,17} }, +{ {0,0,1,1,2,3,0,4, 135,17} }, +{ {0,0,1,1,2,3,1,0, 65,6} }, +{ {0,0,1,1,2,3,1,1, 59,6} }, +{ {0,0,1,1,2,3,1,2, 75,45} }, +{ {0,0,1,1,2,3,1,3, 82,6} }, +{ {0,0,1,1,2,3,1,4, 129,6} }, +{ {0,0,1,1,2,3,2,0, 93,16} }, +{ {0,0,1,1,2,3,2,1, 82,7} }, +{ {0,0,1,1,2,3,2,2, 84,4} }, +{ {0,0,1,1,2,3,2,3, 96,0} }, +{ {0,0,1,1,2,3,2,4, 137,0} }, +{ {0,0,1,1,2,3,3,0, 91,16} }, +{ {0,0,1,1,2,3,3,1, 75,38} }, +{ {0,0,1,1,2,3,3,2, 97,0} }, +{ {0,0,1,1,2,3,3,3, 84,5} }, +{ {0,0,1,1,2,3,3,4, 138,0} }, +{ {0,0,1,1,2,3,4,0, 135,16} }, +{ {0,0,1,1,2,3,4,1, 129,7} }, +{ {0,0,1,1,2,3,4,2, 138,1} }, +{ {0,0,1,1,2,3,4,3, 137,1} }, +{ {0,0,1,1,2,3,4,4, 136,17} }, +{ {0,0,1,1,2,3,4,5, 168,0} }, +{ {0,0,1,2,0,0,0,0, 3,2} }, +{ {0,0,1,2,0,0,0,1, 6,2} }, +{ {0,0,1,2,0,0,0,2, 8,2} }, +{ {0,0,1,2,0,0,0,3, 58,33} }, +{ {0,0,1,2,0,0,1,0, 8,3} }, +{ {0,0,1,2,0,0,1,1, 10,2} }, +{ {0,0,1,2,0,0,1,2, 11,33} }, +{ {0,0,1,2,0,0,1,3, 59,32} }, +{ {0,0,1,2,0,0,2,0, 6,3} }, +{ {0,0,1,2,0,0,2,1, 12,3} }, +{ {0,0,1,2,0,0,2,2, 10,3} }, +{ {0,0,1,2,0,0,2,3, 60,21} }, +{ {0,0,1,2,0,0,3,0, 58,42} }, +{ {0,0,1,2,0,0,3,1, 60,20} }, +{ {0,0,1,2,0,0,3,2, 59,43} }, +{ {0,0,1,2,0,0,3,3, 59,2} }, +{ {0,0,1,2,0,0,3,4, 124,21} }, +{ {0,0,1,2,0,1,0,0, 21,12} }, +{ {0,0,1,2,0,1,0,1, 23,12} }, +{ {0,0,1,2,0,1,0,2, 24,12} }, +{ {0,0,1,2,0,1,0,3, 64,32} }, +{ {0,0,1,2,0,1,1,0, 27,32} }, +{ {0,0,1,2,0,1,1,1, 28,32} }, +{ {0,0,1,2,0,1,1,2, 29,32} }, +{ {0,0,1,2,0,1,1,3, 65,32} }, +{ {0,0,1,2,0,1,2,0, 30,21} }, +{ {0,0,1,2,0,1,2,1, 31,21} }, +{ {0,0,1,2,0,1,2,2, 32,21} }, +{ {0,0,1,2,0,1,2,3, 66,21} }, +{ {0,0,1,2,0,1,3,0, 67,21} }, +{ {0,0,1,2,0,1,3,1, 68,21} }, +{ {0,0,1,2,0,1,3,2, 69,21} }, +{ {0,0,1,2,0,1,3,3, 69,32} }, +{ {0,0,1,2,0,1,3,4, 126,21} }, +{ {0,0,1,2,0,2,0,0, 35,12} }, +{ {0,0,1,2,0,2,0,1, 36,12} }, +{ {0,0,1,2,0,2,0,2, 28,37} }, +{ {0,0,1,2,0,2,0,3, 71,32} }, +{ {0,0,1,2,0,2,1,0, 40,21} }, +{ {0,0,1,2,0,2,1,1, 42,21} }, +{ {0,0,1,2,0,2,1,2, 41,21} }, +{ {0,0,1,2,0,2,1,3, 75,21} }, +{ {0,0,1,2,0,2,2,0, 38,21} }, +{ {0,0,1,2,0,2,2,1, 39,21} }, +{ {0,0,1,2,0,2,2,2, 17,30} }, +{ {0,0,1,2,0,2,2,3, 74,21} }, +{ {0,0,1,2,0,2,3,0, 76,21} }, +{ {0,0,1,2,0,2,3,1, 78,21} }, +{ {0,0,1,2,0,2,3,2, 77,21} }, +{ {0,0,1,2,0,2,3,3, 79,21} }, +{ {0,0,1,2,0,2,3,4, 128,21} }, +{ {0,0,1,2,0,3,0,0, 70,12} }, +{ {0,0,1,2,0,3,0,1, 71,12} }, +{ {0,0,1,2,0,3,0,2, 73,12} }, +{ {0,0,1,2,0,3,0,3, 72,12} }, +{ {0,0,1,2,0,3,0,4, 127,32} }, +{ {0,0,1,2,0,3,1,0, 81,32} }, +{ {0,0,1,2,0,3,1,1, 83,44} }, +{ {0,0,1,2,0,3,1,2, 84,32} }, +{ {0,0,1,2,0,3,1,3, 82,32} }, +{ {0,0,1,2,0,3,1,4, 129,32} }, +{ {0,0,1,2,0,3,2,0, 85,21} }, +{ {0,0,1,2,0,3,2,1, 87,21} }, +{ {0,0,1,2,0,3,2,2, 88,24} }, +{ {0,0,1,2,0,3,2,3, 86,21} }, +{ {0,0,1,2,0,3,2,4, 130,21} }, +{ {0,0,1,2,0,3,3,0, 76,32} }, +{ {0,0,1,2,0,3,3,1, 78,32} }, +{ {0,0,1,2,0,3,3,2, 79,32} }, +{ {0,0,1,2,0,3,3,3, 77,32} }, +{ {0,0,1,2,0,3,3,4, 128,32} }, +{ {0,0,1,2,0,3,4,0, 131,21} }, +{ {0,0,1,2,0,3,4,1, 133,21} }, +{ {0,0,1,2,0,3,4,2, 134,21} }, +{ {0,0,1,2,0,3,4,3, 132,21} }, +{ {0,0,1,2,0,3,4,4, 134,32} }, +{ {0,0,1,2,0,3,4,5, 167,21} }, +{ {0,0,1,2,1,0,0,0, 35,9} }, +{ {0,0,1,2,1,0,0,1, 38,20} }, +{ {0,0,1,2,1,0,0,2, 40,20} }, +{ {0,0,1,2,1,0,0,3, 76,20} }, +{ {0,0,1,2,1,0,1,0, 28,46} }, +{ {0,0,1,2,1,0,1,1, 17,29} }, +{ {0,0,1,2,1,0,1,2, 41,20} }, +{ {0,0,1,2,1,0,1,3, 77,20} }, +{ {0,0,1,2,1,0,2,0, 36,43} }, +{ {0,0,1,2,1,0,2,1, 39,20} }, +{ {0,0,1,2,1,0,2,2, 42,20} }, +{ {0,0,1,2,1,0,2,3, 78,20} }, +{ {0,0,1,2,1,0,3,0, 71,43} }, +{ {0,0,1,2,1,0,3,1, 74,20} }, +{ {0,0,1,2,1,0,3,2, 75,20} }, +{ {0,0,1,2,1,0,3,3, 79,20} }, +{ {0,0,1,2,1,0,3,4, 128,20} }, +{ {0,0,1,2,1,1,0,0, 45,2} }, +{ {0,0,1,2,1,1,0,1, 27,10} }, +{ {0,0,1,2,1,1,0,2, 47,21} }, +{ {0,0,1,2,1,1,0,3, 90,21} }, +{ {0,0,1,2,1,1,1,0, 23,28} }, +{ {0,0,1,2,1,1,1,1, 8,29} }, +{ {0,0,1,2,1,1,1,2, 37,46} }, +{ {0,0,1,2,1,1,1,3, 72,28} }, +{ {0,0,1,2,1,1,2,0, 48,21} }, +{ {0,0,1,2,1,1,2,1, 40,31} }, +{ {0,0,1,2,1,1,2,2, 29,24} }, +{ {0,0,1,2,1,1,2,3, 91,21} }, +{ {0,0,1,2,1,1,3,0, 92,21} }, +{ {0,0,1,2,1,1,3,1, 81,10} }, +{ {0,0,1,2,1,1,3,2, 93,21} }, +{ {0,0,1,2,1,1,3,3, 94,21} }, +{ {0,0,1,2,1,1,3,4, 135,21} }, +{ {0,0,1,2,1,2,0,0, 49,0} }, +{ {0,0,1,2,1,2,0,1, 50,0} }, +{ {0,0,1,2,1,2,0,2, 31,22} }, +{ {0,0,1,2,1,2,0,3, 98,0} }, +{ {0,0,1,2,1,2,1,0, 31,27} }, +{ {0,0,1,2,1,2,1,1, 18,4} }, +{ {0,0,1,2,1,2,1,2, 43,27} }, +{ {0,0,1,2,1,2,1,3, 86,27} }, +{ {0,0,1,2,1,2,2,0, 50,1} }, +{ {0,0,1,2,1,2,2,1, 51,0} }, +{ {0,0,1,2,1,2,2,2, 18,5} }, +{ {0,0,1,2,1,2,2,3, 99,0} }, +{ {0,0,1,2,1,2,3,0, 98,1} }, +{ {0,0,1,2,1,2,3,1, 99,1} }, +{ {0,0,1,2,1,2,3,2, 86,22} }, +{ {0,0,1,2,1,2,3,3, 100,0} }, +{ {0,0,1,2,1,2,3,4, 139,0} }, +{ {0,0,1,2,1,3,0,0, 101,0} }, +{ {0,0,1,2,1,3,0,1, 102,0} }, +{ {0,0,1,2,1,3,0,2, 103,0} }, +{ {0,0,1,2,1,3,0,3, 103,21} }, +{ {0,0,1,2,1,3,0,4, 140,0} }, +{ {0,0,1,2,1,3,1,0, 68,27} }, +{ {0,0,1,2,1,3,1,1, 63,27} }, +{ {0,0,1,2,1,3,1,2, 82,27} }, +{ {0,0,1,2,1,3,1,3, 82,46} }, +{ {0,0,1,2,1,3,1,4, 132,27} }, +{ {0,0,1,2,1,3,2,0, 104,0} }, +{ {0,0,1,2,1,3,2,1, 105,0} }, +{ {0,0,1,2,1,3,2,2, 79,24} }, +{ {0,0,1,2,1,3,2,3, 106,0} }, +{ {0,0,1,2,1,3,2,4, 141,0} }, +{ {0,0,1,2,1,3,3,0, 104,21} }, +{ {0,0,1,2,1,3,3,1, 105,21} }, +{ {0,0,1,2,1,3,3,2, 106,21} }, +{ {0,0,1,2,1,3,3,3, 79,5} }, +{ {0,0,1,2,1,3,3,4, 141,21} }, +{ {0,0,1,2,1,3,4,0, 142,0} }, +{ {0,0,1,2,1,3,4,1, 143,0} }, +{ {0,0,1,2,1,3,4,2, 144,0} }, +{ {0,0,1,2,1,3,4,3, 144,21} }, +{ {0,0,1,2,1,3,4,4, 145,0} }, +{ {0,0,1,2,1,3,4,5, 169,0} }, +{ {0,0,1,2,2,0,0,0, 21,9} }, +{ {0,0,1,2,2,0,0,1, 30,20} }, +{ {0,0,1,2,2,0,0,2, 27,43} }, +{ {0,0,1,2,2,0,0,3, 67,20} }, +{ {0,0,1,2,2,0,1,0, 24,9} }, +{ {0,0,1,2,2,0,1,1, 32,20} }, +{ {0,0,1,2,2,0,1,2, 29,43} }, +{ {0,0,1,2,2,0,1,3, 69,20} }, +{ {0,0,1,2,2,0,2,0, 23,9} }, +{ {0,0,1,2,2,0,2,1, 31,20} }, +{ {0,0,1,2,2,0,2,2, 28,43} }, +{ {0,0,1,2,2,0,2,3, 68,20} }, +{ {0,0,1,2,2,0,3,0, 64,43} }, +{ {0,0,1,2,2,0,3,1, 66,20} }, +{ {0,0,1,2,2,0,3,2, 65,43} }, +{ {0,0,1,2,2,0,3,3, 69,43} }, +{ {0,0,1,2,2,0,3,4, 126,20} }, +{ {0,0,1,2,2,1,0,0, 52,0} }, +{ {0,0,1,2,2,1,0,1, 53,0} }, +{ {0,0,1,2,2,1,0,2, 53,21} }, +{ {0,0,1,2,2,1,0,3, 107,0} }, +{ {0,0,1,2,2,1,1,0, 53,20} }, +{ {0,0,1,2,2,1,1,1, 24,5} }, +{ {0,0,1,2,2,1,1,2, 47,44} }, +{ {0,0,1,2,2,1,1,3, 108,0} }, +{ {0,0,1,2,2,1,2,0, 53,1} }, +{ {0,0,1,2,2,1,2,1, 47,30} }, +{ {0,0,1,2,2,1,2,2, 24,4} }, +{ {0,0,1,2,2,1,2,3, 108,21} }, +{ {0,0,1,2,2,1,3,0, 107,20} }, +{ {0,0,1,2,2,1,3,1, 108,20} }, +{ {0,0,1,2,2,1,3,2, 108,1} }, +{ {0,0,1,2,2,1,3,3, 109,0} }, +{ {0,0,1,2,2,1,3,4, 146,0} }, +{ {0,0,1,2,2,2,0,0, 45,3} }, +{ {0,0,1,2,2,2,0,1, 48,20} }, +{ {0,0,1,2,2,2,0,2, 23,31} }, +{ {0,0,1,2,2,2,0,3, 92,20} }, +{ {0,0,1,2,2,2,1,0, 47,20} }, +{ {0,0,1,2,2,2,1,1, 29,25} }, +{ {0,0,1,2,2,2,1,2, 37,37} }, +{ {0,0,1,2,2,2,1,3, 93,20} }, +{ {0,0,1,2,2,2,2,0, 27,11} }, +{ {0,0,1,2,2,2,2,1, 40,28} }, +{ {0,0,1,2,2,2,2,2, 8,30} }, +{ {0,0,1,2,2,2,2,3, 81,11} }, +{ {0,0,1,2,2,2,3,0, 90,20} }, +{ {0,0,1,2,2,2,3,1, 91,20} }, +{ {0,0,1,2,2,2,3,2, 72,31} }, +{ {0,0,1,2,2,2,3,3, 94,20} }, +{ {0,0,1,2,2,2,3,4, 135,20} }, +{ {0,0,1,2,2,3,0,0, 110,0} }, +{ {0,0,1,2,2,3,0,1, 111,0} }, +{ {0,0,1,2,2,3,0,2, 112,0} }, +{ {0,0,1,2,2,3,0,3, 108,36} }, +{ {0,0,1,2,2,3,0,4, 147,0} }, +{ {0,0,1,2,2,3,1,0, 108,26} }, +{ {0,0,1,2,2,3,1,1, 69,44} }, +{ {0,0,1,2,2,3,1,2, 93,44} }, +{ {0,0,1,2,2,3,1,3, 113,0} }, +{ {0,0,1,2,2,3,1,4, 148,0} }, +{ {0,0,1,2,2,3,2,0, 112,46} }, +{ {0,0,1,2,2,3,2,1, 103,46} }, +{ {0,0,1,2,2,3,2,2, 73,24} }, +{ {0,0,1,2,2,3,2,3, 93,30} }, +{ {0,0,1,2,2,3,2,4, 149,0} }, +{ {0,0,1,2,2,3,3,0, 111,20} }, +{ {0,0,1,2,2,3,3,1, 114,0} }, +{ {0,0,1,2,2,3,3,2, 103,22} }, +{ {0,0,1,2,2,3,3,3, 69,30} }, +{ {0,0,1,2,2,3,3,4, 150,0} }, +{ {0,0,1,2,2,3,4,0, 147,20} }, +{ {0,0,1,2,2,3,4,1, 150,20} }, +{ {0,0,1,2,2,3,4,2, 149,20} }, +{ {0,0,1,2,2,3,4,3, 148,20} }, +{ {0,0,1,2,2,3,4,4, 151,0} }, +{ {0,0,1,2,2,3,4,5, 170,0} }, +{ {0,0,1,2,3,0,0,0, 70,9} }, +{ {0,0,1,2,3,0,0,1, 85,20} }, +{ {0,0,1,2,3,0,0,2, 81,43} }, +{ {0,0,1,2,3,0,0,3, 76,43} }, +{ {0,0,1,2,3,0,0,4, 131,20} }, +{ {0,0,1,2,3,0,1,0, 73,9} }, +{ {0,0,1,2,3,0,1,1, 88,25} }, +{ {0,0,1,2,3,0,1,2, 84,43} }, +{ {0,0,1,2,3,0,1,3, 79,43} }, +{ {0,0,1,2,3,0,1,4, 134,20} }, +{ {0,0,1,2,3,0,2,0, 71,9} }, +{ {0,0,1,2,3,0,2,1, 87,20} }, +{ {0,0,1,2,3,0,2,2, 83,39} }, +{ {0,0,1,2,3,0,2,3, 78,43} }, +{ {0,0,1,2,3,0,2,4, 133,20} }, +{ {0,0,1,2,3,0,3,0, 72,9} }, +{ {0,0,1,2,3,0,3,1, 86,20} }, +{ {0,0,1,2,3,0,3,2, 82,43} }, +{ {0,0,1,2,3,0,3,3, 77,43} }, +{ {0,0,1,2,3,0,3,4, 132,20} }, +{ {0,0,1,2,3,0,4,0, 127,43} }, +{ {0,0,1,2,3,0,4,1, 130,20} }, +{ {0,0,1,2,3,0,4,2, 129,43} }, +{ {0,0,1,2,3,0,4,3, 128,43} }, +{ {0,0,1,2,3,0,4,4, 134,43} }, +{ {0,0,1,2,3,0,4,5, 167,20} }, +{ {0,0,1,2,3,1,0,0, 110,1} }, +{ {0,0,1,2,3,1,0,1, 112,37} }, +{ {0,0,1,2,3,1,0,2, 108,23} }, +{ {0,0,1,2,3,1,0,3, 111,21} }, +{ {0,0,1,2,3,1,0,4, 147,21} }, +{ {0,0,1,2,3,1,1,0, 112,1} }, +{ {0,0,1,2,3,1,1,1, 73,25} }, +{ {0,0,1,2,3,1,1,2, 93,39} }, +{ {0,0,1,2,3,1,1,3, 103,27} }, +{ {0,0,1,2,3,1,1,4, 149,21} }, +{ {0,0,1,2,3,1,2,0, 111,1} }, +{ {0,0,1,2,3,1,2,1, 103,37} }, +{ {0,0,1,2,3,1,2,2, 69,39} }, +{ {0,0,1,2,3,1,2,3, 114,1} }, +{ {0,0,1,2,3,1,2,4, 150,21} }, +{ {0,0,1,2,3,1,3,0, 108,47} }, +{ {0,0,1,2,3,1,3,1, 93,29} }, +{ {0,0,1,2,3,1,3,2, 113,1} }, +{ {0,0,1,2,3,1,3,3, 69,29} }, +{ {0,0,1,2,3,1,3,4, 148,21} }, +{ {0,0,1,2,3,1,4,0, 147,1} }, +{ {0,0,1,2,3,1,4,1, 149,1} }, +{ {0,0,1,2,3,1,4,2, 148,1} }, +{ {0,0,1,2,3,1,4,3, 150,1} }, +{ {0,0,1,2,3,1,4,4, 151,1} }, +{ {0,0,1,2,3,1,4,5, 170,1} }, +{ {0,0,1,2,3,2,0,0, 101,1} }, +{ {0,0,1,2,3,2,0,1, 104,1} }, +{ {0,0,1,2,3,2,0,2, 68,22} }, +{ {0,0,1,2,3,2,0,3, 104,20} }, +{ {0,0,1,2,3,2,0,4, 142,1} }, +{ {0,0,1,2,3,2,1,0, 103,1} }, +{ {0,0,1,2,3,2,1,1, 79,25} }, +{ {0,0,1,2,3,2,1,2, 82,22} }, +{ {0,0,1,2,3,2,1,3, 106,20} }, +{ {0,0,1,2,3,2,1,4, 144,1} }, +{ {0,0,1,2,3,2,2,0, 102,1} }, +{ {0,0,1,2,3,2,2,1, 105,1} }, +{ {0,0,1,2,3,2,2,2, 63,22} }, +{ {0,0,1,2,3,2,2,3, 105,20} }, +{ {0,0,1,2,3,2,2,4, 143,1} }, +{ {0,0,1,2,3,2,3,0, 103,20} }, +{ {0,0,1,2,3,2,3,1, 106,1} }, +{ {0,0,1,2,3,2,3,2, 82,37} }, +{ {0,0,1,2,3,2,3,3, 79,4} }, +{ {0,0,1,2,3,2,3,4, 144,20} }, +{ {0,0,1,2,3,2,4,0, 140,1} }, +{ {0,0,1,2,3,2,4,1, 141,1} }, +{ {0,0,1,2,3,2,4,2, 132,22} }, +{ {0,0,1,2,3,2,4,3, 141,20} }, +{ {0,0,1,2,3,2,4,4, 145,1} }, +{ {0,0,1,2,3,2,4,5, 169,1} }, +{ {0,0,1,2,3,3,0,0, 89,2} }, +{ {0,0,1,2,3,3,0,1, 91,2} }, +{ {0,0,1,2,3,3,0,2, 93,2} }, +{ {0,0,1,2,3,3,0,3, 65,10} }, +{ {0,0,1,2,3,3,0,4, 135,2} }, +{ {0,0,1,2,3,3,1,0, 93,3} }, +{ {0,0,1,2,3,3,1,1, 84,25} }, +{ {0,0,1,2,3,3,1,2, 96,45} }, +{ {0,0,1,2,3,3,1,3, 82,10} }, +{ {0,0,1,2,3,3,1,4, 137,21} }, +{ {0,0,1,2,3,3,2,0, 91,3} }, +{ {0,0,1,2,3,3,2,1, 97,21} }, +{ {0,0,1,2,3,3,2,2, 84,24} }, +{ {0,0,1,2,3,3,2,3, 75,31} }, +{ {0,0,1,2,3,3,2,4, 138,21} }, +{ {0,0,1,2,3,3,3,0, 65,11} }, +{ {0,0,1,2,3,3,3,1, 75,28} }, +{ {0,0,1,2,3,3,3,2, 82,11} }, +{ {0,0,1,2,3,3,3,3, 59,11} }, +{ {0,0,1,2,3,3,3,4, 129,11} }, +{ {0,0,1,2,3,3,4,0, 135,3} }, +{ {0,0,1,2,3,3,4,1, 138,20} }, +{ {0,0,1,2,3,3,4,2, 137,20} }, +{ {0,0,1,2,3,3,4,3, 129,10} }, +{ {0,0,1,2,3,3,4,4, 136,2} }, +{ {0,0,1,2,3,3,4,5, 168,21} }, +{ {0,0,1,2,3,4,0,0, 152,0} }, +{ {0,0,1,2,3,4,0,1, 153,0} }, +{ {0,0,1,2,3,4,0,2, 149,38} }, +{ {0,0,1,2,3,4,0,3, 153,21} }, +{ {0,0,1,2,3,4,0,4, 149,31} }, +{ {0,0,1,2,3,4,0,5, 171,0} }, +{ {0,0,1,2,3,4,1,0, 149,45} }, +{ {0,0,1,2,3,4,1,1, 134,44} }, +{ {0,0,1,2,3,4,1,2, 137,45} }, +{ {0,0,1,2,3,4,1,3, 144,27} }, +{ {0,0,1,2,3,4,1,4, 154,0} }, +{ {0,0,1,2,3,4,1,5, 172,0} }, +{ {0,0,1,2,3,4,2,0, 153,1} }, +{ {0,0,1,2,3,4,2,1, 155,0} }, +{ {0,0,1,2,3,4,2,2, 134,39} }, +{ {0,0,1,2,3,4,2,3, 156,0} }, +{ {0,0,1,2,3,4,2,4, 144,37} }, +{ {0,0,1,2,3,4,2,5, 173,0} }, +{ {0,0,1,2,3,4,3,0, 149,28} }, +{ {0,0,1,2,3,4,3,1, 144,46} }, +{ {0,0,1,2,3,4,3,2, 154,1} }, +{ {0,0,1,2,3,4,3,3, 134,29} }, +{ {0,0,1,2,3,4,3,4, 137,28} }, +{ {0,0,1,2,3,4,3,5, 172,21} }, +{ {0,0,1,2,3,4,4,0, 153,20} }, +{ {0,0,1,2,3,4,4,1, 156,1} }, +{ {0,0,1,2,3,4,4,2, 144,22} }, +{ {0,0,1,2,3,4,4,3, 155,21} }, +{ {0,0,1,2,3,4,4,4, 134,30} }, +{ {0,0,1,2,3,4,4,5, 173,21} }, +{ {0,0,1,2,3,4,5,0, 171,1} }, +{ {0,0,1,2,3,4,5,1, 173,1} }, +{ {0,0,1,2,3,4,5,2, 172,1} }, +{ {0,0,1,2,3,4,5,3, 173,20} }, +{ {0,0,1,2,3,4,5,4, 172,20} }, +{ {0,0,1,2,3,4,5,5, 174,0} }, +{ {0,0,1,2,3,4,5,6, 182,0} }, +{ {0,1,0,0,0,0,0,0, 1,4} }, +{ {0,1,0,0,0,0,0,1, 4,12} }, +{ {0,1,0,0,0,0,0,2, 7,12} }, +{ {0,1,0,0,0,0,1,0, 19,7} }, +{ {0,1,0,0,0,0,1,1, 20,13} }, +{ {0,1,0,0,0,0,1,2, 21,13} }, +{ {0,1,0,0,0,0,2,0, 33,2} }, +{ {0,1,0,0,0,0,2,1, 35,13} }, +{ {0,1,0,0,0,0,2,2, 34,13} }, +{ {0,1,0,0,0,0,2,3, 70,13} }, +{ {0,1,0,0,0,1,0,0, 2,27} }, +{ {0,1,0,0,0,1,0,1, 5,26} }, +{ {0,1,0,0,0,1,0,2, 8,41} }, +{ {0,1,0,0,0,1,1,0, 20,18} }, +{ {0,1,0,0,0,1,1,1, 22,18} }, +{ {0,1,0,0,0,1,1,2, 23,40} }, +{ {0,1,0,0,0,1,2,0, 34,18} }, +{ {0,1,0,0,0,1,2,1, 28,9} }, +{ {0,1,0,0,0,1,2,2, 37,18} }, +{ {0,1,0,0,0,1,2,3, 72,40} }, +{ {0,1,0,0,0,2,0,0, 3,26} }, +{ {0,1,0,0,0,2,0,1, 6,26} }, +{ {0,1,0,0,0,2,0,2, 8,26} }, +{ {0,1,0,0,0,2,0,3, 58,41} }, +{ {0,1,0,0,0,2,1,0, 21,18} }, +{ {0,1,0,0,0,2,1,1, 23,18} }, +{ {0,1,0,0,0,2,1,2, 24,18} }, +{ {0,1,0,0,0,2,1,3, 64,40} }, +{ {0,1,0,0,0,2,2,0, 35,18} }, +{ {0,1,0,0,0,2,2,1, 36,18} }, +{ {0,1,0,0,0,2,2,2, 28,5} }, +{ {0,1,0,0,0,2,2,3, 71,40} }, +{ {0,1,0,0,0,2,3,0, 70,18} }, +{ {0,1,0,0,0,2,3,1, 71,18} }, +{ {0,1,0,0,0,2,3,2, 73,18} }, +{ {0,1,0,0,0,2,3,3, 72,18} }, +{ {0,1,0,0,0,2,3,4, 127,40} }, +{ {0,1,0,0,1,0,0,0, 4,6} }, +{ {0,1,0,0,1,0,0,1, 13,6} }, +{ {0,1,0,0,1,0,0,2, 16,18} }, +{ {0,1,0,0,1,0,1,0, 20,7} }, +{ {0,1,0,0,1,0,1,1, 25,18} }, +{ {0,1,0,0,1,0,1,2, 27,18} }, +{ {0,1,0,0,1,0,2,0, 35,7} }, +{ {0,1,0,0,1,0,2,1, 38,18} }, +{ {0,1,0,0,1,0,2,2, 40,18} }, +{ {0,1,0,0,1,0,2,3, 76,18} }, +{ {0,1,0,0,1,1,0,0, 5,6} }, +{ {0,1,0,0,1,1,0,1, 14,6} }, +{ {0,1,0,0,1,1,0,2, 17,18} }, +{ {0,1,0,0,1,1,1,0, 22,7} }, +{ {0,1,0,0,1,1,1,1, 5,10} }, +{ {0,1,0,0,1,1,1,2, 28,18} }, +{ {0,1,0,0,1,1,2,0, 28,42} }, +{ {0,1,0,0,1,1,2,1, 17,9} }, +{ {0,1,0,0,1,1,2,2, 41,18} }, +{ {0,1,0,0,1,1,2,3, 77,18} }, +{ {0,1,0,0,1,2,0,0, 6,6} }, +{ {0,1,0,0,1,2,0,1, 15,6} }, +{ {0,1,0,0,1,2,0,2, 18,18} }, +{ {0,1,0,0,1,2,0,3, 61,18} }, +{ {0,1,0,0,1,2,1,0, 23,17} }, +{ {0,1,0,0,1,2,1,1, 26,18} }, +{ {0,1,0,0,1,2,1,2, 29,18} }, +{ {0,1,0,0,1,2,1,3, 65,18} }, +{ {0,1,0,0,1,2,2,0, 36,17} }, +{ {0,1,0,0,1,2,2,1, 39,18} }, +{ {0,1,0,0,1,2,2,2, 42,18} }, +{ {0,1,0,0,1,2,2,3, 78,18} }, +{ {0,1,0,0,1,2,3,0, 71,17} }, +{ {0,1,0,0,1,2,3,1, 74,18} }, +{ {0,1,0,0,1,2,3,2, 79,18} }, +{ {0,1,0,0,1,2,3,3, 75,18} }, +{ {0,1,0,0,1,2,3,4, 128,18} }, +{ {0,1,0,0,2,0,0,0, 7,6} }, +{ {0,1,0,0,2,0,0,1, 16,6} }, +{ {0,1,0,0,2,0,0,2, 16,26} }, +{ {0,1,0,0,2,0,0,3, 62,18} }, +{ {0,1,0,0,2,0,1,0, 21,7} }, +{ {0,1,0,0,2,0,1,1, 27,17} }, +{ {0,1,0,0,2,0,1,2, 30,18} }, +{ {0,1,0,0,2,0,1,3, 67,18} }, +{ {0,1,0,0,2,0,2,0, 34,7} }, +{ {0,1,0,0,2,0,2,1, 40,17} }, +{ {0,1,0,0,2,0,2,2, 26,4} }, +{ {0,1,0,0,2,0,2,3, 81,18} }, +{ {0,1,0,0,2,0,3,0, 70,7} }, +{ {0,1,0,0,2,0,3,1, 76,17} }, +{ {0,1,0,0,2,0,3,2, 85,18} }, +{ {0,1,0,0,2,0,3,3, 81,17} }, +{ {0,1,0,0,2,0,3,4, 131,18} }, +{ {0,1,0,0,2,1,0,0, 8,6} }, +{ {0,1,0,0,2,1,0,1, 17,6} }, +{ {0,1,0,0,2,1,0,2, 18,26} }, +{ {0,1,0,0,2,1,0,3, 63,18} }, +{ {0,1,0,0,2,1,1,0, 23,7} }, +{ {0,1,0,0,2,1,1,1, 28,17} }, +{ {0,1,0,0,2,1,1,2, 31,18} }, +{ {0,1,0,0,2,1,1,3, 68,18} }, +{ {0,1,0,0,2,1,2,0, 37,17} }, +{ {0,1,0,0,2,1,2,1, 41,17} }, +{ {0,1,0,0,2,1,2,2, 43,18} }, +{ {0,1,0,0,2,1,2,3, 82,18} }, +{ {0,1,0,0,2,1,3,0, 72,7} }, +{ {0,1,0,0,2,1,3,1, 77,9} }, +{ {0,1,0,0,2,1,3,2, 86,18} }, +{ {0,1,0,0,2,1,3,3, 82,17} }, +{ {0,1,0,0,2,1,3,4, 132,18} }, +{ {0,1,0,0,2,2,0,0, 8,45} }, +{ {0,1,0,0,2,2,0,1, 18,6} }, +{ {0,1,0,0,2,2,0,2, 17,26} }, +{ {0,1,0,0,2,2,0,3, 63,41} }, +{ {0,1,0,0,2,2,1,0, 24,7} }, +{ {0,1,0,0,2,2,1,1, 29,17} }, +{ {0,1,0,0,2,2,1,2, 32,18} }, +{ {0,1,0,0,2,2,1,3, 69,18} }, +{ {0,1,0,0,2,2,2,0, 28,28} }, +{ {0,1,0,0,2,2,2,1, 42,17} }, +{ {0,1,0,0,2,2,2,2, 10,4} }, +{ {0,1,0,0,2,2,2,3, 83,18} }, +{ {0,1,0,0,2,2,3,0, 73,17} }, +{ {0,1,0,0,2,2,3,1, 79,17} }, +{ {0,1,0,0,2,2,3,2, 88,18} }, +{ {0,1,0,0,2,2,3,3, 84,17} }, +{ {0,1,0,0,2,2,3,4, 134,18} }, +{ {0,1,0,0,2,3,0,0, 58,6} }, +{ {0,1,0,0,2,3,0,1, 61,6} }, +{ {0,1,0,0,2,3,0,2, 61,26} }, +{ {0,1,0,0,2,3,0,3, 63,6} }, +{ {0,1,0,0,2,3,0,4, 125,18} }, +{ {0,1,0,0,2,3,1,0, 64,17} }, +{ {0,1,0,0,2,3,1,1, 65,17} }, +{ {0,1,0,0,2,3,1,2, 66,18} }, +{ {0,1,0,0,2,3,1,3, 69,17} }, +{ {0,1,0,0,2,3,1,4, 126,18} }, +{ {0,1,0,0,2,3,2,0, 72,17} }, +{ {0,1,0,0,2,3,2,1, 75,17} }, +{ {0,1,0,0,2,3,2,2, 80,18} }, +{ {0,1,0,0,2,3,2,3, 84,18} }, +{ {0,1,0,0,2,3,2,4, 129,18} }, +{ {0,1,0,0,2,3,3,0, 71,7} }, +{ {0,1,0,0,2,3,3,1, 78,17} }, +{ {0,1,0,0,2,3,3,2, 87,18} }, +{ {0,1,0,0,2,3,3,3, 83,17} }, +{ {0,1,0,0,2,3,3,4, 133,18} }, +{ {0,1,0,0,2,3,4,0, 127,17} }, +{ {0,1,0,0,2,3,4,1, 128,17} }, +{ {0,1,0,0,2,3,4,2, 130,18} }, +{ {0,1,0,0,2,3,4,3, 134,17} }, +{ {0,1,0,0,2,3,4,4, 129,17} }, +{ {0,1,0,0,2,3,4,5, 167,18} }, +{ {0,1,0,1,0,0,0,0, 2,28} }, +{ {0,1,0,1,0,0,0,1, 5,12} }, +{ {0,1,0,1,0,0,0,2, 8,12} }, +{ {0,1,0,1,0,0,1,0, 20,2} }, +{ {0,1,0,1,0,0,1,1, 22,13} }, +{ {0,1,0,1,0,0,1,2, 23,13} }, +{ {0,1,0,1,0,0,2,0, 34,2} }, +{ {0,1,0,1,0,0,2,1, 28,34} }, +{ {0,1,0,1,0,0,2,2, 37,33} }, +{ {0,1,0,1,0,0,2,3, 72,13} }, +{ {0,1,0,1,0,1,0,0, 5,27} }, +{ {0,1,0,1,0,1,0,1, 9,12} }, +{ {0,1,0,1,0,1,0,2, 10,13} }, +{ {0,1,0,1,0,1,1,0, 25,13} }, +{ {0,1,0,1,0,1,1,1, 5,22} }, +{ {0,1,0,1,0,1,1,2, 26,13} }, +{ {0,1,0,1,0,1,2,0, 26,8} }, +{ {0,1,0,1,0,1,2,1, 10,8} }, +{ {0,1,0,1,0,1,2,2, 43,13} }, +{ {0,1,0,1,0,1,2,3, 80,13} }, +{ {0,1,0,1,0,2,0,0, 8,27} }, +{ {0,1,0,1,0,2,0,1, 10,26} }, +{ {0,1,0,1,0,2,0,2, 11,40} }, +{ {0,1,0,1,0,2,0,3, 59,40} }, +{ {0,1,0,1,0,2,1,0, 27,40} }, +{ {0,1,0,1,0,2,1,1, 28,40} }, +{ {0,1,0,1,0,2,1,2, 29,40} }, +{ {0,1,0,1,0,2,1,3, 65,40} }, +{ {0,1,0,1,0,2,2,0, 40,13} }, +{ {0,1,0,1,0,2,2,1, 42,13} }, +{ {0,1,0,1,0,2,2,2, 41,13} }, +{ {0,1,0,1,0,2,2,3, 75,13} }, +{ {0,1,0,1,0,2,3,0, 81,40} }, +{ {0,1,0,1,0,2,3,1, 83,34} }, +{ {0,1,0,1,0,2,3,2, 84,40} }, +{ {0,1,0,1,0,2,3,3, 82,40} }, +{ {0,1,0,1,0,2,3,4, 129,40} }, +{ {0,1,0,1,1,0,0,0, 20,25} }, +{ {0,1,0,1,1,0,0,1, 25,26} }, +{ {0,1,0,1,1,0,0,2, 27,41} }, +{ {0,1,0,1,1,0,1,0, 44,18} }, +{ {0,1,0,1,1,0,1,1, 20,24} }, +{ {0,1,0,1,1,0,1,2, 45,19} }, +{ {0,1,0,1,1,0,2,0, 45,14} }, +{ {0,1,0,1,1,0,2,1, 27,34} }, +{ {0,1,0,1,1,0,2,2, 47,19} }, +{ {0,1,0,1,1,0,2,3, 90,19} }, +{ {0,1,0,1,1,1,0,0, 22,26} }, +{ {0,1,0,1,1,1,0,1, 5,9} }, +{ {0,1,0,1,1,1,0,2, 28,41} }, +{ {0,1,0,1,1,1,1,0, 20,3} }, +{ {0,1,0,1,1,1,1,1, 2,31} }, +{ {0,1,0,1,1,1,1,2, 34,3} }, +{ {0,1,0,1,1,1,2,0, 23,8} }, +{ {0,1,0,1,1,1,2,1, 8,9} }, +{ {0,1,0,1,1,1,2,2, 37,42} }, +{ {0,1,0,1,1,1,2,3, 72,8} }, +{ {0,1,0,1,1,2,0,0, 23,26} }, +{ {0,1,0,1,1,2,0,1, 26,26} }, +{ {0,1,0,1,1,2,0,2, 29,41} }, +{ {0,1,0,1,1,2,0,3, 65,41} }, +{ {0,1,0,1,1,2,1,0, 45,18} }, +{ {0,1,0,1,1,2,1,1, 34,24} }, +{ {0,1,0,1,1,2,1,2, 46,18} }, +{ {0,1,0,1,1,2,1,3, 89,19} }, +{ {0,1,0,1,1,2,2,0, 48,19} }, +{ {0,1,0,1,1,2,2,1, 40,23} }, +{ {0,1,0,1,1,2,2,2, 29,30} }, +{ {0,1,0,1,1,2,2,3, 91,19} }, +{ {0,1,0,1,1,2,3,0, 92,15} }, +{ {0,1,0,1,1,2,3,1, 81,34} }, +{ {0,1,0,1,1,2,3,2, 94,19} }, +{ {0,1,0,1,1,2,3,3, 93,19} }, +{ {0,1,0,1,1,2,3,4, 135,19} }, +{ {0,1,0,1,2,0,0,0, 34,25} }, +{ {0,1,0,1,2,0,0,1, 26,23} }, +{ {0,1,0,1,2,0,0,2, 40,26} }, +{ {0,1,0,1,2,0,0,3, 81,41} }, +{ {0,1,0,1,2,0,1,0, 45,15} }, +{ {0,1,0,1,2,0,1,1, 23,23} }, +{ {0,1,0,1,2,0,1,2, 48,18} }, +{ {0,1,0,1,2,0,1,3, 92,18} }, +{ {0,1,0,1,2,0,2,0, 46,15} }, +{ {0,1,0,1,2,0,2,1, 29,34} }, +{ {0,1,0,1,2,0,2,2, 29,29} }, +{ {0,1,0,1,2,0,2,3, 94,14} }, +{ {0,1,0,1,2,0,3,0, 89,14} }, +{ {0,1,0,1,2,0,3,1, 65,34} }, +{ {0,1,0,1,2,0,3,2, 91,14} }, +{ {0,1,0,1,2,0,3,3, 93,14} }, +{ {0,1,0,1,2,0,3,4, 135,14} }, +{ {0,1,0,1,2,1,0,0, 28,35} }, +{ {0,1,0,1,2,1,0,1, 10,23} }, +{ {0,1,0,1,2,1,0,2, 42,26} }, +{ {0,1,0,1,2,1,0,3, 83,41} }, +{ {0,1,0,1,2,1,1,0, 27,35} }, +{ {0,1,0,1,2,1,1,1, 8,22} }, +{ {0,1,0,1,2,1,1,2, 40,8} }, +{ {0,1,0,1,2,1,1,3, 81,35} }, +{ {0,1,0,1,2,1,2,0, 29,35} }, +{ {0,1,0,1,2,1,2,1, 11,35} }, +{ {0,1,0,1,2,1,2,2, 41,8} }, +{ {0,1,0,1,2,1,2,3, 84,35} }, +{ {0,1,0,1,2,1,3,0, 65,35} }, +{ {0,1,0,1,2,1,3,1, 59,35} }, +{ {0,1,0,1,2,1,3,2, 75,8} }, +{ {0,1,0,1,2,1,3,3, 82,35} }, +{ {0,1,0,1,2,1,3,4, 129,35} }, +{ {0,1,0,1,2,2,0,0, 37,44} }, +{ {0,1,0,1,2,2,0,1, 43,26} }, +{ {0,1,0,1,2,2,0,2, 41,26} }, +{ {0,1,0,1,2,2,0,3, 82,41} }, +{ {0,1,0,1,2,2,1,0, 47,18} }, +{ {0,1,0,1,2,2,1,1, 37,39} }, +{ {0,1,0,1,2,2,1,2, 29,31} }, +{ {0,1,0,1,2,2,1,3, 93,18} }, +{ {0,1,0,1,2,2,2,0, 29,28} }, +{ {0,1,0,1,2,2,2,1, 41,23} }, +{ {0,1,0,1,2,2,2,2, 11,28} }, +{ {0,1,0,1,2,2,2,3, 84,28} }, +{ {0,1,0,1,2,2,3,0, 93,15} }, +{ {0,1,0,1,2,2,3,1, 82,34} }, +{ {0,1,0,1,2,2,3,2, 84,31} }, +{ {0,1,0,1,2,2,3,3, 96,19} }, +{ {0,1,0,1,2,2,3,4, 137,19} }, +{ {0,1,0,1,2,3,0,0, 72,26} }, +{ {0,1,0,1,2,3,0,1, 80,26} }, +{ {0,1,0,1,2,3,0,2, 75,26} }, +{ {0,1,0,1,2,3,0,3, 84,41} }, +{ {0,1,0,1,2,3,0,4, 129,41} }, +{ {0,1,0,1,2,3,1,0, 90,18} }, +{ {0,1,0,1,2,3,1,1, 72,23} }, +{ {0,1,0,1,2,3,1,2, 91,18} }, +{ {0,1,0,1,2,3,1,3, 94,18} }, +{ {0,1,0,1,2,3,1,4, 135,18} }, +{ {0,1,0,1,2,3,2,0, 94,15} }, +{ {0,1,0,1,2,3,2,1, 84,34} }, +{ {0,1,0,1,2,3,2,2, 84,29} }, +{ {0,1,0,1,2,3,2,3, 95,18} }, +{ {0,1,0,1,2,3,2,4, 136,19} }, +{ {0,1,0,1,2,3,3,0, 91,15} }, +{ {0,1,0,1,2,3,3,1, 75,23} }, +{ {0,1,0,1,2,3,3,2, 97,19} }, +{ {0,1,0,1,2,3,3,3, 84,30} }, +{ {0,1,0,1,2,3,3,4, 138,19} }, +{ {0,1,0,1,2,3,4,0, 135,15} }, +{ {0,1,0,1,2,3,4,1, 129,34} }, +{ {0,1,0,1,2,3,4,2, 138,14} }, +{ {0,1,0,1,2,3,4,3, 136,14} }, +{ {0,1,0,1,2,3,4,4, 137,18} }, +{ {0,1,0,1,2,3,4,5, 168,19} }, +{ {0,1,0,2,0,0,0,0, 3,28} }, +{ {0,1,0,2,0,0,0,1, 6,12} }, +{ {0,1,0,2,0,0,0,2, 8,47} }, +{ {0,1,0,2,0,0,0,3, 58,12} }, +{ {0,1,0,2,0,0,1,0, 21,2} }, +{ {0,1,0,2,0,0,1,1, 23,33} }, +{ {0,1,0,2,0,0,1,2, 24,13} }, +{ {0,1,0,2,0,0,1,3, 64,13} }, +{ {0,1,0,2,0,0,2,0, 35,2} }, +{ {0,1,0,2,0,0,2,1, 36,33} }, +{ {0,1,0,2,0,0,2,2, 28,24} }, +{ {0,1,0,2,0,0,2,3, 71,13} }, +{ {0,1,0,2,0,0,3,0, 70,2} }, +{ {0,1,0,2,0,0,3,1, 71,33} }, +{ {0,1,0,2,0,0,3,2, 73,33} }, +{ {0,1,0,2,0,0,3,3, 72,33} }, +{ {0,1,0,2,0,0,3,4, 127,13} }, +{ {0,1,0,2,0,1,0,0, 8,46} }, +{ {0,1,0,2,0,1,0,1, 10,12} }, +{ {0,1,0,2,0,1,0,2, 11,12} }, +{ {0,1,0,2,0,1,0,3, 59,13} }, +{ {0,1,0,2,0,1,1,0, 27,13} }, +{ {0,1,0,2,0,1,1,1, 28,13} }, +{ {0,1,0,2,0,1,1,2, 29,13} }, +{ {0,1,0,2,0,1,1,3, 65,13} }, +{ {0,1,0,2,0,1,2,0, 40,40} }, +{ {0,1,0,2,0,1,2,1, 42,40} }, +{ {0,1,0,2,0,1,2,2, 41,40} }, +{ {0,1,0,2,0,1,2,3, 75,40} }, +{ {0,1,0,2,0,1,3,0, 81,13} }, +{ {0,1,0,2,0,1,3,1, 83,9} }, +{ {0,1,0,2,0,1,3,2, 84,13} }, +{ {0,1,0,2,0,1,3,3, 82,13} }, +{ {0,1,0,2,0,1,3,4, 129,13} }, +{ {0,1,0,2,0,2,0,0, 6,27} }, +{ {0,1,0,2,0,2,0,1, 12,13} }, +{ {0,1,0,2,0,2,0,2, 10,27} }, +{ {0,1,0,2,0,2,0,3, 60,13} }, +{ {0,1,0,2,0,2,1,0, 30,13} }, +{ {0,1,0,2,0,2,1,1, 31,13} }, +{ {0,1,0,2,0,2,1,2, 32,13} }, +{ {0,1,0,2,0,2,1,3, 66,13} }, +{ {0,1,0,2,0,2,2,0, 38,13} }, +{ {0,1,0,2,0,2,2,1, 39,13} }, +{ {0,1,0,2,0,2,2,2, 17,5} }, +{ {0,1,0,2,0,2,2,3, 74,13} }, +{ {0,1,0,2,0,2,3,0, 85,13} }, +{ {0,1,0,2,0,2,3,1, 87,13} }, +{ {0,1,0,2,0,2,3,2, 88,22} }, +{ {0,1,0,2,0,2,3,3, 86,13} }, +{ {0,1,0,2,0,2,3,4, 130,13} }, +{ {0,1,0,2,0,3,0,0, 58,27} }, +{ {0,1,0,2,0,3,0,1, 60,26} }, +{ {0,1,0,2,0,3,0,2, 59,26} }, +{ {0,1,0,2,0,3,0,3, 59,47} }, +{ {0,1,0,2,0,3,0,4, 124,40} }, +{ {0,1,0,2,0,3,1,0, 67,40} }, +{ {0,1,0,2,0,3,1,1, 68,40} }, +{ {0,1,0,2,0,3,1,2, 69,40} }, +{ {0,1,0,2,0,3,1,3, 69,13} }, +{ {0,1,0,2,0,3,1,4, 126,40} }, +{ {0,1,0,2,0,3,2,0, 76,40} }, +{ {0,1,0,2,0,3,2,1, 78,40} }, +{ {0,1,0,2,0,3,2,2, 77,40} }, +{ {0,1,0,2,0,3,2,3, 79,40} }, +{ {0,1,0,2,0,3,2,4, 128,40} }, +{ {0,1,0,2,0,3,3,0, 76,13} }, +{ {0,1,0,2,0,3,3,1, 78,13} }, +{ {0,1,0,2,0,3,3,2, 79,13} }, +{ {0,1,0,2,0,3,3,3, 77,13} }, +{ {0,1,0,2,0,3,3,4, 128,13} }, +{ {0,1,0,2,0,3,4,0, 131,40} }, +{ {0,1,0,2,0,3,4,1, 133,40} }, +{ {0,1,0,2,0,3,4,2, 134,40} }, +{ {0,1,0,2,0,3,4,3, 134,13} }, +{ {0,1,0,2,0,3,4,4, 132,40} }, +{ {0,1,0,2,0,3,4,5, 167,40} }, +{ {0,1,0,2,1,0,0,0, 35,25} }, +{ {0,1,0,2,1,0,0,1, 38,26} }, +{ {0,1,0,2,1,0,0,2, 40,41} }, +{ {0,1,0,2,1,0,0,3, 76,41} }, +{ {0,1,0,2,1,0,1,0, 45,28} }, +{ {0,1,0,2,1,0,1,1, 27,29} }, +{ {0,1,0,2,1,0,1,2, 47,40} }, +{ {0,1,0,2,1,0,1,3, 90,40} }, +{ {0,1,0,2,1,0,2,0, 49,19} }, +{ {0,1,0,2,1,0,2,1, 50,19} }, +{ {0,1,0,2,1,0,2,2, 31,24} }, +{ {0,1,0,2,1,0,2,3, 98,19} }, +{ {0,1,0,2,1,0,3,0, 101,19} }, +{ {0,1,0,2,1,0,3,1, 102,19} }, +{ {0,1,0,2,1,0,3,2, 103,19} }, +{ {0,1,0,2,1,0,3,3, 103,40} }, +{ {0,1,0,2,1,0,3,4, 140,19} }, +{ {0,1,0,2,1,1,0,0, 28,3} }, +{ {0,1,0,2,1,1,0,1, 17,3} }, +{ {0,1,0,2,1,1,0,2, 41,41} }, +{ {0,1,0,2,1,1,0,3, 77,41} }, +{ {0,1,0,2,1,1,1,0, 23,11} }, +{ {0,1,0,2,1,1,1,1, 8,10} }, +{ {0,1,0,2,1,1,1,2, 37,3} }, +{ {0,1,0,2,1,1,1,3, 72,11} }, +{ {0,1,0,2,1,1,2,0, 31,3} }, +{ {0,1,0,2,1,1,2,1, 18,31} }, +{ {0,1,0,2,1,1,2,2, 43,3} }, +{ {0,1,0,2,1,1,2,3, 86,3} }, +{ {0,1,0,2,1,1,3,0, 68,42} }, +{ {0,1,0,2,1,1,3,1, 63,42} }, +{ {0,1,0,2,1,1,3,2, 82,42} }, +{ {0,1,0,2,1,1,3,3, 82,3} }, +{ {0,1,0,2,1,1,3,4, 132,42} }, +{ {0,1,0,2,1,2,0,0, 36,26} }, +{ {0,1,0,2,1,2,0,1, 39,26} }, +{ {0,1,0,2,1,2,0,2, 42,41} }, +{ {0,1,0,2,1,2,0,3, 78,41} }, +{ {0,1,0,2,1,2,1,0, 48,40} }, +{ {0,1,0,2,1,2,1,1, 40,4} }, +{ {0,1,0,2,1,2,1,2, 29,37} }, +{ {0,1,0,2,1,2,1,3, 91,40} }, +{ {0,1,0,2,1,2,2,0, 50,18} }, +{ {0,1,0,2,1,2,2,1, 51,19} }, +{ {0,1,0,2,1,2,2,2, 18,30} }, +{ {0,1,0,2,1,2,2,3, 99,19} }, +{ {0,1,0,2,1,2,3,0, 104,19} }, +{ {0,1,0,2,1,2,3,1, 105,19} }, +{ {0,1,0,2,1,2,3,2, 79,37} }, +{ {0,1,0,2,1,2,3,3, 106,19} }, +{ {0,1,0,2,1,2,3,4, 141,19} }, +{ {0,1,0,2,1,3,0,0, 71,26} }, +{ {0,1,0,2,1,3,0,1, 74,26} }, +{ {0,1,0,2,1,3,0,2, 75,41} }, +{ {0,1,0,2,1,3,0,3, 79,41} }, +{ {0,1,0,2,1,3,0,4, 128,41} }, +{ {0,1,0,2,1,3,1,0, 92,40} }, +{ {0,1,0,2,1,3,1,1, 81,29} }, +{ {0,1,0,2,1,3,1,2, 93,40} }, +{ {0,1,0,2,1,3,1,3, 94,40} }, +{ {0,1,0,2,1,3,1,4, 135,40} }, +{ {0,1,0,2,1,3,2,0, 98,18} }, +{ {0,1,0,2,1,3,2,1, 99,18} }, +{ {0,1,0,2,1,3,2,2, 86,24} }, +{ {0,1,0,2,1,3,2,3, 100,19} }, +{ {0,1,0,2,1,3,2,4, 139,19} }, +{ {0,1,0,2,1,3,3,0, 104,40} }, +{ {0,1,0,2,1,3,3,1, 105,40} }, +{ {0,1,0,2,1,3,3,2, 106,40} }, +{ {0,1,0,2,1,3,3,3, 79,30} }, +{ {0,1,0,2,1,3,3,4, 141,40} }, +{ {0,1,0,2,1,3,4,0, 142,19} }, +{ {0,1,0,2,1,3,4,1, 143,19} }, +{ {0,1,0,2,1,3,4,2, 144,19} }, +{ {0,1,0,2,1,3,4,3, 145,19} }, +{ {0,1,0,2,1,3,4,4, 144,40} }, +{ {0,1,0,2,1,3,4,5, 169,19} }, +{ {0,1,0,2,2,0,0,0, 21,25} }, +{ {0,1,0,2,2,0,0,1, 30,26} }, +{ {0,1,0,2,2,0,0,2, 27,26} }, +{ {0,1,0,2,2,0,0,3, 67,41} }, +{ {0,1,0,2,2,0,1,0, 52,19} }, +{ {0,1,0,2,2,0,1,1, 53,19} }, +{ {0,1,0,2,2,0,1,2, 53,40} }, +{ {0,1,0,2,2,0,1,3, 107,19} }, +{ {0,1,0,2,2,0,2,0, 45,29} }, +{ {0,1,0,2,2,0,2,1, 48,41} }, +{ {0,1,0,2,2,0,2,2, 23,4} }, +{ {0,1,0,2,2,0,2,3, 92,41} }, +{ {0,1,0,2,2,0,3,0, 110,19} }, +{ {0,1,0,2,2,0,3,1, 111,19} }, +{ {0,1,0,2,2,0,3,2, 112,19} }, +{ {0,1,0,2,2,0,3,3, 108,25} }, +{ {0,1,0,2,2,0,3,4, 147,19} }, +{ {0,1,0,2,2,1,0,0, 24,26} }, +{ {0,1,0,2,2,1,0,1, 32,26} }, +{ {0,1,0,2,2,1,0,2, 29,26} }, +{ {0,1,0,2,2,1,0,3, 69,41} }, +{ {0,1,0,2,2,1,1,0, 53,41} }, +{ {0,1,0,2,2,1,1,1, 24,30} }, +{ {0,1,0,2,2,1,1,2, 47,9} }, +{ {0,1,0,2,2,1,1,3, 108,19} }, +{ {0,1,0,2,2,1,2,0, 47,41} }, +{ {0,1,0,2,2,1,2,1, 29,36} }, +{ {0,1,0,2,2,1,2,2, 37,24} }, +{ {0,1,0,2,2,1,2,3, 93,41} }, +{ {0,1,0,2,2,1,3,0, 108,43} }, +{ {0,1,0,2,2,1,3,1, 69,9} }, +{ {0,1,0,2,2,1,3,2, 93,9} }, +{ {0,1,0,2,2,1,3,3, 113,19} }, +{ {0,1,0,2,2,1,3,4, 148,19} }, +{ {0,1,0,2,2,2,0,0, 23,44} }, +{ {0,1,0,2,2,2,0,1, 31,26} }, +{ {0,1,0,2,2,2,0,2, 28,26} }, +{ {0,1,0,2,2,2,0,3, 68,41} }, +{ {0,1,0,2,2,2,1,0, 53,18} }, +{ {0,1,0,2,2,2,1,1, 47,5} }, +{ {0,1,0,2,2,2,1,2, 24,31} }, +{ {0,1,0,2,2,2,1,3, 108,40} }, +{ {0,1,0,2,2,2,2,0, 27,28} }, +{ {0,1,0,2,2,2,2,1, 40,11} }, +{ {0,1,0,2,2,2,2,2, 8,5} }, +{ {0,1,0,2,2,2,2,3, 81,28} }, +{ {0,1,0,2,2,2,3,0, 112,3} }, +{ {0,1,0,2,2,2,3,1, 103,3} }, +{ {0,1,0,2,2,2,3,2, 73,37} }, +{ {0,1,0,2,2,2,3,3, 93,5} }, +{ {0,1,0,2,2,2,3,4, 149,19} }, +{ {0,1,0,2,2,3,0,0, 64,26} }, +{ {0,1,0,2,2,3,0,1, 66,26} }, +{ {0,1,0,2,2,3,0,2, 65,26} }, +{ {0,1,0,2,2,3,0,3, 69,26} }, +{ {0,1,0,2,2,3,0,4, 126,41} }, +{ {0,1,0,2,2,3,1,0, 107,41} }, +{ {0,1,0,2,2,3,1,1, 108,41} }, +{ {0,1,0,2,2,3,1,2, 108,18} }, +{ {0,1,0,2,2,3,1,3, 109,19} }, +{ {0,1,0,2,2,3,1,4, 146,19} }, +{ {0,1,0,2,2,3,2,0, 90,41} }, +{ {0,1,0,2,2,3,2,1, 91,41} }, +{ {0,1,0,2,2,3,2,2, 72,4} }, +{ {0,1,0,2,2,3,2,3, 94,41} }, +{ {0,1,0,2,2,3,2,4, 135,41} }, +{ {0,1,0,2,2,3,3,0, 111,41} }, +{ {0,1,0,2,2,3,3,1, 114,19} }, +{ {0,1,0,2,2,3,3,2, 103,39} }, +{ {0,1,0,2,2,3,3,3, 69,5} }, +{ {0,1,0,2,2,3,3,4, 150,19} }, +{ {0,1,0,2,2,3,4,0, 147,41} }, +{ {0,1,0,2,2,3,4,1, 150,41} }, +{ {0,1,0,2,2,3,4,2, 149,41} }, +{ {0,1,0,2,2,3,4,3, 151,19} }, +{ {0,1,0,2,2,3,4,4, 148,41} }, +{ {0,1,0,2,2,3,4,5, 170,19} }, +{ {0,1,0,2,3,0,0,0, 70,25} }, +{ {0,1,0,2,3,0,0,1, 85,26} }, +{ {0,1,0,2,3,0,0,2, 81,26} }, +{ {0,1,0,2,3,0,0,3, 76,26} }, +{ {0,1,0,2,3,0,0,4, 131,41} }, +{ {0,1,0,2,3,0,1,0, 110,18} }, +{ {0,1,0,2,3,0,1,1, 112,24} }, +{ {0,1,0,2,3,0,1,2, 108,38} }, +{ {0,1,0,2,3,0,1,3, 111,40} }, +{ {0,1,0,2,3,0,1,4, 147,40} }, +{ {0,1,0,2,3,0,2,0, 101,18} }, +{ {0,1,0,2,3,0,2,1, 104,18} }, +{ {0,1,0,2,3,0,2,2, 68,39} }, +{ {0,1,0,2,3,0,2,3, 104,41} }, +{ {0,1,0,2,3,0,2,4, 142,18} }, +{ {0,1,0,2,3,0,3,0, 89,28} }, +{ {0,1,0,2,3,0,3,1, 91,47} }, +{ {0,1,0,2,3,0,3,2, 93,47} }, +{ {0,1,0,2,3,0,3,3, 65,29} }, +{ {0,1,0,2,3,0,3,4, 135,47} }, +{ {0,1,0,2,3,0,4,0, 152,19} }, +{ {0,1,0,2,3,0,4,1, 153,19} }, +{ {0,1,0,2,3,0,4,2, 149,23} }, +{ {0,1,0,2,3,0,4,3, 153,40} }, +{ {0,1,0,2,3,0,4,4, 149,4} }, +{ {0,1,0,2,3,0,4,5, 171,19} }, +{ {0,1,0,2,3,1,0,0, 73,44} }, +{ {0,1,0,2,3,1,0,1, 88,9} }, +{ {0,1,0,2,3,1,0,2, 84,26} }, +{ {0,1,0,2,3,1,0,3, 79,26} }, +{ {0,1,0,2,3,1,0,4, 134,41} }, +{ {0,1,0,2,3,1,1,0, 112,18} }, +{ {0,1,0,2,3,1,1,1, 73,36} }, +{ {0,1,0,2,3,1,1,2, 93,22} }, +{ {0,1,0,2,3,1,1,3, 103,42} }, +{ {0,1,0,2,3,1,1,4, 149,40} }, +{ {0,1,0,2,3,1,2,0, 103,18} }, +{ {0,1,0,2,3,1,2,1, 79,36} }, +{ {0,1,0,2,3,1,2,2, 82,39} }, +{ {0,1,0,2,3,1,2,3, 106,41} }, +{ {0,1,0,2,3,1,2,4, 144,18} }, +{ {0,1,0,2,3,1,3,0, 93,46} }, +{ {0,1,0,2,3,1,3,1, 84,36} }, +{ {0,1,0,2,3,1,3,2, 96,8} }, +{ {0,1,0,2,3,1,3,3, 82,29} }, +{ {0,1,0,2,3,1,3,4, 137,40} }, +{ {0,1,0,2,3,1,4,0, 149,8} }, +{ {0,1,0,2,3,1,4,1, 134,9} }, +{ {0,1,0,2,3,1,4,2, 137,8} }, +{ {0,1,0,2,3,1,4,3, 144,42} }, +{ {0,1,0,2,3,1,4,4, 154,19} }, +{ {0,1,0,2,3,1,4,5, 172,19} }, +{ {0,1,0,2,3,2,0,0, 71,44} }, +{ {0,1,0,2,3,2,0,1, 87,26} }, +{ {0,1,0,2,3,2,0,2, 83,22} }, +{ {0,1,0,2,3,2,0,3, 78,26} }, +{ {0,1,0,2,3,2,0,4, 133,41} }, +{ {0,1,0,2,3,2,1,0, 111,18} }, +{ {0,1,0,2,3,2,1,1, 103,24} }, +{ {0,1,0,2,3,2,1,2, 69,22} }, +{ {0,1,0,2,3,2,1,3, 114,18} }, +{ {0,1,0,2,3,2,1,4, 150,40} }, +{ {0,1,0,2,3,2,2,0, 102,18} }, +{ {0,1,0,2,3,2,2,1, 105,18} }, +{ {0,1,0,2,3,2,2,2, 63,39} }, +{ {0,1,0,2,3,2,2,3, 105,41} }, +{ {0,1,0,2,3,2,2,4, 143,18} }, +{ {0,1,0,2,3,2,3,0, 91,46} }, +{ {0,1,0,2,3,2,3,1, 97,40} }, +{ {0,1,0,2,3,2,3,2, 84,37} }, +{ {0,1,0,2,3,2,3,3, 75,4} }, +{ {0,1,0,2,3,2,3,4, 138,40} }, +{ {0,1,0,2,3,2,4,0, 153,18} }, +{ {0,1,0,2,3,2,4,1, 155,19} }, +{ {0,1,0,2,3,2,4,2, 134,22} }, +{ {0,1,0,2,3,2,4,3, 156,19} }, +{ {0,1,0,2,3,2,4,4, 144,24} }, +{ {0,1,0,2,3,2,4,5, 173,19} }, +{ {0,1,0,2,3,3,0,0, 72,44} }, +{ {0,1,0,2,3,3,0,1, 86,26} }, +{ {0,1,0,2,3,3,0,2, 82,26} }, +{ {0,1,0,2,3,3,0,3, 77,26} }, +{ {0,1,0,2,3,3,0,4, 132,41} }, +{ {0,1,0,2,3,3,1,0, 108,2} }, +{ {0,1,0,2,3,3,1,1, 93,10} }, +{ {0,1,0,2,3,3,1,2, 113,18} }, +{ {0,1,0,2,3,3,1,3, 69,10} }, +{ {0,1,0,2,3,3,1,4, 148,40} }, +{ {0,1,0,2,3,3,2,0, 103,41} }, +{ {0,1,0,2,3,3,2,1, 106,18} }, +{ {0,1,0,2,3,3,2,2, 82,24} }, +{ {0,1,0,2,3,3,2,3, 79,31} }, +{ {0,1,0,2,3,3,2,4, 144,41} }, +{ {0,1,0,2,3,3,3,0, 65,28} }, +{ {0,1,0,2,3,3,3,1, 75,11} }, +{ {0,1,0,2,3,3,3,2, 82,28} }, +{ {0,1,0,2,3,3,3,3, 59,28} }, +{ {0,1,0,2,3,3,3,4, 129,28} }, +{ {0,1,0,2,3,3,4,0, 149,11} }, +{ {0,1,0,2,3,3,4,1, 144,3} }, +{ {0,1,0,2,3,3,4,2, 154,18} }, +{ {0,1,0,2,3,3,4,3, 134,10} }, +{ {0,1,0,2,3,3,4,4, 137,11} }, +{ {0,1,0,2,3,3,4,5, 172,40} }, +{ {0,1,0,2,3,4,0,0, 127,26} }, +{ {0,1,0,2,3,4,0,1, 130,26} }, +{ {0,1,0,2,3,4,0,2, 129,26} }, +{ {0,1,0,2,3,4,0,3, 128,26} }, +{ {0,1,0,2,3,4,0,4, 134,26} }, +{ {0,1,0,2,3,4,0,5, 167,41} }, +{ {0,1,0,2,3,4,1,0, 147,18} }, +{ {0,1,0,2,3,4,1,1, 149,18} }, +{ {0,1,0,2,3,4,1,2, 148,18} }, +{ {0,1,0,2,3,4,1,3, 150,18} }, +{ {0,1,0,2,3,4,1,4, 151,18} }, +{ {0,1,0,2,3,4,1,5, 170,18} }, +{ {0,1,0,2,3,4,2,0, 140,18} }, +{ {0,1,0,2,3,4,2,1, 141,18} }, +{ {0,1,0,2,3,4,2,2, 132,39} }, +{ {0,1,0,2,3,4,2,3, 141,41} }, +{ {0,1,0,2,3,4,2,4, 145,18} }, +{ {0,1,0,2,3,4,2,5, 169,18} }, +{ {0,1,0,2,3,4,3,0, 135,46} }, +{ {0,1,0,2,3,4,3,1, 138,41} }, +{ {0,1,0,2,3,4,3,2, 137,41} }, +{ {0,1,0,2,3,4,3,3, 129,29} }, +{ {0,1,0,2,3,4,3,4, 136,47} }, +{ {0,1,0,2,3,4,3,5, 168,40} }, +{ {0,1,0,2,3,4,4,0, 153,41} }, +{ {0,1,0,2,3,4,4,1, 156,18} }, +{ {0,1,0,2,3,4,4,2, 144,39} }, +{ {0,1,0,2,3,4,4,3, 155,40} }, +{ {0,1,0,2,3,4,4,4, 134,5} }, +{ {0,1,0,2,3,4,4,5, 173,40} }, +{ {0,1,0,2,3,4,5,0, 171,18} }, +{ {0,1,0,2,3,4,5,1, 173,18} }, +{ {0,1,0,2,3,4,5,2, 172,18} }, +{ {0,1,0,2,3,4,5,3, 173,41} }, +{ {0,1,0,2,3,4,5,4, 174,19} }, +{ {0,1,0,2,3,4,5,5, 172,41} }, +{ {0,1,0,2,3,4,5,6, 182,19} }, +{ {0,1,1,0,0,0,0,0, 4,5} }, +{ {0,1,1,0,0,0,0,1, 13,2} }, +{ {0,1,1,0,0,0,0,2, 16,12} }, +{ {0,1,1,0,0,0,1,0, 20,10} }, +{ {0,1,1,0,0,0,1,1, 25,2} }, +{ {0,1,1,0,0,0,1,2, 27,33} }, +{ {0,1,1,0,0,0,2,0, 35,10} }, +{ {0,1,1,0,0,0,2,1, 38,2} }, +{ {0,1,1,0,0,0,2,2, 40,33} }, +{ {0,1,1,0,0,0,2,3, 76,33} }, +{ {0,1,1,0,0,1,0,0, 20,4} }, +{ {0,1,1,0,0,1,0,1, 25,12} }, +{ {0,1,1,0,0,1,0,2, 27,12} }, +{ {0,1,1,0,0,1,1,0, 44,12} }, +{ {0,1,1,0,0,1,1,1, 20,5} }, +{ {0,1,1,0,0,1,1,2, 45,13} }, +{ {0,1,1,0,0,1,2,0, 45,8} }, +{ {0,1,1,0,0,1,2,1, 27,9} }, +{ {0,1,1,0,0,1,2,2, 47,32} }, +{ {0,1,1,0,0,1,2,3, 90,32} }, +{ {0,1,1,0,0,2,0,0, 35,4} }, +{ {0,1,1,0,0,2,0,1, 38,12} }, +{ {0,1,1,0,0,2,0,2, 40,12} }, +{ {0,1,1,0,0,2,0,3, 76,12} }, +{ {0,1,1,0,0,2,1,0, 45,26} }, +{ {0,1,1,0,0,2,1,1, 27,44} }, +{ {0,1,1,0,0,2,1,2, 47,13} }, +{ {0,1,1,0,0,2,1,3, 90,13} }, +{ {0,1,1,0,0,2,2,0, 49,13} }, +{ {0,1,1,0,0,2,2,1, 50,13} }, +{ {0,1,1,0,0,2,2,2, 31,5} }, +{ {0,1,1,0,0,2,2,3, 98,13} }, +{ {0,1,1,0,0,2,3,0, 101,23} }, +{ {0,1,1,0,0,2,3,1, 102,32} }, +{ {0,1,1,0,0,2,3,2, 103,32} }, +{ {0,1,1,0,0,2,3,3, 103,13} }, +{ {0,1,1,0,0,2,3,4, 140,32} }, +{ {0,1,1,0,1,0,0,0, 13,5} }, +{ {0,1,1,0,1,0,0,1, 54,0} }, +{ {0,1,1,0,1,0,0,2, 55,0} }, +{ {0,1,1,0,1,0,1,0, 25,22} }, +{ {0,1,1,0,1,0,1,1, 13,4} }, +{ {0,1,1,0,1,0,1,2, 38,27} }, +{ {0,1,1,0,1,0,2,0, 38,22} }, +{ {0,1,1,0,1,0,2,1, 55,1} }, +{ {0,1,1,0,1,0,2,2, 51,5} }, +{ {0,1,1,0,1,0,2,3, 115,0} }, +{ {0,1,1,0,1,1,0,0, 25,24} }, +{ {0,1,1,0,1,1,0,1, 13,3} }, +{ {0,1,1,0,1,1,0,2, 38,3} }, +{ {0,1,1,0,1,1,1,0, 20,11} }, +{ {0,1,1,0,1,1,1,1, 4,4} }, +{ {0,1,1,0,1,1,1,2, 35,11} }, +{ {0,1,1,0,1,1,2,0, 27,42} }, +{ {0,1,1,0,1,1,2,1, 16,9} }, +{ {0,1,1,0,1,1,2,2, 40,42} }, +{ {0,1,1,0,1,1,2,3, 76,42} }, +{ {0,1,1,0,1,2,0,0, 38,24} }, +{ {0,1,1,0,1,2,0,1, 55,6} }, +{ {0,1,1,0,1,2,0,2, 51,30} }, +{ {0,1,1,0,1,2,0,3, 115,19} }, +{ {0,1,1,0,1,2,1,0, 27,27} }, +{ {0,1,1,0,1,2,1,1, 16,27} }, +{ {0,1,1,0,1,2,1,2, 40,27} }, +{ {0,1,1,0,1,2,1,3, 76,27} }, +{ {0,1,1,0,1,2,2,0, 50,23} }, +{ {0,1,1,0,1,2,2,1, 56,0} }, +{ {0,1,1,0,1,2,2,2, 39,5} }, +{ {0,1,1,0,1,2,2,3, 116,0} }, +{ {0,1,1,0,1,2,3,0, 102,23} }, +{ {0,1,1,0,1,2,3,1, 117,0} }, +{ {0,1,1,0,1,2,3,2, 105,36} }, +{ {0,1,1,0,1,2,3,3, 105,25} }, +{ {0,1,1,0,1,2,3,4, 157,0} }, +{ {0,1,1,0,2,0,0,0, 16,22} }, +{ {0,1,1,0,2,0,0,1, 55,7} }, +{ {0,1,1,0,2,0,0,2, 56,1} }, +{ {0,1,1,0,2,0,0,3, 117,1} }, +{ {0,1,1,0,2,0,1,0, 27,22} }, +{ {0,1,1,0,2,0,1,1, 38,25} }, +{ {0,1,1,0,2,0,1,2, 50,26} }, +{ {0,1,1,0,2,0,1,3, 102,26} }, +{ {0,1,1,0,2,0,2,0, 40,22} }, +{ {0,1,1,0,2,0,2,1, 51,28} }, +{ {0,1,1,0,2,0,2,2, 39,4} }, +{ {0,1,1,0,2,0,2,3, 105,47} }, +{ {0,1,1,0,2,0,3,0, 76,22} }, +{ {0,1,1,0,2,0,3,1, 115,14} }, +{ {0,1,1,0,2,0,3,2, 116,1} }, +{ {0,1,1,0,2,0,3,3, 105,24} }, +{ {0,1,1,0,2,0,3,4, 157,1} }, +{ {0,1,1,0,2,1,0,0, 27,39} }, +{ {0,1,1,0,2,1,0,1, 38,9} }, +{ {0,1,1,0,2,1,0,2, 50,8} }, +{ {0,1,1,0,2,1,0,3, 102,43} }, +{ {0,1,1,0,2,1,1,0, 45,23} }, +{ {0,1,1,0,2,1,1,1, 35,5} }, +{ {0,1,1,0,2,1,1,2, 49,8} }, +{ {0,1,1,0,2,1,1,3, 101,26} }, +{ {0,1,1,0,2,1,2,0, 47,23} }, +{ {0,1,1,0,2,1,2,1, 40,9} }, +{ {0,1,1,0,2,1,2,2, 31,4} }, +{ {0,1,1,0,2,1,2,3, 103,43} }, +{ {0,1,1,0,2,1,3,0, 90,8} }, +{ {0,1,1,0,2,1,3,1, 76,9} }, +{ {0,1,1,0,2,1,3,2, 98,8} }, +{ {0,1,1,0,2,1,3,3, 103,8} }, +{ {0,1,1,0,2,1,3,4, 140,43} }, +{ {0,1,1,0,2,2,0,0, 40,39} }, +{ {0,1,1,0,2,2,0,1, 51,2} }, +{ {0,1,1,0,2,2,0,2, 39,10} }, +{ {0,1,1,0,2,2,0,3, 105,2} }, +{ {0,1,1,0,2,2,1,0, 47,38} }, +{ {0,1,1,0,2,2,1,1, 40,44} }, +{ {0,1,1,0,2,2,1,2, 31,10} }, +{ {0,1,1,0,2,2,1,3, 103,26} }, +{ {0,1,1,0,2,2,2,0, 31,11} }, +{ {0,1,1,0,2,2,2,1, 39,11} }, +{ {0,1,1,0,2,2,2,2, 12,5} }, +{ {0,1,1,0,2,2,2,3, 87,11} }, +{ {0,1,1,0,2,2,3,0, 103,23} }, +{ {0,1,1,0,2,2,3,1, 105,3} }, +{ {0,1,1,0,2,2,3,2, 87,10} }, +{ {0,1,1,0,2,2,3,3, 97,11} }, +{ {0,1,1,0,2,2,3,4, 155,2} }, +{ {0,1,1,0,2,3,0,0, 76,39} }, +{ {0,1,1,0,2,3,0,1, 115,6} }, +{ {0,1,1,0,2,3,0,2, 116,18} }, +{ {0,1,1,0,2,3,0,3, 105,37} }, +{ {0,1,1,0,2,3,0,4, 157,18} }, +{ {0,1,1,0,2,3,1,0, 90,45} }, +{ {0,1,1,0,2,3,1,1, 76,44} }, +{ {0,1,1,0,2,3,1,2, 98,26} }, +{ {0,1,1,0,2,3,1,3, 103,45} }, +{ {0,1,1,0,2,3,1,4, 140,26} }, +{ {0,1,1,0,2,3,2,0, 103,38} }, +{ {0,1,1,0,2,3,2,1, 105,46} }, +{ {0,1,1,0,2,3,2,2, 87,4} }, +{ {0,1,1,0,2,3,2,3, 97,28} }, +{ {0,1,1,0,2,3,2,4, 155,47} }, +{ {0,1,1,0,2,3,3,0, 98,23} }, +{ {0,1,1,0,2,3,3,1, 116,15} }, +{ {0,1,1,0,2,3,3,2, 118,0} }, +{ {0,1,1,0,2,3,3,3, 87,5} }, +{ {0,1,1,0,2,3,3,4, 158,0} }, +{ {0,1,1,0,2,3,4,0, 140,23} }, +{ {0,1,1,0,2,3,4,1, 157,15} }, +{ {0,1,1,0,2,3,4,2, 158,1} }, +{ {0,1,1,0,2,3,4,3, 155,36} }, +{ {0,1,1,0,2,3,4,4, 155,25} }, +{ {0,1,1,0,2,3,4,5, 175,0} }, +{ {0,1,1,1,0,0,0,0, 5,11} }, +{ {0,1,1,1,0,0,0,1, 14,2} }, +{ {0,1,1,1,0,0,0,2, 17,12} }, +{ {0,1,1,1,0,0,1,0, 22,2} }, +{ {0,1,1,1,0,0,1,1, 5,7} }, +{ {0,1,1,1,0,0,1,2, 28,33} }, +{ {0,1,1,1,0,0,2,0, 28,15} }, +{ {0,1,1,1,0,0,2,1, 17,15} }, +{ {0,1,1,1,0,0,2,2, 41,33} }, +{ {0,1,1,1,0,0,2,3, 77,33} }, +{ {0,1,1,1,0,1,0,0, 22,29} }, +{ {0,1,1,1,0,1,0,1, 5,23} }, +{ {0,1,1,1,0,1,0,2, 28,12} }, +{ {0,1,1,1,0,1,1,0, 20,15} }, +{ {0,1,1,1,0,1,1,1, 2,22} }, +{ {0,1,1,1,0,1,1,2, 34,15} }, +{ {0,1,1,1,0,1,2,0, 23,35} }, +{ {0,1,1,1,0,1,2,1, 8,34} }, +{ {0,1,1,1,0,1,2,2, 37,15} }, +{ {0,1,1,1,0,1,2,3, 72,35} }, +{ {0,1,1,1,0,2,0,0, 28,16} }, +{ {0,1,1,1,0,2,0,1, 17,7} }, +{ {0,1,1,1,0,2,0,2, 41,12} }, +{ {0,1,1,1,0,2,0,3, 77,12} }, +{ {0,1,1,1,0,2,1,0, 23,6} }, +{ {0,1,1,1,0,2,1,1, 8,7} }, +{ {0,1,1,1,0,2,1,2, 37,16} }, +{ {0,1,1,1,0,2,1,3, 72,6} }, +{ {0,1,1,1,0,2,2,0, 31,15} }, +{ {0,1,1,1,0,2,2,1, 18,23} }, +{ {0,1,1,1,0,2,2,2, 43,15} }, +{ {0,1,1,1,0,2,2,3, 86,15} }, +{ {0,1,1,1,0,2,3,0, 68,15} }, +{ {0,1,1,1,0,2,3,1, 63,15} }, +{ {0,1,1,1,0,2,3,2, 82,15} }, +{ {0,1,1,1,0,2,3,3, 82,16} }, +{ {0,1,1,1,0,2,3,4, 132,15} }, +{ {0,1,1,1,1,0,0,0, 25,5} }, +{ {0,1,1,1,1,0,0,1, 13,7} }, +{ {0,1,1,1,1,0,0,2, 38,15} }, +{ {0,1,1,1,1,0,1,0, 20,6} }, +{ {0,1,1,1,1,0,1,1, 4,7} }, +{ {0,1,1,1,1,0,1,2, 35,6} }, +{ {0,1,1,1,1,0,2,0, 27,15} }, +{ {0,1,1,1,1,0,2,1, 16,15} }, +{ {0,1,1,1,1,0,2,2, 40,15} }, +{ {0,1,1,1,1,0,2,3, 76,15} }, +{ {0,1,1,1,1,1,0,0, 20,8} }, +{ {0,1,1,1,1,1,0,1, 4,9} }, +{ {0,1,1,1,1,1,0,2, 35,8} }, +{ {0,1,1,1,1,1,1,0, 19,6} }, +{ {0,1,1,1,1,1,1,1, 1,5} }, +{ {0,1,1,1,1,1,1,2, 33,3} }, +{ {0,1,1,1,1,1,2,0, 21,8} }, +{ {0,1,1,1,1,1,2,1, 7,9} }, +{ {0,1,1,1,1,1,2,2, 34,8} }, +{ {0,1,1,1,1,1,2,3, 70,8} }, +{ {0,1,1,1,1,2,0,0, 27,16} }, +{ {0,1,1,1,1,2,0,1, 16,7} }, +{ {0,1,1,1,1,2,0,2, 40,16} }, +{ {0,1,1,1,1,2,0,3, 76,16} }, +{ {0,1,1,1,1,2,1,0, 21,6} }, +{ {0,1,1,1,1,2,1,1, 7,7} }, +{ {0,1,1,1,1,2,1,2, 34,6} }, +{ {0,1,1,1,1,2,1,3, 70,6} }, +{ {0,1,1,1,1,2,2,0, 30,15} }, +{ {0,1,1,1,1,2,2,1, 16,23} }, +{ {0,1,1,1,1,2,2,2, 26,5} }, +{ {0,1,1,1,1,2,2,3, 85,15} }, +{ {0,1,1,1,1,2,3,0, 67,15} }, +{ {0,1,1,1,1,2,3,1, 62,15} }, +{ {0,1,1,1,1,2,3,2, 81,15} }, +{ {0,1,1,1,1,2,3,3, 81,16} }, +{ {0,1,1,1,1,2,3,4, 131,15} }, +{ {0,1,1,1,2,0,0,0, 26,15} }, +{ {0,1,1,1,2,0,0,1, 15,7} }, +{ {0,1,1,1,2,0,0,2, 39,15} }, +{ {0,1,1,1,2,0,0,3, 74,15} }, +{ {0,1,1,1,2,0,1,0, 23,16} }, +{ {0,1,1,1,2,0,1,1, 6,7} }, +{ {0,1,1,1,2,0,1,2, 36,16} }, +{ {0,1,1,1,2,0,1,3, 71,16} }, +{ {0,1,1,1,2,0,2,0, 29,15} }, +{ {0,1,1,1,2,0,2,1, 18,15} }, +{ {0,1,1,1,2,0,2,2, 42,15} }, +{ {0,1,1,1,2,0,2,3, 79,15} }, +{ {0,1,1,1,2,0,3,0, 65,15} }, +{ {0,1,1,1,2,0,3,1, 61,15} }, +{ {0,1,1,1,2,0,3,2, 78,15} }, +{ {0,1,1,1,2,0,3,3, 75,15} }, +{ {0,1,1,1,2,0,3,4, 128,15} }, +{ {0,1,1,1,2,1,0,0, 23,15} }, +{ {0,1,1,1,2,1,0,1, 6,23} }, +{ {0,1,1,1,2,1,0,2, 36,15} }, +{ {0,1,1,1,2,1,0,3, 71,15} }, +{ {0,1,1,1,2,1,1,0, 21,15} }, +{ {0,1,1,1,2,1,1,1, 3,23} }, +{ {0,1,1,1,2,1,1,2, 35,15} }, +{ {0,1,1,1,2,1,1,3, 70,15} }, +{ {0,1,1,1,2,1,2,0, 24,15} }, +{ {0,1,1,1,2,1,2,1, 8,23} }, +{ {0,1,1,1,2,1,2,2, 28,4} }, +{ {0,1,1,1,2,1,2,3, 73,15} }, +{ {0,1,1,1,2,1,3,0, 64,35} }, +{ {0,1,1,1,2,1,3,1, 58,34} }, +{ {0,1,1,1,2,1,3,2, 71,35} }, +{ {0,1,1,1,2,1,3,3, 72,15} }, +{ {0,1,1,1,2,1,3,4, 127,15} }, +{ {0,1,1,1,2,2,0,0, 29,16} }, +{ {0,1,1,1,2,2,0,1, 18,7} }, +{ {0,1,1,1,2,2,0,2, 42,16} }, +{ {0,1,1,1,2,2,0,3, 79,16} }, +{ {0,1,1,1,2,2,1,0, 24,6} }, +{ {0,1,1,1,2,2,1,1, 8,38} }, +{ {0,1,1,1,2,2,1,2, 28,31} }, +{ {0,1,1,1,2,2,1,3, 73,16} }, +{ {0,1,1,1,2,2,2,0, 32,15} }, +{ {0,1,1,1,2,2,2,1, 17,23} }, +{ {0,1,1,1,2,2,2,2, 10,5} }, +{ {0,1,1,1,2,2,2,3, 88,15} }, +{ {0,1,1,1,2,2,3,0, 69,15} }, +{ {0,1,1,1,2,2,3,1, 63,34} }, +{ {0,1,1,1,2,2,3,2, 83,15} }, +{ {0,1,1,1,2,2,3,3, 84,16} }, +{ {0,1,1,1,2,2,3,4, 134,15} }, +{ {0,1,1,1,2,3,0,0, 65,16} }, +{ {0,1,1,1,2,3,0,1, 61,7} }, +{ {0,1,1,1,2,3,0,2, 78,16} }, +{ {0,1,1,1,2,3,0,3, 75,16} }, +{ {0,1,1,1,2,3,0,4, 128,16} }, +{ {0,1,1,1,2,3,1,0, 64,6} }, +{ {0,1,1,1,2,3,1,1, 58,7} }, +{ {0,1,1,1,2,3,1,2, 71,6} }, +{ {0,1,1,1,2,3,1,3, 72,16} }, +{ {0,1,1,1,2,3,1,4, 127,16} }, +{ {0,1,1,1,2,3,2,0, 69,16} }, +{ {0,1,1,1,2,3,2,1, 63,7} }, +{ {0,1,1,1,2,3,2,2, 83,16} }, +{ {0,1,1,1,2,3,2,3, 84,15} }, +{ {0,1,1,1,2,3,2,4, 134,16} }, +{ {0,1,1,1,2,3,3,0, 66,15} }, +{ {0,1,1,1,2,3,3,1, 61,23} }, +{ {0,1,1,1,2,3,3,2, 87,15} }, +{ {0,1,1,1,2,3,3,3, 80,15} }, +{ {0,1,1,1,2,3,3,4, 130,15} }, +{ {0,1,1,1,2,3,4,0, 126,15} }, +{ {0,1,1,1,2,3,4,1, 125,15} }, +{ {0,1,1,1,2,3,4,2, 133,15} }, +{ {0,1,1,1,2,3,4,3, 129,15} }, +{ {0,1,1,1,2,3,4,4, 129,16} }, +{ {0,1,1,1,2,3,4,5, 167,15} }, +{ {0,1,1,2,0,0,0,0, 6,11} }, +{ {0,1,1,2,0,0,0,1, 15,2} }, +{ {0,1,1,2,0,0,0,2, 18,12} }, +{ {0,1,1,2,0,0,0,3, 61,12} }, +{ {0,1,1,2,0,0,1,0, 23,2} }, +{ {0,1,1,2,0,0,1,1, 26,2} }, +{ {0,1,1,2,0,0,1,2, 29,33} }, +{ {0,1,1,2,0,0,1,3, 65,33} }, +{ {0,1,1,2,0,0,2,0, 36,2} }, +{ {0,1,1,2,0,0,2,1, 39,2} }, +{ {0,1,1,2,0,0,2,2, 42,33} }, +{ {0,1,1,2,0,0,2,3, 78,33} }, +{ {0,1,1,2,0,0,3,0, 71,2} }, +{ {0,1,1,2,0,0,3,1, 74,2} }, +{ {0,1,1,2,0,0,3,2, 79,33} }, +{ {0,1,1,2,0,0,3,3, 75,33} }, +{ {0,1,1,2,0,0,3,4, 128,33} }, +{ {0,1,1,2,0,1,0,0, 23,47} }, +{ {0,1,1,2,0,1,0,1, 26,12} }, +{ {0,1,1,2,0,1,0,2, 29,12} }, +{ {0,1,1,2,0,1,0,3, 65,12} }, +{ {0,1,1,2,0,1,1,0, 45,12} }, +{ {0,1,1,2,0,1,1,1, 34,5} }, +{ {0,1,1,2,0,1,1,2, 46,12} }, +{ {0,1,1,2,0,1,1,3, 89,13} }, +{ {0,1,1,2,0,1,2,0, 48,32} }, +{ {0,1,1,2,0,1,2,1, 40,36} }, +{ {0,1,1,2,0,1,2,2, 29,39} }, +{ {0,1,1,2,0,1,2,3, 91,32} }, +{ {0,1,1,2,0,1,3,0, 92,42} }, +{ {0,1,1,2,0,1,3,1, 81,9} }, +{ {0,1,1,2,0,1,3,2, 94,32} }, +{ {0,1,1,2,0,1,3,3, 93,32} }, +{ {0,1,1,2,0,1,3,4, 135,32} }, +{ {0,1,1,2,0,2,0,0, 36,47} }, +{ {0,1,1,2,0,2,0,1, 39,12} }, +{ {0,1,1,2,0,2,0,2, 42,12} }, +{ {0,1,1,2,0,2,0,3, 78,12} }, +{ {0,1,1,2,0,2,1,0, 48,13} }, +{ {0,1,1,2,0,2,1,1, 40,25} }, +{ {0,1,1,2,0,2,1,2, 29,22} }, +{ {0,1,1,2,0,2,1,3, 91,13} }, +{ {0,1,1,2,0,2,2,0, 50,12} }, +{ {0,1,1,2,0,2,2,1, 51,13} }, +{ {0,1,1,2,0,2,2,2, 18,22} }, +{ {0,1,1,2,0,2,2,3, 99,13} }, +{ {0,1,1,2,0,2,3,0, 104,32} }, +{ {0,1,1,2,0,2,3,1, 105,32} }, +{ {0,1,1,2,0,2,3,2, 79,22} }, +{ {0,1,1,2,0,2,3,3, 106,32} }, +{ {0,1,1,2,0,2,3,4, 141,32} }, +{ {0,1,1,2,0,3,0,0, 71,47} }, +{ {0,1,1,2,0,3,0,1, 74,12} }, +{ {0,1,1,2,0,3,0,2, 79,12} }, +{ {0,1,1,2,0,3,0,3, 75,12} }, +{ {0,1,1,2,0,3,0,4, 128,12} }, +{ {0,1,1,2,0,3,1,0, 92,27} }, +{ {0,1,1,2,0,3,1,1, 81,44} }, +{ {0,1,1,2,0,3,1,2, 94,13} }, +{ {0,1,1,2,0,3,1,3, 93,13} }, +{ {0,1,1,2,0,3,1,4, 135,13} }, +{ {0,1,1,2,0,3,2,0, 104,13} }, +{ {0,1,1,2,0,3,2,1, 105,13} }, +{ {0,1,1,2,0,3,2,2, 79,39} }, +{ {0,1,1,2,0,3,2,3, 106,13} }, +{ {0,1,1,2,0,3,2,4, 141,13} }, +{ {0,1,1,2,0,3,3,0, 98,12} }, +{ {0,1,1,2,0,3,3,1, 99,12} }, +{ {0,1,1,2,0,3,3,2, 100,13} }, +{ {0,1,1,2,0,3,3,3, 86,5} }, +{ {0,1,1,2,0,3,3,4, 139,13} }, +{ {0,1,1,2,0,3,4,0, 142,32} }, +{ {0,1,1,2,0,3,4,1, 143,32} }, +{ {0,1,1,2,0,3,4,2, 145,32} }, +{ {0,1,1,2,0,3,4,3, 144,32} }, +{ {0,1,1,2,0,3,4,4, 144,13} }, +{ {0,1,1,2,0,3,4,5, 169,32} }, +{ {0,1,1,2,1,0,0,0, 38,5} }, +{ {0,1,1,2,1,0,0,1, 55,2} }, +{ {0,1,1,2,1,0,0,2, 51,22} }, +{ {0,1,1,2,1,0,0,3, 115,13} }, +{ {0,1,1,2,1,0,1,0, 27,46} }, +{ {0,1,1,2,1,0,1,1, 16,29} }, +{ {0,1,1,2,1,0,1,2, 40,46} }, +{ {0,1,1,2,1,0,1,3, 76,46} }, +{ {0,1,1,2,1,0,2,0, 50,31} }, +{ {0,1,1,2,1,0,2,1, 56,3} }, +{ {0,1,1,2,1,0,2,2, 39,24} }, +{ {0,1,1,2,1,0,2,3, 116,21} }, +{ {0,1,1,2,1,0,3,0, 102,36} }, +{ {0,1,1,2,1,0,3,1, 117,21} }, +{ {0,1,1,2,1,0,3,2, 105,23} }, +{ {0,1,1,2,1,0,3,3, 105,4} }, +{ {0,1,1,2,1,0,3,4, 157,21} }, +{ {0,1,1,2,1,1,0,0, 27,3} }, +{ {0,1,1,2,1,1,0,1, 16,3} }, +{ {0,1,1,2,1,1,0,2, 40,3} }, +{ {0,1,1,2,1,1,0,3, 76,3} }, +{ {0,1,1,2,1,1,1,0, 21,11} }, +{ {0,1,1,2,1,1,1,1, 7,10} }, +{ {0,1,1,2,1,1,1,2, 34,11} }, +{ {0,1,1,2,1,1,1,3, 70,11} }, +{ {0,1,1,2,1,1,2,0, 30,3} }, +{ {0,1,1,2,1,1,2,1, 16,31} }, +{ {0,1,1,2,1,1,2,2, 26,24} }, +{ {0,1,1,2,1,1,2,3, 85,3} }, +{ {0,1,1,2,1,1,3,0, 67,42} }, +{ {0,1,1,2,1,1,3,1, 62,42} }, +{ {0,1,1,2,1,1,3,2, 81,42} }, +{ {0,1,1,2,1,1,3,3, 81,3} }, +{ {0,1,1,2,1,1,3,4, 131,42} }, +{ {0,1,1,2,1,2,0,0, 50,4} }, +{ {0,1,1,2,1,2,0,1, 56,13} }, +{ {0,1,1,2,1,2,0,2, 39,22} }, +{ {0,1,1,2,1,2,0,3, 116,13} }, +{ {0,1,1,2,1,2,1,0, 30,27} }, +{ {0,1,1,2,1,2,1,1, 16,4} }, +{ {0,1,1,2,1,2,1,2, 26,22} }, +{ {0,1,1,2,1,2,1,3, 85,27} }, +{ {0,1,1,2,1,2,2,0, 57,0} }, +{ {0,1,1,2,1,2,2,1, 55,5} }, +{ {0,1,1,2,1,2,2,2, 15,5} }, +{ {0,1,1,2,1,2,2,3, 119,0} }, +{ {0,1,1,2,1,2,3,0, 120,0} }, +{ {0,1,1,2,1,2,3,1, 117,9} }, +{ {0,1,1,2,1,2,3,2, 74,22} }, +{ {0,1,1,2,1,2,3,3, 99,5} }, +{ {0,1,1,2,1,2,3,4, 159,0} }, +{ {0,1,1,2,1,3,0,0, 102,25} }, +{ {0,1,1,2,1,3,0,1, 117,27} }, +{ {0,1,1,2,1,3,0,2, 105,38} }, +{ {0,1,1,2,1,3,0,3, 105,31} }, +{ {0,1,1,2,1,3,0,4, 157,40} }, +{ {0,1,1,2,1,3,1,0, 67,27} }, +{ {0,1,1,2,1,3,1,1, 62,27} }, +{ {0,1,1,2,1,3,1,2, 81,27} }, +{ {0,1,1,2,1,3,1,3, 81,46} }, +{ {0,1,1,2,1,3,1,4, 131,27} }, +{ {0,1,1,2,1,3,2,0, 120,19} }, +{ {0,1,1,2,1,3,2,1, 117,7} }, +{ {0,1,1,2,1,3,2,2, 74,24} }, +{ {0,1,1,2,1,3,2,3, 99,30} }, +{ {0,1,1,2,1,3,2,4, 159,19} }, +{ {0,1,1,2,1,3,3,0, 120,13} }, +{ {0,1,1,2,1,3,3,1, 117,10} }, +{ {0,1,1,2,1,3,3,2, 99,22} }, +{ {0,1,1,2,1,3,3,3, 74,5} }, +{ {0,1,1,2,1,3,3,4, 159,13} }, +{ {0,1,1,2,1,3,4,0, 160,0} }, +{ {0,1,1,2,1,3,4,1, 161,0} }, +{ {0,1,1,2,1,3,4,2, 143,23} }, +{ {0,1,1,2,1,3,4,3, 143,36} }, +{ {0,1,1,2,1,3,4,4, 143,25} }, +{ {0,1,1,2,1,3,4,5, 176,0} }, +{ {0,1,1,2,2,0,0,0, 30,5} }, +{ {0,1,1,2,2,0,0,1, 57,2} }, +{ {0,1,1,2,2,0,0,2, 50,22} }, +{ {0,1,1,2,2,0,0,3, 120,12} }, +{ {0,1,1,2,2,0,1,0, 53,36} }, +{ {0,1,1,2,2,0,1,1, 30,25} }, +{ {0,1,1,2,2,0,1,2, 48,44} }, +{ {0,1,1,2,2,0,1,3, 111,26} }, +{ {0,1,1,2,2,0,2,0, 48,30} }, +{ {0,1,1,2,2,0,2,1, 50,29} }, +{ {0,1,1,2,2,0,2,2, 36,4} }, +{ {0,1,1,2,2,0,2,3, 104,47} }, +{ {0,1,1,2,2,0,3,0, 111,36} }, +{ {0,1,1,2,2,0,3,1, 120,15} }, +{ {0,1,1,2,2,0,3,2, 104,23} }, +{ {0,1,1,2,2,0,3,3, 114,5} }, +{ {0,1,1,2,2,0,3,4, 162,0} }, +{ {0,1,1,2,2,1,0,0, 53,25} }, +{ {0,1,1,2,2,1,0,1, 30,9} }, +{ {0,1,1,2,2,1,0,2, 48,9} }, +{ {0,1,1,2,2,1,0,3, 111,43} }, +{ {0,1,1,2,2,1,1,0, 52,9} }, +{ {0,1,1,2,2,1,1,1, 21,5} }, +{ {0,1,1,2,2,1,1,2, 45,22} }, +{ {0,1,1,2,2,1,1,3, 110,26} }, +{ {0,1,1,2,2,1,2,0, 53,8} }, +{ {0,1,1,2,2,1,2,1, 27,36} }, +{ {0,1,1,2,2,1,2,2, 23,24} }, +{ {0,1,1,2,2,1,2,3, 112,43} }, +{ {0,1,1,2,2,1,3,0, 107,43} }, +{ {0,1,1,2,2,1,3,1, 67,9} }, +{ {0,1,1,2,2,1,3,2, 92,9} }, +{ {0,1,1,2,2,1,3,3, 108,5} }, +{ {0,1,1,2,2,1,3,4, 147,43} }, +{ {0,1,1,2,2,2,0,0, 48,5} }, +{ {0,1,1,2,2,2,0,1, 50,3} }, +{ {0,1,1,2,2,2,0,2, 36,31} }, +{ {0,1,1,2,2,2,0,3, 104,2} }, +{ {0,1,1,2,2,2,1,0, 53,45} }, +{ {0,1,1,2,2,2,1,1, 27,25} }, +{ {0,1,1,2,2,2,1,2, 23,37} }, +{ {0,1,1,2,2,2,1,3, 112,26} }, +{ {0,1,1,2,2,2,2,0, 30,11} }, +{ {0,1,1,2,2,2,2,1, 38,11} }, +{ {0,1,1,2,2,2,2,2, 6,5} }, +{ {0,1,1,2,2,2,2,3, 85,11} }, +{ {0,1,1,2,2,2,3,0, 111,3} }, +{ {0,1,1,2,2,2,3,1, 102,3} }, +{ {0,1,1,2,2,2,3,2, 71,37} }, +{ {0,1,1,2,2,2,3,3, 91,5} }, +{ {0,1,1,2,2,2,3,4, 153,3} }, +{ {0,1,1,2,2,3,0,0, 111,25} }, +{ {0,1,1,2,2,3,0,1, 120,7} }, +{ {0,1,1,2,2,3,0,2, 104,38} }, +{ {0,1,1,2,2,3,0,3, 114,30} }, +{ {0,1,1,2,2,3,0,4, 162,19} }, +{ {0,1,1,2,2,3,1,0, 107,26} }, +{ {0,1,1,2,2,3,1,1, 67,44} }, +{ {0,1,1,2,2,3,1,2, 92,44} }, +{ {0,1,1,2,2,3,1,3, 108,30} }, +{ {0,1,1,2,2,3,1,4, 147,26} }, +{ {0,1,1,2,2,3,2,0, 111,46} }, +{ {0,1,1,2,2,3,2,1, 102,46} }, +{ {0,1,1,2,2,3,2,2, 71,24} }, +{ {0,1,1,2,2,3,2,3, 91,30} }, +{ {0,1,1,2,2,3,2,4, 153,46} }, +{ {0,1,1,2,2,3,3,0, 121,0} }, +{ {0,1,1,2,2,3,3,1, 120,23} }, +{ {0,1,1,2,2,3,3,2, 98,22} }, +{ {0,1,1,2,2,3,3,3, 66,5} }, +{ {0,1,1,2,2,3,3,4, 163,0} }, +{ {0,1,1,2,2,3,4,0, 164,0} }, +{ {0,1,1,2,2,3,4,1, 160,15} }, +{ {0,1,1,2,2,3,4,2, 142,23} }, +{ {0,1,1,2,2,3,4,3, 150,30} }, +{ {0,1,1,2,2,3,4,4, 150,5} }, +{ {0,1,1,2,2,3,4,5, 177,0} }, +{ {0,1,1,2,3,0,0,0, 85,5} }, +{ {0,1,1,2,3,0,0,1, 119,7} }, +{ {0,1,1,2,3,0,0,2, 99,23} }, +{ {0,1,1,2,3,0,0,3, 116,11} }, +{ {0,1,1,2,3,0,0,4, 159,12} }, +{ {0,1,1,2,3,0,1,0, 112,45} }, +{ {0,1,1,2,3,0,1,1, 85,25} }, +{ {0,1,1,2,3,0,1,2, 91,38} }, +{ {0,1,1,2,3,0,1,3, 104,27} }, +{ {0,1,1,2,3,0,1,4, 153,26} }, +{ {0,1,1,2,3,0,2,0, 104,37} }, +{ {0,1,1,2,3,0,2,1, 116,7} }, +{ {0,1,1,2,3,0,2,2, 78,39} }, +{ {0,1,1,2,3,0,2,3, 122,0} }, +{ {0,1,1,2,3,0,2,4, 165,0} }, +{ {0,1,1,2,3,0,3,0, 91,28} }, +{ {0,1,1,2,3,0,3,1, 99,28} }, +{ {0,1,1,2,3,0,3,2, 106,23} }, +{ {0,1,1,2,3,0,3,3, 78,29} }, +{ {0,1,1,2,3,0,3,4, 141,47} }, +{ {0,1,1,2,3,0,4,0, 153,36} }, +{ {0,1,1,2,3,0,4,1, 159,15} }, +{ {0,1,1,2,3,0,4,2, 141,23} }, +{ {0,1,1,2,3,0,4,3, 165,20} }, +{ {0,1,1,2,3,0,4,4, 156,24} }, +{ {0,1,1,2,3,0,4,5, 178,0} }, +{ {0,1,1,2,3,1,0,0, 112,8} }, +{ {0,1,1,2,3,1,0,1, 85,9} }, +{ {0,1,1,2,3,1,0,2, 91,23} }, +{ {0,1,1,2,3,1,0,3, 104,42} }, +{ {0,1,1,2,3,1,0,4, 153,43} }, +{ {0,1,1,2,3,1,1,0, 110,8} }, +{ {0,1,1,2,3,1,1,1, 70,5} }, +{ {0,1,1,2,3,1,1,2, 89,23} }, +{ {0,1,1,2,3,1,1,3, 101,27} }, +{ {0,1,1,2,3,1,1,4, 152,26} }, +{ {0,1,1,2,3,1,2,0, 111,8} }, +{ {0,1,1,2,3,1,2,1, 76,36} }, +{ {0,1,1,2,3,1,2,2, 65,39} }, +{ {0,1,1,2,3,1,2,3, 104,9} }, +{ {0,1,1,2,3,1,2,4, 153,8} }, +{ {0,1,1,2,3,1,3,0, 108,28} }, +{ {0,1,1,2,3,1,3,1, 81,36} }, +{ {0,1,1,2,3,1,3,2, 93,23} }, +{ {0,1,1,2,3,1,3,3, 68,29} }, +{ {0,1,1,2,3,1,3,4, 149,47} }, +{ {0,1,1,2,3,1,4,0, 147,8} }, +{ {0,1,1,2,3,1,4,1, 131,9} }, +{ {0,1,1,2,3,1,4,2, 135,23} }, +{ {0,1,1,2,3,1,4,3, 142,42} }, +{ {0,1,1,2,3,1,4,4, 149,24} }, +{ {0,1,1,2,3,1,4,5, 171,43} }, +{ {0,1,1,2,3,2,0,0, 104,24} }, +{ {0,1,1,2,3,2,0,1, 116,23} }, +{ {0,1,1,2,3,2,0,2, 78,22} }, +{ {0,1,1,2,3,2,0,3, 122,19} }, +{ {0,1,1,2,3,2,0,4, 165,19} }, +{ {0,1,1,2,3,2,1,0, 111,45} }, +{ {0,1,1,2,3,2,1,1, 76,25} }, +{ {0,1,1,2,3,2,1,2, 65,22} }, +{ {0,1,1,2,3,2,1,3, 104,44} }, +{ {0,1,1,2,3,2,1,4, 153,45} }, +{ {0,1,1,2,3,2,2,0, 120,22} }, +{ {0,1,1,2,3,2,2,1, 115,23} }, +{ {0,1,1,2,3,2,2,2, 61,22} }, +{ {0,1,1,2,3,2,2,3, 116,5} }, +{ {0,1,1,2,3,2,2,4, 159,22} }, +{ {0,1,1,2,3,2,3,0, 114,46} }, +{ {0,1,1,2,3,2,3,1, 105,29} }, +{ {0,1,1,2,3,2,3,2, 75,22} }, +{ {0,1,1,2,3,2,3,3, 78,4} }, +{ {0,1,1,2,3,2,3,4, 156,47} }, +{ {0,1,1,2,3,2,4,0, 162,35} }, +{ {0,1,1,2,3,2,4,1, 157,34} }, +{ {0,1,1,2,3,2,4,2, 128,22} }, +{ {0,1,1,2,3,2,4,3, 165,35} }, +{ {0,1,1,2,3,2,4,4, 141,24} }, +{ {0,1,1,2,3,2,4,5, 178,35} }, +{ {0,1,1,2,3,3,0,0, 91,11} }, +{ {0,1,1,2,3,3,0,1, 99,2} }, +{ {0,1,1,2,3,3,0,2, 106,38} }, +{ {0,1,1,2,3,3,0,3, 78,10} }, +{ {0,1,1,2,3,3,0,4, 141,2} }, +{ {0,1,1,2,3,3,1,0, 108,11} }, +{ {0,1,1,2,3,3,1,1, 81,25} }, +{ {0,1,1,2,3,3,1,2, 93,38} }, +{ {0,1,1,2,3,3,1,3, 68,10} }, +{ {0,1,1,2,3,3,1,4, 149,2} }, +{ {0,1,1,2,3,3,2,0, 114,3} }, +{ {0,1,1,2,3,3,2,1, 105,10} }, +{ {0,1,1,2,3,3,2,2, 75,39} }, +{ {0,1,1,2,3,3,2,3, 78,31} }, +{ {0,1,1,2,3,3,2,4, 156,2} }, +{ {0,1,1,2,3,3,3,0, 66,11} }, +{ {0,1,1,2,3,3,3,1, 74,11} }, +{ {0,1,1,2,3,3,3,2, 86,11} }, +{ {0,1,1,2,3,3,3,3, 60,11} }, +{ {0,1,1,2,3,3,3,4, 130,11} }, +{ {0,1,1,2,3,3,4,0, 150,11} }, +{ {0,1,1,2,3,3,4,1, 143,3} }, +{ {0,1,1,2,3,3,4,2, 144,23} }, +{ {0,1,1,2,3,3,4,3, 133,10} }, +{ {0,1,1,2,3,3,4,4, 138,11} }, +{ {0,1,1,2,3,3,4,5, 173,2} }, +{ {0,1,1,2,3,4,0,0, 153,25} }, +{ {0,1,1,2,3,4,0,1, 159,7} }, +{ {0,1,1,2,3,4,0,2, 141,38} }, +{ {0,1,1,2,3,4,0,3, 165,41} }, +{ {0,1,1,2,3,4,0,4, 156,37} }, +{ {0,1,1,2,3,4,0,5, 178,19} }, +{ {0,1,1,2,3,4,1,0, 147,45} }, +{ {0,1,1,2,3,4,1,1, 131,44} }, +{ {0,1,1,2,3,4,1,2, 135,38} }, +{ {0,1,1,2,3,4,1,3, 142,27} }, +{ {0,1,1,2,3,4,1,4, 149,37} }, +{ {0,1,1,2,3,4,1,5, 171,26} }, +{ {0,1,1,2,3,4,2,0, 162,6} }, +{ {0,1,1,2,3,4,2,1, 157,7} }, +{ {0,1,1,2,3,4,2,2, 128,39} }, +{ {0,1,1,2,3,4,2,3, 165,6} }, +{ {0,1,1,2,3,4,2,4, 141,37} }, +{ {0,1,1,2,3,4,2,5, 178,6} }, +{ {0,1,1,2,3,4,3,0, 150,28} }, +{ {0,1,1,2,3,4,3,1, 143,46} }, +{ {0,1,1,2,3,4,3,2, 144,38} }, +{ {0,1,1,2,3,4,3,3, 133,29} }, +{ {0,1,1,2,3,4,3,4, 138,28} }, +{ {0,1,1,2,3,4,3,5, 173,47} }, +{ {0,1,1,2,3,4,4,0, 163,15} }, +{ {0,1,1,2,3,4,4,1, 159,23} }, +{ {0,1,1,2,3,4,4,2, 139,23} }, +{ {0,1,1,2,3,4,4,3, 158,11} }, +{ {0,1,1,2,3,4,4,4, 130,5} }, +{ {0,1,1,2,3,4,4,5, 179,0} }, +{ {0,1,1,2,3,4,5,0, 177,15} }, +{ {0,1,1,2,3,4,5,1, 176,15} }, +{ {0,1,1,2,3,4,5,2, 169,23} }, +{ {0,1,1,2,3,4,5,3, 180,0} }, +{ {0,1,1,2,3,4,5,4, 173,37} }, +{ {0,1,1,2,3,4,5,5, 173,24} }, +{ {0,1,1,2,3,4,5,6, 183,0} }, +{ {0,1,2,0,0,0,0,0, 7,11} }, +{ {0,1,2,0,0,0,0,1, 16,2} }, +{ {0,1,2,0,0,0,0,2, 16,28} }, +{ {0,1,2,0,0,0,0,3, 62,33} }, +{ {0,1,2,0,0,0,1,0, 21,10} }, +{ {0,1,2,0,0,0,1,1, 27,2} }, +{ {0,1,2,0,0,0,1,2, 30,2} }, +{ {0,1,2,0,0,0,1,3, 67,33} }, +{ {0,1,2,0,0,0,2,0, 34,10} }, +{ {0,1,2,0,0,0,2,1, 40,2} }, +{ {0,1,2,0,0,0,2,2, 26,25} }, +{ {0,1,2,0,0,0,2,3, 81,33} }, +{ {0,1,2,0,0,0,3,0, 70,10} }, +{ {0,1,2,0,0,0,3,1, 76,2} }, +{ {0,1,2,0,0,0,3,2, 85,2} }, +{ {0,1,2,0,0,0,3,3, 81,2} }, +{ {0,1,2,0,0,0,3,4, 131,33} }, +{ {0,1,2,0,0,1,0,0, 34,4} }, +{ {0,1,2,0,0,1,0,1, 26,9} }, +{ {0,1,2,0,0,1,0,2, 40,47} }, +{ {0,1,2,0,0,1,0,3, 81,12} }, +{ {0,1,2,0,0,1,1,0, 45,9} }, +{ {0,1,2,0,0,1,1,1, 23,36} }, +{ {0,1,2,0,0,1,1,2, 48,33} }, +{ {0,1,2,0,0,1,1,3, 92,33} }, +{ {0,1,2,0,0,1,2,0, 46,9} }, +{ {0,1,2,0,0,1,2,1, 29,9} }, +{ {0,1,2,0,0,1,2,2, 29,44} }, +{ {0,1,2,0,0,1,2,3, 94,43} }, +{ {0,1,2,0,0,1,3,0, 89,8} }, +{ {0,1,2,0,0,1,3,1, 65,9} }, +{ {0,1,2,0,0,1,3,2, 91,43} }, +{ {0,1,2,0,0,1,3,3, 93,43} }, +{ {0,1,2,0,0,1,3,4, 135,43} }, +{ {0,1,2,0,0,2,0,0, 21,4} }, +{ {0,1,2,0,0,2,0,1, 30,12} }, +{ {0,1,2,0,0,2,0,2, 27,47} }, +{ {0,1,2,0,0,2,0,3, 67,12} }, +{ {0,1,2,0,0,2,1,0, 52,12} }, +{ {0,1,2,0,0,2,1,1, 53,32} }, +{ {0,1,2,0,0,2,1,2, 53,13} }, +{ {0,1,2,0,0,2,1,3, 107,32} }, +{ {0,1,2,0,0,2,2,0, 45,27} }, +{ {0,1,2,0,0,2,2,1, 48,12} }, +{ {0,1,2,0,0,2,2,2, 23,25} }, +{ {0,1,2,0,0,2,2,3, 92,12} }, +{ {0,1,2,0,0,2,3,0, 110,23} }, +{ {0,1,2,0,0,2,3,1, 111,32} }, +{ {0,1,2,0,0,2,3,2, 112,32} }, +{ {0,1,2,0,0,2,3,3, 108,4} }, +{ {0,1,2,0,0,2,3,4, 147,32} }, +{ {0,1,2,0,0,3,0,0, 70,4} }, +{ {0,1,2,0,0,3,0,1, 85,12} }, +{ {0,1,2,0,0,3,0,2, 76,47} }, +{ {0,1,2,0,0,3,0,3, 81,47} }, +{ {0,1,2,0,0,3,0,4, 131,12} }, +{ {0,1,2,0,0,3,1,0, 110,13} }, +{ {0,1,2,0,0,3,1,1, 112,13} }, +{ {0,1,2,0,0,3,1,2, 111,13} }, +{ {0,1,2,0,0,3,1,3, 108,31} }, +{ {0,1,2,0,0,3,1,4, 147,13} }, +{ {0,1,2,0,0,3,2,0, 89,26} }, +{ {0,1,2,0,0,3,2,1, 91,26} }, +{ {0,1,2,0,0,3,2,2, 65,44} }, +{ {0,1,2,0,0,3,2,3, 93,26} }, +{ {0,1,2,0,0,3,2,4, 135,26} }, +{ {0,1,2,0,0,3,3,0, 101,22} }, +{ {0,1,2,0,0,3,3,1, 104,33} }, +{ {0,1,2,0,0,3,3,2, 104,12} }, +{ {0,1,2,0,0,3,3,3, 68,30} }, +{ {0,1,2,0,0,3,3,4, 142,33} }, +{ {0,1,2,0,0,3,4,0, 152,23} }, +{ {0,1,2,0,0,3,4,1, 153,32} }, +{ {0,1,2,0,0,3,4,2, 153,13} }, +{ {0,1,2,0,0,3,4,3, 149,36} }, +{ {0,1,2,0,0,3,4,4, 149,25} }, +{ {0,1,2,0,0,3,4,5, 171,32} }, +{ {0,1,2,0,1,0,0,0, 16,30} }, +{ {0,1,2,0,1,0,0,1, 55,3} }, +{ {0,1,2,0,1,0,0,2, 56,2} }, +{ {0,1,2,0,1,0,0,3, 117,20} }, +{ {0,1,2,0,1,0,1,0, 27,37} }, +{ {0,1,2,0,1,0,1,1, 38,4} }, +{ {0,1,2,0,1,0,1,2, 50,28} }, +{ {0,1,2,0,1,0,1,3, 102,47} }, +{ {0,1,2,0,1,0,2,0, 40,37} }, +{ {0,1,2,0,1,0,2,1, 51,26} }, +{ {0,1,2,0,1,0,2,2, 39,25} }, +{ {0,1,2,0,1,0,2,3, 105,26} }, +{ {0,1,2,0,1,0,3,0, 76,37} }, +{ {0,1,2,0,1,0,3,1, 115,8} }, +{ {0,1,2,0,1,0,3,2, 116,20} }, +{ {0,1,2,0,1,0,3,3, 105,5} }, +{ {0,1,2,0,1,0,3,4, 157,20} }, +{ {0,1,2,0,1,1,0,0, 26,3} }, +{ {0,1,2,0,1,1,0,1, 15,3} }, +{ {0,1,2,0,1,1,0,2, 39,3} }, +{ {0,1,2,0,1,1,0,3, 74,3} }, +{ {0,1,2,0,1,1,1,0, 23,3} }, +{ {0,1,2,0,1,1,1,1, 6,10} }, +{ {0,1,2,0,1,1,1,2, 36,3} }, +{ {0,1,2,0,1,1,1,3, 71,3} }, +{ {0,1,2,0,1,1,2,0, 29,42} }, +{ {0,1,2,0,1,1,2,1, 18,9} }, +{ {0,1,2,0,1,1,2,2, 42,42} }, +{ {0,1,2,0,1,1,2,3, 79,42} }, +{ {0,1,2,0,1,1,3,0, 65,42} }, +{ {0,1,2,0,1,1,3,1, 61,9} }, +{ {0,1,2,0,1,1,3,2, 78,42} }, +{ {0,1,2,0,1,1,3,3, 75,42} }, +{ {0,1,2,0,1,1,3,4, 128,42} }, +{ {0,1,2,0,1,2,0,0, 30,24} }, +{ {0,1,2,0,1,2,0,1, 57,6} }, +{ {0,1,2,0,1,2,0,2, 50,30} }, +{ {0,1,2,0,1,2,0,3, 120,18} }, +{ {0,1,2,0,1,2,1,0, 53,23} }, +{ {0,1,2,0,1,2,1,1, 30,4} }, +{ {0,1,2,0,1,2,1,2, 48,29} }, +{ {0,1,2,0,1,2,1,3, 111,47} }, +{ {0,1,2,0,1,2,2,0, 48,39} }, +{ {0,1,2,0,1,2,2,1, 50,27} }, +{ {0,1,2,0,1,2,2,2, 36,25} }, +{ {0,1,2,0,1,2,2,3, 104,26} }, +{ {0,1,2,0,1,2,3,0, 111,23} }, +{ {0,1,2,0,1,2,3,1, 120,9} }, +{ {0,1,2,0,1,2,3,2, 104,36} }, +{ {0,1,2,0,1,2,3,3, 114,24} }, +{ {0,1,2,0,1,2,3,4, 162,21} }, +{ {0,1,2,0,1,3,0,0, 85,24} }, +{ {0,1,2,0,1,3,0,1, 119,6} }, +{ {0,1,2,0,1,3,0,2, 116,6} }, +{ {0,1,2,0,1,3,0,3, 99,31} }, +{ {0,1,2,0,1,3,0,4, 159,18} }, +{ {0,1,2,0,1,3,1,0, 112,38} }, +{ {0,1,2,0,1,3,1,1, 85,4} }, +{ {0,1,2,0,1,3,1,2, 104,46} }, +{ {0,1,2,0,1,3,1,3, 91,31} }, +{ {0,1,2,0,1,3,1,4, 153,47} }, +{ {0,1,2,0,1,3,2,0, 91,45} }, +{ {0,1,2,0,1,3,2,1, 99,26} }, +{ {0,1,2,0,1,3,2,2, 78,44} }, +{ {0,1,2,0,1,3,2,3, 106,26} }, +{ {0,1,2,0,1,3,2,4, 141,26} }, +{ {0,1,2,0,1,3,3,0, 104,22} }, +{ {0,1,2,0,1,3,3,1, 116,10} }, +{ {0,1,2,0,1,3,3,2, 122,1} }, +{ {0,1,2,0,1,3,3,3, 78,30} }, +{ {0,1,2,0,1,3,3,4, 165,21} }, +{ {0,1,2,0,1,3,4,0, 153,23} }, +{ {0,1,2,0,1,3,4,1, 159,9} }, +{ {0,1,2,0,1,3,4,2, 165,1} }, +{ {0,1,2,0,1,3,4,3, 141,36} }, +{ {0,1,2,0,1,3,4,4, 156,25} }, +{ {0,1,2,0,1,3,4,5, 178,21} }, +{ {0,1,2,0,2,0,0,0, 16,5} }, +{ {0,1,2,0,2,0,0,1, 56,8} }, +{ {0,1,2,0,2,0,0,2, 55,4} }, +{ {0,1,2,0,2,0,0,3, 117,12} }, +{ {0,1,2,0,2,0,1,0, 30,22} }, +{ {0,1,2,0,2,0,1,1, 50,5} }, +{ {0,1,2,0,2,0,1,2, 57,1} }, +{ {0,1,2,0,2,0,1,3, 120,1} }, +{ {0,1,2,0,2,0,2,0, 26,27} }, +{ {0,1,2,0,2,0,2,1, 39,27} }, +{ {0,1,2,0,2,0,2,2, 15,4} }, +{ {0,1,2,0,2,0,2,3, 74,27} }, +{ {0,1,2,0,2,0,3,0, 85,22} }, +{ {0,1,2,0,2,0,3,1, 116,8} }, +{ {0,1,2,0,2,0,3,2, 119,1} }, +{ {0,1,2,0,2,0,3,3, 99,4} }, +{ {0,1,2,0,2,0,3,4, 159,1} }, +{ {0,1,2,0,2,1,0,0, 40,24} }, +{ {0,1,2,0,2,1,0,1, 39,9} }, +{ {0,1,2,0,2,1,0,2, 51,8} }, +{ {0,1,2,0,2,1,0,3, 105,43} }, +{ {0,1,2,0,2,1,1,0, 48,22} }, +{ {0,1,2,0,2,1,1,1, 36,36} }, +{ {0,1,2,0,2,1,1,2, 50,9} }, +{ {0,1,2,0,2,1,1,3, 104,43} }, +{ {0,1,2,0,2,1,2,0, 29,27} }, +{ {0,1,2,0,2,1,2,1, 42,9} }, +{ {0,1,2,0,2,1,2,2, 18,27} }, +{ {0,1,2,0,2,1,2,3, 79,27} }, +{ {0,1,2,0,2,1,3,0, 91,8} }, +{ {0,1,2,0,2,1,3,1, 78,9} }, +{ {0,1,2,0,2,1,3,2, 99,8} }, +{ {0,1,2,0,2,1,3,3, 106,43} }, +{ {0,1,2,0,2,1,3,4, 141,43} }, +{ {0,1,2,0,2,2,0,0, 27,24} }, +{ {0,1,2,0,2,2,0,1, 50,2} }, +{ {0,1,2,0,2,2,0,2, 38,10} }, +{ {0,1,2,0,2,2,0,3, 102,2} }, +{ {0,1,2,0,2,2,1,0, 53,38} }, +{ {0,1,2,0,2,2,1,1, 48,4} }, +{ {0,1,2,0,2,2,1,2, 30,10} }, +{ {0,1,2,0,2,2,1,3, 111,2} }, +{ {0,1,2,0,2,2,2,0, 23,46} }, +{ {0,1,2,0,2,2,2,1, 36,46} }, +{ {0,1,2,0,2,2,2,2, 6,4} }, +{ {0,1,2,0,2,2,2,3, 71,46} }, +{ {0,1,2,0,2,2,3,0, 112,23} }, +{ {0,1,2,0,2,2,3,1, 104,3} }, +{ {0,1,2,0,2,2,3,2, 85,10} }, +{ {0,1,2,0,2,2,3,3, 91,4} }, +{ {0,1,2,0,2,2,3,4, 153,2} }, +{ {0,1,2,0,2,3,0,0, 76,24} }, +{ {0,1,2,0,2,3,0,1, 116,26} }, +{ {0,1,2,0,2,3,0,2, 115,26} }, +{ {0,1,2,0,2,3,0,3, 105,30} }, +{ {0,1,2,0,2,3,0,4, 157,41} }, +{ {0,1,2,0,2,3,1,0, 111,38} }, +{ {0,1,2,0,2,3,1,1, 104,25} }, +{ {0,1,2,0,2,3,1,2, 120,27} }, +{ {0,1,2,0,2,3,1,3, 114,37} }, +{ {0,1,2,0,2,3,1,4, 162,40} }, +{ {0,1,2,0,2,3,2,0, 65,27} }, +{ {0,1,2,0,2,3,2,1, 78,27} }, +{ {0,1,2,0,2,3,2,2, 61,27} }, +{ {0,1,2,0,2,3,2,3, 75,27} }, +{ {0,1,2,0,2,3,2,4, 128,27} }, +{ {0,1,2,0,2,3,3,0, 104,39} }, +{ {0,1,2,0,2,3,3,1, 122,14} }, +{ {0,1,2,0,2,3,3,2, 116,4} }, +{ {0,1,2,0,2,3,3,3, 78,5} }, +{ {0,1,2,0,2,3,3,4, 165,40} }, +{ {0,1,2,0,2,3,4,0, 153,38} }, +{ {0,1,2,0,2,3,4,1, 165,14} }, +{ {0,1,2,0,2,3,4,2, 159,27} }, +{ {0,1,2,0,2,3,4,3, 156,36} }, +{ {0,1,2,0,2,3,4,4, 141,25} }, +{ {0,1,2,0,2,3,4,5, 178,40} }, +{ {0,1,2,0,3,0,0,0, 62,22} }, +{ {0,1,2,0,3,0,0,1, 117,22} }, +{ {0,1,2,0,3,0,0,2, 117,6} }, +{ {0,1,2,0,3,0,0,3, 117,11} }, +{ {0,1,2,0,3,0,0,4, 161,1} }, +{ {0,1,2,0,3,0,1,0, 67,22} }, +{ {0,1,2,0,3,0,1,1, 102,24} }, +{ {0,1,2,0,3,0,1,2, 120,14} }, +{ {0,1,2,0,3,0,1,3, 120,8} }, +{ {0,1,2,0,3,0,1,4, 160,1} }, +{ {0,1,2,0,3,0,2,0, 81,22} }, +{ {0,1,2,0,3,0,2,1, 105,45} }, +{ {0,1,2,0,3,0,2,2, 74,25} }, +{ {0,1,2,0,3,0,2,3, 99,27} }, +{ {0,1,2,0,3,0,2,4, 143,26} }, +{ {0,1,2,0,3,0,3,0, 81,37} }, +{ {0,1,2,0,3,0,3,1, 105,28} }, +{ {0,1,2,0,3,0,3,2, 99,29} }, +{ {0,1,2,0,3,0,3,3, 74,4} }, +{ {0,1,2,0,3,0,3,4, 143,47} }, +{ {0,1,2,0,3,0,4,0, 131,22} }, +{ {0,1,2,0,3,0,4,1, 157,35} }, +{ {0,1,2,0,3,0,4,2, 159,14} }, +{ {0,1,2,0,3,0,4,3, 159,8} }, +{ {0,1,2,0,3,0,4,4, 143,24} }, +{ {0,1,2,0,3,0,4,5, 176,1} }, +{ {0,1,2,0,3,1,0,0, 81,39} }, +{ {0,1,2,0,3,1,0,1, 74,9} }, +{ {0,1,2,0,3,1,0,2, 105,8} }, +{ {0,1,2,0,3,1,0,3, 99,9} }, +{ {0,1,2,0,3,1,0,4, 143,43} }, +{ {0,1,2,0,3,1,1,0, 92,22} }, +{ {0,1,2,0,3,1,1,1, 71,36} }, +{ {0,1,2,0,3,1,1,2, 104,8} }, +{ {0,1,2,0,3,1,1,3, 98,9} }, +{ {0,1,2,0,3,1,1,4, 142,43} }, +{ {0,1,2,0,3,1,2,0, 94,8} }, +{ {0,1,2,0,3,1,2,1, 79,9} }, +{ {0,1,2,0,3,1,2,2, 79,44} }, +{ {0,1,2,0,3,1,2,3, 100,8} }, +{ {0,1,2,0,3,1,2,4, 145,43} }, +{ {0,1,2,0,3,1,3,0, 93,8} }, +{ {0,1,2,0,3,1,3,1, 75,9} }, +{ {0,1,2,0,3,1,3,2, 106,8} }, +{ {0,1,2,0,3,1,3,3, 86,4} }, +{ {0,1,2,0,3,1,3,4, 144,43} }, +{ {0,1,2,0,3,1,4,0, 135,8} }, +{ {0,1,2,0,3,1,4,1, 128,9} }, +{ {0,1,2,0,3,1,4,2, 141,8} }, +{ {0,1,2,0,3,1,4,3, 139,8} }, +{ {0,1,2,0,3,1,4,4, 144,8} }, +{ {0,1,2,0,3,1,4,5, 169,43} }, +{ {0,1,2,0,3,2,0,0, 67,39} }, +{ {0,1,2,0,3,2,0,1, 120,6} }, +{ {0,1,2,0,3,2,0,2, 102,37} }, +{ {0,1,2,0,3,2,0,3, 120,26} }, +{ {0,1,2,0,3,2,0,4, 160,18} }, +{ {0,1,2,0,3,2,1,0, 107,23} }, +{ {0,1,2,0,3,2,1,1, 111,24} }, +{ {0,1,2,0,3,2,1,2, 111,37} }, +{ {0,1,2,0,3,2,1,3, 121,1} }, +{ {0,1,2,0,3,2,1,4, 164,1} }, +{ {0,1,2,0,3,2,2,0, 92,39} }, +{ {0,1,2,0,3,2,2,1, 104,45} }, +{ {0,1,2,0,3,2,2,2, 71,25} }, +{ {0,1,2,0,3,2,2,3, 98,27} }, +{ {0,1,2,0,3,2,2,4, 142,26} }, +{ {0,1,2,0,3,2,3,0, 108,29} }, +{ {0,1,2,0,3,2,3,1, 114,47} }, +{ {0,1,2,0,3,2,3,2, 91,29} }, +{ {0,1,2,0,3,2,3,3, 66,4} }, +{ {0,1,2,0,3,2,3,4, 150,29} }, +{ {0,1,2,0,3,2,4,0, 147,23} }, +{ {0,1,2,0,3,2,4,1, 162,14} }, +{ {0,1,2,0,3,2,4,2, 153,37} }, +{ {0,1,2,0,3,2,4,3, 163,1} }, +{ {0,1,2,0,3,2,4,4, 150,4} }, +{ {0,1,2,0,3,2,4,5, 177,1} }, +{ {0,1,2,0,3,3,0,0, 81,24} }, +{ {0,1,2,0,3,3,0,1, 99,3} }, +{ {0,1,2,0,3,3,0,2, 105,11} }, +{ {0,1,2,0,3,3,0,3, 74,10} }, +{ {0,1,2,0,3,3,0,4, 143,2} }, +{ {0,1,2,0,3,3,1,0, 108,10} }, +{ {0,1,2,0,3,3,1,1, 91,10} }, +{ {0,1,2,0,3,3,1,2, 114,2} }, +{ {0,1,2,0,3,3,1,3, 66,10} }, +{ {0,1,2,0,3,3,1,4, 150,10} }, +{ {0,1,2,0,3,3,2,0, 93,45} }, +{ {0,1,2,0,3,3,2,1, 106,45} }, +{ {0,1,2,0,3,3,2,2, 75,44} }, +{ {0,1,2,0,3,3,2,3, 86,10} }, +{ {0,1,2,0,3,3,2,4, 144,26} }, +{ {0,1,2,0,3,3,3,0, 68,11} }, +{ {0,1,2,0,3,3,3,1, 78,11} }, +{ {0,1,2,0,3,3,3,2, 78,28} }, +{ {0,1,2,0,3,3,3,3, 60,10} }, +{ {0,1,2,0,3,3,3,4, 133,11} }, +{ {0,1,2,0,3,3,4,0, 149,3} }, +{ {0,1,2,0,3,3,4,1, 141,3} }, +{ {0,1,2,0,3,3,4,2, 156,3} }, +{ {0,1,2,0,3,3,4,3, 130,10} }, +{ {0,1,2,0,3,3,4,4, 138,10} }, +{ {0,1,2,0,3,3,4,5, 173,3} }, +{ {0,1,2,0,3,4,0,0, 131,39} }, +{ {0,1,2,0,3,4,0,1, 159,6} }, +{ {0,1,2,0,3,4,0,2, 157,6} }, +{ {0,1,2,0,3,4,0,3, 159,26} }, +{ {0,1,2,0,3,4,0,4, 143,37} }, +{ {0,1,2,0,3,4,0,5, 176,18} }, +{ {0,1,2,0,3,4,1,0, 147,38} }, +{ {0,1,2,0,3,4,1,1, 153,24} }, +{ {0,1,2,0,3,4,1,2, 162,17} }, +{ {0,1,2,0,3,4,1,3, 163,18} }, +{ {0,1,2,0,3,4,1,4, 150,31} }, +{ {0,1,2,0,3,4,1,5, 177,18} }, +{ {0,1,2,0,3,4,2,0, 135,45} }, +{ {0,1,2,0,3,4,2,1, 141,45} }, +{ {0,1,2,0,3,4,2,2, 128,44} }, +{ {0,1,2,0,3,4,2,3, 139,26} }, +{ {0,1,2,0,3,4,2,4, 144,45} }, +{ {0,1,2,0,3,4,2,5, 169,26} }, +{ {0,1,2,0,3,4,3,0, 149,46} }, +{ {0,1,2,0,3,4,3,1, 156,46} }, +{ {0,1,2,0,3,4,3,2, 141,46} }, +{ {0,1,2,0,3,4,3,3, 130,4} }, +{ {0,1,2,0,3,4,3,4, 138,29} }, +{ {0,1,2,0,3,4,3,5, 173,46} }, +{ {0,1,2,0,3,4,4,0, 142,22} }, +{ {0,1,2,0,3,4,4,1, 165,34} }, +{ {0,1,2,0,3,4,4,2, 165,7} }, +{ {0,1,2,0,3,4,4,3, 158,10} }, +{ {0,1,2,0,3,4,4,4, 133,30} }, +{ {0,1,2,0,3,4,4,5, 180,1} }, +{ {0,1,2,0,3,4,5,0, 171,23} }, +{ {0,1,2,0,3,4,5,1, 178,34} }, +{ {0,1,2,0,3,4,5,2, 178,7} }, +{ {0,1,2,0,3,4,5,3, 179,1} }, +{ {0,1,2,0,3,4,5,4, 173,36} }, +{ {0,1,2,0,3,4,5,5, 173,25} }, +{ {0,1,2,0,3,4,5,6, 183,1} }, +{ {0,1,2,1,0,0,0,0, 8,11} }, +{ {0,1,2,1,0,0,0,1, 17,2} }, +{ {0,1,2,1,0,0,0,2, 18,28} }, +{ {0,1,2,1,0,0,0,3, 63,33} }, +{ {0,1,2,1,0,0,1,0, 23,10} }, +{ {0,1,2,1,0,0,1,1, 28,2} }, +{ {0,1,2,1,0,0,1,2, 31,2} }, +{ {0,1,2,1,0,0,1,3, 68,33} }, +{ {0,1,2,1,0,0,2,0, 37,2} }, +{ {0,1,2,1,0,0,2,1, 41,2} }, +{ {0,1,2,1,0,0,2,2, 43,2} }, +{ {0,1,2,1,0,0,2,3, 82,33} }, +{ {0,1,2,1,0,0,3,0, 72,10} }, +{ {0,1,2,1,0,0,3,1, 77,34} }, +{ {0,1,2,1,0,0,3,2, 86,2} }, +{ {0,1,2,1,0,0,3,3, 82,2} }, +{ {0,1,2,1,0,0,3,4, 132,33} }, +{ {0,1,2,1,0,1,0,0, 28,8} }, +{ {0,1,2,1,0,1,0,1, 10,9} }, +{ {0,1,2,1,0,1,0,2, 42,47} }, +{ {0,1,2,1,0,1,0,3, 83,12} }, +{ {0,1,2,1,0,1,1,0, 27,8} }, +{ {0,1,2,1,0,1,1,1, 8,37} }, +{ {0,1,2,1,0,1,1,2, 40,35} }, +{ {0,1,2,1,0,1,1,3, 81,8} }, +{ {0,1,2,1,0,1,2,0, 29,8} }, +{ {0,1,2,1,0,1,2,1, 11,9} }, +{ {0,1,2,1,0,1,2,2, 41,35} }, +{ {0,1,2,1,0,1,2,3, 84,8} }, +{ {0,1,2,1,0,1,3,0, 65,8} }, +{ {0,1,2,1,0,1,3,1, 59,8} }, +{ {0,1,2,1,0,1,3,2, 75,35} }, +{ {0,1,2,1,0,1,3,3, 82,8} }, +{ {0,1,2,1,0,1,3,4, 129,8} }, +{ {0,1,2,1,0,2,0,0, 24,29} }, +{ {0,1,2,1,0,2,0,1, 32,12} }, +{ {0,1,2,1,0,2,0,2, 29,47} }, +{ {0,1,2,1,0,2,0,3, 69,12} }, +{ {0,1,2,1,0,2,1,0, 53,12} }, +{ {0,1,2,1,0,2,1,1, 24,23} }, +{ {0,1,2,1,0,2,1,2, 47,34} }, +{ {0,1,2,1,0,2,1,3, 108,32} }, +{ {0,1,2,1,0,2,2,0, 47,12} }, +{ {0,1,2,1,0,2,2,1, 29,23} }, +{ {0,1,2,1,0,2,2,2, 37,5} }, +{ {0,1,2,1,0,2,2,3, 93,12} }, +{ {0,1,2,1,0,2,3,0, 108,14} }, +{ {0,1,2,1,0,2,3,1, 69,34} }, +{ {0,1,2,1,0,2,3,2, 93,34} }, +{ {0,1,2,1,0,2,3,3, 113,32} }, +{ {0,1,2,1,0,2,3,4, 148,32} }, +{ {0,1,2,1,0,3,0,0, 73,47} }, +{ {0,1,2,1,0,3,0,1, 88,12} }, +{ {0,1,2,1,0,3,0,2, 79,47} }, +{ {0,1,2,1,0,3,0,3, 84,47} }, +{ {0,1,2,1,0,3,0,4, 134,12} }, +{ {0,1,2,1,0,3,1,0, 112,15} }, +{ {0,1,2,1,0,3,1,1, 73,39} }, +{ {0,1,2,1,0,3,1,2, 103,15} }, +{ {0,1,2,1,0,3,1,3, 93,37} }, +{ {0,1,2,1,0,3,1,4, 149,13} }, +{ {0,1,2,1,0,3,2,0, 93,27} }, +{ {0,1,2,1,0,3,2,1, 84,23} }, +{ {0,1,2,1,0,3,2,2, 82,44} }, +{ {0,1,2,1,0,3,2,3, 96,13} }, +{ {0,1,2,1,0,3,2,4, 137,13} }, +{ {0,1,2,1,0,3,3,0, 103,33} }, +{ {0,1,2,1,0,3,3,1, 79,23} }, +{ {0,1,2,1,0,3,3,2, 106,34} }, +{ {0,1,2,1,0,3,3,3, 82,30} }, +{ {0,1,2,1,0,3,3,4, 144,33} }, +{ {0,1,2,1,0,3,4,0, 149,35} }, +{ {0,1,2,1,0,3,4,1, 134,34} }, +{ {0,1,2,1,0,3,4,2, 144,15} }, +{ {0,1,2,1,0,3,4,3, 137,35} }, +{ {0,1,2,1,0,3,4,4, 154,14} }, +{ {0,1,2,1,0,3,4,5, 172,32} }, +{ {0,1,2,1,1,0,0,0, 27,30} }, +{ {0,1,2,1,1,0,0,1, 38,23} }, +{ {0,1,2,1,1,0,0,2, 50,14} }, +{ {0,1,2,1,1,0,0,3, 102,14} }, +{ {0,1,2,1,1,0,1,0, 45,31} }, +{ {0,1,2,1,1,0,1,1, 35,24} }, +{ {0,1,2,1,1,0,1,2, 49,14} }, +{ {0,1,2,1,1,0,1,3, 101,14} }, +{ {0,1,2,1,1,0,2,0, 47,36} }, +{ {0,1,2,1,1,0,2,1, 40,34} }, +{ {0,1,2,1,1,0,2,2, 31,25} }, +{ {0,1,2,1,1,0,2,3, 103,14} }, +{ {0,1,2,1,1,0,3,0, 90,35} }, +{ {0,1,2,1,1,0,3,1, 76,34} }, +{ {0,1,2,1,1,0,3,2, 98,14} }, +{ {0,1,2,1,1,0,3,3, 103,35} }, +{ {0,1,2,1,1,0,3,4, 140,14} }, +{ {0,1,2,1,1,1,0,0, 23,42} }, +{ {0,1,2,1,1,1,0,1, 6,9} }, +{ {0,1,2,1,1,1,0,2, 36,42} }, +{ {0,1,2,1,1,1,0,3, 71,42} }, +{ {0,1,2,1,1,1,1,0, 21,3} }, +{ {0,1,2,1,1,1,1,1, 3,31} }, +{ {0,1,2,1,1,1,1,2, 35,3} }, +{ {0,1,2,1,1,1,1,3, 70,3} }, +{ {0,1,2,1,1,1,2,0, 24,8} }, +{ {0,1,2,1,1,1,2,1, 8,36} }, +{ {0,1,2,1,1,1,2,2, 28,25} }, +{ {0,1,2,1,1,1,2,3, 73,42} }, +{ {0,1,2,1,1,1,3,0, 64,8} }, +{ {0,1,2,1,1,1,3,1, 58,9} }, +{ {0,1,2,1,1,1,3,2, 71,8} }, +{ {0,1,2,1,1,1,3,3, 72,42} }, +{ {0,1,2,1,1,1,3,4, 127,42} }, +{ {0,1,2,1,1,2,0,0, 53,4} }, +{ {0,1,2,1,1,2,0,1, 30,23} }, +{ {0,1,2,1,1,2,0,2, 48,34} }, +{ {0,1,2,1,1,2,0,3, 111,14} }, +{ {0,1,2,1,1,2,1,0, 52,14} }, +{ {0,1,2,1,1,2,1,1, 21,24} }, +{ {0,1,2,1,1,2,1,2, 45,30} }, +{ {0,1,2,1,1,2,1,3, 110,14} }, +{ {0,1,2,1,1,2,2,0, 53,35} }, +{ {0,1,2,1,1,2,2,1, 27,23} }, +{ {0,1,2,1,1,2,2,2, 23,5} }, +{ {0,1,2,1,1,2,2,3, 112,14} }, +{ {0,1,2,1,1,2,3,0, 107,14} }, +{ {0,1,2,1,1,2,3,1, 67,34} }, +{ {0,1,2,1,1,2,3,2, 92,34} }, +{ {0,1,2,1,1,2,3,3, 108,24} }, +{ {0,1,2,1,1,2,3,4, 147,14} }, +{ {0,1,2,1,1,3,0,0, 112,25} }, +{ {0,1,2,1,1,3,0,1, 85,23} }, +{ {0,1,2,1,1,3,0,2, 104,15} }, +{ {0,1,2,1,1,3,0,3, 91,36} }, +{ {0,1,2,1,1,3,0,4, 153,14} }, +{ {0,1,2,1,1,3,1,0, 110,15} }, +{ {0,1,2,1,1,3,1,1, 70,24} }, +{ {0,1,2,1,1,3,1,2, 101,15} }, +{ {0,1,2,1,1,3,1,3, 89,31} }, +{ {0,1,2,1,1,3,1,4, 152,14} }, +{ {0,1,2,1,1,3,2,0, 108,45} }, +{ {0,1,2,1,1,3,2,1, 81,23} }, +{ {0,1,2,1,1,3,2,2, 68,44} }, +{ {0,1,2,1,1,3,2,3, 93,36} }, +{ {0,1,2,1,1,3,2,4, 149,26} }, +{ {0,1,2,1,1,3,3,0, 111,35} }, +{ {0,1,2,1,1,3,3,1, 76,23} }, +{ {0,1,2,1,1,3,3,2, 104,34} }, +{ {0,1,2,1,1,3,3,3, 65,30} }, +{ {0,1,2,1,1,3,3,4, 153,35} }, +{ {0,1,2,1,1,3,4,0, 147,35} }, +{ {0,1,2,1,1,3,4,1, 131,34} }, +{ {0,1,2,1,1,3,4,2, 142,15} }, +{ {0,1,2,1,1,3,4,3, 135,36} }, +{ {0,1,2,1,1,3,4,4, 149,5} }, +{ {0,1,2,1,1,3,4,5, 171,14} }, +{ {0,1,2,1,2,0,0,0, 40,5} }, +{ {0,1,2,1,2,0,0,1, 39,23} }, +{ {0,1,2,1,2,0,0,2, 51,14} }, +{ {0,1,2,1,2,0,0,3, 105,14} }, +{ {0,1,2,1,2,0,1,0, 48,37} }, +{ {0,1,2,1,2,0,1,1, 36,23} }, +{ {0,1,2,1,2,0,1,2, 50,15} }, +{ {0,1,2,1,2,0,1,3, 104,14} }, +{ {0,1,2,1,2,0,2,0, 29,46} }, +{ {0,1,2,1,2,0,2,1, 42,34} }, +{ {0,1,2,1,2,0,2,2, 18,29} }, +{ {0,1,2,1,2,0,2,3, 79,46} }, +{ {0,1,2,1,2,0,3,0, 91,35} }, +{ {0,1,2,1,2,0,3,1, 78,34} }, +{ {0,1,2,1,2,0,3,2, 99,14} }, +{ {0,1,2,1,2,0,3,3, 106,14} }, +{ {0,1,2,1,2,0,3,4, 141,14} }, +{ {0,1,2,1,2,1,0,0, 31,8} }, +{ {0,1,2,1,2,1,0,1, 12,8} }, +{ {0,1,2,1,2,1,0,2, 39,8} }, +{ {0,1,2,1,2,1,0,3, 87,8} }, +{ {0,1,2,1,2,1,1,0, 30,8} }, +{ {0,1,2,1,2,1,1,1, 6,22} }, +{ {0,1,2,1,2,1,1,2, 38,8} }, +{ {0,1,2,1,2,1,1,3, 85,8} }, +{ {0,1,2,1,2,1,2,0, 32,8} }, +{ {0,1,2,1,2,1,2,1, 10,22} }, +{ {0,1,2,1,2,1,2,2, 17,4} }, +{ {0,1,2,1,2,1,2,3, 88,27} }, +{ {0,1,2,1,2,1,3,0, 66,8} }, +{ {0,1,2,1,2,1,3,1, 60,8} }, +{ {0,1,2,1,2,1,3,2, 74,8} }, +{ {0,1,2,1,2,1,3,3, 86,8} }, +{ {0,1,2,1,2,1,3,4, 130,8} }, +{ {0,1,2,1,2,2,0,0, 47,4} }, +{ {0,1,2,1,2,2,0,1, 31,23} }, +{ {0,1,2,1,2,2,0,2, 40,10} }, +{ {0,1,2,1,2,2,0,3, 103,2} }, +{ {0,1,2,1,2,2,1,0, 53,15} }, +{ {0,1,2,1,2,2,1,1, 23,39} }, +{ {0,1,2,1,2,2,1,2, 27,31} }, +{ {0,1,2,1,2,2,1,3, 112,2} }, +{ {0,1,2,1,2,2,2,0, 24,28} }, +{ {0,1,2,1,2,2,2,1, 28,23} }, +{ {0,1,2,1,2,2,2,2, 8,4} }, +{ {0,1,2,1,2,2,2,3, 73,46} }, +{ {0,1,2,1,2,2,3,0, 108,35} }, +{ {0,1,2,1,2,2,3,1, 68,34} }, +{ {0,1,2,1,2,2,3,2, 81,31} }, +{ {0,1,2,1,2,2,3,3, 93,4} }, +{ {0,1,2,1,2,2,3,4, 149,14} }, +{ {0,1,2,1,2,3,0,0, 103,25} }, +{ {0,1,2,1,2,3,0,1, 87,23} }, +{ {0,1,2,1,2,3,0,2, 105,15} }, +{ {0,1,2,1,2,3,0,3, 97,35} }, +{ {0,1,2,1,2,3,0,4, 155,14} }, +{ {0,1,2,1,2,3,1,0, 111,15} }, +{ {0,1,2,1,2,3,1,1, 71,39} }, +{ {0,1,2,1,2,3,1,2, 102,15} }, +{ {0,1,2,1,2,3,1,3, 91,37} }, +{ {0,1,2,1,2,3,1,4, 153,15} }, +{ {0,1,2,1,2,3,2,0, 69,27} }, +{ {0,1,2,1,2,3,2,1, 83,27} }, +{ {0,1,2,1,2,3,2,2, 63,44} }, +{ {0,1,2,1,2,3,2,3, 84,46} }, +{ {0,1,2,1,2,3,2,4, 134,27} }, +{ {0,1,2,1,2,3,3,0, 114,15} }, +{ {0,1,2,1,2,3,3,1, 78,23} }, +{ {0,1,2,1,2,3,3,2, 105,34} }, +{ {0,1,2,1,2,3,3,3, 75,5} }, +{ {0,1,2,1,2,3,3,4, 156,14} }, +{ {0,1,2,1,2,3,4,0, 150,35} }, +{ {0,1,2,1,2,3,4,1, 133,34} }, +{ {0,1,2,1,2,3,4,2, 143,15} }, +{ {0,1,2,1,2,3,4,3, 138,35} }, +{ {0,1,2,1,2,3,4,4, 144,25} }, +{ {0,1,2,1,2,3,4,5, 173,14} }, +{ {0,1,2,1,3,0,0,0, 81,30} }, +{ {0,1,2,1,3,0,0,1, 74,23} }, +{ {0,1,2,1,3,0,0,2, 99,15} }, +{ {0,1,2,1,3,0,0,3, 105,35} }, +{ {0,1,2,1,3,0,0,4, 143,14} }, +{ {0,1,2,1,3,0,1,0, 92,35} }, +{ {0,1,2,1,3,0,1,1, 71,23} }, +{ {0,1,2,1,3,0,1,2, 98,15} }, +{ {0,1,2,1,3,0,1,3, 104,35} }, +{ {0,1,2,1,3,0,1,4, 142,14} }, +{ {0,1,2,1,3,0,2,0, 93,35} }, +{ {0,1,2,1,3,0,2,1, 75,34} }, +{ {0,1,2,1,3,0,2,2, 86,25} }, +{ {0,1,2,1,3,0,2,3, 106,35} }, +{ {0,1,2,1,3,0,2,4, 144,14} }, +{ {0,1,2,1,3,0,3,0, 94,35} }, +{ {0,1,2,1,3,0,3,1, 79,34} }, +{ {0,1,2,1,3,0,3,2, 100,14} }, +{ {0,1,2,1,3,0,3,3, 79,29} }, +{ {0,1,2,1,3,0,3,4, 145,14} }, +{ {0,1,2,1,3,0,4,0, 135,35} }, +{ {0,1,2,1,3,0,4,1, 128,34} }, +{ {0,1,2,1,3,0,4,2, 139,14} }, +{ {0,1,2,1,3,0,4,3, 141,35} }, +{ {0,1,2,1,3,0,4,4, 144,35} }, +{ {0,1,2,1,3,0,4,5, 169,14} }, +{ {0,1,2,1,3,1,0,0, 68,35} }, +{ {0,1,2,1,3,1,0,1, 60,23} }, +{ {0,1,2,1,3,1,0,2, 78,35} }, +{ {0,1,2,1,3,1,0,3, 78,8} }, +{ {0,1,2,1,3,1,0,4, 133,35} }, +{ {0,1,2,1,3,1,1,0, 67,35} }, +{ {0,1,2,1,3,1,1,1, 58,22} }, +{ {0,1,2,1,3,1,1,2, 76,35} }, +{ {0,1,2,1,3,1,1,3, 76,8} }, +{ {0,1,2,1,3,1,1,4, 131,35} }, +{ {0,1,2,1,3,1,2,0, 69,35} }, +{ {0,1,2,1,3,1,2,1, 59,23} }, +{ {0,1,2,1,3,1,2,2, 77,35} }, +{ {0,1,2,1,3,1,2,3, 79,8} }, +{ {0,1,2,1,3,1,2,4, 134,35} }, +{ {0,1,2,1,3,1,3,0, 69,8} }, +{ {0,1,2,1,3,1,3,1, 59,36} }, +{ {0,1,2,1,3,1,3,2, 79,35} }, +{ {0,1,2,1,3,1,3,3, 77,8} }, +{ {0,1,2,1,3,1,3,4, 134,8} }, +{ {0,1,2,1,3,1,4,0, 126,35} }, +{ {0,1,2,1,3,1,4,1, 124,35} }, +{ {0,1,2,1,3,1,4,2, 128,35} }, +{ {0,1,2,1,3,1,4,3, 128,8} }, +{ {0,1,2,1,3,1,4,4, 132,35} }, +{ {0,1,2,1,3,1,4,5, 167,35} }, +{ {0,1,2,1,3,2,0,0, 108,34} }, +{ {0,1,2,1,3,2,0,1, 66,23} }, +{ {0,1,2,1,3,2,0,2, 91,34} }, +{ {0,1,2,1,3,2,0,3, 114,14} }, +{ {0,1,2,1,3,2,0,4, 150,34} }, +{ {0,1,2,1,3,2,1,0, 107,34} }, +{ {0,1,2,1,3,2,1,1, 64,23} }, +{ {0,1,2,1,3,2,1,2, 90,34} }, +{ {0,1,2,1,3,2,1,3, 111,34} }, +{ {0,1,2,1,3,2,1,4, 147,34} }, +{ {0,1,2,1,3,2,2,0, 108,15} }, +{ {0,1,2,1,3,2,2,1, 65,23} }, +{ {0,1,2,1,3,2,2,2, 72,5} }, +{ {0,1,2,1,3,2,2,3, 103,44} }, +{ {0,1,2,1,3,2,2,4, 149,34} }, +{ {0,1,2,1,3,2,3,0, 109,14} }, +{ {0,1,2,1,3,2,3,1, 69,23} }, +{ {0,1,2,1,3,2,3,2, 94,34} }, +{ {0,1,2,1,3,2,3,3, 69,4} }, +{ {0,1,2,1,3,2,3,4, 151,14} }, +{ {0,1,2,1,3,2,4,0, 146,14} }, +{ {0,1,2,1,3,2,4,1, 126,34} }, +{ {0,1,2,1,3,2,4,2, 135,34} }, +{ {0,1,2,1,3,2,4,3, 150,14} }, +{ {0,1,2,1,3,2,4,4, 148,34} }, +{ {0,1,2,1,3,2,4,5, 170,14} }, +{ {0,1,2,1,3,3,0,0, 93,11} }, +{ {0,1,2,1,3,3,0,1, 86,23} }, +{ {0,1,2,1,3,3,0,2, 106,15} }, +{ {0,1,2,1,3,3,0,3, 75,10} }, +{ {0,1,2,1,3,3,0,4, 144,2} }, +{ {0,1,2,1,3,3,1,0, 108,3} }, +{ {0,1,2,1,3,3,1,1, 72,39} }, +{ {0,1,2,1,3,3,1,2, 103,34} }, +{ {0,1,2,1,3,3,1,3, 65,31} }, +{ {0,1,2,1,3,3,1,4, 149,10} }, +{ {0,1,2,1,3,3,2,0, 113,15} }, +{ {0,1,2,1,3,3,2,1, 82,23} }, +{ {0,1,2,1,3,3,2,2, 82,25} }, +{ {0,1,2,1,3,3,2,3, 82,31} }, +{ {0,1,2,1,3,3,2,4, 154,15} }, +{ {0,1,2,1,3,3,3,0, 69,11} }, +{ {0,1,2,1,3,3,3,1, 77,23} }, +{ {0,1,2,1,3,3,3,2, 79,28} }, +{ {0,1,2,1,3,3,3,3, 59,31} }, +{ {0,1,2,1,3,3,3,4, 134,11} }, +{ {0,1,2,1,3,3,4,0, 148,35} }, +{ {0,1,2,1,3,3,4,1, 132,34} }, +{ {0,1,2,1,3,3,4,2, 144,34} }, +{ {0,1,2,1,3,3,4,3, 129,31} }, +{ {0,1,2,1,3,3,4,4, 137,10} }, +{ {0,1,2,1,3,3,4,5, 172,35} }, +{ {0,1,2,1,3,4,0,0, 149,15} }, +{ {0,1,2,1,3,4,0,1, 130,23} }, +{ {0,1,2,1,3,4,0,2, 141,15} }, +{ {0,1,2,1,3,4,0,3, 156,15} }, +{ {0,1,2,1,3,4,0,4, 138,34} }, +{ {0,1,2,1,3,4,0,5, 173,15} }, +{ {0,1,2,1,3,4,1,0, 147,15} }, +{ {0,1,2,1,3,4,1,1, 127,39} }, +{ {0,1,2,1,3,4,1,2, 140,15} }, +{ {0,1,2,1,3,4,1,3, 153,34} }, +{ {0,1,2,1,3,4,1,4, 135,37} }, +{ {0,1,2,1,3,4,1,5, 171,15} }, +{ {0,1,2,1,3,4,2,0, 148,45} }, +{ {0,1,2,1,3,4,2,1, 129,23} }, +{ {0,1,2,1,3,4,2,2, 132,44} }, +{ {0,1,2,1,3,4,2,3, 144,44} }, +{ {0,1,2,1,3,4,2,4, 137,34} }, +{ {0,1,2,1,3,4,2,5, 172,15} }, +{ {0,1,2,1,3,4,3,0, 151,15} }, +{ {0,1,2,1,3,4,3,1, 134,23} }, +{ {0,1,2,1,3,4,3,2, 145,15} }, +{ {0,1,2,1,3,4,3,3, 134,4} }, +{ {0,1,2,1,3,4,3,4, 136,36} }, +{ {0,1,2,1,3,4,3,5, 174,14} }, +{ {0,1,2,1,3,4,4,0, 150,15} }, +{ {0,1,2,1,3,4,4,1, 128,23} }, +{ {0,1,2,1,3,4,4,2, 141,34} }, +{ {0,1,2,1,3,4,4,3, 155,34} }, +{ {0,1,2,1,3,4,4,4, 129,30} }, +{ {0,1,2,1,3,4,4,5, 173,34} }, +{ {0,1,2,1,3,4,5,0, 170,15} }, +{ {0,1,2,1,3,4,5,1, 167,34} }, +{ {0,1,2,1,3,4,5,2, 169,15} }, +{ {0,1,2,1,3,4,5,3, 173,35} }, +{ {0,1,2,1,3,4,5,4, 168,35} }, +{ {0,1,2,1,3,4,5,5, 172,34} }, +{ {0,1,2,1,3,4,5,6, 182,14} }, +{ {0,1,2,2,0,0,0,0, 8,28} }, +{ {0,1,2,2,0,0,0,1, 18,2} }, +{ {0,1,2,2,0,0,0,2, 17,28} }, +{ {0,1,2,2,0,0,0,3, 63,12} }, +{ {0,1,2,2,0,0,1,0, 24,2} }, +{ {0,1,2,2,0,0,1,1, 29,2} }, +{ {0,1,2,2,0,0,1,2, 32,2} }, +{ {0,1,2,2,0,0,1,3, 69,33} }, +{ {0,1,2,2,0,0,2,0, 28,45} }, +{ {0,1,2,2,0,0,2,1, 42,2} }, +{ {0,1,2,2,0,0,2,2, 10,25} }, +{ {0,1,2,2,0,0,2,3, 83,33} }, +{ {0,1,2,2,0,0,3,0, 73,2} }, +{ {0,1,2,2,0,0,3,1, 79,2} }, +{ {0,1,2,2,0,0,3,2, 88,2} }, +{ {0,1,2,2,0,0,3,3, 84,2} }, +{ {0,1,2,2,0,0,3,4, 134,33} }, +{ {0,1,2,2,0,1,0,0, 37,29} }, +{ {0,1,2,2,0,1,0,1, 43,12} }, +{ {0,1,2,2,0,1,0,2, 41,47} }, +{ {0,1,2,2,0,1,0,3, 82,12} }, +{ {0,1,2,2,0,1,1,0, 47,33} }, +{ {0,1,2,2,0,1,1,1, 37,30} }, +{ {0,1,2,2,0,1,1,2, 29,38} }, +{ {0,1,2,2,0,1,1,3, 93,33} }, +{ {0,1,2,2,0,1,2,0, 29,45} }, +{ {0,1,2,2,0,1,2,1, 41,36} }, +{ {0,1,2,2,0,1,2,2, 11,44} }, +{ {0,1,2,2,0,1,2,3, 84,45} }, +{ {0,1,2,2,0,1,3,0, 93,42} }, +{ {0,1,2,2,0,1,3,1, 82,9} }, +{ {0,1,2,2,0,1,3,2, 84,38} }, +{ {0,1,2,2,0,1,3,3, 96,32} }, +{ {0,1,2,2,0,1,3,4, 137,32} }, +{ {0,1,2,2,0,2,0,0, 23,29} }, +{ {0,1,2,2,0,2,0,1, 31,12} }, +{ {0,1,2,2,0,2,0,2, 28,47} }, +{ {0,1,2,2,0,2,0,3, 68,12} }, +{ {0,1,2,2,0,2,1,0, 53,33} }, +{ {0,1,2,2,0,2,1,1, 47,24} }, +{ {0,1,2,2,0,2,1,2, 24,22} }, +{ {0,1,2,2,0,2,1,3, 108,13} }, +{ {0,1,2,2,0,2,2,0, 27,45} }, +{ {0,1,2,2,0,2,2,1, 40,6} }, +{ {0,1,2,2,0,2,2,2, 8,24} }, +{ {0,1,2,2,0,2,2,3, 81,45} }, +{ {0,1,2,2,0,2,3,0, 112,16} }, +{ {0,1,2,2,0,2,3,1, 103,16} }, +{ {0,1,2,2,0,2,3,2, 73,22} }, +{ {0,1,2,2,0,2,3,3, 93,24} }, +{ {0,1,2,2,0,2,3,4, 149,32} }, +{ {0,1,2,2,0,3,0,0, 72,29} }, +{ {0,1,2,2,0,3,0,1, 86,12} }, +{ {0,1,2,2,0,3,0,2, 77,7} }, +{ {0,1,2,2,0,3,0,3, 82,47} }, +{ {0,1,2,2,0,3,0,4, 132,12} }, +{ {0,1,2,2,0,3,1,0, 108,17} }, +{ {0,1,2,2,0,3,1,1, 93,7} }, +{ {0,1,2,2,0,3,1,2, 69,7} }, +{ {0,1,2,2,0,3,1,3, 113,13} }, +{ {0,1,2,2,0,3,1,4, 148,13} }, +{ {0,1,2,2,0,3,2,0, 65,45} }, +{ {0,1,2,2,0,3,2,1, 75,6} }, +{ {0,1,2,2,0,3,2,2, 59,45} }, +{ {0,1,2,2,0,3,2,3, 82,45} }, +{ {0,1,2,2,0,3,2,4, 129,45} }, +{ {0,1,2,2,0,3,3,0, 103,12} }, +{ {0,1,2,2,0,3,3,1, 106,7} }, +{ {0,1,2,2,0,3,3,2, 79,38} }, +{ {0,1,2,2,0,3,3,3, 82,5} }, +{ {0,1,2,2,0,3,3,4, 144,12} }, +{ {0,1,2,2,0,3,4,0, 149,6} }, +{ {0,1,2,2,0,3,4,1, 144,16} }, +{ {0,1,2,2,0,3,4,2, 134,7} }, +{ {0,1,2,2,0,3,4,3, 154,17} }, +{ {0,1,2,2,0,3,4,4, 137,6} }, +{ {0,1,2,2,0,3,4,5, 172,13} }, +{ {0,1,2,2,1,0,0,0, 40,30} }, +{ {0,1,2,2,1,0,0,1, 51,6} }, +{ {0,1,2,2,1,0,0,2, 39,7} }, +{ {0,1,2,2,1,0,0,3, 105,17} }, +{ {0,1,2,2,1,0,1,0, 47,31} }, +{ {0,1,2,2,1,0,1,1, 40,29} }, +{ {0,1,2,2,1,0,1,2, 31,7} }, +{ {0,1,2,2,1,0,1,3, 103,47} }, +{ {0,1,2,2,1,0,2,0, 31,6} }, +{ {0,1,2,2,1,0,2,1, 39,6} }, +{ {0,1,2,2,1,0,2,2, 12,6} }, +{ {0,1,2,2,1,0,2,3, 87,6} }, +{ {0,1,2,2,1,0,3,0, 103,36} }, +{ {0,1,2,2,1,0,3,1, 105,16} }, +{ {0,1,2,2,1,0,3,2, 87,7} }, +{ {0,1,2,2,1,0,3,3, 97,6} }, +{ {0,1,2,2,1,0,3,4, 155,17} }, +{ {0,1,2,2,1,1,0,0, 29,3} }, +{ {0,1,2,2,1,1,0,1, 18,3} }, +{ {0,1,2,2,1,1,0,2, 42,3} }, +{ {0,1,2,2,1,1,0,3, 79,3} }, +{ {0,1,2,2,1,1,1,0, 24,3} }, +{ {0,1,2,2,1,1,1,1, 8,31} }, +{ {0,1,2,2,1,1,1,2, 28,38} }, +{ {0,1,2,2,1,1,1,3, 73,3} }, +{ {0,1,2,2,1,1,2,0, 32,3} }, +{ {0,1,2,2,1,1,2,1, 17,31} }, +{ {0,1,2,2,1,1,2,2, 10,24} }, +{ {0,1,2,2,1,1,2,3, 88,3} }, +{ {0,1,2,2,1,1,3,0, 69,42} }, +{ {0,1,2,2,1,1,3,1, 63,9} }, +{ {0,1,2,2,1,1,3,2, 83,42} }, +{ {0,1,2,2,1,1,3,3, 84,3} }, +{ {0,1,2,2,1,1,3,4, 134,42} }, +{ {0,1,2,2,1,2,0,0, 48,24} }, +{ {0,1,2,2,1,2,0,1, 50,7} }, +{ {0,1,2,2,1,2,0,2, 36,38} }, +{ {0,1,2,2,1,2,0,3, 104,17} }, +{ {0,1,2,2,1,2,1,0, 53,28} }, +{ {0,1,2,2,1,2,1,1, 27,4} }, +{ {0,1,2,2,1,2,1,2, 23,22} }, +{ {0,1,2,2,1,2,1,3, 112,47} }, +{ {0,1,2,2,1,2,2,0, 30,6} }, +{ {0,1,2,2,1,2,2,1, 38,6} }, +{ {0,1,2,2,1,2,2,2, 6,24} }, +{ {0,1,2,2,1,2,2,3, 85,6} }, +{ {0,1,2,2,1,2,3,0, 111,16} }, +{ {0,1,2,2,1,2,3,1, 102,16} }, +{ {0,1,2,2,1,2,3,2, 71,22} }, +{ {0,1,2,2,1,2,3,3, 91,24} }, +{ {0,1,2,2,1,2,3,4, 153,16} }, +{ {0,1,2,2,1,3,0,0, 91,6} }, +{ {0,1,2,2,1,3,0,1, 99,6} }, +{ {0,1,2,2,1,3,0,2, 78,7} }, +{ {0,1,2,2,1,3,0,3, 106,17} }, +{ {0,1,2,2,1,3,0,4, 141,17} }, +{ {0,1,2,2,1,3,1,0, 108,6} }, +{ {0,1,2,2,1,3,1,1, 81,4} }, +{ {0,1,2,2,1,3,1,2, 68,7} }, +{ {0,1,2,2,1,3,1,3, 93,31} }, +{ {0,1,2,2,1,3,1,4, 149,17} }, +{ {0,1,2,2,1,3,2,0, 66,6} }, +{ {0,1,2,2,1,3,2,1, 74,6} }, +{ {0,1,2,2,1,3,2,2, 60,6} }, +{ {0,1,2,2,1,3,2,3, 86,6} }, +{ {0,1,2,2,1,3,2,4, 130,6} }, +{ {0,1,2,2,1,3,3,0, 114,16} }, +{ {0,1,2,2,1,3,3,1, 105,7} }, +{ {0,1,2,2,1,3,3,2, 78,38} }, +{ {0,1,2,2,1,3,3,3, 75,30} }, +{ {0,1,2,2,1,3,3,4, 156,17} }, +{ {0,1,2,2,1,3,4,0, 150,6} }, +{ {0,1,2,2,1,3,4,1, 143,16} }, +{ {0,1,2,2,1,3,4,2, 133,7} }, +{ {0,1,2,2,1,3,4,3, 144,36} }, +{ {0,1,2,2,1,3,4,4, 138,6} }, +{ {0,1,2,2,1,3,4,5, 173,17} }, +{ {0,1,2,2,2,0,0,0, 27,5} }, +{ {0,1,2,2,2,0,0,1, 50,6} }, +{ {0,1,2,2,2,0,0,2, 38,7} }, +{ {0,1,2,2,2,0,0,3, 102,17} }, +{ {0,1,2,2,2,0,1,0, 53,31} }, +{ {0,1,2,2,2,0,1,1, 48,25} }, +{ {0,1,2,2,2,0,1,2, 30,7} }, +{ {0,1,2,2,2,0,1,3, 111,17} }, +{ {0,1,2,2,2,0,2,0, 23,27} }, +{ {0,1,2,2,2,0,2,1, 36,27} }, +{ {0,1,2,2,2,0,2,2, 6,25} }, +{ {0,1,2,2,2,0,2,3, 71,27} }, +{ {0,1,2,2,2,0,3,0, 112,36} }, +{ {0,1,2,2,2,0,3,1, 104,16} }, +{ {0,1,2,2,2,0,3,2, 85,7} }, +{ {0,1,2,2,2,0,3,3, 91,25} }, +{ {0,1,2,2,2,0,3,4, 153,17} }, +{ {0,1,2,2,2,1,0,0, 47,25} }, +{ {0,1,2,2,2,1,0,1, 31,9} }, +{ {0,1,2,2,2,1,0,2, 40,7} }, +{ {0,1,2,2,2,1,0,3, 103,17} }, +{ {0,1,2,2,2,1,1,0, 53,42} }, +{ {0,1,2,2,2,1,1,1, 23,30} }, +{ {0,1,2,2,2,1,1,2, 27,38} }, +{ {0,1,2,2,2,1,1,3, 112,17} }, +{ {0,1,2,2,2,1,2,0, 24,27} }, +{ {0,1,2,2,2,1,2,1, 28,36} }, +{ {0,1,2,2,2,1,2,2, 8,25} }, +{ {0,1,2,2,2,1,2,3, 73,27} }, +{ {0,1,2,2,2,1,3,0, 108,8} }, +{ {0,1,2,2,2,1,3,1, 68,9} }, +{ {0,1,2,2,2,1,3,2, 81,38} }, +{ {0,1,2,2,2,1,3,3, 93,25} }, +{ {0,1,2,2,2,1,3,4, 149,43} }, +{ {0,1,2,2,2,2,0,0, 45,4} }, +{ {0,1,2,2,2,2,0,1, 49,6} }, +{ {0,1,2,2,2,2,0,2, 35,22} }, +{ {0,1,2,2,2,2,0,3, 101,2} }, +{ {0,1,2,2,2,2,1,0, 52,7} }, +{ {0,1,2,2,2,2,1,1, 45,5} }, +{ {0,1,2,2,2,2,1,2, 21,22} }, +{ {0,1,2,2,2,2,1,3, 110,2} }, +{ {0,1,2,2,2,2,2,0, 21,27} }, +{ {0,1,2,2,2,2,2,1, 35,27} }, +{ {0,1,2,2,2,2,2,2, 3,4} }, +{ {0,1,2,2,2,2,2,3, 70,27} }, +{ {0,1,2,2,2,2,3,0, 110,3} }, +{ {0,1,2,2,2,2,3,1, 101,3} }, +{ {0,1,2,2,2,2,3,2, 70,22} }, +{ {0,1,2,2,2,2,3,3, 89,4} }, +{ {0,1,2,2,2,2,3,4, 152,2} }, +{ {0,1,2,2,2,3,0,0, 90,6} }, +{ {0,1,2,2,2,3,0,1, 98,6} }, +{ {0,1,2,2,2,3,0,2, 76,7} }, +{ {0,1,2,2,2,3,0,3, 103,6} }, +{ {0,1,2,2,2,3,0,4, 140,17} }, +{ {0,1,2,2,2,3,1,0, 107,17} }, +{ {0,1,2,2,2,3,1,1, 92,7} }, +{ {0,1,2,2,2,3,1,2, 67,7} }, +{ {0,1,2,2,2,3,1,3, 108,37} }, +{ {0,1,2,2,2,3,1,4, 147,17} }, +{ {0,1,2,2,2,3,2,0, 64,45} }, +{ {0,1,2,2,2,3,2,1, 71,45} }, +{ {0,1,2,2,2,3,2,2, 58,44} }, +{ {0,1,2,2,2,3,2,3, 72,27} }, +{ {0,1,2,2,2,3,2,4, 127,27} }, +{ {0,1,2,2,2,3,3,0, 111,6} }, +{ {0,1,2,2,2,3,3,1, 104,7} }, +{ {0,1,2,2,2,3,3,2, 76,38} }, +{ {0,1,2,2,2,3,3,3, 65,5} }, +{ {0,1,2,2,2,3,3,4, 153,6} }, +{ {0,1,2,2,2,3,4,0, 147,6} }, +{ {0,1,2,2,2,3,4,1, 142,16} }, +{ {0,1,2,2,2,3,4,2, 131,7} }, +{ {0,1,2,2,2,3,4,3, 149,30} }, +{ {0,1,2,2,2,3,4,4, 135,25} }, +{ {0,1,2,2,2,3,4,5, 171,17} }, +{ {0,1,2,2,3,0,0,0, 81,5} }, +{ {0,1,2,2,3,0,0,1, 99,7} }, +{ {0,1,2,2,3,0,0,2, 74,7} }, +{ {0,1,2,2,3,0,0,3, 105,6} }, +{ {0,1,2,2,3,0,0,4, 143,17} }, +{ {0,1,2,2,3,0,1,0, 108,7} }, +{ {0,1,2,2,3,0,1,1, 91,7} }, +{ {0,1,2,2,3,0,1,2, 66,7} }, +{ {0,1,2,2,3,0,1,3, 114,17} }, +{ {0,1,2,2,3,0,1,4, 150,7} }, +{ {0,1,2,2,3,0,2,0, 68,6} }, +{ {0,1,2,2,3,0,2,1, 78,6} }, +{ {0,1,2,2,3,0,2,2, 60,7} }, +{ {0,1,2,2,3,0,2,3, 78,45} }, +{ {0,1,2,2,3,0,2,4, 133,6} }, +{ {0,1,2,2,3,0,3,0, 93,28} }, +{ {0,1,2,2,3,0,3,1, 106,16} }, +{ {0,1,2,2,3,0,3,2, 86,7} }, +{ {0,1,2,2,3,0,3,3, 75,29} }, +{ {0,1,2,2,3,0,3,4, 144,47} }, +{ {0,1,2,2,3,0,4,0, 149,16} }, +{ {0,1,2,2,3,0,4,1, 141,16} }, +{ {0,1,2,2,3,0,4,2, 130,7} }, +{ {0,1,2,2,3,0,4,3, 156,16} }, +{ {0,1,2,2,3,0,4,4, 138,7} }, +{ {0,1,2,2,3,0,4,5, 173,16} }, +{ {0,1,2,2,3,1,0,0, 93,6} }, +{ {0,1,2,2,3,1,0,1, 86,9} }, +{ {0,1,2,2,3,1,0,2, 75,7} }, +{ {0,1,2,2,3,1,0,3, 106,6} }, +{ {0,1,2,2,3,1,0,4, 144,17} }, +{ {0,1,2,2,3,1,1,0, 108,16} }, +{ {0,1,2,2,3,1,1,1, 72,30} }, +{ {0,1,2,2,3,1,1,2, 65,38} }, +{ {0,1,2,2,3,1,1,3, 103,9} }, +{ {0,1,2,2,3,1,1,4, 149,7} }, +{ {0,1,2,2,3,1,2,0, 69,6} }, +{ {0,1,2,2,3,1,2,1, 77,6} }, +{ {0,1,2,2,3,1,2,2, 59,38} }, +{ {0,1,2,2,3,1,2,3, 79,45} }, +{ {0,1,2,2,3,1,2,4, 134,6} }, +{ {0,1,2,2,3,1,3,0, 113,8} }, +{ {0,1,2,2,3,1,3,1, 82,36} }, +{ {0,1,2,2,3,1,3,2, 82,38} }, +{ {0,1,2,2,3,1,3,3, 82,4} }, +{ {0,1,2,2,3,1,3,4, 154,16} }, +{ {0,1,2,2,3,1,4,0, 148,8} }, +{ {0,1,2,2,3,1,4,1, 132,9} }, +{ {0,1,2,2,3,1,4,2, 129,38} }, +{ {0,1,2,2,3,1,4,3, 144,9} }, +{ {0,1,2,2,3,1,4,4, 137,7} }, +{ {0,1,2,2,3,1,4,5, 172,8} }, +{ {0,1,2,2,3,2,0,0, 92,6} }, +{ {0,1,2,2,3,2,0,1, 98,7} }, +{ {0,1,2,2,3,2,0,2, 71,38} }, +{ {0,1,2,2,3,2,0,3, 104,6} }, +{ {0,1,2,2,3,2,0,4, 142,17} }, +{ {0,1,2,2,3,2,1,0, 107,7} }, +{ {0,1,2,2,3,2,1,1, 90,7} }, +{ {0,1,2,2,3,2,1,2, 64,38} }, +{ {0,1,2,2,3,2,1,3, 111,7} }, +{ {0,1,2,2,3,2,1,4, 147,7} }, +{ {0,1,2,2,3,2,2,0, 67,6} }, +{ {0,1,2,2,3,2,2,1, 76,6} }, +{ {0,1,2,2,3,2,2,2, 58,39} }, +{ {0,1,2,2,3,2,2,3, 76,45} }, +{ {0,1,2,2,3,2,2,4, 131,6} }, +{ {0,1,2,2,3,2,3,0, 108,46} }, +{ {0,1,2,2,3,2,3,1, 103,7} }, +{ {0,1,2,2,3,2,3,2, 72,22} }, +{ {0,1,2,2,3,2,3,3, 65,4} }, +{ {0,1,2,2,3,2,3,4, 149,29} }, +{ {0,1,2,2,3,2,4,0, 147,16} }, +{ {0,1,2,2,3,2,4,1, 140,16} }, +{ {0,1,2,2,3,2,4,2, 127,22} }, +{ {0,1,2,2,3,2,4,3, 153,7} }, +{ {0,1,2,2,3,2,4,4, 135,24} }, +{ {0,1,2,2,3,2,4,5, 171,16} }, +{ {0,1,2,2,3,3,0,0, 94,6} }, +{ {0,1,2,2,3,3,0,1, 100,6} }, +{ {0,1,2,2,3,3,0,2, 79,7} }, +{ {0,1,2,2,3,3,0,3, 79,10} }, +{ {0,1,2,2,3,3,0,4, 145,17} }, +{ {0,1,2,2,3,3,1,0, 109,7} }, +{ {0,1,2,2,3,3,1,1, 94,7} }, +{ {0,1,2,2,3,3,1,2, 69,38} }, +{ {0,1,2,2,3,3,1,3, 69,31} }, +{ {0,1,2,2,3,3,1,4, 151,17} }, +{ {0,1,2,2,3,3,2,0, 69,45} }, +{ {0,1,2,2,3,3,2,1, 79,6} }, +{ {0,1,2,2,3,3,2,2, 59,25} }, +{ {0,1,2,2,3,3,2,3, 77,45} }, +{ {0,1,2,2,3,3,2,4, 134,45} }, +{ {0,1,2,2,3,3,3,0, 69,28} }, +{ {0,1,2,2,3,3,3,1, 79,11} }, +{ {0,1,2,2,3,3,3,2, 77,38} }, +{ {0,1,2,2,3,3,3,3, 59,4} }, +{ {0,1,2,2,3,3,3,4, 134,28} }, +{ {0,1,2,2,3,3,4,0, 151,16} }, +{ {0,1,2,2,3,3,4,1, 145,16} }, +{ {0,1,2,2,3,3,4,2, 134,38} }, +{ {0,1,2,2,3,3,4,3, 134,31} }, +{ {0,1,2,2,3,3,4,4, 136,25} }, +{ {0,1,2,2,3,3,4,5, 174,17} }, +{ {0,1,2,2,3,4,0,0, 135,6} }, +{ {0,1,2,2,3,4,0,1, 139,6} }, +{ {0,1,2,2,3,4,0,2, 128,7} }, +{ {0,1,2,2,3,4,0,3, 141,6} }, +{ {0,1,2,2,3,4,0,4, 144,6} }, +{ {0,1,2,2,3,4,0,5, 169,17} }, +{ {0,1,2,2,3,4,1,0, 146,17} }, +{ {0,1,2,2,3,4,1,1, 135,7} }, +{ {0,1,2,2,3,4,1,2, 126,7} }, +{ {0,1,2,2,3,4,1,3, 150,17} }, +{ {0,1,2,2,3,4,1,4, 148,7} }, +{ {0,1,2,2,3,4,1,5, 170,17} }, +{ {0,1,2,2,3,4,2,0, 126,6} }, +{ {0,1,2,2,3,4,2,1, 128,6} }, +{ {0,1,2,2,3,4,2,2, 124,6} }, +{ {0,1,2,2,3,4,2,3, 128,45} }, +{ {0,1,2,2,3,4,2,4, 132,6} }, +{ {0,1,2,2,3,4,2,5, 167,6} }, +{ {0,1,2,2,3,4,3,0, 148,6} }, +{ {0,1,2,2,3,4,3,1, 144,7} }, +{ {0,1,2,2,3,4,3,2, 132,7} }, +{ {0,1,2,2,3,4,3,3, 129,4} }, +{ {0,1,2,2,3,4,3,4, 137,29} }, +{ {0,1,2,2,3,4,3,5, 172,6} }, +{ {0,1,2,2,3,4,4,0, 150,16} }, +{ {0,1,2,2,3,4,4,1, 141,7} }, +{ {0,1,2,2,3,4,4,2, 128,38} }, +{ {0,1,2,2,3,4,4,3, 155,7} }, +{ {0,1,2,2,3,4,4,4, 129,5} }, +{ {0,1,2,2,3,4,4,5, 173,7} }, +{ {0,1,2,2,3,4,5,0, 170,16} }, +{ {0,1,2,2,3,4,5,1, 169,16} }, +{ {0,1,2,2,3,4,5,2, 167,7} }, +{ {0,1,2,2,3,4,5,3, 173,6} }, +{ {0,1,2,2,3,4,5,4, 172,7} }, +{ {0,1,2,2,3,4,5,5, 168,6} }, +{ {0,1,2,2,3,4,5,6, 182,17} }, +{ {0,1,2,3,0,0,0,0, 58,11} }, +{ {0,1,2,3,0,0,0,1, 61,2} }, +{ {0,1,2,3,0,0,0,2, 61,28} }, +{ {0,1,2,3,0,0,0,3, 63,11} }, +{ {0,1,2,3,0,0,0,4, 125,33} }, +{ {0,1,2,3,0,0,1,0, 64,2} }, +{ {0,1,2,3,0,0,1,1, 65,2} }, +{ {0,1,2,3,0,0,1,2, 66,2} }, +{ {0,1,2,3,0,0,1,3, 69,2} }, +{ {0,1,2,3,0,0,1,4, 126,33} }, +{ {0,1,2,3,0,0,2,0, 72,2} }, +{ {0,1,2,3,0,0,2,1, 75,2} }, +{ {0,1,2,3,0,0,2,2, 80,2} }, +{ {0,1,2,3,0,0,2,3, 84,33} }, +{ {0,1,2,3,0,0,2,4, 129,33} }, +{ {0,1,2,3,0,0,3,0, 71,10} }, +{ {0,1,2,3,0,0,3,1, 78,2} }, +{ {0,1,2,3,0,0,3,2, 87,2} }, +{ {0,1,2,3,0,0,3,3, 83,2} }, +{ {0,1,2,3,0,0,3,4, 133,33} }, +{ {0,1,2,3,0,0,4,0, 127,2} }, +{ {0,1,2,3,0,0,4,1, 128,2} }, +{ {0,1,2,3,0,0,4,2, 130,2} }, +{ {0,1,2,3,0,0,4,3, 134,2} }, +{ {0,1,2,3,0,0,4,4, 129,2} }, +{ {0,1,2,3,0,0,4,5, 167,33} }, +{ {0,1,2,3,0,1,0,0, 72,47} }, +{ {0,1,2,3,0,1,0,1, 80,12} }, +{ {0,1,2,3,0,1,0,2, 75,47} }, +{ {0,1,2,3,0,1,0,3, 84,12} }, +{ {0,1,2,3,0,1,0,4, 129,12} }, +{ {0,1,2,3,0,1,1,0, 90,33} }, +{ {0,1,2,3,0,1,1,1, 72,36} }, +{ {0,1,2,3,0,1,1,2, 91,33} }, +{ {0,1,2,3,0,1,1,3, 94,33} }, +{ {0,1,2,3,0,1,1,4, 135,33} }, +{ {0,1,2,3,0,1,2,0, 94,42} }, +{ {0,1,2,3,0,1,2,1, 84,9} }, +{ {0,1,2,3,0,1,2,2, 84,44} }, +{ {0,1,2,3,0,1,2,3, 95,33} }, +{ {0,1,2,3,0,1,2,4, 136,32} }, +{ {0,1,2,3,0,1,3,0, 91,42} }, +{ {0,1,2,3,0,1,3,1, 75,36} }, +{ {0,1,2,3,0,1,3,2, 97,32} }, +{ {0,1,2,3,0,1,3,3, 84,39} }, +{ {0,1,2,3,0,1,3,4, 138,32} }, +{ {0,1,2,3,0,1,4,0, 135,42} }, +{ {0,1,2,3,0,1,4,1, 129,9} }, +{ {0,1,2,3,0,1,4,2, 138,43} }, +{ {0,1,2,3,0,1,4,3, 136,43} }, +{ {0,1,2,3,0,1,4,4, 137,33} }, +{ {0,1,2,3,0,1,4,5, 168,32} }, +{ {0,1,2,3,0,2,0,0, 64,47} }, +{ {0,1,2,3,0,2,0,1, 66,12} }, +{ {0,1,2,3,0,2,0,2, 65,47} }, +{ {0,1,2,3,0,2,0,3, 69,47} }, +{ {0,1,2,3,0,2,0,4, 126,12} }, +{ {0,1,2,3,0,2,1,0, 107,12} }, +{ {0,1,2,3,0,2,1,1, 108,12} }, +{ {0,1,2,3,0,2,1,2, 108,33} }, +{ {0,1,2,3,0,2,1,3, 109,12} }, +{ {0,1,2,3,0,2,1,4, 146,32} }, +{ {0,1,2,3,0,2,2,0, 90,12} }, +{ {0,1,2,3,0,2,2,1, 91,12} }, +{ {0,1,2,3,0,2,2,2, 72,25} }, +{ {0,1,2,3,0,2,2,3, 94,12} }, +{ {0,1,2,3,0,2,2,4, 135,12} }, +{ {0,1,2,3,0,2,3,0, 111,12} }, +{ {0,1,2,3,0,2,3,1, 114,32} }, +{ {0,1,2,3,0,2,3,2, 103,30} }, +{ {0,1,2,3,0,2,3,3, 69,24} }, +{ {0,1,2,3,0,2,3,4, 150,32} }, +{ {0,1,2,3,0,2,4,0, 147,12} }, +{ {0,1,2,3,0,2,4,1, 150,12} }, +{ {0,1,2,3,0,2,4,2, 149,12} }, +{ {0,1,2,3,0,2,4,3, 151,32} }, +{ {0,1,2,3,0,2,4,4, 148,12} }, +{ {0,1,2,3,0,2,4,5, 170,32} }, +{ {0,1,2,3,0,3,0,0, 71,29} }, +{ {0,1,2,3,0,3,0,1, 87,12} }, +{ {0,1,2,3,0,3,0,2, 78,47} }, +{ {0,1,2,3,0,3,0,3, 83,47} }, +{ {0,1,2,3,0,3,0,4, 133,12} }, +{ {0,1,2,3,0,3,1,0, 111,33} }, +{ {0,1,2,3,0,3,1,1, 103,5} }, +{ {0,1,2,3,0,3,1,2, 114,13} }, +{ {0,1,2,3,0,3,1,3, 69,37} }, +{ {0,1,2,3,0,3,1,4, 150,13} }, +{ {0,1,2,3,0,3,2,0, 91,27} }, +{ {0,1,2,3,0,3,2,1, 97,13} }, +{ {0,1,2,3,0,3,2,2, 75,25} }, +{ {0,1,2,3,0,3,2,3, 84,22} }, +{ {0,1,2,3,0,3,2,4, 138,13} }, +{ {0,1,2,3,0,3,3,0, 102,33} }, +{ {0,1,2,3,0,3,3,1, 105,33} }, +{ {0,1,2,3,0,3,3,2, 105,12} }, +{ {0,1,2,3,0,3,3,3, 63,30} }, +{ {0,1,2,3,0,3,3,4, 143,33} }, +{ {0,1,2,3,0,3,4,0, 153,33} }, +{ {0,1,2,3,0,3,4,1, 155,32} }, +{ {0,1,2,3,0,3,4,2, 156,32} }, +{ {0,1,2,3,0,3,4,3, 134,37} }, +{ {0,1,2,3,0,3,4,4, 144,5} }, +{ {0,1,2,3,0,3,4,5, 173,32} }, +{ {0,1,2,3,0,4,0,0, 127,47} }, +{ {0,1,2,3,0,4,0,1, 130,12} }, +{ {0,1,2,3,0,4,0,2, 128,47} }, +{ {0,1,2,3,0,4,0,3, 134,47} }, +{ {0,1,2,3,0,4,0,4, 129,47} }, +{ {0,1,2,3,0,4,0,5, 167,12} }, +{ {0,1,2,3,0,4,1,0, 147,33} }, +{ {0,1,2,3,0,4,1,1, 149,33} }, +{ {0,1,2,3,0,4,1,2, 150,33} }, +{ {0,1,2,3,0,4,1,3, 151,13} }, +{ {0,1,2,3,0,4,1,4, 148,33} }, +{ {0,1,2,3,0,4,1,5, 170,13} }, +{ {0,1,2,3,0,4,2,0, 135,27} }, +{ {0,1,2,3,0,4,2,1, 138,26} }, +{ {0,1,2,3,0,4,2,2, 129,44} }, +{ {0,1,2,3,0,4,2,3, 136,26} }, +{ {0,1,2,3,0,4,2,4, 137,12} }, +{ {0,1,2,3,0,4,2,5, 168,13} }, +{ {0,1,2,3,0,4,3,0, 153,12} }, +{ {0,1,2,3,0,4,3,1, 156,13} }, +{ {0,1,2,3,0,4,3,2, 155,13} }, +{ {0,1,2,3,0,4,3,3, 134,24} }, +{ {0,1,2,3,0,4,3,4, 144,30} }, +{ {0,1,2,3,0,4,3,5, 173,13} }, +{ {0,1,2,3,0,4,4,0, 140,33} }, +{ {0,1,2,3,0,4,4,1, 141,33} }, +{ {0,1,2,3,0,4,4,2, 141,12} }, +{ {0,1,2,3,0,4,4,3, 145,33} }, +{ {0,1,2,3,0,4,4,4, 132,30} }, +{ {0,1,2,3,0,4,4,5, 169,33} }, +{ {0,1,2,3,0,4,5,0, 171,33} }, +{ {0,1,2,3,0,4,5,1, 173,33} }, +{ {0,1,2,3,0,4,5,2, 173,12} }, +{ {0,1,2,3,0,4,5,3, 174,32} }, +{ {0,1,2,3,0,4,5,4, 172,33} }, +{ {0,1,2,3,0,4,5,5, 172,12} }, +{ {0,1,2,3,0,4,5,6, 182,32} }, +{ {0,1,2,3,1,0,0,0, 76,30} }, +{ {0,1,2,3,1,0,0,1, 115,2} }, +{ {0,1,2,3,1,0,0,2, 116,2} }, +{ {0,1,2,3,1,0,0,3, 105,22} }, +{ {0,1,2,3,1,0,0,4, 157,33} }, +{ {0,1,2,3,1,0,1,0, 90,28} }, +{ {0,1,2,3,1,0,1,1, 76,29} }, +{ {0,1,2,3,1,0,1,2, 98,28} }, +{ {0,1,2,3,1,0,1,3, 103,28} }, +{ {0,1,2,3,1,0,1,4, 140,47} }, +{ {0,1,2,3,1,0,2,0, 103,31} }, +{ {0,1,2,3,1,0,2,1, 105,27} }, +{ {0,1,2,3,1,0,2,2, 87,25} }, +{ {0,1,2,3,1,0,2,3, 97,45} }, +{ {0,1,2,3,1,0,2,4, 155,26} }, +{ {0,1,2,3,1,0,3,0, 98,31} }, +{ {0,1,2,3,1,0,3,1, 116,3} }, +{ {0,1,2,3,1,0,3,2, 118,3} }, +{ {0,1,2,3,1,0,3,3, 87,24} }, +{ {0,1,2,3,1,0,3,4, 158,21} }, +{ {0,1,2,3,1,0,4,0, 140,36} }, +{ {0,1,2,3,1,0,4,1, 157,42} }, +{ {0,1,2,3,1,0,4,2, 158,20} }, +{ {0,1,2,3,1,0,4,3, 155,23} }, +{ {0,1,2,3,1,0,4,4, 155,4} }, +{ {0,1,2,3,1,0,4,5, 175,21} }, +{ {0,1,2,3,1,1,0,0, 65,3} }, +{ {0,1,2,3,1,1,0,1, 61,3} }, +{ {0,1,2,3,1,1,0,2, 78,3} }, +{ {0,1,2,3,1,1,0,3, 75,3} }, +{ {0,1,2,3,1,1,0,4, 128,3} }, +{ {0,1,2,3,1,1,1,0, 64,11} }, +{ {0,1,2,3,1,1,1,1, 58,10} }, +{ {0,1,2,3,1,1,1,2, 71,11} }, +{ {0,1,2,3,1,1,1,3, 72,3} }, +{ {0,1,2,3,1,1,1,4, 127,3} }, +{ {0,1,2,3,1,1,2,0, 69,3} }, +{ {0,1,2,3,1,1,2,1, 63,10} }, +{ {0,1,2,3,1,1,2,2, 83,3} }, +{ {0,1,2,3,1,1,2,3, 84,42} }, +{ {0,1,2,3,1,1,2,4, 134,3} }, +{ {0,1,2,3,1,1,3,0, 66,3} }, +{ {0,1,2,3,1,1,3,1, 61,31} }, +{ {0,1,2,3,1,1,3,2, 87,3} }, +{ {0,1,2,3,1,1,3,3, 80,3} }, +{ {0,1,2,3,1,1,3,4, 130,3} }, +{ {0,1,2,3,1,1,4,0, 126,42} }, +{ {0,1,2,3,1,1,4,1, 125,42} }, +{ {0,1,2,3,1,1,4,2, 133,42} }, +{ {0,1,2,3,1,1,4,3, 129,42} }, +{ {0,1,2,3,1,1,4,4, 129,3} }, +{ {0,1,2,3,1,1,4,5, 167,42} }, +{ {0,1,2,3,1,2,0,0, 111,4} }, +{ {0,1,2,3,1,2,0,1, 120,3} }, +{ {0,1,2,3,1,2,0,2, 104,31} }, +{ {0,1,2,3,1,2,0,3, 114,39} }, +{ {0,1,2,3,1,2,0,4, 162,32} }, +{ {0,1,2,3,1,2,1,0, 107,47} }, +{ {0,1,2,3,1,2,1,1, 67,29} }, +{ {0,1,2,3,1,2,1,2, 92,29} }, +{ {0,1,2,3,1,2,1,3, 108,39} }, +{ {0,1,2,3,1,2,1,4, 147,47} }, +{ {0,1,2,3,1,2,2,0, 111,27} }, +{ {0,1,2,3,1,2,2,1, 102,27} }, +{ {0,1,2,3,1,2,2,2, 71,5} }, +{ {0,1,2,3,1,2,2,3, 91,39} }, +{ {0,1,2,3,1,2,2,4, 153,27} }, +{ {0,1,2,3,1,2,3,0, 121,21} }, +{ {0,1,2,3,1,2,3,1, 120,31} }, +{ {0,1,2,3,1,2,3,2, 98,30} }, +{ {0,1,2,3,1,2,3,3, 66,24} }, +{ {0,1,2,3,1,2,3,4, 163,21} }, +{ {0,1,2,3,1,2,4,0, 164,21} }, +{ {0,1,2,3,1,2,4,1, 160,42} }, +{ {0,1,2,3,1,2,4,2, 142,36} }, +{ {0,1,2,3,1,2,4,3, 150,39} }, +{ {0,1,2,3,1,2,4,4, 150,24} }, +{ {0,1,2,3,1,2,4,5, 177,21} }, +{ {0,1,2,3,1,3,0,0, 104,5} }, +{ {0,1,2,3,1,3,0,1, 116,9} }, +{ {0,1,2,3,1,3,0,2, 122,12} }, +{ {0,1,2,3,1,3,0,3, 78,37} }, +{ {0,1,2,3,1,3,0,4, 165,32} }, +{ {0,1,2,3,1,3,1,0, 111,28} }, +{ {0,1,2,3,1,3,1,1, 76,4} }, +{ {0,1,2,3,1,3,1,2, 104,29} }, +{ {0,1,2,3,1,3,1,3, 65,37} }, +{ {0,1,2,3,1,3,1,4, 153,28} }, +{ {0,1,2,3,1,3,2,0, 114,27} }, +{ {0,1,2,3,1,3,2,1, 105,44} }, +{ {0,1,2,3,1,3,2,2, 78,25} }, +{ {0,1,2,3,1,3,2,3, 75,37} }, +{ {0,1,2,3,1,3,2,4, 156,26} }, +{ {0,1,2,3,1,3,3,0, 120,30} }, +{ {0,1,2,3,1,3,3,1, 115,30} }, +{ {0,1,2,3,1,3,3,2, 116,24} }, +{ {0,1,2,3,1,3,3,3, 61,30} }, +{ {0,1,2,3,1,3,3,4, 159,30} }, +{ {0,1,2,3,1,3,4,0, 162,8} }, +{ {0,1,2,3,1,3,4,1, 157,9} }, +{ {0,1,2,3,1,3,4,2, 165,8} }, +{ {0,1,2,3,1,3,4,3, 128,37} }, +{ {0,1,2,3,1,3,4,4, 141,5} }, +{ {0,1,2,3,1,3,4,5, 178,8} }, +{ {0,1,2,3,1,4,0,0, 153,4} }, +{ {0,1,2,3,1,4,0,1, 159,3} }, +{ {0,1,2,3,1,4,0,2, 165,26} }, +{ {0,1,2,3,1,4,0,3, 156,38} }, +{ {0,1,2,3,1,4,0,4, 141,31} }, +{ {0,1,2,3,1,4,0,5, 178,32} }, +{ {0,1,2,3,1,4,1,0, 147,28} }, +{ {0,1,2,3,1,4,1,1, 131,29} }, +{ {0,1,2,3,1,4,1,2, 142,46} }, +{ {0,1,2,3,1,4,1,3, 149,22} }, +{ {0,1,2,3,1,4,1,4, 135,31} }, +{ {0,1,2,3,1,4,1,5, 171,47} }, +{ {0,1,2,3,1,4,2,0, 150,45} }, +{ {0,1,2,3,1,4,2,1, 143,27} }, +{ {0,1,2,3,1,4,2,2, 133,44} }, +{ {0,1,2,3,1,4,2,3, 138,45} }, +{ {0,1,2,3,1,4,2,4, 144,31} }, +{ {0,1,2,3,1,4,2,5, 173,26} }, +{ {0,1,2,3,1,4,3,0, 163,6} }, +{ {0,1,2,3,1,4,3,1, 159,31} }, +{ {0,1,2,3,1,4,3,2, 158,6} }, +{ {0,1,2,3,1,4,3,3, 130,24} }, +{ {0,1,2,3,1,4,3,4, 139,31} }, +{ {0,1,2,3,1,4,3,5, 179,21} }, +{ {0,1,2,3,1,4,4,0, 162,11} }, +{ {0,1,2,3,1,4,4,1, 157,10} }, +{ {0,1,2,3,1,4,4,2, 165,11} }, +{ {0,1,2,3,1,4,4,3, 141,22} }, +{ {0,1,2,3,1,4,4,4, 128,30} }, +{ {0,1,2,3,1,4,4,5, 178,11} }, +{ {0,1,2,3,1,4,5,0, 177,42} }, +{ {0,1,2,3,1,4,5,1, 176,42} }, +{ {0,1,2,3,1,4,5,2, 180,21} }, +{ {0,1,2,3,1,4,5,3, 173,22} }, +{ {0,1,2,3,1,4,5,4, 169,36} }, +{ {0,1,2,3,1,4,5,5, 173,5} }, +{ {0,1,2,3,1,4,5,6, 183,21} }, +{ {0,1,2,3,2,0,0,0, 76,5} }, +{ {0,1,2,3,2,0,0,1, 116,12} }, +{ {0,1,2,3,2,0,0,2, 115,28} }, +{ {0,1,2,3,2,0,0,3, 105,39} }, +{ {0,1,2,3,2,0,0,4, 157,12} }, +{ {0,1,2,3,2,0,1,0, 111,31} }, +{ {0,1,2,3,2,0,1,1, 104,4} }, +{ {0,1,2,3,2,0,1,2, 120,29} }, +{ {0,1,2,3,2,0,1,3, 114,22} }, +{ {0,1,2,3,2,0,1,4, 162,13} }, +{ {0,1,2,3,2,0,2,0, 65,46} }, +{ {0,1,2,3,2,0,2,1, 78,46} }, +{ {0,1,2,3,2,0,2,2, 61,29} }, +{ {0,1,2,3,2,0,2,3, 75,46} }, +{ {0,1,2,3,2,0,2,4, 128,46} }, +{ {0,1,2,3,2,0,3,0, 104,30} }, +{ {0,1,2,3,2,0,3,1, 122,43} }, +{ {0,1,2,3,2,0,3,2, 116,25} }, +{ {0,1,2,3,2,0,3,3, 78,24} }, +{ {0,1,2,3,2,0,3,4, 165,13} }, +{ {0,1,2,3,2,0,4,0, 153,31} }, +{ {0,1,2,3,2,0,4,1, 165,43} }, +{ {0,1,2,3,2,0,4,2, 159,29} }, +{ {0,1,2,3,2,0,4,3, 156,23} }, +{ {0,1,2,3,2,0,4,4, 141,4} }, +{ {0,1,2,3,2,0,4,5, 178,13} }, +{ {0,1,2,3,2,1,0,0, 103,4} }, +{ {0,1,2,3,2,1,0,1, 87,9} }, +{ {0,1,2,3,2,1,0,2, 105,42} }, +{ {0,1,2,3,2,1,0,3, 97,8} }, +{ {0,1,2,3,2,1,0,4, 155,43} }, +{ {0,1,2,3,2,1,1,0, 111,42} }, +{ {0,1,2,3,2,1,1,1, 71,30} }, +{ {0,1,2,3,2,1,1,2, 102,42} }, +{ {0,1,2,3,2,1,1,3, 91,22} }, +{ {0,1,2,3,2,1,1,4, 153,42} }, +{ {0,1,2,3,2,1,2,0, 69,46} }, +{ {0,1,2,3,2,1,2,1, 83,46} }, +{ {0,1,2,3,2,1,2,2, 63,29} }, +{ {0,1,2,3,2,1,2,3, 84,27} }, +{ {0,1,2,3,2,1,2,4, 134,46} }, +{ {0,1,2,3,2,1,3,0, 114,42} }, +{ {0,1,2,3,2,1,3,1, 78,36} }, +{ {0,1,2,3,2,1,3,2, 105,9} }, +{ {0,1,2,3,2,1,3,3, 75,24} }, +{ {0,1,2,3,2,1,3,4, 156,43} }, +{ {0,1,2,3,2,1,4,0, 150,8} }, +{ {0,1,2,3,2,1,4,1, 133,9} }, +{ {0,1,2,3,2,1,4,2, 143,42} }, +{ {0,1,2,3,2,1,4,3, 138,8} }, +{ {0,1,2,3,2,1,4,4, 144,4} }, +{ {0,1,2,3,2,1,4,5, 173,43} }, +{ {0,1,2,3,2,2,0,0, 90,11} }, +{ {0,1,2,3,2,2,0,1, 98,2} }, +{ {0,1,2,3,2,2,0,2, 76,10} }, +{ {0,1,2,3,2,2,0,3, 103,11} }, +{ {0,1,2,3,2,2,0,4, 140,2} }, +{ {0,1,2,3,2,2,1,0, 107,2} }, +{ {0,1,2,3,2,2,1,1, 92,10} }, +{ {0,1,2,3,2,2,1,2, 67,10} }, +{ {0,1,2,3,2,2,1,3, 108,22} }, +{ {0,1,2,3,2,2,1,4, 147,2} }, +{ {0,1,2,3,2,2,2,0, 64,28} }, +{ {0,1,2,3,2,2,2,1, 71,28} }, +{ {0,1,2,3,2,2,2,2, 58,29} }, +{ {0,1,2,3,2,2,2,3, 72,46} }, +{ {0,1,2,3,2,2,2,4, 127,46} }, +{ {0,1,2,3,2,2,3,0, 111,11} }, +{ {0,1,2,3,2,2,3,1, 104,10} }, +{ {0,1,2,3,2,2,3,2, 76,31} }, +{ {0,1,2,3,2,2,3,3, 65,24} }, +{ {0,1,2,3,2,2,3,4, 153,11} }, +{ {0,1,2,3,2,2,4,0, 147,11} }, +{ {0,1,2,3,2,2,4,1, 142,3} }, +{ {0,1,2,3,2,2,4,2, 131,10} }, +{ {0,1,2,3,2,2,4,3, 149,39} }, +{ {0,1,2,3,2,2,4,4, 135,4} }, +{ {0,1,2,3,2,2,4,5, 171,2} }, +{ {0,1,2,3,2,3,0,0, 98,4} }, +{ {0,1,2,3,2,3,0,1, 118,13} }, +{ {0,1,2,3,2,3,0,2, 116,27} }, +{ {0,1,2,3,2,3,0,3, 87,22} }, +{ {0,1,2,3,2,3,0,4, 158,13} }, +{ {0,1,2,3,2,3,1,0, 121,13} }, +{ {0,1,2,3,2,3,1,1, 98,5} }, +{ {0,1,2,3,2,3,1,2, 120,4} }, +{ {0,1,2,3,2,3,1,3, 66,22} }, +{ {0,1,2,3,2,3,1,4, 163,13} }, +{ {0,1,2,3,2,3,2,0, 66,27} }, +{ {0,1,2,3,2,3,2,1, 87,27} }, +{ {0,1,2,3,2,3,2,2, 61,4} }, +{ {0,1,2,3,2,3,2,3, 80,27} }, +{ {0,1,2,3,2,3,2,4, 130,27} }, +{ {0,1,2,3,2,3,3,0, 120,5} }, +{ {0,1,2,3,2,3,3,1, 116,22} }, +{ {0,1,2,3,2,3,3,2, 115,5} }, +{ {0,1,2,3,2,3,3,3, 61,5} }, +{ {0,1,2,3,2,3,3,4, 159,5} }, +{ {0,1,2,3,2,3,4,0, 163,8} }, +{ {0,1,2,3,2,3,4,1, 158,8} }, +{ {0,1,2,3,2,3,4,2, 159,4} }, +{ {0,1,2,3,2,3,4,3, 130,22} }, +{ {0,1,2,3,2,3,4,4, 139,4} }, +{ {0,1,2,3,2,3,4,5, 179,13} }, +{ {0,1,2,3,2,4,0,0, 140,25} }, +{ {0,1,2,3,2,4,0,1, 158,26} }, +{ {0,1,2,3,2,4,0,2, 157,27} }, +{ {0,1,2,3,2,4,0,3, 155,38} }, +{ {0,1,2,3,2,4,0,4, 155,31} }, +{ {0,1,2,3,2,4,0,5, 175,40} }, +{ {0,1,2,3,2,4,1,0, 164,40} }, +{ {0,1,2,3,2,4,1,1, 142,25} }, +{ {0,1,2,3,2,4,1,2, 160,27} }, +{ {0,1,2,3,2,4,1,3, 150,22} }, +{ {0,1,2,3,2,4,1,4, 150,37} }, +{ {0,1,2,3,2,4,1,5, 177,40} }, +{ {0,1,2,3,2,4,2,0, 126,27} }, +{ {0,1,2,3,2,4,2,1, 133,27} }, +{ {0,1,2,3,2,4,2,2, 125,27} }, +{ {0,1,2,3,2,4,2,3, 129,27} }, +{ {0,1,2,3,2,4,2,4, 129,46} }, +{ {0,1,2,3,2,4,2,5, 167,27} }, +{ {0,1,2,3,2,4,3,0, 162,45} }, +{ {0,1,2,3,2,4,3,1, 165,45} }, +{ {0,1,2,3,2,4,3,2, 157,44} }, +{ {0,1,2,3,2,4,3,3, 128,24} }, +{ {0,1,2,3,2,4,3,4, 141,30} }, +{ {0,1,2,3,2,4,3,5, 178,45} }, +{ {0,1,2,3,2,4,4,0, 162,28} }, +{ {0,1,2,3,2,4,4,1, 165,28} }, +{ {0,1,2,3,2,4,4,2, 157,29} }, +{ {0,1,2,3,2,4,4,3, 141,39} }, +{ {0,1,2,3,2,4,4,4, 128,5} }, +{ {0,1,2,3,2,4,4,5, 178,28} }, +{ {0,1,2,3,2,4,5,0, 177,27} }, +{ {0,1,2,3,2,4,5,1, 180,40} }, +{ {0,1,2,3,2,4,5,2, 176,27} }, +{ {0,1,2,3,2,4,5,3, 173,39} }, +{ {0,1,2,3,2,4,5,4, 173,30} }, +{ {0,1,2,3,2,4,5,5, 169,25} }, +{ {0,1,2,3,2,4,5,6, 183,40} }, +{ {0,1,2,3,3,0,0,0, 67,30} }, +{ {0,1,2,3,3,0,0,1, 120,2} }, +{ {0,1,2,3,3,0,0,2, 120,28} }, +{ {0,1,2,3,3,0,0,3, 102,22} }, +{ {0,1,2,3,3,0,0,4, 160,33} }, +{ {0,1,2,3,3,0,1,0, 107,36} }, +{ {0,1,2,3,3,0,1,1, 111,5} }, +{ {0,1,2,3,3,0,1,2, 121,20} }, +{ {0,1,2,3,3,0,1,3, 111,22} }, +{ {0,1,2,3,3,0,1,4, 164,20} }, +{ {0,1,2,3,3,0,2,0, 108,44} }, +{ {0,1,2,3,3,0,2,1, 114,26} }, +{ {0,1,2,3,3,0,2,2, 66,25} }, +{ {0,1,2,3,3,0,2,3, 91,44} }, +{ {0,1,2,3,3,0,2,4, 150,44} }, +{ {0,1,2,3,3,0,3,0, 92,30} }, +{ {0,1,2,3,3,0,3,1, 104,28} }, +{ {0,1,2,3,3,0,3,2, 98,29} }, +{ {0,1,2,3,3,0,3,3, 71,4} }, +{ {0,1,2,3,3,0,3,4, 142,47} }, +{ {0,1,2,3,3,0,4,0, 147,36} }, +{ {0,1,2,3,3,0,4,1, 162,43} }, +{ {0,1,2,3,3,0,4,2, 163,20} }, +{ {0,1,2,3,3,0,4,3, 153,22} }, +{ {0,1,2,3,3,0,4,4, 150,25} }, +{ {0,1,2,3,3,0,4,5, 177,20} }, +{ {0,1,2,3,3,1,0,0, 108,9} }, +{ {0,1,2,3,3,1,0,1, 66,9} }, +{ {0,1,2,3,3,1,0,2, 114,43} }, +{ {0,1,2,3,3,1,0,3, 91,9} }, +{ {0,1,2,3,3,1,0,4, 150,9} }, +{ {0,1,2,3,3,1,1,0, 107,9} }, +{ {0,1,2,3,3,1,1,1, 64,36} }, +{ {0,1,2,3,3,1,1,2, 111,9} }, +{ {0,1,2,3,3,1,1,3, 90,9} }, +{ {0,1,2,3,3,1,1,4, 147,9} }, +{ {0,1,2,3,3,1,2,0, 109,9} }, +{ {0,1,2,3,3,1,2,1, 69,36} }, +{ {0,1,2,3,3,1,2,2, 69,25} }, +{ {0,1,2,3,3,1,2,3, 94,9} }, +{ {0,1,2,3,3,1,2,4, 151,43} }, +{ {0,1,2,3,3,1,3,0, 108,42} }, +{ {0,1,2,3,3,1,3,1, 65,36} }, +{ {0,1,2,3,3,1,3,2, 103,29} }, +{ {0,1,2,3,3,1,3,3, 72,24} }, +{ {0,1,2,3,3,1,3,4, 149,9} }, +{ {0,1,2,3,3,1,4,0, 146,43} }, +{ {0,1,2,3,3,1,4,1, 126,9} }, +{ {0,1,2,3,3,1,4,2, 150,43} }, +{ {0,1,2,3,3,1,4,3, 135,9} }, +{ {0,1,2,3,3,1,4,4, 148,9} }, +{ {0,1,2,3,3,1,4,5, 170,43} }, +{ {0,1,2,3,3,2,0,0, 107,25} }, +{ {0,1,2,3,3,2,0,1, 121,26} }, +{ {0,1,2,3,3,2,0,2, 111,30} }, +{ {0,1,2,3,3,2,0,3, 111,39} }, +{ {0,1,2,3,3,2,0,4, 164,41} }, +{ {0,1,2,3,3,2,1,0, 123,0} }, +{ {0,1,2,3,3,2,1,1, 107,5} }, +{ {0,1,2,3,3,2,1,2, 107,30} }, +{ {0,1,2,3,3,2,1,3, 107,39} }, +{ {0,1,2,3,3,2,1,4, 166,0} }, +{ {0,1,2,3,3,2,2,0, 107,44} }, +{ {0,1,2,3,3,2,2,1, 111,44} }, +{ {0,1,2,3,3,2,2,2, 64,25} }, +{ {0,1,2,3,3,2,2,3, 90,44} }, +{ {0,1,2,3,3,2,2,4, 147,44} }, +{ {0,1,2,3,3,2,3,0, 107,29} }, +{ {0,1,2,3,3,2,3,1, 111,29} }, +{ {0,1,2,3,3,2,3,2, 90,30} }, +{ {0,1,2,3,3,2,3,3, 64,4} }, +{ {0,1,2,3,3,2,3,4, 147,29} }, +{ {0,1,2,3,3,2,4,0, 166,20} }, +{ {0,1,2,3,3,2,4,1, 164,9} }, +{ {0,1,2,3,3,2,4,2, 147,30} }, +{ {0,1,2,3,3,2,4,3, 147,39} }, +{ {0,1,2,3,3,2,4,4, 146,25} }, +{ {0,1,2,3,3,2,4,5, 181,0} }, +{ {0,1,2,3,3,3,0,0, 92,5} }, +{ {0,1,2,3,3,3,0,1, 98,3} }, +{ {0,1,2,3,3,3,0,2, 104,11} }, +{ {0,1,2,3,3,3,0,3, 71,31} }, +{ {0,1,2,3,3,3,0,4, 142,2} }, +{ {0,1,2,3,3,3,1,0, 107,10} }, +{ {0,1,2,3,3,3,1,1, 90,5} }, +{ {0,1,2,3,3,3,1,2, 111,10} }, +{ {0,1,2,3,3,3,1,3, 64,31} }, +{ {0,1,2,3,3,3,1,4, 147,10} }, +{ {0,1,2,3,3,3,2,0, 108,27} }, +{ {0,1,2,3,3,3,2,1, 103,10} }, +{ {0,1,2,3,3,3,2,2, 65,25} }, +{ {0,1,2,3,3,3,2,3, 72,37} }, +{ {0,1,2,3,3,3,2,4, 149,44} }, +{ {0,1,2,3,3,3,3,0, 67,11} }, +{ {0,1,2,3,3,3,3,1, 76,11} }, +{ {0,1,2,3,3,3,3,2, 76,28} }, +{ {0,1,2,3,3,3,3,3, 58,30} }, +{ {0,1,2,3,3,3,3,4, 131,11} }, +{ {0,1,2,3,3,3,4,0, 147,3} }, +{ {0,1,2,3,3,3,4,1, 140,3} }, +{ {0,1,2,3,3,3,4,2, 153,10} }, +{ {0,1,2,3,3,3,4,3, 127,37} }, +{ {0,1,2,3,3,3,4,4, 135,5} }, +{ {0,1,2,3,3,3,4,5, 171,3} }, +{ {0,1,2,3,3,4,0,0, 147,25} }, +{ {0,1,2,3,3,4,0,1, 163,26} }, +{ {0,1,2,3,3,4,0,2, 162,26} }, +{ {0,1,2,3,3,4,0,3, 153,39} }, +{ {0,1,2,3,3,4,0,4, 150,36} }, +{ {0,1,2,3,3,4,0,5, 177,41} }, +{ {0,1,2,3,3,4,1,0, 166,41} }, +{ {0,1,2,3,3,4,1,1, 147,5} }, +{ {0,1,2,3,3,4,1,2, 164,44} }, +{ {0,1,2,3,3,4,1,3, 147,22} }, +{ {0,1,2,3,3,4,1,4, 146,36} }, +{ {0,1,2,3,3,4,1,5, 181,19} }, +{ {0,1,2,3,3,4,2,0, 146,26} }, +{ {0,1,2,3,3,4,2,1, 150,26} }, +{ {0,1,2,3,3,4,2,2, 126,44} }, +{ {0,1,2,3,3,4,2,3, 135,44} }, +{ {0,1,2,3,3,4,2,4, 148,44} }, +{ {0,1,2,3,3,4,2,5, 170,26} }, +{ {0,1,2,3,3,4,3,0, 147,46} }, +{ {0,1,2,3,3,4,3,1, 153,29} }, +{ {0,1,2,3,3,4,3,2, 140,46} }, +{ {0,1,2,3,3,4,3,3, 127,24} }, +{ {0,1,2,3,3,4,3,4, 135,30} }, +{ {0,1,2,3,3,4,3,5, 171,46} }, +{ {0,1,2,3,3,4,4,0, 164,30} }, +{ {0,1,2,3,3,4,4,1, 162,30} }, +{ {0,1,2,3,3,4,4,2, 162,5} }, +{ {0,1,2,3,3,4,4,3, 140,22} }, +{ {0,1,2,3,3,4,4,4, 126,30} }, +{ {0,1,2,3,3,4,4,5, 177,30} }, +{ {0,1,2,3,3,4,5,0, 181,43} }, +{ {0,1,2,3,3,4,5,1, 177,9} }, +{ {0,1,2,3,3,4,5,2, 177,44} }, +{ {0,1,2,3,3,4,5,3, 171,22} }, +{ {0,1,2,3,3,4,5,4, 170,36} }, +{ {0,1,2,3,3,4,5,5, 170,25} }, +{ {0,1,2,3,3,4,5,6, 184,0} }, +{ {0,1,2,3,4,0,0,0, 131,30} }, +{ {0,1,2,3,4,0,0,1, 159,2} }, +{ {0,1,2,3,4,0,0,2, 159,28} }, +{ {0,1,2,3,4,0,0,3, 143,22} }, +{ {0,1,2,3,4,0,0,4, 157,11} }, +{ {0,1,2,3,4,0,0,5, 176,33} }, +{ {0,1,2,3,4,0,1,0, 147,31} }, +{ {0,1,2,3,4,0,1,1, 153,5} }, +{ {0,1,2,3,4,0,1,2, 163,7} }, +{ {0,1,2,3,4,0,1,3, 150,38} }, +{ {0,1,2,3,4,0,1,4, 162,10} }, +{ {0,1,2,3,4,0,1,5, 177,33} }, +{ {0,1,2,3,4,0,2,0, 149,27} }, +{ {0,1,2,3,4,0,2,1, 156,45} }, +{ {0,1,2,3,4,0,2,2, 130,25} }, +{ {0,1,2,3,4,0,2,3, 138,38} }, +{ {0,1,2,3,4,0,2,4, 141,27} }, +{ {0,1,2,3,4,0,2,5, 173,27} }, +{ {0,1,2,3,4,0,3,0, 142,37} }, +{ {0,1,2,3,4,0,3,1, 165,23} }, +{ {0,1,2,3,4,0,3,2, 158,7} }, +{ {0,1,2,3,4,0,3,3, 133,39} }, +{ {0,1,2,3,4,0,3,4, 165,10} }, +{ {0,1,2,3,4,0,3,5, 180,20} }, +{ {0,1,2,3,4,0,4,0, 135,28} }, +{ {0,1,2,3,4,0,4,1, 141,28} }, +{ {0,1,2,3,4,0,4,2, 139,28} }, +{ {0,1,2,3,4,0,4,3, 144,28} }, +{ {0,1,2,3,4,0,4,4, 128,29} }, +{ {0,1,2,3,4,0,4,5, 169,47} }, +{ {0,1,2,3,4,0,5,0, 171,36} }, +{ {0,1,2,3,4,0,5,1, 178,9} }, +{ {0,1,2,3,4,0,5,2, 179,20} }, +{ {0,1,2,3,4,0,5,3, 173,23} }, +{ {0,1,2,3,4,0,5,4, 178,10} }, +{ {0,1,2,3,4,0,5,5, 173,4} }, +{ {0,1,2,3,4,0,5,6, 183,20} }, +{ {0,1,2,3,4,1,0,0, 149,42} }, +{ {0,1,2,3,4,1,0,1, 130,9} }, +{ {0,1,2,3,4,1,0,2, 156,8} }, +{ {0,1,2,3,4,1,0,3, 138,23} }, +{ {0,1,2,3,4,1,0,4, 141,42} }, +{ {0,1,2,3,4,1,0,5, 173,42} }, +{ {0,1,2,3,4,1,1,0, 147,42} }, +{ {0,1,2,3,4,1,1,1, 127,36} }, +{ {0,1,2,3,4,1,1,2, 153,9} }, +{ {0,1,2,3,4,1,1,3, 135,22} }, +{ {0,1,2,3,4,1,1,4, 140,42} }, +{ {0,1,2,3,4,1,1,5, 171,42} }, +{ {0,1,2,3,4,1,2,0, 151,8} }, +{ {0,1,2,3,4,1,2,1, 134,36} }, +{ {0,1,2,3,4,1,2,2, 134,25} }, +{ {0,1,2,3,4,1,2,3, 136,23} }, +{ {0,1,2,3,4,1,2,4, 145,42} }, +{ {0,1,2,3,4,1,2,5, 174,43} }, +{ {0,1,2,3,4,1,3,0, 150,42} }, +{ {0,1,2,3,4,1,3,1, 128,36} }, +{ {0,1,2,3,4,1,3,2, 155,8} }, +{ {0,1,2,3,4,1,3,3, 129,39} }, +{ {0,1,2,3,4,1,3,4, 141,9} }, +{ {0,1,2,3,4,1,3,5, 173,9} }, +{ {0,1,2,3,4,1,4,0, 148,42} }, +{ {0,1,2,3,4,1,4,1, 129,36} }, +{ {0,1,2,3,4,1,4,2, 144,29} }, +{ {0,1,2,3,4,1,4,3, 137,9} }, +{ {0,1,2,3,4,1,4,4, 132,29} }, +{ {0,1,2,3,4,1,4,5, 172,42} }, +{ {0,1,2,3,4,1,5,0, 170,8} }, +{ {0,1,2,3,4,1,5,1, 167,9} }, +{ {0,1,2,3,4,1,5,2, 173,8} }, +{ {0,1,2,3,4,1,5,3, 168,8} }, +{ {0,1,2,3,4,1,5,4, 169,42} }, +{ {0,1,2,3,4,1,5,5, 172,9} }, +{ {0,1,2,3,4,1,5,6, 182,43} }, +{ {0,1,2,3,4,2,0,0, 147,4} }, +{ {0,1,2,3,4,2,0,1, 163,23} }, +{ {0,1,2,3,4,2,0,2, 153,30} }, +{ {0,1,2,3,4,2,0,3, 150,23} }, +{ {0,1,2,3,4,2,0,4, 162,29} }, +{ {0,1,2,3,4,2,0,5, 177,12} }, +{ {0,1,2,3,4,2,1,0, 166,23} }, +{ {0,1,2,3,4,2,1,1, 147,24} }, +{ {0,1,2,3,4,2,1,2, 147,37} }, +{ {0,1,2,3,4,2,1,3, 146,23} }, +{ {0,1,2,3,4,2,1,4, 164,29} }, +{ {0,1,2,3,4,2,1,5, 181,32} }, +{ {0,1,2,3,4,2,2,0, 147,27} }, +{ {0,1,2,3,4,2,2,1, 153,44} }, +{ {0,1,2,3,4,2,2,2, 127,25} }, +{ {0,1,2,3,4,2,2,3, 135,39} }, +{ {0,1,2,3,4,2,2,4, 140,27} }, +{ {0,1,2,3,4,2,2,5, 171,27} }, +{ {0,1,2,3,4,2,3,0, 164,39} }, +{ {0,1,2,3,4,2,3,1, 162,23} }, +{ {0,1,2,3,4,2,3,2, 140,37} }, +{ {0,1,2,3,4,2,3,3, 126,39} }, +{ {0,1,2,3,4,2,3,4, 162,4} }, +{ {0,1,2,3,4,2,3,5, 177,39} }, +{ {0,1,2,3,4,2,4,0, 146,47} }, +{ {0,1,2,3,4,2,4,1, 150,47} }, +{ {0,1,2,3,4,2,4,2, 135,29} }, +{ {0,1,2,3,4,2,4,3, 148,39} }, +{ {0,1,2,3,4,2,4,4, 126,29} }, +{ {0,1,2,3,4,2,4,5, 170,47} }, +{ {0,1,2,3,4,2,5,0, 181,14} }, +{ {0,1,2,3,4,2,5,1, 177,34} }, +{ {0,1,2,3,4,2,5,2, 171,37} }, +{ {0,1,2,3,4,2,5,3, 170,23} }, +{ {0,1,2,3,4,2,5,4, 177,29} }, +{ {0,1,2,3,4,2,5,5, 170,24} }, +{ {0,1,2,3,4,2,5,6, 184,21} }, +{ {0,1,2,3,4,3,0,0, 142,24} }, +{ {0,1,2,3,4,3,0,1, 158,23} }, +{ {0,1,2,3,4,3,0,2, 165,38} }, +{ {0,1,2,3,4,3,0,3, 133,22} }, +{ {0,1,2,3,4,3,0,4, 165,29} }, +{ {0,1,2,3,4,3,0,5, 180,35} }, +{ {0,1,2,3,4,3,1,0, 164,22} }, +{ {0,1,2,3,4,3,1,1, 140,24} }, +{ {0,1,2,3,4,3,1,2, 162,38} }, +{ {0,1,2,3,4,3,1,3, 126,22} }, +{ {0,1,2,3,4,3,1,4, 162,31} }, +{ {0,1,2,3,4,3,1,5, 177,22} }, +{ {0,1,2,3,4,3,2,0, 150,27} }, +{ {0,1,2,3,4,3,2,1, 155,45} }, +{ {0,1,2,3,4,3,2,2, 128,25} }, +{ {0,1,2,3,4,3,2,3, 129,22} }, +{ {0,1,2,3,4,3,2,4, 141,44} }, +{ {0,1,2,3,4,3,2,5, 173,44} }, +{ {0,1,2,3,4,3,3,0, 160,22} }, +{ {0,1,2,3,4,3,3,1, 157,22} }, +{ {0,1,2,3,4,3,3,2, 157,39} }, +{ {0,1,2,3,4,3,3,3, 125,22} }, +{ {0,1,2,3,4,3,3,4, 157,30} }, +{ {0,1,2,3,4,3,3,5, 176,22} }, +{ {0,1,2,3,4,3,4,0, 150,46} }, +{ {0,1,2,3,4,3,4,1, 155,29} }, +{ {0,1,2,3,4,3,4,2, 141,29} }, +{ {0,1,2,3,4,3,4,3, 129,37} }, +{ {0,1,2,3,4,3,4,4, 128,4} }, +{ {0,1,2,3,4,3,4,5, 173,29} }, +{ {0,1,2,3,4,3,5,0, 177,35} }, +{ {0,1,2,3,4,3,5,1, 175,35} }, +{ {0,1,2,3,4,3,5,2, 178,22} }, +{ {0,1,2,3,4,3,5,3, 167,22} }, +{ {0,1,2,3,4,3,5,4, 178,31} }, +{ {0,1,2,3,4,3,5,5, 169,24} }, +{ {0,1,2,3,4,3,5,6, 183,35} }, +{ {0,1,2,3,4,4,0,0, 135,11} }, +{ {0,1,2,3,4,4,0,1, 139,2} }, +{ {0,1,2,3,4,4,0,2, 141,11} }, +{ {0,1,2,3,4,4,0,3, 144,11} }, +{ {0,1,2,3,4,4,0,4, 128,10} }, +{ {0,1,2,3,4,4,0,5, 169,2} }, +{ {0,1,2,3,4,4,1,0, 146,2} }, +{ {0,1,2,3,4,4,1,1, 135,10} }, +{ {0,1,2,3,4,4,1,2, 150,2} }, +{ {0,1,2,3,4,4,1,3, 148,22} }, +{ {0,1,2,3,4,4,1,4, 126,10} }, +{ {0,1,2,3,4,4,1,5, 170,2} }, +{ {0,1,2,3,4,4,2,0, 148,27} }, +{ {0,1,2,3,4,4,2,1, 144,10} }, +{ {0,1,2,3,4,4,2,2, 129,25} }, +{ {0,1,2,3,4,4,2,3, 137,44} }, +{ {0,1,2,3,4,4,2,4, 132,10} }, +{ {0,1,2,3,4,4,2,5, 172,27} }, +{ {0,1,2,3,4,4,3,0, 150,3} }, +{ {0,1,2,3,4,4,3,1, 141,10} }, +{ {0,1,2,3,4,4,3,2, 155,10} }, +{ {0,1,2,3,4,4,3,3, 129,24} }, +{ {0,1,2,3,4,4,3,4, 128,31} }, +{ {0,1,2,3,4,4,3,5, 173,10} }, +{ {0,1,2,3,4,4,4,0, 126,11} }, +{ {0,1,2,3,4,4,4,1, 128,11} }, +{ {0,1,2,3,4,4,4,2, 128,28} }, +{ {0,1,2,3,4,4,4,3, 132,11} }, +{ {0,1,2,3,4,4,4,4, 124,11} }, +{ {0,1,2,3,4,4,4,5, 167,11} }, +{ {0,1,2,3,4,4,5,0, 170,3} }, +{ {0,1,2,3,4,4,5,1, 169,3} }, +{ {0,1,2,3,4,4,5,2, 173,11} }, +{ {0,1,2,3,4,4,5,3, 172,22} }, +{ {0,1,2,3,4,4,5,4, 167,10} }, +{ {0,1,2,3,4,4,5,5, 168,11} }, +{ {0,1,2,3,4,4,5,6, 182,2} }, +{ {0,1,2,3,4,5,0,0, 171,25} }, +{ {0,1,2,3,4,5,0,1, 179,26} }, +{ {0,1,2,3,4,5,0,2, 178,44} }, +{ {0,1,2,3,4,5,0,3, 173,38} }, +{ {0,1,2,3,4,5,0,4, 178,29} }, +{ {0,1,2,3,4,5,0,5, 173,31} }, +{ {0,1,2,3,4,5,0,6, 183,41} }, +{ {0,1,2,3,4,5,1,0, 181,17} }, +{ {0,1,2,3,4,5,1,1, 171,24} }, +{ {0,1,2,3,4,5,1,2, 177,7} }, +{ {0,1,2,3,4,5,1,3, 170,38} }, +{ {0,1,2,3,4,5,1,4, 177,10} }, +{ {0,1,2,3,4,5,1,5, 170,37} }, +{ {0,1,2,3,4,5,1,6, 184,40} }, +{ {0,1,2,3,4,5,2,0, 170,45} }, +{ {0,1,2,3,4,5,2,1, 173,45} }, +{ {0,1,2,3,4,5,2,2, 167,44} }, +{ {0,1,2,3,4,5,2,3, 168,45} }, +{ {0,1,2,3,4,5,2,4, 169,27} }, +{ {0,1,2,3,4,5,2,5, 172,44} }, +{ {0,1,2,3,4,5,2,6, 182,26} }, +{ {0,1,2,3,4,5,3,0, 177,6} }, +{ {0,1,2,3,4,5,3,1, 178,39} }, +{ {0,1,2,3,4,5,3,2, 175,6} }, +{ {0,1,2,3,4,5,3,3, 167,39} }, +{ {0,1,2,3,4,5,3,4, 178,4} }, +{ {0,1,2,3,4,5,3,5, 169,37} }, +{ {0,1,2,3,4,5,3,6, 183,6} }, +{ {0,1,2,3,4,5,4,0, 170,46} }, +{ {0,1,2,3,4,5,4,1, 173,28} }, +{ {0,1,2,3,4,5,4,2, 169,46} }, +{ {0,1,2,3,4,5,4,3, 172,39} }, +{ {0,1,2,3,4,5,4,4, 167,29} }, +{ {0,1,2,3,4,5,4,5, 168,28} }, +{ {0,1,2,3,4,5,4,6, 182,47} }, +{ {0,1,2,3,4,5,5,0, 177,11} }, +{ {0,1,2,3,4,5,5,1, 178,30} }, +{ {0,1,2,3,4,5,5,2, 178,5} }, +{ {0,1,2,3,4,5,5,3, 169,22} }, +{ {0,1,2,3,4,5,5,4, 175,11} }, +{ {0,1,2,3,4,5,5,5, 167,30} }, +{ {0,1,2,3,4,5,5,6, 183,11} }, +{ {0,1,2,3,4,5,6,0, 184,35} }, +{ {0,1,2,3,4,5,6,1, 183,34} }, +{ {0,1,2,3,4,5,6,2, 183,7} }, +{ {0,1,2,3,4,5,6,3, 182,23} }, +{ {0,1,2,3,4,5,6,4, 183,10} }, +{ {0,1,2,3,4,5,6,5, 182,36} }, +{ {0,1,2,3,4,5,6,6, 182,25} }, +{ {0,1,2,3,4,5,6,7, 185,0} } +}; + +}//end namespace internal +}//end namespace Mesh_3 +}//end namespace CGAL + +#endif // CGAL_MESH_3_FEATURES_DETECTION_CASES_TABLES_H diff --git a/Mesh_3/include/CGAL/Mesh_3/features_detection/combinations.h b/Mesh_3/include/CGAL/Mesh_3/features_detection/combinations.h new file mode 100644 index 00000000000..a241ed1eade --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/features_detection/combinations.h @@ -0,0 +1,235 @@ +// Copyright (c) 2022 GeometryFactory (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) : Sebastien Loriot +// +//****************************************************************************** +// +//****************************************************************************** + + +#ifndef CGAL_MESH_3_FEATURES_DETECTION_COMBINATIONS_H +#define CGAL_MESH_3_FEATURES_DETECTION_COMBINATIONS_H + +#include + +#include + +namespace CGAL +{ +namespace Mesh_3 +{ +namespace internal +{ + const std::array combinations[] + = { + // 1 color + {0,0,0,0,0,0,0,0}, //0 + // 2 colors + {0,0,0,0,0,0,0,1}, //1 + {0,0,0,0,0,0,1,1}, //2 + // 3 colors + {0,0,0,0,0,0,1,2}, //3 + {0,0,0,0,0,1,1,0}, + {0,0,0,0,0,1,1,1}, + {0,0,0,0,0,1,1,2}, + {0,0,0,0,0,1,2,0}, + {0,0,0,0,0,1,2,1}, + {0,0,0,0,1,1,1,1}, + {0,0,0,0,1,1,1,2}, + {0,0,0,0,1,1,2,2}, + {0,0,0,0,1,2,2,1}, + {0,0,0,1,0,1,1,0}, + {0,0,0,1,0,1,1,1}, + {0,0,0,1,0,1,1,2}, + {0,0,0,1,0,1,2,0}, + {0,0,0,1,0,1,2,1}, + {0,0,0,1,0,1,2,2}, + {0,0,0,1,1,0,0,0}, + {0,0,0,1,1,0,0,1}, + {0,0,0,1,1,0,0,2}, + {0,0,0,1,1,0,1,1}, + {0,0,0,1,1,0,1,2}, + {0,0,0,1,1,0,2,2}, + {0,0,0,1,1,1,1,0}, + {0,0,0,1,1,1,1,2}, + {0,0,0,1,1,1,2,0}, + {0,0,0,1,1,1,2,1}, + {0,0,0,1,1,1,2,2}, + {0,0,0,1,1,2,2,0}, + {0,0,0,1,1,2,2,1}, + {0,0,0,1,1,2,2,2}, + {0,0,0,1,2,0,0,0}, + {0,0,0,1,2,0,0,1}, + {0,0,0,1,2,0,0,2}, + {0,0,0,1,2,0,1,2}, + {0,0,0,1,2,0,2,1}, + {0,0,0,1,2,1,1,0}, + {0,0,0,1,2,1,1,2}, + {0,0,0,1,2,1,2,0}, + {0,0,0,1,2,1,2,1}, + {0,0,0,1,2,1,2,2}, + {0,0,0,1,2,2,2,1}, + {0,0,1,1,1,1,0,0}, + {0,0,1,1,1,1,0,2}, + {0,0,1,1,1,1,2,2}, + {0,0,1,1,1,2,0,2}, + {0,0,1,1,1,2,2,0}, + {0,0,1,2,1,2,0,0}, + {0,0,1,2,1,2,0,1}, + {0,0,1,2,1,2,2,1}, + {0,0,1,2,2,1,0,0}, + {0,0,1,2,2,1,0,1}, + {0,1,1,0,1,0,0,1}, + {0,1,1,0,1,0,0,2}, + {0,1,1,0,1,2,2,1}, + {0,1,1,2,1,2,2,0}, //57 + // 4 colors + {0,0,0,0,0,1,2,3}, //58 + {0,0,0,0,1,1,2,3}, + {0,0,0,0,1,2,2,3}, + {0,0,0,1,0,1,2,3}, + {0,0,0,1,0,2,3,0}, + {0,0,0,1,0,2,3,1}, + {0,0,0,1,1,0,2,3}, + {0,0,0,1,1,1,2,3}, + {0,0,0,1,1,2,2,3}, + {0,0,0,1,1,2,3,0}, + {0,0,0,1,1,2,3,1}, + {0,0,0,1,1,2,3,2}, + {0,0,0,1,2,0,0,3}, + {0,0,0,1,2,0,1,3}, + {0,0,0,1,2,0,2,3}, + {0,0,0,1,2,0,3,3}, + {0,0,0,1,2,1,1,3}, + {0,0,0,1,2,1,2,3}, + {0,0,0,1,2,1,3,0}, + {0,0,0,1,2,1,3,1}, + {0,0,0,1,2,1,3,2}, + {0,0,0,1,2,1,3,3}, + {0,0,0,1,2,2,2,3}, + {0,0,0,1,2,2,3,0}, + {0,0,0,1,2,2,3,1}, + {0,0,0,1,2,2,3,2}, + {0,0,0,1,2,2,3,3}, + {0,0,0,1,2,3,3,0}, + {0,0,0,1,2,3,3,1}, + {0,0,0,1,2,3,3,2}, + {0,0,0,1,2,3,3,3}, + {0,0,1,1,1,1,2,3}, + {0,0,1,1,1,2,0,3}, + {0,0,1,1,1,2,2,3}, + {0,0,1,1,1,2,3,0}, + {0,0,1,1,1,2,3,2}, + {0,0,1,1,1,2,3,3}, + {0,0,1,1,2,2,3,3}, + {0,0,1,1,2,3,2,3}, + {0,0,1,1,2,3,3,2}, + {0,0,1,2,1,2,0,3}, + {0,0,1,2,1,2,2,3}, + {0,0,1,2,1,2,3,3}, + {0,0,1,2,1,3,0,0}, + {0,0,1,2,1,3,0,1}, + {0,0,1,2,1,3,0,2}, + {0,0,1,2,1,3,2,0}, + {0,0,1,2,1,3,2,1}, + {0,0,1,2,1,3,2,3}, + {0,0,1,2,2,1,0,3}, + {0,0,1,2,2,1,1,3}, + {0,0,1,2,2,1,3,3}, + {0,0,1,2,2,3,0,0}, + {0,0,1,2,2,3,0,1}, + {0,0,1,2,2,3,0,2}, + {0,0,1,2,2,3,1,3}, + {0,0,1,2,2,3,3,1}, + {0,1,1,0,1,0,2,3}, + {0,1,1,0,1,2,2,3}, + {0,1,1,0,1,2,3,1}, + {0,1,1,0,2,3,3,2}, + {0,1,1,2,1,2,2,3}, + {0,1,1,2,1,2,3,0}, + {0,1,1,2,2,3,3,0}, + {0,1,1,2,3,0,2,3}, + {0,1,2,3,3,2,1,0}, //123 + // 5 colors + {0,0,0,0,1,2,3,4}, //124 + {0,0,0,1,0,2,3,4}, + {0,0,0,1,1,2,3,4}, + {0,0,0,1,2,0,3,4}, + {0,0,0,1,2,1,3,4}, + {0,0,0,1,2,2,3,4}, + {0,0,0,1,2,3,3,4}, + {0,0,0,1,2,3,4,0}, + {0,0,0,1,2,3,4,1}, + {0,0,0,1,2,3,4,2}, + {0,0,0,1,2,3,4,3}, + {0,0,1,1,1,2,3,4}, + {0,0,1,1,2,2,3,4}, + {0,0,1,1,2,3,2,4}, + {0,0,1,1,2,3,3,4}, + {0,0,1,2,1,2,3,4}, + {0,0,1,2,1,3,0,4}, + {0,0,1,2,1,3,2,4}, + {0,0,1,2,1,3,4,0}, + {0,0,1,2,1,3,4,1}, + {0,0,1,2,1,3,4,2}, + {0,0,1,2,1,3,4,4}, + {0,0,1,2,2,1,3,4}, + {0,0,1,2,2,3,0,4}, + {0,0,1,2,2,3,1,4}, + {0,0,1,2,2,3,2,4}, + {0,0,1,2,2,3,3,4}, + {0,0,1,2,2,3,4,4}, + {0,0,1,2,3,4,0,0}, + {0,0,1,2,3,4,0,1}, + {0,0,1,2,3,4,1,4}, + {0,0,1,2,3,4,2,1}, + {0,0,1,2,3,4,2,3}, + {0,1,1,0,1,2,3,4}, + {0,1,1,0,2,3,3,4}, + {0,1,1,2,1,2,3,4}, + {0,1,1,2,1,3,4,0}, + {0,1,1,2,1,3,4,1}, + {0,1,1,2,2,0,3,4}, + {0,1,1,2,2,3,3,4}, + {0,1,1,2,2,3,4,0}, + {0,1,1,2,3,0,2,4}, + {0,1,2,3,3,2,1,4}, //166 + // 6 colors + {0,0,0,1,2,3,4,5}, //167 + {0,0,1,1,2,3,4,5}, + {0,0,1,2,1,3,4,5}, + {0,0,1,2,2,3,4,5}, + {0,0,1,2,3,4,0,5}, + {0,0,1,2,3,4,1,5}, + {0,0,1,2,3,4,2,5}, + {0,0,1,2,3,4,5,5}, + {0,1,1,0,2,3,4,5}, + {0,1,1,2,1,3,4,5}, + {0,1,1,2,2,3,4,5}, + {0,1,1,2,3,0,4,5}, + {0,1,1,2,3,4,4,5}, + {0,1,1,2,3,4,5,3}, + {0,1,2,3,3,2,4,5}, //181 + // 7 colors + {0,0,1,2,3,4,5,6}, //182 + {0,1,1,2,3,4,5,6}, + {0,1,2,3,3,4,5,6}, //184 + // 8 colors + {0,1,2,3,4,5,6,7} //185 + + }; + +}//end namespace internal +}//end namespace Mesh_3 +}//end namespace CGAL + + +#endif // CGAL_MESH_3_FEATURES_DETECTION_COMBINATIONS_H diff --git a/Mesh_3/include/CGAL/Mesh_3/features_detection/coordinates.h b/Mesh_3/include/CGAL/Mesh_3/features_detection/coordinates.h new file mode 100644 index 00000000000..ab08d468423 --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/features_detection/coordinates.h @@ -0,0 +1,62 @@ +// Copyright (c) 2022 GeometryFactory (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) : Sebastien Loriot +// +//****************************************************************************** +// +//****************************************************************************** + + +#ifndef CGAL_MESH_3_FEATURES_DETECTION_COORDINATES_H +#define CGAL_MESH_3_FEATURES_DETECTION_COORDINATES_H + +#include + +#include + +namespace CGAL +{ +namespace Mesh_3 +{ +namespace internal +{ + using Coordinates = std::array; + constexpr Coordinates coordinates[8] = { {0, 0, 0}, + {1, 0, 0}, + {0, 1, 0}, + {1, 1, 0}, + {0, 0, 1}, + {1, 0, 1}, + {0, 1, 1}, + {1, 1, 1} }; + + inline Coordinates minus(const Coordinates& b, const Coordinates& a) { + return { b[0] - a[0], b[1] - a[1], b[2] - a[2] }; + } + + inline Coordinates cross(Coordinates a, Coordinates b) { + return { a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] }; + } + + inline Coordinates square(Coordinates c) { + return { c[0] * c[0], c[1] * c[1], c[2] * c[2] }; + } + + inline int dist(Coordinates a, Coordinates b) { + auto s = square(minus(b, a)); + return s[0] + s[1] + s[2]; + } + +}//end namespace internal +}//end namespace Mesh_3 +}//end namespace CGAL + +#endif // CGAL_MESH_3_FEATURES_DETECTION_COORDINATES_H diff --git a/Mesh_3/include/CGAL/Mesh_3/features_detection/cube_isometries.h b/Mesh_3/include/CGAL/Mesh_3/features_detection/cube_isometries.h new file mode 100644 index 00000000000..f1c76005625 --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/features_detection/cube_isometries.h @@ -0,0 +1,89 @@ +// Copyright (c) 2022 GeometryFactory (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) : Sebastien Loriot +// +//****************************************************************************** +// +//****************************************************************************** + +#ifndef CGAL_MESH_3_FEATURES_DETECTION_CUBE_ISOMETRIES_H +#define CGAL_MESH_3_FEATURES_DETECTION_CUBE_ISOMETRIES_H + +#include + +#include + +namespace CGAL +{ +namespace Mesh_3 +{ +namespace internal +{ + using Permutation = std::array; + + constexpr Permutation cube_isometries[] = { + {0,1,2,3,4,5,6,7}, + {1,0,3,2,5,4,7,6}, + {4,5,0,1,6,7,2,3}, + {5,4,1,0,7,6,3,2}, + {6,7,4,5,2,3,0,1}, + {7,6,5,4,3,2,1,0}, + {2,3,6,7,0,1,4,5}, + {3,2,7,6,1,0,5,4}, + {1,5,3,7,0,4,2,6}, + {5,1,7,3,4,0,6,2}, + {5,4,7,6,1,0,3,2}, + {4,5,6,7,0,1,2,3}, + {4,0,6,2,5,1,7,3}, + {0,4,2,6,1,5,3,7}, + {1,3,0,2,5,7,4,6}, + {3,1,2,0,7,5,6,4}, + {3,2,1,0,7,6,5,4}, + {2,3,0,1,6,7,4,5}, + {2,0,3,1,6,4,7,5}, + {0,2,1,3,4,6,5,7}, + {1,0,5,4,3,2,7,6}, + {0,1,4,5,2,3,6,7}, + {7,3,5,1,6,2,4,0}, + {3,7,1,5,2,6,0,4}, + {7,6,3,2,5,4,1,0}, + {6,7,2,3,4,5,0,1}, + {2,6,0,4,3,7,1,5}, + {6,2,4,0,7,3,5,1}, + {4,6,5,7,0,2,1,3}, + {6,4,7,5,2,0,3,1}, + {7,5,6,4,3,1,2,0}, + {5,7,4,6,1,3,0,2}, + {0,4,1,5,2,6,3,7}, + {4,0,5,1,6,2,7,3}, + {3,1,7,5,2,0,6,4}, + {1,3,5,7,0,2,4,6}, + {5,7,1,3,4,6,0,2}, + {7,5,3,1,6,4,2,0}, + {3,7,2,6,1,5,0,4}, + {7,3,6,2,5,1,4,0}, + {0,2,4,6,1,3,5,7}, + {2,0,6,4,3,1,7,5}, + {5,1,4,0,7,3,6,2}, + {1,5,0,4,3,7,2,6}, + {6,2,7,3,4,0,5,1}, + {2,6,3,7,0,4,1,5}, + {6,4,2,0,7,5,3,1}, + {4,6,0,2,5,7,1,3} + }; + + constexpr int num_isometries = 48; + +}//end namespace internal +}//end namespace Mesh_3 +}//end namespace CGAL + +#endif // CGAL_MESH_3_FEATURES_DETECTION_CUBE_ISOMETRIES_H diff --git a/Mesh_3/include/CGAL/Mesh_3/features_detection/features_detection.h b/Mesh_3/include/CGAL/Mesh_3/features_detection/features_detection.h new file mode 100644 index 00000000000..49b637c8b0c --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/features_detection/features_detection.h @@ -0,0 +1,4011 @@ +// Copyright (c) 2022 GeometryFactory (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) : Sebastien Loriot, Christopher Nicol +// +//****************************************************************************** +// +//****************************************************************************** + + +#ifndef CGAL_MESH_3_FEATURES_DETECTION_H +#define CGAL_MESH_3_FEATURES_DETECTION_H + +#include + +#include + +#include +#include + +#include +#include //std::sqrt + +namespace CGAL +{ +namespace Mesh_3 +{ + +template +std::vector

create_polyline(const double start, + const double end, + P starting_point, + P ending_point, + Functor f, + const int prec) +{ + using Polyline = std::vector

; + Polyline poly; + poly.reserve(prec + 1); + poly.push_back(std::move(starting_point)); +#ifdef CGAL_DEBUG_TRIPLE_LINES + std::cerr << "new poly\n"; + std::cerr << " poly.push_back(" << poly.back() << "\n"; +#endif // CGAL_DEBUG_TRIPLE_LINES + const double step = (end - start) / prec; + const double stop = end - step / 2; + const bool step_is_positive = (step > 0); + for (double t = start + step; + (step_is_positive ? t < stop : t > stop); + t += step) + { + poly.push_back(f(t)); +#ifdef CGAL_DEBUG_TRIPLE_LINES + std::cerr << " poly.push_back(" << poly.back() << ")\n"; +#endif // CGAL_DEBUG_TRIPLE_LINES + } + poly.push_back(std::move(ending_point)); +#ifdef CGAL_DEBUG_TRIPLE_LINES + std::cerr << " poly.push_back(" << poly.back() << ")\n"; +#endif // CGAL_DEBUG_TRIPLE_LINES + return poly; +} + +template +std::vector

create_polyline(const double start, + const double end, + P starting_point, + Functor f, + const int prec) +{ + return create_polyline(start, end, starting_point, f(end), f, prec); +} + +template +std::vector

create_polyline(const double start, + const double end, + Functor f, + const int prec) +{ + return create_polyline

(start, end, f(start), f(end), f, prec); +} + + +/* + c6 ------- c7 + /| /| + / | / | + / | / | + c4 ------- c5 | + | c2 ----|-- c3 + | / | / + | / | / + |/ |/ + c0 ------- c1 + + ci = color at the corner + + The coordinates of the unit cube are given by: + + for(int z = 0; z <=1 ; ++z) + for(int y = 0; y <=1 ; ++y) + for(int x = 0; x <=1 ; ++x) + cube.emplace_back(x, y, z); +*/ + + +// +// One internal corner +// + + // 00001221 + // corner is (1/2,1/2,2/3) + // curve_1 : x=1/2, y=[0,1/2], z=2/3 + // curve_1' : x=1/2, y=[1/2,1], z=2/3 + // curve_2 : x=[0,1/2], y=1/2, z=2/3 + // curve_2' : x=[1/2,1], y=1/2, z=2/3 + // curve_3 : x=1/2, y=1/2, z=[2/3,1] +template +std::vector> poly00001221(const int /* no sampling for segments */) +{ + P corner{ 1. / 2, 1. / 2, 2. / 3 }; + P a{ 1. / 2, 0, 2. / 3 }; + P b{ 1. / 2, 1, 2. / 3 }; + P c{ 0, 1. / 2, 2. / 3 }; + P d{ 1, 1. / 2, 2. / 3 }; + P e{ 1. / 2, 1. / 2, 1 }; + + return + { + { a, corner}, // segment curve_1 + { corner, b}, // segment curve_1' + { corner, c}, // segment curve_2 + { corner, d}, // segment curve_2' + { corner, e}, // segment curve_3 + }; +} +// 00111202 +// corner is (1/2,1/2,2/3) +// curve_1 : x=1/2,y=[0,1/2],z=2/3 +// curve_1' : x=1/2,y=[1/2,1],z=2/3 +// curve_2 : x=1/(3*z),y=1/2,z=[2/3,1] +// ADDED curve_2' : x=1/(3*z),y=1/2,z=[1/3,2/3] +// curve_3 : x=(2*z−1)/z,y=1/2, z=[1/2,2/3] +// REMOVED curve_3' : x=(2*z−1)/z,y=1/2, z=[2/3,1] +template +std::vector> poly00111202(const int prec = 10) +{ + P a{ 1. / 2, 0. , 2. / 3 }; + P corner{ 1. / 2, 1. / 2, 2. / 3 }; + P b{ 1. / 2, 1. , 2. / 3 }; + + auto f_curve_2 = [](double z) { return P(1. / (3 * z), 1. / 2, z); }; + auto f_curve_3 = [](double z) { return P((2. * z - 1) / z, 1. / 2, z); }; + + return + { + { a, corner}, // segment curve_1 + { corner, b}, // segment curve_1' + create_polyline(2. / 3, 1 , corner, f_curve_2, prec), // curve_2 + create_polyline(2. / 3, 1. / 3, corner, f_curve_2, prec), // curve_2' ADDED + create_polyline(2. / 3, 1. / 2, corner, f_curve_3, prec), // curve_3 + // create_polyline(2./3, 1. , corner, f_curve_3, prec), // curve_3' REMOVED + }; +} + +// 01101001 +// corner is (1/2,1/2,1/2) +// curve_1 : x=1/2, y=1/2, z=[0,1/2] +// curve_1' : x=1/2, y=1/2, z=[1/2,1] +// curve_2 : x=1/2, y=[0,1/2], z=1/2 +// curve_2' : x=1/2, y=[1/2,1], z=1/2 +// curve_3 : x=[0,1/2], y=1/2, z=1/2 +// curve_3' : x=[1/2,1], y=1/2, z=1/2 +template +std::vector> poly01101001(const int /* no sampling for segments */) +{ + P corner{ 1. / 2, 1. / 2, 1. / 2 }; + P a{ 1. / 2, 1. / 2, 0 }; + P b{ 1. / 2, 1. / 2, 1 }; + P c{ 1. / 2, 0, 1. / 2 }; + P d{ 1. / 2, 1, 1. / 2 }; + P e{ 0, 1. / 2, 1. / 2 }; + P f{ 1, 1. / 2, 1. / 2 }; + + return + { + { a, corner}, // segment curve_1 + { corner, b}, // segment curve_1' + { corner, c}, // segment curve_2 + { corner, d}, // segment curve_2' + { corner, e}, // segment curve_3 + { corner, f}, // segment curve_3' + }; +} + +// +// Two curves +// +template +std::vector> poly00011022(const int prec = 10) +{ + // x = (3*z^2-2*z)/(3*z^2-1), y = 1/(3*z), z = [1/3,1/2] + // x = (3*z^2-2*z)/(3*z^2-1), y = 1/(3*z), z = [2/3,1] + auto f = [](double z) {return P(z * (3 * z - 2) / (3 * z * z - 1), + 1 / (3 * z), + z); }; + return { + create_polyline

(1. / 3, 1. / 2, f, prec), + create_polyline

(2. / 3, 1. , f, prec), + }; +} + +// 00011221 +// curve_1 : x = ]1/2,1], y = (3 * x * x - sqrt(9 * x * x * x * x - 30 * x * x * x + 45 * x * x - 24 * x + 4) + 3 * x - 2)/(6 * x * (2 * x - 1)), z = 1./(3*x+3*y-6*x*y) +// point limit x = 1/2, y = 0, z = 2/3 +// curve_2 : x = ]0,1/3], y = (3 * x * x + sqrt(9 * x * x * x * x - 30 * x * x * x + 45 * x * x - 24 * x + 4) + 3 * x - 2)/(6 * x * (2 * x - 1)), z = 1./(3*x+3*y-6*x*y) +// point limit x = 0, y = 1/2, z = 2/3 +template +std::vector> poly00011221(const int prec = 10) +{ + auto sq_exp = [](double x) { + return std::sqrt(9 * x * x * x * x - 30 * x * x * x + 45 * x * x - 24 * x + 4); + }; + auto y1 = [sq_exp](double x) { return (3 * x * x - sq_exp(x) + 3 * x - 2) / (6 * x * (2 * x - 1)); }; + P corner1 = { 1. / 2, 0, 2. / 3 }; + auto y2 = [sq_exp](double x) { return (3 * x * x + sq_exp(x) + 3 * x - 2) / (6 * x * (2 * x - 1)); }; + P corner2 = { 0, 1. / 2, 2. / 3 }; + auto z = [](double x, double y) { return 1. / (3 * x + 3 * y - 6 * x * y); }; + return { + create_polyline(1. / 2, 1, corner1, + [y1, z](double x) { return P(x, y1(x), z(x, y1(x))); }, + prec), + create_polyline(0, 1. / 3, corner2, + [y2, z](double x) { return P(x, y2(x), z(x, y2(x))); }, + prec) + }; +} + +// 00011222 +// curve_1 : x = ]1/2,1[, y = (3 * x * x - sqrt(9 * x * x * x * x - 18 * x * x * x + 25 *x * x - 16 * x + 4) + x - 2)/(6 * (x - 1) * x), z = 1./(3*x+3*y-3*x*y) +// point limit x = 1/2, y = 1, z=1/3 +// point limit x = 1, y = 1/2, z=1/3 +// curve_2 : x = ]0,1/2], y = (3 * x * x + sqrt(9 * x * x * x * x - 18 * x * x * x + 25 *x * x - 16 * x + 4) + x - 2)/(6 * (x - 1) * x), z = 1./(3*x+3*y-3*x*y) +// point limit x = 0, y=1/2, z=2/3 +template +std::vector> poly00011222(const int prec = 10) +{ + auto sq_exp = [](double x) { + return std::sqrt(9 * x * x * x * x - 18 * x * x * x + 25 * x * x - 16 * x + 4); + }; + auto y1 = [sq_exp](double x) { return (3 * x * x - sq_exp(x) + x - 2) / (6 * (x - 1) * x); }; + P corner1 = { 1. / 2, 1, 1. / 3 }; + P corner1_bis = { 1, 1. / 2, 1. / 3 }; + auto y2 = [sq_exp](double x) { return (3 * x * x + sq_exp(x) + x - 2) / (6 * (x - 1) * x); }; + P corner2 = { 0, 1. / 2, 2. / 3 }; + auto z = [](double x, double y) { return 1. / (3 * x + 3 * y - 3 * x * y); }; + return { + create_polyline(1. / 2, 1, corner1, corner1_bis, + [y1, z](double x) { return P(x, y1(x), z(x, y1(x))); }, + prec), + create_polyline(0, 1. / 2, corner2, + [y2, z](double x) { return P(x, y2(x), z(x, y2(x))); }, + prec) + }; +} + +// 00121200 +// curve_1 : x = 1/2, y = (3*z-2)/(6*z-3), z = [0,1/3] +// curve_1' : x = 1/2, y = (3*z-2)/(6*z-3), z = [2/3,1] +template +std::vector> poly00121200(const int prec = 10) +{ + auto y = [](double z) { return (3 * z - 2) / (6 * z - 3); }; + return { + create_polyline

(0, 1. / 3, + [y](double z) { return P(1. / 2, y(z), z); }, + prec), + create_polyline

(2. / 3, 1, + [y](double z) { return P(1. / 2, y(z), z); }, + prec) + }; +} + +// 00121221 +// curve_1 : x = 1/2, y = (3*z-2)/(3*z-3), z = [0,2/3] +// curve_2 : x = 1/2, y = z/(3*z-1), z = [1/2,1] +template +std::vector> poly00121221(const int prec = 10) +{ + auto y1 = [](double z) { return (3 * z - 2) / (3 * z - 3); }; + auto y2 = [](double z) { return z / (3 * z - 1); }; + return { + create_polyline

(0, 2. / 3, + [y1](double z) { return P(1. / 2, y1(z), z); }, + prec), + create_polyline

(1. / 2, 1, + [y2](double z) { return P(1. / 2, y2(z), z); }, + prec) + }; +} + +// 00122100 +// curve_1 : x = 1/2, y = (3*z-2)/(6*z-3), z = [0,1/3] +// curve_1' : x = 1/2, y = (3*z-2)/(6*z-3), z = [2/3,1] +template +std::vector> poly00122100(const int prec = 10) +{ + auto y = [](double z) { return (3 * z - 2) / (6 * z - 3); }; + return { + create_polyline

(0, 1. / 3, + [y](double z) { return P(1. / 2, y(z), z); }, + prec), + create_polyline

(2. / 3, 1, + [y](double z) { return P(1. / 2, y(z), z); }, + prec) + }; +} + +// 00122101 +// curve_1 : x = [1/3,1/2] , y = (-sqrt(24 x^3 - 35 x^2 + 18 x - 3) - 5 x + 3)/(6 (x - 1)^2), x^2 - 3 x + 1!=0, +// z = (-sqrt(24 x^3 - 35 x^2 + 18 x - 3) - 7 x + 3)/(6 (x^2 - 3 x + 1)) +// curve_2 : x = [1./2,1[ , y = ( sqrt(24 x^3 - 35 x^2 + 18 x - 3) - 5 x + 3)/(6 (x - 1)^2), +// z = ( sqrt(24 x^3 - 35 x^2 + 18 x - 3) - 7 x + 3)/(6 (x^2 - 3 x + 1)) +// point limit of curve_2 when x -> 1 x = 1, y = 1/2, z = 1/3 +template +std::vector> poly00122101(const int prec = 10) +{ + auto sq_exp = [](double x) { + return std::sqrt(24 * x * x * x - 35 * x * x + 18 * x - 3); + }; + auto y1 = [sq_exp](double x) + { return (-sq_exp(x) - 5 * x + 3) / (6 * (x - 1) * (x - 1)); }; + auto z1 = [sq_exp](double x) + { return (-sq_exp(x) - 7 * x + 3) / (6 * (x * x - 3 * x + 1)); }; + auto y2 = [sq_exp](double x) + { return (sq_exp(x) - 5 * x + 3) / (6 * (x - 1) * (x - 1)); }; + auto z2 = [sq_exp](double x) + { return (sq_exp(x) - 7 * x + 3) / (6 * (x * x - 3 * x + 1)); }; + P corner{ 1., .5, 1. / 3 }; + return { + create_polyline

(1. / 3, 1. / 2, + [y1, z1](double x) { return P(x, y1(x), z1(x)); }, + prec), + create_polyline

(1., 1. / 2, corner, + [y2, z2](double x) { return P(x, y2(x), z2(x)); }, + prec), + }; +} + +// +// One curve +// +template +std::vector> poly00000012(const int prec = 10) +{ + // curve : x = 1/2, y = 2/(3*z), z = [2/3,1] + return { create_polyline

(2. / 3, 1., + [](double z) { return P(0.5, 2. / (3. * z), z); }, + prec) }; +} + +// 00000112 +// x =[1/2,1], y = x/(3 * x - 1), z = (3 * x - 1)/(3 * x * x) +template +std::vector> poly00000112(const int prec = 10) +{ + return { create_polyline

(1. / 2, 1, + [](double x) { return P(x, x / (3 * x - 1), (3 * x - 1) / (3 * x * x)); }, + prec) }; +} + +// 00000121 +// curve : x = 1/(3*z), y = 1/(3*z-1), z = [2/3,1] +template +std::vector> poly00000121(const int prec = 10) +{ + return { create_polyline

(2. / 3, 1, + [](double z) { return P(1 / (3 * z), 1 / (3 * z - 1), z); }, + prec) }; +} + +// 00001112 +// curve : x = 1/(2*y), y = [1/2, 1],z = 2/3 +template +std::vector> poly00001112(const int prec = 10) +{ + return { create_polyline

(1. / 2, 1, + [](double y) { return P(1 / (2 * y), y, 2. / 3); }, + prec) }; +} + +// 00001122 +// curve : x = [0,1], y = 1/2, z = 2/3 +template +std::vector> poly00001122(const int prec = 10) +{ + return { create_polyline

(0, 1, + [](double x) { return P(x, 1. / 2, 2. / 3); }, + prec) }; +} + +// 00010121 +// curve : x =y * z / (z+y), y = ((3 * z * z - 1) - sqrt(CGAL::square(1 - 3 * z * z) - 12 * (z - 1) * z * z))/(6 * (z - 1) * z), z=[1,1/2[ +// point limit = (1/3, 1/2, 1) +template +std::vector> poly00010121(const int prec = 10) +{ + auto y = [](double z) { return ((3 * z * z - 1) - std::sqrt((1. - 3 * z * z)*(1. - 3 * z * z) - 12 * (z - 1) * z * z)) / (6 * (z - 1) * z); }; + auto x = [](double y, double z) { return y * z / (z + y); }; + P corner(1. / 3, 1. / 2, 1); + return { create_polyline

(1, 1. / 2, corner, + [x, y](double z) { return P(x(y(z), z), y(z), z); }, + prec) }; +} + +// 00010122 +// curve : x = z/(3*z^2-2*z+1), y = 1/(3*z), z = [1/3,1] +template +std::vector> poly00010122(const int prec = 10) +{ + return { create_polyline

(1. / 3, 1, + [](double z) { return P(z / (3 * z * z - 2 * z + 1), 1. / (3 * z), z); }, + prec) }; +} +// 00011002 +// curve : x = (y+1)/(4*y-1), y = [2/3,1], z = 1/2 +template +std::vector> poly00011002(const int prec = 10) +{ + return { create_polyline

(2. / 3, 1, + [](double y) { return P((y + 1) / (4 * y - 1), y, 1. / 2); }, + prec) }; +} +// 00011012 +// curve : x = (3*z^2-2*z+1)/(3*z^2), y = z/(3*z^2-2*z+1), z = [1/2, 1] +template +std::vector> poly00011012(const int prec = 10) +{ + return { create_polyline

(1. / 2, 1, + [](double z) { return P((3 * z * z - 2 * z + 1) / (3 * z * z), z / (3 * z * z - 2 * z + 1), z); }, + prec) }; +} +// 00011110 +// curve : x = 1/(2*y), y = [1/2,1], z = 1/2 +template +std::vector> poly00011110(const int prec = 10) +{ + return { create_polyline

(1. / 2, 1, + [](double y) { return P(1. / (2 * y), y, 1. / 2); }, + prec) }; +} +// 00011120 +// curve : x = (3*z^2-2*z)/(3*z^2-1), y = (3*z^2-1)/(6*z^2-3*z), z = [2/3,1] +template +std::vector> poly00011120(const int prec = 10) +{ + return { create_polyline

(2. / 3, 1, + [](double z) { return P((3 * z * z - 2 * z) / (3 * z * z - 1), (3 * z * z - 1) / (6 * z * z - 3 * z), z); }, + prec) }; +} +// 00011121 +// curve : x = (3*z^2-2*z)/(3*z^2-z-1), y = (3*z^2-z-1)/(3*z^2-3*z), z =[1/2,2./3] +template +std::vector> poly00011121(const int prec = 10) +{ + return { create_polyline

(1. / 2, 2. / 3, + [](double z) { return P((3 * z * z - 2 * z) / (3 * z * z - z - 1), (3 * z * z - z - 1) / (3 * z * z - 3 * z), z); }, + prec) }; +} +// 00011122 +// curve : x = (3*z*z-2*z)/(z-1),y = 1/(3*z),z = [1/3, 2/3] +// +template +std::vector> poly00011122(const int prec = 10) +{ + return { create_polyline

(1. / 3,2. / 3, + [](double z) { return P((3 * z * z - 2 * z) / (z - 1), 1 / (3 * z), z); }, + prec) }; +} + +// 00011220 +// curve : x=[0,1/2], y = (2 * x - 1)/(3 * x - 2), z = (2 * (x^2 - 2 * x + 1))/(5 * x^2 - 7 * x + 3) +template +std::vector> poly00011220(const int prec = 10) +{ + return { create_polyline

(0, 1. / 2, + [](double x) { return P(x, (2 * x - 1) / (3 * x - 2), (2 * (x * x - 2 * x + 1)) / (5 * x * x - 7 * x + 3)); }, + prec) }; +} +// 00012002 +// curve_1 : x = [2/3,1], y = (3 * x*x + sqrt(9 * x*x*x*x - 24 * x*x*x + 30 * x*x - 12 * x + 1) - 1)/(6 * x * (2 * x - 1)), z = 1 - 1./(3*x*y) +template +std::vector> poly00012002(const int prec = 10) +{ + auto y = [](double x) { return (3 * x * x + std::sqrt(9 * x * x * x * x - 24 * x * x * x + 30 * x * x - 12 * x + 1) - 1) / (6 * x * (2 * x - 1)); }; + return { create_polyline

(2. / 3, 1, + [y](double x) { return P(x, y(x), 1 - 1. / (3 * x * y(x))); }, + prec) }; +} +// 00012012 +// curve_1 : x = [0, 1/2[ , y = 1./(-6*x*z+3*x+3*z), z = (3 *x*x + sqrt(9 *x*x*x*x - 18 *x*x*x + 25 *x*x - 16 * x + 4) - 7 * x + 2)/(6 *(x - 1) * (2 * x - 1)) +// curve_1 : x = ]1/2,1[, y = 1./(-6*x*z+3*x+3*z), z = (3 *x*x + sqrt(9 *x*x*x*x - 18 *x*x*x + 25 *x*x - 16 * x + 4) - 7 * x + 2)/(6 *(x - 1) * (2 * x - 1)) +// point limit x = 1, y = 2/3, z = 1/2 +// point limit x = 1/2, y= 2./3, z = 2./3); +// +template +std::vector> poly00012012(const int prec = 10) +{ + auto y = [](double x, double z) { return 1. / (-6 * x * z + 3 * x + 3 * z); }; + auto z = [](double x) { return (3 * x * x + std::sqrt(9 * x * x * x * x - 18 * x * x * x + 25 * x * x - 16 * x + 4) - 7 * x + 2) / (6 * (x - 1) * (2 * x - 1)); }; + P corner1(1. / 2, 2. / 3, 2. / 3); + P corner2(1, 2. / 3, 1. / 2); + return { create_polyline

(1. / 2, 0, corner1, + [y, z](double x) { return P(x, y(x, z(x)), z(x)); }, + prec), + create_polyline

(1. / 2, 1, corner1, corner2, + [y, z](double x) { return P(x, y(x, z(x)), z(x)); }, + prec) + }; +} +// 00012021 +// curve : x = (3*z-1)/(3*z), y = z/(3*z-1), z = [1/2,1] +template +std::vector> poly00012021(const int prec = 10) +{ + return { create_polyline

(1. / 2, 1, + [](double z) { return P((3 * z - 1) / (3 * z), z / (3 * z - 1), z); }, + prec) }; +} +// 00012110 +// curve : x=]0,1/2], y = (3 * x * x + sqrt(9 * x * x * x * x - 18 * x * x * x + 25 * x * x - 16 * x + 4) + x - 2)/(6 * (x - 1) * x), z = (3*x*y-1)/(9*x*y-3*x-3*y) +// point limit : x = 0, y = 1/2, z = 2/3 +// +template +std::vector> poly00012110(const int prec = 10) +{ + auto y = [](double x) { return (3 * x * x + std::sqrt(9 * x * x * x * x - 18 * x * x * x + 25 * x * x - 16 * x + 4) + x - 2) / (6 * (x - 1) * x); }; + auto z = [](double x, double y) { return (3 * x * y - 1) / (9 * x * y - 3 * x - 3 * y); }; + P corner(0, 1. / 2, 2. / 3); + return { create_polyline

(0, 1. / 2, corner, + [y, z](double x) { return P(x, y(x), z(x, y(x))); }, + prec) }; +} +// 00012112 +// x = ]0,1/2[, y = (3 * x*x + sqrt(9 * x * x * x * x - 36 * x * x * x + 40 * x * x - 20 * x + 4) + 2 * x - 2)/(6 * x * (2 * x - 1)), z = (3*x*y-1)/(9*x*y-3*x-3*y) +// point limit x = 0, y = 1/2, z = 2/3 +// point limit x = 1/2, y = 0, z = 2/3 +// +template +std::vector> poly00012112(const int prec = 10) +{ + auto y = [](double x) { return (3 * x * x + std::sqrt(9 * x * x * x * x - 36 * x * x * x + 40 * x * x - 20 * x + 4) + 2 * x - 2) / (6 * x * (2 * x - 1)); }; + auto z = [](double x, double y) { return (3 * x * y - 1) / (9 * x * y - 3 * x - 3 * y); }; + P corner1(0, 1. / 2, 2. / 3); + P corner2(1. / 2, 0, 2. / 3); + return { create_polyline

(0, 1. / 2, corner1, corner2, + [y, z](double x) { return P(x, y(x), z(x, y(x))); }, + prec) }; +} + +// 00012120 +// curve : x = (3*z-1)/(3*z), y = (3*z^2-2*z)/(6*z^2-5*z+1), z = [2/3,1] +template +std::vector> poly00012120(const int prec = 10) +{ + return { create_polyline

(2. / 3, 1, + [](double z) { return P((3 * z - 1) / (3 * z), (3 * z * z - 2 * z) / (6 * z * z - 5 * z + 1), z); }, + prec)}; +} +// +// 00012121 +// curve : x = (3*z-1)/(3*z), y = (3*z^2-2*z)/(3*z^2-4*z+1), z = [1/2,2/3] +template +std::vector> poly00012121(const int prec = 10) +{ + return { create_polyline

(1. / 2, 2. / 3, + [](double z) { return P((3 * z - 1) / (3 * z), (3 * z * z - 2 * z) / (3 * z * z - 4 * z + 1), z); }, + prec) }; +} +// 00012122 +// curve : x = (6*z^2-6*z+1)/(3*z^2-3*z), y = (3*z^2-2*z)/(6*z^2-6*z+1), z = [1/3,2/3] +template +std::vector> poly00012122(const int prec = 10) +{ + auto x = [](double z) { return (6 * z * z - 6 * z + 1) / (3 * z * z - 3 * z); }; + auto y = [](double z) { return (3 * z * z - 2 * z) / (6 * z * z - 6 * z + 1); }; + return { create_polyline

(1. / 3, 2. / 3, + [x,y](double z) { return P(x(z), y(z), z); }, + prec) }; +} +// 00012221 +// curve : x = 1/(3*y),y = [1/3,1],z = 1/2 +template +std::vector> poly00012221(const int prec = 10) +{ + return { create_polyline

(1. / 3, 1, + [](double y) { return P(1. / (3 * y),y , 1. / 2); }, + prec) }; +} + +// 00111100 +// curve : x = [0,1], y = 1/2, z = 1/2 +template +std::vector> poly00111100(const int prec = 10) +{ + return { create_polyline

(0, 1, + [](double x) { return P(x , 1. / 2, 1. / 2); }, + prec) }; +} + +// 00111102 +// curve : x = (2*z-1)/(3*z^2-z), y = (3*z-1)/(6*z-3), z = [2/3,1] +template +std::vector> poly00111102(const int prec = 10) +{ + return { create_polyline

(2. / 3, 1, + [](double z) { return P((2 * z - 1) / (3 * z * z - z), (3 * z - 1) / (6 * z - 3), z); }, + prec) }; +} + +// 00111220 +// segment 1/2 0 2/3 1/2 1 2/3 +template +std::vector> poly00111220(const int /*not needed for a segment*/) +{ + return { { P(1. / 2, 0, 2. / 3), P(1. / 2, 1, 2. / 3) } }; +} + +// 00121201 +// curve_1 : x =[1/2, 2/3], y = (-sqrt(-24 * x^3 + 37 * x^2 - 20 * x + 4) + 5 * x - 2)/(6 * x^2), z = ( sqrt(-24 * x^3 + 37 * x^2 - 20 * x + 4) + 5 * x - 2)/(6 * x^2) +// curve_2 : x =[1/2, 2/3], y = ( sqrt(-24 * x^3 + 37 * x^2 - 20 * x + 4) + 5 * x - 2)/(6 * x^2), z = (-sqrt(-24 * x^3 + 37 * x^2 - 20 * x + 4) + 5 * x - 2)/(6 * x^2) +// point 0 1/2 1/2 +template +std::vector> poly00121201(const int prec = 10) +{ + auto sq_exp = [](double x) { + return std::sqrt(-24 * x * x * x + 37 * x * x - 20 * x + 4); + }; + auto y = [sq_exp](double x) { return (-sq_exp(x) + 5 * x - 2) / (6 * x * x); }; + auto z = [sq_exp](double x) { return (sq_exp(x) + 5 * x - 2) / (6 * x * x); }; + P corner{ 2. / 3, y(2. / 3), z(2. / 3) }; + return { + create_polyline

(2. / 3, 1. / 2, corner, + [y, z](double x) { return P(x, y(x), z(x)); }, + prec), + create_polyline

(2. / 3, 1. / 2, corner, + [y, z](double x) { return P(x, z(x), y(x)); }, + prec), + // { P(0., .5, .5), P(0., .5, .5) } + }; +} + + +inline double limit_value(double bound, double direction, double epsilon=1e-6) +{ + return bound + direction * epsilon; +} + +// 00000123 +// curve 1 : x =1/2, y = -(z-2.)/(2.*z), z = [2/3, 1] +// curve 2 : x = -(z/2.-1)/z, y = 1./2., z =[2/3, 1] +template +std::vector> poly00000123(const int prec = 10) +{ + return { + create_polyline(2./3, 1., P(1./2, 1, 2./3), + [](double z) { return P( 1./2, -(z-2.)/(2.*z), z); }, + prec), + create_polyline(2./3, 1., P(1, 1./2, 2./3), + [](double z) { return P(-(z-2.)/(2.*z), 1./2, z); }, + prec), +}; +} + + +//00001123 +// curve 1 : x = (3*z - 2)/(2*z - 1), y = (2*z - 1)/z, z = [2/3, 3/4] +// curve 2 : x = -(z - 1)/(2*z - 1), y = (2*z - 1)/z, z = [2/3, 3/4] +// curve 3 : x =1/2, y = -2*(z - 1)/z, z = [2/3, 3/4] +// curve 4 : x = 1/2, y = 2/3, z = [3/4,1] +template +std::vector> poly00001123(const int prec = 10) +{ +return { + create_polyline(2./3, 3./4, P(0, 1./2, 2./3), + [](double z) { return P( (3*z - 2)/(2*z - 1), (2*z - 1)/z, z); }, + prec), + create_polyline(2./3, 3./4, P(1, 1./2, 2./3), + [](double z) { return P( -(z - 1)/(2*z - 1),(2*z - 1)/z, z); }, + prec), + create_polyline(2./3, 3./4, P(1./2, 1, 2./3), + [](double z) { return P( 1./2,-2*(z - 1)/z, z); }, + prec), + create_polyline(3./4, 1., P(1./2, 2./3, 3./4),P(1./2,2./3.,1.), + [](double z) { return P( 1./2,2./3, z); }, + prec), +}; +} + +//00001223 + +// curve 1 : x = -(z*(-sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z)) - 5*z + 3)/z, y = -sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z), z = [2/3, 9/13] +// curve 2 : x = -(z*(sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z)) - 5*z + 3)/z, y = sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z), z = [2/3, 9/13] +// curve 3 : x = -(z*(-sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z)) + 3*z - 3)/z, y = -sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z), z = [2/3, 9/13] +// curve 4 : x = -(z*(sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z)) + 3*z - 3)/z, y = sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z), z = [2/3, 9/13] +template +std::vector> poly00001223(const int prec = 10) +{ +return { + create_polyline(2./3, 9./13, P(1./2, 0., 2./3), + [](double z) { return P( -(z*(-std::sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z)) - 5*z + 3)/z, -std::sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z), z); }, + prec), + create_polyline(2./3, 9./13, P(0., 1./2, 2./3), + [](double z) { return P( -(z*(std::sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z)) - 5*z + 3)/z, std::sqrt((z - 1)*(13*z - 9))/(2*z) + (5*z - 3)/(2*z), z); }, + prec), + create_polyline(2./3, 9./13, P(1., 1./2, 2./3), + [](double z) { return P(-(z*(-std::sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z)) + 3*z - 3)/z, -std::sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z), z); }, + prec), + create_polyline(2./3, 9./13, P(1./2, 1., 2./3), + [](double z) { return P( -(z*(std::sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z)) + 3*z - 3)/z, std::sqrt((z - 1)*(13*z - 9))/(2*z) - 3*(z - 1)/(2*z), z); }, + prec), +}; +} + +//00010123 +// curve 1 : x = -(3*z - 1)*(z*z /(3*z - 1) - 1)/(2*z*z), y = z/(3*z - 1), z = [1/2,1] +// curve 2 : x = 1./2, y = -(z - 2)/(z + 1), z = [1/2,1] +template +std::vector> poly00010123(const int prec = 10) +{ +return { + create_polyline(1./2, 1., P(1./2, 1., 1./2), + [](double z) { return P(-(3*z - 1)*(z*z /(3*z - 1) - 1)/(2*z*z), z/(3*z - 1),z); }, + prec), + create_polyline(1./2, 1., P(1./2, 1., 1./2), + [](double z) { return P( 1./2 , -(z - 2)/(z + 1),z); }, + prec), + +}; +} + +//00010230 +// no curves +template +std::vector> poly00010230(const int /*prec*/ = 10) +{ +return { + + +}; +} + +//00010231 +// curve 1 : x = (z + 1)*(z**2/(z + 1) - 1)/(z*(z - 3)), y = z/(z + 1), z = [1/2,1] +// curve 2 : x = (z + 1 + (z**2 - 3*z)*(z**2 - z - 1)/(z*(z - 3)))/(z*(z + 1)), y = (z**2 - z - 1)/(z*(z - 3)), z = [1/2,1] +template +std::vector> poly00010231(const int prec = 10) +{ +return { + create_polyline(1./2, 1., P(1., 1./3, 1./2), + [](double z) { return P((z + 1)*(z*z/(z + 1) - 1)/(z*(z - 3)), z/(z + 1),z); }, + prec), + create_polyline(1./2, 1., P(1./3, 1., 1./2), + [](double z) { return P((z + 1 + (z*z - 3*z)*(z*z - z - 1)/(z*(z - 3)))/(z*(z + 1)), (z*z - z - 1)/(z*(z - 3)),z); }, + prec), + +}; +} + +//00011023 + +// curve 1 : x = -(-2*z**2 + z + (z**2 - 3*z)*(-(z**2 + z + 1)/(2*z*(z - 3)) + sqrt(z**4 + 6*z**3 - 9*z**2 + 2*z + 1)/(2*z*(z - 3))) + 1)/(2*z**2), y = -(z**2 + z + 1)/(2*z*(z - 3)) + sqrt(z**4 + 6*z**3 - 9*z**2 + 2*z + 1)/(2*z*(z - 3)), z = [2/3,1] +// curve 2 : x = 1/2, y = -(z - 2)/(z + 1), z = [1/2,1] +// curve 3 : x = [1/2,1[, y = (sqrt(8*x*x*x - 3*x*x - 2*x + 1) + x + 1)/(2*x*(2*x + 1)), z = (sqrt(8*x*x*x - 3*x*x - 2*x + 1) - x - 1)/(2*(2*x*x - x - 1))) +template +std::vector> poly00011023(const int prec = 10) +{ +return { + create_polyline(2./3, 1., P(0, 1./2, 2./3), + [](double z) { return P(-(-2*z*z + z + (z*z - 3*z)*(-(z*z + z + 1)/(2*z*(z - 3)) + std::sqrt(z*z*z*z + 6*z*z*z - 9*z*z + 2*z + 1)/(2*z*(z - 3))) + 1)/(2*z*z) , -(z*z + z + 1)/(2*z*(z - 3)) + std::sqrt(z*z*z*z + 6*z*z*z - 9*z*z + 2*z + 1)/(2*z*(z - 3)) ,z); }, + prec), + create_polyline(1./2, 1., P(1./2, 1., 1./2), + [](double z) { return P(1./2,-(z - 2)/(z + 1) ,z); }, + prec), + create_polyline(1./2, limit_value(1.,-1.), P(1./2, 1.,1./2), + [](double x) { return P(x, (std::sqrt(8*x*x*x - 3*x*x - 2*x + 1) + x + 1)/(2*x*(2*x + 1)) ,(std::sqrt(8*x*x*x - 3*x*x - 2*x + 1) - x - 1)/(2*(2*x*x - x - 1)) ); }, + prec), + + +}; +} + +//00011123 +// curve 1 : x = z*(3*z - 2)/(2*z*z - 1), y = (2*z*z - 1)/(z*(4*z - 3)), z = [1/2.2/3] +// curve 2 : x = 1./2, y = [2/3,1], z = y/(2*(-1 + 2*y)) +// problem with close polylines, there is an over refinement +template +std::vector> poly00011123(const int prec = 10) +{ +return { + create_polyline(1./2, 2./3, P(1./2, 1., 1./2),P(0., 1./2, 2./3), + [](double z) { return P(z*(3*z - 2)/(2*z*z - 1) , (2*z*z - 1)/(z*(4*z - 3)) ,z); }, + prec), + create_polyline( 2./3,1., P(1./2, 2./3, 1.),P(1./2, 1., 1./2), + [](double y) { return P(1./2,y,y/(2*(-1 + 2*y))); }, + prec) +}; +} + +//00011223 +// curve 1 : x = [1/2,3/5[U ]3/5,1], y = (-2 + 2*x + 3*x*x - sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*x*(-3 + 5*x)), z = (2 - 2*x + 3*x*x - sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*(3 - 5*x + 4*x*x)) +// curve 2 : x = ]0,1/2], y = (-2 + 2*x + 3*x*x + sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*x*(-3 + 5*x)), z = (2 - 2*x + 3*x*x + sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*(3 - 5*x + 4*x*x)) +// curve 3 : x = -(-3*z + (4*z - 1)*(3*z/(2*(4*z - 1)) + sqrt(-z*(7*z - 4))/(2*(4*z - 1))))/(4*z - 1), y = 3*z/(2*(4*z - 1)) + sqrt(-z*(7*z - 4))/(2*(4*z - 1)), z = [1/2,4/7] +// curve 4 : x = -(-3*z + (4*z - 1)*(3*z/(2*(4*z - 1)) - sqrt(-z*(7*z - 4))/(2*(4*z - 1))))/(4*z - 1), y = 3*z/(2*(4*z - 1)) - sqrt(-z*(7*z - 4))/(2*(4*z - 1)), z = [1/2,4/7] +// problem with close polylines, there is an over refinement +template +std::vector> poly00011223(const int prec = 10) +{ +return { + create_polyline( 1./2,4./7, P(1./2, 1., 1./2),P(2./3, 2./3, 4./7), + [](double z) { return P(-(-3*z + (4*z - 1)*(3*z/(2*(4*z - 1)) + std::sqrt(-z*(7*z - 4))/(2*(4*z - 1))))/(4*z - 1),3*z/(2*(4*z - 1)) + std::sqrt(-z*(7*z - 4))/(2*(4*z - 1)),z); }, + prec), + create_polyline( 1./2,4./7, P(1., 1./2, 1./2),P(2./3, 2./3, 4./7), + [](double z) { return P(-(-3*z + (4*z - 1)*(3*z/(2*(4*z - 1)) - std::sqrt(-z*(7*z - 4))/(2*(4*z - 1))))/(4*z - 1),3*z/(2*(4*z - 1)) - std::sqrt(-z*(7*z - 4))/(2*(4*z - 1)),z); }, + prec), + create_polyline( 1./2,limit_value(3./5,-1.), P(1./2, 1., 1./2),P(3./5,5./7,5./9), + [](double x) { return P(x,(-2. + 2*x + 3*x*x - std::sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*x*(-3 + 5*x)),(2. - 2*x + 3*x*x - std::sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*(3 - 5*x + 4*x*x)) ); }, + prec), + create_polyline(limit_value(3./5,1.),1.,P(3./5,5./7,5./9),P(1., 1./2, 1./2), + [](double x) { return P(x,(-2. + 2*x + 3*x*x - std::sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*x*(-3 + 5*x)),(2. - 2*x + 3*x*x - std::sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*(3 - 5*x + 4*x*x)) ); }, + prec), + create_polyline( limit_value(0.,1.), 1./2, P(0., 1./2, 2./3),P(1./2, 0., 2./3), + [](double x) { return P(x,(-2. + 2*x + 3*x*x + std::sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*x*(-3 + 5*x)),(2. - 2*x + 3*x*x + std::sqrt(4 - 20*x + 36*x*x - 28*x*x*x + 9*x*x*x*x))/(2*(3 - 5*x + 4*x*x)) ); }, + prec), +}; +} +//00011230 +//curve 1 : x = -(-4*z*z + z + (3*z*z - z)*((5*z*z - z - 1)/(2*z*(3*z - 1)) - sqrt(-11*z*z*z*z + 26*z*z*z - 17*z*z + 2*z + 1)/(2*z*(3*z - 1))) + 1)/(z*(5*z - 3)), y = (5*z*z - z - 1)/(2*z*(3*z - 1)) - sqrt(-11*z*z*z*z + 26*z*z*z - 17*z*z + 2*z + 1)/(2*z*(3*z - 1)), z = [2/3,1] +//curve 2 : x = ]0,1/2], y = (-2 + x + x*x + sqrt(4 - 16*x + 25*x*x - 14*x*x*x + x*x*x*x))/(2*x*(-3 + 4*x)), z = (2 - x + x*x + sqrt(4 - 16*x + 25*x*x - 14*x*x*x + x*x*x*x))/(2*(3 - 5*x + 3*x*x)) +template +std::vector> poly00011230(const int prec = 10) +{ +return { + create_polyline(2./3, 1., P(1./2, 0.,2./3), P(1./2,1./2,1.), + [](double z) { return P(-(-4*z*z + z + (3*z*z - z)*((5*z*z - z - 1)/(2*z*(3*z - 1)) - std::sqrt(-11*z*z*z*z + 26*z*z*z - 17*z*z + 2*z + 1)/(2*z*(3*z - 1))) + 1)/(z*(5*z - 3)),(5*z*z - z - 1)/(2*z*(3*z - 1)) - std::sqrt(-11*z*z*z*z + 26*z*z*z - 17*z*z + 2*z + 1)/(2*z*(3*z - 1)),z ); }, + prec), + create_polyline(limit_value(0.,1.), 1./2, P(0., 1./2,2./3), P(1./2,1./2,1.), + [](double x) { return P(x,(-2 + x + x*x + std::sqrt(4 - 16*x + 25*x*x - 14*x*x*x + x*x*x*x))/(2*x*(-3 + 4*x)),(2 - x + x*x + std::sqrt(4 - 16*x + 25*x*x - 14*x*x*x + x*x*x*x))/(2*(3 - 5*x + 3*x*x))); }, + prec), + +}; +} + +//00011231 +//curve 1 : x = [1/2,1], y = (-1 + 2*x + 3*x*x - sqrt(1 - 8*x + 22*x*x - 20*x*x*x + 9*x*x*x*x))/(2*x*(-1 + 4*x)), z = (1 - 2*x + 3*x*x - sqrt(1 - 8*x + 22*x*x - 20*x*x*x + 9*x*x*x*x))/(2*(1 - 3*x + 2*x*x)) +//curve 2 : x = [0,1/3], y = (-2 + 2*x + x*x + sqrt(4 - 20*x + 28*x*x - 12*x*x*x + x*x*x*x))/(2*x*(-3 + 4*x)), z = (2 - 2*x + x*x + sqrt(4 - 20*x + 28*x*x - 12*x*x*x + x*x*x*x))/(2*(3 - 5*x + 2*x*x)) +template +std::vector> poly00011231(const int prec = 10) +{ +return { + create_polyline(1./2, 1., P(1./2, 0.,2./3), P(1.,1./3,1./2), + [](double x) { return P(x,(-1 + 2*x + 3*x*x - std::sqrt(1 - 8*x + 22*x*x - 20*x*x*x + 9*x*x*x*x))/(2*x*(-1 + 4*x)),(1 - 2*x + 3*x*x - std::sqrt(1 - 8*x + 22*x*x - 20*x*x*x + 9*x*x*x*x))/(2*(1 - 3*x + 2*x*x)) ); }, + prec), + create_polyline(0., 1./3, P(0.,1./2,2./3), P(1./3,1.,1./2), + [](double x) { return P(x,(-2 + 2*x + x*x + std::sqrt(4 - 20*x + 28*x*x - 12*x*x*x + x*x*x*x))/(2*x*(-3 + 4*x)) ,(2 - 2*x + x*x + std::sqrt(4 - 20*x + 28*x*x - 12*x*x*x + x*x*x*x))/(2*(3 - 5*x + 2*x*x)) ); }, + prec), +}; +} + +//00011232 +//curve 1 : x = [1/2,1[, y = (-1 + 3*x*x - sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(-1 + x)*x), z = (1 + 3*x*x - sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(1 + 2*x*x)) +//curve 2 : x = [0.366025,1./2], y = (-1 + 3*x*x + sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(-1 + x)*x), z = (1 + 3*x*x + sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(1 + 2*x*x)) +//curve 3 : x = -(-3.*z*z + z + (3*z*z - 3*z)*((2*z + 1)/(6*z) - sqrt(-8*z*z + 4*z + 1)/(6*z)) + 1)/(z*(2*z - 1)), y = (2*z + 1)/(6*z) - sqrt(-8.*z*z + 4*z + 1)/(6*z), z = [2./3,(1+1.73205)/4] +//curve 4 : x = [0.366025,1./2], y = -x/(-1 + x), z = (-1 + x + x*x)/(-1 + 2*x*x) +//curve 5 : x = [1./3,0.366025], y = -x/(-1 + x), z = -(x*x)/(1 - 4*x + 2*x*x) +template +std::vector> poly00011232(const int prec = 10) +{ +return { + create_polyline(1./2,limit_value(1.,-1.), P(1./2, 1.,1./2), P(1.,1./2,1./3), + [](double x) { return P(x,(-1 + 3*x*x - std::sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(-1 + x)*x),(1 + 3*x*x - std::sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(1 + 2*x*x)) ); }, + prec), + create_polyline(0.366025,1./2, P(0.366025,0.57735,(1+1.73205)/4), P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 3*x*x + std::sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(-1 + x)*x),(1 + 3*x*x + std::sqrt(1 - 4*x + 6*x*x - 8*x*x*x + 9*x*x*x*x))/(2*(1 + 2*x*x)) ); }, + prec), + create_polyline(2./3,(1+1.73205)/4.,P(0.,1./2,2./3),P(0.366025,0.57735,(1+1.73205)/4), + [](double z) { return P( -(-3.*z*z + z + (3*z*z - 3*z)*((2*z + 1)/(6*z) - std::sqrt(-8*z*z + 4*z + 1)/(6*z)) + 1)/(z*(2*z - 1)),(2*z + 1)/(6*z) - std::sqrt(-8.*z*z + 4*z + 1)/(6*z),z); }, + prec), + create_polyline(0.366025,1./2,P(0.366025,0.57735,(1+1.73205)/4),P(1./2,1.,1./2), + [](double x) { return P( x,-x/(-1 + x),(-1 + x + x*x)/(-1 + 2*x*x)); }, + prec), + create_polyline(1./3,0.366025,P(1./3,1./2,1.),P(0.366025,0.57735,(1+1.73205)/4), + [](double x) { return P( x,-x/(-1 + x),-(x*x)/(1 - 4*x + 2*x*x)); }, + prec), +}; +} + +//00012003 +// curve 1 : x = [2/3,1], y = (1 + x)/(-1 + 4*x), z = 1/2 +template +std::vector> poly00012003(const int prec = 10) +{ +return { + create_polyline(2./3, 1., P(2./3, 1.,1./2), P(1.,2./3,1./2), + [](double x) { return P(x,(1 + x)/(-1 + 4*x) ,1./2); }, + prec), + +}; +} + +//00012013 +// curve 1 : x = -(-5*z*z + 6*z + (z*z - 3*z)*((2*z*z - 6*z + 1)/(2*z*(z - 3)) + sqrt(4*z*z*z*z - 20*z*z*z + 28*z*z - 12*z + 1)/(2*z*(z - 3))) - 1)/(z*(5*z - 3)), y = (2*z*z - 6*z + 1)/(2*z*(z - 3)) + sqrt(4*z*z*z*z - 20*z*z*z + 28*z*z - 12*z + 1)/(2*z*(z - 3)), z = [2/3,1] +// curve 2 : x = (3*z*z - 4*z + 1 - (z*z + z)*(2*z*z - 4*z + 1)/(z*(z + 1)))/(z*(3*z - 1)), y = -(2*z*z - 4*z + 1)/(z*(z + 1)), z = [1/2,1] +template +std::vector> poly00012013(const int prec = 10) +{ +return { + create_polyline(2./3, 1., P(0., 1./2,2./3), P(1./2,1./2,1.), + [](double z) { return P(-(-5*z*z + 6*z + (z*z - 3*z)*((2*z*z - 6*z + 1)/(2*z*(z - 3)) + std::sqrt(4*z*z*z*z - 20*z*z*z + 28*z*z - 12*z + 1)/(2*z*(z - 3))) - 1)/(z*(5*z - 3)), (2*z*z - 6*z + 1)/(2*z*(z - 3)) + std::sqrt(4*z*z*z*z - 20*z*z*z + 28*z*z - 12*z + 1)/(2*z*(z - 3)) ,z ); }, + prec), + create_polyline(1./2, 1., P(1., 2./3,1./2), P(1./2,1./2,1.), + [](double z) { return P( (3*z*z - 4*z + 1 - (z*z + z)*(2*z*z - 4*z + 1)/(z*(z + 1)))/(z*(3*z - 1)), -(2*z*z - 4*z + 1)/(z*(z + 1)),z ); }, + prec), + +}; +} + +//00012023 +// curve 1 : x = 2*z/(2*z + 1), y = 1/(2*z), z = [1/2,1] +// curve 2 : x = [1/2,1], y = (x+1)/(3*x), z = 1/2 +// problem with close polylines, there is an over refinement +template +std::vector> poly00012023(const int prec = 10) +{ +return { + create_polyline(1./2, 1., P(1./2, 1.,1./2), + [](double z) { return P(2*z/(2*z + 1),1/(2*z) ,z ); }, + prec), + create_polyline(1./2, 1., P(1./2, 1.,1./2), + [](double x) { return P(x,(x+1)/(3*x) ,1./2 ); }, + prec), + +}; +} + +//00012033 +// curve 1 : x = ((z*z - 2*z + 1 - (z*z - 2*z)*(2*z*z - 2*z + 1)/(z*(z - 2)))/(z*(z - 1)) , y = -(2*z*z - 2*z + 1)/(z*(z - 2)), z = [1/3,1/2] +// curve 2 : x = (z + (z + 2)*((z + 1)/(z + 2) - sqrt(z*z + z - 1)/(z + 2)) - 2)/(z - 1), y = (z + 1)/(z + 2) - sqrt(z*z + z - 1)/(z + 2), z = [2/3,1[ +template +std::vector> poly00012033(const int prec = 10) +{ +return { + create_polyline(1./3, 1./2, P(1./2, 1.,1./3), P(1., 2./3,1./2), + [](double z) { return P((z*z - 2*z + 1 - (z*z - 2*z)*(2*z*z - 2*z + 1)/(z*(z - 2)))/(z*(z - 1)) ,-(2*z*z - 2*z + 1)/(z*(z - 2)) ,z ); }, + prec), +create_polyline(2./3,limit_value(1.,-1.), P(0., 1./2,2./3), P(1./2, 1./3,1.), + [](double z) { return P((z + (z + 2)*((z + 1)/(z + 2) - std::sqrt(z*z + z - 1)/(z + 2)) - 2)/(z - 1) ,(z + 1)/(z + 2) - std::sqrt(z*z + z - 1)/(z + 2) ,z ); }, + prec), +}; +} + +//00012113 +// curve 1 : x = -(-8*z*z + 7*z + (4*z*z - 3*z)*(-(z - 1.)*sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3))) - 1)/(z*(4*z - 3)), y = -(z - 1)*sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3)), z = [(3.+ 2.23606)/8, 2./3] +// curve 2 : x = -(-8*z*z + 7*z + (4*z*z - 3*z)*((z - 1)*sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3))) - 1)/(z*(4*z - 3)), y = (z - 1)*sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3)), z = [(3.+ 2.23606)/8, 2./3] +template +std::vector> poly00012113(const int prec = 10) +{ +return { + create_polyline((3.+ 2.23606)/8, 2./3,P(0.30902,0.30902,(3.+ 2.23606)/8), + [](double z) { return P(-(-8*z*z + 7*z + (4*z*z - 3*z)*(-(z - 1.)*std::sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3))) - 1)/(z*(4*z - 3)), -(z - 1)*std::sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3)),z); }, + prec), + create_polyline((3.+ 2.23606)/8, 2./3,P(0.30902,0.30902,(3.+ 2.23606)/8), + [](double z) { return P( -(-8*z*z + 7*z + (4*z*z - 3*z)*((z - 1)*std::sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3))) - 1)/(z*(4*z - 3)),(z - 1)*std::sqrt(16*z*z - 12*z + 1)/(2*z*(4*z - 3)) + (8*z*z - 7*z + 1)/(2*z*(4*z - 3)),z); }, + prec), + +}; +} + +//00012123 +// curve 1 : x = (5*z*z - 5*z + 1)/(z*(4*z - 3)), y = z*(3*z - 2)/(5*z*z - 5*z + 1), z = [1/2,2/3] +// curve 2 : x = [1/2,2/3], y = (1-x)/x, z = (x-1)/(4*x-3) +template +std::vector> poly00012123(const int prec = 10) +{ +return { + create_polyline(1./2, 2./3, P(1./2, 1.,1./2), + [](double z) { return P((5*z*z - 5*z + 1)/(z*(4*z - 3)), z*(3*z - 2)/(5*z*z - 5*z + 1) ,z ); }, + prec), + create_polyline(1./2, 2./3, P(1./2, 1.,1./2), + [](double x) { return P(x, (1-x)/x ,(x-1)/(4*x-3) ); }, + prec), +}; +} + +//00012130 +// curve 1 : x = -(2 - 3*z)/(3*z - 1), y = 1./2, z = [2/3,1] +//curve 2 : x = -(-7*z*z + 6*z + (4*z*z - 2*z)*(-sqrt((2*z - 1)*(8*z*z*z - 16*z*z + 10*z - 1))/(4*z*(2*z - 1)) + (4*z - 1)/(4*z)) - 1)/(z*(5*z - 3)), y = -sqrt((2*z - 1)*(8*z*z*z - 16*z*z + 10*z - 1))/(4*z*(2*z - 1)) + (4*z - 1)/(4*z), z = [2/3,1] +template +std::vector> poly00012130(const int prec = 10) +{ +return { + create_polyline(2/3., 1., P(1./2, 0.,2./3),P(1./2,1./2,1.), + [](double z) { return P(-(-7*z*z + 6*z + (4*z*z - 2*z)*(-std::sqrt((2*z - 1)*(8*z*z*z - 16*z*z + 10*z - 1))/(4*z*(2*z - 1)) + (4*z - 1)/(4*z)) - 1)/(z*(5*z - 3)), -std::sqrt((2*z - 1)*(8*z*z*z - 16*z*z + 10*z - 1))/(4*z*(2*z - 1)) + (4*z - 1)/(4*z),z); }, + prec), +create_polyline(2/3., 1., P(0.,1./2,2./3),P(1./2,1./2,1.), + [](double z) { return P(-(2 - 3*z)/(3*z - 1),1./2,z); }, + prec), +}; +} + +//00012131 +// curve 1 : x = [0., (2. - 1.4142)/2], y = 1./2, z = (-2 + x)/(-3 + 2*x) +// curve 2 : x = [((2. - 1.4142)/2.,1./3], y = 1./2, z = -x/(-1 + 2*x) +// curve 3 : x = (z - 1)*(2*z*((z*z + z - 1)/(4*z*(z - 1)) - sqrt(9*z*z*z*z - 14*z*z*z + 7*z*z - 2*z + 1)/(4*z*(z - 1))) - 1)/(z*(2*z - 1)), y = (z*z + z - 1)/(4*z*(z - 1)) - sqrt(9*z*z*z*z - 14*z*z*z + 7*z*z - 2*z + 1)/(4*z*(z - 1)), z =[1./2, 1./1.4142] +// curve 4 : x = [(2. - 1.4142)/2, 1./2[, y = (-1 - x + 3*x*x + sqrt(1 - 6*x + 19*x*x - 22*x*x*x + 9*x*x*x*x))/(4*(-1 + x)*x), z = (1. - 5*x + 3*x*x + sqrt(1 - 6*x + 19*x*x - 22*x*x*x + 9*x*x*x*x))/(2*(1 - 3*x + 2*x*x)) +template +std::vector> poly00012131(const int prec = 10) +{ +return { + create_polyline(0., (2. - 1.4142)/2, P(0., 1./2,2./3),P((2. - 1.4142)/2,1./2,1./1.4142), + [](double x) { return P(x,1./2,(-2 + x)/(-3 + 2*x)); }, + prec), + create_polyline((2. - 1.4142)/2.,1./3,P((2. - 1.4142)/2,1./2,1./1.4142), P(1./3, 1./2,1.), + [](double x) { return P(x,1./2,-x/(-1 + 2*x) ); }, + prec), + create_polyline(1./2, 1./1.4142, P(1./3, 1.,1./2),P((2. - 1.4142)/2,1./2,1./1.4142), + [](double z) { return P((z - 1)*(2*z*((z*z + z - 1)/(4*z*(z - 1)) - std::sqrt(9*z*z*z*z - 14*z*z*z + 7*z*z - 2*z + 1)/(4*z*(z - 1))) - 1)/(z*(2*z - 1)),(z*z + z - 1)/(4*z*(z - 1)) - std::sqrt(9*z*z*z*z - 14*z*z*z + 7*z*z - 2*z + 1)/(4*z*(z - 1)) ,z); }, + prec), + create_polyline((2. - 1.4142)/2,limit_value(1./2,-1.),P((2. - 1.4142)/2,1./2,1./1.4142), P(1./2,0. ,2./3), + [](double x) { return P(x,(-1 - x + 3*x*x + std::sqrt(1 - 6*x + 19*x*x - 22*x*x*x + 9*x*x*x*x))/(4*(-1 + x)*x),(1. - 5*x + 3*x*x + std::sqrt(1 - 6*x + 19*x*x - 22*x*x*x + 9*x*x*x*x))/(2*(1 - 3*x + 2*x*x))); }, + prec), +}; +} + +//00012132 +// curve 1 : x = -(-7*z*z + 7*z + (3*z*z - 2*z)*(sqrt((z - 1)*(2*z - 1)*(14*z*z - 11*z + 1))/(2*z*(3*z - 2)) + (8*z*z - 7*z + 1)/(2*z*(3*z - 2))) - 1)/(z*(2*z - 3)), y = sqrt((z - 1)*(2*z - 1)*(14*z*z - 11*z + 1))/(2*z*(3*z - 2))+ (8*z*z - 7*z + 1)/(2*z*(3*z - 2)), z = [1/2,2/3[ +// curve 2 : x = -(-5*z + (z - 2)*(-sqrt((z - 1)*(3*z - 2))/(z - 2) + 2*(z - 1)/(z - 2)) + 4)/(2*z - 1), y = -sqrt((z - 1)*(3*z - 2))/(z - 2) + 2*(z - 1)/(z - 2), z = [1/2,2/3] +template +std::vector> poly00012132(const int prec = 10) +{ +return { + create_polyline(1./2, limit_value(2./3,-1.), P(1./2, 1.,1./2),P(1./2,0.,2./3), + [](double z) { return P(-(-7*z*z + 7*z + (3*z*z - 2*z)*(std::sqrt((z - 1)*(2*z - 1)*(14*z*z - 11*z + 1))/(2*z*(3*z - 2)) + (8*z*z - 7*z + 1)/(2*z*(3*z - 2))) - 1)/(z*(2*z - 3)),std::sqrt((z - 1)*(2*z - 1)*(14*z*z - 11*z + 1))/(2*z*(3*z - 2))+ (8*z*z - 7*z + 1)/(2*z*(3*z - 2)),z); }, + prec), + create_polyline(1./2, (2./3), P(1./2, 1.,1./2),P(0.,1./2,2./3), + [](double z) { return P(-(-5*z + (z - 2)*(-std::sqrt((z - 1)*(3*z - 2))/(z - 2) + 2*(z - 1)/(z - 2)) + 4)/(2*z - 1),-std::sqrt((z - 1)*(3*z - 2))/(z - 2) + 2*(z - 1)/(z - 2),z); }, + prec), +}; +} + +//00012133 +// curve 1 : x = -(-6*z*z + 6*z + (3*z*z - 2*z)*((z - 1)*sqrt(13*z*z - 10*z + 1)/(2*z*(3*z - 2)) + (7*z*z - 6*z + 1)/(2*z*(3*z - 2))) - 1)/(3*z*(z - 1)), y = (z - 1)*sqrt(13*z*z - 10*z + 1)/(2*z*(3*z - 2)) + (7*z*z - 6*z + 1)/(2*z*(3*z - 2)), z = [2./3,0.70263] +// curve 2 : x = (2*z*z - 3*z + (3*z*z - 2*z)*(-(z*z - 3*z + 1)/(2*z*(3*z - 2)) - sqrt(13*z*z*z*z - 26*z*z*z + 19*z*z - 6*z + 1)/(2*z*(3*z - 2))) + 1)/(z*(z - 1)), y = -(z*z - 3*z + 1)/(2*z*(3*z - 2)) - sqrt(13*z*z*z*z - 26*z*z*z + 19*z*z - 6*z + 1)/(2*z*(3*z - 2)), z = [1./3,0.70263] +// curve 3 : x = [0,0.447683], y = (-1 + x)/(-2 + x), z = (2 - 2*x + x*x)/(3 - 3*x + x*x) +//curve 4 : x = -(-2*z + (5*z - 2)*((5*z - 1)/(2*(5*z - 2)) - sqrt(5*z*z - 2*z + 1)/(2*(5*z - 2))) + 1)/(z - 1), y = (5*z - 1)/(2*(5*z - 2)) - sqrt(5*z*z - 2*z + 1)/(2*(5*z - 2)), z = [0.70263,1] +template +std::vector> poly00012133(const int prec = 10) +{ +return { + create_polyline(2./3,0.70263, P(1./2, 0.,2./3),P(0.447683,0.3555809, 0.70263), + [](double z) { return P(-(-6*z*z + 6*z + (3*z*z - 2*z)*((z - 1)*std::sqrt(13*z*z - 10*z + 1)/(2*z*(3*z - 2)) + (7*z*z - 6*z + 1)/(2*z*(3*z - 2))) - 1)/(3*z*(z - 1)),(z - 1)*std::sqrt(13*z*z - 10*z + 1)/(2*z*(3*z - 2)) + (7*z*z - 6*z + 1)/(2*z*(3*z - 2)),z); }, + prec), + create_polyline(1./3, 0.70263, P(1./2, 1.,1./3),P(0.447683,0.3555809, 0.70263), + [](double z) { return P((2*z*z - 3*z + (3*z*z - 2*z)*(-(z*z - 3*z + 1)/(2*z*(3*z - 2)) - std::sqrt(13*z*z*z*z - 26*z*z*z + 19*z*z - 6*z + 1)/(2*z*(3*z - 2))) + 1)/(z*(z - 1)), -(z*z - 3*z + 1)/(2*z*(3*z - 2)) - std::sqrt(13*z*z*z*z - 26*z*z*z + 19*z*z - 6*z + 1)/(2*z*(3*z - 2)),z); }, + prec), + create_polyline(0.,0.447683, P(0.,1./2,2./3),P(0.447683,0.3555809, 0.70263), + [](double x) { return P(x,(-1 + x)/(-2 + x),(2 - 2*x + x*x)/(3 - 3*x + x*x) ); }, + prec), + create_polyline(0.70263,1.,P(0.447683,0.3555809, 0.70263),P(1./2,1./3,1.), + [](double z) { return P(-(-2*z + (5*z - 2)*((5*z - 1)/(2*(5*z - 2)) - std::sqrt(5*z*z - 2*z + 1)/(2*(5*z - 2))) + 1)/(z - 1),(5*z - 1)/(2*(5*z - 2)) - std::sqrt(5*z*z - 2*z + 1)/(2*(5*z - 2)),z); }, + prec), +}; +} + +//00012223 +// curve 1 : x = 1/2y, y = [1/2,1], z = 1/2 +template +std::vector> poly00012223(const int prec = 10) +{ +return { + create_polyline(1./2, 1., P(1., 1./2,1./2), + [](double y) { return P( 1/(2*y) ,y,1./2); }, + prec), + +}; +} + +//00012230 +// curve 1 : x = (3*z - 2)/(2*(2*z - 1)), y = 2*(2*z - 1)/(5*z - 2), z =[2/3,1] +template +std::vector> poly00012230(const int prec = 10) +{ +return { + create_polyline(2./3, 1., P(0., 1./2,2./3), + [](double z) { return P((3*z - 2)/(2*(2*z - 1)),2*(2*z - 1)/(5*z - 2),z); }, + prec), + +}; +} + +//00012231 +// curve 1 : x = z*(z - 1)/(z**2 - 3*z + 1), y = (z**2 - 3*z + 1)/(z*(z - 2)), z=[1/2,2/3] +// curve 2 : x = z/(z + 1), y = (z - 1)*(z + 1)/(z*(z - 2)), z = [1/2,2/3] +// curve 3 : x = [2/5,1/2], y = 1/(2-x), z = x/(1-x) +// curve 4 : x = [0,2/5], y = 1/(2-x), z = 2./3 +template +std::vector> poly00012231(const int prec = 10) +{ +return { + create_polyline(1./2, 2./3, P(1., 1./3,1./2), + [](double z) { return P(z*(z - 1)/(z*z - 3*z + 1),(z*z - 3*z + 1)/(z*(z - 2)),z); }, + prec), + create_polyline(1./2, 2./3, P(1./3, 1.,1./2), + [](double z) { return P(z/(z + 1),(z - 1)*(z + 1)/(z*(z - 2)),z); }, + prec), + create_polyline(2./5,1./2, P(2./5, 5./8,2./3), + [](double x) { return P(x,1/(2-x),x/(1-x)); }, + prec), + create_polyline(0.,2./5., P(0.,1./2,2./3), + [](double x) { return P(x,1/(2-x),2./3); }, + prec), + +}; +} + +//00012232 +// curve 1 : x = z/(4*z - 1), y = (4*z - 1)/(2*z), z =[1/3,1/2] +// curve 2 : x = (3*z - 2)/(4*z - 3), y = (4*z - 3)/(2*(z - 1)), z= [1/2,2/3] +template +std::vector> poly00012232(const int prec = 10) +{ +return { + create_polyline(1./3,1./2., P(1.,1./2,1./3), + [](double z) { return P(z/(4*z - 1),(4*z - 1)/(2*z),z); }, + prec), + create_polyline(1./2,2./3., P(1./2,1.,1./2), + [](double z) { return P((3*z - 2)/(4*z - 3),(4*z - 3)/(2*(z - 1)),z); }, + prec), + +}; +} + +//00012233 +// curve 1 : x = -z/(z-1), y = -(z - 1)/(2*z), z = [1/3,1/2] +//curve 2 : x = (3*z - 2)/(z - 1), y = 1/2, z = [1/2,2/3] +template +std::vector> poly00012233(const int prec = 10) +{ +return { + create_polyline(1./3,1./2, P(1./2,1.,1./3), + [](double z) { return P(-z/(z - 1),-(z - 1)/(2*z),z); }, + prec), + create_polyline(1./2,2./3, P(1.,1./2.,1./2), + [](double z) { return P((3*z - 2)/(z - 1),1./2,z); }, + prec), + + + +}; +} + +//00012330 +// curve 1 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = (2*(1 - 2*x + x*x))/(3 - 7*x + 5*x*x) +template +std::vector> poly00012330(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2.,2./3), P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),(2*(1 - 2*x + x*x))/(3 - 7*x + 5*x*x)); }, + prec), + +}; +} + +//00012331 +// curve 1 : x = [1/3,1[, y = (-1 + 3*x + 2*x*x - sqrt(1 - 6*x + 13*x*x - 8*x*x*x + 4*x*x*x*x))/(2*x*(-2 + 5*x)), z = (1 - x + 2*x*x - sqrt(1 - 6*x + 13*x*x - 8*x*x*x + 4*x*x*x*x))/(2*(-1 + x)*(-1+x))) +// curve 2 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = 2./3 +template +std::vector> poly00012331(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),2./3); }, + prec), + create_polyline(1./3,limit_value(1.,-1.), P(1./3,1.,1./2),P(1.,1./3,1./2), + [](double x) { return P(x,(-1 + 3*x + 2*x*x - std::sqrt(1 - 6*x + 13*x*x - 8*x*x*x + 4*x*x*x*x))/(2*x*(-2 + 5*x)) ,(1 - x + 2*x*x - std::sqrt(1 - 6*x + 13*x*x - 8*x*x*x + 4*x*x*x*x))/(2*(-1 + x)*(-1+x))); }, + prec), +}; +} + +//00012332 +//curve 1 : x = -(4 - 6*z)/(2*(z - 1)), y = 1./2, z = [1/2,2/3] +//curve 2 : x = -(-7*z + 5 + (2*z - 2)*(3*z - 2)/(z - 1))/(2*(z - 1)), y = (3*z - 2)/(z - 1), z = [1/2,2/3] +//curve 3 : x = -(2*z*((5*z - 1)/(4*z) - sqrt(17*z*z - 10*z + 1)/(4*z)) - 5*z + 1)/(2*z), y = (5*z - 1)/(4*z) - sqrt(17*z*z - 10*z + 1)/(4*z), z = [1./2, 2.*1.4142/17 + 5./17] +//curve 4 : x = -(2*z*((5*z - 1)/(4*z) + sqrt(17*z*z - 10*z + 1)/(4*z)) - 5*z + 1)/(2*z), y = (5*z - 1)/(4*z) + sqrt(17*z*z - 10*z + 1)/(4*z), z = [1./2, 2.*1.4142/17 + 5./17] +//curve 5 : x = y = 1/2, z = [3/5,1] +template +std::vector> poly00012332(const int prec = 10) +{ +return { + create_polyline(1./2,3./5, P(1.,1./2.,1./2),P(1./2,1./2.,3./5), + [](double z) { return P( -(4 - 6*z)/(2*(z - 1)),1./2,z); }, + prec), + create_polyline(3./5,2./3, P(1./2,1./2.,3./5), + [](double z) { return P( -(4 - 6*z)/(2*(z - 1)),1./2,z); }, + prec), + create_polyline(1./2,3./5, P(1./2,1.,1./2),P(1./2,1./2.,3./5), + [](double z) { return P(-(-7*z + 5 + (2*z - 2)*(3*z - 2)/(z - 1))/(2*(z - 1)),(3*z - 2)/(z - 1),z); }, + prec), + create_polyline(3./5,2./3, P(1./2,1./2,3./5), + [](double z) { return P(-(-7*z + 5 + (2*z - 2)*(3*z - 2)/(z - 1))/(2*(z - 1)),(3*z - 2)/(z - 1),z); }, + prec), + create_polyline(1./2, 2.*1.4142/17 + 5./17, P(1.,1./2.,1./2), + [](double z) { return P( -(2*z*((5*z - 1)/(4*z) - std::sqrt(17*z*z - 10*z + 1)/(4*z)) - 5*z + 1)/(2*z),(5*z - 1)/(4*z) - std::sqrt(17*z*z - 10*z + 1)/(4*z),z); }, + prec), + create_polyline(1./2,2.*1.4142/17 + 5./17, P(1./2,1.,1./2), + [](double z) { return P( -(2*z*((5*z - 1)/(4*z) + std::sqrt(17*z*z - 10*z + 1)/(4*z)) - 5*z + 1)/(2*z),(5*z - 1)/(4*z) + std::sqrt(17*z*z - 10*z + 1)/(4*z),z); }, + prec), + create_polyline(3./5,1., P(1./2.,1./2,3./5),P(1./2,1./2.,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), +}; +} + +//00012333 +// curve 1 : x = [1/2,1], y = 1./(2*x), z = x/(2.*x*x+1) +// curve 2 : x= [0,1/2], y = (2*x-1)/(2*x-2), z = (2 - 3*x + 2*x*x)/(3 - 4*x + 2*x*x) +template +std::vector> poly00012333(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./3), + [](double x) { return P(x,1./(2*x),x/(2.*x*x+1)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,2./3), + [](double x) { return P(x,(2*x-1)/(2*x-2),(2 - 3*x + 2*x*x)/(3 - 4*x + 2*x*x)); }, + prec), +}; +} + +//00111123 +//curve 1 : x = 1/2, y =[2/3,1], z = (2*y)/(5*y-2) +template +std::vector> poly00111123(const int prec = 10) +{ +return { + create_polyline(2./3,1., P(1./2,2./3,1.), + [](double y) { return P(1./2,y,(2*y)/(5*y-2)); }, + prec), + +}; +} + +//00111203 +// curve 1 : x = [1/2,1], y = 1./2, z = 1./(2*x) +// curve 2 : x = [1/2,2/3], y = (2*x-1.)/x, z = 1./(2.-x) +// curve 3 : x = [1/2,2/3], y = (-x+1.)/x, z = 1./(2.-x) +// curve 4 : x = [0,2/3], y = 1./2, z= 1./(2.-x) +template +std::vector> poly00111203(const int prec = 10) +{ +return { + create_polyline(2./3,1., P(2./3,1./2,3./4),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(2*x)); }, + prec), + create_polyline(1./2,2./3, P(1./2,1./2,1.),P(2./3,1./2,3./4), + [](double x) { return P(x,1./2,1./(2*x)); }, + prec), + create_polyline(1./2,2./3, P(1./2,0.,2./3),P(2./3,1./2,3./4), + [](double x) { return P(x,(2*x-1.)/x,1./(2.-x)); }, + prec), + create_polyline(1./2,2./3, P(1./2,1.,2./3),P(2./3,1./2,3./4), + [](double x) { return P(x,(-x+1.)/x,1./(2.-x)); }, + prec), + create_polyline(0.,2./3, P(0.,1./2,1./2),P(2./3,1./2,3./4), + [](double x) { return P(x,1./2,1./(2.-x)); }, + prec), + +}; +} + +//00111223 +// curve 1 : x = -(-5*z + (6*z - 5)*(sqrt(-(z - 1)*(2*z - 1))/(6*z - 5) + (4*z - 3)/(6*z - 5)) + 3)/z, y = sqrt(-(z - 1)*(2*z - 1))/(6*z - 5) + (4*z - 3)/(6*z - 5),z = [1/2,2/3] +// curve 2 : x = [1/2,1], y = x/(3*x-1), z = x/(1 - 2*x + 3*x*x) +template +std::vector> poly00111223(const int prec = 10) +{ +return { + create_polyline(1./2,2./3, P(1.,1./2,1./2), + [](double z) { return P(-(-5*z + (6*z - 5)*(std::sqrt(-(z - 1)*(2*z - 1))/(6*z - 5) + (4*z - 3)/(6*z - 5)) + 3)/z,std::sqrt(-(z - 1)*(2*z - 1))/(6*z - 5) + (4*z - 3)/(6*z - 5),z); }, + prec), + create_polyline(1./2,1., P(1./2,1.,2./3), + [](double x) { return P(x,x/(3*x-1),x/(1 - 2*x + 3*x*x) ); }, + prec), + +}; +} + +//00111230 +// curve 1 : x = -(-2*z + (3*z - 2)*((8*z - 5)/(4*(3*z - 2)) - sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2))) + 1)/z, y = (8*z - 5)/(4*(3*z - 2)) - sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2)), z = ]2/3,1] +// curve 2 : x = -(-2*z + (3*z - 2)*((4*z - 3)/(4*(3*z - 2)) + sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2))) + 1)/z, y = (4*z - 3)/(4*(3*z - 2)) + sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2)), z = ]2/3,1] +template +std::vector> poly00111230(const int prec = 10) +{ +return { +create_polyline(limit_value(2./3,1.),1, P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double z) { return P(-(-2*z + (3*z - 2)*((8*z - 5)/(4*(3*z - 2)) - std::sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2))) + 1)/z,(8*z - 5)/(4*(3*z - 2)) - std::sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2)),z ); }, + prec), +create_polyline(limit_value(2./3,1.),1, P(1./2,1.,2./3),P(1./2,1./2,1.), + [](double z) { return P(-(-2*z + (3*z - 2)*((4*z - 3)/(4*(3*z - 2)) + std::sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2))) + 1)/z,(4*z - 3)/(4*(3*z - 2)) + std::sqrt(-8*z*z + 16*z - 7)/(4*(3*z - 2)),z ); }, + prec), +}; +} + +//00111232 +// curve 1 : x = (z - 1)*(-1 + (5*z - 4)/(2*(z - 1)) + sqrt(13*z*z - 20*z + 8)/(2*(z - 1)))/z, y = (5*z - 4)/(2*(z - 1)) + sqrt(13*z*z - 20*z + 8)/(2*(z - 1)), z = [1/3,2/3] +// curve 2 : x = [1/3,1/2], y = x/(1. - x), z = -x/(1. - 5*x + 3*x*x +template +std::vector> poly00111232(const int prec = 10) +{ +return { + create_polyline(1./3,2./3, P(1.,1./2,1./3), + [](double z) { return P((z - 1)*(-1 + (5*z - 4)/(2*(z - 1)) + std::sqrt(13*z*z - 20*z + 8)/(2*(z - 1)))/z, (5*z - 4)/(2*(z - 1)) + std::sqrt(13*z*z - 20*z + 8)/(2*(z - 1)),z ); }, + prec), + create_polyline(1./3,1./2, P(1./3,1./2,1.), + [](double x) { return P(x,x/(1. - x),-x/(1. - 5*x + 3*x*x)); }, + prec), + +}; +} + +//00111233 +// curve 1 : x = -(z - 1)/z, y = (3*z - 2)/(4*z - 3), z = [1/2,2/3] +// curve 2 : x = [1/2,1], y = x/(x+1), z = x/(3*x-1) +// problem with close polylines, there is an over refinement +template +std::vector> poly00111233(const int prec = 10) +{ +return { + create_polyline(1./2,2./3, P(1.,1./2,1./2), + [](double z) { return P(-(z - 1)/z, (3*z - 2)/(4*z - 3),z); }, + prec), + create_polyline(1./2,1., P(1./2,1./3,1.),P(1.,1./2,1./2), + [](double x) { return P(x,x/(x+1),x/(3*x-1)); }, + prec), + +}; +} + +//00112233 +// curve 1 : x = [0,1], y = 1/2, z = 1/2 +template +std::vector> poly00112233(const int prec = 10) +{ +return { +create_polyline(0.,1., P(0.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + +}; +} + +//00112323 +// curve 1 : x = (3*z - 1)/(2*z), y = 1./2, z = [1/3,1/2] +// curve 2 : x = -(z - 1)/(2*z), y = 1./2, z = [1/3,1/2] +// curve 3 : x = 1./2, y = (3*z - 2)/(2*(z - 1)), z = [1/2,2/3] +// curve 4 : x = 1./2, y = -z /(2*(z - 1)), z = [1/2,2/3] + +template +std::vector> poly00112323(const int prec = 10) +{ +return { + create_polyline(1./3,1./2, P(0.,1./2,1./3),P(1./2,1./2,1./2), + [](double z) { return P((3*z - 1)/(2*z),1./2,z); }, + prec), + create_polyline(1./3,1./2, P(1.,1./2,1./3),P(1./2,1./2,1./2), + [](double z) { return P( -(z - 1)/(2*z),1./2,z); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,0.,2./3), + [](double z) { return P(1./2,(3*z - 2)/(2*(z - 1)),z); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,1.,2./3), + [](double z) { return P(1./2,-z /(2*(z - 1)),z); }, + prec), + + +}; +} + +//00112332 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = y = 1/2, z = [1/2,1] +// curve 3 : x = 1./2, y = (3*z - 2)/(2*(z - 1)), z = [1/2,2/3] +// curve 4 : x = 1./2, y = -z /(2*(z - 1)), z = [1/2,2/3] +template +std::vector> poly00112332(const int prec = 10) +{ +return { + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,0.,2./3), + [](double z) { return P(1./2,(3*z - 2)/(2*(z - 1)),z); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,1.,2./3), + [](double z) { return P(1./2,-z /(2*(z - 1)),z); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + +}; +} + +//00121203 +// curve 1 : x = (-5*z*z + 7*z + (3*z - 2)*(10*z*z - 11*z + 3)/(5*z - 3) - 2)/(2*z*z), y = (3*z - 2)/(5*z - 3), z = [0,1/2]U[2/3,1] +// curve 2 : x = ((3*z - 1)*(z*(2*z - 1)/(3*z - 1) - z + 1)/(2*z*z)), y = z/(3*z - 1), z = [1/2,1] +template +std::vector> poly00121203(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(1./2,2./3,0.),P(1./2,1.,1./2), + [](double z) { return P((-5*z*z + 7*z + (3*z - 2)*(10*z*z - 11*z + 3)/(5*z - 3) - 2)/(2*z*z) ,(3*z - 2)/(5*z - 3),z); }, + prec), + create_polyline(2./3,1., P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double z) { return P((-5*z*z + 7*z + (3*z - 2)*(10*z*z - 11*z + 3)/(5*z - 3) - 2)/(2*z*z) ,(3*z - 2)/(5*z - 3),z); }, + prec), + create_polyline(1./2,1., P(1./2,1.,1./2),P(1./2,1./2,1.), + [](double z) { return P(((3*z - 1)*(z*(2*z - 1)/(3*z - 1) - z + 1)/(2*z*z)), z/(3*z - 1),z); }, + prec), +}; +} + +//00121223 +// curve 1 : x = ]3/8,1/2], y = (3 - 5*x + sqrt(-3 + 8*x) - x*sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x)), z = (3 - 5*x - sqrt(-3 + 8*x) + x*sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x)) +// curve 3 : x = ]3/8,1/2], y = (3 - 5*x - sqrt(-3 + 8*x) + x*sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x)), z = (3 - 5*x + sqrt(-3 + 8*x) - x*sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x)) +template +std::vector> poly00121223(const int prec = 10) +{ +return { + create_polyline(limit_value(3./8,1.),1./2, P(3./8,4./9,4./9),P(1./2,2./3,0.), + [](double x) { return P(x,(3 - 5*x + std::sqrt(-3 + 8*x) - x*std::sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x)), (3 - 5*x - std::sqrt(-3 + 8*x) + x*std::sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x))); }, + prec), + create_polyline(limit_value(3./8,1.),1./2, P(3./8,4./9,4./9),P(1./2,0.,2./3), + [](double x) { return P(x,(3 - 5*x - std::sqrt(-3 + 8*x) + x*std::sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x)), (3 - 5*x + std::sqrt(-3 + 8*x) - x*std::sqrt(-3 + 8*x))/(2*(3 - 5*x + x*x))); }, + prec), + +}; +} + +//00121233 +// curve 1 : x = 1./2, y = (3*z - 2)/(4*z - 3), z = [0,2/3] +// curve 2 : x = 1./2, y = 1-z, z' = 1-(3*z - 2)/(4*z - 3), z = [0,2/3] +// problem with close polylines, there is an over refinement +template +std::vector> poly00121233(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(1./2,2./3,0.),P(1./2,1./2,1./2), + [](double z) { return P(1./2,(3*z - 2)/(4*z - 3),z); }, + prec), + create_polyline(1./2,2./3, P(1./2,1./2,1./2),P(1./2,0.,2./3), + [](double z) { return P(1./2,(3*z - 2)/(4*z - 3),z); }, + prec), + create_polyline(0.,1./2, P(1./2,1.,1./3),P(1./2,1./2,1./2), + [](double z) { return P(1./2,1-z,1-(3*z - 2)/(4*z - 3)); }, + prec), + create_polyline(1./2.,2./3, P(1./2,1./2,1./2),P(1./2,1./3,1.), + [](double z) { return P(1./2,1-z,1-(3*z - 2)/(4*z - 3)); }, + prec), +}; +} + +//00121300 + +// curve 1 : x = -(2*z - 1)*(-2*z + (4*z - 3)*(sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3))) + 2)/(z*(z - 1)) , y = sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3)), z = ]0,1/3] +// curve 2 : x = -(2*z - 1)*(-2*z + (4*z - 3)*(sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3))) + 2)/(z*(z - 1)) , y = 1-( sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3))), z' = 1.-z, z = ]0,1/3] +template +std::vector> poly00121300(const int prec = 10) +{ +return { + create_polyline(limit_value(0.,1.),1./3, P(1./2,2./3,0.),P(1./2,1.,1./3), + [](double z) { return P(-(2*z - 1)*(-2*z + (4*z - 3)*(std::sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3))) + 2)/(z*(z - 1)) , std::sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3)),z); }, + prec), + create_polyline(limit_value(0.,1.),1./3, P(1./2,1./3,1.),P(1./2,0.,2./3), + [](double z) { return P(-(2*z - 1)*(-2*z + (4*z - 3)*(std::sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3))) + 2)/(z*(z - 1)) ,1-( std::sqrt((2*z - 1)*(2*z*z*z - 5*z*z + 8*z - 4))/(2*(8*z*z - 10*z + 3)) + (3*z - 2)/(2*(4*z - 3))),1.-z); }, + prec), + + +}; +} + +//00121301 +// curve 1 : x = (-4*z*z + 7*z + (sqrt((z - 1)*(z*z*z - 5*z*z + 4*z - 1))/(8*z*z - 10*z + 3) + (z - 1)*(3*z - 1)/((2*z - 1)*(4*z - 3)))*(8*z*z - 10*z + 3) - 2)/z, y = sqrt((z - 1)*(z*z*z - 5*z*z + 4*z - 1))/(8*z*z - 10*z + 3) + (z - 1)*(3*z - 1)/((2*z - 1)*(4*z - 3)), z = ]0,1/2[ +// curve 2 : x = ]1/2,1], y = (-2 + 6*x - x*x - sqrt(4 - 16*x + 24*x*x - 12*x*x*x + x*x*x*x))/(4*x), z = (-2 + 2*x + x*x + sqrt(4 - 16*x + 24*x*x - 12*x*x*x + x*x*x*x))/(4*x*(-1 + 2*x)) +template +std::vector> poly00121301(const int prec = 10) +{ +return { + create_polyline(limit_value(0.,1.),limit_value(1./2,-1.), P(1./2,2./3,0.),P(1.,1./2,1./2), + [](double z) { return P( (-4*z*z + 7*z + (std::sqrt((z - 1)*(z*z*z - 5*z*z + 4*z - 1))/(8*z*z - 10*z + 3) + (z - 1)*(3*z - 1)/((2*z - 1)*(4*z - 3)))*(8*z*z - 10*z + 3) - 2)/z, std::sqrt((z - 1)*(z*z*z - 5*z*z + 4*z - 1))/(8*z*z - 10*z + 3) + (z - 1)*(3*z - 1)/((2*z - 1)*(4*z - 3)),z); }, + prec), + create_polyline(limit_value(1./2,1.),1., P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(-2 + 6*x - x*x - std::sqrt(4 - 16*x + 24*x*x - 12*x*x*x + x*x*x*x))/(4*x),(-2 + 2*x + x*x + std::sqrt(4 - 16*x + 24*x*x - 12*x*x*x + x*x*x*x))/(4*x*(-1 + 2*x))); }, + prec), +}; +} + +//00121302 +// curve 1 : x = (-z*z + 5*z + (sqrt(z*z*z*z + 8*z*z - 12*z + 4)/(2*(2*z*z - 7*z + 3)) + (3*z*z - 6*z + 2)/(2*(z - 3)*(2*z - 1)))*(2*z*z - 7*z + 3) - 2)/(z*(z + 1)), y = sqrt(z*z*z*z + 8*z*z - 12*z + 4)/(2*(2*z*z - 7*z + 3)) + (3*z*z - 6*z + 2)/(2*(z - 3)*(2*z - 1)), z = ]0,1/2[ +// curve 2 : x = (-z + (2*z - 1)*(3*z*z - 2*z)/(6*z*z - 5*z + 1) + 1)/z, y = (3*z*z - 2*z)/(6*z*z - 5*z + 1), z = [2/3,1] +// curve 3 : x = (-z + z*(2*z - 1)/(z + 1) + 1)/z, y = z/(z+1.), z =[1/2,1] +template +std::vector> poly00121302(const int prec = 10) +{ +return { + create_polyline(limit_value(0.,1.),limit_value(1./2,-1.), P(1./2,2./3,0.),P(1./3,1.,1./2), + [](double z) { return P((-z*z + 5*z + (std::sqrt(z*z*z*z + 8*z*z - 12*z + 4)/(2*(2*z*z - 7*z + 3)) + (3*z*z - 6*z + 2)/(2*(z - 3)*(2*z - 1)))*(2*z*z - 7*z + 3) - 2)/(z*(z + 1)) ,std::sqrt(z*z*z*z + 8*z*z - 12*z + 4)/(2*(2*z*z - 7*z + 3)) + (3*z*z - 6*z + 2)/(2*(z - 3)*(2*z - 1)),z); }, + prec), + create_polyline(2./3,1., P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double z) { return P((-z + (2*z - 1)*(3*z*z - 2*z)/(6*z*z - 5*z + 1) + 1)/z, (3*z*z - 2*z)/(6*z*z - 5*z + 1),z); }, + prec), + create_polyline(1./2,1., P(1.,1./3.,1./2),P(1./2,1./2,1.), + [](double z) { return P((-z + z*(2*z - 1)/(z + 1) + 1)/z, z/(z+1.),z); }, + prec), +}; +} + +//00121320 +// curve 1 : x = -(-7*z*z + 7*z + ((7*z*z - 8*z + 2)/(2*(9*z*z - 10*z + 3)) + sqrt(13*z*z*z*z - 36*z*z*z + 40*z*z - 20*z + 4)/(2*(9*z*z - 10*z + 3)))*(9*z*z - 10*z + 3) - 2)/(z*(3*z - 1)), y = (7*z*z - 8*z + 2)/(2*(9*z*z - 10*z + 3)) + sqrt(13*z*z*z*z - 36*z*z*z + 40*z*z - 20*z + 4)/(2*(9*z*z - 10*z + 3)), z = [0,1] +// curve 2 : x = [1/2,(8.06225-7)/2], y = (2 - 5*x + x*x + sqrt(x)*sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - 4*x + 2*x*x)), z = (2 - x - x*x - sqrt(x)*sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - x + x*x)) +// curve 3 : x = [1/2,(8.06225-7)/2], y = (2 - 5*x + x*x - sqrt(x)*sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - 4*x + 2*x*x)), z = (2 - x - x*x + sqrt(x)*sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - x + x*x)) +template +std::vector> poly00121320(const int prec = 10) +{ +return { + create_polyline(0.,1., P(1./2,2./3,0.),P(1./2,1./2,1.), + [](double z) { return P(-(-7*z*z + 7*z + ((7*z*z - 8*z + 2)/(2*(9*z*z - 10*z + 3)) + std::sqrt(13*z*z*z*z - 36*z*z*z + 40*z*z - 20*z + 4)/(2*(9*z*z - 10*z + 3)))*(9*z*z - 10*z + 3) - 2)/(z*(3*z - 1)),(7*z*z - 8*z + 2)/(2*(9*z*z - 10*z + 3)) + std::sqrt(13*z*z*z*z - 36*z*z*z + 40*z*z - 20*z + 4)/(2*(9*z*z - 10*z + 3)),z); }, + prec), + create_polyline(1./2,(8.06225-7.)/2, P(1./2,0.,2./3),P((8.06225-7.)/2,1./3,(3.+8.06225)/14), + [](double x) { return P(x,(2 - 5*x + x*x + std::sqrt(x)*std::sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - 4*x + 2*x*x)),(2 - x - x*x - std::sqrt(x)*std::sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - x + x*x))); }, + prec), + create_polyline(1./2,(8.06225-7.)/2, P(1./2,1./2,1.),P((8.06225-7.)/2,1./3,(3.+8.06225)/14), + [](double x) { return P(x,(2 - 5*x + x*x - std::sqrt(x)*std::sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - 4*x + 2*x*x)),(2 - x - x*x + std::sqrt(x)*std::sqrt(4 - 11*x + 6*x*x + x*x*x))/(2*(1 - x + x*x))); }, + prec), +}; +} + +//00121321 +// curve 1 : x = -(-7*z*z + 8*z + (sqrt((z - 1)*(25*z*z*z - 37*z*z + 20*z - 4))/(2*(6*z*z - 10*z + 3)) + (z - 1)*(7*z - 2)/(2*(6*z*z - 10*z + 3)))*(6*z*z - 10*z +3) - 2)/(z*(2*z - 1)), y = sqrt((z - 1)*(25*z*z*z - 37*z*z + 20*z - 4))/(2*(6*z*z - 10*z + 3)) + (z - 1)*(7*z - 2)/(2*(6*z*z - 10*z + 3)), z = ]0,1/2[ +// curve 2 : x = (-2*z*z + 3*z - 1)/(z*(2*z - 1)), y = (3*z*z - 2*z)/(6*z*z - 6*z + 1), z = ]1/2,2/3] +template +std::vector> poly00121321(const int prec = 10) +{ +return { + create_polyline(limit_value(0.,1.),limit_value(1./2,-1.), P(1./2,2./3,0.),P(1.,1./2,1./2), + [](double z) { return P( -(-7*z*z + 8*z + (std::sqrt((z - 1)*(25*z*z*z - 37*z*z + 20*z - 4))/(2*(6*z*z - 10*z + 3)) + (z - 1)*(7*z - 2)/(2*(6*z*z - 10*z + 3)))*(6*z*z - 10*z +3) - 2)/(z*(2*z - 1)),std::sqrt((z - 1)*(25*z*z*z - 37*z*z + 20*z - 4))/(2*(6*z*z - 10*z + 3)) + (z - 1)*(7*z - 2)/(2*(6*z*z - 10*z + 3)),z); }, + prec), + create_polyline(limit_value(1./2.,1.),2./3, P(1.,1./2,1./2),P(1./2,0.,2./3), + [](double z) { return P((-2*z*z + 3*z - 1)/(z*(2*z - 1)),(3*z*z - 2*z)/(6*z*z - 6*z + 1),z); }, + prec), + +}; +} + +//00121323 +// curve 1 : x = -(-3*z + (3*z - 3)*((3*z - 1)/(3*(2*z - 1)) - sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1))) + 2)/z, y = (3*z - 1)/(3*(2*z - 1)) - sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1)), z = ]0,1[ +// curve 2 : x = (z - 1)*(-1 + sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z - 3*z + 1)) + (6*z*z - 6*z + 1)/(2*(z - 1)*(2*z - 1)))/z, y = sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z - 3*z + 1)) + (6*z*z - 6*z + 1)/(2*(z - 1)*(2*z - 1)), z = ]1/2,2/3] +// curve 3 : x = (z - 1)*(-1 - sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(2*z*z - 3*z + 1)) + (2*z*z - 2*z + 1)/(2*(z - 1)*(2*z - 1)))/z, y = -sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(2*z*z - 3*z + 1)) + (2*z*z - 2*z + 1)/(2*(z - 1)*(2*z - 1)), z = [1/3,1/2[ +// curve 4 : x = -(-z + (z - 1)*(-z*z/((z - 1)*(2*z - 1)) + z*sqrt(3*z*z - 3*z + 1)/(2*z*z - 3*z + 1)))/(3*z), y = -z*z/((z - 1)*(2*z - 1)) + z*sqrt(3*z*z - 3*z + 1)/(2*z*z - 3*z + 1), z = ]1/2,1] +template +std::vector> poly00121323(const int prec = 10) +{ +return { + create_polyline(limit_value(0.,1.),limit_value(1./2,-1.), P(1./2,2./3,0.),P(1./2,1./2,1./2), + [](double z) { return P(-(-3*z + (3*z - 3)*((3*z - 1)/(3*(2*z - 1)) - std::sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1))) + 2)/z,(3*z - 1)/(3*(2*z - 1)) - std::sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1)),z); }, + prec), + create_polyline(limit_value(1./2,1.),2./3,P(1./2,1./2,1./2), P(1./2,0.,2./3), + [](double z) { return P( (z - 1)*(-1 + std::sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z - 3*z + 1)) + (6*z*z - 6*z + 1)/(2*(z - 1)*(2*z - 1)))/z,std::sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z - 3*z + 1)) + (6*z*z - 6*z + 1)/(2*(z - 1)*(2*z - 1)) ,z); }, + prec), + create_polyline(1./3,limit_value(1./2,-1.), P(1.,1./2,1./3),P(1./2,1./2,1./2), + [](double z) { return P( (z - 1)*(-1 - std::sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(2*z*z - 3*z + 1)) + (2*z*z - 2*z + 1)/(2*(z - 1)*(2*z - 1)))/z,-std::sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(2*z*z - 3*z + 1)) + (2*z*z - 2*z + 1)/(2*(z - 1)*(2*z - 1)),z); }, + prec), + create_polyline(limit_value(1./2,1.),1., P(1./2,1./2,1./2),P(1./3,1./2,1.), + [](double z) { return P( -(-z + (z - 1)*(-z*z/((z - 1)*(2*z - 1)) + z*std::sqrt(3*z*z - 3*z + 1)/(2*z*z - 3*z + 1)))/(3*z),-z*z/((z - 1)*(2*z - 1)) + z*std::sqrt(3*z*z - 3*z + 1)/(2*z*z - 3*z + 1) ,z); }, + prec), +}; +} + +//00122103 +// curve 1 : x = 1/2, y = [0,1/2] U [2/3,1], z = (3*y-2.)/(5*y-3.) +// curve 2 : x = [1/2,1], y = (2 - x + sqrt(x)* sqrt(4 - 11*x + 8*x*x))/(2*(1 - x + 2*x*x)), z = (-3*x + sqrt(x)*sqrt(4 - 11*x + 8*x*x))/(2*(1 - 5*x + 2*x*x)) +// curve 3 : x = [1/2,1], y = (-3*x + sqrt(x)*sqrt(4 - 11*x + 8*x*x))/(2*(1 - 5*x + 2*x*x)), z = (2 - x + sqrt(x)* sqrt(4 - 11*x + 8*x*x))/(2*(1 - x + 2*x*x)) +// problem with polylines, there is an over refinement +template +std::vector> poly00122103(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double y) { return P(1./2,y,(3*y-2.)/(5*y-3.)); }, + prec), + create_polyline(2./3,1., P(1./2,2./3,0.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,(3*y-2.)/(5*y-3.)); }, + prec), + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,(2 - x + std::sqrt(x)* std::sqrt(4 - 11*x + 8*x*x))/(2*(1 - x + 2*x*x)),(-3*x + std::sqrt(x)*std::sqrt(4 - 11*x + 8*x*x))/(2*(1 - 5*x + 2*x*x))); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,(-3*x + std::sqrt(x)*std::sqrt(4 - 11*x + 8*x*x))/(2*(1 - 5*x + 2*x*x)),(2 - x + std::sqrt(x)* std::sqrt(4 - 11*x + 8*x*x))/(2*(1 - x + 2*x*x))); }, + prec), + +}; +} + +//00122113 +// curve 1 : x = [1/2,1], y = (-4 + 7*x - sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*(-3 + 4*x + x*x)), z = (-2 + 5*x - sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*x*(1 + x)) +// curve 2 : x = [0,1/2], y = (-4 + 7*x + sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*(-3 + 4*x + x*x)), z = (-2 + 5*x + sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*x*(1 + x)) +// curve 3 : x = [2/3,1], y = (-1. + 2*x)/(-1. + 3*x*x), z = (-1. + 2*x)/(x*(-1. + 3*x)) +template +std::vector> poly00122113(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,2./3,0.),P(1.,1./2,1./2), + [](double x) { return P(x,(-4 + 7*x - std::sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*(-3. + 4*x + x*x)),(-2. + 5*x - std::sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*x*(1 + x))); }, + prec), + create_polyline(0.000001,1./2, P(0.,1./3,1./2),P(1./2,0.,2./3), + [](double x) { return P(x,(-4. + 7*x + std::sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*(-3 + 4*x + x*x)),(-2. + 5*x + std::sqrt(4 - 16*x + 21*x*x - 8*x*x*x))/(2*x*(1 + x))); }, + prec), + create_polyline(2./3,1.,P(2./3,1.,1./2), P(1.,1./2,1./2), + [](double x) { return P(x,(-1. + 2*x)/(-1. + 3*x*x),(-1. + 2*x)/(x*(-1. + 3*x))); }, + prec), +}; +} + +//00122133 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = 1/ 2, y = (3*z - 2)/(4*z - 3), z = [0,2/3] +// curve 3 : x = 1/2, y = [1/3,1], z = y/(4.*y-1) +// problem with close polylines, there is an over refinement +template +std::vector> poly00122133(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2,P(1./2,2./3,0.),P(1./2,1./2,1./2), + [](double z) { return P(1./2,(3*z - 2)/(4*z - 3),z); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,0.,2./3), + [](double z) { return P(1./2,(3*z - 2)/(4*z - 3),z); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1./2),P(1./2,1.,1./3), + [](double y) { return P(1./2,y,y/(4.*y-1)); }, + prec), + create_polyline(1./3,1./2,P(1./2,1./3,1.),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,y/(4.*y-1)); }, + prec), + +}; +} + +//00122300 +// curve 1 : x = 1/2, y = [2/3,1], z = (3*y-2)/(5*y-2) +// curve 2 : x = 1/2, y' = 1-y, z = 1-(3*y-2)/(5*y-2), y'= [2/3,1] +template +std::vector> poly00122300(const int prec = 10) +{ +return { +create_polyline(2./3,1.,P(1./2,2./3,0.),P(1./2,1.,1./3), + [](double y) { return P(1./2,y,(3*y-2)/(5*y-2)); }, + prec), +create_polyline(2./3,1.,P(1./2,1./3,1.),P(1./2,0.,2./3), + [](double y) { return P(1./2,1-y,1-(3*y-2)/(5*y-2)); }, + prec), + +}; +} + +//00122301 +// curve 1 : x = -(-5*z*z + 5*z + (sqrt((2*z - 1)*(14*z*z*z - 25*z*z + 16*z - 4))/(2*(6*z*z - 7*z + 3)) + (2*z*z - 3*z + 2)/(2*(6*z*z - 7*z + 3)))*(6*z*z - 7*z + 3) - 2)/(z*(3*z - 1)), y = sqrt((2*z - 1)*(14*z*z*z - 25*z*z + 16*z - 4))/(2*(6*z*z - 7*z + 3)) + (2*z*z - 3*z + 2)/(2*(6*z*z - 7*z + 3)), z = ]0,1/2] +// curve 2 : x = (-z + (2*z - 1)*(sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(6*z*z - 5*z + 1)) + (6*z*z - 6*z + 1)/(2*(2*z - 1)*(3*z - 1))) + 1)/z, y = sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(6*z*z - 5*z + 1)) + (6*z*z - 6*z + 1)/(2*(2*z - 1)*(3*z - 1)), z = ]1/2,1] +// curve 3 : x = (-z + (2*z - 1)*(-sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1))) + 1)/z, y = -sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1)), z = [2/3,1] +template +std::vector> poly00122301(const int prec = 10) +{ +return { +create_polyline(limit_value(0.,1.),1./2,P(1./2,2./3,0.),P(1.,1./2,1./2), + [](double z) { return P(-(-5*z*z + 5*z + (std::sqrt((2*z - 1)*(14*z*z*z - 25*z*z + 16*z - 4))/(2*(6*z*z - 7*z + 3)) + (2*z*z - 3*z + 2)/(2*(6*z*z - 7*z + 3)))*(6*z*z - 7*z + 3) - 2)/(z*(3*z - 1)),std::sqrt((2*z - 1)*(14*z*z*z - 25*z*z + 16*z - 4))/(2*(6*z*z - 7*z + 3)) + (2*z*z - 3*z + 2)/(2*(6*z*z - 7*z + 3)) ,z); }, + prec), +create_polyline(limit_value(1./2,1.),1.,P(1.,1./2,1./2),P(1.,1./2,1.), + [](double z) { return P((-z + (2*z - 1)*(std::sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(6*z*z - 5*z + 1)) + (6*z*z - 6*z + 1)/(2*(2*z - 1)*(3*z - 1))) + 1)/z,std::sqrt(12*z*z*z*z - 28*z*z*z + 24*z*z - 8*z + 1)/(2*(6*z*z - 5*z + 1)) + (6*z*z - 6*z + 1)/(2*(2*z - 1)*(3*z - 1)),z); }, + prec), +create_polyline(2./3,1.,P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double z) { return P( (-z + (2*z - 1)*(-std::sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1))) + 1)/z, -std::sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1)) ,z); }, + prec), +}; +} + +//00122302 +// curve 1 : x = (2*z*z - 3*z + (4*z - 3)*(-sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3))) + 2)/(z*(2*z - 1)), y = -sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3)), z = ]0,1/2] +// curve 2 : x = 1-z, y = 1-(-sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3))), z' = 1-((2*z*z - 3*z + (4*z - 3)*(-sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3))) + 2)/(z*(2*z - 1))), z = ]0,1/2] +template +std::vector> poly00122302(const int prec = 10) +{ +return { + create_polyline(limit_value(0.,1.),1./2, P(1./2,2./3,0.),P(1./3,1.,1./2), + [](double z) { return P((2*z*z - 3*z + (4*z - 3)*(-std::sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3))) + 2)/(z*(2*z - 1)),-std::sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3)),z); }, + prec), + create_polyline(limit_value(0.,1.),1./2, P(1.,1./3,1./2),P(1./2,0.,2./3), + [](double z) { return P(1-z,1-(-std::sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3))),1-((2*z*z - 3*z + (4*z - 3)*(-std::sqrt((z - 1)*(z*z*z - 13*z*z + 12*z - 4))/(2*(4*z - 3)) + (z - 1)*(z + 2)/(2*(4*z - 3))) + 2)/(z*(2*z - 1)))); }, + prec), + +}; +} + +//00122313 +// curve 1 : x = (-1 + (3*z*z - 2*z)/(z - 1))*(z - 1)/z, y = (3*z*z - 2*z)/(z - 1), z = [1/3,2/3] +// curve 2 : x = [1/3,2/3], y = (-1 + 3*x - 3*x*x)/(-1 + x), z = (1 - 3*x + 3*x*x)/x) +// curve 3 : x = -(3*y*y-4*y+1)/y,y = [1/3,2/3], z = (3*y*y-2*y)/(y-1) +template +std::vector> poly00122313(const int prec = 10) +{ +return { + create_polyline(1./3,1./2, P(1.,1./2,1./3), P(1./2,1./2,1./2), + [](double z) { return P( (-1 + (3*z*z - 2*z)/(z - 1))*(z - 1)/z, (3*z*z - 2*z)/(z - 1),z); }, + prec), + create_polyline(1./2,2./3, P(1./2,1./2,1./2),P(1./2,0.,2./3), + [](double z) { return P( (-1 + (3*z*z - 2*z)/(z - 1))*(z - 1)/z, (3*z*z - 2*z)/(z - 1),z); }, + prec), + create_polyline(1./2,2./3, P(1./2,1./2,1./2),P(2./3,1.,1./2), + [](double x) { return P( x,(-1 + 3*x - 3*x*x)/(-1 + x),(1 - 3*x + 3*x*x)/x); }, + prec), + create_polyline(1./3,1./2, P(1./3,1./2,1.), P(1./2,1./2,1./2), + [](double x) { return P( x,(-1 + 3*x - 3*x*x)/(-1 + x),(1 - 3*x + 3*x*x)/x); }, + prec), + create_polyline(1./3,1./2, P(0.,1./3,1./2), P(1./2,1./2,1./2), + [](double y) { return P(-(3*y*y-4*y+1)/y ,y,(3*y*y-2*y)/(y-1)); }, + prec), + create_polyline(1./2,2./3, P(1./2,1./2,1./2), P(1./2,2./3,0.), + [](double y) { return P(-(3*y*y-4*y+1)/y ,y,(3*y*y-2*y)/(y-1)); }, + prec), +}; +} + +//00122331 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = -(-4*z*z + 5*z + (-(2*z - 1)*sqrt(5*z*z - 8*z + 4)/(2*(4*z*z - 6*z + 3)) + (2*z*z - 3*z + 2)/(2*(4*z*z - 6*z + 3)))*(4*z*z - 6*z + 3) - 2)/(z*(2*z - 1)), y = -(2*z - 1)*sqrt(5*z*z - 8*z + 4)/(2*(4*z*z - 6*z + 3)) + (2*z*z - 3*z + 2)/(2*(4*z*z - 6*z + 3)),z = ]0,1/2[ +// curve 3 : x = -(-4*z*z + z + (sqrt(-(z - 1)*(3*z + 1))*(2*z - 1)/(2*(4*z*z - 2*z - 1)) + (6*z*z - 3*z - 1)/(2*(4*z*z - 2*z - 1)))*(4*z*z - 2*z - 1) + 1)/(z*(2*z - 1)), y = sqrt(-(z - 1)*(3*z + 1))*(2*z - 1)/(2*(4*z*z - 2*z - 1)) + (6*z*z - 3*z - 1)/(2*(4*z*z - 2*z - 1)),z = ]1/2,2/3] +template +std::vector> poly00122331(const int prec = 10) +{ +return { + create_polyline(0.,1./3, P(0.,1./2,1./2),P(1./3,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./3,2./3, P(1./3,1./2,1./2),P(2./3,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(2./3,1., P(2./3,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(limit_value(0.,1.),limit_value(1./2,-1.), P(1./2,2./3,0.),P(2./3,1./2,1./2), + [](double z) { return P(-(-4*z*z + 5*z + (-(2*z - 1)*std::sqrt(5*z*z - 8*z + 4)/(2*(4*z*z - 6*z + 3)) + (2*z*z - 3*z + 2)/(2*(4*z*z - 6*z + 3)))*(4*z*z - 6*z + 3) - 2)/(z*(2*z - 1)),-(2*z - 1)*std::sqrt(5*z*z - 8*z + 4)/(2*(4*z*z - 6*z + 3)) + (2*z*z - 3*z + 2)/(2*(4*z*z - 6*z + 3)),z); }, + prec), + create_polyline(limit_value(1./2,1.),2./3, P(1./3,1./2,1./2),P(1./2,0.,2./3), + [](double z) { return P( -(-4*z*z + z + (std::sqrt(-(z - 1)*(3*z + 1))*(2*z - 1)/(2*(4*z*z - 2*z - 1)) + (6*z*z - 3*z - 1)/(2*(4*z*z - 2*z - 1)))*(4*z*z - 2*z - 1) + 1)/(z*(2*z - 1)),std::sqrt(-(z - 1)*(3*z + 1))*(2*z - 1)/(2*(4*z*z - 2*z - 1)) + (6*z*z - 3*z - 1)/(2*(4*z*z - 2*z - 1)),z); }, + prec), + +}; +} + +//01101023 +// curve 1 : x = 1./2, y = 1./(2*z), z = [1/2,1] +// curve 2 : x = 1/2, y = [0,1/2], z = (-1 + 2*y)/(-2 + 3*y) +template +std::vector> poly01101023(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./(2*z),z); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,1./2),P(1./2,1./2,0.), + [](double y) { return P(1./2,y,(-1 + 2*y)/(-2 + 3*y)); }, + prec), + +}; +} + +//01101223 +// curve 1 : x = [1/2,1], y = x/(-1 + 3*x), z = (-1 + 3*x - x*x)/(-1 + 3*x) +template +std::vector> poly01101223(const int prec = 10) +{ +return { + create_polyline(1./2,1, P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,x/(-1 + 3*x),(-1 + 3*x - x*x)/(-1 + 3*x)); }, + prec), +}; +} + +//01101231 +// no curves +template +std::vector> poly01101231(const int /*prec*/ = 10) +{ +return { + + +}; +} + +//01102332 +// curve 1 : x =[0,1], y = z = 1/2 +// curve 2 : y =[0,1], x = z = 1/2 +// curve 3 : z =[0,1], y = x = 1/2 +template +std::vector> poly01102332(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,1./2,0.),P(1./2,1./2,1./2), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + +}; +} + +//01121223 +// no curves +template +std::vector> poly01121223(const int /*prec*/ = 10) +{ +return { + + +}; +} + +//01121230 +// curve 1 : x = -(-7*z*z + 8*z + (-sqrt(-(2*z - 1)*(4*z*z*z - 12*z*z + 10*z - 3))/(2*(9*z*z - 10*z + 3)) + (10*z*z - 10*z + 3)/(2*(9*z*z - 10*z + 3)))*(9*z*z - 10*z + 3) - 3)/(6*z*z - 7*z + 3), y = -sqrt(-(2*z - 1)*(4*z*z*z - 12*z*z + 10*z - 3))/(2*(9*z*z - 10*z + 3)) + (10*z*z - 10*z + 3)/(2*(9*z*z - 10*z + 3)), z = [1/2,1] +// curve 2 : x = -(-5*z*z + 5*z + (sqrt(-z*(8*z*z*z - 20*z*z + 15*z - 4))/(2*(3*z*z - 2*z + 1)) + (2*z*z - 3*z + 2)/(2*(3*z*z - 2*z + 1)))*(3*z*z - 2*z + 1) - 2)/((2*z - 1)*(3*z - 1)), y = sqrt(-z*(8*z*z*z - 20*z*z + 15*z - 4))/(2*(3*z*z - 2*z + 1)) + (2*z*z - 3*z + 2)/(2*(3*z*z - 2*z + 1)), z = ]1/2,1] +template +std::vector> poly01121230(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1./2,1./2,1.), + [](double z) { return P(-(-7*z*z + 8*z + (-std::sqrt(-(2*z - 1)*(4*z*z*z - 12*z*z + 10*z - 3))/(2*(9*z*z - 10*z + 3)) + (10*z*z - 10*z + 3)/(2*(9*z*z - 10*z + 3)))*(9*z*z - 10*z + 3) - 3)/(6*z*z - 7*z + 3),-std::sqrt(-(2*z - 1)*(4*z*z*z - 12*z*z + 10*z - 3))/(2*(9*z*z - 10*z + 3)) + (10*z*z - 10*z + 3)/(2*(9*z*z - 10*z + 3)) ,z); }, + prec), + create_polyline(limit_value(1./2,1.),1., P(1./2,1.,1./2),P(1./2,1./2,1.), + [](double z) { return P( -(-5*z*z + 5*z + (std::sqrt(-z*(8*z*z*z - 20*z*z + 15*z - 4))/(2*(3*z*z - 2*z + 1)) + (2*z*z - 3*z + 2)/(2*(3*z*z - 2*z + 1)))*(3*z*z - 2*z + 1) - 2)/((2*z - 1)*(3*z - 1)), std::sqrt(-z*(8*z*z*z - 20*z*z + 15*z - 4))/(2*(3*z*z - 2*z + 1)) + (2*z*z - 3*z + 2)/(2*(3*z*z - 2*z + 1)),z); }, + prec), +}; +} + +//01122330 +// curve 1 : x =[0,1], y = z = 1/2 +// curve 2 : y =[0,1], x = z = 1/2 +template +std::vector> poly01122330(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + +}; +} + +//01123023 +// curve 1 : x =[0,1], y = z = 1/2 +template +std::vector> poly01123023(const int prec = 10) +{ +return { +create_polyline(0.,1., P(0.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + +}; +} + +//01233210 +// curve 1 : x =[0,1], y = z = 1/2 +// curve 2 : y =[0,1], x = z = 1/2 +// curve 3 : z =[0,1], y = x = 1/2 +template +std::vector> poly01233210(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,1./2,0.),P(1./2,1./2,1./2), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + +}; +} + + +//00001234 +// curve 1 : x = 1/2, y = [0,1/2], z = 2/(3-y) +// curve 2 : x = 1/2, y = [1/2,1], z = 1/(2+y) +// curve 3 : x = [0,1/2], y = 1/2, z = 2/(3-x) +// curve 4 : x = [1/2,1], y = 1/2, z = 1/(2+x) +// curve 5 : x = y = 1/2, z = [4/5,1] +template +std::vector> poly00001234(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(1./2,0.,2./3),P(1./2,1./2,4./5), + [](double y) { return P(1./2,y,2./(3-y)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,4./5),P(1./2,1.,2./3), + [](double y) { return P(1./2,y,2./(2+y)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,1./2,4./5), + [](double x) { return P(x,1./2,2./(3-x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,4./5),P(1.,1./2,2./3), + [](double x) { return P(x,1./2,2./(2+x)); }, + prec), + create_polyline(4./5,1., P(1./2,1./2,4./5),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), +}; +} + +//00010234 +// curve 1 : x = [1/2,1], y = (2 - x)/(1 + x), z = 1/2 +// curve 2 : x = (2 - z)/(1 + z), y = 1/2, z = [1/2,1] +// curve 3 : x = 1/2, y = [1/2,1], z = (2 - y)/(1 + y) +template +std::vector> poly00010234(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,(2 - x)/(1 + x),1./2); }, + prec), + create_polyline(1./2,1., P(1.,1./2,1./2),P(1./2,1./2,1.), + [](double z) { return P((2 - z)/(1 + z),1./2,z); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,(2 - y)/(1 + y)); }, + prec), + +}; +} + +//00011234 +// curve 1 : x = ]0,1/2], y = (2 + x - sqrt(4 - 8*x + x*x))/(6*x), z = (2 - x + x*x + sqrt(4 - 8*x + x*x) - x*sqrt(4 - 8*x + x*x))/(2*(3 - 4*x + 2*x*x)) +// curve 2 : x = 1/2, y = [2/3,1], z = 1-y/2 +// curve 3 : x = 1/2, y = [1/2,2/3], z = y/(-1 + 3*y) +// curve 4 : x = [2/3,1], y = 1./2, z = 1.-x/2 +// curve 5 : x = [1/2,2/3], y = 1./2, z = x/(-1 + 3*x) +// curve 6 : x = [1/2,2/3], y = (-1 + 2*x)/(x*(-1 + 3*x)), z = x/(1 - 2*x + 3*x*x) +// curve 7 : x = [1/2,2/3], y = (1 - x)/x, z = x +// curve 8 : x = [1/2,1], y = 1/(1+x),1/(1+x) +template +std::vector> poly00011234(const int prec = 10) +{ +return { + create_polyline(limit_value(0,1),1./2, P(0.,1./2,2./3),P(1./2,2./3,2./3), + [](double x) { return P(x,(2 + x - std::sqrt(4 - 8*x + x*x))/(6*x),(2 - x + x*x + std::sqrt(4 - 8*x + x*x) - x*std::sqrt(4 - 8*x + x*x))/(2*(3 - 4*x + 2*x*x))); }, + prec), + create_polyline(2./3,1.,P(1./2,2./3,2./3),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1.-y/2); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1.),P(1./2,2./3,2./3), + [](double y) { return P(1./2,y,y/(-1 + 3*y)); }, + prec), + create_polyline(2./3,1.,P(2./3,1./2,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1.-x/2); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1.),P(2./3,1./2,2./3), + [](double x) { return P(x,1./2,x/(-1 + 3*x)); }, + prec), + create_polyline(1./2,2./3,P(1./2,0.,2./3),P(2./3,1./2,2./3), + [](double x) { return P(x,(-1 + 2*x)/(x*(-1 + 3*x)),x/(1 - 2*x + 3*x*x)); }, + prec), + create_polyline(1./2,(2.23606-1)/2,P(1./2,1.,1./2),P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2), + [](double x) { return P(x,(1 - x)/x,x); }, + prec), + create_polyline((2.23606-1)/2,2./3,P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2),P(2./3,1./2,2./3), + [](double x) { return P(x,(1 - x)/x,x); }, + prec), + create_polyline(1./2,(2.23606-1)/2,P(1./2,2./3,2./3),P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2), + [](double x) { return P(x,1/(1+x),1/(1+x)); }, + prec), + create_polyline((2.23606-1)/2,1.,P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2),P(1.,1./2,1./2), + [](double x) { return P(x,1/(1+x),1/(1+x)); }, + prec), +}; +} + +//00012034 +// curve 1 : x = [1/2,1], y = (1+ x)/(3*x), z = 1/2 +// curve 2 : x = 1/2, y = [1/2,1], z = (2 - y)/(1 + y) +// curve 3 : x =[0,1/2], y = 1/2, z = (x-2)/(3*x-3) +template +std::vector> poly00012034(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,2./3,1./2), + [](double x) { return P(x,(1+ x)/(3*x),1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,(2 - y)/(1 + y)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,1./2,1.), + [](double x) { return P(x,1./2,(x-2)/(3*x-3)); }, + prec), +}; +} + +//00012134 +// curve 1 : x = [1-1./1.73205,1./2], y = (-1 + 2*x)/(x*(-2 + 3*x)), z = -x/(1 - 5*x + 3*x*x) +// curve 2 : x = [(0.,1-1./1.73205], y = 1/2, z = (-2 + x)/(-3 + 2*x) +// curve 3 : x = 1/2, y = [2/3,1], z = 1-y/2 +// curve 4 : x = -(z - 1)*(3*z - 1)/z, y = z/(3*z - 1), z = [1/2,2/3] +// curve 5 : x = [1-1./1.73205,1./2], y = (-1 - x*x + sqrt(1 - 6*x*x + 4*x*x*x + x*x*x*x))/(2*(-2 + x)*x), z = (-1 - 2*x + x*x - sqrt(1 - 6*x*x + 4*x*x*x + x*x*x*x))/(2*(-1 - 2*x + 2*x*x)) +// curve 6 : x = 1/2, y = [1/2,2/3], z = y/(-1 + 3*y) +// curve 7 : x = [1-1./1.73205,1./2], y = 1/2, z = x/(1-x) +template +std::vector> poly00012134(const int prec = 10) +{ +return { + create_polyline(1-1./1.73205,1./2, P(1-1./1.73205,1./2,1.73205-1.),P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 2*x)/(x*(-2 + 3*x)),-x/(1 - 5*x + 3*x*x)); }, + prec), + create_polyline(0.,1-1./1.73205, P(0.,1./2,2./3),P(1-1./1.73205,1./2,1.73205-1.), + [](double x) { return P(x,1./2,(-2 + x)/(-3 + 2*x)); }, + prec), + create_polyline(2./3,1., P(1./2,2./3,2./3),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1.-y/2); }, + prec), + create_polyline(1./2,2./3, P(1./2,1.,1./2),P(1./2,2./3,2./3), + [](double z) { return P( -(z - 1)*(3*z - 1)/z,z/(3*z - 1),z); }, + prec), + create_polyline(1-1./1.73205,1./2,P(1-1./1.73205,1./2,1.73205-1.),P(1./2,2./3,2./3), + [](double x) { return P(x,(-1 - x*x + std::sqrt(1 - 6*x*x + 4*x*x*x + x*x*x*x))/(2*(-2 + x)*x),(-1 - 2*x + x*x - std::sqrt(1 - 6*x*x + 4*x*x*x + x*x*x*x))/(2*(-1 - 2*x + 2*x*x)) ); }, + prec), + create_polyline(1./2,2./3, P(1./2,1./2,1.),P(1./2,2./3,2./3), + [](double y) { return P( 1./2,y,y/(-1 + 3*y)); }, + prec), + create_polyline(1-1./1.73205,1./2, P(1-1./1.73205,1./2,1.73205-1.),P(1./2,1./2,1.), + [](double x) { return P(x ,1./2,x/(1-x)); }, + prec), +}; +} + +//00012234 +// curve 1 : x = [1/2,1], y = 1/(2x), z = 1/2 +// curve 2 : x = [1/2,1], y = z = 1./(1+x) +// curve 3 : x = 1/2, y = [2/3,1], z = 1-y/2 +// curve 4 : x = [0,1/2], y = 1/(2-x), z = 2/3 +// curve 5 : x = 1/2, y = 2/3, z =[2/3,1] +template +std::vector> poly00012234(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x ,1./(2*x),1./2); }, + prec), + create_polyline(1./2,1., P(1./2,2./3,2./3),P(1.,1./2,1./2), + [](double x) { return P(x ,1./(1+x),1./(1+x)); }, + prec), + create_polyline(2./3,1., P(1./2,2./3,2./3),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1.-y/2); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,2./3,2./3), + [](double x) { return P(x,1./(2-x),2./3); }, + prec), + create_polyline(2./3,1., P(1./2,2./3,2./3),P(1./2,2./3,1.), + [](double z) { return P(1./2,2./3,z); }, + prec), +}; +} + +//00012334 +// curve 1 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = 2./3 +// curve 2 : x = [1/2,1], y = x/(-1 + 3*x), z = (-1 + 3*x - x*x)/(-1 + 3*x) +// curve 3 : x = [1/2,1], y = 1/2x, z = 1/2 +// problem with close polylines, there is an over refinement +template +std::vector> poly00012334(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),2./3); }, + prec), + create_polyline(1./2,1., P(1/2.,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x, x/(-1 + 3*x),(-1 + 3*x - x*x)/(-1 + 3*x)); }, + prec), + create_polyline(1./2,1., P(1/2.,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./(2*x),1./2); }, + prec), +}; +} + +//00012340 +// curve 1 : x = [0,1/2], y = 1/2, z = (-2 + x)/(3*(-1 + x)) +// curve 2 : x = [0,1/2], y = [0,1/2], z = (-2 + y)/(3*(-1 + y)) +template +std::vector> poly00012340(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,1./2,1.), + [](double x) { return P(x,1./2,(-2 + x)/(3*(-1 + x))); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double y) { return P(1./2,y,(-2 + y)/(3*(-1 + y))); }, + prec), +}; +} + +//00012341 +// curve 1 : x = 1/2, y = [0.,1-1./1.73205], z = (-2 + y)/(-3 + 2*y) +// curve 2 : x = [0.,1-1./1.73205], y = 1/2, z = (-2 + x)/(-3 + 2*x) +// curve 3 : x = 1/2, y = [1-1./1.73205,1./2], z = -y/(-1 + y) +// curve 4 : x = [1-1./1.73205,1./2], y = 1/2, z = -x/(-1 + x) +// curve 5 : x = [1-1./1.73205,1./2], y = (-1 - 2*x + 2*x*x + sqrt(1 - 4*x + 12*x*x - 12*x*x*x + 4*x*x*x*x))/(2*(-2 + x)*x), z = (1 - 4*x + 2*x*x + sqrt(1 - 4*x + 12*x*x - 12*x*x*x + 4*x*x*x*x))/(2*(-1 + x)*(-1+x)) +// curve 6 : x = [1/2,1], y = (1 + x - sqrt(1 - x + x*x))/(3*x), z = (x - sqrt(1 - x + x*x))/(-1 + x) +// curve 7 : x = (1 + y - sqrt(1 - y + y*y))/(3*y), y = [1/2,1], z = (y - sqrt(1 - y + y*y))/(-1 + y) +template +std::vector> poly00012341(const int prec = 10) +{ +return { + create_polyline(0.,1-1./1.73205, P(1./2,0.,2./3),P(1./2,1-1./1.73205,1.73205-1), + [](double y) { return P(1./2,y,(-2 + y)/(-3 + 2*y)); }, + prec), + create_polyline(0.,1-1./1.73205, P(0.,1./2,2./3),P(1-1./1.73205,1./2,1.73205-1), + [](double x) { return P(x,1./2,(-2 + x)/(-3 + 2*x)); }, + prec), + create_polyline(1-1./1.73205,1./2,P(1./2,1-1./1.73205,1.73205-1), P(1./2,1./2,1.), + [](double y) { return P(1./2,y,-y/(-1 + y)); }, + prec), + create_polyline(1-1./1.73205,1./2,P(1-1./1.73205,1./2,1.73205-1), P(1./2,1./2,1.), + [](double x) { return P(x,1./2,-x/(-1 + x)); }, + prec), + create_polyline(1-1./1.73205,1./2,P(1-1./1.73205,1./2,1.73205-1),P(1./2,1-1./1.73205,1.73205-1), + [](double x) { return P(x,(-1 - 2*x + 2*x*x + std::sqrt(1 - 4*x + 12*x*x - 12*x*x*x + 4*x*x*x*x))/(2*(-2 + x)*x),(1 - 4*x + 2*x*x + std::sqrt(1 - 4*x + 12*x*x - 12*x*x*x + 4*x*x*x*x))/(2*(-1 + x)*(-1+x))); }, + prec), + create_polyline(1./2,1., P(1./2,1-1./1.73205,1.73205-1), P(1.,1./3,1./2) , + [](double x) { return P(x,(1 + x - std::sqrt(1 - x + x*x))/(3*x),(x - std::sqrt(1 - x + x*x))/(-1 + x)); }, + prec), + create_polyline(1./2,1.,P(1-1./1.73205,1./2,1.73205-1),P(1./3,1.,1./2), + [](double y) { return P((1 + y - std::sqrt(1 - y + y*y))/(3*y),y,(y - std::sqrt(1 - y + y*y))/(-1 + y)); }, + prec), +}; +} + +//00012342 +// curve 1 : x = [1/2,1], y = 1/(2*x), z = -x/(1 - 5*x + 2*x*x) +// curve 2 : x = [1/2,1], y = (-1 + 2*x)/(-1 + 3*x), z = (1 - 4*x + 2*x*x)/(1 - 4*x + x*x) +// curve 3 : x = [0,1/2], y = (-1 +x)/(-2 + 3*x), z = (2 - 4*x + x*x)/(3 - 6*x + 2*x*x) +template +std::vector> poly00012342(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1/(2*x),-x/(1 - 5*x + 2*x*x)); }, + prec), + create_polyline(1./2,1., P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + 3*x),(1 - 4*x + 2*x*x)/(1 - 4*x + x*x)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,1.,1./2), + [](double x) { return P(x,(-1 +x)/(-2 + 3*x),(2 - 4*x + x*x)/(3 - 6*x + 2*x*x)); }, + prec), +}; +} + +//00012343 +// curve 1 : x = [1/2,1], y = 1/(2*x), z = 1/(2*x+1) +// curve 2 : x = [1/3,1/2], y = (-1 + 2*x)/(-1 + x), z = (1 - 2*x + 2*x*x)/(1 - x + x*x) +// curve 3 : x = [0,1/3], y = 1./2, z = (-2 + x)/(-3 + 2*x) +// curve 4 : x = [1/3,1/2], y = -x/(-1 + x), z = (-1 + x + x*x)/(-1 + 2*x*x) +// curve 5 : x = 1/3, y = 1/2, z = [5/7,1] +template +std::vector> poly00012343(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./3), + [](double x) { return P(x,1/(2*x),1/(2*x+1)); }, + prec), + create_polyline(1./3,1./2, P(1./3,1./2,5./7),P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 2*x)/(-1 + x),(1 - 2*x + 2*x*x)/(1 - x + x*x)); }, + prec), + create_polyline(0.,1./3, P(0.,1./2,2./3),P(1./3,1./2,5./7), + [](double x) { return P(x,1./2,(-2 + x)/(-3 + 2*x)); }, + prec), + create_polyline(1./3,1./2,P(1./3,1./2,5./7), P(1./2,1.,1./2), + [](double x) { return P(x,-x/(-1 + x),(-1 + x + x*x)/(-1 + 2*x*x)); }, + prec), + create_polyline(5./7,1., P(1./3,1./2,5./7),P(1./3,1./2,1.), + [](double z) { return P(1./3,1./2,z); }, + prec), +}; +} + +//00111234 +// curve 1 : x = [1/2,1], y = (-1 + 2*x)/(-1 + 3*x), z = 1/(1 + x) +// curve 2 : x = [1/2,1], y = 1./2, z = 1./(2*x) +// curve 3 : x = 1/2, y =[1/2,1], z = (2*y)/(-1 + 4*y) +template +std::vector> poly00111234(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + 3*x),1/(1 + x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(2*x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,2./3), + [](double y) { return P(1./2,y,(2*y)/(-1 + 4*y)); }, + prec), +}; +} + +//00112234 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = [1/2,1], y = z = 1/(1 + x) +// curve 3 : x = 1/2, y = [2/3,1], z = 2/3 +// curve 4 : x = 1/2, y = 2/3, z = [2/3,1] +// curve 5 : x = [0,1/2], y = z = 1/(2 - x) +template +std::vector> poly00112234(const int prec = 10) +{ +return { + create_polyline(0.,1., P(0.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,2./3,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,1/(1 + x),1/(1 + x)); }, + prec), + create_polyline(2./3,1., P(1./2,2./3,2./3),P(1./2,1.,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(2./3,1., P(1./2,2./3,2./3),P(1./2,2./3,1.), + [](double z) { return P(1./2,2./3,z); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,2./3,2./3), + [](double x) { return P(x,1/(2 - x),1/(2 - x)); }, + prec), +}; +} + +//00112324 +// curve 1 : x = [0,2/3], y = 1/2, z = 1/(3 - 2*x) +// curve 2 : x = [2/3,1], y = 1/2, z = 1./(1 + x) +// curve 3 : x = [1/2,2/3], y = (-1 + 2*x)/x, z = 1/(1 + x) +// curve 4 : x = [1/2,2/3], y = (1 - x)/x, z = 1/(1 + x) +// curve 5 : x = 2/3, y = 1/2, z = [3/5,1] +template +std::vector> poly00112324(const int prec = 10) +{ +return { + create_polyline(0.,2./3, P(0.,1./2,1./3),P(2./3,1./2,3./5), + [](double x) { return P(x,1./2 ,1/(3 - 2*x)); }, + prec), + create_polyline(2./3,1, P(2./3,1./2,3./5),P(1.,1./2,1.), + [](double x) { return P(x,1./2 ,1./(1 + x)); }, + prec), + create_polyline(1./2,2./3, P(1./2,0.,2./3),P(2./3,1./2,3./5), + [](double x) { return P(x,(-1 + 2*x)/x,1/(1 + x)); }, + prec), + create_polyline(1./2,2./3, P(1./2,1.,2./3),P(2./3,1./2,3./5), + [](double x) { return P(x,(1 - x)/x,1/(1 + x)); }, + prec), + create_polyline(3./5,1., P(2./3,1./2,3./5),P(2./3,1./2,1.), + [](double z) { return P(2./3,1./2,z); }, + prec), + +}; +} + +//00112334 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = [1/2,1], y = x/(-1 + 3*x), z = 1/(1 + x) +// curve 2 : x = 1-x', y = 1- x'/(-1 + 3*x'), z = 1/(1 + x'), x' = [1/2,1] +template +std::vector> poly00112334(const int prec = 10) +{ +return { + create_polyline(0.,1., P(0.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + + create_polyline(1./2,1., P(1./2,1.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,x/(-1. + 3*x),1./(1 + x)); }, + prec), + create_polyline(1./2,1., P(1./2,0.,2./3),P(0.,1./2,1./2), + [](double x) { return P(1-x,1 - x/(-1. + 3*x),1./(1 + x)); }, + prec), +}; +} + +//00121234 +// curve 1 : x = 1/2, y = [0,2/3], z = (-2 + 3*y)/(-3 + 4*y +// curve 2 : x = 1/2, y =[1/2,1], z = y/(-1 + 3*y) +template +std::vector> poly00121234(const int prec = 10) +{ +return { + create_polyline(0.,2./3, P(1./2,0.,2./3),P(1./2,2./3,0.), + [](double y) { return P(1./2,y,(-2 + 3*y)/(-3 + 4*y)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,y/(-1 + 3*y)); }, + prec), +}; +} + +//00121304 +// curve 1 : x = [1/2,4.-2*1.73205], y = (2 + x - sqrt(4 - 8*x + x*x))/(6*x), z = (-2 + 5*x - x*x - sqrt(4 - 8*x + x*x) + x*sqrt(4 - 8*x + x*x))/(2*x) +// curve 2 : x = [1/2,4.-2*1.73205], y = (2 + x + sqrt(4 - 8*x + x*x))/(6*x), z = (-2 + 5*x - x*x + sqrt(4 - 8*x + x*x) - x*sqrt(4 - 8*x + x*x))/(2*x) +// curve 3 : x = [1/2,4.-2*1.73205], y = (-2 + 5*x - x*x + sqrt(4 - 8*x + x*x) - x*sqrt(4 - 8*x + x*x))/(2*x), z = (2 + x + sqrt(4 - 8*x + x*x))/(6*x) +// curve 4 : x = [1/2,4.-2*1.73205], y = (-2 + 5*x - x*x - sqrt(4 - 8*x + x*x) + x*sqrt(4 - 8*x + x*x))/(2*x), z = (2 + x - sqrt(4 - 8*x + x*x))/(6*x) +// curve 5 : x = [1/2,1], y = 1/2x, z = 1/2 +// curve 6 : x = [1/2,1], y = 1/2, z = 1/2x +template +std::vector> poly00121304(const int prec = 10) +{ +return { + create_polyline(1./2,4.-2*1.73205, P(1./2,2./3,0.),P(4.-2*1.73205,(1.+1/1.73205)/2,(1.73205-1)/2.), + [](double x) { return P(x,(2 + x - std::sqrt(4 - 8*x + x*x))/(6*x),(-2 + 5*x - x*x - std::sqrt(4 - 8*x + x*x) + x*std::sqrt(4 - 8*x + x*x))/(2*x)); }, + prec), + create_polyline(1./2,4.-2*1.73205, P(1./2,1.,1./2),P(4.-2*1.73205,(1.+1/1.73205)/2,(1.73205-1)/2.), + [](double x) { return P(x,(2 + x + std::sqrt(4 - 8*x + x*x))/(6*x),(-2 + 5*x - x*x + std::sqrt(4 - 8*x + x*x) - x*std::sqrt(4 - 8*x + x*x))/(2*x)); }, + prec), + create_polyline(1./2,4.-2*1.73205, P(1./2,1./2,1.),P(4.-2*1.73205,(1.73205-1)/2.,(1.+1/1.73205)/2), + [](double x) { return P(x,(-2 + 5*x - x*x + std::sqrt(4 - 8*x + x*x) - x*std::sqrt(4 - 8*x + x*x))/(2*x),(2 + x + std::sqrt(4 - 8*x + x*x))/(6*x)); }, + prec), + create_polyline(1./2,4.-2*1.73205, P(1./2,0.,2./3),P(4.-2*1.73205,(1.73205-1)/2.,(1.+1/1.73205)/2), + [](double x) { return P(x,(-2 + 5*x - x*x - std::sqrt(4 - 8*x + x*x) + x*std::sqrt(4 - 8*x + x*x))/(2*x),(2 + x - std::sqrt(4 - 8*x + x*x))/(6*x)); }, + prec), + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./(2*x),1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(2*x)); }, + prec), +}; +} + +//00121324 +// curve 1 : x = [1./2,0.5944], y = (1 - 2*x)/(1 - 3*x + x*x), z = 1/(1 + x) +// curve 2 : x = [0.5944,1], y = x/(1 + x*x), z = 1/(1 + x) +// curve 3 : x = [3/5,1], y =1./2, z = x/(3*x-1) +// curve 4 : x = z/(3*z-1), y = 1./2, z = [3/4,1] +// curve 5 : x = [1./2,0.5944], y = (x*(-2 + 3*x))/(-1 + 2*x*x), z = (x*(-2 + 3*x))/(1 - 5*x + 5*x*x) +// curve 6 : x = -(-3*z + (3*z - 3)*((3*z - 1)/(3*(2*z - 1)) - sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1))) + 2)/z, y = (3*z - 1)/(3*(2*z - 1)) - sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1)), z = ]0,0.6271] +template +std::vector> poly00121324(const int prec = 10) +{ +return { + create_polyline(1./2,0.5944, P(1./2,0.,2./3),P(0.5944,0.4392,0.6271), + [](double x) { return P(x,(1 - 2*x)/(1 - 3*x + x*x),1/(1 + x)); }, + prec), + create_polyline(0.5944,1.,P(0.5944,0.4392,0.6271),P(1.,1./2,1./2), + [](double x) { return P(x,x/(1 + x*x),1/(1 + x)); }, + prec), + create_polyline(3./5,1.,P(3./5,1./2,3./4),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,x/(3*x-1)); }, + prec), + create_polyline(3./4,1.,P(3./5,1./2,3./4),P(1./2,1./2,1.), + [](double z) { return P(z/(3*z-1),1./2,z); }, + prec), + create_polyline(1./2,0.5944, P(1./2,1./2,1.),P(0.5944,0.4392,0.6271), + [](double x) { return P(x,(x*(-2 + 3*x))/(-1 + 2*x*x),(x*(-2 + 3*x))/(1 - 5*x + 5*x*x)); }, + prec), + create_polyline(limit_value(0.,1),0.6271,P(1./2,2./3,0.),P(0.5944,0.4392,0.6271), + [](double z) { return P(-(-3*z + (3*z - 3)*((3*z - 1)/(3*(2*z - 1)) - std::sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1))) + 2)/z,(3*z - 1)/(3*(2*z - 1)) - std::sqrt(3*z*z - 3*z + 1)/(3*(2*z - 1)),z); }, + prec), +}; +} + +//00121340 +// curve 1 : x = -(-5*z*z + 6*z + ((2*z - 1)*(3*z - 2)/(2*(7*z*z - 9*z + 3)) + sqrt(8*z*z*z*z - 20*z*z*z + 25*z*z - 16*z + 4)/(2*(7*z*z - 9*z + 3)))*(7*z*z - 9*z + 3) - 2)/(z*(2*z - 1)), y = (2*z - 1)*(3*z - 2)/(2*(7*z*z - 9*z + 3)) + sqrt(8*z*z*z*z - 20*z*z*z + 25*z*z - 16*z + 4)/(2*(7*z*z - 9*z + 3)), z = ]0,1/2[ +// curve 2 : x = -(-5*z*z + 4*z + (-sqrt(-(z*z + z - 1)*(3*z*z - 5*z + 1))/(2*(7*z*z - 6*z + 1)) + (9*z*z - 7*z + 1)/(2*(7*z*z - 6*z + 1)))*(7*z*z - 6*z + 1) - 1)/(z*(z + 1)), y = -sqrt(-(z*z + z - 1)*(3*z*z - 5*z + 1))/(2*(7*z*z - 6*z + 1)) + (9*z*z - 7*z + 1)/(2*(7*z*z - 6*z + 1)), z = [2/3,1] +// curve 3 : x = [3/8,1/2], y = (-3 - sqrt(-3 + 8*x))/(2*(-3 + 2*x)), z = (-3 + sqrt(-3 + 8*x))/(2*(-3 + 2*x)) +// curve 4 : x = [3/8,1/2], y = (-3 + sqrt(-3 + 8*x))/(2*(-3 + 2*x)), z = (-3 - sqrt(-3 + 8*x))/(2*(-3 + 2*x)) +template +std::vector> poly00121340(const int prec = 10) +{ +return { + create_polyline(limit_value(0.,1.),limit_value(1./2,-1.), P(1./2,2./3,0.),P(1./2,1.,1./2), + [](double z) { return P(-(-5*z*z + 6*z + ((2*z - 1)*(3*z - 2)/(2*(7*z*z - 9*z + 3)) + std::sqrt(8*z*z*z*z - 20*z*z*z + 25*z*z - 16*z + 4)/(2*(7*z*z - 9*z + 3)))*(7*z*z - 9*z + 3) - 2)/(z*(2*z - 1)),(2*z - 1)*(3*z - 2)/(2*(7*z*z - 9*z + 3)) + std::sqrt(8*z*z*z*z - 20*z*z*z + 25*z*z - 16*z + 4)/(2*(7*z*z - 9*z + 3)),z); }, + prec), + create_polyline(2./3,1., P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double z) { return P(-(-5*z*z + 4*z + (-std::sqrt(-(z*z + z - 1)*(3*z*z - 5*z + 1))/(2*(7*z*z - 6*z + 1)) + (9*z*z - 7*z + 1)/(2*(7*z*z - 6*z + 1)))*(7*z*z - 6*z + 1) - 1)/(z*(z + 1)),-std::sqrt(-(z*z + z - 1)*(3*z*z - 5*z + 1))/(2*(7*z*z - 6*z + 1)) + (9*z*z - 7*z + 1)/(2*(7*z*z - 6*z + 1)),z); }, + prec), + create_polyline(3./8,1./2, P(3./8.,2./3,2./3),P(1./2,1.,1./2), + [](double x) { return P(x,(-3 - std::sqrt(-3 + 8*x))/(2*(-3 + 2*x)),(-3 + std::sqrt(-3 + 8*x))/(2*(-3 + 2*x))); }, + prec), + create_polyline(3./8,1./2, P(3./8.,2./3,2./3),P(1./2,1./2,1.), + [](double x) { return P(x,(-3 + std::sqrt(-3 + 8*x))/(2*(-3 + 2*x)),(-3 - std::sqrt(-3 + 8*x))/(2*(-3 + 2*x))); }, + prec), +}; +} + +//00121341 +// curve 1 : x = [1/2,1], y = 1./(x+1), z = (1 - 2*x)/(1 - 4*x + x*x) +// curve 2 : x = [1/2,1], y = (1 - 2*x)/(1 - 4*x + x*x), z = 1./(x+1) +template +std::vector> poly00121341(const int prec = 10) +{ +return { + create_polyline(1./2,1.,P(1./2,2./3,0.),P(1.,1./2,1./2), + [](double x) { return P(x,1./(x+1),(1 - 2*x)/(1 - 4*x + x*x)); }, + prec), + create_polyline(1./2,1.,P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(1 - 2*x)/(1 - 4*x + x*x),1./(x+1)); }, + prec), +}; +} + +//00121342 +// curve 1 : x = [1/3,1/2], y = x/(-1 + 4*x), z = -x/(-1 + x) +// curve 2 : x = [1/2,1/1.73205], y = (1 - 2*x)/(1 - 3*x + x*x), z = 1/(1 + x) +// curve 3 : x = [1/1.73205,1], y = 1/(2 + x), z = 1/(1 + x) +// curve 4 : x = [1/2,1/1.73205], y = (-2 + 3*x)/(-3 + 4*x), z = (-2 + 3*x)/(-1 + x) +// curve 5 : x = (-2*z*z + 5*z + ((3*z*z - 6*z + 2)/(2*(2*z*z - 6*z + 3)) + sqrt(z*z*z*z - 4*z*z*z + 12*z*z - 12*z + 4)/(2*(2*z*z - 6*z + 3)))*(2*z*z - 6*z + 3) - 2)/z, y = (3*z*z - 6*z + 2)/(2*(2*z*z - 6*z + 3)) + sqrt(z*z*z*z - 4*z*z*z + 12*z*z - 12*z + 4)/(2*(2*z*z - 6*z + 3)), z = [0,(3-1.73205)/2] +template +std::vector> poly00121342(const int prec = 10) +{ +return { + create_polyline(1./3,1./2,P(1./3,1.,1./2),P(1./2,1./2,1.), + [](double x) { return P(x,x/(-1 + 4*x),-x/(-1 + x)); }, + prec), + create_polyline(1./2,1/1.73205,P(1./2,0.,2./3),P(1/1.73205,(6-1.73205)/11,(3-1.73205)/2), + [](double x) { return P(x,(1 - 2*x)/(1 - 3*x + x*x),1/(1 + x)); }, + prec), + create_polyline(1./1.73205,1.,P(1/1.73205,(6-1.73205)/11,(3-1.73205)/2),P(1.,1./3,1./2), + [](double x) { return P(x,1/(2 + x),1/(1 + x)); }, + prec), + create_polyline(1./2,1/1.73205,P(1./2,1./2,1.),P(1/1.73205,(6-1.73205)/11,(3-1.73205)/2), + [](double x) { return P(x,(-2 + 3*x)/(-3 + 4*x),(-2 + 3*x)/(-1 + x)); }, + prec), + create_polyline(limit_value(0.,1),(3-1.73205)/2,P(1./2,2./3,0.),P(1/1.73205,(6-1.73205)/11,(3-1.73205)/2), + [](double z) { return P((-2*z*z + 5*z + ((3*z*z - 6*z + 2)/(2*(2*z*z - 6*z + 3)) + std::sqrt(z*z*z*z - 4*z*z*z + 12*z*z - 12*z + 4)/(2*(2*z*z - 6*z + 3)))*(2*z*z - 6*z + 3) - 2)/z,(3*z*z - 6*z + 2)/(2*(2*z*z - 6*z + 3)) + std::sqrt(z*z*z*z - 4*z*z*z + 12*z*z - 12*z + 4)/(2*(2*z*z - 6*z + 3)),z); }, + prec), +}; +} + +//00121344 +// curve 1 : x = [1./2,0.5698], y = 1/(1 + x), z = (1 - 2*x)/(1 - 3*x + x*x) +// curve 2 : x = [0.5698,1], y = 1/(1 + x), z = x/(1 + x) +// curve 3 : x = [1./2,0.5698], y = ((-1 + x)*x)/(1 - 3*x + x*x), z = x/(1 + x) +// curve 4 : x = [0.5698,1], y = x/(1 + x), z = 1/(1 + x) +// curve 5 : x = [1./2,0.5698], y = (1 - 2*x)/(1 - 3*x + x*x), z = 1/(1 + x) +// curve 6 : x = [1./2,0.5698], y = x/(1 + x),((-1 + x)*x)/(1 - 3*x + x*x) +// curve 7 : x = (3*z*z - 3*z + 1)/(2*z*z - 2*z + 1), y = 1-z, z = [0.3629,0.6370] +template +std::vector> poly00121344(const int prec = 10) +{ +return { + create_polyline(1./2,0.5698,P(1./2,2./3,0.),P(0.5698,0.6370,0.3629), + [](double x) { return P(x,1/(1 + x),(1 - 2*x)/(1 - 3*x + x*x)); }, + prec), + create_polyline(0.5698,1.,P(0.5698,0.6370,0.3629),P(1.,1./2,1./2), + [](double x) { return P(x,1/(1 + x),x/(1 + x)); }, + prec), + create_polyline(1./2,0.5698,P(1./2,1.,1./3),P(0.5698,0.6370,0.3629), + [](double x) { return P(x,((-1 + x)*x)/(1 - 3*x + x*x),x/(1 + x)); }, + prec), + create_polyline(0.5698,1.,P(0.5698,0.3629,0.6370),P(1.,1./2,1./2), + [](double x) { return P(x,x/(1 + x),1/(1 + x)); }, + prec), + create_polyline(1./2,0.5698,P(1./2,0.,2./3),P(0.5698,0.3629,0.6370), + [](double x) { return P(x,(1 - 2*x)/(1 - 3*x + x*x),1/(1 + x)); }, + prec), + create_polyline(1./2,0.5698,P(1./2,1./3,1.),P(0.5698,0.3629,0.6370), + [](double x) { return P(x,x/(1 + x),((-1 + x)*x)/(1 - 3*x + x*x)); }, + prec), + create_polyline(0.3629,0.6370,P(0.5698,0.6370,0.3629),P(0.5698,0.3629,0.6370), + [](double z) { return P((3*z*z - 3*z + 1)/(2*z*z - 2*z + 1),1-z,z); }, + prec), +}; +} + +//00122134 +// curve 1 : x = 1/2, y = [0,1], z = (-2 + 3*y)/(-3 + 4 y) +// curve 2 : x = [0,1], y = z = 1/2 +// curve 3 : x = [0,1/2], y = z = 1/(2 - x) +// curve 4 : x = [1/2,1], y = z = 1/(1+ x) +// curve 5 : x = 1/2, y = [1/2,1], z = y/(-1 + 3*y) +// curve 6 : x = 1/2, y = z = [1/2,2/3] + +template +std::vector> poly00122134(const int prec = 10) +{ +return { + create_polyline(0.,1./2,P(1./2,0.,2./3),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,(-2 + 3*y)/(-3 + 4*y)); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,2./3,0.), + [](double y) { return P(1./2,y,(-2 + 3*y)/(-3 + 4*y)); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,2./3,2./3), + [](double x) { return P(x,1/(2 - x),1/(2 - x)); }, + prec), + create_polyline(1./2,1.,P(1./2,2./3,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,1/(1+ x),1/(1 +x)); }, + prec), + create_polyline(2./3,1.,P(1./2,2./3,2./3),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,y/(-1 + 3*y)); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1.),P(1./2,2./3,2./3), + [](double y) { return P(1./2,y,y/(-1 + 3*y)); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,2./3,2./3), + [](double y) { return P(1./2,y,y); }, + prec), +}; +} + +//00122304 +// curve 1 : x = (-3*z*z + 4*z + (-sqrt(3*z*z - 3*z + 1)/(3*(z - 1)) - 1/(3*(z - 1)))*(3*z*z - 6*z + 3) - 2)/(z*(2*z - 1)), y = -sqrt(3*z*z - 3*z + 1)/(3*(z - 1)) - 1/(3*(z - 1)), z = [0,1/2] +// curve 2 : x = [1/2,1], y = (2 - x + sqrt(x)*sqrt(4 - 11*x + 8*x*x))/(2*(1 - x + 2*x*x)), z = (-3*x + sqrt(x)*sqrt(4 - 11*x + 8*x*x))/(2*(1 - 5*x + 2*x*x)) +// curve 3 : x = [1/2,1], y = (2 - x + sqrt(x)*sqrt(4 - 11*x + 8*x*x))/(2*(1 - x + 2*x*x)), z = (-3*x + sqrt(x)*sqrt(4 - 11*x + 8*x*x))/(2*(1 - 5*x + 2*x*x)) +// curve 4 : x = (-z + (2*z - 1)*(-sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1))) + 1)/z, y = -sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1)), z = [2/3,1] +template +std::vector> poly00122304(const int prec = 10) +{ +return { + create_polyline(0.,1./2,P(1./2,2./3,0.),P(1./2,1.,1./2), + [](double z) { return P(-(-3*z*z + 4*z + (-std::sqrt(3*z*z - 3*z + 1)/(3*(z - 1)) - 1/(3*(z - 1)))*(3*z*z - 6*z + 3) - 2)/(z*(2*z - 1)),-std::sqrt(3*z*z - 3*z + 1)/(3*(z - 1)) - 1/(3*(z - 1)),z); }, + prec), + create_polyline(1./2,1.,P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,(2 - x + std::sqrt(x)*std::sqrt(4 - 11*x + 8*x*x))/(2*(1 - x + 2*x*x)),(-3*x + std::sqrt(x)*std::sqrt(4 - 11*x + 8*x*x))/(2*(1 - 5*x + 2*x*x))); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1/(2*x)); }, + prec), + create_polyline(2./3,1.,P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double z) { return P((-z + (2*z - 1)*(-std::sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1))) + 1)/z,-std::sqrt(12*z*z*z*z - 20*z*z*z + 12*z*z - 4*z + 1)/(2*(2*z*z + z - 1)) + (6*z*z - 2*z - 1)/(2*(z + 1)*(2*z - 1)),z); }, + prec), +}; +} + +//00122314 +// curve 1 : x = [1/2,1], y = (-1 + 2*x)/(-1 + 2*x + x*x), z = 1/(1 + x) +// curve 2 : x = [0,4-21.73205], y = (4 - x - sqrt(4 - 8*x + x*x))/6, z = (-2 + 5*x - x*x + sqrt(4 - 8*x + x*x) - x*sqrt(4 - 8*x + x*x))/(2*x) +// curve 3 : x = [1/2,4-21.73205], y = (4 - x + sqrt(4 - 8*x + x*x))/6, z = (-2 + 5*x - x*x - sqrt(4 - 8*x + x*x) + x*sqrt(4 - 8*x + x*x))/(2*x) +// curve 4 : x = [1/2,1], y = 1/2, z = x/(-1 + 3*x) +// curve 5 : x = [1/2,2/3], y = (-1 + 2*x - x*x)/(-1 + 2*x*x), z = (1 - x)/x +// problem with close polylines, there is an over refinement +template +std::vector> poly00122314(const int prec = 10) +{ +return { + create_polyline(1./2,1.,P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + 2*x + x*x),1/(1 + x)); }, + prec), + create_polyline(0.,4.-2*1.73205,P(0.,1./3,1./2),P(4.-2*1.73205,1/1.73205,(1.73205-1)/2.), + [](double x) { return P(x,(4 - x - std::sqrt(4 - 8*x + x*x))/6,(-2 + 5*x - x*x + std::sqrt(4 - 8*x + x*x) - x*std::sqrt(4 - 8*x + x*x))/(2*x) ); }, + prec), + create_polyline(1./2,4.-2*1.73205,P(1./2,2./3,0.),P(4.-2*1.73205,1/1.73205,(1.73205-1)/2.), + [](double x) { return P(x,(4 - x + std::sqrt(4 - 8*x + x*x))/6,(-2 + 5*x - x*x - std::sqrt(4 - 8*x + x*x) + x*std::sqrt(4 - 8*x + x*x))/(2*x) ); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,x/(-1 + 3*x)); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1.),P(2./3,1.,1./2), + [](double x) { return P(x,(-1 + 2*x - x*x)/(-1 + 2*x*x),(1 - x)/x); }, + prec), +}; +} + +//00122324 +// curve 1 : x = [0,1/2], y = 1/(2 - x), z = (1 - 2*x)/(3 - 5*x + x*x) +// curve 2 : x = [1/2,1], y = (-1 + 2*x)/(x*(1 + x)), z = 1/(1 + x) +// curve 3 : x = [2/3,1], y = 1/2, z = x/(2*(-1 + 2*x) +template +std::vector> poly00122324(const int prec = 10) +{ +return { + create_polyline(0.,1./2,P(0.,1./2,1./3),P(1./2,2./3,0.), + [](double x) { return P(x,1/(2 - x),(1 - 2*x)/(3 - 5*x + x*x)); }, + prec), + create_polyline(1./2,1.,P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(-1 + 2*x)/(x*(1 + x)),1/(1 + x)); }, + prec), + create_polyline(2./3,1.,P(2./3,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,x/(2*(-1 + 2*x))); }, + prec), + +}; +} + +//00122334 +// curve 1 : x = [1/2,1], y = x/(-1 + 3*x), z = (x*x)/(1 - 3*x + 4*x*x) +// curve 2 : x = [1/3,1/2], y = (1 - 3*x + 3*x*x)/(2 - 6*x + 5*x*x), z = (1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x) +// curve 3 : x = [1/3,1/2], y = 1/(2 - x), z = (1 - 2*x)/(2 - 4*x + x*x) +// curve 4 : x = [0,1/3], y = 1/(2 - x), z = 1/(2 + x) +// curve 5 : x = [1/3,1/2], y = (-1 + 2*x)/(-1 + x + x*x), z = x/(1 - x + x*x) +// curve 6 : x = [0,1], y = z = 1/2 +template +std::vector> poly00122334(const int prec = 10) +{ +return { + create_polyline(1./2,1.,P(1./2,1.,1/2.),P(1.,1./2,1./2), + [](double x) { return P(x,x/(-1 + 3*x),(x*x)/(1 - 3*x + 4*x*x)); }, + prec), + create_polyline(1./3,1./2,P(1./3,3./5,3./7),P(1./2,1.,1/2.), + [](double x) { return P(x,(1 - 3*x + 3*x*x)/(2 - 6*x + 5*x*x),(1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x)); }, + prec), + create_polyline(1./3,1./2,P(1./3,3./5,3./7),P(1./2,2./3,0.), + [](double x) { return P(x,1/(2 - x),(1 - 2*x)/(2 - 4*x + x*x)); }, + prec), + create_polyline(0.,1./3,P(0.,1./2,1./2),P(1./3,3./5,3./7), + [](double x) { return P(x,1/(2 - x),1/(2 + x)); }, + prec), + create_polyline(1./3,(3.-2.23606)/2,P(1./3,3./5,3./7),P((3.-2.23606)/2,1./2,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + x + x*x),x/(1 - x + x*x)); }, + prec), + create_polyline((3.-2.23606)/2,1./2,P((3.-2.23606)/2,1./2,1./2),P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 2*x)/(-1 + x + x*x),x/(1 - x + x*x)); }, + prec), + create_polyline(0.,(3.-2.23606)/2,P(0.,1./2,1./2),P((3.-2.23606)/2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline((3.-2.23606)/2,1.,P((3.-2.23606)/2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), +}; +} + +//00122344 +// curve 1 : x = [1./2,(2.23606-1.)/2], y = x/(1 + x), z = (x*x)/(-1 + 2*x + x*x) +// curve 2 : x = [(3.-2.23606)/2,1./2], y = (-1 + x)*(-1+x)/(2 - 4*x + x*x), z = (-1 + x)/(-2 + x) +// curve 3 : x = [1./2,(2.23606-1.)/2], y = (-1 + 2*x)/(-1 + 2*x + x*x), z = 1/(1 + x) +// curve 4 : x = [(2.23606-1.)/2,1], y = x/(1 + x), z = 1/(1 + x) +// curve 5 : x = [0.,(3.-2.23606)/2], y = 1/(2 - x), z = (-1 + x)/(-2 + x) +// curve 6 : x = [3.-2.23606)/2,1./2], y = 1/(2 - x), z = (1 - 2*x)/(2 - 4*x + x*x) +// curve 7 : x = [0,1], y = z = 1/2 +// curve 8 : x = z, y = 1-z, z = [(3.-2.23606)/2,(2.23606-1.)/2] +template +std::vector> poly00122344(const int prec = 10) +{ +return { + create_polyline(1./2,(2.23606-1.)/2,P(1./2,1./3,1.),P((2.23606-1.)/2,(3.-2.23606)/2,(2.23606-1.)/2), + [](double x) { return P(x,x/(1 + x),(x*x)/(-1 + 2*x + x*x)); }, + prec), + create_polyline((3.-2.23606)/2,1./2,P((3.-2.23606)/2,(2.23606-1.)/2,(3.-2.23606)/2),P(1./2,1.,1./3), + [](double x) { return P(x,(-1 + x)*(-1+x)/(2 - 4*x + x*x),(-1 + x)/(-2 + x)); }, + prec), + create_polyline(1./2,(2.23606-1.)/2,P(1./2,0.,2./3),P((2.23606-1.)/2,(3.-2.23606)/2,(2.23606-1.)/2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + 2*x + x*x),1/(1 + x)); }, + prec), + create_polyline((2.23606-1.)/2,1.,P((2.23606-1.)/2,(3.-2.23606)/2,(2.23606-1.)/2),P(1.,1./2,1./2), + [](double x) { return P(x,x/(1 + x),1/(1 + x)); }, + prec), + create_polyline(0.,(3.-2.23606)/2,P(0.,1./2,1./2),P((3.-2.23606)/2,(2.23606-1.)/2,(3.-2.23606)/2), + [](double x) { return P(x,1/(2 - x),(-1 + x)/(-2 + x)); }, + prec), + create_polyline((3.-2.23606)/2,1./2,P((3.-2.23606)/2,(2.23606-1.)/2,(3.-2.23606)/2),P(1./2,2./3,0.), + [](double x) { return P(x,1/(2 - x),(1 - 2*x)/(2 - 4*x + x*x)); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline((3.-2.23606)/2,1./2,P((3.-2.23606)/2,(2.23606-1.)/2,(3.-2.23606)/2),P(1./2,1./2,1./2), + [](double z) { return P(z,1-z,z); }, + prec), + create_polyline(1./2,(2.23606-1.)/2,P(1./2,1./2,1./2),P((2.23606-1.)/2,(3.-2.23606)/2,(2.23606-1.)/2), + [](double z) { return P(z,1-z,z); }, + prec), +}; +} + +//00123400 +// curve 1 : x = 1/2, y = [2/3,1], z = (-2 + 3*y)/(-2 + 5*y) +// curve 2 : x = 1/2, y = [0,1/3], z = (2*(-1 + y))/(-3 + 5*y +template +std::vector> poly00123400(const int prec = 10) +{ +return { + create_polyline(2./3,1.,P(1./2,2./3,0.),P(1./2,1.,1./3), + [](double y) { return P(1./2,y,(-2 + 3*y)/(-2 + 5*y)); }, + prec), + create_polyline(0.,1./3,P(1./2,0.,2./3),P(1./2,1./3,1.), + [](double y) { return P(1./2,y,(2*(-1 + y))/(-3 + 5*y)); }, + prec), +}; +} + +//00123401 +// curve 1 : x = [1/2,1], y = x/(1 - 2*x + 3*x*x), z = (-1 + 2*x)/(-1 + 3*x) +// curve 2 : x = [1/2,1], y = (4*x - x*x - sqrt(x)*sqrt(-4 + 12*x - 8*x*x + x*x*x))/(2*(1 + x)), z = (-2 + 2*x + x*x + sqrt(x)*sqrt(-4 + 12*x - 8*x*x + x*x*x))/(2*(-1 + 3*x*x)) +// curve 3 : X = 1/2, y = [0,1/2], z = (2*(-1 + y))/(-3 + 4*y) +template +std::vector> poly00123401(const int prec = 10) +{ +return { + create_polyline(1./2,1.,P(1./2,2./3,0.),P(1.,1./2,1./2), + [](double x) { return P(x,x/(1 - 2*x + 3*x*x),(-1 + 2*x)/(-1 + 3*x)); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,(4*x - x*x - std::sqrt(x)*std::sqrt(-4 + 12*x - 8*x*x + x*x*x))/(2*(1 + x)),(-2 + 2*x + x*x + std::sqrt(x)*std::sqrt(-4 + 12*x - 8*x*x + x*x*x))/(2*(-1 + 3*x*x))); }, + prec), + create_polyline(0.,1./2,P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double y) { return P(1./2,y,(2*(-1 + y))/(-3 + 4*y)); }, + prec), +}; +} + +//00123414 +// curve 1 : x = [(2.23606-1)/2,2./3], y = (1 - 2*x)/(-1 + x), z = (-1 + 2*x)/x +// curve 2 : x = [1/2,(2.23606-1)/2], y = 1/(1 + x), z = (-1 + 2*x)/x +// curve 3 : x = [(2.23606-1)/2,1], y = 1/(1+x), z = 1/(2+x) +// curve 4 : x = [(3-2.23606)/2,1./2], y = (-1 + 2*x)/(-1 + x), z = 1/(2 - x) +// curve 5 : x = [0.,(3-2.23606)/2], y = 1/(3-x), z = 1/(2 - x) +// curve 6 : x = y = 1-z, z = [(3-2.23606)/2,(2.23606-1)/2] +// curve 7 : x = [1./3,(3-2.23606)/2], y = (-1 + 2*x)/(-1 + x), z = (1 - 2*x)/x +template +std::vector> poly00123414(const int prec = 10) +{ +return { + create_polyline((2.23606-1)/2,2./3,P((2.23606-1)/2,(2.23606-1)/2,(3-2.23606)/2),P(2./3,1.,1./2), + [](double x) { return P(x,(1 - 2*x)/(-1 + x),(-1 + 2*x)/x); }, + prec), + create_polyline(1./2,(2.23606-1)/2,P(1./2,2./3,0.),P((2.23606-1)/2,(2.23606-1)/2,(3-2.23606)/2), + [](double x) { return P(x,1/(1 + x),(-1 + 2*x)/x); }, + prec), + create_polyline((2.23606-1)/2,1.,P((2.23606-1)/2,(2.23606-1)/2,(3-2.23606)/2),P(1.,1./2,1./3), + [](double x) { return P(x,1/(1+x),1/(2+x)); }, + prec), + create_polyline((3-2.23606)/2,1./2,P((3-2.23606)/2,(3-2.23606)/2,(2.23606-1)/2),P(1./2,0.,2./3), + [](double x) { return P(x,(-1 + 2*x)/(-1 + x),1/(2 - x)); }, + prec), + create_polyline(0.,(3-2.23606)/2,P(0.,1./3,1./2),P((3-2.23606)/2,(3-2.23606)/2,(2.23606-1)/2), + [](double x) { return P(x,1/(3-x),1/(2 - x)); }, + prec), + create_polyline((3-2.23606)/2,(2.23606-1)/2,P((2.23606-1)/2,(2.23606-1)/2,(3-2.23606)/2),P((3-2.23606)/2,(3-2.23606)/2,(2.23606-1)/2), + [](double z) { return P(1-z,1-z,z); }, + prec), + create_polyline(1./3,(3-2.23606)/2,P(1./3,1./2,1.),P((3-2.23606)/2,(3-2.23606)/2,(2.23606-1)/2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + x),(1 - 2*x)/x); }, + prec), +}; +} + +//00123421 +// curve 1 : x = 1/2, y = [2/5,1/2], z = y/(1-y) +// curve 2 : x = 1/2, y = [0,2/5], z = 2/3 +// curve 3 : x = [1/2,1], y = 1/(3 - x), z = 1/(1 + x) +// curve 4 : x = [0,1/2], y = 1/(2 + x), z = 1/(2- x) +// curve 5 : x = [0,1], y = z = 1/2 +// curve 6 : x = 1/2, y = [2/5,2/3], z = (-2 + 3*y)/(2*(-1 + y)) +// curve 7 : x = 1/2, y = [1/2,1], z = 1/2 +template +std::vector> poly00123421(const int prec = 10) +{ +return { + create_polyline(2./5,1./2,P(1./2,2./5,2./3),P(1./2,1./2,1.), + [](double y) { return P(1./2,y,y/(1-y)); }, + prec), + create_polyline(0.,2./5,P(1./2,0.,2./3),P(1./2,2./5,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(1./2,1.,P(1./2,2./5,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,1/(3 - x),1/(1 + x)); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,2./5,2./3), + [](double x) { return P(x,1/(2 + x),1/(2- x)); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(2./5,1./2,P(1./2,2./5,2./3),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,(-2 + 3*y)/(2*(-1 + y))); }, + prec), + create_polyline(1./2,2./3,P(1./2,1./2,1./2),P(1./2,2./3,0.), + [](double y) { return P(1./2,y,(-2 + 3*y)/(2*(-1 + y))); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), +}; +} + +//00123423 +// curve 1 : x = [0,1/2], y = 1/(2 - x), z = (-1 + 2*x)/(-2 + 3*x) +// curve 2 : x = [1/2,1], y = (-1 + 2*x)/(-1 + 3*x), z = 1/(1 + x) +// curve 3 : x = [0,1], y = z = 1/2 +template +std::vector> poly00123423(const int prec = 10) +{ +return { + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,2./3,0.), + [](double x) { return P(x,1/(2 - x),(-1 + 2*x)/(-2 + 3*x)); }, + prec), + create_polyline(1./2,1.,P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + 3*x),1/(1 + x)); }, + prec), + create_polyline(0.,1.,P(0.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), +}; +} + +//01101234 +// curve 1 : x = 1/2, y = [1/2,1], z = 1/2y +// curve 2 : x = [1/2,1], y = 1/2, z = 1/2x +// curve 3 : x = ]1/2,1], y = (-2 + 4*x - x*x + sqrt(x)*sqrt(-4 + 16*x - 20*x*x + 9*x*x*x))/(2*(-1 + x + 2*x*x)), z = (-2 + 2*x + 3*x*x - sqrt(x)*sqrt(-4 + 16*x - 20*x*x + 9*x*x*x))/(2*(-1 - x + 4*x*x)) +template +std::vector> poly01101234(const int prec = 10) +{ +return { + create_polyline(1./2,1.,P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./(2*y)); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(2*x)); }, + prec), + create_polyline(limit_value(1./2,1.),1.,P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,(-2 + 4*x - x*x + std::sqrt(x)*std::sqrt(-4 + 16*x - 20*x*x + 9*x*x*x))/(2*(-1 + x + 2*x*x)),(-2 + 2*x + 3*x*x - std::sqrt(x)*std::sqrt(-4 + 16*x - 20*x*x + 9*x*x*x))/(2*(-1 - x + 4*x*x)) ); }, + prec), +}; +} + +//01102334 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = 1/2, y = [0,1], z = 1/2 +// curve 3 : x = [1/2,1], y = x/(-1 + 3*x), z = (-1 + 3*x - x*x)/(-1 + 3*x) +// curve 4 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = (-1 + x + x*x)/(-2 + 3*x) +template +std::vector> poly01102334(const int prec = 10) +{ +return { + create_polyline(1./2,1.,P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2,P(1./2,1./2,0.),P(1./2,1./2,1./2), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(0.,1./2,P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,x/(-1 + 3*x),(-1 + 3*x - x*x)/(-1 + 3*x)); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),(-1 + x + x*x)/(-2 + 3*x)); }, + prec), +}; +} + +//01121234 +// curve 1 : x = 1/2, y = [1/2,1], z = 1/2y +// curve 2 : x = [1/2,4/7], y = (3*x - sqrt(-x (-4 + 7*x)))/(2*(-1 + 4*x)), z = (3*x + sqrt(-x*(-4 + 7*x)))/(2*(-1 + 4*x)) +// curve 3 : x = [1/2,4/7], y = (3*x + sqrt(-x (-4 + 7*x)))/(2*(-1 + 4*x)), z = (3*x - sqrt(-x*(-4 + 7*x)))/(2*(-1 + 4*x)) +template +std::vector> poly01121234(const int prec = 10) +{ +return { + create_polyline(1./2,1.,P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./(2*y)); }, + prec), + create_polyline(1./2,4./7,P(1./2,1./2,1.),P(4./7,2./3,2./3), + [](double x) { return P(x,(3*x - std::sqrt(-x*(-4 + 7*x)))/(2*(-1 + 4*x)),(3*x + std::sqrt(-x*(-4 + 7*x)))/(2*(-1 + 4*x))); }, + prec), + create_polyline(1./2,4./7,P(1./2,1.,1./2),P(4./7,2./3,2./3), + [](double x) { return P(x,(3*x + std::sqrt(-x*(-4 + 7*x)))/(2*(-1 + 4*x)),(3*x - std::sqrt(-x*(-4 + 7*x)))/(2*(-1 + 4*x))); }, + prec), +}; +} + +//01121340 +// curve 1 : x = ]1/2,1], y = (2 - 3*x + 2*x*x + sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 2*x + 3*x*x)), z = (2 - 7*x + 8*x*x - sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 5*x + 6*x*x)) +// curve 2 : x = ]1/2,1], y = (2 - 7*x + 8*x*x - sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 5*x + 6*x*x)), z = (2 - 3*x + 2*x*x + sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 2*x + 3*x*x)) +// curve 3 : x = [0.45016,1/2], y = (3 - 7*x + 5*x*x - sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x)), z = (3 - 7*x + 5*x*x + sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x)) +// curve 4 : x = [(0.45016,1./2], y = (3 - 7*x + 5*x*x + sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x)), z = (3 - 7*x + 5*x*x - sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x)) +template +std::vector> poly01121340(const int prec = 10) +{ +return { + create_polyline(limit_value(1./2,1.),1.,P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,(2 - 3*x + 2*x*x + std::sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 2*x + 3*x*x)),(2 - 7*x + 8*x*x - std::sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 5*x + 6*x*x))); }, + prec), + create_polyline(limit_value(1./2,1.),1.,P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,(2 - 7*x + 8*x*x - std::sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 5*x + 6*x*x)),(2 - 3*x + 2*x*x + std::sqrt(-x*(-4 + 15*x - 20*x*x + 8*x*x*x)))/(2*(1 - 2*x + 3*x*x))); }, + prec), + create_polyline(0.45016,1./2,P(0.45016,0.702631,0.700106),P(1./2,1./2,1.), + [](double x) { return P(x,(3 - 7*x + 5*x*x - std::sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x)),(3 - 7*x + 5*x*x + std::sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x))); }, + prec), + create_polyline(0.45016,1./2,P(0.45016,0.702631,0.700106),P(1./2,1.,1./2), + [](double x) { return P(x,(3 - 7*x + 5*x*x + std::sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x)),(3 - 7*x + 5*x*x - std::sqrt(-3 + 14*x - 21*x*x + 10*x*x*x + x*x*x*x))/(2*(3 - 8*x + 6*x*x))); }, + prec), +}; +} + +//01121341 +// no curves +// +template +std::vector> poly01121341(const int /*prec*/ = 10) +{ +return { + + +}; +} + +//01122034 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = -(-3*z*z + 2*z + (3*z/(2*(4*z - 1)) - sqrt(-z*(7*z - 4))/(2*(4*z - 1)))*(4*z*z - 5*z + 1))/(2*z*z - 2*z + 1), y = 3*z/(2*(4*z - 1)) - sqrt(-z*(7*z - 4))/(2*(4*z - 1)), z = [4/7,1/2] +// curve 3 : x = -(-3*z*z + 2*z + (3*z/(2*(4*z - 1)) + sqrt(-z*(7*z - 4))/(2*(4*z - 1)))*(4*z*z - 5*z + 1))/(2*z*z - 2*z + 1), y = 3*z/(2*(4*z - 1)) + sqrt(-z*(7*z - 4))/(2*(4*z - 1)), z = [4/7,1/2] +// curve 4 : x = 1/2, y = [0,1/2], z = y/(-1 + 3*y) +// curve 5: x = -(z*z/(4*z*z - 3*z + 1) - 1)*(4*z*z - 3*z + 1)/(5*z*z - 4*z + 1), y = z*z/(4*z*z - 3*z + 1), z = [1/2,1] +// problem with close polylines, there is an over refinement +template +std::vector> poly01122034(const int prec = 10) +{ +return { + create_polyline(0.,1.,P(0.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,4./7,P(0.,1./2,1./2),P(2./5,2./3,4./7), + [](double z) { return P(-(-3*z*z + 2*z + (3*z/(2*(4*z - 1)) - std::sqrt(-z*(7*z - 4))/(2*(4*z - 1)))*(4*z*z - 5*z + 1))/(2*z*z - 2*z + 1), 3*z/(2*(4*z - 1)) - std::sqrt(-z*(7*z - 4))/(2*(4*z - 1)),z); }, + prec), + create_polyline(1./2,4./7,P(1./2,1.,1./2),P(2./5,2./3,4./7), + [](double z) { return P(-(-3*z*z+ 2*z + (3*z/(2*(4*z - 1)) + std::sqrt(-z*(7*z - 4))/(2*(4*z - 1)))*(4*z*z - 5*z + 1))/(2*z*z - 2*z + 1),3*z/(2*(4*z - 1)) + std::sqrt(-z*(7*z - 4))/(2*(4*z - 1)),z); }, + prec), + create_polyline(1/2.,1.,P(1/2.,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,y/(-1 + 3*y)); }, + prec), + create_polyline(1./2,1.,P(1.,1./2,1./2),P(1./2,1./2,1.), + [](double z) { return P(-(z*z/(4*z*z - 3*z + 1) - 1)*(4*z*z - 3*z + 1)/(5*z*z - 4*z + 1), z*z/(4*z*z - 3*z + 1),z); }, + prec), +}; +} + +//01122334 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = 1/2, y = [0,1], z = 1/2 +// curve 3 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = (1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x) +// curve 4 : x = [0,1/2], x'=1-x, y = (-1 + 2*x)/(-2 + 3*x), z = (1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x) +template +std::vector> poly01122334(const int prec = 10) +{ +return { + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2,P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2.,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),(1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x)); }, + prec), + create_polyline(0.,1./2,P(1.,1./2,1./2),P(1./2,1.,1./2), + [](double x) { return P(1-x,1-(-1 + 2*x)/(-2 + 3*x),1-(1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x)); }, + prec), +}; +} + +//01122340 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = 1/2, y = [0,1], z = 1/2 +// curve 3 : x = [0.,0.36299], y = (-1 + 4*x - sqrt(1 - 4*x*x))/(2*(-2 + 5*x)), z = (1 - x + 2*x*x + sqrt(1 - 4*x*x) - x*sqrt(1 - 4*x*x))/(2*(2 - 3*x + 2*x*x)) +// curve 4 : x = [0.36299,1./2], y = (1 - 3*x + 3*x*x)/(2 - 6*x + 5*x*x), z = (1 - 2*x + x*x)/(2 - 5*x + 4*x*x) +// curve 5 : x = [0.,0.36299], x'=1-x, y = 1-(-1 + 4*x - sqrt(1 - 4*x*x))/(2*(-2 + 5*x)), z = (1 - x + 2*x*x + sqrt(1 - 4*x*x) - x*sqrt(1 - 4*x*x))/(2*(2 - 3*x + 2*x*x)) +// curve 6 : x = [0.36299,1./2], x'= 1-x, y = 1-(1 - 3*x + 3*x*x)/(2 - 6*x + 5*x*x), z = (1 - 2*x + x*x)/(2 - 5*x + 4*x*x) +// curve 7 : x = [0.36299,1./2], y = 1-x, z = -x/(-1 + x) +// curve 8 : x = [1./2,1-0.36299], y = 1-x,(1 - x)/x +// curve 9 : x = [0.36299,1-0.36299], y = 1-x, z = (1 - 3*x + 3*x*x)/(1 - 2*x + 2*x*x) +// problem with close polylines, there is an over refinement +template +std::vector> poly01122340(const int prec = 10) +{ +return { + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2,P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2.,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(0.,0.36299,P(0.,1./2,1./2),P(0.36299,0.637,0.569841), + [](double x) { return P(x,(-1 + 4*x - std::sqrt(1 - 4*x*x))/(2*(-2 + 5*x)),(1 - x + 2*x*x + std::sqrt(1 - 4*x*x) - x*std::sqrt(1 - 4*x*x))/(2*(2 - 3*x + 2*x*x))); }, + prec), + create_polyline(0.36299,1./2,P(0.36299,0.637,0.569841),P(1./2,1.,1./2), + [](double x) { return P(x,(1 - 3*x + 3*x*x)/(2 - 6*x + 5*x*x),(1 - 2*x + x*x)/(2 - 5*x + 4*x*x)); }, + prec), + create_polyline(0.,0.36299,P(1.,1./2,1./2),P(1-0.36299,1-0.637,0.569841), + [](double x) { return P(1-x,1-(-1 + 4*x - std::sqrt(1 - 4*x*x))/(2*(-2 + 5*x)),(1 - x + 2*x*x + std::sqrt(1 - 4*x*x) - x*std::sqrt(1 - 4*x*x))/(2*(2 - 3*x + 2*x*x))); }, + prec), + create_polyline(0.36299,1./2,P(1-0.36299,1-0.637,0.569841),P(1./2,0.,1./2), + [](double x) { return P(1-x,1-(1 - 3*x + 3*x*x)/(2 - 6*x + 5*x*x),(1 - 2*x + x*x)/(2 - 5*x + 4*x*x)); }, + prec), + create_polyline(0.36299,1./2,P(0.36299,0.637,0.569841),P(1./2,1./2,1.), + [](double x) { return P(x,1-x,-x/(-1 + x)); }, + prec), + create_polyline(1./2,1-0.36299,P(1./2,1./2,1.),P(1-0.36299,1-0.637,0.569841), + [](double x) { return P(x,1-x,(1 - x)/x); }, + prec), + create_polyline(0.36299,1./2,P(0.36299,0.637,0.569841),P(1./2,1./2,1./2), + [](double x) { return P(x,1-x,(1 - 3*x + 3*x*x)/(1 - 2*x + 2*x*x)); }, + prec), + create_polyline(1./2,1-0.36299,P(1./2,1./2,1./2),P(1-0.36299,1-0.637,0.569841), + [](double x) { return P(x,1-x,(1 - 3*x + 3*x*x)/(1 - 2*x + 2*x*x)); }, + prec), +}; +} + +//01123024 +// curve 1 : x = [0,1], y = z = 1./2 +// curve 2 : x = [1/2,1], y = (-1 + 3*x - x*x)/(-1 + 3*x), z = x/(-1 + 3*x) +// curve 3 : x = [0,1], y = (-1 + 2*x - x*x)/(-2 + 3*x), z = (-1 + x)/(-2 + 3*x) +template +std::vector> poly01123024(const int prec = 10) +{ +return { + create_polyline(0.,1.,P(0.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,(-1 + 3*x - x*x)/(-1 + 3*x),x/(-1 + 3*x)); }, + prec), + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1.), + [](double x) { return P(x,(-1 + 2*x - x*x)/(-2 + 3*x),(-1 + x)/(-2 + 3*x)); }, + prec), +}; +} + +//01233214 +// curve 1 : x = [0,1], y = z = 1/2 +// curve 2 : x = 1/2, y = [0,1], z = 1/2 +// curve 3 : x = y = 1/2, z = [0,1] +// curve 4 : x = [(2.23606-1)/2,1], y = z = 1/(1 + x) +// curve 5 : x = [1./2,(2.23606-1)/2], y = (1 - x)/x, z = x +// curve 6 : x = [0.,(3-2.23606)/2], y = z = (-1 + x)/(-2 + x) +// curve 7 : x = [(3-2.23606)/2,1./2], y = (-1 + 2*x)/(-1 + x), z = x +// curve 8 : x = y = z = [(3-2.23606)/2,(2.23606-1)/2] +// curve 9 : x = y = [(3-2.23606)/2,1./2], z = (-1 + 2*x)/(-1 + x) +// curve 10 : x = y = [1./2,(2.23606-1)/2], z = (1-x)/x +template +std::vector> poly01233214(const int prec = 10) +{ +return { + create_polyline(0.,1./2,P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2.,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2,P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2.,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(0.,1./2,P(1./2,1./2,0.),P(1./2,1./2,1./2), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2.,1./2),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline((2.23606-1)/2,1.,P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2),P(1.,1./2,1./2), + [](double x) { return P(x,1/(1 + x),1/(1 + x)); }, + prec), + create_polyline(1./2,(2.23606-1)/2,P(1./2.,1.,1./2),P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2), + [](double x) { return P(x,(1 - x)/x,x); }, + prec), + create_polyline(0.,(3-2.23606)/2,P(0.,1./2,1./2),P((3-2.23606)/2,(3-2.23606)/2,(3-2.23606)/2), + [](double x) { return P(x,(-1 + x)/(-2 + x),(-1 + x)/(-2 + x)); }, + prec), + create_polyline((3-2.23606)/2,1./2,P((3-2.23606)/2,(3-2.23606)/2,(3-2.23606)/2),P(1./2.,0.,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + x),x); }, + prec), + create_polyline((3-2.23606)/2,1./2,P((3-2.23606)/2,(3-2.23606)/2,(3-2.23606)/2),P(1./2,1./2,1./2), + [](double x) { return P(x,x,x); }, + prec), + create_polyline (1./2,(2.23606-1)/2,P(1./2.,1./2,1./2),P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2), + [](double x) { return P(x,x,x); }, + prec), + create_polyline((3-2.23606)/2,1./2,P((3-2.23606)/2,(3-2.23606)/2,(3-2.23606)/2),P(1./2,1./2,0.), + [](double x) { return P(x,x,(-1 + 2*x)/(-1 + x)); }, + prec), + create_polyline (1./2,(2.23606-1)/2,P(1./2.,1./2,1.),P((2.23606-1)/2,(2.23606-1)/2,(2.23606-1)/2), + [](double x) { return P(x,x,(1 - x)/x); }, + prec), +}; +} + +//00012345 +// curve 1 : x = [0,1/2], y = 1/2x, z = 1/2 +// curve 2 : x = y = 1/2, z = [3/4,1] +// curve 3 : x = [1/2,1], y = 1/2, z = 1 -x/2 +// curve 4 : x = 1/2, y = [1/2,1], z = 1 -y/2 +// curve 5 : x = 1/2, y = [0,1/2], z = (-2 + y)/(-3 + 2*y) +// curve 6 : x = [0,1/2], y =1/2, z = (-2 + x)/(-3 + 2*x) +template +std::vector> poly00012345(const int prec = 10) +{ +return { + create_polyline(3./4,1., P(1./2,1./2,3./4),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./(2*x),1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,3./4),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1.-x/2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,3./4),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1.-y/2); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,2./3),P(1./2,1./2,3./4), + [](double y) { return P(1./2,y,(-2 + y)/(-3 + 2*y)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,2./3),P(1./2,1./2,3./4), + [](double x) { return P(x,1./2,(-2 + x)/(-3 + 2*x)); }, + prec), +}; +} + +//00112345 +// curve 1 : x = 1/2, y = [0,1], z = 2/3 +// curve 2 : x = y = 1/2, z = [2/3,1] +// curve 2 : x = [0,1/2],y = 1/2, z = 1/(2-x) +// curve 3 : x' = [0,1/2], x = 1-x', y = 1/2, z = 1/(2-x') +template +std::vector> poly00112345(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(x,1./2,1./(2-x)); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(1-x,1./2,1./(2-x)); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,2./3),P(1./2,1./2,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,2./3),P(1./2,1.,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(2./3,1., P(1./2,1./2,2./3),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), +}; +} + +//00121345 +// curve 1 : x = 1/2, y = [1/2,1], z = y/(-1 + 3*y) +// curve 2 : x = [1/2,(2.23606-1.)/2], y = 1./2, z = (1 - x)/x +// curve 3 : x = [1/2,(2.23606-1.)/2], y = (1 - 2*x)/(1 - 3*x + x*x), z = 1./(x+1) +// curve 4 : x = [(2.23606-1.)/2,1], y = 1./2, z = 1./(x+1) +// curve 5 : x = [(2.23606-1.)/2,1], y = 1./(x+1), z = 1./2 +// curve 6 : x = [1./2,(2.23606-1.)/2], y = 1./(x+1), z = (1 - 2*x)/(1 - 3*x + x*x +// curve 7 : x = [1./2,(2.23606-1.)/2], y = (1 - x)/x, z = 1./2 +// curve 8 : x = [(9-4.12310)/8,(2.23606-1.)/2[, y = -sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)), z = -(-x + (-sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)))*(x*x - x - 1) + 2)/(x*x - x - 1) +// curve 8 : x = [(9-4.12310)/8,(2.23606-1.)/2[, y = sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)), z = -(-x + (sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)))*(x*x - x - 1) + 2)/(x*x - x - 1) +template +std::vector> poly00121345(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,y/(-1 + 3*y) ); }, + prec), + create_polyline(1./2,(2.23606-1.)/2, P(1./2,1./2,1.),P((2.23606-1.)/2,1./2,(2.23606-1.)/2), + [](double x) { return P(x,1./2,(1 - x)/x) ; }, + prec), + create_polyline(1./2,(2.23606-1.)/2, P(1./2,0.,2./3),P((2.23606-1)/2,1./2,(2.23606-1)/2), + [](double x) { return P(x,(1 - 2*x)/(1 - 3*x + x*x),1./(x+1)) ; }, + prec), + create_polyline((2.23606-1.)/2,1.,P((2.23606-1.)/2,1./2,(2.23606-1.)/2), P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(x+1)) ; }, + prec), + create_polyline((2.23606-1.)/2,1.,P((2.23606-1.)/2,(2.23606-1.)/2,1./2), P(1.,1./2,1./2), + [](double x) { return P(x,1./(x+1),1./2) ; }, + prec), + create_polyline(1./2,(2.23606-1.)/2, P(1./2,2./3,0.),P((2.23606-1)/2,(2.23606-1)/2,1./2), + [](double x) { return P(x,1./(x+1),(1 - 2*x)/(1 - 3*x + x*x)) ; }, + prec), + create_polyline(1./2,(2.23606-1.)/2, P(1./2,1.,1./2),P((2.23606-1.)/2,(2.23606-1)/2,1./2), + [](double x) { return P(x,(1 - x)/x,1./2) ; }, + prec), + create_polyline((9-4.12310)/8.,limit_value((2.23606-1.)/2,-1),P((9-4.12310)/8.,(4.12310-3)/2.,(4.12310-3)/2.), P((2.23606-1)/2,(2.23606-1)/2,1./2), + [](double x) { return P(x,-std::sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)),-(-x + (-std::sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)))*(x*x - x - 1) + 2)/(x*x - x - 1)) ; }, + prec), + create_polyline((9-4.12310)/8.,limit_value((2.23606-1.)/2,-1),P((9-4.12310)/8.,(4.12310-3)/2.,(4.12310-3)/2.), P((2.23606-1)/2,1./2,(2.23606-1)/2), + [](double x) { return P(x,std::sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)),-(-x + (std::sqrt(-x*(4*x*x - 9*x + 4))/(2*(x*x - x - 1)) + (x - 2)/(2*(x*x - x - 1)))*(x*x - x - 1) + 2)/(x*x - x - 1)) ; }, + prec), +}; +} + +//00122345 +// curve 1 : x = [0,1/2], y = 1./(2-x), z = (1 - 2*x)/(2 - 4*x + x*x) +// curve 2 : x = [1/2,1], y = (-1 + 2*x)/(-1 + 2*x + x*x), z = 1./(1+x) +// curve 3 : x = [1/2,1], y = 1./2, z = x/(-1 + 3*x) +// curve 4 : x = 1/2, y = [1/2,1], z = y/(-1 + 3*y) +// curve 5 : x = [0,1/2], y = (-1 + x)/(-2 + 3*x), z = 1./2 +// problem with close polylines, there is an over refinement +template +std::vector> poly00122345(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,2./3,0.), + [](double x) { return P(x,1./(2-x),(1 - 2*x)/(2 - 4*x + x*x)); }, + prec), + create_polyline(1./2,1., P(1./2,0.,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-1 + 2*x + x*x),1./(1+x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,x/(-1 + 3*x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,y/(-1 + 3*y)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1.,1./2), + [](double x) { return P(x,(-1 + x)/(-2 + 3*x),1./2); }, + prec), +}; +} + +//00123405 +// curve 1 : x = 1/2, y = [2/3,1], z = (-2 + 3*y)/(2*(-1 + 2*y)) +// curve 2 : x = [1/2,1], y = 1./(2*x), z = 1./2 +// curve 3 : x = [1/2,1], y = 1./2, z = 1./(2*x) +// curve 4 : x = 1/2, y = [0,1/2], z = (2*(-1 + y))/(-3 + 4*y) +template +std::vector> poly00123405(const int prec = 10) +{ +return { + create_polyline(2./3.,1., P(1./2,2./3,0.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,(-2 + 3*y)/(2*(-1 + 2*y))); }, + prec), + create_polyline(1./2.,1., P(1./2,1.,1./2.),P(1.,1./2,1./2), + [](double x) { return P(x,1./(2*x),1./2); }, + prec), + create_polyline(1./2.,1., P(1./2,1./2.,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(2*x)); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,2./3),P(1./2,1./2,1.), + [](double y) { return P(1./2,y,(2*(-1 + y))/(-3 + 4*y)); }, + prec), +}; +} + +//00123415 +// curve 1 : x = 1/2, y = [0,2/5], z = 2/3 +// curve 2 : x = [0,1/2], y = 1./(3-x), z = 1./(2-x) +// curve 3 : x = [1./2,(2.23606-1)/2], y = -x/(-1 - x + x*x), z = 1./(x+1) +// curve 4 : x = [(2.23606-1)/2.,1], y = 1./2, z = 1./(x+1) +// curve 5 : x = [(2.23606-1)/2.,2./3], y = (1 - 2*x)/(1. - 3*x + x*x), z = (1. - x)/x +// curve 6 : x = [2/3,1], y = 1./(x+1), z = 1./2 +// curve 7 : x = [1/2,2/3], y = 1./(x+1), z = (2*x-1.)/x +// curve 8 : x = 2/3, y = [3/5,1], z = 1/2 +// curve 9 : x = [1/2,(2.23606-1)/2], y = 1/2, z = (1. - x)/x +// curve 10 : x = 1/2, y = [2/5,1/2], z = y/(1.-y) +template +std::vector> poly00123415(const int prec = 10) +{ +return { + create_polyline(0.,2./5, P(1./2,0.,2./3),P(1./2,2./5,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(0.,1./2, P(0.,1./3,1./2),P(1./2,2./5,2./3), + [](double x) { return P(x,1./(3-x),1./(2-x)); }, + prec), + create_polyline(1./2,(2.23606-1)/2., P(1./2,2./5,2./3),P((2.23606-1)/2.,1./2,(2.23606-1)/2.), + [](double x) { return P(x,-x/(-1 - x + x*x),1./(x+1)); }, + prec), + create_polyline((2.23606-1)/2.,1., P((2.23606-1)/2.,1./2,(2.23606-1)/2.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(x+1)); }, + prec), + create_polyline((2.23606-1)/2.,2./3, P((2.23606-1)/2.,1./2,(2.23606-1)/2.),P(2./3,3./5,1./2), + [](double x) { return P(x,(1 - 2*x)/(1. - 3*x + x*x),(1. - x)/x); }, + prec), + create_polyline(2./3,1., P(2./3,3./5,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./(x+1),1./2); }, + prec), + create_polyline(1./2,2./3,P(1./2,2./3,0.), P(2./3,3./5,1./2), + [](double x) { return P(x,1./(x+1),(2*x-1.)/x); }, + prec), + create_polyline(3./5,1., P(2./3,3./5,1./2),P(2./3,1.,1./2), + [](double y) { return P(2./3,y,1./2); }, + prec), + create_polyline(1./2.,(2.23606-1)/2., P(1./2,1./2,1.), P((2.23606-1)/2.,1./2,(2.23606-1)/2.), + [](double x) { return P(x,1./2,(1. - x)/x); }, + prec), + create_polyline(2./5,1./2, P(1./2,2./5,2./3),P(1./2,1./2,1.), + [](double y) { return P(1./2,y,y/(1.-y)); }, + prec), +}; +} + +//00123425 +// curve 1 : x = 1/2, y = [0,2/5], z = 2/3 +// curve 2 : x = [1/2,1], y = x/(1.+x*x), z = 1./(x+1) +// curve 3 : x = [0,1/2], y = 1/(2 + x), z = 1/(2 - x) +// curve 4 : x = [0,1/2], y = 1/(2 - x), z = (-1 + 2*x)/(-2 + 3*x) +// curve 5 : x = [1/2,1], y = 1/2, z = x/(-1 + 3*x) +// curve 6 : x = 1/2, y = [2/5,1/2], z = y/(1.-y) +// problem with close polylines, there is an over refinement + +template +std::vector> poly00123425(const int prec = 10) +{ +return { + create_polyline(0.,2./5, P(1./2,0.,2./3),P(1./2,2./5,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(1./2,1., P(1./2,2./5,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,x/(1.+x*x),1./(x+1)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,2./5,2./3), + [](double x) { return P(x,1/(2 + x),1/(2 - x)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,2./3,0.), + [](double x) { return P(x,1/(2 - x),(-1 + 2*x)/(-2 + 3*x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,x/(-1 + 3*x)); }, + prec), + create_polyline(2./5,1./2, P(1./2,2./5,2./3),P(1./2,1./2,1.), + [](double y) { return P(1./2,y,y/(1.-y)); }, + prec), +}; +} + +//00123455 +// curve 1 : x = 1./2, y = [2/3,1], z = 1./3 +// curve 2 : x = 1./2, y = [0,1/3], z = 2./3 +// curve 3 : x = 1./2, y = 1./3, z = [2/3,1] +// curve 4 : x = 1./2, y = 2./3, z = [0,1/3] +// curve 5 : x = [1/2,1], y = 1./(1+x), z = x/(1.+x) +// curve 6 : x = 1-x',1./(1+x'),x'/(1.+x'), x' = [1/2,1] +// curve 7 : x = 1-x', 1 - 1./(1+x'),1 - x'/(1.+x'), x' = [1/2,1] +// curve 8 : x = [1/2,1], y = 1 - 1./(1+x), z = 1 - x/(1.+x) +template +std::vector> poly00123455(const int prec = 10) +{ +return { + create_polyline(2./3.,1., P(1./2,2./3,1./3),P(1./2,1.,1./3), + [](double y) { return P(1./2,y,1./3); }, + prec), + create_polyline(0.,1./3., P(1./2,0.,2./3),P(1./2,1./3,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(2./3.,1., P(1./2,1./3,2./3),P(1./2,1./3,1.), + [](double z) { return P(1./2,1./3,z); }, + prec), + create_polyline(0.,1./3., P(1./2,2./3,0.),P(1./2,2./3,1./3), + [](double z) { return P(1./2,2./3,z); }, + prec), + create_polyline(1/2.,1., P(1./2,2./3,1./3),P(1.,1./2,1./2), + [](double x) { return P(x,1./(1+x),x/(1.+x)); }, + prec), + create_polyline(1/2.,1., P(1./2,2./3,1./3),P(0.,1./2,1./2), + [](double x) { return P(1-x,1./(1+x),x/(1.+x)); }, + prec), + create_polyline(1/2.,1., P(1./2,1./3,2./3),P(0.,1./2,1./2), + [](double x) { return P(1-x,1-1./(1+x),1- x/(1.+x)); }, + prec), + create_polyline(1/2.,1., P(1./2,1./3,2./3),P(1.,1./2,1./2), + [](double x) { return P(x,1- 1./(1+x),1- x/(1.+x)); }, + prec), +}; +} + +//01102345 +// curve 1 : x = y = 1/2, z = [0,1] +// curve 2 : x = 1./2, y = [0,1/2], z = 1./(2-y) +// curve 3 : x = [0,1/2], y = 1/2, z = 1./(2-x) +// curve 4 : x = 1./2, y = 1-y', z = 1./(2-y'), y' = [0,1/2] +// curve 5 : x = 1-x', y = 1/2, z = 1./(2-x'), x' = [0,1/2] +template +std::vector> poly01102345(const int prec = 10) +{ +return { + create_polyline(0.,2./3., P(1./2,1./2,0.),P(1./2,1./2,2./3), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(2./3.,1., P(1./2,1./2,2./3.),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,1./2),P(1./2,1./2,2./3), + [](double y) { return P(1./2,y,1./(2-y)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(x,1./2,1./(2-x)); }, + prec), + create_polyline(0.,1./2, P(1./2,1.,1./2),P(1./2,1./2,2./3), + [](double y) { return P(1./2,1-y,1./(2-y)); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(1-x,1./2,1./(2-x)); }, + prec), +}; +} + +//01121345 +// curve 1 : x = [1/2,1], y = 1/2x, z = 1/2 +// curve 2 : x = [1/2,1], y = 1/2, z = 1/2x +// curve 3 : x = 1/2, y = [1/2,1], z = 1/2y +template +std::vector> poly01121345(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./(2*x),1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./(2*x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./(2*y)); }, + prec), +}; +} + +//01122345 +// curve 1 : x = [1/2,1], y = (x*(-1 + 2*x))/(1 - 4*x + 5*x*x), z = x*x/(1 - 3*x + 4*x*x) +// curve 2 : x = (x'*(-1 + 2*x'))/(1 - 4*x' + 5*x'*x'),y = x',z = x'*x'/(1 - 3*x' + 4*x'*x'), x'= [1/2,1] +// curve 3 : x = 1./2,y = [1/2,1], z = y/(-1 + 3*y) +// curve 4 : x = [1/2,1], y = 1./2, z = x/(-1 + 3*x) +// curve 5 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = (1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x) +// problem with close polylines, there is an over refinement +template +std::vector> poly01122345(const int prec = 10) +{ +return { + create_polyline(1./2,1., P(1./2,0.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,(x*(-1 + 2*x))/(1 - 4*x + 5*x*x),x*x/(1 - 3*x + 4*x*x)); }, + prec), + create_polyline(1./2,1.,P(0.,1./2,1./2), P(1./2,1.,1./2), + [](double x) { return P((x*(-1 + 2*x))/(1 - 4*x + 5*x*x),x,x*x/(1 - 3*x + 4*x*x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,y/(-1 + 3*y)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,x/(-1 + 3*x)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),(1 - 3*x + 3*x*x)/(2 - 5*x + 4*x*x)); }, + prec), +}; +} + +//01123045 +// curve 1 : x = [0,1/2], y = 1/2, z = (-1 + x)/(-2 + 3*x) +// curve 2 : x = 1/2, y = [1/2,(2.23606-1.)/2], z = (1 - y)/y +// curve 3 : x = (2*z*z - 3*z + 1)/(5*z*z - 5*z + 1), y = (-z*z + 2*z - 1)/(2*z*z - 1), z = [1/2,(2.23606-1.)/2] +// curve 4 : x = [(2.23606-1.)/2,1], y = (-2 + 5*x - sqrt(4 - 8*x + 5*x*x))/(2*(-3 + 5*x)), z = (-2 + 4*x - x*x + x*sqrt(4 - 8*x + 5*x*x))/(2*(-1 + 2*x + x*x)) +// curve 5 : x =[1/2,1], y = x/(-1 + 3*x), z = 1./2 +// curve 6 : x = 1/2, y = [(2.23606-1.)/2,1], z = 1./(y+1) +// problem with close polylines, there is an over refinement +template +std::vector> poly01123045(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,1.), + [](double x) { return P(x,1./2,(-1 + x)/(-2 + 3*x)); }, + prec), + create_polyline(1./2,(2.23606-1.)/2, P(1./2,1./2,1.),P(1./2,(2.23606-1.)/2,(2.23606-1.)/2), + [](double y) { return P(1./2,y,(1 - y)/y); }, + prec), + create_polyline(1./2,(2.23606-1.)/2, P(0.,1./2,1./2),P(1./2,(2.23606-1.)/2,(2.23606-1.)/2), + [](double z) { return P((2*z*z - 3*z + 1)/(5*z*z - 5*z + 1),(-z*z + 2*z - 1)/(2*z*z - 1),z); }, + prec), + create_polyline((2.23606-1.)/2,1.,P(1./2,(2.23606-1.)/2,(2.23606-1.)/2), P(1.,1./2,1./2), + [](double x) { return P(x,(-2 + 5*x - std::sqrt(4 - 8*x + 5*x*x))/(2*(-3 + 5*x)),(-2 + 4*x - x*x + x*std::sqrt(4 - 8*x + 5*x*x))/(2*(-1 + 2*x + x*x)) ); }, + prec), + create_polyline(1./2,1., P(1./2,1.,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,x/(-1 + 3*x),1./2); }, + prec), + create_polyline((2.23606-1.)/2,1., P(1./2,(2.23606-1.)/2,(2.23606-1.)/2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./(y+1)); }, + prec), +}; +} + +//01123445 +// curve 1 : x= [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = 1./2 +// curve 2 : x = 1- x', y = 1- (-1 + 2*x')/(-2 + 3*x'), z = 1./2, x' = [0,1/2] +template +std::vector> poly01123445(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),1./2); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,1.,1./2), + [](double x) { return P(1-x,1-(-1 + 2*x)/(-2 + 3*x),1./2); }, + prec), + +}; +} + +//01123453 +// curve 1 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = (-1 + 2*x - x*x)/(-2 + 3*x) +// curve 2 : x = 1-x', y = 1-(-1 + 2*x')/(-2 + 3*x'), z = (-1 + 2*x' - x'*x')/(-2 + 3*x'), x'= [0,1/2] +// curve 3 : x = 1-x', y = (-1 + 2*x')/(-2 + 3*x'), z = 1-(-1 + 2*x' - x'*x')/(-2 + 3*x'), x'= [0,1/2] +// curve 4 : x = x', y = 1-(-1 + 2*x')/(-2 + 3*x'), z = 1-(-1 + 2*x' - x'*x')/(-2 + 3*x'), x'= [0,1/2] +template +std::vector> poly01123453(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),(-1 + 2*x - x*x)/(-2 + 3*x)); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,1.,1./2), + [](double x) { return P(1-x,1-(-1 + 2*x)/(-2 + 3*x),(-1 + 2*x - x*x)/(-2 + 3*x)); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(1-x,(-1 + 2*x)/(-2 + 3*x),1-(-1 + 2*x - x*x)/(-2 + 3*x)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1.,1./2), + [](double x) { return P(x,1-(-1 + 2*x)/(-2 + 3*x),1-(-1 + 2*x - x*x)/(-2 + 3*x)); }, + prec), +}; +} + +//01233245 +// curve 1 : x = 1./2, y = (2*z - 1)/(3*z - 2), z = [0,1/2] +// curve 2 : x = 1./2, y = 1-(2*z' - 1)/(3*z' - 2), z = 1-z', z' = [0,1/2] +// curve 3 : x = (z*z + z*(3*z - 2) - 4*z + 2)/(2*(z - 1)*(z-1)), y = z, z = [1/3,1/2] +// curve 4 : x = 1-(z'*z' + z'*(3*z' - 2) - 4*z' + 2)/(2*(z' - 1)*(z'-1)), y = z', z = z' = [1/3,1/2] +// curve 5 : x = 1-(z'*z' + z'*(3*z' - 2) - 4*z' + 2)/(2*(z' - 1)*(z'-1)), y = 1-z', z = 1-z', z' = [1/3,1/2] +// curve 6 : x = (z'*z' + z'*(3*z' - 2) - 4*z' + 2)/(2*(z' - 1)*(z'-1)), y = 1-z', z = 1-z', z' = [1/3,1/2] +// curve 7 : x = 1./2, y = z = [1/3,2/3] +template +std::vector> poly01233245(const int prec = 10) +{ +return { + create_polyline(0.,1./3, P(1./2,1./2,0.),P(1./2,1./3,1./3), + [](double z) { return P(1./2, (2*z - 1)/(3*z - 2),z); }, + prec), + create_polyline(1./3,1./2, P(1./2,1./3,1./3),P(1./2,0.,1./2), + [](double z) { return P(1./2, (2*z - 1)/(3*z - 2),z); }, + prec), + create_polyline(1/3.,1./2, P(1./2,2/3.,2./3),P(1./2,1.,1./2), + [](double z) { return P(1./2, 1-(2*z - 1)/(3*z - 2),1-z); }, + prec), + create_polyline(0.,1./3, P(1./2,1./2,1.),P(1./2,2/3.,2./3), + [](double z) { return P(1./2, 1-(2*z - 1)/(3*z - 2),1-z); }, + prec), + create_polyline(1./3,1./2, P(1./2,1./3,1./3),P(0.,1./2,1./2), + [](double z) { return P( (z*z + z*(3*z - 2) - 4*z + 2)/(2*(z - 1)*(z-1)),z,z); }, + prec), + create_polyline(1./3,1./2, P(1./2,1./3,1./3),P(1.,1./2,1./2), + [](double z) { return P( 1-(z*z + z*(3*z - 2) - 4*z + 2)/(2*(z - 1)*(z-1)),z,z); }, + prec), + create_polyline(1./3,1./2, P(1./2,2./3,2./3),P(1.,1./2,1./2), + [](double z) { return P( 1-(z*z + z*(3*z - 2) - 4*z + 2)/(2*(z - 1)*(z-1)),1-z,1-z); }, + prec), + create_polyline(1./3,1./2, P(1./2,2./3,2./3),P(0.,1./2,1./2), + [](double z) { return P( (z*z + z*(3*z - 2) - 4*z + 2)/(2*(z - 1)*(z-1)),1-z,1-z); }, + prec), + create_polyline(1./3,2./3, P(1./2,1./3,1./3),P(1./2,2./3,2./3), + [](double z) { return P(1./2,z,z); }, + prec), +}; +} + +//00123456 +// curve 1 : x = [0,1/2], y = 1./2, z = 1./(2-x) +// curve 2 : x' = [0,1/2], x = 1-x y = 1./2, z = 1./(2-x') +// curve 3 : x = [0,1/2], y = 1./(2-x), z = 1./2 +// curve 4 : x' = [0,1/2], x = 1-x, y = 1./(2-x), z = 1./2 +// curve 5 : x = 1./2, y = 2./3, z = [0,1/2] +// curve 6 : x = 1./2, y = [0,1/2], z = 2./3 +// curve 7 : x = 1./2, y = [2/3,1], z = 1./2 +// curve 8 : x = 1./2, y = 1./2, z = [2/3,1] +// curve 9 : x = 1./2, y = [1/2,2/3], z = (2*(-1 + y))/(-2 + y) +template +std::vector> poly00123456(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(x,1./2,1./(2-x)); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(1-x,1./2,1./(2-x)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,2./3,1./2), + [](double x) { return P(x,1./(2-x),1./2); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,2./3,1./2), + [](double x) { return P(1-x,1./(2-x),1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,2./3,0.),P(1./2,2./3,1./2), + [](double z) { return P(1./2,2./3,z); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,2./3),P(1./2,1./2,2./3), + [](double y) { return P(1./2,y,2./3); }, + prec), + create_polyline(2./3,1., P(1./2,2/3.,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(2./3,1., P(1./2,1./2,2/3.),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(1./2,2./3, P(1./2,1./2,2/3.),P(1./2,2./3,1./2), + [](double y) { return P(1./2,y,(2*(-1 + y))/(-2 + y)); }, + prec), +}; +} + +//01123456 +// curve 1 : x = [0,1/2], y = 1./2, z = 1./(2-x) +// curve 2 : x = 1-x', y = 1./2, z = 1./(2-x'), x' = [0,1/2] +// curve 3 : x = 1./2, y = [1/2,1], z = 1./(1+y) +// curve 4 : x = 1./2, y = 1-y', z = 1./(1+y'), y' = [1/2,1] +// curve 5 : x = [0,1/2], y = (-1 + 2*x)/(-2 + 3*x), z = 1./2 +// curve 6 : x = 1-x', y = 1-(-1 + 2*x')/(-2 + 3*x'), z = 1./2 +// curve 7 : x = 1./2, y = 1./2, z = [2/3,1] +template +std::vector> poly01123456(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(x,1./2,1./(2-x)); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,1./2,2./3), + [](double x) { return P(1-x,1./2,1./(2-x)); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,2./3),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./(1+y)); }, + prec), + create_polyline(1./2,1.,P(1./2,1./2,2./3),P(1./2,0.,1./2), + [](double y) { return P(1./2,1-y,1./(1+y)); }, + prec), + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(x,(-1 + 2*x)/(-2 + 3*x),1./2); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,1.,1./2), + [](double x) { return P(1-x,1-(-1 + 2*x)/(-2 + 3*x),1./2); }, + prec), + create_polyline(2./3,1., P(1./2,1./2,2./3),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), +}; +} + +//01233456 +// curve 1 : x = [0,1/2], y = (-1 + x)/(-2 + 3*x), z = 1./2 +// curve 2 : x = 1-x', y = 1-(-1 + x')/(-2 + 3*x'), z = 1./2, x' = [0,1/2] +// curve 3 : x = [1/2,1], y = 1./2, z = x/(-1 + 3*x) +// curve 4 : x = 1-x',1./2,1-(x'/(-1 + 3*x')), x'= [1/2,1] +// curve 5 : x = 1./2, y = [1/2,1], z = y/(3*y-1) +// curve 6 : x = 1./2, y = 1-y', z = 1 -(y'/(3*y'-1)), y'= [1/2,1] +template +std::vector> poly01233456(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1.,1./2), + [](double x) { return P(x,(-1 + x)/(-2 + 3*x),1./2); }, + prec), + create_polyline(0.,1./2, P(1.,1./2,1./2),P(1./2,0.,1./2), + [](double x) { return P(1-x,1-(-1 + x)/(-2 + 3*x),1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1.,1./2.,1./2), + [](double x) { return P(x,1./2,x/(-1 + 3*x)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,0.),P(0.,1./2.,1./2), + [](double x) { return P(1-x,1./2,1-(x/(-1 + 3*x))); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1.),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,y/(3*y-1)); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,0.),P(1./2,0.,1./2), + [](double y) { return P(1./2,1-y,1 -(y/(3*y-1))); }, + prec), +}; +} + +//01234567 +// curve 1 : x =[0,1], y = z = 1/2 +// curve 2 : y =[0,1], x = z = 1/2 +// curve 3 : z =[0,1], y = x = 1/2 +template +std::vector> poly01234567(const int prec = 10) +{ +return { + create_polyline(0.,1./2, P(0.,1./2,1./2),P(1./2,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1.,1./2,1./2), + [](double x) { return P(x,1./2,1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,0.,1./2),P(1./2,1./2,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1.,1./2), + [](double y) { return P(1./2,y,1./2); }, + prec), + create_polyline(0.,1./2, P(1./2,1./2,0.),P(1./2,1./2,1./2), + [](double z) { return P(1./2,1./2,z); }, + prec), + create_polyline(1./2,1., P(1./2,1./2,1./2),P(1./2,1./2,1.), + [](double z) { return P(1./2,1./2,z); }, + prec), + + +}; +} + +// Cube (begin definition) +using Cube = std::array; + +inline constexpr Cube convert_to_cube(unsigned int n) { + #if !defined(_MSC_VER) || (_MSC_VER > 1900) + assert(n < (1 << 24)); + #endif + return { + (std::uint8_t)((n & 070000000) >> 21), (std::uint8_t)((n & 007000000) >> 18), + (std::uint8_t)((n & 000700000) >> 15), (std::uint8_t)((n & 000070000) >> 12), + (std::uint8_t)((n & 000007000) >> 9), (std::uint8_t)((n & 000000700) >> 6), + (std::uint8_t)((n & 000000070) >> 3), (std::uint8_t)((n & 000000007) >> 0), + }; +} + +// User-defined literal operator. Given an integer in octal notation, like +// 01234567, gives the cube with the same colors. For example, `01234567_c` +// is `Cube{0, 1, 2, 3, 4, 5, 6, 7}`. +inline constexpr Cube operator"" _c(unsigned long long n) +{ + #if !defined(_MSC_VER) || (_MSC_VER > 1900) + assert(n < (1 << 24)); + #endif + return convert_to_cube(unsigned(n)); +} + +inline std::string config_name(const Cube cube) { + std::stringstream filename_prefix_ss; + for (int j = 0; j < 8; ++j) { + filename_prefix_ss << int(cube[j]); + } + return filename_prefix_ss.str(); +} +// Cube (end) + + +template +class Triple_line_extractor +{ + using P = Point; + using Polyline = std::vector

; + using Polylines = std::vector; + + typedef Polylines(*create_polylines_fct)(const int /* prec */); + + +public: + boost::unordered_map create_polylines_fcts { + // One internal corner + { 00001221_c, CGAL::Mesh_3::poly00001221 } , + { 00111202_c, CGAL::Mesh_3::poly00111202 } , + { 01101001_c, CGAL::Mesh_3::poly01101001 } , + // Two curves + { 00011022_c, CGAL::Mesh_3::poly00011022 } , + { 00011221_c, CGAL::Mesh_3::poly00011221 } , + { 00011222_c, CGAL::Mesh_3::poly00011222 } , + { 00121200_c, CGAL::Mesh_3::poly00121200 } , + { 00121221_c, CGAL::Mesh_3::poly00121221 } , + { 00122100_c, CGAL::Mesh_3::poly00122100 } , + { 00122101_c, CGAL::Mesh_3::poly00122101 } , + // One curve + { 00000012_c, CGAL::Mesh_3::poly00000012 } , + { 00000112_c, CGAL::Mesh_3::poly00000112 } , + { 00000121_c, CGAL::Mesh_3::poly00000121 } , + { 00001112_c, CGAL::Mesh_3::poly00001112 } , + { 00001122_c, CGAL::Mesh_3::poly00001122 } , + { 00010121_c, CGAL::Mesh_3::poly00010121 } , + { 00010122_c, CGAL::Mesh_3::poly00010122 } , + { 00011002_c, CGAL::Mesh_3::poly00011002 } , + { 00011012_c, CGAL::Mesh_3::poly00011012 } , + { 00011110_c, CGAL::Mesh_3::poly00011110 } , + { 00011120_c, CGAL::Mesh_3::poly00011120 } , + { 00011121_c, CGAL::Mesh_3::poly00011121 } , + { 00011122_c, CGAL::Mesh_3::poly00011122 } , + { 00011220_c, CGAL::Mesh_3::poly00011220 } , + { 00012002_c, CGAL::Mesh_3::poly00012002 } , + { 00012012_c, CGAL::Mesh_3::poly00012012 } , + { 00012021_c, CGAL::Mesh_3::poly00012021 } , + { 00012110_c, CGAL::Mesh_3::poly00012110 } , + { 00012112_c, CGAL::Mesh_3::poly00012112 } , + { 00012120_c, CGAL::Mesh_3::poly00012120 } , + { 00012121_c, CGAL::Mesh_3::poly00012121 } , + { 00012122_c, CGAL::Mesh_3::poly00012122 } , + { 00012221_c, CGAL::Mesh_3::poly00012221 } , + { 00111100_c, CGAL::Mesh_3::poly00111100 } , + { 00111102_c, CGAL::Mesh_3::poly00111102 } , + { 00111220_c, CGAL::Mesh_3::poly00111220 } , + { 00121201_c, CGAL::Mesh_3::poly00121201 } , + // 4 color cases + { 00000123_c, CGAL::Mesh_3::poly00000123 } , + { 00001123_c, CGAL::Mesh_3::poly00001123 } , + { 00001223_c, CGAL::Mesh_3::poly00001223 } , + { 00010123_c, CGAL::Mesh_3::poly00010123 } , + { 00010230_c, CGAL::Mesh_3::poly00010230 } , + { 00010231_c, CGAL::Mesh_3::poly00010231 } , + { 00011023_c, CGAL::Mesh_3::poly00011023 } , + { 00011123_c, CGAL::Mesh_3::poly00011123 } , + { 00011223_c, CGAL::Mesh_3::poly00011223 } , + { 00011230_c, CGAL::Mesh_3::poly00011230 } , + { 00011231_c, CGAL::Mesh_3::poly00011231 } , + { 00011232_c, CGAL::Mesh_3::poly00011232 } , + { 00012003_c, CGAL::Mesh_3::poly00012003 } , + { 00012013_c, CGAL::Mesh_3::poly00012013 } , + { 00012023_c, CGAL::Mesh_3::poly00012023 } , + { 00012033_c, CGAL::Mesh_3::poly00012033 } , + { 00012113_c, CGAL::Mesh_3::poly00012113 } , + { 00012123_c, CGAL::Mesh_3::poly00012123 } , + { 00012130_c, CGAL::Mesh_3::poly00012130 } , + { 00012131_c, CGAL::Mesh_3::poly00012131 } , + { 00012132_c, CGAL::Mesh_3::poly00012132 } , + { 00012133_c, CGAL::Mesh_3::poly00012133 } , + { 00012223_c, CGAL::Mesh_3::poly00012223 } , + { 00012230_c, CGAL::Mesh_3::poly00012230 } , + { 00012231_c, CGAL::Mesh_3::poly00012231 } , + { 00012232_c, CGAL::Mesh_3::poly00012232 } , + { 00012233_c, CGAL::Mesh_3::poly00012233 } , + { 00012330_c, CGAL::Mesh_3::poly00012330 } , + { 00012331_c, CGAL::Mesh_3::poly00012331 } , + { 00012332_c, CGAL::Mesh_3::poly00012332 } , + { 00012333_c, CGAL::Mesh_3::poly00012333 } , + { 00111123_c, CGAL::Mesh_3::poly00111123 } , + { 00111203_c, CGAL::Mesh_3::poly00111203 } , + { 00111223_c, CGAL::Mesh_3::poly00111223 } , + { 00111230_c, CGAL::Mesh_3::poly00111230 } , + { 00111232_c, CGAL::Mesh_3::poly00111232 } , + { 00111233_c, CGAL::Mesh_3::poly00111233 } , + { 00112233_c, CGAL::Mesh_3::poly00112233 } , + { 00112323_c, CGAL::Mesh_3::poly00112323 } , + { 00112332_c, CGAL::Mesh_3::poly00112332 } , + { 00121203_c, CGAL::Mesh_3::poly00121203 } , + { 00121223_c, CGAL::Mesh_3::poly00121223 } , + { 00121233_c, CGAL::Mesh_3::poly00121233 } , + { 00121300_c, CGAL::Mesh_3::poly00121300 } , + { 00121301_c, CGAL::Mesh_3::poly00121301 } , + { 00121302_c, CGAL::Mesh_3::poly00121302 } , + { 00121320_c, CGAL::Mesh_3::poly00121320 } , + { 00121321_c, CGAL::Mesh_3::poly00121321 } , + { 00121323_c, CGAL::Mesh_3::poly00121323 } , + { 00122103_c, CGAL::Mesh_3::poly00122103 } , + { 00122113_c, CGAL::Mesh_3::poly00122113 } , + { 00122133_c, CGAL::Mesh_3::poly00122133 } , + { 00122300_c, CGAL::Mesh_3::poly00122300 } , + { 00122301_c, CGAL::Mesh_3::poly00122301 } , + { 00122302_c, CGAL::Mesh_3::poly00122302 } , + { 00122313_c, CGAL::Mesh_3::poly00122313 } , + { 00122331_c, CGAL::Mesh_3::poly00122331 } , + { 01101023_c, CGAL::Mesh_3::poly01101023 } , + { 01101223_c, CGAL::Mesh_3::poly01101223 } , + { 01101231_c, CGAL::Mesh_3::poly01101231 } , + { 01102332_c, CGAL::Mesh_3::poly01102332 } , + { 01121223_c, CGAL::Mesh_3::poly01121223 } , + { 01121230_c, CGAL::Mesh_3::poly01121230 } , + { 01122330_c, CGAL::Mesh_3::poly01122330 } , + { 01123023_c, CGAL::Mesh_3::poly01123023 } , + { 01233210_c, CGAL::Mesh_3::poly01233210 } , + // 5 colors + { 00001234_c, CGAL::Mesh_3::poly00001234 } , + { 00010234_c, CGAL::Mesh_3::poly00010234 } , + { 00011234_c, CGAL::Mesh_3::poly00011234 } , + { 00012034_c, CGAL::Mesh_3::poly00012034 } , + { 00012134_c, CGAL::Mesh_3::poly00012134 } , + { 00012234_c, CGAL::Mesh_3::poly00012234 } , + { 00012334_c, CGAL::Mesh_3::poly00012334 } , + { 00012340_c, CGAL::Mesh_3::poly00012340 } , + { 00012341_c, CGAL::Mesh_3::poly00012341 } , + { 00012342_c, CGAL::Mesh_3::poly00012342 } , + { 00012343_c, CGAL::Mesh_3::poly00012343 } , + { 00111234_c, CGAL::Mesh_3::poly00111234 } , + { 00112234_c, CGAL::Mesh_3::poly00112234 } , + { 00112324_c, CGAL::Mesh_3::poly00112324 } , + { 00112334_c, CGAL::Mesh_3::poly00112334 } , + { 00121234_c, CGAL::Mesh_3::poly00121234 } , + { 00121304_c, CGAL::Mesh_3::poly00121304 } , + { 00121324_c, CGAL::Mesh_3::poly00121324 } , + { 00121340_c, CGAL::Mesh_3::poly00121340 } , + { 00121341_c, CGAL::Mesh_3::poly00121341 } , + { 00121342_c, CGAL::Mesh_3::poly00121342 } , + { 00121344_c, CGAL::Mesh_3::poly00121344 } , + { 00122134_c, CGAL::Mesh_3::poly00122134 } , + { 00122304_c, CGAL::Mesh_3::poly00122304 } , + { 00122314_c, CGAL::Mesh_3::poly00122314 } , + { 00122324_c, CGAL::Mesh_3::poly00122324 } , + { 00122334_c, CGAL::Mesh_3::poly00122334 } , + { 00122344_c, CGAL::Mesh_3::poly00122344 } , + { 00123400_c, CGAL::Mesh_3::poly00123400 } , + { 00123401_c, CGAL::Mesh_3::poly00123401 } , + { 00123414_c, CGAL::Mesh_3::poly00123414 } , + { 00123421_c, CGAL::Mesh_3::poly00123421 } , + { 00123423_c, CGAL::Mesh_3::poly00123423 } , + { 01101234_c, CGAL::Mesh_3::poly01101234 } , + { 01102334_c, CGAL::Mesh_3::poly01102334 } , + { 01121234_c, CGAL::Mesh_3::poly01121234 } , + { 01121340_c, CGAL::Mesh_3::poly01121340 } , + { 01121341_c, CGAL::Mesh_3::poly01121341 } , + { 01122034_c, CGAL::Mesh_3::poly01122034 } , + { 01122334_c, CGAL::Mesh_3::poly01122334 } , + { 01122340_c, CGAL::Mesh_3::poly01122340 } , + { 01123024_c, CGAL::Mesh_3::poly01123024 } , + { 01233214_c, CGAL::Mesh_3::poly01233214 } , + // 6 colors + { 00012345_c, CGAL::Mesh_3::poly00012345 } , + { 00112345_c, CGAL::Mesh_3::poly00112345 } , + { 00121345_c, CGAL::Mesh_3::poly00121345 } , + { 00122345_c, CGAL::Mesh_3::poly00122345 } , + { 00123405_c, CGAL::Mesh_3::poly00123405 } , + { 00123415_c, CGAL::Mesh_3::poly00123415 } , + { 00123425_c, CGAL::Mesh_3::poly00123425 } , + { 00123455_c, CGAL::Mesh_3::poly00123455 } , + { 01102345_c, CGAL::Mesh_3::poly01102345 } , + { 01121345_c, CGAL::Mesh_3::poly01121345 } , + { 01122345_c, CGAL::Mesh_3::poly01122345 } , + { 01123045_c, CGAL::Mesh_3::poly01123045 } , + { 01123445_c, CGAL::Mesh_3::poly01123445 } , + { 01123453_c, CGAL::Mesh_3::poly01123453 } , + { 01233245_c, CGAL::Mesh_3::poly01233245 } , + // 7 colors + { 00123456_c, CGAL::Mesh_3::poly00123456 } , + { 01123456_c, CGAL::Mesh_3::poly01123456 } , + { 01233456_c, CGAL::Mesh_3::poly01233456 } , + // 8 colors + { 01234567_c, CGAL::Mesh_3::poly01234567 } + }; +};// end triple_lines_extractor +}// end namespace Mesh 3 +}// end namespace CGAL + +#endif // CGAL_MESH_3_FEATURES_DETECTION_H diff --git a/Mesh_3/include/CGAL/Mesh_3/features_detection/features_detection_helpers.h b/Mesh_3/include/CGAL/Mesh_3/features_detection/features_detection_helpers.h new file mode 100644 index 00000000000..b3bcfb28f7a --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/features_detection/features_detection_helpers.h @@ -0,0 +1,72 @@ +// Copyright (c) 2022 GeometryFactory (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) : Sebastien Loriot, Jane Tournois +// +//****************************************************************************** +// +//****************************************************************************** + + +#ifndef CGAL_MESH_3_FEATURES_DETECTION_HELPERS_H +#define CGAL_MESH_3_FEATURES_DETECTION_HELPERS_H + +#include + +#include + +namespace CGAL +{ +namespace Mesh_3 +{ +namespace internal +{ + + template 1)> + struct Color_transformation_helper + { + using type = std::unordered_map; + static void reset(type& t) + { + t.clear(); + } + static bool is_valid(const type& t, const Word_type& w) + { + return t.find(w) != t.end(); + } + }; + template + struct Color_transformation_helper + { + using type = std::array; + static void reset(type& t) + { + std::fill(t.begin(), t.end(), 8/*invalid_word*/); + } + static bool is_valid(const type& t, const Word_type& w) + { + return t[w] != 8;/*invalid_word*/ + } + }; + + template + void debug_cerr(const char* title, const Array& tab) + { + std::cerr << title << " ["; + for (const auto t : tab) + std::cout << std::to_string(t) << " "; + std::cout << "]" << std::endl; + } + +}//end namespace internal +}//end namespace Mesh_3 +}//end namespace CGAL + +#endif // CGAL_MESH_3_FEATURES_DETECTION_HELPERS_H diff --git a/Mesh_3/include/CGAL/Mesh_3/generate_label_weights.h b/Mesh_3/include/CGAL/Mesh_3/generate_label_weights.h index 6d89ef94dba..9f6f5fefb76 100644 --- a/Mesh_3/include/CGAL/Mesh_3/generate_label_weights.h +++ b/Mesh_3/include/CGAL/Mesh_3/generate_label_weights.h @@ -309,9 +309,9 @@ CGAL::Image_3 generate_label_weights_with_known_word_type(const CGAL::Image_3& i * @returns a `CGAL::Image_3` of weights used to build a quality `Labeled_mesh_domain_3`, * with the same dimensions as `image` */ - +inline CGAL::Image_3 generate_label_weights(const CGAL::Image_3& image, - const float& sigma) + const float& sigma) { CGAL_IMAGE_IO_CASE(image.image(), return generate_label_weights_with_known_word_type(image, sigma); diff --git a/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h b/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h index b59eb144d74..e42bc0acff7 100644 --- a/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h +++ b/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h @@ -15,7 +15,6 @@ #include - #include #include #include // std::swap @@ -23,17 +22,23 @@ #include #include +#include +#include + #include #include #include -#include // for CGAL::Null_subdomain_index -#include + #include // for boost::prior #include #include #include +#include + +#include + namespace CGAL { namespace Mesh_3 { namespace internal { @@ -1128,6 +1133,63 @@ polylines_to_protect(const CGAL::Image_3& cgal_image, existing_polylines_end); } + +template +void +merge_and_snap_polylines(const CGAL::Image_3& image, + PolylineRange1& polylines_to_snap, + const PolylineRange2& existing_polylines) +{ + static_assert(std::is_same::value, + "Polyline ranges should have same point type"); + using P = typename PolylineRange1::value_type::value_type; + using K = typename Kernel_traits

::Kernel; + + using CGAL::internal::polylines_to_protect_namespace::Vertex_info; + using Graph = boost::adjacency_list >; + using vertex_descriptor = typename boost::graph_traits::vertex_descriptor; + + // build graph of polylines_to_snap + Graph graph; + typedef Mesh_3::internal::Returns_midpoint Midpoint_fct; + Mesh_3::internal::Graph_manipulations g_manip(graph); + + for (const auto& polyline : polylines_to_snap) + { + if (polyline.size() < 2) + continue; + + auto pit = polyline.begin(); + while (boost::next(pit) != polyline.end()) + { + vertex_descriptor v = g_manip.get_vertex(*pit, false); + vertex_descriptor w = g_manip.get_vertex(*boost::next(pit), false); + g_manip.try_add_edge(v, w); + ++pit; + } + } + + // snap graph to existing_polylines + snap_graph_vertices(graph, + image.vx(), image.vy(), image.vz(), + boost::begin(existing_polylines), boost::end(existing_polylines), + K()); + + // rebuild polylines_to_snap + polylines_to_snap.clear(); + Mesh_3::Polyline_visitor visitor(polylines_to_snap, graph); + Less_for_Graph_vertex_descriptors less(graph); + const Graph& const_graph = graph; + Mesh_3::Angle_tester angle_tester(90.); + split_graph_into_polylines(const_graph, visitor, angle_tester, less); +} + + } // namespace CGAL #endif // CGAL_MESH_3_POLYLINES_TO_PROTECT_H diff --git a/Mesh_3/test/Mesh_3/CMakeLists.txt b/Mesh_3/test/Mesh_3/CMakeLists.txt index e1bc8829add..9be90f6e430 100644 --- a/Mesh_3/test/Mesh_3/CMakeLists.txt +++ b/Mesh_3/test/Mesh_3/CMakeLists.txt @@ -31,6 +31,7 @@ create_single_source_cgal_program( "test_without_detect_features.cpp" ) if(CGAL_ImageIO_USE_ZLIB) create_single_source_cgal_program( "test_meshing_3D_image.cpp" ) create_single_source_cgal_program( "test_meshing_3D_image_deprecated.cpp" ) + create_single_source_cgal_program( "test_meshing_3D_image_with_features.cpp" ) create_single_source_cgal_program( "test_meshing_3D_gray_image.cpp" ) create_single_source_cgal_program( "test_meshing_3D_gray_image_deprecated.cpp" ) else() @@ -64,6 +65,7 @@ foreach(target test_without_detect_features test_meshing_3D_image test_meshing_3D_image_deprecated + test_meshing_3D_image_with_features test_meshing_3D_gray_image test_meshing_3D_gray_image_deprecated test_meshing_implicit_function diff --git a/Mesh_3/test/Mesh_3/test_meshing_3D_image_with_features.cpp b/Mesh_3/test/Mesh_3/test_meshing_3D_image_with_features.cpp new file mode 100644 index 00000000000..1c9607d45cc --- /dev/null +++ b/Mesh_3/test/Mesh_3/test_meshing_3D_image_with_features.cpp @@ -0,0 +1,199 @@ +// Copyright (c) 2009 INRIA Sophia-Antipolis (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) : Stephane Tayeb, Jane Tournois +// +//****************************************************************************** +// File Description : +//****************************************************************************** + +#include "test_meshing_utilities.h" +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +template +bool read_polylines(const std::string fname, + std::vector >& polylines) +{ + std::ifstream ifs(fname); + if(ifs.bad()) return false; + std::size_t n; + while(ifs >> n) { + polylines.resize(polylines.size()+1); + std::vector& polyline = polylines.back(); + while(n-- != 0) { + Point_3 p; + ifs >> p; + if(ifs.fail()) return false; + polyline.push_back(p); + } + } + if(ifs.bad()) return false; + else return ifs.eof(); +} + +template +struct Image_tester : public Tester +{ + typedef CGAL::Image_3 Image; + typedef CGAL::Labeled_mesh_domain_3 Domain; + typedef CGAL::Mesh_domain_with_polyline_features_3 Mesh_domain; + + typedef typename CGAL::Mesh_triangulation_3< + Mesh_domain, + CGAL::Kernel_traits::Kernel, + Concurrency_tag>::type Tr; + typedef CGAL::Mesh_complex_3_in_triangulation_3 C3t3; + + typedef CGAL::Mesh_criteria_3 Mesh_criteria; + + void mesh_and_verify(Mesh_domain& domain, const Image& image, const double volume) const + { + namespace p = CGAL::parameters; + // Set mesh criteria + Mesh_criteria criteria(p::edge_size = 2 * image.vx(), + p::facet_angle = 30, + p::facet_size = 20 * image.vx(), + p::facet_distance = 5 * image.vx(), + p::cell_radius_edge_ratio = 3., + p::cell_size = 25 * image.vx()); + + // Mesh generation + C3t3 c3t3 = CGAL::make_mesh_3(domain, criteria, + CGAL::parameters::no_exude(), + CGAL::parameters::no_perturb()); + + c3t3.remove_isolated_vertices(); + + // Verify + this->verify_c3t3_volume(c3t3, volume * 0.95, volume * 1.05); + this->verify(c3t3, domain, criteria, Bissection_tag()); + + typedef typename Mesh_domain::Surface_patch_index Patch_id; + CGAL_static_assertion(CGAL::Output_rep::is_specialized); + CGAL_USE_TYPE(Patch_id); + } + +public: + void image() const + { + namespace p = CGAL::parameters; + std::cout << "\tSeed is\t" + << CGAL::get_default_random().get_seed() << std::endl; + + //------------------------------------------------------- + // Data generation + //------------------------------------------------------- + Image image; + image.read(CGAL::data_file_path("images/liver.inr.gz")); + + Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain + (p::image = image, + p::relative_error_bound = 1e-9, + CGAL::parameters::p_rng = &CGAL::get_default_random(), + CGAL::parameters::features_detector = CGAL::Mesh_3::Detect_features_in_image()); + + mesh_and_verify(domain, image, 1772330.); + } + + void image_in_bbox() const + { + namespace p = CGAL::parameters; + std::cout << "\tSeed is\t" + << CGAL::get_default_random().get_seed() << std::endl; + + //------------------------------------------------------- + // Data generation + //------------------------------------------------------- + Image image; + image.read(CGAL::data_file_path("images/40420.inr")); + + Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain + (p::image = image, + p::relative_error_bound = 1e-9, + CGAL::parameters::p_rng = &CGAL::get_default_random(), + CGAL::parameters::features_detector = CGAL::Mesh_3::Detect_features_on_image_bbox()); + + mesh_and_verify(domain, image, 625044.); + } + + void image_with_input_features() const + { + namespace p = CGAL::parameters; + std::cout << "\tSeed is\t" + << CGAL::get_default_random().get_seed() << std::endl; + + //------------------------------------------------------- + // Data generation + //------------------------------------------------------- + Image image; + image.read(CGAL::data_file_path("images/40420.inr")); + + const std::string lines_fname = CGAL::data_file_path("images/420.polylines.txt"); + using Point_3 = Domain::Point_3; + std::vector > features_input; + if (!read_polylines(lines_fname, features_input)) // see file "read_polylines.h" + assert(false); + + Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain + (p::image = image, + p::relative_error_bound = 1e-9, + CGAL::parameters::p_rng = &CGAL::get_default_random(), + CGAL::parameters::features_detector = CGAL::Mesh_3::Detect_features_on_image_bbox(), + CGAL::parameters::input_features = std::cref(features_input)); + + mesh_and_verify(domain, image, 632091.); + } +}; + + + +int main() +{ + Image_tester<> test_epic; + std::cerr << "Mesh generation from a 3D image" + << " with detection of triple lines:\n"; + test_epic.image(); + + std::cerr << "Mesh generation from a 3D image" + << " with detection of triple lines on bbox only:\n"; + test_epic.image_in_bbox(); + + std::cerr << "Mesh generation from a 3D image" + << " with detection of triple lines on bbox" + << " and input feature polylines:\n"; + test_epic.image_with_input_features(); + +#ifdef CGAL_LINKED_WITH_TBB + Image_tester test_epic_p; + std::cerr << "Parallel mesh generation from a 3D image" + << " with detection of triple lines:\n"; + test_epic_p.image(); + + std::cerr << "Parallel mesh generation from a 3D image" + << " with detection of triple lines on bbox only:\n"; + test_epic_p.image_in_bbox(); + + std::cerr << "Parallel mesh generation from a 3D image" + << " with detection of triple lines on bbox" + << " and input feature polylines:\n"; + test_epic_p.image_with_input_features(); +#endif + + return EXIT_SUCCESS; +} diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp index e1b3770c225..eb3ce6042ae 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp @@ -277,12 +277,16 @@ void Mesh_3_plugin::mesh_3_volume() mesh_3(Mesh_type::VOLUME); } -boost::optional Mesh_3_plugin::get_items_or_return_error_string() const { +boost::optional Mesh_3_plugin::get_items_or_return_error_string() const +{ using boost::get; items = {}; features_protection_available = false; item = nullptr; - for (int ind : scene->selectionIndices()) { + Scene_polylines_item* polylines_item = nullptr; + + for (int ind : scene->selectionIndices()) + { try { if (auto sm_item = qobject_cast(scene->item(ind))) { @@ -313,9 +317,11 @@ boost::optional Mesh_3_plugin::get_items_or_return_error_string() const return tr("An image items cannot be mixed with other items type"); } # endif - else if (auto polylines_item = - qobject_cast(scene->item(ind))) { - if (!items) items = Polyhedral_mesh_items{}; + else if ((polylines_item = + qobject_cast(scene->item(ind)))) + { + if (!items) + continue; auto poly_items_ptr = get(&*items); if(poly_items_ptr) { if (poly_items_ptr->polylines_item) { @@ -323,12 +329,16 @@ boost::optional Mesh_3_plugin::get_items_or_return_error_string() const } else { poly_items_ptr->polylines_item = polylines_item; } - } else { - auto image_items = get(*items); - if (image_items.polylines_item) { - return tr("Only one polyline item is accepted"); - } else { - image_items.polylines_item = polylines_item; + } + else { + if(auto image_items_ptr = get(&*items)) + { + if (image_items_ptr->polylines_item) { + return tr("Only one polyline item is accepted"); + } + else { + image_items_ptr->polylines_item = polylines_item; + } } } } @@ -341,6 +351,20 @@ boost::optional Mesh_3_plugin::get_items_or_return_error_string() const } } catch (const boost::bad_get&) { return tr("Wrong selection of items"); } } // end for loop on selected items + + //attach polylines_item to one or the other item + //if it could not be done in the for loop + //because of selection order + if (polylines_item != nullptr && items != boost::none) + { + auto poly_items_ptr = get(&*items); + auto image_items_ptr = get(&*items); + if(poly_items_ptr && poly_items_ptr == nullptr) + poly_items_ptr->polylines_item = polylines_item; + else if(image_items_ptr && image_items_ptr == nullptr) + image_items_ptr->polylines_item = polylines_item; + } + if (!items) { return tr("Selected objects can't be meshed"); } item = nullptr; features_protection_available = false; @@ -428,6 +452,8 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, get(&*items) ? get(&*items)->polylines_item : nullptr; + if (polylines_item == nullptr && get(&*items) != nullptr) + polylines_item = get(&*items)->polylines_item; Scene_implicit_function_item* function_item = get(&*items) ? get(&*items)->function_item.get() @@ -571,18 +597,28 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, ui.edgeLabel->setEnabled(ui.noEdgeSizing->isChecked()); ui.edgeSizing->setEnabled(ui.noEdgeSizing->isChecked()); + const QString sharp_and_boundary("Sharp and Boundary edges"); + const QString boundary_only("Boundary edges only"); + const QString sharp_edges("Sharp edges"); + const QString input_polylines("Input polylines"); + const QString on_cube("Polylines on cube"); + const QString triple_lines("Triple+ lines"); if (features_protection_available) { if (items->which() == POLYHEDRAL_MESH_ITEMS) { if (mesh_type == Mesh_type::SURFACE_ONLY) { - ui.protectEdges->addItem(QString("Sharp and Boundary edges")); - ui.protectEdges->addItem(QString("Boundary edges only")); + ui.protectEdges->addItem(sharp_and_boundary); + ui.protectEdges->addItem(boundary_only); } else - ui.protectEdges->addItem(QString("Sharp edges")); + ui.protectEdges->addItem(sharp_edges); } else if (items->which() == IMAGE_MESH_ITEMS) { - if (polylines_item != nullptr) - ui.protectEdges->addItem(QString("Input polylines")); + if (polylines_item != nullptr) { + ui.protectEdges->addItem(QString(input_polylines).append(" only")); + ui.protectEdges->addItem(QString(on_cube).append(" and input polylines")); + ui.protectEdges->addItem(QString(triple_lines).append(" and input polylines")); + } else { - ui.protectEdges->addItem(QString("Polylines on cube")); + ui.protectEdges->addItem(on_cube); + ui.protectEdges->addItem(triple_lines); } } } @@ -629,10 +665,15 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, approx = !ui.noApprox->isChecked() ? 0 : ui.approx->value(); tets_shape = !ui.noTetShape->isChecked() ? 0 : ui.tetShape->value(); tets_sizing = !ui.noTetSizing->isChecked() ? 0 : ui.tetSizing->value(); - protect_features = - ui.protect->isChecked() && (ui.protectEdges->currentIndex() == 0); - protect_borders = - ui.protect->isChecked() && (ui.protectEdges->currentIndex() == 1); + + const int pe_ci = ui.protectEdges->currentIndex(); + protect_borders = ui.protect->isChecked() + && ( pe_ci == ui.protectEdges->findText(on_cube, Qt::MatchContains) + || pe_ci == ui.protectEdges->findText(boundary_only, Qt::MatchContains)); + protect_features = ui.protect->isChecked() + && ( pe_ci == ui.protectEdges->findText(triple_lines, Qt::MatchContains) + || pe_ci == ui.protectEdges->findText(sharp_and_boundary, Qt::MatchContains)); + const bool detect_connected_components = ui.detectComponents->isChecked(); const int manifold = (ui.manifoldCheckBox->isChecked() ? 1 : 0) + (ui.facetTopology->isChecked() ? 2 : 0); @@ -728,7 +769,7 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, } break; }//end case POLYHEDRAL_MESH_ITEMS - // Image + // Implicit functions # ifdef CGAL_MESH_3_DEMO_ACTIVATE_IMPLICIT_FUNCTIONS case IMPLICIT_MESH_ITEMS: { const Implicit_function_interface* pFunction = function_item->function(); @@ -747,11 +788,15 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, manifold, mesh_type == Mesh_type::SURFACE_ONLY); break; - } + }//end case IMPLICIT_MESH_ITEMS # endif + // Images # ifdef CGAL_MESH_3_DEMO_ACTIVATE_SEGMENTED_IMAGES case IMAGE_MESH_ITEMS: { const Image* pImage = image_item->image(); + auto& image_items = get(*items); + const auto img_polylines_item = image_items.polylines_item; + if (nullptr == pImage) { QMessageBox::critical(mw, tr(""), tr("ERROR: no data in selected item")); return; @@ -773,7 +818,7 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, thread = cgal_code_mesh_3( pImage, - (polylines_item == nullptr) ? plc : polylines_item->polylines, + (img_polylines_item == nullptr) ? plc : img_polylines_item->polylines, angle, facets_sizing, approx, @@ -781,6 +826,7 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, edges_sizing, tets_shape, protect_features, + protect_borders, manifold, mesh_type == Mesh_type::SURFACE_ONLY, detect_connected_components, diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.cpp index c4f59578610..15efe553844 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.cpp @@ -13,6 +13,8 @@ #include "Mesh_function.h" #include "Facet_extra_criterion.h" +#include +#include using namespace CGAL::Three; @@ -291,7 +293,8 @@ Meshing_thread* cgal_code_mesh_3(const Image* pImage, const double tet_sizing, const double edge_size, const double tet_shape, - bool protect_features, + bool protect_features, //detect_polylines + const bool protect_borders,//polylines on bbox const int manifold, const bool surface_only, bool detect_connected_components, @@ -303,11 +306,9 @@ Meshing_thread* cgal_code_mesh_3(const Image* pImage, { if (nullptr == pImage) { return nullptr; } - if(! polylines.empty()){ - protect_features = true; // so that it will be passed in make_mesh_3 - } Mesh_parameters param; - param.protect_features = protect_features; + param.protect_features + = protect_features || protect_borders || !polylines.empty(); param.detect_connected_components = detect_connected_components; param.facet_angle = facet_angle; param.facet_sizing = facet_sizing; @@ -343,7 +344,7 @@ Meshing_thread* cgal_code_mesh_3(const Image* pImage, { namespace p = CGAL::parameters; - Image_mesh_domain* p_domain; + Image_mesh_domain* p_domain = nullptr; #ifdef CGAL_USE_ITK if(nullptr != pWeights) { @@ -359,35 +360,57 @@ Meshing_thread* cgal_code_mesh_3(const Image* pImage, } else #endif - { - p_domain = new Image_mesh_domain - (Image_mesh_domain::create_labeled_image_mesh_domain - (p::image = *pImage, - p::relative_error_bound = 1e-6, - p::construct_surface_patch_index = - [](int i, int j) { return (i * 1000 + j); } - ) - ); - } + if (protect_features) + { + p_domain = new Image_mesh_domain + (Image_mesh_domain::create_labeled_image_mesh_domain + (p::image = *pImage, + p::relative_error_bound = 1e-6, + p::construct_surface_patch_index = + [](int i, int j) { return (i * 1000 + j); }, + p::features_detector = CGAL::Mesh_3::Detect_features_in_image(), + p::input_features = std::cref(polylines) + ) + ); + } + else if (protect_borders)//protect polylines on image Bbox + { + p_domain = new Image_mesh_domain + (Image_mesh_domain::create_labeled_image_mesh_domain + (p::image = *pImage, + p::relative_error_bound = 1e-6, + p::construct_surface_patch_index = + [](int i, int j) { return (i * 1000 + j); }, + p::features_detector = CGAL::Mesh_3::Detect_features_on_image_bbox(), + p::input_features = std::cref(polylines) + ) + ); + } + else if (!polylines.empty()) + { + p_domain = new Image_mesh_domain + (Image_mesh_domain::create_labeled_image_mesh_domain + (p::image = *pImage, + p::relative_error_bound = 1e-6, + p::construct_surface_patch_index = + [](int i, int j) { return (i * 1000 + j); }, + p::input_features = std::cref(polylines) + ) + ); + } - if(protect_features && polylines.empty()){ - std::vector > polylines_on_bbox; + if (p_domain == nullptr) + { + p_domain = new Image_mesh_domain + (Image_mesh_domain::create_labeled_image_mesh_domain + (p::image = *pImage, + p::relative_error_bound = 1e-6, + p::construct_surface_patch_index = + [](int i, int j) { return (i * 1000 + j); } + ) + ); + } - CGAL_IMAGE_IO_CASE(pImage->image(), - { - typedef Word Image_word_type; - (CGAL::polylines_to_protect< - Bare_point, - Image_word_type>(*pImage, polylines_on_bbox)); - p_domain->add_features(polylines_on_bbox.begin(), - polylines_on_bbox.end()); - } - ); - } - if(! polylines.empty()){ - // Insert edge in domain - p_domain->add_features(polylines.begin(), polylines.end()); - } typedef ::Mesh_function Mesh_function; Mesh_function* p_mesh_function = new Mesh_function(p_new_item->c3t3(), diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.h b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.h index 4928982cf1e..03e9514ba65 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.h +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin_cgal_code.h @@ -73,6 +73,7 @@ Meshing_thread* cgal_code_mesh_3(const CGAL::Image_3* pImage, const double edge_size, const double tet_shape, bool protect_features, + const bool protect_borders, const int manifold, const bool surface_only, bool detect_connected_components, diff --git a/SMDS_3/include/CGAL/Mesh_complex_3_in_triangulation_3.h b/SMDS_3/include/CGAL/Mesh_complex_3_in_triangulation_3.h index de6e11d647b..643de3ff7da 100644 --- a/SMDS_3/include/CGAL/Mesh_complex_3_in_triangulation_3.h +++ b/SMDS_3/include/CGAL/Mesh_complex_3_in_triangulation_3.h @@ -640,7 +640,7 @@ public: but are isolated from the complex at the end of the meshing process. This function removes these so-called \em isolated vertices, that belong to the - triangulation but not to any cell of the `C3T3`, from the triangulation. + triangulation but not to any simplex of the `C3T3`, from the triangulation. */ void remove_isolated_vertices() { @@ -669,7 +669,8 @@ public: std::vector isolated; for (Vertex_handle v : tr.finite_vertex_handles()) { - if (v->meshing_info() == 0.) + if (v->meshing_info() == 0. + && (v->in_dimension() > 1 || v->in_dimension() < 0)) isolated.push_back(v); } diff --git a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h index 478cedf5340..49c2a0d2c31 100644 --- a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h +++ b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h @@ -325,6 +325,8 @@ CGAL_add_named_parameter_with_compatibility(rng_t, rng, p_rng) CGAL_add_named_parameter_with_compatibility(null_subdomain_index_param_t,null_subdomain_index_param, null_subdomain_index) CGAL_add_named_parameter_with_compatibility(surface_patch_index_t, surface_patch_index, construct_surface_patch_index) CGAL_add_named_parameter_with_compatibility_ref_only(weights_param_t, weights_param, weights) +CGAL_add_named_parameter_with_compatibility(features_detector_param_t, features_detector_param, features_detector) +CGAL_add_named_parameter_with_compatibility(input_features_param_t, input_features_param, input_features) CGAL_add_named_parameter_with_compatibility(edge_size_param_t, edge_size_param, edge_size) CGAL_add_named_parameter_with_compatibility_ref_only(edge_sizing_field_param_t, edge_sizing_field_param, edge_sizing_field)