Skip to content

Instantly share code, notes, and snippets.

@NateTG
Created March 19, 2018 02:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NateTG/b350378c56f436d3996a2107f7cba965 to your computer and use it in GitHub Desktop.
Save NateTG/b350378c56f436d3996a2107f7cba965 to your computer and use it in GitHub Desktop.
Gone a little bit crazy with triangulation in Openscad
//Scraped from postscript using pathforall
a=[
43.9881,6.56189,"moveto",
42.2891,5.17072,41.0949,4.67827,39.6053,4.67827,"curveto",
37.3154,4.67827,36.626,6.06944,36.626,10.4522,"curveto",
36.626,29.8548,"lineto",
36.626,35.0255,36.1212,37.9186,34.6315,40.307,"curveto",
32.4401,43.8896,28.1681,45.7732,22.2957,45.7732,"curveto",
12.9391,45.7732,5.57699,40.898,5.57699,34.6315,"curveto",
5.57699,32.3416,7.46061,30.3472,9.849,30.3472,"curveto",
12.2374,30.3472,14.3303,32.3416,14.3303,34.533,"curveto",
14.3303,34.927,14.2318,35.4318,14.1333,36.1212,"curveto",
13.9363,37.0199,13.8378,37.8201,13.8378,38.5096,"curveto",
13.8378,41.1934,17.0141,43.3848,21.003,43.3848,"curveto",
25.8782,43.3848,28.5621,40.504,28.5621,35.124,"curveto",
28.5621,29.0545,"lineto",
13.3331,22.9851,11.5479,22.0864,7.26363,18.3068,"curveto",
5.07223,16.3247,3.68106,12.9391,3.68106,9.65202,"curveto",
3.68106,3.38559,8.06387,-0.997211,14.1333,-0.997211,"curveto",
18.5038,-0.997211,22.5911,1.0957,28.6606,6.26642,"curveto",
29.153,0.997211,30.9505,-0.997211,35.0255,-0.997211,"curveto",
38.4111,-0.997211,40.504,0.19698,43.9881,3.97653,"curveto",
43.9881,6.56189,"lineto",
"closepath",
28.5621,12.2374,"moveto",
28.5621,9.25806,28.0573,8.16236,25.9767,6.96816,"curveto",
23.4899,5.57699,20.7937,4.77676,18.7131,4.77676,"curveto",
15.229,4.77676,12.4344,8.16236,12.4344,12.4344,"curveto",
12.4344,12.8406,"lineto",
12.5328,18.8116,16.9156,22.5911,28.5621,26.6662,"curveto",
28.5621,12.2374,"lineto",
"closepath"
];
function splitpaths(script,i=0)=
("closepath"==script[i])?
(i==len(script)-1)?
[[for (j=[0:i-1]) script[j]]]
:
concat(
[[for (j=[0:i-1]) script[j]]],
splitpaths([for (j=[i+1:len(script)-1]) script[j]])
)
:
splitpaths(script,i+1)
;
function pathstep(path,i=0,curx,cury,steps=10)=
(i>=len(path))?
[]
:("moveto"==path[i])? //This should only happen when i==2
concat(
[[path[i-2],path[i-1]]],
pathstep(path,i+1,path[i-2],path[i-1],steps)
)
:("lineto"==path[i])? //This happens later...
concat(
[[path[i-2],path[i-1]]],
pathstep(path,i+1,path[i-2],path[i-1],steps)
)
:("curveto"==path[i])?
concat(
psbezier([curx,cury],[path[i-6],path[i-5]],[path[i-4],path[i-3]],[path[i-2],path[i-1]],steps),
pathstep(path,i+1,path[i-2],path[i-1],steps)
)
:
pathstep(path,i+1,curx,cury,steps);
function psbezier(a,b,c,d,steps=10) =
let(step=1/steps)
[for(i=[1:steps]) nbezier([a,b,c,d],step*i)]
;
function nbezier(points,t)=
1>=len(points)?
points[0]
:
nbezier(
[for(i=[0:len(points)-2]) points[i]*(1-t)+points[i+1]*t],
t
);
function stripnulls(path)=
let(pl=len(path))
[for (i=[0:pl-1]) if((path[i]-path[(pl+i-1)%pl])*(path[i]-path[(pl+i-1)%pl])>0) path[i]]
;
function mkpoly(paths,curpoints=[],curpaths=[],i=0)=
(i>=len(paths))?
[]
:(i==len(paths)-1)?
let(mypath=stripnulls(paths[i]))
[
concat(curpoints,mypath),
concat(curpaths,[[for (i=[0:len(mypath)-1]) i+len(curpoints)]])
]
:
let(mypath=stripnulls(paths[i]))
mkpoly(
paths,
concat(curpoints,mypath),
concat(curpaths,[[for (i=[0:len(mypath)-1]) i+len(curpoints)]]),
i+1
)
;
function makesegments(poly) =
[
for (i=[0:len(poly[1])-1]) [
for(j=[0:len(poly[1][i])-1])
[
poly[1][i][j],
poly[1][i][(j+1)%len(poly[1][i])]
]
]
]
;
apaths=splitpaths(a);
arender=[for (i=[0:len(apaths)-1]) pathstep(apaths[i])];
poly=mkpoly(arender);
translate([0,0,-1]) linear_extrude(height=1) {
polygon(points=poly[0],paths=poly[1]);
}
use<subdivision.scad>
use<FunctionalOpenSCAD/functional.scad>
//Sweep line triangulator using monotone polygons
//Requires:
// First path to be properly wound external face.
// Correctly wound paths (internal paths are CW, external CCW).
// No intesecting paths
// No vertices with more than 2 edges.
//include<a.scad>
use<a.scad>
include<text.scad>
ppaths=splitpaths(text);
prender=[for (i=[0:len(ppaths)-1]) pathstep(ppaths[i],steps=3)];
poly=mkpoly(prender);
/*
translate([0,0,-1]) linear_extrude(height=1) {
polygon(points=poly[0],paths=poly[1]);
}
*/
maxtest=0;
triangles=triangulate(poly[0],poly[1]);
//Testing stuff...
mypoints=mk3d(poly[0]);
//subdivided=[mypoints,triangles];
stest=sphere();
subdivided=subdivide_faces(2,[mypoints,triangles]);
echo(len(subdivided[0]));
//modified=[for (point=subdivided[0]) [point[0],point[1]+point[0]/10,((point[0]-325)*(point[0]-325)+point[1]*point[1])/1000]];
function toc(point)=
let(x=point[0],y=point[1],z=point[2])
[-50*cos(x),-50*sin(x),y-x/3]
;
modified=[for (point=subdivided[0]) toc(point)];
polyhedron(points=modified,faces=subdivided[1]);
color("black") cylinder(r=48,h=2000,$fn=36,center=true);
//showsweep(points=modified,closed=subdivided[1],open=[]);
//This one is often handy...
module line (a=[1,1,1],b=[21,2,2],r=0.125) {
v=b-a;
translate(a)
rotate(a=atan2(v[1],v[0]))
rotate(v=[0,1,0],a=atan2(sqrt(v[0]*v[0]+v[1]*v[1]),v[2]))
cylinder(h=sqrt(v*v),r1=r,r2=r);
}
module closedtest(pointlist,components) {
echo("testing components");
for(i=[0:len(components)-1]) {
for(j=[0:len(components[i])-1]) {
if(pointlist[components[i][j]][0]>pointlist[components[i][0]][0]) {
echo("no start on max x",i,j,pointlist[component[i][0]],pointlist[component[i][j]]);
}
}
}
}
module dot (p=[1,1,1],r=0.25) {
translate(p) sphere(r=r);
}
module showopen(points,component) {
list=component[0];
prev=points[component[1]];
next=points[component[2]];
color("white") translate(prev) sphere(r=0.5);
color("yellow") line(prev,points[list[0]]);
// color("white") translate(next) sphere(r=0.25);
color("white") line(points[list[len(list)-1]],next);
color("black") translate(points[list[0]]) sphere(r=0.25);
color("black") translate(points[list[len(list)-1]]) sphere(r=0.25);
//show box..
// color("white") line(points[list[0]],points[list[len(list)-1]]);
// color("white") line(prev,next);
//latest
color("green") dot(points[list[component[3]]],r=0.5);
if(len(list)>1) {
for(j=[0:len(list)-2]) {
color("black") line(points[list[j]],points[list[j+1]]);
}
}
}
module showsweep (points,closed,open,rz=0.1) {
if(len(closed)>0) {
for (i=[0:len(closed)-1]) {
for(j=[0:len(closed[i])-1]) {
color("blue") line(
points[closed[i][j]],points[closed[i][(j+1)%len(closed[i])]]);
}
}
}
if(len(open)>0) {
for (i=[0:len(open)-1]) {
translate([0,0,rz*(i+1)]) showopen(points,open[i]);
}
}
}
//End of test/debugging section
//Requires:
// First path to be properly wound.
// No intesecting paths
// No vertices with more than 2 edges.
//At this point I have monotone components. ...
function triangulate(points,paths)=
let(
mypoints=mk3d(points),
/*
localz=winding_direction(mypoints,paths[0]),
localx=nontrivialsegment(mypoints,paths[0]),
localy=cross(localz,localx),
*/
localx=[1,0,0],localy=[0,1,0],localz=[0,0,1],
neighborlist=mkneighborlist(mypoints,paths,localx,localy),
sweeplist=mksweeplist(neighborlist),
closed=sweeptriangulate(neighborlist,sweeplist,closed=[],open=[])
)
flatten([for (i=[0:len(closed)-1]) triangulatecomponent(neighborlist,closed[i])])
// flatten([for (i=[0:60]) triangulatecomponent(neighborlist,closed[i])])
;
//Use a "data structure" for components:
//vertices - component body
//prev - "left" dangler
//next - "right" dangler
//latest - index of the newest vertex (typically 0 or -1)
//pendant - undef or index of a 'roof cusp'
function flatten(list)=
[for (a=list) for (b=a) b]
;
//Fixme: Needs a component triangulation function.
//Trapezoid partition & uni-montone components, perhaps.
function newcomponent(pointlist,point) =
let(
index=2,
isexternal=5,
a=pointlist[point[3]],
b=pointlist[point[4]],
swap=!point[isexternal],
prev=swap?b[2]:a[2],
next=swap?a[2]:b[2]
)
[
[point[index]],
prev,
next,
0,
undef
]
;
//returns [ newclosed/undef, component ]
function componentnewprev(pointlist,component,point) =
let(
vertexlist=component[0],
next=component[2],
index=2,
pendant=component[4],
newprev=(vertexlist[0]==point[3])?point[4]:point[3]
)
(undef==pendant)? //No dangling roof pendant.
[
[],
[
concat([point[index]],vertexlist),
newprev,
next,
0,
undef
]
]
:
[
[
concat( [point[index]], sublist(vertexlist,0,pendant) )
],
[
concat( [point[index]], sublist(vertexlist,pendant,-1) ),
newprev,
next,
0,
undef
]
]
;
function componentnewnext(pointlist,component,point) =
let(
vertexlist=component[0],
prev=component[1],
index=2,
pendant=component[4],
newnext=(vertexlist[len(vertexlist)-1]==point[3])?point[4]:point[3]
)
(undef==pendant)? //No dangling roof pendant.
[
[],
[
concat(vertexlist,[point[index]]),
prev,
newnext,
len(vertexlist),
undef
]
]
:
[
[
concat( [point[index]], sublist(vertexlist,pendant,-1) )
],
[
concat( sublist(vertexlist,0,pendant), [point[index]] ),
prev,
newnext,
pendant+1,
undef
]
]
;
function componentfuse(pointlist,componentl,componentr,point)=
let(
pendant=4,
index=2,
lvertexlist=componentl[0],
rvertexlist=componentr[0],
newprev=componentl[1],
newnext=componentr[2],
lpendant=componentl[pendant],
rpendant=componentr[pendant]
)
(lpendant==undef && rpendant==undef)?
[
[],
[
concat(lvertexlist,[point[index]],rvertexlist),
newprev,
newnext,
len(lvertexlist),
len(lvertexlist)
]
]
:(rpendant==undef)?
[
[
//Make X-most point first in list for triangulation.
concat([point[index]],sublist(lvertexlist,lpendant,-1))
],
[
concat(sublist(lvertexlist,0,lpendant),[point[index]],rvertexlist),
newprev,
newnext,
lpendant+1,
lpendant+1
]
]
:(lpendant==undef)?
[
[
concat([point[index]],sublist(rvertexlist,0,rpendant))
],
[
concat(lvertexlist,[point[index]],sublist(rvertexlist,rpendant,-1)),
newprev,
newnext,
len(lvertexlist),
len(lvertexlist)
]
]
://both components have pendants
//fixme: I think this one still needs testing.
[
[
//Make x-most point first for triangulation.
concat([point[index]],sublist(lvertices,lpendant,-1)),
concat([point[index]],sublist(rvertexlist,0,rpendant))
],
[
concat(sublist(lvertices,0,lpendant),[point[index]],sublist(rvertexlist,rpendant,-1)),
newprev,
newnext,
lpendant+1,
lpendant+1
]
]
;
function componentsplit (pointlist,component,point)=
let(
latest=component[3],
vertexlist=component[0],
l=pointlist[vertexlist[latest]],
componentprev=component[1],
componentnext=component[2],
index=2,
isexternal=5,
a=pointlist[point[3]],
b=pointlist[point[4]],
swap=!point[isexternal],
//Reversed b/c this is inside -> outside
pointprev=swap?a[2]:b[2],
pointnext=swap?b[2]:a[2]
)
[
[
concat(sublist(vertexlist,0,latest),[point[index]]),
componentprev,
pointprev,
latest+1,
undef
],
[
concat([point[index]],sublist(vertexlist,latest,-1)),
pointnext,
componentnext,
0,
undef
]
]
;
function componentclose(open,point)=
let(
list=open[0],
pendant=open[4],
mypoint=point[2]
)
(undef==pendant)?
[
concat([mypoint],list)
]
:
//FIXME: This may be untested.
[
concat([mypoint],sublist(list,0,pendant)),
concat([mypoint],sublist(list,pendant,-1))
]
;
function r2ceil(x,n=1)=
(n>x)?
n
:
r2ceil(x,n=n*2)
;
function componentposition(point,neighborlist,open,i=0)=
let(
odd=(i%2==1),
path=odd?(i-1)/2:i/2,
prev=1,
next=2,
vlist=open[path][0],
ai=odd?open[path][next]:open[path][prev],
bi=odd?vlist[len(vlist)-1]:vlist[0],
a=[neighborlist[ai][0],neighborlist[ai][1]],
b=[neighborlist[bi][0],neighborlist[bi][1]],
p=[point[0],point[1]]
)
(i>=len(open)*2)?
i
:cross(b-a,p-b)>0?
i
//On the line case?
:(a[0]==p[0] && b[0]==p[0] && ((a[1]<=p[1] && p[1]<=b[1]) || (a[1]>=p[1] && p[1]>=b[1])))?
i
:
componentposition(point,neighborlist,open,i=i+1)
;
/*
FIXME: This doesn't work? - want binary search...
function componentposition(point,neighborlist,components)=
let(
r2c=r2ceil(2*len(components)+1) //radix 2 ceiling
)
componentpositionstep(point,neighborlist,components,pos=r2c-1,i=r2c/2)
;
function componentpositionstep(point,neighborlist,components,pos=0,i=1)=
let(
cur=floor(pos-i),
odd=(cur%2==1),
path=floor(cur/2),
prev=1,
next=2,
component=components[path],
vertexlist=component[0],
ai=odd?component[next]:component[prev],
bi=odd?vertexlist[len(vertexlist)-1]:vertexlist[0],
a=[neighborlist[ai][0],neighborlist[ai][1]],
b=[neighborlist[bi][0],neighborlist[bi][1]],
p=[point[0],point[1]]
)
(i<1)?
pos
:cur>=(len(components)*2)?
componentpositionstep(point,neighborlist,components,pos=pos-i,i=i/2)
:cross(b-a,p-b)>0?
componentpositionstep(point,neighborlist,components,pos=pos-i,i=i/2)
:
componentpositionstep(point,neighborlist,components,pos=pos,i=i/2)
;
*/
function checkstarts(point, open,incomp)=
let(
tocheck=[incomp,incomp-1,incomp+1],
mypoint=point[2],
prev=1
)
(0==len(open))?
[false]
:(mypoint==open[tocheck[0]][prev])?
[true,tocheck[0]]
:(tocheck[1]>=0 && mypoint==open[tocheck[1]][prev])?
[true,tocheck[1]]
:(tocheck[2]<len(open) && mypoint==open[tocheck[2]][prev])?
[true,tocheck[2]]
:
[false]
;
function checkends(point, open,incomp)=
let(
tocheck=[incomp,incomp-1,incomp+1],
mypoint=point[2],
next=2
)
(0==len(open))?
[false]
:(mypoint==open[tocheck[0]][next])?
[true,tocheck[0]]
:(tocheck[1]>=0 && mypoint==open[tocheck[1]][next])?
[true,tocheck[1]]
:(tocheck[2]<len(open) && mypoint==open[tocheck[2]][next])?
[true,tocheck[2]]
:
[false]
;
function sweeptriangulate (neighborlist,sweeplist,closed=[],open=[],i=0)=
let(
a=neighborlist[sweeplist[i][3]],
b=neighborlist[sweeplist[i][4]],
point=sweeplist[i],
//FIXME: These need to use binary search or something
//similar if this is to be O(N log N)
pos=componentposition(point,neighborlist,open),
incomp=floor(pos/2),
starts=checkstarts(point,open,incomp),
ends=checkends(point,open,incomp),
index=2 //Fake associative array?
)
//Testing stub
(maxtest>0 && i>=maxtest)?
[closed,open,"point",point,"incomp",incomp,"pos",pos,"starts",starts,"ends",ends]
:
(i>len(neighborlist)-1)?
//no more points - all the components should be closed.
closed
:(starts[0] && ends[0])?
(starts[1]==ends[1])? //Current point closes off a component
sweeptriangulate(
neighborlist,
sweeplist,
closed=concat(closed,componentclose(open[starts[1]],point)),
open=concat(
(starts[1]>0)?
sublist(open,0,starts[1]-1)
:
[]
,
(starts[1]<len(open)-1)?
sublist(open,starts[1]+1,len(open)-1)
:
[]
),
i=i+1
)
://Current point hooks together components.
//Should die if starts[1]!=ends[1]+1
let(
new=componentfuse(neighborlist,open[ends[1]],open[starts[1]],point),
newclosed=new[0],
newopen=new[1]
)
sweeptriangulate(
neighborlist,
sweeplist,
closed=concat(closed,newclosed),
open=concat(
(ends[1]>0)?sublist(open,0,ends[1]-1):[],
[newopen],
(starts[1]<len(open)-1)?sublist(open,starts[1]+1,len(open)-1):[]
),
i=i+1
)
:(starts[0])?//Current point extends the left end of a component
let(
new=componentnewprev(neighborlist,open[starts[1]],point),
newclosed=new[0],
newopen=new[1]
)
sweeptriangulate(
neighborlist,
sweeplist,
closed=concat(closed,newclosed),
open=concat(
(starts[1]>0)?sublist(open,0,starts[1]-1):[],
[newopen],
(starts[1]<len(open)-1)?sublist(open,starts[1]+1,-1):[]
),
i=i+1
)
:(ends[0])?//Current point extends the right end of a component
let(
new=componentnewnext(neighborlist,open[ends[1]],point),
newclosed=new[0],
newopen=new[1]
)
sweeptriangulate(
neighborlist,
sweeplist,
closed=concat(closed,newclosed),
open=concat(
(ends[1]>0)?sublist(open,0,ends[1]-1):[],
[newopen],
(ends[1]<len(open)-1)?sublist(open,ends[1]+1,-1):[]
),
i=i+1
)
:(1==pos%2)? // Current point is "in" a component
let(
newopenlist=componentsplit(neighborlist,open[incomp],point)
)
sweeptriangulate(
neighborlist,
sweeplist,
closed=closed,
open=concat(
(incomp>0)?sublist(open,0,incomp-1):[],
newopenlist,
(incomp<len(open)-1)?sublist(open,incomp+1,-1):[]
),
i=i+1
)
://Current point is 'between' components.
sweeptriangulate(
neighborlist,
sweeplist,
closed=closed,
open=concat(
(incomp>0)?sublist(open,0,incomp-1):[],
[
newcomponent(neighborlist,point)
],
//Since it's "between" the incompth open component is retained.
(incomp<=len(open)-1)?sublist(open,incomp,-1):[]
),
i=i+1
)
;
function sublist (list,a,b) =
let(
start=(a<0)?(len(list)+a)%len(list):a,
end=(b<0)?(len(list)+b)%len(list):b
)
(start<=end)?
[for (i=[start:end]) list[i]]
:
[]
;
function reverse(list)=
[for (i=[1:len(list)]) list[len(list)-i]]
;
function mkums (list,splitpoints) =
let(
ums=[for (i=[1:len(splitpoints)-1]) sublist(list,splitpoints[i-1]-1,splitpoints[i])],
isreturn=3
)
[for (i=[0:len(ums)-1]) ums[i][1][isreturn]?reverse(ums[i]):ums[i]]
;
function triangulateums (ums,stack,i=0) =
let(
length=len(ums),
next=ums[i],
last=len(stack)-1
)
i>=length-1?
[for (j=[1:len(stack)-1]) [stack[j-1],stack[j],ums[length-1]]]
:(len(stack)<2 || cross(
[stack[last-1][0],stack[last-1][1]]-[stack[last][0],stack[last][1]],[next[0],next[1]]-[stack[last][0],stack[last][1]])<0)?
triangulateums(ums,concat(stack,[next]),i+1)
:
concat(
[[stack[last-1],stack[last],next]],
triangulateums(ums,sublist(stack,0,-2),i=i)
)
;
function listgt (a,b,list,i=0) =
(i>=len(list) || i<0 || list[i]<0 || list[i]>=len(a) || list[i]>= len(b)) ?
false
:(a[list[i]]==b[list[i]])?
listgt(a,b,list,i+1)
:(a[list[i]]>b[list[i]])?
true
:(a[list[i]]<b[list[i]])?
false
:
false
;
function listeq (a,b,list,i=0) =
(i>=len(list) || i<0 || list[i]<0 || list[i]>=len(a) || list[i]>= len(b)) ?
false
:(a[list[i]]>b[list[i]])?
false
:(a[list[i]]<b[list[i]])?
false
:(i<len(list)-1)?
listeq(a,b,list,i+1)
:
true
;
function listquicksort(arr,list) =
!(len(arr)>0)?
[]
:
let(
pivot = arr[floor(len(arr)/2)],
lesser = [ for (y = arr) if(listgt(pivot,y,list)) y ],
equal = [ for (y = arr) if(listeq(pivot,y,list)) y ],
greater = [ for (y = arr) if(listgt(y,pivot,list)) y ]
)
concat(
listquicksort(lesser,list), equal, listquicksort(greater,list)
);
//Sorting by local x, then local y.
function mksweeplist(neighborlist)=
listquicksort(neighborlist,[0,1])
;
function patharea(points,path,localx,localy) =
let(
da=[for (i=[0:len(path)-1]) cross(points[path[i]]-points[path[0]],points[path[(i+1)%len(path)]]-points[path[i]])]
)
vsum(da)
;
//FIXME: Just making unimonotone components so far.
function triangulatecomponent(points,component)=
let(
l=len(component),
minxindex=minx(points,component),
//negating the x coordinates so that is a sort by decreasing x.
//second coordinate is negative on the return leg.
sortlist=[for (i=[0:l-1]) [-points[component[i]][0],-points[component[i]][1],i>minxindex?-i:i,i>minxindex,component[i]]],
sortedlist=listquicksort(sortlist,[0,2]),
switchpoints=[for (i=[1:l-1]) if(i==1 || i==l-1 || sortedlist[i][3]!=sortedlist[i-1][3]) i],
// splits=mkums(sortedlist,switchpoints),
// cleansplits=[for (split=splits) [for (a=split) a[4]]]
umss=mkums(sortedlist,switchpoints),
triangulated=flatten([for (ums=umss) triangulateums(ums,[],0)]),
cleantriangles=[for (triangle=triangulated) [for (a=triangle) a[4]]]
)
//["component",component,"sortedlist",sortedlist,"splitpoints",switchpoints,"splits",splits,"cleansplits",cleansplits]
// cleansplits
cleantriangles
;
function minx(points,component,i=0)=
(i>=len(component)-1 || points[component[i+1]][0]>points[component[i]][0])?
i
:
minx(points,component,i+1)
;
function mkneighborlist(points,paths,localx,localy)=
let(
localpoints=[for (i=[0:len(points)-1]) [points[i]*localx,points[i]*localy]],
areas=[for (i=[0:len(paths)-1]) patharea(localpoints,paths[i])],
list=[
for(i=[0:len(paths)-1])
for(j=[0:len(paths[i])-1])
[
//Sweep line sort values
localpoints[paths[i][j]][0],
localpoints[paths[i][j]][1],
//Index
paths[i][j],
//neighbors - use oriented area for consistent winding.
areas[i]>0? paths[i][(j+1)%len(paths[i])]: paths[i][(len(paths[i])+j-1)%len(paths[i])],
areas[i]>0? paths[i][(len(paths[i])+j-1)%len(paths[i])]:paths[i][(j+1)%len(paths[i])],
//path number
areas[i]>0
]
]
)
//sort by point index.
listquicksort(list,[2])
;
function nontrivialsegment(points,path,i=0)=
let(
count=len(path),
v=points[path[(i+1)%count]]-points[path[i]]
)
(i<count-1)?
v*v>0?
v
:
nontrivialsegment(points,path,i+1)
:
undef
;
function mk3d(list)=
(2==len(list[0]))?
[for (i=[0:len(list)-1]) concat(list[i],[0])]
:(3==len(list[0]))?
list
:
[]
;
function vsum(v,i=0) = len(v)-1 > i ? v[i] + vsum(v, i+1) : v[i];
function winding_direction(points,path)=
let(count=len(path))
vsum([
for(i=[0:count-1])
cross(
points[path[(i+1)%count]]-points[path[0]],
points[path[(i+2)%count]]-points[path[(i+1)%count]]
)
])
;
text =[25.3735,44.776,"moveto",
15.3275,44.776,"lineto",
15.3275,56.3239,"lineto",
15.3275,57.3212,15.1305,57.6166,14.6258,57.6166,"curveto",
8.85178,49.2573,5.87246,45.8717,2.97932,44.1851,"curveto",
1.89593,43.4833,1.29268,42.8924,1.29268,42.2891,"curveto",
1.29268,41.9937,1.39117,41.7967,1.68664,41.5997,"curveto",
6.96816,41.5997,"lineto",
6.96816,11.6464,"lineto",
6.96816,3.2871,9.94749,-0.997211,15.8199,-0.997211,"curveto",
20.6952,-0.997211,24.4748,1.39117,27.7619,6.56189,"curveto",
26.4692,7.65759,"lineto",
24.2778,5.07223,22.6896,4.17351,20.4982,4.17351,"curveto",
16.8172,4.17351,15.3275,6.86967,15.3275,13.1361,"curveto",
15.3275,41.5997,"lineto",
25.3735,41.5997,"lineto",
25.3735,44.776,"lineto",
"closepath",
76.2682,1.48966,"moveto",
70.8881,2.38838,70.3957,3.09012,70.2972,10.1445,"curveto",
70.2972,29.9533,"lineto",
70.2972,40.4055,66.2099,45.7732,58.0475,45.7732,"curveto",
52.1751,45.7732,48.0015,43.3848,43.4218,37.4139,"curveto",
43.4218,67.6749,"lineto",
42.9293,67.9704,"lineto",
39.4452,66.7762,36.9584,65.976,31.4799,64.3878,"curveto",
28.796,63.5876,"lineto",
28.796,61.9994,"lineto",
29.19,62.0979,29.3869,62.0979,29.9902,62.0979,"curveto",
34.2622,62.0979,35.0624,61.2977,35.0624,57.0257,"curveto",
35.0624,10.1445,"lineto",
34.8654,2.97932,34.3607,2.1914,28.6975,1.48966,"curveto",
28.6975,0.0,"lineto",
50.1929,0.0,"lineto",
50.1929,1.48966,"lineto",
44.419,1.99442,43.6187,3.09012,43.4218,10.1445,"curveto",
43.4218,34.1391,"lineto",
47.6076,38.7066,50.5869,40.4055,54.5634,40.4055,"curveto",
59.4387,40.4055,61.9379,36.8229,61.9379,29.8548,"curveto",
61.9379,10.1445,"lineto",
61.7286,3.09012,60.8422,1.99442,55.1667,1.48966,"curveto",
55.1667,0.0,"lineto",
76.2682,0.0,"lineto",
76.2682,1.48966,"lineto",
"closepath",
118.4,16.3247,"moveto",
113.624,8.75329,109.339,5.87246,102.974,5.87246,"curveto",
97.2988,5.87246,93.0268,8.75329,90.1337,14.4288,"curveto",
88.3486,18.2083,87.6468,21.3969,87.4499,27.5649,"curveto",
118.105,27.5649,"lineto",
117.305,34.0283,116.307,36.9214,113.821,40.11,"curveto",
110.841,43.6926,106.261,45.7732,101.078,45.7732,"curveto",
96.1047,45.7732,91.4264,43.9881,87.6468,40.6025,"curveto",
82.9686,36.5275,80.2847,29.4608,80.2847,21.2985,"curveto",
80.2847,7.5591,87.4499,-0.997211,98.8993,-0.997211,"curveto",
108.354,-0.997211,115.815,4.87525,119.988,15.623,"curveto",
118.4,16.3247,"lineto",
"closepath",
87.6468,30.7535,"moveto",
88.7425,38.5096,92.1281,42.1906,98.1976,42.1906,"curveto",
104.267,42.1906,106.655,39.4083,107.948,30.7535,"curveto",
87.6468,30.7535,"lineto",
"closepath",
183.019,42.2891,"moveto",
178.538,44.8868,175.558,45.7732,171.57,45.7732,"curveto",
159.037,45.7732,149.582,34.73,149.582,20.3012,"curveto",
149.582,7.86689,156.144,-0.997211,165.5,-0.997211,"curveto",
171.274,-0.997211,176.753,1.58815,181.123,6.36491,"curveto",
181.123,-12.3359,"lineto",
181.025,-17.9129,179.239,-19.501,172.271,-19.9073,"curveto",
172.271,-21.5939,"lineto",
195.761,-21.5939,"lineto",
195.761,-20.2028,"lineto",
190.381,-19.0086,189.692,-18.3068,189.482,-14.0348,"curveto",
189.482,45.3792,"lineto",
188.387,45.4777,"lineto",
183.019,42.2891,"lineto",
"closepath",
181.123,12.6436,"moveto",
181.123,10.2553,180.729,8.95028,179.732,8.06387,"curveto",
177.54,6.26642,174.266,5.07223,171.176,5.07223,"curveto",
168.085,5.07223,165.402,6.06944,163.419,7.96538,"curveto",
160.231,10.9447,158.138,17.3096,158.138,23.9823,"curveto",
158.138,35.7272,163.419,42.9909,171.877,42.9909,"curveto",
178.045,42.9909,181.123,39.7038,181.123,33.1419,"curveto",
181.123,12.6436,"lineto",
"closepath",
244.861,4.97374,"moveto",
244.357,4.97374,"lineto",
239.481,5.17072,238.792,5.97095,238.693,10.6492,"curveto",
238.693,44.776,"lineto",
222.972,44.776,"lineto",
222.972,43.0894,"lineto",
229.14,42.7939,230.334,41.7967,230.334,36.8229,"curveto",
230.334,13.4316,"lineto",
230.334,10.6492,229.829,9.25806,228.438,8.16236,"curveto",
225.754,5.97095,222.664,4.77676,219.685,4.77676,"curveto",
215.807,4.77676,212.618,8.16236,212.618,12.3359,"curveto",
212.618,44.776,"lineto",
198.091,44.776,"lineto",
198.091,43.3848,"lineto",
202.769,43.1878,204.16,41.7967,204.259,37.0199,"curveto",
204.259,11.9419,"lineto",
204.259,4.07502,209.036,-0.997211,216.299,-0.997211,"curveto",
219.98,-0.997211,223.858,0.59094,226.555,3.2871,"curveto",
230.827,7.5591,"lineto",
230.827,-0.701741,"lineto",
231.221,-0.898721,"lineto",
236.207,1.0957,239.789,2.1914,244.861,3.58257,"curveto",
244.861,4.97374,"lineto",
"closepath",
248.779,0.0,"moveto",
272.368,0.0,"lineto",
272.368,1.48966,"lineto",
265.806,1.99442,265.104,2.88083,265.006,10.1445,"curveto",
265.006,45.4777,"lineto",
264.612,45.7732,"lineto",
249.186,40.307,"lineto",
249.186,38.805,"lineto",
249.974,38.9158,"lineto",
251.168,39.1128,252.362,39.2113,253.359,39.2113,"curveto",
255.748,39.2113,256.646,37.6109,256.646,33.2404,"curveto",
256.646,10.1445,"lineto",
256.449,2.78234,255.551,1.78513,248.779,1.48966,"curveto",
248.779,0.0,"lineto",
"closepath",
259.933,67.9704,"moveto",
257.237,67.9704,254.947,65.6805,254.947,62.8982,"curveto",
254.947,60.005,257.139,57.8136,259.933,57.8136,"curveto",
262.913,57.8136,265.104,60.005,265.104,62.8982,"curveto",
265.104,65.779,262.814,67.9704,259.933,67.9704,"curveto",
"closepath",
314.595,15.5245,"moveto",
309.819,8.55632,306.236,6.16793,300.561,6.16793,"curveto",
291.413,6.16793,285.135,14.1333,285.135,25.5705,"curveto",
285.135,35.9242,290.613,42.8924,298.677,42.8924,"curveto",
302.26,42.8924,303.552,41.8952,304.549,38.1156,"curveto",
305.14,35.9242,"lineto",
305.941,33.0434,307.726,31.3444,309.917,31.3444,"curveto",
312.502,31.3444,314.595,33.2404,314.595,35.5303,"curveto",
314.595,41.0949,307.627,45.7732,299.268,45.7732,"curveto",
294.393,45.7732,289.32,43.7911,285.245,40.2085,"curveto",
280.259,35.8257,277.477,29.0545,277.477,21.1015,"curveto",
277.477,8.26085,285.344,-0.997211,296.387,-0.997211,"curveto",
300.868,-0.997211,304.845,0.59094,308.427,3.68106,"curveto",
311.111,5.97095,313.007,8.75329,315.987,14.6258,"curveto",
314.595,15.5245,"lineto",
"closepath",
320.089,0.0,"moveto",
343.37,0.0,"lineto",
343.37,1.48966,"lineto",
341.375,1.58815,"lineto",
337.202,1.89593,336.008,2.97932,335.909,6.67269,"curveto",
335.909,24.9795,"lineto",
349.833,6.36491,"lineto",
350.24,5.87246,350.535,5.3677,350.83,5.07223,"curveto",
351.631,4.07502,351.926,3.48408,351.926,2.97932,"curveto",
351.926,2.09291,351.027,1.48966,349.833,1.48966,"curveto",
347.95,1.48966,"lineto",
347.95,0.0,"lineto",
369.642,0.0,"lineto",
369.642,1.48966,"lineto",
365.259,1.78513,362.181,3.68106,357.996,8.75329,"curveto",
342.779,28.0573,"lineto",
345.66,30.7535,"lineto",
358.094,41.8952,360.79,43.4833,367.155,43.2863,"curveto",
367.155,44.776,"lineto",
346.854,44.776,"lineto",
346.854,43.3848,"lineto",
350.732,43.2863,351.828,42.8924,351.828,41.5997,"curveto",
351.828,40.701,350.929,39.4083,349.538,38.1156,"curveto",
335.909,25.9767,"lineto",
335.909,67.7734,"lineto",
335.503,67.9704,"lineto",
331.625,66.7762,328.744,65.8775,323.069,64.3878,"curveto",
320.089,63.5876,"lineto",
320.089,61.9994,"lineto",
321.382,62.0979,322.268,62.1964,323.266,62.1964,"curveto",
326.651,62.1964,327.55,60.9037,327.55,56.127,"curveto",
327.55,8.16236,"lineto",
327.451,2.88083,327.144,2.58536,320.089,1.48966,"curveto",
320.089,0.0,"lineto",
"closepath",
409.614,67.7734,"moveto",
409.109,67.9704,"lineto",
405.034,66.5792,402.35,65.6805,397.573,64.3878,"curveto",
394.68,63.5876,"lineto",
394.68,61.9994,"lineto",
395.283,62.0979,395.579,62.0979,396.379,62.0979,"curveto",
400.356,62.0979,401.254,61.1992,401.254,57.0257,"curveto",
401.254,5.3677,"lineto",
401.254,2.28989,409.614,-0.997211,417.665,-0.997211,"curveto",
430.801,-0.997211,440.958,9.94749,440.958,24.1793,"curveto",
440.958,36.5275,433.399,45.7732,423.439,45.7732,"curveto",
417.37,45.7732,411.596,42.2891,409.614,37.3154,"curveto",
409.614,67.7734,"lineto",
"closepath",
409.614,32.0462,"moveto",
409.614,35.9242,414.292,39.5068,419.463,39.5068,"curveto",
422.245,39.5068,424.732,38.5096,426.825,36.626,"curveto",
430.013,33.5358,432.205,26.7646,432.205,19.5995,"curveto",
432.205,8.55632,427.428,2.1914,419.266,2.1914,"curveto",
414.083,2.1914,409.614,4.3828,409.614,6.96816,"curveto",
409.614,32.0462,"lineto",
"closepath",
444.876,0.0,"moveto",
468.76,0.0,"lineto",
468.76,1.48966,"lineto",
462.099,1.68664,460.499,3.09012,460.302,8.95028,"curveto",
460.302,31.3444,"lineto",
460.302,34.533,464.488,39.5068,467.27,39.5068,"curveto",
467.873,39.5068,468.76,39.0143,469.856,38.0171,"curveto",
471.358,36.5275,472.552,36.0227,473.844,36.0227,"curveto",
476.233,36.0227,477.722,37.7217,477.722,40.504,"curveto",
477.722,43.7911,475.63,45.7732,472.244,45.7732,"curveto",
468.07,45.7732,465.276,43.5818,460.302,36.4167,"curveto",
460.302,45.5762,"lineto",
459.81,45.7732,"lineto",
454.233,43.5818,450.65,42.1906,445.085,40.4055,"curveto",
445.085,38.805,"lineto",
446.477,39.1128,447.363,39.2113,448.557,39.2113,"curveto",
451.056,39.2113,451.943,37.6109,451.943,33.2404,"curveto",
451.943,8.35933,"lineto",
451.746,3.18861,451.155,2.58536,444.876,1.48966,"curveto",
444.876,0.0,"lineto",
"closepath",
502.563,45.7732,"moveto",
489.526,45.7732,480.563,36.2197,480.563,22.4926,"curveto",
480.563,8.95028,489.821,-0.997211,502.366,-0.997211,"curveto",
514.899,-0.997211,524.453,9.45504,524.453,23.2806,"curveto",
524.453,36.4167,515.293,45.7732,502.563,45.7732,"curveto",
"closepath",
501.271,42.9909,"moveto",
509.63,42.9909,515.503,33.4373,515.503,19.8088,"curveto",
515.503,8.45782,511.021,1.78513,503.561,1.78513,"curveto",
499.67,1.78513,495.989,4.17351,493.909,8.16236,"curveto",
491.114,13.3331,489.526,20.3012,489.526,27.3679,"curveto",
489.526,36.8229,494.106,42.9909,501.271,42.9909,"curveto",
"closepath",
584.51,44.776,"moveto",
584.51,43.2863,"lineto",
587.883,42.5969,588.881,41.8952,588.881,40.2085,"curveto",
588.881,38.7066,588.29,36.3182,587.194,33.6343,"curveto",
578.231,11.5479,"lineto",
569.872,33.8313,"lineto",
568.185,38.4111,568.185,38.4111,568.185,39.7038,"curveto",
568.185,41.8952,569.281,42.5969,573.959,43.2863,"curveto",
573.959,44.776,"lineto",
553.757,44.776,"lineto",
553.757,43.2863,"lineto",
557.438,42.8924,558.632,41.6982,560.626,36.4167,"curveto",
561.119,35.0255,562.018,32.5386,562.609,30.852,"curveto",
553.56,11.0432,"lineto",
543.698,37.0199,"lineto",
543.304,38.0171,543.107,39.0143,543.107,39.9992,"curveto",
543.107,42.0921,544.203,42.8924,547.687,43.2863,"curveto",
547.687,44.776,"lineto",
529.774,44.776,"lineto",
529.774,43.2863,"lineto",
532.064,43.0894,532.852,42.0921,535.044,37.0199,"curveto",
548.475,2.97932,"lineto",
549.669,-0.09849,550.47,-1.39117,551.073,-1.39117,"curveto",
551.565,-1.39117,552.366,-0.19698,553.56,2.48687,"curveto",
564.701,26.3707,"lineto",
573.763,2.88083,"lineto",
575.252,-0.898721,575.449,-1.39117,576.151,-1.39117,"curveto",
576.84,-1.39117,577.345,-0.49245,578.933,3.48408,"curveto",
592.66,37.9186,"lineto",
594.458,42.0921,594.753,42.5969,596.748,43.2863,"curveto",
596.748,44.776,"lineto",
584.51,44.776,"lineto",
"closepath",
601.666,0.0,"moveto",
622.767,0.0,"lineto",
622.767,1.48966,"lineto",
617.794,1.78513,616.206,3.09012,616.206,6.67269,"curveto",
616.206,34.6315,"lineto",
620.982,39.1128,623.161,40.307,626.448,40.307,"curveto",
631.324,40.307,633.712,37.2169,633.712,30.655,"curveto",
633.712,9.849,"lineto",
633.515,3.38559,632.321,1.78513,627.446,1.48966,"curveto",
627.446,0.0,"lineto",
648.141,0.0,"lineto",
648.141,1.48966,"lineto",
643.266,1.99442,642.17,3.18861,642.071,8.06387,"curveto",
642.071,30.852,"lineto",
642.071,40.2085,637.701,45.7732,630.326,45.7732,"curveto",
625.759,45.7732,622.669,44.0866,615.898,37.7217,"curveto",
615.898,45.5762,"lineto",
615.208,45.7732,"lineto",
610.025,43.8896,606.652,42.7939,601.469,41.3042,"curveto",
601.469,39.6053,"lineto",
602.171,39.9007,603.069,39.9992,604.165,39.9992,"curveto",
606.947,39.9992,607.846,38.5096,607.846,33.6343,"curveto",
607.846,8.95028,"lineto",
607.748,3.09012,606.652,1.78513,601.666,1.48966,"curveto",
601.666,0.0,"lineto",
"closepath",
705.631,44.776,"moveto",
693.382,44.776,"lineto",
693.382,56.3239,"lineto",
693.382,62.1964,695.278,65.1757,699.057,65.1757,"curveto",
701.248,65.1757,702.541,64.1908,704.339,61.2977,"curveto",
705.927,58.7123,707.121,57.7151,708.808,57.7151,"curveto",
711.196,57.7151,712.993,59.5126,712.993,61.8024,"curveto",
712.993,65.385,708.611,67.9704,702.64,67.9704,"curveto",
696.373,67.9704,691.203,65.2865,688.605,60.8052,"curveto",
686.019,56.3239,685.232,52.7414,685.133,44.776,"curveto",
676.971,44.776,"lineto",
676.971,41.5997,"lineto",
685.133,41.5997,"lineto",
685.133,10.3538,"lineto",
684.924,2.88083,683.939,1.78513,676.872,1.48966,"curveto",
676.872,0.0,"lineto",
702.738,0.0,"lineto",
702.738,1.48966,"lineto",
694.576,1.78513,693.492,2.88083,693.492,10.3538,"curveto",
693.492,41.5997,"lineto",
705.631,41.5997,"lineto",
705.631,44.776,"lineto",
"closepath",
733.058,45.7732,"moveto",
720.02,45.7732,711.057,36.2197,711.057,22.4926,"curveto",
711.057,8.95028,720.316,-0.997211,732.861,-0.997211,"curveto",
745.394,-0.997211,754.947,9.45504,754.947,23.2806,"curveto",
754.947,36.4167,745.788,45.7732,733.058,45.7732,"curveto",
"closepath",
731.765,42.9909,"moveto",
740.124,42.9909,745.997,33.4373,745.997,19.8088,"curveto",
745.997,8.45782,741.516,1.78513,734.055,1.78513,"curveto",
730.165,1.78513,726.483,4.17351,724.403,8.16236,"curveto",
721.608,13.3331,720.02,20.3012,720.02,27.3679,"curveto",
720.02,36.8229,724.6,42.9909,731.765,42.9909,"curveto",
"closepath",
785.839,0.0,"moveto",
805.845,0.0,"lineto",
805.845,1.48966,"lineto",
802.755,1.48966,800.773,3.09012,797.682,7.46061,"curveto",
784.94,26.9739,"lineto",
793.201,38.9158,"lineto",
795.097,41.5997,797.978,43.0894,801.265,43.2863,"curveto",
801.265,44.776,"lineto",
785.544,44.776,"lineto",
785.544,43.2863,"lineto",
788.523,43.0894,789.52,42.4984,789.52,41.0949,"curveto",
789.52,39.9007,788.326,37.7217,785.839,34.6315,"curveto",
785.347,34.0283,784.152,32.2431,782.86,30.2487,"curveto",
782.06,31.4429,"lineto",
780.57,33.7328,779.671,35.0255,779.474,35.4318,"curveto",
777.578,38.5096,776.889,40.11,776.889,41.0949,"curveto",
776.889,42.5969,778.181,43.1878,781.161,43.2863,"curveto",
781.161,44.776,"lineto",
760.564,44.776,"lineto",
760.564,43.2863,"lineto",
761.463,43.2863,"lineto",
764.442,43.2863,766.043,41.9937,769.12,37.3154,"curveto",
778.477,22.9851,"lineto",
767.126,6.56189,"lineto",
764.147,2.48687,763.149,1.78513,759.862,1.48966,"curveto",
759.862,0.0,"lineto",
774.291,0.0,"lineto",
774.291,1.48966,"lineto",
771.41,1.48966,770.315,1.99442,770.315,3.2871,"curveto",
770.315,3.97653,770.918,5.26921,772.309,7.36212,"curveto",
780.164,19.5995,"lineto",
789.225,5.67548,"lineto",
789.619,5.07223,789.816,4.57978,789.816,3.87804,"curveto",
789.816,2.09291,789.126,1.68664,785.839,1.48966,"curveto",
785.839,0.0,"lineto",
"closepath",
852.378,45.4777,"moveto",
851.886,45.7732,"lineto",
845.706,43.3848,841.926,42.0921,836.361,40.4055,"curveto",
836.361,38.805,"lineto",
836.854,38.9158,"lineto",
838.343,39.1128,839.845,39.2113,840.83,39.2113,"curveto",
843.12,39.2113,844.019,37.5124,844.019,33.2404,"curveto",
844.019,-4.48129,"lineto",
844.019,-12.0404,843.723,-14.5273,842.628,-16.5217,"curveto",
842.025,-17.5189,840.633,-18.3068,839.242,-18.3068,"curveto",
837.753,-18.3068,836.755,-17.6174,835.069,-15.5245,"curveto",
833.271,-13.2346,831.88,-12.3359,830.292,-12.3359,"curveto",
828.002,-12.3359,826.205,-14.0348,826.205,-16.2262,"curveto",
826.205,-19.4025,830.083,-21.6924,835.561,-21.6924,"curveto",
839.944,-21.6924,843.92,-20.3012,846.604,-17.8144,"curveto",
850.187,-14.6258,852.378,-7.86689,852.378,0.0,"curveto",
852.378,45.4777,"lineto",
"closepath",
847.306,67.9704,"moveto",
844.622,67.9704,842.332,65.6805,842.332,62.8982,"curveto",
842.332,60.005,844.511,57.8136,847.306,57.8136,"curveto",
850.285,57.8136,852.477,60.005,852.477,62.8982,"curveto",
852.477,65.779,850.187,67.9704,847.306,67.9704,"curveto",
"closepath",
908.641,4.97374,"moveto",
908.136,4.97374,"lineto",
903.261,5.17072,902.571,5.97095,902.473,10.6492,"curveto",
902.473,44.776,"lineto",
886.751,44.776,"lineto",
886.751,43.0894,"lineto",
892.919,42.7939,894.113,41.7967,894.113,36.8229,"curveto",
894.113,13.4316,"lineto",
894.113,10.6492,893.609,9.25806,892.217,8.16236,"curveto",
889.534,5.97095,886.443,4.77676,883.464,4.77676,"curveto",
879.586,4.77676,876.398,8.16236,876.398,12.3359,"curveto",
876.398,44.776,"lineto",
861.87,44.776,"lineto",
861.87,43.3848,"lineto",
866.549,43.1878,867.94,41.7967,868.038,37.0199,"curveto",
868.038,11.9419,"lineto",
868.038,4.07502,872.815,-0.997211,880.079,-0.997211,"curveto",
883.76,-0.997211,887.638,0.59094,890.334,3.2871,"curveto",
894.606,7.5591,"lineto",
894.606,-0.701741,"lineto",
895.0,-0.898721,"lineto",
899.986,1.0957,903.568,2.1914,908.641,3.58257,"curveto",
908.641,4.97374,"lineto",
"closepath",
912.559,0.0,"moveto",
934.657,0.0,"lineto",
934.657,1.48966,"lineto",
929.585,1.58815,927.985,2.68385,927.886,6.67269,"curveto",
927.886,34.73,"lineto",
927.886,34.927,928.686,35.9242,929.376,36.626,"curveto",
931.863,38.9158,936.147,40.6025,939.631,40.6025,"curveto",
944.014,40.6025,946.193,37.1184,946.193,30.1502,"curveto",
946.193,8.55632,"lineto",
945.996,2.88083,944.999,1.78513,939.434,1.48966,"curveto",
939.434,0.0,"lineto",
961.718,0.0,"lineto",
961.718,1.48966,"lineto",
956.153,1.48966,954.762,3.09012,954.552,9.45504,"curveto",
954.552,34.533,"lineto",
957.544,38.805,960.733,40.6025,965.411,40.6025,"curveto",
971.074,40.6025,972.872,37.9186,972.872,29.6578,"curveto",
972.872,8.65481,"lineto",
972.674,2.78234,972.071,2.09291,966.297,1.48966,"curveto",
966.297,0.0,"lineto",
988.088,0.0,"lineto",
988.088,1.48966,"lineto",
985.503,1.68664,"lineto",
982.327,2.1914,981.231,3.68106,981.231,7.5591,"curveto",
981.231,28.0573,"lineto",
981.231,39.8023,977.34,45.7732,969.683,45.7732,"curveto",
963.909,45.7732,958.837,43.1878,953.469,37.4139,"curveto",
951.672,43.0894,948.286,45.7732,942.918,45.7732,"curveto",
938.437,45.7732,935.753,44.4805,927.492,38.1156,"curveto",
927.492,45.5762,"lineto",
926.791,45.7732,"lineto",
921.521,43.8896,918.136,42.7939,912.867,41.3042,"curveto",
912.867,39.6053,"lineto",
914.061,39.9007,914.947,39.9992,916.043,39.9992,"curveto",
918.628,39.9992,919.527,38.4111,919.527,33.6343,"curveto",
919.527,8.45782,"lineto",
919.33,2.88083,918.037,1.48966,912.559,1.48966,"curveto",
912.559,0.0,"lineto",
"closepath",
989.261,-21.5939,"moveto",
1013.35,-21.5939,"lineto",
1013.35,-19.8088,"lineto",
1005.88,-19.698,1004.69,-18.7131,1004.59,-12.3359,"curveto",
1004.59,3.2871,"lineto",
1008.17,0.0,1010.46,-0.997211,1014.65,-0.997211,"curveto",
1026.49,-0.997211,1035.54,10.1445,1035.54,24.5856,"curveto",
1035.54,36.9214,1028.57,45.7732,1018.92,45.7732,"curveto",
1013.35,45.7732,1008.97,43.3848,1004.59,37.9186,"curveto",
1004.59,45.5762,"lineto",
1004.0,45.7732,"lineto",
998.617,43.6926,995.133,42.3876,989.667,40.701,"curveto",
989.667,39.1128,"lineto",
990.554,39.2113,991.157,39.2113,992.154,39.2113,"curveto",
995.54,39.2113,996.229,38.2141,996.229,33.5358,"curveto",
996.229,-13.0376,"lineto",
996.229,-18.3068,995.133,-19.304,989.261,-19.9073,"curveto",
989.261,-21.5939,"lineto",
"closepath",
1004.59,33.2404,"moveto",
1004.59,36.2197,1010.17,39.8023,1014.75,39.8023,"curveto",
1022.11,39.8023,1026.98,32.2431,1026.98,20.5967,"curveto",
1026.98,9.65202,1022.11,2.1914,1014.94,2.1914,"curveto",
1010.26,2.1914,1004.59,5.77397,1004.59,8.75329,"curveto",
1004.59,33.2404,"lineto",
"closepath",
1079.37,16.3247,"moveto",
1074.59,8.75329,1070.31,5.87246,1063.94,5.87246,"curveto",
1058.27,5.87246,1054.0,8.75329,1051.1,14.4288,"curveto",
1049.32,18.2083,1048.62,21.3969,1048.42,27.5649,"curveto",
1079.07,27.5649,"lineto",
1078.27,34.0283,1077.28,36.9214,1074.79,40.11,"curveto",
1071.81,43.6926,1067.23,45.7732,1062.05,45.7732,"curveto",
1057.07,45.7732,1052.4,43.9881,1048.62,40.6025,"curveto",
1043.94,36.5275,1041.25,29.4608,1041.25,21.2985,"curveto",
1041.25,7.5591,1048.42,-0.997211,1059.87,-0.997211,"curveto",
1069.32,-0.997211,1076.78,4.87525,1080.96,15.623,"curveto",
1079.37,16.3247,"lineto",
"closepath",
1048.62,30.7535,"moveto",
1049.71,38.5096,1053.1,42.1906,1059.17,42.1906,"curveto",
1065.24,42.1906,1067.63,39.4083,1068.92,30.7535,"curveto",
1048.62,30.7535,"lineto",
"closepath",
1132.03,5.77397,"moveto",
1130.74,5.67548,1130.13,5.67548,1129.74,5.67548,"curveto",
1126.25,5.67548,1125.36,6.77118,1125.36,11.3387,"curveto",
1125.36,67.7734,"lineto",
1124.86,67.9704,"lineto",
1120.18,66.3699,1116.8,65.2865,1110.24,63.5876,"curveto",
1110.24,61.9994,"lineto",
1111.03,62.0979,1111.53,62.0979,1112.42,62.0979,"curveto",
1116.11,62.0979,1117.0,61.1007,1117.0,57.0257,"curveto",
1117.0,41.5012,"lineto",
1113.22,44.6775,1110.53,45.7732,1106.56,45.7732,"curveto",
1095.11,45.7732,1085.85,34.533,1085.85,20.3997,"curveto",
1085.85,7.65759,1093.21,-0.997211,1104.27,-0.997211,"curveto",
1109.83,-0.997211,1113.61,0.997211,1117.0,5.67548,"curveto",
1117.0,-0.701741,"lineto",
1117.4,-0.997211,"lineto",
1132.03,4.17351,"lineto",
1132.03,5.77397,"lineto",
"closepath",
1117.0,10.1445,"moveto",
1117.0,9.45504,1116.31,8.26085,1115.31,7.16514,"curveto",
1113.61,5.17072,1111.03,4.17351,1108.14,4.17351,"curveto",
1099.79,4.17351,1094.41,12.1389,1094.41,24.4748,"curveto",
1094.41,35.6287,1099.28,42.9909,1106.85,42.9909,"curveto",
1112.22,42.9909,1117.0,38.3126,1117.0,33.0434,"curveto",
1117.0,10.1445,"lineto",
"closepath",
1183.04,45.7732,"moveto",
1170.01,45.7732,1161.04,36.2197,1161.04,22.4926,"curveto",
1161.04,8.95028,1170.3,-0.997211,1182.85,-0.997211,"curveto",
1195.38,-0.997211,1204.93,9.45504,1204.93,23.2806,"curveto",
1204.93,36.4167,1195.77,45.7732,1183.04,45.7732,"curveto",
"closepath",
1181.75,42.9909,"moveto",
1190.11,42.9909,1195.98,33.4373,1195.98,19.8088,"curveto",
1195.98,8.45782,1191.5,1.78513,1184.04,1.78513,"curveto",
1180.15,1.78513,1176.47,4.17351,1174.39,8.16236,"curveto",
1171.59,13.3331,1170.01,20.3012,1170.01,27.3679,"curveto",
1170.01,36.8229,1174.59,42.9909,1181.75,42.9909,"curveto",
"closepath",
1255.63,44.776,"moveto",
1241.8,44.776,"lineto",
1241.8,43.2863,"lineto",
1244.98,42.9909,1246.47,41.9937,1246.47,40.11,"curveto",
1246.47,39.1128,1246.28,38.1156,1245.88,37.1184,"curveto",
1236.02,11.3387,"lineto",
1225.88,36.8229,"lineto",
1225.27,38.2141,1224.98,39.6053,1224.98,40.504,"curveto",
1224.98,42.2891,1226.07,42.9909,1229.56,43.2863,"curveto",
1229.56,44.776,"lineto",
1210.06,44.776,"lineto",
1210.06,43.2863,"lineto",
1213.84,43.0894,1214.53,42.0921,1219.11,31.8492,"curveto",
1231.05,3.2871,"lineto",
1231.24,2.68385,1231.55,1.99442,1231.85,1.19419,"curveto",
1232.14,0.39396,1232.44,-0.29547,1232.75,-0.800231,"curveto",
1232.94,-1.19419,1233.34,-1.39117,1233.63,-1.39117,"curveto",
1234.24,-1.39117,1234.93,-0.09849,1236.43,3.58257,"curveto",
1249.16,35.5303,"lineto",
1252.05,42.2891,1252.64,42.9909,1255.63,43.2863,"curveto",
1255.63,44.776,"lineto",
"closepath",
1298.76,16.3247,"moveto",
1293.99,8.75329,1289.7,5.87246,1283.34,5.87246,"curveto",
1277.66,5.87246,1273.39,8.75329,1270.5,14.4288,"curveto",
1268.71,18.2083,1268.01,21.3969,1267.81,27.5649,"curveto",
1298.47,27.5649,"lineto",
1297.67,34.0283,1296.67,36.9214,1294.18,40.11,"curveto",
1291.2,43.6926,1286.62,45.7732,1281.44,45.7732,"curveto",
1276.47,45.7732,1271.79,43.9881,1268.01,40.6025,"curveto",
1263.33,36.5275,1260.65,29.4608,1260.65,21.2985,"curveto",
1260.65,7.5591,1267.81,-0.997211,1279.26,-0.997211,"curveto",
1288.72,-0.997211,1296.18,4.87525,1300.35,15.623,"curveto",
1298.76,16.3247,"lineto",
"closepath",
1268.01,30.7535,"moveto",
1269.1,38.5096,1272.49,42.1906,1278.56,42.1906,"curveto",
1284.63,42.1906,1287.02,39.4083,1288.31,30.7535,"curveto",
1268.01,30.7535,"lineto",
"closepath",
1303.05,0.0,"moveto",
1326.93,0.0,"lineto",
1326.93,1.48966,"lineto",
1320.27,1.68664,1318.67,3.09012,1318.48,8.95028,"curveto",
1318.48,31.3444,"lineto",
1318.48,34.533,1322.66,39.5068,1325.44,39.5068,"curveto",
1326.05,39.5068,1326.93,39.0143,1328.03,38.0171,"curveto",
1329.53,36.5275,1330.73,36.0227,1332.02,36.0227,"curveto",
1334.41,36.0227,1335.9,37.7217,1335.9,40.504,"curveto",
1335.9,43.7911,1333.8,45.7732,1330.42,45.7732,"curveto",
1326.24,45.7732,1323.45,43.5818,1318.48,36.4167,"curveto",
1318.48,45.5762,"lineto",
1317.98,45.7732,"lineto",
1312.41,43.5818,1308.82,42.1906,1303.26,40.4055,"curveto",
1303.26,38.805,"lineto",
1304.65,39.1128,1305.54,39.2113,1306.73,39.2113,"curveto",
1309.23,39.2113,1310.12,37.6109,1310.12,33.2404,"curveto",
1310.12,8.35933,"lineto",
1309.92,3.18861,1309.33,2.58536,1303.05,1.48966,"curveto",
1303.05,0.0,"lineto",
"closepath",
1386.23,44.776,"moveto",
1376.18,44.776,"lineto",
1376.18,56.3239,"lineto",
1376.18,57.3212,1375.98,57.6166,1375.48,57.6166,"curveto",
1369.71,49.2573,1366.73,45.8717,1363.83,44.1851,"curveto",
1362.75,43.4833,1362.15,42.8924,1362.15,42.2891,"curveto",
1362.15,41.9937,1362.25,41.7967,1362.54,41.5997,"curveto",
1367.82,41.5997,"lineto",
1367.82,11.6464,"lineto",
1367.82,3.2871,1370.8,-0.997211,1376.67,-0.997211,"curveto",
1381.55,-0.997211,1385.33,1.39117,1388.62,6.56189,"curveto",
1387.32,7.65759,"lineto",
1385.13,5.07223,1383.54,4.17351,1381.35,4.17351,"curveto",
1377.67,4.17351,1376.18,6.86967,1376.18,13.1361,"curveto",
1376.18,41.5997,"lineto",
1386.23,41.5997,"lineto",
1386.23,44.776,"lineto",
"closepath",
1437.12,1.48966,"moveto",
1431.74,2.38838,1431.25,3.09012,1431.15,10.1445,"curveto",
1431.15,29.9533,"lineto",
1431.15,40.4055,1427.06,45.7732,1418.9,45.7732,"curveto",
1413.03,45.7732,1408.86,43.3848,1404.28,37.4139,"curveto",
1404.28,67.6749,"lineto",
1403.78,67.9704,"lineto",
1400.3,66.7762,1397.81,65.976,1392.33,64.3878,"curveto",
1389.65,63.5876,"lineto",
1389.65,61.9994,"lineto",
1390.04,62.0979,1390.24,62.0979,1390.84,62.0979,"curveto",
1395.12,62.0979,1395.92,61.2977,1395.92,57.0257,"curveto",
1395.92,10.1445,"lineto",
1395.72,2.97932,1395.21,2.1914,1389.55,1.48966,"curveto",
1389.55,0.0,"lineto",
1411.05,0.0,"lineto",
1411.05,1.48966,"lineto",
1405.27,1.99442,1404.47,3.09012,1404.28,10.1445,"curveto",
1404.28,34.1391,"lineto",
1408.46,38.7066,1411.44,40.4055,1415.42,40.4055,"curveto",
1420.29,40.4055,1422.79,36.8229,1422.79,29.8548,"curveto",
1422.79,10.1445,"lineto",
1422.58,3.09012,1421.7,1.99442,1416.02,1.48966,"curveto",
1416.02,0.0,"lineto",
1437.12,0.0,"lineto",
1437.12,1.48966,"lineto",
"closepath",
1479.25,16.3247,"moveto",
1474.48,8.75329,1470.19,5.87246,1463.83,5.87246,"curveto",
1458.15,5.87246,1453.88,8.75329,1450.99,14.4288,"curveto",
1449.2,18.2083,1448.5,21.3969,1448.3,27.5649,"curveto",
1478.96,27.5649,"lineto",
1478.16,34.0283,1477.16,36.9214,1474.67,40.11,"curveto",
1471.7,43.6926,1467.12,45.7732,1461.93,45.7732,"curveto",
1456.96,45.7732,1452.28,43.9881,1448.5,40.6025,"curveto",
1443.82,36.5275,1441.14,29.4608,1441.14,21.2985,"curveto",
1441.14,7.5591,1448.3,-0.997211,1459.75,-0.997211,"curveto",
1469.21,-0.997211,1476.67,4.87525,1480.84,15.623,"curveto",
1479.25,16.3247,"lineto",
"closepath",
1448.5,30.7535,"moveto",
1449.6,38.5096,1452.98,42.1906,1459.05,42.1906,"curveto",
1465.12,42.1906,1467.51,39.4083,1468.8,30.7535,"curveto",
1448.5,30.7535,"lineto",
"closepath",
1510.14,0.0,"moveto",
1533.62,0.0,"lineto",
1533.62,1.48966,"lineto",
1527.35,1.78513,1526.26,2.78234,1526.16,8.35933,"curveto",
1526.16,67.7734,"lineto",
1525.76,67.9704,"lineto",
1520.69,66.3699,1517.0,65.2865,1509.94,63.5876,"curveto",
1509.94,61.9994,"lineto",
1510.53,61.9994,"lineto",
1511.63,62.0979,1512.82,62.1964,1513.62,62.1964,"curveto",
1516.8,62.1964,1517.8,60.8052,1517.8,56.127,"curveto",
1517.8,8.65481,"lineto",
1517.7,3.2871,1516.31,1.89593,1510.14,1.48966,"curveto",
1510.14,0.0,"lineto",
"closepath",
1579.83,6.56189,"moveto",
1578.14,5.17072,1576.94,4.67827,1575.45,4.67827,"curveto",
1573.16,4.67827,1572.47,6.06944,1572.47,10.4522,"curveto",
1572.47,29.8548,"lineto",
1572.47,35.0255,1571.97,37.9186,1570.48,40.307,"curveto",
1568.29,43.8896,1564.01,45.7732,1558.14,45.7732,"curveto",
1548.79,45.7732,1541.42,40.898,1541.42,34.6315,"curveto",
1541.42,32.3416,1543.31,30.3472,1545.7,30.3472,"curveto",
1548.08,30.3472,1550.18,32.3416,1550.18,34.533,"curveto",
1550.18,34.927,1550.08,35.4318,1549.98,36.1212,"curveto",
1549.78,37.0199,1549.68,37.8201,1549.68,38.5096,"curveto",
1549.68,41.1934,1552.86,43.3848,1556.85,43.3848,"curveto",
1561.72,43.3848,1564.41,40.504,1564.41,35.124,"curveto",
1564.41,29.0545,"lineto",
1549.18,22.9851,1547.39,22.0864,1543.11,18.3068,"curveto",
1540.92,16.3247,1539.53,12.9391,1539.53,9.65202,"curveto",
1539.53,3.38559,1543.91,-0.997211,1549.98,-0.997211,"curveto",
1554.35,-0.997211,1558.44,1.0957,1564.51,6.26642,"curveto",
1565.0,0.997211,1566.8,-0.997211,1570.87,-0.997211,"curveto",
1574.26,-0.997211,1576.35,0.19698,1579.83,3.97653,"curveto",
1579.83,6.56189,"lineto",
"closepath",
1564.41,12.2374,"moveto",
1564.41,9.25806,1563.9,8.16236,1561.82,6.96816,"curveto",
1559.34,5.57699,1556.64,4.77676,1554.56,4.77676,"curveto",
1551.08,4.77676,1548.28,8.16236,1548.28,12.4344,"curveto",
1548.28,12.8406,"lineto",
1548.38,18.8116,1552.76,22.5911,1564.41,26.6662,"curveto",
1564.41,12.2374,"lineto",
"closepath",
1621.84,13.4316,"moveto",
1620.05,13.8378,"lineto",
1618.26,4.48129,1616.87,3.2871,1607.32,2.97932,"curveto",
1593.58,2.97932,"lineto",
1620.35,43.2863,"lineto",
1620.35,44.776,"lineto",
1585.82,44.776,"lineto",
1585.51,33.0434,"lineto",
1587.31,33.0434,"lineto",
1588.11,40.11,1589.5,41.5997,1595.67,41.7967,"curveto",
1609.4,41.7967,"lineto",
1582.93,1.48966,"lineto",
1582.93,0.0,"lineto",
1620.45,0.0,"lineto",
1621.84,13.4316,"lineto",
"closepath",
1671.92,44.776,"moveto",
1658.47,44.776,"lineto",
1658.47,43.2863,"lineto",
1661.66,43.2863,1663.25,42.3876,1663.25,40.7995,"curveto",
1663.25,40.4055,1663.15,39.8023,1662.86,39.1128,"curveto",
1653.2,11.6464,"lineto",
1641.75,36.8229,"lineto",
1641.16,38.2141,1640.76,39.6053,1640.76,40.6025,"curveto",
1640.76,42.3876,1642.26,43.0894,1646.53,43.2863,"curveto",
1646.53,44.776,"lineto",
1626.03,44.776,"lineto",
1626.03,43.3848,"lineto",
1628.62,42.9909,1630.32,41.8952,1631.1,40.2085,"curveto",
1642.46,15.7215,"lineto",
1643.65,13.0376,1643.75,12.9391,1644.24,11.9419,"curveto",
1647.04,6.96816,1648.62,3.2871,1648.62,1.78513,"curveto",
1648.62,0.19698,1646.33,-5.87246,1644.65,-8.95028,"curveto",
1643.14,-11.4495,1641.06,-13.3331,1639.67,-13.3331,"curveto",
1639.07,-13.3331,1638.17,-13.1361,1637.08,-12.6436,"curveto",
1635.29,-11.9419,1633.49,-11.5479,1631.9,-11.5479,"curveto",
1629.52,-11.5479,1627.62,-13.4316,1627.62,-15.9184,"curveto",
1627.62,-19.2055,1630.71,-21.6924,1634.99,-21.6924,"curveto",
1641.75,-21.6924,1646.33,-16.2262,1651.81,-1.78513,"curveto",
1667.14,38.805,"lineto",
1668.43,41.9937,1669.53,42.9909,1671.92,43.2863,"curveto",
1671.92,44.776,"lineto",
"closepath",
1748.5,5.77397,"moveto",
1747.21,5.67548,1746.61,5.67548,1746.21,5.67548,"curveto",
1742.73,5.67548,1741.83,6.77118,1741.83,11.3387,"curveto",
1741.83,67.7734,"lineto",
1741.34,67.9704,"lineto",
1736.66,66.3699,1733.27,65.2865,1726.71,63.5876,"curveto",
1726.71,61.9994,"lineto",
1727.5,62.0979,1728.0,62.0979,1728.89,62.0979,"curveto",
1732.58,62.0979,1733.47,61.1007,1733.47,57.0257,"curveto",
1733.47,41.5012,"lineto",
1729.69,44.6775,1727.01,45.7732,1723.03,45.7732,"curveto",
1711.58,45.7732,1702.32,34.533,1702.32,20.3997,"curveto",
1702.32,7.65759,1709.68,-0.997211,1720.74,-0.997211,"curveto",
1726.3,-0.997211,1730.08,0.997211,1733.47,5.67548,"curveto",
1733.47,-0.701741,"lineto",
1733.88,-0.997211,"lineto",
1748.5,4.17351,"lineto",
1748.5,5.77397,"lineto",
"closepath",
1733.47,10.1445,"moveto",
1733.47,9.45504,1732.78,8.26085,1731.78,7.16514,"curveto",
1730.08,5.17072,1727.5,4.17351,1724.62,4.17351,"curveto",
1716.26,4.17351,1710.88,12.1389,1710.88,24.4748,"curveto",
1710.88,35.6287,1715.75,42.9909,1723.32,42.9909,"curveto",
1728.69,42.9909,1733.47,38.3126,1733.47,33.0434,"curveto",
1733.47,10.1445,"lineto",
"closepath",
1774.52,45.7732,"moveto",
1761.48,45.7732,1752.52,36.2197,1752.52,22.4926,"curveto",
1752.52,8.95028,1761.78,-0.997211,1774.32,-0.997211,"curveto",
1786.85,-0.997211,1796.41,9.45504,1796.41,23.2806,"curveto",
1796.41,36.4167,1787.25,45.7732,1774.52,45.7732,"curveto",
"closepath",
1773.23,42.9909,"moveto",
1781.58,42.9909,1787.46,33.4373,1787.46,19.8088,"curveto",
1787.46,8.45782,1782.98,1.78513,1775.52,1.78513,"curveto",
1771.63,1.78513,1767.94,4.17351,1765.86,8.16236,"curveto",
1763.07,13.3331,1761.48,20.3012,1761.48,27.3679,"curveto",
1761.48,36.8229,1766.06,42.9909,1773.23,42.9909,"curveto",
"closepath",
1846.41,38.6081,"moveto",
1846.41,42.4984,"lineto",
1838.75,42.4984,"lineto",
1836.66,42.4984,1835.27,42.7939,1833.27,43.4833,"curveto",
1831.08,44.2835,"lineto",
1828.49,45.2808,1825.71,45.7732,1823.13,45.7732,"curveto",
1813.87,45.7732,1806.51,38.7066,1806.51,29.5593,"curveto",
1806.51,23.2806,1809.09,19.501,1815.75,16.2262,"curveto",
1813.17,13.8378,"lineto",
1811.09,11.8434,1809.89,10.7477,1809.58,10.3538,"curveto",
1807.5,8.16236,1806.9,7.06665,1806.9,5.3677,"curveto",
1806.9,3.18861,1808.0,2.09291,1812.17,0.09849,"curveto",
1805.0,-5.07223,1802.42,-8.35933,1802.42,-12.0404,"curveto",
1802.42,-17.3096,1810.09,-21.6924,1819.64,-21.6924,"curveto",
1827.1,-21.6924,1834.86,-19.1071,1840.04,-14.9212,"curveto",
1843.82,-11.8434,1845.51,-8.65481,1845.51,-4.87525,"curveto",
1845.51,1.29268,1840.83,5.3677,1833.47,5.77397,"curveto",
1820.64,6.36491,"lineto",
1815.26,6.56189,1812.87,7.46061,1812.87,9.06108,"curveto",
1812.87,11.0432,1816.16,14.5273,1818.84,15.3275,"curveto",
1822.42,15.032,1824.32,14.8227,1824.52,14.8227,"curveto",
1828.2,14.8227,1832.17,16.3247,1835.27,19.0086,"curveto",
1838.55,21.7909,1840.04,25.275,1840.04,30.2487,"curveto",
1840.04,33.1419,1839.54,35.4318,1838.15,38.6081,"curveto",
1846.41,38.6081,"lineto",
"closepath",
1814.26,-0.19698,"moveto",
1817.65,-0.898721,1825.42,-1.48966,1830.49,-1.48966,"curveto",
1839.44,-1.48966,1842.73,-2.78234,1842.73,-6.36491,"curveto",
1842.73,-12.1389,1835.17,-16.0169,1823.91,-16.0169,"curveto",
1815.06,-16.0169,1809.39,-13.1361,1809.39,-8.75329,"curveto",
1809.39,-6.4634,1810.29,-4.97374,1814.26,-0.19698,"curveto",
"closepath",
1814.77,33.6343,"moveto",
1814.77,39.5068,1817.55,42.9909,1822.13,42.9909,"curveto",
1825.21,42.9909,1827.8,41.3042,1829.39,38.3126,"curveto",
1831.28,34.8285,1832.37,30.3472,1832.37,26.3707,"curveto",
1832.37,20.7937,1829.59,17.3096,1825.01,17.3096,"curveto",
1818.84,17.3096,1814.77,23.7853,1814.77,33.3389,"curveto",
1814.77,33.6343,"lineto",
"closepath"
];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment