parameterrun 0.5.0__tar.gz → 0.5.2__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.
- {parameterrun-0.5.0 → parameterrun-0.5.2}/.github/workflows/ci.yml +10 -1
- parameterrun-0.5.2/.github/workflows/docs.yml +53 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/.gitignore +3 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/CHANGELOG.md +20 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/PKG-INFO +64 -3
- {parameterrun-0.5.0 → parameterrun-0.5.2}/README.md +62 -2
- parameterrun-0.5.2/docs/assets/extra.css +33 -0
- parameterrun-0.5.2/docs/assets/favicon.ico +0 -0
- parameterrun-0.5.2/docs/assets/favicon.svg +13 -0
- parameterrun-0.5.2/docs/assets/logo-mark-dark.svg +9 -0
- parameterrun-0.5.2/docs/assets/logo-mark-light.svg +9 -0
- parameterrun-0.5.2/docs/assets/logo-readme-dark.svg +1 -0
- parameterrun-0.5.2/docs/assets/logo-readme-light.svg +1 -0
- parameterrun-0.5.2/docs/changelog.md +1 -0
- parameterrun-0.5.2/docs/contributing.md +3 -0
- parameterrun-0.5.2/docs/guide/backends.md +3 -0
- parameterrun-0.5.2/docs/guide/errors.md +5 -0
- parameterrun-0.5.2/docs/guide/progress.md +1 -0
- parameterrun-0.5.2/docs/guide/results.md +5 -0
- parameterrun-0.5.2/docs/index.md +14 -0
- parameterrun-0.5.2/docs/quickstart.md +5 -0
- parameterrun-0.5.2/docs/reference.md +12 -0
- {parameterrun-0.5.0/docs → parameterrun-0.5.2/internals}/github-actions.md +29 -5
- parameterrun-0.5.2/mkdocs.yml +91 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/pyproject.toml +23 -4
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/__init__.py +1 -1
- {parameterrun-0.5.0 → parameterrun-0.5.2}/.github/workflows/publish.yml +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/.github/workflows/release.yml +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/CONTRIBUTING.md +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/LICENSE +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/dev/checkpointing_design.md +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/dev/distributed_shuffle.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/dev/profile_scalene.sh +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/dev/very_large_swap.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/examples/long_example.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/examples/minimal_example.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/examples/minimal_example_mpi.py +0 -0
- {parameterrun-0.5.0/docs → parameterrun-0.5.2/internals}/architecture.md +0 -0
- {parameterrun-0.5.0/docs → parameterrun-0.5.2/internals}/checkpoints-and-shuffle.md +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/scripts/bump_version.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_checkpoint.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_delivery.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_errors.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_inputs.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_joblib_backend.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_mpi_dynamic.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_mpi_static.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_mpi_transfer.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_progress.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_pseudo_random.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_results.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_store.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_utils.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/parallel_utils.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/py.typed +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_checkpoint.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_delivery.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_depths.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_dynamic_schedule.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_format_input.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_get_iteration.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_joblib.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_mpi_integration.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_mpi_rank_scaling.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_normalized_time.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_on_error.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_parameter_run.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_pbar_format.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_pbar_options.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_pseudo_random.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_result_checks.py +0 -0
- {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_review_regressions.py +0 -0
|
@@ -31,7 +31,16 @@ jobs:
|
|
|
31
31
|
run: uv sync
|
|
32
32
|
|
|
33
33
|
- name: Tests
|
|
34
|
-
run: uv run pytest -m "not mpi and not mpi_subprocess"
|
|
34
|
+
run: uv run pytest -m "not mpi and not mpi_subprocess" --cov-report=xml
|
|
35
|
+
|
|
36
|
+
# One upload is enough for the README badge; a missing token or Codecov outage must not fail CI
|
|
37
|
+
- name: Upload coverage to Codecov
|
|
38
|
+
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
|
|
39
|
+
uses: codecov/codecov-action@v5
|
|
40
|
+
with:
|
|
41
|
+
files: coverage.xml
|
|
42
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
43
|
+
fail_ci_if_error: false
|
|
35
44
|
|
|
36
45
|
- name: Lint
|
|
37
46
|
run: uv run ruff check .
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
name: Docs
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [main]
|
|
6
|
+
push:
|
|
7
|
+
branches: [main]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: docs-${{ github.ref }}
|
|
15
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
build:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v6
|
|
22
|
+
|
|
23
|
+
- uses: actions/setup-python@v6
|
|
24
|
+
with:
|
|
25
|
+
python-version: "3.12"
|
|
26
|
+
|
|
27
|
+
- name: Install uv
|
|
28
|
+
run: python -m pip install uv
|
|
29
|
+
|
|
30
|
+
- name: Sync docs environment
|
|
31
|
+
run: uv sync --only-group docs
|
|
32
|
+
|
|
33
|
+
- name: Build site
|
|
34
|
+
run: uv run --no-sync zensical build --strict
|
|
35
|
+
|
|
36
|
+
- uses: actions/upload-pages-artifact@v4
|
|
37
|
+
if: github.event_name != 'pull_request'
|
|
38
|
+
with:
|
|
39
|
+
path: site
|
|
40
|
+
|
|
41
|
+
deploy:
|
|
42
|
+
if: github.event_name != 'pull_request'
|
|
43
|
+
needs: build
|
|
44
|
+
runs-on: ubuntu-latest
|
|
45
|
+
permissions:
|
|
46
|
+
pages: write
|
|
47
|
+
id-token: write
|
|
48
|
+
environment:
|
|
49
|
+
name: github-pages
|
|
50
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
51
|
+
steps:
|
|
52
|
+
- id: deployment
|
|
53
|
+
uses: actions/deploy-pages@v4
|
|
@@ -4,6 +4,26 @@ All notable changes to this project are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on Keep a Changelog and the project follows Semantic Versioning.
|
|
6
6
|
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [0.5.2] - 2026-11-06
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- Documentation site: the home page shows the navigation sidebar, duplicate page titles are gone, and the header logo
|
|
14
|
+
and the browser-tab icon use a single-colour version of the mark (dark on light themes, light on dark themes).
|
|
15
|
+
- CI runs only on pull requests into `main`, not again after the merge. The README CI and coverage badges follow the
|
|
16
|
+
pull-request runs.
|
|
17
|
+
|
|
18
|
+
## [0.5.1] - 2026-11-06
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- Project logo: light/dark wordmark at the top of the README, plus icons, favicons and a GitHub social preview in
|
|
23
|
+
`logo/` (source file `logo/logos.af`). The `logo/` folder is excluded from the sdist.
|
|
24
|
+
- Documentation site at <https://davtax.github.io/ParameterRun/> (built with Zensical, checked on pull requests and deployed to GitHub Pages on every
|
|
25
|
+
push to `main`): user guide built from the README, API reference from the docstring, and changelog.
|
|
26
|
+
|
|
7
27
|
## [0.5.0] - 2026-11-06
|
|
8
28
|
|
|
9
29
|
### Added
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: parameterrun
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.2
|
|
4
4
|
Summary: Parallel parameter sweeps with joblib/MPI and tqdm progress bars.
|
|
5
5
|
Project-URL: Homepage, https://github.com/Davtax/ParameterRun
|
|
6
|
+
Project-URL: Documentation, https://davtax.github.io/ParameterRun/
|
|
6
7
|
Project-URL: Repository, https://github.com/Davtax/ParameterRun
|
|
7
8
|
Project-URL: Issues, https://github.com/Davtax/ParameterRun/issues
|
|
8
9
|
Project-URL: Changelog, https://github.com/Davtax/ParameterRun/blob/main/CHANGELOG.md
|
|
@@ -31,8 +32,29 @@ Provides-Extra: mpi
|
|
|
31
32
|
Requires-Dist: mpi4py>=3.1; extra == 'mpi'
|
|
32
33
|
Description-Content-Type: text/markdown
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
<h1 align="center">
|
|
36
|
+
<picture>
|
|
37
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/Davtax/ParameterRun/main/logo/svg/logo-readme-dark.svg">
|
|
38
|
+
<img src="https://raw.githubusercontent.com/Davtax/ParameterRun/main/logo/svg/logo-readme-light.svg" alt="ParameterRun" width="520">
|
|
39
|
+
</picture>
|
|
40
|
+
</h1>
|
|
41
|
+
|
|
42
|
+
<p align="center">
|
|
43
|
+
<a href="https://pypi.org/project/parameterrun/"><img src="https://img.shields.io/pypi/v/parameterrun" alt="PyPI"></a>
|
|
44
|
+
<a href="https://github.com/Davtax/ParameterRun/releases"><img src="https://img.shields.io/github/v/release/Davtax/ParameterRun" alt="GitHub release"></a>
|
|
45
|
+
<a href="https://pepy.tech/project/parameterrun"><img src="https://static.pepy.tech/badge/parameterrun/month" alt="Downloads"></a>
|
|
46
|
+
<a href="https://pypi.org/project/parameterrun/"><img src="https://img.shields.io/pypi/pyversions/parameterrun" alt="Python versions"></a>
|
|
47
|
+
<a href="https://github.com/Davtax/ParameterRun/actions/workflows/ci.yml"><img src="https://github.com/Davtax/ParameterRun/actions/workflows/ci.yml/badge.svg?event=pull_request" alt="CI"></a>
|
|
48
|
+
<a href="https://codecov.io/gh/Davtax/ParameterRun/tree/dev"><img src="https://codecov.io/gh/Davtax/ParameterRun/branch/dev/graph/badge.svg" alt="Coverage"></a>
|
|
49
|
+
<a href="https://github.com/Davtax/ParameterRun/blob/main/LICENSE"><img src="https://img.shields.io/pypi/l/parameterrun" alt="License"></a>
|
|
50
|
+
<a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff"></a>
|
|
51
|
+
<a href="https://mypy-lang.org/"><img src="https://www.mypy-lang.org/static/mypy_badge.svg" alt="Checked with mypy"></a>
|
|
52
|
+
<a href="https://github.com/astral-sh/uv"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json" alt="uv"></a>
|
|
53
|
+
</p>
|
|
54
|
+
|
|
55
|
+
**Documentation:** <https://davtax.github.io/ParameterRun/>
|
|
56
|
+
|
|
57
|
+
<!-- --8<-- [start:intro] -->
|
|
36
58
|
`parameterrun` is a lightweight utility for running parameter sweeps in Python with a simple, function-based API.
|
|
37
59
|
|
|
38
60
|
It is designed for scientific and numerical workflows where you want to evaluate a function over one or more parameter
|
|
@@ -47,7 +69,9 @@ The package supports:
|
|
|
47
69
|
- MPI execution with `mpi4py`
|
|
48
70
|
- automatic reshaping of outputs into arrays
|
|
49
71
|
- functions returning either one output or multiple outputs
|
|
72
|
+
<!-- --8<-- [end:intro] -->
|
|
50
73
|
|
|
74
|
+
<!-- --8<-- [start:install] -->
|
|
51
75
|
## Installation
|
|
52
76
|
|
|
53
77
|
### With `pip`
|
|
@@ -62,6 +86,9 @@ pip install parameterrun
|
|
|
62
86
|
pip install parameterrun[mpi]
|
|
63
87
|
```
|
|
64
88
|
|
|
89
|
+
<!-- --8<-- [end:install] -->
|
|
90
|
+
|
|
91
|
+
<!-- --8<-- [start:idea] -->
|
|
65
92
|
## Basic idea
|
|
66
93
|
|
|
67
94
|
The main entry point is:
|
|
@@ -74,6 +101,9 @@ The function `parameterrun(...)` evaluates a user-defined function over a set of
|
|
|
74
101
|
sweep are identified by their names exactly as they appear in the target function signature. Additional fixed arguments
|
|
75
102
|
can be passed as keyword arguments.
|
|
76
103
|
|
|
104
|
+
<!-- --8<-- [end:idea] -->
|
|
105
|
+
|
|
106
|
+
<!-- --8<-- [start:quickstart] -->
|
|
77
107
|
## Quick start
|
|
78
108
|
|
|
79
109
|
### 1. Single parameter
|
|
@@ -129,6 +159,9 @@ print(result.shape) # (2, 3)
|
|
|
129
159
|
|
|
130
160
|
This grouped-input mode is useful when some parameters are logically linked and should not be combined independently.
|
|
131
161
|
|
|
162
|
+
<!-- --8<-- [end:quickstart] -->
|
|
163
|
+
|
|
164
|
+
<!-- --8<-- [start:outputs] -->
|
|
132
165
|
## Multiple outputs
|
|
133
166
|
|
|
134
167
|
If the target function returns a tuple, parameterrun returns a list of arrays, one per output channel.
|
|
@@ -169,6 +202,9 @@ If `fun` returns `None` for some points (for example, a failed solver), a `Runti
|
|
|
169
202
|
the parameters of the first one, because the result is then no longer a numeric array. Returning a NaN array of the
|
|
170
203
|
right shape for failed points keeps the result numeric.
|
|
171
204
|
|
|
205
|
+
<!-- --8<-- [end:outputs] -->
|
|
206
|
+
|
|
207
|
+
<!-- --8<-- [start:errors] -->
|
|
172
208
|
## Errors in the function
|
|
173
209
|
|
|
174
210
|
`on_error` controls what happens when `fun` raises an exception at some point:
|
|
@@ -188,6 +224,9 @@ result = parameterrun(my_function, param_names="x", param_values=[1, 2, 3], on_e
|
|
|
188
224
|
|
|
189
225
|
Only `Exception` subclasses are caught: `KeyboardInterrupt` and `SystemExit` always propagate.
|
|
190
226
|
|
|
227
|
+
<!-- --8<-- [end:errors] -->
|
|
228
|
+
|
|
229
|
+
<!-- --8<-- [start:validation] -->
|
|
191
230
|
## Validation behavior
|
|
192
231
|
|
|
193
232
|
`parameterrun` validates inputs before launching workers and raises clear `ValueError`s when:
|
|
@@ -197,6 +236,9 @@ Only `Exception` subclasses are caught: `KeyboardInterrupt` and `SystemExit` alw
|
|
|
197
236
|
- extra keyword arguments do not match the target function signature
|
|
198
237
|
- a keyword argument conflicts with a swept parameter name
|
|
199
238
|
|
|
239
|
+
<!-- --8<-- [end:validation] -->
|
|
240
|
+
|
|
241
|
+
<!-- --8<-- [start:backends] -->
|
|
200
242
|
## Parallel backend
|
|
201
243
|
|
|
202
244
|
`parameterrun` supports two execution backends:
|
|
@@ -277,6 +319,9 @@ result = parameterrun(my_function, param_names="x", param_values=[1, 2, 3], back
|
|
|
277
319
|
|
|
278
320
|
If rank 0 fails while finishing the result (for example with `reshape="strict"`), every rank raises instead of waiting.
|
|
279
321
|
|
|
322
|
+
<!-- --8<-- [end:backends] -->
|
|
323
|
+
|
|
324
|
+
<!-- --8<-- [start:saving] -->
|
|
280
325
|
## Saving the result to a file
|
|
281
326
|
|
|
282
327
|
`result_file` writes the result, reshaped to the grid, to a `.npy` file on rank 0. With several outputs there is one
|
|
@@ -297,6 +342,9 @@ data = np.load("sweep.npy") # Same as result
|
|
|
297
342
|
`RuntimeWarning`. String outputs are written as a NumPy string array.
|
|
298
343
|
- The directory is checked before anything is computed.
|
|
299
344
|
|
|
345
|
+
<!-- --8<-- [end:saving] -->
|
|
346
|
+
|
|
347
|
+
<!-- --8<-- [start:checkpoints] -->
|
|
300
348
|
## Checkpoints for long runs
|
|
301
349
|
|
|
302
350
|
`checkpoint` saves the finished points of a long run to a directory, so that a run killed by a crash, a node failure or
|
|
@@ -340,6 +388,9 @@ result = parameterrun(my_function, param_names=["x", "y"], param_values=[xs, ys]
|
|
|
340
388
|
the previous snapshot. Numeric outputs are stored as plain arrays, read without pickle. Only non-numeric outputs
|
|
341
389
|
(strings, dicts, ragged arrays, ...) are pickled: load such snapshots only from sources you trust.
|
|
342
390
|
|
|
391
|
+
<!-- --8<-- [end:checkpoints] -->
|
|
392
|
+
|
|
393
|
+
<!-- --8<-- [start:progress] -->
|
|
343
394
|
## Progress bars and verbosity
|
|
344
395
|
|
|
345
396
|
By default (`pbar_bool=None`), the progress bar is shown when the output is a terminal or a Jupyter notebook, and hidden
|
|
@@ -362,6 +413,9 @@ result = parameterrun(my_function, param_names="x", param_values=[1, 2, 3], verb
|
|
|
362
413
|
The progress-bar description is generated automatically from the function name and parameter names, unless you provide
|
|
363
414
|
`desc` explicitly.
|
|
364
415
|
|
|
416
|
+
<!-- --8<-- [end:progress] -->
|
|
417
|
+
|
|
418
|
+
<!-- --8<-- [start:api] -->
|
|
365
419
|
## API reference
|
|
366
420
|
|
|
367
421
|
`parameterrun`
|
|
@@ -398,6 +452,9 @@ parameterrun(fun, param_names, param_values, n_workers=-1, pbar_bool=None, pbar_
|
|
|
398
452
|
* `keep_checkpoint`: keep the snapshot after success (default `True`)
|
|
399
453
|
* `**kwargs`: extra fixed keyword arguments forwarded to `fun`. They cannot reuse the names of the parameters above.
|
|
400
454
|
|
|
455
|
+
<!-- --8<-- [end:api] -->
|
|
456
|
+
|
|
457
|
+
<!-- --8<-- [start:inputs] -->
|
|
401
458
|
## Input formats
|
|
402
459
|
|
|
403
460
|
`parameterrun` accepts three input styles.
|
|
@@ -426,6 +483,9 @@ param_names = [["x", "y"], ["z"]]
|
|
|
426
483
|
param_values = [[[1, 2], [10, 20]], [[100, 200, 300]], ]
|
|
427
484
|
```
|
|
428
485
|
|
|
486
|
+
<!-- --8<-- [end:inputs] -->
|
|
487
|
+
|
|
488
|
+
<!-- --8<-- [start:devchecks] -->
|
|
429
489
|
## Development checks
|
|
430
490
|
|
|
431
491
|
Before opening a PR or publishing a release, run:
|
|
@@ -445,3 +505,4 @@ uv sync --extra mpi
|
|
|
445
505
|
mpirun -n 4 uv run pytest -m mpi -o addopts="-q -m mpi"
|
|
446
506
|
```
|
|
447
507
|
|
|
508
|
+
<!-- --8<-- [end:devchecks] -->
|
|
@@ -1,5 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
<h1 align="center">
|
|
2
|
+
<picture>
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="logo/svg/logo-readme-dark.svg">
|
|
4
|
+
<img src="logo/svg/logo-readme-light.svg" alt="ParameterRun" width="520">
|
|
5
|
+
</picture>
|
|
6
|
+
</h1>
|
|
7
|
+
|
|
8
|
+
<p align="center">
|
|
9
|
+
<a href="https://pypi.org/project/parameterrun/"><img src="https://img.shields.io/pypi/v/parameterrun" alt="PyPI"></a>
|
|
10
|
+
<a href="https://github.com/Davtax/ParameterRun/releases"><img src="https://img.shields.io/github/v/release/Davtax/ParameterRun" alt="GitHub release"></a>
|
|
11
|
+
<a href="https://pepy.tech/project/parameterrun"><img src="https://static.pepy.tech/badge/parameterrun/month" alt="Downloads"></a>
|
|
12
|
+
<a href="https://pypi.org/project/parameterrun/"><img src="https://img.shields.io/pypi/pyversions/parameterrun" alt="Python versions"></a>
|
|
13
|
+
<a href="https://github.com/Davtax/ParameterRun/actions/workflows/ci.yml"><img src="https://github.com/Davtax/ParameterRun/actions/workflows/ci.yml/badge.svg?event=pull_request" alt="CI"></a>
|
|
14
|
+
<a href="https://codecov.io/gh/Davtax/ParameterRun/tree/dev"><img src="https://codecov.io/gh/Davtax/ParameterRun/branch/dev/graph/badge.svg" alt="Coverage"></a>
|
|
15
|
+
<a href="https://github.com/Davtax/ParameterRun/blob/main/LICENSE"><img src="https://img.shields.io/pypi/l/parameterrun" alt="License"></a>
|
|
16
|
+
<a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff"></a>
|
|
17
|
+
<a href="https://mypy-lang.org/"><img src="https://www.mypy-lang.org/static/mypy_badge.svg" alt="Checked with mypy"></a>
|
|
18
|
+
<a href="https://github.com/astral-sh/uv"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json" alt="uv"></a>
|
|
19
|
+
</p>
|
|
20
|
+
|
|
21
|
+
**Documentation:** <https://davtax.github.io/ParameterRun/>
|
|
22
|
+
|
|
23
|
+
<!-- --8<-- [start:intro] -->
|
|
3
24
|
`parameterrun` is a lightweight utility for running parameter sweeps in Python with a simple, function-based API.
|
|
4
25
|
|
|
5
26
|
It is designed for scientific and numerical workflows where you want to evaluate a function over one or more parameter
|
|
@@ -14,7 +35,9 @@ The package supports:
|
|
|
14
35
|
- MPI execution with `mpi4py`
|
|
15
36
|
- automatic reshaping of outputs into arrays
|
|
16
37
|
- functions returning either one output or multiple outputs
|
|
38
|
+
<!-- --8<-- [end:intro] -->
|
|
17
39
|
|
|
40
|
+
<!-- --8<-- [start:install] -->
|
|
18
41
|
## Installation
|
|
19
42
|
|
|
20
43
|
### With `pip`
|
|
@@ -29,6 +52,9 @@ pip install parameterrun
|
|
|
29
52
|
pip install parameterrun[mpi]
|
|
30
53
|
```
|
|
31
54
|
|
|
55
|
+
<!-- --8<-- [end:install] -->
|
|
56
|
+
|
|
57
|
+
<!-- --8<-- [start:idea] -->
|
|
32
58
|
## Basic idea
|
|
33
59
|
|
|
34
60
|
The main entry point is:
|
|
@@ -41,6 +67,9 @@ The function `parameterrun(...)` evaluates a user-defined function over a set of
|
|
|
41
67
|
sweep are identified by their names exactly as they appear in the target function signature. Additional fixed arguments
|
|
42
68
|
can be passed as keyword arguments.
|
|
43
69
|
|
|
70
|
+
<!-- --8<-- [end:idea] -->
|
|
71
|
+
|
|
72
|
+
<!-- --8<-- [start:quickstart] -->
|
|
44
73
|
## Quick start
|
|
45
74
|
|
|
46
75
|
### 1. Single parameter
|
|
@@ -96,6 +125,9 @@ print(result.shape) # (2, 3)
|
|
|
96
125
|
|
|
97
126
|
This grouped-input mode is useful when some parameters are logically linked and should not be combined independently.
|
|
98
127
|
|
|
128
|
+
<!-- --8<-- [end:quickstart] -->
|
|
129
|
+
|
|
130
|
+
<!-- --8<-- [start:outputs] -->
|
|
99
131
|
## Multiple outputs
|
|
100
132
|
|
|
101
133
|
If the target function returns a tuple, parameterrun returns a list of arrays, one per output channel.
|
|
@@ -136,6 +168,9 @@ If `fun` returns `None` for some points (for example, a failed solver), a `Runti
|
|
|
136
168
|
the parameters of the first one, because the result is then no longer a numeric array. Returning a NaN array of the
|
|
137
169
|
right shape for failed points keeps the result numeric.
|
|
138
170
|
|
|
171
|
+
<!-- --8<-- [end:outputs] -->
|
|
172
|
+
|
|
173
|
+
<!-- --8<-- [start:errors] -->
|
|
139
174
|
## Errors in the function
|
|
140
175
|
|
|
141
176
|
`on_error` controls what happens when `fun` raises an exception at some point:
|
|
@@ -155,6 +190,9 @@ result = parameterrun(my_function, param_names="x", param_values=[1, 2, 3], on_e
|
|
|
155
190
|
|
|
156
191
|
Only `Exception` subclasses are caught: `KeyboardInterrupt` and `SystemExit` always propagate.
|
|
157
192
|
|
|
193
|
+
<!-- --8<-- [end:errors] -->
|
|
194
|
+
|
|
195
|
+
<!-- --8<-- [start:validation] -->
|
|
158
196
|
## Validation behavior
|
|
159
197
|
|
|
160
198
|
`parameterrun` validates inputs before launching workers and raises clear `ValueError`s when:
|
|
@@ -164,6 +202,9 @@ Only `Exception` subclasses are caught: `KeyboardInterrupt` and `SystemExit` alw
|
|
|
164
202
|
- extra keyword arguments do not match the target function signature
|
|
165
203
|
- a keyword argument conflicts with a swept parameter name
|
|
166
204
|
|
|
205
|
+
<!-- --8<-- [end:validation] -->
|
|
206
|
+
|
|
207
|
+
<!-- --8<-- [start:backends] -->
|
|
167
208
|
## Parallel backend
|
|
168
209
|
|
|
169
210
|
`parameterrun` supports two execution backends:
|
|
@@ -244,6 +285,9 @@ result = parameterrun(my_function, param_names="x", param_values=[1, 2, 3], back
|
|
|
244
285
|
|
|
245
286
|
If rank 0 fails while finishing the result (for example with `reshape="strict"`), every rank raises instead of waiting.
|
|
246
287
|
|
|
288
|
+
<!-- --8<-- [end:backends] -->
|
|
289
|
+
|
|
290
|
+
<!-- --8<-- [start:saving] -->
|
|
247
291
|
## Saving the result to a file
|
|
248
292
|
|
|
249
293
|
`result_file` writes the result, reshaped to the grid, to a `.npy` file on rank 0. With several outputs there is one
|
|
@@ -264,6 +308,9 @@ data = np.load("sweep.npy") # Same as result
|
|
|
264
308
|
`RuntimeWarning`. String outputs are written as a NumPy string array.
|
|
265
309
|
- The directory is checked before anything is computed.
|
|
266
310
|
|
|
311
|
+
<!-- --8<-- [end:saving] -->
|
|
312
|
+
|
|
313
|
+
<!-- --8<-- [start:checkpoints] -->
|
|
267
314
|
## Checkpoints for long runs
|
|
268
315
|
|
|
269
316
|
`checkpoint` saves the finished points of a long run to a directory, so that a run killed by a crash, a node failure or
|
|
@@ -307,6 +354,9 @@ result = parameterrun(my_function, param_names=["x", "y"], param_values=[xs, ys]
|
|
|
307
354
|
the previous snapshot. Numeric outputs are stored as plain arrays, read without pickle. Only non-numeric outputs
|
|
308
355
|
(strings, dicts, ragged arrays, ...) are pickled: load such snapshots only from sources you trust.
|
|
309
356
|
|
|
357
|
+
<!-- --8<-- [end:checkpoints] -->
|
|
358
|
+
|
|
359
|
+
<!-- --8<-- [start:progress] -->
|
|
310
360
|
## Progress bars and verbosity
|
|
311
361
|
|
|
312
362
|
By default (`pbar_bool=None`), the progress bar is shown when the output is a terminal or a Jupyter notebook, and hidden
|
|
@@ -329,6 +379,9 @@ result = parameterrun(my_function, param_names="x", param_values=[1, 2, 3], verb
|
|
|
329
379
|
The progress-bar description is generated automatically from the function name and parameter names, unless you provide
|
|
330
380
|
`desc` explicitly.
|
|
331
381
|
|
|
382
|
+
<!-- --8<-- [end:progress] -->
|
|
383
|
+
|
|
384
|
+
<!-- --8<-- [start:api] -->
|
|
332
385
|
## API reference
|
|
333
386
|
|
|
334
387
|
`parameterrun`
|
|
@@ -365,6 +418,9 @@ parameterrun(fun, param_names, param_values, n_workers=-1, pbar_bool=None, pbar_
|
|
|
365
418
|
* `keep_checkpoint`: keep the snapshot after success (default `True`)
|
|
366
419
|
* `**kwargs`: extra fixed keyword arguments forwarded to `fun`. They cannot reuse the names of the parameters above.
|
|
367
420
|
|
|
421
|
+
<!-- --8<-- [end:api] -->
|
|
422
|
+
|
|
423
|
+
<!-- --8<-- [start:inputs] -->
|
|
368
424
|
## Input formats
|
|
369
425
|
|
|
370
426
|
`parameterrun` accepts three input styles.
|
|
@@ -393,6 +449,9 @@ param_names = [["x", "y"], ["z"]]
|
|
|
393
449
|
param_values = [[[1, 2], [10, 20]], [[100, 200, 300]], ]
|
|
394
450
|
```
|
|
395
451
|
|
|
452
|
+
<!-- --8<-- [end:inputs] -->
|
|
453
|
+
|
|
454
|
+
<!-- --8<-- [start:devchecks] -->
|
|
396
455
|
## Development checks
|
|
397
456
|
|
|
398
457
|
Before opening a PR or publishing a release, run:
|
|
@@ -412,3 +471,4 @@ uv sync --extra mpi
|
|
|
412
471
|
mpirun -n 4 uv run pytest -m mpi -o addopts="-q -m mpi"
|
|
413
472
|
```
|
|
414
473
|
|
|
474
|
+
<!-- --8<-- [end:devchecks] -->
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/* Brand colours from the logo (logo/logos.af). */
|
|
2
|
+
:root,
|
|
3
|
+
[data-md-color-scheme="default"] {
|
|
4
|
+
--md-primary-fg-color: #1c1c1e;
|
|
5
|
+
--md-primary-fg-color--light: #3a3a3c;
|
|
6
|
+
--md-primary-fg-color--dark: #000000;
|
|
7
|
+
--md-accent-fg-color: #0a84ff;
|
|
8
|
+
--md-typeset-a-color: #0a84ff;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
[data-md-color-scheme="slate"] {
|
|
12
|
+
--md-primary-fg-color: #1c1c1e;
|
|
13
|
+
--md-primary-fg-color--light: #3a3a3c;
|
|
14
|
+
--md-primary-fg-color--dark: #000000;
|
|
15
|
+
--md-accent-fg-color: #409cff;
|
|
16
|
+
--md-typeset-a-color: #409cff;
|
|
17
|
+
--md-default-bg-color: #111113;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.md-header__button.md-logo img {
|
|
21
|
+
height: 1.6rem;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.pr-hero {
|
|
25
|
+
display: block;
|
|
26
|
+
max-width: 520px;
|
|
27
|
+
margin: 1rem auto 2rem;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Header logo: single-colour mark, dark on the light theme, light on the dark theme. */
|
|
31
|
+
[data-md-color-scheme="slate"] .md-header__button.md-logo img {
|
|
32
|
+
content: url("logo-mark-light.svg");
|
|
33
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
|
|
2
|
+
<style>
|
|
3
|
+
.ink { fill: #1c1c1e; }
|
|
4
|
+
@media (prefers-color-scheme: dark) { .ink { fill: #f5f5f7; } }
|
|
5
|
+
</style>
|
|
6
|
+
<path class="ink" fill-opacity="0.28" d="M4.5 3H25.5A3.5 3.5 0 0 1 25.5 10H4.5Z"/>
|
|
7
|
+
<path class="ink" fill-opacity="0.28" d="M4.5 12.5H25.5A3.5 3.5 0 0 1 25.5 19.5H4.5Z"/>
|
|
8
|
+
<path class="ink" fill-opacity="0.28" d="M4.5 22H25.5A3.5 3.5 0 0 1 25.5 29H4.5Z"/>
|
|
9
|
+
<path class="ink" d="M4.5 3H25.5A3.5 3.5 0 0 1 25.5 10H4.5Z"/>
|
|
10
|
+
<path class="ink" d="M4.5 12.5H18.5A3.5 3.5 0 0 1 18.5 19.5H4.5Z"/>
|
|
11
|
+
<path class="ink" d="M4.5 22H11.5A3.5 3.5 0 0 1 11.5 29H4.5Z"/>
|
|
12
|
+
<rect class="ink" x="1" y="3" width="7" height="26" rx="3.5"/>
|
|
13
|
+
</svg>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
|
|
2
|
+
<path fill="#1c1c1e" fill-opacity="0.28" d="M4.5 3H25.5A3.5 3.5 0 0 1 25.5 10H4.5Z"/>
|
|
3
|
+
<path fill="#1c1c1e" fill-opacity="0.28" d="M4.5 12.5H25.5A3.5 3.5 0 0 1 25.5 19.5H4.5Z"/>
|
|
4
|
+
<path fill="#1c1c1e" fill-opacity="0.28" d="M4.5 22H25.5A3.5 3.5 0 0 1 25.5 29H4.5Z"/>
|
|
5
|
+
<path fill="#1c1c1e" d="M4.5 3H25.5A3.5 3.5 0 0 1 25.5 10H4.5Z"/>
|
|
6
|
+
<path fill="#1c1c1e" d="M4.5 12.5H18.5A3.5 3.5 0 0 1 18.5 19.5H4.5Z"/>
|
|
7
|
+
<path fill="#1c1c1e" d="M4.5 22H11.5A3.5 3.5 0 0 1 11.5 29H4.5Z"/>
|
|
8
|
+
<rect fill="#1c1c1e" x="1" y="3" width="7" height="26" rx="3.5"/>
|
|
9
|
+
</svg>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
|
|
2
|
+
<path fill="#f5f5f7" fill-opacity="0.28" d="M4.5 3H25.5A3.5 3.5 0 0 1 25.5 10H4.5Z"/>
|
|
3
|
+
<path fill="#f5f5f7" fill-opacity="0.28" d="M4.5 12.5H25.5A3.5 3.5 0 0 1 25.5 19.5H4.5Z"/>
|
|
4
|
+
<path fill="#f5f5f7" fill-opacity="0.28" d="M4.5 22H25.5A3.5 3.5 0 0 1 25.5 29H4.5Z"/>
|
|
5
|
+
<path fill="#f5f5f7" d="M4.5 3H25.5A3.5 3.5 0 0 1 25.5 10H4.5Z"/>
|
|
6
|
+
<path fill="#f5f5f7" d="M4.5 12.5H18.5A3.5 3.5 0 0 1 18.5 19.5H4.5Z"/>
|
|
7
|
+
<path fill="#f5f5f7" d="M4.5 22H11.5A3.5 3.5 0 0 1 11.5 29H4.5Z"/>
|
|
8
|
+
<rect fill="#f5f5f7" x="1" y="3" width="7" height="26" rx="3.5"/>
|
|
9
|
+
</svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="730" height="206" viewBox="325 821 3042 858" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:affinity="https://www.affinity.studio/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><rect id="Logo---horizontal-dark" affinity:id="Logo – horizontal dark" x="0" y="0" width="3750" height="2500" style="fill:none;"/><g id="Logo---horizontal-dark1" affinity:id="Logo – horizontal dark"><path d="M379.167,829.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l0,-91.667Z" style="fill:#2c2c2e;"/><path d="M379.167,829.167l579.167,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-579.167,0l0,-91.667Z" style="fill:#409cff;"/><path d="M1239.75,875c0,18.226 -14.774,33 -33,33c-18.226,0 -33,-14.774 -33,-33c0,-18.226 14.774,-33 33,-33c18.226,0 33,14.774 33,33Z" style="fill:#409cff;"/><path d="M379.167,979.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l0,-91.667Z" style="fill:#2c2c2e;"/><path d="M379.167,979.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l0,-91.667Z" style="fill:#40c8f0;"/><path d="M1239.75,1025c0,18.226 -14.774,33 -33,33c-18.226,0 -33,-14.774 -33,-33c0,-18.226 14.774,-33 33,-33c18.226,0 33,14.774 33,33Z" style="fill:#40c8f0;"/><path d="M379.167,1129.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l0,-91.667Z" style="fill:#2c2c2e;"/><path d="M379.167,1129.167l579.167,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-579.167,0l0,-91.667Z" style="fill:#5ee0c8;"/><path d="M1239.75,1175c0,18.226 -14.774,33 -33,33c-18.226,0 -33,-14.774 -33,-33c0,-18.226 14.774,-33 33,-33c18.226,0 33,14.774 33,33Z" style="fill:#5ee0c8;"/><path d="M379.167,1279.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l0,-91.667Z" style="fill:#2c2c2e;"/><path d="M379.167,1279.167l337.5,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-337.5,0l0,-91.667Z" style="fill:#5edc9e;"/><path d="M379.167,1429.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l0,-91.667Z" style="fill:#2c2c2e;"/><path d="M379.167,1429.167l212.5,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-212.5,0l0,-91.667Z" style="fill:#b4e05a;"/><path d="M379.167,1579.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l0,-91.667Z" style="fill:#2c2c2e;"/><path d="M379.167,1579.167l120.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-120.833,0l0,-91.667Z" style="fill:#ffc94d;"/><path d="M379.167,829.167c25.314,0 45.833,20.52 45.833,45.833l0,750c0,25.314 -20.52,45.833 -45.833,45.833c-25.314,0 -45.833,-20.52 -45.833,-45.833l0,-750c0,-25.314 20.52,-45.833 45.833,-45.833Z" style="fill:#f5f5f7;"/><g><path d="M1369.434,1293.896l-0.684,0l0,111.597l-15.723,0l0,-255.493l15.723,0l0,36.06l0.684,0c6.266,-12.874 15.238,-22.815 26.917,-29.822c11.678,-7.007 24.524,-10.51 38.538,-10.51c22.217,0 39.563,7.662 52.039,22.986c12.476,15.324 18.713,36.145 18.713,62.463c0,29.281 -7.149,52.95 -21.448,71.008c-14.299,18.058 -33.183,27.087 -56.653,27.087c-26.204,0 -45.573,-11.792 -58.105,-35.376Zm-0.684,-65.112l0,22.046c0,17.546 5.526,32.613 16.577,45.203c11.051,12.59 25.578,18.884 43.579,18.884c17.887,0 32.414,-7.662 43.579,-22.986c11.165,-15.324 16.748,-35.461 16.748,-60.413c0,-21.875 -5.127,-39.25 -15.381,-52.124c-10.254,-12.874 -23.926,-19.312 -41.016,-19.312c-20.394,0 -36.174,6.836 -47.339,20.508c-11.165,13.672 -16.748,29.736 -16.748,48.193Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M1653.638,1325l0,-35.034l-0.684,0c-5.583,11.963 -13.7,21.505 -24.353,28.625c-10.653,7.121 -22.473,10.681 -35.461,10.681c-16.634,0 -29.793,-4.671 -39.478,-14.014c-9.684,-9.342 -14.526,-21.134 -14.526,-35.376c0,-30.534 20.223,-48.991 60.669,-55.371l53.833,-8.032c0,-37.598 -14.128,-56.396 -42.383,-56.396c-19.255,0 -37.996,7.747 -56.226,23.242l0,-18.97c6.494,-5.127 15.295,-9.513 26.404,-13.159c11.108,-3.646 21.562,-5.469 31.36,-5.469c18.001,0 31.93,5.583 41.785,16.748c9.855,11.165 14.783,27.401 14.783,48.706l0,113.818l-15.723,0Zm-48.193,-87.158c-18.343,2.62 -31.217,6.864 -38.623,12.732c-7.406,5.868 -11.108,15.409 -11.108,28.625c0,10.368 3.446,18.913 10.339,25.635c6.893,6.722 16.492,10.083 28.796,10.083c16.862,0 30.876,-6.238 42.041,-18.713c11.165,-12.476 16.748,-28.569 16.748,-48.279l0,-17.09l-48.193,7.007Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M1804.541,1166.406c-5.241,-3.76 -11.393,-5.64 -18.457,-5.64c-13.786,0 -25.35,7.121 -34.692,21.362c-9.342,14.242 -14.014,34.465 -14.014,60.669l0,82.202l-15.381,0l0,-175l15.381,0l0,38.794l0.684,0c3.988,-13.33 10.311,-23.698 18.97,-31.104c8.659,-7.406 18.685,-11.108 30.078,-11.108c6.494,0 12.305,1.025 17.432,3.076l0,16.748Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M1942.114,1325l0,-35.034l-0.684,0c-5.583,11.963 -13.7,21.505 -24.353,28.625c-10.653,7.121 -22.473,10.681 -35.461,10.681c-16.634,0 -29.793,-4.671 -39.478,-14.014c-9.684,-9.342 -14.526,-21.134 -14.526,-35.376c0,-30.534 20.223,-48.991 60.669,-55.371l53.833,-8.032c0,-37.598 -14.128,-56.396 -42.383,-56.396c-19.255,0 -37.996,7.747 -56.226,23.242l0,-18.97c6.494,-5.127 15.295,-9.513 26.404,-13.159c11.108,-3.646 21.562,-5.469 31.36,-5.469c18.001,0 31.93,5.583 41.785,16.748c9.855,11.165 14.783,27.401 14.783,48.706l0,113.818l-15.723,0Zm-48.193,-87.158c-18.343,2.62 -31.217,6.864 -38.623,12.732c-7.406,5.868 -11.108,15.409 -11.108,28.625c0,10.368 3.446,18.913 10.339,25.635c6.893,6.722 16.492,10.083 28.796,10.083c16.862,0 30.876,-6.238 42.041,-18.713c11.165,-12.476 16.748,-28.569 16.748,-48.279l0,-17.09l-48.193,7.007Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M2229.907,1325l0,-105.273c0,-21.989 -3.446,-37.427 -10.339,-46.313c-6.893,-8.887 -17.802,-13.33 -32.727,-13.33c-13.786,0 -25.692,5.924 -35.718,17.773c-10.026,11.849 -15.039,26.717 -15.039,44.604l0,102.539l-15.723,0l0,-106.47c0,-38.965 -14.811,-58.447 -44.434,-58.447c-14.242,0 -26.09,5.953 -35.547,17.859c-9.456,11.906 -14.185,27.315 -14.185,46.228l0,100.83l-15.723,0l0,-175l15.723,0l0,29.053l0.684,0c12.191,-22.217 30.021,-33.325 53.491,-33.325c12.76,0 23.669,3.674 32.727,11.023c9.058,7.349 15.181,17.004 18.372,28.967c5.469,-12.646 13.302,-22.473 23.499,-29.48c10.197,-7.007 21.277,-10.51 33.24,-10.51c38.281,0 57.422,23.698 57.422,71.094l0,108.179l-15.723,0Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M2301.855,1238.184c0,24.04 5.554,42.839 16.663,56.396c11.108,13.558 26.347,20.337 45.715,20.337c19.596,0 38.737,-7.235 57.422,-21.704l0,16.748c-18.115,12.874 -38.338,19.312 -60.669,19.312c-22.559,0 -40.788,-8.089 -54.688,-24.268c-13.9,-16.178 -20.85,-39.022 -20.85,-68.53c0,-25.521 7.263,-47.026 21.79,-64.514c14.526,-17.489 33.411,-26.233 56.653,-26.233c21.761,0 38.452,7.633 50.073,22.9c11.621,15.267 17.432,36.117 17.432,62.549l0,7.007l-129.541,0Zm113.135,-14.355c-0.684,-20.166 -5.526,-35.832 -14.526,-46.997c-9.001,-11.165 -21.419,-16.748 -37.256,-16.748c-16.406,0 -29.993,5.497 -40.759,16.492c-10.767,10.994 -17.403,26.746 -19.91,47.253l112.451,0Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M2544.019,1322.607c-8.203,3.874 -15.894,5.811 -23.071,5.811c-25.863,0 -38.794,-15.495 -38.794,-46.484l0,-117.578l-31.445,0l0,-14.355l31.445,0l0,-45.459c2.507,-0.911 5.127,-1.823 7.861,-2.734c2.734,-0.798 5.355,-1.652 7.861,-2.563l0,50.757l46.143,0l0,14.355l-46.143,0l0,115.527c0,12.077 1.908,20.821 5.725,26.233c3.817,5.412 10.282,8.118 19.397,8.118c6.494,0 13.501,-2.108 21.021,-6.323l0,14.697Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M2582.471,1238.184c0,24.04 5.554,42.839 16.663,56.396c11.108,13.558 26.347,20.337 45.715,20.337c19.596,0 38.737,-7.235 57.422,-21.704l0,16.748c-18.115,12.874 -38.338,19.312 -60.669,19.312c-22.559,0 -40.788,-8.089 -54.688,-24.268c-13.9,-16.178 -20.85,-39.022 -20.85,-68.53c0,-25.521 7.263,-47.026 21.79,-64.514c14.526,-17.489 33.411,-26.233 56.653,-26.233c21.761,0 38.452,7.633 50.073,22.9c11.621,15.267 17.432,36.117 17.432,62.549l0,7.007l-129.541,0Zm113.135,-14.355c-0.684,-20.166 -5.526,-35.832 -14.526,-46.997c-9.001,-11.165 -21.419,-16.748 -37.256,-16.748c-16.406,0 -29.993,5.497 -40.759,16.492c-10.767,10.994 -17.403,26.746 -19.91,47.253l112.451,0Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M2837.964,1166.406c-5.241,-3.76 -11.393,-5.64 -18.457,-5.64c-13.786,0 -25.35,7.121 -34.692,21.362c-9.342,14.242 -14.014,34.465 -14.014,60.669l0,82.202l-15.381,0l0,-175l15.381,0l0,38.794l0.684,0c3.988,-13.33 10.311,-23.698 18.97,-31.104c8.659,-7.406 18.685,-11.108 30.078,-11.108c6.494,0 12.305,1.025 17.432,3.076l0,16.748Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M2970.239,1187.769c-4.785,-3.76 -11.678,-5.64 -20.679,-5.64c-11.735,0 -21.533,5.298 -29.395,15.894c-7.861,10.596 -11.792,25.008 -11.792,43.237l0,83.74l-39.648,0l0,-175l39.648,0l0,36.06l0.684,0c3.874,-12.305 9.827,-21.903 17.859,-28.796c8.032,-6.893 17.004,-10.339 26.917,-10.339c7.178,0 12.646,1.082 16.406,3.247l0,37.598Z" style="fill:#409cff;fill-rule:nonzero;"/><path d="M3150.879,1325l-39.648,0l0,-27.686l-0.684,0c-11.507,21.191 -29.395,31.787 -53.662,31.787c-41.357,0 -62.036,-24.837 -62.036,-74.512l0,-104.59l39.648,0l0,100.488c0,31.445 12.134,47.168 36.401,47.168c11.735,0 21.391,-4.329 28.967,-12.988c7.576,-8.659 11.365,-19.995 11.365,-34.009l0,-100.659l39.648,0l0,175Z" style="fill:#409cff;fill-rule:nonzero;"/><path d="M3358.35,1325l-39.648,0l0,-98.608c0,-32.699 -11.564,-49.048 -34.692,-49.048c-12.077,0 -22.046,4.529 -29.907,13.586c-7.861,9.058 -11.792,20.479 -11.792,34.265l0,99.805l-39.819,0l0,-175l39.819,0l0,29.053l0.684,0c13.102,-22.103 32.015,-33.154 56.738,-33.154c19.027,0 33.553,6.181 43.579,18.542c10.026,12.362 15.039,30.221 15.039,53.577l0,106.982Z" style="fill:#409cff;fill-rule:nonzero;"/></g><g><path d="M1357.601,1509.074l0,24.259l-7.52,0l0,-64.185l17.635,0c6.863,0 12.182,1.671 15.957,5.013c3.775,3.342 5.662,8.057 5.662,14.144c0,6.087 -2.096,11.07 -6.289,14.95c-4.192,3.879 -9.854,5.819 -16.986,5.819l-8.459,0Zm0,-33.122l0,26.318l7.878,0c5.192,0 9.153,-1.186 11.884,-3.558c2.73,-2.372 4.095,-5.722 4.095,-10.048c0,-8.474 -5.013,-12.712 -15.039,-12.712l-8.818,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1430.111,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1467.843,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1508.618,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><rect x="1522.449" y="1465.479" width="7.34" height="67.855" style="fill:#8e8e93;fill-rule:nonzero;"/><rect x="1544.649" y="1465.479" width="7.34" height="67.855" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1603.687,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><rect x="1614.787" y="1465.479" width="7.34" height="67.855" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1669.617,1526.709l-0.179,0l0,27.706l-7.34,0l0,-66.915l7.34,0l0,8.057l0.179,0c3.611,-6.087 8.892,-9.131 15.845,-9.131c5.908,0 10.518,2.051 13.831,6.154c3.312,4.103 4.968,9.601 4.968,16.494c0,7.669 -1.865,13.808 -5.595,18.418c-3.73,4.61 -8.832,6.915 -15.308,6.915c-5.938,0 -10.518,-2.566 -13.741,-7.699Zm-0.179,-18.486l0,6.401c0,3.79 1.231,7.005 3.693,9.646c2.462,2.641 5.587,3.961 9.377,3.961c4.446,0 7.93,-1.701 10.451,-5.103c2.521,-3.402 3.782,-8.131 3.782,-14.189c0,-5.103 -1.179,-9.101 -3.536,-11.995c-2.357,-2.894 -5.55,-4.342 -9.578,-4.342c-4.267,0 -7.699,1.485 -10.295,4.454c-2.596,2.969 -3.894,6.691 -3.894,11.167Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1748.796,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1786.528,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1827.303,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1906.213,1533.333l-7.34,0l0,-26.318c0,-5.073 -0.783,-8.743 -2.35,-11.011c-1.567,-2.268 -4.2,-3.402 -7.9,-3.402c-3.133,0 -5.796,1.432 -7.99,4.297c-2.193,2.865 -3.29,6.296 -3.29,10.295l0,26.139l-7.34,0l0,-27.214c0,-9.012 -3.476,-13.517 -10.429,-13.517c-3.223,0 -5.878,1.35 -7.967,4.051c-2.089,2.7 -3.133,6.214 -3.133,10.541l0,26.139l-7.34,0l0,-45.833l7.34,0l0,7.251l0.179,0c3.252,-5.55 7.997,-8.325 14.233,-8.325c3.133,0 5.863,0.873 8.191,2.618c2.327,1.746 3.924,4.036 4.789,6.871c3.402,-6.326 8.474,-9.489 15.218,-9.489c10.086,0 15.129,6.222 15.129,18.665l0,28.243Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1956.925,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1989.286,1532.886c-1.731,0.955 -4.013,1.432 -6.848,1.432c-8.027,0 -12.04,-4.476 -12.04,-13.428l0,-27.124l-7.878,0l0,-6.266l7.878,0l0,-11.19l7.34,-2.372l0,13.562l11.548,0l0,6.266l-11.548,0l0,25.826c0,3.073 0.522,5.267 1.567,6.58c1.044,1.313 2.775,1.969 5.192,1.969c1.85,0 3.446,-0.507 4.789,-1.522l0,6.266Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2035.925,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2070.927,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2101.229,1531.677l0,-7.878c3.998,2.954 8.4,4.431 13.204,4.431c6.445,0 9.668,-2.148 9.668,-6.445c0,-1.223 -0.276,-2.26 -0.828,-3.111c-0.552,-0.85 -1.298,-1.604 -2.238,-2.26c-0.94,-0.656 -2.044,-1.246 -3.312,-1.768c-1.268,-0.522 -2.633,-1.067 -4.095,-1.634c-2.029,-0.806 -3.812,-1.619 -5.349,-2.439c-1.537,-0.821 -2.82,-1.746 -3.849,-2.775c-1.029,-1.029 -1.805,-2.201 -2.327,-3.514c-0.522,-1.313 -0.783,-2.85 -0.783,-4.61c0,-2.148 0.492,-4.051 1.477,-5.707c0.985,-1.656 2.298,-3.044 3.939,-4.163c1.641,-1.119 3.514,-1.962 5.617,-2.529c2.104,-0.567 4.274,-0.85 6.512,-0.85c3.969,0 7.52,0.686 10.653,2.059l0,7.43c-3.372,-2.208 -7.251,-3.312 -11.637,-3.312c-1.373,0 -2.611,0.157 -3.715,0.47c-1.104,0.313 -2.051,0.753 -2.842,1.32c-0.791,0.567 -1.402,1.246 -1.835,2.037c-0.433,0.791 -0.649,1.664 -0.649,2.618c0,1.194 0.216,2.193 0.649,2.999c0.433,0.806 1.067,1.522 1.902,2.148c0.836,0.627 1.85,1.194 3.044,1.701c1.194,0.507 2.551,1.059 4.073,1.656c2.029,0.776 3.849,1.574 5.461,2.395c1.611,0.821 2.984,1.746 4.118,2.775c1.134,1.029 2.007,2.216 2.618,3.558c0.612,1.343 0.918,2.939 0.918,4.789c0,2.268 -0.5,4.237 -1.499,5.908c-1,1.671 -2.335,3.059 -4.006,4.163c-1.671,1.104 -3.596,1.925 -5.774,2.462c-2.178,0.537 -4.461,0.806 -6.848,0.806c-4.715,0 -8.803,-0.91 -12.264,-2.73Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2200.639,1487.5l-13.741,45.833l-7.609,0l-9.444,-32.808c-0.358,-1.253 -0.597,-2.671 -0.716,-4.252l-0.179,0c-0.09,1.074 -0.403,2.462 -0.94,4.163l-10.25,32.898l-7.34,0l-13.875,-45.833l7.699,0l9.489,34.465c0.298,1.044 0.507,2.417 0.627,4.118l0.358,0c0.09,-1.313 0.358,-2.715 0.806,-4.207l10.563,-34.375l6.714,0l9.489,34.554c0.298,1.104 0.522,2.477 0.671,4.118l0.358,0c0.06,-1.164 0.313,-2.536 0.761,-4.118l9.31,-34.554l7.251,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2245.98,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2293.917,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2312.537,1526.709l-0.179,0l0,27.706l-7.34,0l0,-66.915l7.34,0l0,8.057l0.179,0c3.611,-6.087 8.892,-9.131 15.845,-9.131c5.908,0 10.518,2.051 13.831,6.154c3.312,4.103 4.968,9.601 4.968,16.494c0,7.669 -1.865,13.808 -5.595,18.418c-3.73,4.61 -8.832,6.915 -15.308,6.915c-5.938,0 -10.518,-2.566 -13.741,-7.699Zm-0.179,-18.486l0,6.401c0,3.79 1.231,7.005 3.693,9.646c2.462,2.641 5.587,3.961 9.377,3.961c4.446,0 7.93,-1.701 10.451,-5.103c2.521,-3.402 3.782,-8.131 3.782,-14.189c0,-5.103 -1.179,-9.101 -3.536,-11.995c-2.357,-2.894 -5.55,-4.342 -9.578,-4.342c-4.267,0 -7.699,1.485 -10.295,4.454c-2.596,2.969 -3.894,6.691 -3.894,11.167Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2356.132,1531.677l0,-7.878c3.998,2.954 8.4,4.431 13.204,4.431c6.445,0 9.668,-2.148 9.668,-6.445c0,-1.223 -0.276,-2.26 -0.828,-3.111c-0.552,-0.85 -1.298,-1.604 -2.238,-2.26c-0.94,-0.656 -2.044,-1.246 -3.312,-1.768c-1.268,-0.522 -2.633,-1.067 -4.095,-1.634c-2.029,-0.806 -3.812,-1.619 -5.349,-2.439c-1.537,-0.821 -2.82,-1.746 -3.849,-2.775c-1.029,-1.029 -1.805,-2.201 -2.327,-3.514c-0.522,-1.313 -0.783,-2.85 -0.783,-4.61c0,-2.148 0.492,-4.051 1.477,-5.707c0.985,-1.656 2.298,-3.044 3.939,-4.163c1.641,-1.119 3.514,-1.962 5.617,-2.529c2.104,-0.567 4.274,-0.85 6.512,-0.85c3.969,0 7.52,0.686 10.653,2.059l0,7.43c-3.372,-2.208 -7.251,-3.312 -11.637,-3.312c-1.373,0 -2.611,0.157 -3.715,0.47c-1.104,0.313 -2.051,0.753 -2.842,1.32c-0.791,0.567 -1.402,1.246 -1.835,2.037c-0.433,0.791 -0.649,1.664 -0.649,2.618c0,1.194 0.216,2.193 0.649,2.999c0.433,0.806 1.067,1.522 1.902,2.148c0.836,0.627 1.85,1.194 3.044,1.701c1.194,0.507 2.551,1.059 4.073,1.656c2.029,0.776 3.849,1.574 5.461,2.395c1.611,0.821 2.984,1.746 4.118,2.775c1.134,1.029 2.007,2.216 2.618,3.558c0.612,1.343 0.918,2.939 0.918,4.789c0,2.268 -0.5,4.237 -1.499,5.908c-1,1.671 -2.335,3.059 -4.006,4.163c-1.671,1.104 -3.596,1.925 -5.774,2.462c-2.178,0.537 -4.461,0.806 -6.848,0.806c-4.715,0 -8.803,-0.91 -12.264,-2.73Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2445.561,1471.924c-1.432,-0.806 -3.059,-1.208 -4.879,-1.208c-5.132,0 -7.699,3.238 -7.699,9.713l0,7.072l10.742,0l0,6.266l-10.742,0l0,39.567l-7.296,0l0,-39.567l-7.833,0l0,-6.266l7.833,0l0,-7.43c0,-4.804 1.388,-8.601 4.163,-11.391c2.775,-2.79 6.236,-4.185 10.384,-4.185c2.238,0 4.013,0.269 5.326,0.806l0,6.624Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2470.76,1534.408c-6.774,0 -12.182,-2.141 -16.225,-6.423c-4.043,-4.282 -6.065,-9.959 -6.065,-17.031c0,-7.699 2.104,-13.711 6.311,-18.038c4.207,-4.327 9.892,-6.49 17.053,-6.49c6.833,0 12.167,2.104 16.001,6.311c3.834,4.207 5.752,10.041 5.752,17.501c0,7.311 -2.066,13.167 -6.199,17.568c-4.133,4.401 -9.675,6.602 -16.628,6.602Zm0.537,-41.805c-4.715,0 -8.445,1.604 -11.19,4.812c-2.745,3.208 -4.118,7.631 -4.118,13.271c0,5.431 1.388,9.713 4.163,12.846c2.775,3.133 6.49,4.7 11.145,4.7c4.744,0 8.392,-1.537 10.944,-4.61c2.551,-3.073 3.827,-7.445 3.827,-13.114c0,-5.729 -1.276,-10.145 -3.827,-13.249c-2.551,-3.103 -6.199,-4.655 -10.944,-4.655Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2529.215,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2570.797,1509.074l0,24.259l-7.52,0l0,-64.185l17.635,0c6.863,0 12.182,1.671 15.957,5.013c3.775,3.342 5.662,8.057 5.662,14.144c0,6.087 -2.096,11.07 -6.289,14.95c-4.192,3.879 -9.854,5.819 -16.986,5.819l-8.459,0Zm0,-33.122l0,26.318l7.878,0c5.192,0 9.153,-1.186 11.884,-3.558c2.73,-2.372 4.095,-5.722 4.095,-10.048c0,-8.474 -5.013,-12.712 -15.039,-12.712l-8.818,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2650.11,1487.5l-21.082,53.174c-3.76,9.489 -9.041,14.233 -15.845,14.233c-1.91,0 -3.506,-0.194 -4.789,-0.582l0,-6.58c1.581,0.537 3.029,0.806 4.342,0.806c3.7,0 6.475,-2.208 8.325,-6.624l3.67,-8.683l-17.904,-45.744l8.146,0l12.398,35.27c0.149,0.448 0.463,1.611 0.94,3.491l0.269,0c0.149,-0.716 0.448,-1.85 0.895,-3.402l13.025,-35.36l7.609,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2679.248,1532.886c-1.731,0.955 -4.013,1.432 -6.848,1.432c-8.027,0 -12.04,-4.476 -12.04,-13.428l0,-27.124l-7.878,0l0,-6.266l7.878,0l0,-11.19l7.34,-2.372l0,13.562l11.548,0l0,6.266l-11.548,0l0,25.826c0,3.073 0.522,5.267 1.567,6.58c1.044,1.313 2.775,1.969 5.192,1.969c1.85,0 3.446,-0.507 4.789,-1.522l0,6.266Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2727.096,1533.333l-7.34,0l0,-26.408c0,-9.549 -3.551,-14.323 -10.653,-14.323c-3.581,0 -6.595,1.38 -9.041,4.14c-2.447,2.76 -3.67,6.304 -3.67,10.63l0,25.96l-7.34,0l0,-67.855l7.34,0l0,29.631l0.179,0c3.521,-5.789 8.534,-8.683 15.039,-8.683c10.324,0 15.487,6.222 15.487,18.665l0,28.243Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2760.083,1534.408c-6.774,0 -12.182,-2.141 -16.225,-6.423c-4.043,-4.282 -6.065,-9.959 -6.065,-17.031c0,-7.699 2.104,-13.711 6.311,-18.038c4.207,-4.327 9.892,-6.49 17.053,-6.49c6.833,0 12.167,2.104 16.001,6.311c3.834,4.207 5.752,10.041 5.752,17.501c0,7.311 -2.066,13.167 -6.199,17.568c-4.133,4.401 -9.675,6.602 -16.628,6.602Zm0.537,-41.805c-4.715,0 -8.445,1.604 -11.19,4.812c-2.745,3.208 -4.118,7.631 -4.118,13.271c0,5.431 1.388,9.713 4.163,12.846c2.775,3.133 6.49,4.7 11.145,4.7c4.744,0 8.392,-1.537 10.944,-4.61c2.551,-3.073 3.827,-7.445 3.827,-13.114c0,-5.729 -1.276,-10.145 -3.827,-13.249c-2.551,-3.103 -6.199,-4.655 -10.944,-4.655Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2832.682,1533.333l-7.34,0l0,-26.139c0,-9.728 -3.551,-14.591 -10.653,-14.591c-3.67,0 -6.706,1.38 -9.108,4.14c-2.402,2.76 -3.603,6.244 -3.603,10.451l0,26.139l-7.34,0l0,-45.833l7.34,0l0,7.609l0.179,0c3.461,-5.789 8.474,-8.683 15.039,-8.683c5.013,0 8.847,1.619 11.503,4.856c2.656,3.238 3.984,7.915 3.984,14.032l0,28.019Z" style="fill:#8e8e93;fill-rule:nonzero;"/></g></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="730" height="206" viewBox="325 821 3042 858" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:affinity="https://www.affinity.studio/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><rect id="Logo---horizontal-light" affinity:id="Logo – horizontal light" x="0" y="0" width="3750" height="2500" style="fill:none;"/><clipPath id="_clip1"><rect id="Logo---horizontal-light1" affinity:id="Logo – horizontal light" x="0" y="0" width="3750" height="2500"/></clipPath><g clip-path="url(#_clip1)"><path d="M379.167,829.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l-0,-91.667Z" style="fill:#e9ecf1;"/><path d="M366.977,829.167l590.462,0c25.807,0 46.727,20.52 46.727,45.833c0,25.314 -20.92,45.833 -46.727,45.833l-590.462,0l0,-91.667Z" style="fill:#0a84ff;"/><path d="M1239.75,875c0,18.226 -14.774,33 -33,33c-18.226,0 -33,-14.774 -33,-33c0,-18.226 14.774,-33 33,-33c18.226,0 33,14.774 33,33Z" style="fill:#0a84ff;"/><path d="M379.167,979.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l-0,-91.667Z" style="fill:#e9ecf1;"/><path d="M379.167,979.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l-0,-91.667Z" style="fill:#0a9fd8;"/><path d="M1239.75,1025c0,18.226 -14.774,33 -33,33c-18.226,0 -33,-14.774 -33,-33c0,-18.226 14.774,-33 33,-33c18.226,0 33,14.774 33,33Z" style="fill:#0a9fd8;"/><path d="M379.167,1129.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l-0,-91.667Z" style="fill:#e9ecf1;"/><path d="M379.167,1129.167l579.167,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-579.167,0l0,-91.667Z" style="fill:#14b8a6;"/><path d="M1239.75,1175c0,18.226 -14.774,33 -33,33c-18.226,0 -33,-14.774 -33,-33c0,-18.226 14.774,-33 33,-33c18.226,0 33,14.774 33,33Z" style="fill:#14b8a6;"/><path d="M379.167,1279.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l-0,-91.667Z" style="fill:#e9ecf1;"/><path d="M379.167,1279.167l337.5,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-337.5,0l0,-91.667Z" style="fill:#30c48d;"/><path d="M379.167,1429.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l-0,-91.667Z" style="fill:#e9ecf1;"/><path d="M379.167,1429.167l212.5,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-212.5,0l0,-91.667Z" style="fill:#8bc34a;"/><path d="M379.167,1579.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l-0,-91.667Z" style="fill:#e9ecf1;"/><path d="M379.167,1579.167l120.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-120.833,0l0,-91.667Z" style="fill:#ffb020;"/><path d="M379.167,829.167c25.314,0 45.833,20.52 45.833,45.833l0,750c0,25.314 -20.52,45.833 -45.833,45.833c-25.314,0 -45.833,-20.52 -45.833,-45.833l0,-750c0,-25.314 20.52,-45.833 45.833,-45.833Z" style="fill:#1c1c1e;"/><g><path d="M1369.434,1293.896l-0.684,0l0,111.597l-15.723,0l0,-255.493l15.723,0l0,36.06l0.684,0c6.266,-12.874 15.238,-22.815 26.917,-29.822c11.678,-7.007 24.524,-10.51 38.538,-10.51c22.217,0 39.563,7.662 52.039,22.986c12.476,15.324 18.713,36.145 18.713,62.463c0,29.281 -7.149,52.95 -21.448,71.008c-14.299,18.058 -33.183,27.087 -56.653,27.087c-26.204,0 -45.573,-11.792 -58.105,-35.376Zm-0.684,-65.112l0,22.046c0,17.546 5.526,32.613 16.577,45.203c11.051,12.59 25.578,18.884 43.579,18.884c17.887,0 32.414,-7.662 43.579,-22.986c11.165,-15.324 16.748,-35.461 16.748,-60.413c0,-21.875 -5.127,-39.25 -15.381,-52.124c-10.254,-12.874 -23.926,-19.312 -41.016,-19.312c-20.394,0 -36.174,6.836 -47.339,20.508c-11.165,13.672 -16.748,29.736 -16.748,48.193Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M1653.638,1325l0,-35.034l-0.684,0c-5.583,11.963 -13.7,21.505 -24.353,28.625c-10.653,7.121 -22.473,10.681 -35.461,10.681c-16.634,0 -29.793,-4.671 -39.478,-14.014c-9.684,-9.342 -14.526,-21.134 -14.526,-35.376c0,-30.534 20.223,-48.991 60.669,-55.371l53.833,-8.032c0,-37.598 -14.128,-56.396 -42.383,-56.396c-19.255,0 -37.996,7.747 -56.226,23.242l0,-18.97c6.494,-5.127 15.295,-9.513 26.404,-13.159c11.108,-3.646 21.562,-5.469 31.36,-5.469c18.001,0 31.93,5.583 41.785,16.748c9.855,11.165 14.783,27.401 14.783,48.706l0,113.818l-15.723,0Zm-48.193,-87.158c-18.343,2.62 -31.217,6.864 -38.623,12.732c-7.406,5.868 -11.108,15.409 -11.108,28.625c0,10.368 3.446,18.913 10.339,25.635c6.893,6.722 16.492,10.083 28.796,10.083c16.862,0 30.876,-6.238 42.041,-18.713c11.165,-12.476 16.748,-28.569 16.748,-48.279l0,-17.09l-48.193,7.007Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M1804.541,1166.406c-5.241,-3.76 -11.393,-5.64 -18.457,-5.64c-13.786,0 -25.35,7.121 -34.692,21.362c-9.342,14.242 -14.014,34.465 -14.014,60.669l0,82.202l-15.381,0l0,-175l15.381,0l0,38.794l0.684,0c3.988,-13.33 10.311,-23.698 18.97,-31.104c8.659,-7.406 18.685,-11.108 30.078,-11.108c6.494,0 12.305,1.025 17.432,3.076l0,16.748Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M1942.114,1325l0,-35.034l-0.684,0c-5.583,11.963 -13.7,21.505 -24.353,28.625c-10.653,7.121 -22.473,10.681 -35.461,10.681c-16.634,0 -29.793,-4.671 -39.478,-14.014c-9.684,-9.342 -14.526,-21.134 -14.526,-35.376c0,-30.534 20.223,-48.991 60.669,-55.371l53.833,-8.032c0,-37.598 -14.128,-56.396 -42.383,-56.396c-19.255,0 -37.996,7.747 -56.226,23.242l0,-18.97c6.494,-5.127 15.295,-9.513 26.404,-13.159c11.108,-3.646 21.562,-5.469 31.36,-5.469c18.001,0 31.93,5.583 41.785,16.748c9.855,11.165 14.783,27.401 14.783,48.706l0,113.818l-15.723,0Zm-48.193,-87.158c-18.343,2.62 -31.217,6.864 -38.623,12.732c-7.406,5.868 -11.108,15.409 -11.108,28.625c0,10.368 3.446,18.913 10.339,25.635c6.893,6.722 16.492,10.083 28.796,10.083c16.862,0 30.876,-6.238 42.041,-18.713c11.165,-12.476 16.748,-28.569 16.748,-48.279l0,-17.09l-48.193,7.007Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M2229.907,1325l0,-105.273c0,-21.989 -3.446,-37.427 -10.339,-46.313c-6.893,-8.887 -17.802,-13.33 -32.727,-13.33c-13.786,0 -25.692,5.924 -35.718,17.773c-10.026,11.849 -15.039,26.717 -15.039,44.604l0,102.539l-15.723,0l0,-106.47c0,-38.965 -14.811,-58.447 -44.434,-58.447c-14.242,0 -26.09,5.953 -35.547,17.859c-9.456,11.906 -14.185,27.315 -14.185,46.228l0,100.83l-15.723,0l0,-175l15.723,0l0,29.053l0.684,0c12.191,-22.217 30.021,-33.325 53.491,-33.325c12.76,0 23.669,3.674 32.727,11.023c9.058,7.349 15.181,17.004 18.372,28.967c5.469,-12.646 13.302,-22.473 23.499,-29.48c10.197,-7.007 21.277,-10.51 33.24,-10.51c38.281,0 57.422,23.698 57.422,71.094l0,108.179l-15.723,0Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M2301.855,1238.184c0,24.04 5.554,42.839 16.663,56.396c11.108,13.558 26.347,20.337 45.715,20.337c19.596,0 38.737,-7.235 57.422,-21.704l0,16.748c-18.115,12.874 -38.338,19.312 -60.669,19.312c-22.559,0 -40.788,-8.089 -54.688,-24.268c-13.9,-16.178 -20.85,-39.022 -20.85,-68.53c0,-25.521 7.263,-47.026 21.79,-64.514c14.526,-17.489 33.411,-26.233 56.653,-26.233c21.761,0 38.452,7.633 50.073,22.9c11.621,15.267 17.432,36.117 17.432,62.549l0,7.007l-129.541,0Zm113.135,-14.355c-0.684,-20.166 -5.526,-35.832 -14.526,-46.997c-9.001,-11.165 -21.419,-16.748 -37.256,-16.748c-16.406,0 -29.993,5.497 -40.759,16.492c-10.767,10.994 -17.403,26.746 -19.91,47.253l112.451,0Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M2544.019,1322.607c-8.203,3.874 -15.894,5.811 -23.071,5.811c-25.863,0 -38.794,-15.495 -38.794,-46.484l0,-117.578l-31.445,0l0,-14.355l31.445,0l0,-45.459c2.507,-0.911 5.127,-1.823 7.861,-2.734c2.734,-0.798 5.355,-1.652 7.861,-2.563l0,50.757l46.143,0l0,14.355l-46.143,0l0,115.527c0,12.077 1.908,20.821 5.725,26.233c3.817,5.412 10.282,8.118 19.397,8.118c6.494,0 13.501,-2.108 21.021,-6.323l0,14.697Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M2582.471,1238.184c0,24.04 5.554,42.839 16.663,56.396c11.108,13.558 26.347,20.337 45.715,20.337c19.596,0 38.737,-7.235 57.422,-21.704l0,16.748c-18.115,12.874 -38.338,19.312 -60.669,19.312c-22.559,0 -40.788,-8.089 -54.688,-24.268c-13.9,-16.178 -20.85,-39.022 -20.85,-68.53c0,-25.521 7.263,-47.026 21.79,-64.514c14.526,-17.489 33.411,-26.233 56.653,-26.233c21.761,0 38.452,7.633 50.073,22.9c11.621,15.267 17.432,36.117 17.432,62.549l0,7.007l-129.541,0Zm113.135,-14.355c-0.684,-20.166 -5.526,-35.832 -14.526,-46.997c-9.001,-11.165 -21.419,-16.748 -37.256,-16.748c-16.406,0 -29.993,5.497 -40.759,16.492c-10.767,10.994 -17.403,26.746 -19.91,47.253l112.451,0Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M2837.964,1166.406c-5.241,-3.76 -11.393,-5.64 -18.457,-5.64c-13.786,0 -25.35,7.121 -34.692,21.362c-9.342,14.242 -14.014,34.465 -14.014,60.669l0,82.202l-15.381,0l0,-175l15.381,0l0,38.794l0.684,0c3.988,-13.33 10.311,-23.698 18.97,-31.104c8.659,-7.406 18.685,-11.108 30.078,-11.108c6.494,0 12.305,1.025 17.432,3.076l0,16.748Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M2970.239,1187.769c-4.785,-3.76 -11.678,-5.64 -20.679,-5.64c-11.735,0 -21.533,5.298 -29.395,15.894c-7.861,10.596 -11.792,25.008 -11.792,43.237l0,83.74l-39.648,0l0,-175l39.648,0l0,36.06l0.684,0c3.874,-12.305 9.827,-21.903 17.859,-28.796c8.032,-6.893 17.004,-10.339 26.917,-10.339c7.178,0 12.646,1.082 16.406,3.247l0,37.598Z" style="fill:#0a84ff;fill-rule:nonzero;"/><path d="M3150.879,1325l-39.648,0l0,-27.686l-0.684,0c-11.507,21.191 -29.395,31.787 -53.662,31.787c-41.357,0 -62.036,-24.837 -62.036,-74.512l0,-104.59l39.648,0l0,100.488c0,31.445 12.134,47.168 36.401,47.168c11.735,0 21.391,-4.329 28.967,-12.988c7.576,-8.659 11.365,-19.995 11.365,-34.009l0,-100.659l39.648,0l0,175Z" style="fill:#0a84ff;fill-rule:nonzero;"/><path d="M3358.35,1325l-39.648,0l0,-98.608c0,-32.699 -11.564,-49.048 -34.692,-49.048c-12.077,0 -22.046,4.529 -29.907,13.586c-7.861,9.058 -11.792,20.479 -11.792,34.265l0,99.805l-39.819,0l0,-175l39.819,0l0,29.053l0.684,0c13.102,-22.103 32.015,-33.154 56.738,-33.154c19.027,0 33.553,6.181 43.579,18.542c10.026,12.362 15.039,30.221 15.039,53.577l0,106.982Z" style="fill:#0a84ff;fill-rule:nonzero;"/></g><g><path d="M1357.601,1509.074l0,24.259l-7.52,0l0,-64.185l17.635,0c6.863,0 12.182,1.671 15.957,5.013c3.775,3.342 5.662,8.057 5.662,14.144c0,6.087 -2.096,11.07 -6.289,14.95c-4.192,3.879 -9.854,5.819 -16.986,5.819l-8.459,0Zm0,-33.122l0,26.318l7.878,0c5.192,0 9.153,-1.186 11.884,-3.558c2.73,-2.372 4.095,-5.722 4.095,-10.048c0,-8.474 -5.013,-12.712 -15.039,-12.712l-8.818,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1430.111,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1467.843,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1508.618,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><rect x="1522.449" y="1465.479" width="7.34" height="67.855" style="fill:#8e8e93;fill-rule:nonzero;"/><rect x="1544.649" y="1465.479" width="7.34" height="67.855" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1603.687,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><rect x="1614.787" y="1465.479" width="7.34" height="67.855" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1669.617,1526.709l-0.179,0l0,27.706l-7.34,0l0,-66.915l7.34,0l0,8.057l0.179,0c3.611,-6.087 8.892,-9.131 15.845,-9.131c5.908,0 10.518,2.051 13.831,6.154c3.312,4.103 4.968,9.601 4.968,16.494c0,7.669 -1.865,13.808 -5.595,18.418c-3.73,4.61 -8.832,6.915 -15.308,6.915c-5.938,0 -10.518,-2.566 -13.741,-7.699Zm-0.179,-18.486l0,6.401c0,3.79 1.231,7.005 3.693,9.646c2.462,2.641 5.587,3.961 9.377,3.961c4.446,0 7.93,-1.701 10.451,-5.103c2.521,-3.402 3.782,-8.131 3.782,-14.189c0,-5.103 -1.179,-9.101 -3.536,-11.995c-2.357,-2.894 -5.55,-4.342 -9.578,-4.342c-4.267,0 -7.699,1.485 -10.295,4.454c-2.596,2.969 -3.894,6.691 -3.894,11.167Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1748.796,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1786.528,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1827.303,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1906.213,1533.333l-7.34,0l0,-26.318c0,-5.073 -0.783,-8.743 -2.35,-11.011c-1.567,-2.268 -4.2,-3.402 -7.9,-3.402c-3.133,0 -5.796,1.432 -7.99,4.297c-2.193,2.865 -3.29,6.296 -3.29,10.295l0,26.139l-7.34,0l0,-27.214c0,-9.012 -3.476,-13.517 -10.429,-13.517c-3.223,0 -5.878,1.35 -7.967,4.051c-2.089,2.7 -3.133,6.214 -3.133,10.541l0,26.139l-7.34,0l0,-45.833l7.34,0l0,7.251l0.179,0c3.252,-5.55 7.997,-8.325 14.233,-8.325c3.133,0 5.863,0.873 8.191,2.618c2.327,1.746 3.924,4.036 4.789,6.871c3.402,-6.326 8.474,-9.489 15.218,-9.489c10.086,0 15.129,6.222 15.129,18.665l0,28.243Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1956.925,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1989.286,1532.886c-1.731,0.955 -4.013,1.432 -6.848,1.432c-8.027,0 -12.04,-4.476 -12.04,-13.428l0,-27.124l-7.878,0l0,-6.266l7.878,0l0,-11.19l7.34,-2.372l0,13.562l11.548,0l0,6.266l-11.548,0l0,25.826c0,3.073 0.522,5.267 1.567,6.58c1.044,1.313 2.775,1.969 5.192,1.969c1.85,0 3.446,-0.507 4.789,-1.522l0,6.266Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2035.925,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2070.927,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2101.229,1531.677l0,-7.878c3.998,2.954 8.4,4.431 13.204,4.431c6.445,0 9.668,-2.148 9.668,-6.445c0,-1.223 -0.276,-2.26 -0.828,-3.111c-0.552,-0.85 -1.298,-1.604 -2.238,-2.26c-0.94,-0.656 -2.044,-1.246 -3.312,-1.768c-1.268,-0.522 -2.633,-1.067 -4.095,-1.634c-2.029,-0.806 -3.812,-1.619 -5.349,-2.439c-1.537,-0.821 -2.82,-1.746 -3.849,-2.775c-1.029,-1.029 -1.805,-2.201 -2.327,-3.514c-0.522,-1.313 -0.783,-2.85 -0.783,-4.61c0,-2.148 0.492,-4.051 1.477,-5.707c0.985,-1.656 2.298,-3.044 3.939,-4.163c1.641,-1.119 3.514,-1.962 5.617,-2.529c2.104,-0.567 4.274,-0.85 6.512,-0.85c3.969,0 7.52,0.686 10.653,2.059l0,7.43c-3.372,-2.208 -7.251,-3.312 -11.637,-3.312c-1.373,0 -2.611,0.157 -3.715,0.47c-1.104,0.313 -2.051,0.753 -2.842,1.32c-0.791,0.567 -1.402,1.246 -1.835,2.037c-0.433,0.791 -0.649,1.664 -0.649,2.618c0,1.194 0.216,2.193 0.649,2.999c0.433,0.806 1.067,1.522 1.902,2.148c0.836,0.627 1.85,1.194 3.044,1.701c1.194,0.507 2.551,1.059 4.073,1.656c2.029,0.776 3.849,1.574 5.461,2.395c1.611,0.821 2.984,1.746 4.118,2.775c1.134,1.029 2.007,2.216 2.618,3.558c0.612,1.343 0.918,2.939 0.918,4.789c0,2.268 -0.5,4.237 -1.499,5.908c-1,1.671 -2.335,3.059 -4.006,4.163c-1.671,1.104 -3.596,1.925 -5.774,2.462c-2.178,0.537 -4.461,0.806 -6.848,0.806c-4.715,0 -8.803,-0.91 -12.264,-2.73Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2200.639,1487.5l-13.741,45.833l-7.609,0l-9.444,-32.808c-0.358,-1.253 -0.597,-2.671 -0.716,-4.252l-0.179,0c-0.09,1.074 -0.403,2.462 -0.94,4.163l-10.25,32.898l-7.34,0l-13.875,-45.833l7.699,0l9.489,34.465c0.298,1.044 0.507,2.417 0.627,4.118l0.358,0c0.09,-1.313 0.358,-2.715 0.806,-4.207l10.563,-34.375l6.714,0l9.489,34.554c0.298,1.104 0.522,2.477 0.671,4.118l0.358,0c0.06,-1.164 0.313,-2.536 0.761,-4.118l9.31,-34.554l7.251,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2245.98,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2293.917,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2312.537,1526.709l-0.179,0l0,27.706l-7.34,0l0,-66.915l7.34,0l0,8.057l0.179,0c3.611,-6.087 8.892,-9.131 15.845,-9.131c5.908,0 10.518,2.051 13.831,6.154c3.312,4.103 4.968,9.601 4.968,16.494c0,7.669 -1.865,13.808 -5.595,18.418c-3.73,4.61 -8.832,6.915 -15.308,6.915c-5.938,0 -10.518,-2.566 -13.741,-7.699Zm-0.179,-18.486l0,6.401c0,3.79 1.231,7.005 3.693,9.646c2.462,2.641 5.587,3.961 9.377,3.961c4.446,0 7.93,-1.701 10.451,-5.103c2.521,-3.402 3.782,-8.131 3.782,-14.189c0,-5.103 -1.179,-9.101 -3.536,-11.995c-2.357,-2.894 -5.55,-4.342 -9.578,-4.342c-4.267,0 -7.699,1.485 -10.295,4.454c-2.596,2.969 -3.894,6.691 -3.894,11.167Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2356.132,1531.677l0,-7.878c3.998,2.954 8.4,4.431 13.204,4.431c6.445,0 9.668,-2.148 9.668,-6.445c0,-1.223 -0.276,-2.26 -0.828,-3.111c-0.552,-0.85 -1.298,-1.604 -2.238,-2.26c-0.94,-0.656 -2.044,-1.246 -3.312,-1.768c-1.268,-0.522 -2.633,-1.067 -4.095,-1.634c-2.029,-0.806 -3.812,-1.619 -5.349,-2.439c-1.537,-0.821 -2.82,-1.746 -3.849,-2.775c-1.029,-1.029 -1.805,-2.201 -2.327,-3.514c-0.522,-1.313 -0.783,-2.85 -0.783,-4.61c0,-2.148 0.492,-4.051 1.477,-5.707c0.985,-1.656 2.298,-3.044 3.939,-4.163c1.641,-1.119 3.514,-1.962 5.617,-2.529c2.104,-0.567 4.274,-0.85 6.512,-0.85c3.969,0 7.52,0.686 10.653,2.059l0,7.43c-3.372,-2.208 -7.251,-3.312 -11.637,-3.312c-1.373,0 -2.611,0.157 -3.715,0.47c-1.104,0.313 -2.051,0.753 -2.842,1.32c-0.791,0.567 -1.402,1.246 -1.835,2.037c-0.433,0.791 -0.649,1.664 -0.649,2.618c0,1.194 0.216,2.193 0.649,2.999c0.433,0.806 1.067,1.522 1.902,2.148c0.836,0.627 1.85,1.194 3.044,1.701c1.194,0.507 2.551,1.059 4.073,1.656c2.029,0.776 3.849,1.574 5.461,2.395c1.611,0.821 2.984,1.746 4.118,2.775c1.134,1.029 2.007,2.216 2.618,3.558c0.612,1.343 0.918,2.939 0.918,4.789c0,2.268 -0.5,4.237 -1.499,5.908c-1,1.671 -2.335,3.059 -4.006,4.163c-1.671,1.104 -3.596,1.925 -5.774,2.462c-2.178,0.537 -4.461,0.806 -6.848,0.806c-4.715,0 -8.803,-0.91 -12.264,-2.73Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2445.561,1471.924c-1.432,-0.806 -3.059,-1.208 -4.879,-1.208c-5.132,0 -7.699,3.238 -7.699,9.713l0,7.072l10.742,0l0,6.266l-10.742,0l0,39.567l-7.296,0l0,-39.567l-7.833,0l0,-6.266l7.833,0l0,-7.43c0,-4.804 1.388,-8.601 4.163,-11.391c2.775,-2.79 6.236,-4.185 10.384,-4.185c2.238,0 4.013,0.269 5.326,0.806l0,6.624Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2470.76,1534.408c-6.774,0 -12.182,-2.141 -16.225,-6.423c-4.043,-4.282 -6.065,-9.959 -6.065,-17.031c0,-7.699 2.104,-13.711 6.311,-18.038c4.207,-4.327 9.892,-6.49 17.053,-6.49c6.833,0 12.167,2.104 16.001,6.311c3.834,4.207 5.752,10.041 5.752,17.501c0,7.311 -2.066,13.167 -6.199,17.568c-4.133,4.401 -9.675,6.602 -16.628,6.602Zm0.537,-41.805c-4.715,0 -8.445,1.604 -11.19,4.812c-2.745,3.208 -4.118,7.631 -4.118,13.271c0,5.431 1.388,9.713 4.163,12.846c2.775,3.133 6.49,4.7 11.145,4.7c4.744,0 8.392,-1.537 10.944,-4.61c2.551,-3.073 3.827,-7.445 3.827,-13.114c0,-5.729 -1.276,-10.145 -3.827,-13.249c-2.551,-3.103 -6.199,-4.655 -10.944,-4.655Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2529.215,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2570.797,1509.074l0,24.259l-7.52,0l0,-64.185l17.635,0c6.863,0 12.182,1.671 15.957,5.013c3.775,3.342 5.662,8.057 5.662,14.144c0,6.087 -2.096,11.07 -6.289,14.95c-4.192,3.879 -9.854,5.819 -16.986,5.819l-8.459,0Zm0,-33.122l0,26.318l7.878,0c5.192,0 9.153,-1.186 11.884,-3.558c2.73,-2.372 4.095,-5.722 4.095,-10.048c0,-8.474 -5.013,-12.712 -15.039,-12.712l-8.818,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2650.11,1487.5l-21.082,53.174c-3.76,9.489 -9.041,14.233 -15.845,14.233c-1.91,0 -3.506,-0.194 -4.789,-0.582l0,-6.58c1.581,0.537 3.029,0.806 4.342,0.806c3.7,0 6.475,-2.208 8.325,-6.624l3.67,-8.683l-17.904,-45.744l8.146,0l12.398,35.27c0.149,0.448 0.463,1.611 0.94,3.491l0.269,0c0.149,-0.716 0.448,-1.85 0.895,-3.402l13.025,-35.36l7.609,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2679.248,1532.886c-1.731,0.955 -4.013,1.432 -6.848,1.432c-8.027,0 -12.04,-4.476 -12.04,-13.428l0,-27.124l-7.878,0l0,-6.266l7.878,0l0,-11.19l7.34,-2.372l0,13.562l11.548,0l0,6.266l-11.548,0l0,25.826c0,3.073 0.522,5.267 1.567,6.58c1.044,1.313 2.775,1.969 5.192,1.969c1.85,0 3.446,-0.507 4.789,-1.522l0,6.266Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2727.096,1533.333l-7.34,0l0,-26.408c0,-9.549 -3.551,-14.323 -10.653,-14.323c-3.581,0 -6.595,1.38 -9.041,4.14c-2.447,2.76 -3.67,6.304 -3.67,10.63l0,25.96l-7.34,0l0,-67.855l7.34,0l0,29.631l0.179,0c3.521,-5.789 8.534,-8.683 15.039,-8.683c10.324,0 15.487,6.222 15.487,18.665l0,28.243Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2760.083,1534.408c-6.774,0 -12.182,-2.141 -16.225,-6.423c-4.043,-4.282 -6.065,-9.959 -6.065,-17.031c0,-7.699 2.104,-13.711 6.311,-18.038c4.207,-4.327 9.892,-6.49 17.053,-6.49c6.833,0 12.167,2.104 16.001,6.311c3.834,4.207 5.752,10.041 5.752,17.501c0,7.311 -2.066,13.167 -6.199,17.568c-4.133,4.401 -9.675,6.602 -16.628,6.602Zm0.537,-41.805c-4.715,0 -8.445,1.604 -11.19,4.812c-2.745,3.208 -4.118,7.631 -4.118,13.271c0,5.431 1.388,9.713 4.163,12.846c2.775,3.133 6.49,4.7 11.145,4.7c4.744,0 8.392,-1.537 10.944,-4.61c2.551,-3.073 3.827,-7.445 3.827,-13.114c0,-5.729 -1.276,-10.145 -3.827,-13.249c-2.551,-3.103 -6.199,-4.655 -10.944,-4.655Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2832.682,1533.333l-7.34,0l0,-26.139c0,-9.728 -3.551,-14.591 -10.653,-14.591c-3.67,0 -6.706,1.38 -9.108,4.14c-2.402,2.76 -3.603,6.244 -3.603,10.451l0,26.139l-7.34,0l0,-45.833l7.34,0l0,7.609l0.179,0c3.461,-5.789 8.474,-8.683 15.039,-8.683c5.013,0 8.847,1.619 11.503,4.856c2.656,3.238 3.984,7.915 3.984,14.032l0,28.019Z" style="fill:#8e8e93;fill-rule:nonzero;"/></g></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
--8<-- "CHANGELOG.md"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
--8<-- "README.md:progress"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Home
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# parameterrun { .md-visually-hidden }
|
|
6
|
+
|
|
7
|
+
{ .pr-hero }
|
|
8
|
+
{ .pr-hero }
|
|
9
|
+
|
|
10
|
+
--8<-- "README.md:intro"
|
|
11
|
+
|
|
12
|
+
--8<-- "README.md:install"
|
|
13
|
+
|
|
14
|
+
--8<-- "README.md:idea"
|
|
@@ -3,13 +3,15 @@
|
|
|
3
3
|
> **Keep this in sync:** this page describes [.github/workflows/](../.github/workflows/). When a workflow changes
|
|
4
4
|
> (triggers, jobs, matrix, steps, conditions), update the chart and the tables below in the same change.
|
|
5
5
|
|
|
6
|
-
The repository has
|
|
6
|
+
The repository has four workflows. CI, Release and Publish form one pipeline, from a pull request to a PyPI release;
|
|
7
|
+
Docs publishes the documentation site in parallel:
|
|
7
8
|
|
|
8
9
|
| Workflow | File | Trigger | What it does |
|
|
9
10
|
| --- | --- | --- | --- |
|
|
10
|
-
| CI | [ci.yml](../.github/workflows/ci.yml) | `pull_request` into `main` | Tests, lint and type check on 15 OS/Python combinations, plus MPI tests on Linux, macOS and Windows |
|
|
11
|
+
| CI | [ci.yml](../.github/workflows/ci.yml) | `pull_request` into `main` | Tests, lint and type check on 15 OS/Python combinations (coverage uploaded to Codecov from one), plus MPI tests on Linux, macOS and Windows |
|
|
11
12
|
| Release | [release.yml](../.github/workflows/release.yml) | `push` to `main` (i.e. a merged PR) | Reads `__version__`, checks that the tag is new and that `CHANGELOG.md` has a matching entry, then creates the GitHub release and tag `vX.Y.Z` |
|
|
12
13
|
| Publish | [publish.yml](../.github/workflows/publish.yml) | `workflow_run`: Release completed | If Release succeeded: builds the sdist and wheel, checks them, and uploads them to PyPI |
|
|
14
|
+
| Docs | [docs.yml](../.github/workflows/docs.yml) | `pull_request` into `main`, `push` to `main`, `workflow_dispatch` | Builds the site with Zensical (`zensical build --strict`); on pull requests only as a check, otherwise also deploys it to GitHub Pages |
|
|
13
15
|
|
|
14
16
|
## Pipeline chart
|
|
15
17
|
|
|
@@ -20,11 +22,12 @@ The repository has three workflows. They form one pipeline, from a pull request
|
|
|
20
22
|
```mermaid
|
|
21
23
|
flowchart TD
|
|
22
24
|
work(["Work on dev / feature branches"]) -->|"open a PR into main"| pr
|
|
25
|
+
work -->|"open a PR into main"| dbuild
|
|
23
26
|
|
|
24
27
|
subgraph CI["ci.yml: on pull_request into main"]
|
|
25
28
|
pr{{"pull_request event"}}
|
|
26
29
|
matrix["job: test (15 runs, fail-fast off)<br/>os: ubuntu, macos, windows<br/>python: 3.11, 3.12, 3.13, 3.14, 3.15"]
|
|
27
|
-
msteps["checkout, setup-python, pip install uv, uv sync<br/>pytest -m 'not mpi and not mpi_subprocess' (coverage gate 70%)<br/>ruff check, mypy"]
|
|
30
|
+
msteps["checkout, setup-python, pip install uv, uv sync<br/>pytest -m 'not mpi and not mpi_subprocess' (coverage gate 70%)<br/>ruff check, mypy<br/>ubuntu + py3.12 only: upload coverage.xml to Codecov"]
|
|
28
31
|
mpi["job: test-mpi (7 runs, fail-fast off)<br/>Python 3.12<br/>ubuntu: Open MPI + MPICH + Intel MPI<br/>macos: Open MPI + MPICH<br/>windows: Microsoft MPI + Intel MPI"]
|
|
29
32
|
mpisteps["uv sync --extra mpi, verify native MPI runtime<br/>full MPI suite: 4 ranks<br/>scheduling and idle-worker tests: 8 ranks<br/>pytest -m mpi_subprocess (starts its own mpiexec)"]
|
|
30
33
|
pr --> matrix --> msteps
|
|
@@ -64,6 +67,14 @@ flowchart TD
|
|
|
64
67
|
okq -->|"yes"| build --> pypi
|
|
65
68
|
okq -->|"no"| skip
|
|
66
69
|
end
|
|
70
|
+
|
|
71
|
+
merge -->|"push to main"| dbuild
|
|
72
|
+
|
|
73
|
+
subgraph DOCS["docs.yml: on PR into main, push to main or manual run"]
|
|
74
|
+
dbuild["job: build<br/>Python 3.12, uv sync --only-group docs<br/>zensical build --strict<br/>not a PR: upload site/"]
|
|
75
|
+
deploy["job: deploy (skipped on PRs)<br/>actions/deploy-pages, environment 'github-pages'"]
|
|
76
|
+
dbuild -->|"push or manual run"| deploy
|
|
77
|
+
end
|
|
67
78
|
```
|
|
68
79
|
|
|
69
80
|
## Jobs in detail
|
|
@@ -72,7 +83,7 @@ flowchart TD
|
|
|
72
83
|
|
|
73
84
|
| Job | Runs on | Steps | Notes |
|
|
74
85
|
| --- | --- | --- | --- |
|
|
75
|
-
| `test` | ubuntu, macos, windows × Python 3.11–3.15 (15 runs) | `uv sync`, `pytest -m "not mpi and not mpi_subprocess"`, `ruff check .`, `mypy` | `fail-fast: false`, so one failing combination does not cancel the others. `addopts` in `pyproject.toml` adds the 70% coverage gate. Native MPI is only required in `test-mpi`. |
|
|
86
|
+
| `test` | ubuntu, macos, windows × Python 3.11–3.15 (15 runs) | `uv sync`, `pytest -m "not mpi and not mpi_subprocess" --cov-report=xml`, `ruff check .`, `mypy`; on ubuntu + Python 3.12 only, `codecov/codecov-action` uploads `coverage.xml` (secret `CODECOV_TOKEN`, `fail_ci_if_error: false`) | `fail-fast: false`, so one failing combination does not cancel the others. `addopts` in `pyproject.toml` adds the 70% coverage gate. Native MPI is only required in `test-mpi`. |
|
|
76
87
|
| `test-mpi` | Python 3.12; ubuntu with Open MPI/MPICH/Intel MPI, macos with Open MPI/MPICH, windows with Microsoft MPI/Intel MPI (7 runs) | `mpi4py/setup-mpi`, `uv sync --extra mpi`, verify the runtime vendor, full MPI suite with 4 ranks, `tests/test_mpi_rank_scaling.py` with 8 ranks, then `pytest -m mpi_subprocess` | `fail-fast: false`. Existing integration tests require 4 ranks; the scaling tests run at both 4 and 8 ranks. Subprocess tests launch their own four-rank jobs outside `mpiexec`. |
|
|
77
88
|
|
|
78
89
|
Permissions are read-only (`contents: read`).
|
|
@@ -114,9 +125,22 @@ Release ran on (`workflow_run.head_sha`), builds with `python -m build`, validat
|
|
|
114
125
|
uploads with `pypa/gh-action-pypi-publish`. There is no API token in the workflow: it uses the `pypi` environment and
|
|
115
126
|
an OIDC token (`id-token: write`), i.e. PyPI trusted publishing.
|
|
116
127
|
|
|
128
|
+
### Docs ([docs.yml](../.github/workflows/docs.yml))
|
|
129
|
+
|
|
130
|
+
Runs on pull requests into `main`, on every push to `main` and on manual dispatch. Concurrency is grouped per ref
|
|
131
|
+
(`docs-<ref>`): a new commit on a PR cancels the PR's previous run, while deployments from `main` queue. The `build`
|
|
132
|
+
job (`contents: read`) installs only the `docs` dependency group and builds the site with
|
|
133
|
+
[Zensical](https://zensical.org), which reads `mkdocs.yml`, using `zensical build --strict` (a missing README snippet
|
|
134
|
+
fails the run; unlike MkDocs, Zensical 0.1 does not report broken relative links). On pull requests that is the whole
|
|
135
|
+
check. Otherwise it uploads `site/` with `actions/upload-pages-artifact`, and the `deploy` job (`pages: write`,
|
|
136
|
+
`id-token: write`) publishes it with `actions/deploy-pages` in the `github-pages` environment. The site's pages pull their text from `README.md` and
|
|
137
|
+
`CHANGELOG.md` through snippet markers, and the API reference from the `parameterrun` docstring.
|
|
138
|
+
|
|
117
139
|
## What this means in practice
|
|
118
140
|
|
|
119
|
-
- **CI only
|
|
141
|
+
- **CI runs only on pull requests into `main`**, not again after the merge. The README badges follow the PR runs: the
|
|
142
|
+
CI badge filters on `event=pull_request`, and the Codecov badge shows the `dev` branch, which PR uploads are filed
|
|
143
|
+
under. Pushes to `dev` or feature branches are not tested by GitHub Actions.
|
|
120
144
|
- **Every merge into `main` is a release.** If `__version__` was not bumped, Release fails at step 2 and nothing is
|
|
121
145
|
published. If the `CHANGELOG.md` section is missing, it fails at step 3. Before merging: run
|
|
122
146
|
`python scripts/bump_version.py …` and move the `[Unreleased]` entries under `## [X.Y.Z] - date`.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Zensical reads this MkDocs-format config (https://zensical.org/docs/compatibility/mkdocs/).
|
|
2
|
+
site_name: parameterrun
|
|
3
|
+
site_description: Parallel parameter sweeps for Python with joblib/MPI and tqdm progress bars.
|
|
4
|
+
site_url: https://davtax.github.io/ParameterRun/
|
|
5
|
+
repo_url: https://github.com/Davtax/ParameterRun
|
|
6
|
+
repo_name: Davtax/ParameterRun
|
|
7
|
+
edit_uri: edit/dev/docs/
|
|
8
|
+
copyright: Copyright © David Fernández-Fernández · BSD-3-Clause
|
|
9
|
+
|
|
10
|
+
theme:
|
|
11
|
+
name: material
|
|
12
|
+
logo: assets/logo-mark-dark.svg
|
|
13
|
+
favicon: assets/favicon.svg
|
|
14
|
+
icon:
|
|
15
|
+
repo: fontawesome/brands/github
|
|
16
|
+
font:
|
|
17
|
+
text: Inter
|
|
18
|
+
code: JetBrains Mono
|
|
19
|
+
palette:
|
|
20
|
+
- media: "(prefers-color-scheme: light)"
|
|
21
|
+
scheme: default
|
|
22
|
+
primary: custom
|
|
23
|
+
accent: custom
|
|
24
|
+
toggle:
|
|
25
|
+
icon: material/weather-night
|
|
26
|
+
name: Switch to dark mode
|
|
27
|
+
- media: "(prefers-color-scheme: dark)"
|
|
28
|
+
scheme: slate
|
|
29
|
+
primary: custom
|
|
30
|
+
accent: custom
|
|
31
|
+
toggle:
|
|
32
|
+
icon: material/weather-sunny
|
|
33
|
+
name: Switch to light mode
|
|
34
|
+
features:
|
|
35
|
+
- navigation.instant
|
|
36
|
+
- navigation.tracking
|
|
37
|
+
- navigation.sections
|
|
38
|
+
- navigation.top
|
|
39
|
+
- navigation.footer
|
|
40
|
+
- content.code.copy
|
|
41
|
+
- search.suggest
|
|
42
|
+
- search.highlight
|
|
43
|
+
|
|
44
|
+
extra_css:
|
|
45
|
+
- assets/extra.css
|
|
46
|
+
|
|
47
|
+
nav:
|
|
48
|
+
- Home: index.md
|
|
49
|
+
- Quick start: quickstart.md
|
|
50
|
+
- User guide:
|
|
51
|
+
- Parallel backends: guide/backends.md
|
|
52
|
+
- Saving results and checkpoints: guide/results.md
|
|
53
|
+
- Errors and validation: guide/errors.md
|
|
54
|
+
- Progress bars: guide/progress.md
|
|
55
|
+
- API reference: reference.md
|
|
56
|
+
- Changelog: changelog.md
|
|
57
|
+
- Contributing: contributing.md
|
|
58
|
+
|
|
59
|
+
plugins:
|
|
60
|
+
- search
|
|
61
|
+
- mkdocstrings:
|
|
62
|
+
handlers:
|
|
63
|
+
python:
|
|
64
|
+
paths: [src]
|
|
65
|
+
options:
|
|
66
|
+
docstring_style: numpy
|
|
67
|
+
show_root_heading: true
|
|
68
|
+
show_source: false
|
|
69
|
+
show_signature_annotations: true
|
|
70
|
+
separate_signature: true
|
|
71
|
+
heading_level: 2
|
|
72
|
+
|
|
73
|
+
markdown_extensions:
|
|
74
|
+
- admonition
|
|
75
|
+
- attr_list
|
|
76
|
+
- md_in_html
|
|
77
|
+
- tables
|
|
78
|
+
- toc:
|
|
79
|
+
permalink: true
|
|
80
|
+
- pymdownx.details
|
|
81
|
+
- pymdownx.highlight:
|
|
82
|
+
anchor_linenums: true
|
|
83
|
+
- pymdownx.inlinehilite
|
|
84
|
+
- pymdownx.snippets:
|
|
85
|
+
base_path: ["."]
|
|
86
|
+
check_paths: true
|
|
87
|
+
- pymdownx.superfences:
|
|
88
|
+
custom_fences:
|
|
89
|
+
- name: mermaid
|
|
90
|
+
class: mermaid
|
|
91
|
+
format: !!python/name:pymdownx.superfences.fence_code_format
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = ["hatchling>=1.27"]
|
|
2
|
+
requires = ["hatchling>=1.27", "hatch-fancy-pypi-readme>=24.1"]
|
|
3
3
|
build-backend = "hatchling.build"
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "parameterrun"
|
|
7
|
-
dynamic = ["version"]
|
|
7
|
+
dynamic = ["version", "readme"]
|
|
8
8
|
description = "Parallel parameter sweeps with joblib/MPI and tqdm progress bars."
|
|
9
|
-
readme = "README.md"
|
|
10
9
|
license = "BSD-3-Clause"
|
|
11
10
|
authors = [
|
|
12
11
|
{ name = "David Fernández-Fernández", email = "david.fernandezf@hotmail.com" }
|
|
@@ -36,6 +35,7 @@ dependencies = [
|
|
|
36
35
|
|
|
37
36
|
[project.urls]
|
|
38
37
|
Homepage = "https://github.com/Davtax/ParameterRun"
|
|
38
|
+
Documentation = "https://davtax.github.io/ParameterRun/"
|
|
39
39
|
Repository = "https://github.com/Davtax/ParameterRun"
|
|
40
40
|
Issues = "https://github.com/Davtax/ParameterRun/issues"
|
|
41
41
|
Changelog = "https://github.com/Davtax/ParameterRun/blob/main/CHANGELOG.md"
|
|
@@ -46,6 +46,11 @@ mpi = [
|
|
|
46
46
|
]
|
|
47
47
|
|
|
48
48
|
[dependency-groups]
|
|
49
|
+
docs = [
|
|
50
|
+
"zensical>=0.1",
|
|
51
|
+
"mkdocstrings[python]>=0.26",
|
|
52
|
+
"ruff>=0.11",
|
|
53
|
+
]
|
|
49
54
|
bench = [
|
|
50
55
|
"ipykernel>=6.29",
|
|
51
56
|
"matplotlib>=3.8",
|
|
@@ -58,7 +63,7 @@ dev = [
|
|
|
58
63
|
"ruff>=0.11",
|
|
59
64
|
"mypy>=1.10",
|
|
60
65
|
"build>=1.2",
|
|
61
|
-
"twine>=
|
|
66
|
+
"twine>=7",
|
|
62
67
|
"pydevd-pycharm>=261.23567.174",
|
|
63
68
|
"psutil>=7.2.2",
|
|
64
69
|
"scalene>=2.2.1",
|
|
@@ -71,6 +76,20 @@ pattern = '__version__ = "(?P<version>[^"]+)"'
|
|
|
71
76
|
[tool.hatch.build.targets.wheel]
|
|
72
77
|
packages = ["src/parameterrun"]
|
|
73
78
|
|
|
79
|
+
[tool.hatch.build.targets.sdist]
|
|
80
|
+
exclude = ["/logo"]
|
|
81
|
+
|
|
82
|
+
# README uses relative image paths (work on GitHub and in local previews); PyPI needs absolute URLs.
|
|
83
|
+
[tool.hatch.metadata.hooks.fancy-pypi-readme]
|
|
84
|
+
content-type = "text/markdown"
|
|
85
|
+
|
|
86
|
+
[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]]
|
|
87
|
+
path = "README.md"
|
|
88
|
+
|
|
89
|
+
[[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]]
|
|
90
|
+
pattern = '(src|srcset)="logo/'
|
|
91
|
+
replacement = '\1="https://raw.githubusercontent.com/Davtax/ParameterRun/main/logo/'
|
|
92
|
+
|
|
74
93
|
[tool.pytest.ini_options]
|
|
75
94
|
testpaths = ["tests"]
|
|
76
95
|
addopts = "-q --cov=parameterrun --cov-report=term-missing --cov-fail-under=70"
|
|
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
|
|
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
|