From 532f34c6ab41cfe9dbac6175261daf5720397ab5 Mon Sep 17 00:00:00 2001 From: Julien CLEMENT Date: Mon, 1 May 2023 12:28:41 +0200 Subject: [PATCH] add brachiosaure wu Signed-off-by: Julien CLEMENT --- .../writeups/fcsc_2023/brachiosaure.md | 371 ++++++++++++++++++ ...s_38b1322b728d0fc31bc0aabb683ebc6d.content | 2 +- ...scss_38b1322b728d0fc31bc0aabb683ebc6d.json | 2 +- .../90QOCSdkzFE3rrYD2GdkrZkh4q_serial.png | Bin 0 -> 2486 bytes .../90QOCSdkzFE3rrYD2GdkrZkh4q_usr.png | Bin 0 -> 2453 bytes jujure/static/brachiosaure/brachiosaure | Bin 0 -> 18824 bytes jujure/static/brachiosaure/check_serial.c | 14 + jujure/static/brachiosaure/dissociate.png | Bin 0 -> 19890 bytes jujure/static/brachiosaure/dot_product.c | 49 +++ jujure/static/brachiosaure/final.png | Bin 0 -> 50271 bytes jujure/static/brachiosaure/invertible.png | Bin 0 -> 20124 bytes jujure/static/brachiosaure/main.c | 71 ++++ .../static/brachiosaure/overlap_inverses.png | Bin 0 -> 21940 bytes jujure/static/brachiosaure/resizing.png | Bin 0 -> 4549 bytes jujure/static/brachiosaure/serial.png | Bin 0 -> 438 bytes jujure/static/brachiosaure/solve_writeup.py | 192 +++++++++ jujure/static/brachiosaure/user.png | Bin 0 -> 451 bytes 17 files changed, 699 insertions(+), 2 deletions(-) create mode 100644 jujure/content/writeups/fcsc_2023/brachiosaure.md create mode 100644 jujure/static/brachiosaure/90QOCSdkzFE3rrYD2GdkrZkh4q_serial.png create mode 100644 jujure/static/brachiosaure/90QOCSdkzFE3rrYD2GdkrZkh4q_usr.png create mode 100755 jujure/static/brachiosaure/brachiosaure create mode 100644 jujure/static/brachiosaure/check_serial.c create mode 100644 jujure/static/brachiosaure/dissociate.png create mode 100644 jujure/static/brachiosaure/dot_product.c create mode 100644 jujure/static/brachiosaure/final.png create mode 100644 jujure/static/brachiosaure/invertible.png create mode 100644 jujure/static/brachiosaure/main.c create mode 100644 jujure/static/brachiosaure/overlap_inverses.png create mode 100644 jujure/static/brachiosaure/resizing.png create mode 100644 jujure/static/brachiosaure/serial.png create mode 100755 jujure/static/brachiosaure/solve_writeup.py create mode 100644 jujure/static/brachiosaure/user.png diff --git a/jujure/content/writeups/fcsc_2023/brachiosaure.md b/jujure/content/writeups/fcsc_2023/brachiosaure.md new file mode 100644 index 0000000..b580fdc --- /dev/null +++ b/jujure/content/writeups/fcsc_2023/brachiosaure.md @@ -0,0 +1,371 @@ +--- +title: "Inverting a bunch of matrices because reverse engineering or something | Brachiosaure @ FCSC 2023" +date: "2023-04-30 18:00:00" +author: "Juju" +tags: ["Reverse", "Writeup", "fcsc"] +toc: true +--- + +# Intro + +Brachiosaure is a math/puzzle challenge from `\J` for the 2023 edition of the +FCSC. It's difficulty is not in the reversing process, which is fairly trivial +here, but in solving of underlying problem. + +## Challenge description +`reverse` | `477 pts` `10 solves` `:star::star:` + +``` +Vous aimez les QR Codes ? On vous demande d'écrire un générateur d'entrées +valides pour ce binaire, puis de le valider sur le service web fourni où un nom +aléatoire est proposé toutes les 5 secondes. +``` + +Author: `\J` + +## Given files + +[brachiosaure](/brachiosaure/brachiosaure) + + +## Overview + +As we can guess from the challenge description, this binary will take images +as input. QR codes images for that matter. + +```console +$ file brachiosaure +brachiosaure: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), +dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1 +=3e4d225f1053b2a64de1cd133563e6e655049aca, for GNU/Linux 3.2.0, stripped + +$ ldd brachiosaure + linux-vdso.so.1 (0x00007ffd833bd000) + libzbar.so.0 => /usr/lib/libzbar.so.0 (0x00007f3ec2325000) + libpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f3ec22ec000) + libcrypto.so.1.1 => /usr/lib/libcrypto.so.1.1 (0x00007f3ec1fff000) + libc.so.6 => /usr/lib/libc.so.6 (0x00007f3ec1e18000) + libdbus-1.so.3 => /usr/lib/libdbus-1.so.3 (0x00007f3ec1dc7000) + libv4l2.so.0 => /usr/lib/libv4l2.so.0 (0x00007f3ec1db8000) + libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f3ec1c73000) + libXv.so.1 => /usr/lib/libXv.so.1 (0x00007f3ec1c6b000) + libjpeg.so.8 => /usr/lib/libjpeg.so.8 (0x00007f3ec1be8000) + libz.so.1 => /usr/lib/libz.so.1 (0x00007f3ec1bce000) + libm.so.6 => /usr/lib/libm.so.6 (0x00007f3ec1ae6000) + /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f3ec23a2000) + libsystemd.so.0 => /usr/lib/libsystemd.so.0 (0x00007f3ec1a09000) + libv4lconvert.so.0 => /usr/lib/libv4lconvert.so.0 (0x00007f3ec198e000) + libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007f3ec1963000) + libXext.so.6 => /usr/lib/libXext.so.6 (0x00007f3ec194e000) + libcap.so.2 => /usr/lib/libcap.so.2 (0x00007f3ec1942000) + libgcrypt.so.20 => /usr/lib/libgcrypt.so.20 (0x00007f3ec17fa000) + liblzma.so.5 => /usr/lib/liblzma.so.5 (0x00007f3ec17c7000) + libzstd.so.1 => /usr/lib/libzstd.so.1 (0x00007f3ec16f5000) + liblz4.so.1 => /usr/lib/liblz4.so.1 (0x00007f3ec16d3000) + libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f3ec16b3000) + libXau.so.6 => /usr/lib/libXau.so.6 (0x00007f3ec16ae000) + libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f3ec16a6000) + libgpg-error.so.0 => /usr/lib/libgpg-error.so.0 (0x00007f3ec1680000) +``` + +That's a lot of libraries, this is really good news because we can just look up +the documentation of those libraries to understand what is going on. + +The most important ones are `libpng` to read the image data and `libzbar` which +is used to read data from a QR code. Turns out symbols are really self +explanatory by themselves, the code basically reads like sources even though it +is stripped. + +By executing it, we can already what the program is expecting: a username, +and two png, one for the username and one for the serial, probably QR codes +encoding said username and its serial. + +```console +$ ./brachiosaure +Usage: ./brachiosaure +``` + +So is this just a simple keygen that needs to output its key as a QR code ? +(Spoiler it isn't) + +## Reversing + +### Main + +I'm saving you the trouble of renaming the variables, the function I called +`get_qr_data` reads like a charm. It basically is just a succession of calls to +`libpng` and `libzbar`, it does exactly what you think it does, reads an image +file, decode the QR code it contains and outputs everything in the pointers +passed as parameters so I won't show the process of reversing it. + +The only thing worth pointing is that it grayscales the input image. + + +{{< code file="/static/brachiosaure/main.c" language="c" >}} + +So we compute the `sha512` of the username, this gives us a digest, that we will +keep for later, just remember that we have this digest of the username. + +We then decode the 2 QR codes, both seem to need to encode `0x40` bytes of data. +(I know you already guessed it, a sha512 is also 0x40 bytes long). + +And finally we perform some checks: + +- Both pictures needs to be a square of the same size +- The encoded data of the user QR code needs to be equal to the user digest +- The serial check, taking both QR datas as input +- And finally a last check but this time taking both images data instead of the QR data. + +### check_serial + +{{< code file="/static/brachiosaure/check_serial.c" language="c" >}} + +Hmmm we find again the same interesting check that was performed in the main +function, something is already interesting but let's first note things that +we can already guess from this: + +Since it take our images as input in main and image width, it certainly +interprets the data as a linearized 2 dimensionnal array, taking the width as +parameter. We can confirm this since the check serial is called with size `0x8` +as parameter and `0x8 * 0x8 == 0x40`. + +Now let's see what is different: + +```c +// Inside check serial +something_interesting(user_digest, user_digest, &buff, size); +res = memcmp(serial, buff, size * size) == 0; + +// Inside main +int32_t win = something_interesting(username_img_data, serial_img_data, + &an_interesting_output, user_width); +``` + +First the result is not used in the same way: + +- Inside `check_serial`, the return value is discarded, and the output buffer is +compared to the serial, so it is bascically a keygen, seems easy enough + +- Inside `main`, the output buffer is discarded and only the return value is +checked + +Then in the `main`, the function is called with the user and serial images data, +but in check_serial, it is called with the digest data twice. + +OK let's see what this does, we need to understand what doest it put in the +output buffer since it will be the serial we will need to encode in the second +QR code of the input, but we also need to understand the return value. + + +### dot_product + +Cutting drama right now, it is simply a matrix dot product: + +{{< code file="/static/brachiosaure/dot_product.c" language="c" >}} + +Alright so to recap what actually happens: + +- In check serial, we perform the dot product of the user digest, interpreted a +linearized 8 * 8 matrix, with itself, effectively squaring it, which gives us +our serial (also in a linearized 8 * 8 matrix). + +- In main, we perform the dot product of the user and serial IMAGES, and we can +see from the code that the return value indicates wether or not the resulting +dot product is the identity matrix. + +So yeah, congratulation, it is the end of the reversing part. + +We now need to, given a random username: + +- Compute its digest +- Square it to get the serial +- Output both the digest and the serial to a QR code each +- (The fun part) Make sure that the images of said QR codes are invertible + + +## Splitting the problem + +So at first I though this was impossible, but I gradually had more and more +tricks up my sleeve to solve this, which I finally almost all threw by the +window when I discovered how easy the solver actually is. + +I still think that even though completely over engineered and full of dead ends, +my though process may be of value for someone I guess. + +### Recontextualizing + +So first we need to understand that we are not doing any kind of dot product and +are not working with any kind of matrices. + +Both only operate over the unsigned integers modulo 256, since the dot product +stores its output on a `char`. This will be the key to make the matrix +invertible. + +You can then notice that in the fieds of integers modulo 256, `0xff * 0xff == +1`. When I noticed I started to think that I could carefully place white pixels +on the QR code to specifically put some 1s where I wanted, but since patching a +single byte of the first/second matrix will impact the entire corresponding +row/column of the dot product, it doesn't work obviously + +Now, obviously we will need to patch the QR code image, the question is how much +so that `libzbar` still decodes the correct digests and serial. So obviously, +we may resize the images of the QR codes to add some data. + +### Dead end + +So then this is where I had a really dumb idea. I though that maybe I could +append carefully crafted columns and empty lines to the first matrix, and +carefully crafted line and empty columns to the second matrix so that the result +of the dot product int overflow back to 0 or 1. Thus outputing 2 new images with the QR code in the top left corner. + +And it actually kind of worked, but not entirely so I won't detail the +algorithm, I still implemented it entirely because I was really convincend this +was the intended way. + +Why it doesn't work is because yes by adding rows and columns like that, being +carefull that everything cancels nicely with the data you inject on the other +matrix, the first N rows and columns of the original images have indeed been +inverted, but now you have a matrix which is somewhat bigger, and the parts you +added are not inverted, it was entirely 0 if I did not put the diagonal to 1 to +the rows/columns I added. If I decided to put the diagonal, then the bytes you +carefully injected are then reflected allong the dot product in this new bigger +matrix. So either way you need to perform the same process to repatch everyting +over this bigger matrix, infinetely recursing. + + +### How it's actually done + +OK, so after this misadventure, the next step is to understand that a single +element of coordinates (i, j) from the dot product is impacted by all elements +of the ith line of the first matrix and all elements of the jth line. (You +actually already needed to understand this to implement my dumb idea but now we +will make it interesting). + +Let's say that I take my first QR code and I double it's size and width like +this where the purple ones are all 0 matrices and the green one is the identity: + +{{< image src="/brachiosaure/resizing.png" style="border-radius: 8px;" >}} + +You can clearly see that if you patch any bytes in the identity matrix in the bottom right you will never impact the result of the top left corner of the dot +product. + +If you are not convinced: take this more striking example: + +{{< image src="/brachiosaure/dissociate.png" style="border-radius: 8px;" >}} + +See how you can perform the dot product on each of the corner independently ? +That is the key to solving this, because now instead of putting the identity +matrix in the corresponding corner in the other image, we can simple compute the +inverse of the QR code: + + +{{< image src="/brachiosaure/overlap_inverses.png" style="border-radius: 8px;" >}} + + +## Inverting the two matrices + +You may think "Ok this is over GG NO RE", but it is not that simple, at least it +wasn't for me because I suck at maths. + +So I tried multiple implementations of the matrix modular inversion, some +worked, some didn't, but most importantly, all of them took ages to run on +actual images, about 10 minutes for most, and we are limited to 5 seconds on the +remote service. + +The best implementation was the `sagemath` one which computed real size images +inverses in about 20 seconds, still too slow. But at least I could test locally +that the generated images were accepted by the program, and they were, so I knew +I was on the right track. + +I tried reducing the size of the QR code to make it faster, and it ran in less +than a second, but the program could not recognize the data in the QR code +anymore. + +Well we need another strategy. First because it is taking too long, but also +because not every matrix turns out to be invertible at all. And I don't want to +bruteforce the remote service to be lucky to have a username AND a serial matrix +that are both invertible and then be lucky enough that the program successfully +decodes the QR code. + + +## If it isn't invertible, juste make it invertible duh + +So I go for a cleaner approach. I am not guaranteed that the QR code is invertible, fine, patch it to make it invertible. + +And there is a really interesting property indeed: + +{{< image src="/brachiosaure/invertible.png" style="border-radius: 8px;" >}} + +By adding empty matrices and an identity matrix in the bottom right corner, the +resulting matrix is always invertible, and the inverse can be trivially computed +since it is simply moving matrices arround and negating the original image modulo 256 `notice the "-(QRuser)" in the inverted matrix`. + +## Putting everything together + +So what we need to do given a random username: + +- Compute its sha512 digest +- Compute the serial, the square of the matrix of the digest +- Generate a QR code for the digest and another one for the serial +- Make both QR code invertible by adding empty and identity matrices as shown above +- Compute the said inverse of said matrices +- In the result user.png put: + - The invertible digest QR code in the top left corner + - The inverted serial QR code in the bottom right corner +- In the result serial.png put: + - The inverted digest QR code in the top left corner + - The invertible serial QR code in the bottom right corner + + +{{< image src="/brachiosaure/final.png" style="border-radius: 8px;" >}} + + +## Solver + +Here is the final solver script, which also automates fetching the username +from the remote service and the upload of the images to recover the flag. + +But before leaving this writeup there is still something I want to show you at the end. + +{{< code file="/static/brachiosaure/solve_writeup.py" language="c" >}} + + +```console +$ ./solve_writeup.py + FCSC{c2ddbd0310bcf5f65c576453ee9697774afd38dc887b64f4dccc63ac598d084b} +``` + +## Side notes + +Here are examples of images generated by this solver for username `90QOCSdkzFE3rrYD2GdkrZkh4q`: + + +The original user digest QR code: + +{{< image src="/brachiosaure/user.png" style="border-radius: 8px;" >}} + + +The original serial QR code: + +{{< image src="/brachiosaure/serial.png" style="border-radius: 8px;" >}} + + +The patched user png + +{{< image src="/brachiosaure/90QOCSdkzFE3rrYD2GdkrZkh4q_usr.png" style="border-radius: 8px;" >}} + +The patched serial png + +{{< image src="/brachiosaure/90QOCSdkzFE3rrYD2GdkrZkh4q_serial.png" style="border-radius: 8px;" >}} + + +As you can notice, there isn't any noise visible by naked eye, this script therefore get the flag 100% of the time. + +Why is it so clean ? Simply because of the strategy we used to compute the +inverse matrix: + +- We add empty matrices: they are black so no noise + +- We add identity matrices: they only have the diagonal set to 1 so only a little bit grayer than the black, no noise visible by naked eyes + +- We add the opposite of the matrix, and this is the clean part: our original matrices only hold black and white pixels so respectively `0x0` and `0xff`, so the opposite of `0` is still `0` and the opposite of `0xff` if `1` modulo 256, so like the identity matrix, they are nearly invisible. If you look closely though :eyes: you will see that all white pixels of the QR code were indeed reflected as very faint taint of gray in its inverse matrix on the other image. \ No newline at end of file diff --git a/jujure/resources/_gen/assets/scss/scss/main.scss_38b1322b728d0fc31bc0aabb683ebc6d.content b/jujure/resources/_gen/assets/scss/scss/main.scss_38b1322b728d0fc31bc0aabb683ebc6d.content index 690d3d5..6b53a50 100644 --- a/jujure/resources/_gen/assets/scss/scss/main.scss_38b1322b728d0fc31bc0aabb683ebc6d.content +++ b/jujure/resources/_gen/assets/scss/scss/main.scss_38b1322b728d0fc31bc0aabb683ebc6d.content @@ -1,3 +1,3 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */::-webkit-scrollbar{width:8px;height:8px;background:#212020}::-webkit-scrollbar-thumb{background:#888}::-webkit-scrollbar-thumb:hover{background:#dcdcdc}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-display:auto;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-display:auto;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-display:auto;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}code[class*="language-"],pre[class*="language-"]{color:white;background:none;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:1em;text-align:left;text-shadow:0 -.1em .2em black;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*="language-"],:not(pre)>code[class*="language-"]{background:#141414}pre[class*="language-"]{border-radius:.5em;border:0.3em solid #545454;box-shadow:1px 1px .5em black inset;margin:.5em 0;overflow:auto;padding:1em}pre[class*="language-"]::-moz-selection{background:#27292a}pre[class*="language-"]::selection{background:#27292a}pre[class*="language-"]::-moz-selection,pre[class*="language-"] ::-moz-selection,code[class*="language-"]::-moz-selection,code[class*="language-"] ::-moz-selection{text-shadow:none;background:rgba(237,237,237,0.15)}pre[class*="language-"]::selection,pre[class*="language-"] ::selection,code[class*="language-"]::selection,code[class*="language-"] ::selection{text-shadow:none;background:rgba(237,237,237,0.15)}:not(pre)>code[class*="language-"]{border-radius:.3em;border:0.13em solid #545454;box-shadow:1px 1px .3em -.1em black inset;padding:.15em .2em .05em;white-space:normal}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#787878}.token.punctuation{opacity:.7}.token.namespace{opacity:.7}.token.tag,.token.boolean,.token.number,.token.deleted{color:#cf694a}.token.keyword,.token.property,.token.selector,.token.constant,.token.symbol,.token.builtin{color:#f9ee9a}.token.attr-name,.token.attr-value,.token.string,.token.char,.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string,.token.variable,.token.inserted{color:#919e6b}.token.atrule{color:#7386a5}.token.regex,.token.important{color:#e9c163}.token.important,.token.bold{font-weight:bold}.token.italic{font-style:italic}.token.entity{cursor:help}pre[data-line]{padding:1em 0 1em 3em;position:relative}.language-markup .token.tag,.language-markup .token.attr-name,.language-markup .token.punctuation{color:#ad895c}.token{position:relative;z-index:1}.line-highlight{background:rgba(84,84,84,0.25);background:linear-gradient(to right, rgba(84,84,84,0.1) 70%, rgba(84,84,84,0));border-bottom:1px dashed #545454;border-top:1px dashed #545454;left:0;line-height:inherit;margin-top:0.75em;padding:inherit 0;pointer-events:none;position:absolute;right:0;white-space:pre;z-index:0}.line-highlight:before,.line-highlight[data-end]:after{background-color:#8794a6;border-radius:999px;box-shadow:0 1px white;color:#f5f2f0;content:attr(data-start);font:bold 65%/1.5 sans-serif;left:.6em;min-width:1em;padding:0 .5em;position:absolute;text-align:center;text-shadow:none;top:.4em;vertical-align:.3em}.line-highlight[data-end]:after{bottom:.4em;content:attr(data-end);top:auto}pre[data-line]{position:relative;padding:1em 0 1em 3em}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:rgba(153,122,102,0.08);background:linear-gradient(to right, rgba(153,122,102,0.1) 70%, rgba(153,122,102,0));pointer-events:none;line-height:inherit;white-space:pre}@media print{.line-highlight{-webkit-print-color-adjust:exact;color-adjust:exact}}.line-highlight:before,.line-highlight[data-end]:after{content:attr(data-start);position:absolute;top:.4em;left:.6em;min-width:1em;padding:0 .5em;background-color:rgba(153,122,102,0.4);color:#f5f2f0;font:bold 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px white}.line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}.line-numbers .line-highlight:before,.line-numbers .line-highlight:after{content:none}pre[id].linkable-line-numbers span.line-numbers-rows{pointer-events:all}pre[id].linkable-line-numbers span.line-numbers-rows>span:before{cursor:pointer}pre[id].linkable-line-numbers span.line-numbers-rows>span:hover:before{background-color:rgba(128,128,128,0.2)}pre[class*="language-"].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*="language-"].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:0.8em;text-align:right}div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;top:.3em;right:.2em;transition:opacity 0.3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar .toolbar-item{display:inline-block}div.code-toolbar>.toolbar a{cursor:pointer}div.code-toolbar>.toolbar button{background:none;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar a,div.code-toolbar>.toolbar button,div.code-toolbar>.toolbar span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,0.2);box-shadow:0 2px 0 0 rgba(0,0,0,0.2);border-radius:.5em}div.code-toolbar>.toolbar a:hover,div.code-toolbar>.toolbar a:focus,div.code-toolbar>.toolbar button:hover,div.code-toolbar>.toolbar button:focus,div.code-toolbar>.toolbar span:hover,div.code-toolbar>.toolbar span:focus{color:inherit;text-decoration:none}:root{--phoneWidth: (max-width: 684px);--tabletWidth: (max-width: 900px)}@font-face{font-family:'Inter';font-style:normal;font-display:auto;font-weight:400;src:url("../fonts/Inter-Regular.woff2") format("woff2"),url("../fonts/Inter-Regular.woff") format("woff")}@font-face{font-family:'Inter';font-style:italic;font-display:auto;font-weight:400;src:url("../fonts/Inter-Italic.woff2") format("woff2"),url("../fonts/Inter-Italic.woff") format("woff")}@font-face{font-family:'Inter';font-style:normal;font-display:auto;font-weight:600;src:url("../fonts/Inter-Medium.woff2") format("woff2"),url("../fonts/Inter-Medium.woff") format("woff")}@font-face{font-family:'Inter';font-style:italic;font-display:auto;font-weight:600;src:url("../fonts/Inter-MediumItalic.woff2") format("woff2"),url("../fonts/Inter-MediumItalic.woff") format("woff")}@font-face{font-family:'Inter';font-style:normal;font-display:auto;font-weight:800;src:url("../fonts/Inter-Bold.woff2") format("woff2"),url("../fonts/Inter-Bold.woff") format("woff")}@font-face{font-family:'Inter';font-style:italic;font-display:auto;font-weight:800;src:url("../fonts/Inter-BoldItalic.woff2") format("woff2"),url("../fonts/Inter-BoldItalic.woff") format("woff")}.button-container{display:table;margin-left:auto;margin-right:auto}button,.button,a.button{position:relative;display:flex;align-items:center;justify-content:center;padding:8px 18px;margin-bottom:5px;text-decoration:none;text-align:center;font-weight:500;border-radius:8px;border:1px solid transparent;appearance:none;cursor:pointer;outline:none;background:#fafafa}@media (prefers-color-scheme: dark){button,.button,a.button{background:#1b1c1d;color:inherit}}@media (prefers-color-scheme: light){button,.button,a.button{background:#fafafa}}[data-theme=dark] button,[data-theme=dark] .button,[data-theme=dark] a.button{background:#1b1c1d;color:inherit}[data-theme=light] button,[data-theme=light] .button,[data-theme=light] a.button{background:#fafafa}button.outline,.button.outline,a.button.outline{background:transparent;box-shadow:none;padding:8px 18px;border-color:#eaeaea}@media (prefers-color-scheme: dark){button.outline,.button.outline,a.button.outline{border-color:#3b3d42;color:inherit}}@media (prefers-color-scheme: light){button.outline,.button.outline,a.button.outline{border-color:#eaeaea}}[data-theme=dark] button.outline,[data-theme=dark] .button.outline,[data-theme=dark] a.button.outline{border-color:#3b3d42;color:inherit}[data-theme=light] button.outline,[data-theme=light] .button.outline,[data-theme=light] a.button.outline{border-color:#eaeaea}button.outline :hover,.button.outline :hover,a.button.outline :hover{transform:none;box-shadow:none}button.primary,.button.primary,a.button.primary{box-shadow:0 4px 6px rgba(50,50,93,0.11),0 1px 3px rgba(0,0,0,0.08)}button.primary:hover,.button.primary:hover,a.button.primary:hover{box-shadow:0 2px 6px rgba(50,50,93,0.21),0 1px 3px rgba(0,0,0,0.08)}button.link,.button.link,a.button.link{background:none;font-size:1rem}button.small,.button.small,a.button.small{font-size:.8rem}button.wide,.button.wide,a.button.wide{min-width:200px;padding:14px 24px}.code-toolbar{margin-bottom:20px}.code-toolbar .toolbar-item a{position:relative;display:inline-flex;align-items:center;justify-content:center;padding:3px 8px;margin-bottom:5px;text-decoration:none;text-align:center;font-size:13px;font-weight:500;border-radius:8px;border:1px solid transparent;appearance:none;cursor:pointer;outline:none;background:#eaeaea}@media (prefers-color-scheme: dark){.code-toolbar .toolbar-item a{background:#3b3d42;color:inherit}}@media (prefers-color-scheme: light){.code-toolbar .toolbar-item a{background:#eaeaea}}[data-theme=dark] .code-toolbar .toolbar-item a{background:#3b3d42;color:inherit}[data-theme=light] .code-toolbar .toolbar-item a{background:#eaeaea}.header{display:flex;align-items:center;justify-content:center;position:relative;padding:20px;background:#fafafa}@media (prefers-color-scheme: dark){.header{background:#1b1c1d}}@media (prefers-color-scheme: light){.header{background:#fafafa}}[data-theme=dark] .header{background:#1b1c1d}[data-theme=light] .header{background:#fafafa}.header__right{display:flex;flex-direction:row;align-items:center}@media (max-width: 684px){.header__right{flex-direction:row-reverse}}.header__inner{display:flex;align-items:center;justify-content:space-between;margin:0 auto;width:760px;max-width:100%}.theme-toggle{display:flex;align-items:center;justify-content:center;line-height:1;cursor:pointer}.theme-toggler{fill:currentColor}.not-selectable{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.logo{display:flex;align-items:center;text-decoration:none;font-weight:bold;font-display:auto;font-family:monospace, monospace}.logo img{height:44px}.logo__mark{margin-right:5px}.logo__text{font-size:1.125rem}.logo__cursor{display:inline-block;width:10px;height:1rem;background:#fe5186;margin-left:5px;border-radius:1px;animation:cursor 1s infinite}@media (prefers-reduced-motion: reduce){.logo__cursor{animation:none}}@keyframes cursor{0%{opacity:0}50%{opacity:1}100%{opacity:0}}.menu{z-index:9999;background:#fafafa}@media (prefers-color-scheme: dark){.menu{background:#1b1c1d}}@media (prefers-color-scheme: light){.menu{background:#fafafa}}[data-theme=dark] .menu{background:#1b1c1d}[data-theme=light] .menu{background:#fafafa}@media (max-width: 684px){.menu{position:absolute;top:50px;right:0;border:none;margin:0;padding:10px}}.menu__inner{display:flex;align-items:center;justify-content:flex-start;max-width:100%;margin:0 auto;padding:0 15px;font-size:1rem;list-style:none}.menu__inner li{margin:0 12px}@media (max-width: 684px){.menu__inner{flex-direction:column;align-items:flex-start;padding:0}.menu__inner li{margin:0;padding:5px}}.menu-trigger{width:24px;height:24px;fill:currentColor;margin-left:10px;cursor:pointer;display:none}@media (max-width: 684px){.menu-trigger{display:block}}.menu a{display:inline-block;margin-right:15px;text-decoration:none}.menu a:hover{text-decoration:underline}.menu a:last-of-type{margin-right:0}.submenu{background:#fafafa}@media (prefers-color-scheme: dark){.submenu{background:#1b1c1d}}@media (prefers-color-scheme: light){.submenu{background:#fafafa}}[data-theme=dark] .submenu{background:#1b1c1d}[data-theme=light] .submenu{background:#fafafa}.submenu ul{list-style-type:none;margin:0;padding:0;overflow:hidden}.submenu li a,.submenu .dropbtn{display:inline-block;text-decoration:none}.submenu li.dropdown{display:inline-block}.submenu .dropdown-content{display:none;position:absolute;background:#1b1c1d}@media (prefers-color-scheme: light){.submenu .dropdown-content{background:#fafafa}}[data-theme=dark] .submenu .dropdown-content{background:#1b1c1d}[data-theme=light] .submenu .dropdown-content{background:#fafafa}.submenu .dropdown-content a{padding:12px 20px;text-decoration:none;display:block;text-align:left}.submenu .dropdown-content a:hover{background:#1b1c1d}@media (prefers-color-scheme: light){.submenu .dropdown-content a:hover{background:#fafafa}}[data-theme=dark] .submenu .dropdown-content a:hover{background:#1b1c1d}[data-theme=light] .submenu .dropdown-content a:hover{background:#fafafa}.submenu .dropdown:hover .dropdown-content{display:block}html{box-sizing:border-box;line-height:1.6;letter-spacing:0.06em;scroll-behavior:smooth}*,*:before,*:after{box-sizing:inherit}body{margin:0;padding:0;font-family:Inter, -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", Helvetica, Arial, sans-serif;font-display:auto;font-size:1rem;line-height:1.54;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;font-feature-settings:"liga", "tnum", "case", "calt", "zero", "ss01", "locl";-webkit-overflow-scrolling:touch;-webkit-text-size-adjust:100%;display:flex;min-height:100vh;flex-direction:column;background-color:#fff;color:#222}@media (max-width: 684px){body{font-size:1rem}}@media (prefers-color-scheme: dark){body{background-color:#232425;color:#a9a9b3}}@media (prefers-color-scheme: light){body{background-color:#fff;color:#222}}[data-theme=dark] body{background-color:#232425;color:#a9a9b3}[data-theme=light] body{background-color:#fff;color:#222}h2,h3,h4,h5,h6{display:flex;align-items:center;line-height:1.3}h1{font-size:2.625rem}h2{font-size:1.625rem;margin-top:2.5em}h3{font-size:1.375rem}h4{font-size:1.125rem}@media (max-width: 684px){h1{font-size:2rem}h2{font-size:1.4rem}h3{font-size:1.15rem}h4{font-size:1.125rem}}a{color:inherit}img{display:block;max-width:100%}img.left{margin-right:auto}img.center{margin-left:auto;margin-right:auto}img.right{margin-left:auto}img.circle{border-radius:50%;max-width:25%;margin:auto}figure{display:table;max-width:100%;margin:25px 0}figure.left{margin-right:auto}figure.left-floated{margin-right:auto;float:left}figure.left-floated img{margin:20px 20px 20px 0}figure.center{margin-left:auto;margin-right:auto}figure.right{margin-left:auto}figure.right-floated{margin-left:auto;float:right}figure.right-floated img{margin:20px 0 20px 20px}figure.rounded img{border-radius:50%}figure figcaption{font-size:14px;margin-top:5px;opacity:0.8}figure figcaption.left{text-align:left}figure figcaption.center{text-align:center}figure figcaption.right{text-align:right}em,i,strong{color:#000}@media (prefers-color-scheme: dark){em,i,strong{color:#fff}}@media (prefers-color-scheme: light){em,i,strong{color:#000}}[data-theme=dark] em,[data-theme=dark] i,[data-theme=dark] strong{color:white}[data-theme=light] em,[data-theme=light] i,[data-theme=light] strong{color:black}code{font-family:Consolas, Monaco, Andale Mono, Ubuntu Mono, monospace;font-display:auto;font-feature-settings:normal;padding:1px 6px;margin:0 2px;border-radius:5px;font-size:0.95rem;background:#eaeaea}@media (prefers-color-scheme: dark){code{background:#3b3d42}}@media (prefers-color-scheme: light){code{background:#eaeaea}}[data-theme=dark] code{background:#3b3d42}[data-theme=light] code{background:#eaeaea}pre{padding:10px 10px 10px 20px;border-radius:8px;font-size:0.95rem;overflow:auto}[data-theme=dark] pre{background-color:#3b3d42}[data-theme=light] pre{background-color:#eaeaea}@media (max-width: 684px){pre{white-space:pre-wrap;word-wrap:break-word}}pre code{background:none !important;margin:0;padding:0;font-size:inherit;color:#ccc}@media (prefers-color-scheme: dark){pre code{color:inherit}}@media (prefers-color-scheme: light){pre code{color:#ccc}}[data-theme=dark] pre code{color:inherit}[data-theme=light] pre code{color:#ccc}blockquote{border-left:3px solid #3eb0ef;margin:40px;padding:10px 20px}@media (max-width: 684px){blockquote{margin:10px;padding:10px}}blockquote:before{content:"”";font-family:Georgia, serif;font-display:auto;font-size:3.875rem;position:absolute;left:-40px;top:-20px}blockquote p:first-of-type{margin-top:0}blockquote p:last-of-type{margin-bottom:0}ul,ol{margin-left:40px;padding:0}@media (max-width: 684px){ul,ol{margin-left:20px}}ol ol{list-style-type:lower-alpha}.container{flex:1 auto;display:flex;flex-direction:column;justify-content:center;text-align:center}.content{display:flex;flex-direction:column;flex:1 auto;align-items:center;justify-content:center;margin:0}@media (max-width: 684px){.content{margin-top:0}}hr{width:100%;border:none;height:1px;background:#dcdcdc}@media (prefers-color-scheme: dark){hr{background:#4e4e57}}@media (prefers-color-scheme: light){hr{background:#dcdcdc}}[data-theme=dark] hr{background:#4e4e57}[data-theme=light] hr{background:#dcdcdc}.hidden{display:none}@media (max-width: 684px){.hide-on-phone{display:none}}@media (max-width: 900px){.hide-on-tablet{display:none}}.screen-reader-text{border:0;clip:rect(1px, 1px, 1px, 1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute !important;width:1px;word-wrap:normal !important}.screen-reader-text:focus{background-color:#f1f1f1;border-radius:3px;box-shadow:0 0 2px 2px rgba(0,0,0,0.6);clip:auto !important;clip-path:none;color:#21759b;display:block;font-size:14px;font-size:0.875rem;font-weight:bold;height:auto;width:auto;top:5px;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;z-index:100000}.background-image{background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:center center}.highlight{margin:30px auto}.posts{width:100%;max-width:800px;text-align:left;padding:20px;margin:20px auto}@media (max-width: 900px){.posts{max-width:660px}}.posts:not(:last-of-type){border-bottom:1px solid #dcdcdc}@media (prefers-color-scheme: dark){.posts:not(:last-of-type){border-bottom:1px solid #4e4e57}}@media (prefers-color-scheme: light){.posts:not(:last-of-type){border-bottom:1px solid #dcdcdc}}[data-theme=dark] .posts:not(:last-of-type){border-bottom:1px solid #4e4e57}[data-theme=light] .posts:not(:last-of-type){border-bottom:1px solid #dcdcdc}.posts-group{display:flex;margin-bottom:1.9em;line-height:normal}@media (max-width: 900px){.posts-group{display:block}}.posts-list{flex-grow:1;margin:0;padding:0;list-style:none}.posts .post-title{font-size:1rem;margin:5px 0 5px 0}.posts .post-year{padding-top:6px;margin-right:1.8em;font-size:1.6em;opacity:.6}@media (max-width: 900px){.posts .post-year{margin:-6px 0 4px}}.posts .post-item{border-bottom:1px grey dashed}.posts .post-item a{display:flex;justify-content:space-between;align-items:baseline;padding:12px 0;text-decoration:none}.posts .post-day{flex-shrink:0;margin-left:1em;opacity:.6}.post{width:100%;max-width:800px;text-align:left;padding:20px;margin:20px auto}@media (max-width: 900px){.post{max-width:600px}}.post-date:after{content:'—'}.post-title{font-size:2.625rem;margin:0 0 20px}@media (max-width: 684px){.post-title{font-size:2rem}}.post-title a{text-decoration:none}.post-tags{display:block;margin-bottom:20px;font-size:1rem;opacity:0.5}.post-tags a{text-decoration:none}.post-content{margin-top:30px}.post-cover{border-radius:8px;margin:40px -50px;width:860px;max-width:860px;overflow:hidden}@media (max-width: 900px){.post-cover{margin:20px 0;width:100%}}.post-excerpt{color:grey;font-style:italic}.post-info{margin-top:30px;font-size:0.8rem;line-height:normal;opacity:.6}.post-info p{margin:0.8em 0}.post-info a:hover{border-bottom:1px solid white}.post-info svg{margin-right:0.8em}.post-info .tag{margin-right:0.5em}.post-info .tag::before{content:"#"}.post-info .feather{display:inline-block;vertical-align:-.125em;width:1em;height:1em}.post-audio{display:flex;justify-content:center;align-items:center;padding-top:20px}.post-audio audio{width:90%}.post .flag{border-radius:50%;margin:0 5px}.pagination{margin-top:20px}.pagination__title{display:flex;text-align:center;position:relative;margin:20px 0}.pagination__title-h{text-align:center;margin:0 auto;padding:5px 10px;font-size:0.8rem;text-transform:uppercase;text-decoration:none;letter-spacing:0.1em;z-index:1;background:#fff;color:#999}@media (prefers-color-scheme: dark){.pagination__title-h{background:#232425;color:#b3b3bd}}@media (prefers-color-scheme: light){.pagination__title-h{background:#fff;color:#999}}[data-theme=dark] .pagination__title-h{background:#232425;color:#b3b3bd}[data-theme=light] .pagination__title-h{background:#fff;color:#999}.pagination__title hr{position:absolute;left:0;right:0;width:100%;margin-top:15px;z-index:0}.pagination__buttons{display:flex;align-items:center;justify-content:center}.pagination__buttons a{text-decoration:none;font-weight:bold}.button{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:1rem;font-weight:600;border-radius:8px;max-width:40%;padding:0;cursor:pointer;appearance:none;background:#eaeaea}@media (prefers-color-scheme: dark){.button{background:#3b3d42}}@media (prefers-color-scheme: light){.button{background:#eaeaea}}[data-theme=dark] .button{background:#3b3d42}[data-theme=light] .button{background:#eaeaea}.button+.button{margin-left:10px}.button a{display:flex;padding:8px 16px;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.button__text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.button.next .button__icon{margin-left:8px}.button.previous .button__icon{margin-right:8px}.footer{padding:40px 20px;flex-grow:0;color:#999}.footer__inner{display:flex;align-items:center;justify-content:center;margin:0 auto;width:760px;max-width:100%}@media (max-width: 900px){.footer__inner{flex-direction:column}}.footer__content{display:flex;flex-direction:row;align-items:center;font-size:1rem;color:#999}@media (max-width: 900px){.footer__content{flex-direction:column;margin-top:10px}}.footer__content>*:not(:last-child)::after{content:"•";padding:0 5px}@media (max-width: 900px){.footer__content>*:not(:last-child)::after{content:"";padding:0}}.footer__content>*:last-child{padding:0 0px}@media (max-width: 900px){.footer__content>*:last-child{padding:0}}.sharing-buttons{display:flex;flex-wrap:wrap;justify-content:space-between}.sharing-buttons .resp-sharing-button__icon,.sharing-buttons .resp-sharing-button__link{display:inline-block}.sharing-buttons .resp-sharing-button__link{text-decoration:none;margin:0.5em}.sharing-buttons .resp-sharing-button{border-radius:5px;transition:25ms ease-out;padding:0.5em 0.75em;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.sharing-buttons .resp-sharing-button__icon svg{width:1em;height:1em;margin-right:0.4em;vertical-align:top}.sharing-buttons .resp-sharing-button--small svg{margin:0;vertical-align:middle}.post-content table{border-collapse:collapse;margin:25px auto;font-size:0.9em;min-width:400px;max-width:100%}.post-content table th,.post-content table td{padding:12px 15px;border:1px solid #dcdcdc}@media (prefers-color-scheme: dark){.post-content table th,.post-content table td{border:1px solid #4e4e57}}@media (prefers-color-scheme: light){.post-content table th,.post-content table td{border:1px solid #dcdcdc}}[data-theme=dark] .post-content table th,[data-theme=dark] .post-content table td{border:1px solid #4e4e57}[data-theme=light] .post-content table th,[data-theme=light] .post-content table td{border:1px solid #dcdcdc}.post-content table thead tr{text-align:left;background-color:#dcdcdc;color:#222}@media (prefers-color-scheme: dark){.post-content table thead tr{background-color:#4e4e57;color:#a9a9b3}}@media (prefers-color-scheme: light){.post-content table thead tr{background-color:#dcdcdc;color:#222}}[data-theme=dark] .post-content table thead tr{background-color:#4e4e57;color:#a9a9b3}[data-theme=light] .post-content table thead tr{background-color:#dcdcdc;color:#222}.post-content table tbody tr{border:1px solid #dcdcdc}@media (prefers-color-scheme: dark){.post-content table tbody tr{border:1px solid #4e4e57}}@media (prefers-color-scheme: light){.post-content table tbody tr{border:1px solid #dcdcdc}}[data-theme=dark] .post-content table tbody tr{border:1px solid #4e4e57}[data-theme=light] .post-content table tbody tr{border:1px solid #dcdcdc}.btn-404 svg{vertical-align:middle;display:inline-block;margin-right:5px}.btn-404 a{margin:0 10px} +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */::-webkit-scrollbar{width:8px;height:8px;background:#212020}::-webkit-scrollbar-thumb{background:#888}::-webkit-scrollbar-thumb:hover{background:#dcdcdc}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-display:auto;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-display:auto;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-display:auto;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}code[class*="language-"],pre[class*="language-"]{color:white;background:none;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:1em;text-align:left;text-shadow:0 -.1em .2em black;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*="language-"],:not(pre)>code[class*="language-"]{background:#141414}pre[class*="language-"]{border-radius:.5em;border:0.3em solid #545454;box-shadow:1px 1px .5em black inset;margin:.5em 0;overflow:auto;padding:1em}pre[class*="language-"]::-moz-selection{background:#27292a}pre[class*="language-"]::selection{background:#27292a}pre[class*="language-"]::-moz-selection,pre[class*="language-"] ::-moz-selection,code[class*="language-"]::-moz-selection,code[class*="language-"] ::-moz-selection{text-shadow:none;background:rgba(237,237,237,0.15)}pre[class*="language-"]::selection,pre[class*="language-"] ::selection,code[class*="language-"]::selection,code[class*="language-"] ::selection{text-shadow:none;background:rgba(237,237,237,0.15)}:not(pre)>code[class*="language-"]{border-radius:.3em;border:0.13em solid #545454;box-shadow:1px 1px .3em -.1em black inset;padding:.15em .2em .05em;white-space:normal}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#787878}.token.punctuation{opacity:.7}.token.namespace{opacity:.7}.token.tag,.token.boolean,.token.number,.token.deleted{color:#cf694a}.token.keyword,.token.property,.token.selector,.token.constant,.token.symbol,.token.builtin{color:#f9ee9a}.token.attr-name,.token.attr-value,.token.string,.token.char,.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string,.token.variable,.token.inserted{color:#919e6b}.token.atrule{color:#7386a5}.token.regex,.token.important{color:#e9c163}.token.important,.token.bold{font-weight:bold}.token.italic{font-style:italic}.token.entity{cursor:help}pre[data-line]{padding:1em 0 1em 3em;position:relative}.language-markup .token.tag,.language-markup .token.attr-name,.language-markup .token.punctuation{color:#ad895c}.token{position:relative;z-index:1}.line-highlight{background:rgba(84,84,84,0.25);background:linear-gradient(to right, rgba(84,84,84,0.1) 70%, rgba(84,84,84,0));border-bottom:1px dashed #545454;border-top:1px dashed #545454;left:0;line-height:inherit;margin-top:0.75em;padding:inherit 0;pointer-events:none;position:absolute;right:0;white-space:pre;z-index:0}.line-highlight:before,.line-highlight[data-end]:after{background-color:#8794a6;border-radius:999px;box-shadow:0 1px white;color:#f5f2f0;content:attr(data-start);font:bold 65%/1.5 sans-serif;left:.6em;min-width:1em;padding:0 .5em;position:absolute;text-align:center;text-shadow:none;top:.4em;vertical-align:.3em}.line-highlight[data-end]:after{bottom:.4em;content:attr(data-end);top:auto}pre[data-line]{position:relative;padding:1em 0 1em 3em}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:rgba(153,122,102,0.08);background:linear-gradient(to right, rgba(153,122,102,0.1) 70%, rgba(153,122,102,0));pointer-events:none;line-height:inherit;white-space:pre}@media print{.line-highlight{-webkit-print-color-adjust:exact;color-adjust:exact}}.line-highlight:before,.line-highlight[data-end]:after{content:attr(data-start);position:absolute;top:.4em;left:.6em;min-width:1em;padding:0 .5em;background-color:rgba(153,122,102,0.4);color:#f5f2f0;font:bold 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px white}.line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}.line-numbers .line-highlight:before,.line-numbers .line-highlight:after{content:none}pre[id].linkable-line-numbers span.line-numbers-rows{pointer-events:all}pre[id].linkable-line-numbers span.line-numbers-rows>span:before{cursor:pointer}pre[id].linkable-line-numbers span.line-numbers-rows>span:hover:before{background-color:rgba(128,128,128,0.2)}pre[class*="language-"].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*="language-"].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:0.8em;text-align:right}div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;top:.3em;right:.2em;transition:opacity 0.3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar .toolbar-item{display:inline-block}div.code-toolbar>.toolbar a{cursor:pointer}div.code-toolbar>.toolbar button{background:none;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar a,div.code-toolbar>.toolbar button,div.code-toolbar>.toolbar span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,0.2);box-shadow:0 2px 0 0 rgba(0,0,0,0.2);border-radius:.5em}div.code-toolbar>.toolbar a:hover,div.code-toolbar>.toolbar a:focus,div.code-toolbar>.toolbar button:hover,div.code-toolbar>.toolbar button:focus,div.code-toolbar>.toolbar span:hover,div.code-toolbar>.toolbar span:focus{color:inherit;text-decoration:none}.fib{background-size:contain;background-position:50%;background-repeat:no-repeat}.fi{background-size:contain;background-position:50%;background-repeat:no-repeat;position:relative;display:inline-block;width:1.33333333em;line-height:1em}.fi:before{content:'\00a0'}.fi.fis{width:1em}.fi-xx{background-image:url(../flags/4x3/xx.svg)}.fi-xx.fis{background-image:url(../flags/1x1/xx.svg)}.fi-ad{background-image:url(../flags/4x3/ad.svg)}.fi-ad.fis{background-image:url(../flags/1x1/ad.svg)}.fi-ae{background-image:url(../flags/4x3/ae.svg)}.fi-ae.fis{background-image:url(../flags/1x1/ae.svg)}.fi-af{background-image:url(../flags/4x3/af.svg)}.fi-af.fis{background-image:url(../flags/1x1/af.svg)}.fi-ag{background-image:url(../flags/4x3/ag.svg)}.fi-ag.fis{background-image:url(../flags/1x1/ag.svg)}.fi-ai{background-image:url(../flags/4x3/ai.svg)}.fi-ai.fis{background-image:url(../flags/1x1/ai.svg)}.fi-al{background-image:url(../flags/4x3/al.svg)}.fi-al.fis{background-image:url(../flags/1x1/al.svg)}.fi-am{background-image:url(../flags/4x3/am.svg)}.fi-am.fis{background-image:url(../flags/1x1/am.svg)}.fi-ao{background-image:url(../flags/4x3/ao.svg)}.fi-ao.fis{background-image:url(../flags/1x1/ao.svg)}.fi-aq{background-image:url(../flags/4x3/aq.svg)}.fi-aq.fis{background-image:url(../flags/1x1/aq.svg)}.fi-ar{background-image:url(../flags/4x3/ar.svg)}.fi-ar.fis{background-image:url(../flags/1x1/ar.svg)}.fi-as{background-image:url(../flags/4x3/as.svg)}.fi-as.fis{background-image:url(../flags/1x1/as.svg)}.fi-at{background-image:url(../flags/4x3/at.svg)}.fi-at.fis{background-image:url(../flags/1x1/at.svg)}.fi-au{background-image:url(../flags/4x3/au.svg)}.fi-au.fis{background-image:url(../flags/1x1/au.svg)}.fi-aw{background-image:url(../flags/4x3/aw.svg)}.fi-aw.fis{background-image:url(../flags/1x1/aw.svg)}.fi-ax{background-image:url(../flags/4x3/ax.svg)}.fi-ax.fis{background-image:url(../flags/1x1/ax.svg)}.fi-az{background-image:url(../flags/4x3/az.svg)}.fi-az.fis{background-image:url(../flags/1x1/az.svg)}.fi-ba{background-image:url(../flags/4x3/ba.svg)}.fi-ba.fis{background-image:url(../flags/1x1/ba.svg)}.fi-bb{background-image:url(../flags/4x3/bb.svg)}.fi-bb.fis{background-image:url(../flags/1x1/bb.svg)}.fi-bd{background-image:url(../flags/4x3/bd.svg)}.fi-bd.fis{background-image:url(../flags/1x1/bd.svg)}.fi-be{background-image:url(../flags/4x3/be.svg)}.fi-be.fis{background-image:url(../flags/1x1/be.svg)}.fi-bf{background-image:url(../flags/4x3/bf.svg)}.fi-bf.fis{background-image:url(../flags/1x1/bf.svg)}.fi-bg{background-image:url(../flags/4x3/bg.svg)}.fi-bg.fis{background-image:url(../flags/1x1/bg.svg)}.fi-bh{background-image:url(../flags/4x3/bh.svg)}.fi-bh.fis{background-image:url(../flags/1x1/bh.svg)}.fi-bi{background-image:url(../flags/4x3/bi.svg)}.fi-bi.fis{background-image:url(../flags/1x1/bi.svg)}.fi-bj{background-image:url(../flags/4x3/bj.svg)}.fi-bj.fis{background-image:url(../flags/1x1/bj.svg)}.fi-bl{background-image:url(../flags/4x3/bl.svg)}.fi-bl.fis{background-image:url(../flags/1x1/bl.svg)}.fi-bm{background-image:url(../flags/4x3/bm.svg)}.fi-bm.fis{background-image:url(../flags/1x1/bm.svg)}.fi-bn{background-image:url(../flags/4x3/bn.svg)}.fi-bn.fis{background-image:url(../flags/1x1/bn.svg)}.fi-bo{background-image:url(../flags/4x3/bo.svg)}.fi-bo.fis{background-image:url(../flags/1x1/bo.svg)}.fi-bq{background-image:url(../flags/4x3/bq.svg)}.fi-bq.fis{background-image:url(../flags/1x1/bq.svg)}.fi-br{background-image:url(../flags/4x3/br.svg)}.fi-br.fis{background-image:url(../flags/1x1/br.svg)}.fi-bs{background-image:url(../flags/4x3/bs.svg)}.fi-bs.fis{background-image:url(../flags/1x1/bs.svg)}.fi-bt{background-image:url(../flags/4x3/bt.svg)}.fi-bt.fis{background-image:url(../flags/1x1/bt.svg)}.fi-bv{background-image:url(../flags/4x3/bv.svg)}.fi-bv.fis{background-image:url(../flags/1x1/bv.svg)}.fi-bw{background-image:url(../flags/4x3/bw.svg)}.fi-bw.fis{background-image:url(../flags/1x1/bw.svg)}.fi-by{background-image:url(../flags/4x3/by.svg)}.fi-by.fis{background-image:url(../flags/1x1/by.svg)}.fi-bz{background-image:url(../flags/4x3/bz.svg)}.fi-bz.fis{background-image:url(../flags/1x1/bz.svg)}.fi-ca{background-image:url(../flags/4x3/ca.svg)}.fi-ca.fis{background-image:url(../flags/1x1/ca.svg)}.fi-cc{background-image:url(../flags/4x3/cc.svg)}.fi-cc.fis{background-image:url(../flags/1x1/cc.svg)}.fi-cd{background-image:url(../flags/4x3/cd.svg)}.fi-cd.fis{background-image:url(../flags/1x1/cd.svg)}.fi-cf{background-image:url(../flags/4x3/cf.svg)}.fi-cf.fis{background-image:url(../flags/1x1/cf.svg)}.fi-cg{background-image:url(../flags/4x3/cg.svg)}.fi-cg.fis{background-image:url(../flags/1x1/cg.svg)}.fi-ch{background-image:url(../flags/4x3/ch.svg)}.fi-ch.fis{background-image:url(../flags/1x1/ch.svg)}.fi-ci{background-image:url(../flags/4x3/ci.svg)}.fi-ci.fis{background-image:url(../flags/1x1/ci.svg)}.fi-ck{background-image:url(../flags/4x3/ck.svg)}.fi-ck.fis{background-image:url(../flags/1x1/ck.svg)}.fi-cl{background-image:url(../flags/4x3/cl.svg)}.fi-cl.fis{background-image:url(../flags/1x1/cl.svg)}.fi-cm{background-image:url(../flags/4x3/cm.svg)}.fi-cm.fis{background-image:url(../flags/1x1/cm.svg)}.fi-cn{background-image:url(../flags/4x3/cn.svg)}.fi-cn.fis{background-image:url(../flags/1x1/cn.svg)}.fi-co{background-image:url(../flags/4x3/co.svg)}.fi-co.fis{background-image:url(../flags/1x1/co.svg)}.fi-cr{background-image:url(../flags/4x3/cr.svg)}.fi-cr.fis{background-image:url(../flags/1x1/cr.svg)}.fi-cu{background-image:url(../flags/4x3/cu.svg)}.fi-cu.fis{background-image:url(../flags/1x1/cu.svg)}.fi-cv{background-image:url(../flags/4x3/cv.svg)}.fi-cv.fis{background-image:url(../flags/1x1/cv.svg)}.fi-cw{background-image:url(../flags/4x3/cw.svg)}.fi-cw.fis{background-image:url(../flags/1x1/cw.svg)}.fi-cx{background-image:url(../flags/4x3/cx.svg)}.fi-cx.fis{background-image:url(../flags/1x1/cx.svg)}.fi-cy{background-image:url(../flags/4x3/cy.svg)}.fi-cy.fis{background-image:url(../flags/1x1/cy.svg)}.fi-cz{background-image:url(../flags/4x3/cz.svg)}.fi-cz.fis{background-image:url(../flags/1x1/cz.svg)}.fi-de{background-image:url(../flags/4x3/de.svg)}.fi-de.fis{background-image:url(../flags/1x1/de.svg)}.fi-dj{background-image:url(../flags/4x3/dj.svg)}.fi-dj.fis{background-image:url(../flags/1x1/dj.svg)}.fi-dk{background-image:url(../flags/4x3/dk.svg)}.fi-dk.fis{background-image:url(../flags/1x1/dk.svg)}.fi-dm{background-image:url(../flags/4x3/dm.svg)}.fi-dm.fis{background-image:url(../flags/1x1/dm.svg)}.fi-do{background-image:url(../flags/4x3/do.svg)}.fi-do.fis{background-image:url(../flags/1x1/do.svg)}.fi-dz{background-image:url(../flags/4x3/dz.svg)}.fi-dz.fis{background-image:url(../flags/1x1/dz.svg)}.fi-ec{background-image:url(../flags/4x3/ec.svg)}.fi-ec.fis{background-image:url(../flags/1x1/ec.svg)}.fi-ee{background-image:url(../flags/4x3/ee.svg)}.fi-ee.fis{background-image:url(../flags/1x1/ee.svg)}.fi-eg{background-image:url(../flags/4x3/eg.svg)}.fi-eg.fis{background-image:url(../flags/1x1/eg.svg)}.fi-eh{background-image:url(../flags/4x3/eh.svg)}.fi-eh.fis{background-image:url(../flags/1x1/eh.svg)}.fi-er{background-image:url(../flags/4x3/er.svg)}.fi-er.fis{background-image:url(../flags/1x1/er.svg)}.fi-es{background-image:url(../flags/4x3/es.svg)}.fi-es.fis{background-image:url(../flags/1x1/es.svg)}.fi-et{background-image:url(../flags/4x3/et.svg)}.fi-et.fis{background-image:url(../flags/1x1/et.svg)}.fi-fi{background-image:url(../flags/4x3/fi.svg)}.fi-fi.fis{background-image:url(../flags/1x1/fi.svg)}.fi-fj{background-image:url(../flags/4x3/fj.svg)}.fi-fj.fis{background-image:url(../flags/1x1/fj.svg)}.fi-fk{background-image:url(../flags/4x3/fk.svg)}.fi-fk.fis{background-image:url(../flags/1x1/fk.svg)}.fi-fm{background-image:url(../flags/4x3/fm.svg)}.fi-fm.fis{background-image:url(../flags/1x1/fm.svg)}.fi-fo{background-image:url(../flags/4x3/fo.svg)}.fi-fo.fis{background-image:url(../flags/1x1/fo.svg)}.fi-fr{background-image:url(../flags/4x3/fr.svg)}.fi-fr.fis{background-image:url(../flags/1x1/fr.svg)}.fi-ga{background-image:url(../flags/4x3/ga.svg)}.fi-ga.fis{background-image:url(../flags/1x1/ga.svg)}.fi-gb{background-image:url(../flags/4x3/gb.svg)}.fi-gb.fis{background-image:url(../flags/1x1/gb.svg)}.fi-gd{background-image:url(../flags/4x3/gd.svg)}.fi-gd.fis{background-image:url(../flags/1x1/gd.svg)}.fi-ge{background-image:url(../flags/4x3/ge.svg)}.fi-ge.fis{background-image:url(../flags/1x1/ge.svg)}.fi-gf{background-image:url(../flags/4x3/gf.svg)}.fi-gf.fis{background-image:url(../flags/1x1/gf.svg)}.fi-gg{background-image:url(../flags/4x3/gg.svg)}.fi-gg.fis{background-image:url(../flags/1x1/gg.svg)}.fi-gh{background-image:url(../flags/4x3/gh.svg)}.fi-gh.fis{background-image:url(../flags/1x1/gh.svg)}.fi-gi{background-image:url(../flags/4x3/gi.svg)}.fi-gi.fis{background-image:url(../flags/1x1/gi.svg)}.fi-gl{background-image:url(../flags/4x3/gl.svg)}.fi-gl.fis{background-image:url(../flags/1x1/gl.svg)}.fi-gm{background-image:url(../flags/4x3/gm.svg)}.fi-gm.fis{background-image:url(../flags/1x1/gm.svg)}.fi-gn{background-image:url(../flags/4x3/gn.svg)}.fi-gn.fis{background-image:url(../flags/1x1/gn.svg)}.fi-gp{background-image:url(../flags/4x3/gp.svg)}.fi-gp.fis{background-image:url(../flags/1x1/gp.svg)}.fi-gq{background-image:url(../flags/4x3/gq.svg)}.fi-gq.fis{background-image:url(../flags/1x1/gq.svg)}.fi-gr{background-image:url(../flags/4x3/gr.svg)}.fi-gr.fis{background-image:url(../flags/1x1/gr.svg)}.fi-gs{background-image:url(../flags/4x3/gs.svg)}.fi-gs.fis{background-image:url(../flags/1x1/gs.svg)}.fi-gt{background-image:url(../flags/4x3/gt.svg)}.fi-gt.fis{background-image:url(../flags/1x1/gt.svg)}.fi-gu{background-image:url(../flags/4x3/gu.svg)}.fi-gu.fis{background-image:url(../flags/1x1/gu.svg)}.fi-gw{background-image:url(../flags/4x3/gw.svg)}.fi-gw.fis{background-image:url(../flags/1x1/gw.svg)}.fi-gy{background-image:url(../flags/4x3/gy.svg)}.fi-gy.fis{background-image:url(../flags/1x1/gy.svg)}.fi-hk{background-image:url(../flags/4x3/hk.svg)}.fi-hk.fis{background-image:url(../flags/1x1/hk.svg)}.fi-hm{background-image:url(../flags/4x3/hm.svg)}.fi-hm.fis{background-image:url(../flags/1x1/hm.svg)}.fi-hn{background-image:url(../flags/4x3/hn.svg)}.fi-hn.fis{background-image:url(../flags/1x1/hn.svg)}.fi-hr{background-image:url(../flags/4x3/hr.svg)}.fi-hr.fis{background-image:url(../flags/1x1/hr.svg)}.fi-ht{background-image:url(../flags/4x3/ht.svg)}.fi-ht.fis{background-image:url(../flags/1x1/ht.svg)}.fi-hu{background-image:url(../flags/4x3/hu.svg)}.fi-hu.fis{background-image:url(../flags/1x1/hu.svg)}.fi-id{background-image:url(../flags/4x3/id.svg)}.fi-id.fis{background-image:url(../flags/1x1/id.svg)}.fi-ie{background-image:url(../flags/4x3/ie.svg)}.fi-ie.fis{background-image:url(../flags/1x1/ie.svg)}.fi-il{background-image:url(../flags/4x3/il.svg)}.fi-il.fis{background-image:url(../flags/1x1/il.svg)}.fi-im{background-image:url(../flags/4x3/im.svg)}.fi-im.fis{background-image:url(../flags/1x1/im.svg)}.fi-in{background-image:url(../flags/4x3/in.svg)}.fi-in.fis{background-image:url(../flags/1x1/in.svg)}.fi-io{background-image:url(../flags/4x3/io.svg)}.fi-io.fis{background-image:url(../flags/1x1/io.svg)}.fi-iq{background-image:url(../flags/4x3/iq.svg)}.fi-iq.fis{background-image:url(../flags/1x1/iq.svg)}.fi-ir{background-image:url(../flags/4x3/ir.svg)}.fi-ir.fis{background-image:url(../flags/1x1/ir.svg)}.fi-is{background-image:url(../flags/4x3/is.svg)}.fi-is.fis{background-image:url(../flags/1x1/is.svg)}.fi-it{background-image:url(../flags/4x3/it.svg)}.fi-it.fis{background-image:url(../flags/1x1/it.svg)}.fi-je{background-image:url(../flags/4x3/je.svg)}.fi-je.fis{background-image:url(../flags/1x1/je.svg)}.fi-jm{background-image:url(../flags/4x3/jm.svg)}.fi-jm.fis{background-image:url(../flags/1x1/jm.svg)}.fi-jo{background-image:url(../flags/4x3/jo.svg)}.fi-jo.fis{background-image:url(../flags/1x1/jo.svg)}.fi-jp{background-image:url(../flags/4x3/jp.svg)}.fi-jp.fis{background-image:url(../flags/1x1/jp.svg)}.fi-ke{background-image:url(../flags/4x3/ke.svg)}.fi-ke.fis{background-image:url(../flags/1x1/ke.svg)}.fi-kg{background-image:url(../flags/4x3/kg.svg)}.fi-kg.fis{background-image:url(../flags/1x1/kg.svg)}.fi-kh{background-image:url(../flags/4x3/kh.svg)}.fi-kh.fis{background-image:url(../flags/1x1/kh.svg)}.fi-ki{background-image:url(../flags/4x3/ki.svg)}.fi-ki.fis{background-image:url(../flags/1x1/ki.svg)}.fi-km{background-image:url(../flags/4x3/km.svg)}.fi-km.fis{background-image:url(../flags/1x1/km.svg)}.fi-kn{background-image:url(../flags/4x3/kn.svg)}.fi-kn.fis{background-image:url(../flags/1x1/kn.svg)}.fi-kp{background-image:url(../flags/4x3/kp.svg)}.fi-kp.fis{background-image:url(../flags/1x1/kp.svg)}.fi-kr{background-image:url(../flags/4x3/kr.svg)}.fi-kr.fis{background-image:url(../flags/1x1/kr.svg)}.fi-kw{background-image:url(../flags/4x3/kw.svg)}.fi-kw.fis{background-image:url(../flags/1x1/kw.svg)}.fi-ky{background-image:url(../flags/4x3/ky.svg)}.fi-ky.fis{background-image:url(../flags/1x1/ky.svg)}.fi-kz{background-image:url(../flags/4x3/kz.svg)}.fi-kz.fis{background-image:url(../flags/1x1/kz.svg)}.fi-la{background-image:url(../flags/4x3/la.svg)}.fi-la.fis{background-image:url(../flags/1x1/la.svg)}.fi-lb{background-image:url(../flags/4x3/lb.svg)}.fi-lb.fis{background-image:url(../flags/1x1/lb.svg)}.fi-lc{background-image:url(../flags/4x3/lc.svg)}.fi-lc.fis{background-image:url(../flags/1x1/lc.svg)}.fi-li{background-image:url(../flags/4x3/li.svg)}.fi-li.fis{background-image:url(../flags/1x1/li.svg)}.fi-lk{background-image:url(../flags/4x3/lk.svg)}.fi-lk.fis{background-image:url(../flags/1x1/lk.svg)}.fi-lr{background-image:url(../flags/4x3/lr.svg)}.fi-lr.fis{background-image:url(../flags/1x1/lr.svg)}.fi-ls{background-image:url(../flags/4x3/ls.svg)}.fi-ls.fis{background-image:url(../flags/1x1/ls.svg)}.fi-lt{background-image:url(../flags/4x3/lt.svg)}.fi-lt.fis{background-image:url(../flags/1x1/lt.svg)}.fi-lu{background-image:url(../flags/4x3/lu.svg)}.fi-lu.fis{background-image:url(../flags/1x1/lu.svg)}.fi-lv{background-image:url(../flags/4x3/lv.svg)}.fi-lv.fis{background-image:url(../flags/1x1/lv.svg)}.fi-ly{background-image:url(../flags/4x3/ly.svg)}.fi-ly.fis{background-image:url(../flags/1x1/ly.svg)}.fi-ma{background-image:url(../flags/4x3/ma.svg)}.fi-ma.fis{background-image:url(../flags/1x1/ma.svg)}.fi-mc{background-image:url(../flags/4x3/mc.svg)}.fi-mc.fis{background-image:url(../flags/1x1/mc.svg)}.fi-md{background-image:url(../flags/4x3/md.svg)}.fi-md.fis{background-image:url(../flags/1x1/md.svg)}.fi-me{background-image:url(../flags/4x3/me.svg)}.fi-me.fis{background-image:url(../flags/1x1/me.svg)}.fi-mf{background-image:url(../flags/4x3/mf.svg)}.fi-mf.fis{background-image:url(../flags/1x1/mf.svg)}.fi-mg{background-image:url(../flags/4x3/mg.svg)}.fi-mg.fis{background-image:url(../flags/1x1/mg.svg)}.fi-mh{background-image:url(../flags/4x3/mh.svg)}.fi-mh.fis{background-image:url(../flags/1x1/mh.svg)}.fi-mk{background-image:url(../flags/4x3/mk.svg)}.fi-mk.fis{background-image:url(../flags/1x1/mk.svg)}.fi-ml{background-image:url(../flags/4x3/ml.svg)}.fi-ml.fis{background-image:url(../flags/1x1/ml.svg)}.fi-mm{background-image:url(../flags/4x3/mm.svg)}.fi-mm.fis{background-image:url(../flags/1x1/mm.svg)}.fi-mn{background-image:url(../flags/4x3/mn.svg)}.fi-mn.fis{background-image:url(../flags/1x1/mn.svg)}.fi-mo{background-image:url(../flags/4x3/mo.svg)}.fi-mo.fis{background-image:url(../flags/1x1/mo.svg)}.fi-mp{background-image:url(../flags/4x3/mp.svg)}.fi-mp.fis{background-image:url(../flags/1x1/mp.svg)}.fi-mq{background-image:url(../flags/4x3/mq.svg)}.fi-mq.fis{background-image:url(../flags/1x1/mq.svg)}.fi-mr{background-image:url(../flags/4x3/mr.svg)}.fi-mr.fis{background-image:url(../flags/1x1/mr.svg)}.fi-ms{background-image:url(../flags/4x3/ms.svg)}.fi-ms.fis{background-image:url(../flags/1x1/ms.svg)}.fi-mt{background-image:url(../flags/4x3/mt.svg)}.fi-mt.fis{background-image:url(../flags/1x1/mt.svg)}.fi-mu{background-image:url(../flags/4x3/mu.svg)}.fi-mu.fis{background-image:url(../flags/1x1/mu.svg)}.fi-mv{background-image:url(../flags/4x3/mv.svg)}.fi-mv.fis{background-image:url(../flags/1x1/mv.svg)}.fi-mw{background-image:url(../flags/4x3/mw.svg)}.fi-mw.fis{background-image:url(../flags/1x1/mw.svg)}.fi-mx{background-image:url(../flags/4x3/mx.svg)}.fi-mx.fis{background-image:url(../flags/1x1/mx.svg)}.fi-my{background-image:url(../flags/4x3/my.svg)}.fi-my.fis{background-image:url(../flags/1x1/my.svg)}.fi-mz{background-image:url(../flags/4x3/mz.svg)}.fi-mz.fis{background-image:url(../flags/1x1/mz.svg)}.fi-na{background-image:url(../flags/4x3/na.svg)}.fi-na.fis{background-image:url(../flags/1x1/na.svg)}.fi-nc{background-image:url(../flags/4x3/nc.svg)}.fi-nc.fis{background-image:url(../flags/1x1/nc.svg)}.fi-ne{background-image:url(../flags/4x3/ne.svg)}.fi-ne.fis{background-image:url(../flags/1x1/ne.svg)}.fi-nf{background-image:url(../flags/4x3/nf.svg)}.fi-nf.fis{background-image:url(../flags/1x1/nf.svg)}.fi-ng{background-image:url(../flags/4x3/ng.svg)}.fi-ng.fis{background-image:url(../flags/1x1/ng.svg)}.fi-ni{background-image:url(../flags/4x3/ni.svg)}.fi-ni.fis{background-image:url(../flags/1x1/ni.svg)}.fi-nl{background-image:url(../flags/4x3/nl.svg)}.fi-nl.fis{background-image:url(../flags/1x1/nl.svg)}.fi-no{background-image:url(../flags/4x3/no.svg)}.fi-no.fis{background-image:url(../flags/1x1/no.svg)}.fi-np{background-image:url(../flags/4x3/np.svg)}.fi-np.fis{background-image:url(../flags/1x1/np.svg)}.fi-nr{background-image:url(../flags/4x3/nr.svg)}.fi-nr.fis{background-image:url(../flags/1x1/nr.svg)}.fi-nu{background-image:url(../flags/4x3/nu.svg)}.fi-nu.fis{background-image:url(../flags/1x1/nu.svg)}.fi-nz{background-image:url(../flags/4x3/nz.svg)}.fi-nz.fis{background-image:url(../flags/1x1/nz.svg)}.fi-om{background-image:url(../flags/4x3/om.svg)}.fi-om.fis{background-image:url(../flags/1x1/om.svg)}.fi-pa{background-image:url(../flags/4x3/pa.svg)}.fi-pa.fis{background-image:url(../flags/1x1/pa.svg)}.fi-pe{background-image:url(../flags/4x3/pe.svg)}.fi-pe.fis{background-image:url(../flags/1x1/pe.svg)}.fi-pf{background-image:url(../flags/4x3/pf.svg)}.fi-pf.fis{background-image:url(../flags/1x1/pf.svg)}.fi-pg{background-image:url(../flags/4x3/pg.svg)}.fi-pg.fis{background-image:url(../flags/1x1/pg.svg)}.fi-ph{background-image:url(../flags/4x3/ph.svg)}.fi-ph.fis{background-image:url(../flags/1x1/ph.svg)}.fi-pk{background-image:url(../flags/4x3/pk.svg)}.fi-pk.fis{background-image:url(../flags/1x1/pk.svg)}.fi-pl{background-image:url(../flags/4x3/pl.svg)}.fi-pl.fis{background-image:url(../flags/1x1/pl.svg)}.fi-pm{background-image:url(../flags/4x3/pm.svg)}.fi-pm.fis{background-image:url(../flags/1x1/pm.svg)}.fi-pn{background-image:url(../flags/4x3/pn.svg)}.fi-pn.fis{background-image:url(../flags/1x1/pn.svg)}.fi-pr{background-image:url(../flags/4x3/pr.svg)}.fi-pr.fis{background-image:url(../flags/1x1/pr.svg)}.fi-ps{background-image:url(../flags/4x3/ps.svg)}.fi-ps.fis{background-image:url(../flags/1x1/ps.svg)}.fi-pt{background-image:url(../flags/4x3/pt.svg)}.fi-pt.fis{background-image:url(../flags/1x1/pt.svg)}.fi-pw{background-image:url(../flags/4x3/pw.svg)}.fi-pw.fis{background-image:url(../flags/1x1/pw.svg)}.fi-py{background-image:url(../flags/4x3/py.svg)}.fi-py.fis{background-image:url(../flags/1x1/py.svg)}.fi-qa{background-image:url(../flags/4x3/qa.svg)}.fi-qa.fis{background-image:url(../flags/1x1/qa.svg)}.fi-re{background-image:url(../flags/4x3/re.svg)}.fi-re.fis{background-image:url(../flags/1x1/re.svg)}.fi-ro{background-image:url(../flags/4x3/ro.svg)}.fi-ro.fis{background-image:url(../flags/1x1/ro.svg)}.fi-rs{background-image:url(../flags/4x3/rs.svg)}.fi-rs.fis{background-image:url(../flags/1x1/rs.svg)}.fi-ru{background-image:url(../flags/4x3/ru.svg)}.fi-ru.fis{background-image:url(../flags/1x1/ru.svg)}.fi-rw{background-image:url(../flags/4x3/rw.svg)}.fi-rw.fis{background-image:url(../flags/1x1/rw.svg)}.fi-sa{background-image:url(../flags/4x3/sa.svg)}.fi-sa.fis{background-image:url(../flags/1x1/sa.svg)}.fi-sb{background-image:url(../flags/4x3/sb.svg)}.fi-sb.fis{background-image:url(../flags/1x1/sb.svg)}.fi-sc{background-image:url(../flags/4x3/sc.svg)}.fi-sc.fis{background-image:url(../flags/1x1/sc.svg)}.fi-sd{background-image:url(../flags/4x3/sd.svg)}.fi-sd.fis{background-image:url(../flags/1x1/sd.svg)}.fi-se{background-image:url(../flags/4x3/se.svg)}.fi-se.fis{background-image:url(../flags/1x1/se.svg)}.fi-sg{background-image:url(../flags/4x3/sg.svg)}.fi-sg.fis{background-image:url(../flags/1x1/sg.svg)}.fi-sh{background-image:url(../flags/4x3/sh.svg)}.fi-sh.fis{background-image:url(../flags/1x1/sh.svg)}.fi-si{background-image:url(../flags/4x3/si.svg)}.fi-si.fis{background-image:url(../flags/1x1/si.svg)}.fi-sj{background-image:url(../flags/4x3/sj.svg)}.fi-sj.fis{background-image:url(../flags/1x1/sj.svg)}.fi-sk{background-image:url(../flags/4x3/sk.svg)}.fi-sk.fis{background-image:url(../flags/1x1/sk.svg)}.fi-sl{background-image:url(../flags/4x3/sl.svg)}.fi-sl.fis{background-image:url(../flags/1x1/sl.svg)}.fi-sm{background-image:url(../flags/4x3/sm.svg)}.fi-sm.fis{background-image:url(../flags/1x1/sm.svg)}.fi-sn{background-image:url(../flags/4x3/sn.svg)}.fi-sn.fis{background-image:url(../flags/1x1/sn.svg)}.fi-so{background-image:url(../flags/4x3/so.svg)}.fi-so.fis{background-image:url(../flags/1x1/so.svg)}.fi-sr{background-image:url(../flags/4x3/sr.svg)}.fi-sr.fis{background-image:url(../flags/1x1/sr.svg)}.fi-ss{background-image:url(../flags/4x3/ss.svg)}.fi-ss.fis{background-image:url(../flags/1x1/ss.svg)}.fi-st{background-image:url(../flags/4x3/st.svg)}.fi-st.fis{background-image:url(../flags/1x1/st.svg)}.fi-sv{background-image:url(../flags/4x3/sv.svg)}.fi-sv.fis{background-image:url(../flags/1x1/sv.svg)}.fi-sx{background-image:url(../flags/4x3/sx.svg)}.fi-sx.fis{background-image:url(../flags/1x1/sx.svg)}.fi-sy{background-image:url(../flags/4x3/sy.svg)}.fi-sy.fis{background-image:url(../flags/1x1/sy.svg)}.fi-sz{background-image:url(../flags/4x3/sz.svg)}.fi-sz.fis{background-image:url(../flags/1x1/sz.svg)}.fi-tc{background-image:url(../flags/4x3/tc.svg)}.fi-tc.fis{background-image:url(../flags/1x1/tc.svg)}.fi-td{background-image:url(../flags/4x3/td.svg)}.fi-td.fis{background-image:url(../flags/1x1/td.svg)}.fi-tf{background-image:url(../flags/4x3/tf.svg)}.fi-tf.fis{background-image:url(../flags/1x1/tf.svg)}.fi-tg{background-image:url(../flags/4x3/tg.svg)}.fi-tg.fis{background-image:url(../flags/1x1/tg.svg)}.fi-th{background-image:url(../flags/4x3/th.svg)}.fi-th.fis{background-image:url(../flags/1x1/th.svg)}.fi-tj{background-image:url(../flags/4x3/tj.svg)}.fi-tj.fis{background-image:url(../flags/1x1/tj.svg)}.fi-tk{background-image:url(../flags/4x3/tk.svg)}.fi-tk.fis{background-image:url(../flags/1x1/tk.svg)}.fi-tl{background-image:url(../flags/4x3/tl.svg)}.fi-tl.fis{background-image:url(../flags/1x1/tl.svg)}.fi-tm{background-image:url(../flags/4x3/tm.svg)}.fi-tm.fis{background-image:url(../flags/1x1/tm.svg)}.fi-tn{background-image:url(../flags/4x3/tn.svg)}.fi-tn.fis{background-image:url(../flags/1x1/tn.svg)}.fi-to{background-image:url(../flags/4x3/to.svg)}.fi-to.fis{background-image:url(../flags/1x1/to.svg)}.fi-tr{background-image:url(../flags/4x3/tr.svg)}.fi-tr.fis{background-image:url(../flags/1x1/tr.svg)}.fi-tt{background-image:url(../flags/4x3/tt.svg)}.fi-tt.fis{background-image:url(../flags/1x1/tt.svg)}.fi-tv{background-image:url(../flags/4x3/tv.svg)}.fi-tv.fis{background-image:url(../flags/1x1/tv.svg)}.fi-tw{background-image:url(../flags/4x3/tw.svg)}.fi-tw.fis{background-image:url(../flags/1x1/tw.svg)}.fi-tz{background-image:url(../flags/4x3/tz.svg)}.fi-tz.fis{background-image:url(../flags/1x1/tz.svg)}.fi-ua{background-image:url(../flags/4x3/ua.svg)}.fi-ua.fis{background-image:url(../flags/1x1/ua.svg)}.fi-ug{background-image:url(../flags/4x3/ug.svg)}.fi-ug.fis{background-image:url(../flags/1x1/ug.svg)}.fi-um{background-image:url(../flags/4x3/um.svg)}.fi-um.fis{background-image:url(../flags/1x1/um.svg)}.fi-us{background-image:url(../flags/4x3/us.svg)}.fi-us.fis{background-image:url(../flags/1x1/us.svg)}.fi-uy{background-image:url(../flags/4x3/uy.svg)}.fi-uy.fis{background-image:url(../flags/1x1/uy.svg)}.fi-uz{background-image:url(../flags/4x3/uz.svg)}.fi-uz.fis{background-image:url(../flags/1x1/uz.svg)}.fi-va{background-image:url(../flags/4x3/va.svg)}.fi-va.fis{background-image:url(../flags/1x1/va.svg)}.fi-vc{background-image:url(../flags/4x3/vc.svg)}.fi-vc.fis{background-image:url(../flags/1x1/vc.svg)}.fi-ve{background-image:url(../flags/4x3/ve.svg)}.fi-ve.fis{background-image:url(../flags/1x1/ve.svg)}.fi-vg{background-image:url(../flags/4x3/vg.svg)}.fi-vg.fis{background-image:url(../flags/1x1/vg.svg)}.fi-vi{background-image:url(../flags/4x3/vi.svg)}.fi-vi.fis{background-image:url(../flags/1x1/vi.svg)}.fi-vn{background-image:url(../flags/4x3/vn.svg)}.fi-vn.fis{background-image:url(../flags/1x1/vn.svg)}.fi-vu{background-image:url(../flags/4x3/vu.svg)}.fi-vu.fis{background-image:url(../flags/1x1/vu.svg)}.fi-wf{background-image:url(../flags/4x3/wf.svg)}.fi-wf.fis{background-image:url(../flags/1x1/wf.svg)}.fi-ws{background-image:url(../flags/4x3/ws.svg)}.fi-ws.fis{background-image:url(../flags/1x1/ws.svg)}.fi-ye{background-image:url(../flags/4x3/ye.svg)}.fi-ye.fis{background-image:url(../flags/1x1/ye.svg)}.fi-yt{background-image:url(../flags/4x3/yt.svg)}.fi-yt.fis{background-image:url(../flags/1x1/yt.svg)}.fi-za{background-image:url(../flags/4x3/za.svg)}.fi-za.fis{background-image:url(../flags/1x1/za.svg)}.fi-zm{background-image:url(../flags/4x3/zm.svg)}.fi-zm.fis{background-image:url(../flags/1x1/zm.svg)}.fi-zw{background-image:url(../flags/4x3/zw.svg)}.fi-zw.fis{background-image:url(../flags/1x1/zw.svg)}.fi-ac{background-image:url(../flags/4x3/ac.svg)}.fi-ac.fis{background-image:url(../flags/1x1/ac.svg)}.fi-cefta{background-image:url(../flags/4x3/cefta.svg)}.fi-cefta.fis{background-image:url(../flags/1x1/cefta.svg)}.fi-cp{background-image:url(../flags/4x3/cp.svg)}.fi-cp.fis{background-image:url(../flags/1x1/cp.svg)}.fi-dg{background-image:url(../flags/4x3/dg.svg)}.fi-dg.fis{background-image:url(../flags/1x1/dg.svg)}.fi-ea{background-image:url(../flags/4x3/ea.svg)}.fi-ea.fis{background-image:url(../flags/1x1/ea.svg)}.fi-es-ct{background-image:url(../flags/4x3/es-ct.svg)}.fi-es-ct.fis{background-image:url(../flags/1x1/es-ct.svg)}.fi-es-ga{background-image:url(../flags/4x3/es-ga.svg)}.fi-es-ga.fis{background-image:url(../flags/1x1/es-ga.svg)}.fi-es-pv{background-image:url(../flags/4x3/es-pv.svg)}.fi-es-pv.fis{background-image:url(../flags/1x1/es-pv.svg)}.fi-eu{background-image:url(../flags/4x3/eu.svg)}.fi-eu.fis{background-image:url(../flags/1x1/eu.svg)}.fi-gb-eng{background-image:url(../flags/4x3/gb-eng.svg)}.fi-gb-eng.fis{background-image:url(../flags/1x1/gb-eng.svg)}.fi-gb-nir{background-image:url(../flags/4x3/gb-nir.svg)}.fi-gb-nir.fis{background-image:url(../flags/1x1/gb-nir.svg)}.fi-gb-sct{background-image:url(../flags/4x3/gb-sct.svg)}.fi-gb-sct.fis{background-image:url(../flags/1x1/gb-sct.svg)}.fi-gb-wls{background-image:url(../flags/4x3/gb-wls.svg)}.fi-gb-wls.fis{background-image:url(../flags/1x1/gb-wls.svg)}.fi-ic{background-image:url(../flags/4x3/ic.svg)}.fi-ic.fis{background-image:url(../flags/1x1/ic.svg)}.fi-ta{background-image:url(../flags/4x3/ta.svg)}.fi-ta.fis{background-image:url(../flags/1x1/ta.svg)}.fi-un{background-image:url(../flags/4x3/un.svg)}.fi-un.fis{background-image:url(../flags/1x1/un.svg)}.fi-xk{background-image:url(../flags/4x3/xk.svg)}.fi-xk.fis{background-image:url(../flags/1x1/xk.svg)}:root{--phoneWidth: (max-width: 684px);--tabletWidth: (max-width: 900px)}@font-face{font-family:'Inter';font-style:normal;font-display:auto;font-weight:400;src:url("../fonts/Inter-Regular.woff2") format("woff2"),url("../fonts/Inter-Regular.woff") format("woff")}@font-face{font-family:'Inter';font-style:italic;font-display:auto;font-weight:400;src:url("../fonts/Inter-Italic.woff2") format("woff2"),url("../fonts/Inter-Italic.woff") format("woff")}@font-face{font-family:'Inter';font-style:normal;font-display:auto;font-weight:600;src:url("../fonts/Inter-Medium.woff2") format("woff2"),url("../fonts/Inter-Medium.woff") format("woff")}@font-face{font-family:'Inter';font-style:italic;font-display:auto;font-weight:600;src:url("../fonts/Inter-MediumItalic.woff2") format("woff2"),url("../fonts/Inter-MediumItalic.woff") format("woff")}@font-face{font-family:'Inter';font-style:normal;font-display:auto;font-weight:800;src:url("../fonts/Inter-Bold.woff2") format("woff2"),url("../fonts/Inter-Bold.woff") format("woff")}@font-face{font-family:'Inter';font-style:italic;font-display:auto;font-weight:800;src:url("../fonts/Inter-BoldItalic.woff2") format("woff2"),url("../fonts/Inter-BoldItalic.woff") format("woff")}.button-container{display:table;margin-left:auto;margin-right:auto}button,.button,a.button{position:relative;display:flex;align-items:center;justify-content:center;padding:8px 18px;margin-bottom:5px;text-decoration:none;text-align:center;font-weight:500;border-radius:8px;border:1px solid transparent;appearance:none;cursor:pointer;outline:none;background:#fafafa}@media (prefers-color-scheme: dark){button,.button,a.button{background:#1b1c1d;color:inherit}}@media (prefers-color-scheme: light){button,.button,a.button{background:#fafafa}}[data-theme=dark] button,[data-theme=dark] .button,[data-theme=dark] a.button{background:#1b1c1d;color:inherit}[data-theme=light] button,[data-theme=light] .button,[data-theme=light] a.button{background:#fafafa}button.outline,.button.outline,a.button.outline{background:transparent;box-shadow:none;padding:8px 18px;border-color:#eaeaea}@media (prefers-color-scheme: dark){button.outline,.button.outline,a.button.outline{border-color:#3b3d42;color:inherit}}@media (prefers-color-scheme: light){button.outline,.button.outline,a.button.outline{border-color:#eaeaea}}[data-theme=dark] button.outline,[data-theme=dark] .button.outline,[data-theme=dark] a.button.outline{border-color:#3b3d42;color:inherit}[data-theme=light] button.outline,[data-theme=light] .button.outline,[data-theme=light] a.button.outline{border-color:#eaeaea}button.outline :hover,.button.outline :hover,a.button.outline :hover{transform:none;box-shadow:none}button.primary,.button.primary,a.button.primary{box-shadow:0 4px 6px rgba(50,50,93,0.11),0 1px 3px rgba(0,0,0,0.08)}button.primary:hover,.button.primary:hover,a.button.primary:hover{box-shadow:0 2px 6px rgba(50,50,93,0.21),0 1px 3px rgba(0,0,0,0.08)}button.link,.button.link,a.button.link{background:none;font-size:1rem}button.small,.button.small,a.button.small{font-size:.8rem}button.wide,.button.wide,a.button.wide{min-width:200px;padding:14px 24px}.code-toolbar{margin-bottom:20px}.code-toolbar .toolbar-item a{position:relative;display:inline-flex;align-items:center;justify-content:center;padding:3px 8px;margin-bottom:5px;text-decoration:none;text-align:center;font-size:13px;font-weight:500;border-radius:8px;border:1px solid transparent;appearance:none;cursor:pointer;outline:none;background:#eaeaea}@media (prefers-color-scheme: dark){.code-toolbar .toolbar-item a{background:#3b3d42;color:inherit}}@media (prefers-color-scheme: light){.code-toolbar .toolbar-item a{background:#eaeaea}}[data-theme=dark] .code-toolbar .toolbar-item a{background:#3b3d42;color:inherit}[data-theme=light] .code-toolbar .toolbar-item a{background:#eaeaea}.header{display:flex;align-items:center;justify-content:center;position:relative;padding:20px;background:#fafafa}@media (prefers-color-scheme: dark){.header{background:#1b1c1d}}@media (prefers-color-scheme: light){.header{background:#fafafa}}[data-theme=dark] .header{background:#1b1c1d}[data-theme=light] .header{background:#fafafa}.header__right{display:flex;flex-direction:row;align-items:center}@media (max-width: 684px){.header__right{flex-direction:row-reverse}}.header__inner{display:flex;align-items:center;justify-content:space-between;margin:0 auto;width:760px;max-width:100%}.theme-toggle{display:flex;align-items:center;justify-content:center;line-height:1;cursor:pointer}.theme-toggler{fill:currentColor}.not-selectable{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.logo{display:flex;align-items:center;text-decoration:none;font-weight:bold;font-display:auto;font-family:monospace, monospace}.logo img{height:44px}.logo__mark{margin-right:5px}.logo__text{font-size:1.125rem;white-space:nowrap}.logo__cursor{display:inline-block;width:10px;height:1rem;background:#fe5186;margin-left:5px;border-radius:1px;animation:cursor 1s infinite}@media (prefers-reduced-motion: reduce){.logo__cursor{animation:none}}@keyframes cursor{0%{opacity:0}50%{opacity:1}100%{opacity:0}}.menu{z-index:9999;background:#fafafa}@media (prefers-color-scheme: dark){.menu{background:#1b1c1d}}@media (prefers-color-scheme: light){.menu{background:#fafafa}}[data-theme=dark] .menu{background:#1b1c1d}[data-theme=light] .menu{background:#fafafa}@media (max-width: 684px){.menu{position:absolute;top:50px;right:0;border:none;margin:0;padding:10px}}.menu__inner{display:flex;align-items:center;justify-content:flex-start;max-width:100%;margin:0 auto;padding:0 15px;font-size:1rem;list-style:none}.menu__inner li{margin:0 12px}@media (max-width: 684px){.menu__inner{flex-direction:column;align-items:flex-start;padding:0}.menu__inner li{margin:0;padding:5px}}.menu-trigger{width:24px;height:24px;fill:currentColor;margin-left:10px;cursor:pointer;display:none}@media (max-width: 684px){.menu-trigger{display:block}}.menu a{display:inline-block;margin-right:15px;text-decoration:none}.menu a:hover{text-decoration:underline}.menu a:last-of-type{margin-right:0}.submenu{background:#fafafa}@media (prefers-color-scheme: dark){.submenu{background:#1b1c1d}}@media (prefers-color-scheme: light){.submenu{background:#fafafa}}[data-theme=dark] .submenu{background:#1b1c1d}[data-theme=light] .submenu{background:#fafafa}.submenu ul{list-style-type:none;margin:0;padding:0;overflow:hidden}.submenu li a,.submenu .dropbtn{display:inline-block;text-decoration:none}.submenu li.dropdown{display:inline-block}.submenu .dropdown-content{display:none;position:absolute;background:#1b1c1d}@media (prefers-color-scheme: light){.submenu .dropdown-content{background:#fafafa}}[data-theme=dark] .submenu .dropdown-content{background:#1b1c1d}[data-theme=light] .submenu .dropdown-content{background:#fafafa}.submenu .dropdown-content a{padding:12px 20px;text-decoration:none;display:block;text-align:left}.submenu .dropdown-content a:hover{background:#1b1c1d}@media (prefers-color-scheme: light){.submenu .dropdown-content a:hover{background:#fafafa}}[data-theme=dark] .submenu .dropdown-content a:hover{background:#1b1c1d}[data-theme=light] .submenu .dropdown-content a:hover{background:#fafafa}.submenu .dropdown:hover .dropdown-content{display:block}html{box-sizing:border-box;line-height:1.6;letter-spacing:0.06em;scroll-behavior:smooth}*,*:before,*:after{box-sizing:inherit}body{margin:0;padding:0;font-family:Inter, -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", Helvetica, Arial, sans-serif;font-display:auto;font-size:1rem;line-height:1.54;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;font-feature-settings:"liga", "tnum", "case", "calt", "zero", "ss01", "locl";-webkit-overflow-scrolling:touch;-webkit-text-size-adjust:100%;display:flex;min-height:100vh;flex-direction:column;background-color:#fff;color:#222}@media (max-width: 684px){body{font-size:1rem}}@media (prefers-color-scheme: dark){body{background-color:#232425;color:#a9a9b3}}@media (prefers-color-scheme: light){body{background-color:#fff;color:#222}}[data-theme=dark] body{background-color:#232425;color:#a9a9b3}[data-theme=light] body{background-color:#fff;color:#222}h2,h3,h4,h5,h6{display:flex;align-items:center;line-height:1.3}h1{font-size:2.625rem}h2{font-size:1.625rem;margin-top:2.5em}h3{font-size:1.375rem}h4{font-size:1.125rem}@media (max-width: 684px){h1{font-size:2rem}h2{font-size:1.4rem}h3{font-size:1.15rem}h4{font-size:1.125rem}}a{color:inherit}img{display:block;max-width:100%}img.left{margin-right:auto}img.center{margin-left:auto;margin-right:auto}img.right{margin-left:auto}img.circle{border-radius:50%;max-width:25%;margin:auto}figure{display:table;max-width:100%;margin:25px 0}figure.left{margin-right:auto}figure.left-floated{margin-right:auto;float:left}figure.left-floated img{margin:20px 20px 20px 0}figure.center{margin-left:auto;margin-right:auto}figure.right{margin-left:auto}figure.right-floated{margin-left:auto;float:right}figure.right-floated img{margin:20px 0 20px 20px}figure.rounded img{border-radius:50%}figure figcaption{font-size:14px;margin-top:5px;opacity:0.8}figure figcaption.left{text-align:left}figure figcaption.center{text-align:center}figure figcaption.right{text-align:right}em,i,strong{color:#000}@media (prefers-color-scheme: dark){em,i,strong{color:#fff}}@media (prefers-color-scheme: light){em,i,strong{color:#000}}[data-theme=dark] em,[data-theme=dark] i,[data-theme=dark] strong{color:white}[data-theme=light] em,[data-theme=light] i,[data-theme=light] strong{color:black}code{font-family:Consolas, Monaco, Andale Mono, Ubuntu Mono, monospace;font-display:auto;font-feature-settings:normal;padding:1px 6px;margin:0 2px;border-radius:5px;font-size:0.95rem;background:#eaeaea}@media (prefers-color-scheme: dark){code{background:#3b3d42}}@media (prefers-color-scheme: light){code{background:#eaeaea}}[data-theme=dark] code{background:#3b3d42}[data-theme=light] code{background:#eaeaea}pre{padding:10px 10px 10px 20px;border-radius:8px;font-size:0.95rem;overflow:auto}[data-theme=dark] pre{background-color:#3b3d42}[data-theme=light] pre{background-color:#eaeaea}@media (max-width: 684px){pre{white-space:pre-wrap;word-wrap:break-word}}pre code{background:none !important;margin:0;padding:0;font-size:inherit;color:#ccc}@media (prefers-color-scheme: dark){pre code{color:inherit}}@media (prefers-color-scheme: light){pre code{color:#ccc}}[data-theme=dark] pre code{color:inherit}[data-theme=light] pre code{color:#ccc}blockquote{border-left:3px solid #3eb0ef;margin:40px;padding:10px 20px}@media (max-width: 684px){blockquote{margin:10px;padding:10px}}blockquote:before{content:"”";font-family:Georgia, serif;font-display:auto;font-size:3.875rem;position:absolute;left:-40px;top:-20px}blockquote p:first-of-type{margin-top:0}blockquote p:last-of-type{margin-bottom:0}ul,ol{margin-left:40px;padding:0}@media (max-width: 684px){ul,ol{margin-left:20px}}ol ol{list-style-type:lower-alpha}.container{flex:1 auto;display:flex;flex-direction:column;justify-content:center;text-align:center}.content{display:flex;flex-direction:column;flex:1 auto;align-items:center;justify-content:center;margin:0}@media (max-width: 684px){.content{margin-top:0}}hr{width:100%;border:none;height:1px;background:#dcdcdc}@media (prefers-color-scheme: dark){hr{background:#4e4e57}}@media (prefers-color-scheme: light){hr{background:#dcdcdc}}[data-theme=dark] hr{background:#4e4e57}[data-theme=light] hr{background:#dcdcdc}.hidden{display:none}@media (max-width: 684px){.hide-on-phone{display:none}}@media (max-width: 900px){.hide-on-tablet{display:none}}.screen-reader-text{border:0;clip:rect(1px, 1px, 1px, 1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute !important;width:1px;word-wrap:normal !important}.screen-reader-text:focus{background-color:#f1f1f1;border-radius:3px;box-shadow:0 0 2px 2px rgba(0,0,0,0.6);clip:auto !important;clip-path:none;color:#21759b;display:block;font-size:14px;font-size:0.875rem;font-weight:bold;height:auto;width:auto;top:5px;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;z-index:100000}.background-image{background-repeat:no-repeat;background-attachment:fixed;background-size:cover;background-position:center center}.highlight{margin:30px auto}.posts{width:100%;max-width:800px;text-align:left;padding:20px;margin:20px auto}@media (max-width: 900px){.posts{max-width:660px}}.posts:not(:last-of-type){border-bottom:1px solid #dcdcdc}@media (prefers-color-scheme: dark){.posts:not(:last-of-type){border-bottom:1px solid #4e4e57}}@media (prefers-color-scheme: light){.posts:not(:last-of-type){border-bottom:1px solid #dcdcdc}}[data-theme=dark] .posts:not(:last-of-type){border-bottom:1px solid #4e4e57}[data-theme=light] .posts:not(:last-of-type){border-bottom:1px solid #dcdcdc}.posts-group{display:flex;margin-bottom:1.9em;line-height:normal}@media (max-width: 900px){.posts-group{display:block}}.posts-list{flex-grow:1;margin:0;padding:0;list-style:none}.posts .post-title{font-size:1rem;margin:5px 0 5px 0}.posts .post-year{padding-top:6px;margin-right:1.8em;font-size:1.6em;opacity:.6}@media (max-width: 900px){.posts .post-year{margin:-6px 0 4px}}.posts .post-item{border-bottom:1px grey dashed}.posts .post-item-inner{display:flex;justify-content:space-between;align-items:baseline;padding:12px 0;text-decoration:none}.posts .post-day{flex-shrink:0;margin-left:1em;opacity:.6}.post{width:100%;max-width:800px;text-align:left;padding:20px;margin:20px auto}@media (max-width: 900px){.post{max-width:600px}}.post-date:after{content:'—'}.post-title{font-size:2.625rem;margin:0 0 20px}@media (max-width: 684px){.post-title{font-size:2rem}}.post-title a{text-decoration:none}.post-tags{display:block;margin-bottom:20px;font-size:1rem;opacity:0.5}.post-tags a{text-decoration:none}.post-content{margin-top:30px}.post-cover{border-radius:8px;margin:40px -50px;width:860px;max-width:860px;overflow:hidden}@media (max-width: 900px){.post-cover{margin:20px 0;width:100%}}.post-excerpt{color:grey;font-style:italic}.post-info{margin-top:30px;font-size:0.8rem;line-height:normal;opacity:.6}.post-info p{margin:0.8em 0}.post-info a:hover{border-bottom:1px solid white}.post-info svg{margin-right:0.8em}.post-info .tag{margin-right:0.5em}.post-info .tag::before{content:"#"}.post-info .feather{display:inline-block;vertical-align:-.125em;width:1em;height:1em}.post-audio{display:flex;justify-content:center;align-items:center;padding-top:20px}.post-audio audio{width:90%}.post .flag{border-radius:50%;margin:0 5px}.pagination{margin-top:20px}.pagination__title{display:flex;text-align:center;position:relative;margin:20px 0}.pagination__title-h{text-align:center;margin:0 auto;padding:5px 10px;font-size:0.8rem;text-transform:uppercase;text-decoration:none;letter-spacing:0.1em;z-index:1;background:#fff;color:#999}@media (prefers-color-scheme: dark){.pagination__title-h{background:#232425;color:#b3b3bd}}@media (prefers-color-scheme: light){.pagination__title-h{background:#fff;color:#999}}[data-theme=dark] .pagination__title-h{background:#232425;color:#b3b3bd}[data-theme=light] .pagination__title-h{background:#fff;color:#999}.pagination__title hr{position:absolute;left:0;right:0;width:100%;margin-top:15px;z-index:0}.pagination__buttons{display:flex;align-items:center;justify-content:center}.pagination__buttons a{text-decoration:none;font-weight:bold}.button{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:1rem;font-weight:600;border-radius:8px;max-width:40%;padding:0;cursor:pointer;appearance:none;background:#eaeaea}@media (prefers-color-scheme: dark){.button{background:#3b3d42}}@media (prefers-color-scheme: light){.button{background:#eaeaea}}[data-theme=dark] .button{background:#3b3d42}[data-theme=light] .button{background:#eaeaea}.button+.button{margin-left:10px}.button a{display:flex;padding:8px 16px;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.button__text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.button.next .button__icon{margin-left:8px}.button.previous .button__icon{margin-right:8px}.footer{padding:40px 20px;flex-grow:0;color:#999}.footer__inner{display:flex;align-items:center;justify-content:center;margin:0 auto;width:760px;max-width:100%}@media (max-width: 900px){.footer__inner{flex-direction:column}}.footer__content{display:flex;flex-direction:row;align-items:center;font-size:1rem;color:#999}@media (max-width: 900px){.footer__content{flex-direction:column;margin-top:10px}}.footer__content>*:not(:last-child)::after{content:"•";padding:0 5px}@media (max-width: 900px){.footer__content>*:not(:last-child)::after{content:"";padding:0}}.footer__content>*:last-child{padding:0 0px}@media (max-width: 900px){.footer__content>*:last-child{padding:0}}.sharing-buttons{display:flex;flex-wrap:wrap;justify-content:space-between}.sharing-buttons .resp-sharing-button__icon,.sharing-buttons .resp-sharing-button__link{display:inline-block}.sharing-buttons .resp-sharing-button__link{text-decoration:none;margin:0.5em}.sharing-buttons .resp-sharing-button{border-radius:5px;transition:25ms ease-out;padding:0.5em 0.75em;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.sharing-buttons .resp-sharing-button__icon svg{width:1em;height:1em;margin-right:0.4em;vertical-align:top}.sharing-buttons .resp-sharing-button--small svg{margin:0;vertical-align:middle}.post-content table{border-collapse:collapse;margin:25px auto;font-size:0.9em;min-width:400px;max-width:100%}.post-content table th,.post-content table td{padding:12px 15px;border:1px solid #dcdcdc}@media (prefers-color-scheme: dark){.post-content table th,.post-content table td{border:1px solid #4e4e57}}@media (prefers-color-scheme: light){.post-content table th,.post-content table td{border:1px solid #dcdcdc}}[data-theme=dark] .post-content table th,[data-theme=dark] .post-content table td{border:1px solid #4e4e57}[data-theme=light] .post-content table th,[data-theme=light] .post-content table td{border:1px solid #dcdcdc}.post-content table thead tr{text-align:left;background-color:#dcdcdc;color:#222}@media (prefers-color-scheme: dark){.post-content table thead tr{background-color:#4e4e57;color:#a9a9b3}}@media (prefers-color-scheme: light){.post-content table thead tr{background-color:#dcdcdc;color:#222}}[data-theme=dark] .post-content table thead tr{background-color:#4e4e57;color:#a9a9b3}[data-theme=light] .post-content table thead tr{background-color:#dcdcdc;color:#222}.post-content table tbody tr{border:1px solid #dcdcdc}@media (prefers-color-scheme: dark){.post-content table tbody tr{border:1px solid #4e4e57}}@media (prefers-color-scheme: light){.post-content table tbody tr{border:1px solid #dcdcdc}}[data-theme=dark] .post-content table tbody tr{border:1px solid #4e4e57}[data-theme=light] .post-content table tbody tr{border:1px solid #dcdcdc}.btn-404 svg{vertical-align:middle;display:inline-block;margin-right:5px}.btn-404 a{margin:0 10px} /*# sourceMappingURL=main.css.map */ \ No newline at end of file diff --git a/jujure/resources/_gen/assets/scss/scss/main.scss_38b1322b728d0fc31bc0aabb683ebc6d.json b/jujure/resources/_gen/assets/scss/scss/main.scss_38b1322b728d0fc31bc0aabb683ebc6d.json index 8b1079e..48f3bda 100644 --- a/jujure/resources/_gen/assets/scss/scss/main.scss_38b1322b728d0fc31bc0aabb683ebc6d.json +++ b/jujure/resources/_gen/assets/scss/scss/main.scss_38b1322b728d0fc31bc0aabb683ebc6d.json @@ -1 +1 @@ -{"Target":"main.4e5c639214707eff609bb55fe49e183dee42258a73bc90e4cc7b0a84f900798a.css","MediaType":"text/css","Data":{"Integrity":"sha256-TlxjkhRwfv9gm7Vf5J4YPe5CJYpzvJDkzHsKhPkAeYo="}} \ No newline at end of file +{"Target":"main.b78c3be9451dc4ca61ca377f3dc2cf2e6345a44c2bae46216a322ef366daa399.css","MediaType":"text/css","Data":{"Integrity":"sha256-t4w76UUdxMphyjd/PcLPLmNFpEwrrkYhajIu82bao5k="}} \ No newline at end of file diff --git a/jujure/static/brachiosaure/90QOCSdkzFE3rrYD2GdkrZkh4q_serial.png b/jujure/static/brachiosaure/90QOCSdkzFE3rrYD2GdkrZkh4q_serial.png new file mode 100644 index 0000000000000000000000000000000000000000..1699ecda09e3b1312c93285d0aaebf95863f299d GIT binary patch literal 2486 zcmds3`CF1{7pA(V8nX=B6t}+M8_F!l-4}z#QkJHuv@DlQN0MC7$pv#kvt30Am>et6 zX|l{gX-vUTz$r^}Nv<#@LA1{`RK!X#LG*k3H|B?PUC;I0=bY!h@ALd{@{SR4>&;+h z5C~*F0q++8fvmuPi?!edWLu864g&d}M)31Jagn3t_7x4I%>632FE4l8U4w%X+Jwci z+ievq5?X^fs!Ghk-~v0S_xH=i7S{-WMzD64Ak2QqyZmoE?(k#jetVl}J(S#>K1$9` z@OF-5Z47^b_>b5hF+5pLYep=5DSKAdnmk%jQk}GawKEiz_hHYDoFS4)HKLPEM5ZGu z$=w<$^rD?tO49H1<9gWyX<^+%ovEsH%Sji1N*@hA<7ktT#F$T;wBS@BfH0?27hwK# z{ajHyFG1dBHxO&I;C3Pfu7pY!@OR;k7CcJStm?mly3;S@UkR31L_d-VOWLh<&W5LH zni0puG>0(~bv~e$`%urLT%&iFRf-o^r6d&+;~R;krvJ{KW=uEMneGmhHW8x`+^`2W z%2GB}T!RV8+$;RWKucNY{KmNGXb0Dfm`Qsum+I6Roj!M31Cl#S)RRMRJy^u9ZZFHB za{KhU;R3CdNZ0o@vq_f6Oi3y(coxLn=d<-)D?M1E6l#0?&j#n*3j`b4{vKHkXn36I zP=|Voz{x0RW!-1M*QF$JYJ-dsB5iN-Rf1^OpP^q!2ItYm_=hn`ESrxq%8$#Dp-ZPd! zoO$B$ZnCGbFT=4*c{chVJPLS0E8HCXnB5?u;HVp>#A#>Z?oY4-)MJJ%o3(xGB*4L@AlC!cww^3vxLXL^|Iq|VaOj?9 zcZ84bOlX{X3>WbNk4k?uIDQU3!D7rl>3Grk3b^YY*EHkj73M;4O7t{Ipgb{AOn_%`aZ& zvvM6)-e$iWy8(#7rA|$Rs%#X!!Usdgm!f|LfnpE%8jcg1tcDfvZW_oz48=l=w-YD? zZF7MGXcWFew_K|Kt3F5d@_7%XM@m2~s3KvK6vHs?{*_&sFUT-##hBS(<%BoUo6*S3 z#F+8O#XBlf{)D31qj0uT_1<-Ep~O zML-_M4xnP5z%;mBqsFi&+w51}Vy0N0Bek{-80;kn#L_OtydUg_(?9gA2DUex%htvV z`IikIlH=`9kJ=)0u^1I$26uG9IRg$AUxh7@kk5TFUWAlej3cfuTU!*bw=M4ZAGQUu ztQ))UJH*b4y)}biqVMg0l|5ZMS*p+cm_0bW+K7fQJS?>&E4Uzrik0)_Gj2>#ZDRVt za<+x1o`L)Kg1w4PBAab-y~+yNXZ?7AhPU-&%^!w-%6{^vi!7{X6=2%;&(<0fB`3V-**7A&jm zaZ{Z8*&$FrURxn$k{UoQo1(eqf$+dub+}KpR(3knWG0Lo0~uFz0@jbPL5kV6N0;-B zQi_7c%}aSSfhZJ5w6y(*odA3#?X5D!$J?x>uo=zjNYKRewrA|f5Q-1HJAD1Y;V0he zQYdDr1_!F~qNA)IWAo$EYh7ge$8*qVT7sr*FakvC=>Ui*Pgz`aQuZy5Em#i-&N zd-zWEG_7I7y^6hI@4$*zB6ehK`OU{s2PA5KZaf)EIhr{hRR(&D1d?6pOyQ6~@nH^K zlI%5(%W^1I)bnR z3oNVIxglDr*!W)mWR};VWe!hY7@1$51kEqFh-`j`X9~%Ir&it`Pvtt@e%rP81z)HG z<%hMPz#ns@F0Wc&k2H$Ydj{9F z@anBiS6+ULjU$;4e_1Ss{%iLPaB=#21+l#1uqMFg&P!bEw}p)0PxRv-h`9WJ0>{Gg literal 0 HcmV?d00001 diff --git a/jujure/static/brachiosaure/90QOCSdkzFE3rrYD2GdkrZkh4q_usr.png b/jujure/static/brachiosaure/90QOCSdkzFE3rrYD2GdkrZkh4q_usr.png new file mode 100644 index 0000000000000000000000000000000000000000..610b1ad886b2430bc6de18686ba16dec57ad08fb GIT binary patch literal 2453 zcmds3>r>K+0=3od-I{gVY`cn?wPF5RUt6O2mfH@3l#AJ}Qt8bHB>4bGNK!K>tId3| z^h+s4?S`3JXl6k8qL&G&nHnOJTEUeR2p0t3c(;FJKb)B}=fjyfb7sz*tA{Zt+l`JJ zt*oqU(cy?AR#xl6zu@b?1S@;GzuwAfLmV1$;J0kHj;*-%aql;XGVbD9ygAecho&Y! zK5cjC^RK)omuzlSx03TV#BTOkoBauLp1#2H*k0WePdLP zrK5om79A1A(6(gBcn2=1 zsZ`Epv4f@JGIpM0gS3HYtaD~vxw4GgS7x-=m1i38P+6uSv38Z1wLV>!rNJsTE~1VU z`RBAT@A>D{7ddMN&#}7VVS$EjKlF?B$fggf-`ff^WzB(e{mq{id%G$48a$tcmss)TnY6ceSyr)ztCgdhuYb6jHm%YMr1 zQM)}�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 literal 0 HcmV?d00001 diff --git a/jujure/static/brachiosaure/dot_product.c b/jujure/static/brachiosaure/dot_product.c new file mode 100644 index 0000000..ee3eb31 --- /dev/null +++ b/jujure/static/brachiosaure/dot_product.c @@ -0,0 +1,49 @@ +uint64_t dot_product(char* A, char* B, char** out, int32_t size) +{ + if (A == NULL || B == NULL) + { + return 0; + } + int32_t res = 1; + int64_t i = 0; + int32_t j = 0; + + *out = calloc(size * size, 1); + + while (size > j) + { + int64_t k = 0; + char* A_line = A + i; + do + { + char* B_col = B + k; + int64_t col = 0; + int32_t sum = 0; + + do + { + char element; + element = A_line[col]; + element *= B_col[0]; + col += 1; + B_col += size; + sum += element; + } while (size > col); + + ((*out) + i)[k] = sum; // ith line, kth column + + bool win; + if (j != k) // Check if on the diagonal + win = sum == 0; // if not check that it is 0 + else + win = sum == 1; // if yes check it is 1 + + k += 1; + res &= win; // Bitwise and, every number must be correct + } while (size > k); + + j += 1; + i += size; + } + return res; +} diff --git a/jujure/static/brachiosaure/final.png b/jujure/static/brachiosaure/final.png new file mode 100644 index 0000000000000000000000000000000000000000..0af51569a9b9f6d220604851cc7aa89bcb6dc41a GIT binary patch literal 50271 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 literal 0 HcmV?d00001 diff --git a/jujure/static/brachiosaure/main.c b/jujure/static/brachiosaure/main.c new file mode 100644 index 0000000..5bca43c --- /dev/null +++ b/jujure/static/brachiosaure/main.c @@ -0,0 +1,71 @@ +int32_t main(int32_t argc, char** argv, char** envp) __noreturn +{ + int32_t user_status; + int32_t serial_status; + int32_t status; + if (argc == 4) + { + int32_t user_width = 0; + int32_t user_height = 0; + void* username_img_data = NULL; + void* user_zbar_img = NULL; + + int32_t serial_width = 0; + int32_t serial_height = 0; + void* serial_img_data = NULL; + void* serial_zbar_img = NULL; + + char digest[0x40]; + strcpy(&digest, argv[1]); + void sha512; + SHA512_Init(&sha512); + SHA512_Update(&sha512, &digest, strlen(argv[1])); + SHA512_Final(&digest, &sha512); + + char qr_data_user[0x40]; + user_status = get_qr_data(argv[2], + &username_img_data, + &user_width, + &user_height, + &user_zbar_img, + &qr_data_user, + 0x40); + + char qr_data_serial[0x40]; + serial_status = get_qr_data(argv[3], + &serial_img_data, + &serial_width, + &serial_height, + &serial_zbar_img, + &qr_data_serial, + 0x40); + + if ((user_status != 0 && serial_status != 0)) + { + char err = (serial_width != user_width) + | (serial_height != user_height) + | (user_width != user_height) + | (memcmp(&digest, &qr_data_user, 0x40) != 0) + | (check_serial(&qr_data_user, &qr_data_serial, 8) == 0); + + void* an_interesting_output = NULL; + int32_t win = something_interesting(username_img_data, serial_img_data, &an_interesting_output, user_width); + + free(username_img_data); + free(serial_img_data); + free(an_interesting_output); + + status = ((uint32_t)(err | ((int8_t)win == 0))); + } + } + else + { + printf("Usage: %s 6t9om|}E6kK9ze|_Q-6?XRW_2Uv#=MojQ z^Y#{Wbg@Gq?L2%1J>h;p5m4{p<>=z%0(boD8Bt+TF#%x-0bvniVQDTg6>$;ZkA%3O zw6u)nU(eei;GTaAln@jK1l%?k5#jx-4(?}%_)Cs}1ky#)+0R=*17hhL=mvAw)ph^t znE*J_*Tu{8pY8;u1x3Y9YQ!`Et^ZaJkm_mY0srfnyFiZuB7Ze@`CCnOeU!MDkB6;* zw6CkXhL(}2frIm3Lc}bcRqZ8wQJT6AT%wxlrrKgYS_UY6UCF>8dzh$m;K?-j3wwy` zI-x9m)S=Q2+LFdnGR9g^Bb27Gk2Xxl$Wu#)OH?&T+TK}4Oj=qLWhn0F=LN{J)3MhN zKzr%ydLazNP)_0wfvTDo#?E?D8o=Z30jeldgulC?nHEyj+zuWjtri3nBb@aOO{Cyz zC`o%$VIzdQtEr1vps9hWs-2OCx3QL=siUXAyNjo#r>D7|yT6Kd5Zc2yAi!J4L0i|! z)Y1px3-l`vwea>d*A;hy8k*YqO8KKTj2$G!Va~oro(M;AZ*LQHpp2!@U6h_B%FbT` zqU$IFH!_t3I``1EQwz{HQ!xQP2f?Kg9`@Q$X?JgbM?k0>FrljM2;ftYsHihKKvz^B zZ6_in?xNx%>?eit^zwJKHIPnB2HsLC-YP(u zue$~c1(nuUadlJ|M{7t1AUsf>mIm%Jj#4TXa5FV0RfH+h*Axnu5!Z4THh>u;9MrX- zXajq=hrwM_M>jJ|2Z)<56lEz4LyL)d!%R>vFe!C?U5fx?K)S1>8WLvU?dYoq)$t89 zbyU^#z8ffE7Ub(@FD#)6wQ%xt)s|NC){(F`MtDi8q11(u(w5>9cfC~*qQY8me>I4k zF3e5R4=QdZ5vZlB>92m*&(jSm1NHOv4}!`dgaaW`mNFJH9x`6;dRijV_9l`VFiCY) z5e;uW7c)m!9T8O++EQ3g+8j_u!&t^YP+9^7MWW2zM2ziZoa{{;f=n%4{arOJ(GZj| z$^c^G?&{|Y7dMo=YX_Clly)$2koF0H8Ooqgj$(R%3{_1NcNu3VE&m`5Pp6=}#&8iy zEvO|FsF5@@@N)A+c(?&=rFBhwr4a!@sWDv7z(E}1h(sE_ymTPIomd zP{K$AL{!Y*FaU)%hlsnY>G&fZ0gKes)bc>M`)WIRBBjs}GkraKeM>2zSOsS z0pI@F5B{||0N?-K)xMF*8Hmf!>+Vv%m1MflT z9x)D;3vtvswt=XJ%Ht&5%8f2*Ji=<%rtJPyt#D=@BF|s<+LF30))hL}kb4x8*In3s zl!abfCaw_(B3n7WU1FlN3}=-oC@)^zcdT1UbQX6=Wi%%(p67zbUOW@7V{jhMO~p=e zD(`_1ZF)*D&D8|ZzMtL2HuUioEmTX@6+KHq2xZynv&!tEln_-%XOr`qAmctpi?d)3 z(TelY6jaj56C^hZsCTUcxM?+P=mu3W(}YgM&beC`9)Q&!4;*@fn}W_zJ$Nueg{7)K z(g2OFF#`|V2GE>Z21=GMt6!sl#$GDhnS=n1&QhGJre&w~+5OyvLF#7 z$K`To&3PVx&CA$(C?Kl&fh7!DKqF;}vmbR&24Q<5D+y2(j$(YLM*)3jqmq9L8wJ_0 zWJ>@VJ)mIpeoAqo*NLoKfTA61?DumhaQEvYAg9@Blcp*auLF%vonoJmJoS&PlR>AC zseG0NN`lTLQ7eOPeRB(y1{zUPDu4E%{72Tm23;HZz#l02Gl735@c#x26x9X=tn9J&%r;n2cxy_E}Z!O}h-lu$e4p~3gvGu@344C1j6FNXd zG&wA(jwkQ73E`72E_oQ1c85lhv^QN@-49tcW#~xv5`^q*$l_ZBc{6N3Rk>Ws+LF ziIj~mfF3)&VtkVu34UD~)heR-2)QDY8h3Wu^l?M$0QW$FGn>q;4M}e8eQCdrWuZC2?eN#&m7xz> zqKK|L7ZiRi_Pxlp3i@@1x23Vj&|zo|`g5dPpElPwKZbnZ(>wR5+pZ()8_RCfVfuAeFr;J15v~ByXg^ah98R zT%8p??tCnEYMR<#R|DPFE>#fFvDP&7Kw#WUK?g+S88<1*xzsqf`K9Z8{;W>(Tl`S; z9K%k!P~*@_j^ax4S--f065A z8zHHK&XdQkiPtr{k5uUf`7bi*+!T?tkn|b?9|zHkhJZt-u~eZs*t3*+7hBIlGaC2d znLC~KnFo!q3kOfq(q$ZuU?PO4$Iltaz9gxM-p$->ZP0G;04x4@f{E9*I!9g#{`ykQ zlG37LvNyVDspmb~y2#*th2N&$5qZB?NYum8Yq7^GC4_iDohkFFEM(c*@V3E$B06a5 zrHZ00h%ZHugYzgLMZU(jts(Sirmw>*S%6T_K2&}~NLO|{HClqNm8CG}mdDMTcj&ko z4q66U5X%j?rv#VB;HxCozA9fBui?IIk#)VN@WI1^Cyw8v zpv#>u8(FpXTI*dTapG;UX=1ceW-fdKmmBUdJ~Yyo;hi0vzs$=#%I_2U>up4$#Oi)5 z50%X9ub2^P+&f}h%gj;-U4cCL96_{o#!g{&imp3Zbgv3$LdSh3kKeYsBrYgFc}8iz zle0k+8|6$|>hm&%@uiln9Gh`Te|}q5mJ+6R*xt+|wpOkuE+=&@HK_A1_=7vPJ9_Ky)92!nwz|5Qi5M`) zSGpbBw5qj1)yJ241uNhDrp=wrgJy{OmUm`I^JJao%X$pH%@=u_(K`tkMspmrIGHfIlf5B;}o|RFK218oi^AMdade{^nPpZ90TFs4O<(I_u$Gbu*&s7(``O;|R z9r`eObGeY;FqGIeTvFe0hHJLLGIi!Su@UQ5`Vst*#;zE}H2Kj*ze9_E4$|;nZ z?@Vz>;Tbonka}oBca}+)%yOJEsK0)c*IsBvy>e1#4?GE<) zN-^|4wAPQ%$8Rp}O7tH3=<;%#@J)esk+bas2gRwg*Z;KK50&HyzV*k%Lz+a!vMic&6&xWhwF6Y%oy&y5iBzaLv0mX47H&XImZlH};CNW`~R zVbD_q+}F$HE0xvoOw?nN8DXXQxmWo1KqW!KSn(dY616q;?n~Q?qM90^u%U+QF;+8XeclHtd z#Fpm>P{Y_}q_O9y3VvG%9-&yluk6)669!*h&apSO` zXD{BMe54F)$W8MEJ&e+lP2uJZ{(+zazCeT+X!2sr zcrx~^f_myjXzb%Vz8nz%XAmcO8m}Ac<^*2q8>Cb~c#5j@~>wXxFgkh;X z;xm3kf-`2@#Lp^EFrFM%B)el<`I&L)jMs^_VaH>&=Qm@lyzxV{AI^X|?B2+}dIo70 zv2(ac#f~+lWZ|WC`SEqD^P)1S^L?K*E%fK$xlHy6M!*4mE}Ho6@;{#GA20V$nDGBm zoTX~NcdzjG7g3M37nm{igzGY3a?Lyq*`&zaqC7D;Z8 zwQ$ZP%I~!uURa))9WZSr9Unz@r`OkK%S*be+I!`0M}XIFJ)oev#dQ)ROKnclz?uvB z^KhzXy7m1#BMH#`go5pBwfu;>1o{E`u2KJVHa=v)3N9v zFvpw_MHNH%YakdmU`hxG3*xftH|i}gN~DRrdmK!U%QA7(V#O{dfli{^4sQT*fI?OV zl!L&Nz1>Plt~-1kUX5fv#H`%CG=*wI2Ctbfz5KLc&+b^1LvpU|%uedn zN07TYeSlFt8oANNfn}t^Mn%0|WK(;!lN(i{XgE~99DPukZ&0zobKGK;WTpcoX3qf1&4!6)n?Fm@^Sw+>L0^x zYIq@&siX|5=dSzwh^`?eD~5;Z`Y@>yUKhUD;hy=8XI)gQ#F8rRE7 zDKhdH&*Fzn!f=V0cg#Af>@vytNX%ki^C zzb8mvsTsGnA*!9W6z*)427nE`;J&^}jO5}_(0XH9`yPDZxn?pZP8 zl=5eZlU}5?`XogSZ8^2K`m~iJ_HMe| zEqpItG~T&tPp+1W#|e{*7DXL49X7uq*xFbSxdL3;sY#MKLC~)3nuxv|mi@_y`UU{W zxlWYvO}m3Mc;1nJFYh^W)nDo=VfFa8m$qTLr0Cv5DUyFcl4@c5X7vCpmq|}Ncha2Z z7Hx}mfRBxi=+LYAn{&XS(c=82IFqvCGj(P#LI?8(*C)@V8 z;K@vZl#-NXj8gDGX->J_SRoQVxs0WH>BmBS>MU43TpH5+Z1NaBQsvR}7MAy{?4m<5 zd@D`2r)>UN6oKH(`V&k$9#Uz;hYu>bV_s$1^#fz~W{= zd>A=uSn;egc%x*ZM`Jo`cE+=8eyNfbwzDbKR)QMkihrtfyTc}=t2Y0q<(1MvTS*V1 zwkzI5)v}5pxRX_p)U8Nj*8t__Drj&gvI!=3hpChYrpqju@lTg{3C;4EXo0fHBhA!6 zjQ8cl29~7Wa;3JL?ULStR>;2x%(NRhLgACiPjWCC&bX-4;|q<+_{i_qzaQ_IrNe~u z=WGIZUMho#Fpx!poM2!s20D>aS9m5*ZX-Y0sAR0+Sifd*X)7N=PBJ{~s^z-3yV5i- z6;`jphc{I>4PE!}zVaE9QZuR4Gb9(BLMZml_e>p``H|Sj(51bP;3X+0zxyG_`W`dh zFwqd{B^4&XQ1zPsGNFh|Vo6fv--?@St1c%9x)!2sysP!5K)Y2jLrRu)r(e4 z*r|ir`MmsqFLRKHCm5MQCMtGsKT03zbYZfT=kV?0U?2VF zU$z``xf{Qug=W@z2HJc(23m*a=NPDkwgpA3f`&|bDnpHG#%g(x)fW0$&A^^-Wy8HkNYz34TV&>Lf+rfs7%@zQjU|IOfnfA9&+IxLpLGspC zXST(<&I$53{>a*i#jPjpB_AK}@OQNTwk>$$zM6%iWXTZreQss`49i2y(4KH(WH#yf zbV0Mg02SiYn|{|zqt6y>Wdn!q5yq7d^l?Am_*71;rj^KTuj4n?GyAqZ)3yoLuX|f- z%N|xMe-jEw)<=&gGsZNEuUw>L+{aJ?yZpz1QUg#z-$RT{D>;Xj`O2M318)*s#)+Z@ z4$a?h0YO{|;LTUyv^(dy9)rQ$)<;E2R7W?k6qI^^ub5qG_D@FgPjc>0cJr^4?*Fdz zFr6G3{0|r4k2U^ZZH@c5`wCR2ZgH(|3?VdS^Ckmm9m|6Q6X;K!urL@OJTL{a`~6O> zXa4&BP6r?vSW(2pP@J$Z&N>5#kh4d$6(fKS0pB|SibTg5@4!Dz|9_q)?Bc^s{eWi$mNYp$5lGv}|jAm!)FZnyD(OD4`!~U{aN*Xs;xE z&R@)f)kGIGU$CpRq@?2!U|z-DEpT?LB%TE-N2_CC^>o1xS({xesfcAlkci=+PAWA} zr+1(18R*Yp9eE@Nz;THK2sB>r#%bjy-AaCCbUE6OxM6;h7uY`FUrFQzU+BBqe`j28f+ zj^jxRqh^#bGAt?TYD#h7las3R>T00#%6*CvVzk4o=h7LVXIm0~PXbufuHE;AbT!a3^W5YxKW1Npv#Q&L_S)|(eLk*Dq-SR1cTPIThC@V~1aCEi{ z=>4{pBADa4l4%U*17L`Sp%S=f^&F=UuvDiRFDEL4E~PU?Is@8pah~vsW}~leKLLMz z=J@TNI#A^RC<{!%?!|1N_q!iMAga<~#q?Sfz!3G1Tu;`68dwi%cD|e8;M;;c)V~1V z2BvvJJnFb0vcL?DRcU)%9Sc;oCMS(yYAtW*BJ8z_BDqZoZTcy}cU;8xI( zU4s8B1hsA>BvYWhdJZRlKgH_a$JbS|aq}vmI8KGR@RN<(s9t!@*0xW(dHW$9{AYgK zX4gt4a@41#pf0wGwE5P`X3-NJ(07(M=wP-fGb)m+2{ZMssCVX@$y>)?8NZ5bLf-Zl zC#`X6w!@fssMs)Wt1+8D-`O?gRTDp&T-#gV@WSjr&kkvRBsvjZWw@AjFJeAESK?l@ ze%{6GlGh>2B|U}yZzps#8*l|P?{AJ3=r*3(>@Q|PYU1mbY*u`*Q7T`KI;uQI^3Bo} zPm%uv&SLiu&7hA0XK)9tY+<7u5QS*?Xk)|c)Tr+ad+S})R<{}Y%TR;MEo7_bbb?s= z3rlR=w6>u~CE}ZkwzIn<1?c!Cm$ay=W19Bd`d~-z7#jFwyIKD91V{PW!Nc0*6juT035YjXFyZvKXXN&evtIDPOcI3BGN zwts+N8LEV_(~`)0`a4JIw*%IOxvH-Sanorf%DRs==0F$306LFbD6c`nmQA?+>mpUxAgQUfKWNE(!7z3-O!Zz4;n7QTQd2jV2E+y^Z|BY>N?) zko8O9-Wz2aod{f?z6)J1cm_ivy=x}t$HS66@ddF68%u7Uxi*2-rM@I?6GBptZdUui zxM$jE4f0i->~ckKWXFvLaB-+pZg#+C+cnz}l~(}H_n$DQ``x6>C|)t1j<`p@eY^I2 zS8?|rJMPOsR0E^0@q9gAeqssD_%va`BI%J;C*d3I*oNZ@T#d^XF{j04)nt*!@(iqWS6$!9w?yr`=lr> zt@GF$Bh|1yAd#q$cumPl@^3IIVwKsc=Y#I98Sn6LK-_s5MI4qRLyXAoLq2?A3ff&A z;i(=U0Pj_#@W zu=jeNZ_M-+Go+;U7s;hpN*u>Yq2b`su~#KlbD`6ig@*6ti?xK=Xj%W+F_{l_tSm~n z@Z_862b|HcUH2APPRyrPOxY*xPm(nZ(AM?FQZ2;^=4GXH%lNk)zWCXP?iPvZk0m5_&$1E@E86jW22|qygRwH*=5Rh+%QXRc`u5f5B z_)_iWV@~bn=2ZRyjl72P-9>bf=k0BR#d3Wwc@;@42+1n<=>cqf`D7cM=T%s4*) zcsldDs{{qXMx8cA7dhHK@^=k6^HEto+=OXf%o_EHhq79$_HW0}R<&3Y1bXqxf&LNr zx|r;hYwSSA@^7!^x)I>I7=it}R6u^apmbxvd(%Df-dI=Y|M5{P2>>ndACHap{WT~g zHY-5}jPveXFn4|cFvtJ#Yjrf#Ksrf%GBnViLoh2t!0nQX|KoQ3@!$XW@Bb45!G)_^ ztK*Hfg1ojW4ft}d3@jJy3fgxl7&%;2cw<^U&E;P>47Z4{zss1$T(<=l6t)oc-0%}| zmHaWYk?Z+>$v}G=L6W@uN?&%vu?^!H#_MgT;$lb+tEu>j0WlfI8FJDlq#X|jyUp}# z#v84c0-lRuqba8r>iW0`2kpixe!Gi2ypf*r@kKtdX0Lb#E&Iv-Qbz_OqivFNARF8Y8B6=ZkOV*Ut7Q^wA^lMzDdv4g7_*M)rF>ClWn-C z3Yr?JU(Bg49?(t`vbh;2;A_TWL0p-dAn)m}@u$8q(@6$r2P`dac6AWQZWS{6-8lNO z;WOQBX#&CPM5fK``$2M@VgNY@i0ejTHTZ3l+C3PEXWVVeO5H~@pmTSEZ|(cGR53uG z99g0EqK1eJ*{?uN7!Sz~ll*@-g$UwecQ=Q$hR_hpQEID>CyE_gnZMqTn z@JYViUQDF*j@yXl@b3~PNOQMLBlP`ln(hcBrl00~uGZ8EZ>mvkL~gL$<;kc`Ma8~X zjv)FTEsMhHgR8}4_j=>o=n0#s=7Gy;E_APe-XwD@+r_$nr0Qgfww2G@B++#X-Df@B zqC^Q$W8SB0JWMN@1!97)nBZTZ=9$|q3UjVNn*A>errTFvN~;gvYe(acQf$$a7g_>t zj<2$xyas(;JaO5#)sD_z_^u!ufK4eemxNbfY@3<$!Y+o0VKz#>A^U3(1+pvetvmw{ zhYIsO=1rTjqa`WoG4??PL1_^T^i@Fd}^+IoPXcI@)D*k&uC*y6}${ouvG zrR26mT_(&0h8#e0PW^SGH@`kOb(}s;bH6n;& zss7;21TGRovw5#$oK6t74skyrLhT{sj(;|MacqvIrD-sgmoRudX1?+clIm4-CoeQ) z0#$M+5Z!R;_BMHs;rd(f{s-cC{Lc~x{UV!#b=F%RzLWbj!2Xj^2Wl9tfC`q};H=a1F;vnh*{clxD$W0=+*vt!8Pz)uUPCS!Y|U0d5)KU;TJG^P}1}J-qFB=7_C< z&S{$<193Gixe*{&oCx?*jHirQIoVj0RB+$r(@NFM%8+H}b*^QXO2}LM{aWE#F&!_- z{Vm(_T?%9?^kn>eA{0cg*d_I}AxSh)}TG`Tu*vZ9gUi$L5B2C_f{tGECYnFg(c3U9t>`KUC zH91tQnS5-h zb+36|fblH&xs_V``_K4Rj-&G{ywiDCSv!OJYH5pH3zmxJY&K??L<;cF6wpNthwl$J7 z29fr6n2T%&gVVp{D&PdP=rf6U8r(F75G8yQ8=eI0kGHf|W=>fu4(jBFhK0SW=5;_o z+E^1wk@huj;D)5k`OM^8-13t#Ms3hFW0%`r^}D86yG1$JOs8*`AI|@l*EuL;X18vo z4BdEr(T0!?K1h`F;ne2}RnC!bdh9JKE!#%4I=0x-%>-E!;cZrfNN!_v-h+aTonGz9m~ zy~~{iPx`FHV?EP9l0P!T%k3b-e;PP4SCFK@Ok9wa(}TL?zdWr4u@EMP&t_MkmPq-{)2dN>g>fnM#um#)ocMA8dcokDT8}iUx1E z*L*$F(3Rf?!1Qf@+?=``YBl8+S82*PdEXj2+sXCT)`EZN!#pGzOgtFzG9+ZZb?h#+ zMq2e3i!P4s%}^0MAo8F@3LG{tXGqVg8mfyvsJyHaSNKYii5N6fp~z<}#81F{j+GND9_)Xk^JY&8@^8O0#n=*Jh)uwxF}Xq?e19XI{bLoRyWb;HQ~eMT^J1y=Md)giB)P z&{u$c<;pX}HU}9B5|yQCc@homU>D3@y^8-lPVj_`d_bGNIN^Agymx4Q0=|B_g32-i z48ChYuc-mLerM;Iz)5cAPo(+(T&5`C4exUb3P#V9{|oRZYxE~;^uId&*rE+`>VC@0 z*}~P4I~JU;lJmVMKTNE86L+`;fvvR&rP zIqjl1CI#+ehd5rNSL~@|qFFB5QWX9Vn->3#88&TGKil(SfQ10ZFBohdbt}P+J;%uY z0VN$msXlMg`G z{q9fTJ5%<_GHZ`5;}-1!o%OBMr`2akb;0v`nWNR!b+s#8=#}3C@c~oaq}diW1({JU zgtfO_7I?Bcud02;POZRtGd5+uajVA=T?|7M;Y;gBZC=hPbshLGo1*253RgyI&4v@N zIrs@_U5f^*C+xqb0g^<_;K|oQiBVyy?qIv0>!fmz5y{2h1^RafW8b%xqdT}42Ym0U zGH0Z%8^Bb%EhX}YI8TFZNyKvdHKWbG*B5cbDHv|{ z;eQE4Xgh97*e$YeX5S(aYc`hkh3RY)mBXgp*$GdrxS26>2{Z!c3KUd@K?+f8e- zjMcm>4km{RIb7krSJu$C-mq~5Tpb4QBh(Kii-r7U6~ObC`7VX5C28&ySS|;MiWJ3c zKRxQa_zP2YIL6*xWs6Deczjt6B(ME)q}G-ocF`?<1v5srrVD^EMUcn{ypJ^-F!Ydv8pWd-nQq zdZ~Pn_dW1@!w*NZt6Z=Mu`6HF1(V_WT}eY~F_3v$rh2dbZ*bE7dtRJyU8tN)7gL62 zJ#MB&cf9>H9M&;7fX625D=DM`gj!@2O7ec9v0JYoHc5oRKW$B4=Q8Fv2VamJVP?IP zDD>o8@2mEhvNBbW{Vm$R#=VJ(d5K7j2mhyw+|M@uQ&vZ-FlC}U))0ipz~SCxmGQ#4 zGbx|&Mi%XTMf_ZRrm}IvaauHwFxSYWu+x;#K>wzYHr(vzq3E&NfOcB+R{QH&ey%+z zPl4sp!0u|#>jjCP3NIzzFf9ui#o*nEt?|%f|Md%`jo)tId%M@0TC&pXpx68`()*(^ zZ*7uexD{`P5Ho!e3m_2~(=UyM?6Cgg%^e;#Shee3>oWv%`w+gKi6#%aPT*aKzZ{v? zkIg%7?hs-~AlTZVeZKp-$T$n*u+fdI0NqhpRv?X#?SbL4fuo74Q zh)=|S*va!??@*T~Hw(bU+iMzuUf+-|V&XDq#fm-L+AwWgNYsb9n1^!v08=@gmFP7( z&9-*Ms)Zozv|{IGiwR5WWR);%AZ;7*T9xMm`Iy9zy&qDznH-bWbTZMnyKL-zatOiN zaInrUlIKd|bs&XU*Qoj3e|c%Fb>9fPlU$8YBXxHIr1}0bYu3@o3A!jDKGJM_qgUPN zr1huvB)RGefzYQbqwm%9WREM1)7b$MGdUGV$xRV=&Ojj}1C#2ZrtaX$Ul&h1#_T<8 z2rjfyF?;!)Aw3?Svv)#lR?T20jKI=cxAb+=VhZ&bzTbH&HgZ%HT72HR?yDRO%e9|@ z!6+x)^GZ%Yr6$J|>N2dcNcSkvk}Mu=D17Q@g$orv-k$erZ1ciP`H^3#*>ZF5E^)~C z&L<%+Tx;jVhn{|E){wPHyuenvgHQ4fzmuZ?s|wkHuP4xvebzIn$nIYh@LY+8crH5f z)36V$WL7Ip>1~~6SN*Unf$6+KdU>gy>JZgBFh`fIEjG#zgND3510=_U`Z0o)*UZxA z>pJL$%5Mr?c1ue>1&xgSKv$~tLO%K3?Ax+@v(?~w6u9`D@Szveie+Vaw)ZBl;Xp9z z%OWC=)1fZ!yIGJIs&1q7Tu;E@`UF}FM@8n@)4C>sedJZ2{02m({?ZV?1Y^)w?`nAW zKu3FtOO8BzF?($fgA+1q3?DV!!cW9SE1{a75?XsK#K;DqB`dUrchyuotLJ(AE9rNO zp}4vkE<$m0L6M-;osbZmI|&&%n(jB@G_Wm?jS7US0_h}n+Qox*Y+!eMJb3@N{6VKX zi$Yk`%8s7PzzH?_%?Nnonq2f(1MLX5!dU?>_|J%kO^YbtYW}Quz~)`T9=PuIIA*JI zMq%p?!IE@i^YDd6k0kozrB8FiK(1_8iG&@-6L=St$U_r17-^JV(J%18>W(OgYsBu# zAivn`sj;v7tB3xguY7q9mXh@&l%#e&HMbiNju1kmMV$yTeH_otMNXNmnWSY;AEN#i%XB#Gnh*nRCA%pOd-uoH^Q@KN zeW|_UgChbGFg$YBVKCul#3)bh?V37rg;I#!Mz`yB?y+Ng=vhm#tzb}vBvYc54=yTD zJS!+2AaYqIS^}3A&Xc721o3jT^vB24j~=5MP__@rM;Fhf*I682!BXv9mbt+Q_5Ng| z0+5oV2Ce&W6KvBX7nWyJ#5SP`RyEn|OXF+?6OZ{p_Q30|+Bf440XGe~M#i5+IZy3y zjHlyV0Rq$O67DNa0Jq8QgxhpNYx?gI$&xOnvsQ?C%dp`lkhO<<(clHbZ5>rG$N73H zizi?(#GvIW6I5E$`;M3@fE`8{tTKXCJS65KIB4h0U9+RW&hA`_nLsDC{~}NYgZ}WI z{t)Q?5a|9eG5^nHV)Ekd-@n3{0$RwPXDw)pg+KmGP>@52N_1>z|5`{2 zM?Wl8&KJ>EUS(!}S?hT9UzBrzmA=Tmj`<>(rGLsH!4~*$tQ1fUJ@r!6`w{;Q4+&st literal 0 HcmV?d00001 diff --git a/jujure/static/brachiosaure/resizing.png b/jujure/static/brachiosaure/resizing.png new file mode 100644 index 0000000000000000000000000000000000000000..e94a7f75a6d4b1820f14b0bde978936b9138742b GIT binary patch literal 4549 zcmeHLYgAKL+Gcb<1u8OyPpvIpkRq+z69PdLO2~x}lW^skTk25^*dE?+k@TOXH%ib~?k*<65S<_Ha1 zlN=!)9ARRTBNXWffzU-FHzt=JC#Lfg-2|*8a0%4&g-kA+%VMr!ARZ8?s|U>0!!yzY z?g$Np_<#e{(+v)V)7J3xIF{gdhcGt}(7`8Bo}Qns=~zkhxHUflDmxyDVKM;}EetD& zC4@*Kfi;YjB~IiD1^)==26ux%f7L)yVAj8<2YMCI`K&ceC>YVzbIq9hdzwh1%uATS zk8y=3#ser!1SE{XS#tuVMIDM2;$OUSTvSI6v=}SkZeR41dE`Mym45fn8*vJV>n_-0v@H{VK}f5d5DAq-Ufn!mIogS zOhg31F(N7;2=s(PSy)myKafdHrt`(HNURu#;n1K=cu-^{AsO#Y6i4D=ghUb@K=Ald zqL4#4#0(2Ta-$+?VQefv$diSlM~NiAZZb?v_2pv`LF@!32hH$^3yMO<9ik^G4*B}P z0f=EsGw!0SV>*!?9eJA~MlCK^%kw03<%1Cx|6-B)nkIG@cg=5hY3z zpe$K9QNn~pawT*⪼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 N85TuARv?b1{~fYaa*6-| literal 0 HcmV?d00001 diff --git a/jujure/static/brachiosaure/serial.png b/jujure/static/brachiosaure/serial.png new file mode 100644 index 0000000000000000000000000000000000000000..f27e45f61fccda5528ffd4b921b848e3c1a5895f GIT binary patch literal 438 zcmV;n0ZIOeP) zO-dy(5U!qT5TPIq9>5a_d1NsNk$<V|W0s;2AuCmvGw0A1hUki}PH!ZPO2zU=|0Hw%ZYu34Vm zk*>e%bv$406b@M|R>`93cRV-%0C>Ww;frMJxQa+SPbmY!9v-{W)~`O+(b&>|1>xiwkW15;3TK8AMzJ#pj4Fh2)ds%g91#h*90QoX+`p<(HuDWrH)E zY;E=F*ZUiKg_8b!x$okHoP%&&q+kmdUi$Hk|f7 zYp&U?_3 gMET?+{jY!e7wrqi@g=A2kN^Mx07*qoM6N<$f?Q0}X8-^I literal 0 HcmV?d00001 diff --git a/jujure/static/brachiosaure/solve_writeup.py b/jujure/static/brachiosaure/solve_writeup.py new file mode 100755 index 0000000..e2259a5 --- /dev/null +++ b/jujure/static/brachiosaure/solve_writeup.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python3 + +import hashlib +import qrcode +from PIL import Image +import numpy as np + +import requests + + +def get_user(): + r = requests.get("https://brachiosaure.france-cybersecurity-challenge.fr/") + name = r.text.split("text-warning\">")[1].split('<')[0] + return name + +def get_digest(name): + m = hashlib.sha512() + m.update(name.encode()) + digest = m.digest() + return digest + +def linearize_serial(matrix_serial): + serial = bytearray() + + for line in matrix_serial: + for b in line: + serial.append(b % 256) + return bytes(serial) + +def img_to_matrix(img): + array = list(img.getdata()) + width, height = img.size + + matrix_img = [[array[i * width + j] for j in range(width)] for i in range(height)] + return matrix_img + + +def matrix_to_img(mat, path): + array = np.uint8(mat) + img = Image.fromarray(array) + img.save(path) + + +def gen_qrcode(data, path): + qr = qrcode.QRCode(version = 1, box_size = 2, border = 2) + qr.add_data(data) + qr.make() + qr_usr = qr.make_image() + qr_usr.save(path) + + + +def identitymatrix(n): + return [[int(x == y) for x in range(0, n)] for y in range(0, n)] + + + +def get_flag(name): + files = { + "upload1": open(f"{name}_usr.png", "rb"), + "upload2": open(f"{name}_serial.png", "rb") + } + r = requests.post("https://brachiosaure.france-cybersecurity-challenge.fr/login", files=files) + for line in r.text.split('\n'): + if "FCSC{" in line: + print(line) + + +name = get_user() +digest = get_digest(name) + +matrix_usr = [[digest[i * 8 + j] for j in range(8)] for i in range(8)] +matrix_usr = np.array(matrix_usr) + +matrix_serial = np.dot(matrix_usr, matrix_usr) +serial = linearize_serial(matrix_serial) + + +gen_qrcode(digest, "user.png") +gen_qrcode(serial, "serial.png") + + +img_usr = Image.open("./user.png", "r") +img_serial = Image.open("./serial.png", "r") + +matrix_img_usr = img_to_matrix(img_usr) +matrix_img_serial = img_to_matrix(img_serial) + + +def invert(usr, serial): + # Add empty and identity matrices to maka it invetible + usr = make_invertible(usr) + serial = make_invertible(serial) + + n = len(usr) + # Total size after redimensionning + new_n = n * 2 + + # The magic inversion by swapping corners and computing matrix opposite + usr_inv = invert_magic(usr) + serial_inv = invert_magic(serial) + + # Will hold the final user png + new_usr = [] + # Will hold the final serial png + new_serial = [] + + + # Create the new_usr + for i in range(new_n): + line = [0] * new_n + if i < n: + for j in range(n): + line[j] = usr[i][j] + if i >= n: + for j in range(n): + line[j + n] = int(serial_inv[i - n][j]) + new_usr.append(line) + + + # Create the new_serial + for i in range(new_n): + line = [0] * new_n + if i < n: + for j in range(n): + line[j] = int(usr_inv[i][j]) + if i >= n: + for j in range(n): + line[j + n] = serial[i - n][j] + new_serial.append(line) + + + return new_usr, new_serial + + +def make_invertible(mat): + res = [] + n = len(mat) + ident = identitymatrix(n) + + # Add the identity matrix below the original + for line in ident: + mat.append(line) + + + for i in range(len(mat)): + line = mat[i] + for j in range(n): + # Add the identity matrix at the right of the original + if i < n: + line.append(ident[i][j]) + # Add the empty matrix at the bottom right corner + else: + line.append(0) + + return mat + + +def invert_magic(mat): + n_tot = len(mat) + n = n_tot // 2 + + #Create a new empty matrix to hold the result + res = [[0 for _ in range(n)] for _ in range(n)] + + ident = identitymatrix(n) + + # Add the identity matrix below + for line in ident: + res.append(line) + + + for i in range(len(mat)): + line = res[i] + for j in range(n): + # Identity matrix on the right + if i < n: + line.append(ident[i][j]) + + # Oposite of the original in the bottom right corner + else: + el = -mat[i - n][j] % 256 + line.append(el) + + return res + +res_usr, res_serial = invert(matrix_img_usr, matrix_img_serial) + +matrix_to_img(res_usr, f"{name}_usr.png") +matrix_to_img(res_serial, f"{name}_serial.png") + +get_flag(name) diff --git a/jujure/static/brachiosaure/user.png b/jujure/static/brachiosaure/user.png new file mode 100644 index 0000000000000000000000000000000000000000..598b2db40c24e1f83b77e13daa0bd7308ae841d8 GIT binary patch literal 451 zcmV;!0X+VRP)y*5jNAkibdc8I=Guc< zv~Z1c+eI^|J4J!J)8GsDOP5@@|i~V4kOq z$nOEvlQN&w=d-tFydREqrlG3s;rZLBgWw$v761T#;ZEpbX63Zc%t7i5sB_h>V8bDU zb(GF{03T6X%7S+c%V}9J`da;veT@qC$KmkyUHU^lh3qst=?{>`;*pJxlGl`7tZ1v1 zoU_YL0eLNWKTXeHfrd?dn}lx&n}^f-I;*YJQ!OXNq>c3F;-4J3SF78{`R09+z76IE(2TI(HT!H6))J|iS3zr|Nr1ZP3qZNJ&F0YV`D(h0@FhUg tFFVW}s5Jg8-D$UdfvdfoSNFkx`Uh>uz|))+qGtdA002ovPDHLkV1iDY<%R$N literal 0 HcmV?d00001