Files
website-build/build/article-make-regex-engine-1.typ.nano.html
2025-08-29 15:28:30 +02:00

232 lines
89 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<title>Introduction to RegEx</title>
<meta charset="utf-8">
</head>
<body>
<div style="
">
<p><br></p>
<h1>Making a simple RegEx engine:
Part 1: Introduction to RegEx</h1>
<p><span style="font-size: 9pt"><p>Last modified: 26. July 2025 14:20 (Git #<code><code style="white-space: pre-wrap">fee2a364</code></code>)</p><p>Written by <a href="https://alex.vxcc.dev">alex_s168</a></p></span></p>
</div>
<div style="
">
<p><br></p>
<h2>Introduction</h2>
<p>If you are any kind of programmer, youve probably heard of <a href="https://en.wikipedia.org/wiki/Regular_expression">RegEx</a></p>
<p>RegEx (Regular expression) is kind of like a small programming language used to define string search and replace patterns.</p>
<p><br>RegEx might seem overwhelming at first, but you can learn the most important features of RegEx very quickly.</p>
<p><br>It is important to mention that there is not a single standard for RegEx syntax, but instead each “implementation” has its own quirks, and additional features. Most common features however behave identically on most RegEx “engines”/implementations.</p>
</div>
<div style="
">
<p><br></p>
<h2>Syntax</h2>
<p>The behavior of RegEx expressions / patterns depends on the match options passed to the RegEx engine.</p>
<p>Common match options<span id="match-options">:</span></p>
<ul>
<li>Anchored at start and end of line</li>
<li>Case insensitive</li>
<li>multi-line or instead whole string</li>
</ul>
</div>
<div style="
">
<p><br></p>
<h3>“Atoms”</h3>
<p>In this article, we will refer to single expression parts as “atoms”.</p>
</div>
<div style="
">
<p><br></p>
<h4>Characters</h4>
<p>Just use the character that you want to match. For example <code><code style="white-space: pre-wrap">a</code></code> to match an <code><code style="white-space: pre-wrap">a</code></code>. This however does not work for all characters, because many are part of special RegEx syntax.</p>
</div>
<div style="
">
<p><br></p>
<h4 id="escaped-chars">Escaped Characters</h4>
<p>Thee previously mentioned special characters like <code><code style="white-space: pre-wrap">[</code></code> can be matched by putting a backslash in front of them: <code><code style="white-space: pre-wrap"><span style="color: #1d6c76">\[</span></code></code></p>
<svg class="typst-frame" style="overflow: visible; width: 21.265625em; height: 5.279296875em;" viewBox="0 0 212.65625 52.79296875" width="212.65625pt" height="52.79296875pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml"><g><g transform="translate(0 0)"><g class="typst-group"><g><g transform="translate(0 -0.5)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 0 53.79297 "/></g><g transform="translate(52.1435546875 -0.5)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 0 53.79297 "/></g><g transform="translate(212.65625 -0.5)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 0 53.79297 "/></g><g transform="translate(-0.5 0)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 213.65625 0 "/></g><g transform="translate(-0.5 17.59765625)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 213.65625 0 "/></g><g transform="translate(-0.5 35.1953125)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 213.65625 0 "/></g><g transform="translate(-0.5 52.79296875)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 213.65625 0 "/></g><g transform="translate(5 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gA9630BC7DC7C1A3B2772AC4EAF5E6A4E" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="18.0615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gF2D21C82F46AFB157CA5E1AB14665E2F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="18.0615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/></g></g><g transform="translate(0 17.59765625)"><g class="typst-group"><g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#1d6c76" fill-rule="nonzero"/><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="4.81640625" y="0" fill="#1d6c76" fill-rule="nonzero"/></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gB83FD8DF61FB2E4EAD552878F3E8DD3F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="18.0615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="78.2666015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="84.287109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g77AA3201A93C8F4113E19CCDA185B6F5" x="96.328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="102.3486328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g958F64BF87063D7EAFEDE953DDA2BF9F" x="114.3896484375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="120.41015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="126.4306640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="132.451171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="138.4716796875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="144.4921875" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(0 35.1953125)"><g class="typst-group"><g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#1d6c76" fill-rule="nonzero"/><use xlink:href="#g1E73FB87418835A88E58B2B7006EB72B" x="4.81640625" y="0" fill="#1d6c76" fill-rule="nonzero"/></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gB83FD8DF61FB2E4EAD552878F3E8DD3F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="18.0615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3D5EE249F6894FA38DD21E85E2FD5F05" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gD77243764E4306BD6D683907293F12D5" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="78.2666015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="84.287109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g></g></g></g></g><defs id="glyph"><symbol id="gA9630BC7DC7C1A3B2772AC4EAF5E6A4E" overflow="visible"><path d="M 1.9482422 6.479492 L 1.9482422 3.7402344 L 3.0908203 3.7402344 Q 3.774414 3.7402344 4.157715 4.1015625 Q 4.5410156 4.4628906 4.5410156 5.1123047 Q 4.5410156 5.7617188 4.1601563 6.1206055 Q 3.7792969 6.479492 3.0908203 6.479492 L 1.9482422 6.479492 Z M 0.96191406 7.290039 L 3.0908203 7.290039 Q 4.3115234 7.290039 4.9414063 6.73584 Q 5.571289 6.1816406 5.571289 5.1123047 Q 5.571289 4.033203 4.9438477 3.4814453 Q 4.3164063 2.9296875 3.0908203 2.9296875 L 1.9482422 2.9296875 L 1.9482422 0 L 0.96191406 0 L 0.96191406 7.290039 Z "/></symbol><symbol id="g37BF1C0F714F2658F35D194C9E053C6F" overflow="visible"><path d="M 3.4277344 2.7490234 L 3.1298828 2.7490234 Q 2.34375 2.7490234 1.9458008 2.4731445 Q 1.5478516 2.1972656 1.5478516 1.6503906 Q 1.5478516 1.1572266 1.8457031 0.88378906 Q 2.1435547 0.61035156 2.6708984 0.61035156 Q 3.413086 0.61035156 3.8378906 1.1254883 Q 4.2626953 1.640625 4.267578 2.5488281 L 4.267578 2.7490234 L 3.4277344 2.7490234 Z M 5.1708984 3.1201172 L 5.1708984 0 L 4.267578 0 L 4.267578 0.8105469 Q 3.9794922 0.32226563 3.5424805 0.09033203 Q 3.1054688 -0.14160156 2.4804688 -0.14160156 Q 1.6455078 -0.14160156 1.1474609 0.32958984 Q 0.64941406 0.80078125 0.64941406 1.5917969 Q 0.64941406 2.5048828 1.262207 2.9785156 Q 1.875 3.4521484 3.0615234 3.4521484 L 4.267578 3.4521484 L 4.267578 3.59375 Q 4.2626953 4.248047 3.9355469 4.543457 Q 3.6083984 4.838867 2.890625 4.838867 Q 2.4316406 4.838867 1.9628906 4.7070313 Q 1.4941406 4.5751953 1.0498047 4.321289 L 1.0498047 5.2197266 Q 1.5478516 5.4101563 2.0043945 5.505371 Q 2.4609375 5.600586 2.890625 5.600586 Q 3.569336 5.600586 4.050293 5.4003906 Q 4.53125 5.2001953 4.8291016 4.7998047 Q 5.0146484 4.555664 5.0927734 4.1967773 Q 5.1708984 3.8378906 5.1708984 3.1201172 Z "/></symbol><symbol id="g8EFE1C4A2E0CD0A03B7633D0C324134A" overflow="visible"><path d="M 2.9980469 7.0214844 L 2.9980469 5.46875 L 5.0390625 5.46875 L 5.0390625 4.770508 L 2.9980469 4.770508 L 2.9980469 1.8017578 Q 2.9980469 1.1962891 3.227539 0.95703125 Q 3.4570313 0.71777344 4.0283203 0.71777344 L 5.0390625 0.71777344 L 5.0390625 0 L 3.9404297 0 Q 2.9296875 0 2.5146484 0.40527344 Q 2.0996094 0.8105469 2.0996094 1.8017578 L 2.0996094 4.770508 L 0.63964844 4.770508 L 0.63964844 5.46875 L 2.0996094 5.46875 L 2.0996094 7.0214844 L 2.9980469 7.0214844 Z "/></symbol><symbol id="g9CEA08D585A10BDF30AE748A6F2738E3" overflow="visible"><path d="M 5.4296875 2.9589844 L 5.4296875 2.5195313 L 1.5380859 2.5195313 L 1.5380859 2.4902344 Q 1.5380859 1.5966797 2.0043945 1.1083984 Q 2.4707031 0.6201172 3.3203125 0.6201172 Q 3.75 0.6201172 4.21875 0.75683594 Q 4.6875 0.8935547 5.2197266 1.171875 L 5.2197266 0.2783203 Q 4.7070313 0.068359375 4.230957 -0.036621094 Q 3.7548828 -0.14160156 3.3105469 -0.14160156 Q 2.0361328 -0.14160156 1.3183594 0.6225586 Q 0.60058594 1.3867188 0.60058594 2.7294922 Q 0.60058594 4.038086 1.3037109 4.819336 Q 2.006836 5.600586 3.178711 5.600586 Q 4.223633 5.600586 4.82666 4.892578 Q 5.4296875 4.1845703 5.4296875 2.9589844 Z M 4.53125 3.2226563 Q 4.5117188 4.013672 4.157715 4.4262695 Q 3.803711 4.838867 3.1396484 4.838867 Q 2.4902344 4.838867 2.0703125 4.4091797 Q 1.6503906 3.9794922 1.5722656 3.2177734 L 4.53125 3.2226563 Z "/></symbol><symbol id="g8B1CFD5A71F51FD444694A31ACE7ED10" overflow="visible"><path d="M 5.6396484 4.3408203 Q 5.3515625 4.5654297 5.053711 4.6679688 Q 4.7558594 4.770508 4.399414 4.770508 Q 3.5595703 4.770508 3.1152344 4.243164 Q 2.6708984 3.7158203 2.6708984 2.7197266 L 2.6708984 0 L 1.7675781 0 L 1.7675781 5.46875 L 2.6708984 5.46875 L 2.6708984 4.399414 Q 2.8955078 4.9804688 3.3618164 5.2905273 Q 3.828125 5.600586 4.4677734 5.600586 Q 4.7998047 5.600586 5.0878906 5.517578 Q 5.3759766 5.4345703 5.6396484 5.258789 L 5.6396484 4.3408203 Z "/></symbol><symbol id="gDDF33CCACF8520FD5879FCDAE37BD86" overflow="visible"><path d="M 5.131836 3.3886719 L 5.131836 0 L 4.2285156 0 L 4.2285156 3.3886719 Q 4.2285156 4.1259766 3.9697266 4.4726563 Q 3.7109375 4.819336 3.1591797 4.819336 Q 2.5292969 4.819336 2.1899414 4.3725586 Q 1.8505859 3.9257813 1.8505859 3.0908203 L 1.8505859 0 L 0.95214844 0 L 0.95214844 5.46875 L 1.8505859 5.46875 L 1.8505859 4.6484375 Q 2.0898438 5.1171875 2.5 5.3588867 Q 2.9101563 5.600586 3.4716797 5.600586 Q 4.3066406 5.600586 4.7192383 5.0512695 Q 5.131836 4.501953 5.131836 3.3886719 Z "/></symbol><symbol id="gF2D21C82F46AFB157CA5E1AB14665E2F" overflow="visible"><path d="M 2.1289063 0.8105469 Q 3.3740234 0.8105469 3.8671875 1.4233398 Q 4.3603516 2.0361328 4.3603516 3.6376953 Q 4.3603516 5.2539063 3.869629 5.866699 Q 3.3789063 6.479492 2.1289063 6.479492 L 1.6601563 6.479492 L 1.6601563 0.8105469 L 2.1289063 0.8105469 Z M 2.1484375 7.290039 Q 3.8183594 7.290039 4.609375 6.401367 Q 5.4003906 5.5126953 5.4003906 3.6376953 Q 5.4003906 1.7724609 4.609375 0.88623047 Q 3.8183594 0 2.1484375 0 L 0.6689453 0 L 0.6689453 7.290039 L 2.1484375 7.290039 Z "/></symbol><symbol id="g23E41626515445E1BB7071D28C59ADA4" overflow="visible"><path d="M 4.7509766 5.2783203 L 4.7509766 4.399414 Q 4.3652344 4.6240234 3.9746094 4.736328 Q 3.5839844 4.848633 3.178711 4.848633 Q 2.5683594 4.848633 2.2680664 4.650879 Q 1.9677734 4.453125 1.9677734 4.0478516 Q 1.9677734 3.6816406 2.1923828 3.5009766 Q 2.4169922 3.3203125 3.3105469 3.149414 L 3.671875 3.0810547 Q 4.3408203 2.9541016 4.6850586 2.5732422 Q 5.029297 2.1923828 5.029297 1.5820313 Q 5.029297 0.7714844 4.453125 0.3149414 Q 3.8769531 -0.14160156 2.8515625 -0.14160156 Q 2.446289 -0.14160156 2.0019531 -0.056152344 Q 1.5576172 0.029296875 1.0400391 0.20019531 L 1.0400391 1.1279297 Q 1.5429688 0.8691406 2.0019531 0.7397461 Q 2.4609375 0.61035156 2.8710938 0.61035156 Q 3.4667969 0.61035156 3.7939453 0.8520508 Q 4.1210938 1.09375 4.1210938 1.5283203 Q 4.1210938 2.1533203 2.9248047 2.3925781 L 2.8857422 2.4023438 L 2.5488281 2.4707031 Q 1.7724609 2.6220703 1.4160156 2.980957 Q 1.0595703 3.3398438 1.0595703 3.959961 Q 1.0595703 4.7460938 1.5917969 5.17334 Q 2.1240234 5.600586 3.1103516 5.600586 Q 3.5498047 5.600586 3.9550781 5.5200195 Q 4.3603516 5.439453 4.7509766 5.2783203 Z "/></symbol><symbol id="gAB79A30431405AF14CCB1B23143BD7F1" overflow="visible"><path d="M 5.180664 0.2783203 Q 4.819336 0.068359375 4.436035 -0.036621094 Q 4.0527344 -0.14160156 3.6523438 -0.14160156 Q 2.3828125 -0.14160156 1.6674805 0.6201172 Q 0.95214844 1.3818359 0.95214844 2.7294922 Q 0.95214844 4.0771484 1.6674805 4.838867 Q 2.3828125 5.600586 3.6523438 5.600586 Q 4.0478516 5.600586 4.423828 5.498047 Q 4.7998047 5.395508 5.180664 5.180664 L 5.180664 4.2382813 Q 4.8242188 4.555664 4.465332 4.6972656 Q 4.1064453 4.838867 3.6523438 4.838867 Q 2.8076172 4.838867 2.3535156 4.291992 Q 1.8994141 3.7451172 1.8994141 2.7294922 Q 1.8994141 1.71875 2.355957 1.1694336 Q 2.8125 0.6201172 3.6523438 0.6201172 Q 4.1210938 0.6201172 4.4921875 0.76416016 Q 4.8632813 0.9082031 5.180664 1.2109375 L 5.180664 0.2783203 Z "/></symbol><symbol id="gF1D16D3439F586916205801D07D97589" overflow="visible"><path d="M 1.25 5.46875 L 3.5498047 5.46875 L 3.5498047 0.6982422 L 5.3320313 0.6982422 L 5.3320313 0 L 0.8691406 0 L 0.8691406 0.6982422 L 2.6513672 0.6982422 L 2.6513672 4.770508 L 1.25 4.770508 L 1.25 5.46875 Z M 2.6513672 7.5976563 L 3.5498047 7.5976563 L 3.5498047 6.459961 L 2.6513672 6.459961 L 2.6513672 7.5976563 Z "/></symbol><symbol id="gC5CB98F12AF1494D83D230F6647F5A66" overflow="visible"><path d="M 1.8310547 0.68847656 L 1.8310547 -2.0800781 L 0.9277344 -2.0800781 L 0.9277344 5.46875 L 1.8310547 5.46875 L 1.8310547 4.770508 Q 2.055664 5.1757813 2.4291992 5.3881836 Q 2.8027344 5.600586 3.2910156 5.600586 Q 4.2822266 5.600586 4.8461914 4.8339844 Q 5.4101563 4.067383 5.4101563 2.709961 Q 5.4101563 1.3769531 4.84375 0.6176758 Q 4.2773438 -0.14160156 3.2910156 -0.14160156 Q 2.7929688 -0.14160156 2.4194336 0.07080078 Q 2.0458984 0.28320313 1.8310547 0.68847656 Z M 4.4677734 2.7294922 Q 4.4677734 3.774414 4.1381836 4.3066406 Q 3.8085938 4.838867 3.1591797 4.838867 Q 2.5048828 4.838867 2.1679688 4.304199 Q 1.8310547 3.7695313 1.8310547 2.7294922 Q 1.8310547 1.6943359 2.1679688 1.1572266 Q 2.5048828 0.6201172 3.1591797 0.6201172 Q 3.8085938 0.6201172 4.1381836 1.1523438 Q 4.4677734 1.6845703 4.4677734 2.7294922 Z "/></symbol><symbol id="gDAC4E5B9EA78940BD8041CFC64F1642E" overflow="visible"><path d="M 3.0078125 4.838867 Q 2.3242188 4.838867 1.9726563 4.3066406 Q 1.6210938 3.774414 1.6210938 2.7294922 Q 1.6210938 1.6894531 1.9726563 1.1547852 Q 2.3242188 0.6201172 3.0078125 0.6201172 Q 3.696289 0.6201172 4.0478516 1.1547852 Q 4.399414 1.6894531 4.399414 2.7294922 Q 4.399414 3.774414 4.0478516 4.3066406 Q 3.696289 4.838867 3.0078125 4.838867 Z M 3.0078125 5.600586 Q 4.145508 5.600586 4.748535 4.8632813 Q 5.3515625 4.1259766 5.3515625 2.7294922 Q 5.3515625 1.328125 4.7509766 0.5932617 Q 4.1503906 -0.14160156 3.0078125 -0.14160156 Q 1.8701172 -0.14160156 1.2695313 0.5932617 Q 0.6689453 1.328125 0.6689453 2.7294922 Q 0.6689453 4.1259766 1.2695313 4.8632813 Q 1.8701172 5.600586 3.0078125 5.600586 Z "/></symbol><symbol id="gD3E02A90146443F5D1C908F343BC0F25" overflow="visible"><path d="M 1.1445313 5.8320313 L 4.2148438 -0.7421875 L 3.4726563 -0.7421875 L 0.3984375 5.8320313 L 1.1445313 5.8320313 Z "/></symbol><symbol id="gB83FD8DF61FB2E4EAD552878F3E8DD3F" overflow="visible"><path d="M 3.3007813 4.9121094 Q 3.4667969 5.263672 3.7231445 5.432129 Q 3.9794922 5.600586 4.3408203 5.600586 Q 5 5.600586 5.270996 5.090332 Q 5.541992 4.580078 5.541992 3.1689453 L 5.541992 0 L 4.7216797 0 L 4.7216797 3.1298828 Q 4.7216797 4.2871094 4.592285 4.567871 Q 4.4628906 4.848633 4.1210938 4.848633 Q 3.7304688 4.848633 3.5864258 4.54834 Q 3.4423828 4.248047 3.4423828 3.1298828 L 3.4423828 0 L 2.6220703 0 L 2.6220703 3.1298828 Q 2.6220703 4.301758 2.4829102 4.5751953 Q 2.34375 4.848633 1.9824219 4.848633 Q 1.6259766 4.848633 1.4868164 4.54834 Q 1.3476563 4.248047 1.3476563 3.1298828 L 1.3476563 0 L 0.53222656 0 L 0.53222656 5.46875 L 1.3476563 5.46875 L 1.3476563 5 Q 1.5087891 5.2929688 1.7504883 5.4467773 Q 1.9921875 5.600586 2.2998047 5.600586 Q 2.6708984 5.600586 2.9174805 5.4296875 Q 3.1640625 5.258789 3.3007813 4.9121094 Z "/></symbol><symbol id="g54B52F8AE89AD429D6D3AD95B2D89739" overflow="visible"><path d="M 5.131836 3.3886719 L 5.131836 0 L 4.2285156 0 L 4.2285156 3.3886719 Q 4.2285156 4.1259766 3.9697266 4.4726563 Q 3.7109375 4.819336 3.1591797 4.819336 Q 2.5292969 4.819336 2.1899414 4.3725586 Q 1.8505859 3.9257813 1.8505859 3.0908203 L 1.8505859 0 L 0.95214844 0 L 0.95214844 7.5976563 L 1.8505859 7.5976563 L 1.8505859 4.6484375 Q 2.0898438 5.1171875 2.5 5.3588867 Q 2.9101563 5.600586 3.4716797 5.600586 Q 4.3066406 5.600586 4.7192383 5.0512695 Q 5.131836 4.501953 5.131836 3.3886719 Z "/></symbol><symbol id="g961CAE06C7AAE8EB428417D81D5AEE72" overflow="visible"><path d="M 3.1201172 1.9824219 Q 3.1201172 1.3769531 3.3422852 1.0693359 Q 3.5644531 0.76171875 3.9990234 0.76171875 L 5.048828 0.76171875 L 5.048828 0 L 3.9111328 0 Q 3.1054688 0 2.6635742 0.5175781 Q 2.2216797 1.0351563 2.2216797 1.9824219 L 2.2216797 6.948242 L 0.78125 6.948242 L 0.78125 7.651367 L 3.1201172 7.651367 L 3.1201172 1.9824219 Z "/></symbol><symbol id="g77AA3201A93C8F4113E19CCDA185B6F5" overflow="visible"><path d="M 4.482422 2.7294922 Q 4.482422 3.774414 4.1503906 4.3066406 Q 3.8183594 4.838867 3.1689453 4.838867 Q 2.5146484 4.838867 2.1777344 4.304199 Q 1.8408203 3.7695313 1.8408203 2.7294922 Q 1.8408203 1.6943359 2.1777344 1.1572266 Q 2.5146484 0.6201172 3.1689453 0.6201172 Q 3.8183594 0.6201172 4.1503906 1.1523438 Q 4.482422 1.6845703 4.482422 2.7294922 Z M 1.8408203 4.770508 Q 2.055664 5.1708984 2.434082 5.385742 Q 2.8125 5.600586 3.3105469 5.600586 Q 4.296875 5.600586 4.8632813 4.8413086 Q 5.4296875 4.0820313 5.4296875 2.7490234 Q 5.4296875 1.3964844 4.86084 0.6274414 Q 4.291992 -0.14160156 3.3007813 -0.14160156 Q 2.8125 -0.14160156 2.4389648 0.07080078 Q 2.0654297 0.28320313 1.8408203 0.68847656 L 1.8408203 0 L 0.9423828 0 L 0.9423828 7.5976563 L 1.8408203 7.5976563 L 1.8408203 4.770508 Z "/></symbol><symbol id="g958F64BF87063D7EAFEDE953DDA2BF9F" overflow="visible"><path d="M 1.1523438 7.5976563 L 2.0800781 7.5976563 L 2.0800781 3.1982422 L 4.4384766 5.46875 L 5.5322266 5.46875 L 3.3789063 3.4082031 L 5.8691406 0 L 4.770508 0 L 2.7490234 2.8222656 L 2.0800781 2.1923828 L 2.0800781 0 L 1.1523438 0 L 1.1523438 7.5976563 Z "/></symbol><symbol id="g1E73FB87418835A88E58B2B7006EB72B" overflow="visible"><path d="M 4.1054688 2.7109375 L 4.1054688 0 L 3.3828125 0 L 3.3828125 2.7109375 Q 3.3828125 3.3007813 3.1757813 3.578125 Q 2.96875 3.8554688 2.5273438 3.8554688 Q 2.0234375 3.8554688 1.7519531 3.4980469 Q 1.4804688 3.140625 1.4804688 2.4726563 L 1.4804688 0 L 0.76171875 0 L 0.76171875 4.375 L 1.4804688 4.375 L 1.4804688 3.71875 Q 1.671875 4.09375 2 4.2871094 Q 2.328125 4.4804688 2.7773438 4.4804688 Q 3.4453125 4.4804688 3.7753906 4.0410156 Q 4.1054688 3.6015625 4.1054688 2.7109375 Z "/></symbol><symbol id="g3D5EE249F6894FA38DD21E85E2FD5F05" overflow="visible"><path d="M 0 5.46875 L 0.8886719 5.46875 L 1.8408203 1.0498047 L 2.6220703 3.8720703 L 3.3886719 3.8720703 L 4.1796875 1.0498047 L 5.131836 5.46875 L 6.020508 5.46875 L 4.741211 0 L 3.881836 0 L 3.0078125 2.9980469 L 2.1386719 0 L 1.2792969 0 L 0 5.46875 Z "/></symbol><symbol id="gD77243764E4306BD6D683907293F12D5" overflow="visible"><path d="M 1.7382813 3.1396484 L 4.2822266 3.1396484 L 4.2822266 2.3388672 L 1.7382813 2.3388672 L 1.7382813 3.1396484 Z "/></symbol></defs></svg>
</div>
<div style="
">
<p><br></p>
<h4 id="char-groups">Character Groups</h4>
<p>RegEx engines already define some groups of characters that can make writing RegEx expressions quicker.</p>
<svg class="typst-frame" style="overflow: visible; width: 40.53125em; height: 14.078125em;" viewBox="0 0 405.3125 140.78125" width="405.3125pt" height="140.78125pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml"><g><g transform="translate(0 0)"><g class="typst-group"><g><g transform="translate(0 -0.5)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 0 141.78125 "/></g><g transform="translate(52.1435546875 -0.5)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 0 141.78125 "/></g><g transform="translate(405.3125 -0.5)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 0 141.78125 "/></g><g transform="translate(-0.5 0)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 17.59765625)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 35.1953125)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 52.79296875)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 70.390625)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 87.98828125)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 105.5859375)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 123.18359375)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 140.78125)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(5 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gA9630BC7DC7C1A3B2772AC4EAF5E6A4E" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="18.0615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gF2D21C82F46AFB157CA5E1AB14665E2F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="18.0615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/></g></g><g transform="translate(0 17.59765625)"><g class="typst-group"><g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gE671651E4E76A7E6A66592123F7CB0EF" x="0" y="0" fill="#d73a49" fill-rule="nonzero"/></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1FA38BF5C517F615C367E61F0044A197" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="84.287109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gBB49C9F26722473D147EE93A203A972A" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="96.328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="102.3486328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="114.3896484375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1D505C2B8EC47EA4C26743DADEC508A3" x="126.4306640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="132.451171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="138.4716796875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="150.5126953125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="156.533203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="162.5537109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="168.57421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g77AA3201A93C8F4113E19CCDA185B6F5" x="180.615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="186.6357421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="192.65625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="198.6767578125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g958F64BF87063D7EAFEDE953DDA2BF9F" x="204.697265625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="210.7177734375" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(0 35.1953125)"><g class="typst-group"><g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#d73a49" fill-rule="nonzero"/><use xlink:href="#gC58E40CCEEAAE4A011790927FE560B0C" x="4.81640625" y="0" fill="#d73a49" fill-rule="nonzero"/></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1FA38BF5C517F615C367E61F0044A197" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3D5EE249F6894FA38DD21E85E2FD5F05" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="78.2666015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="96.328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="114.3896484375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="120.41015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="126.4306640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g77AA3201A93C8F4113E19CCDA185B6F5" x="138.4716796875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="144.4921875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="150.5126953125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="156.533203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g958F64BF87063D7EAFEDE953DDA2BF9F" x="162.5537109375" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(0 52.79296875)"><g class="typst-group"><g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#d73a49" fill-rule="nonzero"/><use xlink:href="#gF953090ED8E474A6BDB5C112B8614419" x="4.81640625" y="0" fill="#d73a49" fill-rule="nonzero"/></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1FA38BF5C517F615C367E61F0044A197" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="84.287109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gBB49C9F26722473D147EE93A203A972A" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="96.328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="102.3486328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="114.3896484375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3D5EE249F6894FA38DD21E85E2FD5F05" x="126.4306640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="132.451171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="138.4716796875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="144.4921875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="150.5126953125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="156.533203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="162.5537109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="168.57421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="174.5947265625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="180.615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="186.6357421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="198.6767578125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="204.697265625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="216.73828125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="222.7587890625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="228.779296875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="234.7998046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g77AA3201A93C8F4113E19CCDA185B6F5" x="246.8408203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="252.861328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="258.8818359375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="264.90234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g958F64BF87063D7EAFEDE953DDA2BF9F" x="270.9228515625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="276.943359375" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(0 70.390625)"><g class="typst-group"><g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#d73a49" fill-rule="nonzero"/><use xlink:href="#gF5F7ADACD3C8648021D0891B6403D353" x="4.81640625" y="0" fill="#d73a49" fill-rule="nonzero"/></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1FA38BF5C517F615C367E61F0044A197" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3402EB21D38B9A8AFC4DFC6262792511" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9E9C649267338B7BCF3BB51B9816396A" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1D505C2B8EC47EA4C26743DADEC508A3" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gB83FD8DF61FB2E4EAD552878F3E8DD3F" x="78.2666015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g807B89443FA0EF4D7A7A613982FE96F6" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="102.3486328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gA06F636B71996BA7070F256843DCE7EE" x="120.41015625" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(0 87.98828125)"><g class="typst-group"><g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#d73a49" fill-rule="nonzero"/><use xlink:href="#g27C321132E0A6A9E6B99ED77584BAD53" x="4.81640625" y="0" fill="#d73a49" fill-rule="nonzero"/></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1FA38BF5C517F615C367E61F0044A197" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="84.287109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gBB49C9F26722473D147EE93A203A972A" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="96.328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="102.3486328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="114.3896484375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3402EB21D38B9A8AFC4DFC6262792511" x="126.4306640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="132.451171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9E9C649267338B7BCF3BB51B9816396A" x="138.4716796875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="144.4921875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="150.5126953125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="156.533203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1D505C2B8EC47EA4C26743DADEC508A3" x="168.57421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="174.5947265625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="180.615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gB83FD8DF61FB2E4EAD552878F3E8DD3F" x="186.6357421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g807B89443FA0EF4D7A7A613982FE96F6" x="198.6767578125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="210.7177734375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="216.73828125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gA06F636B71996BA7070F256843DCE7EE" x="228.779296875" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(0 105.5859375)"><g class="typst-group"><g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#d73a49" fill-rule="nonzero"/><use xlink:href="#g7342E383B6C704BD4B47D4672216B35D" x="4.81640625" y="0" fill="#d73a49" fill-rule="nonzero"/></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="18.0615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5F336A8E4AF2A41DBA4980BEB90D9CD" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3402EB21D38B9A8AFC4DFC6262792511" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9E9C649267338B7BCF3BB51B9816396A" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="78.2666015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="84.287109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5F336A8E4AF2A41DBA4980BEB90D9CD" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="102.3486328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g952AB916CC2FCD530DE73925A36C7F0D" x="120.41015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="126.4306640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3402EB21D38B9A8AFC4DFC6262792511" x="132.451171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="138.4716796875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="144.4921875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="150.5126953125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="156.533203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="162.5537109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="168.57421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="174.5947265625" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(0 123.18359375)"><g class="typst-group"><g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#d73a49" fill-rule="nonzero"/><use xlink:href="#g9A4F7CA79966390D26B2F6FED68DC851" x="4.81640625" y="0" fill="#d73a49" fill-rule="nonzero"/></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1FA38BF5C517F615C367E61F0044A197" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="84.287109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gBB49C9F26722473D147EE93A203A972A" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="96.328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="102.3486328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="114.3896484375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1D505C2B8EC47EA4C26743DADEC508A3" x="126.4306640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="132.451171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="138.4716796875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="150.5126953125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="156.533203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="162.5537109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="168.57421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="174.5947265625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="180.615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="186.6357421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5F336A8E4AF2A41DBA4980BEB90D9CD" x="192.65625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3402EB21D38B9A8AFC4DFC6262792511" x="204.697265625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="210.7177734375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9E9C649267338B7BCF3BB51B9816396A" x="216.73828125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="222.7587890625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="228.779296875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="234.7998046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5F336A8E4AF2A41DBA4980BEB90D9CD" x="240.8203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="252.861328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="258.8818359375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3402EB21D38B9A8AFC4DFC6262792511" x="264.90234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g952AB916CC2FCD530DE73925A36C7F0D" x="276.943359375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="282.9638671875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3402EB21D38B9A8AFC4DFC6262792511" x="288.984375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="295.0048828125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="301.025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="307.0458984375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="313.06640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="319.0869140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="325.107421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="331.1279296875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="337.1484375" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g></g></g></g></g><defs id="glyph"><symbol id="gA9630BC7DC7C1A3B2772AC4EAF5E6A4E" overflow="visible"><path d="M 1.9482422 6.479492 L 1.9482422 3.7402344 L 3.0908203 3.7402344 Q 3.774414 3.7402344 4.157715 4.1015625 Q 4.5410156 4.4628906 4.5410156 5.1123047 Q 4.5410156 5.7617188 4.1601563 6.1206055 Q 3.7792969 6.479492 3.0908203 6.479492 L 1.9482422 6.479492 Z M 0.96191406 7.290039 L 3.0908203 7.290039 Q 4.3115234 7.290039 4.9414063 6.73584 Q 5.571289 6.1816406 5.571289 5.1123047 Q 5.571289 4.033203 4.9438477 3.4814453 Q 4.3164063 2.9296875 3.0908203 2.9296875 L 1.9482422 2.9296875 L 1.9482422 0 L 0.96191406 0 L 0.96191406 7.290039 Z "/></symbol><symbol id="g37BF1C0F714F2658F35D194C9E053C6F" overflow="visible"><path d="M 3.4277344 2.7490234 L 3.1298828 2.7490234 Q 2.34375 2.7490234 1.9458008 2.4731445 Q 1.5478516 2.1972656 1.5478516 1.6503906 Q 1.5478516 1.1572266 1.8457031 0.88378906 Q 2.1435547 0.61035156 2.6708984 0.61035156 Q 3.413086 0.61035156 3.8378906 1.1254883 Q 4.2626953 1.640625 4.267578 2.5488281 L 4.267578 2.7490234 L 3.4277344 2.7490234 Z M 5.1708984 3.1201172 L 5.1708984 0 L 4.267578 0 L 4.267578 0.8105469 Q 3.9794922 0.32226563 3.5424805 0.09033203 Q 3.1054688 -0.14160156 2.4804688 -0.14160156 Q 1.6455078 -0.14160156 1.1474609 0.32958984 Q 0.64941406 0.80078125 0.64941406 1.5917969 Q 0.64941406 2.5048828 1.262207 2.9785156 Q 1.875 3.4521484 3.0615234 3.4521484 L 4.267578 3.4521484 L 4.267578 3.59375 Q 4.2626953 4.248047 3.9355469 4.543457 Q 3.6083984 4.838867 2.890625 4.838867 Q 2.4316406 4.838867 1.9628906 4.7070313 Q 1.4941406 4.5751953 1.0498047 4.321289 L 1.0498047 5.2197266 Q 1.5478516 5.4101563 2.0043945 5.505371 Q 2.4609375 5.600586 2.890625 5.600586 Q 3.569336 5.600586 4.050293 5.4003906 Q 4.53125 5.2001953 4.8291016 4.7998047 Q 5.0146484 4.555664 5.0927734 4.1967773 Q 5.1708984 3.8378906 5.1708984 3.1201172 Z "/></symbol><symbol id="g8EFE1C4A2E0CD0A03B7633D0C324134A" overflow="visible"><path d="M 2.9980469 7.0214844 L 2.9980469 5.46875 L 5.0390625 5.46875 L 5.0390625 4.770508 L 2.9980469 4.770508 L 2.9980469 1.8017578 Q 2.9980469 1.1962891 3.227539 0.95703125 Q 3.4570313 0.71777344 4.0283203 0.71777344 L 5.0390625 0.71777344 L 5.0390625 0 L 3.9404297 0 Q 2.9296875 0 2.5146484 0.40527344 Q 2.0996094 0.8105469 2.0996094 1.8017578 L 2.0996094 4.770508 L 0.63964844 4.770508 L 0.63964844 5.46875 L 2.0996094 5.46875 L 2.0996094 7.0214844 L 2.9980469 7.0214844 Z "/></symbol><symbol id="g9CEA08D585A10BDF30AE748A6F2738E3" overflow="visible"><path d="M 5.4296875 2.9589844 L 5.4296875 2.5195313 L 1.5380859 2.5195313 L 1.5380859 2.4902344 Q 1.5380859 1.5966797 2.0043945 1.1083984 Q 2.4707031 0.6201172 3.3203125 0.6201172 Q 3.75 0.6201172 4.21875 0.75683594 Q 4.6875 0.8935547 5.2197266 1.171875 L 5.2197266 0.2783203 Q 4.7070313 0.068359375 4.230957 -0.036621094 Q 3.7548828 -0.14160156 3.3105469 -0.14160156 Q 2.0361328 -0.14160156 1.3183594 0.6225586 Q 0.60058594 1.3867188 0.60058594 2.7294922 Q 0.60058594 4.038086 1.3037109 4.819336 Q 2.006836 5.600586 3.178711 5.600586 Q 4.223633 5.600586 4.82666 4.892578 Q 5.4296875 4.1845703 5.4296875 2.9589844 Z M 4.53125 3.2226563 Q 4.5117188 4.013672 4.157715 4.4262695 Q 3.803711 4.838867 3.1396484 4.838867 Q 2.4902344 4.838867 2.0703125 4.4091797 Q 1.6503906 3.9794922 1.5722656 3.2177734 L 4.53125 3.2226563 Z "/></symbol><symbol id="g8B1CFD5A71F51FD444694A31ACE7ED10" overflow="visible"><path d="M 5.6396484 4.3408203 Q 5.3515625 4.5654297 5.053711 4.6679688 Q 4.7558594 4.770508 4.399414 4.770508 Q 3.5595703 4.770508 3.1152344 4.243164 Q 2.6708984 3.7158203 2.6708984 2.7197266 L 2.6708984 0 L 1.7675781 0 L 1.7675781 5.46875 L 2.6708984 5.46875 L 2.6708984 4.399414 Q 2.8955078 4.9804688 3.3618164 5.2905273 Q 3.828125 5.600586 4.4677734 5.600586 Q 4.7998047 5.600586 5.0878906 5.517578 Q 5.3759766 5.4345703 5.6396484 5.258789 L 5.6396484 4.3408203 Z "/></symbol><symbol id="gDDF33CCACF8520FD5879FCDAE37BD86" overflow="visible"><path d="M 5.131836 3.3886719 L 5.131836 0 L 4.2285156 0 L 4.2285156 3.3886719 Q 4.2285156 4.1259766 3.9697266 4.4726563 Q 3.7109375 4.819336 3.1591797 4.819336 Q 2.5292969 4.819336 2.1899414 4.3725586 Q 1.8505859 3.9257813 1.8505859 3.0908203 L 1.8505859 0 L 0.95214844 0 L 0.95214844 5.46875 L 1.8505859 5.46875 L 1.8505859 4.6484375 Q 2.0898438 5.1171875 2.5 5.3588867 Q 2.9101563 5.600586 3.4716797 5.600586 Q 4.3066406 5.600586 4.7192383 5.0512695 Q 5.131836 4.501953 5.131836 3.3886719 Z "/></symbol><symbol id="gF2D21C82F46AFB157CA5E1AB14665E2F" overflow="visible"><path d="M 2.1289063 0.8105469 Q 3.3740234 0.8105469 3.8671875 1.4233398 Q 4.3603516 2.0361328 4.3603516 3.6376953 Q 4.3603516 5.2539063 3.869629 5.866699 Q 3.3789063 6.479492 2.1289063 6.479492 L 1.6601563 6.479492 L 1.6601563 0.8105469 L 2.1289063 0.8105469 Z M 2.1484375 7.290039 Q 3.8183594 7.290039 4.609375 6.401367 Q 5.4003906 5.5126953 5.4003906 3.6376953 Q 5.4003906 1.7724609 4.609375 0.88623047 Q 3.8183594 0 2.1484375 0 L 0.6689453 0 L 0.6689453 7.290039 L 2.1484375 7.290039 Z "/></symbol><symbol id="g23E41626515445E1BB7071D28C59ADA4" overflow="visible"><path d="M 4.7509766 5.2783203 L 4.7509766 4.399414 Q 4.3652344 4.6240234 3.9746094 4.736328 Q 3.5839844 4.848633 3.178711 4.848633 Q 2.5683594 4.848633 2.2680664 4.650879 Q 1.9677734 4.453125 1.9677734 4.0478516 Q 1.9677734 3.6816406 2.1923828 3.5009766 Q 2.4169922 3.3203125 3.3105469 3.149414 L 3.671875 3.0810547 Q 4.3408203 2.9541016 4.6850586 2.5732422 Q 5.029297 2.1923828 5.029297 1.5820313 Q 5.029297 0.7714844 4.453125 0.3149414 Q 3.8769531 -0.14160156 2.8515625 -0.14160156 Q 2.446289 -0.14160156 2.0019531 -0.056152344 Q 1.5576172 0.029296875 1.0400391 0.20019531 L 1.0400391 1.1279297 Q 1.5429688 0.8691406 2.0019531 0.7397461 Q 2.4609375 0.61035156 2.8710938 0.61035156 Q 3.4667969 0.61035156 3.7939453 0.8520508 Q 4.1210938 1.09375 4.1210938 1.5283203 Q 4.1210938 2.1533203 2.9248047 2.3925781 L 2.8857422 2.4023438 L 2.5488281 2.4707031 Q 1.7724609 2.6220703 1.4160156 2.980957 Q 1.0595703 3.3398438 1.0595703 3.959961 Q 1.0595703 4.7460938 1.5917969 5.17334 Q 2.1240234 5.600586 3.1103516 5.600586 Q 3.5498047 5.600586 3.9550781 5.5200195 Q 4.3603516 5.439453 4.7509766 5.2783203 Z "/></symbol><symbol id="gAB79A30431405AF14CCB1B23143BD7F1" overflow="visible"><path d="M 5.180664 0.2783203 Q 4.819336 0.068359375 4.436035 -0.036621094 Q 4.0527344 -0.14160156 3.6523438 -0.14160156 Q 2.3828125 -0.14160156 1.6674805 0.6201172 Q 0.95214844 1.3818359 0.95214844 2.7294922 Q 0.95214844 4.0771484 1.6674805 4.838867 Q 2.3828125 5.600586 3.6523438 5.600586 Q 4.0478516 5.600586 4.423828 5.498047 Q 4.7998047 5.395508 5.180664 5.180664 L 5.180664 4.2382813 Q 4.8242188 4.555664 4.465332 4.6972656 Q 4.1064453 4.838867 3.6523438 4.838867 Q 2.8076172 4.838867 2.3535156 4.291992 Q 1.8994141 3.7451172 1.8994141 2.7294922 Q 1.8994141 1.71875 2.355957 1.1694336 Q 2.8125 0.6201172 3.6523438 0.6201172 Q 4.1210938 0.6201172 4.4921875 0.76416016 Q 4.8632813 0.9082031 5.180664 1.2109375 L 5.180664 0.2783203 Z "/></symbol><symbol id="gF1D16D3439F586916205801D07D97589" overflow="visible"><path d="M 1.25 5.46875 L 3.5498047 5.46875 L 3.5498047 0.6982422 L 5.3320313 0.6982422 L 5.3320313 0 L 0.8691406 0 L 0.8691406 0.6982422 L 2.6513672 0.6982422 L 2.6513672 4.770508 L 1.25 4.770508 L 1.25 5.46875 Z M 2.6513672 7.5976563 L 3.5498047 7.5976563 L 3.5498047 6.459961 L 2.6513672 6.459961 L 2.6513672 7.5976563 Z "/></symbol><symbol id="gC5CB98F12AF1494D83D230F6647F5A66" overflow="visible"><path d="M 1.8310547 0.68847656 L 1.8310547 -2.0800781 L 0.9277344 -2.0800781 L 0.9277344 5.46875 L 1.8310547 5.46875 L 1.8310547 4.770508 Q 2.055664 5.1757813 2.4291992 5.3881836 Q 2.8027344 5.600586 3.2910156 5.600586 Q 4.2822266 5.600586 4.8461914 4.8339844 Q 5.4101563 4.067383 5.4101563 2.709961 Q 5.4101563 1.3769531 4.84375 0.6176758 Q 4.2773438 -0.14160156 3.2910156 -0.14160156 Q 2.7929688 -0.14160156 2.4194336 0.07080078 Q 2.0458984 0.28320313 1.8310547 0.68847656 Z M 4.4677734 2.7294922 Q 4.4677734 3.774414 4.1381836 4.3066406 Q 3.8085938 4.838867 3.1591797 4.838867 Q 2.5048828 4.838867 2.1679688 4.304199 Q 1.8310547 3.7695313 1.8310547 2.7294922 Q 1.8310547 1.6943359 2.1679688 1.1572266 Q 2.5048828 0.6201172 3.1591797 0.6201172 Q 3.8085938 0.6201172 4.1381836 1.1523438 Q 4.4677734 1.6845703 4.4677734 2.7294922 Z "/></symbol><symbol id="gDAC4E5B9EA78940BD8041CFC64F1642E" overflow="visible"><path d="M 3.0078125 4.838867 Q 2.3242188 4.838867 1.9726563 4.3066406 Q 1.6210938 3.774414 1.6210938 2.7294922 Q 1.6210938 1.6894531 1.9726563 1.1547852 Q 2.3242188 0.6201172 3.0078125 0.6201172 Q 3.696289 0.6201172 4.0478516 1.1547852 Q 4.399414 1.6894531 4.399414 2.7294922 Q 4.399414 3.774414 4.0478516 4.3066406 Q 3.696289 4.838867 3.0078125 4.838867 Z M 3.0078125 5.600586 Q 4.145508 5.600586 4.748535 4.8632813 Q 5.3515625 4.1259766 5.3515625 2.7294922 Q 5.3515625 1.328125 4.7509766 0.5932617 Q 4.1503906 -0.14160156 3.0078125 -0.14160156 Q 1.8701172 -0.14160156 1.2695313 0.5932617 Q 0.6689453 1.328125 0.6689453 2.7294922 Q 0.6689453 4.1259766 1.2695313 4.8632813 Q 1.8701172 5.600586 3.0078125 5.600586 Z "/></symbol><symbol id="gE671651E4E76A7E6A66592123F7CB0EF" overflow="visible"><path d="M 1.9101563 1.1914063 L 2.8945313 1.1914063 L 2.8945313 0 L 1.9101563 0 L 1.9101563 1.1914063 Z "/></symbol><symbol id="g1FA38BF5C517F615C367E61F0044A197" overflow="visible"><path d="M 4.189453 1.7578125 Q 3.9648438 1.1865234 3.618164 0.25390625 Q 3.1347656 -1.0351563 2.96875 -1.3183594 Q 2.7441406 -1.6992188 2.4072266 -1.8896484 Q 2.0703125 -2.0800781 1.6210938 -2.0800781 L 0.8984375 -2.0800781 L 0.8984375 -1.328125 L 1.4306641 -1.328125 Q 1.8261719 -1.328125 2.0507813 -1.0986328 Q 2.2753906 -0.8691406 2.6220703 0.087890625 L 0.5078125 5.46875 L 1.4599609 5.46875 L 3.0810547 1.1914063 L 4.6777344 5.46875 L 5.629883 5.46875 L 4.189453 1.7578125 Z "/></symbol><symbol id="g54B52F8AE89AD429D6D3AD95B2D89739" overflow="visible"><path d="M 5.131836 3.3886719 L 5.131836 0 L 4.2285156 0 L 4.2285156 3.3886719 Q 4.2285156 4.1259766 3.9697266 4.4726563 Q 3.7109375 4.819336 3.1591797 4.819336 Q 2.5292969 4.819336 2.1899414 4.3725586 Q 1.8505859 3.9257813 1.8505859 3.0908203 L 1.8505859 0 L 0.95214844 0 L 0.95214844 7.5976563 L 1.8505859 7.5976563 L 1.8505859 4.6484375 Q 2.0898438 5.1171875 2.5 5.3588867 Q 2.9101563 5.600586 3.4716797 5.600586 Q 4.3066406 5.600586 4.7192383 5.0512695 Q 5.131836 4.501953 5.131836 3.3886719 Z "/></symbol><symbol id="gBB49C9F26722473D147EE93A203A972A" overflow="visible"><path d="M 5.4589844 5.46875 L 3.5009766 2.8515625 L 5.649414 0 L 4.609375 0 L 3.0078125 2.1923828 L 1.4111328 0 L 0.37109375 0 L 2.5195313 2.8515625 L 0.56152344 5.46875 L 1.5576172 5.46875 L 3.0078125 3.491211 L 4.448242 5.46875 L 5.4589844 5.46875 Z "/></symbol><symbol id="g1D505C2B8EC47EA4C26743DADEC508A3" overflow="visible"><path d="M 5.1904297 7.5976563 L 5.1904297 6.850586 L 4.169922 6.850586 Q 3.6865234 6.850586 3.4985352 6.652832 Q 3.3105469 6.455078 3.3105469 5.9521484 L 3.3105469 5.46875 L 5.1904297 5.46875 L 5.1904297 4.770508 L 3.3105469 4.770508 L 3.3105469 0 L 2.4121094 0 L 2.4121094 4.770508 L 0.95214844 4.770508 L 0.95214844 5.46875 L 2.4121094 5.46875 L 2.4121094 5.8496094 Q 2.4121094 6.748047 2.824707 7.1728516 Q 3.2373047 7.5976563 4.111328 7.5976563 L 5.1904297 7.5976563 Z "/></symbol><symbol id="g961CAE06C7AAE8EB428417D81D5AEE72" overflow="visible"><path d="M 3.1201172 1.9824219 Q 3.1201172 1.3769531 3.3422852 1.0693359 Q 3.5644531 0.76171875 3.9990234 0.76171875 L 5.048828 0.76171875 L 5.048828 0 L 3.9111328 0 Q 3.1054688 0 2.6635742 0.5175781 Q 2.2216797 1.0351563 2.2216797 1.9824219 L 2.2216797 6.948242 L 0.78125 6.948242 L 0.78125 7.651367 L 3.1201172 7.651367 L 3.1201172 1.9824219 Z "/></symbol><symbol id="g77AA3201A93C8F4113E19CCDA185B6F5" overflow="visible"><path d="M 4.482422 2.7294922 Q 4.482422 3.774414 4.1503906 4.3066406 Q 3.8183594 4.838867 3.1689453 4.838867 Q 2.5146484 4.838867 2.1777344 4.304199 Q 1.8408203 3.7695313 1.8408203 2.7294922 Q 1.8408203 1.6943359 2.1777344 1.1572266 Q 2.5146484 0.6201172 3.1689453 0.6201172 Q 3.8183594 0.6201172 4.1503906 1.1523438 Q 4.482422 1.6845703 4.482422 2.7294922 Z M 1.8408203 4.770508 Q 2.055664 5.1708984 2.434082 5.385742 Q 2.8125 5.600586 3.3105469 5.600586 Q 4.296875 5.600586 4.8632813 4.8413086 Q 5.4296875 4.0820313 5.4296875 2.7490234 Q 5.4296875 1.3964844 4.86084 0.6274414 Q 4.291992 -0.14160156 3.3007813 -0.14160156 Q 2.8125 -0.14160156 2.4389648 0.07080078 Q 2.0654297 0.28320313 1.8408203 0.68847656 L 1.8408203 0 L 0.9423828 0 L 0.9423828 7.5976563 L 1.8408203 7.5976563 L 1.8408203 4.770508 Z "/></symbol><symbol id="g958F64BF87063D7EAFEDE953DDA2BF9F" overflow="visible"><path d="M 1.1523438 7.5976563 L 2.0800781 7.5976563 L 2.0800781 3.1982422 L 4.4384766 5.46875 L 5.5322266 5.46875 L 3.3789063 3.4082031 L 5.8691406 0 L 4.770508 0 L 2.7490234 2.8222656 L 2.0800781 2.1923828 L 2.0800781 0 L 1.1523438 0 L 1.1523438 7.5976563 Z "/></symbol><symbol id="gD3E02A90146443F5D1C908F343BC0F25" overflow="visible"><path d="M 1.1445313 5.8320313 L 4.2148438 -0.7421875 L 3.4726563 -0.7421875 L 0.3984375 5.8320313 L 1.1445313 5.8320313 Z "/></symbol><symbol id="gC58E40CCEEAAE4A011790927FE560B0C" overflow="visible"><path d="M 3.8007813 4.2226563 L 3.8007813 3.5195313 Q 3.4921875 3.6992188 3.1796875 3.7890625 Q 2.8671875 3.8789063 2.5429688 3.8789063 Q 2.0546875 3.8789063 1.8144531 3.7207031 Q 1.5742188 3.5625 1.5742188 3.2382813 Q 1.5742188 2.9453125 1.7539063 2.8007813 Q 1.9335938 2.65625 2.6484375 2.5195313 L 2.9375 2.4648438 Q 3.4726563 2.3632813 3.7480469 2.0585938 Q 4.0234375 1.7539063 4.0234375 1.265625 Q 4.0234375 0.6171875 3.5625 0.25195313 Q 3.1015625 -0.11328125 2.28125 -0.11328125 Q 1.9570313 -0.11328125 1.6015625 -0.044921875 Q 1.2460938 0.0234375 0.83203125 0.16015625 L 0.83203125 0.90234375 Q 1.234375 0.6953125 1.6015625 0.5917969 Q 1.96875 0.48828125 2.296875 0.48828125 Q 2.7734375 0.48828125 3.0351563 0.6816406 Q 3.296875 0.875 3.296875 1.2226563 Q 3.296875 1.7226563 2.3398438 1.9140625 L 2.3085938 1.921875 L 2.0390625 1.9765625 Q 1.4179688 2.0976563 1.1328125 2.3847656 Q 0.84765625 2.671875 0.84765625 3.1679688 Q 0.84765625 3.796875 1.2734375 4.138672 Q 1.6992188 4.4804688 2.4882813 4.4804688 Q 2.8398438 4.4804688 3.1640625 4.4160156 Q 3.4882813 4.3515625 3.8007813 4.2226563 Z "/></symbol><symbol id="g3D5EE249F6894FA38DD21E85E2FD5F05" overflow="visible"><path d="M 0 5.46875 L 0.8886719 5.46875 L 1.8408203 1.0498047 L 2.6220703 3.8720703 L 3.3886719 3.8720703 L 4.1796875 1.0498047 L 5.131836 5.46875 L 6.020508 5.46875 L 4.741211 0 L 3.881836 0 L 3.0078125 2.9980469 L 2.1386719 0 L 1.2792969 0 L 0 5.46875 Z "/></symbol><symbol id="gF953090ED8E474A6BDB5C112B8614419" overflow="visible"><path d="M 3.953125 5.6328125 L 3.953125 4.8320313 Q 3.59375 5.0625 3.2324219 5.1796875 Q 2.8710938 5.296875 2.5039063 5.296875 Q 1.9453125 5.296875 1.6210938 5.0371094 Q 1.296875 4.7773438 1.296875 4.3359375 Q 1.296875 3.9492188 1.5097656 3.7460938 Q 1.7226563 3.5429688 2.3046875 3.40625 L 2.71875 3.3125 Q 3.5390625 3.1210938 3.9140625 2.7109375 Q 4.2890625 2.3007813 4.2890625 1.59375 Q 4.2890625 0.76171875 3.7734375 0.32421875 Q 3.2578125 -0.11328125 2.2734375 -0.11328125 Q 1.8632813 -0.11328125 1.4492188 -0.025390625 Q 1.0351563 0.0625 0.6171875 0.23828125 L 0.6171875 1.078125 Q 1.0664063 0.79296875 1.4667969 0.66015625 Q 1.8671875 0.52734375 2.2734375 0.52734375 Q 2.8710938 0.52734375 3.203125 0.7949219 Q 3.5351563 1.0625 3.5351563 1.5429688 Q 3.5351563 1.9804688 3.3066406 2.2109375 Q 3.078125 2.4414063 2.5117188 2.5664063 L 2.0898438 2.6640625 Q 1.2773438 2.8476563 0.91015625 3.21875 Q 0.54296875 3.5898438 0.54296875 4.2148438 Q 0.54296875 4.9960938 1.0683594 5.466797 Q 1.59375 5.9375 2.4648438 5.9375 Q 2.8007813 5.9375 3.171875 5.861328 Q 3.5429688 5.7851563 3.953125 5.6328125 Z "/></symbol><symbol id="gF5F7ADACD3C8648021D0891B6403D353" overflow="visible"><path d="M 3.3515625 3.8164063 L 3.3515625 6.078125 L 4.0703125 6.078125 L 4.0703125 0 L 3.3515625 0 L 3.3515625 0.55078125 Q 3.171875 0.2265625 2.8730469 0.056640625 Q 2.5742188 -0.11328125 2.1835938 -0.11328125 Q 1.390625 -0.11328125 0.9355469 0.5019531 Q 0.48046875 1.1171875 0.48046875 2.1992188 Q 0.48046875 3.265625 0.9375 3.8730469 Q 1.3945313 4.4804688 2.1835938 4.4804688 Q 2.578125 4.4804688 2.8789063 4.310547 Q 3.1796875 4.140625 3.3515625 3.8164063 Z M 1.2382813 2.1835938 Q 1.2382813 1.3476563 1.5039063 0.921875 Q 1.7695313 0.49609375 2.2890625 0.49609375 Q 2.8085938 0.49609375 3.0800781 0.92578125 Q 3.3515625 1.3554688 3.3515625 2.1835938 Q 3.3515625 3.015625 3.0800781 3.4433594 Q 2.8085938 3.8710938 2.2890625 3.8710938 Q 1.7695313 3.8710938 1.5039063 3.4453125 Q 1.2382813 3.0195313 1.2382813 2.1835938 Z "/></symbol><symbol id="g3402EB21D38B9A8AFC4DFC6262792511" overflow="visible"><path d="M 4.189453 4.770508 L 4.189453 7.5976563 L 5.0878906 7.5976563 L 5.0878906 0 L 4.189453 0 L 4.189453 0.68847656 Q 3.9648438 0.28320313 3.5913086 0.07080078 Q 3.2177734 -0.14160156 2.7294922 -0.14160156 Q 1.7382813 -0.14160156 1.1694336 0.6274414 Q 0.60058594 1.3964844 0.60058594 2.7490234 Q 0.60058594 4.0820313 1.171875 4.8413086 Q 1.7431641 5.600586 2.7294922 5.600586 Q 3.2226563 5.600586 3.5986328 5.3881836 Q 3.9746094 5.1757813 4.189453 4.770508 Z M 1.5478516 2.7294922 Q 1.5478516 1.6845703 1.8798828 1.1523438 Q 2.211914 0.6201172 2.8613281 0.6201172 Q 3.5107422 0.6201172 3.8500977 1.1572266 Q 4.189453 1.6943359 4.189453 2.7294922 Q 4.189453 3.7695313 3.8500977 4.304199 Q 3.5107422 4.838867 2.8613281 4.838867 Q 2.211914 4.838867 1.8798828 4.3066406 Q 1.5478516 3.774414 1.5478516 2.7294922 Z "/></symbol><symbol id="g9E9C649267338B7BCF3BB51B9816396A" overflow="visible"><path d="M 4.189453 2.7783203 Q 4.189453 3.7890625 3.8598633 4.313965 Q 3.5302734 4.838867 2.9003906 4.838867 Q 2.241211 4.838867 1.8945313 4.313965 Q 1.5478516 3.7890625 1.5478516 2.7783203 Q 1.5478516 1.7675781 1.8969727 1.237793 Q 2.2460938 0.7080078 2.9101563 0.7080078 Q 3.5302734 0.7080078 3.8598633 1.2402344 Q 4.189453 1.7724609 4.189453 2.7783203 Z M 5.0878906 0.3515625 Q 5.0878906 -0.87890625 4.506836 -1.5136719 Q 3.9257813 -2.1484375 2.7978516 -2.1484375 Q 2.4267578 -2.1484375 2.0214844 -2.0800781 Q 1.6162109 -2.0117188 1.2109375 -1.8798828 L 1.2109375 -0.99121094 Q 1.6894531 -1.2158203 2.0800781 -1.3232422 Q 2.4707031 -1.4306641 2.7978516 -1.4306641 Q 3.5253906 -1.4306641 3.8574219 -1.0351563 Q 4.189453 -0.63964844 4.189453 0.21972656 L 4.189453 0.25878906 L 4.189453 0.8691406 Q 3.9746094 0.41015625 3.6035156 0.18554688 Q 3.2324219 -0.0390625 2.7001953 -0.0390625 Q 1.7431641 -0.0390625 1.171875 0.72753906 Q 0.60058594 1.4941406 0.60058594 2.7783203 Q 0.60058594 4.067383 1.171875 4.8339844 Q 1.7431641 5.600586 2.7001953 5.600586 Q 3.227539 5.600586 3.59375 5.390625 Q 3.959961 5.180664 4.189453 4.741211 L 4.189453 5.4492188 L 5.0878906 5.4492188 L 5.0878906 0.3515625 Z "/></symbol><symbol id="gB83FD8DF61FB2E4EAD552878F3E8DD3F" overflow="visible"><path d="M 3.3007813 4.9121094 Q 3.4667969 5.263672 3.7231445 5.432129 Q 3.9794922 5.600586 4.3408203 5.600586 Q 5 5.600586 5.270996 5.090332 Q 5.541992 4.580078 5.541992 3.1689453 L 5.541992 0 L 4.7216797 0 L 4.7216797 3.1298828 Q 4.7216797 4.2871094 4.592285 4.567871 Q 4.4628906 4.848633 4.1210938 4.848633 Q 3.7304688 4.848633 3.5864258 4.54834 Q 3.4423828 4.248047 3.4423828 3.1298828 L 3.4423828 0 L 2.6220703 0 L 2.6220703 3.1298828 Q 2.6220703 4.301758 2.4829102 4.5751953 Q 2.34375 4.848633 1.9824219 4.848633 Q 1.6259766 4.848633 1.4868164 4.54834 Q 1.3476563 4.248047 1.3476563 3.1298828 L 1.3476563 0 L 0.53222656 0 L 0.53222656 5.46875 L 1.3476563 5.46875 L 1.3476563 5 Q 1.5087891 5.2929688 1.7504883 5.4467773 Q 1.9921875 5.600586 2.2998047 5.600586 Q 2.6708984 5.600586 2.9174805 5.4296875 Q 3.1640625 5.258789 3.3007813 4.9121094 Z "/></symbol><symbol id="g807B89443FA0EF4D7A7A613982FE96F6" overflow="visible"><path d="M 2.3583984 3.6621094 Q 2.3583984 3.930664 2.5463867 4.1259766 Q 2.734375 4.321289 2.9980469 4.321289 Q 3.2714844 4.321289 3.4667969 4.1259766 Q 3.6621094 3.930664 3.6621094 3.6621094 Q 3.6621094 3.3886719 3.4692383 3.1982422 Q 3.2763672 3.0078125 2.9980469 3.0078125 Q 2.7246094 3.0078125 2.541504 3.1933594 Q 2.3583984 3.3789063 2.3583984 3.6621094 Z M 3.0078125 6.640625 Q 2.319336 6.640625 1.9799805 5.8984375 Q 1.640625 5.15625 1.640625 3.6376953 Q 1.640625 2.1240234 1.9799805 1.3818359 Q 2.319336 0.63964844 3.0078125 0.63964844 Q 3.7011719 0.63964844 4.0405273 1.3818359 Q 4.379883 2.1240234 4.379883 3.6376953 Q 4.379883 5.15625 4.0405273 5.8984375 Q 3.7011719 6.640625 3.0078125 6.640625 Z M 3.0078125 7.421875 Q 4.1748047 7.421875 4.772949 6.4648438 Q 5.3710938 5.5078125 5.3710938 3.6376953 Q 5.3710938 1.7724609 4.772949 0.8154297 Q 4.1748047 -0.14160156 3.0078125 -0.14160156 Q 1.8408203 -0.14160156 1.2451172 0.8154297 Q 0.64941406 1.7724609 0.64941406 3.6376953 Q 0.64941406 5.5078125 1.2451172 6.4648438 Q 1.8408203 7.421875 3.0078125 7.421875 Z "/></symbol><symbol id="gA06F636B71996BA7070F256843DCE7EE" overflow="visible"><path d="M 2.9101563 3.2324219 Q 3.540039 3.2324219 3.8989258 3.6865234 Q 4.2578125 4.140625 4.2578125 4.9414063 Q 4.2578125 5.7421875 3.8989258 6.196289 Q 3.540039 6.6503906 2.9101563 6.6503906 Q 2.2558594 6.6503906 1.9238281 6.2182617 Q 1.5917969 5.786133 1.5917969 4.9414063 Q 1.5917969 4.091797 1.9213867 3.6621094 Q 2.2509766 3.2324219 2.9101563 3.2324219 Z M 1.1523438 0.15136719 L 1.1523438 1.0595703 Q 1.4599609 0.87890625 1.8066406 0.7836914 Q 2.1533203 0.68847656 2.5292969 0.68847656 Q 3.4667969 0.68847656 3.947754 1.394043 Q 4.428711 2.0996094 4.428711 3.4716797 Q 4.1992188 2.9833984 3.7841797 2.722168 Q 3.3691406 2.4609375 2.8320313 2.4609375 Q 1.7773438 2.4609375 1.1987305 3.1103516 Q 0.6201172 3.7597656 0.6201172 4.951172 Q 0.6201172 6.1279297 1.2133789 6.7749023 Q 1.8066406 7.421875 2.890625 7.421875 Q 4.1601563 7.421875 4.7509766 6.508789 Q 5.341797 5.595703 5.341797 3.6376953 Q 5.341797 1.796875 4.6313477 0.8276367 Q 3.9208984 -0.14160156 2.5683594 -0.14160156 Q 2.211914 -0.14160156 1.8505859 -0.06591797 Q 1.4892578 0.009765625 1.1523438 0.15136719 Z "/></symbol><symbol id="g27C321132E0A6A9E6B99ED77584BAD53" overflow="visible"><path d="M 1.703125 0.6484375 Q 2.6992188 0.6484375 3.09375 1.1386719 Q 3.4882813 1.6289063 3.4882813 2.9101563 Q 3.4882813 4.203125 3.0957031 4.6933594 Q 2.703125 5.1835938 1.703125 5.1835938 L 1.328125 5.1835938 L 1.328125 0.6484375 L 1.703125 0.6484375 Z M 1.71875 5.8320313 Q 3.0546875 5.8320313 3.6875 5.1210938 Q 4.3203125 4.4101563 4.3203125 2.9101563 Q 4.3203125 1.4179688 3.6875 0.7089844 Q 3.0546875 0 1.71875 0 L 0.53515625 0 L 0.53515625 5.8320313 L 1.71875 5.8320313 Z "/></symbol><symbol id="g7342E383B6C704BD4B47D4672216B35D" overflow="visible"><path d="M 0 4.375 L 0.7109375 4.375 L 1.4726563 0.83984375 L 2.0976563 3.0976563 L 2.7109375 3.0976563 L 3.34375 0.83984375 L 4.1054688 4.375 L 4.8164063 4.375 L 3.7929688 0 L 3.1054688 0 L 2.40625 2.3984375 L 1.7109375 0 L 1.0234375 0 L 0 4.375 Z "/></symbol><symbol id="gC5F336A8E4AF2A41DBA4980BEB90D9CD" overflow="visible"><path d="M 2.4511719 1.4794922 L 3.6816406 1.4794922 L 3.6816406 0.46875 L 2.7197266 -1.4013672 L 1.9677734 -1.4013672 L 2.4511719 0.46875 L 2.4511719 1.4794922 Z "/></symbol><symbol id="g952AB916CC2FCD530DE73925A36C7F0D" overflow="visible"><path d="M 0.95214844 2.0703125 L 0.95214844 5.4589844 L 1.8505859 5.4589844 L 1.8505859 2.0703125 Q 1.8505859 1.3330078 2.1118164 0.9863281 Q 2.3730469 0.63964844 2.9199219 0.63964844 Q 3.5546875 0.63964844 3.8916016 1.0864258 Q 4.2285156 1.5332031 4.2285156 2.368164 L 4.2285156 5.4589844 L 5.131836 5.4589844 L 5.131836 0 L 4.2285156 0 L 4.2285156 0.8203125 Q 3.9892578 0.3466797 3.5766602 0.10253906 Q 3.1640625 -0.14160156 2.6123047 -0.14160156 Q 1.7724609 -0.14160156 1.3623047 0.40771484 Q 0.95214844 0.95703125 0.95214844 2.0703125 Z "/></symbol><symbol id="g9A4F7CA79966390D26B2F6FED68DC851" overflow="visible"><path d="M 0 5.8320313 L 0.76953125 5.8320313 L 1.328125 1.0976563 L 1.9921875 4.2304688 L 2.8164063 4.2304688 L 3.4882813 1.0898438 L 4.046875 5.8320313 L 4.8164063 5.8320313 L 3.9453125 0 L 3.1992188 0 L 2.40625 3.4648438 L 1.6171875 0 L 0.87109375 0 L 0 5.8320313 Z "/></symbol></defs></svg>
</div>
<div style="
">
<p><br></p>
<h4>Anchors</h4>
<p><code><code style="white-space: pre-wrap"><span style="color: #d73a49">^</span></code></code> is used to assert the beginning of a line in multi-line mode, or the beginning of the string in whole-string mode.</p>
<p><code><code style="white-space: pre-wrap"><span style="color: #d73a49">$</span></code></code> is used to assert the end of a line in multi-line mode, or the end of the string in whole-string mode.</p>
<p>The behaviours of these depend on the <a href="#match-options">match options</a></p>
</div>
<div style="
">
<p><br></p>
<h3 id="greedy">Greedy VS Lazy</h3>
<p>Some combinators will either match “lazy”, or “greedy”.</p>
<p>Lazy is when the engine only matches as many characters required to get to the next step. This should almost always be used.</p>
<p>Greedy matching is when the engine tries to match as many characters as possible. The problem with this is that it might cause “backtracking”, which happens when the engine goes back in the pattern multiple times to ensure that as many characters as possible where matched. This can cause big performance issues.</p>
</div>
<div style="
">
<p><br></p>
<h3>Combinators</h3>
<p>Multiple atoms can be combined together to form more complex patterns.</p>
</div>
<div style="
">
<p><br></p>
<h4>Chain</h4>
<p>When two expressions are next to each other, they will be chained together, which means that both will be evaluated in-order.</p>
<p>Example: <code><code style="white-space: pre-wrap">x<span style="color: #d73a49">\d</span></code></code> matches a <code><code style="white-space: pre-wrap">x</code></code> and then a digit, like for example <code><code style="white-space: pre-wrap">x9</code></code></p>
</div>
<div style="
">
<p><br></p>
<h4>Or</h4>
<p>Two expressions separated by a <code><code style="white-space: pre-wrap">|</code></code> cause the RegEx engine to first try to match the left side, and only if it fails, it tries the right side instead.</p>
<p>Note that “or” has a long left and right scope, which means that <code><code style="white-space: pre-wrap">ab<span style="color: #d73a49">|</span>cd</code></code> will match either <code><code style="white-space: pre-wrap">ab</code></code> or <code><code style="white-space: pre-wrap">cd</code></code></p>
</div>
<div style="
">
<p><br></p>
<h4>Or-Not</h4>
<p>Tries to match the expression on the left to it, but wont error if it doesnt succeed.</p>
<p>Note that “or-not” has a short left scope, which means that <code><code style="white-space: pre-wrap">ab<span style="color: #d73a49">?</span></code></code> will always match <code><code style="white-space: pre-wrap">a</code></code>, and then try to match <code><code style="white-space: pre-wrap">b</code></code></p>
</div>
<div style="
">
<p><br></p>
<h4>Repeated</h4>
<p>A expression followed by either a <code><code style="white-space: pre-wrap">*</code></code> for <a href="#greedy">greedy</a> repeat, or a <code><code style="white-space: pre-wrap">*?</code></code> for <a href="#greedy">lazy</a> repeat.</p>
<p>This matches as many times as possible, but can also match the pattern zero times.</p>
<p>Note that this has a short left scope.</p>
</div>
<div style="
">
<p><br></p>
<h4>Repeated At Least Once</h4>
<p>A expression followed by either a <code><code style="white-space: pre-wrap">+</code></code> for <a href="#greedy">greedy</a> repeat, or a <code><code style="white-space: pre-wrap">+?</code></code> for <a href="#greedy">lazy</a> repeat.</p>
<p>This matches as many times as possible, and at least one time.</p>
<p>Note that this has a short left scope.</p>
</div>
<div style="
">
<p><br></p>
<h4 id="non-capture-group">(Non-Capture) Group</h4>
<p>Groups multiple expressions together for scoping.</p>
<p>Example: <code><code style="white-space: pre-wrap"><span style="color: #d73a49">(</span><span style="color: #b60157">?:</span>abc<span style="color: #d73a49">)</span></code></code> will just match <code><code style="white-space: pre-wrap">abc</code></code></p>
</div>
<div style="
">
<p><br></p>
<h4>Capture Group</h4>
<p>Similar to <a href="#non-capture-group">Non-Capture Groups</a> except that they capture the matched text. This allows the matched text of the inner expression to be extracted later.</p>
<p>Capture group IDs are enumerated from left to right, starting with 1.</p>
<p>Example: <code><code style="white-space: pre-wrap"><span style="color: #d73a49">(</span>abc<span style="color: #d73a49">)</span>de</code></code> will match <code><code style="white-space: pre-wrap">abcde</code></code>, and store <code><code style="white-space: pre-wrap">abc</code></code> in group 1.</p>
</div>
<div style="
">
<p><br></p>
<h4>Character Set</h4>
<p>By surrounding multiple characters in square brackets, the engine will match any of them. Special characters or expressions wont be parsed inside them, which means that this can also be used to escape characters.</p>
<p>For example: <code><code style="white-space: pre-wrap"><span style="color: #d73a49">[</span>abc<span style="color: #d73a49">]</span></code></code> will match either <code><code style="white-space: pre-wrap">a</code></code>, <code><code style="white-space: pre-wrap">b</code></code> or <code><code style="white-space: pre-wrap">c</code></code>.</p>
<p>and <code><code style="white-space: pre-wrap"><span style="color: #d73a49">[</span>ab(?:c)<span style="color: #d73a49">]</span></code></code> will match either <code><code style="white-space: pre-wrap">a</code></code>, <code><code style="white-space: pre-wrap">b</code></code>, <code><code style="white-space: pre-wrap">(</code></code>, <code><code style="white-space: pre-wrap">?</code></code>, <code><code style="white-space: pre-wrap">:</code></code>, <code><code style="white-space: pre-wrap">c</code></code>, or <code><code style="white-space: pre-wrap">)</code></code>.</p>
<p><a href="#char-groups">Character groups</a> and <a href="#escaped-chars">escaped characters</a> still work inside character sets.</p>
<p>Character sets can also contain ranges. For example: <code><code style="white-space: pre-wrap"><span style="color: #d73a49">[</span><span style="color: #b60157">0</span><span style="color: #b60157">-9</span><span style="color: #b60157">a</span><span style="color: #b60157">-z</span><span style="color: #d73a49">]</span></code></code> will match either any digit, or any lowercase letter.</p>
</div>
<div style="
">
<p><br></p>
<h2>Conclusion</h2>
<p>RegEx is perfect for when you just want to match some patterns, but the syntax can make patterns very hard to read or modify.</p>
<p>In the next article, we will start to dive into implementing RegEx.</p>
<p>Stay tuned!</p>
</div>
</body>
</html>