git.iko.soy/distributed-process
on master help sign in
Close TCP sockets when no longer required
3e91243Edsko de Vries
doc/NetworkTCP.svgnew file+630
@@ -0,0 +1,630 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:xlink="http://www.w3.org/1999/xlink"
11+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13+ width="1024px"
14+ height="768px"
15+ id="svg4129"
16+ version="1.1"
17+ inkscape:version="0.48.2 r9819"
18+ sodipodi:docname="NetworkTCP.svg">
19+ <defs
20+ id="defs4131">
21+ <linearGradient
22+ id="linearGradient4726">
23+ <stop
24+ style="stop-color:#800000;stop-opacity:1;"
25+ offset="0"
26+ id="stop4728" />
27+ <stop
28+ style="stop-color:#ffffff;stop-opacity:1;"
29+ offset="1"
30+ id="stop4730" />
31+ </linearGradient>
32+ <linearGradient
33+ id="linearGradient4647">
34+ <stop
35+ style="stop-color:#008080;stop-opacity:1;"
36+ offset="0"
37+ id="stop4649" />
38+ <stop
39+ style="stop-color:#ffffff;stop-opacity:1;"
40+ offset="1"
41+ id="stop4651" />
42+ </linearGradient>
43+ <linearGradient
44+ inkscape:collect="always"
45+ xlink:href="#linearGradient4647"
46+ id="linearGradient4655"
47+ x1="-666.70703"
48+ y1="18.113195"
49+ x2="952.4931"
50+ y2="345.05661"
51+ gradientUnits="userSpaceOnUse"
52+ gradientTransform="matrix(0.43409118,0,0,0.88792276,19.021275,3.9151406)" />
53+ <linearGradient
54+ inkscape:collect="always"
55+ xlink:href="#linearGradient4647-0"
56+ id="linearGradient4655-9"
57+ x1="-666.70703"
58+ y1="18.113195"
59+ x2="952.4931"
60+ y2="345.05661"
61+ gradientUnits="userSpaceOnUse"
62+ gradientTransform="matrix(0.43409118,0,0,1.0013813,19.021275,0.01045425)" />
63+ <linearGradient
64+ id="linearGradient4647-0">
65+ <stop
66+ style="stop-color:#008080;stop-opacity:1;"
67+ offset="0"
68+ id="stop4649-1" />
69+ <stop
70+ style="stop-color:#ffffff;stop-opacity:1;"
71+ offset="1"
72+ id="stop4651-0" />
73+ </linearGradient>
74+ <linearGradient
75+ y2="345.05661"
76+ x2="952.4931"
77+ y1="18.113195"
78+ x1="-666.70703"
79+ gradientTransform="matrix(0.43409118,0,0,0.89091289,557.01803,3.5315903)"
80+ gradientUnits="userSpaceOnUse"
81+ id="linearGradient4680"
82+ xlink:href="#linearGradient4647-0"
83+ inkscape:collect="always" />
84+ <linearGradient
85+ inkscape:collect="always"
86+ xlink:href="#linearGradient4647-9"
87+ id="linearGradient4655-8"
88+ x1="-666.70703"
89+ y1="18.113195"
90+ x2="952.4931"
91+ y2="345.05661"
92+ gradientUnits="userSpaceOnUse"
93+ gradientTransform="matrix(0.43409118,0,0,1.0013813,19.021275,0.01045425)" />
94+ <linearGradient
95+ id="linearGradient4647-9">
96+ <stop
97+ style="stop-color:#008080;stop-opacity:1;"
98+ offset="0"
99+ id="stop4649-4" />
100+ <stop
101+ style="stop-color:#ffffff;stop-opacity:1;"
102+ offset="1"
103+ id="stop4651-7" />
104+ </linearGradient>
105+ <linearGradient
106+ y2="345.05661"
107+ x2="952.4931"
108+ y1="18.113195"
109+ x1="-666.70703"
110+ gradientTransform="matrix(0.99936476,0,0,0.90055146,-0.79188555,417.08666)"
111+ gradientUnits="userSpaceOnUse"
112+ id="linearGradient4680-6"
113+ xlink:href="#linearGradient4647-9"
114+ inkscape:collect="always" />
115+ <linearGradient
116+ inkscape:collect="always"
117+ xlink:href="#linearGradient4726"
118+ id="linearGradient4732"
119+ x1="484.52829"
120+ y1="88.754707"
121+ x2="18.113218"
122+ y2="336.90564"
123+ gradientUnits="userSpaceOnUse" />
124+ <linearGradient
125+ inkscape:collect="always"
126+ xlink:href="#linearGradient4726-0"
127+ id="linearGradient4732-1"
128+ x1="484.52829"
129+ y1="88.754707"
130+ x2="18.113218"
131+ y2="336.90564"
132+ gradientUnits="userSpaceOnUse" />
133+ <linearGradient
134+ inkscape:collect="always"
135+ id="linearGradient4726-0">
136+ <stop
137+ style="stop-color:#800000;stop-opacity:1;"
138+ offset="0"
139+ id="stop4728-2" />
140+ <stop
141+ style="stop-color:#800000;stop-opacity:0;"
142+ offset="1"
143+ id="stop4730-5" />
144+ </linearGradient>
145+ <linearGradient
146+ gradientTransform="translate(539.26415,1.83019)"
147+ y2="336.90564"
148+ x2="18.113218"
149+ y1="88.754707"
150+ x1="484.52829"
151+ gradientUnits="userSpaceOnUse"
152+ id="linearGradient4755"
153+ xlink:href="#linearGradient4726-0"
154+ inkscape:collect="always" />
155+ <linearGradient
156+ inkscape:collect="always"
157+ xlink:href="#linearGradient4726-6"
158+ id="linearGradient4732-4"
159+ x1="484.52829"
160+ y1="88.754707"
161+ x2="18.113218"
162+ y2="336.90564"
163+ gradientUnits="userSpaceOnUse" />
164+ <linearGradient
165+ id="linearGradient4726-6">
166+ <stop
167+ style="stop-color:#800000;stop-opacity:1;"
168+ offset="0"
169+ id="stop4728-4" />
170+ <stop
171+ style="stop-color:#ffffff;stop-opacity:1;"
172+ offset="1"
173+ id="stop4730-53" />
174+ </linearGradient>
175+ <linearGradient
176+ gradientTransform="translate(543.26415,3.830193)"
177+ y2="336.90564"
178+ x2="18.113218"
179+ y1="88.754707"
180+ x1="484.52829"
181+ gradientUnits="userSpaceOnUse"
182+ id="linearGradient4795"
183+ xlink:href="#linearGradient4726-6"
184+ inkscape:collect="always" />
185+ <linearGradient
186+ inkscape:collect="always"
187+ xlink:href="#linearGradient4726-4"
188+ id="linearGradient4732-6"
189+ x1="484.52829"
190+ y1="88.754707"
191+ x2="18.113218"
192+ y2="336.90564"
193+ gradientUnits="userSpaceOnUse" />
194+ <linearGradient
195+ id="linearGradient4726-4">
196+ <stop
197+ style="stop-color:#800000;stop-opacity:1;"
198+ offset="0"
199+ id="stop4728-40" />
200+ <stop
201+ style="stop-color:#ffffff;stop-opacity:1;"
202+ offset="1"
203+ id="stop4730-7" />
204+ </linearGradient>
205+ <linearGradient
206+ gradientTransform="translate(-0.73585,416.83019)"
207+ y2="336.90564"
208+ x2="18.113218"
209+ y1="88.754707"
210+ x1="484.52829"
211+ gradientUnits="userSpaceOnUse"
212+ id="linearGradient4795-1"
213+ xlink:href="#linearGradient4726-4"
214+ inkscape:collect="always" />
215+ <linearGradient
216+ inkscape:collect="always"
217+ xlink:href="#linearGradient4726-3"
218+ id="linearGradient4732-2"
219+ x1="484.52829"
220+ y1="88.754707"
221+ x2="18.113218"
222+ y2="336.90564"
223+ gradientUnits="userSpaceOnUse" />
224+ <linearGradient
225+ id="linearGradient4726-3">
226+ <stop
227+ style="stop-color:#800000;stop-opacity:1;"
228+ offset="0"
229+ id="stop4728-8" />
230+ <stop
231+ style="stop-color:#ffffff;stop-opacity:1;"
232+ offset="1"
233+ id="stop4730-1" />
234+ </linearGradient>
235+ <linearGradient
236+ gradientTransform="translate(542.26415,415.83019)"
237+ y2="336.90564"
238+ x2="18.113218"
239+ y1="88.754707"
240+ x1="484.52829"
241+ gradientUnits="userSpaceOnUse"
242+ id="linearGradient4795-4"
243+ xlink:href="#linearGradient4726-3"
244+ inkscape:collect="always" />
245+ </defs>
246+ <sodipodi:namedview
247+ id="base"
248+ pagecolor="#ffffff"
249+ bordercolor="#666666"
250+ borderopacity="1.0"
251+ inkscape:pageopacity="0.0"
252+ inkscape:pageshadow="2"
253+ inkscape:zoom="1"
254+ inkscape:cx="512"
255+ inkscape:cy="384"
256+ inkscape:current-layer="layer1"
257+ inkscape:document-units="px"
258+ showgrid="false"
259+ showguides="true"
260+ inkscape:guide-bbox="true"
261+ inkscape:window-width="1916"
262+ inkscape:window-height="1036"
263+ inkscape:window-x="4"
264+ inkscape:window-y="22"
265+ inkscape:window-maximized="1">
266+ <sodipodi:guide
267+ orientation="1,0"
268+ position="984,175"
269+ id="guide4870" />
270+ </sodipodi:namedview>
271+ <metadata
272+ id="metadata4134">
273+ <rdf:RDF>
274+ <cc:Work
275+ rdf:about="">
276+ <dc:format>image/svg+xml</dc:format>
277+ <dc:type
278+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
279+ <dc:title></dc:title>
280+ </cc:Work>
281+ </rdf:RDF>
282+ </metadata>
283+ <g
284+ id="layer1"
285+ inkscape:label="Layer 1"
286+ inkscape:groupmode="layer">
287+ <rect
288+ style="fill:url(#linearGradient4680);fill-opacity:1;stroke:#340000;stroke-width:1.24376428;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
289+ id="rect4137-5"
290+ width="412.79617"
291+ height="287.24374"
292+ x="571.56415"
293+ y="34.192436" />
294+ <rect
295+ style="fill:url(#linearGradient4655);fill-opacity:1;stroke:#340000;stroke-width:1.24167538;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
296+ id="rect4137"
297+ width="412.79617"
298+ height="286.27966"
299+ x="33.567425"
300+ y="34.473083" />
301+ <rect
302+ style="fill:url(#linearGradient4680-6);fill-opacity:1;stroke:#340000;stroke-width:1.89734483;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
303+ id="rect4137-6"
304+ width="950.33942"
305+ height="290.35135"
306+ x="32.696255"
307+ y="448.07922" />
308+ <rect
309+ style="fill:none;stroke:#000000;stroke-width:11.57752419;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
310+ id="rect4657-9"
311+ width="582.76776"
312+ height="149.16254"
313+ x="109.61612"
314+ y="-311.5813"
315+ transform="matrix(0,1,-1,0,0,0)" />
316+ <rect
317+ style="fill:none;stroke:#000000;stroke-width:11.57752419000000010;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;fill-opacity:1;opacity:1"
318+ id="rect4657"
319+ width="582.76776"
320+ height="149.16254"
321+ x="256.99347"
322+ y="124.76707" />
323+ <text
324+ xml:space="preserve"
325+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
326+ x="36.887089"
327+ y="73.584908"
328+ id="text4659"
329+ sodipodi:linespacing="125%"><tspan
330+ sodipodi:role="line"
331+ id="tspan4661"
332+ x="36.887089"
333+ y="73.584908">192.168.1.0:8080</tspan></text>
334+ <text
335+ xml:space="preserve"
336+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
337+ x="574.88385"
338+ y="73.30426"
339+ id="text4659-2"
340+ sodipodi:linespacing="125%"><tspan
341+ sodipodi:role="line"
342+ id="tspan4661-9"
343+ x="574.88385"
344+ y="73.30426">192.168.1.0:8081</tspan></text>
345+ <rect
346+ style="fill:none;stroke:#000000;stroke-width:11.57752419000000010;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
347+ id="rect4657-7"
348+ width="582.76776"
349+ height="149.16254"
350+ x="229.61612"
351+ y="535.4187" />
352+ <text
353+ xml:space="preserve"
354+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
355+ x="321.0159"
356+ y="488.19104"
357+ id="text4659-9"
358+ sodipodi:linespacing="125%"><tspan
359+ sodipodi:role="line"
360+ id="tspan4661-90"
361+ x="321.0159"
362+ y="488.19104">192.168.1.1:8080</tspan></text>
363+ <rect
364+ style="fill:url(#linearGradient4732);stroke:#340000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;fill-opacity:1"
365+ id="rect4724"
366+ width="366.79245"
367+ height="200.15094"
368+ x="54.339622"
369+ y="95.094337" />
370+ <text
371+ xml:space="preserve"
372+ style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
373+ x="62.264153"
374+ y="117.35849"
375+ id="text4734"
376+ sodipodi:linespacing="125%"><tspan
377+ sodipodi:role="line"
378+ id="tspan4736"
379+ x="62.264153"
380+ y="117.35849">192.168.1.0:8080:0</tspan></text>
381+ <rect
382+ style="fill:url(#linearGradient4795);fill-opacity:1;stroke:#340000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
383+ id="rect4724-0"
384+ width="366.79245"
385+ height="200.15094"
386+ x="597.60376"
387+ y="98.92453" />
388+ <text
389+ xml:space="preserve"
390+ style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
391+ x="605.52832"
392+ y="121.18868"
393+ id="text4734-8"
394+ sodipodi:linespacing="125%"><tspan
395+ sodipodi:role="line"
396+ id="tspan4736-8"
397+ x="605.52832"
398+ y="121.18868">192.168.1.0:8081:0</tspan></text>
399+ <rect
400+ style="fill:url(#linearGradient4795-1);fill-opacity:1;stroke:#340000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
401+ id="rect4724-6"
402+ width="366.79245"
403+ height="200.15094"
404+ x="53.60376"
405+ y="511.92453" />
406+ <text
407+ xml:space="preserve"
408+ style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
409+ x="63.52832"
410+ y="534.18872"
411+ id="text4734-0"
412+ sodipodi:linespacing="125%"><tspan
413+ sodipodi:role="line"
414+ id="tspan4736-9"
415+ x="63.52832"
416+ y="534.18872">192.168.1.1:8080:0</tspan></text>
417+ <rect
418+ style="fill:url(#linearGradient4795-4);fill-opacity:1;stroke:#340000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
419+ id="rect4724-06"
420+ width="366.79245"
421+ height="200.15094"
422+ x="596.60376"
423+ y="510.92456" />
424+ <text
425+ xml:space="preserve"
426+ style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
427+ x="604.52832"
428+ y="533.18872"
429+ id="text4734-02"
430+ sodipodi:linespacing="125%"><tspan
431+ sodipodi:role="line"
432+ id="tspan4736-4"
433+ x="604.52832"
434+ y="533.18872">192.168.1.1:8080:1</tspan></text>
435+ <path
436+ sodipodi:type="arc"
437+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
438+ id="path5106"
439+ sodipodi:cx="215.5"
440+ sodipodi:cy="197.5"
441+ sodipodi:rx="14.5"
442+ sodipodi:ry="14.5"
443+ d="m 230,197.5 a 14.5,14.5 0 1 1 -29,0 14.5,14.5 0 1 1 29,0 z"
444+ transform="translate(22.235847,-2.3301926)" />
445+ <path
446+ sodipodi:type="arc"
447+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
448+ id="path5106-0"
449+ sodipodi:cx="215.5"
450+ sodipodi:cy="197.5"
451+ sodipodi:rx="14.5"
452+ sodipodi:ry="14.5"
453+ d="m 230,197.5 a 14.5,14.5 0 1 1 -29,0 14.5,14.5 0 1 1 29,0 z"
454+ transform="translate(565.49998,1.5)" />
455+ <path
456+ sodipodi:type="arc"
457+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
458+ id="path5106-7"
459+ sodipodi:cx="215.5"
460+ sodipodi:cy="197.5"
461+ sodipodi:rx="14.5"
462+ sodipodi:ry="14.5"
463+ d="m 230,197.5 a 14.5,14.5 0 1 1 -29,0 14.5,14.5 0 1 1 29,0 z"
464+ transform="translate(564.49998,413.50003)" />
465+ <path
466+ sodipodi:type="arc"
467+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
468+ id="path5106-06"
469+ sodipodi:cx="215.5"
470+ sodipodi:cy="197.5"
471+ sodipodi:rx="14.5"
472+ sodipodi:ry="14.5"
473+ d="m 230,197.5 a 14.5,14.5 0 1 1 -29,0 14.5,14.5 0 1 1 29,0 z"
474+ transform="translate(21.499985,414.5)" />
475+ <path
476+ sodipodi:type="star"
477+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
478+ id="path5217"
479+ sodipodi:sides="3"
480+ sodipodi:cx="-58"
481+ sodipodi:cy="224"
482+ sodipodi:r1="15.033296"
483+ sodipodi:r2="7.5166483"
484+ sodipodi:arg1="-1.5707963"
485+ sodipodi:arg2="-0.52359878"
486+ inkscape:flatsided="true"
487+ inkscape:rounded="0"
488+ inkscape:randomized="0"
489+ d="m -58,208.9667 13.019216,22.54995 -26.038432,0 z"
490+ inkscape:transform-center-y="-3.7583241"
491+ transform="translate(250,279.48335)" />
492+ <path
493+ sodipodi:type="star"
494+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
495+ id="path5217-1"
496+ sodipodi:sides="3"
497+ sodipodi:cx="-58"
498+ sodipodi:cy="224"
499+ sodipodi:r1="15.033296"
500+ sodipodi:r2="7.5166483"
501+ sodipodi:arg1="-1.5707963"
502+ sodipodi:arg2="-0.52359878"
503+ inkscape:flatsided="true"
504+ inkscape:rounded="0"
505+ inkscape:randomized="0"
506+ d="m -58,208.9667 13.019216,22.54995 -26.038432,0 z"
507+ inkscape:transform-center-y="-3.7583241"
508+ transform="translate(336,278.75832)" />
509+ <path
510+ sodipodi:type="star"
511+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
512+ id="path5217-0"
513+ sodipodi:sides="3"
514+ sodipodi:cx="-58"
515+ sodipodi:cy="224"
516+ sodipodi:r1="15.033296"
517+ sodipodi:r2="7.5166483"
518+ sodipodi:arg1="-1.5707963"
519+ sodipodi:arg2="-0.52359878"
520+ inkscape:flatsided="true"
521+ inkscape:rounded="0"
522+ inkscape:randomized="0"
523+ d="m -58,208.9667 13.019216,22.54995 -26.038432,0 z"
524+ inkscape:transform-center-y="-3.7583241"
525+ transform="translate(292,278.75832)" />
526+ <path
527+ sodipodi:type="star"
528+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
529+ id="path5217-7"
530+ sodipodi:sides="3"
531+ sodipodi:cx="-58"
532+ sodipodi:cy="224"
533+ sodipodi:r1="15.033296"
534+ sodipodi:r2="7.5166483"
535+ sodipodi:arg1="-1.5707963"
536+ sodipodi:arg2="-0.52359878"
537+ inkscape:flatsided="true"
538+ inkscape:rounded="0"
539+ inkscape:randomized="0"
540+ d="m -58,208.9667 13.019216,22.54995 -26.038432,0 z"
541+ transform="matrix(0,1,-1,0,654,214.75832)"
542+ inkscape:transform-center-x="-3.7583239" />
543+ <path
544+ sodipodi:type="star"
545+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
546+ id="path5217-4"
547+ sodipodi:sides="3"
548+ sodipodi:cx="-58"
549+ sodipodi:cy="224"
550+ sodipodi:r1="15.033296"
551+ sodipodi:r2="7.5166483"
552+ sodipodi:arg1="-1.5707963"
553+ sodipodi:arg2="-0.52359878"
554+ inkscape:flatsided="true"
555+ inkscape:rounded="0"
556+ inkscape:randomized="0"
557+ d="m -58,208.9667 13.019216,22.54995 -26.038432,0 z"
558+ transform="matrix(0,1,-1,0,653,299.75832)"
559+ inkscape:transform-center-x="-3.7583239" />
560+ <path
561+ sodipodi:type="star"
562+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
563+ id="path5217-49"
564+ sodipodi:sides="3"
565+ sodipodi:cx="-58"
566+ sodipodi:cy="224"
567+ sodipodi:r1="15.033296"
568+ sodipodi:r2="7.5166483"
569+ sodipodi:arg1="-1.5707963"
570+ sodipodi:arg2="-0.52359878"
571+ inkscape:flatsided="true"
572+ inkscape:rounded="0"
573+ inkscape:randomized="0"
574+ d="m -58,208.9667 13.019216,22.54995 -26.038432,0 z"
575+ transform="matrix(0,-1,1,0,365,140.75832)"
576+ inkscape:transform-center-x="3.7583235" />
577+ <path
578+ sodipodi:type="star"
579+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
580+ id="path5217-70"
581+ sodipodi:sides="3"
582+ sodipodi:cx="-58"
583+ sodipodi:cy="224"
584+ sodipodi:r1="15.033296"
585+ sodipodi:r2="7.5166483"
586+ sodipodi:arg1="-1.5707963"
587+ sodipodi:arg2="-0.52359878"
588+ inkscape:flatsided="true"
589+ inkscape:rounded="0"
590+ inkscape:randomized="0"
591+ d="m -58,208.9667 13.019216,22.54995 -26.038432,0 z"
592+ transform="matrix(0,1,-1,0,653,665.75832)"
593+ inkscape:transform-center-x="-3.7583239" />
594+ <path
595+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
596+ id="path5272"
597+ d="m 193.68926,500.34844 c -0.0623,-0.011 -3.1352,-0.097 -2.77128,-1.41324 0.2615,-0.94576 1.83318,-1.37784 1.76404,-2.35665 -0.0476,-0.67399 -2.3566,0.0555 -1.96552,-0.49551 3.61436,-5.09213 7.40016,-2.72086 3.75441,-4.53186 -1.02814,0.14511 -2.14021,0.86727 -3.08442,0.43531 -0.51327,-0.2348 0.48469,-1.05111 0.89792,-1.43558 1.1048,-1.02792 2.49187,-1.72109 3.59807,-2.74751 0.46707,-0.43338 1.70248,-1.66102 1.07001,-1.58392 -5.6701,0.69128 -9.05745,4.75136 -4.37921,0.0443 -0.70285,-0.0451 -1.58092,0.33122 -2.10855,-0.13529 -0.36515,-0.32287 0.13779,-0.98089 0.34974,-1.41981 0.746,-1.54482 2.04183,-2.71312 3.1089,-4.00945 0.4506,-0.54741 1.18336,-0.99124 1.28844,-1.69243 0.0528,-0.35257 -0.64405,-0.30591 -0.96608,-0.45886 -0.29448,-0.23467 -0.54733,-0.53426 -0.88345,-0.704 -4.59528,-2.32065 4.03029,4.51864 2.22179,-3.3353 -0.30962,-1.34461 -4.25255,2.34931 -4.01941,0.98936 0.49925,-2.91216 11.67979,-5.28818 -0.97921,-1.80297 2.24958,4.51807 3.74218,-3.55163 2.31947,-3.58424 -1.2249,-0.0281 -2.37028,0.65039 -3.58472,0.8125 -0.52552,0.0702 -1.82785,0.34942 -1.58584,-0.1223 0.5628,-1.09696 1.92657,-1.54028 2.85501,-2.35149 0.70996,-0.62032 1.37164,-1.29381 2.05746,-1.94071 -0.89522,0.15512 -1.79044,0.31024 -2.68566,0.46535 0.40052,-0.43099 1.78504,-1.21739 1.20156,-1.29297 -1.00554,-0.13025 -3.61463,1.73864 -2.84352,1.08028 2.61678,-2.23416 7.40375,-3.51247 2.7139,-2.27363 -0.68863,-0.56914 -4.0411,1.72327 -3.46573,0.69506 6.10702,-10.91337 6.03578,15.71084 15.20135,-9.25342 1.34953,-3.67571 -7.11657,3.28455 -10.78034,4.66617 -0.56483,0.21299 -1.20609,0.0542 -1.80913,0.0813 0.76568,-2.82657 9.84801,-2.83331 8.08522,-5.59671 -1.3756,-2.15643 -4.67918,2.20115 -7.19335,2.67169 -0.59179,0.11076 0.56857,-1.08069 0.98997,-1.51069 0.9071,-0.92561 3.07293,-1.22924 2.96045,-2.52034 -0.0925,-1.06133 -2.0796,0.46382 -3.1194,0.69573 -1.9254,-1.61777 -0.23831,-2.25512 1.24604,-3.92389 0.51908,-0.58358 2.26263,-1.8224 1.48163,-1.81517 -4.72816,0.0437 -15.68126,8.0904 3.31529,-3.96387 -2.08474,0.72265 -4.12918,1.57418 -6.25422,2.16795 -6.19352,1.73056 1.93855,-2.61924 2.43539,-3.11862 0.23788,-0.23911 -1.011,-0.39289 -0.78275,-0.64119 1.19525,-1.30024 3.85496,-1.42731 4.26366,-3.14549 0.29345,-1.23365 -2.47514,0.55288 -3.71271,0.82932 -0.47093,1.29702 -2.86607,-0.7275 -2.30369,-1.43649 1.13698,-1.43339 6.00313,-3.6915 4.17835,-3.55914 -3.87338,0.28095 -7.04111,4.03354 -10.92463,4.04848 -2.19049,0.008 3.44176,-2.71129 5.19354,-4.02643 2.07031,-1.55429 4.18104,-3.054 6.27156,-4.581 -2.38158,0.72626 -4.66588,1.94492 -7.14472,2.17878 -0.53269,0.0503 0.25632,-1.04063 0.43321,-1.5456 0.96518,-2.7553 0.80112,-1.64828 3.58926,-4.46916 0.67747,-0.68544 2.91667,-2.22292 1.95765,-2.12762 -2.73974,0.27225 -5.202,1.80566 -7.80301,2.70849 -8.68307,1.74603 11.86244,-6.07092 8.35137,-7.01022 -1.96335,-0.52524 -6.69769,3.57812 -5.84576,1.73289 1.22888,-2.6617 5.30375,-2.7549 7.30622,-4.89614 0.68666,-0.73425 -2.00109,0.19549 -3.00164,0.29323 0.87732,-0.86011 1.75464,-1.72023 2.63196,-2.58035 -9.58228,3.08729 -5.78397,4.19264 -6.58589,0.97012 -0.0902,-0.3624 -0.0624,-0.93313 -0.42075,-1.03836 -0.91483,-0.26865 -3.5847,0.69399 -2.8594,0.0751 8.61485,-7.35105 17.70344,-8.79375 5.26595,-5.85043 1.60054,-3.41758 1.28401,-1.02057 -0.60908,-2.58794 -0.3464,-0.2868 -0.289,-0.89839 -0.62771,-1.19424 -0.43227,-0.37759 -1.86567,-0.23189 -1.56403,-0.7202 2.34987,-3.80416 8.10292,-4.17851 0.0503,-2.68926 -1.15677,-3.65997 -0.0599,1.01346 5.25047,-5.42269 0.33771,-0.40931 -1.12483,-0.33282 -1.37625,-0.80012 -0.22134,-0.4114 0.2271,-0.9209 0.19939,-1.38724 -0.20588,-3.46551 -0.71496,1.54991 -0.16416,-2.39216 -5.64005,3.38956 6.40177,-4.28155 4.35608,-4.32495 -1.7082,-0.0362 -3.23754,1.16492 -4.92891,1.40681 -0.55643,0.0796 -2.04039,-0.0979 -1.61937,-0.47032 2.59221,-2.29286 6.19284,-3.30617 8.64724,-5.74599 0.70785,-0.70364 -1.99446,0.0827 -2.99169,0.12404 -0.76412,-0.0589 -2.58888,0.52999 -2.29238,-0.17673 0.62545,-1.49077 4.87787,-2.0553 3.688,-3.14973 -1.3995,-1.28723 -3.63271,1.17661 -5.51093,1.47304 -0.6753,0.10658 -1.96892,0.39814 -2.03141,-0.28266 2.03577,-2.47367 2.13582,-1.3059 1.42131,-3.21609 0.58154,-2.04915 3.24163,-2.36974 4.11535,-4.097 -0.79817,-0.13876 -2.2949,0.11553 -1.46683,-1.35383 0.38381,-0.68104 2.31695,-1.56406 1.55829,-1.75265 -1.35197,-0.33608 -2.68049,0.76035 -4.02074,1.14053 10.77595,-7.1105 3.36075,-1.66253 -0.19448,-1.41063 -0.80754,0.0572 1.50647,-0.94746 1.70133,-1.73322 0.0991,-0.39958 -0.87355,-0.0758 -1.18632,-0.34348 -0.22941,-0.19634 -0.44034,-0.65146 -0.2367,-0.87442 1.11915,-1.22532 2.58807,-2.07788 3.88211,-3.11681 0.46226,-0.59368 2.13907,-1.7945 1.38677,-1.78102 -14.87693,0.26652 -1.27125,4.70958 -2.16014,-1.06114 -0.19906,-1.29234 -2.99053,1.78966 -3.84104,0.79648 -2.43359,-2.8418 7.84171,-2.59072 -0.18106,-2.32196 1.26696,-1.11062 2.53393,-2.22125 3.80089,-3.33188 -0.37381,-0.36169 -1.34521,-0.61552 -1.12142,-1.08506 0.6859,-1.4391 2.50279,-2.08411 3.29206,-3.46921 0.30719,-0.53911 0.33063,-1.66965 -0.26531,-1.84246 -1.52437,-0.44204 -4.51329,1.95947 -4.74554,0.38939 -0.28847,-1.95008 2.79003,-2.78566 4.18504,-4.17849 -2.84688,0.77924 -5.61536,1.94441 -8.54064,2.33772 -0.86059,0.11571 -2.88311,-0.10077 -2.4594,-0.85871 1.22634,-2.19374 3.76055,-3.33687 5.69902,-4.93647 2.28197,-1.88304 5.17285,-3.1505 6.95922,-5.5089 0.48483,-0.64009 -1.53136,-0.56213 -2.33353,-0.59804 -1.34734,-0.0603 -2.6893,0.20862 -4.03395,0.31293 0.68463,-0.93535 1.93126,-1.65341 2.0539,-2.80605 0.14342,-1.34792 -3.60803,-0.10431 -3.67727,-1.17576 -0.0618,-0.95616 1.17488,-1.51652 1.82059,-2.22442 3.91139,-4.28816 5.04581,-3.35568 -6.18155,0.79961 3.2876,-2.35602 5.31447,-2.73015 6.79781,-5.80474 0.18346,-0.38028 0.74816,-1.16656 0.32973,-1.223 -1.22167,-0.16479 -2.80483,1.70893 -3.61503,0.77985 -0.71461,-0.81948 1.69757,-1.45353 2.17622,-2.42979 0.17131,-0.3494 -0.3057,-0.71572 -0.45855,-1.07358 0.20589,-0.53947 1.0395,-1.22409 0.61769,-1.61843 -0.59794,-0.559 -1.71607,0.25692 -2.45368,-0.098 -0.35235,-0.16954 -0.12335,-0.77263 -0.16402,-1.16153 -0.35068,-3.35404 1.76007,-2.61899 -2.06169,-3.55371 0.97288,-0.96358 6.7044,-6.50628 7.49127,-7.802 0.42498,-0.6998 1.09682,-2.25813 0.2981,-2.43805 -2.14748,-0.48373 -4.40681,1.64541 -6.52208,1.03607 -0.89757,-0.25856 0.33999,-1.8897 0.85608,-2.66825 0.97958,-1.47772 2.36172,-2.64483 3.54258,-3.96725 0.0597,-0.68098 0.49091,-1.4346 0.17912,-2.04295 -1.44492,-2.81925 -3.89682,2.01552 0.0472,-3.44476 0.58877,-0.81511 2.85288,-2.38727 1.84737,-2.38469 -5.49626,0.0141 -12.52399,6.39939 -2.52177,-1.41194 0.1794,-0.46573 0.24889,-0.99051 0.53821,-1.39719 4.68594,-6.58674 -0.51929,4.47458 -3.32287,-0.5112 -0.864,-1.53652 3.5875,-1.65903 4.094,-3.34747 0.30845,-1.02819 -2.13504,0.50427 -3.19953,0.36577 -0.41883,-0.0545 -0.59573,-0.59889 -0.8936,-0.89833 0.92251,-0.92192 1.84502,-1.84384 2.76752,-2.76576 -1.55796,0.31564 -5.53053,2.28596 -4.67389,0.94692 1.58563,-2.47854 5.13653,-2.97992 7.27047,-5.00568 0.39453,-0.37453 -1.07912,-0.19012 -1.5841,-0.39242 -2.59907,-1.04122 1.45702,-1.10305 -3.99527,-0.0413 0.23249,-0.50921 2.4381,-3.75255 2.14815,-3.95163 -0.6386,-0.43846 -1.56195,0.16288 -2.3238,0.0227 -0.41951,-0.0772 -0.73377,-0.43517 -1.10066,-0.65276 -1.05703,0.094 -2.11405,0.18798 -3.17108,0.28197 14.56659,-10.91162 6.60855,-1.66215 5.19861,-5.97316 -0.7148,-2.18559 1.24321,-1.65251 -0.51252,-3.60095 -0.48504,-0.53828 -1.8482,-0.40764 -1.85561,-1.13218 -0.0121,-1.18458 1.20852,-2.03788 1.81278,-3.05682 -9.27694,-0.46414 -0.43422,1.04567 -1.03621,-3.77995 -0.14103,-1.13058 -2.45562,0.40168 -3.41099,-0.2191 -0.53557,-0.348 -0.27624,-1.42029 0.13193,-1.91155 1.52211,-1.83192 3.75639,-2.96142 5.37142,-4.71197 0.69547,-0.75384 0.97981,-1.80216 1.46971,-2.70325 -0.96071,-0.0793 -1.91817,-0.23172 -2.88212,-0.23794 -8.55832,-0.0551 2.30363,2.43158 5.84613,-5.75478 1.04199,-2.40794 -6.05494,4.67811 -7.47329,2.47082 -1.97994,-3.08124 13.63059,-6.08404 2.2912,-3.51859 -0.25021,-0.2252 -0.8741,-0.36244 -0.75064,-0.67561 0.33861,-0.85888 1.28474,-1.33325 1.8349,-2.07463 0.3234,-0.4358 1.30072,-1.54508 0.76935,-1.4348 -2.61741,0.54321 -4.9249,2.12483 -7.50279,2.83224 -0.26475,0.0727 -0.6308,-0.3697 -0.53436,-0.62673 0.22699,-0.60501 0.87117,-0.95461 1.30676,-1.43191 8.33195,-4.95149 5.03236,-1.13737 6.11797,-4.3184 0.10381,-0.30416 0.66881,-0.79561 0.36265,-0.89337 -0.70346,-0.22461 -2.72427,0.82235 -2.19373,0.30871 3.86981,-3.74657 7.01351,-2.20799 4.21301,-3.35731 6.47296,-4.28612 -2.20647,1.73687 -2.12215,-0.0258 0.0771,-1.61222 3.0843,-1.12915 4.34522,-2.13676 0.70337,-0.56207 -1.70011,0.66929 -2.59767,0.74027 -0.317,0.0251 0.78281,-0.5597 2.49822,-1.51137 0.46567,-0.53737 0.66407,-0.83263 1.36374,-1.22722 0.98725,-0.55676 2.06782,-0.93963 3.04281,-1.51759 0.0706,-0.0419 -0.0426,-0.23655 -0.12151,-0.21413 -5.29503,1.50384 -4.40257,3.36258 -5.22385,1.37394 3.06387,-1.38383 6.12774,-2.76767 9.1916,-4.1515 -1.02417,0.2612 -2.73589,1.78554 -3.07252,0.78362 -0.34305,-1.02104 2.16911,-0.75459 2.7855,-1.63792 0.3836,-0.54973 -1.31058,0.6231 -1.95917,0.45373 -0.38527,-0.1006 0.60234,-0.53362 0.95654,-0.71554 1.47371,-0.75691 3.00581,-1.3943 4.50871,-2.09145 -0.63184,0.1759 -1.24071,0.5651 -1.89552,0.52772 -0.3639,-0.0208 0.62135,-0.38155 0.92504,-0.58312 3.01431,-2.00081 5.71058,-4.58179 9.02869,-6.02384 1.54675,-0.67223 -4.64784,3.89499 -4.52219,5.19822 0.0355,0.36779 0.73819,0.0341 1.10729,0.0512 4.32563,-0.80488 7.35768,-4.13082 11.1,-6.17039 0.43499,-0.23707 -1.10983,0.83769 -0.82002,1.23946 0.2765,0.38331 0.88036,-0.35243 1.29073,-0.58691 0.67659,-0.38659 1.30782,-0.84766 1.96173,-1.27149 -5.61569,3.81123 5.847,-4.12908 4.57733,-2.85552 -1.45264,1.4571 -6.72903,3.75042 -4.68856,4.01464 2.53042,0.32765 4.77089,-2.05254 6.66849,-3.75827 1.18442,-1.06466 -3.01765,1.13692 -4.60412,1.27648 -0.49565,0.11429 -1.88012,0.66559 -1.48695,0.34287 0.77429,-0.63555 1.7993,-0.88123 2.69333,-1.33308 0.97151,-0.49102 1.95644,-0.95806 2.9031,-1.49543 2.92382,-1.0436 -0.19707,-0.51294 -0.0215,-0.62582 1.25048,-0.80387 2.65543,-1.33729 3.98314,-2.00593 0,0 4.7807,-1.95243 4.7807,-1.95243 l 0,0 c -1.85659,1.05808 -3.72243,2.42084 -5.65484,3.34966 -9.08762,4.36805 -8.0472,3.12416 2.63095,-0.35854 0.20723,-0.0676 -0.32075,0.29522 -0.48112,0.44283 -2.06995,0.87954 -4.1399,1.75908 -6.20986,2.63862 0.9538,-0.27297 3.69622,-1.35491 2.86139,-0.81891 -2.24338,1.44037 -4.80919,2.30726 -7.15434,3.57521 -0.84863,0.45883 -2.71756,2.51318 -2.41323,1.5977 0.55196,-1.66044 2.99692,-2.07528 3.70559,-3.71809 2.47079,-5.12674 -0.15677,0.50283 -12.08956,8.85874 -0.3399,0.23801 0.52938,-0.68968 0.57986,-1.10155 0.0246,-0.20093 -0.29494,-0.28758 -0.38754,-0.4676 -0.11097,-0.21572 -0.0206,-0.54638 -0.21125,-0.69644 -0.23265,-0.18316 -0.58274,-0.10535 -0.8741,-0.15803 -1.08077,0.53197 -2.16154,1.06394 -3.2423,1.59591 0.61123,-0.74052 2.73074,-2.56403 1.8337,-2.22155 -2.15024,0.82093 -3.72623,2.75117 -5.80559,3.73796 -0.98272,0.46636 -3.62463,1.55286 -3.21762,0.54411 0.0771,-0.19114 4.26615,-1.34033 5.19748,-1.60123 -0.002,0.84843 0.0797,0.35024 -1.54628,1.13776 -2.43685,1.18026 -4.9713,2.16361 -7.35391,3.44985 -0.17851,0.0964 0.36821,0.22917 0.57035,0.21223 0.76295,-0.0639 2.88998,-0.87285 2.25259,-0.44871 -1.73923,1.15733 -3.76736,1.80676 -5.65104,2.71013 10.64971,-3.49618 2.1377,-0.93772 0.0559,0.71953 -0.87207,0.69424 4.11786,-1.63073 3.18387,-1.02234 -2.76085,1.79836 -4.83888,1.37533 -6.50296,3.57948 0.91407,-0.27289 1.78835,-0.80636 2.74221,-0.81867 0.91196,-0.0118 -3.46726,1.47612 -1.8579,1.29003 0.88484,-0.10231 1.72074,-1.001 2.56995,-0.7322 1.4859,0.47035 -9.20657,3.22381 1.57572,0.11558 -2.36017,1.26735 -4.72034,2.53469 -7.08052,3.80204 0.11469,0.19623 0.51051,0.43392 0.34406,0.58869 -1.0316,0.95918 -4.91768,2.38029 -3.50929,2.35433 2.37641,-0.0438 4.3475,-2.14947 6.70962,-2.41333 0.99204,-0.11081 -4.76651,2.1144 -1.8757,2.33444 -2.47051,2.27022 -1.40706,0.62544 -0.30171,1.4434 0.23656,0.17505 0.58096,0.61391 0.35865,0.80673 -10.38418,9.00668 -4.16531,0.51016 -6.4293,6.51935 2.63048,-0.9705 5.18095,-2.19421 7.89145,-2.91149 0.52827,-0.1398 2.01774,0.0636 1.58915,0.40263 -3.37773,2.67161 -8.32186,3.49544 -10.88911,6.95316 -1.61096,2.16972 5.0682,-1.89717 7.67205,-2.62025 1.25504,-0.34852 2.5621,-0.62886 3.86383,-0.5832 0.65675,0.023 1.20643,0.52147 1.80965,0.7822 -3.46414,2.44363 -7.191,4.55195 -10.39243,7.33089 -0.58409,0.50701 -1.35877,1.98436 -0.62675,2.2341 1.58563,0.54094 3.29876,-0.62716 4.96942,-0.75257 1.2209,-0.0917 4.12945,-1.03159 3.67154,0.10389 -2.69944,6.69376 -9.76124,4.11086 -2.82461,5.80978 6.90857,0.95619 0.9429,-0.72532 -1.57226,5.00935 -0.34511,0.78688 2.32093,-0.12806 2.47595,0.71707 0.20152,1.09859 -1.35608,1.79559 -1.82949,2.80722 -0.6057,1.2943 -0.13837,2.97783 -1.37315,4.06119 6.75468,-0.97119 2.63252,-1.01551 -0.36648,2.73408 -0.22941,0.28683 0.44063,0.77321 0.80719,0.75004 1.40095,-0.0885 4.53648,-2.38467 4.07603,-1.05858 -1.26042,3.62998 -8.23101,3.63354 -3.0188,3.37711 -1.05416,3.23385 -0.10913,-0.73895 4.56561,-0.24918 0.70549,0.0739 -0.68816,1.25315 -1.15449,1.78768 -0.64077,0.73448 -4.96366,4.6973 -5.48665,5.53109 -0.22878,0.36475 0.0942,0.85596 0.14131,1.28395 6.80006,0.91876 -1.15929,-0.83571 1.30873,1.95101 0.51573,0.58233 2.76862,-0.57122 2.33248,0.0729 -1.14053,1.68436 -4.05337,1.81352 -4.87103,3.67613 -0.54479,1.24101 4.28517,-2.52858 4.06555,0.0598 -0.63833,0.76458 -1.43148,1.42297 -1.915,2.29376 -0.0769,0.1384 -0.3511,2.69941 -0.12976,2.8934 0.56558,0.4957 2.22633,-0.20159 2.18825,0.54951 -0.064,1.2629 -1.57761,1.97665 -2.36641,2.96498 -0.019,0.66037 -0.0381,1.32074 -0.0571,1.98111 0.94651,0.22022 2.00211,0.1676 2.83952,0.66067 1.70887,1.0062 0.93959,2.64925 0.89198,4.10584 -0.0661,2.02294 0.18274,3.87611 1.1481,5.67875 -1.06661,1.09941 -2.13322,2.19882 -3.19983,3.29823 0.2676,0.37359 1.04509,0.73029 0.80279,1.12077 -0.8266,1.33216 -3.21601,1.62884 -3.46899,3.17607 -0.16227,0.99251 2.62242,-1.24441 3.00082,-0.31263 1.09046,2.68514 -8.21468,3.66408 1.80952,1.70153 -1.63218,1.29533 -4.86877,1.80245 -4.89653,3.88598 -0.0224,1.67689 3.19324,-1.46022 4.86198,-1.29358 0.65024,0.0649 -1.66078,1.77119 -1.014,1.67783 7.46951,-1.07821 11.3939,-6.41009 0.77149,1.84447 -0.88572,0.68828 -1.57915,1.5935 -2.36873,2.39026 1.30757,-0.26932 2.64879,-1.20722 3.92271,-0.80795 0.63932,0.20037 -0.58657,1.23688 -1.06824,1.70258 -1.32676,1.28278 -3.70274,1.74138 -4.29988,3.48758 -0.15335,0.44846 6.75296,-0.67501 6.46415,-0.24736 -1.58594,2.34843 -4.48718,3.46216 -6.73077,5.19323 1.3217,-0.0924 2.67555,-0.58142 3.96508,-0.27724 0.51852,0.1223 1.02338,0.92317 0.77805,1.39606 -0.77215,1.48839 -2.31758,2.42555 -3.41729,3.69131 -0.96138,1.10654 -2.78709,1.9559 -2.76247,3.42152 0.0163,0.96872 1.93043,0.30116 2.83102,0.65839 0.65744,0.26079 1.18121,0.77827 1.77181,1.16741 -2.81262,4.75928 -2.80872,3.10652 4.67589,1.64938 -1.26041,3.25333 -6.0635,3.67638 -8.34922,6.31233 -0.54709,0.63092 1.63108,0.59247 2.45866,0.48082 6.96578,-0.93979 6.8916,-4.14914 6.40783,-0.21327 -1.18995,1.02522 -2.55904,1.87345 -3.56986,3.07565 -0.54677,0.6503 0.29383,1.66499 0.74286,1.93962 0.0538,0.0329 2.28883,0.36373 1.51653,1.38907 -0.74758,0.99254 -1.85029,1.65906 -2.77544,2.48858 -2.01492,4.0117 0.0735,-1.05844 4.36134,-0.0885 1.08359,0.24512 -1.77515,1.36522 -2.48925,2.21628 -0.52276,0.62303 0.058,4.29809 2.41131,0.37226 -1.92105,1.23721 -3.8421,2.47441 -5.76316,3.71162 0.3956,0.10122 0.79231,0.40919 1.18678,0.30368 2.2344,-0.59765 5.44044,-4.40981 6.52306,-2.36587 3.53427,6.67249 -6.90959,1.38524 -6.55868,5.44393 0.0324,0.37432 0.7442,0.19661 1.04558,0.42095 0.25204,0.18763 0.3661,0.51079 0.54915,0.76618 0.0712,0.37017 -0.10001,0.90141 0.21364,1.11051 0.53553,0.35702 2.28266,-0.21938 1.90691,0.30318 -1.19701,1.66473 -3.90255,1.96694 -4.84762,3.78655 -0.45816,0.88212 2.94486,-1.17713 2.97633,-0.18363 0.0919,2.90267 -10.32021,4.68553 2.55412,1.32332 -13.88816,10.05064 -4.21703,1.92319 -0.25957,2.91804 1.17513,0.29542 -1.99914,1.5097 -2.55359,2.58711 -0.16659,0.32374 0.84505,0.2375 0.91628,0.59456 0.15946,0.79941 -1.27266,1.48463 -0.45859,2.40209 -0.70281,0.75107 -2.11627,1.22464 -2.10843,2.25323 0.027,3.53852 5.53042,-3.86509 0.87871,2.07078 -0.73188,0.93392 -3.50631,2.521 -2.33181,2.68947 4.62982,0.66407 18.02038,-9.23088 -2.55995,4.0518 0.41314,0.23165 0.79809,0.52297 1.23941,0.69496 0.55373,0.2158 1.74031,-0.13462 1.72268,0.45941 -0.03,1.01163 -1.4099,1.50852 -1.80872,2.4387 -0.19008,0.44335 0.29109,0.9798 0.14581,1.43979 -0.89241,2.82552 -2.35877,1.39391 0.18581,2.80361 1.15576,-0.0399 2.31084,-0.1194 3.4673,-0.11973 0.91829,-2.6e-4 2.02747,-0.44581 2.75234,0.11795 1.24736,0.97013 -3.54168,3.86915 -2.35717,3.83563 5.02162,-0.14213 14.14556,-7.29822 -0.0472,2.40961 2.98489,1.23449 0.18921,-0.41624 -0.68824,2.82616 -0.60033,2.21837 4.83753,-1.87475 0.42281,2.20368 -5.8186,5.37536 -11.65517,6.41542 5.10315,0.15479 -0.74735,0.80324 -1.36046,1.75663 -2.24204,2.40972 -2.59356,1.92134 -5.97818,2.8581 -8.12378,5.26942 -0.94007,1.05648 3.87672,-2.20293 4.1629,-0.81801 0.32872,1.59077 -5.29356,3.22403 -3.66927,3.20683 9.34954,-0.099 9.14109,-6.9726 8.95016,-1.77383 -0.66494,0.80063 -1.18496,1.74821 -1.99481,2.40188 -2.30911,1.8638 -6.64809,2.20309 -7.2977,5.09856 -0.49714,2.2159 4.34211,-1.35479 6.56359,-1.82642 1.09779,-0.23306 4.03951,-1.16883 3.35516,-0.27937 -5.32352,6.9192 -9.26326,2.75287 -6.07651,5.70641 1.67414,2.04701 0.30461,0.84469 5.41887,-0.72561 0.11184,0.1144 -6.91012,5.41422 -6.9318,5.49711 -0.24616,0.94113 1.90254,-0.44718 2.87321,-0.5114 0.52816,-0.0349 1.04869,0.14483 1.57303,0.21724 -1.52161,1.1575 -3.3167,2.0243 -4.56482,3.47251 -0.44671,0.51832 2.2492,0.46712 1.74568,1.2988 -0.6216,1.02671 -3.07583,1.37328 -2.61071,2.47971 1.65123,3.92793 4.90473,-3.87333 2.6877,0.77006 -6.66072,5.56962 0.36798,-0.83336 4.28539,-0.27792 1.1079,0.15709 -5.53866,3.34557 -5.46553,4.78461 0.037,0.72743 2.02338,-0.83333 2.15168,0.38075 4.12173,0.99404 -0.0563,-0.29498 -6.22292,4.83789 -0.56224,0.46799 1.47621,-0.0627 2.178,-0.26914 1.64502,-0.48384 3.21416,-1.19582 4.82264,-1.78991 1.49947,-0.55383 4.24314,-3.23134 4.50121,-1.65384 0.27342,1.67132 -2.893,1.76151 -4.3395,2.64227 -1.95306,2.20485 -4.62765,2.88503 -7.18354,4.55102 -0.27259,0.17768 0.66562,-0.2445 0.96818,-0.12476 0.19028,0.0753 0.12726,0.38899 0.19089,0.58349 1.80537,-0.61886 3.61073,-1.23772 5.4161,-1.85658 -0.84041,0.72567 -1.82938,1.30856 -2.52124,2.17702 -0.1752,0.21991 0.033,0.56791 0.12198,0.83464 0.96367,2.88967 4.76481,-1.02093 4.14926,2.23243 -2.60527,1.74858 -5.40667,3.23551 -7.81581,5.24574 -0.25305,0.21115 0.40301,0.70659 0.73015,0.66667 1.61028,-0.1965 3.11405,-0.91185 4.68222,-1.32713 5.53619,-1.46608 4.75726,-1.80858 1.75589,1.30793 -0.67715,0.70314 -1.3174,1.4409 -1.97611,2.16135 0.34892,0.13924 1.05014,0.0421 1.04674,0.41771 -0.003,0.31093 -2.48306,3.33637 -2.38036,3.44466 1.97496,2.08253 2.7307,-1.87751 3.63602,0.61954 0.13879,0.38282 -0.0124,0.81431 -0.0186,1.22147 -0.72121,0.73268 -1.83167,1.22502 -2.16363,2.19804 -0.14402,0.42214 0.92361,0.15463 1.26175,0.44549 0.23821,0.2049 0.0682,0.67886 0.29638,0.89481 1.89225,1.79045 3.97497,-3.22614 -2.61618,3.25198 -0.37523,0.3688 -0.44084,0.95545 -0.66126,1.43318 -0.74546,2.83605 -0.90252,1.57357 3.71736,0.86489 0.008,0.42841 -6.88909,5.34977 -7.0881,6.42457 -0.14836,0.80124 1.73679,-0.14013 2.42695,0.2931 0.35611,0.22354 0.032,0.84032 0.048,1.26048 0,0 0.60987,-0.29215 0.60987,-0.29215 z"
598+ inkscape:connector-curvature="0" />
599+ <path
600+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
601+ id="path5274"
602+ d="m 235.10087,494.853 c -1.72477,0.26384 -3.45101,1.06486 -5.1743,0.79153 -0.6595,-0.1046 -1.35563,-1.23186 -0.95104,-1.76306 1.85598,-2.43682 6.54502,-3.01774 6.90875,-6.05919 0.24847,-2.0776 -4.22104,1.06972 -6.25171,0.56521 -0.73743,-0.18322 -0.89283,-1.60823 -0.45989,-2.23268 1.45131,-2.09329 3.73816,-3.46105 5.60724,-5.19158 -1.30165,-0.0397 -3.61704,1.15104 -3.90497,-0.11899 -0.346,-1.52615 2.44277,-2.11658 3.07345,-3.54874 0.21772,-0.49443 -0.40056,-1.19952 -0.92452,-1.33116 -2.9824,-0.74933 -3.35447,1.04728 -6.00663,-0.1243 -0.44177,-0.19515 -0.59317,-0.76231 -0.88975,-1.14347 -1.62467,-2.19337 7.01252,-3.6846 6.03097,-6.4629 -0.35181,-0.99579 -2.82628,0.69214 -3.15292,-0.31219 -0.38064,-1.1704 1.77768,-1.8691 2.05342,-3.06855 0.13841,-0.60205 -0.6583,-1.04553 -0.98745,-1.56829 0.30475,-0.89097 0.60949,-1.78193 0.91424,-2.67289 -7.53264,-2.23618 2.38396,1.59728 1.54227,-5.15805 -0.19963,-1.60228 -4.7333,1.91176 -4.83467,0.30028 -0.13257,-2.10718 3.96145,-2.35795 4.5782,-4.3772 0.30919,-1.0123 -2.1105,-0.1648 -3.16575,-0.24721 1.05904,-1.13455 2.11809,-2.26911 3.17714,-3.40366 -0.0107,-0.005 -2.87769,-1.00308 -2.64038,-1.81722 0.28175,-0.96659 2.02632,-1.34668 1.90262,-2.34586 -0.0907,-0.7326 -2.66456,0.44301 -2.21022,-0.13879 4.30542,-5.51324 7.1961,-2.12072 4.55559,-4.73091 -10.33839,2.77071 -4.13255,1.83896 0.36955,-2.9086 0.29783,-0.31407 -0.57517,-0.86256 -1.00599,-0.821 -1.92044,0.18526 -4.33153,2.91099 -5.60131,1.45839 4.33291,-3.89435 5.22082,-2.41149 2.30678,-4.64367 -0.95622,-0.209 -2.72732,0.34155 -2.86867,-0.62699 -0.18982,-1.30072 1.45602,-2.19689 2.31084,-3.19549 1.82796,-2.13542 4.60067,-3.91377 5.39003,-6.85628 0.1612,-0.60094 0.29581,-1.49754 -0.21396,-1.85426 -0.8024,-0.56149 -1.9457,-0.22517 -2.91855,-0.33776 13.2084,-10.64887 -4.15898,2.78139 1.32237,-6.03641 0.64361,-1.03536 2.37686,-1.74659 2.16556,-2.94724 -3.43454,-0.58468 -2.63967,0.45586 -3.04384,-2.48312 -1.56436,2.8e-4 -3.65465,1.17085 -4.69308,8.6e-4 -0.85123,-0.95908 0.86545,-2.44305 1.58105,-3.50717 1.18764,-1.76606 2.96115,-3.10066 4.08003,-4.91106 5.48924,-8.88184 -2.19873,1.44113 -2.88812,-4.43772 -0.21626,-1.84413 2.23606,-2.96484 3.35409,-4.44726 -0.43526,2.04932 -5.52153,-1.4114 -4.49527,-2.86108 1.54224,-2.17853 4.97434,-2.83829 6.00046,-5.30235 0.48638,-1.16795 -3.85006,1.27155 -3.79552,0.008 0.29225,-6.77243 6.68102,-1.96905 2.60362,-4.63478 -1.03744,0.0157 -3.37206,1.05159 -3.11233,0.0471 0.4629,-1.79031 2.90142,-2.33554 4.07379,-3.76559 0.6145,-0.74957 0.86383,-1.74051 1.18878,-2.65368 0.33006,-0.92755 1.7161,-2.57839 0.77018,-2.8514 -7.79155,-2.2488 -8.87812,5.07596 -6.27386,-2.9532 -0.19249,-5.38304 7.51347,-6.23842 8.35735,-10.67915 0.32218,-1.6954 -4.83804,1.06359 -5.13804,-0.63588 -0.37881,-2.14591 3.18898,-3.10151 4.13147,-5.06624 0.37314,-0.77786 -0.50218,-1.68058 -0.48124,-2.54306 0.0239,-0.98457 0.40879,-1.92683 0.61318,-2.89025 -13.08296,-3e-5 0.34211,1.32306 -2.48426,-3.42912 -0.72627,-1.22112 -2.99658,0.75682 -4.26095,0.10876 -0.63537,-0.32567 0.43448,-1.404 0.35062,-2.11303 -0.59735,-5.05055 -8.30722,4.38127 5.7127,-6.54936 -0.0182,-1.2e-4 -4.80445,0.71053 -5.00217,-1.19016 -0.0931,-0.89458 1.35621,-1.63297 1.05882,-2.48178 -0.26951,-0.7692 -2.36655,-0.1317 -2.25749,-0.93942 0.21104,-1.56284 1.93828,-2.48832 2.89013,-3.74569 0.93981,-1.24147 1.8564,-2.50034 2.7846,-3.75051 -2.76858,-2.34245 -1.68916,-0.49431 -0.42062,-4.50395 0.27132,-0.8576 0.13894,-1.83132 0.51325,-2.64924 0.0839,-0.18345 4.09283,-3.81873 1.03007,-4.56276 -1.17187,-0.28469 -2.40782,0.1402 -3.61173,0.2103 0.44344,-0.69241 1.62548,-1.3098 1.33032,-2.07723 -0.27912,-0.72573 -1.74502,0.12468 -2.29333,-0.42664 -2.14536,-2.1571 2.94322,-3.721 4.63358,-7.16098 0.43562,-0.88652 -0.5755,-1.88984 -0.86326,-2.83476 1.38204,-1.92046 2.76407,-3.84091 4.1461,-5.76136 -1.12321,-2.72543 -5.51508,-1.70553 -6.87835,-3.97595 -0.64832,-1.07972 0.6824,-2.56943 0.29228,-3.76689 -0.32662,-1.00257 -2.37342,-1.18153 -2.24537,-2.22816 0.2216,-1.8113 4.5249,-3.42652 3.07232,-4.53103 -2.03388,-1.54653 -5.05737,0.73258 -7.58605,1.09887 3.45501,-4.83392 2.38586,-3.59475 6.51263,-8.25392 1.30105,-1.46891 3.68816,-2.41085 3.96198,-4.3539 0.1544,-1.09559 -3.26799,0.49128 -3.26173,-0.61512 0.0295,-5.20775 9.08516,-4.03102 -1.61053,-3.94352 1.95939,-1.79801 4.27984,-3.26861 5.87816,-5.39403 0.5383,-0.71582 1.049,-2.4148 0.1935,-2.67992 -2.17746,-0.6748 -4.83656,1.77094 -6.80983,0.62951 -1.14404,-0.66177 0.90074,-2.53951 1.7331,-3.56613 5.14504,-6.34577 8.38621,-4.56052 2.51601,-6.13981 -0.85199,-0.32077 -2.4474,-0.0584 -2.55599,-0.96231 -0.15992,-1.33111 1.81714,-2.15158 2.02274,-3.47641 0.10406,-0.6705 -0.95976,-0.99901 -1.23172,-1.62066 -0.25041,-0.57238 0.0184,-1.30737 -0.28754,-1.8521 -0.28092,-0.5002 -1.61971,-0.55889 -1.35127,-1.06589 0.82116,-1.55092 2.55255,-2.40897 3.82883,-3.61345 0.68857,-0.86315 3.1386,-2.32855 2.06571,-2.58945 -10.65886,-2.59195 -5.5639,9.83091 1.19302,-3.59935 0.81945,-1.62876 -6.02054,2.91187 -5.33113,1.22396 2.10963,-5.16508 13.61278,-6.44046 1.79364,-4.30704 0.21403,-0.73136 0.91552,-1.4828 0.64208,-2.1941 -0.26442,-0.68781 -1.27472,-0.73968 -1.91207,-1.10953 1.76068,-1.5448 5.50805,-2.30302 5.28205,-4.63441 -0.18401,-1.89836 -4.58115,2.58145 -5.63515,0.99188 -2.44934,-3.69394 14.48858,-5.96488 -2.32442,-2.54757 -1.7179,-1.85348 6.47741,-4.03448 5.12419,-6.41256 -0.5953,-1.04614 -2.55849,0.49122 -3.60971,-0.095 -0.53027,-0.29573 -0.24018,-1.38425 0.19132,-1.81139 2.01047,-1.99013 4.52431,-3.3972 6.78646,-5.0958 0,0 0.68933,-0.35123 0.68933,-0.35123 l 0,0 c -1.6505,1.38695 -3.301,2.7739 -4.9515,4.16084 1.18084,-0.0304 3.93897,-1.20381 3.54252,-0.0911 -0.76705,2.15293 -7.26975,3.74376 -5.1306,4.54845 4.99319,1.8783 18.98607,-10.22151 2.1677,2.69716 4.46028,0.74689 2.96356,-0.31341 -0.0889,3.77723 -0.63494,0.85088 -2.69281,2.50424 -1.65372,2.72204 2.33328,0.48909 4.58505,-1.63653 6.96887,-1.60791 0.61976,0.007 1.18756,1.25976 0.75189,1.70062 -2.49496,2.5247 -5.74404,4.17153 -8.61606,6.2573 12.12981,-2.41278 3.30013,-1.95214 3.56234,1.57757 0.054,0.72705 2.55848,-0.20768 2.15087,0.39678 -1.23294,1.82837 -6.14542,2.11983 -5.18729,4.10604 2.15892,4.47548 10.45489,-6.74524 4.2017,0.92413 2.15257,3.5125 1.16422,0.95894 -5.41535,6.17669 1.26621,2.35461 6.76352,-4.43669 7.77661,-1.96259 8.28333,20.22899 -28.85471,-8.50838 3.09217,3.12802 1.84928,0.67359 -2.68677,2.87671 -4.03016,4.31506 -0.92921,1.24117 -1.85842,2.48233 -2.78763,3.7235 0.58132,0.56011 1.79929,0.87498 1.74397,1.68034 -0.0987,1.43783 -1.97261,2.33537 -2.11827,3.76921 -0.0857,0.8441 1.28221,1.22332 1.52863,2.03519 1.49261,4.91758 -5.97031,3.63582 7.4952,1.34569 -0.55001,0.45931 -10.77994,8.64592 -11.73418,10.56561 -0.32217,0.64811 2.10161,0.84706 1.64937,1.41214 -2.09388,2.61633 -7.66175,2.96102 -7.82786,6.30795 -0.16991,3.4234 8.56273,-4.46712 10.27927,-0.27127 -1.76159,1.81971 -3.52318,3.63942 -5.28477,5.45913 0.76622,0.59813 2.4346,0.8319 2.29867,1.79438 -0.27968,1.9803 -3.80714,3.11034 -3.26317,5.0349 0.46282,1.63743 4.21131,-0.43752 4.99021,1.07532 3.93398,7.64091 -10.83273,3.14159 3.44758,5.72402 -0.9151,1.68254 -1.83021,3.36508 -2.74532,5.04762 -0.11662,1.15096 0.18214,2.42561 -0.34986,3.45288 -0.92725,1.79049 -2.95622,2.85717 -3.85317,4.66303 -1.3412,2.70028 4.81416,2.32838 5.47911,2.30305 -0.3941,0.74413 -1.64975,1.53203 -1.18229,2.23241 0.55364,0.82952 3.61797,-0.31799 2.96056,0.43196 -2.55013,2.90915 -6.77897,3.98142 -9.35743,6.86548 -0.53751,0.60121 1.34054,0.89766 1.99237,1.3725 3.00597,2.18979 0.67181,0.85532 4.1958,2.58013 0.97743,0.27897 3.12712,-0.1607 2.93229,0.83692 -0.37108,1.90014 -2.58726,2.88188 -3.93077,4.27586 -1.41178,1.46482 -5.0521,2.39525 -4.3329,4.29829 0.66993,1.77268 4.05322,-1.99686 5.61067,-0.91724 2.00902,1.39265 -6.05121,4.28837 -4.30844,5.93449 8.79644,-0.97427 2.46458,-1.29009 1.54772,2.85609 -0.55951,2.53017 5.57675,-0.6921 4.65189,1.63694 -4.43479,11.16791 -5.60958,0.57178 -4.52068,6.97527 -1.01107,1.36804 -2.96739,2.40428 -3.03319,4.10412 -0.0404,1.04402 1.88097,0.91014 2.82145,1.36521 0.80303,0.59941 2.46039,0.79749 2.40909,1.79825 -0.0133,0.25895 -5.43921,8.7383 -5.29443,9.14273 0.52067,1.4545 3.02467,0.63085 4.53701,0.94627 -0.64141,1.38413 -0.99081,2.94575 -1.92422,4.15238 -1.68564,2.17903 -8.12235,4.34484 -5.82411,5.86392 2.99789,1.98153 6.81296,-3.05371 10.40013,-2.83928 1.37703,0.0823 -2.60327,1.93867 -2.48051,3.31268 0.0835,0.9342 1.86713,0.1807 2.80069,0.27105 -2.14561,1.60336 -4.29121,3.20672 -6.43682,4.81008 3.30783,4.57067 -4.3191,-6.77248 -4.22041,5.45487 0.0138,1.70811 3.38667,-0.86784 5.08198,-0.6587 2.45197,0.30248 2.15812,5.02735 1.95842,6.42304 -3.19404,2.52625 -8.52248,3.64671 -9.58211,7.57875 -0.68106,2.52726 6.18106,-3.00764 7.79494,-0.94699 1.4073,1.79689 -3.96866,2.95153 -4.48356,5.17508 -0.24512,1.05851 2.84501,0.24565 2.9786,1.32394 0.65218,5.26442 -11.20032,5.62551 5.28419,2.39953 -0.67702,1.06264 -1.40702,2.09332 -2.03106,3.18792 -0.45821,0.80372 -1.7507,1.74672 -1.21035,2.49769 0.61904,0.86033 2.63525,-0.68635 3.17151,0.22788 0.50566,0.86208 -1.0545,1.6999 -1.52286,2.58281 -2.38314,4.49245 0.66315,0.65249 -5.01938,6.11325 2.51835,3.02589 0.23004,-0.58326 -2.18819,4.90305 -0.24233,0.54978 0.86402,0.916 0.99629,1.50207 0.16072,0.71214 -0.80005,1.82496 -0.16437,2.18397 1.16036,0.65534 2.71959,-0.39573 3.99784,-0.0189 0.60248,0.17759 0.73877,1.01601 1.10815,1.52402 -1.36074,1.34979 -3.20063,2.34749 -4.08221,4.04936 -0.27139,0.52391 1.05543,0.7318 1.64139,0.66261 1.97114,-0.23275 3.95028,-2.36609 5.75307,-1.53572 1.23577,0.5692 -2.05672,1.79651 -2.93984,2.8315 -0.48863,0.57266 -0.71854,1.32576 -1.13976,1.94967 -0.51361,0.76074 -1.1066,1.46475 -1.6599,2.19713 0.33873,0.23814 1.19514,0.34101 1.01619,0.71442 -0.51118,1.06668 -1.77446,1.57558 -2.54408,2.4738 -3.23585,3.77652 -0.50318,0.34945 -0.55933,2.92637 -0.0502,2.30217 -3.339,4.40022 -4.37743,5.39298 18.27135,-5.79195 7.34887,-3.82125 5.07084,1.06134 -0.30011,0.64325 1.3829,0.55521 1.80963,1.12243 0.39639,0.52689 0.0574,1.41202 0.47866,1.91923 2.55384,3.07493 4.72612,-2.11248 -1.30905,5.03921 0.59055,0.43479 1.11486,0.97814 1.77163,1.30437 0.77872,0.38681 2.79133,-0.004 2.4803,0.80765 -0.73427,1.91687 -3.09181,2.72119 -4.42871,4.27883 -3.95484,4.60782 -1.14208,11.46892 8.83243,0.8083 -2.78274,1.95014 -5.79944,3.60312 -8.34822,5.85044 -0.32391,0.28561 -0.30561,2.75922 0.50582,2.9271 1.34444,0.27816 4.07556,-1.66363 4.10843,-0.29112 0.0607,2.53601 -5.62402,2.95619 -4.29713,6.28092 2.63484,-0.56434 7.72239,-4.38145 7.90451,-1.69301 0.22273,3.28781 -5.39696,3.87479 -7.59009,6.33435 -0.4392,0.49256 -1.07168,4.84516 -0.91018,5.62296 0.13638,0.65682 1.15889,1.0274 1.08607,1.69426 -0.11092,1.01582 -1.03951,1.7596 -1.55927,2.6394 0,0 1.72998,-0.88147 1.72998,-0.88147 z"
603+ inkscape:connector-curvature="0" />
604+ <path
605+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
606+ id="path5276"
607+ d="m 271.40967,500.0231 c 0.84361,-1.11502 2.99222,-2.02518 2.53083,-3.34505 -0.4382,-1.25354 -3.99371,0.67052 -3.92942,-0.65585 0.10731,-2.21366 3.58902,-3.01826 4.21063,-5.14555 0.29949,-1.02491 -2.43266,-1.56527 -1.96867,-2.52695 1.35708,-2.81273 4.53987,-4.32256 6.46127,-6.78454 1.08733,-1.39324 1.65843,-3.12142 2.48765,-4.68213 -7.46636,-0.79001 -5.08221,1.28307 -4.90812,-4.06826 0.0316,-0.97271 -0.27942,-1.93215 -0.28908,-2.90532 -0.01,-0.98605 1.13592,-2.55748 0.23099,-2.94925 -1.80824,-0.78284 -6.00039,2.46658 -5.89015,0.49924 0.15148,-2.70327 4.10594,-3.5304 6.15891,-5.2956 0.0863,-0.32458 1.27486,-3.51563 0.28596,-4.10661 -1.01075,-0.60403 -5.10035,0.971 -2.93296,-2.24553 0.98758,-1.46562 4.18347,-2.1455 3.66196,-3.8341 -0.47465,-1.53684 -3.21662,0.0457 -4.82493,0.0686 2.53225,-3.24957 8.12982,-9.92119 3.34362,-13.96697 -0.84971,-0.71826 -2.89316,-0.3958 -2.97925,-1.50507 -0.13245,-1.70646 1.67665,-2.98445 2.51498,-4.47667 -0.58297,-0.66933 -1.16594,-1.33865 -1.74891,-2.00798 0.6124,-1.11344 2.66426,-2.37557 1.8372,-3.34034 -0.96917,-1.13053 -3.04522,0.75237 -4.45833,0.28279 -0.57763,-0.19194 -0.54641,-1.34538 -0.16369,-1.81869 1.64069,-2.02908 4.24365,-3.14716 5.84497,-5.20745 0.62197,-0.80025 0.35302,-1.99609 0.52954,-2.99413 1.18656,-1.71414 5.51829,-4.42825 3.55968,-5.14242 -3.68312,-1.34296 -7.74476,3.18213 -11.54765,2.2298 -1.60687,-0.4024 0.40917,-3.40618 1.31691,-4.79181 2.25208,-3.43772 11.80529,-7.67655 4.00813,-10.58092 -2.01538,-0.75071 -4.26368,-0.56779 -6.39552,-0.85169 18.31556,-19.35763 6.94798,-2.12539 4.25278,-10.10937 -0.45617,-1.35131 1.87569,-2.93051 1.10826,-4.13267 -0.81412,-1.27531 -3.9706,0.39684 -4.41614,-1.04908 3.1689,-5.21567 3.70236,-3.03245 1.23334,-6.62861 -8.18188,-0.007 -4.8163,1.36305 -2.0755,-4.06271 0.36854,-0.72956 0.7691,-1.82926 0.22758,-2.4415 -0.65309,-0.73837 -3.47767,0.21889 -2.89987,-0.57977 6.09343,-8.42267 10.79235,-3.56777 5.91985,-7.57855 -12.25386,-1.1019 4.27779,1.54129 1.65438,-6.69263 -0.80029,-2.51183 -5.25694,0.40437 -7.88541,0.60655 4.24469,-3.40941 9.75453,-5.67149 12.73406,-10.22823 0.98096,-1.50023 -4.44943,0.36646 -5.23091,-1.24669 -0.79604,-1.6432 1.46396,-3.34544 2.19595,-5.01817 -0.44562,-1.0569 -0.89124,-2.11379 -1.33686,-3.17069 1.21842,-1.89661 4.4227,-3.57023 3.65526,-5.68983 -0.096,-0.26526 -11.48,-0.72332 -11.66559,-0.80844 -0.84802,-0.38896 -1.35245,-1.93441 -0.79604,-2.68331 2.10967,-2.83952 5.32265,-4.66087 7.98397,-6.99131 2.34226,-3.02177 -2.3457,-2.92502 -2.13068,-5.33277 0.0676,-0.75729 1.50987,-1.53029 0.96915,-2.06479 -2.53936,-2.51012 -10.63271,6.31581 2.37228,-4.61883 -6.19474,1.66146 -9.1703,5.00092 -7.46109,-0.21769 0.33443,-1.02109 0.72495,-2.03797 1.27773,-2.95934 0.83764,-1.39618 2.56915,-2.35267 2.86929,-3.95293 0.18473,-0.98495 -4.34465,-3.06502 -4.46788,-3.13006 -0.99349,-2.65488 2.28337,-4.28846 2.23274,-6.61519 -0.008,-0.38838 -3.79592,-3.07607 -3.34144,-3.91339 1.29663,-2.38888 5.23411,-3.12425 5.73612,-5.79557 0.28158,-1.49837 -3.02289,-0.39958 -4.53434,-0.59936 -0.73879,-0.56327 -2.69562,-0.89392 -2.21638,-1.6898 1.57771,-2.62017 4.86309,-3.77022 6.8856,-6.06454 0.60727,-0.68889 1.19228,-1.81559 0.7877,-2.64001 -0.39219,-0.79916 -1.88839,-0.25903 -2.51884,-0.88752 -3.52309,-3.51214 5.42905,-1.06978 -3.64123,-2.45646 -1.28883,-1.47023 4.42724,-4.22495 3.00729,-5.92455 -0.87349,-1.04551 -4.62824,0.79539 -4.06292,-0.44416 1.2864,-2.82067 5.3809,-3.45971 7.0382,-6.07971 0.48077,-0.76003 -2.25924,-0.53635 -2.2845,-1.43532 -0.0391,-1.39345 1.42887,-2.394 2.14331,-3.591 0.57897,-1.13977 2.39829,-2.3253 1.7369,-3.4193 -0.70437,-1.16508 -2.77891,0.0285 -4.06202,-0.42667 -4.36529,-1.54853 1.70005,-4.13301 2.00734,-5.56729 0.1857,-0.86677 -1.69451,-0.52131 -2.54176,-0.78196 1.09797,-1.11213 2.19594,-2.22425 3.29391,-3.33638 -7.62803,0.34657 -0.62323,0.76416 0.31659,-3.27246 0.22707,-0.97527 -1.99998,0.10431 -2.99997,0.15647 1.88627,-1.35807 4.42344,-2.10539 5.65881,-4.0742 0.6094,-0.9712 -2.25983,0.52665 -3.40556,0.48318 -0.49695,-0.0188 -0.89097,-0.44207 -1.33646,-0.6631 -5.22674,-0.89819 -1.26314,0.31771 4.36293,-5.17642 0.40557,-0.39606 0.69638,-1.64645 0.13163,-1.69553 -1.86658,-0.16222 -5.82482,3.07279 -5.48453,1.23034 0.86459,-4.68123 15.40434,-8.00968 -0.85374,-3.14014 -0.53032,-0.34481 -1.68223,-0.40848 -1.59097,-1.03442 0.19075,-1.30836 3.0586,-2.26352 2.22094,-3.2865 -0.93884,-1.14654 -2.98163,1.04666 -4.40173,0.62324 -0.64237,-0.19154 0.3747,-1.67926 -0.21416,-1.99954 -5.42716,-2.95183 -2.51001,2.85865 -4.39836,-2.21361 -1.0113,-2.24228 -4.57355,0.1204 -5.66196,-1.50056 -0.59485,-0.88591 1.78009,-2.58036 0.84181,-3.08859 -1.49807,-0.81144 -3.4198,1.31804 -5.04636,0.81115 -0.75563,-0.23548 0.0205,-1.5828 0.0307,-2.37421 -0.78514,-0.23306 -1.57029,-0.46613 -2.35544,-0.6992 -18.82244,6.26303 -1.07068,2.06578 -7.70098,1.1906 -1.1255,-0.14856 -3.19802,1.33749 -3.39866,0.22011 -0.0112,-0.0625 5.46172,-7.20216 5.52409,-7.28374 0,0 -1.31152,0.82398 -1.31152,0.82398 l 0,0 c 0.10548,0.55469 -0.0164,1.20797 0.31643,1.66406 1.996,2.73517 7.61323,-1.59563 8.31169,-1.60148 0.86632,-0.007 -0.60768,1.62267 -0.91151,2.43401 1.32261,-0.19648 2.64522,-0.39296 3.96783,-0.58944 0.98298,4.11711 -0.6215,0.21591 4.5331,1.56511 3.1779,0.83181 -0.81124,5.16423 -0.63379,5.49385 1.18549,2.20203 6.22576,-1.97788 7.49509,0.33556 0.0419,3.06555 -0.51194,2.13147 1.3249,4.21502 0.41138,0.46665 0.67506,1.34969 1.2971,1.34182 1.97297,-0.025 4.46542,-2.93396 5.74383,-1.43099 1.16055,1.36441 -4.40317,2.5692 -3.47341,4.10022 0.93565,1.54072 3.52951,-0.73456 5.29427,-1.10184 0.24843,0.52021 0.45786,1.06092 0.74531,1.56063 0.28443,0.49446 1.19772,0.89213 0.96528,1.41305 -0.6129,1.37359 -2.07256,2.18119 -3.071,3.30614 -0.81192,0.9148 -3.20997,1.93322 -2.35835,2.81118 1.02778,1.05958 2.91649,-1.02103 4.36594,-0.74149 0.51104,0.0986 -0.10293,1.03582 -0.15439,1.55373 -0.90402,0.90742 -2.11634,1.58835 -2.71205,2.72228 -0.18254,0.34745 0.46747,0.83858 0.85858,0.80575 1.71116,-0.14364 3.53033,-2.2076 4.98576,-1.29633 1.08463,0.6791 -1.95527,1.68725 -2.70466,2.72456 -0.3822,0.52905 -0.40546,1.24075 -0.6082,1.86113 -0.73879,0.89107 -1.47759,1.78213 -2.21639,2.6732 -2.6156,4.34603 -1.72804,1.25734 2.28963,2.6141 0.6603,0.22298 1.61939,0.89052 1.4007,1.55225 -0.52966,1.60271 -3.05305,2.23698 -3.20843,3.91777 -0.0904,0.97838 1.83173,0.71158 2.7476,1.06737 -0.14246,0.9235 -0.28492,1.84701 -0.42738,2.77052 -17.69737,16.4527 -0.29839,-1.93789 0.46659,4.845 0.29603,2.62482 -4.02236,3.45288 -5.75948,5.44278 -2.96193,3.39292 -2.80901,4.63463 0.58667,6.56553 -0.71195,3.37109 -1.32723,2.23656 2.17358,3.20427 -0.25398,1.70167 -3.37311,2.17554 -3.38566,3.89601 -0.009,1.22027 7.05377,-0.32166 6.38009,1.54413 -0.87889,2.4341 -3.60347,3.71541 -5.4052,5.57312 1.47272,0.21953 3.73062,-0.66216 4.41814,0.6586 1.2021,2.30926 -4.75905,5.20232 -5.26915,8.38805 -0.29809,1.8617 8.33922,2.21527 5.25308,5.58725 -2.34657,2.11623 -4.82208,4.0977 -7.03972,6.34868 -1.35667,1.37707 -4.99171,3.11027 -3.65263,4.50445 1.62643,1.69336 4.64369,-1.4155 6.96405,-1.05677 0.72132,0.11151 -0.0472,1.51283 0.26216,2.17392 1.59106,3.40017 3.61933,-1.30155 -1.31458,4.69517 1.74643,5.18425 -1.91013,-4.03341 4.14083,1.28591 0.65697,0.57753 -0.7704,1.59325 -1.34315,2.25439 -1.20653,1.39272 -3.31939,2.13238 -3.95537,3.86181 -0.27479,0.74726 1.97176,0.24327 2.16143,1.01653 0.26163,1.06662 -0.77015,2.05703 -1.15523,3.08554 0.46488,0.70316 1.66986,1.31273 1.39465,2.10948 -0.70049,2.02806 -5.77724,4.09808 -3.89369,5.12569 2.954,1.6116 6.67212,-2.6877 9.92708,-1.83407 1.38407,0.36298 -0.26721,3.00285 -1.1364,4.13947 -7.69167,10.05825 -11.30113,4.9757 -5.50453,10.47003 12.1809,2.58454 0.68305,-1.60595 1.50332,7.04834 0.15075,1.59053 3.7325,0.0369 4.58818,1.38612 0.74593,1.17615 -1.03929,2.62565 -1.16411,4.01279 -0.0314,0.34944 0.93404,4.71611 1.05781,5.28963 -1.3802,1.51721 -4.84437,2.62508 -4.14062,4.55164 0.63712,1.74412 3.69816,-1.18051 5.51394,-0.79214 0.65481,0.14005 0.6238,1.53115 0.149,2.00335 -2.81355,2.79816 -8.04318,3.53205 -9.44682,7.2436 -0.82141,2.17201 11.13635,-5.11164 6.76838,1.64927 0.091,0.92514 -0.0854,1.91766 0.27296,2.77541 0.35755,0.85586 1.9948,1.23647 1.78003,2.13881 -0.48142,2.02267 -3.23036,3.09296 -3.51545,5.15249 -0.15382,1.11121 1.86813,1.33099 2.48861,2.26557 2.10332,3.16805 0.92404,4.31695 0.06,7.89324 -10.57418,17.09201 -0.63343,-3.00266 3.38288,6.60571 0.99622,2.38331 -2.8287,4.32307 -4.24305,6.48461 -0.25211,1.50129 -1.38497,3.11742 -0.75634,4.50387 0.56327,1.24229 2.56202,1.0317 3.64324,1.86327 0.79588,0.6121 1.24,1.57949 1.86,2.36924 -8.39878,9.58005 -3.85858,2.27949 2.00132,3.93387 0.86536,0.24431 -0.51486,1.78055 -1.10053,2.46285 -1.42711,1.6626 -4.03733,2.4121 -4.83549,4.45265 -0.34986,0.89445 1.79295,0.68927 2.68943,1.03391 -1.31854,1.63819 -2.63708,3.27639 -3.95562,4.91458 0.66656,0.72544 1.92921,1.19368 1.99967,2.17633 0.0985,1.37395 -1.25826,2.48092 -1.56948,3.82278 -0.31391,1.35345 0.11788,4.84884 0.11683,6.22575 -8e-4,1.05328 -0.46388,2.14171 -0.17615,3.15493 0.24138,0.85002 1.10612,1.3783 1.65918,2.06746 7.82248,2.82758 -3.54352,-2.1669 -3.75729,6.27252 -0.0553,2.18496 4.23975,-1.72368 6.40311,-1.4122 0.77116,0.11103 -0.28142,1.56687 -0.68022,2.23618 -0.55535,0.93205 -4.91731,6.04302 -5.54138,6.78439 1.57917,-0.0855 3.18481,-0.55678 4.73749,-0.2564 0.79773,0.15433 2.07487,0.7473 1.89058,1.53864 -0.42269,1.81501 -2.92768,2.68693 -3.29992,4.51295 -0.18906,0.92743 1.54302,1.20422 1.96139,2.05324 1.93613,3.92917 -1.20747,5.21438 -3.71401,8.46144 0.47992,0.89368 0.58071,2.14155 1.43974,2.68104 1.34606,0.84534 4.13572,-0.37781 4.63211,1.13218 0.93525,2.84501 -5.60155,6.20062 -3.45815,8.29218 1.10289,1.07621 3.61454,-0.86631 4.61266,0.30772 0.75374,0.88657 -1.21106,1.98741 -1.81659,2.98112 0,0 -9.14493,4.65958 -9.14493,4.65958 z"
608+ inkscape:connector-curvature="0" />
609+ <path
610+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
611+ id="path5278"
612+ d="m 581.73672,201.15421 c -5.84049,0.0226 -12.46977,3.74174 -18.23522,1.43917 -0.92495,-0.3694 -1.5343,-1.27727 -2.36778,-1.82253 -0.87794,-0.57434 -1.83477,-1.01794 -2.75215,-1.52691 -7.8597,-0.6834 -0.70651,-0.5885 -11.70003,2.01168 -1.54963,0.36652 -3.24586,1.07687 -4.74618,0.54324 -1.59834,-0.5685 0.85485,-5.45684 0.64497,-5.42188 -3.26191,0.54332 -5.93446,2.91946 -8.90169,4.37918 -1.07703,0.12394 -2.49605,1.16872 -3.23111,0.37181 -0.67458,-0.73134 1.68867,-2.13419 0.97042,-2.82271 -0.88828,-0.85153 -2.51436,-0.15881 -3.68494,0.22051 -3.53501,1.14552 -6.56729,4.25069 -10.28286,4.30575 -1.41951,0.021 0.58867,-2.77764 0.88301,-4.16646 -2.91053,0.68366 -5.82106,1.36733 -8.73159,2.05099 -8.55726,-7.49791 7.12666,4.81414 -14.40115,1.39085 -1.87303,-0.29784 3.21179,-4.26845 1.70996,-5.42666 -1.91086,-1.47365 -4.74198,0.90779 -7.13129,1.24574 -10.05799,1.42263 -1.29042,-0.848 -12.92141,2.92188 5.75912,-7.83975 5.57265,-5.71046 -3.55664,-2.09752 -2.02766,0.80245 -4.06024,1.61861 -6.16523,2.18815 -1.4706,0.39791 -3.76794,2.02901 -4.51623,0.70196 -7.88504,-13.98369 9.26915,0.86687 0.0352,-6.49718 -3.10338,1.17026 -6.20676,2.34052 -9.31014,3.51078 -0.57567,-0.69237 -0.83006,-2.15625 -1.72699,-2.0771 -3.09746,0.27333 -5.72754,2.79919 -8.82997,3.00868 -0.91247,0.0616 -0.59156,-2.08023 -1.47605,-2.31278 -1.66146,-0.43682 -4.08937,1.95174 -5.12124,0.57823 -0.99973,-1.33072 1.45413,-2.99444 2.18119,-4.49166 -5.27131,3.01667 -10.21343,6.70024 -15.81393,9.05001 -0.70494,0.29576 0.0899,-1.64484 -0.3563,-2.26558 -0.50641,-0.70446 -1.36894,-1.2616 -2.23327,-1.33677 -1.86367,-0.16207 -3.74223,1.04035 -5.57342,0.65787 -1.06648,-0.22276 -1.54432,-1.53723 -2.31648,-2.30585 -2.11262,0.0407 -4.22524,0.0813 -6.33786,0.12201 -12.42253,2.1242 -6.53573,2.91676 -15.18382,-0.38034 -1.73617,-0.66191 -3.38695,-1.91563 -5.24481,-1.8878 -3.53288,0.0529 -6.89889,2.69571 -10.38526,2.12195 -1.37022,-0.2255 -0.74241,-2.67624 -1.11361,-4.01436 -1.88368,-0.006 -3.76736,-0.012 -5.65104,-0.018 -24.28983,7.62107 -2.5727,3.42937 -7.44036,-1.19304 -1.17426,-1.1151 -3.36042,0.76142 -4.85605,0.14059 -0.9471,-0.39314 -0.37753,-2.78281 -1.40202,-2.73831 -17.07323,0.74169 -4.68269,5.70713 -13.15884,1.68512 -13.47711,1.23798 -0.53507,0.38388 -11.61335,0.31509 -1.85578,-0.0115 -3.70698,0.21371 -5.56273,0.2289 -1.65286,0.0135 -3.33144,-0.4439 -4.95669,-0.14277 -2.69057,0.49853 -5.20719,1.68414 -7.81614,2.50939 -2.13831,0.67638 -4.28365,1.33032 -6.42547,1.99548 -0.9837,-2.83624 -11.06653,5.91354 -9.75378,2.79645 1.53204,-3.63777 6.99404,-4.59873 8.4956,-8.24918 0.86063,-2.09228 -4.2097,1.67823 -6.21979,2.71644 -3.72203,1.92244 -6.92828,5.00691 -10.95697,6.15539 -1.36693,0.38967 1.46202,-2.43801 2.19303,-3.65701 -1.17023,0.0909 -2.53198,0.92049 -3.51069,0.27257 -0.68695,-0.45477 0.96331,-2.14961 0.20152,-2.46328 -4.37993,-1.80347 -8.71503,6.31425 -13.28098,5.05394 -9.4835,-2.61768 17.38499,-9.14192 -0.38289,-4.16034 -0.53601,-0.28526 -1.00462,-0.92342 -1.60803,-0.85578 -1.6592,0.18598 -3.16377,1.06881 -4.75661,1.56922 -1.28969,0.40517 -2.59751,0.75066 -3.88989,1.14719 -1.27067,0.38987 -2.49478,0.95467 -3.7988,1.21188 -0.57067,0.11256 -1.73101,0.46238 -1.74093,-0.1192 -0.0174,-1.01834 1.13036,-1.69456 1.69554,-2.54183 1.13752,-1.49935 -4.63996,2.07583 -4.03582,0.84154 0.66217,-1.35285 4.65116,-3.58371 3.19622,-3.19408 -2.64341,0.70788 -4.51559,3.1669 -7.03997,4.22341 -0.68424,0.28637 0.85778,-1.21035 1.28667,-1.81553 -1.25078,0.65196 -2.50155,1.30391 -3.75232,1.95586 9.21621,-7.98762 6.18858,-4.83213 -0.87423,-0.87619 -0.72387,0.40544 -1.54218,0.6125 -2.31326,0.91875 0,0 2.61292,-1.89841 2.61292,-1.89841 l 0,0 c 1.14285,-0.57635 2.16869,-1.50316 3.42856,-1.72905 0.47365,-0.0849 -0.48687,0.83017 -0.73031,1.24525 0.72034,-0.25777 1.44068,-0.51554 2.16102,-0.77331 -0.0129,0.26612 0.11092,0.57784 -0.0386,0.79836 -0.61275,0.9037 -3.19334,2.83016 -2.16774,2.45563 2.58273,-0.94316 4.57145,-3.1023 7.07165,-4.24644 0.52365,-0.23963 -1.37048,1.87365 -0.20579,1.9951 0.74974,0.0782 1.47219,-0.32486 2.20828,-0.48729 1.12167,-0.37799 2.86257,-2.20567 3.36502,-1.13396 0.5616,1.19787 -1.995,1.89173 -2.42282,3.14363 -0.14298,0.41839 0.66423,0.8732 1.09039,0.75536 2.14236,-0.59239 4.04954,-1.83414 6.08018,-2.73811 7.30472,-3.2518 6.963,-5.26487 6.23711,-0.62098 2.93608,2.63023 -0.0453,0.63795 6.49918,-0.28738 0.87818,-0.12417 1.74981,0.3045 2.63356,0.3793 1.00939,0.0854 2.02969,0.20481 3.03732,0.10065 1.47374,-0.15233 3.07086,-1.5959 4.35975,-0.86523 0.8671,0.49155 -0.53804,1.91949 -0.80707,2.87923 1.97363,-0.76926 3.95449,-1.52021 5.92088,-2.30778 1.9543,-0.78272 3.79068,-1.92385 5.84067,-2.40289 0.58192,-0.13598 1.89487,0.0929 1.67184,0.64736 -0.76788,1.90882 -4.79687,2.97497 -3.86747,4.81058 1.48135,2.92575 7.32339,-5.50614 9.48936,-2.59649 1.42331,-0.13101 2.86231,-0.14485 4.26993,-0.39303 2.16768,-0.38218 4.23629,-1.34177 6.43214,-1.49385 1.38899,-0.0962 2.73015,0.97425 4.10649,0.76394 3.11854,-0.47655 5.9479,-3.356 9.04853,-2.77417 1.44152,0.2705 -2.0691,4.5208 -0.61155,4.35735 4.97883,-0.55833 9.23228,-3.89449 13.84842,-5.84174 2.70996,5.53973 -0.455,1.31529 7.32522,2.53772 1.08502,0.17048 1.78761,1.32193 2.81267,1.71639 3.87458,1.49101 7.92222,0.0734 11.83057,1.37936 2.68235,-0.56484 5.31262,-1.88683 8.04704,-1.69452 1.35852,0.0955 2.16027,1.65891 3.24041,2.48837 2.61456,-0.0998 5.22912,-0.19951 7.84368,-0.29927 4.64473,-0.95021 8.88553,-3.87351 13.62142,-4.09202 1.60186,-0.0739 2.33226,2.20143 3.49839,3.30214 2.94984,-0.29944 5.89968,-0.59888 8.84953,-0.89833 1.33758,0.50801 2.58403,1.44687 4.01276,1.52403 2.28088,0.12319 5.73312,-2.96689 6.78773,-0.94072 1.14605,2.20185 -6.4441,5.77702 -4.01202,6.27356 3.87161,0.79045 6.92622,-4.10745 10.7999,-4.88771 0.91737,-0.18479 -1.29282,2.74099 -0.35803,2.78445 2.40459,0.11179 4.52016,-1.65725 6.78024,-2.48588 1.31945,0.0101 2.75475,-0.51033 3.95836,0.0304 0.78176,0.35121 0.32942,2.27564 1.18643,2.28098 2.67859,0.0167 5.04481,-2.12584 7.72159,-2.22554 0.94208,-0.0351 1.26601,1.48553 2.13182,1.8585 3.60961,1.55491 6.53653,0.002 10.21237,-0.83478 20.52329,-6.74084 1.89226,-2.51045 4.15948,3.45256 0.73899,1.94361 4.01445,-1.09539 5.98399,-1.76219 2.23019,-0.75505 4.26124,-2.7115 6.60629,-2.50033 1.06227,0.0957 -1.16158,1.92736 -1.13013,2.99346 0.0199,0.67426 0.84334,1.05302 1.26501,1.57952 4.12862,-2.00822 7.89397,-5.07526 12.38586,-6.02468 1.10106,-0.23272 -0.91579,3.05361 0.16356,3.37219 2.3053,0.68043 4.7056,-1.09801 7.10578,-1.22658 1.70439,-0.0913 3.40092,0.83038 5.0883,0.57341 3.51787,-0.53576 6.7499,-3.43107 10.27034,-2.91244 1.4619,0.21537 0.033,2.95518 0.0495,4.43277 0.30181,1.19077 -0.20039,3.03734 0.90543,3.57231 1.66477,0.80539 3.68366,-0.33775 5.52901,-0.45944 5.57141,-0.36741 4.65262,0.33142 10.53807,-2.04259 2.8186,-1.13693 5.21399,-3.79318 8.25207,-3.87782 1.47239,-0.041 -1.59556,2.4764 -2.39334,3.7146 0.73439,-0.24086 6.01373,-2.85719 7.87461,-1.29776 0.0775,0.0649 0.89268,4.62211 1.49732,4.43526 14.78199,-4.56792 12.68988,-12.15571 13.93555,-3.63588 2.66352,6.81078 -1.20811,-0.39314 10.26637,-0.38966 1.05436,3.1e-4 -0.57443,2.7161 0.39151,3.13875 2.9451,1.28864 13.55718,-4.08658 14.2252,-4.14987 0.94238,-0.0893 -0.4954,1.82723 -0.7431,2.74084 0,0 -1.4256,1.03576 -1.4256,1.03576 z"
613+ inkscape:connector-curvature="0" />
614+ <path
615+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
616+ id="path5280"
617+ d="m 437.91913,154.10856 c 1.23619,-0.0682 2.47239,-0.13636 3.70859,-0.20454 1.58967,0.0869 3.17891,0.33934 4.76902,0.2608 2.60001,-0.1284 5.26923,-1.63681 7.75984,-0.87957 1.37606,0.41837 0.54192,3.9983 1.97124,3.83817 35.88963,-4.02092 2.82269,-7.22874 20.51937,-5.03347 3.69136,2.35282 7.48018,-1.04865 11.12799,-0.36496 0.89607,0.16795 0.44139,2.40963 1.35248,2.3772 3.04143,-0.10825 5.79477,-1.86385 8.71066,-2.73538 3.21228,-0.96013 6.53974,-3.95409 9.67225,-2.75912 1.88961,0.72083 -0.98785,3.92236 -1.48177,5.88355 7.4778,-2.6997 15.0486,-0.18493 22.64137,-0.87945 2.98582,-0.27312 5.86817,-1.42005 8.86462,-1.52519 0.64451,-0.0226 7.36205,1.74657 8.38695,2.01041 22.66233,-6.2164 -5.59406,-0.006 1.79508,4.88026 3.01566,1.99414 6.60785,-3.07778 10.1398,-3.84989 1.21885,-0.26645 2.41213,0.66777 3.64842,0.83569 1.51909,0.20634 3.07181,0.49347 4.59038,0.28337 2.64393,-0.36579 5.17049,-1.32765 7.75573,-1.99148 4.22728,5.71577 -1.93151,-1.13286 8.0372,1.02932 0.90762,0.19686 0.25793,1.83945 0.38689,2.75918 3.89585,-1.98477 7.40915,-5.05301 11.68754,-5.95432 1.46572,-0.30877 -2.98474,2.70083 -2.15115,3.94534 0.81315,1.21397 2.88525,-0.46374 4.32788,-0.69561 -0.19386,1.02948 -1.62892,3.11096 -0.58158,3.08846 3.16055,-0.0679 5.77676,-2.79974 8.90328,-3.26728 1.17277,-0.17538 2.07855,1.64352 3.24848,1.4501 3.6131,-0.59735 6.7766,-2.87648 10.3455,-3.69758 2.04298,-0.47003 7.74632,0.36486 9.92961,0.62392 1.54872,0.10745 3.32447,-0.49201 4.64618,0.32236 0.83502,0.51449 -0.41383,2.96447 0.56398,2.88785 3.16131,-0.24772 5.68039,-3.03528 8.79677,-3.62136 0.63863,-0.1201 -0.0278,2.00105 0.60497,1.85324 13.56341,-3.16818 3.77193,-4.72057 10.23057,-3.37752 1.24491,-0.0989 2.70181,-0.99864 3.73472,-0.29674 0.77133,0.52414 -0.93495,2.48789 -0.0552,2.79714 1.80758,0.63537 3.81902,-0.40231 5.6897,-0.81658 2.85096,-0.63135 5.54036,-2.05462 8.44881,-2.31443 1.41531,-0.12642 2.67478,1.09344 4.09215,1.19417 2.08296,0.14804 4.16519,-0.30621 6.24779,-0.45931 3.35928,-1.08463 6.71857,-2.16926 10.07785,-3.25389 0.55553,0.85196 0.64963,2.54065 1.6666,2.55589 2.67042,-0.80363 5.34085,-1.60725 8.01128,-2.41088 0.47122,0.60211 0.67697,1.60175 1.41368,1.80633 1.24445,0.34558 4.10822,-1.60936 3.85951,-0.34198 -0.48472,2.4701 -3.27807,3.82095 -4.91711,5.73142 5.70103,-1.33877 10.12612,-5.88484 15.70457,-7.45129 0.58355,-0.16386 -0.0962,1.23344 0.0671,1.81715 0.12902,0.46112 0.31209,1.10095 0.77906,1.20689 3.35426,0.76105 3.63331,-2.23898 2.23264,1.86594 4.56137,3.27917 -3.43228,-1.96059 10.56193,-4.51534 1.97581,-0.3607 -3.49921,2.45408 -4.17344,4.34599 -0.32903,0.92328 1.91845,-0.40858 2.86324,-0.66949 3.86803,-1.06818 2.71345,-2.07285 4.06916,-0.29377 0.65874,-0.0329 2.02115,-0.75681 1.97621,-0.0988 -0.0787,1.1527 -3.30667,2.8058 -2.15487,2.7149 2.30435,-0.18187 4.05842,-2.25648 6.23422,-3.03687 0.64315,-0.23067 1.38324,0.22087 2.04874,0.0661 5.51896,-1.28379 3.78688,-3.25824 5.50883,-0.19721 -1.46583,1.71812 -4.57212,2.90268 -4.39748,5.15437 0.0156,0.20143 8.67506,-2.31725 8.69122,-1.51312 0.0418,2.08276 -5.97008,4.93862 -3.88739,4.89336 7.80888,-0.16971 16.70616,-11.4037 6.31714,0.11757 0.90308,0.0651 1.80616,0.1302 2.70924,0.1953 0.27814,0.42273 0.34662,1.1336 0.83442,1.26817 0.95893,0.26455 2.42441,-1.04441 2.97636,-0.21683 0.53135,0.79669 -2.30924,1.98837 -1.47786,2.46364 3.33256,1.90507 5.5039,-3.90126 3.07872,1.08059 4.23139,0.93002 -3.61451,3.89543 -2.08482,4.59396 2.0287,0.9264 4.18748,-2.97245 6.29916,-2.25506 1.45192,0.49325 -4.18448,2.13801 -3.19514,3.30956 1.96861,2.33118 11.74376,-7.47434 0.389,2.57794 -0.0375,0.53551 -0.64336,1.68584 -0.11242,1.60654 9.29633,-1.38852 9.7283,-6.25852 2.73533,1.82238 -0.71864,0.83044 -2.31993,2.03153 -1.61359,2.87246 4.45015,-0.20547 3.30627,-1.34009 4.63554,1.36899 6.1752,-0.54264 -0.212,2.16231 3.94226,3.83059 0.70833,0.28445 2.2706,-0.38153 2.25791,0.38168 -0.0534,3.21284 -8.33635,4.79542 2.76754,1.28484 0.83075,1.91899 -2.55661,2.61469 -2.23156,4.1519 0.16395,0.77534 1.75121,-0.54192 2.37683,-0.0555 0.43233,0.33616 -0.62952,1.09756 -0.39821,1.59396 0.32296,0.69309 3.34908,0.74132 3.53405,0.75722 -6.37567,7.34986 -1.26749,0.14391 -0.0687,2.59487 0.35848,0.73292 -0.86775,1.38193 -1.30163,2.07289 0,0 2.83108,-1.71491 2.83108,-1.71491 l 0,0 c -1.62573,0.55271 -3.171,1.46474 -4.87719,1.65811 -1.86292,0.21113 3.92214,-13.77688 3.30994,-4.54751 -0.43697,-0.22138 -0.82145,-0.64501 -1.31093,-0.66414 -1.08331,-0.0423 -2.45436,1.25905 -3.21571,0.48724 -0.62898,-0.63763 1.2009,-1.38762 1.49202,-2.23463 0.1294,-0.37651 0.0634,-1.08308 -0.32938,-1.14805 -1.07257,-0.17743 -2.83327,1.58094 -3.21263,0.56213 -0.4318,-1.15963 1.56848,-1.91432 2.35272,-2.87148 -2.08529,0.77586 -4.04044,2.122 -6.25586,2.3276 -1.2483,0.11584 1.87343,-2.85833 0.13022,-3.36272 -1.25443,-0.36296 -2.64297,0.7181 -3.9005,0.36606 -1.98283,-0.5551 0.33136,-8.6675 2.44939,-5.67082 -0.11377,-0.59785 0.0423,-1.32107 -0.34132,-1.79354 -0.44536,-0.54858 -1.18502,-0.96523 -1.89156,-0.95682 -1.75728,0.0209 -4.10153,2.43729 -5.16845,1.04082 -0.97742,-1.27933 2.58059,-2.13226 3.19884,-3.6188 0.35667,-0.85759 -3.97088,-0.70327 -0.94285,-2.62205 -0.30912,-0.2909 -1.07662,-0.47532 -0.92737,-0.87269 0.41542,-1.10604 3.15171,-1.92448 2.27577,-2.71734 -1.06356,-0.9627 -2.76722,1.17347 -4.18937,0.98523 -0.50454,-0.0668 0.67442,-1.53777 0.16587,-1.5178 -2.00217,0.0786 -4.22172,3.02759 -5.75464,1.73723 -1.28523,-1.08186 2.27523,-2.47231 3.41284,-3.70846 1.69334,-3.79201 1.02434,-0.89294 -2.96887,-1.10444 -0.43164,-0.0229 -0.70644,-0.64888 -0.71619,-1.08101 -0.0159,-0.70575 1.25738,-1.66328 0.64632,-2.01675 -3.18866,-1.84449 -5.78111,4.03437 -1.35578,-2.85334 -2.21776,-1.64947 -1.21018,-1.37236 -4.79348,-1.13862 -1.39043,0.0907 -2.84666,0.9726 -4.15193,0.48495 -0.65871,-0.2461 0.41497,-1.72217 -0.17671,-2.10214 -1.42729,-0.91658 -3.70494,0.93947 -5.03484,-0.73883 -0.60299,-0.21393 -1.16997,-0.67416 -1.80895,-0.64178 -1.28889,0.0653 -2.74506,1.72143 -3.75975,0.924 -0.80647,-0.63381 2.20098,-1.84945 1.56159,-2.65151 -0.65242,-0.81839 -2.00917,1.00735 -3.03556,0.80256 -0.45187,-0.0902 0.14067,-0.91075 0.21101,-1.36613 -1.21839,0.43181 -2.43678,0.86363 -3.65517,1.29544 -0.25354,-0.22264 -0.62939,-0.35707 -0.76062,-0.66793 -0.17042,-0.40368 0.34819,-1.20015 -0.0754,-1.31238 -1.8936,-0.50174 -8.19894,3.49373 -8.31461,3.19586 -0.81569,-2.10049 4.56795,-2.57491 4.73782,-4.82182 0.12012,-1.58882 -2.99734,1.0822 -4.49601,1.6233 -2.08036,0.93553 -4.14334,1.9107 -6.24108,2.80658 -1.80069,0.76903 -4.53985,3.91984 -5.45174,2.18712 -0.97455,-1.85178 3.0537,-2.94119 4.10168,-4.75242 0.26628,-0.46021 0.0615,-1.507 -0.46996,-1.52428 -1.58559,-0.0515 -2.99345,1.11425 -4.56062,1.36077 -0.79363,0.12484 -1.59692,-0.17771 -2.39537,-0.26657 -4.2548,2.37378 -7.90174,6.81699 -12.7644,7.12133 -2.94666,0.18442 3.87288,-4.45736 5.80931,-6.68603 -0.48591,-0.59114 -0.69261,-1.78416 -1.45775,-1.77341 -2.51475,0.0353 -4.81733,1.51195 -7.30276,1.89646 -5.06126,0.783 -4.67311,0.33438 -8.50322,-1.66221 -3.47983,1.1729 -6.95966,2.3458 -10.43949,3.5187 -0.30549,-1.1707 0.29338,-3.52556 -0.91645,-3.51209 -3.62555,0.0404 -6.62575,3.65582 -10.25148,3.63642 -1.23853,-0.007 1.66672,-3.89226 0.44498,-3.68891 -4.09903,0.68224 -7.13798,4.59273 -11.19787,5.47861 -1.12856,0.24626 0.7464,-2.18633 1.1196,-3.2795 -2.70903,1.27901 -5.1708,4.32182 -8.12711,3.83702 -1.90269,-0.31201 3.59746,-2.66683 3.5158,-4.59321 -0.0525,-1.23781 -2.45976,0.30037 -3.69255,0.4234 -1.46662,0.14638 -2.9419,0.20626 -4.40496,0.38477 -10.62024,1.29579 -0.63827,0.54815 -11.1481,1.16065 -2.80818,0.75238 -5.61635,1.50477 -8.42453,2.25716 0.42608,-1.63775 2.96629,-5.03264 1.27824,-4.91325 -4.77994,0.33808 -8.7824,3.8364 -13.1736,5.7546 0.15542,-1.38489 1.85968,-4.17566 0.46625,-4.15467 -13.75571,0.20727 -7.80115,8.29755 -11.47942,2.48146 -2.33385,0.88589 -4.51172,2.47751 -7.00154,2.65765 -0.71542,0.0518 0.18093,-1.61481 -0.32031,-2.12791 -1.69982,-1.74004 -6.36894,-4.9e-4 -7.57099,-0.11103 -0.99157,-0.0912 -1.76798,-0.91671 -2.65197,-1.37507 -2.09073,0.3287 -4.18146,0.65741 -6.27219,0.98612 -4.18788,-0.43557 -4.06426,-0.009 -7.55836,-1.74909 -0.90521,-0.4509 -1.58091,-1.59702 -2.59199,-1.5767 -2.46011,0.0494 -4.7061,1.70603 -7.1658,1.77273 -0.85835,0.0233 -1.38548,-1.01473 -2.07822,-1.52209 -1.71767,0.15619 -3.43533,0.31238 -5.153,0.46857 -12.16079,-1.35046 6.81819,0.27799 -13.25426,1.47955 -1.76161,0.10546 -3.40987,-1.20637 -5.17287,-1.12741 -3.27207,0.14656 -6.39822,1.50844 -9.66129,1.79185 -5.95391,0.51713 -6.23671,-0.2208 -11.03836,-2.32483 -2.57098,0.27277 -5.14197,0.54555 -7.71295,0.81832 -0.91766,-0.76156 -1.56555,-2.3947 -2.75298,-2.28469 -3.40416,0.31538 -6.37271,2.50981 -9.66387,3.43505 -1.89983,0.5341 -3.88985,0.6772 -5.84762,0.9257 -1.86103,0.23622 -4.98041,2.29736 -5.60307,0.52776 -0.83546,-2.3744 2.2799,-4.48833 3.41985,-6.7325 -6.30568,3.02597 -12.28992,6.842 -18.91706,9.07792 -2.01786,0.6808 -5.02029,1.10316 -6.3653,-0.54796 -1.28614,-1.57885 3.01586,-5.66819 1.01096,-6.02496 -4.18293,-0.74434 -7.97301,2.98121 -12.08383,4.05456 -18.47256,4.82328 8.73927,-5.16607 -13.65645,3.68169 0,0 8.30503,-6.03396 8.30503,-6.03396 z"
618+ inkscape:connector-curvature="0" />
619+ <path
620+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
621+ id="path5282"
622+ d="m 439.33369,237.08082 c -5.47439,-2.96028 -3.28562,5.72694 -1.53636,5.2325 3.44066,-0.97252 6.23707,-3.74491 9.72747,-4.52016 0.75774,-0.16831 0.0633,2.07164 0.83265,2.17464 2.67303,0.35787 13.46994,-4.64024 14.14779,-4.92121 2.04586,-0.54266 4.02194,-1.56426 6.13758,-1.62798 8.26835,-0.24902 -5.3663,4.92975 0.63623,6.00394 3.33252,0.59637 6.26374,-2.88469 9.6326,-3.21942 1.2112,-0.12034 2.05563,1.30397 3.08344,1.95596 4.62785,-1.95699 9.2557,-3.91398 13.88356,-5.87097 1.74763,0.52552 7.10975,2.28627 8.91991,2.20657 4.91708,-0.21649 9.55324,-2.7245 14.4705,-2.93685 0.96534,-0.0417 2.29151,0.18143 2.6989,1.05758 0.48206,1.03674 -0.42687,2.24646 -0.6403,3.36969 0.42808,-0.18104 13.87161,-6.49543 16.43017,-5.66676 1.26258,0.40892 -0.86067,3.47065 0.37133,3.96409 2.45886,0.98481 5.28458,-0.37938 7.92014,-0.64321 15.4825,-1.54984 2.47234,-0.73607 17.32767,-1.44683 20.16342,-0.68595 -0.61738,-1.19219 12.25354,1.71416 1.88649,0.42598 3.86273,0.35948 5.79515,0.2814 2.08666,-0.0843 4.32689,-1.6528 6.21799,-0.76679 1.05283,0.49326 -0.32071,2.30308 -0.48106,3.45461 1.74185,-0.3169 3.4837,-0.6338 5.22556,-0.9507 6.48171,0.58028 11.31801,-5.02464 17.37162,-5.86508 1.21646,-0.16889 0.92241,2.46374 1.96105,3.11914 1.64086,1.0354 3.65432,1.44253 5.58426,1.64206 12.40919,-0.10851 6.3507,-0.44262 18.18031,0.91002 5.2457,-0.519 10.31623,3.10438 15.5601,2.66514 4.34908,-0.36429 8.39276,-3.24534 12.74907,-2.98106 1.44232,0.0875 0.87592,2.90366 1.94781,3.87268 5.51735,4.98789 4.48486,-2.50811 3.9798,6.33873 5.76444,2.19985 12.43819,-6.60952 18.41769,-4.55109 1.44645,0.49794 -1.68101,4.66965 -0.15351,4.58671 4.81321,-0.26138 8.63125,-5.36947 13.45116,-5.30882 1.86087,0.0234 -0.76563,3.64243 -1.14845,5.46364 2.80475,-0.55712 5.6095,-1.11423 8.41425,-1.67135 4.05645,-1.59233 7.85344,-4.17428 12.16934,-4.777 1.04286,-0.14563 0.82904,1.93593 1.24356,2.90389 1.42922,0.0469 2.87497,0.36245 4.28766,0.14068 2.12504,-0.33359 4.1136,-1.26683 6.20077,-1.78717 8.61601,-2.14799 -0.68024,1.02577 9.22492,-2.7096 0.72398,-0.0381 1.46437,-0.27231 2.17195,-0.11441 0.35929,0.0802 0.5247,0.51649 0.78706,0.77473 2.09582,-1.26276 4.09681,-2.69827 6.28745,-3.78827 0.18826,-0.0937 0.30755,0.28684 0.46132,0.43026 0.20897,0.0476 0.43874,0.24546 0.62691,0.14284 1.47903,-0.80655 2.81173,-1.85645 4.21759,-2.78467 10.09216,-6.69652 -1.79879,0.91257 -0.29335,1.23767 1.96082,0.42344 3.21705,-2.44369 5.02727,-3.30811 1.21936,-0.58227 -3.94065,3.52558 -2.67863,3.04268 1.34115,-0.51318 2.40022,-1.57706 3.60033,-2.36559 3.58809,-1.94003 -0.10481,0.10832 -3.22044,1.2596 -1.18007,0.43606 2.73229,-0.76526 2.43591,-1.6751 -0.28452,-0.87342 -1.83157,-0.28546 -2.74741,-0.21451 24.89401,-13.44905 10.98443,-4.78107 6.10519,-4.80799 -0.5874,-0.003 0.47601,-1.09001 0.84739,-1.54512 0.68406,-0.83828 1.57306,-1.49001 2.29035,-2.30005 0.57577,-0.65021 1.0537,-1.38089 1.58056,-2.07134 0.79967,-0.87436 1.59935,-1.74871 2.39902,-2.62307 0.20201,-0.60032 1.14138,-1.46243 0.60604,-1.80097 -0.9444,-0.59722 -2.26102,0.30833 -3.35154,0.0648 -0.4229,-0.0944 -1.12945,-0.68431 -0.83167,-0.9991 2.87301,-3.03713 7.29695,-4.22652 10.35349,-7.07887 0.23764,-0.22177 -0.41926,-0.49684 -0.62888,-0.74526 -1.4682,-0.57082 -1.26023,-0.042 -1.06626,-1.32997 0,0 3.02138,-1.27939 3.02138,-1.27939 l 0,0 c -7.61861,4.36787 -7.57924,3.76889 1.37583,1.16192 -2.79852,1.96211 -7.60545,5.05804 -9.695,7.79492 -0.10971,0.14368 -1.22351,2.57933 -0.59404,3.03807 0.67307,0.49052 1.63956,0.29393 2.45934,0.4409 -10.69683,7.76533 -6.46048,2.28777 -3.95825,4.66925 0.28022,0.26669 0.34086,0.73833 0.2949,1.12243 -0.0613,0.51213 -1.11159,1.36151 -0.59991,1.42631 3.44049,0.43571 7.18169,-3.194 1.54058,1.27161 0.51455,0.0832 1.85256,-0.17022 1.54366,0.24963 -0.42993,0.58435 -5.88925,3.82593 -6.64539,4.28618 -2.25283,1.37126 -4.25988,3.13349 -6.56145,4.42126 -0.57965,0.32433 0.91585,-0.96229 1.37377,-1.44343 -0.97832,0.61888 -1.77788,1.82089 -2.93498,1.85665 -0.84725,0.0262 1.25052,-1.15506 1.77523,-1.8208 0.14614,-0.18543 0.39428,-0.8091 0.19623,-0.68058 -2.95533,1.9178 -5.47115,4.52716 -8.60483,6.13714 -1.41463,0.7268 7.50902,-5.73994 3.22744,-3.51403 -1.94695,1.35889 -3.46817,4.16386 -5.84085,4.07668 -2.00788,-0.0738 5.80425,-2.70226 4.39051,-4.12997 -1.44757,-1.46188 -3.44965,2.24521 -5.22143,3.29084 -1.58833,0.93737 -3.17327,1.89624 -4.85411,2.65534 -3.03629,1.37125 -2.45211,1.51547 -3.62353,-0.19057 -1.2459,0.29401 -2.4918,0.58801 -3.7377,0.88202 -0.94895,-0.0594 -1.91563,-0.37033 -2.84684,-0.17826 -0.90464,0.18658 -13.69919,4.55903 -14.20983,4.39414 -1.42497,-0.46012 2.23239,-3.95305 0.80923,-4.41875 -2.71665,-0.88896 -5.56686,1.30075 -8.35029,1.95112 -18.56769,0.0793 13.70185,-0.82956 -20.27406,5.77609 -1.24209,0.24149 -1.79361,-1.8371 -2.90263,-2.44636 -1.29963,-0.71396 -2.72775,-1.30777 -4.20303,-1.45723 -7.88112,-0.79842 -5.93835,3.28036 -6.95179,-3.55661 -4.15903,1.41034 -8.31806,2.82068 -12.47709,4.23101 0.13929,-1.64904 2.02947,-4.5709 0.41789,-4.94714 -3.68032,-0.8592 -7.29587,2.22135 -11.06755,2.46089 -19.20033,1.21941 3.42849,-1.74287 -8.44928,-6.51391 -3.19359,-1.2828 -6.88148,0.1533 -10.32222,0.22994 -4.01012,0.4663 -8.02025,0.93261 -12.03037,1.39891 -1.70721,-1.01184 -3.14481,-2.86055 -5.12161,-3.03552 -3.42478,-0.30314 -6.76114,2.07637 -10.17655,1.68141 -1.21543,-0.14056 -0.76145,-3.11341 -1.98472,-3.08777 -3.40485,0.0714 -6.28097,2.89341 -9.65823,3.33189 -0.82541,0.10716 -1.10923,-1.24127 -1.66384,-1.86191 -1.46833,0.1182 -2.93216,0.38115 -4.405,0.3546 -1.20724,-0.0218 -2.40792,-0.75508 -3.5878,-0.49866 -3.40511,0.74001 -6.46807,4.14784 -9.87684,3.42487 -1.76071,-0.37343 2.8545,-4.90599 1.09548,-5.28732 -6.30413,-1.36664 -12.36869,6.47925 -19.07787,3.24381 -2.81278,-1.15043 -8.0235,-3.73838 -11.21616,-2.99339 -5.30446,1.23778 -9.81702,5.25422 -15.21947,5.94913 -1.30931,0.16841 0.63002,-3.1138 -0.3995,-3.94008 -0.96711,-0.77619 -8.78805,0.52726 -9.49794,0.62362 -2.43958,0.81492 -4.75139,2.60053 -7.31876,2.44474 -3.96541,-0.24062 4.43728,-6.06793 -2.4985,-4.79696 -4.07548,0.74683 -7.54039,3.65131 -11.60589,4.45071 -3.28335,0.64561 -6.23377,-5.00667 -9.93337,-1.45023 -2.69658,0.53612 -5.34039,1.61546 -8.08974,1.60836 -1.29308,-0.003 -2.27044,-1.2921 -3.5163,-1.63834 -1.44221,-0.40081 -2.95661,-0.56492 -4.45344,-0.57657 -7.07426,-0.0551 -4.52877,1.11419 -12.43282,2.68962 -1.29287,0.25769 -2.63653,0.0199 -3.9548,0.0298 -0.74509,-0.3974 -1.39082,-1.19305 -2.23527,-1.19222 -8.48298,0.008 -5.99334,5.38203 -16.7296,6.92971 -1.63516,0.23571 1.50781,-2.94003 2.26172,-4.41004 -1.14109,0.0362 -2.31128,-0.14996 -3.42328,0.10862 -1.6719,0.38879 -3.21432,1.20574 -4.82148,1.80861 0,0 6.59652,-4.79266 6.59652,-4.79266 z"
623+ inkscape:connector-curvature="0" />
624+ <path
625+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none"
626+ id="path5288"
627+ d="m 427.09099,608.80296 c -0.54536,0.88302 -2.59373,3.0492 -1.6361,2.64907 3.94655,-2.30416 7.89309,-4.60832 11.83964,-6.91247 -0.48068,0.95507 -2.45697,2.52886 -1.44204,2.86521 1.68661,0.55895 3.34268,-1.22337 5.06375,-1.66497 1.38771,-0.35607 2.85207,-1.08817 4.237,-0.72145 0.74384,0.19697 0.64163,1.39882 0.96244,2.09823 1.37197,0.0822 2.78072,0.57276 4.11592,0.24671 3.459,-0.84467 6.54045,-2.94826 10.02108,-3.69889 2.35754,-0.50843 6.11513,1.00569 8.24077,1.90515 1.08276,0.45817 2.01316,1.647 3.18215,1.5214 3.04137,-0.32679 5.82554,-1.86816 8.73831,-2.80223 0.0213,1.01023 -0.88531,2.68436 0.064,3.03068 1.6579,0.60487 3.51554,-0.518 5.17469,-1.11943 3.10954,-1.12717 5.90095,-3.06895 9.06232,-4.04132 1.11082,-0.34167 3.56487,-0.97615 3.48173,0.18305 -0.17139,2.38956 -5.60845,4.31354 -3.92661,6.01963 1.90254,1.92996 5.2515,-1.34136 7.87725,-2.01204 5.57129,2.09339 10.88855,-4.38851 16.19806,-2.9901 1.5161,0.39931 -1.91863,4.4988 -0.36246,4.68943 3.61195,0.44246 6.80584,-2.64975 10.35214,-3.4657 4.75582,-1.09424 4.54067,-0.5378 7.56802,1.586 2.7685,-1.48955 4.99284,1.99196 7.53405,1.61787 3.37273,-0.49649 6.43938,-2.27591 9.75173,-3.08218 2.40251,-0.5848 4.93371,-0.50568 7.33922,-1.078 3.43034,-0.81613 6.59584,-3.15152 10.12112,-3.07612 1.16193,0.0249 0.71886,2.21042 1.07829,3.31564 1.42789,0.26396 2.89169,0.37849 4.28369,0.79187 4.40179,1.3072 2.47933,2.85169 8.61077,1.10238 2.82423,-0.80575 18.5379,-8.0104 22.90225,-7.58044 1.38563,0.1365 1.07795,2.56757 1.61692,3.85135 6.71637,11.01182 -3.68387,-3.37038 21.00188,-5.1411 2.86377,-0.20542 -5.40592,5.18669 -3.94363,7.65753 1.31649,2.22446 5.10447,-0.84577 7.6179,-1.44914 2.83592,-0.68079 5.59821,-1.63981 8.41404,-2.39945 2.34076,-0.63148 4.70255,-1.18227 7.05383,-1.7734 1.89507,-0.27942 3.83635,-1.33931 5.68522,-0.83825 0.91429,0.24778 0.67699,1.76946 1.01548,2.65418 2.87065,-0.87358 5.62729,-2.92999 8.61194,-2.62073 1.19443,0.12376 -0.64239,3.23232 0.51114,3.56602 2.02002,0.58437 15.38587,-3.38686 16.41366,-3.66716 -0.15304,1.37971 -1.82071,3.86876 -0.45913,4.13912 2.88522,0.57288 5.56173,-1.98169 8.44725,-2.55301 1.49987,-0.29697 3.07716,0.21428 4.58688,-0.0277 2.14755,-0.34421 4.12553,-1.5628 6.29505,-1.71648 0.71473,-0.0506 1.11339,1.25168 1.8214,1.14155 2.30654,-0.35876 4.37463,-1.63033 6.56195,-2.4455 -0.44888,1.15735 -2.31073,2.69008 -1.34663,3.47204 1.24004,1.00577 3.13873,-0.68571 4.73492,-0.72386 1.27427,-0.0305 5.97531,0.93232 7.19325,1.37508 1.00412,0.36504 1.79765,1.62936 2.85276,1.46128 3.30399,-0.52634 6.29112,-2.27935 9.43668,-3.41903 2.16754,7.29671 -1.34009,-1.02626 10.2382,-0.42077 1.26673,0.0662 -0.89534,2.46826 -0.75751,3.7292 0.0842,0.77019 0.82031,1.33174 1.37033,1.87741 3.25333,3.22757 4.14722,0.43976 9.52911,-1.62234 -5.67229,9.9542 2.19189,-5.35859 6.0963,-0.33515 1.76843,2.27527 -6.50408,3.21284 -6.15274,6.07304 0.29151,2.37311 4.145,-2.92278 6.53572,-2.95529 -2.29854,3.66744 -2.94659,2.96902 0.93035,2.70267 23.98881,-12.56081 6.53151,-5.05582 6.71984,-1.35229 0.0562,1.10418 2.14953,-0.59987 3.2544,-0.64052 0.59071,-0.0217 1.14215,0.30517 1.71323,0.45776 1.24821,-0.35158 2.46907,-0.82114 3.74464,-1.05472 0.6566,-0.12024 1.33503,0.002 2.00255,0.002 -7.56212,7.4632 -4.80566,3.75696 0.51507,2.0828 0.278,-0.0875 0.83108,0.29605 0.68233,0.54666 -0.69786,1.17578 -1.86061,2.00398 -2.79092,3.00597 0,0 -1.07469,0.77304 -1.07469,0.77304 l 0,0 c 0.29688,-0.55013 0.49344,-1.16768 0.89064,-1.65039 0.97731,-1.18769 4.73458,-3.44842 3.20163,-3.32283 -3.51078,0.28763 -5.88837,4.42533 -9.63666,4.33697 -0.15241,-0.37159 -0.34842,-0.72816 -0.45725,-1.11477 -0.29714,-1.0556 -0.24534,-2.79779 -0.8748,-2.62026 -2.57218,0.72544 -4.57165,3.54585 -7.24208,3.44002 -1.52804,-0.0605 1.88309,-2.41005 2.82464,-3.61508 -2.57134,1.22873 -5.14267,2.45745 -7.71401,3.68618 2.38555,-2.2552 5.77328,-3.78851 7.15663,-6.76561 0.72913,-1.56914 -3.24014,1.21524 -4.86007,1.82323 -1.6775,0.62961 -3.30811,1.40187 -5.03222,1.88956 -1.02074,0.28874 -3.10209,1.48551 -3.15373,0.42598 -0.0805,-1.65221 4.01255,-2.67402 2.98116,-3.96728 -1.08235,-1.35717 -3.33942,0.94959 -5.00913,1.42439 -20.13729,8.35134 -2.69796,2.67973 -3.51754,-2.53363 -0.30637,-1.94883 -3.85411,1.58588 -5.79195,1.21634 -0.87346,-0.16656 -0.0847,-2.23403 -0.93357,-2.49888 -11.84288,-3.69529 -1.16733,3.90973 -7.75074,-1.30702 -2.41838,0.61135 -4.85237,1.16396 -7.25514,1.83405 -2.78931,0.77789 -5.42146,2.48551 -8.31711,2.50877 -0.92506,0.007 -0.55731,-1.9355 -1.33837,-2.43121 -1.00483,-0.63771 -2.41681,-0.17922 -3.51128,-0.64664 -5.17393,-2.20964 4.51953,-3.02699 -6.76187,-0.29747 -1.8717,0.0522 -5.62004,0.0639 -7.3367,0.54341 -2.69541,0.75295 -5.09849,2.65578 -7.88857,2.87404 -0.88863,0.0695 -0.97674,-1.50932 -1.61597,-2.13053 -2.88746,-2.80607 -2.96741,-1.82144 -7.53922,-1.91209 -5.60568,-1.00025 -5.2968,-1.462 -12.0296,0.4822 -3.77819,1.09101 -7.17546,4.70648 -11.06137,4.10258 -1.96748,-0.30576 3.75004,-3.90954 2.47312,-5.43726 -3.21419,-3.84551 -12.45489,8.124 -14.52498,3.88536 0.16133,-1.24054 1.72133,-3.53728 0.484,-3.72163 -2.94633,-0.43896 -5.68485,1.79467 -8.57499,2.51619 -2.56637,0.64068 -5.14051,1.38245 -7.77923,1.56659 -1.88811,0.13176 -3.76204,-0.41995 -5.64306,-0.62993 0.13071,-1.79104 2.18522,-5.47173 0.39212,-5.37312 -5.55708,0.30559 -10.33401,4.13599 -15.50101,6.20399 -10.66645,-2.44406 0.68895,-0.62357 -14.71365,0.88811 -1.68946,0.16581 -3.35352,-0.60601 -5.05038,-0.65553 -1.88826,-0.0551 -3.83509,0.84291 -5.65682,0.34302 -0.93454,-0.25644 -0.73557,-2.23638 -1.69663,-2.36085 -2.36483,-0.30628 -4.69832,0.81892 -7.04748,1.22838 -2.97423,0.81182 -5.94845,1.62365 -8.92268,2.43547 -0.86665,-0.8126 -1.41221,-2.41128 -2.59994,-2.43779 -5.34668,-0.11933 -13.32985,5.97106 -18.52181,1.51644 -0.70103,-0.60147 -0.94151,-1.58947 -1.41227,-2.38421 -0.71473,0.22765 -15.04458,4.94998 -16.29418,4.75369 -1.16619,-0.18319 0.32544,-3.32233 -0.84936,-3.43812 -3.23005,-0.31834 -6.18554,2.3471 -9.4303,2.42499 -1.28344,0.0308 -2.14298,-1.4143 -3.21447,-2.12145 -4.57791,1.88547 -9.15581,3.77095 -13.73372,5.65642 -0.35422,-0.97953 -0.25778,-2.27745 -1.06266,-2.9386 -0.88974,-0.73085 -3.03618,0.38783 -3.38033,-0.71096 -0.44745,-1.42861 3.36536,-4.26694 1.8802,-4.07862 -3.91526,0.49646 -7.09459,3.45974 -10.64188,5.18961 0.003,-0.88328 0.88856,-2.56291 0.01,-2.64984 -2.39024,-0.23638 -4.62168,1.31014 -6.93253,1.9652 -21.18125,5.49534 1.18422,1.02595 -11.44132,0.93616 -2.29045,-0.0163 -4.51443,1.00604 -6.80442,0.95784 -1.30262,-0.0274 -2.42374,-1.16009 -3.72651,-1.17953 -2.1489,-0.0321 -4.24554,1.38622 -6.36478,1.02898 -0.87305,-0.14717 -0.86226,-1.54661 -1.29339,-2.31992 -2.244,0.83914 -8.96653,3.77305 -12.27692,3.87067 -0.63692,0.0188 -1.13222,-0.59394 -1.73219,-0.80855 -1.88608,-0.67465 -2.71984,-0.38168 -3.36282,-2.56718 0,0 -2.59014,1.88185 -2.59014,1.88185 z"
628+ inkscape:connector-curvature="0" />
629+ </g>
630+</svg>
network-transport-2/network-transport.cabal+4−4
@@ -19,7 +19,7 @@ Library
19 Exposed-modules: Network.Transport,
19 Exposed-modules: Network.Transport,
20 Network.Transport.Chan,
20 Network.Transport.Chan,
21 Network.Transport.TCP
21 Network.Transport.TCP
22− extensions: EmptyDataDecls, ForeignFunctionInterface, FlexibleContexts
22+ extensions: EmptyDataDecls, OverloadedStrings, ForeignFunctionInterface, FlexibleContexts, BangPatterns
23 ghc-options: -Wall -fno-warn-unused-do-bind
23 ghc-options: -Wall -fno-warn-unused-do-bind
24 HS-Source-Dirs: src
24 HS-Source-Dirs: src
25
25
@@ -34,7 +34,7 @@ Test-Suite TestTCP
34 regex-applicative,
34 regex-applicative,
35 mtl,
35 mtl,
36 transformers
36 transformers
37− extensions: EmptyDataDecls, OverloadedStrings, ForeignFunctionInterface, FlexibleContexts
37+ extensions: EmptyDataDecls, OverloadedStrings, ForeignFunctionInterface, FlexibleContexts, BangPatterns
38 ghc-options: -Wall -fno-warn-unused-do-bind
38 ghc-options: -Wall -fno-warn-unused-do-bind
39 HS-Source-Dirs: tests src
39 HS-Source-Dirs: tests src
40
40
@@ -47,7 +47,7 @@ Test-Suite TestMulticastInMemory
47 data-lens,
47 data-lens,
48 mtl,
48 mtl,
49 transformers
49 transformers
50− extensions: EmptyDataDecls, OverloadedStrings
50+ extensions: EmptyDataDecls, OverloadedStrings, ForeignFunctionInterface, FlexibleContexts, BangPatterns
51 ghc-options: -Wall -fno-warn-unused-do-bind
51 ghc-options: -Wall -fno-warn-unused-do-bind
52 HS-Source-Dirs: tests src
52 HS-Source-Dirs: tests src
53
53
@@ -60,6 +60,6 @@ Test-Suite TestInMemory
60 data-lens,
60 data-lens,
61 mtl,
61 mtl,
62 transformers
62 transformers
63− extensions: EmptyDataDecls, OverloadedStrings
63+ extensions: EmptyDataDecls, OverloadedStrings, ForeignFunctionInterface, FlexibleContexts, BangPatterns
64 ghc-options: -Wall -fno-warn-unused-do-bind
64 ghc-options: -Wall -fno-warn-unused-do-bind
65 HS-Source-Dirs: tests src
65 HS-Source-Dirs: tests src
network-transport-2/src/Network/Transport/Internal.hs+17−10
@@ -8,7 +8,9 @@ module Network.Transport.Internal ( -- * Encoders/decoders
8 -- * Miscellaneous abstractions
8 -- * Miscellaneous abstractions
9 , failWith
9 , failWith
10 , failWithIO
10 , failWithIO
11− , failWithMaybeIO
11+ , tryIO
12+ -- * Debugging
13+ , tlog
12 ) where
14 ) where
13
15
14import Prelude hiding (catch)
16import Prelude hiding (catch)
@@ -21,8 +23,8 @@ import qualified Data.ByteString.Internal as BSI (unsafeCreate, toForeignPtr, in
21import Control.Applicative ((<$>))
23import Control.Applicative ((<$>))
22import Control.Monad.IO.Class (MonadIO, liftIO)
24import Control.Monad.IO.Class (MonadIO, liftIO)
23import Control.Monad.Error (MonadError, throwError)
25import Control.Monad.Error (MonadError, throwError)
24−import Control.Monad.Trans.Maybe (MaybeT, runMaybeT)
25−import Control.Exception (IOException, catch)
26+import Control.Exception (IOException, catch, try)
27+--import Control.Concurrent (myThreadId)
26
28
27foreign import ccall unsafe "htonl" htonl :: CInt -> CInt
29foreign import ccall unsafe "htonl" htonl :: CInt -> CInt
28foreign import ccall unsafe "ntohl" ntohl :: CInt -> CInt
30foreign import ccall unsafe "ntohl" ntohl :: CInt -> CInt
@@ -80,10 +82,15 @@ failWithIO f io = do
80 handleIOException :: IOException -> IO (Either IOException a)
82 handleIOException :: IOException -> IO (Either IOException a)
81 handleIOException = return . Left
83 handleIOException = return . Left
82
84
83−-- | Like 'failWithIO' but throw an error on a return of 'Nothing' too
85+-- | Like 'try', but specialized to IOExceptions
84−failWithMaybeIO :: (MonadIO m, MonadError e m) => (Maybe IOException -> e) -> MaybeT IO a -> m a
86+tryIO :: IO a -> IO (Either IOException a)
85−failWithMaybeIO f io = do
87+tryIO = try
86− ma <- failWithIO (f . Just) $ runMaybeT io
88+
87− case ma of
89+-- Logging (for debugging)
88− Nothing -> throwError (f Nothing)
90+tlog :: String -> IO ()
89− Just a -> return a
91+tlog _ = return ()
92+{-
93+tlog msg = do
94+ tid <- myThreadId
95+ putStrLn $ show tid ++ ": " ++ msg
96+-}
network-transport-2/src/Network/Transport/Internal/TCP.hs+16−32
@@ -3,7 +3,6 @@ module Network.Transport.Internal.TCP ( forkServer
3 , recvWithLength
3 , recvWithLength
4 , recvExact
4 , recvExact
5 , recvInt32
5 , recvInt32
6− , sendMany
7 ) where
6 ) where
8
7
9import Prelude hiding (catch)
8import Prelude hiding (catch)
@@ -23,20 +22,16 @@ import qualified Network.Socket as N ( HostName
23 , defaultProtocol
22 , defaultProtocol
24 , setSocketOption
23 , setSocketOption
25 )
24 )
26−import qualified Network.Socket.ByteString as NBS (recv, sendMany)
25+import qualified Network.Socket.ByteString as NBS (recv)
27import Control.Concurrent (forkIO, ThreadId)
26import Control.Concurrent (forkIO, ThreadId)
28import Control.Monad (mzero, MonadPlus, liftM)
27import Control.Monad (mzero, MonadPlus, liftM)
29−import Control.Monad.IO.Class (MonadIO, liftIO)
30−import Control.Monad.Error (MonadError)
31−import Control.Exception (catch, IOException)
32import Data.ByteString (ByteString)
28import Data.ByteString (ByteString)
33−import qualified Data.ByteString as BS (length, concat, null, empty)
29+import qualified Data.ByteString as BS (length, concat, null)
34import Data.Int (Int32)
30import Data.Int (Int32)
35
31
36-- | Start a server at the specified address
32-- | Start a server at the specified address
37−forkServer :: (MonadIO m, MonadError IOException m)
38− => N.HostName -> N.ServiceName -> (N.Socket -> IO ()) -> m ThreadId
33+forkServer :: N.HostName -> N.ServiceName -> (N.Socket -> IO ()) -> IO ThreadId
39−forkServer host port server = liftIO $ do
34+forkServer host port server = do
40 -- Resolve the specified address. By specification, getAddrInfo will never
35 -- Resolve the specified address. By specification, getAddrInfo will never
41 -- return an empty list (but will throw an exception instead) and will return
36 -- return an empty list (but will throw an exception instead) and will return
42 -- the "best" address first, whatever that means
37 -- the "best" address first, whatever that means
@@ -47,16 +42,12 @@ forkServer host port server = liftIO $ do
47 N.listen sock 5
42 N.listen sock 5
48 forkIO $ server sock
43 forkIO $ server sock
49
44
50−-- | Lifted version of 'Network.Socket.ByteString.sendMany'
51−sendMany :: (MonadIO m) => N.Socket -> [ByteString] -> m ()
52−sendMany sock msg = liftIO $ NBS.sendMany sock msg
53−
54-- | Read a length and then a payload of that length
45-- | Read a length and then a payload of that length
55−recvWithLength :: (MonadIO m, MonadPlus m) => N.Socket -> m [ByteString]
46+recvWithLength :: N.Socket -> IO [ByteString]
56recvWithLength sock = recvInt32 sock >>= recvExact sock
47recvWithLength sock = recvInt32 sock >>= recvExact sock
57
48
58-- | Receive a 32-bit integer
49-- | Receive a 32-bit integer
59−recvInt32 :: (Enum a, MonadIO m, MonadPlus m) => N.Socket -> m a
50+recvInt32 :: Enum a => N.Socket -> IO a
60recvInt32 sock = do
51recvInt32 sock = do
61 mi <- liftM (decodeInt32 . BS.concat) $ recvExact sock 4
52 mi <- liftM (decodeInt32 . BS.concat) $ recvExact sock 4
62 case mi of
53 case mi of
@@ -64,26 +55,19 @@ recvInt32 sock = do
64 Just i -> return i
55 Just i -> return i
65
56
66-- | Read an exact number of bytes from a socket
57-- | Read an exact number of bytes from a socket
67−--
58+--
68−-- Fails if the socket closes prematurely or the length is non-positive
59+-- Throws an I/O exception if the socket closes before the specified
69−recvExact :: (MonadIO m, MonadPlus m)
60+-- number of bytes could be read
70− => N.Socket -- ^ Socket to read from
61+recvExact :: N.Socket -- ^ Socket to read from
71 -> Int32 -- ^ Number of bytes to read
62 -> Int32 -- ^ Number of bytes to read
72− -> m [ByteString]
63+ -> IO [ByteString]
73recvExact _ len | len <= 0 = mzero
64recvExact _ len | len <= 0 = mzero
74−recvExact sock len = do
65+recvExact sock len = go [] len
75− (socketClosed, input) <- liftIO $ go [] len
76− if socketClosed then mzero else return input
77 where
66 where
78− -- Returns input read and whether the socket closed prematurely
79− go :: [ByteString] -> Int32 -> IO (Bool, [ByteString])
67+ go :: [ByteString] -> Int32 -> IO [ByteString]
80− go acc 0 = return (False, reverse acc)
68+ go acc 0 = return (reverse acc)
81 go acc l = do
69 go acc l = do
82− bs <- catch (NBS.recv sock (fromIntegral l `min` 4096)) handleIOException
70+ bs <- NBS.recv sock (fromIntegral l `min` 4096)
83 if BS.null bs
71 if BS.null bs
84− then return (True, reverse acc)
72+ then fail "Socket closed"
85 else go (bs : acc) (l - fromIntegral (BS.length bs))
73 else go (bs : acc) (l - fromIntegral (BS.length bs))
86−
87− -- We treat an I/O exception the same way as a socket closure
88− handleIOException :: IOException -> IO ByteString
89− handleIOException _ = return BS.empty
network-transport-2/src/Network/Transport/TCP.hs+151−122
@@ -11,7 +11,6 @@ module Network.Transport.TCP ( -- * Main API
11import Network.Transport
11import Network.Transport
12import Network.Transport.Internal.TCP ( forkServer
12import Network.Transport.Internal.TCP ( forkServer
13 , recvWithLength
13 , recvWithLength
14− , sendMany
15 , recvInt32
14 , recvInt32
16 )
15 )
17import Network.Transport.Internal ( encodeInt32
16import Network.Transport.Internal ( encodeInt32
@@ -19,7 +18,8 @@ import Network.Transport.Internal ( encodeInt32
19 , prependLength
18 , prependLength
20 , failWith
19 , failWith
21 , failWithIO
20 , failWithIO
22− , failWithMaybeIO
21+ , tryIO
22+ , tlog
23 )
23 )
24import qualified Network.Socket as N ( HostName
24import qualified Network.Socket as N ( HostName
25 , ServiceName
25 , ServiceName
@@ -36,6 +36,7 @@ import qualified Network.Socket as N ( HostName
36 , SocketOption(ReuseAddr)
36 , SocketOption(ReuseAddr)
37 , connect
37 , connect
38 )
38 )
39+import Network.Socket.ByteString (sendMany)
39import Control.Concurrent (forkIO)
40import Control.Concurrent (forkIO)
40import Control.Concurrent.Chan (Chan, newChan, readChan, writeChan)
41import Control.Concurrent.Chan (Chan, newChan, readChan, writeChan)
41import Control.Concurrent.MVar ( MVar
42import Control.Concurrent.MVar ( MVar
@@ -49,22 +50,22 @@ import Control.Concurrent.MVar ( MVar
49 )
50 )
50import Control.Category ((>>>))
51import Control.Category ((>>>))
51import Control.Applicative ((<*>), (*>), (<$>))
52import Control.Applicative ((<*>), (*>), (<$>))
52−import Control.Monad (forever, forM_, void, when)
53+import Control.Monad (forever, forM_, void)
53import Control.Monad.Error (MonadError, ErrorT, liftIO, runErrorT, throwError)
54import Control.Monad.Error (MonadError, ErrorT, liftIO, runErrorT, throwError)
54−import Control.Monad.Trans.Maybe (MaybeT(MaybeT), runMaybeT)
55−import Control.Monad.Trans.Writer (WriterT, execWriterT)
56−import Control.Monad.Writer.Class (tell)
57import Control.Monad.IO.Class (MonadIO)
55import Control.Monad.IO.Class (MonadIO)
58−import Control.Exception (IOException)
56+import Control.Exception (IOException, bracket_)
59import Data.ByteString (ByteString)
57import Data.ByteString (ByteString)
60import qualified Data.ByteString as BS (concat)
58import qualified Data.ByteString as BS (concat)
61import qualified Data.ByteString.Char8 as BSC (pack, unpack)
59import qualified Data.ByteString.Char8 as BSC (pack, unpack)
62import Data.Int (Int32)
60import Data.Int (Int32)
63import Data.IntMap (IntMap)
61import Data.IntMap (IntMap)
64import qualified Data.IntMap as IntMap (empty, size)
62import qualified Data.IntMap as IntMap (empty, size)
63+import Data.IntSet (IntSet)
64+import qualified Data.IntSet as IntSet (empty, insert, delete, elems)
65import Data.Map (Map)
65import Data.Map (Map)
66import qualified Data.Map as Map (empty)
66import qualified Data.Map as Map (empty)
67+import Data.IORef (newIORef, modifyIORef, readIORef)
67−import Data.Lens.Lazy (Lens, lens, intMapLens, mapLens, (^.), (^=), (^+=))
68+import Data.Lens.Lazy (Lens, lens, intMapLens, mapLens, (^.), (^=), (^+=), (^%=), (^%%=))
68import Text.Regex.Applicative (RE, few, anySym, sym, many, match)
69import Text.Regex.Applicative (RE, few, anySym, sym, many, match)
69
70
70data TCPTransport = TCPTransport { _transportHost :: N.HostName
71data TCPTransport = TCPTransport { _transportHost :: N.HostName
@@ -72,7 +73,7 @@ data TCPTransport = TCPTransport { _transportHost :: N.HostName
72 , _transportState :: MVar TransportState
73 , _transportState :: MVar TransportState
73 }
74 }
74data TransportState = TransportState { _localEndPoints :: IntMap LocalEndPoint
75data TransportState = TransportState { _localEndPoints :: IntMap LocalEndPoint
75− , _remoteEndPoints :: Map EndPointAddress RemoteEndPoint
76+ , _remoteEndPoints :: Map EndPointAddress (RemoteEndPoint, RefCount)
76 }
77 }
77data LocalEndPoint = LocalEndPoint { _localAddress :: EndPointAddress
78data LocalEndPoint = LocalEndPoint { _localAddress :: EndPointAddress
78 , _localChannel :: Chan Event
79 , _localChannel :: Chan Event
@@ -80,8 +81,7 @@ data LocalEndPoint = LocalEndPoint { _localAddress :: EndPointAddress
80 }
81 }
81data RemoteEndPoint = RemoteEndPoint { _remoteAddress :: EndPointAddress
82data RemoteEndPoint = RemoteEndPoint { _remoteAddress :: EndPointAddress
82 , _remoteSocket :: N.Socket
83 , _remoteSocket :: N.Socket
83− , _remoteLock :: MVar ()
84+ , sendTo :: [ByteString] -> IO ()
84− , _remoteRefCount :: MVar Int
85 }
85 }
86data EndPointState = EndPointState { _nextConnectionId :: ConnectionId
86data EndPointState = EndPointState { _nextConnectionId :: ConnectionId
87 , _pendingCtrlRequests :: IntMap (MVar [ByteString])
87 , _pendingCtrlRequests :: IntMap (MVar [ByteString])
@@ -89,6 +89,7 @@ data EndPointState = EndPointState { _nextConnectionId :: ConnectionId
89 }
89 }
90type EndPointId = Int32
90type EndPointId = Int32
91type ControlRequestId = Int32
91type ControlRequestId = Int32
92+data RefCount = RefCount !Int
92
93
93-- | Create a TCP transport
94-- | Create a TCP transport
94--
95--
@@ -107,8 +108,8 @@ createTransport host port = do
107 , _transportHost = host
108 , _transportHost = host
108 , _transportPort = port
109 , _transportPort = port
109 }
110 }
110− runErrorT $ do
111+ tryIO $ do
111− failWithIO id $ forkServer host port (transportServer transport)
112+ forkServer host port (transportServer transport)
112 return Transport { newEndPoint = tcpNewEndPoint transport }
113 return Transport { newEndPoint = tcpNewEndPoint transport }
113
114
114-- | The transport server handles incoming connections for all endpoints
115-- | The transport server handles incoming connections for all endpoints
@@ -122,23 +123,34 @@ transportServer transport sock = forever $ do
122-- | Set up a new TCP connection (at the request of a remote endpoint)
123-- | Set up a new TCP connection (at the request of a remote endpoint)
123handleConnectionRequest :: TCPTransport -> N.Socket -> IO ()
124handleConnectionRequest :: TCPTransport -> N.Socket -> IO ()
124handleConnectionRequest transport sock = do
125handleConnectionRequest transport sock = do
125− request <- runMaybeT $ do
126+ request <- tryIO $ do
126 ourEndPointId <- recvInt32 sock
127 ourEndPointId <- recvInt32 sock
127 theirAddress <- EndPointAddress . BS.concat <$> recvWithLength sock
128 theirAddress <- EndPointAddress . BS.concat <$> recvWithLength sock
128− ourEndPoint <- MaybeT $ (^. localEndPointAt ourEndPointId) <$> readMVar (transport ^. transportState)
129+ ourEndPoint <- lookupEndPoint transport ourEndPointId
129 return (ourEndPoint, theirAddress)
130 return (ourEndPoint, theirAddress)
130 case request of
131 case request of
131− Just (ourEndPoint, theirAddress) -> do
132+ Right (ourEndPoint, theirAddress) -> do
132 -- Send acknowledgement
133 -- Send acknowledgement
133 sendMany sock [encodeInt32 ValidEndPoint]
134 sendMany sock [encodeInt32 ValidEndPoint]
134 -- We ignore the return value of 'forkRemoteEndPoint' here because _they_ are
135 -- We ignore the return value of 'forkRemoteEndPoint' here because _they_ are
135 -- connecting to _us_. 'forkRemoteEndPoint' will have stored the remote endpoint
136 -- connecting to _us_. 'forkRemoteEndPoint' will have stored the remote endpoint
136 -- in the transport state, however, in case _we_ later connect to _them_.
137 -- in the transport state, however, in case _we_ later connect to _them_.
137 void $ forkRemoteEndPoint transport ourEndPoint theirAddress sock
138 void $ forkRemoteEndPoint transport ourEndPoint theirAddress sock
138− Nothing ->
139+ Left _ ->
139 -- Invalid request
140 -- Invalid request
140 N.sClose sock
141 N.sClose sock
141
142
143+-- | Look up a local endpoint
144+--
145+-- Throws an I/O exception if the endpoint cannot be found (this makes it easy to integrate
146+-- this with I/O exceptions that arise from socket reads)
147+lookupEndPoint :: TCPTransport -> EndPointId -> IO LocalEndPoint
148+lookupEndPoint transport endPointId = do
149+ mep <- (^. localEndPointAt endPointId) <$> readMVar (transport ^. transportState)
150+ case mep of
151+ Nothing -> fail "Endpoint not found"
152+ Just ep -> return ep
153+
142-- | Set up a new remote endpoint (either because we connected to a
154-- | Set up a new remote endpoint (either because we connected to a
143-- new remote endpoint, or because a remote endpoint connected to us)
155-- new remote endpoint, or because a remote endpoint connected to us)
144forkRemoteEndPoint :: TCPTransport
156forkRemoteEndPoint :: TCPTransport
@@ -147,26 +159,27 @@ forkRemoteEndPoint :: TCPTransport
147 -> N.Socket
159 -> N.Socket
148 -> IO RemoteEndPoint
160 -> IO RemoteEndPoint
149forkRemoteEndPoint transport ourEndPoint theirAddress sock = do
161forkRemoteEndPoint transport ourEndPoint theirAddress sock = do
150− -- putStrLn "Creating new refcount.."
151− lock <- newMVar ()
162+ lock <- newMVar ()
152− refCount <- newMVar 0
153 let theirEndPoint = RemoteEndPoint { _remoteAddress = theirAddress
163 let theirEndPoint = RemoteEndPoint { _remoteAddress = theirAddress
154 , _remoteSocket = sock
164 , _remoteSocket = sock
155− , _remoteLock = lock
165+ , sendTo = bracket_ (takeMVar lock) (putMVar lock ())
156− , _remoteRefCount = refCount
166+ . sendMany sock
157 }
167 }
168+ modifyMVar_ (transport ^. transportState) $
158− modifyMVar_ (transport ^. transportState) $ return . (remoteEndPointAt theirAddress ^= Just theirEndPoint)
169+ return . (remoteEndPointAt theirAddress ^= Just (theirEndPoint, RefCount 0))
159 forkIO $ do
170 forkIO $ do
160− unclosedConnections <- handleIncomingMessages ourEndPoint theirEndPoint
171+ unclosedConnections <- handleIncomingMessages transport ourEndPoint theirEndPoint
172+ forM_ (map fromIntegral $ IntSet.elems unclosedConnections) $
161− forM_ unclosedConnections $ \cix -> writeChan (ourEndPoint ^. localChannel) (ConnectionClosed cix)
173+ writeChan (ourEndPoint ^. localChannel) . ConnectionClosed
162 -- TODO: should we close the socket here? (forkRemoteEndPoint gets called from multiple places)
174 -- TODO: should we close the socket here? (forkRemoteEndPoint gets called from multiple places)
163 -- TODO: and should we remove it from the transaction state?
175 -- TODO: and should we remove it from the transaction state?
164 return theirEndPoint
176 return theirEndPoint
165
177
166−-- Control headers
178+-- | Control headers
167data ControlHeader =
179data ControlHeader =
168 ValidEndPoint -- ^ Acknowledgement sent when setting up a new TCP connection
180 ValidEndPoint -- ^ Acknowledgement sent when setting up a new TCP connection
169 | RequestConnectionId -- ^ Request a new connection ID from the remote endpoint
181 | RequestConnectionId -- ^ Request a new connection ID from the remote endpoint
182+ | CloseConnection -- ^ Tell the remote endpoint we will no longer be using a connection
170 | ControlResponse -- ^ Respond to a control request _from_ the remote endpoint
183 | ControlResponse -- ^ Respond to a control request _from_ the remote endpoint
171 deriving Enum
184 deriving Enum
172
185
@@ -175,49 +188,69 @@ data ControlHeader =
175-- Returns only if the remote party closes the socket or if an error occurs.
188-- Returns only if the remote party closes the socket or if an error occurs.
176-- The return value is the list of connections that are still open (normally,
189-- The return value is the list of connections that are still open (normally,
177-- this should be an empty list).
190-- this should be an empty list).
178−handleIncomingMessages :: LocalEndPoint -> RemoteEndPoint -> IO [ConnectionId]
191+handleIncomingMessages :: TCPTransport -> LocalEndPoint -> RemoteEndPoint -> IO IntSet
179−handleIncomingMessages ourEndPoint theirEndPoint = execWriterT . runMaybeT . forever $ do
192+handleIncomingMessages transport ourEndPoint theirEndPoint = do
193+ tlog $ "Handling incoming messages from " ++ show (theirEndPoint ^. remoteAddress)
194+ -- We use an IORef rather than the state monad because when an exception occurs we
195+ -- want to know the current list of open connections
196+ openConnections <- newIORef IntSet.empty
197+
198+ let -- The main loop terminates only when an exception occurs
199+ mainLoop :: IO ()
200+ mainLoop = forever $ do
180− connId <- recvInt32 sock
201+ connId <- recvInt32 sock
181− if connId >= firstNonReservedConnectionId
202+ if connId >= firstNonReservedConnectionId
182− then readMessage connId
203+ then readMessage connId
183− else do
204+ else do
184− reqId <- recvInt32 sock
205+ reqId <- recvInt32 sock
185− case toEnum (fromIntegral connId) of
206+ case toEnum (fromIntegral connId) of
207+ ValidEndPoint -> fail "Unexpected control header"
186− RequestConnectionId -> createNewConnection reqId
208+ RequestConnectionId -> createNewConnection reqId
187− ControlResponse -> readControlResponse reqId
209+ ControlResponse -> readControlResponse reqId
188− where
210+ CloseConnection -> closeConnection reqId
189− -- A brief note on the types:
211+
190− -- These functions may fail (connection error): hence MaybeT
191− -- We also need to keep track of which connections are still open: hence WriterT
192−
193− -- Create a new connection
212+ -- Create a new connection
194− createNewConnection :: ControlRequestId -> MaybeT (WriterT [ConnectionId] IO) ()
213+ createNewConnection :: ControlRequestId -> IO ()
195− createNewConnection reqId = do
214+ createNewConnection reqId = do
215+ increaseRemoteRefCount transport theirEndPoint
196− newId <- liftIO $ getNextConnectionId ourEndPoint
216+ newId <- getNextConnectionId ourEndPoint
197− withRemoteLock theirEndPoint $
217+ sendTo theirEndPoint ( encodeInt32 ControlResponse
218+ : encodeInt32 reqId
198− sendMany sock (encodeInt32 ControlResponse : encodeInt32 reqId : prependLength [encodeInt32 newId])
219+ : prependLength [encodeInt32 newId]
220+ )
199− liftIO $ writeChan ourChannel (ConnectionOpened newId ReliableOrdered (theirEndPoint ^. remoteAddress))
221+ writeChan ourChannel (ConnectionOpened newId ReliableOrdered (theirEndPoint ^. remoteAddress))
200− -- We add the new connection ID to the list of open connections only once the
222+ -- We add the new connection ID to the list of open connections only once the
201− -- endpoint has been notified of the new connection (sendInt32 may fail)
223+ -- endpoint has been notified of the new connection (sendMany may fail)
202− tell [newId]
224+ modifyIORef openConnections (IntSet.insert (fromIntegral newId))
203−
225+
204− -- Read a control response
226+ -- Read a control response
205− readControlResponse :: ControlRequestId -> MaybeT (WriterT [ConnectionId] IO) ()
227+ readControlResponse :: ControlRequestId -> IO ()
206− readControlResponse reqId = do
228+ readControlResponse reqId = do
207− response <- recvWithLength sock
229+ response <- recvWithLength sock
208− mmvar <- liftIO $ (^. pendingCtrlRequestsAt reqId) <$> readMVar ourState
230+ mmvar <- (^. pendingCtrlRequestsAt reqId) <$> readMVar ourState
209− case mmvar of
231+ case mmvar of
210− Nothing -> return () -- Invalid request ID. TODO: We just ignore it?
232+ Nothing -> return () -- Invalid request ID. TODO: We just ignore it?
211− Just mvar -> liftIO $ putMVar mvar response
233+ Just mvar -> putMVar mvar response
212−
234+
235+ -- Close a connection (in this case the reqId is abused for the connection ID)
236+ closeConnection :: ConnectionId -> IO ()
237+ closeConnection cid = do
238+ writeChan ourChannel (ConnectionClosed cid)
239+ decreaseRemoteRefCount transport theirEndPoint
240+ modifyIORef openConnections (IntSet.delete (fromIntegral cid))
241+
213− -- Read a message and output it on the endPoint's channel
242+ -- Read a message and output it on the endPoint's channel
214− readMessage :: ConnectionId -> MaybeT (WriterT [ConnectionId] IO) ()
243+ readMessage :: ConnectionId -> IO ()
215− readMessage connId = recvWithLength sock >>= liftIO . writeChan ourChannel . Received connId
244+ readMessage connId = recvWithLength sock >>= writeChan ourChannel . Received connId
216−
245+
217− -- Breakdown of the arguments
246+ -- Breakdown of the arguments
218− ourChannel = ourEndPoint ^. localChannel
247+ ourChannel = ourEndPoint ^. localChannel
219− ourState = ourEndPoint ^. localState
248+ ourState = ourEndPoint ^. localState
220− sock = theirEndPoint ^. remoteSocket
249+ sock = theirEndPoint ^. remoteSocket
250+
251+ -- We keep handling messages until an exception occurs
252+ tryIO mainLoop
253+ readIORef openConnections
221
254
222-- | Get the next connection ID
255-- | Get the next connection ID
223getNextConnectionId :: LocalEndPoint -> IO ConnectionId
256getNextConnectionId :: LocalEndPoint -> IO ConnectionId
@@ -265,38 +298,50 @@ tcpConnect :: TCPTransport -- ^ Transport
265 -> IO (Either (FailedWith ConnectErrorCode) Connection)
298 -> IO (Either (FailedWith ConnectErrorCode) Connection)
266tcpConnect transport ourEndPoint theirAddress _ = runErrorT $ do
299tcpConnect transport ourEndPoint theirAddress _ = runErrorT $ do
267 theirEndPoint <- remoteEndPoint transport ourEndPoint theirAddress
300 theirEndPoint <- remoteEndPoint transport ourEndPoint theirAddress
301+ increaseRemoteRefCount transport theirEndPoint
268 connId <- requestNewConnection ourEndPoint theirEndPoint
302 connId <- requestNewConnection ourEndPoint theirEndPoint
269− increaseRemoteRefCount theirEndPoint
270− let sock = theirEndPoint ^. remoteSocket
271− -- TODO: should we modify send so that it returns an error when the user closes the connection?
272− return Connection { send = runErrorT .
303+ return Connection { send = tcpSend connId theirEndPoint
273− failWithIO (FailedWith SendFailed . show) .
274− withRemoteLock theirEndPoint .
275− sendMany sock .
276− (\payload -> encodeInt32 connId : prependLength payload)
277− , close = decreaseRemoteRefCount theirEndPoint
304+ , close = tcpClose transport connId theirEndPoint
278 }
305 }
279
306
307+-- | Send data across a connection
308+--
309+-- TODO: should we modify send so that it returns an error when the user closes the connection?
310+tcpSend :: ConnectionId -> RemoteEndPoint -> [ByteString] -> IO (Either (FailedWith SendErrorCode) ())
311+tcpSend connId theirEndPoint payload = runErrorT $
312+ failWithIO (FailedWith SendFailed . show) $
313+ sendTo theirEndPoint (encodeInt32 connId : prependLength payload)
314+
315+-- | Close a connection
316+--
317+-- We ignore errors during a close
318+tcpClose :: TCPTransport -> ConnectionId -> RemoteEndPoint -> IO ()
319+tcpClose transport connId theirEndPoint = void . runErrorT . failWithIO id $ do
320+ sendTo theirEndPoint [encodeInt32 CloseConnection, encodeInt32 connId]
321+ decreaseRemoteRefCount transport theirEndPoint
322+
280-- | Increase the refcount on a remote endpoint
323-- | Increase the refcount on a remote endpoint
281−increaseRemoteRefCount :: MonadIO m => RemoteEndPoint -> m ()
324+increaseRemoteRefCount :: MonadIO m => TCPTransport -> RemoteEndPoint -> m ()
282−increaseRemoteRefCount endPoint = liftIO $ do
325+increaseRemoteRefCount transport endPoint = do
283− return ()
326+ liftIO $ modifyMVar_ (transport ^. transportState) $
284−{-
327+ return . (remoteEndPointAt (endPoint ^. remoteAddress) ^%= go)
285− rc <- modifyMVar (endPoint ^. remoteRefCount) $ \rc -> return (rc + 1, rc)
328+ where
286− putStrLn $ "Increased refcount from " ++ show rc
329+ go :: Maybe (RemoteEndPoint, RefCount) -> Maybe (RemoteEndPoint, RefCount)
287−-}
330+ go (Just (ep, RefCount rc)) = (Just (ep, RefCount $ rc + 1))
288−
331+ go Nothing = Nothing
332+
289−-- | Decrease the refcount on a remote endpoint and close the socket
333+-- | Decrease the refcount on a remote endpoint and close the socket when it reaches zero.
290−-- when it reaches zero.
291−decreaseRemoteRefCount :: MonadIO m => RemoteEndPoint -> m ()
334+decreaseRemoteRefCount :: MonadIO m => TCPTransport -> RemoteEndPoint -> m ()
292−decreaseRemoteRefCount endPoint = liftIO $ do
335+decreaseRemoteRefCount transport endPoint = do
293− return ()
336+ liftIO $ modifyMVar_ (transport ^. transportState) $
294−{-
337+ (remoteEndPointAt (endPoint ^. remoteAddress) ^%%= go)
295− rc <- modifyMVar (endPoint ^. remoteRefCount) $ \rc -> return (rc - 1, rc)
338+ where
296− putStrLn $ "Reduced refcount from " ++ show rc
339+ go :: Maybe (RemoteEndPoint, RefCount) -> IO (Maybe (RemoteEndPoint, RefCount))
297− when (rc == 0) $
340+ go (Just (_, RefCount 1)) = do tlog $ "Closing socket to " ++ show (endPoint ^. remoteAddress)
298− N.sClose (endPoint ^. remoteSocket)
341+ N.sClose (endPoint ^. remoteSocket)
299−-}
342+ return Nothing
343+ go (Just (ep, RefCount rc)) = return (Just (ep, RefCount $ rc - 1))
344+ go Nothing = return Nothing
300
345
301-- | Request a new connection
346-- | Request a new connection
302requestNewConnection :: (MonadIO m, MonadError (FailedWith ConnectErrorCode) m)
347requestNewConnection :: (MonadIO m, MonadError (FailedWith ConnectErrorCode) m)
@@ -309,7 +354,7 @@ requestNewConnection ourEndPoint theirEndPoint = do
309 reqId <- modifyMVar state $ \st -> do
354 reqId <- modifyMVar state $ \st -> do
310 let reqId = st ^. nextCtrlRequestId
355 let reqId = st ^. nextCtrlRequestId
311 return ((nextCtrlRequestId ^+= 1) . (pendingCtrlRequestsAt reqId ^= Just reply) $ st, reqId)
356 return ((nextCtrlRequestId ^+= 1) . (pendingCtrlRequestsAt reqId ^= Just reply) $ st, reqId)
312− withRemoteLock theirEndPoint $ sendMany sock [encodeInt32 RequestConnectionId, encodeInt32 reqId]
357+ sendTo theirEndPoint [encodeInt32 RequestConnectionId, encodeInt32 reqId]
313 response <- decodeInt32 . BS.concat <$> takeMVar reply
358 response <- decodeInt32 . BS.concat <$> takeMVar reply
314 modifyMVar_ state $ return . (pendingCtrlRequestsAt reqId ^= Nothing)
359 modifyMVar_ state $ return . (pendingCtrlRequestsAt reqId ^= Nothing)
315 return response
360 return response
@@ -317,7 +362,6 @@ requestNewConnection ourEndPoint theirEndPoint = do
317 Nothing -> throwError (failed "Invalid integer")
362 Nothing -> throwError (failed "Invalid integer")
318 Just cid -> return cid
363 Just cid -> return cid
319 where
364 where
320− sock = theirEndPoint ^. remoteSocket
321 failed = FailedWith ConnectFailed
365 failed = FailedWith ConnectFailed
322 state = ourEndPoint ^. localState
366 state = ourEndPoint ^. localState
323
367
@@ -327,15 +371,15 @@ requestNewConnection ourEndPoint theirEndPoint = do
327remoteEndPoint :: TCPTransport
371remoteEndPoint :: TCPTransport
328 -> LocalEndPoint
372 -> LocalEndPoint
329 -> EndPointAddress
373 -> EndPointAddress
330− -> ErrorT (FailedWith ConnectErrorCode) IO RemoteEndPoint
374+ -> ErrorT (FailedWith ConnectErrorCode) IO RemoteEndPoint
331remoteEndPoint transport ourEndPoint theirAddress = do
375remoteEndPoint transport ourEndPoint theirAddress = do
332 mendpoint <- liftIO $ (^. remoteEndPointAt theirAddress) <$> readMVar (transport ^. transportState)
376 mendpoint <- liftIO $ (^. remoteEndPointAt theirAddress) <$> readMVar (transport ^. transportState)
333 case mendpoint of
377 case mendpoint of
334− Just endpoint ->
378+ Just (endpoint, _) ->
335 return endpoint
379 return endpoint
336 Nothing -> do
380 Nothing -> do
337 -- Create a new connection
381 -- Create a new connection
338− -- liftIO $ putStrLn $ "Creating socket from " ++ show ourAddress ++ " to " ++ show theirAddress
382+ liftIO . tlog $ "Creating socket from " ++ show ourAddress ++ " to " ++ show theirAddress
339 (host, port, endPointId) <- failWith (invalidAddress "Could not parse") $
383 (host, port, endPointId) <- failWith (invalidAddress "Could not parse") $
340 decodeEndPointAddress theirAddress
384 decodeEndPointAddress theirAddress
341 addr:_ <- failWithIO (invalidAddress . show) $
385 addr:_ <- failWithIO (invalidAddress . show) $
@@ -347,7 +391,9 @@ remoteEndPoint transport ourEndPoint theirAddress = do
347 -- Send the endpoint ID we're interested in and our own address
391 -- Send the endpoint ID we're interested in and our own address
348 failWithIO (failed . show) $ sendMany sock (encodeInt32 endPointId : prependLength [ourAddress])
392 failWithIO (failed . show) $ sendMany sock (encodeInt32 endPointId : prependLength [ourAddress])
349 -- For the remote endpoint to acknowledge
393 -- For the remote endpoint to acknowledge
394+ -- We fail with 'invalidAddress' here because the remote endpoint will close
395+ -- the connection if we send an invalid endpoint identifier
350− ack <- failWithMaybeIO (invalidAddress . show) $ recvInt32 sock
396+ ack <- failWithIO (invalidAddress . show) $ recvInt32 sock
351 case ack of
397 case ack of
352 ValidEndPoint -> liftIO $ forkRemoteEndPoint transport ourEndPoint theirAddress sock
398 ValidEndPoint -> liftIO $ forkRemoteEndPoint transport ourEndPoint theirAddress sock
353 _ -> throwError (invalidAddress "Unexpected response")
399 _ -> throwError (invalidAddress "Unexpected response")
@@ -357,17 +403,6 @@ remoteEndPoint transport ourEndPoint theirAddress = do
357 failed = FailedWith ConnectFailed
403 failed = FailedWith ConnectFailed
358 EndPointAddress ourAddress = ourEndPoint ^. localAddress
404 EndPointAddress ourAddress = ourEndPoint ^. localAddress
359
405
360−-- | We must avoid scrambling concurrent sends to the same endpoint
361−--
362−-- TODO: deal with exceptions
363−withRemoteLock :: MonadIO m => RemoteEndPoint -> m a -> m a
364−withRemoteLock theirEndPoint p = do
365− let lock = theirEndPoint ^. remoteLock
366− liftIO $ takeMVar lock
367− x <- p
368− liftIO $ putMVar lock ()
369− return x
370−
371-- | Decode end point address
406-- | Decode end point address
372-- TODO: This uses regular expression parsing, which is nice, but unnecessary
407-- TODO: This uses regular expression parsing, which is nice, but unnecessary
373decodeEndPointAddress :: EndPointAddress -> Maybe (N.HostName, N.ServiceName, EndPointId)
408decodeEndPointAddress :: EndPointAddress -> Maybe (N.HostName, N.ServiceName, EndPointId)
@@ -392,7 +427,7 @@ transportPort = lens _transportPort (\port trans -> trans { _transportPort = por
392localEndPoints :: Lens TransportState (IntMap LocalEndPoint)
427localEndPoints :: Lens TransportState (IntMap LocalEndPoint)
393localEndPoints = lens _localEndPoints (\es st -> st { _localEndPoints = es })
428localEndPoints = lens _localEndPoints (\es st -> st { _localEndPoints = es })
394
429
395−remoteEndPoints :: Lens TransportState (Map EndPointAddress RemoteEndPoint)
430+remoteEndPoints :: Lens TransportState (Map EndPointAddress (RemoteEndPoint, RefCount))
396remoteEndPoints = lens _remoteEndPoints (\es st -> st { _remoteEndPoints = es })
431remoteEndPoints = lens _remoteEndPoints (\es st -> st { _remoteEndPoints = es })
397
432
398localAddress :: Lens LocalEndPoint EndPointAddress
433localAddress :: Lens LocalEndPoint EndPointAddress
@@ -410,12 +445,6 @@ remoteAddress = lens _remoteAddress (\addr ep -> ep { _remoteAddress = addr })
410remoteSocket :: Lens RemoteEndPoint N.Socket
445remoteSocket :: Lens RemoteEndPoint N.Socket
411remoteSocket = lens _remoteSocket (\sock ep -> ep { _remoteSocket = sock })
446remoteSocket = lens _remoteSocket (\sock ep -> ep { _remoteSocket = sock })
412
447
413−remoteLock :: Lens RemoteEndPoint (MVar ())
414−remoteLock = lens _remoteLock (\lock ep -> ep { _remoteLock = lock })
415−
416−remoteRefCount :: Lens RemoteEndPoint (MVar Int)
417−remoteRefCount = lens _remoteRefCount (\rc ep -> ep { _remoteRefCount = rc })
418−
419nextConnectionId :: Lens EndPointState ConnectionId
448nextConnectionId :: Lens EndPointState ConnectionId
420nextConnectionId = lens _nextConnectionId (\cix st -> st { _nextConnectionId = cix })
449nextConnectionId = lens _nextConnectionId (\cix st -> st { _nextConnectionId = cix })
421
450
@@ -428,7 +457,7 @@ nextCtrlRequestId = lens _nextCtrlRequestId (\cid st -> st { _nextCtrlRequestId
428localEndPointAt :: EndPointId -> Lens TransportState (Maybe LocalEndPoint)
457localEndPointAt :: EndPointId -> Lens TransportState (Maybe LocalEndPoint)
429localEndPointAt ix = localEndPoints >>> intMapLens (fromIntegral ix)
458localEndPointAt ix = localEndPoints >>> intMapLens (fromIntegral ix)
430
459
431−remoteEndPointAt :: EndPointAddress -> Lens TransportState (Maybe RemoteEndPoint)
460+remoteEndPointAt :: EndPointAddress -> Lens TransportState (Maybe (RemoteEndPoint, RefCount))
432remoteEndPointAt addr = remoteEndPoints >>> mapLens addr
461remoteEndPointAt addr = remoteEndPoints >>> mapLens addr
433
462
434pendingCtrlRequestsAt :: ControlRequestId -> Lens EndPointState (Maybe (MVar [ByteString]))
463pendingCtrlRequestsAt :: ControlRequestId -> Lens EndPointState (Maybe (MVar [ByteString]))
network-transport-2/tests/TestTCP.hs+5−5
@@ -3,11 +3,10 @@ module Main where
3import TestTransport
3import TestTransport
4import Network.Transport
4import Network.Transport
5import Network.Transport.Internal (encodeInt32, prependLength)
5import Network.Transport.Internal (encodeInt32, prependLength)
6−import Network.Transport.Internal.TCP (recvInt32, sendMany)
6+import Network.Transport.Internal.TCP (recvInt32)
7import Network.Transport.TCP (createTransport, decodeEndPointAddress, EndPointId, ControlHeader(..))
7import Network.Transport.TCP (createTransport, decodeEndPointAddress, EndPointId, ControlHeader(..))
8import Control.Concurrent.MVar (MVar, newEmptyMVar, putMVar, takeMVar, readMVar)
8import Control.Concurrent.MVar (MVar, newEmptyMVar, putMVar, takeMVar, readMVar)
9import Control.Concurrent (forkIO)
9import Control.Concurrent (forkIO)
10−import Control.Monad.Trans.Maybe (runMaybeT)
11import Data.Maybe (fromJust)
10import Data.Maybe (fromJust)
12import Data.Int (Int32)
11import Data.Int (Int32)
13import qualified Network.Socket as N ( getAddrInfo
12import qualified Network.Socket as N ( getAddrInfo
@@ -23,6 +22,7 @@ import qualified Network.Socket as N ( getAddrInfo
23 , HostName
22 , HostName
24 , ServiceName
23 , ServiceName
25 )
24 )
25+import Network.Socket.ByteString (sendMany)
26
26
27testEarlyDisconnect :: IO ()
27testEarlyDisconnect :: IO ()
28testEarlyDisconnect = do
28testEarlyDisconnect = do
@@ -55,14 +55,14 @@ testEarlyDisconnect = do
55 N.connect sock (N.addrAddress addr)
55 N.connect sock (N.addrAddress addr)
56
56
57 (_, _, endPointIx) <- readMVar serverAddr
57 (_, _, endPointIx) <- readMVar serverAddr
58− runMaybeT $ sendMany sock (encodeInt32 endPointIx : prependLength [myAddress])
58+ sendMany sock (encodeInt32 endPointIx : prependLength [myAddress])
59
59
60 -- Wait for acknowledgement
60 -- Wait for acknowledgement
61− Just ValidEndPoint <- runMaybeT $ recvInt32 sock
61+ ValidEndPoint <- recvInt32 sock
62
62
63 -- Request a new connection, but don't wait for the response
63 -- Request a new connection, but don't wait for the response
64 let reqId = 0 :: Int32
64 let reqId = 0 :: Int32
65− runMaybeT $ sendMany sock [encodeInt32 RequestConnectionId, encodeInt32 reqId]
65+ sendMany sock [encodeInt32 RequestConnectionId, encodeInt32 reqId]
66
66
67 -- Close the socket without closing the connection explicitly
67 -- Close the socket without closing the connection explicitly
68 -- The server should still receive a ConnectionClosed message
68 -- The server should still receive a ConnectionClosed message
network-transport-2/tests/TestTransport.hs+127−28
@@ -1,28 +1,22 @@
1module TestTransport where
1module TestTransport where
2
2
3+import Prelude hiding (catch)
3import Control.Concurrent (forkIO)
4import Control.Concurrent (forkIO)
4−-- import Control.Concurrent (myThreadId)
5−import Control.Monad (replicateM, replicateM_, when)
6−import Control.Concurrent.MVar (newEmptyMVar, takeMVar, putMVar)
5+import Control.Concurrent.MVar (newEmptyMVar, takeMVar, putMVar, readMVar)
6+import Control.Monad (replicateM, replicateM_, when, guard, forM_)
7+import Control.Monad.Reader (ReaderT, runReaderT, ask)
8+import Control.Monad.IO.Class (liftIO)
9+import Control.Exception (evaluate, throw, catch, PatternMatchFail)
10+import Control.Applicative ((<$>))
7import Network.Transport
11import Network.Transport
12+import Network.Transport.Internal (tlog)
8import Data.ByteString (ByteString)
13import Data.ByteString (ByteString)
9−import Data.ByteString.Char8 ()
14+import Data.ByteString.Char8 (pack)
10import Data.Map (Map)
15import Data.Map (Map)
11−import qualified Data.Map as Map (empty, insert, delete, findWithDefault)
16+import qualified Data.Map as Map (empty, insert, delete, findWithDefault, adjust, null, toList, map)
12−import Control.Monad.Reader (ReaderT, runReaderT, ask)
13−import Control.Monad.IO.Class (liftIO)
14import System.IO (hFlush, stdout)
17import System.IO (hFlush, stdout)
15import System.Timeout (timeout)
18import System.Timeout (timeout)
16
19
17−-- Logging (for debugging)
18−tlog :: String -> IO ()
19−tlog _ = return ()
20−{-
21−tlog msg = do
22− tid <- myThreadId
23− putStrLn $ show tid ++ ": " ++ msg
24−-}
25−
26-- Server that echoes messages straight back to the origin endpoint.
20-- Server that echoes messages straight back to the origin endpoint.
27echoServer :: EndPoint -> IO ()
21echoServer :: EndPoint -> IO ()
28echoServer endpoint = do
22echoServer endpoint = do
@@ -198,60 +192,164 @@ testCloseOneDirection transport numPings = do
198
192
199 -- A
193 -- A
200 forkIO $ do
194 forkIO $ do
195+ tlog "A"
201 Right endpoint <- newEndPoint transport
196 Right endpoint <- newEndPoint transport
197+ tlog (show (address endpoint))
202 putMVar addrA (address endpoint)
198 putMVar addrA (address endpoint)
203
199
204 -- Connect to B
200 -- Connect to B
201+ tlog "Connect to B"
205− Right conn <- takeMVar addrB >>= \addr -> connect endpoint addr ReliableOrdered
202+ Right conn <- readMVar addrB >>= \addr -> connect endpoint addr ReliableOrdered
206
203
207 -- Wait for B to connect to us
204 -- Wait for B to connect to us
205+ tlog "Wait for B"
208− ConnectionOpened _ _ _ <- receive endpoint
206+ ConnectionOpened cid _ _ <- receive endpoint
209
207
210 -- Send pings to B
208 -- Send pings to B
209+ tlog "Send pings to B"
211 replicateM_ numPings $ send conn ["ping"]
210 replicateM_ numPings $ send conn ["ping"]
212
211
213 -- Close our connection to B
212 -- Close our connection to B
213+ tlog "Close connection"
214 close conn
214 close conn
215−
215+
216 -- Wait for B's pongs
216 -- Wait for B's pongs
217+ tlog "Wait for pongs from B"
217 replicateM_ numPings $ do Received _ _ <- receive endpoint ; return ()
218 replicateM_ numPings $ do Received _ _ <- receive endpoint ; return ()
218
219
219 -- Wait for B to close it's connection to us
220 -- Wait for B to close it's connection to us
220− -- TODO: this message is not yet sent
221+ tlog "Wait for B to close connection"
221− -- ConnectionClosed _ <- receive endpoint
222+ ConnectionClosed cid' <- receive endpoint
223+ guard (cid == cid')
222
224
223 -- Done
225 -- Done
226+ tlog "Done"
224 putMVar doneA ()
227 putMVar doneA ()
225
228
226 -- B
229 -- B
227 forkIO $ do
230 forkIO $ do
231+ tlog "B"
228 Right endpoint <- newEndPoint transport
232 Right endpoint <- newEndPoint transport
233+ tlog (show (address endpoint))
229 putMVar addrB (address endpoint)
234 putMVar addrB (address endpoint)
230
235
231 -- Wait for A to connect
236 -- Wait for A to connect
237+ tlog "Wait for A to connect"
232− ConnectionOpened _ _ _ <- receive endpoint
238+ ConnectionOpened cid _ _ <- receive endpoint
233
239
234 -- Connect to A
240 -- Connect to A
241+ tlog "Connect to A"
235− Right conn <- takeMVar addrA >>= \addr -> connect endpoint addr ReliableOrdered
242+ Right conn <- readMVar addrA >>= \addr -> connect endpoint addr ReliableOrdered
236
243
237 -- Wait for A's pings
244 -- Wait for A's pings
245+ tlog "Wait for pings from A"
238 replicateM_ numPings $ do Received _ _ <- receive endpoint ; return ()
246 replicateM_ numPings $ do Received _ _ <- receive endpoint ; return ()
239
247
240 -- Wait for A to close it's connection to us
248 -- Wait for A to close it's connection to us
241− -- TODO: this message is not yet sent
249+ tlog "Wait for A to close connection"
242− -- ConnectionClosed _ <- receive endpoint
250+ ConnectionClosed cid' <- receive endpoint
251+ guard (cid == cid')
243
252
244 -- Send pongs to A
253 -- Send pongs to A
254+ tlog "Send pongs to A"
245 replicateM_ numPings $ send conn ["pong"]
255 replicateM_ numPings $ send conn ["pong"]
246
256
247 -- Close our connection to A
257 -- Close our connection to A
258+ tlog "Close connection to A"
248 close conn
259 close conn
249
260
250 -- Done
261 -- Done
262+ tlog "Done"
251 putMVar doneB ()
263 putMVar doneB ()
252
264
253 mapM_ takeMVar [doneA, doneB]
265 mapM_ takeMVar [doneA, doneB]
254
266
267+expect :: EndPoint -> (Event -> Bool) -> IO ()
268+expect endpoint predicate = do
269+ event <- receive endpoint
270+ tlog $ "Got event " ++ show event
271+ mbool <- catch (Right <$> evaluate (predicate event)) (return . Left)
272+ case mbool of
273+ Left err -> do tlog $ "Unexpected event " ++ show event
274+ throw (err :: PatternMatchFail)
275+ Right False -> do tlog $ "Unexpected event " ++ show event
276+ fail "Unexpected event"
277+ _ -> return ()
278+
279+collect :: EndPoint -> Int -> IO ([(ConnectionId, [[ByteString]])])
280+collect endPoint numEvents = go numEvents (Map.empty) (Map.empty)
281+ where
282+ go 0 !open !closed = if Map.null open
283+ then return . Map.toList . Map.map reverse $ closed
284+ else fail "Open connections"
285+ go !n !open !closed = do
286+ event <- receive endPoint
287+ case event of
288+ ConnectionOpened cid _ _ ->
289+ go (n - 1) (Map.insert cid [] open) closed
290+ ConnectionClosed cid ->
291+ let list = Map.findWithDefault (error "Invalid ConnectionClosed") cid open in
292+ go (n - 1) (Map.delete cid open) (Map.insert cid list closed)
293+ Received cid msg ->
294+ go (n - 1) (Map.adjust (msg :) cid open) closed
295+ ReceivedMulticast _ _ ->
296+ fail "Unexpected multicast"
297+
298+-- Open connection, close it, then reopen it
299+-- (In the TCP transport this means the socket will be closed, then reopened)
300+--
301+-- Note that B cannot expect to receive all of A's messages on the first connection
302+-- before receiving the messages on the second connection. What might (and sometimes
303+-- does) happen is that finishes sending all of its messages on the first connection
304+-- (in the TCP transport, the first socket pair) while B is behind on reading _from_
305+-- this connection (socket pair) -- the messages are "in transit" on the network
306+-- (these tests are done on localhost, so there are in some OS buffer). Then when
307+-- A opens the second connection (socket pair) B will spawn a new thread for this
308+-- connection, and hence might start interleaving messages from the first and second
309+-- connection.
310+--
311+-- This is correct behaviour, however: the transport API guarantees reliability and
312+-- ordering _per connection_, but not _across_ connections.
313+testCloseReopen :: Transport -> Int -> IO ()
314+testCloseReopen transport numPings = do
315+ addrB <- newEmptyMVar
316+ doneB <- newEmptyMVar
317+
318+ let numRepeats = 2 :: Int
319+
320+ -- A
321+ forkIO $ do
322+ Right endpoint <- newEndPoint transport
323+
324+ forM_ [1 .. numRepeats] $ \i -> do
325+ tlog "A connecting"
326+ -- Connect to B
327+ Right conn <- readMVar addrB >>= \addr -> connect endpoint addr ReliableOrdered
328+
329+ tlog "A pinging"
330+ -- Say hi
331+ forM_ [1 .. numPings] $ \j -> send conn [pack $ "ping" ++ show i ++ "/" ++ show j]
332+
333+ tlog "A closing"
334+ -- Disconnect again
335+ close conn
336+
337+ tlog "A finishing"
338+
339+ -- B
340+ forkIO $ do
341+ Right endpoint <- newEndPoint transport
342+ putMVar addrB (address endpoint)
343+
344+ events <- collect endpoint (numRepeats * (numPings + 2))
345+
346+ forM_ (zip [1 .. numRepeats] events) $ \(i, (_, events)) -> do
347+ forM_ (zip [1 .. numPings] events) $ \(j, event) -> do
348+ guard (event == [pack $ "ping" ++ show i ++ "/" ++ show j])
349+
350+ putMVar doneB ()
351+
352+ takeMVar doneB
255
353
256runTestIO :: String -> IO () -> IO ()
354runTestIO :: String -> IO () -> IO ()
257runTestIO description test = do
355runTestIO description test = do
@@ -263,16 +361,17 @@ runTestIO description test = do
263runTest :: String -> (Transport -> Int -> IO ()) -> ReaderT (Transport, Int) IO ()
361runTest :: String -> (Transport -> Int -> IO ()) -> ReaderT (Transport, Int) IO ()
264runTest description test = do
362runTest description test = do
265 (transport, numPings) <- ask
363 (transport, numPings) <- ask
266− done <- liftIO $ timeout 5000000 $ runTestIO description (test transport numPings)
364+ done <- liftIO $ timeout 10000000 $ runTestIO description (test transport numPings)
267 case done of
365 case done of
268 Just () -> return ()
366 Just () -> return ()
269 Nothing -> error "timeout"
367 Nothing -> error "timeout"
270
368
271-- Transport tests
369-- Transport tests
272testTransport :: Transport -> IO ()
370testTransport :: Transport -> IO ()
273−testTransport transport = flip runReaderT (transport, 50000) $ do
371+testTransport transport = flip runReaderT (transport, 10000) $ do
274 runTest "PingPong" testPingPong
372 runTest "PingPong" testPingPong
275 runTest "EndPoints" testEndPoints
373 runTest "EndPoints" testEndPoints
276 runTest "Connections" testConnections
374 runTest "Connections" testConnections
277 runTest "CloseOneConnection" testCloseOneConnection
375 runTest "CloseOneConnection" testCloseOneConnection
278−-- runTest "CloseOneDirection" testCloseOneDirection
376+ runTest "CloseOneDirection" testCloseOneDirection
377+ runTest "CloseReopen" testCloseReopen