Merge branch 'master' into list_container_processes-feature

This commit is contained in:
Victor Vieux 2013-07-12 11:47:27 +00:00
commit 9232d1ef62
70 changed files with 2660 additions and 1158 deletions

1
.gitignore vendored
View file

@ -15,3 +15,4 @@ docs/_build
docs/_static
docs/_templates
.gopath/
.dotcloud

View file

@ -1,5 +1,22 @@
# Changelog
## 0.4.8 (2013-07-01)
+ Builder: New build operation ENTRYPOINT adds an executable entry point to the container.
- Runtime: Fix a bug which caused 'docker run -d' to no longer print the container ID.
- Tests: Fix issues in the test suite
## 0.4.7 (2013-06-28)
* Registry: easier push/pull to a custom registry
* Remote API: the progress bar updates faster when downloading and uploading large files
- Remote API: fix a bug in the optional unix socket transport
* Runtime: improve detection of kernel version
+ Runtime: host directories can be mounted as volumes with 'docker run -b'
- Runtime: fix an issue when only attaching to stdin
* Runtime: use 'tar --numeric-owner' to avoid uid mismatch across multiple hosts
* Hack: improve test suite and dev environment
* Hack: remove dependency on unit tests on 'os/user'
+ Documentation: add terminology section
## 0.4.6 (2013-06-22)
- Runtime: fix a bug which caused creation of empty images (and volumes) to crash.

30
Dockerfile Normal file
View file

@ -0,0 +1,30 @@
# This file describes the standard way to build Docker, using docker
docker-version 0.4.2
from ubuntu:12.04
maintainer Solomon Hykes <solomon@dotcloud.com>
# Build dependencies
run apt-get install -y -q curl
run apt-get install -y -q git
# Install Go
run curl -s https://go.googlecode.com/files/go1.1.1.linux-amd64.tar.gz | tar -v -C /usr/local -xz
env PATH /usr/local/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
env GOPATH /go
env CGO_ENABLED 0
run cd /tmp && echo 'package main' > t.go && go test -a -i -v
# Download dependencies
run PKG=github.com/kr/pty REV=27435c699; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV
run PKG=github.com/gorilla/context/ REV=708054d61e5; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV
run PKG=github.com/gorilla/mux/ REV=9b36453141c; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV
# Run dependencies
run apt-get install -y iptables
# lxc requires updating ubuntu sources
run echo 'deb http://archive.ubuntu.com/ubuntu precise main universe' > /etc/apt/sources.list
run apt-get update
run apt-get install -y lxc
run apt-get install -y aufs-tools
# Upload docker source
add . /go/src/github.com/dotcloud/docker
# Build the binary
run cd /go/src/github.com/dotcloud/docker/docker && go install -ldflags "-X main.GITCOMMIT '??' -d -w"
env PATH /usr/local/go/bin:/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
cmd ["docker"]

View file

@ -23,15 +23,15 @@ happens, for a few reasons:
* *Size*: VMs are very large which makes them impractical to store and transfer.
* *Performance*: running VMs consumes significant CPU and memory, which makes them impractical in many scenarios, for example local development of multi-tier applications, and
large-scale deployment of cpu and memory-intensive applications on large numbers of machines.
large-scale deployment of cpu and memory-intensive applications on large numbers of machines.
* *Portability*: competing VM environments don't play well with each other. Although conversion tools do exist, they are limited and add even more overhead.
* *Hardware-centric*: VMs were designed with machine operators in mind, not software developers. As a result, they offer very limited tooling for what developers need most:
building, testing and running their software. For example, VMs offer no facilities for application versioning, monitoring, configuration, logging or service discovery.
building, testing and running their software. For example, VMs offer no facilities for application versioning, monitoring, configuration, logging or service discovery.
By contrast, Docker relies on a different sandboxing method known as *containerization*. Unlike traditional virtualization,
containerization takes place at the kernel level. Most modern operating system kernels now support the primitives necessary
for containerization, including Linux with [openvz](http://openvz.org), [vserver](http://linux-vserver.org) and more recently [lxc](http://lxc.sourceforge.net),
Solaris with [zones](http://docs.oracle.com/cd/E26502_01/html/E29024/preface-1.html#scrolltoc) and FreeBSD with [Jails](http://www.freebsd.org/doc/handbook/jails.html).
Solaris with [zones](http://docs.oracle.com/cd/E26502_01/html/E29024/preface-1.html#scrolltoc) and FreeBSD with [Jails](http://www.freebsd.org/doc/handbook/jails.html).
Docker builds on top of these low-level primitives to offer developers a portable format and runtime environment that solves
all 4 problems. Docker containers are small (and their transfer can be optimized with layers), they have basically zero memory and cpu overhead,
@ -56,17 +56,17 @@ A common problem for developers is the difficulty of managing all their applicat
This is usually difficult for several reasons:
* *Cross-platform dependencies*. Modern applications often depend on a combination of system libraries and binaries, language-specific packages, framework-specific modules,
internal components developed for another project, etc. These dependencies live in different "worlds" and require different tools - these tools typically don't work
well with each other, requiring awkward custom integrations.
internal components developed for another project, etc. These dependencies live in different "worlds" and require different tools - these tools typically don't work
well with each other, requiring awkward custom integrations.
* Conflicting dependencies. Different applications may depend on different versions of the same dependency. Packaging tools handle these situations with various degrees of ease -
but they all handle them in different and incompatible ways, which again forces the developer to do extra work.
but they all handle them in different and incompatible ways, which again forces the developer to do extra work.
* Custom dependencies. A developer may need to prepare a custom version of his application's dependency. Some packaging systems can handle custom versions of a dependency,
others can't - and all of them handle it differently.
* Custom dependencies. A developer may need to prepare a custom version of their application's dependency. Some packaging systems can handle custom versions of a dependency,
others can't - and all of them handle it differently.
Docker solves dependency hell by giving the developer a simple way to express *all* his application's dependencies in one place,
Docker solves dependency hell by giving the developer a simple way to express *all* their application's dependencies in one place,
and streamline the process of assembling them. If this makes you think of [XKCD 927](http://xkcd.com/927/), don't worry. Docker doesn't
*replace* your favorite packaging systems. It simply orchestrates their use in a simple and repeatable way. How does it do that? With layers.

20
api.go
View file

@ -170,7 +170,7 @@ func getContainersExport(srv *Server, version float64, w http.ResponseWriter, r
name := vars["name"]
if err := srv.ContainerExport(name, w); err != nil {
utils.Debugf("%s", err.Error())
utils.Debugf("%s", err)
return err
}
return nil
@ -323,7 +323,7 @@ func postCommit(srv *Server, version float64, w http.ResponseWriter, r *http.Req
}
config := &Config{}
if err := json.NewDecoder(r.Body).Decode(config); err != nil {
utils.Debugf("%s", err.Error())
utils.Debugf("%s", err)
}
repo := r.Form.Get("repo")
tag := r.Form.Get("tag")
@ -359,8 +359,7 @@ func postImagesCreate(srv *Server, version float64, w http.ResponseWriter, r *ht
}
sf := utils.NewStreamFormatter(version > 1.0)
if image != "" { //pull
registry := r.Form.Get("registry")
if err := srv.ImagePull(image, tag, registry, w, sf, &auth.AuthConfig{}); err != nil {
if err := srv.ImagePull(image, tag, w, sf, &auth.AuthConfig{}); err != nil {
if sf.Used() {
w.Write(sf.FormatError(err))
return nil
@ -443,7 +442,6 @@ func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http
if err := parseForm(r); err != nil {
return err
}
registry := r.Form.Get("registry")
if vars == nil {
return fmt.Errorf("Missing parameter")
@ -453,7 +451,7 @@ func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http
w.Header().Set("Content-Type", "application/json")
}
sf := utils.NewStreamFormatter(version > 1.0)
if err := srv.ImagePush(name, registry, w, sf, authConfig); err != nil {
if err := srv.ImagePush(name, w, sf, authConfig); err != nil {
if sf.Used() {
w.Write(sf.FormatError(err))
return nil
@ -552,7 +550,7 @@ func deleteImages(srv *Server, version float64, w http.ResponseWriter, r *http.R
return err
}
if imgs != nil {
if len(*imgs) != 0 {
if len(imgs) != 0 {
b, err := json.Marshal(imgs)
if err != nil {
return err
@ -572,8 +570,10 @@ func postContainersStart(srv *Server, version float64, w http.ResponseWriter, r
// allow a nil body for backwards compatibility
if r.Body != nil {
if err := json.NewDecoder(r.Body).Decode(hostConfig); err != nil {
return err
if r.Header.Get("Content-Type") == "application/json" {
if err := json.NewDecoder(r.Body).Decode(hostConfig); err != nil {
return err
}
}
}
@ -896,7 +896,7 @@ func createRouter(srv *Server, logging bool) (*mux.Router, error) {
localMethod := method
localFct := fct
f := func(w http.ResponseWriter, r *http.Request) {
utils.Debugf("Calling %s %s", localMethod, localRoute)
utils.Debugf("Calling %s %s from %s", localMethod, localRoute, r.RemoteAddr)
if logging {
log.Println(r.Method, r.RequestURI)

View file

@ -5,7 +5,6 @@ import (
"bufio"
"bytes"
"encoding/json"
"github.com/dotcloud/docker/auth"
"github.com/dotcloud/docker/utils"
"io"
"net"
@ -41,44 +40,6 @@ func TestGetBoolParam(t *testing.T) {
}
}
func TestPostAuth(t *testing.T) {
runtime, err := newTestRuntime()
if err != nil {
t.Fatal(err)
}
defer nuke(runtime)
srv := &Server{
runtime: runtime,
}
r := httptest.NewRecorder()
authConfig := &auth.AuthConfig{
Username: "utest",
Password: "utest",
Email: "utest@yopmail.com",
}
authConfigJSON, err := json.Marshal(authConfig)
if err != nil {
t.Fatal(err)
}
req, err := http.NewRequest("POST", "/auth", bytes.NewReader(authConfigJSON))
if err != nil {
t.Fatal(err)
}
if err := postAuth(srv, APIVERSION, r, req, nil); err != nil {
t.Fatal(err)
}
if r.Code != http.StatusOK && r.Code != 0 {
t.Fatalf("%d OK or 0 expected, received %d\n", http.StatusOK, r.Code)
}
}
func TestGetVersion(t *testing.T) {
runtime, err := newTestRuntime()
if err != nil {
@ -99,7 +60,7 @@ func TestGetVersion(t *testing.T) {
t.Fatal(err)
}
if v.Version != VERSION {
t.Errorf("Excepted version %s, %s found", VERSION, v.Version)
t.Errorf("Expected version %s, %s found", VERSION, v.Version)
}
}
@ -112,6 +73,11 @@ func TestGetInfo(t *testing.T) {
srv := &Server{runtime: runtime}
initialImages, err := srv.runtime.graph.All()
if err != nil {
t.Fatal(err)
}
r := httptest.NewRecorder()
if err := getInfo(srv, APIVERSION, r, nil, nil); err != nil {
@ -123,8 +89,8 @@ func TestGetInfo(t *testing.T) {
if err != nil {
t.Fatal(err)
}
if infos.Images != 1 {
t.Errorf("Excepted images: %d, %d found", 1, infos.Images)
if infos.Images != len(initialImages) {
t.Errorf("Expected images: %d, %d found", len(initialImages), infos.Images)
}
}
@ -138,6 +104,12 @@ func TestGetImagesJSON(t *testing.T) {
srv := &Server{runtime: runtime}
// all=0
initialImages, err := srv.Images(false, "")
if err != nil {
t.Fatal(err)
}
req, err := http.NewRequest("GET", "/images/json?all=0", nil)
if err != nil {
t.Fatal(err)
@ -154,17 +126,30 @@ func TestGetImagesJSON(t *testing.T) {
t.Fatal(err)
}
if len(images) != 1 {
t.Errorf("Excepted 1 image, %d found", len(images))
if len(images) != len(initialImages) {
t.Errorf("Expected %d image, %d found", len(initialImages), len(images))
}
if images[0].Repository != unitTestImageName {
t.Errorf("Excepted image %s, %s found", unitTestImageName, images[0].Repository)
found := false
for _, img := range images {
if img.Repository == unitTestImageName {
found = true
break
}
}
if !found {
t.Errorf("Expected image %s, %+v found", unitTestImageName, images)
}
r2 := httptest.NewRecorder()
// all=1
initialImages, err = srv.Images(true, "")
if err != nil {
t.Fatal(err)
}
req2, err := http.NewRequest("GET", "/images/json?all=true", nil)
if err != nil {
t.Fatal(err)
@ -179,18 +164,25 @@ func TestGetImagesJSON(t *testing.T) {
t.Fatal(err)
}
if len(images2) != 1 {
t.Errorf("Excepted 1 image, %d found", len(images2))
if len(images2) != len(initialImages) {
t.Errorf("Expected %d image, %d found", len(initialImages), len(images2))
}
if images2[0].ID != GetTestImage(runtime).ID {
t.Errorf("Retrieved image Id differs, expected %s, received %s", GetTestImage(runtime).ID, images2[0].ID)
found = false
for _, img := range images2 {
if img.ID == GetTestImage(runtime).ID {
found = true
break
}
}
if !found {
t.Errorf("Retrieved image Id differs, expected %s, received %+v", GetTestImage(runtime).ID, images2)
}
r3 := httptest.NewRecorder()
// filter=a
req3, err := http.NewRequest("GET", "/images/json?filter=a", nil)
req3, err := http.NewRequest("GET", "/images/json?filter=aaaaaaaaaa", nil)
if err != nil {
t.Fatal(err)
}
@ -205,7 +197,7 @@ func TestGetImagesJSON(t *testing.T) {
}
if len(images3) != 0 {
t.Errorf("Excepted 1 image, %d found", len(images3))
t.Errorf("Expected 0 image, %d found", len(images3))
}
r4 := httptest.NewRecorder()
@ -251,38 +243,7 @@ func TestGetImagesViz(t *testing.T) {
t.Fatal(err)
}
if line != "digraph docker {\n" {
t.Errorf("Excepted digraph docker {\n, %s found", line)
}
}
func TestGetImagesSearch(t *testing.T) {
runtime, err := newTestRuntime()
if err != nil {
t.Fatal(err)
}
defer nuke(runtime)
srv := &Server{
runtime: runtime,
}
r := httptest.NewRecorder()
req, err := http.NewRequest("GET", "/images/search?term=redis", nil)
if err != nil {
t.Fatal(err)
}
if err := getImagesSearch(srv, APIVERSION, r, req, nil); err != nil {
t.Fatal(err)
}
results := []APISearch{}
if err := json.Unmarshal(r.Body.Bytes(), &results); err != nil {
t.Fatal(err)
}
if len(results) < 2 {
t.Errorf("Excepted at least 2 lines, %d found", len(results))
t.Errorf("Expected digraph docker {\n, %s found", line)
}
}
@ -306,7 +267,7 @@ func TestGetImagesHistory(t *testing.T) {
t.Fatal(err)
}
if len(history) != 1 {
t.Errorf("Excepted 1 line, %d found", len(history))
t.Errorf("Expected 1 line, %d found", len(history))
}
}
@ -328,7 +289,7 @@ func TestGetImagesByName(t *testing.T) {
if err := json.Unmarshal(r.Body.Bytes(), img); err != nil {
t.Fatal(err)
}
if img.ID != GetTestImage(runtime).ID || img.Comment != "Imported from http://get.docker.io/images/busybox" {
if img.ID != unitTestImageID {
t.Errorf("Error inspecting image")
}
}
@ -365,7 +326,7 @@ func TestGetContainersJSON(t *testing.T) {
t.Fatal(err)
}
if len(containers) != 1 {
t.Fatalf("Excepted %d container, %d found", 1, len(containers))
t.Fatalf("Expected %d container, %d found", 1, len(containers))
}
if containers[0].ID != container.ID {
t.Fatalf("Container ID mismatch. Expected: %s, received: %s\n", container.ID, containers[0].ID)
@ -1365,6 +1326,11 @@ func TestDeleteImages(t *testing.T) {
srv := &Server{runtime: runtime}
initialImages, err := srv.Images(false, "")
if err != nil {
t.Fatal(err)
}
if err := srv.runtime.repositories.Set("test", "test", unitTestImageName, true); err != nil {
t.Fatal(err)
}
@ -1374,25 +1340,35 @@ func TestDeleteImages(t *testing.T) {
t.Fatal(err)
}
if len(images) != 2 {
t.Errorf("Excepted 2 images, %d found", len(images))
if len(images) != len(initialImages)+1 {
t.Errorf("Expected %d images, %d found", len(initialImages)+1, len(images))
}
req, err := http.NewRequest("DELETE", "/images/test:test", nil)
req, err := http.NewRequest("DELETE", "/images/"+unitTestImageID, nil)
if err != nil {
t.Fatal(err)
}
r := httptest.NewRecorder()
if err := deleteImages(srv, APIVERSION, r, req, map[string]string{"name": "test:test"}); err != nil {
if err := deleteImages(srv, APIVERSION, r, req, map[string]string{"name": unitTestImageID}); err == nil {
t.Fatalf("Expected conflict error, got none")
}
req2, err := http.NewRequest("DELETE", "/images/test:test", nil)
if err != nil {
t.Fatal(err)
}
if r.Code != http.StatusOK {
r2 := httptest.NewRecorder()
if err := deleteImages(srv, APIVERSION, r2, req2, map[string]string{"name": "test:test"}); err != nil {
t.Fatal(err)
}
if r2.Code != http.StatusOK {
t.Fatalf("%d OK expected, received %d\n", http.StatusOK, r.Code)
}
var outs []APIRmi
if err := json.Unmarshal(r.Body.Bytes(), &outs); err != nil {
if err := json.Unmarshal(r2.Body.Bytes(), &outs); err != nil {
t.Fatal(err)
}
if len(outs) != 1 {
@ -1403,8 +1379,8 @@ func TestDeleteImages(t *testing.T) {
t.Fatal(err)
}
if len(images) != 1 {
t.Errorf("Excepted 1 image, %d found", len(images))
if len(images) != len(initialImages) {
t.Errorf("Expected %d image, %d found", len(initialImages), len(images))
}
/* if c := runtime.Get(container.Id); c != nil {

View file

@ -2,9 +2,7 @@ package docker
import (
"archive/tar"
"bufio"
"bytes"
"errors"
"fmt"
"github.com/dotcloud/docker/utils"
"io"
@ -27,10 +25,6 @@ const (
)
func DetectCompression(source []byte) Compression {
for _, c := range source[:10] {
utils.Debugf("%x", c)
}
sourceLen := len(source)
for compression, m := range map[Compression][]byte{
Bzip2: {0x42, 0x5A, 0x68},
@ -111,17 +105,26 @@ func Untar(archive io.Reader, path string) error {
if archive == nil {
return fmt.Errorf("Empty archive")
}
bufferedArchive := bufio.NewReaderSize(archive, 10)
buf, err := bufferedArchive.Peek(10)
if err != nil {
return err
buf := make([]byte, 10)
totalN := 0
for totalN < 10 {
if n, err := archive.Read(buf[totalN:]); err != nil {
if err == io.EOF {
return fmt.Errorf("Tarball too short")
}
return err
} else {
totalN += n
utils.Debugf("[tar autodetect] n: %d", n)
}
}
compression := DetectCompression(buf)
utils.Debugf("Archive compression detected: %s", compression.Extension())
cmd := exec.Command("tar", "--numeric-owner", "-f", "-", "-C", path, "-x"+compression.Flag())
cmd.Stdin = bufferedArchive
cmd.Stdin = io.MultiReader(bytes.NewReader(buf), archive)
// Hardcode locale environment for predictable outcome regardless of host configuration.
// (see https://github.com/dotcloud/docker/issues/355)
cmd.Env = []string{"LANG=en_US.utf-8", "LC_ALL=en_US.utf-8"}
@ -251,7 +254,7 @@ func CmdStream(cmd *exec.Cmd) (io.Reader, error) {
}
errText := <-errChan
if err := cmd.Wait(); err != nil {
pipeW.CloseWithError(errors.New(err.Error() + ": " + string(errText)))
pipeW.CloseWithError(fmt.Errorf("%s: %s", err, errText))
} else {
pipeW.Close()
}

View file

@ -16,7 +16,7 @@ func TestCmdStreamLargeStderr(t *testing.T) {
cmd := exec.Command("/bin/sh", "-c", "dd if=/dev/zero bs=1k count=1000 of=/dev/stderr; echo hello")
out, err := CmdStream(cmd)
if err != nil {
t.Fatalf("Failed to start command: " + err.Error())
t.Fatalf("Failed to start command: %s", err)
}
errCh := make(chan error)
go func() {
@ -26,7 +26,7 @@ func TestCmdStreamLargeStderr(t *testing.T) {
select {
case err := <-errCh:
if err != nil {
t.Fatalf("Command should not have failed (err=%s...)", err.Error()[:100])
t.Fatalf("Command should not have failed (err=%.100s...)", err)
}
case <-time.After(5 * time.Second):
t.Fatalf("Command did not complete in 5 seconds; probable deadlock")
@ -37,12 +37,12 @@ func TestCmdStreamBad(t *testing.T) {
badCmd := exec.Command("/bin/sh", "-c", "echo hello; echo >&2 error couldn\\'t reverse the phase pulser; exit 1")
out, err := CmdStream(badCmd)
if err != nil {
t.Fatalf("Failed to start command: " + err.Error())
t.Fatalf("Failed to start command: %s", err)
}
if output, err := ioutil.ReadAll(out); err == nil {
t.Fatalf("Command should have failed")
} else if err.Error() != "exit status 1: error couldn't reverse the phase pulser\n" {
t.Fatalf("Wrong error value (%s)", err.Error())
t.Fatalf("Wrong error value (%s)", err)
} else if s := string(output); s != "hello\n" {
t.Fatalf("Command output should be '%s', not '%s'", "hello\\n", output)
}

View file

@ -15,8 +15,8 @@ import (
// Where we store the config file
const CONFIGFILE = ".dockercfg"
// the registry server we want to login against
const INDEXSERVER = "https://index.docker.io/v1"
// Only used for user auth + account creation
const INDEXSERVER = "https://index.docker.io/v1/"
//const INDEXSERVER = "http://indexstaging-docker.dotcloud.com/"
@ -41,9 +41,6 @@ func NewAuthConfig(username, password, email, rootPath string) *AuthConfig {
}
func IndexServerAddress() string {
if os.Getenv("DOCKER_INDEX_URL") != "" {
return os.Getenv("DOCKER_INDEX_URL") + "/v1"
}
return INDEXSERVER
}
@ -74,7 +71,6 @@ func decodeAuth(authStr string) (*AuthConfig, error) {
}
password := strings.Trim(arr[1], "\x00")
return &AuthConfig{Username: arr[0], Password: password}, nil
}
// load up the auth config information and return values
@ -133,7 +129,7 @@ func Login(authConfig *AuthConfig, store bool) (string, error) {
// using `bytes.NewReader(jsonBody)` here causes the server to respond with a 411 status.
b := strings.NewReader(string(jsonBody))
req1, err := http.Post(IndexServerAddress()+"/users/", "application/json; charset=utf-8", b)
req1, err := http.Post(IndexServerAddress()+"users/", "application/json; charset=utf-8", b)
if err != nil {
return "", fmt.Errorf("Server Error: %s", err)
}
@ -153,7 +149,7 @@ func Login(authConfig *AuthConfig, store bool) (string, error) {
"Please check your e-mail for a confirmation link.")
} else if reqStatusCode == 400 {
if string(reqBody) == "\"Username or email already exists\"" {
req, err := http.NewRequest("GET", IndexServerAddress()+"/users/", nil)
req, err := http.NewRequest("GET", IndexServerAddress()+"users/", nil)
req.SetBasicAuth(authConfig.Username, authConfig.Password)
resp, err := client.Do(req)
if err != nil {

View file

@ -68,6 +68,6 @@ func TestCreateAccount(t *testing.T) {
expectedError := "Login: Account is not Active"
if !strings.Contains(err.Error(), expectedError) {
t.Fatalf("Expected message \"%s\" but found \"%s\" instead", expectedError, err.Error())
t.Fatalf("Expected message \"%s\" but found \"%s\" instead", expectedError, err)
}
}

View file

@ -50,12 +50,23 @@ func (builder *Builder) Create(config *Config) (*Container, error) {
config.Hostname = id[:12]
}
var args []string
var entrypoint string
if len(config.Entrypoint) != 0 {
entrypoint = config.Entrypoint[0]
args = append(config.Entrypoint[1:], config.Cmd...)
} else {
entrypoint = config.Cmd[0]
args = config.Cmd[1:]
}
container := &Container{
// FIXME: we should generate the ID here instead of receiving it as an argument
ID: id,
Created: time.Now(),
Path: config.Cmd[0],
Args: config.Cmd[1:], //FIXME: de-duplicate from config
Path: entrypoint,
Args: args, //FIXME: de-duplicate from config
Config: config,
Image: img.ID, // Always use the resolved image id
NetworkSettings: &NetworkSettings{},

View file

@ -29,6 +29,7 @@ type buildFile struct {
config *Config
context string
lastContainer *Container
tmpContainers map[string]struct{}
tmpImages map[string]struct{}
@ -51,20 +52,10 @@ func (b *buildFile) CmdFrom(name string) error {
image, err := b.runtime.repositories.LookupImage(name)
if err != nil {
if b.runtime.graph.IsNotExist(err) {
var tag, remote string
if strings.Contains(name, ":") {
remoteParts := strings.Split(name, ":")
tag = remoteParts[1]
remote = remoteParts[0]
} else {
remote = name
}
if err := b.srv.ImagePull(remote, tag, "", b.out, utils.NewStreamFormatter(false), nil); err != nil {
remote, tag := utils.ParseRepositoryTag(name)
if err := b.srv.ImagePull(remote, tag, b.out, utils.NewStreamFormatter(false), nil); err != nil {
return err
}
image, err = b.runtime.repositories.LookupImage(name)
if err != nil {
return err
@ -141,7 +132,7 @@ func (b *buildFile) CmdEnv(args string) error {
func (b *buildFile) CmdCmd(args string) error {
var cmd []string
if err := json.Unmarshal([]byte(args), &cmd); err != nil {
utils.Debugf("Error unmarshalling: %s, using /bin/sh -c", err)
utils.Debugf("Error unmarshalling: %s, setting cmd to /bin/sh -c", err)
cmd = []string{"/bin/sh", "-c", args}
}
if err := b.commit("", cmd, fmt.Sprintf("CMD %v", cmd)); err != nil {
@ -165,6 +156,44 @@ func (b *buildFile) CmdCopy(args string) error {
return fmt.Errorf("COPY has been deprecated. Please use ADD instead")
}
func (b *buildFile) CmdEntrypoint(args string) error {
if args == "" {
return fmt.Errorf("Entrypoint cannot be empty")
}
var entrypoint []string
if err := json.Unmarshal([]byte(args), &entrypoint); err != nil {
b.config.Entrypoint = []string{"/bin/sh", "-c", args}
} else {
b.config.Entrypoint = entrypoint
}
if err := b.commit("", b.config.Cmd, fmt.Sprintf("ENTRYPOINT %s", args)); err != nil {
return err
}
return nil
}
func (b *buildFile) CmdVolume(args string) error {
if args == "" {
return fmt.Errorf("Volume cannot be empty")
}
var volume []string
if err := json.Unmarshal([]byte(args), &volume); err != nil {
volume = []string{args}
}
if b.config.Volumes == nil {
b.config.Volumes = NewPathOpts()
}
for _, v := range volume {
b.config.Volumes[v] = struct{}{}
}
if err := b.commit("", b.config.Cmd, fmt.Sprintf("VOLUME %s", args)); err != nil {
return err
}
return nil
}
func (b *buildFile) addRemote(container *Container, orig, dest string) error {
file, err := utils.Download(orig, ioutil.Discard)
if err != nil {
@ -225,6 +254,7 @@ func (b *buildFile) CmdAdd(args string) error {
return err
}
b.tmpContainers[container.ID] = struct{}{}
b.lastContainer = container
if err := container.EnsureMounted(); err != nil {
return err
@ -260,8 +290,13 @@ func (b *buildFile) run() (string, error) {
return "", err
}
b.tmpContainers[c.ID] = struct{}{}
b.lastContainer = c
fmt.Fprintf(b.out, " ---> Running in %s\n", utils.TruncateID(c.ID))
// override the entry point that may have been picked up from the base image
c.Path = b.config.Cmd[0]
c.Args = b.config.Cmd[1:]
//start the container
hostConfig := &HostConfig{}
if err := c.Start(hostConfig); err != nil {
@ -302,6 +337,7 @@ func (b *buildFile) commit(id string, autoCmd []string, comment string) error {
return err
}
b.tmpContainers[container.ID] = struct{}{}
b.lastContainer = container
fmt.Fprintf(b.out, " ---> Running in %s\n", utils.TruncateID(container.ID))
id = container.ID
if err := container.EnsureMounted(); err != nil {
@ -329,6 +365,29 @@ func (b *buildFile) commit(id string, autoCmd []string, comment string) error {
}
func (b *buildFile) Build(context io.Reader) (string, error) {
defer func() {
// If we have an error and a container, the display the logs
if b.lastContainer != nil {
fmt.Fprintf(b.out, "******** Logs from last container (%s) *******\n", b.lastContainer.ShortID())
cLog, err := b.lastContainer.ReadLog("stdout")
if err != nil {
utils.Debugf("Error reading logs (stdout): %s", err)
}
if _, err := io.Copy(b.out, cLog); err != nil {
utils.Debugf("Error streaming logs (stdout): %s", err)
}
cLog, err = b.lastContainer.ReadLog("stderr")
if err != nil {
utils.Debugf("Error reading logs (stderr): %s", err)
}
if _, err := io.Copy(b.out, cLog); err != nil {
utils.Debugf("Error streaming logs (stderr): %s", err)
}
fmt.Fprintf(b.out, "************* End of logs for %s *************\n", b.lastContainer.ShortID())
}
}()
// FIXME: @creack any reason for using /tmp instead of ""?
// FIXME: @creack "name" is a terrible variable name
name, err := ioutil.TempDir("/tmp", "docker-build")
@ -381,6 +440,7 @@ func (b *buildFile) Build(context io.Reader) (string, error) {
return "", ret.(error)
}
b.lastContainer = nil
fmt.Fprintf(b.out, " ---> %v\n", utils.TruncateID(b.image))
}
if b.image != "" {

View file

@ -1,6 +1,7 @@
package docker
import (
"fmt"
"io/ioutil"
"testing"
)
@ -8,7 +9,7 @@ import (
// mkTestContext generates a build context from the contents of the provided dockerfile.
// This context is suitable for use as an argument to BuildFile.Build()
func mkTestContext(dockerfile string, files [][2]string, t *testing.T) Archive {
context, err := mkBuildContext(dockerfile, files)
context, err := mkBuildContext(fmt.Sprintf(dockerfile, unitTestImageID), files)
if err != nil {
t.Fatal(err)
}
@ -25,10 +26,10 @@ type testContextTemplate struct {
// A table of all the contexts to build and test.
// A new docker runtime will be created and torn down for each context.
var testContexts []testContextTemplate = []testContextTemplate{
var testContexts = []testContextTemplate{
{
`
from docker-ut
from %s
run sh -c 'echo root:testpass > /tmp/passwd'
run mkdir -p /var/run/sshd
run [ "$(cat /tmp/passwd)" = "root:testpass" ]
@ -39,7 +40,7 @@ run [ "$(ls -d /var/run/sshd)" = "/var/run/sshd" ]
{
`
from docker-ut
from %s
add foo /usr/lib/bla/bar
run [ "$(cat /usr/lib/bla/bar)" = 'hello world!' ]
`,
@ -48,7 +49,7 @@ run [ "$(cat /usr/lib/bla/bar)" = 'hello world!' ]
{
`
from docker-ut
from %s
add f /
run [ "$(cat /f)" = "hello" ]
add f /abc
@ -74,9 +75,27 @@ run [ "$(cat /somewheeeere/over/the/rainbooow/ga)" = "bu" ]
{
`
from docker-ut
from %s
env FOO BAR
run [ "$FOO" = "BAR" ]
`,
nil,
},
{
`
from %s
ENTRYPOINT /bin/echo
CMD Hello world
`,
nil,
},
{
`
from %s
VOLUME /test
CMD Hello world
`,
nil,
},
@ -92,7 +111,11 @@ func TestBuild(t *testing.T) {
}
defer nuke(runtime)
srv := &Server{runtime: runtime}
srv := &Server{
runtime: runtime,
pullingPool: make(map[string]struct{}),
pushingPool: make(map[string]struct{}),
}
buildfile := NewBuildFile(srv, ioutil.Discard)
if _, err := buildfile.Build(mkTestContext(ctx.dockerfile, ctx.files, t)); err != nil {
@ -100,3 +123,39 @@ func TestBuild(t *testing.T) {
}
}
}
func TestVolume(t *testing.T) {
runtime, err := newTestRuntime()
if err != nil {
t.Fatal(err)
}
defer nuke(runtime)
srv := &Server{
runtime: runtime,
pullingPool: make(map[string]struct{}),
pushingPool: make(map[string]struct{}),
}
buildfile := NewBuildFile(srv, ioutil.Discard)
imgId, err := buildfile.Build(mkTestContext(`
from %s
VOLUME /test
CMD Hello world
`, nil, t))
if err != nil {
t.Fatal(err)
}
img, err := srv.ImageInspect(imgId)
if err != nil {
t.Fatal(err)
}
if len(img.Config.Volumes) == 0 {
t.Fail()
}
for key, _ := range img.Config.Volumes {
if key != "/test" {
t.Fail()
}
}
}

View file

@ -19,7 +19,6 @@ import (
"os/signal"
"path/filepath"
"reflect"
"regexp"
"strconv"
"strings"
"syscall"
@ -28,7 +27,7 @@ import (
"unicode"
)
const VERSION = "0.4.6"
const VERSION = "0.4.8"
var (
GITCOMMIT string
@ -73,7 +72,7 @@ func (cli *DockerCli) CmdHelp(args ...string) error {
return nil
}
}
help := fmt.Sprintf("Usage: docker [OPTIONS] COMMAND [arg...]\n -H=[tcp://%s:%d]: tcp://host:port to bind/connect to or unix://path/to/socker to use\n\nA self-sufficient runtime for linux containers.\n\nCommands:\n", DEFAULTHTTPHOST, DEFAULTHTTPPORT)
help := fmt.Sprintf("Usage: docker [OPTIONS] COMMAND [arg...]\n -H=[tcp://%s:%d]: tcp://host:port to bind/connect to or unix://path/to/socket to use\n\nA self-sufficient runtime for linux containers.\n\nCommands:\n", DEFAULTHTTPHOST, DEFAULTHTTPPORT)
for _, command := range [][]string{
{"attach", "Attach to a running container"},
{"build", "Build a container from a Dockerfile"},
@ -749,7 +748,6 @@ func (cli *DockerCli) CmdImport(args ...string) error {
func (cli *DockerCli) CmdPush(args ...string) error {
cmd := Subcmd("push", "[OPTION] NAME", "Push an image or a repository to the registry")
registry := cmd.String("registry", "", "Registry host to push the image to")
if err := cmd.Parse(args); err != nil {
return nil
}
@ -760,10 +758,14 @@ func (cli *DockerCli) CmdPush(args ...string) error {
return nil
}
if err := cli.checkIfLogged(*registry == "", "push"); err != nil {
if err := cli.checkIfLogged("push"); err != nil {
return err
}
// If we're not using a custom registry, we know the restrictions
// applied to repository names and can warn the user in advance.
// Custom repositories can have different rules, and we must also
// allow pushing by image ID.
if len(strings.SplitN(name, "/", 2)) == 1 {
return fmt.Errorf("Impossible to push a \"root\" repository. Please rename your repository in <user>/<repo> (ex: %s/%s)", cli.authConfig.Username, name)
}
@ -772,18 +774,8 @@ func (cli *DockerCli) CmdPush(args ...string) error {
if err != nil {
return err
}
nameParts := strings.SplitN(name, "/", 2)
validNamespace := regexp.MustCompile(`^([a-z0-9_]{4,30})$`)
if !validNamespace.MatchString(nameParts[0]) {
return fmt.Errorf("Invalid namespace name (%s), only [a-z0-9_] are allowed, size between 4 and 30", nameParts[0])
}
validRepo := regexp.MustCompile(`^([a-zA-Z0-9-_.]+)$`)
if !validRepo.MatchString(nameParts[1]) {
return fmt.Errorf("Invalid repository name (%s), only [a-zA-Z0-9-_.] are allowed", nameParts[1])
}
v := url.Values{}
v.Set("registry", *registry)
if err := cli.stream("POST", "/images/"+name+"/push?"+v.Encode(), bytes.NewBuffer(buf), cli.out); err != nil {
return err
}
@ -793,7 +785,6 @@ func (cli *DockerCli) CmdPush(args ...string) error {
func (cli *DockerCli) CmdPull(args ...string) error {
cmd := Subcmd("pull", "NAME", "Pull an image or a repository from the registry")
tag := cmd.String("t", "", "Download tagged image in repository")
registry := cmd.String("registry", "", "Registry to download from. Necessary if image is pulled by ID")
if err := cmd.Parse(args); err != nil {
return nil
}
@ -803,17 +794,12 @@ func (cli *DockerCli) CmdPull(args ...string) error {
return nil
}
remote := cmd.Arg(0)
if strings.Contains(remote, ":") {
remoteParts := strings.Split(remote, ":")
tag = &remoteParts[1]
remote = remoteParts[0]
}
remote, parsedTag := utils.ParseRepositoryTag(cmd.Arg(0))
*tag = parsedTag
v := url.Values{}
v.Set("fromImage", remote)
v.Set("tag", *tag)
v.Set("registry", *registry)
if err := cli.stream("POST", "/images/create?"+v.Encode(), nil, cli.out); err != nil {
return err
@ -1139,6 +1125,7 @@ func (cli *DockerCli) CmdAttach(args ...string) error {
func (cli *DockerCli) CmdSearch(args ...string) error {
cmd := Subcmd("search", "NAME", "Search the docker index for images")
noTrunc := cmd.Bool("notrunc", false, "Don't truncate output")
if err := cmd.Parse(args); err != nil {
return nil
}
@ -1160,13 +1147,19 @@ func (cli *DockerCli) CmdSearch(args ...string) error {
return err
}
fmt.Fprintf(cli.out, "Found %d results matching your query (\"%s\")\n", len(outs), cmd.Arg(0))
w := tabwriter.NewWriter(cli.out, 20, 1, 3, ' ', 0)
w := tabwriter.NewWriter(cli.out, 33, 1, 3, ' ', 0)
fmt.Fprintf(w, "NAME\tDESCRIPTION\n")
_, width := cli.getTtySize()
if width == 0 {
width = 45
} else {
width = width - 33 //remote the first column
}
for _, out := range outs {
desc := strings.Replace(out.Description, "\n", " ", -1)
desc = strings.Replace(desc, "\r", " ", -1)
if len(desc) > 45 {
desc = utils.Trunc(desc, 42) + "..."
if !*noTrunc && len(desc) > width {
desc = utils.Trunc(desc, width-3) + "..."
}
fmt.Fprintf(w, "%s\t%s\n", out.Name, desc)
}
@ -1277,7 +1270,9 @@ func (cli *DockerCli) CmdRun(args ...string) error {
//if image not found try to pull it
if statusCode == 404 {
v := url.Values{}
v.Set("fromImage", config.Image)
repos, tag := utils.ParseRepositoryTag(config.Image)
v.Set("fromImage", repos)
v.Set("tag", tag)
err = cli.stream("POST", "/images/create?"+v.Encode(), nil, cli.err)
if err != nil {
return err
@ -1298,7 +1293,7 @@ func (cli *DockerCli) CmdRun(args ...string) error {
}
for _, warning := range runResult.Warnings {
fmt.Fprintln(cli.err, "WARNING: ", warning)
fmt.Fprintf(cli.err, "WARNING: %s\n", warning)
}
//start the container
@ -1306,9 +1301,15 @@ func (cli *DockerCli) CmdRun(args ...string) error {
return err
}
var wait chan struct{}
if !config.AttachStdout && !config.AttachStderr {
// Make this asynchrone in order to let the client write to stdin before having to read the ID
go fmt.Fprintf(cli.out, "%s\n", runResult.ID)
wait = make(chan struct{})
go func() {
defer close(wait)
fmt.Fprintf(cli.out, "%s\n", runResult.ID)
}()
}
if config.AttachStdin || config.AttachStdout || config.AttachStderr {
@ -1337,12 +1338,16 @@ func (cli *DockerCli) CmdRun(args ...string) error {
return err
}
}
if !config.AttachStdout && !config.AttachStderr {
<-wait
}
return nil
}
func (cli *DockerCli) checkIfLogged(condition bool, action string) error {
func (cli *DockerCli) checkIfLogged(action string) error {
// If condition AND the login failed
if condition && cli.authConfig.Username == "" {
if cli.authConfig.Username == "" {
if err := cli.CmdLogin(""); err != nil {
return err
}
@ -1530,17 +1535,28 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea
}
func (cli *DockerCli) resizeTty(id string) {
func (cli *DockerCli) getTtySize() (int, int) {
if !cli.isTerminal {
return
return 0, 0
}
ws, err := term.GetWinsize(cli.terminalFd)
if err != nil {
utils.Debugf("Error getting size: %s", err)
if ws == nil {
return 0, 0
}
}
return int(ws.Height), int(ws.Width)
}
func (cli *DockerCli) resizeTty(id string) {
height, width := cli.getTtySize()
if height == 0 && width == 0 {
return
}
v := url.Values{}
v.Set("h", strconv.Itoa(int(ws.Height)))
v.Set("w", strconv.Itoa(int(ws.Width)))
v.Set("h", strconv.Itoa(height))
v.Set("w", strconv.Itoa(width))
if _, _, err := cli.call("POST", "/containers/"+id+"/resize?"+v.Encode(), nil); err != nil {
utils.Debugf("Error resize: %s", err)
}
@ -1576,7 +1592,7 @@ func Subcmd(name, signature, description string) *flag.FlagSet {
func NewDockerCli(in io.ReadCloser, out, err io.Writer, proto, addr string) *DockerCli {
var (
isTerminal bool = false
isTerminal = false
terminalFd uintptr
)

View file

@ -132,17 +132,18 @@ func TestImages(t *testing.T) {
}
*/
// TestRunHostname checks that 'docker run -h' correctly sets a custom hostname
func TestRunHostname(t *testing.T) {
stdout, stdoutPipe := io.Pipe()
cli := NewDockerCli(nil, stdoutPipe, nil, testDaemonProto, testDaemonAddr)
cli := NewDockerCli(nil, stdoutPipe, ioutil.Discard, testDaemonProto, testDaemonAddr)
defer cleanup(globalRuntime)
c := make(chan struct{})
go func() {
defer close(c)
if err := cli.CmdRun("-h", "foobar", unitTestImageId, "hostname"); err != nil {
if err := cli.CmdRun("-h", "foobar", unitTestImageID, "hostname"); err != nil {
t.Fatal(err)
}
}()
@ -329,13 +330,13 @@ func TestRunAttachStdin(t *testing.T) {
stdin, stdinPipe := io.Pipe()
stdout, stdoutPipe := io.Pipe()
cli := NewDockerCli(stdin, stdoutPipe, nil, testDaemonProto, testDaemonAddr)
cli := NewDockerCli(stdin, stdoutPipe, ioutil.Discard, testDaemonProto, testDaemonAddr)
defer cleanup(globalRuntime)
ch := make(chan struct{})
go func() {
defer close(ch)
cli.CmdRun("-i", "-a", "stdin", unitTestImageId, "sh", "-c", "echo hello && cat")
cli.CmdRun("-i", "-a", "stdin", unitTestImageID, "sh", "-c", "echo hello && cat")
}()
// Send input to the command, close stdin

View file

@ -76,6 +76,7 @@ type Config struct {
Image string // Name of the image as it was passed by the operator (eg. could be symbolic)
Volumes map[string]struct{}
VolumesFrom string
Entrypoint []string
}
type HostConfig struct {
@ -123,6 +124,7 @@ func ParseRun(args []string, capabilities *Capabilities) (*Config, *HostConfig,
cmd.Var(flVolumes, "v", "Attach a data volume")
flVolumesFrom := cmd.String("volumes-from", "", "Mount volumes from the specified container")
flEntrypoint := cmd.String("entrypoint", "", "Overwrite the default entrypoint of the image")
var flBinds ListOpts
cmd.Var(&flBinds, "b", "Bind mount a volume from the host (e.g. -b /host:/container)")
@ -153,6 +155,7 @@ func ParseRun(args []string, capabilities *Capabilities) (*Config, *HostConfig,
parsedArgs := cmd.Args()
runCmd := []string{}
entrypoint := []string{}
image := ""
if len(parsedArgs) >= 1 {
image = cmd.Arg(0)
@ -160,6 +163,10 @@ func ParseRun(args []string, capabilities *Capabilities) (*Config, *HostConfig,
if len(parsedArgs) > 1 {
runCmd = parsedArgs[1:]
}
if *flEntrypoint != "" {
entrypoint = []string{*flEntrypoint}
}
config := &Config{
Hostname: *flHostname,
PortSpecs: flPorts,
@ -177,6 +184,7 @@ func ParseRun(args []string, capabilities *Capabilities) (*Config, *HostConfig,
Image: image,
Volumes: flVolumes,
VolumesFrom: *flVolumesFrom,
Entrypoint: entrypoint,
}
hostConfig := &HostConfig{
Binds: flBinds,
@ -194,20 +202,25 @@ func ParseRun(args []string, capabilities *Capabilities) (*Config, *HostConfig,
return config, hostConfig, cmd, nil
}
type PortMapping map[string]string
type NetworkSettings struct {
IPAddress string
IPPrefixLen int
Gateway string
Bridge string
PortMapping map[string]string
PortMapping map[string]PortMapping
}
// String returns a human-readable description of the port mapping defined in the settings
func (settings *NetworkSettings) PortMappingHuman() string {
var mapping []string
for private, public := range settings.PortMapping {
for private, public := range settings.PortMapping["Tcp"] {
mapping = append(mapping, fmt.Sprintf("%s->%s", public, private))
}
for private, public := range settings.PortMapping["Udp"] {
mapping = append(mapping, fmt.Sprintf("%s->%s/udp", public, private))
}
sort.Strings(mapping)
return strings.Join(mapping, ", ")
}
@ -458,8 +471,8 @@ func (container *Container) Attach(stdin io.ReadCloser, stdinCloser io.Closer, s
}
func (container *Container) Start(hostConfig *HostConfig) error {
container.State.lock()
defer container.State.unlock()
container.State.Lock()
defer container.State.Unlock()
if container.State.Running {
return fmt.Errorf("The container %s is already running.", container.ID)
@ -486,7 +499,7 @@ func (container *Container) Start(hostConfig *HostConfig) error {
// Create the requested bind mounts
binds := make(map[string]BindMap)
// Define illegal container destinations
illegal_dsts := []string{"/", "."}
illegalDsts := []string{"/", "."}
for _, bind := range hostConfig.Binds {
// FIXME: factorize bind parsing in parseBind
@ -505,7 +518,7 @@ func (container *Container) Start(hostConfig *HostConfig) error {
}
// Bail if trying to mount to an illegal destination
for _, illegal := range illegal_dsts {
for _, illegal := range illegalDsts {
if dst == illegal {
return fmt.Errorf("Illegal bind destination: %s", dst)
}
@ -680,14 +693,18 @@ func (container *Container) allocateNetwork() error {
if err != nil {
return err
}
container.NetworkSettings.PortMapping = make(map[string]string)
container.NetworkSettings.PortMapping = make(map[string]PortMapping)
container.NetworkSettings.PortMapping["Tcp"] = make(PortMapping)
container.NetworkSettings.PortMapping["Udp"] = make(PortMapping)
for _, spec := range container.Config.PortSpecs {
nat, err := iface.AllocatePort(spec)
if err != nil {
iface.Release()
return err
}
container.NetworkSettings.PortMapping[strconv.Itoa(nat.Backend)] = strconv.Itoa(nat.Frontend)
proto := strings.Title(nat.Proto)
backend, frontend := strconv.Itoa(nat.Backend), strconv.Itoa(nat.Frontend)
container.NetworkSettings.PortMapping[proto][backend] = frontend
}
container.network = iface
container.NetworkSettings.Bridge = container.runtime.networkManager.bridgeIface
@ -813,8 +830,8 @@ func (container *Container) kill() error {
}
func (container *Container) Kill() error {
container.State.lock()
defer container.State.unlock()
container.State.Lock()
defer container.State.Unlock()
if !container.State.Running {
return nil
}
@ -822,8 +839,8 @@ func (container *Container) Kill() error {
}
func (container *Container) Stop(seconds int) error {
container.State.lock()
defer container.State.unlock()
container.State.Lock()
defer container.State.Unlock()
if !container.State.Running {
return nil
}

View file

@ -511,12 +511,14 @@ func TestKillDifferentUser(t *testing.T) {
t.Fatal(err)
}
// Give some time to lxc to spawn the process (setuid might take some time)
container.WaitTimeout(500 * time.Millisecond)
setTimeout(t, "Waiting for the container to be started timed out", 2*time.Second, func() {
for !container.State.Running {
time.Sleep(10 * time.Millisecond)
}
})
if !container.State.Running {
t.Errorf("Container should be running")
}
// Even if the state is running, lets give some time to lxc to spawn the process
container.WaitTimeout(500 * time.Millisecond)
if err := container.Kill(); err != nil {
t.Fatal(err)
@ -1001,7 +1003,7 @@ func TestEnv(t *testing.T) {
defer nuke(runtime)
container, err := NewBuilder(runtime).Create(&Config{
Image: GetTestImage(runtime).ID,
Cmd: []string{"/usr/bin/env"},
Cmd: []string{"env"},
},
)
if err != nil {
@ -1043,6 +1045,32 @@ func TestEnv(t *testing.T) {
}
}
func TestEntrypoint(t *testing.T) {
runtime, err := newTestRuntime()
if err != nil {
t.Fatal(err)
}
defer nuke(runtime)
container, err := NewBuilder(runtime).Create(
&Config{
Image: GetTestImage(runtime).ID,
Entrypoint: []string{"/bin/echo"},
Cmd: []string{"-n", "foobar"},
},
)
if err != nil {
t.Fatal(err)
}
defer runtime.Destroy(container)
output, err := container.Output()
if err != nil {
t.Fatal(err)
}
if string(output) != "foobar" {
t.Error(string(output))
}
}
func grepFile(t *testing.T, path string, pattern string) {
f, err := os.Open(path)
if err != nil {

View file

@ -23,7 +23,9 @@ mkdir bin etc dev dev/pts lib proc sys tmp
touch etc/resolv.conf
cp /etc/nsswitch.conf etc/nsswitch.conf
echo root:x:0:0:root:/:/bin/sh > etc/passwd
echo daemon:x:1:1:daemon:/usr/sbin:/bin/sh >> etc/passwd
echo root:x:0: > etc/group
echo daemon:x:1: >> etc/group
ln -s lib lib64
ln -s bin sbin
cp $BUSYBOX $SOCAT bin
@ -41,6 +43,7 @@ do
cp -a /dev/$X dev
done
chmod 0755 $ROOTFS # See #486
tar -cf- . | docker import - docker-ut
docker run -i -u root docker-ut /bin/echo Success.
rm -rf $ROOTFS

View file

@ -37,7 +37,7 @@ func main() {
flag.Var(&flHosts, "H", "tcp://host:port to bind/connect to or unix://path/to/socket to use")
flag.Parse()
if len(flHosts) > 1 {
flHosts = flHosts[1:len(flHosts)] //trick to display a nice defaul value in the usage
flHosts = flHosts[1:] //trick to display a nice defaul value in the usage
}
for i, flHost := range flHosts {
flHosts[i] = utils.ParseHost(docker.DEFAULTHTTPHOST, docker.DEFAULTHTTPPORT, flHost)

View file

@ -135,3 +135,6 @@ and we will add the libraries here.
| Javascript (Angular) | dockerui | https://github.com/crosbymichael/dockerui |
| **WebUI** | | |
+----------------------+----------------+--------------------------------------------+
| Java | docker-java | https://github.com/kpelykh/docker-java |
+----------------------+----------------+--------------------------------------------+

View file

@ -840,7 +840,7 @@ Remove an image
{"Deleted":"53b4f83ac9"}
]
:statuscode 204: no error
:statuscode 200: no error
:statuscode 404: no such image
:statuscode 409: conflict
:statuscode 500: server error

View file

@ -26,3 +26,4 @@
-v=[]: Creates a new volume and mounts it at the specified path.
-volumes-from="": Mount all volumes from the given container.
-b=[]: Create a bind mount with: [host-dir]:[container-dir]:[rw|ro]
-entrypoint="": Overwrite the default entrypoint set by the image.

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -1,10 +1,10 @@
:title: Concepts
:description: -- todo: change me
:title: Overview
:description: Docker documentation summary
:keywords: concepts, documentation, docker, containers
Concepts
Overview
========
Contents:
@ -13,4 +13,4 @@ Contents:
:maxdepth: 1
../index
manifesto

View file

@ -0,0 +1,190 @@
:title: Manifesto
:description: An overview of Docker and standard containers
:keywords: containers, lxc, concepts, explanation
.. _dockermanifesto:
*(This was our original Welcome page, but it is a bit forward-looking
for docs, and maybe not enough vision for a true manifesto. We'll
reveal more vision in the future to make it more Manifesto-y.)*
Docker Manifesto
----------------
Docker complements LXC with a high-level API which operates at the
process level. It runs unix processes with strong guarantees of
isolation and repeatability across servers.
Docker is a great building block for automating distributed systems:
large-scale web deployments, database clusters, continuous deployment
systems, private PaaS, service-oriented architectures, etc.
- **Heterogeneous payloads** Any combination of binaries, libraries,
configuration files, scripts, virtualenvs, jars, gems, tarballs, you
name it. No more juggling between domain-specific tools. Docker can
deploy and run them all.
- **Any server** Docker can run on any x64 machine with a modern linux
kernel - whether it's a laptop, a bare metal server or a VM. This
makes it perfect for multi-cloud deployments.
- **Isolation** docker isolates processes from each other and from the
underlying host, using lightweight containers.
- **Repeatability** Because containers are isolated in their own
filesystem, they behave the same regardless of where, when, and
alongside what they run.
.. image:: images/lego_docker.jpg
:target: http://bricks.argz.com/ins/7823-1/12
What is a Standard Container?
.............................
Docker defines a unit of software delivery called a Standard
Container. The goal of a Standard Container is to encapsulate a
software component and all its dependencies in a format that is
self-describing and portable, so that any compliant runtime can run it
without extra dependency, regardless of the underlying machine and the
contents of the container.
The spec for Standard Containers is currently work in progress, but it
is very straightforward. It mostly defines 1) an image format, 2) a
set of standard operations, and 3) an execution environment.
A great analogy for this is the shipping container. Just like Standard
Containers are a fundamental unit of software delivery, shipping
containers are a fundamental unit of physical delivery.
Standard operations
~~~~~~~~~~~~~~~~~~~
Just like shipping containers, Standard Containers define a set of
STANDARD OPERATIONS. Shipping containers can be lifted, stacked,
locked, loaded, unloaded and labelled. Similarly, standard containers
can be started, stopped, copied, snapshotted, downloaded, uploaded and
tagged.
Content-agnostic
~~~~~~~~~~~~~~~~~~~
Just like shipping containers, Standard Containers are
CONTENT-AGNOSTIC: all standard operations have the same effect
regardless of the contents. A shipping container will be stacked in
exactly the same way whether it contains Vietnamese powder coffee or
spare Maserati parts. Similarly, Standard Containers are started or
uploaded in the same way whether they contain a postgres database, a
php application with its dependencies and application server, or Java
build artifacts.
Infrastructure-agnostic
~~~~~~~~~~~~~~~~~~~~~~~~~~
Both types of containers are INFRASTRUCTURE-AGNOSTIC: they can be
transported to thousands of facilities around the world, and
manipulated by a wide variety of equipment. A shipping container can
be packed in a factory in Ukraine, transported by truck to the nearest
routing center, stacked onto a train, loaded into a German boat by an
Australian-built crane, stored in a warehouse at a US facility,
etc. Similarly, a standard container can be bundled on my laptop,
uploaded to S3, downloaded, run and snapshotted by a build server at
Equinix in Virginia, uploaded to 10 staging servers in a home-made
Openstack cluster, then sent to 30 production instances across 3 EC2
regions.
Designed for automation
~~~~~~~~~~~~~~~~~~~~~~~
Because they offer the same standard operations regardless of content
and infrastructure, Standard Containers, just like their physical
counterpart, are extremely well-suited for automation. In fact, you
could say automation is their secret weapon.
Many things that once required time-consuming and error-prone human
effort can now be programmed. Before shipping containers, a bag of
powder coffee was hauled, dragged, dropped, rolled and stacked by 10
different people in 10 different locations by the time it reached its
destination. 1 out of 50 disappeared. 1 out of 20 was damaged. The
process was slow, inefficient and cost a fortune - and was entirely
different depending on the facility and the type of goods.
Similarly, before Standard Containers, by the time a software
component ran in production, it had been individually built,
configured, bundled, documented, patched, vendored, templated, tweaked
and instrumented by 10 different people on 10 different
computers. Builds failed, libraries conflicted, mirrors crashed,
post-it notes were lost, logs were misplaced, cluster updates were
half-broken. The process was slow, inefficient and cost a fortune -
and was entirely different depending on the language and
infrastructure provider.
Industrial-grade delivery
~~~~~~~~~~~~~~~~~~~~~~~~~
There are 17 million shipping containers in existence, packed with
every physical good imaginable. Every single one of them can be loaded
on the same boats, by the same cranes, in the same facilities, and
sent anywhere in the World with incredible efficiency. It is
embarrassing to think that a 30 ton shipment of coffee can safely
travel half-way across the World in *less time* than it takes a
software team to deliver its code from one datacenter to another
sitting 10 miles away.
With Standard Containers we can put an end to that embarrassment, by
making INDUSTRIAL-GRADE DELIVERY of software a reality.
Standard Container Specification
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(TODO)
Image format
~~~~~~~~~~~~
Standard operations
~~~~~~~~~~~~~~~~~~~
- Copy
- Run
- Stop
- Wait
- Commit
- Attach standard streams
- List filesystem changes
- ...
Execution environment
~~~~~~~~~~~~~~~~~~~~~
Root filesystem
^^^^^^^^^^^^^^^
Environment variables
^^^^^^^^^^^^^^^^^^^^^
Process arguments
^^^^^^^^^^^^^^^^^
Networking
^^^^^^^^^^
Process namespacing
^^^^^^^^^^^^^^^^^^^
Resource limits
^^^^^^^^^^^^^^^
Process monitoring
^^^^^^^^^^^^^^^^^^
Logging
^^^^^^^
Signals
^^^^^^^
Pseudo-terminal allocation
^^^^^^^^^^^^^^^^^^^^^^^^^^
Security
^^^^^^^^

View file

@ -5,53 +5,52 @@
Setting Up a Dev Environment
============================
Instructions that have been verified to work on Ubuntu Precise 12.04 (LTS) (64-bit),
To make it easier to contribute to Docker, we provide a standard development environment. It is important that
the same environment be used for all tests, builds and releases. The standard development environment defines
all build dependencies: system libraries and binaries, go environment, go dependencies, etc.
Dependencies
------------
Step 1: install docker
----------------------
**Linux kernel 3.8**
Docker's build environment itself is a docker container, so the first step is to install docker on your system.
Due to a bug in LXC docker works best on the 3.8 kernel. Precise comes with a 3.2 kernel, so we need to upgrade it. The kernel we install comes with AUFS built in.
You can follow the `install instructions most relevant to your system <https://docs.docker.io/en/latest/installation/>`.
Make sure you have a working, up-to-date docker installation, then continue to the next step.
.. code-block:: bash
Step 2: check out the source
----------------------------
# install the backported kernel
sudo apt-get update && sudo apt-get install linux-image-generic-lts-raring
::
# reboot
sudo reboot
Installation
------------
.. code-block:: bash
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:gophers/go
sudo apt-get update
sudo apt-get -y install lxc xz-utils curl golang-stable git aufs-tools
export GOPATH=~/go/
export PATH=$GOPATH/bin:$PATH
mkdir -p $GOPATH/src/github.com/dotcloud
cd $GOPATH/src/github.com/dotcloud
git clone git://github.com/dotcloud/docker.git
git clone http://git@github.com/dotcloud/docker
cd docker
go get -v github.com/dotcloud/docker/...
go install -v github.com/dotcloud/docker/...
Step 3: build
-------------
When you are ready to build docker, run this command:
::
docker build -t docker .
This will build the revision currently checked out in the repository. Feel free to check out the version
of your choice.
If the build is successful, congratulations! You have produced a clean build of docker, neatly encapsulated
in a standard build environment.
You can run an interactive session in the newly built container:
::
docker run -i -t docker bash
Then run the docker daemon,
To extract the binaries from the container:
.. code-block:: bash
::
docker run docker sh -c 'cat $(which docker)' > docker-build && chmod +x docker-build
sudo $GOPATH/bin/docker -d
Run the ``go install`` command (above) to recompile docker.

View file

@ -1,127 +1,38 @@
:title: Introduction
:description: An introduction to docker and standard containers?
:title: Welcome to the Docker Documentation
:description: An overview of the Docker Documentation
:keywords: containers, lxc, concepts, explanation
.. _introduction:
Introduction
============
Welcome
=======
Docker -- The Linux container runtime
-------------------------------------
.. image:: concepts/images/dockerlogo-h.png
Docker complements LXC with a high-level API which operates at the process level. It runs unix processes with strong guarantees of isolation and repeatability across servers.
``docker``, the Linux Container Runtime, runs Unix processes with
strong guarantees of isolation across servers. Your software runs
repeatably everywhere because its :ref:`container_def` includes any
dependencies.
Docker is a great building block for automating distributed systems: large-scale web deployments, database clusters, continuous deployment systems, private PaaS, service-oriented architectures, etc.
``docker`` runs three ways:
* as a daemon to manage LXC containers on your :ref:`Linux host
<kernel>` (``sudo docker -d``)
* as a :ref:`CLI <cli>` which talks to the daemon's `REST API
<api/docker_remote_api>`_ (``docker run ...``)
* as a client of :ref:`Repositories <working_with_the_repository>`
that let you share what you've built (``docker pull, docker
commit``).
- **Heterogeneous payloads** Any combination of binaries, libraries, configuration files, scripts, virtualenvs, jars, gems, tarballs, you name it. No more juggling between domain-specific tools. Docker can deploy and run them all.
- **Any server** Docker can run on any x64 machine with a modern linux kernel - whether it's a laptop, a bare metal server or a VM. This makes it perfect for multi-cloud deployments.
- **Isolation** docker isolates processes from each other and from the underlying host, using lightweight containers.
- **Repeatability** Because containers are isolated in their own filesystem, they behave the same regardless of where, when, and alongside what they run.
Each use of ``docker`` is documented here. The features of Docker are
currently in active development, so this documention will change
frequently.
.. image:: concepts/images/lego_docker.jpg
What is a Standard Container?
-----------------------------
Docker defines a unit of software delivery called a Standard Container. The goal of a Standard Container is to encapsulate a software component and all its dependencies in
a format that is self-describing and portable, so that any compliant runtime can run it without extra dependency, regardless of the underlying machine and the contents of the container.
The spec for Standard Containers is currently work in progress, but it is very straightforward. It mostly defines 1) an image format, 2) a set of standard operations, and 3) an execution environment.
A great analogy for this is the shipping container. Just like Standard Containers are a fundamental unit of software delivery, shipping containers (http://bricks.argz.com/ins/7823-1/12) are a fundamental unit of physical delivery.
Standard operations
~~~~~~~~~~~~~~~~~~~
Just like shipping containers, Standard Containers define a set of STANDARD OPERATIONS. Shipping containers can be lifted, stacked, locked, loaded, unloaded and labelled. Similarly, standard containers can be started, stopped, copied, snapshotted, downloaded, uploaded and tagged.
Content-agnostic
~~~~~~~~~~~~~~~~~~~
Just like shipping containers, Standard Containers are CONTENT-AGNOSTIC: all standard operations have the same effect regardless of the contents. A shipping container will be stacked in exactly the same way whether it contains Vietnamese powder coffee or spare Maserati parts. Similarly, Standard Containers are started or uploaded in the same way whether they contain a postgres database, a php application with its dependencies and application server, or Java build artifacts.
Infrastructure-agnostic
~~~~~~~~~~~~~~~~~~~~~~~~~~
Both types of containers are INFRASTRUCTURE-AGNOSTIC: they can be transported to thousands of facilities around the world, and manipulated by a wide variety of equipment. A shipping container can be packed in a factory in Ukraine, transported by truck to the nearest routing center, stacked onto a train, loaded into a German boat by an Australian-built crane, stored in a warehouse at a US facility, etc. Similarly, a standard container can be bundled on my laptop, uploaded to S3, downloaded, run and snapshotted by a build server at Equinix in Virginia, uploaded to 10 staging servers in a home-made Openstack cluster, then sent to 30 production instances across 3 EC2 regions.
Designed for automation
~~~~~~~~~~~~~~~~~~~~~~~~~~
Because they offer the same standard operations regardless of content and infrastructure, Standard Containers, just like their physical counterpart, are extremely well-suited for automation. In fact, you could say automation is their secret weapon.
Many things that once required time-consuming and error-prone human effort can now be programmed. Before shipping containers, a bag of powder coffee was hauled, dragged, dropped, rolled and stacked by 10 different people in 10 different locations by the time it reached its destination. 1 out of 50 disappeared. 1 out of 20 was damaged. The process was slow, inefficient and cost a fortune - and was entirely different depending on the facility and the type of goods.
Similarly, before Standard Containers, by the time a software component ran in production, it had been individually built, configured, bundled, documented, patched, vendored, templated, tweaked and instrumented by 10 different people on 10 different computers. Builds failed, libraries conflicted, mirrors crashed, post-it notes were lost, logs were misplaced, cluster updates were half-broken. The process was slow, inefficient and cost a fortune - and was entirely different depending on the language and infrastructure provider.
Industrial-grade delivery
~~~~~~~~~~~~~~~~~~~~~~~~~~
There are 17 million shipping containers in existence, packed with every physical good imaginable. Every single one of them can be loaded on the same boats, by the same cranes, in the same facilities, and sent anywhere in the World with incredible efficiency. It is embarrassing to think that a 30 ton shipment of coffee can safely travel half-way across the World in *less time* than it takes a software team to deliver its code from one datacenter to another sitting 10 miles away.
With Standard Containers we can put an end to that embarrassment, by making INDUSTRIAL-GRADE DELIVERY of software a reality.
Standard Container Specification
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(TODO)
Image format
~~~~~~~~~~~~
Standard operations
~~~~~~~~~~~~~~~~~~~
- Copy
- Run
- Stop
- Wait
- Commit
- Attach standard streams
- List filesystem changes
- ...
Execution environment
~~~~~~~~~~~~~~~~~~~~~
Root filesystem
^^^^^^^^^^^^^^^
Environment variables
^^^^^^^^^^^^^^^^^^^^^
Process arguments
^^^^^^^^^^^^^^^^^
Networking
^^^^^^^^^^
Process namespacing
^^^^^^^^^^^^^^^^^^^
Resource limits
^^^^^^^^^^^^^^^
Process monitoring
^^^^^^^^^^^^^^^^^^
Logging
^^^^^^^
Signals
^^^^^^^
Pseudo-terminal allocation
^^^^^^^^^^^^^^^^^^^^^^^^^^
Security
^^^^^^^^
For an overview of Docker, please see the `Introduction
<http://www.docker.io>`_. When you're ready to start working with
Docker, we have a `quick start <http://www.docker.io/gettingstarted>`_
and a more in-depth guide to :ref:`ubuntu_linux` and other
:ref:`installation_list` paths including prebuilt binaries,
Vagrant-created VMs, Rackspace and Amazon instances.
Enough reading! :ref:`Try it out! <running_examples>`

View file

@ -1,12 +1,17 @@
:title: Documentation
:description: -- todo: change me
:keywords: todo, docker, documentation, installation, OS support
:title: Docker Installation
:description: many ways to install Docker
:keywords: docker, installation
.. _installation_list:
Installation
============
There are a number of ways to install Docker, depending on where you
want to run the daemon. The :ref:`ubuntu_linux` installation is the
officially-tested version, and the community adds more techniques for
installing Docker all the time.
Contents:
.. toctree::

View file

@ -0,0 +1,40 @@
:title: Container
:description: Definitions of a container
:keywords: containers, lxc, concepts, explanation, image, container
.. _container_def:
Container
=========
.. image:: images/docker-filesystems-busyboxrw.png
Once you start a process in Docker from an :ref:`image_def`, Docker
fetches the image and its :ref:`parent_image_def`, and repeats the
process until it reaches the :ref:`base_image_def`. Then the
:ref:`ufs_def` adds a read-write layer on top. That read-write layer,
plus the information about its :ref:`parent_image_def` and some
additional information like its unique id, networking configuration,
and resource limits is called a **container**.
.. _container_state_def:
Container State
...............
Containers can change, and so they have state. A container may be
**running** or **exited**.
When a container is running, the idea of a "container" also includes a
tree of processes running on the CPU, isolated from the other
processes running on the host.
When the container is exited, the state of the file system and
its exit value is preserved. You can start, stop, and restart a
container. The processes restart from scratch (their memory state is
**not** preserved in a container), but the file system is just as it
was when the container was stopped.
You can promote a container to an :ref:`image_def` with ``docker
commit``. Once a container is an image, you can use it as a parent for
new containers.

View file

@ -0,0 +1,38 @@
:title: File Systems
:description: How Linux organizes its persistent storage
:keywords: containers, files, linux
.. _filesystem_def:
File System
===========
.. image:: images/docker-filesystems-generic.png
In order for a Linux system to run, it typically needs two `file
systems <http://en.wikipedia.org/wiki/Filesystem>`_:
1. boot file system (bootfs)
2. root file system (rootfs)
The **boot file system** contains the bootloader and the kernel. The
user never makes any changes to the boot file system. In fact, soon
after the boot process is complete, the entire kernel is in memory,
and the boot file system is unmounted to free up the RAM associated
with the initrd disk image.
The **root file system** includes the typical directory structure we
associate with Unix-like operating systems: ``/dev, /proc, /bin, /etc,
/lib, /usr,`` and ``/tmp`` plus all the configuration files, binaries
and libraries required to run user applications (like bash, ls, and so
forth).
While there can be important kernel differences between different
Linux distributions, the contents and organization of the root file
system are usually what make your software packages dependent on one
distribution versus another. Docker can help solve this problem by
running multiple distributions at the same time.
.. image:: images/docker-filesystems-multiroot.png

View file

@ -1,97 +0,0 @@
:title: Image & Container
:description: Definitions of an image and container
:keywords: containers, lxc, concepts, explanation, image, container
File Systems
============
.. image:: images/docker-filesystems-generic.png
In order for a Linux system to run, it typically needs two `file
systems <http://en.wikipedia.org/wiki/Filesystem>`_:
1. boot file system (bootfs)
2. root file system (rootfs)
The **boot file system** contains the bootloader and the kernel. The
user never makes any changes to the boot file system. In fact, soon
after the boot process is complete, the entire kernel is in memory,
and the boot file system is unmounted to free up the RAM associated
with the initrd disk image.
The **root file system** includes the typical directory structure we
associate with Unix-like operating systems: ``/dev, /proc, /bin, /etc,
/lib, /usr,`` and ``/tmp`` plus all the configuration files, binaries
and libraries required to run user applications (like bash, ls, and so
forth).
While there can be important kernal differences between different
Linux distributions, the contents and organization of the root file
system are usually what make your software packages dependent on one
distribution versus another. Docker can help solve this problem by
running multiple distributions at the same time.
.. image:: images/docker-filesystems-multiroot.png
Layers and Union Mounts
=======================
In a traditional Linux boot, the kernel first mounts the root file
system as read-only, checks its integrity, and then switches the whole
rootfs volume to read-write mode. Docker does something similar,
*except* that instead of changing the file system to read-write mode,
it takes advantage of a `union mount
<http://en.wikipedia.org/wiki/Union_mount>`_ to add a read-write file
system *over* the read-only file system. In fact there may be multiple
read-only file systems stacked on top of each other.
.. image:: images/docker-filesystems-multilayer.png
At first, the top layer has nothing in it, but any time a process
creates a file, this happens in the top layer. And if something needs
to update an existing file in a lower layer, then the file gets copied
to the upper layer and changes go into the copy. The version of the
file on the lower layer cannot be seen by the applications anymore,
but it is there, unchanged.
We call the union of the read-write layer and all the read-only layers
a **union file system**.
Image
=====
In Docker terminology, a read-only layer is called an **image**. An
image never changes. Because Docker uses a union file system, the
applications think the whole file system is mounted read-write,
because any file can be changed. But all the changes go to the
top-most layer, and underneath, the image is unchanged. Since they
don't change, images do not have state.
Each image may depend on one more image which forms the layer beneath
it. We sometimes say that the lower image is the **parent** of the
upper image.
Base Image
==========
An image that has no parent is a **base image**.
Container
=========
Once you start a process in Docker from an image, Docker fetches the
image and its parent, and repeats the process until it reaches the
base image. Then the union file system adds a read-write layer on
top. That read-write layer, plus the information about its parent and
some additional information like its unique id, is called a
**container**.
Containers can change, and so they have state. A container may be
running or exited. In either case, the state of the file system and
its exit value is preserved. You can start, stop, and restart a
container. The processes restart from scratch (their memory state is
**not** preserved in a container), but the file system is just as it
was when the container was stopped.
You can promote a container to an image with ``docker commit``. Once a
container is an image, you can use it as a parent for new containers.

View file

@ -0,0 +1,38 @@
:title: Images
:description: Definition of an image
:keywords: containers, lxc, concepts, explanation, image, container
.. _image_def:
Image
=====
.. image:: images/docker-filesystems-debian.png
In Docker terminology, a read-only :ref:`layer_def` is called an
**image**. An image never changes.
Since Docker uses a :ref:`ufs_def`, the processes think the whole file
system is mounted read-write. But all the changes go to the top-most
writeable layer, and underneath, the original file in the read-only
image is unchanged. Since images don't change, images do not have state.
.. image:: images/docker-filesystems-debianrw.png
.. _parent_image_def:
Parent Image
............
.. image:: images/docker-filesystems-multilayer.png
Each image may depend on one more image which forms the layer beneath
it. We sometimes say that the lower image is the **parent** of the
upper image.
.. _base_image_def:
Base Image
..........
An image that has no parent is a **base image**.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 69 KiB

View file

@ -9,15 +9,15 @@
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="0.48.2 r9819"
version="1.1"
id="svg2"
height="600"
width="800"
sodipodi:docname="docker-filesystems.svg"
inkscape:export-filename="/Users/arothfusz/src/metalivedev/docker/docs/sources/terms/images/docker-filesystems-multilayer.png"
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
inkscape:export-filename="/Users/arothfusz/src/metalivedev/docker/docs/sources/terms/images/docker-filesystems-multiroot.png"
sodipodi:docname="docker-filesystems.svg"
width="800"
height="600"
id="svg2"
version="1.1"
inkscape:version="0.48.2 r9819">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
@ -26,10 +26,10 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.82666667"
inkscape:cx="361.59949"
inkscape:cy="396.77419"
inkscape:cx="382.45968"
inkscape:cy="348.3871"
inkscape:document-units="px"
inkscape:current-layer="layer8"
inkscape:current-layer="layer4"
showgrid="false"
width="800px"
inkscape:window-width="1327"
@ -84,12 +84,34 @@
position="-404.80241,590.32258"
id="guide4281" />
<sodipodi:guide
orientation="1,0"
position="518.95161,347.17742"
id="guide9339" />
id="guide5235"
position="400.40322,131.85484"
orientation="1,0" />
<sodipodi:guide
id="guide5237"
position="143.95161,295.16129"
orientation="1,0" />
<sodipodi:guide
id="guide5239"
position="281.85484,384.67742"
orientation="1,0" />
</sodipodi:namedview>
<defs
id="defs4">
<inkscape:perspective
id="perspective11489"
inkscape:persp3d-origin="403.62904 : 221.23862 : 1"
inkscape:vp_z="1196.7644 : 521.45993 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="-406.34117 : 522.93291 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-407.55086 : 591.21042 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="1200.3935 : 584.89873 : 1"
inkscape:persp3d-origin="400 : 200 : 1"
id="perspective5786" />
<inkscape:perspective
id="perspective4014"
inkscape:persp3d-origin="406.04839 : 290.19023 : 1"
@ -132,6 +154,7 @@
</rdf:RDF>
</metadata>
<g
sodipodi:insensitive="true"
inkscape:groupmode="layer"
id="layer8"
inkscape:label="Background"
@ -197,38 +220,6 @@
inkscape:box3dsidetype="3"
d="m 132.72634,765.18707 253.32517,142.55608 0,96.58025 -253.32517,-173.38536 z" />
</g>
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/Users/arothfusz/src/metalivedev/docker/docs/sources/terms/images/docker-filesystems-multiroot.png"
id="text8376"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
transform="matrix(0.58237543,0,0,0.58237543,219.84375,178.6359)">
<path
id="path8383"
d="m 407.6752,504.83554 c 0,0 0,16.04632 0,16.04632 0,0 4.1431,-2.64344 4.1431,-2.64344 2.73806,-1.74697 4.66912,-2.30333 5.80495,-1.67953 1.16895,0.55219 1.75215,1.89552 1.75218,4.03129 -3e-5,2.08935 -0.58323,4.1876 -1.75218,6.29934 -1.13583,2.04747 -3.06689,3.96726 -5.80495,5.76429 0,0 -17.71025,11.62348 -17.71025,11.62348 -2.88271,1.89195 -4.96006,2.58018 -6.21946,2.05325 -1.22381,-0.60271 -1.83708,-2.01825 -1.83708,-4.24517 0,-2.17847 0.63304,-4.35207 1.8962,-6.51576 1.25921,-2.20514 3.31673,-4.21714 6.16034,-6.03146 0,0 1.8589,-1.18604 1.8589,-1.18604 0,0 0,-57.52956 0,-57.52956 0,0 -1.8589,1.05311 -1.8589,1.05311 -2.88271,1.63317 -4.96006,2.13486 -6.21946,1.49476 -1.22381,-0.71252 -1.83708,-2.1831 -1.83708,-4.41009 0,-2.22685 0.61327,-4.35683 1.83708,-6.38541 1.2594,-2.09209 3.33675,-3.93007 6.21946,-5.51029 0,0 17.71025,-9.63763 17.71025,-9.63763 2.73806,-1.50103 4.66912,-1.90729 5.80495,-1.22806 1.16895,0.65733 1.75215,2.05308 1.75218,4.18878 -3e-5,2.13588 -0.58323,4.20494 -1.75218,6.21164 -1.13583,1.94555 -3.06689,3.69194 -5.80495,5.24303 0,0 -4.1431,2.34713 -4.1431,2.34713 0,0 0,21.48932 0,21.48932 0,0 19.97055,-33.42313 19.97055,-33.42313 -1.14267,-0.41166 -1.9302,-0.95733 -2.36038,-1.63677 -0.43077,-0.67999 -0.64629,-1.68902 -0.64626,-3.02649 -3e-5,-2.16742 0.55652,-4.22734 1.66728,-6.17561 1.14317,-1.96205 3.0292,-3.66214 5.64725,-5.09729 0,0 10.89672,-5.90556 10.89672,-5.90556 2.52713,-1.3854 4.30988,-1.73587 5.35863,-1.05974 1.07944,0.65586 1.61801,2.00928 1.61806,4.0617 -5e-5,2.00797 -0.53862,3.96169 -1.61806,5.86527 -1.04875,1.89005 -2.71237,3.4818 -4.99901,4.77715 0,0 -19.38021,33.27709 -19.38021,33.27709 3.69112,0.51378 7.11765,2.57896 10.28615,6.17689 3.1772,3.54703 5.96596,8.60211 8.37448,15.15605 0,0 2.81906,-1.79866 2.81906,-1.79866 2.47696,-1.58038 4.23151,-2.05261 5.27367,-1.42578 1.07264,0.55918 1.60782,1.86117 1.60788,3.90719 -6e-5,2.00157 -0.5185,3.98542 -1.55753,5.95553 -1.042,1.93101 -2.81324,3.71837 -5.32402,5.36622 0,0 -9.61907,6.31312 -9.61907,6.31312 -2.24123,-5.50482 -4.70762,-10.58658 -7.40337,-15.2454 -2.2133,-3.8066 -4.33127,-6.27087 -6.35225,-7.38073 -1.99524,-1.18421 -4.40301,-1.64069 -7.23093,-1.36339 0,0 -7.02864,11.83882 -7.02864,11.83882"
inkscape:connector-curvature="0" />
<path
id="path8385"
d="m 504.33889,450.20724 c 0,0 -38.51263,24.07437 -38.51263,24.07437 1.02952,2.84505 2.84029,4.51025 5.42072,4.99903 2.59378,0.4652 6.06003,-0.69838 10.37364,-3.4633 3.4995,-2.24309 8.09778,-6.22556 13.75209,-11.8953 2.30731,-2.30433 3.8959,-3.73056 4.77538,-4.2889 1.19829,-0.76067 2.20348,-0.79709 3.01722,-0.11236 0.81174,0.68323 1.21692,1.93451 1.21697,3.75503 -5e-5,1.65511 -0.43419,3.34335 -1.30407,5.06802 -1.16332,2.29253 -4.01513,5.63253 -8.59699,10.05719 -4.6422,4.44071 -9.16261,8.11778 -13.55534,11.01372 -7.68449,5.06604 -13.95767,6.17145 -18.74216,3.20582 -4.81441,-3.02556 -7.24522,-9.05127 -7.24522,-18.04744 0,-9.57222 2.62856,-18.90863 7.83044,-27.91368 5.16157,-8.94171 11.00878,-15.25277 17.50729,-18.97607 3.84969,-2.20557 7.3401,-3.27314 10.4811,-3.22069 3.14318,0.0349 5.46016,0.68067 6.96696,1.93361 2.1162,1.8432 3.85544,4.61873 5.22325,8.32396 0.92815,2.58851 1.39131,5.94912 1.39135,10.087 0,0 0,5.39999 0,5.39999 m -9.99158,-6.66099 c -1.40179,-2.8503 -3.2444,-4.50369 -5.53473,-4.95378 -2.30521,-0.49538 -5.06978,0.20545 -8.3042,2.11763 -3.23259,1.91123 -6.05351,4.52841 -8.45282,7.85517 -2.41524,3.30543 -4.39745,7.34338 -5.93945,12.11231 0,0 28.2312,-17.13133 28.2312,-17.13133"
inkscape:connector-curvature="0" />
<path
id="path8387"
d="m 532.28648,399.49334 c 0,0 0,7.62581 0,7.62581 3.42049,-5.6818 6.08733,-9.67191 8.01819,-12.00361 1.94545,-2.33281 3.75091,-3.97369 5.41859,-4.92923 2.54908,-1.4604 5.00284,-1.43726 7.3632,0.0528 1.59719,0.99371 2.39286,2.48554 2.3929,4.47907 -4e-5,1.68701 -0.38521,3.35331 -1.15685,5.00185 -0.74861,1.59928 -1.66169,2.72207 -2.74065,3.36726 -0.95657,0.57205 -1.9665,0.4409 -3.03028,-0.39672 -1.06733,-0.84026 -2.02323,-1.01257 -2.86671,-0.51395 -1.10244,0.65184 -2.763,2.68889 -4.99017,6.12693 -2.21624,3.44588 -5.01411,8.32326 -8.40822,14.66299 0,0 0,18.4092 0,18.4092 0,0 11.47319,-7.32028 11.47319,-7.32028 1.89957,-1.21199 3.2406,-1.50439 4.02992,-0.88361 0.81268,0.56434 1.2183,1.73659 1.21834,3.51786 -4e-5,1.74257 -0.40566,3.43988 -1.21834,5.0949 -0.78932,1.60367 -2.13035,3.0276 -4.02992,4.27431 0,0 -24.80701,16.28117 -24.80701,16.28117 -2.05798,1.35069 -3.53958,1.75299 -4.43724,1.19972 -0.87187,-0.6139 -1.30863,-1.86107 -1.30863,-3.74027 0,-1.83831 0.43676,-3.60993 1.30863,-5.31162 0.89766,-1.75595 2.37926,-3.2917 4.43724,-4.60477 0,0 5.03647,-3.21343 5.03647,-3.21343 0,0 0,-30.03766 0,-30.03766 0,0 -3.04598,1.80817 -3.04598,1.80817 -2.04596,1.2146 -3.51888,1.52055 -4.41127,0.91117 -0.86675,-0.66806 -1.30094,-1.93958 -1.30094,-3.81328 0,-1.8329 0.43419,-3.57126 1.30094,-5.212 0.89239,-1.6931 2.36531,-3.12925 4.41127,-4.30644 0,0 11.34333,-6.52633 11.34333,-6.52633"
inkscape:connector-curvature="0" />
<path
id="path8389"
d="m 572.24194,376.50516 c 0,0 0,3.86493 0,3.86493 1.31657,-2.55421 2.75611,-4.72562 4.31689,-6.51554 1.57611,-1.79414 3.27078,-3.20898 5.08203,-4.24677 4.13268,-2.36771 7.36362,-2.16528 9.72036,0.56776 1.85468,2.16735 2.77779,5.877 2.77783,11.1389 0,0 0,20.59729 0,20.59729 1.42308,-0.90797 2.46973,-1.05531 3.1438,-0.44622 0.67249,0.572 1.00821,1.68074 1.00824,3.32725 -3e-5,1.61072 -0.34658,3.16111 -1.04082,4.65362 -0.67414,1.44584 -1.81921,2.6999 -3.44058,3.76403 0,0 -6.15847,4.04189 -6.15847,4.04189 -1.66347,1.09175 -2.8604,1.36497 -3.58533,0.81425 -0.70395,-0.6035 -1.0565,-1.74997 -1.05647,-3.4383 -3e-5,-1.65157 0.35252,-3.21764 1.05647,-4.6957 0.70228,-1.51122 1.78658,-2.73371 3.24886,-3.66669 0,0 0,-21.15717 0,-21.15717 -2e-5,-2.44186 -0.40426,-3.98655 -1.21429,-4.63538 -1.06085,-0.83225 -2.65895,-0.61904 -4.8027,0.64833 -1.62916,0.96324 -3.07036,2.33311 -4.32094,4.11119 -1.23237,1.73432 -2.80892,4.8321 -4.73488,9.30874 0,0 0,21.34125 0,21.34125 1.85569,-1.184 3.04789,-1.66582 3.58407,-1.45135 1.13919,0.38348 1.70724,1.64851 1.70726,3.79612 -2e-5,1.66625 -0.37088,3.27815 -1.11389,4.83837 -0.72152,1.51157 -1.94723,2.83594 -3.68307,3.97519 0,0 -8.33029,5.46728 -8.33029,5.46728 -1.79222,1.17626 -3.08205,1.49092 -3.86336,0.938 -0.75872,-0.60834 -1.13874,-1.78952 -1.13874,-3.54238 0,-2.1339 0.58824,-4.16867 1.76149,-6.09901 0.58501,-0.94353 1.83674,-2.02693 3.74738,-3.24598 0,0 0,-28.22034 0,-28.22034 -1.57121,0.93277 -2.73648,1.07437 -3.4913,0.42017 -0.75664,-0.65565 -1.13561,-1.84028 -1.13561,-3.55271 0,-1.71238 0.37897,-3.32097 1.13561,-4.82316 0.77916,-1.55048 2.06546,-2.84066 3.85278,-3.86905 0,0 6.96767,-4.00881 6.96767,-4.00881"
inkscape:connector-curvature="0" />
<path
id="path8391"
d="m 634.34141,368.94225 c 0,0 -25.20953,15.75856 -25.20953,15.75856 0.6672,2.39172 1.84157,3.9121 3.51707,4.56242 1.68646,0.63355 3.94388,0.0402 6.75893,-1.7642 2.28854,-1.46689 5.30217,-4.23703 9.01804,-8.27952 1.51956,-1.64558 2.56684,-2.64955 3.14705,-3.0179 0.79096,-0.50209 1.45484,-0.43448 1.99254,0.20091 0.53661,0.63426 0.80455,1.6912 0.8046,3.17172 -5e-5,1.34601 -0.28714,2.67618 -0.86216,3.99258 -0.7686,1.7482 -2.65074,4.17765 -5.66863,7.30949 -3.05013,3.13106 -6.01295,5.64891 -8.88527,7.54251 -5.00854,3.3019 -9.08208,3.5476 -12.17982,0.67175 -3.10916,-2.91974 -4.67598,-8.00122 -4.67598,-15.22147 0,-7.68257 1.69435,-14.92957 5.05447,-21.68353 3.34323,-6.72524 7.14168,-11.28617 11.37713,-13.71287 2.51598,-1.44145 4.80162,-1.99625 6.86211,-1.67548 2.06538,0.30724 3.59011,1.03724 4.58269,2.18866 1.39536,1.68649 2.54336,4.09846 3.44695,7.23454 0.6135,2.18975 0.91977,4.96536 0.91981,8.3304 0,0 0,4.39143 0,4.39143 m -6.5902,-6.34854 c -0.92175,-2.4412 -2.13235,-3.95102 -3.6354,-4.52578 -1.51099,-0.61206 -3.3206,-0.29783 -5.4344,0.95183 -2.10895,1.2469 -3.94636,3.09915 -5.50696,5.55983 -1.56898,2.43888 -2.85515,5.5053 -3.85476,9.19879 0,0 18.43152,-11.18467 18.43152,-11.18467"
inkscape:connector-curvature="0" />
<path
id="path8393"
d="m 656.82836,308.98356 c 0,0 0,52.93031 0,52.93031 0,0 6.4328,-4.10434 6.4328,-4.10434 1.27173,-0.81141 2.17036,-0.92363 2.69958,-0.34039 0.54515,0.53946 0.81731,1.53839 0.81734,2.99761 -3e-5,1.42751 -0.27219,2.77874 -0.81734,4.05558 -0.52922,1.23647 -1.42785,2.27149 -2.69958,3.10614 0,0 -18.63545,12.2307 -18.63545,12.2307 -1.36813,0.89792 -2.35216,1.07925 -2.94796,0.53978 -0.57842,-0.58603 -0.86806,-1.64466 -0.86806,-3.17491 0,-1.49696 0.28964,-2.89722 0.86806,-4.19875 0.5958,-1.34387 1.57983,-2.45281 2.94796,-3.32572 0,0 6.72309,-4.28956 6.72309,-4.28956 0,0 0,-43.42716 0,-43.42716 0,0 -4.49128,2.51035 -4.49128,2.51035 -1.33877,0.74834 -2.3056,0.82613 -2.89655,0.22966 -0.59221,-0.63072 -0.88879,-1.70864 -0.88879,-3.23275 0,-1.49086 0.28731,-2.85673 0.86106,-4.0957 0.59101,-1.27931 1.56713,-2.28621 2.92428,-3.02004 0,0 9.97084,-5.39081 9.97084,-5.39081"
inkscape:connector-curvature="0" />
</g>
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
@ -269,45 +260,99 @@
d="m 574.61499,283.99905 c -3.31444,-0.15435 -6.08369,-0.11845 -8.31443,0.10735 -2.30321,0.20508 -4.07372,0.60048 -5.31424,1.18721 -2.46838,1.16767 -3.01224,2.51015 -1.61447,4.03327 0.60292,0.67291 1.64413,1.22527 3.12534,1.65615 1.70913,0.49721 3.82744,0.77332 6.35381,0.8271 1.87073,0.0245 4.53088,-0.36099 7.97382,-1.15539 6.3436,-1.44672 11.39483,-2.26881 15.17355,-2.47016 4.98619,-0.25925 10.88971,0.10784 17.75075,1.10837 6.92387,1.00975 13.65666,2.40914 20.21272,4.20821 9.03796,2.4802 15.73657,5.10339 20.02734,7.86932 6.35081,4.06357 7.3,7.36394 2.70673,9.84732 -1.85312,1.00191 -4.27563,1.73258 -7.2635,2.1895 -2.88132,0.47104 -6.28692,0.6849 -10.20845,0.64145 0.80272,0.49803 1.32719,0.93276 1.57202,1.30366 0.24495,0.37149 0.1769,0.66031 -0.20564,0.86576 -1.02151,0.54865 -3.18409,0.59244 -6.47634,0.13197 -3.34347,-0.49542 -8.15753,-1.67755 -14.39541,-3.53092 0,0 -8.59884,-2.55485 -8.59884,-2.55485 -6.05987,-1.80048 -10.01632,-3.2171 -11.91481,-4.26116 -1.94556,-1.07213 -2.42442,-1.85248 -1.44701,-2.34539 0.78497,-0.39581 2.2796,-0.48123 4.48868,-0.25629 2.13397,0.20198 5.36767,0.81735 9.72187,1.85154 4.26215,0.44403 7.96002,0.55921 11.08074,0.3439 3.04016,-0.23936 5.45895,-0.82613 7.25042,-1.75782 2.92404,-1.52066 3.35798,-3.20948 1.3294,-5.05875 -1.04765,-0.89657 -2.55062,-1.61718 -4.50718,-2.1636 -3.2445,-0.90604 -6.44882,-1.37387 -9.62339,-1.4077 -3.16808,-0.0337 -7.17813,0.6088 -12.04806,1.93106 -7.21679,1.99422 -14.62018,2.58337 -22.13286,1.76443 -7.37333,-0.78946 -15.08696,-2.38082 -23.08624,-4.74933 -8.08729,-2.39456 -13.72809,-4.81726 -16.98815,-7.27133 -4.41938,-3.29135 -4.47329,-5.88661 -0.24956,-7.8229 1.46281,-0.6705 3.34863,-1.17273 5.65981,-1.50788 2.26094,-0.36411 4.98687,-0.55216 8.18326,-0.56429 -0.60143,-0.45433 -0.98542,-0.82473 -1.153,-1.11182 -0.14687,-0.2959 -0.0782,-0.50905 0.20561,-0.63976 0.85095,-0.3916 2.68442,-0.40633 5.50914,-0.0436 2.76417,0.34452 6.79329,1.24528 12.1235,2.71337 0,0 5.46229,1.50449 5.46229,1.50449 4.9316,1.35835 8.14703,2.36621 9.61371,3.01537 2.80152,1.26506 3.65218,2.17198 2.53312,2.71381 -0.75407,0.36519 -2.28486,0.44438 -4.58735,0.23757 -2.2968,-0.20623 -4.94238,-0.66681 -7.9287,-1.37921"
id="path9377" />
</g>
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 386.05151,551.96125 0,-96.58028 280.72657,-151.77679 0,63.28635 z"
id="path4672"
inkscape:connector-curvature="0" />
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/Users/arothfusz/src/metalivedev/docker/docs/sources/terms/images/docker-filesystems-multiroot.png"
transform="matrix(0.79944175,0,0,0.79944175,52.022588,84.530657)"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Sans"
id="text12064">
id="text7447"
style="font-size:40px;font-style:italic;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Futura;-inkscape-font-specification:Futura Medium Italic">
<path
id="path7454"
d="m 147.58834,332.81239 c 0,0 -1.75619,37.90152 -1.75619,37.90152 0,0 -1.88054,-1.21673 -1.88054,-1.21673 0,0 1.76021,-37.74043 1.76021,-37.74043 0,0 1.87652,1.05564 1.87652,1.05564"
inkscape:connector-curvature="0" />
<path
id="path7456"
d="m 155.5998,356.97158 c 0,0 -0.24054,5.14593 -0.24054,5.14593 -0.40443,-1.61247 -0.78977,-2.82699 -1.15617,-3.64502 -0.35987,-0.7974 -0.78335,-1.34369 -1.27013,-1.63943 -0.73705,-0.44773 -1.33999,-0.091 -1.81,1.06776 -0.46924,1.15688 -0.70259,2.86881 -0.7006,5.13825 0.002,2.13082 0.22404,3.97436 0.6673,5.53232 0.4501,1.58081 1.03211,2.60051 1.7469,3.05745 0.68755,0.43955 1.39964,0.10214 2.13626,-1.01548 0,0 -0.24938,5.3343 -0.24938,5.3343 -0.75516,0.32879 -1.47328,0.27142 -2.15455,-0.1704 -1.21082,-0.78524 -2.19272,-2.47392 -2.94825,-5.0617 -0.74689,-2.57425 -1.12029,-5.52395 -1.12234,-8.85412 -0.002,-3.41998 0.39606,-6.0285 1.19618,-7.83178 0.80817,-1.82041 1.81762,-2.37095 3.0313,-1.64489 0.99666,0.59627 1.95471,2.12313 2.87402,4.58681"
inkscape:connector-curvature="0" />
<path
id="path7458"
d="m 162.12519,369.14836 c 0,0 3.15558,14.14905 3.15558,14.14905 0,0 -2.36428,-1.52972 -2.36428,-1.52972 0,0 -2.06013,-9.88013 -2.06013,-9.88013 0,0 -2.73436,6.77803 -2.73436,6.77803 0,0 -2.55294,-1.65178 -2.55294,-1.65178 0,0 4.27078,-9.71399 4.27078,-9.71399 0,0 -2.54931,-11.45318 -2.54931,-11.45318 0,0 2.27488,1.36446 2.27488,1.36446 0,0 1.52855,7.34113 1.52855,7.34113 0,0 2.03981,-5.20084 2.03981,-5.20084 0,0 2.60043,1.55972 2.60043,1.55972 0,0 -3.60901,8.23725 -3.60901,8.23725"
inkscape:connector-curvature="0" />
<path
id="path7460"
d="m 169.92343,379.36559 c 0,0 -3.25195,12.16924 -3.25195,12.16924 0,0 -1.27259,-2.63135 -1.27259,-2.63135 0,0 2.90583,-12.86349 2.90583,-12.86349 0,0 1.61871,3.3256 1.61871,3.3256"
inkscape:connector-curvature="0" />
<path
id="path7462"
d="m 189.30148,375.04665 c 0,0 -1.03888,23.12027 -1.03888,23.12027 0,0 -2.24228,-1.45077 -2.24228,-1.45077 0,0 0.11673,-2.49125 0.11673,-2.49125 -0.94298,1.47092 -1.92196,1.87493 -2.93613,1.21763 -1.24207,-0.80501 -2.25567,-2.51652 -3.04325,-5.13028 -0.78468,-2.60409 -1.18382,-5.57547 -1.1996,-8.91911 -0.0182,-3.85301 0.40809,-6.73894 1.2807,-8.66498 0.88831,-1.92374 2.04012,-2.46472 3.45951,-1.61503 0.6727,0.40274 1.24847,1.02201 1.72666,1.85828 0.48587,0.84208 0.98515,2.09412 1.498,3.75781 0,0 0.13357,-3.0291 0.13357,-3.0291 0,0 2.24497,1.34653 2.24497,1.34653 m -2.66567,9.53882 c -0.0121,-2.10019 -0.26427,-3.95362 -0.75572,-5.55842 -0.49044,-1.61785 -1.11651,-2.65716 -1.8773,-3.11967 -0.82492,-0.50144 -1.51048,-0.11404 -2.058,1.15924 -0.54646,1.28764 -0.81341,3.10968 -0.80158,5.46904 0.0103,2.06152 0.24981,3.89591 0.71924,5.50498 0.47047,1.61265 1.07146,2.65376 1.80379,3.12165 0.81474,0.52057 1.51683,0.14096 2.10513,-1.14196 0.58925,-1.31904 0.87768,-3.13164 0.86444,-5.43486"
inkscape:connector-curvature="0" />
<path
id="path7464"
d="m 200.98417,382.05386 c 0,0 -0.60701,13.76386 -0.60701,13.76386 -0.0478,1.17529 -0.11093,2.18594 -0.18949,3.03183 -0.0786,0.8458 -0.16535,1.53989 -0.26032,2.08222 -0.1903,1.03239 -0.51634,1.84794 -0.97764,2.4463 -0.78121,1.00906 -1.81569,1.09476 -3.10016,0.26227 -1.21534,-0.78769 -2.18714,-2.17556 -2.91798,-4.16161 -0.72858,-1.99666 -1.10026,-4.27781 -1.1168,-6.84699 -0.003,-0.39117 10e-4,-0.84599 0.0118,-1.36445 0.0173,-0.51405 0.0409,-1.10033 0.0709,-1.75873 0,0 0.55615,-12.57127 0.55615,-12.57127 0,0 2.29365,1.37572 2.29365,1.37572 0,0 -0.58535,13.12163 -0.58535,13.12163 -0.0239,0.56331 -0.0413,1.06266 -0.0521,1.49808 -0.011,0.4184 -0.0156,0.77281 -0.0136,1.06329 0.0172,2.54701 0.63463,4.21014 1.85674,4.9909 0.66588,0.42543 1.15463,0.31796 1.46518,-0.3237 0.31086,-0.6423 0.51161,-1.98957 0.60201,-4.04108 0,0 0.62456,-13.97146 0.62456,-13.97146 0,0 2.33946,1.40319 2.33946,1.40319"
inkscape:connector-curvature="0" />
<path
id="path7466"
d="m 206.63389,390.78613 c 0,0 -0.82079,18.73618 -0.82079,18.73618 0,0 -2.40115,-1.55357 -2.40115,-1.55357 0,0 0.82954,-18.64209 0.82954,-18.64209 0,0 -1.55408,-0.94806 -1.55408,-0.94806 0,0 0.22678,-5.16711 0.22678,-5.16711 0,0 1.55445,0.93235 1.55445,0.93235 0,0 0.47336,-10.6332 0.47336,-10.6332 0.12045,-2.83044 0.43153,-4.7841 0.93387,-5.86279 0.50314,-1.08033 1.23473,-1.3513 2.1968,-0.81014 0.58479,0.32902 1.27387,1.15978 2.06817,2.49496 0,0 -0.21954,4.94262 -0.21954,4.94262 -0.4636,-1.13664 -0.88579,-1.81328 -1.26683,-2.03137 -0.43899,-0.25118 -0.76101,-0.0798 -0.96652,0.51359 -0.19081,0.60146 -0.32899,1.83118 -0.41464,3.6896 0,0 -0.40076,9.13858 -0.40076,9.13858 0,0 2.19474,1.3164 2.19474,1.3164 0,0 -0.22825,5.2293 -0.22825,5.2293 0,0 -2.20515,-1.34525 -2.20515,-1.34525"
inkscape:connector-curvature="0" />
<path
id="path7468"
d="m 217.52646,394.74253 c 0,0 -1.38661,2.48014 -1.38661,2.48014 -0.67725,-1.8109 -1.29703,-2.88559 -1.8599,-3.22743 -0.38208,-0.23202 -0.69765,-0.16825 -0.94697,0.19084 -0.24182,0.34568 -0.3592,0.89013 -0.3523,1.63368 0.007,0.72604 0.11693,1.40131 0.33073,2.02617 0.21414,0.64318 0.65861,1.60559 1.33464,2.88942 0.96807,1.85739 1.62118,3.41663 1.95681,4.67361 0.3587,1.2553 0.54644,2.71574 0.56281,4.38041 0.0236,2.39986 -0.31049,4.09968 -1.00105,5.09661 -0.70429,0.96703 -1.62822,1.07848 -2.76933,0.33845 -1.54613,-1.0027 -2.83506,-3.48418 -3.86988,-7.43484 0,0 1.58533,-1.65255 1.58533,-1.65255 0.67846,2.3152 1.39501,3.71619 2.14973,4.19878 0.42688,0.27296 0.76562,0.22407 1.01586,-0.14723 0.25795,-0.3668 0.38295,-0.97802 0.37484,-1.83329 -0.007,-0.74819 -0.12185,-1.42257 -0.34408,-2.02287 -0.10729,-0.29756 -0.29412,-0.7335 -0.56031,-1.30745 -0.26591,-0.57331 -0.6257,-1.28445 -1.07896,-2.13273 -0.79912,-1.53842 -1.35435,-2.89536 -1.66731,-4.07336 -0.31299,-1.22922 -0.47603,-2.59245 -0.48943,-4.09057 -0.0202,-2.25482 0.31059,-3.91075 0.99349,-4.97061 0.68445,-1.0622 1.56745,-1.27103 2.65118,-0.62272 1.20102,0.71853 2.32478,2.58513 3.37071,5.60754"
inkscape:connector-curvature="0" />
<path
id="path7470"
d="m 230.10477,380.45134 c 0,0 -10.56007,50.00187 -10.56007,50.00187 0,0 -1.7864,-3.10109 -1.7864,-3.10109 0,0 10.48761,-49.78707 10.48761,-49.78707 0,0 1.85886,2.88629 1.85886,2.88629"
inkscape:connector-curvature="0" />
<path
id="path7472"
d="m 235.60558,382.32627 c 0,0 -0.96703,22.30206 -0.96703,22.30206 0.68945,-0.7749 1.29198,-1.21024 1.8071,-1.30486 0.54025,-0.0986 1.12911,0.0426 1.76693,0.4244 1.5763,0.94367 2.90043,2.95835 3.96916,6.05018 1.07316,3.08672 1.63707,6.54247 1.68823,10.35998 0.0562,4.19815 -0.49112,7.31628 -1.63901,9.3455 -1.15172,2.0543 -2.57758,2.52687 -4.27282,1.42815 -1.57073,-1.01801 -2.95455,-3.2779 -4.15367,-6.7709 0,0 -0.15177,3.37409 -0.15177,3.37409 0,0 -2.66427,-1.72381 -2.66427,-1.72381 0,0 1.94788,-44.98639 1.94788,-44.98639 0,0 2.66927,1.5016 2.66927,1.5016 m 5.4938,36.24781 c -0.0307,-2.35775 -0.3661,-4.47468 -1.00488,-6.34826 -0.63711,-1.86861 -1.44772,-3.10059 -2.43047,-3.69802 -1.06071,-0.64478 -1.92383,-0.28834 -2.59137,1.06538 -0.66665,1.31409 -0.98282,3.34554 -0.94953,6.09789 0.028,2.31062 0.34566,4.35609 0.9543,6.13874 0.61062,1.82429 1.3932,3.04273 2.34903,3.65337 1.05772,0.67576 1.9389,0.3393 2.64164,-1.01349 0.72078,-1.34522 1.06493,-3.31161 1.03128,-5.89561"
inkscape:connector-curvature="0" />
<path
id="path7474"
d="m 250.36366,417.46334 c 0,0 -0.86865,20.3217 -0.86865,20.3217 0,0 -2.82008,-1.82462 -2.82008,-1.82462 0,0 0.86643,-20.21881 0.86643,-20.21881 0,0 -1.58388,-0.96624 -1.58388,-0.96624 0,0 0.23648,-5.60491 0.23648,-5.60491 0,0 1.5842,0.9502 1.5842,0.9502 0,0 0.51345,-11.96899 0.51345,-11.96899 0,0 2.8242,1.63235 2.8242,1.63235 0,0 -0.51476,12.02979 -0.51476,12.02979 0,0 2.631,1.57806 2.631,1.57806 0,0 -0.23791,5.67619 -0.23791,5.67619 0,0 -2.63048,-1.60472 -2.63048,-1.60472"
inkscape:connector-curvature="0" />
<path
id="path7476"
d="m 258.21202,416.37883 c 0,0 -0.096,2.26144 -0.096,2.26144 0.95454,-1.4502 1.93663,-1.87534 2.94687,-1.27069 0.8891,0.53219 1.71186,1.72674 2.46789,3.5865 0,0 -1.80434,4.16015 -1.80434,4.16015 -0.55854,-1.34027 -1.10799,-2.17406 -1.64849,-2.50309 -0.37157,-0.22615 -0.69596,-0.26088 -0.97335,-0.10449 -0.27744,0.13698 -0.51645,0.48836 -0.7171,1.05404 -0.19204,0.55148 -0.35012,1.32418 -0.47428,2.31814 -0.11535,0.99924 -0.20109,2.22694 -0.25723,3.68339 0,0 -0.55745,13.1404 -0.55745,13.1404 0,0 -2.89641,-1.87402 -2.89641,-1.87402 0,0 1.11066,-26.19071 1.11066,-26.19071 0,0 2.89923,1.73894 2.89923,1.73894"
inkscape:connector-curvature="0" />
<path
id="path7478"
d="m 268.68987,428.64319 c 0,0 -0.86895,20.99894 -0.86895,20.99894 0,0 -3.0058,-1.94479 -3.0058,-1.94479 0,0 0.88041,-20.88084 0.88041,-20.88084 0,0 -1.94335,-1.18553 -1.94335,-1.18553 0,0 0.24005,-5.7852 0.24005,-5.7852 0,0 1.94372,1.16583 1.94372,1.16583 0,0 0.50232,-11.90806 0.50232,-11.90806 0.12679,-3.17002 0.49833,-5.34145 1.11549,-6.5165 0.61826,-1.17706 1.52819,-1.42867 2.73266,-0.75115 0.7324,0.41206 1.59932,1.39576 2.60215,2.95457 0,0 -0.233,5.54102 -0.233,5.54102 -0.58832,-1.31228 -1.12097,-2.10411 -1.59836,-2.37735 -0.54989,-0.31462 -0.95023,-0.14571 -1.2017,0.50598 -0.23303,0.66182 -0.39522,2.0335 -0.48667,4.11558 0,0 -0.42429,10.24046 -0.42429,10.24046 0,0 2.74973,1.64927 2.74973,1.64927 0,0 -0.24152,5.86326 -0.24152,5.86326 0,0 -2.76289,-1.68549 -2.76289,-1.68549"
inkscape:connector-curvature="0" />
<path
id="path7480"
d="m 282.34177,433.95542 c 0,0 -1.71638,2.6839 -1.71638,2.6839 -0.86347,-2.09418 -1.64851,-3.35394 -2.35592,-3.78356 -0.48009,-0.29154 -0.8744,-0.24473 -1.1833,0.13981 -0.29959,0.37 -0.44186,0.97364 -0.42698,1.8113 0.0145,0.81794 0.15802,1.58703 0.43072,2.30771 0.27333,0.74144 0.83759,1.86101 1.69454,3.3616 1.22784,2.17108 2.05909,3.98138 2.49024,5.42552 0.46013,1.4444 0.70781,3.10618 0.74244,4.98411 0.0499,2.7075 -0.35443,4.59578 -1.21137,5.66132 -0.87414,1.03039 -2.03028,1.07769 -3.4649,0.14731 -1.94263,-1.25984 -3.57478,-4.16196 -4.90072,-8.69458 0,0 1.96723,-1.72943 1.96723,-1.72943 0.86759,2.66246 1.77547,4.29951 2.72371,4.90584 0.53649,0.34304 0.96004,0.31621 1.27016,-0.0812 0.31984,-0.39178 0.47119,-1.07004 0.45383,-2.03432 -0.0152,-0.84353 -0.16454,-1.61277 -0.44778,-2.30734 -0.1368,-0.34403 -0.37432,-0.85044 -0.71229,-1.51877 -0.33757,-0.66749 -0.7937,-1.49777 -1.36782,-2.48995 -1.01224,-1.79695 -1.71772,-3.36927 -2.11873,-4.7203 -0.4014,-1.40844 -0.6165,-2.95548 -0.64576,-4.64225 -0.044,-2.5386 0.35547,-4.37575 1.20006,-5.51489 0.84671,-1.14196 1.94916,-1.30825 3.31041,-0.49392 1.50935,0.90299 2.93246,3.09378 4.26861,6.58212"
inkscape:connector-curvature="0" />
</g>
<g
transform="translate(1.2096774,-17.209677)"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Courier New;-inkscape-font-specification:Sans"
id="text6884">
<path
inkscape:connector-curvature="0"
d="m 140.43945,317.16536 c 0,0 0,50.22095 0,50.22095 0,0 5.54852,3.63087 5.54852,3.63087 0.35121,0.22983 0.60073,0.56653 0.7483,1.01023 0.14762,0.41494 0.22147,0.89737 0.22148,1.44707 -1e-5,0.52077 -0.0739,0.90601 -0.22148,1.15574 -0.14757,0.24955 -0.39709,0.25809 -0.7483,0.026 0,0 -12.35403,-8.16552 -12.35403,-8.16552 -0.3245,-0.21448 -0.55681,-0.53722 -0.69718,-0.9684 -0.1403,-0.43091 -0.21043,-0.89998 -0.21042,-1.40739 -1e-5,-0.53558 0.0701,-0.91246 0.21042,-1.13062 0.14037,-0.2465 0.37268,-0.26371 0.69718,-0.0514 0,0 5.41088,3.54079 5.41088,3.54079 0,0 0,-46.45699 0,-46.45699 0,0 -3.97848,-2.26531 -3.97848,-2.26531 -0.32622,-0.1857 -0.56519,-0.49145 -0.71716,-0.91726 -0.14103,-0.41932 -0.21152,-0.89742 -0.21151,-1.43445 -1e-5,-0.50868 0.0705,-0.89287 0.21151,-1.1526 0.14111,-0.25979 0.38007,-0.295 0.71716,-0.10537 0,0 5.37311,3.02366 5.37311,3.02366"
id="path12071" />
d="m 405.68539,517.2315 c 0,0 -0.0193,16.2617 -0.0193,16.2617 0,0 3.17768,-2.015 3.17768,-2.015 0.42104,-0.26699 0.71912,-0.28408 0.89461,-0.0515 0.17538,0.20367 0.26245,0.57777 0.26128,1.12234 -0.001,0.51582 -0.0901,1.00179 -0.26671,1.45807 -0.1768,0.45653 -0.47536,0.81943 -0.89606,1.08884 0,0 -7.2615,4.65021 -7.2615,4.65021 -0.4181,0.26775 -0.71809,0.2856 -0.89962,0.053 -0.18168,-0.23276 -0.27256,-0.61101 -0.27256,-1.13472 0,-0.55292 0.0909,-1.0473 0.27272,-1.48298 0.18171,-0.4645 0.48198,-0.82951 0.90042,-1.09484 0,0 2.35294,-1.49203 2.35294,-1.49203 0,0 0.0349,-43.95921 0.0349,-43.95921 0,0 -2.3762,1.32682 -2.3762,1.32682 -0.4226,0.23601 -0.72583,0.24206 -0.90932,0.0178 -0.18363,-0.25407 -0.2755,-0.66358 -0.2755,-1.22844 0,-0.56489 0.0919,-1.06185 0.27567,-1.49066 0.18367,-0.45823 0.48718,-0.80413 0.91014,-1.03765 0,0 7.3447,-4.05398 7.3447,-4.05398 0.42546,-0.23477 0.72666,-0.22523 0.90398,0.0279 0.17721,0.22388 0.26518,0.61389 0.26399,1.17006 -0.001,0.55615 -0.0911,1.05925 -0.26963,1.50941 -0.1786,0.42125 -0.48025,0.7505 -0.90536,0.98782 0,0 -3.20861,1.79162 -3.20861,1.79162 0,0 -0.027,22.7262 -0.027,22.7262 0,0 11.85347,-29.32986 11.85347,-29.32986 0,0 -1.84356,1.0294 -1.84356,1.0294 -0.4158,0.23222 -0.71071,0.23758 -0.8844,0.0157 -0.17376,-0.25093 -0.25981,-0.65252 -0.25806,-1.20465 0.002,-0.55216 0.0906,-1.03662 0.2666,-1.4532 0.17596,-0.44532 0.4722,-0.78288 0.88832,-1.01263 0,0 4.9265,-2.71923 4.9265,-2.71923 0.39516,-0.21804 0.67722,-0.2015 0.84652,0.049 0.16926,0.22176 0.25255,0.60547 0.24997,1.15114 -0.003,0.54567 -0.0901,1.03822 -0.26231,1.47778 -0.17228,0.41121 -0.45565,0.72699 -0.8505,0.94742 0,0 -0.67254,0.37553 -0.67254,0.37553 0,0 -9.34163,23.22298 -9.34163,23.22298 1.39299,0.391 2.54214,1.22247 3.45037,2.49219 0.90456,1.26471 1.76961,3.30318 2.59512,6.10986 0.47018,1.56163 1.32542,5.36141 2.55962,11.3683 0,0 2.05678,-1.30423 2.05678,-1.30423 0.40304,-0.25557 0.68792,-0.26799 0.85497,-0.0375 0.16702,0.20219 0.24918,0.57016 0.24656,1.10393 -0.003,0.5056 -0.0889,0.98066 -0.25892,1.42533 -0.17022,0.44492 -0.45652,0.79627 -0.85925,1.05417 0,0 -3.17718,2.03464 -3.17718,2.03464 -1.70416,-9.14138 -3.15817,-14.85521 -4.35315,-17.0766 -1.2016,-2.2625 -2.71697,-3.45967 -4.55059,-3.58265 0,0 -3.48846,8.71251 -3.48846,8.71251"
id="path6891" />
<path
inkscape:connector-curvature="0"
d="m 161.94121,365.01042 c 0,0 7.0063,21.03115 7.0063,21.03115 0.46705,0.30563 0.76243,0.55906 0.88562,0.76022 0.1232,0.17114 0.22797,0.45063 0.31431,0.83876 0.0987,0.39631 0.14801,0.7905 0.14803,1.18245 -2e-5,0.54268 -0.0803,0.94201 -0.24052,1.19797 -0.16024,0.25578 -0.43119,0.25745 -0.81253,0.005 0,0 -4.93644,-3.26279 -4.93644,-3.26279 -0.37439,-0.24745 -0.63978,-0.60162 -0.79646,-1.06272 -0.15663,-0.46083 -0.23491,-0.95918 -0.2349,-1.49528 -1e-5,-0.56586 0.0782,-0.9613 0.2349,-1.1863 0.15668,-0.25496 0.42207,-0.2601 0.79646,-0.0151 0,0 2.53075,1.65609 2.53075,1.65609 0,0 -5.91837,-17.79825 -5.91837,-17.79825 0,0 -5.76255,10.15443 -5.76255,10.15443 0,0 2.46795,1.61498 2.46795,1.61498 0.35431,0.23186 0.60853,0.57528 0.76236,1.03037 0.15389,0.42575 0.23088,0.91936 0.23089,1.48061 -1e-5,0.53172 -0.077,0.92408 -0.23089,1.17691 -0.15383,0.25271 -0.40805,0.26179 -0.76236,0.0276 0,0 -4.79262,-3.16772 -4.79262,-3.16772 -0.34791,-0.22996 -0.59698,-0.56977 -0.74747,-1.01963 -0.15042,-0.44957 -0.2256,-0.93694 -0.2256,-1.46232 0,-0.37944 0.0405,-0.7031 0.12145,-0.9711 0.0926,-0.26048 0.19095,-0.40043 0.29517,-0.41982 0.11584,-0.0411 0.39404,0.0826 0.83509,0.37127 0,0 6.7894,-11.94448 6.7894,-11.94448 0,0 -6.03916,-18.18905 -6.03916,-18.18905 -0.41899,-0.2513 -0.68634,-0.4701 -0.8025,-0.65681 -0.1045,-0.17967 -0.20317,-0.45801 -0.29599,-0.83523 -0.0812,-0.37005 -0.12179,-0.74507 -0.12179,-1.12508 0,-0.52607 0.0754,-0.91967 0.22622,-1.18084 0.15091,-0.26129 0.40649,-0.28516 0.76703,-0.0713 0,0 4.02618,2.38826 4.02618,2.38826 0.36619,0.21727 0.62043,0.54511 0.76245,0.98383 0.15392,0.44591 0.23091,0.94962 0.23092,1.51086 -10e-6,0.5318 -0.077,0.92889 -0.23092,1.19109 -0.14202,0.26926 -0.39626,0.29387 -0.76245,0.0742 0,0 -1.76525,-1.05886 -1.76525,-1.05886 0,0 5.02444,15.1596 5.02444,15.1596 0,0 5.15132,-9.05581 5.15132,-9.05581 0,0 -1.81808,-1.09055 -1.81808,-1.09055 -0.36224,-0.21727 -0.62759,-0.5552 -0.79631,-1.01393 -0.15659,-0.45115 -0.23486,-0.95956 -0.23484,-1.52543 -2e-5,-0.53601 0.0782,-0.93617 0.23484,-1.20056 0.15666,-0.2645 0.422,-0.2859 0.79631,-0.0639 0,0 4.18055,2.47983 4.18055,2.47983 0.368,0.21834 0.63204,0.55537 0.79183,1.01139 0.15983,0.45621 0.23979,0.97042 0.23981,1.54238 -2e-5,0.3613 -0.0492,0.67811 -0.14761,0.95034 -0.0861,0.27955 -0.19055,0.44264 -0.3134,0.48931 -0.11055,0.0541 -0.38669,-0.0515 -0.82796,-0.3162 0,0 -6.23361,10.87982 -6.23361,10.87982"
id="path12073" />
d="m 443.47158,496.16573 c 0,0 -15.92023,9.70195 -15.92023,9.70195 0.25261,4.3947 1.09424,7.53188 2.51855,9.41247 1.42789,1.83288 3.19316,2.07344 5.2907,0.7382 1.15976,-0.73828 2.37336,-1.93312 3.64044,-3.58163 1.2617,-1.64151 2.29067,-3.40363 3.08952,-5.2883 0.23317,-0.55259 0.43412,-0.88169 0.60291,-0.98752 0.19273,-0.12084 0.35959,-0.0498 0.50059,0.2133 0.14113,0.23564 0.20944,0.58439 0.20501,1.04631 -0.004,0.46186 -0.1049,0.97075 -0.30138,1.52697 -0.59063,1.72481 -1.63435,3.65941 -3.13604,5.80979 -1.49675,2.12595 -3.03903,3.70146 -4.62822,4.72308 -2.68176,1.72399 -4.92977,1.22514 -6.73564,-1.52638 -1.80812,-2.81062 -2.70176,-7.0448 -2.66946,-12.69552 0.0295,-5.15711 0.92218,-10.10229 2.67206,-14.81044 1.75462,-4.69402 3.89166,-7.75636 6.39992,-9.19327 2.55976,-1.46633 4.63179,-0.79081 6.22479,2.00024 1.58113,2.74246 2.3269,7.04454 2.24648,12.91075 m -1.50759,-2.55533 c -0.26805,-3.63428 -1.04266,-6.26807 -2.32893,-7.90085 -1.28159,-1.6495 -2.8345,-1.95112 -4.66221,-0.89235 -1.83997,1.06596 -3.44162,3.19609 -4.79954,6.39411 -1.36305,3.21016 -2.22473,6.90224 -2.58104,11.06526 0,0 14.37172,-8.66617 14.37172,-8.66617"
id="path6893" />
<path
inkscape:connector-curvature="0"
d="m 190.66329,367.61999 c 0,0 0,-1.31091 0,-1.31091 -2e-5,-0.96754 0.0793,-1.60701 0.23812,-1.91848 0.15885,-0.31161 0.35754,-0.39675 0.59615,-0.25526 0.25205,0.14956 0.45784,0.47505 0.61728,0.97627 0.15948,0.50164 0.23926,1.23771 0.23929,2.20799 0,0 0,8.92054 0,8.92054 -0.0133,0.96219 -0.0998,1.59756 -0.25923,1.90613 -0.14614,0.31665 -0.34529,0.39709 -0.59734,0.24155 -0.22536,-0.13902 -0.41744,-0.4293 -0.57629,-0.87076 -0.14557,-0.46428 -0.23155,-1.12587 -0.25798,-1.98485 -0.0793,-2.26435 -0.70007,-4.74694 -1.8588,-7.44034 -1.14118,-2.67507 -2.67549,-4.58556 -4.59684,-5.73359 -2.40997,-1.43988 -4.22691,-0.73221 -5.46164,2.10531 -1.22955,2.82567 -1.84239,6.53635 -1.84239,11.1409 0,4.97054 0.67609,9.5068 2.03299,13.62309 1.3632,4.13542 3.13715,6.92641 5.32927,8.36657 1.2711,0.83507 2.56726,1.1284 3.88879,0.87642 1.34056,-0.24449 2.55488,-1.26285 3.64142,-3.05912 0.27887,-0.4458 0.52476,-0.60042 0.73762,-0.46347 0.22628,0.14563 0.41277,0.45355 0.55941,0.92409 0.16,0.44793 0.24005,0.93848 0.24007,1.47145 -2e-5,1.3481 -0.67306,2.61811 -2.01459,3.80604 -2.1525,1.92107 -4.53114,2.00839 -7.13036,0.2837 -2.61508,-1.73522 -4.74914,-5.12664 -6.41235,-10.16426 -1.64124,-5.03145 -2.45842,-10.56254 -2.45841,-16.61439 -1e-5,-6.17346 0.83605,-10.78915 2.51538,-13.86032 1.70176,-3.08124 3.85575,-3.86089 6.47185,-2.31525 2.50885,1.48237 4.63121,4.52585 6.35858,9.14095"
id="path12075" />
d="m 455.58667,470.66722 c 0,0 -0.10498,8.56019 -0.10498,8.56019 1.93651,-5.08183 3.37081,-8.44336 4.30858,-10.1013 0.94661,-1.68612 1.80908,-2.7511 2.58784,-3.19777 0.84383,-0.48395 1.61379,-0.25336 2.31017,0.68823 0.70553,0.90558 1.05243,1.70098 1.04247,2.38832 -0.007,0.50226 -0.0857,0.96734 -0.23511,1.3954 -0.13804,0.39541 -0.31278,0.65513 -0.52432,0.77918 -0.11142,0.0654 -0.20559,0.0813 -0.28249,0.0476 -0.0766,-0.0601 -0.21729,-0.27954 -0.42229,-0.65871 -0.37824,-0.6994 -0.71083,-1.13744 -0.99754,-1.31325 -0.2871,-0.17598 -0.57132,-0.18255 -0.85261,-0.0195 -0.61996,0.35957 -1.37941,1.38224 -2.27917,3.07105 -0.89096,1.68702 -2.45801,5.46216 -4.70984,11.34948 0,0 -0.22596,18.42612 -0.22596,18.42612 0,0 6.33459,-4.01684 6.33459,-4.01684 0.34746,-0.22033 0.59161,-0.21895 0.7327,0.004 0.14133,0.1965 0.2085,0.54399 0.2016,1.04251 -0.007,0.47221 -0.0847,0.91205 -0.23427,1.31965 -0.14973,0.40781 -0.39805,0.72284 -0.74529,0.94521 0,0 -11.32013,7.24932 -11.32013,7.24932 -0.35123,0.22493 -0.6016,0.23885 -0.75084,0.0414 -0.14907,-0.22443 -0.22099,-0.57831 -0.21571,-1.0616 0.005,-0.45652 0.0796,-0.87735 0.22375,-1.26235 0.15613,-0.41912 0.41594,-0.74392 0.77913,-0.97432 0,0 3.54132,-2.24639 3.54132,-2.24639 0,0 0.33638,-28.17047 0.33638,-28.17047 0,0 -2.71509,1.57907 -2.71509,1.57907 -0.35236,0.20495 -0.60335,0.18908 -0.75268,-0.0481 -0.14946,-0.2372 -0.22135,-0.61416 -0.2156,-1.13086 0.005,-0.48951 0.0807,-0.93834 0.22572,-1.34628 0.15673,-0.41449 0.41745,-0.72656 0.78182,-0.93616 0,0 4.17785,-2.40283 4.17785,-2.40283"
id="path6895" />
<path
inkscape:connector-curvature="0"
d="m 205.10727,399.25125 c 0,0 5.73306,3.65382 5.73306,3.65382 0,0 -6.23199,22.47411 -6.23199,22.47411 -0.37367,1.34168 -0.82284,1.83225 -1.34718,1.47339 -0.34449,-0.2358 -0.64043,-0.72486 -0.88797,-1.46697 -0.23361,-0.70036 -0.35034,-1.44789 -0.35034,-2.243 0,-0.31805 0.0206,-0.65395 0.0618,-1.00763 0,0 3.02262,-22.88372 3.02262,-22.88372"
id="path12077" />
d="m 473.30415,460.47729 c 0,0 -0.0804,4.97133 -0.0804,4.97133 0.98569,-2.87136 1.86574,-4.96674 2.64065,-6.28932 0.77288,-1.31909 1.63191,-2.24853 2.57593,-2.78936 1.01432,-0.58102 1.92593,-0.57975 2.7356,4.3e-4 0.57165,0.43409 1.07517,1.41355 1.51085,2.93619 0.44533,1.487 0.6504,3.16172 0.61612,5.02597 0,0 -0.37098,20.16552 -0.37098,20.16552 0,0 1.09632,-0.69519 1.09632,-0.69519 0.30795,-0.19527 0.52558,-0.18379 0.65312,0.0343 0.1279,0.19274 0.18732,0.5284 0.17832,1.00704 -0.009,0.4534 -0.0822,0.87365 -0.22092,1.26091 -0.13883,0.38745 -0.362,0.67967 -0.66977,0.87676 0,0 -3.48879,2.2342 -3.48879,2.2342 -0.32291,0.20678 -0.54961,0.20133 -0.67985,-0.0168 -0.13035,-0.21825 -0.19152,-0.55628 -0.18341,-1.01409 0.009,-0.48331 0.0832,-0.90811 0.22395,-1.27426 0.14113,-0.39138 0.37338,-0.68956 0.69648,-0.89444 0,0 1.09126,-0.69198 1.09126,-0.69198 0,0 0.35635,-19.67714 0.35635,-19.67714 0.0412,-2.27809 -0.26274,-4.00074 -0.9136,-5.16921 -0.65266,-1.19813 -1.55322,-1.46656 -2.70395,-0.79997 -0.87978,0.50971 -1.6529,1.39411 -2.31814,2.65394 -0.66627,1.2367 -1.63439,3.93929 -2.90635,8.11592 0,0 -0.33083,20.46711 -0.33083,20.46711 0,0 1.52554,-0.96736 1.52554,-0.96736 0.32,-0.20291 0.54652,-0.19417 0.67982,0.026 0.13361,0.19441 0.19632,0.5352 0.1882,1.02244 -0.008,0.46152 -0.0833,0.89021 -0.22665,1.28621 -0.14347,0.39619 -0.37497,0.69664 -0.69477,0.90144 0,0 -4.42215,2.83191 -4.42215,2.83191 -0.3258,0.20863 -0.55714,0.20298 -0.6938,-0.0174 -0.13675,-0.22051 -0.20159,-0.56416 -0.19444,-1.03091 0.008,-0.49277 0.0843,-0.92686 0.23029,-1.30217 0.1463,-0.40101 0.38259,-0.70494 0.70859,-0.91166 0,0 1.54286,-0.97835 1.54286,-0.97835 0,0 0.43113,-27.17649 0.43113,-27.17649 0,0 -1.15824,0.67362 -1.15824,0.67362 -0.32722,0.19033 -0.55954,0.16948 -0.69672,-0.0629 -0.13729,-0.23247 -0.20212,-0.59828 -0.19443,-1.09741 0.007,-0.47286 0.0845,-0.90805 0.23156,-1.30535 0.14701,-0.39707 0.38436,-0.6898 0.71179,-0.87815 0,0 2.52342,-1.45131 2.52342,-1.45131"
id="path6897" />
<path
inkscape:connector-curvature="0"
d="m 271.11411,457.35945 c 0,0 0,-6.42681 0,-6.42681 -3.10047,3.40822 -6.38155,3.94515 -9.83759,1.65192 -2.48679,-1.65009 -4.41727,-4.24834 -5.80096,-7.79282 -1.37793,-3.56428 -2.06474,-7.25483 -2.06474,-11.08277 0,-4.20723 0.90527,-7.30878 2.72332,-9.31282 1.82803,-2.01507 4.51481,-1.9316 8.08109,0.27619 0.96857,0.59969 2.02383,1.3936 3.16658,2.38297 1.1466,0.95764 2.39035,2.13516 3.7323,3.53459 0,0 0,-7.22352 0,-7.22352 -3e-5,-2.44323 -0.54423,-4.89656 -1.63001,-7.35412 -1.08235,-2.44961 -2.69936,-4.31509 -4.84337,-5.59616 -1.63234,-0.97525 -3.90928,-1.34198 -6.81764,-1.10525 -0.52311,0.032 -0.8578,0.004 -1.00462,-0.0848 -0.26088,-0.15719 -0.48896,-0.50248 -0.68433,-1.03576 -0.17902,-0.52313 -0.26847,-1.09611 -0.26847,-1.7192 0,-0.58839 0.0813,-1.00706 0.24405,-1.25606 0.22793,-0.3834 1.14942,-0.54477 2.77027,-0.48366 2.57013,0.061 4.52742,0.48442 5.86093,1.27225 2.66612,1.57529 4.76009,4.20783 6.27107,7.90057 1.51771,3.67383 2.27912,7.27529 2.27913,10.79204 0,0 0,29.62623 0,29.62623 0,0 2.88997,1.89115 2.88997,1.89115 0.53593,0.3507 0.91679,0.8142 1.14207,1.39054 0.22537,0.54089 0.33812,1.15113 0.33816,1.83041 -4e-5,0.64351 -0.11284,1.10539 -0.33816,1.38561 -0.22528,0.27997 -0.60614,0.24255 -1.14207,-0.11167 0,0 -5.06698,-3.34907 -5.06698,-3.34907 m 0,-22.20172 c -1.00273,-1.23099 -2.06169,-2.33664 -3.17634,-3.31716 -1.11102,-0.97729 -2.27699,-1.84752 -3.49734,-2.61108 -3.03992,-1.90193 -5.39629,-2.00244 -7.08327,-0.32077 -1.27186,1.23928 -1.90596,3.27543 -1.90596,6.11197 0,2.62903 0.47952,5.1547 1.44068,7.58233 0.98029,2.44541 2.40686,4.2853 4.28547,5.51948 1.80611,1.18656 3.48841,1.53771 5.04496,1.04694 1.58058,-0.51735 3.21096,-1.91034 4.8918,-4.18559 0,0 0,-9.82612 0,-9.82612"
id="path12079" />
d="m 502.73274,460.0514 c 0,0 -12.58078,7.66685 -12.58078,7.66685 0.13943,3.95275 0.75486,6.81973 1.84191,8.60127 1.09127,1.74028 2.46782,2.07625 4.12588,1.02077 0.91736,-0.58398 1.88324,-1.57454 2.89733,-2.9694 1.01026,-1.38958 1.83995,-2.9037 2.49094,-4.54374 0.19007,-0.48101 0.352,-0.76339 0.48584,-0.84731 0.15283,-0.0958 0.2829,-0.0209 0.39022,0.22483 0.10778,0.2211 0.15695,0.53905 0.14755,0.95388 -0.009,0.41479 -0.0948,0.86546 -0.25619,1.35225 -0.48577,1.51058 -1.32969,3.17888 -2.53523,5.00941 -1.20067,1.80791 -2.42926,3.11745 -3.68662,3.92576 -2.11999,1.36285 -3.86995,0.76072 -5.24366,-1.82965 -1.37343,-2.64104 -2.01438,-6.49315 -1.91501,-11.55003 0.0906,-4.61389 0.85108,-8.9821 2.27681,-13.08506 1.42996,-4.0921 3.13808,-6.70212 5.11668,-7.83561 2.02129,-1.15786 3.63504,-0.42605 4.84758,2.17494 1.20485,2.55883 1.735,6.46775 1.59675,11.73084 m -1.15024,-2.39108 c -0.1636,-3.27931 -0.73716,-5.69144 -1.72424,-7.23625 -0.98254,-1.55853 -2.19418,-1.92464 -3.63745,-1.08857 -1.45189,0.84113 -2.73048,2.64931 -3.83206,5.42777 -1.10528,2.78784 -1.82554,6.03803 -2.15785,9.74209 0,0 11.3516,-6.84504 11.3516,-6.84504"
id="path6899" />
<path
inkscape:connector-curvature="0"
d="m 305.27676,479.93957 c 0,0 0,-6.86189 0,-6.86189 -3.21505,3.68169 -6.65929,4.28417 -10.32564,1.85139 -2.236,-1.48368 -3.92619,-3.82619 -5.07842,-7.02675 -1.48866,-4.17529 -2.23061,-8.37816 -2.2306,-12.62199 0,0 0,-29.48895 0,-29.48895 0,0 -3.01401,-1.80791 -3.01401,-1.80791 -0.53074,-0.31833 -0.9106,-0.76254 -1.14007,-1.33286 -0.22933,-0.56981 -0.34393,-1.19694 -0.34393,-1.88171 0,-0.64863 0.11456,-1.12104 0.34393,-1.41732 0.22947,-0.29643 0.60933,-0.2875 1.14007,0.0273 0,0 5.27157,3.127 5.27157,3.127 0,0 0,34.2244 0,34.2244 0,2.98398 0.46767,5.74427 1.40491,8.28605 0.93973,2.54862 2.11799,4.29026 3.53714,5.2226 3.75734,2.46845 7.2386,1.27516 10.43505,-3.63264 0,0 0,-30.23698 0,-30.23698 0,0 -4.33901,-2.6027 -4.33901,-2.6027 -0.55605,-0.33351 -0.954,-0.79367 -1.19439,-1.38071 -0.24026,-0.58652 -0.36032,-1.23005 -0.36029,-1.93091 -3e-5,-0.66389 0.12001,-1.14576 0.36029,-1.44571 0.24039,-0.30014 0.63834,-0.28557 1.19439,0.0442 0,0 6.71277,3.9819 6.71277,3.9819 0,0 0,43.77138 0,43.77138 0,0 2.01873,1.32102 2.01873,1.32102 0.5707,0.37346 0.98027,0.86624 1.22818,1.47843 0.24802,0.57501 0.3721,1.21898 0.37212,1.93157 -2e-5,0.67508 -0.12418,1.15577 -0.37212,1.4421 -0.24791,0.28605 -0.65748,0.24015 -1.22818,-0.13705 0,0 -4.39249,-2.90326 -4.39249,-2.90326"
id="path12081" />
<path
inkscape:connector-curvature="0"
d="m 331.10608,451.86264 c 0,0 0,40.29309 0,40.29309 0,0 11.33093,7.41479 11.33093,7.41479 0.62404,0.40837 1.07195,0.93651 1.34306,1.58448 0.27124,0.60912 0.40696,1.28649 0.40699,2.03171 -3e-5,0.70599 -0.13581,1.20478 -0.40699,1.49638 -0.27111,0.2913 -0.71902,0.23036 -1.34306,-0.18211 0,0 -19.93946,-13.17917 -19.93946,-13.17917 -0.59038,-0.39022 -1.0129,-0.89763 -1.26813,-1.5226 -0.25505,-0.62448 -0.38252,-1.27858 -0.38251,-1.96267 -10e-6,-0.72207 0.12741,-1.20858 0.38251,-1.45953 0.25523,-0.28919 0.67775,-0.24091 1.26813,0.14542 0,0 6.04677,3.95692 6.04677,3.95692 0,0 0,-40.15334 0,-40.15334 0,0 -5.42587,-3.25463 -5.42587,-3.25463 -0.59138,-0.35471 -1.01459,-0.83694 -1.27026,-1.44699 -0.2555,-0.60948 -0.38317,-1.27541 -0.38317,-1.99818 0,-0.68461 0.12762,-1.17925 0.38317,-1.48397 0.25567,-0.30491 0.67888,-0.28227 1.27026,0.0685 0,0 5.42587,3.21853 5.42587,3.21853 0,0 0,-7.31632 0,-7.31632 -2e-5,-4.07098 0.86197,-7.11046 2.592,-9.12558 1.73815,-2.02447 4.05487,-2.22739 6.961,-0.59209 2.45295,1.38047 5.08868,3.29457 7.91092,5.74926 1.07167,0.91997 1.71405,1.65721 1.92494,2.20997 0.23203,0.56511 0.34813,1.20269 0.34816,1.91248 -3e-5,0.70989 -0.1266,1.22928 -0.37979,1.55791 -0.25304,0.28912 -0.59009,0.31325 -1.01094,0.0727 -0.16827,-0.0961 -0.45198,-0.31718 -0.85089,-0.66317 -3.15558,-2.70293 -5.79955,-4.65865 -7.9424,-5.87884 -2.2532,-1.28289 -3.985,-1.22414 -5.20258,0.16697 -1.19342,1.39829 -1.78867,3.42534 -1.78866,6.08452 0,0 0,7.34179 0,7.34179 0,0 12.07996,7.16563 12.07996,7.16563 0.62529,0.37097 1.07408,0.87241 1.34574,1.50461 0.27179,0.63256 0.40778,1.32201 0.40781,2.06791 -3e-5,0.70676 -0.13609,1.21428 -0.40781,1.52253 -0.27166,0.30808 -0.72045,0.27422 -1.34574,-0.10088 0,0 -12.07996,-7.246 -12.07996,-7.246"
id="path12083" />
<path
inkscape:connector-curvature="0"
d="m 381.53904,480.26145 c -4e-5,-1.19393 0.13803,-1.97639 0.41437,-2.34753 0.27648,-0.37137 0.62238,-0.43403 1.03788,-0.18762 0.439,0.26047 0.79752,0.74165 1.07534,1.44329 0.27794,0.70231 0.41702,1.69419 0.41703,2.97521 0,0 0,8.92609 0,8.92609 -10e-6,1.23978 -0.13902,2.04325 -0.41703,2.41011 -0.27782,0.36667 -0.63634,0.41516 -1.07534,0.14588 -0.39243,-0.24064 -0.72682,-0.67235 -1.00333,-1.29503 -0.25333,-0.60811 -0.40294,-1.44075 -0.44892,-2.49818 -0.13799,-2.55388 -0.85046,-5.02174 -2.13409,-7.39831 -1.87213,-3.42059 -4.3356,-6.03941 -7.37923,-7.858 -3.15377,-1.88428 -5.58541,-2.18625 -7.30824,-0.92152 -1.29812,0.94833 -1.94553,2.48638 -1.94553,4.61649 0,2.41154 0.76823,4.89373 2.30933,7.4543 1.0603,1.78482 3.07849,3.90375 6.06957,6.36723 3.94113,3.22198 6.70097,5.81863 8.2541,7.77127 2.22609,2.8303 3.88664,5.87077 4.97442,9.11605 1.11394,3.26899 1.6721,6.39758 1.67214,9.37882 -4e-5,4.43046 -1.1968,7.60368 -3.5795,9.51102 -2.36847,1.85478 -5.81509,1.27327 -10.31153,-1.7103 -4.44518,-2.94957 -8.0486,-7.3738 -10.83305,-13.26579 -10e-6,1.36395 -0.0436,2.2178 -0.13101,2.56131 -0.0874,0.34347 -0.25106,0.57633 -0.49105,0.6985 -0.21804,0.13637 -0.46864,0.11113 -0.75172,-0.076 -0.39163,-0.25884 -0.71767,-0.73428 -0.97829,-1.42646 -0.26047,-0.69164 -0.39063,-1.63687 -0.39063,-2.83609 0,0 0,-10.37303 0,-10.37303 0,-1.19919 0.11929,-1.98223 0.35807,-2.34925 0.2606,-0.35334 0.59748,-0.39824 1.01085,-0.13424 0.39201,0.25036 0.71901,0.71962 0.9808,1.40824 0.28381,0.6629 0.42578,1.41575 0.4258,2.25821 -2e-5,1.84546 0.25131,3.55252 0.75448,5.12277 0.76692,2.42665 1.98618,4.83059 3.66211,7.21589 1.70538,2.36981 3.79751,4.37105 6.28262,6.00369 3.70087,2.43135 6.47684,3.00416 8.3079,1.69647 1.83952,-1.31379 2.76254,-3.37564 2.76258,-6.18089 -4e-5,-3.21781 -0.93458,-6.38939 -2.797,-9.50367 -1.87655,-3.11405 -4.59528,-6.11381 -8.13869,-8.9908 -3.48927,-2.83712 -5.9752,-5.24246 -7.47672,-7.22927 -1.49576,-1.97906 -2.65753,-4.26856 -3.48835,-6.87006 -0.82903,-2.59583 -1.24288,-5.09307 -1.24286,-7.49587 -2e-5,-4.32499 1.1555,-7.05664 3.47704,-8.20014 2.33556,-1.19067 5.14142,-0.82407 8.42768,1.11751 3.92599,2.31968 7.14794,5.96756 9.64805,10.94971"
id="path12085" />
d="m 514.91047,422.62215 c 0,0 -1.06434,42.27288 -1.06434,42.27288 0,0 4.45362,-2.8241 4.45362,-2.8241 0.2761,-0.17507 0.46813,-0.15759 0.57629,0.0523 0.10868,0.18619 0.15712,0.50328 0.14534,0.95133 -0.0112,0.42443 -0.0782,0.81493 -0.20113,1.17164 -0.12299,0.35687 -0.32235,0.62363 -0.59831,0.80035 0,0 -10.15763,6.50487 -10.15763,6.50487 -0.27917,0.17878 -0.476,0.16246 -0.5903,-0.0494 -0.11437,-0.21191 -0.16642,-0.53506 -0.15609,-0.96944 0.0109,-0.45857 0.0801,-0.85922 0.20776,-1.20182 0.12814,-0.36656 0.33197,-0.63844 0.61129,-0.81556 0,0 4.56188,-2.89274 4.56188,-2.89274 0,0 0.97884,-39.26779 0.97884,-39.26779 0,0 -3.35907,1.85407 -3.35907,1.85407 -0.27977,0.15447 -0.48159,0.1208 -0.60529,-0.10124 -0.11445,-0.22726 -0.16609,-0.57399 -0.15489,-1.04015 0.0106,-0.44163 0.0802,-0.843 0.20889,-1.204 0.12859,-0.36073 0.33761,-0.62003 0.62686,-0.77784 0,0 4.51628,-2.46343 4.51628,-2.46343"
id="path6901" />
</g>
</g>
<g
@ -599,7 +644,7 @@
<g
inkscape:corner7="0.22235256 : 0.05733945 : 0.532878 : 1"
inkscape:corner0="0.4922944 : 0.12449455 : 0 : 1"
inkscape:perspectiveID="#perspective3054"
inkscape:perspectiveID="#perspective5786"
id="g3195"
style="fill:#f0f0f0;fill-opacity:0.51111115;stroke:#253237;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;display:inline"
sodipodi:type="inkscape:box3d">
@ -684,31 +729,6 @@
id="path4004"
sodipodi:type="inkscape:box3dside" />
</g>
<g
id="text4031"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Sans"
transform="matrix(0.5589128,0,0,0.5589128,174.77385,97.01703)">
<path
id="path4038"
d="m 282.79778,223.1883 c 0,0 -0.6821,34.01888 -0.6821,34.01888 0,0 18.98585,-5.00566 18.98585,-5.00566 1.2893,-0.33993 2.20833,-0.45044 2.75935,-0.33226 0.55064,0.096 0.82138,0.35348 0.81277,0.77255 -0.008,0.39705 -0.29289,0.80178 -0.85387,1.21447 -0.56196,0.41327 -1.48645,0.79167 -2.77573,1.13557 0,0 -44.72801,11.93065 -44.72801,11.93065 -1.42497,0.3801 -2.44616,0.51347 -3.06094,0.39901 -0.61559,-0.11457 -0.91968,-0.38193 -0.91159,-0.80201 0.008,-0.44338 0.3259,-0.87559 0.95192,-1.29625 0.62554,-0.44339 1.65213,-0.85314 3.07713,-1.22885 0,0 20.05366,-5.28718 20.05366,-5.28718 0,0 0.68066,-34.22837 0.68066,-34.22837 0,0 -20.05925,4.54892 -20.05925,4.54892 -1.42544,0.32329 -2.44718,0.42713 -3.0626,0.31069 -0.6158,-0.1399 -0.91975,-0.43212 -0.91119,-0.87654 0.008,-0.44433 0.32603,-0.86491 0.95227,-1.26139 0.62576,-0.41923 1.6527,-0.78845 3.07817,-1.10733 0,0 44.74122,-10.00757 44.74122,-10.00757 1.28958,-0.28842 2.20881,-0.36188 2.75993,-0.22091 0.55075,0.1187 0.82154,0.38796 0.81291,0.80788 -0.009,0.42002 -0.29367,0.82541 -0.85477,1.21646 -0.56164,0.36954 -1.48611,0.70037 -2.77567,0.99277 0,0 -18.99012,4.30647 -18.99012,4.30647"
inkscape:connector-curvature="0" />
<path
id="path4040"
d="m 333.70439,218.67102 c 0,0 -0.0587,2.72754 -0.0587,2.72754 4.31507,-3.46248 8.58164,-5.67789 12.79965,-6.66399 2.51867,-0.58878 4.7071,-0.73536 6.57013,-0.44328 1.85514,0.26995 3.39018,0.98553 4.60856,2.14501 2.14625,-1.9575 4.2924,-3.53718 6.43822,-4.74174 2.17248,-1.22772 4.32584,-2.08967 6.46016,-2.58865 3.32651,-0.77764 5.94413,-0.79259 7.86586,-0.0522 2.51331,0.93636 3.74321,2.31125 3.70162,4.12895 0,0 -0.40751,17.77352 -0.40751,17.77352 0,0 3.78154,-0.99701 3.78154,-0.99701 1.0589,-0.27918 1.81331,-0.35863 2.265,-0.23889 0.45151,0.0996 0.67268,0.33943 0.66395,0.71958 -0.008,0.36017 -0.24358,0.72101 -0.70559,1.08272 -0.46279,0.36219 -1.22275,0.68437 -2.28164,0.96681 0,0 -8.30108,2.21421 -8.30108,2.21421 0,0 0.46012,-20.18321 0.46012,-20.18321 0.0296,-1.29965 -0.64981,-2.20744 -2.04182,-2.72464 -1.39694,-0.51893 -3.02752,-0.55871 -4.89435,-0.11645 -1.69116,0.40066 -3.48972,1.18482 -5.39699,2.35517 -1.91549,1.15505 -4.1177,3.07215 -6.61075,5.75887 0,0 -0.38593,17.34484 -0.38593,17.34484 0,0 3.94466,-1.04002 3.94466,-1.04002 1.12023,-0.29535 1.91848,-0.38295 2.39656,-0.26337 0.47792,0.0988 0.71231,0.34368 0.70356,0.73459 -0.008,0.37035 -0.25674,0.74319 -0.74514,1.11873 -0.48916,0.37602 -1.29295,0.71329 -2.41317,1.01209 0,0 -8.78473,2.34322 -8.78473,2.34322 0,0 0.45491,-20.57441 0.45491,-20.57441 0.0309,-1.39962 -0.70802,-2.36557 -2.22095,-2.89919 -1.47959,-0.56565 -3.16794,-0.62501 -5.06745,-0.17502 -1.752,0.41508 -3.49828,1.13407 -5.2386,2.15872 -2.4247,1.44429 -4.99579,3.55425 -7.71548,6.33646 0,0 -0.38442,17.85802 -0.38442,17.85802 0,0 4.24187,-1.11838 4.24187,-1.11838 1.1874,-0.31306 2.03362,-0.40968 2.54064,-0.2905 0.50681,0.0978 0.75565,0.3479 0.7469,0.75024 -0.008,0.38118 -0.27082,0.76681 -0.78834,1.15733 -0.51807,0.39097 -1.3698,0.74465 -2.55719,1.06137 0,0 -13.64864,3.64061 -13.64864,3.64061 -1.22865,0.32772 -2.10857,0.43336 -2.63763,0.31598 -0.52971,-0.11749 -0.7907,-0.37136 -0.78245,-0.76153 0.009,-0.41183 0.28334,-0.80778 0.82373,-1.18753 0.54007,-0.40091 1.42551,-0.76349 2.65418,-1.08743 0,0 4.33418,-1.14272 4.33418,-1.14272 0,0 0.4806,-22.47941 0.4806,-22.47941 0,0 -4.33464,1.0317 -4.33464,1.0317 -1.2288,0.29249 -2.10883,0.37258 -2.63794,0.23946 -0.52978,-0.1332 -0.79056,-0.4061 -0.78184,-0.81857 0.008,-0.39072 0.28294,-0.77944 0.82386,-1.16588 0.54015,-0.38591 1.4257,-0.72332 2.65452,-1.01198 0,0 9.40801,-2.20977 9.40801,-2.20977"
inkscape:connector-curvature="0" />
<path
id="path4042"
d="m 431.66157,220.15121 c 0,0 0.0838,-3.4392 0.0838,-3.4392 -5.86908,4.46079 -12.19603,7.61638 -19.00283,9.44026 -5.01634,1.34413 -8.9635,1.66058 -11.80893,0.93249 -2.86592,-0.75319 -4.28108,-2.23143 -4.2297,-4.43076 0.0565,-2.41757 2.02666,-5.0136 5.88321,-7.76824 3.82039,-2.72881 9.29321,-4.96718 16.3493,-6.71054 1.8819,-0.46494 3.91395,-0.89069 6.09374,-1.27732 2.16795,-0.40343 4.49584,-0.76226 6.98064,-1.07648 0,0 0.0943,-3.86881 0.0943,-3.86881 0.0318,-1.30873 -0.94792,-2.20502 -2.94729,-2.69073 -2.0101,-0.48823 -5.06896,-0.24773 -9.20127,0.73123 -3.1937,0.75663 -7.73215,2.3834 -13.66129,4.9035 -1.08129,0.45367 -1.77483,0.7173 -2.07866,0.79 -0.54077,0.12948 -1.01175,0.12481 -1.41272,-0.0143 -0.36747,-0.14728 -0.54717,-0.39832 -0.53881,-0.75307 0.008,-0.33499 0.1838,-0.64127 0.52757,-0.91864 0.48125,-0.40757 2.39918,-1.26142 5.73331,-2.55378 5.19823,-2.03472 9.08047,-3.34807 11.68433,-3.95682 5.12395,-1.19783 9.05529,-1.36876 11.82888,-0.5292 2.75357,0.81456 4.09994,2.15371 4.05425,4.02181 0,0 -0.38517,15.72953 -0.38517,15.72953 0,0 5.19262,-1.36904 5.19262,-1.36904 0.95041,-0.25058 1.62073,-0.31597 2.01241,-0.19663 0.39163,0.10055 0.58294,0.32805 0.57423,0.68255 -0.008,0.33588 -0.21359,0.66851 -0.61574,0.99809 -0.40275,0.32996 -1.0786,0.62159 -2.02902,0.8751 0,0 -9.18117,2.44897 -9.18117,2.44897 m 0.28963,-11.88378 c -1.85188,0.1444 -3.826,0.40309 -5.9241,0.77705 -2.10961,0.37603 -4.34564,0.85922 -6.71011,1.45071 -5.99108,1.49874 -10.75526,3.45758 -14.2458,5.87477 -2.66308,1.8282 -4.02015,3.55498 -4.05808,5.1712 -0.0352,1.49786 0.93743,2.49682 2.9103,2.99513 1.99648,0.48693 4.89613,0.22483 8.67932,-0.77721 3.58353,-0.94915 6.88503,-2.2348 9.91145,-3.85407 3.03569,-1.63439 6.13916,-3.76218 9.30881,-6.377 0,0 0.12821,-5.26058 0.12821,-5.26058"
inkscape:connector-curvature="0" />
<path
id="path4044"
d="m 487.68217,186.54679 c 0,0 0.10564,-4.06721 0.10564,-4.06721 0,0 7.90801,-1.85745 7.90801,-1.85745 0.79301,-0.18623 1.35751,-0.21524 1.69464,-0.0873 0.3367,0.12786 0.50061,0.35664 0.49198,0.68643 -0.008,0.31249 -0.18616,0.61347 -0.5337,0.90306 -0.34808,0.28997 -0.91806,0.52925 -1.71109,0.71799 0,0 -4.51455,1.07452 -4.51455,1.07452 0,0 -0.57459,22.03902 -0.57459,22.03902 -0.0384,1.47001 -0.55548,2.91413 -1.55336,4.33529 -0.6668,0.94954 -1.76798,2.04674 -3.30751,3.29427 -1.54611,1.25278 -2.95556,2.23384 -4.2268,2.94103 -1.27575,0.70968 -2.98068,1.36473 -5.1209,1.96595 0,0 -10.09114,2.83466 -10.09114,2.83466 -0.86083,0.2418 -1.47625,0.30679 -1.84501,0.1943 -0.36961,-0.0944 -0.5502,-0.31403 -0.54146,-0.65872 0.009,-0.3447 0.20323,-0.67811 0.58346,-1.00002 0.37979,-0.32158 1.0007,-0.60203 1.86152,-0.84114 0,0 10.21573,-2.81129 10.21573,-2.81129 2.05634,-0.57131 3.90303,-1.41898 5.54333,-2.54169 1.66023,-1.12521 3.03533,-2.47541 4.12856,-4.05097 0.61561,-0.90119 0.93791,-1.9227 0.96764,-3.06566 0,0 0.17268,-6.6482 0.17268,-6.6482 -3.75728,4.22258 -8.58953,7.13169 -14.54094,8.71456 -4.90653,1.30498 -9.17076,1.28431 -12.76987,-0.0855 -3.60562,-1.4096 -5.38035,-3.78477 -5.29699,-7.11539 0.0834,-3.33124 2.00056,-6.62133 5.72421,-9.84613 3.71648,-3.20034 8.039,-5.36811 12.94485,-6.51501 5.95052,-1.39107 10.69758,-0.88232 14.28567,1.49047 m -0.1735,6.67977 c 0.0676,-2.60468 -1.25813,-4.46865 -3.99335,-5.59822 -2.72937,-1.14506 -6.06018,-1.2571 -10.00838,-0.32175 -3.99164,0.94566 -7.47585,2.69973 -10.43699,5.26937 -2.98394,2.57159 -4.51858,5.21107 -4.58622,7.90293 -0.0681,2.70979 1.35151,4.62821 4.24133,5.74881 2.86713,1.09352 6.30461,1.10802 10.2967,0.0587 3.94868,-1.03788 7.32661,-2.82534 10.14966,-5.35628 2.82923,-2.53633 4.26956,-5.09924 4.33725,-7.70358"
inkscape:connector-curvature="0" />
<path
id="path4046"
d="m 540.11557,181.1992 c 0,0 -31.2176,7.85302 -31.2176,7.85302 0.48573,2.63928 2.15047,4.43554 4.97687,5.38625 2.82796,0.91931 6.31992,0.8233 10.45571,-0.27212 2.27866,-0.60354 4.65697,-1.48834 7.13282,-2.65107 2.45777,-1.15424 4.45604,-2.3471 6.00292,-3.58061 0.45083,-0.36101 0.83942,-0.58385 1.16596,-0.6688 0.37271,-0.097 0.69561,-0.0757 0.96883,0.0637 0.27337,0.12295 0.40619,0.32289 0.39861,0.5999 -0.008,0.27704 -0.20081,0.59468 -0.57975,0.95322 -1.14042,1.11074 -3.16231,2.40927 -6.08171,3.90253 -2.92062,1.48339 -5.94124,2.64545 -9.0645,3.48232 -5.2951,1.41883 -9.75204,1.42909 -13.33713,0.003 -3.59795,-1.46568 -5.36582,-3.92779 -5.27448,-7.37497 0.0832,-3.13906 1.88506,-6.25108 5.37983,-9.31298 3.48579,-3.03794 7.7012,-5.12678 12.61811,-6.27626 4.99076,-1.1667 9.012,-0.99979 12.09648,0.47721 3.05557,1.44667 4.50134,3.91533 4.35903,7.41612 m -2.91605,-1.34024 c -0.52374,-2.13318 -2.02526,-3.60994 -4.51812,-4.43193 -2.48827,-0.834 -5.50996,-0.83398 -9.07894,0.0115 -3.60706,0.85456 -6.76149,2.32359 -9.44972,4.41217 -2.70894,2.10468 -4.4334,4.44604 -5.1587,7.01535 0,0 28.20548,-7.00711 28.20548,-7.00711"
inkscape:connector-curvature="0" />
</g>
<g
transform="matrix(0.80256968,0,0,0.80256968,38.124381,46.818937)"
style="font-size:40px;font-style:italic;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Futura;-inkscape-font-specification:Futura Medium Italic"
@ -749,7 +769,7 @@
<g
id="text4949"
style="font-size:40px;font-style:italic;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Futura;-inkscape-font-specification:Futura Medium Italic"
transform="matrix(0.83804272,0,0,0.83804272,31.314311,25.788578)">
transform="matrix(0.74694175,0,0,0.74694175,45.485062,44.593966)">
<path
id="path4956"
d="m 142.69979,137.10297 c 0,0 -1.02955,33.67577 -1.02955,33.67577 0,0 -1.95085,-0.57539 -1.95085,-0.57539 0,0 0.11438,-3.62641 0.11438,-3.62641 -0.83178,2.72212 -1.69018,3.94864 -2.57494,3.68641 -1.08457,-0.32145 -1.96585,-2.08912 -2.6458,-5.29794 -0.67825,-3.20078 -1.01674,-7.18681 -1.01674,-11.96409 0,-5.51039 0.38729,-9.93148 1.16353,-13.27043 0.79003,-3.34576 1.80543,-4.8788 3.04874,-4.59076 0.58877,0.13642 1.0911,0.64686 1.50651,1.53207 0.42191,0.88799 0.85328,2.3539 1.29417,4.39917 0,0 0.13239,-4.42502 0.13239,-4.42502 0,0 1.95816,0.45662 1.95816,0.45662 m -2.38162,15.3911 c 0,-2.99293 -0.21149,-5.4766 -0.63396,-7.44868 -0.42183,-1.99292 -0.96573,-3.06948 -1.63097,-3.23169 -0.72176,-0.17595 -1.32564,0.83047 -1.81241,3.01599 -0.4859,2.20539 -0.72852,4.99168 -0.72852,8.36184 0,2.94297 0.20217,5.40768 0.60697,7.39634 0.40539,1.99165 0.92751,3.07935 1.56702,3.26122 0.71103,0.20221 1.32739,-0.80489 1.84844,-3.02486 0.52203,-2.27207 0.78343,-5.04988 0.78343,-8.33016"
@ -788,29 +808,54 @@
inkscape:connector-curvature="0" />
</g>
<g
transform="matrix(0.53155689,0,0,0.53155689,185.92425,73.057684)"
transform="matrix(0.87020295,0,0,0.87020295,36.583926,33.755817)"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Sans"
id="text5440">
id="text5788">
<path
inkscape:connector-curvature="0"
d="m 282.85502,131.91713 c 0,0 0,60.1855 0,60.1855 0,0 18.99047,-3.66344 18.99047,-3.66344 1.28959,-0.24877 2.21156,-0.19199 2.76814,0.16971 0.55582,0.32211 0.83347,0.85406 0.83354,1.59612 -7e-5,0.70307 -0.27789,1.34368 -0.83354,1.92233 -0.55658,0.57941 -1.47855,0.99706 -2.76814,1.25292 0,0 -44.74121,8.87701 -44.74121,8.87701 -1.42547,0.28283 -2.44971,0.23848 -3.07009,-0.13431 -0.62119,-0.37318 -0.93211,-0.93202 -0.93207,-1.6762 -4e-5,-0.78548 0.31077,-1.46595 0.93207,-2.04091 0.62038,-0.61545 1.64462,-1.0607 3.07009,-1.33569 0,0 20.05972,-3.8697 20.05972,-3.8697 0,0 0,-60.55879 0,-60.55879 0,0 -20.05972,2.55389 -20.05972,2.55389 -1.42547,0.18155 -2.44971,0.0849 -3.07009,-0.29062 -0.62119,-0.41721 -0.93211,-1.01884 -0.93207,-1.80439 -4e-5,-0.78544 0.31077,-1.44382 0.93207,-1.97467 0.62038,-0.57129 1.64462,-0.94369 3.07009,-1.11742 0,0 44.74121,-5.45018 44.74121,-5.45018 1.28959,-0.157 2.21156,-0.0348 2.76814,0.36651 0.55582,0.36168 0.83347,0.91337 0.83354,1.65541 -7e-5,0.74214 -0.27789,1.38258 -0.83354,1.92167 -0.55658,0.50085 -1.47855,0.83337 -2.76814,0.99749 0,0 -18.99047,2.41776 -18.99047,2.41776"
id="path5447" />
d="m 292.16734,221.79451 c 0,0 0.079,32.92107 0.079,32.92107 0,0 6.83396,-1.8594 6.83396,-1.8594 0.46993,-0.12786 0.80691,-0.0884 1.01132,0.11827 0.20419,0.18473 0.30715,0.48443 0.30895,0.89923 0.002,0.39306 -0.0986,0.7486 -0.30066,1.06669 -0.20232,0.31832 -0.53842,0.54236 -1.00864,0.67204 0,0 -15.85959,4.37404 -15.85959,4.37404 -0.49118,0.13546 -0.8436,0.0983 -1.05684,-0.11192 -0.21335,-0.21022 -0.32005,-0.51707 -0.32005,-0.92043 0,-0.42568 0.10663,-0.79078 0.31991,-1.09527 0.21307,-0.32663 0.56522,-0.55672 1.05608,-0.69027 0,0 6.99856,-1.90419 6.99856,-1.90419 0,0 -0.0639,-33.01316 -0.0639,-33.01316 0,0 -6.94528,1.58452 -6.94528,1.58452 -0.48709,0.11116 -0.83656,0.0697 -1.04802,-0.12452 -0.21157,-0.21626 -0.31738,-0.53384 -0.31738,-0.95255 0,-0.41857 0.10573,-0.77281 0.31723,-1.06267 0.2113,-0.3116 0.56052,-0.52201 1.04729,-0.63134 0,0 15.72034,-3.52906 15.72034,-3.52906 0.46618,-0.1046 0.80048,-0.0507 1.00326,0.16175 0.20255,0.1909 0.30468,0.4903 0.30646,0.89834 0.002,0.40818 -0.0977,0.76414 -0.29818,1.06788 -0.2008,0.28254 -0.53427,0.47704 -1.00074,0.58343 0,0 -6.78316,1.54752 -6.78316,1.54752"
id="path5793" />
<path
inkscape:connector-curvature="0"
d="m 333.91441,137.89555 c 0,0 0,4.82145 0,4.82145 4.26231,-4.95507 8.50252,-7.71134 12.72066,-8.30086 2.51875,-0.35197 4.71531,-0.0105 6.59457,1.01943 1.8709,0.98856 3.43002,2.67958 4.6808,5.07092 2.11395,-2.88191 4.23612,-5.09366 6.36625,-6.64009 2.15634,-1.5801 4.30164,-2.51686 6.43596,-2.81516 3.32659,-0.46487 5.9579,0.22791 7.90698,2.06895 2.54851,2.35126 3.81689,5.1278 3.81694,8.34054 0,0 0,31.43173 0,31.43173 0,0 3.78169,-0.72952 3.78169,-0.72952 1.05891,-0.20428 1.81612,-0.1377 2.27337,0.19926 0.45658,0.30111 0.68473,0.78785 0.68478,1.46049 -5e-5,0.63729 -0.22831,1.21332 -0.68478,1.72849 -0.45725,0.51581 -1.21446,0.87878 -2.27337,1.08887 0,0 -8.30139,1.64706 -8.30139,1.64706 0,0 0,-35.69743 0,-35.69743 -5e-5,-2.29723 -0.70401,-4.09415 -2.11546,-5.39408 -1.41642,-1.30426 -3.05675,-1.82293 -4.92361,-1.5517 -1.6912,0.24582 -3.48172,1.14219 -5.37282,2.6937 -1.89982,1.52212 -4.07088,4.31725 -6.51735,8.39799 0,0 0,30.68038 0,30.68038 0,0 3.945,-0.76103 3.945,-0.76103 1.12031,-0.21612 1.92139,-0.15193 2.40505,0.19205 0.48304,0.30709 0.72435,0.80641 0.7244,1.49821 -5e-5,0.65545 -0.24151,1.24922 -0.7244,1.78172 -0.48366,0.53316 -1.28474,0.91091 -2.40505,1.13318 0,0 -8.78558,1.74313 -8.78558,1.74313 0,0 0,-36.39673 0,-36.39673 -6e-5,-2.4744 -0.76441,-4.39095 -2.29726,-5.75335 -1.49996,-1.40997 -3.19853,-1.9793 -5.09812,-1.70331 -1.75207,0.25466 -3.49172,1.04986 -5.21877,2.38888 -2.4059,1.89533 -4.94464,4.93136 -7.61849,9.11946 0,0 0,31.59463 0,31.59463 0,0 4.24249,-0.81841 4.24249,-0.81841 1.18757,-0.22909 2.03666,-0.16772 2.54928,0.18357 0.51194,0.31331 0.76772,0.82591 0.76772,1.53812 0,0.67475 -0.25565,1.28741 -0.76772,1.83856 -0.51262,0.5518 -1.36171,0.94553 -2.54928,1.18115 0,0 -13.65088,2.70845 -13.65088,2.70845 -1.22888,0.24381 -2.11171,0.18914 -2.64637,-0.1651 -0.53532,-0.35459 -0.80324,-0.87742 -0.80324,-1.56821 0,-0.72913 0.26779,-1.35677 0.80324,-1.8825 0.53466,-0.56337 1.41749,-0.9636 2.64637,-1.20066 0,0 4.33489,-0.83624 4.33489,-0.83624 0,0 0,-39.76731 0,-39.76731 0,0 -4.33489,0.63844 -4.33489,0.63844 -1.22888,0.18102 -2.11171,0.0812 -2.64637,-0.30039 -0.53532,-0.3819 -0.80324,-0.93762 -0.80324,-1.66681 0,-0.69073 0.26779,-1.3047 0.80324,-1.84141 0.53466,-0.53594 1.41749,-0.89098 2.64637,-1.06519 0,0 9.40839,-1.33332 9.40839,-1.33332"
id="path5449" />
d="m 310.82617,224.548 c 0,0 0.0183,2.71052 0.0183,2.71052 1.59486,-2.82856 3.1975,-4.42813 4.80917,-4.80918 0.96652,-0.22849 1.81505,-0.0602 2.54657,0.50362 0.73011,0.54196 1.34443,1.48928 1.84362,2.84195 0.81039,-1.66756 1.62919,-2.95534 2.45658,-3.86518 0.83957,-0.93171 1.68046,-1.49641 2.52294,-1.6956 1.31778,-0.31154 2.3707,0.0529 3.16143,1.09107 1.03734,1.32998 1.56558,2.9259 1.58639,4.79109 0,0 0.20434,18.33386 0.20434,18.33386 0,0 1.53013,-0.41632 1.53013,-0.41632 0.42981,-0.11694 0.739,-0.0757 0.92789,0.12381 0.18853,0.17852 0.2851,0.46568 0.2898,0.86158 0.004,0.37517 -0.0849,0.71339 -0.26782,1.01476 -0.18312,0.30159 -0.48957,0.51171 -0.91962,0.63032 0,0 -3.35086,0.92415 -3.35086,0.92415 0,0 -0.22279,-20.77656 -0.22279,-20.77656 -0.0143,-1.33018 -0.30714,-2.3628 -0.87909,-3.0991 -0.57267,-0.73709 -1.22837,-1.01732 -1.9678,-0.8398 -0.66827,0.16051 -1.37063,0.69532 -2.10748,1.60588 -0.73886,0.89188 -1.5757,2.51342 -2.51176,4.86946 0,0 0.15842,17.6379 0.15842,17.6379 0,0 1.54833,-0.42128 1.54833,-0.42128 0.44115,-0.12002 0.75819,-0.0792 0.95147,0.12232 0.19296,0.18032 0.29136,0.47108 0.29523,0.8724 0.004,0.38029 -0.0887,0.72347 -0.27704,1.02961 -0.18854,0.30636 -0.50335,0.52043 -0.94475,0.64217 0,0 -3.43946,0.94859 -3.43946,0.94859 0,0 -0.17831,-20.87173 -0.17831,-20.87173 -0.0121,-1.41164 -0.31784,-2.49778 -0.91785,-3.25983 -0.5861,-0.78757 -1.24345,-1.09429 -1.97265,-0.91922 -0.67099,0.16116 -1.3334,0.62756 -1.98734,1.40021 -0.90879,1.0908 -1.86103,2.82298 -2.85755,5.20088 0,0 0.12057,17.88402 0.12057,17.88402 0,0 1.61271,-0.43879 1.61271,-0.43879 0.45299,-0.12325 0.77823,-0.083 0.97608,0.1207 0.1976,0.18215 0.29787,0.47663 0.3009,0.88354 0.003,0.38558 -0.0926,0.73385 -0.28674,1.04496 -0.19419,0.31131 -0.51774,0.52949 -0.971,0.6545 0,0 -5.16143,1.42351 -5.16143,1.42351 -0.46029,0.12695 -0.79127,0.0881 -0.99256,-0.11674 -0.20137,-0.20491 -0.30318,-0.50235 -0.30537,-0.89222 -0.002,-0.41142 0.0958,-0.76345 0.29429,-1.05603 0.19822,-0.314 0.5275,-0.53357 0.98751,-0.65873 0,0 1.62837,-0.44305 1.62837,-0.44305 0,0 -0.14116,-22.4169 -0.14116,-22.4169 0,0 -1.62022,0.3912 -1.62022,0.3912 -0.4577,0.11052 -0.78681,0.0614 -0.98695,-0.14757 -0.20023,-0.209 -0.30151,-0.51693 -0.3038,-0.92368 -0.002,-0.38522 0.0954,-0.72992 0.29266,-1.034 0.19711,-0.30384 0.52454,-0.51011 0.98197,-0.61888 0,0 3.52575,-0.83819 3.52575,-0.83819"
id="path5795" />
<path
inkscape:connector-curvature="0"
d="m 432.47276,167.4628 c 0,0 0,-6.0828 0,-6.0828 -5.7975,6.30445 -12.08843,10.16628 -18.89488,11.53144 -5.01615,1.00608 -8.98079,0.48151 -11.86134,-1.59461 -2.90152,-2.12615 -4.36018,-5.14012 -4.36018,-9.03027 0,-4.27566 1.92089,-8.34103 5.73528,-12.16858 3.77821,-3.79124 9.22987,-6.25766 16.28577,-7.41051 1.88182,-0.30744 3.91568,-0.50406 6.09908,-0.59067 2.1711,-0.11991 4.5042,-0.11625 6.99627,0.009 0,0 0,-6.83683 0,-6.83683 -5e-5,-2.31243 -1.00752,-4.17126 -3.03041,-5.58202 -2.03364,-1.41813 -5.10423,-1.83216 -9.23645,-1.23173 -3.19365,0.46414 -7.71884,2.10172 -13.62152,4.94147 -1.07664,0.50744 -1.76786,0.78436 -2.07171,0.82982 -0.54075,0.081 -1.01453,-0.0567 -1.42103,-0.41361 -0.37302,-0.36215 -0.55967,-0.85678 -0.55965,-1.4836 -2e-5,-0.59191 0.16967,-1.08669 0.50881,-1.48409 0.4743,-0.5905 2.38272,-1.57754 5.70477,-2.95304 5.17873,-2.17952 9.05121,-3.44151 11.655,-3.80542 5.12389,-0.71605 9.07344,0.061 11.88347,2.3116 2.78957,2.201 4.1768,4.94583 4.17684,8.24643 0,0 0,27.80543 0,27.80543 0,0 5.19212,-1.00161 5.19212,-1.00161 0.9503,-0.18332 1.62332,-0.11496 2.02049,0.20469 0.39666,0.28626 0.59487,0.74275 0.59492,1.36971 -5e-5,0.59401 -0.19835,1.12807 -0.59492,1.60254 -0.39717,0.475 -1.07019,0.8068 -2.02049,0.99534 0,0 -9.18024,1.82144 -9.18024,1.82144 m 0,-21.01324 c -1.85966,-0.253 -3.83943,-0.33685 -5.94113,-0.2503 -2.11321,0.0871 -4.351,0.32956 -6.71539,0.72884 -5.99089,1.01179 -10.73667,3.1774 -14.19058,6.50681 -2.63574,2.51203 -3.96016,5.20345 -3.96016,8.06185 0,2.64923 1.0022,4.69037 2.99914,6.11798 2.02049,1.41398 4.93209,1.74663 8.71515,1.00868 3.58337,-0.69901 6.87476,-2.07305 9.88112,-4.11507 3.01516,-2.0662 6.08631,-4.98942 9.21185,-8.75869 0,0 0,-9.3001 0,-9.3001"
id="path5451" />
d="m 350.89656,241.32467 c 0,0 -0.0589,-3.6804 -0.0589,-3.6804 -2.44263,3.80778 -5.10211,6.12062 -7.98027,6.91861 -2.10441,0.58347 -3.76815,0.25666 -4.98415,-0.98555 -1.21953,-1.26623 -1.84495,-3.04991 -1.87379,-5.34667 -0.0317,-2.52154 0.73085,-4.92487 2.28129,-7.20305 1.54219,-2.26605 3.8038,-3.77126 6.77195,-4.51991 0.7964,-0.20085 1.66062,-0.33746 2.59222,-0.41005 0.92884,-0.0925 1.93136,-0.11301 3.00698,-0.0616 0,0 -0.0657,-4.10694 -0.0657,-4.10694 -0.0222,-1.38732 -0.47413,-2.48748 -1.3571,-3.30238 -0.88479,-0.81652 -2.19971,-1.01605 -3.95,-0.59577 -1.34605,0.32326 -3.2353,1.35808 -5.67763,3.11343 -0.44361,0.31258 -0.72851,0.48429 -0.85424,0.51483 -0.22367,0.0544 -0.4211,-0.0207 -0.59224,-0.22543 -0.1572,-0.2081 -0.23822,-0.49632 -0.24303,-0.86451 -0.005,-0.34763 0.0618,-0.6405 0.19913,-0.87854 0.1918,-0.35344 0.97539,-0.96079 2.34657,-1.81956 2.14879,-1.36681 3.76798,-2.17692 4.86556,-2.43642 2.17117,-0.5133 3.8675,-0.11811 5.09661,1.18044 1.22539,1.27503 1.8531,2.9031 1.88568,4.88818 0,0 0.27554,16.79617 0.27554,16.79617 0,0 2.26031,-0.61499 2.26031,-0.61499 0.41544,-0.11304 0.71203,-0.0724 0.89013,0.12173 0.17763,0.17395 0.26972,0.45203 0.27631,0.83437 0.006,0.36231 -0.0756,0.68817 -0.24525,0.97765 -0.1699,0.28969 -0.46252,0.49188 -0.87818,0.60651 0,0 -3.98778,1.09982 -3.98778,1.09982 m -0.20304,-12.6875 c -0.80507,-0.13756 -1.65804,-0.17224 -2.55931,-0.10371 -0.90358,0.0688 -1.85617,0.23114 -2.85824,0.48756 -2.52482,0.64614 -4.49945,1.96292 -5.91531,3.95406 -1.07701,1.49735 -1.60605,3.09291 -1.58411,4.78359 0.0203,1.56816 0.45251,2.77768 1.29533,3.62647 0.85525,0.84341 2.07851,1.0467 3.66561,0.61257 1.51075,-0.41325 2.89832,-1.234 4.16372,-2.45986 1.27358,-1.2449 2.56786,-3.01121 3.88202,-5.29462 0,0 -0.0897,-5.60606 -0.0897,-5.60606"
id="path5797" />
<path
inkscape:connector-curvature="0"
d="m 487.99642,123.24158 c 0,0 0,-7.18198 0,-7.18198 0,0 7.90751,-1.12062 7.90751,-1.12062 0.79296,-0.11233 1.36016,-0.009 1.70274,0.31079 0.34213,0.31914 0.51311,0.76977 0.51315,1.35205 -4e-5,0.55172 -0.1711,1.03642 -0.51315,1.45436 -0.34258,0.41847 -0.90978,0.68611 -1.70274,0.80287 0,0 -4.51418,0.66486 -4.51418,0.66486 0,0 0,38.94129 0,38.94129 -4e-5,2.59919 -0.48281,5.02085 -1.45031,7.2696 -0.64654,1.50257 -1.72664,3.14785 -3.24428,4.93949 -1.52421,1.79929 -2.91796,3.15367 -4.17969,4.05975 -1.26625,0.90926 -2.96613,1.60334 -5.1058,2.08195 0,0 -10.08857,2.25658 -10.08857,2.25658 -0.86063,0.19248 -1.47865,0.13846 -1.85284,-0.1629 -0.37458,-0.26951 -0.56202,-0.70931 -0.56199,-1.31915 -3e-5,-0.6099 0.18735,-1.14853 0.56199,-1.6156 0.37419,-0.46662 0.99221,-0.79375 1.85284,-0.98147 0,0 10.21398,-2.18055 10.21398,-2.18055 2.05581,-0.44853 3.89332,-1.44561 5.5158,-2.98788 1.64244,-1.5412 2.99182,-3.56029 4.05143,-6.05696 0.59628,-1.43064 0.89407,-3.15551 0.89411,-5.17643 0,0 0,-11.75228 0,-11.75228 -3.67199,6.46046 -8.46094,10.29476 -14.41118,11.46715 -4.90563,0.96658 -9.19852,-0.24333 -12.85592,-3.66485 -3.66449,-3.49351 -5.51038,-8.19646 -5.51038,-14.08282 0,-5.88631 1.84589,-11.19456 5.51038,-15.88982 3.6574,-4.65324 7.95029,-7.30895 12.85592,-7.99455 5.95024,-0.83153 10.73919,1.3743 14.41118,6.56705 m 0,11.79891 c -4e-5,-4.60139 -1.38279,-8.2714 -4.16442,-11.02605 -2.77587,-2.78019 -6.12983,-3.89388 -10.07779,-3.32022 -3.9914,0.58007 -7.45175,2.73284 -10.36533,6.4757 -2.93682,3.74047 -4.41401,8.00015 -4.41399,12.75663 -2e-5,4.7889 1.47717,8.58342 4.41399,11.36687 2.91358,2.72941 6.37393,3.70079 10.36533,2.93654 3.94796,-0.75589 7.30192,-2.99916 10.07779,-6.71425 2.78163,-3.72257 4.16438,-7.87377 4.16442,-12.47522"
id="path5453" />
d="m 375.34938,213.69585 c 0,0 -0.0974,-4.46393 -0.0974,-4.46393 0,0 3.68773,-0.87669 3.68773,-0.87669 0.37208,-0.0884 0.64113,-0.0368 0.8074,0.15502 0.16617,0.1917 0.25341,0.46963 0.26178,0.83387 0.008,0.34517 -0.066,0.6522 -0.22166,0.92112 -0.15581,0.26917 -0.41973,0.44869 -0.792,0.53856 0,0 -2.11132,0.50977 -2.11132,0.50977 0,0 0.54123,24.40071 0.54123,24.40071 0.0363,1.63856 -0.15744,3.16664 -0.58194,4.58541 -0.2835,0.94739 -0.76869,1.98351 -1.45663,3.10962 -0.68973,1.12896 -1.32331,1.97649 -1.90026,2.54121 -0.57809,0.56581 -1.35962,0.99328 -2.34591,1.28221 0,0 -4.61112,1.35073 -4.61112,1.35073 -0.39039,0.11434 -0.67276,0.0767 -0.84684,-0.11314 -0.17377,-0.16995 -0.26435,-0.44453 -0.27168,-0.82361 -0.007,-0.37906 0.0714,-0.71279 0.23628,-1.00117 0.16471,-0.28821 0.4423,-0.4887 0.83248,-0.60152 0,0 4.66707,-1.3197 4.66707,-1.3197 0.94729,-0.27395 1.78841,-0.89388 2.52391,-1.85846 0.74626,-0.96574 1.35024,-2.23429 1.81265,-3.80502 0.26003,-0.90063 0.37608,-1.98619 0.34838,-3.25697 0,0 -0.16086,-7.37517 -0.16086,-7.37517 -1.62758,4.07072 -3.80169,6.48925 -6.53059,7.23934 -2.23287,0.61374 -4.19888,-0.12311 -5.89159,-2.21938 -1.68617,-2.12737 -2.56457,-4.99526 -2.6305,-8.59335 -0.0658,-3.59204 0.69765,-6.85485 2.28324,-9.77979 1.5891,-2.91055 3.49618,-4.62319 5.71739,-5.14835 2.71476,-0.64182 4.95439,0.6184 6.73072,3.76863 m 0.16039,7.3538 c -0.0626,-2.87086 -0.7569,-5.1338 -2.0858,-6.79534 -1.32015,-1.66944 -2.87807,-2.29072 -4.67812,-1.8585 -1.80975,0.43462 -3.35087,1.81991 -4.62062,4.16259 -1.27628,2.33429 -1.88951,4.95932 -1.83504,7.86963 0.0549,2.93412 0.76232,5.25114 2.11916,6.94432 1.35246,1.66842 2.93958,2.25345 4.75697,1.76072 1.80761,-0.49005 3.33004,-1.90799 4.57015,-4.24741 1.2464,-2.3511 1.83598,-4.96126 1.7733,-7.83601"
id="path5799" />
<path
inkscape:connector-curvature="0"
d="m 540.62477,128.16676 c 0,0 -31.21107,5.34869 -31.21107,5.34869 0.55959,4.81556 2.2836,8.46026 5.1546,10.92445 2.872,2.40913 6.38532,3.19917 10.51985,2.39265 2.27795,-0.44435 4.64854,-1.36045 7.10966,-2.74289 2.44306,-1.3723 4.42228,-2.9394 5.94583,-4.70274 0.44396,-0.51656 0.82908,-0.80507 1.15552,-0.86603 0.37259,-0.0695 0.6983,0.0569 0.97727,0.37934 0.27866,0.2933 0.41792,0.68457 0.41796,1.174 -4e-5,0.48947 -0.18573,0.99996 -0.55739,1.53196 -1.11764,1.65734 -3.11777,3.40564 -6.01644,5.2527 -2.90027,1.82933 -5.91022,3.06093 -9.03241,3.68714 -5.29338,1.06168 -9.78084,-0.14614 -13.42879,-3.66389 -3.66146,-3.59033 -5.50683,-8.44484 -5.50683,-14.53483 0,-5.54457 1.73031,-10.56796 5.16522,-15.03667 3.42605,-4.4281 7.61147,-6.97301 12.52802,-7.66014 4.99038,-0.69739 9.04168,0.70282 12.18653,4.16823 3.11531,3.40416 4.63885,8.17864 4.59247,14.34803 m -2.97258,-3.17835 c -0.58603,-3.92674 -2.13806,-6.95772 -4.66971,-9.09992 -2.52711,-2.16203 -5.56808,-2.99195 -9.13671,-2.47342 -3.60671,0.52417 -6.74137,2.26195 -9.39035,5.22633 -2.66963,2.9875 -4.34237,6.66553 -5.00354,11.02281 0,0 28.20031,-4.6758 28.20031,-4.6758"
id="path5455" />
d="m 400.95375,215.84309 c 0,0 -15.30351,3.94188 -15.30351,3.94188 0.34391,3.04783 1.23396,5.34503 2.66637,6.88627 1.43922,1.51372 3.17433,1.99038 5.19951,1.43641 1.12095,-0.30662 2.28367,-0.91984 3.48738,-1.83766 1.19883,-0.91409 2.16489,-1.95211 2.90025,-3.11439 0.2145,-0.34084 0.40349,-0.53306 0.56706,-0.57689 0.1868,-0.05 0.35355,0.0278 0.50028,0.23369 0.14614,0.18703 0.22361,0.43961 0.23247,0.75782 0.009,0.31828 -0.0759,0.65247 -0.25418,1.00277 -0.53474,1.08992 -1.51174,2.24633 -2.93533,3.4719 -1.41926,1.20943 -2.89777,2.0288 -4.43582,2.45524 -2.59183,0.71861 -4.80714,-0.0257 -6.63604,-2.24415 -1.8247,-2.25008 -2.7858,-5.3079 -2.87757,-9.16136 -0.0834,-3.50233 0.67052,-6.70553 2.2543,-9.60045 1.58612,-2.87997 3.57782,-4.59755 5.9692,-5.16295 2.44485,-0.578 4.47658,0.20903 6.10451,2.35191 1.62144,2.1165 2.47361,5.16594 2.56112,9.15996 m -1.55297,-1.99958 c -0.36339,-2.52164 -1.19348,-4.43925 -2.49343,-5.75652 -1.29227,-1.32421 -2.81005,-1.77891 -4.55736,-1.35935 -1.75678,0.42189 -3.25581,1.59979 -4.49431,3.53879 -1.24433,1.94813 -1.99432,4.30819 -2.24605,7.0779 0,0 13.79115,-3.50082 13.79115,-3.50082"
id="path5801" />
</g>
<g
id="text6335"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Sans"
transform="translate(1.4477142e-8,-14.516129)">
<path
id="path6342"
d="m 289.7812,172.74924 c 0,0 0,30.32096 0,30.32096 0,0 5.31622,-1.09403 5.31622,-1.09403 0.36864,-0.0759 0.6328,-0.009 0.79253,0.19948 0.15968,0.18869 0.23953,0.47439 0.23955,0.85707 -2e-5,0.36257 -0.0799,0.68117 -0.23955,0.95582 -0.15973,0.27468 -0.42389,0.45007 -0.79253,0.52616 0,0 -12.20372,2.51907 -12.20372,2.51907 -0.37097,0.0766 -0.63686,0.0102 -0.79765,-0.19916 -0.16081,-0.20937 -0.24121,-0.49598 -0.24121,-0.85983 0,-0.38404 0.0804,-0.7038 0.24121,-0.95925 0.16079,-0.27564 0.42668,-0.45161 0.79765,-0.52795 0,0 5.3343,-1.09775 5.3343,-1.09775 0,0 0,-30.33259 0,-30.33259 0,0 -5.3343,1.0578 -5.3343,1.0578 -0.37097,0.0736 -0.63686,0.0152 -0.79765,-0.17532 -0.16081,-0.21064 -0.24121,-0.50801 -0.24121,-0.89209 0,-0.38402 0.0804,-0.70312 0.24121,-0.9573 0.16079,-0.2743 0.42668,-0.44812 0.79765,-0.52149 0,0 12.20372,-2.41236 12.20372,-2.41236 0.36864,-0.0728 0.6328,-0.004 0.79253,0.20591 0.15968,0.19002 0.23953,0.47636 0.23955,0.85902 -2e-5,0.38273 -0.0799,0.71076 -0.23955,0.98409 -0.15973,0.25327 -0.42389,0.41645 -0.79253,0.48952 0,0 -5.31622,1.05422 -5.31622,1.05422"
inkscape:connector-curvature="0" />
<path
id="path6344"
d="m 304.56912,176.44974 c 0,0 0,2.56275 0,2.56275 1.30843,-2.57317 2.62214,-3.99091 3.94109,-4.25437 0.79339,-0.15843 1.48888,0.0539 2.08658,0.63694 0.5975,0.56281 1.09732,1.50612 1.49954,2.82986 0.68233,-1.5411 1.37053,-2.72191 2.0646,-3.54263 0.70597,-0.84286 1.41171,-1.33466 2.11721,-1.47559 1.10637,-0.22094 1.98741,0.19403 2.64338,1.24457 0.86213,1.3493 1.29307,2.9247 1.29309,4.72665 0,0 0,17.62938 0,17.62938 0,0 1.29225,-0.26593 1.29225,-0.26593 0.36384,-0.0749 0.62457,-0.008 0.78222,0.19923 0.1576,0.18768 0.23641,0.47161 0.23643,0.8518 -2e-5,0.3602 -0.0789,0.67662 -0.23643,0.94926 -0.15765,0.27268 -0.41838,0.44656 -0.78222,0.52167 0,0 -2.82218,0.58254 -2.82218,0.58254 0,0 0,-19.91946 0,-19.91946 -2e-5,-1.28187 -0.2369,-2.29585 -0.71072,-3.04209 -0.47398,-0.74635 -1.02099,-1.0575 -1.64109,-0.93328 -0.55951,0.11212 -1.14958,0.58117 -1.77024,1.40731 -0.62086,0.80639 -1.32718,2.30204 -2.11901,4.48741 0,0 0,16.76074 0,16.76074 0,0 1.27899,-0.26321 1.27899,-0.26321 0.36526,-0.0752 0.62699,-0.009 0.78525,0.19931 0.15823,0.18797 0.23733,0.47243 0.23735,0.85335 -2e-5,0.3609 -0.0792,0.67796 -0.23735,0.95119 -0.15826,0.27327 -0.41999,0.4476 -0.78525,0.52299 0,0 -2.83314,0.58481 -2.83314,0.58481 0,0 0,-19.77746 0,-19.77746 -1e-5,-1.34457 -0.2439,-2.39933 -0.73178,-3.16444 -0.47581,-0.78777 -1.01275,-1.12183 -1.61085,-1.00201 -0.54945,0.11011 -1.09295,0.51024 -1.63047,1.20051 -0.74545,0.97331 -1.52785,2.54716 -2.34725,4.72194 0,0 0,16.79351 0,16.79351 0,0 1.30233,-0.26801 1.30233,-0.26801 0.3667,-0.0755 0.62946,-0.009 0.78832,0.19938 0.15885,0.18827 0.23827,0.47325 0.23828,0.85492 -1e-5,0.3616 -0.0794,0.6793 -0.23828,0.95314 -0.15886,0.27387 -0.42162,0.44864 -0.78832,0.52433 0,0 -4.14836,0.8563 -4.14836,0.8563 -0.36753,0.0759 -0.63097,0.01 -0.79027,-0.199 -0.15931,-0.20855 -0.23897,-0.49391 -0.23897,-0.85606 0,-0.38226 0.0796,-0.70045 0.23897,-0.95457 0.1593,-0.2742 0.42274,-0.44911 0.79027,-0.52474 0,0 1.30416,-0.26839 1.30416,-0.26839 0,0 0,-21.02253 0,-21.02253 0,0 -1.30416,0.26159 -1.30416,0.26159 -0.36753,0.0737 -0.63097,0.006 -0.79027,-0.20361 -0.15931,-0.20947 -0.23897,-0.50535 -0.23897,-0.88764 0,-0.36212 0.0796,-0.67984 0.23897,-0.95317 0.1593,-0.27324 0.42274,-0.44662 0.79027,-0.52013 0,0 2.84603,-0.56906 2.84603,-0.56906"
inkscape:connector-curvature="0" />
<path
id="path6346"
d="m 338.26689,195.60376 c 0,0 0,-3.61767 0,-3.61767 -2.20252,3.52388 -4.55814,5.54631 -7.06742,6.06489 -1.82363,0.37688 -3.24985,-0.0877 -4.27786,-1.39461 -1.02852,-1.32754 -1.54299,-3.10136 -1.54298,-5.32096 -10e-6,-2.43953 0.67785,-4.70711 2.03287,-6.80168 1.35409,-2.09312 3.3292,-3.40199 5.92348,-3.92714 0.69926,-0.14153 1.45854,-0.21543 2.27777,-0.22172 0.81887,-0.0262 1.70362,0.0239 2.65414,0.15025 0,0 0,-4.06615 0,-4.06615 -2e-5,-1.37528 -0.38498,-2.49383 -1.15511,-3.35589 -0.77046,-0.86234 -1.92668,-1.1392 -3.46933,-0.83014 -1.18192,0.23683 -2.84139,1.13844 -4.97959,2.70598 -0.38682,0.2775 -0.63466,0.4272 -0.74347,0.44903 -0.19348,0.0389 -0.36277,-0.047 -0.50789,-0.25774 -0.13305,-0.2131 -0.19957,-0.49956 -0.19957,-0.85935 0,-0.33976 0.0605,-0.6217 0.18143,-0.84583 0.1693,-0.33368 0.85246,-0.88012 2.04895,-1.63902 1.8839,-1.21542 3.30773,-1.91909 4.27248,-2.1118 1.91602,-0.38264 3.40901,0.10672 4.47992,1.46726 1.07032,1.33994 1.60526,2.99588 1.60527,4.96838 0,0 0,16.61698 0,16.61698 0,0 2.01829,-0.41534 2.01829,-0.41534 0.37219,-0.0766 0.63629,-0.0115 0.79235,0.19532 0.15601,0.18689 0.23402,0.46947 0.23404,0.84774 -2e-5,0.35837 -0.0781,0.67311 -0.23404,0.9442 -0.15606,0.27114 -0.42016,0.44511 -0.79235,0.52194 0,0 -3.55138,0.73307 -3.55138,0.73307 m 0,-12.49741 c -0.70985,-0.19458 -1.46206,-0.29097 -2.25669,-0.2891 -0.79498,0.002 -1.63244,0.0922 -2.51243,0.27083 -2.20778,0.44829 -3.93465,1.58796 -5.17941,3.41949 -0.94315,1.37125 -1.41489,2.87666 -1.41489,4.51572 0,1.51915 0.35684,2.72513 1.07033,3.61771 0.72532,0.8898 1.77657,1.19268 3.15324,0.90903 1.31539,-0.27102 2.53349,-0.95103 3.65445,-2.03968 1.13235,-1.11048 2.29417,-2.73492 3.4854,-4.87285 0,0 0,-5.53115 0,-5.53115"
inkscape:connector-curvature="0" />
<path
id="path6348"
d="m 361.03362,169.73799 c 0,0 0,-4.57811 0,-4.57811 0,0 3.51111,-0.70203 3.51111,-0.70203 0.35609,-0.0712 0.61126,-0.003 0.76556,0.20328 0.15424,0.20673 0.23137,0.49814 0.23139,0.87424 -2e-5,0.35635 -0.0772,0.66876 -0.23139,0.93722 -0.1543,0.26853 -0.40947,0.4385 -0.76556,0.50991 0,0 -2.01322,0.40381 -2.01322,0.40381 0,0 0,24.93239 0,24.93239 -2e-5,1.66412 -0.21394,3.19438 -0.64182,4.59098 -0.28533,0.93124 -0.76094,1.93198 -1.42698,3.00242 -0.66629,1.07077 -1.27327,1.8618 -1.82089,2.37289 -0.5478,0.51123 -1.2804,0.8629 -2.198,1.05498 0,0 -4.25995,0.89161 -4.25995,0.89161 -0.3584,0.075 -0.61529,0.01 -0.77062,-0.19631 -0.15536,-0.18605 -0.23304,-0.46782 -0.23304,-0.8453 0,-0.37749 0.0777,-0.70165 0.23304,-0.9725 0.15533,-0.27081 0.41222,-0.44362 0.77062,-0.51839 0,0 4.31359,-0.87039 4.31359,-0.87039 0.88183,-0.18403 1.67398,-0.72615 2.37652,-1.6262 0.71418,-0.90221 1.3032,-2.12502 1.76716,-3.66839 0.26165,-0.88672 0.39248,-1.97415 0.39248,-3.26235 0,0 0,-7.49145 0,-7.49145 -1.60613,3.99699 -3.67816,6.25834 -6.21753,6.78211 -2.06489,0.42591 -3.85102,-0.4773 -5.35762,-2.71118 -1.49577,-2.25793 -2.24408,-5.18732 -2.24408,-8.78698 0,-3.59961 0.74831,-6.82288 2.24408,-9.66819 1.5066,-2.84552 3.29273,-4.47385 5.35762,-4.88629 2.53937,-0.50714 4.6114,0.90308 6.21753,4.22817 m 0,7.52118 c 0,-2.93314 -0.60662,-5.28816 -1.82036,-7.06588 -1.20261,-1.78115 -2.6443,-2.50382 -4.3256,-2.16698 -1.68272,0.33717 -3.12789,1.64976 -4.33499,3.9386 -1.20785,2.27039 -1.81204,4.86726 -1.81204,7.78958 0,2.94224 0.60419,5.31369 1.81204,7.11356 1.2071,1.77893 2.65227,2.49487 4.33499,2.14886 1.6813,-0.34572 3.12299,-1.65368 4.3256,-3.9231 1.21374,-2.29027 1.82036,-4.90147 1.82036,-7.83464"
inkscape:connector-curvature="0" />
<path
id="path6350"
d="m 385.85186,173.58032 c 0,0 -15.13765,3.07797 -15.13765,3.07797 0.26034,3.16944 1.06482,5.60432 2.41279,7.30409 1.35885,1.67644 3.03546,2.3087 5.02902,1.89796 1.10796,-0.22828 2.26831,-0.77304 3.48095,-1.634 1.21188,-0.86041 2.19967,-1.87147 2.96371,-3.03319 0.22326,-0.34131 0.41713,-0.52883 0.58164,-0.56257 0.18794,-0.0385 0.3524,0.0557 0.49337,0.2829 0.14092,0.20743 0.21138,0.47854 0.21141,0.81334 -3e-5,0.33482 -0.094,0.67909 -0.28188,1.03285 -0.56391,1.10093 -1.56872,2.23389 -3.01514,3.39933 -1.43573,1.14415 -2.91371,1.87353 -4.43406,2.18773 -2.54834,0.52665 -4.68036,-0.42556 -6.39472,-2.85877 -1.70402,-2.4575 -2.55658,-5.67472 -2.55657,-9.65009 -10e-6,-3.61935 0.79928,-6.88542 2.39688,-9.79647 1.60812,-2.91102 3.59284,-4.60156 5.95302,-5.07297 2.42802,-0.4849 4.42362,0.44725 5.9881,2.79462 1.5632,2.32586 2.3326,5.59781 2.30913,9.81727 m -1.49798,-2.20747 c -0.29388,-2.67927 -1.06987,-4.74949 -2.32855,-6.21109 -1.24773,-1.46483 -2.73778,-2.02412 -4.4707,-1.67694 -1.73447,0.34753 -3.22825,1.49618 -4.48082,3.44663 -1.25337,1.95173 -2.03418,4.35276 -2.34185,7.20251 0,0 13.62192,-2.76111 13.62192,-2.76111"
inkscape:connector-curvature="0" />
</g>
</g>
<text
@ -844,7 +889,7 @@
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/Users/arothfusz/src/metalivedev/docker/docs/sources/terms/images/docker-filesystems-multiroot.png"
transform="matrix(0.81677441,0,0,0.81677441,35.330746,48.494017)"
transform="matrix(0.64605126,0,0,0.64605126,58.138831,104.45649)"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Futura;-inkscape-font-specification:Futura Medium"
id="text10309">
<path
@ -872,6 +917,134 @@
d="m 233.61915,313.32443 c 0,0 4.86427,2.31094 4.86427,2.31094 0,0 -2.7e-4,5.00485 -2.7e-4,5.00485 1.71074,-3.52308 3.64965,-4.78093 5.82081,-3.75454 2.5118,1.18756 4.48297,4.13443 5.9036,8.84914 1.23117,4.03483 1.84851,9.9569 1.84853,17.75524 0,0 0,33.90579 0,33.90579 0,0 -5.07083,-2.83374 -5.07083,-2.83374 0,0 6.2e-4,-30.6586 6.2e-4,-30.6586 9e-5,-5.40954 -0.29652,-9.29502 -0.88902,-11.65343 -0.57668,-2.38426 -1.62396,-3.94697 -3.13732,-4.68877 -1.63768,-0.80262 -2.79522,0.005 -3.4777,2.41735 -0.6666,2.37712 -0.99957,6.93792 -0.99994,13.68633 0,0 -0.001,26.14439 -0.001,26.14439 0,0 -4.86529,-2.71887 -4.86529,-2.71887 0,0 0.004,-53.76608 0.004,-53.76608"
id="path10326" />
</g>
<g
style="display:none"
inkscape:label="rwlayershort"
id="layer3"
inkscape:groupmode="layer">
<g
inkscape:corner7="0.23104367 : -0.032927705 : 0.53664065 : 1"
inkscape:corner0="0.51156871 : 0.026428054 : 0 : 1"
inkscape:perspectiveID="#perspective4014"
id="g11520"
style="fill:#24b8eb;fill-opacity:0.64251206;stroke:#253237;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
sodipodi:type="inkscape:box3d">
<path
d="M 131.92561,229.48947 254.03226,279.93524 540.96513,197.86229 411.55236,171.87435 z"
inkscape:box3dsidetype="13"
style="fill:#24b8eb;fill-opacity:0.64251206;fill-rule:evenodd;stroke:none"
id="path11530"
sodipodi:type="inkscape:box3dside" />
<path
d="m 131.92561,190.22181 0,39.26766 279.62675,-57.61512 0,-28.97934 z"
inkscape:box3dsidetype="6"
style="fill:#24b8eb;fill-opacity:0.64251206;fill-rule:evenodd;stroke:none"
id="path11522"
sodipodi:type="inkscape:box3dside" />
<path
d="m 411.55236,142.89501 129.41277,21.38902 0,33.57826 -129.41277,-25.98794 z"
inkscape:box3dsidetype="11"
style="fill:#24b8eb;fill-opacity:0.64251206;fill-rule:evenodd;stroke:none"
id="path11532"
sodipodi:type="inkscape:box3dside" />
<path
d="M 131.92561,190.22181 254.03226,231.71944 540.96513,164.28403 411.55236,142.89501 z"
inkscape:box3dsidetype="5"
style="fill:#24b8eb;fill-opacity:0.64251206"
id="path11524"
sodipodi:type="inkscape:box3dside" />
<path
d="m 254.03226,231.71944 0,48.2158 286.93287,-82.07295 0,-33.57826 z"
inkscape:box3dsidetype="14"
style="fill:#24b8eb;fill-opacity:0.64251206"
id="path11528"
sodipodi:type="inkscape:box3dside" />
<path
d="m 131.92561,190.22181 122.10665,41.49763 0,48.2158 -122.10665,-50.44577 z"
inkscape:box3dsidetype="3"
style="fill:#24b8eb;fill-opacity:0.64251206"
id="path11526"
sodipodi:type="inkscape:box3dside" />
</g>
<g
transform="matrix(0.65426564,0,0,0.65426564,59.078784,80.39098)"
style="font-size:40px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
id="text12905">
<path
inkscape:connector-curvature="0"
d="m 132.39162,196.56835 c 0,0 2.25832,0.79098 2.25832,0.79098 0,0 1.50732,28.61196 1.50732,28.61196 0,0 4.34598,-26.56183 4.34598,-26.56183 0,0 2.722,0.95339 2.722,0.95339 0,0 1.63516,29.08943 1.63516,29.08943 0,0 4.31997,-27.00363 4.31997,-27.00363 0,0 2.42221,0.84838 2.42221,0.84838 0,0 -5.66212,33.42382 -5.66212,33.42382 0,0 -2.73065,-1.12467 -2.73065,-1.12467 0,0 -1.5784,-29.68879 -1.5784,-29.68879 0,0 -4.4624,27.20079 -4.4624,27.20079 0,0 -2.67264,-1.10077 -2.67264,-1.10077 0,0 -2.10475,-35.43906 -2.10475,-35.43906"
id="path12912" />
<path
inkscape:connector-curvature="0"
d="m 164.03604,213.26939 c -0.2639,-0.42447 -0.56258,-0.78434 -0.89592,-1.0796 -0.33304,-0.29492 -0.68661,-0.50929 -1.06059,-0.64322 -1.33705,-0.47863 -2.47231,0.33686 -3.4066,2.43656 -0.92991,2.06688 -1.50465,5.07325 -1.72714,9.01466 0,0 -1.04777,17.82424 -1.04777,17.82424 0,0 -2.42011,-0.99676 -2.42011,-0.99676 0,0 1.98378,-35.17658 1.98378,-35.17658 0,0 2.47527,0.86697 2.47527,0.86697 0,0 -0.33507,5.56959 -0.33507,5.56959 0.60533,-1.89455 1.35104,-3.25595 2.23803,-4.08114 0.89961,-0.82526 1.87507,-1.05633 2.92646,-0.68969 0.27488,0.0959 0.54641,0.23479 0.81455,0.4165 0.26786,0.15981 0.53715,0.37533 0.80786,0.64667 0,0 -0.35275,5.89174 -0.35275,5.89174"
id="path12914" />
<path
inkscape:connector-curvature="0"
d="m 167.87077,194.36999 c 0,0 2.5978,0.8462 2.5978,0.8462 0,0 -0.48615,7.70745 -0.48615,7.70745 0,0 -2.58509,-0.87602 -2.58509,-0.87602 0,0 0.47344,-7.67763 0.47344,-7.67763 m -0.87992,14.31682 c 0,0 2.57415,0.9016 2.57415,0.9016 0,0 -2.30324,35.91396 -2.30324,35.91396 0,0 -2.5149,-1.0358 -2.5149,-1.0358 0,0 2.24399,-35.77976 2.24399,-35.77976"
id="path12916" />
<path
inkscape:connector-curvature="0"
d="m 183.34977,214.41656 c 0,0 -0.34194,4.75863 -0.34194,4.75863 0,0 -5.33307,-1.91046 -5.33307,-1.91046 0,0 -1.36427,19.81122 -1.36427,19.81122 -0.0441,0.73284 -0.076,1.34864 -0.0958,1.84769 -0.0198,0.49879 -0.0272,0.89218 -0.0223,1.18025 0.024,1.41732 0.22117,2.51814 0.59164,3.30404 0.38018,0.79025 0.97369,1.34835 1.78193,1.67447 0,0 2.66812,1.07661 2.66812,1.07661 0,0 -0.36838,4.94638 -0.36838,4.94638 0,0 -2.51686,-1.03661 -2.51686,-1.03661 -1.55308,-0.63966 -2.72009,-1.81877 -3.50617,-3.53794 -0.77559,-1.71295 -1.18868,-3.99849 -1.24016,-6.86324 -0.009,-0.50749 -0.005,-1.05378 0.0125,-1.63897 0.0171,-0.60759 0.0472,-1.26529 0.0905,-1.97325 0,0 1.33026,-19.73599 1.33026,-19.73599 0,0 -2.21945,-0.79507 -2.21945,-0.79507 0,0 0.32464,-4.68341 0.32464,-4.68341 0,0 2.18338,0.76473 2.18338,0.76473 0,0 0.70719,-10.54703 0.70719,-10.54703 0,0 2.66503,0.88587 2.66503,0.88587 0,0 -0.71095,10.59328 -0.71095,10.59328 0,0 5.36413,1.8788 5.36413,1.8788"
id="path12918" />
<path
inkscape:connector-curvature="0"
d="m 199.13849,236.70883 c 0,0 -1.72385,21.2125 -1.72385,21.2125 0,0 -2.77523,-1.14302 -2.77523,-1.14302 0,0 0.45537,-5.5694 0.45537,-5.5694 -0.79039,1.93977 -1.69787,3.25939 -2.72178,3.963 -1.00998,0.68226 -2.14049,0.76306 -3.39088,0.2461 -1.4019,-0.5796 -2.56171,-2.02483 -3.48324,-4.3353 -0.91085,-2.32565 -1.3871,-5.01869 -1.42975,-8.08698 -0.0612,-4.40249 0.65095,-7.60298 2.1444,-9.6005 1.51381,-2.0078 3.64053,-2.5073 6.39035,-1.48111 0,0 3.88091,1.44834 3.88091,1.44834 0,0 0.13737,-1.64241 0.13737,-1.64241 0.0187,-0.17753 0.0322,-0.36859 0.0405,-0.57316 0.008,-0.22771 0.0101,-0.57318 0.006,-1.03646 -0.0184,-2.06353 -0.40494,-3.80038 -1.15864,-5.20652 -0.74267,-1.42355 -1.7772,-2.37178 -3.10017,-2.84471 -0.90567,-0.32369 -1.83075,-0.39003 -2.77476,-0.20023 -0.93078,0.19278 -1.88487,0.63805 -2.86168,1.33418 0,0 0.40119,-5.68296 0.40119,-5.68296 1.0224,-0.5343 2.0267,-0.84843 3.0124,-0.94098 0.99899,-0.11252 1.96874,-0.005 2.90868,0.32235 2.01064,0.70123 3.55659,2.24252 4.62956,4.62368 1.08518,2.38922 1.64359,5.50025 1.67366,9.32128 0.006,0.76751 -0.0125,1.66447 -0.0556,2.69043 -0.0433,1.00181 -0.11156,2.06254 -0.20482,3.18188 m -3.01967,1.47698 c 0,0 -2.78542,-1.06163 -2.78542,-1.06163 -2.2624,-0.86226 -3.92041,-0.80292 -4.98268,0.16995 -1.04789,0.94964 -1.55167,2.85777 -1.51494,5.72282 0.0254,1.98149 0.31466,3.64088 0.8682,4.98133 0.56384,1.34561 1.32816,2.21415 2.29484,2.60564 1.48548,0.60158 2.77591,-0.0812 3.87044,-2.05855 1.10034,-2.01109 1.81516,-5.00707 2.14096,-8.99265 0,0 0.1086,-1.36691 0.1086,-1.36691"
id="path12920" />
<path
inkscape:connector-curvature="0"
d="m 217.64994,242.08214 c -0.003,-3.45467 -0.36941,-6.29845 -1.09988,-8.52314 -0.71911,-2.21914 -1.712,-3.55453 -2.9753,-4.006 -0.9147,-0.32682 -1.77169,-0.13384 -2.57095,0.57649 -0.7861,0.6882 -1.46696,1.86026 -2.04305,3.51377 -0.60552,1.7306 -1.08098,3.81943 -1.42712,6.2652 -0.33468,2.41877 -0.49538,4.89667 -0.48288,7.43549 0.0158,3.20708 0.36798,5.85818 1.05704,7.96044 0.69992,2.08483 1.65443,3.37263 2.86659,3.86366 0.92007,0.37271 1.77251,0.25313 2.55721,-0.36105 0.78714,-0.63948 1.47963,-1.76427 2.07706,-3.37684 0.61006,-1.68425 1.10315,-3.73887 1.47858,-6.16534 0.37661,-2.43421 0.56447,-4.82931 0.5627,-7.18268 m -9.23169,-12.84717 c 0.71257,-1.9212 1.61108,-3.31025 2.69696,-4.16424 1.10132,-0.8778 2.25765,-1.10762 3.46876,-0.68529 1.8688,0.65177 3.36054,2.56955 4.46812,5.75349 1.11991,3.19191 1.67936,7.16826 1.67728,11.91278 -0.002,3.86886 -0.33149,7.48101 -0.9869,10.83305 -0.64142,3.34015 -1.55578,6.15428 -2.74017,8.44433 -0.7715,1.50955 -1.65836,2.54577 -2.65987,3.1114 -0.99765,0.5634 -2.04044,0.61881 -3.12849,0.16897 -1.14744,-0.4744 -2.14129,-1.46065 -2.98356,-2.95812 -0.84085,-1.4949 -1.52693,-3.4884 -2.05939,-5.98273 0,0 -0.48266,5.66038 -0.48266,5.66038 0,0 -2.84889,-1.17336 -2.84889,-1.17336 0,0 4.44431,-52.94734 4.44431,-52.94734 0,0 2.95322,0.96198 2.95322,0.96198 0,0 -1.81872,21.0647 -1.81872,21.0647"
id="path12922" />
<path
inkscape:connector-curvature="0"
d="m 228.71944,214.19071 c 0,0 3.15615,1.02808 3.15615,1.02808 0,0 -5.33605,54.69811 -5.33605,54.69811 0,0 -3.03879,-1.25157 -3.03879,-1.25157 0,0 5.21869,-54.47462 5.21869,-54.47462"
id="path12924" />
<path
inkscape:connector-curvature="0"
d="m 249.07211,254.74636 c 0.0404,-0.38368 0.0691,-0.78443 0.0859,-1.20226 0.0288,-0.41348 0.0457,-0.83161 0.0506,-1.25434 0.0353,-3.03778 -0.36798,-5.60275 -1.20915,-7.68768 -0.82831,-2.07819 -1.97429,-3.37815 -3.43389,-3.89992 -1.61834,-0.57843 -3.05045,-0.009 -4.29713,1.70059 -1.23987,1.67549 -2.18445,4.34652 -2.83626,8.00619 0,0 11.63988,4.33748 11.63988,4.33748 m 2.81056,6.45167 c 0,0 -15.09094,-5.79069 -15.09094,-5.79069 -0.0752,0.89703 -0.126,1.60789 -0.15253,2.13298 -0.0265,0.52486 -0.0411,0.98119 -0.0437,1.36905 -0.0225,3.36482 0.44677,6.15468 1.40888,8.37881 0.97504,2.23208 2.36307,3.71384 4.1703,4.44572 1.39681,0.56568 2.72662,0.77468 3.98908,0.62476 1.26781,-0.15056 2.45566,-0.64338 3.56302,-1.48066 0,0 -0.70189,6.42657 -0.70189,6.42657 -1.18125,0.49488 -2.39603,0.72794 -3.64426,0.70088 -1.23153,-0.0222 -2.4791,-0.29519 -3.74285,-0.81767 -2.68557,-1.11031 -4.73074,-3.28927 -6.14928,-6.53818 -1.40393,-3.26112 -2.09137,-7.34961 -2.06451,-12.28511 0.023,-4.22844 0.39788,-8.03395 1.12728,-11.41867 0.74471,-3.42191 1.82516,-6.33485 3.24539,-8.73744 0.92003,-1.50587 2.01004,-2.53659 3.27144,-3.08937 1.27888,-0.55109 2.63589,-0.57813 4.0712,-0.0776 2.26618,0.79035 4.06153,2.85633 5.37632,6.19826 1.32912,3.35217 1.96352,7.4395 1.9016,12.24399 -0.0148,1.14841 -0.0669,2.36942 -0.15622,3.66262 -0.0889,1.26675 -0.21507,2.6175 -0.37835,4.05176"
id="path12926" />
</g>
<g
id="text14746"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New"
transform="matrix(1.1734694,0,0,1.1734694,-48.893189,-48.489991)">
<path
id="path14753"
d="m 292.56742,237.4772 c 0,0 0,-1.59047 0,-1.59047 -1e-5,-0.5391 0.0453,-0.93633 0.13582,-1.19161 0.0987,-0.25714 0.22627,-0.40435 0.38255,-0.44167 0.1562,-0.0372 0.27949,0.0501 0.36989,0.26184 0.0986,0.20984 0.14786,0.58398 0.14787,1.12245 0,0 0,6.27362 0,6.27362 -10e-6,0.55648 -0.0493,0.96364 -0.14787,1.22152 -0.0904,0.25592 -0.21369,0.40336 -0.36989,0.44226 -0.13983,0.0349 -0.25912,-0.0432 -0.35786,-0.23424 -0.0906,-0.1931 -0.14406,-0.53022 -0.16051,-1.01139 -0.0412,-1.49945 -0.41597,-2.74678 -1.12524,-3.74312 -0.95853,-1.37023 -2.0518,-1.9091 -3.28082,-1.61375 -0.80737,0.19408 -1.57032,0.76646 -2.2886,1.71804 -0.5353,0.69109 -0.96233,1.48343 -1.28077,2.37687 -0.55364,1.55049 -0.99453,3.22917 -1.32232,5.0356 -0.2355,1.33038 -0.35329,2.79525 -0.35329,4.3941 0,0 0,4.00625 0,4.00625 0,3.41577 0.57185,6.23436 1.71333,8.4515 1.13855,2.19332 2.4576,3.08294 3.95555,2.67411 0.89633,-0.24464 1.69568,-0.88624 2.39858,-1.92393 0.71,-1.03826 1.39417,-2.49958 2.05261,-4.38314 0.13978,-0.41447 0.29596,-0.64466 0.46853,-0.69065 0.14784,-0.0394 0.26691,0.0276 0.35722,0.20089 0.0903,0.17329 0.13541,0.41244 0.13543,0.71743 -2e-5,0.41269 -0.17649,1.08812 -0.52962,2.02685 -0.67425,1.83488 -1.43607,3.29166 -2.28591,4.36978 -0.84324,1.0599 -1.70051,1.71048 -2.57191,1.95056 -0.75663,0.20846 -1.52704,0.10426 -2.31133,-0.31343 -0.60168,-0.3239 -1.09951,-0.75841 -1.49315,-1.30354 -0.394,-0.54561 -0.88069,-1.51132 -1.46037,-2.89811 -0.57203,-1.40902 -0.96363,-2.74066 -1.1743,-3.99402 -0.21078,-1.27211 -0.3162,-2.69969 -0.3162,-4.28229 0,0 0,-4.6659 0,-4.6659 0,-2.25562 0.27827,-4.62592 0.83428,-7.1086 0.56373,-2.49973 1.32824,-4.49134 2.29251,-5.97481 0.97053,-1.50028 2.01815,-2.3831 3.14231,-2.65042 1.72644,-0.41045 3.20678,0.51535 4.44348,2.77142"
inkscape:connector-curvature="0" />
<path
id="path14755"
d="m 308.66695,250.09217 c -10e-6,3.3873 -0.5478,6.4277 -1.64547,9.12638 -1.09249,2.70338 -2.41593,4.27147 -3.97244,4.7003 -1.57825,0.43483 -2.92347,-0.40609 -4.03348,-2.528 -1.11284,-2.14518 -1.67032,-4.92676 -1.67032,-8.34065 0,-3.43174 0.55748,-6.50462 1.67032,-9.21347 1.11001,-2.71971 2.45523,-4.27243 4.03348,-4.66229 1.55651,-0.38443 2.87995,0.49215 3.97244,2.62466 1.09767,2.12517 1.64546,4.88816 1.64547,8.29307 m -1.01277,0.2646 c -10e-6,-2.7907 -0.44957,-5.05158 -1.35007,-6.78534 -0.89442,-1.73935 -1.98297,-2.45048 -3.26712,-2.12996 -1.28798,0.32151 -2.38981,1.59368 -3.30406,3.8193 -0.90806,2.21042 -1.3628,4.71879 -1.36279,7.52165 -10e-6,2.78505 0.45473,5.0558 1.36279,6.80955 0.91425,1.7479 2.01608,2.44432 3.30406,2.09279 1.28415,-0.35048 2.3727,-1.63042 3.26712,-3.83716 0.9005,-2.22197 1.35006,-4.71775 1.35007,-7.49083"
inkscape:connector-curvature="0" />
<path
id="path14757"
d="m 314.42401,237.15342 c 0,0 0,3.33838 0,3.33838 0.68834,-1.73173 1.30925,-2.96305 1.86301,-3.69535 0.55304,-0.7313 1.17532,-1.18207 1.86656,-1.35283 0.74434,-0.18383 1.42164,0.006 2.03224,0.56853 0.43228,0.41464 0.82174,1.18719 1.16849,2.31729 0.35414,1.10991 0.53111,2.29857 0.53112,3.56668 0,0 0,13.7844 0,13.7844 0,0 0.81847,-0.22256 0.81847,-0.22256 0.23026,-0.0626 0.39521,-0.003 0.49492,0.17762 0.0997,0.16363 0.14951,0.41019 0.14952,0.73967 -1e-5,0.31216 -0.0499,0.58594 -0.14952,0.82137 -0.0997,0.23549 -0.26466,0.38485 -0.49492,0.44805 0,0 -2.59918,0.71347 -2.59918,0.71347 -0.23955,0.0658 -0.40963,0.008 -0.51015,-0.17349 -0.10057,-0.18148 -0.15085,-0.42903 -0.15085,-0.74263 0,-0.331 0.0503,-0.60603 0.15085,-0.82505 0.10052,-0.23636 0.2706,-0.3871 0.51015,-0.45224 0,0 0.81034,-0.22035 0.81034,-0.22035 0,0 0,-13.43494 0,-13.43494 -10e-6,-1.54782 -0.25067,-2.78882 -0.75241,-3.72384 -0.50236,-0.9535 -1.17565,-1.32537 -2.02071,-1.11445 -0.64462,0.16091 -1.20459,0.59773 -1.67958,1.31084 -0.47553,0.69646 -1.15466,2.32016 -2.03835,4.87447 0,0 0,13.85296 0,13.85296 0,0 1.1141,-0.30294 1.1141,-0.30294 0.23417,-0.0637 0.40192,-0.004 0.50332,0.17797 0.10137,0.16478 0.15204,0.4133 0.15205,0.74557 -1e-5,0.31479 -0.0507,0.59099 -0.15205,0.82865 -0.1014,0.23771 -0.26915,0.38871 -0.50332,0.45299 0,0 -3.22119,0.88421 -3.22119,0.88421 -0.23607,0.0648 -0.40534,0.006 -0.50771,-0.17703 -0.10241,-0.18288 -0.15362,-0.43257 -0.15362,-0.74903 0,-0.33403 0.0512,-0.61171 0.15362,-0.83298 0.10237,-0.23878 0.27164,-0.39025 0.50771,-0.45445 0,0 1.11958,-0.30443 1.11958,-0.30443 0,0 0,-18.34278 0,-18.34278 0,0 -0.83646,0.20956 -0.83646,0.20956 -0.23592,0.0591 -0.40507,-0.004 -0.50738,-0.18919 -0.10234,-0.18526 -0.15352,-0.4449 -0.15351,-0.77884 -10e-6,-0.31633 0.0512,-0.59268 0.15351,-0.829 0.10231,-0.23622 0.27146,-0.38357 0.50738,-0.44208 0,0 1.82397,-0.4522 1.82397,-0.4522"
inkscape:connector-curvature="0" />
<path
id="path14759"
d="m 329.72799,233.35924 c 0,0 5.13345,-1.27269 5.13345,-1.27269 0.22371,-0.0554 0.38397,0.007 0.48085,0.18852 0.0968,0.18111 0.14525,0.43402 0.14526,0.75877 -10e-6,0.30771 -0.0485,0.57622 -0.14526,0.80555 -0.0969,0.22944 -0.25714,0.37217 -0.48085,0.4282 0,0 -5.13345,1.28608 -5.13345,1.28608 0,0 0,14.43158 0,14.43158 -10e-6,1.25643 0.21891,2.24711 0.65643,2.97148 0.44458,0.72157 1.09178,0.96605 1.94066,0.73436 0.6374,-0.17396 1.32621,-0.5761 2.06616,-1.20576 0.73864,-0.64564 1.31224,-1.29704 1.72148,-1.95454 0.1487,-0.2622 0.27135,-0.40633 0.36797,-0.43241 0.11885,-0.0321 0.22284,0.0507 0.31196,0.24856 0.0891,0.18071 0.13361,0.41608 0.13362,0.70616 -10e-6,0.25597 -0.0483,0.50799 -0.14476,0.75609 -0.23768,0.62804 -0.81757,1.40124 -1.74108,2.32087 -0.91812,0.90249 -1.8008,1.47097 -2.64781,1.70434 -1.10446,0.30428 -1.98559,-0.0463 -2.64198,-1.05341 -0.65743,-1.00874 -0.98654,-2.52169 -0.98653,-4.53773 0,0 0,-14.44811 0,-14.44811 0,0 -1.76335,0.44177 -1.76335,0.44177 -0.22807,0.0572 -0.39159,-0.006 -0.4905,-0.18811 -0.0989,-0.18257 -0.1484,-0.43805 -0.14839,-0.7664 -1e-5,-0.31102 0.0494,-0.58251 0.14839,-0.81445 0.0989,-0.23183 0.26243,-0.37601 0.4905,-0.43258 0,0 1.76335,-0.43717 1.76335,-0.43717 0,0 0,-6.4099 0,-6.4099 -1e-5,-0.51689 0.0454,-0.89822 0.13621,-1.14394 0.0908,-0.24561 0.20423,-0.38466 0.34033,-0.41716 0.14361,-0.0342 0.26073,0.0498 0.35139,0.25184 0.0906,0.20213 0.13594,0.56133 0.13595,1.07763 0,0 0,6.40256 0,6.40256"
inkscape:connector-curvature="0" />
<path
id="path14761"
d="m 347.92414,250.72178 c 0,0 0,-3.05626 0,-3.05626 -1.32486,2.95612 -2.74493,4.64604 -4.26117,5.06378 -1.10424,0.30423 -1.9692,-0.10219 -2.59338,-1.22112 -0.62513,-1.1376 -0.93805,-2.65046 -0.93805,-4.53728 0,-2.07378 0.41226,-3.99242 1.23557,-5.75329 0.82167,-1.75736 2.01824,-2.83768 3.58648,-3.24242 0.42203,-0.10891 0.87997,-0.15956 1.37368,-0.15206 0.49311,-0.009 1.02545,0.0469 1.59687,0.16843 0,0 0,-3.43514 0,-3.43514 -1e-5,-1.16186 -0.23137,-2.11384 -0.69447,-2.85657 -0.46365,-0.7435 -1.16008,-0.99968 -2.09048,-0.76745 -0.71376,0.17817 -1.7173,0.9112 -3.01271,2.20186 -0.23464,0.22862 -0.38501,0.35128 -0.45105,0.36788 -0.11743,0.0296 -0.22021,-0.0464 -0.30832,-0.22792 -0.0808,-0.18338 -0.12119,-0.42787 -0.12118,-0.73345 -10e-6,-0.28856 0.0367,-0.52691 0.11017,-0.715 0.10279,-0.2802 0.51741,-0.73128 1.24291,-1.35247 1.14063,-0.994 2.00133,-1.56201 2.58384,-1.70592 1.1553,-0.28533 2.05404,0.15837 2.69792,1.32913 0.64285,1.15216 0.9639,2.56014 0.96391,4.22531 0,0 0,14.02795 0,14.02795 0,0 1.20981,-0.32897 1.20981,-0.32897 0.22283,-0.0606 0.38091,-0.003 0.4743,0.17316 0.0933,0.15921 0.14002,0.39824 0.14004,0.7171 -2e-5,0.3021 -0.0467,0.56663 -0.14004,0.79361 -0.0934,0.22705 -0.25147,0.37117 -0.4743,0.43233 0,0 -2.13035,0.58478 -2.13035,0.58478 m 0,-10.558 c -0.42669,-0.17475 -0.87915,-0.26722 -1.35749,-0.27728 -0.47891,-0.0101 -0.9838,0.054 -1.51479,0.19244 -1.33413,0.34776 -2.37964,1.28966 -3.13434,2.82696 -0.57244,1.15204 -0.85896,2.42481 -0.85896,3.81711 0,1.29044 0.21674,2.31854 0.64989,3.0837 0.44002,0.76238 1.07722,1.02935 1.9107,0.80187 0.79534,-0.21708 1.53095,-0.78111 2.20715,-1.69129 0.68232,-0.92751 1.38163,-2.28814 2.09784,-4.08071 0,0 0,-4.6728 0,-4.6728"
inkscape:connector-curvature="0" />
<path
id="path14763"
d="m 358.9208,215.38083 c 0,0 0,5.40783 0,5.40783 0,0 -1.31083,0.31638 -1.31083,0.31638 0,0 0,-5.41657 0,-5.41657 0,0 1.31083,-0.30764 1.31083,-0.30764 m 0.0317,10.73306 c 0,0 0,19.48737 0,19.48737 0,0 3.46775,-0.94294 3.46775,-0.94294 0.21618,-0.0588 0.36953,-0.001 0.46013,0.17246 0.0906,0.15719 0.13584,0.39281 0.13585,0.70687 -1e-5,0.29756 -0.0453,0.5579 -0.13585,0.7811 -0.0906,0.22326 -0.24395,0.36455 -0.46013,0.42389 0,0 -7.86049,2.15769 -7.86049,2.15769 -0.21341,0.0586 -0.36643,3.5e-4 -0.45897,-0.17483 -0.0926,-0.1752 -0.13887,-0.41325 -0.13887,-0.71413 0,-0.31759 0.0463,-0.58094 0.13887,-0.79001 0.0925,-0.22573 0.24556,-0.36759 0.45897,-0.42562 0,0 3.50529,-0.95316 3.50529,-0.95316 0,0 0,-17.38816 0,-17.38816 0,0 -2.59952,0.65125 -2.59952,0.65125 -0.21294,0.0534 -0.36917,-0.008 -0.46862,-0.1831 -0.0924,-0.17722 -0.13856,-0.41614 -0.13855,-0.71671 -1e-5,-0.31722 0.0462,-0.58749 0.13855,-0.81081 0.0924,-0.22321 0.24857,-0.36209 0.46862,-0.41667 0,0 3.48697,-0.86449 3.48697,-0.86449"
inkscape:connector-curvature="0" />
<path
id="path14765"
d="m 368.46442,223.75567 c 0,0 0,3.12776 0,3.12776 0.60425,-1.6123 1.14936,-2.75688 1.63557,-3.43494 0.4856,-0.67719 1.03206,-1.09054 1.63914,-1.24051 0.65376,-0.16146 1.24872,0.0263 1.78514,0.56245 0.37979,0.39496 0.72197,1.12482 1.02665,2.18925 0.31119,1.04566 0.4667,2.16256 0.46671,3.35132 0,0 0,12.92183 0,12.92183 0,0 0.71929,-0.19559 0.71929,-0.19559 0.20237,-0.055 0.34735,0.003 0.43499,0.17441 0.0876,0.155 0.13141,0.38695 0.13142,0.69584 -1e-5,0.29266 -0.0438,0.54854 -0.13142,0.76765 -0.0876,0.21918 -0.23262,0.35655 -0.43499,0.4121 0,0 -2.28391,0.62693 -2.28391,0.62693 -0.21044,0.0578 -0.35985,8.6e-4 -0.44816,-0.17084 -0.0883,-0.17172 -0.13252,-0.40454 -0.13251,-0.69846 -1e-5,-0.31023 0.0442,-0.56721 0.13251,-0.77087 0.0883,-0.21993 0.23772,-0.3585 0.44816,-0.41572 0,0 0.71195,-0.19359 0.71195,-0.19359 0,0 0,-12.59334 0,-12.59334 0,-1.45086 -0.22023,-2.61784 -0.66105,-3.50168 -0.44133,-0.90112 -1.03277,-1.25955 -1.77501,-1.0743 -0.56613,0.14133 -1.05787,0.54243 -1.47496,1.20365 -0.41753,0.64556 -1.01377,2.15684 -1.78952,4.5368 0,0 0,12.97896 0,12.97896 0,0 0.97803,-0.26595 0.97803,-0.26595 0.20559,-0.0559 0.35287,0.002 0.4419,0.17485 0.089,0.15603 0.1335,0.38972 0.1335,0.70106 0,0.29497 -0.0445,0.55297 -0.1335,0.77401 -0.089,0.2211 -0.23631,0.35987 -0.4419,0.41631 0,0 -2.82735,0.7761 -2.82735,0.7761 -0.20715,0.0569 -0.35568,-0.001 -0.44551,-0.17409 -0.0899,-0.17297 -0.13479,-0.40769 -0.13479,-0.70413 0,-0.31289 0.0449,-0.57216 0.13479,-0.77778 0.0898,-0.22202 0.23836,-0.36119 0.44551,-0.41752 0,0 0.98254,-0.26717 0.98254,-0.26717 0,0 0,-17.18426 0,-17.18426 0,0 -0.73409,0.18391 -0.73409,0.18391 -0.20703,0.0519 -0.35546,-0.01 -0.44524,-0.18475 -0.0898,-0.17506 -0.13471,-0.41902 -0.13471,-0.73184 0,-0.29632 0.0449,-0.55442 0.13471,-0.7743 0.0898,-0.21977 0.23821,-0.35532 0.44524,-0.40667 0,0 1.60087,-0.39689 1.60087,-0.39689"
inkscape:connector-curvature="0" />
<path
id="path14767"
d="m 388.11235,229.76789 c 0,0 -8.48758,2.22224 -8.48758,2.22224 0.14697,2.60006 0.60091,4.60711 1.36077,6.01981 0.76503,1.39207 1.70765,1.93407 2.82657,1.62868 0.62097,-0.16949 1.27063,-0.59601 1.94883,-1.27892 0.67702,-0.6817 1.22829,-1.48892 1.65434,-2.42175 0.12444,-0.27395 0.23249,-0.42323 0.32414,-0.44789 0.10471,-0.0282 0.19631,0.0513 0.27482,0.23843 0.0785,0.17107 0.11771,0.39273 0.11772,0.665 -10e-6,0.27228 -0.0523,0.55072 -0.15697,0.83539 -0.31413,0.88653 -0.87429,1.79282 -1.68153,2.71981 -0.80235,0.91103 -1.62941,1.48439 -2.48135,1.71911 -1.43066,0.39416 -2.63019,-0.41452 -3.59644,-2.43084 -0.96193,-2.03924 -1.44377,-4.68961 -1.44377,-7.94738 0,-2.96601 0.45175,-5.62524 1.35369,-7.97367 0.90655,-2.34471 2.02355,-3.67918 3.34919,-4.00664 1.36076,-0.33608 2.47689,0.47235 3.35047,2.42115 0.87162,1.92849 1.30016,4.60654 1.2871,8.03747 m -0.83466,-1.82578 c -0.16388,-2.18666 -0.59682,-3.88887 -1.29971,-5.10755 -0.69758,-1.2225 -1.5317,-1.71355 -2.5032,-1.47106 -0.97392,0.24311 -1.81394,1.14718 -2.51921,2.71386 -0.70654,1.5695 -1.1471,3.51858 -1.32078,5.8459 0,0 7.6429,-1.98115 7.6429,-1.98115"
inkscape:connector-curvature="0" />
<path
id="path14769"
d="m 394.65863,217.26158 c 0,0 0,5.05071 0,5.05071 1.05317,-2.61538 1.83796,-4.31797 2.35603,-5.11227 0.52374,-0.81061 1.00534,-1.26991 1.44497,-1.37865 0.47726,-0.11799 0.91902,0.17532 1.32537,0.87929 0.41225,0.68589 0.61821,1.23352 0.61822,1.64339 -10e-6,0.29956 -0.0412,0.56219 -0.12356,0.78788 -0.0761,0.20844 -0.17434,0.32787 -0.29482,0.35828 -0.0634,0.016 -0.11736,0.006 -0.16176,-0.0302 -0.0444,-0.0519 -0.12694,-0.21251 -0.24755,-0.48199 -0.2223,-0.49656 -0.41611,-0.82689 -0.58139,-0.99082 -0.16538,-0.16396 -0.32763,-0.22611 -0.48676,-0.18636 -0.35034,0.0875 -0.77435,0.54152 -1.27228,1.36266 -0.49218,0.82062 -1.35019,2.74163 -2.57647,5.76941 0,0 0,10.95911 0,10.95911 0,0 3.57169,-0.97122 3.57169,-0.97122 0.19745,-0.0537 0.33753,0.003 0.42029,0.17013 0.0827,0.15127 0.12408,0.37699 0.12409,0.67715 -10e-6,0.28439 -0.0414,0.53269 -0.12409,0.74496 -0.0828,0.21232 -0.22284,0.34558 -0.42029,0.39978 0,0 -6.34991,1.74303 -6.34991,1.74303 -0.19434,0.0533 -0.33368,0.004 -0.41796,-0.14841 -0.0843,-0.16829 -0.12645,-0.396 -0.12645,-0.68312 0,-0.27115 0.0389,-0.50507 0.11673,-0.70172 0.0843,-0.21431 0.22686,-0.34878 0.42768,-0.40341 0,0 1.96714,-0.53508 1.96714,-0.53508 0,0 0,-16.69431 0,-16.69431 0,0 -1.5011,0.37607 -1.5011,0.37607 -0.19412,0.0486 -0.33329,-0.0121 -0.41746,-0.18232 -0.0842,-0.17019 -0.1263,-0.40677 -0.1263,-0.70967 0,-0.28692 0.0389,-0.53569 0.11658,-0.7463 0.0842,-0.21212 0.22659,-0.34304 0.42718,-0.3928 0,0 2.31218,-0.57324 2.31218,-0.57324"
inkscape:connector-curvature="0" />
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer6"
@ -922,64 +1095,7 @@
d="m 133.59629,56.078359 119.50583,10.663536 0,64.052605 -119.50583,-22.31404 z" />
</g>
<g
id="text5935"
style="font-size:40px;font-style:italic;font-variant:normal;font-weight:500;font-stretch:normal;text-align:center;line-height:88.99999857%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Futura;-inkscape-font-specification:Futura Medium Italic"
transform="matrix(0.82611672,0,0,0.82611672,33.620121,15.579543)">
<path
id="path5944"
d="m 153.83888,67.902732 c 0,0 -8.49364,12.847003 -8.49364,12.847003 0,0 -2.61139,-8.338168 -2.61139,-8.338168 0,0 -4.57259,7.39592 -4.57259,7.39592 0,0 -4.56493,-14.065601 -4.56493,-14.065601 0,0 3.1018,0.33111 3.1018,0.33111 0,0 2.23127,7.74856 2.23127,7.74856 0,0 4.57156,-7.36476 4.57156,-7.36476 0,0 2.48012,8.212597 2.48012,8.212597 0,0 4.3089,-7.145498 4.3089,-7.145498 0,0 3.5489,0.378837 3.5489,0.378837"
inkscape:connector-curvature="0" />
<path
id="path5946"
d="m 159.48544,68.50549 c 0,0 -0.14506,1.081269 -0.14506,1.081269 1.08487,-0.840755 2.18357,-1.203434 3.29625,-1.085323 0.97953,0.104001 1.8738,0.531365 2.68199,1.28339 0,0 -2.07994,2.256579 -2.07994,2.256579 -0.59715,-0.539033 -1.19307,-0.84117 -1.78775,-0.907144 -0.40876,-0.04533 -0.76837,-0.0083 -1.07903,0.110906 -0.31032,0.110074 -0.58159,0.314687 -0.81388,0.613752 -0.22246,0.290909 -0.41092,0.680177 -0.56546,1.167777 -0.14482,0.48847 -0.26061,1.079247 -0.34742,1.772359 0,0 -0.83785,6.248278 -0.83785,6.248278 0,0 -3.17048,-0.408479 -3.17048,-0.408479 0,0 1.65969,-12.473776 1.65969,-12.473776 0,0 3.18894,0.340412 3.18894,0.340412"
inkscape:connector-curvature="0" />
<path
id="path5948"
d="m 172.11804,63.653761 c -1e-5,0.442892 -0.17671,0.808538 -0.52981,1.096682 -0.35269,0.287833 -0.77536,0.407208 -1.2677,0.358444 -0.49153,-0.04865 -0.91718,-0.256105 -1.27725,-0.622096 -0.34966,-0.382881 -0.52433,-0.798829 -0.52434,-1.248191 0,-0.449323 0.16967,-0.813819 0.50932,-1.093731 0.35004,-0.288441 0.76564,-0.410358 1.24707,-0.365433 0.49226,0.04598 0.9199,0.256324 1.28263,0.631329 0.37326,0.367241 0.56007,0.781688 0.56008,1.242996 m -1.04355,6.088833 c 0,0 -1.74605,12.789101 -1.74605,12.789101 0,0 -3.29826,-0.42494 -3.29826,-0.42494 0,0 1.72648,-12.718331 1.72648,-12.718331 0,0 3.31783,0.35417 3.31783,0.35417"
inkscape:connector-curvature="0" />
<path
id="path5950"
d="m 179.01592,73.460646 c 0,0 -1.40778,10.137791 -1.40778,10.137791 0,0 -3.39162,-0.436971 -3.39162,-0.436971 0,0 1.39178,-10.080958 1.39178,-10.080958 0,0 -1.91023,-0.213095 -1.91023,-0.213095 0,0 0.38104,-2.804082 0.38104,-2.804082 0,0 1.91269,0.204175 1.91269,0.204175 0,0 0.83006,-6.00759 0.83006,-6.00759 0,0 3.4216,0.330185 3.4216,0.330185 0,0 -0.83963,6.041632 -0.83963,6.041632 0,0 3.18456,0.339944 3.18456,0.339944 0,0 -0.39206,2.843759 -0.39206,2.843759 0,0 -3.18041,-0.35479 -3.18041,-0.35479"
inkscape:connector-curvature="0" />
<path
id="path5952"
d="m 200.09628,72.840604 c 0,0 -1.92201,13.407533 -1.92201,13.407533 0,0 -3.62916,-0.467574 -3.62916,-0.467574 0,0 0.21229,-1.438465 0.21229,-1.438465 -1.54259,0.989936 -3.13133,1.376921 -4.76545,1.165541 -1.99844,-0.258505 -3.61848,-1.068102 -4.86609,-2.425845 -1.24247,-1.352149 -1.8618,-2.975618 -1.86182,-4.874587 -2e-5,-2.19038 0.70861,-3.906541 2.1309,-5.152891 1.45025,-1.249951 3.31827,-1.756081 5.61179,-1.512503 1.08847,0.115618 2.01837,0.372012 2.78823,0.769622 0.78266,0.399806 1.58371,1.032558 2.40329,1.899222 0,0 0.24627,-1.759869 0.24627,-1.759869 0,0 3.65176,0.389816 3.65176,0.389816 m -4.43914,5.916099 c -2e-5,-1.199313 -0.393,-2.217808 -1.17742,-3.05388 -0.78244,-0.843484 -1.79012,-1.332653 -3.0208,-1.468712 -1.33304,-0.147352 -2.44657,0.189847 -3.34298,1.009297 -0.89377,0.826514 -1.33967,1.910207 -1.33965,3.252913 0,1.172514 0.37155,2.177587 1.11602,3.016769 0.74629,0.841254 1.7085,1.336241 2.8887,1.483838 1.3143,0.164372 2.45544,-0.165971 3.42144,-0.99352 0.96902,-0.84934 1.45469,-1.932246 1.45469,-3.246705"
inkscape:connector-curvature="0" />
<path
id="path5954"
d="m 210.59369,62.948857 c 0,0 -1.76559,12.102809 -1.76559,12.102809 0.99306,-0.529993 1.85742,-0.864422 2.59199,-1.002271 0.77082,-0.144321 1.60707,-0.168814 2.50926,-0.07301 2.23174,0.237044 4.08602,1.090293 5.55608,2.56358 1.47683,1.470144 2.21784,3.222946 2.21788,5.253295 1e-5,2.230397 -0.8416,3.981762 -2.51819,5.249095 -1.67957,1.279068 -3.71714,1.760708 -6.10579,1.451727 -2.21017,-0.285894 -4.13141,-1.259787 -5.76887,-2.916662 0,0 -0.27205,1.812753 -0.27205,1.812753 0,0 -3.734,-0.481081 -3.734,-0.481081 0,0 3.51282,-24.297211 3.51282,-24.297211 0,0 3.77646,0.336974 3.77646,0.336974 m 7.18134,18.458814 c -3e-5,-1.252477 -0.4394,-2.326274 -1.31629,-3.219543 -0.8745,-0.890788 -2.00772,-1.412305 -3.39688,-1.565883 -1.49808,-0.165597 -2.73151,0.1696 -3.70334,1.003067 -0.96885,0.811323 -1.45213,1.945103 -1.45212,3.403219 2e-5,1.223263 0.41506,2.257404 1.24678,3.10411 0.83392,0.8686 1.92249,1.387638 3.26835,1.55592 1.49058,0.186383 2.74974,-0.136303 3.77469,-0.970743 1.05167,-0.834302 1.57881,-1.938376 1.57881,-3.310147"
inkscape:connector-curvature="0" />
<path
id="path5956"
d="m 232.93555,64.942427 c 0,0 -3.79346,25.295545 -3.79346,25.295545 0,0 -4.00189,-0.515597 -4.00189,-0.515597 0,0 3.76476,-25.139598 3.76476,-25.139598 0,0 4.03059,0.35965 4.03059,0.35965"
inkscape:connector-curvature="0" />
<path
id="path5958"
d="m 239.07676,85.477198 c 1e-5,1.068436 0.45116,2.002121 1.35531,2.802708 0.91923,0.804368 2.09404,1.296834 3.52714,1.476294 1.97588,0.247435 3.50087,-0.165051 4.56866,-1.241156 0,0 3.20459,1.821904 3.20459,1.821904 -1.11699,1.073416 -2.26255,1.773857 -3.43638,2.10314 -1.18258,0.336864 -2.65489,0.390514 -4.41308,0.162756 -2.77115,-0.358979 -4.96266,-1.305345 -6.58587,-2.835657 -1.61521,-1.522765 -2.41984,-3.383769 -2.41987,-5.588642 -3e-5,-2.306935 0.88512,-4.137105 2.66268,-5.496037 1.77472,-1.357381 4.03193,-1.893987 6.78151,-1.60249 2.68277,0.284445 4.81243,1.219511 6.37815,2.809048 1.59911,1.610417 2.40156,3.625163 2.40163,6.038461 -3e-5,0.251826 -0.0196,0.658706 -0.0588,1.220604 0,0 -13.9657,-1.670933 -13.9657,-1.670933 m 9.66373,-1.627103 c -0.45104,-2.323059 -1.99908,-3.629393 -4.62888,-3.919627 -2.4703,-0.272608 -4.06924,0.672373 -4.8094,2.829777 0,0 9.43828,1.08985 9.43828,1.08985"
inkscape:connector-curvature="0" />
<path
id="path5960"
d="m 159.44201,83.06886 c 0,0 -2.98737,22.36088 -2.98737,22.36088 0,0 -3.15565,-0.54145 -3.15565,-0.54145 0,0 2.96891,-22.238329 2.96891,-22.238329 0,0 3.17411,0.418899 3.17411,0.418899"
inkscape:connector-curvature="0" />
<path
id="path5962"
d="m 176.52978,95.739649 c 0,0 -1.77849,12.829461 -1.77849,12.829461 0,0 -3.35926,-0.57638 -3.35926,-0.57638 0,0 0.19654,-1.37669 0.19654,-1.37669 -1.4283,0.89866 -2.89961,1.2156 -4.41324,0.95511 -1.85149,-0.31864 -3.35276,-1.15466 -4.5091,-2.50553 -1.15176,-1.3455 -1.72593,-2.93049 -1.72594,-4.75897 -2e-5,-2.109076 0.65694,-3.736288 1.97537,-4.885562 1.3441,-1.151542 3.07504,-1.57194 5.19969,-1.255482 1.00813,0.150176 1.86927,0.430138 2.58214,0.840229 0.72466,0.412634 1.46626,1.050011 2.22494,1.913032 0,0 0.22797,-1.684407 0.22797,-1.684407 0,0 3.37938,0.505189 3.37938,0.505189 m -4.10825,5.533921 c -2e-5,-1.15392 -0.36381,-2.14778 -1.09003,-2.980058 -0.72446,-0.839417 -1.65756,-1.345968 -2.79733,-1.520697 -1.23475,-0.189261 -2.26634,0.09566 -3.09688,0.852554 -0.8282,0.763868 -1.24141,1.791281 -1.24139,3.083861 0,1.12875 0.34431,2.10939 1.03417,2.94341 0.69147,0.836 1.58293,1.34622 2.67619,1.52967 1.2173,0.20427 2.27406,-0.0736 3.16851,-0.83603 0.89715,-0.78318 1.34676,-1.80802 1.34676,-3.07271"
inkscape:connector-curvature="0" />
<path
id="path5964"
d="m 195.82123,98.623555 c 0,0 -13.67153,18.801495 -13.67153,18.801495 0,0 -3.92324,-0.72275 -3.92324,-0.72275 0,0 5.91998,-8.17342 5.91998,-8.17342 0,0 -5.26986,-12.438405 -5.26986,-12.438405 0,0 3.68066,0.550227 3.68066,0.550227 0,0 3.67874,9.080848 3.67874,9.080848 0,0 5.46568,-7.713835 5.46568,-7.713835 0,0 4.11957,0.61584 4.11957,0.61584"
inkscape:connector-curvature="0" />
<path
id="path5966"
d="m 200.49583,107.30031 c 10e-6,1.00571 0.39972,1.89861 1.20069,2.68021 0.8142,0.7855 1.85458,1.28526 3.1234,1.49839 1.74884,0.29375 3.09819,-0.0472 4.04278,-1.02632 0,0 2.83375,1.81217 2.83375,1.81217 -0.98755,0.97496 -2.00057,1.5985 -3.0388,1.87223 -1.04617,0.28064 -2.34899,0.28605 -3.9052,0.0179 -2.45382,-0.42276 -4.39522,-1.38083 -5.83367,-2.87148 -1.43178,-1.48374 -2.14519,-3.26113 -2.14521,-5.33734 -2e-5,-2.17231 0.78478,-3.86759 2.36043,-5.09052 1.57263,-1.221165 3.5721,-1.654065 6.00661,-1.29191 2.37422,0.353213 4.25813,1.30051 5.6427,2.84497 1.41372,1.56471 2.12298,3.48409 2.12303,5.75287 -2e-5,0.23675 -0.0173,0.61866 -0.0519,1.14569 0,0 -12.35857,-2.0069 -12.35857,-2.0069 m 8.55495,-1.22843 c -0.39896,-2.19902 -1.76849,-3.47665 -4.09592,-3.833 -2.18726,-0.33486 -3.60353,0.50381 -4.25927,2.51108 0,0 8.35519,1.32192 8.35519,1.32192"
inkscape:connector-curvature="0" />
<path
id="path5968"
d="m 222.18466,102.56466 c 0,0 -0.17825,1.18915 -0.17825,1.18915 1.3334,-0.86103 2.68436,-1.19131 4.05308,-0.98751 1.20542,0.1795 2.30628,0.71229 3.30152,1.59991 0,0 -2.56067,2.36656 -2.56067,2.36656 -0.7348,-0.63744 -1.46792,-1.01191 -2.19936,-1.12432 -0.50266,-0.0772 -0.94483,-0.0599 -1.32674,0.0518 -0.38147,0.10156 -0.71487,0.31051 -1.00037,0.62671 -0.27337,0.30779 -0.50495,0.72683 -0.69483,1.25708 -0.17792,0.53184 -0.32018,1.17898 -0.42683,1.94144 0,0 -1.02913,6.86861 -1.02913,6.86861 0,0 -3.89147,-0.66771 -3.89147,-0.66771 0,0 2.03647,-13.70721 2.03647,-13.70721 0,0 3.91658,0.58549 3.91658,0.58549"
inkscape:connector-curvature="0" />
</g>
<g
transform="matrix(0.70185341,0,0,0.70185341,118.30543,27.168909)"
transform="matrix(0.70185341,0,0,0.70185341,103.7893,28.378586)"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
id="text6476">
<path
@ -1000,7 +1116,7 @@
id="path6489" />
<path
inkscape:connector-curvature="0"
d="m 426.78356,107.09258 c 0,0 0,-1.88162 0,-1.88162 -1.29426,1.23241 -2.72793,2.21052 -4.30255,2.93345 -1.58097,0.75218 -3.02296,1.21187 -4.32438,1.37727 -2.84033,0.36091 -5.16206,-0.50088 -6.95591,-2.59442 -1.80197,-2.1297 -2.706,-4.61561 -2.706,-7.450523 0,-3.449995 1.14945,-6.766286 3.43846,-9.93519 2.29325,-3.179053 5.43363,-4.95254 9.40099,-5.331327 1.57921,-0.150749 3.39679,-0.06225 5.44939,0.26374 0,0 0,-1.920817 0,-1.920817 -1e-5,-1.202127 -0.33577,-2.151503 -1.00813,-2.849026 -0.6567,-0.700183 -1.92263,-0.967515 -3.80372,-0.800477 -1.5489,0.137578 -3.56646,0.792207 -6.05983,1.968997 -0.9326,0.429384 -1.65947,0.668141 -2.17946,0.715577 -0.71179,0.06498 -1.32039,-0.265367 -1.82538,-0.991816 -0.48819,-0.755544 -0.7325,-1.746725 -0.7325,-2.972869 0,-0.693 0.0873,-1.300079 0.26176,-1.821128 0.17441,-0.520739 0.41846,-0.940499 0.73202,-1.259265 0.31331,-0.345082 0.96525,-0.770689 1.95416,-1.276103 1.31474,-0.663016 2.65095,-1.206818 4.00842,-1.631975 1.3528,-0.449995 2.5732,-0.717309 3.66242,-0.802899 3.23272,-0.253864 5.71949,0.634365 7.47424,2.656278 1.76343,1.985514 2.64219,4.831201 2.64221,8.543807 0,0 0,16.434219 0,16.434219 0,0 0.8685,-0.09997 0.8685,-0.09997 1.22086,-0.140526 2.0847,0.135063 2.5939,0.825754 0.52488,0.662055 0.78706,1.586611 0.78708,2.774351 -2e-5,1.16192 -0.2622,2.14952 -0.78708,2.96365 -0.5092,0.78731 -1.37304,1.2577 -2.5939,1.41076 0,0 -5.99471,0.75157 -5.99471,0.75157 m 0,-14.386544 c -2.06948,-0.40743 -3.98883,-0.518817 -5.75577,-0.331915 -2.13431,0.225806 -3.97905,1.227956 -5.53012,3.010736 -0.96819,1.140564 -1.45318,2.243056 -1.45316,3.305406 -2e-5,0.770223 0.23388,1.367567 0.70129,1.791657 0.86409,0.77522 2.04484,1.07465 3.53944,0.90007 1.26684,-0.14798 2.69144,-0.69613 4.27211,-1.641973 1.59121,-0.943971 2.9993,-2.138927 4.22621,-3.584347 0,0 0,-3.449634 0,-3.449634"
d="m 426.78356,107.09258 c 0,0 0,-1.88162 0,-1.88162 -1.29426,1.23241 -2.72793,2.21052 -4.30255,2.93345 -1.58097,0.75218 -3.02296,1.21187 -4.32438,1.37727 -2.84033,0.36091 -5.16206,-0.50088 -6.95591,-2.59442 -1.80197,-2.1297 -2.706,-4.61561 -2.706,-7.450523 0,-3.449995 1.14945,-6.766286 3.43846,-9.93519 2.29325,-3.179053 5.43363,-4.95254 9.40099,-5.331327 1.57921,-0.150749 3.39679,-0.06225 5.44939,0.26374 0,0 0,-1.920817 0,-1.920817 -1e-5,-1.202127 -0.33577,-2.151503 -1.00813,-2.849026 -0.6567,-0.700183 -1.92263,-0.967515 -3.80372,-0.800477 -1.5489,0.137578 -3.56646,0.792207 -6.05983,1.968997 -0.9326,0.429384 -1.65947,0.668141 -2.17946,0.715577 -0.71179,0.06498 -1.32039,-0.265367 -1.82538,-0.991816 -0.48819,-0.755544 -0.7325,-1.746725 -0.7325,-2.972869 0,-0.693 0.0873,-1.300079 0.26176,-1.821128 0.17441,-0.520739 0.41846,-0.940499 0.73202,-1.259265 0.31331,-0.345082 0.96525,-0.770689 1.95416,-1.276103 1.31474,-0.663016 2.65095,-1.206818 4.00842,-1.631975 1.3528,-0.449995 2.5732,-0.717309 3.66242,-0.802899 3.23272,-0.253864 5.71949,0.634365 7.47424,2.656278 1.76343,1.985514 2.64219,4.831201 2.64221,8.543807 0,0 0,16.434219 0,16.434219 0,0 0.8685,-0.09997 0.8685,-0.09997 1.22086,-0.140526 2.0847,0.135063 2.5939,0.825754 0.52488,0.662055 0.78706,1.586613 0.78708,2.774353 -2e-5,1.16192 -0.2622,2.14952 -0.78708,2.96365 -0.5092,0.78731 -1.37304,1.2577 -2.5939,1.41076 0,0 -5.99471,0.75157 -5.99471,0.75157 m 0,-14.386546 c -2.06948,-0.40743 -3.98883,-0.518817 -5.75577,-0.331915 -2.13431,0.225806 -3.97905,1.227956 -5.53012,3.010736 -0.96819,1.140564 -1.45318,2.243056 -1.45316,3.305406 -2e-5,0.770223 0.23388,1.367569 0.70129,1.791659 0.86409,0.77522 2.04484,1.07465 3.53944,0.90007 1.26684,-0.14798 2.69144,-0.69613 4.27211,-1.641975 1.59121,-0.943971 2.9993,-2.138927 4.22621,-3.584347 0,0 0,-3.449634 0,-3.449634"
id="path6491" />
<path
inkscape:connector-curvature="0"
@ -1019,54 +1135,127 @@
d="m 529.26714,63.310804 c 0,0 0,4.360627 0,4.360627 1.63097,-2.247844 2.90878,-3.756252 3.83736,-4.531717 0.93851,-0.774258 1.81212,-1.192426 2.62133,-1.256017 1.24109,-0.09744 2.44062,0.637677 3.59899,2.201052 0.78636,1.052813 1.17886,2.159045 1.17888,3.320496 -2e-5,0.982826 -0.19008,1.837577 -0.5705,2.564837 -0.36861,0.704643 -0.8176,1.081739 -1.34729,1.13078 -0.46884,0.04344 -0.96305,-0.337016 -1.48272,-1.142328 -0.52052,-0.806521 -0.98594,-1.192073 -1.39602,-1.155672 -0.53514,0.04754 -1.33941,0.727598 -2.41476,2.043211 -1.06624,1.318692 -2.40692,3.27905 -4.02527,5.887282 0,0 0,10.526834 0,10.526834 0,0 5.50612,-0.63378 5.50612,-0.63378 0.92146,-0.106064 1.57368,0.14475 1.95822,0.751703 0.39645,0.582377 0.59451,1.389478 0.59453,2.421834 -2e-5,1.009903 -0.19808,1.864635 -0.59453,2.564818 -0.38454,0.676972 -1.03676,1.073391 -1.95822,1.188916 0,0 -11.77989,1.476871 -11.77989,1.476871 -0.95657,0.119927 -1.64331,-0.115635 -2.05861,-0.707472 -0.40281,-0.617169 -0.60438,-1.455248 -0.60438,-2.513711 0,-1.035437 0.20157,-1.898985 0.60438,-2.590038 0.4153,-0.714702 1.10204,-1.126896 2.05861,-1.237002 0,0 2.35416,-0.270974 2.35416,-0.270974 0,0 0,-17.063345 0,-17.063345 0,0 -1.426,0.128571 -1.426,0.128571 -0.95398,0.08605 -1.63887,-0.173426 -2.05304,-0.779149 -0.40171,-0.630509 -0.60275,-1.474561 -0.60274,-2.531606 -10e-6,-1.034031 0.20103,-1.889297 0.60274,-2.565222 0.41417,-0.699049 1.09906,-1.086463 2.05304,-1.162716 0,0 5.34561,-0.427083 5.34561,-0.427083"
id="path6499" />
</g>
<g
transform="matrix(0.86745158,0,0,0.86745158,24.966041,10.718461)"
style="font-size:40px;font-style:italic;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Futura;-inkscape-font-specification:Futura Medium Italic"
id="text10906">
<path
inkscape:connector-curvature="0"
d="m 153.83888,80.580698 c 0,0 -8.49369,30.064162 -8.49369,30.064162 0,0 -2.61138,-18.595363 -2.61138,-18.595363 0,0 -4.57263,17.271913 -4.57263,17.271913 0,0 -4.56489,-31.350308 -4.56489,-31.350308 0,0 3.1018,0.399872 3.1018,0.399872 0,0 2.23125,17.302482 2.23125,17.302482 0,0 4.5716,-17.201161 4.5716,-17.201161 0,0 2.48011,18.325657 2.48011,18.325657 0,0 4.30892,-16.674766 4.30892,-16.674766 0,0 3.54891,0.457512 3.54891,0.457512"
id="path10913" />
<path
inkscape:connector-curvature="0"
d="m 159.48545,81.308632 c 0,0 -0.14506,2.466001 -0.14506,2.466001 1.08487,-2.027243 2.18358,-2.972954 3.29626,-2.831021 0.97953,0.125009 1.8738,0.992223 2.68199,2.604674 0,0 -2.07993,5.347173 -2.07993,5.347173 -0.59716,-1.153753 -1.19308,-1.770955 -1.78777,-1.853275 -0.40876,-0.05653 -0.76837,0.06793 -1.07902,0.373103 -0.31033,0.284418 -0.58159,0.778602 -0.81389,1.482374 -0.22246,0.684173 -0.41092,1.58735 -0.56546,2.709458 -0.14482,1.12299 -0.26061,2.474469 -0.34742,4.054536 0,0 -0.83785,14.250185 -0.83785,14.250185 0,0 -3.1705,-0.5674 -3.1705,-0.5674 0,0 1.65971,-28.446914 1.65971,-28.446914 0,0 3.18894,0.411106 3.18894,0.411106"
id="path10915" />
<path
inkscape:connector-curvature="0"
d="m 172.11805,68.890531 c 0,1.003379 -0.1767,1.8517 -0.5298,2.544356 -0.35269,0.691923 -0.77536,1.010087 -1.2677,0.955217 -0.49153,-0.05472 -0.91719,-0.476639 -1.27726,-1.265141 -0.34966,-0.827922 -0.52433,-1.750538 -0.52433,-2.768572 -1e-5,-1.017937 0.16966,-1.862856 0.50931,-2.535355 0.35004,-0.692993 0.76564,-1.016131 1.24707,-0.968719 0.49226,0.04858 0.9199,0.476836 1.28263,1.285447 0.37326,0.789837 0.56007,1.707665 0.56008,2.752767 m -1.04353,13.912119 c 0,0 -1.74602,29.17105 -1.74602,29.17105 0,0 -3.29827,-0.59027 -3.29827,-0.59027 0,0 1.72646,-29.008502 1.72646,-29.008502 0,0 3.31783,0.427722 3.31783,0.427722"
id="path10917" />
<path
inkscape:connector-curvature="0"
d="m 179.01598,90.329159 c 0,0 -1.40773,23.126301 -1.40773,23.126301 0,0 -3.39164,-0.60698 -3.39164,-0.60698 0,0 1.39174,-22.995732 1.39174,-22.995732 0,0 -1.91023,-0.267064 -1.91023,-0.267064 0,0 0.38103,-6.395689 0.38103,-6.395689 0,0 1.91269,0.246577 1.91269,0.246577 0,0 0.83004,-13.70396 0.83004,-13.70396 0,0 3.4216,0.361663 3.4216,0.361663 0,0 -0.8396,13.782164 -0.8396,13.782164 0,0 3.18457,0.410542 3.18457,0.410542 0,0 -0.39205,6.486823 -0.39205,6.486823 0,0 -3.18042,-0.444645 -3.18042,-0.444645"
id="path10919" />
<path
inkscape:connector-curvature="0"
d="m 200.09638,86.544035 c 0,0 -1.9219,30.592005 -1.9219,30.592005 0,0 -3.62917,-0.64949 -3.62917,-0.64949 0,0 0.21227,-3.28285 0.21227,-3.28285 -1.54259,2.41691 -3.13133,3.47304 -4.76546,3.17868 -1.99844,-0.35998 -3.6185,-2.0112 -4.86612,-4.94632 -1.24249,-2.92301 -1.86183,-6.53106 -1.86186,-10.83321 -3e-5,-4.962328 0.70859,-8.930336 2.13088,-11.914549 1.45024,-2.995545 3.31826,-4.353123 5.61178,-4.060287 1.08848,0.139025 2.01838,0.614876 2.78825,1.428732 0.78266,0.817394 1.58372,2.160431 2.4033,4.031318 0,0 0.24627,-4.0148 0.24627,-4.0148 0,0 3.65176,0.470771 3.65176,0.470771 m -4.43909,13.904255 c -4e-5,-2.717054 -0.39303,-4.980086 -1.17745,-6.785644 -0.78246,-1.822565 -1.79014,-2.81699 -3.02082,-2.98627 -1.33305,-0.183291 -2.44658,0.70638 -3.34298,2.664066 -0.89378,1.973413 -1.33967,4.478873 -1.33964,7.520788 1e-5,2.65635 0.37157,4.89141 1.11605,6.70853 0.74629,1.8216 1.70851,2.83435 2.88872,3.03545 1.31431,0.22398 2.45545,-0.65327 3.42144,-2.63719 0.96902,-2.03362 1.45468,-4.54179 1.45468,-7.51973"
id="path10921" />
<path
inkscape:connector-curvature="0"
d="m 210.59369,62.948857 c 0,0 -1.76545,27.618349 -1.76545,27.618349 0.99306,-1.312846 1.85741,-2.168093 2.59198,-2.563345 0.77082,-0.414004 1.60707,-0.563925 2.50926,-0.448755 2.23175,0.285016 4.08604,2.008664 5.55612,5.180407 1.47685,3.163873 2.21788,7.051196 2.21795,11.650967 4e-5,5.05301 -0.84154,9.11579 -2.51812,12.17628 -1.67956,3.08741 -3.71714,4.40866 -6.1058,3.97839 -2.21018,-0.39812 -4.13144,-2.38754 -5.76892,-5.95632 0,0 -0.27204,4.13756 -0.27204,4.13756 0,0 -3.73402,-0.66825 -3.73402,-0.66825 0,0 3.51259,-55.442257 3.51259,-55.442257 0,0 3.77645,0.336974 3.77645,0.336974 m 7.18157,41.007653 c -5e-5,-2.83751 -0.43943,-5.220592 -1.31634,-7.145285 -0.87451,-1.919338 -2.00774,-2.97287 -3.3969,-3.163946 -1.49809,-0.205986 -2.73151,0.692689 -3.70333,2.690649 -0.96885,1.947466 -1.45212,4.570632 -1.45209,7.874012 3e-5,2.77133 0.41508,5.06732 1.24682,6.89164 0.83393,1.87364 1.9225,2.92662 3.26838,3.15588 1.49058,0.25395 2.74975,-0.61929 3.77469,-2.62548 1.05165,-2.00888 1.57878,-4.5697 1.57877,-7.67747"
id="path10923" />
<path
inkscape:connector-curvature="0"
d="m 232.93555,64.942427 c 0,0 -3.79307,57.735703 -3.79307,57.735703 0,0 -4.00192,-0.71619 -4.00192,-0.71619 0,0 3.76441,-57.379163 3.76441,-57.379163 0,0 4.03058,0.35965 4.03058,0.35965"
id="path10925" />
<path
inkscape:connector-curvature="0"
d="m 239.0771,110.77066 c 3e-5,2.42055 0.4512,4.48489 1.35536,6.19654 0.91925,1.71851 2.09407,2.70154 3.52717,2.94627 1.9759,0.33746 3.50088,-0.76924 4.56866,-3.32776 0,0 3.20464,3.76569 3.20464,3.76569 -1.11698,2.55798 -2.26253,4.27421 -3.43636,5.15274 -1.18257,0.89672 -2.65489,1.18453 -4.41309,0.86707 -2.77117,-0.50035 -4.9627,-2.39688 -6.58594,-5.68055 -1.61524,-3.26745 -2.41991,-7.39273 -2.41997,-12.38791 -7e-5,-5.2264 0.88505,-9.472622 2.6626,-12.752021 1.77469,-3.27557 4.03189,-4.746141 6.78148,-4.39624 2.68278,0.341472 4.81246,2.219379 6.37821,5.643695 1.59914,3.467846 2.40165,7.941666 2.40175,13.409026 -1e-5,0.57052 -0.0196,1.49453 -0.0587,2.77194 0,0 -13.96577,-2.20849 -13.96577,-2.20849 m 9.66372,-4.77749 c -0.45108,-5.21198 -1.99914,-7.996687 -4.62896,-8.357264 -2.4703,-0.338637 -4.06923,1.982786 -4.80935,6.953984 0,0 9.43831,1.40328 9.43831,1.40328"
id="path10927" />
</g>
</g>
<g
id="text7027"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
transform="matrix(0.71864924,0,0,0.71864924,121.45753,79.73219)">
<path
id="path7034"
d="m 257.77651,339.30723 c 0,0 -0.0126,-47.29911 -0.0126,-47.29911 0,0 -1.07548,0.31593 -1.07548,0.31593 -1.66284,0.48854 -2.85746,0.28792 -3.58019,-0.6041 -0.70114,-0.93919 -1.05207,-2.31685 -1.05207,-4.13168 0,-1.81444 0.35082,-3.37328 1.05164,-4.67526 0.72225,-1.34546 1.91609,-2.25144 3.57799,-2.71834 0,0 16.97387,-4.76807 16.97387,-4.76807 3.96095,-1.11259 7.12511,-0.0323 9.50921,3.22201 2.37256,3.20077 3.55893,7.47543 3.56767,12.83748 0.004,2.54895 -0.26558,5.03047 -0.80964,7.44667 -0.54488,2.41969 -1.37616,4.76094 -2.49546,7.02568 2.05523,1.5616 3.5872,3.66333 4.601,6.30634 1.03267,2.59309 1.55152,5.7504 1.5581,9.47676 0.005,2.96688 -0.35657,5.85099 -1.08626,8.65561 -0.5429,2.13369 -1.21349,3.9137 -2.01229,5.33981 -1.07439,1.98467 -2.39566,3.77328 -3.96594,5.36629 -1.57592,1.56019 -3.5546,2.76646 -5.94107,3.61797 0,0 -19.88366,7.09459 -19.88366,7.09459 -1.66745,0.59496 -2.8654,0.46776 -3.59015,-0.3841 -0.7031,-0.90081 -1.05501,-2.26426 -1.05501,-4.08924 0,-1.78498 0.36314,-3.35858 1.08856,-4.71936 0.72421,-1.39809 1.91002,-2.37974 3.55397,-2.94517 0,0 1.07785,-0.37071 1.07785,-0.37071 m 6.82963,-31.88447 c 0,0 7.39137,-2.30892 7.39137,-2.30892 2.62158,-0.8189 4.78642,-2.6695 6.50056,-5.5468 1.1532,-1.92898 1.72713,-4.06042 1.72408,-6.3978 -0.003,-2.06859 -0.54939,-3.7066 -1.64172,-4.9163 -1.09485,-1.25071 -2.83681,-1.52649 -5.23332,-0.82255 0,0 -8.7512,2.57075 -8.7512,2.57075 0,0 0.0102,17.42162 0.0102,17.42162 m 0.0173,29.5295 c 0,0 11.59226,-3.98707 11.59226,-3.98707 2.6872,-0.92424 4.5687,-2.28259 5.65417,-4.07576 0.82819,-1.3569 1.24028,-3.03056 1.23742,-5.02267 -0.003,-2.37465 -0.82491,-4.43936 -2.46842,-6.19896 -1.6491,-1.76544 -4.02284,-2.14729 -7.13269,-1.13597 0,0 -8.89303,2.89208 -8.89303,2.89208 0,0 0.0103,17.52835 0.0103,17.52835"
inkscape:connector-curvature="0" />
<path
id="path7036"
d="m 315.63395,330.78832 c 0,0 -0.008,-2.66312 -0.008,-2.66312 -1.5205,2.05858 -3.20684,3.79158 -5.06081,5.19796 -1.86182,1.44967 -3.56117,2.45156 -5.09604,3.00252 -3.35058,1.20262 -6.09378,0.54663 -8.21773,-1.98311 -2.1334,-2.5787 -3.20755,-5.87974 -3.21543,-9.8935 -0.01,-4.88257 1.33706,-9.85215 4.02708,-14.88639 2.69328,-5.04641 6.38764,-8.30943 11.05913,-9.80146 1.85895,-0.5937 3.99917,-0.90711 6.4167,-0.94198 0,0 -0.008,-2.71047 -0.008,-2.71047 -0.005,-1.69597 -0.40413,-2.95433 -1.19822,-3.7763 -0.77565,-0.82947 -2.26653,-0.90179 -4.47994,-0.2133 -1.82287,0.56707 -4.19603,1.97667 -7.12852,4.23834 -1.09717,0.83095 -1.95272,1.34329 -2.56522,1.53566 -0.83846,0.26342 -1.55663,-0.0562 -2.15389,-0.96001 -0.57751,-0.94891 -0.86835,-2.28914 -0.872,-4.01969 -0.002,-0.97796 0.0989,-1.85561 0.30293,-2.6328 0.20389,-0.77667 0.49009,-1.42758 0.85846,-1.95271 0.36795,-0.56215 1.13444,-1.3193 2.29738,-2.26995 1.54584,-1.25105 3.11705,-2.33895 4.71339,-3.2645 1.59048,-0.95927 3.02556,-1.62913 4.30677,-2.01132 3.80176,-1.13384 6.73,-0.47944 8.80217,1.94792 2.08246,2.37423 3.12878,6.17396 3.14584,11.40899 0,0 0.0755,23.20429 0.0755,23.20429 0,0 1.02221,-0.35158 1.02221,-0.35158 1.43677,-0.49417 2.45508,-0.3138 3.05789,0.53908 0.62114,0.80865 0.93435,2.052 0.94024,3.73109 0.006,1.64284 -0.29817,3.103 -0.91229,4.38174 -0.5959,1.23719 -1.61113,2.11228 -3.0486,2.62518 0,0 -7.06105,2.51942 -7.06105,2.51942 m -0.0605,-20.34496 c -2.43905,-0.0753 -4.70041,0.23148 -6.78144,0.92294 -2.51422,0.83547 -4.68502,2.69856 -6.5076,5.59502 -1.13795,1.84779 -1.70634,3.52499 -1.70292,5.02807 0.002,1.0899 0.28029,1.87848 0.83301,2.36524 1.0218,0.88744 2.41549,1.02464 4.17755,0.41484 1.49329,-0.5168 3.1709,-1.63797 5.03058,-3.3593 1.87161,-1.72078 3.52592,-3.75158 4.9653,-6.09198 0,0 -0.0145,-4.87483 -0.0145,-4.87483"
inkscape:connector-curvature="0" />
<path
id="path7038"
d="m 351.45961,282.46833 c -0.91452,-0.81047 -1.87521,-1.32503 -2.88241,-1.54283 -1.00973,-0.2537 -2.06646,-0.2094 -3.17058,0.13403 -2.19836,0.68386 -3.94926,1.92675 -5.24728,3.73026 -0.5762,0.79085 -0.86315,1.54528 -0.8602,2.26251 0.003,0.82494 0.39908,1.5073 1.18614,2.04629 0.59861,0.38285 1.93021,0.51244 3.98804,0.38963 3.75668,-0.20875 6.35384,-0.0517 7.81225,0.46829 1.90678,0.68882 3.37659,2.14965 4.41397,4.38104 1.03506,2.22658 1.55882,4.7606 1.57299,7.60629 0.0192,3.8658 -0.83398,7.40347 -2.56521,10.62256 -2.494,4.67157 -5.77005,7.74446 -9.84541,9.20702 -1.64484,0.59029 -3.1764,0.85271 -4.59341,0.78534 -1.40277,-0.0383 -2.69857,-0.38697 -3.88635,-1.04728 -0.28039,0.56921 -0.58022,1.03726 -0.89956,1.40403 -0.31959,0.36694 -0.64935,0.61132 -0.9893,0.73259 -0.90789,0.32388 -1.6396,0.0228 -2.1942,-0.90467 -0.5364,-0.97147 -0.80986,-2.79935 -0.81995,-5.48228 0,0 -0.0141,-3.75135 -0.0141,-3.75135 -0.0101,-2.68128 0.24884,-4.67325 0.77628,-5.97507 0.54553,-1.34257 1.25338,-2.15911 2.12282,-2.4506 0.69806,-0.23398 1.28355,-0.0514 1.75697,0.54708 0.47278,0.56188 0.84401,1.69794 1.114,3.40803 0.88673,1.1377 1.94787,1.87097 3.18209,2.20069 1.2306,0.29303 2.64142,0.16353 4.23059,-0.38634 2.59273,-0.89712 4.59185,-2.37089 6.00541,-4.42001 0.6686,-1.00942 1.00048,-1.93805 0.99651,-2.78707 -0.007,-1.41485 -0.49308,-2.41976 -1.46078,-3.01586 -0.96983,-0.59733 -2.9752,-0.70841 -6.03069,-0.33021 -4.58673,0.59585 -7.6827,-0.17688 -9.25518,-2.32843 -1.57769,-2.12264 -2.37589,-5.11935 -2.39063,-8.9837 -0.0152,-3.97117 0.8521,-7.54395 2.5961,-10.70925 2.35076,-4.30605 5.42069,-7.0163 9.19499,-8.14207 1.30582,-0.38941 2.55386,-0.51306 3.74464,-0.37241 1.20554,0.0997 2.35451,0.48017 3.44739,1.14045 0.34168,-0.59723 0.65654,-1.06254 0.94466,-1.39612 0.30594,-0.33858 0.58518,-0.54582 0.83779,-0.62164 0.75685,-0.22696 1.38927,0.14621 1.89787,1.11843 0.50782,0.93618 0.76793,2.70208 0.78072,5.29897 0,0 0.013,2.63267 0.013,2.63267 0.0115,2.35245 -0.12411,3.99567 -0.4071,4.9298 -0.56706,1.80018 -1.34596,2.85977 -2.33781,3.17733 -0.6686,0.21411 -1.25866,-0.004 -1.76979,-0.6537 -0.51177,-0.6508 -0.84365,-1.62508 -0.99522,-2.92244"
inkscape:connector-curvature="0" />
<path
id="path7040"
d="m 391.08767,286.09973 c 0,0 -21.40037,7.16598 -21.40037,7.16598 0.57216,2.58305 1.56606,4.48187 2.97874,5.69565 1.42536,1.20392 3.33049,1.3912 5.70856,0.56836 1.94011,-0.6713 4.49918,-2.39426 7.66518,-5.15474 1.2993,-1.12534 2.19719,-1.77197 2.69637,-1.94256 0.68118,-0.23272 1.25664,0.0618 1.72693,0.88273 0.46973,0.82008 0.70926,1.97252 0.71896,3.45813 0.009,1.35076 -0.23184,2.58617 -0.72232,3.70718 -0.65513,1.48575 -2.26858,3.26333 -4.85199,5.34083 -2.60048,2.05693 -5.11941,3.52549 -7.55489,4.39953 -4.22378,1.51581 -7.65099,0.33127 -10.26023,-3.58227 -2.60677,-3.94222 -3.93431,-9.46384 -3.97137,-16.54436 -0.0394,-7.52874 1.32903,-14.07941 4.09047,-19.62629 2.75903,-5.5472 5.92505,-8.84107 9.48957,-9.90426 2.12737,-0.63445 4.07097,-0.46394 5.83355,0.50605 1.77201,0.96099 3.08675,2.17372 3.94852,3.63907 1.21416,2.13157 2.22166,4.91277 3.02403,8.34384 0.54592,2.39326 0.82964,5.27426 0.85162,8.64573 0,0 0.0287,4.4014 0.0287,4.4014 m -5.73214,-8.54412 c -0.80672,-2.7354 -1.85391,-4.63367 -3.14346,-5.69374 -1.29366,-1.0973 -2.833,-1.37003 -4.62091,-0.81389 -1.77862,0.55329 -3.31967,1.79032 -4.62063,3.71406 -1.30548,1.89566 -2.36785,4.49783 -3.18525,7.80742 0,0 15.57025,-5.01385 15.57025,-5.01385"
inkscape:connector-curvature="0" />
<path
id="path7042"
d="m 438.50105,238.91477 c 0,0 0.33366,38.11886 0.33366,38.11886 0,0 4.5189,-1.55424 4.5189,-1.55424 1.06904,-0.36769 1.8298,-0.17153 2.28417,0.58709 0.46789,0.72139 0.70825,1.80481 0.72144,3.25104 0.0129,1.41496 -0.20635,2.65984 -0.65806,3.73554 -0.43823,1.04046 -1.19112,1.75156 -2.26052,2.13313 0,0 -13.68028,4.8812 -13.68028,4.8812 -1.1116,0.39663 -1.91344,0.23005 -2.40353,-0.50122 -0.47582,-0.76976 -0.72,-1.89742 -0.73214,-3.38218 -0.0119,-1.45226 0.21273,-2.71134 0.67337,-3.77635 0.47483,-1.10101 1.26883,-1.84247 2.38003,-2.22466 0,0 4.62789,-1.59173 4.62789,-1.59173 0,0 -0.3275,-38.34793 -0.3275,-38.34793 0,0 -4.6215,1.35761 -4.6215,1.35761 -1.10965,0.32602 -1.91007,0.11077 -2.39927,-0.64712 -0.47496,-0.79518 -0.71868,-1.93224 -0.73077,-3.41027 -0.0121,-1.47774 0.21202,-2.73263 0.67186,-3.76384 0.47403,-1.06604 1.26664,-1.75469 2.37589,-2.06634 0,0 13.65257,-3.78793 13.65257,-3.78793 1.06727,-0.29982 1.82661,-0.0734 2.27992,0.67815 0.4671,0.74675 0.70703,1.83959 0.72016,3.27935 0.0131,1.44004 -0.20565,2.68084 -0.65663,3.72319 -0.43753,1.00825 -1.18918,1.66931 -2.25681,1.98288 0,0 -4.51285,1.3257 -4.51285,1.3257"
inkscape:connector-curvature="0" />
<path
id="path7044"
d="m 455.88348,238.41146 c 0,0 0.0257,2.69003 0.0257,2.69003 0.68312,-1.72546 1.29991,-2.94833 1.85075,-3.67036 0.56356,-0.75579 1.21217,-1.24275 1.94542,-1.46144 0.62141,-0.18526 1.23821,-0.0305 1.85047,0.46347 0.61126,0.49329 1.21121,1.3268 1.79992,2.49991 0.71137,-1.56555 1.43158,-2.77864 2.16064,-3.64047 0.7408,-0.89447 1.49699,-1.45627 2.26852,-1.68643 1.53816,-0.45872 2.79097,0.0945 3.76153,1.65542 1.28104,2.03781 1.94044,5.01712 1.98128,8.9439 0,0 0.21643,20.82129 0.21643,20.82129 0.85204,-0.29305 1.48772,-0.0721 1.90821,0.66181 0.42,0.73316 0.63698,1.77834 0.65128,3.13628 0.0143,1.35811 -0.17928,2.54755 -0.58098,3.56911 -0.40256,0.99258 -1.09593,1.66483 -2.08175,2.01658 0,0 -3.92315,1.3998 -3.92315,1.3998 0,0 -0.30125,-29.5317 -0.30125,-29.5317 -0.0146,-1.42806 -0.13917,-2.37963 -0.37387,-2.85506 -0.23487,-0.47561 -0.58859,-0.64006 -1.06152,-0.49297 -0.46004,0.14313 -0.88398,0.55012 -1.27173,1.2214 -0.49476,0.91973 -1.09234,2.54691 -1.79337,4.88434 0,0 0.1894,18.96164 0.1894,18.96164 0.8724,-0.30006 1.52302,-0.079 1.95307,0.662 0.42956,0.74027 0.65113,1.79714 0.66503,3.17137 0.0139,1.37439 -0.18487,2.57895 -0.59663,3.61451 -0.4126,1.00623 -1.12276,1.68951 -2.13218,2.04968 0,0 -4.01729,1.43339 -4.01729,1.43339 0,0 -0.29261,-29.88883 -0.29261,-29.88883 -0.0139,-1.41455 -0.14767,-2.35965 -0.40153,-2.83564 -0.24053,-0.51127 -0.60278,-0.69179 -1.08713,-0.54115 -0.49887,0.15521 -0.98803,0.66317 -1.46747,1.52462 -0.4804,0.8318 -1.05239,2.39108 -1.71646,4.68046 0,0 0.18368,19.19395 0.18368,19.19395 0.89368,-0.30737 1.55989,-0.0863 1.99991,0.66201 0.45342,0.74274 0.68669,1.80921 0.70018,3.2002 0.0135,1.39115 -0.19765,2.61376 -0.6338,3.6687 -0.42312,1.02036 -1.1508,1.7151 -2.18483,2.08405 0,0 -3.90344,1.39277 -3.90344,1.39277 -1.04783,0.37387 -1.79708,0.20173 -2.24591,-0.51779 -0.46384,-0.74661 -0.70262,-1.84073 -0.71594,-3.28161 -0.013,-1.40935 0.19719,-2.62896 0.63021,-3.65799 0.43218,-1.05897 1.10915,-1.74654 2.02961,-2.06313 0,0 -0.21801,-23.27593 -0.21801,-23.27593 -0.91971,0.2877 -1.60455,0.0483 -2.05317,-0.71937 -0.44909,-0.76843 -0.68033,-1.85564 -0.69331,-3.26087 -0.013,-1.40499 0.20412,-2.61343 0.65085,-3.62449 0.43169,-1.03656 1.17158,-1.71162 2.21788,-2.0255 0,0 4.10732,-1.23196 4.10732,-1.23196"
inkscape:connector-curvature="0" />
<path
id="path7046"
d="m 490.87185,268.26248 c 0,0 -0.0238,-2.12947 -0.0238,-2.12947 -0.96684,1.56112 -2.04221,2.85176 -3.22705,3.87118 -1.18857,1.05267 -2.27482,1.75638 -3.25773,2.1092 -2.1433,0.7693 -3.90736,0.0916 -5.28616,-2.04226 -1.38398,-2.17145 -2.09463,-4.85752 -2.12832,-8.05178 -0.041,-3.88602 0.78508,-7.77051 2.47177,-11.63982 1.69085,-3.8838 4.03967,-6.29946 7.03403,-7.25585 1.19331,-0.3811 2.57099,-0.52435 4.13102,-0.43103 0,0 -0.0243,-2.16861 -0.0243,-2.16861 -0.0152,-1.35698 -0.28175,-2.38328 -0.80016,-3.07972 -0.50639,-0.70131 -1.46852,-0.83189 -2.89014,-0.3897 -1.16973,0.36389 -2.6864,1.37311 -4.5546,3.03337 -0.69844,0.60846 -1.2438,0.97457 -1.63533,1.09754 -0.5358,0.16833 -0.99846,-0.12206 -1.38767,-0.87192 -0.37678,-0.78462 -0.57264,-1.86678 -0.58731,-3.24582 -0.008,-0.77933 0.0501,-1.47376 0.17529,-2.08321 0.1251,-0.60911 0.30385,-1.1141 0.53618,-1.51496 0.23184,-0.43046 0.71786,-0.99743 1.45701,-1.70003 0.98321,-0.92446 1.98458,-1.71816 3.00395,-2.38162 1.01611,-0.69116 1.93495,-1.15887 2.7573,-1.40418 2.44294,-0.72858 4.33815,-0.0679 5.69456,1.97299 1.36388,2.00056 2.06787,5.09484 2.11563,9.28942 0,0 0.21151,18.5876 0.21151,18.5876 0,0 0.65945,-0.22681 0.65945,-0.22681 0.92741,-0.31897 1.58879,-0.11998 1.98565,0.5958 0.40854,0.68149 0.62043,1.69497 0.63598,3.04114 0.0152,1.31705 -0.17178,2.47066 -0.56118,3.4616 -0.37775,0.95836 -1.02971,1.60314 -1.95738,1.93413 0,0 -4.54817,1.62282 -4.54817,1.62282 m -0.18218,-16.27076 c -1.57456,-0.18741 -3.03025,-0.0602 -4.36568,0.38353 -1.61175,0.53558 -2.9938,1.90828 -4.14364,4.12194 -0.71713,1.41252 -1.06983,2.71889 -1.05695,3.91694 0.009,0.8687 0.19313,1.51219 0.55118,1.93012 0.66205,0.76298 1.55791,0.94835 2.68579,0.55802 0.95654,-0.33103 2.02809,-1.13477 3.2135,-2.40861 1.19412,-1.27383 2.24686,-2.80822 3.15946,-4.60277 0,0 -0.0437,-3.89917 -0.0437,-3.89917"
inkscape:connector-curvature="0" />
<path
id="path7048"
d="m 513.83107,223.64708 c 0,0 -0.0321,-2.60694 -0.0321,-2.60694 0,0 4.24921,-1.27452 4.24921,-1.27452 0.86692,-0.25998 1.48579,-0.0345 1.85799,0.67552 0.38309,0.67764 0.58268,1.66515 0.59908,2.9632 0.016,1.27005 -0.15729,2.37215 -0.52017,3.30702 -0.35202,0.90414 -0.96092,1.49191 -1.82805,1.76307 0,0 -0.61656,0.19283 -0.61656,0.19283 0,0 0.3963,31.78092 0.3963,31.78092 0.0383,3.07233 -0.1991,5.84676 -0.71289,8.32595 -0.50258,2.50775 -1.30016,4.80111 -2.39487,6.88205 -1.09848,2.08802 -2.35446,3.40535 -3.76947,3.94832 0,0 -4.20721,1.61434 -4.20721,1.61434 -0.90127,0.34581 -1.55322,0.17312 -1.95437,-0.5193 -0.389,-0.66876 -0.59138,-1.65732 -0.60684,-2.96502 -0.0158,-1.33662 0.16113,-2.49707 0.53047,-3.48063 0.38146,-0.95795 1.02342,-1.60387 1.92446,-1.93799 0,0 4.09797,-1.51959 4.09797,-1.51959 1.12773,-0.41818 1.99206,-1.47339 2.59485,-3.16418 0.6016,-1.68753 0.88825,-3.64562 0.86083,-5.87641 0,0 -0.0527,-4.28868 -0.0527,-4.28868 -0.79402,1.54526 -1.61175,2.78547 -2.45334,3.71951 -0.83173,0.93214 -1.69344,1.55874 -2.58528,1.87869 -2.53138,0.90814 -4.68912,-0.3421 -6.46539,-3.76745 -1.78479,-3.47022 -2.71501,-8.19944 -2.78452,-14.17311 -0.0698,-5.99942 0.74291,-11.29294 2.43134,-15.86475 1.6791,-4.57629 3.78635,-7.2342 6.31459,-7.98783 0.93884,-0.27979 1.83117,-0.21544 2.67743,0.19177 0.8558,0.37421 1.67211,1.10227 2.44924,2.18321 m 0.18895,16.81679 c -0.0397,-3.22458 -0.57346,-5.86075 -1.60346,-7.91342 -1.02083,-2.06186 -2.23403,-2.87672 -3.64183,-2.43909 -1.41359,0.43948 -2.61815,2.01503 -3.61171,4.73172 -0.98452,2.72148 -1.4586,5.72173 -1.41993,8.9951 0.039,3.30339 0.58054,5.9872 1.62246,8.04652 1.05092,2.02074 2.28478,2.78371 3.69937,2.29449 1.4088,-0.48717 2.59406,-2.07774 3.55781,-4.76688 0.97229,-2.71336 1.4373,-5.6943 1.39729,-8.94844"
inkscape:connector-curvature="0" />
<path
id="path7050"
d="m 540.11181,236.19855 c 0,0 -14.17571,4.74678 -14.17571,4.74678 0.39598,2.12039 1.06655,3.70874 2.0101,4.76439 0.95245,1.04897 2.21683,1.29937 3.78949,0.75521 1.28429,-0.44438 2.97443,-1.71113 5.06396,-3.7914 0.85848,-0.84849 1.45291,-1.3286 1.78475,-1.44201 0.45294,-0.15474 0.83898,0.11397 1.1584,0.80553 0.3191,0.69101 0.48673,1.64075 0.5031,2.84977 0.0149,1.09925 -0.1376,2.09168 -0.45762,2.9779 -0.4274,1.17397 -1.49195,2.53431 -3.19995,4.08586 -1.71744,1.53209 -3.38257,2.58934 -4.99438,3.16779 -2.79108,1.00165 -5.0682,-0.14146 -6.81995,-3.44725 -1.74841,-3.32527 -2.66198,-7.85839 -2.73457,-13.58545 -0.0772,-6.09039 0.78143,-11.32407 2.56808,-15.68474 1.78745,-4.3669 3.86227,-6.89434 6.21974,-7.59751 1.4088,-0.42014 2.70212,-0.19498 3.88143,0.67196 1.18643,0.86072 2.07063,1.90611 2.65495,3.13691 0.82406,1.78934 1.51493,4.09853 2.07343,6.92778 0.38048,1.97331 0.58916,4.3313 0.62629,7.07581 0,0 0.0485,3.58267 0.0485,3.58267 m -3.88051,-7.22718 c -0.55565,-2.26143 -1.2656,-3.85327 -2.13087,-4.7749 -0.86777,-0.95155 -1.89277,-1.24457 -3.07652,-0.87637 -1.17666,0.36604 -2.19027,1.29725 -3.03946,2.79568 -0.85185,1.47453 -1.5375,3.53206 -2.05595,6.17324 0,0 10.3028,-3.31765 10.3028,-3.31765"
inkscape:connector-curvature="0" />
style="display:none"
inkscape:label="Base Image"
id="layer10"
inkscape:groupmode="layer">
<g
id="text7027"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
transform="matrix(0.71864924,0,0,0.71864924,102.10269,88.99025)">
<path
id="path7034"
d="m 257.77651,339.30723 c 0,0 -0.0126,-47.29911 -0.0126,-47.29911 0,0 -1.07548,0.31593 -1.07548,0.31593 -1.66284,0.48854 -2.85746,0.28792 -3.58019,-0.6041 -0.70114,-0.93919 -1.05207,-2.31685 -1.05207,-4.13168 0,-1.81444 0.35082,-3.37328 1.05164,-4.67526 0.72225,-1.34546 1.91609,-2.25144 3.57799,-2.71834 0,0 16.97387,-4.76807 16.97387,-4.76807 3.96095,-1.11259 7.12511,-0.0323 9.50921,3.22201 2.37256,3.20077 3.55893,7.47543 3.56767,12.83748 0.004,2.54895 -0.26558,5.03047 -0.80964,7.44667 -0.54488,2.41969 -1.37616,4.76094 -2.49546,7.02568 2.05523,1.5616 3.5872,3.66333 4.601,6.30634 1.03267,2.59309 1.55152,5.7504 1.5581,9.47676 0.005,2.96688 -0.35657,5.85099 -1.08626,8.65561 -0.5429,2.13369 -1.21349,3.9137 -2.01229,5.33981 -1.07439,1.98467 -2.39566,3.77328 -3.96594,5.36629 -1.57592,1.56019 -3.5546,2.76646 -5.94107,3.61797 0,0 -19.88366,7.09459 -19.88366,7.09459 -1.66745,0.59496 -2.8654,0.46776 -3.59015,-0.3841 -0.7031,-0.90081 -1.05501,-2.26426 -1.05501,-4.08924 0,-1.78498 0.36314,-3.35858 1.08856,-4.71936 0.72421,-1.39809 1.91002,-2.37974 3.55397,-2.94517 0,0 1.07785,-0.37071 1.07785,-0.37071 m 6.82963,-31.88447 c 0,0 7.39137,-2.30892 7.39137,-2.30892 2.62158,-0.8189 4.78642,-2.6695 6.50056,-5.5468 1.1532,-1.92898 1.72713,-4.06042 1.72408,-6.3978 -0.003,-2.06859 -0.54939,-3.7066 -1.64172,-4.9163 -1.09485,-1.25071 -2.83681,-1.52649 -5.23332,-0.82255 0,0 -8.7512,2.57075 -8.7512,2.57075 0,0 0.0102,17.42162 0.0102,17.42162 m 0.0173,29.5295 c 0,0 11.59226,-3.98707 11.59226,-3.98707 2.6872,-0.92424 4.5687,-2.28259 5.65417,-4.07576 0.82819,-1.3569 1.24028,-3.03056 1.23742,-5.02267 -0.003,-2.37465 -0.82491,-4.43936 -2.46842,-6.19896 -1.6491,-1.76544 -4.02284,-2.14729 -7.13269,-1.13597 0,0 -8.89303,2.89208 -8.89303,2.89208 0,0 0.0103,17.52835 0.0103,17.52835"
inkscape:connector-curvature="0" />
<path
id="path7036"
d="m 315.63395,330.78832 c 0,0 -0.008,-2.66312 -0.008,-2.66312 -1.5205,2.05858 -3.20684,3.79158 -5.06081,5.19796 -1.86182,1.44967 -3.56117,2.45156 -5.09604,3.00252 -3.35058,1.20262 -6.09378,0.54663 -8.21773,-1.98311 -2.1334,-2.5787 -3.20755,-5.87974 -3.21543,-9.8935 -0.01,-4.88257 1.33706,-9.85215 4.02708,-14.88639 2.69328,-5.04641 6.38764,-8.30943 11.05913,-9.80146 1.85895,-0.5937 3.99917,-0.90711 6.4167,-0.94198 0,0 -0.008,-2.71047 -0.008,-2.71047 -0.005,-1.69597 -0.40413,-2.95433 -1.19822,-3.7763 -0.77565,-0.82947 -2.26653,-0.90179 -4.47994,-0.2133 -1.82287,0.56707 -4.19603,1.97667 -7.12852,4.23834 -1.09717,0.83095 -1.95272,1.34329 -2.56522,1.53566 -0.83846,0.26342 -1.55663,-0.0562 -2.15389,-0.96001 -0.57751,-0.94891 -0.86835,-2.28914 -0.872,-4.01969 -0.002,-0.97796 0.0989,-1.85561 0.30293,-2.6328 0.20389,-0.77667 0.49009,-1.42758 0.85846,-1.95271 0.36795,-0.56215 1.13444,-1.3193 2.29738,-2.26995 1.54584,-1.25105 3.11705,-2.33895 4.71339,-3.2645 1.59048,-0.95927 3.02556,-1.62913 4.30677,-2.01132 3.80176,-1.13384 6.73,-0.47944 8.80217,1.94792 2.08246,2.37423 3.12878,6.17396 3.14584,11.40899 0,0 0.0755,23.20429 0.0755,23.20429 0,0 1.02221,-0.35158 1.02221,-0.35158 1.43677,-0.49417 2.45508,-0.3138 3.05789,0.53908 0.62114,0.80865 0.93435,2.052 0.94024,3.73109 0.006,1.64284 -0.29817,3.103 -0.91229,4.38174 -0.5959,1.23719 -1.61113,2.11228 -3.0486,2.62518 0,0 -7.06105,2.51942 -7.06105,2.51942 m -0.0605,-20.34496 c -2.43905,-0.0753 -4.70041,0.23148 -6.78144,0.92294 -2.51422,0.83547 -4.68502,2.69856 -6.5076,5.59502 -1.13795,1.84779 -1.70634,3.52499 -1.70292,5.02807 0.002,1.0899 0.28029,1.87848 0.83301,2.36524 1.0218,0.88744 2.41549,1.02464 4.17755,0.41484 1.49329,-0.5168 3.1709,-1.63797 5.03058,-3.3593 1.87161,-1.72078 3.52592,-3.75158 4.9653,-6.09198 0,0 -0.0145,-4.87483 -0.0145,-4.87483"
inkscape:connector-curvature="0" />
<path
id="path7038"
d="m 351.45961,282.46833 c -0.91452,-0.81047 -1.87521,-1.32503 -2.88241,-1.54283 -1.00973,-0.2537 -2.06646,-0.2094 -3.17058,0.13403 -2.19836,0.68386 -3.94926,1.92675 -5.24728,3.73026 -0.5762,0.79085 -0.86315,1.54528 -0.8602,2.26251 0.003,0.82494 0.39908,1.5073 1.18614,2.04629 0.59861,0.38285 1.93021,0.51244 3.98804,0.38963 3.75668,-0.20875 6.35384,-0.0517 7.81225,0.46829 1.90678,0.68882 3.37659,2.14965 4.41397,4.38104 1.03506,2.22658 1.55882,4.7606 1.57299,7.60629 0.0192,3.8658 -0.83398,7.40347 -2.56521,10.62256 -2.494,4.67157 -5.77005,7.74446 -9.84541,9.20702 -1.64484,0.59029 -3.1764,0.85271 -4.59341,0.78534 -1.40277,-0.0383 -2.69857,-0.38697 -3.88635,-1.04728 -0.28039,0.56921 -0.58022,1.03726 -0.89956,1.40403 -0.31959,0.36694 -0.64935,0.61132 -0.9893,0.73259 -0.90789,0.32388 -1.6396,0.0228 -2.1942,-0.90467 -0.5364,-0.97147 -0.80986,-2.79935 -0.81995,-5.48228 0,0 -0.0141,-3.75135 -0.0141,-3.75135 -0.0101,-2.68128 0.24884,-4.67325 0.77628,-5.97507 0.54553,-1.34257 1.25338,-2.15911 2.12282,-2.4506 0.69806,-0.23398 1.28355,-0.0514 1.75697,0.54708 0.47278,0.56188 0.84401,1.69794 1.114,3.40803 0.88673,1.1377 1.94787,1.87097 3.18209,2.20069 1.2306,0.29303 2.64142,0.16353 4.23059,-0.38634 2.59273,-0.89712 4.59185,-2.37089 6.00541,-4.42001 0.6686,-1.00942 1.00048,-1.93805 0.99651,-2.78707 -0.007,-1.41485 -0.49308,-2.41976 -1.46078,-3.01586 -0.96983,-0.59733 -2.9752,-0.70841 -6.03069,-0.33021 -4.58673,0.59585 -7.6827,-0.17688 -9.25518,-2.32843 -1.57769,-2.12264 -2.37589,-5.11935 -2.39063,-8.9837 -0.0152,-3.97117 0.8521,-7.54395 2.5961,-10.70925 2.35076,-4.30605 5.42069,-7.0163 9.19499,-8.14207 1.30582,-0.38941 2.55386,-0.51306 3.74464,-0.37241 1.20554,0.0997 2.35451,0.48017 3.44739,1.14045 0.34168,-0.59723 0.65654,-1.06254 0.94466,-1.39612 0.30594,-0.33858 0.58518,-0.54582 0.83779,-0.62164 0.75685,-0.22696 1.38927,0.14621 1.89787,1.11843 0.50782,0.93618 0.76793,2.70208 0.78072,5.29897 0,0 0.013,2.63267 0.013,2.63267 0.0115,2.35245 -0.12411,3.99567 -0.4071,4.9298 -0.56706,1.80018 -1.34596,2.85977 -2.33781,3.17733 -0.6686,0.21411 -1.25866,-0.004 -1.76979,-0.6537 -0.51177,-0.6508 -0.84365,-1.62508 -0.99522,-2.92244"
inkscape:connector-curvature="0" />
<path
id="path7040"
d="m 391.08767,286.09973 c 0,0 -21.40037,7.16598 -21.40037,7.16598 0.57216,2.58305 1.56606,4.48187 2.97874,5.69565 1.42536,1.20392 3.33049,1.3912 5.70856,0.56836 1.94011,-0.6713 4.49918,-2.39426 7.66518,-5.15474 1.2993,-1.12534 2.19719,-1.77197 2.69637,-1.94256 0.68118,-0.23272 1.25664,0.0618 1.72693,0.88273 0.46973,0.82008 0.70926,1.97252 0.71896,3.45813 0.009,1.35076 -0.23184,2.58617 -0.72232,3.70718 -0.65513,1.48575 -2.26858,3.26333 -4.85199,5.34083 -2.60048,2.05693 -5.11941,3.52549 -7.55489,4.39953 -4.22378,1.51581 -7.65099,0.33127 -10.26023,-3.58227 -2.60677,-3.94222 -3.93431,-9.46384 -3.97137,-16.54436 -0.0394,-7.52874 1.32903,-14.07941 4.09047,-19.62629 2.75903,-5.5472 5.92505,-8.84107 9.48957,-9.90426 2.12737,-0.63445 4.07097,-0.46394 5.83355,0.50605 1.77201,0.96099 3.08675,2.17372 3.94852,3.63907 1.21416,2.13157 2.22166,4.91277 3.02403,8.34384 0.54592,2.39326 0.82964,5.27426 0.85162,8.64573 0,0 0.0287,4.4014 0.0287,4.4014 m -5.73214,-8.54412 c -0.80672,-2.7354 -1.85391,-4.63367 -3.14346,-5.69374 -1.29366,-1.0973 -2.833,-1.37003 -4.62091,-0.81389 -1.77862,0.55329 -3.31967,1.79032 -4.62063,3.71406 -1.30548,1.89566 -2.36785,4.49783 -3.18525,7.80742 0,0 15.57025,-5.01385 15.57025,-5.01385"
inkscape:connector-curvature="0" />
<path
id="path7042"
d="m 438.50105,238.91477 c 0,0 0.33366,38.11886 0.33366,38.11886 0,0 4.5189,-1.55424 4.5189,-1.55424 1.06904,-0.36769 1.8298,-0.17153 2.28417,0.58709 0.46789,0.72139 0.70825,1.80481 0.72144,3.25104 0.0129,1.41496 -0.20635,2.65984 -0.65806,3.73554 -0.43823,1.04046 -1.19112,1.75156 -2.26052,2.13313 0,0 -13.68028,4.8812 -13.68028,4.8812 -1.1116,0.39663 -1.91344,0.23005 -2.40353,-0.50122 -0.47582,-0.76976 -0.72,-1.89742 -0.73214,-3.38218 -0.0119,-1.45226 0.21273,-2.71134 0.67337,-3.77635 0.47483,-1.10101 1.26883,-1.84247 2.38003,-2.22466 0,0 4.62789,-1.59173 4.62789,-1.59173 0,0 -0.3275,-38.34793 -0.3275,-38.34793 0,0 -4.6215,1.35761 -4.6215,1.35761 -1.10965,0.32602 -1.91007,0.11077 -2.39927,-0.64712 -0.47496,-0.79518 -0.71868,-1.93224 -0.73077,-3.41027 -0.0121,-1.47774 0.21202,-2.73263 0.67186,-3.76384 0.47403,-1.06604 1.26664,-1.75469 2.37589,-2.06634 0,0 13.65257,-3.78793 13.65257,-3.78793 1.06727,-0.29982 1.82661,-0.0734 2.27992,0.67815 0.4671,0.74675 0.70703,1.83959 0.72016,3.27935 0.0131,1.44004 -0.20565,2.68084 -0.65663,3.72319 -0.43753,1.00825 -1.18918,1.66931 -2.25681,1.98288 0,0 -4.51285,1.3257 -4.51285,1.3257"
inkscape:connector-curvature="0" />
<path
id="path7044"
d="m 455.88348,238.41146 c 0,0 0.0257,2.69003 0.0257,2.69003 0.68312,-1.72546 1.29991,-2.94833 1.85075,-3.67036 0.56356,-0.75579 1.21217,-1.24275 1.94542,-1.46144 0.62141,-0.18526 1.23821,-0.0305 1.85047,0.46347 0.61126,0.49329 1.21121,1.3268 1.79992,2.49991 0.71137,-1.56555 1.43158,-2.77864 2.16064,-3.64047 0.7408,-0.89447 1.49699,-1.45627 2.26852,-1.68643 1.53816,-0.45872 2.79097,0.0945 3.76153,1.65542 1.28104,2.03781 1.94044,5.01712 1.98128,8.9439 0,0 0.21643,20.82129 0.21643,20.82129 0.85204,-0.29305 1.48772,-0.0721 1.90821,0.66181 0.42,0.73316 0.63698,1.77834 0.65128,3.13628 0.0143,1.35811 -0.17928,2.54755 -0.58098,3.56911 -0.40256,0.99258 -1.09593,1.66483 -2.08175,2.01658 0,0 -3.92315,1.3998 -3.92315,1.3998 0,0 -0.30125,-29.5317 -0.30125,-29.5317 -0.0146,-1.42806 -0.13917,-2.37963 -0.37387,-2.85506 -0.23487,-0.47561 -0.58859,-0.64006 -1.06152,-0.49297 -0.46004,0.14313 -0.88398,0.55012 -1.27173,1.2214 -0.49476,0.91973 -1.09234,2.54691 -1.79337,4.88434 0,0 0.1894,18.96164 0.1894,18.96164 0.8724,-0.30006 1.52302,-0.079 1.95307,0.662 0.42956,0.74027 0.65113,1.79714 0.66503,3.17137 0.0139,1.37439 -0.18487,2.57895 -0.59663,3.61451 -0.4126,1.00623 -1.12276,1.68951 -2.13218,2.04968 0,0 -4.01729,1.43339 -4.01729,1.43339 0,0 -0.29261,-29.88883 -0.29261,-29.88883 -0.0139,-1.41455 -0.14767,-2.35965 -0.40153,-2.83564 -0.24053,-0.51127 -0.60278,-0.69179 -1.08713,-0.54115 -0.49887,0.15521 -0.98803,0.66317 -1.46747,1.52462 -0.4804,0.8318 -1.05239,2.39108 -1.71646,4.68046 0,0 0.18368,19.19395 0.18368,19.19395 0.89368,-0.30737 1.55989,-0.0863 1.99991,0.66201 0.45342,0.74274 0.68669,1.80921 0.70018,3.2002 0.0135,1.39115 -0.19765,2.61376 -0.6338,3.6687 -0.42312,1.02036 -1.1508,1.7151 -2.18483,2.08405 0,0 -3.90344,1.39277 -3.90344,1.39277 -1.04783,0.37387 -1.79708,0.20173 -2.24591,-0.51779 -0.46384,-0.74661 -0.70262,-1.84073 -0.71594,-3.28161 -0.013,-1.40935 0.19719,-2.62896 0.63021,-3.65799 0.43218,-1.05897 1.10915,-1.74654 2.02961,-2.06313 0,0 -0.21801,-23.27593 -0.21801,-23.27593 -0.91971,0.2877 -1.60455,0.0483 -2.05317,-0.71937 -0.44909,-0.76843 -0.68033,-1.85564 -0.69331,-3.26087 -0.013,-1.40499 0.20412,-2.61343 0.65085,-3.62449 0.43169,-1.03656 1.17158,-1.71162 2.21788,-2.0255 0,0 4.10732,-1.23196 4.10732,-1.23196"
inkscape:connector-curvature="0" />
<path
id="path7046"
d="m 490.87185,268.26248 c 0,0 -0.0238,-2.12947 -0.0238,-2.12947 -0.96684,1.56112 -2.04221,2.85176 -3.22705,3.87118 -1.18857,1.05267 -2.27482,1.75638 -3.25773,2.1092 -2.1433,0.7693 -3.90736,0.0916 -5.28616,-2.04226 -1.38398,-2.17145 -2.09463,-4.85752 -2.12832,-8.05178 -0.041,-3.88602 0.78508,-7.77051 2.47177,-11.63982 1.69085,-3.8838 4.03967,-6.29946 7.03403,-7.25585 1.19331,-0.3811 2.57099,-0.52435 4.13102,-0.43103 0,0 -0.0243,-2.16861 -0.0243,-2.16861 -0.0152,-1.35698 -0.28175,-2.38328 -0.80016,-3.07972 -0.50639,-0.70131 -1.46852,-0.83189 -2.89014,-0.3897 -1.16973,0.36389 -2.6864,1.37311 -4.5546,3.03337 -0.69844,0.60846 -1.2438,0.97457 -1.63533,1.09754 -0.5358,0.16833 -0.99846,-0.12206 -1.38767,-0.87192 -0.37678,-0.78462 -0.57264,-1.86678 -0.58731,-3.24582 -0.008,-0.77933 0.0501,-1.47376 0.17529,-2.08321 0.1251,-0.60911 0.30385,-1.1141 0.53618,-1.51496 0.23184,-0.43046 0.71786,-0.99743 1.45701,-1.70003 0.98321,-0.92446 1.98458,-1.71816 3.00395,-2.38162 1.01611,-0.69116 1.93495,-1.15887 2.7573,-1.40418 2.44294,-0.72858 4.33815,-0.0679 5.69456,1.97299 1.36388,2.00056 2.06787,5.09484 2.11563,9.28942 0,0 0.21151,18.5876 0.21151,18.5876 0,0 0.65945,-0.22681 0.65945,-0.22681 0.92741,-0.31897 1.58879,-0.11998 1.98565,0.5958 0.40854,0.68149 0.62043,1.69497 0.63598,3.04114 0.0152,1.31705 -0.17178,2.47066 -0.56118,3.4616 -0.37775,0.95836 -1.02971,1.60314 -1.95738,1.93413 0,0 -4.54817,1.62282 -4.54817,1.62282 m -0.18218,-16.27076 c -1.57456,-0.18741 -3.03025,-0.0602 -4.36568,0.38353 -1.61175,0.53558 -2.9938,1.90828 -4.14364,4.12194 -0.71713,1.41252 -1.06983,2.71889 -1.05695,3.91694 0.009,0.8687 0.19313,1.51219 0.55118,1.93012 0.66205,0.76298 1.55791,0.94835 2.68579,0.55802 0.95654,-0.33103 2.02809,-1.13477 3.2135,-2.40861 1.19412,-1.27383 2.24686,-2.80822 3.15946,-4.60277 0,0 -0.0437,-3.89917 -0.0437,-3.89917"
inkscape:connector-curvature="0" />
<path
id="path7048"
d="m 513.83107,223.64708 c 0,0 -0.0321,-2.60694 -0.0321,-2.60694 0,0 4.24921,-1.27452 4.24921,-1.27452 0.86692,-0.25998 1.48579,-0.0345 1.85799,0.67552 0.38309,0.67764 0.58268,1.66515 0.59908,2.9632 0.016,1.27005 -0.15729,2.37215 -0.52017,3.30702 -0.35202,0.90414 -0.96092,1.49191 -1.82805,1.76307 0,0 -0.61656,0.19283 -0.61656,0.19283 0,0 0.3963,31.78092 0.3963,31.78092 0.0383,3.07233 -0.1991,5.84676 -0.71289,8.32595 -0.50258,2.50775 -1.30016,4.80111 -2.39487,6.88205 -1.09848,2.08802 -2.35446,3.40535 -3.76947,3.94832 0,0 -4.20721,1.61434 -4.20721,1.61434 -0.90127,0.34581 -1.55322,0.17312 -1.95437,-0.5193 -0.389,-0.66876 -0.59138,-1.65732 -0.60684,-2.96502 -0.0158,-1.33662 0.16113,-2.49707 0.53047,-3.48063 0.38146,-0.95795 1.02342,-1.60387 1.92446,-1.93799 0,0 4.09797,-1.51959 4.09797,-1.51959 1.12773,-0.41818 1.99206,-1.47339 2.59485,-3.16418 0.6016,-1.68753 0.88825,-3.64562 0.86083,-5.87641 0,0 -0.0527,-4.28868 -0.0527,-4.28868 -0.79402,1.54526 -1.61175,2.78547 -2.45334,3.71951 -0.83173,0.93214 -1.69344,1.55874 -2.58528,1.87869 -2.53138,0.90814 -4.68912,-0.3421 -6.46539,-3.76745 -1.78479,-3.47022 -2.71501,-8.19944 -2.78452,-14.17311 -0.0698,-5.99942 0.74291,-11.29294 2.43134,-15.86475 1.6791,-4.57629 3.78635,-7.2342 6.31459,-7.98783 0.93884,-0.27979 1.83117,-0.21544 2.67743,0.19177 0.8558,0.37421 1.67211,1.10227 2.44924,2.18321 m 0.18895,16.81679 c -0.0397,-3.22458 -0.57346,-5.86075 -1.60346,-7.91342 -1.02083,-2.06186 -2.23403,-2.87672 -3.64183,-2.43909 -1.41359,0.43948 -2.61815,2.01503 -3.61171,4.73172 -0.98452,2.72148 -1.4586,5.72173 -1.41993,8.9951 0.039,3.30339 0.58054,5.9872 1.62246,8.04652 1.05092,2.02074 2.28478,2.78371 3.69937,2.29449 1.4088,-0.48717 2.59406,-2.07774 3.55781,-4.76688 0.97229,-2.71336 1.4373,-5.6943 1.39729,-8.94844"
inkscape:connector-curvature="0" />
<path
id="path7050"
d="m 540.11181,236.19855 c 0,0 -14.17571,4.74678 -14.17571,4.74678 0.39598,2.12039 1.06655,3.70874 2.0101,4.76439 0.95245,1.04897 2.21683,1.29937 3.78949,0.75521 1.28429,-0.44438 2.97443,-1.71113 5.06396,-3.7914 0.85848,-0.84849 1.45291,-1.3286 1.78475,-1.44201 0.45294,-0.15474 0.83898,0.11397 1.1584,0.80553 0.3191,0.69101 0.48673,1.64075 0.5031,2.84977 0.0149,1.09925 -0.1376,2.09168 -0.45762,2.9779 -0.4274,1.17397 -1.49195,2.53431 -3.19995,4.08586 -1.71744,1.53209 -3.38257,2.58934 -4.99438,3.16779 -2.79108,1.00165 -5.0682,-0.14146 -6.81995,-3.44725 -1.74841,-3.32527 -2.66198,-7.85839 -2.73457,-13.58545 -0.0772,-6.09039 0.78143,-11.32407 2.56808,-15.68474 1.78745,-4.3669 3.86227,-6.89434 6.21974,-7.59751 1.4088,-0.42014 2.70212,-0.19498 3.88143,0.67196 1.18643,0.86072 2.07063,1.90611 2.65495,3.13691 0.82406,1.78934 1.51493,4.09853 2.07343,6.92778 0.38048,1.97331 0.58916,4.3313 0.62629,7.07581 0,0 0.0485,3.58267 0.0485,3.58267 m -3.88051,-7.22718 c -0.55565,-2.26143 -1.2656,-3.85327 -2.13087,-4.7749 -0.86777,-0.95155 -1.89277,-1.24457 -3.07652,-0.87637 -1.17666,0.36604 -2.19027,1.29725 -3.03946,2.79568 -0.85185,1.47453 -1.5375,3.53206 -2.05595,6.17324 0,0 10.3028,-3.31765 10.3028,-3.31765"
inkscape:connector-curvature="0" />
</g>
</g>
<g
style="display:none"
inkscape:label="Image (name)"
id="layer11"
inkscape:groupmode="layer">
<g
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New"
id="text14133">
<path
inkscape:connector-curvature="0"
d="m 290.77223,304.74825 c 0,0 0,32.31662 0,32.31662 0,0 5.87857,-2.13185 5.87857,-2.13185 0.40465,-0.14674 0.69438,-0.12402 0.86947,0.0681 0.17497,0.17071 0.26242,0.45829 0.26244,0.86282 -2e-5,0.38327 -0.0874,0.73459 -0.26244,1.05416 -0.17509,0.31972 -0.46482,0.5537 -0.86947,0.70197 0,0 -13.61665,4.98933 -13.61665,4.98933 -0.42075,0.15417 -0.72258,0.13428 -0.9052,-0.06 -0.18272,-0.19433 -0.27412,-0.48744 -0.27411,-0.87928 -1e-5,-0.41357 0.0914,-0.77331 0.27411,-1.07911 0.18262,-0.32736 0.48445,-0.56735 0.9052,-0.71994 0,0 6.0052,-2.17777 6.0052,-2.17777 0,0 0,-32.39447 0,-32.39447 0,0 -6.0052,1.90797 -6.0052,1.90797 -0.42075,0.13372 -0.72258,0.10996 -0.9052,-0.0714 -0.18272,-0.20317 -0.27412,-0.51163 -0.27411,-0.92526 -1e-5,-0.41355 0.0914,-0.76884 0.27411,-1.06575 0.18262,-0.31845 0.48445,-0.54373 0.9052,-0.67588 0,0 13.61665,-4.27499 13.61665,-4.27499 0.40465,-0.127 0.69438,-0.0902 0.86947,0.11043 0.17497,0.17924 0.26242,0.47109 0.26244,0.87558 -2e-5,0.40459 -0.0874,0.76232 -0.26244,1.07333 -0.17509,0.28993 -0.46482,0.49917 -0.86947,0.6277 0,0 -5.87857,1.86774 -5.87857,1.86774"
id="path14140" />
<path
inkscape:connector-curvature="0"
d="m 306.92675,306.55175 c 0,0 0,2.67986 0,2.67986 1.40003,-2.87625 2.80101,-4.53947 4.20289,-4.99685 0.84101,-0.27434 1.57685,-0.14959 2.20819,0.37302 0.63018,0.50092 1.1566,1.40903 1.57974,2.72378 0.71685,-1.69138 1.43861,-3.00815 2.16526,-3.95142 0.7378,-0.96608 1.47405,-1.5684 2.20876,-1.80813 1.14953,-0.37499 2.06265,-0.0655 2.74123,0.9259 0.89011,1.26835 1.33432,2.825 1.33433,4.6724 0,0 0,18.0741 0,18.0741 0,0 1.32918,-0.48202 1.32918,-0.48202 0.37346,-0.13543 0.64087,-0.10964 0.80249,0.0773 0.16149,0.1664 0.24221,0.4439 0.24224,0.83254 -3e-5,0.36823 -0.0808,0.70459 -0.24224,1.00917 -0.16162,0.30475 -0.42903,0.52553 -0.80249,0.66237 0,0 -2.90839,1.06568 -2.90839,1.06568 0,0 0,-20.46113 0,-20.46113 -2e-5,-1.31673 -0.24507,-2.32553 -0.73568,-3.02713 -0.49135,-0.70254 -1.05913,-0.94797 -1.70374,-0.73524 -0.58247,0.19227 -1.19764,0.75726 -1.8457,1.69604 -0.6493,0.9199 -1.38919,2.56622 -2.22024,4.94195 0,0 0,17.3523 0,17.3523 0,0 1.3415,-0.48649 1.3415,-0.48649 0.38232,-0.13865 0.65607,-0.11371 0.8215,0.0747 0.16532,0.16767 0.24796,0.44807 0.24797,0.8413 -1e-5,0.37255 -0.0826,0.71319 -0.24797,1.02208 -0.16543,0.30904 -0.43918,0.53359 -0.8215,0.67367 0,0 -2.97744,1.09098 -2.97744,1.09098 0,0 0,-20.5158 0,-20.5158 -10e-6,-1.39476 -0.25733,-2.45395 -0.77253,-3.1784 -0.50307,-0.7506 -1.0715,-1.02182 -1.70561,-0.81257 -0.58338,0.19258 -1.16121,0.68673 -1.7335,1.4832 -0.79496,1.12309 -1.63094,2.88106 -2.50825,5.27652 0,0 0,17.56098 0,17.56098 0,0 1.39351,-0.50535 1.39351,-0.50535 0.39153,-0.14199 0.67186,-0.11795 0.84127,0.072 0.16931,0.16894 0.25394,0.45233 0.25395,0.85026 -10e-6,0.377 -0.0846,0.72208 -0.25395,1.0354 -0.16941,0.31346 -0.44974,0.54191 -0.84127,0.68538 0,0 -4.455,1.63237 -4.455,1.63237 -0.39697,0.14545 -0.68175,0.12306 -0.85404,-0.0675 -0.17239,-0.19062 -0.25861,-0.47625 -0.25861,-0.85683 0,-0.40172 0.0862,-0.75019 0.25861,-1.04538 0.17229,-0.31613 0.45707,-0.54619 0.85404,-0.69015 0,0 1.40566,-0.50976 1.40566,-0.50976 0,0 0,-22.02661 0,-22.02661 0,0 -1.40566,0.46583 -1.40566,0.46583 -0.39697,0.13157 -0.68175,0.0992 -0.85404,-0.0974 -0.17239,-0.19662 -0.25861,-0.49584 -0.25861,-0.8976 0,-0.38054 0.0862,-0.72601 0.25861,-1.03629 0.17229,-0.31008 0.45707,-0.53015 0.85404,-0.66022 0,0 3.06149,-1.00289 3.06149,-1.00289"
id="path14142" />
<path
inkscape:connector-curvature="0"
d="m 341.55437,321.16678 c 0,0 0,-3.62699 0,-3.62699 -2.17583,3.87291 -4.51596,6.27757 -7.0237,7.20015 -1.83227,0.67408 -3.27105,0.43232 -4.31124,-0.73067 -1.0434,-1.1869 -1.56629,-2.91222 -1.56629,-5.17318 0,-2.48503 0.68882,-4.89489 2.06231,-7.22253 1.36795,-2.31825 3.35505,-3.9208 5.95041,-4.80953 0.69672,-0.23856 1.45188,-0.41679 2.26509,-0.53489 0.81121,-0.13772 1.68585,-0.20766 2.62342,-0.20985 0,0 0,-4.07662 0,-4.07662 -2e-5,-1.37882 -0.37947,-2.45115 -1.13965,-3.21827 -0.76194,-0.7688 -1.90808,-0.90154 -3.44237,-0.39518 -1.17945,0.38931 -2.84126,1.51364 -4.99257,3.38085 -0.3904,0.3327 -0.64074,0.51747 -0.7507,0.55406 -0.19558,0.0652 -0.3668,3.9e-4 -0.51363,-0.19445 -0.13465,-0.19895 -0.202,-0.48128 -0.20199,-0.84695 -1e-5,-0.3453 0.0612,-0.63975 0.18363,-0.88328 0.17131,-0.36105 0.86176,-1.00434 2.06822,-1.92757 1.89239,-1.46888 3.31682,-2.35756 4.27913,-2.67154 1.90441,-0.62126 3.38216,-0.31269 4.43882,0.92018 1.05329,1.20909 1.5787,2.79915 1.57872,4.773 0,0 0,16.62862 0,16.62862 0,0 1.97614,-0.71664 1.97614,-0.71664 0.36334,-0.13177 0.62098,-0.10607 0.77314,0.077 0.15205,0.16316 0.22807,0.43326 0.22809,0.81038 -2e-5,0.35731 -0.0761,0.68284 -0.22809,0.97668 -0.15216,0.294 -0.4098,0.50756 -0.77314,0.64069 0,0 -3.48375,1.2765 -3.48375,1.2765 m 0,-12.52962 c -0.69996,-0.0967 -1.44303,-0.0891 -2.22949,0.0233 -0.78834,0.11262 -1.62047,0.32041 -2.49673,0.62375 -2.20674,0.76397 -3.94122,2.16401 -5.19605,4.20202 -0.95337,1.53165 -1.43106,3.1323 -1.43105,4.79877 -1e-5,1.54453 0.36138,2.71501 1.08302,3.51015 0.73228,0.78902 1.7913,0.93038 3.17399,0.42691 1.31676,-0.47947 2.5323,-1.35466 3.64772,-2.62381 1.12362,-1.28931 2.27325,-3.09547 3.44859,-5.41563 0,0 0,-5.54541 0,-5.54541"
id="path14144" />
<path
inkscape:connector-curvature="0"
d="m 363.37657,292.52517 c 0,0 0,-4.46549 0,-4.46549 0,0 3.26058,-1.06811 3.26058,-1.06811 0.32917,-0.10781 0.56487,-0.0698 0.70734,0.11412 0.14235,0.1838 0.21351,0.45813 0.21353,0.82302 -2e-5,0.34574 -0.0711,0.65733 -0.21353,0.93491 -0.14247,0.27777 -0.37817,0.47117 -0.70734,0.58025 0,0 -1.86625,0.61846 -1.86625,0.61846 0,0 0,24.27579 0,24.27579 -2e-5,1.62032 -0.19884,3.14134 -0.59683,4.56437 -0.26563,0.94969 -0.7088,1.99622 -1.33026,3.14072 -0.62268,1.14668 -1.19079,2.01258 -1.70405,2.59672 -0.51409,0.58507 -1.20267,1.04343 -2.06685,1.37504 0,0 -4.03689,1.54904 -4.03689,1.54904 -0.34152,0.13104 -0.58649,0.1075 -0.73469,-0.0709 -0.14829,-0.15886 -0.22246,-0.42461 -0.22245,-0.79717 -1e-5,-0.37258 0.0741,-0.70475 0.22245,-0.99644 0.1482,-0.29158 0.39317,-0.50222 0.73469,-0.63197 0,0 4.08746,-1.52372 4.08746,-1.52372 0.83042,-0.31553 1.57488,-0.96721 2.23397,-1.95413 0.66885,-0.98911 1.21963,-2.27103 1.65294,-3.84567 0.24415,-0.9032 0.36616,-1.98282 0.36618,-3.23934 0,0 0,-7.30717 0,-7.30717 -1.50064,4.12055 -3.44508,6.62347 -5.84129,7.49922 -1.95926,0.71605 -3.66187,0.0829 -5.10374,-1.90912 -1.43671,-2.02462 -2.15742,-4.82517 -2.15742,-8.39501 0,-3.56981 0.72071,-6.859 2.15742,-9.85774 1.44187,-2.98939 3.14448,-4.80022 5.10374,-5.43943 2.39621,-0.78171 4.34065,0.36653 5.84129,3.42973 m 0,7.33618 c -2e-5,-2.86099 -0.5661,-5.08622 -1.70124,-6.6799 -1.12797,-1.60294 -2.48445,-2.14543 -4.0723,-1.62139 -1.59565,0.52668 -2.97118,1.98968 -4.12378,4.39343 -1.15668,2.39261 -1.73656,5.03846 -1.73655,7.93123 -1e-5,2.91249 0.57987,5.17691 1.73655,6.78901 1.1526,1.58686 2.52813,2.0886 4.12378,1.51152 1.58785,-0.57426 2.94433,-2.05505 4.0723,-4.43824 1.13514,-2.39819 1.70122,-5.02464 1.70124,-7.88566"
id="path14146" />
<path
inkscape:connector-curvature="0"
d="m 385.85611,293.37466 c 0,0 -13.55496,4.71571 -13.55496,4.71571 0.2372,3.02382 0.96927,5.26873 2.19279,6.73218 1.2295,1.435 2.74111,1.82321 4.53079,1.17154 0.99106,-0.36087 2.02623,-1.02925 3.10508,-2.00348 1.07513,-0.97087 1.94922,-2.05434 2.62395,-3.25093 0.19693,-0.351 0.36786,-0.55242 0.51284,-0.60437 0.16557,-0.0593 0.31039,0.01 0.43448,0.20823 0.12401,0.17941 0.18601,0.42768 0.18602,0.74485 -10e-6,0.31721 -0.0827,0.65493 -0.24805,1.01332 -0.49671,1.11372 -1.38342,2.31505 -2.66343,3.60658 -1.27482,1.27424 -2.59161,2.16252 -3.95089,2.66259 -2.28921,0.84219 -4.21494,0.2119 -5.77044,-1.90319 -1.55233,-2.14839 -2.33133,-5.14665 -2.33133,-8.98687 0,-3.4963 0.73037,-6.7413 2.18612,-9.72476 1.45984,-2.97335 3.25394,-4.80294 5.37664,-5.49548 2.17154,-0.70841 3.94716,-0.0213 5.33343,2.05084 1.38014,2.04439 2.0576,5.06314 2.03696,9.06324 m -1.32018,-1.9248 c -0.25953,-2.51086 -0.94567,-4.39376 -2.06125,-5.65048 -1.10911,-1.26462 -2.43784,-1.64358 -3.98896,-1.13166 -1.55879,0.51451 -2.90637,1.77483 -4.03999,3.78444 -1.13768,2.01684 -1.8481,4.41869 -2.1284,7.20193 0,0 12.2186,-4.20423 12.2186,-4.20423"
id="path14148" />
</g>
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="busybox"
style="display:none">
style="display:inline">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
@ -1154,7 +1343,7 @@
style="display:inline">
<g
sodipodi:type="inkscape:box3d"
style="fill:#dc7000;fill-opacity:0.50666665;stroke:#000000;stroke-linejoin:round;stroke-opacity:1;display:inline"
style="fill:#dc7000;fill-opacity:0.6956522;stroke:#000000;stroke-linejoin:round;stroke-opacity:1;display:inline"
id="g4222"
inkscape:perspectiveID="#perspective3054"
inkscape:corner0="0.22429094 : 0.11834566 : 0 : 1"
@ -1162,81 +1351,40 @@
<path
sodipodi:type="inkscape:box3dside"
id="path4232"
style="fill:#dc7000;fill-opacity:0.50666665;fill-rule:evenodd;stroke:#000000;stroke-linejoin:round;stroke-opacity:1"
style="fill:#dc7000;fill-opacity:0.6956522;fill-rule:evenodd;stroke:#000000;stroke-linejoin:round;stroke-opacity:1"
inkscape:box3dsidetype="13"
d="M 252.05613,280.2201 384.72319,334.81304 666.79274,224.25249 541.87079,199.19901 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path4224"
style="fill:#dc7000;fill-opacity:0.50666665;fill-rule:evenodd;stroke:#000000;stroke-linejoin:round;stroke-opacity:1"
style="fill:#dc7000;fill-opacity:0.6956522;fill-rule:evenodd;stroke:#000000;stroke-linejoin:round;stroke-opacity:1"
inkscape:box3dsidetype="6"
d="m 252.05613,231.66533 0,48.55477 289.81466,-81.02109 0,-33.71629 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path4234"
style="fill:#dc7000;fill-opacity:0.50666665;fill-rule:evenodd;stroke:#000000;stroke-linejoin:round;stroke-opacity:1"
style="fill:#dc7000;fill-opacity:0.6956522;fill-rule:evenodd;stroke:#000000;stroke-linejoin:round;stroke-opacity:1"
inkscape:box3dsidetype="11"
d="m 541.87079,165.48272 124.92195,20.6172 0,38.15257 -124.92195,-25.05348 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path4226"
style="fill:#dc7000;fill-opacity:0.50666665;stroke:#000000;stroke-linejoin:round;stroke-opacity:1"
style="fill:#dc7000;fill-opacity:0.6956522;stroke:#000000;stroke-linejoin:round;stroke-opacity:1"
inkscape:box3dsidetype="5"
d="m 252.05613,231.66533 132.66706,44.8271 282.06955,-90.39251 -124.92195,-20.6172 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path4230"
style="fill:#dc7000;fill-opacity:0.50666665;stroke:#000000;stroke-linejoin:round;stroke-opacity:1"
style="fill:#dc7000;fill-opacity:0.6956522;stroke:#000000;stroke-linejoin:round;stroke-opacity:1"
inkscape:box3dsidetype="14"
d="m 384.72319,276.49243 0,58.32061 282.06955,-110.56055 0,-38.15257 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path4228"
style="fill:#dc7000;fill-opacity:0.50666665;stroke:#000000;stroke-linejoin:round;stroke-opacity:1"
style="fill:#dc7000;fill-opacity:0.6956522;stroke:#000000;stroke-linejoin:round;stroke-opacity:1"
inkscape:box3dsidetype="3"
d="m 252.05613,231.66533 132.66706,44.8271 0,58.32061 -132.66706,-54.59294 z" />
</g>
<g
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
id="text7405"
transform="matrix(0.86928132,0,0,0.86928132,68.726388,34.325549)">
<path
d="m 417.72187,271.67771 c 0.45964,-0.87898 0.95501,-1.58682 1.48596,-2.12375 0.55424,-0.54392 1.14379,-0.91726 1.7685,-1.12036 1.07876,-0.35057 1.95161,-0.2027 2.61991,0.44206 0.69087,0.63597 1.03586,1.98145 1.03589,4.03727 0,0 0,7.25115 0,7.25115 -3e-5,2.05593 -0.34502,3.64783 -1.03589,4.77721 -0.6683,1.09532 -1.54115,1.83155 -2.61991,2.20805 -0.98557,0.34403 -1.78059,0.29979 -2.38395,-0.13385 -0.60435,-0.43424 -1.05214,-1.48442 -1.34284,-3.15097 -0.16979,-1.1199 -0.50935,-1.91599 -1.01928,-2.38829 -0.9976,-0.92643 -2.40092,-1.46608 -4.21428,-1.61771 -1.79715,-0.16049 -3.61486,0.0653 -5.45337,0.67999 -2.29773,0.76835 -4.41987,2.04969 -6.36352,3.84723 -1.95316,1.80642 -3.68595,4.26332 -5.19549,7.37284 -1.51522,3.12131 -2.27496,6.47967 -2.27496,10.06631 0,0 0,5.77048 0,5.77048 0,4.28088 1.37679,7.34109 4.11635,9.17127 2.74635,1.8082 6.51717,1.79213 11.2834,-0.0225 2.81766,-1.07278 5.1872,-2.41185 7.11649,-4.017 1.11898,-0.92957 2.30747,-2.37459 3.56482,-4.33233 0.77171,-1.18439 1.37356,-1.98235 1.80635,-2.39529 0.43226,-0.44034 0.924,-0.76308 1.47501,-0.96835 0.98018,-0.36512 1.83884,-0.25397 2.57676,0.33193 0.73643,0.58484 1.10414,1.4594 1.10418,2.62451 -4e-5,1.16516 -0.49832,2.60348 -1.49676,4.31825 -1.4548,2.5064 -3.33495,4.76638 -5.64662,6.78184 -3.12807,2.73423 -6.61268,4.85827 -10.46302,6.36663 -4.53994,1.7785 -8.67566,2.32306 -12.39372,1.61343 -3.03035,-0.56053 -5.62935,-2.30057 -7.78841,-5.22863 -2.17061,-2.97285 -3.26028,-6.69992 -3.26028,-11.16928 0,0 0,-6.09058 0,-6.09058 0,-4.6738 0.97164,-9.36038 2.90802,-14.04301 1.95316,-4.69804 4.63314,-8.68963 8.02553,-11.97092 3.36399,-3.25375 6.90127,-5.47379 10.60692,-6.67212 2.21183,-0.71517 4.26347,-1.08158 6.15737,-1.10215 1.9092,-0.0564 3.67553,0.23986 5.30084,0.88669"
id="path7412"
inkscape:connector-curvature="0" />
<path
d="m 466.70409,284.11603 c -4e-5,3.10053 -0.70271,6.37256 -2.11204,9.826 -1.39335,3.43214 -3.49325,6.5661 -6.31177,9.40829 -2.81823,2.82872 -5.79051,4.86062 -8.92029,6.08721 -3.13367,1.22811 -6.1576,1.54546 -9.06886,0.9409 -2.93374,-0.63654 -5.18367,-2.17957 -6.73746,-4.63284 -1.56014,-2.46323 -2.3426,-5.36517 -2.34258,-8.69833 -2e-5,-3.3882 0.7941,-6.99172 2.37743,-10.79875 1.5768,-3.81873 3.82638,-7.15944 6.73687,-10.01746 2.91098,-2.84395 5.92341,-4.78983 9.0346,-5.84739 3.10768,-1.05629 6.06917,-1.12915 8.88765,-0.23026 2.81875,0.85825 4.92959,2.59617 6.34441,5.21111 1.40933,2.57869 2.112,5.4934 2.11204,8.75152 m -6.60014,2.45977 c -3e-5,-2.62464 -0.76966,-4.76021 -2.31368,-6.41189 -2.11994,-2.23039 -4.9249,-2.73963 -8.43028,-1.50955 -3.11119,1.09182 -5.72735,3.2159 -7.83793,6.37866 -2.1224,3.18051 -3.18806,6.37399 -3.18806,9.56707 0,2.61999 1.0771,4.674 3.22219,6.15574 2.13302,1.44634 4.73755,1.57892 7.8038,0.41099 3.06347,-1.16686 5.61932,-3.24823 7.67767,-6.23879 2.04698,-3.0006 3.06626,-5.78055 3.06629,-8.35223"
id="path7414"
inkscape:connector-curvature="0" />
<path
d="m 481.95196,260.34743 c 0,0 0,2.66299 0,2.66299 1.14044,-1.62655 2.38873,-2.97832 3.74374,-4.05613 1.36996,-1.0805 2.84485,-1.88838 4.42335,-2.42497 3.60997,-1.22702 6.4403,-0.76492 8.50935,1.36751 1.63094,1.69239 2.44358,4.36389 2.44362,8.02036 0,0 0,14.31302 0,14.31302 1.25392,-0.47538 2.17704,-0.46334 2.77196,0.0342 0.59383,0.47182 0.89038,1.28043 0.89041,2.42644 -3e-5,1.12112 -0.30615,2.16157 -0.91919,3.12262 -0.59495,0.93031 -1.60482,1.67385 -3.0332,2.23111 0,0 -5.40899,2.11024 -5.40899,2.11024 -1.45658,0.56826 -2.50348,0.62196 -3.13706,0.15871 -0.6149,-0.49714 -0.92274,-1.3301 -0.92273,-2.49824 -10e-6,-1.14273 0.30783,-2.18711 0.92273,-3.13192 0.61379,-0.96849 1.56213,-1.69544 2.8423,-2.18079 0,0 0,-14.66303 0,-14.66303 -3e-5,-1.69234 -0.35406,-2.80465 -1.06319,-3.33774 -0.92799,-0.68555 -2.32454,-0.70208 -4.19518,-0.0457 -1.41952,0.49817 -2.67379,1.29592 -3.76103,2.39428 -1.07036,1.069 -2.43819,3.04122 -4.10689,5.92428 0,0 0,14.70435 0,14.70435 1.60779,-0.60954 2.64191,-0.80934 3.10733,-0.60165 0.98946,0.39156 1.48317,1.32831 1.48319,2.81107 -2e-5,1.15043 -0.32236,2.22127 -0.96792,3.21388 -0.62652,0.9609 -1.69006,1.73454 -3.1945,2.32147 0,0 -7.19176,2.80576 -7.19176,2.80576 -1.54125,0.6013 -2.64914,0.6686 -3.31968,0.19933 -0.65079,-0.50439 -0.97661,-1.35781 -0.97661,-2.55958 0,-1.46302 0.50438,-2.79167 1.51105,-3.98347 0.50229,-0.58163 1.57779,-1.18477 3.22143,-1.80792 0,0 0,-19.38913 0,-19.38913 -1.35182,0.47637 -2.35332,0.45169 -3.00159,-0.0761 -0.64944,-0.52865 -0.97458,-1.38057 -0.97458,-2.55503 0,-1.17439 0.32514,-2.2388 0.97458,-3.19197 0.66916,-0.98457 1.77475,-1.73955 3.31283,-2.26462 0,0 6.01623,-2.05369 6.01623,-2.05369"
id="path7416"
inkscape:connector-curvature="0" />
<path
d="m 521.96757,254.15887 c 0,0 0,14.97869 0,14.97869 -2e-5,1.60357 0.24544,2.56759 0.73584,2.89169 0.76139,0.51136 2.1168,0.39509 4.05911,-0.34473 2.80364,-1.06789 5.37237,-2.84804 7.7113,-5.33397 0.89251,-0.95596 1.59086,-1.52809 2.09628,-1.71808 0.6958,-0.26155 1.29479,-0.1308 1.79747,0.39123 0.51917,0.51473 0.77845,1.28093 0.77848,2.2992 -3e-5,0.94726 -0.27662,1.87049 -0.83044,2.77083 -0.84992,1.44318 -2.53882,3.13186 -5.07954,5.07434 -2.54256,1.92649 -4.70294,3.24084 -6.47355,3.93476 -3.44262,1.34919 -6.0523,1.37395 -7.8094,0.0588 -1.74779,-1.35347 -2.62505,-3.50271 -2.62503,-6.44251 0,0 0,-16.5731 0,-16.5731 0,0 -2.05882,0.72547 -2.05882,0.72547 -1.37945,0.48611 -2.37084,0.49025 -2.97081,0.0103 -0.58222,-0.51196 -0.87369,-1.33661 -0.87369,-2.47329 0,-1.1119 0.29147,-2.11405 0.87369,-3.00531 0.59997,-0.92076 1.59136,-1.6167 2.97081,-2.08763 0,0 2.05882,-0.70279 2.05882,-0.70279 0,0 0,-6.79827 0,-6.79827 -2e-5,-1.81283 0.25877,-3.18359 0.77578,-4.11122 0.53464,-0.95657 1.22474,-1.57143 2.06939,-1.84519 0.82422,-0.26705 1.49131,-0.0937 2.00219,0.51875 0.52827,0.58142 0.7921,1.77073 0.79212,3.56862 0,0 0,6.74223 0,6.74223 0,0 10.18499,-3.47674 10.18499,-3.47674 1.30327,-0.44485 2.22483,-0.41358 2.76783,0.0919 0.55951,0.47491 0.83894,1.2595 0.83897,2.35437 -3e-5,1.07114 -0.27946,2.04959 -0.83897,2.93643 -0.543,0.8584 -1.46456,1.51706 -2.76783,1.97627 0,0 -10.18499,3.58889 -10.18499,3.58889"
id="path7418"
inkscape:connector-curvature="0" />
<path
d="m 559.66457,265.0724 c 0,0 0,-1.65213 0,-1.65213 -1.25166,1.42773 -2.63904,2.6702 -4.16386,3.72696 -1.5321,1.08495 -2.93048,1.87615 -4.19336,2.37115 -2.75884,1.08136 -5.01666,0.94734 -6.76281,-0.41439 -1.75549,-1.39258 -2.63677,-3.34151 -2.63676,-5.84124 -10e-6,-3.04209 1.12043,-6.27245 3.34992,-9.67368 2.23124,-3.40766 5.28286,-5.79805 9.13173,-7.17622 1.53009,-0.54785 3.28974,-0.94775 5.27514,-1.20046 0,0 0,-1.68655 0,-1.68655 -10e-6,-1.0555 -0.32465,-1.80122 -0.97488,-2.23783 -0.63528,-0.44317 -1.86051,-0.34677 -3.6824,0.29254 -1.50137,0.52689 -3.45863,1.632 -5.87999,3.32289 -0.90638,0.62348 -1.61309,1.02515 -2.1188,1.20392 -0.69244,0.24484 -1.28471,0.11428 -1.77624,-0.39265 -0.47531,-0.53707 -0.71321,-1.34616 -0.71321,-2.42667 0,-0.61067 0.085,-1.16859 0.2549,-1.67355 0.16981,-0.50463 0.4074,-0.93853 0.71264,-1.30164 0.30494,-0.38615 0.93933,-0.93193 1.90127,-1.63603 1.27817,-0.92773 2.57642,-1.75559 3.89452,-2.4841 1.31272,-0.74868 2.49627,-1.30178 3.55203,-1.66067 3.1303,-1.06398 5.53509,-0.93017 7.23033,0.38846 1.70225,1.28338 2.54998,3.55047 2.55001,6.8064 0,0 0,14.41279 0,14.41279 0,0 0.83751,-0.31753 0.83751,-0.31753 1.17673,-0.44611 2.00896,-0.43296 2.49936,0.0377 0.50538,0.4413 0.75778,1.18199 0.7578,2.2226 -2e-5,1.01802 -0.25242,1.95288 -0.7578,2.80559 -0.4904,0.82527 -1.32263,1.46729 -2.49936,1.92637 0,0 -5.78769,2.25798 -5.78769,2.25798 m 0,-12.63193 c -2.00172,0.18907 -3.85997,0.59879 -5.57212,1.23078 -2.06997,0.76411 -3.86077,2.13531 -5.36767,4.11681 -0.94116,1.26201 -1.41277,2.36215 -1.41276,3.29768 -10e-6,0.67828 0.22746,1.14181 0.68191,1.39034 0.83991,0.45156 1.98707,0.39956 3.43827,-0.15328 1.22924,-0.46827 2.61072,-1.33019 4.14246,-2.5826 1.54083,-1.25266 2.9034,-2.67625 4.08991,-4.27082 0,0 0,-3.02891 0,-3.02891"
id="path7420"
inkscape:connector-curvature="0" />
<path
d="m 585.74071,212.074 c 0,0 0,7.16504 0,7.16504 0,0 -5.51333,1.83108 -5.51333,1.83108 0,0 0,-7.22931 0,-7.22931 0,0 5.51333,-1.76681 5.51333,-1.76681 m 0.6264,12.63042 c 0,0 0,23.18845 0,23.18845 0,0 5.44909,-2.06588 5.44909,-2.06588 1.08113,-0.40987 1.84584,-0.38472 2.29649,0.0738 0.46445,0.43068 0.69642,1.14459 0.69644,2.14221 -2e-5,0.97595 -0.23199,1.86831 -0.69644,2.67799 -0.45065,0.78354 -1.21536,1.38608 -2.29649,1.80787 0,0 -15.69674,6.12386 -15.69674,6.12386 -1.14176,0.44544 -1.96206,0.45149 -2.45838,0.0164 -0.48157,-0.46425 -0.72262,-1.21347 -0.72262,-2.24714 0,-1.01118 0.24105,-1.92338 0.72262,-2.73565 0.49632,-0.83932 1.31662,-1.47551 2.45838,-1.90839 0,0 5.63166,-2.13509 5.63166,-2.13509 0,0 0,-16.55001 0,-16.55001 0,0 -3.76605,1.32704 -3.76605,1.32704 -1.11956,0.39453 -1.92723,0.3661 -2.42053,-0.0869 -0.4941,-0.47605 -0.74144,-1.22966 -0.74144,-2.26024 0,-1.00813 0.23961,-1.90826 0.71829,-2.69949 0.49335,-0.81758 1.30874,-1.42015 2.44368,-1.8076 0,0 8.38204,-2.86128 8.38204,-2.86128"
id="path7422"
inkscape:connector-curvature="0" />
<path
d="m 606.24115,217.92025 c 0,0 0,2.2023 0,2.2023 0.7802,-1.28921 1.63467,-2.3465 2.56278,-3.17247 0.93895,-0.82801 1.95053,-1.42568 3.03396,-1.79398 2.48087,-0.84324 4.42899,-0.32348 5.85479,1.54706 1.12491,1.48534 1.68574,3.74481 1.68578,6.78271 0,0 0,11.89164 0,11.89164 0.86581,-0.32825 1.50354,-0.26909 1.91468,0.17625 0.41052,0.42401 0.61557,1.11228 0.61559,2.06526 -2e-5,0.93228 -0.21169,1.78086 -0.63547,2.54657 -0.41117,0.74092 -1.10881,1.30366 -2.09499,1.6884 0,0 -3.72827,1.45454 -3.72827,1.45454 -1.00232,0.39104 -1.7223,0.37778 -2.15784,-0.0412 -0.42258,-0.44595 -0.63409,-1.15329 -0.63408,-2.12152 -1e-5,-0.94718 0.2115,-1.79617 0.63408,-2.54619 0.42194,-0.76993 1.0741,-1.32183 1.95495,-1.65578 0,0 0,-12.1648 0,-12.1648 -2e-5,-1.40401 -0.24368,-2.34454 -0.73159,-2.82219 -0.63824,-0.61483 -1.5982,-0.69805 -2.88303,-0.2472 -0.97422,0.34189 -1.83446,0.93988 -2.57973,1.79473 -0.73331,0.83097 -1.66987,2.39371 -2.81161,4.6933 0,0 0,12.16052 0,12.16052 1.10005,-0.41704 1.80804,-0.52636 2.12679,-0.32927 0.6779,0.37779 1.01628,1.18016 1.01629,2.40776 -10e-6,0.95246 -0.22094,1.82122 -0.6633,2.60717 -0.42918,0.76053 -1.15744,1.34151 -2.18696,1.74316 0,0 -4.91118,1.91603 -4.91118,1.91603 -1.0503,0.40976 -1.80479,0.403 -2.26125,-0.0218 -0.44287,-0.45256 -0.66454,-1.17471 -0.66454,-2.16594 0,-1.2067 0.34317,-2.27482 1.02834,-3.20276 0.342,-0.45242 1.07456,-0.8914 2.19484,-1.31613 0,0 0,-16.01045 0,-16.01045 -0.92144,0.32472 -1.60371,0.25352 -2.04516,-0.21486 -0.44212,-0.46902 -0.66341,-1.18822 -0.66341,-2.1571 0,-0.96882 0.22129,-1.83077 0.66341,-2.58503 0.45568,-0.77943 1.20889,-1.34815 2.25739,-1.7061 0,0 4.10874,-1.40255 4.10874,-1.40255"
id="path7424"
inkscape:connector-curvature="0" />
<path
d="m 644.42407,221.55153 c 0,0 -15.84858,5.88512 -15.84858,5.88512 0.41318,1.48367 1.14126,2.52944 2.18182,3.13726 1.04954,0.60078 2.45777,0.56327 4.21934,-0.10771 1.43657,-0.54718 3.33446,-1.76325 5.68431,-3.63848 0.96403,-0.76487 1.62951,-1.21599 1.99855,-1.3552 0.50353,-0.18992 0.92654,-0.0603 1.26941,0.38809 0.3424,0.44789 0.51345,1.10965 0.51347,1.98568 -2e-5,0.79642 -0.18329,1.54398 -0.55019,2.24339 -0.48998,0.92735 -1.68791,2.10137 -3.60292,3.52816 -1.92823,1.41649 -3.79437,2.47996 -5.59703,3.18644 -3.12825,1.22598 -5.65843,0.79547 -7.57412,-1.31227 -1.91553,-2.12687 -2.8781,-5.28997 -2.8781,-9.47861 0,-4.45685 1.04101,-8.44454 3.11177,-11.94407 2.06878,-3.49923 4.4295,-5.69213 7.07474,-6.5913 1.57787,-0.5363 3.01551,-0.58142 4.315,-0.13915 1.30587,0.43603 2.27203,1.05539 2.90198,1.85821 0.88687,1.17037 1.61767,2.74022 2.19361,4.70929 0.39141,1.37395 0.58692,3.05573 0.58694,5.04679 0,0 0,2.59836 0,2.59836 m -4.19058,-4.61262 c -0.58342,-1.55695 -1.34865,-2.60079 -2.29717,-3.13041 -0.95176,-0.55153 -2.0893,-0.59624 -3.41485,-0.13111 -1.31911,0.46293 -2.4656,1.31304 -3.43736,2.55189 -0.97511,1.22272 -1.77306,2.84546 -2.39235,4.86837 0,0 11.54173,-4.15874 11.54173,-4.15874"
id="path7426"
inkscape:connector-curvature="0" />
<path
d="m 656.45255,200.78016 c 0,0 0,3.74016 0,3.74016 1.50412,-2.33039 2.68177,-3.93837 3.53714,-4.83147 0.86415,-0.89415 1.66822,-1.46695 2.41272,-1.72004 1.14134,-0.38792 2.24384,-0.0528 3.30795,1.00108 0.72205,0.70786 1.08236,1.5579 1.08238,2.55158 -2e-5,0.84085 -0.17449,1.61893 -0.52373,2.33493 -0.33846,0.69384 -0.7508,1.12733 -1.23737,1.30005 -0.43076,0.15294 -0.88492,-0.0507 -1.36261,-0.6119 -0.47857,-0.56214 -0.90658,-0.77747 -1.28377,-0.64513 -0.49233,0.17279 -1.23248,0.95394 -2.22251,2.34704 -0.98213,1.39417 -2.21771,3.40728 -3.7102,6.0464 0,0 0,9.029 0,9.029 0,0 5.07344,-1.92346 5.07344,-1.92346 0.84781,-0.32142 1.44769,-0.26977 1.8013,0.15376 0.36448,0.39943 0.54656,1.04086 0.54657,1.92471 -1e-5,0.86465 -0.18209,1.64615 -0.54657,2.3452 -0.35361,0.67633 -0.95349,1.17981 -1.8013,1.51057 0,0 -10.8696,4.24062 -10.8696,4.24062 -0.88519,0.34534 -1.52093,0.31698 -1.90547,-0.0864 -0.37306,-0.42833 -0.55977,-1.09756 -0.55977,-2.00725 0,-0.88991 0.18671,-1.683 0.55977,-2.37855 0.38454,-0.71891 1.02028,-1.24619 1.90547,-1.58179 0,0 2.17687,-0.82531 2.17687,-0.82531 0,0 0,-14.64841 0,-14.64841 0,0 -1.31833,0.46454 -1.31833,0.46454 -0.88243,0.31097 -1.51618,0.25832 -1.89952,-0.15911 -0.37188,-0.4419 -0.55801,-1.11722 -0.55801,-2.02551 0,-0.88849 0.18613,-1.67319 0.55801,-2.35341 0.38334,-0.70305 1.01709,-1.2052 1.89952,-1.50645 0,0 4.93762,-1.6855 4.93762,-1.6855"
id="path7428"
inkscape:connector-curvature="0" />
</g>
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 384.72319,334.81304 0,-58.32061 282.06955,-90.39251 0,38.15257 z"
@ -1280,36 +1428,83 @@
inkscape:connector-curvature="0" />
</g>
<g
id="text7126"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
transform="matrix(0.57476281,0,0,0.57476281,223.85115,141.75209)">
id="text9181"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New"
transform="translate(0,-6)">
<path
id="path7133"
d="m 424.21557,335.98998 c 0,0 0,55.19399 0,55.19399 0,0 13.47722,-6.53014 13.47722,-6.53014 3.14312,-1.52293 5.35743,-1.94671 6.65892,-1.28244 1.33868,0.59704 2.00626,1.9199 2.00632,3.97014 -6e-5,2.00575 -0.66764,3.98769 -2.00632,5.95105 -1.30149,1.90451 -3.5158,3.6444 -6.65892,5.22447 0,0 -41.77049,20.99836 -41.77049,20.99836 -3.52678,1.77294 -6.07175,2.38156 -7.61614,1.81257 -1.50171,-0.64346 -2.25469,-2.0732 -2.25465,-4.28748 -4e-5,-2.1661 0.75294,-4.2911 2.25465,-6.36916 1.54439,-2.1417 4.08936,-4.06954 7.61614,-5.77839 0,0 14.46852,-7.01045 14.46852,-7.01045 0,0 0,-56.17707 0,-56.17707 0,0 -14.46852,5.9816 -14.46852,5.9816 -3.52678,1.45812 -6.07175,1.8395 -7.61614,1.13255 -1.50171,-0.77747 -2.25469,-2.27444 -2.25465,-4.4888 -4e-5,-2.21416 0.75294,-4.29593 2.25465,-6.23985 1.54439,-2.0036 4.08936,-3.70398 7.61614,-5.0977 0,0 41.77049,-16.43825 41.77049,-16.43825 3.14312,-1.24222 5.35743,-1.49068 6.65892,-0.75493 1.33868,0.71676 2.00626,2.09928 2.00632,4.14946 -6e-5,2.05039 -0.66764,3.99501 -2.00632,5.83877 -1.30149,1.78837 -3.5158,3.33055 -6.65892,4.62992 0,0 -13.47722,5.57177 -13.47722,5.57177"
id="path9188"
d="m 419.10683,281.89145 c 0,0 0,-2.03714 0,-2.03714 -3e-5,-0.69051 0.0779,-1.21057 0.23359,-1.56003 0.16977,-0.35378 0.38897,-0.57387 0.65748,-0.66032 0.26827,-0.0863 0.47992,-0.005 0.63507,0.24347 0.16913,0.24399 0.25367,0.71031 0.2537,1.39901 0,0 0,8.02408 0,8.02408 -3e-5,0.71176 -0.0846,1.24546 -0.2537,1.6012 -0.15515,0.3512 -0.3668,0.57235 -0.63507,0.66333 -0.24024,0.0815 -0.44526,0.0131 -0.61501,-0.20548 -0.15572,-0.22341 -0.24776,-0.64111 -0.27606,-1.25309 -0.0708,-1.90988 -0.71598,-3.41113 -1.93866,-4.50643 -1.6562,-1.51414 -3.55054,-1.92872 -5.68694,-1.23502 -1.40743,0.45705 -2.7403,1.39227 -3.99772,2.80806 -0.93873,1.03358 -1.68859,2.17121 -2.24836,3.41229 -0.97438,2.15669 -1.75138,4.45228 -2.32971,6.88527 -0.4158,1.79161 -0.62389,3.72591 -0.62389,5.80133 0,0 0,5.20043 0,5.20043 0,4.43391 1.00955,7.91984 3.01993,10.44682 1.99887,2.48909 4.30676,3.23169 6.91744,2.24404 1.55697,-0.58902 2.94224,-1.65714 4.15785,-3.20225 1.2255,-1.54498 2.40414,-3.62131 3.53637,-6.22666 0.24009,-0.57118 0.50825,-0.91111 0.80442,-1.02002 0.25361,-0.0933 0.45778,-0.0421 0.61262,0.1533 0.15472,0.19535 0.23206,0.48794 0.23209,0.87783 -3e-5,0.52756 -0.30247,1.44272 -0.90815,2.74722 -1.15807,2.54873 -2.46912,4.64404 -3.9349,6.28471 -1.45779,1.61908 -2.94333,2.71978 -4.45696,3.29882 -1.31723,0.50391 -2.6613,0.60967 -4.03252,0.31496 -1.05399,-0.23099 -1.9274,-0.63787 -2.61886,-1.22095 -0.69284,-0.58423 -1.54974,-1.68494 -2.57189,-3.30482 -1.01027,-1.65369 -1.7028,-3.26411 -2.07569,-4.82896 -0.37329,-1.59011 -0.56008,-3.4145 -0.56008,-5.47187 0,0 0,-6.06566 0,-6.06566 0,-2.93231 0.49291,-6.09055 1.47668,-9.46765 0.99585,-3.39605 2.34392,-6.18065 4.04011,-8.35311 1.70261,-2.18997 3.53533,-3.5965 5.49604,-4.22491 2.99933,-0.96119 5.55976,-0.14235 7.69078,2.4382"
inkscape:connector-curvature="0" />
<path
id="path7135"
d="m 474.35548,321.63415 c 0,0 0,3.73374 0,3.73374 1.92733,-2.9209 3.65321,-5.08391 5.18045,-6.49616 1.55867,-1.46461 3.33722,-2.61502 5.33231,-3.45245 1.68521,-0.70725 3.34395,-0.94038 4.97648,-0.70268 1.62504,0.23673 3.20599,0.94782 4.74343,2.13018 1.93051,-2.65596 3.86859,-4.82797 5.81403,-6.51986 1.97032,-1.73866 3.96513,-3.02996 5.98397,-3.87753 4.00255,-1.68024 7.21652,-1.79129 9.66328,-0.35535 3.21252,1.855 4.80754,5.38685 4.80759,10.60859 0,0 0,27.6555 0,27.6555 2.1599,-1.04652 3.75414,-1.23977 4.79061,-0.58622 1.03318,0.65163 1.54863,1.87201 1.54868,3.66267 -5e-5,1.79071 -0.5155,3.52001 -1.54868,5.19171 -1.03647,1.63695 -2.79895,3.08221 -5.29884,4.33892 0,0 -10.06477,5.05964 -10.06477,5.05964 0,0 0,-39.58935 0,-39.58935 -6e-5,-1.91719 -0.297,-3.11211 -0.89158,-3.58537 -0.59574,-0.47394 -1.50874,-0.44198 -2.74155,0.0979 -1.20189,0.52645 -2.3191,1.38607 -3.35078,2.58013 -1.3208,1.61273 -2.93391,4.26901 -4.84334,7.97938 0,0 0,25.7042 0,25.7042 2.30443,-1.11656 4.00503,-1.34235 5.11047,-0.68443 1.10187,0.6559 1.65151,1.90764 1.65157,3.75675 -6e-5,1.84918 -0.5497,3.64359 -1.65157,5.38738 -1.10544,1.70812 -2.98552,3.23082 -5.65277,4.57166 0,0 -10.74506,5.40164 -10.74506,5.40164 0,0 0,-40.91537 0,-40.91537 -3e-5,-1.93926 -0.33584,-3.14035 -1.00844,-3.60389 -0.63643,-0.52301 -1.61196,-0.49718 -2.92936,0.0798 -1.36017,0.59578 -2.70648,1.67478 -4.03875,3.23966 -1.33726,1.52808 -2.94849,4.14396 -4.83738,7.8579 0,0 0,26.58677 0,26.58677 2.46515,-1.19443 4.28396,-1.45709 5.46607,-0.79567 1.21615,0.64074 1.82269,1.91622 1.82272,3.82806 -3e-5,1.91187 -0.60657,3.7862 -1.82272,5.62767 -1.18211,1.78589 -3.1929,3.39402 -6.04626,4.82843 0,0 -10.90353,5.48129 -10.90353,5.48129 -2.9631,1.48957 -5.07979,1.93911 -6.33531,1.33808 -1.30051,-0.6268 -1.95246,-1.95499 -1.95246,-3.98291 0,-1.98383 0.63159,-3.90163 1.8916,-5.74874 1.25573,-1.88473 3.19176,-3.45934 5.79746,-4.7219 0,0 0,-32.59212 0,-32.59212 -2.6057,1.14753 -4.54173,1.36358 -5.79746,0.64022 -1.26001,-0.7257 -1.8916,-2.08142 -1.8916,-4.06531 0,-1.98377 0.65195,-3.87089 1.95246,-5.65667 1.25552,-1.80622 3.37221,-3.33638 6.33531,-4.58745 0,0 11.48372,-4.84843 11.48372,-4.84843"
id="path9190"
d="m 446.20148,293.70621 c -2e-5,4.24459 -0.90262,8.20511 -2.71524,11.89678 -1.80943,3.70706 -4.00854,6.06196 -6.60502,7.05524 -2.64397,1.01145 -4.90651,0.34117 -6.7797,-2.02677 -1.88367,-2.40388 -2.82947,-5.7829 -2.82946,-10.12702 -1e-5,-4.36681 0.94579,-8.42515 2.82946,-12.15934 1.87319,-3.73593 4.13573,-6.04253 6.7797,-6.93007 2.59648,-0.87152 4.79559,-0.0961 6.60502,2.31138 1.81262,2.38984 2.71522,5.71315 2.71524,9.9798 m -1.66979,0.59968 c -1e-5,-3.50178 -0.74267,-6.22333 -2.23301,-8.17124 -1.48384,-1.96123 -3.2946,-2.58265 -5.43761,-1.85412 -2.1569,0.73328 -4.00807,2.62575 -5.54831,5.68434 -1.53361,3.04527 -2.30304,6.35392 -2.30304,9.91552 0,3.53895 0.76943,6.29496 2.30304,8.26131 1.54024,1.9523 3.39141,2.51514 5.54831,1.69916 2.14301,-0.81073 3.95377,-2.73277 5.43761,-5.75981 1.49034,-3.04055 2.233,-6.29551 2.23301,-9.77516"
inkscape:connector-curvature="0" />
<path
id="path7137"
d="m 562.43254,335.80937 c 0,0 0,-2.71514 0,-2.71514 -2.30606,2.70118 -4.87114,5.1449 -7.70127,7.33086 -2.8552,2.24364 -5.47141,3.96922 -7.84251,5.16834 -5.20777,2.63369 -9.49858,3.09887 -12.83492,1.35082 -3.37011,-1.8053 -5.06796,-4.81824 -5.06796,-9.0251 0,-5.11964 2.15792,-10.86811 6.43245,-17.18435 4.25226,-6.28955 10.02684,-11.0544 17.24316,-14.30015 2.84824,-1.28103 6.10956,-2.36863 9.77105,-3.26347 0,0 0,-2.7717 0,-2.7717 -2e-5,-1.73462 -0.5974,-2.88455 -1.79549,-3.45139 -1.17251,-0.58209 -3.43943,-0.13856 -6.82404,1.3438 -2.80151,1.22705 -6.47056,3.52887 -11.03627,6.93278 -1.71671,1.26407 -3.05812,2.11073 -4.01962,2.53599 -1.3186,0.58329 -2.4484,0.51384 -3.38742,-0.21163 -0.9092,-0.78105 -1.36471,-2.07838 -1.36471,-3.89039 0,-1.02411 0.16274,-1.9804 0.48805,-2.86825 0.32494,-0.88687 0.77935,-1.67105 1.36269,-2.35229 0.5823,-0.71918 1.79217,-1.78262 3.62279,-3.18545 2.42508,-1.8453 4.8798,-3.52261 7.36327,-5.03345 2.46472,-1.53781 4.67946,-2.71773 6.6492,-3.54469 5.80784,-2.43811 10.23696,-2.73568 13.34237,-0.93866 3.10431,1.72985 4.6451,5.24645 4.64515,10.56249 0,0 0,23.53209 0,23.53209 0,0 1.51884,-0.73593 1.51884,-0.73593 2.12842,-1.03128 3.62972,-1.22407 4.51288,-0.58501 0.90892,0.5867 1.36241,1.72437 1.36247,3.4143 -6e-5,1.65327 -0.45355,3.23865 -1.36247,4.75951 -0.88316,1.47417 -2.38446,2.74508 -4.51288,3.81506 0,0 -10.56481,5.31101 -10.56481,5.31101 m 0,-20.75947 c -3.69168,0.82545 -7.13631,1.98253 -10.32525,3.47506 -3.87486,1.81361 -7.24447,4.57256 -10.09242,8.28457 -1.7846,2.36681 -2.68052,4.33654 -2.68052,5.89954 0,1.13321 0.43227,1.84245 1.29513,2.12718 1.59189,0.51241 3.7604,0.0971 6.49405,-1.2357 2.30727,-1.12489 4.89129,-2.94044 7.74527,-5.43602 2.85919,-2.48828 5.37788,-5.20012 7.56374,-8.13688 0,0 0,-4.97775 0,-4.97775"
id="path9192"
d="m 455.60751,276.10974 c 0,0 0,4.15113 0,4.15113 1.11495,-2.3191 2.11892,-3.99679 3.01293,-5.03692 0.89151,-1.03717 1.89309,-1.74157 3.00371,-2.11441 1.19364,-0.40064 2.27776,-0.32355 3.25343,0.22887 0.68978,0.41072 1.31055,1.27219 1.86271,2.58332 0.56341,1.28329 0.84476,2.70473 0.84478,4.26601 0,0 0,16.97118 0,16.97118 0,0 1.29949,-0.48945 1.29949,-0.48945 0.36507,-0.1375 0.62647,-0.10806 0.78443,0.0883 0.15785,0.17489 0.23676,0.46473 0.23678,0.86961 -2e-5,0.38358 -0.079,0.73322 -0.23678,1.04899 -0.15796,0.31594 -0.41936,0.54343 -0.78443,0.68248 0,0 -4.13649,1.57553 -4.13649,1.57553 -0.38266,0.14575 -0.6545,0.1203 -0.81523,-0.0767 -0.16083,-0.19703 -0.24127,-0.48927 -0.24126,-0.8766 -10e-6,-0.40886 0.0804,-0.76201 0.24126,-1.05937 0.16073,-0.31869 0.43257,-0.5501 0.81523,-0.69423 0,0 1.29268,-0.48689 1.29268,-0.48689 0,0 0,-16.56218 0,-16.56218 -2e-5,-1.9081 -0.39958,-3.37817 -1.20018,-4.41215 -0.80264,-1.05804 -1.88008,-1.35848 -3.23511,-0.89784 -1.03568,0.35211 -1.93681,1.02658 -2.70223,2.02432 -0.76727,0.97846 -1.86472,3.15928 -3.29572,6.55195 0,0 0,17.22555 0,17.22555 0,0 1.80355,-0.67931 1.80355,-0.67931 0.3784,-0.14252 0.64933,-0.11436 0.81305,0.0844 0.16361,0.17695 0.24539,0.47148 0.2454,0.88368 -1e-5,0.39049 -0.0818,0.74701 -0.2454,1.06957 -0.16372,0.32276 -0.43465,0.55619 -0.81305,0.70032 0,0 -5.22933,1.99177 -5.22933,1.99177 -0.38503,0.14665 -0.66124,0.12033 -0.82837,-0.0793 -0.16721,-0.19969 -0.25085,-0.49706 -0.25084,-0.89202 -1e-5,-0.4169 0.0836,-0.77761 0.25084,-1.08204 0.16713,-0.32618 0.44334,-0.56178 0.82837,-0.7068 0,0 1.82264,-0.68649 1.82264,-0.68649 0,0 0,-22.83855 0,-22.83855 0,0 -1.36122,0.46482 -1.36122,0.46482 -0.38448,0.13131 -0.6603,0.094 -0.82719,-0.11207 -0.16697,-0.20614 -0.2505,-0.51757 -0.25049,-0.93421 -1e-5,-0.39465 0.0835,-0.75178 0.25049,-1.07132 0.16689,-0.31929 0.44271,-0.54376 0.82719,-0.67343 0,0 2.96436,-0.99954 2.96436,-0.99954"
inkscape:connector-curvature="0" />
<path
id="path7139"
d="m 614.59063,265.59533 c 0,0 0,-3.16839 0,-3.16839 0,0 8.92,-3.76602 8.92,-3.76602 1.79996,-0.75989 3.07019,-0.80436 3.81764,-0.13827 0.76945,0.6204 1.15341,1.70749 1.15345,3.26251 -4e-5,1.52133 -0.384,2.93962 -1.15345,4.25756 -0.74745,1.27705 -2.01768,2.31128 -3.81764,3.10391 0,0 -1.28387,0.56539 -1.28387,0.56539 0,0 0,38.24265 0,38.24265 -4e-5,3.691 -0.5643,7.19606 -1.6961,10.52494 -1.11156,3.36323 -2.83663,6.66786 -5.18616,9.92382 -2.36864,3.28232 -5.0627,5.74584 -8.09096,7.38311 0,0 -9.11465,4.9279 -9.11465,4.9279 -1.97442,1.06746 -3.39649,1.31721 -4.25833,0.74277 -0.83728,-0.55472 -1.2568,-1.64096 -1.25677,-3.2576 -3e-5,-1.65259 0.41949,-3.22074 1.25677,-4.70139 0.86184,-1.45486 2.28391,-2.69907 4.25833,-3.73065 0,0 8.88239,-4.64088 8.88239,-4.64088 2.41674,-1.26271 4.28005,-3.1242 5.60022,-5.58388 1.31418,-2.44866 1.96909,-5.01935 1.96913,-7.72028 0,0 0,-5.19407 0,-5.19407 -1.71598,2.38202 -3.4802,4.41407 -5.29344,6.09337 -1.79872,1.67668 -3.66026,3.00312 -5.58571,3.97635 -5.50613,2.78311 -10.19527,2.66011 -14.02683,-0.43675 -3.88027,-3.17252 -5.83896,-8.5095 -5.83896,-15.98064 0,-7.50753 1.95869,-14.65634 5.83896,-21.38216 3.83156,-6.6772 8.5207,-11.15558 14.02683,-13.46567 2.02917,-0.85127 3.94159,-1.25068 5.73937,-1.20278 1.81231,0.002 3.52501,0.45844 5.13978,1.36515 m -0.0377,20.43011 c -4e-5,-3.91307 -1.05883,-6.83031 -3.18794,-8.76215 -2.11904,-1.95711 -4.6924,-2.28085 -7.7318,-0.95049 -3.07071,1.34414 -5.7337,3.98774 -7.9777,7.94239 -2.23376,3.97214 -3.35686,8.0001 -3.35684,12.06182 -2e-5,4.09774 1.12308,7.10481 3.35684,9.01068 2.244,1.84339 4.90699,2.00617 7.9777,0.51014 3.0394,-1.48077 5.61276,-4.16715 7.7318,-8.04946 2.12911,-3.90122 3.1879,-7.81515 3.18794,-11.76293"
id="path9194"
d="m 479.92231,267.91115 c 0,0 7.93929,-2.67701 7.93929,-2.67701 0.34358,-0.11582 0.58957,-0.0747 0.73824,0.12332 0.14856,0.19796 0.22283,0.49327 0.22285,0.88604 -2e-5,0.37214 -0.0743,0.70755 -0.22285,1.00626 -0.14867,0.29894 -0.39466,0.50704 -0.73824,0.62435 0,0 -7.93929,2.71107 -7.93929,2.71107 0,0 0,17.5856 0,17.5856 -10e-6,1.53103 0.34075,2.68285 1.02117,3.45423 0.69061,0.76528 1.69453,0.8979 3.00873,0.40072 0.98487,-0.37258 2.04735,-1.03413 3.18661,-1.9829 1.13503,-0.96594 2.01495,-1.89616 2.64195,-2.79193 0.22765,-0.35338 0.41536,-0.55761 0.56319,-0.61282 0.1818,-0.0679 0.3408,0.007 0.47704,0.22365 0.13614,0.1963 0.20421,0.46949 0.20422,0.81966 -10e-6,0.30901 -0.0738,0.62518 -0.22124,0.94859 -0.36343,0.81742 -1.25108,1.8964 -2.66748,3.24084 -1.41148,1.32553 -2.77168,2.23999 -4.07986,2.74044 -1.71013,0.65421 -3.07802,0.45516 -4.09907,-0.60245 -1.02442,-1.06109 -1.53788,-2.82281 -1.53788,-5.28253 0,0 0,-17.628 0,-17.628 0,0 -2.75879,0.94206 -2.75879,0.94206 -0.35775,0.12218 -0.61439,0.083 -0.76967,-0.11774 -0.15535,-0.20078 -0.23305,-0.50216 -0.23305,-0.90403 0,-0.38067 0.0777,-0.72418 0.23305,-1.03047 0.15528,-0.30606 0.41192,-0.51941 0.76967,-0.64007 0,0 2.75879,-0.93022 2.75879,-0.93022 0,0 0,-7.82065 0,-7.82065 0,-0.63066 0.0709,-1.10555 0.21258,-1.42455 0.14162,-0.31879 0.31857,-0.51233 0.53079,-0.58066 0.22384,-0.072 0.40634,0.006 0.54755,0.23289 0.14114,0.22719 0.21169,0.65532 0.2117,1.28446 0,0 0,7.80185 0,7.80185"
inkscape:connector-curvature="0" />
<path
id="path7141"
d="m 666.74676,266.8091 c 0,0 -27.70776,13.06906 -27.70776,13.06906 0.73837,2.30281 2.03731,3.81645 3.88909,4.54184 1.86216,0.70963 4.35196,0.30059 7.45241,-1.21076 2.51697,-1.22691 5.82649,-3.62825 9.89955,-7.1722 1.66319,-1.44005 2.80865,-2.30969 3.44295,-2.61502 0.86438,-0.41605 1.5896,-0.30651 2.17677,0.32658 0.58582,0.63176 0.87828,1.64102 0.87831,3.02886 -3e-5,1.26171 -0.31339,2.48919 -0.94115,3.68452 -0.8394,1.58764 -2.89644,3.74108 -6.19931,6.48162 -3.34379,2.74229 -6.59732,4.91806 -9.75663,6.51552 -5.52112,2.79166 -10.02299,2.76518 -13.45335,-0.14815 -3.449,-2.96066 -5.18937,-7.86937 -5.18937,-14.69893 0,-7.26688 1.88196,-13.999 5.60883,-20.13533 3.70116,-6.09897 7.89786,-10.11107 12.56687,-12.0712 2.7683,-1.1621 5.27977,-1.50678 7.54111,-1.04568 2.26409,0.44825 3.93385,1.25121 5.02007,2.40819 1.526,1.68907 2.78058,4.0385 3.76749,7.04712 0.66979,2.09858 1.00409,4.72307 1.00412,7.87745 0,0 0,4.11651 0,4.11651 m -7.20565,-6.43207 c -1.00994,-2.36059 -2.33715,-3.86869 -3.98626,-4.52066 -1.65921,-0.68816 -3.64816,-0.52771 -5.974,0.49093 -2.32324,1.01757 -4.34961,2.62703 -6.07233,4.83214 -1.73349,2.1859 -3.15565,4.98628 -4.26166,8.401 0,0 20.29425,-9.20341 20.29425,-9.20341"
id="path9196"
d="m 507.59418,284.6149 c 0,0 0,-3.63759 0,-3.63759 -1.97126,3.83544 -4.09162,6.19491 -6.36413,7.06425 -1.66058,0.63526 -2.96464,0.36062 -3.90749,-0.82933 -0.94581,-1.21408 -1.41981,-2.9567 -1.41981,-5.22501 0,-2.49306 0.62441,-4.89516 1.86942,-7.19916 1.2399,-2.29455 3.04084,-3.85692 5.3928,-4.68926 0.63133,-0.22341 1.31558,-0.38496 2.05241,-0.48487 0.73499,-0.11963 1.52741,-0.16982 2.3768,-0.15063 0,0 0,-4.08853 0,-4.08853 -10e-6,-1.38285 -0.34377,-2.46702 -1.03247,-3.25387 -0.69032,-0.78861 -1.72878,-0.94811 -3.11901,-0.47551 -1.06879,0.36336 -2.57478,1.45299 -4.52455,3.2767 -0.35386,0.32479 -0.58075,0.50443 -0.68042,0.53862 -0.17727,0.0609 -0.33247,-0.008 -0.46556,-0.20685 -0.12205,-0.20267 -0.1831,-0.48744 -0.18309,-0.85428 -1e-5,-0.34641 0.0555,-0.64039 0.16645,-0.88189 0.15527,-0.35826 0.7811,-0.98775 1.87459,-1.88616 1.71506,-1.42987 3.00589,-2.28846 3.8779,-2.5812 1.72557,-0.5792 3.06445,-0.23562 4.02174,1.02522 0.95419,1.23685 1.43016,2.84357 1.43017,4.82313 0,0 0,16.67655 0,16.67655 0,0 1.79004,-0.67421 1.79004,-0.67421 0.32911,-0.12395 0.56246,-0.0924 0.70028,0.0947 0.13772,0.16703 0.20657,0.43961 0.20659,0.8178 -2e-5,0.35829 -0.0689,0.68305 -0.20659,0.9743 -0.13782,0.29141 -0.37117,0.49978 -0.70028,0.62513 0,0 -3.15579,1.202 -3.15579,1.202 m 0,-12.56621 c -0.63412,-0.11291 -1.30734,-0.12215 -2.01989,-0.0274 -0.71427,0.095 -1.46826,0.28452 -2.26226,0.56886 -1.99974,0.71618 -3.57168,2.08121 -4.70901,4.09722 -0.86414,1.51494 -1.29713,3.10995 -1.29712,4.78174 -1e-5,1.54949 0.32757,2.73182 0.98167,3.54568 0.66373,0.80794 1.62356,0.97347 2.87668,0.4994 1.19328,-0.45143 2.29477,-1.30203 3.30546,-2.54998 1.01808,-1.26789 2.05966,-3.05352 3.12447,-5.35395 0,0 0,-5.5616 0,-5.5616"
inkscape:connector-curvature="0" />
<path
id="path9198"
d="m 523.702,240.54258 c 0,0 0,6.34723 0,6.34723 0,0 -1.89662,0.61903 -1.89662,0.61903 0,0 0,-6.36799 0,-6.36799 0,0 1.89662,-0.59827 1.89662,-0.59827 m 0.0457,12.59128 c 0,0 0,22.8716 0,22.8716 0,0 4.98692,-1.8783 4.98692,-1.8783 0.30944,-0.11656 0.52886,-0.0834 0.65845,0.0995 0.1295,0.16349 0.19423,0.42857 0.19424,0.79531 -10e-6,0.34743 -0.0648,0.66158 -0.19424,0.94246 -0.12959,0.28103 -0.34901,0.48047 -0.65845,0.59834 0,0 -11.367,4.32951 -11.367,4.32951 -0.31177,0.11876 -0.53541,0.0856 -0.67072,-0.0998 -0.13538,-0.1854 -0.20308,-0.45583 -0.20308,-0.81118 0,-0.37512 0.0677,-0.69681 0.20308,-0.96503 0.13531,-0.28782 0.35895,-0.49043 0.67072,-0.60786 0,0 5.09683,-1.9197 5.09683,-1.9197 0,0 0,-20.43068 0,-20.43068 0,0 -3.77547,1.28922 -3.77547,1.28922 -0.31037,0.106 -0.53819,0.0657 -0.68325,-0.12114 -0.13477,-0.19038 -0.20218,-0.46292 -0.20217,-0.81751 -10e-6,-0.37425 0.0674,-0.70236 0.20217,-0.98427 0.1347,-0.28172 0.36252,-0.47665 0.68325,-0.58482 0,0 5.05872,-1.70573 5.05872,-1.70573"
inkscape:connector-curvature="0" />
<path
id="path9200"
d="m 537.32375,248.55623 c 0,0 0,3.62744 0,3.62744 0.85157,-1.98473 1.61868,-3.41372 2.30203,-4.28987 0.68168,-0.87397 1.4478,-1.45313 2.29768,-1.73844 0.91383,-0.30672 1.74417,-0.19946 2.49175,0.31998 0.5287,0.38502 1.00462,1.16228 1.42804,2.33096 0.43214,1.14498 0.64797,2.40056 0.64799,3.76807 0,0 0,14.86484 0,14.86484 0,0 0.99719,-0.37559 0.99719,-0.37559 0.28024,-0.10556 0.48092,-0.0691 0.6022,0.1094 0.1212,0.15971 0.18179,0.41693 0.18181,0.77172 -2e-5,0.33612 -0.0606,0.63926 -0.18181,0.90944 -0.12128,0.27032 -0.32196,0.45885 -0.6022,0.56559 0,0 -3.17247,1.20835 -3.17247,1.20835 -0.29322,0.11168 -0.5015,0.0781 -0.62464,-0.10097 -0.1232,-0.17913 -0.18482,-0.43824 -0.18481,-0.77724 -1e-5,-0.35784 0.0616,-0.66361 0.18481,-0.91724 0.12314,-0.27233 0.33142,-0.46371 0.62464,-0.57415 0,0 0.99087,-0.37321 0.99087,-0.37321 0,0 0,-14.50223 0,-14.50223 -2e-5,-1.67078 -0.30634,-2.97304 -0.91998,-3.90831 -0.61502,-0.95611 -1.44029,-1.25912 -2.47769,-0.90646 -0.79254,0.26945 -1.48185,0.82573 -2.06717,1.66956 -0.58655,0.82666 -1.42522,2.69155 -2.51824,5.6018 0,0 0,15.05244 0,15.05244 0,0 1.37768,-0.5189 1.37768,-0.5189 0.28918,-0.10892 0.49624,-0.0731 0.62138,0.10749 0.12507,0.16149 0.18759,0.4224 0.18759,0.7828 0,0.34142 -0.0626,0.64972 -0.18759,0.9249 -0.12514,0.27533 -0.3322,0.46807 -0.62138,0.57821 0,0 -3.99187,1.52045 -3.99187,1.52045 -0.2936,0.11182 -0.50419,0.0772 -0.6316,-0.10415 -0.12747,-0.18138 -0.19123,-0.44453 -0.19122,-0.78936 -1e-5,-0.36399 0.0637,-0.67542 0.19122,-0.93422 0.12741,-0.27783 0.338,-0.47202 0.6316,-0.5826 0,0 1.39041,-0.52369 1.39041,-0.52369 0,0 0,-19.9511 0,-19.9511 0,0 -1.03851,0.35462 -1.03851,0.35462 -0.29323,0.10015 -0.50356,0.0572 -0.63081,-0.1291 -0.12731,-0.18629 -0.19099,-0.46138 -0.19098,-0.82516 -1e-5,-0.3446 0.0636,-0.6533 0.19098,-0.92606 0.12725,-0.27258 0.33758,-0.4583 0.63081,-0.5572 0,0 2.26229,-0.76281 2.26229,-0.76281"
inkscape:connector-curvature="0" />
<path
id="path9202"
d="m 564.37221,251.7564 c 0,0 -11.52429,4.14925 -11.52429,4.14925 0.20161,2.94498 0.82381,5.14921 1.86378,6.61012 1.04511,1.43359 2.33011,1.85933 3.85161,1.28373 0.8426,-0.31877 1.72276,-0.93491 2.64009,-1.84687 0.91423,-0.90885 1.65753,-1.93361 2.23132,-3.07472 0.16748,-0.33476 0.31285,-0.525 0.43614,-0.57085 0.14082,-0.0524 0.26398,0.0197 0.36951,0.21624 0.10547,0.17832 0.15819,0.42155 0.1582,0.72977 -10e-6,0.30823 -0.0703,0.63376 -0.21096,0.97672 -0.42243,1.06628 -1.1765,2.20515 -2.26499,3.41901 -1.08401,1.1971 -2.20364,2.01781 -3.35931,2.45991 -1.94615,0.7445 -3.58314,0.0702 -4.90528,-2.03457 -1.31936,-2.13686 -1.98142,-5.07429 -1.98141,-8.80462 -10e-6,-3.39624 0.62072,-6.52518 1.85798,-9.37715 1.24083,-2.84225 2.7659,-4.56294 4.57045,-5.16871 1.84627,-0.61971 3.35606,0.10399 4.53489,2.16125 1.17368,2.03023 1.74983,4.98512 1.73227,8.87149 m -1.12272,-1.91239 c -0.22071,-2.44805 -0.8042,-4.29941 -1.75284,-5.55586 -0.94308,-1.26387 -2.07284,-1.67412 -3.3916,-1.2258 -1.32518,0.45052 -2.47072,1.63227 -3.43432,3.54863 -0.96701,1.92314 -1.57083,4.23377 -1.80906,6.92855 0,0 10.38782,-3.69552 10.38782,-3.69552"
inkscape:connector-curvature="0" />
<path
id="path9204"
d="m 573.09946,236.49319 c 0,0 0,5.67252 0,5.67252 1.39118,-3.11706 2.42557,-5.15863 3.10733,-6.13505 0.68836,-0.9944 1.32057,-1.58768 1.89705,-1.78148 0.62514,-0.2101 1.20313,0.0452 1.73426,0.76436 0.5383,0.69735 0.80705,1.27409 0.80706,1.73125 -1e-5,0.33412 -0.0538,0.63396 -0.16121,0.89952 -0.0993,0.24531 -0.22754,0.39508 -0.38483,0.4493 -0.0829,0.0286 -0.15328,0.0265 -0.21128,-0.006 -0.0581,-0.0505 -0.16584,-0.21587 -0.32347,-0.49644 -0.29063,-0.51722 -0.54416,-0.85379 -0.76045,-1.00936 -0.21651,-0.15563 -0.42901,-0.19806 -0.6375,-0.12711 -0.4593,0.15634 -1.01569,0.73516 -1.66979,1.73811 -0.64734,1.00259 -1.77765,3.30323 -3.39717,6.91661 0,0 0,12.30832 0,12.30832 0,0 4.70377,-1.77166 4.70377,-1.77166 0.25887,-0.0975 0.44243,-0.0607 0.55085,0.11042 0.10835,0.15336 0.16252,0.39774 0.16253,0.73321 -10e-6,0.3178 -0.0542,0.60323 -0.16253,0.85632 -0.10842,0.25321 -0.29198,0.42911 -0.55085,0.52771 0,0 -8.39069,3.19589 -8.39069,3.19589 -0.25883,0.0986 -0.44449,0.0704 -0.55681,-0.0846 -0.11237,-0.17308 -0.16857,-0.42152 -0.16857,-0.74529 0,-0.30576 0.0519,-0.57716 0.15561,-0.81415 0.11232,-0.25813 0.3023,-0.43758 0.56977,-0.53836 0,0 2.61311,-0.98462 2.61311,-0.98462 0,0 0,-18.76796 0,-18.76796 0,0 -1.99291,0.68053 -1.99291,0.68053 -0.25825,0.0882 -0.44347,0.0437 -0.55552,-0.13359 -0.11211,-0.17732 -0.16818,-0.43671 -0.16818,-0.77807 0,-0.32336 0.0517,-0.61034 0.15524,-0.8609 0.11207,-0.25331 0.3016,-0.42495 0.56846,-0.51496 0,0 3.06672,-1.03405 3.06672,-1.03405"
inkscape:connector-curvature="0" />
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer12"
inkscape:label="Image (name)#1"
style="display:inline">
<g
transform="translate(-12.096774,4.8387096)"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New"
id="text8052">
<path
inkscape:connector-curvature="0"
d="m 423.74041,363.69642 c 0,0 0,46.13338 0,46.13338 0,0 6.60461,-3.25288 6.60461,-3.25288 0.45439,-0.22379 0.77972,-0.20169 0.97632,0.0662 0.19645,0.2373 0.29465,0.64448 0.29467,1.22164 -2e-5,0.54682 -0.0983,1.05125 -0.29467,1.51342 -0.1966,0.46245 -0.52193,0.80673 -0.97632,1.03282 0,0 -15.30796,7.61688 -15.30796,7.61688 -0.47355,0.23563 -0.81328,0.21827 -1.01883,-0.0526 -0.20568,-0.27092 -0.30855,-0.68631 -0.30855,-1.24607 0,-0.59083 0.10283,-1.10805 0.30855,-1.55154 0.20555,-0.47431 0.54528,-0.8281 1.01883,-1.06133 0,0 6.75525,-3.32706 6.75525,-3.32706 0,0 0,-46.25099 0,-46.25099 0,0 -6.75525,2.91925 -6.75525,2.91925 -0.47355,0.20469 -0.81328,0.18057 -1.01883,-0.0726 -0.20568,-0.2843 -0.30855,-0.72199 -0.30855,-1.31286 0,-0.59081 0.10283,-1.1013 0.30855,-1.53138 0.20555,-0.46081 0.54528,-0.79235 1.01883,-0.99466 0,0 15.30796,-6.53778 15.30796,-6.53778 0.45439,-0.19399 0.77972,-0.15067 0.97632,0.13006 0.19645,0.25021 0.29465,0.66381 0.29467,1.24095 -2e-5,0.57722 -0.0983,1.09044 -0.29467,1.53969 -0.1966,0.41925 -0.52193,0.72704 -0.97632,0.92336 0,0 -6.60461,2.85414 -6.60461,2.85414"
id="path8059" />
<path
inkscape:connector-curvature="0"
d="m 441.87507,365.74833 c 0,0 0,3.82064 0,3.82064 1.56942,-4.14583 3.13954,-6.56174 4.71033,-7.25855 0.94216,-0.41791 1.76641,-0.26368 2.47352,0.46081 0.70573,0.69355 1.29521,1.97053 1.76901,3.83012 0.80259,-2.43288 1.61058,-4.33197 2.42395,-5.69892 0.82577,-1.39965 1.64969,-2.28097 2.47179,-2.64567 1.28608,-0.57047 2.30749,-0.15871 3.06643,1.23159 0.99542,1.77766 1.49212,3.97984 1.49215,6.61017 0,0 0,25.73386 0,25.73386 0,0 1.48605,-0.73191 1.48605,-0.73191 0.41748,-0.20562 0.71641,-0.17807 0.89705,0.0826 0.18051,0.23133 0.27074,0.62358 0.27077,1.17682 -3e-5,0.52419 -0.0903,1.00579 -0.27077,1.44493 -0.18064,0.43941 -0.47957,0.76299 -0.89705,0.97072 0,0 -3.25208,1.61816 -3.25208,1.61816 0,0 0,-29.13622 0,-29.13622 -2e-5,-1.87499 -0.27409,-3.30363 -0.82284,-4.287 -0.54964,-0.98475 -1.18481,-1.31612 -1.90601,-0.99255 -0.65174,0.29248 -1.34015,1.11693 -2.06542,2.47501 -0.72674,1.33131 -1.55495,3.70059 -2.48533,7.11235 0,0 0,24.72225 0,24.72225 0,0 1.50177,-0.73965 1.50177,-0.73965 0.42794,-0.21077 0.73434,-0.18473 0.9195,0.078 0.18502,0.23308 0.27752,0.62963 0.27753,1.18976 -1e-5,0.53068 -0.0926,1.01883 -0.27753,1.46455 -0.18516,0.446 -0.49156,0.77547 -0.9195,0.9884 0,0 -3.33363,1.65874 -3.33363,1.65874 0,0 0,-29.23324 0,-29.23324 -2e-5,-1.9874 -0.2882,-3.4883 -0.86521,-4.50391 -0.56348,-1.05333 -1.20023,-1.42148 -1.91062,-1.10276 -0.65361,0.29333 -1.30108,1.01634 -1.94239,2.17018 -0.89094,1.6268 -1.82798,4.16023 -2.81147,7.60421 0,0 0,25.03641 0,25.03641 0,0 1.56211,-0.76936 1.56211,-0.76936 0.43885,-0.21614 0.75303,-0.1917 0.94289,0.0732 0.18975,0.23484 0.28458,0.63583 0.28459,1.20303 -1e-5,0.53738 -0.0948,1.03223 -0.28459,1.48482 -0.18986,0.45281 -0.50404,0.78839 -0.94289,1.00674 0,0 -4.99523,2.48551 -4.99523,2.48551 -0.44529,0.22157 -0.76474,0.19977 -0.95802,-0.0659 -0.19339,-0.26571 -0.29012,-0.67 -0.29011,-1.21278 -1e-5,-0.57291 0.0967,-1.07295 0.29011,-1.5 0.19328,-0.45695 0.51273,-0.7951 0.95802,-1.01441 0,0 1.5765,-0.77645 1.5765,-0.77645 0,0 0,-31.40719 0,-31.40719 0,0 -1.5765,0.71024 -1.5765,0.71024 -0.44529,0.20064 -0.76474,0.16379 -0.95802,-0.11096 -0.19339,-0.27476 -0.29012,-0.69868 -0.29011,-1.27164 -1e-5,-0.54273 0.0967,-1.03824 0.29011,-1.48635 0.19328,-0.44782 0.51273,-0.77089 0.95802,-0.96927 0,0 3.43312,-1.52911 3.43312,-1.52911"
id="path8061" />
<path
inkscape:connector-curvature="0"
d="m 480.58851,385.41099 c 0,0 0,-5.15657 0,-5.15657 -2.4262,5.5798 -5.03657,9.079 -7.835,10.47699 -2.04539,1.02181 -3.65191,0.72721 -4.81363,-0.89204 -1.16547,-1.65345 -1.74963,-4.09108 -1.74963,-7.30887 0,-3.53667 0.76951,-6.98913 2.30362,-10.34663 1.52759,-3.34322 3.746,-5.68753 6.64239,-7.03536 0.77733,-0.36171 1.61976,-0.63945 2.52684,-0.83351 0.90473,-0.2221 1.88006,-0.34939 2.92541,-0.38255 0,0 0,-5.7958 0,-5.7958 -10e-6,-1.96032 -0.42307,-3.47297 -1.27068,-4.53986 -0.84967,-1.0694 -2.12799,-1.22244 -3.8396,-0.45447 -1.31604,0.59057 -3.17073,2.24198 -5.57246,4.96625 -0.43594,0.48573 -0.71549,0.75657 -0.83828,0.81214 -0.21842,0.0989 -0.40964,0.0122 -0.57362,-0.26044 -0.15038,-0.27883 -0.22559,-0.67845 -0.22559,-1.19879 0,-0.49136 0.0684,-0.91228 0.20509,-1.26267 0.19131,-0.51914 0.96238,-1.45616 2.30947,-2.80749 2.11245,-2.14861 3.70209,-3.45689 4.77581,-3.9332 2.12442,-0.94235 3.77243,-0.54918 4.95058,1.17099 1.17422,1.68619 1.75986,3.93017 1.75988,6.73612 0,0 0,23.63827 0,23.63827 0,0 2.20228,-1.08466 2.20228,-1.08466 0.40486,-0.19939 0.6919,-0.17146 0.86143,0.0837 0.1694,0.2268 0.25409,0.60813 0.25411,1.1441 -2e-5,0.5078 -0.0847,0.973 -0.25411,1.39571 -0.16953,0.42296 -0.45657,0.73515 -0.86143,0.9366 0,0 -3.88288,1.93203 -3.88288,1.93203 m 0,-17.81357 c -0.78041,-0.11482 -1.60899,-0.0799 -2.48605,0.10525 -0.87928,0.18568 -1.80752,0.50815 -2.78512,0.968 -2.46256,1.15841 -4.39871,3.20675 -5.7998,6.14762 -1.06467,2.21091 -1.5982,4.50451 -1.59819,6.87592 -1e-5,2.19789 0.40363,3.85127 1.20954,4.95824 0.81771,1.09778 2.0001,1.26287 3.54357,0.49962 1.46955,-0.72669 2.82587,-2.01263 4.07022,-3.85519 1.2533,-1.87118 2.53536,-4.47776 3.84583,-7.81547 0,0 0,-7.88399 0,-7.88399"
id="path8063" />
<path
inkscape:connector-curvature="0"
d="m 504.87507,344.02572 c 0,0 0,-6.33756 0,-6.33756 0,0 3.62149,-1.61301 3.62149,-1.61301 0.3655,-0.16275 0.62721,-0.11582 0.78538,0.14085 0.15805,0.25653 0.23705,0.64362 0.23708,1.1613 -3e-5,0.49052 -0.0791,0.93476 -0.23708,1.33282 -0.15817,0.39836 -0.41988,0.67984 -0.78538,0.84448 0,0 -2.07259,0.93375 -2.07259,0.93375 0,0 0,34.44897 0,34.44897 -2e-5,2.29935 -0.22086,4.46439 -0.66296,6.49712 -0.29508,1.35662 -0.78741,2.85674 -1.47785,4.50202 -0.69188,1.64858 -1.32318,2.89693 -1.89359,3.74358 -0.57137,0.84805 -1.33675,1.52227 -2.29743,2.02265 0,0 -4.48946,2.33825 -4.48946,2.33825 -0.37994,0.19787 -0.65249,0.17289 -0.81737,-0.0754 -0.16499,-0.22051 -0.24751,-0.5954 -0.2475,-1.12453 -10e-6,-0.52918 0.0825,-1.0035 0.2475,-1.42286 0.16488,-0.41919 0.43743,-0.72673 0.81737,-0.92267 0,0 4.54567,-2.30289 4.54567,-2.30289 0.92315,-0.47614 1.75064,-1.42648 2.48315,-2.84967 0.74328,-1.42651 1.3553,-3.26448 1.83674,-5.51382 0.27125,-1.28999 0.40681,-2.82626 0.40683,-4.60956 0,0 0,-10.37051 0,-10.37051 -1.66739,5.89686 -3.82848,9.5134 -6.49259,10.83562 -2.17909,1.08151 -4.07329,0.23861 -5.67781,-2.54346 -1.59915,-2.82914 -2.40148,-6.78447 -2.40147,-11.85622 -1e-5,-5.07169 0.80232,-9.76707 2.40147,-14.07131 1.60452,-4.29012 3.49872,-6.9134 5.67781,-7.88005 2.66411,-1.18176 4.8252,0.38981 6.49259,4.69207 m 0,10.41166 c -2e-5,-4.06038 -0.62896,-7.20112 -1.89031,-9.42839 -1.2536,-2.24103 -2.76147,-2.97007 -4.52696,-2.17791 -1.77459,0.79633 -3.30477,2.91596 -4.5872,6.36538 -1.28721,3.43436 -1.9326,7.21098 -1.9326,11.32033 0,4.13734 0.64539,7.33529 1.9326,9.58763 1.28243,2.21618 2.81261,2.88369 4.5872,2.01202 1.76549,-0.86719 3.27336,-3.01347 4.52696,-6.43279 1.26135,-3.44025 1.89029,-7.18583 1.89031,-11.24627"
id="path8065" />
<path
inkscape:connector-curvature="0"
d="m 529.8044,344.5465 c 0,0 -15.0214,7.10051 -15.0214,7.10051 0.26314,4.28098 1.07521,7.44153 2.43223,9.47797 1.36338,1.99553 3.03922,2.49762 5.02283,1.51672 1.09819,-0.54306 2.24508,-1.52324 3.44017,-2.93807 1.19075,-1.4097 2.1587,-2.97236 2.90578,-4.68889 0.21804,-0.50344 0.40728,-0.79413 0.56779,-0.87226 0.1833,-0.0892 0.34362,0.005 0.48099,0.28146 0.13728,0.25029 0.2059,0.60007 0.20592,1.0494 -2e-5,0.44938 -0.0915,0.9304 -0.27459,1.44334 -0.5499,1.59345 -1.53164,3.3235 -2.9491,5.19415 -1.412,1.84634 -2.87079,3.14741 -4.37696,3.89984 -2.53736,1.26758 -4.67257,0.436 -6.39774,-2.51332 -1.72209,-2.9974 -2.58645,-7.22532 -2.58645,-12.67216 0,-4.95904 0.81041,-9.58368 2.42538,-13.8585 1.61912,-4.25962 3.60849,-6.90642 5.96144,-7.9502 2.40629,-1.06738 4.37322,-0.14533 5.90848,2.75024 1.52811,2.85581 2.27809,7.11232 2.25523,12.77977 m -1.46157,-2.68694 c -0.28736,-3.54969 -1.04714,-6.19709 -2.28263,-7.94479 -1.22853,-1.7594 -2.70063,-2.2574 -4.41951,-1.48616 -1.72781,0.77534 -3.22184,2.60204 -4.47892,5.48524 -1.26182,2.8941 -2.04987,6.32176 -2.36082,10.27751 0,0 13.54188,-6.3318 13.54188,-6.3318"
id="path8067" />
</g>
</g>
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/Users/arothfusz/src/metalivedev/docker/docs/sources/terms/images/docker-filesystems-multiroot.png"
transform="matrix(0.83545525,0,0,0.83545525,52.49863,66.133437)"
transform="matrix(0.71809444,0,0,0.71809444,82.080142,116.02377)"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Futura;-inkscape-font-specification:Futura Medium"
id="text10963">
<path

Before

Width:  |  Height:  |  Size: 243 KiB

After

Width:  |  Height:  |  Size: 272 KiB

View file

@ -1,11 +1,11 @@
:title: Terms
:title: Glossary
:description: Definitions of terms used in Docker documentation
:keywords: concepts, documentation, docker, containers
Terms
=====
Glossary
========
Definitions of terms used in Docker documentation.
@ -14,5 +14,9 @@ Contents:
.. toctree::
:maxdepth: 1
fundamentals
filesystem
layer
image
container

View file

@ -0,0 +1,40 @@
:title: Layers
:description: Organizing the Docker Root File System
:keywords: containers, lxc, concepts, explanation, image, container
Layers
======
In a traditional Linux boot, the kernel first mounts the root
:ref:`filesystem_def` as read-only, checks its integrity, and then
switches the whole rootfs volume to read-write mode.
.. _layer_def:
Layer
.....
When Docker mounts the rootfs, it starts read-only, as in a tradtional
Linux boot, but then, instead of changing the file system to
read-write mode, it takes advantage of a `union mount
<http://en.wikipedia.org/wiki/Union_mount>`_ to add a read-write file
system *over* the read-only file system. In fact there may be multiple
read-only file systems stacked on top of each other. We think of each
one of these file systems as a **layer**.
.. image:: images/docker-filesystems-multilayer.png
At first, the top read-write layer has nothing in it, but any time a
process creates a file, this happens in the top layer. And if
something needs to update an existing file in a lower layer, then the
file gets copied to the upper layer and changes go into the copy. The
version of the file on the lower layer cannot be seen by the
applications anymore, but it is there, unchanged.
.. _ufs_def:
Union File System
.................
We call the union of the read-write layer and all the read-only layers
a **union file system**.

View file

@ -17,7 +17,8 @@ This documentation has the following resources:
commandline/index
contributing/index
api/index
faq
terms/index
faq
.. image:: concepts/images/lego_docker.jpg

View file

@ -153,6 +153,20 @@ of `<src>` will be written at `<dst>`.
If `<dest>` doesn't exist, it is created along with all missing directories in its path. All new
files and directories are created with mode 0700, uid and gid 0.
2.8 ENTRYPOINT
-------------
``ENTRYPOINT /bin/echo``
The `ENTRYPOINT` instruction adds an entry command that will not be overwritten when arguments are passed to docker run, unlike the behavior of `CMD`. This allows arguments to be passed to the entrypoint. i.e. `docker run <image> -d` will pass the "-d" argument to the entrypoint.
2.9 VOLUME
----------
``VOLUME ["/data"]``
The `VOLUME` instruction will add one or more new volumes to any container created from the image.
3. Dockerfile Examples
======================

View file

@ -1,21 +1,21 @@
:title: Working With Repositories
:description: Generally, there are two types of repositories: Top-level repositories which are controlled by the people behind Docker, and user repositories.
:description: Repositories allow users to share images.
:keywords: repo, repositiores, usage, pull image, push image, image, documentation
.. _working_with_the_repository:
Working with the Repository
===========================
Working with Repositories
=========================
Top-level repositories and user repositories
--------------------------------------------
Generally, there are two types of repositories: Top-level repositories which are controlled by the people behind
Docker, and user repositories.
Generally, there are two types of repositories: Top-level repositories
which are controlled by the people behind Docker, and user
repositories.
* Top-level repositories can easily be recognized by not having a ``/`` (slash) in their name. These repositories can
generally be trusted.
* Top-level repositories can easily be recognized by not having a ``/`` (slash) in their name. These repositories can generally be trusted.
* User repositories always come in the form of ``<username>/<repo_name>``. This is what your published images will look like.
* User images are not checked, it is therefore up to you whether or not you trust the creator of this image.

View file

@ -162,7 +162,7 @@ func (graph *Graph) Register(layerData Archive, store bool, img *Image) error {
// The archive is stored on disk and will be automatically deleted as soon as has been read.
// If output is not nil, a human-readable progress bar will be written to it.
// FIXME: does this belong in Graph? How about MktempFile, let the caller use it for archives?
func (graph *Graph) TempLayerArchive(id string, compression Compression, output io.Writer) (*TempArchive, error) {
func (graph *Graph) TempLayerArchive(id string, compression Compression, sf *utils.StreamFormatter, output io.Writer) (*TempArchive, error) {
image, err := graph.Get(id)
if err != nil {
return nil, err
@ -175,7 +175,6 @@ func (graph *Graph) TempLayerArchive(id string, compression Compression, output
if err != nil {
return nil, err
}
sf := utils.NewStreamFormatter(false)
return NewTempArchive(utils.ProgressReader(ioutil.NopCloser(archive), 0, output, sf.FormatProgress("Buffering to disk", "%v/%v (%v)"), sf), tmp.Root)
}

119
hack/RELEASE.md Normal file
View file

@ -0,0 +1,119 @@
## A maintainer's guide to releasing Docker
So you're in charge of a docker release? Cool. Here's what to do.
If your experience deviates from this document, please document the changes to keep it
up-to-date.
### 1. Pull from master and create a release branch
```bash
$ git checkout master
$ git pull
$ git checkout -b bump_$VERSION
```
### 2. Update CHANGELOG.md
You can run this command for reference:
```bash
LAST_VERSION=$(git tag | grep -E "v[0-9\.]+$" | sort -nr | head -n 1)
git log $LAST_VERSION..HEAD
```
Each change should be formatted as ```BULLET CATEGORY: DESCRIPTION```
* BULLET is either ```-```, ```+``` or ```*```, to indicate a bugfix,
new feature or upgrade, respectively.
* CATEGORY should describe which part of the project is affected.
Valid categories are:
* Runtime
* Remote API
* Builder
* Documentation
* Hack
* DESCRIPTION: a concise description of the change that is relevant to the end-user,
using the present tense.
Changes should be described in terms of how they affect the user, for example "new feature
X which allows Y", "fixed bug which caused X", "increased performance of Y".
EXAMPLES:
```
+ Builder: 'docker build -t FOO' applies the tag FOO to the newly built container.
* Runtime: improve detection of kernel version
- Remote API: fix a bug in the optional unix socket transport
```
### 3. Change VERSION in commands.go
### 4. Run all tests
### 5. Commit and create a pull request
```bash
$ git add commands.go CHANGELOG.md
$ git commit -m "Bump version to $VERSION"
$ git push origin bump_$VERSION
```
### 6. Get 2 other maintainers to validate the pull request
### 7. Merge the pull request and apply tags
```bash
$ git checkout master
$ git merge bump_$VERSION
$ git tag -a v$VERSION # Don't forget the v!
$ git tag -f -a latest
$ git push
$ git push --tags
```
### 8. Publish binaries
To run this you will need access to the release credentials.
Get them from [the infrastructure maintainers](https://github.com/dotcloud/docker/blob/master/hack/infrastructure/MAINTAINERS).
```bash
$ RELEASE_IMAGE=image_provided_by_infrastructure_maintainers
$ BUILD=$(docker run -d -e RELEASE_PPA=0 $RELEASE_IMAGE)
```
This will do 2 things:
* It will build and upload the binaries on http://get.docker.io
* It will *test* the release on our Ubuntu PPA (a PPA is a community repository for ubuntu packages)
Wait for the build to complete.
```bash
$ docker wait $BUILD # This should print 0. If it doesn't, your build failed.
```
Check that the output looks OK. Here's an example of a correct output:
```bash
$ docker logs 2>&1 b4e7c8299d73 | grep -e 'Public URL' -e 'Successfully uploaded'
Public URL of the object is: http://get.docker.io.s3.amazonaws.com/builds/Linux/x86_64/docker-v0.4.7.tgz
Public URL of the object is: http://get.docker.io.s3.amazonaws.com/builds/Linux/x86_64/docker-latest.tgz
Successfully uploaded packages.
```
If you don't see 3 lines similar to this, something might be wrong. Check the full logs and try again.
### 9. Publish Ubuntu packages
If everything went well in the previous step, you can finalize the release by submitting the Ubuntu packages.
```bash
$ RELEASE_IMAGE=image_provided_by_infrastructure_maintainers
$ docker run -e RELEASE_PPA=1 $RELEASE_IMAGE
```
If that goes well, congratulations! You're done.

View file

@ -5,8 +5,11 @@
# AUTHOR Solomon Hykes <solomon@dotcloud.com>
# Daniel Mizyrycki <daniel@dotcloud.net>
# BUILD_CMD docker build -t dockerbuilder .
# RUN_CMD docker run -e AWS_ID="$AWS_ID" -e AWS_KEY="$AWS_KEY" -e GPG_KEY="$GPG_KEY" dockerbuilder
# RUN_CMD docker run -e AWS_ID="$AWS_ID" -e AWS_KEY="$AWS_KEY" -e GPG_KEY="$GPG_KEY" -e PUBLISH_PPA="$PUBLISH_PPA" dockerbuilder
#
# ENV_VARIABLES AWS_ID, AWS_KEY: S3 credentials for uploading Docker binary and tarball
# GPG_KEY: Signing key for docker package
# PUBLISH_PPA: 0 for staging release, 1 for production release
#
from ubuntu:12.04
maintainer Solomon Hykes <solomon@dotcloud.com>

View file

@ -94,9 +94,12 @@ func StoreImage(img *Image, layerData Archive, root string, store bool) error {
}
// If layerData is not nil, unpack it into the new layer
if layerData != nil {
start := time.Now()
utils.Debugf("Start untar layer")
if err := Untar(layerData, layer); err != nil {
return err
}
utils.Debugf("Untar time: %vs\n", time.Now().Sub(start).Seconds())
}
return StoreSize(img, root)

View file

@ -5,7 +5,6 @@ import (
"errors"
"fmt"
"github.com/dotcloud/docker/utils"
"io"
"log"
"net"
"os/exec"
@ -183,8 +182,10 @@ func getIfaceAddr(name string) (net.Addr, error) {
// up iptables rules.
// It keeps track of all mappings and is able to unmap at will
type PortMapper struct {
mapping map[int]net.TCPAddr
proxies map[int]net.Listener
tcpMapping map[int]*net.TCPAddr
tcpProxies map[int]Proxy
udpMapping map[int]*net.UDPAddr
udpProxies map[int]Proxy
}
func (mapper *PortMapper) cleanup() error {
@ -197,8 +198,10 @@ func (mapper *PortMapper) cleanup() error {
iptables("-t", "nat", "-D", "OUTPUT", "-j", "DOCKER")
iptables("-t", "nat", "-F", "DOCKER")
iptables("-t", "nat", "-X", "DOCKER")
mapper.mapping = make(map[int]net.TCPAddr)
mapper.proxies = make(map[int]net.Listener)
mapper.tcpMapping = make(map[int]*net.TCPAddr)
mapper.tcpProxies = make(map[int]Proxy)
mapper.udpMapping = make(map[int]*net.UDPAddr)
mapper.udpProxies = make(map[int]Proxy)
return nil
}
@ -215,76 +218,72 @@ func (mapper *PortMapper) setup() error {
return nil
}
func (mapper *PortMapper) iptablesForward(rule string, port int, dest net.TCPAddr) error {
return iptables("-t", "nat", rule, "DOCKER", "-p", "tcp", "--dport", strconv.Itoa(port),
"-j", "DNAT", "--to-destination", net.JoinHostPort(dest.IP.String(), strconv.Itoa(dest.Port)))
func (mapper *PortMapper) iptablesForward(rule string, port int, proto string, dest_addr string, dest_port int) error {
return iptables("-t", "nat", rule, "DOCKER", "-p", proto, "--dport", strconv.Itoa(port),
"-j", "DNAT", "--to-destination", net.JoinHostPort(dest_addr, strconv.Itoa(dest_port)))
}
func (mapper *PortMapper) Map(port int, dest net.TCPAddr) error {
if err := mapper.iptablesForward("-A", port, dest); err != nil {
return err
func (mapper *PortMapper) Map(port int, backendAddr net.Addr) error {
if _, isTCP := backendAddr.(*net.TCPAddr); isTCP {
backendPort := backendAddr.(*net.TCPAddr).Port
backendIP := backendAddr.(*net.TCPAddr).IP
if err := mapper.iptablesForward("-A", port, "tcp", backendIP.String(), backendPort); err != nil {
return err
}
mapper.tcpMapping[port] = backendAddr.(*net.TCPAddr)
proxy, err := NewProxy(&net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: port}, backendAddr)
if err != nil {
mapper.Unmap(port, "tcp")
return err
}
mapper.tcpProxies[port] = proxy
go proxy.Run()
} else {
backendPort := backendAddr.(*net.UDPAddr).Port
backendIP := backendAddr.(*net.UDPAddr).IP
if err := mapper.iptablesForward("-A", port, "udp", backendIP.String(), backendPort); err != nil {
return err
}
mapper.udpMapping[port] = backendAddr.(*net.UDPAddr)
proxy, err := NewProxy(&net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: port}, backendAddr)
if err != nil {
mapper.Unmap(port, "udp")
return err
}
mapper.udpProxies[port] = proxy
go proxy.Run()
}
mapper.mapping[port] = dest
listener, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", port))
if err != nil {
mapper.Unmap(port)
return err
}
mapper.proxies[port] = listener
go proxy(listener, "tcp", dest.String())
return nil
}
// proxy listens for socket connections on `listener`, and forwards them unmodified
// to `proto:address`
func proxy(listener net.Listener, proto, address string) error {
utils.Debugf("proxying to %s:%s", proto, address)
defer utils.Debugf("Done proxying to %s:%s", proto, address)
for {
utils.Debugf("Listening on %s", listener)
src, err := listener.Accept()
if err != nil {
func (mapper *PortMapper) Unmap(port int, proto string) error {
if proto == "tcp" {
backendAddr, ok := mapper.tcpMapping[port]
if !ok {
return fmt.Errorf("Port tcp/%v is not mapped", port)
}
if proxy, exists := mapper.tcpProxies[port]; exists {
proxy.Close()
delete(mapper.tcpProxies, port)
}
if err := mapper.iptablesForward("-D", port, proto, backendAddr.IP.String(), backendAddr.Port); err != nil {
return err
}
utils.Debugf("Connecting to %s:%s", proto, address)
dst, err := net.Dial(proto, address)
if err != nil {
log.Printf("Error connecting to %s:%s: %s", proto, address, err)
src.Close()
continue
delete(mapper.tcpMapping, port)
} else {
backendAddr, ok := mapper.udpMapping[port]
if !ok {
return fmt.Errorf("Port udp/%v is not mapped", port)
}
utils.Debugf("Connected to backend, splicing")
splice(src, dst)
if proxy, exists := mapper.udpProxies[port]; exists {
proxy.Close()
delete(mapper.udpProxies, port)
}
if err := mapper.iptablesForward("-D", port, proto, backendAddr.IP.String(), backendAddr.Port); err != nil {
return err
}
delete(mapper.udpMapping, port)
}
}
func halfSplice(dst, src net.Conn) error {
_, err := io.Copy(dst, src)
// FIXME: on EOF from a tcp connection, pass WriteClose()
dst.Close()
src.Close()
return err
}
func splice(a, b net.Conn) {
go halfSplice(a, b)
go halfSplice(b, a)
}
func (mapper *PortMapper) Unmap(port int) error {
dest, ok := mapper.mapping[port]
if !ok {
return errors.New("Port is not mapped")
}
if proxy, exists := mapper.proxies[port]; exists {
proxy.Close()
delete(mapper.proxies, port)
}
if err := mapper.iptablesForward("-D", port, dest); err != nil {
return err
}
delete(mapper.mapping, port)
return nil
}
@ -301,9 +300,9 @@ func newPortMapper() (*PortMapper, error) {
// Port allocator: Atomatically allocate and release networking ports
type PortAllocator struct {
sync.Mutex
inUse map[int]struct{}
fountain chan (int)
lock sync.Mutex
}
func (alloc *PortAllocator) runFountain() {
@ -317,9 +316,9 @@ func (alloc *PortAllocator) runFountain() {
// FIXME: Release can no longer fail, change its prototype to reflect that.
func (alloc *PortAllocator) Release(port int) error {
utils.Debugf("Releasing %d", port)
alloc.lock.Lock()
alloc.Lock()
delete(alloc.inUse, port)
alloc.lock.Unlock()
alloc.Unlock()
return nil
}
@ -334,8 +333,8 @@ func (alloc *PortAllocator) Acquire(port int) (int, error) {
}
return -1, fmt.Errorf("Port generator ended unexpectedly")
}
alloc.lock.Lock()
defer alloc.lock.Unlock()
alloc.Lock()
defer alloc.Unlock()
if _, inUse := alloc.inUse[port]; inUse {
return -1, fmt.Errorf("Port already in use: %d", port)
}
@ -453,7 +452,7 @@ type NetworkInterface struct {
Gateway net.IP
manager *NetworkManager
extPorts []int
extPorts []*Nat
}
// Allocate an external TCP port and map it to the interface
@ -462,17 +461,32 @@ func (iface *NetworkInterface) AllocatePort(spec string) (*Nat, error) {
if err != nil {
return nil, err
}
// Allocate a random port if Frontend==0
extPort, err := iface.manager.portAllocator.Acquire(nat.Frontend)
if err != nil {
return nil, err
if nat.Proto == "tcp" {
extPort, err := iface.manager.tcpPortAllocator.Acquire(nat.Frontend)
if err != nil {
return nil, err
}
backend := &net.TCPAddr{IP: iface.IPNet.IP, Port: nat.Backend}
if err := iface.manager.portMapper.Map(extPort, backend); err != nil {
iface.manager.tcpPortAllocator.Release(extPort)
return nil, err
}
nat.Frontend = extPort
} else {
extPort, err := iface.manager.udpPortAllocator.Acquire(nat.Frontend)
if err != nil {
return nil, err
}
backend := &net.UDPAddr{IP: iface.IPNet.IP, Port: nat.Backend}
if err := iface.manager.portMapper.Map(extPort, backend); err != nil {
iface.manager.udpPortAllocator.Release(extPort)
return nil, err
}
nat.Frontend = extPort
}
nat.Frontend = extPort
if err := iface.manager.portMapper.Map(nat.Frontend, net.TCPAddr{IP: iface.IPNet.IP, Port: nat.Backend}); err != nil {
iface.manager.portAllocator.Release(nat.Frontend)
return nil, err
}
iface.extPorts = append(iface.extPorts, nat.Frontend)
iface.extPorts = append(iface.extPorts, nat)
return nat, nil
}
@ -485,6 +499,21 @@ type Nat struct {
func parseNat(spec string) (*Nat, error) {
var nat Nat
if strings.Contains(spec, "/") {
specParts := strings.Split(spec, "/")
if len(specParts) != 2 {
return nil, fmt.Errorf("Invalid port format.")
}
proto := specParts[1]
spec = specParts[0]
if proto != "tcp" && proto != "udp" {
return nil, fmt.Errorf("Invalid port format: unknown protocol %v.", proto)
}
nat.Proto = proto
} else {
nat.Proto = "tcp"
}
if strings.Contains(spec, ":") {
specParts := strings.Split(spec, ":")
if len(specParts) != 2 {
@ -517,20 +546,24 @@ func parseNat(spec string) (*Nat, error) {
}
nat.Backend = int(port)
}
nat.Proto = "tcp"
return &nat, nil
}
// Release: Network cleanup - release all resources
func (iface *NetworkInterface) Release() {
for _, port := range iface.extPorts {
if err := iface.manager.portMapper.Unmap(port); err != nil {
log.Printf("Unable to unmap port %v: %v", port, err)
for _, nat := range iface.extPorts {
utils.Debugf("Unmaping %v/%v", nat.Proto, nat.Frontend)
if err := iface.manager.portMapper.Unmap(nat.Frontend, nat.Proto); err != nil {
log.Printf("Unable to unmap port %v/%v: %v", nat.Proto, nat.Frontend, err)
}
if err := iface.manager.portAllocator.Release(port); err != nil {
log.Printf("Unable to release port %v: %v", port, err)
if nat.Proto == "tcp" {
if err := iface.manager.tcpPortAllocator.Release(nat.Frontend); err != nil {
log.Printf("Unable to release port tcp/%v: %v", nat.Frontend, err)
}
} else if err := iface.manager.udpPortAllocator.Release(nat.Frontend); err != nil {
log.Printf("Unable to release port udp/%v: %v", nat.Frontend, err)
}
}
iface.manager.ipAllocator.Release(iface.IPNet.IP)
@ -542,9 +575,10 @@ type NetworkManager struct {
bridgeIface string
bridgeNetwork *net.IPNet
ipAllocator *IPAllocator
portAllocator *PortAllocator
portMapper *PortMapper
ipAllocator *IPAllocator
tcpPortAllocator *PortAllocator
udpPortAllocator *PortAllocator
portMapper *PortMapper
}
// Allocate a network interface
@ -577,7 +611,11 @@ func newNetworkManager(bridgeIface string) (*NetworkManager, error) {
ipAllocator := newIPAllocator(network)
portAllocator, err := newPortAllocator()
tcpPortAllocator, err := newPortAllocator()
if err != nil {
return nil, err
}
udpPortAllocator, err := newPortAllocator()
if err != nil {
return nil, err
}
@ -588,11 +626,12 @@ func newNetworkManager(bridgeIface string) (*NetworkManager, error) {
}
manager := &NetworkManager{
bridgeIface: bridgeIface,
bridgeNetwork: network,
ipAllocator: ipAllocator,
portAllocator: portAllocator,
portMapper: portMapper,
bridgeIface: bridgeIface,
bridgeNetwork: network,
ipAllocator: ipAllocator,
tcpPortAllocator: tcpPortAllocator,
udpPortAllocator: udpPortAllocator,
portMapper: portMapper,
}
return manager, nil
}

257
network_proxy.go Normal file
View file

@ -0,0 +1,257 @@
package docker
import (
"encoding/binary"
"fmt"
"github.com/dotcloud/docker/utils"
"io"
"log"
"net"
"sync"
"syscall"
"time"
)
const (
UDPConnTrackTimeout = 90 * time.Second
UDPBufSize = 2048
)
type Proxy interface {
// Start forwarding traffic back and forth the front and back-end
// addresses.
Run()
// Stop forwarding traffic and close both ends of the Proxy.
Close()
// Return the address on which the proxy is listening.
FrontendAddr() net.Addr
// Return the proxied address.
BackendAddr() net.Addr
}
type TCPProxy struct {
listener *net.TCPListener
frontendAddr *net.TCPAddr
backendAddr *net.TCPAddr
}
func NewTCPProxy(frontendAddr, backendAddr *net.TCPAddr) (*TCPProxy, error) {
listener, err := net.ListenTCP("tcp", frontendAddr)
if err != nil {
return nil, err
}
// If the port in frontendAddr was 0 then ListenTCP will have a picked
// a port to listen on, hence the call to Addr to get that actual port:
return &TCPProxy{
listener: listener,
frontendAddr: listener.Addr().(*net.TCPAddr),
backendAddr: backendAddr,
}, nil
}
func (proxy *TCPProxy) clientLoop(client *net.TCPConn, quit chan bool) {
backend, err := net.DialTCP("tcp", nil, proxy.backendAddr)
if err != nil {
log.Printf("Can't forward traffic to backend tcp/%v: %v\n", proxy.backendAddr, err.Error())
client.Close()
return
}
event := make(chan int64)
var broker = func(to, from *net.TCPConn) {
written, err := io.Copy(to, from)
if err != nil {
err, ok := err.(*net.OpError)
// If the socket we are writing to is shutdown with
// SHUT_WR, forward it to the other end of the pipe:
if ok && err.Err == syscall.EPIPE {
from.CloseWrite()
}
}
event <- written
}
utils.Debugf("Forwarding traffic between tcp/%v and tcp/%v", client.RemoteAddr(), backend.RemoteAddr())
go broker(client, backend)
go broker(backend, client)
var transferred int64 = 0
for i := 0; i < 2; i++ {
select {
case written := <-event:
transferred += written
case <-quit:
// Interrupt the two brokers and "join" them.
client.Close()
backend.Close()
for ; i < 2; i++ {
transferred += <-event
}
goto done
}
}
client.Close()
backend.Close()
done:
utils.Debugf("%v bytes transferred between tcp/%v and tcp/%v", transferred, client.RemoteAddr(), backend.RemoteAddr())
}
func (proxy *TCPProxy) Run() {
quit := make(chan bool)
defer close(quit)
utils.Debugf("Starting proxy on tcp/%v for tcp/%v", proxy.frontendAddr, proxy.backendAddr)
for {
client, err := proxy.listener.Accept()
if err != nil {
utils.Debugf("Stopping proxy on tcp/%v for tcp/%v (%v)", proxy.frontendAddr, proxy.backendAddr, err.Error())
return
}
go proxy.clientLoop(client.(*net.TCPConn), quit)
}
}
func (proxy *TCPProxy) Close() { proxy.listener.Close() }
func (proxy *TCPProxy) FrontendAddr() net.Addr { return proxy.frontendAddr }
func (proxy *TCPProxy) BackendAddr() net.Addr { return proxy.backendAddr }
// A net.Addr where the IP is split into two fields so you can use it as a key
// in a map:
type connTrackKey struct {
IPHigh uint64
IPLow uint64
Port int
}
func newConnTrackKey(addr *net.UDPAddr) *connTrackKey {
if len(addr.IP) == net.IPv4len {
return &connTrackKey{
IPHigh: 0,
IPLow: uint64(binary.BigEndian.Uint32(addr.IP)),
Port: addr.Port,
}
}
return &connTrackKey{
IPHigh: binary.BigEndian.Uint64(addr.IP[:8]),
IPLow: binary.BigEndian.Uint64(addr.IP[8:]),
Port: addr.Port,
}
}
type connTrackMap map[connTrackKey]*net.UDPConn
type UDPProxy struct {
listener *net.UDPConn
frontendAddr *net.UDPAddr
backendAddr *net.UDPAddr
connTrackTable connTrackMap
connTrackLock sync.Mutex
}
func NewUDPProxy(frontendAddr, backendAddr *net.UDPAddr) (*UDPProxy, error) {
listener, err := net.ListenUDP("udp", frontendAddr)
if err != nil {
return nil, err
}
return &UDPProxy{
listener: listener,
frontendAddr: listener.LocalAddr().(*net.UDPAddr),
backendAddr: backendAddr,
connTrackTable: make(connTrackMap),
}, nil
}
func (proxy *UDPProxy) replyLoop(proxyConn *net.UDPConn, clientAddr *net.UDPAddr, clientKey *connTrackKey) {
defer func() {
proxy.connTrackLock.Lock()
delete(proxy.connTrackTable, *clientKey)
proxy.connTrackLock.Unlock()
utils.Debugf("Done proxying between udp/%v and udp/%v", clientAddr.String(), proxy.backendAddr.String())
proxyConn.Close()
}()
readBuf := make([]byte, UDPBufSize)
for {
proxyConn.SetReadDeadline(time.Now().Add(UDPConnTrackTimeout))
again:
read, err := proxyConn.Read(readBuf)
if err != nil {
if err, ok := err.(*net.OpError); ok && err.Err == syscall.ECONNREFUSED {
// This will happen if the last write failed
// (e.g: nothing is actually listening on the
// proxied port on the container), ignore it
// and continue until UDPConnTrackTimeout
// expires:
goto again
}
return
}
for i := 0; i != read; {
written, err := proxy.listener.WriteToUDP(readBuf[i:read], clientAddr)
if err != nil {
return
}
i += written
utils.Debugf("Forwarded %v/%v bytes to udp/%v", i, read, clientAddr.String())
}
}
}
func (proxy *UDPProxy) Run() {
readBuf := make([]byte, UDPBufSize)
utils.Debugf("Starting proxy on udp/%v for udp/%v", proxy.frontendAddr, proxy.backendAddr)
for {
read, from, err := proxy.listener.ReadFromUDP(readBuf)
if err != nil {
// NOTE: Apparently ReadFrom doesn't return
// ECONNREFUSED like Read do (see comment in
// UDPProxy.replyLoop)
utils.Debugf("Stopping proxy on udp/%v for udp/%v (%v)", proxy.frontendAddr, proxy.backendAddr, err.Error())
break
}
fromKey := newConnTrackKey(from)
proxy.connTrackLock.Lock()
proxyConn, hit := proxy.connTrackTable[*fromKey]
if !hit {
proxyConn, err = net.DialUDP("udp", nil, proxy.backendAddr)
if err != nil {
log.Printf("Can't proxy a datagram to udp/%s: %v\n", proxy.backendAddr.String(), err)
continue
}
proxy.connTrackTable[*fromKey] = proxyConn
go proxy.replyLoop(proxyConn, from, fromKey)
}
proxy.connTrackLock.Unlock()
for i := 0; i != read; {
written, err := proxyConn.Write(readBuf[i:read])
if err != nil {
log.Printf("Can't proxy a datagram to udp/%s: %v\n", proxy.backendAddr.String(), err)
break
}
i += written
utils.Debugf("Forwarded %v/%v bytes to udp/%v", i, read, proxy.backendAddr.String())
}
}
}
func (proxy *UDPProxy) Close() {
proxy.listener.Close()
proxy.connTrackLock.Lock()
defer proxy.connTrackLock.Unlock()
for _, conn := range proxy.connTrackTable {
conn.Close()
}
}
func (proxy *UDPProxy) FrontendAddr() net.Addr { return proxy.frontendAddr }
func (proxy *UDPProxy) BackendAddr() net.Addr { return proxy.backendAddr }
func NewProxy(frontendAddr, backendAddr net.Addr) (Proxy, error) {
switch frontendAddr.(type) {
case *net.UDPAddr:
return NewUDPProxy(frontendAddr.(*net.UDPAddr), backendAddr.(*net.UDPAddr))
case *net.TCPAddr:
return NewTCPProxy(frontendAddr.(*net.TCPAddr), backendAddr.(*net.TCPAddr))
default:
panic(fmt.Errorf("Unsupported protocol"))
}
}

221
network_proxy_test.go Normal file
View file

@ -0,0 +1,221 @@
package docker
import (
"bytes"
"fmt"
"io"
"net"
"strings"
"testing"
"time"
)
var testBuf = []byte("Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo")
var testBufSize = len(testBuf)
type EchoServer interface {
Run()
Close()
LocalAddr() net.Addr
}
type TCPEchoServer struct {
listener net.Listener
testCtx *testing.T
}
type UDPEchoServer struct {
conn net.PacketConn
testCtx *testing.T
}
func NewEchoServer(t *testing.T, proto, address string) EchoServer {
var server EchoServer
if strings.HasPrefix(proto, "tcp") {
listener, err := net.Listen(proto, address)
if err != nil {
t.Fatal(err)
}
server = &TCPEchoServer{listener: listener, testCtx: t}
} else {
socket, err := net.ListenPacket(proto, address)
if err != nil {
t.Fatal(err)
}
server = &UDPEchoServer{conn: socket, testCtx: t}
}
t.Logf("EchoServer listening on %v/%v\n", proto, server.LocalAddr().String())
return server
}
func (server *TCPEchoServer) Run() {
go func() {
for {
client, err := server.listener.Accept()
if err != nil {
return
}
go func(client net.Conn) {
server.testCtx.Logf("TCP client accepted on the EchoServer\n")
written, err := io.Copy(client, client)
server.testCtx.Logf("%v bytes echoed back to the client\n", written)
if err != nil {
server.testCtx.Logf("can't echo to the client: %v\n", err.Error())
}
client.Close()
}(client)
}
}()
}
func (server *TCPEchoServer) LocalAddr() net.Addr { return server.listener.Addr() }
func (server *TCPEchoServer) Close() { server.listener.Addr() }
func (server *UDPEchoServer) Run() {
go func() {
readBuf := make([]byte, 1024)
for {
read, from, err := server.conn.ReadFrom(readBuf)
if err != nil {
return
}
server.testCtx.Logf("Writing UDP datagram back")
for i := 0; i != read; {
written, err := server.conn.WriteTo(readBuf[i:read], from)
if err != nil {
break
}
i += written
}
}
}()
}
func (server *UDPEchoServer) LocalAddr() net.Addr { return server.conn.LocalAddr() }
func (server *UDPEchoServer) Close() { server.conn.Close() }
func testProxyAt(t *testing.T, proto string, proxy Proxy, addr string) {
defer proxy.Close()
go proxy.Run()
client, err := net.Dial(proto, addr)
if err != nil {
t.Fatalf("Can't connect to the proxy: %v", err)
}
defer client.Close()
client.SetDeadline(time.Now().Add(10 * time.Second))
if _, err = client.Write(testBuf); err != nil {
t.Fatal(err)
}
recvBuf := make([]byte, testBufSize)
if _, err = client.Read(recvBuf); err != nil {
t.Fatal(err)
}
if !bytes.Equal(testBuf, recvBuf) {
t.Fatal(fmt.Errorf("Expected [%v] but got [%v]", testBuf, recvBuf))
}
}
func testProxy(t *testing.T, proto string, proxy Proxy) {
testProxyAt(t, proto, proxy, proxy.FrontendAddr().String())
}
func TestTCP4Proxy(t *testing.T) {
backend := NewEchoServer(t, "tcp", "127.0.0.1:0")
defer backend.Close()
backend.Run()
frontendAddr := &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0}
proxy, err := NewProxy(frontendAddr, backend.LocalAddr())
if err != nil {
t.Fatal(err)
}
testProxy(t, "tcp", proxy)
}
func TestTCP6Proxy(t *testing.T) {
backend := NewEchoServer(t, "tcp", "[::1]:0")
defer backend.Close()
backend.Run()
frontendAddr := &net.TCPAddr{IP: net.IPv6loopback, Port: 0}
proxy, err := NewProxy(frontendAddr, backend.LocalAddr())
if err != nil {
t.Fatal(err)
}
testProxy(t, "tcp", proxy)
}
func TestTCPDualStackProxy(t *testing.T) {
// If I understand `godoc -src net favoriteAddrFamily` (used by the
// net.Listen* functions) correctly this should work, but it doesn't.
t.Skip("No support for dual stack yet")
backend := NewEchoServer(t, "tcp", "[::1]:0")
defer backend.Close()
backend.Run()
frontendAddr := &net.TCPAddr{IP: net.IPv6loopback, Port: 0}
proxy, err := NewProxy(frontendAddr, backend.LocalAddr())
if err != nil {
t.Fatal(err)
}
ipv4ProxyAddr := &net.TCPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: proxy.FrontendAddr().(*net.TCPAddr).Port,
}
testProxyAt(t, "tcp", proxy, ipv4ProxyAddr.String())
}
func TestUDP4Proxy(t *testing.T) {
backend := NewEchoServer(t, "udp", "127.0.0.1:0")
defer backend.Close()
backend.Run()
frontendAddr := &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0}
proxy, err := NewProxy(frontendAddr, backend.LocalAddr())
if err != nil {
t.Fatal(err)
}
testProxy(t, "udp", proxy)
}
func TestUDP6Proxy(t *testing.T) {
backend := NewEchoServer(t, "udp", "[::1]:0")
defer backend.Close()
backend.Run()
frontendAddr := &net.UDPAddr{IP: net.IPv6loopback, Port: 0}
proxy, err := NewProxy(frontendAddr, backend.LocalAddr())
if err != nil {
t.Fatal(err)
}
testProxy(t, "udp", proxy)
}
func TestUDPWriteError(t *testing.T) {
frontendAddr := &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0}
// Hopefully, this port will be free: */
backendAddr := &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 25587}
proxy, err := NewProxy(frontendAddr, backendAddr)
if err != nil {
t.Fatal(err)
}
defer proxy.Close()
go proxy.Run()
client, err := net.Dial("udp", "127.0.0.1:25587")
if err != nil {
t.Fatalf("Can't connect to the proxy: %v", err)
}
defer client.Close()
// Make sure the proxy doesn't stop when there is no actual backend:
client.Write(testBuf)
client.Write(testBuf)
backend := NewEchoServer(t, "udp", "127.0.0.1:25587")
defer backend.Close()
backend.Run()
client.SetDeadline(time.Now().Add(10 * time.Second))
if _, err = client.Write(testBuf); err != nil {
t.Fatal(err)
}
recvBuf := make([]byte, testBufSize)
if _, err = client.Read(recvBuf); err != nil {
t.Fatal(err)
}
if !bytes.Equal(testBuf, recvBuf) {
t.Fatal(fmt.Errorf("Expected [%v] but got [%v]", testBuf, recvBuf))
}
}

View file

@ -20,28 +20,97 @@ func TestIptables(t *testing.T) {
func TestParseNat(t *testing.T) {
if nat, err := parseNat("4500"); err == nil {
if nat.Frontend != 0 || nat.Backend != 4500 {
t.Errorf("-p 4500 should produce 0->4500, got %d->%d", nat.Frontend, nat.Backend)
if nat.Frontend != 0 || nat.Backend != 4500 || nat.Proto != "tcp" {
t.Errorf("-p 4500 should produce 0->4500/tcp, got %d->%d/%s",
nat.Frontend, nat.Backend, nat.Proto)
}
} else {
t.Fatal(err)
}
if nat, err := parseNat(":4501"); err == nil {
if nat.Frontend != 4501 || nat.Backend != 4501 {
t.Errorf("-p :4501 should produce 4501->4501, got %d->%d", nat.Frontend, nat.Backend)
if nat.Frontend != 4501 || nat.Backend != 4501 || nat.Proto != "tcp" {
t.Errorf("-p :4501 should produce 4501->4501/tcp, got %d->%d/%s",
nat.Frontend, nat.Backend, nat.Proto)
}
} else {
t.Fatal(err)
}
if nat, err := parseNat("4502:4503"); err == nil {
if nat.Frontend != 4502 || nat.Backend != 4503 {
t.Errorf("-p 4502:4503 should produce 4502->4503, got %d->%d", nat.Frontend, nat.Backend)
if nat.Frontend != 4502 || nat.Backend != 4503 || nat.Proto != "tcp" {
t.Errorf("-p 4502:4503 should produce 4502->4503/tcp, got %d->%d/%s",
nat.Frontend, nat.Backend, nat.Proto)
}
} else {
t.Fatal(err)
}
if nat, err := parseNat("4502:4503/tcp"); err == nil {
if nat.Frontend != 4502 || nat.Backend != 4503 || nat.Proto != "tcp" {
t.Errorf("-p 4502:4503/tcp should produce 4502->4503/tcp, got %d->%d/%s",
nat.Frontend, nat.Backend, nat.Proto)
}
} else {
t.Fatal(err)
}
if nat, err := parseNat("4502:4503/udp"); err == nil {
if nat.Frontend != 4502 || nat.Backend != 4503 || nat.Proto != "udp" {
t.Errorf("-p 4502:4503/udp should produce 4502->4503/udp, got %d->%d/%s",
nat.Frontend, nat.Backend, nat.Proto)
}
} else {
t.Fatal(err)
}
if nat, err := parseNat(":4503/udp"); err == nil {
if nat.Frontend != 4503 || nat.Backend != 4503 || nat.Proto != "udp" {
t.Errorf("-p :4503/udp should produce 4503->4503/udp, got %d->%d/%s",
nat.Frontend, nat.Backend, nat.Proto)
}
} else {
t.Fatal(err)
}
if nat, err := parseNat(":4503/tcp"); err == nil {
if nat.Frontend != 4503 || nat.Backend != 4503 || nat.Proto != "tcp" {
t.Errorf("-p :4503/tcp should produce 4503->4503/tcp, got %d->%d/%s",
nat.Frontend, nat.Backend, nat.Proto)
}
} else {
t.Fatal(err)
}
if nat, err := parseNat("4503/tcp"); err == nil {
if nat.Frontend != 0 || nat.Backend != 4503 || nat.Proto != "tcp" {
t.Errorf("-p 4503/tcp should produce 0->4503/tcp, got %d->%d/%s",
nat.Frontend, nat.Backend, nat.Proto)
}
} else {
t.Fatal(err)
}
if nat, err := parseNat("4503/udp"); err == nil {
if nat.Frontend != 0 || nat.Backend != 4503 || nat.Proto != "udp" {
t.Errorf("-p 4503/udp should produce 0->4503/udp, got %d->%d/%s",
nat.Frontend, nat.Backend, nat.Proto)
}
} else {
t.Fatal(err)
}
if _, err := parseNat("4503/tcpgarbage"); err == nil {
t.Fatal(err)
}
if _, err := parseNat("4503/tcp/udp"); err == nil {
t.Fatal(err)
}
if _, err := parseNat("4503/"); err == nil {
t.Fatal(err)
}
}
func TestPortAllocation(t *testing.T) {

View file

@ -1,4 +1,4 @@
#!/bin/sh
# Stop docker
/sbin/stop docker
if [ "`pgrep -f '/usr/bin/docker -d'`" != "" ]; then /sbin/stop docker; fi

View file

@ -12,11 +12,91 @@ import (
"net/http"
"net/http/cookiejar"
"net/url"
"regexp"
"strconv"
"strings"
)
var ErrAlreadyExists = errors.New("Image already exists")
var ErrInvalidRepositoryName = errors.New("Invalid repository name (ex: \"registry.domain.tld/myrepos\")")
func pingRegistryEndpoint(endpoint string) error {
if endpoint == auth.IndexServerAddress() {
// Skip the check, we now this one is valid
// (and we never want to fallback to http in case of error)
return nil
}
resp, err := http.Get(endpoint + "_ping")
if err != nil {
return err
}
if resp.Header.Get("X-Docker-Registry-Version") == "" {
return errors.New("This does not look like a Registry server (\"X-Docker-Registry-Version\" header not found in the response)")
}
return nil
}
func validateRepositoryName(repositoryName string) error {
var (
namespace string
name string
)
nameParts := strings.SplitN(repositoryName, "/", 2)
if len(nameParts) < 2 {
namespace = "library"
name = nameParts[0]
} else {
namespace = nameParts[0]
name = nameParts[1]
}
validNamespace := regexp.MustCompile(`^([a-z0-9_]{4,30})$`)
if !validNamespace.MatchString(namespace) {
return fmt.Errorf("Invalid namespace name (%s), only [a-z0-9_] are allowed, size between 4 and 30", namespace)
}
validRepo := regexp.MustCompile(`^([a-zA-Z0-9-_.]+)$`)
if !validRepo.MatchString(name) {
return fmt.Errorf("Invalid repository name (%s), only [a-zA-Z0-9-_.] are allowed", name)
}
return nil
}
// Resolves a repository name to a endpoint + name
func ResolveRepositoryName(reposName string) (string, string, error) {
if strings.Contains(reposName, "://") {
// It cannot contain a scheme!
return "", "", ErrInvalidRepositoryName
}
nameParts := strings.SplitN(reposName, "/", 2)
if !strings.Contains(nameParts[0], ".") && !strings.Contains(nameParts[0], ":") {
// This is a Docker Index repos (ex: samalba/hipache or ubuntu)
err := validateRepositoryName(reposName)
return auth.IndexServerAddress(), reposName, err
}
if len(nameParts) < 2 {
// There is a dot in repos name (and no registry address)
// Is it a Registry address without repos name?
return "", "", ErrInvalidRepositoryName
}
hostname := nameParts[0]
reposName = nameParts[1]
if strings.Contains(hostname, "index.docker.io") {
return "", "", fmt.Errorf("Invalid repository name, try \"%s\" instead", reposName)
}
if err := validateRepositoryName(reposName); err != nil {
return "", "", err
}
endpoint := fmt.Sprintf("https://%s/v1/", hostname)
if err := pingRegistryEndpoint(endpoint); err != nil {
utils.Debugf("Registry %s does not work (%s), falling back to http", endpoint, err)
endpoint = fmt.Sprintf("http://%s/v1/", hostname)
if err = pingRegistryEndpoint(endpoint); err != nil {
//TODO: triggering highland build can be done there without "failing"
return "", "", errors.New("Invalid Registry endpoint: " + err.Error())
}
}
err := validateRepositoryName(reposName)
return endpoint, reposName, err
}
func doWithCookies(c *http.Client, req *http.Request) (*http.Response, error) {
for _, cookie := range c.Jar.Cookies(req.URL) {
@ -27,8 +107,8 @@ func doWithCookies(c *http.Client, req *http.Request) (*http.Response, error) {
// Retrieve the history of a given image from the Registry.
// Return a list of the parent's json (requested image included)
func (r *Registry) GetRemoteHistory(imgId, registry string, token []string) ([]string, error) {
req, err := http.NewRequest("GET", registry+"/images/"+imgId+"/ancestry", nil)
func (r *Registry) GetRemoteHistory(imgID, registry string, token []string) ([]string, error) {
req, err := http.NewRequest("GET", registry+"images/"+imgID+"/ancestry", nil)
if err != nil {
return nil, err
}
@ -36,7 +116,7 @@ func (r *Registry) GetRemoteHistory(imgId, registry string, token []string) ([]s
res, err := r.client.Do(req)
if err != nil || res.StatusCode != 200 {
if res != nil {
return nil, fmt.Errorf("Internal server error: %d trying to fetch remote history for %s", res.StatusCode, imgId)
return nil, fmt.Errorf("Internal server error: %d trying to fetch remote history for %s", res.StatusCode, imgID)
}
return nil, err
}
@ -56,60 +136,25 @@ func (r *Registry) GetRemoteHistory(imgId, registry string, token []string) ([]s
}
// Check if an image exists in the Registry
func (r *Registry) LookupRemoteImage(imgId, registry string, authConfig *auth.AuthConfig) bool {
func (r *Registry) LookupRemoteImage(imgID, registry string, token []string) bool {
rt := &http.Transport{Proxy: http.ProxyFromEnvironment}
req, err := http.NewRequest("GET", registry+"/images/"+imgId+"/json", nil)
req, err := http.NewRequest("GET", registry+"images/"+imgID+"/json", nil)
if err != nil {
return false
}
req.SetBasicAuth(authConfig.Username, authConfig.Password)
res, err := rt.RoundTrip(req)
if err != nil {
return false
}
res.Body.Close()
return res.StatusCode == 307
}
func (r *Registry) getImagesInRepository(repository string, authConfig *auth.AuthConfig) ([]map[string]string, error) {
u := auth.IndexServerAddress() + "/repositories/" + repository + "/images"
req, err := http.NewRequest("GET", u, nil)
if err != nil {
return nil, err
}
if authConfig != nil && len(authConfig.Username) > 0 {
req.SetBasicAuth(authConfig.Username, authConfig.Password)
}
res, err := r.client.Do(req)
if err != nil {
return nil, err
}
defer res.Body.Close()
// Repository doesn't exist yet
if res.StatusCode == 404 {
return nil, nil
}
jsonData, err := ioutil.ReadAll(res.Body)
if err != nil {
return nil, err
}
imageList := []map[string]string{}
if err := json.Unmarshal(jsonData, &imageList); err != nil {
utils.Debugf("Body: %s (%s)\n", res.Body, u)
return nil, err
}
return imageList, nil
return res.StatusCode == 200
}
// Retrieve an image from the Registry.
func (r *Registry) GetRemoteImageJSON(imgId, registry string, token []string) ([]byte, int, error) {
func (r *Registry) GetRemoteImageJSON(imgID, registry string, token []string) ([]byte, int, error) {
// Get the JSON
req, err := http.NewRequest("GET", registry+"/images/"+imgId+"/json", nil)
req, err := http.NewRequest("GET", registry+"images/"+imgID+"/json", nil)
if err != nil {
return nil, -1, fmt.Errorf("Failed to download json: %s", err)
}
@ -135,8 +180,8 @@ func (r *Registry) GetRemoteImageJSON(imgId, registry string, token []string) ([
return jsonString, imageSize, nil
}
func (r *Registry) GetRemoteImageLayer(imgId, registry string, token []string) (io.ReadCloser, error) {
req, err := http.NewRequest("GET", registry+"/images/"+imgId+"/layer", nil)
func (r *Registry) GetRemoteImageLayer(imgID, registry string, token []string) (io.ReadCloser, error) {
req, err := http.NewRequest("GET", registry+"images/"+imgID+"/layer", nil)
if err != nil {
return nil, fmt.Errorf("Error while getting from the server: %s\n", err)
}
@ -155,7 +200,7 @@ func (r *Registry) GetRemoteTags(registries []string, repository string, token [
repository = "library/" + repository
}
for _, host := range registries {
endpoint := fmt.Sprintf("https://%s/v1/repositories/%s/tags", host, repository)
endpoint := fmt.Sprintf("%srepositories/%s/tags", host, repository)
req, err := r.opaqueRequest("GET", endpoint, nil)
if err != nil {
return nil, err
@ -165,6 +210,7 @@ func (r *Registry) GetRemoteTags(registries []string, repository string, token [
if err != nil {
return nil, err
}
utils.Debugf("Got status code %d from %s", res.StatusCode, endpoint)
defer res.Body.Close()
@ -187,8 +233,8 @@ func (r *Registry) GetRemoteTags(registries []string, repository string, token [
return nil, fmt.Errorf("Could not reach any registry endpoint")
}
func (r *Registry) GetRepositoryData(remote string) (*RepositoryData, error) {
repositoryTarget := auth.IndexServerAddress() + "/repositories/" + remote + "/images"
func (r *Registry) GetRepositoryData(indexEp, remote string) (*RepositoryData, error) {
repositoryTarget := fmt.Sprintf("%srepositories/%s/images", indexEp, remote)
req, err := r.opaqueRequest("GET", repositoryTarget, nil)
if err != nil {
@ -219,8 +265,12 @@ func (r *Registry) GetRepositoryData(remote string) (*RepositoryData, error) {
}
var endpoints []string
var urlScheme = indexEp[:strings.Index(indexEp, ":")]
if res.Header.Get("X-Docker-Endpoints") != "" {
endpoints = res.Header["X-Docker-Endpoints"]
// The Registry's URL scheme has to match the Index'
for _, ep := range res.Header["X-Docker-Endpoints"] {
endpoints = append(endpoints, fmt.Sprintf("%s://%s/v1/", urlScheme, ep))
}
} else {
return nil, fmt.Errorf("Index response didn't contain any endpoints")
}
@ -249,9 +299,8 @@ func (r *Registry) GetRepositoryData(remote string) (*RepositoryData, error) {
// Push a local image to the registry
func (r *Registry) PushImageJSONRegistry(imgData *ImgData, jsonRaw []byte, registry string, token []string) error {
registry = "https://" + registry + "/v1"
// FIXME: try json with UTF8
req, err := http.NewRequest("PUT", registry+"/images/"+imgData.ID+"/json", strings.NewReader(string(jsonRaw)))
req, err := http.NewRequest("PUT", registry+"images/"+imgData.ID+"/json", strings.NewReader(string(jsonRaw)))
if err != nil {
return err
}
@ -284,9 +333,8 @@ func (r *Registry) PushImageJSONRegistry(imgData *ImgData, jsonRaw []byte, regis
return nil
}
func (r *Registry) PushImageLayerRegistry(imgId string, layer io.Reader, registry string, token []string) error {
registry = "https://" + registry + "/v1"
req, err := http.NewRequest("PUT", registry+"/images/"+imgId+"/layer", layer)
func (r *Registry) PushImageLayerRegistry(imgID string, layer io.Reader, registry string, token []string) error {
req, err := http.NewRequest("PUT", registry+"images/"+imgID+"/layer", layer)
if err != nil {
return err
}
@ -323,9 +371,8 @@ func (r *Registry) opaqueRequest(method, urlStr string, body io.Reader) (*http.R
func (r *Registry) PushRegistryTag(remote, revision, tag, registry string, token []string) error {
// "jsonify" the string
revision = "\"" + revision + "\""
registry = "https://" + registry + "/v1"
req, err := r.opaqueRequest("PUT", registry+"/repositories/"+remote+"/tags/"+tag, strings.NewReader(revision))
req, err := r.opaqueRequest("PUT", registry+"repositories/"+remote+"/tags/"+tag, strings.NewReader(revision))
if err != nil {
return err
}
@ -343,7 +390,7 @@ func (r *Registry) PushRegistryTag(remote, revision, tag, registry string, token
return nil
}
func (r *Registry) PushImageJSONIndex(remote string, imgList []*ImgData, validate bool, regs []string) (*RepositoryData, error) {
func (r *Registry) PushImageJSONIndex(indexEp, remote string, imgList []*ImgData, validate bool, regs []string) (*RepositoryData, error) {
imgListJSON, err := json.Marshal(imgList)
if err != nil {
return nil, err
@ -353,9 +400,10 @@ func (r *Registry) PushImageJSONIndex(remote string, imgList []*ImgData, validat
suffix = "images"
}
u := fmt.Sprintf("%srepositories/%s/%s", indexEp, remote, suffix)
utils.Debugf("PUT %s", u)
utils.Debugf("Image list pushed to index:\n%s\n", imgListJSON)
req, err := r.opaqueRequest("PUT", auth.IndexServerAddress()+"/repositories/"+remote+"/"+suffix, bytes.NewReader(imgListJSON))
req, err := r.opaqueRequest("PUT", u, bytes.NewReader(imgListJSON))
if err != nil {
return nil, err
}
@ -393,6 +441,7 @@ func (r *Registry) PushImageJSONIndex(remote string, imgList []*ImgData, validat
}
var tokens, endpoints []string
var urlScheme = indexEp[:strings.Index(indexEp, ":")]
if !validate {
if res.StatusCode != 200 && res.StatusCode != 201 {
errBody, err := ioutil.ReadAll(res.Body)
@ -409,7 +458,10 @@ func (r *Registry) PushImageJSONIndex(remote string, imgList []*ImgData, validat
}
if res.Header.Get("X-Docker-Endpoints") != "" {
endpoints = res.Header["X-Docker-Endpoints"]
// The Registry's URL scheme has to match the Index'
for _, ep := range res.Header["X-Docker-Endpoints"] {
endpoints = append(endpoints, fmt.Sprintf("%s://%s/v1/", urlScheme, ep))
}
} else {
return nil, fmt.Errorf("Index response didn't contain any endpoints")
}
@ -431,7 +483,7 @@ func (r *Registry) PushImageJSONIndex(remote string, imgList []*ImgData, validat
}
func (r *Registry) SearchRepositories(term string) (*SearchResults, error) {
u := auth.IndexServerAddress() + "/search?q=" + url.QueryEscape(term)
u := auth.IndexServerAddress() + "search?q=" + url.QueryEscape(term)
req, err := http.NewRequest("GET", u, nil)
if err != nil {
return nil, err

View file

@ -108,9 +108,6 @@ func (runtime *Runtime) Register(container *Container) error {
// init the wait lock
container.waitLock = make(chan struct{})
// Even if not running, we init the lock (prevents races in start/stop/kill)
container.State.initLock()
container.runtime = runtime
// Attach to stdout and stderr

View file

@ -1,6 +1,7 @@
package docker
import (
"bytes"
"fmt"
"github.com/dotcloud/docker/utils"
"io"
@ -17,11 +18,12 @@ import (
)
const (
unitTestImageName = "docker-ut"
unitTestImageId = "e9aa60c60128cad1"
unitTestStoreBase = "/var/lib/docker/unit-tests"
testDaemonAddr = "127.0.0.1:4270"
testDaemonProto = "tcp"
unitTestImageName = "docker-test-image"
unitTestImageID = "83599e29c455eb719f77d799bc7c51521b9551972f5a850d7ad265bc1b5292f6" // 1.0
unitTestNetworkBridge = "testdockbr0"
unitTestStoreBase = "/var/lib/docker/unit-tests"
testDaemonAddr = "127.0.0.1:4270"
testDaemonProto = "tcp"
)
var globalRuntime *Runtime
@ -49,7 +51,7 @@ func cleanup(runtime *Runtime) error {
return err
}
for _, image := range images {
if image.ID != unitTestImageId {
if image.ID != unitTestImageID {
runtime.graph.Delete(image.ID)
}
}
@ -73,10 +75,10 @@ func init() {
}
if uid := syscall.Geteuid(); uid != 0 {
log.Fatal("docker tests needs to be run as root")
log.Fatal("docker tests need to be run as root")
}
NetworkBridgeIface = "testdockbr0"
NetworkBridgeIface = unitTestNetworkBridge
// Make it our Store root
runtime, err := NewRuntimeFromDirectory(unitTestStoreBase, false)
@ -89,15 +91,16 @@ func init() {
srv := &Server{
runtime: runtime,
enableCors: false,
lock: &sync.Mutex{},
pullingPool: make(map[string]struct{}),
pushingPool: make(map[string]struct{}),
}
// Retrieve the Image
if err := srv.ImagePull(unitTestImageName, "", "", os.Stdout, utils.NewStreamFormatter(false), nil); err != nil {
panic(err)
// If the unit test is not found, try to download it.
if img, err := runtime.repositories.LookupImage(unitTestImageName); err != nil || img.ID != unitTestImageID {
// Retrieve the Image
if err := srv.ImagePull(unitTestImageName, "", os.Stdout, utils.NewStreamFormatter(false), nil); err != nil {
panic(err)
}
}
// Spawn a Daemon
go func() {
if err := ListenAndServe(testDaemonProto, testDaemonAddr, srv, os.Getenv("DEBUG") != ""); err != nil {
@ -135,10 +138,13 @@ func GetTestImage(runtime *Runtime) *Image {
imgs, err := runtime.graph.All()
if err != nil {
panic(err)
} else if len(imgs) < 1 {
panic("GASP")
}
return imgs[0]
for i := range imgs {
if imgs[i].ID == unitTestImageID {
return imgs[i]
}
}
panic(fmt.Errorf("Test image %v not found", unitTestImageID))
}
func TestRuntimeCreate(t *testing.T) {
@ -316,82 +322,144 @@ func TestGet(t *testing.T) {
}
func findAvailalblePort(runtime *Runtime, port int) (*Container, error) {
strPort := strconv.Itoa(port)
container, err := NewBuilder(runtime).Create(&Config{
Image: GetTestImage(runtime).ID,
Cmd: []string{"sh", "-c", "echo well hello there | nc -l -p " + strPort},
PortSpecs: []string{strPort},
},
)
if err != nil {
return nil, err
}
hostConfig := &HostConfig{}
if err := container.Start(hostConfig); err != nil {
if strings.Contains(err.Error(), "address already in use") {
return nil, nil
}
return nil, err
}
return container, nil
}
// Run a container with a TCP port allocated, and test that it can receive connections on localhost
func TestAllocatePortLocalhost(t *testing.T) {
func startEchoServerContainer(t *testing.T, proto string) (*Runtime, *Container, string) {
runtime, err := newTestRuntime()
if err != nil {
t.Fatal(err)
}
port := 5554
port := 5554
var container *Container
var strPort string
for {
port += 1
log.Println("Trying port", port)
t.Log("Trying port", port)
container, err = findAvailalblePort(runtime, port)
strPort = strconv.Itoa(port)
var cmd string
if proto == "tcp" {
cmd = "socat TCP-LISTEN:" + strPort + ",reuseaddr,fork EXEC:/bin/cat"
} else if proto == "udp" {
cmd = "socat UDP-RECVFROM:" + strPort + ",fork EXEC:/bin/cat"
} else {
t.Fatal(fmt.Errorf("Unknown protocol %v", proto))
}
t.Log("Trying port", strPort)
container, err = NewBuilder(runtime).Create(&Config{
Image: GetTestImage(runtime).ID,
Cmd: []string{"sh", "-c", cmd},
PortSpecs: []string{fmt.Sprintf("%s/%s", strPort, proto)},
})
if container != nil {
break
}
if err != nil {
nuke(runtime)
t.Fatal(err)
}
log.Println("Port", port, "already in use")
t.Log("Port", port, "already in use")
t.Logf("Port %v already in use", strPort)
}
defer container.Kill()
hostConfig := &HostConfig{}
if err := container.Start(hostConfig); err != nil {
nuke(runtime)
t.Fatal(err)
}
setTimeout(t, "Waiting for the container to be started timed out", 2*time.Second, func() {
for {
if container.State.Running {
break
}
for !container.State.Running {
time.Sleep(10 * time.Millisecond)
}
})
conn, err := net.Dial("tcp",
fmt.Sprintf(
"localhost:%s", container.NetworkSettings.PortMapping[strconv.Itoa(port)],
),
)
// Even if the state is running, lets give some time to lxc to spawn the process
container.WaitTimeout(500 * time.Millisecond)
strPort = container.NetworkSettings.PortMapping[strings.Title(proto)][strPort]
return runtime, container, strPort
}
// Run a container with a TCP port allocated, and test that it can receive connections on localhost
func TestAllocateTCPPortLocalhost(t *testing.T) {
runtime, container, port := startEchoServerContainer(t, "tcp")
defer nuke(runtime)
defer container.Kill()
for i := 0; i != 10; i++ {
conn, err := net.Dial("tcp", fmt.Sprintf("localhost:%v", port))
if err != nil {
t.Fatal(err)
}
defer conn.Close()
input := bytes.NewBufferString("well hello there\n")
_, err = conn.Write(input.Bytes())
if err != nil {
t.Fatal(err)
}
buf := make([]byte, 16)
read := 0
conn.SetReadDeadline(time.Now().Add(3 * time.Second))
read, err = conn.Read(buf)
if err != nil {
if err, ok := err.(*net.OpError); ok {
if err.Err == syscall.ECONNRESET {
t.Logf("Connection reset by the proxy, socat is probably not listening yet, trying again in a sec")
conn.Close()
time.Sleep(time.Second)
continue
}
if err.Timeout() {
t.Log("Timeout, trying again")
conn.Close()
continue
}
}
t.Fatal(err)
}
output := string(buf[:read])
if !strings.Contains(output, "well hello there") {
t.Fatal(fmt.Errorf("[%v] doesn't contain [well hello there]", output))
} else {
return
}
}
t.Fatal("No reply from the container")
}
// Run a container with an UDP port allocated, and test that it can receive connections on localhost
func TestAllocateUDPPortLocalhost(t *testing.T) {
runtime, container, port := startEchoServerContainer(t, "udp")
defer nuke(runtime)
defer container.Kill()
conn, err := net.Dial("udp", fmt.Sprintf("localhost:%v", port))
if err != nil {
t.Fatal(err)
}
defer conn.Close()
output, err := ioutil.ReadAll(conn)
if err != nil {
t.Fatal(err)
input := bytes.NewBufferString("well hello there\n")
buf := make([]byte, 16)
// Try for a minute, for some reason the select in socat may take ages
// to return even though everything on the path seems fine (i.e: the
// UDPProxy forwards the traffic correctly and you can see the packets
// on the interface from within the container).
for i := 0; i != 120; i++ {
_, err := conn.Write(input.Bytes())
if err != nil {
t.Fatal(err)
}
conn.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
read, err := conn.Read(buf)
if err == nil {
output := string(buf[:read])
if strings.Contains(output, "well hello there") {
return
}
}
}
if string(output) != "well hello there\n" {
t.Fatalf("Received wrong output from network connection: should be '%s', not '%s'",
"well hello there\n",
string(output),
)
}
container.Wait()
t.Fatal("No reply from the container")
}
func TestRestore(t *testing.T) {

186
server.go
View file

@ -31,7 +31,7 @@ func (srv *Server) DockerVersion() APIVersion {
func (srv *Server) ContainerKill(name string) error {
if container := srv.runtime.Get(name); container != nil {
if err := container.Kill(); err != nil {
return fmt.Errorf("Error restarting container %s: %s", name, err.Error())
return fmt.Errorf("Error restarting container %s: %s", name, err)
}
} else {
return fmt.Errorf("No such container: %s", name)
@ -351,8 +351,8 @@ func (srv *Server) ContainerTag(name, repo, tag string, force bool) error {
return nil
}
func (srv *Server) pullImage(r *registry.Registry, out io.Writer, imgId, endpoint string, token []string, sf *utils.StreamFormatter) error {
history, err := r.GetRemoteHistory(imgId, endpoint, token)
func (srv *Server) pullImage(r *registry.Registry, out io.Writer, imgID, endpoint string, token []string, sf *utils.StreamFormatter) error {
history, err := r.GetRemoteHistory(imgID, endpoint, token)
if err != nil {
return err
}
@ -387,9 +387,10 @@ func (srv *Server) pullImage(r *registry.Registry, out io.Writer, imgId, endpoin
return nil
}
func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, remote, askedTag string, sf *utils.StreamFormatter) error {
out.Write(sf.FormatStatus("Pulling repository %s from %s", local, auth.IndexServerAddress()))
repoData, err := r.GetRepositoryData(remote)
func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, localName, remoteName, askedTag, indexEp string, sf *utils.StreamFormatter) error {
out.Write(sf.FormatStatus("Pulling repository %s", localName))
repoData, err := r.GetRepositoryData(indexEp, remoteName)
if err != nil {
return err
}
@ -401,12 +402,22 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, re
}
utils.Debugf("Retrieving the tag list")
tagsList, err := r.GetRemoteTags(repoData.Endpoints, remote, repoData.Tokens)
tagsList, err := r.GetRemoteTags(repoData.Endpoints, remoteName, repoData.Tokens)
if err != nil {
utils.Debugf("%v", err)
return err
}
for tag, id := range tagsList {
repoData.ImgList[id] = &registry.ImgData{
ID: id,
Tag: tag,
Checksum: "",
}
}
utils.Debugf("Registering tags")
// If not specific tag have been asked, take all
// If no tag has been specified, pull them all
if askedTag == "" {
for tag, id := range tagsList {
repoData.ImgList[id].Tag = tag
@ -415,7 +426,7 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, re
// Otherwise, check that the tag exists and use only that one
id, exists := tagsList[askedTag]
if !exists {
return fmt.Errorf("Tag %s not found in repositoy %s", askedTag, local)
return fmt.Errorf("Tag %s not found in repository %s", askedTag, localName)
}
repoData.ImgList[id].Tag = askedTag
}
@ -425,10 +436,15 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, re
utils.Debugf("(%s) does not match %s (id: %s), skipping", img.Tag, askedTag, img.ID)
continue
}
out.Write(sf.FormatStatus("Pulling image %s (%s) from %s", img.ID, img.Tag, remote))
if img.Tag == "" {
utils.Debugf("Image (id: %s) present in this repository but untagged, skipping", img.ID)
continue
}
out.Write(sf.FormatStatus("Pulling image %s (%s) from %s", img.ID, img.Tag, localName))
success := false
for _, ep := range repoData.Endpoints {
if err := srv.pullImage(r, out, img.ID, "https://"+ep+"/v1", repoData.Tokens, sf); err != nil {
if err := srv.pullImage(r, out, img.ID, ep, repoData.Tokens, sf); err != nil {
out.Write(sf.FormatStatus("Error while retrieving image for tag: %s (%s); checking next endpoint", askedTag, err))
continue
}
@ -443,7 +459,7 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, re
if askedTag != "" && tag != askedTag {
continue
}
if err := srv.runtime.repositories.Set(local, tag, id, true); err != nil {
if err := srv.runtime.repositories.Set(localName, tag, id, true); err != nil {
return err
}
}
@ -455,8 +471,8 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, local, re
}
func (srv *Server) poolAdd(kind, key string) error {
srv.lock.Lock()
defer srv.lock.Unlock()
srv.Lock()
defer srv.Unlock()
if _, exists := srv.pullingPool[key]; exists {
return fmt.Errorf("%s %s is already in progress", key, kind)
@ -489,31 +505,36 @@ func (srv *Server) poolRemove(kind, key string) error {
return nil
}
func (srv *Server) ImagePull(name, tag, endpoint string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig) error {
func (srv *Server) ImagePull(localName string, tag string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig) error {
r, err := registry.NewRegistry(srv.runtime.root, authConfig)
if err != nil {
return err
}
if err := srv.poolAdd("pull", name+":"+tag); err != nil {
if err := srv.poolAdd("pull", localName+":"+tag); err != nil {
return err
}
defer srv.poolRemove("pull", name+":"+tag)
defer srv.poolRemove("pull", localName+":"+tag)
// Resolve the Repository name from fqn to endpoint + name
endpoint, remoteName, err := registry.ResolveRepositoryName(localName)
if err != nil {
return err
}
if endpoint == auth.IndexServerAddress() {
// If pull "index.docker.io/foo/bar", it's stored locally under "foo/bar"
localName = remoteName
}
out = utils.NewWriteFlusher(out)
if endpoint != "" {
if err := srv.pullImage(r, out, name, endpoint, nil, sf); err != nil {
err = srv.pullRepository(r, out, localName, remoteName, tag, endpoint, sf)
if err != nil {
if err := srv.pullImage(r, out, remoteName, endpoint, nil, sf); err != nil {
return err
}
return nil
}
remote := name
parts := strings.Split(name, "/")
if len(parts) > 2 {
remote = fmt.Sprintf("src/%s", url.QueryEscape(strings.Join(parts, "/")))
}
if err := srv.pullRepository(r, out, name, remote, tag, sf); err != nil {
return err
}
return nil
}
@ -523,20 +544,20 @@ func (srv *Server) ImagePull(name, tag, endpoint string, out io.Writer, sf *util
// - Check if the archive exists, if it does not, ask the registry
// - If the archive does exists, process the checksum from it
// - If the archive does not exists and not found on registry, process checksum from layer
func (srv *Server) getChecksum(imageId string) (string, error) {
func (srv *Server) getChecksum(imageID string) (string, error) {
// FIXME: Use in-memory map instead of reading the file each time
if sums, err := srv.runtime.graph.getStoredChecksums(); err != nil {
return "", err
} else if checksum, exists := sums[imageId]; exists {
} else if checksum, exists := sums[imageID]; exists {
return checksum, nil
}
img, err := srv.runtime.graph.Get(imageId)
img, err := srv.runtime.graph.Get(imageID)
if err != nil {
return "", err
}
if _, err := os.Stat(layerArchivePath(srv.runtime.graph.imageRoot(imageId))); err != nil {
if _, err := os.Stat(layerArchivePath(srv.runtime.graph.imageRoot(imageID))); err != nil {
if os.IsNotExist(err) {
// TODO: Ask the registry for the checksum
// As the archive is not there, it is supposed to come from a pull.
@ -583,7 +604,7 @@ func (srv *Server) getImageList(localRepo map[string]string) ([]*registry.ImgDat
return imgList, nil
}
func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, name string, localRepo map[string]string, sf *utils.StreamFormatter) error {
func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, localName, remoteName string, localRepo map[string]string, indexEp string, sf *utils.StreamFormatter) error {
out = utils.NewWriteFlusher(out)
out.Write(sf.FormatStatus("Processing checksums"))
imgList, err := srv.getImageList(localRepo)
@ -592,64 +613,63 @@ func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, name stri
}
out.Write(sf.FormatStatus("Sending image list"))
srvName := name
parts := strings.Split(name, "/")
if len(parts) > 2 {
srvName = fmt.Sprintf("src/%s", url.QueryEscape(strings.Join(parts, "/")))
}
repoData, err := r.PushImageJSONIndex(srvName, imgList, false, nil)
var repoData *registry.RepositoryData
repoData, err = r.PushImageJSONIndex(indexEp, remoteName, imgList, false, nil)
if err != nil {
return err
}
for _, ep := range repoData.Endpoints {
out.Write(sf.FormatStatus("Pushing repository %s to %s (%d tags)", name, ep, len(localRepo)))
out.Write(sf.FormatStatus("Pushing repository %s (%d tags)", localName, len(localRepo)))
// For each image within the repo, push them
for _, elem := range imgList {
if _, exists := repoData.ImgList[elem.ID]; exists {
out.Write(sf.FormatStatus("Image %s already on registry, skipping", name))
out.Write(sf.FormatStatus("Image %s already pushed, skipping", elem.ID))
continue
} else if r.LookupRemoteImage(elem.ID, ep, repoData.Tokens) {
out.Write(sf.FormatStatus("Image %s already pushed, skipping", elem.ID))
continue
}
if err := srv.pushImage(r, out, name, elem.ID, ep, repoData.Tokens, sf); err != nil {
if err := srv.pushImage(r, out, remoteName, elem.ID, ep, repoData.Tokens, sf); err != nil {
// FIXME: Continue on error?
return err
}
out.Write(sf.FormatStatus("Pushing tags for rev [%s] on {%s}", elem.ID, ep+"/repositories/"+srvName+"/tags/"+elem.Tag))
if err := r.PushRegistryTag(srvName, elem.ID, elem.Tag, ep, repoData.Tokens); err != nil {
out.Write(sf.FormatStatus("Pushing tags for rev [%s] on {%s}", elem.ID, ep+"repositories/"+remoteName+"/tags/"+elem.Tag))
if err := r.PushRegistryTag(remoteName, elem.ID, elem.Tag, ep, repoData.Tokens); err != nil {
return err
}
}
}
if _, err := r.PushImageJSONIndex(srvName, imgList, true, repoData.Endpoints); err != nil {
if _, err := r.PushImageJSONIndex(indexEp, remoteName, imgList, true, repoData.Endpoints); err != nil {
return err
}
return nil
}
func (srv *Server) pushImage(r *registry.Registry, out io.Writer, remote, imgId, ep string, token []string, sf *utils.StreamFormatter) error {
func (srv *Server) pushImage(r *registry.Registry, out io.Writer, remote, imgID, ep string, token []string, sf *utils.StreamFormatter) error {
out = utils.NewWriteFlusher(out)
jsonRaw, err := ioutil.ReadFile(path.Join(srv.runtime.graph.Root, imgId, "json"))
jsonRaw, err := ioutil.ReadFile(path.Join(srv.runtime.graph.Root, imgID, "json"))
if err != nil {
return fmt.Errorf("Error while retreiving the path for {%s}: %s", imgId, err)
return fmt.Errorf("Error while retreiving the path for {%s}: %s", imgID, err)
}
out.Write(sf.FormatStatus("Pushing %s", imgId))
out.Write(sf.FormatStatus("Pushing %s", imgID))
// Make sure we have the image's checksum
checksum, err := srv.getChecksum(imgId)
checksum, err := srv.getChecksum(imgID)
if err != nil {
return err
}
imgData := &registry.ImgData{
ID: imgId,
ID: imgID,
Checksum: checksum,
}
// Send the json
if err := r.PushImageJSONRegistry(imgData, jsonRaw, ep, token); err != nil {
if err == registry.ErrAlreadyExists {
out.Write(sf.FormatStatus("Image %s already uploaded ; skipping", imgData.ID))
out.Write(sf.FormatStatus("Image %s already pushed, skipping", imgData.ID))
return nil
}
return err
@ -658,11 +678,11 @@ func (srv *Server) pushImage(r *registry.Registry, out io.Writer, remote, imgId,
// Retrieve the tarball to be sent
var layerData *TempArchive
// If the archive exists, use it
file, err := os.Open(layerArchivePath(srv.runtime.graph.imageRoot(imgId)))
file, err := os.Open(layerArchivePath(srv.runtime.graph.imageRoot(imgID)))
if err != nil {
if os.IsNotExist(err) {
// If the archive does not exist, create one from the layer
layerData, err = srv.runtime.graph.TempLayerArchive(imgId, Xz, out)
layerData, err = srv.runtime.graph.TempLayerArchive(imgID, Xz, sf, out)
if err != nil {
return fmt.Errorf("Failed to generate layer archive: %s", err)
}
@ -689,32 +709,41 @@ func (srv *Server) pushImage(r *registry.Registry, out io.Writer, remote, imgId,
}
// FIXME: Allow to interupt current push when new push of same image is done.
func (srv *Server) ImagePush(name, endpoint string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig) error {
if err := srv.poolAdd("push", name); err != nil {
func (srv *Server) ImagePush(localName string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig) error {
if err := srv.poolAdd("push", localName); err != nil {
return err
}
defer srv.poolRemove("push", localName)
// Resolve the Repository name from fqn to endpoint + name
endpoint, remoteName, err := registry.ResolveRepositoryName(localName)
if err != nil {
return err
}
defer srv.poolRemove("push", name)
out = utils.NewWriteFlusher(out)
img, err := srv.runtime.graph.Get(name)
img, err := srv.runtime.graph.Get(localName)
r, err2 := registry.NewRegistry(srv.runtime.root, authConfig)
if err2 != nil {
return err2
}
if err != nil {
out.Write(sf.FormatStatus("The push refers to a repository [%s] (len: %d)", name, len(srv.runtime.repositories.Repositories[name])))
reposLen := len(srv.runtime.repositories.Repositories[localName])
out.Write(sf.FormatStatus("The push refers to a repository [%s] (len: %d)", localName, reposLen))
// If it fails, try to get the repository
if localRepo, exists := srv.runtime.repositories.Repositories[name]; exists {
if err := srv.pushRepository(r, out, name, localRepo, sf); err != nil {
if localRepo, exists := srv.runtime.repositories.Repositories[localName]; exists {
if err := srv.pushRepository(r, out, localName, remoteName, localRepo, endpoint, sf); err != nil {
return err
}
return nil
}
return err
}
out.Write(sf.FormatStatus("The push refers to an image: [%s]", name))
if err := srv.pushImage(r, out, name, img.ID, endpoint, nil, sf); err != nil {
var token []string
out.Write(sf.FormatStatus("The push refers to an image: [%s]", localName))
if err := srv.pushImage(r, out, remoteName, img.ID, endpoint, token, sf); err != nil {
return err
}
return nil
@ -786,7 +815,7 @@ func (srv *Server) ContainerCreate(config *Config) (string, error) {
func (srv *Server) ContainerRestart(name string, t int) error {
if container := srv.runtime.Get(name); container != nil {
if err := container.Restart(t); err != nil {
return fmt.Errorf("Error restarting container %s: %s", name, err.Error())
return fmt.Errorf("Error restarting container %s: %s", name, err)
}
} else {
return fmt.Errorf("No such container: %s", name)
@ -805,7 +834,7 @@ func (srv *Server) ContainerDestroy(name string, removeVolume bool) error {
volumes[volumeId] = struct{}{}
}
if err := srv.runtime.Destroy(container); err != nil {
return fmt.Errorf("Error destroying container %s: %s", name, err.Error())
return fmt.Errorf("Error destroying container %s: %s", name, err)
}
if removeVolume {
@ -894,9 +923,9 @@ func (srv *Server) deleteImageParents(img *Image, imgs *[]APIRmi) error {
return nil
}
func (srv *Server) deleteImage(img *Image, repoName, tag string) (*[]APIRmi, error) {
func (srv *Server) deleteImage(img *Image, repoName, tag string) ([]APIRmi, error) {
//Untag the current image
var imgs []APIRmi
imgs := []APIRmi{}
tagDeleted, err := srv.runtime.repositories.Delete(repoName, tag)
if err != nil {
return nil, err
@ -907,25 +936,25 @@ func (srv *Server) deleteImage(img *Image, repoName, tag string) (*[]APIRmi, err
if len(srv.runtime.repositories.ByID()[img.ID]) == 0 {
if err := srv.deleteImageAndChildren(img.ID, &imgs); err != nil {
if err != ErrImageReferenced {
return &imgs, err
return imgs, err
}
} else if err := srv.deleteImageParents(img, &imgs); err != nil {
if err != ErrImageReferenced {
return &imgs, err
return imgs, err
}
}
}
return &imgs, nil
return imgs, nil
}
func (srv *Server) ImageDelete(name string, autoPrune bool) (*[]APIRmi, error) {
func (srv *Server) ImageDelete(name string, autoPrune bool) ([]APIRmi, error) {
img, err := srv.runtime.repositories.LookupImage(name)
if err != nil {
return nil, fmt.Errorf("No such image: %s", name)
}
if !autoPrune {
if err := srv.runtime.graph.Delete(img.ID); err != nil {
return nil, fmt.Errorf("Error deleting image %s: %s", name, err.Error())
return nil, fmt.Errorf("Error deleting image %s: %s", name, err)
}
return nil, nil
}
@ -940,7 +969,7 @@ func (srv *Server) ImageDelete(name string, autoPrune bool) (*[]APIRmi, error) {
return srv.deleteImage(img, name, tag)
}
func (srv *Server) ImageGetCached(imgId string, config *Config) (*Image, error) {
func (srv *Server) ImageGetCached(imgID string, config *Config) (*Image, error) {
// Retrieve all images
images, err := srv.runtime.graph.All()
@ -958,7 +987,7 @@ func (srv *Server) ImageGetCached(imgId string, config *Config) (*Image, error)
}
// Loop on the children of the given image and check the config
for elem := range imageMap[imgId] {
for elem := range imageMap[imgID] {
img, err := srv.runtime.graph.Get(elem)
if err != nil {
return nil, err
@ -973,7 +1002,7 @@ func (srv *Server) ImageGetCached(imgId string, config *Config) (*Image, error)
func (srv *Server) ContainerStart(name string, hostConfig *HostConfig) error {
if container := srv.runtime.Get(name); container != nil {
if err := container.Start(hostConfig); err != nil {
return fmt.Errorf("Error starting container %s: %s", name, err.Error())
return fmt.Errorf("Error starting container %s: %s", name, err)
}
} else {
return fmt.Errorf("No such container: %s", name)
@ -984,7 +1013,7 @@ func (srv *Server) ContainerStart(name string, hostConfig *HostConfig) error {
func (srv *Server) ContainerStop(name string, t int) error {
if container := srv.runtime.Get(name); container != nil {
if err := container.Stop(t); err != nil {
return fmt.Errorf("Error stopping container %s: %s", name, err.Error())
return fmt.Errorf("Error stopping container %s: %s", name, err)
}
} else {
return fmt.Errorf("No such container: %s", name)
@ -1096,7 +1125,6 @@ func NewServer(flGraphPath string, autoRestart, enableCors bool, dns ListOpts) (
srv := &Server{
runtime: runtime,
enableCors: enableCors,
lock: &sync.Mutex{},
pullingPool: make(map[string]struct{}),
pushingPool: make(map[string]struct{}),
}
@ -1105,9 +1133,9 @@ func NewServer(flGraphPath string, autoRestart, enableCors bool, dns ListOpts) (
}
type Server struct {
sync.Mutex
runtime *Runtime
enableCors bool
lock *sync.Mutex
pullingPool map[string]struct{}
pushingPool map[string]struct{}
}

View file

@ -13,6 +13,11 @@ func TestContainerTagImageDelete(t *testing.T) {
srv := &Server{runtime: runtime}
initialImages, err := srv.Images(false, "")
if err != nil {
t.Fatal(err)
}
if err := srv.runtime.repositories.Set("utest", "tag1", unitTestImageName, false); err != nil {
t.Fatal(err)
}
@ -25,8 +30,8 @@ func TestContainerTagImageDelete(t *testing.T) {
t.Fatal(err)
}
if len(images) != 3 {
t.Errorf("Excepted 3 images, %d found", len(images))
if len(images) != len(initialImages)+2 {
t.Errorf("Expected %d images, %d found", len(initialImages)+2, len(images))
}
if _, err := srv.ImageDelete("utest/docker:tag2", true); err != nil {
@ -38,8 +43,8 @@ func TestContainerTagImageDelete(t *testing.T) {
t.Fatal(err)
}
if len(images) != 2 {
t.Errorf("Excepted 2 images, %d found", len(images))
if len(images) != len(initialImages)+1 {
t.Errorf("Expected %d images, %d found", len(initialImages)+1, len(images))
}
if _, err := srv.ImageDelete("utest:tag1", true); err != nil {
@ -51,8 +56,8 @@ func TestContainerTagImageDelete(t *testing.T) {
t.Fatal(err)
}
if len(images) != 1 {
t.Errorf("Excepted 1 image, %d found", len(images))
if len(images) != len(initialImages) {
t.Errorf("Expected %d image, %d found", len(initialImages), len(images))
}
}

View file

@ -8,11 +8,11 @@ import (
)
type State struct {
sync.Mutex
Running bool
Pid int
ExitCode int
StartedAt time.Time
l *sync.Mutex
Ghost bool
}
@ -29,6 +29,7 @@ func (s *State) String() string {
func (s *State) setRunning(pid int) {
s.Running = true
s.Ghost = false
s.ExitCode = 0
s.Pid = pid
s.StartedAt = time.Now()
@ -39,15 +40,3 @@ func (s *State) setStopped(exitCode int) {
s.Pid = 0
s.ExitCode = exitCode
}
func (s *State) initLock() {
s.l = &sync.Mutex{}
}
func (s *State) lock() {
s.l.Lock()
}
func (s *State) unlock() {
s.l.Unlock()
}

View file

@ -60,9 +60,6 @@ func cleanupEnv(env ListOpts) {
if len(parts) == 1 {
parts = append(parts, "")
}
if parts[0] == "container" {
continue
}
os.Setenv(parts[0], parts[1])
}
}

17
tags.go
View file

@ -70,11 +70,11 @@ func (store *TagStore) LookupImage(name string) (*Image, error) {
if err != nil {
// FIXME: standardize on returning nil when the image doesn't exist, and err for everything else
// (so we can pass all errors here)
repoAndTag := strings.SplitN(name, ":", 2)
if len(repoAndTag) == 1 {
repoAndTag = append(repoAndTag, DEFAULTTAG)
repos, tag := utils.ParseRepositoryTag(name)
if tag == "" {
tag = DEFAULTTAG
}
if i, err := store.GetImage(repoAndTag[0], repoAndTag[1]); err != nil {
if i, err := store.GetImage(repos, tag); err != nil {
return nil, err
} else if i == nil {
return nil, fmt.Errorf("Image does not exist: %s", name)
@ -197,7 +197,7 @@ func (store *TagStore) Get(repoName string) (Repository, error) {
return nil, nil
}
func (store *TagStore) GetImage(repoName, tagOrId string) (*Image, error) {
func (store *TagStore) GetImage(repoName, tagOrID string) (*Image, error) {
repo, err := store.Get(repoName)
if err != nil {
return nil, err
@ -206,11 +206,11 @@ func (store *TagStore) GetImage(repoName, tagOrId string) (*Image, error) {
}
//go through all the tags, to see if tag is in fact an ID
for _, revision := range repo {
if strings.HasPrefix(revision, tagOrId) {
if strings.HasPrefix(revision, tagOrID) {
return store.graph.Get(revision)
}
}
if revision, exists := repo[tagOrId]; exists {
if revision, exists := repo[tagOrID]; exists {
return store.graph.Get(revision)
}
return nil, nil
@ -221,9 +221,6 @@ func validateRepoName(name string) error {
if name == "" {
return fmt.Errorf("Repository name can't be empty")
}
if strings.Contains(name, ":") {
return fmt.Errorf("Illegal repository name: %s", name)
}
return nil
}

View file

@ -35,13 +35,13 @@ func TestLookupImage(t *testing.T) {
t.Errorf("Expected 0 image, 1 found")
}
if img, err := runtime.repositories.LookupImage(unitTestImageId); err != nil {
if img, err := runtime.repositories.LookupImage(unitTestImageID); err != nil {
t.Fatal(err)
} else if img == nil {
t.Errorf("Expected 1 image, none found")
}
if img, err := runtime.repositories.LookupImage(unitTestImageName + ":" + unitTestImageId); err != nil {
if img, err := runtime.repositories.LookupImage(unitTestImageName + ":" + unitTestImageID); err != nil {
t.Fatal(err)
} else if img == nil {
t.Errorf("Expected 1 image, none found")

View file

@ -12,8 +12,8 @@ type State struct {
}
type Winsize struct {
Width uint16
Height uint16
Width uint16
x uint16
y uint16
}

View file

@ -30,6 +30,16 @@ Deployment
export AWS_KEYPAIR_NAME=xxxxxxxxxxxx
export AWS_SSH_PRIVKEY=xxxxxxxxxxxx
# Define email recipient and IRC channel
export EMAIL_RCP=xxxxxx@domain.com
export IRC_CHANNEL=docker
# Define buildbot credentials
export BUILDBOT_PWD=xxxxxxxxxxxx
export IRC_PWD=xxxxxxxxxxxx
export SMTP_USER=xxxxxxxxxxxx
export SMTP_PWD=xxxxxxxxxxxx
# Checkout docker
git clone git://github.com/dotcloud/docker.git

10
testing/Vagrantfile vendored
View file

@ -19,17 +19,20 @@ Vagrant::Config.run do |config|
config.vm.share_folder "v-data", DOCKER_PATH, "#{File.dirname(__FILE__)}/.."
config.vm.network :hostonly, BUILDBOT_IP
# Deploy buildbot and its dependencies if it was not done
if Dir.glob("#{File.dirname(__FILE__)}/.vagrant/machines/default/*/id").empty?
pkg_cmd = "apt-get update -qq; apt-get install -q -y linux-image-3.8.0-19-generic; "
pkg_cmd = "apt-get update -qq; apt-get install -q -y linux-image-generic-lts-raring; "
# Deploy buildbot CI
pkg_cmd << "apt-get install -q -y python-dev python-pip supervisor; " \
"pip install -r #{CFG_PATH}/requirements.txt; " \
"chown #{USER}.#{USER} /data; cd /data; " \
"#{CFG_PATH}/setup.sh #{USER} #{CFG_PATH}; "
"#{CFG_PATH}/setup.sh #{USER} #{CFG_PATH} #{ENV['BUILDBOT_PWD']} " \
"#{ENV['IRC_PWD']} #{ENV['IRC_CHANNEL']} #{ENV['SMTP_USER']} " \
"#{ENV['SMTP_PWD']} #{ENV['EMAIL_RCP']}; "
# Install docker dependencies
pkg_cmd << "apt-get install -q -y python-software-properties; " \
"add-apt-repository -y ppa:gophers/go/ubuntu; apt-get update -qq; " \
"add-apt-repository -y ppa:dotcloud/docker-golang/ubuntu; apt-get update -qq; " \
"DEBIAN_FRONTEND=noninteractive apt-get install -q -y lxc git golang-stable aufs-tools make; "
# Activate new kernel
pkg_cmd << "shutdown -r +1; "
@ -40,6 +43,7 @@ end
# Providers were added on Vagrant >= 1.1.0
Vagrant::VERSION >= "1.1.0" and Vagrant.configure("2") do |config|
config.vm.provider :aws do |aws, override|
aws.tags = { 'Name' => 'docker-ci' }
aws.access_key_id = ENV["AWS_ACCESS_KEY_ID"]
aws.secret_access_key = ENV["AWS_SECRET_ACCESS_KEY"]
aws.keypair_name = ENV["AWS_KEYPAIR_NAME"]

View file

@ -5,9 +5,11 @@ from buildbot.schedulers.basic import SingleBranchScheduler
from buildbot.changes import filter
from buildbot.config import BuilderConfig
from buildbot.process.factory import BuildFactory
from buildbot.process.properties import Interpolate
from buildbot.steps.shell import ShellCommand
from buildbot.status import html
from buildbot.status import html, words
from buildbot.status.web import authz, auth
from buildbot.status.mail import MailNotifier
PORT_WEB = 80 # Buildbot webserver port
PORT_GITHUB = 8011 # Buildbot github hook port
@ -15,20 +17,27 @@ PORT_MASTER = 9989 # Port where buildbot master listen buildworkers
TEST_USER = 'buildbot' # Credential to authenticate build triggers
TEST_PWD = 'docker' # Credential to authenticate build triggers
BUILDER_NAME = 'docker'
BUILDPASSWORD = 'pass-docker' # Credential to authenticate buildworkers
GITHUB_DOCKER = "github.com/dotcloud/docker"
DOCKER_PATH = "/data/docker"
BUILDER_PATH = "/data/buildbot/slave/{0}/build".format(BUILDER_NAME)
GITHUB_DOCKER = 'github.com/dotcloud/docker'
DOCKER_PATH = '/data/docker'
BUILDER_PATH = '/data/buildbot/slave/{0}/build'.format(BUILDER_NAME)
DOCKER_BUILD_PATH = BUILDER_PATH + '/src/github.com/dotcloud/docker'
# Credentials set by setup.sh and Vagrantfile
BUILDBOT_PWD = ''
IRC_PWD = ''
IRC_CHANNEL = ''
SMTP_USER = ''
SMTP_PWD = ''
EMAIL_RCP = ''
c = BuildmasterConfig = {}
c['title'] = "Docker"
c['titleURL'] = "waterfall"
c['buildbotURL'] = "http://0.0.0.0:{0}/".format(PORT_WEB)
c['buildbotURL'] = "http://docker-ci.dotcloud.com/"
c['db'] = {'db_url':"sqlite:///state.sqlite"}
c['slaves'] = [BuildSlave('buildworker', BUILDPASSWORD)]
c['slaves'] = [BuildSlave('buildworker', BUILDBOT_PWD)]
c['slavePortnum'] = PORT_MASTER
c['schedulers'] = [ForceScheduler(name='trigger',builderNames=[BUILDER_NAME])]
@ -36,20 +45,25 @@ c['schedulers'].append(SingleBranchScheduler(name="all",
change_filter=filter.ChangeFilter(branch='master'),treeStableTimer=None,
builderNames=[BUILDER_NAME]))
# Docker test command
test_cmd = ("cd /tmp; rm -rf {0}; export GOPATH={0}; go get -d {1}; cd {2}; "
"go test").format(BUILDER_PATH,GITHUB_DOCKER,DOCKER_BUILD_PATH)
# Builder
factory = BuildFactory()
factory.addStep(ShellCommand(description='Docker',logEnviron=False,
usePTY=True,command=test_cmd))
factory.addStep(ShellCommand(description='Docker',logEnviron=False,usePTY=True,
command=["sh", "-c", Interpolate("cd ..; rm -rf build; export GOPATH={0}; "
"go get -d {1}; cd {2}; git reset --hard %(src::revision:-unknown)s; "
"go test -v".format(BUILDER_PATH,GITHUB_DOCKER,DOCKER_BUILD_PATH))]))
c['builders'] = [BuilderConfig(name=BUILDER_NAME,slavenames=['buildworker'],
factory=factory)]
# Status
authz_cfg=authz.Authz(auth=auth.BasicAuth([(TEST_USER,TEST_PWD)]),
authz_cfg = authz.Authz(auth=auth.BasicAuth([(TEST_USER, TEST_PWD)]),
forceBuild='auth')
c['status'] = [html.WebStatus(http_port=PORT_WEB, authz=authz_cfg)]
c['status'].append(html.WebStatus(http_port=PORT_GITHUB,allowForce=True,
change_hook_dialects={ 'github' : True }))
c['status'].append(html.WebStatus(http_port=PORT_GITHUB, allowForce=True,
change_hook_dialects={ 'github': True }))
c['status'].append(MailNotifier(fromaddr='buildbot@docker.io',
sendToInterestedUsers=False, extraRecipients=[EMAIL_RCP],
mode='failing', relayhost='smtp.mailgun.org', smtpPort=587, useTls=True,
smtpUser=SMTP_USER, smtpPassword=SMTP_PWD))
c['status'].append(words.IRC("irc.freenode.net", "dockerqabot",
channels=[IRC_CHANNEL], password=IRC_PWD, allowForce=True,
notify_events={'exception':1, 'successToFailure':1, 'failureToSuccess':1}))

View file

@ -6,11 +6,16 @@
USER=$1
CFG_PATH=$2
BUILDBOT_PWD=$3
IRC_PWD=$4
IRC_CHANNEL=$5
SMTP_USER=$6
SMTP_PWD=$7
EMAIL_RCP=$8
BUILDBOT_PATH="/data/buildbot"
DOCKER_PATH="/data/docker"
SLAVE_NAME="buildworker"
SLAVE_SOCKET="localhost:9989"
BUILDBOT_PWD="pass-docker"
export PATH="/bin:sbin:/usr/bin:/usr/sbin:/usr/local/bin"
function run { su $USER -c "$1"; }
@ -23,7 +28,12 @@ run "mkdir -p $BUILDBOT_PATH"
cd $BUILDBOT_PATH
run "buildbot create-master master"
run "cp $CFG_PATH/master.cfg master"
run "sed -i -E 's#(DOCKER_PATH = ).+#\1\"$DOCKER_PATH\"#' master/master.cfg"
run "sed -i -E 's#(BUILDBOT_PWD = ).+#\1\"$BUILDBOT_PWD\"#' master/master.cfg"
run "sed -i -E 's#(IRC_PWD = ).+#\1\"$IRC_PWD\"#' master/master.cfg"
run "sed -i -E 's#(IRC_CHANNEL = ).+#\1\"$IRC_CHANNEL\"#' master/master.cfg"
run "sed -i -E 's#(SMTP_USER = ).+#\1\"$SMTP_USER\"#' master/master.cfg"
run "sed -i -E 's#(SMTP_PWD = ).+#\1\"$SMTP_PWD\"#' master/master.cfg"
run "sed -i -E 's#(EMAIL_RCP = ).+#\1\"$EMAIL_RCP\"#' master/master.cfg"
run "buildslave create-slave slave $SLAVE_SOCKET $SLAVE_NAME $BUILDBOT_PWD"
# Allow buildbot subprocesses (docker tests) to properly run in containers,

View file

@ -20,7 +20,8 @@ func CompareConfig(a, b *Config) bool {
if len(a.Cmd) != len(b.Cmd) ||
len(a.Dns) != len(b.Dns) ||
len(a.Env) != len(b.Env) ||
len(a.PortSpecs) != len(b.PortSpecs) {
len(a.PortSpecs) != len(b.PortSpecs) ||
len(a.Entrypoint) != len(b.Entrypoint) {
return false
}
@ -44,14 +45,15 @@ func CompareConfig(a, b *Config) bool {
return false
}
}
for i := 0; i < len(a.Entrypoint); i++ {
if a.Entrypoint[i] != b.Entrypoint[i] {
return false
}
}
return true
}
func MergeConfig(userConf, imageConf *Config) {
if userConf.Hostname == "" {
userConf.Hostname = imageConf.Hostname
}
if userConf.User == "" {
userConf.User = imageConf.User
}
@ -85,4 +87,10 @@ func MergeConfig(userConf, imageConf *Config) {
if userConf.Dns == nil || len(userConf.Dns) == 0 {
userConf.Dns = imageConf.Dns
}
if userConf.Entrypoint == nil || len(userConf.Entrypoint) == 0 {
userConf.Entrypoint = imageConf.Entrypoint
}
if userConf.Volumes == nil || len(userConf.Volumes) == 0 {
userConf.Volumes = imageConf.Volumes
}
}

View file

@ -170,10 +170,9 @@ func SelfPath() string {
return path
}
type NopWriter struct {
}
type NopWriter struct{}
func (w *NopWriter) Write(buf []byte) (int, error) {
func (*NopWriter) Write(buf []byte) (int, error) {
return len(buf), nil
}
@ -188,10 +187,10 @@ func NopWriteCloser(w io.Writer) io.WriteCloser {
}
type bufReader struct {
sync.Mutex
buf *bytes.Buffer
reader io.Reader
err error
l sync.Mutex
wait sync.Cond
}
@ -200,7 +199,7 @@ func NewBufReader(r io.Reader) *bufReader {
buf: &bytes.Buffer{},
reader: r,
}
reader.wait.L = &reader.l
reader.wait.L = &reader.Mutex
go reader.drain()
return reader
}
@ -209,14 +208,14 @@ func (r *bufReader) drain() {
buf := make([]byte, 1024)
for {
n, err := r.reader.Read(buf)
r.l.Lock()
r.Lock()
if err != nil {
r.err = err
} else {
r.buf.Write(buf[0:n])
}
r.wait.Signal()
r.l.Unlock()
r.Unlock()
if err != nil {
break
}
@ -224,8 +223,8 @@ func (r *bufReader) drain() {
}
func (r *bufReader) Read(p []byte) (n int, err error) {
r.l.Lock()
defer r.l.Unlock()
r.Lock()
defer r.Unlock()
for {
n, err = r.buf.Read(p)
if n > 0 {
@ -247,27 +246,27 @@ func (r *bufReader) Close() error {
}
type WriteBroadcaster struct {
mu sync.Mutex
sync.Mutex
writers map[io.WriteCloser]struct{}
}
func (w *WriteBroadcaster) AddWriter(writer io.WriteCloser) {
w.mu.Lock()
w.Lock()
w.writers[writer] = struct{}{}
w.mu.Unlock()
w.Unlock()
}
// FIXME: Is that function used?
// FIXME: This relies on the concrete writer type used having equality operator
func (w *WriteBroadcaster) RemoveWriter(writer io.WriteCloser) {
w.mu.Lock()
w.Lock()
delete(w.writers, writer)
w.mu.Unlock()
w.Unlock()
}
func (w *WriteBroadcaster) Write(p []byte) (n int, err error) {
w.mu.Lock()
defer w.mu.Unlock()
w.Lock()
defer w.Unlock()
for writer := range w.writers {
if n, err := writer.Write(p); err != nil || n != len(p) {
// On error, evict the writer
@ -278,8 +277,8 @@ func (w *WriteBroadcaster) Write(p []byte) (n int, err error) {
}
func (w *WriteBroadcaster) CloseWriters() error {
w.mu.Lock()
defer w.mu.Unlock()
w.Lock()
defer w.Unlock()
for writer := range w.writers {
writer.Close()
}
@ -687,3 +686,17 @@ func ParseHost(host string, port int, addr string) string {
}
return fmt.Sprintf("tcp://%s:%d", host, port)
}
// Get a repos name and returns the right reposName + tag
// The tag can be confusing because of a port in a repository name.
// Ex: localhost.localdomain:5000/samalba/hipache:latest
func ParseRepositoryTag(repos string) (string, string) {
n := strings.LastIndex(repos, ":")
if n < 0 {
return repos, ""
}
if tag := repos[n+1:]; !strings.Contains(tag, "/") {
return repos[:n], tag
}
return repos, ""
}