From bce9b83e7efa0737fe1a53c9f6cf3d0999d72830 Mon Sep 17 00:00:00 2001 From: Dmitry Anisimov Date: Thu, 16 Oct 2014 22:07:48 +0200 Subject: [PATCH] The last commit in the final third submission. This is the last commit with updated documentation and new example on height interpolation in the last third review submission of the package. --- .../Barycentric_coordinates_2.txt | 156 +++++++++++------- .../Concepts/BarycentricCoordinates_2.h | 4 +- .../PackageDescription.txt | 3 +- .../Barycentric_coordinates_2/dependencies | 3 + .../Barycentric_coordinates_2/examples.txt | 3 + .../fig/dh__coord__interp.png | Bin 35819 -> 35834 bytes .../Barycentric_coordinates_2/fig/terrain.png | Bin 0 -> 8396 bytes .../fig/terrain_interpolated.png | Bin 0 -> 46336 bytes .../fig/wp__coord__interp.png | Bin 31784 -> 31786 bytes .../Discrete_harmonic_coordinates_example.cpp | 14 +- ...polation_for_terrain_modelling_example.cpp | 127 ++++++++++++++ .../Mean_value_coordinates_example.cpp | 21 +-- .../Segment_coordinates_example.cpp | 10 +- .../Triangle_coordinates_example.cpp | 15 +- .../Triangle_coordinates_speed_test.cpp | 13 +- .../Wachspress_coordinates_example.cpp | 17 +- .../Discrete_harmonic_2.h | 2 - .../Generalized_barycentric_coordinates_2.h | 4 +- .../Barycentric_coordinates_2/Mean_value_2.h | 15 +- .../Segment_coordinates_2.h | 3 +- .../Triangle_coordinates_2.h | 2 +- .../Barycentric_coordinates_2/Wachspress_2.h | 4 +- .../Barycentric_coordinates_2/copyright | 2 +- .../Barycentric_coordinates_2/description.txt | 2 +- .../Barycentric_coordinates_2/license.txt | 2 +- .../long_description.txt | 2 +- .../DH_speed_test.cpp | 2 +- .../DH_speed_test_100_vertices.cpp | 2 +- .../DH_speed_test_with_many_vertices.cpp | 2 +- .../DH_weights_speed_test.cpp | 2 +- ..._weights_speed_test_with_many_vertices.cpp | 2 +- .../Mean_value_coordinates/MV_speed_test.cpp | 2 +- .../MV_speed_test_100_vertices.cpp | 2 +- .../MV_speed_test_with_34_vertices.cpp | 2 +- .../MV_speed_test_with_many_vertices.cpp | 2 +- .../MV_weights_speed_test.cpp | 2 +- ...MV_weights_speed_test_with_34_vertices.cpp | 2 +- ..._weights_speed_test_with_many_vertices.cpp | 2 +- .../Segment_coordinates_speed_test.cpp | 2 +- .../Triangle_coordinates_speed_test.cpp | 2 +- .../Wachspress_coordinates/WP_speed_test.cpp | 2 +- .../WP_speed_test_100_vertices.cpp | 2 +- .../WP_speed_test_with_many_vertices.cpp | 2 +- .../WP_weights_speed_test.cpp | 2 +- ..._weights_speed_test_with_many_vertices.cpp | 2 +- .../Almost_degenerate_segment_test.cpp | 2 +- .../Almost_degenerate_triangle_test.cpp | 2 +- .../Computation_at_vertices_test.cpp | 2 +- .../Computation_on_boundary_test.cpp | 2 +- .../Computation_on_edges_test.cpp | 2 +- .../DH_almost_degenerate_polygon_test.cpp | 2 +- .../DH_const_linear_precision_test.cpp | 2 +- .../DH_triangle_test.cpp | 2 +- .../DH_weights_test.cpp | 2 +- .../MV_const_linear_precision_test.cpp | 2 +- .../MV_special_points_test.cpp | 2 +- .../MV_triangle_test.cpp | 2 +- .../MV_weakly_convex_polygon_test.cpp | 2 +- .../MV_weights_test.cpp | 2 +- .../Segment_coordinates_test.cpp | 2 +- .../Segment_coordinates_with_offset_test.cpp | 2 +- .../Segment_test_with_point_2.cpp | 2 +- .../Triangle_coordinates_test.cpp | 2 +- .../Triangle_test_with_point_3.cpp | 2 +- .../WP_DH_unit_square_test.cpp | 2 +- .../WP_almost_degenerate_polygon_test.cpp | 2 +- .../WP_const_linear_precision_test.cpp | 2 +- .../WP_triangle_test.cpp | 2 +- .../WP_weights_test.cpp | 2 +- Barycentric_coordinates_2/todo.txt | 4 +- 70 files changed, 332 insertions(+), 182 deletions(-) create mode 100644 Barycentric_coordinates_2/doc/Barycentric_coordinates_2/fig/terrain.png create mode 100644 Barycentric_coordinates_2/doc/Barycentric_coordinates_2/fig/terrain_interpolated.png create mode 100644 Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Height_interpolation_for_terrain_modelling_example.cpp diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Barycentric_coordinates_2.txt b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Barycentric_coordinates_2.txt index 2dce21e8597..f72025bd5ba 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Barycentric_coordinates_2.txt +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Barycentric_coordinates_2.txt @@ -1,43 +1,45 @@ + namespace CGAL { /*! \mainpage User Manual \anchor Chapter_2D_Generalized_Barycentric_Coordinates -\anchor chapterGeneralizedBarycentricCoordinates \cgalAutoToc \authors Dmitry Anisimov, David Bommes, Kai Hormann, and Pierre Alliez \section gbc_introduction Introduction -The package 2D Generalized Barycentric Coordinates offers an efficient and robust implementation of two-dimensional closed-form generalized barycentric coordinates defined for simple two-dimensional polygons. If coordinates with respect to multivariate scattered points instead of a polygon are required, please refer to natural neighbour coordinates from the package \ref chapinterpolation "2D and Surface Function Interpolation". +The package 2D Generalized Barycentric Coordinates offers an efficient and robust implementation of two-dimensional closed-form generalized barycentric coordinates defined for simple two-dimensional polygons. If coordinates with respect to multivariate scattered points instead of a polygon are required, please refer to natural neighbour coordinates from the package \ref PkgInterpolation2Summary "2D and Surface Function Interpolation". -In particular, the package includes an implementation of \ref wp_example "Wachspress", \ref mv_example "mean value", and \ref dh_example "discrete harmonic coordinates" and provides some extra functions to compute barycentric coordinates with respect to segments (\ref seg_example "segment coordinates") and triangles (\ref tri_example "triangle coordinates"). Section \ref gbc_theory gives a short introduction to the topic of barycentric coordinates. +In particular, the package includes an implementation of \ref wp_example "Wachspress", \ref mv_example "mean value", and \ref dh_example "discrete harmonic" coordinates and provides some extra functions to compute barycentric coordinates with respect to segments (\ref seg_example "segment coordinates") and triangles (\ref tri_example "triangle coordinates"). The section \ref gbc_theory gives a short introduction to the topic of barycentric coordinates. \section gbc_interface Interface -Each class to compute barycentric coordinates is parameterized by a traits class that specifies the types and geometric primitives to be used in the computation. The default traits class for the package is `CGAL::Barycentric_coordinates::Barycentric_traits_2` that presents the two-dimensional \cgal kernel and gives the default two-dimensional input to the class. +Each class that computes barycentric coordinates is parameterized by a traits class. This traits class specifies types and geometric primitives that are used in the computation and must be a model of the concept `BarycentricTraits_2`. -The main entry point to the component is an input iterator over the vertices of a polygon. The polygon's vertices must be ordered and can be of any type. However, internally the classes with coordinate functions use the type `CGAL::Point_2`, that is why an appropriate traits class that converts the user's type to the `CGAL::Point_2` must be provided. The same argument holds for query points. +The main entry point to the component is an input iterator over the vertices of a polygon. The polygon's vertices must follow clockwise or anticlockwise ordering and can be of any type. However, internally the classes use the type `CGAL::Point_2`, that is why an appropriate traits class that converts the user's type to `CGAL::Point_2` must be provided. The same argument holds for query points. -Mean value coordinates are the most generic coordinate functions in this package because they allow an arbitrary simple polygon as input. Wachspress and discrete harmonic coordinates are, by definition, limited to strictly convex polygons. Segment coordinates take as input any non-degenerate segment, and triangle coordinate functions allow an arbitrary non-degenerate triangle. +Mean value coordinates are the most generic coordinates in this package because they allow an arbitrary simple polygon as input. Wachspress and discrete harmonic coordinates are, by definition, limited to strictly convex polygons. Segment coordinates take as input any non-degenerate segment, and triangle coordinates allow an arbitrary non-degenerate triangle. -Any point in the plane may be taken as a query point. However, we do not recommend to use Wachspress and discrete harmonic coordinates with query points outside the closure of a polygon because at some of those points these coordinate functions are not well-defined as explained in Section \ref gbc_degeneracies. +Segment and triangle coordinates can be computed by using either a global function or creating the corresponding class. All other generalized coordinates can be computed by creating an instance of the class `CGAL::Barycentric_coordinates::Generalized_barycentric_coordinates_2` parameterized by an appropriate coordinate type that must be a model of the concept `BarycentricCoordinates_2`. -Once instantiated for some polygon, the coordinate functions can be computed multiple times for different query points with respect to all the vertices of the provided polygon. In order to compute basis functions, use the function `compute()`. In order to compute barycentric weights directly without normalization for a strictly interior query point, use the function `compute_weights()`. +Any point in the plane may be taken as a query point. However, we do not recommend to use Wachspress and discrete harmonic coordinates with query points outside the closure of a polygon because at some of those points these coordinates are not well-defined, as explained in the Section \ref gbc_degeneracies. -The output of the computation is a set of coordinate values at the current query point with respect to all the vertices of the polygon, and it can be stored in an arbitrary container providing an appropriate output iterator. In addition, all the classes return a pointer to the last stored element and status of the computation (boolean true or false). +Once instantiated for some polygon, the coordinates can be computed multiple times for different query points with respect to all the vertices of the provided polygon. Use the \ref PkgBarycentric_coordinates_2 "Reference Manual" for the detailed interface. + +The output of the computation is a set of coordinate values at the current query point with respect to all the vertices of the polygon. This output can be stored in an arbitrary container providing an appropriate output iterator. In addition, all the classes return a pointer to the last stored element and a status of the computation (Boolean true or false). \section gbc_examples Examples \subsection wp_example Wachspress Coordinates -In the following example we create a random strictly convex polygon with 1000 random interior points and compute Wachspress coordinates at all these points with respect to all the polygon's vertices. In order to do so, we create 1000 random points, then we take the convex hull of this set of points as our polygon, and compute Wachspress coordinates for all the randomly defined points. We use the `Simple_cartesian` kernel with double type and store the obtained coordinate values in `std::vector` container. The output iterator is `std::back_insert_iterator`, and it is handled automatically by the class. +In the following example we create 1000 random points, then we take the convex hull of this set of points as our polygon, and compute Wachspress coordinates at all the defined points. We use the `Simple_cartesian` kernel with double type as a traits class and store obtained coordinate values in a container of the type `std::vector`. The output iterator is `std::back_insert_iterator`. \cgalExample{Barycentric_coordinates_2/Wachspress_coordinates_example.cpp} \subsection dh_example Discrete Harmonic Coordinates -In this example we compute discrete harmonic coordinates for a set of interior, boundary, and exterior points with respect to the unit square. We also show how to accelerate computations using additional parameters of the function `compute()`. The used kernel is exact, and we use `std::vector` as an output container. Since all the points are symmetric, it is easy to debug the correctness of the obtained coordinate values. The output iterator is `std::back_insert_iterator`. +In this example we compute discrete harmonic coordinates for a set of green (interior), red (boundary), and blue (exterior) points with respect to a unit square. We also show how to specify the location of a query point using additional function parameters. The used kernel is exact, and we use an output container of the type `std::vector`. Since all the points are symmetric, it is easy to debug the correctness of the obtained coordinate values. The output iterator is `std::back_insert_iterator`. \anchor dh_coord_example \cgalFigureBegin{dh__example,discrete_harmonic_coordinates_example.png} @@ -47,7 +49,7 @@ Example's point pattern. \cgalExample{Barycentric_coordinates_2/Discrete_harmonic_coordinates_example.cpp} \subsection mv_example Mean Value Coordinates -This is an example that shows how to compute mean value coordinates for a set of green points in the star-shaped polygon. We note that this type of coordinates is well-defined for such a concave polygon while Wachspress and discrete harmonic coordinates are not. However, it may give some negative coordinate values for points outside the kernel. We use inexact data type, an `std::vector` container, and the std::back_insert_iterator to compute and store the resulting coordinate values. +This is an example that shows how to compute mean value coordinates for a set of green points in a star-shaped polygon. We note that this type of coordinates is well-defined for such a concave polygon while Wachspress and discrete harmonic coordinates are not. However, it may give negative coordinate values for points outside the polygon's kernel (shown in red). We use an inexact data type, an output container of the type `std::vector`, and an output iterator of the type std::back_insert_iterator to compute, access, and store the resulting coordinate values. We also show how to choose different algorithms to compute generalized barycentric coordinates (one is more precise while the other is faster). \anchor mv_coord_example \cgalFigureBegin{mv__example,mean_value_coordinates_example.png} @@ -57,7 +59,7 @@ Example's point pattern. \cgalExample{Barycentric_coordinates_2/Mean_value_coordinates_example.cpp} \subsection tri_example Triangle Coordinates -In this example we show how to use the class `CGAL::Barycentric_coordinates::Triangle_coordinates_2` with the `Simple_cartesian` kernel for a double type. We compute coordinates for three sets of points: interior, boundary, and exterior. Note that some of the coordinate values for the exterior points are negative. We use a standard `std::vector` container and the `std::insert_iterator` to access and store the resulting values. +In this example we show how to use the class `CGAL::Barycentric_coordinates::Triangle_coordinates_2` with the `Simple_cartesian` kernel for double type. We compute coordinates for three sets of points: interior (green), boundary (red), and exterior (blue). Note that some of the coordinate values for the exterior points are negative. We use a standard container of the type `std::vector` and `std::insert_iterator` to access and store the resulting coordinate values. \anchor tri_coord_example \cgalFigureBegin{tri__example,triangle_coordinates_example.png} @@ -67,7 +69,7 @@ Example's point pattern. \cgalExample{Barycentric_coordinates_2/Triangle_coordinates_example.cpp} \subsection seg_example Segment Coordinates -This is a very simple and short example on how to use the class `CGAL::Barycentric_coordinates::Segment_coordinates_2`. We compute coordinate functions at three interior points along the segment \f$[v_0, v_1]\f$ and at two exterior points outside this segment along its supporting line. We use the exact kernel and return the coordinate values as a 2D point of the type `CGAL::Point_2`. Again, the symmetry of the query points allows us to see if there are any errors in the computation of the coordinates. +This is a simple example to show the use of the global function \ref seg_coord_global "CGAL::Barycentric_coordinates::compute_segment_coordinates_2()". We compute coordinates at three green points along the segment \f$[v_0, v_1]\f$ and at two blue points outside this segment but along its supporting line. We use the exact kernel and return coordinates as an array of two values. Again, the symmetry of the query points helps us to recognize errors that may have occured during the computation. \anchor seg_coord_example \cgalFigureBegin{seg__example,segment_coordinates_example.png} @@ -76,35 +78,55 @@ Example's point pattern. \cgalExample{Barycentric_coordinates_2/Segment_coordinates_example.cpp} +\subsection height_inter_example Height Interpolation for Terrain Modelling + +This is an advanced example that shows how to use generalized barycentric coordinates for height interpolation with applications to terrain modelling. It also shows how to use a non-default traits class with our package instead of a `Kernel` traits class. Suppose we know the boundary of three-dimensional piece of terrain that can be represented as a polygon with several three-dimensional vertices, where the third dimension gives the corresponding height. The task is to propagate the height from the known sample points on the boundary to the polygon's interior. This gives an approximate estimation of the terrain's surface in this region. + +\anchor terrain_example +\cgalFigureBegin{terrain__example,terrain.png} +A 2D polygon with 50 vertices representing a piece of terrain with convex and concave parts. The height is not shown. +\cgalFigureEnd + +In this example we project a three-dimensional polygon orthogonally onto the two-dimensional plane using the class `CGAL::Projection_traits_xy_3`, triangulate its interior using the class `CGAL::Delaunay_mesher_2`, and compute mean value coordinates for all the obtained points with respect to all the polygon's vertices. Finally, we interpolate the height data from the polygon's boundary to its interior using the computed coordinates and the global interpolation function from the package \ref PkgInterpolation2Summary "2D and Surface Function Interpolation". + +\cgalExample{Barycentric_coordinates_2/Height_interpolation_for_terrain_modelling_example.cpp} + +As a result we get a smooth function inside the polygon that approximates the underlying terrain's surface. + +\anchor terrain_example +\cgalFigureBegin{terrain__inter__example,terrain_interpolated.png} +The interpolated data. The colour bar represents the corresponding height. +\cgalFigureEnd + \section gbc_degeneracies Degeneracies and Special Cases \anchor compute_seg_coord \subsection gbc_deg_segment_coordinates Segment Coordinates -Segment coordinates can be computed exactly if an exact data type is chosen. The segment itself, with respect to which we compute coordinates, must be not degenerate. If both conditions are satisfied, then the computation never breaks down. However, to compute coordinate functions, the user must be sure about a query point being exactly on the line \f$L\f$ supporting the segment. Since in many applications this is not the case, and a query point may lie very close but not exactly on this line, the class is able to handle this situation. +Segment coordinates can be computed exactly if an exact data type is chosen. The segment itself, with respect to which we compute coordinates, must be non-degenerate. If both conditions are satisfied, then the computation never fails. However, to compute coordinates, the user must be sure about the query point being exactly on the line \f$L\f$ supporting the segment. Since in many applications this is not the case, and a query point may lie very close but not exactly on this line, the class is also able to handle this situation. \cgalFigureBegin{projection,projection.png} -The scalar projection \f$p'\f$ of the vector \f$p\f$ onto the vector \f$q\f$. +The orthogonal projection \f$p'\f$ of the vector \f$p\f$ (green) onto the vector \f$q\f$ (red). \cgalFigureEnd -Suppose that some query point \f$v\f$ does not lie exactly on the line \f$L\f$, but is some distance \f$d\f$ away as shown in the figure above. If we want to compute the segment barycentric coordinate \f$b_1(v)\f$ with respect to the vertex \f$v_1\f$, we first find the scalar projection \f$p'\f$ of the vector \f$p\f$ onto the vector \f$q\f$ and then normalize it by the length of \f$q\f$. This gives the segment barycentric coordinate \f$b_1(v') = b_1(v)\f$ if \f$v\f$ lies exactly on the line. +Suppose that some query point \f$v\f$ does not lie exactly on the line \f$L\f$, but is some distance \f$d\f$ away as shown in the figure above. If we want to compute the segment barycentric coordinate \f$b_1(v)\f$ with respect to the vertex \f$v_1\f$, we first find the orthogonal projection \f$p'\f$ of the vector \f$p\f$ onto the vector \f$q\f$ and then normalize it by the length of \f$q\f$. This gives the segment barycentric coordinate \f$b_1(v') = b_1(v)\f$ if \f$v\f$ lies exactly on the line. -\b Warning: Do not abuse the feature described above because it does not give correct segment barycentric coordinates for the point \f$v\f$ but rather those for \f$v'\f$. Moreover, segment barycentric coordinates for the point \f$v\f$ being not exactly on \f$L\f$ do not exist. But, if the non-zero distance \f$d\f$ is due to some numerical instability when computing the location of the point \f$v\f$ or any other problem which causes the point to be not exactly on the line, the final segment barycentric coordinates will be, at least approximately, correct. +\b Warning: do not abuse the feature described above because it does not give correct segment barycentric coordinates for the point \f$v\f$ but rather those for \f$v'\f$. Moreover, segment barycentric coordinates for a point \f$v\f$, which does not lie exactly on the line \f$L\f$, do not exist. But if the non-zero distance \f$d\f$ is due to some numerical instability when computing the location of the point \f$v\f$ or any other problem, which causes the point to be not exactly on the line, the final segment coordinates will be, at least approximately, correct. -With inexact data types, these coordinates give the correct result up to the precision of the chosen type. +With inexact data types, the resulting coordinate values are correct up to the precision of the chosen type. \subsection gbc_deg_triangular_coordinates Triangle Coordinates These coordinates can be computed exactly if an exact data type is chosen, for any query point in the plane and with respect to any non-degenerate triangle. No special cases are handled. The computation always gives the correct result. The notion of correctness depends on the precision of the used data type. Note that for exterior points some coordinate values will be negative. \subsection gbc_deg_wachspress_coordinates Wachspress Coordinates -Wachspress coordinates are well-defined in the closure of any strictly convex polygon. Therefore, for any query point from the polygon's closure with an exact data type, these coordinates are computed exactly and no false result is expected. For inexact data types, the resulting precision of the computation is due to the involved algorithm and chosen data type. In the following paragraph we discuss two available algorithms for computing Wachspress coordinate functions. One of them is `CGAL::Barycentric_coordinates::PRECISE`, the other is `CGAL::Barycentric_coordinates::FAST`. +Wachspress coordinates are well-defined in the closure of any strictly convex polygon. Therefore, for any query point from the polygon's closure with an exact data type, these coordinates are computed exactly and no false result is expected. For inexact data types, the resulting precision of the computation is due to the involved algorithm and chosen data type. In the following paragraph we discuss two available algorithms for computing Wachspress coordinates. One of them is `CGAL::Barycentric_coordinates::PRECISE`, the other is `CGAL::Barycentric_coordinates::FAST`. \anchor wp_polygon \cgalFigureBegin{wp__notations,wp_notations.png} Notation for Wachspress coordinates. \cgalFigureEnd -To compute Wachspress weights we follow \cite cgal:bc:fhk-gcbcocp-06 and use the formula +To compute Wachspress weights, we follow \cite cgal:bc:fhk-gcbcocp-06 and use the formula
\f$w_i = \frac{C_i}{A_{i-1}A_i}\f$
@@ -112,29 +134,30 @@ with \f$i = 1\dots n\f$ where \f$n\f$ is the number of the polygon's vertices. I
\f$b_i = \frac{w_i}{W^{wp}}\qquad\f$ with \f$\qquad W^{wp} = \sum_{j=1}^n w_j.\f$
-This formula becomes unstable when approaching to the boundary of the polygon (\f$\approx 1.0e-10\f$ and closer). To fix the problem we modify the weights \f$w_i\f$, +This formula becomes unstable when approaching the boundary of the polygon (\f$\approx 1.0e-10\f$ and closer). To fix the problem, we modify the weights \f$w_i\f$ as
\f$\bar{w}_i = C_i\prod_{j\not=i-1,i} A_j\f$.
-After the normalization as above, this gives us the precise algorithm to compute Wachspress coordinates but with the \f$O(n^2)\f$ performance only. The fast \f$O(n)\f$ algorithm uses the standard weights \f$w_i\f$. Note that mathematically this modification does not change the coordinates. +After the normalization as above, this gives us the precise algorithm to compute Wachspress coordinates but with \f$O(n^2)\f$ performance only. The fast \f$O(n)\f$ algorithm uses the standard weights \f$w_i\f$. Note that mathematically this modification does not change the coordinates. -It is known that for strictly convex polygons the denominator's zero set of the Wachspress coordinates (\f$W^{wp} = 0~\f$) is a curve, which (in many cases) lies quite far away from the polygon. Speaking precisely, it goes through the intersection points of the continuations of the polygon's edges. Therefore, computation of Wachspress coordinates outside the polygon is possible only at points that do not belong to this curve. +It is known that for strictly convex polygons the denominator's zero set of the Wachspress coordinates (\f$W^{wp} = 0~\f$) is a curve, which (in many cases) lies quite far away from the polygon. Speaking precisely, it interpolates the intersection points of the continuations of the polygon's edges. Therefore, the computation of Wachspress coordinates outside the polygon is possible only at points that do not belong to this curve. \cgalFigureBegin{zero__set,zero_set.png} -Zero set of the Wachspress coordinates' denominator \f$W^{WP}\f$ for a non-regular hexagon. +Zero set (red) of the Wachspress coordinates' denominator \f$W^{wp}\f$ for a non-regular hexagon. \cgalFigureEnd -\b Warning: We do not recommend to use Wachspress coordinates for exterior points! +\b Warning: we do not recommend to use Wachspress coordinates for exterior points! \subsection gbc_deg_discrete_harmonic_coordinates Discrete Harmonic Coordinates -Discrete harmonic coordinates have the same requirements as Wachspress coordinates. They are well-defined in the closure of any strictly convex polygon and, if an exact data type is chosen, they are computed exactly. But, unlike Wachspress basis functions, these coordinates are not necessarily positive. In particular, the weight function \f$w_i\f$ is positive if and only if \f$\alpha+\beta < \pi\f$ (see the figure below for notation). For inexact data types, the precision of the computation is due to the involved algorithm and chosen data type. Again, we describe two algorithms to compute the coordinate functions: one is precise and one is fast. +Discrete harmonic coordinates have the same requirements as Wachspress coordinates. They are well-defined in the closure of any strictly convex polygon and, if an exact data type is chosen, they are computed exactly. But, unlike Wachspress basis functions, these coordinates are not necessarily positive. In particular, the weight \f$w_i\f$ is positive if and only if \f$\alpha+\beta < \pi\f$ (see the figure below for notation). For inexact data types, the precision of the computation is due to the involved algorithm and chosen data type. Again, we describe two algorithms to compute the coordinates: one is precise and one is fast. +\anchor dh_polygon \cgalFigureBegin{dh__notations,dh_notations.png} Notation for discrete harmonic coordinates. \cgalFigureEnd -To compute discrete harmonic weights we follow \cite cgal:bc:fhk-gcbcocp-06 and use the formula +To compute discrete harmonic weights, we follow \cite cgal:bc:fhk-gcbcocp-06 and use the formula
\f$w_i = \frac{r_{i+1}^2A_{i-1}-r_i^2B_i+r_{i-1}^2A_i}{A_{i-1}A_i}\f$
@@ -142,110 +165,119 @@ with \f$i = 1\dots n\f$ where \f$n\f$ is the number of the polygon's vertices. I
\f$b_i = \frac{w_i}{W^{dh}}\qquad\f$ with \f$\qquad W^{dh} = \sum_{j=1}^n w_j.\f$
-This formula becomes unstable when approaching to the boundary of the polygon (\f$\approx 1.0e-10\f$ and closer). To fix the problem, similarly to the previous subsection, we modify the weights \f$w_i\f$ as +This formula becomes unstable when approaching the boundary of the polygon (\f$\approx 1.0e-10\f$ and closer). To fix the problem, similarly to the previous subsection, we modify the weights \f$w_i\f$ as
\f$\bar{w}_i = (r_{i+1}^2A_{i-1}-r_i^2B_i+r_{i-1}^2A_i)\prod_{j\not=i-1,i} A_j\f$.
-After the normalization as above, this gives us the precise algorithm to compute discrete harmonic coordinates but with the \f$O(n^2)\f$ performance only. The fast \f$O(n)\f$ algorithm uses the standard weights \f$w_i\f$. Again, mathematically this modification does not change the coordinates. +After the normalization as above, this gives the precise algorithm to compute discrete harmonic coordinates but with \f$O(n^2)\f$ performance only. The fast \f$O(n)\f$ algorithm uses the standard weights \f$w_i\f$. Again, mathematically this modification does not change the coordinates. -\b Warning: As for Wachspress coordinates, we do not recommend to use discrete harmonic coordinates for exterior points because the curve \f$W^{dh} = 0\f$ may have several components, and one of them always goes through the polygon's vertices. However, if you are sure that the query point does not belong to this curve, you can use them as in the \ref dh_example example. +\b Warning: as for Wachspress coordinates, we do not recommend to use discrete harmonic coordinates for exterior points because the curve \f$W^{dh} = 0\f$ may have several components, and one of them interpolates the polygon's vertices. However, if you are sure that the query point does not belong to this curve, you can compute the coordinates as shown in \ref dh_example " this example". \subsection gbc_deg_mean_value_coordinates Mean Value Coordinates -Unlike all the previous coordinates, mean value coordinates cannot be computed exactly due to an inevitable square root operation. Although, if an exact data type is used, the precision of the computation depends only on two \cgal functions: `CGAL::to_double()` and `CGAL::sqrt()`. On the other hand, mean value coordinates are well-defined everywhere in the plane for any simple polygon. +Unlike the previous coordinates, mean value coordinates cannot be computed exactly due to an inevitable square root operation. Although, if an exact data type is used, the default precision of the computation depends only on two \cgal functions: `CGAL::to_double()` and `CGAL::sqrt()`. On the other hand, mean value coordinates are well-defined everywhere in the plane for any simple polygon. In addition, if your traits class provides a more precise version of the square root function, the final precision of the computation with exact data types will depend only on the precision of that function. +\anchor mv_polygon \cgalFigureBegin{mv__notations,mv_notations.png} Notation for mean value coordinates. \cgalFigureEnd -For these coordinate functions we also have two algorithms: one is precise and one is fast. The first one works everywhere in the plane, and the precision of the computation depends only on the chosen data type. However, its limit is the standard double type which is used internally to compute the square root. This algorithm is based on the following weight formula from \cite cgal:bc:f-wmvc-14 +For these coordinates we also have two algorithms: one is precise and one is fast. The first one works everywhere in the plane, and the precision of the computation depends only on the chosen data type, including the remarks above. This algorithm is based on the following weight formula from \cite cgal:bc:f-wmvc-14
\f$w_i = \sigma_i\bar{w}_i\qquad\f$ with \f$\qquad\bar{w}_i = (r_{i-1}r_{i+1}-d_{i-1}d_{i+1})^{1/2}\prod_{j\not= i-1,i}(r_jr_{j+1} + d_jd_{j+1})^{1/2}\qquad\f$ where \f$\qquad r_i = \|d_i\|.\f$
-Since \f$\bar{w}_i\f$ is always positive, we have to append to it the proper sign \f$\sigma_i\f$ of the signed mean value weight function, which can be found efficiently (see the figures below). Basically, this weight function is always positive to the left from the red piecewise linear curve, and it is negative to the right from this curve moving in counterclockwise direction. +Since \f$\bar{w}_i\f$ is always positive, we have to append to it the proper sign \f$\sigma_i\f$ of the signed mean value weight, which can be found efficiently (see the figures below). Basically, this weight is always positive to the left of the red piecewise linear curve, and it is negative to the right of this curve, moving in anticlockwise direction. \cgalFigureBegin{mv__weight__signs,mv_weight_signs_convex.png,mv_weight_signs_concave.png} -Signs of the mean value weight \f$w_i\f$ depending on the region with respect to a convex \f$P\f$ and a concave \f$P'\f$ polygon. +Signs of the mean value weight \f$w_i\f$ depending on the region with respect to a convex polygon \f$P\f$ and a concave polygon \f$P'\f$. \cgalFigureEnd -After the normalization of these weights as before we obtain the precise \f$O(n^2)\f$ algorithm. The fast \f$O(n)\f$ algorithm uses the pseudocode from here. To compute weights \f$w_i\f$ without normalization we use formulas from the same pseudocode. Note that they are getting unstable if a query point is closer than \f$\approx 1.0e-10\f$ to the polygon's boundary, similarly to Wachspress and discrete harmonic coordinates. +After the normalization of these weights as before + +
\f$b_i = \frac{w_i}{W^{mv}}\qquad\f$ with \f$\qquad W^{mv} = \sum_{j=1}^n w_j\f$
+ +we obtain the precise \f$O(n^2)\f$ algorithm. The fast O(n) algorithm computes the weights \f$w_i\f$ using the pseudocode from here. These weights + +
\f$w_i = \frac{t_{i-1} + t_i}{r_i}\qquad\f$ with \f$\qquad t_i = \frac{\text{det}(d_i, d_{i+1})}{r_ir_{i+1} + d_id_{i+1}}\f$
+ +are also normalized. Note that they are unstable if a query point is closer than \f$\approx 1.0e-10\f$ to the polygon's boundary, similarly to Wachspress and discrete harmonic coordinates. \section gbc_performance Performance -Apart from the most important requirement on barycentric coordinates to be as precise as possible, it is very important for them to be as fast as possible to evaluate. These coordinate functions are used in many applications where they must be computed for millions of points and, thus, the real time usage of coordinates is crucial. When writing the code, we tried to fulfil this important requirement, and in this section we present a few results about the computational time of the implemented coordinate functions. +Apart from the most important requirement on barycentric coordinates to be as precise as possible, it is very important for them to be as fast as possible to evaluate. These coordinates are used in many applications where they must be computed for millions of points and, thus, the real time usage of coordinates is crucial. When writing the code, we tried to fulfil this important requirement, and in this section we present a few results about the computation times of the implemented coordinates. -The structure of the speed test that we ran for all the functions consists of computing coordinate values (or weights) at >= 1 million strictly interior points with respect to some polygon (or triangle, or segment). At each iteration of the loop we create a query point, pass it to the function, and compute all the related coordinates. We run this loop 10 times in a row, and the time presented in the log-log scale plot at the end of the section is the arithmetic mean of all trials. A typical example of the performed test for triangle coordinates can be found below. This example also illustrates how to construct an iterator and pass it to the class. In the example we create an iterator that writes coordinate values for each new query point over coordinate values of the previous point in the fixed-size standard C++ array, so that memory is allocated only once. +The structure of the speed test that we ran for all functions consists of computing coordinate values (or weights) at >= 1 million strictly interior points with respect to some polygon (or triangle, or segment). At each iteration of the loop we create a query point, pass it to the function, and compute all the related coordinates. We run this loop 10 times in a row, and the time presented in the log-log scale plot at the end of the section is the arithmetic mean of all trials. A typical example of this performance test for triangle coordinates can be found below. This example also illustrates how to construct an iterator and pass it to the class. In this example we create an iterator that writes coordinate values for each new query point over coordinate values of the previous point in the fixed-size standard C++ array, so that memory is allocated only once. \cgalExample{Barycentric_coordinates_2/Triangle_coordinates_speed_test.cpp} -The time to compute coordinates depends on many factors such as memory allocation, input kernel, output container, number of points, and so on. In our tests we used the most standard C++ and \cgal features with minimum memory allocation. Therefore, the final time presented is the average time that can be expected without deep optimization but still with efficient memory allocation. It also means that it may vary depending on the usage of the package. +The time to compute coordinates depends on many factors such as memory allocation, input kernel, output container, number of points, etc. In our tests we used the most standard C++ and \cgal features with minimum memory allocation. Therefore, the final time presented is the average time that can be expected without deep optimization but still with efficient memory allocation. It also means that it may vary depending on the usage of the package. -The machine used in all the tests is a MacBook Pro 2011 with 2 GHz Intel Core i7 processor (2 cores) and 8 GB 1333 MHz DDR3 memory. The installed operating system is OS X 10.9 Maverick. In order to compile the speed test suite, we used the Clang 5.0 64bit compiler. The resulting timings can be found in the figure below. +For all tests we used a MacBook Pro 2011 with 2 GHz Intel Core i7 processor (2 cores) and 8 GB 1333 MHz DDR3 memory. The installed operating system was OS X 10.9 Maverick. In order to compile the speed test suite, we used the Clang 5.0 64bit compiler. The resulting timings can be found in the figure below. \cgalFigureBegin{time,time.png} -Time in seconds to compute \f$n\f$ coordinate functions for a polygon with \f$n\f$ vertices at 1 million points. Solid \f$O(n^2)\f$ and dashed \f$O(n)\f$ algorithms for Wachspress, discrete harmonic, and mean value coordinates. +Time in seconds to compute \f$n\f$ coordinate values for a polygon with \f$n\f$ vertices at 1 million points with the fast \f$O(n)\f$ algorithms (dashed) and the slow \f$0(n^2)\f$ algorithms (solid) for Wachspress (blue), discrete harmonic (red), and mean value (green) coordinates. \cgalFigureEnd -From the figure above it is easy to see that, when we have a polygon with a small number of vertices, the \f$O(n^2)\f$ algorithm is as fast as the \f$O(n)\f$ algorithm but, when we increase the number of vertices, the linear algorithm outperforms the squared one, as expected. One of the reasons for this to happen is because for a small number of vertices the operation of multiplication over \f$n-2\f$ elements inside the \f$O(n^2)\f$ algorithm, when computing weights, takes almost the same time as the corresponding operation of division in the \f$O(n)\f$ algorithm. For a polygon with many vertices this multiplication is much slower. +From the figure above it is easy to see that the \f$O(n^2)\f$ algorithm is as fast as the \f$O(n)\f$ algorithm if we have a polygon with a small number of vertices. But as the number of vertices is increased, the linear algorithm outperforms the squared one, as expected. One of the reasons for this behaviour is that for a small number of vertices the multiplications for \f$n-2\f$ elements inside the \f$O(n^2)\f$ algorithm with the fast \f$O(n)\f$ algorithms (dashed) and the slow \f$O(n^2)\f$ algorithms (solid) take almost the same time as the corresponding division in the \f$O(n)\f$ algorithm. For a polygon with many vertices this multiplication is much slower. \section gbc_implementation Implementation Details -The generic design of the package was developed in 2013 by Dmitry Anisimov and David Bommes with many useful comments by Kai Hormann and Pierre Alliez. The package consists of 10 classes, 3 enumerations, and one namespace. Appropriate iterators are used to provide an efficient access to data and pass them to one of the generic algorithms to compute coordinates. Once instantiated for a polygon (triangle, segment), the coordinate functions can be computed multiple times for different query points with respect to all the vertices of the provided polygon (triangle, segment). All the classes are fully templated and have a simple and similar design. For example, if the function to compute coordinates within one class is named `compute()`, it has the same name within all other classes. Yet, the number of functions can differ from one class to another. +The generic design of the package was developed in 2013 by Dmitry Anisimov and David Bommes with many useful comments by Kai Hormann and Pierre Alliez. The package consists of 6 classes, 2 enumerations, and one namespace. Appropriate iterators are used to provide an efficient access to data and to pass them to one of the generic algorithms for computing coordinates. Once instantiated for a polygon (triangle, segment), the coordinates can be computed multiple times for different query points with respect to all the vertices of the provided polygon (triangle, segment). All the classes are fully templated and have a simple and similar design. In particular, we follow the same naming convention for all functions. Yet, the number of functions can differ from one class to another. -The implemented algorithms for computing coordinates do not depend on a particular kernel, and all the coordinate functions can be computed exactly, if an exact kernel is used, apart from mean value coordinates. The latter coordinates involve a square root operation, which results in a slightly worse precision with exact data types due to temporal conversion into a floating point type. The computed coordinates can be stored in an arbitrary container if an appropriate output iterator is provided. +The implemented algorithms for computing coordinates do not depend on a particular kernel, and all the coordinates can be computed exactly, if an exact kernel is used, apart from mean value coordinates. The latter coordinates involve a square root operation, which results in a slightly worse precision with exact data types due to temporal conversion into a floating point type. The computed coordinates can be stored in an arbitrary container if an appropriate output iterator is provided. -It is worth noting that `CGAL::Barycentric_coordinates::Segment_coordinates_2` are used to compute generalized barycentric coordinates along the polygon's boundary. Hence, one can use a trick for segment coordinates from \ref gbc_degeneracies section if one is convinced that a point must lie exactly on the polygon's boundary but due to some numerical instabilities it does not. +It is worth noting that the class `CGAL::Barycentric_coordinates::Segment_coordinates_2` is used to compute generalized barycentric coordinates along the polygon's boundary. Hence, one can use the trick for segment coordinates from Section \ref gbc_degeneracies if one is convinced that a point must lie exactly on the polygon's boundary but due to some numerical instabilities it does not. -The package is implemented in a way that later, if needed, other two-dimensional generalized barycentric coordinates can be easily added to the package. +The package is implemented in a way that later, if needed, other two-dimensional generalized barycentric coordinates can be easily added to this package. \section gbc_theory Theory of 2D Generalized Barycentric Coordinates -In 1827, the famous German mathematician and theoretical astronomer August Ferdinand Möbius (1790--1868) proposed a method \cite cgal:bc:m-dbc-27 to find coordinates of a point in the plane with respect to the vertices of a triangle. These coordinates are called triangle barycentric coordinates (sometimes area coordinates), and they are widely used in a variety of applications. Some of these applications are linear interpolation over a triangle and a triangle inclusion test. The first one is used for so-called shading, and the second one arises in the rasterization step when an image in vector graphics format needs to be converted into a raster image. +In 1827, the German mathematician and theoretical astronomer August Ferdinand Möbius (1790--1868) proposed a method \cite cgal:bc:m-dbc-27 to find coordinates of a point in the plane with respect to the vertices of a triangle. These coordinates are called triangle barycentric coordinates (sometimes area coordinates), and they are widely used in a variety of applications. Some of these applications are linear interpolation over a triangle and a triangle inclusion test. The first one is used for so-called shading, and the second one arises in the rasterization step when an image in vector graphics format needs to be converted into a raster image. -Triangle barycentric coordinates have many important properties, including \em constant and linear precision, the Lagrange property, and positivity inside a triangle. These properties make these coordinates a unique tool in many scientific fields. If we restrict triangle coordinates to one of its edges and its supporting line, we get barycentric coordinates with respect to a segment. We call these coordinates \ref gbc_deg_segment_coordinates "segment coordinates" and compute them as explained \ref compute_seg_coord "here". +Triangle barycentric coordinates have many important properties, including \em constant and linear precision, the Lagrange property, and positivity inside a triangle. These properties make these coordinates a unique tool in many scientific fields. If we restrict triangle coordinates to one of the edges of a triangle and its supporting line, we get barycentric coordinates with respect to a segment and call them \ref compute_seg_coord "segment coordinates". -Let us show a couple of plots for the coordinates described above. To plot segment coordinates we take a line \f$y = 0.4\f$ and define \ref fig__seg__example "a segment" \f$[v_0, v_1]\f$ on this line. Then we sample this segment and compute segment coordinates for all the sample points. If we plot the segment coordinate function at all the defined points with respect to \f$v_1\f$, we get the blue line depicted in the figure below. It grows from zero at \f$v_0\f$ to one at \f$v_1\f$. +Let us show a couple of plots for the coordinates described above. To plot segment coordinates, we take a line \f$y = 0.4\f$ and define \ref fig__seg__example "a segment" \f$[v_0, v_1]\f$ on this line. Then we sample this segment and compute segment coordinates for all the sample points. If we plot the segment coordinate function at all the defined points with respect to the vertex \f$v_1\f$, we get the blue line depicted in the figure below. It grows from zero at the vertex \f$v_0\f$ to one at the vertex \f$v_1\f$. \cgalFigureBegin{seg__coord__interp,seg__coord__interp.png} -Segment coordinates for all the segment points with respect to \f$v_1 = (2.0,\ 0.4)\f$. +Segment coordinates (blue) for all the segment points (green) with respect to the vertex \f$v_1 = (2.0,\ 0.4)\f$. \cgalFigureEnd -If we want to plot triangle coordinates, we follow a similar approach. We take \ref fig__tri__example "a triangle" \f$[v_0, v_1, v_2]\f$ in the plane and sample its interior and boundary with a number of points. Once we have this sampling, we plot one of the triangle coordinate functions (here with respect to the third vertex of the triangle) at all the defined sample points. Likewise, we can plot the coordinate function with respect to the first or second vertex. The resulting function is a linear function (shown in the figure below) that grows from zero along the first edge \f$[v_0, v_1]\f$ to one at the chosen vertex \f$v_2\f$. +If we want to plot triangle coordinates, we follow a similar approach. We take \ref fig__tri__example "a triangle" \f$[v_0, v_1, v_2]\f$ in the plane and sample its interior and boundary with a number of points. Once we have this sampling, we plot one of the triangle coordinate functions (here with respect to the third vertex of the triangle) at all the defined sample points. Likewise, we can plot the coordinate function with respect to the first or second vertex. The resulting function is linear (shown in the figure below) that grows from zero along the first edge \f$[v_0, v_1]\f$ to one at the chosen vertex \f$v_2\f$. \cgalFigureBegin{tri__coord__interp,tri__coord__interp.png} -Triangle coordinates with respect to \f$v_2 = (1.0,\ 2.0)\f$. The colour bar indicates the range of values for the chosen coordinate function. +Triangle coordinates with respect to \f$v_2 = (1.0,\ 2.0)\f$. The colour bar indicates the range of values for the chosen coordinate. \cgalFigureEnd -Since many applications require to work with more complex planar geometric shapes than segments and triangles, it seems natural to investigate a generalized version of triangle coordinates with respect to arbitrary polygons. The first attempt was taken in 1975 by E. L. Wachspress \cite cgal:bc:w-rfeb-75, and the resulting generalized barycentric coordinates are now called Wachspress coordinates \cite cgal:bc:mlbd-gbcip-02. \ref gbc_deg_wachspress_coordinates "These coordinates" are well-defined for arbitrary strictly convex polygons and have all the properties of triangle coordinates \cite cgal:bc:fhk-gcbcocp-06. Unfortunately, they are not well-defined for weakly convex and concave polygons and break down in this setting. +Since many applications require to work with more complex planar geometric shapes than segments and triangles, it seems natural to investigate a generalized version of triangle coordinates with respect to arbitrary polygons. The first attempt was taken in 1975 by E. L. Wachspress \cite cgal:bc:w-rfeb-75, and the resulting generalized barycentric coordinates are now called Wachspress coordinates \cite cgal:bc:mlbd-gbcip-02. \ref gbc_deg_wachspress_coordinates "These coordinates" are well-defined for arbitrary strictly convex polygons and have all the properties of triangle coordinates \cite cgal:bc:fhk-gcbcocp-06. Unfortunately, they are not well-defined for weakly convex and concave polygons. -Analogously to the previous cases we want to plot the Wachspress coordinate function and see how it looks like. Let us choose a \ref wp_polygon "non-regular hexagon", slightly rotate it, and move one of its vertices towards the line through its two adjacent neighbours. We sample interior and boundary of this polygon as before and plot the coordinate function at all the defined sample points with respect to the vertex that we moved. We see that we get a smooth function, which is linear along edges and grows from zero to one, as the colour bar indicates. +Analogously to the previous cases, we want to plot the Wachspress coordinates and see how they look like. Let us choose a \ref wp_polygon "non-regular hexagon", slightly rotate it, and move one of its vertices towards the line through its two adjacent neighbours. We sample the interior and the boundary of this polygon as before and plot the coordinate function with respect to the vertex that we moved at all the sample points. We see that we get a smooth function, which is linear along all edges and grows from zero to one, as the colour bar indicates. \anchor wp_plot \cgalFigureBegin{wp__coord__interp,wp__coord__interp.png} -The Wachspress coordinate function with values from zero to one as the colour bar indicates. +The Wachspress coordinate function with respect to the indicated vertex with values from zero to one as the colour bar indicates. \cgalFigureEnd -Another type of generalized barycentric coordinates goes back to Pinkall and Polthier in 1993 \cite cgal:pp-cdmsc-93 and Eck et al. in 1995 \cite cgal:bc:eddhls-maam-95 in the context of \ref chapsurface_mesh_parameterization "triangle mesh parameterization". They are called discrete harmonic coordinates. \ref gbc_deg_discrete_harmonic_coordinates "These coordinates" are well-defined, similarly to Wachspress coordinates, for arbitrary strictly convex polygons and inherit all the properties of triangle coordinates apart from the positivity inside a polygon because they can take on negative values. Another interesting property of these coordinate functions is that they coincide with Wachspress coordinates for any polygon whose vertices lie on a common circle. +Another type of generalized barycentric coordinates goes back to Pinkall and Polthier in 1993 \cite cgal:pp-cdmsc-93 and Eck et al. in 1995 \cite cgal:bc:eddhls-maam-95 in the context of \ref PkgSurfaceParameterizationSummary "triangle mesh parameterization". They are called discrete harmonic coordinates. \ref gbc_deg_discrete_harmonic_coordinates "These coordinates" are well-defined, similarly to Wachspress coordinates, for arbitrary strictly convex polygons and inherit all the properties of triangle coordinates apart from the positivity inside a polygon because they can take on negative values \ref gbc_deg_discrete_harmonic_coordinates "for some polygons". Another interesting property of these coordinate functions is that they coincide with Wachspress coordinates for any polygon whose vertices lie on a common circle. -To plot discrete harmonic coordinates we take \ref wp_plot "the same polygon" as for Wachspress coordinates and plot the function with respect to the same vertex. Again, we get a smooth function, which is linear along edges and grows from zero to one. The distribution of colours in the plot shows the difference between discrete harmonic and Wachspress coordinates for the chosen polygon and vertex. +To plot discrete harmonic coordinates we take \ref wp_plot "the same polygon" as for Wachspress coordinates and plot the coordinate function with respect to the same vertex. Again, we get a smooth function, which is linear along all edges and grows from zero to one. Isolines in the plot show the difference between discrete harmonic and Wachspress coordinates for the chosen polygon and vertex. \anchor dh_plot \cgalFigureBegin{dh__coord__interp,dh__coord__interp.png} -The discrete harmonic coordinate function with values from zero to one as the colour bar indicates. +The discrete harmonic coordinate function with respect to the indicated vertex with values from zero to one as the colour bar indicates. \cgalFigureEnd -The last type of generalized barycentric coordinates that we discuss are mean value coordinates \cite cgal:f-mvc-03 proposed by M. Floater in 2003. Based on the mean value theorem, \ref gbc_deg_mean_value_coordinates "these coordinates", unlike Wachspress and discrete harmonic coordinates, are well-defined for arbitrary simple polygons, inherit all the properties of triangle coordinates for any convex polygon, and lack only the positivity property for general concave polygons. Hormann and Floater prove in \cite cgal:bc:hf-mvcapp-06 that these coordinates are positive inside the kernel of a star-shaped polygon. They are also positive in the closure of any quadrilateral. Like discrete harmonic weights, mean value weights are often used in the context of \ref chapsurface_mesh_parameterization "triangle mesh parameterization." +The last type of generalized barycentric coordinates that we discuss are mean value coordinates \cite cgal:f-mvc-03 proposed by M. Floater in 2003. Based on the mean value theorem, \ref gbc_deg_mean_value_coordinates "these coordinates", unlike Wachspress and discrete harmonic coordinates, are well-defined for arbitrary simple polygons, inherit all the properties of triangle coordinates for any convex polygon, and lack only the positivity property for general concave polygons. Hormann and Floater prove in \cite cgal:bc:hf-mvcapp-06 that these coordinates are positive inside the kernel of a star-shaped polygon. They are also positive in the closure of any quadrilateral. Like discrete harmonic weights, mean value weights are often used in the context of \ref PkgSurfaceParameterizationSummary "triangle mesh parameterization." -In order to show the particular behaviour of mean value coordinates with an application to concave polygons, we take \ref fig__mv__example "a star-shaped polygon" with ten vertices \f$[v_0, \dots, v_9]\f$, sample its interior and boundary, and plot the coordinate function with respect to the fourth vertex \f$v_3\f$. As the colour bar indicates, the obtained function grows from a slightly negative value to one at the chosen vertex. It is also smooth and linear along edges. +In order to show the particular behaviour of mean value coordinates with an application to concave polygons, we take \ref fig__mv__example "a star-shaped polygon" with ten vertices \f$[v_0, \dots, v_9]\f$, sample its interior and boundary, and plot the coordinate function with respect to the fourth vertex \f$v_3\f$. As the colour bar indicates, the obtained function grows from a slightly negative value to one at the chosen vertex. It is also smooth inside the polygon and linear along all edges. \cgalFigureBegin{mv__coord__interp,mv__coord__interp.png} Mean value coordinates with respect to \f$v_3\f$. The colour bar indicates the range of values for the chosen coordinate function. \cgalFigureEnd -Interesting fact: All the coordinates discussed in this section and implemented in the package come from one and the same family of generalized barycentric coordinates named 3-point family of coordinates \cite cgal:bc:fhk-gcbcocp-06. +Interesting fact: all the coordinates discussed in this section and implemented in the package come from one and the same family of generalized barycentric coordinates named 3-point family of coordinates \cite cgal:bc:fhk-gcbcocp-06. \section gbc_acknowledgments Acknowledgments -The authors wish to thank Teseo Schneider and Randolf Schaerfig for helpful comments and discussions. To create pictures for this manual the two programs were used: Geogebra and Matlab. +The authors wish to thank Teseo Schneider and Randolf Schaerfig for helpful comments and discussions. We also appreciate the great effort invested in this package by our reviewers Andreas Fabri and Sébastien Loriot. Finally, to create pictures for this manual, we used two programs: Geogebra and Matlab. */ diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h index 3ae808b79c1..202bacbcf42 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h @@ -2,7 +2,7 @@ \ingroup PkgBarycentric_coordinates_2Concepts \cgalConcept -Requirements of the template parameter `Coordinate_2` for the class `CGAL::Barycentric_coordinates::Generalized_barycentric_coordinates_2` with a set of two-dimensional generalized barycentric coordinates. +Requirements of the template parameter `Coordinate_2` for the class `CGAL::Barycentric_coordinates::Generalized_barycentric_coordinates_2`. \cgalHasModel `CGAL::Barycentric_coordinates::Wachspress_2` \cgalHasModel `CGAL::Barycentric_coordinates::Mean_value_2` @@ -17,7 +17,7 @@ public: /// \name Creation /// @{ -/// Creates a class that implements behaviour of generalized barycentric coordinates for any query point that does not belong to the polygon's boundary. +/// Creates a class that implements generalized barycentric coordinates for any query point that does not belong to the polygon's boundary. /// The polygon is given by a range of vertices of the type `Traits::Point_2` stored in a container of the type `std::vector`. BarycentricCoordinates_2(const std::vector &vertices, const Traits &barycentric_traits); diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/PackageDescription.txt b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/PackageDescription.txt index 36c9b78a541..7e9f5cd12ef 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/PackageDescription.txt +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/PackageDescription.txt @@ -4,12 +4,13 @@ /// \ingroup PkgBarycentric_coordinates_2 /*! + \addtogroup PkgBarycentric_coordinates_2 \cgalPkgDescriptionBegin{2D Generalized Barycentric Coordinates, PkgBarycentric_coordinates_2Summary} \cgalPkgPicture{barcoord_thumb.png} \cgalPkgSummaryBegin \cgalPkgAuthors{Dmitry Anisimov, David Bommes, Kai Hormann, and Pierre Alliez} -\cgalPkgDesc{The package 2D Generalized Barycentric Coordinates offers an efficient and robust implementation of two-dimensional closed-form generalized barycentric coordinates defined for simple two-dimensional polygons. If coordinates with respect to multivariate scattered points instead of a polygon are required, please refer to natural neighbour coordinates from the package \ref chapinterpolation "2D and Surface Function Interpolation".} +\cgalPkgDesc{The package 2D Generalized Barycentric Coordinates offers an efficient and robust implementation of two-dimensional closed-form generalized barycentric coordinates defined for simple two-dimensional polygons. If coordinates with respect to multivariate scattered points instead of a polygon are required, please refer to natural neighbour coordinates from the package 2D and Surface Function Interpolation.} \cgalPkgManuals{Chapter_2D_Generalized_Barycentric_Coordinates, PkgBarycentric_coordinates_2} \cgalPkgSummaryEnd \cgalPkgShortInfoBegin diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/dependencies b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/dependencies index 4d1aa80104b..5745e1fc6f3 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/dependencies +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/dependencies @@ -1,9 +1,12 @@ Manual +Mesh_2 Polygon Kernel_23 Generator Convex_hull_2 Interpolation STL_Extension +Triangulation_2 +Profiling_tools Algebraic_foundations Surface_mesh_parameterization diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/examples.txt b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/examples.txt index 27854badb01..45ba51c2abe 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/examples.txt +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/examples.txt @@ -1,8 +1,11 @@ /*! + \example Barycentric_coordinates_2/Segment_coordinates_example.cpp \example Barycentric_coordinates_2/Triangle_coordinates_example.cpp \example Barycentric_coordinates_2/Wachspress_coordinates_example.cpp \example Barycentric_coordinates_2/Mean_value_coordinates_example.cpp \example Barycentric_coordinates_2/Discrete_harmonic_coordinates_example.cpp \example Barycentric_coordinates_2/Triangle_coordinates_speed_test.cpp +\example Barycentric_coordinates_2/Height_interpolation_for_terrain_modelling_example.cpp + */ diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/fig/dh__coord__interp.png b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/fig/dh__coord__interp.png index ba381b2c8274cfff944e5deec7f9f62da53e8693..9e815ccc90713da9c2676aa1dcb4b97daf814d8c 100644 GIT binary patch delta 33276 zcmY&fV_0V0*Pm=mw%w%3c1?Co#>6{M=E+T%++^FfJ=r!U+wOlq@3*%PUDw@JowfH_ zd#xYVK1qUnPJ*oNMg*v3Bt+HSS57nB+==GzsyCN&H`=}oD^xb8ng2*LPcvd22quAo zzyuwl6T!zQixuYtql-QIqC-Li_)|g4+t;ue@txO}n~WZtQCBpMKMc)(DLd0=d?LBM z{5}J6b=}`^Qxp#G+ZGAOqE`)xINYO-p^yv@N(Fz)|5hv$i}C+HQAmm@gvYZZaRCth zWGw#RU&4^UlKlLktf2t{f&Ty>Rl@5qC-nYwc{e}p|Ncn`!*rwVs_S+zu7T4yCowT` zERn33?d3&5(ce)Dvu`Y0$^#z7%XJn9|Nb4_J^xaaX}lqE_IWvLT0C2x&8EAbn~T)0 zGmj?b*L)SgXbQlhchv1O^mzf!BHY%^{FE2VNaSJru)98dJY>R3OHG!QG6g)&RvO}I z6cD}MMn!taFwgR$H*_0Mz2mKfykT_X;_rq?yKWm-&%dy+Opc7iS;ogb);>kB{CR)7 zVDBc`A*Jcr%-+@NVql^FEVpi6w|sUFKPjD>6)00ro9TWUggL>MqUaA~b4n-Mk*jQKvS%M9}KL!be$Z2 zhfwQ=WKi#2c96Eez;AOcDbxD!9!Wq*GW6Bfm{&Zqi?0>_wQh&|oEo$;MY-bh@b=!k z>$@^tLsS?5MPvlWxCD@4M)?tLhlGR-qY1wzY1b9982auMW!Y8hRAAVuhSX5e(r)@Z ztYc$iV}Qiv-ygcrfQL4?wpL$Q+HQBAPlKXDRQ`yr)qbc9+j`A)bvMlo*24PLMm=LG zYNXzmXo7-*s*dqr^+=ya|1gbCO#B&c65kJ@53lulh^m|HYzGSd$$y9Sh(V=~K}uwW zp%H;Ngk`Xk+rlZkYbW(RY`q>SL*=s^97!DQdOl|S%nIJ-uQn3%5+IQH;PLBTJQ@!3 z>(N98ZjW|v=%>=rB$8TV4*4LPDXTvv*pUu&YtV~!8|iP8K2T-gj}?W34D_!N6sH z{^nrP<1hzqb!8=AfdQP`IHZJ0QO2!DEhGTO7A@Ff1jAPp(ns!4c!+S96 zq@kR~pvi5~@L0?iE-+R$|GYo7D$~m9GVX&d%3!Q&0TSNSOs{PP=IRB#Tn*jUNmEnL zLxN+V`OZdGyJ4B8AbgDAU=sW-M}v?L{iQ7780k`TlaP^&P}Q}xy6(Z5^0vD9esMcH zDe$-@4m{6hnOj)!zhPZ7e~V2`O(_0c(bBR##;yh2FNakl*OI|R60}Fgz+yXmk`IDp zwG2-K(nM2H^NhbHSn8ye(%bRjp(XXX`1sVlUwmY?oz{*<@tADfEgI5dbJJshRCDF) zpPy4Pl?1K=(NIH?IK^6y6iOp%cyVaN>G6EBnP8+qkFzaH6_B==+hWa7if_*+3ts0f z55Fk)^*xUUvVixNzU>&xc#0evYSmm9wjlxAPwGdwA;lcmXDI8D+TX`@ZKZF=yn%XyDB6)c`0z2dOWVApL0RU2O&&>>U=tV-$H?t z#gFpZpL65fALhq%R&^GWe}0SnSFjNLEnn`>o}MPPx|*&&F))*3MuI*PT}#z`rVwpA z>$xpVq^aw>4Or14$yuis7vO$R!Qwa~uJA*6ID8>OFg#m(y5>Ddw`O(dL+RpsK9rm- zRA8i|`)}>zO7sxF78Vzs)*BYvfqOd$%=2tKRSjh32@cA95!6Wk;TSY2VVyL{U{-_? z^5H%Lv+OF{+NPvs{hx03!G=pVYW7`k=XudW&){vX(rv0NER-V1SEaykiFwxqfv(62 zO5YZ_*KfzVR7q44gENYLl`s3^724f z@cMC7H|2(ia)z}SkK+%7CaWmFvlUn2j;-0RYyYb$Xq3)Y$_UDRF}^u*b{>Ip74CW$ zaVTf^vhV0UK_)zye^$;;gkDbb1|o3x_sz4s&YzO>T|HD(RAgnt>tza%$zxM>uzoFA zoWH$gbak9g0DMuvJ3pp$T+Y35MnOUHVa;hXfgTf0*n0zxw4KGtt>9bnnIYdwm3{km zh?imAgjYzr%96$fxoqhE1w&w%@@ejnhsOS_u|VYIBqt1TZA1~dKp+nr*eFk0g(azV zvNI5|KbduNJ^JCyRh00cA0D)FNu7G^eo(Ra@p@rPbfffB+62us z523Z7=Nlf{k*@|9aY8rUha%*3a0NPzcr2Ra*lZ^;REf|nf2euwVj-l&2Q(v7>{syaC2GKD2ZNb^L#GnvQeOf0O_&!mGCA;gK4BvKqyiry5atJ<* z>AX&Z?H))AY3+L1Ke2c}_AkUF zHSQ%}I#Q~2dHZRJV~ijl&?{o>ua1Yp>rVujPy~UHEyGKd;W6v&wjkO9;cKHp%SFuV ztSMs*`%>52hBllgq3X;P`0tl~82CP!;nOB!+)se4tiW(;{OKU;qZf&V=OHzh4&3S= zHoPuc4l=zy-X7BA3;oLE#F$KTeO`OoggdSm_c1SWOtHAIg(p!o$`lA-el$E%2?5SE z&Um{`3ldW_voM+v%G8j>lpQV>H+RnntP@Rnr#1xB;(MLlarT;9x&qHb0nK_Ts9#-k+Pg-YPhR z^W^IvHawmF;afCiKBBAP+!oaWxu5%zG7g+wsr&3$pImA*#E9!3|LHJ9UcJ|D?5E&QbC-OKc|oWp0j+I4hvHh_;emy?CWq@*nOoiLX6%ihf^qjxY(5WuB*uR+xht-6R~58t-2^h3o>7n`ZS1n zGn0`r5*CW%aX-3ylkQvavtKZc7z`#;WvcOL&>_@tnq zz?D|f+>A%Z#02i>RT(T3BO}k}Z5QT~nH|=Pl@k++p?%~zIK;WOkB5C4i{)0$ucG@z zVSx~5+^XbgV^hVP)0YF~RK-CAmYAXU{s~_lM1GLr0&G-P`2b=!XZ9ymBko)1fP@>A zS~4hkWw>>ri6s=<6bGI$f1St2u8+6Nt`B{;gN!D9=jno?^q1XGLNzE(pGzs{Ev)QiwYEUMghMJmMrdYDH za9-o0^>U=_A;XoaNbeVMmJ-Fmt6!MED#%5-Qj*}!!IlaOquE2{Ya~jhwG{3xhF(1M zG;s+Q&CB7__UO9#ELM|Y56kN6kihj{(r7{OVTjVcU9qmx)XV8`>mz-ywp(xI-f-WYQ&U=RbGrZoKKq*Q3zhm_>n@A`aVRvw+bJb5y6pB^*mn4v zwi9Zp+xc=or*YuxHOHIo!HX!2BlhGdANDc_&DnV-0P}1Fcl#(91qFILSOZPcAkBd^ zZPBxk%cnm5HbQ$|rV&c6$|QaNP)2hFiUZuX<*Lmriaw6Dx(phQPiIt9+W6}q{yI&* z+pg4=72@QD{Kb%*bZWbuCE5Jy(#w-wQ1H(mj>OW+iWl7c{tK*G~28R%8=s;R44gr*- zZP7)#F0B;k^?5N}udav068T8YwTJl-i9o5+vMjWcY|Y8eQY{CYt0%OYo0fL>7iE-A z-Tok$Zxa5N3Tw`0BF5qoEO~zG`-D``83B^m$vxHPrJOz+Q9b zg^4MZ>kTmR9I-gSS^R@M1j1%tFdkXMO~W^zcwG5NoqanzaA+SlJnh*mnzc$@1YjqYsF8c_z^j+qG z_nVb+Z8&DbP7`n_wTH5@?i8GyEE20~x?UqAiAuDzPU|ikVIgv=!F4PlEF_7rrPP1@ z14KSe_gQ{J=@kXgu*A$R(Y_pLE5b{j{d`+BNk*pb36@^R;$~yrHU)DC-vbEPH~C6%L&WhFtO%ATnvk zN%}yfWi#$hzNmBS(|$UUy+GtFL20 zCtK#+@j9Qh&6%~o+T=YG^ZcE<2aX8sunBf|{=GtBa(b{trrYf)2 zuNPiW)cIpzrUbl zMv!Tg3Bn68gv%itLppbp99}<>3(nEm+uL0Ypa*uT#@kS1S!wHcOXRxst-XZ@28x zy!&{8J%0beveZ-{H|P3Xe>FpQAm|eu`FNrd;7Cb&;_E6pct`wrX8U4+THAd zclOEGx5wRR!`i*%qAcIm%1T8r%b=R`KCu)OT-5g(uUmM&`tadtun8(%fjwuH%&rK~ z$P{}e8d=-PmkgRGXkPviE>BLzoXG~-Y+uK5# zrjDgg48PcYVKlvJUnP8y?qoie{Bsqs?OJbjDLZ9gmJ}P$uq+kt*qIq6U2iA<$YhK| z3O_9!A0p9!Ui|7qtqGr{YM1Tj*JH1#llo^xitIJ<1-7`T^G_uVqgY-X&+b(W5%VJS zC~a#$&s=pBG*Kg7CK-<1akLJQt=EbcQO; z>D2XQr5aA;d@~M7To5OpHl^cIV2dOxIWcNz+E$W}PiVQ}#}OF8gV*T^uH)zHZCWe& zs`rM)VJ;s-aHLP`!lXhwz{NonL5gbSIl<@zf=ya?qYa;Tw?tAvOTIA0mbmulLz@K> zB)zpsvLmZoAs%9Y;yxT=ph&6Gs7J23Kzg(sYW-W?+XSP7hM$y(4xJt&TEgMUO|+U(`DSeuSu~|NL-gVV zf1LQTNN}tJ>>6|#2=tukeLV~=`vzdO0Sp%l*^wm9oe&z{`i{L1r#FRsHrv4u{>@P1 zB>@}sGRC;54q!nwB7zd%8-I~_G4aN{B_C*Mi=SXx!3S6mvm)M#I*F*;1rKuuE}+tj zRU*W@n)ENwt$3?4=J&)pu)iXkzg|U0lX{)jfQ5s{m(46&OUv#b6tQ4wX$cdFaGRDF*KC9+IvZ|nK0#T_>D6zem#=CD=4Q2bV#LyM|2dk(Jf>h3UmMJF(MXl z$-tTQMA}{54N>-uOx%TkGyc6FLP+S+hOYU|-@^fa4cRFz?PY@Rq$r-|w{DHe)BV|M zfdYYeSb2iJ7?WzQ&+YpV;C>ZVXDGbg-G@|Xsrf8j=5>yt|J6rwL+1%zgE^i#i<^g7 z6{@8VfE;9wc*FVKDr<#a1H+veiNJHW9zCrKy-NX4+}*8~EXwV_K81F?UXS8LNaiv#vKYrqWl(?A_~PQ)m4Fq{7v!&|snVUhEQRuxgMGZ`+h3m7!gF zL`#VpZ+894`~Z_6m1-12|1}YSMGUU(khTq@Cj?zhx-N%AN6cz!e{&tyv{z}%q4?<3 zdl&dv1!KjEWI?aNodIF6dc%?cg_&DI@H=qY{ch+HlQKEK5C?yH!~3mb6mZ$@T?GcC zioaBsqQZr?^JSAKhh zhU&2Ufk6eWHRox3CE~Al#nY%sg1dl7Qji(Pyi~bC%OA<2i9Uep%aoXKu-dTiZk*Vn z48oo^J2XMp4#ShEw3z;6&X=DU*phwp`!-WtYy?95RpG1fJP^K62lY({Vg3k6IAbpd z!XHQS4)M+eB!25GzwVy~S*p6;j(?nI@cjEb?Mh^a6B-^D-~sI=z@&^#owxyDjTv|( z`O91tI5EatJdEAO5cb3UMVYwB2K9;D<=D7lBZ}GnIdO&mti<#ic2Tcl`pUTB`4TYw zOgrw^XN%wHXRG5aM|1=G74VY9&Yw}Pfg>jSCJ z7_x<3glUTz)^i41zzdeBT(*I@Vtax={jVRbM^a`hA}N|k`3`vmX7Un8;C-wcyT=l9MC?ku-WYd=RF zIz+;AZQhMnJ<29i0V&`NOu)+MP_cSt3|Z3*Fn&X$pNc#JIRIU2u6M!mJt%vGomz0Vi!45*=SiP!&4Q;bghU9 zPVOLlB1lZ4sQZh~7cl7)az82nOfA4%*Y!_A0^V<_lIEusz;e^)MZxiAB{w|=H#+yA zjZgn-Z8RM58cVWf*~T8sN@%mZZX@@o;1Je?1ALamt5uQ4) zh^jfcWOYFi2>kqcMidSEa}tqzLkyCUcfySG+fqJkGNM)w6RX=~<{u>H=B?tqC_XTW z>H2v0THd8wxc+Z7k6VFEOiUK(j)Myox*18&U}Fef?e~9VAJ@R$Sop34q3kBSj78tE z;SC(u`Y)PPTX!1JF9yge`UXT0qPd|RXJAzipb&t?*TpuKur-L952Fu7R=#qLeo;}k zBgoI7#~8)1=x~HBwD6FgMz@kr;r77oK!XKb_Q1grbL>|4?F+nK_JJu!?dM97K6g#{0rYGir7XdOrx&iPQZv6IPQT_%Kx z24V7zw5x<5G?G?4+n($mtIO}W7rfsyRx#fsmX1v*|GcfXm-={gz4Z!iT|t~yh34W>VL}?S#SSX zfR;@wPOdQpTK$LRBPgo2(hj&R@LA z*1G-U9S-M9ve!{TQs>nm;n~@ls`czivhrB{S5!Lcfp4ralL{6(__HH)lV_X$sG(3( zN6sd=5%$3xTwLbn=B1^;u>%hX1iEJ_rVpQ4T5`P^Uz|v5+OBN-q@Jk$ETvX4bUw&J zj9P_2RC0UVuFcK2Nu$KK{;tSK32&`}t0x|HtBfd67r;#H^3q4tWjhoo82&evF%o4l zQaL9j7Zf?YucOpTU>EB2{9OC~I3&!hU2FRO+6R`b7VmG?^fQ3oeiIrE)`G|cvcjYi zh88P%MhkBkN~Z=ZL45q-;b9*iAHQK!1{M}v{uT2&L2$nPS458I%fKRMjx?#yoDJ6n zi?SM4L0#Pe*ykBby=w|3p-`Ch*ZA9?pb$#i)!zG;u|23w;i|^t_T74822$VrNA|H> zQ5hLa|8GMg0EcagfK)P^B&W)(-;cjkYBNk3z3$MzNC6b8&O>AuaT19<%S;+O7inE^_<6%@~*# zi@kBBX2hZ1A8f5Spipn029MiqZ=|i8_Vc3SK{12RYB=tP*}2`4?qlPs-GBK4F3;&2 zWq>BJ>yj}zZ@|Zt{t_(0*??2~Xr=&MGSA;0Hc20qD;rPHX;ND*dXa!>)w}+P$r!Gc zH^&^muzDu>pMgm!2^T3lN1890^yaF1(}meO-=3pNP@{+Z0ziG2f@(IMk2$>$owUB; zH`c)!JsuryK|AkS*|7J)=So`LsJg(_E)(*<@8(OW9W@@m5YsvPNUHm3oVN}tT(SdE zAF(=vZ25>IaF}%3A8El&mPpXEzA(AC4^L|H?ah9ct16Wbk+YwfI6U@%>##__!|XWU zF;`?9)Ua~qTEtA_ODAAwUdKyKEm<@R)1KUFEXpxjko1~+Tt-XMmRZj=cLtnK+F-{W z-K?CmK@UNo`uwfXfL(F+^-aUqBS=N96`%VS-lwsEEQ;oeAe%*idH$`GjKz*zeono& z`E!3mrZbx!R1yzS{6dA-3ph8@z@)kD{CPbDg)ju5M33zv+DIBbQ`ML^Vg>uiWvRbN z5$g*I3mL*O#&&yH=fcdn05IMDr>Q@R`Qej1W~0vNEE4TCD->{5)2BQ%P3yN&?jPDT69q_`Fjhcr(h5(^K` zWm=IMVTJ}f%bIJ`-XArvJZF7aVP`q#(~Xfl1v>S4G%{X-BY+B|B^2e z)eu|-OlnqqeYefpIz4vo;D*P<8bCHXTD~3{ht53xhXT~Xs(; zeVh(}L6V9l@fZNGwJLNP7=(p^=H+}ubrI^$xG5jmudnEDv(qU0xe#c=&yS5PneO+l zU+eH$`3qJfa(2TQlmrlLc&9v=4ADNE??l%^=eC;jkk}v;f^chlGnTB73vzUg=x0!i z29X&}`Zdke`D=syxd`{V9UYMLVBplX7WG`_HPi~_bvgm>luG~&%#KkWMn7ZP``aC2 zoVDOCblw-0eK@jFN+VOH=E7`3g%NkqmYyCGt8{(oF}0zB^Qpf@*Fe{I_`T{~vDizu z0#A-|7hxK2*5m$-l&X@~R+SLX7*P+RE1=-z{;pF0Wh4M5l-Ox(CzQmqxS>G*e)k zGFF@Hg=sEb^MId4@b!^?Jx@->b_&CNy_7B!9=JiQO11>ii|QTCZJmd7i+TQ9WuVtX z!m3CYVhT?akhX3lw5}`|%nq~*;<92Ug5&PCVl8d;e5mrhD{FB=({Hp{9wG(Srl-lL z8v#*;wNvg5&kM9B!@GX%V?0p~NnIv8Qn>?jghK(9f1Ju&s}8DAT~uNyG>QM zdVHKUxOn#4`o0%5a2xn8s97XOr|;}=I=NHnd&-y8ev)_!Q0?fk&`O9t7*_W^areg}ft-Dj z15G6A{_yFt!u`90O1+yV-g&ZiKG`V<5aF;cUL1tuqKRp2s8D_8=bRoNi-Oen5xZ1vbo+~IbRY&WIz8@kS`#;buT6@32d$TF;s5Q zp;K$+E~bEPyIWXQCFu6g2a_O*0H)O3g#k)C8~Ifp{~R^aKy@8)4zR@&c={(|aUGjr zhBhAdPjM>ydR3fYS>{j;K2o&k@wq1#Lw}0Oin{P>TL&Z3u_{L{d)yLgWR&rzlarbF zx^Y>F?b_}9nN}uHML4bZP{;Zu!T&wppTrT4Pbo`_Ry*@b8ICUk&8%=S6hsw{9xxCC zu!RIfvf`Bm+12ml0FV}v#2ngeCklIaXEXH(mtj&UaNdYt^jp;f{#$`cLTTzsgrcsa z?~7+r&H#7;d{{#@FuE}&!56Bkk^dQH(7-Hf5ZF6xJ9&6Ljhyve&}d*q z@q|l`f|^5F7ePy{W`*_rf{CBWj@T|%8f{9N(iA=(swIDGruJqiG$ex-!&5Ak|9 zMH`fF48WpKlb22ugDmNACV_Tz(_3lw%9NK+hngDFr{pa-BQN&+r)u$JQWZW;tOQAlmvW zM{tNH<7gF7>`7;5Bz;7-$|O4_S6Y-(lIz@(2Gk0hjPCRM;`4-T!P{K~CHNE~jmFH0 z1}#J87U?FiiwEzgkQ$mXAu#M%-oxrqY<>c}c6f1QDwJpF_>yc?1k<4V)0W5A8_m<1 zU;9(l|6VUWm=V%?N6V2-(<5kd{kD=;30>mtq%RhX6^iW*I2%Z2yc03En8LW_Z)ORc zfigA?Im{!Z43^j;5o*aQ@wHF%0e^VzMKQ~Yu#R^&)MwNb*u{NR<9vIA5X3P+xiY4B zZ*wN-6kn;Zrc+l|G|TmPZQq_p3vWZQUxZuYP56?IYd|zKyFqf#x%8Va1{GOI1Id53)kD2bssw|2SM@S^!by&^ zordGU<9DeXRA(KCc=+dmHpy0?)h2sGuz9v>--SZtayyMLwJUS7Xb8o(7ewOY9K>3zCdM9yF@6V5iS+?pN~54TPVzp{BltK#&mL z0IxYm@9Qj)WmIslDkL$R_0!o2ACA~iHiI>yH;jB5*YBLA&sr#qju_*Es&JNEZ=rL{ z0gD9RKawn2a~i>>Zi~}FW7C5$m7&kSMD<4u)p+GQC_yI0VYlTNJMq66#6RaC(tlD$ zRZ|OceudF6t@Lnx!?CjKlwFoA0lfWQtPsz`m&BH}WzqA{yj$W_v-xY+qMTWS?ChXj z)=rxlt+ivIYy+k1Nggqh*)33C%HZAS7Zy_G3&X?1BO{Rywi0bu8@0dSu(b>F@_K;r zYgk#yy8G^L#ax7=V8b4{6y}O#r=H>zdsti~J@1o+f8GZ&uQc z5ZbrLCM00FRLMI_e9y3}1yJdx8k>xbm{s;gR@t45*3>R`>}K=(@ zaGa8Tl0Y)^iY4X(2|P^uK1Ah>CI_U z(1H~&O6d8}C=(-)23&NmU$@zgQeTvd8diVuE$Z1SEz*{)Ml?vSNL3cGl!u8;MzUiM zRP3zJ=PYcunMH@sV6t{?Ao|oy&#CsUhp4oiJufk30qM=R+Bdi51*ov{XH#)WNj~5g zhN@D$d}gyc*tB`whn74pN^cDb+Vqvv*9YPP2TUM>^sQL&$~DW%+A5lw9;T&9J1%>X z0#hsml7$+;2lH*+ZPUf2>>u5lkSfwI(^h5q`eMg%O-8)r*4RBe!6lVcdWYQv6mh~9 z5)c8vg`Ba0*bwY;6yZi8YjnS(dA`jzv3Z-`F{1XO-f2i zbC3|X-CA;DqRWzT=)hSlaiM%FhgDw)N-!`mAcmk@S=|{YQ?ep8?iTh~DApKZ@MrJy z!x*0OOtD`IR+GHW=gnKqvwYY1^M)w>S8S(>80kOzzvnnb96v6Rv{I5^=wI`#nA zq$ob#Y_v^te~V!0Y<9oeF`BCv4FUJWJVr)Z9BkVVMfZ|`FkWU*Dr2K8>>p#?R!dt7 ziLKb)MX5@QU$YV+S{KQrP_s%a6@M2spbW&VW8^4rIU=fi5{RhZm|0xQDA~^=)abIV z?0MUWd2Ytom%9cmIShR6=DF9MXMthbEIn1#pWvyPi=~>~5JJ1d^Yg}K8?dw%O7!zv zOen$L-YOHnE0)bV7r`8Il0_ZKh)7k6R;6Hj(4XzXLbFy}8eLWnG&)Xn8@9&y-T8Z) z8#d4|uu>7yE<$YMDYmScW7k*BN$%5+fDbyYrt~g`tsY!#)g;4g-MK5|0}cZ!U;|A! z2$nDY<;N?gf~R2Z?ZJ`!K!NRRcHGSbt7Nyg&RZ ziG;|7oWXzlDRakwm%Nk{8V6ydlAS2fgzg`(B3Y=l3f>)-)w)oQDktPa7P~rETI|Fj&OBVO#QjUxv>I;Zld)j=gM}vTB;IZa6^xKn+wJq}Mbef@vFh zJ#-X2%Rsg$7x9Yi7NN?*W&S9U+fO}?ttiy^+-zl#8=a>MMRDb% z0(U%mZ}T93;PSL;H>2_4rQ_eZHAM-JttwbZc_<&7d_I!DL@a2{x=_S+8_Q)J0V5>J z_>_Pl3FAIx3Lc`>FJNlWmSQr=70ZbjHI!F&Qjn4(NlrW}$0A~l^7Fy+0+}jcc~)%N z&<>qU!oYPb;PDi&<7wnFTB_fL7?=tj?%Mr;=lr~dmgCZ?>MV?)bZ?AY!%AuHDC;@&Y`i(R(=89f~BEKfJ*C!)!t~pzJ$tm7?Y5YKyK?5E>&rQ9eVrkxoKLT zJCG);z2khv8O7MdIYsnE6Yd|gYcW)<9!M<1Q*XkLvq}t#IurYp=4*T7zstn$jJ2S* zJr8(6X28Mz8)0%l6h^WbZ7Nd$iW#&M$GM5B{NlG6qc3B(?hSqG@W_D_u5hwUFe#=h zV(pg0bic{DCuPCm=K13BWj=!ZbEYqH9!%s(@mkJm+fs zrE&BlOTi?tLRdy>dayj-5A0TwzhN4CCxzDBB9ed3UGHbhk{YJe!T73Kzno zf3O-}_-F++UvKk}U4-a`2R@$k#l)swwxh-ahm3*>mlIkacClmAm}B3lF?j-5uV8Y% z0OWQQ*3jamb9DcVi);4fM#%0U!|&3Lb3WhyNm629W+r)dRMHTg-<}F?Cc{!TsSbf1 zFS_4`BPGt~jz>w1*~!hLCn29Or6XL5=}Sr5zm{Il_ZZ|RK1}tl{|m;tTArz3o*>== z#@7(CLYzJ<&|<-!PG_;(CYGm^ePjawqRCtJVvo6U5|geSD_+c3PUv1bDBPjRAs5MY6tgR2Rc`>3`8 z^@w0f;U!{2g-T+JEOalLij}-H9+Ry)o%%s#e7m?@X<1dOBA>)yToCzc7bIpqFs+%g2$ZOGeb+vwhl3cq9OHTWa?~;JZGQTyvzsGSV1;kP-wXK zGurVej!d9Y5=yJtfU)@JXTnxMFw!9~i7cszTj3i!j6oSvfQ%A*Jcjz$Q2IlrBY5i> zeX969o9Ua9BNHukk%ZRU5OOvjHNjK=jenzB;B)X-EWjAD;p6o{cs70&SVN{L_;K64 zK}b>7H-0(h#4Uh*NHtm~rdDiaP%|%{8iqU&O0giDnPni}o38hdtnL|rx z8G?IeT~OUFDMSdID|69SN?CkTqM%wiZp(`LYj}gn{&rRWC1)vfJ;&?q%t!{gOcABE znbW(&JUL9EKKIL)FA1Lj0@VN1>w}EZtuC+Qkm+jzUXxQl0-~D1 zpF<7e>pKHTf%fP$)KvIE4nLK$3ck+sQ4nj~Dv_{NuNFI0wrBt?WiclP!r3C+C7FV4 z{+id%-|o}5N^;@tQ>z#PXf`S1Bz|S51aza!5lvx*Phd-ZFguwt@tvx)CdroPW%a54 zE{1#wLcnz4%Wy76!7TQ<9{woAaXF^REd-t8X}KR6=gawHr4Cih5!2uxx8a)&9R9Jj zCNBvSt6I9wD?|XWo>gYyzeF#eewkoHV=Ww_Gu5P3XFQAV)B%f)+g9}WR{Sw`d ziN^`5&!1#v6ZS94^!|A-K{sV1=}a2bACIF8 zb2(HFEjnr6)M5f1uIhtxrCdVoI)hc{j_(gtf>H$+_KN^typn)i=kv1b>zV&x`-}yT z2)O$+-bZEVb_$qA4n@jAR81>$#8@Im2Ix)xvXFwJMl4O^u1FLx)HZ*iyH703=`*IF zG@_B-^^3ph7+wwB2w|uX)sRD%VQMANj_J9vtl`Yrv6nAq1MQdb&gs_YkS2_aHfM*S34u#-gY zAz}5Afl#CCuYp}3?7L(7l7k!WNf0S6{(_%iTh%`XIghY<16J|pPVVA_`k+B+ozLbb ziq=0zy6bhJB75{veu|WOp@zmtg|{yhH^p3V0dec}<5-U>{W`-pv+?4r(^`RgZb$H* zc7D~8y?=8!C5^7ac08=>5m?J5ey5~Op=K2n68Jui8p_@xlNJlUhQ35+a7_LD>=Sw| z;LJf8={mWsoE;I_k?^&;(@^w`yd&yo6(|*Z*Fe@M5q*jE@wwuLvzG^jh@x6Vm#)#m z3HaXni@vs0NlqO*dr1lb)>^rai7TrB?N}r!HkK`&i~<9y_odgYk0IQoZh6eSE|)HR zG~MmW*6_cttko*mW#b$=Sv5J`*~-aiy?l=(ml!lNl4Xlt0^*|$y>I>oac*pbbzL#R z`RkGOF?%V4+l1oFE;H|!zOxeU3cJKivnaU`5eeCFY}i`Gs|zBzF_ z+wC;A;GF1CIEIHB+v z;uDP@VQm&nQrZlN-Uxb*1K6G&zR8jZ66}?%o#o7RZU0TwVl!&C-_FQwdf$wnRCS#T zJc7S>{uqkVGW5Coqig5!d;}CR;mARX+V+Jg9ZYJapsLktHig4YW6|Aweb)6iM{IAM z;TyhAOg1MUu3K0?v+qEGBHmK4KD?+Qv>b2^#nU)Nv~FsYEF_Y2gH0rWD<0@dNoC@S z#o|9zl$}vX=W$Gas>XtmYig)koLRI|QP{82W0ZMj)ds#TDQxs&~PsCzI8Lu|^#-kZqHBph`_1 zJ+kg4x%(34h&Wq3aFUWaN* zs&cWrz~PSu`$|YpQtE^}uHV?#P6H-6`kfx^bWF;q5tbar&QV>9Y- zG{eigzTtiT3ARB3A%gLxY$>SyS^*Vxoqc8kEgSz14Pa zu!xdUwDMZNF)^yNr>Cc^tZZ&_mZ5Kp)dmOQv%li^*!kG)0(8WRI%Vu1g7JSP7*Qt+ z#TBix`=ht5q`Q(-4f8anR0TmL@I<#*ji%C5F&H3ycSJ4eeuIpAODNj?v7_HFGz|lO zmioY@hvdL77$h9BfizQ7({$hGBkP6ol&@y88XEJ&ZfhzU8ZKuIi$Wi-H@Jr0R~lOS z^Gi$39yj|p6Z}=x)l5o|u{O4!kFc?AfM#KcY8eIJmV^!H(J8c!}}T zQ4<7*+7C<jSt6~LaynG&Pk3uokQL2wxEoXYv=B8@>_HkaBI?%ubY1?4%8 zD^K0S33*PFRkdkzP5SB8cU#Br{8!~_E;zCD)9>)BNJvhT0ypvqEFXF|cedY-ZPT+G zuj(ezQhpSQomiCJ9L1`1%c~Oq%e8J?EU)(*xnzTF2=<;NKdS`JU4Zk1B8H}X`M=b44eO7|73!bv#W~Q~F(0jB;Xx;pVH*x$nqNLS*_vEU<9tW7~FjTG^l%jd^IA1UplgTQBC&f zVRCOyZ9l@&T-B9zLaSM=dFFLB(Tm=ed{cOOEdTV*hUk19;?rG@`w*5T!e|iI(%ZwzhQzHD-utsh1FrO0RYF4nAcEiEnJN5FwHGS-oBvgtN*3jI*@iT_a`^f6AC z8{z5XTQYF6HME`GwaYQvuwC)n`*Km@Ur z%tvy?ZYNq&s2%}`>ZHR4W#wz#i*ld{uM7RnpcMcU(K6_65%W)~ISRE|e{?18z#yiq zHwb~~Gj4EjkFRch9<)X`_;MQpTM+l0#GSl4{C+r^U@=1I3i!I=&zFle;Xp*18J)lO z)Jo06?HCnlx9gGD;vAUx243Q=I)!%$Po$Xt%1Nu+IK-~p7*oZm)R#c1fBSw-^|1V8 znX?3n)(7)M7$&d|QP~7(vzNBjjKCGJPlsDo@+3$3rDU1yd*HHTSYe6J&7GT7@cwzN zOa{mY!^aOwpZmym&o!35p4PA%qejtCv*?%kGhzsz;jBc?;&OIn6~w*j3cfryYE2fQ zn8y^nB)tu%tvyFOAMv#Bm%+YevoJ4SQD*?tN0LVItUqiwowuM*mFUowwK8Hl3Vj>` zYS2?&WpU92l`|tZi-U2!)YMLGD54QOiwU24=$);Pm40EKuxQ?>n5RlMi8kH(7Yilg zm07Ui_nHqD++9EV6@(mJND=mZkk^wA1+xu?vXeyHy0Tn3uHxJzf3mK1_%VcJ*(v~T zJ1O8fpT4DgbrH#;h6B{F5b_ThvHz8ImSIta-Mg1=kZzC;=?>|VZovTrq`N`NEgjM& z3?U3iH$w6{W7i$dX@hSTO=H?%@a)rJziC}>!Bl@emtXDlf|F^(5R+Nlt(nt(bgM# zwMi0_+vt%Lq2HkR+kRrV7#LKwnyxEL&E=Ir#r}mmer9IvZ{H^48pweePS7sv@j$4T5gI!JQYA3eKo z6Yr5xC|$X8yIEwEo|6*6&O2pk z@^_$_8`_byWM_uTY7|r-g<%TBTs&~Z79Z3)b$o4ZxJ>DG6X9s)B+K}~YhrIdiN|Zm z(84i_zM?`B>+!NJg5ziFT7}2Ujlir?p{l@!Y65UyCPA(iMcu z;B-T>A)v^bo&1vP?FpAjX`fU5CdNJ|Fa!NgV3_e2WT!%0GPV-#d!C-@uHx~{FQED{ zWid%1Qxsn~!!!rj3+l^Vr%SaxVt?E9Wwcx*$$2Vw2(@%e9ac9@q-9XE!@+FVBLDO1 z5%iehDP&*viTaQ443=l%(Swf6PBHILZ5=P6@_ahEcli@G--?%@IuT?w(jq|+YqoMV zu54Y80R_QXDYV?RKwG z4dM5R8s|;2xkZx7B1=kRc0Q}qe#HHc%Z*AMA2RMn~{(5W5J41|5GcF%y(BoWDjJ33KOvN04#xmgAm?K4&M&^PH>|dXh6^xA#o>z#^Eo#Wi=HVdi_|}G@08Y1HBR?4Z911{Z zAe6`I!&k80c1oYGFq6kvrBjU@M{4#638p^lh#`L76(o1vPwkXNQn1I}<1*AWUXu=hpw?J{9m*DQjJ`u@fn&=m&L- z&ug#75AR8d__rlF62=NoBmAYeRH6)#u?yNk1S}D3H1*;GNlxJr!OQ{$@M2qGvEiPd zZgE6&n{SIKEL>W zFYBNtH);%(>cJexwd@Y!SF zcTkI}#D7}zBzHUu4v$}$Q$Cgd{_Wesfv({^mB2-JWrMfbKR4Te0`*_LB>s#F zKA~3OuIN;hI4~D5AY+{lQvW;%Witqcv%#sI70nO-{VHwF1k*oC>g!Gk!G2Q$sgZ52+=S#dF2%A)< z&(d80_XJ4xBcr2F+kFqfc_TC=(hNY5|zFjGu>~_>X5~QG5 zsQOECUOHXezp-pH5LO$5By6PRYJ86Wm=k%61dWJXQqSe{qN(O|N}6eSbA?H-N8$uF z&0Cy^29`~=1ndH_A^R=yAuK@)FWue!IRDW-ov;5LiCp2#xrVk7=-#C0uawL_Oov{+ zfHd^kQDoa@ep#HJnaMc-GkXGsV60+Ek3XlA}LiJ9hB6^8aO55wPE@_K{%UY|gud$wV zNEY1r;-8`TE<3S3qvY5!FJ0KKQK|WxF_|&JQlqK$!cyl`wf)EL(5+>>4vMc-{>)u# zd8M-mO@5s$NQZ(;9P+c=^h3~D;9maT-&F~P@i`mrJZW6IzWgt$?zHbAsS~rFB!)Mv z$yRypV)%$nnZnRRRv5WWM+67l^Y>!3j)>rmuq&RbZ@!2Mi|iCFtp{9GwwxH}rNvJI z;-%u1Y;{(jxiCH!78^P5Xi2(w+$C~4^w~50*)6icq{E(#d%zRh*w_d>#@r7dio2~K zJvS5!%gQ)pWWbrVd<)4zFWud1M{PB ze&Z5Yp`5o(lG+EZfoD&jQX43yCL|=x>dJ+V!$rF<$2}^6|2d1_5=1tdo#!ioSskQk zfs1%D!G>0TZeJ$%-Gy^iSrB^MCb15H;(H zSMz5}50wkA7@470DPc&BRu-=*tNzdtC#9ZGAWU?$U#cMHH8O!&*tVxQ`Lsv)svmWnVRYig!P;$G&ILY0^iy^=+$#`7g5B{-z)_rP;ZjUjM5 zRgK}`+PJf*rL|%D#f(04C{IEKZn!o@8f+AACL&t%O%jZoj!JQMx{n1;?#wKo_EiOG zZpAB@P06+vMc`#Pdp;!oe?EXGOM*5-$jje*nvbJ~MdiL=@=yQsJcWMP`P>4IO&Uk?4(J29xKsb|jVl;avpTMn8gA;)Fu2BhPg%B*6t8L||YK4Nz7 zg#lL^JoVnKv7C-ojjr=CBG^1sIn!cL&UPeP6kzJpL{Xd>%p@YK>DuW;@H2;Y5Tv7~^@1 zSBgac;P)q*D%fm#Iw}tgaiK*M3%7Z`V6arj%lv8!qh+F-jB^2j1x5@Kz zcAwK8lSV0LDn&Pkv)Z*CHR&*8-KWx$Q6leVTzX1}-FtTB9r_;x1-7QHYF0iz!xnPT zUY#J6{;L{)F2Ef5L{X=zlAVWsyxGL{o?j!njKF``$~2=~tNe8?e1Y_dF)Whg zvup-9gH26kBZ3b>XBH13PW^LkO~qJ%6&Dz|Co7T$P*3iLWaiWNp=c!_AtvJl&esn!I`cmzX)EU1>2z`IpdpMj*|z z49&Snn&!$xS(4_tfQbs{D*`XGuxU{=tif}1x_Ut__4fd0!e$svKDU1L6>a!h$+v-v z)R%o>!N8hXxZFD5{o#8I=e`-7$S5Q72Dz8I=qQG|vI_&HV}{vFpX0azT#qUa= z7Q=m9!VZs**JfrQgV79yH;#Ozf5hEg^FtG;i}@-^X`?`VZxf;4W{Y!$tlW zQYn+ZcTK%NexUI>>lo+5R+5>7sJp&^Ygi1v-lqakeps6L4@0f1=YNFqDt3;l=DPL@;SX7@>U6*V?rC4 zKvhL3(_t}>{MJ?%XomFJB)gykMa6sckM%-wRV^NMyu54=n+)HDrFkE|s(-&b@Dyt~ zn97=6)Hay(&FP8&YQ7HQB(fG;1m=}up|8P4>NQ$QRkDI0(07kpU1{p?y0G__cq=gN z=FgYrdp{pK`=g})_iYQIs4}UxLSj@FgJ}7U$4$_cbxd6F+GBm8Pz;e67}w76o^}6} z;!Dz~&=N-pynM&}dNUVZQq1YR97bXiw}8`Mu3R?f{@v4 zLTmXxIj_&H!Ao9a6umydHmFlXaxzy`u5c2ONP9U5@r&rjS&J8I*=FeT3wcCvao?+^ z>QMJ6?NN?SWOXBtP7zqdlG@knW35Z_gj9-QTf_(|Y}vO8HToKd-Z%Gfc@y z+7_KF%h6=?&`SE0?&U@5m78A%Zs_)TD*eLFCoN@dZGEz;qyqANdzHrPwkTM;z-kx>EHUjpyYWp8ghe(&X!8F;b(*AbnfN9;7@QM(u24 z|KeOxJEYNVnkFY_tF|;QCX;uCu$jI`0gE2_Z55#+jKa z`qMq@+m%rnLEPsCa19TkQ0i=DwpR?&Q)-Pl84$yaE7dWT1)oNnM3a)RNMxqjkv&qi zYwKL4&bqqXs3y6Ee`LP0CfSVRF*0oOr^#$=OBgT1D>LqgYIUX!s9bSO(_t&1l=5H* zEF>By!}{wk)G_M%uBR2XO4ZuW*d=b$+9S)pJW(QstKA=gI9qg!OSES(-^=$h^JZq4 zhGeL6=oY}}8%bL^`4OH2hjXV(k|-m7m#@J-Sk>S@DV96`^V4cAJ%It2#9e5I6@H z9BxBQcry(h6M|m{Vj=q|%ID3kG}?xtiU^t1gC`R_Uk>*zu;@=6H7t4f3UPxA#S3hm zUI)jRl_Axxq*gX^ks@0l^~0tSoq2gVPig6DXvoEh(0oUsI`ndo8|L`3E~}FoC+=?{ z#R{`*67CgZrB1M2(*0TT7rM7$1+`?3amR{kh*UU&o>@RCe>%JIi+wqPS@{jL^?uKl z%|<|xQA7#z=7h$kEZ#NoJy%_jm31g zv{wjxQLCF_#+P55IRelL&xTjsqMVnA!=7^74q%?>5#$ymegDRG3jOW-m!JL6_7`i#KDSW|!M;1y6l01OR+z)XE-X9qOan|S=4UtyY8 zL$n^qmX;)XX|e3N9PFafZ`HMSE4oe*_>A^8!pLx9Att;TWR%;zm@I~!R}2DS1VKHx zgp^q-Rb-t6hs;ShZO+Bb(}X*5MwJ$VpAx(#V&h%98TH>y3q5v*`xqJfezAxemlr_m zkLk`HhaO!EynDBQc746akg2l1{fYl+N7lA&*WdUG!?4m)_S|uH*UOoi8IbE-sVF^J z|8P}NR?rU8Sz@kB_ovPi=$zwad0#hj-6-fzetkvCNHJbA^S-m`aE5hJ@V>l;k-Bx% z?!NJEEZVnNe>&Z=<&`Yc_8Iura^-3T!y>+cK9pfvD(!X~W9WLm(wH3Xzf)-jDJ>2q7{uvbn{@ zNw}zHa1H3v&Hxj|b-nX_SJy3|Z%J>bC|zSYFwe{t+^h;G=3u43<1OCNt}yXC{%IoF z8szbwI&Ai*pKi2XEfRxP2-tnm9Lxs?j*8AcAqR7~WTxHENGp*;^6GQFVqe4Y`0mRd z-_Sd2wB>VVFy2i6hZ^)BXprZ{Moc#dT>|l8Z2d#(Tx$W;T-Aq+xb? zAad#jkwU98Q(UjXEKh?%C3)A#$m6G-FB(K-uI7KzTVda%=HQeye*@dA{~o`Ok5AMmgMS7JyH8of%7Fd@UjcBhr>n38 zmL0WM2R-P<0yJq`Bccr++Vw51v9;D_H<9Pw<4*am?TyqV{4G$)sfp!tcT z^mc_ZqW{ne?-bw>=K})+L4EHz$CDSH8+ma1UQ+CJG8j=67^S4T0iD;(QPaTP^bcfv>x#n4oVs&f5dTHHdYX#IP@B zrGwG^!5t0!f$pbCPh)w1MJ}>evY0A`ieoUd8`(FlNt+$nMSPpz=wBkcE2)O1qAuqJ zIFBk{{=i+#cP}ViGJk@1tf4NLL?>ymX>;-K0u+3km=qHi@In1Bg&D;_)Bb~4T%jmh zjJY@$QDZEOlqd3a!3>=9gE-0IMY5PvUgzdjufxvw?6G}&zA5OZ!jLajBQQi$J!$bO z4+}95b)-*@N7FepL+~GJ*EkQiz99ry+|>F9ps>%?I9t5dVm4A}%=mn}h9C4j7#9hDJ!zet?+$E&&(|;VALTvX8?N_s>`` z{cfsYA@$PsxNw1J=jU>yI`?b*>toqNUL0C|F|po|e!g3@R6Xkj8hUk4eDU(o+e?R} zlE7@t(y}=F8dWfV?uMjz^8Dmke3k1gb4{FI%a@6sD<9D+(~skeMlAA;pJ_=I%GfWi zpjwucvg>9GD1_Uz<-DDg>CQS0^d&mQmVUn=TJE&n`>K?-(z;{!E>8a~qkbMTc!_kJ zf>K3|I%r5b#P&rQVwqv_=gW_*LqTc?Q68+TcC_LO*sdVOK%C z8r156<=j^fJghF;UwD5zU%rKRAz@8L{FG0yB~>~j5OQ(9n4zdd?a@(K^l1y9%>aYID!6LIT#VW zROZYDi%GVa5;jeKz1vG0xECm-Jw+{yh`V=}l$O?qM)XL}pugCARY%VBb*6A~nJ6`wB%dvmBlMdoAt_`y_w%=u2t~@d;X;|zIt<%zxB@He z&4P+JajZQ7-#gB7%tHAR^{@AS22)okRB0v z*wQxLo5eDWF9cSvd`IqK7=-fZrBPRu=D#q*x|9l9Ipgo&LoWPLbBdvm+y zhwpn0Gz{GmpaY|l#U-33sxYJM!%R_j>hc%wpXbhi)G5dBTQtke?$}%ygh})sYtfyem|OV z4~QVi>k`Z0YsqTRr~SZ%=^PE7yw4UXbIf_$Rx4o?^)MxwG{^uos7_SMRgI| z>v?(p3=a7mqez%RNPJZ%4QLaB?`!KkYG-Gg5dMe)1#it;nnZCw045j3;XfMFMY?_1 z@c_=Qa2%K)PMAf}!Xcz=*8-&T4NqzXf^-T-4=B4Ga{Er=YKR z2Hwzg7|g^ZW?o7mBCGVvyrL8epwl zRm+pdU30Pd_0ks-g%%JI6c^S*2~IKe{@J!~bQ_*t92%b|VPVZpf1FbQkC{<#e>|>hb@TVk|4PKo z|5eL?ieJ15i#)4}drY(fM1MzBIk@-Ae+k2^h__1>IlEmQ^*KUQWTU~G@SB#13Cyk2 zJ)u0QaV)p>0Sk+g)Le)qhs+=;XRhi23Y8)DuHw5r1F^(Lr|qoQW(S@U_wsc(t}Qmr zn1H4ZCcBOzySux!mff<>dS%Dur#vAe~Do@ z1SWpgg4QzNdf&iNYUSGtyXr{aM4oz%B#zQpisNFn=?)<#{b+-BJ(#_RaN!&_O`TSv=Yks`03L$0==&DSG-P{G!P>GVR0eQ0B(vB|4Vli z6ig)22J~}!0{&CSR#4sd5UsLc#|}*oBeqmic3kQ|efCS#b@8 z;;h-JmSUml8n+r(p$80^?cO^YIJNgEHJYulVl-0zR#$H7HAFa5>OJJ=udA*$2Q_hl zOfbl|?ab;(kJ}1;09ME+RcCeJeF#rJvJuPu61WHD|D%p_aHuI5t~QmqPZsd-er{O} zz0GFRgG}_lG!eDP*X(Z4^R!ETSwZEkM-x-3u{VAg5t%x^@}R1h6()Y1U}7Zr=v@VG zffzZmk7#g^g`1nZXa7}z|L_H8$Qq&<$u=u0f*- z<$+T|EAAfhH4F=tfxBG37w8ji&GDwC+P`gx@G<@5=@WkC7OJ85jb+Lh z=Zm?mfHz~?x(dRGk>C7*uJAD48=6wUs-<{rJK)f0gCrS(kHeE61c z-{y&*Ceng7t&yllZ%XNv{emCz1tHSyKBHBA!Lo~y$`v}n`Cz80RiaI+ znD+{W-oZYO<=e|Jny-M4oH2moZyeJef(du2tfaxmY*mXD#xP0Y%PxD(1QqHmf%&cF z7Xl2Jyw2&4V>s>~lSQSptdA7+)%5$3I*#Cx5bpb!2D?p7#$oOVp-9+!Wds46gkAv7C!vDM`CJtb$jJO zOM8}r`Z=X2tO&!q*~8+V5k%n6iCwGpvDrzjN~}c&t&vHkIJZeW)$IP4Gc)5OHQTUf z^$|EhJ-eF$jOJOAVJ=aajvA3%;m^Os!xjdr@9u{x_zyjtT+ohkjNa`hG-IwRMt!aH zJ2R%e@@z^1M1{w8pJn4q2`H7epz!FSk$z_UzPUv#vS=R10{2Hcvq7Qpn9aT?+CoSu z*4~-R3PpOU88Vfbd6hY^lp7ztBDJrblDUNK2g?u^jI)pa95I(@U|a4rqt2mji_y`S zStMNi_5I$n@aaND>Ftg@9dV>$k#sv99AfX}3UvQ#!g%WRMeJ&7jzpRA_irz$B6m-h z0(0FF!bDi#8$SI2b%_6%uCwcb{{<>AOhhX$q>w@nRrND~j9hJT#pq^b)bZ)U<>#G@ zEJyE2;tVJL;2>7T#jTj2F@a!TElmpt;WUpPh96E&>&D;C>Ua+g_$tn+!uavB@Xm4h z2BxUhaMDSB{`d;ZXGxURvvrdzt+}-$p?sy~w|tetZ=YTj zh9wl4h%%MKB0??0G96)>#F-+owL&qcnQa6jNj9hmeZVsUURkN4q5@2>gq^6Cj^iyy z7Fs$#@18(V{_jDN=F*J`(K3H_&lWQu48mI{6t{YMn8oqsKxg;~yr`CTZdRZ_3xT)> zU_}jid?jrHFah}jM6yROaN6bT&X7;ARz#b>H5=A$zM?7Dsb85ib#%zJ7SAT#8{?_R z^LIXw$9XMG4r_K1-?vybE3B=rmjHL1m4g2J&QN6~$kxf-URZkjTz#c?!x9gqDhfAy zSrbiBgApZV-UbHzXxD{z><`AJa=)e;TB8Z3ezn9^=ohwWTlT5o-;BAsxIKjUd0lt z|B&!~#UO<_fop=agOO&t$kdazK+a~mZ+>)4R=`i9PV_L`a7dO1qOjSu6`I&P!`Yp6 z0@#-Bq0@`VPXaJ&Dq-_RT}4Hu6d-y6jdIR$4gYT8d`#Anw!9jJcj~?ob+$m7zw^7# z?E^>1!-Xv~TPI((2Q2MavTP*R#M1<;=3jI5_FC{v!5~Gs|3?fw#qJZ7b$8wx&@=o) zhDwCeBN=P)TrpIStBje+_o3@zX&%1R3K^xaA#!#JSGv${ilgX-j0thseQMgINRz3^ z&)fFt|Y{%iY>4DByO!tH3;g@fPLImJC@ogqa+K!FXl*D%u9!Tcz^t5Z=$0vgI6I zPt;ANB-H%eV!jnwd2rJ}f7rKA(e|D#;p_tG%W9=c<7ZbUqK&ZM~ zp5)V;_Y%M|s!<8(QZuOC&oZh_Wsx9`tJY4zUrs?ec>b-TbfIG7S%CQpU4<0@=0u3? z)06b8t8@jkh&Z9u`Qku*6ia*FeQ`W*(ZK$P99yH28H$B%@0$mrai>NLWGVnW_10~v z{uU6mrJ;lfR5x?Gv<1)cOqZ)36!Hz%Zdu1j)hPw;5=C~~SAxpCvqh3x)m96p3wSM& z@m84I4f_Ji)znvU$->i3oeG~eHLrgRo?l<*0TcIQ)hKL?ni5W<@&jbw4~4}!u>Pj| zCIAel&Xefxi1;FXd7J#1sbty~(1SRM?nI*ALRGYIg}Spo?Rk+U-#1BV3t@}xv~)0j zk1IWeY?G5}oE0QDVqiGOlWmUGKQJqIVhWWvFmP*jW`?!2?^ICv`J*_9JDyYs?b-g; zo_+*e02p`AedQL`U5G+R0MOh{D3v3 zqM}$e5jVCac42K=jlX>-%WT7~e9;~k+561np{i}W36W~|B~!d`%oAoyX=N!CPB`Ur z;bZMiI^?V5kKa>k+_8)Su%H>lLm)s?sXL5~1Y1Z!yl=-(AA_JjPove)((EVkkxs&{#D+>8!xV$Ya7yC`55p zs=3x~^Y`E0wjEv8-{8B4hRcbo;rYj+(*Q-~A`R?S0zmuk-vKQP++~;`e*W)(mFC}d z4s!JQVEq%A!F&E&xCDF<6tCHy=xq(-CwBu}<5x?oMN9@0r*UkV_w3QT{+hLc9TK6i z)-@X5V%x`GwdRD6=geO!eVd4X(z*a@C__RUB2BvN)|rl|_3vKj(=Rmj>zk*qcx6@_ z=3+4n4Gm}K=74V=ia}MQ^BMqXw!M%`kOdC`z8(~?$pM%Nq%7_^Q#0SmgEtj&u_0IB z{n6WrC=}1*u$)j5iUj?NpH!viz1pLyI5thd`xdz5$7%JOs1mK?B^>aAN*f$TkxF8$>D*Pu$$xPiW$&W|?An(>| zQs&QEz?V?>*`#73QDPjKgAzNAg0|D<#aplwh_2i!+(LjP?NQq<-JKw6yppCht-FL_ zk%>c=0{WC zsTH|O9bu1slbyXiLWQWkqoeNqF1)m~^dGwM6&fM-Q0{%fQsa3?5!v&l zt=TfhdoD#LpWZu0Nip`2OkM`LVISVw$Hyo0^ZaCtPGZ!^YoW^NGOqeUclaUUjM>F& zDB&rH9A&mRm|}Yt!aQFov5nxBS4tSs6`m6vLG%EmX>Gj$P8wk+ICalA4?*wxYM3FI z=i$Snf2BI;V}pWFDgRO-eis?}fr|<_{G`JSSLqWIlp9*wEG|)GoM$&Zlsk`Ym;&Xd z76*1I$?>(P%El{bxrgkV7UU<0YdD@iUn+QurlK;KrW3)bTKp3zUR?*Jxs6Rwlct77 z5_ta7OZ$V!7QsKlC$RUeE-!;{RGAr1mVU9S%&!p^@RhrzsG9nNs6QmfcyZjI#{Yhs z(vw^ZrD_4oo6h#iDof84;{vx2{_;_zQIqWW4ASXIu8{IXCmIcsLcd?Drlp@(UA=}8 z>f8X0bQT;&MSJG~1-nD@9;K-=nR;~vI@7H(tvlVbLy2#>U+S5et*)+0`yZP|^gh6! zJUu;KUw>948P}0sP{3gJ7GBj@%K0&Hujb`O6a*NMmS2N7F{LF63Gq|D5tvSte{tUr zGazDI6VMw!p5kgJaz0B|V$V5-Oi5d$D<|D7|nn}q*)nPyULN2WXYf8&6$2j$`B&y zLYLSCdru0AnZx|jc4ErS#~$MB8y((e_|^x5ZNJAR8|v})RwwuuGb=$vm0Qln3!Z_$QM&<=aC z)vY3GelU09UH^I`-d2HT5M4|4+-u72)01kL-(NscXUyp3h#VAn_2q;I^y*vj}zV3;$oKfrp z*>Dw+@_WCh;)XDtqV}854e0A}x}td}EOm3m&a!P@3IS<`O*0GqR7Ml0GpTQ>xIqx@ zIidopsDv3AT~8?`^F0ee&i}>D+d@plR>p?QQ_3%SS=7@v7E;ahrrdM%37XP|i5Qkh z;MdR@Ep~npdxLBEdFsnEop;p)V*L(N_f9qg)6>&K`*1k;%-cM#FMfh~#N^0`XRT>m zDYn?7IYk#!$VE3{qE+GJMhs&^$mK`iWK@B&aj=|W3E0u43b6a;hRA82{1o)Tl)C&T znlClX6Xu+D?1_$*nrfVOvB!Zul{usA@ z{6P?c(b0=T z{dTa>4ni$GG#kYO>Iz5QNKD5_h;<~)_i@a2m~P_Z+A5`{Ph(Sf^eeXk`1HfwCiB&J zD@8UBGGdSh3%DJHcw#uZPlJNI?RGAZ$ON$D$`Z_)z>NV&f(BfxM1%K_#DUZBo1v~u z=(qQKPkH2ew0NHbie-6(evt%~1vzKaLgEbe(-fT16#V#42^4aNjYnXlCBoQ^6C@%$ zyYVYYNx#^O{bREtt!cClK?MIh{CWiz*Ow9gybxG|$+sE^dS))0yjdhGx z%#e}~LTToB7=GVSL5==7Rg2Z?xzmOC3VB?73-3HHJ*G*7?oseRld$d^`1LCubUivb zLWAVCX?7&e4dlJemUn-%z$~z^^3cOml&U$uR8g2yKq#EI?8Q>@hu-mHBg{k8{+=r9 z7(T}coi`{t?M!D}c?))oBK-kBFy?UI@$m8nj;8I{3?<0?f<{=teiqXY&-iOJxqw}{ z;p3!6Y;U@UU%@wcCYVY;OySe7T+A?)yy4=zd0kzP z)fM)=XkC(|vC(@B7&}4hQ6OaZ5inHPMoREy=OXF+mpXyv;XCj&#(3#fNG_7`eo~=S z{skv9p@7O^@#+tK3GxjB_b!i`^XEAM^R{05gHj0~_OZ<|Gx<^_u;#+217euDYAbWJtE>gy`wG&KoSEvp0sVD& z&5!r9+F7ZoFqqW0zei9YXx=61l0Z>+@aqkfHubNx2S+IR(XU~!wQGL;7T+9=n$J%~ zYzc>4kMsR*gx!<#S?In-+5_IYfwg0e9Gg49-j6*TSEUL&r&!m=(C$3 z>7!FoP1g$IwA00Enu%H;1?E6k2_DzSAb8#7xiMW+!`QEjnZ&M#e3F`(()>lshM2cI zx5z{jQ^z*z{jT+?BDrgL4a}Hpbo4JM46i`8j#kop8`Kp80%{PB5LZ8iv!eY(-aixl zx@Ui)0IGc(RgsP~689q$bkV3a4HNcvJXx9>a7WoT`WU3_0$rH5T@zq}GM!x~?_cCc zJ69|e1P#Cq$bc)okx@aLs_0(_4W!ggudP{6VOytEJrikPan2MuI<-7eD(-ODQ+#rh@0Jq^!i3iaa@WCw&ka z$ShZ^bj{r50oxqmqG~*vLX?;H(GvWmN+B)D!s_FcC_GAfusIAIL-124g1Hr1EaTDq zUs)G^AWvXbk{P?d^v|DOM*Rt!8*SIc|u>BZ_ zo#)ne{&LR7#=}%37?&p{HH$}1s3^U*o9MhFtYIIG0z)#mSi0n<3;wE>ykWPywc zNWFuJ=IH>bE^F=Ofpg?D-)S~rjhO%k1KXx>ZL1wLgM?DnMxLQ;q+xbq_42K|JWXt# zbcSUzyyzoc;W|r%(1)JRKp&uK z)iW_^1-6E=f*@`V4hO(U1|;W7LoTq@vJJdzDJiMEPy9uqqJrF~pq05gtdbNJP3|++ z+fHJXJ9%<>D`hE(ne5ug$ zW3)GX7TlyCOVCO1uJPjK!*)_A2M9mod=DdT>96>I6X&+xweA14Zf|dIFP)q--4pei z+1Vin4)RG1%IoTmtGD$l{qJ|zVknj>qLi^hyE10mje4uKZ4Mb6t=J*55p&urWWW0b zev48^TN=0vc(iQ{0nT!wc%J3YO_b0bGHi_XN{TnGfP*VfFzXHfLIKgzDRP|fdBsfgl# zGUA3$pT2jREd?JIDrnTKwfMEL%W+5m0*3O#ua7HdM|Y^=3OPh&#hwjuva#<{>in7$ zKePKDF|8A@*WeYy%b!7edL*>SUZNjdbBd67N={B%uJk5yR;L5>-oU}q)YSCOfZcA2 zjfG_k%q6^&a{QH-u zO-zq4=E9hSOo6ZD#UpfPWh$8CP-)^I>HFJSnx~3!E{abnkHgt7NLs?6;&M)p?Gb$d zdX(Hs0AHW%R8Ykg6!0mqvvIGUdq7uLmBv!pWI?CG>UDR2vUoX?X#?(AH7x_^KL`$V zfh}L)LGpUgz`{btx(~hR6j-wCY;D0=V0ABmn}oW7`x4QkA5*|JMv(i}N?ZC&i4kv3 z0nJuH%+|@!BplMh@I_0fuU^3h`~O@}Xco7Z1^`e7IXWP{A-%+Hep{^ehLW8A#l?o& zKV~uj)ihE^XGDUKHvp7@>Eqt@lL4%}FY#eDz13z)h|re*)Z=F>Kwv@15pc4~3FGIE zTYgw$^-605g{9=x?BagHqjI!n0rUIzi=8%v&>Q#1tgIvEE+b~vSl9P*Rk9!$YzBuT zPvqtG0Ei6mo7O)7m0Z2n5Z^mi*~RcX{}FlZslV&Nj2C~8{wZx3Z3?+FB%bNg2Md@r zD=p&A?ONQYPO|L7^5ucdJiVVXBVFp&o879XM`DS0G~fJZD<+74e5y(9w#~`7fiy^T z3=NH&%ggs$R$sP0AJoV_A(vpwK;>Gjc=-G`-hmgd;O`e+%mJJ}_LpXb)Ghrc^@jLt z73G}yj{>KGV-o=FOOVL91NQWVcc2)HOb0UPL1h(R_g=x3wbp|@nEX)St#t386IdSF z2)pQAzLR28k%MkGn(XP@JU1Z3zg$F$da4k5;cni{FR&^B>?*c=K*{d7u<1!&x3Kf4 zp5CZ9m6+vY7FaV27D1dN`F5DInC-9~ox$w5tnBV`QkT!H1=$YMavH@Y6QPPHnQAxZ z1m%=LG}>I`Sf1qXf?x)ToeaYbdWk^J07hI#inZx*T?ld;k!-YLk1$#lcTC|8iq1cUGtAr)esZMW)FTxFi^PHR4D2U-iNWS+ zq_}RRQe}qS+n&Lb&TQ8`J2#c*0@k;U4?~R51<;i#?UnqWQx#3LYvLh$87_=Oe!T%7 zCs=xh(gt>g_^!Hjuhwtu@9uW@v89MSRxNiBPJmr#wPBX{as69_jVR{DzP;i7t}ResRPPx(?s_|!&4&1=rT_c}KhuF7@Dxb(?SIy9kya(4j`v znVrO^er!Kplf!6>A84+`IChtp%YlK#w#Se`e8vE=iax+;j@xT$YbV-r&_tgaOI&W- zQG#uk{X}wvF+IxlE;Kpxe+wB}djIGVg!XKYk`5)w=)m3>l(0US{{I*}TI%XJ9yWy5 zm zC9EC2R`1q_Jp^K*b}A(Unl?k`|$nOlE-n)c_F_V!Q^583{fgD z5`TP)(jk^BBPvP&R)NGLpjerIP#DKGsEB=oP35E2cUd+`Nl~qP)PK*?KyI(Px*86L zgK_}Wxb&f?)7Ed(Ha#V_6H}R0K7NfyZ~_(i3z!p1*?r9TH#!5)D>Ja~`NiM(NH`gn z0ST(JSgzZDp(TLWiks^QmZ+CJR)0`SfOPIBi|EYY{`XJxxGW!Y4t{W44WiS*?s4$q zieNwezi&**4q%$c;3j+ zawWN9j^x6kD4Y%GqVQX2qU0flH}Z?Ye}j%(d+o@Uk)$Rq&~!O605gae{3gm-=`c|NA^Pt%xSOwWcWM zuBW!sDjNrfxC1pzYp4%x@2CzY71(=7RL$?jX`D71{{CJ1)o~}kO!+P$mYP3++w4Z4 z$3=!nN+u?kgK_PAsW@DrxWP(t37NjdtD+CkrNiTea+jY701XiT{G6V~}|+?GMxooKz+7uz7F($bgT3Oc?+Bp#Y-YNi$zvJKMG z{wr_$$x$CS$;aF9w`i){Q`7H2l!018Qe>fh^BM`NRKgPF#8lvat8M?1cHOt|j-I)&wD%Y=3VlFFvf$YoAvy_viJxd19#U$Sbohc5RjhzM}uxafJ7i z7qz>>IPZl6T>eG~**h4(s`el#I0m4c#luMTPdKXjfeMC5Uw6k-=aQKC_Uoq>*KD~W zxah>RR8&=HUL|x7eZsY7oUgh;^K(M zX(DavU?QE{WH3RB^w|#Z@Mu(nb#Zn!y*bZ$?!lH=skazvJ=9-W_vK;? z^&S3%wbzTEg1noH?h3+bmT*j;aPNKG^3eCY=L{!i^BagXOXsq~grNL)O_FNz1w~wz z6_biWAjkJNvdeWZgbYew_?$MsV+uIQKImbHO!L&$9{BKnCcqJNF!2@mc(sut6FB@q ziTZl(Kz4C_{L>P=%|z`Ce>52neC6}VLY4{;qf9%jM+}g|hr=Q#a=dLJF#P--^3l~b z<7vf$bLqRw`Fd+Tncv;d#YGLP-!eZx=O*zyU-f$=ebG}l_%P9e7N$>W;1?+_Ds9b| z50t}4!y@03w*l&dp%4u*)*%n=)|Z_Z)HSElINcV?kd~?qF6&(O1(KZ&Bjvi}L(-Z& zF0+X2pX^L_{aDCUgo`)4_?B}CR&())a{^|`?6l(%Hl{z>8A3^@-l-Uoj)!fudvsrq zvjZ=;*&mnV>{Ehw)BV8PF4^JUUdtQyjcWX7PEI;jN|rnP9DxUPfoniw~#Shtk=}{&D%C-|;t+Ay&|PGKPDT z9EY0@T*=0A4Q*{FstRBC`_bZpqBuppj^xYIYrhgwixA+0aweerIp2=g&oly?5FA<8 zVTu6|;5G(&6mq;Y??!UJ;yrF?qq%H}G z0CBR#nXnmQN4woNwoV@e_&$M`k6Wv<-v6<^IF9GlK*RAAtDW+*T?s};_}TcNA$$xpD>b*mkRCk zrTUhE8o+8gL#+uiN55drT^z;q*3u#p$~2;e6T&J3#IqwLF;u$yh3|dG?IbsV-*Q}J zK>2IKN_V_Z!Xh*z{O;8Y1z#TW_>k($LhD1@{WIJk;qe z8F?mFaWS{Inify zK}7H@H0d4T^XDNZn4*3)%aEz=kN12s(2>-@z;n6gmhY;SMM84&W2P*l7=1+KEJ>5C##ab4=*2-nF#{J?|9mM{b=QlXj1b_INSzw)S#H;r>cmnqi^_7R$Ud! zFR#14c@t*8i+Ye-07U{YRH6RpNLX&QFu9tRIeM^#GiY3EJM73jh_Pqx8zVKIS3j0 zizRTYZ8@Z?e(H=r3`G$#P@+g;8?%A;>%P$2+Z*Rep^rWWpsJ;=rDfTaO*&m|lpM3P zbRfX8Gbw9p9dycY@!o#h(#>MTlWLvq9yS=SMjOJ)f-u^<6^(e^GABk59X{TJHiV52 zVZyPXaIYwwyqHuBBPs9)!hJXd$FX?BU)jXu8eCmGUN<56v1zwE;bg<>df+;RONxCM zOLu5H4&(-GU9xBZXw(IdAG4*;?W0DJ2`$G?f{D+__;CG@F7koCDW51CVSnf5FpW+9 z%sZloLJdCMcCYukILvm?YjNxaH$4Nt`^&0>gd3OS&$(Q#5k0F-^HF{++UNe+>fz<_$Y=&4pFOKJ++Te7%12S+#h}>cHSx=)!dC)LoN$J2hTm z5hVZd-O3sZGCi+lKyv6w+QLOh1um2YVbJpMp1=;B%c^ZL<7RZD{XS0cHN2uB!6y!X>Zc$% zY1m`Wev%D#QbLLeY=zwuA>fnVL?{=a*Vsrlzv%yV zJw!HI*-0rrK@T*HVW`G3 zTBrZ?!R$a?4r1Het|DAwJVaxf+flMcUK=@zwO`?}cXx-dF8jO{lz}g))zZs_LI7^~ zZWMF(+uay5834N11dqRp?6>EF~N-YRr6mlb4-8BOtTpzmqfwH=q2ouGpipxd+M zI$?+az(;-gWxLUxktU&qh?PsLrA3Y+DQeFWo&ujs7@U?zkKOB8N#r?wK^|1GOU{?F za<&P-mt5mLl{NFY^>HiMDBe+@mY%Lzt?#!Jir4jaGgj4EL@VRr z@d$;+@A&?FD0DY1W?ujG=;W6YfRt{T?fbMDSN&eNpYTdY5~xSj<07_T{adofl1VUv zOpg&t5~hL^qhZ83SRGw0;?s$v!N$rPi4f`Fi$_E2pIkRbEU`C#FhqJhZ{E`D@_qh0 z5M|#DdeCckA2AF{aNJMselt^4oGMcpk2r8GO7f zbtfHIL`OWl^Ep)WoUSLSlA7Igbg5}@7(dnDexIyTTZTFa_|n9xgfs!sngp8(EDTelHmP3mPLlsgR&G!r|Af0r#`dY zY%UWoOlX&9avu6!zB>TS(#dSySlipbZwI3-R_W;~D?5$S6?cFa&E;?sXUO-e7p@uH z_$~gWu%b9E0yK%{q2x2!!Pfc-)6qygxCmEq!^;P!UZRs z!qibR{-ikDU#EBuW-#@xG?XH} z>*;O2esYEN<2(2&Nr?4-LTJvWa|k)a&+={as*Y>ditR|-CDTM50c>^pRWnrxxj{)mSn3s~{ixrN;1 zmeIok!;3%jh6?W7(&^~wM~8D zs2Zpd^7vE;#a=3K7=8%?(G+RN_R3Jg0(cHJ ze7Ll8CF`xlJS_}^y)8dU4Nq}h55C>M!M}xjI|}1;z!?Mz(9rDSbwBNoCLSgwj;wF= zc1r2{?o6o~Xnie&=9EjK_10f6%zl|qqT3yUoS2wE6MA!Wak+gy%m$uz!ke3#x?V5Z z88j-6PENd!3zNaCnGS=5%c$Q0XelT3$V!MZO&2$UUM~-`onjf%-D#Z27>!v zO{q-|1^$xz%T%kIQ2}obFfqW%cNQ8}vuQ?i7PJ|Ey%*cWdxYF8a2UviqhmuY)j7o*^{9a@$#>=R>TSOO*1} zIbWR?^G?+CZjO7V0uT`3-t^pkdA@yKnfe2I;HO2A6y`mJB5k07sf$u&%0(t>tP1Q)}#)^^zq zoTk}SJuh`{rhL8KHXBQt$`a7U)sv2pD=0b$w)C;FR?w~e3$)Iw*|+p^&p67KIo=Ok z4dvGvHbS>5;UklK<0Dv6@Eiqx#>aYr8gonB?N@GJ|7e1y7O}G2QAQh(N0#Hkxd>AI zxXot1=>7;aiA{YyHTXCIj{$c#oa8Z;$Pk@9Fpj=x-TNiGHO#yhvGp@4j8N$ny=?K@ z$1-LqY5v<1;GailOwbFNS-NT(qy*cE1jB+Xv7VT(iyupO^0J0K!RQexC5ET$nutcz zt9MnuxjDLK-wq1FQb-Yao%Y!DD(>nMbPbQf2E!^)#Nym-eYW0p_H09)&^jAirBi{9 zx}2Z&7C!U9W$a{VWB}EvHiR4NPc~M}=-!qj(mo^LOBGIt3g}{@=% z8FJWy`@d3O$(JyW$_Mhh5?XuKkn3qwpIpA_+nz@PTb=Ay49DoXXFs1;8k@zACVvnO z67Jj4KRWsTw2J}@HM>DAVQn245jM)Kx%KvTFhzgay&9jiqei0O`d2obJ-NxrmKiyo zrAWB+gOsSMK$9xxMFo3Re3_pX2?D#ybQ@6K5$p)D|H{=cDe*p>0*579C3YnkOk%5q zJk%@ic--X&GbQwq{9A$7Y9?ao}!yTgfuucFC!}v!oglCxl&6x&Yi| zV}^{TF#TSi($%o_NRXF$1!}g1KD5EN_E0`s@Hv*xztinhV@3UYWJns#j9Rhx!oH?p zt(RXfNV5>Otf!*Em8mht@TvR?P07KJNeoFNM2gC3 zV3(Xzr3xWQ(J{)Y1S3=Gk2KOYGSC7yX=gRka=*A%q$p&$+41$V>$PgY_@DleySRj~ zJu(D54mP31fk4`nvwTSNFT|@jY72NxYS;p?J8Gw|l4wtCqOx!0I-;)#qZKN{$P^1) zNMWHFD%5Awk;50NT+xdyxCFmKIC-Tho&E&3O0ZBs#RlnaA9i+zSL!|jD}A9zMT*(Z z{U}S9Yt4$Q1uCfDOCsDp+NDUl4=>|LK*_gK$lU5B?UMB_{A+{tOyTZAEHkM!2@ev` zZ?rZr5RbM-EN1e^?5O*{=>q%We?JH2p~s&rIcMb%O#Qqb79jc}WEdu^!WWNg{alT0glhG+ zm?+Kvco>zf2G;MUt5Mr5oHl>3g`ZqCYGPA1IiDae`#Cd3O>zLEX?gcX$T=1Jut-j6 zqU<;l2RcqXjncfdXlAZa-9n_K%I;N);)pgJ%(KfSLoqdh2nRhljts;z^YcEFUxl)G zoX&3c$C@0rzSzz3$ha1sVOq~%p6{XwKA&%0@IFrb2G9h{Xw#_+9U9smzswZQ>YkM+ z#wqRB9o@Y`SP1K|cxX*8n@RWNDSOZ%Q8aD${#F(#?t)|Sjxw^v&V_pPBd?gjh$oCn zyqN!6kmv}p4pH3LoW5A$bsjHfKA!2bS6%W3`aPl?|+@h zm)+tu0DQ<-;+wdZ@Tsx<))p&Fl^a;vV9KkF5M`hv?N(Ptw6xFBx_>rg5f1#2v=YS_ z3yBRt8h{^AA|foHH{=sSZb5vZk;I2syTThrd3gNnS`#H$$DnKr&+5hjcarlp1J*8Z z!%i6Y4L&yLBsRAB{dMae4Et}i>x-DbKjmk?19!$>StydqX0-4l6ahJM)*x+b>luvm zbMCFy8$7(JZj-wj)=;j6V{weIJ$!fbnd7=fAIgqXueHSib}CGuwV9EU`o!oKQmH|B{_CoV^?sc(~_!N`!PYYRChe>^&A%h zql2B}NY82bUFC?k$S{jjtmc~GLIvIVzj+YhXg-ay6Jv&P6|5bW@lO41X$wm5?;TA? zeO=uy{1g_4&5VDnrwW=|x;PhN87jyUFtB|(8RV-Lcn?JQ9Y=87b8O^PLQBoqzkF&J zSVn7gms0bzr$=o*kUd!`EYia;C#DbYK+eq39bAS2wGdvvqE3t4tX(xkC(hrRU(4}D>i7s5sUcY`Ou(RtJe5tFG5q#%}iZA@yO}FW9r)r0~V$^@zmK@v%AB^196HyNtlL5=H@k)!u~ai!n9(~6hykm@nl7H zun91`4mEIa305l}*3qB-TMccu?lnGoa7MW%Lc;6SbJVdZzd6c}1JiCda8q^YxQ1m@ z;7u|60f&e!QMy_Gcw)n>=iCYco}Nol-B;Db7`!;uc&FP>&H6IN|E$ZmHFqT`G%Hdm zgtNzF>1SsWNqnPC?6S8N^r%wiBfol}3p+6E4Eyd$2j>ERcsCt0+8D_8)1{J_cp4u` zQOF(#zO{xd&Dd4PA)SLvA%N0I%Hpv51HAdhl9|7rH?R-Jq&tEK%!nZ%`ZtFDlIY^v z72!qu$f5nbDc3s~tbV_NnvgUy*&i#?>Z>c1lr!jg=aJipk0wm%^j}rt@&}S<^Mu($ zHv<(&%CPj(h1gZ#4g$ok?hHdG4ciysxmd!RN(a797-9B&I-VwsktqmftO?%|i!pQ% zgj30t?N_qJp-^$^RM6LR z8qJtCJv-ZB*|RTVh@{E)a78mI_^&IJFTpF@(M=PFyjDj)0P`94gqc50BpH)DA(O}! z?I8RBh5?x-znG&TrF3XfA>2rLRs=0kIhpvWAs)%-d-SX;)N%oA3gl9co#UU)&Ivp{ z*O}TOQlCBq8ecF6tQ%79*#9X->b3V%3M@iQ@t#&x>NdC8--A0oV-evNn7e=_k{gH< zRVR>rH29MN`8QU7lm@N?{&d9a>P;8b=Ka7qI6H?(UTj!fp#-RZ_JyftwYp zflSs*~EdMJ&L;am0f^Nz26i0CNBO@JuwcxYIqoyNQf-jhHfISJ&Fr|gi!?KB< zo?acs4;pc7l{-Um)|`;06Ks-5h-iGbBkX{xDxm5x%jY6DoV4wt?et(g^|rYiG~sqd ztuwr50dp&TN;Szi0N$M!bDWP0e{#eED@q9D4lseahl%f@=zVU2)2 z&mknpk}ZU1--un&)D_}sFsO>??|Ee25Ngb1zD@Ie$Hw76gsUNRMOs&!jcJ;wkhuaf z1E{^NZsq&9>4k4^^eOv;WjCONDAnVEJNAM?)U{l*6E#Ezm|p)?o#el*5JMACL%qf_ zZoGY=mb`${;)z&yh1|lF$Sn)JZ)YKRHl_Kk7O=Xynw6DRYcd2mS0wKPrmo+IvYiGA z&;;({M@+rJdXWG7Z8n)>T3Q~ho7-zL@I_D1@8#vR%9MxGWZsUNaq|6AO+vaiEn;PD z78!fu&JQlr%HISc2Q633L*Fu6%zcrH=65QJZ^r)|xo^!LG;c0g2NySOvOY)U~s-Q?Z#l#W(1icSfb}H~kMA7(O&( zY0N0ySKGTk7cQPdICAB!jT&ecB_t%QtE*E}cjL`mSXh9=oyV52vb5~HUpze=*9I;- zKb6T4c2cfX4(;?ZlPF{(5L?|H`D%0Xeo!mI>IHsbV28F*#?ujtjdn!juNV75a{tu7 z9$+^lCJ;58#t@0N6s=U6nrEE>%pB+|wjo}G+k^s_=7TYKa}LMH(zszjnM<8?wg7=jZ3adU%g57uaI_L1NduM&@%?3#KP_ z3uWqH26}|0$Zu4ug^FE57dbmKbQsA)MzqyBONdhG}^<`@7pMP zTH$}`;dD6ewXbK@x^Ev-k0(1AWRCcOZy6JpClNQj#J1Z*qMm;VO&hIy*Rw|LCQL{S z)7*#Rxa_fIC%B(L^_xbqV<(IVtX`nXd88w{;}Dl9h&BwU<18Sc5|=F=Rp%Lxr?A>A zR;;vpT!L|d_aK2q3NUe?sqZDBoS>X9+4=GQ+S%C&HuAvU>aP(~Uh*8UY^bPs33k`m zy~kgZ^)@}0*7?o$W)DD`)Qp?(s!EBD?muY1UY)k#(#sn1Nt21neoMY7L_6%-3+H^C zI}e@x44HSyEkxZwp#3v*3z{;QjpDltoqe9)8gvW1Ka8v{pqmIs>S;Kd5D|r&N$%o7 zx!L#6IsqG`&fxxB`MvdKm@>}R#^&{`ekuUmB0c-VP@?dd{VzKoNxhG9w~L*d_25`% z7(4L{-s%s^ia#Fsk0}Mn@DNj^xBA4R%fzPmq%6!eaZ z&_2C{+0!Bc$%}!gt2^vZh)u_?j9N8@JAGu8;2FC&{4>os57h|2^C?+Kaiha|6n>ti z-IZ2S|9f?|_jwW>)=(rQXZpl}BhUA?l&9P)phcSz_xDJ_+;PyR+(tZk+WpO#zeeNn zF^$82oj7johwQqcYTkZLKFIw}0jgx~Hi_?CdI4MJp-Evy!5J)^zkYp7hgckU{+^mXR##^_OA``&&2DsDw;Rk+pC_B0U=2Z)H0OS+_ieE zJkoH|aHbGYW!{rq-MvLpWCge0_IVjn(pnCjAAIG+pC?F@;h1u9PYSrSzME7f)zqD*i28Pa>PfS%KO5X(a&}WR3?<1 zd-Y}^r9nrcHtPotowx(jlJGVq1{~>(M1vxOpPazf+iEZT?;ZLl7)D^TyBn+%FC9$q z-8}8$ftyx76BAS2k&Lx9ZRB6I1=%m%CoAn5?^|(|lq$+L9S=X4-+UMhPz?yxTIfh> z!G7YMV~#m;y_Jr8K^Cm?gf<3)tb*2$+~|*}_fR$?jsi5=B}axfLX_gZ%9?d^qK8So zkJgj2a#TUjMFDV90T{qDAg>oj)hcPNnDj94IxC%PlT6B8&Heh+rmoz9ae$@oG&3(p zv3}ezEr=2r8qLzIE>nO@tMk>*8=2dyYSET^^Sf-67~BS}-7G&3hJ6sb;h&2QAOGtp z17fE?J75(ZwD((ab#0Am6_v3h0`0ZZWAo!YbBW(CmRAN{9+=UH8d{t6(t_l5Pj=*H9HBTTy)m*YtT05xju^G8K2=7S&Q)tL%Ip5RmqiV&H8yF`=1td#0UaLf!5)k)bc0tgmWKd~}Y_ z-!s2EwqyoS4On~=v2+xiDawJR3r5@LBI>I}zwKvaLa!Z4piSVsKCJ!jiF55ywS$Wp zBjx7DVOej(G{79Zw(U8*)#)?UxTN3ixFfn_^V^efRLKS7d=P2M)A2-5q=5|buQhP1 zx&Z6mN>P=p=AfqC*;E>kJY`d3c$0iklm|T;fMpMq=6LAz8oYic%R^IT#&#M%qa8-y zWhr53*GxvQipY}rD&172Ua8gvtq`ue!~gB$<+M86^Dn|kQ7$s4NW-Jh^QE6q_gO2Y z-4M30MfVOQe#Z?($D8V=l1tugNhqdq|BRU;lfJlTfc&wiHH284oe77tM`(Wfw-W=9u{ZyjWL>GyW*b_mXj_<~p| zdtz4!#vN~OtkXN|FwgKSx{&GP0vSQIIHe($I$`!($6~Tr5xEF->#BvU@1D8*8DTQY z&hm1FWLKV+pGrelXY!>gbsA;rtSm+4(d~f#!Rl%uU?6z+G>!zK%-oG0q@8mID5hqi zMw8C+BhH`WcRcTlTRi+u*oU8r*q5G;zgg=iT#t7afw&f|%;u@`V8Hg$ zvji)1A&zZsSBeu;0zTK6wg$gnL=rk$y^mYxS|zaF1U2of<(~TH+4*=C`pGmu3`-CS zmsy{&mxCi0JfGFwCa5eJyUUKpcIjVFElJab#*k3L{E1d%B0Y}gf<}lGxuP{xd>6lI zgLLh=q5~mea$QEz6%=!$eXP0 z5d}OL_dd*@gGRJ1-U{li{dw>1*hyYXiQ3*tIgE_%09|voP7Ca(5H;pfe>Ml4cCzY} zqp>2`uHUgdwsNZCG2CoF2BRaA=AsAF@%XeC|Hh7F*DKubUzIVt(CCE z`5qhg$2_WDwZ8_Goqik_w=gMmYQCsv9oj!O5vwQYt8{YK*&Dp7i!|mxdUeREB0;81 z!y$!qjUi)*Fi}}Ir;!@$X61v%b9u)9Rv#JEGAgr1qE}l`F5@w3rTqR)Nn$OA2p%8v zi(m zC*Tj;Mz*^QN%Sj<8jhbANmzl*E7px>7YjYmj@L3{f}zK$xMH&$_Hk&#ZF7XWN04r5B3R|c$kte!YO}iX z^}>2Gk^XN_*TI<9dD5oPp!vV(pV|JynIY8GO|I5rb=zoTpneR+dEIP{GUjbQw)?BC zy9^}adJ1}{(*cfox7*3hl0`WWzpVR@et$m*nD7YVo_8CxSQ0O?kV;M3Q3-E1iN&uS z)WsaeQx3HrT>72`9Z71PYci8Z1&-elCp_p=A;;Z`aH&lwN+`G4HLZck(@2|}V!)(d zo_FjT;<#h^J}%m-TC>A_)=woG*PlDRbPRNvre6JHGC<@MZ6KCjGqBZCA_w2)A^LsI zC^ft2hkGq6E}4&g26obH$XYNjE#c9(63Fxba7c#@pYLy(y$?$TGe48k<%M%3GXeBJ zHd9GL5(nmcAwuuhGUPDoTU&E~e?d-LA?%Qf4eOCO&--WGkjK_gb#k)7sGC-Kd4O=O z?B8X86^T;ccqSv%bIIj?<)Z|2NwOyws?;2Yw)I$KmJkQ~5ZBF&5C)r-c%(`wsRsKe z#1sJ^F1RvywT1cll!=4U(b4g7xuxwyaQIQXQiHWafRoehY`Jy>6DD_V5gv$1vl>dmgPr=e>rEj7(j6Ht@I( zbl(P}kveH7g|0qu-Az%Ao;diJ-^cl!_$`Z{>vOK7-hnH8p}~H(UHTEBk#zQL0r|%k zZ?LF5ikDP)BZzXWTm3U(+TomKRMchyhD2P!4+9RnZE(7=28Gzm>zR&@E|@h{Oqm7$ z{o(1MMZOO-z3iEIhg>h_U|NwY#1rJi1*Z);h&D*Oq|%Iw>EdO11XG)HX( z>35$(l`=(0E)|XtVgzGZ(p?`V+fdj|ptD(Snv#KMz1;L&<{qFG&Gm(%i^m zrR_?e$CgoThX7pbOoAs;(_D7SzvA>tD4^8XuZL-s<{ItKHA_uL`4KpuCZEf?4+N4t%P{V)%8$4m|QY;Qm zT!884b^6vDb%NI*)TOG=J2ODAxV&tkanLrgJn5XDVyV2F1ypJ*3&|w?wG!Y_N~68o zP9Om*ar)MT?#Luvh>f9c$8jE?WegG4b#x(YETMc8Sv+b9o8^9@8*IQ6OcTVZS`5-* ze8De>%HiEd!p?BL#QS6+zr zjjY7PP+Wme0GI7@d}gK}SS_MH`$>}6@o~{U)c#5LqNy3F0YKv87?Nj}y^i!Te_*gu z>j@g6{H^ha+fSXZRL}IO!UWIUDu5?|HWBRxRg42u{Rn>OMCCIRy%HsT?akqQ6rRBi zTwi};^3??i?=otJ`|5FUGw9=$gpcu>W>1szpLc+Laam}HdsqCfM zZjCzjV{Plb$#JJoX}$p>4BTBh-P;?hE-bG>ES31eB~};9^yda)dV58U5$J)Mhz1N^ zn-mJ{se+v*5Xj@7teQU?Xrg$d*-?Cnxte4A46AA#eb@f>R2f?l!mN<%OWn19=DrPP zvHkb^>rrWobmY0v&H*<4ylesS&QDj*MOiVHH zxntXJaAD5NHCxn^j*3*LYF-F*ge2|c7MXeBQtPsE+%s^Z+p;$OJe_;6y=S+kb6l+q z>oD|6-`KG&cWgHLlNK*{5`xU>zl1=j#^hCV(b+cGY{Nw& z)5Y3q0ON2{nb$yxK-?RFSu>n@g*xBWEOR!{O4dffYlexifp*y>F-I)E_mL`!5TIDe z@Hsn;kg^1Uhw$&uN@|5nR67I@0(0ss95*F6J0!d>Xcw}F;zeC9$rzH2_DS*&FU=|DfrQ0Tf1bR9^kgl6NO ze*%b<$77d+AlV@+b>)0zhANyHsJeEX$wmHtRAa6To}YtxW@siK;^$Lq3DmuXPt!BA zlbTZduoBdz6^yr-SRA>U)-lFpJiEl-HU`zd9uH@MTG@kFQmf*O8c*1jz@DlMGR`){ z?{hwnM9w8sqQ)N)h!XZ+09KI+0RpB*K%=N!rDlr<@9;#UD7^480WHzkE`?MbaVT$lnxgrrepGe6nW1R5&{rBctJ#HxK?01Xv zdji6~KSylA50$9&>t{+drtJ$MZFeo}{x*3Is`!q;!z_HZ0@M!JSRd6`Z>>1H6Tpk#@tLz^-0Jnl{PE zx0o*%)En&>>Fof=qnik#mh3c%vqBJ5TYog>a^4XJQ9sw{wVSXR_4*)gExq4cz4TcP zCm)|lZxBrI*0!q7h|Oni-;!fqD`jKQ8$OGCWn0yk_SP>J_}0A9fer5z3XjiCd365X z04LKB`%!71ewbH@6{0oYSHU&sWtJCNMXZk7rEcB-TwH;0HkFYIoZ2u^TAP&gVcdau zdQM3%eCv*9W5OJL;cI_o0gj%o$jAsPDym@c#G^0a&1hr63xSj&UYrhio)>(%+7-LQ zbv8s!S$E|aVEB_-mZ&&mAb(1BclLRMuj^QR>8Myjf$!`4>|8~GXZEO`w={~%P3f_Z z5jy=k+7f_4@&$HCkPTU>f_xLrhr|}v?ReGj(~x)iftZ zs9W-Ws!2U}xjv*PP(?O0oQW<2B*@N1eB^gfms?m2bA(8DLiylk_VAFjVlCTPx~~s?uFYxwKgR?{D`kVO zfMwiAgB|b6oKg9+qX)KeDE*-Co0}XI^4KpGU*M?(CW7b+Oi^8ib!Q1?3fe8HM^;P@ zRp$n(O9JrSj$?%XzT|l?BMFQpF)=eSC5A$aL0kWeG8Pp!focfEWrl{|JGsR*!ozn` zFReW3r$w4PLW`8*WVIk7xup2|DmZ)B94`FDWoCu=`-x+AT zyzrp%#{Tdr)sSknxu!x-qX(w-ANwAlDayM$bQlHA*f(H)FkcAe2+yM>_zc2%vo0zf zR~8`z&lkICOSMitD}MfO^>24}?63h6Iy-2mu3~37OK-;qL}Dn9TCRZ7+QR7!bejK& z&}+zJq^JM&i4ajq6}zytwXxFvu$M{)#z#=@EIXUxyVbtF`6LTjZVhatfVTrYR$bc8 zdxzEg=X6ACc9{27=N7G%^IV3Pgh|Koe#i77`W?+~pVP3~8^W)4an_`ms`nQT{4(3&;||5N_xS5X zpjTA_W0M0=hmLud`Y!@q1S_RxlFQ_x_Y$oO;<#llG?hM{j=B>XXwYe(NH4tR9P0A2+{bgDzg?p zQnGvMr})`zAhE5R3RbrUE3QU&ru*T^t^*|_JA%{u%nmZu8L(>!=|T5Ws>+0Ph%8&b zyXb}~T0C|7mGj&BxVJvj0@(LYxA>wH7!J3pLLq7*%Dl~`d3k5+E>nqj1pm7ojg@|f zN!6%C`<%NfJvRSgKhmT@Qj$;c{Y}+YEDbu@k+-4PGDuqSmwDT_K5|SOK~5W)nZEq{ z=5W&#-<*qRhp~Vut{PP(iD!BxsOu|V@`nh^IwS4b8ny8tBjXL|>l3x|LB)`-95SvP zZi=Nn`|$KQwuI3yV7Ow{91c{GYV}}hi<}khntBorh>a7CC@=gh{96}8%n@4NK&6Km z)ybBk`Pvacuz3p2+l1ZSp7w_|U1M;n7k2A=;D6cY+N|b*v`=C(^DV6iBv)QKX*-8PAFbk3(}Ald-F`>lXH%H)W;|%OWTn{qzD*IM z!tjo)OA&xhUvcK`*{n;iN{d!lF7n3>5CTbpySLh6F$MvvEA&7do&H*Z^v|;r<1^}h zIwobG2DoKdl!DXFuf3Q%m5|!T$H#M_F@EBsui)7eX((g2Z`jvrVM{p0u;L17Viz|5 zdoAs1LY>tpVHei6Haacg4KYr4jPcS2I9H#s8^xeL+I}ezMk{T{-`_A8mKh}t)0Mtf z*uBEz1ssT=i=QEDV@NJ6!U>sPpSU%kyY{f=}^?>zq#w0M3 zJO=wcb!+GUtQGKcDaqn#t62h#ySIc$z^xJvZ3qHOAKHxMi({cS>zR4M6m)~P4ByDj zdn>91cyNfqiALNmiO$Ny$)QyhVVM8;WQnr%fbDkEseIe3z|#efz)o?EYAC_suB7mhbIEx zn%3;W(Xzt|4I4}mJJ8G2!K8XB?C(a6=19C5Y}!ZG7u`T=M8CFK-rjvEk07rDx<*Sd4x= z*I>igBv&>Mt*#lVtEun(2Ms*U(v`SdID|JYSvTsQ@n%BKFD}}z)R{fs?6oM1Q+)~EalXRHrltAoWH*0UEB6|G64;)CCB!WK?133k=uC_Wii>Fb{#D~P zqeKdAN;4RXirk`L+-0Y$-tbs5A^#s6%s$n-a~93^bmf|Nqsl^=3F;ZRYG@m;c4L}0 z?nEkXZs|G;V(K~d^{VO%XJ@wLl$8Cp?-V%om6hkE#aTK{wkt39rv^UfjY4lbXwne> zv@&GQ3k&-hyWTq=(QS8KC@`Vx8l4{CgTZL!Loqaa8H#==n zvPv<30hFRpCwfyy0HjmaB z9sr!EVSI#gS?Gg|P}?KR$`o*DnVF|1C#$NeV7ctqd4PA{oc4BITKm5Z3dQW;Wi@4^ zih6!t&?GvPYs|mA48hSRNfkuQo#sVSXIg;zRsn5y3!B12vu7fmFp;+T8pg z)gr4EoQ)s(O{1x?I4uU2H4J6*vUYJHapP81Xr@cCWaK}cYs2Qr`CN$K^e zzfmaj^dQJ-;&J>Q2kQLx<48~Z*0FGf^+|2(JE2B^Kant2Xdult0_QZQOf}$*^AJR7 zTB#ZO65r_n)+abdi2HKQBTB_4eg%Y@$etajq9efBrW(r<%cPA~}8gALKvhj?4vD&_uL_NMbgi7{TeG=EO&)$@0uQT?0!E z7;4JujTIGV(d?6sAbPs-DZO^Q>)tuzz@TYn^Gd3+@Zfd)HfSs z6>8HBMmG&CPQpw$@4j|_@nISx`Zm#}5F11Ciz0T1 z5v-p*p&gn6@aN4DJHi{c1o<89AiB``Zr6E5QwKS=gu$X z0<0`$h5zf5eU7#h4F7hpTtw?7a_Up?=OmU!RA2XYHskB6xzZbN3J%Nfu1qIUj9Y3Q z8g2FHCZjtmPaT#BHC>?Lgj%oR8C95rrVTbSGk1FvKzQx*t!frOS%?(8u!?D{r@hEk zbeci9pf!$gJIiNI-MyQe0{frwsEyFy);YnA!`kN2|9QWCcM!&)&wSQ{ZP0=uK`Fc`^Wi2Er|Xf>klGK8vQ2s@`O-k-oC3VjCQM)cOZ%Y)n+3TbTQ)_{fCgOM z$1k3(_$&$KK7>IL8iCxT3W`?xqzMpmP6ukPLw=>`Kw8X87-7_Gk)G0u;IQ~SV1y9# z5!vQ>)6j=F55bYmhlri`qZzc{l1@G51f|}YBkBy}*|TMfpMEw$ql84CkSm(njK4^- zBH0fd5^p_$BesuGg7m|dH^QVh<^<&TjKq((@mle$E9UI6l*tnf5nV%5v#`{NuLxM& zPUa~piAwYCm0Cda#Q3(kXDz04^Igv`Yj>YzHJ|^WHhu}!?}@02iq^Q{9l>1v4PHB~ zVxe+Xadr@lnBEYF%AN~X$t!D*;3%)?@gT*6iysdfVJ@viMbUXwsAjRiA`mwq&eL9j zz)bVQF0Xp{PiZQPQ3XS>>$ga(4b(w*wpoIruZBHZ;a?A4bk=i=RPV4X%$E}?>`r)Q z9yHfsM6fc+8lr-31){H3#uv@h5cgon!FxW>NV%u5xan7O_OJLX{Lg}hC_`5by_?@0 z3|!_zo&mS;o0&8dZ_$~Prur67No(s9^ds!mYwIk-qU^$U4I&^S zAl)Ec5&}btG}4_zBQbQhFm$7obPU}gozf}Ytso#RA|NGvi}ySBpS`#L6psO(XT@FD zdBL#5Vf1_X+Fx_V39II3@Z!^DUUCbD94!%`6SCq`h6~|mOl-t7NLE(QJzUCBNsr|z z65)=7($)?(-dA&?W0@)2PsZ$sB9_L6)?%KC@y4&?z6k7vvj^o3(3voE78D-FJAD|+`SJb`|51oDyjFz}y-O?n_MG*a`fRgddSSb>5>Mkxt;f_dyn6C#2h;gPOvh6q zRiXI8cU`0hBa2`5OI*hV->O?iz--`Ad2SwV_SH9U+`U?Ym33BUq^ZGz&dMY@)gS)D zFWBFY;B!Gq@@O4z$w}zyn4YYi21gy9e7OU0woi}u4<-mRl~fJu`4~> zcXo?6?cJ5v!hH6EsnsuOP6JNnm5nqh8($*?zGvud7fOssle1x}mwMh1CqAmytH_?C zkM1i}Q#%W|zaT6|1IdfI_4cpktld>HGhIel@LqwgDz*Rh`tCurR%Vcr*^4?%4)L#j zQa(pUVUbt+;*r{8CkQEgLsw58?n?ne&%$A{q7Cb?)`*LUyi%`mU3kco6Ma`lOw@^hDMCtK#_pJm&(XM=qAssneEYq*4tPL!P^MB4{;Hs zLg`Q?_sZPW^t7xU&0aYBs*V`bH z3dJ*m6xfNw=3FF?zRh{Hu!Bwq*I}HZpTJMz5ltq&6;d7WXy8(yGQf--4-+XkGSlQw z%f%aeG-t};-re1yw%Ty5>op_wLEo`rj@Q?0Gh58IN8gKouvNm0lFN1H<#1_D#03yh zWWPTheh}1xQ4rhDx(0NV9*2w0Aim`^Y<1h4E(9I6^)67WxS{UQ;VKM?E6Tp@bVFW*d3V%j`$uYR?|hV6rwFIpN| zs^f(3t5|91T+FAfnUn=mHasoU;W7Si?eDKn!5rZ>$mzWQjPVorGq$@gvKq1DVKl6PK2n4K(o^WSWIQUSuL(lib&7I+9EkGdSgO1* zkEzewQ(_-Mck8}RV!a_WWwGy5PPyi+>V`)^TQks##6ys^N;cDMMa~P58q@-zkE4P* zzHaXBIlH+XXcl8@h4W0NMgN-Ze)2n%8ntZ<<* z5J2I};FNy-q07BSb$59P=OavMdA5AAN#-p<>_kZSBGoya%wrYu&AQ*@c)_XTAxy4r zgRNVxOirL3d~kk^^4R9W=;j)3)j9Ffc6RTRoT$i%W~Ou;e-$rWzs`0{r&aUaM9~^W z*`utitgP8t;<{uyY9gB{dr9Qe`oy}7cx0cF7JMZFiBNdD`N4GKe(&hO zb6M3s~llCnfx;`{Tl- z;!@V=7nN5gu1~}^N|7b{2S!$w}}rN~>Jk z(5V~sxKru*?C9DKJdaK$K%@DO{;(~BO0gfNz~qnQE!?P?u@B;!?dT0EhEnBbZaTYC z_zrjJCy|Ura2dPqh^oXL-9B`m%^ym23}_JA?rNUTG>_gYlJi8Ge}GO}SXxqvjdK-i zs3C_3C91Z*vGK{w6Hv_($P)AR_V)1baCbjXef92tvpe`hdM6AP09eGC!k!LBM%hbt z$_ffI2j>{)r4Mtv^S?Jza)`z#s%+MI#W`~GBQH{W>alUHgfcC;`FTpiM!@kl_*SBx zYLWa)W1)l+!4-bbdX(0+^gD{EXsO3^;)V_Q6n_awj$*C3-?G;O6=rdJI|a*z?0+d9 z{J$K}_}@Or@w7l0xxB0l+TvoNqq6|C^1k5Zie7CcHm$mRMI|-bk|ZIv_a8=e8rX;g)i*WSonNGr zg(vZMPJ|zaI2L|L6`H+P-+ZsW^U|NBbotb%PWTX{z;(55a zkHPtIez5Rsx#0k)cr$pclqdi6QQ72F8tZuVG3SrNbdJ<2unBixv?V{~Ny`;p8#O<+ zH20FK>r#$|ZM06?aiu8^Qn-%38l?Dft(BMCSe@J5yrmoehNxQ;wVRQRg?%f0 zSG>1U;VsrDjR#t@)P}!YkUJ z1=GUCRU&9@l5RyeG-P^b;WgiHdYr(lD<3DlE9(^zpsR9qXzMO)HQo+pLO@j&(Wk4i za(PAkjsI7Ms&>1A7Mp4m?AZup;|ac?ty$yePf3$-=be!?`&=>Ko$v}9Eo*(2)r9l? z6X6PP-RRFF9nZ;fAaB;|ulp47iH?$e@V{INzx&7GK`ZR~Or*r`bn5N(-n*Cq%{H6r z-085-5d#Dj995C9L<^Ol5R+>t)oVggnk|bp2b^ZZX&rp!L?9yhWO~ zXzE>8)u3tDv6R)|3m@;MgayfT+4Co_tdv&9mC>)!qW*HfjM0|hC@&MDr5x)pH;g2Z ztgI202`i?&=rh$#Dp4#^N==`qRMUbc;jO$$@`G18xVkWYeZ>aCm8iTkxAc4cHoBj? zJeutP4Cr+uoIPlRM*|F{aqqbQLW3rq8I`xS*~Pr14nkPR#3?wYgnAv{ zoV9c)U^cEP2Qu7R`j}S)xW6PsBcTO#*CFr^isq9)z4@5EZ zeWbh?myl-w5FZIFApH3Szsz+#Hf_C3!f3^_wJqUIB%H2M{`hJ2*&OcP;~t5!sAcL- z{-}Ube(Lfc8aphChwCA~3n8N(d!N;3;C8RZS{izeGc((3Yq^J$kW+Lyig5VsU}^5{ zsQDa4_~fB$HiN1vdmaO6!`LfZkI5i^H6Bahx7bZRAKR9X{&a}dIpMV{uV~nloWt|R zk**~5T}R}Fq_#d{feJfBZ#!umq#qWann?P5gh=ERQl);CMwr zmZ3tGE!K|{Ri!d{$+DPztTG3&ZG!*(rXj20L>6gVo2#!1srL4*aNQ)heDq%@Y9x+Z zw7k)=nuU!{xLmR@d-|zOU_{GKkDjogFR3LByPYq7)7kQqM_C+sMZzAkQ?LPYo-OfGfX~))i0{+y| zS9uvFB{hPK{!=Y`b~>46c!yG9TAp%k6l^pf^2rGP+9R(n!HlskD-*l+h=fja%pgPK z?9VG(1&&&t!w($HOzYzAhY>|6n6rIjCx?Oieda595bip910{SMHs1c954TpPH*l|MEWY1fsPu?lBwZr*haYq1pxvHn#{mQi8tfTyKOGXzkfPb!q5 zYVhxQJj0H0;Ac?J6hvU`(~VS~b3yaJIp4fn;L_GCo9|yH-g20mXQ;rZU+((ZS8m<6 z+(m@b#r|#}#^B3)LG=VlGn9rDBcEaJTNBZA7UeTTbNBc;iCj3Uc5L_lawS95+jhNl z1miwM(c*Gs)Vy(%ApA{wtW%aJz1?u6m(+roxyzy%7G%nyghSX@1`17A+>ynL9Lsk( zI2KXNB(M2XMs~v1DniTsy~#$HhZ_}Z5xtFW#KKkdu@8G*$rhJDyTMmcUxcQ0Sn^8qMqWljbTg~ z`=J^8nK7Nx=Eshoyqk2Af)Wo-T>3o8fk3p;)~hOAXK`!mQnwN;mJ+`&*7(H+pmw;9 z;xiQ8Q1r`Zp3lZI1kW8$kDYgr`RPJIp;TWKOnH$K-ZUcXJpK=(JOa;bu4s{o%4YoX zS^qN9OQZL-Te5cAh0~6vUay%9If%?aBI0mkvX$B~21yD!t00ps0%OCbC_bVSy4PB_+vH^@qR! zCZt>kUj5~y2h-U9$^vJACCZF11Jurz0prBGhI2p_Wggsdp6uACVH=w8%Vzr;at|rf z`AE^vfRh$BrkbyZ(^}$pMF}m@j7*1_txq58I;IsdTfPW!Su(6)GA(Va0u6X%?$>hy z%!N;Rdp<}<`?~>gpaOlrl>gON2(7$&3 z{?t>&%}TLn9nP9n9_NI)C5BsY4riIe)0q%*+0lF2s@g%*El-A27oP_&UJ{3)MI_zA`uv>6~n(tF14H zVo#^8P@Hm0^}SUiJ$KuLgF~Db3`GSs;u?pnu6-DueL^3KXYA~4U&9Tpl_Krtj?_Pv zqn9wtzpNM#XfNehC{GHI2v0X0U8&Y3ZTC3B(`=`};;f zJ=%*c{L;yZkyYs^R8;g^ocnWYYXQwx1lFmfhbWt~(I}i2y;9kB0hf)u5zEGG%|v1W zKA>gLP6h2$^bJazraaIV-H=zHNRpzoL*Z!MrQPU#Gnrc?wHzsN)lF@vtLxQ=`}X#t zsZ(UXB!AuKpb`Lg{J(wi19HzvAOr>)*pEmaZU4YqYTHiM2P40azWpgdT#OGM2p$$u zXFh9y$DvtAJ}bWx|46!@D>ChGbC>i*rgFvI&J|^JIi~z_4`wC-%L_-W)W`LSm0HhV zzL-NZwzNzq;xJ%Vnt0>>9-X8IZeAoosrc*W_=E7V7ua756?%WbH;y6auWD#G2fN8r zgzwDfUp4&S!RhHK!YcMTcsFj15J!hv9{6e88_(2ol>uEY?8gg_&wUZNWDsNDiimm4 zwtVJP9H*V^5~~-F{V>#)mg6t`ji?W-kv8OQDGt4Jb#$yOwu_336%glgoVq>X>DQ7R zNo8fIsHhKEn1d9M?Dbf%fC;`4KsLpox#DwCIs)6f%9^Fy`Wo3ph)a?%CImkF*hT43 zpXV^#gMH^YTPAW=jWG7=lsL{|1kY4J2gZ1v`(94$tJq5^gv!y!UTgOnR3E@XT)w@1 zZ|!?=Gn#)>g7R&2($RfO)fNUTfN^AXT~$g21PrVfN>~Yeqt0)n zjpjY-&P^C31}@NklemR<@5=Bv>XbzlbzcoditH9iH`EDFvcxlj(x+3I9!^o z2$^@l6qXnbn{z(C-7kYHIx%K5YL~=Lbd@9P%=BF^q81buhHr1jb3Z{`%;^{lx_sQ_ zVP8Su%HKNv;NS|TQm1*FpCPWn>;|Qc_qB2qJ`2F|>8gO}sjl78Q{AYYO~rosZH|P> z)o4in@2G9PPsejJS*2aQd(8~ZA@yo-!&CFogb5Xw{px_b9UBhHb@!Z^{N9+sRf!lSwLO+GD+f_eS{y+~(C|OjDW`GW1fD zP@`)D7b4h#j5ritA42S0!!fRh9A#Ny_kr9wM6QkL?gJyGZZ2#0`F_>S;w!PrRuPVT zHixkw_sJ*8wY8^R4dLo&Iaf<7D{IqQk(D($W{uS92m!@^5y*!3Wkl46Q5ivuF}eGf z6CwCg<)qAc7}VK9lR4!zCt1#aRPE;X0GybdULcHY_RA%F)75H(V)Wn4j8vUA9RdBi zC?)RraxU`nyM^j8rUq%m3=ur<92+DKf%}2BDLeiQN0UTNzV@M#c_H$FiSG^Ag~ePCG~S>`D`q z*1DL3VhjB7;N;YUw%ca;zQ4%kX^}~=HuF(+wVtVPl0=&Rk^d>os!GDs>a~)IPBain z|M7bf8Ae0_QwjQ+$`!cs<0{ty?HmxNRa8_`up4MB{Fi-vE93=Pu1Z*MXgc9ntzIs_ zP*I~cRh6Ho+3W=JFpTR}_jH;^-t$qLush?;t8sMGhmf`N) zK9tIzjCKPgs_XR^{`d+MSRaV~7QhcV3i)U9foJ@&nUrtd^<}XQ3pD(r;iQP_$LOL! za_^shuVN>0`ST)??mtXV=LO@u(N*uQzCcLT$Dlu)d0-Z2korc1#q;)L28_IFC{H58 zGiY!|UO?35OY+nj(3cy6ST}Qs^CXyN`*TI&J5kNU_L1qK#q-kqq!E^w?1jwfKeY(! zD|DT&YD{|zj`n`wKd%g@*eG9cJ`o5nE`{*UIxbDiUU!SOr*Xhe6NhQY*rL?-m$;s( zH@vleEx$@wnO=szj7X%Gi66MZCrr17Yh)^*u70zln|+pK{mbT&73Ho|u|oQ01^Izg zIesFG65c3(hDQMV`x4Sz55(BS;bDEnp`@=*_&+Xv@k_1R?k(GoEeYrP2uk(bXSEG3 zk04R@rOl}iS-ivcjH2y1NJnaYCvUW-Eh>4v`?AL?2pkHWQVrb?; zkF5QPiVe$4Yi;fu|8g!Wo67`xeH?S>h{QXYuDYO6LTS)6=p{%9hna0R42s$oq0UA{ zZMZo6jtc^!0egFPa{l9xUL>Ix#rOLzv3Jj;f4W#e7rUMsLe~n{@Bip3!8QGSC)tPv zVPhD-5iLe;FEsckt4tQUu-g83%OziWI^#tk}A!UtPZxgf~ z3k#a=uY*Dww`~0BIa?+2OD+R)L@^wjDj6fwy>~t2N6g(j<3ki*PBH|?n>zcvcJWv! z|A<#KcKXK6-c0cWP$j|8zu&=P=HQSVgUgy`ujO&$3}I*(t4HM^%X?!bwc}|#oIE@lLbJEum_!(Uu;j=uiIXUW zxa4!6GUv!&X`Zt7z1;&cpDbmjTfy~ zS}^ieDxS%L-(3OO)jg02;y5d6!XGA{+uGjshKX=J%ADNWYhM2;NqGTJKnbw%VusynSU`b61u3#Y)sJkZi11Sk=w7qnzy_)X#eO(Q4M490^o|Zdug)EyZ|wke2243(`;^5!LY)x#n>og4mgX_`aZQwD z7Q2Cq*2E|MN#Czv%c1!J@&i0V8P(OYZ^F5#LftzT<;YV}J`HmD`vG+M_#TWkhit1~ zZ38+%J?`NkgTyi?DB%3>?#CSTxE#0Uy}v`qG>_#UM_<`-v4cLt4vv4d475gJ@}C zp}~U(>H0nevB?sT%=ACkWU{ljuPQ$Xl3;(qbnU_`QTTJpJua`X7M0x=T?m1)PlHlR zgQ9+o!eKDb;wm3dp}@nlX4TH))EZ%X8eJ}68laO`CODNjEYCZ&+@I`}=ibW%1^{S> z#pF*0&15e1Hqmxt{xv*am<2TlI2M)<7hIg!+{OeJ_WDSlAL$4Uoghq`aeKW!Uz&U+ z8$-}!dUt1EX$!Z{^Im)I8donDox&u{p{DI>4L#X{WL% z8h1>V`>kxf)lk4QeA%_K7qA>y=?!=3e1Xmj!!T|&Utx?uBuWlIy%_oQvDM#MY9GL*GM zX`~(N?@tRYGmYuj90=kvK)0Z=dW!`qK^FF~`?U+3rrN8*SUk@8=g=9Megj`Ea%D!J zR&w8-iOO8xF=zJEsvn$IW?x~mj-1C5M)-cOmlc@}@*YVlmC08Vngu~KqjILEfdP`S zHMPgv`!eRgPHmjl!IYE9eHqMD0{AncO=5-#=620K680*!j1q4u#|@$Q^WWKjM2{*_XtbBXI%VHQT_(Ud_T3S3W& z%`TjX-}jB+FW?DNa)5Tm{j#R8x!L6RWS;;Gc!EdKKmcNy*o~-8iUC@VpO{;1GFXU=7S_CSq)q_DyY6Jn0*;`u~1gBCV&*S z(le&(zLw*rYyp#kefTN~l@8$*MWBv$`5XVZ{g3h`vE5|r()JOb88FQcEpA zvr*ybJS6oP1ANtp?&I%8wa8C|O2Us(G5zU5bHx}ibKGZ3)IN&d zg-kV*-jyDu{hM4i)7_|ajZLVRviVm#;GeyOYCYdRw)URI@Pl{ zSQf#GKNEV0{RvQ!`0ZUut4zbqmnm0`z@YB`V1D$=A(&G`-7TELB|@qf85xor3x)$M zW{P6NnM_4Vy7s@epdI2Q0e%eMt3nI5!-XKYNoyari1Q~SK}fQFAUk-9teNkZGbn2a zZO|lZWAfNPQ4TLRE1`?j!1rhOz|cV)OhAplk_WV*bdnkKu_)LM2 z>gPa}y)ZI%k)Fcle#fTPOp81hqs7#3wsuF#P@!fScl+?FZWBjVGWcJH?K6}GBlsdl zGU$D&E|<&y?)cR6PaQ4qJg#XpTjVAXo$7j6g+qPrGZ(pLrLR-{L&an z$G|z%Tyt@nY--Ep9}*<;OnaUHE-m=0J*UFB^Z0M)J!VX(guQ`9)V$MJmhDY9#;16@ zP9su>qnR27$#?%P`ce* z+S9KD{#6{XM;-H+{7N$>JgY+T%h%ryIGk)c+9`ukP2V)s$-w5yA`+;rdOoRUt#0d4 z2}$zs{`~n-0pz}^QImtuV}H}%l`?Y-oe57)OuR#bIPV7q1r=vs_sTJ`*XphZGo-5Y_ zp`<<18zgCD8ylNZOIHgEFkn%1prK08Z^ySVKVMW>7)$bsmU%f3>N-f-^c_e!!tceh z_%slN7gx|%v@?Ex#m+LQ3j|zk7)~L<1^5AZ-ZXr@U$(xAV_uiQZ?Tv5J;b(whm9`q z4zO=p16qaJfdQF7L1{I>P5lC!%6kY*h7%Y#JI>UZW$X()+>FBpx5Fttp1*$F2I;8A z74n0u5Dl%cv=BYR0tOIc(BDPeBu-(>TtPlHIE|3w2o-resnRES) zH)T-?HWYd+;dTFZ_&Zy`qyy+dY~SAA0t{-FW-G8Hh}1_lOtaYQKu0DuWZr+y0? zKn=dnkYe!2&C}D$(sJKTyu>2n4h!%!e|#SF_XL(NUA|o3D&hTJ)m+uO$F#-o1-3@E zzwdn4h;oq1h8C~Ye0W+zS?_j$ z93HC1MWo5q%Rz$8Vr1YNdryMKuu)ip1<5R(%x{@P#~s(SUpFqE=a%J96%FNk5cxX; z_XJrnY4b0|acv>1zy0=d#3SKFWd$Dwc*!X1&#;i><>X$GJX0>luUR?L)6;`Z1%qVk zpsKCv^XK2-1`ysw1WWv8l!~?10&q-VBr#iWjowYRJLSRwMa<*W^tpafCJ*vKq~&cM zVJh6-bpHs)OJSEOa-7@eNB8A?*D(ameB-wR+zASgNO2!!mS|^whihW|Mk`}gCS)q{ z>-7o8p*GUgJOfNBqzAiz)aF+E6~6CaxNa0UD$L~E@dC`s@$vW2H(`tIELxOcqVE^{ z{tScZwj}?Dqf=v1d_w@n$gSv!wBR&MRs`t`^7%>{Rg&(^#&sVp`two&B+hkUKQfh~ z@h7pEvvXv@3=%wQ3f2yCSI3rZa1Leyc)|l}d+-A#|C-wjNZ9@W7=}CWxB{kQ0Quh+ zfeY>$FDMj>=x06aAgS1kPf9GYcb~7JH(U>PCls27V=v+uO2T3F zA>l_$*jX(ts6Pf`6GO;kL-n+fb$U&ISIUO)r75nzMU$|w<79(C&Ot4Kg_FNq;rk>7 zhhg`$gJIDwQRTrFVqG*!A1B}Ngz_+8T%0?-TWhNx{fq0thTvIP0I3)bwfL`-jb0_j zM9rB5WP6U-mu6G_x9Nas@b{$mBfRHtO?Rc59a8YH7L(uQAPJbFUjf)0nGX}QSh zS{Ch+(LOq^JQ19Y_{Of^=r)xnoq&pG6PN@E?mp>4!SVZdUgY@YO0=2cv^%%K@M}QN z^D|W8!$37AldD(! z(STqGyUb(B85)ttRV>S}WNg_$Jm$$NJ*7i!Tpf-i?m8LXxk|buZrO|1CNrbvbvvXa zvoBrU6FkI->w7$*P6OHLWf}y2a&lLp#8pCvHNA`~*#>HA8+T`)q@u89eds6y$ioYX zIZFU28WaFjh!o%x2i5naBe|L@655Mc`P~GMG68HBh5De+8> zn#?iEvjmR?AJ_8gH#}bMHd^1>cX13xyF}ybrm8_&TH2F&HxEYDJa3MgtgNhl{`{#> z`0_ZK?KeEbOG!y<4v0uI9IpHI9sjj8{pEBD)&5q6!lMcAEphUZVO_@0r6PNQ>OzCU z{i5MsgD(AMfA)|Y^GvL*@jfef@b@nb$Uz7n>=(|qcx6&U7sqZ$Y>!5Ae7un5X!F_G zXecJJ5vY9ucur_&s5*-o*9#=pdV|F#7Y4q~0T~ZJ|OfV+!$1 zB9p~ozR>B)aSD$ciHIXp)c-alDr%%Znph?K^%A9df(4$%+g;f0v0R`v)H1OI@zc;-4r2Ms(@XwtK1+ zbSa$+0qMCft7wWuCLbRyUrvh`q_8;ri?*vF{u1~LF%H3V8BJAt@S19FHb31O2CkOL zFA}*=RPkN5;$1n~Pl5o}_vt_n$r!w)2&Tu;`aEHwpt(+LPF)d-a6L&HX{$1>4(-uz zNPDKAOExqy;UX{#x(OFxG_$;-B9qHh!oi`+JS}M}D4k0JK&uy4njGObM}r$rNq!JT zx=LV?{PSc^*sMxlY9K?a(CTNS@dWKU8)m0vOH)C_J?MEHf;Irn+x{Tp`wVOoFn%qc+@iDiO z?C};>P?eeT+XY!7Dk@6q-3CDOofFu7fac)#&Q7Z(hC)hbl6g286z3xlAm4$ztXB69 zMPap7B5FDr$|X^?1y3jcN&!t?dSRC4o8j19t8{|F8)f{Fl*eVUMh*o1Ef|7SAP>1Qx2=Pt)N##{Ybk#&W*%4LK>`wUBMm`)>?d(`9Q$};bs8|ILHCd zcBjC@+_}9PY^Z<#NOWH`U2F;}{UPuW#gZ%)^<>TZ?YgO^N!9W$cWBXlEhC`Ss*V@<<_oZAdRb*7j6p)*w ze>SuoEMoM;e37C)&knumCGOdF_aUuG8s zG#C5j)eeg%6su2{p!BnA*lQ?H37++ zj0j#VZiCXGt+TVUnp*tmspt#oJ!2KhW9kcbUuiWvz6>xCf`78Q@G+0sqmA;3P`2NT zhZO{J!~2tPQ4Rxv&d%pk>3gqeA$Ai=W2@KHJ9Qutfy~k8&W{M}8uXgmSzFb37k^WpuVvUL6 zUJp|e6n4TqEWmBL?*%$gG&OQix5nH4yQ}8Xo z^!9;6_2)#6v9@;6%pUzv!6o!hUUUfMw50AvkF~>;%zI`rd;6ngcKvKXm0n$41?OVt z-Sq)SVMR^NNmbjijiaL{duPG?Y+uPF(8IdS6fMoosdPb952J0xgzZArwGN=mf!! zzP=C*p=`xpN2jw3p9vfvSJu)3Uc-SgG0%Vo2I>w(z&{2*PK=GY3s3|j*=**qv9f~a za2L&SEvK{a&Gb`>>sSL$WsL@AB=#lzJxhvvX^?cr!0g<&E=AV37XAzCV389+yKp{d zrok9e?-?b2a2!}}_CTMa#GTGrXUYcj|M5qUv9d+(_`LMTf0*&K?R1J z;Fj0X(RujcK;#Mn9rV_=Ho8=!R036e`nx?9PVb`z$ie(ST!%mxQRTNAX83;3zaqpA zY{)y6cBdrUF-M`qGH{4q$6Zw}y$3Ax*9K2XAjb=~uSqHV51QqN>>EHtf#kYCozbF; zfrsZ05L6p<_?&~j6VM3&V0~3tS=j;D2f$~GSOi;LU0nhgsO8S~8)B*_Q3`v2+4;=Y zR=egmy4c~DT2BcisZ!gi9;wkjW9NOhFt8bE0QZE)zAWt%$*sWm5T|>Oy3(a*kSY59 zG6Hy=<+#u5fsqvO9><1;;$9@;CEDKr+J?opJf-3@(d)Flg?rbp$r^(nM4o_j4LFq9 z+uG{an20+&f1a~h1HF#R-#>6vjXKh`1sIb+pht1uofpPAJ?)F*VKi5NyQia z^8V~BDN)6U+hH}N1vmm`@B`2fs9p|m6w-?>NZfl&iYZNAgIX2Xebs<+VbLs?F^%Vz z*tR7izbT5a$ehRUz9`CTPm>Q}vC5$G{f%_eP9t2BlCO^It zT<9qB3CiF?X=rY~1jAH%U*3nV-H~MyDF-Iq%o2XS3UzBsN%f}89HksF(7V%y1s&C3 zctqvWfBIyR$jGkSewid4P4wy0r(~D#Q1NuB3z3sbI#YM{Hq|K=j*w-@r_JG;9;@XQZnZPteJ zq;}=$Ct0tZf5VtKXG3sXy?zf5Qj5ZmmibL76tP6xIMXV>{xWTg7}(jd%=X^tFDxts zFMk@?IIx1ty@vgl5ql}mOXt=mDxnt-#Y!c{8BET0x6|S1`D!>3C{c@Bgk0Bilp|2! zKk)o3G#t)D?!Q)G?P)93{V2p1(`CEi*gY)tazWw7-XeBsm(=xN0#CU)A)m4U?pX3^Rvjz48cjv(e{HFd0gbZ>-d^WEblm4*(N>K+OT zAOS#4>iH~pmCFiUlOUNdG>4}Vu%Krah3y!$?W7;Px!THy-~IWswV=B|%%*?f21Ad8zXeDFateR#@L zUf;VhIhwon-s31o4TXKgGgltlzQ;NYu+Jk6``=HCo_rz#_@94(C&xJ`d!Y~XcscbY z+P-<0(w2(_p3C?Iwa1c$j_iRtu!e6aX$EE*o#mAx-o0UOO&jjfTBg`6kj+xOfuM^X z1kAu7)~vSy)R{z1hwy>tgLTtAB?opTzuNA6Aqi%u9@sJ9H&Do=@W0#u-)#&yP(7yZ zf%nLMEjIY9fa%uda5*~Gn)LapXwue3#)u<&`j$Ps8%)wk!$y_4sL_JBu{1p;LFV2W5JI z!@QYMF*dF1c>2?eH1~L0-mnIa`6Zm4Hn#%tf=Lt}5@RSIpYR$u-H%z;tsH@LYU)s` z7x4wNIJ@;ML4m{j@N@BZu2dv!B|29z&e?9hOKcBGPA==|%c*>oq=$zuCtDBR^948y znpTd00Y@9?=_)a5n3KEy7jXg(&OFW=uY35tFIg43h;HsvIG-3KH4seIJ+7-ILcQPD7aC0a&JFBV1&cf32<3n2thhbTn zXEer^n5CtSo?d@xv60KF^PghHG+IV95KzYB;W!IShHVMaFw|F(W7h=tZq!6k>gnsZ z0X3u*JjaiZpWhQSlfX4{jr)tE8HNgEBg@UL zim|Ehs=8k|X=Af=t5*>0hM-Lr76?2;Lz!G!0%igp9(-}}@uqwkbYHT?aUiB490p$P z6UM`+Ow#i0+p`)e9MF2%YGOzzjkY=bFVO%|v8-#6|crKdq(N`XL@@>RENJgtQZaItteus}yU8-3xa;Vvr28G!TTUyFY_(rsq?uzx_W3@E7d!7SVn9@&61$a^36%%La+mDYX zXQ|*|W={3h7mlN)<<)T-|1=-AvT@RN7PE^yS_=MJ_lTnT>~N>|2;aJ^b%yWBFmA(2 zk?SyDdk!{YCdZ@;QOEtO=paO?<4UnC+Qj9Ezhwk&Sl$)J2^n+DJn5VUpZhz8w>Uh!}Hb6`V1O0x=g%e@`Z20<;^bdl zKb)H-~%lyI`@Zk#1ZUa0$QbEB@5 z-uiY-1=Qn2yR5n0u&9=L=O?Her#!N!JxKaF-t-@`;&l|oIX7+ph$k;MJP$mSiTI}W zQW01dGdr;C z1;8M`#k+#re`iq}u~TP;O9rdW2sK?nlVx-)@lf>Cw}2E}1OsP#8&>ailP(d&uA%Ou zpE_o|De{b)tt$*5V|#7%QsQt$){UFU?)S1GV?1;M$H1Zn;LIp~3|Gr7c|EP}!L!CV zBjR9I_}LpWUAs>=(La74epd*ER%LBm$z8N_`7;m?ZgA6)u(_}%kAC15@-rZYT#`n> zGrSsyv|iH5&?Rv=+`)qS9{p`@DZ{epM1(MR(eZP3LEBRr2R8?t&#I}^Oey@baUzIH zxczQP-II8%vzh>M6T5X8hI+C+N4RjX6^rjFVF&hEDMaf^40xf`_(5H5m^1q8xeDIi zh4=8zB0KM;kOHh=cG6G$vvqDL$C}P3T8tchDRP*h7z*;#s2%A)TYl2xDR#ah|2H~a zh?I$Ix1!@m7bq&$B|Nqwf63sxMNIgq@Fr zXx)3_k2?W^LHm;@>)b|bfjt`C6M$^;TB$L1;J_hvs=gQo(&yidFG4v~Ag+am*rq?S z?nf=RYz+mPvFE4v9AM8B}j=9?gsf&K2syo{3hNncfjifiNMO29@P zv@$x8R7%2h;EDH*D#ddZX0bl_&(_V{z&a)~MOjg>w-b2Iw#Oc8a}Oqf6M3Z-5ag7t zBsc*y^8ts>u){6aKH!*3OHyPzj1cFKK<_LjCzA7OhLciQ{ip149V8gWw@s?EMZ|?D zLzsCuHqrdD*MFT+X5jrmzeOVc$|u_Kq%+@99 zaW@YahPPcR2nl-?SQfc!7oVGG!olO2;Aeu{*6ub9tfT!Xx#Q7D|9oh9(xoMSK&KTu zeci%R$+Ia<)0p%B0I!+m3I0Hf@$riUw7C_4xhPv2>?;kSGs$cKoe}br_SeHYHpRs2 z_TjZ!u01q;kf?-YfzTOGZ$;ao-5?$+!}9F~z2Z*E-6Z1;p7m|9QtZoXA!{Ax2D@Z| z)i>p~xTXw!M2KRd?#3lh3zh3b-Bui-WEObRM4Yn8sbY`-xIJPx^LfPtA?oPxbs8y} z{bS3^fyf`8QcWhJc#0c{n;~JK21#mm;j42lpR>U`lq4y zZHFtvxmw_R7|}TCLr*geqSM*(8?tIj!$H4(`VrTb*1fY;+)&ayDDv%!Th#bJeL)wA#9;`KO6#L#`iAzN!a_0JbeNKO>X+mEgs=&A=H zEnkY*fg_ig0`nDkpq8%e$Q-3PL_ia9QbLwui1+jTxJ%x?n*mDM0?f!`mu!WuR{A|? zPw@jcDWIj#z1kuAJ2t<2Mx+B+!U6@^I7o|Rb~jwbfvXo_rr`A7Jogu@0z_Nh} zIF{wZDkZAX8lOG@v2?YIA@K{E^&k$BwU@*24hx*V$u7dz*IN*I#(-sn$rybHYY{~u zdH{^@Efosdn`#x!b%&PA&J%|;O4h9E;8zs8U$Ygl7v9w%s_wB&bWPLhuFQ!ZqB@0m zjrqSQKd1_PM>XLs2DeuHCkSuQs&w3gG}o2gO?4~5L@|6?`tYNd^B(fmNy~dsuPH*b zdw?EctNHfW`L|~pj>!ML7Yp-gi5GzV_{J1pqP>DUVVg$=0a$E819%OL`mLOCue_C zt*;KQ!UZPE*C9TS3_C^bD7ii)D;XyUW=72=k>WV)@*3`5nj+{HQ-DS;zI-b7dtT>W zujSzG9(V=MRIVQ@CxZ>Dy^;{dYsK_$c>HGV=M$t|d>*oxEt<{J#REc3k9*$})$#<5 z1jAqVoGO%KDM+YMl80-Mnxv3ui!^StMWF3l!@A>NUn>3J=}~_o5Xe@a^-p*+_N^sV=zL;Lr8cP}h^q=d{aqUHAKtLy7i|Zh@r50)*>bGehno z6xH$uqV4)VM}{!av;0c$5RtM4l1{xR*7AP!T9`y~*U!vl)h?r0UD6}&xRV#`-l0!Q zJ-+AJd2lCz^YvshFS28O5gpU@zHGnk-uHQxG9WFI_h-Jtfx?s?7m)ub zDPfgH84K%ddtt_jCL7up{F%-t1=%G{?guQgoAlpxYfNV{TUVdv3^74>&7U(f^>V_B z3b`xUwx#6?yw)1C9GgJ59VPyr)35AAGlN=xTH%*S*Y4WYPcpzWzkVLQ(dme6>)w4p z1B?Lro0D7`BZ8>{K3K&@0P~GQ*#gH6xnk~FGG!et#-z_i7$Aa4TvVP%3NqZv{5dE_MD$QX=TRC(tt%9eJZgYK0e_M!q% z`6|6L@stIN2b7$&Y-u2gN5CR8gxU2P@1myt+kU!Y_n;FF(m^$<55KPN^OyF;BY*6& zc4q2HLAJ`;2eaLR*vg#G-!0IicMB*7@oP?Hh{b3}JPVv1nG=vnyUfk|L@(LqTcM5M zq7Az3`9ihJXR(0xjz_$~cyUbAXK{3V;t?Iw6ARH2FSuCjd$19fIfbbV?nO5=&}ogZ zU`Gy;K3=L%%vY%T5+K+FM8qp`yF-*Ag@p$q+!5?ZIo^D|>MZ$btToVbqbYSTDl?La zxwBgN!LVXrJjG$R6oi3<6mINha3N-6IxVbA;T=jQN#~?1o8}8saQpcn>qHj@QhHr$ zm<|{_ln&AJbgh+0b1M?Qb3g0?An3;;vAg_bv;WR8VHMJQMS~*KU`8$@iaNp=GRj_5 zuJl&h`UF19)1Kb;Nlyw!ZNkFzAXsNuV@ zq8P!utj_7UWZ&*1x~}Y8I|Oo?aD$_3jv;BP!+Ikc^@Sfn5t1u7rWmMHytq`Ob7z$B z?^*gZ@11rSN7qDdbj&+iM>Hs%R)BPRIPZ#!_rAEs5Wyq~?_3c1hM%t;V8d(A74;tf zjg+T&`FYmSpULW=zPEmsAzwC5Xq2lyvqI;1o(&2YYOhHHxsVUF05zFpeY)$R(6JAj zeKE?Au;+5YRCdP?hDb1&11yVA{17#qiia|H~{0h?P1XEucGH5J-o9|B* zRupm^R~lbxd=1EW=5Ih@#xjRyL;{bfNBiDw+qOGQ@7UT&S-SRSuCKFO^{{_9)$RFx zkf!`x??%CrL_V5vWovYR{-ohJmDf)!r1>_OYcujU`;f$@cvJF64g_lC$*=&wiQcCW z&)?wBD85yw@9O4g)NQTt2*~2}Z+tWxl8-*tL^Q}P9$fEgN9REMeeMFbzP1z}m-D7m;wg^QV1{(h2;Ai^@?H=mP5_Oe@^e9^li5@J8uy)L;gUhiu z1V&V~eYi%xJg@BLI08CR%$P{4N zi8u8Ct)!H4OGmiH3HgBagu@e1HLvm7(4v*S?#%Jeiu~XacE*N8!_3SqY@wB8rMIh*%_!lAL ztXVd#6oI(B3G_A&F8aYvnin)-m)!Gp5NTY-_wi@m0mqEL&KT zID{h99f3-8nRT0HHlB`JBb0mVu>mXc(2H(;+Im7Jd&w@ceOzy_2wzo`#35ve6kiTj zc<@to}k01 zWkRV3P%XSsU1Nm*;aQqxsGa4^tVykwAP!k32CD4XvRn@n=D=Z@emY-BjFtGy{$8}h zlLhiy#CQY)Jx(WdS%DRAOEpr9%#D@0x0Cmh#31$q<7*$YT?4x30z!hWXn;K2*kTH z;l_y5?I}VYGurPJ>_3Ex2kxSu3PYDeP&>C*#du^gUn;7SBcf&rVvGP2%F!W)q*FOa z$46U!pDg+}JIbOcZv?WRAi?jm_bHasb9_dr_SgBVJ6jWdo`9^QnW$cW?DtkIZf%8g z5uQV~%f!X!XN_1WjkEjZj?V;VZ2`NhAGZqe#i>xU%G(#e7@dkhQ*v zFY+!fUs*h&2UdF2n{WS;eSkw6+He8HPei+qXV_pFa>qv`L!{PYqSIN?3Ek{(3$Q+Vk^-+6on>LwDNv= zK@$Oi9`#y#J5$Gehd&n9qZj#_RnL3<{5}q9eWx8Tk(&!7dI*O;3zTGfk83G! znW)|TyCug>Fh^7h82{B@`zhfKoi`Z8&YhsgIHGpM`v+u-2W;bRLZhoBD;e<}5VO_b zg~c=sPiEihb6^kJp4)-)nO#q(Kk&!chnEI7ZbBLOZ6q|2AayO^I|4pSKMEYy6iLG$ zqDBLE;9^TD%4%M~#Ic)wRrTtq_!tKb)1;NPqBwJK#gZ7fEy^_SMZ{1H_~4pnupdEpd5ViD_gEPp($($Xq@CV7 zwwqr!Vv^z7{HHu9zT1Nq1QV1M94fGl8(%L4VzhX_y^(%KI%=QuHtnZ9a9`V()&TFv zSqS~yA0}bN9oXoN_K$unvEY#&;nwZwBhrx|0x@=ZJ@z6jPBYX94;eA?GU)+;DE7?w z&+cN&T$odd9_=wZl~(Xyg=qcj8p70|gkTlFr9#zL()XqY8Aq#pmjp(0l6K@a z%C#`}>OO{cg~(5GTCY!FiX|n5lLcCAv5g{T;Q1~wOL$5^ePmnoW)E%ee5AG@1J3W2%%NXB=Nu~W2o;R()3-*wW%uw5j5!43Vq*Km| zQB;-6pL)hB{7B7r?(FoPACy7@vM;f@7@eh>5MH(mUH;i;^<{xvBV7W_l(^_|2Va_< zgT2uCd*?}r7DIgE4{G&VBaJxK`)cbkEbR%~^BBeZJxD9%bp5lJJ%R`LHsf(*e-%Ai zWoiM&!Fjm<_%P?F_JTu~3)!(+WI|S3Se}%YdeO)^HjuC$2{pVPeB-$i zx=7{x^VT22_O4?bj70ex{$8Ugc^L0yLYuA11as6glXm7*SNF6#Moi7Bj9&p?n8X_5 zE)C05u%hINlY`Q3cNnhmv%xa)4eRb(INKq4;8L$O*7{R28x`nOp{UuIW4GMHgVAHhTZ9{KkKh}eMYBI+4E`VQdulIXkf z@4EHzFMj;_F^zKM&|G-3SP9kfF;>>am-+k+FSgJ4$gnMT_+zp%{^j`==@D|45Kg;j z6kbKXWFSF<&@%*%*I^q4SE9fNm}j!iZ8L-W!8==HPidFVW(RJ0m@#=hx_NERQ9>9( zA(cmvnVlQ*xVvf_lXZUg+@A!t^SENgQGVO}$H&CUZ?kgF@xp3|O*pQ~N|+Bl&i;%_ zRWV=z2=Tklwm2)gH@eijecMUIHwV1e>E@Ms%f7CjA$5w8quUb0$h2Au|2HI-D+oSV z!v*EO&Z;wY?RG}N9=7dDh_if2$AA2G!V;tOipfuN6jee2Ni7V-53M}cc5xu2HcdZQ zqV()#=eyPQ{?8^{ad?k9<>+8-zNgxy)oy(lo|7Y+bphOJD8D@;4+($7&l1JpvhBFx zzN-DbP`S5V^RGVXlM#FDANYBlcL)9^-|*hNvz)=stAkm>R%$7#ew zZg^^-Gx9@f3rGwS)@(MS4^w^0Nk^oRG{Nc-X0OfCUd7j%Z>4(W*8%_ODSFpi@daPQ zl~H}s-p&=3*Ihp+j*^pvNRxf?r#bJH`7BtFsKofPpS59!ZIp0_*)NgWSH;%Ojv%Gu z=KI1v2~VKb3Qd13Hwlx5&R2(t_v(7?pppVFz;h-ikMQ1_GoxpA9K5TfF`%t!QP_Ns z>+u%t732BRbEN@*8SGcKsfjZkm-*>rwElT*WsjqtbUdItEqOkTz3>5RtZY|~K-E=} zd#LB&T&F!u^Y0Uv)HKUfJ9+tukv+ow>t8q+>O*-YA%vA)_|?^GoX5o-@_?Gl*cv&W zR(%~{%!O;9$yf^`GRRI9!DF=Z#JkaR@O0M(3}BQ&?ru z6jS}dS2Xk-&|GiJr8x`NPDQFE$qOJ-G`ceKqZtCbaEQuZYT@RLa~9alE$dYY1n&S3pPJpfCMCSC@kyJ zj5*?CkkkXg(qxix!bK0ZTczT*^AYE)mZ(@!y0md(`VnkNd?_J-7{C+pmo!#9l-gcp zyAo6-Z(>`lXC8G#AG+o2U#@0q3Y@)72ge@cvoU@IxB*rLd{fJwh8S{$etzNDV?!^m z+HHjItS59|f;((s0(O?~+Du>43*=-H(#I$&QW|Wh^q1wNqj%XH)RQ%)5Zm*b)g`Tl z6gk9zX#!g@?ltQ@pXN(oyZ-R2#z`ZC)}D!!PplDD3dBt6Thyo`BHpO&b$bN@FidcQ z3FuU$m!sPxU09=N0S+aS_InxS{}QV=U(rXr#tDPTN~nmti6b!lU;l&{$rqyj7LbP% zK+Jtvc=+jG@33q-=ORjWcboIo@ z!4sF&!ba~+!#MPWT_sM%K=MO%-vHQW}o6Wgu8AQOw2Wx!z z!GDAL3+-Un_a8+N`(Yr5nhNur`kL?ld-#6t2SG(83K}2T3V&@zA}NB3^y9#Go`sTJ zQ&Zp4_sV7ecE8PdVlG^s~vu}lpA=bOY7!L>ZK6dAiRp^FVKPbW4E{K0J z2>H`4isMZx{XB7UY^!9Ld2}jOq|y6CK7bf3C+iren@y~?{N%-j^jgsGOf#4)ojq-8P1uOR7c*-062OJ>og5`q8AXR5N^KShGHFk?4e8(K?FZ`K$j9F+ z1^NSTc(DNEgsA_q`hQE_TM`9E=wG7#|5b>IivIKc67nwfuegw+ z$e$xG+df5h3mp&p9Z!2T>CF!wRj2M(a0Lj3`*AQ3=?XBjCC zun`7SPU`%W0qAi8@U4{k1p!NJ08Ry6D|x`*Wy=6T zDToJa>t+l9C`kMOi}nWMIe}R{F~JwtglWun3_^ONF*5^0_a^^1i30%JZvN9yR*rg- zKw+dnd+0Cvb3_{>w1OWG(N=X>;*EfUqZQp7r~l?grZAy(d3kSlcS*5dQr~n$*AHsl zYuv31`TpcD^7?SM)wM$x^vN(t4)JlTckEWVglsYiHPmcvKVI&&8SU+re3qtP!K_t} z86T{U>l`PY6?5~cgeFQdiRmBx%$vo|ChH4=*d{OF?>8|xpG3BDLvw_CB}QyLx9*(> z0N}dav1jfh3PPYw$o8bi+XWCJS3nO4v{FcN1^|qt>DaYK>VbnO0DyEs5c6LN(%T*) z)@~%So_A|KXs;%Gp^|j{y^`3H?=1q!TuhiMgC#$PkN+iSHsP2PC+F!_w+T;n!esB& zZow3F!g@AE$?N&p5rm2;F@%C=O1%;ZXZBN%HV%a_GwhMNM;;M3nvQBX5?`H0DUny6 zOXH^&m9{+jwWtfcV1$8eTcYp~;8XBxc!wNUN>H7;=p1^ZRBJguNvP~Ev?&WWuB>>1 zg6t`m1`^R2zQTj4KQ>q^@nTYgoZW{+$lU$kIoSvLBx?m&QIpL_YiTOc{|u1))u}{i zkGeCTto1;|4U*|b~(`Xv2Bx zCo=oQ6`?23O1pp?kH>-S6DiftPlp>N^@*`H0bZfDSZfA%Ms~(QgZ7B^cQ%ha32pN5 ziiKSrvS11;70XcAZtia1F840!F7>tk`&=_|=i*1rosSwL-xP`Wu=jZOkSsGkNoW^k zX{?tQYT@w4f0e8%Y|^Mvk0{6E`H>|!9zvj?R8sXTb(X}2(B{Fm=FqJTXFZidHGN8V zX7otzF#QnW)&m_Q{6olKr1eMQY$9YLYhn+gnhfPq;@N28K`l;xu9J*|Osq^tZ9V2D zX5SBqBkxlcQyEf8nK`t6SCm$4RG?|!Xpd^e|2ER}tCrQ~)&&1XolEQRe<(78Jw10UC!ju?PWHexuvyPv5mwTYOthrwHzKlRc zROqgny~3`9w6I;;1LRP4o{`sO6qu*%ShnHSdGJi;#{toT*gu!u$)W2Z)uYoPt)fp5 ziTvYrb`&A!7+k$lmon@Vmntz$HBH|RO>CVODVmp!mBos&9WVgXf$azE2Z|Vw7^oSP zRE|~7vous%OPNZAm4%fD$H&HhjW1;KW{YwyemclL$X?9eY&QAo`IWV)ys5=fp>FqU z>6i1S4u`O>f?rDXw7(kG%U0!9(J!=DwU^fXg?)!VyG~D#NnfUMC64GjQ zlYNt)skIrQb@RXKzVqbHWWP4QScoVxM#M7aAM&r{{;mx!_(D2D8(9-M=Rm)Iw`oTl z)_RlJlS|y-CcIIme%oBl>{&T$LhDx7kekTpD5c<0_H;4!Y|?@Cq0U`Jw>xLUZSR@8 z-0b@7-m~)6nsdH$+w+LE{4t(VlMe$F|Y{##;1)h#$){5%|p$jYJHA*#$lUM0km%xZ{Bay zfU-b(IBSHcAc-J-_?Jg-UusYsP-xZizHa$UBBr2K;)6tda8>YLPZhPz&}l*y^}|8N zMB;=kX4q%{!-Xki(|yzEK7Vw^u!u0-aA2HMq#nsMS30l9^qQ3Gru4IPn)F7tHJ6%T z4Vxk_vseZDH<1)qD=$yEb3XZX$MachJB-gc%$| zhE86E6TP=#Wdy(3aao1Z#FZme1yU|0u$jvVV(72&Jm}-zd-am{TGMb$^G!!CNf|Ix zs9wu6t9U1!CU)?8(f#8tVclyDW&EAcp^Txto-LF|kmXKg|4CG+lPe@CF~M1~f?6fH z$@9UdQ?RQpw6RZ<)_F8=p{_u_^TnDLAq~&K5 zv;DlBqn?rAo<=yk6EyAjdtrVjYl~-wYI+=BHXBW!!*fZ+K1BVj z#$P2&{}8bBam{m&G{SKNl)0AD@cU1HtHq?%jMdTp23wv!W?Du1embTD#_~!7#->ig z+1DGH*3+`J(Vr{{XCxsyKQ~d$BjHQnhzJ8$_5vfFRRiHZ8W!&6CfF zYH7qTu$;(Y4pMeOb1yvDF!(UEV{-;}Xq}|Jc8?xVHyRd@8q*XDQvut;spQ zNoHMV$!2S2z37|ix2cVZO)ng8c)!Z6Qex%shkpyVAp!?-P!14^>9R*$3L-t+v#;h@U}3YCn&n!dE@Q)@bBSnlVIK7g%L6_ z+P>_;cwW_^)?s`rekQRjwH`4K)Q7GuU91Is>-H$PnO>87Kne?)geKm_V@bV>&x{`p z#|S^k6A%*=+yS~kj$X^8CM_lz@(7{7prh4<1RVa4^CycF(;3r+>DTGWAbZ~u$Z_`x zan0&L?*K*DuqQW{(XGzQS&zq>2l++OCYIW+FIB+DH=C#0JI$%Gmt^APi06^%NWc&|?M=Mwqq$RXG zS59+1atySe-Zl?5g#DTx((+WW5~h6kss07SGn;|`K&5f8;ocqn)R6gHyPa(~H zr2@w^V~0DFY`?rwI@$T~3Kei=s9#P}S)$ASd%(MsHhjLG=_>Z%B{q5RB+~oCkYS-e zOApVk+)}v%5zo#{r4ltT1NPa>{;rO}C^(9@*8PG$^fRSAlPhrJR38tgANF-hK^tsI z9v+^K$DQbtg(^Hrfw+3NqnU{b)w`n_a)p zKoTA}hnDT|=1u>X2hdyRAlU2qsBBXBqC@z+1q^+;$QSXto+(jcVPPTUF!EitOkel8 z=;Y<)4Z({=#WaJ(WEd#nc^<`>CUz}vst{#Igx*JJkp$l-FGn-%^jPc|(B4rXj#BFk z9-w^PLT1eK+&QTMb(!=8%S03W`0>N=$Go;b=q-Em)ymHgqOEIqw_;Z_KR1UCwZ#K) z)iNx28sm6wLthA?`~1-buKiS!!SCQ6@j86goaNYzUV+xRck?y=jlX{%)s3>BoSdvW zf*^oFXZ%~DaO#p2jjU3^U922HBy6q+UR(-h4ziK8Kl8Q)eBvj=+&x&mJT#9V&l45q z;K0(Wvl!NQ?7ZtmxEkZ0tTbqyIk;gn>hOf8g01KZZ#{ZKY32e~ zuT5V5y=Sqh-qg~P=iR*S3j{i=Dtxx)I@x*NcG7hj#zE#f#-(fIwFiqB8tdpQrRcSn zs;i@|jq&9OHl}qtxpjOCMZv2qWmY(MA&eZ44X+4Fe@`{F$?XVA%pBO7MiX-6@jFud z^}O2Ie1kq5xp}u-n!;1LquDs=-8du<+Rcyu7Psj7n5Yc+*AH(p{Yz#!TaF4_;ChI* zo72=}?ouR0v-FO|G1^S<>@dNezcJlItzrXb{ zE-tDXe`aLmO7vE)v^T;7)Sk#-P1{r!4D%Vwa=reNJG!}Yxs?0%x_|bt0JYj5!~#BT zAz%V;FGEI3@#Dlga$si+^WTBUBr$NnJcYWNmmp z1M@*=aZKswPm_$4Sxqet@YL?jys{Su((MldvE-rHYGN(7uEwIzC;ZX@cdM>eD)}Jw z`yaz%#XPd>GjdIT)XbFH_3s^1M3K5g4>$x~ax^b|4^G02?FIHVl{P%jJGV~(3=48( zR17qc&RJhx@31)X?(gs%AWD-=`OvXVDz@xSB8L5lc2Xi-vrp4%W8LKqKmFa;-(Ct2 z?)%~dc7_=#Hs8ws;raFpY!CqELe^%sn+wo<%|mctd4OViTMguMHRc-sHV+xD$#)wv z#Fw*VecdiFH4&#qS4JJL<7T?{zXWp_Ew~P%4*Fj2E#~Fd+FT>b#%yY%Yn#NwQz<(Q zB2h7D#5gyfKaba2=eYK&`6oXQDBR?y1?e1Ne7Y|cgBQs#{4^8qcgFz|g1q+E%H=;o z(f(+=*SA~Qx8LWd1q;y0Udab>_eh*N2oq8FZ=QSYt)>U;3h?-$vwBWb@akyZ^I*}#>rEn-P&QU}=b*aJ1?V6+jQc@v>rd4ZIxQV%qNxg?|8Z?f z?bZJ22?$+N!HROsYdI99X;Nt8~?)y?0^3|wPjD})N$w3hO9_rL%57KRNc5 zM+K!8&9on2AYYsYeF?LMLTao@b-OxF&jzabz}$mKlOiwi93b~aI}Uuvfn&00;gcor z&HE9o)rY`NOp$KQuc4E;%n6z%TtWD-)%0(=3kmQ)h~9)eYJ<+6C!$`u*pm5B@f-p4LvtdT}xHQSt{!;%MQ-+A6+Uqnw)=V&aOIEr_^+iw?Lwf_?^Y~8v5>6 z0?yZ3lMg1@%d2R1C&RMiKj|q0`X`Jh-(2V40mb$r_?z;aXT)koTVlxvjtV}ic1w99 zJG?8>mo3KLe7m>R<%eFC(_;DWKUou!iFgophk1T`LVNQ&zQ7U%-Nr5|#_;a>U!=#C z3+(^A{(UE=oE|DQQ^G;LiXA@rm$~_;Wa}a)W_n0g?)=&U$xars)$yc8&hZ_!C_(}BT0;C(TGe*nN)wtbW zM)rz1%wtO_Nh9>p^>0VNyZB>5G>-c6G@~yevW_E6l}a+*Zz~EY%Tcajbo}nN4*NB>mKqnH=%KMCZm}`Ch}yy zes71VZ$^24MKlc6@;IqW4e);$Z#VW__E_)q31_)y{ryGY$H1>JpHsg}37sEI?IwDK zMzuCPB(buiqodi`*~XsRVd7LyL(~!Y`1l=9``PR3>#&;F;!*=EJ6Cs2keBIHV*#IG z4@cX_dnRP|f2s~y`{=T66d#El{NF`)bAb^QTjbc zwIZL^x=!|4b(mlHuuytEZiApFSGu(Jq=a)(-1ikCk82gSKJPBkyuY{6)=mHWkYQF% z&d#X?nfMnws(Q%D>DNnmjr8YXX>%Psbx3HIo2znBseiR;IqG?qJGHLH_S(nxqMTLh z`4!S}RKI@;^7vcrBFA8itNa(86MKT-8-6bUk44Ubr9|YYIC+0O+hdfi`SsKqXlG}) zYMt*V2EB?0!H@;;u?NdwQS@$3b5iW(Gz!Jcw<=samk@G#>j?ec7gk2rLdMUWOo3=Z zm8{2C+PYqmjliD|c%?(E3p?gjKB4_SB>g+m|73&oqV>=^g3Pn~=FQvmeB0;jadkh? zQy|OW?m2rB`1%M+>%7xw@G{hozR8_T_rK2YvYhRuu}O5XQ5(vLMhNfbk)>wCL-~P7 zS8VY~MskXtv$NM&U*oI3hCPQE&C|QG=H|OI?TgOa>rZblHIJLm*2BCQ>Hfz`*3iRV z@^Bm^fhkK(Tl4oFeY-;Nbhqs&*%<}W0gyyF3a|Z4>-!C#i-iRpUX_zMO*IudT;TI` z{Dc5F#_wVM!Or+)rFM`)-`E()C16b!h86I*`BKL25B4cL?KBucA$I%B61LcbzX}Rc zq(S^7%@cd!XXRKt(~W`ip+$W;lS6T$<334vPkWHkZ!Y=G+kKxJ4clyRcRRbFkiX6O zsUki9c`^6RbBn8pWqO&ZVpQqkakz5j82%6X3|}Xvq3zMJR9&q8R~wZCMEwE#9eC_; z!unrS2Ca`y9#_+-NvM^jgOt!2g@fX@=ZUtbEbf15flj)7CYI99W8tkc4v{tqJ4 zqd%<{_FdC#0Rb_CtmS5nH%;Hofxv~;2Z~hKNxYt)ReIV&WxZ*IuJWUw2qcF zrv`F60wjPumYc_Uo?bETlXuCV13m)`mLEq}IYb`T5Y$AUm5XbOy4Hkl3Rcu|4D{4@ zoM$O$Et2J@KGIpxgw^^L^3^8cuF_-pp=|#{!72Z8-Do+f<#!Wp%v8z#H1;sL3P+R} z{60j=#63d<*{n~o5M7|VZ{ta1ukZRLXw{*!v94m|;sFG?U;PglLmoD<*1S)ufKS6} zuwX-a3QpQeZJ!~~D139@D)H`vm6-wFCF<7x&n)t+iihL`_Zrxx##FjN{aZB1tal-eo{jv@&_Zz$y`98o=>1DY``vAFnddLqbtg5wCZGGGy93h}=Fqyf9 z@13$scER9g*T)Y%`iK#xcB#h9!0t5^?czy3GjnH6QhG=y32c55=Iy;yx~~ z3_+YBPpbe__+b}+k`c*Ex~xB`b|pLb70v!WqVEFq236wdbQ>VHt~3Vu4=2%!ii%>1 zJ(_rVdHMT8apcIj;IP4VtuCRYn{o2&@crh9o8}T6?@VdnnUEDO*g9~Y5y$h}uYEwa zFWXmx>`xD_lj9;bP$JKWFy+-fY6{DNPI9 z<|BovQ+dW44v(3xR3aoJ%32gh?*sDDH&O42M7i{5(fpUI_+}Pa6a^7+UxG0Sh9lK*Z#$4^CfTcAiLb` zlthU}*$}j(s*O&FLq(l1nz=5MD2vQBCfbje+8NF{@qDNKfDgIdqQ&yw-sBh)FzLcy zjl{`Lpzis(xCvP`d=PuuueTfZeu-uh{B}<R0c$U*QKrY}Jf5tl7If+s#6$dxnTtL|?UOy1TJ6+hcHr$$U<0 zk6%ELGe>@hH9Z|2tE~MTL0A8$QDa3WB}K*X7q9=YUwWANmeA^fhL>qWSq#CKcsEHu zD+~qpA80HRq*?Y@GWO`Jz6`TLS-5F@=uajd7s5baUAGGdDQ<`Q;whbaw`n)I`N4!) z3%nvXhnfK|pqG3H?=NIJMlZu*5frz%$5~$~OGB~~?1QW4=bAOi=rGM*J7_61{F5-| z>`i`#2vQ-h1q2+-D1l&wRecpY(75=C{om2DQWjB8{fR3ck(h>9lHaal{v};*Z+(zL zVEWwQWMLSiVokxe694NV`(`6!j>}BF8pH?M6OH6pH||sjhLjHG`QBz)a)>?+0kgBR zZ{jk2`;`diQx=e}NCgydA=2N8CuzG9+vew9lHt7Sc55B&B?xY+b|U>4P`l z#9q!G&NNj~yE7M!+UCX2)L7rNgI^>?; zggLI()|=`|ajy^claoNV8g!whO7FK2M(FD$5c)ES^|MU}^yuIuJDeB*SqS3gR^hBg zk3oc-xgek*^mQkoP%h6p!7EJ8gb#4|ie>;zq(KN69U*Ac;uqqbnA)DuIe*EUu=qB`RIbi5$;FL12<1v}>d_A9;6_)YdKOebRd_~bTl+!`3 zQsg5zN*%K)V-@$6YsyD|lZ2y@r;{}yb~O)`)%HwFg4~0z20_gh3bwXK#ES;?q$d4{ z;xU?mmx-(;^$}*sv)#nWRFYIGIVgoZd04~)*`73Yj8ttv|EIUtt6EnqLFm-)S?dl6 zwB0NJkFndukq?Elp33kT%Gs|e<;24@d!+E7#$~2tssxFhSgjhulhFLP%-V}C>D*?`^@;ex~e@boXxea6N z!DxJ|&jd}ejEXkOE8U2aG-lH8zcCXmYSn{yIKk2@dWIjDh4|I*#KW<42d3zL(K-iJs7U$J89g2qF zTg=B<64VAz2TKjgnI{=MDzp-@lrPryc`9P8kht;9itC(a)ljp{=ej^D{?XCh`5%)!0-xdR%4M zifH9bXA4cj6*1|ntNriXE!nc9HK;_ph+q^OtWlT!XeZ)Z&{~ikvirrrF`L*qPShh{ z^9@@piAjW#lRJ!G`g>VXNc1-S8EtKv?U~kL`Zp0aLXpo1jZ^$P?d1T;-ho=UNEiYs zt1`y~TKxO^mOXxA{WBqi%K)rN5-+|`PZQtuu?H)2pv`>D)Sg!;L%>MGE^|d8D!yM8 z7OH^4*!H>#_tC2uj7dY*_|9?Q&tT z@Ka{W^z6QhcqK9+;9#GIOziu=h*!H`s-Ye*%G8XT%I2E}v=_LNbhv^Tr z>+NXOnEHF~FDCe6oaWRBlIl+R0?UL&xopYzGqHP>SbP48bF zm;Rd0S7=K{HZ?W@3@(;_#{XstE|Q4E+&gYects@H<{mC2K0GK zj*tG5w}NE>;)+z%8i@p4wX*ufc7hR`bb{F=wz7nqvJ!tRIF@>gCj0e!v@s|eY9x5l zHj@4(emkV1_s0tm+od%d+WzY5mP||l2Mix8kYY}KejEgLJ#6@FIuDYk8@MQ#n}fM0 zMYydeatMumugZXs-;)RWZEi=6eM@@E(%4|yIL?-XpwYNIH%Jh2rNiM@ekH^RJQ?~+ z!l`C^i_m_~TG3*6Crd8*j`-KTv9ydlHoelb1W!_8x)q7xYDv)yBE(z*VH5v{_RYq|#xod}ix+!7gh}ik59=P3|LMmtg*+Fg3{T4tt_Qq9 z)Wn{4VY)O|qFKy?0k}zc0{COP2Iw>MoF=bdg+d=uVb?JDbxFd@ib9DaR;o zMX*E0?IuX0x2d~|Naxqc6 zc(rq%W7o!I6h^+l{@|o&-IhVop zXD5XIMXr*NnX9e40-*);H4J5ns?k0HyU)utCs(eNG1H;cfl%6g*SYUdC}!yq zGKKeHA?$A-HUmJ-%^on>TPz>T#?i5+s;bex{m-92)zuSCXLWUTFm}BdN$c+pX%tgtn>Xy7^_cpy!K1KNBG z=hi?6ySJ5Z>BQC9`tC<%upCJ4zM zsK=(W!VX(4OMX+)G4US@l&OoRVspFGFgdNy*ZxHlZaVd0q#Jo31;0bvsg65S@qSCaj zJ<}1wjx8A&=sUEjAs35?hWMy$%Tr$j6GqC!#9-bMrqE%52`7q{mev|>l1E+uF*Jo|3br!2wbD#Mz#q3}gS%@3xkMd?}`PZ)EVOZyY& zLo>{dn~(MjWc0Gd)S~bIWbhOZjB#4Q;Gi(2b9azZp5HKM{f;V)dJ_4l$Wx<)*=kQJ>1pClV6_u)Eh&v zG;JQt9QmeoVMF?P^s#VsfV<6i0R;yGx49V$!O~O?rBSnVDI%9516jU7eId;`IP*Uf z!l$aO?X%%}85D|D01AX^4RG3MVkZumQ~j~MPoNkVcZxDiy0_17D-zFITF0lq^l73+ z6^@ zywXg!>8_eJ*b{^oe=f*)%Ig;|e4-C?G^2%a2?r%9vLACski@<`&tQ?Z_eTntta=|+ zLZdY00?tXr9~o4IjaoDDpgyQo|*Zj5{rp7;9^GAsuai>YpTv zUuk`eCmC4ze~%=Ga(2(8tD}B%gQiAc*!s%^4-ZIhqoismQG!w#BGowS%obs4kZ@=whY~8K5EF4c9=q7s3bFq#Y(eZQztqE*l*nxa0L5DmQD^hX zq&t@N{C8mUi9A9dj)+27lwd?T3_CN3Gu^S+ivEYxCX~43uXIJB3*43-O6)nxKL6r) zn)3dmu%iO6mujrWMl+kp0wr!0vKK)wgDzYZwztXhjtY2*19+vNlsK+JYP#}c1-BU4 z2uE%qq85VRNXNK{?thkg=5dGnKZctre`Ep%pO{nXehZEQNOOP!G-kX?oyphxCy9iFNg)geRVsB-*fmVZNmwp%)CZY+_Sm3j|$iC!! zzeQEN9+A3{s={#3+bd(B8XekE6L)TBc3fvP6PKbbzf)6&@KS~;jenB4q*O)=pAI~z zb~di$GD&&IzQ6$%qXCLIwPzvjNJM~^IO=184NdT)jU_R_=j_K^G)MT{U}{5!0v^I| z#s7{1d$IK{tCY5^lr-8QIbLgucpH(+!P!TI!H{)nm6%J176b!woR}oPzr=VnHZVi6 zHM9-XCq2Wk}najrCIN`Ci=W9bp@r9aO4@wJ`7ZJR!`Tzc52Yl}Lg=FPyR0us54M zz+Xqz+rwHsDA(KboFEY@UV6D?&OA*Ib#1@pESJtADVdD zONZet36!ggfVY>OXpSzJ=HA}k9%KwT)`dX}ZGHV!Cn6ZfX`doU>}CXdU88Y$?x12n z%BM~x4uGu&fYz85v3u0o3M~4^O-@{W(tXl1l-2c`f&HHm;5+;6 zg*-bSA zkKq+wT~3hU{U0xT^o@2mE zJMgX55iE=CDX(T45-pEq!D26Bl*G$362s9&cJ8JyrXdvEKT}knOmuz#VBiyWKP<%+ z^Hga3oV?_ReCaK6dv~?@cD)nr_QRff!Sl^8&o}7juCA`J^S=*AZf$jS zE->*C0)hMo_F&?wv7Vlut}fyGu-(`sfny-z=({hxZFvlX` z6->!t)bW_-bB>A#-(+7ld!)sz{Z*)e)vtHnd$A9Ny1yjd|LJ!2?O{$+m)w)8n~vmp zNNsz3rMp}KWcsU-$6e!_`Iq8|ly^K2G+o$DO0uvbO`+n%vGPWoKnMwC<$^ z2M2fFubga!VC6+pxl_gnYz1b4j}V-<9C#B=1vpu9A5KO_RAPy;L)KGgsG`Sb1d z0C)hy;R=koJmv#22l)X|*k2mKnnr$?<-xYm$-_%c$F*WO7bqV#jQP7hO6Vk0nTY46 zpIVN;kT|`)A->0FT$(geX~d}c=_!@OkU_E$1XYZe+ho>~qI5|@bAA1)(0cO=eu5)9 zD28&9piIs>zyH#Rj%uRdrDmxzEJ(Y0W9adJ-90t_+J0o15g&MB@Z*(p8Vud$=kzw8 z7ciPPzT!t&G^vtfFf`#RS~@Z+ywbbrOec}#g}8CqSANU7IjU{Wt4PU)yv3mwVH?ey zrQE4Ms(ZGp_;C{!c>)-!iNgCv{6(^kh+uW)j}>wE@3M&pPv}AW=J@vJrlC{9!oPlG61Nz@X;9 z4U#M!?sXc`T`G|%c`#E+QDPguk>do}lzN`thntJQzKU=+pTGQ{32AR}P${3ebZ{>} z)gX8ve$oq$`cPaCSLDvR@$)|hVDxff?Eid3Xy9#&gwC47RO!Lxa#od!YRQH{{j0B) z?jyu9(34v9s486v4I72O&+q#K>9;_O7!z(@%CO6z81m3au+okaSS9vR9;~v}T$=%F zD58RIc|PWFT=U#9^ssEw;1d1Nz;M+nD90PiFYk+cLXPf}(S(+op*8hwyHt+)TODUL9XQE?_42^ccRl`-DpPw4;9pM>l%hEOmQ}y5x!Vw=W*%$C67ed5SsJ7- zR}_}KGC~Ekn zk|qn_GHm22xf&^S0DYUW7W1Qbvrn~A^!oOq;N5H#*{VGnLQY-T7ZJq^hmB|FW|!~x z^I-{`Gs-cEh|_Jsr&o--f-5N~w(R-M1`|hNn^ZZRr2@CSaJqM+;+`$)(!{5UTRcO+ zFr~P8_XNnE2AlWz4ct|0KTn4LW}iEqUGyp)H0C=kR}oi=FUAPtYC9O%xjoECyn$Ae zUbv2^x$``Z`(A?AE^?<-&RdSLFr_5T4SZ#mZ2?JmZ*o7ang#k-y4YB!Y{EZx=6 zwk;Y?vc+?Evv>dC@)yAZ=P3Ms!Z>KDi~Hk1m;0cIfW5i+`OuE#%|;B)!hs{dt7zCe z7YDAew3!8j;vhYa5HRULSIUY?yaIbkrtXKw0Zh;h^Sc`kX9G4C7m@0 zuK2|*%_;~vcuOXfQ^{Gh<($C3WwV%N`f91(vGZ{&)^X#9h0})V&BN+R3+;pPXHBc` zn&O2*JvFWSuakb~+x(lp)-|08Tl9uXv&ds^f9J#vVLBsAu@33DxhEO>5{&rDehl}4}aov^~JBaNZIJ*hQa zFB{{a$8luP+unf_NVEHtX)A)qlZvtzI}jVO8%0!|YTpuROvBX;?!GGg4BSjs95 zeBr5(#HE0*_laecZQ$k&!aRuQ$w2;7riPS1D$1c8L9g3K0Hyq2YF?+WQA;CTesENH z2>?9Dgd)uCa=$3|=@w{7`i1XNVRq-@W5u6);nNnioa++JG_8nA^-KJ^j zO^TQ0Np}K#DtfV`A3Ut)abb2zX+qN<3)=IrHcYWd?Jnid>AED_>}(8%m6IESMhOO< zh{cj5%pkk5g;F75<~vR5)i!a?xdxRXbS>+!b~R0FiirrbTz)n@+(#YG*}*Xi4YPjX zxG+nN1w~NQsCdn{)X@D6tEM3@zhXGa!;N2JgI-mIPig^PPT;^c&0i z(6gz`g+_hXnRdd)w4$$4nPUdFv+cvfv!2$9_7kY4d?us^=X%?OVU~x+CI-9Jb^J1` z^zR5#2ComLaB99p#iL-)gbdP8ON9K!lVU0X3zTL?G2upqE}rnBBRG)_a-viBhf?9ONX#H`rJRwib3`$7bdR_U(YDJAg9LP%m^u^_vqwlUlP4I3GYLhOvLduvdpko zE%S%*KmCjme{W2Id^(O{eR;{4lfMt*J2*P=4>+z>A~?U9v8#!tDoD`q7Rd>KE;_ba zKG#n=jI1!$Q^!LEpx<%-Sg3Pkl6CSkp zFEom`I(!F$`mWaoaGuanl)M7c9`n%P)&nqV~4O5imSD3Ts(!hp{{5+5h^?fUsNvy)6U!9se%tdRf2N@Vyzwz`&RU zzP-wE1rL?tDtLZV>C@!^oez1Ty**u-gRZyy0+egsw&CwLkQEbfEEuH=0Q)^Oxu0)O z$|Yh#Vr^&wDZGCn-h}9*x0IwcfCbIFWaMQ>x)*<$(uj0vkI~Tkel0Ko0knhm6s&x z{fw514IteS42yDZMCUcNZ}7Reoh5ubQnNPlSXbfS%po3UFcGr*g$PCr?yonMj68H( zxJ|ApURXAfn3oReXIXCfN&Ka6lv-k}=Q0T$Hy)=>Y|ZWfrg3O``fxw}YeA%*dlM$xC4~NRcB_qtAxp(~UhmR$E1rdL0$MH5>>2J1ZqBZ=oaNfnDZNg<^DJrE~L7zsoK8nER`>_T_h^ zJY2sUIE@ZZ-^;WysAV^aZW--3Jf$XR(3H?+D#L>w|8c;yl@=QwZ0T~Uo6!UR2 z;OVJ&d1CVHu%C^#ZA=@zKlp7SVHI+kJN@QjNbM>CL>{5`ILH^yRMj`rl*`C}!bK znIb3(;9IP0@FG?2hhczFmTl${L)T}XZ}2@3B@`JcP|RlI^Y@_&1T zMg3bULMswKqaGmmb1^6{)WIggK|Y93#5@p3QQvEXiJQXbbO$Cxw#NhWV3d;M$hOii z;+=x8{|>tq$!Ir!=3Q>eJ>Gkq;ZN{<1avGmcEt+=BlMq;WwpX18jyuMtJ;-lSici; zCmkIT1w6^HG}L=`DCMyUHEXcYUtV)&F%en$t^MrDqYL2P186b<=bPQ`G%$9a zFD;iVL!(;r>I>^b;)*gTqc>ZwID>*z6BCHBq_iT}OAHm%FJ@#r^}nV8bAmpTf3b7R z4mh7~&{8+=3(lOqjIq~m26V^ zR7$$LTN>$-&a=NWKe(8mQ)}<_yw80vH>nckIhc>iCxLO5c>R{PMyi7D?qO-smn~NR z_s7v{r1I#CDMVyUvJf2gFh8i%Q&PPr?q;Y>1svb|!&0*@@~NAt%o|UlB^ zDyiplN4`S*O7)IS(=TD#b8R&A*%0=PmF3e`pd48PE(j5q35=~BV ztL>lDR0L=G@Q)~h|O~A zU-cZ~KNc7Lj8_xrG|k_dC}eL@3EsMX`QtiX`!q`GMf_rVlxY_b@|!>;r{S!}E&J2E zRBqZ9hiI@u@iDdk30~e)U*YN}d>HB%HnZfREI5zLzX;KNK(C@cuAoZy~SKk*5+RKz|atbwyND zxY*n9!O7KGG9VfC5~p9cD*Y?omc_fx%On}ve=!zDpu9pPaSX)0qw9~()%g;x)gR%h z>N7>iD3r@C=}K_V^o-Cg_CUVG z5sMR7W5g(hwAUeGFmwlVTepw5`B_1NBjK5eR$ML^dWNPlzb<`c+On?GHR{kYtc#|N zaoB9(G0=^#Wlga^h@ZK#*R9asP#lx~5YUT~V?be$U71iyTXsuI;`@<9fiPCX%2Y<`ZenlCxoGb&jv#V65Cxg97xqCHNiG+fO=$2om3ZL2FobkOHJSwH{fX47R z`@r>W5IW;08=u1W=B3sV(P|6k>9tsep-Vh#?T3H<#hbVXHa~@gc7(=mKN7tEZUt5k z|Bw2)5u?<_w3a@?Xta`ZIy@{`cKz5VsI;9BJg2LgnQy=H(lL9pV(4oc->Q?_tKu|J zE}|)`KTLQVy~kb17{|(4pjT9hN$zJ{yVM};_v`)Zv|sk`h%i&RkL zZ*7v0Kx9v z8c1F~bj9c2FSB+rXL$R5?c($gQpU|JH&4Fp2m=$@$ov+`m|M9>seU!*^~Sl685WDczK-nb~`X z4*FDf6#u{g1k%gn_Iq{t&6!rf?`x5EZx@z-e;FUZl^+X|q3NA@Fcg2ri%*Le_Si^S z?g5NI-T)eu+Y9|LrC^b(5zdGZ!_eo|Ta% zWebT$&z%7Da%RZX$q1GA{h+TwLi++Fsj#VyLOcVy_v?k_GCrsIH=U-4Pxs`UcC~av z)~*Agdy%Y?rX{>qlt(zaLWoI!?)_6ZV{{U?LnYZFRCpC->^k05z}*KxSk!U!PH{$@ zVP|ser$34M1z3n*oZBB=3O02ETkT}=5%p^M07$_QXXzq|t2~anUzLneRubyuww12% z3mt2@XSL|U6&8>bzm*VA6s}`_tMoQ_J$)=1&!@2dQ{UsKBc*p_6LL8Z5iJ4#R{xzs ze+FL5;tx~=e1Y5Hmv>^1%Eh{Er&8)bgw%umUg>-M+_lSF4zmuygW!jJKj}St+j(WT zul^&H5tSfPmi6+0jz23$E+pbNQ@iWml2F`-Gw`p}I$ox4tvh9>0S90Gam@ryjYhjJu`8*HRi5wXE9s{4XU>) zi{FSC`BX1O>@X0)4l8UqSJHhRxi)CJzjJ(}2}YsEd&~mKoq|7B_`JEUBPq~>;0VfN z^(d96rCQZi#o!^?MjY3Ryw-zCJO-&K2ki9y8@ub-;$ev9Cr3=3{G<8_E=h+$#i_uR z0F5p9O^S?;Pvst;j)FYDl0__kWeMFY^lsfI*-I|s#^)&0!fDLXD((U@XSGWA2zovu`|or)6H$EzVL*RHyKAec z-PHWnWG{TZBfe!L?=);T-6j)#_iruL*Y_a&A@l1Sp5OOT^6}z-F%tkHX4%mv`USs5xokQ~BSz@2AD#i;Z1-$Bu)-Bz{qT!zg&4X8*YrspLefxRi->%#U zZiowumpd3Y>^q29)*}PCW-6M^+nRO+gr@-9M#O)U^RebXLai@=Evxh>_ZvIOW0&)% z4#EnV$wNgVgYa*DLpo==ag7CE$KK?lY$tF(`MEytC%kxee7xBEOwJwNbC!5PG#?eJ zcjCTF-%gX6k{=h4Df$E_Liu>jjRG>*Kk@z8aHfQmH9wjs0-CO;;T~$N6<7Sknr2>9 z60?~^Thy9c6*(XPNA~dWF!MX_&A*>12R5H_>j}UR_`lI(J`ke#`}+giZUAY!-Um{x zgD*Alhv*Q*1>dAShx|vgV_iHcsgzAs8XEF!8-q<45>^MEKZO|$1F@Rj$xrnNi2rWy z8563>7&fsS$@ZaF+pX8h@Q_7l)`54{ldn1=woxA9d!=j>R^H9;+ru)Uz9#N)ML z*=IdWIFow&g-g-`+LRVG%od9|<_9#CTo4XZ#4n>2c=aR05}{2(%5OjiuMJzs&PgGh zKe?c|>36{3brZkD23GrNCLWfK;IHmKhb0I+cT(FM&RE{4Zu_O5zZuu>0zAzl5F8ns znm!D1*5tT#VdOs@*-O!m&$mB&P7B^F+UIkA`?aYRc&`h0POW&YvRAQ;7@?j+4*cKeZBCy-y8)DPjowf`SaAm^VGg}doS}5T@-nl6VCF_ z(JDam$p)%>hwg2KsOK=gM?kErgO$_8OET1nT=~_WLSYQ`S19&w>}2Ld)w2tpo_x!* z=)(tf^o#WvZx%Xndy^e6876k~I}p~gGQTQJ5wXf?!-`y#(3)PdBqGU#s#q`-mIM`1 zto_>Z&NX5d`LMxr-5~cpUW3<;a?6F<53TI<7;Exdu9~$vbq8w+c~5*wbojeF9M^?9 zNu?!CXc6W?rJ`54Ry3=^RSCazc7R zmh%!nRPB!)6%xfjBNI&tmFD(!P-_=y&oK>zBo#`8R@7F zW}6z61IfS3wCjwecD_h-b;e|oYvX=1v_Yc#1Gg}ZQoQ1r)_u5w5rxJ@(_Aoi#50W<_=*Sy!sLPrE(%SQ`Ep6WaDDjxEGd_`_vyA;>9qgR+ zLnQ50xGs7m@oz4DKKI*oaBf%m1CJM>IMk@pyz1xmtUm9;lA!3=bJy8hXoEA4+j9&la1w6qi-9}g6#-``#A z04$SrR8`%5H=xAKPo(gvc8w@a*IR^T!xZ`B-X?oD_5ld{oBJuuor9)39+gWH9&+x z4fQn;tb^A}KQA7hZCx+FyN~zw)!Qxo8J>`;W6D`u9MLePi;3|1yOW#)=W7%tB008) zLE)i~S*_w~>bMR}B131LVL$V-^^K$VmjetrN&$-Og`n7Mzqw1e<6J4Tig|@A2d{?j?Z&+z`+; z#3O@ab8$XcFP-htH`+J~&+K@p;F8()6rh*MiIGzV^`!sMG~r}?#Wu5>Y7y>YliIzO z*tQh?gOIWSwY6CehKqeFzx1VVggkSx?eQ2#v(-;U_9&6w%rbcdilW;TEUT$NZ>~Ve zgB&bds1g!1rmTcX*IMEvNt1d!@@T^-h>g5h{DzH)opN5?_}Bb(?5X?UD?ZAF4>V*M zQoh$fSF3)_=$G3D#MTH~X9(ye2|b+uLO{Rz{B%b4bNueX@+1ofiGpfoi5Nt59m4U- z4+umD`J55-D_-fxT3Z;UWvhqpCzc~WzcS#SzPArAM8fn~?lsV7Lz7`eucx=nW_&

KJEOD;d%ZD zEXo7F<;umsaT1W=QyeT{t$xzS66ma9PVVE4kVIAFr5Wm=Rgz7jN)r`-b0&|PD)$yP zc`pA414T~`KV8m=et$g#6f%KIXdSd(qs907R4QRHa12*mV877(dIqjZrQ5Qq7RBf7 zmu|y0ZPXXZfSy?yG*Me$=E~vWjpu~!@@1ofGGa0bz5F%F?Cg=(@KWtM{qtRCRgM3_ zG~T4Sgd!Q22qUq22FP|IpD}gFUswOhonvIGq&qR1or-Whf&vEmO+7uIBq2@m9)_lf ztjrp>fo5O?L-=4N*7G4CX@({rlPg5Q=hM2m=C5`5v8I-bSWsHiGcJQJ-S6-~NV??n$q4Wf8?}dD;8SUFs?la%RA4KwZ1c>Nhh1Y@s_r`0@ zMQ!Ijq4Z%MpmSW7kqGxlTn2P_JP$Fmn0&%GZ4Ntm)_b;aF<8kVakm_@k4+q$p#r`c zOdPr*{TH7tsOc=eukOf6diKd$KJlX^gN5i-eZF)6s7*_0jMv&fxt=Vy=kP6-ACZU> zZ?Mcqzj#cF`+<+Vl8m^w2H1*JwkPrV@x|PZB$x7kB52c`5@r83f4GOVJzw{(rgUB)|E5dbhlZKwYx_W!SUj0cC+~<8`E|1D`#Y@r3 zXwnr)oys0Ui8iyeE$q_z^gH20J*&la4D- zY?kZmQr_nilLgWr9qEieV8-a2DNG5YPd3U0$Y-Hzt7*+U{q5OUd2&4^#jM79IJ5d` zilBC{+<2UBvnp!=@B)!tsE{60@>6D26C+OPcl_PjK@9D9ujxoRm&W3|xm`9LoHQ|K z6HU93d=GFZAJ*dci&0R%k1bI0iu?JA(0aXM-&J+BAS99&bJ|-yr&uJ5$F^y#U=tUQ>~ecy`pnhwW@|6(`l;oxO2Q?q3uR zT=*(}4z28x!r`E0c}j&u@1S1;ndNK|BX{~j!0a(5)#$a9hue`hwOin@#{8Q5#pFjU z@HXyG4%JP4jIdA&W~K&jLJS1kY9-(dyKF>YP}G|&8`A(q&^K_ji>7v7sqY5 zSIXH!rOacJ&|1VeJd6-N$y3O_S=1malaCWi}j?1LS2NQ#N zqIkkUC2`85_30G)5np!Ad{x3CQzs~x3cY>Bm?nit(hn+g90o!$x5eS>OFZtE-_X3B zcesIxrBkhX?sx^*`{5selvu?yTw_=~`jOy1%6Z;5ZFISJjS(@T9^5_dKdi2;K6m6< zIYwL8FMyGHzmwgDi(fPJL+mK^4!F9>F=_P7yF>QHCcX=4%Trt8DYg+S0CkhYYZT>G z2u?{^7i0P=h6eHlbTuyzls>EE!iMD=_# z;QMXqn;d-pwF^tH>Q)?qa1sl@5XCMnSGK%N&AMl%RC9@3G$;C|Hx4Pp)F2zn>S}vAOnS8V=Kp+RaR%Z^34$0Nd zwnd35I}4I`$dTYlxjPNgjyxZzt7AsH%0AbyRUvJnz@}QR8ePx1bBP~C{hDp3s$GL_ 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 literal 0 HcmV?d00001 diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/fig/wp__coord__interp.png b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/fig/wp__coord__interp.png index 78515c4b3eb6d5da0a80a9e0185821bce66c4477..a1c04108b4968a51817a8b69d1b6fce844e2dad8 100644 GIT binary patch delta 27272 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 af%Wg~%bsj%%mXa=QM;|B^j^U{@c#gZVGaoZ delta 27134 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 -#include #include - -// Namespace alias. -namespace BC = CGAL::Barycentric_coordinates; +#include +#include // Some convenient typedefs. typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel; @@ -14,12 +11,11 @@ typedef Kernel::Point_2 Point; typedef std::vector Scalar_vector; typedef std::vector Point_vector; -typedef Point_vector::iterator InputIterator; typedef std::back_insert_iterator Vector_insert_iterator; typedef boost::optional Output_type; -typedef BC::Discrete_harmonic_2 Discrete_harmonic; -typedef BC::Generalized_barycentric_coordinates_2 Discrete_harmonic_coordinates; +typedef CGAL::Barycentric_coordinates::Discrete_harmonic_2 Discrete_harmonic; +typedef CGAL::Barycentric_coordinates::Generalized_barycentric_coordinates_2 Discrete_harmonic_coordinates; using std::cout; using std::endl; using std::string; @@ -37,7 +33,7 @@ int main() // Instantiate the class with discrete harmonic coordinates for the unit square defined above. Discrete_harmonic_coordinates discrete_harmonic_coordinates(vertices.begin(), vertices.end()); - // Print some information about the polygon and coordinate functions. + // Print some information about the polygon and coordinates. discrete_harmonic_coordinates.print_information(); // Instantiate the center point of the unit square. diff --git a/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Height_interpolation_for_terrain_modelling_example.cpp b/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Height_interpolation_for_terrain_modelling_example.cpp new file mode 100644 index 00000000000..90b256d74bf --- /dev/null +++ b/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Height_interpolation_for_terrain_modelling_example.cpp @@ -0,0 +1,127 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Some convenient typedefs. + +// General. +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef CGAL::Projection_traits_xy_3 Projection; +// typedef Kernel Projection; + +typedef Projection::FT Scalar; +typedef Projection::Point_2 Point; + +typedef std::vector Scalar_vector; +typedef std::vector Point_vector; + +// Coordinates related. +typedef CGAL::Barycentric_coordinates::Mean_value_2 Mean_value; +typedef CGAL::Barycentric_coordinates::Generalized_barycentric_coordinates_2 Mean_value_coordinates; + +// Triangulation related. +typedef CGAL::Delaunay_mesh_face_base_2 Face_base; +typedef CGAL::Triangulation_vertex_base_2 Vertex_base; +typedef CGAL::Triangulation_data_structure_2 TDS; +typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; +typedef CGAL::Delaunay_mesh_size_criteria_2 Criteria; +typedef CGAL::Delaunay_mesher_2 Mesher; +typedef CDT::Finite_vertices_iterator Vertex_iterator; +typedef CDT::Vertex_handle Vertex_handle; + +// Interpolation related. +typedef CGAL::Interpolation_traits_2 Interpolation_traits; +typedef CGAL::Data_access< std::map > Value_access; + +// STD. +using std::cout; using std::endl; using std::string; + +int main() +{ + // Construct a polygon bounding a piece of three-dimensional terrain. + // Note that z-coordinate of each vertex represents the height function. + // Projection in 2D is done automatically by the Projection traits class. + Point_vector vertices; + const int number_of_vertices = 50; + vertices.resize(number_of_vertices); + + vertices[0] = Point(0.03, 0.05, 0.000); vertices[1] = Point(0.07, 0.04, 10.00); vertices[2] = Point(0.10, 0.04, 20.00); + vertices[3] = Point(0.14, 0.04, 30.00); vertices[4] = Point(0.17, 0.07, 40.00); vertices[5] = Point(0.19, 0.09, 50.00); + vertices[6] = Point(0.22, 0.11, 60.00); vertices[7] = Point(0.25, 0.11, 70.00); vertices[8] = Point(0.27, 0.10, 80.00); + vertices[9] = Point(0.30, 0.07, 90.00); vertices[10] = Point(0.31, 0.04, 100.0); vertices[11] = Point(0.34, 0.03, 110.0); + vertices[12] = Point(0.37, 0.02, 120.0); vertices[13] = Point(0.40, 0.03, 130.0); vertices[14] = Point(0.42, 0.04, 140.0); + vertices[15] = Point(0.44, 0.07, 150.0); vertices[16] = Point(0.45, 0.10, 160.0); vertices[17] = Point(0.46, 0.13, 170.0); + vertices[18] = Point(0.46, 0.19, 180.0); vertices[19] = Point(0.47, 0.26, 190.0); vertices[20] = Point(0.47, 0.31, 200.0); + vertices[21] = Point(0.47, 0.35, 210.0); vertices[22] = Point(0.45, 0.37, 220.0); vertices[23] = Point(0.41, 0.38, 230.0); + vertices[24] = Point(0.38, 0.37, 240.0); vertices[25] = Point(0.35, 0.36, 250.0); vertices[26] = Point(0.32, 0.35, 260.0); + vertices[27] = Point(0.30, 0.37, 270.0); vertices[28] = Point(0.28, 0.39, 280.0); vertices[29] = Point(0.25, 0.40, 290.0); + vertices[30] = Point(0.23, 0.39, 300.0); vertices[31] = Point(0.21, 0.37, 310.0); vertices[32] = Point(0.21, 0.34, 320.0); + vertices[33] = Point(0.23, 0.32, 330.0); vertices[34] = Point(0.24, 0.29, 340.0); vertices[35] = Point(0.27, 0.24, 350.0); + vertices[36] = Point(0.29, 0.21, 360.0); vertices[37] = Point(0.29, 0.18, 370.0); vertices[38] = Point(0.26, 0.16, 380.0); + vertices[39] = Point(0.24, 0.17, 390.0); vertices[40] = Point(0.23, 0.19, 400.0); vertices[41] = Point(0.24, 0.22, 410.0); + vertices[42] = Point(0.24, 0.25, 420.0); vertices[43] = Point(0.21, 0.26, 430.0); vertices[44] = Point(0.17, 0.26, 440.0); + vertices[45] = Point(0.12, 0.24, 450.0); vertices[46] = Point(0.07, 0.20, 460.0); vertices[47] = Point(0.03, 0.15, 470.0); + vertices[48] = Point(0.01, 0.10, 480.0); vertices[49] = Point(0.02, 0.07, 490.0); + + // Mesh this polygon. + + // Create a constrained Delaunay triangulation. + CDT cdt; + + std::vector vertex_handle(number_of_vertices); + + // Insert vertices of the polygon as our initial point set. + for(int i = 0; i < number_of_vertices; ++i) vertex_handle[i] = cdt.insert(vertices[i]); + + // Insert constraints - edges of the polygon - in order to mesh only the polygon's interior. + for(int i = 0; i < number_of_vertices; ++i) cdt.insert_constraint(vertex_handle[i], vertex_handle[(i + 1) % number_of_vertices]); + + Mesher mesher(cdt); + + // Set a criteria on how to mesh. + mesher.set_criteria(Criteria(0.01, 0.01)); + + // Mesh the polygon. + mesher.refine_mesh(); + + // Compute mean value coordinates and use them to interpolate data from the polygon's boundary to its interior. + + // Associate each point with the corresponding function value and coordinates. + std::map point_function_value; + std::vector< std::pair > point_coordinates(number_of_vertices); + + for(int i = 0; i < number_of_vertices; ++i) + point_function_value.insert(std::make_pair(vertices[i], vertices[i].z())); + + // Create an instance of the class with mean value coordinates. + Mean_value_coordinates mean_value_coordinates(vertices.begin(), vertices.end()); + + // Store all new interior points with interpolated data here. + std::vector points(cdt.number_of_vertices()); + + // Compute coordinates and interpolate the boundary data to the polygon's interior. + int index = 0; + for(Vertex_iterator vertex_iterator = cdt.finite_vertices_begin(); vertex_iterator != cdt.finite_vertices_end(); ++vertex_iterator) { + Scalar_vector coordinates; + + const Point &point = vertex_iterator->point(); + mean_value_coordinates(point, std::back_inserter(coordinates)); + + for(int j = 0; j < number_of_vertices; ++j) + point_coordinates[j] = std::make_pair(vertices[j], coordinates[j]); + + Scalar f = CGAL::linear_interpolation(point_coordinates.begin(), point_coordinates.end(), Scalar(1), Value_access(point_function_value)); + points[index] = Point(point.x(), point.y(), f); + cout << "The interpolated height with index " << index << " is " << f << ";" << endl; + ++index; + } + + return EXIT_SUCCESS; +} diff --git a/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Mean_value_coordinates_example.cpp b/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Mean_value_coordinates_example.cpp index cbe12a5e359..183f484d060 100644 --- a/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Mean_value_coordinates_example.cpp +++ b/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Mean_value_coordinates_example.cpp @@ -1,9 +1,6 @@ -#include #include #include - -// Namespace alias. -namespace BC = CGAL::Barycentric_coordinates; +#include // Some convenient typedefs. typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -14,12 +11,11 @@ typedef Kernel::Point_2 Point; typedef std::vector Scalar_vector; typedef std::vector Point_vector; -typedef Point_vector::iterator InputIterator; typedef std::back_insert_iterator Vector_insert_iterator; typedef boost::optional Output_type; -typedef BC::Mean_value_2 Mean_value; -typedef BC::Generalized_barycentric_coordinates_2 Mean_value_coordinates; +typedef CGAL::Barycentric_coordinates::Mean_value_2 Mean_value; +typedef CGAL::Barycentric_coordinates::Generalized_barycentric_coordinates_2 Mean_value_coordinates; using std::cout; using std::endl; using std::string; @@ -38,7 +34,7 @@ int main() // Instantiate the class with mean value coordinates for the polygon defined above. Mean_value_coordinates mean_value_coordinates(vertices.begin(), vertices.end()); - // Print some information about the polygon and coordinate functions. + // Print some information about the polygon and coordinates. mean_value_coordinates.print_information(); // Instantiate some interior points in the polygon. @@ -52,9 +48,10 @@ int main() // Compute mean value coordinates for all the defined interior points. // We speed up the computation using the O(n) algorithm called with the parameter CGAL::Barycentric_coordinates::FAST. + // The default one is CGAL::Barycentric_coordinates::PRECISE. const CGAL::Barycentric_coordinates::Type_of_algorithm type_of_algorithm = CGAL::Barycentric_coordinates::FAST; - // Use the parameter query_point_location = CGAL::Barycentric_coordinates::ON_BOUNDED_SIDE. + // We also speed up the computation by using the parameter query_point_location = CGAL::Barycentric_coordinates::ON_BOUNDED_SIDE. const CGAL::Barycentric_coordinates::Query_point_location query_point_location = CGAL::Barycentric_coordinates::ON_BOUNDED_SIDE; for(int i = 0; i < number_of_interior_points; ++i) { @@ -68,7 +65,7 @@ int main() cout << "Coordinate " << j + 1 << " = " << coordinates[i * number_of_vertices + j] << endl; } - // If we need only the unnormalized weights for the last point, we can compute them as follows. + // If we need only the unnormalized weights for some point (lets take the last one), we can compute them as follows. // Instantiate an std::vector to store weights. Scalar_vector weights; @@ -84,14 +81,14 @@ int main() // Invert this sum. const Scalar mv_inverted_denominator = Scalar(1) / mv_denominator; - // Output mean value weights. + // Output the mean value weights. const string status = (result ? "SUCCESS." : "FAILURE."); cout << endl << "Status of the weights' computation for the point " << last_point_index + 1 << ": " << status << endl; for(int j = 0; j < number_of_vertices; ++j) cout << "Weight " << j + 1 << " = " << weights[j] << endl; - // Now, if we normalize the weight functions, we recover values of the mean value coordinates for the last point computed earlier. + // Now, if we normalize the weights, we recover values of the mean value coordinates for the last point computed earlier. cout << endl << "After normalization, for the point " << last_point_index + 1 << " mean value coordinates are " << endl; for(int j = 0; j < number_of_vertices; ++j) cout << "Coordinate " << j + 1 << " = " << weights[j] * mv_inverted_denominator << endl; diff --git a/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Segment_coordinates_example.cpp b/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Segment_coordinates_example.cpp index 4b217bcb1dc..1107113cfba 100644 --- a/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Segment_coordinates_example.cpp +++ b/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Segment_coordinates_example.cpp @@ -1,5 +1,5 @@ -#include #include +#include // Namespace alias. namespace BC = CGAL::Barycentric_coordinates; @@ -17,8 +17,8 @@ using std::cout; using std::endl; using std::string; int main() { // Construct a segment. - const Point first_vertex = Point(0, Scalar(2)/Scalar(5)); - const Point second_vertex = Point(2, Scalar(2)/Scalar(5)); + const Point first_vertex(0, Scalar(2)/Scalar(5)); + const Point second_vertex(2, Scalar(2)/Scalar(5)); // Instantiate three interior and two exterior query points. const Point query_points[5] = { Point(Scalar(2) /Scalar(5), Scalar(2)/Scalar(5)), // interior query points @@ -29,13 +29,13 @@ int main() }; // Compute segment coordinates for all the defined points. - // We use a static function and return segment coordinates stored in the CGAL::cpp11::array data structure. + // We use a global function and return the segment coordinates stored in an array of the type CGAL::cpp11::array. cout << endl << "Computed segment coordinates are: " << endl << endl; for(int i = 0; i < 5; ++i) { const Pair pair = BC::compute_segment_coordinates_2(first_vertex, second_vertex, query_points[i], Kernel()); // Output both coordinates for each point. - cout << "Pair of coordinates # " << i + 1 << " = (" << pair[1] << ", " << pair[2] << ");" << endl; + cout << "Pair of coordinates # " << i + 1 << " = (" << pair[0] << ", " << pair[1] << ");" << endl; } cout << endl; diff --git a/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Triangle_coordinates_example.cpp b/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Triangle_coordinates_example.cpp index d0c71773091..1e4911be550 100644 --- a/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Triangle_coordinates_example.cpp +++ b/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Triangle_coordinates_example.cpp @@ -1,8 +1,5 @@ -#include #include - -// Namespace alias. -namespace BC = CGAL::Barycentric_coordinates; +#include // Some convenient typedefs. typedef CGAL::Simple_cartesian Kernel; @@ -12,16 +9,16 @@ typedef Kernel::Point_2 Point; typedef std::vector Scalar_vector; -typedef BC::Triangle_coordinates_2 Triangle_coordinates; +typedef CGAL::Barycentric_coordinates::Triangle_coordinates_2 Triangle_coordinates; using std::cout; using std::endl; using std::string; int main() { // Construct a triangle. - const Point first_vertex = Point(0.0f, 0.0f); - const Point second_vertex = Point(2.0f, 0.5f); - const Point third_vertex = Point(1.0f, 2.0f); + const Point first_vertex(0.0f, 0.0f); + const Point second_vertex(2.0f, 0.5f); + const Point third_vertex(1.0f, 2.0f); // Create an std::vector to store coordinates. Scalar_vector coordinates; @@ -29,7 +26,7 @@ int main() // Instantiate the class Triangle_coordinates_2 for the triangle defined above. Triangle_coordinates triangle_coordinates(first_vertex, second_vertex, third_vertex); - // Print some information about the triangle and coordinate functions. + // Print some information about the triangle and coordinates. triangle_coordinates.print_information(); // Instantiate some interior, boundary, and exterior query points for which we compute coordinates. diff --git a/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Triangle_coordinates_speed_test.cpp b/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Triangle_coordinates_speed_test.cpp index 98925608764..44422f1e68c 100644 --- a/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Triangle_coordinates_speed_test.cpp +++ b/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Triangle_coordinates_speed_test.cpp @@ -1,6 +1,6 @@ #include -#include #include +#include // Construct an iterator that takes as input the current data type and pointer to the first element in the standard C++ array. template @@ -21,9 +21,6 @@ public: inline void operator++ () { ++pointer; } }; -// Namespace alias. -namespace BC = CGAL::Barycentric_coordinates; - // Some convenient typedefs. typedef CGAL::Real_timer Timer; @@ -34,7 +31,7 @@ typedef Kernel::Point_2 Point; typedef overwrite_iterator Overwrite_iterator; -typedef BC::Triangle_coordinates_2 Triangle_coordinates; +typedef CGAL::Barycentric_coordinates::Triangle_coordinates_2 Triangle_coordinates; using std::cout; using std::endl; using std::string; @@ -55,9 +52,9 @@ int main() const Scalar y_step = one / Scalar(number_of_y_coordinates); // Create a right triangle with a slight offset from zero. - const Point first_vertex = Point(zero - x_step, zero - x_step); - const Point second_vertex = Point(two + y_step , zero - x_step); - const Point third_vertex = Point(zero - x_step, two + y_step ); + const Point first_vertex(zero - x_step, zero - x_step); + const Point second_vertex(two + y_step, zero - x_step); + const Point third_vertex(zero - x_step, two + y_step); // Instantiate the class Triangle_coordinates_2 for the right triangle defined above. Triangle_coordinates triangle_coordinates(first_vertex, second_vertex, third_vertex); diff --git a/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Wachspress_coordinates_example.cpp b/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Wachspress_coordinates_example.cpp index 5107b8398dd..743402c330b 100644 --- a/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Wachspress_coordinates_example.cpp +++ b/Barycentric_coordinates_2/examples/Barycentric_coordinates_2/Wachspress_coordinates_example.cpp @@ -1,11 +1,8 @@ #include -#include -#include -#include #include - -// Namespace alias. -namespace BC = CGAL::Barycentric_coordinates; +#include +#include +#include // Some convenient typedefs. typedef CGAL::Simple_cartesian Kernel; @@ -18,10 +15,8 @@ typedef std::vector Point_vector; typedef CGAL::Creator_uniform_2 Creator; -typedef Point_vector::iterator InputIterator; - -typedef BC::Wachspress_2 Wachspress; -typedef BC::Generalized_barycentric_coordinates_2 Wachspress_coordinates; +typedef CGAL::Barycentric_coordinates::Wachspress_2 Wachspress; +typedef CGAL::Barycentric_coordinates::Generalized_barycentric_coordinates_2 Wachspress_coordinates; using std::cout; using std::endl; using std::string; @@ -46,7 +41,7 @@ int main() // Instantiate the class with Wachspress coordinates for the convex polygon defined above. Wachspress_coordinates wachspress_coordinates(vertices.begin(), vertices.end()); - // Print some information about the polygon and coordinate functions. + // Print some information about the polygon and coordinates. wachspress_coordinates.print_information(); // Compute Wachspress coordinates for all the randomly defined points. diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Discrete_harmonic_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Discrete_harmonic_2.h index a25093f6b5c..e3232b132f2 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Discrete_harmonic_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Discrete_harmonic_2.h @@ -55,8 +55,6 @@ namespace Barycentric_coordinates { \cgalModels `BarycentricCoordinates_2` \pre The provided polygon is strictly convex. - -\attention Weight functions (coordinates without normalization) are allowed to be computed for an arbitrary polygon. */ diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Generalized_barycentric_coordinates_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Generalized_barycentric_coordinates_2.h index 6a3e24ce554..f3726d04ca6 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Generalized_barycentric_coordinates_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Generalized_barycentric_coordinates_2.h @@ -44,7 +44,7 @@ namespace Barycentric_coordinates { /*! * \ingroup PkgBarycentric_coordinates_2 - * The class `Generalized_barycentric_coordinates_2` implements the behaviour of generalized barycentric coordinates along the polygon's boundary and provides a common interface for all coordinate classes. + * The class `Generalized_barycentric_coordinates_2` implements generalized barycentric coordinates along the polygon's boundary and provides a common interface for all coordinate classes. * This class is parameterized by a coordinate class `Coordinate_2`, and a traits class `Traits`. \tparam Coordinate_2 must be a model of the concept `BarycentricCoordinates_2`. @@ -81,7 +81,7 @@ public: /// \name Creation /// @{ - /// Creates the class `Generalized_barycentric_coordinates_2` that implements the behaviour of generalized barycentric coordinates along the polygon's boundary given by a range of vertices `[first_vertex, last_vertex)`. + /// Creates the class `Generalized_barycentric_coordinates_2` that implements generalized barycentric coordinates along the polygon's boundary given by a range of vertices `[first_vertex, last_vertex)`. /// `InputIterator` must be an input iterator with a value type equivalent to `Traits::Point_2`. /// \pre Number of the polygon's vertices > 2. /// \pre The provided polygon is simple. diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h index 244f8dd5cca..10567b72e51 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h @@ -28,11 +28,13 @@ #include // CGAL headers. +#include #include -#include +#include // Boost headers. #include +#include // CGAL namespace. namespace CGAL { @@ -309,23 +311,24 @@ private: // Following section 4.2 from [2] we denote P_j = r_j*r_{j+1} + dot_product(d_j, d_{j+1}). // Vector s_i from [1] corresponds to that one with the name d_i in [2]. - for(int j = 0; j < n-1; ++j) P[j] = r[j]*r[j+1] + s[j]*s[j+1]; - P[n-1] = r[n-1]*r[0] + s[n-1]*s[0]; + for(int j = 0; j < n-1; ++j) + P[j] = CGAL::max(r[j]*r[j+1] + scalar_product_2(s[j], s[j+1]), FT(0)); + P[n-1] = CGAL::max(r[n-1]*r[0] + scalar_product_2(s[n-1], s[0]), FT(0)); // Compute mean value weights using the formula (16) from [2]. // Since the formula (16) always gives positive values, we have to add a proper sign to all the weight functions. - weight[0] = r[n-1]*r[1] - s[n-1]*s[1]; + weight[0] = r[n-1]*r[1] - scalar_product_2(s[n-1], s[1]); for(int j = 1; j < n-1; ++j) weight[0] *= P[j]; weight[0] = sign_of_weight(A[n-1], A[0], B[0])*sqrt(weight[0]); for(int i = 1; i < n-1; ++i) { - weight[i] = r[i-1]*r[i+1] - s[i-1]*s[i+1]; + weight[i] = r[i-1]*r[i+1] - scalar_product_2(s[i-1], s[i+1]); for(int j = 0; j < i-1; ++j) weight[i] *= P[j]; for(int j = i+1; j < n; ++j) weight[i] *= P[j]; weight[i] = sign_of_weight(A[i-1], A[i], B[i])*sqrt(weight[i]); } - weight[n-1] = r[n-2]*r[0] - s[n-2]*s[0]; + weight[n-1] = r[n-2]*r[0] - scalar_product_2(s[n-2], s[0]); for(int j = 0; j < n-2; ++j) weight[n-1] *= P[j]; weight[n-1] = sign_of_weight(A[n-2], A[n-1], B[n-1])*sqrt(weight[n-1]); diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Segment_coordinates_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Segment_coordinates_2.h index b6b4b5b5cf2..4b4f970c029 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Segment_coordinates_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Segment_coordinates_2.h @@ -79,7 +79,7 @@ public: /// \name Creation /// @{ - /// Creates the class `Segment_coordinates_2` that implements the behaviour of segment coordinates with respect to an arbitrary non-degenerate segment along an arbitrary line in the plane. + /// Creates the class `Segment_coordinates_2` that implements segment coordinates with respect to an arbitrary non-degenerate segment along an arbitrary line in the plane. /// The segment is given by its two vertices. /// \pre Segment is not degenerate. Segment_coordinates_2(const Point_2 &first_vertex, const Point_2 &second_vertex, const Traits &b_traits = Traits()) : @@ -203,6 +203,7 @@ private: // Global functions /*! + \anchor seg_coord_global * \relates Segment_coordinates_2 * This is a global function that takes both vertices of a segment and computes segment coordinates at a given query point with respect to these vertices. diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Triangle_coordinates_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Triangle_coordinates_2.h index f093b9c8c61..9fe93dfe24b 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Triangle_coordinates_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Triangle_coordinates_2.h @@ -81,7 +81,7 @@ public: /// \name Creation /// @{ - /// Creates the class `Triangle_coordinates_2` that implements the behaviour of triangle coordinates with respect to an arbitrary non-degenerate triangle in the plane. + /// Creates the class `Triangle_coordinates_2` that implements triangle coordinates with respect to an arbitrary non-degenerate triangle in the plane. /// The triangle is given by its three vertices. /// \pre Triangle is not degenerate. Triangle_coordinates_2(const Point_2 &first_vertex, const Point_2 &second_vertex, const Point_2 &third_vertex, const Traits &b_traits = Traits()) : diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Wachspress_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Wachspress_2.h index b381e8ee035..154595b2b24 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Wachspress_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Wachspress_2.h @@ -54,9 +54,7 @@ namespace Barycentric_coordinates { \cgalModels `BarycentricCoordinates_2` -\pre The provided polygon is strictly convex. - -\attention Weight functions (coordinates without normalization) are allowed to be computed for an arbitrary polygon. +\pre The provided polygon is strictly convex. */ diff --git a/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/copyright b/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/copyright index 379ab1600ab..ad96e5727c9 100644 --- a/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/copyright +++ b/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/copyright @@ -1 +1 @@ -Università della Svizzera italiana (Switzerland) and INRIA Sophia-Antipolis (France). +Università della Svizzera italiana (Switzerland) and INRIA Sophia-Antipolis (France) diff --git a/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/description.txt b/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/description.txt index 6241980d131..ab0d977ebf0 100644 --- a/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/description.txt +++ b/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/description.txt @@ -1 +1 @@ -2D Generalized Barycentric Coordinates for simple polygons. +2D Generalized Barycentric Coordinates for simple polygons diff --git a/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/license.txt b/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/license.txt index 47acd0824c4..8bb8efcb72b 100644 --- a/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/license.txt +++ b/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/license.txt @@ -1 +1 @@ -GPL (v3 or later). +GPL (v3 or later) diff --git a/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/long_description.txt b/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/long_description.txt index f9542364b08..4e4413d731d 100644 --- a/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/long_description.txt +++ b/Barycentric_coordinates_2/package_info/Barycentric_coordinates_2/long_description.txt @@ -1 +1 @@ -The package "2D Generalized Barycentric Coordinates" offers an efficient and robust implementation of two-dimensional closed-form generalized barycentric coordinates defined for simple two-dimensional polygons. If coordinates with respect to multivariate scattered points instead of a polygon are required, please refer to natural neighbour coordinates from the package \ref chapinterpolation "2D and Surface Function Interpolation". +The package 2D Generalized Barycentric Coordinates offers an efficient and robust implementation of two-dimensional closed-form generalized barycentric coordinates defined for simple two-dimensional polygons. If coordinates with respect to multivariate scattered points instead of a polygon are required, please refer to natural neighbour coordinates from the package 2D and Surface Function Interpolation. diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_speed_test.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_speed_test.cpp index 57b0019877c..87b3a06fe5b 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_speed_test.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_speed_test.cpp @@ -72,4 +72,4 @@ int main() cout << endl << "CPU time to compute Discrete Harmonic coordinates (4 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_speed_test_100_vertices.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_speed_test_100_vertices.cpp index 71a78ea312f..d56221fc861 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_speed_test_100_vertices.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_speed_test_100_vertices.cpp @@ -87,4 +87,4 @@ int main() cout << endl << "CPU time to compute Discrete Harmonic coordinates (100 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_speed_test_with_many_vertices.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_speed_test_with_many_vertices.cpp index 03aadcb57fe..e5a3c5d25df 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_speed_test_with_many_vertices.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_speed_test_with_many_vertices.cpp @@ -84,4 +84,4 @@ int main() cout << endl << "CPU time to compute Discrete Harmonic coordinates (16 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_weights_speed_test.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_weights_speed_test.cpp index c25ce976d9d..1776ed66bb2 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_weights_speed_test.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_weights_speed_test.cpp @@ -72,4 +72,4 @@ int main() cout << endl << "CPU time to compute Discrete Harmonic weights (4 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_weights_speed_test_with_many_vertices.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_weights_speed_test_with_many_vertices.cpp index 564463303c1..f025e2d8876 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_weights_speed_test_with_many_vertices.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Discrete_harmonic_coordinates/DH_weights_speed_test_with_many_vertices.cpp @@ -84,4 +84,4 @@ int main() cout << endl << "CPU time to compute Discrete Harmonic weights (16 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test.cpp index 5b5a52d4230..d67e6aaf1a7 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test.cpp @@ -72,4 +72,4 @@ int main() cout << endl << "CPU time to compute Mean Value coordinates (4 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test_100_vertices.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test_100_vertices.cpp index 8799868b648..8010aabb9b8 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test_100_vertices.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test_100_vertices.cpp @@ -87,4 +87,4 @@ int main() cout << endl << "CPU time to compute Mean Value coordinates (100 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test_with_34_vertices.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test_with_34_vertices.cpp index b6513a40df2..ddf6c8d41ef 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test_with_34_vertices.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test_with_34_vertices.cpp @@ -102,4 +102,4 @@ int main() cout << endl << "CPU time to compute Mean Value coordinates (34 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test_with_many_vertices.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test_with_many_vertices.cpp index 0466f542181..4fc22023de3 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test_with_many_vertices.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_speed_test_with_many_vertices.cpp @@ -84,4 +84,4 @@ int main() cout << endl << "CPU time to compute Mean Value coordinates (16 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_weights_speed_test.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_weights_speed_test.cpp index 6e1b2e2f470..e28aae57070 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_weights_speed_test.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_weights_speed_test.cpp @@ -72,4 +72,4 @@ int main() cout << endl << "CPU time to compute Mean Value weights (4 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_weights_speed_test_with_34_vertices.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_weights_speed_test_with_34_vertices.cpp index c04d31b0754..687ebce3ff3 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_weights_speed_test_with_34_vertices.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_weights_speed_test_with_34_vertices.cpp @@ -102,4 +102,4 @@ int main() cout << endl << "CPU time to compute Mean Value weights (34 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_weights_speed_test_with_many_vertices.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_weights_speed_test_with_many_vertices.cpp index e52e9f70d9c..a9e929ded64 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_weights_speed_test_with_many_vertices.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Mean_value_coordinates/MV_weights_speed_test_with_many_vertices.cpp @@ -84,4 +84,4 @@ int main() cout << endl << "CPU time to compute Mean Value weights (16 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Segment_coordinates/Segment_coordinates_speed_test.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Segment_coordinates/Segment_coordinates_speed_test.cpp index f4fc59e6a75..3632527cecb 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Segment_coordinates/Segment_coordinates_speed_test.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Segment_coordinates/Segment_coordinates_speed_test.cpp @@ -63,4 +63,4 @@ int main() cout << endl << "CPU time to compute Segment coordinates = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Triangle_coordinates/Triangle_coordinates_speed_test.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Triangle_coordinates/Triangle_coordinates_speed_test.cpp index c129a363934..20c56f2e313 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Triangle_coordinates/Triangle_coordinates_speed_test.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Triangle_coordinates/Triangle_coordinates_speed_test.cpp @@ -65,4 +65,4 @@ int main() cout << endl << "CPU time to compute Triangle coordinates = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_speed_test.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_speed_test.cpp index 1e855091759..f29d79f7768 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_speed_test.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_speed_test.cpp @@ -72,4 +72,4 @@ int main() cout << endl << "CPU time to compute Wachspress coordinates (4 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_speed_test_100_vertices.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_speed_test_100_vertices.cpp index 01a0d1b7801..d993555ea3e 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_speed_test_100_vertices.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_speed_test_100_vertices.cpp @@ -87,4 +87,4 @@ int main() cout << endl << "CPU time to compute Wachspress coordinates (100 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_speed_test_with_many_vertices.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_speed_test_with_many_vertices.cpp index 8410b0614a8..3220a902415 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_speed_test_with_many_vertices.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_speed_test_with_many_vertices.cpp @@ -84,4 +84,4 @@ int main() cout << endl << "CPU time to compute Wachspress coordinates (16 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_weights_speed_test.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_weights_speed_test.cpp index 4f65ea1cafd..e75aea2ad0c 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_weights_speed_test.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_weights_speed_test.cpp @@ -72,4 +72,4 @@ int main() cout << endl << "CPU time to compute Wachspress weights (4 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_weights_speed_test_with_many_vertices.cpp b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_weights_speed_test_with_many_vertices.cpp index bddc9ff2a68..1883c7f08d0 100644 --- a/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_weights_speed_test_with_many_vertices.cpp +++ b/Barycentric_coordinates_2/speed_test/Barycentric_coordinates_2/Wachspress_coordinates/WP_weights_speed_test_with_many_vertices.cpp @@ -84,4 +84,4 @@ int main() cout << endl << "CPU time to compute Wachspress weights (16 vertices) = " << mean_time << " seconds." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Almost_degenerate_segment_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Almost_degenerate_segment_test.cpp index 288299d2542..dcf0211c687 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Almost_degenerate_segment_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Almost_degenerate_segment_test.cpp @@ -73,4 +73,4 @@ int main() cout << endl << "Almost_degenerate_segment_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Almost_degenerate_triangle_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Almost_degenerate_triangle_test.cpp index 9746d5a4ec2..846088cf393 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Almost_degenerate_triangle_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Almost_degenerate_triangle_test.cpp @@ -83,4 +83,4 @@ int main() cout << endl << "Almost_degenerate_triangle_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Computation_at_vertices_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Computation_at_vertices_test.cpp index df6d6a32aa4..a28570f9a29 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Computation_at_vertices_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Computation_at_vertices_test.cpp @@ -98,4 +98,4 @@ int main() cout << endl << "Computation_at_vertices_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Computation_on_boundary_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Computation_on_boundary_test.cpp index eb6cb9cae5e..a9f0f713e91 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Computation_on_boundary_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Computation_on_boundary_test.cpp @@ -165,4 +165,4 @@ int main() cout << endl << "Computation_on_boundary_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Computation_on_edges_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Computation_on_edges_test.cpp index 961f2a98bff..b55607623f5 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Computation_on_edges_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Computation_on_edges_test.cpp @@ -98,4 +98,4 @@ int main() cout << endl << "Computation_on_edges_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_almost_degenerate_polygon_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_almost_degenerate_polygon_test.cpp index 48302be9ad5..2fbcbf78da0 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_almost_degenerate_polygon_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_almost_degenerate_polygon_test.cpp @@ -122,4 +122,4 @@ int main() cout << endl << "DH_almost_degenerate_polygon_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_const_linear_precision_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_const_linear_precision_test.cpp index f73ff849f9a..125bae691b1 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_const_linear_precision_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_const_linear_precision_test.cpp @@ -92,4 +92,4 @@ int main() cout << endl << "DH_const_linear_precision_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_triangle_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_triangle_test.cpp index c1254a28136..c514b6664cf 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_triangle_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_triangle_test.cpp @@ -72,4 +72,4 @@ int main() cout << endl << "DH_triangle_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_weights_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_weights_test.cpp index 20d5f480dda..f797371f1b9 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_weights_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/DH_weights_test.cpp @@ -112,4 +112,4 @@ int main() cout << endl << "DH_weights_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_const_linear_precision_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_const_linear_precision_test.cpp index c691dfa44da..e694ac1b698 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_const_linear_precision_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_const_linear_precision_test.cpp @@ -111,4 +111,4 @@ int main() cout << endl << "MV_const_linear_precision_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_special_points_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_special_points_test.cpp index cff9b7ca3b9..f8af1f332fb 100755 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_special_points_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_special_points_test.cpp @@ -122,4 +122,4 @@ int main() cout << endl << "MV_special_points_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_triangle_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_triangle_test.cpp index 5808e746aa8..46898c20531 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_triangle_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_triangle_test.cpp @@ -73,4 +73,4 @@ int main() cout << endl << "MV_triangle_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_weakly_convex_polygon_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_weakly_convex_polygon_test.cpp index f804396d7b5..593f26e7952 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_weakly_convex_polygon_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_weakly_convex_polygon_test.cpp @@ -83,4 +83,4 @@ int main() cout << endl << "MV_weakly_convex_polygon_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_weights_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_weights_test.cpp index 94d2ee5f7bd..d3c0304f707 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_weights_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/MV_weights_test.cpp @@ -83,4 +83,4 @@ int main() cout << endl << "MV_weights_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Segment_coordinates_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Segment_coordinates_test.cpp index a8f414f878b..5f033d2ea95 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Segment_coordinates_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Segment_coordinates_test.cpp @@ -80,4 +80,4 @@ int main() cout << endl << "Segment_coordinates_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Segment_coordinates_with_offset_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Segment_coordinates_with_offset_test.cpp index 121ee246e1d..4da5e9d36ea 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Segment_coordinates_with_offset_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Segment_coordinates_with_offset_test.cpp @@ -80,4 +80,4 @@ int main() cout << endl << "Segment_coordinates_with_offset_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Segment_test_with_point_2.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Segment_test_with_point_2.cpp index 57fe9903ade..5c7bdae3d09 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Segment_test_with_point_2.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Segment_test_with_point_2.cpp @@ -40,4 +40,4 @@ int main() cout << endl << "Segment_test_with_point_2: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Triangle_coordinates_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Triangle_coordinates_test.cpp index 7ad79c5b1da..c2c4d1b27cc 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Triangle_coordinates_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Triangle_coordinates_test.cpp @@ -80,4 +80,4 @@ int main() cout << endl << "Triangle_coordinates_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Triangle_test_with_point_3.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Triangle_test_with_point_3.cpp index 45a42869a49..cc690417a55 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Triangle_test_with_point_3.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/Triangle_test_with_point_3.cpp @@ -42,4 +42,4 @@ int main() cout << endl << "Triangle_test_with_point_3: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_DH_unit_square_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_DH_unit_square_test.cpp index 90fd08c22ac..05d15364f14 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_DH_unit_square_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_DH_unit_square_test.cpp @@ -69,4 +69,4 @@ int main() cout << endl << "WP_DH_unit_square_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_almost_degenerate_polygon_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_almost_degenerate_polygon_test.cpp index ba831c9ca70..5f039a2e492 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_almost_degenerate_polygon_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_almost_degenerate_polygon_test.cpp @@ -123,4 +123,4 @@ int main() cout << endl << "WP_almost_degenerate_polygon_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_const_linear_precision_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_const_linear_precision_test.cpp index 33131ac9951..132963a7937 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_const_linear_precision_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_const_linear_precision_test.cpp @@ -92,4 +92,4 @@ int main() cout << endl << "WP_const_linear_precision_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_triangle_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_triangle_test.cpp index 7a25296fc37..41a3112803e 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_triangle_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_triangle_test.cpp @@ -72,4 +72,4 @@ int main() cout << endl << "WP_triangle_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_weights_test.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_weights_test.cpp index fc91fcbb78b..59af090120f 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_weights_test.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/WP_weights_test.cpp @@ -112,4 +112,4 @@ int main() cout << endl << "WP_weights_test: PASSED." << endl << endl; return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/Barycentric_coordinates_2/todo.txt b/Barycentric_coordinates_2/todo.txt index 4ffb68d1472..4a3d109b7fc 100755 --- a/Barycentric_coordinates_2/todo.txt +++ b/Barycentric_coordinates_2/todo.txt @@ -1,3 +1,5 @@ 1. To make the code parallel. Get iteration number from the thread. Add parallel class to each type of the coordinate functions. Use begin() + offset. Resize vector. Parallel class takes as parameters list of points and polygon. Use random access iterator. - Done but we have problems with it. -2. Add hard tests with epsilon distance away from the polygon’s boundary, which we have discussed during our first group meeting, to current test suit. \ No newline at end of file +2. Add hard tests with epsilon distance away from the polygon’s boundary, which we have discussed during our first group meeting, to current test suit. + +3. Debug the last example. Fix the bug with Projection_traits_xy. \ No newline at end of file