summaryrefslogtreecommitdiffstats
path: root/content/posts/home-server-part-5
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2026-01-01 17:36:39 +0200
committerJan Tuomi <jan@jantuomi.fi>2026-01-02 16:21:05 +0200
commitc1856d1f3edbc4b32be5860233dede88db16a7bb (patch)
treeb3a5e2f600c0079bd04d7ab2bb459b4664ba66a1 /content/posts/home-server-part-5
parent6d7e34af89ef1038d213ff8ea325bb84d4a00d4a (diff)
Start migrating content
Diffstat (limited to 'content/posts/home-server-part-5')
-rw-r--r--content/posts/home-server-part-5/ansible_task_postgres.pngbin0 -> 108065 bytes
-rw-r--r--content/posts/home-server-part-5/index.md102
-rw-r--r--content/posts/home-server-part-5/pursotin_jls.pngbin0 -> 182563 bytes
-rw-r--r--content/posts/home-server-part-5/pursotin_stack.svg1
4 files changed, 103 insertions, 0 deletions
diff --git a/content/posts/home-server-part-5/ansible_task_postgres.png b/content/posts/home-server-part-5/ansible_task_postgres.png
new file mode 100644
index 0000000..47f8584
--- /dev/null
+++ b/content/posts/home-server-part-5/ansible_task_postgres.png
Binary files differ
diff --git a/content/posts/home-server-part-5/index.md b/content/posts/home-server-part-5/index.md
new file mode 100644
index 0000000..16d60f0
--- /dev/null
+++ b/content/posts/home-server-part-5/index.md
@@ -0,0 +1,102 @@
+---
+title: "A home server journey, part 5: Ansible"
+date: 2025-12-26
+description: |
+ This is the fifth episode in a series where I set up a FreeBSD home server, explaining all the steps, problems and solutions along the way. This time we're provisioning the server with Ansible.
+extra:
+ kind: note
+---
+
+This is the fifth episode in a series where I set up a FreeBSD home server, explaining all the steps, problems and solutions along the way. This time we're provisioning the server with Ansible.
+
+Check out episodes [1](../archive/home-server-part-1), [2](../archive/home-server-part-2), [3](../archive/home-server-part-3), [4](../archive/home-server-part-4).
+
+{{ toc() }}
+
+## Automation
+
+[Ansible](https://docs.ansible.com/projects/ansible/latest/index.html) is a tool for running a bunch of Python scripts, or "tasks", in a kind of declarative way. It's commonly used for provisioning servers.
+
+My ansible configuration is publicly available on my GitHub. I update it regularly.
+🌐 [jantuomi/ansible-freebsd-home-server](https://github.com/jantuomi/ansible-freebsd-home-server)
+
+I have only one server, and I'm planning to have it for a long time. Why would I need automated provisioning? It seems like an extra step when I could just provision everything manually. There is no need to synchronise multiple hosts or anything like that.
+
+I view this kind of automation as executable documentation, or readable instructions for both the computer and the human. If I define the server in terms of these Ansible tasks, I can (in theory) reconstruct what's been done with the server just by reading the Ansible playbook.
+
+To be reliable, this necessitates that everything is defined in Ansible. Which happens to be very difficult to actually do.
+
+## Project structure
+
+There are many ways to structure an Ansible project. I picked one that I consider to be simple:
+
+- a single main playbook, with tags for selective execution of sub-playbooks
+- a non-tracked `secrets.yml` that contains all secret values
+ - reasoning: this way I don't need to parse a separate configuration format and I get access to all features of YAML, including its data structures (lists, objects), which I would be lacking if I used a flat file format such as `.env`.
+- a flat file hierarchy with names mirroring the target path, e.g. `templates/root_ssh_config.j2` goes to `/root/ssh/config`.
+- no handlers and notify, because I want complete control over the execution order
+
+This is my first non-trivial Ansible project, so I wouldn't be surprised if I have some anti-patterns in there.
+
+The playbooks are designed to be fully _idempotent_: I can run the playbook again after the first run and expect the system to be in the same state. This is very important, since I want to be able to fearlessly run any playbook at any time and expect a success, or at least a helpful failure that doesn't compromise basic operation of the host.
+
+The only host in the Ansible inventory is my server. I run the playbook like this from my development laptop:
+
+```sh
+$ ansible-playbook -i inventory playbook.yml
+```
+
+If I want to only update the `ingress` jail, I run:
+
+```sh
+$ ansible-playbook -i inventory playbook.yml -t jail_ingress
+```
+
+## Separation of responsibilities
+
+Let's borrow and tweak the standard cloud infrastructure stack diagram that shows what parts of the stack are handled by the cloud provider and what parts are handled by the customer.
+
+My current approach is to use Ansible for the "core" parts of server administration, installing packages, defining service jails, etc:
+
+{{ fig(src="pursotin_stack.svg", alt="A stack model depicting the software layers in my server") }}
+
+Some notes about this setup:
+
+- The top "application layer" is currently a chaotic no-man's-land with varying levels of automation. Optimally I could rebuild all service jails completely with Ansible.
+- The host OS release is managed manually, i.e. release upgrades are run manually with `freebsd-update`. This is fine IMHO. I will be supervising all the few and in between OS upgrades anyway, so automation does not help much there.
+
+## Why not Chef, Salt, etc?
+
+Ansible is very simple. It's pretty much a framework to write idempotent shell scripts without having to write shell scripts. Or Python scripts, whichever way you want to look at it.
+
+It's agentless. I don't have to run a service on the FreeBSD host to use Ansible. It uses SSH as transport and runs the tasks with Python, both of which are software that I expect to be present on any \*nix server.
+
+{{ fig(src="ansible_task_postgres.png", alt='A snippet of Ansible playbook installing PostgreSQL in the "postgres" jail') }}
+
+## How about containers?
+
+I'd image that most new server setups in 2025 are designed with container workloads in mind. This one is too, kinda.
+
+I isolate most services with FreeBSD jails, which are similar to OCI containers. Processes are isolated from other jails and the host automatically. Virtual networking (`vnet`) isolates the network. ZFS snapshots and clones provide thin jail filesystems that have a small storage footprint. Jails share the host kernel.
+
+Many OCI container concepts translate well to jails, but jails are somewhat more _persistent_. Conventionally, jail filesystems are not ephemeral and survive jail restarts.
+
+Only `ssh`, `bash`, `vim` and some other packages are installed on the host directly. Everything else is 🔐 _incarcerated_ 🔐.
+
+{{ fig(src="pursotin_jls.png", alt='A list of running jails on the server') }}
+
+### FreeBSD OCI container support
+
+FreeBSD was [recently welcomed](https://forums.freebsd.org/threads/an-introduction-to-oci-containers-on-freebsd.99907/) into the prestigious club of platforms that can run OCI containers. This was achieved by using jails as the container runtime and `podman` as container manager.
+
+This pretty much means that we can use Dockerfiles/Containerfiles to define our jails. Existing Containerfiles cannot be used directly, since they are built on Linux base images, but they can be used as a starting point for building new, FreeBSD-based images.
+
+While this sounds very cool and promising, I want to let the implementation mature a bit before building everything on it.
+
+> I tried installing the `podman-suite` package and following the instructions, and promptly broke all of my networking, so yeah 😑
+
+I'm sure OCI containers will be a valid and respectable approach to containerization on FreeBSD, after the kinks have been ironed out.
+
+## To be continued
+
+In the next part(s) we will be looking at the specifics of the jail setup, e.g. how to create jails using `jail.conf.d` scripts.
diff --git a/content/posts/home-server-part-5/pursotin_jls.png b/content/posts/home-server-part-5/pursotin_jls.png
new file mode 100644
index 0000000..2f2aa94
--- /dev/null
+++ b/content/posts/home-server-part-5/pursotin_jls.png
Binary files differ
diff --git a/content/posts/home-server-part-5/pursotin_stack.svg b/content/posts/home-server-part-5/pursotin_stack.svg
new file mode 100644
index 0000000..6d57c70
--- /dev/null
+++ b/content/posts/home-server-part-5/pursotin_stack.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:lucid="lucid" width="715" height="509"><g transform="translate(-872 -1115)" lucid:page-tab-id="jJFWJm6nolyj"><path d="M500 500h1500v1500H500z" fill="#fff"/><path d="M897.63 1566a6 6 0 0 1 6-6h262.74a6 6 0 0 1 6 6v28a6 6 0 0 1-6 6H903.63a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#edf5ff"/><use xlink:href="#a" transform="matrix(1,0,0,1,902.6334567901235,1565) translate(77.0679012345679 19.65277777777778)"/><path d="M897.63 1506a6 6 0 0 1 6-6h262.74a6 6 0 0 1 6 6v28a6 6 0 0 1-6 6H903.63a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#edf5ff"/><use xlink:href="#b" transform="matrix(1,0,0,1,902.6334567901234,1505) translate(93.64197530864197 19.65277777777778)"/><path d="M897.63 1446a6 6 0 0 1 6-6h262.74a6 6 0 0 1 6 6v28a6 6 0 0 1-6 6H903.63a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#edf5ff"/><use xlink:href="#c" transform="matrix(1,0,0,1,902.6334567901234,1445) translate(99.84567901234568 19.65277777777778)"/><path d="M897.63 1326a6 6 0 0 1 6-6h262.74a6 6 0 0 1 6 6v28a6 6 0 0 1-6 6H903.63a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#fff0f0"/><use xlink:href="#d" transform="matrix(1,0,0,1,902.6334567901235,1325) translate(59.074074074074076 19.65277777777778)"/><use xlink:href="#e" transform="matrix(1,0,0,1,902.6334567901235,1325) translate(110.8641975308642 19.65277777777778)"/><path d="M897.63 1266a6 6 0 0 1 6-6h262.74a6 6 0 0 1 6 6v28a6 6 0 0 1-6 6H903.63a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#fff0f0"/><use xlink:href="#f" transform="matrix(1,0,0,1,902.6334567901235,1265) translate(70.27777777777777 19.65277777777778)"/><use xlink:href="#g" transform="matrix(1,0,0,1,902.6334567901235,1265) translate(109.6604938271605 19.65277777777778)"/><path d="M897.63 1206a6 6 0 0 1 6-6h262.74a6 6 0 0 1 6 6v28a6 6 0 0 1-6 6H903.63a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#f7f4e4"/><use xlink:href="#f" transform="matrix(1,0,0,1,902.6334567901235,1205) translate(91.2037037037037 19.65277777777778)"/><use xlink:href="#h" transform="matrix(1,0,0,1,902.6334567901235,1205) translate(130.58641975308643 19.65277777777778)"/><path d="M897.63 1146a6 6 0 0 1 6-6h262.74a6 6 0 0 1 6 6v28a6 6 0 0 1-6 6H903.63a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#f7f4e4"/><use xlink:href="#f" transform="matrix(1,0,0,1,902.6334567901235,1145) translate(54.25925925925924 19.65277777777778)"/><use xlink:href="#i" transform="matrix(1,0,0,1,902.6334567901235,1145) translate(93.64197530864196 19.65277777777778)"/><path d="M1220 1446a6 6 0 0 1 6-6h68a6 6 0 0 1 6 6v148a6 6 0 0 1-6 6h-68a6 6 0 0 1-6-6z" fill="none"/><path d="M1220 1600c5.52 0 10-4.48 10-10v-60c0-5.52 4.48-10 10-10-5.52 0-10-4.48-10-10v-60c0-5.52-4.48-10-10-10" stroke="#282c33" stroke-width="2" fill="none"/><use xlink:href="#j" transform="matrix(1,0,0,1,1255,1445) translate(0 79.44444444444444)"/><path d="M1220 1266a6 6 0 0 1 6-6h68a6 6 0 0 1 6 6v88a6 6 0 0 1-6 6h-68a6 6 0 0 1-6-6z" fill="none"/><path d="M1220 1360c5.52 0 10-4.48 10-10v-30c0-5.52 4.48-10 10-10-5.52 0-10-4.48-10-10v-30c0-5.52-4.48-10-10-10" stroke="#282c33" stroke-width="2" fill="none"/><use xlink:href="#k" transform="matrix(1,0,0,1,1255,1265) translate(0 49.44444444444444)"/><path d="M1220 1146a6 6 0 0 1 6-6h318a6 6 0 0 1 6 6v88a6 6 0 0 1-6 6h-318a6 6 0 0 1-6-6z" fill="none"/><path d="M1220 1240c5.52 0 10-4.48 10-10v-30c0-5.52 4.48-10 10-10-5.52 0-10-4.48-10-10v-30c0-5.52-4.48-10-10-10" stroke="#282c33" stroke-width="2" fill="none"/><use xlink:href="#l" transform="matrix(1,0,0,1,1255,1145) translate(0 36.111111111111114)"/><use xlink:href="#m" transform="matrix(1,0,0,1,1255,1145) translate(117.09876543209876 36.111111111111114)"/><use xlink:href="#n" transform="matrix(1,0,0,1,1255,1145) translate(211.9753086419753 36.111111111111114)"/><use xlink:href="#o" transform="matrix(1,0,0,1,1255,1145) translate(0 62.77777777777778)"/><use xlink:href="#p" transform="matrix(1,0,0,1,1255,1145) translate(113.39506172839506 62.77777777777778)"/><path d="M897.63 1386a6 6 0 0 1 6-6h262.74a6 6 0 0 1 6 6v28a6 6 0 0 1-6 6H903.63a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#fbf0ff"/><g><use xlink:href="#d" transform="matrix(1,0,0,1,902.6334567901234,1385) translate(0.524691358024711 19.65277777777778)"/><use xlink:href="#q" transform="matrix(1,0,0,1,902.6334567901234,1385) translate(52.31481481481484 19.65277777777778)"/><use xlink:href="#r" transform="matrix(1,0,0,1,902.6334567901234,1385) translate(118.85802469135804 19.65277777777778)"/><use xlink:href="#s" transform="matrix(1,0,0,1,902.6334567901234,1385) translate(139.8456790123457 19.65277777777778)"/><use xlink:href="#t" transform="matrix(1,0,0,1,902.6334567901234,1385) translate(194.16666666666669 19.65277777777778)"/></g><path d="M1220 1388.67a6 6 0 0 1 6-6h328a6 6 0 0 1 6 6V1414a6 6 0 0 1-6 6h-328a6 6 0 0 1-6-6z" fill="none"/><path d="M1220 1420c5.15 0 9.33-4.18 9.33-9.33 0-5.16 4.18-9.34 9.34-9.34-5.16 0-9.34-4.17-9.34-9.33 0-5.15-4.17-9.33-9.33-9.33" stroke="#282c33" stroke-width="2" fill="none"/><g><use xlink:href="#u" transform="matrix(1,0,0,1,1253.6666666666667,1387.6666666666665) translate(0 18.444444444444443)"/><use xlink:href="#v" transform="matrix(1,0,0,1,1253.6666666666667,1387.6666666666665) translate(94.87654320987654 18.444444444444443)"/></g><defs><path fill="#3a414a" d="M190 0L58-211 59 0H30v-248h39L202-35l-2-213h31V0h-41" id="w"/><path fill="#3a414a" d="M100-194c63 0 86 42 84 106H49c0 40 14 67 53 68 26 1 43-12 49-29l28 8c-11 28-37 45-77 45C44 4 14-33 15-96c1-61 26-98 85-98zm52 81c6-60-76-77-97-28-3 7-6 17-6 28h103" id="x"/><path fill="#3a414a" d="M59-47c-2 24 18 29 38 22v24C64 9 27 4 27-40v-127H5v-23h24l9-43h21v43h35v23H59v120" id="y"/><path fill="#3a414a" d="M206 0h-36l-40-164L89 0H53L-1-190h32L70-26l43-164h34l41 164 42-164h31" id="z"/><path fill="#3a414a" d="M100-194c62-1 85 37 85 99 1 63-27 99-86 99S16-35 15-95c0-66 28-99 85-99zM99-20c44 1 53-31 53-75 0-43-8-75-51-75s-53 32-53 75 10 74 51 75" id="A"/><path fill="#3a414a" d="M114-163C36-179 61-72 57 0H25l-1-190h30c1 12-1 29 2 39 6-27 23-49 58-41v29" id="B"/><path fill="#3a414a" d="M143 0L79-87 56-68V0H24v-261h32v163l83-92h37l-77 82L181 0h-38" id="C"/><path fill="#3a414a" d="M24-231v-30h32v30H24zM24 0v-190h32V0H24" id="D"/><path fill="#3a414a" d="M117-194c89-4 53 116 60 194h-32v-121c0-31-8-49-39-48C34-167 62-67 57 0H25l-1-190h30c1 10-1 24 2 32 11-22 29-35 61-36" id="E"/><path fill="#3a414a" d="M177-190C167-65 218 103 67 71c-23-6-38-20-44-43l32-5c15 47 100 32 89-28v-30C133-14 115 1 83 1 29 1 15-40 15-95c0-56 16-97 71-98 29-1 48 16 59 35 1-10 0-23 2-32h30zM94-22c36 0 50-32 50-73 0-42-14-75-50-75-39 0-46 34-46 75s6 73 46 73" id="F"/><g id="a"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#w"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,34.50617283950617,0)" xlink:href="#z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,50.49382716049382,0)" xlink:href="#A"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,62.8395061728395,0)" xlink:href="#B"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,70.18518518518518,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,81.29629629629629,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,86.17283950617283,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,98.51851851851852,0)" xlink:href="#F"/></g><path fill="#3a414a" d="M185-189c-5-48-123-54-124 2 14 75 158 14 163 119 3 78-121 87-175 55-17-10-28-26-33-46l33-7c5 56 141 63 141-1 0-78-155-14-162-118-5-82 145-84 179-34 5 7 8 16 11 25" id="G"/><path fill="#3a414a" d="M141-36C126-15 110 5 73 4 37 3 15-17 15-53c-1-64 63-63 125-63 3-35-9-54-41-54-24 1-41 7-42 31l-33-3c5-37 33-52 76-52 45 0 72 20 72 64v82c-1 20 7 32 28 27v20c-31 9-61-2-59-35zM48-53c0 20 12 33 32 33 41-3 63-29 60-74-43 2-92-5-92 41" id="H"/><g id="b"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#G"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,20.98765432098765,0)" xlink:href="#A"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.33333333333333,0)" xlink:href="#B"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.679012345679006,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,53.02469135802468,0)" xlink:href="#F"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,65.37037037037037,0)" xlink:href="#x"/></g><path fill="#3a414a" d="M108 0H70L1-190h34L89-25l56-165h34" id="I"/><g id="c"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#G"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#B"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,34.50617283950617,0)" xlink:href="#I"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.61728395061728,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,57.962962962962955,0)" xlink:href="#B"/></g><path fill="#3a414a" d="M197 0v-115H63V0H30v-248h33v105h134v-105h34V0h-34" id="J"/><path fill="#3a414a" d="M135-143c-3-34-86-38-87 0 15 53 115 12 119 90S17 21 10-45l28-5c4 36 97 45 98 0-10-56-113-15-118-90-4-57 82-63 122-42 12 7 21 19 24 35" id="K"/><g id="d"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#J"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#A"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,39.44444444444444,0)" xlink:href="#y"/></g><path fill="#3a414a" d="M115-194c55 1 70 41 70 98S169 2 115 4C84 4 66-9 55-30l1 105H24l-1-265h31l2 30c10-21 28-34 59-34zm-8 174c40 0 45-34 45-75s-6-73-45-74c-42 0-51 32-51 76 0 43 10 73 51 73" id="L"/><path fill="#3a414a" d="M96-169c-40 0-48 33-48 73s9 75 48 75c24 0 41-14 43-38l32 2c-6 37-31 61-74 61-59 0-76-41-82-99-10-93 101-131 147-64 4 7 5 14 7 22l-32 3c-4-21-16-35-41-35" id="M"/><g id="e"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#L"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.691358024691358,0)" xlink:href="#M"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.80246913580247,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,46.91358024691358,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,59.25925925925926,0)" xlink:href="#F"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,71.60493827160494,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,83.95061728395062,0)" xlink:href="#K"/></g><path fill="#3a414a" d="M153-248C145-148 188 4 80 4 36 3 13-21 6-62l32-5c4 25 16 42 43 43 27 0 39-20 39-49v-147H72v-28h81" id="N"/><path fill="#3a414a" d="M24 0v-261h32V0H24" id="O"/><g id="f"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#N"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,11.11111111111111,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,23.45679012345679,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333336,0)" xlink:href="#O"/></g><path fill="#3a414a" d="M84 4C-5 8 30-112 23-190h32v120c0 31 7 50 39 49 72-2 45-101 50-169h31l1 190h-30c-1-10 1-25-2-33-11 22-28 36-60 37" id="P"/><path fill="#3a414a" d="M85-194c31 0 48 13 60 33l-1-100h32l1 261h-30c-2-10 0-23-3-31C134-8 116 4 85 4 32 4 16-35 15-94c0-66 23-100 70-100zm9 24c-40 0-46 34-46 75 0 40 6 74 45 74 42 0 51-32 51-76 0-42-9-74-50-73" id="Q"/><g id="g"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#P"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,23.45679012345679,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.80246913580247,0)" xlink:href="#B"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.148148148148145,0)" xlink:href="#O"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.02469135802469,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.37037037037037,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,72.71604938271605,0)" xlink:href="#Q"/></g><g id="h"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#Q"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.691358024691358,0)" xlink:href="#y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.864197530864196,0)" xlink:href="#H"/></g><g id="i"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#L"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.691358024691358,0)" xlink:href="#L"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,37.03703703703704,0)" xlink:href="#O"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,41.91358024691358,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,46.79012345679013,0)" xlink:href="#M"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,57.90123456790124,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,70.24691358024693,0)" xlink:href="#y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,76.41975308641976,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,81.2962962962963,0)" xlink:href="#A"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,93.64197530864199,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,105.98765432098767,0)" xlink:href="#K"/></g><path fill="#3a414a" d="M30-248c87 1 191-15 191 75 0 78-77 80-158 76V0H30v-248zm33 125c57 0 124 11 124-50 0-59-68-47-124-48v98" id="R"/><path fill="#3a414a" d="M106-169C34-169 62-67 57 0H25v-261h32l-1 103c12-21 28-36 61-36 89 0 53 116 60 194h-32v-121c2-32-8-49-39-48" id="S"/><path fill="#3a414a" d="M179-190L93 31C79 59 56 82 12 73V49c39 6 53-20 64-50L1-190h34L92-34l54-156h33" id="T"/><g id="j"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#R"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#S"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#T"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.27160493827161,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.38271604938272,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,54.25925925925927,0)" xlink:href="#M"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,65.37037037037038,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,77.71604938271606,0)" xlink:href="#O"/></g><path fill="#3a414a" d="M205 0l-28-72H64L36 0H1l101-248h38L239 0h-34zm-38-99l-47-123c-12 45-31 82-46 123h93" id="U"/><path fill="#3a414a" d="M115-194c53 0 69 39 70 98 0 66-23 100-70 100C84 3 66-7 56-30L54 0H23l1-261h32v101c10-23 28-34 59-34zm-8 174c40 0 45-34 45-75 0-40-5-75-45-74-42 0-51 32-51 76 0 43 10 73 51 73" id="V"/><path fill="#3a414a" d="M16-82v-28h88v28H16" id="W"/><path fill="#3a414a" d="M101-234c-31-9-42 10-38 44h38v23H63V0H32v-167H5v-23h27c-7-52 17-82 69-68v24" id="X"/><g id="k"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#U"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.27160493827161,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.14814814814815,0)" xlink:href="#V"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,55.49382716049383,0)" xlink:href="#O"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.370370370370374,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,72.71604938271605,0)" xlink:href="#W"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,80.06172839506173,0)" xlink:href="#Q"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,92.40740740740742,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,104.7530864197531,0)" xlink:href="#X"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,110.92592592592594,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,115.80246913580248,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,128.14814814814815,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,140.49382716049382,0)" xlink:href="#Q"/></g><path fill="#3a414a" d="M210-169c-67 3-38 105-44 169h-31v-121c0-29-5-50-35-48C34-165 62-65 56 0H25l-1-190h30c1 10-1 24 2 32 10-44 99-50 107 0 11-21 27-35 58-36 85-2 47 119 55 194h-31v-121c0-29-5-49-35-48" id="Y"/><g id="l"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#G"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#A"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.61728395061728,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,57.962962962962955,0)" xlink:href="#y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,64.1358024691358,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,69.01234567901234,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,87.46913580246913,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,99.81481481481481,0)" xlink:href="#K"/></g><g id="m"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.456790123456788,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.80246913580247,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.148148148148145,0)" xlink:href="#P"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,55.49382716049382,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,67.8395061728395,0)" xlink:href="#O"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,72.71604938271605,0)" xlink:href="#O"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,77.5925925925926,0)" xlink:href="#T"/></g><path fill="#3a414a" d="M68-38c1 34 0 65-14 84H32c9-13 17-26 17-46H33v-38h35" id="Z"/><g id="n"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#Q"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.691358024691358,0)" xlink:href="#X"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.864197530864196,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.74074074074074,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.08641975308642,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.432098765432094,0)" xlink:href="#Q"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,72.77777777777777,0)" xlink:href="#Z"/></g><g id="o"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,11.11111111111111,0)" xlink:href="#A"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,23.45679012345679,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,41.91358024691358,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,54.25925925925926,0)" xlink:href="#y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.4320987654321,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,65.30864197530865,0)" xlink:href="#Y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,83.76543209876543,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,96.11111111111111,0)" xlink:href="#K"/></g><g id="p"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#U"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,14.814814814814813,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.27160493827161,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.14814814814815,0)" xlink:href="#V"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,55.49382716049383,0)" xlink:href="#O"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.370370370370374,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,72.71604938271605,0)" xlink:href="#W"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,80.06172839506173,0)" xlink:href="#Q"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,92.40740740740742,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,104.7530864197531,0)" xlink:href="#X"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,110.92592592592594,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,115.80246913580248,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,128.14814814814815,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,140.49382716049382,0)" xlink:href="#Q"/></g><g id="q"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,11.11111111111111,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,23.45679012345679,0)" xlink:href="#B"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.80246913580247,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.148148148148145,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,55.49382716049382,0)" xlink:href="#O"/></g><path fill="#3a414a" d="M234-2c-28 10-62 0-77-18C117 19 8 12 13-65c3-43 29-61 60-76-25-40-17-114 47-108 35 3 59 15 59 50 0 44-40 53-71 69 14 26 32 50 51 72 14-21 24-43 30-72l26 8c-9 33-21 57-38 82 13 13 33 22 57 15v23zM97-151c25-10 52-18 56-48-1-18-13-29-33-29-42 0-39 50-23 77zM42-66c-3 51 71 58 98 28-20-24-41-51-56-80-23 10-40 24-42 52" id="aa"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#aa" id="r"/><g id="s"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#V"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.691358024691358,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.80246913580247,0)" xlink:href="#x"/></g><g id="t"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,11.11111111111111,0)" xlink:href="#T"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,22.22222222222222,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.33333333333333,0)" xlink:href="#y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,39.50617283950617,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,51.85185185185185,0)" xlink:href="#Y"/></g><path fill="#3a414a" d="M240 0l2-218c-23 76-54 145-80 218h-23L58-218 59 0H30v-248h44l77 211c21-75 51-140 76-211h43V0h-30" id="ab"/><g id="u"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#ab"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,18.456790123456788,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.80246913580247,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.148148148148145,0)" xlink:href="#P"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,55.49382716049382,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,67.8395061728395,0)" xlink:href="#O"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,72.71604938271605,0)" xlink:href="#O"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,77.5925925925926,0)" xlink:href="#T"/></g><g id="v"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#Q"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.691358024691358,0)" xlink:href="#X"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,30.864197530864196,0)" xlink:href="#D"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.74074074074074,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,48.08641975308642,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.432098765432094,0)" xlink:href="#Q"/></g></defs></g></svg> \ No newline at end of file