aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rw-r--r--contrib/.gitignore1
-rw-r--r--contrib/Makefile.am11
-rw-r--r--contrib/branding/logo/gnunet-logo-dark-text.svg1411
-rw-r--r--contrib/gnunet-arch-full.svg648
-rw-r--r--contrib/packages/guix/notest-guix-env.scm145
-rw-r--r--contrib/services/shepherd/ng0_wip/.gitignore1
-rw-r--r--contrib/services/shepherd/ng0_wip/00001-gnu-services-Add-gnunet-service.patch186
-rw-r--r--contrib/services/shepherd/ng0_wip/0001-gnu-services-Add-gnunet-service.patch225
-rw-r--r--contrib/services/shepherd/ng0_wip/001-gnu-services-Add-gnunet-service.patch204
-rw-r--r--contrib/services/shepherd/ng0_wip/README11
-rw-r--r--contrib/services/shepherd/ng0_wip/gnunet.scm173
-rw-r--r--contrib/services/shepherd/ng0_wip/janneke-os-modified.scm62
-rw-r--r--contrib/timeout_watchdog.c116
-rw-r--r--contrib/timeout_watchdog_w32.c191
14 files changed, 2204 insertions, 1181 deletions
diff --git a/contrib/.gitignore b/contrib/.gitignore
index 304706d7e..d6ef469ba 100644
--- a/contrib/.gitignore
+++ b/contrib/.gitignore
@@ -2,7 +2,6 @@ gnunet_janitor.py
2gnunet_pyexpect.py 2gnunet_pyexpect.py
3pydiffer.py 3pydiffer.py
4terminate.py 4terminate.py
5timeout_watchdog
6gnunet_pyexpect.py 5gnunet_pyexpect.py
7gnunet_pyexpect.pyc 6gnunet_pyexpect.pyc
8pydiffer.pyc 7pydiffer.pyc
diff --git a/contrib/Makefile.am b/contrib/Makefile.am
index 158e43998..eec3300b9 100644
--- a/contrib/Makefile.am
+++ b/contrib/Makefile.am
@@ -5,17 +5,6 @@ tap32dir = $(pkgdatadir)/openvpn-tap32/tapw32/
5 5
6tap64dir = $(pkgdatadir)/openvpn-tap32/tapw64/ 6tap64dir = $(pkgdatadir)/openvpn-tap32/tapw64/
7 7
8noinst_PROGRAMS = \
9 timeout_watchdog
10
11if !MINGW
12timeout_watchdog_SOURCES = \
13 timeout_watchdog.c
14else
15timeout_watchdog_SOURCES = \
16 timeout_watchdog_w32.c
17endif
18
19noinst_SCRIPTS = \ 8noinst_SCRIPTS = \
20 scripts/terminate.py \ 9 scripts/terminate.py \
21 scripts/pydiffer.py \ 10 scripts/pydiffer.py \
diff --git a/contrib/branding/logo/gnunet-logo-dark-text.svg b/contrib/branding/logo/gnunet-logo-dark-text.svg
new file mode 100644
index 000000000..5644e0ae7
--- /dev/null
+++ b/contrib/branding/logo/gnunet-logo-dark-text.svg
@@ -0,0 +1,1411 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<svg
3 xmlns:dc="http://purl.org/dc/elements/1.1/"
4 xmlns:cc="http://creativecommons.org/ns#"
5 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
6 xmlns:svg="http://www.w3.org/2000/svg"
7 xmlns="http://www.w3.org/2000/svg"
8 xmlns:xlink="http://www.w3.org/1999/xlink"
9 version="1.1"
10 id="svg2"
11 height="280"
12 width="320">
13 <title
14 id="title3310">logo for GNUnet</title>
15 <defs
16 id="defs4">
17 <linearGradient
18 id="gnunet">
19 <stop
20 style="stop-color:#ff0000;stop-opacity:0.58431375;"
21 offset="0"
22 id="stop9516" />
23 <stop
24 style="stop-color:#ffcc00;stop-opacity:1;"
25 offset="1"
26 id="stop9518" />
27 </linearGradient>
28 <linearGradient
29 id="linearGradient4094">
30 <stop
31 style="stop-color:#232323;stop-opacity:1;"
32 offset="0"
33 id="stop4096" />
34 <stop
35 style="stop-color:#4d4d4d;stop-opacity:1;"
36 offset="1"
37 id="stop4098" />
38 </linearGradient>
39 <linearGradient
40 id="linearGradient4014">
41 <stop
42 style="stop-color:#a0a0a0;stop-opacity:1;"
43 offset="0"
44 id="stop4016" />
45 <stop
46 style="stop-color:#ffffff;stop-opacity:1;"
47 offset="1"
48 id="stop4018" />
49 </linearGradient>
50 <linearGradient
51 id="linearGradient4678">
52 <stop
53 style="stop-color:#e5e5e5;stop-opacity:1;"
54 offset="0"
55 id="stop4680" />
56 <stop
57 style="stop-color:#d3cdcd;stop-opacity:1;"
58 offset="1"
59 id="stop4682" />
60 </linearGradient>
61 <linearGradient
62 id="linearGradient4341">
63 <stop
64 id="stop4343"
65 offset="0"
66 style="stop-color:#333333;stop-opacity:1;" />
67 <stop
68 id="stop4345"
69 offset="1"
70 style="stop-color:#484848;stop-opacity:1;" />
71 </linearGradient>
72 <linearGradient
73 id="linearGradient4696-5">
74 <stop
75 id="stop4698-6"
76 offset="0"
77 style="stop-color:#ffb638;stop-opacity:1;" />
78 <stop
79 id="stop4700-2"
80 offset="1"
81 style="stop-color:#f0ae26;stop-opacity:1;" />
82 </linearGradient>
83 <linearGradient
84 id="linearGradient4702-3-6">
85 <stop
86 id="stop4704-1"
87 offset="0"
88 style="stop-color:#ff0000;stop-opacity:0.58431375;" />
89 <stop
90 id="stop4706-8"
91 offset="1"
92 style="stop-color:#ffcc00;stop-opacity:1;" />
93 </linearGradient>
94 <color-profile
95 name="Artifex-PS-CMYK-Profile"
96 xlink:href="/usr/share/color/icc/ghostscript/ps_cmyk.icc"
97 id="color-profile27" />
98 <linearGradient
99 y2="69.791016"
100 x2="177.04297"
101 y1="63.65625"
102 x1="142.96875"
103 gradientTransform="matrix(-0.88803314,0,0,0.88803314,595.57001,1106.9291)"
104 gradientUnits="userSpaceOnUse"
105 id="linearGradient3138"
106 xlink:href="#linearGradient4702-3-6" />
107 <linearGradient
108 y2="1043.709"
109 x2="80.655251"
110 y1="1025.709"
111 x1="108.08774"
112 gradientTransform="matrix(-0.49726789,0,0,0.49726789,555.31016,722.70088)"
113 gradientUnits="userSpaceOnUse"
114 id="linearGradient3141"
115 xlink:href="#linearGradient4696-5" />
116 <linearGradient
117 y2="922.07178"
118 x2="78.000107"
119 y1="1004.8033"
120 x1="113.5146"
121 gradientTransform="matrix(0.88803314,0,0,0.88803314,415.18739,350.00262)"
122 gradientUnits="userSpaceOnUse"
123 id="linearGradient3144"
124 xlink:href="#linearGradient4702-3-6" />
125 <linearGradient
126 y2="70.667412"
127 x2="176.60477"
128 y1="63.65625"
129 x1="142.96875"
130 gradientTransform="matrix(0.88803314,0,0,0.88803314,415.2161,1106.9294)"
131 gradientUnits="userSpaceOnUse"
132 id="linearGradient3148"
133 xlink:href="#linearGradient4702-3-6" />
134 <linearGradient
135 y2="70.667412"
136 x2="176.60477"
137 y1="63.65625"
138 x1="142.96875"
139 gradientTransform="matrix(0.88803314,0,0,0.88803314,415.2161,1106.9294)"
140 gradientUnits="userSpaceOnUse"
141 id="linearGradient3780"
142 xlink:href="#linearGradient4702-3-6" />
143 <linearGradient
144 y2="922.07178"
145 x2="78.000107"
146 y1="1004.8033"
147 x1="113.5146"
148 gradientTransform="matrix(0.88803314,0,0,0.88803314,415.18739,350.00262)"
149 gradientUnits="userSpaceOnUse"
150 id="linearGradient3782"
151 xlink:href="#linearGradient4702-3-6" />
152 <linearGradient
153 y2="1043.709"
154 x2="80.655251"
155 y1="1025.709"
156 x1="108.08774"
157 gradientTransform="matrix(-0.49726789,0,0,0.49726789,555.31016,722.70088)"
158 gradientUnits="userSpaceOnUse"
159 id="linearGradient3784"
160 xlink:href="#linearGradient4696-5" />
161 <linearGradient
162 y2="69.791016"
163 x2="177.04297"
164 y1="63.65625"
165 x1="142.96875"
166 gradientTransform="matrix(-0.88803314,0,0,0.88803314,595.57001,1106.9291)"
167 gradientUnits="userSpaceOnUse"
168 id="linearGradient3786"
169 xlink:href="#linearGradient4702-3-6" />
170 <filter
171 id="filter9204"
172 style="color-interpolation-filters:sRGB">
173 <feColorMatrix
174 id="feColorMatrix9194"
175 result="colormatrix"
176 values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -0.2125 -0.7154 -0.0721 1 0 "
177 in="SourceGraphic" />
178 <feComposite
179 k1="0"
180 id="feComposite9196"
181 result="composite"
182 k4="0"
183 k3="0"
184 k2="1"
185 operator="arithmetic"
186 in2="colormatrix"
187 in="SourceGraphic" />
188 <feGaussianBlur
189 id="feGaussianBlur9198"
190 result="blur1"
191 stdDeviation="5 0.01" />
192 <feGaussianBlur
193 id="feGaussianBlur9200"
194 result="blur2"
195 stdDeviation="0.01 5"
196 in="composite" />
197 <feBlend
198 id="feBlend9202"
199 result="blend"
200 mode="darken"
201 in2="blur1"
202 in="blur2" />
203 </filter>
204 <filter
205 id="filter9330"
206 style="color-interpolation-filters:sRGB">
207 <feGaussianBlur
208 id="feGaussianBlur9328"
209 result="blur"
210 stdDeviation="2 2" />
211 </filter>
212 </defs>
213 <metadata
214 id="metadata7">
215 <rdf:RDF>
216 <cc:Work
217 rdf:about="">
218 <dc:format>image/svg+xml</dc:format>
219 <dc:type
220 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
221 <dc:title>logo for GNUnet</dc:title>
222 <dc:creator>
223 <cc:Agent>
224 <dc:title>Luis Felipe López Acevedo, Amirouche Boubekki, carlo von lynX</dc:title>
225 </cc:Agent>
226 </dc:creator>
227 <dc:rights>
228 <cc:Agent>
229 <dc:title>GNUnet e.V.</dc:title>
230 </cc:Agent>
231 </dc:rights>
232 <cc:license
233 rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
234 <dc:description />
235 </cc:Work>
236 <cc:License
237 rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
238 <cc:permits
239 rdf:resource="http://creativecommons.org/ns#Reproduction" />
240 <cc:permits
241 rdf:resource="http://creativecommons.org/ns#Distribution" />
242 <cc:requires
243 rdf:resource="http://creativecommons.org/ns#Notice" />
244 <cc:requires
245 rdf:resource="http://creativecommons.org/ns#Attribution" />
246 <cc:permits
247 rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
248 <cc:requires
249 rdf:resource="http://creativecommons.org/ns#ShareAlike" />
250 </cc:License>
251 </rdf:RDF>
252 </metadata>
253 <g
254 id="g5346"
255 style="display:none"
256 transform="translate(-387.41463,-609.81931)">
257 <text
258 xml:space="preserve"
259 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.53852463px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.03365779px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
260 x="453.95291"
261 y="869.96057"
262 id="text5344"><tspan
263 id="tspan5342"
264 x="453.95291"
265 y="869.96057"
266 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:49.33333206px;font-family:'Ubuntu Bold';-inkscape-font-specification:'Ubuntu Bold, ';fill:#ffffff;stroke-width:1.03365779px"
267 dx="0 0 0">gnu net</tspan></text>
268 </g>
269 <g
270 transform="translate(-387.41463,-609.81931)"
271 style="display:none"
272 id="g950">
273 <text
274 id="text948"
275 y="869.21057"
276 x="467.77612"
277 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.53852463px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.03365779px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
278 xml:space="preserve"><tspan
279 dx="0 -2.5 -3 0 -19.25 -2.5 -3"
280 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50.66666794px;font-family:'Anonymous Pro';-inkscape-font-specification:'Anonymous Pro Bold';fill:#ffffff;stroke-width:1.03365779px"
281 y="869.21057"
282 x="467.77612"
283 id="tspan946">gnu net</tspan></text>
284 </g>
285 <g
286 id="g941"
287 style="display:none"
288 transform="translate(0,-20)">
289 <ellipse
290 ry="17.690269"
291 rx="17.68549"
292 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#ee0000;stroke-width:1.68696308;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.97635139"
293 id="ellipse937"
294 cx="157.97346"
295 cy="180.65355" />
296 <ellipse
297 ry="17.690269"
298 rx="17.68549"
299 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#ee0000;stroke-width:1.68696308;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.97635139"
300 id="ellipse939"
301 cx="157.97346"
302 cy="111.16864" />
303 </g>
304 <g
305 transform="translate(-387.41463,-609.81931)"
306 style="display:none"
307 id="g935">
308 <g
309 aria-label="gnu net"
310 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.53852463px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.03365779px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;image-rendering:auto"
311 id="g933">
312 <path
313 d="m 423.90503,684.79003 h 22.14128 v 61.61056 q 0,11.55196 4.3855,16.04443 4.38546,4.49242 12.72857,4.49242 12.19374,0 20.00203,-9.94753 7.80828,-9.94753 7.80828,-27.48942 v -44.71046 h 22.14128 v 99.6893 h -22.14128 v -24.92231 q -3.31586,12.83553 -12.30071,20.10899 -8.98489,7.27346 -22.14132,7.27346 -15.29567,0 -23.95963,-9.94753 -8.664,-10.0545 -8.664,-30.59135 z"
314 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50.66666794px;font-family:'Anonymous Pro';-inkscape-font-specification:'Anonymous Pro Bold';fill:#ffffff;stroke-width:4.46906853px"
315 id="path925" />
316 <path
317 d="m 669.48029,784.47933 h -22.14128 v -61.50359 q 0,-11.65892 -4.3855,-16.15139 -4.38546,-4.49243 -12.72857,-4.49243 -12.30071,0 -20.10899,9.94753 -7.70132,9.94754 -7.70132,27.48947 v 44.71041 h -22.14128 v -99.6893 h 22.14128 v 25.02928 q 3.31586,-12.94249 12.30071,-20.10899 8.98489,-7.27346 22.14132,-7.27346 15.29567,0 23.95967,9.94753 8.66396,9.94753 8.66396,30.59135 z"
318 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50.66666794px;font-family:'Anonymous Pro';-inkscape-font-specification:'Anonymous Pro Bold';fill:#ffffff;stroke-width:4.46906853px"
319 id="path927" />
320 </g>
321 </g>
322 <g
323 id="g1296"
324 style="display:none"
325 transform="translate(0,-67.278107)">
326 <path
327 style="fill:none;stroke:#dddddd;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
328 d="m 62.698223,85.778107 -39.5,48.000003 v 0 l -1,2"
329 id="path1256" />
330 <path
331 style="fill:none;stroke:#dddddd;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
332 d="m 12.698223,104.77811 10,29 21,-10.5 v 0 0"
333 id="path1258" />
334 <path
335 style="display:inline;fill:none;fill-rule:evenodd;stroke:#dddddd;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
336 d="m 11.809253,105.24526 63.6227,34.91188 23.31802,-11.09978 -35.03955,28.74946 11.86161,-17.77468 -53.18435,-5.79678 40.95076,23.69646 25.32406,0.49689 24.193047,3.02495 v 48.02104 l 21.04995,-32.14943 -20.559,-15.87161 32.52749,48.02104 -8.06937,31.38386 -24.94907,-31.76198 24.94907,77.51429 22.25436,-36.69889 21.97354,37.07701 -43.59987,-0.37188 41.32877,-28.87448 22.05899,-21.17152 -19.90986,50.171 -3.71591,-29.60613 -8.57843,-31.7682 -9.69437,24.71516 54.37611,-52.19866 -24.96716,8.94671 -18.39175,19.15282 18.27579,-55.07718 25.20812,27.362 20.66591,-41.35238 -46.00204,14.12783 22.94304,-37.07431 23.05297,23.0777 31.8814,-26.48075 40.07874,-25.58708 -15.26372,39.20869 -24.69305,-13.74039 -55.05634,4.03119 79.62738,9.58108 -56.57441,12.73416"
337 id="path1260" />
338 <path
339 style="display:inline;fill:none;fill-rule:evenodd;stroke:#dddddd;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
340 d="m 98.868943,129.31358 37.045597,48.02106"
341 id="path1262" />
342 <path
343 style="display:inline;fill:none;fill-rule:evenodd;stroke:#dddddd;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
344 d="m 88.284483,158.4287 10.96248,-29.11512 12.474537,32.51819"
345 id="path1264" />
346 <path
347 style="display:inline;fill:none;fill-rule:evenodd;stroke:#dddddd;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
348 d="m 212.13974,133.78236 54.69043,-3.64603 -31.75647,27.04795"
349 id="path1266" />
350 <path
351 transform="translate(-387.41463,-542.5412)"
352 style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:#dddddd;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
353 d="m 399.11285,648.31931 50.5,-19.5 -14.05,28.1 0.925,-1.725 -5.875,11.75 -0.25,-0.75"
354 id="path1268" />
355 <path
356 transform="translate(-387.41463,-542.5412)"
357 style="display:inline;opacity:1;fill:#729fcf;fill-rule:evenodd;stroke:#dddddd;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
358 d="m 601.57854,741.42859 -2.26809,-64.28015"
359 id="path1270" />
360 <path
361 style="fill:none;stroke:#dddddd;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
362 d="m 189.57322,206.52811 -44,2.625 25.375,17.125 v 0"
363 id="path1272" />
364 <path
365 transform="translate(-387.41463,-542.5412)"
366 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#dddddd;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
367 d="m 475.69911,700.21367 24.57107,51.42411"
368 id="path1274" />
369 <path
370 transform="translate(-387.41463,-542.5412)"
371 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#dddddd;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
372 d="m 534.29164,751.63778 12.85257,40.08057"
373 id="path1276" />
374 <path
375 transform="translate(-387.41463,-542.5412)"
376 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#dddddd;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
377 d="m 525.21925,783.02162 0.37803,45.75234"
378 id="path1278" />
379 <path
380 transform="translate(-387.41463,-542.5412)"
381 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#dddddd;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
382 d="m 601.95657,742.56293 -12.09653,36.6775"
383 id="path1280" />
384 <path
385 transform="translate(-387.41463,-542.5412)"
386 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#dddddd;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
387 d="m 475.69911,700.59178 46.98395,22.0278 10.85256,28.26194"
388 id="path1282" />
389 <path
390 transform="translate(-387.41463,-542.5412)"
391 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#dddddd;stroke-width:1.58654225px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
392 d="m 589.104,778.86231 -12.85255,-66.17074 v 36.6775 z"
393 id="path1284" />
394 <path
395 transform="translate(-387.41463,-542.5412)"
396 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#dddddd;stroke-width:1.58654225px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
397 d="m 557.35064,768.27501 31.75336,10.5873"
398 id="path1286" />
399 <path
400 transform="translate(-387.41463,-542.5412)"
401 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#dddddd;stroke-width:1.58654225px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
402 d="m 500.27018,704.37298 v 48.77728 l 24.57105,30.2495 23.81505,9.45293"
403 id="path1288" />
404 <path
405 transform="translate(-387.41463,-542.5412)"
406 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#dddddd;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
407 d="m 524.46323,829.53019 44.98392,-0.37812"
408 id="path1290" />
409 <path
410 transform="translate(-387.41463,-542.5412)"
411 style="display:inline;opacity:1;fill:none;stroke:#dddddd;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
412 d="m 694.61285,647.31931 -40.285,-17.00922 -4.715,-1.99078 29,57.5 v -0.5 0 h 0.5 v 0"
413 id="path1292" />
414 <path
415 transform="translate(-387.41463,-542.5412)"
416 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#dddddd;stroke-width:1.58654225px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
417 d="m 409.92428,677.14844 54.05634,6.0499"
418 id="path1294" />
419 </g>
420 <g
421 transform="translate(0,-67.278107)"
422 style="display:none"
423 id="g1254">
424 <ellipse
425 transform="translate(-387.41463,-542.5412)"
426 ry="4.1593032"
427 rx="4.1581793"
428 cy="829.24042"
429 cx="568.98083"
430 id="ellipse1194"
431 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
432 <ellipse
433 transform="translate(-387.41463,-542.5412)"
434 ry="4.1593032"
435 rx="4.1581793"
436 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
437 id="ellipse1196"
438 cx="588.85413"
439 cy="778.67493" />
440 <ellipse
441 transform="translate(-387.41463,-542.5412)"
442 ry="4.1593032"
443 rx="4.1581793"
444 cy="740.67249"
445 cx="601.57867"
446 id="ellipse1198"
447 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
448 <ellipse
449 transform="translate(-387.41463,-542.5412)"
450 ry="4.1593032"
451 rx="4.1581793"
452 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
453 id="ellipse1200"
454 cx="525.79852"
455 cy="829.24042" />
456 <ellipse
457 transform="translate(-387.41463,-542.5412)"
458 ry="4.1593032"
459 rx="4.1581793"
460 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
461 id="ellipse1202"
462 cx="557.82654"
463 cy="768.71582" />
464 <ellipse
465 transform="translate(-387.41463,-542.5412)"
466 ry="4.1593032"
467 rx="4.1581793"
468 cy="783.02173"
469 cx="525.21936"
470 id="ellipse1204"
471 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
472 <ellipse
473 transform="translate(-387.41463,-542.5412)"
474 ry="4.1593032"
475 rx="4.1581793"
476 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
477 id="ellipse1206"
478 cx="400.09586"
479 cy="647.34271" />
480 <ellipse
481 transform="translate(-387.41463,-542.5412)"
482 ry="4.1593032"
483 rx="4.1581793"
484 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
485 id="ellipse1208"
486 cx="450.11285"
487 cy="628.31934" />
488 <ellipse
489 transform="translate(-387.41463,-542.5412)"
490 ry="4.1593032"
491 rx="4.1581793"
492 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
493 id="ellipse1210"
494 cx="622.36951"
495 cy="699.45752" />
496 <ellipse
497 transform="translate(-387.41463,-542.5412)"
498 ry="4.1593032"
499 rx="4.1581793"
500 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
501 id="ellipse1212"
502 cx="547.21771"
503 cy="792.29773" />
504 <ellipse
505 transform="translate(-387.41463,-542.5412)"
506 ry="4.1593032"
507 rx="4.1581793"
508 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
509 id="ellipse1214"
510 cx="566.20697"
511 cy="800.12549" />
512 <ellipse
513 transform="translate(-387.41463,-542.5412)"
514 ry="4.1593032"
515 rx="4.1581793"
516 cy="751.63794"
517 cx="500.64822"
518 id="ellipse1216"
519 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
520 <ellipse
521 transform="translate(-387.41463,-542.5412)"
522 ry="4.1593032"
523 rx="4.1581793"
524 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
525 id="ellipse1218"
526 cx="533.33447"
527 cy="751.72632" />
528 <ellipse
529 transform="translate(-387.41463,-542.5412)"
530 ry="4.1593032"
531 rx="4.1581793"
532 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
533 id="ellipse1220"
534 cx="450.75012"
535 cy="699.83545" />
536 <ellipse
537 transform="translate(-387.41463,-542.5412)"
538 ry="4.1593032"
539 rx="4.1581793"
540 cy="700.59174"
541 cx="476.07718"
542 id="ellipse1222"
543 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
544 <ellipse
545 transform="translate(-387.41463,-542.5412)"
546 ry="4.1593032"
547 rx="4.1581793"
548 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
549 id="ellipse1224"
550 cx="521.49146"
551 cy="719.65314" />
552 <ellipse
553 transform="translate(-387.41463,-542.5412)"
554 ry="4.1593032"
555 rx="4.1581793"
556 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
557 id="ellipse1226"
558 cx="500.6362"
559 cy="703.87305" />
560 <ellipse
561 ry="4.1593032"
562 rx="4.1581793"
563 cy="134.28851"
564 cx="211.9584"
565 id="ellipse1228"
566 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
567 <ellipse
568 transform="translate(-387.41463,-542.5412)"
569 ry="4.1593032"
570 rx="4.1581793"
571 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
572 id="ellipse1230"
573 cx="576.62964"
574 cy="713.44794" />
575 <ellipse
576 ry="4.1593032"
577 rx="4.1581793"
578 cy="123.16669"
579 cx="43.166531"
580 id="ellipse1232"
581 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
582 <ellipse
583 ry="4.1593032"
584 rx="4.1581793"
585 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
586 id="ellipse1234"
587 cx="98.865997"
588 cy="129.43542" />
589 <ellipse
590 ry="4.1593032"
591 rx="4.1581793"
592 cy="130.05022"
593 cx="267.08618"
594 id="ellipse1236"
595 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
596 <ellipse
597 transform="translate(-387.41463,-542.5412)"
598 ry="4.1593032"
599 rx="4.1581793"
600 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
601 id="ellipse1238"
602 cx="679.07196"
603 cy="686.22339" />
604 <ellipse
605 transform="translate(-387.41463,-542.5412)"
606 ry="4.1593032"
607 rx="4.1581793"
608 cy="748.99109"
609 cx="577.00763"
610 id="ellipse1240"
611 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
612 <ellipse
613 transform="translate(-387.41463,-542.5412)"
614 ry="4.1593032"
615 rx="4.1581793"
616 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
617 id="ellipse1242"
618 cx="577.00763"
619 cy="748.99109" />
620 <ellipse
621 transform="translate(-387.41463,-542.5412)"
622 ry="4.1593032"
623 rx="4.1581793"
624 cy="748.99109"
625 cx="577.07013"
626 id="ellipse1244"
627 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
628 <ellipse
629 transform="translate(0,-3e-6)"
630 ry="4.1593032"
631 rx="4.1581793"
632 cy="133.85095"
633 cx="22.887779"
634 id="ellipse1246"
635 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
636 <ellipse
637 transform="translate(-387.41463,-542.5412)"
638 ry="4.1593032"
639 rx="4.1581793"
640 cy="682.1922"
641 cx="462.47165"
642 id="ellipse1248"
643 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
644 <ellipse
645 transform="translate(-387.41463,-542.5412)"
646 ry="4.1593032"
647 rx="4.1581793"
648 cy="647.3053"
649 cx="694.58264"
650 id="ellipse1250"
651 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
652 <ellipse
653 transform="translate(-387.41463,-542.5412)"
654 ry="4.1593032"
655 rx="4.1581793"
656 style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#eeeeee;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
657 id="ellipse1252"
658 cx="649.61285"
659 cy="628.31934" />
660 </g>
661 <g
662 transform="translate(0,-67.278107)"
663 style="display:inline"
664 id="g1533">
665 <path
666 id="path1493"
667 d="m 62.698223,85.778107 -39.5,48.000003 v 0 l -1,2"
668 style="fill:none;stroke:#3399cc;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
669 <path
670 id="path1495"
671 d="m 12.698223,104.77811 10,29 21,-10.5 v 0 0"
672 style="fill:none;stroke:#3399cc;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
673 <path
674 id="path1497"
675 d="m 11.809253,105.24526 63.6227,34.91188 23.31802,-11.09978 -35.03955,28.74946 11.86161,-17.77468 -53.18435,-5.79678 40.95076,23.69646 25.32406,0.49689 24.193047,3.02495 v 48.02104 l 21.04995,-32.14943 -20.559,-15.87161 32.52749,48.02104 -8.06937,31.38386 -24.94907,-31.76198 24.94907,77.51429 22.25436,-36.69889 21.97354,37.07701 -43.59987,-0.37188 41.32877,-28.87448 22.05899,-21.17152 -19.90986,50.171 -3.71591,-29.60613 -8.57843,-31.7682 -9.69437,24.71516 54.37611,-52.19866 -24.96716,8.94671 -18.39175,19.15282 18.27579,-55.07718 25.20812,27.362 20.66591,-41.35238 -46.00204,14.12783 22.94304,-37.07431 23.05297,23.0777 31.8814,-26.48075 40.07874,-25.58708 -15.26372,39.20869 -24.69305,-13.74039 -55.05634,4.03119 79.62738,9.58108 -56.57441,12.73416"
676 style="display:inline;fill:none;fill-rule:evenodd;stroke:#3399cc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
677 <path
678 id="path1499"
679 d="m 98.868943,129.31358 37.045597,48.02106"
680 style="display:inline;fill:none;fill-rule:evenodd;stroke:#3399cc;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
681 <path
682 id="path1501"
683 d="m 88.284483,158.4287 10.96248,-29.11512 12.474537,32.51819"
684 style="display:inline;fill:none;fill-rule:evenodd;stroke:#3399cc;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
685 <path
686 id="path1503"
687 d="m 212.13974,133.78236 54.69043,-3.64603 -31.75647,27.04795"
688 style="display:inline;fill:none;fill-rule:evenodd;stroke:#3399cc;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
689 <path
690 id="path1505"
691 d="m 399.11285,648.31931 50.5,-19.5 -14.05,28.1 0.925,-1.725 -5.875,11.75 -0.25,-0.75"
692 style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:#3399cc;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
693 transform="translate(-387.41463,-542.5412)" />
694 <path
695 id="path1507"
696 d="m 601.57854,741.42859 -2.26809,-64.28015"
697 style="display:inline;opacity:1;fill:#729fcf;fill-rule:evenodd;stroke:#3399cc;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
698 transform="translate(-387.41463,-542.5412)" />
699 <path
700 id="path1509"
701 d="m 189.57322,206.52811 -44,2.625 25.375,17.125 v 0"
702 style="fill:none;stroke:#3399cc;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
703 <path
704 id="path1511"
705 d="m 475.69911,700.21367 24.57107,51.42411"
706 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#3399cc;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
707 transform="translate(-387.41463,-542.5412)" />
708 <path
709 id="path1513"
710 d="m 534.29164,751.63778 12.85257,40.08057"
711 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#3399cc;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
712 transform="translate(-387.41463,-542.5412)" />
713 <path
714 id="path1515"
715 d="m 525.21925,783.02162 0.37803,45.75234"
716 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#3399cc;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
717 transform="translate(-387.41463,-542.5412)" />
718 <path
719 id="path1517"
720 d="m 601.95657,742.56293 -12.09653,36.6775"
721 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#3399cc;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
722 transform="translate(-387.41463,-542.5412)" />
723 <path
724 id="path1519"
725 d="m 475.69911,700.59178 46.98395,22.0278 10.85256,28.26194"
726 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#3399cc;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
727 transform="translate(-387.41463,-542.5412)" />
728 <path
729 id="path1521"
730 d="m 589.104,778.86231 -12.85255,-66.17074 v 36.6775 z"
731 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#3399cc;stroke-width:1.58654225px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
732 transform="translate(-387.41463,-542.5412)" />
733 <path
734 id="path1523"
735 d="m 557.35064,768.27501 31.75336,10.5873"
736 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#3399cc;stroke-width:1.58654225px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
737 transform="translate(-387.41463,-542.5412)" />
738 <path
739 id="path1525"
740 d="m 500.27018,704.37298 v 48.77728 l 24.57105,30.2495 23.81505,9.45293"
741 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#3399cc;stroke-width:1.58654225px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
742 transform="translate(-387.41463,-542.5412)" />
743 <path
744 id="path1527"
745 d="m 524.46323,829.53019 44.98392,-0.37812"
746 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#3399cc;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
747 transform="translate(-387.41463,-542.5412)" />
748 <path
749 id="path1529"
750 d="m 694.61285,647.31931 -40.285,-17.00922 -4.715,-1.99078 29,57.5 v -0.5 0 h 0.5 v 0"
751 style="display:inline;opacity:1;fill:none;stroke:#3399cc;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
752 transform="translate(-387.41463,-542.5412)" />
753 <path
754 id="path1531"
755 d="m 409.92428,677.14844 54.05634,6.0499"
756 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#3399cc;stroke-width:1.58654225px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
757 transform="translate(-387.41463,-542.5412)" />
758 </g>
759 <g
760 id="g1491"
761 style="display:inline"
762 transform="translate(0,-67.278107)">
763 <ellipse
764 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
765 id="ellipse1431"
766 cx="568.98083"
767 cy="829.24042"
768 rx="4.1581793"
769 ry="4.1593032"
770 transform="translate(-387.41463,-542.5412)" />
771 <ellipse
772 cy="778.67493"
773 cx="588.85413"
774 id="ellipse1433"
775 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
776 rx="4.1581793"
777 ry="4.1593032"
778 transform="translate(-387.41463,-542.5412)" />
779 <ellipse
780 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
781 id="ellipse1435"
782 cx="601.57867"
783 cy="740.67249"
784 rx="4.1581793"
785 ry="4.1593032"
786 transform="translate(-387.41463,-542.5412)" />
787 <ellipse
788 cy="829.24042"
789 cx="525.79852"
790 id="ellipse1437"
791 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
792 rx="4.1581793"
793 ry="4.1593032"
794 transform="translate(-387.41463,-542.5412)" />
795 <ellipse
796 cy="768.71582"
797 cx="557.82654"
798 id="ellipse1439"
799 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
800 rx="4.1581793"
801 ry="4.1593032"
802 transform="translate(-387.41463,-542.5412)" />
803 <ellipse
804 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
805 id="ellipse1441"
806 cx="525.21936"
807 cy="783.02173"
808 rx="4.1581793"
809 ry="4.1593032"
810 transform="translate(-387.41463,-542.5412)" />
811 <ellipse
812 cy="647.34271"
813 cx="400.09586"
814 id="ellipse1443"
815 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
816 rx="4.1581793"
817 ry="4.1593032"
818 transform="translate(-387.41463,-542.5412)" />
819 <ellipse
820 cy="628.31934"
821 cx="450.11285"
822 id="ellipse1445"
823 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
824 rx="4.1581793"
825 ry="4.1593032"
826 transform="translate(-387.41463,-542.5412)" />
827 <ellipse
828 cy="699.45752"
829 cx="622.36951"
830 id="ellipse1447"
831 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
832 rx="4.1581793"
833 ry="4.1593032"
834 transform="translate(-387.41463,-542.5412)" />
835 <ellipse
836 cy="792.29773"
837 cx="547.21771"
838 id="ellipse1449"
839 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
840 rx="4.1581793"
841 ry="4.1593032"
842 transform="translate(-387.41463,-542.5412)" />
843 <ellipse
844 cy="800.12549"
845 cx="566.20697"
846 id="ellipse1451"
847 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
848 rx="4.1581793"
849 ry="4.1593032"
850 transform="translate(-387.41463,-542.5412)" />
851 <ellipse
852 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
853 id="ellipse1453"
854 cx="500.64822"
855 cy="751.63794"
856 rx="4.1581793"
857 ry="4.1593032"
858 transform="translate(-387.41463,-542.5412)" />
859 <ellipse
860 cy="751.72632"
861 cx="533.33447"
862 id="ellipse1455"
863 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
864 rx="4.1581793"
865 ry="4.1593032"
866 transform="translate(-387.41463,-542.5412)" />
867 <ellipse
868 cy="699.83545"
869 cx="450.75012"
870 id="ellipse1457"
871 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
872 rx="4.1581793"
873 ry="4.1593032"
874 transform="translate(-387.41463,-542.5412)" />
875 <ellipse
876 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
877 id="ellipse1459"
878 cx="476.07718"
879 cy="700.59174"
880 rx="4.1581793"
881 ry="4.1593032"
882 transform="translate(-387.41463,-542.5412)" />
883 <ellipse
884 cy="719.65314"
885 cx="521.49146"
886 id="ellipse1461"
887 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
888 rx="4.1581793"
889 ry="4.1593032"
890 transform="translate(-387.41463,-542.5412)" />
891 <ellipse
892 cy="703.87305"
893 cx="500.6362"
894 id="ellipse1463"
895 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
896 rx="4.1581793"
897 ry="4.1593032"
898 transform="translate(-387.41463,-542.5412)" />
899 <ellipse
900 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
901 id="ellipse1465"
902 cx="211.9584"
903 cy="134.28851"
904 rx="4.1581793"
905 ry="4.1593032" />
906 <ellipse
907 cy="713.44794"
908 cx="576.62964"
909 id="ellipse1467"
910 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
911 rx="4.1581793"
912 ry="4.1593032"
913 transform="translate(-387.41463,-542.5412)" />
914 <ellipse
915 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
916 id="ellipse1469"
917 cx="43.166531"
918 cy="123.16669"
919 rx="4.1581793"
920 ry="4.1593032" />
921 <ellipse
922 cy="129.43542"
923 cx="98.865997"
924 id="ellipse1471"
925 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
926 rx="4.1581793"
927 ry="4.1593032" />
928 <ellipse
929 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
930 id="ellipse1473"
931 cx="267.08618"
932 cy="130.05022"
933 rx="4.1581793"
934 ry="4.1593032" />
935 <ellipse
936 cy="686.22339"
937 cx="679.07196"
938 id="ellipse1475"
939 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
940 rx="4.1581793"
941 ry="4.1593032"
942 transform="translate(-387.41463,-542.5412)" />
943 <ellipse
944 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
945 id="ellipse1477"
946 cx="577.00763"
947 cy="748.99109"
948 rx="4.1581793"
949 ry="4.1593032"
950 transform="translate(-387.41463,-542.5412)" />
951 <ellipse
952 cy="748.99109"
953 cx="577.00763"
954 id="ellipse1479"
955 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
956 rx="4.1581793"
957 ry="4.1593032"
958 transform="translate(-387.41463,-542.5412)" />
959 <ellipse
960 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
961 id="ellipse1481"
962 cx="577.07013"
963 cy="748.99109"
964 rx="4.1581793"
965 ry="4.1593032"
966 transform="translate(-387.41463,-542.5412)" />
967 <ellipse
968 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
969 id="ellipse1483"
970 cx="22.887779"
971 cy="133.85095"
972 rx="4.1581793"
973 ry="4.1593032"
974 transform="translate(0,-3e-6)" />
975 <ellipse
976 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
977 id="ellipse1485"
978 cx="462.47165"
979 cy="682.1922"
980 rx="4.1581793"
981 ry="4.1593032"
982 transform="translate(-387.41463,-542.5412)" />
983 <ellipse
984 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
985 id="ellipse1487"
986 cx="694.58264"
987 cy="647.3053"
988 rx="4.1581793"
989 ry="4.1593032"
990 transform="translate(-387.41463,-542.5412)" />
991 <ellipse
992 cy="628.31934"
993 cx="649.61285"
994 id="ellipse1489"
995 style="display:inline;opacity:1;fill:#419edb;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
996 rx="4.1581793"
997 ry="4.1593032"
998 transform="translate(-387.41463,-542.5412)" />
999 </g>
1000 <g
1001 id="g1539"
1002 style="display:inline"
1003 transform="translate(0,-20)">
1004 <ellipse
1005 ry="4.1593032"
1006 rx="4.1581793"
1007 style="display:inline;opacity:1;fill:#3399cc;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1008 id="ellipse1535"
1009 cx="159.80099"
1010 cy="276.32968" />
1011 <ellipse
1012 ry="4.1593032"
1013 rx="4.1581793"
1014 style="display:inline;opacity:1;fill:#3399cc;fill-opacity:1;stroke:#3399cc;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1015 id="ellipse1537"
1016 cx="159.80099"
1017 cy="259.99252" />
1018 </g>
1019 <g
1020 transform="translate(0,-67.278107)"
1021 style="display:none"
1022 id="layer3">
1023 <path
1024 id="path5313"
1025 d="m 62.698223,85.778107 -39.5,48.000003 v 0 l -1,2"
1026 style="fill:none;stroke:#cc0000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843" />
1027 <path
1028 id="path5311"
1029 d="m 12.698223,104.77811 10,29 21,-10.5 v 0 0"
1030 style="fill:none;stroke:#cc0000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843" />
1031 <path
1032 id="path9316"
1033 d="m 11.809253,105.24526 63.6227,34.91188 23.31802,-11.09978 -35.03955,28.74946 11.86161,-17.77468 -53.18435,-5.79678 40.95076,23.69646 25.32406,0.49689 24.193047,3.02495 v 48.02104 l 21.04995,-32.14943 -20.559,-15.87161 32.52749,48.02104 -8.06937,31.38386 -24.94907,-31.76198 24.94907,77.51429 22.25436,-36.69889 21.97354,37.07701 -43.59987,-0.37188 41.32877,-28.87448 22.05899,-21.17152 -19.90986,50.171 -3.71591,-29.60613 -8.57843,-31.7682 -9.69437,24.71516 54.37611,-52.19866 -24.96716,8.94671 -18.39175,19.15282 18.27579,-55.07718 25.20812,27.362 20.66591,-41.35238 -46.00204,14.12783 22.94304,-37.07431 23.05297,23.0777 31.8814,-26.48075 40.07874,-25.58708 -15.26372,39.20869 -24.69305,-13.74039 -55.05634,4.03119 79.62738,9.58108 -56.57441,12.73416"
1034 style="display:inline;fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843" />
1035 <path
1036 id="path9318"
1037 d="m 98.868943,129.31358 37.045597,48.02106"
1038 style="display:inline;fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843" />
1039 <path
1040 id="path12058"
1041 d="m 88.284483,158.4287 10.96248,-29.11512 12.474537,32.51819"
1042 style="display:inline;fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843" />
1043 <path
1044 id="path12250"
1045 d="m 212.13974,133.78236 54.69043,-3.64603 -31.75647,27.04795"
1046 style="display:inline;fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843" />
1047 <path
1048 id="path5161"
1049 d="m 399.11285,648.31931 50.5,-19.5 -14.05,28.1 0.925,-1.725 -5.875,11.75 -0.25,-0.75"
1050 style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:#cc0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
1051 transform="translate(-387.41463,-542.5412)" />
1052 <path
1053 id="path12206"
1054 d="m 601.57854,741.42859 -2.26809,-64.28015"
1055 style="display:inline;opacity:1;fill:#729fcf;fill-rule:evenodd;stroke:#cc0000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
1056 transform="translate(-387.41463,-542.5412)" />
1057 <path
1058 id="path5331"
1059 d="m 189.57322,206.52811 -44,2.625 25.375,17.125 v 0"
1060 style="fill:none;stroke:#cc0000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843" />
1061 <path
1062 id="path9320"
1063 d="m 475.69911,700.21367 24.57107,51.42411"
1064 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
1065 transform="translate(-387.41463,-542.5412)" />
1066 <path
1067 id="path9322"
1068 d="m 534.29164,751.63778 12.85257,40.08057"
1069 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
1070 transform="translate(-387.41463,-542.5412)" />
1071 <path
1072 id="path9324"
1073 d="m 525.21925,783.02162 0.37803,45.75234"
1074 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
1075 transform="translate(-387.41463,-542.5412)" />
1076 <path
1077 id="path9326"
1078 d="m 601.95657,742.56293 -12.09653,36.6775"
1079 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
1080 transform="translate(-387.41463,-542.5412)" />
1081 <path
1082 id="path12060"
1083 d="m 475.69911,700.59178 46.98395,22.0278 10.85256,28.26194"
1084 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
1085 transform="translate(-387.41463,-542.5412)" />
1086 <path
1087 id="path12208"
1088 d="m 589.104,778.86231 -12.85255,-66.17074 v 36.6775 z"
1089 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:1.58654225px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.99607843"
1090 transform="translate(-387.41463,-542.5412)" />
1091 <path
1092 id="path12210"
1093 d="m 557.35064,768.27501 31.75336,10.5873"
1094 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:1.58654225px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.99607843"
1095 transform="translate(-387.41463,-542.5412)" />
1096 <path
1097 id="path12212"
1098 d="m 500.27018,704.37298 v 48.77728 l 24.57105,30.2495 23.81505,9.45293"
1099 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:1.58654225px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.99607843"
1100 transform="translate(-387.41463,-542.5412)" />
1101 <path
1102 id="path12216"
1103 d="m 524.46323,829.53019 44.98392,-0.37812"
1104 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
1105 transform="translate(-387.41463,-542.5412)" />
1106 <path
1107 id="path5163"
1108 d="m 694.61285,647.31931 -40.285,-17.00922 -4.715,-1.99078 29,57.5 v -0.5 0 h 0.5 v 0"
1109 style="display:inline;opacity:1;fill:none;stroke:#cc0000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99607843"
1110 transform="translate(-387.41463,-542.5412)" />
1111 <path
1112 id="path12214"
1113 d="m 409.92428,677.14844 54.05634,6.0499"
1114 style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:1.58654225px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.99607843"
1115 transform="translate(-387.41463,-542.5412)" />
1116 </g>
1117 <g
1118 id="g325"
1119 style="display:none"
1120 transform="translate(0,-67.278107)">
1121 <ellipse
1122 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1123 id="ellipse12254"
1124 cx="568.98083"
1125 cy="829.24042"
1126 rx="4.1581793"
1127 ry="4.1593032"
1128 transform="translate(-387.41463,-542.5412)" />
1129 <ellipse
1130 cy="778.67493"
1131 cx="588.85413"
1132 id="ellipse12290"
1133 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1134 rx="4.1581793"
1135 ry="4.1593032"
1136 transform="translate(-387.41463,-542.5412)" />
1137 <ellipse
1138 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1139 id="ellipse12284"
1140 cx="601.57867"
1141 cy="740.67249"
1142 rx="4.1581793"
1143 ry="4.1593032"
1144 transform="translate(-387.41463,-542.5412)" />
1145 <ellipse
1146 cy="829.24042"
1147 cx="525.79852"
1148 id="ellipse12256"
1149 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1150 rx="4.1581793"
1151 ry="4.1593032"
1152 transform="translate(-387.41463,-542.5412)" />
1153 <ellipse
1154 cy="768.71582"
1155 cx="557.82654"
1156 id="ellipse12306"
1157 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1158 rx="4.1581793"
1159 ry="4.1593032"
1160 transform="translate(-387.41463,-542.5412)" />
1161 <ellipse
1162 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1163 id="ellipse12280"
1164 cx="525.21936"
1165 cy="783.02173"
1166 rx="4.1581793"
1167 ry="4.1593032"
1168 transform="translate(-387.41463,-542.5412)" />
1169 <ellipse
1170 cy="647.34271"
1171 cx="400.09586"
1172 id="ellipse12258"
1173 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1174 rx="4.1581793"
1175 ry="4.1593032"
1176 transform="translate(-387.41463,-542.5412)" />
1177 <ellipse
1178 cy="628.31934"
1179 cx="450.11285"
1180 id="ellipse12258-3"
1181 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1182 rx="4.1581793"
1183 ry="4.1593032"
1184 transform="translate(-387.41463,-542.5412)" />
1185 <ellipse
1186 cy="699.45752"
1187 cx="622.36951"
1188 id="ellipse12294"
1189 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1190 rx="4.1581793"
1191 ry="4.1593032"
1192 transform="translate(-387.41463,-542.5412)" />
1193 <ellipse
1194 cy="792.29773"
1195 cx="547.21771"
1196 id="ellipse12252"
1197 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1198 rx="4.1581793"
1199 ry="4.1593032"
1200 transform="translate(-387.41463,-542.5412)" />
1201 <ellipse
1202 cy="800.12549"
1203 cx="566.20697"
1204 id="ellipse12282"
1205 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1206 rx="4.1581793"
1207 ry="4.1593032"
1208 transform="translate(-387.41463,-542.5412)" />
1209 <ellipse
1210 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1211 id="ellipse12276"
1212 cx="500.64822"
1213 cy="751.63794"
1214 rx="4.1581793"
1215 ry="4.1593032"
1216 transform="translate(-387.41463,-542.5412)" />
1217 <ellipse
1218 cy="751.72632"
1219 cx="533.33447"
1220 id="ellipse12278"
1221 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1222 rx="4.1581793"
1223 ry="4.1593032"
1224 transform="translate(-387.41463,-542.5412)" />
1225 <ellipse
1226 cy="699.83545"
1227 cx="450.75012"
1228 id="ellipse12262"
1229 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1230 rx="4.1581793"
1231 ry="4.1593032"
1232 transform="translate(-387.41463,-542.5412)" />
1233 <ellipse
1234 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1235 id="ellipse12268"
1236 cx="476.07718"
1237 cy="700.59174"
1238 rx="4.1581793"
1239 ry="4.1593032"
1240 transform="translate(-387.41463,-542.5412)" />
1241 <ellipse
1242 cy="719.65314"
1243 cx="521.49146"
1244 id="ellipse12270"
1245 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1246 rx="4.1581793"
1247 ry="4.1593032"
1248 transform="translate(-387.41463,-542.5412)" />
1249 <ellipse
1250 cy="703.87305"
1251 cx="500.6362"
1252 id="ellipse12274"
1253 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1254 rx="4.1581793"
1255 ry="4.1593032"
1256 transform="translate(-387.41463,-542.5412)" />
1257 <ellipse
1258 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1259 id="ellipse12292"
1260 cx="211.9584"
1261 cy="134.28851"
1262 rx="4.1581793"
1263 ry="4.1593032" />
1264 <ellipse
1265 cy="713.44794"
1266 cx="576.62964"
1267 id="ellipse12286"
1268 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1269 rx="4.1581793"
1270 ry="4.1593032"
1271 transform="translate(-387.41463,-542.5412)" />
1272 <ellipse
1273 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1274 id="ellipse12260"
1275 cx="43.166531"
1276 cy="123.16669"
1277 rx="4.1581793"
1278 ry="4.1593032" />
1279 <ellipse
1280 cy="129.43542"
1281 cx="98.865997"
1282 id="ellipse12266"
1283 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1284 rx="4.1581793"
1285 ry="4.1593032" />
1286 <ellipse
1287 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1288 id="ellipse12296"
1289 cx="267.08618"
1290 cy="130.05022"
1291 rx="4.1581793"
1292 ry="4.1593032" />
1293 <ellipse
1294 cy="686.22339"
1295 cx="679.07196"
1296 id="ellipse12298"
1297 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1298 rx="4.1581793"
1299 ry="4.1593032"
1300 transform="translate(-387.41463,-542.5412)" />
1301 <ellipse
1302 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1303 id="ellipse12288"
1304 cx="577.00763"
1305 cy="748.99109"
1306 rx="4.1581793"
1307 ry="4.1593032"
1308 transform="translate(-387.41463,-542.5412)" />
1309 <ellipse
1310 cy="748.99109"
1311 cx="577.00763"
1312 id="ellipse12302"
1313 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1314 rx="4.1581793"
1315 ry="4.1593032"
1316 transform="translate(-387.41463,-542.5412)" />
1317 <ellipse
1318 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1319 id="ellipse12304"
1320 cx="577.07013"
1321 cy="748.99109"
1322 rx="4.1581793"
1323 ry="4.1593032"
1324 transform="translate(-387.41463,-542.5412)" />
1325 <ellipse
1326 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1327 id="ellipse12264"
1328 cx="22.887779"
1329 cy="133.85095"
1330 rx="4.1581793"
1331 ry="4.1593032"
1332 transform="translate(0,-3e-6)" />
1333 <ellipse
1334 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1335 id="ellipse12272"
1336 cx="462.47165"
1337 cy="682.1922"
1338 rx="4.1581793"
1339 ry="4.1593032"
1340 transform="translate(-387.41463,-542.5412)" />
1341 <ellipse
1342 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1343 id="ellipse12300"
1344 cx="694.58264"
1345 cy="647.3053"
1346 rx="4.1581793"
1347 ry="4.1593032"
1348 transform="translate(-387.41463,-542.5412)" />
1349 <ellipse
1350 cy="628.31934"
1351 cx="649.61285"
1352 id="ellipse12258-3-0"
1353 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#cc0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
1354 rx="4.1581793"
1355 ry="4.1593032"
1356 transform="translate(-387.41463,-542.5412)" />
1357 </g>
1358 <g
1359 transform="translate(0,-20)"
1360 style="display:none"
1361 id="layer6">
1362 <ellipse
1363 cy="276.32968"
1364 cx="159.80099"
1365 id="ellipse12282-8-9-0"
1366 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#ee0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.97635139"
1367 rx="4.1581793"
1368 ry="4.1593032" />
1369 <ellipse
1370 cy="259.99252"
1371 cx="159.80099"
1372 id="ellipse12282-8-9"
1373 style="display:inline;opacity:1;fill:#ee0000;fill-opacity:1;stroke:#ee0000;stroke-width:0.39663559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.97635139"
1374 rx="4.1581793"
1375 ry="4.1593032" />
1376 </g>
1377 <g
1378 id="g975"
1379 style="display:inline"
1380 transform="translate(-387.41463,-609.81931)">
1381 <g
1382 id="text973"
1383 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.53852463px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;letter-spacing:0px;word-spacing:0px;display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.03365779px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;image-rendering:auto"
1384 aria-label="gnu net">
1385 <path
1386 id="path977"
1387 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50.66666794px;font-family:'Anonymous Pro';-inkscape-font-specification:'Anonymous Pro Bold';fill:#292929;stroke-width:1.03365779px;fill-opacity:1"
1388 d="m 489.62118,868.96318 q 0,2.375 -0.81641,4.23046 -0.81641,1.85547 -2.30078,3.14193 -1.45964,1.28646 -3.46354,1.95443 -1.97917,0.69271 -4.42839,0.69271 -6.01172,0 -10.26693,-3.63672 l 2.42448,-3.95834 q 3.53776,3.04297 7.84245,3.04297 2.64714,0 4.25521,-1.31119 1.63281,-1.28646 1.63281,-4.0573 v -2.47395 q -1.58333,1.36067 -3.04297,2.02864 -1.45963,0.64323 -3.38932,0.64323 -2.22656,0 -4.13151,-0.9401 -1.90495,-0.94011 -3.29037,-2.54818 -1.36067,-1.63281 -2.15234,-3.78516 -0.76693,-2.15234 -0.76693,-4.57682 0,-2.42448 0.76693,-4.57682 0.79167,-2.17709 2.15234,-3.76042 1.38542,-1.60807 3.29037,-2.52344 1.90495,-0.9401 4.13151,-0.9401 1.92969,0 3.4388,0.66797 1.50912,0.64323 2.99349,1.95442 v -2.07812 h 5.1211 z m -5.1211,-16.67448 q -0.91536,-1.01433 -2.375,-1.53386 -1.43489,-0.54427 -2.79557,-0.54427 -2.89453,0 -4.70052,2.02865 -1.78125,2.02864 -1.78125,5.17057 0,1.55859 0.47005,2.89453 0.49479,1.3112 1.33594,2.27604 0.86588,0.96485 2.05338,1.53386 1.21224,0.54427 2.6224,0.54427 1.36068,0 2.79557,-0.54427 1.45964,-0.56901 2.375,-1.58334 z" />
1389 <path
1390 id="path979"
1391 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50.66666794px;font-family:'Anonymous Pro';-inkscape-font-specification:'Anonymous Pro Bold';fill:#292929;stroke-width:1.03365779px;fill-opacity:1"
1392 d="m 514.82951,869.21057 h -5.12109 v -14.22526 q 0,-2.69661 -1.01433,-3.73568 -1.01432,-1.03906 -2.94401,-1.03906 -2.84505,0 -4.65104,2.30078 -1.78125,2.30078 -1.78125,6.35808 v 10.34114 h -5.12109 v -23.05729 h 5.12109 v 5.78906 q 0.76693,-2.99349 2.84505,-4.65104 2.07813,-1.68229 5.1211,-1.68229 3.53776,0 5.54166,2.30078 2.00391,2.30078 2.00391,7.07552 z" />
1393 <path
1394 id="path981"
1395 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50.66666794px;font-family:'Anonymous Pro';-inkscape-font-specification:'Anonymous Pro Bold';fill:#292929;stroke-width:1.03365779px;fill-opacity:1"
1396 d="m 518.90503,846.15328 h 5.12109 v 14.25 q 0,2.67187 1.01433,3.71094 1.01432,1.03906 2.94401,1.03906 2.82031,0 4.6263,-2.30078 1.80599,-2.30078 1.80599,-6.35807 v -10.34115 h 5.12109 v 23.05729 h -5.12109 v -5.76432 q -0.76693,2.96875 -2.84505,4.65104 -2.07813,1.68229 -5.1211,1.68229 -3.53776,0 -5.54166,-2.30078 -2.00391,-2.32552 -2.00391,-7.07552 z" />
1397 <path
1398 id="path983"
1399 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50.66666794px;font-family:'Anonymous Pro';-inkscape-font-specification:'Anonymous Pro Bold';fill:#292929;stroke-width:1.03365779px;fill-opacity:1"
1400 d="m 575.70451,869.21057 h -5.12109 v -14.22526 q 0,-2.69661 -1.01433,-3.73568 -1.01432,-1.03906 -2.94401,-1.03906 -2.84505,0 -4.65104,2.30078 -1.78125,2.30078 -1.78125,6.35808 v 10.34114 h -5.12109 v -23.05729 h 5.12109 v 5.78906 q 0.76693,-2.99349 2.84505,-4.65104 2.07813,-1.68229 5.1211,-1.68229 3.53776,0 5.54167,2.30078 2.0039,2.30078 2.0039,7.07552 z" />
1401 <path
1402 id="path985"
1403 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50.66666794px;font-family:'Anonymous Pro';-inkscape-font-specification:'Anonymous Pro Bold';fill:#292929;stroke-width:1.03365779px;fill-opacity:1"
1404 d="m 583.76832,859.63635 q 0.37109,2.375 2.2513,3.95834 1.90495,1.55859 5.09635,1.55859 2.4987,0 4.32943,-0.76693 1.85547,-0.79166 3.19141,-2.07812 l 2.62239,3.61198 q -2.22656,2.22656 -4.72526,3.04297 -2.47396,0.8164 -5.41797,0.8164 -2.67187,0 -4.97265,-0.89062 -2.30079,-0.89063 -3.98308,-2.47396 -1.68229,-1.60807 -2.64713,-3.8099 -0.94011,-2.20182 -0.94011,-4.89844 0,-2.62239 0.86589,-4.82421 0.89062,-2.22657 2.47396,-3.83464 1.60807,-1.63281 3.83463,-2.52344 2.22657,-0.91536 4.92318,-0.91536 2.79557,0 5.07161,0.96484 2.27605,0.94011 3.88412,2.7461 1.63281,1.80599 2.54818,4.42838 0.91536,2.59766 0.91536,5.88802 z m 13.53255,-4.5026 q -0.39584,-2.22656 -2.30078,-3.5625 -1.90495,-1.36068 -4.32943,-1.36068 -2.42448,0 -4.35417,1.36068 -1.92968,1.33594 -2.32552,3.5625 z" />
1405 <path
1406 id="path987"
1407 style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50.66666794px;font-family:'Anonymous Pro';-inkscape-font-specification:'Anonymous Pro Bold';fill:#292929;stroke-width:1.03365779px;fill-opacity:1"
1408 d="m 627.08081,861.86291 q -0.39583,3.63672 -2.86979,5.78907 -2.44922,2.1276 -6.13542,2.1276 -2.02864,0 -3.71094,-0.66797 -1.68229,-0.66797 -2.86979,-1.85547 -1.1875,-1.1875 -1.85547,-2.84505 -0.64322,-1.68229 -0.64322,-3.66146 v -9.97005 h -5.22006 v -4.6263 h 5.22006 v -9.22787 h 5.12109 v 9.22787 h 9.67318 v 4.6263 h -9.67318 v 9.97005 q 0,2.22657 1.08854,3.31511 1.08854,1.08854 2.86979,1.08854 2.17709,0 3.24089,-1.26172 1.0638,-1.26172 1.26172,-3.04297 z" />
1409 </g>
1410 </g>
1411</svg>
diff --git a/contrib/gnunet-arch-full.svg b/contrib/gnunet-arch-full.svg
new file mode 100644
index 000000000..766f2b855
--- /dev/null
+++ b/contrib/gnunet-arch-full.svg
@@ -0,0 +1,648 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
3 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4<!-- Generated by graphviz version 2.38.0 (20140413.2041)
5 -->
6<!-- Title: dependencies Pages: 1 -->
7<svg width="1277pt" height="836pt"
8 viewBox="0.00 0.00 1276.81 836.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 832)">
10<title>dependencies</title>
11<polygon fill="white" stroke="none" points="-4,4 -4,-832 1272.81,-832 1272.81,4 -4,4"/>
12<!-- voting -->
13<g id="node1" class="node"><title>voting</title>
14<polygon fill="none" stroke="black" points="120.944,-743.562 80,-756 39.0559,-743.562 39.0942,-723.438 120.906,-723.438 120.944,-743.562"/>
15<text text-anchor="middle" x="80" y="-734.3" font-family="Times,serif" font-size="14.00">voting</text>
16</g>
17<!-- consensus -->
18<g id="node2" class="node"><title>consensus</title>
19<ellipse fill="none" stroke="black" cx="112" cy="-594" rx="46.2923" ry="18"/>
20<text text-anchor="middle" x="112" y="-590.3" font-family="Times,serif" font-size="14.00">consensus</text>
21</g>
22<!-- voting&#45;&gt;consensus -->
23<g id="edge1" class="edge"><title>voting&#45;&gt;consensus</title>
24<path fill="none" stroke="black" d="M121.028,-728.482C145.315,-721.103 174.155,-707.724 189,-684 197.487,-670.436 196.445,-662.162 189,-648 180.933,-632.654 166.19,-620.887 151.748,-612.383"/>
25<polygon fill="black" stroke="black" points="153.308,-609.247 142.857,-607.508 149.942,-615.385 153.308,-609.247"/>
26</g>
27<!-- identity -->
28<g id="node3" class="node"><title>identity</title>
29<ellipse fill="none" stroke="black" cx="282" cy="-450" rx="37.8943" ry="18"/>
30<text text-anchor="middle" x="282" y="-446.3" font-family="Times,serif" font-size="14.00">identity</text>
31</g>
32<!-- voting&#45;&gt;identity -->
33<g id="edge2" class="edge"><title>voting&#45;&gt;identity</title>
34<path fill="none" stroke="black" d="M58.5145,-723.377C45.8789,-714.02 31.0387,-700.353 24,-684 5.02284,-639.911 -2.50901,-616.016 24,-576 46.6577,-541.798 71.8444,-557.396 109,-540 158.351,-516.894 214.207,-487.564 248.77,-469.032"/>
35<polygon fill="black" stroke="black" points="250.781,-471.924 257.931,-464.105 247.466,-465.759 250.781,-471.924"/>
36</g>
37<!-- cadet -->
38<g id="node4" class="node"><title>cadet</title>
39<ellipse fill="none" stroke="black" cx="538" cy="-450" rx="29.4969" ry="18"/>
40<text text-anchor="middle" x="538" y="-446.3" font-family="Times,serif" font-size="14.00">cadet</text>
41</g>
42<!-- voting&#45;&gt;cadet -->
43<g id="edge3" class="edge"><title>voting&#45;&gt;cadet</title>
44<path fill="none" stroke="black" d="M72.0051,-723.243C55.682,-693.149 22.8306,-620.604 57,-576 70.8829,-557.877 390.653,-484.265 500.977,-459.316"/>
45<polygon fill="black" stroke="black" points="501.999,-462.673 510.983,-457.057 500.458,-455.845 501.999,-462.673"/>
46</g>
47<!-- secretsharing -->
48<g id="node5" class="node"><title>secretsharing</title>
49<ellipse fill="none" stroke="black" cx="123" cy="-666" rx="57.3905" ry="18"/>
50<text text-anchor="middle" x="123" y="-662.3" font-family="Times,serif" font-size="14.00">secretsharing</text>
51</g>
52<!-- voting&#45;&gt;secretsharing -->
53<g id="edge4" class="edge"><title>voting&#45;&gt;secretsharing</title>
54<path fill="none" stroke="black" d="M88.4954,-723.17C93.8716,-714.418 100.986,-702.837 107.357,-692.466"/>
55<polygon fill="black" stroke="black" points="110.45,-694.117 112.702,-683.764 104.486,-690.453 110.45,-694.117"/>
56</g>
57<!-- consensus&#45;&gt;cadet -->
58<g id="edge72" class="edge"><title>consensus&#45;&gt;cadet</title>
59<path fill="none" stroke="black" d="M146.507,-581.905C153.275,-579.85 160.34,-577.79 167,-576 236.135,-557.417 256.193,-562.96 324,-540 360.547,-527.625 367.474,-519.056 403,-504 437.068,-489.562 476.509,-474.236 503.927,-463.798"/>
60<polygon fill="black" stroke="black" points="505.344,-467.004 513.453,-460.185 502.862,-460.459 505.344,-467.004"/>
61</g>
62<!-- set -->
63<g id="node24" class="node"><title>set</title>
64<ellipse fill="none" stroke="black" cx="517" cy="-522" rx="27" ry="18"/>
65<text text-anchor="middle" x="517" y="-518.3" font-family="Times,serif" font-size="14.00">set</text>
66</g>
67<!-- consensus&#45;&gt;set -->
68<g id="edge71" class="edge"><title>consensus&#45;&gt;set</title>
69<path fill="none" stroke="black" d="M145.818,-581.678C152.772,-579.596 160.083,-577.583 167,-576 182.24,-572.511 394.44,-541.075 480.815,-528.33"/>
70<polygon fill="black" stroke="black" points="481.561,-531.758 490.943,-526.837 480.539,-524.833 481.561,-531.758"/>
71</g>
72<!-- dht -->
73<g id="node7" class="node"><title>dht</title>
74<ellipse fill="none" stroke="black" cx="756" cy="-378" rx="27" ry="18"/>
75<text text-anchor="middle" x="756" y="-374.3" font-family="Times,serif" font-size="14.00">dht</text>
76</g>
77<!-- cadet&#45;&gt;dht -->
78<g id="edge51" class="edge"><title>cadet&#45;&gt;dht</title>
79<path fill="none" stroke="black" d="M563.434,-440.833C602.822,-428.186 678.592,-403.856 722.428,-389.78"/>
80<polygon fill="black" stroke="black" points="723.607,-393.078 732.058,-386.688 721.467,-386.413 723.607,-393.078"/>
81</g>
82<!-- core -->
83<g id="node8" class="node"><title>core</title>
84<ellipse fill="none" stroke="black" cx="555" cy="-234" rx="27" ry="18"/>
85<text text-anchor="middle" x="555" y="-230.3" font-family="Times,serif" font-size="14.00">core</text>
86</g>
87<!-- cadet&#45;&gt;core -->
88<g id="edge50" class="edge"><title>cadet&#45;&gt;core</title>
89<path fill="none" stroke="black" d="M539.362,-431.849C542.303,-394.832 549.266,-307.181 552.824,-262.386"/>
90<polygon fill="black" stroke="black" points="556.328,-262.478 553.631,-252.232 549.35,-261.924 556.328,-262.478"/>
91</g>
92<!-- block -->
93<g id="node11" class="node"><title>block</title>
94<polygon fill="none" stroke="black" points="429,-324 385.598,-306 429,-288 472.402,-306 429,-324"/>
95<text text-anchor="middle" x="429" y="-302.3" font-family="Times,serif" font-size="14.00">block</text>
96</g>
97<!-- cadet&#45;&gt;block -->
98<g id="edge52" class="edge"><title>cadet&#45;&gt;block</title>
99<path fill="none" stroke="blue" stroke-dasharray="1,5" d="M522.106,-434.467C511.33,-424.227 497.085,-409.913 486,-396 469.058,-374.736 452.633,-348.272 441.802,-329.75"/>
100<polygon fill="blue" stroke="blue" points="444.702,-327.773 436.674,-320.859 438.638,-331.27 444.702,-327.773"/>
101</g>
102<!-- secretsharing&#45;&gt;consensus -->
103<g id="edge5" class="edge"><title>secretsharing&#45;&gt;consensus</title>
104<path fill="none" stroke="black" d="M120.281,-647.697C119.069,-639.983 117.612,-630.712 116.261,-622.112"/>
105<polygon fill="black" stroke="black" points="119.698,-621.44 114.688,-612.104 112.783,-622.526 119.698,-621.44"/>
106</g>
107<!-- fs -->
108<g id="node6" class="node"><title>fs</title>
109<polygon fill="none" stroke="black" points="100,-527.562 73,-540 46,-527.562 46.0252,-507.438 99.9748,-507.438 100,-527.562"/>
110<text text-anchor="middle" x="73" y="-518.3" font-family="Times,serif" font-size="14.00">fs</text>
111</g>
112<!-- fs&#45;&gt;identity -->
113<g id="edge12" class="edge"><title>fs&#45;&gt;identity</title>
114<path fill="none" stroke="black" d="M100.21,-509.307C104.786,-507.46 109.507,-505.625 114,-504 164.764,-485.643 178.566,-484.387 230,-468 233.971,-466.735 238.108,-465.404 242.237,-464.067"/>
115<polygon fill="black" stroke="black" points="243.351,-467.386 251.778,-460.965 241.186,-460.729 243.351,-467.386"/>
116</g>
117<!-- fs&#45;&gt;cadet -->
118<g id="edge9" class="edge"><title>fs&#45;&gt;cadet</title>
119<path fill="none" stroke="black" d="M100.01,-516.934C178.772,-505.077 408.387,-470.512 499.803,-456.75"/>
120<polygon fill="black" stroke="black" points="500.372,-460.204 509.74,-455.254 499.33,-453.282 500.372,-460.204"/>
121</g>
122<!-- fs&#45;&gt;dht -->
123<g id="edge6" class="edge"><title>fs&#45;&gt;dht</title>
124<path fill="none" stroke="black" d="M100.081,-509.411C132.571,-495.433 183.726,-473.164 192,-468 213.144,-454.802 212.035,-441.688 235,-432 322.67,-395.017 615.27,-383.079 719.081,-379.955"/>
125<polygon fill="black" stroke="black" points="719.199,-383.453 729.093,-379.664 718.996,-376.456 719.199,-383.453"/>
126</g>
127<!-- fs&#45;&gt;core -->
128<g id="edge7" class="edge"><title>fs&#45;&gt;core</title>
129<path fill="none" stroke="black" d="M65.0877,-507.277C55.5997,-488.827 42.6595,-455.618 57,-432 93.0072,-372.699 269.007,-312.27 334,-288 397.135,-264.424 474.404,-248.714 518.841,-240.869"/>
130<polygon fill="black" stroke="black" points="519.614,-244.287 528.871,-239.134 518.42,-237.39 519.614,-244.287"/>
131</g>
132<!-- datastore -->
133<g id="node9" class="node"><title>datastore</title>
134<ellipse fill="none" stroke="black" cx="108" cy="-450" rx="42.4939" ry="18"/>
135<text text-anchor="middle" x="108" y="-446.3" font-family="Times,serif" font-size="14.00">datastore</text>
136</g>
137<!-- fs&#45;&gt;datastore -->
138<g id="edge8" class="edge"><title>fs&#45;&gt;datastore</title>
139<path fill="none" stroke="black" d="M79.9149,-507.17C84.2467,-498.507 89.9645,-487.071 95.1098,-476.78"/>
140<polygon fill="black" stroke="black" points="98.2763,-478.274 99.618,-467.764 92.0153,-475.143 98.2763,-478.274"/>
141</g>
142<!-- ats -->
143<g id="node10" class="node"><title>ats</title>
144<ellipse fill="none" stroke="black" cx="385" cy="-90" rx="27" ry="18"/>
145<text text-anchor="middle" x="385" y="-86.3" font-family="Times,serif" font-size="14.00">ats</text>
146</g>
147<!-- fs&#45;&gt;ats -->
148<g id="edge10" class="edge"><title>fs&#45;&gt;ats</title>
149<path fill="none" stroke="black" d="M60.2844,-507.296C39.3694,-483.267 0,-431.113 0,-379 0,-379 0,-379 0,-233 0,-159.097 252.872,-111.714 348.742,-96.4063"/>
150<polygon fill="black" stroke="black" points="349.504,-99.8296 358.84,-94.8203 348.418,-92.9144 349.504,-99.8296"/>
151</g>
152<!-- fs&#45;&gt;block -->
153<g id="edge11" class="edge"><title>fs&#45;&gt;block</title>
154<path fill="none" stroke="blue" stroke-dasharray="1,5" d="M99.0792,-507.426C116.81,-497.613 140.343,-483.417 159,-468 175.732,-454.174 174.815,-445.258 192,-432 259.224,-380.139 351.062,-338.689 398.245,-319.166"/>
155<polygon fill="blue" stroke="blue" points="399.679,-322.361 407.611,-315.337 397.03,-315.881 399.679,-322.361"/>
156</g>
157<!-- dht&#45;&gt;core -->
158<g id="edge42" class="edge"><title>dht&#45;&gt;core</title>
159<path fill="none" stroke="black" d="M780.722,-370.233C802.496,-362.816 832.877,-348.569 847,-324 854.974,-310.128 857.48,-300.09 847,-288 810.092,-245.421 650.341,-266.908 596,-252 592.628,-251.075 589.164,-249.944 585.745,-248.709"/>
160<polygon fill="black" stroke="black" points="586.936,-245.416 576.348,-245.037 584.388,-251.936 586.936,-245.416"/>
161</g>
162<!-- dht&#45;&gt;block -->
163<g id="edge44" class="edge"><title>dht&#45;&gt;block</title>
164<path fill="none" stroke="black" d="M730.132,-372.774C681.84,-364.697 574.817,-345.908 486,-324 478.104,-322.052 469.673,-319.694 461.782,-317.363"/>
165<polygon fill="black" stroke="black" points="462.742,-313.997 452.157,-314.456 460.718,-320.698 462.742,-313.997"/>
166</g>
167<!-- nse -->
168<g id="node27" class="node"><title>nse</title>
169<ellipse fill="none" stroke="black" cx="811" cy="-306" rx="27" ry="18"/>
170<text text-anchor="middle" x="811" y="-302.3" font-family="Times,serif" font-size="14.00">nse</text>
171</g>
172<!-- dht&#45;&gt;nse -->
173<g id="edge43" class="edge"><title>dht&#45;&gt;nse</title>
174<path fill="none" stroke="black" d="M767.934,-361.811C775.214,-352.546 784.663,-340.52 792.854,-330.094"/>
175<polygon fill="black" stroke="black" points="795.663,-332.185 799.089,-322.159 790.159,-327.86 795.663,-332.185"/>
176</g>
177<!-- datacache -->
178<g id="node28" class="node"><title>datacache</title>
179<polygon fill="none" stroke="black" points="702,-324 637.818,-306 702,-288 766.182,-306 702,-324"/>
180<text text-anchor="middle" x="702" y="-302.3" font-family="Times,serif" font-size="14.00">datacache</text>
181</g>
182<!-- dht&#45;&gt;datacache -->
183<g id="edge45" class="edge"><title>dht&#45;&gt;datacache</title>
184<path fill="none" stroke="black" d="M744.016,-361.465C736.66,-351.93 727.125,-339.57 718.998,-329.034"/>
185<polygon fill="black" stroke="black" points="721.73,-326.846 712.851,-321.066 716.187,-331.121 721.73,-326.846"/>
186</g>
187<!-- peerinfo -->
188<g id="node29" class="node"><title>peerinfo</title>
189<ellipse fill="none" stroke="black" cx="518" cy="-90" rx="40.0939" ry="18"/>
190<text text-anchor="middle" x="518" y="-86.3" font-family="Times,serif" font-size="14.00">peerinfo</text>
191</g>
192<!-- dht&#45;&gt;peerinfo -->
193<g id="edge46" class="edge"><title>dht&#45;&gt;peerinfo</title>
194<path fill="none" stroke="black" d="M728.828,-376.457C687.438,-374.282 608.033,-364.658 557,-324 495.436,-274.952 504.26,-168.494 512.535,-118.27"/>
195<polygon fill="black" stroke="black" points="516.027,-118.624 514.32,-108.168 509.133,-117.406 516.027,-118.624"/>
196</g>
197<!-- hello -->
198<g id="node30" class="node"><title>hello</title>
199<polygon fill="none" stroke="black" points="854,-36 813.614,-18 854,-3.55271e-15 894.386,-18 854,-36"/>
200<text text-anchor="middle" x="854" y="-14.3" font-family="Times,serif" font-size="14.00">hello</text>
201</g>
202<!-- dht&#45;&gt;hello -->
203<g id="edge47" class="edge"><title>dht&#45;&gt;hello</title>
204<path fill="none" stroke="black" d="M782.364,-373.864C833.24,-367.278 942.225,-350.399 968,-324 996.322,-294.992 988,-275.542 988,-235 988,-235 988,-235 988,-161 988,-99.7534 921.245,-54.2239 881.968,-32.736"/>
205<polygon fill="black" stroke="black" points="883.108,-29.3792 872.632,-27.796 879.834,-35.5665 883.108,-29.3792"/>
206</g>
207<!-- transport -->
208<g id="node33" class="node"><title>transport</title>
209<ellipse fill="none" stroke="black" cx="680" cy="-162" rx="42.4939" ry="18"/>
210<text text-anchor="middle" x="680" y="-158.3" font-family="Times,serif" font-size="14.00">transport</text>
211</g>
212<!-- core&#45;&gt;transport -->
213<g id="edge58" class="edge"><title>core&#45;&gt;transport</title>
214<path fill="none" stroke="black" d="M575.083,-221.753C594.251,-211.02 623.495,-194.643 646.244,-181.903"/>
215<polygon fill="black" stroke="black" points="648.219,-184.809 655.234,-176.869 644.799,-178.701 648.219,-184.809"/>
216</g>
217<!-- exit -->
218<g id="node12" class="node"><title>exit</title>
219<polygon fill="none" stroke="black" points="952,-540 898,-540 898,-504 952,-504 952,-540"/>
220<text text-anchor="middle" x="925" y="-518.3" font-family="Times,serif" font-size="14.00">exit</text>
221</g>
222<!-- exit&#45;&gt;cadet -->
223<g id="edge13" class="edge"><title>exit&#45;&gt;cadet</title>
224<path fill="none" stroke="black" d="M897.67,-514.323C883.742,-511.021 866.513,-507.093 851,-504 752.337,-484.331 635.236,-465.765 576.155,-456.729"/>
225<polygon fill="black" stroke="black" points="576.571,-453.252 566.158,-455.206 575.517,-460.172 576.571,-453.252"/>
226</g>
227<!-- tun -->
228<g id="node13" class="node"><title>tun</title>
229<polygon fill="none" stroke="black" points="929,-468 897.995,-450 929,-432 960.005,-450 929,-468"/>
230<text text-anchor="middle" x="929" y="-446.3" font-family="Times,serif" font-size="14.00">tun</text>
231</g>
232<!-- exit&#45;&gt;tun -->
233<g id="edge14" class="edge"><title>exit&#45;&gt;tun</title>
234<path fill="none" stroke="black" d="M925.989,-503.697C926.436,-495.868 926.975,-486.435 927.473,-477.728"/>
235<polygon fill="black" stroke="black" points="930.974,-477.806 928.05,-467.622 923.985,-477.406 930.974,-477.806"/>
236</g>
237<!-- dnsstub -->
238<g id="node14" class="node"><title>dnsstub</title>
239<polygon fill="none" stroke="black" points="1032,-468 978.877,-450 1032,-432 1085.12,-450 1032,-468"/>
240<text text-anchor="middle" x="1032" y="-446.3" font-family="Times,serif" font-size="14.00">dnsstub</text>
241</g>
242<!-- exit&#45;&gt;dnsstub -->
243<g id="edge15" class="edge"><title>exit&#45;&gt;dnsstub</title>
244<path fill="none" stroke="black" d="M951.175,-503.876C967.88,-492.948 989.443,-478.841 1006.1,-467.947"/>
245<polygon fill="black" stroke="black" points="1008.33,-470.67 1014.78,-462.266 1004.49,-464.812 1008.33,-470.67"/>
246</g>
247<!-- vpn -->
248<g id="node15" class="node"><title>vpn</title>
249<ellipse fill="none" stroke="black" cx="815" cy="-522" rx="27" ry="18"/>
250<text text-anchor="middle" x="815" y="-518.3" font-family="Times,serif" font-size="14.00">vpn</text>
251</g>
252<!-- vpn&#45;&gt;cadet -->
253<g id="edge16" class="edge"><title>vpn&#45;&gt;cadet</title>
254<path fill="none" stroke="black" d="M793.129,-511.116C787.017,-508.578 780.317,-506.003 774,-504 705.524,-482.293 623.185,-465.931 576.085,-457.463"/>
255<polygon fill="black" stroke="black" points="576.482,-453.979 566.025,-455.678 575.26,-460.871 576.482,-453.979"/>
256</g>
257<!-- vpn&#45;&gt;tun -->
258<g id="edge18" class="edge"><title>vpn&#45;&gt;tun</title>
259<path fill="none" stroke="black" d="M834.339,-509.125C854.149,-496.961 884.945,-478.051 905.995,-465.126"/>
260<polygon fill="black" stroke="black" points="907.942,-468.038 914.632,-459.822 904.279,-462.072 907.942,-468.038"/>
261</g>
262<!-- regex -->
263<g id="node16" class="node"><title>regex</title>
264<ellipse fill="none" stroke="black" cx="756" cy="-450" rx="30.5947" ry="18"/>
265<text text-anchor="middle" x="756" y="-446.3" font-family="Times,serif" font-size="14.00">regex</text>
266</g>
267<!-- vpn&#45;&gt;regex -->
268<g id="edge17" class="edge"><title>vpn&#45;&gt;regex</title>
269<path fill="none" stroke="black" d="M802.198,-505.811C794.496,-496.673 784.53,-484.849 775.827,-474.524"/>
270<polygon fill="black" stroke="black" points="778.307,-472.035 769.186,-466.644 772.954,-476.546 778.307,-472.035"/>
271</g>
272<!-- regex&#45;&gt;dht -->
273<g id="edge57" class="edge"><title>regex&#45;&gt;dht</title>
274<path fill="none" stroke="black" d="M756,-431.697C756,-423.983 756,-414.712 756,-406.112"/>
275<polygon fill="black" stroke="black" points="759.5,-406.104 756,-396.104 752.5,-406.104 759.5,-406.104"/>
276</g>
277<!-- regex&#45;&gt;block -->
278<g id="edge49" class="edge"><title>regex&#45;&gt;block</title>
279<path fill="none" stroke="blue" stroke-dasharray="1,5" d="M732.22,-438.673C673.767,-413.29 523.157,-347.888 458.838,-319.957"/>
280<polygon fill="blue" stroke="blue" points="459.85,-316.581 449.283,-315.808 457.061,-323.002 459.85,-316.581"/>
281</g>
282<!-- pt -->
283<g id="node17" class="node"><title>pt</title>
284<polygon fill="none" stroke="black" points="986,-599.562 959,-612 932,-599.562 932.025,-579.438 985.975,-579.438 986,-599.562"/>
285<text text-anchor="middle" x="959" y="-590.3" font-family="Times,serif" font-size="14.00">pt</text>
286</g>
287<!-- pt&#45;&gt;cadet -->
288<g id="edge19" class="edge"><title>pt&#45;&gt;cadet</title>
289<path fill="none" stroke="black" d="M931.717,-579.439C928.807,-578.197 925.864,-577.023 923,-576 860.875,-553.809 836.841,-571.725 779,-540 758.602,-528.812 761.339,-515.294 741,-504 688.34,-474.76 619.008,-461.18 576.516,-455.23"/>
290<polygon fill="black" stroke="black" points="576.951,-451.758 566.577,-453.91 576.029,-458.697 576.951,-451.758"/>
291</g>
292<!-- pt&#45;&gt;vpn -->
293<g id="edge20" class="edge"><title>pt&#45;&gt;vpn</title>
294<path fill="none" stroke="black" d="M931.915,-579.834C907.352,-567.894 871.179,-550.309 845.585,-537.868"/>
295<polygon fill="black" stroke="black" points="846.864,-534.598 836.34,-533.373 843.803,-540.893 846.864,-534.598"/>
296</g>
297<!-- dns -->
298<g id="node18" class="node"><title>dns</title>
299<ellipse fill="none" stroke="black" cx="997" cy="-522" rx="27" ry="18"/>
300<text text-anchor="middle" x="997" y="-518.3" font-family="Times,serif" font-size="14.00">dns</text>
301</g>
302<!-- pt&#45;&gt;dns -->
303<g id="edge21" class="edge"><title>pt&#45;&gt;dns</title>
304<path fill="none" stroke="black" d="M966.508,-579.17C971.277,-570.385 977.594,-558.748 983.241,-548.346"/>
305<polygon fill="black" stroke="black" points="986.48,-549.716 988.175,-539.257 980.328,-546.376 986.48,-549.716"/>
306</g>
307<!-- dnsparser -->
308<g id="node19" class="node"><title>dnsparser</title>
309<polygon fill="none" stroke="black" points="1143,-540 1080.49,-522 1143,-504 1205.51,-522 1143,-540"/>
310<text text-anchor="middle" x="1143" y="-518.3" font-family="Times,serif" font-size="14.00">dnsparser</text>
311</g>
312<!-- pt&#45;&gt;dnsparser -->
313<g id="edge22" class="edge"><title>pt&#45;&gt;dnsparser</title>
314<path fill="none" stroke="black" d="M986.15,-582.671C1018.5,-570.365 1072.61,-549.781 1108.05,-536.296"/>
315<polygon fill="black" stroke="black" points="1109.42,-539.521 1117.52,-532.694 1106.93,-532.979 1109.42,-539.521"/>
316</g>
317<!-- dns&#45;&gt;tun -->
318<g id="edge23" class="edge"><title>dns&#45;&gt;tun</title>
319<path fill="none" stroke="black" d="M982.91,-506.496C972.543,-495.824 958.362,-481.226 947.147,-469.681"/>
320<polygon fill="black" stroke="black" points="949.418,-466.995 939.94,-462.261 944.397,-471.873 949.418,-466.995"/>
321</g>
322<!-- dns&#45;&gt;dnsstub -->
323<g id="edge24" class="edge"><title>dns&#45;&gt;dnsstub</title>
324<path fill="none" stroke="black" d="M1005.12,-504.765C1009.59,-495.828 1015.21,-484.573 1020.16,-474.673"/>
325<polygon fill="black" stroke="black" points="1023.3,-476.227 1024.64,-465.717 1017.04,-473.096 1023.3,-476.227"/>
326</g>
327<!-- gnsrecord -->
328<g id="node25" class="node"><title>gnsrecord</title>
329<ellipse fill="none" stroke="black" cx="1192" cy="-450" rx="45.4919" ry="18"/>
330<text text-anchor="middle" x="1192" y="-446.3" font-family="Times,serif" font-size="14.00">gnsrecord</text>
331</g>
332<!-- dnsparser&#45;&gt;gnsrecord -->
333<g id="edge39" class="edge"><title>dnsparser&#45;&gt;gnsrecord</title>
334<path fill="none" stroke="blue" stroke-dasharray="1,5" d="M1152.92,-506.834C1159.12,-497.971 1167.29,-486.304 1174.55,-475.928"/>
335<polygon fill="blue" stroke="blue" points="1177.51,-477.805 1180.38,-467.606 1171.77,-473.791 1177.51,-477.805"/>
336</g>
337<!-- zonemaster -->
338<g id="node20" class="node"><title>zonemaster</title>
339<polygon fill="none" stroke="black" points="914.433,-599.562 851,-612 787.567,-599.562 787.626,-579.438 914.374,-579.438 914.433,-599.562"/>
340<text text-anchor="middle" x="851" y="-590.3" font-family="Times,serif" font-size="14.00">zonemaster</text>
341</g>
342<!-- zonemaster&#45;&gt;dht -->
343<g id="edge26" class="edge"><title>zonemaster&#45;&gt;dht</title>
344<path fill="none" stroke="black" d="M853.642,-579.298C856.499,-561.438 859.583,-529.479 851,-504 836.849,-461.994 802.343,-422.916 779.052,-399.996"/>
345<polygon fill="black" stroke="black" points="781.264,-397.267 771.628,-392.861 776.413,-402.314 781.264,-397.267"/>
346</g>
347<!-- namestore -->
348<g id="node21" class="node"><title>namestore</title>
349<ellipse fill="none" stroke="black" cx="685" cy="-522" rx="47.3916" ry="18"/>
350<text text-anchor="middle" x="685" y="-518.3" font-family="Times,serif" font-size="14.00">namestore</text>
351</g>
352<!-- zonemaster&#45;&gt;namestore -->
353<g id="edge25" class="edge"><title>zonemaster&#45;&gt;namestore</title>
354<path fill="none" stroke="black" d="M818.599,-579.337C791.812,-568.041 753.653,-551.95 724.971,-539.855"/>
355<polygon fill="black" stroke="black" points="726.212,-536.58 715.637,-535.919 723.492,-543.03 726.212,-536.58"/>
356</g>
357<!-- namestore&#45;&gt;identity -->
358<g id="edge37" class="edge"><title>namestore&#45;&gt;identity</title>
359<path fill="none" stroke="black" d="M642.634,-513.641C566.046,-500.338 405.247,-472.408 326.867,-458.793"/>
360<polygon fill="black" stroke="black" points="327.275,-455.312 316.823,-457.049 326.077,-462.208 327.275,-455.312"/>
361</g>
362<!-- namestore&#45;&gt;gnsrecord -->
363<g id="edge38" class="edge"><title>namestore&#45;&gt;gnsrecord</title>
364<path fill="none" stroke="black" d="M726.085,-512.971C742.503,-509.919 761.609,-506.564 779,-504 918.405,-483.451 954.522,-488.05 1094,-468 1109.42,-465.784 1126.13,-463.019 1141.32,-460.368"/>
365<polygon fill="black" stroke="black" points="1142.32,-463.746 1151.56,-458.558 1141.1,-456.853 1142.32,-463.746"/>
366</g>
367<!-- gns -->
368<g id="node22" class="node"><title>gns</title>
369<ellipse fill="none" stroke="black" cx="850" cy="-666" rx="27" ry="18"/>
370<text text-anchor="middle" x="850" y="-662.3" font-family="Times,serif" font-size="14.00">gns</text>
371</g>
372<!-- gns&#45;&gt;identity -->
373<g id="edge34" class="edge"><title>gns&#45;&gt;identity</title>
374<path fill="none" stroke="black" d="M823.048,-663.899C740.091,-660.169 489.801,-646.281 417,-612 395.952,-602.089 396.543,-591.28 379,-576 359.686,-559.178 350.742,-559.383 334,-540 317.464,-520.856 303.335,-495.717 293.996,-477.041"/>
375<polygon fill="black" stroke="black" points="297.085,-475.39 289.562,-467.93 290.791,-478.453 297.085,-475.39"/>
376</g>
377<!-- gns&#45;&gt;dht -->
378<g id="edge28" class="edge"><title>gns&#45;&gt;dht</title>
379<path fill="none" stroke="black" d="M870.511,-653.985C875.467,-651.699 880.829,-649.525 886,-648 1002.11,-613.746 1046.93,-664.524 1156,-612 1236.59,-573.194 1305.75,-498.559 1246,-432 1215.85,-398.416 902.601,-384.19 793.343,-380.225"/>
380<polygon fill="black" stroke="black" points="793.243,-376.719 783.125,-379.863 792.995,-383.715 793.243,-376.719"/>
381</g>
382<!-- gns&#45;&gt;block -->
383<g id="edge29" class="edge"><title>gns&#45;&gt;block</title>
384<path fill="none" stroke="blue" stroke-dasharray="1,5" d="M822.824,-664.872C770.707,-663.582 654.321,-655.598 569,-612 548.284,-601.414 548.925,-590.83 531,-576 509.902,-558.544 496.079,-562.857 481,-540 438.212,-475.142 430.206,-380.324 428.985,-334.208"/>
385<polygon fill="blue" stroke="blue" points="432.483,-334.033 428.808,-324.096 425.484,-334.156 432.483,-334.033"/>
386</g>
387<!-- gns&#45;&gt;dnsstub -->
388<g id="edge33" class="edge"><title>gns&#45;&gt;dnsstub</title>
389<path fill="none" stroke="black" d="M871.065,-654.325C875.905,-652.077 881.078,-649.834 886,-648 941.778,-627.217 973.486,-654.658 1015,-612 1049.82,-576.222 1044.5,-512.583 1037.99,-476.971"/>
390<polygon fill="black" stroke="black" points="1041.36,-476 1035.97,-466.88 1034.5,-477.373 1041.36,-476"/>
391</g>
392<!-- gns&#45;&gt;vpn -->
393<g id="edge31" class="edge"><title>gns&#45;&gt;vpn</title>
394<path fill="none" stroke="black" d="M827.858,-655.35C811.041,-646.688 789.135,-632.213 779,-612 768.086,-590.233 781.353,-564.325 794.756,-546.091"/>
395<polygon fill="black" stroke="black" points="797.832,-547.84 801.242,-537.808 792.321,-543.524 797.832,-547.84"/>
396</g>
397<!-- gns&#45;&gt;dns -->
398<g id="edge27" class="edge"><title>gns&#45;&gt;dns</title>
399<path fill="none" stroke="black" d="M871.13,-654.496C875.967,-652.239 881.122,-649.949 886,-648 933.377,-629.072 964.65,-653.009 995,-612 1008.03,-594.39 1007.25,-568.995 1003.95,-549.835"/>
400<polygon fill="black" stroke="black" points="1007.35,-549.022 1001.93,-539.921 1000.49,-550.418 1007.35,-549.022"/>
401</g>
402<!-- gns&#45;&gt;dnsparser -->
403<g id="edge32" class="edge"><title>gns&#45;&gt;dnsparser</title>
404<path fill="none" stroke="black" d="M870.586,-654.227C875.54,-651.931 880.881,-649.692 886,-648 963.461,-622.391 995.505,-653.066 1066,-612 1093.37,-596.054 1115.84,-566.774 1129.29,-546.163"/>
405<polygon fill="black" stroke="black" points="1132.29,-547.978 1134.66,-537.654 1126.37,-544.243 1132.29,-547.978"/>
406</g>
407<!-- revocation -->
408<g id="node23" class="node"><title>revocation</title>
409<ellipse fill="none" stroke="black" cx="474" cy="-594" rx="48.1917" ry="18"/>
410<text text-anchor="middle" x="474" y="-590.3" font-family="Times,serif" font-size="14.00">revocation</text>
411</g>
412<!-- gns&#45;&gt;revocation -->
413<g id="edge30" class="edge"><title>gns&#45;&gt;revocation</title>
414<path fill="none" stroke="black" d="M823.776,-661.482C769.658,-654.024 641.808,-635.374 536,-612 531.019,-610.9 525.841,-609.65 520.694,-608.34"/>
415<polygon fill="black" stroke="black" points="521.456,-604.922 510.895,-605.77 519.68,-611.693 521.456,-604.922"/>
416</g>
417<!-- gns&#45;&gt;gnsrecord -->
418<g id="edge41" class="edge"><title>gns&#45;&gt;gnsrecord</title>
419<path fill="none" stroke="black" d="M870.549,-654.113C875.504,-651.822 880.856,-649.613 886,-648 978.027,-619.137 1009.84,-646.249 1100,-612 1156.37,-590.587 1185.79,-592.754 1215,-540 1225.98,-520.174 1217.7,-494.957 1208.15,-476.431"/>
420<polygon fill="black" stroke="black" points="1211.2,-474.717 1203.29,-467.672 1205.08,-478.114 1211.2,-474.717"/>
421</g>
422<!-- revocation&#45;&gt;core -->
423<g id="edge35" class="edge"><title>revocation&#45;&gt;core</title>
424<path fill="none" stroke="black" d="M447.586,-578.755C410.639,-556.683 348,-510.49 348,-451 348,-451 348,-451 348,-377 348,-335.398 347.208,-317.038 377,-288 415.046,-250.916 477.859,-239.613 517.794,-236.267"/>
425<polygon fill="black" stroke="black" points="518.191,-239.747 527.918,-235.547 517.695,-232.765 518.191,-239.747"/>
426</g>
427<!-- revocation&#45;&gt;set -->
428<g id="edge36" class="edge"><title>revocation&#45;&gt;set</title>
429<path fill="none" stroke="black" d="M484.409,-576.055C489.683,-567.469 496.183,-556.888 501.987,-547.439"/>
430<polygon fill="black" stroke="black" points="505.024,-549.182 507.276,-538.829 499.06,-545.518 505.024,-549.182"/>
431</g>
432<!-- set&#45;&gt;cadet -->
433<g id="edge75" class="edge"><title>set&#45;&gt;cadet</title>
434<path fill="none" stroke="black" d="M522.084,-504.055C524.482,-496.059 527.401,-486.331 530.08,-477.4"/>
435<polygon fill="black" stroke="black" points="533.442,-478.373 532.963,-467.789 526.737,-476.362 533.442,-478.373"/>
436</g>
437<!-- conversation -->
438<g id="node26" class="node"><title>conversation</title>
439<polygon fill="none" stroke="black" points="1017.18,-743.562 948,-756 878.82,-743.562 878.884,-723.438 1017.12,-723.438 1017.18,-743.562"/>
440<text text-anchor="middle" x="948" y="-734.3" font-family="Times,serif" font-size="14.00">conversation</text>
441</g>
442<!-- conversation&#45;&gt;cadet -->
443<g id="edge53" class="edge"><title>conversation&#45;&gt;cadet</title>
444<path fill="none" stroke="black" d="M900.537,-723.335C873.864,-714.435 840.677,-701.257 814,-684 756.206,-646.615 759.329,-615.558 703,-576 673.069,-554.981 658.318,-561.866 629,-540 611.601,-527.024 611.36,-519.336 596,-504 585.077,-493.094 572.479,-481.475 561.82,-471.903"/>
445<polygon fill="black" stroke="black" points="563.901,-469.069 554.107,-465.028 559.243,-474.295 563.901,-469.069"/>
446</g>
447<!-- conversation&#45;&gt;gns -->
448<g id="edge54" class="edge"><title>conversation&#45;&gt;gns</title>
449<path fill="none" stroke="black" d="M928.638,-723.17C913.533,-712.381 892.408,-697.291 875.857,-685.469"/>
450<polygon fill="black" stroke="black" points="877.846,-682.589 867.674,-679.625 873.777,-688.285 877.846,-682.589"/>
451</g>
452<!-- conversation&#45;&gt;gnsrecord -->
453<g id="edge40" class="edge"><title>conversation&#45;&gt;gnsrecord</title>
454<path fill="none" stroke="blue" stroke-dasharray="1,5" d="M1017.21,-728.51C1076.25,-719.968 1155.24,-705.041 1179,-684 1241.33,-628.786 1256.97,-583.117 1231,-504 1227.58,-493.58 1221.24,-483.522 1214.65,-475.019"/>
455<polygon fill="blue" stroke="blue" points="1217.15,-472.551 1208.08,-467.08 1211.76,-477.015 1217.15,-472.551"/>
456</g>
457<!-- speaker -->
458<g id="node31" class="node"><title>speaker</title>
459<polygon fill="none" stroke="black" points="948,-684 894.877,-666 948,-648 1001.12,-666 948,-684"/>
460<text text-anchor="middle" x="948" y="-662.3" font-family="Times,serif" font-size="14.00">speaker</text>
461</g>
462<!-- conversation&#45;&gt;speaker -->
463<g id="edge55" class="edge"><title>conversation&#45;&gt;speaker</title>
464<path fill="none" stroke="black" d="M948,-723.17C948,-714.919 948,-704.153 948,-694.256"/>
465<polygon fill="black" stroke="black" points="951.5,-694.019 948,-684.019 944.5,-694.019 951.5,-694.019"/>
466</g>
467<!-- microphone -->
468<g id="node32" class="node"><title>microphone</title>
469<polygon fill="none" stroke="black" points="1095,-684 1019.76,-666 1095,-648 1170.24,-666 1095,-684"/>
470<text text-anchor="middle" x="1095" y="-662.3" font-family="Times,serif" font-size="14.00">microphone</text>
471</g>
472<!-- conversation&#45;&gt;microphone -->
473<g id="edge56" class="edge"><title>conversation&#45;&gt;microphone</title>
474<path fill="none" stroke="black" d="M976.692,-723.337C1001.14,-711.695 1036.29,-694.958 1061.92,-682.753"/>
475<polygon fill="black" stroke="black" points="1063.71,-685.777 1071.23,-678.318 1060.7,-679.457 1063.71,-685.777"/>
476</g>
477<!-- nse&#45;&gt;core -->
478<g id="edge48" class="edge"><title>nse&#45;&gt;core</title>
479<path fill="none" stroke="black" d="M790.412,-294.231C785.459,-291.935 780.118,-289.695 775,-288 697.966,-262.487 673.625,-275.652 596,-252 592.83,-251.034 589.569,-249.913 586.336,-248.716"/>
480<polygon fill="black" stroke="black" points="587.428,-245.385 576.841,-244.978 584.864,-251.899 587.428,-245.385"/>
481</g>
482<!-- peerinfo&#45;&gt;hello -->
483<g id="edge76" class="edge"><title>peerinfo&#45;&gt;hello</title>
484<path fill="none" stroke="black" d="M548.194,-77.9517C554.676,-75.8006 561.524,-73.6914 568,-72 654.752,-49.3407 758.747,-32.6176 814.333,-24.4966"/>
485<polygon fill="black" stroke="black" points="815.063,-27.9277 824.46,-23.0344 814.062,-20.9995 815.063,-27.9277"/>
486</g>
487<!-- transport&#45;&gt;ats -->
488<g id="edge66" class="edge"><title>transport&#45;&gt;ats</title>
489<path fill="none" stroke="black" d="M644.122,-152.487C587.168,-138.972 476.742,-112.769 420.21,-99.3548"/>
490<polygon fill="black" stroke="black" points="420.844,-95.9082 410.306,-97.0048 419.228,-102.719 420.844,-95.9082"/>
491</g>
492<!-- transport&#45;&gt;peerinfo -->
493<g id="edge68" class="edge"><title>transport&#45;&gt;peerinfo</title>
494<path fill="none" stroke="black" d="M651.411,-148.647C624.725,-137.116 584.738,-119.837 555.501,-107.204"/>
495<polygon fill="black" stroke="black" points="556.601,-103.867 546.033,-103.113 553.824,-110.292 556.601,-103.867"/>
496</g>
497<!-- transport&#45;&gt;hello -->
498<g id="edge67" class="edge"><title>transport&#45;&gt;hello</title>
499<path fill="none" stroke="black" d="M721.405,-157.922C756.719,-153.037 806.213,-140.439 835,-108 850.042,-91.0495 854.193,-65.1533 854.935,-45.6573"/>
500<polygon fill="black" stroke="black" points="858.435,-45.6195 855.044,-35.5822 851.436,-45.5437 858.435,-45.6195"/>
501</g>
502<!-- nat -->
503<g id="node36" class="node"><title>nat</title>
504<polygon fill="none" stroke="black" points="796,-108 765.835,-90 796,-72 826.165,-90 796,-108"/>
505<text text-anchor="middle" x="796" y="-86.3" font-family="Times,serif" font-size="14.00">nat</text>
506</g>
507<!-- transport&#45;&gt;nat -->
508<g id="edge69" class="edge"><title>transport&#45;&gt;nat</title>
509<path fill="none" stroke="black" d="M703.474,-146.834C723.706,-134.626 752.749,-117.1 772.878,-104.953"/>
510<polygon fill="black" stroke="black" points="774.946,-107.793 781.7,-99.6294 771.33,-101.799 774.946,-107.793"/>
511</g>
512<!-- fragmentation -->
513<g id="node37" class="node"><title>fragmentation</title>
514<polygon fill="none" stroke="black" points="662,-108 576.537,-90 662,-72 747.463,-90 662,-108"/>
515<text text-anchor="middle" x="662" y="-86.3" font-family="Times,serif" font-size="14.00">fragmentation</text>
516</g>
517<!-- transport&#45;&gt;fragmentation -->
518<g id="edge70" class="edge"><title>transport&#45;&gt;fragmentation</title>
519<path fill="none" stroke="black" d="M675.643,-144.055C673.556,-135.941 671.011,-126.044 668.687,-117.006"/>
520<polygon fill="black" stroke="black" points="672.073,-116.12 666.193,-107.307 665.294,-117.864 672.073,-116.12"/>
521</g>
522<!-- topology -->
523<g id="node34" class="node"><title>topology</title>
524<polygon fill="none" stroke="black" points="959.5,-324 894.5,-324 894.5,-288 959.5,-288 959.5,-324"/>
525<text text-anchor="middle" x="927" y="-302.3" font-family="Times,serif" font-size="14.00">topology</text>
526</g>
527<!-- topology&#45;&gt;core -->
528<g id="edge61" class="edge"><title>topology&#45;&gt;core</title>
529<path fill="none" stroke="black" d="M894.413,-292.17C889.63,-290.593 884.724,-289.139 880,-288 756.312,-258.18 718.97,-284.656 596,-252 592.621,-251.103 589.151,-249.989 585.73,-248.765"/>
530<polygon fill="black" stroke="black" points="586.918,-245.471 576.329,-245.106 584.379,-251.995 586.918,-245.471"/>
531</g>
532<!-- topology&#45;&gt;peerinfo -->
533<g id="edge59" class="edge"><title>topology&#45;&gt;peerinfo</title>
534<path fill="none" stroke="black" d="M894.233,-295.354C862.315,-285.612 812.655,-269.532 771,-252 705.781,-224.55 688.475,-218.336 629,-180 597.704,-159.827 564.778,-132.553 542.992,-113.534"/>
535<polygon fill="black" stroke="black" points="545.032,-110.666 535.215,-106.682 540.404,-115.919 545.032,-110.666"/>
536</g>
537<!-- topology&#45;&gt;hello -->
538<g id="edge62" class="edge"><title>topology&#45;&gt;hello</title>
539<path fill="none" stroke="black" d="M922.652,-287.966C910.314,-239.626 875.032,-101.398 860.438,-44.2243"/>
540<polygon fill="black" stroke="black" points="863.829,-43.3557 857.964,-34.532 857.046,-45.087 863.829,-43.3557"/>
541</g>
542<!-- topology&#45;&gt;transport -->
543<g id="edge60" class="edge"><title>topology&#45;&gt;transport</title>
544<path fill="none" stroke="black" d="M897.206,-287.871C850.798,-261.191 761.564,-209.891 713.17,-182.069"/>
545<polygon fill="black" stroke="black" points="714.758,-178.945 704.344,-176.995 711.269,-185.014 714.758,-178.945"/>
546</g>
547<!-- hostlist -->
548<g id="node35" class="node"><title>hostlist</title>
549<polygon fill="none" stroke="black" points="214,-324 158,-324 158,-288 214,-288 214,-324"/>
550<text text-anchor="middle" x="186" y="-302.3" font-family="Times,serif" font-size="14.00">hostlist</text>
551</g>
552<!-- hostlist&#45;&gt;core -->
553<g id="edge63" class="edge"><title>hostlist&#45;&gt;core</title>
554<path fill="none" stroke="black" d="M214.167,-292.599C218.733,-290.88 223.455,-289.271 228,-288 330.933,-259.219 456.746,-244.294 517.975,-238.275"/>
555<polygon fill="black" stroke="black" points="518.666,-241.725 528.286,-237.286 517.998,-234.757 518.666,-241.725"/>
556</g>
557<!-- hostlist&#45;&gt;peerinfo -->
558<g id="edge64" class="edge"><title>hostlist&#45;&gt;peerinfo</title>
559<path fill="none" stroke="black" d="M212.608,-287.849C273.449,-248.632 422.455,-152.586 487.166,-110.875"/>
560<polygon fill="black" stroke="black" points="489.21,-113.721 495.719,-105.362 485.418,-107.838 489.21,-113.721"/>
561</g>
562<!-- hostlist&#45;&gt;hello -->
563<g id="edge65" class="edge"><title>hostlist&#45;&gt;hello</title>
564<path fill="none" stroke="black" d="M192.198,-287.715C209.228,-243.039 261.382,-123.627 349,-72 425.521,-26.9118 694.449,-19.9666 805.486,-19.053"/>
565<polygon fill="black" stroke="black" points="805.751,-22.5513 815.727,-18.9823 805.703,-15.5515 805.751,-22.5513"/>
566</g>
567<!-- scalarproduct -->
568<g id="node38" class="node"><title>scalarproduct</title>
569<ellipse fill="none" stroke="black" cx="636" cy="-594" rx="57.6901" ry="18"/>
570<text text-anchor="middle" x="636" y="-590.3" font-family="Times,serif" font-size="14.00">scalarproduct</text>
571</g>
572<!-- scalarproduct&#45;&gt;cadet -->
573<g id="edge74" class="edge"><title>scalarproduct&#45;&gt;cadet</title>
574<path fill="none" stroke="black" d="M622.726,-576.035C614.79,-565.742 604.61,-552.266 596,-540 581.021,-518.662 564.9,-493.752 553.465,-475.721"/>
575<polygon fill="black" stroke="black" points="556.241,-473.562 547.943,-466.975 550.322,-477.299 556.241,-473.562"/>
576</g>
577<!-- scalarproduct&#45;&gt;set -->
578<g id="edge73" class="edge"><title>scalarproduct&#45;&gt;set</title>
579<path fill="none" stroke="black" d="M610.179,-577.811C591.059,-566.564 565.021,-551.248 545.33,-539.665"/>
580<polygon fill="black" stroke="black" points="546.899,-536.527 536.505,-534.473 543.349,-542.56 546.899,-536.527"/>
581</g>
582<!-- secushare -->
583<g id="node39" class="node"><title>secushare</title>
584<polygon fill="none" stroke="black" points="633.366,-815.562 578,-828 522.634,-815.562 522.686,-795.438 633.314,-795.438 633.366,-815.562"/>
585<text text-anchor="middle" x="578" y="-806.3" font-family="Times,serif" font-size="14.00">secushare</text>
586</g>
587<!-- social -->
588<g id="node42" class="node"><title>social</title>
589<ellipse fill="none" stroke="black" cx="578" cy="-738" rx="31.3957" ry="18"/>
590<text text-anchor="middle" x="578" y="-734.3" font-family="Times,serif" font-size="14.00">social</text>
591</g>
592<!-- secushare&#45;&gt;social -->
593<g id="edge80" class="edge"><title>secushare&#45;&gt;social</title>
594<path fill="none" stroke="black" d="M578,-795.17C578,-786.919 578,-776.153 578,-766.256"/>
595<polygon fill="black" stroke="black" points="581.5,-766.019 578,-756.019 574.5,-766.019 581.5,-766.019"/>
596</g>
597<!-- multicast -->
598<g id="node40" class="node"><title>multicast</title>
599<ellipse fill="none" stroke="black" cx="326" cy="-594" rx="43.5923" ry="18"/>
600<text text-anchor="middle" x="326" y="-590.3" font-family="Times,serif" font-size="14.00">multicast</text>
601</g>
602<!-- multicast&#45;&gt;cadet -->
603<g id="edge82" class="edge"><title>multicast&#45;&gt;cadet</title>
604<path fill="none" stroke="black" d="M347.889,-578.338C386.803,-552.273 467.927,-497.935 510.526,-469.402"/>
605<polygon fill="black" stroke="black" points="512.642,-472.198 519.003,-463.725 508.747,-466.382 512.642,-472.198"/>
606</g>
607<!-- psyc -->
608<g id="node41" class="node"><title>psyc</title>
609<ellipse fill="none" stroke="black" cx="326" cy="-666" rx="27" ry="18"/>
610<text text-anchor="middle" x="326" y="-662.3" font-family="Times,serif" font-size="14.00">psyc</text>
611</g>
612<!-- psyc&#45;&gt;multicast -->
613<g id="edge81" class="edge"><title>psyc&#45;&gt;multicast</title>
614<path fill="none" stroke="black" d="M326,-647.697C326,-639.983 326,-630.712 326,-622.112"/>
615<polygon fill="black" stroke="black" points="329.5,-622.104 326,-612.104 322.5,-622.104 329.5,-622.104"/>
616</g>
617<!-- psycstore -->
618<g id="node43" class="node"><title>psycstore</title>
619<ellipse fill="none" stroke="black" cx="220" cy="-594" rx="44.393" ry="18"/>
620<text text-anchor="middle" x="220" y="-590.3" font-family="Times,serif" font-size="14.00">psycstore</text>
621</g>
622<!-- psyc&#45;&gt;psycstore -->
623<g id="edge79" class="edge"><title>psyc&#45;&gt;psycstore</title>
624<path fill="none" stroke="black" d="M307.536,-652.807C291.938,-642.506 269.271,-627.537 250.911,-615.413"/>
625<polygon fill="black" stroke="black" points="252.567,-612.312 242.294,-609.722 248.71,-618.154 252.567,-612.312"/>
626</g>
627<!-- social&#45;&gt;gns -->
628<g id="edge78" class="edge"><title>social&#45;&gt;gns</title>
629<path fill="none" stroke="black" d="M605.831,-729.838C655.82,-716.973 760.68,-689.987 815.282,-675.935"/>
630<polygon fill="black" stroke="black" points="816.373,-679.268 825.185,-673.386 814.628,-672.489 816.373,-679.268"/>
631</g>
632<!-- social&#45;&gt;psyc -->
633<g id="edge77" class="edge"><title>social&#45;&gt;psyc</title>
634<path fill="none" stroke="black" d="M550.552,-729.376C504.247,-716.513 410.731,-690.537 360.222,-676.506"/>
635<polygon fill="black" stroke="black" points="360.996,-673.089 350.424,-673.784 359.122,-679.833 360.996,-673.089"/>
636</g>
637<!-- rps -->
638<g id="node44" class="node"><title>rps</title>
639<ellipse fill="none" stroke="black" cx="593" cy="-306" rx="27" ry="18"/>
640<text text-anchor="middle" x="593" y="-302.3" font-family="Times,serif" font-size="14.00">rps</text>
641</g>
642<!-- rps&#45;&gt;core -->
643<g id="edge83" class="edge"><title>rps&#45;&gt;core</title>
644<path fill="none" stroke="black" d="M584.187,-288.765C579.582,-280.283 573.845,-269.714 568.679,-260.197"/>
645<polygon fill="black" stroke="black" points="571.613,-258.266 563.766,-251.147 565.461,-261.606 571.613,-258.266"/>
646</g>
647</g>
648</svg>
diff --git a/contrib/packages/guix/notest-guix-env.scm b/contrib/packages/guix/notest-guix-env.scm
new file mode 100644
index 000000000..ffb0ec889
--- /dev/null
+++ b/contrib/packages/guix/notest-guix-env.scm
@@ -0,0 +1,145 @@
1;;; This file is part of GNUnet.
2;;; Copyright (C) 2016, 2017, 2018 GNUnet e.V.
3;;;
4;;; GNUnet is free software: you can redistribute it and/or modify it
5;;; under the terms of the GNU Affero General Public License as published
6;;; by the Free Software Foundation, either version 3 of the License,
7;;; or (at your option) any later version.
8;;;
9;;; GNUnet is distributed in the hope that it will be useful, but
10;;; WITHOUT ANY WARRANTY; without even the implied warranty of
11;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12;;; Affero General Public License for more details.
13;;;
14;;; You should have received a copy of the GNU Affero General Public License
15;;; along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17(use-modules
18 (ice-9 popen)
19 (ice-9 match)
20 (ice-9 rdelim)
21 (guix packages)
22 (guix build-system gnu)
23 (guix gexp)
24 ((guix build utils) #:select (with-directory-excursion))
25 (guix git-download)
26 (guix utils) ; current-source-directory
27 (gnu packages)
28 (gnu packages aidc)
29 (gnu packages autotools)
30 (gnu packages backup)
31 (gnu packages base)
32 (gnu packages compression)
33 (gnu packages curl)
34 (gnu packages databases)
35 (gnu packages file)
36 (gnu packages gettext)
37 (gnu packages glib)
38 (gnu packages gnome)
39 (gnu packages gnunet)
40 (gnu packages gnupg)
41 (gnu packages gnuzilla)
42 (gnu packages groff)
43 (gnu packages gstreamer)
44 (gnu packages gtk)
45 (gnu packages guile)
46 (gnu packages image)
47 (gnu packages image-viewers)
48 (gnu packages libidn)
49 (gnu packages libunistring)
50 (gnu packages linux)
51 (gnu packages maths)
52 (gnu packages multiprecision)
53 (gnu packages perl)
54 (gnu packages pkg-config)
55 (gnu packages pulseaudio)
56 (gnu packages python)
57 (gnu packages tex)
58 (gnu packages texinfo)
59 (gnu packages tex)
60 (gnu packages tls)
61 (gnu packages upnp)
62 (gnu packages video)
63 (gnu packages web)
64 (gnu packages xiph)
65 ((guix licenses) #:prefix license:))
66
67(define %source-dir (current-source-directory))
68
69(define gnunet-dev-env
70 (let* ((revision "1")
71 (select? (delay (or (git-predicate
72 (current-source-directory))
73 source-file?))))
74 (package
75 (inherit gnunet)
76 (name "gnunet")
77 (version (string-append "git" revision))
78 (source
79 (local-file
80 (string-append (getcwd))
81 #:recursive? #t))
82 (inputs
83 `(("glpk" ,glpk)
84 ("gnurl" ,gnurl)
85 ("gstreamer" ,gstreamer)
86 ("gst-plugins-base" ,gst-plugins-base)
87 ("gnutls/dane" ,gnutls/dane)
88 ("libextractor" ,libextractor)
89 ("libgcrypt" ,libgcrypt)
90 ("libidn" ,libidn)
91 ("libmicrohttpd" ,libmicrohttpd)
92 ("libltdl" ,libltdl)
93 ("libunistring" ,libunistring)
94 ("openssl" ,openssl)
95 ("opus" ,opus)
96 ("pulseaudio" ,pulseaudio)
97 ("sqlite" ,sqlite)
98 ("postgresql" ,postgresql)
99 ("mysql" ,mariadb)
100 ("zlib" ,zlib)
101 ("perl" ,perl)
102 ("python-2" ,python-2) ; tests and gnunet-qr
103 ("python2-future" ,python2-future)
104 ("jansson" ,jansson)
105 ("nss" ,nss)
106 ("glib" ,glib "bin")
107 ("gmp" ,gmp)
108 ("bluez" ,bluez) ; for optional bluetooth feature
109 ("glib" ,glib)
110 ;; ("texlive" ,texlive) ;FIXME: minimize.
111 ("texlive-tiny" ,texlive-tiny) ;; Seems to be enough for _just_ info output.
112 ("miniupnpc" ,miniupnpc)
113 ("libogg" ,libogg)))
114 (native-inputs
115 `(("pkg-config" ,pkg-config)
116 ("autoconf" ,autoconf)
117 ("automake" ,automake)
118 ("gnu-gettext" ,gnu-gettext)
119 ("which" ,which)
120 ("texinfo" ,texinfo-5) ; Debian stable: 5.2
121 ("libtool" ,libtool)))
122 (outputs '("out" "debug"))
123 (arguments
124 `(#:configure-flags
125 (list (string-append "--with-nssdir=" %output "/lib")
126 "--enable-experimental")
127 #:phases
128 ;; swap check and install phases and set paths to installed bin
129 (modify-phases %standard-phases
130 (add-after 'unpack 'patch-bin-sh
131 (lambda _
132 (for-each (lambda (f) (chmod f #o755))
133 (find-files "po" ""))
134 #t))
135 (add-after 'patch-bin-sh 'bootstrap
136 (lambda _
137 (invoke "sh" "bootstrap")))
138 ;;(add-before 'build 'chdir
139 ;; (lambda _
140 ;; (chdir "doc/documentation")))
141 (delete 'check)
142 ;; XXX: https://gnunet.org/bugs/view.php?id=4619
143 ))))))
144
145gnunet-dev-env
diff --git a/contrib/services/shepherd/ng0_wip/.gitignore b/contrib/services/shepherd/ng0_wip/.gitignore
deleted file mode 100644
index 9b974979a..000000000
--- a/contrib/services/shepherd/ng0_wip/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
1!*.patch \ No newline at end of file
diff --git a/contrib/services/shepherd/ng0_wip/00001-gnu-services-Add-gnunet-service.patch b/contrib/services/shepherd/ng0_wip/00001-gnu-services-Add-gnunet-service.patch
deleted file mode 100644
index 609a0a5ef..000000000
--- a/contrib/services/shepherd/ng0_wip/00001-gnu-services-Add-gnunet-service.patch
+++ /dev/null
@@ -1,186 +0,0 @@
1From 60a4c0f7c60ef705db17561fd3e930bbe11730c9 Mon Sep 17 00:00:00 2001
2From: ng0 <ng0@we.make.ritual.n0.is>
3Date: Mon, 12 Sep 2016 12:26:52 +0000
4Subject: [PATCH] gnu: services: Add gnunet-service.
5
6* gnu/services/networking.scm (gnunet): New service.
7
8Signed-off-by: Nils Gillmann <ng0@n0.is>
9---
10 doc/guix.texi | 36 ++++++++++++++
11 gnu/services/networking.scm | 93 ++++++++++++++++++++++++++++++++++++-
12 2 files changed, 128 insertions(+), 1 deletion(-)
13
14diff --git a/doc/guix.texi b/doc/guix.texi
15index d925b4eda..eb7b409d7 100644
16--- a/doc/guix.texi
17+++ b/doc/guix.texi
18@@ -11016,6 +11016,42 @@ Package object of the Open vSwitch.
19 @end table
20 @end deftp
21
22+@cindex GNUnet
23+@cindex gnunet
24+@subsubheading GNUnet Service
25+
26+@deffn {Scheme Variable} gnunet-service-type
27+This is the type of the @uref{https://gnunet.org, GNUnet}
28+service, whose value should be an @code{gnunet-configuration} object
29+as in this example:
30+
31+@example
32+(service gnunet-service-type
33+ (gnunet-configuration
34+ (config-file (local-file "./gnunet.conf"))))
35+@end example
36+@end deffn
37+
38+@deftp {Data Type} gnunet-configuration
39+Data type representing the configuration of GNUnet.
40+
41+@table @asis
42+@item @code{package} (default: @var{gnunet})
43+Package object of the GNUnet service.
44+
45+@item @code{config-file} (default: @var{%default-gnunet-file})
46+File-like object of the GNUnet configuration file to use. For NAT is
47+assumes by default that you are behind a NAT (@var{BEHIND_NAT = YES})
48+and enables UPNP (@var{ENABLE_UPNP = YES}).
49+The hostlist is configured with the options @var{-b} (bootstrap using
50+configured hostlist servers) and @var{-e} (enable learning advertised hostlists).
51+Read the configuration files in @var{"~/.guix-profile/share/gnunet/config.d/"}
52+for more information. These files also set the defaults when you don't set
53+any explicit values to override them.
54+
55+@end table
56+@end deftp
57+
58 @node X Window
59 @subsubsection X Window
60
61diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm
62index b0c23aafc..0ff20e707 100644
63--- a/gnu/services/networking.scm
64+++ b/gnu/services/networking.scm
65@@ -5,6 +5,7 @@
66 ;;; Copyright © 2016 John Darrington <jmd@gnu.org>
67 ;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
68 ;;; Copyright © 2017 Thomas Danckaert <post@thomasdanckaert.be>
69+;;; Copyright © 2017 ng0 <contact.ng0@cryptolab.net>
70 ;;;
71 ;;; This file is part of GNU Guix.
72 ;;;
73@@ -29,6 +30,7 @@
74 #:use-module (gnu system pam)
75 #:use-module (gnu packages admin)
76 #:use-module (gnu packages connman)
77+ #:use-module (gnu packages gnunet)
78 #:use-module (gnu packages linux)
79 #:use-module (gnu packages tor)
80 #:use-module (gnu packages messaging)
81@@ -92,7 +94,12 @@
82 wpa-supplicant-service-type
83
84 openvswitch-service-type
85- openvswitch-configuration))
86+ openvswitch-configuration
87+
88+ gnunet-configuration
89+ gnunet-configuration?
90+ gnunet-service
91+ gnunet-service-type))
92
93 ;;; Commentary:
94 ;;;
95@@ -1125,4 +1132,88 @@ a network connection manager."))))
96 switch designed to enable massive network automation through programmatic
97 extension.")))
98
99+;;;
100+;;; GNUnet
101+;;;
102+
103+(define-record-type* <gnunet-configuration>
104+ gnunet-configuration make-gnunet-configuration
105+ gnunet-configuration?
106+ (package gnunet-configuration-package
107+ (default gnunet))
108+ (config-file gnunet-configuration-config-file
109+ (default %default-gnunet-config-file)))
110+
111+(define %default-gnunet-config-file
112+ (plain-file "gnunet.conf" "
113+[PATHS]
114+SERVICEHOME = /var/lib/gnunet
115+GNUNET_CONFIG_HOME = /var/lib/gnunet
116+
117+[arm]
118+SYSTEM_ONLY = YES
119+USER_ONLY = NO
120+
121+[nat]
122+BEHIND_NAT = YES
123+ENABLE_UPNP = YES
124+
125+[hostlist]
126+OPTIONS = -b -e
127+"))
128+
129+(define gnunet-shepherd-service
130+ (match-lambda
131+ (($ <gnunet-configuration> package config-file)
132+ (list (shepherd-service
133+ (provision '(gnunet))
134+ (requirement '(loopback))
135+ (documentation "Run the GNUnet service.")
136+ (start
137+ (let ((gnunet
138+ (file-append package "/lib/gnunet/libexec/gnunet-service-arm")))
139+ #~(make-forkexec-constructor
140+ (list #$gnunet "-c" #$config-file)
141+ #:log-file "/var/log/gnunet.log"
142+ #:pid-file "/var/run/gnunet.pid")))
143+ (stop
144+ #~(make-kill-destructor)))))))
145+
146+(define %gnunet-accounts
147+ (list (user-group
148+ (name "gnunetdns")
149+ (system? #t))
150+ (user-group
151+ (name "gnunet")
152+ (system? #t))
153+ (user-account
154+ (name "gnunet")
155+ (group "gnunet")
156+ (system? #t)
157+ (comment "GNUnet system user")
158+ (home-directory "/var/lib/gnunet")
159+ (shell #~(string-append #$shadow "/sbin/nologin")))))
160+
161+(define gnunet-activation
162+ (match-lambda
163+ (($ <gnunet-configuration> package config-file)
164+ (let ((gnunet
165+ (file-append package "/lib/gnunet/libexec/gnunet-service-arm")))
166+ #~(begin
167+ ;; Create the .config + .cache for gnunet user
168+ (mkdir-p "/var/lib/gnunet/.config/gnunet")
169+ (mkdir-p "/var/lib/gnunet/.cache/gnunet"))))))
170+
171+(define gnunet-service-type
172+ (service-type
173+ (name 'gnunet)
174+ (extensions (list (service-extension account-service-type
175+ (const %gnunet-accounts))
176+ (service-extension activation-service-type
177+ gnunet-activation)
178+ (service-extension profile-service-type
179+ (compose list gnunet-configuration-package))
180+ (service-extension shepherd-root-service-type
181+ gnunet-shepherd-service)))))
182+
183 ;;; networking.scm ends here
184--
1852.17.0
186
diff --git a/contrib/services/shepherd/ng0_wip/0001-gnu-services-Add-gnunet-service.patch b/contrib/services/shepherd/ng0_wip/0001-gnu-services-Add-gnunet-service.patch
deleted file mode 100644
index a494434e0..000000000
--- a/contrib/services/shepherd/ng0_wip/0001-gnu-services-Add-gnunet-service.patch
+++ /dev/null
@@ -1,225 +0,0 @@
1From 434b05bc1a11b4865c0bd634281acd91dfce972c Mon Sep 17 00:00:00 2001
2From: ng0 <ng0@we.make.ritual.n0.is>
3Date: Mon, 12 Sep 2016 12:26:52 +0000
4Subject: [PATCH] gnu: services: Add gnunet-service.
5
6Signed-off-by: Nils Gillmann <ng0@n0.is>
7---
8 doc/guix.texi | 36 ++++++++++
9 gnu/services/networking.scm | 134 +++++++++++++++++++++++++++++++++++-
10 2 files changed, 169 insertions(+), 1 deletion(-)
11
12diff --git a/doc/guix.texi b/doc/guix.texi
13index 00bf24d3f..73589c88b 100644
14--- a/doc/guix.texi
15+++ b/doc/guix.texi
16@@ -10138,6 +10138,42 @@ Package object of the Open vSwitch.
17 @end table
18 @end deftp
19
20+@cindex GNUnet
21+@cindex gnunet
22+@subsubheading GNUnet Service
23+
24+@deffn {Scheme Variable} gnunet-service-type
25+This is the type of the @uref{https://gnunet.org, GNUnet}
26+service, whose value should be an @code{gnunet-configuration} object
27+as in this example:
28+
29+@example
30+(service gnunet-service-type
31+ (gnunet-configuration
32+ (config-file (local-file "./gnunet.conf"))))
33+@end example
34+@end deffn
35+
36+@deftp {Data Type} gnunet-configuration
37+Data type representing the configuration of GNUnet.
38+
39+@table @asis
40+@item @code{package} (default: @var{gnunet})
41+Package object of the GNUnet service.
42+
43+@item @code{config-file} (default: @var{%default-gnunet-file})
44+File-like object of the GNUnet configuration file to use. For NAT is
45+assumes by default that you are behind a NAT (@var{BEHIND_NAT = YES})
46+and enables UPNP (@var{ENABLE_UPNP = YES}).
47+The hostlist is configured with the options @var{-b} (bootstrap using
48+configured hostlist servers) and @var{-e} (enable learning advertised hostlists).
49+Read the configuration files in @var{"~/.guix-profile/share/gnunet/config.d/"}
50+for more information. These files also set the defaults when you don't set
51+any explicit values to override them.
52+
53+@end table
54+@end deftp
55+
56 @node X Window
57 @subsubsection X Window
58
59diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm
60index 99a3d493c..fe682b267 100644
61--- a/gnu/services/networking.scm
62+++ b/gnu/services/networking.scm
63@@ -5,6 +5,7 @@
64 ;;; Copyright © 2016 John Darrington <jmd@gnu.org>
65 ;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
66 ;;; Copyright © 2017 Thomas Danckaert <post@thomasdanckaert.be>
67+;;; Copyright © 2017 ng0 <ng0@no-reply.pragmatique.xyt>
68 ;;;
69 ;;; This file is part of GNU Guix.
70 ;;;
71@@ -29,6 +30,7 @@
72 #:use-module (gnu system pam)
73 #:use-module (gnu packages admin)
74 #:use-module (gnu packages connman)
75+ #:use-module (gnu packages gnunet)
76 #:use-module (gnu packages linux)
77 #:use-module (gnu packages tor)
78 #:use-module (gnu packages messaging)
79@@ -92,7 +94,12 @@
80 wpa-supplicant-service-type
81
82 openvswitch-service-type
83- openvswitch-configuration))
84+ openvswitch-configuration
85+
86+ gnunet-configuration
87+ gnunet-configuration?
88+ gnunet-service-type
89+ %default-gnunet-config-file))
90
91 ;;; Commentary:
92 ;;;
93@@ -1069,4 +1076,129 @@ dns=" dns "
94 (service-extension shepherd-root-service-type
95 openvswitch-shepherd-service)))))
96
97+;;;
98+;;; GNUnet
99+;;;
100+
101+;; steps:
102+;; 0. The service works!!!
103+;; 1. We want a completely adjustable config.
104+;; 2. We want to extend this service with functions like
105+;; vpn, comparable to tor-service
106+;; Because of (1) we can't have a default. We can have
107+;; default values which can be adjusted. A config is
108+;; generated from these.
109+
110+(define-record-type* <gnunet-configuration>
111+ gnunet-configuration make-gnunet-configuration
112+ gnunet-configuration?
113+ (gnunet gnunet-configuration-package
114+ (default gnunet))
115+ (config-file gnunet-configuration-config-file
116+ (default (plain-file "empty" ""))))
117+
118+(define %default-gnunet-config-file
119+ (plain-file "gnunet.conf" "
120+[PATHS]
121+SERVICEHOME = /var/lib/gnunet
122+GNUNET_CONFIG_HOME = /var/lib/gnunet
123+
124+[arm]
125+SYSTEM_ONLY = NO
126+USER_ONLY = NO
127+
128+[nat]
129+BEHIND_NAT = YES
130+ENABLE_UPNP = YES
131+
132+[hostlist]
133+OPTIONS = -b -e
134+"))
135+
136+(define gnunet-shepherd-service
137+ (match-lambda
138+ (($ <gnunet-configuration> package config-file)
139+ (list (shepherd-service
140+ (provision '(gnunet))
141+ (requirement '(user-processes loopback networking))
142+ (documentation "Run the GNUnet service.")
143+ (start
144+ (let ((gnunet
145+ (file-append package "/lib/gnunet/libexec/gnunet-service-arm")))
146+ #~(make-forkexec-constructor
147+ (list #$gnunet "-c" #$config-file "-d")
148+ #:pid-file "/var/run/gnunet/arm-service.pid"
149+ #:user "gnunet"
150+ #:group "gnunet"
151+ ;;#:log-file "/var/lib/gnunet/gnunet.log")))
152+ #:log-file "/var/log/gnunet.log")))
153+ (stop #~(make-kill-destructor)))))))
154+
155+(define %gnunet-accounts
156+ (list (user-group (name "gnunetdns") (system? #t))
157+ (user-group (name "gnunet") (system? #t))
158+ (user-account
159+ (name "gnunet")
160+ (group "gnunet")
161+ (system? #t)
162+ (comment "GNUnet system user")
163+ (home-directory "/var/empty")
164+ (shell (file-append shadow "/sbin/nologin")))))
165+
166+;; ${GNUNET_HOME}/.local/share/gnunet/gnunet.conf -> chmod 600
167+;; mkdir -p ${GNUNET_HOME}/.cache/gnunet
168+
169+(define gnunet-activation
170+ (match-lambda
171+ (($ <gnunet-configuration> package config-file)
172+ (let ((gnunet
173+ (file-append package "/lib/gnunet/libexec/gnunet-service-arm")))
174+ #~(begin
175+ (use-modules (guix build utils))
176+ (define %user (getpw "gnunet"))
177+ (mkdir-p "/var/lib/gnunet/")
178+ (chown "/var/lib/gnunet" (passwd:uid %user) (passwd:gid %user))
179+ ;;(chmod "/var/lib/gnunet/" #o755)
180+ (mkdir-p "/var/lib/gnunet/.local/share/gnunet")
181+ (mkdir-p "/var/lib/gnunet/.cache/gnunet")
182+ (mkdir-p "/var/lib/gnunet/hostlist")
183+ (mkdir-p "/var/lib/gnunet/.config/gnunet")
184+ (chown "/var/lib/gnunet/.local/share/gnunet" (passwd:uid %user) (passwd:gid %user))
185+ (chown "/var/lib/gnunet/.cache/gnunet" (passwd:uid %user) (passwd:gid %user))
186+ (chown "/var/lib/gnunet/hostlist" (passwd:uid %user) (passwd:gid %user))
187+ ;;(chown "/var/lib/gnunet/gnunet.conf" (passwd:uid %user) (passwd:gid %user))
188+ (chown "/var/lib/gnunet/.config/gnunet" (passwd:uid %user) (passwd:gid %user)))))))
189+ ;;(chmod "/var/lib/gnunet/.config/gnunet" #o755)
190+ ;;(chmod "/var/lib/gnunet/.cache/gnunet" #o755)
191+ ;;(chmod "/var/lib/gnunet/.local/share/gnunet" #o755))))))
192+
193+;; SUID_ROOT_HELPERS="exit nat-server nat-client transport-bluetooth transport-wlan vpn"
194+;; set chmod u+s for those above.
195+;; chmodown_execbin ${libexec}/gnunet-helper-dns 4750 root:gnunetdns
196+;; chmodown_execbin ${libexec}/gnunet-service-dns 2750 gnunet:gnunetdns
197+(define gnunet-setuid-programs
198+ (match-lambda
199+ (($ <gnunet-configuration> package)
200+ (list (file-append package "/lib/gnunet/libexec/gnunet-helper-exit")
201+ (file-append package "/lib/gnunet/libexec/gnunet-helper-nat-server")
202+ (file-append package "/lib/gnunet/libexec/gnunet-helper-nat-client")
203+ (file-append package "/lib/gnunet/libexec/gnunet-helper-transport-bluetooth")
204+ (file-append package "/lib/gnunet/libexec/gnunet-helper-transport-wlan")
205+ (file-append package "/lib/gnunet/libexec/gnunet-helper-vpn")))))
206+
207+(define gnunet-service-type
208+ (service-type
209+ (name 'gnunet)
210+ (extensions (list (service-extension account-service-type
211+ (const %gnunet-accounts))
212+ (service-extension activation-service-type
213+ gnunet-activation)
214+ (service-extension profile-service-type
215+ (compose list gnunet-configuration-package))
216+ (service-extension setuid-program-service-type
217+ gnunet-setuid-programs)
218+ (service-extension shepherd-root-service-type
219+ gnunet-shepherd-service)))))
220+;;; --- here starts the rewrite.
221+
222 ;;; networking.scm ends here
223--
2242.17.0
225
diff --git a/contrib/services/shepherd/ng0_wip/001-gnu-services-Add-gnunet-service.patch b/contrib/services/shepherd/ng0_wip/001-gnu-services-Add-gnunet-service.patch
deleted file mode 100644
index 0017ec8cf..000000000
--- a/contrib/services/shepherd/ng0_wip/001-gnu-services-Add-gnunet-service.patch
+++ /dev/null
@@ -1,204 +0,0 @@
1From 91241bacb6533745535ff28d20f087ecd571e7be Mon Sep 17 00:00:00 2001
2From: ng0 <ng0@we.make.ritual.n0.is>
3Date: Mon, 12 Sep 2016 12:26:52 +0000
4Subject: [PATCH] gnu: services: Add gnunet-service.
5
6---
7 doc/guix.texi | 36 ++++++++++++++
8 gnu/services/networking.scm | 114 +++++++++++++++++++++++++++++++++++++++++++-
9 2 files changed, 149 insertions(+), 1 deletion(-)
10
11diff --git a/doc/guix.texi b/doc/guix.texi
12index 99bde4aca..6c683393e 100644
13--- a/doc/guix.texi
14+++ b/doc/guix.texi
15@@ -8903,6 +8903,42 @@ Boolean values @var{ipv4?} and @var{ipv6?} determine whether to use IPv4/IPv6
16 sockets.
17 @end deffn
18
19+@cindex GNUnet
20+@cindex gnunet
21+@subsubheading GNUnet Service
22+
23+@deffn {Scheme Variable} gnunet-service-type
24+This is the type of the @uref{https://gnunet.org, GNUnet}
25+service, whose value should be an @code{gnunet-configuration} object
26+as in this example:
27+
28+@example
29+(service gnunet-service-type
30+ (gnunet-configuration
31+ (config-file (local-file "./gnunet.conf"))))
32+@end example
33+@end deffn
34+
35+@deftp {Data Type} gnunet-configuration
36+Data type representing the configuration of GNUnet.
37+
38+@table @asis
39+@item @code{package} (default: @var{gnunet})
40+Package object of the GNUnet service.
41+
42+@item @code{config-file} (default: @var{%default-gnunet-file})
43+File-like object of the GNUnet configuration file to use. For NAT is
44+assumes by default that you are behind a NAT (@var{BEHIND_NAT = YES})
45+and enables UPNP (@var{ENABLE_UPNP = YES}).
46+The hostlist is configured with the options @var{-b} (bootstrap using
47+configured hostlist servers) and @var{-e} (enable learning advertised hostlists).
48+Read the configuration files in @var{"~/.guix-profile/share/gnunet/config.d/"}
49+for more information. These files also set the defaults when you don't set
50+any explicit values to override them.
51+
52+@end table
53+@end deftp
54+
55
56 @node X Window
57 @subsubsection X Window
58diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm
59index d672ecf68..ff3615ea2 100644
60--- a/gnu/services/networking.scm
61+++ b/gnu/services/networking.scm
62@@ -3,6 +3,7 @@
63 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
64 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
65 ;;; Copyright © 2016 John Darrington <jmd@gnu.org>
66+;;; Copyright © 2016 ng0 <ng0@libertad.pw>
67 ;;;
68 ;;; This file is part of GNU Guix.
69 ;;;
70@@ -27,6 +28,7 @@
71 #:use-module (gnu system pam)
72 #:use-module (gnu packages admin)
73 #:use-module (gnu packages connman)
74+ #:use-module (gnu packages gnunet)
75 #:use-module (gnu packages linux)
76 #:use-module (gnu packages tor)
77 #:use-module (gnu packages messaging)
78@@ -66,7 +68,12 @@
79 wicd-service
80 network-manager-service
81 connman-service
82- wpa-supplicant-service-type))
83+ wpa-supplicant-service-type
84+
85+ gnunet-configuration
86+ gnunet-configuration?
87+ gnunet-service-type
88+ %default-gnunet-config-file))
89
90 ;;; Commentary:
91 ;;;
92@@ -781,4 +788,109 @@ configure networking."
93 (service-extension dbus-root-service-type list)
94 (service-extension profile-service-type list)))))
95
96+
97+;;; GNUnet
98+;;;
99+;;;
100+
101+(define-record-type* <gnunet-configuration>
102+ gnunet-configuration make-gnunet-configuration
103+ gnunet-configuration?
104+ (package gnunet-configuration-package
105+ (default gnunet))
106+ (config-file gnunet-configuration-config-file
107+ (default %default-gnunet-config-file)))
108+
109+(define %default-gnunet-config-file
110+ (plain-file "gnunet.conf" "
111+[PATHS]
112+SERVICEHOME = /var/lib/gnunet
113+GNUNET_CONFIG_HOME = /var/lib/gnunet
114+
115+[arm]
116+SYSTEM_ONLY = YES
117+USER_ONLY = NO
118+
119+[nat]
120+BEHIND_NAT = YES
121+ENABLE_UPNP = YES
122+
123+[hostlist]
124+OPTIONS = -b -e
125+"))
126+
127+(define gnunet-shepherd-service
128+ (match-lambda
129+ (($ <gnunet-configuration> package config-file)
130+ (list (shepherd-service
131+ (provision '(gnunet))
132+ (requirement '(user-processes loopback))
133+ (documentation "Run the GNUnet service.")
134+ (start
135+ (let ((gnunet
136+ (file-append package "/lib/gnunet/libexec/gnunet-service-arm")))
137+ #~(make-forkexec-constructor
138+ (list #$gnunet "-c" #$config-file)
139+ #:pid-file "/var/run/gnunet.pid")))
140+ (stop
141+ #~(make-kill-destructor
142+ (list #$gnunet "-e"))))))))
143+
144+(define %gnunet-accounts
145+ (list (user-group
146+ (name "gnunetdns")
147+ (system? #t))
148+ (user-group
149+ (name "gnunet")
150+ (system? #t))
151+ (user-account
152+ (name "gnunet")
153+ (group "gnunet")
154+ (system? #t)
155+ (comment "GNUnet system user")
156+ (home-directory "/var/empty")
157+ (shell #~(string-append #$shadow "/sbin/nologin")))))
158+
159+(define gnunet-activation
160+ (match-lambda
161+ (($ <gnunet-configuration> package config-file)
162+ (let ((gnunet
163+ (file-append package "/lib/gnunet/libexec/gnunet-service-arm")))
164+ #~(begin
165+ (use-modules (guix build utils))
166+ (define %user (getpw "gnunet"))
167+ (mkdir-p "/var/lib/gnunet/")
168+ (chown "/var/lib/gnunet" (passwd:uid %user) (passwd:gid %user))
169+ (chmod "/var/lib/gnunet/" #o600)
170+ (mkdir-p "/var/lib/gnunet/.local/share/gnunet")
171+ (mkdir-p "/var/lib/gnunet/.cache/gnunet")
172+ (mkdir-p "/var/lib/gnunet/.config/gnunet")
173+ (chmod "/var/lib/gnunet/.config/gnunet" #o600)
174+ (chmod "/var/lib/gnunet/.cache/gnunet" #o600)
175+ (chmod "/var/lib/gnunet/.local/share/gnunet" #o600))))))
176+
177+(define gnunet-setuid-programs
178+ (match-lambda
179+ (($ <gnunet-configuration> package)
180+ (list (file-append package "/lib/gnunet/libexec/gnunet-helper-exit")
181+ (file-append package "/lib/gnunet/libexec/gnunet-helper-nat-server")
182+ (file-append package "/lib/gnunet/libexec/gnunet-helper-nat-client")
183+ (file-append package "/lib/gnunet/libexec/gnunet-helper-transport-bluetooth")
184+ (file-append package "/lib/gnunet/libexec/gnunet-helper-transport-wlan")
185+ (file-append package "/lib/gnunet/libexec/gnunet-helper-vpn")))))
186+
187+(define gnunet-service-type
188+ (service-type
189+ (name 'gnunet)
190+ (extensions (list (service-extension account-service-type
191+ (const %gnunet-accounts))
192+ (service-extension activation-service-type
193+ gnunet-activation)
194+ (service-extension profile-service-type
195+ (compose list gnunet-configuration-package))
196+ (service-extension setuid-program-service-type
197+ gnunet-setuid-programs)
198+ (service-extension shepherd-root-service-type
199+ gnunet-shepherd-service)))))
200+
201 ;;; networking.scm ends here
202--
2032.11.0
204
diff --git a/contrib/services/shepherd/ng0_wip/README b/contrib/services/shepherd/ng0_wip/README
deleted file mode 100644
index c36c10959..000000000
--- a/contrib/services/shepherd/ng0_wip/README
+++ /dev/null
@@ -1,11 +0,0 @@
1short notes:
2
3* you are not expected to be able to run this as-is.
4* you must keep it GPL3 licensed and NOT license it to GNUnet e.V.,
5 for changes add your line to the header.
6* does not apply to a guix checkout, you have to search and replace
7 the imported modules. in my development of plant, infotropique
8 services is equivalent to gnu services (same for packages) and plant
9 XYZ is guix XYZ.
10* Understanding is optional.
11* Patches come as context reading material. \ No newline at end of file
diff --git a/contrib/services/shepherd/ng0_wip/gnunet.scm b/contrib/services/shepherd/ng0_wip/gnunet.scm
deleted file mode 100644
index 80b807e74..000000000
--- a/contrib/services/shepherd/ng0_wip/gnunet.scm
+++ /dev/null
@@ -1,173 +0,0 @@
1;;; plant ---
2;;; Copyright (C) 2016, 2017, 2018 Nils Gillmann <gillmann@infotropique.org>
3;;;
4;;; This file is part of plant.
5;;;
6;;; plant is free software; you can redistribute it and/or modify it
7;;; under the terms of the GNU General Public License as published by
8;;; the Free Software Foundation; either version 3 of the License, or (at
9;;; your option) any later version.
10;;;
11;;; plant is distributed in the hope that it will be useful, but
12;;; WITHOUT ANY WARRANTY; without even the implied warranty of
13;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14;;; GNU General Public License for more details.
15;;;
16;;; You should have received a copy of thye GNU General Public License
17;;; along with plant. If not, see <http://www.gnu.org/licenses/>.
18
19(define-module (infotropique services networking)
20 #:use-module (infotropique services)
21 #:use-module (infotropique services shepherd)
22 #:use-module (infotropique services dbus)
23 #:use-module (infotropique system shadow)
24 #:use-module (infotropique system pam)
25 #:use-module (infotropique packages admin)
26 #:use-module (infotropique packages connman)
27 #:use-module (infotropique packages linux)
28 #:use-module (infotropique packages tor)
29 #:use-module (infotropique packages messaging)
30 #:use-module (infotropique packages networking)
31 #:use-module (infotropique packages ntp)
32 #:use-module (infotropique packages wicd)
33 #:use-module (infotropique packages gnome)
34 #:use-module (infotropique packages gnunet)
35 #:use-module (plant gexp)
36 #:use-module (plant records)
37 #:use-module (plant modules)
38 #:use-module (srfi srfi-1)
39 #:use-module (srfi srfi-9)
40 #:use-module (srfi srfi-26)
41 #:use-module (ice-9 match)
42 #:export (gnunet-configuration
43 gnunet-configuration?
44 gnunet-service
45 gnunet-service-type))
46
47;;;
48;;; Commentary:
49;;; gnunet (GNUnet) related services, mainly gnunet itself.
50;;;
51
52;; GENTOO OpenRC:
53DONE: depends on "net".
54DONE: PIDFILE=/run/gnunet/arm-service.pid
55SUID_ROOT_HELPERS=exit, nat-server, nat-client, transport-bluetooth, transport-wlan, vpn
56
57/var/lib/gnunet/.local/share/gnunet/gnunet.conf must be chmod 600 and chown gnunet:gnunet
58/var/lib/gnunet/.cache/gnunet must exist.
59/usr/lib/gnunet/libexec/gnunet-helper-SUID_ROOT_HELPERS must be s+u (--> suid)
60
61/usr/lib/gnunet/libexec/gnunet-helper-dns must be: chown root:gnunetdns and chmod 4750
62/usr/lib/gnunet/libexec/gnunet-service-dns must be: chown gnunet:gnunetdns and chmod 2750
63
64directory with PID file must then be chowned by gnunet:gnunet
65
66user gnunet startet dann /usr/lib/gnunet/libexec/gnunet-service-arm -d
67
68stop process hat:
69start-stop-daemon --stop --signal QUIT --pidfile ${PIDFILE}
70sleep 1
71killall -u gnunet
72sleep 1
73rm -rf /tmp/gnunet-gnunet-runtime >/dev/null 2>&1
74rm -rf /tmp/gnunet-system-runtime >/dev/null 2>&1
75
76/etc/nsswitch.conf kriegt den eintrag:
77hosts: files gns [NOTFOUND=return] dns
78
79und die dateien die in der source rumliegen bzgl nss müssen noch kopiert werden
80UND nss muss sie finden.
81
82
83
84(define-record-type* <gnunet-configuration>
85 gnunet-configuration make-gnunet-configuration
86 gnunet-configuration?
87 (package gnunet-configuration-package
88 (default gnunet))
89 (config-file gnunet-configuration-config-file
90 (default %default-gnunet-config-file)))
91
92;; TODO: [PATHS] DEFAULTCONFIG = ?
93(define %default-gnunet-config-file
94 (plain-file "gnunet.conf" "
95[PATHS]
96SERVICEHOME = /var/lib/gnunet
97GNUNET_CONFIG_HOME = /var/lib/gnunet
98
99[arm]
100SYSTEM_ONLY = YES
101USER_ONLY = NO
102
103[nat]
104BEHIND_NAT = YES
105ENABLE_UPNP = NO
106USE_LOCALADDR = NO
107DISABLEV6 = YES
108
109[hostlist]
110OPTIONS = -b -e
111"))
112
113(define gnunet-shepherd-service
114 (match-lambda
115 (($ <gnunet-configuration> package config-file)
116 (list (shepherd-service
117 (provision '(gnunet))
118 ;; do we require networking? arm will try to reconnect until a connection
119 ;; exists (again), but we might also set up vpn and not succeed at service
120 ;; boot time as well as the general certificate issue we have especially on
121 ;; Guix-on-GuixSD systems.
122 (requirement '(loopback))
123 (documentation "Run the GNUnet service.")
124 (start
125 (let ((gnunet
126 (file-append package "/lib/gnunet/libexec/gnunet-service-arm")))
127 #~(make-forkexec-constructor
128 (list #$gnunet "-c" #$config-file)
129 #:log-file "/var/log/gnunet.log"
130 #:pid-file "/var/run/gnunet/arm-service.pid")))
131 (stop
132 #~(make-kill-destructor)))))))
133
134(define %gnunet-accounts
135 (list (user-group
136 (name "gnunetdns")
137 (system? #t))
138 (user-group
139 (name "gnunet")
140 (system? #t))
141 (user-account
142 (name "gnunet")
143 (group "gnunet")
144 (system? #t)
145 (comment "GNUnet system user")
146 (home-directory "/var/lib/gnunet")
147 (shell #~(string-append #$shadow "/sbin/nologin")))))
148
149;; TODO: setuids.
150;; TODO: certificate issues -- gnunet should honor CURL_CA_BUNDLE!
151(define gnunet-activation
152 (match-lambda
153 (($ <gnunet-configuration> package config-file)
154 (let ((gnunet
155 (file-append package "/lib/gnunet/libexec/gnunet-service-arm")))
156 #~(begin
157 ;; Create the .config + .cache for gnunet user
158 (mkdir-p "/var/lib/gnunet/.config/gnunet")
159 (mkdir-p "/var/lib/gnunet/.cache/gnunet"))))))
160
161(define gnunet-service-type
162 (service-type
163 (name 'gnunet)
164 (extensions (list (service-extension account-service-type
165 (const %gnunet-accounts))
166 (service-extension activation-service-type
167 gnunet-activation)
168 (service-extension profile-service-type
169 (compose list gnunet-configuration-package))
170 (service-extension shepherd-root-service-type
171 gnunet-shepherd-service)))))
172
173;;; gnunet.scm ends here
diff --git a/contrib/services/shepherd/ng0_wip/janneke-os-modified.scm b/contrib/services/shepherd/ng0_wip/janneke-os-modified.scm
deleted file mode 100644
index d75d14598..000000000
--- a/contrib/services/shepherd/ng0_wip/janneke-os-modified.scm
+++ /dev/null
@@ -1,62 +0,0 @@
1(use-modules (gnu))
2(use-service-modules
3;; admin
4 base
5 mcron
6 networking
7 ssh)
8
9(use-package-modules
10 admin
11 ssh
12 version-control
13 gnunet)
14
15(define %user (getenv "USER"))
16
17(define os
18 (operating-system
19 (host-name "os")
20 (timezone "Europe/Amsterdam")
21 (locale "en_US.UTF-8")
22
23 (bootloader
24 (grub-configuration
25 (device "/dev/sda")))
26
27 (file-systems
28 (cons* (file-system (mount-point "/")
29 (device "/dev/sda1")
30 (type "ext4"))
31 %base-file-systems))
32
33 (groups
34 (cons* (user-group (name %user))
35 %base-groups))
36
37 (users
38 (cons* (user-account (name %user)
39 (group %user)
40 (password (crypt "" "xx"))
41 (uid 1000)
42 (supplementary-groups '("wheel" "gnunet"))
43 (home-directory (string-append "/home/" %user)))
44 %base-user-accounts))
45
46 (packages
47 (cons*
48 git
49 openssh
50 gnunet
51 %base-packages))
52
53 (services
54 (cons*
55 (dhcp-client-service)
56 (lsh-service #:port-number 2222
57 #:allow-empty-passwords? #t
58 #:root-login? #t)
59 (gnunet-service)
60 %base-services
61 ))))
62os
diff --git a/contrib/timeout_watchdog.c b/contrib/timeout_watchdog.c
deleted file mode 100644
index 70e840d55..000000000
--- a/contrib/timeout_watchdog.c
+++ /dev/null
@@ -1,116 +0,0 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2010 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17*/
18
19/**
20 * @file contrib/timeout_watchdog.c
21 * @brief small tool starting a child process, waiting that it terminates or killing it after a given timeout period
22 * @author Matthias Wachs
23 */
24
25#include <sys/types.h>
26#include <sys/wait.h>
27#include <signal.h>
28#include <stdio.h>
29#include <stdlib.h>
30#include <unistd.h>
31
32static pid_t child;
33
34
35static void
36sigchld_handler (int val)
37{
38 int status = 0;
39 int ret = 0;
40
41 (void) val;
42 waitpid (child, &status, 0);
43 if (WIFEXITED (status) != 0)
44 {
45 ret = WEXITSTATUS (status);
46 printf ("Test process exited with result %u\n", ret);
47 }
48 if (WIFSIGNALED (status) != 0)
49 {
50 ret = WTERMSIG (status);
51 printf ("Test process was signaled %u\n", ret);
52 }
53 exit (ret);
54}
55
56
57static void
58sigint_handler (int val)
59{
60 kill (0, val);
61 exit (val);
62}
63
64
65int
66main (int argc,
67 char *argv[])
68{
69 int timeout = 0;
70 pid_t gpid = 0;
71
72 if (argc < 3)
73 {
74 printf
75 ("arg 1: timeout in sec., arg 2: executable, arg<n> arguments\n");
76 exit (1);
77 }
78
79 timeout = atoi (argv[1]);
80
81 if (timeout == 0)
82 timeout = 600;
83
84/* with getpgid() it does not compile, but getpgrp is the BSD version and working */
85 gpid = getpgrp ();
86
87 signal (SIGCHLD, sigchld_handler);
88 signal (SIGABRT, sigint_handler);
89 signal (SIGFPE, sigint_handler);
90 signal (SIGILL, sigint_handler);
91 signal (SIGINT, sigint_handler);
92 signal (SIGSEGV, sigint_handler);
93 signal (SIGTERM, sigint_handler);
94
95 child = fork ();
96 if (child == 0)
97 {
98 /* int setpgrp(pid_t pid, pid_t pgid); is not working on this machine */
99 //setpgrp (0, pid_t gpid);
100 if (-1 != gpid)
101 setpgid (0, gpid);
102 execvp (argv[2], &argv[2]);
103 exit (1);
104 }
105 if (child > 0)
106 {
107 sleep (timeout);
108 printf ("Child processes were killed after timeout of %u seconds\n",
109 timeout);
110 kill (0, SIGTERM);
111 exit (1);
112 }
113 exit (1);
114}
115
116/* end of timeout_watchdog.c */
diff --git a/contrib/timeout_watchdog_w32.c b/contrib/timeout_watchdog_w32.c
deleted file mode 100644
index 901eb6207..000000000
--- a/contrib/timeout_watchdog_w32.c
+++ /dev/null
@@ -1,191 +0,0 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2010 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17*/
18
19/**
20 * @file contrib/timeout_watchdog_w32.c
21 * @brief small tool starting a child process, waiting that it terminates or killing it after a given timeout period
22 * @author LRN
23 */
24
25#include <windows.h>
26#include <sys/types.h>
27#include <stdio.h>
28
29int
30main (int argc, char *argv[])
31{
32 int i;
33 DWORD wait_result;
34 wchar_t *commandline;
35 wchar_t **wargv;
36 wchar_t *arg;
37 unsigned int cmdlen;
38 STARTUPINFOW start;
39 PROCESS_INFORMATION proc;
40
41 wchar_t wpath[MAX_PATH + 1];
42
43 wchar_t *pathbuf;
44 DWORD pathbuf_len, alloc_len;
45 wchar_t *ptr;
46 wchar_t *non_const_filename;
47 wchar_t *wcmd;
48 int wargc;
49 int timeout = 0;
50 ssize_t wrote;
51
52 HANDLE job;
53
54 if (argc < 3)
55 {
56 printf
57 ("arg 1: timeout in sec., arg 2: executable, arg<n> arguments\n");
58 exit (1);
59 }
60
61 timeout = atoi (argv[1]);
62
63 if (timeout == 0)
64 timeout = 600;
65
66 commandline = GetCommandLineW ();
67 if (commandline == NULL)
68 {
69 printf ("Failed to get commandline: %lu\n", GetLastError ());
70 exit (2);
71 }
72
73 wargv = CommandLineToArgvW (commandline, &wargc);
74 if (wargv == NULL || wargc <= 1)
75 {
76 printf ("Failed to get parse commandline: %lu\n", GetLastError ());
77 exit (3);
78 }
79
80 job = CreateJobObject (NULL, NULL);
81 if (job == NULL)
82 {
83 printf ("Failed to create a job: %lu\n", GetLastError ());
84 exit (4);
85 }
86
87 pathbuf_len = GetEnvironmentVariableW (L"PATH", (wchar_t *) &pathbuf, 0);
88
89 alloc_len = pathbuf_len + 1;
90
91 pathbuf = malloc (alloc_len * sizeof (wchar_t));
92
93 ptr = pathbuf;
94
95 alloc_len = GetEnvironmentVariableW (L"PATH", ptr, pathbuf_len);
96
97 cmdlen = wcslen (wargv[2]);
98 if (cmdlen < 5 || wcscmp (&wargv[2][cmdlen - 4], L".exe") != 0)
99 {
100 non_const_filename = malloc (sizeof (wchar_t) * (cmdlen + 5));
101 swprintf (non_const_filename, cmdlen + 5, L"%S.exe", wargv[2]);
102 }
103 else
104 {
105 non_const_filename = wcsdup (wargv[2]);
106 }
107
108 /* Check that this is the full path. If it isn't, search. */
109 if (non_const_filename[1] == L':')
110 swprintf (wpath, sizeof (wpath) / sizeof (wchar_t), L"%S", non_const_filename);
111 else if (!SearchPathW
112 (pathbuf, non_const_filename, NULL, sizeof (wpath) / sizeof (wchar_t),
113 wpath, NULL))
114 {
115 printf ("Failed to get find executable: %lu\n", GetLastError ());
116 exit (5);
117 }
118 free (pathbuf);
119 free (non_const_filename);
120
121 cmdlen = wcslen (wpath) + 4;
122 i = 3;
123 while (NULL != (arg = wargv[i++]))
124 cmdlen += wcslen (arg) + 4;
125
126 wcmd = malloc (sizeof (wchar_t) * (cmdlen + 1));
127 wrote = 0;
128 i = 2;
129 while (NULL != (arg = wargv[i++]))
130 {
131 /* This is to escape trailing slash */
132 wchar_t arg_lastchar = arg[wcslen (arg) - 1];
133 if (wrote == 0)
134 {
135 wrote += swprintf (&wcmd[wrote], cmdlen + 1 - wrote, L"\"%S%S\" ", wpath,
136 arg_lastchar == L'\\' ? L"\\" : L"");
137 }
138 else
139 {
140 if (wcschr (arg, L' ') != NULL)
141 wrote += swprintf (&wcmd[wrote], cmdlen + 1 - wrote, L"\"%S%S\"%S", arg,
142 arg_lastchar == L'\\' ? L"\\" : L"", i == wargc ? L"" : L" ");
143 else
144 wrote += swprintf (&wcmd[wrote], cmdlen + 1 - wrote, L"%S%S%S", arg,
145 arg_lastchar == L'\\' ? L"\\" : L"", i == wargc ? L"" : L" ");
146 }
147 }
148
149 LocalFree (wargv);
150
151 memset (&start, 0, sizeof (start));
152 start.cb = sizeof (start);
153
154 if (!CreateProcessW (wpath, wcmd, NULL, NULL, TRUE, CREATE_SUSPENDED,
155 NULL, NULL, &start, &proc))
156 {
157 wprintf (L"Failed to get spawn process `%S' with arguments `%S': %lu\n", wpath, wcmd, GetLastError ());
158 exit (6);
159 }
160
161 AssignProcessToJobObject (job, proc.hProcess);
162
163 ResumeThread (proc.hThread);
164 CloseHandle (proc.hThread);
165
166 free (wcmd);
167
168 wait_result = WaitForSingleObject (proc.hProcess, timeout * 1000);
169 if (wait_result == WAIT_OBJECT_0)
170 {
171 DWORD status;
172 wait_result = GetExitCodeProcess (proc.hProcess, &status);
173 CloseHandle (proc.hProcess);
174 if (wait_result != 0)
175 {
176 printf ("Test process exited with result %lu\n", status);
177 TerminateJobObject (job, status);
178 exit (status);
179 }
180 printf ("Test process exited (failed to obtain exit status)\n");
181 TerminateJobObject (job, 0);
182 exit (0);
183 }
184 printf ("Child processes were killed after timeout of %u seconds\n",
185 timeout);
186 TerminateJobObject (job, 1);
187 CloseHandle (proc.hProcess);
188 exit (1);
189}
190
191/* end of timeout_watchdog_w32.c */