How Many Potatoes are in a Mesh?

How Many Potatoes are in a Mesh?

Marc van Kreveld Department of Information and Computing Sciences, Utrecht University, the Netherlands. m.j.vankreveld@uu.nl, m.loffler@uu.nl.    Maarten Löffler11footnotemark: 1    János Pach Ecole Polytechnique Féderale de Lausanne and Rényi Institute, Budapest. pach@cims.nyu.edu.
Abstract

We consider the combinatorial question of how many convex polygons can be made by using the edges taken from a fixed triangulation of vertices. For general triangulations, there can be exponentially many: we show a construction that has convex polygons, and prove an upper bound in the worst case. If the triangulation is fat (every triangle has its angles lower-bounded by a constant ), then there can be only polynomially many: and .

We also consider the problem of counting convex outerplanar polygons (i.e., they contain no vertices of the triangulation in their interiors) in the same triangulations. In this setting, we get the same exponential bounds in general triangulations, and in fat triangulations. If the triangulation is furthermore compact (the ratio between the longest and shortest distance between any two vertices is bounded), the bounds drop further to for general convex outerplanar polygons, and for fat convex outerplanar polygons.

1 Introduction

It is a common task in combinatorial geometry to give lower and upper bounds for the number of occurrences of a certain subconfiguration in a geometric structure. Well-known examples are the number of vertices in the lower envelope or single face in an arrangement of line segments, the number of triangulations that have a given set of points as their vertices, etc. [10]. In graph drawing, counts of substructures of graphs are also commonly studied. The crossing number is the best known example; number of orientations of edges and page numbers are other examples.

In this paper we analyze how many convex polygons (potatoes) can be constructed by taking unions of triangles taken from a fixed triangulation (mesh) with vertices. Equivalently, we analyze how many convex polygon boundaries can be made using the edges of a fixed triangulation, see Figure 1. For general triangulations there can be exponentially many. However, the lower-bound examples use many triangles with very small angles. When , the smallest angles tend to zero. To understand if this is necessary, we also study the number of convex polygons in a triangulation where all angles are bounded from below by a a fixed constant. It turns out that the number of convex polygons is polynomial in this case.

Fig. 1: A mesh . Three convex polygons that respect are marked.

We also study the same questions when the convex polygon cannot have vertices of interior to it (carrot). This is the same as requiring that the submesh bounded by the convex polygon is outerplanar.

1.1 Related work

This paper is motivated by the potato peeling problem: Find a maximum area convex polygon whose vertices and edges are taken from the triangulation of a given point set [2] or a given polygon [4, 7].

In computational geometry, realistic input models have received considerable attention in the last decades. By making assumptions on the input, many computational problems can be solved provably faster than what is possible without these assumptions. One of the early examples concerned fat triangles: a triangle is -fat if each of its angles is at least , for some fixed constant . Matousek et al. [8] show that the union of -fat triangles has complexity while for general triangles this is . As a consequence, the union of fat triangles can be computed more efficiently as well.

In [1, 5, 6, 9], fat triangulations were used as a realistic input model motivated by polyhedral terrains, sometimes with extra assumptions. Fat triangulations are also related to the meshes computed in the area of high-quality mesh generation. The smallest angle of the elements of the mesh is a common quality measure [3]. In graph drawing, an embedded planar straight-line graph is said to have constant angular resolution any two edges meeting at a vertex make an angle that is at least a constant. Hence, fatness and constant angular resolution are the same for triangulations.

The original definition of realistic terrains applied to triangulations has stronger assumptions than fatness [9]. Besides fatness of the triangles, it assumes that any two edges in the triangulation differ in length by at most a constant factor (compact), and the outer boundary of the triangulation is a fat convex polygon (bounded aspect ratio).

1.2 Results

We present lower and upper bounds on the maximum number of convex polygons in a mesh in several settings. The input can be either a general mesh, a fat mesh (where every angle of each triangle is at least ), or a compact fat mesh (where additionally, the ratio between the shortest and longest edge is at most ). The output can be either a potato (general convex submesh) or a carrot (outerplanar convex submesh, that is, one that contains no vertex of the underlying mesh in its interior), and each can additionally be required to be fat (where the ratio between the largest inscribed disk and the smallest containing disk is at most ).

input mesh output vegetable lower bound upper bound source
general fat carrots Section 3.1
general anything Section 3.2
fat fat potatoes Section 4.1
fat anything Section 4.2
fat fat carrots Section 5.1
fat carrots Section 5.2
compact fat carrots Section 6.1 and 6.2
compact fat fat carrots Section 6.1 and 6.2
Tab. 1: Results in this paper; open spaces are directly implied by other bounds.

In this paper we show that the maximum number of convex polygons in a mesh can be as large as , and we give an upper bound of . If the mesh is -fat, there can be convex polygons, and we show an upper bound of . It is interesting (albeit not surprising) to see a case where fatness reduces the combinatorial complexity from exponential to polynomial. For carrots, the compactness assumption removes the dependency on the fatness parameter from the exponent of . Table 1 summarizes our results. Note that and do not show up; the bounds hold for any constant values of and .

Remark.

In our upper bound arguments, we do not require points to be in general position, and we count all sets of triangles whose union is convex, even if it has collinear edges of on its boundary. In the lower bound constructions, we also use collinear points. This simplifies the exposition, and it is natural to count all convex sets. If one does want to exclude “degenerate potatoes”, then the constructed meshes can be perturbed to be in general position, unless when is precisely an integer: in this setting, the number of fat potatoes in a fat mesh becomes , and the number of fat carrots in a fat mesh becomes .

2 Preliminaries

A mesh is a plane straight-line graph with a finite set of vertices, such that all bounded faces are triangles, the interiors of all triangles are disjoint and the intersection of any pair of triangles is either a vertex or a shared edge. We also denote the set of vertices of a graph by and the set of edges by , and say the size of is . We say a mesh is maximal if its triangles completely cover the convex hull of its vertices.111A maximal mesh is also called a triangulation. A polygon is said to respect a graph if all of its edges belong to .

We assume a mesh is given. We call -fat, for some , if every angle of every triangle of is at least .

Let . We define cyclic addition and subtraction in the usual way, modulo . We call the elements of directions and implicitly associate an element with the vector .

3 Potatoes in general meshes

3.1 Lower bound

Let be a set of points evenly spaced on the upper half of a circle. Assume for some integer , and let the points be , clockwise. Let consist of the convex hull edges, then connect and to , and recursively triangulate the subpolygons by always connecting the furthest pair to the midpoint. The dual of the mesh is a perfectly balanced binary tree. Figure 2 illustrates the construction.

Fig. 2: A set of points on a half-circle, triangulated such that the dual tree is a balanced binary tree.

Let be the number of different convex paths in from to . Then we have

because we can combine every path from to with every path from to , and the extra path is itself. Using this recurrence we can relate the number of vertices used to the number of convex paths obtained: ; ; ; .

Now we place points evenly spaced on the upper half of a circle. We triangulate as above, and also , and so on. We can make groups of points where the first and last point of each group are the same. Each group is triangulated to give convex paths; the rest is triangulated arbitrarily. In total we get convex paths from to . We omit the one from directly to , and use this edge to complete every convex path to a convex polygon instead. The number of convex polygons is .222We can, of course, make larger groups of vertices to slightly improve the lower bound, but this does not appear to affect the given significant digits.

Theorem 1.

There exists a mesh with vertices such that the number of convex polygons that respect is . This is true even if is the Delaunay triangulation of its vertices.

3.2 Upper bound

Let be any mesh with vertices. First, fix a point inside some triangle of , not collinear with any pair of vertices of . We will count only the polygons that contain for now.

For every vertex of , let be the edge that projects onto from . (Assume general position of w.r.t. the vertices.) Let be the graph obtained from by removing all such edges . Figure 3 shows an example. We turn into a directed graph by orienting every edge such that lies to the left of its supporting line. We are interested in the number of simple cycles that respect . Note that has exactly edges, since every vertex not on the convex hull causes one edge to disappear.

Fig. 3: (a) We project each interior vertex of from onto the next edge. (b) The graph obtained by removing the marked edges.

We say a path in is monotone around if the direction from to its vertices increases monotonically.

Lemma 2.

The number of convex polygons in that have in their interior is bounded from above by the number of simple cycles in .

Proof.

With each convex polygon, we associate a cycle by replacing any edges that were removed by the two edges via , recursively. This results in a proper cycle because the convex polygon was already a monotone path around , and this property is maintained. Each convex polygon results in a different cycle because the angle from the vertices of via is always concave. ∎

Observation 3.

The complement of the outer face of is star-shaped with in its kernel.

Observation 4.

Let be an edge on the outer face of from to . Then has outdegree , or has indegree (or both).

Proof.

By Observation 3, there are no outgoing edges from to the right of , and no incoming edges to to the right of . So, if the outdegree of is more than one and the indegree of is more than one, there must have been a vertex in inside the triangle formed by and . But then, this vertex would have been projected from onto , and would not have been in . ∎

If is a subset of the edges of , we also consider the subproblem of counting all simple cycles in that use all edges in , the fixed edges. For a tuple , we define the potential to be the number of vertices of (or ) minus the number of edges in , i.e., . Clearly, the potential of a subproblem is an upper bound on the number of edges that can still be used in any simple cycle.

We will now show that the number of cycles in a subproblem can be expressed in terms of subproblems of smaller potential. Let be the maximum number of simple cycles in any subproblem with potential .

Lemma 5.

The function satisfies

Fig. 4: Two cases for .
Proof.

Let be a subproblem and let . If then , so the number of fixed edges on the cycle is one less than the number of vertices available. Therefore the last edge is also fixed, if any cycle is possible. If , all edges are fixed.

For the general case, suppose all edges on the outer face of are fixed. Then there is only one possible cycle. If any vertex on the outer face has degree and only one incident edge fixed, we fix the other incident edge too. Suppose there is at least one edge, , on the outer face that is not fixed. By Observation 4 one of its neighbours must have degree towards . Assume without loss of generality that this is . We distinguish two cases.

(i) The degree of is , as illustrated in Figure 4. Any cycle in either uses or does not use . If it does not use we have a subproblem of potential . If it uses , it must also use its two incident edges, so we can include these edges in to obtain a subproblem of potential . So, the potential .

(ii) The degree of is larger than , as illustrated in Figure 4. Any cycle in either uses or does not use . If it uses , we can add to to obtain a subproblem of potential . If it does not use , then consider and the edge that leaves on the outer face. Since has indegree but total degree greater than , it must have outdegree greater than . Therefore, by Claim 4, must have indegree . Therefore, also will not be used by any cycle in that does not use , and we can remove and to obtain a smaller graph. Again, we also remove all incident edges; if any of them was fixed we have no solutions. We obtain a subproblem of potential in this case. Again, the potential . ∎

This expression grows at a rate of the root of , which is approximately .

Because every convex polygon must contain at least one triangle of , we just place in each triangle and multiply the bound by . Since is a slight overestimate (by rounding) of the root, we can ignore the factor in the bound.

Theorem 6.

Any mesh with vertices has convex polygons that respect .

4 Potatoes in fat meshes

4.1 Lower bound

Let , and let . Let be a regular -gon, and for each edge of consider the intersection point of the supporting lines of the neighbouring edges. Let be a scaled copy of that goes through these points. Now, consider a sequence of scaled copies of such that the difference between the radii of consecutive copies is always equal. We extend the edges of each copy until they touch . Figure 5 illustrates the construction so far.

Fig. 5: (a) Essential part of the construction, allowing choices for a convex polygon. (b) Final mesh. (c) The construction can be perturbed so as not to have collinear vertices.
Claim 7.

The graph constructed so far allows at least different convex polygons.

We now add vertices and edges to turn the construction into a -fat mesh. We use more vertices per sector, placing vertices on each edge of to ensure that all angles are bounded by . We need vertices to triangulate the interior using some adaptive mesh generation method. The final mesh can be seen in Figure 5.

The construction uses vertices, and since we have , there are vertices in total.

Observe that the triangles of the outer ring are Delaunay triangles. The inner part can also be triangulated with Delaunay triangles, since the Delaunay triangulation maximises the smallest angle of any triangle.

Theorem 8.

There exists a -fat mesh of size such that the number of convex polygons that respect is . This is true even if is required to be the Delaunay triangulation of its vertices.

Remark.

The construction described is highly degenerate. If is not an integer multiple of , then this is not essential, since the potatoes we count all contain a common point (i.e., they will not use both sides of any straight () angle). Therefore, we can perturb the resulting mesh slightly, and the same asymptotic bound applies to meshes in general position. Figure 5 illustrates the resulting shape.

4.2 Upper bound

In this section, we assume that is -fat. We consider paths of edges in , where all edges of the path have roughly the same direction.

Lemma 9.

Let be two vertices, and let be two directions such that . Then there is at most one convex path in from to that uses only directions in .

Fig. 6: Two vertices and that need to be extreme in two directions that differ by at most (indicated by red and blue) define a unique potential convex chain since there can be at most one edge in each sector. In this figure, the two paths do intersect, but do not form a convex chain.
Proof.

Let be the direction bisecting and . Because is -fat, for any vertex in there is at most one incident edge with outgoing direction in , and also at most one with direction in . Because the path needs to be convex, it must first use only edges from and then switch to only edges from . We can follow the unique path of edges with direction in from and the unique path of edges with direction in from . If these paths intersect the concatenation may be a unique convex path from to as desired (clearly, the path is not guaranteed to be convex). Figure 6 illustrates this. ∎

Given a convex polygon that respects , a vertex of is extreme in direction if there are no other vertices of further in that direction, i.e. if lies to the left of the line through with direction .

Let be a set of directions. As an easy corollary of Lemma 9, the vertices of a convex polygon respecting that are extreme in the directions of uniquely define . There are at most choices for each extreme vertex, so the number of convex polygons is at most . Substituting we obtain the following theorem.

Theorem 10.

Any -fat mesh of size has at most convex polygons that respect .

5 Carrots in fat meshes

Recall that carrots are potatoes that have no interior vertices from the mesh. So we expect fewer carrots than potatoes. However, our lower bound construction for general meshes only has potatoes that are also carrots. In this section we therefore consider carrots in fat meshes.

5.1 Lower bound

Fig. 7: (a) An example of a -fat mesh that has carrots. (b) A tower of -- triangles.

Let , and consider a regular -gon . On each edge of , we place a triangle with angles , , and . Then, we subdivide each such triangle into smaller triangles with angles , , and , as illustrated in Figure 7. Finally, we triangulate the internal region of in any way we want, giving a mesh .

Lemma 11.

is convex, -fat, and contains carrots.

Proof.

is convex because . Every angle in the triangles outside is at least , and the angles in the interior of are multiples of . Therefore, every connected subset of is a carrot. The dual tree of has a central component consisting of vertices, and then paths of length . Hence, the number of subtrees of is at least , which is . ∎

We conclude:

Theorem 12.

There exists a -fat mesh of size such that the number of convex outerplanar polygons that respect is .

Remark.

As in the previous section, if is not an integer multiple of , the constructed mesh can be perturbed to be in general position and the same bound holds.

5.2 Upper bound

In this section, we will show that given any -fat mesh , the number of carrots that respect can be at most .

Consider any carrot. We inspect the dual tree of the carrot, and make some observations. Each node of is either a branch node (if it has degree ), a path node (if it has degree ), or a leaf (if it has degree ). Path nodes have one edge on the boundary of the carrot, and leaves have two edges on the boundary of the carrot. Figure 8 shows an example.

Fig. 8: (a) A carrot and its dual tree. (b) The skeleton of the dual tree is the spanning tree of all vertices of degree .
Observation 13.

Let be a leaf node of . The turning angle between the two external edges of is at least .

Proof.

The triangle corresponding to is -fat, so all three angles are at least . Therefore, the angles are at most , and the turning angles are at least . Figure 9 illustrates this. ∎

Observation 14.

Let be a leaf node of and a path node adjacent to . The turning angle between the external edge of and the furthest external edge of is at least .

Proof.

Consider the quadrilateral formed by the two triangles of and . The edge in separating from the rest of has two -fat triangles incident to one of its endpoints, and one to its other endpoint. This means that the turning angle between the edges in the observation is (Figure 9). ∎

Fig. 9: (a) Every leaf causes a turning angle of . (b) Every leaf who is an only child causes a turning angle of .

By Observation 13, the number of leaves in a carrot is bounded by , and therefore, also the number of branch nodes is bounded by . However, the number of path nodes can be unbounded. Consider subtree of that is the spanning tree of all the path nodes. We call the skeleton of the carrot. Figure 8 shows an example. By Observation 14, the number of leaves of is bounded by .

We will charge the carrot to the set of leaves of , and we will argue that every set of triangles in is charged only constantly often (for constant ).

Observation 15.

Let be any set of triangles of . If there exists a carrot that contains all triangles in , then there is a unique smallest such carrot.

Lemma 16.

Let be any set of triangles in . The number of carrots that charge is at most .

Proof.

Consider the tree that is the dual of the unique smallest carrot that contains , as per Observation 15. Any carrot that charges has as its skeleton.

First, we argue that the set of path nodes in any carrot that charges is a subset of . Indeed, if there was any path node in outside , then there would be at least one leaf component of that is disconnected from , and there would be an edge outside that gets charged by the carrot of . Therefore, only branch nodes and leaves can still be added to to obtain a carrot that charges .

Then, we argue that there are at most other nodes that can be part of a carrot that charges . We can augment by adding on components consisting of only leaves and branch nodes. By Observation 13, each such component consumes a turning angle of . Therefore, they can only be added on edges of which have a cap angle of at least . Therefore, there can be at most potential leaves, leading to choices.333Not all potential leaves can be chosen independently, but we ignore this issue since the factor is dominated by the dependency on anyway.

We conclude:

Theorem 17.

Any -fat mesh of size has at most convex outerplanar polygons that respect .

6 Carrots in compact fat meshes

When the mesh is not only fat, but the edge length ratio is also bounded by a constant, we can prove different bounds. We call such meshes compact fat. The combination of fat triangles and an edge length ratio bound implies that all triangles have the same area, up to a constant factor. For simplicity we assume that all edges have constant length and therefore all triangles have constant area. The following lemma is easy to show (see also Moet et al. [9]):

Lemma 18.

Given a compact fat mesh and a line segment of length , the number of triangles intersecting is .

6.1 Lower bound

We distinguish fat carrots and general carrots in compact fat meshes. The trivial lower bound for fat carrots is , for example each separate triangle of the mesh is a fat carrot.

The simple lower bound for general carrots is quadratic: we place the points on a grid and triangulate the row of squares. Clearly there are carrots.

6.2 Upper bound

Let be a carrot and let be its diameter. Then all triangles properly intersecting are part of by convexity. All vertices of these triangles lie on the boundary of , since carrots do not have interior vertices. Since these vertices are at constant distance from each other, a longer diameter implies that becomes less fat.

Observation 19.

For fat carrots, the diameter has constant length.

There are pairs of vertices in a compact fat mesh whose distance is a constant. For each such pair, all fat carrots that have this pair as the diameter lie inside a region of constant area (Figure 10), and hence contains triangles of the mesh by a packing argument. A fat carrot is some subset of these triangles. Hence, the total number of fat carrots in a compact fat mesh is .

Fig. 10: (a) The region where triangles can be for a carrot with diameter . (b) A base carrot and extension possibilities on an outer edge .
Theorem 20.

Any compact fat mesh of size has at most convex fat outerplanar polygons that respect .

We next prove that there are carrots in compact fat meshes. We show that for any pair of vertices there can be at most constantly many carrots that have this pair as their diameter.

Let be two vertices of the mesh, and consider subsets of triangles that have as their diameter and that are a carrot. The triangles intersecting the diagonal itself is a sequence of triangles whose union must be convex, otherwise no carrot exists with as the diameter. So this sequence is a carrot called the base carrot of . There can be other carrots with as the diameter. These carrots have (sequences of) triangles attached to the edges of the base carrot in some restricted manner. We will show that only constantly many triangles can be part of a carrot with a given base carrot. This was already shown above when the diameter has constant length, but we can prove this in general.

Let be the line through perpendicular to and let be the line through perpendicular to . We can assume that the parallel lines and are at distance more than times the longest edge in the mesh (otherwise we already know that there are only carrots with as the diagonal). Then there are at least four edges from to on the base carrot, and vice versa.

For any outer edge of the base carrot we examine whether it can have a triangle attached and still be a carrot, and if so, how many triangles can be attached to it.

Lemma 21.

At most edges can have a triangle attached.

Proof.

By Observation 13, any leaf of a carrot makes an angle of at least . So, only edges of a base carrot that have a cap angle of at least can be augmented by more triangles. ∎

Next we analyze how many triangles can be attached to an external edge of a base carrot with as diameter. Assume that neither nor is or , and that a clockwise traversal of the boundary of the base carrot encounters , , , , , in this order, see Figure 10. The lines through and and through and together with bound a triangular region whose area is at most constant; this is true because and are sufficiently far apart with respect to the maximum edge length in . Since all triangles have constant area, at most constantly many triangles can be attached to without violating convexity of the carrot. Next, assume that ; all other cases are symmetric. Now we use the line and the line through and and use the same argument. We can use the line because if any triangle attached to goes beyond , then cannot be the diameter. In both cases, only constantly many triangles can be attached to .

Theorem 22.

Any compact fat mesh of size has at most convex outerplanar polygons that respect .

Remark.

The question how many potatoes or fat potatoes can be in a compact fat mesh is not discussed explicitly, but the lower bound construction of Section 4 can be adapted to produce a compact fat mesh with asymptotically the same number of vertices. All potatoes we counted are fat. So there can be fat potatoes in a compact -fat mesh. An upper bound of follows directly from the more general statement in Theorem 10.

7 Discussion

We investigated the maximum number of convex polygons that can be formed using the edges of a given mesh only. We provided a construction for a general mesh with such convex polygons, and showed that there is an upper bound of . The upper and lower bounds for fat meshes match up to a constant factor (depending on ) if is an integer. If not, they differ by a factor if the remainder is smaller than , or by a factor if the remainder is at least .

Acknowledgements

We thank Stefan Langerman and John Iacono for detecting an error in an earlier version of this paper.

M.L. was supported by the Netherlands Organisation for Scientific Research (NWO) under grant 639.021.123. J.P. was supported by NSF Grant CCF-08-30272, by NSA, by OTKA under EUROGIGA project GraDR 10-EuroGIGA-OP-003, and by Swiss National Science Foundation Grant 200021-125287/1.

References

  • [1] B. Aronov, M. de Berg, and S. Thite. The complexity of bisectors and voronoi diagrams on realistic terrains. In Proc. 16th ESA, volume 5193 of LNCS. Springer, 2008.
  • [2] B. Aronov, M. van Kreveld, M. Löffler, and R. I. Silveira. Peeling meshed potatoes. Algorithmica, 60(2):349–367, 2011.
  • [3] M. Bern, D. Eppstein, and J. Gilbert. Provably good mesh generation. J. Comput. Syst. Sci., 48(3):384–409, 1994.
  • [4] J. S. Chang and C. K. Yap. A polynomial solution for the potato-peeling problem. Discrete Comput. Geom., 1:155–182, 1986.
  • [5] M. de Berg, O. Cheong, H. J. Haverkort, J. G. Lim, and L. Toma. The complexity of flow on fat terrains and its i/o-efficient computation. Comput. Geom., 43(4):331–356, 2010.
  • [6] M. de Berg, A. F. van der Stappen, J. Vleugels, and M. J. Katz. Realistic input models for geometric algorithms. Algorithmica, 34(1):81–97, 2002.
  • [7] J. E. Goodman. On the largest convex polygon contained in a non-convex -gon or how to peel a potato. Geom. Dedicata, 11:99–106, 1981.
  • [8] J. Matousek, J. Pach, M. Sharir, S. Sifrony, and E. Welzl. Fat triangles determine linearly many holes. SIAM J. Comput., 23(1):154–169, 1994.
  • [9] E. Moet, M. van Kreveld, and A. F. van der Stappen. On realistic terrains. Comput. Geom., 41(1-2):48–67, 2008.
  • [10] J. Pach and M. Sharir. Combinatorial Geometry and Its Algorithmic Applications: The Alcala Lectures. Mathematical Surveys and Monographs. AMS, 2009.
  • [11] A. F. van der Stappen, M. H. Overmars, M. de Berg, and J. Vleugels. Motion planning in environments with low obstacle density. Discrete & Computational Geometry, 20(4):561–587, 1998.
Comments 0
Request Comment
You are adding the first comment!
How to quickly get a good reply:
  • Give credit where it’s due by listing out the positive aspects of a paper before getting into which changes should be made.
  • Be specific in your critique, and provide supporting evidence with appropriate references to substantiate general statements.
  • Your comment should inspire ideas to flow and help the author improves the paper.

The better we are at sharing our knowledge with each other, the faster we move forward.
""
The feedback must be of minimum 40 characters and the title a minimum of 5 characters
   
Add comment
Cancel
Loading ...
70088
This is a comment super asjknd jkasnjk adsnkj
Upvote
Downvote
""
The feedback must be of minumum 40 characters
The feedback must be of minumum 40 characters
Submit
Cancel

You are asking your first question!
How to quickly get a good answer:
  • Keep your question short and to the point
  • Check for grammar or spelling errors.
  • Phrase it like a question
Test
Test description