initial commit

This commit is contained in:
Nils Schulte 2019-10-29 06:06:23 +01:00
commit b909b7cc0e
24 changed files with 2695 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
public/

5
README.md Normal file
View File

@ -0,0 +1,5 @@
source code for my personal blog
## Licence
The content of this blog is licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/legalcode) and the Rest under the [MIT license](http://opensource.org/licenses/mit-license.php).

6
archetypes/default.md Normal file
View File

@ -0,0 +1,6 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
---

7
config.toml Normal file
View File

@ -0,0 +1,7 @@
baseURL = "https://nilsschulte.de/"
languageCode = "en-us"
title = "nilsschulte.de"
pygmentsCodeFences = true
pygmentsCodeFencesGuessSyntax = true

View File

@ -0,0 +1,73 @@
---
title: "Automating my desk lamp"
date: 2019-10-28T21:11:15+02:00
draft: false
summary: Let the computer turn on the lamp...
images: [/static/img/lamp-relay-esp.png]
---
Automation makes the life easier. At least thats what it should do...
In my case im not sure it actually did simplify my life as a few years later i own way more stuff and tools to build said automation than my small dorm room can handle.
Most of the stuff i build is now living on my desk. Among other things that includes my "smart" desk lamp[^1], which is just a normal IKEA lamp[^2] with the power cord cut, a 2-Channel relay from ebay and an ESP32 (which is a microcontroler with WIFI). Thous things in combination allow me to turn the lamp on when its getting dark and off when i'm finally lying in bed, which would normally be way out of reach of the light switch.
{{< figure src="/img/lamp-relay-esp.png" title="Relay wiring">}}
When you read instructions how to do this most of them say to just cut one mains wire. The circuit will work but as the EU-Plug is reversible that could mean only the neutral wire gets disconnected (depending on the orientation). Normally that doesn't matter as you can't touch it, but for example when you change the light bulb (and the lamp is off) there still could be live voltage in the lamp.
This was my first time messing with mains wiring and i had a ton of respect. I 3D-printed a nice case for the relay and the wiring so that even if i wanted to i couldn't touch the wiring. And cause im paranoid i put that in another electrical case just for good measure.
For the software i used [ESPHome](https://esphome.io/) which is a nice open source firmware for the ESP32 (and ESP8266). You define a YAML file with all the functionality you want to have and have esphome generate all the actual c++ code (and flash it also). My config for the lamp looks like this:
```yaml
esphome:
name: schreibtisch
platform: ESP32
board: nodemcu-32s
wifi:
ssid: " "
password: " "
use_address: "192.168.222.20"
ap:
ssid: "Schreibtisch Fallback Hotspot"
password: " "
ota:
safe_mode: True
password: " "
switch:
- platform: gpio
pin:
number: 33
inverted: True
name: "Schreibtischlampe"
id: relay1
web_server:
port: 80
auth:
username: "<usr>"
password: "<pw>"
logger:
```
After the first flashing of the ESP you can update the firmware over the air which is quite nice.
As you can see i defined a webserver which enables a REST-Api on the device.
To turn on the lamp on/off i can just type call a easy script which uses curl to make the request:
```bash
#/bin/sh!
curl -u <usr>:<pw> -X POST http://192.168.222.20/switch/schreibtischlampe/toggle
```
This setup already works but its actually not that good to only be able to control the lamp via a network connection. If thats down i can't turn on the light to fix[^3] the network connection which is bad cause then i cant turn on the light...
To escape that vicious circle of darkness i plan to add some nice tactile arcade buttons to my desk. Stay tuned for that!
[^1]: It can't play chess or drive a car but at least it connects to a router ;)
[^2]: A black [FORSÅ](https://www.ikea.com/de/de/p/forsa-arbeitsleuchte-schwarz-00146776/) to be exact
[^3]: And by that i mean restart the router under my desk

View File

@ -0,0 +1,18 @@
---
title: "Hello, World!"
date: 2019-10-26T21:11:15+02:00
draft: false
summary: Does the world need another blog ? Yes!...
images:
---
**Documentation is the most boring part of any project. However that doesn't mean its not important...**
Everything requieres mantainance and so there will come the day when you have to open up the project[^1] again and fix or repair something. For me this is always exiting since most of the time i have completely forgotten most of what i have done to do the repair. Having to sit down and getting into the mindset of my past self by just looking at the internals of the project takes way more time then if i just had written a few words about the thing in the first place.
That is where this blog comes into play. I want to have a fun way of just writing some quick words about a project while working on it. That way i can freshen up my memories when i need to know the details again. And there is a side benefit to that...
**YOU** get to read about it, too!
Let's see how that pans out or if im just going to stop after the first view posts ;)
[^1]: be it software or hardware

View File

@ -0,0 +1,31 @@
{{ printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>" | safeHTML }}
<feed xmlns="http://www.w3.org/2005/Atom">
<title>{{ .Site.Title }}</title>
<link href="{{ .Permalink }}"/>
{{ with .OutputFormats.Get "Atom" }}
{{ printf "<link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
{{ end }}
<updated>{{ .Date.Format "2006-01-02T15:04:05Z07:00" | safeHTML }}</updated>
<author>
{{ with $.Site.Author.name }}<name>{{ . }}</name>{{ end }}
{{ with $.Site.Author.email }}<email>{{ . }}</email>{{ end }}
</author>
<generator>Hugo</generator>
<id>{{ .Permalink }}</id>
{{ range first 15 .Pages }}
<entry>
<title>{{ .Title }}</title>
<link rel="alternate" href="{{ .Permalink }}"/>
<id>{{ .Permalink }}</id>
<published>{{ .Date.Format "2006-01-02T15:04:05Z07:00" | safeHTML }}</published>
<updated>{{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" | safeHTML }}</updated>
<summary>{{ .Summary | html }}</summary>
{{ range .Params.tags }}
<category term="{{ . }}"/>
{{ end }}
{{ range .Params.categories }}
<category term="{{ . }}"/>
{{ end }}
</entry>
{{ end }}
</feed>

View File

@ -0,0 +1,26 @@
{{ partial "header.html" . }}
<div class="article-list">
{{ range .Paginator.Pages }}
<article>
<header {{ if .Params.lang }}lang="{{- .Params.lang -}}"{{ end }}>
<time datetime="{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}">{{- .Date.Format "2006-01-02" -}}</time>
<h3>
<a href="{{ .Permalink }}">{{- .Title -}}</a>
{{ if and .Params.lang (ne .Site.Language.Lang .Params.lang) }}
<small>[{{ .Params.lang }}]</small>
{{ end }}
</h3>
</header>
<p class="summary">
{{.Summary}}
</p>
</article>
{{ end }}
</div>
<!-- TODO: pagination -->
{{ partial "footer.html" . }}

View File

@ -0,0 +1,33 @@
{{ printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>" | safeHTML }}
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>{{ .Site.Title }}</title>
<link>{{ .Permalink }}</link>
<description>Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }}</description>
<generator>Hugo</generator>{{ with .Site.LanguageCode }}
<language>{{.}}</language>{{end}}{{ with .Site.Author.email }}
<managingEditor>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</managingEditor>{{end}}{{ with .Site.Author.email }}
<webMaster>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</webMaster>{{end}}{{ with .Site.Copyright }}
<copyright>{{.}}</copyright>{{end}}{{ if not .Date.IsZero }}
<lastBuildDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
{{ with .OutputFormats.Get "RSS" }}
{{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
{{ end }}
{{ range first 15 .Pages }}
<item>
<title>{{ .Title }}</title>
<link>{{ .Permalink }}</link>
<pubDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
{{ with .Site.Author.email }}<author>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</author>{{end}}
<guid>{{ .Permalink }}</guid>
<description>{{ .Summary | html }}</description>
{{ range .Params.tags }}
<category>{{ . }}</category>
{{ end }}
{{ range .Params.categories }}
<category>{{ . }}</category>
{{ end }}
</item>
{{ end }}
</channel>
</rss>

View File

@ -0,0 +1,18 @@
{{ partial "header.html" . }}
<article {{ if .Params.lang }}lang="{{- .Params.lang -}}"{{ end }}>
<header>
<h1>{{ .Title }}</h1>
<time datetime='{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}'>{{- .Date.Format "2006-01-02" -}}</time>
</header>
{{ .Content }}
{{ if eq .Params.lang "en" }}
<footer>
{{ partial "article-footer.html" . }}
</footer>
{{ end }}
</article>
{{ partial "footer.html" . }}

28
layouts/index.html Normal file
View File

@ -0,0 +1,28 @@
{{ partial "head.html" . }}
<div id="background" style="
animation-name: backgroundFallin;
animation-duration: 1s;
animation-delay: 0.3s;
animation-timing-function: linear;
animation-fill-mode: both;">
</div>
<div id="main">
<main style="width: 100%;">
<div class="centerdiv">
<img class="logo_anim" src="img/tri.svg" alt="Triangles" style="
animation-name: headspin;
animation-duration: 2s;
animation-delay: 1.1s;
animation-fill-mode: both;">
</div>
<div class="centerdiv">
<img class="logo_anim" src="img/deal.svg" alt="Triangles" style="
animation-name: dealfall;
animation-duration: 4s;
animation-delay: 3.1s;
animation-timing-function: linear;
animation-fill-mode: both;">
</div>
{{ partial "nav.html" . }}
{{ partial "footer.html" . }}

View File

View File

@ -0,0 +1,2 @@
</body>
</html>

View File

@ -0,0 +1,9 @@
</main>
<footer>
© {{ now.Format "2006" }} Nils Schulte
<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="Creative Commons License" src="https://i.creativecommons.org/l/by/4.0/80x15.png"></a>
</footer>
</div>
{{ partial "foot.html" . }}

View File

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{{ partial "title.txt" . }}</title>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="canonical" href="{{ .Permalink }}">
{{ range .AlternativeOutputFormats -}}
<link rel="{{ .Rel }}" type="{{ .MediaType.Type }}" href="{{ .Permalink }}" title="{{ $.Site.Title }}" />
{{ end -}}
<link rel="stylesheet" href="{{ .Site.BaseURL }}css/normalize.css">
<link rel="stylesheet" href="{{ .Site.BaseURL }}css/style.css">
<link rel="shortcut icon" type="image/x-icon" href="{{ .Site.BaseURL }}\img\favicon.ico" />
</head>
<body>

View File

@ -0,0 +1,12 @@
{{ partial "head.html" . }}
<div id="background">
</div>
<div id="main">
<main>
{{ partial "nav.html" . }}

View File

@ -0,0 +1,5 @@
<nav>
{{- if not .IsHome }}<a href="{{ .Site.BaseURL }}">Home</a> &middot;{{ end }}
<a href="{{ .Site.BaseURL }}posts">Blog</a> &middot;
<a href="https://github.com/schnilz">GitHub</a>
</nav>

View File

@ -0,0 +1,15 @@
{{- $title := .Title -}}
{{- $siteTitle := .Site.Title -}}
{{- if .IsHome -}}
{{ $siteTitle }}
{{- else if eq .Kind "taxonomy" -}}
{{ title .Data.Singular }}: {{ $title }} · {{ $siteTitle }}
{{- else if eq .Kind "section" -}}
{{ $title }} · {{ $siteTitle }}
{{- else if .IsPage -}}
{{ $title }} · {{ $siteTitle }}
{{- else if not (eq .Title "") -}}
{{ $title }} · {{ $siteTitle }}
{{- else -}}
{{ $siteTitle }}
{{- end -}}

350
static/css/normalize.css vendored Normal file
View File

@ -0,0 +1,350 @@
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
/* Document
========================================================================== */
/**
* 1. Correct the line height in all browsers.
* 2. Prevent adjustments of font size after orientation changes in iOS.
*/
html {
line-height: 1.15; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/* Sections
========================================================================== */
/**
* Remove the margin in all browsers.
*/
body {
margin: 0;
}
/**
* Render the `main` element consistently in IE.
*/
main {
display: block;
}
/**
* Correct the font size and margin on `h1` elements within `section` and
* `article` contexts in Chrome, Firefox, and Safari.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/* Grouping content
========================================================================== */
/**
* 1. Add the correct box sizing in Firefox.
* 2. Show the overflow in Edge and IE.
*/
hr {
box-sizing: content-box; /* 1 */
height: 0; /* 1 */
overflow: visible; /* 2 */
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
pre {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/* Text-level semantics
========================================================================== */
/**
* Remove the gray background on active links in IE 10.
*/
a {
background-color: transparent;
}
/**
* 1. Remove the bottom border in Chrome 57-
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
*/
abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
}
/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/
b,
strong {
font-weight: bolder;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
* Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` elements from affecting the line height in
* all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/* Embedded content
========================================================================== */
/**
* Remove the border on images inside links in IE 10.
*/
img {
border-style: none;
}
/* Forms
========================================================================== */
/**
* 1. Change the font styles in all browsers.
* 2. Remove the margin in Firefox and Safari.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit; /* 1 */
font-size: 100%; /* 1 */
line-height: 1.15; /* 1 */
margin: 0; /* 2 */
}
/**
* Show the overflow in IE.
* 1. Show the overflow in Edge.
*/
button,
input { /* 1 */
overflow: visible;
}
/**
* Remove the inheritance of text transform in Edge, Firefox, and IE.
* 1. Remove the inheritance of text transform in Firefox.
*/
button,
select { /* 1 */
text-transform: none;
}
/**
* Correct the inability to style clickable types in iOS and Safari.
*/
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
/**
* Remove the inner border and padding in Firefox.
*/
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
/**
* Restore the focus styles unset by the previous rule.
*/
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
/**
* Correct the padding in Firefox.
*/
fieldset {
padding: 0.35em 0.75em 0.625em;
}
/**
* 1. Correct the text wrapping in Edge and IE.
* 2. Correct the color inheritance from `fieldset` elements in IE.
* 3. Remove the padding so developers are not caught out when they zero out
* `fieldset` elements in all browsers.
*/
legend {
box-sizing: border-box; /* 1 */
color: inherit; /* 2 */
display: table; /* 1 */
max-width: 100%; /* 1 */
padding: 0; /* 3 */
white-space: normal; /* 1 */
}
/**
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
*/
progress {
vertical-align: baseline;
}
/**
* Remove the default vertical scrollbar in IE 10+.
*/
textarea {
overflow: auto;
}
/**
* 1. Add the correct box sizing in IE 10.
* 2. Remove the padding in IE 10.
*/
[type="checkbox"],
[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Correct the cursor style of increment and decrement buttons in Chrome.
*/
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Correct the odd appearance in Chrome and Safari.
* 2. Correct the outline style in Safari.
*/
[type="search"] {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
* Remove the inner padding in Chrome and Safari on macOS.
*/
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* 1. Correct the inability to style clickable types in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/* Interactive
========================================================================== */
/*
* Add the correct display in Edge, IE 10+, and Firefox.
*/
details {
display: block;
}
/*
* Add the correct display in all browsers.
*/
summary {
display: list-item;
}
/* Misc
========================================================================== */
/**
* Add the correct display in IE 10+.
*/
template {
display: none;
}
/**
* Add the correct display in IE 10.
*/
[hidden] {
display: none;
}

410
static/css/style.css Normal file
View File

@ -0,0 +1,410 @@
html {
background-color: black;
color: #dfdfdf;
}
/* raleway-300 - latin */
@font-face {
font-family: 'Raleway';
font-style: normal;
font-weight: 300;
src: local('Raleway Light'), local('Raleway-Light'),
url('../fonts/raleway-v14-latin-300.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
url('../fonts/raleway-v14-latin-300.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
}
/* raleway-700 - latin */
@font-face {
font-family: 'Raleway';
font-style: normal;
font-weight: 700;
src: local('Raleway Bold'), local('Raleway-Bold'),
url('../fonts/raleway-v14-latin-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
url('../fonts/raleway-v14-latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
}
#background {
position: fixed;
z-index: -1;
background-color: rgb(63, 18, 18);/*rgb(153, 34, 13);*/
width: 100%;
height: 100%;
}
@keyframes backgroundFallin {
00% {height: 0%;}
10% {height: 0%;}
50% {height: 100%;}
65% {height: 80%;}
80% {height: 100%;}
90% {height: 90%;}
100% {height: 100%;}
}
@keyframes headspin {
0% {transform: rotate(-760deg) scale(0,0);}
100% {transform: rotate(0deg) scale(1,1);}
}
@keyframes dealfall {
0% {transform: translateY(-2000%) }
1% {transform: translateY(-200%) }
100% {transform: translateY(0%) }
}
body {
font-family: 'Raleway';
display: flex;
flex-flow: row;
text-align: center;
font-size: 20px;
}
body > header {
width: 100%;
position: absolute;
text-align: center;
align-content: center;
display: flex;
flex-flow: row;
}
body > header h1 {
display: flex;
flex-flow: row;
margin: 0;
}
#main {
flex: auto;
min-height: 100vh;
overflow: hidden;
display: flex;
flex-flow: column;
align-items: center;
}
#main > nav, #main > main, #main > footer {
padding: 15px;
}
#main > main {
flex: 1;
margin-right: 25px;
}
#main > footer {
padding-top: 50px;
}
@media (prefers-color-scheme: dark) {
html {
background-color: black;
color: #dfdfdf;
}
article img:not([src$=".jpg"]):not([src$=".jpeg"]) {
/* prevent transparent images from showing the black background */
background-color: white;
border: 5px solid white;
box-sizing: border-box;
}
}
/* Article list */
.article-list {
max-width: 45em;
width: 90vw;
}
.article-list article{
margin: 1.2em 0 0 0;
}
.article-list article > header {
display: flex;
flex-flow: row;
align-items: center;
margin-bottom: 0;
}
.article-list article time {
color:grey;
}
.article-list article h3 {
display: inline-block;
margin: 0.5em;
}
.article-list .summary {
text-align: justify;
margin: 0 1em;
}
.article-list article small {
font-weight: normal;
color: gray;
}
a, a:visited {
color: inherit;
}
article > header {
text-align: center;
margin-bottom: 2em;
}
article > header time {
color: gray;
}
article {
max-width: 45em;
width: 90vw;
text-align: justify;
}
article img, article video {
max-width: 100%;
}
article .footnotes {
font-size: 0.75em;
}
pre {
background-color: #272822;
color: #f8f8f2;
padding: 15px;
overflow: auto;
tab-size: 2;
-moz-tab-size: 2;
}
p code, li code {
color: #930d72;
}
.centerdiv {
margin: 0;
position: absolute;
display: flex;
width: 100%;
height: 90%;
z-index: -1;
}
.logo_anim {
margin:auto;
max-height: 60%;
max-width: 60%;
}
/* Layout *
body {
font-family: 'Fira Code', 'Nanum Gothic Coding', monospace;
display: flex;
flex-flow: row;
}
body > header {
text-align: center;
}
body > header h1 {
width: 1.5em;
font-size: 10em;
margin: 0 auto;
}
body > header p {
color: gray;
}
#main {
flex: auto;
min-height: 100vh;
max-width: 820px;
overflow: hidden;
display: flex;
flex-flow: column;
}
#main > nav, #main > main, #main > footer {
padding: 15px;
}
#main > nav {
text-align: center;
}
#main > main {
flex: 1;
margin-right: 25px;
}
#main > footer {
padding-top: 50px;
}
@media (max-width: 640px) {
body {
flex-direction: column;
}
body > header h1 {
width: auto;
font-size: 7em;
}
#main {
display: block;
min-height: 0;
}
#main > main {
margin-right: 0;
}
}
hr {
border: none;
border-top: 1px solid gray;
max-width: 25px;
margin: 35px auto;
}
.muted {
color: gray;
}
@media (prefers-color-scheme: dark) {
html {
background-color: black;
color: #dfdfdf;
}
article img:not([src$=".jpg"]):not([src$=".jpeg"]) {
/* prevent transparent images from showing the black background
background-color: white;
border: 5px solid white;
box-sizing: border-box;
}
}
/* Homepage
#intro {
width: 100%;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
}
#intro h1 {
font-size: 10em;
margin: 0;
}
#intro p {
color: gray;
margin-bottom: 5em;
}
@media (max-width: 640px) {
#intro h1 {
font-size: 7em;
}
}
/* Typography
article > header {
margin-bottom: 2em;
}
article > header time {
color: gray;
white-space: nowrap;
}
article p, article li {
text-align: justify;
}
article img, article video {
max-width: 100%;
}
article .footnotes {
font-size: 0.75em;
}
pre {
font-family: 'Fira Code', 'Nanum Gothic Coding', monospace;
background-color: #272822;
color: #f8f8f2;
padding: 15px;
overflow: auto;
tab-size: 2;
-moz-tab-size: 2;
}
p code, li code {
color: #930d72;
}
a, a:visited {
color: inherit;
}
iframe[src*="youtube-nocookie.com"] {
border: none;
width: 100%;
height: 460px;
}
@media (max-width: 640px) {
iframe[src*="youtube-nocookie.com"] {
height: 260px;
}
}
/* Article list
.article-list article > header {
display: flex;
flex-flow: row;
align-items: center;
margin-bottom: 0;
}
.article-list article h3 {
display: inline-block;
margin: 0.5em;
}
.article-list article small {
font-weight: normal;
color: gray;
}

229
static/img/deal.svg Normal file
View File

@ -0,0 +1,229 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!--svg xmlns:xlink="http://www.w3.org/1999/xlink" 747x798 height="281px" version="1.1" viewBox="0 0 839 281" width="839px" x="0px" y="0px" xmlns="http://www.w3.org/2000/svg"-->
<svg xmlns:xlink="http://www.w3.org/1999/xlink" height="798px" version="1.1" viewBox="-161 10 1000 291" width="747px" x="0px" y="0px" xmlns="http://www.w3.org/2000/svg">
<path d="M11,0 L0.0,61 L76.0,11 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M0,61 L76.0,11 L69.0,41 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M0,61 L70.0,40 L35.0,65 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M68,39 L35.0,65 L61.0,74 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M35,65 L62.0,72 L29.0,96 Z" style="fill:rgb(8,3,0);stroke:none;"/>
<path d="M62,71 L29.0,96 L56.0,101 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M60,71 L56.0,101 L99.0,79 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M58,73 L97.0,80 L103.0,41 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M56,101 L98.0,77 L93.0,109 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M56,101 L94.0,107 L55.0,131 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M93,106 L55.0,131 L84.0,142 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M59,75 L104.0,42 L66.0,40 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M95,81 L101.0,42 L139.0,50 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M104,44 L66.0,42 L76.0,11 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M101,45 L76.0,11 L149.0,26 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M99,44 L149.0,26 L137.0,52 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M149,26 L133.0,52 L215.0,39 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M135,49 L158.0,94 L168.0,55 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M136,48 L159.0,93 L128.0,89 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M166,53 L156.0,92 L193.0,99 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M138,49 L130.0,89 L94.0,80 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M160,91 L128.0,87 L122.0,113 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M133,51 L166.0,57 L215.0,39 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M131,87 L95.0,78 L90.0,109 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M130,86 L89.0,108 L124.0,113 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M90,106 L125.0,111 L116.0,150 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M91,105 L117.0,149 L84.0,142 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M118,146 L84.0,142 L82.0,170 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M115,145 L82.0,170 L150.0,180 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M113,146 L150.0,180 L152.0,153 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M113,148 L152.0,155 L157.0,120 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M114,149 L157.0,121 L123.0,110 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M156,123 L121.0,112 L159.0,89 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M154,123 L157.0,90 L194.0,97 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M153,122 L193.0,96 L184.0,130 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M154,120 L186.0,128 L149.0,156 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M190,95 L182.0,130 L223.0,129 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M185,127 L149.0,155 L178.0,162 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M183,126 L176.0,162 L218.0,165 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M150,153 L180.0,161 L150.0,180 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M178,159 L150.0,180 L214.0,194 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M175,160 L214.0,194 L217.0,162 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M189,98 L222.0,132 L215.0,39 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M191,101 L215.0,39 L164.0,55 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M210,131 L390.0,69 L386.0,97 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M216,133 L390.0,69 L215.0,39 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M211,129 L386.0,97 L377.0,129 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M390,69 L386.0,97 L459.0,79 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M212,127 L377.0,129 L347.0,154 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M213,126 L347.0,154 L345.0,182 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M377,129 L347.0,154 L374.0,155 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M214,125 L345.0,182 L308.0,182 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M216,124 L308.0,182 L305.0,211 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M217,123 L305.0,211 L256.0,200 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M220,125 L256.0,200 L214.0,163 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M223,127 L217.0,166 L181.0,127 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M256,200 L214.0,161 L214.0,194 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M386,97 L459.0,79 L457.0,107 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M459,79 L457.0,107 L528.0,93 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M457,107 L528.0,93 L522.0,119 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M457,107 L524.0,117 L444.0,172 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M523,115 L444.0,172 L512.0,153 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M444,172 L513.0,151 L481.0,177 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M510,151 L481.0,177 L550.0,157 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M507,153 L547.0,159 L555.0,121 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M481,177 L549.0,156 L541.0,193 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M481,177 L544.0,192 L473.0,204 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M545,156 L538.0,194 L583.0,164 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M543,191 L473.0,204 L503.0,213 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M540,190 L503.0,213 L570.0,230 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M537,190 L567.0,230 L576.0,196 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M503,213 L571.0,228 L500.0,247 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M537,192 L575.0,198 L582.0,163 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M565,230 L574.0,195 L608.0,200 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M573,197 L580.0,163 L608.0,202 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M508,154 L556.0,123 L519.0,117 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M545,158 L553.0,121 L583.0,167 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M556,125 L518.0,119 L528.0,93 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M553,125 L528.0,93 L594.0,105 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M551,124 L594.0,105 L585.0,129 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M552,122 L585.0,127 L581.0,168 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M594,105 L583.0,129 L622.0,138 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M583,127 L622.0,136 L579.0,167 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M622,135 L578.0,166 L612.0,170 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M620,134 L610.0,170 L643.0,175 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M579,164 L612.0,168 L607.0,203 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M610,168 L605.0,203 L644.0,173 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M564,229 L607.0,199 L601.0,234 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M605,199 L598.0,234 L641.0,210 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M604,201 L639.0,212 L643.0,171 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M598,233 L640.0,209 L631.0,239 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M637,209 L629.0,239 L671.0,217 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M637,211 L670.0,219 L641.0,171 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M628,238 L670.0,216 L665.0,244 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M667,216 L662.0,244 L712.0,254 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M617,136 L641.0,176 L685.0,122 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M619,138 L685.0,122 L594.0,105 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M635,174 L685.0,122 L797.0,202 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M568,226 L500.0,247 L585.0,260 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M565,227 L585.0,260 L602.0,232 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M585,260 L599.0,232 L633.0,237 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M585,260 L631.0,236 L655.0,274 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M628,236 L655.0,274 L666.0,242 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M655,274 L663.0,242 L712.0,254 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M655,274 L712.0,254 L713.0,281 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M635,171 L797.0,202 L665.0,220 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M685,122 L797.0,202 L839.0,148 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M797,202 L661.0,218 L762.0,230 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M797,202 L762.0,230 L790.0,235 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M664,216 L762.0,230 L712.0,254 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M762,230 L712.0,254 L757.0,258 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M797,202 L839.0,148 L830.0,207 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M11,0 L0.0,61 L76.0,11 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M0,61 L76.0,11 L67.0,41 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M0,61 L67.0,41 L35.0,65 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M67,41 L35.0,65 L61.0,73 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M35,65 L61.0,73 L29.0,96 Z" style="fill:rgb(8,3,0);stroke:none;"/>
<path d="M61,73 L29.0,96 L56.0,101 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M61,73 L56.0,101 L96.0,79 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M61,73 L96.0,79 L102.0,43 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M56,101 L96.0,79 L92.0,107 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M56,101 L92.0,107 L55.0,131 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M92,107 L55.0,131 L84.0,142 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M61,73 L102.0,43 L67.0,41 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M96,79 L102.0,43 L136.0,51 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M102,43 L67.0,41 L76.0,11 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M102,43 L76.0,11 L149.0,26 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M102,43 L149.0,26 L136.0,51 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M149,26 L136.0,51 L215.0,39 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M136,51 L158.0,91 L167.0,56 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M136,51 L158.0,91 L129.0,88 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M167,56 L158.0,91 L191.0,98 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M136,51 L129.0,88 L96.0,79 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M158,91 L129.0,88 L123.0,112 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M136,51 L167.0,56 L215.0,39 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M129,88 L96.0,79 L92.0,107 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M129,88 L92.0,107 L123.0,112 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M92,107 L123.0,112 L116.0,147 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M92,107 L116.0,147 L84.0,142 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M116,147 L84.0,142 L82.0,170 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M116,147 L82.0,170 L150.0,180 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M116,147 L150.0,180 L151.0,154 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M116,147 L151.0,154 L155.0,121 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M116,147 L155.0,121 L123.0,112 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M155,121 L123.0,112 L158.0,91 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M155,121 L158.0,91 L191.0,98 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M155,121 L191.0,98 L184.0,129 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M155,121 L184.0,129 L151.0,154 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M191,98 L184.0,129 L221.0,128 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M184,129 L151.0,154 L178.0,161 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M184,129 L178.0,161 L216.0,163 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M151,154 L178.0,161 L150.0,180 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M178,161 L150.0,180 L214.0,194 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M178,161 L214.0,194 L216.0,163 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M191,98 L221.0,128 L215.0,39 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M191,98 L215.0,39 L167.0,56 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M221,128 L390.0,69 L386.0,97 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M221,128 L390.0,69 L215.0,39 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M221,128 L386.0,97 L377.0,129 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M390,69 L386.0,97 L459.0,79 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M221,128 L377.0,129 L347.0,154 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M221,128 L347.0,154 L345.0,182 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M377,129 L347.0,154 L374.0,155 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M221,128 L345.0,182 L308.0,182 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M221,128 L308.0,182 L305.0,211 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M221,128 L305.0,211 L256.0,200 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M221,128 L256.0,200 L216.0,163 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M221,128 L216.0,163 L184.0,129 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M256,200 L216.0,163 L214.0,194 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M386,97 L459.0,79 L457.0,107 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M459,79 L457.0,107 L528.0,93 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M457,107 L528.0,93 L520.0,118 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M457,107 L520.0,118 L444.0,172 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M520,118 L444.0,172 L510.0,152 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M444,172 L510.0,152 L481.0,177 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M510,152 L481.0,177 L546.0,157 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M510,152 L546.0,157 L554.0,123 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M481,177 L546.0,157 L539.0,192 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M481,177 L539.0,192 L473.0,204 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M546,157 L539.0,192 L581.0,165 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M539,192 L473.0,204 L503.0,213 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M539,192 L503.0,213 L567.0,228 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M539,192 L567.0,228 L574.0,197 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M503,213 L567.0,228 L500.0,247 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M539,192 L574.0,197 L581.0,165 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M567,228 L574.0,197 L606.0,201 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M574,197 L581.0,165 L606.0,201 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M510,152 L554.0,123 L520.0,118 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M546,157 L554.0,123 L581.0,165 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M554,123 L520.0,118 L528.0,93 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M554,123 L528.0,93 L594.0,105 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M554,123 L594.0,105 L584.0,128 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M554,123 L584.0,128 L581.0,165 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M594,105 L584.0,128 L620.0,137 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M584,128 L620.0,137 L581.0,165 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M620,137 L581.0,165 L611.0,169 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M620,137 L611.0,169 L641.0,174 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M581,165 L611.0,169 L606.0,201 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M611,169 L606.0,201 L641.0,174 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M567,228 L606.0,201 L600.0,233 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M606,201 L600.0,233 L638.0,210 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M606,201 L638.0,210 L641.0,174 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M600,233 L638.0,210 L630.0,238 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M638,210 L630.0,238 L669.0,218 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M638,210 L669.0,218 L641.0,174 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M630,238 L669.0,218 L664.0,243 Z" style="fill:rgb(255,255,255);stroke:none;"/>
<path d="M669,218 L664.0,243 L712.0,254 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M620,137 L641.0,174 L685.0,122 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M620,137 L685.0,122 L594.0,105 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M641,174 L685.0,122 L797.0,202 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M567,228 L500.0,247 L585.0,260 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M567,228 L585.0,260 L600.0,233 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M585,260 L600.0,233 L630.0,238 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M585,260 L630.0,238 L655.0,274 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M630,238 L655.0,274 L664.0,243 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M655,274 L664.0,243 L712.0,254 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M655,274 L712.0,254 L713.0,281 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M641,174 L797.0,202 L669.0,218 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M685,122 L797.0,202 L839.0,148 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M797,202 L669.0,218 L762.0,230 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M797,202 L762.0,230 L790.0,235 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M669,218 L762.0,230 L712.0,254 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M762,230 L712.0,254 L757.0,258 Z" style="fill:rgb(0,0,0);stroke:none;"/>
<path d="M797,202 L839.0,148 L830.0,207 Z" style="fill:rgb(0,0,0);stroke:none;"/>
</svg>

After

Width:  |  Height:  |  Size: 19 KiB

BIN
static/img/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

1400
static/img/tri.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 122 KiB