commit 60e23cdef629e4d84b50395b35c648e811bfeba2 Author: tastytea Date: Fri Feb 15 01:31:21 2019 +0100 initial commit diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..00e77bd --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,6 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +draft: true +--- + diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..abb109b --- /dev/null +++ b/config.toml @@ -0,0 +1,60 @@ +baseURL = "https://blog.tastytea.de/" +languageCode = "en" +title = "tastyteablog" +theme = [ "tastytea", "slick" ] +copyright = "CC BY-NC 4.0" + +pygmentsCodefences = true +pygmentsCodeFencesGuessSyntax = false +pygmentsUseClasses = true +canonifyURLs = false +Paginate = 10 +PaginatePath = "page" + +[params] + subtitle = "I write things here." + favicon = "img/favicon.png" + datefmt = "2006-01-02" + showfullcontent = true + opengraph = true + +[taxonomies] + tags = "tags" + +[author] + name = "tastytea" + email = "tastytea@tastytea.de" + +[menu] + [[menu.main]] + identifier = "post" + name = "Posts" + url = "/posts/" + weight = 1 + + [[menu.main]] + identifier = "tags" + name = "Tags" + url = "/tags/" + weight = 2 + + [[menu.main]] + identifier = "rss" + name = "RSS" + url = "/index.xml" + weight = 3 + + [[menu.footer]] + name = "Website" + url = "https://tastytea.de/" + weight = 1 + + [[menu.footer]] + name = "Sourcecode" + url = "https://schlomp.space/tastytea" + weight = 2 + + [[menu.footer]] + name = "Fediverse" + url = "https://likeable.space/users/tastytea" + weight = 3 diff --git a/content/posts/using-asciidoc-with-gitea.adoc b/content/posts/using-asciidoc-with-gitea.adoc new file mode 100644 index 0000000..6255601 --- /dev/null +++ b/content/posts/using-asciidoc-with-gitea.adoc @@ -0,0 +1,111 @@ +--- +title: "Using AsciiDoc(tor) with Gitea" +description: "How to add AsciiDoc support to Gitea." +date: 2019-01-26T13:03:36+01:00 +draft: false +tags: +- asciidoc +- gitea +--- + +In this blogpost I describe what I did to get AsciiDoc support into +https://gitea.io/[Gitea]. If you want more than syntax highlighting and basic +formatting, Gitea has to be patched unfortunately(this +https://github.com/go-gitea/gitea/issues/4935[issue] has already been reported). +But I think most people will only need to edit 1 configuration file and are +done. + +== Asciidoctor or AsciiDoc? + +https://asciidoctor.org/[Asciidoctor] has inbuilt support for +https://highlightjs.org/[highlight.js], the solution Gitea +uses and is therefore the best choice in most scenarios. If you can't or don't +want to use it you can use http://asciidoc.org/[AsciiDoc]. + +Add the following section to `conf/app.ini` in your Gitea path. The change +causes `.adoc` files to be rendered with asciidoctor. + +---- +{{< highlight ini >}}[markup.asciidoc] +ENABLED = true +; List of file extensions that should be rendered by an external command +FILE_EXTENSIONS = .adoc,.asciidoc +; External command to render all matching extensions +RENDER_COMMAND = "asciidoctor --backend=html5 --no-header-footer --attribute source-highlighter=highlightjs --out-file=- -" +; Don't pass the file on STDIN, pass the filename as argument instead. +IS_INPUT_FILE = false{{< / highlight >}} +---- + +If you want to use asciidoc instead the command would be: +`asciidoc --backend=xhtml11 --no-header-footer --attribute +source-highlighter=highlight --out-file=- -`. I would choose the `xhtml11` +backend because it is the only one that encloses code snippets with `` +tags. Instead of +http://www.andre-simon.de/doku/highlight/en/highlight.html[highlight] you can +use http://www.gnu.org/software/src-highlite/[source-highlight] or +http://pygments.org/[Pygments]. + +If you use asciidoctor and don't need tables or other fancy stuff you're now +done! If you use asciidoc, you'll have to patch Gitea to get syntax +highlighting. + +== Patching Gitea + +The sanitizer strips almost all attributes from HTML-tags, as a security +precaution. I've added exceptions for: + +* `class` attributes on all the tags Asciidoctor introduces, +* Numerous attributes on `table` tags, +* `align` and `valign` on `td` tags, +* `style` attributes on `span` tags, but only if they contain nothing more than +color and font definitions. + +If you use Asciidoctor with highlight.js output, you don't need to allow `style` +attributes, if you don't use tables you can omit the lines that deal with them +and the `class` exception is only useful if you add custom CSS to use them. + +Apply the patch with `patch -p1 < gitea_relax-sanitizer.patch`. + +---- +{{< highlight diff >}}diff -ur a/modules/markup/sanitizer.go b/modules/markup/sanitizer.go +--- a/modules/markup/sanitizer.go 2019-01-26 16:04:56.014108339 +0100 ++++ b/modules/markup/sanitizer.go 2019-01-26 16:03:21.776401012 +0100 +@@ -38,6 +38,16 @@ + + // Custom URL-Schemes + sanitizer.policy.AllowURLSchemes(setting.Markdown.CustomURLSchemes...) ++ // Allow style on span tags ++ sanitizer.policy.AllowAttrs("style").Matching(regexp.MustCompile(`^(background-)?color:[^;]+(; ?font[^;]+)?;?$`)).OnElements("span") ++ ++ // Allow class attribute ++ sanitizer.policy.AllowAttrs("class").OnElements("code", "pre", "span", "div", "p", "table", "td") ++ ++ // Allow table attributes ++ sanitizer.policy.AllowAttrs("width", "frame", "rules", "cellspacing", "cellpadding").OnElements("table") ++ sanitizer.policy.AllowAttrs("width").OnElements("col") ++ sanitizer.policy.AllowAttrs("align", "valign").OnElements("td") + }) + }{{< / highlight >}} +---- + +== Tables without borders + +I used tables without borders in a manpage I wrote for the list of options. +Gitea insist on drawing borders around them, so I had to create a custom CSS +snippet. + +In your Gitea directory, create `custom/templates/custom/header.tmpl`. + +---- +{{< highlight css >}}{{< / highlight >}} +---- diff --git a/content/posts/wireguard-vpn-with-2-or-more-subnets.adoc b/content/posts/wireguard-vpn-with-2-or-more-subnets.adoc new file mode 100644 index 0000000..2608e8a --- /dev/null +++ b/content/posts/wireguard-vpn-with-2-or-more-subnets.adoc @@ -0,0 +1,152 @@ +--- +title: "WireGuard VPN with 2 or more subnets" +description: "How to connect 2 subnets with WireGuard." +date: 2019-02-14T21:38:28+01:00 +draft: false +tags: +- wireguard +- vpn +--- + +I wanted to create a https://en.wikipedia.org/wiki/WireGuard[WireGuard] VPN with +2 subnets in different physical places, each with their own server. I couldn't +find an example how to do that, so I wrote this one. + +== Introduction + +I'm going to use the IP range `fd69::/48` for the VPN, `fd69:0:0:1::/64` for +subnet 1 and `fd69:0:0:2::/64` for subnet 2. I'm going to call the server of +subnet 1 `server1`, its first client `client1a`, the second one `client1b` and +so on. + +All clients in subnet 1 will connect to `server1` and all clients in subnet 2 +will connect to `server2`. `server1` and `server2` will be connected. If +`client1a` wants to connect to `client2a`, the route will be: +`client1a → server1 → server2 → client2a`. + +== Preparations + +https://www.wireguard.com/install/[Install WireGuard], create `/etc/wireguard` +and generate a key-pair on each participating peer. + +---- +{{< highlight sh >}} +mkdir /etc/wireguard +cd /etc/wireguard +umask 077 +wg genkey | tee privatekey | wg pubkey > publickey +{{< / highlight >}} +---- + +== Configure servers + +.`server1:/etc/wireguard/wg0.conf`: +---- +{{< highlight cfg >}} +# This peer +[Interface] +Address = fd69:0:0:1::1/48 +PrivateKey = +ListenPort = 51820 + +# Server of subnet 2 +[Peer] +PublicKey = +Endpoint = server2:51820 +AllowedIPs = fd69:0:0:2::/64 + +# Clients of subnet 1 +[Peer] +PublicKey = +AllowedIPs = fd69:0:0:1::a/128 + +[Peer] +PublicKey = +AllowedIPs = fd69:0:0:1::b/128 +{{< / highlight >}} +---- + +.`server2:/etc/wireguard/wg0.conf`: +---- +{{< highlight cfg >}} +# This peer +[Interface] +Address = fd69:0:0:2::1/48 +PrivateKey = +ListenPort = 51820 + +# Server of subnet 1 +[Peer] +PublicKey = +Endpoint = server1:51820 +AllowedIPs = fd69:0:0:1::/64 + +# Clients of subnet 2 +[Peer] +PublicKey = +AllowedIPs = fd69:0:0:2::a/128 +{{< / highlight >}} +---- + +== Configure clients + +.`client1a:/etc/wireguard/wg0.conf`: +---- +{{< highlight cfg >}} +[Interface] +Address = fd69:0:0:1::a/48 +PrivateKey = + +[Peer] +PublicKey = +Endpoint = server1:51820 +AllowedIPs = fd69::/48 +PersistentKeepalive = 25 +{{< / highlight >}} +---- + +.`client1b:/etc/wireguard/wg0.conf`: +---- +{{< highlight cfg >}} +[Interface] +Address = fd69:0:0:1::b/48 +PrivateKey = + +[Peer] +PublicKey = +Endpoint = server1:51820 +AllowedIPs = fd69::/48 +PersistentKeepalive = 25 +{{< / highlight >}} +---- + +.`client2a:/etc/wireguard/wg0.conf`: +---- +{{< highlight cfg >}} +[Interface] +Address = fd69:0:0:2::a/48 +PrivateKey = + +[Peer] +PublicKey = +Endpoint = server1:51820 +AllowedIPs = fd69::/48 +PersistentKeepalive = 25 +{{< / highlight >}} +---- + +The `AllowedIPs` setting acts as a routing table. When a peer tries to send a +packet to an IP, it will check `AllowedIPs`, and if the IP appears in the list, +it will send it through the WireGuard interface. + +The `PersistentKeepalive` setting ensures that the connection is maintained and +that the peer continues to be reachable, even behind a NAT. + +== Start VPN + +Run `wg-quick up wg0` on each peer. + +== Further reading + +The article https://www.stavros.io/posts/how-to-configure-wireguard/[How to easily configure WireGuard] +by Stavros Korokithakis helped me a great deal in understanding WireGuard. diff --git a/public/assets/fonts/11872ca.woff2 b/public/assets/fonts/11872ca.woff2 new file mode 100644 index 0000000..12e1bde Binary files /dev/null and b/public/assets/fonts/11872ca.woff2 differ diff --git a/public/assets/fonts/1506293e.woff b/public/assets/fonts/1506293e.woff new file mode 100644 index 0000000..3db105e Binary files /dev/null and b/public/assets/fonts/1506293e.woff differ diff --git a/public/assets/fonts/16724bf5.eot b/public/assets/fonts/16724bf5.eot new file mode 100644 index 0000000..b08fe4a Binary files /dev/null and b/public/assets/fonts/16724bf5.eot differ diff --git a/public/assets/fonts/18e4d875.ttf b/public/assets/fonts/18e4d875.ttf new file mode 100644 index 0000000..cfd4547 Binary files /dev/null and b/public/assets/fonts/18e4d875.ttf differ diff --git a/public/assets/fonts/19c7bb00.woff b/public/assets/fonts/19c7bb00.woff new file mode 100644 index 0000000..a3ec72a Binary files /dev/null and b/public/assets/fonts/19c7bb00.woff differ diff --git a/public/assets/fonts/1a9c073a.woff b/public/assets/fonts/1a9c073a.woff new file mode 100644 index 0000000..b64f2cf Binary files /dev/null and b/public/assets/fonts/1a9c073a.woff differ diff --git a/public/assets/fonts/1be9508c.otf b/public/assets/fonts/1be9508c.otf new file mode 100644 index 0000000..1810d90 Binary files /dev/null and b/public/assets/fonts/1be9508c.otf differ diff --git a/public/assets/fonts/1c033743.woff b/public/assets/fonts/1c033743.woff new file mode 100644 index 0000000..1b39094 Binary files /dev/null and b/public/assets/fonts/1c033743.woff differ diff --git a/public/assets/fonts/1d5c96ee.eot b/public/assets/fonts/1d5c96ee.eot new file mode 100644 index 0000000..b887a66 Binary files /dev/null and b/public/assets/fonts/1d5c96ee.eot differ diff --git a/public/assets/fonts/1e58d13e.eot b/public/assets/fonts/1e58d13e.eot new file mode 100644 index 0000000..8c185be Binary files /dev/null and b/public/assets/fonts/1e58d13e.eot differ diff --git a/public/assets/fonts/1f1ec68.woff2 b/public/assets/fonts/1f1ec68.woff2 new file mode 100644 index 0000000..12dca42 Binary files /dev/null and b/public/assets/fonts/1f1ec68.woff2 differ diff --git a/public/assets/fonts/1f7308ea.ttf b/public/assets/fonts/1f7308ea.ttf new file mode 100644 index 0000000..8662fad Binary files /dev/null and b/public/assets/fonts/1f7308ea.ttf differ diff --git a/public/assets/fonts/208a6dc2.ttf b/public/assets/fonts/208a6dc2.ttf new file mode 100644 index 0000000..6294ac7 Binary files /dev/null and b/public/assets/fonts/208a6dc2.ttf differ diff --git a/public/assets/fonts/20e12988.ttf b/public/assets/fonts/20e12988.ttf new file mode 100644 index 0000000..5a5be2f Binary files /dev/null and b/public/assets/fonts/20e12988.ttf differ diff --git a/public/assets/fonts/224595b8.woff b/public/assets/fonts/224595b8.woff new file mode 100644 index 0000000..94659ae Binary files /dev/null and b/public/assets/fonts/224595b8.woff differ diff --git a/public/assets/fonts/2355e29f.otf b/public/assets/fonts/2355e29f.otf new file mode 100644 index 0000000..d29a3dd Binary files /dev/null and b/public/assets/fonts/2355e29f.otf differ diff --git a/public/assets/fonts/2369640e.woff b/public/assets/fonts/2369640e.woff new file mode 100644 index 0000000..9a07259 Binary files /dev/null and b/public/assets/fonts/2369640e.woff differ diff --git a/public/assets/fonts/26154e4a.otf b/public/assets/fonts/26154e4a.otf new file mode 100644 index 0000000..f419ab9 Binary files /dev/null and b/public/assets/fonts/26154e4a.otf differ diff --git a/public/assets/fonts/272db417.woff2 b/public/assets/fonts/272db417.woff2 new file mode 100644 index 0000000..df1d211 Binary files /dev/null and b/public/assets/fonts/272db417.woff2 differ diff --git a/public/assets/fonts/28df7238.eot b/public/assets/fonts/28df7238.eot new file mode 100644 index 0000000..8aa922a Binary files /dev/null and b/public/assets/fonts/28df7238.eot differ diff --git a/public/assets/fonts/29b6ca2d.otf b/public/assets/fonts/29b6ca2d.otf new file mode 100644 index 0000000..2d06c4a Binary files /dev/null and b/public/assets/fonts/29b6ca2d.otf differ diff --git a/public/assets/fonts/2a4f2187.eot b/public/assets/fonts/2a4f2187.eot new file mode 100644 index 0000000..dc0087b Binary files /dev/null and b/public/assets/fonts/2a4f2187.eot differ diff --git a/public/assets/fonts/2b30c1aa.woff2 b/public/assets/fonts/2b30c1aa.woff2 new file mode 100644 index 0000000..954950a Binary files /dev/null and b/public/assets/fonts/2b30c1aa.woff2 differ diff --git a/public/assets/fonts/2de289d0.otf b/public/assets/fonts/2de289d0.otf new file mode 100644 index 0000000..a5c4eb8 Binary files /dev/null and b/public/assets/fonts/2de289d0.otf differ diff --git a/public/assets/fonts/2f38d79a.otf b/public/assets/fonts/2f38d79a.otf new file mode 100644 index 0000000..10ad048 Binary files /dev/null and b/public/assets/fonts/2f38d79a.otf differ diff --git a/public/assets/fonts/30429081.ttf b/public/assets/fonts/30429081.ttf new file mode 100644 index 0000000..75297dd Binary files /dev/null and b/public/assets/fonts/30429081.ttf differ diff --git a/public/assets/fonts/338344a.woff b/public/assets/fonts/338344a.woff new file mode 100644 index 0000000..cf29a49 Binary files /dev/null and b/public/assets/fonts/338344a.woff differ diff --git a/public/assets/fonts/35456d3f.eot b/public/assets/fonts/35456d3f.eot new file mode 100644 index 0000000..95af9b6 Binary files /dev/null and b/public/assets/fonts/35456d3f.eot differ diff --git a/public/assets/fonts/35ad2a1e.woff2 b/public/assets/fonts/35ad2a1e.woff2 new file mode 100644 index 0000000..2299dab Binary files /dev/null and b/public/assets/fonts/35ad2a1e.woff2 differ diff --git a/public/assets/fonts/35d9c639.ttf b/public/assets/fonts/35d9c639.ttf new file mode 100644 index 0000000..dcd98c6 Binary files /dev/null and b/public/assets/fonts/35d9c639.ttf differ diff --git a/public/assets/fonts/37a36aac.woff b/public/assets/fonts/37a36aac.woff new file mode 100644 index 0000000..0a5e1c6 Binary files /dev/null and b/public/assets/fonts/37a36aac.woff differ diff --git a/public/assets/fonts/39d280e0.woff2 b/public/assets/fonts/39d280e0.woff2 new file mode 100644 index 0000000..dcbdaf1 Binary files /dev/null and b/public/assets/fonts/39d280e0.woff2 differ diff --git a/public/assets/fonts/3a4491b0.woff2 b/public/assets/fonts/3a4491b0.woff2 new file mode 100644 index 0000000..2dab24a Binary files /dev/null and b/public/assets/fonts/3a4491b0.woff2 differ diff --git a/public/assets/fonts/3a51cfed.eot b/public/assets/fonts/3a51cfed.eot new file mode 100644 index 0000000..ebaf5f3 Binary files /dev/null and b/public/assets/fonts/3a51cfed.eot differ diff --git a/public/assets/fonts/3eb036e2.ttf b/public/assets/fonts/3eb036e2.ttf new file mode 100644 index 0000000..faaeeb6 Binary files /dev/null and b/public/assets/fonts/3eb036e2.ttf differ diff --git a/public/assets/fonts/40b7c0ef.woff b/public/assets/fonts/40b7c0ef.woff new file mode 100644 index 0000000..6571866 Binary files /dev/null and b/public/assets/fonts/40b7c0ef.woff differ diff --git a/public/assets/fonts/415ac89e.woff b/public/assets/fonts/415ac89e.woff new file mode 100644 index 0000000..69a466d Binary files /dev/null and b/public/assets/fonts/415ac89e.woff differ diff --git a/public/assets/fonts/44012eb8.woff b/public/assets/fonts/44012eb8.woff new file mode 100644 index 0000000..bcbe756 Binary files /dev/null and b/public/assets/fonts/44012eb8.woff differ diff --git a/public/assets/fonts/44a0319a.woff b/public/assets/fonts/44a0319a.woff new file mode 100644 index 0000000..2e37b09 Binary files /dev/null and b/public/assets/fonts/44a0319a.woff differ diff --git a/public/assets/fonts/45df7d88.ttf b/public/assets/fonts/45df7d88.ttf new file mode 100644 index 0000000..a8eae16 Binary files /dev/null and b/public/assets/fonts/45df7d88.ttf differ diff --git a/public/assets/fonts/4bfad23a.eot b/public/assets/fonts/4bfad23a.eot new file mode 100644 index 0000000..e21ee09 Binary files /dev/null and b/public/assets/fonts/4bfad23a.eot differ diff --git a/public/assets/fonts/4c8eefa.ttf b/public/assets/fonts/4c8eefa.ttf new file mode 100644 index 0000000..f55e601 Binary files /dev/null and b/public/assets/fonts/4c8eefa.ttf differ diff --git a/public/assets/fonts/4d55e374.woff b/public/assets/fonts/4d55e374.woff new file mode 100644 index 0000000..9f63553 Binary files /dev/null and b/public/assets/fonts/4d55e374.woff differ diff --git a/public/assets/fonts/4e7d9104.otf b/public/assets/fonts/4e7d9104.otf new file mode 100644 index 0000000..99a389b Binary files /dev/null and b/public/assets/fonts/4e7d9104.otf differ diff --git a/public/assets/fonts/4f1cf470.otf b/public/assets/fonts/4f1cf470.otf new file mode 100644 index 0000000..f2d4c15 Binary files /dev/null and b/public/assets/fonts/4f1cf470.otf differ diff --git a/public/assets/fonts/4f37a027.woff b/public/assets/fonts/4f37a027.woff new file mode 100644 index 0000000..68c98f1 Binary files /dev/null and b/public/assets/fonts/4f37a027.woff differ diff --git a/public/assets/fonts/502923e2.woff2 b/public/assets/fonts/502923e2.woff2 new file mode 100644 index 0000000..5dc3d4c Binary files /dev/null and b/public/assets/fonts/502923e2.woff2 differ diff --git a/public/assets/fonts/508b3447.ttf b/public/assets/fonts/508b3447.ttf new file mode 100644 index 0000000..c583003 Binary files /dev/null and b/public/assets/fonts/508b3447.ttf differ diff --git a/public/assets/fonts/519d195f.otf b/public/assets/fonts/519d195f.otf new file mode 100644 index 0000000..19cc982 Binary files /dev/null and b/public/assets/fonts/519d195f.otf differ diff --git a/public/assets/fonts/52021c91.ttf b/public/assets/fonts/52021c91.ttf new file mode 100644 index 0000000..191506b Binary files /dev/null and b/public/assets/fonts/52021c91.ttf differ diff --git a/public/assets/fonts/52369635.woff b/public/assets/fonts/52369635.woff new file mode 100644 index 0000000..6ff71db Binary files /dev/null and b/public/assets/fonts/52369635.woff differ diff --git a/public/assets/fonts/528b8c3e.otf b/public/assets/fonts/528b8c3e.otf new file mode 100644 index 0000000..133134f Binary files /dev/null and b/public/assets/fonts/528b8c3e.otf differ diff --git a/public/assets/fonts/56673d10.woff b/public/assets/fonts/56673d10.woff new file mode 100644 index 0000000..84b4fb4 Binary files /dev/null and b/public/assets/fonts/56673d10.woff differ diff --git a/public/assets/fonts/5880738e.otf b/public/assets/fonts/5880738e.otf new file mode 100644 index 0000000..0b273d9 Binary files /dev/null and b/public/assets/fonts/5880738e.otf differ diff --git a/public/assets/fonts/5a7d9f89.woff b/public/assets/fonts/5a7d9f89.woff new file mode 100644 index 0000000..54256c8 Binary files /dev/null and b/public/assets/fonts/5a7d9f89.woff differ diff --git a/public/assets/fonts/5cb814ad.woff b/public/assets/fonts/5cb814ad.woff new file mode 100644 index 0000000..8d99039 Binary files /dev/null and b/public/assets/fonts/5cb814ad.woff differ diff --git a/public/assets/fonts/5da1ae59.woff2 b/public/assets/fonts/5da1ae59.woff2 new file mode 100644 index 0000000..d97cd54 Binary files /dev/null and b/public/assets/fonts/5da1ae59.woff2 differ diff --git a/public/assets/fonts/5da50a5d.otf b/public/assets/fonts/5da50a5d.otf new file mode 100644 index 0000000..7ff6a9f Binary files /dev/null and b/public/assets/fonts/5da50a5d.otf differ diff --git a/public/assets/fonts/5de67d54.ttf b/public/assets/fonts/5de67d54.ttf new file mode 100644 index 0000000..0bcfec6 Binary files /dev/null and b/public/assets/fonts/5de67d54.ttf differ diff --git a/public/assets/fonts/5df19531.woff2 b/public/assets/fonts/5df19531.woff2 new file mode 100644 index 0000000..214910b Binary files /dev/null and b/public/assets/fonts/5df19531.woff2 differ diff --git a/public/assets/fonts/611e0bd2.ttf b/public/assets/fonts/611e0bd2.ttf new file mode 100644 index 0000000..f95a8c4 Binary files /dev/null and b/public/assets/fonts/611e0bd2.ttf differ diff --git a/public/assets/fonts/61e2c985.ttf b/public/assets/fonts/61e2c985.ttf new file mode 100644 index 0000000..4d80fce Binary files /dev/null and b/public/assets/fonts/61e2c985.ttf differ diff --git a/public/assets/fonts/6202b36d.ttf b/public/assets/fonts/6202b36d.ttf new file mode 100644 index 0000000..b7c0fce Binary files /dev/null and b/public/assets/fonts/6202b36d.ttf differ diff --git a/public/assets/fonts/62b4900e.eot b/public/assets/fonts/62b4900e.eot new file mode 100644 index 0000000..783b4f5 Binary files /dev/null and b/public/assets/fonts/62b4900e.eot differ diff --git a/public/assets/fonts/6506a95f.woff b/public/assets/fonts/6506a95f.woff new file mode 100644 index 0000000..a8b8cea Binary files /dev/null and b/public/assets/fonts/6506a95f.woff differ diff --git a/public/assets/fonts/69b18017.otf b/public/assets/fonts/69b18017.otf new file mode 100644 index 0000000..c90e7a3 Binary files /dev/null and b/public/assets/fonts/69b18017.otf differ diff --git a/public/assets/fonts/6b80a96a.otf b/public/assets/fonts/6b80a96a.otf new file mode 100644 index 0000000..1522c9b Binary files /dev/null and b/public/assets/fonts/6b80a96a.otf differ diff --git a/public/assets/fonts/6be51347.woff2 b/public/assets/fonts/6be51347.woff2 new file mode 100644 index 0000000..bcc4efc Binary files /dev/null and b/public/assets/fonts/6be51347.woff2 differ diff --git a/public/assets/fonts/6db96df5.otf b/public/assets/fonts/6db96df5.otf new file mode 100644 index 0000000..554d958 Binary files /dev/null and b/public/assets/fonts/6db96df5.otf differ diff --git a/public/assets/fonts/7146d820.ttf b/public/assets/fonts/7146d820.ttf new file mode 100644 index 0000000..611b2b4 Binary files /dev/null and b/public/assets/fonts/7146d820.ttf differ diff --git a/public/assets/fonts/72ed2339.woff b/public/assets/fonts/72ed2339.woff new file mode 100644 index 0000000..bd82cf4 Binary files /dev/null and b/public/assets/fonts/72ed2339.woff differ diff --git a/public/assets/fonts/74a7b3fb.eot b/public/assets/fonts/74a7b3fb.eot new file mode 100644 index 0000000..f4aa7ae Binary files /dev/null and b/public/assets/fonts/74a7b3fb.eot differ diff --git a/public/assets/fonts/7537acd4.eot b/public/assets/fonts/7537acd4.eot new file mode 100644 index 0000000..39a275e Binary files /dev/null and b/public/assets/fonts/7537acd4.eot differ diff --git a/public/assets/fonts/77461762.woff b/public/assets/fonts/77461762.woff new file mode 100644 index 0000000..7cf96ef Binary files /dev/null and b/public/assets/fonts/77461762.woff differ diff --git a/public/assets/fonts/7860512d.otf b/public/assets/fonts/7860512d.otf new file mode 100644 index 0000000..2acc974 Binary files /dev/null and b/public/assets/fonts/7860512d.otf differ diff --git a/public/assets/fonts/7996dbed.woff2 b/public/assets/fonts/7996dbed.woff2 new file mode 100644 index 0000000..843d388 Binary files /dev/null and b/public/assets/fonts/7996dbed.woff2 differ diff --git a/public/assets/fonts/7a38babb.woff b/public/assets/fonts/7a38babb.woff new file mode 100644 index 0000000..a6f5d55 Binary files /dev/null and b/public/assets/fonts/7a38babb.woff differ diff --git a/public/assets/fonts/7c8c34b6.ttf b/public/assets/fonts/7c8c34b6.ttf new file mode 100644 index 0000000..36d8bae Binary files /dev/null and b/public/assets/fonts/7c8c34b6.ttf differ diff --git a/public/assets/fonts/7d41548a.woff b/public/assets/fonts/7d41548a.woff new file mode 100644 index 0000000..be45282 Binary files /dev/null and b/public/assets/fonts/7d41548a.woff differ diff --git a/public/assets/fonts/7d4f8abf.eot b/public/assets/fonts/7d4f8abf.eot new file mode 100644 index 0000000..8bbf4b1 Binary files /dev/null and b/public/assets/fonts/7d4f8abf.eot differ diff --git a/public/assets/fonts/7facc488.woff b/public/assets/fonts/7facc488.woff new file mode 100644 index 0000000..fceb975 Binary files /dev/null and b/public/assets/fonts/7facc488.woff differ diff --git a/public/assets/fonts/81343ec3.woff2 b/public/assets/fonts/81343ec3.woff2 new file mode 100644 index 0000000..c4134ee Binary files /dev/null and b/public/assets/fonts/81343ec3.woff2 differ diff --git a/public/assets/fonts/83bbfd3c.otf b/public/assets/fonts/83bbfd3c.otf new file mode 100644 index 0000000..4ff8933 Binary files /dev/null and b/public/assets/fonts/83bbfd3c.otf differ diff --git a/public/assets/fonts/84acb292.woff2 b/public/assets/fonts/84acb292.woff2 new file mode 100644 index 0000000..7d9d94f Binary files /dev/null and b/public/assets/fonts/84acb292.woff2 differ diff --git a/public/assets/fonts/84e76146.ttf b/public/assets/fonts/84e76146.ttf new file mode 100644 index 0000000..deb1d71 Binary files /dev/null and b/public/assets/fonts/84e76146.ttf differ diff --git a/public/assets/fonts/85a6f18c.woff2 b/public/assets/fonts/85a6f18c.woff2 new file mode 100644 index 0000000..238cb26 Binary files /dev/null and b/public/assets/fonts/85a6f18c.woff2 differ diff --git a/public/assets/fonts/86b0a1fe.woff b/public/assets/fonts/86b0a1fe.woff new file mode 100644 index 0000000..3822bc2 Binary files /dev/null and b/public/assets/fonts/86b0a1fe.woff differ diff --git a/public/assets/fonts/87a2c090.woff b/public/assets/fonts/87a2c090.woff new file mode 100644 index 0000000..5e02fa9 Binary files /dev/null and b/public/assets/fonts/87a2c090.woff differ diff --git a/public/assets/fonts/8d0fecd1.woff2 b/public/assets/fonts/8d0fecd1.woff2 new file mode 100644 index 0000000..25c08c6 Binary files /dev/null and b/public/assets/fonts/8d0fecd1.woff2 differ diff --git a/public/assets/fonts/8e790707.woff2 b/public/assets/fonts/8e790707.woff2 new file mode 100644 index 0000000..b6ff74b Binary files /dev/null and b/public/assets/fonts/8e790707.woff2 differ diff --git a/public/assets/fonts/8f68ba1f.otf b/public/assets/fonts/8f68ba1f.otf new file mode 100644 index 0000000..8d20739 Binary files /dev/null and b/public/assets/fonts/8f68ba1f.otf differ diff --git a/public/assets/fonts/8f69a4c1.woff2 b/public/assets/fonts/8f69a4c1.woff2 new file mode 100644 index 0000000..c6d7434 Binary files /dev/null and b/public/assets/fonts/8f69a4c1.woff2 differ diff --git a/public/assets/fonts/927bc06f.ttf b/public/assets/fonts/927bc06f.ttf new file mode 100644 index 0000000..5bc0262 Binary files /dev/null and b/public/assets/fonts/927bc06f.ttf differ diff --git a/public/assets/fonts/94ff4038.ttf b/public/assets/fonts/94ff4038.ttf new file mode 100644 index 0000000..065630e Binary files /dev/null and b/public/assets/fonts/94ff4038.ttf differ diff --git a/public/assets/fonts/95352a16.woff2 b/public/assets/fonts/95352a16.woff2 new file mode 100644 index 0000000..ed564da Binary files /dev/null and b/public/assets/fonts/95352a16.woff2 differ diff --git a/public/assets/fonts/9590f7c4.ttf b/public/assets/fonts/9590f7c4.ttf new file mode 100644 index 0000000..23ff52c Binary files /dev/null and b/public/assets/fonts/9590f7c4.ttf differ diff --git a/public/assets/fonts/9c45dd63.woff b/public/assets/fonts/9c45dd63.woff new file mode 100644 index 0000000..691dccf Binary files /dev/null and b/public/assets/fonts/9c45dd63.woff differ diff --git a/public/assets/fonts/9eea1ee9.otf b/public/assets/fonts/9eea1ee9.otf new file mode 100644 index 0000000..d0f1790 Binary files /dev/null and b/public/assets/fonts/9eea1ee9.otf differ diff --git a/public/assets/fonts/9f9b1bd.woff b/public/assets/fonts/9f9b1bd.woff new file mode 100644 index 0000000..72f2261 Binary files /dev/null and b/public/assets/fonts/9f9b1bd.woff differ diff --git a/public/assets/fonts/9fb24680.woff2 b/public/assets/fonts/9fb24680.woff2 new file mode 100644 index 0000000..443d16f Binary files /dev/null and b/public/assets/fonts/9fb24680.woff2 differ diff --git a/public/assets/fonts/a378d768.woff b/public/assets/fonts/a378d768.woff new file mode 100644 index 0000000..7bb7663 Binary files /dev/null and b/public/assets/fonts/a378d768.woff differ diff --git a/public/assets/fonts/a5ddad82.otf b/public/assets/fonts/a5ddad82.otf new file mode 100644 index 0000000..a61686c Binary files /dev/null and b/public/assets/fonts/a5ddad82.otf differ diff --git a/public/assets/fonts/a963219f.woff2 b/public/assets/fonts/a963219f.woff2 new file mode 100644 index 0000000..19ac8d9 Binary files /dev/null and b/public/assets/fonts/a963219f.woff2 differ diff --git a/public/assets/fonts/aca92c72.otf b/public/assets/fonts/aca92c72.otf new file mode 100644 index 0000000..4ace629 Binary files /dev/null and b/public/assets/fonts/aca92c72.otf differ diff --git a/public/assets/fonts/af414206.ttf b/public/assets/fonts/af414206.ttf new file mode 100644 index 0000000..bfcf347 Binary files /dev/null and b/public/assets/fonts/af414206.ttf differ diff --git a/public/assets/fonts/b21637c2.woff2 b/public/assets/fonts/b21637c2.woff2 new file mode 100644 index 0000000..0fc83ed Binary files /dev/null and b/public/assets/fonts/b21637c2.woff2 differ diff --git a/public/assets/fonts/b2bcbb77.woff2 b/public/assets/fonts/b2bcbb77.woff2 new file mode 100644 index 0000000..fba3625 Binary files /dev/null and b/public/assets/fonts/b2bcbb77.woff2 differ diff --git a/public/assets/fonts/b31c1d6e.woff b/public/assets/fonts/b31c1d6e.woff new file mode 100644 index 0000000..1a0ad59 Binary files /dev/null and b/public/assets/fonts/b31c1d6e.woff differ diff --git a/public/assets/fonts/b497fc2f.ttf b/public/assets/fonts/b497fc2f.ttf new file mode 100644 index 0000000..c343504 Binary files /dev/null and b/public/assets/fonts/b497fc2f.ttf differ diff --git a/public/assets/fonts/b4c667f3.otf b/public/assets/fonts/b4c667f3.otf new file mode 100644 index 0000000..cec364e Binary files /dev/null and b/public/assets/fonts/b4c667f3.otf differ diff --git a/public/assets/fonts/b4e8d8d6.otf b/public/assets/fonts/b4e8d8d6.otf new file mode 100644 index 0000000..1b42738 Binary files /dev/null and b/public/assets/fonts/b4e8d8d6.otf differ diff --git a/public/assets/fonts/b6e66f87.otf b/public/assets/fonts/b6e66f87.otf new file mode 100644 index 0000000..fc8dad5 Binary files /dev/null and b/public/assets/fonts/b6e66f87.otf differ diff --git a/public/assets/fonts/b6fd5fb.woff2 b/public/assets/fonts/b6fd5fb.woff2 new file mode 100644 index 0000000..6614e54 Binary files /dev/null and b/public/assets/fonts/b6fd5fb.woff2 differ diff --git a/public/assets/fonts/b70d2819.ttf b/public/assets/fonts/b70d2819.ttf new file mode 100644 index 0000000..3101340 Binary files /dev/null and b/public/assets/fonts/b70d2819.ttf differ diff --git a/public/assets/fonts/b7e499de.ttf b/public/assets/fonts/b7e499de.ttf new file mode 100644 index 0000000..c14dcb3 Binary files /dev/null and b/public/assets/fonts/b7e499de.ttf differ diff --git a/public/assets/fonts/ba9e750d.woff b/public/assets/fonts/ba9e750d.woff new file mode 100644 index 0000000..41accc2 Binary files /dev/null and b/public/assets/fonts/ba9e750d.woff differ diff --git a/public/assets/fonts/bae6a1f.woff b/public/assets/fonts/bae6a1f.woff new file mode 100644 index 0000000..b29440d Binary files /dev/null and b/public/assets/fonts/bae6a1f.woff differ diff --git a/public/assets/fonts/bb9e5171.woff2 b/public/assets/fonts/bb9e5171.woff2 new file mode 100644 index 0000000..467cca3 Binary files /dev/null and b/public/assets/fonts/bb9e5171.woff2 differ diff --git a/public/assets/fonts/bbe55bf4.otf b/public/assets/fonts/bbe55bf4.otf new file mode 100644 index 0000000..419cdbf Binary files /dev/null and b/public/assets/fonts/bbe55bf4.otf differ diff --git a/public/assets/fonts/bc8c8203.otf b/public/assets/fonts/bc8c8203.otf new file mode 100644 index 0000000..3d27d6e Binary files /dev/null and b/public/assets/fonts/bc8c8203.otf differ diff --git a/public/assets/fonts/c0f65625.otf b/public/assets/fonts/c0f65625.otf new file mode 100644 index 0000000..3806792 Binary files /dev/null and b/public/assets/fonts/c0f65625.otf differ diff --git a/public/assets/fonts/c1d483eb.otf b/public/assets/fonts/c1d483eb.otf new file mode 100644 index 0000000..7019e3d Binary files /dev/null and b/public/assets/fonts/c1d483eb.otf differ diff --git a/public/assets/fonts/c3a25c0a.woff2 b/public/assets/fonts/c3a25c0a.woff2 new file mode 100644 index 0000000..c871235 Binary files /dev/null and b/public/assets/fonts/c3a25c0a.woff2 differ diff --git a/public/assets/fonts/c4dda1d6.woff2 b/public/assets/fonts/c4dda1d6.woff2 new file mode 100644 index 0000000..8025dc3 Binary files /dev/null and b/public/assets/fonts/c4dda1d6.woff2 differ diff --git a/public/assets/fonts/c7d5ecc9.otf b/public/assets/fonts/c7d5ecc9.otf new file mode 100644 index 0000000..f9b94c5 Binary files /dev/null and b/public/assets/fonts/c7d5ecc9.otf differ diff --git a/public/assets/fonts/cd13f393.ttf b/public/assets/fonts/cd13f393.ttf new file mode 100644 index 0000000..0ad479d Binary files /dev/null and b/public/assets/fonts/cd13f393.ttf differ diff --git a/public/assets/fonts/d00dac26.otf b/public/assets/fonts/d00dac26.otf new file mode 100644 index 0000000..38959dc Binary files /dev/null and b/public/assets/fonts/d00dac26.otf differ diff --git a/public/assets/fonts/d175fc37.ttf b/public/assets/fonts/d175fc37.ttf new file mode 100644 index 0000000..5d1579c Binary files /dev/null and b/public/assets/fonts/d175fc37.ttf differ diff --git a/public/assets/fonts/d1ae7201.otf b/public/assets/fonts/d1ae7201.otf new file mode 100644 index 0000000..60f26c9 Binary files /dev/null and b/public/assets/fonts/d1ae7201.otf differ diff --git a/public/assets/fonts/d427ebac.otf b/public/assets/fonts/d427ebac.otf new file mode 100644 index 0000000..d45318f Binary files /dev/null and b/public/assets/fonts/d427ebac.otf differ diff --git a/public/assets/fonts/d793b680.otf b/public/assets/fonts/d793b680.otf new file mode 100644 index 0000000..0e41391 Binary files /dev/null and b/public/assets/fonts/d793b680.otf differ diff --git a/public/assets/fonts/d79b87a3.eot b/public/assets/fonts/d79b87a3.eot new file mode 100644 index 0000000..7d404e0 Binary files /dev/null and b/public/assets/fonts/d79b87a3.eot differ diff --git a/public/assets/fonts/d7b71531.woff2 b/public/assets/fonts/d7b71531.woff2 new file mode 100644 index 0000000..1331a0a Binary files /dev/null and b/public/assets/fonts/d7b71531.woff2 differ diff --git a/public/assets/fonts/d9480.otf b/public/assets/fonts/d9480.otf new file mode 100644 index 0000000..7da8ec1 Binary files /dev/null and b/public/assets/fonts/d9480.otf differ diff --git a/public/assets/fonts/dab1c30c.ttf b/public/assets/fonts/dab1c30c.ttf new file mode 100644 index 0000000..f57d68c Binary files /dev/null and b/public/assets/fonts/dab1c30c.ttf differ diff --git a/public/assets/fonts/dde2ebd0.woff2 b/public/assets/fonts/dde2ebd0.woff2 new file mode 100644 index 0000000..2b94dc5 Binary files /dev/null and b/public/assets/fonts/dde2ebd0.woff2 differ diff --git a/public/assets/fonts/dee9fdc2.ttf b/public/assets/fonts/dee9fdc2.ttf new file mode 100644 index 0000000..437cbe1 Binary files /dev/null and b/public/assets/fonts/dee9fdc2.ttf differ diff --git a/public/assets/fonts/e0be5a14.woff b/public/assets/fonts/e0be5a14.woff new file mode 100644 index 0000000..e294135 Binary files /dev/null and b/public/assets/fonts/e0be5a14.woff differ diff --git a/public/assets/fonts/e3686b20.otf b/public/assets/fonts/e3686b20.otf new file mode 100644 index 0000000..bb640dc Binary files /dev/null and b/public/assets/fonts/e3686b20.otf differ diff --git a/public/assets/fonts/e3c25633.ttf b/public/assets/fonts/e3c25633.ttf new file mode 100644 index 0000000..2d28e6a Binary files /dev/null and b/public/assets/fonts/e3c25633.ttf differ diff --git a/public/assets/fonts/e4390b4a.ttf b/public/assets/fonts/e4390b4a.ttf new file mode 100644 index 0000000..1666f47 Binary files /dev/null and b/public/assets/fonts/e4390b4a.ttf differ diff --git a/public/assets/fonts/e537a0b8.woff2 b/public/assets/fonts/e537a0b8.woff2 new file mode 100644 index 0000000..bd5c1cb Binary files /dev/null and b/public/assets/fonts/e537a0b8.woff2 differ diff --git a/public/assets/fonts/e5a2d94a.ttf b/public/assets/fonts/e5a2d94a.ttf new file mode 100644 index 0000000..a6614a4 Binary files /dev/null and b/public/assets/fonts/e5a2d94a.ttf differ diff --git a/public/assets/fonts/e6dce3ac.eot b/public/assets/fonts/e6dce3ac.eot new file mode 100644 index 0000000..121176c Binary files /dev/null and b/public/assets/fonts/e6dce3ac.eot differ diff --git a/public/assets/fonts/e6de2cf9.ttf b/public/assets/fonts/e6de2cf9.ttf new file mode 100644 index 0000000..8dc9fa9 Binary files /dev/null and b/public/assets/fonts/e6de2cf9.ttf differ diff --git a/public/assets/fonts/e7a9d94f.woff b/public/assets/fonts/e7a9d94f.woff new file mode 100644 index 0000000..001240c Binary files /dev/null and b/public/assets/fonts/e7a9d94f.woff differ diff --git a/public/assets/fonts/e9bb178a.woff2 b/public/assets/fonts/e9bb178a.woff2 new file mode 100644 index 0000000..d167638 Binary files /dev/null and b/public/assets/fonts/e9bb178a.woff2 differ diff --git a/public/assets/fonts/ea3d5a28.woff2 b/public/assets/fonts/ea3d5a28.woff2 new file mode 100644 index 0000000..8b0348a Binary files /dev/null and b/public/assets/fonts/ea3d5a28.woff2 differ diff --git a/public/assets/fonts/eae7051b.woff2 b/public/assets/fonts/eae7051b.woff2 new file mode 100644 index 0000000..1759259 Binary files /dev/null and b/public/assets/fonts/eae7051b.woff2 differ diff --git a/public/assets/fonts/ec00689c.ttf b/public/assets/fonts/ec00689c.ttf new file mode 100644 index 0000000..bf5dae9 Binary files /dev/null and b/public/assets/fonts/ec00689c.ttf differ diff --git a/public/assets/fonts/eebbddc3.woff b/public/assets/fonts/eebbddc3.woff new file mode 100644 index 0000000..0a086ef Binary files /dev/null and b/public/assets/fonts/eebbddc3.woff differ diff --git a/public/assets/fonts/ef092533.woff2 b/public/assets/fonts/ef092533.woff2 new file mode 100644 index 0000000..0042fb4 Binary files /dev/null and b/public/assets/fonts/ef092533.woff2 differ diff --git a/public/assets/fonts/f19d5d1a.woff2 b/public/assets/fonts/f19d5d1a.woff2 new file mode 100644 index 0000000..fe7644b Binary files /dev/null and b/public/assets/fonts/f19d5d1a.woff2 differ diff --git a/public/assets/fonts/f82ab49e.ttf b/public/assets/fonts/f82ab49e.ttf new file mode 100644 index 0000000..6c7eb45 Binary files /dev/null and b/public/assets/fonts/f82ab49e.ttf differ diff --git a/public/assets/fonts/f8bf498d.woff b/public/assets/fonts/f8bf498d.woff new file mode 100644 index 0000000..1e520e0 Binary files /dev/null and b/public/assets/fonts/f8bf498d.woff differ diff --git a/public/assets/fonts/f986f7d5.otf b/public/assets/fonts/f986f7d5.otf new file mode 100644 index 0000000..8665855 Binary files /dev/null and b/public/assets/fonts/f986f7d5.otf differ diff --git a/public/assets/fonts/f997d798.woff2 b/public/assets/fonts/f997d798.woff2 new file mode 100644 index 0000000..30e01df Binary files /dev/null and b/public/assets/fonts/f997d798.woff2 differ diff --git a/public/assets/fonts/f9ad7799.woff b/public/assets/fonts/f9ad7799.woff new file mode 100644 index 0000000..9cf8c3c Binary files /dev/null and b/public/assets/fonts/f9ad7799.woff differ diff --git a/public/assets/fonts/f9fa92a4.ttf b/public/assets/fonts/f9fa92a4.ttf new file mode 100644 index 0000000..ce99756 Binary files /dev/null and b/public/assets/fonts/f9fa92a4.ttf differ diff --git a/public/assets/fonts/fa308c4b.otf b/public/assets/fonts/fa308c4b.otf new file mode 100644 index 0000000..730e097 Binary files /dev/null and b/public/assets/fonts/fa308c4b.otf differ diff --git a/public/assets/fonts/fb72169d.otf b/public/assets/fonts/fb72169d.otf new file mode 100644 index 0000000..1bae002 Binary files /dev/null and b/public/assets/fonts/fb72169d.otf differ diff --git a/public/assets/fonts/fbbcc7b5.ttf b/public/assets/fonts/fbbcc7b5.ttf new file mode 100644 index 0000000..0b6d212 Binary files /dev/null and b/public/assets/fonts/fbbcc7b5.ttf differ diff --git a/public/assets/fonts/fcdef252.woff b/public/assets/fonts/fcdef252.woff new file mode 100644 index 0000000..1e5fd3e Binary files /dev/null and b/public/assets/fonts/fcdef252.woff differ diff --git a/public/assets/fonts/fe2f5b7a.woff2 b/public/assets/fonts/fe2f5b7a.woff2 new file mode 100644 index 0000000..b658207 Binary files /dev/null and b/public/assets/fonts/fe2f5b7a.woff2 differ diff --git a/public/assets/fonts/ff3caca1.ttf b/public/assets/fonts/ff3caca1.ttf new file mode 100644 index 0000000..9e6b1b5 Binary files /dev/null and b/public/assets/fonts/ff3caca1.ttf differ diff --git a/public/assets/fonts/ffd8dd5b.woff2 b/public/assets/fonts/ffd8dd5b.woff2 new file mode 100644 index 0000000..92ebea1 Binary files /dev/null and b/public/assets/fonts/ffd8dd5b.woff2 differ diff --git a/public/assets/license-purecss.md b/public/assets/license-purecss.md new file mode 100644 index 0000000..aae45d8 --- /dev/null +++ b/public/assets/license-purecss.md @@ -0,0 +1,29 @@ +Software License Agreement (BSD License) +======================================== + +Copyright 2013 Yahoo! Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the Yahoo! Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/public/assets/license-source-code-pro.txt b/public/assets/license-source-code-pro.txt new file mode 100755 index 0000000..d154618 --- /dev/null +++ b/public/assets/license-source-code-pro.txt @@ -0,0 +1,93 @@ +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/public/assets/license-source-sans-pro.txt b/public/assets/license-source-sans-pro.txt new file mode 100644 index 0000000..9eeeb0d --- /dev/null +++ b/public/assets/license-source-sans-pro.txt @@ -0,0 +1,93 @@ +Copyright 2010-2018 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/public/assets/license-source-serif-pro.md b/public/assets/license-source-serif-pro.md new file mode 100644 index 0000000..09be3f6 --- /dev/null +++ b/public/assets/license-source-serif-pro.md @@ -0,0 +1,93 @@ +Copyright 2014-2018 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/public/assets/style-compat.css b/public/assets/style-compat.css new file mode 100644 index 0000000..2b27256 --- /dev/null +++ b/public/assets/style-compat.css @@ -0,0 +1 @@ +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{max-width:100ch;margin:auto}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#e2e0de}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,Droid Sans,Helvetica,Arial,sans-serif;display:flex;flex-flow:row wrap;align-content:flex-start}@media (-ms-high-contrast:active),(-ms-high-contrast:none){table .pure-g{display:block}}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class*=pure-u]{font-family:sans-serif}.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-1-2,.pure-u-sm-1-3,.pure-u-sm-1-4,.pure-u-sm-1-5,.pure-u-sm-1-6,.pure-u-sm-1-8,.pure-u-sm-1-12,.pure-u-sm-1-24,.pure-u-sm-2-3,.pure-u-sm-2-5,.pure-u-sm-2-24,.pure-u-sm-3-4,.pure-u-sm-3-5,.pure-u-sm-3-8,.pure-u-sm-3-24,.pure-u-sm-4-5,.pure-u-sm-4-24,.pure-u-sm-5-5,.pure-u-sm-5-6,.pure-u-sm-5-8,.pure-u-sm-5-12,.pure-u-sm-5-24,.pure-u-sm-6-24,.pure-u-sm-7-8,.pure-u-sm-7-12,.pure-u-sm-7-24,.pure-u-sm-8-24,.pure-u-sm-9-24,.pure-u-sm-10-24,.pure-u-sm-11-12,.pure-u-sm-11-24,.pure-u-sm-12-24,.pure-u-sm-13-24,.pure-u-sm-14-24,.pure-u-sm-15-24,.pure-u-sm-16-24,.pure-u-sm-17-24,.pure-u-sm-18-24,.pure-u-sm-19-24,.pure-u-sm-20-24,.pure-u-sm-21-24,.pure-u-sm-22-24,.pure-u-sm-23-24,.pure-u-sm-24-24{display:inline-block;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-sm-1-24{width:4.1667%}.pure-u-sm-1-12,.pure-u-sm-2-24{width:8.3333%}.pure-u-sm-1-8,.pure-u-sm-3-24{width:12.5%}.pure-u-sm-1-6,.pure-u-sm-4-24{width:16.6667%}.pure-u-sm-1-5{width:20%}.pure-u-sm-5-24{width:20.8333%}.pure-u-sm-1-4,.pure-u-sm-6-24{width:25%}.pure-u-sm-7-24{width:29.1667%}.pure-u-sm-1-3,.pure-u-sm-8-24{width:33.3333%}.pure-u-sm-3-8,.pure-u-sm-9-24{width:37.5%}.pure-u-sm-2-5{width:40%}.pure-u-sm-5-12,.pure-u-sm-10-24{width:41.6667%}.pure-u-sm-11-24{width:45.8333%}.pure-u-sm-1-2,.pure-u-sm-12-24{width:50%}.pure-u-sm-13-24{width:54.1667%}.pure-u-sm-7-12,.pure-u-sm-14-24{width:58.3333%}.pure-u-sm-3-5{width:60%}.pure-u-sm-5-8,.pure-u-sm-15-24{width:62.5%}.pure-u-sm-2-3,.pure-u-sm-16-24{width:66.6667%}.pure-u-sm-17-24{width:70.8333%}.pure-u-sm-3-4,.pure-u-sm-18-24{width:75%}.pure-u-sm-19-24{width:79.1667%}.pure-u-sm-4-5{width:80%}.pure-u-sm-5-6,.pure-u-sm-20-24{width:83.3333%}.pure-u-sm-7-8,.pure-u-sm-21-24{width:87.5%}.pure-u-sm-11-12,.pure-u-sm-22-24{width:91.6667%}.pure-u-sm-23-24{width:95.8333%}.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-5-5,.pure-u-sm-24-24{width:100%}.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-1-2,.pure-u-md-1-3,.pure-u-md-1-4,.pure-u-md-1-5,.pure-u-md-1-6,.pure-u-md-1-8,.pure-u-md-1-12,.pure-u-md-1-24,.pure-u-md-2-3,.pure-u-md-2-5,.pure-u-md-2-24,.pure-u-md-3-4,.pure-u-md-3-5,.pure-u-md-3-8,.pure-u-md-3-24,.pure-u-md-4-5,.pure-u-md-4-24,.pure-u-md-5-5,.pure-u-md-5-6,.pure-u-md-5-8,.pure-u-md-5-12,.pure-u-md-5-24,.pure-u-md-6-24,.pure-u-md-7-8,.pure-u-md-7-12,.pure-u-md-7-24,.pure-u-md-8-24,.pure-u-md-9-24,.pure-u-md-10-24,.pure-u-md-11-12,.pure-u-md-11-24,.pure-u-md-12-24,.pure-u-md-13-24,.pure-u-md-14-24,.pure-u-md-15-24,.pure-u-md-16-24,.pure-u-md-17-24,.pure-u-md-18-24,.pure-u-md-19-24,.pure-u-md-20-24,.pure-u-md-21-24,.pure-u-md-22-24,.pure-u-md-23-24,.pure-u-md-24-24{display:inline-block;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-md-1-24{width:4.1667%}.pure-u-md-1-12,.pure-u-md-2-24{width:8.3333%}.pure-u-md-1-8,.pure-u-md-3-24{width:12.5%}.pure-u-md-1-6,.pure-u-md-4-24{width:16.6667%}.pure-u-md-1-5{width:20%}.pure-u-md-5-24{width:20.8333%}.pure-u-md-1-4,.pure-u-md-6-24{width:25%}.pure-u-md-7-24{width:29.1667%}.pure-u-md-1-3,.pure-u-md-8-24{width:33.3333%}.pure-u-md-3-8,.pure-u-md-9-24{width:37.5%}.pure-u-md-2-5{width:40%}.pure-u-md-5-12,.pure-u-md-10-24{width:41.6667%}.pure-u-md-11-24{width:45.8333%}.pure-u-md-1-2,.pure-u-md-12-24{width:50%}.pure-u-md-13-24{width:54.1667%}.pure-u-md-7-12,.pure-u-md-14-24{width:58.3333%}.pure-u-md-3-5{width:60%}.pure-u-md-5-8,.pure-u-md-15-24{width:62.5%}.pure-u-md-2-3,.pure-u-md-16-24{width:66.6667%}.pure-u-md-17-24{width:70.8333%}.pure-u-md-3-4,.pure-u-md-18-24{width:75%}.pure-u-md-19-24{width:79.1667%}.pure-u-md-4-5{width:80%}.pure-u-md-5-6,.pure-u-md-20-24{width:83.3333%}.pure-u-md-7-8,.pure-u-md-21-24{width:87.5%}.pure-u-md-11-12,.pure-u-md-22-24{width:91.6667%}.pure-u-md-23-24{width:95.8333%}.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-5-5,.pure-u-md-24-24{width:100%}.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-1-2,.pure-u-lg-1-3,.pure-u-lg-1-4,.pure-u-lg-1-5,.pure-u-lg-1-6,.pure-u-lg-1-8,.pure-u-lg-1-12,.pure-u-lg-1-24,.pure-u-lg-2-3,.pure-u-lg-2-5,.pure-u-lg-2-24,.pure-u-lg-3-4,.pure-u-lg-3-5,.pure-u-lg-3-8,.pure-u-lg-3-24,.pure-u-lg-4-5,.pure-u-lg-4-24,.pure-u-lg-5-5,.pure-u-lg-5-6,.pure-u-lg-5-8,.pure-u-lg-5-12,.pure-u-lg-5-24,.pure-u-lg-6-24,.pure-u-lg-7-8,.pure-u-lg-7-12,.pure-u-lg-7-24,.pure-u-lg-8-24,.pure-u-lg-9-24,.pure-u-lg-10-24,.pure-u-lg-11-12,.pure-u-lg-11-24,.pure-u-lg-12-24,.pure-u-lg-13-24,.pure-u-lg-14-24,.pure-u-lg-15-24,.pure-u-lg-16-24,.pure-u-lg-17-24,.pure-u-lg-18-24,.pure-u-lg-19-24,.pure-u-lg-20-24,.pure-u-lg-21-24,.pure-u-lg-22-24,.pure-u-lg-23-24,.pure-u-lg-24-24{display:inline-block;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-lg-1-24{width:4.1667%}.pure-u-lg-1-12,.pure-u-lg-2-24{width:8.3333%}.pure-u-lg-1-8,.pure-u-lg-3-24{width:12.5%}.pure-u-lg-1-6,.pure-u-lg-4-24{width:16.6667%}.pure-u-lg-1-5{width:20%}.pure-u-lg-5-24{width:20.8333%}.pure-u-lg-1-4,.pure-u-lg-6-24{width:25%}.pure-u-lg-7-24{width:29.1667%}.pure-u-lg-1-3,.pure-u-lg-8-24{width:33.3333%}.pure-u-lg-3-8,.pure-u-lg-9-24{width:37.5%}.pure-u-lg-2-5{width:40%}.pure-u-lg-5-12,.pure-u-lg-10-24{width:41.6667%}.pure-u-lg-11-24{width:45.8333%}.pure-u-lg-1-2,.pure-u-lg-12-24{width:50%}.pure-u-lg-13-24{width:54.1667%}.pure-u-lg-7-12,.pure-u-lg-14-24{width:58.3333%}.pure-u-lg-3-5{width:60%}.pure-u-lg-5-8,.pure-u-lg-15-24{width:62.5%}.pure-u-lg-2-3,.pure-u-lg-16-24{width:66.6667%}.pure-u-lg-17-24{width:70.8333%}.pure-u-lg-3-4,.pure-u-lg-18-24{width:75%}.pure-u-lg-19-24{width:79.1667%}.pure-u-lg-4-5{width:80%}.pure-u-lg-5-6,.pure-u-lg-20-24{width:83.3333%}.pure-u-lg-7-8,.pure-u-lg-21-24{width:87.5%}.pure-u-lg-11-12,.pure-u-lg-22-24{width:91.6667%}.pure-u-lg-23-24{width:95.8333%}.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-5-5,.pure-u-lg-24-24{width:100%}.pure-u-1,.pure-u-1-1,.pure-u-1-2,.pure-u-1-3,.pure-u-1-4,.pure-u-1-5,.pure-u-1-6,.pure-u-1-8,.pure-u-1-12,.pure-u-1-24,.pure-u-2-3,.pure-u-2-5,.pure-u-2-24,.pure-u-3-4,.pure-u-3-5,.pure-u-3-8,.pure-u-3-24,.pure-u-4-5,.pure-u-4-24,.pure-u-5-5,.pure-u-5-6,.pure-u-5-8,.pure-u-5-12,.pure-u-5-24,.pure-u-6-24,.pure-u-7-8,.pure-u-7-12,.pure-u-7-24,.pure-u-8-24,.pure-u-9-24,.pure-u-10-24,.pure-u-11-12,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%;*width:4.1357%}.pure-u-1-12,.pure-u-2-24{width:8.3333%;*width:8.3023%}.pure-u-1-8,.pure-u-3-24{width:12.5%;*width:12.469%}.pure-u-1-6,.pure-u-4-24{width:16.6667%;*width:16.6357%}.pure-u-1-5{width:20%;*width:19.969%}.pure-u-5-24{width:20.8333%;*width:20.8023%}.pure-u-1-4,.pure-u-6-24{width:25%;*width:24.969%}.pure-u-7-24{width:29.1667%;*width:29.1357%}.pure-u-1-3,.pure-u-8-24{width:33.3333%;*width:33.3023%}.pure-u-3-8,.pure-u-9-24{width:37.5%;*width:37.469%}.pure-u-2-5{width:40%;*width:39.969%}.pure-u-5-12,.pure-u-10-24{width:41.6667%;*width:41.6357%}.pure-u-11-24{width:45.8333%;*width:45.8023%}.pure-u-1-2,.pure-u-12-24{width:50%;*width:49.969%}.pure-u-13-24{width:54.1667%;*width:54.1357%}.pure-u-7-12,.pure-u-14-24{width:58.3333%;*width:58.3023%}.pure-u-3-5{width:60%;*width:59.969%}.pure-u-5-8,.pure-u-15-24{width:62.5%;*width:62.469%}.pure-u-2-3,.pure-u-16-24{width:66.6667%;*width:66.6357%}.pure-u-17-24{width:70.8333%;*width:70.8023%}.pure-u-3-4,.pure-u-18-24{width:75%;*width:74.969%}.pure-u-19-24{width:79.1667%;*width:79.1357%}.pure-u-4-5{width:80%;*width:79.969%}.pure-u-5-6,.pure-u-20-24{width:83.3333%;*width:83.3023%}.pure-u-7-8,.pure-u-21-24{width:87.5%;*width:87.469%}.pure-u-11-12,.pure-u-22-24{width:91.6667%;*width:91.6357%}.pure-u-23-24{width:95.8333%;*width:95.8023%}.pure-u-1,.pure-u-1-1,.pure-u-5-5,.pure-u-24-24{width:100%}.pure-menu{box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:1}.pure-menu-item,.pure-menu-list{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.pure-menu-heading,.pure-menu-link{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-separator{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu-horizontal .pure-menu-children .pure-menu-separator,.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{display:block;width:auto}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#1d1f21}.pure-menu-disabled,.pure-menu-heading,.pure-menu-link{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent}.pure-menu-active>.pure-menu-link,.pure-menu-link:focus,.pure-menu-link:hover{background-color:#282a2e}.pure-menu-selected .pure-menu-link,.pure-menu-selected .pure-menu-link:visited{color:#e2e0de}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#e2e0de;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background-color:#e0e0e0;color:#e2e0de;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td,.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0}.highlight .hll{background-color:#373b41}.highlight{background:#101112;color:#c5c8c6}.highlight .c{color:#969896}.highlight .err{color:#c66}.highlight .k{color:#b294bb}.highlight .l{color:#de935f}.highlight .n{color:#c5c8c6}.highlight .o{color:#8abeb7}.highlight .p{color:#c5c8c6}.highlight .c1,.highlight .cm,.highlight .cp,.highlight .cs{color:#969896}.highlight .gd{color:#c66}.highlight .ge{font-style:italic}.highlight .gh{color:#c5c8c6;font-weight:700}.highlight .gi{color:#b5bd68}.highlight .gp{color:#969896}.highlight .gp,.highlight .gs,.highlight .gu{font-weight:700}.highlight .gu{color:#8abeb7}.highlight .kc,.highlight .kd{color:#b294bb}.highlight .kn{color:#8abeb7}.highlight .kp,.highlight .kr{color:#b294bb}.highlight .kt{color:#f0c674}.highlight .ld{color:#b5bd68}.highlight .m{color:#de935f}.highlight .s{color:#b5bd68}.highlight .na{color:#81a2be}.highlight .nb{color:#c5c8c6}.highlight .nc{color:#f0c674}.highlight .no{color:#c66}.highlight .nd{color:#8abeb7}.highlight .ni{color:#c5c8c6}.highlight .ne{color:#c66}.highlight .nf{color:#81a2be}.highlight .nl{color:#c5c8c6}.highlight .nn{color:#f0c674}.highlight .nx{color:#81a2be}.highlight .py{color:#c5c8c6}.highlight .nt{color:#8abeb7}.highlight .nv{color:#c66}.highlight .ow{color:#8abeb7}.highlight .w{color:#c5c8c6}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#de935f}.highlight .sb{color:#b5bd68}.highlight .sc{color:#c5c8c6}.highlight .sd{color:#969896}.highlight .s2{color:#b5bd68}.highlight .se{color:#de935f}.highlight .sh{color:#b5bd68}.highlight .si{color:#de935f}.highlight .s1,.highlight .sr,.highlight .ss,.highlight .sx{color:#b5bd68}.highlight .bp{color:#c5c8c6}.highlight .vc,.highlight .vg,.highlight .vi{color:#c66}.highlight .il{color:#de935f}body{background-color:#1d1f21;color:#c5c8c6;font-display:swap;font-family:Source Sans Pro,sans-serif;font-size:18px;font-style:normal;font-weight:400}abbr,cite,q{font-family:Source Serif Pro,serif}cite,em,q{font-style:italic}b,bold,dt,strong{font-weight:700}code,kbd,pre,samp{font-family:Source Code Pro,monospace}kbd,samp{background-color:#282a2e}.highlight,code,kbd,pre,samp{border:0;border-radius:.25em;padding:0 .125em}mark{background-color:#f0c674}blockquote{border-left:.5em solid #969896;border-radius:.25em;margin-left:0;padding-left:2em}a{color:#81a2be}a:hover,a:hover:visited{color:#8abeb7}a:visited{color:#b294bb}hr{border:0;border-top:1px dashed #c5c8c6}::-moz-selection{background-color:#373b41}::selection{background-color:#373b41}.pure-g [class*=pure-u],button,html,input,select,textarea{color:#c5c8c6;font-family:Source Sans Pro,sans-serif;font-weight:400}.pure-table{border:1px solid #969896;color:#c5c8c6;background-color:#1d1f21}.pure-table td,.pure-table th{border-left:1px solid #969896}.pure-table thead{color:#c5c8c6;background-color:#282a2e}.pure-menu a,.pure-menu a:hover,.pure-menu a:hover:visited,.pure-menu a:visited{color:#c5c8c6}.pure-menu-header:hover,.pure-menu-item:hover{background-color:#282a2e}.pure-menu-disabled:hover{background-color:transparent}.footer-content{border-top:1px solid #c5c8c6}.navigation-content{border-bottom:1px solid #c5c8c6}.navigation-header{font-size:1.25em}.navigation-header a{color:#c5c8c6}.navigation-header-subtitle{font-family:Source Serif Pro,serif}.footer-content,.navigation-content,.pagination-content{display:table;margin:0 auto;text-align:center;width:100%}figure{text-align:center}figure img{margin:0 auto}.post-title{font-family:Source Serif Pro,serif;font-weight:700;margin-bottom:0}.post-meta{font-size:.9em;margin:0 0 .5em}.post-meta a{text-decoration:none}.post-meta a:hover{text-decoration:underline}.post-divider{border-top:1px solid #c5c8c6}.pull-end{float:right}.pull-start,[dir=rtl] .pull-end{float:left}[dir=rtl] pull-start{float:right}.fixup{position:relative;top:-.05em} \ No newline at end of file diff --git a/public/assets/style.css b/public/assets/style.css new file mode 100644 index 0000000..56b3743 --- /dev/null +++ b/public/assets/style.css @@ -0,0 +1 @@ +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{max-width:100ch;margin:auto}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#e2e0de}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,Droid Sans,Helvetica,Arial,sans-serif;display:flex;flex-flow:row wrap;align-content:flex-start}@media (-ms-high-contrast:active),(-ms-high-contrast:none){table .pure-g{display:block}}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class*=pure-u]{font-family:sans-serif}@media screen and (min-width:35.5em){.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-1-2,.pure-u-sm-1-3,.pure-u-sm-1-4,.pure-u-sm-1-5,.pure-u-sm-1-6,.pure-u-sm-1-8,.pure-u-sm-1-12,.pure-u-sm-1-24,.pure-u-sm-2-3,.pure-u-sm-2-5,.pure-u-sm-2-24,.pure-u-sm-3-4,.pure-u-sm-3-5,.pure-u-sm-3-8,.pure-u-sm-3-24,.pure-u-sm-4-5,.pure-u-sm-4-24,.pure-u-sm-5-5,.pure-u-sm-5-6,.pure-u-sm-5-8,.pure-u-sm-5-12,.pure-u-sm-5-24,.pure-u-sm-6-24,.pure-u-sm-7-8,.pure-u-sm-7-12,.pure-u-sm-7-24,.pure-u-sm-8-24,.pure-u-sm-9-24,.pure-u-sm-10-24,.pure-u-sm-11-12,.pure-u-sm-11-24,.pure-u-sm-12-24,.pure-u-sm-13-24,.pure-u-sm-14-24,.pure-u-sm-15-24,.pure-u-sm-16-24,.pure-u-sm-17-24,.pure-u-sm-18-24,.pure-u-sm-19-24,.pure-u-sm-20-24,.pure-u-sm-21-24,.pure-u-sm-22-24,.pure-u-sm-23-24,.pure-u-sm-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-sm-1-24{width:4.1667%;*width:4.1357%}.pure-u-sm-1-12,.pure-u-sm-2-24{width:8.3333%;*width:8.3023%}.pure-u-sm-1-8,.pure-u-sm-3-24{width:12.5%;*width:12.469%}.pure-u-sm-1-6,.pure-u-sm-4-24{width:16.6667%;*width:16.6357%}.pure-u-sm-1-5{width:20%;*width:19.969%}.pure-u-sm-5-24{width:20.8333%;*width:20.8023%}.pure-u-sm-1-4,.pure-u-sm-6-24{width:25%;*width:24.969%}.pure-u-sm-7-24{width:29.1667%;*width:29.1357%}.pure-u-sm-1-3,.pure-u-sm-8-24{width:33.3333%;*width:33.3023%}.pure-u-sm-3-8,.pure-u-sm-9-24{width:37.5%;*width:37.469%}.pure-u-sm-2-5{width:40%;*width:39.969%}.pure-u-sm-5-12,.pure-u-sm-10-24{width:41.6667%;*width:41.6357%}.pure-u-sm-11-24{width:45.8333%;*width:45.8023%}.pure-u-sm-1-2,.pure-u-sm-12-24{width:50%;*width:49.969%}.pure-u-sm-13-24{width:54.1667%;*width:54.1357%}.pure-u-sm-7-12,.pure-u-sm-14-24{width:58.3333%;*width:58.3023%}.pure-u-sm-3-5{width:60%;*width:59.969%}.pure-u-sm-5-8,.pure-u-sm-15-24{width:62.5%;*width:62.469%}.pure-u-sm-2-3,.pure-u-sm-16-24{width:66.6667%;*width:66.6357%}.pure-u-sm-17-24{width:70.8333%;*width:70.8023%}.pure-u-sm-3-4,.pure-u-sm-18-24{width:75%;*width:74.969%}.pure-u-sm-19-24{width:79.1667%;*width:79.1357%}.pure-u-sm-4-5{width:80%;*width:79.969%}.pure-u-sm-5-6,.pure-u-sm-20-24{width:83.3333%;*width:83.3023%}.pure-u-sm-7-8,.pure-u-sm-21-24{width:87.5%;*width:87.469%}.pure-u-sm-11-12,.pure-u-sm-22-24{width:91.6667%;*width:91.6357%}.pure-u-sm-23-24{width:95.8333%;*width:95.8023%}.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-5-5,.pure-u-sm-24-24{width:100%}}@media screen and (min-width:48em){.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-1-2,.pure-u-md-1-3,.pure-u-md-1-4,.pure-u-md-1-5,.pure-u-md-1-6,.pure-u-md-1-8,.pure-u-md-1-12,.pure-u-md-1-24,.pure-u-md-2-3,.pure-u-md-2-5,.pure-u-md-2-24,.pure-u-md-3-4,.pure-u-md-3-5,.pure-u-md-3-8,.pure-u-md-3-24,.pure-u-md-4-5,.pure-u-md-4-24,.pure-u-md-5-5,.pure-u-md-5-6,.pure-u-md-5-8,.pure-u-md-5-12,.pure-u-md-5-24,.pure-u-md-6-24,.pure-u-md-7-8,.pure-u-md-7-12,.pure-u-md-7-24,.pure-u-md-8-24,.pure-u-md-9-24,.pure-u-md-10-24,.pure-u-md-11-12,.pure-u-md-11-24,.pure-u-md-12-24,.pure-u-md-13-24,.pure-u-md-14-24,.pure-u-md-15-24,.pure-u-md-16-24,.pure-u-md-17-24,.pure-u-md-18-24,.pure-u-md-19-24,.pure-u-md-20-24,.pure-u-md-21-24,.pure-u-md-22-24,.pure-u-md-23-24,.pure-u-md-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-md-1-24{width:4.1667%;*width:4.1357%}.pure-u-md-1-12,.pure-u-md-2-24{width:8.3333%;*width:8.3023%}.pure-u-md-1-8,.pure-u-md-3-24{width:12.5%;*width:12.469%}.pure-u-md-1-6,.pure-u-md-4-24{width:16.6667%;*width:16.6357%}.pure-u-md-1-5{width:20%;*width:19.969%}.pure-u-md-5-24{width:20.8333%;*width:20.8023%}.pure-u-md-1-4,.pure-u-md-6-24{width:25%;*width:24.969%}.pure-u-md-7-24{width:29.1667%;*width:29.1357%}.pure-u-md-1-3,.pure-u-md-8-24{width:33.3333%;*width:33.3023%}.pure-u-md-3-8,.pure-u-md-9-24{width:37.5%;*width:37.469%}.pure-u-md-2-5{width:40%;*width:39.969%}.pure-u-md-5-12,.pure-u-md-10-24{width:41.6667%;*width:41.6357%}.pure-u-md-11-24{width:45.8333%;*width:45.8023%}.pure-u-md-1-2,.pure-u-md-12-24{width:50%;*width:49.969%}.pure-u-md-13-24{width:54.1667%;*width:54.1357%}.pure-u-md-7-12,.pure-u-md-14-24{width:58.3333%;*width:58.3023%}.pure-u-md-3-5{width:60%;*width:59.969%}.pure-u-md-5-8,.pure-u-md-15-24{width:62.5%;*width:62.469%}.pure-u-md-2-3,.pure-u-md-16-24{width:66.6667%;*width:66.6357%}.pure-u-md-17-24{width:70.8333%;*width:70.8023%}.pure-u-md-3-4,.pure-u-md-18-24{width:75%;*width:74.969%}.pure-u-md-19-24{width:79.1667%;*width:79.1357%}.pure-u-md-4-5{width:80%;*width:79.969%}.pure-u-md-5-6,.pure-u-md-20-24{width:83.3333%;*width:83.3023%}.pure-u-md-7-8,.pure-u-md-21-24{width:87.5%;*width:87.469%}.pure-u-md-11-12,.pure-u-md-22-24{width:91.6667%;*width:91.6357%}.pure-u-md-23-24{width:95.8333%;*width:95.8023%}.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-5-5,.pure-u-md-24-24{width:100%}}@media screen and (min-width:64em){.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-1-2,.pure-u-lg-1-3,.pure-u-lg-1-4,.pure-u-lg-1-5,.pure-u-lg-1-6,.pure-u-lg-1-8,.pure-u-lg-1-12,.pure-u-lg-1-24,.pure-u-lg-2-3,.pure-u-lg-2-5,.pure-u-lg-2-24,.pure-u-lg-3-4,.pure-u-lg-3-5,.pure-u-lg-3-8,.pure-u-lg-3-24,.pure-u-lg-4-5,.pure-u-lg-4-24,.pure-u-lg-5-5,.pure-u-lg-5-6,.pure-u-lg-5-8,.pure-u-lg-5-12,.pure-u-lg-5-24,.pure-u-lg-6-24,.pure-u-lg-7-8,.pure-u-lg-7-12,.pure-u-lg-7-24,.pure-u-lg-8-24,.pure-u-lg-9-24,.pure-u-lg-10-24,.pure-u-lg-11-12,.pure-u-lg-11-24,.pure-u-lg-12-24,.pure-u-lg-13-24,.pure-u-lg-14-24,.pure-u-lg-15-24,.pure-u-lg-16-24,.pure-u-lg-17-24,.pure-u-lg-18-24,.pure-u-lg-19-24,.pure-u-lg-20-24,.pure-u-lg-21-24,.pure-u-lg-22-24,.pure-u-lg-23-24,.pure-u-lg-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-lg-1-24{width:4.1667%;*width:4.1357%}.pure-u-lg-1-12,.pure-u-lg-2-24{width:8.3333%;*width:8.3023%}.pure-u-lg-1-8,.pure-u-lg-3-24{width:12.5%;*width:12.469%}.pure-u-lg-1-6,.pure-u-lg-4-24{width:16.6667%;*width:16.6357%}.pure-u-lg-1-5{width:20%;*width:19.969%}.pure-u-lg-5-24{width:20.8333%;*width:20.8023%}.pure-u-lg-1-4,.pure-u-lg-6-24{width:25%;*width:24.969%}.pure-u-lg-7-24{width:29.1667%;*width:29.1357%}.pure-u-lg-1-3,.pure-u-lg-8-24{width:33.3333%;*width:33.3023%}.pure-u-lg-3-8,.pure-u-lg-9-24{width:37.5%;*width:37.469%}.pure-u-lg-2-5{width:40%;*width:39.969%}.pure-u-lg-5-12,.pure-u-lg-10-24{width:41.6667%;*width:41.6357%}.pure-u-lg-11-24{width:45.8333%;*width:45.8023%}.pure-u-lg-1-2,.pure-u-lg-12-24{width:50%;*width:49.969%}.pure-u-lg-13-24{width:54.1667%;*width:54.1357%}.pure-u-lg-7-12,.pure-u-lg-14-24{width:58.3333%;*width:58.3023%}.pure-u-lg-3-5{width:60%;*width:59.969%}.pure-u-lg-5-8,.pure-u-lg-15-24{width:62.5%;*width:62.469%}.pure-u-lg-2-3,.pure-u-lg-16-24{width:66.6667%;*width:66.6357%}.pure-u-lg-17-24{width:70.8333%;*width:70.8023%}.pure-u-lg-3-4,.pure-u-lg-18-24{width:75%;*width:74.969%}.pure-u-lg-19-24{width:79.1667%;*width:79.1357%}.pure-u-lg-4-5{width:80%;*width:79.969%}.pure-u-lg-5-6,.pure-u-lg-20-24{width:83.3333%;*width:83.3023%}.pure-u-lg-7-8,.pure-u-lg-21-24{width:87.5%;*width:87.469%}.pure-u-lg-11-12,.pure-u-lg-22-24{width:91.6667%;*width:91.6357%}.pure-u-lg-23-24{width:95.8333%;*width:95.8023%}.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-5-5,.pure-u-lg-24-24{width:100%}}@media screen and (min-width:80em){.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-1-2,.pure-u-xl-1-3,.pure-u-xl-1-4,.pure-u-xl-1-5,.pure-u-xl-1-6,.pure-u-xl-1-8,.pure-u-xl-1-12,.pure-u-xl-1-24,.pure-u-xl-2-3,.pure-u-xl-2-5,.pure-u-xl-2-24,.pure-u-xl-3-4,.pure-u-xl-3-5,.pure-u-xl-3-8,.pure-u-xl-3-24,.pure-u-xl-4-5,.pure-u-xl-4-24,.pure-u-xl-5-5,.pure-u-xl-5-6,.pure-u-xl-5-8,.pure-u-xl-5-12,.pure-u-xl-5-24,.pure-u-xl-6-24,.pure-u-xl-7-8,.pure-u-xl-7-12,.pure-u-xl-7-24,.pure-u-xl-8-24,.pure-u-xl-9-24,.pure-u-xl-10-24,.pure-u-xl-11-12,.pure-u-xl-11-24,.pure-u-xl-12-24,.pure-u-xl-13-24,.pure-u-xl-14-24,.pure-u-xl-15-24,.pure-u-xl-16-24,.pure-u-xl-17-24,.pure-u-xl-18-24,.pure-u-xl-19-24,.pure-u-xl-20-24,.pure-u-xl-21-24,.pure-u-xl-22-24,.pure-u-xl-23-24,.pure-u-xl-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-xl-1-24{width:4.1667%;*width:4.1357%}.pure-u-xl-1-12,.pure-u-xl-2-24{width:8.3333%;*width:8.3023%}.pure-u-xl-1-8,.pure-u-xl-3-24{width:12.5%;*width:12.469%}.pure-u-xl-1-6,.pure-u-xl-4-24{width:16.6667%;*width:16.6357%}.pure-u-xl-1-5{width:20%;*width:19.969%}.pure-u-xl-5-24{width:20.8333%;*width:20.8023%}.pure-u-xl-1-4,.pure-u-xl-6-24{width:25%;*width:24.969%}.pure-u-xl-7-24{width:29.1667%;*width:29.1357%}.pure-u-xl-1-3,.pure-u-xl-8-24{width:33.3333%;*width:33.3023%}.pure-u-xl-3-8,.pure-u-xl-9-24{width:37.5%;*width:37.469%}.pure-u-xl-2-5{width:40%;*width:39.969%}.pure-u-xl-5-12,.pure-u-xl-10-24{width:41.6667%;*width:41.6357%}.pure-u-xl-11-24{width:45.8333%;*width:45.8023%}.pure-u-xl-1-2,.pure-u-xl-12-24{width:50%;*width:49.969%}.pure-u-xl-13-24{width:54.1667%;*width:54.1357%}.pure-u-xl-7-12,.pure-u-xl-14-24{width:58.3333%;*width:58.3023%}.pure-u-xl-3-5{width:60%;*width:59.969%}.pure-u-xl-5-8,.pure-u-xl-15-24{width:62.5%;*width:62.469%}.pure-u-xl-2-3,.pure-u-xl-16-24{width:66.6667%;*width:66.6357%}.pure-u-xl-17-24{width:70.8333%;*width:70.8023%}.pure-u-xl-3-4,.pure-u-xl-18-24{width:75%;*width:74.969%}.pure-u-xl-19-24{width:79.1667%;*width:79.1357%}.pure-u-xl-4-5{width:80%;*width:79.969%}.pure-u-xl-5-6,.pure-u-xl-20-24{width:83.3333%;*width:83.3023%}.pure-u-xl-7-8,.pure-u-xl-21-24{width:87.5%;*width:87.469%}.pure-u-xl-11-12,.pure-u-xl-22-24{width:91.6667%;*width:91.6357%}.pure-u-xl-23-24{width:95.8333%;*width:95.8023%}.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-5-5,.pure-u-xl-24-24{width:100%}}.pure-u-1,.pure-u-1-1,.pure-u-1-2,.pure-u-1-3,.pure-u-1-4,.pure-u-1-5,.pure-u-1-6,.pure-u-1-8,.pure-u-1-12,.pure-u-1-24,.pure-u-2-3,.pure-u-2-5,.pure-u-2-24,.pure-u-3-4,.pure-u-3-5,.pure-u-3-8,.pure-u-3-24,.pure-u-4-5,.pure-u-4-24,.pure-u-5-5,.pure-u-5-6,.pure-u-5-8,.pure-u-5-12,.pure-u-5-24,.pure-u-6-24,.pure-u-7-8,.pure-u-7-12,.pure-u-7-24,.pure-u-8-24,.pure-u-9-24,.pure-u-10-24,.pure-u-11-12,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%;*width:4.1357%}.pure-u-1-12,.pure-u-2-24{width:8.3333%;*width:8.3023%}.pure-u-1-8,.pure-u-3-24{width:12.5%;*width:12.469%}.pure-u-1-6,.pure-u-4-24{width:16.6667%;*width:16.6357%}.pure-u-1-5{width:20%;*width:19.969%}.pure-u-5-24{width:20.8333%;*width:20.8023%}.pure-u-1-4,.pure-u-6-24{width:25%;*width:24.969%}.pure-u-7-24{width:29.1667%;*width:29.1357%}.pure-u-1-3,.pure-u-8-24{width:33.3333%;*width:33.3023%}.pure-u-3-8,.pure-u-9-24{width:37.5%;*width:37.469%}.pure-u-2-5{width:40%;*width:39.969%}.pure-u-5-12,.pure-u-10-24{width:41.6667%;*width:41.6357%}.pure-u-11-24{width:45.8333%;*width:45.8023%}.pure-u-1-2,.pure-u-12-24{width:50%;*width:49.969%}.pure-u-13-24{width:54.1667%;*width:54.1357%}.pure-u-7-12,.pure-u-14-24{width:58.3333%;*width:58.3023%}.pure-u-3-5{width:60%;*width:59.969%}.pure-u-5-8,.pure-u-15-24{width:62.5%;*width:62.469%}.pure-u-2-3,.pure-u-16-24{width:66.6667%;*width:66.6357%}.pure-u-17-24{width:70.8333%;*width:70.8023%}.pure-u-3-4,.pure-u-18-24{width:75%;*width:74.969%}.pure-u-19-24{width:79.1667%;*width:79.1357%}.pure-u-4-5{width:80%;*width:79.969%}.pure-u-5-6,.pure-u-20-24{width:83.3333%;*width:83.3023%}.pure-u-7-8,.pure-u-21-24{width:87.5%;*width:87.469%}.pure-u-11-12,.pure-u-22-24{width:91.6667%;*width:91.6357%}.pure-u-23-24{width:95.8333%;*width:95.8023%}.pure-u-1,.pure-u-1-1,.pure-u-5-5,.pure-u-24-24{width:100%}.pure-menu{box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:1}.pure-menu-item,.pure-menu-list{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.pure-menu-heading,.pure-menu-link{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-separator{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu-horizontal .pure-menu-children .pure-menu-separator,.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{display:block;width:auto}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#1d1f21}.pure-menu-disabled,.pure-menu-heading,.pure-menu-link{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent}.pure-menu-active>.pure-menu-link,.pure-menu-link:focus,.pure-menu-link:hover{background-color:#282a2e}.pure-menu-selected .pure-menu-link,.pure-menu-selected .pure-menu-link:visited{color:#e2e0de}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#e2e0de;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background-color:#e0e0e0;color:#e2e0de;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td,.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0}.highlight .hll{background-color:#373b41}.highlight{background:#101112;color:#c5c8c6}.highlight .c{color:#969896}.highlight .err{color:#c66}.highlight .k{color:#b294bb}.highlight .l{color:#de935f}.highlight .n{color:#c5c8c6}.highlight .o{color:#8abeb7}.highlight .p{color:#c5c8c6}.highlight .c1,.highlight .cm,.highlight .cp,.highlight .cs{color:#969896}.highlight .gd{color:#c66}.highlight .ge{font-style:italic}.highlight .gh{color:#c5c8c6;font-weight:700}.highlight .gi{color:#b5bd68}.highlight .gp{color:#969896}.highlight .gp,.highlight .gs,.highlight .gu{font-weight:700}.highlight .gu{color:#8abeb7}.highlight .kc,.highlight .kd{color:#b294bb}.highlight .kn{color:#8abeb7}.highlight .kp,.highlight .kr{color:#b294bb}.highlight .kt{color:#f0c674}.highlight .ld{color:#b5bd68}.highlight .m{color:#de935f}.highlight .s{color:#b5bd68}.highlight .na{color:#81a2be}.highlight .nb{color:#c5c8c6}.highlight .nc{color:#f0c674}.highlight .no{color:#c66}.highlight .nd{color:#8abeb7}.highlight .ni{color:#c5c8c6}.highlight .ne{color:#c66}.highlight .nf{color:#81a2be}.highlight .nl{color:#c5c8c6}.highlight .nn{color:#f0c674}.highlight .nx{color:#81a2be}.highlight .py{color:#c5c8c6}.highlight .nt{color:#8abeb7}.highlight .nv{color:#c66}.highlight .ow{color:#8abeb7}.highlight .w{color:#c5c8c6}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#de935f}.highlight .sb{color:#b5bd68}.highlight .sc{color:#c5c8c6}.highlight .sd{color:#969896}.highlight .s2{color:#b5bd68}.highlight .se{color:#de935f}.highlight .sh{color:#b5bd68}.highlight .si{color:#de935f}.highlight .s1,.highlight .sr,.highlight .ss,.highlight .sx{color:#b5bd68}.highlight .bp{color:#c5c8c6}.highlight .vc,.highlight .vg,.highlight .vi{color:#c66}.highlight .il{color:#de935f}body{background-color:#1d1f21;color:#c5c8c6;font-display:swap;font-family:Source Sans Pro,sans-serif;font-size:18px;font-style:normal;font-weight:400}abbr,cite,q{font-family:Source Serif Pro,serif}cite,em,q{font-style:italic}b,bold,dt,strong{font-weight:700}code,kbd,pre,samp{font-family:Source Code Pro,monospace}kbd,samp{background-color:#282a2e}.highlight,code,kbd,pre,samp{border:0;border-radius:.25em;padding:0 .125em}mark{background-color:#f0c674}blockquote{border-left:.5em solid #969896;border-radius:.25em;margin-left:0;padding-left:2em}a{color:#81a2be}a:hover,a:hover:visited{color:#8abeb7}a:visited{color:#b294bb}hr{border:0;border-top:1px dashed #c5c8c6}::-moz-selection{background-color:#373b41}::selection{background-color:#373b41}.pure-g [class*=pure-u],button,html,input,select,textarea{color:#c5c8c6;font-family:Source Sans Pro,sans-serif;font-weight:400}.pure-table{border:1px solid #969896;color:#c5c8c6;background-color:#1d1f21}.pure-table td,.pure-table th{border-left:1px solid #969896}.pure-table thead{color:#c5c8c6;background-color:#282a2e}.pure-menu a,.pure-menu a:hover,.pure-menu a:hover:visited,.pure-menu a:visited{color:#c5c8c6}.pure-menu-header:hover,.pure-menu-item:hover{background-color:#282a2e}.pure-menu-disabled:hover{background-color:transparent}.footer-content{border-top:1px solid #c5c8c6}.navigation-content{border-bottom:1px solid #c5c8c6}.navigation-header{font-size:1.25em}.navigation-header a{color:#c5c8c6}.navigation-header-subtitle{font-family:Source Serif Pro,serif}.footer-content,.navigation-content,.pagination-content{display:table;margin:0 auto;text-align:center;width:100%}figure{text-align:center}figure img{margin:0 auto}.post-title{font-family:Source Serif Pro,serif;font-weight:700;margin-bottom:0}.post-meta{font-size:.9em;margin:0 0 .5em}.post-meta a{text-decoration:none}.post-meta a:hover{text-decoration:underline}.post-divider{border-top:1px solid #c5c8c6}.pull-end{float:right}.pull-start,[dir=rtl] .pull-end{float:left}[dir=rtl] pull-start{float:right}.fixup{position:relative;top:-.05em} \ No newline at end of file diff --git a/public/img/favicon.png b/public/img/favicon.png new file mode 100644 index 0000000..91df25f Binary files /dev/null and b/public/img/favicon.png differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..9293789 --- /dev/null +++ b/public/index.html @@ -0,0 +1,480 @@ + + + + + tastyteablog + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +

+

+

+ + WireGuard VPN with 2 or more subnets +

+ + +
+
+
+

I wanted to create a WireGuard VPN with +2 subnets in different physical places, each with their own server. I couldn’t +find an example how to do that, so I wrote this one.

+
+
+

Introduction

+
+
+

I’m going to use the IP range fd69::/48 for the VPN, fd69:0:0:1::/64 for +subnet 1 and fd69:0:0:2::/64 for subnet 2. I’m going to call the server of +subnet 1 server1, its first client client1a, the second one client1b and +so on.

+
+
+

All clients in subnet 1 will connect to server1 and all clients in subnet 2 +will connect to server2. server1 and server2 will be connected. If +client1a wants to connect to client2a, the route will be: +client1a → server1 → server2 → client2a.

+
+
+
+
+

Preparations

+
+
+

Install WireGuard, create /etc/wireguard +and generate a key-pair on each participating peer.

+
+
+
+
mkdir /etc/wireguard
+cd /etc/wireguard
+umask 077
+wg genkey | tee privatekey | wg pubkey > publickey
+
+
+
+
+
+

Configure servers

+
+
+
server1:/etc/wireguard/wg0.conf:
+
+
# This peer
+[Interface]
+Address = fd69:0:0:1::1/48
+PrivateKey = <PRIVATE KEY OF server1>
+ListenPort = 51820
+
+# Server of subnet 2
+[Peer]
+PublicKey = <PUBLIC KEY OF server2>
+Endpoint = server2:51820
+AllowedIPs = fd69:0:0:2::/64
+
+# Clients of subnet 1
+[Peer]
+PublicKey = <PUBLIC KEY OF client1a>
+AllowedIPs = fd69:0:0:1::a/128
+
+[Peer]
+PublicKey = <PUBLIC KEY OF client1b>
+AllowedIPs = fd69:0:0:1::b/128
+
+
+
+
server2:/etc/wireguard/wg0.conf:
+
+
# This peer
+[Interface]
+Address = fd69:0:0:2::1/48
+PrivateKey = <PRIVATE KEY OF server2>
+ListenPort = 51820
+
+# Server of subnet 1
+[Peer]
+PublicKey = <PUBLIC KEY OF server1>
+Endpoint = server1:51820
+AllowedIPs = fd69:0:0:1::/64
+
+# Clients of subnet 2
+[Peer]
+PublicKey = <PUBLIC KEY OF client2a>
+AllowedIPs = fd69:0:0:2::a/128
+
+
+
+
+
+

Configure clients

+
+
+
client1a:/etc/wireguard/wg0.conf:
+
+
[Interface]
+Address = fd69:0:0:1::a/48
+PrivateKey = <PRIVATE KEY OF client1a>
+
+[Peer]
+PublicKey = <PUBLIC KEY OF server1>
+Endpoint = server1:51820
+AllowedIPs = fd69::/48
+PersistentKeepalive = 25
+
+
+
+
client1b:/etc/wireguard/wg0.conf:
+
+
[Interface]
+Address = fd69:0:0:1::b/48
+PrivateKey = <PRIVATE KEY OF client1b>
+
+[Peer]
+PublicKey = <PUBLIC KEY OF server1>
+Endpoint = server1:51820
+AllowedIPs = fd69::/48
+PersistentKeepalive = 25
+
+
+
+
client2a:/etc/wireguard/wg0.conf:
+
+
[Interface]
+Address = fd69:0:0:2::a/48
+PrivateKey = <PRIVATE KEY OF client2a>
+
+[Peer]
+PublicKey = <PUBLIC KEY OF server2>
+Endpoint = server1:51820
+AllowedIPs = fd69::/48
+PersistentKeepalive = 25
+
+
+
+

The AllowedIPs setting acts as a routing table. When a peer tries to send a +packet to an IP, it will check AllowedIPs, and if the IP appears in the list, +it will send it through the WireGuard interface.

+
+
+

The PersistentKeepalive setting ensures that the connection is maintained and +that the peer continues to be reachable, even behind a NAT.

+
+
+
+
+

Start VPN

+
+
+

Run wg-quick up wg0 on each peer.

+
+
+
+
+

Further reading

+
+
+

The article How to easily configure WireGuard +by Stavros Korokithakis helped me a great deal in understanding WireGuard.

+
+
+
+ +
+

+

+

+

+ + Using AsciiDoc(tor) with Gitea +

+ + +
+
+
+

In this blogpost I describe what I did to get AsciiDoc support into +Gitea. If you want more than syntax highlighting and basic +formatting, Gitea has to be patched unfortunately(this +issue has already been reported). +But I think most people will only need to edit 1 configuration file and are +done.

+
+
+

Asciidoctor or AsciiDoc?

+
+
+

Asciidoctor has inbuilt support for +highlight.js, the solution Gitea +uses and is therefore the best choice in most scenarios. If you can’t or don’t +want to use it you can use AsciiDoc.

+
+
+

Add the following section to conf/app.ini in your Gitea path. The change +causes .adoc files to be rendered with asciidoctor.

+
+
+
+
[markup.asciidoc]
+ENABLED = true
+; List of file extensions that should be rendered by an external command
+FILE_EXTENSIONS = .adoc,.asciidoc
+; External command to render all matching extensions
+RENDER_COMMAND = "asciidoctor --backend=html5 --no-header-footer --attribute source-highlighter=highlightjs --out-file=- -"
+; Don't pass the file on STDIN, pass the filename as argument instead.
+IS_INPUT_FILE = false
+
+
+
+

If you want to use asciidoc instead the command would be: +asciidoc --backend=xhtml11 --no-header-footer --attribute +source-highlighter=highlight --out-file=- -. I would choose the xhtml11 +backend because it is the only one that encloses code snippets with <code> +tags. Instead of +highlight you can +use source-highlight or +Pygments.

+
+
+

If you use asciidoctor and don’t need tables or other fancy stuff you’re now +done! If you use asciidoc, you’ll have to patch Gitea to get syntax +highlighting.

+
+
+
+
+

Patching Gitea

+
+
+

The sanitizer strips almost all attributes from HTML-tags, as a security +precaution. I’ve added exceptions for:

+
+
+
    +
  • +

    class attributes on all the tags Asciidoctor introduces,

    +
  • +
  • +

    Numerous attributes on table tags,

    +
  • +
  • +

    align and valign on td tags,

    +
  • +
  • +

    style attributes on span tags, but only if they contain nothing more than +color and font definitions.

    +
  • +
+
+
+

If you use Asciidoctor with highlight.js output, you don’t need to allow style +attributes, if you don’t use tables you can omit the lines that deal with them +and the class exception is only useful if you add custom CSS to use them.

+
+
+

Apply the patch with patch -p1 < gitea_relax-sanitizer.patch.

+
+
+
+
diff -ur a/modules/markup/sanitizer.go b/modules/markup/sanitizer.go
+--- a/modules/markup/sanitizer.go   2019-01-26 16:04:56.014108339 +0100
++++ b/modules/markup/sanitizer.go   2019-01-26 16:03:21.776401012 +0100
+@@ -38,6 +38,16 @@
+ 
+        // Custom URL-Schemes
+        sanitizer.policy.AllowURLSchemes(setting.Markdown.CustomURLSchemes...)
++       // Allow style on span tags
++       sanitizer.policy.AllowAttrs("style").Matching(regexp.MustCompile(`^(background-)?color:[^;]+(; ?font[^;]+)?;?$`)).OnElements("span")
++
++       // Allow class attribute
++       sanitizer.policy.AllowAttrs("class").OnElements("code", "pre", "span", "div", "p", "table", "td")
++
++       // Allow table attributes
++       sanitizer.policy.AllowAttrs("width", "frame", "rules", "cellspacing", "cellpadding").OnElements("table")
++       sanitizer.policy.AllowAttrs("width").OnElements("col")
++       sanitizer.policy.AllowAttrs("align", "valign").OnElements("td")
+    })
+ }
+
+
+
+
+
+
+

Tables without borders

+
+
+

I used tables without borders in a manpage I wrote for the list of options. +Gitea insist on drawing borders around them, so I had to create a custom CSS +snippet.

+
+
+

In your Gitea directory, create custom/templates/custom/header.tmpl.

+
+
+
+
<style>
+    /* Additions for asciidoc */
+    .markdown:not(code) table.frame-none
+    {
+        border: 0 !important;
+    }
+    .markdown:not(code) table.grid-none *
+    {
+        border: 0 !important;
+    }
+</style>
+
+
+
+
+ +
+

+ + +
+
+ +
+
+ + + + +
+
+
+ + diff --git a/public/index.xml b/public/index.xml new file mode 100644 index 0000000..e353e9c --- /dev/null +++ b/public/index.xml @@ -0,0 +1,330 @@ + + + + tastyteablog + https://blog.tastytea.de/ + Recent content on tastyteablog + Hugo 0.54.0 -- gohugo.io + en + tastytea@tastytea.de (tastytea) + tastytea@tastytea.de (tastytea) + CC BY-NC 4.0 + Thu, 14 Feb 2019 21:38:28 +0100 + + + WireGuard VPN with 2 or more subnets + https://blog.tastytea.de/posts/wireguard-vpn-with-2-or-more-subnets/ + Thu, 14 Feb 2019 21:38:28 +0100 + tastytea@tastytea.de (tastytea) + https://blog.tastytea.de/posts/wireguard-vpn-with-2-or-more-subnets/ + <div class="paragraph"> +<p>I wanted to create a <a href="https://en.wikipedia.org/wiki/WireGuard">WireGuard</a> VPN with +2 subnets in different physical places, each with their own server. I couldn&#8217;t +find an example how to do that, so I wrote this one.</p> +</div> +<div class="sect1"> +<h2 id="_introduction">Introduction</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>I&#8217;m going to use the IP range <code>fd69::/48</code> for the VPN, <code>fd69:0:0:1::/64</code> for +subnet 1 and <code>fd69:0:0:2::/64</code> for subnet 2. I&#8217;m going to call the server of +subnet 1 <code>server1</code>, its first client <code>client1a</code>, the second one <code>client1b</code> and +so on.</p> +</div> +<div class="paragraph"> +<p>All clients in subnet 1 will connect to <code>server1</code> and all clients in subnet 2 +will connect to <code>server2</code>. <code>server1</code> and <code>server2</code> will be connected. If +<code>client1a</code> wants to connect to <code>client2a</code>, the route will be: +<code>client1a → server1 → server2 → client2a</code>.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_preparations">Preparations</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p><a href="https://www.wireguard.com/install/">Install WireGuard</a>, create <code>/etc/wireguard</code> +and generate a key-pair on each participating peer.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-sh" data-lang="sh">mkdir /etc/wireguard +<span class="nb">cd</span> /etc/wireguard +<span class="nb">umask</span> <span class="m">077</span> +wg genkey <span class="p">|</span> tee privatekey <span class="p">|</span> wg pubkey &gt; publickey</code></pre></div></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_configure_servers">Configure servers</h2> +<div class="sectionbody"> +<div class="listingblock"> +<div class="title"><code>server1:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="c1"># This peer</span> +<span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:1::1/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF server1&gt;</span> +<span class="na">ListenPort</span> <span class="o">=</span> <span class="s">51820</span> + +<span class="c1"># Server of subnet 2</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server2&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server2:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:2::/64</span> + +<span class="c1"># Clients of subnet 1</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF client1a&gt;</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:1::a/128</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF client1b&gt;</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:1::b/128</span></code></pre></div></pre> +</div> +</div> +<div class="listingblock"> +<div class="title"><code>server2:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="c1"># This peer</span> +<span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:2::1/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF server2&gt;</span> +<span class="na">ListenPort</span> <span class="o">=</span> <span class="s">51820</span> + +<span class="c1"># Server of subnet 1</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server1&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:1::/64</span> + +<span class="c1"># Clients of subnet 2</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF client2a&gt;</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:2::a/128</span></code></pre></div></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_configure_clients">Configure clients</h2> +<div class="sectionbody"> +<div class="listingblock"> +<div class="title"><code>client1a:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:1::a/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF client1a&gt;</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server1&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69::/48</span> +<span class="na">PersistentKeepalive</span> <span class="o">=</span> <span class="s">25</span></code></pre></div></pre> +</div> +</div> +<div class="listingblock"> +<div class="title"><code>client1b:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:1::b/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF client1b&gt;</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server1&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69::/48</span> +<span class="na">PersistentKeepalive</span> <span class="o">=</span> <span class="s">25</span></code></pre></div></pre> +</div> +</div> +<div class="listingblock"> +<div class="title"><code>client2a:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:2::a/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF client2a&gt;</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server2&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69::/48</span> +<span class="na">PersistentKeepalive</span> <span class="o">=</span> <span class="s">25</span></code></pre></div></pre> +</div> +</div> +<div class="paragraph"> +<p>The <code>AllowedIPs</code> setting acts as a routing table. When a peer tries to send a +packet to an IP, it will check <code>AllowedIPs</code>, and if the IP appears in the list, +it will send it through the WireGuard interface.</p> +</div> +<div class="paragraph"> +<p>The <code>PersistentKeepalive</code> setting ensures that the connection is maintained and +that the peer continues to be reachable, even behind a NAT.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_start_vpn">Start VPN</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Run <code>wg-quick up wg0</code> on each peer.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_further_reading">Further reading</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>The article <a href="https://www.stavros.io/posts/how-to-configure-wireguard/">How to easily configure WireGuard</a> +by Stavros Korokithakis helped me a great deal in understanding WireGuard.</p> +</div> +</div> +</div> + + + + Using AsciiDoc(tor) with Gitea + https://blog.tastytea.de/posts/using-asciidoc-with-gitea/ + Sat, 26 Jan 2019 13:03:36 +0100 + tastytea@tastytea.de (tastytea) + https://blog.tastytea.de/posts/using-asciidoc-with-gitea/ + <div class="paragraph"> +<p>In this blogpost I describe what I did to get AsciiDoc support into +<a href="https://gitea.io/">Gitea</a>. If you want more than syntax highlighting and basic +formatting, Gitea has to be patched unfortunately(this +<a href="https://github.com/go-gitea/gitea/issues/4935">issue</a> has already been reported). +But I think most people will only need to edit 1 configuration file and are +done.</p> +</div> +<div class="sect1"> +<h2 id="_asciidoctor_or_asciidoc">Asciidoctor or AsciiDoc?</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p><a href="https://asciidoctor.org/">Asciidoctor</a> has inbuilt support for +<a href="https://highlightjs.org/">highlight.js</a>, the solution Gitea +uses and is therefore the best choice in most scenarios. If you can&#8217;t or don&#8217;t +want to use it you can use <a href="http://asciidoc.org/">AsciiDoc</a>.</p> +</div> +<div class="paragraph"> +<p>Add the following section to <code>conf/app.ini</code> in your Gitea path. The change +causes <code>.adoc</code> files to be rendered with asciidoctor.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-ini" data-lang="ini"><span class="k">[markup.asciidoc]</span> +<span class="na">ENABLED</span> <span class="o">=</span> <span class="s">true</span> +<span class="c1">; List of file extensions that should be rendered by an external command</span> +<span class="na">FILE_EXTENSIONS</span> <span class="o">=</span> <span class="s">.adoc,.asciidoc</span> +<span class="c1">; External command to render all matching extensions</span> +<span class="na">RENDER_COMMAND</span> <span class="o">=</span> <span class="s">&#34;asciidoctor --backend=html5 --no-header-footer --attribute source-highlighter=highlightjs --out-file=- -&#34;</span> +<span class="c1">; Don&#39;t pass the file on STDIN, pass the filename as argument instead.</span> +<span class="na">IS_INPUT_FILE</span> <span class="o">=</span> <span class="s">false</span></code></pre></div></pre> +</div> +</div> +<div class="paragraph"> +<p>If you want to use asciidoc instead the command would be: +<code>asciidoc --backend=xhtml11 --no-header-footer --attribute +source-highlighter=highlight --out-file=- -</code>. I would choose the <code>xhtml11</code> +backend because it is the only one that encloses code snippets with <code>&lt;code&gt;</code> +tags. Instead of +<a href="http://www.andre-simon.de/doku/highlight/en/highlight.html">highlight</a> you can +use <a href="http://www.gnu.org/software/src-highlite/">source-highlight</a> or +<a href="http://pygments.org/">Pygments</a>.</p> +</div> +<div class="paragraph"> +<p>If you use asciidoctor and don&#8217;t need tables or other fancy stuff you&#8217;re now +done! If you use asciidoc, you&#8217;ll have to patch Gitea to get syntax +highlighting.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_patching_gitea">Patching Gitea</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>The sanitizer strips almost all attributes from HTML-tags, as a security +precaution. I&#8217;ve added exceptions for:</p> +</div> +<div class="ulist"> +<ul> +<li> +<p><code>class</code> attributes on all the tags Asciidoctor introduces,</p> +</li> +<li> +<p>Numerous attributes on <code>table</code> tags,</p> +</li> +<li> +<p><code>align</code> and <code>valign</code> on <code>td</code> tags,</p> +</li> +<li> +<p><code>style</code> attributes on <code>span</code> tags, but only if they contain nothing more than +color and font definitions.</p> +</li> +</ul> +</div> +<div class="paragraph"> +<p>If you use Asciidoctor with highlight.js output, you don&#8217;t need to allow <code>style</code> +attributes, if you don&#8217;t use tables you can omit the lines that deal with them +and the <code>class</code> exception is only useful if you add custom CSS to use them.</p> +</div> +<div class="paragraph"> +<p>Apply the patch with <code>patch -p1 &lt; gitea_relax-sanitizer.patch</code>.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-diff" data-lang="diff"><span class="gh">diff -ur a/modules/markup/sanitizer.go b/modules/markup/sanitizer.go +</span><span class="gh"></span><span class="gd">--- a/modules/markup/sanitizer.go 2019-01-26 16:04:56.014108339 +0100 +</span><span class="gd"></span><span class="gi">+++ b/modules/markup/sanitizer.go 2019-01-26 16:03:21.776401012 +0100 +</span><span class="gi"></span><span class="gu">@@ -38,6 +38,16 @@ +</span><span class="gu"></span> + // Custom URL-Schemes + sanitizer.policy.AllowURLSchemes(setting.Markdown.CustomURLSchemes...) +<span class="gi">+ // Allow style on span tags +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;style&#34;).Matching(regexp.MustCompile(`^(background-)?color:[^;]+(; ?font[^;]+)?;?$`)).OnElements(&#34;span&#34;) +</span><span class="gi">+ +</span><span class="gi">+ // Allow class attribute +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;class&#34;).OnElements(&#34;code&#34;, &#34;pre&#34;, &#34;span&#34;, &#34;div&#34;, &#34;p&#34;, &#34;table&#34;, &#34;td&#34;) +</span><span class="gi">+ +</span><span class="gi">+ // Allow table attributes +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;width&#34;, &#34;frame&#34;, &#34;rules&#34;, &#34;cellspacing&#34;, &#34;cellpadding&#34;).OnElements(&#34;table&#34;) +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;width&#34;).OnElements(&#34;col&#34;) +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;align&#34;, &#34;valign&#34;).OnElements(&#34;td&#34;) +</span><span class="gi"></span> }) + } +</code></pre></div></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_tables_without_borders">Tables without borders</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>I used tables without borders in a manpage I wrote for the list of options. +Gitea insist on drawing borders around them, so I had to create a custom CSS +snippet.</p> +</div> +<div class="paragraph"> +<p>In your Gitea directory, create <code>custom/templates/custom/header.tmpl</code>.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-css" data-lang="css"><span class="o">&lt;</span><span class="nt">style</span><span class="o">&gt;</span> + <span class="c">/* Additions for asciidoc */</span> + <span class="p">.</span><span class="nc">markdown</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="nt">code</span><span class="o">)</span> <span class="nt">table</span><span class="p">.</span><span class="nc">frame-none</span> + <span class="p">{</span> + <span class="k">border</span><span class="p">:</span> <span class="mi">0</span> <span class="cp">!important</span><span class="p">;</span> + <span class="p">}</span> + <span class="p">.</span><span class="nc">markdown</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="nt">code</span><span class="o">)</span> <span class="nt">table</span><span class="p">.</span><span class="nc">grid-none</span> <span class="o">*</span> + <span class="p">{</span> + <span class="k">border</span><span class="p">:</span> <span class="mi">0</span> <span class="cp">!important</span><span class="p">;</span> + <span class="p">}</span> +<span class="o">&lt;/</span><span class="nt">style</span><span class="o">&gt;</span></code></pre></div></pre> +</div> +</div> +</div> +</div> + + + + diff --git a/public/page/1/index.html b/public/page/1/index.html new file mode 100644 index 0000000..31a7179 --- /dev/null +++ b/public/page/1/index.html @@ -0,0 +1 @@ +https://blog.tastytea.de/ \ No newline at end of file diff --git a/public/posts/index.html b/public/posts/index.html new file mode 100644 index 0000000..98b0990 --- /dev/null +++ b/public/posts/index.html @@ -0,0 +1,173 @@ + + + + + Posts | tastyteablog + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+

Posts:

+ +
+ + +
+
+ +
+
+ + + + +
+
+
+ + diff --git a/public/posts/index.xml b/public/posts/index.xml new file mode 100644 index 0000000..bc5340e --- /dev/null +++ b/public/posts/index.xml @@ -0,0 +1,330 @@ + + + + Posts on tastyteablog + https://blog.tastytea.de/posts/ + Recent content in Posts on tastyteablog + Hugo 0.54.0 -- gohugo.io + en + tastytea@tastytea.de (tastytea) + tastytea@tastytea.de (tastytea) + CC BY-NC 4.0 + Thu, 14 Feb 2019 21:38:28 +0100 + + + WireGuard VPN with 2 or more subnets + https://blog.tastytea.de/posts/wireguard-vpn-with-2-or-more-subnets/ + Thu, 14 Feb 2019 21:38:28 +0100 + tastytea@tastytea.de (tastytea) + https://blog.tastytea.de/posts/wireguard-vpn-with-2-or-more-subnets/ + <div class="paragraph"> +<p>I wanted to create a <a href="https://en.wikipedia.org/wiki/WireGuard">WireGuard</a> VPN with +2 subnets in different physical places, each with their own server. I couldn&#8217;t +find an example how to do that, so I wrote this one.</p> +</div> +<div class="sect1"> +<h2 id="_introduction">Introduction</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>I&#8217;m going to use the IP range <code>fd69::/48</code> for the VPN, <code>fd69:0:0:1::/64</code> for +subnet 1 and <code>fd69:0:0:2::/64</code> for subnet 2. I&#8217;m going to call the server of +subnet 1 <code>server1</code>, its first client <code>client1a</code>, the second one <code>client1b</code> and +so on.</p> +</div> +<div class="paragraph"> +<p>All clients in subnet 1 will connect to <code>server1</code> and all clients in subnet 2 +will connect to <code>server2</code>. <code>server1</code> and <code>server2</code> will be connected. If +<code>client1a</code> wants to connect to <code>client2a</code>, the route will be: +<code>client1a → server1 → server2 → client2a</code>.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_preparations">Preparations</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p><a href="https://www.wireguard.com/install/">Install WireGuard</a>, create <code>/etc/wireguard</code> +and generate a key-pair on each participating peer.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-sh" data-lang="sh">mkdir /etc/wireguard +<span class="nb">cd</span> /etc/wireguard +<span class="nb">umask</span> <span class="m">077</span> +wg genkey <span class="p">|</span> tee privatekey <span class="p">|</span> wg pubkey &gt; publickey</code></pre></div></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_configure_servers">Configure servers</h2> +<div class="sectionbody"> +<div class="listingblock"> +<div class="title"><code>server1:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="c1"># This peer</span> +<span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:1::1/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF server1&gt;</span> +<span class="na">ListenPort</span> <span class="o">=</span> <span class="s">51820</span> + +<span class="c1"># Server of subnet 2</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server2&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server2:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:2::/64</span> + +<span class="c1"># Clients of subnet 1</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF client1a&gt;</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:1::a/128</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF client1b&gt;</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:1::b/128</span></code></pre></div></pre> +</div> +</div> +<div class="listingblock"> +<div class="title"><code>server2:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="c1"># This peer</span> +<span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:2::1/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF server2&gt;</span> +<span class="na">ListenPort</span> <span class="o">=</span> <span class="s">51820</span> + +<span class="c1"># Server of subnet 1</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server1&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:1::/64</span> + +<span class="c1"># Clients of subnet 2</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF client2a&gt;</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:2::a/128</span></code></pre></div></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_configure_clients">Configure clients</h2> +<div class="sectionbody"> +<div class="listingblock"> +<div class="title"><code>client1a:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:1::a/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF client1a&gt;</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server1&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69::/48</span> +<span class="na">PersistentKeepalive</span> <span class="o">=</span> <span class="s">25</span></code></pre></div></pre> +</div> +</div> +<div class="listingblock"> +<div class="title"><code>client1b:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:1::b/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF client1b&gt;</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server1&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69::/48</span> +<span class="na">PersistentKeepalive</span> <span class="o">=</span> <span class="s">25</span></code></pre></div></pre> +</div> +</div> +<div class="listingblock"> +<div class="title"><code>client2a:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:2::a/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF client2a&gt;</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server2&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69::/48</span> +<span class="na">PersistentKeepalive</span> <span class="o">=</span> <span class="s">25</span></code></pre></div></pre> +</div> +</div> +<div class="paragraph"> +<p>The <code>AllowedIPs</code> setting acts as a routing table. When a peer tries to send a +packet to an IP, it will check <code>AllowedIPs</code>, and if the IP appears in the list, +it will send it through the WireGuard interface.</p> +</div> +<div class="paragraph"> +<p>The <code>PersistentKeepalive</code> setting ensures that the connection is maintained and +that the peer continues to be reachable, even behind a NAT.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_start_vpn">Start VPN</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Run <code>wg-quick up wg0</code> on each peer.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_further_reading">Further reading</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>The article <a href="https://www.stavros.io/posts/how-to-configure-wireguard/">How to easily configure WireGuard</a> +by Stavros Korokithakis helped me a great deal in understanding WireGuard.</p> +</div> +</div> +</div> + + + + Using AsciiDoc(tor) with Gitea + https://blog.tastytea.de/posts/using-asciidoc-with-gitea/ + Sat, 26 Jan 2019 13:03:36 +0100 + tastytea@tastytea.de (tastytea) + https://blog.tastytea.de/posts/using-asciidoc-with-gitea/ + <div class="paragraph"> +<p>In this blogpost I describe what I did to get AsciiDoc support into +<a href="https://gitea.io/">Gitea</a>. If you want more than syntax highlighting and basic +formatting, Gitea has to be patched unfortunately(this +<a href="https://github.com/go-gitea/gitea/issues/4935">issue</a> has already been reported). +But I think most people will only need to edit 1 configuration file and are +done.</p> +</div> +<div class="sect1"> +<h2 id="_asciidoctor_or_asciidoc">Asciidoctor or AsciiDoc?</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p><a href="https://asciidoctor.org/">Asciidoctor</a> has inbuilt support for +<a href="https://highlightjs.org/">highlight.js</a>, the solution Gitea +uses and is therefore the best choice in most scenarios. If you can&#8217;t or don&#8217;t +want to use it you can use <a href="http://asciidoc.org/">AsciiDoc</a>.</p> +</div> +<div class="paragraph"> +<p>Add the following section to <code>conf/app.ini</code> in your Gitea path. The change +causes <code>.adoc</code> files to be rendered with asciidoctor.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-ini" data-lang="ini"><span class="k">[markup.asciidoc]</span> +<span class="na">ENABLED</span> <span class="o">=</span> <span class="s">true</span> +<span class="c1">; List of file extensions that should be rendered by an external command</span> +<span class="na">FILE_EXTENSIONS</span> <span class="o">=</span> <span class="s">.adoc,.asciidoc</span> +<span class="c1">; External command to render all matching extensions</span> +<span class="na">RENDER_COMMAND</span> <span class="o">=</span> <span class="s">&#34;asciidoctor --backend=html5 --no-header-footer --attribute source-highlighter=highlightjs --out-file=- -&#34;</span> +<span class="c1">; Don&#39;t pass the file on STDIN, pass the filename as argument instead.</span> +<span class="na">IS_INPUT_FILE</span> <span class="o">=</span> <span class="s">false</span></code></pre></div></pre> +</div> +</div> +<div class="paragraph"> +<p>If you want to use asciidoc instead the command would be: +<code>asciidoc --backend=xhtml11 --no-header-footer --attribute +source-highlighter=highlight --out-file=- -</code>. I would choose the <code>xhtml11</code> +backend because it is the only one that encloses code snippets with <code>&lt;code&gt;</code> +tags. Instead of +<a href="http://www.andre-simon.de/doku/highlight/en/highlight.html">highlight</a> you can +use <a href="http://www.gnu.org/software/src-highlite/">source-highlight</a> or +<a href="http://pygments.org/">Pygments</a>.</p> +</div> +<div class="paragraph"> +<p>If you use asciidoctor and don&#8217;t need tables or other fancy stuff you&#8217;re now +done! If you use asciidoc, you&#8217;ll have to patch Gitea to get syntax +highlighting.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_patching_gitea">Patching Gitea</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>The sanitizer strips almost all attributes from HTML-tags, as a security +precaution. I&#8217;ve added exceptions for:</p> +</div> +<div class="ulist"> +<ul> +<li> +<p><code>class</code> attributes on all the tags Asciidoctor introduces,</p> +</li> +<li> +<p>Numerous attributes on <code>table</code> tags,</p> +</li> +<li> +<p><code>align</code> and <code>valign</code> on <code>td</code> tags,</p> +</li> +<li> +<p><code>style</code> attributes on <code>span</code> tags, but only if they contain nothing more than +color and font definitions.</p> +</li> +</ul> +</div> +<div class="paragraph"> +<p>If you use Asciidoctor with highlight.js output, you don&#8217;t need to allow <code>style</code> +attributes, if you don&#8217;t use tables you can omit the lines that deal with them +and the <code>class</code> exception is only useful if you add custom CSS to use them.</p> +</div> +<div class="paragraph"> +<p>Apply the patch with <code>patch -p1 &lt; gitea_relax-sanitizer.patch</code>.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-diff" data-lang="diff"><span class="gh">diff -ur a/modules/markup/sanitizer.go b/modules/markup/sanitizer.go +</span><span class="gh"></span><span class="gd">--- a/modules/markup/sanitizer.go 2019-01-26 16:04:56.014108339 +0100 +</span><span class="gd"></span><span class="gi">+++ b/modules/markup/sanitizer.go 2019-01-26 16:03:21.776401012 +0100 +</span><span class="gi"></span><span class="gu">@@ -38,6 +38,16 @@ +</span><span class="gu"></span> + // Custom URL-Schemes + sanitizer.policy.AllowURLSchemes(setting.Markdown.CustomURLSchemes...) +<span class="gi">+ // Allow style on span tags +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;style&#34;).Matching(regexp.MustCompile(`^(background-)?color:[^;]+(; ?font[^;]+)?;?$`)).OnElements(&#34;span&#34;) +</span><span class="gi">+ +</span><span class="gi">+ // Allow class attribute +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;class&#34;).OnElements(&#34;code&#34;, &#34;pre&#34;, &#34;span&#34;, &#34;div&#34;, &#34;p&#34;, &#34;table&#34;, &#34;td&#34;) +</span><span class="gi">+ +</span><span class="gi">+ // Allow table attributes +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;width&#34;, &#34;frame&#34;, &#34;rules&#34;, &#34;cellspacing&#34;, &#34;cellpadding&#34;).OnElements(&#34;table&#34;) +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;width&#34;).OnElements(&#34;col&#34;) +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;align&#34;, &#34;valign&#34;).OnElements(&#34;td&#34;) +</span><span class="gi"></span> }) + } +</code></pre></div></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_tables_without_borders">Tables without borders</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>I used tables without borders in a manpage I wrote for the list of options. +Gitea insist on drawing borders around them, so I had to create a custom CSS +snippet.</p> +</div> +<div class="paragraph"> +<p>In your Gitea directory, create <code>custom/templates/custom/header.tmpl</code>.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-css" data-lang="css"><span class="o">&lt;</span><span class="nt">style</span><span class="o">&gt;</span> + <span class="c">/* Additions for asciidoc */</span> + <span class="p">.</span><span class="nc">markdown</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="nt">code</span><span class="o">)</span> <span class="nt">table</span><span class="p">.</span><span class="nc">frame-none</span> + <span class="p">{</span> + <span class="k">border</span><span class="p">:</span> <span class="mi">0</span> <span class="cp">!important</span><span class="p">;</span> + <span class="p">}</span> + <span class="p">.</span><span class="nc">markdown</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="nt">code</span><span class="o">)</span> <span class="nt">table</span><span class="p">.</span><span class="nc">grid-none</span> <span class="o">*</span> + <span class="p">{</span> + <span class="k">border</span><span class="p">:</span> <span class="mi">0</span> <span class="cp">!important</span><span class="p">;</span> + <span class="p">}</span> +<span class="o">&lt;/</span><span class="nt">style</span><span class="o">&gt;</span></code></pre></div></pre> +</div> +</div> +</div> +</div> + + + + diff --git a/public/posts/page/1/index.html b/public/posts/page/1/index.html new file mode 100644 index 0000000..f5cce0e --- /dev/null +++ b/public/posts/page/1/index.html @@ -0,0 +1 @@ +https://blog.tastytea.de/posts/ \ No newline at end of file diff --git a/public/posts/using-asciidoc-with-gitea/index.html b/public/posts/using-asciidoc-with-gitea/index.html new file mode 100644 index 0000000..cb48f65 --- /dev/null +++ b/public/posts/using-asciidoc-with-gitea/index.html @@ -0,0 +1,272 @@ + + + + + Using AsciiDoc(tor) with Gitea | tastyteablog + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+

Using AsciiDoc(tor) with Gitea

+ + +
+
+

In this blogpost I describe what I did to get AsciiDoc support into +Gitea. If you want more than syntax highlighting and basic +formatting, Gitea has to be patched unfortunately(this +issue has already been reported). +But I think most people will only need to edit 1 configuration file and are +done.

+
+
+

Asciidoctor or AsciiDoc?

+
+
+

Asciidoctor has inbuilt support for +highlight.js, the solution Gitea +uses and is therefore the best choice in most scenarios. If you can’t or don’t +want to use it you can use AsciiDoc.

+
+
+

Add the following section to conf/app.ini in your Gitea path. The change +causes .adoc files to be rendered with asciidoctor.

+
+
+
+
[markup.asciidoc]
+ENABLED = true
+; List of file extensions that should be rendered by an external command
+FILE_EXTENSIONS = .adoc,.asciidoc
+; External command to render all matching extensions
+RENDER_COMMAND = "asciidoctor --backend=html5 --no-header-footer --attribute source-highlighter=highlightjs --out-file=- -"
+; Don't pass the file on STDIN, pass the filename as argument instead.
+IS_INPUT_FILE = false
+
+
+
+

If you want to use asciidoc instead the command would be: +asciidoc --backend=xhtml11 --no-header-footer --attribute +source-highlighter=highlight --out-file=- -. I would choose the xhtml11 +backend because it is the only one that encloses code snippets with <code> +tags. Instead of +highlight you can +use source-highlight or +Pygments.

+
+
+

If you use asciidoctor and don’t need tables or other fancy stuff you’re now +done! If you use asciidoc, you’ll have to patch Gitea to get syntax +highlighting.

+
+
+
+
+

Patching Gitea

+
+
+

The sanitizer strips almost all attributes from HTML-tags, as a security +precaution. I’ve added exceptions for:

+
+
+
    +
  • +

    class attributes on all the tags Asciidoctor introduces,

    +
  • +
  • +

    Numerous attributes on table tags,

    +
  • +
  • +

    align and valign on td tags,

    +
  • +
  • +

    style attributes on span tags, but only if they contain nothing more than +color and font definitions.

    +
  • +
+
+
+

If you use Asciidoctor with highlight.js output, you don’t need to allow style +attributes, if you don’t use tables you can omit the lines that deal with them +and the class exception is only useful if you add custom CSS to use them.

+
+
+

Apply the patch with patch -p1 < gitea_relax-sanitizer.patch.

+
+
+
+
diff -ur a/modules/markup/sanitizer.go b/modules/markup/sanitizer.go
+--- a/modules/markup/sanitizer.go   2019-01-26 16:04:56.014108339 +0100
++++ b/modules/markup/sanitizer.go   2019-01-26 16:03:21.776401012 +0100
+@@ -38,6 +38,16 @@
+ 
+        // Custom URL-Schemes
+        sanitizer.policy.AllowURLSchemes(setting.Markdown.CustomURLSchemes...)
++       // Allow style on span tags
++       sanitizer.policy.AllowAttrs("style").Matching(regexp.MustCompile(`^(background-)?color:[^;]+(; ?font[^;]+)?;?$`)).OnElements("span")
++
++       // Allow class attribute
++       sanitizer.policy.AllowAttrs("class").OnElements("code", "pre", "span", "div", "p", "table", "td")
++
++       // Allow table attributes
++       sanitizer.policy.AllowAttrs("width", "frame", "rules", "cellspacing", "cellpadding").OnElements("table")
++       sanitizer.policy.AllowAttrs("width").OnElements("col")
++       sanitizer.policy.AllowAttrs("align", "valign").OnElements("td")
+    })
+ }
+
+
+
+
+
+
+

Tables without borders

+
+
+

I used tables without borders in a manpage I wrote for the list of options. +Gitea insist on drawing borders around them, so I had to create a custom CSS +snippet.

+
+
+

In your Gitea directory, create custom/templates/custom/header.tmpl.

+
+
+
+
<style>
+    /* Additions for asciidoc */
+    .markdown:not(code) table.frame-none
+    {
+        border: 0 !important;
+    }
+    .markdown:not(code) table.grid-none *
+    {
+        border: 0 !important;
+    }
+</style>
+
+
+
+
+
+
+ + + +
+
+
+ + diff --git a/public/posts/wireguard-vpn-with-2-or-more-subnets/index.html b/public/posts/wireguard-vpn-with-2-or-more-subnets/index.html new file mode 100644 index 0000000..7f7fa69 --- /dev/null +++ b/public/posts/wireguard-vpn-with-2-or-more-subnets/index.html @@ -0,0 +1,299 @@ + + + + + WireGuard VPN with 2 or more subnets | tastyteablog + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+

WireGuard VPN with 2 or more subnets

+ + +
+
+

I wanted to create a WireGuard VPN with +2 subnets in different physical places, each with their own server. I couldn’t +find an example how to do that, so I wrote this one.

+
+
+

Introduction

+
+
+

I’m going to use the IP range fd69::/48 for the VPN, fd69:0:0:1::/64 for +subnet 1 and fd69:0:0:2::/64 for subnet 2. I’m going to call the server of +subnet 1 server1, its first client client1a, the second one client1b and +so on.

+
+
+

All clients in subnet 1 will connect to server1 and all clients in subnet 2 +will connect to server2. server1 and server2 will be connected. If +client1a wants to connect to client2a, the route will be: +client1a → server1 → server2 → client2a.

+
+
+
+
+

Preparations

+
+
+

Install WireGuard, create /etc/wireguard +and generate a key-pair on each participating peer.

+
+
+
+
mkdir /etc/wireguard
+cd /etc/wireguard
+umask 077
+wg genkey | tee privatekey | wg pubkey > publickey
+
+
+
+
+
+

Configure servers

+
+
+
server1:/etc/wireguard/wg0.conf:
+
+
# This peer
+[Interface]
+Address = fd69:0:0:1::1/48
+PrivateKey = <PRIVATE KEY OF server1>
+ListenPort = 51820
+
+# Server of subnet 2
+[Peer]
+PublicKey = <PUBLIC KEY OF server2>
+Endpoint = server2:51820
+AllowedIPs = fd69:0:0:2::/64
+
+# Clients of subnet 1
+[Peer]
+PublicKey = <PUBLIC KEY OF client1a>
+AllowedIPs = fd69:0:0:1::a/128
+
+[Peer]
+PublicKey = <PUBLIC KEY OF client1b>
+AllowedIPs = fd69:0:0:1::b/128
+
+
+
+
server2:/etc/wireguard/wg0.conf:
+
+
# This peer
+[Interface]
+Address = fd69:0:0:2::1/48
+PrivateKey = <PRIVATE KEY OF server2>
+ListenPort = 51820
+
+# Server of subnet 1
+[Peer]
+PublicKey = <PUBLIC KEY OF server1>
+Endpoint = server1:51820
+AllowedIPs = fd69:0:0:1::/64
+
+# Clients of subnet 2
+[Peer]
+PublicKey = <PUBLIC KEY OF client2a>
+AllowedIPs = fd69:0:0:2::a/128
+
+
+
+
+
+

Configure clients

+
+
+
client1a:/etc/wireguard/wg0.conf:
+
+
[Interface]
+Address = fd69:0:0:1::a/48
+PrivateKey = <PRIVATE KEY OF client1a>
+
+[Peer]
+PublicKey = <PUBLIC KEY OF server1>
+Endpoint = server1:51820
+AllowedIPs = fd69::/48
+PersistentKeepalive = 25
+
+
+
+
client1b:/etc/wireguard/wg0.conf:
+
+
[Interface]
+Address = fd69:0:0:1::b/48
+PrivateKey = <PRIVATE KEY OF client1b>
+
+[Peer]
+PublicKey = <PUBLIC KEY OF server1>
+Endpoint = server1:51820
+AllowedIPs = fd69::/48
+PersistentKeepalive = 25
+
+
+
+
client2a:/etc/wireguard/wg0.conf:
+
+
[Interface]
+Address = fd69:0:0:2::a/48
+PrivateKey = <PRIVATE KEY OF client2a>
+
+[Peer]
+PublicKey = <PUBLIC KEY OF server2>
+Endpoint = server1:51820
+AllowedIPs = fd69::/48
+PersistentKeepalive = 25
+
+
+
+

The AllowedIPs setting acts as a routing table. When a peer tries to send a +packet to an IP, it will check AllowedIPs, and if the IP appears in the list, +it will send it through the WireGuard interface.

+
+
+

The PersistentKeepalive setting ensures that the connection is maintained and +that the peer continues to be reachable, even behind a NAT.

+
+
+
+
+

Start VPN

+
+
+

Run wg-quick up wg0 on each peer.

+
+
+
+
+

Further reading

+
+
+

The article How to easily configure WireGuard +by Stavros Korokithakis helped me a great deal in understanding WireGuard.

+
+
+
+
+
+ + + +
+
+
+ + diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..247db27 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,57 @@ + + + + + https://blog.tastytea.de/posts/wireguard-vpn-with-2-or-more-subnets/ + 2019-02-14T21:38:28+01:00 + + + + https://blog.tastytea.de/posts/using-asciidoc-with-gitea/ + 2019-01-26T13:03:36+01:00 + + + + https://blog.tastytea.de/tags/asciidoc/ + 2019-01-26T13:03:36+01:00 + 0 + + + + https://blog.tastytea.de/tags/gitea/ + 2019-01-26T13:03:36+01:00 + 0 + + + + https://blog.tastytea.de/posts/ + 2019-02-14T21:38:28+01:00 + 0 + + + + https://blog.tastytea.de/tags/ + 2019-01-26T13:03:36+01:00 + 0 + + + + https://blog.tastytea.de/tags/vpn/ + 2019-02-14T21:38:28+01:00 + 0 + + + + https://blog.tastytea.de/tags/wireguard/ + 2019-02-14T21:38:28+01:00 + 0 + + + + https://blog.tastytea.de/ + 2019-02-14T21:38:28+01:00 + 0 + + + \ No newline at end of file diff --git a/public/tags/asciidoc/index.html b/public/tags/asciidoc/index.html new file mode 100644 index 0000000..949865e --- /dev/null +++ b/public/tags/asciidoc/index.html @@ -0,0 +1,158 @@ + + + + + Asciidoc | tastyteablog + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+

Asciidoc:

+ +
+ + +
+
+ +
+
+ + + + +
+
+
+ + diff --git a/public/tags/asciidoc/index.xml b/public/tags/asciidoc/index.xml new file mode 100644 index 0000000..7715d7d --- /dev/null +++ b/public/tags/asciidoc/index.xml @@ -0,0 +1,159 @@ + + + + Asciidoc on tastyteablog + https://blog.tastytea.de/tags/asciidoc/ + Recent content in Asciidoc on tastyteablog + Hugo 0.54.0 -- gohugo.io + en + tastytea@tastytea.de (tastytea) + tastytea@tastytea.de (tastytea) + CC BY-NC 4.0 + Sat, 26 Jan 2019 13:03:36 +0100 + + + Using AsciiDoc(tor) with Gitea + https://blog.tastytea.de/posts/using-asciidoc-with-gitea/ + Sat, 26 Jan 2019 13:03:36 +0100 + tastytea@tastytea.de (tastytea) + https://blog.tastytea.de/posts/using-asciidoc-with-gitea/ + <div class="paragraph"> +<p>In this blogpost I describe what I did to get AsciiDoc support into +<a href="https://gitea.io/">Gitea</a>. If you want more than syntax highlighting and basic +formatting, Gitea has to be patched unfortunately(this +<a href="https://github.com/go-gitea/gitea/issues/4935">issue</a> has already been reported). +But I think most people will only need to edit 1 configuration file and are +done.</p> +</div> +<div class="sect1"> +<h2 id="_asciidoctor_or_asciidoc">Asciidoctor or AsciiDoc?</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p><a href="https://asciidoctor.org/">Asciidoctor</a> has inbuilt support for +<a href="https://highlightjs.org/">highlight.js</a>, the solution Gitea +uses and is therefore the best choice in most scenarios. If you can&#8217;t or don&#8217;t +want to use it you can use <a href="http://asciidoc.org/">AsciiDoc</a>.</p> +</div> +<div class="paragraph"> +<p>Add the following section to <code>conf/app.ini</code> in your Gitea path. The change +causes <code>.adoc</code> files to be rendered with asciidoctor.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-ini" data-lang="ini"><span class="k">[markup.asciidoc]</span> +<span class="na">ENABLED</span> <span class="o">=</span> <span class="s">true</span> +<span class="c1">; List of file extensions that should be rendered by an external command</span> +<span class="na">FILE_EXTENSIONS</span> <span class="o">=</span> <span class="s">.adoc,.asciidoc</span> +<span class="c1">; External command to render all matching extensions</span> +<span class="na">RENDER_COMMAND</span> <span class="o">=</span> <span class="s">&#34;asciidoctor --backend=html5 --no-header-footer --attribute source-highlighter=highlightjs --out-file=- -&#34;</span> +<span class="c1">; Don&#39;t pass the file on STDIN, pass the filename as argument instead.</span> +<span class="na">IS_INPUT_FILE</span> <span class="o">=</span> <span class="s">false</span></code></pre></div></pre> +</div> +</div> +<div class="paragraph"> +<p>If you want to use asciidoc instead the command would be: +<code>asciidoc --backend=xhtml11 --no-header-footer --attribute +source-highlighter=highlight --out-file=- -</code>. I would choose the <code>xhtml11</code> +backend because it is the only one that encloses code snippets with <code>&lt;code&gt;</code> +tags. Instead of +<a href="http://www.andre-simon.de/doku/highlight/en/highlight.html">highlight</a> you can +use <a href="http://www.gnu.org/software/src-highlite/">source-highlight</a> or +<a href="http://pygments.org/">Pygments</a>.</p> +</div> +<div class="paragraph"> +<p>If you use asciidoctor and don&#8217;t need tables or other fancy stuff you&#8217;re now +done! If you use asciidoc, you&#8217;ll have to patch Gitea to get syntax +highlighting.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_patching_gitea">Patching Gitea</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>The sanitizer strips almost all attributes from HTML-tags, as a security +precaution. I&#8217;ve added exceptions for:</p> +</div> +<div class="ulist"> +<ul> +<li> +<p><code>class</code> attributes on all the tags Asciidoctor introduces,</p> +</li> +<li> +<p>Numerous attributes on <code>table</code> tags,</p> +</li> +<li> +<p><code>align</code> and <code>valign</code> on <code>td</code> tags,</p> +</li> +<li> +<p><code>style</code> attributes on <code>span</code> tags, but only if they contain nothing more than +color and font definitions.</p> +</li> +</ul> +</div> +<div class="paragraph"> +<p>If you use Asciidoctor with highlight.js output, you don&#8217;t need to allow <code>style</code> +attributes, if you don&#8217;t use tables you can omit the lines that deal with them +and the <code>class</code> exception is only useful if you add custom CSS to use them.</p> +</div> +<div class="paragraph"> +<p>Apply the patch with <code>patch -p1 &lt; gitea_relax-sanitizer.patch</code>.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-diff" data-lang="diff"><span class="gh">diff -ur a/modules/markup/sanitizer.go b/modules/markup/sanitizer.go +</span><span class="gh"></span><span class="gd">--- a/modules/markup/sanitizer.go 2019-01-26 16:04:56.014108339 +0100 +</span><span class="gd"></span><span class="gi">+++ b/modules/markup/sanitizer.go 2019-01-26 16:03:21.776401012 +0100 +</span><span class="gi"></span><span class="gu">@@ -38,6 +38,16 @@ +</span><span class="gu"></span> + // Custom URL-Schemes + sanitizer.policy.AllowURLSchemes(setting.Markdown.CustomURLSchemes...) +<span class="gi">+ // Allow style on span tags +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;style&#34;).Matching(regexp.MustCompile(`^(background-)?color:[^;]+(; ?font[^;]+)?;?$`)).OnElements(&#34;span&#34;) +</span><span class="gi">+ +</span><span class="gi">+ // Allow class attribute +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;class&#34;).OnElements(&#34;code&#34;, &#34;pre&#34;, &#34;span&#34;, &#34;div&#34;, &#34;p&#34;, &#34;table&#34;, &#34;td&#34;) +</span><span class="gi">+ +</span><span class="gi">+ // Allow table attributes +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;width&#34;, &#34;frame&#34;, &#34;rules&#34;, &#34;cellspacing&#34;, &#34;cellpadding&#34;).OnElements(&#34;table&#34;) +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;width&#34;).OnElements(&#34;col&#34;) +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;align&#34;, &#34;valign&#34;).OnElements(&#34;td&#34;) +</span><span class="gi"></span> }) + } +</code></pre></div></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_tables_without_borders">Tables without borders</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>I used tables without borders in a manpage I wrote for the list of options. +Gitea insist on drawing borders around them, so I had to create a custom CSS +snippet.</p> +</div> +<div class="paragraph"> +<p>In your Gitea directory, create <code>custom/templates/custom/header.tmpl</code>.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-css" data-lang="css"><span class="o">&lt;</span><span class="nt">style</span><span class="o">&gt;</span> + <span class="c">/* Additions for asciidoc */</span> + <span class="p">.</span><span class="nc">markdown</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="nt">code</span><span class="o">)</span> <span class="nt">table</span><span class="p">.</span><span class="nc">frame-none</span> + <span class="p">{</span> + <span class="k">border</span><span class="p">:</span> <span class="mi">0</span> <span class="cp">!important</span><span class="p">;</span> + <span class="p">}</span> + <span class="p">.</span><span class="nc">markdown</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="nt">code</span><span class="o">)</span> <span class="nt">table</span><span class="p">.</span><span class="nc">grid-none</span> <span class="o">*</span> + <span class="p">{</span> + <span class="k">border</span><span class="p">:</span> <span class="mi">0</span> <span class="cp">!important</span><span class="p">;</span> + <span class="p">}</span> +<span class="o">&lt;/</span><span class="nt">style</span><span class="o">&gt;</span></code></pre></div></pre> +</div> +</div> +</div> +</div> + + + + diff --git a/public/tags/asciidoc/page/1/index.html b/public/tags/asciidoc/page/1/index.html new file mode 100644 index 0000000..ccf53db --- /dev/null +++ b/public/tags/asciidoc/page/1/index.html @@ -0,0 +1 @@ +https://blog.tastytea.de/tags/asciidoc/ \ No newline at end of file diff --git a/public/tags/gitea/index.html b/public/tags/gitea/index.html new file mode 100644 index 0000000..e89fecb --- /dev/null +++ b/public/tags/gitea/index.html @@ -0,0 +1,158 @@ + + + + + Gitea | tastyteablog + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+

Gitea:

+ +
+ + +
+
+ +
+
+ + + + +
+
+
+ + diff --git a/public/tags/gitea/index.xml b/public/tags/gitea/index.xml new file mode 100644 index 0000000..0375c08 --- /dev/null +++ b/public/tags/gitea/index.xml @@ -0,0 +1,159 @@ + + + + Gitea on tastyteablog + https://blog.tastytea.de/tags/gitea/ + Recent content in Gitea on tastyteablog + Hugo 0.54.0 -- gohugo.io + en + tastytea@tastytea.de (tastytea) + tastytea@tastytea.de (tastytea) + CC BY-NC 4.0 + Sat, 26 Jan 2019 13:03:36 +0100 + + + Using AsciiDoc(tor) with Gitea + https://blog.tastytea.de/posts/using-asciidoc-with-gitea/ + Sat, 26 Jan 2019 13:03:36 +0100 + tastytea@tastytea.de (tastytea) + https://blog.tastytea.de/posts/using-asciidoc-with-gitea/ + <div class="paragraph"> +<p>In this blogpost I describe what I did to get AsciiDoc support into +<a href="https://gitea.io/">Gitea</a>. If you want more than syntax highlighting and basic +formatting, Gitea has to be patched unfortunately(this +<a href="https://github.com/go-gitea/gitea/issues/4935">issue</a> has already been reported). +But I think most people will only need to edit 1 configuration file and are +done.</p> +</div> +<div class="sect1"> +<h2 id="_asciidoctor_or_asciidoc">Asciidoctor or AsciiDoc?</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p><a href="https://asciidoctor.org/">Asciidoctor</a> has inbuilt support for +<a href="https://highlightjs.org/">highlight.js</a>, the solution Gitea +uses and is therefore the best choice in most scenarios. If you can&#8217;t or don&#8217;t +want to use it you can use <a href="http://asciidoc.org/">AsciiDoc</a>.</p> +</div> +<div class="paragraph"> +<p>Add the following section to <code>conf/app.ini</code> in your Gitea path. The change +causes <code>.adoc</code> files to be rendered with asciidoctor.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-ini" data-lang="ini"><span class="k">[markup.asciidoc]</span> +<span class="na">ENABLED</span> <span class="o">=</span> <span class="s">true</span> +<span class="c1">; List of file extensions that should be rendered by an external command</span> +<span class="na">FILE_EXTENSIONS</span> <span class="o">=</span> <span class="s">.adoc,.asciidoc</span> +<span class="c1">; External command to render all matching extensions</span> +<span class="na">RENDER_COMMAND</span> <span class="o">=</span> <span class="s">&#34;asciidoctor --backend=html5 --no-header-footer --attribute source-highlighter=highlightjs --out-file=- -&#34;</span> +<span class="c1">; Don&#39;t pass the file on STDIN, pass the filename as argument instead.</span> +<span class="na">IS_INPUT_FILE</span> <span class="o">=</span> <span class="s">false</span></code></pre></div></pre> +</div> +</div> +<div class="paragraph"> +<p>If you want to use asciidoc instead the command would be: +<code>asciidoc --backend=xhtml11 --no-header-footer --attribute +source-highlighter=highlight --out-file=- -</code>. I would choose the <code>xhtml11</code> +backend because it is the only one that encloses code snippets with <code>&lt;code&gt;</code> +tags. Instead of +<a href="http://www.andre-simon.de/doku/highlight/en/highlight.html">highlight</a> you can +use <a href="http://www.gnu.org/software/src-highlite/">source-highlight</a> or +<a href="http://pygments.org/">Pygments</a>.</p> +</div> +<div class="paragraph"> +<p>If you use asciidoctor and don&#8217;t need tables or other fancy stuff you&#8217;re now +done! If you use asciidoc, you&#8217;ll have to patch Gitea to get syntax +highlighting.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_patching_gitea">Patching Gitea</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>The sanitizer strips almost all attributes from HTML-tags, as a security +precaution. I&#8217;ve added exceptions for:</p> +</div> +<div class="ulist"> +<ul> +<li> +<p><code>class</code> attributes on all the tags Asciidoctor introduces,</p> +</li> +<li> +<p>Numerous attributes on <code>table</code> tags,</p> +</li> +<li> +<p><code>align</code> and <code>valign</code> on <code>td</code> tags,</p> +</li> +<li> +<p><code>style</code> attributes on <code>span</code> tags, but only if they contain nothing more than +color and font definitions.</p> +</li> +</ul> +</div> +<div class="paragraph"> +<p>If you use Asciidoctor with highlight.js output, you don&#8217;t need to allow <code>style</code> +attributes, if you don&#8217;t use tables you can omit the lines that deal with them +and the <code>class</code> exception is only useful if you add custom CSS to use them.</p> +</div> +<div class="paragraph"> +<p>Apply the patch with <code>patch -p1 &lt; gitea_relax-sanitizer.patch</code>.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-diff" data-lang="diff"><span class="gh">diff -ur a/modules/markup/sanitizer.go b/modules/markup/sanitizer.go +</span><span class="gh"></span><span class="gd">--- a/modules/markup/sanitizer.go 2019-01-26 16:04:56.014108339 +0100 +</span><span class="gd"></span><span class="gi">+++ b/modules/markup/sanitizer.go 2019-01-26 16:03:21.776401012 +0100 +</span><span class="gi"></span><span class="gu">@@ -38,6 +38,16 @@ +</span><span class="gu"></span> + // Custom URL-Schemes + sanitizer.policy.AllowURLSchemes(setting.Markdown.CustomURLSchemes...) +<span class="gi">+ // Allow style on span tags +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;style&#34;).Matching(regexp.MustCompile(`^(background-)?color:[^;]+(; ?font[^;]+)?;?$`)).OnElements(&#34;span&#34;) +</span><span class="gi">+ +</span><span class="gi">+ // Allow class attribute +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;class&#34;).OnElements(&#34;code&#34;, &#34;pre&#34;, &#34;span&#34;, &#34;div&#34;, &#34;p&#34;, &#34;table&#34;, &#34;td&#34;) +</span><span class="gi">+ +</span><span class="gi">+ // Allow table attributes +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;width&#34;, &#34;frame&#34;, &#34;rules&#34;, &#34;cellspacing&#34;, &#34;cellpadding&#34;).OnElements(&#34;table&#34;) +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;width&#34;).OnElements(&#34;col&#34;) +</span><span class="gi">+ sanitizer.policy.AllowAttrs(&#34;align&#34;, &#34;valign&#34;).OnElements(&#34;td&#34;) +</span><span class="gi"></span> }) + } +</code></pre></div></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_tables_without_borders">Tables without borders</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>I used tables without borders in a manpage I wrote for the list of options. +Gitea insist on drawing borders around them, so I had to create a custom CSS +snippet.</p> +</div> +<div class="paragraph"> +<p>In your Gitea directory, create <code>custom/templates/custom/header.tmpl</code>.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-css" data-lang="css"><span class="o">&lt;</span><span class="nt">style</span><span class="o">&gt;</span> + <span class="c">/* Additions for asciidoc */</span> + <span class="p">.</span><span class="nc">markdown</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="nt">code</span><span class="o">)</span> <span class="nt">table</span><span class="p">.</span><span class="nc">frame-none</span> + <span class="p">{</span> + <span class="k">border</span><span class="p">:</span> <span class="mi">0</span> <span class="cp">!important</span><span class="p">;</span> + <span class="p">}</span> + <span class="p">.</span><span class="nc">markdown</span><span class="p">:</span><span class="nd">not</span><span class="o">(</span><span class="nt">code</span><span class="o">)</span> <span class="nt">table</span><span class="p">.</span><span class="nc">grid-none</span> <span class="o">*</span> + <span class="p">{</span> + <span class="k">border</span><span class="p">:</span> <span class="mi">0</span> <span class="cp">!important</span><span class="p">;</span> + <span class="p">}</span> +<span class="o">&lt;/</span><span class="nt">style</span><span class="o">&gt;</span></code></pre></div></pre> +</div> +</div> +</div> +</div> + + + + diff --git a/public/tags/gitea/page/1/index.html b/public/tags/gitea/page/1/index.html new file mode 100644 index 0000000..da447b5 --- /dev/null +++ b/public/tags/gitea/page/1/index.html @@ -0,0 +1 @@ +https://blog.tastytea.de/tags/gitea/ \ No newline at end of file diff --git a/public/tags/index.html b/public/tags/index.html new file mode 100644 index 0000000..d00c797 --- /dev/null +++ b/public/tags/index.html @@ -0,0 +1,141 @@ + + + + + Tags | tastyteablog + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+

Tags:

+ +
+ + + +
+
+
+ + diff --git a/public/tags/index.xml b/public/tags/index.xml new file mode 100644 index 0000000..9a4e098 --- /dev/null +++ b/public/tags/index.xml @@ -0,0 +1,47 @@ + + + + Tags on tastyteablog + https://blog.tastytea.de/tags/ + Recent content in Tags on tastyteablog + Hugo 0.54.0 -- gohugo.io + en + tastytea@tastytea.de (tastytea) + tastytea@tastytea.de (tastytea) + CC BY-NC 4.0 + Sat, 26 Jan 2019 13:03:36 +0100 + + + Asciidoc + https://blog.tastytea.de/tags/asciidoc/ + Sat, 26 Jan 2019 13:03:36 +0100 + tastytea@tastytea.de (tastytea) + https://blog.tastytea.de/tags/asciidoc/ + + + + Gitea + https://blog.tastytea.de/tags/gitea/ + Sat, 26 Jan 2019 13:03:36 +0100 + tastytea@tastytea.de (tastytea) + https://blog.tastytea.de/tags/gitea/ + + + + Vpn + https://blog.tastytea.de/tags/vpn/ + Thu, 14 Feb 2019 21:38:28 +0100 + tastytea@tastytea.de (tastytea) + https://blog.tastytea.de/tags/vpn/ + + + + Wireguard + https://blog.tastytea.de/tags/wireguard/ + Thu, 14 Feb 2019 21:38:28 +0100 + tastytea@tastytea.de (tastytea) + https://blog.tastytea.de/tags/wireguard/ + + + + diff --git a/public/tags/vpn/index.html b/public/tags/vpn/index.html new file mode 100644 index 0000000..dc9efb5 --- /dev/null +++ b/public/tags/vpn/index.html @@ -0,0 +1,158 @@ + + + + + Vpn | tastyteablog + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+

Vpn:

+ +
+ + +
+
+ +
+
+ + + + +
+
+
+ + diff --git a/public/tags/vpn/index.xml b/public/tags/vpn/index.xml new file mode 100644 index 0000000..120de43 --- /dev/null +++ b/public/tags/vpn/index.xml @@ -0,0 +1,186 @@ + + + + Vpn on tastyteablog + https://blog.tastytea.de/tags/vpn/ + Recent content in Vpn on tastyteablog + Hugo 0.54.0 -- gohugo.io + en + tastytea@tastytea.de (tastytea) + tastytea@tastytea.de (tastytea) + CC BY-NC 4.0 + Thu, 14 Feb 2019 21:38:28 +0100 + + + WireGuard VPN with 2 or more subnets + https://blog.tastytea.de/posts/wireguard-vpn-with-2-or-more-subnets/ + Thu, 14 Feb 2019 21:38:28 +0100 + tastytea@tastytea.de (tastytea) + https://blog.tastytea.de/posts/wireguard-vpn-with-2-or-more-subnets/ + <div class="paragraph"> +<p>I wanted to create a <a href="https://en.wikipedia.org/wiki/WireGuard">WireGuard</a> VPN with +2 subnets in different physical places, each with their own server. I couldn&#8217;t +find an example how to do that, so I wrote this one.</p> +</div> +<div class="sect1"> +<h2 id="_introduction">Introduction</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>I&#8217;m going to use the IP range <code>fd69::/48</code> for the VPN, <code>fd69:0:0:1::/64</code> for +subnet 1 and <code>fd69:0:0:2::/64</code> for subnet 2. I&#8217;m going to call the server of +subnet 1 <code>server1</code>, its first client <code>client1a</code>, the second one <code>client1b</code> and +so on.</p> +</div> +<div class="paragraph"> +<p>All clients in subnet 1 will connect to <code>server1</code> and all clients in subnet 2 +will connect to <code>server2</code>. <code>server1</code> and <code>server2</code> will be connected. If +<code>client1a</code> wants to connect to <code>client2a</code>, the route will be: +<code>client1a → server1 → server2 → client2a</code>.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_preparations">Preparations</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p><a href="https://www.wireguard.com/install/">Install WireGuard</a>, create <code>/etc/wireguard</code> +and generate a key-pair on each participating peer.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-sh" data-lang="sh">mkdir /etc/wireguard +<span class="nb">cd</span> /etc/wireguard +<span class="nb">umask</span> <span class="m">077</span> +wg genkey <span class="p">|</span> tee privatekey <span class="p">|</span> wg pubkey &gt; publickey</code></pre></div></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_configure_servers">Configure servers</h2> +<div class="sectionbody"> +<div class="listingblock"> +<div class="title"><code>server1:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="c1"># This peer</span> +<span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:1::1/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF server1&gt;</span> +<span class="na">ListenPort</span> <span class="o">=</span> <span class="s">51820</span> + +<span class="c1"># Server of subnet 2</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server2&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server2:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:2::/64</span> + +<span class="c1"># Clients of subnet 1</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF client1a&gt;</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:1::a/128</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF client1b&gt;</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:1::b/128</span></code></pre></div></pre> +</div> +</div> +<div class="listingblock"> +<div class="title"><code>server2:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="c1"># This peer</span> +<span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:2::1/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF server2&gt;</span> +<span class="na">ListenPort</span> <span class="o">=</span> <span class="s">51820</span> + +<span class="c1"># Server of subnet 1</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server1&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:1::/64</span> + +<span class="c1"># Clients of subnet 2</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF client2a&gt;</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:2::a/128</span></code></pre></div></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_configure_clients">Configure clients</h2> +<div class="sectionbody"> +<div class="listingblock"> +<div class="title"><code>client1a:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:1::a/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF client1a&gt;</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server1&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69::/48</span> +<span class="na">PersistentKeepalive</span> <span class="o">=</span> <span class="s">25</span></code></pre></div></pre> +</div> +</div> +<div class="listingblock"> +<div class="title"><code>client1b:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:1::b/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF client1b&gt;</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server1&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69::/48</span> +<span class="na">PersistentKeepalive</span> <span class="o">=</span> <span class="s">25</span></code></pre></div></pre> +</div> +</div> +<div class="listingblock"> +<div class="title"><code>client2a:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:2::a/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF client2a&gt;</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server2&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69::/48</span> +<span class="na">PersistentKeepalive</span> <span class="o">=</span> <span class="s">25</span></code></pre></div></pre> +</div> +</div> +<div class="paragraph"> +<p>The <code>AllowedIPs</code> setting acts as a routing table. When a peer tries to send a +packet to an IP, it will check <code>AllowedIPs</code>, and if the IP appears in the list, +it will send it through the WireGuard interface.</p> +</div> +<div class="paragraph"> +<p>The <code>PersistentKeepalive</code> setting ensures that the connection is maintained and +that the peer continues to be reachable, even behind a NAT.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_start_vpn">Start VPN</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Run <code>wg-quick up wg0</code> on each peer.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_further_reading">Further reading</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>The article <a href="https://www.stavros.io/posts/how-to-configure-wireguard/">How to easily configure WireGuard</a> +by Stavros Korokithakis helped me a great deal in understanding WireGuard.</p> +</div> +</div> +</div> + + + + diff --git a/public/tags/vpn/page/1/index.html b/public/tags/vpn/page/1/index.html new file mode 100644 index 0000000..3e5355c --- /dev/null +++ b/public/tags/vpn/page/1/index.html @@ -0,0 +1 @@ +https://blog.tastytea.de/tags/vpn/ \ No newline at end of file diff --git a/public/tags/wireguard/index.html b/public/tags/wireguard/index.html new file mode 100644 index 0000000..4949e7d --- /dev/null +++ b/public/tags/wireguard/index.html @@ -0,0 +1,158 @@ + + + + + Wireguard | tastyteablog + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+

Wireguard:

+ +
+ + +
+
+ +
+
+ + + + +
+
+
+ + diff --git a/public/tags/wireguard/index.xml b/public/tags/wireguard/index.xml new file mode 100644 index 0000000..c27ac90 --- /dev/null +++ b/public/tags/wireguard/index.xml @@ -0,0 +1,186 @@ + + + + Wireguard on tastyteablog + https://blog.tastytea.de/tags/wireguard/ + Recent content in Wireguard on tastyteablog + Hugo 0.54.0 -- gohugo.io + en + tastytea@tastytea.de (tastytea) + tastytea@tastytea.de (tastytea) + CC BY-NC 4.0 + Thu, 14 Feb 2019 21:38:28 +0100 + + + WireGuard VPN with 2 or more subnets + https://blog.tastytea.de/posts/wireguard-vpn-with-2-or-more-subnets/ + Thu, 14 Feb 2019 21:38:28 +0100 + tastytea@tastytea.de (tastytea) + https://blog.tastytea.de/posts/wireguard-vpn-with-2-or-more-subnets/ + <div class="paragraph"> +<p>I wanted to create a <a href="https://en.wikipedia.org/wiki/WireGuard">WireGuard</a> VPN with +2 subnets in different physical places, each with their own server. I couldn&#8217;t +find an example how to do that, so I wrote this one.</p> +</div> +<div class="sect1"> +<h2 id="_introduction">Introduction</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>I&#8217;m going to use the IP range <code>fd69::/48</code> for the VPN, <code>fd69:0:0:1::/64</code> for +subnet 1 and <code>fd69:0:0:2::/64</code> for subnet 2. I&#8217;m going to call the server of +subnet 1 <code>server1</code>, its first client <code>client1a</code>, the second one <code>client1b</code> and +so on.</p> +</div> +<div class="paragraph"> +<p>All clients in subnet 1 will connect to <code>server1</code> and all clients in subnet 2 +will connect to <code>server2</code>. <code>server1</code> and <code>server2</code> will be connected. If +<code>client1a</code> wants to connect to <code>client2a</code>, the route will be: +<code>client1a → server1 → server2 → client2a</code>.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_preparations">Preparations</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p><a href="https://www.wireguard.com/install/">Install WireGuard</a>, create <code>/etc/wireguard</code> +and generate a key-pair on each participating peer.</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-sh" data-lang="sh">mkdir /etc/wireguard +<span class="nb">cd</span> /etc/wireguard +<span class="nb">umask</span> <span class="m">077</span> +wg genkey <span class="p">|</span> tee privatekey <span class="p">|</span> wg pubkey &gt; publickey</code></pre></div></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_configure_servers">Configure servers</h2> +<div class="sectionbody"> +<div class="listingblock"> +<div class="title"><code>server1:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="c1"># This peer</span> +<span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:1::1/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF server1&gt;</span> +<span class="na">ListenPort</span> <span class="o">=</span> <span class="s">51820</span> + +<span class="c1"># Server of subnet 2</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server2&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server2:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:2::/64</span> + +<span class="c1"># Clients of subnet 1</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF client1a&gt;</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:1::a/128</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF client1b&gt;</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:1::b/128</span></code></pre></div></pre> +</div> +</div> +<div class="listingblock"> +<div class="title"><code>server2:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="c1"># This peer</span> +<span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:2::1/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF server2&gt;</span> +<span class="na">ListenPort</span> <span class="o">=</span> <span class="s">51820</span> + +<span class="c1"># Server of subnet 1</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server1&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:1::/64</span> + +<span class="c1"># Clients of subnet 2</span> +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF client2a&gt;</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69:0:0:2::a/128</span></code></pre></div></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_configure_clients">Configure clients</h2> +<div class="sectionbody"> +<div class="listingblock"> +<div class="title"><code>client1a:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:1::a/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF client1a&gt;</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server1&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69::/48</span> +<span class="na">PersistentKeepalive</span> <span class="o">=</span> <span class="s">25</span></code></pre></div></pre> +</div> +</div> +<div class="listingblock"> +<div class="title"><code>client1b:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:1::b/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF client1b&gt;</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server1&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69::/48</span> +<span class="na">PersistentKeepalive</span> <span class="o">=</span> <span class="s">25</span></code></pre></div></pre> +</div> +</div> +<div class="listingblock"> +<div class="title"><code>client2a:/etc/wireguard/wg0.conf</code>:</div> +<div class="content"> +<pre><div class="highlight"><pre class="chroma"><code class="language-cfg" data-lang="cfg"><span class="k">[Interface]</span> +<span class="na">Address</span> <span class="o">=</span> <span class="s">fd69:0:0:2::a/48</span> +<span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">&lt;PRIVATE KEY OF client2a&gt;</span> + +<span class="k">[Peer]</span> +<span class="na">PublicKey</span> <span class="o">=</span> <span class="s">&lt;PUBLIC KEY OF server2&gt;</span> +<span class="na">Endpoint</span> <span class="o">=</span> <span class="s">server1:51820</span> +<span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">fd69::/48</span> +<span class="na">PersistentKeepalive</span> <span class="o">=</span> <span class="s">25</span></code></pre></div></pre> +</div> +</div> +<div class="paragraph"> +<p>The <code>AllowedIPs</code> setting acts as a routing table. When a peer tries to send a +packet to an IP, it will check <code>AllowedIPs</code>, and if the IP appears in the list, +it will send it through the WireGuard interface.</p> +</div> +<div class="paragraph"> +<p>The <code>PersistentKeepalive</code> setting ensures that the connection is maintained and +that the peer continues to be reachable, even behind a NAT.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_start_vpn">Start VPN</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Run <code>wg-quick up wg0</code> on each peer.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_further_reading">Further reading</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>The article <a href="https://www.stavros.io/posts/how-to-configure-wireguard/">How to easily configure WireGuard</a> +by Stavros Korokithakis helped me a great deal in understanding WireGuard.</p> +</div> +</div> +</div> + + + + diff --git a/public/tags/wireguard/page/1/index.html b/public/tags/wireguard/page/1/index.html new file mode 100644 index 0000000..0f8436d --- /dev/null +++ b/public/tags/wireguard/page/1/index.html @@ -0,0 +1 @@ +https://blog.tastytea.de/tags/wireguard/ \ No newline at end of file diff --git a/themes/modify_slick.sh b/themes/modify_slick.sh new file mode 100755 index 0000000..d83cd02 --- /dev/null +++ b/themes/modify_slick.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +pushd /home/tastytea/blog/themes +for file in style.css style-compat.css; do + cp slick/static/assets/${file} tastytea/static/assets/${file} + + # Remove fonts, save >400KiB (~92,5%) + sed -Ei 's/@font-face\{[^\}]+\}//g' tastytea/static/assets/${file} + + # Increase font-size + sed -i 's/font-size:16px/font-size:18px/g' tastytea/static/assets/${file} + + # Set maximum characters per line to 100 + sed -i 's/body{margin:0}/body{max-width:100ch;margin:auto}/' tastytea/static/assets/${file} + + sed -i 's/#1d1f21/#101112/g' tastytea/static/assets/${file} # Code Background + + sed -i 's/#ffffff/#1d1f21/g' tastytea/static/assets/${file} # Background + sed -i 's/#fff/#1d1f21/g' tastytea/static/assets/${file} + sed -i 's/#efefef/#282a2e/g' tastytea/static/assets/${file} # Current Line + sed -i 's/#eee/#282a2e/g' tastytea/static/assets/${file} # Current Line + sed -i 's/#d6d6d6/#373b41/g' tastytea/static/assets/${file} # Selection + sed -i 's/#4d4d4c/#c5c8c6/g' tastytea/static/assets/${file} # Foreground + sed -i 's/#8e908c/#969896/g' tastytea/static/assets/${file} # Comment + sed -i 's/#c82829/#cc6666/g' tastytea/static/assets/${file} # Red + sed -i 's/#f5871f/#de935f/g' tastytea/static/assets/${file} # Orange + sed -i 's/#eab700/#f0c674/g' tastytea/static/assets/${file} # Yellow + sed -i 's/#718c00/#b5bd68/g' tastytea/static/assets/${file} # Green + sed -i 's/#3e999f/#8abeb7/g' tastytea/static/assets/${file} # Aqua + sed -i 's/#4271ae/#81a2be/g' tastytea/static/assets/${file} # Blue + sed -i 's/#8959a8/#b294bb/g' tastytea/static/assets/${file} # Purple + + sed -i 's/#000/#e2e0de/g' tastytea/static/assets/${file} # Some links +done +popd diff --git a/themes/tastytea/static/assets/style-compat.css b/themes/tastytea/static/assets/style-compat.css new file mode 100644 index 0000000..2b27256 --- /dev/null +++ b/themes/tastytea/static/assets/style-compat.css @@ -0,0 +1 @@ +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{max-width:100ch;margin:auto}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#e2e0de}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,Droid Sans,Helvetica,Arial,sans-serif;display:flex;flex-flow:row wrap;align-content:flex-start}@media (-ms-high-contrast:active),(-ms-high-contrast:none){table .pure-g{display:block}}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class*=pure-u]{font-family:sans-serif}.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-1-2,.pure-u-sm-1-3,.pure-u-sm-1-4,.pure-u-sm-1-5,.pure-u-sm-1-6,.pure-u-sm-1-8,.pure-u-sm-1-12,.pure-u-sm-1-24,.pure-u-sm-2-3,.pure-u-sm-2-5,.pure-u-sm-2-24,.pure-u-sm-3-4,.pure-u-sm-3-5,.pure-u-sm-3-8,.pure-u-sm-3-24,.pure-u-sm-4-5,.pure-u-sm-4-24,.pure-u-sm-5-5,.pure-u-sm-5-6,.pure-u-sm-5-8,.pure-u-sm-5-12,.pure-u-sm-5-24,.pure-u-sm-6-24,.pure-u-sm-7-8,.pure-u-sm-7-12,.pure-u-sm-7-24,.pure-u-sm-8-24,.pure-u-sm-9-24,.pure-u-sm-10-24,.pure-u-sm-11-12,.pure-u-sm-11-24,.pure-u-sm-12-24,.pure-u-sm-13-24,.pure-u-sm-14-24,.pure-u-sm-15-24,.pure-u-sm-16-24,.pure-u-sm-17-24,.pure-u-sm-18-24,.pure-u-sm-19-24,.pure-u-sm-20-24,.pure-u-sm-21-24,.pure-u-sm-22-24,.pure-u-sm-23-24,.pure-u-sm-24-24{display:inline-block;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-sm-1-24{width:4.1667%}.pure-u-sm-1-12,.pure-u-sm-2-24{width:8.3333%}.pure-u-sm-1-8,.pure-u-sm-3-24{width:12.5%}.pure-u-sm-1-6,.pure-u-sm-4-24{width:16.6667%}.pure-u-sm-1-5{width:20%}.pure-u-sm-5-24{width:20.8333%}.pure-u-sm-1-4,.pure-u-sm-6-24{width:25%}.pure-u-sm-7-24{width:29.1667%}.pure-u-sm-1-3,.pure-u-sm-8-24{width:33.3333%}.pure-u-sm-3-8,.pure-u-sm-9-24{width:37.5%}.pure-u-sm-2-5{width:40%}.pure-u-sm-5-12,.pure-u-sm-10-24{width:41.6667%}.pure-u-sm-11-24{width:45.8333%}.pure-u-sm-1-2,.pure-u-sm-12-24{width:50%}.pure-u-sm-13-24{width:54.1667%}.pure-u-sm-7-12,.pure-u-sm-14-24{width:58.3333%}.pure-u-sm-3-5{width:60%}.pure-u-sm-5-8,.pure-u-sm-15-24{width:62.5%}.pure-u-sm-2-3,.pure-u-sm-16-24{width:66.6667%}.pure-u-sm-17-24{width:70.8333%}.pure-u-sm-3-4,.pure-u-sm-18-24{width:75%}.pure-u-sm-19-24{width:79.1667%}.pure-u-sm-4-5{width:80%}.pure-u-sm-5-6,.pure-u-sm-20-24{width:83.3333%}.pure-u-sm-7-8,.pure-u-sm-21-24{width:87.5%}.pure-u-sm-11-12,.pure-u-sm-22-24{width:91.6667%}.pure-u-sm-23-24{width:95.8333%}.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-5-5,.pure-u-sm-24-24{width:100%}.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-1-2,.pure-u-md-1-3,.pure-u-md-1-4,.pure-u-md-1-5,.pure-u-md-1-6,.pure-u-md-1-8,.pure-u-md-1-12,.pure-u-md-1-24,.pure-u-md-2-3,.pure-u-md-2-5,.pure-u-md-2-24,.pure-u-md-3-4,.pure-u-md-3-5,.pure-u-md-3-8,.pure-u-md-3-24,.pure-u-md-4-5,.pure-u-md-4-24,.pure-u-md-5-5,.pure-u-md-5-6,.pure-u-md-5-8,.pure-u-md-5-12,.pure-u-md-5-24,.pure-u-md-6-24,.pure-u-md-7-8,.pure-u-md-7-12,.pure-u-md-7-24,.pure-u-md-8-24,.pure-u-md-9-24,.pure-u-md-10-24,.pure-u-md-11-12,.pure-u-md-11-24,.pure-u-md-12-24,.pure-u-md-13-24,.pure-u-md-14-24,.pure-u-md-15-24,.pure-u-md-16-24,.pure-u-md-17-24,.pure-u-md-18-24,.pure-u-md-19-24,.pure-u-md-20-24,.pure-u-md-21-24,.pure-u-md-22-24,.pure-u-md-23-24,.pure-u-md-24-24{display:inline-block;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-md-1-24{width:4.1667%}.pure-u-md-1-12,.pure-u-md-2-24{width:8.3333%}.pure-u-md-1-8,.pure-u-md-3-24{width:12.5%}.pure-u-md-1-6,.pure-u-md-4-24{width:16.6667%}.pure-u-md-1-5{width:20%}.pure-u-md-5-24{width:20.8333%}.pure-u-md-1-4,.pure-u-md-6-24{width:25%}.pure-u-md-7-24{width:29.1667%}.pure-u-md-1-3,.pure-u-md-8-24{width:33.3333%}.pure-u-md-3-8,.pure-u-md-9-24{width:37.5%}.pure-u-md-2-5{width:40%}.pure-u-md-5-12,.pure-u-md-10-24{width:41.6667%}.pure-u-md-11-24{width:45.8333%}.pure-u-md-1-2,.pure-u-md-12-24{width:50%}.pure-u-md-13-24{width:54.1667%}.pure-u-md-7-12,.pure-u-md-14-24{width:58.3333%}.pure-u-md-3-5{width:60%}.pure-u-md-5-8,.pure-u-md-15-24{width:62.5%}.pure-u-md-2-3,.pure-u-md-16-24{width:66.6667%}.pure-u-md-17-24{width:70.8333%}.pure-u-md-3-4,.pure-u-md-18-24{width:75%}.pure-u-md-19-24{width:79.1667%}.pure-u-md-4-5{width:80%}.pure-u-md-5-6,.pure-u-md-20-24{width:83.3333%}.pure-u-md-7-8,.pure-u-md-21-24{width:87.5%}.pure-u-md-11-12,.pure-u-md-22-24{width:91.6667%}.pure-u-md-23-24{width:95.8333%}.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-5-5,.pure-u-md-24-24{width:100%}.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-1-2,.pure-u-lg-1-3,.pure-u-lg-1-4,.pure-u-lg-1-5,.pure-u-lg-1-6,.pure-u-lg-1-8,.pure-u-lg-1-12,.pure-u-lg-1-24,.pure-u-lg-2-3,.pure-u-lg-2-5,.pure-u-lg-2-24,.pure-u-lg-3-4,.pure-u-lg-3-5,.pure-u-lg-3-8,.pure-u-lg-3-24,.pure-u-lg-4-5,.pure-u-lg-4-24,.pure-u-lg-5-5,.pure-u-lg-5-6,.pure-u-lg-5-8,.pure-u-lg-5-12,.pure-u-lg-5-24,.pure-u-lg-6-24,.pure-u-lg-7-8,.pure-u-lg-7-12,.pure-u-lg-7-24,.pure-u-lg-8-24,.pure-u-lg-9-24,.pure-u-lg-10-24,.pure-u-lg-11-12,.pure-u-lg-11-24,.pure-u-lg-12-24,.pure-u-lg-13-24,.pure-u-lg-14-24,.pure-u-lg-15-24,.pure-u-lg-16-24,.pure-u-lg-17-24,.pure-u-lg-18-24,.pure-u-lg-19-24,.pure-u-lg-20-24,.pure-u-lg-21-24,.pure-u-lg-22-24,.pure-u-lg-23-24,.pure-u-lg-24-24{display:inline-block;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-lg-1-24{width:4.1667%}.pure-u-lg-1-12,.pure-u-lg-2-24{width:8.3333%}.pure-u-lg-1-8,.pure-u-lg-3-24{width:12.5%}.pure-u-lg-1-6,.pure-u-lg-4-24{width:16.6667%}.pure-u-lg-1-5{width:20%}.pure-u-lg-5-24{width:20.8333%}.pure-u-lg-1-4,.pure-u-lg-6-24{width:25%}.pure-u-lg-7-24{width:29.1667%}.pure-u-lg-1-3,.pure-u-lg-8-24{width:33.3333%}.pure-u-lg-3-8,.pure-u-lg-9-24{width:37.5%}.pure-u-lg-2-5{width:40%}.pure-u-lg-5-12,.pure-u-lg-10-24{width:41.6667%}.pure-u-lg-11-24{width:45.8333%}.pure-u-lg-1-2,.pure-u-lg-12-24{width:50%}.pure-u-lg-13-24{width:54.1667%}.pure-u-lg-7-12,.pure-u-lg-14-24{width:58.3333%}.pure-u-lg-3-5{width:60%}.pure-u-lg-5-8,.pure-u-lg-15-24{width:62.5%}.pure-u-lg-2-3,.pure-u-lg-16-24{width:66.6667%}.pure-u-lg-17-24{width:70.8333%}.pure-u-lg-3-4,.pure-u-lg-18-24{width:75%}.pure-u-lg-19-24{width:79.1667%}.pure-u-lg-4-5{width:80%}.pure-u-lg-5-6,.pure-u-lg-20-24{width:83.3333%}.pure-u-lg-7-8,.pure-u-lg-21-24{width:87.5%}.pure-u-lg-11-12,.pure-u-lg-22-24{width:91.6667%}.pure-u-lg-23-24{width:95.8333%}.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-5-5,.pure-u-lg-24-24{width:100%}.pure-u-1,.pure-u-1-1,.pure-u-1-2,.pure-u-1-3,.pure-u-1-4,.pure-u-1-5,.pure-u-1-6,.pure-u-1-8,.pure-u-1-12,.pure-u-1-24,.pure-u-2-3,.pure-u-2-5,.pure-u-2-24,.pure-u-3-4,.pure-u-3-5,.pure-u-3-8,.pure-u-3-24,.pure-u-4-5,.pure-u-4-24,.pure-u-5-5,.pure-u-5-6,.pure-u-5-8,.pure-u-5-12,.pure-u-5-24,.pure-u-6-24,.pure-u-7-8,.pure-u-7-12,.pure-u-7-24,.pure-u-8-24,.pure-u-9-24,.pure-u-10-24,.pure-u-11-12,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%;*width:4.1357%}.pure-u-1-12,.pure-u-2-24{width:8.3333%;*width:8.3023%}.pure-u-1-8,.pure-u-3-24{width:12.5%;*width:12.469%}.pure-u-1-6,.pure-u-4-24{width:16.6667%;*width:16.6357%}.pure-u-1-5{width:20%;*width:19.969%}.pure-u-5-24{width:20.8333%;*width:20.8023%}.pure-u-1-4,.pure-u-6-24{width:25%;*width:24.969%}.pure-u-7-24{width:29.1667%;*width:29.1357%}.pure-u-1-3,.pure-u-8-24{width:33.3333%;*width:33.3023%}.pure-u-3-8,.pure-u-9-24{width:37.5%;*width:37.469%}.pure-u-2-5{width:40%;*width:39.969%}.pure-u-5-12,.pure-u-10-24{width:41.6667%;*width:41.6357%}.pure-u-11-24{width:45.8333%;*width:45.8023%}.pure-u-1-2,.pure-u-12-24{width:50%;*width:49.969%}.pure-u-13-24{width:54.1667%;*width:54.1357%}.pure-u-7-12,.pure-u-14-24{width:58.3333%;*width:58.3023%}.pure-u-3-5{width:60%;*width:59.969%}.pure-u-5-8,.pure-u-15-24{width:62.5%;*width:62.469%}.pure-u-2-3,.pure-u-16-24{width:66.6667%;*width:66.6357%}.pure-u-17-24{width:70.8333%;*width:70.8023%}.pure-u-3-4,.pure-u-18-24{width:75%;*width:74.969%}.pure-u-19-24{width:79.1667%;*width:79.1357%}.pure-u-4-5{width:80%;*width:79.969%}.pure-u-5-6,.pure-u-20-24{width:83.3333%;*width:83.3023%}.pure-u-7-8,.pure-u-21-24{width:87.5%;*width:87.469%}.pure-u-11-12,.pure-u-22-24{width:91.6667%;*width:91.6357%}.pure-u-23-24{width:95.8333%;*width:95.8023%}.pure-u-1,.pure-u-1-1,.pure-u-5-5,.pure-u-24-24{width:100%}.pure-menu{box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:1}.pure-menu-item,.pure-menu-list{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.pure-menu-heading,.pure-menu-link{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-separator{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu-horizontal .pure-menu-children .pure-menu-separator,.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{display:block;width:auto}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#1d1f21}.pure-menu-disabled,.pure-menu-heading,.pure-menu-link{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent}.pure-menu-active>.pure-menu-link,.pure-menu-link:focus,.pure-menu-link:hover{background-color:#282a2e}.pure-menu-selected .pure-menu-link,.pure-menu-selected .pure-menu-link:visited{color:#e2e0de}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#e2e0de;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background-color:#e0e0e0;color:#e2e0de;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td,.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0}.highlight .hll{background-color:#373b41}.highlight{background:#101112;color:#c5c8c6}.highlight .c{color:#969896}.highlight .err{color:#c66}.highlight .k{color:#b294bb}.highlight .l{color:#de935f}.highlight .n{color:#c5c8c6}.highlight .o{color:#8abeb7}.highlight .p{color:#c5c8c6}.highlight .c1,.highlight .cm,.highlight .cp,.highlight .cs{color:#969896}.highlight .gd{color:#c66}.highlight .ge{font-style:italic}.highlight .gh{color:#c5c8c6;font-weight:700}.highlight .gi{color:#b5bd68}.highlight .gp{color:#969896}.highlight .gp,.highlight .gs,.highlight .gu{font-weight:700}.highlight .gu{color:#8abeb7}.highlight .kc,.highlight .kd{color:#b294bb}.highlight .kn{color:#8abeb7}.highlight .kp,.highlight .kr{color:#b294bb}.highlight .kt{color:#f0c674}.highlight .ld{color:#b5bd68}.highlight .m{color:#de935f}.highlight .s{color:#b5bd68}.highlight .na{color:#81a2be}.highlight .nb{color:#c5c8c6}.highlight .nc{color:#f0c674}.highlight .no{color:#c66}.highlight .nd{color:#8abeb7}.highlight .ni{color:#c5c8c6}.highlight .ne{color:#c66}.highlight .nf{color:#81a2be}.highlight .nl{color:#c5c8c6}.highlight .nn{color:#f0c674}.highlight .nx{color:#81a2be}.highlight .py{color:#c5c8c6}.highlight .nt{color:#8abeb7}.highlight .nv{color:#c66}.highlight .ow{color:#8abeb7}.highlight .w{color:#c5c8c6}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#de935f}.highlight .sb{color:#b5bd68}.highlight .sc{color:#c5c8c6}.highlight .sd{color:#969896}.highlight .s2{color:#b5bd68}.highlight .se{color:#de935f}.highlight .sh{color:#b5bd68}.highlight .si{color:#de935f}.highlight .s1,.highlight .sr,.highlight .ss,.highlight .sx{color:#b5bd68}.highlight .bp{color:#c5c8c6}.highlight .vc,.highlight .vg,.highlight .vi{color:#c66}.highlight .il{color:#de935f}body{background-color:#1d1f21;color:#c5c8c6;font-display:swap;font-family:Source Sans Pro,sans-serif;font-size:18px;font-style:normal;font-weight:400}abbr,cite,q{font-family:Source Serif Pro,serif}cite,em,q{font-style:italic}b,bold,dt,strong{font-weight:700}code,kbd,pre,samp{font-family:Source Code Pro,monospace}kbd,samp{background-color:#282a2e}.highlight,code,kbd,pre,samp{border:0;border-radius:.25em;padding:0 .125em}mark{background-color:#f0c674}blockquote{border-left:.5em solid #969896;border-radius:.25em;margin-left:0;padding-left:2em}a{color:#81a2be}a:hover,a:hover:visited{color:#8abeb7}a:visited{color:#b294bb}hr{border:0;border-top:1px dashed #c5c8c6}::-moz-selection{background-color:#373b41}::selection{background-color:#373b41}.pure-g [class*=pure-u],button,html,input,select,textarea{color:#c5c8c6;font-family:Source Sans Pro,sans-serif;font-weight:400}.pure-table{border:1px solid #969896;color:#c5c8c6;background-color:#1d1f21}.pure-table td,.pure-table th{border-left:1px solid #969896}.pure-table thead{color:#c5c8c6;background-color:#282a2e}.pure-menu a,.pure-menu a:hover,.pure-menu a:hover:visited,.pure-menu a:visited{color:#c5c8c6}.pure-menu-header:hover,.pure-menu-item:hover{background-color:#282a2e}.pure-menu-disabled:hover{background-color:transparent}.footer-content{border-top:1px solid #c5c8c6}.navigation-content{border-bottom:1px solid #c5c8c6}.navigation-header{font-size:1.25em}.navigation-header a{color:#c5c8c6}.navigation-header-subtitle{font-family:Source Serif Pro,serif}.footer-content,.navigation-content,.pagination-content{display:table;margin:0 auto;text-align:center;width:100%}figure{text-align:center}figure img{margin:0 auto}.post-title{font-family:Source Serif Pro,serif;font-weight:700;margin-bottom:0}.post-meta{font-size:.9em;margin:0 0 .5em}.post-meta a{text-decoration:none}.post-meta a:hover{text-decoration:underline}.post-divider{border-top:1px solid #c5c8c6}.pull-end{float:right}.pull-start,[dir=rtl] .pull-end{float:left}[dir=rtl] pull-start{float:right}.fixup{position:relative;top:-.05em} \ No newline at end of file diff --git a/themes/tastytea/static/assets/style.css b/themes/tastytea/static/assets/style.css new file mode 100644 index 0000000..56b3743 --- /dev/null +++ b/themes/tastytea/static/assets/style.css @@ -0,0 +1 @@ +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{max-width:100ch;margin:auto}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#e2e0de}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,Droid Sans,Helvetica,Arial,sans-serif;display:flex;flex-flow:row wrap;align-content:flex-start}@media (-ms-high-contrast:active),(-ms-high-contrast:none){table .pure-g{display:block}}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class*=pure-u]{font-family:sans-serif}@media screen and (min-width:35.5em){.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-1-2,.pure-u-sm-1-3,.pure-u-sm-1-4,.pure-u-sm-1-5,.pure-u-sm-1-6,.pure-u-sm-1-8,.pure-u-sm-1-12,.pure-u-sm-1-24,.pure-u-sm-2-3,.pure-u-sm-2-5,.pure-u-sm-2-24,.pure-u-sm-3-4,.pure-u-sm-3-5,.pure-u-sm-3-8,.pure-u-sm-3-24,.pure-u-sm-4-5,.pure-u-sm-4-24,.pure-u-sm-5-5,.pure-u-sm-5-6,.pure-u-sm-5-8,.pure-u-sm-5-12,.pure-u-sm-5-24,.pure-u-sm-6-24,.pure-u-sm-7-8,.pure-u-sm-7-12,.pure-u-sm-7-24,.pure-u-sm-8-24,.pure-u-sm-9-24,.pure-u-sm-10-24,.pure-u-sm-11-12,.pure-u-sm-11-24,.pure-u-sm-12-24,.pure-u-sm-13-24,.pure-u-sm-14-24,.pure-u-sm-15-24,.pure-u-sm-16-24,.pure-u-sm-17-24,.pure-u-sm-18-24,.pure-u-sm-19-24,.pure-u-sm-20-24,.pure-u-sm-21-24,.pure-u-sm-22-24,.pure-u-sm-23-24,.pure-u-sm-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-sm-1-24{width:4.1667%;*width:4.1357%}.pure-u-sm-1-12,.pure-u-sm-2-24{width:8.3333%;*width:8.3023%}.pure-u-sm-1-8,.pure-u-sm-3-24{width:12.5%;*width:12.469%}.pure-u-sm-1-6,.pure-u-sm-4-24{width:16.6667%;*width:16.6357%}.pure-u-sm-1-5{width:20%;*width:19.969%}.pure-u-sm-5-24{width:20.8333%;*width:20.8023%}.pure-u-sm-1-4,.pure-u-sm-6-24{width:25%;*width:24.969%}.pure-u-sm-7-24{width:29.1667%;*width:29.1357%}.pure-u-sm-1-3,.pure-u-sm-8-24{width:33.3333%;*width:33.3023%}.pure-u-sm-3-8,.pure-u-sm-9-24{width:37.5%;*width:37.469%}.pure-u-sm-2-5{width:40%;*width:39.969%}.pure-u-sm-5-12,.pure-u-sm-10-24{width:41.6667%;*width:41.6357%}.pure-u-sm-11-24{width:45.8333%;*width:45.8023%}.pure-u-sm-1-2,.pure-u-sm-12-24{width:50%;*width:49.969%}.pure-u-sm-13-24{width:54.1667%;*width:54.1357%}.pure-u-sm-7-12,.pure-u-sm-14-24{width:58.3333%;*width:58.3023%}.pure-u-sm-3-5{width:60%;*width:59.969%}.pure-u-sm-5-8,.pure-u-sm-15-24{width:62.5%;*width:62.469%}.pure-u-sm-2-3,.pure-u-sm-16-24{width:66.6667%;*width:66.6357%}.pure-u-sm-17-24{width:70.8333%;*width:70.8023%}.pure-u-sm-3-4,.pure-u-sm-18-24{width:75%;*width:74.969%}.pure-u-sm-19-24{width:79.1667%;*width:79.1357%}.pure-u-sm-4-5{width:80%;*width:79.969%}.pure-u-sm-5-6,.pure-u-sm-20-24{width:83.3333%;*width:83.3023%}.pure-u-sm-7-8,.pure-u-sm-21-24{width:87.5%;*width:87.469%}.pure-u-sm-11-12,.pure-u-sm-22-24{width:91.6667%;*width:91.6357%}.pure-u-sm-23-24{width:95.8333%;*width:95.8023%}.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-5-5,.pure-u-sm-24-24{width:100%}}@media screen and (min-width:48em){.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-1-2,.pure-u-md-1-3,.pure-u-md-1-4,.pure-u-md-1-5,.pure-u-md-1-6,.pure-u-md-1-8,.pure-u-md-1-12,.pure-u-md-1-24,.pure-u-md-2-3,.pure-u-md-2-5,.pure-u-md-2-24,.pure-u-md-3-4,.pure-u-md-3-5,.pure-u-md-3-8,.pure-u-md-3-24,.pure-u-md-4-5,.pure-u-md-4-24,.pure-u-md-5-5,.pure-u-md-5-6,.pure-u-md-5-8,.pure-u-md-5-12,.pure-u-md-5-24,.pure-u-md-6-24,.pure-u-md-7-8,.pure-u-md-7-12,.pure-u-md-7-24,.pure-u-md-8-24,.pure-u-md-9-24,.pure-u-md-10-24,.pure-u-md-11-12,.pure-u-md-11-24,.pure-u-md-12-24,.pure-u-md-13-24,.pure-u-md-14-24,.pure-u-md-15-24,.pure-u-md-16-24,.pure-u-md-17-24,.pure-u-md-18-24,.pure-u-md-19-24,.pure-u-md-20-24,.pure-u-md-21-24,.pure-u-md-22-24,.pure-u-md-23-24,.pure-u-md-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-md-1-24{width:4.1667%;*width:4.1357%}.pure-u-md-1-12,.pure-u-md-2-24{width:8.3333%;*width:8.3023%}.pure-u-md-1-8,.pure-u-md-3-24{width:12.5%;*width:12.469%}.pure-u-md-1-6,.pure-u-md-4-24{width:16.6667%;*width:16.6357%}.pure-u-md-1-5{width:20%;*width:19.969%}.pure-u-md-5-24{width:20.8333%;*width:20.8023%}.pure-u-md-1-4,.pure-u-md-6-24{width:25%;*width:24.969%}.pure-u-md-7-24{width:29.1667%;*width:29.1357%}.pure-u-md-1-3,.pure-u-md-8-24{width:33.3333%;*width:33.3023%}.pure-u-md-3-8,.pure-u-md-9-24{width:37.5%;*width:37.469%}.pure-u-md-2-5{width:40%;*width:39.969%}.pure-u-md-5-12,.pure-u-md-10-24{width:41.6667%;*width:41.6357%}.pure-u-md-11-24{width:45.8333%;*width:45.8023%}.pure-u-md-1-2,.pure-u-md-12-24{width:50%;*width:49.969%}.pure-u-md-13-24{width:54.1667%;*width:54.1357%}.pure-u-md-7-12,.pure-u-md-14-24{width:58.3333%;*width:58.3023%}.pure-u-md-3-5{width:60%;*width:59.969%}.pure-u-md-5-8,.pure-u-md-15-24{width:62.5%;*width:62.469%}.pure-u-md-2-3,.pure-u-md-16-24{width:66.6667%;*width:66.6357%}.pure-u-md-17-24{width:70.8333%;*width:70.8023%}.pure-u-md-3-4,.pure-u-md-18-24{width:75%;*width:74.969%}.pure-u-md-19-24{width:79.1667%;*width:79.1357%}.pure-u-md-4-5{width:80%;*width:79.969%}.pure-u-md-5-6,.pure-u-md-20-24{width:83.3333%;*width:83.3023%}.pure-u-md-7-8,.pure-u-md-21-24{width:87.5%;*width:87.469%}.pure-u-md-11-12,.pure-u-md-22-24{width:91.6667%;*width:91.6357%}.pure-u-md-23-24{width:95.8333%;*width:95.8023%}.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-5-5,.pure-u-md-24-24{width:100%}}@media screen and (min-width:64em){.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-1-2,.pure-u-lg-1-3,.pure-u-lg-1-4,.pure-u-lg-1-5,.pure-u-lg-1-6,.pure-u-lg-1-8,.pure-u-lg-1-12,.pure-u-lg-1-24,.pure-u-lg-2-3,.pure-u-lg-2-5,.pure-u-lg-2-24,.pure-u-lg-3-4,.pure-u-lg-3-5,.pure-u-lg-3-8,.pure-u-lg-3-24,.pure-u-lg-4-5,.pure-u-lg-4-24,.pure-u-lg-5-5,.pure-u-lg-5-6,.pure-u-lg-5-8,.pure-u-lg-5-12,.pure-u-lg-5-24,.pure-u-lg-6-24,.pure-u-lg-7-8,.pure-u-lg-7-12,.pure-u-lg-7-24,.pure-u-lg-8-24,.pure-u-lg-9-24,.pure-u-lg-10-24,.pure-u-lg-11-12,.pure-u-lg-11-24,.pure-u-lg-12-24,.pure-u-lg-13-24,.pure-u-lg-14-24,.pure-u-lg-15-24,.pure-u-lg-16-24,.pure-u-lg-17-24,.pure-u-lg-18-24,.pure-u-lg-19-24,.pure-u-lg-20-24,.pure-u-lg-21-24,.pure-u-lg-22-24,.pure-u-lg-23-24,.pure-u-lg-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-lg-1-24{width:4.1667%;*width:4.1357%}.pure-u-lg-1-12,.pure-u-lg-2-24{width:8.3333%;*width:8.3023%}.pure-u-lg-1-8,.pure-u-lg-3-24{width:12.5%;*width:12.469%}.pure-u-lg-1-6,.pure-u-lg-4-24{width:16.6667%;*width:16.6357%}.pure-u-lg-1-5{width:20%;*width:19.969%}.pure-u-lg-5-24{width:20.8333%;*width:20.8023%}.pure-u-lg-1-4,.pure-u-lg-6-24{width:25%;*width:24.969%}.pure-u-lg-7-24{width:29.1667%;*width:29.1357%}.pure-u-lg-1-3,.pure-u-lg-8-24{width:33.3333%;*width:33.3023%}.pure-u-lg-3-8,.pure-u-lg-9-24{width:37.5%;*width:37.469%}.pure-u-lg-2-5{width:40%;*width:39.969%}.pure-u-lg-5-12,.pure-u-lg-10-24{width:41.6667%;*width:41.6357%}.pure-u-lg-11-24{width:45.8333%;*width:45.8023%}.pure-u-lg-1-2,.pure-u-lg-12-24{width:50%;*width:49.969%}.pure-u-lg-13-24{width:54.1667%;*width:54.1357%}.pure-u-lg-7-12,.pure-u-lg-14-24{width:58.3333%;*width:58.3023%}.pure-u-lg-3-5{width:60%;*width:59.969%}.pure-u-lg-5-8,.pure-u-lg-15-24{width:62.5%;*width:62.469%}.pure-u-lg-2-3,.pure-u-lg-16-24{width:66.6667%;*width:66.6357%}.pure-u-lg-17-24{width:70.8333%;*width:70.8023%}.pure-u-lg-3-4,.pure-u-lg-18-24{width:75%;*width:74.969%}.pure-u-lg-19-24{width:79.1667%;*width:79.1357%}.pure-u-lg-4-5{width:80%;*width:79.969%}.pure-u-lg-5-6,.pure-u-lg-20-24{width:83.3333%;*width:83.3023%}.pure-u-lg-7-8,.pure-u-lg-21-24{width:87.5%;*width:87.469%}.pure-u-lg-11-12,.pure-u-lg-22-24{width:91.6667%;*width:91.6357%}.pure-u-lg-23-24{width:95.8333%;*width:95.8023%}.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-5-5,.pure-u-lg-24-24{width:100%}}@media screen and (min-width:80em){.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-1-2,.pure-u-xl-1-3,.pure-u-xl-1-4,.pure-u-xl-1-5,.pure-u-xl-1-6,.pure-u-xl-1-8,.pure-u-xl-1-12,.pure-u-xl-1-24,.pure-u-xl-2-3,.pure-u-xl-2-5,.pure-u-xl-2-24,.pure-u-xl-3-4,.pure-u-xl-3-5,.pure-u-xl-3-8,.pure-u-xl-3-24,.pure-u-xl-4-5,.pure-u-xl-4-24,.pure-u-xl-5-5,.pure-u-xl-5-6,.pure-u-xl-5-8,.pure-u-xl-5-12,.pure-u-xl-5-24,.pure-u-xl-6-24,.pure-u-xl-7-8,.pure-u-xl-7-12,.pure-u-xl-7-24,.pure-u-xl-8-24,.pure-u-xl-9-24,.pure-u-xl-10-24,.pure-u-xl-11-12,.pure-u-xl-11-24,.pure-u-xl-12-24,.pure-u-xl-13-24,.pure-u-xl-14-24,.pure-u-xl-15-24,.pure-u-xl-16-24,.pure-u-xl-17-24,.pure-u-xl-18-24,.pure-u-xl-19-24,.pure-u-xl-20-24,.pure-u-xl-21-24,.pure-u-xl-22-24,.pure-u-xl-23-24,.pure-u-xl-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-xl-1-24{width:4.1667%;*width:4.1357%}.pure-u-xl-1-12,.pure-u-xl-2-24{width:8.3333%;*width:8.3023%}.pure-u-xl-1-8,.pure-u-xl-3-24{width:12.5%;*width:12.469%}.pure-u-xl-1-6,.pure-u-xl-4-24{width:16.6667%;*width:16.6357%}.pure-u-xl-1-5{width:20%;*width:19.969%}.pure-u-xl-5-24{width:20.8333%;*width:20.8023%}.pure-u-xl-1-4,.pure-u-xl-6-24{width:25%;*width:24.969%}.pure-u-xl-7-24{width:29.1667%;*width:29.1357%}.pure-u-xl-1-3,.pure-u-xl-8-24{width:33.3333%;*width:33.3023%}.pure-u-xl-3-8,.pure-u-xl-9-24{width:37.5%;*width:37.469%}.pure-u-xl-2-5{width:40%;*width:39.969%}.pure-u-xl-5-12,.pure-u-xl-10-24{width:41.6667%;*width:41.6357%}.pure-u-xl-11-24{width:45.8333%;*width:45.8023%}.pure-u-xl-1-2,.pure-u-xl-12-24{width:50%;*width:49.969%}.pure-u-xl-13-24{width:54.1667%;*width:54.1357%}.pure-u-xl-7-12,.pure-u-xl-14-24{width:58.3333%;*width:58.3023%}.pure-u-xl-3-5{width:60%;*width:59.969%}.pure-u-xl-5-8,.pure-u-xl-15-24{width:62.5%;*width:62.469%}.pure-u-xl-2-3,.pure-u-xl-16-24{width:66.6667%;*width:66.6357%}.pure-u-xl-17-24{width:70.8333%;*width:70.8023%}.pure-u-xl-3-4,.pure-u-xl-18-24{width:75%;*width:74.969%}.pure-u-xl-19-24{width:79.1667%;*width:79.1357%}.pure-u-xl-4-5{width:80%;*width:79.969%}.pure-u-xl-5-6,.pure-u-xl-20-24{width:83.3333%;*width:83.3023%}.pure-u-xl-7-8,.pure-u-xl-21-24{width:87.5%;*width:87.469%}.pure-u-xl-11-12,.pure-u-xl-22-24{width:91.6667%;*width:91.6357%}.pure-u-xl-23-24{width:95.8333%;*width:95.8023%}.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-5-5,.pure-u-xl-24-24{width:100%}}.pure-u-1,.pure-u-1-1,.pure-u-1-2,.pure-u-1-3,.pure-u-1-4,.pure-u-1-5,.pure-u-1-6,.pure-u-1-8,.pure-u-1-12,.pure-u-1-24,.pure-u-2-3,.pure-u-2-5,.pure-u-2-24,.pure-u-3-4,.pure-u-3-5,.pure-u-3-8,.pure-u-3-24,.pure-u-4-5,.pure-u-4-24,.pure-u-5-5,.pure-u-5-6,.pure-u-5-8,.pure-u-5-12,.pure-u-5-24,.pure-u-6-24,.pure-u-7-8,.pure-u-7-12,.pure-u-7-24,.pure-u-8-24,.pure-u-9-24,.pure-u-10-24,.pure-u-11-12,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%;*width:4.1357%}.pure-u-1-12,.pure-u-2-24{width:8.3333%;*width:8.3023%}.pure-u-1-8,.pure-u-3-24{width:12.5%;*width:12.469%}.pure-u-1-6,.pure-u-4-24{width:16.6667%;*width:16.6357%}.pure-u-1-5{width:20%;*width:19.969%}.pure-u-5-24{width:20.8333%;*width:20.8023%}.pure-u-1-4,.pure-u-6-24{width:25%;*width:24.969%}.pure-u-7-24{width:29.1667%;*width:29.1357%}.pure-u-1-3,.pure-u-8-24{width:33.3333%;*width:33.3023%}.pure-u-3-8,.pure-u-9-24{width:37.5%;*width:37.469%}.pure-u-2-5{width:40%;*width:39.969%}.pure-u-5-12,.pure-u-10-24{width:41.6667%;*width:41.6357%}.pure-u-11-24{width:45.8333%;*width:45.8023%}.pure-u-1-2,.pure-u-12-24{width:50%;*width:49.969%}.pure-u-13-24{width:54.1667%;*width:54.1357%}.pure-u-7-12,.pure-u-14-24{width:58.3333%;*width:58.3023%}.pure-u-3-5{width:60%;*width:59.969%}.pure-u-5-8,.pure-u-15-24{width:62.5%;*width:62.469%}.pure-u-2-3,.pure-u-16-24{width:66.6667%;*width:66.6357%}.pure-u-17-24{width:70.8333%;*width:70.8023%}.pure-u-3-4,.pure-u-18-24{width:75%;*width:74.969%}.pure-u-19-24{width:79.1667%;*width:79.1357%}.pure-u-4-5{width:80%;*width:79.969%}.pure-u-5-6,.pure-u-20-24{width:83.3333%;*width:83.3023%}.pure-u-7-8,.pure-u-21-24{width:87.5%;*width:87.469%}.pure-u-11-12,.pure-u-22-24{width:91.6667%;*width:91.6357%}.pure-u-23-24{width:95.8333%;*width:95.8023%}.pure-u-1,.pure-u-1-1,.pure-u-5-5,.pure-u-24-24{width:100%}.pure-menu{box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:1}.pure-menu-item,.pure-menu-list{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.pure-menu-heading,.pure-menu-link{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-separator{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu-horizontal .pure-menu-children .pure-menu-separator,.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{display:block;width:auto}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#1d1f21}.pure-menu-disabled,.pure-menu-heading,.pure-menu-link{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent}.pure-menu-active>.pure-menu-link,.pure-menu-link:focus,.pure-menu-link:hover{background-color:#282a2e}.pure-menu-selected .pure-menu-link,.pure-menu-selected .pure-menu-link:visited{color:#e2e0de}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#e2e0de;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background-color:#e0e0e0;color:#e2e0de;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td,.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0}.highlight .hll{background-color:#373b41}.highlight{background:#101112;color:#c5c8c6}.highlight .c{color:#969896}.highlight .err{color:#c66}.highlight .k{color:#b294bb}.highlight .l{color:#de935f}.highlight .n{color:#c5c8c6}.highlight .o{color:#8abeb7}.highlight .p{color:#c5c8c6}.highlight .c1,.highlight .cm,.highlight .cp,.highlight .cs{color:#969896}.highlight .gd{color:#c66}.highlight .ge{font-style:italic}.highlight .gh{color:#c5c8c6;font-weight:700}.highlight .gi{color:#b5bd68}.highlight .gp{color:#969896}.highlight .gp,.highlight .gs,.highlight .gu{font-weight:700}.highlight .gu{color:#8abeb7}.highlight .kc,.highlight .kd{color:#b294bb}.highlight .kn{color:#8abeb7}.highlight .kp,.highlight .kr{color:#b294bb}.highlight .kt{color:#f0c674}.highlight .ld{color:#b5bd68}.highlight .m{color:#de935f}.highlight .s{color:#b5bd68}.highlight .na{color:#81a2be}.highlight .nb{color:#c5c8c6}.highlight .nc{color:#f0c674}.highlight .no{color:#c66}.highlight .nd{color:#8abeb7}.highlight .ni{color:#c5c8c6}.highlight .ne{color:#c66}.highlight .nf{color:#81a2be}.highlight .nl{color:#c5c8c6}.highlight .nn{color:#f0c674}.highlight .nx{color:#81a2be}.highlight .py{color:#c5c8c6}.highlight .nt{color:#8abeb7}.highlight .nv{color:#c66}.highlight .ow{color:#8abeb7}.highlight .w{color:#c5c8c6}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#de935f}.highlight .sb{color:#b5bd68}.highlight .sc{color:#c5c8c6}.highlight .sd{color:#969896}.highlight .s2{color:#b5bd68}.highlight .se{color:#de935f}.highlight .sh{color:#b5bd68}.highlight .si{color:#de935f}.highlight .s1,.highlight .sr,.highlight .ss,.highlight .sx{color:#b5bd68}.highlight .bp{color:#c5c8c6}.highlight .vc,.highlight .vg,.highlight .vi{color:#c66}.highlight .il{color:#de935f}body{background-color:#1d1f21;color:#c5c8c6;font-display:swap;font-family:Source Sans Pro,sans-serif;font-size:18px;font-style:normal;font-weight:400}abbr,cite,q{font-family:Source Serif Pro,serif}cite,em,q{font-style:italic}b,bold,dt,strong{font-weight:700}code,kbd,pre,samp{font-family:Source Code Pro,monospace}kbd,samp{background-color:#282a2e}.highlight,code,kbd,pre,samp{border:0;border-radius:.25em;padding:0 .125em}mark{background-color:#f0c674}blockquote{border-left:.5em solid #969896;border-radius:.25em;margin-left:0;padding-left:2em}a{color:#81a2be}a:hover,a:hover:visited{color:#8abeb7}a:visited{color:#b294bb}hr{border:0;border-top:1px dashed #c5c8c6}::-moz-selection{background-color:#373b41}::selection{background-color:#373b41}.pure-g [class*=pure-u],button,html,input,select,textarea{color:#c5c8c6;font-family:Source Sans Pro,sans-serif;font-weight:400}.pure-table{border:1px solid #969896;color:#c5c8c6;background-color:#1d1f21}.pure-table td,.pure-table th{border-left:1px solid #969896}.pure-table thead{color:#c5c8c6;background-color:#282a2e}.pure-menu a,.pure-menu a:hover,.pure-menu a:hover:visited,.pure-menu a:visited{color:#c5c8c6}.pure-menu-header:hover,.pure-menu-item:hover{background-color:#282a2e}.pure-menu-disabled:hover{background-color:transparent}.footer-content{border-top:1px solid #c5c8c6}.navigation-content{border-bottom:1px solid #c5c8c6}.navigation-header{font-size:1.25em}.navigation-header a{color:#c5c8c6}.navigation-header-subtitle{font-family:Source Serif Pro,serif}.footer-content,.navigation-content,.pagination-content{display:table;margin:0 auto;text-align:center;width:100%}figure{text-align:center}figure img{margin:0 auto}.post-title{font-family:Source Serif Pro,serif;font-weight:700;margin-bottom:0}.post-meta{font-size:.9em;margin:0 0 .5em}.post-meta a{text-decoration:none}.post-meta a:hover{text-decoration:underline}.post-divider{border-top:1px solid #c5c8c6}.pull-end{float:right}.pull-start,[dir=rtl] .pull-end{float:left}[dir=rtl] pull-start{float:right}.fixup{position:relative;top:-.05em} \ No newline at end of file