guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

02/02: website: Add post about Software Heritage.


From: Ludovic Courtčs
Subject: 02/02: website: Add post about Software Heritage.
Date: Fri, 29 Mar 2019 10:40:47 -0400 (EDT)

civodul pushed a commit to branch master
in repository guix-artwork.

commit 182d2051a8039d0e85ebc1942a187539720fd6d2
Author: Ludovic Courtès <address@hidden>
Date:   Fri Mar 29 15:30:39 2019 +0100

    website: Add post about Software Heritage.
    
    * website/posts/swh-guix.md: New file.
    * website/static/blog/img/software-heritage-logo-title.svg: New file.
---
 website/posts/swh-guix.md                          | 264 +++++++++
 .../blog/img/software-heritage-logo-title.svg      | 602 +++++++++++++++++++++
 2 files changed, 866 insertions(+)

diff --git a/website/posts/swh-guix.md b/website/posts/swh-guix.md
new file mode 100644
index 0000000..6db2c64
--- /dev/null
+++ b/website/posts/swh-guix.md
@@ -0,0 +1,264 @@
+title: Connecting reproducible deployment to a long-term source code archive
+author: Ludovic Courtès
+tags: Reproducible builds, Reproducibility, Research, Scheme API
+date: 2019-03-29 15:50:00
+---
+
+GNU Guix can be used as a “package manager” to install and upgrade
+software packages as is familiar to GNU/Linux users, or as an
+environment manager, but it can also provision containers or virtual
+machines, and manage the operating system running on your machine.
+
+One foundation that sets it apart from other tools in these areas is
+_reproducibility_.  From a high-level view, Guix allows users to
+_declare_ complete software environments and instantiate them.  They can
+share those environments with others, which can replicate them or adapt
+them to their needs.  This aspect is key to reproducible computational
+experiments: scientists need to reproduce software environments before
+they can reproduce experimental results, and this is one of the things
+we are focusing on in the context of the
+[Guix-HPC](https://guix-hpc.bordeaux.inria.fr) effort.  At a lower
+level, the project, along with others in the [Reproducible
+Builds](https://reproducible-builds.org) community, is working to ensure
+that software build outputs are [reproducible,
+bit-for-bit](https://reproducible-builds.org/docs/definition/).
+
+Work on reproducibility at all levels has been making great progress.
+Guix for instance allows you to [travel back in
+time](https://www.gnu.org/software/guix/blog/2018/multi-dimensional-transactions-and-rollbacks-oh-my/).
+That Guix can travel back in time _and_ build software reproducibly is a
+great step forward.  But there’s still an important piece that’s missing
+to make this viable: a stable source code archive.  This is where
+[Software Heritage](https://www.softwareheritage.org) (SWH for short)
+comes in.
+
+# When source code vanishes
+
+Guix contains thousands of package definitions.  Each [package
+definition](https://www.gnu.org/software/guix/manual/en/html_node/Defining-Packages.html)
+specifies the package’s source code URL and hash, the package’s
+dependencies, and its build procedure.  Most of the time, the package’s
+source code is an archive (a “tarball”) fetched from a web site, but
+more and more frequently the source code is a specific revision checked
+out directly from a version control system.
+
+The obvious question, then, is: what happens if the source code URL
+becomes unreachable?  The whole reproducibility endeavor collapses when
+source code disappears.  And source code _does_ disappear, or, even
+worse, it can be modified in place.  At GNU we’re doing a good job of
+having stable hosting that keeps releases around “forever”, unchanged
+(modulo rare exceptions).  But a lot of free software out there is
+hosted on personal web pages with a short lifetime and on commercial
+hosting services that come and go.
+
+By default Guix would look up source code by hash in the caches of our
+build farms.  This comes for free: the [“substitute”
+mechanism](https://www.gnu.org/software/guix/manual/en/html_node/Substitutes.html)
+extends to all “build artifacts”, including downloads.  However, with
+limited capacity, our build farms do not keep all the source code of all
+the packages for a long time.  Thus, one could very well find themself
+unable to rebuild a package months or years later, simply because its
+source code disappeared or moved to a different location.
+
+# Connecting to the archive
+
+It quickly became clear that reproducible builds had “reproducible
+source code downloads”, so to speak, as a prerequisite.  The Software
+Heritage archive is the missing piece that would finally allow us to
+reproduce software environments years later in spite of the volatility
+of code hosting sites.  Software Heritage’s mission is to archive
+essentially “all” the source code ever published, including version
+control history.  Its archive already periodically ingests release
+tarballs from the GNU servers, repositories from GitHub, packages from
+PyPI, and much more.
+
+![Software Heritage 
logo](https://www.gnu.org/software/guix/static/blog/img/software-heritage-logo-title.svg)
+
+We quickly settled on a scheme where Guix would fall back to the
+Software Heritage archive whenever it fails to download source code from
+its original location.  That way, package definitions don’t need to be
+modified: they still refer to the original source code URL, but the
+downloading machinery transparently goes to Software Heritage when
+needed.
+
+There are two types of source code downloads in Guix: tarball downloads,
+and version control checkouts.  In the former case, resorting to
+Software Heritage is easy: Guix knows the SHA256 hash of the tarball so
+it can look it up by hash using [the `/content` endpoint of the
+archive’s
+interface](https://archive.softwareheritage.org/api/1/content/raw/).
+
+Fetching version control checkouts is more involved.  In this case, the
+downloader would first resolve the commit identifier to obtain a
+[Software Heritage
+revision](https://archive.softwareheritage.org/api/1/revision/).  The
+actual code for that revision is then fetched through the
+[_vault_](https://docs.softwareheritage.org/devel/swh-vault/api.html).
+
+The vault conveniently allows users to fetch the tarball corresponding
+to a revision.  However, not all revisions are readily available as
+tarballs (understandably), so the vault has an interface that allows you
+to request the “_cooking_” of a specific revision.  Cooking is
+asynchronous and can take some time.  Currently, if a revision hasn’t
+been cooked yet, the Guix download machinery will request it and wait
+until it is available.  The process can take some time but will
+eventually succeed.
+
+Success!  At this point, we have essentially bridged the gap between the
+stable archive that Software Heritage provides and the reproducible
+software deployment pipeline of Guix.  This code [was
+integrated](https://issues.guix.info/issue/33432) in November 2018,
+making it the first free software distribution backed by a stable
+archive.
+
+# The challenges ahead
+
+This milestone was encouraging: we had seemingly achieved our goal, but
+we also knew of several shortcomings.  First, even though the software
+we package is still primarily distributed as tarballs, Software Heritage
+keeps relatively few of these tarballs.  Software Heritage does ingest
+tarballs, notably those found on [the GNU
+servers](https://ftp.gnu.org/gnu/), but the primary focus is on
+preserving complete version control repositories rather than release
+tarballs.
+
+It is not yet clear to us what to do with plain old tarballs.  On one
+hand, there are here and cannot be ignored.  Furthermore, some provide
+artifacts that are not in version control, such as `configure` scripts,
+and often enough they are accompanied by a cryptographic signature from
+the developers that allows recipients to _authenticate_ the code—an
+important piece of information that’s often missing from version control
+history.  On the other hand, version control tags are increasingly
+becoming the mechanism of choice to distribute software releases.  It
+may be that tags will become the primary mechanism for software release
+distribution soon enough.
+
+Version control tags turn out not to be ideal either, because they’re
+mutable and per-repository.  Conversely, Git commit identifiers are
+unambiguous and repository-independent because they’re essentially
+content-addressed, but our package definitions often refer to tags, not
+commits, because that makes it clearer that we’re providing an actual
+release and not an arbitrary revision (this is another illustration of
+[Zooko’s triangle](https://en.wikipedia.org/wiki/Zooko's_triangle)).
+
+This leads me to another limitation that stems from the mismatch between
+the way Guix and Software Heritage compute hashes over version control
+checkouts: both compute a hash over a serialized representation of the
+directory, but they serialize the directory in a different way (SWH
+serializes directories as Git trees, while Guix uses “normalized
+archives” or Nars, the format the build daemon manipulates, which is
+inherited from Nix.)  That prevents Guix from looking up revisions by
+content hash.  The solution will probably involve changing Guix to
+support the same method as Software Heritage, and/or adding Guix’ method
+to Software Heritage.
+
+Having to wait for “cooking” completion can also be problematic.  The
+Software Heritage team is investigating the possibility to
+[automatically cook all version control
+tags](https://forge.softwareheritage.org/T1350).  That way, relevant
+revisions would almost always be readily available through the vault.
+
+Similarly, we have no guarantee that software provided by Guix is
+available in the archive.  Our plan is to [extend Software
+Heritage](https://forge.softwareheritage.org/T1352) such that it would
+periodically archive the source code of software packaged by Guix.
+
+# Going further
+
+In the process of adding support for Software Heritage, Guix [gained
+Guile bindings to the Software Heritage HTTP
+interface](https://issues.guix.info/issue/33432).  Here’s a couple of
+things we can do:
+
+```scheme
+(use-modules (guix swh))
+
+;; Check whether SWH has ever crawled our repository.
+(define o (lookup-origin "https://git.savannah.gnu.org/git/guix.git";))
+⇒ #<<origin> id: 86312956 …>
+
+;; It did! When was its last visit?
+(define last-visit
+  (first (origin-visits o)))
+
+(date->string (visit-date last-visit))
+⇒ "Fri Mar 29 10:07:45Z 2019"
+
+;; Does it have our “v0.15.0” Git tag?
+(lookup-origin-revision "https://git.savannah.gnu.org/git/guix.git"; "v0.15.0")
+⇒ #<<revision> id: "359fdda40f754bbf1b5dc261e7427b75463b59be" …>
+```
+
+Guix itself is a Guile library so when we combine the two, there are
+interesting things we can do:
+
+```scheme
+(use-modules (guix) (guix swh)
+                        (gnu packages base)
+                        (gnu packages golang))
+
+;; This is our GNU Coreutils package.
+coreutils
+⇒ #<package address@hidden gnu/packages/base.scm:342 1c67b40>
+
+;; Does SWH have its tarball?
+(lookup-content (origin-sha256 (package-source coreutils))
+                               "sha256")
+⇒ #<<content> checksums: (("sha1" …)) data-url: …>
+
+;; Our package for HashiCorp’s Configuration Language (HCL) is
+;; built from a Git commit.
+(define commit
+  (git-reference-commit
+       (origin-uri (package-source go-github-com-hashicorp-hcl))))
+
+;; Is this particular commit available in the archive?
+(lookup-revision commit)
+⇒ #<<revision> id: "23c074d0eceb2b8a5bfdbb271ab780cde70f05a8" …>
+```
+
+We’re currently using a subset of this interface, but there’s certainly
+more we could do.  For example, we can compute archive coverage of the
+Guix packages; we can also request the archival of each package’s source
+code _via_ the [“save code”
+interface](https://archive.softwareheritage.org/api/1/origin/save/)—though
+all this is subject to [rate
+limiting](https://archive.softwareheritage.org/api/#rate-limiting).
+
+# Wrap-up
+
+Software Heritage support in Guix creates a bridge from the stable
+source code archive to reproducible software deployment with complete
+provenance tracking.  For the first time it gives us a software package
+distribution that can be rebuilt months or years later.  This is
+particularly beneficial in the context of reproducible science: finally
+we can describe reproducible software environments, a prerequisite for
+reproducible computational experiments.
+
+Going further, we can provide a complete software supply tool chain with
+provenance tracking that links revisions in the archive to
+bit-reproducible build artifacts produced by Guix.  Oh and Guix itself
+[is
+archived](https://archive.softwareheritage.org/api/1/origin/git/url/https://git.savannah.gnu.org/git/guix.git/),
+so we have this meta-level where we could link Guix revisions to the
+revisions of packages it provides…  There are still technical challenges
+to overcome, but that vision is shaping up.
+
+#### About GNU Guix
+
+[GNU Guix](https://www.gnu.org/software/guix) is a transactional package
+manager and an advanced distribution of the GNU system that [respects
+user
+freedom](https://www.gnu.org/distros/free-system-distribution-guidelines.html).
+Guix can be used on top of any system running the kernel Linux, or it
+can be used as a standalone operating system distribution for i686,
+x86_64, ARMv7, and AArch64 machines.
+
+In addition to standard package management features, Guix supports
+transactional upgrades and roll-backs, unprivileged package management,
+per-user profiles, and garbage collection.  When used as a standalone
+GNU/Linux distribution, Guix offers a declarative, stateless approach to
+operating system configuration management.  Guix is highly customizable
+and hackable through [Guile](https://www.gnu.org/software/guile)
+programming interfaces and extensions to the
+[Scheme](http://schemers.org) language.
diff --git a/website/static/blog/img/software-heritage-logo-title.svg 
b/website/static/blog/img/software-heritage-logo-title.svg
new file mode 100644
index 0000000..bebc6b4
--- /dev/null
+++ b/website/static/blog/img/software-heritage-logo-title.svg
@@ -0,0 +1,602 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   xml:space="preserve"
+   width="377.82294"
+   height="82.554665"
+   viewBox="0 0 354.20901 77.394997"
+   sodipodi:docname="software-heritage-logo-title.svg"
+   
inkscape:export-filename="/home/zack/swh/annex/public/logo/software-heritage-logo-title.512px.png"
+   inkscape:export-xdpi="130.24098"
+   inkscape:export-ydpi="130.24098"><metadata
+     id="metadata8"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; /><dc:title 
/></cc:Work></rdf:RDF></metadata><defs
+     id="defs6"><clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath16"><path
+         d="m 30.027,68.987 1.337,-1.343 4.826,1.607 -1.61,-4.823 1.34,-1.34 
2.95,8.844 z m -3.387,-1.073 5.746,-10.675 1.252,1.252 -5.747,10.674 z m 
-2.552,-10.762 1.608,4.823 -1.34,1.34 -2.949,-8.846 8.842,2.949 -1.338,1.343 z 
m 19.376,8.722 2.274,-5.144 h 1.894 l -4.167,8.935 -4.17,-8.038 1.895,-0.154 z 
m -5.797,-7.103 12,-3.485 v 1.77 l -12,3.484 z m 5.797,-9.502 -2.273,4.461 h 
-1.895 l 4.169,-8.252 4.167,8.379 -1.896,-0.018 z m 13.276,20.108 -8.843,2.95 
2.945,-8.844 1.342,1.338 -1.6 [...]
+         id="path18"
+         inkscape:connector-curvature="0" /></clipPath><linearGradient
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.32883,76.436119)"
+       spreadMethod="pad"
+       id="linearGradient24"><stop
+         style="stop-opacity:1;stop-color:#ec1c28"
+         offset="0"
+         id="stop26" /><stop
+         style="stop-opacity:1;stop-color:#ec1c28"
+         offset="0.331971"
+         id="stop28" /><stop
+         style="stop-opacity:1;stop-color:#fbc81f"
+         offset="1"
+         id="stop30" /></linearGradient><clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath38"><path
+         d="M 0,141.73 H 311 V 0 H 0 Z"
+         id="path40"
+         inkscape:connector-curvature="0" /></clipPath><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient945"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       spreadMethod="pad"
+       id="linearGradient24-3"><stop
+         style="stop-opacity:1;stop-color:#ec1c28"
+         offset="0"
+         id="stop26-6" /><stop
+         style="stop-opacity:1;stop-color:#ec1c28"
+         offset="0.331971"
+         id="stop28-7" /><stop
+         style="stop-opacity:1;stop-color:#fbc81f"
+         offset="1"
+         id="stop30-5" /></linearGradient><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient943"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.308309,0,0,-61.305366,12.56513,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5655"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5657"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5659"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5661"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5663"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5665"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5667"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5669"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5671"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5673"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5675"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5677"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5679"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5681"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5683"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5685"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5687"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5691"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5693"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5695"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /><linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient24-3"
+       id="linearGradient5697"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(61.305366,0,0,-61.305366,13.87633,76.436119)"
+       x1="0"
+       y1="0"
+       x2="1"
+       y2="0"
+       spreadMethod="pad" /></defs><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1866"
+     inkscape:window-height="1016"
+     id="namedview4"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:zoom="3.1953577"
+     inkscape:cx="147.91687"
+     inkscape:cy="31.733747"
+     inkscape:window-x="2500"
+     inkscape:window-y="312"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="g10" /><g
+     id="g10"
+     inkscape:groupmode="layer"
+     inkscape:label="SWH-logo"
+     transform="matrix(1.25,0,0,-1.25,-16.66125,134.2425)"><g
+       id="g5768"
+       inkscape:export-xdpi="520.48999"
+       inkscape:export-ydpi="520.48999"><g
+         id="g34"><g
+           clip-path="url(#clipPath38)"
+           id="g36"><g
+             transform="translate(94.5123,88.1873)"
+             id="g42"><path
+               inkscape:connector-curvature="0"
+               id="path44"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="m 0,0 -0.378,-2.235 -0.407,-0.116 c -1.131,0.87 -2.438,1.335 
-3.657,1.335 -2.265,0 -3.513,-1.567 -3.513,-3.019 0,-3.716 8.506,-3.339 
8.506,-8.709 0,-2.904 -2.497,-5.342 -6.242,-5.342 -1.596,0 -3.454,0.436 
-4.992,1.307 l 0.29,2.38 0.319,0.145 c 1.423,-1.394 3.222,-1.911 4.615,-1.945 
2.725,-0.067 4.521,1.406 3.716,3.135 -1.653,3.553 -8.476,3.368 -8.476,8.768 
0,2.874 2.467,5.167 6.067,5.167 C -3.048,0.871 -1.568,0.639 0,0" /></g><g
+             transform="translate(99.4159,77.3007)"
+             id="g46"><path
+               inkscape:connector-curvature="0"
+               id="path48"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="m 0,0 c 0,-3.745 1.307,-5.574 3.687,-5.574 2.438,0 
3.745,1.626 3.745,4.877 0,3.687 -1.307,5.603 -3.688,5.603 C 1.307,4.906 0,3.194 
0,0 m 9.58,-0.174 c 0,-4.471 -2.178,-7.054 -6.039,-7.054 -3.628,0 -5.718,2.438 
-5.718,6.706 0,4.47 2.205,7.054 6.067,7.054 3.599,0 5.69,-2.439 5.69,-6.706" 
/></g><g
+             transform="translate(115.1763,76.1395)"
+             id="g50"><path
+               inkscape:connector-curvature="0"
+               id="path52"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="m 0,0 0.145,-5.835 h -2.293 l 0.174,5.661 -0.058,6.067 h 
-2.003 l -0.116,0.175 0.145,1.364 h 1.974 l -0.029,1.916 c -0.029,3.135 
1.655,4.848 4.586,4.848 0.726,0 1.511,-0.087 2.294,-0.262 L 4.645,12.135 
4.471,11.99 c -0.813,0.406 -1.452,0.522 -2.149,0.522 -1.393,0 -2.177,-0.958 
-2.206,-2.845 L 0.088,7.432 H 7.287 L 7.374,7.258 7.229,5.893 h -7.17 z" 
/></g><g
+             transform="translate(127.8893,72.6559)"
+             id="g54"><path
+               inkscape:connector-curvature="0"
+               id="path56"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="M 0,0 0.262,-0.174 0.029,-1.683 C -1.045,-2.177 
-1.887,-2.439 -2.874,-2.525 -5.08,-2.09 -5.98,-0.987 -5.98,1.307 l 0.087,2.061 
-0.029,6.009 h -1.829 l -0.116,0.174 0.145,1.364 h 1.771 v 2.149 l 2.003,0.87 
0.232,-0.202 -0.058,-2.817 H 0.174 L 0.291,10.742 0.145,9.377 H -3.774 L 
-3.919,1.51 c -0.029,-1.568 0.552,-2.091 1.829,-2.091 0.61,0 1.248,0.146 
2.09,0.581" /></g><g
+             transform="translate(134.3326,72.8013)"
+             id="g58"><path
+               inkscape:connector-curvature="0"
+               id="path60"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="m 0,0 h 0.145 l 2.816,9.057 0.464,1.742 H 5.69 L 6.009,9.174 
8.448,0 h 0.145 l 2.844,9.057 0.407,1.742 h 2.032 L 9.493,-2.497 H 7.286 L 
4.529,7.809 H 4.326 L 1.103,-2.497 h -2.264 l -3.716,13.238 2.118,0.145 
0.32,-1.712 z" /></g><g
+             transform="translate(152.6459,75.4428)"
+             id="g62"><path
+               inkscape:connector-curvature="0"
+               id="path64"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="m 0,0 c -0.726,-0.203 -1.103,-0.551 -1.103,-1.393 0,-1.278 
0.784,-2.032 1.974,-2.032 1.132,0 2.207,0.754 3.252,2.061 l 0.087,2.38 z m 
6.387,4.906 c 0,-1.015 -0.349,-6.154 -0.349,-7.17 0,-0.842 0.233,-1.132 
0.9,-1.132 0.232,0 0.523,0.028 0.987,0.174 L 8.158,-3.425 7.925,-4.732 C 
7.432,-5.022 6.851,-5.254 6.271,-5.312 5.08,-5.196 4.326,-4.441 4.268,-3.164 H 
4.064 C 3.078,-4.18 2.061,-4.935 0.958,-5.342 c -2.613,0 -4.122,1.394 
-4.122,3.629 0,1.772 0.987,2.7 2.7,3.106 l 4.7 [...]
+             transform="translate(171.1063,83.5713)"
+             id="g66"><path
+               inkscape:connector-curvature="0"
+               id="path68"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="m 0,0 v -2.235 l -0.262,-0.087 c -0.405,0.116 -0.811,0.145 
-1.044,0.145 -1.249,0 -2.322,-0.929 -3.368,-3.222 l -0.028,-2.033 0.145,-5.835 
h -2.294 l 0.175,5.632 -0.146,7.519 2.206,0.203 -0.029,-2.729 h 0.175 c 
1.189,2.091 2.583,2.701 3.716,2.701 0.26,0 0.551,-0.03 0.754,-0.059" /></g><g
+             transform="translate(174.9374,78.6073)"
+             id="g70"><path
+               inkscape:connector-curvature="0"
+               id="path72"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="M 0,0 6.386,0.174 6.444,0.523 C 6.444,2.613 5.312,3.57 
3.716,3.57 1.741,3.57 0.406,2.293 0,0 m -0.145,-1.626 c 0,-3.135 1.306,-5.051 
3.976,-5.051 1.249,0 2.672,0.465 3.891,1.306 L 7.983,-5.516 7.751,-7.461 C 
6.503,-8.099 5.08,-8.535 3.716,-8.535 c -3.804,0 -6.038,2.613 -6.038,6.793 
0,4.297 2.437,6.938 6.241,6.938 2.903,0 4.586,-1.858 4.586,-4.993 0,-0.319 
-0.029,-0.987 -0.057,-1.335 L 7.954,-1.51 -0.145,-1.539 Z" /></g><g
+             transform="translate(208.5502,73.5561)"
+             id="g74"><path
+               inkscape:connector-curvature="0"
+               id="path76"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="m 0,0 c 0,-1.568 0.261,-1.974 1.276,-1.974 0.582,0 
1.307,0.087 1.307,0.087 L 2.642,-2.003 2.38,-3.339 c 0,0 -2.293,0.088 
-3.57,0.088 -1.017,0 -3.34,-0.058 -3.34,-0.058 l 0.262,1.306 c 1.829,0.029 
2.206,0.551 2.206,3.106 v 4.383 c 0,0 -3.077,0.03 -4.412,0.03 -0.929,0 
-4.819,-0.319 -4.819,-0.319 L -11.409,0 c 0,-1.568 0.261,-1.974 1.277,-1.974 
0.581,0 1.307,0.087 1.307,0.087 l 0.057,-0.116 -0.261,-1.336 c 0,0.03 
-1.451,0.088 -2.468,0.088 -1.683,0 -4.354,-0.204 -4.412,-0.3 [...]
+             transform="translate(221.7249,79.1299)"
+             id="g78"><path
+               inkscape:connector-curvature="0"
+               id="path80"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="m 0,0 c 0.581,0.058 0.726,0.203 0.726,0.784 0,1.538 
-0.871,2.38 -2.409,2.38 -1.801,0 -3.223,-1.306 -3.572,-3.425 z M -5.371,-1.335 
V -1.8 c 0,-3.251 1.713,-5.399 4.297,-5.399 1.8,0 3.571,0.9 3.571,0.9 L 
2.671,-6.358 2.99,-7.199 c 0,0 -2.7,-1.975 -4.441,-1.975 -3.658,0 -6.097,2.584 
-6.097,6.416 0,3.977 2.961,7.403 6.416,7.403 2.845,0 4.326,-1.452 4.326,-4.209 
0,-0.726 -0.175,-1.423 -0.175,-1.423 L 2.642,-1.335 Z" /></g><g
+             transform="translate(229.5901,73.7595)"
+             id="g82"><path
+               inkscape:connector-curvature="0"
+               id="path84"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="m 0,0 v 6.387 c 0,1.277 -0.319,1.77 -1.104,1.77 -0.319,0 
-0.609,-0.087 -0.609,-0.087 l -0.145,0.203 0.087,0.901 C 0,9.493 2.148,10.044 
2.148,10.044 L 2.351,9.87 c 0,0 -0.29,-1.625 -0.261,-2.99 L 2.206,6.793 c 
1.191,1.829 2.932,3.106 4.093,3.106 0.639,0 0.9,-0.116 0.9,-0.116 L 7.286,9.667 
c 0,0 -0.406,-2.381 -0.464,-4.152 L 5.69,5.428 c 0,1.597 -0.145,1.974 
-0.785,1.974 -0.841,0 -1.886,-0.754 -2.699,-1.974 0,0 -0.232,-5.283 
-0.232,-5.922 0,-1.306 0.29,-1.683 1.393,-1.683 [...]
+             transform="translate(240.2704,89.2612)"
+             id="g86"><path
+               inkscape:connector-curvature="0"
+               id="path88"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="M 0,0 C 0,0.958 0.755,1.713 1.713,1.713 2.525,1.713 
3.135,1.104 3.135,0.232 3.135,-0.726 2.381,-1.48 1.423,-1.48 0.581,-1.48 
0,-0.87 0,0 m -1.045,-18.115 c 1.161,0.32 1.626,0.872 1.626,1.887 v 7.374 c 
0,1.074 -0.349,1.568 -1.075,1.568 -0.319,0 -0.726,-0.116 -0.726,-0.116 l 
0.117,1.074 c 1.945,0.29 4.181,0.842 4.181,0.842 l 0.144,-0.349 c -0.348,-0.813 
-0.667,-5.719 -0.667,-10.277 0,-1.131 0.29,-1.625 1.015,-1.625 0.349,0 
1.016,0.058 1.016,0.058 l 0.059,-0.116 -0.232,-1. [...]
+             transform="translate(248.6878,80.6106)"
+             id="g90"><path
+               inkscape:connector-curvature="0"
+               id="path92"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="m 0,0 c 0,1.045 -0.377,1.393 -1.654,1.451 l -0.116,0.175 
0.144,0.87 c 1.888,0.929 3.601,2.642 3.601,2.642 l 0.58,-0.232 c 0,0 
-0.116,-0.755 -0.233,-2.178 L 6.591,2.816 6.677,2.728 6.416,1.19 2.207,1.277 C 
2.09,-0.552 2.003,-2.99 2.003,-5.981 c 0,-1.974 0.61,-2.699 2.265,-2.699 
0.958,0 1.974,0.522 1.974,0.522 l 0.29,-0.755 c 0,0 -2.235,-1.741 -2.931,-1.741 
C 0.958,-10.654 0,-9.697 0,-7.142 Z" /></g><g
+             transform="translate(264.333,76.401)"
+             id="g94"><path
+               inkscape:connector-curvature="0"
+               id="path96"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="m 0,0 -3.92,-1.19 c -0.551,-0.174 -0.841,-0.61 -0.841,-1.219 
0,-1.104 0.841,-1.946 2.002,-1.946 0.726,0 1.83,0.581 2.643,1.394 z m 
0.116,2.38 c 0,1.946 -0.929,3.078 -2.555,3.078 -1.887,0 -3.483,-1.452 
-3.483,-1.452 l -0.146,0.087 -0.348,1.249 c 0,0 3.484,2.032 4.732,2.032 2.526,0 
4.035,-1.394 4.035,-3.745 0,-1.045 -0.522,-4.964 -0.522,-6.677 0,-0.842 
0.435,-1.335 1.19,-1.335 0.929,0 1.742,0.725 1.742,0.725 l 0.406,-0.464 c 0,0 
-1.073,-1.829 -2.525,-2.323 -1.568,0 -2.439 [...]
+             transform="translate(281.5161,67.5759)"
+             id="g98"><path
+               inkscape:connector-curvature="0"
+               id="path100"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="m 0,0 c 0,1.132 -1.017,1.539 -5.662,2.148 0,0 -1.799,-1.335 
-1.799,-2.642 0,-1.48 1.19,-2.38 3.193,-2.38 C -2.003,-2.874 0,-1.51 0,0 m 
-1.336,10.945 c 0,2.235 -1.364,3.773 -3.338,3.773 -1.771,0 -2.874,-1.248 
-2.874,-3.193 0,-2.235 1.335,-3.745 3.338,-3.745 1.771,0 2.874,1.191 
2.874,3.165 M -6.591,6.735 C -7.374,6.3 -7.809,5.835 -7.809,5.458 c 0,-0.9 
1.103,-1.336 3.483,-1.423 4.5,-0.232 6.184,-1.074 6.184,-3.106 0,-2.671 
-3.513,-5.225 -7.2,-5.225 -2.757,0 -4.383,1.422 -4 [...]
+             transform="translate(293.5022,79.1299)"
+             id="g102"><path
+               inkscape:connector-curvature="0"
+               id="path104"
+               
style="fill:#52566d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+               d="m 0,0 c 0.581,0.058 0.726,0.203 0.726,0.784 0,1.538 
-0.871,2.38 -2.409,2.38 -1.801,0 -3.223,-1.306 -3.572,-3.425 z M -5.371,-1.335 
V -1.8 c 0,-3.251 1.713,-5.399 4.297,-5.399 1.8,0 3.571,0.9 3.571,0.9 L 
2.671,-6.358 2.99,-7.199 c 0,0 -2.7,-1.975 -4.441,-1.975 -3.658,0 -6.097,2.584 
-6.097,6.416 0,3.977 2.961,7.403 6.416,7.403 2.845,0 4.326,-1.452 4.326,-4.209 
0,-0.726 -0.175,-1.423 -0.175,-1.423 L 2.642,-1.335 Z" /></g></g></g><g
+         inkscape:export-ydpi="1255.96"
+         inkscape:export-xdpi="1255.96"
+         inkscape:export-filename="software-heritage-logo.1024px.png"
+         id="g946"
+         style="display:inline"
+         
transform="matrix(0.99846318,0,0,0.99846318,0.84843673,0.09374526)"><path
+           style="fill:url(#linearGradient5655);stroke:none"
+           d="m 30.5745,68.987 1.337,-1.343 4.826,1.607 -1.61,-4.823 
1.34,-1.34 2.95,8.844 z"
+           id="path941"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5657);stroke:none"
+           d="m 27.1875,67.914 5.746,-10.675 1.252,1.252 -5.747,10.674 z"
+           id="path939"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5659);stroke:none"
+           d="m 24.6355,57.152 1.608,4.823 -1.34,1.34 -2.949,-8.846 
8.842,2.949 -1.338,1.343 z"
+           id="path937"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5661);stroke:none"
+           d="m 44.0115,65.874 2.274,-5.144 h 1.894 l -4.167,8.935 
-4.17,-8.038 1.895,-0.154 z"
+           id="path935"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5663);stroke:none"
+           d="m 38.2145,58.771 12,-3.485 v 1.77 l -12,3.484 z"
+           id="path933"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5665);stroke:none"
+           d="m 44.0115,49.269 -2.273,4.461 h -1.895 l 4.169,-8.252 
4.167,8.379 -1.896,-0.018 z"
+           id="path931"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5667);stroke:none"
+           d="m 57.2875,69.377 -8.843,2.95 2.945,-8.844 1.342,1.338 
-1.607,4.825 4.823,-1.609 z"
+           id="path929"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5669);stroke:none"
+           d="m 61.8845,67.095 -10.674,-5.748 1.251,-1.25 10.675,5.746 z"
+           id="path927"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5671);stroke:none"
+           d="m 61.6155,62.367 1.609,-4.822 -4.822,1.607 -1.34,-1.34 
8.843,-2.948 -2.948,8.842 z"
+           id="path925"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5673);stroke:none"
+           d="m 58.2145,81.089 -8.219,-4.168 8.396,-4.17 0.033,1.896 
-4.653,2.274 4.443,2.273 z"
+           id="path923"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5675);stroke:none"
+           d="m 61.6055,70.73 3.486,12 h -1.771 l -3.484,-12 z"
+           id="path921"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5677);stroke:none"
+           d="m 67.2145,72.752 7.967,4.169 -8.522,4.168 -0.095,-1.896 
4.873,-2.272 -4.223,-2.274 z"
+           id="path919"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5679);stroke:none"
+           d="m 56.8935,84.299 -1.339,1.342 -4.824,-1.608 1.608,4.823 
-1.34,1.341 -2.948,-8.844 z"
+           id="path917"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5681);stroke:none"
+           d="m 60.2805,85.371 -5.746,10.675 -1.253,-1.253 5.748,-10.673 z"
+           id="path915"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5683);stroke:none"
+           d="m 62.8315,96.134 -1.608,-4.823 1.341,-1.339 2.947,8.843 
-8.842,-2.949 1.339,-1.341 z"
+           id="path913"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5685);stroke:none"
+           d="m 45.7295,91.364 -2.274,-4.365 -2.274,4.731 h -1.894 l 
4.168,-8.521 4.17,8.245 z"
+           id="path911"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5687);stroke:none"
+           d="m 50.2145,94.515 -12,3.485 v -1.77 l 12,-3.485 z"
+           id="path909"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5689);stroke:none"
+           d="m 43.4555,103.603 2.274,-4.873 h 1.895 l -4.169,8.664 
-4.169,-8.175 1.896,-0.083 z"
+           id="path907"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5691);stroke:none"
+           d="m 36.0765,89.803 -1.341,-1.34 1.608,-4.823 -4.823,1.608 
-1.34,-1.34 8.844,-2.949 z"
+           id="path905"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5693);stroke:none"
+           d="m 25.5825,86.192 10.674,5.746 -1.251,1.251 -10.675,-5.746 z"
+           id="path903"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5695);stroke:none"
+           d="m 25.8505,90.918 -1.608,4.823 4.824,-1.608 1.339,1.341 
-8.844,2.948 2.949,-8.844 z"
+           id="path901"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient5697);stroke:none"
+           d="m 29.2145,72.196 8.338,4.169 -8.338,4.169 v -1.896 l 
4.547,-2.273 -4.547,-2.274 z"
+           id="path899"
+           inkscape:connector-curvature="0" /><path
+           style="fill:url(#linearGradient945);stroke:none"
+           d="m 24.1455,70.73 3.485,11 h -1.769 l -3.485,-11 z"
+           id="path897"
+           inkscape:connector-curvature="0" /><path
+           
style="fill:url(#linearGradient943);stroke:none;stroke-width:1.00002396"
+           d="m 12.5653,76.365 8.3384,4.169 V 78.638 L 16.356482,76.365 
20.9037,74.091 v -1.895 z"
+           id="path32-3"
+           inkscape:connector-curvature="0" /><text
+           xml:space="preserve"
+           
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.99999905px;line-height:18.75px;font-family:'Alegreya
 SC';-inkscape-font-specification:'Alegreya 
SC';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.75px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="21.706713"
+           y="-49.201427"
+           id="text24"
+           transform="scale(1,-1)"><tspan
+             sodipodi:role="line"
+             id="tspan22"
+             x="21.706713"
+             y="-36.189709"
+             
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Alegreya
 SC';-inkscape-font-specification:'Alegreya SC';stroke-width:0.75px" /></text>
+<text
+           xml:space="preserve"
+           
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.99999905px;line-height:18.75px;font-family:'Alegreya
 SC';-inkscape-font-specification:'Alegreya 
SC';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0.54901961;stroke:none;stroke-width:0.75px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="17.983284"
+           y="-46.719143"
+           id="text28"
+           transform="scale(1,-1)"><tspan
+             sodipodi:role="line"
+             id="tspan26"
+             x="17.983284"
+             y="-33.707424"
+             
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:'Alegreya
 SC';-inkscape-font-specification:'Alegreya 
SC';fill:#000000;fill-opacity:0.54901961;stroke-width:0.75px" /></text>
+<text
+           xml:space="preserve"
+           
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:18.75px;font-family:'Alegreya
 SC';-inkscape-font-specification:'Alegreya 
SC';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0.54901961;stroke:none;stroke-width:0.75px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="16.121571"
+           y="-47.960289"
+           id="text4526"
+           transform="scale(1,-1)"><tspan
+             sodipodi:role="line"
+             id="tspan4524"
+             x="16.121571"
+             y="-34.429039"
+             
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:'Alegreya
 SC';-inkscape-font-specification:'Alegreya 
SC';fill:#000000;fill-opacity:0.54901961;stroke-width:0.75px" /></text>
+<text
+           xml:space="preserve"
+           
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:18.75px;font-family:'Alegreya
 SC';-inkscape-font-specification:'Alegreya 
SC';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0.54901961;stroke:none;stroke-width:0.75px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="16.431856"
+           y="-48.270573"
+           id="text4530"
+           transform="scale(1,-1)"><tspan
+             sodipodi:role="line"
+             id="tspan4528"
+             x="16.431856"
+             y="-34.739323"
+             
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:'Alegreya
 SC';-inkscape-font-specification:'Alegreya 
SC';fill:#000000;fill-opacity:0.54901961;stroke-width:0.75px" /></text>
+<text
+           xml:space="preserve"
+           
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.99999905px;line-height:18.75px;font-family:'Alegreya
 SC';-inkscape-font-specification:'Alegreya 
SC';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.75px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="14.570143"
+           y="-46.719143"
+           id="text4557"
+           transform="scale(1,-1)"><tspan
+             sodipodi:role="line"
+             id="tspan4555"
+             x="14.570143"
+             y="-33.707424"
+             
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16px;font-family:'Alegreya
 SC';-inkscape-font-specification:'Alegreya SC 
Bold';fill:#000000;fill-opacity:0.54901961;stroke-width:0.75px" /></text>
+</g></g></g></svg>
\ No newline at end of file



reply via email to

[Prev in Thread] Current Thread [Next in Thread]