Merge ~kzapalowicz/snappy-hwe-snaps/+git/network-manager:feature/use-create-image-scripts-repo into ~snappy-hwe-team/snappy-hwe-snaps/+git/pulseaudio:master

Proposed by Konrad Zapałowicz
Status: Superseded
Proposed branch: ~kzapalowicz/snappy-hwe-snaps/+git/network-manager:feature/use-create-image-scripts-repo
Merge into: ~snappy-hwe-team/snappy-hwe-snaps/+git/pulseaudio:master
Diff against target: 4709 lines (+4319/-0) (has conflicts)
38 files modified
ChangeLog (+107/-0)
MAINTAINERS (+7/-0)
README.md (+142/-0)
bin/dhcp-lease-mover (+26/-0)
bin/networkmanager (+83/-0)
conf/NetworkManager.conf (+17/-0)
data/copyright (+77/-0)
docs/index.md (+17/-0)
docs/metadata.yaml (+11/-0)
docs/reference/configuration/wowlan.md (+123/-0)
hooks/configure (+98/-0)
run-tests.sh (+63/-0)
setup/gui/icon.svg (+2466/-0)
snapcraft.yaml (+244/-0)
spread.yaml (+50/-0)
startup-hooks/99-wol-by-default.sh (+13/-0)
tests/full/correct-dns-setup/task.yaml (+47/-0)
tests/full/dhcp-leases-are-moved/task.yaml (+35/-0)
tests/full/immutable-netplan-config/task.yaml (+9/-0)
tests/full/ipv6-address-assignment/task.yaml (+27/-0)
tests/full/ipv6-router-advertisements/task.yaml (+70/-0)
tests/full/no-netplan-default-config/task.yaml (+41/-0)
tests/full/system-network-is-active/task.yaml (+9/-0)
tests/full/wol-enabled-by-default/task.yaml (+59/-0)
tests/lib/prepare-all.sh (+24/-0)
tests/lib/prepare.sh (+26/-0)
tests/lib/restore-each.sh (+27/-0)
tests/lib/utilities.sh (+62/-0)
tests/main/aliases/task.yaml (+13/-0)
tests/main/ethernet-managed-by-networkd/task.yaml (+7/-0)
tests/main/installation/task.yaml (+16/-0)
tests/main/set-hostname/task.yaml (+13/-0)
tests/main/static-ip-configuration/task.yaml (+49/-0)
tests/main/suspend-resume/task.yaml (+80/-0)
tests/main/switch-netplan-renderer/task.yaml (+40/-0)
tests/main/wifi-connect-secured-ap/task.yaml (+38/-0)
tests/main/wifi-powersave-config-option/task.yaml (+28/-0)
tests/main/wifi-wowlan-config-option/task.yaml (+55/-0)
Conflict in MAINTAINERS
Conflict in README.md
Conflict in data/copyright
Conflict in run-tests.sh
Conflict in snapcraft.yaml
Conflict in spread.yaml
Conflict in tests/lib/prepare-all.sh
Conflict in tests/lib/prepare.sh
Conflict in tests/lib/restore-each.sh
Conflict in tests/lib/utilities.sh
Conflict in tests/main/installation/task.yaml
Reviewer Review Type Date Requested Status
System Enablement Bot continuous-integration Needs Fixing
Review via email: mp+315454@code.launchpad.net

This proposal has been superseded by a proposal from 2017-01-24.

Description of the change

tests: use the tests-extras repository

The tests-extras repository contains the tests-runner as well
as image creating scripts. This commit changes the run-tests.sh
script in a way that it fetches the tests-extras and uses it for
test execution.

See: https://code.launchpad.net/~kzapalowicz/snappy-hwe-snaps/+git/tests-extras/+merge/315453

To post a comment you must log in.
Revision history for this message
System Enablement Bot (system-enablement-ci-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Matteo Croce (teknoraver) :

Unmerged commits

4fcd29e... by =?utf-8?q?Konrad_Zapa=C5=82owicz?= <email address hidden>

docs: update the README

Make sure it reflects the changes done to the testing infrastructure

537dda1... by =?utf-8?q?Konrad_Zapa=C5=82owicz?= <email address hidden>

tests: fetch the remote repository and execute tests runner

The run-tests.sh script now delegates the tests execution to the test runner
which is in the tests-extras repository passing arguments there as-is.

0dccd22... by =?utf-8?q?Konrad_Zapa=C5=82owicz?= <email address hidden>

tests: use remote image creation script

Switch to shared, remote image creation script instead having it
embedded in the repository. Also add --snap option to make sure
that all of the image creation script functionalities are
exposed.

64ea63d... by Simon Fels

docs: wowlan: minor fixes

9e61cbb... by Simon Fels

tests: bring wowlan config test back inline with implementation

b3d9e46... by Simon Fels

docs: respect review comments for wowlan documentation

2d81063... by Simon Fels

Drop note about unfinished support for hooks in snapcraft

snapcraft supports hook with version 2.25

397c311... by Simon Fels

Add short paragraph about documentation in our README

4676251... by Simon Fels

hooks: bring wifi.wake-on-wlan config option inline with documentation

1b78869... by Simon Fels

docs: add documentation for wake-on-wlan support

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/ChangeLog b/ChangeLog
2new file mode 100644
3index 0000000..e1f5f10
4--- /dev/null
5+++ b/ChangeLog
6@@ -0,0 +1,107 @@
7+2016-11-28 Simon Fels <simon.fels@canonical.com> - 1.2.2-10
8+
9+ * Rename hooks to startup-hooks to make clear they are different from snap hooks
10+ * Make wake-on-lan hook executable
11+ * Respect review comments
12+ * Delete unwanted temporary file
13+ * Add spread test for WoL enablement
14+ * Move WoL enablement into a startup hook
15+ * Add conf file to enable WoL by default for all ethernet connections
16+ * Use absolute path for wifi-ap executables
17+ * Wait for NetworkManager to be fully up and running
18+ * Make DHCP lease mover test a bit more robust
19+ * Let the assertion do the slot/plug connections
20+ * tests: use prebuilt snap if available
21+ * Bump network-manager version
22+ * Respect review comments
23+ * Add hostname test case
24+ * Respect review comments
25+ * Use absolute path for all snap binaries as spread removes /snap/bin from PATH
26+ * Explain the difference between our different test suites
27+ * Add IPv6 router advertisement test case
28+ * Ensure NetworkManager has started when we start testing the DNS setup
29+ * Add test case to verify static IP configuration
30+ * Add test case to verify immutable netplan configuration files
31+ * Add DNS setup verification test
32+ * Add first test case to verify basic IPv6 address assignment
33+ * Extend README to explain how to run an entire suite via spread
34+ * Create static netplan configuration file as part of our image
35+ * Fix testing for a channel
36+ * Extend README and correct formatting
37+ * Fix failing test cases
38+ * Stop prepare/restore steps after first reboot
39+ * Drop useless comments
40+ * Use correct path for snap we install
41+ * Bring back netplan renderer switch test
42+ * Rework test setup so we have two different suites
43+ * Move dhcp lease files back into SNAP_DATA but keep a copy of them in /run
44+
45+2016-10-27 Simon Fels <simon.fels@canonical.com> - 1.2.2-9
46+
47+ * One more review change
48+ * Changes according to review comments
49+ * Correctly check if a file is empty or not
50+ * Use correct indentation via spaces
51+ * Work when /usr/lib/snapd/generate-network-conf exists or not
52+ * Remove guard to prevent automatic ethernet configuration for no-netplan scenario
53+ * Explain how to test a snap from a specific channel of the store
54+ * Extend run-tests command documentation
55+ * Move wait-for-nm code into a common utility function
56+ * Add missing utilities.sh file
57+ * Extend no-netplan-default-config test and name file correctly
58+ * Build snap on suite preparation
59+ * Switch per test to network-manager as default netplan renderer
60+ * Check continously for network-manager service until it comes up
61+ * Correctly test for no default netplan configuration
62+ * Extend test infrastructure to run local snap
63+ * Test system without default netplan config
64+ * Manage ethernet connections automatically when netplan does not
65+ * (morphis/spread-tests, spread-tests) Fix spread qemu path
66+ * Split out actual snap name as variable
67+ * Add small timeout before checking NetworkManager status
68+ * Drop executable bits from sourced shell scripts
69+ * Detect which spread version we're running
70+ * Add test case to verify netplan renderer switch works
71+ * Preserve netplan configuration as well accross test runs
72+ * Add chapter to README explaining how to use the tests
73+ * Address more review comments
74+ * Respect review comments
75+ * Add tests to verifiy WiFi connection to WPA2 secured AP
76+ * Don't remove network-manager snap from the image on restore
77+ * Add initial spread testing infrastructure
78+
79+2016-10-27 Simon Fels <simon.fels@canonical.com> - 1.2.2-8
80+
81+ * Allow people to get ethernet managed back by NetworkManager
82+
83+2016-10-20 Simon Fels <simon.fels@canonical.com> - 1.2.2-7
84+
85+ * Create state directory on startup if not present
86+ * [SNAPPY] Print out correct path for the secret key
87+
88+2016-10-04 Simon Fels <simon.fels@canonical.com> - 1.2.2-6
89+
90+ * Refine comment about not auto configuring ethernet ports
91+ * Set grade property to stable
92+ * Prevent ethernet ports from being auto configured when netplan is used
93+ * Use new network-setup-observe interface
94+ * Fix netplan nm renderer detection
95+ * Ignore ethernet devices conditionally
96+ * Do not copy default configuration in place but use one conditionally
97+ * Don't ignore ethernet devices
98+ * Look into directory netplan puts configuration files in too
99+ * bin/networkmanager: create DHCP lease directory at startup
100+ * Strip MAINTAINERS .snap suffix
101+ * Add MAINTAINERS.snap
102+ * Drop superflous character
103+ * Cleanup after review comments
104+ * conf: add rc-manager=resolvconf
105+ * Add libnm* back
106+ * Also drop libsoup from stage/build packages
107+ * Explain why we don't want libsoup included
108+ * Drop support for libsoupd which brings in libicudata
109+ * We can't strip libicudata out
110+ * Drop unneeded alias for modem-manager/ppp plugs
111+ * Disable certain features we don't need and remove unwanted things from the snap
112+ * Update config parameters
113+ * Change --log-level to INFO (LP: #1602439)
114diff --git a/MAINTAINERS b/MAINTAINERS
115index a752dca..e50ea74 100644
116--- a/MAINTAINERS
117+++ b/MAINTAINERS
118@@ -1,2 +1,9 @@
119+<<<<<<< MAINTAINERS
120 Jim Hodapp <jim.hodapp@canonical.com>
121 Simon Fels <simon.fels@canonical.com>
122+=======
123+Simon Fels <simon.fels@canonical.com>
124+Tony Espy <espy@canonical.com>
125+Alfonso Sanchez-Beato <alfonso.sanchez-beato@canonical.com>
126+
127+>>>>>>> MAINTAINERS
128diff --git a/README.md b/README.md
129index 73c1615..d52d3e9 100644
130--- a/README.md
131+++ b/README.md
132@@ -1,3 +1,145 @@
133+<<<<<<< README.md
134 # PulseAudio
135
136 This is the snap to package the PulseAudio management service.
137+=======
138+# NetworkManager
139+
140+This is the snap to package the NetworkManager management service.
141+
142+## Hook support
143+
144+All implemented hooks are stored inside the hooks directory.
145+
146+## Running tests
147+
148+We have a set of spread (https://github.com/snapcore/spread) tests which
149+can be executed on a virtual machine or real hardware.
150+
151+In order to run those tests you need the follow things
152+
153+ * ubuntu-image
154+ * spread
155+
156+ You can install both as a snap
157+
158+```
159+ $ snap install --edge --devmode ubuntu-image
160+ $ snap install --devmode spread
161+```
162+
163+NOTE: As of today (27/10/2016) the version of spread in the store misses
164+some important bug fixes so you have to build your own one for now:
165+
166+```
167+ $ WORKDIR=`mktemp -d`
168+ $ export GOPATH=$WORKDIR
169+ $ go get -d -v github.com/snapcore/spread/...
170+ $ go build github.com/snapcore/spread/cmd/spread
171+ $ sudo cp spread /usr/local/bin
172+```
173+
174+Make sure /usr/local/bin is in your path and is used as default:
175+
176+```
177+ $ which spread
178+ /usr/local/bin/spread
179+```
180+
181+Now you have everything to run the test suite.
182+
183+```
184+ $ ./run-tests
185+```
186+
187+The script will reach out to tests-extras repository and download the helper
188+scripts: image creator and test runner. Next it will execute the test runner
189+passing the arguments as-is.
190+
191+The helper scripts are tracked here:
192+https://git.launchpad.net/~snappy-hwe-team/snappy-hwe-snaps/+git/tests-extras
193+
194+The test runner script will create an image via ubuntu-image and make it available
195+to spread by copying it to ~/.spread/qemu or ~/snap/spread/<version>/.spread/qemu
196+depending on if you're using a local spread version or the one from the
197+snap.
198+
199+If you want to see more verbose debugging output of spread run
200+
201+```
202+ $ ./run-tests --debug
203+```
204+
205+If you do not want to build the network-manager snap from source but test one
206+from a specific channel start testing with
207+
208+```
209+ $ ./run-tests --channel=beta --test-from-channel
210+```
211+
212+You can also run spread directly which allows you run just specific tests
213+
214+```
215+ $ spread tests/main/installation
216+```
217+
218+This will by default build the network-manager snap from source. If you
219+want it to test it from a specific channel run
220+
221+```
222+ $ SNAP_CHANNEL=candidate spread tests/main/installation
223+```
224+
225+And if you want to run an entire suite
226+
227+```
228+ $ spread tests/main/
229+```
230+
231+## Available test suites
232+
233+Currently we have two test suites
234+
235+ * main
236+ * full
237+
238+The 'main' suite covers testing of network-manager when its installed on
239+any Ubuntu Core device from the store without configuring the system
240+further to allow NetworkManager to control also all ethernet connections.
241+
242+The 'full' suite configures netplan in the prepare part to use NetworkManager
243+as default backend so that it becomes the only network connection
244+management service in the system.
245+
246+Depending on the nature of a test case the right test suite should be
247+picked.
248+
249+## Documentation
250+
251+All documentation is available in the docs/ subdirectory. It uses markdown
252+and the documentation-builder (<https://github.com/CanonicalLtd/documentation-builder>)
253+to generate HTML-based documentation.
254+
255+To generate the HTML pages install the documentation-builder snap first
256+
257+```
258+ $ snap install documentation-builder
259+ $ snap connect documentation-builder:home core
260+```
261+
262+then enter the docs/ subdirectory and run the builder
263+
264+```
265+ $ cd docs
266+ $ documentation-builder
267+```
268+
269+It will generate all documentation as HTML in the build/ subdirectory. Open
270+it via
271+
272+```
273+ $ google-chrome build/index.html
274+```
275+
276+for example.
277+>>>>>>> README.md
278diff --git a/bin/dhcp-lease-mover b/bin/dhcp-lease-mover
279new file mode 100755
280index 0000000..c54aeb0
281--- /dev/null
282+++ b/bin/dhcp-lease-mover
283@@ -0,0 +1,26 @@
284+#!/bin/sh
285+set -x
286+
287+lease_path=$SNAP_DATA/state/dhcp
288+public_lease_path=/run/NetworkManager/dhcp/
289+
290+if [ ! -e $public_lease_path ] ; then
291+ mkdir -p $public_lease_path
292+fi
293+
294+if [ ! -e $lease_path ] ; then
295+ mkdir -p $lease_path
296+fi
297+
298+# Copy all leases when we start to make sure we're in sync
299+rm -f $public_lease_path/*
300+cp $lease_path/* $public_lease_path
301+
302+# Now we wait until a lease changes, gets added or removed and when
303+# that happened we simply just move all leases files into the public
304+# location.
305+while $SNAP/usr/bin/inotifywait -e create,modify,delete,move $lease_path ; do
306+ sleep 1
307+ rm -f $public_lease_path/*
308+ cp $lease_path/* $public_lease_path
309+done
310diff --git a/bin/networkmanager b/bin/networkmanager
311new file mode 100755
312index 0000000..eab3b7e
313--- /dev/null
314+++ b/bin/networkmanager
315@@ -0,0 +1,83 @@
316+#!/bin/sh
317+set -ex
318+
319+# Create all necessary directories we need at runtime
320+mkdir -p $SNAP_DATA/conf/system-connections
321+mkdir -p $SNAP_DATA/run
322+
323+# Create DHCP lease directory
324+mkdir -p /run/NetworkManager/dhcp
325+
326+# Select which config we're going to use. We offer our users
327+# to provide their own configuration file in $SNAP_DATA but
328+# will fallback if no one exists to the default one we ship
329+# in $SNAP
330+NM_CONF="$SNAP/etc/NetworkManager/NetworkManager.conf"
331+if [ -e $SNAP_DATA/NetworkManager.conf ]; then
332+ NM_CONF="$SNAP_DATA/NetworkManager.conf"
333+fi
334+
335+# A directory where users can place any additional configuration
336+# files for NetworkManager
337+mkdir -p $SNAP_DATA/conf.d
338+
339+# State dir where network-manager stores several things like the
340+# secret key used for IPv6
341+mkdir -p $SNAP_DATA/state
342+mkdir -p $SNAP_DATA/state/dhcp
343+
344+# If netplan is not configured to render by default to NetworkManager
345+# configuration files we disable management of any ethernet device
346+# as this will clash with any configuration netplan puts in place
347+# for networkd.
348+if [ ! -e "/etc/netplan/00-default-nm-renderer.yaml" ] ; then
349+ if [ ! -e "$SNAP_DATA/conf.d/disable-ethernet.conf" ] ; then
350+ echo "[keyfile]" > $SNAP_DATA/conf.d/disable-ethernet.conf
351+ echo "unmanaged-devices+=interface-name:eth*,interface-name:enx*" >> $SNAP_DATA/conf.d/disable-ethernet.conf
352+ fi
353+else
354+ # Enable ethernet management again if the user switched the netplan
355+ # backend and wants us to manage ethernet
356+ if [ -e $SNAP_DATA/conf.d/disable-ethernet.conf ] ; then
357+ rm -f $SNAP_DATA/conf.d/disable-ethernet.conf
358+ fi
359+
360+ # If the snapd configuration for netplan is not present or empty
361+ # we will start managing all ethernet ports automatically. Because
362+ # of that we need to remove any previously created configuration files
363+ # which prevented us from doing that.
364+ if [ ! -e /etc/netplan/00-snapd-config.yaml ] || [ -s /etc/netplan/00-snapd-config.yaml ] ; then
365+ rm -f $SNAP_DATA/conf.d/no-auto-default-ethernet.conf
366+ else
367+ if [ ! -e "$SNAP_DATA/conf.d/no-auto-default-ethernet.conf" ] ; then
368+ # If we're running as the only network management service
369+ # and are configured via netplan on first boot then we should
370+ # not try to auto configure ethernet ports as this is up to
371+ # netplan and will be the same for networkd.
372+ echo "[main]" > $SNAP_DATA/conf.d/no-auto-default-ethernet.conf
373+ echo "no-auto-default=interface-name:eth*,interface-name:enx*" >> $SNAP_DATA/conf.d/no-auto-default-ethernet.conf
374+ fi
375+ fi
376+fi
377+
378+# HACK: Until we've fixed probert to look in $SNAP_DATA/state/dhcp or
379+# somewhere else for our lease files we use inotifywatch to monitor
380+# our lease files and copy all over when something has changed. This
381+# background process gets stopped when our systemd service unit gets
382+# stopped.
383+$SNAP/bin/dhcp-lease-mover &
384+
385+# Run available startup hooks to have a point to store custom
386+# logic outside of this script. More of the things from above
387+# should be moved into these.
388+for hook in $SNAP/startup-hooks/* ; do
389+ [ -x "$hook" ] && /bin/sh -x "$hook"
390+done
391+
392+export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$SNAP/usr/lib/NetworkManager"
393+
394+$SNAP/usr/sbin/NetworkManager \
395+ --config-dir=$SNAP_DATA/conf.d/ \
396+ --config=$NM_CONF \
397+ --log-level=INFO \
398+ --no-daemon
399diff --git a/conf/NetworkManager.conf b/conf/NetworkManager.conf
400new file mode 100644
401index 0000000..1950212
402--- /dev/null
403+++ b/conf/NetworkManager.conf
404@@ -0,0 +1,17 @@
405+[main]
406+plugins=ifupdown,keyfile
407+# Not using dnsmasq yet. Need to get it properly integrated
408+# into the snap or reuse the one shiped with the OS snap.
409+# rc-manager=resolvconf directs NM to use the resolvconf
410+# binary to update resolv.conf, which is necessary as there's
411+# more than one network management stack on core devices.
412+dns=default
413+rc-manager=resolvconf
414+
415+# Use internal DHCP stack which is based on the systemd
416+# implementation and is enough for our purpose until we
417+# need something more complex.
418+dhcp=internal
419+
420+[ifupdown]
421+managed=false
422diff --git a/data/copyright b/data/copyright
423index 970053b..28e111b 100644
424--- a/data/copyright
425+++ b/data/copyright
426@@ -1,3 +1,4 @@
427+<<<<<<< data/copyright
428 This package was debianized by CJ van den Berg <cj@vdbonline.com> on
429 Thu, 10 Aug 2006 15:59:43 +0200.
430
431@@ -602,3 +603,79 @@ Copyright:
432 License: LGPL-2.1+
433 On Debian systems, the complete text of the LGPL-2.1 can be found in
434 /usr/share/common-licenses/LGPL-2.1.
435+=======
436+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
437+Upstream-Name: NetworkManager
438+Source: http://ftp.gnome.org/pub/GNOME/sources/NetworkManager/
439+
440+Files: *
441+Copyright: 2004 - 2014 Red Hat, Inc.
442+ 2005 - 2009 Novell, Inc.
443+License: GPL-2+
444+
445+Files: libnm-util/*
446+ libnm-glib/*
447+ libnm-core/*
448+ libnm/*
449+Copyright: 2005 - 2014 Red Hat, Inc.
450+ 2005 - 2009 Novell, Inc.
451+License: LGPL-2+
452+
453+Files: src/systemd/*
454+Copyright: 2013 - 2015 Tom Gundersen
455+ 2014 Susant Sahani
456+ 2014 - 2015 Intel Corporation. All rights reserved.
457+License: LGPL-2.1+
458+
459+License: GPL-2+
460+ This package is free software; you can redistribute it and/or modify
461+ it under the terms of the GNU General Public License as published by
462+ the Free Software Foundation; either version 2 of the License, or
463+ (at your option) any later version.
464+ .
465+ This package is distributed in the hope that it will be useful,
466+ but WITHOUT ANY WARRANTY; without even the implied warranty of
467+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
468+ GNU General Public License for more details.
469+ .
470+ You should have received a copy of the GNU General Public License
471+ along with this program. If not, see <http://www.gnu.org/licenses/>
472+ .
473+ On Debian systems, the complete text of the GNU General Public
474+ License version 2 can be found in "/usr/share/common-licenses/GPL-2".
475+
476+License: LGPL-2+
477+ This package is free software; you can redistribute it and/or
478+ modify it under the terms of the GNU Lesser General Public
479+ License as published by the Free Software Foundation; either
480+ version 2 of the License, or (at your option) any later version.
481+ .
482+ This package is distributed in the hope that it will be useful,
483+ but WITHOUT ANY WARRANTY; without even the implied warranty of
484+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
485+ Lesser General Public License for more details.
486+ .
487+ You should have received a copy of the GNU General Public License
488+ along with this program. If not, see <http://www.gnu.org/licenses/>.
489+ .
490+ On Debian systems, the complete text of the GNU Lesser General
491+ Public License can be found in "/usr/share/common-licenses/LGPL-2".
492+
493+License: LGPL-2.1+
494+ This package is free software; you can redistribute it and/or
495+ modify it under the terms of the GNU Lesser General Public
496+ License as published by the Free Software Foundation; either
497+ version 2.1 of the License, or (at your option) any later version.
498+ .
499+ This package is distributed in the hope that it will be useful,
500+ but WITHOUT ANY WARRANTY; without even the implied warranty of
501+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
502+ Lesser General Public License for more details.
503+ .
504+ You should have received a copy of the GNU General Public License
505+ along with this program. If not, see <http://www.gnu.org/licenses/>.
506+ .
507+ On Debian systems, the complete text of the GNU Lesser General
508+ Public License can be found in "/usr/share/common-licenses/LGPL-2.1".
509+
510+>>>>>>> data/copyright
511diff --git a/docs/index.md b/docs/index.md
512new file mode 100644
513index 0000000..4d539c6
514--- /dev/null
515+++ b/docs/index.md
516@@ -0,0 +1,17 @@
517+---
518+title: "NetworkManager"
519+table_of_contents: True
520+---
521+
522+# About NetworkManager
523+
524+NetworkManager is a system network service that manages your network
525+devices and connections, attempts to keep network connectivity active
526+when available. It manages ethernet, WiFi, mobile broadband (WWAN) and
527+PPPoE devices while also providing VPN integration with a variety of
528+different VPN serivces.
529+
530+## Upstream documentation
531+
532+Existing documentation from the upstream project can be found
533+[here](https://wiki.gnome.org/Projects/NetworkManager).
534diff --git a/docs/metadata.yaml b/docs/metadata.yaml
535new file mode 100644
536index 0000000..d04aaac
537--- /dev/null
538+++ b/docs/metadata.yaml
539@@ -0,0 +1,11 @@
540+navigation:
541+ - title: Introduction
542+ children:
543+ - title: About NetworkManager
544+ location: index.md
545+ - title: Reference
546+ children:
547+ - title: Configuration
548+ children:
549+ - title: Wake on WLAN
550+ location: reference/configuration/wowlan.md
551diff --git a/docs/reference/configuration/wowlan.md b/docs/reference/configuration/wowlan.md
552new file mode 100644
553index 0000000..29be8fc
554--- /dev/null
555+++ b/docs/reference/configuration/wowlan.md
556@@ -0,0 +1,123 @@
557+---
558+title: Wake on WLAN
559+table_of_contents: true
560+---
561+
562+# Wake on WLAN
563+
564+Wake on WLAN (called WoWLAN in the following) is a feature which allows a device
565+to be woken up from standby power states to faciliate device management. It is based
566+on the well established standard for Wake on LAN. The functionality is not entirely
567+equivalent to Wake on LAN and there are some limitations.
568+
569+The NetworkManager snap allows its users to configure one or more triggers to allow
570+the device it operates on to be woken up remotely.
571+
572+An important precondition for WoWLAN to work is that your kernel WiFi driver has
573+support for it.
574+
575+You can read more about the kernel side implementation on the following sites:
576+
577+ * <https://wireless.wiki.kernel.org/en/users/documentation/wowlan>
578+
579+## Enable Wake on WLAN Globally
580+
581+To allow users to enable or disable WoWLAN, the snap provides two configuration
582+options:
583+
584+ * **wifi.wake-on-wlan**
585+ * **wifi.wake-on-wlan-password**
586+
587+Both options can be set via the configuration API snap provide. See
588+<https://docs.ubuntu.com/core/en/guides/build-device/config-hooks> for more
589+details.
590+
591+Both configuration options will affect all wireless network devices. If you
592+want to change it just for a single wireless connection please have a look at
593+the chapter [Per Connection Configuration](#per-connection-configuration) below.
594+
595+
596+### wifi.wake-on-wlan
597+
598+This configuration option accepts the following values
599+
600+ * **disabled (default):** Wake on WLAN is disabled for all wireless network devices.
601+ * **any:** Wake on WLAN is enabled and any possible trigger will cause the system to wake up.
602+ * **disconnect:** If a connection to a station gets disconnected the device will be woken up.
603+ * **magic:** Wake on WLAN is enabled and only a received magic packet will cause the
604+ system to wake up. The magic packet has the same structure as the one
605+ used for Wake on LAN. For more details see <https://en.wikipedia.org/wiki/Wake-on-LAN#Magic_packet>
606+ The content of the magic packet can be extended with the
607+ wifi.wake-on-wlan-password option to require the client to send a
608+ specific byte sequence functioning as a password so that not anyone
609+ unpriviledged can wake up the system.
610+ * **gtk-rekey-failure:** A failure of a GTK rekey operation will cause the device to wake up.
611+ * **4way-handshake:** Reiteration of the 4way handshake will cause the device to wake up.
612+ * **rfkill-release:** Release of a rfkill will cause the device to wake up.
613+ * **tcp:** Any incoming TCP packet will cause the device to wake up.
614+
615+Example:
616+
617+```
618+ $ snap set network-manager wifi.wake-on-wlan=magic
619+```
620+
621+### wifi.wake-on-wlan-password
622+
623+This configuration option accepts a textual value. If specified, the value will
624+be used in addition to the wireless device MAC address to function as a password
625+that disallows unpriviledged actors to wake up the device.
626+
627+Example:
628+
629+```
630+ $ snap set network-manager wifi.wake-on-wlan-password=MyPassword
631+```
632+
633+## Per Connection Configuration
634+
635+To configure WoWLAN per connection you have to use the *nmcli* utility which comes
636+with the NetworkManager snap. It allows you to configure the same two options
637+as the snap accepts. However, the *wifi.wake-on-wlan* option takes a numeric value
638+instead of a textual one.
639+
640+The *wifi.wake-on-wlan* option accepts the following values (see above for a detailed
641+description of each value)
642+
643+ * **0:** disabled
644+ * **1:** Use global default configuration
645+ * **2:** any
646+ * **4:** disconnect
647+ * **8:** magic
648+ * **16:** gtk-rekey-failure
649+ * **32:** 4way-handshake
650+ * **128:** rfkill-release
651+ * **256:** tcp
652+
653+The *wifi.wake-on-wlan-password* option accepts the same values as the snap
654+configuration option.
655+
656+Example:
657+
658+```
659+ $ nmcli c modify my-connection wifi.wake-on-wlan 2
660+ $ nmcli c modify my-connection wifi.wake-on-wlan-password Test1234
661+```
662+
663+## Verify WoWLAN Configuration
664+
665+NetworkManager will use the kernel to configure WoWLAN on the hardware level.
666+The *iw* utility provides a simple way to verify the right option is configured.
667+
668+If you don't have the *iw* utility on your system you can install it with the
669+*wireless-tools* snap.
670+
671+```
672+ $ snap install --devmode wireless-tools
673+ $ sudo wireless-tools.iw phy phy0 wowlan show
674+ WoWLAN is enabled:
675+ * wake up on magic packet
676+```
677+
678+See the help output of the *iw* command for more documentation and available
679+options.
680diff --git a/hooks/configure b/hooks/configure
681new file mode 100755
682index 0000000..711ff60
683--- /dev/null
684+++ b/hooks/configure
685@@ -0,0 +1,98 @@
686+#!/bin/bash
687+
688+switch_wifi_powersave() {
689+ path=$SNAP_DATA/conf.d/wifi-powersave.conf
690+ # See https://developer.gnome.org/libnm/stable/NMSettingWireless.html#NMSettingWirelessPowersave
691+ # for the meaning of the different values for the wifi.powersave option.
692+ case $1 in
693+ enabled)
694+ cat <<EOF > $path
695+[connection]
696+wifi.powersave = 3
697+EOF
698+ ;;
699+ disabled)
700+ cat <<EOF > $path
701+[connection]
702+wifi.powersave = 2
703+EOF
704+ ;;
705+ *)
706+ echo "WARNING: invalid value '$1' supplied for wifi.powersave configuration option"
707+ exit 1
708+ ;;
709+ esac
710+}
711+
712+switch_wifi_wake_on_wlan() {
713+ value=0
714+ # See `man nm-settings` for details about those values. They
715+ # correspond to the enum NMSettingWirelessWakeOnWLan defined
716+ # in libnm-core. NetworkManager only allows us to set integer
717+ # values here.
718+ case "$1" in
719+ disabled)
720+ value=0
721+ ;;
722+ any)
723+ value=2
724+ ;;
725+ disconnect)
726+ value=4
727+ ;;
728+ magic)
729+ value=8
730+ ;;
731+ gtk-rekey-failure)
732+ value=16
733+ ;;
734+ eap-identity-request)
735+ value=32
736+ ;;
737+ 4way-handshake)
738+ value=64
739+ ;;
740+ rfkill-release)
741+ value=128
742+ ;;
743+ tcp)
744+ value=256
745+ ;;
746+ *)
747+ echo "ERROR: Invalid value provided for wifi.wake-on-wlan"
748+ exit 1
749+ ;;
750+ esac
751+ password=$2
752+ path=$SNAP_DATA/conf.d/wifi-wowlan.conf
753+
754+ echo "[connection]" > $path
755+ # If we don't get a value provided there is no one set in the snap
756+ # configuration and we can simply leave it out here and let
757+ # NetworkManager take its default one.
758+ if [ -n "$value" ]; then
759+ echo "wifi.wake-on-wlan=$value" >> $path
760+ fi
761+ if [ -n "$password" ]; then
762+ echo "wifi.wake-on-wlan-password=$password" >> $path
763+ fi
764+}
765+
766+value="`snapctl get wifi.powersave`"
767+if [ -n "$value" ]; then
768+ switch_wifi_powersave $value
769+else
770+ default="disabled"
771+ snapctl set wifi.powersave=$default
772+ switch_wifi_powersave $default
773+fi
774+
775+value=`snapctl get wifi.wake-on-wlan`
776+password=`snapctl get wifi.wake-on-wlan-password`
777+if [ -n "$value" ] || [ -n "$password" ]; then
778+ switch_wifi_wake_on_wlan $value "$password"
779+else
780+ snapctl set wifi.wake-on-wlan=disabled
781+ snapctl set wifi.wake-on-wlan-password=
782+ switch_wifi_wake_on_wlan disabled ""
783+fi
784diff --git a/run-tests.sh b/run-tests.sh
785index b4ce91b..ff36c9b 100755
786--- a/run-tests.sh
787+++ b/run-tests.sh
788@@ -1,4 +1,8 @@
789+<<<<<<< run-tests.sh
790 #!/bin/sh
791+=======
792+#!/bin/bash
793+>>>>>>> run-tests.sh
794 #
795 # Copyright (C) 2016 Canonical Ltd
796 #
797@@ -14,6 +18,7 @@
798 # You should have received a copy of the GNU General Public License
799 # along with this program. If not, see <http://www.gnu.org/licenses/>.
800
801+<<<<<<< run-tests.sh
802 set -ex
803
804 image_name=ubuntu-core-16.img
805@@ -21,10 +26,18 @@ channel=stable
806 spread_opts=
807 force_new_image=0
808 test_from_channel=0
809+=======
810+set -e
811+
812+# ==============================================================================
813+# This has to be in sync with the tests-extras/run-tests.sh script
814+# functionalities.
815+>>>>>>> run-tests.sh
816
817 show_help() {
818 echo "Usage: run-tests.sh [OPTIONS]"
819 echo
820+<<<<<<< run-tests.sh
821 echo "optional arguments:"
822 echo " --help Show this help message and exit"
823 echo " --channel=<channel> Select another channel to build the base image from (default: $channel)"
824@@ -82,3 +95,53 @@ if [ $test_from_channel -eq 1 ] ; then
825 export SNAP_CHANNEL=$channel
826 fi
827 spread $spread_opts
828+=======
829+ echo "This is fetch & forget script and what it does is to fetch the"
830+ echo "tests-extras repository and execute the run-tests.sh script from"
831+ echo "there passing arguments as-is."
832+ echo
833+ echo "optional arguments:"
834+ echo " --help Show this help message and exit"
835+ echo " --channel Select another channel to build the base image from (default: stable)"
836+ echo " --snap Extra snap to install"
837+ echo " --debug Enable verbose debugging output"
838+ echo " --test-from-channel Pull network-manager snap from the specified channel instead of building it from source"
839+ echo " --force-new-image Force generating a new image used for testing"
840+}
841+
842+# ==============================================================================
843+# This is fetch & forget script and what it does is to fetch the tests-extras
844+# repo and execute the run-tests.sh script from there passing arguments as-is.
845+
846+# 0. Display help w/o fetching anything
847+
848+if [ "$1" == "--help" ]; then
849+ show_help
850+ exit 0
851+fi
852+
853+# 1. Fetch
854+
855+TESTS_EXTRAS_URL="https://git.launchpad.net/~snappy-hwe-team/snappy-hwe-snaps/+git/tests-extras"
856+TESTS_EXTRAS_PATH="tests-extras"
857+
858+# delete the fetched content on ctrl-c
859+trap 'cd .. && if [ -d "$TESTS_EXTRAS_PATH" ]; then rm -rf $TESTS_EXTRAS_PATH; fi' INT TERM EXIT
860+
861+if [ -d "$TESTS_EXTRAS_PATH" ]; then
862+ rm -rf $TESTS_EXTRAS_PATH
863+fi
864+
865+echo "INFO: Fetching tests-extras scripts into $TESTS_EXTRAS_PATH ..."
866+(git clone -b master $TESTS_EXTRAS_URL $TESTS_EXTRAS_PATH >/dev/null 2>&1)
867+if [ $? -ne 0 ]; then
868+ echo "ERROR: Failed to fetch the $TESTS_EXTRAS_URL repo, exiting.."
869+ exit 1
870+fi
871+
872+# 2. Execute
873+cd $TESTS_EXTRAS_PATH && ./tests-runner.sh $@
874+
875+# 3. Done; clean-up
876+cd .. && if [ -d "$TESTS_EXTRAS_PATH" ]; then rm -rf $TESTS_EXTRAS_PATH; fi
877+>>>>>>> run-tests.sh
878diff --git a/setup/gui/icon.svg b/setup/gui/icon.svg
879new file mode 100644
880index 0000000..019ffb2
881--- /dev/null
882+++ b/setup/gui/icon.svg
883@@ -0,0 +1,2466 @@
884+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
885+<!-- Created with Inkscape (http://www.inkscape.org/) -->
886+<svg
887+ xmlns:dc="http://purl.org/dc/elements/1.1/"
888+ xmlns:cc="http://web.resource.org/cc/"
889+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
890+ xmlns:svg="http://www.w3.org/2000/svg"
891+ xmlns="http://www.w3.org/2000/svg"
892+ xmlns:xlink="http://www.w3.org/1999/xlink"
893+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
894+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
895+ width="48.000000px"
896+ height="48.000000px"
897+ id="svg2327"
898+ sodipodi:version="0.32"
899+ inkscape:version="0.45"
900+ sodipodi:docbase="/home/dobey/Projects/gnome-icon-theme/scalable/status"
901+ sodipodi:docname="network-idle.svg"
902+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
903+ <defs
904+ id="defs3">
905+ <linearGradient
906+ id="linearGradient7670">
907+ <stop
908+ style="stop-color:#3465a4;stop-opacity:1"
909+ offset="0"
910+ id="stop7672" />
911+ <stop
912+ style="stop-color:#204a87;stop-opacity:1"
913+ offset="1"
914+ id="stop7674" />
915+ </linearGradient>
916+ <linearGradient
917+ inkscape:collect="always"
918+ id="linearGradient2307">
919+ <stop
920+ style="stop-color:#5a7aa4;stop-opacity:1;"
921+ offset="0"
922+ id="stop2309" />
923+ <stop
924+ style="stop-color:#5a7aa4;stop-opacity:0;"
925+ offset="1"
926+ id="stop2311" />
927+ </linearGradient>
928+ <linearGradient
929+ id="linearGradient11400">
930+ <stop
931+ id="stop11402"
932+ offset="0"
933+ style="stop-color:#000000;stop-opacity:1;" />
934+ <stop
935+ id="stop11404"
936+ offset="1"
937+ style="stop-color:#000000;stop-opacity:0;" />
938+ </linearGradient>
939+ <linearGradient
940+ id="linearGradient6240"
941+ inkscape:collect="always">
942+ <stop
943+ id="stop6242"
944+ offset="0"
945+ style="stop-color:#ffffff;stop-opacity:1;" />
946+ <stop
947+ id="stop6244"
948+ offset="1"
949+ style="stop-color:#ffffff;stop-opacity:0;" />
950+ </linearGradient>
951+ <linearGradient
952+ id="linearGradient5137">
953+ <stop
954+ id="stop5139"
955+ offset="0"
956+ style="stop-color:#eeeeec;stop-opacity:1;" />
957+ <stop
958+ id="stop5141"
959+ offset="1"
960+ style="stop-color:#e6e6e3;stop-opacity:1;" />
961+ </linearGradient>
962+ <linearGradient
963+ id="linearGradient5225"
964+ inkscape:collect="always">
965+ <stop
966+ id="stop5227"
967+ offset="0"
968+ style="stop-color:black;stop-opacity:1;" />
969+ <stop
970+ id="stop5229"
971+ offset="1"
972+ style="stop-color:black;stop-opacity:0;" />
973+ </linearGradient>
974+ <linearGradient
975+ id="linearGradient3899"
976+ inkscape:collect="always">
977+ <stop
978+ id="stop3901"
979+ offset="0"
980+ style="stop-color:#eeeeec" />
981+ <stop
982+ id="stop3903"
983+ offset="1"
984+ style="stop-color:#d3d7cf" />
985+ </linearGradient>
986+ <linearGradient
987+ id="linearGradient3907">
988+ <stop
989+ id="stop3909"
990+ offset="0"
991+ style="stop-color:#ffffff;stop-opacity:1;" />
992+ <stop
993+ id="stop3911"
994+ offset="1"
995+ style="stop-color:#ffffff;stop-opacity:0;" />
996+ </linearGradient>
997+ <linearGradient
998+ id="linearGradient4196">
999+ <stop
1000+ id="stop4198"
1001+ offset="0"
1002+ style="stop-color:black;stop-opacity:1;" />
1003+ <stop
1004+ id="stop4200"
1005+ offset="1"
1006+ style="stop-color:black;stop-opacity:0;" />
1007+ </linearGradient>
1008+ <linearGradient
1009+ inkscape:collect="always"
1010+ id="linearGradient5060">
1011+ <stop
1012+ style="stop-color:black;stop-opacity:1;"
1013+ offset="0"
1014+ id="stop5062" />
1015+ <stop
1016+ style="stop-color:black;stop-opacity:0;"
1017+ offset="1"
1018+ id="stop5064" />
1019+ </linearGradient>
1020+ <radialGradient
1021+ r="19.5"
1022+ fy="47.045319"
1023+ fx="20.913568"
1024+ cy="47.045319"
1025+ cx="20.913568"
1026+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1027+ gradientUnits="userSpaceOnUse"
1028+ id="radialGradient3304"
1029+ xlink:href="#linearGradient3907"
1030+ inkscape:collect="always" />
1031+ <radialGradient
1032+ r="19.5"
1033+ fy="47.045319"
1034+ fx="20.913568"
1035+ cy="47.045319"
1036+ cx="20.913568"
1037+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1038+ gradientUnits="userSpaceOnUse"
1039+ id="radialGradient3302"
1040+ xlink:href="#linearGradient3907"
1041+ inkscape:collect="always" />
1042+ <radialGradient
1043+ r="19.5"
1044+ fy="47.045319"
1045+ fx="20.913568"
1046+ cy="47.045319"
1047+ cx="20.913568"
1048+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1049+ gradientUnits="userSpaceOnUse"
1050+ id="radialGradient3300"
1051+ xlink:href="#linearGradient3907"
1052+ inkscape:collect="always" />
1053+ <radialGradient
1054+ r="19.5"
1055+ fy="47.045319"
1056+ fx="20.913568"
1057+ cy="47.045319"
1058+ cx="20.913568"
1059+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1060+ gradientUnits="userSpaceOnUse"
1061+ id="radialGradient3298"
1062+ xlink:href="#linearGradient3907"
1063+ inkscape:collect="always" />
1064+ <radialGradient
1065+ r="19.5"
1066+ fy="47.045319"
1067+ fx="20.913568"
1068+ cy="47.045319"
1069+ cx="20.913568"
1070+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1071+ gradientUnits="userSpaceOnUse"
1072+ id="radialGradient3296"
1073+ xlink:href="#linearGradient3907"
1074+ inkscape:collect="always" />
1075+ <radialGradient
1076+ r="19.5"
1077+ fy="47.045319"
1078+ fx="20.913568"
1079+ cy="47.045319"
1080+ cx="20.913568"
1081+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1082+ gradientUnits="userSpaceOnUse"
1083+ id="radialGradient3294"
1084+ xlink:href="#linearGradient3907"
1085+ inkscape:collect="always" />
1086+ <radialGradient
1087+ r="19.5"
1088+ fy="47.045319"
1089+ fx="20.913568"
1090+ cy="47.045319"
1091+ cx="20.913568"
1092+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1093+ gradientUnits="userSpaceOnUse"
1094+ id="radialGradient3292"
1095+ xlink:href="#linearGradient3907"
1096+ inkscape:collect="always" />
1097+ <radialGradient
1098+ r="19.5"
1099+ fy="47.045319"
1100+ fx="20.913568"
1101+ cy="47.045319"
1102+ cx="20.913568"
1103+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1104+ gradientUnits="userSpaceOnUse"
1105+ id="radialGradient3276"
1106+ xlink:href="#linearGradient3907"
1107+ inkscape:collect="always" />
1108+ <radialGradient
1109+ r="19.5"
1110+ fy="47.045319"
1111+ fx="20.913568"
1112+ cy="47.045319"
1113+ cx="20.913568"
1114+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1115+ gradientUnits="userSpaceOnUse"
1116+ id="radialGradient3274"
1117+ xlink:href="#linearGradient3907"
1118+ inkscape:collect="always" />
1119+ <radialGradient
1120+ r="19.5"
1121+ fy="47.045319"
1122+ fx="20.913568"
1123+ cy="47.045319"
1124+ cx="20.913568"
1125+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1126+ gradientUnits="userSpaceOnUse"
1127+ id="radialGradient3272"
1128+ xlink:href="#linearGradient3907"
1129+ inkscape:collect="always" />
1130+ <radialGradient
1131+ r="19.5"
1132+ fy="47.045319"
1133+ fx="20.913568"
1134+ cy="47.045319"
1135+ cx="20.913568"
1136+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1137+ gradientUnits="userSpaceOnUse"
1138+ id="radialGradient3270"
1139+ xlink:href="#linearGradient3907"
1140+ inkscape:collect="always" />
1141+ <radialGradient
1142+ r="19.5"
1143+ fy="47.045319"
1144+ fx="20.913568"
1145+ cy="47.045319"
1146+ cx="20.913568"
1147+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1148+ gradientUnits="userSpaceOnUse"
1149+ id="radialGradient3268"
1150+ xlink:href="#linearGradient3907"
1151+ inkscape:collect="always" />
1152+ <radialGradient
1153+ r="19.5"
1154+ fy="47.045319"
1155+ fx="20.913568"
1156+ cy="47.045319"
1157+ cx="20.913568"
1158+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1159+ gradientUnits="userSpaceOnUse"
1160+ id="radialGradient3266"
1161+ xlink:href="#linearGradient3907"
1162+ inkscape:collect="always" />
1163+ <radialGradient
1164+ r="19.5"
1165+ fy="47.045319"
1166+ fx="20.913568"
1167+ cy="47.045319"
1168+ cx="20.913568"
1169+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1170+ gradientUnits="userSpaceOnUse"
1171+ id="radialGradient3264"
1172+ xlink:href="#linearGradient3907"
1173+ inkscape:collect="always" />
1174+ <radialGradient
1175+ r="19.5"
1176+ fy="47.045319"
1177+ fx="20.913568"
1178+ cy="47.045319"
1179+ cx="20.913568"
1180+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1181+ gradientUnits="userSpaceOnUse"
1182+ id="radialGradient3155"
1183+ xlink:href="#linearGradient3907"
1184+ inkscape:collect="always" />
1185+ <radialGradient
1186+ r="19.5"
1187+ fy="47.045319"
1188+ fx="20.913568"
1189+ cy="47.045319"
1190+ cx="20.913568"
1191+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1192+ gradientUnits="userSpaceOnUse"
1193+ id="radialGradient3158"
1194+ xlink:href="#linearGradient3907"
1195+ inkscape:collect="always" />
1196+ <radialGradient
1197+ r="19.5"
1198+ fy="47.045319"
1199+ fx="20.913568"
1200+ cy="47.045319"
1201+ cx="20.913568"
1202+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1203+ gradientUnits="userSpaceOnUse"
1204+ id="radialGradient3161"
1205+ xlink:href="#linearGradient3907"
1206+ inkscape:collect="always" />
1207+ <radialGradient
1208+ r="19.5"
1209+ fy="47.045319"
1210+ fx="20.913568"
1211+ cy="47.045319"
1212+ cx="20.913568"
1213+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1214+ gradientUnits="userSpaceOnUse"
1215+ id="radialGradient3164"
1216+ xlink:href="#linearGradient3907"
1217+ inkscape:collect="always" />
1218+ <radialGradient
1219+ r="19.5"
1220+ fy="47.045319"
1221+ fx="20.913568"
1222+ cy="47.045319"
1223+ cx="20.913568"
1224+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1225+ gradientUnits="userSpaceOnUse"
1226+ id="radialGradient3167"
1227+ xlink:href="#linearGradient3907"
1228+ inkscape:collect="always" />
1229+ <radialGradient
1230+ r="19.5"
1231+ fy="47.045319"
1232+ fx="20.913568"
1233+ cy="47.045319"
1234+ cx="20.913568"
1235+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1236+ gradientUnits="userSpaceOnUse"
1237+ id="radialGradient3170"
1238+ xlink:href="#linearGradient3907"
1239+ inkscape:collect="always" />
1240+ <radialGradient
1241+ r="19.5"
1242+ fy="47.045319"
1243+ fx="20.913568"
1244+ cy="47.045319"
1245+ cx="20.913568"
1246+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1247+ gradientUnits="userSpaceOnUse"
1248+ id="radialGradient3173"
1249+ xlink:href="#linearGradient3907"
1250+ inkscape:collect="always" />
1251+ <radialGradient
1252+ r="19.5"
1253+ fy="47.045319"
1254+ fx="20.913568"
1255+ cy="47.045319"
1256+ cx="20.913568"
1257+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1258+ gradientUnits="userSpaceOnUse"
1259+ id="radialGradient3176"
1260+ xlink:href="#linearGradient3907"
1261+ inkscape:collect="always" />
1262+ <radialGradient
1263+ r="19.5"
1264+ fy="47.045319"
1265+ fx="20.913568"
1266+ cy="47.045319"
1267+ cx="20.913568"
1268+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1269+ gradientUnits="userSpaceOnUse"
1270+ id="radialGradient3182"
1271+ xlink:href="#linearGradient3907"
1272+ inkscape:collect="always" />
1273+ <radialGradient
1274+ r="19.5"
1275+ fy="47.045319"
1276+ fx="20.913568"
1277+ cy="47.045319"
1278+ cx="20.913568"
1279+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1280+ gradientUnits="userSpaceOnUse"
1281+ id="radialGradient3185"
1282+ xlink:href="#linearGradient3907"
1283+ inkscape:collect="always" />
1284+ <radialGradient
1285+ r="19.5"
1286+ fy="47.045319"
1287+ fx="20.913568"
1288+ cy="47.045319"
1289+ cx="20.913568"
1290+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1291+ gradientUnits="userSpaceOnUse"
1292+ id="radialGradient3188"
1293+ xlink:href="#linearGradient3907"
1294+ inkscape:collect="always" />
1295+ <radialGradient
1296+ r="19.5"
1297+ fy="47.045319"
1298+ fx="20.913568"
1299+ cy="47.045319"
1300+ cx="20.913568"
1301+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1302+ gradientUnits="userSpaceOnUse"
1303+ id="radialGradient3191"
1304+ xlink:href="#linearGradient3907"
1305+ inkscape:collect="always" />
1306+ <radialGradient
1307+ r="19.5"
1308+ fy="47.045319"
1309+ fx="20.913568"
1310+ cy="47.045319"
1311+ cx="20.913568"
1312+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1313+ gradientUnits="userSpaceOnUse"
1314+ id="radialGradient3194"
1315+ xlink:href="#linearGradient3907"
1316+ inkscape:collect="always" />
1317+ <radialGradient
1318+ r="19.5"
1319+ fy="47.045319"
1320+ fx="20.913568"
1321+ cy="47.045319"
1322+ cx="20.913568"
1323+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1324+ gradientUnits="userSpaceOnUse"
1325+ id="radialGradient3197"
1326+ xlink:href="#linearGradient3907"
1327+ inkscape:collect="always" />
1328+ <radialGradient
1329+ r="19.5"
1330+ fy="47.045319"
1331+ fx="20.913568"
1332+ cy="47.045319"
1333+ cx="20.913568"
1334+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1335+ gradientUnits="userSpaceOnUse"
1336+ id="radialGradient3200"
1337+ xlink:href="#linearGradient3907"
1338+ inkscape:collect="always" />
1339+ <radialGradient
1340+ r="19.5"
1341+ fy="47.045319"
1342+ fx="20.913568"
1343+ cy="47.045319"
1344+ cx="20.913568"
1345+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1346+ gradientUnits="userSpaceOnUse"
1347+ id="radialGradient3203"
1348+ xlink:href="#linearGradient3907"
1349+ inkscape:collect="always" />
1350+ <radialGradient
1351+ r="19.5"
1352+ fy="47.045319"
1353+ fx="20.913568"
1354+ cy="47.045319"
1355+ cx="20.913568"
1356+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1357+ gradientUnits="userSpaceOnUse"
1358+ id="radialGradient3206"
1359+ xlink:href="#linearGradient3907"
1360+ inkscape:collect="always" />
1361+ <radialGradient
1362+ r="19.5"
1363+ fy="47.045319"
1364+ fx="20.913568"
1365+ cy="47.045319"
1366+ cx="20.913568"
1367+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1368+ gradientUnits="userSpaceOnUse"
1369+ id="radialGradient3209"
1370+ xlink:href="#linearGradient3907"
1371+ inkscape:collect="always" />
1372+ <radialGradient
1373+ r="19.5"
1374+ fy="47.045319"
1375+ fx="20.913568"
1376+ cy="47.045319"
1377+ cx="20.913568"
1378+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1379+ gradientUnits="userSpaceOnUse"
1380+ id="radialGradient3212"
1381+ xlink:href="#linearGradient3907"
1382+ inkscape:collect="always" />
1383+ <radialGradient
1384+ r="19.5"
1385+ fy="47.045319"
1386+ fx="20.913568"
1387+ cy="47.045319"
1388+ cx="20.913568"
1389+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1390+ gradientUnits="userSpaceOnUse"
1391+ id="radialGradient3215"
1392+ xlink:href="#linearGradient3907"
1393+ inkscape:collect="always" />
1394+ <radialGradient
1395+ r="19.5"
1396+ fy="47.045319"
1397+ fx="20.913568"
1398+ cy="47.045319"
1399+ cx="20.913568"
1400+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1401+ gradientUnits="userSpaceOnUse"
1402+ id="radialGradient3218"
1403+ xlink:href="#linearGradient3907"
1404+ inkscape:collect="always" />
1405+ <radialGradient
1406+ r="19.5"
1407+ fy="47.045319"
1408+ fx="20.913568"
1409+ cy="47.045319"
1410+ cx="20.913568"
1411+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1412+ gradientUnits="userSpaceOnUse"
1413+ id="radialGradient3221"
1414+ xlink:href="#linearGradient3907"
1415+ inkscape:collect="always" />
1416+ <radialGradient
1417+ r="19.5"
1418+ fy="47.045319"
1419+ fx="20.913568"
1420+ cy="47.045319"
1421+ cx="20.913568"
1422+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1423+ gradientUnits="userSpaceOnUse"
1424+ id="radialGradient3224"
1425+ xlink:href="#linearGradient3907"
1426+ inkscape:collect="always" />
1427+ <radialGradient
1428+ r="19.5"
1429+ fy="47.045319"
1430+ fx="20.913568"
1431+ cy="47.045319"
1432+ cx="20.913568"
1433+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1434+ gradientUnits="userSpaceOnUse"
1435+ id="radialGradient3230"
1436+ xlink:href="#linearGradient3907"
1437+ inkscape:collect="always" />
1438+ <radialGradient
1439+ r="19.5"
1440+ fy="47.045319"
1441+ fx="20.913568"
1442+ cy="47.045319"
1443+ cx="20.913568"
1444+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1445+ gradientUnits="userSpaceOnUse"
1446+ id="radialGradient3233"
1447+ xlink:href="#linearGradient3907"
1448+ inkscape:collect="always" />
1449+ <radialGradient
1450+ r="19.5"
1451+ fy="47.045319"
1452+ fx="20.913568"
1453+ cy="47.045319"
1454+ cx="20.913568"
1455+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1456+ gradientUnits="userSpaceOnUse"
1457+ id="radialGradient3236"
1458+ xlink:href="#linearGradient3907"
1459+ inkscape:collect="always" />
1460+ <radialGradient
1461+ r="19.5"
1462+ fy="47.045319"
1463+ fx="20.913568"
1464+ cy="47.045319"
1465+ cx="20.913568"
1466+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1467+ gradientUnits="userSpaceOnUse"
1468+ id="radialGradient3239"
1469+ xlink:href="#linearGradient3907"
1470+ inkscape:collect="always" />
1471+ <radialGradient
1472+ r="19.5"
1473+ fy="47.045319"
1474+ fx="20.913568"
1475+ cy="47.045319"
1476+ cx="20.913568"
1477+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1478+ gradientUnits="userSpaceOnUse"
1479+ id="radialGradient3242"
1480+ xlink:href="#linearGradient3907"
1481+ inkscape:collect="always" />
1482+ <radialGradient
1483+ r="19.5"
1484+ fy="47.045319"
1485+ fx="20.913568"
1486+ cy="47.045319"
1487+ cx="20.913568"
1488+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1489+ gradientUnits="userSpaceOnUse"
1490+ id="radialGradient3245"
1491+ xlink:href="#linearGradient3907"
1492+ inkscape:collect="always" />
1493+ <radialGradient
1494+ r="19.5"
1495+ fy="47.045319"
1496+ fx="20.913568"
1497+ cy="47.045319"
1498+ cx="20.913568"
1499+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1500+ gradientUnits="userSpaceOnUse"
1501+ id="radialGradient3248"
1502+ xlink:href="#linearGradient3907"
1503+ inkscape:collect="always" />
1504+ <linearGradient
1505+ gradientTransform="matrix(0.647995,0,0,0.707655,0.734249,-1.447571)"
1506+ gradientUnits="userSpaceOnUse"
1507+ y2="37.9375"
1508+ x2="29.125"
1509+ y1="46.029419"
1510+ x1="29.5"
1511+ id="linearGradient3905"
1512+ xlink:href="#linearGradient3899"
1513+ inkscape:collect="always" />
1514+ <radialGradient
1515+ r="117.14286"
1516+ fy="486.64789"
1517+ fx="605.71429"
1518+ cy="486.64789"
1519+ cx="605.71429"
1520+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
1521+ gradientUnits="userSpaceOnUse"
1522+ id="radialGradient2309"
1523+ xlink:href="#linearGradient5060"
1524+ inkscape:collect="always" />
1525+ <radialGradient
1526+ r="117.14286"
1527+ fy="486.64789"
1528+ fx="605.71429"
1529+ cy="486.64789"
1530+ cx="605.71429"
1531+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
1532+ gradientUnits="userSpaceOnUse"
1533+ id="radialGradient2311"
1534+ xlink:href="#linearGradient5060"
1535+ inkscape:collect="always" />
1536+ <linearGradient
1537+ gradientTransform="matrix(0.664512,0,0,0.651253,9.569506e-2,-1.210023)"
1538+ gradientUnits="userSpaceOnUse"
1539+ y2="26.039215"
1540+ x2="20.156862"
1541+ y1="5.0996137"
1542+ x1="20.156862"
1543+ id="linearGradient6246"
1544+ xlink:href="#linearGradient6240"
1545+ inkscape:collect="always" />
1546+ <radialGradient
1547+ gradientUnits="userSpaceOnUse"
1548+ gradientTransform="matrix(0.836315,0,0,0.514216,-4.024721,-3.259613e-2)"
1549+ r="19.00016"
1550+ fy="32.997028"
1551+ fx="24.006104"
1552+ cy="32.997028"
1553+ cx="24.006104"
1554+ id="radialGradient5239"
1555+ xlink:href="#linearGradient7670"
1556+ inkscape:collect="always" />
1557+ <linearGradient
1558+ gradientTransform="matrix(0.648248,0,0,0.644253,0.433189,-0.740991)"
1559+ y2="38.876041"
1560+ x2="39.904388"
1561+ y1="6.3760414"
1562+ x1="17.247635"
1563+ gradientUnits="userSpaceOnUse"
1564+ id="linearGradient5147"
1565+ xlink:href="#linearGradient5137"
1566+ inkscape:collect="always" />
1567+ <linearGradient
1568+ y2="43.82579"
1569+ x2="31.86105"
1570+ y1="37.842293"
1571+ x1="31.743324"
1572+ gradientTransform="matrix(1,0,0,0.992781,0,-2.718035)"
1573+ gradientUnits="userSpaceOnUse"
1574+ id="linearGradient2308"
1575+ xlink:href="#linearGradient5137"
1576+ inkscape:collect="always" />
1577+ <linearGradient
1578+ y2="40.219608"
1579+ x2="23.529411"
1580+ y1="34.572548"
1581+ x1="23.154902"
1582+ gradientTransform="matrix(1.004187,0,0,1,-0.12454,-3.011765)"
1583+ gradientUnits="userSpaceOnUse"
1584+ id="linearGradient2310"
1585+ xlink:href="#linearGradient11400"
1586+ inkscape:collect="always" />
1587+ <linearGradient
1588+ gradientTransform="matrix(0.654255,0,0,0.654672,-0.481383,0.690637)"
1589+ gradientUnits="userSpaceOnUse"
1590+ y2="33.637787"
1591+ x2="37.295498"
1592+ y1="38.267769"
1593+ x1="37.484837"
1594+ id="linearGradient4202"
1595+ xlink:href="#linearGradient4196"
1596+ inkscape:collect="always" />
1597+ <radialGradient
1598+ r="23.75956"
1599+ fy="42.6875"
1600+ fx="23.9375"
1601+ cy="42.6875"
1602+ cx="23.9375"
1603+ gradientTransform="matrix(1,0,0,0.24763,0,32.1168)"
1604+ gradientUnits="userSpaceOnUse"
1605+ id="radialGradient2313"
1606+ xlink:href="#linearGradient5225"
1607+ inkscape:collect="always" />
1608+ <linearGradient
1609+ inkscape:collect="always"
1610+ xlink:href="#linearGradient2307"
1611+ id="linearGradient5478"
1612+ gradientTransform="scale(1.673466,0.597562)"
1613+ x1="-931.7503"
1614+ y1="148.07116"
1615+ x2="-131.23588"
1616+ y2="148.07116"
1617+ gradientUnits="userSpaceOnUse" />
1618+ <radialGradient
1619+ inkscape:collect="always"
1620+ xlink:href="#linearGradient5225"
1621+ id="radialGradient5620"
1622+ gradientUnits="userSpaceOnUse"
1623+ gradientTransform="matrix(1,0,0,0.24763,0,32.1168)"
1624+ cx="23.9375"
1625+ cy="42.6875"
1626+ fx="23.9375"
1627+ fy="42.6875"
1628+ r="23.75956" />
1629+ <linearGradient
1630+ inkscape:collect="always"
1631+ xlink:href="#linearGradient4196"
1632+ id="linearGradient5622"
1633+ gradientUnits="userSpaceOnUse"
1634+ gradientTransform="matrix(0.654255,0,0,0.654672,-0.481383,0.690637)"
1635+ x1="37.484837"
1636+ y1="38.267769"
1637+ x2="37.295498"
1638+ y2="33.637787" />
1639+ <linearGradient
1640+ inkscape:collect="always"
1641+ xlink:href="#linearGradient5137"
1642+ id="linearGradient5624"
1643+ gradientUnits="userSpaceOnUse"
1644+ gradientTransform="matrix(1,0,0,0.992781,0,-2.718035)"
1645+ x1="31.743324"
1646+ y1="37.842293"
1647+ x2="31.86105"
1648+ y2="43.82579" />
1649+ <linearGradient
1650+ inkscape:collect="always"
1651+ xlink:href="#linearGradient11400"
1652+ id="linearGradient5626"
1653+ gradientUnits="userSpaceOnUse"
1654+ gradientTransform="matrix(1.004187,0,0,1,-0.12454,-3.011765)"
1655+ x1="23.154902"
1656+ y1="34.572548"
1657+ x2="23.529411"
1658+ y2="40.219608" />
1659+ <linearGradient
1660+ inkscape:collect="always"
1661+ xlink:href="#linearGradient5137"
1662+ id="linearGradient5628"
1663+ gradientUnits="userSpaceOnUse"
1664+ gradientTransform="matrix(0.648248,0,0,0.644253,0.433189,-0.740991)"
1665+ x1="17.247635"
1666+ y1="6.3760414"
1667+ x2="39.904388"
1668+ y2="38.876041" />
1669+ <radialGradient
1670+ inkscape:collect="always"
1671+ xlink:href="#linearGradient7670"
1672+ id="radialGradient5630"
1673+ gradientUnits="userSpaceOnUse"
1674+ gradientTransform="matrix(0.836315,0,0,0.514216,-4.024721,-3.259613e-2)"
1675+ cx="24.006104"
1676+ cy="32.997028"
1677+ fx="24.006104"
1678+ fy="32.997028"
1679+ r="19.00016" />
1680+ <linearGradient
1681+ inkscape:collect="always"
1682+ xlink:href="#linearGradient6240"
1683+ id="linearGradient5632"
1684+ gradientUnits="userSpaceOnUse"
1685+ gradientTransform="matrix(0.664512,0,0,0.651253,9.569506e-2,-1.210023)"
1686+ x1="20.156862"
1687+ y1="5.0996137"
1688+ x2="20.156862"
1689+ y2="26.039215" />
1690+ <linearGradient
1691+ inkscape:collect="always"
1692+ xlink:href="#linearGradient2307"
1693+ id="linearGradient5634"
1694+ gradientUnits="userSpaceOnUse"
1695+ gradientTransform="scale(1.673466,0.597562)"
1696+ x1="-931.7503"
1697+ y1="148.07116"
1698+ x2="-131.23588"
1699+ y2="148.07116" />
1700+ <radialGradient
1701+ inkscape:collect="always"
1702+ xlink:href="#linearGradient5060"
1703+ id="radialGradient5636"
1704+ gradientUnits="userSpaceOnUse"
1705+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
1706+ cx="605.71429"
1707+ cy="486.64789"
1708+ fx="605.71429"
1709+ fy="486.64789"
1710+ r="117.14286" />
1711+ <radialGradient
1712+ inkscape:collect="always"
1713+ xlink:href="#linearGradient5060"
1714+ id="radialGradient5638"
1715+ gradientUnits="userSpaceOnUse"
1716+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
1717+ cx="605.71429"
1718+ cy="486.64789"
1719+ fx="605.71429"
1720+ fy="486.64789"
1721+ r="117.14286" />
1722+ <linearGradient
1723+ inkscape:collect="always"
1724+ xlink:href="#linearGradient3899"
1725+ id="linearGradient5640"
1726+ gradientUnits="userSpaceOnUse"
1727+ gradientTransform="matrix(0.647995,0,0,0.707655,0.734249,-1.447571)"
1728+ x1="29.5"
1729+ y1="46.029419"
1730+ x2="29.125"
1731+ y2="37.9375" />
1732+ <radialGradient
1733+ inkscape:collect="always"
1734+ xlink:href="#linearGradient3907"
1735+ id="radialGradient5642"
1736+ gradientUnits="userSpaceOnUse"
1737+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1738+ cx="20.913568"
1739+ cy="47.045319"
1740+ fx="20.913568"
1741+ fy="47.045319"
1742+ r="19.5" />
1743+ <radialGradient
1744+ inkscape:collect="always"
1745+ xlink:href="#linearGradient3907"
1746+ id="radialGradient5644"
1747+ gradientUnits="userSpaceOnUse"
1748+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1749+ cx="20.913568"
1750+ cy="47.045319"
1751+ fx="20.913568"
1752+ fy="47.045319"
1753+ r="19.5" />
1754+ <radialGradient
1755+ inkscape:collect="always"
1756+ xlink:href="#linearGradient3907"
1757+ id="radialGradient5646"
1758+ gradientUnits="userSpaceOnUse"
1759+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1760+ cx="20.913568"
1761+ cy="47.045319"
1762+ fx="20.913568"
1763+ fy="47.045319"
1764+ r="19.5" />
1765+ <radialGradient
1766+ inkscape:collect="always"
1767+ xlink:href="#linearGradient3907"
1768+ id="radialGradient5648"
1769+ gradientUnits="userSpaceOnUse"
1770+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1771+ cx="20.913568"
1772+ cy="47.045319"
1773+ fx="20.913568"
1774+ fy="47.045319"
1775+ r="19.5" />
1776+ <radialGradient
1777+ inkscape:collect="always"
1778+ xlink:href="#linearGradient3907"
1779+ id="radialGradient5650"
1780+ gradientUnits="userSpaceOnUse"
1781+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1782+ cx="20.913568"
1783+ cy="47.045319"
1784+ fx="20.913568"
1785+ fy="47.045319"
1786+ r="19.5" />
1787+ <radialGradient
1788+ inkscape:collect="always"
1789+ xlink:href="#linearGradient3907"
1790+ id="radialGradient5652"
1791+ gradientUnits="userSpaceOnUse"
1792+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1793+ cx="20.913568"
1794+ cy="47.045319"
1795+ fx="20.913568"
1796+ fy="47.045319"
1797+ r="19.5" />
1798+ <radialGradient
1799+ inkscape:collect="always"
1800+ xlink:href="#linearGradient3907"
1801+ id="radialGradient5654"
1802+ gradientUnits="userSpaceOnUse"
1803+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1804+ cx="20.913568"
1805+ cy="47.045319"
1806+ fx="20.913568"
1807+ fy="47.045319"
1808+ r="19.5" />
1809+ <radialGradient
1810+ inkscape:collect="always"
1811+ xlink:href="#linearGradient3907"
1812+ id="radialGradient5656"
1813+ gradientUnits="userSpaceOnUse"
1814+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1815+ cx="20.913568"
1816+ cy="47.045319"
1817+ fx="20.913568"
1818+ fy="47.045319"
1819+ r="19.5" />
1820+ <radialGradient
1821+ inkscape:collect="always"
1822+ xlink:href="#linearGradient3907"
1823+ id="radialGradient5658"
1824+ gradientUnits="userSpaceOnUse"
1825+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1826+ cx="20.913568"
1827+ cy="47.045319"
1828+ fx="20.913568"
1829+ fy="47.045319"
1830+ r="19.5" />
1831+ <radialGradient
1832+ inkscape:collect="always"
1833+ xlink:href="#linearGradient3907"
1834+ id="radialGradient5660"
1835+ gradientUnits="userSpaceOnUse"
1836+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1837+ cx="20.913568"
1838+ cy="47.045319"
1839+ fx="20.913568"
1840+ fy="47.045319"
1841+ r="19.5" />
1842+ <radialGradient
1843+ inkscape:collect="always"
1844+ xlink:href="#linearGradient3907"
1845+ id="radialGradient5662"
1846+ gradientUnits="userSpaceOnUse"
1847+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1848+ cx="20.913568"
1849+ cy="47.045319"
1850+ fx="20.913568"
1851+ fy="47.045319"
1852+ r="19.5" />
1853+ <radialGradient
1854+ inkscape:collect="always"
1855+ xlink:href="#linearGradient3907"
1856+ id="radialGradient5664"
1857+ gradientUnits="userSpaceOnUse"
1858+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1859+ cx="20.913568"
1860+ cy="47.045319"
1861+ fx="20.913568"
1862+ fy="47.045319"
1863+ r="19.5" />
1864+ <radialGradient
1865+ inkscape:collect="always"
1866+ xlink:href="#linearGradient3907"
1867+ id="radialGradient5666"
1868+ gradientUnits="userSpaceOnUse"
1869+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1870+ cx="20.913568"
1871+ cy="47.045319"
1872+ fx="20.913568"
1873+ fy="47.045319"
1874+ r="19.5" />
1875+ <radialGradient
1876+ inkscape:collect="always"
1877+ xlink:href="#linearGradient3907"
1878+ id="radialGradient5668"
1879+ gradientUnits="userSpaceOnUse"
1880+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1881+ cx="20.913568"
1882+ cy="47.045319"
1883+ fx="20.913568"
1884+ fy="47.045319"
1885+ r="19.5" />
1886+ <radialGradient
1887+ inkscape:collect="always"
1888+ xlink:href="#linearGradient3907"
1889+ id="radialGradient5670"
1890+ gradientUnits="userSpaceOnUse"
1891+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1892+ cx="20.913568"
1893+ cy="47.045319"
1894+ fx="20.913568"
1895+ fy="47.045319"
1896+ r="19.5" />
1897+ <radialGradient
1898+ inkscape:collect="always"
1899+ xlink:href="#linearGradient3907"
1900+ id="radialGradient5672"
1901+ gradientUnits="userSpaceOnUse"
1902+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1903+ cx="20.913568"
1904+ cy="47.045319"
1905+ fx="20.913568"
1906+ fy="47.045319"
1907+ r="19.5" />
1908+ <radialGradient
1909+ inkscape:collect="always"
1910+ xlink:href="#linearGradient3907"
1911+ id="radialGradient5674"
1912+ gradientUnits="userSpaceOnUse"
1913+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1914+ cx="20.913568"
1915+ cy="47.045319"
1916+ fx="20.913568"
1917+ fy="47.045319"
1918+ r="19.5" />
1919+ <radialGradient
1920+ inkscape:collect="always"
1921+ xlink:href="#linearGradient3907"
1922+ id="radialGradient5676"
1923+ gradientUnits="userSpaceOnUse"
1924+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1925+ cx="20.913568"
1926+ cy="47.045319"
1927+ fx="20.913568"
1928+ fy="47.045319"
1929+ r="19.5" />
1930+ <radialGradient
1931+ inkscape:collect="always"
1932+ xlink:href="#linearGradient3907"
1933+ id="radialGradient5678"
1934+ gradientUnits="userSpaceOnUse"
1935+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1936+ cx="20.913568"
1937+ cy="47.045319"
1938+ fx="20.913568"
1939+ fy="47.045319"
1940+ r="19.5" />
1941+ <radialGradient
1942+ inkscape:collect="always"
1943+ xlink:href="#linearGradient3907"
1944+ id="radialGradient5680"
1945+ gradientUnits="userSpaceOnUse"
1946+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1947+ cx="20.913568"
1948+ cy="47.045319"
1949+ fx="20.913568"
1950+ fy="47.045319"
1951+ r="19.5" />
1952+ <radialGradient
1953+ inkscape:collect="always"
1954+ xlink:href="#linearGradient3907"
1955+ id="radialGradient5682"
1956+ gradientUnits="userSpaceOnUse"
1957+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1958+ cx="20.913568"
1959+ cy="47.045319"
1960+ fx="20.913568"
1961+ fy="47.045319"
1962+ r="19.5" />
1963+ <radialGradient
1964+ inkscape:collect="always"
1965+ xlink:href="#linearGradient3907"
1966+ id="radialGradient5684"
1967+ gradientUnits="userSpaceOnUse"
1968+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1969+ cx="20.913568"
1970+ cy="47.045319"
1971+ fx="20.913568"
1972+ fy="47.045319"
1973+ r="19.5" />
1974+ <radialGradient
1975+ inkscape:collect="always"
1976+ xlink:href="#linearGradient3907"
1977+ id="radialGradient5686"
1978+ gradientUnits="userSpaceOnUse"
1979+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1980+ cx="20.913568"
1981+ cy="47.045319"
1982+ fx="20.913568"
1983+ fy="47.045319"
1984+ r="19.5" />
1985+ <radialGradient
1986+ inkscape:collect="always"
1987+ xlink:href="#linearGradient3907"
1988+ id="radialGradient5688"
1989+ gradientUnits="userSpaceOnUse"
1990+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1991+ cx="20.913568"
1992+ cy="47.045319"
1993+ fx="20.913568"
1994+ fy="47.045319"
1995+ r="19.5" />
1996+ <radialGradient
1997+ inkscape:collect="always"
1998+ xlink:href="#linearGradient3907"
1999+ id="radialGradient5690"
2000+ gradientUnits="userSpaceOnUse"
2001+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
2002+ cx="20.913568"
2003+ cy="47.045319"
2004+ fx="20.913568"
2005+ fy="47.045319"
2006+ r="19.5" />
2007+ <radialGradient
2008+ inkscape:collect="always"
2009+ xlink:href="#linearGradient3907"
2010+ id="radialGradient5692"
2011+ gradientUnits="userSpaceOnUse"
2012+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
2013+ cx="20.913568"
2014+ cy="47.045319"
2015+ fx="20.913568"
2016+ fy="47.045319"
2017+ r="19.5" />
2018+ <radialGradient
2019+ inkscape:collect="always"
2020+ xlink:href="#linearGradient3907"
2021+ id="radialGradient5694"
2022+ gradientUnits="userSpaceOnUse"
2023+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
2024+ cx="20.913568"
2025+ cy="47.045319"
2026+ fx="20.913568"
2027+ fy="47.045319"
2028+ r="19.5" />
2029+ <radialGradient
2030+ inkscape:collect="always"
2031+ xlink:href="#linearGradient3907"
2032+ id="radialGradient5696"
2033+ gradientUnits="userSpaceOnUse"
2034+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
2035+ cx="20.913568"
2036+ cy="47.045319"
2037+ fx="20.913568"
2038+ fy="47.045319"
2039+ r="19.5" />
2040+ <radialGradient
2041+ inkscape:collect="always"
2042+ xlink:href="#linearGradient3907"
2043+ id="radialGradient5698"
2044+ gradientUnits="userSpaceOnUse"
2045+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
2046+ cx="20.913568"
2047+ cy="47.045319"
2048+ fx="20.913568"
2049+ fy="47.045319"
2050+ r="19.5" />
2051+ <radialGradient
2052+ inkscape:collect="always"
2053+ xlink:href="#linearGradient3907"
2054+ id="radialGradient5700"
2055+ gradientUnits="userSpaceOnUse"
2056+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
2057+ cx="20.913568"
2058+ cy="47.045319"
2059+ fx="20.913568"
2060+ fy="47.045319"
2061+ r="19.5" />
2062+ <radialGradient
2063+ inkscape:collect="always"
2064+ xlink:href="#linearGradient3907"
2065+ id="radialGradient5702"
2066+ gradientUnits="userSpaceOnUse"
2067+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
2068+ cx="20.913568"
2069+ cy="47.045319"
2070+ fx="20.913568"
2071+ fy="47.045319"
2072+ r="19.5" />
2073+ <radialGradient
2074+ inkscape:collect="always"
2075+ xlink:href="#linearGradient3907"
2076+ id="radialGradient5704"
2077+ gradientUnits="userSpaceOnUse"
2078+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
2079+ cx="20.913568"
2080+ cy="47.045319"
2081+ fx="20.913568"
2082+ fy="47.045319"
2083+ r="19.5" />
2084+ <radialGradient
2085+ inkscape:collect="always"
2086+ xlink:href="#linearGradient3907"
2087+ id="radialGradient5706"
2088+ gradientUnits="userSpaceOnUse"
2089+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
2090+ cx="20.913568"
2091+ cy="47.045319"
2092+ fx="20.913568"
2093+ fy="47.045319"
2094+ r="19.5" />
2095+ <radialGradient
2096+ inkscape:collect="always"
2097+ xlink:href="#linearGradient3907"
2098+ id="radialGradient5708"
2099+ gradientUnits="userSpaceOnUse"
2100+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
2101+ cx="20.913568"
2102+ cy="47.045319"
2103+ fx="20.913568"
2104+ fy="47.045319"
2105+ r="19.5" />
2106+ <radialGradient
2107+ inkscape:collect="always"
2108+ xlink:href="#linearGradient3907"
2109+ id="radialGradient5710"
2110+ gradientUnits="userSpaceOnUse"
2111+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
2112+ cx="20.913568"
2113+ cy="47.045319"
2114+ fx="20.913568"
2115+ fy="47.045319"
2116+ r="19.5" />
2117+ <radialGradient
2118+ inkscape:collect="always"
2119+ xlink:href="#linearGradient3907"
2120+ id="radialGradient5712"
2121+ gradientUnits="userSpaceOnUse"
2122+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
2123+ cx="20.913568"
2124+ cy="47.045319"
2125+ fx="20.913568"
2126+ fy="47.045319"
2127+ r="19.5" />
2128+ <radialGradient
2129+ inkscape:collect="always"
2130+ xlink:href="#linearGradient3907"
2131+ id="radialGradient5714"
2132+ gradientUnits="userSpaceOnUse"
2133+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
2134+ cx="20.913568"
2135+ cy="47.045319"
2136+ fx="20.913568"
2137+ fy="47.045319"
2138+ r="19.5" />
2139+ <radialGradient
2140+ inkscape:collect="always"
2141+ xlink:href="#linearGradient3907"
2142+ id="radialGradient5716"
2143+ gradientUnits="userSpaceOnUse"
2144+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
2145+ cx="20.913568"
2146+ cy="47.045319"
2147+ fx="20.913568"
2148+ fy="47.045319"
2149+ r="19.5" />
2150+ <radialGradient
2151+ inkscape:collect="always"
2152+ xlink:href="#linearGradient3907"
2153+ id="radialGradient5718"
2154+ gradientUnits="userSpaceOnUse"
2155+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
2156+ cx="20.913568"
2157+ cy="47.045319"
2158+ fx="20.913568"
2159+ fy="47.045319"
2160+ r="19.5" />
2161+ <radialGradient
2162+ inkscape:collect="always"
2163+ xlink:href="#linearGradient3907"
2164+ id="radialGradient5720"
2165+ gradientUnits="userSpaceOnUse"
2166+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
2167+ cx="20.913568"
2168+ cy="47.045319"
2169+ fx="20.913568"
2170+ fy="47.045319"
2171+ r="19.5" />
2172+ <radialGradient
2173+ inkscape:collect="always"
2174+ xlink:href="#linearGradient3907"
2175+ id="radialGradient5722"
2176+ gradientUnits="userSpaceOnUse"
2177+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
2178+ cx="20.913568"
2179+ cy="47.045319"
2180+ fx="20.913568"
2181+ fy="47.045319"
2182+ r="19.5" />
2183+ <radialGradient
2184+ inkscape:collect="always"
2185+ xlink:href="#linearGradient3907"
2186+ id="radialGradient5724"
2187+ gradientUnits="userSpaceOnUse"
2188+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
2189+ cx="20.913568"
2190+ cy="47.045319"
2191+ fx="20.913568"
2192+ fy="47.045319"
2193+ r="19.5" />
2194+ <radialGradient
2195+ inkscape:collect="always"
2196+ xlink:href="#linearGradient3907"
2197+ id="radialGradient5726"
2198+ gradientUnits="userSpaceOnUse"
2199+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
2200+ cx="20.913568"
2201+ cy="47.045319"
2202+ fx="20.913568"
2203+ fy="47.045319"
2204+ r="19.5" />
2205+ <radialGradient
2206+ inkscape:collect="always"
2207+ xlink:href="#linearGradient3907"
2208+ id="radialGradient5728"
2209+ gradientUnits="userSpaceOnUse"
2210+ gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
2211+ cx="20.913568"
2212+ cy="47.045319"
2213+ fx="20.913568"
2214+ fy="47.045319"
2215+ r="19.5" />
2216+ </defs>
2217+ <sodipodi:namedview
2218+ id="base"
2219+ pagecolor="#ffffff"
2220+ bordercolor="#666"
2221+ borderopacity="1"
2222+ inkscape:pageopacity="0.0"
2223+ inkscape:pageshadow="2"
2224+ inkscape:zoom="1"
2225+ inkscape:cx="47.587693"
2226+ inkscape:cy="-3.0466105"
2227+ inkscape:current-layer="layer1"
2228+ showgrid="false"
2229+ inkscape:grid-bbox="true"
2230+ inkscape:document-units="px"
2231+ inkscape:window-width="1051"
2232+ inkscape:window-height="885"
2233+ inkscape:window-x="0"
2234+ inkscape:window-y="89"
2235+ inkscape:showpageshadow="false"
2236+ inkscape:grid-points="false"
2237+ showborder="false" />
2238+ <metadata
2239+ id="metadata4">
2240+ <rdf:RDF>
2241+ <cc:Work
2242+ rdf:about="">
2243+ <dc:format>image/svg+xml</dc:format>
2244+ <dc:type
2245+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
2246+ <dc:title>Network</dc:title>
2247+ <dc:date>2005-03-08</dc:date>
2248+ <dc:creator>
2249+ <cc:Agent>
2250+ <dc:title>Lapo Calamandrei</dc:title>
2251+ </cc:Agent>
2252+ </dc:creator>
2253+ <dc:subject>
2254+ <rdf:Bag />
2255+ </dc:subject>
2256+ <cc:license
2257+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
2258+ <dc:source />
2259+ <dc:contributor>
2260+ <cc:Agent>
2261+ <dc:title>Jakub Steiner, Luca Ferretti</dc:title>
2262+ </cc:Agent>
2263+ </dc:contributor>
2264+ </cc:Work>
2265+ <cc:License
2266+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
2267+ <cc:permits
2268+ rdf:resource="http://web.resource.org/cc/Reproduction" />
2269+ <cc:permits
2270+ rdf:resource="http://web.resource.org/cc/Distribution" />
2271+ <cc:requires
2272+ rdf:resource="http://web.resource.org/cc/Notice" />
2273+ <cc:requires
2274+ rdf:resource="http://web.resource.org/cc/Attribution" />
2275+ <cc:permits
2276+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
2277+ <cc:requires
2278+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
2279+ </cc:License>
2280+ </rdf:RDF>
2281+ </metadata>
2282+ <g
2283+ id="layer1"
2284+ inkscape:label="Layer 1"
2285+ inkscape:groupmode="layer">
2286+ <g
2287+ id="g5480"
2288+ transform="translate(14.98536,1)">
2289+ <g
2290+ style="display:inline"
2291+ inkscape:label="Layer 1"
2292+ id="g5482" />
2293+ <g
2294+ style="display:inline"
2295+ inkscape:label="tastiera"
2296+ id="g5484">
2297+ <g
2298+ transform="translate(-54,0.18088)"
2299+ inkscape:label="Shadow"
2300+ id="g5486" />
2301+ <g
2302+ id="g5488"
2303+ inkscape:label="Shadow"
2304+ transform="translate(-54,15.24691)" />
2305+ <g
2306+ id="g5490"
2307+ inkscape:label="Lavoro"
2308+ style="display:inline"
2309+ transform="translate(-54,15.24691)" />
2310+ </g>
2311+ <g
2312+ style="display:inline"
2313+ inkscape:label="tasti"
2314+ id="g5492">
2315+ <path
2316+ transform="matrix(0.633479,0,0,0.565504,1.119993,0.201324)"
2317+ d="M 47.69706 42.6875 A 23.75956 5.8835783 0 1 1 0.17794037,42.6875 A 23.75956 5.8835783 0 1 1 47.69706 42.6875 z"
2318+ sodipodi:ry="5.8835783"
2319+ sodipodi:rx="23.75956"
2320+ sodipodi:cy="42.6875"
2321+ sodipodi:cx="23.9375"
2322+ id="path5494"
2323+ style="opacity:0.3;fill:url(#radialGradient5620);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
2324+ sodipodi:type="arc" />
2325+ <path
2326+ style="opacity:0.20786516;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5622);stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
2327+ d="M 27.082936,28.048013 C 21.663366,21.135948 31.947853,26.54939 30.855772,24.153878 C 29.785572,21.806364 17.408039,24.595241 18.709552,20.667209"
2328+ id="path5496"
2329+ sodipodi:nodetypes="czz" />
2330+ <path
2331+ sodipodi:nodetypes="czz"
2332+ id="path5498"
2333+ d="M 26.784723,27.671888 C 21.538638,20.412631 31.520563,26.487432 30.374151,23.604157 C 29.072638,20.330797 18.198646,24.276982 18.806217,20.406815"
2334+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#729fcf;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
2335+ <g
2336+ transform="matrix(0.530612,0,0,0.53095,3.140616,3.404111)"
2337+ id="g5500"
2338+ style="display:inline">
2339+ <path
2340+ sodipodi:nodetypes="csccscc"
2341+ id="path5502"
2342+ d="M 14.375479,32.558794 C 14.375479,32.558794 15.592355,37.45777 10.51915,37.50376 C 8.0888743,37.525507 8.5866723,41.509781 8.5866723,41.509781 L 39.433139,41.478634 C 39.433139,41.478634 39.851577,37.611393 37.410922,37.566053 C 32.423455,37.474579 33.600393,32.496503 33.600393,32.496503 L 14.375479,32.558794 z "
2343+ style="opacity:1;color:black;fill:url(#linearGradient5624);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.88401449;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2344+ <path
2345+ sodipodi:nodetypes="ccccc"
2346+ id="path5504"
2347+ d="M 13.926195,33.027451 C 14.010206,35.2 13.641655,35.938894 12.285731,36.702682 L 36,38 C 35.047008,36.831372 33.660837,35.066666 34.038883,33.011765 L 13.926195,33.027451 z "
2348+ style="opacity:0.5;fill:url(#linearGradient5626);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
2349+ <path
2350+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#8d8d8f;stroke-width:1.88401508px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.43902438"
2351+ d="M 10.436202,38.661601 C 17.000465,38.66357 37.562637,38.661601 37.562637,38.661601"
2352+ id="path5506"
2353+ sodipodi:nodetypes="cc" />
2354+ <path
2355+ sodipodi:nodetypes="cc"
2356+ id="path5508"
2357+ d="M 11.134219,39.660187 C 17.146756,39.662156 36.881517,39.660187 36.881517,39.660187"
2358+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.88401532px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
2359+ </g>
2360+ <path
2361+ sodipodi:nodetypes="ccccccccc"
2362+ id="path5510"
2363+ d="M 3.602229,1.4999996 L 28.319154,1.4999996 C 29.631932,1.4999996 30.588653,2.4197694 30.588653,3.8361498 L 30.595753,20.072828 C 30.595753,21.162945 30.253253,21.499994 29.276792,21.499994 L 2.7228402,21.487795 C 1.9583807,21.469246 1.414291,21.169109 1.404027,20.186855 L 1.4138652,3.7151949 C 1.4138652,2.572403 2.4117826,1.4999996 3.602229,1.4999996 z "
2364+ style="fill:url(#linearGradient5628);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00000036;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
2365+ <rect
2366+ y="3.5000005"
2367+ x="3.4999971"
2368+ height="15.194118"
2369+ width="25.103695"
2370+ id="rect5512"
2371+ style="fill:url(#radialGradient5630);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:0.99999958px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
2372+ <path
2373+ sodipodi:nodetypes="ccccc"
2374+ id="path5514"
2375+ d="M 4.0984042,4.0204313 L 4.0984042,15.748091 C 15.025941,14.866132 19.115514,9.1623492 28,8.5664313 L 28,4 L 4.0984042,4.0204313 z "
2376+ style="opacity:0.5;fill:url(#linearGradient5632);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
2377+ <path
2378+ sodipodi:nodetypes="cccsccscccc"
2379+ id="path5516"
2380+ d="M 4.056094,2.4999991 C 3.2398944,2.4999991 2.4960113,3.2952856 2.4960113,4.0741096 L 2.4960108,19.789734 C 2.4999206,20.160319 2.5869303,20.275382 2.6715202,20.346431 C 2.7561101,20.417479 2.9348114,20.473541 3.2370502,20.480806 L 28.783404,20.500002 C 29.189758,20.500002 29.318189,20.437946 29.368434,20.384824 C 29.418681,20.3317 29.504941,20.138678 29.504941,19.674554 L 29.504942,4.1892884 C 29.504942,3.0791795 28.874178,2.4999991 27.866855,2.4999991 L 4.056094,2.4999991 z "
2381+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
2382+ <g
2383+ id="g5518"
2384+ transform="matrix(1.543206e-2,0,0,1.215502e-2,29.57023,28.01728)"
2385+ style="display:inline">
2386+ <rect
2387+ y="-150.69685"
2388+ x="-1559.2523"
2389+ height="478.35718"
2390+ width="1339.6335"
2391+ id="rect5520"
2392+ style="opacity:0.40206185;color:black;fill:url(#linearGradient5634);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2393+ <path
2394+ sodipodi:nodetypes="cccc"
2395+ id="path5522"
2396+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
2397+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5636);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2398+ <path
2399+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5638);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2400+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
2401+ id="path5524"
2402+ sodipodi:nodetypes="cccc" />
2403+ </g>
2404+ <path
2405+ sodipodi:nodetypes="ccccccccc"
2406+ id="path5526"
2407+ d="M 3.643761,26.504783 L 28.921938,26.504783 C 29.226374,26.504783 29.788645,26.492665 30,27 L 31.5,30 C 31.5625,30.406064 31.487026,31.562501 30,31.562501 L 2.5,31.500001 C 1,31.562501 1.0652178,30.281064 1.0652178,30 L 3,27 C 3.2113561,26.492665 3.3393239,26.504783 3.643761,26.504783 z "
2408+ style="color:black;fill:url(#linearGradient5640);fill-opacity:1;fill-rule:nonzero;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2409+ <path
2410+ sodipodi:nodetypes="ccccccccc"
2411+ id="path5528"
2412+ d="M 4.0955909,27.111942 L 28.49679,27.10614 C 28.788541,27.10614 28.820868,27.10614 29.023418,27.449588 L 30.420658,30.150759 C 30.420658,30.341029 30.185782,30.494207 29.894029,30.494207 L 2.6782341,30.500011 C 2.3864818,30.500011 2.1516056,30.346832 2.1516056,30.156562 L 3.5689622,27.45539 C 3.7715117,27.111942 3.8038386,27.111942 4.0955909,27.111942 z "
2413+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:white;stroke-width:0.99999964;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2414+ <path
2415+ sodipodi:nodetypes="csssssssccssssssssssssccccssscccccccccssssssssssssccsssssssssccccccc"
2416+ id="path5530"
2417+ d="M 4.9039459,26.500588 C 4.9019723,26.502459 4.9057445,26.514939 4.9039459,26.516406 C 4.89444,26.51889 4.8714034,26.528697 4.8616746,26.532224 C 4.8584281,26.533516 4.8437789,26.530815 4.840539,26.532224 C 4.8373165,26.533749 4.8225981,26.546397 4.8194034,26.548041 C 4.8130911,26.551565 4.8043634,26.559861 4.7982678,26.563859 C 4.7952901,26.565977 4.7800294,26.57744 4.7771322,26.579677 C 4.7743261,26.582033 4.7587013,26.593017 4.7559967,26.595495 C 4.7139608,26.641114 4.6696929,26.720423 4.6080475,26.816941 L 3.1646057,29.221226 C 3.1646057,29.224233 3.1644578,29.234029 3.1646057,29.237043 C 3.1648991,29.240062 3.1641691,29.249843 3.1646057,29.25286 C 3.1651831,29.255877 3.1638899,29.265668 3.1646057,29.268679 C 3.1663094,29.274683 3.1835077,29.294359 3.1857413,29.300313 C 3.1869871,29.303274 3.184369,29.31319 3.1857413,29.316132 C 3.1902312,29.324886 3.2013114,29.339269 3.2068769,29.347766 C 3.2127868,29.356161 3.2211123,29.37137 3.2280125,29.379402 C 3.230418,29.382033 3.2466397,29.392637 3.2491481,29.395219 C 3.2517571,29.39775 3.2675765,29.408562 3.2702837,29.411038 C 3.287102,29.425545 3.313719,29.446427 3.3336905,29.45849 C 3.3370984,29.460423 3.3513413,29.472456 3.3548262,29.474308 C 3.3655167,29.479116 3.3855128,29.485766 3.3970973,29.490126 C 3.4750042,29.516899 3.5780713,29.537579 3.6718601,29.537579 L 18.650036,29.537579 L 18.586629,26.500592 L 5.1153018,26.500588 C 5.0709049,26.500588 5.0221446,26.49941 4.9884883,26.500588 C 4.9806133,26.500623 4.9547729,26.500899 4.9462171,26.500588 C 4.9436075,26.500603 4.9274517,26.500458 4.9250814,26.500588 C 4.9232514,26.502034 4.9059195,26.498718 4.9039459,26.500588 z M 19.83363,26.500592 L 19.897036,27.512921 L 23.553495,27.512921 L 23.38441,26.500592 L 19.83363,26.500592 z M 24.652546,26.500592 L 25.413428,29.537579 L 28.795124,29.537579 C 28.888912,29.537579 28.991979,29.516899 29.069886,29.490126 C 29.081471,29.485766 29.101467,29.479116 29.112157,29.474308 C 29.115641,29.472456 29.129884,29.460423 29.133293,29.45849 C 29.153265,29.446427 29.179882,29.425545 29.1967,29.411038 C 29.199407,29.408562 29.215227,29.39775 29.217835,29.395219 C 29.220344,29.392637 29.236565,29.382033 29.238971,29.379402 C 29.245871,29.37137 29.254196,29.356161 29.260107,29.347766 C 29.265672,29.339269 29.276752,29.324886 29.281242,29.316132 C 29.282614,29.31319 29.279996,29.303274 29.281242,29.300313 C 29.283476,29.294359 29.300674,29.274683 29.302378,29.268679 C 29.303093,29.265668 29.3018,29.255877 29.302378,29.25286 C 29.302814,29.249843 29.302083,29.240062 29.302378,29.237043 C 29.302527,29.234029 29.302378,29.224233 29.302378,29.221226 L 28.119129,26.816941 C 28.057483,26.720424 28.013215,26.641114 27.97118,26.595495 C 27.968475,26.593017 27.95285,26.582033 27.950044,26.579677 C 27.947147,26.57744 27.931886,26.565977 27.928908,26.563859 C 27.922812,26.559861 27.914085,26.551565 27.907773,26.548041 C 27.904579,26.546397 27.88986,26.533749 27.886638,26.532224 C 27.883397,26.530815 27.868747,26.533516 27.865502,26.532224 C 27.855773,26.528697 27.832737,26.51889 27.823231,26.516406 C 27.812787,26.51452 27.796296,26.503902 27.780959,26.500588 C 27.773263,26.49907 27.745738,26.501448 27.738688,26.500588 C 27.705031,26.49941 27.656271,26.500588 27.611875,26.500588 L 24.652546,26.500592 z M 20.679054,28.525249 L 20.002715,29.537579 L 23.891664,29.537579 L 23.04624,28.525249 L 20.679054,28.525249 z "
2418+ style="color:black;fill:#d3d7cf;fill-opacity:1;fill-rule:nonzero;stroke:#babdb6;stroke-width:0.99999923;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2419+ <rect
2420+ style="color:black;fill:url(#radialGradient5642);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2421+ id="rect5532"
2422+ width="1"
2423+ height="1"
2424+ x="5"
2425+ y="26"
2426+ rx="0.26516503"
2427+ ry="0.26516503" />
2428+ <rect
2429+ style="color:black;fill:url(#radialGradient5644);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2430+ id="rect5534"
2431+ width="1"
2432+ height="1"
2433+ x="7"
2434+ y="26"
2435+ rx="0.26516503"
2436+ ry="0.26516503" />
2437+ <rect
2438+ style="color:black;fill:url(#radialGradient5646);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2439+ id="rect5536"
2440+ width="1"
2441+ height="1"
2442+ x="9"
2443+ y="26"
2444+ rx="0.26516503"
2445+ ry="0.26516503" />
2446+ <rect
2447+ style="color:black;fill:url(#radialGradient5648);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2448+ id="rect5538"
2449+ width="1"
2450+ height="1"
2451+ x="11"
2452+ y="26"
2453+ rx="0.26516503"
2454+ ry="0.26516503" />
2455+ <rect
2456+ style="color:black;fill:url(#radialGradient5650);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2457+ id="rect5540"
2458+ width="1"
2459+ height="1"
2460+ x="13"
2461+ y="26"
2462+ rx="0.26516503"
2463+ ry="0.26516503" />
2464+ <rect
2465+ style="color:black;fill:url(#radialGradient5652);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2466+ id="rect5542"
2467+ width="1"
2468+ height="1"
2469+ x="15"
2470+ y="26"
2471+ rx="0.26516503"
2472+ ry="0.26516503" />
2473+ <rect
2474+ style="color:black;fill:url(#radialGradient5654);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2475+ id="rect5544"
2476+ width="1"
2477+ height="1"
2478+ x="17"
2479+ y="26"
2480+ rx="0.26516503"
2481+ ry="0.26516503" />
2482+ <rect
2483+ style="color:black;fill:url(#radialGradient5656);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2484+ id="rect5546"
2485+ width="1"
2486+ height="1"
2487+ x="4"
2488+ y="27"
2489+ rx="0.26516503"
2490+ ry="0.26516503" />
2491+ <rect
2492+ style="color:black;fill:url(#radialGradient5658);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2493+ id="rect5548"
2494+ width="1"
2495+ height="1"
2496+ x="6"
2497+ y="27"
2498+ rx="0.26516503"
2499+ ry="0.26516503" />
2500+ <rect
2501+ style="color:black;fill:url(#radialGradient5660);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2502+ id="rect5550"
2503+ width="1"
2504+ height="1"
2505+ x="8"
2506+ y="27"
2507+ rx="0.26516503"
2508+ ry="0.26516503" />
2509+ <rect
2510+ style="color:black;fill:url(#radialGradient5662);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2511+ id="rect5552"
2512+ width="1"
2513+ height="1"
2514+ x="10"
2515+ y="27"
2516+ rx="0.26516503"
2517+ ry="0.26516503" />
2518+ <rect
2519+ style="color:black;fill:url(#radialGradient5664);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2520+ id="rect5554"
2521+ width="1"
2522+ height="1"
2523+ x="12"
2524+ y="27"
2525+ rx="0.26516503"
2526+ ry="0.26516503" />
2527+ <rect
2528+ style="color:black;fill:url(#radialGradient5666);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2529+ id="rect5556"
2530+ width="1"
2531+ height="1"
2532+ x="14"
2533+ y="27"
2534+ rx="0.26516503"
2535+ ry="0.26516503" />
2536+ <rect
2537+ style="color:black;fill:url(#radialGradient5668);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2538+ id="rect5558"
2539+ width="1"
2540+ height="1"
2541+ x="16"
2542+ y="27"
2543+ rx="0.26516503"
2544+ ry="0.26516503" />
2545+ <rect
2546+ style="color:black;fill:url(#radialGradient5670);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2547+ id="rect5560"
2548+ width="1"
2549+ height="1"
2550+ x="18"
2551+ y="27"
2552+ rx="0.26516503"
2553+ ry="0.26516503" />
2554+ <rect
2555+ style="color:black;fill:url(#radialGradient5672);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2556+ id="rect5562"
2557+ width="1"
2558+ height="1"
2559+ x="5"
2560+ y="28"
2561+ rx="0.26516503"
2562+ ry="0.26516503" />
2563+ <rect
2564+ style="color:black;fill:url(#radialGradient5674);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2565+ id="rect5564"
2566+ width="1"
2567+ height="1"
2568+ x="7"
2569+ y="28"
2570+ rx="0.26516503"
2571+ ry="0.26516503" />
2572+ <rect
2573+ style="color:black;fill:url(#radialGradient5676);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2574+ id="rect5566"
2575+ width="1"
2576+ height="1"
2577+ x="9"
2578+ y="28"
2579+ rx="0.26516503"
2580+ ry="0.26516503" />
2581+ <rect
2582+ style="color:black;fill:url(#radialGradient5678);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2583+ id="rect5568"
2584+ width="1"
2585+ height="1"
2586+ x="11"
2587+ y="28"
2588+ rx="0.26516503"
2589+ ry="0.26516503" />
2590+ <rect
2591+ style="color:black;fill:url(#radialGradient5680);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2592+ id="rect5570"
2593+ width="1"
2594+ height="1"
2595+ x="13"
2596+ y="28"
2597+ rx="0.26516503"
2598+ ry="0.26516503" />
2599+ <rect
2600+ style="color:black;fill:url(#radialGradient5682);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2601+ id="rect5572"
2602+ width="1"
2603+ height="1"
2604+ x="15"
2605+ y="28"
2606+ rx="0.26516503"
2607+ ry="0.26516503" />
2608+ <rect
2609+ style="color:black;fill:url(#radialGradient5684);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2610+ id="rect5574"
2611+ width="1"
2612+ height="1"
2613+ x="17"
2614+ y="28"
2615+ rx="0.26516503"
2616+ ry="0.26516503" />
2617+ <rect
2618+ style="color:black;fill:url(#radialGradient5686);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2619+ id="rect5576"
2620+ width="1"
2621+ height="1"
2622+ x="4"
2623+ y="29"
2624+ rx="0.26516503"
2625+ ry="0.26516503" />
2626+ <rect
2627+ style="color:black;fill:url(#radialGradient5688);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2628+ id="rect5578"
2629+ width="1"
2630+ height="1"
2631+ x="6"
2632+ y="29"
2633+ rx="0.26516503"
2634+ ry="0.26516503" />
2635+ <rect
2636+ style="color:black;fill:url(#radialGradient5690);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2637+ id="rect5580"
2638+ width="1"
2639+ height="1"
2640+ x="8"
2641+ y="29"
2642+ rx="0.26516503"
2643+ ry="0.26516503" />
2644+ <rect
2645+ style="color:black;fill:url(#radialGradient5692);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2646+ id="rect5582"
2647+ width="1"
2648+ height="1"
2649+ x="10"
2650+ y="29"
2651+ rx="0.26516503"
2652+ ry="0.26516503" />
2653+ <rect
2654+ style="color:black;fill:url(#radialGradient5694);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2655+ id="rect5584"
2656+ width="1"
2657+ height="1"
2658+ x="12"
2659+ y="29"
2660+ rx="0.26516503"
2661+ ry="0.26516503" />
2662+ <rect
2663+ style="color:black;fill:url(#radialGradient5696);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2664+ id="rect5586"
2665+ width="1"
2666+ height="1"
2667+ x="14"
2668+ y="29"
2669+ rx="0.26516503"
2670+ ry="0.26516503" />
2671+ <rect
2672+ style="color:black;fill:url(#radialGradient5698);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2673+ id="rect5588"
2674+ width="1"
2675+ height="1"
2676+ x="16"
2677+ y="29"
2678+ rx="0.26516503"
2679+ ry="0.26516503" />
2680+ <rect
2681+ style="color:black;fill:url(#radialGradient5700);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2682+ id="rect5590"
2683+ width="1"
2684+ height="1"
2685+ x="18"
2686+ y="29"
2687+ rx="0.26516503"
2688+ ry="0.26516503" />
2689+ <rect
2690+ style="color:black;fill:url(#radialGradient5702);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2691+ id="rect5592"
2692+ width="1"
2693+ height="1"
2694+ x="21"
2695+ y="26"
2696+ rx="0.26516503"
2697+ ry="0.26516503" />
2698+ <rect
2699+ style="color:black;fill:url(#radialGradient5704);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2700+ id="rect5594"
2701+ width="1"
2702+ height="1"
2703+ x="20"
2704+ y="27"
2705+ rx="0.26516503"
2706+ ry="0.26516503" />
2707+ <rect
2708+ style="color:black;fill:url(#radialGradient5706);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2709+ id="rect5596"
2710+ width="1"
2711+ height="1"
2712+ x="22"
2713+ y="27"
2714+ rx="0.26516503"
2715+ ry="0.26516503" />
2716+ <rect
2717+ style="color:black;fill:url(#radialGradient5708);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2718+ id="rect5598"
2719+ width="1"
2720+ height="1"
2721+ x="21"
2722+ y="28"
2723+ rx="0.26516503"
2724+ ry="0.26516503" />
2725+ <rect
2726+ style="color:black;fill:url(#radialGradient5710);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2727+ id="rect5600"
2728+ width="1"
2729+ height="1"
2730+ x="23"
2731+ y="28"
2732+ rx="0.26516503"
2733+ ry="0.26516503" />
2734+ <rect
2735+ style="color:black;fill:url(#radialGradient5712);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2736+ id="rect5602"
2737+ width="1"
2738+ height="1"
2739+ x="20"
2740+ y="29"
2741+ rx="0.26516503"
2742+ ry="0.26516503" />
2743+ <rect
2744+ style="color:black;fill:url(#radialGradient5714);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2745+ id="rect5604"
2746+ width="1"
2747+ height="1"
2748+ x="22"
2749+ y="29"
2750+ rx="0.26516503"
2751+ ry="0.26516503" />
2752+ <rect
2753+ style="color:black;fill:url(#radialGradient5716);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2754+ id="rect5606"
2755+ width="1"
2756+ height="1"
2757+ x="26"
2758+ y="26"
2759+ rx="0.26516503"
2760+ ry="0.26516503" />
2761+ <rect
2762+ style="color:black;fill:url(#radialGradient5718);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2763+ id="rect5608"
2764+ width="1"
2765+ height="1"
2766+ x="25"
2767+ y="27"
2768+ rx="0.26516503"
2769+ ry="0.26516503" />
2770+ <rect
2771+ style="color:black;fill:url(#radialGradient5720);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2772+ id="rect5610"
2773+ width="1"
2774+ height="1"
2775+ x="27"
2776+ y="27"
2777+ rx="0.26516503"
2778+ ry="0.26516503" />
2779+ <rect
2780+ style="color:black;fill:url(#radialGradient5722);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2781+ id="rect5612"
2782+ width="1"
2783+ height="1"
2784+ x="26"
2785+ y="28"
2786+ rx="0.26516503"
2787+ ry="0.26516503" />
2788+ <rect
2789+ style="color:black;fill:url(#radialGradient5724);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2790+ id="rect5614"
2791+ width="1"
2792+ height="1"
2793+ x="28"
2794+ y="28"
2795+ rx="0.26516503"
2796+ ry="0.26516503" />
2797+ <rect
2798+ style="color:black;fill:url(#radialGradient5726);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2799+ id="rect5616"
2800+ width="1"
2801+ height="1"
2802+ x="25"
2803+ y="29"
2804+ rx="0.26516503"
2805+ ry="0.26516503" />
2806+ <rect
2807+ style="color:black;fill:url(#radialGradient5728);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2808+ id="rect5618"
2809+ width="1"
2810+ height="1"
2811+ x="27"
2812+ y="29"
2813+ rx="0.26516503"
2814+ ry="0.26516503" />
2815+ </g>
2816+ </g>
2817+ <g
2818+ id="g5340"
2819+ transform="translate(0.985355,12)">
2820+ <g
2821+ style="display:inline"
2822+ inkscape:label="Layer 1"
2823+ id="g5342" />
2824+ <g
2825+ style="display:inline"
2826+ inkscape:label="tastiera"
2827+ id="g5344">
2828+ <g
2829+ transform="translate(-54,0.18088)"
2830+ inkscape:label="Shadow"
2831+ id="g5346" />
2832+ <g
2833+ id="g5348"
2834+ inkscape:label="Shadow"
2835+ transform="translate(-54,15.24691)" />
2836+ <g
2837+ id="g5350"
2838+ inkscape:label="Lavoro"
2839+ style="display:inline"
2840+ transform="translate(-54,15.24691)" />
2841+ </g>
2842+ <g
2843+ style="display:inline"
2844+ inkscape:label="tasti"
2845+ id="layer2">
2846+ <path
2847+ transform="matrix(0.633479,0,0,0.565504,1.119993,0.201324)"
2848+ d="M 47.69706 42.6875 A 23.75956 5.8835783 0 1 1 0.17794037,42.6875 A 23.75956 5.8835783 0 1 1 47.69706 42.6875 z"
2849+ sodipodi:ry="5.8835783"
2850+ sodipodi:rx="23.75956"
2851+ sodipodi:cy="42.6875"
2852+ sodipodi:cx="23.9375"
2853+ id="path5353"
2854+ style="opacity:0.3;fill:url(#radialGradient2313);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
2855+ sodipodi:type="arc" />
2856+ <path
2857+ style="opacity:0.20786516;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4202);stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
2858+ d="M 27.082936,28.048013 C 21.663366,21.135948 31.947853,26.54939 30.855772,24.153878 C 29.785572,21.806364 17.408039,24.595241 18.709552,20.667209"
2859+ id="path5355"
2860+ sodipodi:nodetypes="czz" />
2861+ <path
2862+ sodipodi:nodetypes="czz"
2863+ id="path5357"
2864+ d="M 26.784723,27.671888 C 21.538638,20.412631 31.520563,26.487432 30.374151,23.604157 C 29.072638,20.330797 18.198646,24.276982 18.806217,20.406815"
2865+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#729fcf;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
2866+ <g
2867+ transform="matrix(0.530612,0,0,0.53095,3.140616,3.404111)"
2868+ id="g5359"
2869+ style="display:inline">
2870+ <path
2871+ sodipodi:nodetypes="csccscc"
2872+ id="path5361"
2873+ d="M 14.375479,32.558794 C 14.375479,32.558794 15.592355,37.45777 10.51915,37.50376 C 8.0888743,37.525507 8.5866723,41.509781 8.5866723,41.509781 L 39.433139,41.478634 C 39.433139,41.478634 39.851577,37.611393 37.410922,37.566053 C 32.423455,37.474579 33.600393,32.496503 33.600393,32.496503 L 14.375479,32.558794 z "
2874+ style="opacity:1;color:black;fill:url(#linearGradient2308);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.88401449;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2875+ <path
2876+ sodipodi:nodetypes="ccccc"
2877+ id="path5363"
2878+ d="M 13.926195,33.027451 C 14.010206,35.2 13.641655,35.938894 12.285731,36.702682 L 36,38 C 35.047008,36.831372 33.660837,35.066666 34.038883,33.011765 L 13.926195,33.027451 z "
2879+ style="opacity:0.5;fill:url(#linearGradient2310);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
2880+ <path
2881+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#8d8d8f;stroke-width:1.88401508px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.43902438"
2882+ d="M 10.436202,38.661601 C 17.000465,38.66357 37.562637,38.661601 37.562637,38.661601"
2883+ id="path5365"
2884+ sodipodi:nodetypes="cc" />
2885+ <path
2886+ sodipodi:nodetypes="cc"
2887+ id="path5367"
2888+ d="M 11.134219,39.660187 C 17.146756,39.662156 36.881517,39.660187 36.881517,39.660187"
2889+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.88401532px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
2890+ </g>
2891+ <path
2892+ sodipodi:nodetypes="ccccccccc"
2893+ id="path5369"
2894+ d="M 3.602229,1.4999996 L 28.319154,1.4999996 C 29.631932,1.4999996 30.588653,2.4197694 30.588653,3.8361498 L 30.595753,20.072828 C 30.595753,21.162945 30.253253,21.499994 29.276792,21.499994 L 2.7228402,21.487795 C 1.9583807,21.469246 1.414291,21.169109 1.404027,20.186855 L 1.4138652,3.7151949 C 1.4138652,2.572403 2.4117826,1.4999996 3.602229,1.4999996 z "
2895+ style="fill:url(#linearGradient5147);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00000036;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
2896+ <rect
2897+ y="3.5000005"
2898+ x="3.4999971"
2899+ height="15.194118"
2900+ width="25.103695"
2901+ id="rect5371"
2902+ style="fill:url(#radialGradient5239);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:0.99999958px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
2903+ <path
2904+ sodipodi:nodetypes="ccccc"
2905+ id="path5373"
2906+ d="M 4.0984042,4.0204313 L 4.0984042,15.748091 C 15.025941,14.866132 19.115514,9.1623492 28,8.5664313 L 28,4 L 4.0984042,4.0204313 z "
2907+ style="opacity:0.5;fill:url(#linearGradient6246);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
2908+ <path
2909+ sodipodi:nodetypes="cccsccscccc"
2910+ id="path5375"
2911+ d="M 4.056094,2.4999991 C 3.2398944,2.4999991 2.4960113,3.2952856 2.4960113,4.0741096 L 2.4960108,19.789734 C 2.4999206,20.160319 2.5869303,20.275382 2.6715202,20.346431 C 2.7561101,20.417479 2.9348114,20.473541 3.2370502,20.480806 L 28.783404,20.500002 C 29.189758,20.500002 29.318189,20.437946 29.368434,20.384824 C 29.418681,20.3317 29.504941,20.138678 29.504941,19.674554 L 29.504942,4.1892884 C 29.504942,3.0791795 28.874178,2.4999991 27.866855,2.4999991 L 4.056094,2.4999991 z "
2912+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
2913+ <g
2914+ id="g5377"
2915+ transform="matrix(1.543206e-2,0,0,1.215502e-2,29.57023,28.01728)"
2916+ style="display:inline">
2917+ <rect
2918+ y="-150.69685"
2919+ x="-1559.2523"
2920+ height="478.35718"
2921+ width="1339.6335"
2922+ id="rect6709"
2923+ style="opacity:0.40206185;color:black;fill:url(#linearGradient5478);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2924+ <path
2925+ sodipodi:nodetypes="cccc"
2926+ id="path5380"
2927+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
2928+ style="opacity:0.40206185;color:black;fill:url(#radialGradient2309);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2929+ <path
2930+ style="opacity:0.40206185;color:black;fill:url(#radialGradient2311);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2931+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
2932+ id="path5382"
2933+ sodipodi:nodetypes="cccc" />
2934+ </g>
2935+ <path
2936+ sodipodi:nodetypes="ccccccccc"
2937+ id="path5384"
2938+ d="M 3.643761,26.504783 L 28.921938,26.504783 C 29.226374,26.504783 29.788645,26.492665 30,27 L 31.5,30 C 31.5625,30.406064 31.487026,31.562501 30,31.562501 L 2.5,31.500001 C 1,31.562501 1.0652178,30.281064 1.0652178,30 L 3,27 C 3.2113561,26.492665 3.3393239,26.504783 3.643761,26.504783 z "
2939+ style="color:black;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2940+ <path
2941+ sodipodi:nodetypes="ccccccccc"
2942+ id="path5386"
2943+ d="M 4.0955909,27.111942 L 28.49679,27.10614 C 28.788541,27.10614 28.820868,27.10614 29.023418,27.449588 L 30.420658,30.150759 C 30.420658,30.341029 30.185782,30.494207 29.894029,30.494207 L 2.6782341,30.500011 C 2.3864818,30.500011 2.1516056,30.346832 2.1516056,30.156562 L 3.5689622,27.45539 C 3.7715117,27.111942 3.8038386,27.111942 4.0955909,27.111942 z "
2944+ style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:white;stroke-width:0.99999964;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2945+ <path
2946+ sodipodi:nodetypes="csssssssccssssssssssssccccssscccccccccssssssssssssccsssssssssccccccc"
2947+ id="path5388"
2948+ d="M 4.9039459,26.500588 C 4.9019723,26.502459 4.9057445,26.514939 4.9039459,26.516406 C 4.89444,26.51889 4.8714034,26.528697 4.8616746,26.532224 C 4.8584281,26.533516 4.8437789,26.530815 4.840539,26.532224 C 4.8373165,26.533749 4.8225981,26.546397 4.8194034,26.548041 C 4.8130911,26.551565 4.8043634,26.559861 4.7982678,26.563859 C 4.7952901,26.565977 4.7800294,26.57744 4.7771322,26.579677 C 4.7743261,26.582033 4.7587013,26.593017 4.7559967,26.595495 C 4.7139608,26.641114 4.6696929,26.720423 4.6080475,26.816941 L 3.1646057,29.221226 C 3.1646057,29.224233 3.1644578,29.234029 3.1646057,29.237043 C 3.1648991,29.240062 3.1641691,29.249843 3.1646057,29.25286 C 3.1651831,29.255877 3.1638899,29.265668 3.1646057,29.268679 C 3.1663094,29.274683 3.1835077,29.294359 3.1857413,29.300313 C 3.1869871,29.303274 3.184369,29.31319 3.1857413,29.316132 C 3.1902312,29.324886 3.2013114,29.339269 3.2068769,29.347766 C 3.2127868,29.356161 3.2211123,29.37137 3.2280125,29.379402 C 3.230418,29.382033 3.2466397,29.392637 3.2491481,29.395219 C 3.2517571,29.39775 3.2675765,29.408562 3.2702837,29.411038 C 3.287102,29.425545 3.313719,29.446427 3.3336905,29.45849 C 3.3370984,29.460423 3.3513413,29.472456 3.3548262,29.474308 C 3.3655167,29.479116 3.3855128,29.485766 3.3970973,29.490126 C 3.4750042,29.516899 3.5780713,29.537579 3.6718601,29.537579 L 18.650036,29.537579 L 18.586629,26.500592 L 5.1153018,26.500588 C 5.0709049,26.500588 5.0221446,26.49941 4.9884883,26.500588 C 4.9806133,26.500623 4.9547729,26.500899 4.9462171,26.500588 C 4.9436075,26.500603 4.9274517,26.500458 4.9250814,26.500588 C 4.9232514,26.502034 4.9059195,26.498718 4.9039459,26.500588 z M 19.83363,26.500592 L 19.897036,27.512921 L 23.553495,27.512921 L 23.38441,26.500592 L 19.83363,26.500592 z M 24.652546,26.500592 L 25.413428,29.537579 L 28.795124,29.537579 C 28.888912,29.537579 28.991979,29.516899 29.069886,29.490126 C 29.081471,29.485766 29.101467,29.479116 29.112157,29.474308 C 29.115641,29.472456 29.129884,29.460423 29.133293,29.45849 C 29.153265,29.446427 29.179882,29.425545 29.1967,29.411038 C 29.199407,29.408562 29.215227,29.39775 29.217835,29.395219 C 29.220344,29.392637 29.236565,29.382033 29.238971,29.379402 C 29.245871,29.37137 29.254196,29.356161 29.260107,29.347766 C 29.265672,29.339269 29.276752,29.324886 29.281242,29.316132 C 29.282614,29.31319 29.279996,29.303274 29.281242,29.300313 C 29.283476,29.294359 29.300674,29.274683 29.302378,29.268679 C 29.303093,29.265668 29.3018,29.255877 29.302378,29.25286 C 29.302814,29.249843 29.302083,29.240062 29.302378,29.237043 C 29.302527,29.234029 29.302378,29.224233 29.302378,29.221226 L 28.119129,26.816941 C 28.057483,26.720424 28.013215,26.641114 27.97118,26.595495 C 27.968475,26.593017 27.95285,26.582033 27.950044,26.579677 C 27.947147,26.57744 27.931886,26.565977 27.928908,26.563859 C 27.922812,26.559861 27.914085,26.551565 27.907773,26.548041 C 27.904579,26.546397 27.88986,26.533749 27.886638,26.532224 C 27.883397,26.530815 27.868747,26.533516 27.865502,26.532224 C 27.855773,26.528697 27.832737,26.51889 27.823231,26.516406 C 27.812787,26.51452 27.796296,26.503902 27.780959,26.500588 C 27.773263,26.49907 27.745738,26.501448 27.738688,26.500588 C 27.705031,26.49941 27.656271,26.500588 27.611875,26.500588 L 24.652546,26.500592 z M 20.679054,28.525249 L 20.002715,29.537579 L 23.891664,29.537579 L 23.04624,28.525249 L 20.679054,28.525249 z "
2949+ style="color:black;fill:#d3d7cf;fill-opacity:1;fill-rule:nonzero;stroke:#babdb6;stroke-width:0.99999923;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2950+ <rect
2951+ style="color:black;fill:url(#radialGradient3248);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2952+ id="rect5390"
2953+ width="1"
2954+ height="1"
2955+ x="5"
2956+ y="26"
2957+ rx="0.26516503"
2958+ ry="0.26516503" />
2959+ <rect
2960+ style="color:black;fill:url(#radialGradient3245);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2961+ id="rect5392"
2962+ width="1"
2963+ height="1"
2964+ x="7"
2965+ y="26"
2966+ rx="0.26516503"
2967+ ry="0.26516503" />
2968+ <rect
2969+ style="color:black;fill:url(#radialGradient3242);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2970+ id="rect5394"
2971+ width="1"
2972+ height="1"
2973+ x="9"
2974+ y="26"
2975+ rx="0.26516503"
2976+ ry="0.26516503" />
2977+ <rect
2978+ style="color:black;fill:url(#radialGradient3239);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2979+ id="rect5396"
2980+ width="1"
2981+ height="1"
2982+ x="11"
2983+ y="26"
2984+ rx="0.26516503"
2985+ ry="0.26516503" />
2986+ <rect
2987+ style="color:black;fill:url(#radialGradient3236);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2988+ id="rect5398"
2989+ width="1"
2990+ height="1"
2991+ x="13"
2992+ y="26"
2993+ rx="0.26516503"
2994+ ry="0.26516503" />
2995+ <rect
2996+ style="color:black;fill:url(#radialGradient3233);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2997+ id="rect5400"
2998+ width="1"
2999+ height="1"
3000+ x="15"
3001+ y="26"
3002+ rx="0.26516503"
3003+ ry="0.26516503" />
3004+ <rect
3005+ style="color:black;fill:url(#radialGradient3230);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3006+ id="rect5402"
3007+ width="1"
3008+ height="1"
3009+ x="17"
3010+ y="26"
3011+ rx="0.26516503"
3012+ ry="0.26516503" />
3013+ <rect
3014+ style="color:black;fill:url(#radialGradient3224);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3015+ id="rect5404"
3016+ width="1"
3017+ height="1"
3018+ x="4"
3019+ y="27"
3020+ rx="0.26516503"
3021+ ry="0.26516503" />
3022+ <rect
3023+ style="color:black;fill:url(#radialGradient3221);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3024+ id="rect5406"
3025+ width="1"
3026+ height="1"
3027+ x="6"
3028+ y="27"
3029+ rx="0.26516503"
3030+ ry="0.26516503" />
3031+ <rect
3032+ style="color:black;fill:url(#radialGradient3218);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3033+ id="rect5408"
3034+ width="1"
3035+ height="1"
3036+ x="8"
3037+ y="27"
3038+ rx="0.26516503"
3039+ ry="0.26516503" />
3040+ <rect
3041+ style="color:black;fill:url(#radialGradient3215);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3042+ id="rect5410"
3043+ width="1"
3044+ height="1"
3045+ x="10"
3046+ y="27"
3047+ rx="0.26516503"
3048+ ry="0.26516503" />
3049+ <rect
3050+ style="color:black;fill:url(#radialGradient3212);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3051+ id="rect5412"
3052+ width="1"
3053+ height="1"
3054+ x="12"
3055+ y="27"
3056+ rx="0.26516503"
3057+ ry="0.26516503" />
3058+ <rect
3059+ style="color:black;fill:url(#radialGradient3209);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3060+ id="rect5414"
3061+ width="1"
3062+ height="1"
3063+ x="14"
3064+ y="27"
3065+ rx="0.26516503"
3066+ ry="0.26516503" />
3067+ <rect
3068+ style="color:black;fill:url(#radialGradient3206);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3069+ id="rect5416"
3070+ width="1"
3071+ height="1"
3072+ x="16"
3073+ y="27"
3074+ rx="0.26516503"
3075+ ry="0.26516503" />
3076+ <rect
3077+ style="color:black;fill:url(#radialGradient3203);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3078+ id="rect5418"
3079+ width="1"
3080+ height="1"
3081+ x="18"
3082+ y="27"
3083+ rx="0.26516503"
3084+ ry="0.26516503" />
3085+ <rect
3086+ style="color:black;fill:url(#radialGradient3200);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3087+ id="rect5420"
3088+ width="1"
3089+ height="1"
3090+ x="5"
3091+ y="28"
3092+ rx="0.26516503"
3093+ ry="0.26516503" />
3094+ <rect
3095+ style="color:black;fill:url(#radialGradient3197);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3096+ id="rect5422"
3097+ width="1"
3098+ height="1"
3099+ x="7"
3100+ y="28"
3101+ rx="0.26516503"
3102+ ry="0.26516503" />
3103+ <rect
3104+ style="color:black;fill:url(#radialGradient3194);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3105+ id="rect5424"
3106+ width="1"
3107+ height="1"
3108+ x="9"
3109+ y="28"
3110+ rx="0.26516503"
3111+ ry="0.26516503" />
3112+ <rect
3113+ style="color:black;fill:url(#radialGradient3191);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3114+ id="rect5426"
3115+ width="1"
3116+ height="1"
3117+ x="11"
3118+ y="28"
3119+ rx="0.26516503"
3120+ ry="0.26516503" />
3121+ <rect
3122+ style="color:black;fill:url(#radialGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3123+ id="rect5428"
3124+ width="1"
3125+ height="1"
3126+ x="13"
3127+ y="28"
3128+ rx="0.26516503"
3129+ ry="0.26516503" />
3130+ <rect
3131+ style="color:black;fill:url(#radialGradient3185);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3132+ id="rect5430"
3133+ width="1"
3134+ height="1"
3135+ x="15"
3136+ y="28"
3137+ rx="0.26516503"
3138+ ry="0.26516503" />
3139+ <rect
3140+ style="color:black;fill:url(#radialGradient3182);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3141+ id="rect5432"
3142+ width="1"
3143+ height="1"
3144+ x="17"
3145+ y="28"
3146+ rx="0.26516503"
3147+ ry="0.26516503" />
3148+ <rect
3149+ style="color:black;fill:url(#radialGradient3176);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3150+ id="rect5434"
3151+ width="1"
3152+ height="1"
3153+ x="4"
3154+ y="29"
3155+ rx="0.26516503"
3156+ ry="0.26516503" />
3157+ <rect
3158+ style="color:black;fill:url(#radialGradient3173);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3159+ id="rect5436"
3160+ width="1"
3161+ height="1"
3162+ x="6"
3163+ y="29"
3164+ rx="0.26516503"
3165+ ry="0.26516503" />
3166+ <rect
3167+ style="color:black;fill:url(#radialGradient3170);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3168+ id="rect5438"
3169+ width="1"
3170+ height="1"
3171+ x="8"
3172+ y="29"
3173+ rx="0.26516503"
3174+ ry="0.26516503" />
3175+ <rect
3176+ style="color:black;fill:url(#radialGradient3167);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3177+ id="rect5440"
3178+ width="1"
3179+ height="1"
3180+ x="10"
3181+ y="29"
3182+ rx="0.26516503"
3183+ ry="0.26516503" />
3184+ <rect
3185+ style="color:black;fill:url(#radialGradient3164);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3186+ id="rect5442"
3187+ width="1"
3188+ height="1"
3189+ x="12"
3190+ y="29"
3191+ rx="0.26516503"
3192+ ry="0.26516503" />
3193+ <rect
3194+ style="color:black;fill:url(#radialGradient3161);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3195+ id="rect5444"
3196+ width="1"
3197+ height="1"
3198+ x="14"
3199+ y="29"
3200+ rx="0.26516503"
3201+ ry="0.26516503" />
3202+ <rect
3203+ style="color:black;fill:url(#radialGradient3158);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3204+ id="rect5446"
3205+ width="1"
3206+ height="1"
3207+ x="16"
3208+ y="29"
3209+ rx="0.26516503"
3210+ ry="0.26516503" />
3211+ <rect
3212+ style="color:black;fill:url(#radialGradient3155);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3213+ id="rect5448"
3214+ width="1"
3215+ height="1"
3216+ x="18"
3217+ y="29"
3218+ rx="0.26516503"
3219+ ry="0.26516503" />
3220+ <rect
3221+ style="color:black;fill:url(#radialGradient3264);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3222+ id="rect5450"
3223+ width="1"
3224+ height="1"
3225+ x="21"
3226+ y="26"
3227+ rx="0.26516503"
3228+ ry="0.26516503" />
3229+ <rect
3230+ style="color:black;fill:url(#radialGradient3266);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3231+ id="rect5452"
3232+ width="1"
3233+ height="1"
3234+ x="20"
3235+ y="27"
3236+ rx="0.26516503"
3237+ ry="0.26516503" />
3238+ <rect
3239+ style="color:black;fill:url(#radialGradient3268);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3240+ id="rect5454"
3241+ width="1"
3242+ height="1"
3243+ x="22"
3244+ y="27"
3245+ rx="0.26516503"
3246+ ry="0.26516503" />
3247+ <rect
3248+ style="color:black;fill:url(#radialGradient3270);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3249+ id="rect5456"
3250+ width="1"
3251+ height="1"
3252+ x="21"
3253+ y="28"
3254+ rx="0.26516503"
3255+ ry="0.26516503" />
3256+ <rect
3257+ style="color:black;fill:url(#radialGradient3272);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3258+ id="rect5458"
3259+ width="1"
3260+ height="1"
3261+ x="23"
3262+ y="28"
3263+ rx="0.26516503"
3264+ ry="0.26516503" />
3265+ <rect
3266+ style="color:black;fill:url(#radialGradient3274);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3267+ id="rect5460"
3268+ width="1"
3269+ height="1"
3270+ x="20"
3271+ y="29"
3272+ rx="0.26516503"
3273+ ry="0.26516503" />
3274+ <rect
3275+ style="color:black;fill:url(#radialGradient3276);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3276+ id="rect5462"
3277+ width="1"
3278+ height="1"
3279+ x="22"
3280+ y="29"
3281+ rx="0.26516503"
3282+ ry="0.26516503" />
3283+ <rect
3284+ style="color:black;fill:url(#radialGradient3292);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3285+ id="rect5464"
3286+ width="1"
3287+ height="1"
3288+ x="26"
3289+ y="26"
3290+ rx="0.26516503"
3291+ ry="0.26516503" />
3292+ <rect
3293+ style="color:black;fill:url(#radialGradient3294);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3294+ id="rect5466"
3295+ width="1"
3296+ height="1"
3297+ x="25"
3298+ y="27"
3299+ rx="0.26516503"
3300+ ry="0.26516503" />
3301+ <rect
3302+ style="color:black;fill:url(#radialGradient3296);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3303+ id="rect5468"
3304+ width="1"
3305+ height="1"
3306+ x="27"
3307+ y="27"
3308+ rx="0.26516503"
3309+ ry="0.26516503" />
3310+ <rect
3311+ style="color:black;fill:url(#radialGradient3298);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3312+ id="rect5470"
3313+ width="1"
3314+ height="1"
3315+ x="26"
3316+ y="28"
3317+ rx="0.26516503"
3318+ ry="0.26516503" />
3319+ <rect
3320+ style="color:black;fill:url(#radialGradient3300);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3321+ id="rect5472"
3322+ width="1"
3323+ height="1"
3324+ x="28"
3325+ y="28"
3326+ rx="0.26516503"
3327+ ry="0.26516503" />
3328+ <rect
3329+ style="color:black;fill:url(#radialGradient3302);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3330+ id="rect5474"
3331+ width="1"
3332+ height="1"
3333+ x="25"
3334+ y="29"
3335+ rx="0.26516503"
3336+ ry="0.26516503" />
3337+ <rect
3338+ style="color:black;fill:url(#radialGradient3304);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
3339+ id="rect5476"
3340+ width="1"
3341+ height="1"
3342+ x="27"
3343+ y="29"
3344+ rx="0.26516503"
3345+ ry="0.26516503" />
3346+ </g>
3347+ </g>
3348+ </g>
3349+</svg>
3350diff --git a/snapcraft.yaml b/snapcraft.yaml
3351index f67838b..18ba003 100644
3352--- a/snapcraft.yaml
3353+++ b/snapcraft.yaml
3354@@ -1,3 +1,4 @@
3355+<<<<<<< snapcraft.yaml
3356 name: pulseaudio
3357 version: 8.0-3
3358 summary: PulseAudio sound server
3359@@ -148,3 +149,246 @@ parts:
3360
3361 snap:
3362 - $pauseaudiofiles
3363+=======
3364+name: network-manager
3365+version: 1.2.2-10
3366+summary: Network management framework
3367+description: |
3368+ NetworkManager is a system network service that manages your network
3369+ devices and connections, attempting to keep active network connectivity
3370+ when available. It manages ethernet, WiFi, mobile broadband (WWAN) and
3371+ PPPoE devices, provides VPN integration with a variety of different
3372+ VPN serivces.
3373+ Please find the source code at https://code.launchpad.net/~snappy-hwe-team/snappy-hwe-snaps/+git/network-manager
3374+confinement: strict
3375+grade: stable
3376+
3377+slots:
3378+ service: network-manager
3379+
3380+plugs:
3381+ nmcli: network-manager
3382+
3383+apps:
3384+ nmcli:
3385+ command: usr/bin/nmcli
3386+ plugs: [nmcli]
3387+ aliases:
3388+ - nmcli
3389+ networkmanager:
3390+ command: bin/networkmanager
3391+ daemon: simple
3392+ slots: [service]
3393+ plugs: [modem-manager, ppp, network-setup-observe]
3394+ # FIXME: This will create currently a symlink inside /snap/bin
3395+ # which points nowhere as the service isn't exposed as application
3396+ # for the user. Instead snapd needs to gain support to handle
3397+ # aliases for services differently by adding the Alias= option
3398+ # within the systemd unit file instead for example. Until this
3399+ # is implemented we keep the alias disabled.
3400+ #
3401+ # aliases:
3402+ # - NetworkManager
3403+
3404+parts:
3405+ hooks:
3406+ plugin: dump
3407+ source: hooks
3408+ organize:
3409+ configure: meta/hooks/configure
3410+
3411+ networkmanager-common:
3412+ plugin: copy
3413+ files:
3414+ bin/networkmanager: bin/networkmanager
3415+ bin/dhcp-lease-mover: bin/dhcp-lease-mover
3416+ conf/NetworkManager.conf: etc/NetworkManager/NetworkManager.conf
3417+ data/copyright: usr/share/doc/network-manager/copyright
3418+ startup-hooks/99-wol-by-default.sh: startup-hooks/99-wol-by-default.sh
3419+
3420+ inotify-tools:
3421+ plugin: nil
3422+ stage-packages:
3423+ - libinotifytools0
3424+ - inotify-tools
3425+ filesets:
3426+ wanted:
3427+ - usr/share/doc/inotify-tools/copyright
3428+ - usr/bin/inotifywait
3429+ - usr/share/doc/libinotifytools0/copyright
3430+ - usr/lib/libinotifytools.so.0.4.1
3431+ - usr/lib/libinotifytools.so.0
3432+ snap:
3433+ - $wanted
3434+
3435+ networkmanager:
3436+ plugin: autotools
3437+
3438+ source: https://git.launchpad.net/~snappy-hwe-team/snappy-hwe-snaps/+git/network-manager
3439+ source-type: git
3440+ # For development you can directly build from the xenial branch if
3441+ # needed. Otherwise use the tag to the latest version which will be
3442+ # used by the published snap.
3443+ # source-branch: network-manager/xenial/1.2.2
3444+ source-tag: network-manager-xenial-1.2.2-2
3445+
3446+ build-packages:
3447+ - intltool
3448+ - gtk-doc-tools
3449+ - libdbus-glib-1-dev
3450+ - libdbus-1-dev
3451+ - libiw-dev
3452+ - libglib2.0-dev
3453+ - libnl-3-dev
3454+ - libnl-route-3-dev
3455+ - libnl-genl-3-dev
3456+ - libnss3-dev
3457+ - libgnutls28-dev
3458+ - libgcrypt11-dev
3459+ - uuid-dev
3460+ - systemd
3461+ - libsystemd-dev
3462+ - libudev-dev
3463+ - libgudev-1.0-dev
3464+ - libgirepository1.0-dev
3465+ - gobject-introspection
3466+ - libglib2.0-doc
3467+ - libmm-glib-dev
3468+ - libndp-dev
3469+ - libreadline-dev
3470+ - libnewt-dev
3471+ - dbus-test-runner
3472+ - isc-dhcp-client
3473+ - python-dbus
3474+ - python-gi
3475+ - iptables
3476+ - ppp-dev
3477+
3478+ # We stage everything here we need for build and runtime
3479+ stage-packages:
3480+ - iputils-arping
3481+ - iw
3482+ - libc6
3483+ - libdbus-1-3
3484+ - libdbus-glib-1-2
3485+ - libgcrypt20
3486+ - libglib2.0-0
3487+ - libgudev-1.0-0
3488+ - libiw-dev
3489+ - libmbim-glib4
3490+ - libndp0
3491+ - libnl-3-200
3492+ - libnl-3-dev
3493+ - libnl-genl-3-200
3494+ - libnl-route-3-200
3495+ - libpam-systemd
3496+ - libreadline6
3497+ - libsystemd0
3498+ - libuuid1
3499+ - lsb-base
3500+ - uuid-dev
3501+ - wireless-tools
3502+
3503+ configflags:
3504+ # Disable all features we don't want enabled as we're not
3505+ # supporting them (yet).
3506+ - --prefix=/usr
3507+ - --libdir=/usr/lib
3508+ - --libexecdir=/usr/lib/NetworkManager
3509+ - --disable-qt
3510+ - --disable-teamdctl
3511+ - --disable-polkit
3512+ - --disable-vala
3513+ - --disable-config-plugin-ibft
3514+ - --with-dhcpcd=no
3515+ - --with-dhclient=no
3516+ - --with-dnsmasq=no
3517+ - --with-systemd-journal=no
3518+ - --with-session-tracking=no
3519+ # We only support suspend/resume tracking together with systemd/logind
3520+ # at the moment.
3521+ - --with-suspend-resume=systemd
3522+ # Removes dependency on libicudata which weights 25M. Also libsoup
3523+ # is only used to verify a domain in the DNS resolve process has a
3524+ # valid format and to check if a valid internet connection is available.
3525+ - --with-libsoup=no
3526+ # We want to support ModemManager
3527+ - --with-modem-manager-1=yes
3528+
3529+ # Filter files pulled in by stage-packages so they aren't
3530+ # included in the final snap. We only need them to build
3531+ # NetworkManager. All runtime dependencies are pulled in with
3532+ # the rdepends part below. The only left items specified
3533+ # here are the results of the network manager build.
3534+ filesets:
3535+ binaries:
3536+ - usr/bin/nmcli
3537+ - usr/lib/*/NetworkManager
3538+ - usr/lib/pppd/2.4.5/nm-pppd-plugin.so
3539+ - usr/lib/NetworkManager
3540+ - usr/sbin/NetworkManager
3541+ - usr/lib/*/libnm-*
3542+ configs:
3543+ - etc/NetworkManager/*
3544+ docs:
3545+ - usr/share/doc
3546+ rdepends:
3547+ - lib64/*
3548+ - lib/*/
3549+ - usr/lib/*
3550+ unwanted:
3551+ # We don't want anything in usr/share but the doc folder
3552+ # to carry all copyright information
3553+ - -usr/share/bash-completion
3554+ - -usr/share/bug
3555+ - -usr/share/dbus-1
3556+ - -usr/share/gir-1.0
3557+ - -usr/share/glib-2.0
3558+ - -usr/share/gtk-doc
3559+ - -usr/share/lintian
3560+ - -usr/share/locale
3561+ - -usr/share/man
3562+ - -usr/share/pam-configs
3563+ - -usr/share/polkit-1
3564+ - -usr/share/upstart
3565+
3566+ # We don't use dhclient so we don't need this helper
3567+ - -usr/lib/NetworkManager/nm-dhcp-helper
3568+ # Things we don't support yet and don't have to ship
3569+ - -usr/lib/NetworkManager/libnm-device-plugin-adsl.so
3570+ - -usr/lib/NetworkManager/libnm-device-plugin-bluetooth.so
3571+ - -usr/lib/NetworkManager/libnm-settings-plugin-ibft.so
3572+
3573+ # Unwanted content coming from the stage debian packages
3574+ - -etc/
3575+ # Contains many libraries which are already present in usr/lib/
3576+ - -lib/
3577+ - -usr/include/
3578+ - -usr/etc
3579+ - -usr/sbin/invoke-rc.d
3580+ - -usr/sbin/service
3581+ - -usr/sbin/update-rc.d
3582+ - -usr/lib/dbus-1.0/
3583+ - -usr/lib/tmpfiles.d/
3584+ - -usr/lib/*/pkgconfig
3585+ - -usr/lib/pkgconfig
3586+ - -usr/lib/gcc/
3587+ - -usr/lib/*/gconv/
3588+ - -usr/lib/girepository-1.0/
3589+ - -usr/lib/systemd/
3590+ - -usr/lib/udev/
3591+ - -usr/lib/*.a
3592+ - -usr/lib/*/*.a
3593+ - -usr/lib/*.la
3594+ - -usr/lib/*/*.la
3595+ - -usr/lib/*/*.o
3596+ - -usr/lib/*/systemd-shim
3597+ - -usr/lib/*/systemd-shim-cgroup-release-agent
3598+ snap:
3599+ - $binaries
3600+ - $configs
3601+ - $docs
3602+ - $rdepends
3603+ - $unwanted
3604+
3605+>>>>>>> snapcraft.yaml
3606diff --git a/spread.yaml b/spread.yaml
3607index 0c615ba..2969c2d 100644
3608--- a/spread.yaml
3609+++ b/spread.yaml
3610@@ -1,5 +1,9 @@
3611 #
3612+<<<<<<< spread.yaml
3613 # Copyright (C) 2016 Canonical Ltd
3614+=======
3615+# Copyright (C) 2015, 2016 Canonical Ltd
3616+>>>>>>> spread.yaml
3617 #
3618 # This program is free software: you can redistribute it and/or modify
3619 # it under the terms of the GNU General Public License version 3 as
3620@@ -13,12 +17,22 @@
3621 # You should have received a copy of the GNU General Public License
3622 # along with this program. If not, see <http://www.gnu.org/licenses/>.
3623
3624+<<<<<<< spread.yaml
3625 project: pulseaudio
3626
3627 environment:
3628 PROJECT_PATH: /home/pulseaudio
3629 TESTSLIB: $PROJECT_PATH/tests/lib
3630 SNAP_NAME: pulseaudio
3631+=======
3632+
3633+project: network-manager
3634+
3635+environment:
3636+ PROJECT_PATH: /home/network-manager
3637+ TESTSLIB: $PROJECT_PATH/tests/lib
3638+ SNAP_NAME: network-manager
3639+>>>>>>> spread.yaml
3640 # Allow the host to pass the channel to use for the test run
3641 SNAP_CHANNEL: $(HOST:echo $SNAP_CHANNEL)
3642
3643@@ -30,7 +44,11 @@ backends:
3644 password: test
3645
3646 # Put this somewhere where we have read-write access
3647+<<<<<<< spread.yaml
3648 path: /home/pulseaudio
3649+=======
3650+path: /home/network-manager
3651+>>>>>>> spread.yaml
3652
3653 exclude:
3654 - .git
3655@@ -38,13 +56,45 @@ exclude:
3656 prepare: |
3657 . $TESTSLIB/prepare-all.sh
3658
3659+<<<<<<< spread.yaml
3660 suites:
3661 tests/main/:
3662 summary: Full-system tests for PulseAudio
3663+=======
3664+# Default is 15 min but we use a higher one here as we build the entire
3665+# network-manager snap inside the global prepare step so we need quite
3666+# some time. Once we can reuse artifacts from other builds we can change
3667+# this back to the default.
3668+kill-timeout: 30m
3669+
3670+suites:
3671+ tests/main/:
3672+ summary: Full-system tests for NetworkManager without ethernet support
3673+>>>>>>> spread.yaml
3674 systems:
3675 - ubuntu-core-16
3676 prepare: |
3677 . $TESTSLIB/prepare.sh
3678 restore-each: |
3679 . $TESTSLIB/restore-each.sh
3680+<<<<<<< spread.yaml
3681
3682+=======
3683+ tests/full/:
3684+ summary: Full-system tests for NetworkManager being the only network management service
3685+ systems:
3686+ - ubuntu-core-16
3687+ prepare: |
3688+ . $TESTSLIB/utilities.sh
3689+ stop_after_first_reboot
3690+ switch_netplan_to_network_manager
3691+ . $TESTSLIB/prepare.sh
3692+ REBOOT
3693+ restore-each: |
3694+ . $TESTSLIB/restore-each.sh
3695+ restore: |
3696+ . $TESTSLIB/utilities.sh
3697+ stop_after_first_reboot
3698+ switch_netplan_to_networkd
3699+ REBOOT
3700+>>>>>>> spread.yaml
3701diff --git a/startup-hooks/99-wol-by-default.sh b/startup-hooks/99-wol-by-default.sh
3702new file mode 100755
3703index 0000000..c2d4480
3704--- /dev/null
3705+++ b/startup-hooks/99-wol-by-default.sh
3706@@ -0,0 +1,13 @@
3707+#!/bin/sh
3708+
3709+# Enable wake-on-lan by default until we have a configuration
3710+# hook to do that.
3711+if [ ! -e $SNAP_DATA/conf.d/enable-wol.conf ] ; then
3712+ mkdir -p $SNAP_DATA/conf.d
3713+ cat <<-EOF > $SNAP_DATA/conf.d/enable-wol.conf
3714+ [connection]
3715+ # Value 64 maps to the 'magic' setting; see man nm-settings
3716+ # for more information.
3717+ 802-3-ethernet.wake-on-lan=64
3718+ EOF
3719+fi
3720diff --git a/tests/full/correct-dns-setup/task.yaml b/tests/full/correct-dns-setup/task.yaml
3721new file mode 100644
3722index 0000000..9b6dfe0
3723--- /dev/null
3724+++ b/tests/full/correct-dns-setup/task.yaml
3725@@ -0,0 +1,47 @@
3726+summary: Verify correct DNS setup
3727+
3728+execute: |
3729+ . $TESTSLIB/utilities.sh
3730+ case $SPREAD_REBOOT in
3731+ 0)
3732+ # For correct timing if the device has just booted
3733+ wait_for_network_manager
3734+
3735+ # Precondition is a existing network connection
3736+ /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
3737+
3738+ # We get a default nameserver from the gateway
3739+ if [ "$SPREAD_BACKEND" = "qemu" ] ; then
3740+ cat /etc/resolv.conf | grep 'nameserver 10.0.2.3'
3741+ fi
3742+
3743+ # Ensure we can resolve a hostname correctly; must give a
3744+ # valid IP address
3745+ address=`python3 -c 'import socket; print(socket.gethostbyname("ubuntu.com"))' 2> /dev/null || echo "invalid"`
3746+ [ "$address" != "invalid" ] && [[ $address =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]
3747+
3748+ # Now lets switch to a system where we have a configuration
3749+ # for ethernet we can change
3750+ rm /etc/netplan/00-snapd-config.yaml
3751+ REBOOT
3752+ ;;
3753+ 1)
3754+ /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
3755+ /snap/bin/network-manager.nmcli d | grep -v netplan
3756+
3757+ connection=$(/snap/bin/network-manager.nmcli -m multiline -f UUID c show --active | awk '{print$2;exit}')
3758+ /snap/bin/network-manager.nmcli c modify $connection ipv4.dns 8.8.8.8
3759+ # We need to bring up the connection again here to get the DNS
3760+ # server really applied to the system.
3761+ /snap/bin/network-manager.nmcli c up $connection
3762+
3763+ # Give system a moment to settle
3764+ sleep 1
3765+
3766+ grep 'nameserver 8.8.8.8' /etc/resolv.conf
3767+ address=`python3 -c 'import socket; print(socket.gethostbyname("ubuntu.com"))' 2> /dev/null || echo "invalid"`
3768+ [ "$address" != "invalid" ] && [[ $address =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]
3769+ ;;
3770+ *)
3771+ ;;
3772+ esac
3773diff --git a/tests/full/dhcp-leases-are-moved/task.yaml b/tests/full/dhcp-leases-are-moved/task.yaml
3774new file mode 100644
3775index 0000000..80cf0e9
3776--- /dev/null
3777+++ b/tests/full/dhcp-leases-are-moved/task.yaml
3778@@ -0,0 +1,35 @@
3779+summary: Verify that the DHCP leases are moved to the correct location
3780+
3781+execute: |
3782+ . $TESTSLIB/utilities.sh
3783+
3784+ wait_for_network_manager
3785+
3786+ # We should have a single lease for eth0 at this point but give
3787+ # NetworkManager some time to do its job
3788+ test -e /run/NetworkManager/dhcp
3789+ test -e /var/snap/network-manager/current/state/dhcp
3790+ n=0
3791+ state_ok=0
3792+ while [ $n -lt 10 ] ; do
3793+ num_leases=`ls -1 /var/snap/network-manager/current/state/dhcp | wc -l`
3794+ num_public_leases=`ls -1 /run/NetworkManager/dhcp | wc -l`
3795+ if [ $num_leases -eq $num_public_leases ]; then
3796+ state_ok=1
3797+ break
3798+ fi
3799+ sleep 0.5
3800+ let n=n+1
3801+ done
3802+ test $state_ok -eq 1
3803+
3804+ # Create a new lease file and ensure it gets copied over
3805+ test ! -e /run/NetworkManager/dhcp/temp.lease
3806+ touch /var/snap/network-manager/current/state/dhcp/temp.lease
3807+ sleep 2
3808+ test -e /run/NetworkManager/dhcp/temp.lease
3809+ # Ensure that the lease is also removed from /run again when it
3810+ # gets removed from SNAP_DATA
3811+ rm /var/snap/network-manager/current/state/dhcp/temp.lease
3812+ sleep 2
3813+ test ! -e /var/snap/network-manager/current/state/dhcp/temp.lease
3814diff --git a/tests/full/immutable-netplan-config/task.yaml b/tests/full/immutable-netplan-config/task.yaml
3815new file mode 100644
3816index 0000000..52c2d61
3817--- /dev/null
3818+++ b/tests/full/immutable-netplan-config/task.yaml
3819@@ -0,0 +1,9 @@
3820+summary: Verify that netplan configuration files are immutable
3821+
3822+execute: |
3823+ # Ensure we're using a configuration generated from netplan
3824+ test -e /etc/netplan/00-snapd-config.yaml
3825+ test -e /run/NetworkManager/system-connections/netplan-eth0
3826+ /snap/bin/network-manager.nmcli c | grep 'netplan.eth0.*eth0'
3827+ # Try to change the DNS server used on this connection
3828+ test ! `/snap/bin/network-manager.nmcli c modify netplan-eth0 ipv4.dns 8.8.8.8`
3829\ No newline at end of file
3830diff --git a/tests/full/ipv6-address-assignment/task.yaml b/tests/full/ipv6-address-assignment/task.yaml
3831new file mode 100644
3832index 0000000..e36ef00
3833--- /dev/null
3834+++ b/tests/full/ipv6-address-assignment/task.yaml
3835@@ -0,0 +1,27 @@
3836+summary: Verify NetworkManager can assign a static IPv6 address to an interface
3837+
3838+restore: |
3839+ # Ensure that the created virtual network interfaces are removed
3840+ # in any case when we're done
3841+ if [ -e /sys/class/net/veth0 ] ; then
3842+ ip link delete veth0
3843+ fi
3844+
3845+execute: |
3846+ . $TESTSLIB/utilities.sh
3847+
3848+ # Ensure that we have IPv6 support enabled in the kernel
3849+ test -e /proc/net/if_inet6
3850+
3851+ ip link add dev veth0 type veth peer name veth1
3852+
3853+ wait_for_network_manager
3854+
3855+ connection=veth-ipv6
3856+ /snap/bin/network-manager.nmcli c add con-name $connection ifname veth0 type ethernet \
3857+ ip6 abbe::cafe
3858+ /snap/bin/network-manager.nmcli c up $connection
3859+
3860+ # Verify that NetworkManager assigned the correct IPv6 address
3861+ # to the interface
3862+ ifconfig veth0 | grep 'abbe::cafe/128'
3863diff --git a/tests/full/ipv6-router-advertisements/task.yaml b/tests/full/ipv6-router-advertisements/task.yaml
3864new file mode 100644
3865index 0000000..4af402b
3866--- /dev/null
3867+++ b/tests/full/ipv6-router-advertisements/task.yaml
3868@@ -0,0 +1,70 @@
3869+summary: Test IPv6 address assignment via router advertisements
3870+
3871+restore: |
3872+ # Ensure that the created virtual network interfaces are removed
3873+ # in any case when we're done
3874+ if [ -e /sys/class/net/veth0 ] ; then
3875+ ip link delete veth0
3876+ fi
3877+
3878+execute: |
3879+ . $TESTSLIB/utilities.sh
3880+
3881+ # Ensure that we have IPv6 support enabled in the kernel
3882+ test -e /proc/net/if_inet6
3883+
3884+ snap install --devmode se-test-tools
3885+ snap connect se-test-tools:home core
3886+ snap connect se-test-tools:network-control core
3887+
3888+ # Create virtual ethernet interface pair
3889+ sudo ip link add dev veth0 type veth peer name veth1
3890+
3891+ # As the virtual ethernet devices don't get IPv6 setup
3892+ # correctly by default we have to do this
3893+ sudo sysctl -w net.ipv6.conf.veth0.disable_ipv6=0
3894+ sudo sysctl -w net.ipv6.conf.veth1.disable_ipv6=0
3895+ veth0_lla=$(mac_to_ipv6 `cat /sys/class/net/veth0/address`)
3896+ veth1_lla=$(mac_to_ipv6 `cat /sys/class/net/veth1/address`)
3897+
3898+ # The radvd daemon will send out router advertisements on veth1
3899+ # so that we can receive them on veth0 end
3900+ cat <<-EOF > /home/test/radvd.conf
3901+ interface veth1 {
3902+ AdvSendAdvert on;
3903+ prefix 2001:db8:1:2::/64 {};
3904+ };
3905+ EOF
3906+
3907+ # To ensure that nobody touches veth1 we tell NetworkManager
3908+ # explicitly to do that.
3909+ /snap/bin/network-manager.nmcli d set veth1 managed no
3910+
3911+ # Assign our link-local addresses
3912+ if ! ip addr show dev veth0 | grep 'inet6.*scope link.*' ; then
3913+ sudo ip addr add dev veth0 scope link $veth0_lla
3914+ fi
3915+ if ! ip addr show dev veth1 | grep 'inet6.*scope link.*' ; then
3916+ sudo ip addr add dev veth1 scope link $veth1_lla
3917+ fi
3918+
3919+ # This will get our router advertisement daemon started and we
3920+ # now configure NetworkManager
3921+ sudo se-test-tools.radvd -C /home/test/radvd.conf -n -d 5 -m stderr -p /home/test/radvd.pid &
3922+
3923+ # Give things a bit more time to settle
3924+ sleep 10
3925+ ip addr show dev veth0
3926+
3927+ # At this point veth0 should have now a global IPv6 address
3928+ # assigned via router advertisements
3929+ ip addr show dev veth0 | grep 'inet6 2001:db8:1:2:.*/64 scope global'
3930+ # but veth1 should not have any
3931+ ip addr show dev veth1 | grep -v 'inet6.*scope global'
3932+
3933+ # NetworkManager should report the same addresses for IPv6
3934+ /snap/bin/network-manager.nmcli d show veth0 | grep 'GENERAL.STATE.*connected'
3935+ /snap/bin/network-manager.nmcli d show veth0 | grep 'IP6.ADDRESS.*2001:db8:1:2.*/64'
3936+
3937+ # Stop the radvd daemon
3938+ kill -TERM `cat /home/test/radvd.pid`
3939diff --git a/tests/full/no-netplan-default-config/task.yaml b/tests/full/no-netplan-default-config/task.yaml
3940new file mode 100644
3941index 0000000..c0d6934
3942--- /dev/null
3943+++ b/tests/full/no-netplan-default-config/task.yaml
3944@@ -0,0 +1,41 @@
3945+summary: Verify ethernet is auto-connected when no default netplan configuration exists
3946+
3947+prepare: |
3948+ cp /etc/netplan/00-snapd-config.yaml /etc/netplan/00-snapd-config.yaml.orig
3949+
3950+restore: |
3951+ mv /etc/netplan/00-snapd-config.yaml.orig /etc/netplan/00-snapd-config.yaml
3952+
3953+execute: |
3954+ . $TESTSLIB/utilities.sh
3955+ case "$SPREAD_REBOOT" in
3956+ 0)
3957+ # Remove all configuration files from netplan to get a system
3958+ # without generated configuration files from netplan
3959+ if [ -e /usr/lib/snapd/generate-network-conf ] ; then
3960+ echo "" > /etc/netplan/00-snapd-config.yaml
3961+ else
3962+ rm /etc/netplan/00-snapd-config.yaml
3963+ fi
3964+ REBOOT
3965+ ;;
3966+ 1)
3967+ # We should be automatically connected now and not via a configuration
3968+ # generated from netplan
3969+ wait_for_network_manager
3970+ /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
3971+ networkctl status eth0 | grep 'State: n/a'
3972+ /snap/bin/network-manager.nmcli c show --active | grep eth0 | grep -v netplan
3973+
3974+ # We should only have a single active configuration
3975+ test `/snap/bin/network-manager.nmcli -m multiline -f UUID c show --active | wc -l` -eq 1
3976+
3977+ # Verify that we can modify the automatically created connection
3978+ connection=$(/snap/bin/network-manager.nmcli -m multiline -f UUID c show --active | awk '{print$2;exit}')
3979+ /snap/bin/network-manager.nmcli c modify $connection 802-3-ethernet.wake-on-lan magic
3980+ wol_value=$(/snap/bin/network-manager.nmcli -f 802-3-ethernet.wake-on-lan c show $connection | xargs | cut -d':' -f 2)
3981+ test "$wol_value" = " 64 (magic)"
3982+ ;;
3983+ *)
3984+ ;;
3985+ esac
3986diff --git a/tests/full/system-network-is-active/task.yaml b/tests/full/system-network-is-active/task.yaml
3987new file mode 100644
3988index 0000000..ee29ef0
3989--- /dev/null
3990+++ b/tests/full/system-network-is-active/task.yaml
3991@@ -0,0 +1,9 @@
3992+summary: Ethernet network should be managed by NetworkManager
3993+
3994+execute: |
3995+ . $TESTSLIB/utilities.sh
3996+ # Verify NetworManager handles ethernet and marks it as connected
3997+ test -e /etc/netplan/00-default-nm-renderer.yaml
3998+ wait_for_network_manager
3999+ /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
4000+ networkctl status eth0 | grep 'State: n/a'
4001diff --git a/tests/full/wol-enabled-by-default/task.yaml b/tests/full/wol-enabled-by-default/task.yaml
4002new file mode 100644
4003index 0000000..4e1989d
4004--- /dev/null
4005+++ b/tests/full/wol-enabled-by-default/task.yaml
4006@@ -0,0 +1,59 @@
4007+summary: Verify that wake-on-lan is enabled by default for all ethernet connections
4008+
4009+execute: |
4010+ . $TESTSLIB/utilities.sh
4011+ nmcli=/snap/bin/network-manager.nmcli
4012+ case "$SPREAD_REBOOT" in
4013+ 0)
4014+ # For correct timing if the device has just booted
4015+ wait_for_network_manager
4016+
4017+ # The config file needs to be present and have the correct default set
4018+ test -e /var/snap/network-manager/current/conf.d/enable-wol.conf
4019+ cat /var/snap/network-manager/current/conf.d/enable-wol.conf | grep '802-3-ethernet.wake-on-lan=64'
4020+
4021+ # Precondition is a existing network connection
4022+ $nmcli d | grep 'eth0.*connected'
4023+
4024+ # The netplan configuration file has WoL disabled by default as
4025+ # the default one the core snap provides does not explicitly
4026+ # enable WoL.
4027+ connection=$($nmcli -m multiline -f UUID c show --active | awk '{print$2;exit}')
4028+ $nmcli -m multiline -f connection.id c show $connection | grep 'netplan-eth0'
4029+ $nmcli -m multiline -f connection.type c show $connection | grep '802-3-ethernet'
4030+ $nmcli -m multiline -f 802-3-ethernet.wake-on-lan c show $connection | grep '0 (none)'
4031+
4032+ # Now prepare for the next boot where we will run without a netplan
4033+ # config to get eth0 correctly configured.
4034+ rm /etc/netplan/00-snapd-config.yaml
4035+ REBOOT
4036+ ;;
4037+ 1)
4038+ # For correct timing if the device has just booted
4039+ wait_for_network_manager
4040+
4041+ # Precondition is a existing network connection
4042+ $nmcli d | grep 'eth0.*connected'
4043+
4044+ # Connection should have the default wake-on-lan setting
4045+ connection=$($nmcli -m multiline -f UUID c show | awk '{print$2;exit}')
4046+ $nmcli -m multiline -f connection.type c show $connection | grep '802-3-ethernet'
4047+ # wake-on-lan should be set to respect the global defaults here
4048+ $nmcli -m multiline -f 802-3-ethernet.wake-on-lan c show $connection | grep '1 (default)'
4049+
4050+ # We can sadly only verify that the value was correctly applied when
4051+ # we're running the tests on a real device. QEMU doesn't support setting
4052+ # the WoL value of the ethernet network device.
4053+ if [ -z "`cat /proc/cpuinfo | grep QEMU`" ] ; then
4054+ # Get the tools snap to have the ethtool tool available
4055+ snap install --devmode --edge se-test-tools
4056+ snap connect se-test-tools:network core
4057+ snap connect se-test-tools:network-bind core
4058+ snap connect se-test-tools:network-control core
4059+
4060+ # See `man ethtool` for details; 'g' means 'wakeup when magic packet comes in'
4061+ # and is the default behavior we want.
4062+ /snap/bin/se-test-tools.ethtool eth0 | grep 'Wake-up: g'
4063+ fi
4064+ ;;
4065+ esac
4066diff --git a/tests/lib/prepare-all.sh b/tests/lib/prepare-all.sh
4067index e53efb4..ab933fd 100644
4068--- a/tests/lib/prepare-all.sh
4069+++ b/tests/lib/prepare-all.sh
4070@@ -6,7 +6,17 @@ if [ -n "$SNAP_CHANNEL" ] ; then
4071 exit 0
4072 fi
4073
4074+<<<<<<< tests/lib/prepare-all.sh
4075 # Setup classic snap and build the pulseaudio snap in there
4076+=======
4077+# If there is a network-manager snap prebuilt for us, lets take
4078+# that one to speed things up.
4079+if [ -e /home/network-manager/network-manager_*_amd64.snap ] ; then
4080+ exit 0
4081+fi
4082+
4083+# Setup classic snap and build the network-manager snap in there
4084+>>>>>>> tests/lib/prepare-all.sh
4085 snap install --devmode --beta classic
4086 cat <<-EOF > /home/test/build-snap.sh
4087 #!/bin/sh
4088@@ -19,6 +29,7 @@ echo "deb http://archive.ubuntu.com/ubuntu/ xenial-proposed restricted main univ
4089 # Ensure we have the latest updates installed as the core snap
4090 # may be a bit out of date.
4091 apt update
4092+<<<<<<< tests/lib/prepare-all.sh
4093 apt upgrade --yes --force-yes
4094
4095 apt install -y --force-yes snapcraft
4096@@ -27,9 +38,22 @@ snapcraft clean
4097 snapcraft
4098 EOF
4099
4100+=======
4101+apt full-upgrade -y --force-yes
4102+
4103+apt install -y --force-yes snapcraft
4104+cd /home/network-manager
4105+snapcraft clean
4106+snapcraft
4107+EOF
4108+>>>>>>> tests/lib/prepare-all.sh
4109 chmod +x /home/test/build-snap.sh
4110 sudo classic /home/test/build-snap.sh
4111 snap remove classic
4112
4113 # Make sure we have a snap build
4114+<<<<<<< tests/lib/prepare-all.sh
4115 test -e /home/pulseaudio/pulseaudio_*_amd64.snap
4116+=======
4117+test -e /home/network-manager/network-manager_*_amd64.snap
4118+>>>>>>> tests/lib/prepare-all.sh
4119diff --git a/tests/lib/prepare.sh b/tests/lib/prepare.sh
4120index 60a45e9..2d677d6 100644
4121--- a/tests/lib/prepare.sh
4122+++ b/tests/lib/prepare.sh
4123@@ -1,4 +1,8 @@
4124 #!/bin/bash
4125+<<<<<<< tests/lib/prepare.sh
4126+=======
4127+. $TESTSLIB/utilities.sh
4128+>>>>>>> tests/lib/prepare.sh
4129
4130 echo "Wait for firstboot change to be ready"
4131 while ! snap changes | grep -q "Done"; do
4132@@ -21,6 +25,7 @@ done
4133 echo "Kernel has a store revision"
4134 snap list | grep ^${kernel_name} | grep -E " [0-9]+\s+canonical"
4135
4136+<<<<<<< tests/lib/prepare.sh
4137 # If we don't install pulseaudio here we get a system
4138 # without any network connectivity after reboot.
4139 if [ -n "$SNAP_CHANNEL" ] ; then
4140@@ -45,6 +50,27 @@ if [ ! -f $SPREAD_PATH/snapd-state.tar.gz ] ; then
4141 tar czf $SPREAD_PATH/snapd-state.tar.gz /var/lib/snapd
4142 systemctl start snapd.socket
4143 fi
4144+=======
4145+# Remove any existing state archive from other test suites
4146+rm -f /home/network-manager/snapd-state.tar.gz
4147+rm -f /home/network-manager/nm-state.tar.gz
4148+
4149+snap_install network-manager
4150+
4151+# Snapshot of the current snapd state for a later restore
4152+systemctl stop snapd.service snapd.socket
4153+tar czf $SPREAD_PATH/snapd-state.tar.gz /var/lib/snapd /etc/netplan
4154+systemctl start snapd.socket
4155+
4156+# And also snapshot NetworkManager's state
4157+systemctl stop snap.network-manager.networkmanager
4158+tar czf $SPREAD_PATH/nm-state.tar.gz /var/snap/network-manager
4159+systemctl start snap.network-manager.networkmanager
4160+
4161+# Make sure the original netplan configuration is applied and active
4162+netplan generate
4163+netplan apply
4164+>>>>>>> tests/lib/prepare.sh
4165
4166 # For debugging dump all snaps and connected slots/plugs
4167 snap list
4168diff --git a/tests/lib/restore-each.sh b/tests/lib/restore-each.sh
4169index 541ba8c..8808746 100644
4170--- a/tests/lib/restore-each.sh
4171+++ b/tests/lib/restore-each.sh
4172@@ -1,12 +1,20 @@
4173 #!/bin/bash
4174
4175 . $TESTSLIB/snap-names.sh
4176+<<<<<<< tests/lib/restore-each.sh
4177+=======
4178+. $TESTSLIB/utilities.sh
4179+>>>>>>> tests/lib/restore-each.sh
4180
4181 # Remove all snaps not being the core, gadget, kernel or snap we're testing
4182 for snap in /snap/*; do
4183 snap="${snap:6}"
4184 case "$snap" in
4185+<<<<<<< tests/lib/restore-each.sh
4186 "bin" | "$gadget_name" | "$kernel_name" | "$core_name" | "$SNAP_NAME")
4187+=======
4188+ "bin" | "$gadget_name" | "$kernel_name" | "$core_name" | "$SNAP_NAME" )
4189+>>>>>>> tests/lib/restore-each.sh
4190 ;;
4191 *)
4192 snap remove "$snap"
4193@@ -14,9 +22,28 @@ for snap in /snap/*; do
4194 esac
4195 done
4196
4197+<<<<<<< tests/lib/restore-each.sh
4198+=======
4199+# Drop any generated or modified netplan configuration files. The original
4200+# ones will be restored below.
4201+rm -f /etc/netplan/*
4202+
4203+>>>>>>> tests/lib/restore-each.sh
4204 # Ensure we have the same state for snapd as we had before
4205 systemctl stop snapd.service snapd.socket
4206 rm -rf /var/lib/snapd/*
4207 tar xzf $SPREAD_PATH/snapd-state.tar.gz -C /
4208 rm -rf /root/.snap
4209 systemctl start snapd.service snapd.socket
4210+<<<<<<< tests/lib/restore-each.sh
4211+=======
4212+
4213+systemctl stop snap.network-manager.networkmanager
4214+rm -rf /var/snap/network-manager/*
4215+tar xzf $SPREAD_PATH/nm-state.tar.gz -C /
4216+systemctl start snap.network-manager.networkmanager
4217+
4218+# Make sure the original netplan configuration is applied and active
4219+netplan generate
4220+netplan apply
4221+>>>>>>> tests/lib/restore-each.sh
4222diff --git a/tests/lib/utilities.sh b/tests/lib/utilities.sh
4223index 977d045..c14cdda 100644
4224--- a/tests/lib/utilities.sh
4225+++ b/tests/lib/utilities.sh
4226@@ -1,9 +1,71 @@
4227 #!/bin/sh
4228+<<<<<<< tests/lib/utilities.sh
4229
4230 wait_for_pulseaudio() {
4231 while ! systemctl status snap.pulseaudio.pulseaudio ; do
4232+=======
4233+snap_install() {
4234+ name=$1
4235+ if [ -n "$SNAP_CHANNEL" ] ; then
4236+ # Don't reinstall if we have it installed already
4237+ if ! snap list | grep $name ; then
4238+ snap install --$SNAP_CHANNEL $name
4239+ fi
4240+ else
4241+ # Need first install from store to get all necessary assertions into
4242+ # place. Second local install will then bring in our locally built
4243+ # snap.
4244+ snap install $name
4245+ snap install --dangerous $PROJECT_PATH/$name*_amd64.snap
4246+ fi
4247+}
4248+
4249+switch_netplan_to_network_manager() {
4250+ if [ -e /etc/netplan/00-default-nm-renderer.yaml ] ; then
4251+ return 0
4252+ fi
4253+
4254+ cat <<-EOF > /etc/netplan/00-default-nm-renderer.yaml
4255+network:
4256+ renderer: NetworkManager
4257+ EOF
4258+}
4259+
4260+switch_netplan_to_networkd() {
4261+ if [ ! -e /etc/netplan/00-default-nm-renderer.yaml ] ; then
4262+ return 0
4263+ fi
4264+
4265+ rm /etc/netplan/00-default-nm-renderer.yaml
4266+}
4267+
4268+wait_for_systemd_service() {
4269+ while ! systemctl status $1 ; do
4270+>>>>>>> tests/lib/utilities.sh
4271 sleep 1
4272 done
4273 sleep 1
4274 }
4275
4276+<<<<<<< tests/lib/utilities.sh
4277+=======
4278+wait_for_network_manager() {
4279+ wait_for_systemd_service snap.network-manager.networkmanager
4280+}
4281+
4282+stop_after_first_reboot() {
4283+ if [ $SPREAD_REBOOT -eq 1 ] ; then
4284+ exit 0
4285+ fi
4286+}
4287+
4288+mac_to_ipv6() {
4289+ mac=$1
4290+ ipv6_address=fe80::$(printf %02x $((0x${mac%%:*} ^ 2)))
4291+ mac=${mac#*:}
4292+ ipv6_address=$ipv6_address${mac%:*:*:*}ff:fe
4293+ mac=${mac#*:*:}
4294+ ipv6_address=$ipv6_address${mac%:*}${mac##*:}
4295+ echo $ipv6_address
4296+}
4297+>>>>>>> tests/lib/utilities.sh
4298diff --git a/tests/main/aliases/task.yaml b/tests/main/aliases/task.yaml
4299new file mode 100644
4300index 0000000..e2eff9d
4301--- /dev/null
4302+++ b/tests/main/aliases/task.yaml
4303@@ -0,0 +1,13 @@
4304+summary: Verify aliases provided by the snap are correctly enabled
4305+
4306+execute: |
4307+ # FIXME: Aliases should be not in place automatically unless we
4308+ # have them approved from the store in our snap-declaration assertion.
4309+ test ! -e /snap/bin/nmcli
4310+
4311+ snap alias network-manager nmcli
4312+
4313+ test -e /snap/bin/nmcli
4314+
4315+ # Verify the alias works without any problems
4316+ /snap/bin/nmcli g
4317diff --git a/tests/main/ethernet-managed-by-networkd/task.yaml b/tests/main/ethernet-managed-by-networkd/task.yaml
4318new file mode 100644
4319index 0000000..80e75cb
4320--- /dev/null
4321+++ b/tests/main/ethernet-managed-by-networkd/task.yaml
4322@@ -0,0 +1,7 @@
4323+summary: When not specific configuration is in place networkd manages ethernet
4324+
4325+execute: |
4326+ . $TESTSLIB/utilities.sh
4327+ networkctl | grep 'eth0.*routable'
4328+ wait_for_network_manager
4329+ /snap/bin/network-manager.nmcli d | grep 'eth0.*unmanaged'
4330diff --git a/tests/main/installation/task.yaml b/tests/main/installation/task.yaml
4331index 2d9fb0d..5471ecc 100644
4332--- a/tests/main/installation/task.yaml
4333+++ b/tests/main/installation/task.yaml
4334@@ -1,9 +1,14 @@
4335+<<<<<<< tests/main/installation/task.yaml
4336 summary: Test pulseaudio snap installation was successful
4337+=======
4338+summary: Test network-manager snap installation was successful
4339+>>>>>>> tests/main/installation/task.yaml
4340
4341 execute: |
4342 . $TESTSLIB/utilities.sh
4343
4344 # Service should be up an running
4345+<<<<<<< tests/main/installation/task.yaml
4346 wait_for_pulseaudio
4347 systemctl status snap.pulseaudio.pulseaudio | grep -Pzq ': active'
4348
4349@@ -14,3 +19,14 @@ execute: |
4350 snap interfaces | grep -Pzq "pulseaudio:service +pulseaudio:client"
4351 snap interfaces | grep -P "\-\ +pulseaudio:home"
4352
4353+=======
4354+ wait_for_network_manager
4355+
4356+ # .. and nmcli should be able to reach NetworkManager
4357+ /snap/bin/network-manager.nmcli g
4358+
4359+ # Ensure all necessary plugs/slots are connected
4360+ snap interfaces | grep -Pzq ":network-setup-observe +network-manager"
4361+ snap interfaces | grep -Pzq ":ppp +network-manager"
4362+ snap interfaces | grep -Pzq "network-manager:service +network-manager:nmcli"
4363+>>>>>>> tests/main/installation/task.yaml
4364diff --git a/tests/main/set-hostname/task.yaml b/tests/main/set-hostname/task.yaml
4365new file mode 100644
4366index 0000000..ddcabd9
4367--- /dev/null
4368+++ b/tests/main/set-hostname/task.yaml
4369@@ -0,0 +1,13 @@
4370+summary: Verify we can modify the hostname of the system
4371+
4372+execute: |
4373+ # Print out current hostname for nm and hostnamed to have a reference
4374+ # for debugging later.
4375+ /snap/bin/network-manager.nmcli general hostname
4376+ hostnamectl
4377+
4378+ expected_hostname=foobar
4379+ /snap/bin/network-manager.nmcli general hostname $expected_hostname
4380+ test "`/snap/bin/network-manager.nmcli general hostname`" = "$expected_hostname"
4381+ test "`hostnamectl status | grep Static`" = " Static hostname: $expected_hostname"
4382+ test "`hostname`" = "$expected_hostname"
4383diff --git a/tests/main/static-ip-configuration/task.yaml b/tests/main/static-ip-configuration/task.yaml
4384new file mode 100644
4385index 0000000..00031fc
4386--- /dev/null
4387+++ b/tests/main/static-ip-configuration/task.yaml
4388@@ -0,0 +1,49 @@
4389+summary: Test static IP configuration
4390+
4391+restore: |
4392+ # Ensure that the created virtual network interfaces are removed
4393+ # in any case when we're done
4394+ if [ -e /sys/class/net/veth0 ] ; then
4395+ ip link delete veth0
4396+ fi
4397+
4398+execute: |
4399+ . $TESTSLIB/utilities.sh
4400+
4401+ ip link add dev veth0 type veth peer name veth1
4402+
4403+ wait_for_network_manager
4404+ # NetworkManager should ignore the other side of our pipe so
4405+ # that we can configure it statically.
4406+ /snap/bin/network-manager.nmcli d set veth1 managed no
4407+ ip addr add 10.0.1.1/24 dev veth1
4408+
4409+ connection=veth0-static
4410+ /snap/bin/network-manager.nmcli c add con-name $connection type ethernet ifname veth0 \
4411+ ip4 10.0.1.2/24
4412+ /snap/bin/network-manager.nmcli c up $connection
4413+ /snap/bin/network-manager.nmcli d | grep 'veth0.*connected'
4414+
4415+ # Address should be correctly applied now
4416+ expected_veth0_address="10.0.1.2/24"
4417+ /snap/bin/network-manager.nmcli -m multiline -f IP4.ADDRESS c show veth0-static | grep $expected_veth0_address
4418+ ip addr show dev veth0 | grep 'UP'
4419+ ip addr show dev veth0 | grep $expected_veth0_address
4420+
4421+ # Routing needs to be in place as well
4422+ expected_veth0_route="10.0.1.0/24 dev veth0 proto kernel scope link src 10.0.1.2 metric 100"
4423+ ip route | grep "$expected_veth0_route"
4424+
4425+ # Disable connection and ensure IP configuration is removed
4426+ /snap/bin/network-manager.nmcli c down $connection
4427+ ip addr show dev veth0 | grep -v $expected_veth0_address
4428+ ip route | grep -v "$expected_veth0_route"
4429+
4430+ # Enabling network connection again and removing it should remove
4431+ # the IP configuration too
4432+ /snap/bin/network-manager.nmcli c up $connection
4433+ ip addr show dev veth0 | grep $expected_veth0_address
4434+ ip route | grep "$expected_veth0_route"
4435+ /snap/bin/network-manager.nmcli c delete $connection
4436+ ip addr show dev veth0 | grep -v $expected_veth0_address
4437+ ip route | grep -v "$expected_veth0_route"
4438\ No newline at end of file
4439diff --git a/tests/main/suspend-resume/task.yaml b/tests/main/suspend-resume/task.yaml
4440new file mode 100644
4441index 0000000..b5df7d1
4442--- /dev/null
4443+++ b/tests/main/suspend-resume/task.yaml
4444@@ -0,0 +1,80 @@
4445+summary: Verify suspend/resume tracking works reliable
4446+
4447+restore: |
4448+ rmmod mac80211_hwsim
4449+
4450+execute: |
4451+ # Install necessary test-tools, we need inotify-tools in this case
4452+ snap install --edge se-test-tools
4453+
4454+ # Get two connected wifi network interfaces wlan0 and wlan1
4455+ modprobe mac80211_hwsim radios=2
4456+
4457+ # FIXME: take the one from edge for now as that is the one which
4458+ # has automatic setup capabilities
4459+ snap install --edge wifi-ap
4460+
4461+ /snap/bin/network-manager.nmcli d wifi rescan
4462+ while ! /snap/bin/network-manager.nmcli d wifi | grep Ubuntu ; do
4463+ /snap/bin/network-manager.nmcli d wifi rescan
4464+ sleep 1
4465+ done
4466+
4467+ /snap/bin/network-manager.nmcli d wifi connect Ubuntu
4468+
4469+ # Override the existing systemd-suspend service unit with a customized
4470+ # one to prevent the device from entering real suspend. The service unit
4471+ # will block as long as no new files gets created inside the specified
4472+ # directory inotifywait listens for changes on.
4473+ cat <<-EOF > $PROJECT_PATH/systemd-suspend.service
4474+ [Unit]
4475+ Description=Suspend
4476+ Documentation=man:systemd-suspend.service(8)
4477+ DefaultDependencies=no
4478+ [Service]
4479+ Type=oneshot
4480+ ExecStart=/bin/sh -c '/snap/bin/se-test-tools.inotifywait -e create /home/network-manager/systemd-suspend'
4481+ EOF
4482+ mkdir -p /home/network-manager/systemd-suspend
4483+ mount -o bind,ro $PROJECT_PATH/systemd-suspend.service /lib/systemd/system/systemd-suspend.service
4484+ systemctl daemon-reload
4485+
4486+ # NetworkManager should have an inhibit lock in place by default
4487+ systemd-inhibit --list | grep "NetworkManager needs to turn off networks"
4488+
4489+ service=snap.network-manager.networkmanager
4490+
4491+ # Flush the syslog so that we can reliable grep it once we triggered
4492+ # the system suspend
4493+ journalctl --flush -u $service
4494+
4495+ # Kick off the actual suspend in background so that we can continue
4496+ # verifying the correct state left by the system before it would
4497+ # normally enter a sleep state.
4498+ systemctl suspend --no-block &
4499+
4500+ # The easiest way to ensure NetworkManager did the right thing is
4501+ # by going through its log output and verifying it prints out
4502+ # what we expect.
4503+ journalctl --no-pager -u $service | grep 'manager: sleep requested'
4504+ journalctl --no-pager -u $service | grep 'manager: sleeping...'
4505+ journalctl --no-pager -u $service | grep "device (wlan1): state change: activated -> unmanaged (reason 'sleeping')"
4506+ journalctl --no-pager -u $service | grep 'manager: NetworkManager state is now ASLEEP'
4507+
4508+ # Connection should be reported as disconnected
4509+ /snap/bin/network-manager.nmcli d | grep -v 'wlan1.*connected'
4510+ # .. and interface should be disabled
4511+ ifconfig | grep -v wlan1
4512+
4513+ # Now we wakeup the system again and verify NetworkManager
4514+ # is correctly setting up the ethernet port again.
4515+ journalctl --flush -u $service
4516+ touch $PROJECT_PATH/systemd-suspend/wakeup
4517+
4518+ journalctl --no-pager -u $service | grep 'manager: wake requested (sleeping: yes enabled: yes)'
4519+ journalctl --no-pager -u $service | grep 'manager: NetworkManager state is now CONNECTED_LOCAL'
4520+ journalctl --no-pager -u $service | grep 'manager: NetworkManager state is now CONNECTED_GLOBAL'
4521+ journalctl --no-pager -u $service | grep 'device (wlan1): Activation: successful, device activated.'
4522+
4523+ ifconfig | grep wlan1
4524+ /snap/bin/network-manager.nmcli d | grep -v 'wlan1.*connected'
4525diff --git a/tests/main/switch-netplan-renderer/task.yaml b/tests/main/switch-netplan-renderer/task.yaml
4526new file mode 100644
4527index 0000000..4453b6a
4528--- /dev/null
4529+++ b/tests/main/switch-netplan-renderer/task.yaml
4530@@ -0,0 +1,40 @@
4531+summary: Dynamically switch the netplan renderer
4532+
4533+execute: |
4534+ . $TESTSLIB/utilities.sh
4535+ case "$SPREAD_REBOOT" in
4536+ 0)
4537+ wait_for_network_manager
4538+
4539+ # networkd manages eth0 and NetworkManager does not
4540+ networkctl | grep 'eth0.*routable'
4541+ /snap/bin/network-manager.nmcli d | grep 'eth0.*unmanaged'
4542+
4543+ # Now we switch back to the NetworkManager backend for netplan
4544+ switch_netplan_to_network_manager
4545+ REBOOT
4546+ ;;
4547+ 1)
4548+ test -e /etc/netplan/00-default-nm-renderer.yaml
4549+
4550+ # Give NetworkManager a bit to come up after the reboot
4551+ wait_for_network_manager
4552+
4553+ # NetworkManager now controls eth0 and networkd does not
4554+ /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
4555+ networkctl status eth0 | grep 'State: n/a'
4556+
4557+ # And switch back to networkd
4558+ switch_netplan_to_networkd
4559+ REBOOT
4560+ ;;
4561+ 2)
4562+ wait_for_network_manager
4563+
4564+ # networkd manages eth0 and NetworkManager does not
4565+ networkctl | grep 'eth0.*routable'
4566+ /snap/bin/network-manager.nmcli d | grep 'eth0.*unmanaged'
4567+ ;;
4568+ *)
4569+ ;;
4570+ esac
4571diff --git a/tests/main/wifi-connect-secured-ap/task.yaml b/tests/main/wifi-connect-secured-ap/task.yaml
4572new file mode 100644
4573index 0000000..aa6a70c
4574--- /dev/null
4575+++ b/tests/main/wifi-connect-secured-ap/task.yaml
4576@@ -0,0 +1,38 @@
4577+summary: Test connection to a secured WiFi AP
4578+
4579+environment:
4580+ WIFI_SSID: Ubuntu
4581+ WIFI_PASSPHRASE: Test1234
4582+
4583+restore: |
4584+ rmmod mac80211_hwsim
4585+
4586+execute: |
4587+ # Get two connected wifi network interfaces wlan0 and wlan1 and
4588+ # give the system soem time to settle
4589+ modprobe mac80211_hwsim radios=2
4590+ sleep 1
4591+
4592+ snap install wifi-ap
4593+ # FIXME: until the wifi-ap utility is clever enough to retry
4594+ # connecting with the service we need to add a short sleep here
4595+ sleep 0.5
4596+
4597+ # Setup the AP on wlan0
4598+ /snap/bin/wifi-ap.config set wifi.interface wlan0
4599+ /snap/bin/wifi-ap.config set wifi.ssid $WIFI_SSID
4600+ /snap/bin/wifi-ap.config set wifi.security wpa2
4601+ /snap/bin/wifi-ap.config set wifi.security-passphrase $WIFI_PASSPHRASE
4602+
4603+ # AP needs a bit to appear and be visible for NetworkManager
4604+ /snap/bin/network-manager.nmcli d wifi rescan
4605+ while ! /snap/bin/network-manager.nmcli d wifi | grep Ubuntu ; do
4606+ /snap/bin/network-manager.nmcli d wifi rescan
4607+ sleep 1
4608+ done
4609+
4610+ /snap/bin/network-manager.nmcli d wifi | grep $WIFI_SSID
4611+
4612+ # Connect to the AP and ensure the connection was established
4613+ /snap/bin/network-manager.nmcli d wifi connect $WIFI_SSID password $WIFI_PASSPHRASE
4614+ /snap/bin/network-manager.nmcli d | grep 'wlan1.*connected'
4615diff --git a/tests/main/wifi-powersave-config-option/task.yaml b/tests/main/wifi-powersave-config-option/task.yaml
4616new file mode 100644
4617index 0000000..56344ec
4618--- /dev/null
4619+++ b/tests/main/wifi-powersave-config-option/task.yaml
4620@@ -0,0 +1,28 @@
4621+summary: Verify WiFi powersave can be enabled via a snap config option
4622+
4623+environment:
4624+ WIFI_POWERSAVE_CONF_PATH: /var/snap/network-manager/current/conf.d/wifi-powersave.conf
4625+
4626+execute: |
4627+ . $TESTSLIB/utilities.sh
4628+
4629+ # The mac80211_hwsim driver does not support the powersave mode
4630+ # so we can't check this reliable.
4631+
4632+ test "`snap get network-manager wifi.powersave`" = "disabled"
4633+ grep "wifi.powersave = 2" $WIFI_POWERSAVE_CONF_PATH
4634+
4635+ # Try to enable and disable again
4636+ snap set network-manager wifi.powersave=enabled
4637+ test "`snap get network-manager wifi.powersave`" = "enabled"
4638+ grep "wifi.powersave = 3" $WIFI_POWERSAVE_CONF_PATH
4639+
4640+ snap set network-manager wifi.powersave=disabled
4641+ test "`snap get network-manager wifi.powersave`" = "disabled"
4642+ grep "wifi.powersave = 2" $WIFI_POWERSAVE_CONF_PATH
4643+
4644+ # Specifying no value means the snap should use the default
4645+ # which is 'disable'
4646+ snap set network-manager wifi.powersave=
4647+ test "`snap get network-manager wifi.powersave`" = "disabled"
4648+ grep "wifi.powersave = 2" $WIFI_POWERSAVE_CONF_PATH
4649diff --git a/tests/main/wifi-wowlan-config-option/task.yaml b/tests/main/wifi-wowlan-config-option/task.yaml
4650new file mode 100644
4651index 0000000..bb34a01
4652--- /dev/null
4653+++ b/tests/main/wifi-wowlan-config-option/task.yaml
4654@@ -0,0 +1,55 @@
4655+summary: Verify WiFi WoWLAN can be enabled via a snap config option
4656+
4657+environment:
4658+ WIFI_WOWL_CONF_PATH: /var/snap/network-manager/current/conf.d/wifi-wowlan.conf
4659+
4660+execute: |
4661+ . $TESTSLIB/utilities.sh
4662+
4663+ # The mac80211_hwsim driver does not support WoWLAN so we can't
4664+ # check this reliable on the hardware level and will only check
4665+ # in the following that the correct configuration for
4666+ # NetworkManager itself is written out.
4667+
4668+ test `snap get network-manager wifi.wake-on-wlan` = disabled
4669+ grep "^wifi.wake-on-wlan=0$" $WIFI_WOWL_CONF_PATH
4670+
4671+ test "`snap get network-manager wifi.wake-on-wlan-password`" = ""
4672+ grep -v "^wifi.wake-on-wlan-password=.*$" $WIFI_WOWL_CONF_PATH
4673+
4674+ snap set network-manager wifi.wake-on-wlan-password=Test1234
4675+ grep "^wifi.wake-on-wlan-password=Test1234$" $WIFI_WOWL_CONF_PATH
4676+ # Setting the password alone should keep the actual WoWLAN value
4677+ # still unset so that NetworkManager uses its default.
4678+ grep -v "^wifi.wake-on-wlan=.*$" $WIFI_WOWL_CONF_PATH
4679+
4680+ snap set network-manager wifi.wake-on-wlan=magic
4681+ grep "^wifi.wake-on-wlan=8$" $WIFI_WOWL_CONF_PATH
4682+ grep "^wifi.wake-on-wlan-password=Test1234$" $WIFI_WOWL_CONF_PATH
4683+
4684+ # Test all other possible keys for the wifi.wake-on-wlan option
4685+ snap set network-manager wifi.wake-on-wlan=disabled
4686+ grep "^wifi.wake-on-wlan=0$" $WIFI_WOWL_CONF_PATH
4687+ snap set network-manager wifi.wake-on-wlan=any
4688+ grep "^wifi.wake-on-wlan=2$" $WIFI_WOWL_CONF_PATH
4689+ snap set network-manager wifi.wake-on-wlan=disconnect
4690+ grep "^wifi.wake-on-wlan=4$" $WIFI_WOWL_CONF_PATH
4691+ snap set network-manager wifi.wake-on-wlan=magic
4692+ grep "^wifi.wake-on-wlan=8$" $WIFI_WOWL_CONF_PATH
4693+ snap set network-manager wifi.wake-on-wlan=gtk-rekey-failure
4694+ grep "^wifi.wake-on-wlan=16$" $WIFI_WOWL_CONF_PATH
4695+ snap set network-manager wifi.wake-on-wlan=eap-identity-request
4696+ grep "^wifi.wake-on-wlan=32$" $WIFI_WOWL_CONF_PATH
4697+ snap set network-manager wifi.wake-on-wlan=4way-handshake
4698+ grep "^wifi.wake-on-wlan=64$" $WIFI_WOWL_CONF_PATH
4699+ snap set network-manager wifi.wake-on-wlan=rfkill-release
4700+ grep "^wifi.wake-on-wlan=128$" $WIFI_WOWL_CONF_PATH
4701+ snap set network-manager wifi.wake-on-wlan=tcp
4702+ grep "^wifi.wake-on-wlan=256$" $WIFI_WOWL_CONF_PATH
4703+
4704+ # Not setting any concrete value should remove the configuration
4705+ snap set network-manager wifi.wake-on-wlan-password=
4706+ grep -v "^wifi.wake-on-wlan-password=.*$" $WIFI_WOWL_CONF_PATH
4707+ snap set network-manager wifi.wake-on-wlan=
4708+ grep -v "^wifi.wake-on-wlan=.*$" $WIFI_WOWL_CONF_PATH
4709+ grep -v "^wifi.wake-on-wlan-password=.*$" $WIFI_WOWL_CONF_PATH

Subscribers

People subscribed via source and target branches