backrefs 8.0__tar.gz → 8.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. {backrefs-8.0 → backrefs-8.1}/PKG-INFO +3 -2
  2. {backrefs-8.0 → backrefs-8.1}/backrefs/__meta__.py +1 -1
  3. {backrefs-8.0 → backrefs-8.1}/docs/src/markdown/about/changelog.md +5 -1
  4. {backrefs-8.0 → backrefs-8.1}/docs/src/markdown/about/contributing.md +42 -15
  5. {backrefs-8.0 → backrefs-8.1}/docs/src/markdown/refs.md +1 -1
  6. {backrefs-8.0 → backrefs-8.1}/docs/src/markdown/usage.md +55 -78
  7. {backrefs-8.0 → backrefs-8.1}/hatch_build.py +1 -0
  8. {backrefs-8.0 → backrefs-8.1}/pyproject.toml +66 -37
  9. backrefs-8.1/tools/pycon.py +283 -0
  10. backrefs-8.0/docs/theme/assets/pymdownx-extras/extra-95634471d6.css +0 -2
  11. backrefs-8.0/docs/theme/assets/pymdownx-extras/extra-loader-Ccztcqfq.js +0 -4
  12. backrefs-8.0/docs/theme/main.html +0 -17
  13. backrefs-8.0/requirements/docs.txt +0 -4
  14. backrefs-8.0/requirements/lint.txt +0 -1
  15. backrefs-8.0/requirements/test.txt +0 -4
  16. {backrefs-8.0 → backrefs-8.1}/.coveragerc +0 -0
  17. {backrefs-8.0 → backrefs-8.1}/.gitignore +0 -0
  18. {backrefs-8.0 → backrefs-8.1}/.pyspelling.yml +0 -0
  19. {backrefs-8.0 → backrefs-8.1}/LICENSE.md +0 -0
  20. {backrefs-8.0 → backrefs-8.1}/README.md +0 -0
  21. {backrefs-8.0 → backrefs-8.1}/backrefs/__init__.py +0 -0
  22. {backrefs-8.0 → backrefs-8.1}/backrefs/_bre_parse.py +0 -0
  23. {backrefs-8.0 → backrefs-8.1}/backrefs/_bregex_parse.py +0 -0
  24. {backrefs-8.0 → backrefs-8.1}/backrefs/_bregex_typing.py +0 -0
  25. {backrefs-8.0 → backrefs-8.1}/backrefs/bre.py +0 -0
  26. {backrefs-8.0 → backrefs-8.1}/backrefs/bregex.py +0 -0
  27. {backrefs-8.0 → backrefs-8.1}/backrefs/py.typed +0 -0
  28. {backrefs-8.0 → backrefs-8.1}/backrefs/uniprops/__init__.py +0 -0
  29. {backrefs-8.0 → backrefs-8.1}/backrefs/util.py +0 -0
  30. {backrefs-8.0 → backrefs-8.1}/docs/src/markdown/.snippets/links.md +0 -0
  31. {backrefs-8.0 → backrefs-8.1}/docs/src/markdown/about/license.md +0 -0
  32. {backrefs-8.0 → backrefs-8.1}/docs/src/markdown/about/security.md +0 -0
  33. {backrefs-8.0 → backrefs-8.1}/docs/src/markdown/index.md +0 -0
  34. {backrefs-8.0 → backrefs-8.1}/docs/theme/announce.html +0 -0
  35. {backrefs-8.0 → backrefs-8.1}/tests/__init__.py +0 -0
  36. {backrefs-8.0 → backrefs-8.1}/tests/test_age.py +0 -0
  37. {backrefs-8.0 → backrefs-8.1}/tests/test_bidiclass.py +0 -0
  38. {backrefs-8.0 → backrefs-8.1}/tests/test_bidipairedbrackettype.py +0 -0
  39. {backrefs-8.0 → backrefs-8.1}/tests/test_binary.py +0 -0
  40. {backrefs-8.0 → backrefs-8.1}/tests/test_block.py +0 -0
  41. {backrefs-8.0 → backrefs-8.1}/tests/test_bre.py +0 -0
  42. {backrefs-8.0 → backrefs-8.1}/tests/test_bregex.py +0 -0
  43. {backrefs-8.0 → backrefs-8.1}/tests/test_canonicalcombiningclass.py +0 -0
  44. {backrefs-8.0 → backrefs-8.1}/tests/test_decompositiontype.py +0 -0
  45. {backrefs-8.0 → backrefs-8.1}/tests/test_eastasianwidth.py +0 -0
  46. {backrefs-8.0 → backrefs-8.1}/tests/test_generalcategory.py +0 -0
  47. {backrefs-8.0 → backrefs-8.1}/tests/test_graphemeclusterbreak.py +0 -0
  48. {backrefs-8.0 → backrefs-8.1}/tests/test_hangulsyllabletype.py +0 -0
  49. {backrefs-8.0 → backrefs-8.1}/tests/test_indicpositionalcategory.py +0 -0
  50. {backrefs-8.0 → backrefs-8.1}/tests/test_indicsylabiccategory.py +0 -0
  51. {backrefs-8.0 → backrefs-8.1}/tests/test_joininggroup.py +0 -0
  52. {backrefs-8.0 → backrefs-8.1}/tests/test_joiningtype.py +0 -0
  53. {backrefs-8.0 → backrefs-8.1}/tests/test_linebreak.py +0 -0
  54. {backrefs-8.0 → backrefs-8.1}/tests/test_numerictype.py +0 -0
  55. {backrefs-8.0 → backrefs-8.1}/tests/test_numericvalue.py +0 -0
  56. {backrefs-8.0 → backrefs-8.1}/tests/test_quickcheck.py +0 -0
  57. {backrefs-8.0 → backrefs-8.1}/tests/test_script.py +0 -0
  58. {backrefs-8.0 → backrefs-8.1}/tests/test_scriptextensions.py +0 -0
  59. {backrefs-8.0 → backrefs-8.1}/tests/test_sentencebreak.py +0 -0
  60. {backrefs-8.0 → backrefs-8.1}/tests/test_uniprops.py +0 -0
  61. {backrefs-8.0 → backrefs-8.1}/tests/test_versions.py +0 -0
  62. {backrefs-8.0 → backrefs-8.1}/tests/test_verticalorientation.py +0 -0
  63. {backrefs-8.0 → backrefs-8.1}/tests/test_wordbreak.py +0 -0
  64. {backrefs-8.0 → backrefs-8.1}/tools/__init__.py +0 -0
  65. {backrefs-8.0 → backrefs-8.1}/tools/unicodedata/13.0.0.zip +0 -0
  66. {backrefs-8.0 → backrefs-8.1}/tools/unicodedata/14.0.0.zip +0 -0
  67. {backrefs-8.0 → backrefs-8.1}/tools/unicodedata/15.0.0.zip +0 -0
  68. {backrefs-8.0 → backrefs-8.1}/tools/unicodedata/15.1.0.zip +0 -0
  69. {backrefs-8.0 → backrefs-8.1}/tools/unicodedata/16.0.0.zip +0 -0
  70. {backrefs-8.0 → backrefs-8.1}/tools/unicodedata/17.0.0.zip +0 -0
  71. {backrefs-8.0 → backrefs-8.1}/tools/unicodedata/LICENSE +0 -0
  72. {backrefs-8.0 → backrefs-8.1}/tools/unidatadownload.py +0 -0
  73. {backrefs-8.0 → backrefs-8.1}/tools/unipropgen.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: backrefs
3
- Version: 8.0
3
+ Version: 8.1
4
4
  Summary: A wrapper around re and regex that adds additional back references.
5
5
  Project-URL: Homepage, https://github.com/facelessuser/backrefs
6
6
  Author-email: Isaac Muse <Isaac.Muse@gmail.com>
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Programming Language :: Python :: 3.13
20
20
  Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Programming Language :: Python :: 3.15
21
22
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
23
  Classifier: Typing :: Typed
23
24
  Requires-Python: >=3.10
@@ -193,5 +193,5 @@ def parse_version(ver: str) -> Version:
193
193
  return Version(major, minor, micro, release, pre, post, dev)
194
194
 
195
195
 
196
- __version_info__ = Version(8, 0, 0, "final")
196
+ __version_info__ = Version(8, 1, 0, "final")
197
197
  __version__ = __version_info__._get_canonical()
@@ -3,6 +3,10 @@ icon: lucide/scroll-text
3
3
  ---
4
4
  # Changelog
5
5
 
6
+ ## 8.1
7
+
8
+ - **NEW**: Add official support for Python 3.15.
9
+
6
10
  ## 8.0
7
11
 
8
12
  - **NEW**: Backrefs will preemptively fail, raising a `PatternError`, if parsing and finding an unterminated character
@@ -132,7 +136,7 @@ icon: lucide/scroll-text
132
136
  to improve result.
133
137
  - **NEW**: POSIX style properties now handle all existing Unicode properties.
134
138
  - **NEW**: POSIX properties now follow the [Unicode specification for POSIX compatibility][unicode-posix].
135
- Read the [documentation](../refs.md#posix-style-properties) to learn more.
139
+ Read the [documentation](../refs.md#posix-character-classes) to learn more.
136
140
  - **NEW**: Unicode properties are now sensitive to the `ASCII` flag and will properly restrict the range of properties
137
141
  to the ASCII range even in Unicode strings.
138
142
  - **NEW**: Removed the old deprecated search references: `\l`, `\L`, `\c`, and `\C`. These are available in various
@@ -45,6 +45,12 @@ any tier you feel comfortable with. No amount is too little. We also accept one
45
45
  Take part in reviewing pull requests and/or reviewing direct commits. Make suggestions to improve the code and discuss
46
46
  solutions to overcome weakness in the algorithm.
47
47
 
48
+ ## Answer Questions in Issues
49
+
50
+ Take time and answer questions and offer suggestions to people who've created issues in the issue tracker. Often people
51
+ will have questions that you might have an answer for. Or maybe you know how to help them accomplish a specific task
52
+ they are asking about. Feel free to share your experience to help others.
53
+
48
54
  ## Pull Requests
49
55
 
50
56
  Pull requests are welcome, and if you plan on contributing directly to the code, there are a couple of things to be
@@ -55,23 +61,28 @@ tests will automatically be run, and the request must pass to be accepted. You
55
61
  pull requesting. If it is not possible to run these tests locally, they will be run when the pull request is made, but
56
62
  it is strongly suggested that requesters make an effort to verify before requesting to allow for a quick, smooth merge.
57
63
 
58
- Feel free to use a virtual environment if you are concerned about installing any of the Python packages.
59
-
60
64
  ### Running Validation Tests
61
65
 
62
- 1. Make sure that [Tox][tox] is installed:
66
+ In order to preserve good code health, a test suite has been put together with `pytest` (@pytest-dev/pytest). There are
67
+ currently two kinds of tests: syntax and targeted. To run these tests, you can use the following command:
63
68
 
64
- ```
65
- pip install tox
66
- ```
69
+ If you wish to run the tests locally, just run:
67
70
 
68
- 2. Run Tox:
71
+ ```console
72
+ $ hatch run +py=3.14 dev:tests
73
+ ```
69
74
 
70
- ```
71
- tox
72
- ```
75
+ Coding standards are enforced using @astral-sh/ruff. The environment can be setup and run as shown below.
73
76
 
74
- Tox should install necessary dependencies and run the tests.
77
+ ```console
78
+ $ hatch run +py=3.14 dev:lint
79
+ ```
80
+
81
+ We use @python/mypy to enforce typing. It can be run as shown below.
82
+
83
+ ```console
84
+ $ hatch run +py=3.14 dev:mypy
85
+ ```
75
86
 
76
87
  ## Documentation Improvements
77
88
 
@@ -80,7 +91,23 @@ you feel it is still lacking, show your appreciation for the plugin by helping t
80
91
  documentation is always appreciated and can be done via pull requests. There shouldn't be any need to run validation
81
92
  tests if only updating documentation.
82
93
 
83
- You don't have to render the docs locally before pull requesting, but if you wish to, I currently use a combination of
84
- [MkDocs][mkdocs], the [Material theme][mkdocs-material], and [PyMdown Extensions][pymdown-extensions] to render the
85
- docs. You can preview the docs if you install these two packages. The command for previewing the docs is `mkdocs serve`
86
- from the root directory. You can then view the documents at `localhost:8000`.
94
+ Documents are in Markdown (with some additional syntax) and converted to HTML via Python Markdown and this extension
95
+ bundle. The documentation site is built with @zensical/zensical.
96
+
97
+ To build docs:
98
+
99
+ ```console
100
+ $ hatch run docs:build
101
+ ```
102
+
103
+ To serve docs and to live preview in a browser:
104
+
105
+ ```console
106
+ $ hatch run docs:serve
107
+ ```
108
+
109
+ To clean the documents:
110
+
111
+ ```console
112
+ $ hatch run docs:clean
113
+ ```
@@ -23,7 +23,7 @@ Back\ References | Description
23
23
  `\pX` | Unicode property character class where `X` is the uppercase letter that represents the General Category property. For instance, `\pL` would be equivalent to `\p{L}` or `\p{Letter}`.
24
24
  `\P{UnicodeProperty}` | Inverse Unicode property character class. Can be used in character classes `[]`. See [Unicode Properties](#unicode-properties) for more info.
25
25
  `\PX` | Inverse Unicode property character class where `X` is the uppercase letter that represents the General Category property. For instance, `\PL` would be equivalent to `\P{L}` or `\P{Letter}`.
26
- `[[:alnum:]]` | Though not really a back reference, support for POSIX style character classes is available. See [POSIX Style Properties](#posix-style-properties) for more info.
26
+ `[[:alnum:]]` | Though not really a back reference, support for POSIX style character classes is available. See [POSIX Style Properties](#posix-character-classes) for more info.
27
27
  `\N{UnicodeName}` | Named characters are normally ignored in Re, but Backrefs adds support for them.
28
28
  `\m` | Start word boundary. Translates to `\b(?=\w)`.
29
29
  `\M` | End word boundary. Translates to `\b(?<=\w)`.
@@ -19,9 +19,8 @@ Backrefs preprocesses search patterns looking for new syntax that it replaces wi
19
19
  the given regular expression engine. For instance, Backrefs implements the `\R` reference in Re, and when compiled, we
20
20
  get an Re object with a regular expression pattern that captures various line breaks.
21
21
 
22
- ```pycon3
23
- >>> bre.compile(r'\R')
24
- backrefs.bre.Bre(re.compile('(?:\\r\\n|(?!\\r\\n)[\\n\\v\\f\\r\\x85\\u2028\\u2029])'), auto_compile=True)
22
+ ```py play
23
+ bre.compile(r'\R')
25
24
  ```
26
25
 
27
26
  It can be seen that the Backrefs object is simply wrapped around an Re compiled pattern, and we see that `\R` was
@@ -29,16 +28,14 @@ replaced with `(?:\\r\\n|(?!\\r\\n)[\\n\\v\\f\\r\\x85\\u2028\\u2029])`.
29
28
 
30
29
  This basic approach is used to implement all sorts of references from Unicode properties:
31
30
 
32
- ```pycon3
33
- >>> bre.compile(r'test \p{Cs}')
34
- backrefs.bre.Bre(re.compile('test [\ud800\udb7f-\udb80\udbff-\udc00\udfff]'), auto_compile=True)
31
+ ```py play
32
+ bre.compile(r'test \p{Cs}')
35
33
  ```
36
34
 
37
35
  To start and end word boundaries:
38
36
 
39
- ```pycon3
40
- >>> bre.compile(r'\mtest\M')
41
- backrefs.bre.Bre(re.compile('\\b(?=\\w)test\\b(?<=\\w)'), auto_compile=True)
37
+ ```py play
38
+ bre.compile(r'\mtest\M')
42
39
  ```
43
40
 
44
41
  A compiled Backrefs object has all the same functions as the regular expression's object, so you can use it in the same
@@ -46,16 +43,14 @@ way to perform splits, matches, substitutions, and anything else.
46
43
 
47
44
  If we wanted to match a line ending, we could call `prefixmatch` (or the legacy alias of `match`) or `search`.
48
45
 
49
- ```pycon
50
- >>> bre.compile(r'\R').prefixmatch('\n')
51
- <re.Match object; span=(0, 1), match='\n'>
46
+ ```py play
47
+ bre.compile(r'\R').match('\n')
52
48
  ```
53
49
 
54
50
  Matches can also be preformed without pre-compiling.
55
51
 
56
- ```pycon
57
- >>> bre.prefixmatch(r'\R', '\n')
58
- <re.Match object; span=(0, 1), match='\n'>
52
+ ```py play
53
+ bre.match(r'\R', '\n')
59
54
  ```
60
55
 
61
56
  ## Replacements
@@ -73,10 +68,9 @@ replacement and inject new functionality on substitution.
73
68
  For instance, here we use the start and end markers of `\C` and `\E` to specify that the content in between should be
74
69
  capitalized. Traditionally, `\U` and `\E` is used, but since `\U` is a Unicode escape in Python, we chose to use `\C`.
75
70
 
76
- ```pycon3
77
- >>> pattern = bre.compile(r'(\p{Letter}+)')
78
- >>> pattern.sub(r'\C\1\E', 'sometext')
79
- 'SOMETEXT'
71
+ ```py play
72
+ pattern = bre.compile(r'(\p{Letter}+)')
73
+ pattern.sub(r'\C\1\E', 'sometext')
80
74
  ```
81
75
 
82
76
  ## Format Replacements
@@ -88,11 +82,9 @@ Originally, this feature was developed in Regex to allow accessing specific capt
88
82
  are made. For Regex, this makes a lot of sense as the library actually tracks all captures for a group. Each capture
89
83
  can be indexed individually using the format string format.
90
84
 
91
- ```pycon3
92
- >>> regex.subf(r"(?:(\w+) ){2}(\w+)", "{0} => {1[0]} {1[1]} {2}", "foo bar baz")
93
- 'foo bar baz => foo bar baz'
94
- >>> regex.subf(r"(?:(?P<word1>\w+) ){2}(?P<word2>\w+)", "{0} => {word1[0]} {word1[1]} {word2}", "foo bar baz")
95
- 'foo bar baz => foo bar baz'
85
+ ```py play
86
+ regex.subf(r"(?:(\w+) ){2}(\w+)", "{0} => {1[0]} {1[1]} {2}", "foo bar baz")
87
+ regex.subf(r"(?:(?P<word1>\w+) ){2}(?P<word2>\w+)", "{0} => {word1[0]} {word1[1]} {word2}", "foo bar baz")
96
88
  ```
97
89
 
98
90
  The Re engine does not track multiple captures for a single group -- something we cannot change -- and instead only
@@ -100,9 +92,8 @@ captures the last capture. Format strings in Re will only provide the last captu
100
92
  into different captures instead of accepting the default, you will only be able to reference the last one. If at some
101
93
  point in the future, Re begins to track all captures, then this feature will be updated to reflect such changes.
102
94
 
103
- ```pycon3
104
- >>> bre.subf(r"(?:(\w+) ){2}(\w+)", "{0} => {1[0]} {1[-1]} {2}", "foo bar baz")
105
- 'foo bar baz => bar bar baz'
95
+ ```py play
96
+ bre.subf(r"(?:(\w+) ){2}(\w+)", "{0} => {1[0]} {1[-1]} {2}", "foo bar baz")
106
97
  ```
107
98
 
108
99
  While Re does not really expose multiple captures, this doesn't mean the format string is of no use to Re. For one, the
@@ -113,35 +104,30 @@ By default, Python's Re requires groups to be specified via `\1` or `\g<name>`,
113
104
  When using Backrefs' format replace, it should feel similar to Regex's format replace, except you will generally use raw
114
105
  strings to allow for back slash references.
115
106
 
116
- ```pycon3
117
- >>> bregex.subf(r"(\w+) (\w+)", r"{0} => {2} {1}", "foo bar")
118
- 'foo bar => bar foo'
119
- >>> bregex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", r"{word2} {word1}", "foo bar")
120
- 'bar foo'
107
+ ```py play
108
+ bregex.subf(r"(\w+) (\w+)", r"{0} => {2} {1}", "foo bar")
109
+ bregex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", r"{word2} {word1}", "foo bar")
121
110
  ```
122
111
 
123
112
  You can index into groups that have multiple captures, and while it works for both Re and Regex, it is only useful when
124
113
  using `bregex`.
125
114
 
126
- ```pycon3
127
- >>> bregex.subf(r"(\w)+ (\w+)", "{0} => {2} {1[0]}", "foo bar")
128
- 'foo bar => bar f'
115
+ ```py play
116
+ bregex.subf(r"(\w)+ (\w+)", "{0} => {2} {1[0]}", "foo bar")
129
117
  ```
130
118
 
131
119
  You can also use `{} {}` which is the same as `{0} {1}`.
132
120
 
133
- ```pycon3
134
- >>> bre.subf(r"(\w+) (\w+)", r"{} => \C{} {}\E", "foo bar")
135
- 'foo bar => FOO BAR'
121
+ ```py play
122
+ bre.subf(r"(\w+) (\w+)", r"{} => \C{} {}\E", "foo bar")
136
123
  ```
137
124
 
138
125
  Backrefs also provides an `expand` variant for format templates called `expandf`.
139
126
 
140
- ```pycon3
141
- >>> pattern = bre.compile_search(r"(\w+) (\w+)")
142
- >>> m = pattern.prefixmatch('foo bar')
143
- >>> bre.expandf(m, r"{0} => {2} {1}")
144
- 'foo bar => bar foo'
127
+ ```py play
128
+ pattern = bre.compile_search(r"(\w+) (\w+)")
129
+ m = pattern.match('foo bar')
130
+ bre.expandf(m, r"{0} => {2} {1}")
145
131
  ```
146
132
 
147
133
  ### Enhancements
@@ -155,20 +141,17 @@ why.
155
141
  along side brace replacements. This means you can use string back references and built-in Backrefs features like
156
142
  `\C...\E` or `\L...\E`.
157
143
 
158
- ```pycon3
159
- >>> bre.subf(r"(\w+) (\w+)", r"{0} => \C{2} {1}\E", "foo bar")
160
- 'foo bar => BAR FOO'
161
- >>> bregex.subf(r"(\w+) (\w+)", r"{0} => \C{2} {1}\E", "foo bar")
162
- 'foo bar => BAR FOO'
144
+ ```py play
145
+ bre.subf(r"(\w+) (\w+)", r"{0} => \C{2} {1}\E", "foo bar")
146
+ bregex.subf(r"(\w+) (\w+)", r"{0} => \C{2} {1}\E", "foo bar")
163
147
  ```
164
148
 
165
149
  2. The second enhancement that Backrefs adds is the ability to use format string alignment features. In the following
166
150
  example, we center the replacement and pad it out to 8 characters using `|` for the padding. We also use casing
167
151
  references (`\C...\E`) to capitalize the replacement group.
168
152
 
169
- ```pycon3
170
- >>> bregex.subf(r'(test)', r'\C{0:|^8}\E', 'test')
171
- '||TEST||'
153
+ ```py play
154
+ bregex.subf(r'(test)', r'\C{0:|^8}\E', 'test')
172
155
  ```
173
156
 
174
157
  Backrefs implements a subset of the [Format Specification Mini-Language][format-spec] (`format_spec`) that allows
@@ -198,9 +181,8 @@ why.
198
181
  strings to work for byte strings as well as Unicode strings. This is something that Regex does not allow without
199
182
  Backrefs.
200
183
 
201
- ```pycon3
202
- >>> bre.subf(br'(test)', br'\C{0:|^8}\E', b'test')
203
- b'||TEST||'
184
+ ```py play
185
+ bre.subf(br'(test)', br'\C{0:|^8}\E', b'test')
204
186
  ```
205
187
 
206
188
  > [!note] Conversion Syntax and Bytes
@@ -216,45 +198,40 @@ the replace features seamlessly without the user having to do anything extra. Bu
216
198
  features, the `compile_search` method can be used to compile the pattern and directly return the regular expression
217
199
  object with no wrapper:
218
200
 
219
- ```pycon3
220
- >>> bre.compile_search(r'(\p{ascii}+)')
221
- re.compile('([\x00-\x7f]+)')
201
+ ```py play
202
+ bre.compile_search(r'(\p{ascii}+)')
222
203
  ```
223
204
 
224
205
  Conversely, we could only use the replace features by compiling the pattern normally and giving it to the Backrefs API
225
206
  to create a replace object:
226
207
 
227
- ```pycon3
228
- >>> pattern = re.compile(r'(\w+)')
229
- >>> replace = bre.compile_replace(pattern, r'\C\1\E')
230
- >>> pattern.sub(replace, 'text')
231
- 'TEXT'
208
+ ```py play
209
+ pattern = re.compile(r'(\w+)')
210
+ replace = bre.compile_replace(pattern, r'\C\1\E')
211
+ pattern.sub(replace, 'text')
232
212
  ```
233
213
 
234
214
  You can also compile a replacement object directly from a `backrefs` object:
235
215
 
236
- ```pycon3
237
- >>> pattern = bre.compile(r'(\w+)')
238
- >>> replace = pattern.compile(r'\C\1\E')
239
- >>> pattern.sub(replace, 'text')
240
- 'TEXT'
216
+ ```py play
217
+ pattern = bre.compile(r'(\w+)')
218
+ replace = pattern.compile(r'\C\1\E')
219
+ pattern.sub(replace, 'text')
241
220
  ```
242
221
 
243
222
  To pre-compile a format replace template, you can use the Backrefs' `compile_replace` method with the `FORMAT` flag.
244
223
 
245
- ```pycon3
246
- >>> pattern = bre.compile_search(r"(\w+) (\w+)")
247
- >>> replace = bre.compile_replace(pattern, r"{0} => {2} {1}", bre.FORMAT)
248
- >>> m = pattern.prefixmatch("foo bar")
249
- >>> replace(m)
250
- 'foo bar => bar foo'
224
+ ```py play
225
+ pattern = bre.compile_search(r"(\w+) (\w+)")
226
+ replace = bre.compile_replace(pattern, r"{0} => {2} {1}", bre.FORMAT)
227
+ m = pattern.match("foo bar")
228
+ replace(m)
251
229
  ```
252
230
 
253
231
  Pre-compiled pattern objects can also create a compiled format replace object using the `FORMAT` flag.
254
232
 
255
- ```pycon3
256
- >>> pattern = bre.compile(r"(?P<word1>\w+) (?P<word2>\w+)")
257
- >>> replace = pattern.compile(r"\c{word2} \c{word1}", bre.FORMAT)
258
- >>> pattern.subf(replace, "foo bar")
259
- 'Bar Foo'
233
+ ```py play
234
+ pattern = bre.compile(r"(?P<word1>\w+) (?P<word2>\w+)")
235
+ replace = pattern.compile(r"\c{word2} \c{word1}", bre.FORMAT)
236
+ pattern.subf(replace, "foo bar")
260
237
  ```
@@ -79,6 +79,7 @@ class CustomMetadataHook(MetadataHookInterface):
79
79
  'Programming Language :: Python :: 3.12',
80
80
  'Programming Language :: Python :: 3.13',
81
81
  'Programming Language :: Python :: 3.14',
82
+ 'Programming Language :: Python :: 3.15',
82
83
  'Topic :: Software Development :: Libraries :: Python Modules',
83
84
  'Typing :: Typed'
84
85
  ]
@@ -130,41 +130,70 @@ lint.ignore = [
130
130
  "RUF100"
131
131
  ]
132
132
 
133
- [tool.tox]
134
- legacy_tox_ini = """
135
- [tox]
136
- isolated_build = true
137
- envlist =
138
- py310,py311,py312,py313,py314,
139
- lint
140
-
141
- [testenv]
142
- passenv = *
143
- deps=
144
- .[extras]
145
- -r requirements/test.txt
146
- commands=
147
- {envpython} tools/unidatadownload.py
148
- {envpython} tools/unipropgen.py backrefs/uniprops/unidata
149
- {envpython} -m mypy
150
- {envpython} -m pytest --cov backrefs --cov-append tests
151
- {envpython} -m coverage html -d {envtmpdir}/coverage
152
- {envpython} -m coverage xml
153
- {envpython} -m coverage report --show-missing
154
-
155
- [testenv:documents]
156
- passenv = *
157
- deps=
158
- -r requirements/docs.txt
159
- commands=
160
- {envbindir}/zensical build -f zensical.yml --clean
161
- {envbindir}/pyspelling
162
-
163
- [testenv:lint]
164
- passenv = *
165
- deps=
166
- .
167
- -r requirements/lint.txt
168
- commands=
169
- "{envbindir}"/ruff check .
133
+ [tool.hatch.envs.dev]
134
+ dependencies = [
135
+ "pytest",
136
+ "pytest-cov",
137
+ "coverage",
138
+ "mypy",
139
+ "ruff",
140
+ "build",
141
+ "regex"
142
+ ]
143
+
144
+ [tool.hatch.envs.docs]
145
+ dependencies = [
146
+ "zensical",
147
+ "markdown",
148
+ "pymdown-extensions",
149
+ "zensical-pymdownx @ git+https://github.com/facelessuser/pymdownx-zensical-theme.git",
150
+ "pymdown_lexers @ git+https://github.com/facelessuser/pymdown-lexers.git",
151
+ "pyspelling",
152
+ "build",
153
+ "python-minifier",
154
+ "regex"
155
+ ]
156
+
157
+ [[tool.hatch.envs.dev.matrix]]
158
+ python = ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15"]
159
+
160
+ [[tool.hatch.envs.dev-stdlib.matrix]]
161
+ python = ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15"]
162
+
163
+ [tool.hatch.envs.dev.scripts]
164
+ types = """
165
+ python tools/unidatadownload.py && \
166
+ python tools/unipropgen.py backrefs/uniprops/unidata && \
167
+ mypy
168
+ """
169
+ tests = """
170
+ python tools/unidatadownload.py && \
171
+ python tools/unipropgen.py backrefs/uniprops/unidata && \
172
+ pytest --cov backrefs --cov-append --cov-report term-missing --cov-report xml --cov-report html:.cov tests
173
+ """
174
+ lint = 'ruff check .'
175
+
176
+ [tool.hatch.envs.dev-stdlib.scripts]
177
+ tests = "pytest --cov pymdownx --cov-append --cov-report term-missing --cov-report xml --cov-report html:.cov tests"
178
+
179
+ [tool.hatch.envs.docs.scripts]
180
+ spellcheck = """
181
+ python tools/unidatadownload.py && \
182
+ python tools/unipropgen.py backrefs/uniprops/unidata && \
183
+ python -m zensical.main build -f zensical.yml --clean --strict; pyspelling -j 8
184
+ """
185
+ clean = """
186
+ python tools/unidatadownload.py && \
187
+ python tools/unipropgen.py backrefs/uniprops/unidata && \
188
+ python -m zensical.main build -f zensical.yml --clean
189
+ """
190
+ serve = """
191
+ python tools/unidatadownload.py && \
192
+ python tools/unipropgen.py backrefs/uniprops/unidata && \
193
+ python -m zensical.main serve -f zensical.yml
170
194
  """
195
+ build = """
196
+ python tools/unidatadownload.py && \
197
+ python tools/unipropgen.py backrefs/uniprops/unidata && \
198
+ python -m zensical.main build -f zensical.yml --clean
199
+ """
@@ -0,0 +1,283 @@
1
+ """
2
+ Execute Python code in code blocks and construct a interactive Python console output.
3
+
4
+ This allows you to write code examples, but then execute them, showing the results.
5
+ """
6
+ from functools import partial
7
+ import ast
8
+ import re
9
+ from io import StringIO
10
+ import sys
11
+ from pygments import highlight
12
+ from pygments.lexers import get_lexer_by_name
13
+ from pygments.formatters import find_formatter_class
14
+ import code
15
+
16
+ PY310 = (3, 10) <= sys.version_info
17
+ PY311 = (3, 11) <= sys.version_info
18
+
19
+ RE_INIT = re.compile(r'^\s*#\s*pragma:\s*init\n(.*?)#\s*pragma:\s*init\n', re.DOTALL | re.I)
20
+
21
+ AST_BLOCKS = (
22
+ ast.If,
23
+ ast.For,
24
+ ast.While,
25
+ ast.Try,
26
+ ast.With,
27
+ ast.FunctionDef,
28
+ ast.ClassDef,
29
+ ast.AsyncFor,
30
+ ast.AsyncWith,
31
+ ast.AsyncFunctionDef
32
+ )
33
+
34
+ if PY310:
35
+ AST_BLOCKS = AST_BLOCKS + (ast.Match,)
36
+
37
+ if PY311:
38
+ AST_BLOCKS = AST_BLOCKS + (ast.TryStar,)
39
+
40
+
41
+ if 'SESSIONS' not in globals() or not globals()["SESSIONS"]:
42
+ SESSIONS = {}
43
+
44
+
45
+ def reset():
46
+ """Reset hook."""
47
+
48
+ SESSIONS.clear()
49
+
50
+
51
+ class IPY(code.InteractiveInterpreter):
52
+ """Handle code."""
53
+
54
+ def __init__(self, show_except=True, locals=None): # noqa: A002
55
+ """Initialize."""
56
+
57
+ super().__init__(locals=locals)
58
+
59
+ self.show_except = show_except
60
+
61
+ def set_exceptions(self, enable):
62
+ """Set exceptions handling."""
63
+
64
+ self.show_except = enable
65
+
66
+ def write(self, data):
67
+ """Write."""
68
+
69
+ if not self.show_except:
70
+ raise RuntimeError(data)
71
+
72
+ sys.stdout.write(data)
73
+
74
+
75
+ class StreamOut:
76
+ """Override the standard out."""
77
+
78
+ def __init__(self):
79
+ """Initialize."""
80
+ self.old = sys.stdout
81
+ self.stdout = StringIO()
82
+ sys.stdout = self.stdout
83
+
84
+ def read(self):
85
+ """Read the `stringIO` buffer."""
86
+
87
+ value = ''
88
+ if self.stdout is not None:
89
+ self.stdout.flush()
90
+ value = self.stdout.getvalue()
91
+ self.stdout = StringIO()
92
+ sys.stdout = self.stdout
93
+ return value
94
+
95
+ def __enter__(self):
96
+ """Enter."""
97
+ return self
98
+
99
+ def __exit__(self, type, value, traceback): # noqa: A002
100
+ """Exit."""
101
+
102
+ sys.stdout = self.old
103
+ self.old = None
104
+ self.stdout = None
105
+
106
+
107
+ def execute(cmd, no_except=True, init='', ipy=None, g=None):
108
+ """Execute color commands."""
109
+
110
+ # Setup global initialization
111
+ if g is None:
112
+ g = {}
113
+
114
+ # Setup global initialization
115
+ if ipy is None:
116
+ ipy = IPY(show_except=not no_except, locals=g)
117
+ if init:
118
+ ipy.set_exceptions(False)
119
+ execute(init.strip(), ipy=ipy, g=g)
120
+ ipy.set_exceptions(not no_except)
121
+
122
+ console = ''
123
+
124
+ # Build `AST` tree
125
+ m = RE_INIT.match(cmd)
126
+ if m:
127
+ block_init = m.group(1)
128
+ src = cmd[m.end():]
129
+ ipy.set_exceptions(False)
130
+ execute(block_init, ipy=ipy, g=g)
131
+ ipy.set_exceptions(not no_except)
132
+ else:
133
+ src = cmd
134
+ lines = src.split('\n')
135
+ try:
136
+ tree = ast.parse(src)
137
+ except Exception as e:
138
+ if no_except:
139
+ from pymdownx.superfences import SuperFencesException
140
+ raise SuperFencesException from e
141
+ import traceback
142
+ return '{}'.format(traceback.format_exc())
143
+
144
+ for node in tree.body:
145
+ result = []
146
+
147
+ # Format source as Python console statements
148
+ start = node.lineno
149
+ end = node.end_lineno
150
+ stmt = lines[start - 1: end]
151
+ command = ''
152
+ payload = '\n'.join(stmt)
153
+ block = False
154
+ for i, line in enumerate(stmt, 0):
155
+ if i == 0:
156
+ stmt[i] = '>>> ' + line
157
+ else:
158
+ stmt[i] = '... ' + line
159
+ if stmt:
160
+ command += '\n'.join(stmt)
161
+ if isinstance(node, AST_BLOCKS):
162
+ block = True
163
+ command += '\n... '
164
+
165
+ try:
166
+ # Capture anything sent to standard out
167
+ with StreamOut() as s:
168
+ # Execute code
169
+ ipy.runsource(payload, symbol='single' if not block else 'exec')
170
+
171
+ # Output captured standard out after statements
172
+ text = s.read()
173
+ if text:
174
+ result.append(text)
175
+
176
+ # Execution went well, so append command
177
+ console += command
178
+
179
+ except Exception as e:
180
+ if no_except:
181
+ from pymdownx.superfences import SuperFencesException
182
+ raise SuperFencesException from e
183
+ import traceback
184
+ console += '{}\n{}'.format(command, traceback.format_exc())
185
+ # Failed for some reason, so quit
186
+ break
187
+
188
+ # If we got a result, output it as well
189
+ console += '\n{}'.format(''.join(result))
190
+
191
+ return console
192
+
193
+
194
+ def colorize(src, lang, **options):
195
+ """Colorize."""
196
+
197
+ HtmlFormatter = find_formatter_class('html')
198
+ lexer = get_lexer_by_name(lang, **options)
199
+ formatter = HtmlFormatter(cssclass="highlight", wrapcode=True)
200
+ return highlight(src, lexer, formatter).strip()
201
+
202
+
203
+ def py_command_validator(language, inputs, options, attrs, md):
204
+ """Python validator."""
205
+
206
+ valid_inputs = {'exceptions', 'play'}
207
+
208
+ if not hasattr(md, 'pycon_sessions'):
209
+ md.pycon_sessions = {}
210
+
211
+ for k, v in inputs.items():
212
+ if k == 'session':
213
+ if v not in md.pycon_sessions:
214
+ md.pycon_sessions[v] = {}
215
+ options['session_name'] = v
216
+ options['session'] = md.pycon_sessions[v]
217
+ continue
218
+ if k in valid_inputs:
219
+ options[k] = True
220
+ continue
221
+ attrs[k] = v
222
+ return True
223
+
224
+
225
+ def py_command_reset(md):
226
+ """Reset."""
227
+
228
+ if hasattr(md, 'pycon_sessions'):
229
+ md.pycon_sessions.clear()
230
+
231
+
232
+ def _py_command_formatter(
233
+ src="",
234
+ language="",
235
+ class_name=None,
236
+ options=None,
237
+ md="",
238
+ init='',
239
+ **kwargs
240
+ ):
241
+ """Formatter wrapper."""
242
+
243
+ from pymdownx.superfences import SuperFencesException
244
+
245
+ try:
246
+ # Check if we should allow exceptions
247
+ exceptions = options.get('exceptions', False) if options is not None else False
248
+ run = options.get('play', False) if options is not None else False
249
+ session = options.get('session') if options is not None else None
250
+
251
+ if run:
252
+ console = execute(src.strip(), not exceptions, init=init, g=session)
253
+ language = 'pycon'
254
+ else:
255
+ console = src
256
+ language = 'py'
257
+
258
+ el = md.preprocessors['fenced_code_block'].extension.superfences[0]['formatter'](
259
+ src=console,
260
+ class_name="class_name",
261
+ language=language,
262
+ md=md,
263
+ options=options,
264
+ **kwargs
265
+ )
266
+ except SuperFencesException:
267
+ import traceback
268
+ print(src)
269
+ print(traceback.format_exc())
270
+ raise
271
+ except Exception:
272
+ from pymdownx import superfences
273
+ import traceback
274
+ print(src)
275
+ print(traceback.format_exc())
276
+ return superfences.fence_code_format(src, 'text', class_name, options, md, **kwargs)
277
+ return el
278
+
279
+
280
+ def py_command_formatter(init=''):
281
+ """Return a Python command formatter with the provided imports."""
282
+
283
+ return partial(_py_command_formatter, init=init)
@@ -1,2 +0,0 @@
1
- :root>*{--md-default-bg-color--trans: rgb(100%, 100%, 100%, 0);--md-tab-control-bg: var(--md-default-bg-color);--md-code-fg-color: #1F1F1F;--md-code-bg-color: #F5F5F5;--md-code-title-bg-color: #F5F5F5;--md-code-inline-bg-color: #F5F5F5;--md-code-hl-operator-color: #A3134D;--md-code-hl-punctuation-color: #1F1F1F;--md-code-hl-string-color: #836E15;--md-code-hl-special-color: #644AC9;--md-code-hl-number-color: #644AC9;--md-code-hl-keyword-color: #A3134D;--md-code-hl-name-color: #1F1F1F;--md-code-hl-constant-color: #644AC9;--md-code-hl-function-color: #14720A;--md-code-hl-comment-color: #635D97;--md-code-hl-variable-color: #A34D14;--md-code-hl-generic-color: #635D97;--md-code-hl-color: #CFCFDE;--md-code-hl-color--light: #DCDEEF;--md-typeset-table-color: rgb(0% 0% 0% / 15%);--md-code-hl-entity-color: #14720A;--md-code-hl-tag-color: #A3134D;--md-code-hl-namespace-color: #1F1F1F;--md-code-hl-builtin-color: #036A96;--md-code-hl-class-color: #036A96;--md-code-special-bg-color: #DCDEEF;--md-steps-bg-color: var(--md-code-bg-color);--md-steps-fg-color: var(--md-code-fg-color);--md-steps-border-color: hsla(0, 0%, 75%, 1);--md-typeset-a-color: #00bcd4;--md-progress-stripe: var(--md-default-bg-color--lighter);--md-progress-100: #00e676;--md-progress-80: #00e676;--md-progress-60: #fbc02d;--md-progress-40: #ff9100;--md-progress-20: #ff5252;--md-progress-0: #ff1744;--md-typeset-kbd-color: rgb(228.3721025416, 228.3721025416, 228.3721025416);--md-typeset-kbd-border-color: rgb(164.4010497691, 164.4010497691, 164.4010497691);--md-typeset-kbd-accent-color: hsla(0, 100%, 100%, 1)}:root>*[data-md-color-scheme=slate]{--md-default-fg-color: hsla(60, 30%, 96.078%, 0.87);--md-default-fg-color--light: hsla(60, 30%, 96.078%, 0.54);--md-default-fg-color--lighter: hsla(60, 30%, 96.078%, 0.36);--md-default-fg-color--lightest: hsla(60, 30%, 96.078%, 0.12);--md-default-autocomplete-fg-color: hsla(60, 30%, 96.078%, 0.4);--md-footer-fg-color: var(--md-default-fg-color);--md-default-bg-color: var(--md-default-bg-color--darkest);--md-default-bg-color--light: color(srgb 0.0327882794 0.0359366892 0.0551574304 / 0.7);--md-default-bg-color--lighter: color(srgb 0.0327882794 0.0359366892 0.0551574304 / 0.4);--md-default-bg-color--lightest: color(srgb 0.0327882794 0.0359366892 0.0551574304 / 0.1);--md-default-bg-color--trans: color(srgb 0.0327882794 0.0359366892 0.0551574304 / 0);--md-tab-control-bg: var(--md-default-bg-color--dark);--md-default-bg-color--dark: color(srgb 0.1147606354 0.1213715063 0.1588331081);--md-default-bg-color--darker: color(srgb 0.0781790415 0.0833653407 0.1127543696);--md-default-bg-color--darkest: color(srgb 0.0327882794 0.0359366892 0.0551574304);--md-text-color: var(--md-default-fg-color);--md-typeset-color: var(--md-default-fg-color);--md-admonition-fg-color: var(--md-default-fg-color);--md-code-fg-color: hsl(60, 30%, 96.078%);--md-code-bg-color: hsl(231, 15%, 18%);--md-code-title-bg-color: hsl(231, 15%, 18%);--md-code-inline-bg-color: hsl(231, 15%, 18%);--md-code-hl-operator-color: hsl(326, 100%, 74%);--md-code-hl-punctuation-color: hsl(60, 30%, 96.078%);--md-code-hl-string-color: hsl(65, 92%, 76%);--md-code-hl-special-color: hsl(265, 89%, 78%);--md-code-hl-number-color: hsl(265, 89%, 78%);--md-code-hl-keyword-color: hsl(326, 100%, 74%);--md-code-hl-name-color: hsl(60, 30%, 96.078%);--md-code-hl-constant-color: hsl(265, 89%, 78%);--md-code-hl-function-color: hsl(135, 94%, 65%);--md-code-hl-comment-color: hsl(225, 27%, 51%);--md-code-hl-variable-color: hsl(31, 100%, 71%);--md-code-hl-generic-color: hsl(225, 27%, 51%);--md-code-hl-color: hsl(231, 15%, 30%);--md-code-hl-color--light: hsl(231, 25%, 25%);--md-code-bg-color--light: hsla(231, 15%, 18%, 0.9);--md-code-bg-color--lighter: hsla(231, 15%, 18%, 0.5);--md-typeset-table-color: rgb(100% 100% 100% / 15%);--md-code-hl-entity-color: hsl(135, 94%, 65%);--md-code-hl-tag-color: hsl(326, 100%, 74%);--md-code-hl-namespace-color: hsl(60, 30%, 96.078%);--md-code-hl-builtin-color: hsl(191, 97%, 77%);--md-code-hl-class-color: hsl(191, 97%, 77%);--md-code-special-bg-color: hsl(231, 25%, 25%);--md-steps-border-color: hsl(230.6613379686, 10.4241713343%, 28.1575403575%);--md-typeset-a-color: hsl(191, 97%, 77%);--md-typeset-mark-color: hsl(75.3111515854, 11.5600114451%, 37.8888925515%);--md-typeset-del-color: hsl(314.8219481072, 22.0434125534%, 35.1703201111%);--md-typeset-ins-color: hsl(145.2334928709, 27.8121663576%, 33.1574755691%);--md-progress-stripe: var(--md-default-bg-color--lightest);--md-progress-100: hsl(135, 94%, 65%);--md-progress-80: hsl(96.9286079031, 93.5050765575%, 74.7933068737%);--md-progress-60: hsl(65, 92%, 76%);--md-progress-40: hsl(31, 100%, 71%);--md-progress-20: hsl(326, 100%, 74%);--md-progress-0: hsl(0, 100%, 67%);--md-typeset-kbd-color: var(--md-default-fg-color--lightest);--md-typeset-kbd-border-color: var(--md-default-bg-color--dark);--md-typeset-kbd-accent-color: var(--md-default-fg-color--lighter)}[data-md-color-scheme=slate][data-md-color-primary=red],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=red]{--md-primary-code-bg-color: hsl(332.2545890109, 15.8127407999%, 23.5759703429%);--md-primary-fg-color: hsla(0deg, 100%, 67%, 1);--md-primary-fg-color--transparent: hsla(0deg, 100%, 67%, 0.2);--md-primary-fg-color--light: hsla(0deg, 100%, 72%, 1);--md-primary-fg-color--dark: hsla(0deg, 100%, 62%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=pink],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=pink]{--md-primary-code-bg-color: hsl(288.4757168622, 14.8889902037%, 24.6712834924%);--md-primary-fg-color: hsla(326deg, 100%, 74%, 1);--md-primary-fg-color--transparent: hsla(326deg, 100%, 74%, 0.2);--md-primary-fg-color--light: hsla(326deg, 100%, 79%, 1);--md-primary-fg-color--dark: hsla(326deg, 100%, 69%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=purple],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=purple]{--md-primary-code-bg-color: hsl(248.4980702, 16.8923581309%, 26.4141657947%);--md-primary-fg-color: hsla(265deg, 89%, 78%, 1);--md-primary-fg-color--transparent: hsla(265deg, 89%, 78%, 0.2);--md-primary-fg-color--light: hsla(265deg, 89%, 83%, 1);--md-primary-fg-color--dark: hsla(265deg, 89%, 73%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=deep-purple],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=deep-purple]{--md-primary-code-bg-color: hsl(248.4980702, 16.8923581309%, 26.4141657947%);--md-primary-fg-color: hsla(265deg, 89%, 78%, 1);--md-primary-fg-color--transparent: hsla(265deg, 89%, 78%, 0.2);--md-primary-fg-color--light: hsla(265deg, 89%, 83%, 1);--md-primary-fg-color--dark: hsla(265deg, 89%, 73%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=blue],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=blue]{--md-primary-code-bg-color: hsl(227.2638621359, 21.6677726002%, 25.6465952614%);--md-primary-fg-color: hsla(225deg, 100%, 75%, 1);--md-primary-fg-color--transparent: hsla(225deg, 100%, 75%, 0.2);--md-primary-fg-color--light: hsla(225deg, 100%, 80%, 1);--md-primary-fg-color--dark: hsla(225deg, 100%, 70%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=indigo],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=indigo]{--md-primary-code-bg-color: hsl(227.2638621359, 21.6677726002%, 25.6465952614%);--md-primary-fg-color: hsla(225deg, 100%, 75%, 1);--md-primary-fg-color--transparent: hsla(225deg, 100%, 75%, 0.2);--md-primary-fg-color--light: hsla(225deg, 100%, 80%, 1);--md-primary-fg-color--dark: hsla(225deg, 100%, 70%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=light-blue],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=light-blue]{--md-primary-code-bg-color: hsl(227.2638621359, 21.6677726002%, 25.6465952614%);--md-primary-fg-color: hsla(225deg, 100%, 75%, 1);--md-primary-fg-color--transparent: hsla(225deg, 100%, 75%, 0.2);--md-primary-fg-color--light: hsla(225deg, 100%, 80%, 1);--md-primary-fg-color--dark: hsla(225deg, 100%, 70%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=cyan],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=cyan]{--md-primary-code-bg-color: hsl(210.993928831, 19.0177068244%, 26.0788938803%);--md-primary-fg-color: hsla(191deg, 97%, 77%, 1);--md-primary-fg-color--transparent: hsla(191deg, 97%, 77%, 0.2);--md-primary-fg-color--light: hsla(191deg, 97%, 82%, 1);--md-primary-fg-color--dark: hsla(191deg, 97%, 72%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=teal],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=teal]{--md-primary-code-bg-color: hsl(210.993928831, 19.0177068244%, 26.0788938803%);--md-primary-fg-color: hsla(191deg, 97%, 77%, 1);--md-primary-fg-color--transparent: hsla(191deg, 97%, 77%, 0.2);--md-primary-fg-color--light: hsla(191deg, 97%, 82%, 1);--md-primary-fg-color--dark: hsla(191deg, 97%, 72%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=green],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=green]{--md-primary-code-bg-color: hsl(168.8720935496, 16.518720864%, 23.1930022147%);--md-primary-fg-color: hsla(135deg, 94%, 65%, 1);--md-primary-fg-color--transparent: hsla(135deg, 94%, 65%, 0.2);--md-primary-fg-color--light: hsla(135deg, 94%, 70%, 1);--md-primary-fg-color--dark: hsla(135deg, 94%, 60%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=light-green],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=light-green]{--md-primary-code-bg-color: hsl(168.8720935496, 16.518720864%, 23.1930022147%);--md-primary-fg-color: hsla(135deg, 94%, 65%, 1);--md-primary-fg-color--transparent: hsla(135deg, 94%, 65%, 0.2);--md-primary-fg-color--light: hsla(135deg, 94%, 70%, 1);--md-primary-fg-color--dark: hsla(135deg, 94%, 60%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=lime],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=lime]{--md-primary-code-bg-color: hsl(168.8720935496, 16.518720864%, 23.1930022147%);--md-primary-fg-color: hsla(135deg, 94%, 65%, 1);--md-primary-fg-color--transparent: hsla(135deg, 94%, 65%, 0.2);--md-primary-fg-color--light: hsla(135deg, 94%, 70%, 1);--md-primary-fg-color--dark: hsla(135deg, 94%, 60%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=yellow],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=yellow]{--md-primary-code-bg-color: hsl(159.3047128419, 2.986865819%, 26.1419609775%);--md-primary-fg-color: hsla(65deg, 92%, 76%, 1);--md-primary-fg-color--transparent: hsla(65deg, 92%, 76%, 0.2);--md-primary-fg-color--light: hsla(65deg, 92%, 81%, 1);--md-primary-fg-color--dark: hsla(65deg, 92%, 71%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=amber],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=amber]{--md-primary-code-bg-color: hsl(159.3047128419, 2.986865819%, 26.1419609775%);--md-primary-fg-color: hsla(65deg, 92%, 76%, 1);--md-primary-fg-color--transparent: hsla(65deg, 92%, 76%, 0.2);--md-primary-fg-color--light: hsla(65deg, 92%, 81%, 1);--md-primary-fg-color--dark: hsla(65deg, 92%, 71%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=orange],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=orange]{--md-primary-code-bg-color: hsl(338.2103998913, 5.0960419739%, 25.1078079888%);--md-primary-fg-color: hsla(31deg, 100%, 71%, 1);--md-primary-fg-color--transparent: hsla(31deg, 100%, 71%, 0.2);--md-primary-fg-color--light: hsla(31deg, 100%, 76%, 1);--md-primary-fg-color--dark: hsla(31deg, 100%, 66%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-primary=deep-orange],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=deep-orange]{--md-primary-code-bg-color: hsl(338.2103998913, 5.0960419739%, 25.1078079888%);--md-primary-fg-color: hsla(31deg, 100%, 71%, 1);--md-primary-fg-color--transparent: hsla(31deg, 100%, 71%, 0.2);--md-primary-fg-color--light: hsla(31deg, 100%, 76%, 1);--md-primary-fg-color--dark: hsla(31deg, 100%, 66%, 1);--md-primary-bg-color: var(--md-default-bg-color);--md-primary-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=red],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=red]{--md-code-link-accent-bg-color: hsl(332.2545890109, 15.8127407999%, 23.5759703429%);--md-accent-fg-color: hsla(0deg, 100%, 67%, 1);--md-accent-fg-color--transparent: hsla(0deg, 100%, 67%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=pink],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=pink]{--md-code-link-accent-bg-color: hsl(288.4757168622, 14.8889902037%, 24.6712834924%);--md-accent-fg-color: hsla(326deg, 100%, 74%, 1);--md-accent-fg-color--transparent: hsla(326deg, 100%, 74%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=purple],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=purple]{--md-code-link-accent-bg-color: hsl(248.4980702, 16.8923581309%, 26.4141657947%);--md-accent-fg-color: hsla(265deg, 89%, 78%, 1);--md-accent-fg-color--transparent: hsla(265deg, 89%, 78%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=deep-purple],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=deep-purple]{--md-code-link-accent-bg-color: hsl(248.4980702, 16.8923581309%, 26.4141657947%);--md-accent-fg-color: hsla(265deg, 89%, 78%, 1);--md-accent-fg-color--transparent: hsla(265deg, 89%, 78%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=blue],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=blue]{--md-code-link-accent-bg-color: hsl(227.2638621359, 21.6677726002%, 25.6465952614%);--md-accent-fg-color: hsla(225deg, 100%, 75%, 1);--md-accent-fg-color--transparent: hsla(225deg, 100%, 75%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=indigo],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=indigo]{--md-code-link-accent-bg-color: hsl(227.2638621359, 21.6677726002%, 25.6465952614%);--md-accent-fg-color: hsla(225deg, 100%, 75%, 1);--md-accent-fg-color--transparent: hsla(225deg, 100%, 75%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=light-blue],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=light-blue]{--md-code-link-accent-bg-color: hsl(227.2638621359, 21.6677726002%, 25.6465952614%);--md-accent-fg-color: hsla(225deg, 100%, 75%, 1);--md-accent-fg-color--transparent: hsla(225deg, 100%, 75%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=cyan],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=cyan]{--md-code-link-accent-bg-color: hsl(210.993928831, 19.0177068244%, 26.0788938803%);--md-accent-fg-color: hsla(191deg, 97%, 77%, 1);--md-accent-fg-color--transparent: hsla(191deg, 97%, 77%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=teal],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=teal]{--md-code-link-accent-bg-color: hsl(210.993928831, 19.0177068244%, 26.0788938803%);--md-accent-fg-color: hsla(191deg, 97%, 77%, 1);--md-accent-fg-color--transparent: hsla(191deg, 97%, 77%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=green],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=green]{--md-code-link-accent-bg-color: hsl(168.8720935496, 16.518720864%, 23.1930022147%);--md-accent-fg-color: hsla(135deg, 94%, 65%, 1);--md-accent-fg-color--transparent: hsla(135deg, 94%, 65%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=light-green],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=light-green]{--md-code-link-accent-bg-color: hsl(168.8720935496, 16.518720864%, 23.1930022147%);--md-accent-fg-color: hsla(135deg, 94%, 65%, 1);--md-accent-fg-color--transparent: hsla(135deg, 94%, 65%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=lime],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=lime]{--md-code-link-accent-bg-color: hsl(168.8720935496, 16.518720864%, 23.1930022147%);--md-accent-fg-color: hsla(135deg, 94%, 65%, 1);--md-accent-fg-color--transparent: hsla(135deg, 94%, 65%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=yellow],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=yellow]{--md-code-link-accent-bg-color: hsl(159.3047128419, 2.986865819%, 26.1419609775%);--md-accent-fg-color: hsla(65deg, 92%, 76%, 1);--md-accent-fg-color--transparent: hsla(65deg, 92%, 76%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=amber],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=amber]{--md-code-link-accent-bg-color: hsl(159.3047128419, 2.986865819%, 26.1419609775%);--md-accent-fg-color: hsla(65deg, 92%, 76%, 1);--md-accent-fg-color--transparent: hsla(65deg, 92%, 76%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=orange],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=orange]{--md-code-link-accent-bg-color: hsl(338.2103998913, 5.0960419739%, 25.1078079888%);--md-accent-fg-color: hsla(31deg, 100%, 71%, 1);--md-accent-fg-color--transparent: hsla(31deg, 100%, 71%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}[data-md-color-scheme=slate][data-md-color-accent=deep-orange],[data-md-color-scheme=slate] :not([data-md-color-scheme])[data-md-color-primary=deep-orange]{--md-code-link-accent-bg-color: hsl(338.2103998913, 5.0960419739%, 25.1078079888%);--md-accent-fg-color: hsla(31deg, 100%, 71%, 1);--md-accent-fg-color--transparent: hsla(31deg, 100%, 71%, 0.2);--md-accent-bg-color: var(--md-default-bg-color);--md-accent-bg-color--light: var(--md-default-bg-color--light)}:root{--md-heart: #ff5252;--md-heart-big: #ff1744}:root [data-md-color-scheme=slate]{--md-heart: hsl(0, 100%, 67%);--md-heart-big: hsl(326, 100%, 74%)}.md-typeset a.source-link{position:relative;top:-0.6rem;float:right;color:var(--md-default-fg-color--lighter);transition:color 125ms}.md-typeset a.source-link:hover{color:var(--md-accent-fg-color)}.md-typeset a.source-link .twemoji{height:1.2rem}.md-typeset a.source-link .twemoji svg{width:1.2rem;height:1.2rem}.md-typeset div.highlight.md-max-height pre>code{max-height:15rem}.twemoji.heart-throb svg,.twemoji.heart-throb-hover svg{position:relative;color:var(--md-heart);animation:pulse 1.5s ease infinite}@keyframes pulse{0%{transform:scale(1)}40%{color:var(--md-heart-big);transform:scale(1.3)}50%{transform:scale(1.2)}60%{color:var(--md-heart-big);transform:scale(1.3)}100%{transform:scale(1)}}footer.sponsorship{text-align:center}footer.sponsorship .twemoji{padding:.05rem}footer.sponsorship a{text-decoration:none}footer.sponsorship hr{display:inline-block;width:1.6rem;margin:0 .7rem;vertical-align:middle;border-bottom:2px solid var(--md-default-fg-color--lighter)}footer.sponsorship:hover hr{border-color:var(--md-accent-fg-color)}footer.sponsorship:not(:hover) .twemoji.heart-throb-hover svg{color:var(--md-default-fg-color--lighter) !important}:root>*{--md-admonition-icon-color: #3654c2;--md-admonition-bg-color: rgba(54, 84, 194, 0.1)}:root>*[data-md-color-scheme=slate]{--md-admonition-icon-color: hsl(225, 100%, 75%);--md-admonition-bg-color: hsla(225, 100%, 75%, 0.1)}:root>*{--md-admonition-icon--settings: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 15.5A3.5 3.5 0 0 1 8.5 12 3.5 3.5 0 0 1 12 8.5a3.5 3.5 0 0 1 3.5 3.5 3.5 3.5 0 0 1-3.5 3.5m7.43-2.53c.04-.32.07-.64.07-.97s-.03-.66-.07-1l2.11-1.63c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.31-.61-.22l-2.49 1c-.52-.39-1.06-.73-1.69-.98l-.37-2.65A.506.506 0 0 0 14 2h-4c-.25 0-.46.18-.5.42l-.37 2.65c-.63.25-1.17.59-1.69.98l-2.49-1c-.22-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64L4.57 11c-.04.34-.07.67-.07 1s.03.65.07.97l-2.11 1.66c-.19.15-.25.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1.01c.52.4 1.06.74 1.69.99l.37 2.65c.04.24.25.42.5.42h4c.25 0 .46-.18.5-.42l.37-2.65c.63-.26 1.17-.59 1.69-.99l2.49 1.01c.22.08.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64z"/></svg>');--md-admonition-bg-color--settings: rgba(170, 0, 255, 0.1);--md-admonition-icon-color--settings: #aa00ff}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--settings: hsla(326, 100%, 74%, 0.1);--md-admonition-icon-color--settings: hsl(326, 100%, 74%)}:root>*{--md-admonition-icon--new: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m23 12-2.44-2.78.34-3.68-3.61-.82-1.89-3.18L12 3 8.6 1.54 6.71 4.72l-3.61.81.34 3.68L1 12l2.44 2.78-.34 3.69 3.61.82 1.89 3.18L12 21l3.4 1.46 1.89-3.18 3.61-.82-.34-3.68zm-10 5h-2v-2h2zm0-4h-2V7h2z"/></svg>');--md-admonition-bg-color--new: rgba(255, 214, 0, 0.1);--md-admonition-icon-color--new: #ffd600}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--new: hsla(65, 92%, 76%, 0.1);--md-admonition-icon-color--new: hsl(65, 92%, 76%)}:root>*{--md-admonition-icon--important: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9 22a1 1 0 0 1-1-1v-3H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-6.1l-3.7 3.71c-.2.19-.45.29-.7.29zm1-6v3.08L13.08 16H20V4H4v12zm3-6h-2V6h2zm0 4h-2v-2h2z"/></svg>');--md-admonition-bg-color--important: rgba(124, 77, 255, 0.1);--md-admonition-icon-color--important: #7c4dff}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--important: hsla(300.507916868, 58.3554777078%, 71.0104358913%, 0.1);--md-admonition-icon-color--important: hsl(300.507916868, 58.3554777078%, 71.0104358913%)}:root>*{--md-admonition-bg-color--note: rgba(68, 138, 255, 0.1);--md-admonition-icon-color--note: #448aff}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--note: hsla(225, 100%, 75%, 0.1);--md-admonition-icon-color--note: hsl(225, 100%, 75%)}:root>*{--md-admonition-bg-color--abstract: rgba(0, 176, 255, 0.1);--md-admonition-icon-color--abstract: #00b0ff}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--abstract: hsla(208.9651589316, 100.1516938638%, 76.1926610237%, 0.1);--md-admonition-icon-color--abstract: hsl(208.9651589316, 100.1516938638%, 76.1926610237%)}:root>*{--md-admonition-bg-color--info: rgba(0, 184, 212, 0.1);--md-admonition-icon-color--info: #00b8d4}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--info: hsla(191, 97%, 77%, 0.1);--md-admonition-icon-color--info: hsl(191, 97%, 77%)}:root>*{--md-admonition-bg-color--tip: rgba(0, 191, 165, 0.1);--md-admonition-icon-color--tip: #00bfa5}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--tip: hsla(157.7363570417, 83.7763520157%, 69.6636999884%, 0.1);--md-admonition-icon-color--tip: hsl(157.7363570417, 83.7763520157%, 69.6636999884%)}:root>*{--md-admonition-bg-color--success: rgba(0, 200, 83, 0.1);--md-admonition-icon-color--success: #00c853}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--success: hsla(135, 94%, 65%, 0.1);--md-admonition-icon-color--success: hsl(135, 94%, 65%)}:root>*{--md-admonition-bg-color--question: rgba(100, 221, 23, 0.1);--md-admonition-icon-color--question: #64dd17}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--question: hsla(96.9286079031, 93.5050765575%, 74.7933068737%, 0.1);--md-admonition-icon-color--question: hsl(96.9286079031, 93.5050765575%, 74.7933068737%)}:root>*{--md-admonition-bg-color--warning: rgba(255, 145, 0, 0.1);--md-admonition-icon-color--warning: #ff9100}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--warning: hsla(31, 100%, 71%, 0.1);--md-admonition-icon-color--warning: hsl(31, 100%, 71%)}:root>*{--md-admonition-bg-color--failure: rgba(255, 82, 82, 0.1);--md-admonition-icon-color--failure: #ff5252}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--failure: hsla(15.759766848, 102.8951066345%, 69.4486457644%, 0.1);--md-admonition-icon-color--failure: hsl(15.759766848, 102.8951066345%, 69.4486457644%)}:root>*{--md-admonition-bg-color--danger: rgba(255, 23, 68, 0.1);--md-admonition-icon-color--danger: #ff1744}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--danger: hsla(0, 100%, 67%, 0.1);--md-admonition-icon-color--danger: hsl(0, 100%, 67%)}:root>*{--md-admonition-bg-color--bug: rgba(245, 0, 87, 0.1);--md-admonition-icon-color--bug: #f50057}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--bug: hsla(344.5737278948, 100.1359681762%, 71.0000228672%, 0.1);--md-admonition-icon-color--bug: hsl(344.5737278948, 100.1359681762%, 71.0000228672%)}:root>*{--md-admonition-bg-color--example: rgba(98, 0, 234, 0.1);--md-admonition-icon-color--example: #6200ea}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--example: hsla(265, 89%, 78%, 0.1);--md-admonition-icon-color--example: hsl(265, 89%, 78%)}:root>*{--md-admonition-bg-color--quote: rgba(158, 158, 158, 0.1);--md-admonition-icon-color--quote: #9e9e9e}:root>*[data-md-color-scheme=slate]{--md-admonition-bg-color--quote: hsla(225, 8%, 51%, 0.1);--md-admonition-icon-color--quote: hsl(225, 8%, 51%)}.md-typeset .admonition,.md-typeset details{font-size:inherit;background:var(--md-admonition-bg-color--note);border-width:0;border-left-width:4px}.md-typeset .admonition>.admonition-title::before,.md-typeset details>.admonition-title::before,.md-typeset details>summary::before{background-color:var(--md-admonition-icon-color--note)}.md-typeset .admonition>.admonition-title::after,.md-typeset details>.admonition-title::after,.md-typeset details>summary::after{color:var(--md-admonition-icon-color--note)}.md-typeset .admonition.note,.md-typeset details.note{background:var(--md-admonition-bg-color--note)}.md-typeset .admonition.note>.admonition-title::before,.md-typeset details.note>.admonition-title::before,.md-typeset details.note>summary::before{background-color:var(--md-admonition-icon-color--note)}.md-typeset .admonition.note>.admonition-title::after,.md-typeset details.note>.admonition-title::after,.md-typeset details.note>summary::after{color:var(--md-admonition-icon-color--note)}.md-typeset .admonition.abstract,.md-typeset details.abstract{background:var(--md-admonition-bg-color--abstract)}.md-typeset .admonition.abstract>.admonition-title::before,.md-typeset details.abstract>.admonition-title::before,.md-typeset details.abstract>summary::before{background-color:var(--md-admonition-icon-color--abstract)}.md-typeset .admonition.abstract>.admonition-title::after,.md-typeset details.abstract>.admonition-title::after,.md-typeset details.abstract>summary::after{color:var(--md-admonition-icon-color--abstract)}.md-typeset .admonition.info,.md-typeset details.info{background:var(--md-admonition-bg-color--info)}.md-typeset .admonition.info>.admonition-title::before,.md-typeset details.info>.admonition-title::before,.md-typeset details.info>summary::before{background-color:var(--md-admonition-icon-color--info)}.md-typeset .admonition.info>.admonition-title::after,.md-typeset details.info>.admonition-title::after,.md-typeset details.info>summary::after{color:var(--md-admonition-icon-color--info)}.md-typeset .admonition.tip,.md-typeset details.tip{background:var(--md-admonition-bg-color--tip)}.md-typeset .admonition.tip>.admonition-title::before,.md-typeset details.tip>.admonition-title::before,.md-typeset details.tip>summary::before{background-color:var(--md-admonition-icon-color--tip)}.md-typeset .admonition.tip>.admonition-title::after,.md-typeset details.tip>.admonition-title::after,.md-typeset details.tip>summary::after{color:var(--md-admonition-icon-color--tip)}.md-typeset .admonition.success,.md-typeset details.success{background:var(--md-admonition-bg-color--success)}.md-typeset .admonition.success>.admonition-title::before,.md-typeset details.success>.admonition-title::before,.md-typeset details.success>summary::before{background-color:var(--md-admonition-icon-color--success)}.md-typeset .admonition.success>.admonition-title::after,.md-typeset details.success>.admonition-title::after,.md-typeset details.success>summary::after{color:var(--md-admonition-icon-color--success)}.md-typeset .admonition.question,.md-typeset details.question{background:var(--md-admonition-bg-color--question)}.md-typeset .admonition.question>.admonition-title::before,.md-typeset details.question>.admonition-title::before,.md-typeset details.question>summary::before{background-color:var(--md-admonition-icon-color--question)}.md-typeset .admonition.question>.admonition-title::after,.md-typeset details.question>.admonition-title::after,.md-typeset details.question>summary::after{color:var(--md-admonition-icon-color--question)}.md-typeset .admonition.warning,.md-typeset details.warning{background:var(--md-admonition-bg-color--warning)}.md-typeset .admonition.warning>.admonition-title::before,.md-typeset details.warning>.admonition-title::before,.md-typeset details.warning>summary::before{background-color:var(--md-admonition-icon-color--warning)}.md-typeset .admonition.warning>.admonition-title::after,.md-typeset details.warning>.admonition-title::after,.md-typeset details.warning>summary::after{color:var(--md-admonition-icon-color--warning)}.md-typeset .admonition.failure,.md-typeset details.failure{background:var(--md-admonition-bg-color--failure)}.md-typeset .admonition.failure>.admonition-title::before,.md-typeset details.failure>.admonition-title::before,.md-typeset details.failure>summary::before{background-color:var(--md-admonition-icon-color--failure)}.md-typeset .admonition.failure>.admonition-title::after,.md-typeset details.failure>.admonition-title::after,.md-typeset details.failure>summary::after{color:var(--md-admonition-icon-color--failure)}.md-typeset .admonition.danger,.md-typeset details.danger{background:var(--md-admonition-bg-color--danger)}.md-typeset .admonition.danger>.admonition-title::before,.md-typeset details.danger>.admonition-title::before,.md-typeset details.danger>summary::before{background-color:var(--md-admonition-icon-color--danger)}.md-typeset .admonition.danger>.admonition-title::after,.md-typeset details.danger>.admonition-title::after,.md-typeset details.danger>summary::after{color:var(--md-admonition-icon-color--danger)}.md-typeset .admonition.bug,.md-typeset details.bug{background:var(--md-admonition-bg-color--bug)}.md-typeset .admonition.bug>.admonition-title::before,.md-typeset details.bug>.admonition-title::before,.md-typeset details.bug>summary::before{background-color:var(--md-admonition-icon-color--bug)}.md-typeset .admonition.bug>.admonition-title::after,.md-typeset details.bug>.admonition-title::after,.md-typeset details.bug>summary::after{color:var(--md-admonition-icon-color--bug)}.md-typeset .admonition.example,.md-typeset details.example{background:var(--md-admonition-bg-color--example)}.md-typeset .admonition.example>.admonition-title::before,.md-typeset details.example>.admonition-title::before,.md-typeset details.example>summary::before{background-color:var(--md-admonition-icon-color--example)}.md-typeset .admonition.example>.admonition-title::after,.md-typeset details.example>.admonition-title::after,.md-typeset details.example>summary::after{color:var(--md-admonition-icon-color--example)}.md-typeset .admonition.quote,.md-typeset details.quote{background:var(--md-admonition-bg-color--quote)}.md-typeset .admonition.quote>.admonition-title::before,.md-typeset details.quote>.admonition-title::before,.md-typeset details.quote>summary::before{background-color:var(--md-admonition-icon-color--quote)}.md-typeset .admonition.quote>.admonition-title::after,.md-typeset details.quote>.admonition-title::after,.md-typeset details.quote>summary::after{color:var(--md-admonition-icon-color--quote)}.md-typeset .admonition.settings,.md-typeset details.settings{background:var(--md-admonition-bg-color--settings)}.md-typeset .admonition.settings>.admonition-title::before,.md-typeset details.settings>.admonition-title::before,.md-typeset details.settings>summary::before{width:1rem;height:1rem;background-color:var(--md-admonition-icon-color--settings);background-size:1rem;-webkit-mask-image:var(--md-admonition-icon--settings);mask-image:var(--md-admonition-icon--settings);content:" "}.md-typeset .admonition.settings>.admonition-title::after,.md-typeset details.settings>.admonition-title::after,.md-typeset details.settings>summary::after{color:var(--md-admonition-icon-color--settings)}.md-typeset .admonition.new,.md-typeset details.new{background:var(--md-admonition-bg-color--new)}.md-typeset .admonition.new>.admonition-title::before,.md-typeset details.new>.admonition-title::before,.md-typeset details.new>summary::before{width:1rem;height:1rem;background-color:var(--md-admonition-icon-color--new);background-size:1rem;-webkit-mask-image:var(--md-admonition-icon--new);mask-image:var(--md-admonition-icon--new);content:" "}.md-typeset .admonition.new>.admonition-title::after,.md-typeset details.new>.admonition-title::after,.md-typeset details.new>summary::after{color:var(--md-admonition-icon-color--new)}.md-typeset .admonition.important,.md-typeset details.important{background:var(--md-admonition-bg-color--important)}.md-typeset .admonition.important>.admonition-title::before,.md-typeset details.important>.admonition-title::before,.md-typeset details.important>summary::before{width:1rem;height:1rem;background-color:var(--md-admonition-icon-color--important);background-size:1rem;-webkit-mask-image:var(--md-admonition-icon--important);mask-image:var(--md-admonition-icon--important);content:" "}.md-typeset .admonition.important>.admonition-title::after,.md-typeset details.important>.admonition-title::after,.md-typeset details.important>summary::after{color:var(--md-admonition-icon-color--important)}mjx-container[display=true]{font-size:120% !important}mjx-container:not([display]){font-size:100% !important}.md-typeset .arithmatex{overflow-x:auto !important;overflow-y:hidden !important}.katex-display .katex-html{display:flex !important;flex-direction:row;flex-wrap:nowrap;align-items:baseline;justify-content:space-between}.katex-display .katex-html .base{display:inline !important}.katex-display .katex-html .tag{position:relative !important;display:inline !important;margin-left:var(--margin-small)}.CtxtMenu_InfoClose{top:.2em;right:.2em}.CtxtMenu_InfoContent{overflow:auto;text-align:left;font-size:80%;padding:.4em .6em;border:1px inset;margin:1em 0px;max-height:20em;max-width:30em;background-color:#eee;white-space:normal}.CtxtMenu_Info.CtxtMenu_MousePost{outline:none}.CtxtMenu_Info{position:fixed;left:50%;width:auto;text-align:center;border:3px outset;padding:1em 2em;background-color:#ddd;color:#000;cursor:default;font-family:message-box;font-size:120%;font-style:normal;text-indent:0;text-transform:none;line-height:normal;letter-spacing:normal;word-spacing:normal;word-wrap:normal;white-space:nowrap;float:none;z-index:201;border-radius:15px;-webkit-border-radius:15px;-moz-border-radius:15px;-khtml-border-radius:15px;box-shadow:0px 10px 20px gray;-webkit-box-shadow:0px 10px 20px gray;-moz-box-shadow:0px 10px 20px gray;-khtml-box-shadow:0px 10px 20px gray;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color="gray", Positive="true")}.CtxtMenu_MenuClose{position:absolute;cursor:pointer;display:inline-block;border:2px solid #aaa;border-radius:18px;-webkit-border-radius:18px;-moz-border-radius:18px;-khtml-border-radius:18px;font-family:"Courier New",Courier;font-size:24px;color:#f0f0f0}.CtxtMenu_MenuClose span{display:block;background-color:#aaa;border:1.5px solid;border-radius:18px;-webkit-border-radius:18px;-moz-border-radius:18px;-khtml-border-radius:18px;line-height:0;padding:8px 0 6px}.CtxtMenu_MenuClose:hover{color:#fff !important;border:2px solid #ccc !important}.CtxtMenu_MenuClose:hover span{background-color:#ccc !important}.CtxtMenu_MenuClose:hover:focus{outline:none}.CtxtMenu_Menu{position:absolute;background-color:#fff;color:#000;width:auto;padding:5px 0px;border:1px solid #ccc;margin:0;cursor:default;font:menu;text-align:left;text-indent:0;text-transform:none;line-height:normal;letter-spacing:normal;word-spacing:normal;word-wrap:normal;white-space:nowrap;float:none;z-index:201;border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-khtml-border-radius:5px;box-shadow:0px 10px 20px gray;-webkit-box-shadow:0px 10px 20px gray;-moz-box-shadow:0px 10px 20px gray;-khtml-box-shadow:0px 10px 20px gray}.CtxtMenu_MenuItem{padding:1px 2em;background:rgba(0,0,0,0)}.CtxtMenu_MenuArrow{position:absolute;right:.5em;padding-top:.25em;color:#666;font-size:.75em}.CtxtMenu_MenuActive .CtxtMenu_MenuArrow{color:#fff}.CtxtMenu_MenuArrow.CtxtMenu_RTL{left:.5em;right:auto}.CtxtMenu_MenuCheck{position:absolute;left:.7em}.CtxtMenu_MenuCheck.CtxtMenu_RTL{right:.7em;left:auto}.CtxtMenu_MenuRadioCheck{position:absolute;left:.7em}.CtxtMenu_MenuRadioCheck.CtxtMenu_RTL{right:.7em;left:auto}.CtxtMenu_MenuInputBox{padding-left:1em;right:.5em;color:#666}.CtxtMenu_MenuInputBox.CtxtMenu_RTL{left:.1em}.CtxtMenu_MenuComboBox{left:.1em;padding-bottom:.5em}.CtxtMenu_MenuSlider{left:.1em}.CtxtMenu_SliderValue{position:absolute;right:.1em;padding-top:.25em;color:#333;font-size:.75em}.CtxtMenu_SliderBar{outline:none;background:#d3d3d3}.CtxtMenu_MenuLabel{padding:1px 2em 3px 1.33em;font-style:italic}.CtxtMenu_MenuRule{border-top:1px solid #ddd;margin:4px 3px}.CtxtMenu_MenuDisabled{color:GrayText}.CtxtMenu_MenuActive{background-color:#606872;color:#fff}.CtxtMenu_MenuDisabled:focus{background-color:#e8e8e8}.CtxtMenu_MenuLabel:focus{background-color:#e8e8e8}.CtxtMenu_ContextMenu:focus{outline:none}.CtxtMenu_ContextMenu .CtxtMenu_MenuItem:focus{outline:none}.CtxtMenu_SelectionMenu{position:relative;float:left;border-bottom:none;-webkit-box-shadow:none;-webkit-border-radius:0px}.CtxtMenu_SelectionItem{padding-right:1em}.CtxtMenu_Selection{right:40%;width:50%}.CtxtMenu_SelectionBox{padding:0em;max-height:20em;max-width:none;background-color:#fff}.CtxtMenu_SelectionDivider{clear:both;border-top:2px solid #000}.CtxtMenu_Menu .CtxtMenu_MenuClose{top:-10px;left:-10px}[data-md-color-scheme=slate] .CtxtMenu_InfoSignature input,[data-md-color-scheme=slate] .CtxtMenu_InfoContent pre{color:#000}[data-md-color-scheme=slate] .CtxtMenu_Info,[data-md-color-scheme=slate] .CtxtMenu_Menu{box-shadow:0px 10px 20px rgba(0,0,0,.5)}.md-typeset del.critic,.md-typeset ins.critic,.md-typeset mark.critic{padding:0 .25em;color:unset;box-shadow:none}.md-typeset .critic.break{margin:0}.md-typeset details{overflow:hidden}.md-typeset details>summary:focus{outline-style:none}:root>*{--highlight-svg-console: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 19V7H4v12zm0-16a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2zm-7 14v-2h5v2zm-3.42-4L5.57 9H8.4l3.3 3.3c.39.39.39 1.03 0 1.42L8.42 17H5.59z"/></svg>');--highlight-svg-arrow-expand: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 21v-2H6.41l4.5-4.5-1.41-1.41-4.5 4.5V14H3v7zm4.5-10.09 4.5-4.5V10h2V3h-7v2h3.59l-4.5 4.5z"/></svg>');--highlight-svg-arrow-collapse: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19.5 3.09 15 7.59V4h-2v7h7V9h-3.59l4.5-4.5zM4 13v2h3.59l-4.5 4.5 1.41 1.41 4.5-4.5V20h2v-7z"/></svg>')}.highlight .hll{box-shadow:2px 0 0 0 var(--md-accent-fg-color) inset}.highlight .kc{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne{color:var(--md-code-hl-class-color)}.highlight .mb{color:var(--md-code-hl-number-color)}.highlight .nb,.highlight .bp{color:var(--md-code-hl-builtin-color)}.highlight .nn{color:var(--md-code-hl-namespace-color)}.highlight .na,.highlight .nd,.highlight .ni{color:var(--md-code-hl-entity-color)}.highlight .nl,.highlight .nt{color:var(--md-code-hl-tag-color)}.md-typeset *:not(pre)>code{margin:0;padding:.1654411765em .3125em;color:var(--md-code-fg-color);background-color:var(--md-code-inline-bg-color);border-radius:.2rem;box-shadow:none}.md-typeset pre>code{display:grid}.md-typeset td code{word-break:normal}.md-typeset .highlight{-moz-tab-size:8;-o-tab-size:8;tab-size:8}.md-typeset .highlight [data-linenos]:hover::before{color:var(--md-accent-fg-color);font-weight:700}.md-typeset .highlight [data-linenos].special::before{background-color:var(--md-code-special-bg-color)}.md-typeset .highlight .hll [data-linenos]::before{box-shadow:-2px 0 var(--md-accent-fg-color) inset}.md-typeset .highlighttable .linenodiv .special{margin-right:-.5882352941em;margin-left:-1.1764705882em;padding-right:.5882352941em;padding-left:1.1764705882em;background-color:var(--md-code-special-bg-color)}.md-typeset .highlight span.filename{position:relative;display:block;margin-top:1em;padding:.5em 1.1764705882em .5em 2.9411764706em;font-weight:700;font-size:.68rem;background-color:var(--md-code-title-bg-color);border-top-left-radius:.48rem;border-top-right-radius:.48rem}.md-typeset .highlight span.filename+pre{margin-top:0}.md-typeset .highlight span.filename+pre code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .highlight span.filename::before{position:absolute;left:.8823529412em;width:1.4705882353em;height:1.4705882353em;background-color:var(--md-default-fg-color);-webkit-mask-image:var(--highlight-svg-console);mask-image:var(--highlight-svg-console);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}.md-typeset .collapse-code{position:relative;margin-top:1em;margin-bottom:1em}.md-typeset .collapse-code pre{margin-top:0;margin-bottom:0}.md-typeset .collapse-code input{display:none}.md-typeset .collapse-code input~.code-footer{width:100%;margin:0;padding:.25em .5em .25em 0em}.md-typeset .collapse-code input~.code-footer label{position:relative;margin:.05em;padding:.15em .8em;color:var(--md-primary-bg-color);font-size:90%;background-color:var(--md-accent-fg-color);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;border-radius:.1rem;cursor:pointer;content:""}.md-typeset .collapse-code input~.code-footer label:hover{background-color:var(--md-accent-fg-color)}.md-typeset .collapse-code input~.code-footer label::before{position:absolute;top:.15em;left:.15em;display:block;box-sizing:border-box;width:1.25em;height:1.25em;background-color:var(--md-primary-bg-color);background-size:1.25em;content:""}.md-typeset .collapse-code input~.code-footer label.expand{display:none}.md-typeset .collapse-code input~.code-footer label.expand::before{-webkit-mask-image:var(--highlight-svg-arrow-expand);mask-image:var(--highlight-svg-arrow-expand)}.md-typeset .collapse-code input~.code-footer label.collapse::before{-webkit-mask-image:var(--highlight-svg-arrow-collapse);mask-image:var(--highlight-svg-arrow-collapse)}.md-typeset .collapse-code input:checked~.code-footer label.expand{display:inline}.md-typeset .collapse-code input:checked~.code-footer label.collapse{display:none}.md-typeset .collapse-code input:checked+div.highlight code{max-height:9.375em;overflow:hidden}.md-typeset .collapse-code input:checked~.code-footer{position:relative;bottom:4.3em;left:0;margin-bottom:-4.3em;padding:2em .5em .5em .8rem;background-image:linear-gradient(to bottom, transparent, var(--md-default-bg-color) 80% 100%);border-bottom-right-radius:.48rem;border-bottom-left-radius:.48rem}.md-typeset .highlight+.result{border-right-width:.1rem;border-bottom-width:.1rem;border-left-width:.1rem}.md-typeset .keys .key-power::before{padding-right:.4em;content:"⏻"}.md-typeset .keys .key-fingerprint::before{padding-right:.4em;content:"☝"}:root>*{--magiclink-email-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 4H4c-1.11 0-2 .89-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2m-3 13H7v-2h10m0-2H7v-2h10m3-2h-3V6h3"/></svg>');--magiclink-github-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34-.46-1.16-1.11-1.47-1.11-1.47-.91-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.87 1.52 2.34 1.07 2.91.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.92 0-1.11.38-2 1.03-2.71-.1-.25-.45-1.29.1-2.64 0 0 .84-.27 2.75 1.02.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02.55 1.35.2 2.39.1 2.64.65.71 1.03 1.6 1.03 2.71 0 3.82-2.34 4.66-4.57 4.91.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2"/></svg>');--magiclink-bitbucket-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2.65 3C2.3 3 2 3.3 2 3.65v.12l2.73 16.5c.07.42.43.73.85.73h13.05c.31 0 .59-.22.64-.54L22 3.77a.643.643 0 0 0-.54-.73c-.03-.01-.07-.01-.11-.01zM14.1 14.95H9.94L8.81 9.07h6.3z"/></svg>');--magiclink-gitlab-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m21.94 13.11-1.05-3.22c0-.03-.01-.06-.02-.09l-2.11-6.48a.86.86 0 0 0-.8-.57c-.36 0-.68.25-.79.58l-2 6.17H8.84L6.83 3.33a.85.85 0 0 0-.79-.58c-.37 0-.69.25-.8.58L3.13 9.82v.01l-1.07 3.28c-.16.5.01 1.04.44 1.34l9.22 6.71c.17.12.39.12.56-.01l9.22-6.7c.43-.3.6-.84.44-1.34M8.15 10.45l2.57 7.91-6.17-7.91m8.73 7.92 2.47-7.59.1-.33h3.61l-5.59 7.16m4.1-13.67 1.81 5.56h-3.62m-1.3.95-1.79 5.51L12 19.24l-2.86-8.79M6.03 3.94 7.84 9.5H4.23m-1.18 4.19c-.09-.07-.13-.19-.09-.29l.79-2.43 5.82 7.45m11.38-4.73-6.51 4.73.02-.03 5.79-7.42.79 2.43c.04.1 0 .22-.09.29"/></svg>');--magiclink-commit-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.944 11h4.306a.75.75 0 0 1 0 1.5h-4.306a5.001 5.001 0 0 1-9.888 0H2.75a.75.75 0 0 1 0-1.5h4.306a5.001 5.001 0 0 1 9.888 0m-1.444.75a3.5 3.5 0 1 0-7 0 3.5 3.5 0 0 0 7 0"/></svg>');--magiclink-compare-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12.5 6.75a.75.75 0 0 0-1.5 0V9H8.75a.75.75 0 0 0 0 1.5H11v2.25a.75.75 0 0 0 1.5 0V10.5h2.25a.75.75 0 0 0 0-1.5H12.5zM8.75 16a.75.75 0 0 0 0 1.5h6a.75.75 0 0 0 0-1.5z"/><path d="M5 1h9.982a2 2 0 0 1 1.414.586l4.018 4.018A2 2 0 0 1 21 7.018V21a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2m-.5 2v18a.5.5 0 0 0 .5.5h14a.5.5 0 0 0 .5-.5V7.018a.5.5 0 0 0-.146-.354l-4.018-4.018a.5.5 0 0 0-.354-.146H5a.5.5 0 0 0-.5.5"/></svg>');--magiclink-pull-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16 19.25a3.25 3.25 0 1 1 6.5 0 3.25 3.25 0 0 1-6.5 0m-14.5 0a3.25 3.25 0 1 1 6.5 0 3.25 3.25 0 0 1-6.5 0m0-14.5a3.25 3.25 0 1 1 6.5 0 3.25 3.25 0 0 1-6.5 0M4.75 3a1.75 1.75 0 1 0 .001 3.501A1.75 1.75 0 0 0 4.75 3m0 14.5a1.75 1.75 0 1 0 .001 3.501A1.75 1.75 0 0 0 4.75 17.5m14.5 0a1.75 1.75 0 1 0 .001 3.501 1.75 1.75 0 0 0-.001-3.501"/><path d="M13.405 1.72a.75.75 0 0 1 0 1.06L12.185 4h4.065A3.75 3.75 0 0 1 20 7.75v8.75a.75.75 0 0 1-1.5 0V7.75a2.25 2.25 0 0 0-2.25-2.25h-4.064l1.22 1.22a.75.75 0 0 1-1.061 1.06l-2.5-2.5a.75.75 0 0 1 0-1.06l2.5-2.5a.75.75 0 0 1 1.06 0M4.75 7.25A.75.75 0 0 1 5.5 8v8A.75.75 0 0 1 4 16V8a.75.75 0 0 1 .75-.75"/></svg>');--magiclink-issue-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1M2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5 9.5 9.5 0 0 0 2.5 12m9.5 2a2 2 0 1 1-.001-3.999A2 2 0 0 1 12 14"/></svg>');--magiclink-discussion-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1M1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.75.75 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25"/><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25z"/></svg>')}.md-typeset a[href^="mailto:"]:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-email-icon);mask-image:var(--magiclink-email-icon)}.md-typeset .magiclink-repository:not(.magiclink-ignore),.md-typeset .magiclink-compare:not(.magiclink-ignore),.md-typeset .magiclink-commit:not(.magiclink-ignore),.md-typeset .magiclink-pull:not(.magiclink-ignore),.md-typeset .magiclink-issue:not(.magiclink-ignore),.md-typeset .magiclink-discussion:not(.magiclink-ignore),.md-typeset a[href^="mailto:"]:not(.magiclink-ignore){position:relative;padding-left:1.375em}.md-typeset .magiclink-repository:not(.magiclink-ignore)::before,.md-typeset .magiclink-compare:not(.magiclink-ignore)::before,.md-typeset .magiclink-commit:not(.magiclink-ignore)::before,.md-typeset .magiclink-pull:not(.magiclink-ignore)::before,.md-typeset .magiclink-issue:not(.magiclink-ignore)::before,.md-typeset .magiclink-discussion:not(.magiclink-ignore)::before,.md-typeset a[href^="mailto:"]:not(.magiclink-ignore)::before{position:absolute;top:0;left:0;display:block;box-sizing:border-box;width:1.25em;height:1.25em;background-color:var(--md-typeset-a-color);background-size:1.25em;transition:background-color 125ms;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}.md-typeset .magiclink-repository:not(.magiclink-ignore):hover::before,.md-typeset .magiclink-compare:not(.magiclink-ignore):hover::before,.md-typeset .magiclink-commit:not(.magiclink-ignore):hover::before,.md-typeset .magiclink-pull:not(.magiclink-ignore):hover::before,.md-typeset .magiclink-issue:not(.magiclink-ignore):hover::before,.md-typeset .magiclink-discussion:not(.magiclink-ignore):hover::before,.md-typeset a[href^="mailto:"]:not(.magiclink-ignore):hover::before{background-color:var(--md-accent-fg-color)}.md-typeset .magiclink-commit:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-commit-icon);mask-image:var(--magiclink-commit-icon)}.md-typeset .magiclink-compare:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-compare-icon);mask-image:var(--magiclink-compare-icon)}.md-typeset .magiclink-pull:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-pull-icon);mask-image:var(--magiclink-pull-icon)}.md-typeset .magiclink-issue:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-issue-icon);mask-image:var(--magiclink-issue-icon)}.md-typeset .magiclink-discussion:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-discussion-icon);mask-image:var(--magiclink-discussion-icon)}.md-typeset .magiclink-repository.magiclink-github:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-github-icon);mask-image:var(--magiclink-github-icon)}.md-typeset .magiclink-repository.magiclink-gitlab:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-gitlab-icon);mask-image:var(--magiclink-gitlab-icon)}.md-typeset .magiclink-repository.magiclink-bitbucket:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-bitbucket-icon);mask-image:var(--magiclink-bitbucket-icon)}.md-typeset mark:not(.critic){box-shadow:none}.md-typeset .progress-label{position:absolute;width:100%;margin:0;color:var(--md-text-color);font-weight:700;line-height:1.4rem;white-space:nowrap;text-align:center;text-shadow:-0.0625em -0.0625em .375em var(--md-default-bg-color--light),.0625em -0.0625em .375em var(--md-default-bg-color--light),-0.0625em .0625em .375em var(--md-default-bg-color--light),.0625em .0625em .375em var(--md-default-bg-color--light)}.md-typeset .progress-bar{float:left;height:1.2rem;background-color:#2979ff}.md-typeset .candystripe-animate .progress-bar{animation:animate-stripes 3s linear infinite}.md-typeset .progress{position:relative;display:block;width:100%;height:1.2rem;margin:.5rem 0;background-color:var(--md-default-fg-color--lightest)}.md-typeset .progress.thin{height:.4rem;margin-top:.9rem}.md-typeset .progress.thin .progress-label{margin-top:-0.4rem}.md-typeset .progress.thin .progress-bar{height:.4rem}.md-typeset .progress.candystripe .progress-bar{background-image:linear-gradient(135deg, var(--md-progress-stripe) 27%, transparent 27%, transparent 52%, var(--md-progress-stripe) 52%, var(--md-progress-stripe) 77%, transparent 77%, transparent);background-size:2rem 2rem}.md-typeset .progress-100plus .progress-bar{background-color:var(--md-progress-100)}.md-typeset .progress-80plus .progress-bar{background-color:var(--md-progress-80)}.md-typeset .progress-60plus .progress-bar{background-color:var(--md-progress-60)}.md-typeset .progress-40plus .progress-bar{background-color:var(--md-progress-40)}.md-typeset .progress-20plus .progress-bar{background-color:var(--md-progress-20)}.md-typeset .progress-0plus .progress-bar{background-color:var(--md-progress-0)}@keyframes animate-stripes{0%{background-position:0 0}100%{background-position:6rem 0}}.md-typeset .tabbed-control button:hover{color:var(--md-default-bg-color);background:var(--md-accent-fg-color)}.md-typeset .tabbed-control--next button:hover{color:var(--md-default-bg-color);background:var(--md-accent-fg-color)}.js .md-typeset .tabbed-labels::before{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-alternate.tabbed-set .tabbed-control{width:2rem}.md-typeset .tabbed-alternate.tabbed-set .tabbed-control[hidden]{width:1.2rem;opacity:0}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block{padding:0 .6rem}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>pre:first-child,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.codehilite:first-child,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.codehilitetable:first-child,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.highlight:first-child,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.highlighttable:first-child{margin-top:.9375em}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>pre:first-child code,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.codehilite:first-child code,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.codehilitetable:first-child code,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.highlight:first-child code,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.highlighttable:first-child code{border-top-left-radius:.48rem;border-top-right-radius:.48rem}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>pre:only-child,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.codehilite:only-child,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.codehilitetable:only-child,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.highlight:only-child,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.highlighttable:only-child{margin-top:0;margin-right:-1.2rem;margin-left:-1.2rem;padding-right:.6rem;padding-left:.6rem}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>pre:only-child code,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.codehilite:only-child code,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.codehilitetable:only-child code,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.highlight:only-child code,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.highlighttable:only-child code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>pre:only-child span.filename,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.codehilite:only-child span.filename,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.codehilitetable:only-child span.filename,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.highlight:only-child span.filename,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.highlighttable:only-child span.filename{margin-top:0}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.collapse-code:only-child{margin-top:0;margin-right:-1.2rem;margin-left:-1.2rem;padding-right:.6rem;padding-left:.6rem}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.collapse-code:only-child pre code,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.collapse-code:only-child .codehilite code,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.collapse-code:only-child .codehilitetable code,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.collapse-code:only-child .highlight code,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.collapse-code:only-child .highlighttable code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>diagram-div:only-child{margin-right:-1.2rem;margin-left:-1.2rem;padding-right:.6rem;padding-left:.6rem}[data-md-color-scheme=slate] .md-typeset .task-list-control .task-list-indicator::before{background-color:var(--md-default-fg-color--lighter)}[data-md-color-scheme=slate] .md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator::before{background-color:hsl(135,94%,65%)}:root>*{--toc-svg-link: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5"/></svg>')}.md-typeset .headerlink{width:1em;height:1em;vertical-align:middle;background-color:var(--md-default-fg-color--lighter);background-size:1em;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;visibility:visible;-webkit-mask-image:var(--toc-svg-link);mask-image:var(--toc-svg-link)}.md-typeset .headerlink:hover,.md-typeset [id]:target .headerlink{background-color:var(--md-accent-fg-color)}diagram-div{overflow:auto}.md-typeset div.steps>ol{counter-reset:item}.md-typeset div.steps>ol>li{position:relative;padding-left:1em;list-style:none}.md-typeset div.steps>ol>li::before{position:absolute;top:0;left:0;z-index:-1;display:block;width:1.75em;height:1.75em;margin-left:-1.25em;color:var(--md-steps-fg-color);font-weight:600;font-size:.9em;text-align:center;background-color:var(--md-steps-bg-color);border:1px solid var(--md-steps-border-color);border-radius:100px;content:counter(item);counter-increment:item}.md-typeset div.steps>ol>li::after{position:absolute;top:0;bottom:0;left:-0.36em;display:block;width:1px;margin-top:2em;border-left:1px solid var(--md-steps-border-color);content:""}.md-typeset table:not([class]){background:none;border-radius:.4rem}.md-typeset table:not([class]) th{border-bottom:.1rem solid var(--md-accent-fg-color)}html{background-color:rgba(0,0,0,0)}[data-md-component=announce] .twemoji{color:var(--md-primary-fg-color)}.md-container .md-tabs .md-tabs__item--active{border-bottom:.1rem solid var(--md-accent-fg-color)}.md-nav--secondary>ul{border-left:.1rem solid var(--md-default-fg-color--lightest)}.md-nav--secondary ul .md-nav__item .md-nav__link--active{margin-left:-0.1rem;padding-left:.8rem}.md-nav--secondary ul .md-nav__item ul .md-nav__item .md-nav__link--active{margin-left:-0.7rem;padding-left:1.4rem}.md-nav--secondary ul .md-nav__item ul .md-nav__item ul .md-nav__item .md-nav__link--active{margin-left:-1.3rem;padding-left:2rem}.md-nav--secondary ul .md-nav__item ul .md-nav__item ul .md-nav__item ul .md-nav__item .md-nav__link--active{margin-left:-1.9rem;padding-left:2.6rem}.md-nav--secondary ul .md-nav__item ul .md-nav__item ul .md-nav__item ul .md-nav__item ul .md-nav__item .md-nav__link--active{margin-left:-2.5rem;padding-left:3.2rem}.md-nav--secondary .md-nav__item{color:var(--md-default-fg-color--light)}.md-nav--secondary .md-nav__item .md-nav__link--active{color:var(--md-default-fg-color);border-left:.1rem solid var(--md-accent-fg-color);border-top-left-radius:0;border-bottom-left-radius:0}.md-nav--secondary .md-nav__item .md-nav__link:focus,.md-nav--secondary .md-nav__item .md-nav__link:hover{color:var(--md-default-fg-color)}.md-nav--primary .md-nav__item{color:var(--md-default-fg-color--light)}.md-nav__source{color:var(--md-text-color)}.md-nav__link[data-md-state=blur]{color:var(--md-default-fg-color--light)}.md-typeset h5{color:var(--md-text-color);text-transform:none}.md-typeset__scrollwrap,.md-sidebar__scrollwrap,.md-search__scrollwrap,.md-typeset pre>code,.md-typeset div.mermaid,.md-typeset div.diagram,.md-typeset mermaid-div,.md-typeset diagram-div,.md-typeset pre.arithmatex,.md-typeset div.arithmatex{scrollbar-color:var(--md-default-fg-color--lighter) rgba(0,0,0,0);scrollbar-width:thin}.md-typeset__scrollwrap:hover,.md-sidebar__scrollwrap:hover,.md-search__scrollwrap:hover,.md-typeset pre>code:hover,.md-typeset div.mermaid:hover,.md-typeset div.diagram:hover,.md-typeset mermaid-div:hover,.md-typeset diagram-div:hover,.md-typeset pre.arithmatex:hover,.md-typeset div.arithmatex:hover{scrollbar-color:var(--md-accent-fg-color) rgba(0,0,0,0)}.md-typeset__scrollwrap::-webkit-scrollbar,.md-sidebar__scrollwrap::-webkit-scrollbar,.md-search__scrollwrap::-webkit-scrollbar,.md-typeset pre>code::-webkit-scrollbar,.md-typeset div.mermaid::-webkit-scrollbar,.md-typeset div.diagram::-webkit-scrollbar,.md-typeset mermaid-div::-webkit-scrollbar,.md-typeset diagram-div::-webkit-scrollbar,.md-typeset pre.arithmatex::-webkit-scrollbar,.md-typeset div.arithmatex::-webkit-scrollbar{width:.2rem;height:.2rem}.md-typeset__scrollwrap::-webkit-scrollbar-corner,.md-sidebar__scrollwrap::-webkit-scrollbar-corner,.md-search__scrollwrap::-webkit-scrollbar-corner,.md-typeset pre>code::-webkit-scrollbar-corner,.md-typeset div.mermaid::-webkit-scrollbar-corner,.md-typeset div.diagram::-webkit-scrollbar-corner,.md-typeset mermaid-div::-webkit-scrollbar-corner,.md-typeset diagram-div::-webkit-scrollbar-corner,.md-typeset pre.arithmatex::-webkit-scrollbar-corner,.md-typeset div.arithmatex::-webkit-scrollbar-corner{background-color:rgba(0,0,0,0)}.md-typeset__scrollwrap::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap::-webkit-scrollbar-thumb,.md-search__scrollwrap::-webkit-scrollbar-thumb,.md-typeset pre>code::-webkit-scrollbar-thumb,.md-typeset div.mermaid::-webkit-scrollbar-thumb,.md-typeset div.diagram::-webkit-scrollbar-thumb,.md-typeset mermaid-div::-webkit-scrollbar-thumb,.md-typeset diagram-div::-webkit-scrollbar-thumb,.md-typeset pre.arithmatex::-webkit-scrollbar-thumb,.md-typeset div.arithmatex::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset__scrollwrap::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover,.md-search__scrollwrap::-webkit-scrollbar-thumb:hover,.md-typeset pre>code::-webkit-scrollbar-thumb:hover,.md-typeset div.mermaid::-webkit-scrollbar-thumb:hover,.md-typeset div.diagram::-webkit-scrollbar-thumb:hover,.md-typeset mermaid-div::-webkit-scrollbar-thumb:hover,.md-typeset diagram-div::-webkit-scrollbar-thumb:hover,.md-typeset pre.arithmatex::-webkit-scrollbar-thumb:hover,.md-typeset div.arithmatex::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@media screen and (max-width: 44.9375em){.md-content__inner>diagram-div{margin-right:-0.8rem;margin-left:-0.8rem}.md-content__inner>.highlight span.filename{border-top-left-radius:0;border-top-right-radius:0}.md-content__inner>.collapse-code{margin-right:-0.8rem;margin-left:-0.8rem}.md-content__inner>.collapse-code label.collapse{left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:0}.md-content__inner>.tabbed-set .tabbed-labels{max-width:100%;margin:0;padding-inline-start:0;scroll-padding-inline-start:0}.md-content__inner>.tabbed-set .tabbed-labels::after{padding-inline-end:0;content:none}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-inline-start:0;padding-inline-start:0}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-inline-end:0;padding-inline-end:0}}
2
- /*# sourceMappingURL=extra-95634471d6.css.map */
@@ -1,4 +0,0 @@
1
- function _typeof(t){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},_typeof(t)}!function(){"use strict";function t(t,e,r,o,a,n,i){try{var c=t[n](i),l=c.value}catch(t){return void r(t)}c.done?e(l):Promise.resolve(l).then(o,a)}function e(t,e,r){return e=o(e),function(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,n()?Reflect.construct(e,[],o(t).constructor):e.apply(t,r))}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t){return o=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},o(t)}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&l(t,e)}function n(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(n=function(){return!!t})()}function i(){
2
- /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
3
- var t,e,r="function"==typeof Symbol?Symbol:{},o=r.iterator||"@@iterator",a=r.toStringTag||"@@toStringTag";function n(r,o,a,n){var i=o&&o.prototype instanceof f?o:f,d=Object.create(i.prototype);return c(d,"_invoke",function(r,o,a){var n,i,c,f=0,d=a||[],u=!1,p={p:0,n:0,v:t,a:s,f:s.bind(t,4),d:function(e,r){return n=e,i=0,c=t,p.n=r,l}};function s(r,o){for(i=r,c=o,e=0;!u&&f&&!a&&e<d.length;e++){var a,n=d[e],s=p.p,m=n[2];r>3?(a=m===o)&&(c=n[(i=n[4])?5:(i=3,3)],n[4]=n[5]=t):n[0]<=s&&((a=r<2&&s<n[1])?(i=0,p.v=o,p.n=n[1]):s<m&&(a=r<3||n[0]>o||o>m)&&(n[4]=r,n[5]=o,p.n=m,i=0))}if(a||r>1)return l;throw u=!0,o}return function(a,d,m){if(f>1)throw TypeError("Generator is already running");for(u&&1===d&&s(d,m),i=d,c=m;(e=i<2?t:c)||!u;){n||(i?i<3?(i>1&&(p.n=-1),s(i,c)):p.n=c:p.v=c);try{if(f=2,n){if(i||(a="next"),e=n[a]){if(!(e=e.call(n,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,i<2&&(i=0)}else 1===i&&(e=n.return)&&e.call(n),i<2&&(c=TypeError("The iterator does not provide a '"+a+"' method"),i=1);n=t}else if((e=(u=p.n<0)?c:r.call(o,p))!==l)break}catch(e){n=t,i=1,c=e}finally{f=1}}return{value:e,done:u}}}(r,a,n),!0),d}var l={};function f(){}function d(){}function u(){}e=Object.getPrototypeOf;var p=[][o]?e(e([][o]())):(c(e={},o,function(){return this}),e),s=u.prototype=f.prototype=Object.create(p);function m(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,u):(t.__proto__=u,c(t,a,"GeneratorFunction")),t.prototype=Object.create(s),t}return d.prototype=u,c(s,"constructor",u),c(u,"constructor",d),d.displayName="GeneratorFunction",c(u,a,"GeneratorFunction"),c(s),c(s,a,"Generator"),c(s,o,function(){return this}),c(s,"toString",function(){return"[object Generator]"}),(i=function(){return{w:n,m:m}})()}function c(t,e,r,o){var a=Object.defineProperty;try{a({},"",{})}catch(t){a=0}c=function(t,e,r,o){function n(e,r){c(t,e,function(t){return this._invoke(e,r,t)})}e?a?a(t,e,{value:r,enumerable:!o,configurable:!o,writable:!o}):t[e]=r:(n("next",0),n("throw",1),n("return",2))},c(t,e,r,o)}function l(t,e){return l=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},l(t,e)}function f(t){var e="function"==typeof Map?new Map:void 0;return f=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf("[native code]")}catch(e){return"function"==typeof t}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,r)}function r(){return function(t,e,r){if(n())return Reflect.construct.apply(null,arguments);var o=[null];o.push.apply(o,e);var a=new(t.bind.apply(t,o));return r&&l(a,r.prototype),a}(t,arguments,o(this).constructor)}return r.prototype=Object.create(t.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),l(r,t)},f(t)}var d,u,p,s=function(){var o,n=(o=i().m(function t(o){var n,c,l,d,u,p,s,m,g,h,b,y,v,x,k,O;return i().w(function(t){for(;;)switch(t.p=t.n){case 0:n=function(t){function o(){var t;r(this,o);var a=(t=e(this,o)).attachShadow({mode:"open"}),n=document.createElement("style");return n.textContent="\n :host {\n display: block;\n line-height: initial;\n font-size: 16px;\n }\n div.diagram {\n margin: 0;\n overflow: visible;\n }",a.appendChild(n),t}return a(o,t),n=o,Object.defineProperty(n,"prototype",{writable:!1}),n;var n}(f(HTMLElement)),void 0===customElements.get("diagram-div")&&customElements.define("diagram-div",n),c=function(t){for(var e="",r=0;r<t.childNodes.length;r++){var o=t.childNodes[r];if("code"===o.tagName.toLowerCase())for(var a=0;a<o.childNodes.length;a++){var n=o.childNodes[a];if("#text"===n.nodeName&&!/^\s*$/.test(n.nodeValue)){e=n.nodeValue;break}}}return e},l={startOnLoad:!1,theme:"default",flowchart:{useMaxWidth:!1},er:{useMaxWidth:!1},sequence:{useMaxWidth:!1,noteFontWeight:"14px",actorFontSize:"14px",messageFontSize:"16px"}},mermaid.mermaidAPI.globalReset(),d=null;try{d=document.querySelector("[data-md-color-scheme]").getAttribute("data-md-color-scheme")}catch(t){d="slate"}u="undefined"==typeof mermaidConfig?l:mermaidConfig[d]||mermaidConfig.default||l,mermaid.initialize(u),p=document.querySelectorAll("pre.".concat(o,", diagram-div")),s=document.querySelector("html body"),m=0;case 1:if(!(m<p.length)){t.n=7;break}return g=p[m],h="diagram-div"===g.tagName.toLowerCase()?g.shadowRoot.querySelector("pre.".concat(o)):g,(b=document.createElement("div")).style.visibility="hidden",b.style.display="display",b.style.padding="0",b.style.margin="0",b.style.lineHeight="initial",b.style.fontSize="16px",s.appendChild(b),t.p=2,t.n=3,mermaid.render("_diagram_".concat(m),c(h),b);case 3:y=t.v,v=y.svg,x=y.bindFunctions,(k=document.createElement("div")).className=o,k.innerHTML=v,x&&x(k),(O=document.createElement("diagram-div")).shadowRoot.appendChild(k),g.parentNode.insertBefore(O,g),h.style.display="none",O.shadowRoot.appendChild(h),h!==g&&g.parentNode.removeChild(g),t.n=5;break;case 4:t.p=4,t.v;case 5:s.contains(b)&&s.removeChild(b);case 6:m++,t.n=1;break;case 7:return t.a(2)}},t,null,[[2,4]])}),function(){var e=this,r=arguments;return new Promise(function(a,n){var i=o.apply(e,r);function c(e){t(i,a,n,c,l,"next",e)}function l(e){t(i,a,n,c,l,"throw",e)}c(void 0)})});return function(t){return n.apply(this,arguments)}}(),m=function(t,e){if("katex"===e)for(var r=document.querySelectorAll(".".concat(t)),o=0;o<r.length;o++){var a=r[o].textContent||r[o].innerText;a.startsWith("\\(")&&a.endsWith("\\)")?katex.render(a.slice(2,-2),r[o],{displayMode:!1}):a.startsWith("\\[")&&a.endsWith("\\]")&&katex.render(a.slice(2,-2),r[o],{displayMode:!0})}else"mathjax"===e&&(void 0!==MathJax.startup.output.clearCache&&MathJax.startup.output.clearCache(),MathJax.typesetClear(),MathJax.texReset(),MathJax.typesetPromise())};"mathjaxConfig"in window||(window.MathJax={tex:{inlineMath:[["\\(","\\)"]],displayMath:[["\\[","\\]"]],processEscapes:!0,processEnvironments:!0,tagSide:"right",tagIndent:".8em",multlineWidth:"85%",tags:"ams"},options:{ignoreHtmlClass:".*",processHtmlClass:"arithmatex"}}),"mermaidConfig"in window||(window.mermaidConfig={slate:{startOnLoad:!1,theme:"base",themeCSS:" * { --drac-page-bg: hsl(233, 15%, 23%); --drac-white-fg: hsl(60, 30%, 96%); --drac-purple-fg: hsl(265, 89%, 78%); --drac-purple-bg: hsl(265, 25%, 39%); --drac-yellow-fg: hsl(65, 92%, 76%); --drac-blue-fg: hsl(225, 27%, 51%); } /* General */ [id^='_diagram'] { background-color: var(--drac-page-bg); } /* Entity Relationship */ rect.relationshipLabelBox { opacity: 0.75 !important; fill: var(--drac-purple-bg) !important; } defs marker#ZERO_OR_MORE_END circle { fill: var(--drac-page-bg) !important; stroke: var(--drac-purple-fg) !important; } defs marker#ZERO_OR_MORE_END path { stroke: var(--drac-purple-fg) !important; } defs marker#ZERO_OR_MORE_START circle{ fill: var(--drac-page-bg) !important; stroke: var(--drac-purple-fg) !important; } defs marker#ZERO_OR_MORE_START path { stroke: var(--drac-purple-fg) !important; } defs marker#ONLY_ONE_START path { stroke: var(--drac-purple-fg) !important; } defs marker#ONLY_ONE_END path { stroke: var(--drac-purple-fg) !important; } defs marker#ZERO_OR_ONE_START path { stroke: var(--drac-purple-fg) !important; } defs marker#ZERO_OR_ONE_END path { stroke: var(--drac-purple-fg) !important; } defs marker#ONE_OR_MORE_START path { stroke: var(--drac-purple-fg) !important; } defs marker#ONE_OR_MORE_END path { stroke: var(--drac-purple-fg) !important; } /* Flowchart */ .labelText, :not(.branchLabel) > .label text { fill: var(--drac-purple-fg); } .edgeLabel text { fill: var(--drac-purple-fg) !important; } .edgeLabel rect { opacity: 0.75 !important; fill: var(--drac-purple-bg) !important; } .grey rect.label-container { fill: var(--drac-purple-bg) !important; stroke: var(--drac-purple-fg) !important; } /* Sequence */ line[id^='actor'] { stroke: var(--drac-blue-fg); } .noteText { fill: var(--drac-yellow-fg); } /* Gantt */ .sectionTitle { fill: var(--drac-purple-fg) !important; } .grid .tick line { stroke: var(--drac-blue-fg) !important; } .grid .tick text { fill: var(--drac-purple-fg); } /* Class Diagram */ .statediagram-state rect.divider { fill: transparent !important; } /* State Diagram */ .stateGroup circle[style$=\"fill: black;\"] { fill: var(--drac-purple-bg) !important; stroke: var(--drac-purple-bg) !important; } .stateGroup circle[style$=\"fill: white;\"] { fill: var(--drac-purple-bg) !important; stroke: var(--drac-purple-fg) !important; } .stateGroup .composit { fill: var(--drac-page-bg); } /* Pie */ text.slice { fill: var(--drac-white-fg) !important; } /* Git Graph */ .commit-bullets .commit-reverse, .commit-bullets .commit-merge, .commit-bullets .commit-highlight-inner { fill: var(--drac-page-bg) !important; stroke: var(--drac-page-bg) !important; } ",themeVariables:{darkMode:!0,background:"#323443",mainBkg:"#604b7d",textColor:"#bf95f9",lineColor:"#bf95f9",errorBkgColor:"#802c2c",errorTextColor:"#ff5757",primaryColor:"#604b7d",primaryTextColor:"#bf95f9",primaryBorderColor:"#bf95f9",secondaryColor:"#297d3e",secondaryTextColor:"#52fa7c",secondaryBorderColor:"#52fa7c",tertiaryColor:"#303952",tertiaryTextColor:"#6071a4",tertiaryBorderColor:"#6071a4",noteBkgColor:"#797d45",noteTextColor:"#f1fa89",noteBorderColor:"#f1fa89",edgeLabelBackground:"#604b7d",edgeLabelText:"#604b7d",actorLineColor:"#6071a4",activeTaskBkgColor:"#803d63",activeTaskBorderColor:"#ff7ac6",doneTaskBkgColor:"#297d3e",doneTaskBorderColor:"#52fa7c",critBkgColor:"#802c2c",critBorderColor:"#ff5757",taskTextColor:"#bf95f9",taskTextOutsideColor:"#bf95f9",taskTextLightColor:"#bf95f9",sectionBkgColor:"#bf95f9b3",sectionBkgColor2:"#bf95f966",altSectionBkgColor:"#323443",todayLineColor:"#ff7ac6",gridColor:"#6071a4",defaultLinkColor:"#8be8fd",altBackground:"#bf95f9",classText:"#bf95f9",fillType0:"#406080",fillType1:"#46747f",fillType2:"#297d3e",fillType3:"#805c36",fillType4:"#803d63",fillType5:"#604b7d",fillType6:"#802c2c",fillType7:"#797d45",fillType8:"#7c7c79",git0:"#ff5555",git1:"#ffb86c",git2:"#f1fa8c",git3:"#50fa7b",git4:"#8be9fd",git5:"#809fff",git6:"#ff79c6",git7:"#bd93f9",gitInv0:"#ff5555",gitInv1:"#ffb86c",gitInv2:"#f1fa8c",gitInv3:"#50fa7b",gitInv4:"#8be9fd",gitInv5:"#809fff",gitInv6:"#ff79c6",gitInv7:"#bd93f9",gitBranchLabel0:"#323443",gitBranchLabel1:"#323443",gitBranchLabel2:"#323443",gitBranchLabel3:"#323443",gitBranchLabel4:"#323443",gitBranchLabel5:"#323443",gitBranchLabel6:"#323443",gitBranchLabel7:"#323443",commitLabelColor:"#52fa7c",commitLabelBackground:"#297d3e"},flowchart:{useMaxWidth:!1},er:{useMaxWidth:!1},sequence:{useMaxWidth:!1,noteFontWeight:"14px",actorFontSize:"14px",messageFontSize:"16px"},journey:{useMaxWidth:!1},pie:{useMaxWidth:!1},gantt:{useMaxWidth:!1},gitGraph:{useMaxWidth:!1}},default:{startOnLoad:!1,theme:"default",flowchart:{useMaxWidth:!1},er:{useMaxWidth:!1},sequence:{useMaxWidth:!1,noteFontWeight:"14px",actorFontSize:"14px",messageFontSize:"16px"},journey:{useMaxWidth:!1},pie:{useMaxWidth:!1},gantt:{useMaxWidth:!1},gitGraph:{useMaxWidth:!1}}}),d=Promise.resolve(),u=Promise.resolve(),p=new MutationObserver(function(t){t.forEach(function(t){"attributes"===t.type&&(t.target.getAttribute("data-md-color-scheme"),"undefined"!=typeof mermaid&&s("diagram"))})}),window.document$.subscribe(function(){p.observe(document.querySelector("body"),{attributeFilter:["data-md-color-scheme"]}),"undefined"!=typeof mermaid&&(d=d.then(function(){s("diagram")}).catch(function(t){console.log("UML loading failed...".concat(t))})),"undefined"!=typeof katex?u=u.then(function(){m("arithmatex","katex")}).catch(function(t){console.log("Math loading failed...".concat(t))}):"undefined"!=typeof MathJax&&"typesetPromise"in MathJax&&(u=u.then(function(){m("arithmatex","mathjax")}).catch(function(t){console.log("Math loading failed...".concat(t))}))})}();
4
- //# sourceMappingURL=extra-loader-Ccztcqfq.js.map
@@ -1,17 +0,0 @@
1
- {% extends "base.html" %}
2
-
3
- {% block announce %}{% include "announce.html" ignore missing %}{% endblock %}
4
-
5
- {% block content %}
6
- {{ super() }}
7
- <footer class="sponsorship">
8
- <hr>
9
- <a href="https://github.com/sponsors/facelessuser" title="Become a sponsor">
10
- <span class="twemoji heart-throb-hover">
11
- {% set icon = "octicons/heart-fill-16" %}
12
- {% include ".icons/" ~ icon ~ ".svg" %}
13
- </span>
14
- </a>
15
- <hr>
16
- </footer>
17
- {% endblock %}
@@ -1,4 +0,0 @@
1
- zensical
2
- markdown
3
- pymdown-extensions
4
- pyspelling
@@ -1 +0,0 @@
1
- ruff
@@ -1,4 +0,0 @@
1
- pytest
2
- pytest-cov
3
- mock
4
- mypy
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes