From 29fc86b014ec1651e1c5b2dcbfae5dc411cf992b Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Sun, 15 Jan 2023 17:40:29 +0100 Subject: [PATCH 01/21] TL: added first draft for CONTRIBUTING.md --- CONTRIBUTING.md | 10 +++ docs/contrib/01_pull_requests.md | 41 ++++++++++++ docs/contrib/02_continuous_integration.md | 48 +++++++++++++ docs/contrib/03_naming_conventions.md | 82 +++++++++++++++++++++++ docs/contrib/04_custom_implementations.md | 3 + 5 files changed, 184 insertions(+) create mode 100644 CONTRIBUTING.md create mode 100644 docs/contrib/01_pull_requests.md create mode 100644 docs/contrib/02_continuous_integration.md create mode 100644 docs/contrib/03_naming_conventions.md create mode 100644 docs/contrib/04_custom_implementations.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..ac254dad8b --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,10 @@ +# How to contribute to pySDC + +Developments on the `pySDC` code use the classical approach of forks and pull requests from Github. +There is an [extended documentation](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/getting-started/about-collaborative-development-models) on this aspect (that you can skip if you are already used to it). In addition, some recommendations for pull requests are given in [this page](./docs/contrib/01_pull_requests.md). + +Additionnaly, a _few_ rules are set to enforce code readability, consistency and reliability. Some of them are automatically tested with each commit, and summarized in the page on [continuous integration (CI)](./docs/contrib/02_continuous_integration.md). +Others are specific conventions chosen for the pySDC library, that may follow Python standards (or not ...), detailed in the [naming conventions page](./docs/contrib/03_naming_conventions.md). + +Finally, while `pySDC` provides many base functionalities that implement classical flavors of SDC, it also allows problem-specific applications through Object-Oriented Programming (OOP) and the implementation of custom inherited classes. +This follows a specific OOP framework, for which more details are given [here](.(docs/contrib/../../docs/contrib/04_custom_implementations.md)). \ No newline at end of file diff --git a/docs/contrib/01_pull_requests.md b/docs/contrib/01_pull_requests.md new file mode 100644 index 0000000000..7d93f162a2 --- /dev/null +++ b/docs/contrib/01_pull_requests.md @@ -0,0 +1,41 @@ +# Recommendations for pull requests + +Contributions on the `pySDC` code is expected to be done through pull requests from personal (public) forked repositories. A few core developpers can eventually push maintenance commits directly to the main repository. However (even for core developpers), it is highly recommended to add specific contribution trough dedicated merge requests from forks. + +## Contributing to the main branch + +The main version of `pySDC` is hosted in the `master` branch, on which any contributor can propose pull requests. Those can consist on : + +- bug fixes and code corrections (_e.g_ solving one of the current [issues](https://github.com/Parallel-in-Time/pySDC/issues)) +- addition or improvement of documentation +- improvement of existing functionalities (performance, accuracy, usage, ...) +- addition of new functionnalities and applications +- improvement of CI test routines + +Pull request should comes from forks branches with a name specific to the contribution. For instance : + +``` +# branch name : +issue214 # to solve issue 214 +awsome_new_project # to add a new project +some_feature # to add a new feature (implementation, ...) +``` + +> :scroll: Favor the use of _short name_ for branch, using _lower case_ and eventuall underscores to ease readability. + +Those changes should be compatible with the existing API (_i.e_ not break it), and **avoid any change** in the current user interface. In particular, it should not modify default values for parameters or remove attributes of existing classes. But new attributes or parameters can be added with pre-set default values, and new classes can be added in the `pySDC.implementations` module. + + +## Release development branches + +Branches with name starting with `v[...]` are developement branches for the next releases of `pySDC` (_e.g_ `v5`, `v6`, ...). Those may introduce API-breaking changes (user interface, structure of core classes) that would force re-writing application scripts using `pySDC` (_e.g_ tutorials, projects, ...). Contribution to those branches are done by core developpers, but anyone can also propose pull requests on those branches once the roadmap and milestones for the associated release has been written down in a dedicated issue. +Such branches are merged to `master` when ready. + +> :scroll: Pull request to those branches can be done from fork branches using the **same name** as the release branche. + +## Feature development branches + +Additional branches starting with the prefix `dev/[...]` can be used to add new features, that cannot be added with only one pull request (for instance, when several developpers work on it). +Those could eventually be merged into master if they don't break the API, or to the next release branch if they do. + +> :scroll: Pull request to those branches can be done from fork branches using the **same name** as the feature branche. \ No newline at end of file diff --git a/docs/contrib/02_continuous_integration.md b/docs/contrib/02_continuous_integration.md new file mode 100644 index 0000000000..138e72ed45 --- /dev/null +++ b/docs/contrib/02_continuous_integration.md @@ -0,0 +1,48 @@ +# Continuous Integration in pySDC + +Any commit in `pySDC` are tested within by GitHub continuous integration (CI). You can see in in the [action panel](https://github.com/Parallel-in-Time/pySDC/actions) the tests for each branches. +Those tests can be devided in two main categories : code linting and code testing. + +## Code linting + +Code style linting is performed using [`black`](https://black.readthedocs.io/en/stable/) and [`flakeheaven`](https://flakeheaven.readthedocs.io/en/latest/) for code synthax checking. In particular, `black` is used to check compliance with (most of) [PEP-8 guidelines](https://peps.python.org/pep-0008/). + +Those tests are conducted for each commit (even for forks), but you can also run it locally in the root folder of `pySDC` before pushing any commit : + +```bash +# Install required packages (works also with conda/mamba) +pip install black flakeheaven flake8-comprehensions flake8-bugbear +# First : test code style linting with black +black pySDC --check --diff --color +# Second : test code syntax with flakeheaven +flakeheaven lint --benchmark pySDC +``` + +> :bell: To avoid any error about formating (`black`), you can simply use this program to reformat directly your code using the command : +> +> ```bash +> black pySDC +> ``` + +Some style rules that are automatically enforced : + +- lines should be not longer than 120 characters +- arithmetic operators (`+`, `*`, ...) should be separated with variables by one empty space + +# Code testing + +This is done using[ `pytest`](https://docs.pytest.org/en/7.2.x/), and runs all the tests writen in the `pySDC/tests` folder. You can run those locally in the root folder of `pySDC` using : + +```bash +# Install required packages (works also with conda/mamba) +pip install pytest<7.2.0 pytest-benchmark coverage[toml] +# Run tests +pytest -v pySDC/tests +``` + +> :bell: Many components are tested (core, implementations, projects, tutorials, etc ...) which make the testing quite long. +> When working on a single part of the code, you can run only the corresponding part of the test by specifying the test path, for instance : +> +> ```bash +> pytest -v pySDC/tests/test_nodes.py # only test nodes generation +> ``` \ No newline at end of file diff --git a/docs/contrib/03_naming_conventions.md b/docs/contrib/03_naming_conventions.md new file mode 100644 index 0000000000..0f406e93c2 --- /dev/null +++ b/docs/contrib/03_naming_conventions.md @@ -0,0 +1,82 @@ +# Naming conventions in pySDC + +> :scroll: Those rules may not be enforced by the current implementation of pySDC. However, they should be enforced for any contribution. + +Naming convention are mostly inspired from the [PEP-8 guidelines](https://peps.python.org/pep-0008/), even if some of them may be different. Of course, strictly following those rules is not always the best solution, as Guido Von Rossum's key insight states : + +> _A Foolish Consistency is the Hobgoblin of Little Minds_ + +The most important idea at the end is to find a optimal compromise between + +- readability : _Can someone else easily read and understand my code ?_ +- effectiveness : _Does my code avoid kilometers-long lines to do simple things ?_ + +Both aspects are interdependant to ease maintaning/development of any code and improve its attractivity to potential users. + +## Packages and modules names + +Modules should have short, all-lowercase names. Underscores can be used in the module name if it improves readability. Python packages should also have short, all-lowercase names, although the use of underscores is discouraged. + +## Class names + +Class names should use PascalCase formating, for instance : + +```python +class AdvectionDiffusion(Problem): + pass +``` + +The shorter, the better. Also, exception class names should end with the suffix `Error`, for instance + +```python +class ParameterError(Exception): + pass +``` + +## Function and variables names + +Function (or method) and variable names should be lowercase, with words separated by underscores as necessary to improve readability. +Same goes for function arguments. For instance : + +```python +tleft = 1 +quad_type = 'LEGENDRE' + +def compute_fejer_rule(num_nodes): + # ... + +class NodeGenerator(): + def get_orthog_poly_coefficients(self, num_coeff): + # ... +``` + +> :bell: In general, shorter name should be favored, **as long as it does not deteriorate understandability**. For instance, using `get_orthog_poly_coeffs` rather than `get_orthogonal_polynomial_coefficients`. Acronyms can also be used, but with caution (for instance, `mssdc_jac` may not be very explicit for `multistep_sdc_jacobian`). + +## Private and public attributes + +There is no such thing as private or public attributes in Python. But some attributes, if uses only within the object method, can be indicated as private using the `_` prefix. For instance : + +```python +class ChuckNorris(): + + def __init__(self, param): + self.param = param + + def _think(self): + print('...') + + def act(self): + if self.param == 'doubt': + self._think() + print('*?%&$?*§"$*$*§#{*') +``` + +## Constants + +Constants are usually defined on a module level and written in all capital letters with underscores separating words. +Examples : + +```python +NODE_TYPES = ['EQUID', 'LEGENDRE', 'CHEBY-1', 'CHEBY-2', 'CHEBY-3', 'CHEBY-4'] +QUAD_TYPES = ['GAUSS', 'RADAU-LEFT', 'RADAU-RIGHT', 'LOBATTO'] +``` \ No newline at end of file diff --git a/docs/contrib/04_custom_implementations.md b/docs/contrib/04_custom_implementations.md new file mode 100644 index 0000000000..5e4f011191 --- /dev/null +++ b/docs/contrib/04_custom_implementations.md @@ -0,0 +1,3 @@ +# Custom implementation guidelines + +... in construction ... \ No newline at end of file From 3af0b0bbe4e1dd2ad782cc1d695ba510c46f68cf Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Sun, 15 Jan 2023 19:12:52 +0100 Subject: [PATCH 02/21] TL: added links and reference in README --- CONTRIBUTING.md | 7 ++++++- README.rst | 11 ++++++++++- docs/contrib/01_pull_requests.md | 5 ++++- docs/contrib/02_continuous_integration.md | 5 ++++- docs/contrib/03_naming_conventions.md | 5 ++++- docs/contrib/04_custom_implementations.md | 5 ++++- 6 files changed, 32 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ac254dad8b..376e38cb3d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,12 @@ # How to contribute to pySDC +1. [Pull Requestion recommendations](./docs/contrib/01_pull_requests.md) +2. [Continuous Integration](./docs/contrib/02_continuous_integration.md) +3. [Naming Conventions](./docs/contrib/03_naming_conventions.md) +4. [Custom Implementations](./docs/contrib/04_custom_implementations.md) + Developments on the `pySDC` code use the classical approach of forks and pull requests from Github. -There is an [extended documentation](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/getting-started/about-collaborative-development-models) on this aspect (that you can skip if you are already used to it). In addition, some recommendations for pull requests are given in [this page](./docs/contrib/01_pull_requests.md). +There is an [extended documentation](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/getting-started/about-collaborative-development-models) on this aspect (that you can skip if you are already used to it). In addition, some recommendations for pull requests are given [here](./docs/contrib/01_pull_requests.md). Additionnaly, a _few_ rules are set to enforce code readability, consistency and reliability. Some of them are automatically tested with each commit, and summarized in the page on [continuous integration (CI)](./docs/contrib/02_continuous_integration.md). Others are specific conventions chosen for the pySDC library, that may follow Python standards (or not ...), detailed in the [naming conventions page](./docs/contrib/03_naming_conventions.md). diff --git a/README.rst b/README.rst index 41ce82469e..88ee55d866 100644 --- a/README.rst +++ b/README.rst @@ -61,7 +61,7 @@ How to cite If you use pySDC or parts of it for your work, great! Let us know if we can help you with this. Also, we would greatly appreciate a citation of `this paper `_: - Robert Speck, **Algorithm 997: pySDC - Prototyping Spectral Deferred Corrections**, + Robert Speck, **Algorithm 997: pySDC - Prototyping Spectral Deferred Corrections**, ACM Transactions on Mathematical Software (TOMS), Volume 45 Issue 3, August 2019, `https://doi.org/10.1145/3310410 `_ @@ -70,6 +70,15 @@ The current software release can be cited using Zenodo: |zenodo| .. |zenodo| image:: https://zenodo.org/badge/26165004.svg :target: https://zenodo.org/badge/latestdoi/26165004 +Contributing +------------ + +`pySDC` code was originaly developped by Robert Speck (@pancetta), +and is now maintained and developed by a small community of scientists interested in SDC methods, +that dearly welcomes any contribution. +If you want to take part of this, please take the time to read our `Contribution Guidelines `. + + Acknowledgements ---------------- diff --git a/docs/contrib/01_pull_requests.md b/docs/contrib/01_pull_requests.md index 7d93f162a2..a77168b8b9 100644 --- a/docs/contrib/01_pull_requests.md +++ b/docs/contrib/01_pull_requests.md @@ -38,4 +38,7 @@ Such branches are merged to `master` when ready. Additional branches starting with the prefix `dev/[...]` can be used to add new features, that cannot be added with only one pull request (for instance, when several developpers work on it). Those could eventually be merged into master if they don't break the API, or to the next release branch if they do. -> :scroll: Pull request to those branches can be done from fork branches using the **same name** as the feature branche. \ No newline at end of file +> :scroll: Pull request to those branches can be done from fork branches using the **same name** as the feature branche. + +[:arrow_left: Back to Contributing Summary](./../../CONTRIBUTING.md) --- +[:arrow_right: Next to Continuous Integration](./02_continuous_integration.md) \ No newline at end of file diff --git a/docs/contrib/02_continuous_integration.md b/docs/contrib/02_continuous_integration.md index 138e72ed45..c8302f1492 100644 --- a/docs/contrib/02_continuous_integration.md +++ b/docs/contrib/02_continuous_integration.md @@ -45,4 +45,7 @@ pytest -v pySDC/tests > > ```bash > pytest -v pySDC/tests/test_nodes.py # only test nodes generation -> ``` \ No newline at end of file +> ``` + +[:arrow_left: Back to Pull Request Recommendation](./01_pull_requests.md) --- +[:arrow_right: Next to Naming Conventions](./03_naming_conventions.md) \ No newline at end of file diff --git a/docs/contrib/03_naming_conventions.md b/docs/contrib/03_naming_conventions.md index 0f406e93c2..8d79b59d7c 100644 --- a/docs/contrib/03_naming_conventions.md +++ b/docs/contrib/03_naming_conventions.md @@ -79,4 +79,7 @@ Examples : ```python NODE_TYPES = ['EQUID', 'LEGENDRE', 'CHEBY-1', 'CHEBY-2', 'CHEBY-3', 'CHEBY-4'] QUAD_TYPES = ['GAUSS', 'RADAU-LEFT', 'RADAU-RIGHT', 'LOBATTO'] -``` \ No newline at end of file +``` + +[:arrow_left: Back to Continuous Integration](./02_continuous_integration.md) --- +[:arrow_right: Next to Custom Implementations](./04_custom_implementations.md) \ No newline at end of file diff --git a/docs/contrib/04_custom_implementations.md b/docs/contrib/04_custom_implementations.md index 5e4f011191..2dd71e0ffa 100644 --- a/docs/contrib/04_custom_implementations.md +++ b/docs/contrib/04_custom_implementations.md @@ -1,3 +1,6 @@ # Custom implementation guidelines -... in construction ... \ No newline at end of file +... in construction ... + +[:arrow_left: Back to Naming Conventions](./03_naming_conventions.md) --- +[:arrow_right: Next to a cute picture of cat](https://www.vecteezy.com/photo/2098203-silver-tabby-cat-sitting-on-green-background) \ No newline at end of file From 10c1f39a5fbf655a654564663f6fcb732419f40f Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Sun, 15 Jan 2023 19:30:33 +0100 Subject: [PATCH 03/21] TL: fixing link --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 88ee55d866..26db68a8dc 100644 --- a/README.rst +++ b/README.rst @@ -76,7 +76,7 @@ Contributing `pySDC` code was originaly developped by Robert Speck (@pancetta), and is now maintained and developed by a small community of scientists interested in SDC methods, that dearly welcomes any contribution. -If you want to take part of this, please take the time to read our `Contribution Guidelines `. +If you want to take part of this, please take the time to read our `Contribution Guidelines `_. Acknowledgements @@ -91,4 +91,4 @@ The project also received help from the `Helmholtz Platform for Research Softwar .. |badge-ga| image:: https://github.com/Parallel-in-Time/pySDC/actions/workflows/ci_pipeline.yml/badge.svg :target: https://github.com/Parallel-in-Time/pySDC/actions/workflows/ci_pipeline.yml .. |badge-ossf| image:: https://bestpractices.coreinfrastructure.org/projects/6909/badge - :target: https://bestpractices.coreinfrastructure.org/projects/6909 \ No newline at end of file + :target: https://bestpractices.coreinfrastructure.org/projects/6909 From 6f13833718dbdc5511f216f998b46d8758fa010a Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Sun, 15 Jan 2023 23:17:06 +0100 Subject: [PATCH 04/21] TL: moved to rst format for contrib --- .gitignore | 3 + CONTRIBUTING.rst | 27 ++++++ README.rst | 3 +- docs/contrib/01_pull_requests.md | 44 --------- docs/contrib/01_pull_requests.rst | 58 ++++++++++++ docs/contrib/02_continuous_integration.md | 51 ----------- docs/contrib/02_continuous_integration.rst | 62 +++++++++++++ docs/contrib/03_naming_conventions.md | 85 ----------------- docs/contrib/03_naming_conventions.rst | 102 +++++++++++++++++++++ docs/contrib/04_custom_implementations.md | 6 -- docs/contrib/04_custom_implementations.rst | 8 ++ 11 files changed, 262 insertions(+), 187 deletions(-) create mode 100644 CONTRIBUTING.rst delete mode 100644 docs/contrib/01_pull_requests.md create mode 100644 docs/contrib/01_pull_requests.rst delete mode 100644 docs/contrib/02_continuous_integration.md create mode 100644 docs/contrib/02_continuous_integration.rst delete mode 100644 docs/contrib/03_naming_conventions.md create mode 100644 docs/contrib/03_naming_conventions.rst delete mode 100644 docs/contrib/04_custom_implementations.md create mode 100644 docs/contrib/04_custom_implementations.rst diff --git a/.gitignore b/.gitignore index 632ce84ad8..719ebdbb1b 100644 --- a/.gitignore +++ b/.gitignore @@ -152,3 +152,6 @@ Temporary Items # jupyter .ipynb_checkpoints + +# VSCode +.vscode diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst new file mode 100644 index 0000000000..619ecee2b3 --- /dev/null +++ b/CONTRIBUTING.rst @@ -0,0 +1,27 @@ + +How to contribute to pySDC +========================== + +#. `Pull Requestion recommendations <./docs/contrib/01_pull_requests.rst>`_ +#. `Continuous Integration <./docs/contrib/02_continuous_integration.rst>`_ +#. `Naming Conventions <./docs/contrib/03_naming_conventions.rst>`_ +#. `Custom Implementations <./docs/contrib/04_custom_implementations.rst>`_ + +Developments on the ``pySDC`` code use the classical approach of forks and pull requests from Github. +There is an `extended documentation `_ +on this aspect (that you can skip if you are already used to it). +In addition, some recommendations for pull requests are given +`here <./docs/contrib/01_pull_requests.rst>`_. + +Additionnaly, a *few* rules are set to enforce code readability, +consistency and reliability. Some of them are automatically tested with each commit, +and summarized in the page on `continuous integration (CI) <./docs/contrib/02_continuous_integration.rst>`_. +Others are specific conventions chosen for the pySDC library, +that may follow Python standards (or not ...), +detailed in the `naming conventions page <./docs/contrib/03_naming_conventions.rst>`_. + +Finally, while ``pySDC`` provides many base functionalities that implement classical +flavors of SDC, it also allows problem-specific applications through Object-Oriented +Programming (OOP) and the implementation of custom inherited classes. +This follows a specific OOP framework, for which more details are given +`here <.(docs/contrib/../../docs/contrib/04_custom_implementations.rst>`_\ ). diff --git a/README.rst b/README.rst index 26db68a8dc..bff2b14340 100644 --- a/README.rst +++ b/README.rst @@ -76,8 +76,9 @@ Contributing `pySDC` code was originaly developped by Robert Speck (@pancetta), and is now maintained and developed by a small community of scientists interested in SDC methods, that dearly welcomes any contribution. -If you want to take part of this, please take the time to read our `Contribution Guidelines `_. +If you want to take part of this, please take the time to read our `Contribution Guidelines <./CONTRIBUTING.rst>`_. +.. _contrib: Acknowledgements ---------------- diff --git a/docs/contrib/01_pull_requests.md b/docs/contrib/01_pull_requests.md deleted file mode 100644 index a77168b8b9..0000000000 --- a/docs/contrib/01_pull_requests.md +++ /dev/null @@ -1,44 +0,0 @@ -# Recommendations for pull requests - -Contributions on the `pySDC` code is expected to be done through pull requests from personal (public) forked repositories. A few core developpers can eventually push maintenance commits directly to the main repository. However (even for core developpers), it is highly recommended to add specific contribution trough dedicated merge requests from forks. - -## Contributing to the main branch - -The main version of `pySDC` is hosted in the `master` branch, on which any contributor can propose pull requests. Those can consist on : - -- bug fixes and code corrections (_e.g_ solving one of the current [issues](https://github.com/Parallel-in-Time/pySDC/issues)) -- addition or improvement of documentation -- improvement of existing functionalities (performance, accuracy, usage, ...) -- addition of new functionnalities and applications -- improvement of CI test routines - -Pull request should comes from forks branches with a name specific to the contribution. For instance : - -``` -# branch name : -issue214 # to solve issue 214 -awsome_new_project # to add a new project -some_feature # to add a new feature (implementation, ...) -``` - -> :scroll: Favor the use of _short name_ for branch, using _lower case_ and eventuall underscores to ease readability. - -Those changes should be compatible with the existing API (_i.e_ not break it), and **avoid any change** in the current user interface. In particular, it should not modify default values for parameters or remove attributes of existing classes. But new attributes or parameters can be added with pre-set default values, and new classes can be added in the `pySDC.implementations` module. - - -## Release development branches - -Branches with name starting with `v[...]` are developement branches for the next releases of `pySDC` (_e.g_ `v5`, `v6`, ...). Those may introduce API-breaking changes (user interface, structure of core classes) that would force re-writing application scripts using `pySDC` (_e.g_ tutorials, projects, ...). Contribution to those branches are done by core developpers, but anyone can also propose pull requests on those branches once the roadmap and milestones for the associated release has been written down in a dedicated issue. -Such branches are merged to `master` when ready. - -> :scroll: Pull request to those branches can be done from fork branches using the **same name** as the release branche. - -## Feature development branches - -Additional branches starting with the prefix `dev/[...]` can be used to add new features, that cannot be added with only one pull request (for instance, when several developpers work on it). -Those could eventually be merged into master if they don't break the API, or to the next release branch if they do. - -> :scroll: Pull request to those branches can be done from fork branches using the **same name** as the feature branche. - -[:arrow_left: Back to Contributing Summary](./../../CONTRIBUTING.md) --- -[:arrow_right: Next to Continuous Integration](./02_continuous_integration.md) \ No newline at end of file diff --git a/docs/contrib/01_pull_requests.rst b/docs/contrib/01_pull_requests.rst new file mode 100644 index 0000000000..d3ec7cac18 --- /dev/null +++ b/docs/contrib/01_pull_requests.rst @@ -0,0 +1,58 @@ + +Recommendations for pull requests +================================= + +Contributions on the ``pySDC`` code is expected to be done through pull requests from personal (public) forked repositories. A few core developpers can eventually push maintenance commits directly to the main repository. However (even for core developpers), it is highly recommended to add specific contribution trough dedicated merge requests from forks. + +Contributing to the main branch +------------------------------- + +The main version of ``pySDC`` is hosted in the ``master`` branch, on which any contributor can propose pull requests. Those can consist on : + + +* bug fixes and code corrections (\ *e.g* solving one of the current `issues `_\ ) +* addition or improvement of documentation +* improvement of existing functionalities (performance, accuracy, usage, ...) +* addition of new functionnalities and applications +* improvement of CI test routines + +Pull request should comes from forks branches with a name specific to the contribution. For instance : + +.. code-block:: + + # branch name : + issue214 # to solve issue 214 + awsome_new_project # to add a new project + some_feature # to add a new feature (implementation, ...) + +.. + + :scroll: Favor the use of *short name* for branch, using *lower case* and eventuall underscores to ease readability. + + +Those changes should be compatible with the existing API (\ *i.e* not break it), and **avoid any change** in the current user interface. In particular, it should not modify default values for parameters or remove attributes of existing classes. But new attributes or parameters can be added with pre-set default values, and new classes can be added in the ``pySDC.implementations`` module. + +Release development branches +---------------------------- + +Branches with name starting with ``v[...]`` are developement branches for the next releases of ``pySDC`` (\ *e.g* ``v5``\ , ``v6``\ , ...). Those may introduce API-breaking changes (user interface, structure of core classes) that would force re-writing application scripts using ``pySDC`` (\ *e.g* tutorials, projects, ...). Contribution to those branches are done by core developpers, but anyone can also propose pull requests on those branches once the roadmap and milestones for the associated release has been written down in a dedicated issue. +Such branches are merged to ``master`` when ready. + +.. + + :scroll: Pull request to those branches can be done from fork branches using the **same name** as the release branche. + + +Feature development branches +---------------------------- + +Additional branches starting with the prefix ``dev/[...]`` can be used to add new features, that cannot be added with only one pull request (for instance, when several developpers work on it). +Those could eventually be merged into master if they don't break the API, or to the next release branch if they do. + +.. + + :scroll: Pull request to those branches can be done from fork branches using the **same name** as the feature branche. + + +`:arrow_left: Back to Contributing Summary <./../../CONTRIBUTING.rst>`_ --- +`:arrow_right: Next to Continuous Integration <./02_continuous_integration.rst>`_ diff --git a/docs/contrib/02_continuous_integration.md b/docs/contrib/02_continuous_integration.md deleted file mode 100644 index c8302f1492..0000000000 --- a/docs/contrib/02_continuous_integration.md +++ /dev/null @@ -1,51 +0,0 @@ -# Continuous Integration in pySDC - -Any commit in `pySDC` are tested within by GitHub continuous integration (CI). You can see in in the [action panel](https://github.com/Parallel-in-Time/pySDC/actions) the tests for each branches. -Those tests can be devided in two main categories : code linting and code testing. - -## Code linting - -Code style linting is performed using [`black`](https://black.readthedocs.io/en/stable/) and [`flakeheaven`](https://flakeheaven.readthedocs.io/en/latest/) for code synthax checking. In particular, `black` is used to check compliance with (most of) [PEP-8 guidelines](https://peps.python.org/pep-0008/). - -Those tests are conducted for each commit (even for forks), but you can also run it locally in the root folder of `pySDC` before pushing any commit : - -```bash -# Install required packages (works also with conda/mamba) -pip install black flakeheaven flake8-comprehensions flake8-bugbear -# First : test code style linting with black -black pySDC --check --diff --color -# Second : test code syntax with flakeheaven -flakeheaven lint --benchmark pySDC -``` - -> :bell: To avoid any error about formating (`black`), you can simply use this program to reformat directly your code using the command : -> -> ```bash -> black pySDC -> ``` - -Some style rules that are automatically enforced : - -- lines should be not longer than 120 characters -- arithmetic operators (`+`, `*`, ...) should be separated with variables by one empty space - -# Code testing - -This is done using[ `pytest`](https://docs.pytest.org/en/7.2.x/), and runs all the tests writen in the `pySDC/tests` folder. You can run those locally in the root folder of `pySDC` using : - -```bash -# Install required packages (works also with conda/mamba) -pip install pytest<7.2.0 pytest-benchmark coverage[toml] -# Run tests -pytest -v pySDC/tests -``` - -> :bell: Many components are tested (core, implementations, projects, tutorials, etc ...) which make the testing quite long. -> When working on a single part of the code, you can run only the corresponding part of the test by specifying the test path, for instance : -> -> ```bash -> pytest -v pySDC/tests/test_nodes.py # only test nodes generation -> ``` - -[:arrow_left: Back to Pull Request Recommendation](./01_pull_requests.md) --- -[:arrow_right: Next to Naming Conventions](./03_naming_conventions.md) \ No newline at end of file diff --git a/docs/contrib/02_continuous_integration.rst b/docs/contrib/02_continuous_integration.rst new file mode 100644 index 0000000000..fea54e90d2 --- /dev/null +++ b/docs/contrib/02_continuous_integration.rst @@ -0,0 +1,62 @@ + +Continuous Integration in pySDC +=============================== + +Any commit in ``pySDC`` are tested within by GitHub continuous integration (CI). You can see in in the `action panel `_ the tests for each branches. +Those tests can be devided in two main categories : code linting and code testing. + +Code linting +------------ + +Code style linting is performed using `\ ``black`` `_ and `\ ``flakeheaven`` `_ for code synthax checking. In particular, ``black`` is used to check compliance with (most of) `PEP-8 guidelines `_. + +Those tests are conducted for each commit (even for forks), but you can also run it locally in the root folder of ``pySDC`` before pushing any commit : + +.. code-block:: bash + + # Install required packages (works also with conda/mamba) + pip install black flakeheaven flake8-comprehensions flake8-bugbear + # First : test code style linting with black + black pySDC --check --diff --color + # Second : test code syntax with flakeheaven + flakeheaven lint --benchmark pySDC + +.. + + :bell: To avoid any error about formating (\ ``black``\ ), you can simply use this program to reformat directly your code using the command : + + .. code-block:: bash + + black pySDC + + +Some style rules that are automatically enforced : + + +* lines should be not longer than 120 characters +* arithmetic operators (\ ``+``\ , ``*``\ , ...) should be separated with variables by one empty space + +Code testing +============ + +This is done using\ ` ``pytest`` `_\ , and runs all the tests writen in the ``pySDC/tests`` folder. You can run those locally in the root folder of ``pySDC`` using : + +.. code-block:: bash + + # Install required packages (works also with conda/mamba) + pip install pytest<7.2.0 pytest-benchmark coverage[toml] + # Run tests + pytest -v pySDC/tests + +.. + + :bell: Many components are tested (core, implementations, projects, tutorials, etc ...) which make the testing quite long. + When working on a single part of the code, you can run only the corresponding part of the test by specifying the test path, for instance : + + .. code-block:: bash + + pytest -v pySDC/tests/test_nodes.py # only test nodes generation + + +`:arrow_left: Back to Pull Request Recommendation <./01_pull_requests.rst>`_ --- +`:arrow_right: Next to Naming Conventions <./03_naming_conventions.rst>`_ diff --git a/docs/contrib/03_naming_conventions.md b/docs/contrib/03_naming_conventions.md deleted file mode 100644 index 8d79b59d7c..0000000000 --- a/docs/contrib/03_naming_conventions.md +++ /dev/null @@ -1,85 +0,0 @@ -# Naming conventions in pySDC - -> :scroll: Those rules may not be enforced by the current implementation of pySDC. However, they should be enforced for any contribution. - -Naming convention are mostly inspired from the [PEP-8 guidelines](https://peps.python.org/pep-0008/), even if some of them may be different. Of course, strictly following those rules is not always the best solution, as Guido Von Rossum's key insight states : - -> _A Foolish Consistency is the Hobgoblin of Little Minds_ - -The most important idea at the end is to find a optimal compromise between - -- readability : _Can someone else easily read and understand my code ?_ -- effectiveness : _Does my code avoid kilometers-long lines to do simple things ?_ - -Both aspects are interdependant to ease maintaning/development of any code and improve its attractivity to potential users. - -## Packages and modules names - -Modules should have short, all-lowercase names. Underscores can be used in the module name if it improves readability. Python packages should also have short, all-lowercase names, although the use of underscores is discouraged. - -## Class names - -Class names should use PascalCase formating, for instance : - -```python -class AdvectionDiffusion(Problem): - pass -``` - -The shorter, the better. Also, exception class names should end with the suffix `Error`, for instance - -```python -class ParameterError(Exception): - pass -``` - -## Function and variables names - -Function (or method) and variable names should be lowercase, with words separated by underscores as necessary to improve readability. -Same goes for function arguments. For instance : - -```python -tleft = 1 -quad_type = 'LEGENDRE' - -def compute_fejer_rule(num_nodes): - # ... - -class NodeGenerator(): - def get_orthog_poly_coefficients(self, num_coeff): - # ... -``` - -> :bell: In general, shorter name should be favored, **as long as it does not deteriorate understandability**. For instance, using `get_orthog_poly_coeffs` rather than `get_orthogonal_polynomial_coefficients`. Acronyms can also be used, but with caution (for instance, `mssdc_jac` may not be very explicit for `multistep_sdc_jacobian`). - -## Private and public attributes - -There is no such thing as private or public attributes in Python. But some attributes, if uses only within the object method, can be indicated as private using the `_` prefix. For instance : - -```python -class ChuckNorris(): - - def __init__(self, param): - self.param = param - - def _think(self): - print('...') - - def act(self): - if self.param == 'doubt': - self._think() - print('*?%&$?*§"$*$*§#{*') -``` - -## Constants - -Constants are usually defined on a module level and written in all capital letters with underscores separating words. -Examples : - -```python -NODE_TYPES = ['EQUID', 'LEGENDRE', 'CHEBY-1', 'CHEBY-2', 'CHEBY-3', 'CHEBY-4'] -QUAD_TYPES = ['GAUSS', 'RADAU-LEFT', 'RADAU-RIGHT', 'LOBATTO'] -``` - -[:arrow_left: Back to Continuous Integration](./02_continuous_integration.md) --- -[:arrow_right: Next to Custom Implementations](./04_custom_implementations.md) \ No newline at end of file diff --git a/docs/contrib/03_naming_conventions.rst b/docs/contrib/03_naming_conventions.rst new file mode 100644 index 0000000000..b03f6140f6 --- /dev/null +++ b/docs/contrib/03_naming_conventions.rst @@ -0,0 +1,102 @@ + +Naming conventions in pySDC +=========================== + +.. + + :scroll: Those rules may not be enforced by the current implementation of pySDC. However, they should be enforced for any contribution. + + +Naming convention are mostly inspired from the `PEP-8 guidelines `_\ , even if some of them may be different. Of course, strictly following those rules is not always the best solution, as Guido Von Rossum's key insight states : + +.. + + *A Foolish Consistency is the Hobgoblin of Little Minds* + + +The most important idea at the end is to find a optimal compromise between + + +* readability : *Can someone else easily read and understand my code ?* +* effectiveness : *Does my code avoid kilometers-long lines to do simple things ?* + +Both aspects are interdependant to ease maintaning/development of any code and improve its attractivity to potential users. + +Packages and modules names +-------------------------- + +Modules should have short, all-lowercase names. Underscores can be used in the module name if it improves readability. Python packages should also have short, all-lowercase names, although the use of underscores is discouraged. + +Class names +----------- + +Class names should use PascalCase formating, for instance : + +.. code-block:: python + + class AdvectionDiffusion(Problem): + pass + +The shorter, the better. Also, exception class names should end with the suffix ``Error``\ , for instance + +.. code-block:: python + + class ParameterError(Exception): + pass + +Function and variables names +---------------------------- + +Function (or method) and variable names should be lowercase, with words separated by underscores as necessary to improve readability. +Same goes for function arguments. For instance : + +.. code-block:: python + + tleft = 1 + quad_type = 'LEGENDRE' + + def compute_fejer_rule(num_nodes): + # ... + + class NodeGenerator(): + def get_orthog_poly_coefficients(self, num_coeff): + # ... + +.. + + :bell: In general, shorter name should be favored, **as long as it does not deteriorate understandability**. For instance, using ``get_orthog_poly_coeffs`` rather than ``get_orthogonal_polynomial_coefficients``. Acronyms can also be used, but with caution (for instance, ``mssdc_jac`` may not be very explicit for ``multistep_sdc_jacobian``\ ). + + +Private and public attributes +----------------------------- + +There is no such thing as private or public attributes in Python. But some attributes, if uses only within the object method, can be indicated as private using the ``_`` prefix. For instance : + +.. code-block:: python + + class ChuckNorris(): + + def __init__(self, param): + self.param = param + + def _think(self): + print('...') + + def act(self): + if self.param == 'doubt': + self._think() + print('*?%&$?*§"$*$*§#{*') + +Constants +--------- + +Constants are usually defined on a module level and written in all capital letters with underscores separating words. +Examples : + +.. code-block:: python + + NODE_TYPES = ['EQUID', 'LEGENDRE', 'CHEBY-1', 'CHEBY-2', 'CHEBY-3', 'CHEBY-4'] + QUAD_TYPES = ['GAUSS', 'RADAU-LEFT', 'RADAU-RIGHT', 'LOBATTO'] + +`:arrow_left: Back to Continuous Integration <./02_continuous_integration.rst>`_ --- +`:arrow_right: Next to Custom Implementations <./04_custom_implementations.rst>`_ diff --git a/docs/contrib/04_custom_implementations.md b/docs/contrib/04_custom_implementations.md deleted file mode 100644 index 2dd71e0ffa..0000000000 --- a/docs/contrib/04_custom_implementations.md +++ /dev/null @@ -1,6 +0,0 @@ -# Custom implementation guidelines - -... in construction ... - -[:arrow_left: Back to Naming Conventions](./03_naming_conventions.md) --- -[:arrow_right: Next to a cute picture of cat](https://www.vecteezy.com/photo/2098203-silver-tabby-cat-sitting-on-green-background) \ No newline at end of file diff --git a/docs/contrib/04_custom_implementations.rst b/docs/contrib/04_custom_implementations.rst new file mode 100644 index 0000000000..8e9c31e0e8 --- /dev/null +++ b/docs/contrib/04_custom_implementations.rst @@ -0,0 +1,8 @@ + +Custom implementation guidelines +================================ + +... in construction ... + +`:arrow_left: Back to Naming Conventions <./03_naming_conventions.rst>`_ --- +`:arrow_right: Next to a cute picture of cat `_ From 53494142957ba0999d92b0227af6b513eb7c8ad9 Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Sun, 15 Jan 2023 23:36:19 +0100 Subject: [PATCH 05/21] TL: reverting to mardown files --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index bff2b14340..38c30cdd34 100644 --- a/README.rst +++ b/README.rst @@ -76,7 +76,7 @@ Contributing `pySDC` code was originaly developped by Robert Speck (@pancetta), and is now maintained and developed by a small community of scientists interested in SDC methods, that dearly welcomes any contribution. -If you want to take part of this, please take the time to read our `Contribution Guidelines <./CONTRIBUTING.rst>`_. +If you want to take part of this, please take the time to read our `Contribution Guidelines `. .. _contrib: @@ -92,4 +92,4 @@ The project also received help from the `Helmholtz Platform for Research Softwar .. |badge-ga| image:: https://github.com/Parallel-in-Time/pySDC/actions/workflows/ci_pipeline.yml/badge.svg :target: https://github.com/Parallel-in-Time/pySDC/actions/workflows/ci_pipeline.yml .. |badge-ossf| image:: https://bestpractices.coreinfrastructure.org/projects/6909/badge - :target: https://bestpractices.coreinfrastructure.org/projects/6909 + :target: https://bestpractices.coreinfrastructure.org/projects/6909 \ No newline at end of file From 075f2b5b47b4986afea58b71909acf4788cdbbfd Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Sun, 15 Jan 2023 23:38:55 +0100 Subject: [PATCH 06/21] TL: really reverting to markdown files --- .gitignore | 3 - CONTRIBUTING.rst | 27 ------ README.rst | 3 +- docs/contrib/01_pull_requests.md | 44 +++++++++ docs/contrib/01_pull_requests.rst | 58 ------------ docs/contrib/02_continuous_integration.md | 51 +++++++++++ docs/contrib/02_continuous_integration.rst | 62 ------------- docs/contrib/03_naming_conventions.md | 85 +++++++++++++++++ docs/contrib/03_naming_conventions.rst | 102 --------------------- docs/contrib/04_custom_implementations.md | 6 ++ docs/contrib/04_custom_implementations.rst | 8 -- 11 files changed, 187 insertions(+), 262 deletions(-) delete mode 100644 CONTRIBUTING.rst create mode 100644 docs/contrib/01_pull_requests.md delete mode 100644 docs/contrib/01_pull_requests.rst create mode 100644 docs/contrib/02_continuous_integration.md delete mode 100644 docs/contrib/02_continuous_integration.rst create mode 100644 docs/contrib/03_naming_conventions.md delete mode 100644 docs/contrib/03_naming_conventions.rst create mode 100644 docs/contrib/04_custom_implementations.md delete mode 100644 docs/contrib/04_custom_implementations.rst diff --git a/.gitignore b/.gitignore index 719ebdbb1b..632ce84ad8 100644 --- a/.gitignore +++ b/.gitignore @@ -152,6 +152,3 @@ Temporary Items # jupyter .ipynb_checkpoints - -# VSCode -.vscode diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst deleted file mode 100644 index 619ecee2b3..0000000000 --- a/CONTRIBUTING.rst +++ /dev/null @@ -1,27 +0,0 @@ - -How to contribute to pySDC -========================== - -#. `Pull Requestion recommendations <./docs/contrib/01_pull_requests.rst>`_ -#. `Continuous Integration <./docs/contrib/02_continuous_integration.rst>`_ -#. `Naming Conventions <./docs/contrib/03_naming_conventions.rst>`_ -#. `Custom Implementations <./docs/contrib/04_custom_implementations.rst>`_ - -Developments on the ``pySDC`` code use the classical approach of forks and pull requests from Github. -There is an `extended documentation `_ -on this aspect (that you can skip if you are already used to it). -In addition, some recommendations for pull requests are given -`here <./docs/contrib/01_pull_requests.rst>`_. - -Additionnaly, a *few* rules are set to enforce code readability, -consistency and reliability. Some of them are automatically tested with each commit, -and summarized in the page on `continuous integration (CI) <./docs/contrib/02_continuous_integration.rst>`_. -Others are specific conventions chosen for the pySDC library, -that may follow Python standards (or not ...), -detailed in the `naming conventions page <./docs/contrib/03_naming_conventions.rst>`_. - -Finally, while ``pySDC`` provides many base functionalities that implement classical -flavors of SDC, it also allows problem-specific applications through Object-Oriented -Programming (OOP) and the implementation of custom inherited classes. -This follows a specific OOP framework, for which more details are given -`here <.(docs/contrib/../../docs/contrib/04_custom_implementations.rst>`_\ ). diff --git a/README.rst b/README.rst index 38c30cdd34..0cb77bfdd4 100644 --- a/README.rst +++ b/README.rst @@ -76,9 +76,8 @@ Contributing `pySDC` code was originaly developped by Robert Speck (@pancetta), and is now maintained and developed by a small community of scientists interested in SDC methods, that dearly welcomes any contribution. -If you want to take part of this, please take the time to read our `Contribution Guidelines `. +If you want to take part of this, please take the time to read our `Contribution Guidelines `_. -.. _contrib: Acknowledgements ---------------- diff --git a/docs/contrib/01_pull_requests.md b/docs/contrib/01_pull_requests.md new file mode 100644 index 0000000000..a77168b8b9 --- /dev/null +++ b/docs/contrib/01_pull_requests.md @@ -0,0 +1,44 @@ +# Recommendations for pull requests + +Contributions on the `pySDC` code is expected to be done through pull requests from personal (public) forked repositories. A few core developpers can eventually push maintenance commits directly to the main repository. However (even for core developpers), it is highly recommended to add specific contribution trough dedicated merge requests from forks. + +## Contributing to the main branch + +The main version of `pySDC` is hosted in the `master` branch, on which any contributor can propose pull requests. Those can consist on : + +- bug fixes and code corrections (_e.g_ solving one of the current [issues](https://github.com/Parallel-in-Time/pySDC/issues)) +- addition or improvement of documentation +- improvement of existing functionalities (performance, accuracy, usage, ...) +- addition of new functionnalities and applications +- improvement of CI test routines + +Pull request should comes from forks branches with a name specific to the contribution. For instance : + +``` +# branch name : +issue214 # to solve issue 214 +awsome_new_project # to add a new project +some_feature # to add a new feature (implementation, ...) +``` + +> :scroll: Favor the use of _short name_ for branch, using _lower case_ and eventuall underscores to ease readability. + +Those changes should be compatible with the existing API (_i.e_ not break it), and **avoid any change** in the current user interface. In particular, it should not modify default values for parameters or remove attributes of existing classes. But new attributes or parameters can be added with pre-set default values, and new classes can be added in the `pySDC.implementations` module. + + +## Release development branches + +Branches with name starting with `v[...]` are developement branches for the next releases of `pySDC` (_e.g_ `v5`, `v6`, ...). Those may introduce API-breaking changes (user interface, structure of core classes) that would force re-writing application scripts using `pySDC` (_e.g_ tutorials, projects, ...). Contribution to those branches are done by core developpers, but anyone can also propose pull requests on those branches once the roadmap and milestones for the associated release has been written down in a dedicated issue. +Such branches are merged to `master` when ready. + +> :scroll: Pull request to those branches can be done from fork branches using the **same name** as the release branche. + +## Feature development branches + +Additional branches starting with the prefix `dev/[...]` can be used to add new features, that cannot be added with only one pull request (for instance, when several developpers work on it). +Those could eventually be merged into master if they don't break the API, or to the next release branch if they do. + +> :scroll: Pull request to those branches can be done from fork branches using the **same name** as the feature branche. + +[:arrow_left: Back to Contributing Summary](./../../CONTRIBUTING.md) --- +[:arrow_right: Next to Continuous Integration](./02_continuous_integration.md) \ No newline at end of file diff --git a/docs/contrib/01_pull_requests.rst b/docs/contrib/01_pull_requests.rst deleted file mode 100644 index d3ec7cac18..0000000000 --- a/docs/contrib/01_pull_requests.rst +++ /dev/null @@ -1,58 +0,0 @@ - -Recommendations for pull requests -================================= - -Contributions on the ``pySDC`` code is expected to be done through pull requests from personal (public) forked repositories. A few core developpers can eventually push maintenance commits directly to the main repository. However (even for core developpers), it is highly recommended to add specific contribution trough dedicated merge requests from forks. - -Contributing to the main branch -------------------------------- - -The main version of ``pySDC`` is hosted in the ``master`` branch, on which any contributor can propose pull requests. Those can consist on : - - -* bug fixes and code corrections (\ *e.g* solving one of the current `issues `_\ ) -* addition or improvement of documentation -* improvement of existing functionalities (performance, accuracy, usage, ...) -* addition of new functionnalities and applications -* improvement of CI test routines - -Pull request should comes from forks branches with a name specific to the contribution. For instance : - -.. code-block:: - - # branch name : - issue214 # to solve issue 214 - awsome_new_project # to add a new project - some_feature # to add a new feature (implementation, ...) - -.. - - :scroll: Favor the use of *short name* for branch, using *lower case* and eventuall underscores to ease readability. - - -Those changes should be compatible with the existing API (\ *i.e* not break it), and **avoid any change** in the current user interface. In particular, it should not modify default values for parameters or remove attributes of existing classes. But new attributes or parameters can be added with pre-set default values, and new classes can be added in the ``pySDC.implementations`` module. - -Release development branches ----------------------------- - -Branches with name starting with ``v[...]`` are developement branches for the next releases of ``pySDC`` (\ *e.g* ``v5``\ , ``v6``\ , ...). Those may introduce API-breaking changes (user interface, structure of core classes) that would force re-writing application scripts using ``pySDC`` (\ *e.g* tutorials, projects, ...). Contribution to those branches are done by core developpers, but anyone can also propose pull requests on those branches once the roadmap and milestones for the associated release has been written down in a dedicated issue. -Such branches are merged to ``master`` when ready. - -.. - - :scroll: Pull request to those branches can be done from fork branches using the **same name** as the release branche. - - -Feature development branches ----------------------------- - -Additional branches starting with the prefix ``dev/[...]`` can be used to add new features, that cannot be added with only one pull request (for instance, when several developpers work on it). -Those could eventually be merged into master if they don't break the API, or to the next release branch if they do. - -.. - - :scroll: Pull request to those branches can be done from fork branches using the **same name** as the feature branche. - - -`:arrow_left: Back to Contributing Summary <./../../CONTRIBUTING.rst>`_ --- -`:arrow_right: Next to Continuous Integration <./02_continuous_integration.rst>`_ diff --git a/docs/contrib/02_continuous_integration.md b/docs/contrib/02_continuous_integration.md new file mode 100644 index 0000000000..c8302f1492 --- /dev/null +++ b/docs/contrib/02_continuous_integration.md @@ -0,0 +1,51 @@ +# Continuous Integration in pySDC + +Any commit in `pySDC` are tested within by GitHub continuous integration (CI). You can see in in the [action panel](https://github.com/Parallel-in-Time/pySDC/actions) the tests for each branches. +Those tests can be devided in two main categories : code linting and code testing. + +## Code linting + +Code style linting is performed using [`black`](https://black.readthedocs.io/en/stable/) and [`flakeheaven`](https://flakeheaven.readthedocs.io/en/latest/) for code synthax checking. In particular, `black` is used to check compliance with (most of) [PEP-8 guidelines](https://peps.python.org/pep-0008/). + +Those tests are conducted for each commit (even for forks), but you can also run it locally in the root folder of `pySDC` before pushing any commit : + +```bash +# Install required packages (works also with conda/mamba) +pip install black flakeheaven flake8-comprehensions flake8-bugbear +# First : test code style linting with black +black pySDC --check --diff --color +# Second : test code syntax with flakeheaven +flakeheaven lint --benchmark pySDC +``` + +> :bell: To avoid any error about formating (`black`), you can simply use this program to reformat directly your code using the command : +> +> ```bash +> black pySDC +> ``` + +Some style rules that are automatically enforced : + +- lines should be not longer than 120 characters +- arithmetic operators (`+`, `*`, ...) should be separated with variables by one empty space + +# Code testing + +This is done using[ `pytest`](https://docs.pytest.org/en/7.2.x/), and runs all the tests writen in the `pySDC/tests` folder. You can run those locally in the root folder of `pySDC` using : + +```bash +# Install required packages (works also with conda/mamba) +pip install pytest<7.2.0 pytest-benchmark coverage[toml] +# Run tests +pytest -v pySDC/tests +``` + +> :bell: Many components are tested (core, implementations, projects, tutorials, etc ...) which make the testing quite long. +> When working on a single part of the code, you can run only the corresponding part of the test by specifying the test path, for instance : +> +> ```bash +> pytest -v pySDC/tests/test_nodes.py # only test nodes generation +> ``` + +[:arrow_left: Back to Pull Request Recommendation](./01_pull_requests.md) --- +[:arrow_right: Next to Naming Conventions](./03_naming_conventions.md) \ No newline at end of file diff --git a/docs/contrib/02_continuous_integration.rst b/docs/contrib/02_continuous_integration.rst deleted file mode 100644 index fea54e90d2..0000000000 --- a/docs/contrib/02_continuous_integration.rst +++ /dev/null @@ -1,62 +0,0 @@ - -Continuous Integration in pySDC -=============================== - -Any commit in ``pySDC`` are tested within by GitHub continuous integration (CI). You can see in in the `action panel `_ the tests for each branches. -Those tests can be devided in two main categories : code linting and code testing. - -Code linting ------------- - -Code style linting is performed using `\ ``black`` `_ and `\ ``flakeheaven`` `_ for code synthax checking. In particular, ``black`` is used to check compliance with (most of) `PEP-8 guidelines `_. - -Those tests are conducted for each commit (even for forks), but you can also run it locally in the root folder of ``pySDC`` before pushing any commit : - -.. code-block:: bash - - # Install required packages (works also with conda/mamba) - pip install black flakeheaven flake8-comprehensions flake8-bugbear - # First : test code style linting with black - black pySDC --check --diff --color - # Second : test code syntax with flakeheaven - flakeheaven lint --benchmark pySDC - -.. - - :bell: To avoid any error about formating (\ ``black``\ ), you can simply use this program to reformat directly your code using the command : - - .. code-block:: bash - - black pySDC - - -Some style rules that are automatically enforced : - - -* lines should be not longer than 120 characters -* arithmetic operators (\ ``+``\ , ``*``\ , ...) should be separated with variables by one empty space - -Code testing -============ - -This is done using\ ` ``pytest`` `_\ , and runs all the tests writen in the ``pySDC/tests`` folder. You can run those locally in the root folder of ``pySDC`` using : - -.. code-block:: bash - - # Install required packages (works also with conda/mamba) - pip install pytest<7.2.0 pytest-benchmark coverage[toml] - # Run tests - pytest -v pySDC/tests - -.. - - :bell: Many components are tested (core, implementations, projects, tutorials, etc ...) which make the testing quite long. - When working on a single part of the code, you can run only the corresponding part of the test by specifying the test path, for instance : - - .. code-block:: bash - - pytest -v pySDC/tests/test_nodes.py # only test nodes generation - - -`:arrow_left: Back to Pull Request Recommendation <./01_pull_requests.rst>`_ --- -`:arrow_right: Next to Naming Conventions <./03_naming_conventions.rst>`_ diff --git a/docs/contrib/03_naming_conventions.md b/docs/contrib/03_naming_conventions.md new file mode 100644 index 0000000000..8d79b59d7c --- /dev/null +++ b/docs/contrib/03_naming_conventions.md @@ -0,0 +1,85 @@ +# Naming conventions in pySDC + +> :scroll: Those rules may not be enforced by the current implementation of pySDC. However, they should be enforced for any contribution. + +Naming convention are mostly inspired from the [PEP-8 guidelines](https://peps.python.org/pep-0008/), even if some of them may be different. Of course, strictly following those rules is not always the best solution, as Guido Von Rossum's key insight states : + +> _A Foolish Consistency is the Hobgoblin of Little Minds_ + +The most important idea at the end is to find a optimal compromise between + +- readability : _Can someone else easily read and understand my code ?_ +- effectiveness : _Does my code avoid kilometers-long lines to do simple things ?_ + +Both aspects are interdependant to ease maintaning/development of any code and improve its attractivity to potential users. + +## Packages and modules names + +Modules should have short, all-lowercase names. Underscores can be used in the module name if it improves readability. Python packages should also have short, all-lowercase names, although the use of underscores is discouraged. + +## Class names + +Class names should use PascalCase formating, for instance : + +```python +class AdvectionDiffusion(Problem): + pass +``` + +The shorter, the better. Also, exception class names should end with the suffix `Error`, for instance + +```python +class ParameterError(Exception): + pass +``` + +## Function and variables names + +Function (or method) and variable names should be lowercase, with words separated by underscores as necessary to improve readability. +Same goes for function arguments. For instance : + +```python +tleft = 1 +quad_type = 'LEGENDRE' + +def compute_fejer_rule(num_nodes): + # ... + +class NodeGenerator(): + def get_orthog_poly_coefficients(self, num_coeff): + # ... +``` + +> :bell: In general, shorter name should be favored, **as long as it does not deteriorate understandability**. For instance, using `get_orthog_poly_coeffs` rather than `get_orthogonal_polynomial_coefficients`. Acronyms can also be used, but with caution (for instance, `mssdc_jac` may not be very explicit for `multistep_sdc_jacobian`). + +## Private and public attributes + +There is no such thing as private or public attributes in Python. But some attributes, if uses only within the object method, can be indicated as private using the `_` prefix. For instance : + +```python +class ChuckNorris(): + + def __init__(self, param): + self.param = param + + def _think(self): + print('...') + + def act(self): + if self.param == 'doubt': + self._think() + print('*?%&$?*§"$*$*§#{*') +``` + +## Constants + +Constants are usually defined on a module level and written in all capital letters with underscores separating words. +Examples : + +```python +NODE_TYPES = ['EQUID', 'LEGENDRE', 'CHEBY-1', 'CHEBY-2', 'CHEBY-3', 'CHEBY-4'] +QUAD_TYPES = ['GAUSS', 'RADAU-LEFT', 'RADAU-RIGHT', 'LOBATTO'] +``` + +[:arrow_left: Back to Continuous Integration](./02_continuous_integration.md) --- +[:arrow_right: Next to Custom Implementations](./04_custom_implementations.md) \ No newline at end of file diff --git a/docs/contrib/03_naming_conventions.rst b/docs/contrib/03_naming_conventions.rst deleted file mode 100644 index b03f6140f6..0000000000 --- a/docs/contrib/03_naming_conventions.rst +++ /dev/null @@ -1,102 +0,0 @@ - -Naming conventions in pySDC -=========================== - -.. - - :scroll: Those rules may not be enforced by the current implementation of pySDC. However, they should be enforced for any contribution. - - -Naming convention are mostly inspired from the `PEP-8 guidelines `_\ , even if some of them may be different. Of course, strictly following those rules is not always the best solution, as Guido Von Rossum's key insight states : - -.. - - *A Foolish Consistency is the Hobgoblin of Little Minds* - - -The most important idea at the end is to find a optimal compromise between - - -* readability : *Can someone else easily read and understand my code ?* -* effectiveness : *Does my code avoid kilometers-long lines to do simple things ?* - -Both aspects are interdependant to ease maintaning/development of any code and improve its attractivity to potential users. - -Packages and modules names --------------------------- - -Modules should have short, all-lowercase names. Underscores can be used in the module name if it improves readability. Python packages should also have short, all-lowercase names, although the use of underscores is discouraged. - -Class names ------------ - -Class names should use PascalCase formating, for instance : - -.. code-block:: python - - class AdvectionDiffusion(Problem): - pass - -The shorter, the better. Also, exception class names should end with the suffix ``Error``\ , for instance - -.. code-block:: python - - class ParameterError(Exception): - pass - -Function and variables names ----------------------------- - -Function (or method) and variable names should be lowercase, with words separated by underscores as necessary to improve readability. -Same goes for function arguments. For instance : - -.. code-block:: python - - tleft = 1 - quad_type = 'LEGENDRE' - - def compute_fejer_rule(num_nodes): - # ... - - class NodeGenerator(): - def get_orthog_poly_coefficients(self, num_coeff): - # ... - -.. - - :bell: In general, shorter name should be favored, **as long as it does not deteriorate understandability**. For instance, using ``get_orthog_poly_coeffs`` rather than ``get_orthogonal_polynomial_coefficients``. Acronyms can also be used, but with caution (for instance, ``mssdc_jac`` may not be very explicit for ``multistep_sdc_jacobian``\ ). - - -Private and public attributes ------------------------------ - -There is no such thing as private or public attributes in Python. But some attributes, if uses only within the object method, can be indicated as private using the ``_`` prefix. For instance : - -.. code-block:: python - - class ChuckNorris(): - - def __init__(self, param): - self.param = param - - def _think(self): - print('...') - - def act(self): - if self.param == 'doubt': - self._think() - print('*?%&$?*§"$*$*§#{*') - -Constants ---------- - -Constants are usually defined on a module level and written in all capital letters with underscores separating words. -Examples : - -.. code-block:: python - - NODE_TYPES = ['EQUID', 'LEGENDRE', 'CHEBY-1', 'CHEBY-2', 'CHEBY-3', 'CHEBY-4'] - QUAD_TYPES = ['GAUSS', 'RADAU-LEFT', 'RADAU-RIGHT', 'LOBATTO'] - -`:arrow_left: Back to Continuous Integration <./02_continuous_integration.rst>`_ --- -`:arrow_right: Next to Custom Implementations <./04_custom_implementations.rst>`_ diff --git a/docs/contrib/04_custom_implementations.md b/docs/contrib/04_custom_implementations.md new file mode 100644 index 0000000000..2dd71e0ffa --- /dev/null +++ b/docs/contrib/04_custom_implementations.md @@ -0,0 +1,6 @@ +# Custom implementation guidelines + +... in construction ... + +[:arrow_left: Back to Naming Conventions](./03_naming_conventions.md) --- +[:arrow_right: Next to a cute picture of cat](https://www.vecteezy.com/photo/2098203-silver-tabby-cat-sitting-on-green-background) \ No newline at end of file diff --git a/docs/contrib/04_custom_implementations.rst b/docs/contrib/04_custom_implementations.rst deleted file mode 100644 index 8e9c31e0e8..0000000000 --- a/docs/contrib/04_custom_implementations.rst +++ /dev/null @@ -1,8 +0,0 @@ - -Custom implementation guidelines -================================ - -... in construction ... - -`:arrow_left: Back to Naming Conventions <./03_naming_conventions.rst>`_ --- -`:arrow_right: Next to a cute picture of cat `_ From 5bba7d12916e585c54ea056267a977180f02aff4 Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Sun, 15 Jan 2023 23:40:57 +0100 Subject: [PATCH 07/21] TL: trying the lazy approach --- .gitignore | 3 +++ README.rst | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 632ce84ad8..719ebdbb1b 100644 --- a/.gitignore +++ b/.gitignore @@ -152,3 +152,6 @@ Temporary Items # jupyter .ipynb_checkpoints + +# VSCode +.vscode diff --git a/README.rst b/README.rst index 0cb77bfdd4..f7464c00f0 100644 --- a/README.rst +++ b/README.rst @@ -76,7 +76,7 @@ Contributing `pySDC` code was originaly developped by Robert Speck (@pancetta), and is now maintained and developed by a small community of scientists interested in SDC methods, that dearly welcomes any contribution. -If you want to take part of this, please take the time to read our `Contribution Guidelines `_. +If you want to take part of this, please take the time to read our `Contribution Guidelines `_. Acknowledgements From fdd0aad0c02e93aa6ae339c9ee6fa54f74e70ce2 Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Mon, 16 Jan 2023 10:54:53 +0100 Subject: [PATCH 08/21] TL: spell checks --- CONTRIBUTING.md | 4 ++-- docs/contrib/01_pull_requests.md | 16 ++++++++-------- docs/contrib/02_continuous_integration.md | 8 ++++---- docs/contrib/03_naming_conventions.md | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 376e38cb3d..4775d2298d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # How to contribute to pySDC -1. [Pull Requestion recommendations](./docs/contrib/01_pull_requests.md) +1. [Pull Requests Recommendations](./docs/contrib/01_pull_requests.md) 2. [Continuous Integration](./docs/contrib/02_continuous_integration.md) 3. [Naming Conventions](./docs/contrib/03_naming_conventions.md) 4. [Custom Implementations](./docs/contrib/04_custom_implementations.md) @@ -8,7 +8,7 @@ Developments on the `pySDC` code use the classical approach of forks and pull requests from Github. There is an [extended documentation](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/getting-started/about-collaborative-development-models) on this aspect (that you can skip if you are already used to it). In addition, some recommendations for pull requests are given [here](./docs/contrib/01_pull_requests.md). -Additionnaly, a _few_ rules are set to enforce code readability, consistency and reliability. Some of them are automatically tested with each commit, and summarized in the page on [continuous integration (CI)](./docs/contrib/02_continuous_integration.md). +Additionally, a _few_ rules are set to enforce code readability, consistency and reliability. Some of them are automatically tested with each commit, and summarized in the page on [continuous integration (CI)](./docs/contrib/02_continuous_integration.md). Others are specific conventions chosen for the pySDC library, that may follow Python standards (or not ...), detailed in the [naming conventions page](./docs/contrib/03_naming_conventions.md). Finally, while `pySDC` provides many base functionalities that implement classical flavors of SDC, it also allows problem-specific applications through Object-Oriented Programming (OOP) and the implementation of custom inherited classes. diff --git a/docs/contrib/01_pull_requests.md b/docs/contrib/01_pull_requests.md index a77168b8b9..2886a138fb 100644 --- a/docs/contrib/01_pull_requests.md +++ b/docs/contrib/01_pull_requests.md @@ -1,6 +1,6 @@ # Recommendations for pull requests -Contributions on the `pySDC` code is expected to be done through pull requests from personal (public) forked repositories. A few core developpers can eventually push maintenance commits directly to the main repository. However (even for core developpers), it is highly recommended to add specific contribution trough dedicated merge requests from forks. +Contributions on the `pySDC` code is expected to be done through pull requests from personal (public) forked repositories. A few core developers can eventually push maintenance commits directly to the main repository. However (even for core developers), it is highly recommended to add specific contribution trough dedicated merge requests from forks. ## Contributing to the main branch @@ -9,7 +9,7 @@ The main version of `pySDC` is hosted in the `master` branch, on which any contr - bug fixes and code corrections (_e.g_ solving one of the current [issues](https://github.com/Parallel-in-Time/pySDC/issues)) - addition or improvement of documentation - improvement of existing functionalities (performance, accuracy, usage, ...) -- addition of new functionnalities and applications +- addition of new functionalities and applications - improvement of CI test routines Pull request should comes from forks branches with a name specific to the contribution. For instance : @@ -17,28 +17,28 @@ Pull request should comes from forks branches with a name specific to the contri ``` # branch name : issue214 # to solve issue 214 -awsome_new_project # to add a new project +awesome_new_project # to add a new project some_feature # to add a new feature (implementation, ...) ``` -> :scroll: Favor the use of _short name_ for branch, using _lower case_ and eventuall underscores to ease readability. +> :scroll: Favor the use of _short name_ for branch, using _lower case_ and eventually underscores to ease readability. Those changes should be compatible with the existing API (_i.e_ not break it), and **avoid any change** in the current user interface. In particular, it should not modify default values for parameters or remove attributes of existing classes. But new attributes or parameters can be added with pre-set default values, and new classes can be added in the `pySDC.implementations` module. ## Release development branches -Branches with name starting with `v[...]` are developement branches for the next releases of `pySDC` (_e.g_ `v5`, `v6`, ...). Those may introduce API-breaking changes (user interface, structure of core classes) that would force re-writing application scripts using `pySDC` (_e.g_ tutorials, projects, ...). Contribution to those branches are done by core developpers, but anyone can also propose pull requests on those branches once the roadmap and milestones for the associated release has been written down in a dedicated issue. +Branches with name starting with `v[...]` are development branches for the next releases of `pySDC` (_e.g_ `v5`, `v6`, ...). Those may introduce API-breaking changes (user interface, structure of core classes) that would force re-writing application scripts using `pySDC` (_e.g_ tutorials, projects, ...). Contribution to those branches are done by core developers, but anyone can also propose pull requests on those branches once the roadmap and milestones for the associated release has been written down in a dedicated issue. Such branches are merged to `master` when ready. -> :scroll: Pull request to those branches can be done from fork branches using the **same name** as the release branche. +> :scroll: Pull request to those branches can be done from fork branches using the **same name** as the release branch. ## Feature development branches -Additional branches starting with the prefix `dev/[...]` can be used to add new features, that cannot be added with only one pull request (for instance, when several developpers work on it). +Additional branches starting with the prefix `dev/[...]` can be used to add new features, that cannot be added with only one pull request (for instance, when several developers work on it). Those could eventually be merged into master if they don't break the API, or to the next release branch if they do. -> :scroll: Pull request to those branches can be done from fork branches using the **same name** as the feature branche. +> :scroll: Pull request to those branches can be done from fork branches using the **same name** as the feature branch. [:arrow_left: Back to Contributing Summary](./../../CONTRIBUTING.md) --- [:arrow_right: Next to Continuous Integration](./02_continuous_integration.md) \ No newline at end of file diff --git a/docs/contrib/02_continuous_integration.md b/docs/contrib/02_continuous_integration.md index c8302f1492..ec0841ae99 100644 --- a/docs/contrib/02_continuous_integration.md +++ b/docs/contrib/02_continuous_integration.md @@ -1,11 +1,11 @@ # Continuous Integration in pySDC Any commit in `pySDC` are tested within by GitHub continuous integration (CI). You can see in in the [action panel](https://github.com/Parallel-in-Time/pySDC/actions) the tests for each branches. -Those tests can be devided in two main categories : code linting and code testing. +Those tests can be divided in two main categories : code linting and code testing. ## Code linting -Code style linting is performed using [`black`](https://black.readthedocs.io/en/stable/) and [`flakeheaven`](https://flakeheaven.readthedocs.io/en/latest/) for code synthax checking. In particular, `black` is used to check compliance with (most of) [PEP-8 guidelines](https://peps.python.org/pep-0008/). +Code style linting is performed using [`black`](https://black.readthedocs.io/en/stable/) and [`flakeheaven`](https://flakeheaven.readthedocs.io/en/latest/) for code syntax checking. In particular, `black` is used to check compliance with (most of) [PEP-8 guidelines](https://peps.python.org/pep-0008/). Those tests are conducted for each commit (even for forks), but you can also run it locally in the root folder of `pySDC` before pushing any commit : @@ -18,7 +18,7 @@ black pySDC --check --diff --color flakeheaven lint --benchmark pySDC ``` -> :bell: To avoid any error about formating (`black`), you can simply use this program to reformat directly your code using the command : +> :bell: To avoid any error about formatting (`black`), you can simply use this program to reformat directly your code using the command : > > ```bash > black pySDC @@ -31,7 +31,7 @@ Some style rules that are automatically enforced : # Code testing -This is done using[ `pytest`](https://docs.pytest.org/en/7.2.x/), and runs all the tests writen in the `pySDC/tests` folder. You can run those locally in the root folder of `pySDC` using : +This is done using[ `pytest`](https://docs.pytest.org/en/7.2.x/), and runs all the tests written in the `pySDC/tests` folder. You can run those locally in the root folder of `pySDC` using : ```bash # Install required packages (works also with conda/mamba) diff --git a/docs/contrib/03_naming_conventions.md b/docs/contrib/03_naming_conventions.md index 8d79b59d7c..9b947cf388 100644 --- a/docs/contrib/03_naming_conventions.md +++ b/docs/contrib/03_naming_conventions.md @@ -11,7 +11,7 @@ The most important idea at the end is to find a optimal compromise between - readability : _Can someone else easily read and understand my code ?_ - effectiveness : _Does my code avoid kilometers-long lines to do simple things ?_ -Both aspects are interdependant to ease maintaning/development of any code and improve its attractivity to potential users. +Both aspects are interdependent to ease maintaining/development of any code and improve its attractiveness to potential users. ## Packages and modules names @@ -19,7 +19,7 @@ Modules should have short, all-lowercase names. Underscores can be used in the m ## Class names -Class names should use PascalCase formating, for instance : +Class names should use PascalCase formatting, for instance : ```python class AdvectionDiffusion(Problem): From 98ec63092fc3ed5f3be8fe706441f3fc586d249c Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Mon, 16 Jan 2023 12:36:42 +0100 Subject: [PATCH 09/21] TL: switch to camelCase in naming conventions for variables and functions --- docs/contrib/03_naming_conventions.md | 78 +++++++++++++++++++++++---- 1 file changed, 67 insertions(+), 11 deletions(-) diff --git a/docs/contrib/03_naming_conventions.md b/docs/contrib/03_naming_conventions.md index 9b947cf388..5b5bcd4b32 100644 --- a/docs/contrib/03_naming_conventions.md +++ b/docs/contrib/03_naming_conventions.md @@ -13,9 +13,22 @@ The most important idea at the end is to find a optimal compromise between Both aspects are interdependent to ease maintaining/development of any code and improve its attractiveness to potential users. +## First definitions + +Possible Naming formats : + +- all-lowercase : `variablenamelikethis` +- snake_case : `variable_name_like_this` +- PascalCase : `VariableNameLikeThis` +- camelCase : `variableNameLikeThis` +- all-uppercase with underscore : `VARIABLE_NAME_LIKE_THIS` +- all-uppercase with minus : `VARIABLE-NAME-LIKE-THIS` + ## Packages and modules names -Modules should have short, all-lowercase names. Underscores can be used in the module name if it improves readability. Python packages should also have short, all-lowercase names, although the use of underscores is discouraged. +Modules should have short, all-lowercase names. Underscores can be used in the module name if it improves readability (_i.e_ use snake_case only if it helps, +else try to stick to all-lowercase). +Python packages should also have short, all-lowercase names, although the use of underscores is discouraged. ## Class names @@ -35,26 +48,48 @@ class ParameterError(Exception): ## Function and variables names -Function (or method) and variable names should be lowercase, with words separated by underscores as necessary to improve readability. -Same goes for function arguments. For instance : +Function (or method) and variable names should use camelCase formatting, and same goes for function arguments. For instance : ```python -tleft = 1 -quad_type = 'LEGENDRE' +tLeft = 1 +quadType = 'LEGENDRE' -def compute_fejer_rule(num_nodes): +def computeFejerRule(nNodes): # ... class NodeGenerator(): - def get_orthog_poly_coefficients(self, num_coeff): + def getOrthogPolyCoeffs(self, nCoeffs): # ... ``` -> :bell: In general, shorter name should be favored, **as long as it does not deteriorate understandability**. For instance, using `get_orthog_poly_coeffs` rather than `get_orthogonal_polynomial_coefficients`. Acronyms can also be used, but with caution (for instance, `mssdc_jac` may not be very explicit for `multistep_sdc_jacobian`). +:scroll: A few additional notes : + +1. In general, shorter name (eventually with abbreviations) should be favored, **as long as it does not deteriorate understandability**. For instance `getOrthogPolyCoeffs` rather than `getOrthogonalPolynomialCoefficients`. +2. Suffix `s` for plural should be used even with abbreviations for consistency (_e.g_ `nCoeffs`, `nNodes`, ...). +3. Acronyms can be used to simplify variable names, but **try not to start with it**. For instance, favor `jacobiMSSDC` or `multiStepSDCJacobi` rather than `MSSDCJacobi`. In general, acronyms should be put at the end of variable names. +4. Underscore can exceptionally be used at the end of variable names when it make readability better and ease further developments. In that case, the characters after the underscore **should be all-uppercase with underscore** (minus is not allowed by Python syntax). For instance when defining the same method with different specializations : + +```python +class MySweeper(Sweeper): + + def __init__(self, initSweep): + try: + self.initSweep = getattr(self, f'_initSweep_{initSweep}') + except AttributeError: + raise NotImplementedError(f'initSweep={initSweep}') + + def _initSweep_COPY(self): + pass + + def _initSweep_SPREAD(self): + pass + + # ... other implementations for initSweep +``` ## Private and public attributes -There is no such thing as private or public attributes in Python. But some attributes, if uses only within the object method, can be indicated as private using the `_` prefix. For instance : +There is no such thing as private or public attributes in Python. But some attributes, if uses only within the object methods, can be indicated as private using the `_` prefix. For instance : ```python class ChuckNorris(): @@ -73,13 +108,34 @@ class ChuckNorris(): ## Constants -Constants are usually defined on a module level and written in all capital letters with underscores separating words. -Examples : +Constants are usually defined on a module level and written in all-uppercase with underscores (all-uppercase with minus are not allowed by Python syntax). Examples : ```python NODE_TYPES = ['EQUID', 'LEGENDRE', 'CHEBY-1', 'CHEBY-2', 'CHEBY-3', 'CHEBY-4'] QUAD_TYPES = ['GAUSS', 'RADAU-LEFT', 'RADAU-RIGHT', 'LOBATTO'] ``` +For _constant string values_, however, favor the use of all uppercase with minus, _e.g_ `RADAU-RIGHT`, `LEGENDRE-NUMPY` to distinguish those from constants names. + +:bell: When constants are used, for instance, to select method specializations (with suffix using all-uppercase with underscore), it is probably better to keep all-uppercase with minus for constant string values and add a character replacement in between, for instance : + +```python +class MySweeper(Sweeper): + + def __init__(self, initSweep): + try: + self.initSweep = getattr(self, f'_initSweep_{initSweep.replace('-','_')}') + except AttributeError: + raise NotImplementedError(f'initSweep={initSweep}') + + def _initSweep_COPY_PASTE(self): + pass + + def _initSweep_SPREAD_OUT(self): + pass + + # ... other implementations for initSweep +``` + [:arrow_left: Back to Continuous Integration](./02_continuous_integration.md) --- [:arrow_right: Next to Custom Implementations](./04_custom_implementations.md) \ No newline at end of file From c39d836861b120dbc05bcdee66e14990f6d2c81b Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Mon, 16 Jan 2023 18:00:12 +0100 Subject: [PATCH 10/21] TL: minor detail to naming convention --- docs/contrib/03_naming_conventions.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/contrib/03_naming_conventions.md b/docs/contrib/03_naming_conventions.md index 5b5bcd4b32..f3de762206 100644 --- a/docs/contrib/03_naming_conventions.md +++ b/docs/contrib/03_naming_conventions.md @@ -106,6 +106,8 @@ class ChuckNorris(): print('*?%&$?*§"$*$*§#{*') ``` +:scroll: In general, variable name starting with double underscore `__` are usually left for Python built-in names, _e.g_ `__dict__`, `__init__`, ... + ## Constants Constants are usually defined on a module level and written in all-uppercase with underscores (all-uppercase with minus are not allowed by Python syntax). Examples : From f0024e6d8295f4c39749c662b405888d53fca3ff Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Mon, 16 Jan 2023 20:57:18 +0100 Subject: [PATCH 11/21] TL: learning from my mistakes --- docs/contrib/01_pull_requests.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/contrib/01_pull_requests.md b/docs/contrib/01_pull_requests.md index 2886a138fb..e63e4624d4 100644 --- a/docs/contrib/01_pull_requests.md +++ b/docs/contrib/01_pull_requests.md @@ -25,6 +25,17 @@ some_feature # to add a new feature (implementation, ...) Those changes should be compatible with the existing API (_i.e_ not break it), and **avoid any change** in the current user interface. In particular, it should not modify default values for parameters or remove attributes of existing classes. But new attributes or parameters can be added with pre-set default values, and new classes can be added in the `pySDC.implementations` module. +> :bell: During the revision of your pull request, it can happen that additional changes are done to the `upstream/master` branch (in parallel-in-time/pySDC repo). In that case, don't hesitate to regularly merge the it into your local branch to solve eventual conflicts, for instance : +> +> ```bash +> # On your local repo, with the "my_feature" branch +> $ git fetch upstream # synchronize with parallel-in-time/pySDC +> $ git merge upstream/master # merge into my_feature +> $ git push # push local merges to your repository +> ``` +> +> The pull request will be updated with any merge changes on the `my_feature` branch of your repository. + ## Release development branches @@ -33,6 +44,8 @@ Such branches are merged to `master` when ready. > :scroll: Pull request to those branches can be done from fork branches using the **same name** as the release branch. +> :bell: **Never** merge modifications on the `upstream/master` branch into your own local release branch. If some commit on the master branch have to be taken into account in the release branch (for instance, v6), then first request a merge of `upstream/master` into `upstream/v6`, merge `upstream/v6` into your local `v6` branch, then push into your own repository to update the pull request. + ## Feature development branches Additional branches starting with the prefix `dev/[...]` can be used to add new features, that cannot be added with only one pull request (for instance, when several developers work on it). @@ -40,5 +53,8 @@ Those could eventually be merged into master if they don't break the API, or to > :scroll: Pull request to those branches can be done from fork branches using the **same name** as the feature branch. +> :bell: **Never** merge modifications on `upstream/master` or any release branch into your own local development branch (same comment and solution as for the release branches above). + + [:arrow_left: Back to Contributing Summary](./../../CONTRIBUTING.md) --- [:arrow_right: Next to Continuous Integration](./02_continuous_integration.md) \ No newline at end of file From af26fec43faa8b59eb67219ab98a0236d8b966c9 Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Mon, 16 Jan 2023 20:59:09 +0100 Subject: [PATCH 12/21] TL: typo --- docs/contrib/01_pull_requests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/contrib/01_pull_requests.md b/docs/contrib/01_pull_requests.md index e63e4624d4..dafd6cd378 100644 --- a/docs/contrib/01_pull_requests.md +++ b/docs/contrib/01_pull_requests.md @@ -25,7 +25,7 @@ some_feature # to add a new feature (implementation, ...) Those changes should be compatible with the existing API (_i.e_ not break it), and **avoid any change** in the current user interface. In particular, it should not modify default values for parameters or remove attributes of existing classes. But new attributes or parameters can be added with pre-set default values, and new classes can be added in the `pySDC.implementations` module. -> :bell: During the revision of your pull request, it can happen that additional changes are done to the `upstream/master` branch (in parallel-in-time/pySDC repo). In that case, don't hesitate to regularly merge the it into your local branch to solve eventual conflicts, for instance : +> :bell: During the revision of your pull request, it can happen that additional changes are done to the `upstream/master` branch (in parallel-in-time/pySDC repo). In that case, don't hesitate to regularly merge them into your local branch to solve eventual conflicts, for instance : > > ```bash > # On your local repo, with the "my_feature" branch From b1a0315136a2f50ac23099b4dd24fcc1a863a11f Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Tue, 17 Jan 2023 16:46:36 +0100 Subject: [PATCH 13/21] TL: adding README in markdown format --- README.md | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000000..f0fba9b016 --- /dev/null +++ b/README.md @@ -0,0 +1,108 @@ +[![badge-ga](https://github.com/Parallel-in-Time/pySDC/actions/workflows/ci_pipeline.yml/badge.svg?branch=master)](https://github.com/Parallel-in-Time/pySDC/actions/workflows/ci_pipeline.yml) +[![badge-ossf](https://bestpractices.coreinfrastructure.org/projects/6909/badge)](https://bestpractices.coreinfrastructure.org/projects/6909) +[![badge-cc](https://codecov.io/gh/Parallel-in-Time/pySDC/branch/master/graph/badge.svg?token=hpP18dmtgS)](https://codecov.io/gh/Parallel-in-Time/pySDC) +[![zenodo](https://zenodo.org/badge/26165004.svg)](https://zenodo.org/badge/latestdoi/26165004) + +# Welcome to pySDC! + +The `pySDC` project is a Python implementation of the +spectral deferred correction (SDC) approach and its flavors, esp. the +multilevel extension MLSDC and PFASST. It is intended for rapid +prototyping and educational purposes. New ideas like e.g. sweepers or +predictors can be tested and first toy problems can be easily +implemented. + +## Features + +- Variants of SDC: explicit, implicit, IMEX, multi-implicit, Verlet, + multi-level, diagonal, multi-step +- Variants of PFASST: virtual parallel or MPI-based parallel, + classical of multigrid perspective +- 8 tutorials: from setting up a first collocation problem to SDC, + PFASST and advanced topics +- Projects: many documented projects with defined and tested outcomes +- Many different examples, collocation types, data types already + implemented +- Works with [FEniCS](https://fenicsproject.org/), + [mpi4py-fft](https://mpi4py-fft.readthedocs.io/en/latest/) and + [PETSc](http://www.mcs.anl.gov/petsc/) (through + [petsc4py](https://bitbucket.org/petsc/petsc4py)) +- Continuous integration via [GitHub + Actions](https://github.com/Parallel-in-Time/pySDC/actions) and + [Gitlab CI](https://gitlab.hzdr.de/r.speck/pysdc/-/pipelines) +- Fully compatible with Python 3.7 - 3.10, runs at least on Ubuntu and + MacOS + +## Getting started + +The code is hosted on GitHub, see +, and PyPI, see +. While using `pip install pySDC` +will give you a core version of `pySDC` to work with, +working with the developer version is most often the better choice. We +thus recommend to checkout the code from GitHub and install the +dependencies e.g. by using a [conda](https://conda.io/en/latest/) +environment. For this, `pySDC` ships with environment files +which can be found in the folder `etc/`. Use these as e.g. + +``` bash +conda env create --yes -f etc/environment-base.yml +``` + +To check your installation, run + +``` bash +pytest pySDC/tests -m NAME +``` + +where `NAME` corresponds to the environment you chose (`base` in the +example above). You may need to update your `PYTHONPATH` by running + +``` bash +export PYTHONPATH=$PYTHONPATH:/path/to/pySDC/root/folder +``` + +in particular if you want to run any of the playgrounds, projects or +tutorials. All `import` statements there assume that the +`pySDC`\'s base directory is part of `PYTHONPATH`. + +For many examples, `LaTeX` is used for the plots, i.e. a +decent installation of this is needed in order to run those examples. +When using `fenics` or `petsc4py`, a C++ +compiler is required (although installation may go through at first). + +For more details on `pySDC`, check out http://www.parallel-in-time.org/pySDC. + +## How to cite + +If you use pySDC or parts of it for your work, great! Let us know if we +can help you with this. Also, we would greatly appreciate a citation of +[this paper](https://doi.org/10.1145/3310410): + +> Robert Speck, **Algorithm 997: pySDC - Prototyping Spectral Deferred +> Corrections**, ACM Transactions on Mathematical Software (TOMS), +> Volume 45 Issue 3, August 2019, + +The current software release can be cited using Zenodo: +[![zenodo](https://zenodo.org/badge/26165004.svg)](https://zenodo.org/badge/latestdoi/26165004) + +## Contributing + +`pySDC` code was originally developed by [Robert Speck (@pancetta)], +and is now maintained and developed by a small community of scientists interested in SDC methods, +that dearly welcomes any contribution. +If you want to take part of this, please take the time to read our [Contribution Guidelines](./CONTRIBUTING.md). + + +## Acknowledgements + +This project has received funding from the [European High-Performance +Computing Joint Undertaking](https://eurohpc-ju.europa.eu/) (JU) under +grant agreement No 955701 ([TIME-X](https://www.time-x-eurohpc.eu/)). +The JU receives support from the European Union's Horizon 2020 research +and innovation programme and Belgium, France, Germany, and Switzerland. +This project also received funding from the [German Federal Ministry of +Education and Research](https://www.bmbf.de/bmbf/en/home/home_node.html) +(BMBF) grant 16HPC047. The project also received help from the +[Helmholtz Platform for Research Software Engineering - Preparatory +Study (HiRSE_PS)](https://www.helmholtz-hirse.de/). From fcd71e3ff3c4671338be3f4231cdc35d6b3e6a51 Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Tue, 17 Jan 2023 20:59:08 +0100 Subject: [PATCH 14/21] TL: trying to solve issue250 --- CHANGELOG.md | 226 + CHANGELOG.rst | 133 - README.md | 8 +- docs/contrib/01_pull_requests.md | 10 +- docs/contrib/02_continuous_integration.md | 4 +- docs/contrib/03_naming_conventions.md | 6 +- docs/contrib/04_custom_implementations.md | 4 +- docs/convert_markdown.py | 42 + docs/emojis.json | 5983 +++++++++++++++++++++ docs/source/.gitignore | 4 + docs/source/conf.py | 1 + docs/source/index.rst | 4 +- docs/update_apidocs.sh | 10 +- 13 files changed, 6281 insertions(+), 154 deletions(-) create mode 100644 CHANGELOG.md delete mode 100644 CHANGELOG.rst create mode 100755 docs/convert_markdown.py create mode 100644 docs/emojis.json create mode 100644 docs/source/.gitignore diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..70ba4fe970 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,226 @@ +# Changelog + +- October 7, 2022: Version 5 comes with many changes, both visible and + invisible ones. Some of those break the existing API, but if you are + using tests, you should be fine. Major changes include: + + - **New convergence controllers**: Checking whether a step has + converged can be tricky, so we made separate modules out of + these checks. This makes features like adaptivity easier to + implement. Also, the controllers have been streamlined a bit to + make them more readable/digestible. Thanks to + [\@brownbaerchen](https://github.com/brownbaerchen)! + - **Adaptivity and error estimators**: SDC now comes with + adaptivity and error estimation, leveraging the new convergence + controllers out of the box. Thanks to + [\@brownbaerchen](https://github.com/brownbaerchen)! + - **New collocation classes**: We completely rewrote the way + collocation nodes and weights are computed. It is now faster, + more reliable, shorter, better. But: this **breaks the API**, + since the old collocation classes do not exist anymore. The + projects, tutorials, tests and most of the playgrounds have been + adapted, so have a look over there to see [what to + change](https://github.com/Parallel-in-Time/pySDC/commit/01ffabf71a8d71d33b74809271e8ad5a7b03ac5e#diff-adf74297b6c64d320f4da0f1d5528eda6229803a6615baf5d54c418032543681). + Thanks to [\@tlunet](https://github.com/tlunet)! + - **New projects**: Resilience and energy grid simulations are + ready to play with and are waiting for more ideas! We used this + effort to condense and clean up the problem classes a bit, + reducing the number of files and classes with only marginal + differences significantly. This could potentially **break your + code**, too, if you rely on any of those affected ones. Thanks + to [\@brownbaerchen](https://github.com/brownbaerchen) and + [\@lisawim](https://github.com/lisawim)! + - **Toward GPU computing**: We included a new data type based on + [CuPy](https://cupy.dev/) making GPU computing possible. Thanks + to [\@timo2705](https://github.com/timo2705)! + - **Better testing**: The CI pipeline got a complete overhaul + (again), now enabling simultaneous tests, faster/earlier + linting, benchmarking (at least, in principal), separate + environments and so on. The code is tested under Ubuntu and + MacOS. + - **Better code formatting**: `pySDC` now uses + [black](https://black.readthedocs.io) and + [flakeheaven](https://flakeheaven.readthedocs.io) for cleaner + source code. After complaints here and there about linting + \"errors\" the recommended way now is to run `black` before + submission. + +- December 13, 2021: Version 4.2 brings compatibility with Python 3.9, + including some code cleanup. The CI test suite seems to run faster + now, since sorting out the dependencies is faster. Tested + [mamba](https://github.com/mamba-org/mamba), which for now makes the + CI pipeline much faster. Also, the CI workflow can now run locally + using [act](https://github.com/nektos/act). We introduced markers + for soem of the tests in preparation of distributed tests on + different platforms. And finally, a LaTeX installation is no longer + needed use plotting (but recommended). + +- August 11, 2021: Version 4.1 has some more changes under the hood, + most of them with no significant impact to users. The CI pipeline + has been completely rewritten, porting the code to [Github + Actions](https://github.com/features/actions) (away from [Travis + CI](https://travis-ci.com/)), to [flake8](https://flake8.pycqa.org) + and to [pytest](https://pytest.org) (away from + [nose](https://nose.readthedocs.io)). One thing that may have an + impact on users is that following the changes made in Version 4.0, + the PETSc data structures are now much easier, removing a lot of + unnecessary boilerplate code. + +- May 4, 2021: Long time, no see, but this major release 4.0 marks + some improvements under the hood: + + - **Rewrote `mesh` and `particle` data type**: + Creation of new arrays for each operation is now avoided by + directly subclassing Numpy\'s `ndarray`. Somewhat faster, + definitively better, less code, future-proof, but also breaking + the API. If you use `pySDC` for your project, make + sure you adapt to the new data types (or don\'t upgrade). + - **Faster quadrature**: Thanks to + [tlunet](https://github.com/tlunet) the computation of the + weights is now faster and (even) more reliable. No breaking of + any API here\... + - **Bugfixing and version pushes**: The code should run without + (many) complaints with Python 3.6, 3.7 and potentially above. + Also, the plotting routines have been adapted to work with + recent versions of `matplotlib`. + + This is not much (yet) and if it were not for the API changes, this + would have been a minor release. + +- August 30, 2019: Version 3.1 adds many more examples like the + nonlinear Schrödinger equation, more on Gray-Scott and in particular + Allen-Cahn. Those are many implemented using the parallel FFT + library + [mpi4pi-fft](https://bitbucket.org/mpi4py/mpi4py-fft/src/master/), + which can now be used with `pySDC`. There are now 8 + tutorials, where step 7 shows the usage of three external libraries + with `pySDC`: mpi4py, FEniCS and petsc4py. The MPI controller has + been improved after performaning a detailed performance analysis + using [Score-P](https://www.vi-hps.org/projects/score-p/) and + [Extrae](https://www.vi-hps.org/Tools/Extrae.html). Finally: first + steps towards error/iteration estimators are taken, too. + +- February 14, 2019: Released version 3 of `pySDC`. This + release is accompanied by the **ACM TOMS paper** + ["pySDC -- Prototyping spectral deferred corrections"](https://doi.org/10.1145/3310410). + It release contains some breaking changes to the API. In detail: + + - **Dropped Python 2 support**: Starting with this version, + `pySDC` relies on Python 3. Various incompabilities + led to inconsistent treatment of dependencies, so that parts of + the code had to use Python 2 while other relied on Python 3 or + could do both. We follow [A pledge to migrate to Python + 3](https://python3statement.org/) with this decision, as most + prominent dependencies of `pySDC` already do. + - **Unified controllers**: Instead of providing (and maintaining) + four different controllers, this release only has one for + emulated and one for MPI-based time-parallelization + (`controller_nonMPI` and `controller_MPI`). This should avoid + further confusion and makes the code easier to maintain. Both + controllers use the multigrid perspective for the algorithm + (first exchange data, than compute updates), but the classical + way of determining when to stop locally (each time-step is + stopped when ready, if the previous one is ready, too). The + complete multigrid behavior can be restored using a flag. All + included projects and tutorials have been adapted to this. + - **No more data types in the front-ends**: The redundant use of + data type specifications in the description dictionaries has + been removed. Data types are now declared within each problem + class (more precisely, in the header of the `__init__`-method to + allow inhertiance). All included projects and tutorials have + been adapted to this. + - **Renewed FEniCS support**: This release revives the deprecated + [FEniCS](https://fenicsproject.org/) support, now requiring at + least FEniCS 2018.1. The integration is tested using Travis-CI. + - **More consistent handling of local initial conditions**: The + treatment of `u[0]` and `f[0]` has been fixed and made + consistent throughout the code. + - As usual, many bugs have been discovered and fixed. + +- May 23, 3018: Version 2.4 adds support for + [petsc4py](https://bitbucket.org/petsc/petsc4py)! You can now use + [PETSc](http://www.mcs.anl.gov/petsc/) data types + (`pySDC` ships with DMDA for distributed structured + grids) and parallel solvers right from your examples and problem + classes. There is also a new tutorial (7.C) showing this in a bit + more detail, including communicator splitting for parallelization in + space and time. Warning: in order to get this to work you need to + install petsc4py and mpi4py first! Make sure both use MPICH3 + bindings. Downloading `pySDC` from PyPI does not include + these packages. + +- February 8, 2018: Ever got annoyed at `pySDC`\'s + incredibly slow setup phase when multiple time-steps are used? + Version 2.3 changes this by copying the data structure of the first + step to all other steps using the [dill + Package](https://pypi.python.org/pypi/dill). Setup times could be + reduced by 90% and more for certain problems. We also increase the + speed for certain calculations, in particular for the Penning trap + example. + +- November 7, 2017: Version 2.2 contains matrix-based versions of + PFASST within the project `matrixPFASST`. This involved quite a few + changes in more or less unexpected places, e.g. in the multigrid + controller and the transfer base class. The impact of these changes + on other projects should be negligible, though. + +- October 25, 2017: For the [6th Workshop on Parallel-in-Time + Integration](https://www.ics.usi.ch/index.php/6th-workshop-on-parallel-in-time-methods) + `pySDC` has been updated to version 2.1. It is now + available on PyPI - the Python Package Index, see + and can be installed simply by + using `pip install pySDC`. Naturally, this release contains a lot of + bugfixes and minor improvements. Most notably, the file structure + has been changed again to meet the standards for Python packaging + (at least a bit). + +- November 24, 2016: Released version 2 of `pySDC`. This + release contains major changes to the code and its structure: + + - **Complete redesign of code structure**: The `core` part of + `pySDC` only contains the core modules and classes, + while `implementations` contains the actual implementations + necessary to run something. This now includes separate files for + all collocation classes, as well as a collection of problems, + transfer classes and so on. Most examples have been ported to + either `tutorials`, `playgrounds` or `projects`. + - **Introduction of tutorials**: We added a tutorial (see below) + to explain many of pySDC\'s features in a step-by-step fashion. + We start with a simple spatial discretization and collocation + formulations and move step by step to SDC, MLSDC and PFASST. All + tutorials are accompanied by tests. + - **New all-inclusive controllers**: Instead of having two PFASST + controllers which could also do SDC and MLSDC (and more), we now + have four generic controllers which can do all these methods, + depending on the input. They are split into two by two class: + `MPI` and `NonMPI` for real or virtual + parallelisim as well as `classic` and + `multigrid` for the standard and multigrid-like + implementation of PFASST and the likes. Initialization has been + simplified a lot, too. + - **Collocation-based coarsening** As the standard PFASST + libraries [libpfasst](https://bitbucket.org/memmett/libpfasst) + and [PFASST++](https://github.com/Parallel-in-Time/PFASST) + `pySDC` now offers collocation-based coarsening, + i.e. the number of collocation nodes can be reduced during + coarsening. Also, time-step coarsening is in preparation, but + not implemented yet. + - **Testing and documentation** The core, implementations and + plugin packages and their subpackages are fully documented using + sphinx-apidoc, see below. This documentation as well as this + website are generated automatically using + [Travis-CI](https://travis-ci.org/Parallel-in-Time/pySDC). Most + of the code is supported by tests, mainly realized by using the + tutorial as the test routines with clearly defined results. + Also, projects are accompanied by tests. + - Further, minor changes: + - Switched to more stable barycentric interpolation for the + quadrature weights + - New collocation class: `EquidistantSpline_Right` + for spline-based quadrature + - Collocation tests are realized by generators and not by + classes + - Multi-step SDC (aka single-level PFASST) now works as + expected + - Reworked many of the internal structures for consistency and + simplicity diff --git a/CHANGELOG.rst b/CHANGELOG.rst deleted file mode 100644 index 56a97c88d6..0000000000 --- a/CHANGELOG.rst +++ /dev/null @@ -1,133 +0,0 @@ -Changelog ---------- - -- October 7, 2022: Version 5 comes with many changes, both visible and invisible ones. Some of those break the existing API, but - if you are using tests, you should be fine. Major changes include: - - - **New convergence controllers**: Checking whether a step has converged can be tricky, so we made separate modules out of these - checks. This makes features like adaptivity easier to implement. Also, the controllers have been streamlined a bit to make them more readable/digestible. - Thanks to `@brownbaerchen `_! - - **Adaptivity and error estimators**: SDC now comes with adaptivity and error estimation, leveraging the new convergence controllers out of the box. - Thanks to `@brownbaerchen `_! - - **New collocation classes**: We completely rewrote the way collocation nodes and weights are computed. It is now faster, more reliable, shorter, better. - But: this **breaks the API**, since the old collocation classes do not exist anymore. The projects, tutorials, tests and most of the playgrounds - have been adapted, so have a look over there to see `what to change `_. - Thanks to `@tlunet `_! - - **New projects**: Resilience and energy grid simulations are ready to play with and are waiting for more ideas! - We used this effort to condense and clean up the problem classes a bit, reducing the number of files and classes with only marginal differences significantly. - This could potentially **break your code**, too, if you rely on any of those affected ones. - Thanks to `@brownbaerchen `_ and `@lisawim `_! - - **Toward GPU computing**: We included a new data type based on `CuPy `_ making GPU computing possible. - Thanks to `@timo2705 `_! - - **Better testing**: The CI pipeline got a complete overhaul (again), now enabling simultaneous tests, faster/earlier linting, benchmarking (at least, in principal), separate environments and so on. - The code is tested under Ubuntu and MacOS. - - **Better code formatting**: `pySDC` now uses `black `_ and `flakeheaven `_ for cleaner source code. - After complaints here and there about linting "errors" the recommended way now is to run ``black`` before submission. - -- December 13, 2021: Version 4.2 brings compatibility with Python 3.9, including some code cleanup. The CI test - suite seems to run faster now, since sorting out the dependencies is faster. Tested `mamba `_, - which for now makes the CI pipeline much faster. Also, the CI workflow can now run locally using `act `_. - We introduced markers for soem of the tests in preparation of distributed tests on different platforms. And finally, a LaTeX - installation is no longer needed use plotting (but recommended). - -- August 11, 2021: Version 4.1 has some more changes under the hood, most of them with no significant impact to users. - The CI pipeline has been completely rewritten, porting the code to `Github Actions `_ - (away from `Travis CI `_), to `flake8 `_ and to `pytest `_ - (away from `nose `_). One thing that may have an impact on users is that following the changes - made in Version 4.0, the PETSc data structures are now much easier, removing a lot of unnecessary boilerplate code. - -- May 4, 2021: Long time, no see, but this major release 4.0 marks some improvements under the hood: - - - **Rewrote ``mesh`` and ``particle`` data type**: Creation of new arrays for each operation is now avoided by - directly subclassing Numpy's ``ndarray``. Somewhat faster, definitively better, less code, future-proof, but also breaking the API. If you use `pySDC` - for your project, make sure you adapt to the new data types (or don't upgrade). - - **Faster quadrature**: Thanks to `tlunet `_ the computation of the weights is now faster and - (even) more reliable. No breaking of any API here... - - **Bugfixing and version pushes**: The code should run without (many) complaints with Python 3.6, 3.7 and potentially above. - Also, the plotting routines have been adapted to work with recent versions of `matplotlib`. - - This is not much (yet) and if it were not for the API changes, this would have been a minor release. - -- August 30, 2019: Version 3.1 adds many more examples like the nonlinear Schrödinger equation, more on Gray-Scott and in particular Allen-Cahn. - Those are many implemented using the parallel FFT library `mpi4pi-fft `_, which can now be used with `pySDC`. - There are now 8 tutorials, where step 7 shows the usage of three external libraries with `pySDC`: mpi4py, FEniCS and petsc4py. - The MPI controller has been improved after performaning a detailed performance analysis using `Score-P `_ and `Extrae `_. - Finally: first steps towards error/iteration estimators are taken, too. - -- February 14, 2019: Released version 3 of `pySDC`. This release is accompanied by the **ACM TOMS paper** - `"pySDC -- Prototyping spectral deferred corrections" `_. - It release contains some breaking changes to the API. In detail: - - - **Dropped Python 2 support**: Starting with this version, `pySDC` relies on Python 3. Various incompabilities led - to inconsistent treatment of dependencies, so that parts of the code had to use Python 2 while other relied on - Python 3 or could do both. We follow `A pledge to migrate to Python 3 `_ with this decision, - as most prominent dependencies of `pySDC` already do. - - **Unified controllers**: Instead of providing (and maintaining) four different controllers, this release only has - one for emulated and one for MPI-based time-parallelization (``controller_nonMPI`` and ``controller_MPI``). - This should avoid further confusion and makes the code easier to maintain. Both controllers use the multigrid - perspective for the algorithm (first exchange data, than compute updates), but the classical way of determining - when to stop locally (each time-step is stopped when ready, if the previous one is ready, too). The complete multigrid - behavior can be restored using a flag. All included projects and tutorials have been adapted to this. - - **No more data types in the front-ends**: The redundant use of data type specifications in the description dictionaries - has been removed. Data types are now declared within each problem class (more precisely, in the header of the - ``__init__``-method to allow inhertiance). All included projects and tutorials have been adapted to this. - - **Renewed FEniCS support**: This release revives the deprecated `FEniCS `_ support, now requiring at least FEniCS 2018.1. - The integration is tested using Travis-CI. - - **More consistent handling of local initial conditions**: The treatment of ``u[0]`` and ``f[0]`` has been fixed and - made consistent throughout the code. - - As usual, many bugs have been discovered and fixed. - -- May 23, 3018: Version 2.4 adds support for `petsc4py `_! - You can now use `PETSc `_ data types (`pySDC` ships with DMDA for distributed structured grids) and parallel solvers right from your examples and problem classes. - There is also a new tutorial (7.C) showing this in a bit more detail, including communicator splitting for parallelization in space and time. - Warning: in order to get this to work you need to install petsc4py and mpi4py first! Make sure both use MPICH3 bindings. - Downloading `pySDC` from PyPI does not include these packages. - -- February 8, 2018: Ever got annoyed at `pySDC`'s incredibly slow setup phase when multiple time-steps are used? Version 2.3 - changes this by copying the data structure of the first step to all other steps using the `dill Package `_. - Setup times could be reduced by 90% and more for certain problems. We also increase the speed for certain calculations, - in particular for the Penning trap example. - -- November 7, 2017: Version 2.2 contains matrix-based versions of PFASST within the project ``matrixPFASST``. This involved quite a few - changes in more or less unexpected places, e.g. in the multigrid controller and the transfer base class. The impact - of these changes on other projects should be negligible, though. - -- October 25, 2017: For the `6th Workshop on Parallel-in-Time Integration `_ - `pySDC` has been updated to version 2.1. It is now available on PyPI - the Python Package Index, see `https://pypi.python.org/pypi/pySDC `_ - and can be installed simply by using ``pip install pySDC``. Naturally, this release contains a lot of bugfixes and minor improvements. - Most notably, the file structure has been changed again to meet the standards for Python packaging (at least a bit). - -- November 24, 2016: Released version 2 of `pySDC`. This release contains major changes to the code and its structure: - - - **Complete redesign of code structure**: The ``core`` part of `pySDC` only contains the core modules and classes, - while ``implementations`` contains the actual implementations necessary to run something. - This now includes separate files for all collocation classes, as well as a collection of problems, transfer classes and so on. - Most examples have been ported to either ``tutorials``, ``playgrounds`` or ``projects``. - - - **Introduction of tutorials**: We added a tutorial (see below) to explain many - of pySDC's features in a step-by-step fashion. We start with a simple spatial - discretization and collocation formulations and move step by step to SDC, MLSDC and PFASST. - All tutorials are accompanied by tests. - - - **New all-inclusive controllers**: Instead of having two PFASST controllers - which could also do SDC and MLSDC (and more), we now have four generic controllers - which can do all these methods, depending on the input. They are split into - two by two class: `MPI` and `NonMPI` for real or virtual parallelisim as well - as `classic` and `multigrid` for the standard and multigrid-like implementation - of PFASST and the likes. Initialization has been simplified a lot, too. - - - **Collocation-based coarsening** As the standard PFASST libraries `libpfasst `_ and `PFASST++ `_ - `pySDC` now offers collocation-based coarsening, i.e. the number of collocation nodes can be reduced during coarsening. - Also, time-step coarsening is in preparation, but not implemented yet. - - - **Testing and documentation** The core, implementations and plugin packages and their subpackages are fully documented using sphinx-apidoc, see below. - This documentation as well as this website are generated automatically using `Travis-CI `_. - Most of the code is supported by tests, mainly realized by using the tutorial as the test routines with clearly defined results. Also, projects are accompanied by tests. - - - Further, minor changes: - - - Switched to more stable barycentric interpolation for the quadrature weights - - New collocation class: `EquidistantSpline_Right` for spline-based quadrature - - Collocation tests are realized by generators and not by classes - - Multi-step SDC (aka single-level PFASST) now works as expected - - Reworked many of the internal structures for consistency and simplicity \ No newline at end of file diff --git a/README.md b/README.md index f0fba9b016..eeb099f4af 100644 --- a/README.md +++ b/README.md @@ -88,10 +88,10 @@ The current software release can be cited using Zenodo: ## Contributing -`pySDC` code was originally developed by [Robert Speck (@pancetta)], -and is now maintained and developed by a small community of scientists interested in SDC methods, -that dearly welcomes any contribution. -If you want to take part of this, please take the time to read our [Contribution Guidelines](./CONTRIBUTING.md). +`pySDC` code was originally developed by [Robert Speck (@pancetta)](https://github.com/pancetta), +and is now maintained and developed by a small community of scientists interested in SDC methods, that dearly welcomes any contribution. +If you want to take part of this, please take the time to read our [Contribution Guidelines](./CONTRIBUTING.md) +(and don't forget to take a pick at our nice [Code of Conduct](./CODE_OF_CONDUCT.md) :wink:). ## Acknowledgements diff --git a/docs/contrib/01_pull_requests.md b/docs/contrib/01_pull_requests.md index dafd6cd378..9cb2dc21f6 100644 --- a/docs/contrib/01_pull_requests.md +++ b/docs/contrib/01_pull_requests.md @@ -25,15 +25,15 @@ some_feature # to add a new feature (implementation, ...) Those changes should be compatible with the existing API (_i.e_ not break it), and **avoid any change** in the current user interface. In particular, it should not modify default values for parameters or remove attributes of existing classes. But new attributes or parameters can be added with pre-set default values, and new classes can be added in the `pySDC.implementations` module. -> :bell: During the revision of your pull request, it can happen that additional changes are done to the `upstream/master` branch (in parallel-in-time/pySDC repo). In that case, don't hesitate to regularly merge them into your local branch to solve eventual conflicts, for instance : -> +> :bell: During the revision of your pull request, it can happen that additional changes are done to the `upstream/master` branch (in parallel-in-time/pySDC repo). In that case, don't hesitate to regularly merge them into your local branch to solve eventual conflicts, for instance : +> > ```bash > # On your local repo, with the "my_feature" branch > $ git fetch upstream # synchronize with parallel-in-time/pySDC > $ git merge upstream/master # merge into my_feature > $ git push # push local merges to your repository > ``` -> +> > The pull request will be updated with any merge changes on the `my_feature` branch of your repository. @@ -56,5 +56,5 @@ Those could eventually be merged into master if they don't break the API, or to > :bell: **Never** merge modifications on `upstream/master` or any release branch into your own local development branch (same comment and solution as for the release branches above). -[:arrow_left: Back to Contributing Summary](./../../CONTRIBUTING.md) --- -[:arrow_right: Next to Continuous Integration](./02_continuous_integration.md) \ No newline at end of file +:arrow_left: [Back to Contributing Summary](./../../CONTRIBUTING.md) --- +:arrow_right: [Next to Continuous Integration](./02_continuous_integration.md) \ No newline at end of file diff --git a/docs/contrib/02_continuous_integration.md b/docs/contrib/02_continuous_integration.md index ec0841ae99..da7b62cb71 100644 --- a/docs/contrib/02_continuous_integration.md +++ b/docs/contrib/02_continuous_integration.md @@ -47,5 +47,5 @@ pytest -v pySDC/tests > pytest -v pySDC/tests/test_nodes.py # only test nodes generation > ``` -[:arrow_left: Back to Pull Request Recommendation](./01_pull_requests.md) --- -[:arrow_right: Next to Naming Conventions](./03_naming_conventions.md) \ No newline at end of file +:arrow_left: [Back to Pull Request Recommendation](./01_pull_requests.md) --- +:arrow_right: [Next to Naming Conventions](./03_naming_conventions.md) \ No newline at end of file diff --git a/docs/contrib/03_naming_conventions.md b/docs/contrib/03_naming_conventions.md index f3de762206..711852c182 100644 --- a/docs/contrib/03_naming_conventions.md +++ b/docs/contrib/03_naming_conventions.md @@ -27,7 +27,7 @@ Possible Naming formats : ## Packages and modules names Modules should have short, all-lowercase names. Underscores can be used in the module name if it improves readability (_i.e_ use snake_case only if it helps, -else try to stick to all-lowercase). +else try to stick to all-lowercase). Python packages should also have short, all-lowercase names, although the use of underscores is discouraged. ## Class names @@ -139,5 +139,5 @@ class MySweeper(Sweeper): # ... other implementations for initSweep ``` -[:arrow_left: Back to Continuous Integration](./02_continuous_integration.md) --- -[:arrow_right: Next to Custom Implementations](./04_custom_implementations.md) \ No newline at end of file +:arrow_left: [Back to Continuous Integration](./02_continuous_integration.md) --- +:arrow_right: [Next to Custom Implementations](./04_custom_implementations.md) \ No newline at end of file diff --git a/docs/contrib/04_custom_implementations.md b/docs/contrib/04_custom_implementations.md index 2dd71e0ffa..414cefa413 100644 --- a/docs/contrib/04_custom_implementations.md +++ b/docs/contrib/04_custom_implementations.md @@ -2,5 +2,5 @@ ... in construction ... -[:arrow_left: Back to Naming Conventions](./03_naming_conventions.md) --- -[:arrow_right: Next to a cute picture of cat](https://www.vecteezy.com/photo/2098203-silver-tabby-cat-sitting-on-green-background) \ No newline at end of file +:arrow_left: [Back to Naming Conventions](./03_naming_conventions.md) --- +:arrow_right: [Next to a cute picture of cat](https://www.vecteezy.com/photo/2098203-silver-tabby-cat-sitting-on-green-background) \ No newline at end of file diff --git a/docs/convert_markdown.py b/docs/convert_markdown.py new file mode 100755 index 0000000000..126071674d --- /dev/null +++ b/docs/convert_markdown.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Tue Jan 17 19:47:56 2023 + +@author: telu +""" +import os +import glob +import json +import m2r2 + +mdFiles = [ + 'README.md', + 'CONTRIBUTING.md', + 'CHANGELOG.md', + 'CODE_OF_CONDUCT.md', + 'docs/contrib'] + +docSources = 'docs/source' + +with open('docs/emojis.json') as f: + emojis = set(json.load(f).keys()) + +def convert(md): + rst = m2r2.parse_from_file(md, parse_relative_links=True) + for emoji in emojis: + rst = rst.replace(emoji, f'|{emoji}|') + baseName = os.path.splitext(md)[0] + with open(f'{docSources}/{baseName}.rst', 'w') as f: + f.write(rst) + print(f'Converted {md} to {docSources}/{baseName}.rst') + +for md in mdFiles: + if os.path.isfile(md): + convert(md) + elif os.path.isdir(md): + os.makedirs(f'{docSources}/{md}', exist_ok=True) + for f in glob.glob(f'{md}/*.md'): + convert(f) + else: + raise ValueError('{md} is not a md file or a folder') diff --git a/docs/emojis.json b/docs/emojis.json new file mode 100644 index 0000000000..0c142f6bb7 --- /dev/null +++ b/docs/emojis.json @@ -0,0 +1,5983 @@ +{ + ":+1:": "👍", + ":+1_tone1:": "👍🏻", + ":+1_tone2:": "👍🏼", + ":+1_tone3:": "👍🏽", + ":+1_tone4:": "👍🏾", + ":+1_tone5:": "👍🏿", + ":-1:": "👎", + ":-1_tone1:": "👎🏻", + ":-1_tone2:": "👎🏼", + ":-1_tone3:": "👎🏽", + ":-1_tone4:": "👎🏾", + ":-1_tone5:": "👎🏿", + ":100:": "💯", + ":1234:": "🔢", + ":1st_place_medal:": "🥇", + ":2nd_place_medal:": "🥈", + ":3rd_place_medal:": "🥉", + ":8ball:": "🎱", + ":a:": "🅰️", + ":ab:": "🆎", + ":abacus:": "🧮", + ":abc:": "🔤", + ":abcd:": "🔡", + ":ac:": "🇦🇨", + ":accept:": "🉑", + ":accordion:": "🪗", + ":ad:": "🇦🇩", + ":adhesive_bandage:": "🩹", + ":admission_tickets:": "🎟️", + ":adult:": "🧑", + ":adult_dark_skin_tone:": "🧑🏿", + ":adult_light_skin_tone:": "🧑🏻", + ":adult_medium_dark_skin_tone:": "🧑🏾", + ":adult_medium_light_skin_tone:": "🧑🏼", + ":adult_medium_skin_tone:": "🧑🏽", + ":adult_tone1:": "🧑🏻", + ":adult_tone2:": "🧑🏼", + ":adult_tone3:": "🧑🏽", + ":adult_tone4:": "🧑🏾", + ":adult_tone5:": "🧑🏿", + ":ae:": "🇦🇪", + ":aerial_tramway:": "🚡", + ":af:": "🇦🇫", + ":afghanistan:": "🇦🇫", + ":ag:": "🇦🇬", + ":ai:": "🇦🇮", + ":airplane:": "✈️", + ":airplane_arriving:": "🛬", + ":airplane_departure:": "🛫", + ":airplane_small:": "🛩️", + ":al:": "🇦🇱", + ":aland_islands:": "🇦🇽", + ":alarm_clock:": "⏰", + ":albania:": "🇦🇱", + ":alembic:": "⚗️", + ":algeria:": "🇩🇿", + ":alien:": "👽", + ":am:": "🇦🇲", + ":ambulance:": "🚑", + ":american_samoa:": "🇦🇸", + ":amphora:": "🏺", + ":anatomical_heart:": "🫀", + ":anchor:": "⚓", + ":andorra:": "🇦🇩", + ":angel:": "👼", + ":angel_tone1:": "👼🏻", + ":angel_tone2:": "👼🏼", + ":angel_tone3:": "👼🏽", + ":angel_tone4:": "👼🏾", + ":angel_tone5:": "👼🏿", + ":anger:": "💢", + ":anger_right:": "🗯️", + ":angola:": "🇦🇴", + ":angry:": "😠", + ":anguilla:": "🇦🇮", + ":anguished:": "😧", + ":ant:": "🐜", + ":antarctica:": "🇦🇶", + ":antigua_barbuda:": "🇦🇬", + ":ao:": "🇦🇴", + ":apple:": "🍎", + ":aq:": "🇦🇶", + ":aquarius:": "♒", + ":ar:": "🇦🇷", + ":archery:": "🏹", + ":argentina:": "🇦🇷", + ":aries:": "♈", + ":armenia:": "🇦🇲", + ":arrow_backward:": "◀️", + ":arrow_double_down:": "⏬", + ":arrow_double_up:": "⏫", + ":arrow_down:": "⬇️", + ":arrow_down_small:": "🔽", + ":arrow_forward:": "▶️", + ":arrow_heading_down:": "⤵️", + ":arrow_heading_up:": "⤴️", + ":arrow_left:": "⬅️", + ":arrow_lower_left:": "↙️", + ":arrow_lower_right:": "↘️", + ":arrow_right:": "➡️", + ":arrow_right_hook:": "↪️", + ":arrow_up:": "⬆️", + ":arrow_up_down:": "↕️", + ":arrow_up_small:": "🔼", + ":arrow_upper_left:": "↖️", + ":arrow_upper_right:": "↗️", + ":arrows_clockwise:": "🔃", + ":arrows_counterclockwise:": "🔄", + ":art:": "🎨", + ":articulated_lorry:": "🚛", + ":artificial_satellite:": "🛰", + ":artist:": "🧑‍🎨", + ":artist_dark_skin_tone:": "🧑🏿‍🎨", + ":artist_light_skin_tone:": "🧑🏻‍🎨", + ":artist_medium_dark_skin_tone:": "🧑🏾‍🎨", + ":artist_medium_light_skin_tone:": "🧑🏼‍🎨", + ":artist_medium_skin_tone:": "🧑🏽‍🎨", + ":artist_tone1:": "🧑🏻‍🎨", + ":artist_tone2:": "🧑🏼‍🎨", + ":artist_tone3:": "🧑🏽‍🎨", + ":artist_tone4:": "🧑🏾‍🎨", + ":artist_tone5:": "🧑🏿‍🎨", + ":aruba:": "🇦🇼", + ":as:": "🇦🇸", + ":ascension:": "🇦🇨", + ":asterisk:": "*️⃣", + ":asterisk_symbol:": "*️", + ":astonished:": "😲", + ":astronaut:": "🧑‍🚀", + ":astronaut_dark_skin_tone:": "🧑🏿‍🚀", + ":astronaut_light_skin_tone:": "🧑🏻‍🚀", + ":astronaut_medium_dark_skin_tone:": "🧑🏾‍🚀", + ":astronaut_medium_light_skin_tone:": "🧑🏼‍🚀", + ":astronaut_medium_skin_tone:": "🧑🏽‍🚀", + ":astronaut_tone1:": "🧑🏻‍🚀", + ":astronaut_tone2:": "🧑🏼‍🚀", + ":astronaut_tone3:": "🧑🏽‍🚀", + ":astronaut_tone4:": "🧑🏾‍🚀", + ":astronaut_tone5:": "🧑🏿‍🚀", + ":at:": "🇦🇹", + ":athletic_shoe:": "👟", + ":atm:": "🏧", + ":atom:": "⚛️", + ":atom_symbol:": "⚛️", + ":au:": "🇦🇺", + ":australia:": "🇦🇺", + ":austria:": "🇦🇹", + ":auto_rickshaw:": "🛺", + ":avocado:": "🥑", + ":aw:": "🇦🇼", + ":ax:": "🇦🇽", + ":axe:": "🪓", + ":az:": "🇦🇿", + ":azerbaijan:": "🇦🇿", + ":b:": "🅱️", + ":ba:": "🇧🇦", + ":baby:": "👶", + ":baby_bottle:": "🍼", + ":baby_chick:": "🐤", + ":baby_symbol:": "🚼", + ":baby_tone1:": "👶🏻", + ":baby_tone2:": "👶🏼", + ":baby_tone3:": "👶🏽", + ":baby_tone4:": "👶🏾", + ":baby_tone5:": "👶🏿", + ":back:": "🔙", + ":back_of_hand:": "🤚", + ":back_of_hand_tone1:": "🤚🏻", + ":back_of_hand_tone2:": "🤚🏼", + ":back_of_hand_tone3:": "🤚🏽", + ":back_of_hand_tone4:": "🤚🏾", + ":back_of_hand_tone5:": "🤚🏿", + ":bacon:": "🥓", + ":badger:": "🦡", + ":badminton:": "🏸", + ":bagel:": "🥯", + ":baggage_claim:": "🛄", + ":baguette_bread:": "🥖", + ":bahamas:": "🇧🇸", + ":bahrain:": "🇧🇭", + ":balance_scale:": "⚖️", + ":bald:": "🦲", + ":ballet_shoes:": "🩰", + ":balloon:": "🎈", + ":ballot_box:": "🗳️", + ":ballot_box_with_ballot:": "🗳️", + ":ballot_box_with_check:": "☑️", + ":bamboo:": "🎍", + ":banana:": "🍌", + ":bangbang:": "‼️", + ":bangladesh:": "🇧🇩", + ":banjo:": "🪕", + ":bank:": "🏦", + ":bar_chart:": "📊", + ":barbados:": "🇧🇧", + ":barber:": "💈", + ":baseball:": "⚾", + ":basket:": "🧺", + ":basketball:": "🏀", + ":basketball_man:": "⛹️", + ":basketball_player:": "⛹", + ":basketball_player_tone1:": "⛹🏻", + ":basketball_player_tone2:": "⛹🏼", + ":basketball_player_tone3:": "⛹🏽", + ":basketball_player_tone4:": "⛹🏾", + ":basketball_player_tone5:": "⛹🏿", + ":basketball_woman:": "⛹️‍♀️", + ":bat:": "🦇", + ":bath:": "🛀", + ":bath_tone1:": "🛀🏻", + ":bath_tone2:": "🛀🏼", + ":bath_tone3:": "🛀🏽", + ":bath_tone4:": "🛀🏾", + ":bath_tone5:": "🛀🏿", + ":bathtub:": "🛁", + ":battery:": "🔋", + ":bb:": "🇧🇧", + ":bd:": "🇧🇩", + ":be:": "🇧🇪", + ":beach:": "🏖️", + ":beach_umbrella:": "⛱️", + ":beach_with_umbrella:": "🏖️", + ":bear:": "🐻", + ":bearded_person:": "🧔", + ":bearded_person_dark_skin_tone:": "🧔🏿", + ":bearded_person_light_skin_tone:": "🧔🏻", + ":bearded_person_medium_dark_skin_tone:": "🧔🏾", + ":bearded_person_medium_light_skin_tone:": "🧔🏼", + ":bearded_person_medium_skin_tone:": "🧔🏽", + ":bearded_person_tone1:": "🧔🏻", + ":bearded_person_tone2:": "🧔🏼", + ":bearded_person_tone3:": "🧔🏽", + ":bearded_person_tone4:": "🧔🏾", + ":bearded_person_tone5:": "🧔🏿", + ":beaver:": "🦫", + ":bed:": "🛏️", + ":bee:": "🐝", + ":beer:": "🍺", + ":beers:": "🍻", + ":beetle:": "🪲", + ":beginner:": "🔰", + ":belarus:": "🇧🇾", + ":belgium:": "🇧🇪", + ":belize:": "🇧🇿", + ":bell:": "🔔", + ":bell_pepper:": "🫑", + ":bellhop:": "🛎️", + ":bellhop_bell:": "🛎️", + ":benin:": "🇧🇯", + ":bento:": "🍱", + ":bermuda:": "🇧🇲", + ":beverage_box:": "🧃", + ":bf:": "🇧🇫", + ":bg:": "🇧🇬", + ":bh:": "🇧🇭", + ":bhutan:": "🇧🇹", + ":bi:": "🇧🇮", + ":bicyclist:": "🚴", + ":bicyclist_tone1:": "🚴🏻", + ":bicyclist_tone2:": "🚴🏼", + ":bicyclist_tone3:": "🚴🏽", + ":bicyclist_tone4:": "🚴🏾", + ":bicyclist_tone5:": "🚴🏿", + ":bike:": "🚲", + ":biking_man:": "🚴", + ":biking_woman:": "🚴‍♀️", + ":bikini:": "👙", + ":billed_cap:": "🧢", + ":biohazard:": "☣️", + ":biohazard_sign:": "☣️", + ":bird:": "🐦", + ":birthday:": "🎂", + ":bison:": "🦬", + ":bj:": "🇧🇯", + ":bl:": "🇧🇱", + ":black_cat:": "🐈‍⬛", + ":black_circle:": "⚫", + ":black_flag:": "🏴", + ":black_heart:": "🖤", + ":black_joker:": "🃏", + ":black_large_square:": "⬛", + ":black_medium_small_square:": "◾", + ":black_medium_square:": "◼️", + ":black_nib:": "✒️", + ":black_small_square:": "▪️", + ":black_square_button:": "🔲", + ":blond-haired_man:": "👱‍♂️", + ":blond-haired_man_dark_skin_tone:": "👱🏿‍♂️", + ":blond-haired_man_light_skin_tone:": "👱🏻‍♂️", + ":blond-haired_man_medium_dark_skin_tone:": "👱🏾‍♂️", + ":blond-haired_man_medium_light_skin_tone:": "👱🏼‍♂️", + ":blond-haired_man_medium_skin_tone:": "👱🏽‍♂️", + ":blond-haired_man_tone1:": "👱🏻‍♂️", + ":blond-haired_man_tone2:": "👱🏼‍♂️", + ":blond-haired_man_tone3:": "👱🏽‍♂️", + ":blond-haired_man_tone4:": "👱🏾‍♂️", + ":blond-haired_man_tone5:": "👱🏿‍♂️", + ":blond-haired_woman:": "👱‍♀️", + ":blond-haired_woman_dark_skin_tone:": "👱🏿‍♀️", + ":blond-haired_woman_light_skin_tone:": "👱🏻‍♀️", + ":blond-haired_woman_medium_dark_skin_tone:": "👱🏾‍♀️", + ":blond-haired_woman_medium_light_skin_tone:": "👱🏼‍♀️", + ":blond-haired_woman_medium_skin_tone:": "👱🏽‍♀️", + ":blond-haired_woman_tone1:": "👱🏻‍♀️", + ":blond-haired_woman_tone2:": "👱🏼‍♀️", + ":blond-haired_woman_tone3:": "👱🏽‍♀️", + ":blond-haired_woman_tone4:": "👱🏾‍♀️", + ":blond-haired_woman_tone5:": "👱🏿‍♀️", + ":blond_haired_person:": "👱", + ":blond_haired_person_tone1:": "👱🏻", + ":blond_haired_person_tone2:": "👱🏼", + ":blond_haired_person_tone3:": "👱🏽", + ":blond_haired_person_tone4:": "👱🏾", + ":blond_haired_person_tone5:": "👱🏿", + ":blonde_man:": "👱", + ":blonde_woman:": "👱‍♀️", + ":blossom:": "🌼", + ":blowfish:": "🐡", + ":blue_book:": "📘", + ":blue_car:": "🚙", + ":blue_circle:": "🔵", + ":blue_heart:": "💙", + ":blue_square:": "🟦", + ":blueberries:": "🫐", + ":blush:": "😊", + ":bm:": "🇧🇲", + ":bn:": "🇧🇳", + ":bo:": "🇧🇴", + ":boar:": "🐗", + ":boat:": "⛵️", + ":bolivia:": "🇧🇴", + ":bomb:": "💣", + ":bone:": "🦴", + ":book:": "📖", + ":bookmark:": "🔖", + ":bookmark_tabs:": "📑", + ":books:": "📚", + ":boom:": "💥", + ":boomerang:": "🪃", + ":boot:": "👢", + ":bosnia_herzegovina:": "🇧🇦", + ":botswana:": "🇧🇼", + ":bottle_with_popping_cork:": "🍾", + ":bouquet:": "💐", + ":bouvet_island:": "🇧🇻", + ":bow:": "🙇", + ":bow_and_arrow:": "🏹", + ":bow_tone1:": "🙇🏻", + ":bow_tone2:": "🙇🏼", + ":bow_tone3:": "🙇🏽", + ":bow_tone4:": "🙇🏾", + ":bow_tone5:": "🙇🏿", + ":bowing_man:": "🙇", + ":bowing_woman:": "🙇‍♀️", + ":bowl_with_spoon:": "🥣", + ":bowling:": "🎳", + ":boxing_glove:": "🥊", + ":boxing_gloves:": "🥊", + ":boy:": "👦", + ":boy_tone1:": "👦🏻", + ":boy_tone2:": "👦🏼", + ":boy_tone3:": "👦🏽", + ":boy_tone4:": "👦🏾", + ":boy_tone5:": "👦🏿", + ":bq:": "🇧🇶", + ":br:": "🇧🇷", + ":brain:": "🧠", + ":brazil:": "🇧🇷", + ":bread:": "🍞", + ":breast_feeding:": "🤱", + ":breast_feeding_dark_skin_tone:": "🤱🏿", + ":breast_feeding_light_skin_tone:": "🤱🏻", + ":breast_feeding_medium_dark_skin_tone:": "🤱🏾", + ":breast_feeding_medium_light_skin_tone:": "🤱🏼", + ":breast_feeding_medium_skin_tone:": "🤱🏽", + ":breast_feeding_tone1:": "🤱🏻", + ":breast_feeding_tone2:": "🤱🏼", + ":breast_feeding_tone3:": "🤱🏽", + ":breast_feeding_tone4:": "🤱🏾", + ":breast_feeding_tone5:": "🤱🏿", + ":bricks:": "🧱", + ":bride_with_veil:": "👰", + ":bride_with_veil_tone1:": "👰🏻", + ":bride_with_veil_tone2:": "👰🏼", + ":bride_with_veil_tone3:": "👰🏽", + ":bride_with_veil_tone4:": "👰🏾", + ":bride_with_veil_tone5:": "👰🏿", + ":bridge_at_night:": "🌉", + ":briefcase:": "💼", + ":briefs:": "🩲", + ":british_indian_ocean_territory:": "🇮🇴", + ":british_virgin_islands:": "🇻🇬", + ":broccoli:": "🥦", + ":broken_heart:": "💔", + ":broom:": "🧹", + ":brown_circle:": "🟤", + ":brown_heart:": "🤎", + ":brown_square:": "🟫", + ":brunei:": "🇧🇳", + ":bs:": "🇧🇸", + ":bt:": "🇧🇹", + ":bubble_tea:": "🧋", + ":bucket:": "🪣", + ":bug:": "🐛", + ":building_construction:": "🏗️", + ":bulb:": "💡", + ":bulgaria:": "🇧🇬", + ":bullettrain_front:": "🚅", + ":bullettrain_side:": "🚄", + ":burkina_faso:": "🇧🇫", + ":burrito:": "🌯", + ":burundi:": "🇧🇮", + ":bus:": "🚌", + ":business_suit_levitating:": "🕴", + ":busstop:": "🚏", + ":bust_in_silhouette:": "👤", + ":busts_in_silhouette:": "👥", + ":butter:": "🧈", + ":butterfly:": "🦋", + ":bv:": "🇧🇻", + ":bw:": "🇧🇼", + ":by:": "🇧🇾", + ":bz:": "🇧🇿", + ":ca:": "🇨🇦", + ":cactus:": "🌵", + ":cake:": "🍰", + ":calendar:": "📆", + ":calendar_spiral:": "🗓️", + ":call_me:": "🤙", + ":call_me_hand:": "🤙", + ":call_me_hand_tone1:": "🤙🏻", + ":call_me_hand_tone2:": "🤙🏼", + ":call_me_hand_tone3:": "🤙🏽", + ":call_me_hand_tone4:": "🤙🏾", + ":call_me_hand_tone5:": "🤙🏿", + ":call_me_tone1:": "🤙🏻", + ":call_me_tone2:": "🤙🏼", + ":call_me_tone3:": "🤙🏽", + ":call_me_tone4:": "🤙🏾", + ":call_me_tone5:": "🤙🏿", + ":calling:": "📲", + ":cambodia:": "🇰🇭", + ":camel:": "🐫", + ":camera:": "📷", + ":camera_flash:": "📸", + ":camera_with_flash:": "📸", + ":cameroon:": "🇨🇲", + ":camping:": "🏕️", + ":canada:": "🇨🇦", + ":canary_islands:": "🇮🇨", + ":cancer:": "♋", + ":candle:": "🕯️", + ":candy:": "🍬", + ":canned_food:": "🥫", + ":canoe:": "🛶", + ":cape_verde:": "🇨🇻", + ":capital_abcd:": "🔠", + ":capricorn:": "♑", + ":car:": "🚗", + ":card_box:": "🗃️", + ":card_file_box:": "🗃️", + ":card_index:": "📇", + ":card_index_dividers:": "🗂️", + ":caribbean_netherlands:": "🇧🇶", + ":carousel_horse:": "🎠", + ":carpentry_saw:": "🪚", + ":carrot:": "🥕", + ":cartwheel:": "🤸", + ":cartwheel_tone1:": "🤸🏻", + ":cartwheel_tone2:": "🤸🏼", + ":cartwheel_tone3:": "🤸🏽", + ":cartwheel_tone4:": "🤸🏾", + ":cartwheel_tone5:": "🤸🏿", + ":cat2:": "🐈", + ":cat:": "🐱", + ":cayman_islands:": "🇰🇾", + ":cc:": "🇨🇨", + ":cd:": "💿", + ":central_african_republic:": "🇨🇫", + ":ceuta_melilla:": "🇪🇦", + ":cf:": "🇨🇫", + ":cg:": "🇨🇬", + ":ch:": "🇨🇭", + ":chad:": "🇹🇩", + ":chains:": "⛓️", + ":chair:": "🪑", + ":champagne:": "🍾", + ":champagne_glass:": "🥂", + ":chart:": "💹", + ":chart_with_downwards_trend:": "📉", + ":chart_with_upwards_trend:": "📈", + ":checkered_flag:": "🏁", + ":cheese:": "🧀", + ":cheese_wedge:": "🧀", + ":cherries:": "🍒", + ":cherry_blossom:": "🌸", + ":chess_pawn:": "♟️", + ":chestnut:": "🌰", + ":chicken:": "🐔", + ":child:": "🧒", + ":child_dark_skin_tone:": "🧒🏿", + ":child_light_skin_tone:": "🧒🏻", + ":child_medium_dark_skin_tone:": "🧒🏾", + ":child_medium_light_skin_tone:": "🧒🏼", + ":child_medium_skin_tone:": "🧒🏽", + ":child_tone1:": "🧒🏻", + ":child_tone2:": "🧒🏼", + ":child_tone3:": "🧒🏽", + ":child_tone4:": "🧒🏾", + ":child_tone5:": "🧒🏿", + ":children_crossing:": "🚸", + ":chile:": "🇨🇱", + ":china:": "🇨🇳", + ":chipmunk:": "🐿️", + ":chocolate_bar:": "🍫", + ":chopsticks:": "🥢", + ":christmas_island:": "🇨🇽", + ":christmas_tree:": "🎄", + ":church:": "⛪", + ":ci:": "🇨🇮", + ":cinema:": "🎦", + ":circus_tent:": "🎪", + ":city_dusk:": "🌆", + ":city_sunrise:": "🌇", + ":city_sunset:": "🌇", + ":cityscape:": "🏙️", + ":ck:": "🇨🇰", + ":cl:": "🆑", + ":clamp:": "🗜", + ":clap:": "👏", + ":clap_tone1:": "👏🏻", + ":clap_tone2:": "👏🏼", + ":clap_tone3:": "👏🏽", + ":clap_tone4:": "👏🏾", + ":clap_tone5:": "👏🏿", + ":clapper:": "🎬", + ":classical_building:": "🏛️", + ":clinking_glass:": "🥂", + ":clinking_glasses:": "🥂", + ":clipboard:": "📋", + ":clipperton_island:": "🇨🇵", + ":clock1030:": "🕥", + ":clock10:": "🕙", + ":clock1130:": "🕦", + ":clock11:": "🕚", + ":clock1230:": "🕧", + ":clock12:": "🕛", + ":clock130:": "🕜", + ":clock1:": "🕐", + ":clock230:": "🕝", + ":clock2:": "🕑", + ":clock330:": "🕞", + ":clock3:": "🕒", + ":clock430:": "🕟", + ":clock4:": "🕓", + ":clock530:": "🕠", + ":clock5:": "🕔", + ":clock630:": "🕡", + ":clock6:": "🕕", + ":clock730:": "🕢", + ":clock7:": "🕖", + ":clock830:": "🕣", + ":clock8:": "🕗", + ":clock930:": "🕤", + ":clock9:": "🕘", + ":clock:": "🕰️", + ":closed_book:": "📕", + ":closed_lock_with_key:": "🔐", + ":closed_umbrella:": "🌂", + ":cloud:": "☁️", + ":cloud_lightning:": "🌩️", + ":cloud_rain:": "🌧️", + ":cloud_snow:": "🌨️", + ":cloud_tornado:": "🌪️", + ":cloud_with_lightning:": "🌩️", + ":cloud_with_lightning_and_rain:": "⛈", + ":cloud_with_rain:": "🌧️", + ":cloud_with_snow:": "🌨️", + ":cloud_with_tornado:": "🌪️", + ":clown:": "🤡", + ":clown_face:": "🤡", + ":clubs:": "♣️", + ":cm:": "🇨🇲", + ":cn:": "🇨🇳", + ":co:": "🇨🇴", + ":coat:": "🧥", + ":cockroach:": "🪳", + ":cocktail:": "🍸", + ":coconut:": "🥥", + ":cocos_islands:": "🇨🇨", + ":coffee:": "☕", + ":coffin:": "⚰️", + ":coin:": "🪙", + ":cold_face:": "🥶", + ":cold_sweat:": "😰", + ":colombia:": "🇨🇴", + ":comet:": "☄️", + ":comoros:": "🇰🇲", + ":compass:": "🧭", + ":compression:": "🗜️", + ":computer:": "💻", + ":computer_mouse:": "🖱", + ":confetti_ball:": "🎊", + ":confounded:": "😖", + ":confused:": "😕", + ":congo:": "🇨🇩", + ":congo_brazzaville:": "🇨🇬", + ":congo_kinshasa:": "🇨🇩", + ":congratulations:": "㊗️", + ":construction:": "🚧", + ":construction_site:": "🏗️", + ":construction_worker:": "👷", + ":construction_worker_man:": "👷", + ":construction_worker_tone1:": "👷🏻", + ":construction_worker_tone2:": "👷🏼", + ":construction_worker_tone3:": "👷🏽", + ":construction_worker_tone4:": "👷🏾", + ":construction_worker_tone5:": "👷🏿", + ":construction_worker_woman:": "👷‍♀️", + ":control_knobs:": "🎛️", + ":convenience_store:": "🏪", + ":cook:": "🧑‍🍳", + ":cook_dark_skin_tone:": "🧑🏿‍🍳", + ":cook_islands:": "🇨🇰", + ":cook_light_skin_tone:": "🧑🏻‍🍳", + ":cook_medium_dark_skin_tone:": "🧑🏾‍🍳", + ":cook_medium_light_skin_tone:": "🧑🏼‍🍳", + ":cook_medium_skin_tone:": "🧑🏽‍🍳", + ":cook_tone1:": "🧑🏻‍🍳", + ":cook_tone2:": "🧑🏼‍🍳", + ":cook_tone3:": "🧑🏽‍🍳", + ":cook_tone4:": "🧑🏾‍🍳", + ":cook_tone5:": "🧑🏿‍🍳", + ":cookie:": "🍪", + ":cooking:": "🍳", + ":cool:": "🆒", + ":cop:": "👮", + ":cop_tone1:": "👮🏻", + ":cop_tone2:": "👮🏼", + ":cop_tone3:": "👮🏽", + ":cop_tone4:": "👮🏾", + ":cop_tone5:": "👮🏿", + ":copyright:": "©️", + ":corn:": "🌽", + ":costa_rica:": "🇨🇷", + ":cote_divoire:": "🇨🇮", + ":couch:": "🛋️", + ":couch_and_lamp:": "🛋️", + ":couple:": "👫", + ":couple_mm:": "👨‍❤️‍👨", + ":couple_with_heart:": "💑", + ":couple_with_heart_dark_skin_tone:": "💑🏿", + ":couple_with_heart_light_skin_tone:": "💑🏻", + ":couple_with_heart_man_man:": "👨‍❤️‍👨", + ":couple_with_heart_man_man_dark_skin_tone:": "👨🏿‍❤️‍👨🏿", + ":couple_with_heart_man_man_dark_skin_tone_light_skin_tone:": "👨🏿‍❤️‍👨🏻", + ":couple_with_heart_man_man_dark_skin_tone_medium_dark_skin_tone:": "👨🏿‍❤️‍👨🏾", + ":couple_with_heart_man_man_dark_skin_tone_medium_light_skin_tone:": "👨🏿‍❤️‍👨🏼", + ":couple_with_heart_man_man_dark_skin_tone_medium_skin_tone:": "👨🏿‍❤️‍👨🏽", + ":couple_with_heart_man_man_light_skin_tone:": "👨🏻‍❤️‍👨🏻", + ":couple_with_heart_man_man_light_skin_tone_dark_skin_tone:": "👨🏻‍❤️‍👨🏿", + ":couple_with_heart_man_man_light_skin_tone_medium_dark_skin_tone:": "👨🏻‍❤️‍👨🏾", + ":couple_with_heart_man_man_light_skin_tone_medium_light_skin_tone:": "👨🏻‍❤️‍👨🏼", + ":couple_with_heart_man_man_light_skin_tone_medium_skin_tone:": "👨🏻‍❤️‍👨🏽", + ":couple_with_heart_man_man_medium_dark_skin_tone:": "👨🏾‍❤️‍👨🏾", + ":couple_with_heart_man_man_medium_dark_skin_tone_dark_skin_tone:": "👨🏾‍❤️‍👨🏿", + ":couple_with_heart_man_man_medium_dark_skin_tone_light_skin_tone:": "👨🏾‍❤️‍👨🏻", + ":couple_with_heart_man_man_medium_dark_skin_tone_medium_light_skin_tone:": "👨🏾‍❤️‍👨🏼", + ":couple_with_heart_man_man_medium_dark_skin_tone_medium_skin_tone:": "👨🏾‍❤️‍👨🏽", + ":couple_with_heart_man_man_medium_light_skin_tone:": "👨🏼‍❤️‍👨🏼", + ":couple_with_heart_man_man_medium_light_skin_tone_dark_skin_tone:": "👨🏼‍❤️‍👨🏿", + ":couple_with_heart_man_man_medium_light_skin_tone_light_skin_tone:": "👨🏼‍❤️‍👨🏻", + ":couple_with_heart_man_man_medium_light_skin_tone_medium_dark_skin_tone:": "👨🏼‍❤️‍👨🏾", + ":couple_with_heart_man_man_medium_light_skin_tone_medium_skin_tone:": "👨🏼‍❤️‍👨🏽", + ":couple_with_heart_man_man_medium_skin_tone:": "👨🏽‍❤️‍👨🏽", + ":couple_with_heart_man_man_medium_skin_tone_dark_skin_tone:": "👨🏽‍❤️‍👨🏿", + ":couple_with_heart_man_man_medium_skin_tone_light_skin_tone:": "👨🏽‍❤️‍👨🏻", + ":couple_with_heart_man_man_medium_skin_tone_medium_dark_skin_tone:": "👨🏽‍❤️‍👨🏾", + ":couple_with_heart_man_man_medium_skin_tone_medium_light_skin_tone:": "👨🏽‍❤️‍👨🏼", + ":couple_with_heart_man_man_tone1:": "👨🏻‍❤️‍👨🏻", + ":couple_with_heart_man_man_tone1_tone2:": "👨🏻‍❤️‍👨🏼", + ":couple_with_heart_man_man_tone1_tone3:": "👨🏻‍❤️‍👨🏽", + ":couple_with_heart_man_man_tone1_tone4:": "👨🏻‍❤️‍👨🏾", + ":couple_with_heart_man_man_tone1_tone5:": "👨🏻‍❤️‍👨🏿", + ":couple_with_heart_man_man_tone2:": "👨🏼‍❤️‍👨🏼", + ":couple_with_heart_man_man_tone2_tone1:": "👨🏼‍❤️‍👨🏻", + ":couple_with_heart_man_man_tone2_tone3:": "👨🏼‍❤️‍👨🏽", + ":couple_with_heart_man_man_tone2_tone4:": "👨🏼‍❤️‍👨🏾", + ":couple_with_heart_man_man_tone2_tone5:": "👨🏼‍❤️‍👨🏿", + ":couple_with_heart_man_man_tone3:": "👨🏽‍❤️‍👨🏽", + ":couple_with_heart_man_man_tone3_tone1:": "👨🏽‍❤️‍👨🏻", + ":couple_with_heart_man_man_tone3_tone2:": "👨🏽‍❤️‍👨🏼", + ":couple_with_heart_man_man_tone3_tone4:": "👨🏽‍❤️‍👨🏾", + ":couple_with_heart_man_man_tone3_tone5:": "👨🏽‍❤️‍👨🏿", + ":couple_with_heart_man_man_tone4:": "👨🏾‍❤️‍👨🏾", + ":couple_with_heart_man_man_tone4_tone1:": "👨🏾‍❤️‍👨🏻", + ":couple_with_heart_man_man_tone4_tone2:": "👨🏾‍❤️‍👨🏼", + ":couple_with_heart_man_man_tone4_tone3:": "👨🏾‍❤️‍👨🏽", + ":couple_with_heart_man_man_tone4_tone5:": "👨🏾‍❤️‍👨🏿", + ":couple_with_heart_man_man_tone5:": "👨🏿‍❤️‍👨🏿", + ":couple_with_heart_man_man_tone5_tone1:": "👨🏿‍❤️‍👨🏻", + ":couple_with_heart_man_man_tone5_tone2:": "👨🏿‍❤️‍👨🏼", + ":couple_with_heart_man_man_tone5_tone3:": "👨🏿‍❤️‍👨🏽", + ":couple_with_heart_man_man_tone5_tone4:": "👨🏿‍❤️‍👨🏾", + ":couple_with_heart_medium_dark_skin_tone:": "💑🏾", + ":couple_with_heart_medium_light_skin_tone:": "💑🏼", + ":couple_with_heart_medium_skin_tone:": "💑🏽", + ":couple_with_heart_mm:": "👨‍❤️‍👨", + ":couple_with_heart_person_person_dark_skin_tone_light_skin_tone:": "🧑🏿‍❤️‍🧑🏻", + ":couple_with_heart_person_person_dark_skin_tone_medium_dark_skin_tone:": "🧑🏿‍❤️‍🧑🏾", + ":couple_with_heart_person_person_dark_skin_tone_medium_light_skin_tone:": "🧑🏿‍❤️‍🧑🏼", + ":couple_with_heart_person_person_dark_skin_tone_medium_skin_tone:": "🧑🏿‍❤️‍🧑🏽", + ":couple_with_heart_person_person_light_skin_tone_dark_skin_tone:": "🧑🏻‍❤️‍🧑🏿", + ":couple_with_heart_person_person_light_skin_tone_medium_dark_skin_tone:": "🧑🏻‍❤️‍🧑🏾", + ":couple_with_heart_person_person_light_skin_tone_medium_light_skin_tone:": "🧑🏻‍❤️‍🧑🏼", + ":couple_with_heart_person_person_light_skin_tone_medium_skin_tone:": "🧑🏻‍❤️‍🧑🏽", + ":couple_with_heart_person_person_medium_dark_skin_tone_dark_skin_tone:": "🧑🏾‍❤️‍🧑🏿", + ":couple_with_heart_person_person_medium_dark_skin_tone_light_skin_tone:": "🧑🏾‍❤️‍🧑🏻", + ":couple_with_heart_person_person_medium_dark_skin_tone_medium_light_skin_tone:": "🧑🏾‍❤️‍🧑🏼", + ":couple_with_heart_person_person_medium_dark_skin_tone_medium_skin_tone:": "🧑🏾‍❤️‍🧑🏽", + ":couple_with_heart_person_person_medium_light_skin_tone_dark_skin_tone:": "🧑🏼‍❤️‍🧑🏿", + ":couple_with_heart_person_person_medium_light_skin_tone_light_skin_tone:": "🧑🏼‍❤️‍🧑🏻", + ":couple_with_heart_person_person_medium_light_skin_tone_medium_dark_skin_tone:": "🧑🏼‍❤️‍🧑🏾", + ":couple_with_heart_person_person_medium_light_skin_tone_medium_skin_tone:": "🧑🏼‍❤️‍🧑🏽", + ":couple_with_heart_person_person_medium_skin_tone_dark_skin_tone:": "🧑🏽‍❤️‍🧑🏿", + ":couple_with_heart_person_person_medium_skin_tone_light_skin_tone:": "🧑🏽‍❤️‍🧑🏻", + ":couple_with_heart_person_person_medium_skin_tone_medium_dark_skin_tone:": "🧑🏽‍❤️‍🧑🏾", + ":couple_with_heart_person_person_medium_skin_tone_medium_light_skin_tone:": "🧑🏽‍❤️‍🧑🏼", + ":couple_with_heart_person_person_tone1_tone2:": "🧑🏻‍❤️‍🧑🏼", + ":couple_with_heart_person_person_tone1_tone3:": "🧑🏻‍❤️‍🧑🏽", + ":couple_with_heart_person_person_tone1_tone4:": "🧑🏻‍❤️‍🧑🏾", + ":couple_with_heart_person_person_tone1_tone5:": "🧑🏻‍❤️‍🧑🏿", + ":couple_with_heart_person_person_tone2_tone1:": "🧑🏼‍❤️‍🧑🏻", + ":couple_with_heart_person_person_tone2_tone3:": "🧑🏼‍❤️‍🧑🏽", + ":couple_with_heart_person_person_tone2_tone4:": "🧑🏼‍❤️‍🧑🏾", + ":couple_with_heart_person_person_tone2_tone5:": "🧑🏼‍❤️‍🧑🏿", + ":couple_with_heart_person_person_tone3_tone1:": "🧑🏽‍❤️‍🧑🏻", + ":couple_with_heart_person_person_tone3_tone2:": "🧑🏽‍❤️‍🧑🏼", + ":couple_with_heart_person_person_tone3_tone4:": "🧑🏽‍❤️‍🧑🏾", + ":couple_with_heart_person_person_tone3_tone5:": "🧑🏽‍❤️‍🧑🏿", + ":couple_with_heart_person_person_tone4_tone1:": "🧑🏾‍❤️‍🧑🏻", + ":couple_with_heart_person_person_tone4_tone2:": "🧑🏾‍❤️‍🧑🏼", + ":couple_with_heart_person_person_tone4_tone3:": "🧑🏾‍❤️‍🧑🏽", + ":couple_with_heart_person_person_tone4_tone5:": "🧑🏾‍❤️‍🧑🏿", + ":couple_with_heart_person_person_tone5_tone1:": "🧑🏿‍❤️‍🧑🏻", + ":couple_with_heart_person_person_tone5_tone2:": "🧑🏿‍❤️‍🧑🏼", + ":couple_with_heart_person_person_tone5_tone3:": "🧑🏿‍❤️‍🧑🏽", + ":couple_with_heart_person_person_tone5_tone4:": "🧑🏿‍❤️‍🧑🏾", + ":couple_with_heart_tone1:": "💑🏻", + ":couple_with_heart_tone2:": "💑🏼", + ":couple_with_heart_tone3:": "💑🏽", + ":couple_with_heart_tone4:": "💑🏾", + ":couple_with_heart_tone5:": "💑🏿", + ":couple_with_heart_woman_man:": "👩‍❤️‍👨", + ":couple_with_heart_woman_man_dark_skin_tone:": "👩🏿‍❤️‍👨🏿", + ":couple_with_heart_woman_man_dark_skin_tone_light_skin_tone:": "👩🏿‍❤️‍👨🏻", + ":couple_with_heart_woman_man_dark_skin_tone_medium_dark_skin_tone:": "👩🏿‍❤️‍👨🏾", + ":couple_with_heart_woman_man_dark_skin_tone_medium_light_skin_tone:": "👩🏿‍❤️‍👨🏼", + ":couple_with_heart_woman_man_dark_skin_tone_medium_skin_tone:": "👩🏿‍❤️‍👨🏽", + ":couple_with_heart_woman_man_light_skin_tone:": "👩🏻‍❤️‍👨🏻", + ":couple_with_heart_woman_man_light_skin_tone_dark_skin_tone:": "👩🏻‍❤️‍👨🏿", + ":couple_with_heart_woman_man_light_skin_tone_medium_dark_skin_tone:": "👩🏻‍❤️‍👨🏾", + ":couple_with_heart_woman_man_light_skin_tone_medium_light_skin_tone:": "👩🏻‍❤️‍👨🏼", + ":couple_with_heart_woman_man_light_skin_tone_medium_skin_tone:": "👩🏻‍❤️‍👨🏽", + ":couple_with_heart_woman_man_medium_dark_skin_tone:": "👩🏾‍❤️‍👨🏾", + ":couple_with_heart_woman_man_medium_dark_skin_tone_dark_skin_tone:": "👩🏾‍❤️‍👨🏿", + ":couple_with_heart_woman_man_medium_dark_skin_tone_light_skin_tone:": "👩🏾‍❤️‍👨🏻", + ":couple_with_heart_woman_man_medium_dark_skin_tone_medium_light_skin_tone:": "👩🏾‍❤️‍👨🏼", + ":couple_with_heart_woman_man_medium_dark_skin_tone_medium_skin_tone:": "👩🏾‍❤️‍👨🏽", + ":couple_with_heart_woman_man_medium_light_skin_tone:": "👩🏼‍❤️‍👨🏼", + ":couple_with_heart_woman_man_medium_light_skin_tone_dark_skin_tone:": "👩🏼‍❤️‍👨🏿", + ":couple_with_heart_woman_man_medium_light_skin_tone_light_skin_tone:": "👩🏼‍❤️‍👨🏻", + ":couple_with_heart_woman_man_medium_light_skin_tone_medium_dark_skin_tone:": "👩🏼‍❤️‍👨🏾", + ":couple_with_heart_woman_man_medium_light_skin_tone_medium_skin_tone:": "👩🏼‍❤️‍👨🏽", + ":couple_with_heart_woman_man_medium_skin_tone:": "👩🏽‍❤️‍👨🏽", + ":couple_with_heart_woman_man_medium_skin_tone_dark_skin_tone:": "👩🏽‍❤️‍👨🏿", + ":couple_with_heart_woman_man_medium_skin_tone_light_skin_tone:": "👩🏽‍❤️‍👨🏻", + ":couple_with_heart_woman_man_medium_skin_tone_medium_dark_skin_tone:": "👩🏽‍❤️‍👨🏾", + ":couple_with_heart_woman_man_medium_skin_tone_medium_light_skin_tone:": "👩🏽‍❤️‍👨🏼", + ":couple_with_heart_woman_man_tone1:": "👩🏻‍❤️‍👨🏻", + ":couple_with_heart_woman_man_tone1_tone2:": "👩🏻‍❤️‍👨🏼", + ":couple_with_heart_woman_man_tone1_tone3:": "👩🏻‍❤️‍👨🏽", + ":couple_with_heart_woman_man_tone1_tone4:": "👩🏻‍❤️‍👨🏾", + ":couple_with_heart_woman_man_tone1_tone5:": "👩🏻‍❤️‍👨🏿", + ":couple_with_heart_woman_man_tone2:": "👩🏼‍❤️‍👨🏼", + ":couple_with_heart_woman_man_tone2_tone1:": "👩🏼‍❤️‍👨🏻", + ":couple_with_heart_woman_man_tone2_tone3:": "👩🏼‍❤️‍👨🏽", + ":couple_with_heart_woman_man_tone2_tone4:": "👩🏼‍❤️‍👨🏾", + ":couple_with_heart_woman_man_tone2_tone5:": "👩🏼‍❤️‍👨🏿", + ":couple_with_heart_woman_man_tone3:": "👩🏽‍❤️‍👨🏽", + ":couple_with_heart_woman_man_tone3_tone1:": "👩🏽‍❤️‍👨🏻", + ":couple_with_heart_woman_man_tone3_tone2:": "👩🏽‍❤️‍👨🏼", + ":couple_with_heart_woman_man_tone3_tone4:": "👩🏽‍❤️‍👨🏾", + ":couple_with_heart_woman_man_tone3_tone5:": "👩🏽‍❤️‍👨🏿", + ":couple_with_heart_woman_man_tone4:": "👩🏾‍❤️‍👨🏾", + ":couple_with_heart_woman_man_tone4_tone1:": "👩🏾‍❤️‍👨🏻", + ":couple_with_heart_woman_man_tone4_tone2:": "👩🏾‍❤️‍👨🏼", + ":couple_with_heart_woman_man_tone4_tone3:": "👩🏾‍❤️‍👨🏽", + ":couple_with_heart_woman_man_tone4_tone5:": "👩🏾‍❤️‍👨🏿", + ":couple_with_heart_woman_man_tone5:": "👩🏿‍❤️‍👨🏿", + ":couple_with_heart_woman_man_tone5_tone1:": "👩🏿‍❤️‍👨🏻", + ":couple_with_heart_woman_man_tone5_tone2:": "👩🏿‍❤️‍👨🏼", + ":couple_with_heart_woman_man_tone5_tone3:": "👩🏿‍❤️‍👨🏽", + ":couple_with_heart_woman_man_tone5_tone4:": "👩🏿‍❤️‍👨🏾", + ":couple_with_heart_woman_woman:": "👩‍❤️‍👩", + ":couple_with_heart_woman_woman_dark_skin_tone:": "👩🏿‍❤️‍👩🏿", + ":couple_with_heart_woman_woman_dark_skin_tone_light_skin_tone:": "👩🏿‍❤️‍👩🏻", + ":couple_with_heart_woman_woman_dark_skin_tone_medium_dark_skin_tone:": "👩🏿‍❤️‍👩🏾", + ":couple_with_heart_woman_woman_dark_skin_tone_medium_light_skin_tone:": "👩🏿‍❤️‍👩🏼", + ":couple_with_heart_woman_woman_dark_skin_tone_medium_skin_tone:": "👩🏿‍❤️‍👩🏽", + ":couple_with_heart_woman_woman_light_skin_tone:": "👩🏻‍❤️‍👩🏻", + ":couple_with_heart_woman_woman_light_skin_tone_dark_skin_tone:": "👩🏻‍❤️‍👩🏿", + ":couple_with_heart_woman_woman_light_skin_tone_medium_dark_skin_tone:": "👩🏻‍❤️‍👩🏾", + ":couple_with_heart_woman_woman_light_skin_tone_medium_light_skin_tone:": "👩🏻‍❤️‍👩🏼", + ":couple_with_heart_woman_woman_light_skin_tone_medium_skin_tone:": "👩🏻‍❤️‍👩🏽", + ":couple_with_heart_woman_woman_medium_dark_skin_tone:": "👩🏾‍❤️‍👩🏾", + ":couple_with_heart_woman_woman_medium_dark_skin_tone_dark_skin_tone:": "👩🏾‍❤️‍👩🏿", + ":couple_with_heart_woman_woman_medium_dark_skin_tone_light_skin_tone:": "👩🏾‍❤️‍👩🏻", + ":couple_with_heart_woman_woman_medium_dark_skin_tone_medium_light_skin_tone:": "👩🏾‍❤️‍👩🏼", + ":couple_with_heart_woman_woman_medium_dark_skin_tone_medium_skin_tone:": "👩🏾‍❤️‍👩🏽", + ":couple_with_heart_woman_woman_medium_light_skin_tone:": "👩🏼‍❤️‍👩🏼", + ":couple_with_heart_woman_woman_medium_light_skin_tone_dark_skin_tone:": "👩🏼‍❤️‍👩🏿", + ":couple_with_heart_woman_woman_medium_light_skin_tone_light_skin_tone:": "👩🏼‍❤️‍👩🏻", + ":couple_with_heart_woman_woman_medium_light_skin_tone_medium_dark_skin_tone:": "👩🏼‍❤️‍👩🏾", + ":couple_with_heart_woman_woman_medium_light_skin_tone_medium_skin_tone:": "👩🏼‍❤️‍👩🏽", + ":couple_with_heart_woman_woman_medium_skin_tone:": "👩🏽‍❤️‍👩🏽", + ":couple_with_heart_woman_woman_medium_skin_tone_dark_skin_tone:": "👩🏽‍❤️‍👩🏿", + ":couple_with_heart_woman_woman_medium_skin_tone_light_skin_tone:": "👩🏽‍❤️‍👩🏻", + ":couple_with_heart_woman_woman_medium_skin_tone_medium_dark_skin_tone:": "👩🏽‍❤️‍👩🏾", + ":couple_with_heart_woman_woman_medium_skin_tone_medium_light_skin_tone:": "👩🏽‍❤️‍👩🏼", + ":couple_with_heart_woman_woman_tone1:": "👩🏻‍❤️‍👩🏻", + ":couple_with_heart_woman_woman_tone1_tone2:": "👩🏻‍❤️‍👩🏼", + ":couple_with_heart_woman_woman_tone1_tone3:": "👩🏻‍❤️‍👩🏽", + ":couple_with_heart_woman_woman_tone1_tone4:": "👩🏻‍❤️‍👩🏾", + ":couple_with_heart_woman_woman_tone1_tone5:": "👩🏻‍❤️‍👩🏿", + ":couple_with_heart_woman_woman_tone2:": "👩🏼‍❤️‍👩🏼", + ":couple_with_heart_woman_woman_tone2_tone1:": "👩🏼‍❤️‍👩🏻", + ":couple_with_heart_woman_woman_tone2_tone3:": "👩🏼‍❤️‍👩🏽", + ":couple_with_heart_woman_woman_tone2_tone4:": "👩🏼‍❤️‍👩🏾", + ":couple_with_heart_woman_woman_tone2_tone5:": "👩🏼‍❤️‍👩🏿", + ":couple_with_heart_woman_woman_tone3:": "👩🏽‍❤️‍👩🏽", + ":couple_with_heart_woman_woman_tone3_tone1:": "👩🏽‍❤️‍👩🏻", + ":couple_with_heart_woman_woman_tone3_tone2:": "👩🏽‍❤️‍👩🏼", + ":couple_with_heart_woman_woman_tone3_tone4:": "👩🏽‍❤️‍👩🏾", + ":couple_with_heart_woman_woman_tone3_tone5:": "👩🏽‍❤️‍👩🏿", + ":couple_with_heart_woman_woman_tone4:": "👩🏾‍❤️‍👩🏾", + ":couple_with_heart_woman_woman_tone4_tone1:": "👩🏾‍❤️‍👩🏻", + ":couple_with_heart_woman_woman_tone4_tone2:": "👩🏾‍❤️‍👩🏼", + ":couple_with_heart_woman_woman_tone4_tone3:": "👩🏾‍❤️‍👩🏽", + ":couple_with_heart_woman_woman_tone4_tone5:": "👩🏾‍❤️‍👩🏿", + ":couple_with_heart_woman_woman_tone5:": "👩🏿‍❤️‍👩🏿", + ":couple_with_heart_woman_woman_tone5_tone1:": "👩🏿‍❤️‍👩🏻", + ":couple_with_heart_woman_woman_tone5_tone2:": "👩🏿‍❤️‍👩🏼", + ":couple_with_heart_woman_woman_tone5_tone3:": "👩🏿‍❤️‍👩🏽", + ":couple_with_heart_woman_woman_tone5_tone4:": "👩🏿‍❤️‍👩🏾", + ":couple_with_heart_ww:": "👩‍❤️‍👩", + ":couple_ww:": "👩‍❤️‍👩", + ":couplekiss:": "💏", + ":couplekiss_man_man:": "👨‍❤️‍💋‍👨", + ":couplekiss_man_woman:": "💏", + ":couplekiss_mm:": "👨‍❤️‍💋‍👨", + ":couplekiss_woman_woman:": "👩‍❤️‍💋‍👩", + ":couplekiss_ww:": "👩‍❤️‍💋‍👩", + ":cow2:": "🐄", + ":cow:": "🐮", + ":cowboy:": "🤠", + ":cowboy_hat_face:": "🤠", + ":cp:": "🇨🇵", + ":cr:": "🇨🇷", + ":crab:": "🦀", + ":crayon:": "🖍️", + ":credit_card:": "💳", + ":crescent_moon:": "🌙", + ":cricket:": "🦗", + ":cricket_bat_ball:": "🏏", + ":cricket_game:": "🏏", + ":croatia:": "🇭🇷", + ":crocodile:": "🐊", + ":croissant:": "🥐", + ":cross:": "✝️", + ":crossed_fingers:": "🤞", + ":crossed_flags:": "🎌", + ":crossed_swords:": "⚔️", + ":crown:": "👑", + ":cruise_ship:": "🛳️", + ":cry:": "😢", + ":crying_cat_face:": "😿", + ":crystal_ball:": "🔮", + ":cu:": "🇨🇺", + ":cuba:": "🇨🇺", + ":cucumber:": "🥒", + ":cup_with_straw:": "🥤", + ":cupcake:": "🧁", + ":cupid:": "💘", + ":curacao:": "🇨🇼", + ":curling_stone:": "🥌", + ":curly_haired:": "🦱", + ":curly_loop:": "➰", + ":currency_exchange:": "💱", + ":curry:": "🍛", + ":custard:": "🍮", + ":customs:": "🛃", + ":cut_of_meat:": "🥩", + ":cv:": "🇨🇻", + ":cw:": "🇨🇼", + ":cx:": "🇨🇽", + ":cy:": "🇨🇾", + ":cyclone:": "🌀", + ":cyprus:": "🇨🇾", + ":cz:": "🇨🇿", + ":czech_republic:": "🇨🇿", + ":dagger:": "🗡️", + ":dagger_knife:": "🗡️", + ":dancer:": "💃", + ":dancer_tone1:": "💃🏻", + ":dancer_tone2:": "💃🏼", + ":dancer_tone3:": "💃🏽", + ":dancer_tone4:": "💃🏾", + ":dancer_tone5:": "💃🏿", + ":dancers:": "👯", + ":dancing_men:": "👯‍♂️", + ":dancing_women:": "👯", + ":dango:": "🍡", + ":dark_sunglasses:": "🕶️", + ":dart:": "🎯", + ":dash:": "💨", + ":date:": "📅", + ":de:": "🇩🇪", + ":deaf_man:": "🧏‍♂️", + ":deaf_man_dark_skin_tone:": "🧏🏿‍♂️", + ":deaf_man_light_skin_tone:": "🧏🏻‍♂️", + ":deaf_man_medium_dark_skin_tone:": "🧏🏾‍♂️", + ":deaf_man_medium_light_skin_tone:": "🧏🏼‍♂️", + ":deaf_man_medium_skin_tone:": "🧏🏽‍♂️", + ":deaf_man_tone1:": "🧏🏻‍♂️", + ":deaf_man_tone2:": "🧏🏼‍♂️", + ":deaf_man_tone3:": "🧏🏽‍♂️", + ":deaf_man_tone4:": "🧏🏾‍♂️", + ":deaf_man_tone5:": "🧏🏿‍♂️", + ":deaf_person:": "🧏", + ":deaf_person_dark_skin_tone:": "🧏🏿", + ":deaf_person_light_skin_tone:": "🧏🏻", + ":deaf_person_medium_dark_skin_tone:": "🧏🏾", + ":deaf_person_medium_light_skin_tone:": "🧏🏼", + ":deaf_person_medium_skin_tone:": "🧏🏽", + ":deaf_person_tone1:": "🧏🏻", + ":deaf_person_tone2:": "🧏🏼", + ":deaf_person_tone3:": "🧏🏽", + ":deaf_person_tone4:": "🧏🏾", + ":deaf_person_tone5:": "🧏🏿", + ":deaf_woman:": "🧏‍♀️", + ":deaf_woman_dark_skin_tone:": "🧏🏿‍♀️", + ":deaf_woman_light_skin_tone:": "🧏🏻‍♀️", + ":deaf_woman_medium_dark_skin_tone:": "🧏🏾‍♀️", + ":deaf_woman_medium_light_skin_tone:": "🧏🏼‍♀️", + ":deaf_woman_medium_skin_tone:": "🧏🏽‍♀️", + ":deaf_woman_tone1:": "🧏🏻‍♀️", + ":deaf_woman_tone2:": "🧏🏼‍♀️", + ":deaf_woman_tone3:": "🧏🏽‍♀️", + ":deaf_woman_tone4:": "🧏🏾‍♀️", + ":deaf_woman_tone5:": "🧏🏿‍♀️", + ":deciduous_tree:": "🌳", + ":deer:": "🦌", + ":denmark:": "🇩🇰", + ":department_store:": "🏬", + ":derelict_house:": "🏚", + ":derelict_house_building:": "🏚️", + ":desert:": "🏜️", + ":desert_island:": "🏝️", + ":desktop:": "🖥️", + ":desktop_computer:": "🖥️", + ":detective:": "🕵", + ":detective_tone1:": "🕵🏻", + ":detective_tone2:": "🕵🏼", + ":detective_tone3:": "🕵🏽", + ":detective_tone4:": "🕵🏾", + ":detective_tone5:": "🕵🏿", + ":dg:": "🇩🇬", + ":diamond_shape_with_a_dot_inside:": "💠", + ":diamonds:": "♦️", + ":diego_garcia:": "🇩🇬", + ":digit_eight:": "8️", + ":digit_five:": "5️", + ":digit_four:": "4️", + ":digit_nine:": "9️", + ":digit_one:": "1️", + ":digit_seven:": "7️", + ":digit_six:": "6️", + ":digit_three:": "3️", + ":digit_two:": "2️", + ":digit_zero:": "0️", + ":disappointed:": "😞", + ":disappointed_relieved:": "😥", + ":disguised_face:": "🥸", + ":dividers:": "🗂️", + ":diving_mask:": "🤿", + ":diya_lamp:": "🪔", + ":dizzy:": "💫", + ":dizzy_face:": "😵", + ":dj:": "🇩🇯", + ":djibouti:": "🇩🇯", + ":dk:": "🇩🇰", + ":dm:": "🇩🇲", + ":dna:": "🧬", + ":do:": "🇩🇴", + ":do_not_litter:": "🚯", + ":dodo:": "🦤", + ":dog2:": "🐕", + ":dog:": "🐶", + ":dollar:": "💵", + ":dolls:": "🎎", + ":dolphin:": "🐬", + ":dominica:": "🇩🇲", + ":dominican_republic:": "🇩🇴", + ":door:": "🚪", + ":double_vertical_bar:": "⏸️", + ":doughnut:": "🍩", + ":dove:": "🕊️", + ":dove_of_peace:": "🕊️", + ":dragon:": "🐉", + ":dragon_face:": "🐲", + ":dress:": "👗", + ":dromedary_camel:": "🐪", + ":drool:": "🤤", + ":drooling_face:": "🤤", + ":drop_of_blood:": "🩸", + ":droplet:": "💧", + ":drum:": "🥁", + ":drum_with_drumsticks:": "🥁", + ":duck:": "🦆", + ":dumpling:": "🥟", + ":dvd:": "📀", + ":dz:": "🇩🇿", + ":e-mail:": "📧", + ":ea:": "🇪🇦", + ":eagle:": "🦅", + ":ear:": "👂", + ":ear_of_rice:": "🌾", + ":ear_tone1:": "👂🏻", + ":ear_tone2:": "👂🏼", + ":ear_tone3:": "👂🏽", + ":ear_tone4:": "👂🏾", + ":ear_tone5:": "👂🏿", + ":ear_with_hearing_aid:": "🦻", + ":ear_with_hearing_aid_dark_skin_tone:": "🦻🏿", + ":ear_with_hearing_aid_light_skin_tone:": "🦻🏻", + ":ear_with_hearing_aid_medium_dark_skin_tone:": "🦻🏾", + ":ear_with_hearing_aid_medium_light_skin_tone:": "🦻🏼", + ":ear_with_hearing_aid_medium_skin_tone:": "🦻🏽", + ":ear_with_hearing_aid_tone1:": "🦻🏻", + ":ear_with_hearing_aid_tone2:": "🦻🏼", + ":ear_with_hearing_aid_tone3:": "🦻🏽", + ":ear_with_hearing_aid_tone4:": "🦻🏾", + ":ear_with_hearing_aid_tone5:": "🦻🏿", + ":earth_africa:": "🌍", + ":earth_americas:": "🌎", + ":earth_asia:": "🌏", + ":ec:": "🇪🇨", + ":ecuador:": "🇪🇨", + ":ee:": "🇪🇪", + ":eg:": "🇪🇬", + ":egg:": "🥚", + ":eggplant:": "🍆", + ":egypt:": "🇪🇬", + ":eh:": "🇪🇭", + ":eight:": "8️⃣", + ":eight_pointed_black_star:": "✴️", + ":eight_spoked_asterisk:": "✳️", + ":eject:": "⏏️", + ":eject_symbol:": "⏏️", + ":el_salvador:": "🇸🇻", + ":electric_plug:": "🔌", + ":elephant:": "🐘", + ":elevator:": "🛗", + ":elf:": "🧝", + ":elf_dark_skin_tone:": "🧝🏿", + ":elf_light_skin_tone:": "🧝🏻", + ":elf_medium_dark_skin_tone:": "🧝🏾", + ":elf_medium_light_skin_tone:": "🧝🏼", + ":elf_medium_skin_tone:": "🧝🏽", + ":elf_tone1:": "🧝🏻", + ":elf_tone2:": "🧝🏼", + ":elf_tone3:": "🧝🏽", + ":elf_tone4:": "🧝🏾", + ":elf_tone5:": "🧝🏿", + ":email:": "📧", + ":end:": "🔚", + ":england:": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", + ":envelope:": "✉️", + ":envelope_with_arrow:": "📩", + ":equatorial_guinea:": "🇬🇶", + ":er:": "🇪🇷", + ":eritrea:": "🇪🇷", + ":es:": "🇪🇸", + ":estonia:": "🇪🇪", + ":et:": "🇪🇹", + ":ethiopia:": "🇪🇹", + ":eu:": "🇪🇺", + ":euro:": "💶", + ":european_castle:": "🏰", + ":european_post_office:": "🏤", + ":european_union:": "🇪🇺", + ":evergreen_tree:": "🌲", + ":exclamation:": "❗", + ":expecting_woman:": "🤰", + ":expecting_woman_tone1:": "🤰🏻", + ":expecting_woman_tone2:": "🤰🏼", + ":expecting_woman_tone3:": "🤰🏽", + ":expecting_woman_tone4:": "🤰🏾", + ":expecting_woman_tone5:": "🤰🏿", + ":exploding_head:": "🤯", + ":expressionless:": "😑", + ":eye:": "👁️", + ":eye_in_speech_bubble:": "👁️‍🗨️", + ":eye_speech_bubble:": "👁‍🗨", + ":eyeglasses:": "👓", + ":eyes:": "👀", + ":face_exhaling:": "😮‍💨", + ":face_in_clouds:": "😶‍🌫️", + ":face_palm:": "🤦", + ":face_palm_tone1:": "🤦🏻", + ":face_palm_tone2:": "🤦🏼", + ":face_palm_tone3:": "🤦🏽", + ":face_palm_tone4:": "🤦🏾", + ":face_palm_tone5:": "🤦🏿", + ":face_vomiting:": "🤮", + ":face_with_cowboy_hat:": "🤠", + ":face_with_hand_over_mouth:": "🤭", + ":face_with_head_bandage:": "🤕", + ":face_with_monocle:": "🧐", + ":face_with_raised_eyebrow:": "🤨", + ":face_with_rolling_eyes:": "🙄", + ":face_with_spiral_eyes:": "😵‍💫", + ":face_with_symbols_over_mouth:": "🤬", + ":face_with_thermometer:": "🤒", + ":facepalm:": "🤦", + ":facepalm_tone1:": "🤦🏻", + ":facepalm_tone2:": "🤦🏼", + ":facepalm_tone3:": "🤦🏽", + ":facepalm_tone4:": "🤦🏾", + ":facepalm_tone5:": "🤦🏿", + ":factory:": "🏭", + ":factory_worker:": "🧑‍🏭", + ":factory_worker_dark_skin_tone:": "🧑🏿‍🏭", + ":factory_worker_light_skin_tone:": "🧑🏻‍🏭", + ":factory_worker_medium_dark_skin_tone:": "🧑🏾‍🏭", + ":factory_worker_medium_light_skin_tone:": "🧑🏼‍🏭", + ":factory_worker_medium_skin_tone:": "🧑🏽‍🏭", + ":factory_worker_tone1:": "🧑🏻‍🏭", + ":factory_worker_tone2:": "🧑🏼‍🏭", + ":factory_worker_tone3:": "🧑🏽‍🏭", + ":factory_worker_tone4:": "🧑🏾‍🏭", + ":factory_worker_tone5:": "🧑🏿‍🏭", + ":fairy:": "🧚", + ":fairy_dark_skin_tone:": "🧚🏿", + ":fairy_light_skin_tone:": "🧚🏻", + ":fairy_medium_dark_skin_tone:": "🧚🏾", + ":fairy_medium_light_skin_tone:": "🧚🏼", + ":fairy_medium_skin_tone:": "🧚🏽", + ":fairy_tone1:": "🧚🏻", + ":fairy_tone2:": "🧚🏼", + ":fairy_tone3:": "🧚🏽", + ":fairy_tone4:": "🧚🏾", + ":fairy_tone5:": "🧚🏿", + ":falafel:": "🧆", + ":falkland_islands:": "🇫🇰", + ":fallen_leaf:": "🍂", + ":family:": "👪", + ":family_man_boy:": "👨‍👦", + ":family_man_boy_boy:": "👨‍👦‍👦", + ":family_man_girl:": "👨‍👧", + ":family_man_girl_boy:": "👨‍👧‍👦", + ":family_man_girl_girl:": "👨‍👧‍👧", + ":family_man_man_boy:": "👨‍👨‍👦", + ":family_man_man_boy_boy:": "👨‍👨‍👦‍👦", + ":family_man_man_girl:": "👨‍👨‍👧", + ":family_man_man_girl_boy:": "👨‍👨‍👧‍👦", + ":family_man_man_girl_girl:": "👨‍👨‍👧‍👧", + ":family_man_woman_boy:": "👨‍👩‍👦", + ":family_man_woman_boy_boy:": "👨‍👩‍👦‍👦", + ":family_man_woman_girl:": "👨‍👩‍👧", + ":family_man_woman_girl_boy:": "👨‍👩‍👧‍👦", + ":family_man_woman_girl_girl:": "👨‍👩‍👧‍👧", + ":family_mmb:": "👨‍👨‍👦", + ":family_mmbb:": "👨‍👨‍👦‍👦", + ":family_mmg:": "👨‍👨‍👧", + ":family_mmgb:": "👨‍👨‍👧‍👦", + ":family_mmgg:": "👨‍👨‍👧‍👧", + ":family_mwbb:": "👨‍👩‍👦‍👦", + ":family_mwg:": "👨‍👩‍👧", + ":family_mwgb:": "👨‍👩‍👧‍👦", + ":family_mwgg:": "👨‍👩‍👧‍👧", + ":family_woman_boy:": "👩‍👦", + ":family_woman_boy_boy:": "👩‍👦‍👦", + ":family_woman_girl:": "👩‍👧", + ":family_woman_girl_boy:": "👩‍👧‍👦", + ":family_woman_girl_girl:": "👩‍👧‍👧", + ":family_woman_woman_boy:": "👩‍👩‍👦", + ":family_woman_woman_boy_boy:": "👩‍👩‍👦‍👦", + ":family_woman_woman_girl:": "👩‍👩‍👧", + ":family_woman_woman_girl_boy:": "👩‍👩‍👧‍👦", + ":family_woman_woman_girl_girl:": "👩‍👩‍👧‍👧", + ":family_wwb:": "👩‍👩‍👦", + ":family_wwbb:": "👩‍👩‍👦‍👦", + ":family_wwg:": "👩‍👩‍👧", + ":family_wwgb:": "👩‍👩‍👧‍👦", + ":family_wwgg:": "👩‍👩‍👧‍👧", + ":farmer:": "🧑‍🌾", + ":farmer_dark_skin_tone:": "🧑🏿‍🌾", + ":farmer_light_skin_tone:": "🧑🏻‍🌾", + ":farmer_medium_dark_skin_tone:": "🧑🏾‍🌾", + ":farmer_medium_light_skin_tone:": "🧑🏼‍🌾", + ":farmer_medium_skin_tone:": "🧑🏽‍🌾", + ":farmer_tone1:": "🧑🏻‍🌾", + ":farmer_tone2:": "🧑🏼‍🌾", + ":farmer_tone3:": "🧑🏽‍🌾", + ":farmer_tone4:": "🧑🏾‍🌾", + ":farmer_tone5:": "🧑🏿‍🌾", + ":faroe_islands:": "🇫🇴", + ":fast_forward:": "⏩", + ":fax:": "📠", + ":fearful:": "😨", + ":feather:": "🪶", + ":feet:": "🐾", + ":female_detective:": "🕵️‍♀️", + ":female_sign:": "♀️", + ":fencer:": "🤺", + ":fencing:": "🤺", + ":ferris_wheel:": "🎡", + ":ferry:": "⛴️", + ":fi:": "🇫🇮", + ":field_hockey:": "🏑", + ":fiji:": "🇫🇯", + ":file_cabinet:": "🗄️", + ":file_folder:": "📁", + ":film_frames:": "🎞️", + ":film_projector:": "📽️", + ":film_strip:": "🎞", + ":fingers_crossed:": "🤞", + ":fingers_crossed_tone1:": "🤞🏻", + ":fingers_crossed_tone2:": "🤞🏼", + ":fingers_crossed_tone3:": "🤞🏽", + ":fingers_crossed_tone4:": "🤞🏾", + ":fingers_crossed_tone5:": "🤞🏿", + ":finland:": "🇫🇮", + ":fire:": "🔥", + ":fire_engine:": "🚒", + ":fire_extinguisher:": "🧯", + ":firecracker:": "🧨", + ":firefighter:": "🧑‍🚒", + ":firefighter_dark_skin_tone:": "🧑🏿‍🚒", + ":firefighter_light_skin_tone:": "🧑🏻‍🚒", + ":firefighter_medium_dark_skin_tone:": "🧑🏾‍🚒", + ":firefighter_medium_light_skin_tone:": "🧑🏼‍🚒", + ":firefighter_medium_skin_tone:": "🧑🏽‍🚒", + ":firefighter_tone1:": "🧑🏻‍🚒", + ":firefighter_tone2:": "🧑🏼‍🚒", + ":firefighter_tone3:": "🧑🏽‍🚒", + ":firefighter_tone4:": "🧑🏾‍🚒", + ":firefighter_tone5:": "🧑🏿‍🚒", + ":fireworks:": "🎆", + ":first_place:": "🥇", + ":first_place_medal:": "🥇", + ":first_quarter_moon:": "🌓", + ":first_quarter_moon_with_face:": "🌛", + ":fish:": "🐟", + ":fish_cake:": "🍥", + ":fishing_pole_and_fish:": "🎣", + ":fist:": "✊", + ":fist_left:": "🤛", + ":fist_oncoming:": "👊", + ":fist_raised:": "✊", + ":fist_right:": "🤜", + ":fist_tone1:": "✊🏻", + ":fist_tone2:": "✊🏼", + ":fist_tone3:": "✊🏽", + ":fist_tone4:": "✊🏾", + ":fist_tone5:": "✊🏿", + ":five:": "5️⃣", + ":fj:": "🇫🇯", + ":fk:": "🇫🇰", + ":flag_ac:": "🇦🇨", + ":flag_ad:": "🇦🇩", + ":flag_ae:": "🇦🇪", + ":flag_af:": "🇦🇫", + ":flag_ag:": "🇦🇬", + ":flag_ai:": "🇦🇮", + ":flag_al:": "🇦🇱", + ":flag_am:": "🇦🇲", + ":flag_ao:": "🇦🇴", + ":flag_aq:": "🇦🇶", + ":flag_ar:": "🇦🇷", + ":flag_as:": "🇦🇸", + ":flag_at:": "🇦🇹", + ":flag_au:": "🇦🇺", + ":flag_aw:": "🇦🇼", + ":flag_ax:": "🇦🇽", + ":flag_az:": "🇦🇿", + ":flag_ba:": "🇧🇦", + ":flag_bb:": "🇧🇧", + ":flag_bd:": "🇧🇩", + ":flag_be:": "🇧🇪", + ":flag_bf:": "🇧🇫", + ":flag_bg:": "🇧🇬", + ":flag_bh:": "🇧🇭", + ":flag_bi:": "🇧🇮", + ":flag_bj:": "🇧🇯", + ":flag_bl:": "🇧🇱", + ":flag_black:": "🏴", + ":flag_bm:": "🇧🇲", + ":flag_bn:": "🇧🇳", + ":flag_bo:": "🇧🇴", + ":flag_bq:": "🇧🇶", + ":flag_br:": "🇧🇷", + ":flag_bs:": "🇧🇸", + ":flag_bt:": "🇧🇹", + ":flag_bv:": "🇧🇻", + ":flag_bw:": "🇧🇼", + ":flag_by:": "🇧🇾", + ":flag_bz:": "🇧🇿", + ":flag_ca:": "🇨🇦", + ":flag_cc:": "🇨🇨", + ":flag_cd:": "🇨🇩", + ":flag_cf:": "🇨🇫", + ":flag_cg:": "🇨🇬", + ":flag_ch:": "🇨🇭", + ":flag_ci:": "🇨🇮", + ":flag_ck:": "🇨🇰", + ":flag_cl:": "🇨🇱", + ":flag_cm:": "🇨🇲", + ":flag_cn:": "🇨🇳", + ":flag_co:": "🇨🇴", + ":flag_cp:": "🇨🇵", + ":flag_cr:": "🇨🇷", + ":flag_cu:": "🇨🇺", + ":flag_cv:": "🇨🇻", + ":flag_cw:": "🇨🇼", + ":flag_cx:": "🇨🇽", + ":flag_cy:": "🇨🇾", + ":flag_cz:": "🇨🇿", + ":flag_de:": "🇩🇪", + ":flag_dg:": "🇩🇬", + ":flag_dj:": "🇩🇯", + ":flag_dk:": "🇩🇰", + ":flag_dm:": "🇩🇲", + ":flag_do:": "🇩🇴", + ":flag_dz:": "🇩🇿", + ":flag_ea:": "🇪🇦", + ":flag_ec:": "🇪🇨", + ":flag_ee:": "🇪🇪", + ":flag_eg:": "🇪🇬", + ":flag_eh:": "🇪🇭", + ":flag_er:": "🇪🇷", + ":flag_es:": "🇪🇸", + ":flag_et:": "🇪🇹", + ":flag_eu:": "🇪🇺", + ":flag_fi:": "🇫🇮", + ":flag_fj:": "🇫🇯", + ":flag_fk:": "🇫🇰", + ":flag_fm:": "🇫🇲", + ":flag_fo:": "🇫🇴", + ":flag_fr:": "🇫🇷", + ":flag_ga:": "🇬🇦", + ":flag_gb:": "🇬🇧", + ":flag_gd:": "🇬🇩", + ":flag_ge:": "🇬🇪", + ":flag_gf:": "🇬🇫", + ":flag_gg:": "🇬🇬", + ":flag_gh:": "🇬🇭", + ":flag_gi:": "🇬🇮", + ":flag_gl:": "🇬🇱", + ":flag_gm:": "🇬🇲", + ":flag_gn:": "🇬🇳", + ":flag_gp:": "🇬🇵", + ":flag_gq:": "🇬🇶", + ":flag_gr:": "🇬🇷", + ":flag_gs:": "🇬🇸", + ":flag_gt:": "🇬🇹", + ":flag_gu:": "🇬🇺", + ":flag_gw:": "🇬🇼", + ":flag_gy:": "🇬🇾", + ":flag_hk:": "🇭🇰", + ":flag_hm:": "🇭🇲", + ":flag_hn:": "🇭🇳", + ":flag_hr:": "🇭🇷", + ":flag_ht:": "🇭🇹", + ":flag_hu:": "🇭🇺", + ":flag_ic:": "🇮🇨", + ":flag_id:": "🇮🇩", + ":flag_ie:": "🇮🇪", + ":flag_il:": "🇮🇱", + ":flag_im:": "🇮🇲", + ":flag_in:": "🇮🇳", + ":flag_io:": "🇮🇴", + ":flag_iq:": "🇮🇶", + ":flag_ir:": "🇮🇷", + ":flag_is:": "🇮🇸", + ":flag_it:": "🇮🇹", + ":flag_je:": "🇯🇪", + ":flag_jm:": "🇯🇲", + ":flag_jo:": "🇯🇴", + ":flag_jp:": "🇯🇵", + ":flag_ke:": "🇰🇪", + ":flag_kg:": "🇰🇬", + ":flag_kh:": "🇰🇭", + ":flag_ki:": "🇰🇮", + ":flag_km:": "🇰🇲", + ":flag_kn:": "🇰🇳", + ":flag_kp:": "🇰🇵", + ":flag_kr:": "🇰🇷", + ":flag_kw:": "🇰🇼", + ":flag_ky:": "🇰🇾", + ":flag_kz:": "🇰🇿", + ":flag_la:": "🇱🇦", + ":flag_lb:": "🇱🇧", + ":flag_lc:": "🇱🇨", + ":flag_li:": "🇱🇮", + ":flag_lk:": "🇱🇰", + ":flag_lr:": "🇱🇷", + ":flag_ls:": "🇱🇸", + ":flag_lt:": "🇱🇹", + ":flag_lu:": "🇱🇺", + ":flag_lv:": "🇱🇻", + ":flag_ly:": "🇱🇾", + ":flag_ma:": "🇲🇦", + ":flag_mc:": "🇲🇨", + ":flag_md:": "🇲🇩", + ":flag_me:": "🇲🇪", + ":flag_mf:": "🇲🇫", + ":flag_mg:": "🇲🇬", + ":flag_mh:": "🇲🇭", + ":flag_mk:": "🇲🇰", + ":flag_ml:": "🇲🇱", + ":flag_mm:": "🇲🇲", + ":flag_mn:": "🇲🇳", + ":flag_mo:": "🇲🇴", + ":flag_mp:": "🇲🇵", + ":flag_mq:": "🇲🇶", + ":flag_mr:": "🇲🇷", + ":flag_ms:": "🇲🇸", + ":flag_mt:": "🇲🇹", + ":flag_mu:": "🇲🇺", + ":flag_mv:": "🇲🇻", + ":flag_mw:": "🇲🇼", + ":flag_mx:": "🇲🇽", + ":flag_my:": "🇲🇾", + ":flag_mz:": "🇲🇿", + ":flag_na:": "🇳🇦", + ":flag_nc:": "🇳🇨", + ":flag_ne:": "🇳🇪", + ":flag_nf:": "🇳🇫", + ":flag_ng:": "🇳🇬", + ":flag_ni:": "🇳🇮", + ":flag_nl:": "🇳🇱", + ":flag_no:": "🇳🇴", + ":flag_np:": "🇳🇵", + ":flag_nr:": "🇳🇷", + ":flag_nu:": "🇳🇺", + ":flag_nz:": "🇳🇿", + ":flag_om:": "🇴🇲", + ":flag_pa:": "🇵🇦", + ":flag_pe:": "🇵🇪", + ":flag_pf:": "🇵🇫", + ":flag_pg:": "🇵🇬", + ":flag_ph:": "🇵🇭", + ":flag_pk:": "🇵🇰", + ":flag_pl:": "🇵🇱", + ":flag_pm:": "🇵🇲", + ":flag_pn:": "🇵🇳", + ":flag_pr:": "🇵🇷", + ":flag_ps:": "🇵🇸", + ":flag_pt:": "🇵🇹", + ":flag_pw:": "🇵🇼", + ":flag_py:": "🇵🇾", + ":flag_qa:": "🇶🇦", + ":flag_re:": "🇷🇪", + ":flag_ro:": "🇷🇴", + ":flag_rs:": "🇷🇸", + ":flag_ru:": "🇷🇺", + ":flag_rw:": "🇷🇼", + ":flag_sa:": "🇸🇦", + ":flag_sb:": "🇸🇧", + ":flag_sc:": "🇸🇨", + ":flag_sd:": "🇸🇩", + ":flag_se:": "🇸🇪", + ":flag_sg:": "🇸🇬", + ":flag_sh:": "🇸🇭", + ":flag_si:": "🇸🇮", + ":flag_sj:": "🇸🇯", + ":flag_sk:": "🇸🇰", + ":flag_sl:": "🇸🇱", + ":flag_sm:": "🇸🇲", + ":flag_sn:": "🇸🇳", + ":flag_so:": "🇸🇴", + ":flag_sr:": "🇸🇷", + ":flag_ss:": "🇸🇸", + ":flag_st:": "🇸🇹", + ":flag_sv:": "🇸🇻", + ":flag_sx:": "🇸🇽", + ":flag_sy:": "🇸🇾", + ":flag_sz:": "🇸🇿", + ":flag_ta:": "🇹🇦", + ":flag_tc:": "🇹🇨", + ":flag_td:": "🇹🇩", + ":flag_tf:": "🇹🇫", + ":flag_tg:": "🇹🇬", + ":flag_th:": "🇹🇭", + ":flag_tj:": "🇹🇯", + ":flag_tk:": "🇹🇰", + ":flag_tl:": "🇹🇱", + ":flag_tm:": "🇹🇲", + ":flag_tn:": "🇹🇳", + ":flag_to:": "🇹🇴", + ":flag_tr:": "🇹🇷", + ":flag_tt:": "🇹🇹", + ":flag_tv:": "🇹🇻", + ":flag_tw:": "🇹🇼", + ":flag_tz:": "🇹🇿", + ":flag_ua:": "🇺🇦", + ":flag_ug:": "🇺🇬", + ":flag_um:": "🇺🇲", + ":flag_us:": "🇺🇸", + ":flag_uy:": "🇺🇾", + ":flag_uz:": "🇺🇿", + ":flag_va:": "🇻🇦", + ":flag_vc:": "🇻🇨", + ":flag_ve:": "🇻🇪", + ":flag_vg:": "🇻🇬", + ":flag_vi:": "🇻🇮", + ":flag_vn:": "🇻🇳", + ":flag_vu:": "🇻🇺", + ":flag_wf:": "🇼🇫", + ":flag_white:": "🏳️", + ":flag_ws:": "🇼🇸", + ":flag_xk:": "🇽🇰", + ":flag_ye:": "🇾🇪", + ":flag_yt:": "🇾🇹", + ":flag_za:": "🇿🇦", + ":flag_zm:": "🇿🇲", + ":flag_zw:": "🇿🇼", + ":flags:": "🎏", + ":flame:": "🔥", + ":flamingo:": "🦩", + ":flan:": "🍮", + ":flashlight:": "🔦", + ":flatbread:": "🫓", + ":fleur-de-lis:": "⚜️", + ":fleur_de_lis:": "⚜️", + ":flight_arrival:": "🛬", + ":flight_departure:": "🛫", + ":floppy_disk:": "💾", + ":flower_playing_cards:": "🎴", + ":flushed:": "😳", + ":fly:": "🪰", + ":flying_disc:": "🥏", + ":flying_saucer:": "🛸", + ":fm:": "🇫🇲", + ":fo:": "🇫🇴", + ":fog:": "🌫️", + ":foggy:": "🌁", + ":fondue:": "🫕", + ":foot:": "🦶", + ":foot_dark_skin_tone:": "🦶🏿", + ":foot_light_skin_tone:": "🦶🏻", + ":foot_medium_dark_skin_tone:": "🦶🏾", + ":foot_medium_light_skin_tone:": "🦶🏼", + ":foot_medium_skin_tone:": "🦶🏽", + ":foot_tone1:": "🦶🏻", + ":foot_tone2:": "🦶🏼", + ":foot_tone3:": "🦶🏽", + ":foot_tone4:": "🦶🏾", + ":foot_tone5:": "🦶🏿", + ":football:": "🏈", + ":footprints:": "👣", + ":fork_and_knife:": "🍴", + ":fork_and_knife_with_plate:": "🍽️", + ":fork_knife_plate:": "🍽️", + ":fortune_cookie:": "🥠", + ":fountain:": "⛲", + ":fountain_pen:": "🖋", + ":four:": "4️⃣", + ":four_leaf_clover:": "🍀", + ":fox:": "🦊", + ":fox_face:": "🦊", + ":fr:": "🇫🇷", + ":frame_photo:": "🖼️", + ":frame_with_picture:": "🖼️", + ":framed_picture:": "🖼", + ":france:": "🇫🇷", + ":free:": "🆓", + ":french_bread:": "🥖", + ":french_guiana:": "🇬🇫", + ":french_polynesia:": "🇵🇫", + ":french_southern_territories:": "🇹🇫", + ":fried_egg:": "🍳", + ":fried_shrimp:": "🍤", + ":fries:": "🍟", + ":frog:": "🐸", + ":frowning2:": "☹️", + ":frowning:": "😦", + ":frowning_face:": "☹️", + ":frowning_man:": "🙍‍♂️", + ":frowning_woman:": "🙍", + ":fuelpump:": "⛽", + ":full_moon:": "🌕", + ":full_moon_with_face:": "🌝", + ":funeral_urn:": "⚱️", + ":ga:": "🇬🇦", + ":gabon:": "🇬🇦", + ":gambia:": "🇬🇲", + ":game_die:": "🎲", + ":garlic:": "🧄", + ":gay_pride_flag:": "🏳️‍🌈", + ":gb:": "🇬🇧", + ":gd:": "🇬🇩", + ":ge:": "🇬🇪", + ":gear:": "⚙️", + ":gem:": "💎", + ":gemini:": "♊", + ":genie:": "🧞", + ":georgia:": "🇬🇪", + ":germany:": "🇩🇪", + ":gf:": "🇬🇫", + ":gg:": "🇬🇬", + ":gh:": "🇬🇭", + ":ghana:": "🇬🇭", + ":ghost:": "👻", + ":gi:": "🇬🇮", + ":gibraltar:": "🇬🇮", + ":gift:": "🎁", + ":gift_heart:": "💝", + ":giraffe:": "🦒", + ":girl:": "👧", + ":girl_tone1:": "👧🏻", + ":girl_tone2:": "👧🏼", + ":girl_tone3:": "👧🏽", + ":girl_tone4:": "👧🏾", + ":girl_tone5:": "👧🏿", + ":gl:": "🇬🇱", + ":glass_of_milk:": "🥛", + ":globe_with_meridians:": "🌐", + ":gloves:": "🧤", + ":gm:": "🇬🇲", + ":gn:": "🇬🇳", + ":goal:": "🥅", + ":goal_net:": "🥅", + ":goat:": "🐐", + ":goggles:": "🥽", + ":golf:": "⛳", + ":golfer:": "🏌", + ":golfing_man:": "🏌️", + ":golfing_woman:": "🏌️‍♀️", + ":gorilla:": "🦍", + ":gp:": "🇬🇵", + ":gq:": "🇬🇶", + ":gr:": "🇬🇷", + ":grandma:": "👵", + ":grandma_tone1:": "👵🏻", + ":grandma_tone2:": "👵🏼", + ":grandma_tone3:": "👵🏽", + ":grandma_tone4:": "👵🏾", + ":grandma_tone5:": "👵🏿", + ":grapes:": "🍇", + ":great_britain:": "🇬🇧", + ":greece:": "🇬🇷", + ":green_apple:": "🍏", + ":green_book:": "📗", + ":green_circle:": "🟢", + ":green_heart:": "💚", + ":green_salad:": "🥗", + ":green_square:": "🟩", + ":greenland:": "🇬🇱", + ":grenada:": "🇬🇩", + ":grey_exclamation:": "❕", + ":grey_question:": "❔", + ":grimacing:": "😬", + ":grin:": "😁", + ":grinning:": "😀", + ":gs:": "🇬🇸", + ":gt:": "🇬🇹", + ":gu:": "🇬🇺", + ":guadeloupe:": "🇬🇵", + ":guam:": "🇬🇺", + ":guard:": "💂", + ":guard_tone1:": "💂🏻", + ":guard_tone2:": "💂🏼", + ":guard_tone3:": "💂🏽", + ":guard_tone4:": "💂🏾", + ":guard_tone5:": "💂🏿", + ":guardsman:": "💂", + ":guardsman_tone1:": "💂🏻", + ":guardsman_tone2:": "💂🏼", + ":guardsman_tone3:": "💂🏽", + ":guardsman_tone4:": "💂🏾", + ":guardsman_tone5:": "💂🏿", + ":guardswoman:": "💂‍♀️", + ":guatemala:": "🇬🇹", + ":guernsey:": "🇬🇬", + ":guide_dog:": "🦮", + ":guinea:": "🇬🇳", + ":guinea_bissau:": "🇬🇼", + ":guitar:": "🎸", + ":gun:": "🔫", + ":guyana:": "🇬🇾", + ":gw:": "🇬🇼", + ":gy:": "🇬🇾", + ":haircut:": "💇", + ":haircut_man:": "💇‍♂️", + ":haircut_tone1:": "💇🏻", + ":haircut_tone2:": "💇🏼", + ":haircut_tone3:": "💇🏽", + ":haircut_tone4:": "💇🏾", + ":haircut_tone5:": "💇🏿", + ":haircut_woman:": "💇", + ":haiti:": "🇭🇹", + ":hamburger:": "🍔", + ":hammer:": "🔨", + ":hammer_and_pick:": "⚒️", + ":hammer_and_wrench:": "🛠️", + ":hammer_pick:": "⚒️", + ":hamster:": "🐹", + ":hand:": "✋", + ":hand_splayed:": "🖐", + ":hand_splayed_tone1:": "🖐🏻", + ":hand_splayed_tone2:": "🖐🏼", + ":hand_splayed_tone3:": "🖐🏽", + ":hand_splayed_tone4:": "🖐🏾", + ":hand_splayed_tone5:": "🖐🏿", + ":hand_with_index_and_middle_finger_crossed:": "🤞", + ":hand_with_index_and_middle_fingers_crossed_tone1:": "🤞🏻", + ":hand_with_index_and_middle_fingers_crossed_tone2:": "🤞🏼", + ":hand_with_index_and_middle_fingers_crossed_tone3:": "🤞🏽", + ":hand_with_index_and_middle_fingers_crossed_tone4:": "🤞🏾", + ":hand_with_index_and_middle_fingers_crossed_tone5:": "🤞🏿", + ":handbag:": "👜", + ":handball:": "🤾", + ":handball_tone1:": "🤾🏻", + ":handball_tone2:": "🤾🏼", + ":handball_tone3:": "🤾🏽", + ":handball_tone4:": "🤾🏾", + ":handball_tone5:": "🤾🏿", + ":handshake:": "🤝", + ":handshake_tone1:": "🤝🏻", + ":handshake_tone2:": "🤝🏼", + ":handshake_tone3:": "🤝🏽", + ":handshake_tone4:": "🤝🏾", + ":handshake_tone5:": "🤝🏿", + ":hankey:": "💩", + ":hash:": "#️⃣", + ":hatched_chick:": "🐥", + ":hatching_chick:": "🐣", + ":head_bandage:": "🤕", + ":headphones:": "🎧", + ":headstone:": "🪦", + ":health_worker:": "🧑‍⚕️", + ":health_worker_dark_skin_tone:": "🧑🏿‍⚕️", + ":health_worker_light_skin_tone:": "🧑🏻‍⚕️", + ":health_worker_medium_dark_skin_tone:": "🧑🏾‍⚕️", + ":health_worker_medium_light_skin_tone:": "🧑🏼‍⚕️", + ":health_worker_medium_skin_tone:": "🧑🏽‍⚕️", + ":health_worker_tone1:": "🧑🏻‍⚕️", + ":health_worker_tone2:": "🧑🏼‍⚕️", + ":health_worker_tone3:": "🧑🏽‍⚕️", + ":health_worker_tone4:": "🧑🏾‍⚕️", + ":health_worker_tone5:": "🧑🏿‍⚕️", + ":hear_no_evil:": "🙉", + ":heart:": "❤️", + ":heart_decoration:": "💟", + ":heart_exclamation:": "❣️", + ":heart_eyes:": "😍", + ":heart_eyes_cat:": "😻", + ":heart_on_fire:": "❤️‍🔥", + ":heartbeat:": "💓", + ":heartpulse:": "💗", + ":hearts:": "♥️", + ":heavy_check_mark:": "✔️", + ":heavy_division_sign:": "➗", + ":heavy_dollar_sign:": "💲", + ":heavy_heart_exclamation:": "❣️", + ":heavy_heart_exclamation_mark_ornament:": "❣️", + ":heavy_minus_sign:": "➖", + ":heavy_multiplication_x:": "✖️", + ":heavy_plus_sign:": "➕", + ":hedgehog:": "🦔", + ":helicopter:": "🚁", + ":helmet_with_cross:": "⛑️", + ":helmet_with_white_cross:": "⛑️", + ":herb:": "🌿", + ":hibiscus:": "🌺", + ":high_brightness:": "🔆", + ":high_heel:": "👠", + ":hiking_boot:": "🥾", + ":hindu_temple:": "🛕", + ":hippopotamus:": "🦛", + ":hk:": "🇭🇰", + ":hm:": "🇭🇲", + ":hn:": "🇭🇳", + ":hocho:": "🔪", + ":hockey:": "🏒", + ":hole:": "🕳️", + ":homes:": "🏘️", + ":honduras:": "🇭🇳", + ":honey_pot:": "🍯", + ":hong_kong:": "🇭🇰", + ":hook:": "🪝", + ":horse:": "🐴", + ":horse_racing:": "🏇", + ":horse_racing_tone1:": "🏇🏻", + ":horse_racing_tone2:": "🏇🏼", + ":horse_racing_tone3:": "🏇🏽", + ":horse_racing_tone4:": "🏇🏾", + ":horse_racing_tone5:": "🏇🏿", + ":hospital:": "🏥", + ":hot_dog:": "🌭", + ":hot_face:": "🥵", + ":hot_pepper:": "🌶️", + ":hotdog:": "🌭", + ":hotel:": "🏨", + ":hotsprings:": "♨️", + ":hourglass:": "⌛", + ":hourglass_flowing_sand:": "⏳", + ":house:": "🏠", + ":house_abandoned:": "🏚️", + ":house_buildings:": "🏘️", + ":house_with_garden:": "🏡", + ":houses:": "🏘", + ":hr:": "🇭🇷", + ":ht:": "🇭🇹", + ":hu:": "🇭🇺", + ":hugging:": "🤗", + ":hugging_face:": "🤗", + ":hugs:": "🤗", + ":hungary:": "🇭🇺", + ":hushed:": "😯", + ":hut:": "🛖", + ":ic:": "🇮🇨", + ":ice_cream:": "🍨", + ":ice_cube:": "🧊", + ":ice_hockey:": "🏒", + ":ice_skate:": "⛸️", + ":icecream:": "🍦", + ":iceland:": "🇮🇸", + ":id:": "🆔", + ":ideograph_advantage:": "🉐", + ":ie:": "🇮🇪", + ":il:": "🇮🇱", + ":im:": "🇮🇲", + ":imp:": "👿", + ":in:": "🇮🇳", + ":inbox_tray:": "📥", + ":incoming_envelope:": "📨", + ":india:": "🇮🇳", + ":indonesia:": "🇮🇩", + ":infinity:": "♾️", + ":information_desk_person:": "💁", + ":information_desk_person_tone1:": "💁🏻", + ":information_desk_person_tone2:": "💁🏼", + ":information_desk_person_tone3:": "💁🏽", + ":information_desk_person_tone4:": "💁🏾", + ":information_desk_person_tone5:": "💁🏿", + ":information_source:": "ℹ️", + ":innocent:": "😇", + ":interrobang:": "⁉️", + ":io:": "🇮🇴", + ":iphone:": "📱", + ":iq:": "🇮🇶", + ":ir:": "🇮🇷", + ":iran:": "🇮🇷", + ":iraq:": "🇮🇶", + ":ireland:": "🇮🇪", + ":is:": "🇮🇸", + ":island:": "🏝️", + ":isle_of_man:": "🇮🇲", + ":israel:": "🇮🇱", + ":it:": "🇮🇹", + ":italy:": "🇮🇹", + ":izakaya_lantern:": "🏮", + ":jack_o_lantern:": "🎃", + ":jamaica:": "🇯🇲", + ":japan:": "🗾", + ":japanese_castle:": "🏯", + ":japanese_goblin:": "👺", + ":japanese_ogre:": "👹", + ":je:": "🇯🇪", + ":jeans:": "👖", + ":jersey:": "🇯🇪", + ":jigsaw:": "🧩", + ":jm:": "🇯🇲", + ":jo:": "🇯🇴", + ":jordan:": "🇯🇴", + ":joy:": "😂", + ":joy_cat:": "😹", + ":joystick:": "🕹️", + ":jp:": "🇯🇵", + ":judge:": "🧑‍⚖️", + ":judge_dark_skin_tone:": "🧑🏿‍⚖️", + ":judge_light_skin_tone:": "🧑🏻‍⚖️", + ":judge_medium_dark_skin_tone:": "🧑🏾‍⚖️", + ":judge_medium_light_skin_tone:": "🧑🏼‍⚖️", + ":judge_medium_skin_tone:": "🧑🏽‍⚖️", + ":judge_tone1:": "🧑🏻‍⚖️", + ":judge_tone2:": "🧑🏼‍⚖️", + ":judge_tone3:": "🧑🏽‍⚖️", + ":judge_tone4:": "🧑🏾‍⚖️", + ":judge_tone5:": "🧑🏿‍⚖️", + ":juggler:": "🤹", + ":juggler_tone1:": "🤹🏻", + ":juggler_tone2:": "🤹🏼", + ":juggler_tone3:": "🤹🏽", + ":juggler_tone4:": "🤹🏾", + ":juggler_tone5:": "🤹🏿", + ":juggling:": "🤹", + ":juggling_tone1:": "🤹🏻", + ":juggling_tone2:": "🤹🏼", + ":juggling_tone3:": "🤹🏽", + ":juggling_tone4:": "🤹🏾", + ":juggling_tone5:": "🤹🏿", + ":kaaba:": "🕋", + ":kangaroo:": "🦘", + ":karate_uniform:": "🥋", + ":kayak:": "🛶", + ":kazakhstan:": "🇰🇿", + ":ke:": "🇰🇪", + ":kenya:": "🇰🇪", + ":key2:": "🗝️", + ":key:": "🔑", + ":keyboard:": "⌨️", + ":keycap_asterisk:": "*️⃣", + ":keycap_ten:": "🔟", + ":kg:": "🇰🇬", + ":kh:": "🇰🇭", + ":ki:": "🇰🇮", + ":kick_scooter:": "🛴", + ":kimono:": "👘", + ":kiribati:": "🇰🇮", + ":kiss:": "💋", + ":kiss_dark_skin_tone:": "💏🏿", + ":kiss_light_skin_tone:": "💏🏻", + ":kiss_man_man_dark_skin_tone:": "👨🏿‍❤️‍💋‍👨🏿", + ":kiss_man_man_dark_skin_tone_light_skin_tone:": "👨🏿‍❤️‍💋‍👨🏻", + ":kiss_man_man_dark_skin_tone_medium_dark_skin_tone:": "👨🏿‍❤️‍💋‍👨🏾", + ":kiss_man_man_dark_skin_tone_medium_light_skin_tone:": "👨🏿‍❤️‍💋‍👨🏼", + ":kiss_man_man_dark_skin_tone_medium_skin_tone:": "👨🏿‍❤️‍💋‍👨🏽", + ":kiss_man_man_light_skin_tone:": "👨🏻‍❤️‍💋‍👨🏻", + ":kiss_man_man_light_skin_tone_dark_skin_tone:": "👨🏻‍❤️‍💋‍👨🏿", + ":kiss_man_man_light_skin_tone_medium_dark_skin_tone:": "👨🏻‍❤️‍💋‍👨🏾", + ":kiss_man_man_light_skin_tone_medium_light_skin_tone:": "👨🏻‍❤️‍💋‍👨🏼", + ":kiss_man_man_light_skin_tone_medium_skin_tone:": "👨🏻‍❤️‍💋‍👨🏽", + ":kiss_man_man_medium_dark_skin_tone:": "👨🏾‍❤️‍💋‍👨🏾", + ":kiss_man_man_medium_dark_skin_tone_dark_skin_tone:": "👨🏾‍❤️‍💋‍👨🏿", + ":kiss_man_man_medium_dark_skin_tone_light_skin_tone:": "👨🏾‍❤️‍💋‍👨🏻", + ":kiss_man_man_medium_dark_skin_tone_medium_light_skin_tone:": "👨🏾‍❤️‍💋‍👨🏼", + ":kiss_man_man_medium_dark_skin_tone_medium_skin_tone:": "👨🏾‍❤️‍💋‍👨🏽", + ":kiss_man_man_medium_light_skin_tone:": "👨🏼‍❤️‍💋‍👨🏼", + ":kiss_man_man_medium_light_skin_tone_dark_skin_tone:": "👨🏼‍❤️‍💋‍👨🏿", + ":kiss_man_man_medium_light_skin_tone_light_skin_tone:": "👨🏼‍❤️‍💋‍👨🏻", + ":kiss_man_man_medium_light_skin_tone_medium_dark_skin_tone:": "👨🏼‍❤️‍💋‍👨🏾", + ":kiss_man_man_medium_light_skin_tone_medium_skin_tone:": "👨🏼‍❤️‍💋‍👨🏽", + ":kiss_man_man_medium_skin_tone:": "👨🏽‍❤️‍💋‍👨🏽", + ":kiss_man_man_medium_skin_tone_dark_skin_tone:": "👨🏽‍❤️‍💋‍👨🏿", + ":kiss_man_man_medium_skin_tone_light_skin_tone:": "👨🏽‍❤️‍💋‍👨🏻", + ":kiss_man_man_medium_skin_tone_medium_dark_skin_tone:": "👨🏽‍❤️‍💋‍👨🏾", + ":kiss_man_man_medium_skin_tone_medium_light_skin_tone:": "👨🏽‍❤️‍💋‍👨🏼", + ":kiss_man_man_tone1:": "👨🏻‍❤️‍💋‍👨🏻", + ":kiss_man_man_tone1_tone2:": "👨🏻‍❤️‍💋‍👨🏼", + ":kiss_man_man_tone1_tone3:": "👨🏻‍❤️‍💋‍👨🏽", + ":kiss_man_man_tone1_tone4:": "👨🏻‍❤️‍💋‍👨🏾", + ":kiss_man_man_tone1_tone5:": "👨🏻‍❤️‍💋‍👨🏿", + ":kiss_man_man_tone2:": "👨🏼‍❤️‍💋‍👨🏼", + ":kiss_man_man_tone2_tone1:": "👨🏼‍❤️‍💋‍👨🏻", + ":kiss_man_man_tone2_tone3:": "👨🏼‍❤️‍💋‍👨🏽", + ":kiss_man_man_tone2_tone4:": "👨🏼‍❤️‍💋‍👨🏾", + ":kiss_man_man_tone2_tone5:": "👨🏼‍❤️‍💋‍👨🏿", + ":kiss_man_man_tone3:": "👨🏽‍❤️‍💋‍👨🏽", + ":kiss_man_man_tone3_tone1:": "👨🏽‍❤️‍💋‍👨🏻", + ":kiss_man_man_tone3_tone2:": "👨🏽‍❤️‍💋‍👨🏼", + ":kiss_man_man_tone3_tone4:": "👨🏽‍❤️‍💋‍👨🏾", + ":kiss_man_man_tone3_tone5:": "👨🏽‍❤️‍💋‍👨🏿", + ":kiss_man_man_tone4:": "👨🏾‍❤️‍💋‍👨🏾", + ":kiss_man_man_tone4_tone1:": "👨🏾‍❤️‍💋‍👨🏻", + ":kiss_man_man_tone4_tone2:": "👨🏾‍❤️‍💋‍👨🏼", + ":kiss_man_man_tone4_tone3:": "👨🏾‍❤️‍💋‍👨🏽", + ":kiss_man_man_tone4_tone5:": "👨🏾‍❤️‍💋‍👨🏿", + ":kiss_man_man_tone5:": "👨🏿‍❤️‍💋‍👨🏿", + ":kiss_man_man_tone5_tone1:": "👨🏿‍❤️‍💋‍👨🏻", + ":kiss_man_man_tone5_tone2:": "👨🏿‍❤️‍💋‍👨🏼", + ":kiss_man_man_tone5_tone3:": "👨🏿‍❤️‍💋‍👨🏽", + ":kiss_man_man_tone5_tone4:": "👨🏿‍❤️‍💋‍👨🏾", + ":kiss_medium_dark_skin_tone:": "💏🏾", + ":kiss_medium_light_skin_tone:": "💏🏼", + ":kiss_medium_skin_tone:": "💏🏽", + ":kiss_mm:": "👨‍❤️‍💋‍👨", + ":kiss_person_person_dark_skin_tone_light_skin_tone:": "🧑🏿‍❤️‍💋‍🧑🏻", + ":kiss_person_person_dark_skin_tone_medium_dark_skin_tone:": "🧑🏿‍❤️‍💋‍🧑🏾", + ":kiss_person_person_dark_skin_tone_medium_light_skin_tone:": "🧑🏿‍❤️‍💋‍🧑🏼", + ":kiss_person_person_dark_skin_tone_medium_skin_tone:": "🧑🏿‍❤️‍💋‍🧑🏽", + ":kiss_person_person_light_skin_tone_dark_skin_tone:": "🧑🏻‍❤️‍💋‍🧑🏿", + ":kiss_person_person_light_skin_tone_medium_dark_skin_tone:": "🧑🏻‍❤️‍💋‍🧑🏾", + ":kiss_person_person_light_skin_tone_medium_light_skin_tone:": "🧑🏻‍❤️‍💋‍🧑🏼", + ":kiss_person_person_light_skin_tone_medium_skin_tone:": "🧑🏻‍❤️‍💋‍🧑🏽", + ":kiss_person_person_medium_dark_skin_tone_dark_skin_tone:": "🧑🏾‍❤️‍💋‍🧑🏿", + ":kiss_person_person_medium_dark_skin_tone_light_skin_tone:": "🧑🏾‍❤️‍💋‍🧑🏻", + ":kiss_person_person_medium_dark_skin_tone_medium_light_skin_tone:": "🧑🏾‍❤️‍💋‍🧑🏼", + ":kiss_person_person_medium_dark_skin_tone_medium_skin_tone:": "🧑🏾‍❤️‍💋‍🧑🏽", + ":kiss_person_person_medium_light_skin_tone_dark_skin_tone:": "🧑🏼‍❤️‍💋‍🧑🏿", + ":kiss_person_person_medium_light_skin_tone_light_skin_tone:": "🧑🏼‍❤️‍💋‍🧑🏻", + ":kiss_person_person_medium_light_skin_tone_medium_dark_skin_tone:": "🧑🏼‍❤️‍💋‍🧑🏾", + ":kiss_person_person_medium_light_skin_tone_medium_skin_tone:": "🧑🏼‍❤️‍💋‍🧑🏽", + ":kiss_person_person_medium_skin_tone_dark_skin_tone:": "🧑🏽‍❤️‍💋‍🧑🏿", + ":kiss_person_person_medium_skin_tone_light_skin_tone:": "🧑🏽‍❤️‍💋‍🧑🏻", + ":kiss_person_person_medium_skin_tone_medium_dark_skin_tone:": "🧑🏽‍❤️‍💋‍🧑🏾", + ":kiss_person_person_medium_skin_tone_medium_light_skin_tone:": "🧑🏽‍❤️‍💋‍🧑🏼", + ":kiss_person_person_tone1_tone2:": "🧑🏻‍❤️‍💋‍🧑🏼", + ":kiss_person_person_tone1_tone3:": "🧑🏻‍❤️‍💋‍🧑🏽", + ":kiss_person_person_tone1_tone4:": "🧑🏻‍❤️‍💋‍🧑🏾", + ":kiss_person_person_tone1_tone5:": "🧑🏻‍❤️‍💋‍🧑🏿", + ":kiss_person_person_tone2_tone1:": "🧑🏼‍❤️‍💋‍🧑🏻", + ":kiss_person_person_tone2_tone3:": "🧑🏼‍❤️‍💋‍🧑🏽", + ":kiss_person_person_tone2_tone4:": "🧑🏼‍❤️‍💋‍🧑🏾", + ":kiss_person_person_tone2_tone5:": "🧑🏼‍❤️‍💋‍🧑🏿", + ":kiss_person_person_tone3_tone1:": "🧑🏽‍❤️‍💋‍🧑🏻", + ":kiss_person_person_tone3_tone2:": "🧑🏽‍❤️‍💋‍🧑🏼", + ":kiss_person_person_tone3_tone4:": "🧑🏽‍❤️‍💋‍🧑🏾", + ":kiss_person_person_tone3_tone5:": "🧑🏽‍❤️‍💋‍🧑🏿", + ":kiss_person_person_tone4_tone1:": "🧑🏾‍❤️‍💋‍🧑🏻", + ":kiss_person_person_tone4_tone2:": "🧑🏾‍❤️‍💋‍🧑🏼", + ":kiss_person_person_tone4_tone3:": "🧑🏾‍❤️‍💋‍🧑🏽", + ":kiss_person_person_tone4_tone5:": "🧑🏾‍❤️‍💋‍🧑🏿", + ":kiss_person_person_tone5_tone1:": "🧑🏿‍❤️‍💋‍🧑🏻", + ":kiss_person_person_tone5_tone2:": "🧑🏿‍❤️‍💋‍🧑🏼", + ":kiss_person_person_tone5_tone3:": "🧑🏿‍❤️‍💋‍🧑🏽", + ":kiss_person_person_tone5_tone4:": "🧑🏿‍❤️‍💋‍🧑🏾", + ":kiss_tone1:": "💏🏻", + ":kiss_tone2:": "💏🏼", + ":kiss_tone3:": "💏🏽", + ":kiss_tone4:": "💏🏾", + ":kiss_tone5:": "💏🏿", + ":kiss_woman_man:": "👩‍❤️‍💋‍👨", + ":kiss_woman_man_dark_skin_tone:": "👩🏿‍❤️‍💋‍👨🏿", + ":kiss_woman_man_dark_skin_tone_light_skin_tone:": "👩🏿‍❤️‍💋‍👨🏻", + ":kiss_woman_man_dark_skin_tone_medium_dark_skin_tone:": "👩🏿‍❤️‍💋‍👨🏾", + ":kiss_woman_man_dark_skin_tone_medium_light_skin_tone:": "👩🏿‍❤️‍💋‍👨🏼", + ":kiss_woman_man_dark_skin_tone_medium_skin_tone:": "👩🏿‍❤️‍💋‍👨🏽", + ":kiss_woman_man_light_skin_tone:": "👩🏻‍❤️‍💋‍👨🏻", + ":kiss_woman_man_light_skin_tone_dark_skin_tone:": "👩🏻‍❤️‍💋‍👨🏿", + ":kiss_woman_man_light_skin_tone_medium_dark_skin_tone:": "👩🏻‍❤️‍💋‍👨🏾", + ":kiss_woman_man_light_skin_tone_medium_light_skin_tone:": "👩🏻‍❤️‍💋‍👨🏼", + ":kiss_woman_man_light_skin_tone_medium_skin_tone:": "👩🏻‍❤️‍💋‍👨🏽", + ":kiss_woman_man_medium_dark_skin_tone:": "👩🏾‍❤️‍💋‍👨🏾", + ":kiss_woman_man_medium_dark_skin_tone_dark_skin_tone:": "👩🏾‍❤️‍💋‍👨🏿", + ":kiss_woman_man_medium_dark_skin_tone_light_skin_tone:": "👩🏾‍❤️‍💋‍👨🏻", + ":kiss_woman_man_medium_dark_skin_tone_medium_light_skin_tone:": "👩🏾‍❤️‍💋‍👨🏼", + ":kiss_woman_man_medium_dark_skin_tone_medium_skin_tone:": "👩🏾‍❤️‍💋‍👨🏽", + ":kiss_woman_man_medium_light_skin_tone:": "👩🏼‍❤️‍💋‍👨🏼", + ":kiss_woman_man_medium_light_skin_tone_dark_skin_tone:": "👩🏼‍❤️‍💋‍👨🏿", + ":kiss_woman_man_medium_light_skin_tone_light_skin_tone:": "👩🏼‍❤️‍💋‍👨🏻", + ":kiss_woman_man_medium_light_skin_tone_medium_dark_skin_tone:": "👩🏼‍❤️‍💋‍👨🏾", + ":kiss_woman_man_medium_light_skin_tone_medium_skin_tone:": "👩🏼‍❤️‍💋‍👨🏽", + ":kiss_woman_man_medium_skin_tone:": "👩🏽‍❤️‍💋‍👨🏽", + ":kiss_woman_man_medium_skin_tone_dark_skin_tone:": "👩🏽‍❤️‍💋‍👨🏿", + ":kiss_woman_man_medium_skin_tone_light_skin_tone:": "👩🏽‍❤️‍💋‍👨🏻", + ":kiss_woman_man_medium_skin_tone_medium_dark_skin_tone:": "👩🏽‍❤️‍💋‍👨🏾", + ":kiss_woman_man_medium_skin_tone_medium_light_skin_tone:": "👩🏽‍❤️‍💋‍👨🏼", + ":kiss_woman_man_tone1:": "👩🏻‍❤️‍💋‍👨🏻", + ":kiss_woman_man_tone1_tone2:": "👩🏻‍❤️‍💋‍👨🏼", + ":kiss_woman_man_tone1_tone3:": "👩🏻‍❤️‍💋‍👨🏽", + ":kiss_woman_man_tone1_tone4:": "👩🏻‍❤️‍💋‍👨🏾", + ":kiss_woman_man_tone1_tone5:": "👩🏻‍❤️‍💋‍👨🏿", + ":kiss_woman_man_tone2:": "👩🏼‍❤️‍💋‍👨🏼", + ":kiss_woman_man_tone2_tone1:": "👩🏼‍❤️‍💋‍👨🏻", + ":kiss_woman_man_tone2_tone3:": "👩🏼‍❤️‍💋‍👨🏽", + ":kiss_woman_man_tone2_tone4:": "👩🏼‍❤️‍💋‍👨🏾", + ":kiss_woman_man_tone2_tone5:": "👩🏼‍❤️‍💋‍👨🏿", + ":kiss_woman_man_tone3:": "👩🏽‍❤️‍💋‍👨🏽", + ":kiss_woman_man_tone3_tone1:": "👩🏽‍❤️‍💋‍👨🏻", + ":kiss_woman_man_tone3_tone2:": "👩🏽‍❤️‍💋‍👨🏼", + ":kiss_woman_man_tone3_tone4:": "👩🏽‍❤️‍💋‍👨🏾", + ":kiss_woman_man_tone3_tone5:": "👩🏽‍❤️‍💋‍👨🏿", + ":kiss_woman_man_tone4:": "👩🏾‍❤️‍💋‍👨🏾", + ":kiss_woman_man_tone4_tone1:": "👩🏾‍❤️‍💋‍👨🏻", + ":kiss_woman_man_tone4_tone2:": "👩🏾‍❤️‍💋‍👨🏼", + ":kiss_woman_man_tone4_tone3:": "👩🏾‍❤️‍💋‍👨🏽", + ":kiss_woman_man_tone4_tone5:": "👩🏾‍❤️‍💋‍👨🏿", + ":kiss_woman_man_tone5:": "👩🏿‍❤️‍💋‍👨🏿", + ":kiss_woman_man_tone5_tone1:": "👩🏿‍❤️‍💋‍👨🏻", + ":kiss_woman_man_tone5_tone2:": "👩🏿‍❤️‍💋‍👨🏼", + ":kiss_woman_man_tone5_tone3:": "👩🏿‍❤️‍💋‍👨🏽", + ":kiss_woman_man_tone5_tone4:": "👩🏿‍❤️‍💋‍👨🏾", + ":kiss_woman_woman_dark_skin_tone:": "👩🏿‍❤️‍💋‍👩🏿", + ":kiss_woman_woman_dark_skin_tone_light_skin_tone:": "👩🏿‍❤️‍💋‍👩🏻", + ":kiss_woman_woman_dark_skin_tone_medium_dark_skin_tone:": "👩🏿‍❤️‍💋‍👩🏾", + ":kiss_woman_woman_dark_skin_tone_medium_light_skin_tone:": "👩🏿‍❤️‍💋‍👩🏼", + ":kiss_woman_woman_dark_skin_tone_medium_skin_tone:": "👩🏿‍❤️‍💋‍👩🏽", + ":kiss_woman_woman_light_skin_tone:": "👩🏻‍❤️‍💋‍👩🏻", + ":kiss_woman_woman_light_skin_tone_dark_skin_tone:": "👩🏻‍❤️‍💋‍👩🏿", + ":kiss_woman_woman_light_skin_tone_medium_dark_skin_tone:": "👩🏻‍❤️‍💋‍👩🏾", + ":kiss_woman_woman_light_skin_tone_medium_light_skin_tone:": "👩🏻‍❤️‍💋‍👩🏼", + ":kiss_woman_woman_light_skin_tone_medium_skin_tone:": "👩🏻‍❤️‍💋‍👩🏽", + ":kiss_woman_woman_medium_dark_skin_tone:": "👩🏾‍❤️‍💋‍👩🏾", + ":kiss_woman_woman_medium_dark_skin_tone_dark_skin_tone:": "👩🏾‍❤️‍💋‍👩🏿", + ":kiss_woman_woman_medium_dark_skin_tone_light_skin_tone:": "👩🏾‍❤️‍💋‍👩🏻", + ":kiss_woman_woman_medium_dark_skin_tone_medium_light_skin_tone:": "👩🏾‍❤️‍💋‍👩🏼", + ":kiss_woman_woman_medium_dark_skin_tone_medium_skin_tone:": "👩🏾‍❤️‍💋‍👩🏽", + ":kiss_woman_woman_medium_light_skin_tone:": "👩🏼‍❤️‍💋‍👩🏼", + ":kiss_woman_woman_medium_light_skin_tone_dark_skin_tone:": "👩🏼‍❤️‍💋‍👩🏿", + ":kiss_woman_woman_medium_light_skin_tone_light_skin_tone:": "👩🏼‍❤️‍💋‍👩🏻", + ":kiss_woman_woman_medium_light_skin_tone_medium_dark_skin_tone:": "👩🏼‍❤️‍💋‍👩🏾", + ":kiss_woman_woman_medium_light_skin_tone_medium_skin_tone:": "👩🏼‍❤️‍💋‍👩🏽", + ":kiss_woman_woman_medium_skin_tone:": "👩🏽‍❤️‍💋‍👩🏽", + ":kiss_woman_woman_medium_skin_tone_dark_skin_tone:": "👩🏽‍❤️‍💋‍👩🏿", + ":kiss_woman_woman_medium_skin_tone_light_skin_tone:": "👩🏽‍❤️‍💋‍👩🏻", + ":kiss_woman_woman_medium_skin_tone_medium_dark_skin_tone:": "👩🏽‍❤️‍💋‍👩🏾", + ":kiss_woman_woman_medium_skin_tone_medium_light_skin_tone:": "👩🏽‍❤️‍💋‍👩🏼", + ":kiss_woman_woman_tone1:": "👩🏻‍❤️‍💋‍👩🏻", + ":kiss_woman_woman_tone1_tone2:": "👩🏻‍❤️‍💋‍👩🏼", + ":kiss_woman_woman_tone1_tone3:": "👩🏻‍❤️‍💋‍👩🏽", + ":kiss_woman_woman_tone1_tone4:": "👩🏻‍❤️‍💋‍👩🏾", + ":kiss_woman_woman_tone1_tone5:": "👩🏻‍❤️‍💋‍👩🏿", + ":kiss_woman_woman_tone2:": "👩🏼‍❤️‍💋‍👩🏼", + ":kiss_woman_woman_tone2_tone1:": "👩🏼‍❤️‍💋‍👩🏻", + ":kiss_woman_woman_tone2_tone3:": "👩🏼‍❤️‍💋‍👩🏽", + ":kiss_woman_woman_tone2_tone4:": "👩🏼‍❤️‍💋‍👩🏾", + ":kiss_woman_woman_tone2_tone5:": "👩🏼‍❤️‍💋‍👩🏿", + ":kiss_woman_woman_tone3:": "👩🏽‍❤️‍💋‍👩🏽", + ":kiss_woman_woman_tone3_tone1:": "👩🏽‍❤️‍💋‍👩🏻", + ":kiss_woman_woman_tone3_tone2:": "👩🏽‍❤️‍💋‍👩🏼", + ":kiss_woman_woman_tone3_tone4:": "👩🏽‍❤️‍💋‍👩🏾", + ":kiss_woman_woman_tone3_tone5:": "👩🏽‍❤️‍💋‍👩🏿", + ":kiss_woman_woman_tone4:": "👩🏾‍❤️‍💋‍👩🏾", + ":kiss_woman_woman_tone4_tone1:": "👩🏾‍❤️‍💋‍👩🏻", + ":kiss_woman_woman_tone4_tone2:": "👩🏾‍❤️‍💋‍👩🏼", + ":kiss_woman_woman_tone4_tone3:": "👩🏾‍❤️‍💋‍👩🏽", + ":kiss_woman_woman_tone4_tone5:": "👩🏾‍❤️‍💋‍👩🏿", + ":kiss_woman_woman_tone5:": "👩🏿‍❤️‍💋‍👩🏿", + ":kiss_woman_woman_tone5_tone1:": "👩🏿‍❤️‍💋‍👩🏻", + ":kiss_woman_woman_tone5_tone2:": "👩🏿‍❤️‍💋‍👩🏼", + ":kiss_woman_woman_tone5_tone3:": "👩🏿‍❤️‍💋‍👩🏽", + ":kiss_woman_woman_tone5_tone4:": "👩🏿‍❤️‍💋‍👩🏾", + ":kiss_ww:": "👩‍❤️‍💋‍👩", + ":kissing:": "😗", + ":kissing_cat:": "😽", + ":kissing_closed_eyes:": "😚", + ":kissing_heart:": "😘", + ":kissing_smiling_eyes:": "😙", + ":kite:": "🪁", + ":kiwi:": "🥝", + ":kiwi_fruit:": "🥝", + ":kiwifruit:": "🥝", + ":km:": "🇰🇲", + ":kn:": "🇰🇳", + ":knife:": "🔪", + ":knot:": "🪢", + ":koala:": "🐨", + ":koko:": "🈁", + ":korea:": "🇰🇷", + ":kosovo:": "🇽🇰", + ":kp:": "🇰🇵", + ":kr:": "🇰🇷", + ":kuwait:": "🇰🇼", + ":kw:": "🇰🇼", + ":ky:": "🇰🇾", + ":kyrgyzstan:": "🇰🇬", + ":kz:": "🇰🇿", + ":la:": "🇱🇦", + ":lab_coat:": "🥼", + ":label:": "🏷️", + ":lacrosse:": "🥍", + ":ladder:": "🪜", + ":lady_beetle:": "🐞", + ":laos:": "🇱🇦", + ":large_blue_circle:": "🔵", + ":large_blue_diamond:": "🔷", + ":large_orange_diamond:": "🔶", + ":last_quarter_moon:": "🌗", + ":last_quarter_moon_with_face:": "🌜", + ":latin_cross:": "✝️", + ":latvia:": "🇱🇻", + ":laughing:": "😆", + ":lb:": "🇱🇧", + ":lc:": "🇱🇨", + ":leafy_green:": "🥬", + ":leaves:": "🍃", + ":lebanon:": "🇱🇧", + ":ledger:": "📒", + ":left_facing_fist:": "🤛", + ":left_facing_fist_tone1:": "🤛🏻", + ":left_facing_fist_tone2:": "🤛🏼", + ":left_facing_fist_tone3:": "🤛🏽", + ":left_facing_fist_tone4:": "🤛🏾", + ":left_facing_fist_tone5:": "🤛🏿", + ":left_fist:": "🤛", + ":left_fist_tone1:": "🤛🏻", + ":left_fist_tone2:": "🤛🏼", + ":left_fist_tone3:": "🤛🏽", + ":left_fist_tone4:": "🤛🏾", + ":left_fist_tone5:": "🤛🏿", + ":left_luggage:": "🛅", + ":left_right_arrow:": "↔️", + ":left_speech_bubble:": "🗨️", + ":leftwards_arrow_with_hook:": "↩️", + ":leg:": "🦵", + ":leg_dark_skin_tone:": "🦵🏿", + ":leg_light_skin_tone:": "🦵🏻", + ":leg_medium_dark_skin_tone:": "🦵🏾", + ":leg_medium_light_skin_tone:": "🦵🏼", + ":leg_medium_skin_tone:": "🦵🏽", + ":leg_tone1:": "🦵🏻", + ":leg_tone2:": "🦵🏼", + ":leg_tone3:": "🦵🏽", + ":leg_tone4:": "🦵🏾", + ":leg_tone5:": "🦵🏿", + ":lemon:": "🍋", + ":leo:": "♌", + ":leopard:": "🐆", + ":lesotho:": "🇱🇸", + ":level_slider:": "🎚️", + ":levitate:": "🕴️", + ":levitate_tone1:": "🕴🏻", + ":levitate_tone2:": "🕴🏼", + ":levitate_tone3:": "🕴🏽", + ":levitate_tone4:": "🕴🏾", + ":levitate_tone5:": "🕴🏿", + ":li:": "🇱🇮", + ":liar:": "🤥", + ":liberia:": "🇱🇷", + ":libra:": "♎", + ":libya:": "🇱🇾", + ":liechtenstein:": "🇱🇮", + ":lifter:": "🏋", + ":lifter_tone1:": "🏋🏻", + ":lifter_tone2:": "🏋🏼", + ":lifter_tone3:": "🏋🏽", + ":lifter_tone4:": "🏋🏾", + ":lifter_tone5:": "🏋🏿", + ":light_rail:": "🚈", + ":link:": "🔗", + ":linked_paperclips:": "🖇️", + ":lion:": "🦁", + ":lion_face:": "🦁", + ":lips:": "👄", + ":lipstick:": "💄", + ":lithuania:": "🇱🇹", + ":lizard:": "🦎", + ":lk:": "🇱🇰", + ":llama:": "🦙", + ":lobster:": "🦞", + ":lock:": "🔒", + ":lock_with_ink_pen:": "🔏", + ":lollipop:": "🍭", + ":long_drum:": "🪘", + ":loop:": "➿", + ":loud_sound:": "🔊", + ":loudspeaker:": "📢", + ":love_hotel:": "🏩", + ":love_letter:": "💌", + ":love_you_gesture:": "🤟", + ":love_you_gesture_dark_skin_tone:": "🤟🏿", + ":love_you_gesture_light_skin_tone:": "🤟🏻", + ":love_you_gesture_medium_dark_skin_tone:": "🤟🏾", + ":love_you_gesture_medium_light_skin_tone:": "🤟🏼", + ":love_you_gesture_medium_skin_tone:": "🤟🏽", + ":love_you_gesture_tone1:": "🤟🏻", + ":love_you_gesture_tone2:": "🤟🏼", + ":love_you_gesture_tone3:": "🤟🏽", + ":love_you_gesture_tone4:": "🤟🏾", + ":love_you_gesture_tone5:": "🤟🏿", + ":low_brightness:": "🔅", + ":lower_left_ballpoint_pen:": "🖊️", + ":lower_left_crayon:": "🖍️", + ":lower_left_fountain_pen:": "🖋️", + ":lower_left_paintbrush:": "🖌️", + ":lr:": "🇱🇷", + ":ls:": "🇱🇸", + ":lt:": "🇱🇹", + ":lu:": "🇱🇺", + ":luggage:": "🧳", + ":lungs:": "🫁", + ":luxembourg:": "🇱🇺", + ":lv:": "🇱🇻", + ":ly:": "🇱🇾", + ":lying_face:": "🤥", + ":m:": "Ⓜ️", + ":ma:": "🇲🇦", + ":macau:": "🇲🇴", + ":macedonia:": "🇲🇰", + ":madagascar:": "🇲🇬", + ":mag:": "🔍", + ":mag_right:": "🔎", + ":mage:": "🧙", + ":mage_dark_skin_tone:": "🧙🏿", + ":mage_light_skin_tone:": "🧙🏻", + ":mage_medium_dark_skin_tone:": "🧙🏾", + ":mage_medium_light_skin_tone:": "🧙🏼", + ":mage_medium_skin_tone:": "🧙🏽", + ":mage_tone1:": "🧙🏻", + ":mage_tone2:": "🧙🏼", + ":mage_tone3:": "🧙🏽", + ":mage_tone4:": "🧙🏾", + ":mage_tone5:": "🧙🏿", + ":magic_wand:": "🪄", + ":magnet:": "🧲", + ":mahjong:": "🀄", + ":mailbox:": "📫", + ":mailbox_closed:": "📪", + ":mailbox_with_mail:": "📬", + ":mailbox_with_no_mail:": "📭", + ":malawi:": "🇲🇼", + ":malaysia:": "🇲🇾", + ":maldives:": "🇲🇻", + ":male_dancer:": "🕺", + ":male_dancer_tone1:": "🕺🏻", + ":male_dancer_tone2:": "🕺🏼", + ":male_dancer_tone3:": "🕺🏽", + ":male_dancer_tone4:": "🕺🏾", + ":male_dancer_tone5:": "🕺🏿", + ":male_detective:": "🕵️", + ":male_sign:": "♂️", + ":mali:": "🇲🇱", + ":malta:": "🇲🇹", + ":mammoth:": "🦣", + ":man:": "👨", + ":man_artist:": "👨‍🎨", + ":man_artist_dark_skin_tone:": "👨🏿‍🎨", + ":man_artist_light_skin_tone:": "👨🏻‍🎨", + ":man_artist_medium_dark_skin_tone:": "👨🏾‍🎨", + ":man_artist_medium_light_skin_tone:": "👨🏼‍🎨", + ":man_artist_medium_skin_tone:": "👨🏽‍🎨", + ":man_artist_tone1:": "👨🏻‍🎨", + ":man_artist_tone2:": "👨🏼‍🎨", + ":man_artist_tone3:": "👨🏽‍🎨", + ":man_artist_tone4:": "👨🏾‍🎨", + ":man_artist_tone5:": "👨🏿‍🎨", + ":man_astronaut:": "👨‍🚀", + ":man_astronaut_dark_skin_tone:": "👨🏿‍🚀", + ":man_astronaut_light_skin_tone:": "👨🏻‍🚀", + ":man_astronaut_medium_dark_skin_tone:": "👨🏾‍🚀", + ":man_astronaut_medium_light_skin_tone:": "👨🏼‍🚀", + ":man_astronaut_medium_skin_tone:": "👨🏽‍🚀", + ":man_astronaut_tone1:": "👨🏻‍🚀", + ":man_astronaut_tone2:": "👨🏼‍🚀", + ":man_astronaut_tone3:": "👨🏽‍🚀", + ":man_astronaut_tone4:": "👨🏾‍🚀", + ":man_astronaut_tone5:": "👨🏿‍🚀", + ":man_bald:": "👨‍🦲", + ":man_bald_dark_skin_tone:": "👨🏿‍🦲", + ":man_bald_light_skin_tone:": "👨🏻‍🦲", + ":man_bald_medium_dark_skin_tone:": "👨🏾‍🦲", + ":man_bald_medium_light_skin_tone:": "👨🏼‍🦲", + ":man_bald_medium_skin_tone:": "👨🏽‍🦲", + ":man_bald_tone1:": "👨🏻‍🦲", + ":man_bald_tone2:": "👨🏼‍🦲", + ":man_bald_tone3:": "👨🏽‍🦲", + ":man_bald_tone4:": "👨🏾‍🦲", + ":man_bald_tone5:": "👨🏿‍🦲", + ":man_beard:": "🧔‍♂️", + ":man_biking:": "🚴‍♂️", + ":man_biking_dark_skin_tone:": "🚴🏿‍♂️", + ":man_biking_light_skin_tone:": "🚴🏻‍♂️", + ":man_biking_medium_dark_skin_tone:": "🚴🏾‍♂️", + ":man_biking_medium_light_skin_tone:": "🚴🏼‍♂️", + ":man_biking_medium_skin_tone:": "🚴🏽‍♂️", + ":man_biking_tone1:": "🚴🏻‍♂️", + ":man_biking_tone2:": "🚴🏼‍♂️", + ":man_biking_tone3:": "🚴🏽‍♂️", + ":man_biking_tone4:": "🚴🏾‍♂️", + ":man_biking_tone5:": "🚴🏿‍♂️", + ":man_bouncing_ball:": "⛹️‍♂️", + ":man_bouncing_ball_dark_skin_tone:": "⛹🏿‍♂️", + ":man_bouncing_ball_light_skin_tone:": "⛹🏻‍♂️", + ":man_bouncing_ball_medium_dark_skin_tone:": "⛹🏾‍♂️", + ":man_bouncing_ball_medium_light_skin_tone:": "⛹🏼‍♂️", + ":man_bouncing_ball_medium_skin_tone:": "⛹🏽‍♂️", + ":man_bouncing_ball_tone1:": "⛹🏻‍♂️", + ":man_bouncing_ball_tone2:": "⛹🏼‍♂️", + ":man_bouncing_ball_tone3:": "⛹🏽‍♂️", + ":man_bouncing_ball_tone4:": "⛹🏾‍♂️", + ":man_bouncing_ball_tone5:": "⛹🏿‍♂️", + ":man_bowing:": "🙇‍♂️", + ":man_bowing_dark_skin_tone:": "🙇🏿‍♂️", + ":man_bowing_light_skin_tone:": "🙇🏻‍♂️", + ":man_bowing_medium_dark_skin_tone:": "🙇🏾‍♂️", + ":man_bowing_medium_light_skin_tone:": "🙇🏼‍♂️", + ":man_bowing_medium_skin_tone:": "🙇🏽‍♂️", + ":man_bowing_tone1:": "🙇🏻‍♂️", + ":man_bowing_tone2:": "🙇🏼‍♂️", + ":man_bowing_tone3:": "🙇🏽‍♂️", + ":man_bowing_tone4:": "🙇🏾‍♂️", + ":man_bowing_tone5:": "🙇🏿‍♂️", + ":man_cartwheeling:": "🤸‍♂️", + ":man_cartwheeling_dark_skin_tone:": "🤸🏿‍♂️", + ":man_cartwheeling_light_skin_tone:": "🤸🏻‍♂️", + ":man_cartwheeling_medium_dark_skin_tone:": "🤸🏾‍♂️", + ":man_cartwheeling_medium_light_skin_tone:": "🤸🏼‍♂️", + ":man_cartwheeling_medium_skin_tone:": "🤸🏽‍♂️", + ":man_cartwheeling_tone1:": "🤸🏻‍♂️", + ":man_cartwheeling_tone2:": "🤸🏼‍♂️", + ":man_cartwheeling_tone3:": "🤸🏽‍♂️", + ":man_cartwheeling_tone4:": "🤸🏾‍♂️", + ":man_cartwheeling_tone5:": "🤸🏿‍♂️", + ":man_climbing:": "🧗‍♂️", + ":man_climbing_dark_skin_tone:": "🧗🏿‍♂️", + ":man_climbing_light_skin_tone:": "🧗🏻‍♂️", + ":man_climbing_medium_dark_skin_tone:": "🧗🏾‍♂️", + ":man_climbing_medium_light_skin_tone:": "🧗🏼‍♂️", + ":man_climbing_medium_skin_tone:": "🧗🏽‍♂️", + ":man_climbing_tone1:": "🧗🏻‍♂️", + ":man_climbing_tone2:": "🧗🏼‍♂️", + ":man_climbing_tone3:": "🧗🏽‍♂️", + ":man_climbing_tone4:": "🧗🏾‍♂️", + ":man_climbing_tone5:": "🧗🏿‍♂️", + ":man_construction_worker:": "👷‍♂️", + ":man_construction_worker_dark_skin_tone:": "👷🏿‍♂️", + ":man_construction_worker_light_skin_tone:": "👷🏻‍♂️", + ":man_construction_worker_medium_dark_skin_tone:": "👷🏾‍♂️", + ":man_construction_worker_medium_light_skin_tone:": "👷🏼‍♂️", + ":man_construction_worker_medium_skin_tone:": "👷🏽‍♂️", + ":man_construction_worker_tone1:": "👷🏻‍♂️", + ":man_construction_worker_tone2:": "👷🏼‍♂️", + ":man_construction_worker_tone3:": "👷🏽‍♂️", + ":man_construction_worker_tone4:": "👷🏾‍♂️", + ":man_construction_worker_tone5:": "👷🏿‍♂️", + ":man_cook:": "👨‍🍳", + ":man_cook_dark_skin_tone:": "👨🏿‍🍳", + ":man_cook_light_skin_tone:": "👨🏻‍🍳", + ":man_cook_medium_dark_skin_tone:": "👨🏾‍🍳", + ":man_cook_medium_light_skin_tone:": "👨🏼‍🍳", + ":man_cook_medium_skin_tone:": "👨🏽‍🍳", + ":man_cook_tone1:": "👨🏻‍🍳", + ":man_cook_tone2:": "👨🏼‍🍳", + ":man_cook_tone3:": "👨🏽‍🍳", + ":man_cook_tone4:": "👨🏾‍🍳", + ":man_cook_tone5:": "👨🏿‍🍳", + ":man_curly_haired:": "👨‍🦱", + ":man_curly_haired_dark_skin_tone:": "👨🏿‍🦱", + ":man_curly_haired_light_skin_tone:": "👨🏻‍🦱", + ":man_curly_haired_medium_dark_skin_tone:": "👨🏾‍🦱", + ":man_curly_haired_medium_light_skin_tone:": "👨🏼‍🦱", + ":man_curly_haired_medium_skin_tone:": "👨🏽‍🦱", + ":man_curly_haired_tone1:": "👨🏻‍🦱", + ":man_curly_haired_tone2:": "👨🏼‍🦱", + ":man_curly_haired_tone3:": "👨🏽‍🦱", + ":man_curly_haired_tone4:": "👨🏾‍🦱", + ":man_curly_haired_tone5:": "👨🏿‍🦱", + ":man_dancing:": "🕺", + ":man_dancing_tone1:": "🕺🏻", + ":man_dancing_tone2:": "🕺🏼", + ":man_dancing_tone3:": "🕺🏽", + ":man_dancing_tone4:": "🕺🏾", + ":man_dancing_tone5:": "🕺🏿", + ":man_dark_skin_tone_beard:": "🧔🏿‍♂️", + ":man_detective:": "🕵️‍♂️", + ":man_detective_dark_skin_tone:": "🕵🏿‍♂️", + ":man_detective_light_skin_tone:": "🕵🏻‍♂️", + ":man_detective_medium_dark_skin_tone:": "🕵🏾‍♂️", + ":man_detective_medium_light_skin_tone:": "🕵🏼‍♂️", + ":man_detective_medium_skin_tone:": "🕵🏽‍♂️", + ":man_detective_tone1:": "🕵🏻‍♂️", + ":man_detective_tone2:": "🕵🏼‍♂️", + ":man_detective_tone3:": "🕵🏽‍♂️", + ":man_detective_tone4:": "🕵🏾‍♂️", + ":man_detective_tone5:": "🕵🏿‍♂️", + ":man_elf:": "🧝‍♂️", + ":man_elf_dark_skin_tone:": "🧝🏿‍♂️", + ":man_elf_light_skin_tone:": "🧝🏻‍♂️", + ":man_elf_medium_dark_skin_tone:": "🧝🏾‍♂️", + ":man_elf_medium_light_skin_tone:": "🧝🏼‍♂️", + ":man_elf_medium_skin_tone:": "🧝🏽‍♂️", + ":man_elf_tone1:": "🧝🏻‍♂️", + ":man_elf_tone2:": "🧝🏼‍♂️", + ":man_elf_tone3:": "🧝🏽‍♂️", + ":man_elf_tone4:": "🧝🏾‍♂️", + ":man_elf_tone5:": "🧝🏿‍♂️", + ":man_facepalming:": "🤦‍♂️", + ":man_facepalming_dark_skin_tone:": "🤦🏿‍♂️", + ":man_facepalming_light_skin_tone:": "🤦🏻‍♂️", + ":man_facepalming_medium_dark_skin_tone:": "🤦🏾‍♂️", + ":man_facepalming_medium_light_skin_tone:": "🤦🏼‍♂️", + ":man_facepalming_medium_skin_tone:": "🤦🏽‍♂️", + ":man_facepalming_tone1:": "🤦🏻‍♂️", + ":man_facepalming_tone2:": "🤦🏼‍♂️", + ":man_facepalming_tone3:": "🤦🏽‍♂️", + ":man_facepalming_tone4:": "🤦🏾‍♂️", + ":man_facepalming_tone5:": "🤦🏿‍♂️", + ":man_factory_worker:": "👨‍🏭", + ":man_factory_worker_dark_skin_tone:": "👨🏿‍🏭", + ":man_factory_worker_light_skin_tone:": "👨🏻‍🏭", + ":man_factory_worker_medium_dark_skin_tone:": "👨🏾‍🏭", + ":man_factory_worker_medium_light_skin_tone:": "👨🏼‍🏭", + ":man_factory_worker_medium_skin_tone:": "👨🏽‍🏭", + ":man_factory_worker_tone1:": "👨🏻‍🏭", + ":man_factory_worker_tone2:": "👨🏼‍🏭", + ":man_factory_worker_tone3:": "👨🏽‍🏭", + ":man_factory_worker_tone4:": "👨🏾‍🏭", + ":man_factory_worker_tone5:": "👨🏿‍🏭", + ":man_fairy:": "🧚‍♂️", + ":man_fairy_dark_skin_tone:": "🧚🏿‍♂️", + ":man_fairy_light_skin_tone:": "🧚🏻‍♂️", + ":man_fairy_medium_dark_skin_tone:": "🧚🏾‍♂️", + ":man_fairy_medium_light_skin_tone:": "🧚🏼‍♂️", + ":man_fairy_medium_skin_tone:": "🧚🏽‍♂️", + ":man_fairy_tone1:": "🧚🏻‍♂️", + ":man_fairy_tone2:": "🧚🏼‍♂️", + ":man_fairy_tone3:": "🧚🏽‍♂️", + ":man_fairy_tone4:": "🧚🏾‍♂️", + ":man_fairy_tone5:": "🧚🏿‍♂️", + ":man_farmer:": "👨‍🌾", + ":man_farmer_dark_skin_tone:": "👨🏿‍🌾", + ":man_farmer_light_skin_tone:": "👨🏻‍🌾", + ":man_farmer_medium_dark_skin_tone:": "👨🏾‍🌾", + ":man_farmer_medium_light_skin_tone:": "👨🏼‍🌾", + ":man_farmer_medium_skin_tone:": "👨🏽‍🌾", + ":man_farmer_tone1:": "👨🏻‍🌾", + ":man_farmer_tone2:": "👨🏼‍🌾", + ":man_farmer_tone3:": "👨🏽‍🌾", + ":man_farmer_tone4:": "👨🏾‍🌾", + ":man_farmer_tone5:": "👨🏿‍🌾", + ":man_feeding_baby:": "👨‍🍼", + ":man_feeding_baby_dark_skin_tone:": "👨🏿‍🍼", + ":man_feeding_baby_light_skin_tone:": "👨🏻‍🍼", + ":man_feeding_baby_medium_dark_skin_tone:": "👨🏾‍🍼", + ":man_feeding_baby_medium_light_skin_tone:": "👨🏼‍🍼", + ":man_feeding_baby_medium_skin_tone:": "👨🏽‍🍼", + ":man_feeding_baby_tone1:": "👨🏻‍🍼", + ":man_feeding_baby_tone2:": "👨🏼‍🍼", + ":man_feeding_baby_tone3:": "👨🏽‍🍼", + ":man_feeding_baby_tone4:": "👨🏾‍🍼", + ":man_feeding_baby_tone5:": "👨🏿‍🍼", + ":man_firefighter:": "👨‍🚒", + ":man_firefighter_dark_skin_tone:": "👨🏿‍🚒", + ":man_firefighter_light_skin_tone:": "👨🏻‍🚒", + ":man_firefighter_medium_dark_skin_tone:": "👨🏾‍🚒", + ":man_firefighter_medium_light_skin_tone:": "👨🏼‍🚒", + ":man_firefighter_medium_skin_tone:": "👨🏽‍🚒", + ":man_firefighter_tone1:": "👨🏻‍🚒", + ":man_firefighter_tone2:": "👨🏼‍🚒", + ":man_firefighter_tone3:": "👨🏽‍🚒", + ":man_firefighter_tone4:": "👨🏾‍🚒", + ":man_firefighter_tone5:": "👨🏿‍🚒", + ":man_frowning:": "🙍‍♂️", + ":man_frowning_dark_skin_tone:": "🙍🏿‍♂️", + ":man_frowning_light_skin_tone:": "🙍🏻‍♂️", + ":man_frowning_medium_dark_skin_tone:": "🙍🏾‍♂️", + ":man_frowning_medium_light_skin_tone:": "🙍🏼‍♂️", + ":man_frowning_medium_skin_tone:": "🙍🏽‍♂️", + ":man_frowning_tone1:": "🙍🏻‍♂️", + ":man_frowning_tone2:": "🙍🏼‍♂️", + ":man_frowning_tone3:": "🙍🏽‍♂️", + ":man_frowning_tone4:": "🙍🏾‍♂️", + ":man_frowning_tone5:": "🙍🏿‍♂️", + ":man_genie:": "🧞‍♂️", + ":man_gesturing_no:": "🙅‍♂️", + ":man_gesturing_no_dark_skin_tone:": "🙅🏿‍♂️", + ":man_gesturing_no_light_skin_tone:": "🙅🏻‍♂️", + ":man_gesturing_no_medium_dark_skin_tone:": "🙅🏾‍♂️", + ":man_gesturing_no_medium_light_skin_tone:": "🙅🏼‍♂️", + ":man_gesturing_no_medium_skin_tone:": "🙅🏽‍♂️", + ":man_gesturing_no_tone1:": "🙅🏻‍♂️", + ":man_gesturing_no_tone2:": "🙅🏼‍♂️", + ":man_gesturing_no_tone3:": "🙅🏽‍♂️", + ":man_gesturing_no_tone4:": "🙅🏾‍♂️", + ":man_gesturing_no_tone5:": "🙅🏿‍♂️", + ":man_gesturing_ok:": "🙆‍♂️", + ":man_gesturing_ok_dark_skin_tone:": "🙆🏿‍♂️", + ":man_gesturing_ok_light_skin_tone:": "🙆🏻‍♂️", + ":man_gesturing_ok_medium_dark_skin_tone:": "🙆🏾‍♂️", + ":man_gesturing_ok_medium_light_skin_tone:": "🙆🏼‍♂️", + ":man_gesturing_ok_medium_skin_tone:": "🙆🏽‍♂️", + ":man_gesturing_ok_tone1:": "🙆🏻‍♂️", + ":man_gesturing_ok_tone2:": "🙆🏼‍♂️", + ":man_gesturing_ok_tone3:": "🙆🏽‍♂️", + ":man_gesturing_ok_tone4:": "🙆🏾‍♂️", + ":man_gesturing_ok_tone5:": "🙆🏿‍♂️", + ":man_getting_face_massage:": "💆‍♂️", + ":man_getting_face_massage_dark_skin_tone:": "💆🏿‍♂️", + ":man_getting_face_massage_light_skin_tone:": "💆🏻‍♂️", + ":man_getting_face_massage_medium_dark_skin_tone:": "💆🏾‍♂️", + ":man_getting_face_massage_medium_light_skin_tone:": "💆🏼‍♂️", + ":man_getting_face_massage_medium_skin_tone:": "💆🏽‍♂️", + ":man_getting_face_massage_tone1:": "💆🏻‍♂️", + ":man_getting_face_massage_tone2:": "💆🏼‍♂️", + ":man_getting_face_massage_tone3:": "💆🏽‍♂️", + ":man_getting_face_massage_tone4:": "💆🏾‍♂️", + ":man_getting_face_massage_tone5:": "💆🏿‍♂️", + ":man_getting_haircut:": "💇‍♂️", + ":man_getting_haircut_dark_skin_tone:": "💇🏿‍♂️", + ":man_getting_haircut_light_skin_tone:": "💇🏻‍♂️", + ":man_getting_haircut_medium_dark_skin_tone:": "💇🏾‍♂️", + ":man_getting_haircut_medium_light_skin_tone:": "💇🏼‍♂️", + ":man_getting_haircut_medium_skin_tone:": "💇🏽‍♂️", + ":man_getting_haircut_tone1:": "💇🏻‍♂️", + ":man_getting_haircut_tone2:": "💇🏼‍♂️", + ":man_getting_haircut_tone3:": "💇🏽‍♂️", + ":man_getting_haircut_tone4:": "💇🏾‍♂️", + ":man_getting_haircut_tone5:": "💇🏿‍♂️", + ":man_golfing:": "🏌️‍♂️", + ":man_golfing_dark_skin_tone:": "🏌🏿‍♂️", + ":man_golfing_light_skin_tone:": "🏌🏻‍♂️", + ":man_golfing_medium_dark_skin_tone:": "🏌🏾‍♂️", + ":man_golfing_medium_light_skin_tone:": "🏌🏼‍♂️", + ":man_golfing_medium_skin_tone:": "🏌🏽‍♂️", + ":man_golfing_tone1:": "🏌🏻‍♂️", + ":man_golfing_tone2:": "🏌🏼‍♂️", + ":man_golfing_tone3:": "🏌🏽‍♂️", + ":man_golfing_tone4:": "🏌🏾‍♂️", + ":man_golfing_tone5:": "🏌🏿‍♂️", + ":man_guard:": "💂‍♂️", + ":man_guard_dark_skin_tone:": "💂🏿‍♂️", + ":man_guard_light_skin_tone:": "💂🏻‍♂️", + ":man_guard_medium_dark_skin_tone:": "💂🏾‍♂️", + ":man_guard_medium_light_skin_tone:": "💂🏼‍♂️", + ":man_guard_medium_skin_tone:": "💂🏽‍♂️", + ":man_guard_tone1:": "💂🏻‍♂️", + ":man_guard_tone2:": "💂🏼‍♂️", + ":man_guard_tone3:": "💂🏽‍♂️", + ":man_guard_tone4:": "💂🏾‍♂️", + ":man_guard_tone5:": "💂🏿‍♂️", + ":man_health_worker:": "👨‍⚕️", + ":man_health_worker_dark_skin_tone:": "👨🏿‍⚕️", + ":man_health_worker_light_skin_tone:": "👨🏻‍⚕️", + ":man_health_worker_medium_dark_skin_tone:": "👨🏾‍⚕️", + ":man_health_worker_medium_light_skin_tone:": "👨🏼‍⚕️", + ":man_health_worker_medium_skin_tone:": "👨🏽‍⚕️", + ":man_health_worker_tone1:": "👨🏻‍⚕️", + ":man_health_worker_tone2:": "👨🏼‍⚕️", + ":man_health_worker_tone3:": "👨🏽‍⚕️", + ":man_health_worker_tone4:": "👨🏾‍⚕️", + ":man_health_worker_tone5:": "👨🏿‍⚕️", + ":man_in_business_suit_levitating:": "🕴️", + ":man_in_business_suit_levitating_dark_skin_tone:": "🕴🏿", + ":man_in_business_suit_levitating_light_skin_tone:": "🕴🏻", + ":man_in_business_suit_levitating_medium_dark_skin_tone:": "🕴🏾", + ":man_in_business_suit_levitating_medium_light_skin_tone:": "🕴🏼", + ":man_in_business_suit_levitating_medium_skin_tone:": "🕴🏽", + ":man_in_business_suit_levitating_tone1:": "🕴🏻", + ":man_in_business_suit_levitating_tone2:": "🕴🏼", + ":man_in_business_suit_levitating_tone3:": "🕴🏽", + ":man_in_business_suit_levitating_tone4:": "🕴🏾", + ":man_in_business_suit_levitating_tone5:": "🕴🏿", + ":man_in_lotus_position:": "🧘‍♂️", + ":man_in_lotus_position_dark_skin_tone:": "🧘🏿‍♂️", + ":man_in_lotus_position_light_skin_tone:": "🧘🏻‍♂️", + ":man_in_lotus_position_medium_dark_skin_tone:": "🧘🏾‍♂️", + ":man_in_lotus_position_medium_light_skin_tone:": "🧘🏼‍♂️", + ":man_in_lotus_position_medium_skin_tone:": "🧘🏽‍♂️", + ":man_in_lotus_position_tone1:": "🧘🏻‍♂️", + ":man_in_lotus_position_tone2:": "🧘🏼‍♂️", + ":man_in_lotus_position_tone3:": "🧘🏽‍♂️", + ":man_in_lotus_position_tone4:": "🧘🏾‍♂️", + ":man_in_lotus_position_tone5:": "🧘🏿‍♂️", + ":man_in_manual_wheelchair:": "👨‍🦽", + ":man_in_manual_wheelchair_dark_skin_tone:": "👨🏿‍🦽", + ":man_in_manual_wheelchair_light_skin_tone:": "👨🏻‍🦽", + ":man_in_manual_wheelchair_medium_dark_skin_tone:": "👨🏾‍🦽", + ":man_in_manual_wheelchair_medium_light_skin_tone:": "👨🏼‍🦽", + ":man_in_manual_wheelchair_medium_skin_tone:": "👨🏽‍🦽", + ":man_in_manual_wheelchair_tone1:": "👨🏻‍🦽", + ":man_in_manual_wheelchair_tone2:": "👨🏼‍🦽", + ":man_in_manual_wheelchair_tone3:": "👨🏽‍🦽", + ":man_in_manual_wheelchair_tone4:": "👨🏾‍🦽", + ":man_in_manual_wheelchair_tone5:": "👨🏿‍🦽", + ":man_in_motorized_wheelchair:": "👨‍🦼", + ":man_in_motorized_wheelchair_dark_skin_tone:": "👨🏿‍🦼", + ":man_in_motorized_wheelchair_light_skin_tone:": "👨🏻‍🦼", + ":man_in_motorized_wheelchair_medium_dark_skin_tone:": "👨🏾‍🦼", + ":man_in_motorized_wheelchair_medium_light_skin_tone:": "👨🏼‍🦼", + ":man_in_motorized_wheelchair_medium_skin_tone:": "👨🏽‍🦼", + ":man_in_motorized_wheelchair_tone1:": "👨🏻‍🦼", + ":man_in_motorized_wheelchair_tone2:": "👨🏼‍🦼", + ":man_in_motorized_wheelchair_tone3:": "👨🏽‍🦼", + ":man_in_motorized_wheelchair_tone4:": "👨🏾‍🦼", + ":man_in_motorized_wheelchair_tone5:": "👨🏿‍🦼", + ":man_in_steamy_room:": "🧖‍♂️", + ":man_in_steamy_room_dark_skin_tone:": "🧖🏿‍♂️", + ":man_in_steamy_room_light_skin_tone:": "🧖🏻‍♂️", + ":man_in_steamy_room_medium_dark_skin_tone:": "🧖🏾‍♂️", + ":man_in_steamy_room_medium_light_skin_tone:": "🧖🏼‍♂️", + ":man_in_steamy_room_medium_skin_tone:": "🧖🏽‍♂️", + ":man_in_steamy_room_tone1:": "🧖🏻‍♂️", + ":man_in_steamy_room_tone2:": "🧖🏼‍♂️", + ":man_in_steamy_room_tone3:": "🧖🏽‍♂️", + ":man_in_steamy_room_tone4:": "🧖🏾‍♂️", + ":man_in_steamy_room_tone5:": "🧖🏿‍♂️", + ":man_in_tuxedo:": "🤵‍♂️", + ":man_in_tuxedo_dark_skin_tone:": "🤵🏿‍♂️", + ":man_in_tuxedo_light_skin_tone:": "🤵🏻‍♂️", + ":man_in_tuxedo_medium_dark_skin_tone:": "🤵🏾‍♂️", + ":man_in_tuxedo_medium_light_skin_tone:": "🤵🏼‍♂️", + ":man_in_tuxedo_medium_skin_tone:": "🤵🏽‍♂️", + ":man_in_tuxedo_tone1:": "🤵🏻‍♂️", + ":man_in_tuxedo_tone2:": "🤵🏼‍♂️", + ":man_in_tuxedo_tone3:": "🤵🏽‍♂️", + ":man_in_tuxedo_tone4:": "🤵🏾‍♂️", + ":man_in_tuxedo_tone5:": "🤵🏿‍♂️", + ":man_judge:": "👨‍⚖️", + ":man_judge_dark_skin_tone:": "👨🏿‍⚖️", + ":man_judge_light_skin_tone:": "👨🏻‍⚖️", + ":man_judge_medium_dark_skin_tone:": "👨🏾‍⚖️", + ":man_judge_medium_light_skin_tone:": "👨🏼‍⚖️", + ":man_judge_medium_skin_tone:": "👨🏽‍⚖️", + ":man_judge_tone1:": "👨🏻‍⚖️", + ":man_judge_tone2:": "👨🏼‍⚖️", + ":man_judge_tone3:": "👨🏽‍⚖️", + ":man_judge_tone4:": "👨🏾‍⚖️", + ":man_judge_tone5:": "👨🏿‍⚖️", + ":man_juggling:": "🤹‍♂️", + ":man_juggling_dark_skin_tone:": "🤹🏿‍♂️", + ":man_juggling_light_skin_tone:": "🤹🏻‍♂️", + ":man_juggling_medium_dark_skin_tone:": "🤹🏾‍♂️", + ":man_juggling_medium_light_skin_tone:": "🤹🏼‍♂️", + ":man_juggling_medium_skin_tone:": "🤹🏽‍♂️", + ":man_juggling_tone1:": "🤹🏻‍♂️", + ":man_juggling_tone2:": "🤹🏼‍♂️", + ":man_juggling_tone3:": "🤹🏽‍♂️", + ":man_juggling_tone4:": "🤹🏾‍♂️", + ":man_juggling_tone5:": "🤹🏿‍♂️", + ":man_kneeling:": "🧎‍♂️", + ":man_kneeling_dark_skin_tone:": "🧎🏿‍♂️", + ":man_kneeling_light_skin_tone:": "🧎🏻‍♂️", + ":man_kneeling_medium_dark_skin_tone:": "🧎🏾‍♂️", + ":man_kneeling_medium_light_skin_tone:": "🧎🏼‍♂️", + ":man_kneeling_medium_skin_tone:": "🧎🏽‍♂️", + ":man_kneeling_tone1:": "🧎🏻‍♂️", + ":man_kneeling_tone2:": "🧎🏼‍♂️", + ":man_kneeling_tone3:": "🧎🏽‍♂️", + ":man_kneeling_tone4:": "🧎🏾‍♂️", + ":man_kneeling_tone5:": "🧎🏿‍♂️", + ":man_lifting_weights:": "🏋️‍♂️", + ":man_lifting_weights_dark_skin_tone:": "🏋🏿‍♂️", + ":man_lifting_weights_light_skin_tone:": "🏋🏻‍♂️", + ":man_lifting_weights_medium_dark_skin_tone:": "🏋🏾‍♂️", + ":man_lifting_weights_medium_light_skin_tone:": "🏋🏼‍♂️", + ":man_lifting_weights_medium_skin_tone:": "🏋🏽‍♂️", + ":man_lifting_weights_tone1:": "🏋🏻‍♂️", + ":man_lifting_weights_tone2:": "🏋🏼‍♂️", + ":man_lifting_weights_tone3:": "🏋🏽‍♂️", + ":man_lifting_weights_tone4:": "🏋🏾‍♂️", + ":man_lifting_weights_tone5:": "🏋🏿‍♂️", + ":man_light_skin_tone_beard:": "🧔🏻‍♂️", + ":man_mage:": "🧙‍♂️", + ":man_mage_dark_skin_tone:": "🧙🏿‍♂️", + ":man_mage_light_skin_tone:": "🧙🏻‍♂️", + ":man_mage_medium_dark_skin_tone:": "🧙🏾‍♂️", + ":man_mage_medium_light_skin_tone:": "🧙🏼‍♂️", + ":man_mage_medium_skin_tone:": "🧙🏽‍♂️", + ":man_mage_tone1:": "🧙🏻‍♂️", + ":man_mage_tone2:": "🧙🏼‍♂️", + ":man_mage_tone3:": "🧙🏽‍♂️", + ":man_mage_tone4:": "🧙🏾‍♂️", + ":man_mage_tone5:": "🧙🏿‍♂️", + ":man_mechanic:": "👨‍🔧", + ":man_mechanic_dark_skin_tone:": "👨🏿‍🔧", + ":man_mechanic_light_skin_tone:": "👨🏻‍🔧", + ":man_mechanic_medium_dark_skin_tone:": "👨🏾‍🔧", + ":man_mechanic_medium_light_skin_tone:": "👨🏼‍🔧", + ":man_mechanic_medium_skin_tone:": "👨🏽‍🔧", + ":man_mechanic_tone1:": "👨🏻‍🔧", + ":man_mechanic_tone2:": "👨🏼‍🔧", + ":man_mechanic_tone3:": "👨🏽‍🔧", + ":man_mechanic_tone4:": "👨🏾‍🔧", + ":man_mechanic_tone5:": "👨🏿‍🔧", + ":man_medium_dark_skin_tone_beard:": "🧔🏾‍♂️", + ":man_medium_light_skin_tone_beard:": "🧔🏼‍♂️", + ":man_medium_skin_tone_beard:": "🧔🏽‍♂️", + ":man_mountain_biking:": "🚵‍♂️", + ":man_mountain_biking_dark_skin_tone:": "🚵🏿‍♂️", + ":man_mountain_biking_light_skin_tone:": "🚵🏻‍♂️", + ":man_mountain_biking_medium_dark_skin_tone:": "🚵🏾‍♂️", + ":man_mountain_biking_medium_light_skin_tone:": "🚵🏼‍♂️", + ":man_mountain_biking_medium_skin_tone:": "🚵🏽‍♂️", + ":man_mountain_biking_tone1:": "🚵🏻‍♂️", + ":man_mountain_biking_tone2:": "🚵🏼‍♂️", + ":man_mountain_biking_tone3:": "🚵🏽‍♂️", + ":man_mountain_biking_tone4:": "🚵🏾‍♂️", + ":man_mountain_biking_tone5:": "🚵🏿‍♂️", + ":man_office_worker:": "👨‍💼", + ":man_office_worker_dark_skin_tone:": "👨🏿‍💼", + ":man_office_worker_light_skin_tone:": "👨🏻‍💼", + ":man_office_worker_medium_dark_skin_tone:": "👨🏾‍💼", + ":man_office_worker_medium_light_skin_tone:": "👨🏼‍💼", + ":man_office_worker_medium_skin_tone:": "👨🏽‍💼", + ":man_office_worker_tone1:": "👨🏻‍💼", + ":man_office_worker_tone2:": "👨🏼‍💼", + ":man_office_worker_tone3:": "👨🏽‍💼", + ":man_office_worker_tone4:": "👨🏾‍💼", + ":man_office_worker_tone5:": "👨🏿‍💼", + ":man_pilot:": "👨‍✈️", + ":man_pilot_dark_skin_tone:": "👨🏿‍✈️", + ":man_pilot_light_skin_tone:": "👨🏻‍✈️", + ":man_pilot_medium_dark_skin_tone:": "👨🏾‍✈️", + ":man_pilot_medium_light_skin_tone:": "👨🏼‍✈️", + ":man_pilot_medium_skin_tone:": "👨🏽‍✈️", + ":man_pilot_tone1:": "👨🏻‍✈️", + ":man_pilot_tone2:": "👨🏼‍✈️", + ":man_pilot_tone3:": "👨🏽‍✈️", + ":man_pilot_tone4:": "👨🏾‍✈️", + ":man_pilot_tone5:": "👨🏿‍✈️", + ":man_playing_handball:": "🤾‍♂️", + ":man_playing_handball_dark_skin_tone:": "🤾🏿‍♂️", + ":man_playing_handball_light_skin_tone:": "🤾🏻‍♂️", + ":man_playing_handball_medium_dark_skin_tone:": "🤾🏾‍♂️", + ":man_playing_handball_medium_light_skin_tone:": "🤾🏼‍♂️", + ":man_playing_handball_medium_skin_tone:": "🤾🏽‍♂️", + ":man_playing_handball_tone1:": "🤾🏻‍♂️", + ":man_playing_handball_tone2:": "🤾🏼‍♂️", + ":man_playing_handball_tone3:": "🤾🏽‍♂️", + ":man_playing_handball_tone4:": "🤾🏾‍♂️", + ":man_playing_handball_tone5:": "🤾🏿‍♂️", + ":man_playing_water_polo:": "🤽‍♂️", + ":man_playing_water_polo_dark_skin_tone:": "🤽🏿‍♂️", + ":man_playing_water_polo_light_skin_tone:": "🤽🏻‍♂️", + ":man_playing_water_polo_medium_dark_skin_tone:": "🤽🏾‍♂️", + ":man_playing_water_polo_medium_light_skin_tone:": "🤽🏼‍♂️", + ":man_playing_water_polo_medium_skin_tone:": "🤽🏽‍♂️", + ":man_playing_water_polo_tone1:": "🤽🏻‍♂️", + ":man_playing_water_polo_tone2:": "🤽🏼‍♂️", + ":man_playing_water_polo_tone3:": "🤽🏽‍♂️", + ":man_playing_water_polo_tone4:": "🤽🏾‍♂️", + ":man_playing_water_polo_tone5:": "🤽🏿‍♂️", + ":man_police_officer:": "👮‍♂️", + ":man_police_officer_dark_skin_tone:": "👮🏿‍♂️", + ":man_police_officer_light_skin_tone:": "👮🏻‍♂️", + ":man_police_officer_medium_dark_skin_tone:": "👮🏾‍♂️", + ":man_police_officer_medium_light_skin_tone:": "👮🏼‍♂️", + ":man_police_officer_medium_skin_tone:": "👮🏽‍♂️", + ":man_police_officer_tone1:": "👮🏻‍♂️", + ":man_police_officer_tone2:": "👮🏼‍♂️", + ":man_police_officer_tone3:": "👮🏽‍♂️", + ":man_police_officer_tone4:": "👮🏾‍♂️", + ":man_police_officer_tone5:": "👮🏿‍♂️", + ":man_pouting:": "🙎‍♂️", + ":man_pouting_dark_skin_tone:": "🙎🏿‍♂️", + ":man_pouting_light_skin_tone:": "🙎🏻‍♂️", + ":man_pouting_medium_dark_skin_tone:": "🙎🏾‍♂️", + ":man_pouting_medium_light_skin_tone:": "🙎🏼‍♂️", + ":man_pouting_medium_skin_tone:": "🙎🏽‍♂️", + ":man_pouting_tone1:": "🙎🏻‍♂️", + ":man_pouting_tone2:": "🙎🏼‍♂️", + ":man_pouting_tone3:": "🙎🏽‍♂️", + ":man_pouting_tone4:": "🙎🏾‍♂️", + ":man_pouting_tone5:": "🙎🏿‍♂️", + ":man_raising_hand:": "🙋‍♂️", + ":man_raising_hand_dark_skin_tone:": "🙋🏿‍♂️", + ":man_raising_hand_light_skin_tone:": "🙋🏻‍♂️", + ":man_raising_hand_medium_dark_skin_tone:": "🙋🏾‍♂️", + ":man_raising_hand_medium_light_skin_tone:": "🙋🏼‍♂️", + ":man_raising_hand_medium_skin_tone:": "🙋🏽‍♂️", + ":man_raising_hand_tone1:": "🙋🏻‍♂️", + ":man_raising_hand_tone2:": "🙋🏼‍♂️", + ":man_raising_hand_tone3:": "🙋🏽‍♂️", + ":man_raising_hand_tone4:": "🙋🏾‍♂️", + ":man_raising_hand_tone5:": "🙋🏿‍♂️", + ":man_red_haired:": "👨‍🦰", + ":man_red_haired_dark_skin_tone:": "👨🏿‍🦰", + ":man_red_haired_light_skin_tone:": "👨🏻‍🦰", + ":man_red_haired_medium_dark_skin_tone:": "👨🏾‍🦰", + ":man_red_haired_medium_light_skin_tone:": "👨🏼‍🦰", + ":man_red_haired_medium_skin_tone:": "👨🏽‍🦰", + ":man_red_haired_tone1:": "👨🏻‍🦰", + ":man_red_haired_tone2:": "👨🏼‍🦰", + ":man_red_haired_tone3:": "👨🏽‍🦰", + ":man_red_haired_tone4:": "👨🏾‍🦰", + ":man_red_haired_tone5:": "👨🏿‍🦰", + ":man_rowing_boat:": "🚣‍♂️", + ":man_rowing_boat_dark_skin_tone:": "🚣🏿‍♂️", + ":man_rowing_boat_light_skin_tone:": "🚣🏻‍♂️", + ":man_rowing_boat_medium_dark_skin_tone:": "🚣🏾‍♂️", + ":man_rowing_boat_medium_light_skin_tone:": "🚣🏼‍♂️", + ":man_rowing_boat_medium_skin_tone:": "🚣🏽‍♂️", + ":man_rowing_boat_tone1:": "🚣🏻‍♂️", + ":man_rowing_boat_tone2:": "🚣🏼‍♂️", + ":man_rowing_boat_tone3:": "🚣🏽‍♂️", + ":man_rowing_boat_tone4:": "🚣🏾‍♂️", + ":man_rowing_boat_tone5:": "🚣🏿‍♂️", + ":man_running:": "🏃‍♂️", + ":man_running_dark_skin_tone:": "🏃🏿‍♂️", + ":man_running_light_skin_tone:": "🏃🏻‍♂️", + ":man_running_medium_dark_skin_tone:": "🏃🏾‍♂️", + ":man_running_medium_light_skin_tone:": "🏃🏼‍♂️", + ":man_running_medium_skin_tone:": "🏃🏽‍♂️", + ":man_running_tone1:": "🏃🏻‍♂️", + ":man_running_tone2:": "🏃🏼‍♂️", + ":man_running_tone3:": "🏃🏽‍♂️", + ":man_running_tone4:": "🏃🏾‍♂️", + ":man_running_tone5:": "🏃🏿‍♂️", + ":man_scientist:": "👨‍🔬", + ":man_scientist_dark_skin_tone:": "👨🏿‍🔬", + ":man_scientist_light_skin_tone:": "👨🏻‍🔬", + ":man_scientist_medium_dark_skin_tone:": "👨🏾‍🔬", + ":man_scientist_medium_light_skin_tone:": "👨🏼‍🔬", + ":man_scientist_medium_skin_tone:": "👨🏽‍🔬", + ":man_scientist_tone1:": "👨🏻‍🔬", + ":man_scientist_tone2:": "👨🏼‍🔬", + ":man_scientist_tone3:": "👨🏽‍🔬", + ":man_scientist_tone4:": "👨🏾‍🔬", + ":man_scientist_tone5:": "👨🏿‍🔬", + ":man_shrugging:": "🤷‍♂️", + ":man_shrugging_dark_skin_tone:": "🤷🏿‍♂️", + ":man_shrugging_light_skin_tone:": "🤷🏻‍♂️", + ":man_shrugging_medium_dark_skin_tone:": "🤷🏾‍♂️", + ":man_shrugging_medium_light_skin_tone:": "🤷🏼‍♂️", + ":man_shrugging_medium_skin_tone:": "🤷🏽‍♂️", + ":man_shrugging_tone1:": "🤷🏻‍♂️", + ":man_shrugging_tone2:": "🤷🏼‍♂️", + ":man_shrugging_tone3:": "🤷🏽‍♂️", + ":man_shrugging_tone4:": "🤷🏾‍♂️", + ":man_shrugging_tone5:": "🤷🏿‍♂️", + ":man_singer:": "👨‍🎤", + ":man_singer_dark_skin_tone:": "👨🏿‍🎤", + ":man_singer_light_skin_tone:": "👨🏻‍🎤", + ":man_singer_medium_dark_skin_tone:": "👨🏾‍🎤", + ":man_singer_medium_light_skin_tone:": "👨🏼‍🎤", + ":man_singer_medium_skin_tone:": "👨🏽‍🎤", + ":man_singer_tone1:": "👨🏻‍🎤", + ":man_singer_tone2:": "👨🏼‍🎤", + ":man_singer_tone3:": "👨🏽‍🎤", + ":man_singer_tone4:": "👨🏾‍🎤", + ":man_singer_tone5:": "👨🏿‍🎤", + ":man_standing:": "🧍‍♂️", + ":man_standing_dark_skin_tone:": "🧍🏿‍♂️", + ":man_standing_light_skin_tone:": "🧍🏻‍♂️", + ":man_standing_medium_dark_skin_tone:": "🧍🏾‍♂️", + ":man_standing_medium_light_skin_tone:": "🧍🏼‍♂️", + ":man_standing_medium_skin_tone:": "🧍🏽‍♂️", + ":man_standing_tone1:": "🧍🏻‍♂️", + ":man_standing_tone2:": "🧍🏼‍♂️", + ":man_standing_tone3:": "🧍🏽‍♂️", + ":man_standing_tone4:": "🧍🏾‍♂️", + ":man_standing_tone5:": "🧍🏿‍♂️", + ":man_student:": "👨‍🎓", + ":man_student_dark_skin_tone:": "👨🏿‍🎓", + ":man_student_light_skin_tone:": "👨🏻‍🎓", + ":man_student_medium_dark_skin_tone:": "👨🏾‍🎓", + ":man_student_medium_light_skin_tone:": "👨🏼‍🎓", + ":man_student_medium_skin_tone:": "👨🏽‍🎓", + ":man_student_tone1:": "👨🏻‍🎓", + ":man_student_tone2:": "👨🏼‍🎓", + ":man_student_tone3:": "👨🏽‍🎓", + ":man_student_tone4:": "👨🏾‍🎓", + ":man_student_tone5:": "👨🏿‍🎓", + ":man_superhero:": "🦸‍♂️", + ":man_superhero_dark_skin_tone:": "🦸🏿‍♂️", + ":man_superhero_light_skin_tone:": "🦸🏻‍♂️", + ":man_superhero_medium_dark_skin_tone:": "🦸🏾‍♂️", + ":man_superhero_medium_light_skin_tone:": "🦸🏼‍♂️", + ":man_superhero_medium_skin_tone:": "🦸🏽‍♂️", + ":man_superhero_tone1:": "🦸🏻‍♂️", + ":man_superhero_tone2:": "🦸🏼‍♂️", + ":man_superhero_tone3:": "🦸🏽‍♂️", + ":man_superhero_tone4:": "🦸🏾‍♂️", + ":man_superhero_tone5:": "🦸🏿‍♂️", + ":man_supervillain:": "🦹‍♂️", + ":man_supervillain_dark_skin_tone:": "🦹🏿‍♂️", + ":man_supervillain_light_skin_tone:": "🦹🏻‍♂️", + ":man_supervillain_medium_dark_skin_tone:": "🦹🏾‍♂️", + ":man_supervillain_medium_light_skin_tone:": "🦹🏼‍♂️", + ":man_supervillain_medium_skin_tone:": "🦹🏽‍♂️", + ":man_supervillain_tone1:": "🦹🏻‍♂️", + ":man_supervillain_tone2:": "🦹🏼‍♂️", + ":man_supervillain_tone3:": "🦹🏽‍♂️", + ":man_supervillain_tone4:": "🦹🏾‍♂️", + ":man_supervillain_tone5:": "🦹🏿‍♂️", + ":man_surfing:": "🏄‍♂️", + ":man_surfing_dark_skin_tone:": "🏄🏿‍♂️", + ":man_surfing_light_skin_tone:": "🏄🏻‍♂️", + ":man_surfing_medium_dark_skin_tone:": "🏄🏾‍♂️", + ":man_surfing_medium_light_skin_tone:": "🏄🏼‍♂️", + ":man_surfing_medium_skin_tone:": "🏄🏽‍♂️", + ":man_surfing_tone1:": "🏄🏻‍♂️", + ":man_surfing_tone2:": "🏄🏼‍♂️", + ":man_surfing_tone3:": "🏄🏽‍♂️", + ":man_surfing_tone4:": "🏄🏾‍♂️", + ":man_surfing_tone5:": "🏄🏿‍♂️", + ":man_swimming:": "🏊‍♂️", + ":man_swimming_dark_skin_tone:": "🏊🏿‍♂️", + ":man_swimming_light_skin_tone:": "🏊🏻‍♂️", + ":man_swimming_medium_dark_skin_tone:": "🏊🏾‍♂️", + ":man_swimming_medium_light_skin_tone:": "🏊🏼‍♂️", + ":man_swimming_medium_skin_tone:": "🏊🏽‍♂️", + ":man_swimming_tone1:": "🏊🏻‍♂️", + ":man_swimming_tone2:": "🏊🏼‍♂️", + ":man_swimming_tone3:": "🏊🏽‍♂️", + ":man_swimming_tone4:": "🏊🏾‍♂️", + ":man_swimming_tone5:": "🏊🏿‍♂️", + ":man_teacher:": "👨‍🏫", + ":man_teacher_dark_skin_tone:": "👨🏿‍🏫", + ":man_teacher_light_skin_tone:": "👨🏻‍🏫", + ":man_teacher_medium_dark_skin_tone:": "👨🏾‍🏫", + ":man_teacher_medium_light_skin_tone:": "👨🏼‍🏫", + ":man_teacher_medium_skin_tone:": "👨🏽‍🏫", + ":man_teacher_tone1:": "👨🏻‍🏫", + ":man_teacher_tone2:": "👨🏼‍🏫", + ":man_teacher_tone3:": "👨🏽‍🏫", + ":man_teacher_tone4:": "👨🏾‍🏫", + ":man_teacher_tone5:": "👨🏿‍🏫", + ":man_technologist:": "👨‍💻", + ":man_technologist_dark_skin_tone:": "👨🏿‍💻", + ":man_technologist_light_skin_tone:": "👨🏻‍💻", + ":man_technologist_medium_dark_skin_tone:": "👨🏾‍💻", + ":man_technologist_medium_light_skin_tone:": "👨🏼‍💻", + ":man_technologist_medium_skin_tone:": "👨🏽‍💻", + ":man_technologist_tone1:": "👨🏻‍💻", + ":man_technologist_tone2:": "👨🏼‍💻", + ":man_technologist_tone3:": "👨🏽‍💻", + ":man_technologist_tone4:": "👨🏾‍💻", + ":man_technologist_tone5:": "👨🏿‍💻", + ":man_tipping_hand:": "💁‍♂️", + ":man_tipping_hand_dark_skin_tone:": "💁🏿‍♂️", + ":man_tipping_hand_light_skin_tone:": "💁🏻‍♂️", + ":man_tipping_hand_medium_dark_skin_tone:": "💁🏾‍♂️", + ":man_tipping_hand_medium_light_skin_tone:": "💁🏼‍♂️", + ":man_tipping_hand_medium_skin_tone:": "💁🏽‍♂️", + ":man_tipping_hand_tone1:": "💁🏻‍♂️", + ":man_tipping_hand_tone2:": "💁🏼‍♂️", + ":man_tipping_hand_tone3:": "💁🏽‍♂️", + ":man_tipping_hand_tone4:": "💁🏾‍♂️", + ":man_tipping_hand_tone5:": "💁🏿‍♂️", + ":man_tone1:": "👨🏻", + ":man_tone1_beard:": "🧔🏻‍♂️", + ":man_tone2:": "👨🏼", + ":man_tone2_beard:": "🧔🏼‍♂️", + ":man_tone3:": "👨🏽", + ":man_tone3_beard:": "🧔🏽‍♂️", + ":man_tone4:": "👨🏾", + ":man_tone4_beard:": "🧔🏾‍♂️", + ":man_tone5:": "👨🏿", + ":man_tone5_beard:": "🧔🏿‍♂️", + ":man_vampire:": "🧛‍♂️", + ":man_vampire_dark_skin_tone:": "🧛🏿‍♂️", + ":man_vampire_light_skin_tone:": "🧛🏻‍♂️", + ":man_vampire_medium_dark_skin_tone:": "🧛🏾‍♂️", + ":man_vampire_medium_light_skin_tone:": "🧛🏼‍♂️", + ":man_vampire_medium_skin_tone:": "🧛🏽‍♂️", + ":man_vampire_tone1:": "🧛🏻‍♂️", + ":man_vampire_tone2:": "🧛🏼‍♂️", + ":man_vampire_tone3:": "🧛🏽‍♂️", + ":man_vampire_tone4:": "🧛🏾‍♂️", + ":man_vampire_tone5:": "🧛🏿‍♂️", + ":man_walking:": "🚶‍♂️", + ":man_walking_dark_skin_tone:": "🚶🏿‍♂️", + ":man_walking_light_skin_tone:": "🚶🏻‍♂️", + ":man_walking_medium_dark_skin_tone:": "🚶🏾‍♂️", + ":man_walking_medium_light_skin_tone:": "🚶🏼‍♂️", + ":man_walking_medium_skin_tone:": "🚶🏽‍♂️", + ":man_walking_tone1:": "🚶🏻‍♂️", + ":man_walking_tone2:": "🚶🏼‍♂️", + ":man_walking_tone3:": "🚶🏽‍♂️", + ":man_walking_tone4:": "🚶🏾‍♂️", + ":man_walking_tone5:": "🚶🏿‍♂️", + ":man_wearing_turban:": "👳‍♂️", + ":man_wearing_turban_dark_skin_tone:": "👳🏿‍♂️", + ":man_wearing_turban_light_skin_tone:": "👳🏻‍♂️", + ":man_wearing_turban_medium_dark_skin_tone:": "👳🏾‍♂️", + ":man_wearing_turban_medium_light_skin_tone:": "👳🏼‍♂️", + ":man_wearing_turban_medium_skin_tone:": "👳🏽‍♂️", + ":man_wearing_turban_tone1:": "👳🏻‍♂️", + ":man_wearing_turban_tone2:": "👳🏼‍♂️", + ":man_wearing_turban_tone3:": "👳🏽‍♂️", + ":man_wearing_turban_tone4:": "👳🏾‍♂️", + ":man_wearing_turban_tone5:": "👳🏿‍♂️", + ":man_white_haired:": "👨‍🦳", + ":man_white_haired_dark_skin_tone:": "👨🏿‍🦳", + ":man_white_haired_light_skin_tone:": "👨🏻‍🦳", + ":man_white_haired_medium_dark_skin_tone:": "👨🏾‍🦳", + ":man_white_haired_medium_light_skin_tone:": "👨🏼‍🦳", + ":man_white_haired_medium_skin_tone:": "👨🏽‍🦳", + ":man_white_haired_tone1:": "👨🏻‍🦳", + ":man_white_haired_tone2:": "👨🏼‍🦳", + ":man_white_haired_tone3:": "👨🏽‍🦳", + ":man_white_haired_tone4:": "👨🏾‍🦳", + ":man_white_haired_tone5:": "👨🏿‍🦳", + ":man_with_chinese_cap:": "👲", + ":man_with_chinese_cap_tone1:": "👲🏻", + ":man_with_chinese_cap_tone2:": "👲🏼", + ":man_with_chinese_cap_tone3:": "👲🏽", + ":man_with_chinese_cap_tone4:": "👲🏾", + ":man_with_chinese_cap_tone5:": "👲🏿", + ":man_with_gua_pi_mao:": "👲", + ":man_with_gua_pi_mao_tone1:": "👲🏻", + ":man_with_gua_pi_mao_tone2:": "👲🏼", + ":man_with_gua_pi_mao_tone3:": "👲🏽", + ":man_with_gua_pi_mao_tone4:": "👲🏾", + ":man_with_gua_pi_mao_tone5:": "👲🏿", + ":man_with_probing_cane:": "👨‍🦯", + ":man_with_probing_cane_dark_skin_tone:": "👨🏿‍🦯", + ":man_with_probing_cane_light_skin_tone:": "👨🏻‍🦯", + ":man_with_probing_cane_medium_dark_skin_tone:": "👨🏾‍🦯", + ":man_with_probing_cane_medium_light_skin_tone:": "👨🏼‍🦯", + ":man_with_probing_cane_medium_skin_tone:": "👨🏽‍🦯", + ":man_with_probing_cane_tone1:": "👨🏻‍🦯", + ":man_with_probing_cane_tone2:": "👨🏼‍🦯", + ":man_with_probing_cane_tone3:": "👨🏽‍🦯", + ":man_with_probing_cane_tone4:": "👨🏾‍🦯", + ":man_with_probing_cane_tone5:": "👨🏿‍🦯", + ":man_with_turban:": "👳", + ":man_with_turban_tone1:": "👳🏻", + ":man_with_turban_tone2:": "👳🏼", + ":man_with_turban_tone3:": "👳🏽", + ":man_with_turban_tone4:": "👳🏾", + ":man_with_turban_tone5:": "👳🏿", + ":man_with_veil:": "👰‍♂️", + ":man_with_veil_dark_skin_tone:": "👰🏿‍♂️", + ":man_with_veil_light_skin_tone:": "👰🏻‍♂️", + ":man_with_veil_medium_dark_skin_tone:": "👰🏾‍♂️", + ":man_with_veil_medium_light_skin_tone:": "👰🏼‍♂️", + ":man_with_veil_medium_skin_tone:": "👰🏽‍♂️", + ":man_with_veil_tone1:": "👰🏻‍♂️", + ":man_with_veil_tone2:": "👰🏼‍♂️", + ":man_with_veil_tone3:": "👰🏽‍♂️", + ":man_with_veil_tone4:": "👰🏾‍♂️", + ":man_with_veil_tone5:": "👰🏿‍♂️", + ":man_zombie:": "🧟‍♂️", + ":mango:": "🥭", + ":mans_shoe:": "👞", + ":mantelpiece_clock:": "🕰", + ":mantlepiece_clock:": "🕰️", + ":manual_wheelchair:": "🦽", + ":map:": "🗺️", + ":maple_leaf:": "🍁", + ":marshall_islands:": "🇲🇭", + ":martial_arts_uniform:": "🥋", + ":martinique:": "🇲🇶", + ":mask:": "😷", + ":massage:": "💆", + ":massage_man:": "💆‍♂️", + ":massage_tone1:": "💆🏻", + ":massage_tone2:": "💆🏼", + ":massage_tone3:": "💆🏽", + ":massage_tone4:": "💆🏾", + ":massage_tone5:": "💆🏿", + ":massage_woman:": "💆", + ":mate:": "🧉", + ":mauritania:": "🇲🇷", + ":mauritius:": "🇲🇺", + ":mayotte:": "🇾🇹", + ":mc:": "🇲🇨", + ":md:": "🇲🇩", + ":me:": "🇲🇪", + ":meat_on_bone:": "🍖", + ":mechanic:": "🧑‍🔧", + ":mechanic_dark_skin_tone:": "🧑🏿‍🔧", + ":mechanic_light_skin_tone:": "🧑🏻‍🔧", + ":mechanic_medium_dark_skin_tone:": "🧑🏾‍🔧", + ":mechanic_medium_light_skin_tone:": "🧑🏼‍🔧", + ":mechanic_medium_skin_tone:": "🧑🏽‍🔧", + ":mechanic_tone1:": "🧑🏻‍🔧", + ":mechanic_tone2:": "🧑🏼‍🔧", + ":mechanic_tone3:": "🧑🏽‍🔧", + ":mechanic_tone4:": "🧑🏾‍🔧", + ":mechanic_tone5:": "🧑🏿‍🔧", + ":mechanical_arm:": "🦾", + ":mechanical_leg:": "🦿", + ":medal:": "🏅", + ":medal_military:": "🎖", + ":medal_sports:": "🏅", + ":medical_symbol:": "⚕️", + ":mega:": "📣", + ":melon:": "🍈", + ":memo:": "📝", + ":men_holding_hands_dark_skin_tone:": "👬🏿", + ":men_holding_hands_dark_skin_tone_light_skin_tone:": "👨🏿‍🤝‍👨🏻", + ":men_holding_hands_dark_skin_tone_medium_dark_skin_tone:": "👨🏿‍🤝‍👨🏾", + ":men_holding_hands_dark_skin_tone_medium_light_skin_tone:": "👨🏿‍🤝‍👨🏼", + ":men_holding_hands_dark_skin_tone_medium_skin_tone:": "👨🏿‍🤝‍👨🏽", + ":men_holding_hands_light_skin_tone:": "👬🏻", + ":men_holding_hands_light_skin_tone_dark_skin_tone:": "👨🏻‍🤝‍👨🏿", + ":men_holding_hands_light_skin_tone_medium_dark_skin_tone:": "👨🏻‍🤝‍👨🏾", + ":men_holding_hands_light_skin_tone_medium_light_skin_tone:": "👨🏻‍🤝‍👨🏼", + ":men_holding_hands_light_skin_tone_medium_skin_tone:": "👨🏻‍🤝‍👨🏽", + ":men_holding_hands_medium_dark_skin_tone:": "👬🏾", + ":men_holding_hands_medium_dark_skin_tone_dark_skin_tone:": "👨🏾‍🤝‍👨🏿", + ":men_holding_hands_medium_dark_skin_tone_light_skin_tone:": "👨🏾‍🤝‍👨🏻", + ":men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone:": "👨🏾‍🤝‍👨🏼", + ":men_holding_hands_medium_dark_skin_tone_medium_skin_tone:": "👨🏾‍🤝‍👨🏽", + ":men_holding_hands_medium_light_skin_tone:": "👬🏼", + ":men_holding_hands_medium_light_skin_tone_dark_skin_tone:": "👨🏼‍🤝‍👨🏿", + ":men_holding_hands_medium_light_skin_tone_light_skin_tone:": "👨🏼‍🤝‍👨🏻", + ":men_holding_hands_medium_light_skin_tone_medium_dark_skin_tone:": "👨🏼‍🤝‍👨🏾", + ":men_holding_hands_medium_light_skin_tone_medium_skin_tone:": "👨🏼‍🤝‍👨🏽", + ":men_holding_hands_medium_skin_tone:": "👬🏽", + ":men_holding_hands_medium_skin_tone_dark_skin_tone:": "👨🏽‍🤝‍👨🏿", + ":men_holding_hands_medium_skin_tone_light_skin_tone:": "👨🏽‍🤝‍👨🏻", + ":men_holding_hands_medium_skin_tone_medium_dark_skin_tone:": "👨🏽‍🤝‍👨🏾", + ":men_holding_hands_medium_skin_tone_medium_light_skin_tone:": "👨🏽‍🤝‍👨🏼", + ":men_holding_hands_tone1:": "👬🏻", + ":men_holding_hands_tone1_tone2:": "👨🏻‍🤝‍👨🏼", + ":men_holding_hands_tone1_tone3:": "👨🏻‍🤝‍👨🏽", + ":men_holding_hands_tone1_tone4:": "👨🏻‍🤝‍👨🏾", + ":men_holding_hands_tone1_tone5:": "👨🏻‍🤝‍👨🏿", + ":men_holding_hands_tone2:": "👬🏼", + ":men_holding_hands_tone2_tone1:": "👨🏼‍🤝‍👨🏻", + ":men_holding_hands_tone2_tone3:": "👨🏼‍🤝‍👨🏽", + ":men_holding_hands_tone2_tone4:": "👨🏼‍🤝‍👨🏾", + ":men_holding_hands_tone2_tone5:": "👨🏼‍🤝‍👨🏿", + ":men_holding_hands_tone3:": "👬🏽", + ":men_holding_hands_tone3_tone1:": "👨🏽‍🤝‍👨🏻", + ":men_holding_hands_tone3_tone2:": "👨🏽‍🤝‍👨🏼", + ":men_holding_hands_tone3_tone4:": "👨🏽‍🤝‍👨🏾", + ":men_holding_hands_tone3_tone5:": "👨🏽‍🤝‍👨🏿", + ":men_holding_hands_tone4:": "👬🏾", + ":men_holding_hands_tone4_tone1:": "👨🏾‍🤝‍👨🏻", + ":men_holding_hands_tone4_tone2:": "👨🏾‍🤝‍👨🏼", + ":men_holding_hands_tone4_tone3:": "👨🏾‍🤝‍👨🏽", + ":men_holding_hands_tone4_tone5:": "👨🏾‍🤝‍👨🏿", + ":men_holding_hands_tone5:": "👬🏿", + ":men_holding_hands_tone5_tone1:": "👨🏿‍🤝‍👨🏻", + ":men_holding_hands_tone5_tone2:": "👨🏿‍🤝‍👨🏼", + ":men_holding_hands_tone5_tone3:": "👨🏿‍🤝‍👨🏽", + ":men_holding_hands_tone5_tone4:": "👨🏿‍🤝‍👨🏾", + ":men_with_bunny_ears_partying:": "👯‍♂️", + ":men_wrestling:": "🤼‍♂️", + ":mending_heart:": "❤️‍🩹", + ":menorah:": "🕎", + ":mens:": "🚹", + ":mermaid:": "🧜‍♀️", + ":mermaid_dark_skin_tone:": "🧜🏿‍♀️", + ":mermaid_light_skin_tone:": "🧜🏻‍♀️", + ":mermaid_medium_dark_skin_tone:": "🧜🏾‍♀️", + ":mermaid_medium_light_skin_tone:": "🧜🏼‍♀️", + ":mermaid_medium_skin_tone:": "🧜🏽‍♀️", + ":mermaid_tone1:": "🧜🏻‍♀️", + ":mermaid_tone2:": "🧜🏼‍♀️", + ":mermaid_tone3:": "🧜🏽‍♀️", + ":mermaid_tone4:": "🧜🏾‍♀️", + ":mermaid_tone5:": "🧜🏿‍♀️", + ":merman:": "🧜‍♂️", + ":merman_dark_skin_tone:": "🧜🏿‍♂️", + ":merman_light_skin_tone:": "🧜🏻‍♂️", + ":merman_medium_dark_skin_tone:": "🧜🏾‍♂️", + ":merman_medium_light_skin_tone:": "🧜🏼‍♂️", + ":merman_medium_skin_tone:": "🧜🏽‍♂️", + ":merman_tone1:": "🧜🏻‍♂️", + ":merman_tone2:": "🧜🏼‍♂️", + ":merman_tone3:": "🧜🏽‍♂️", + ":merman_tone4:": "🧜🏾‍♂️", + ":merman_tone5:": "🧜🏿‍♂️", + ":merperson:": "🧜", + ":merperson_dark_skin_tone:": "🧜🏿", + ":merperson_light_skin_tone:": "🧜🏻", + ":merperson_medium_dark_skin_tone:": "🧜🏾", + ":merperson_medium_light_skin_tone:": "🧜🏼", + ":merperson_medium_skin_tone:": "🧜🏽", + ":merperson_tone1:": "🧜🏻", + ":merperson_tone2:": "🧜🏼", + ":merperson_tone3:": "🧜🏽", + ":merperson_tone4:": "🧜🏾", + ":merperson_tone5:": "🧜🏿", + ":metal:": "🤘", + ":metal_tone1:": "🤘🏻", + ":metal_tone2:": "🤘🏼", + ":metal_tone3:": "🤘🏽", + ":metal_tone4:": "🤘🏾", + ":metal_tone5:": "🤘🏿", + ":metro:": "🚇", + ":mexico:": "🇲🇽", + ":mf:": "🇲🇫", + ":mg:": "🇲🇬", + ":mh:": "🇲🇭", + ":microbe:": "🦠", + ":micronesia:": "🇫🇲", + ":microphone2:": "🎙️", + ":microphone:": "🎤", + ":microscope:": "🔬", + ":middle_finger:": "🖕", + ":middle_finger_tone1:": "🖕🏻", + ":middle_finger_tone2:": "🖕🏼", + ":middle_finger_tone3:": "🖕🏽", + ":middle_finger_tone4:": "🖕🏾", + ":middle_finger_tone5:": "🖕🏿", + ":military_helmet:": "🪖", + ":military_medal:": "🎖️", + ":milk:": "🥛", + ":milk_glass:": "🥛", + ":milky_way:": "🌌", + ":minibus:": "🚐", + ":minidisc:": "💽", + ":mirror:": "🪞", + ":mk:": "🇲🇰", + ":ml:": "🇲🇱", + ":mm:": "🇲🇲", + ":mn:": "🇲🇳", + ":mo:": "🇲🇴", + ":mobile_phone:": "📱", + ":mobile_phone_off:": "📴", + ":moldova:": "🇲🇩", + ":monaco:": "🇲🇨", + ":money_mouth:": "🤑", + ":money_mouth_face:": "🤑", + ":money_with_wings:": "💸", + ":moneybag:": "💰", + ":mongolia:": "🇲🇳", + ":monkey:": "🐒", + ":monkey_face:": "🐵", + ":monorail:": "🚝", + ":montenegro:": "🇲🇪", + ":montserrat:": "🇲🇸", + ":moon:": "🌔", + ":moon_cake:": "🥮", + ":morocco:": "🇲🇦", + ":mortar_board:": "🎓", + ":mosque:": "🕌", + ":mosquito:": "🦟", + ":mother_christmas:": "🤶", + ":mother_christmas_tone1:": "🤶🏻", + ":mother_christmas_tone2:": "🤶🏼", + ":mother_christmas_tone3:": "🤶🏽", + ":mother_christmas_tone4:": "🤶🏾", + ":mother_christmas_tone5:": "🤶🏿", + ":motor_boat:": "🛥", + ":motor_scooter:": "🛵", + ":motorbike:": "🛵", + ":motorboat:": "🛥️", + ":motorcycle:": "🏍️", + ":motorized_wheelchair:": "🦼", + ":motorway:": "🛣️", + ":mount_fuji:": "🗻", + ":mountain:": "⛰️", + ":mountain_bicyclist:": "🚵", + ":mountain_bicyclist_tone1:": "🚵🏻", + ":mountain_bicyclist_tone2:": "🚵🏼", + ":mountain_bicyclist_tone3:": "🚵🏽", + ":mountain_bicyclist_tone4:": "🚵🏾", + ":mountain_bicyclist_tone5:": "🚵🏿", + ":mountain_biking_man:": "🚵", + ":mountain_biking_woman:": "🚵‍♀️", + ":mountain_cableway:": "🚠", + ":mountain_railway:": "🚞", + ":mountain_snow:": "🏔️", + ":mouse2:": "🐁", + ":mouse:": "🐭", + ":mouse_three_button:": "🖱️", + ":mouse_trap:": "🪤", + ":movie_camera:": "🎥", + ":moyai:": "🗿", + ":mozambique:": "🇲🇿", + ":mp:": "🇲🇵", + ":mq:": "🇲🇶", + ":mr:": "🇲🇷", + ":mrs_claus:": "🤶", + ":mrs_claus_tone1:": "🤶🏻", + ":mrs_claus_tone2:": "🤶🏼", + ":mrs_claus_tone3:": "🤶🏽", + ":mrs_claus_tone4:": "🤶🏾", + ":mrs_claus_tone5:": "🤶🏿", + ":ms:": "🇲🇸", + ":mt:": "🇲🇹", + ":mu:": "🇲🇺", + ":muscle:": "💪", + ":muscle_tone1:": "💪🏻", + ":muscle_tone2:": "💪🏼", + ":muscle_tone3:": "💪🏽", + ":muscle_tone4:": "💪🏾", + ":muscle_tone5:": "💪🏿", + ":mushroom:": "🍄", + ":musical_keyboard:": "🎹", + ":musical_note:": "🎵", + ":musical_score:": "🎼", + ":mute:": "🔇", + ":mv:": "🇲🇻", + ":mw:": "🇲🇼", + ":mx:": "🇲🇽", + ":mx_claus:": "🧑‍🎄", + ":mx_claus_dark_skin_tone:": "🧑🏿‍🎄", + ":mx_claus_light_skin_tone:": "🧑🏻‍🎄", + ":mx_claus_medium_dark_skin_tone:": "🧑🏾‍🎄", + ":mx_claus_medium_light_skin_tone:": "🧑🏼‍🎄", + ":mx_claus_medium_skin_tone:": "🧑🏽‍🎄", + ":mx_claus_tone1:": "🧑🏻‍🎄", + ":mx_claus_tone2:": "🧑🏼‍🎄", + ":mx_claus_tone3:": "🧑🏽‍🎄", + ":mx_claus_tone4:": "🧑🏾‍🎄", + ":mx_claus_tone5:": "🧑🏿‍🎄", + ":my:": "🇲🇾", + ":myanmar:": "🇲🇲", + ":mz:": "🇲🇿", + ":na:": "🇳🇦", + ":nail_care:": "💅", + ":nail_care_tone1:": "💅🏻", + ":nail_care_tone2:": "💅🏼", + ":nail_care_tone3:": "💅🏽", + ":nail_care_tone4:": "💅🏾", + ":nail_care_tone5:": "💅🏿", + ":name_badge:": "📛", + ":namibia:": "🇳🇦", + ":national_park:": "🏞️", + ":nauru:": "🇳🇷", + ":nauseated_face:": "🤢", + ":nazar_amulet:": "🧿", + ":nc:": "🇳🇨", + ":ne:": "🇳🇪", + ":necktie:": "👔", + ":negative_squared_cross_mark:": "❎", + ":nepal:": "🇳🇵", + ":nerd:": "🤓", + ":nerd_face:": "🤓", + ":nesting_dolls:": "🪆", + ":netherlands:": "🇳🇱", + ":neutral_face:": "😐", + ":new:": "🆕", + ":new_caledonia:": "🇳🇨", + ":new_moon:": "🌑", + ":new_moon_with_face:": "🌚", + ":new_zealand:": "🇳🇿", + ":newspaper2:": "🗞️", + ":newspaper:": "📰", + ":newspaper_roll:": "🗞", + ":next_track:": "⏭️", + ":next_track_button:": "⏭", + ":nf:": "🇳🇫", + ":ng:": "🆖", + ":ni:": "🇳🇮", + ":nicaragua:": "🇳🇮", + ":niger:": "🇳🇪", + ":nigeria:": "🇳🇬", + ":night_with_stars:": "🌃", + ":nine:": "9️⃣", + ":ninja:": "🥷", + ":ninja_dark_skin_tone:": "🥷🏿", + ":ninja_light_skin_tone:": "🥷🏻", + ":ninja_medium_dark_skin_tone:": "🥷🏾", + ":ninja_medium_light_skin_tone:": "🥷🏼", + ":ninja_medium_skin_tone:": "🥷🏽", + ":ninja_tone1:": "🥷🏻", + ":ninja_tone2:": "🥷🏼", + ":ninja_tone3:": "🥷🏽", + ":ninja_tone4:": "🥷🏾", + ":ninja_tone5:": "🥷🏿", + ":niue:": "🇳🇺", + ":nl:": "🇳🇱", + ":no:": "🇳🇴", + ":no_bell:": "🔕", + ":no_bicycles:": "🚳", + ":no_entry:": "⛔", + ":no_entry_sign:": "🚫", + ":no_good:": "🙅", + ":no_good_man:": "🙅‍♂️", + ":no_good_tone1:": "🙅🏻", + ":no_good_tone2:": "🙅🏼", + ":no_good_tone3:": "🙅🏽", + ":no_good_tone4:": "🙅🏾", + ":no_good_tone5:": "🙅🏿", + ":no_good_woman:": "🙅", + ":no_mobile_phones:": "📵", + ":no_mouth:": "😶", + ":no_pedestrians:": "🚷", + ":no_smoking:": "🚭", + ":non-potable_water:": "🚱", + ":norfolk_island:": "🇳🇫", + ":north_korea:": "🇰🇵", + ":northern_mariana_islands:": "🇲🇵", + ":norway:": "🇳🇴", + ":nose:": "👃", + ":nose_tone1:": "👃🏻", + ":nose_tone2:": "👃🏼", + ":nose_tone3:": "👃🏽", + ":nose_tone4:": "👃🏾", + ":nose_tone5:": "👃🏿", + ":notebook:": "📓", + ":notebook_with_decorative_cover:": "📔", + ":notepad_spiral:": "🗒️", + ":notes:": "🎶", + ":np:": "🇳🇵", + ":nr:": "🇳🇷", + ":nu:": "🇳🇺", + ":nut_and_bolt:": "🔩", + ":nz:": "🇳🇿", + ":o2:": "🅾️", + ":o:": "⭕", + ":ocean:": "🌊", + ":octagonal_sign:": "🛑", + ":octopus:": "🐙", + ":oden:": "🍢", + ":office:": "🏢", + ":office_worker:": "🧑‍💼", + ":office_worker_dark_skin_tone:": "🧑🏿‍💼", + ":office_worker_light_skin_tone:": "🧑🏻‍💼", + ":office_worker_medium_dark_skin_tone:": "🧑🏾‍💼", + ":office_worker_medium_light_skin_tone:": "🧑🏼‍💼", + ":office_worker_medium_skin_tone:": "🧑🏽‍💼", + ":office_worker_tone1:": "🧑🏻‍💼", + ":office_worker_tone2:": "🧑🏼‍💼", + ":office_worker_tone3:": "🧑🏽‍💼", + ":office_worker_tone4:": "🧑🏾‍💼", + ":office_worker_tone5:": "🧑🏿‍💼", + ":oil:": "🛢️", + ":oil_drum:": "🛢️", + ":ok:": "🆗", + ":ok_hand:": "👌", + ":ok_hand_tone1:": "👌🏻", + ":ok_hand_tone2:": "👌🏼", + ":ok_hand_tone3:": "👌🏽", + ":ok_hand_tone4:": "👌🏾", + ":ok_hand_tone5:": "👌🏿", + ":ok_man:": "🙆‍♂️", + ":ok_woman:": "🙆", + ":ok_woman_tone1:": "🙆🏻", + ":ok_woman_tone2:": "🙆🏼", + ":ok_woman_tone3:": "🙆🏽", + ":ok_woman_tone4:": "🙆🏾", + ":ok_woman_tone5:": "🙆🏿", + ":old_key:": "🗝️", + ":older_adult:": "🧓", + ":older_adult_dark_skin_tone:": "🧓🏿", + ":older_adult_light_skin_tone:": "🧓🏻", + ":older_adult_medium_dark_skin_tone:": "🧓🏾", + ":older_adult_medium_light_skin_tone:": "🧓🏼", + ":older_adult_medium_skin_tone:": "🧓🏽", + ":older_adult_tone1:": "🧓🏻", + ":older_adult_tone2:": "🧓🏼", + ":older_adult_tone3:": "🧓🏽", + ":older_adult_tone4:": "🧓🏾", + ":older_adult_tone5:": "🧓🏿", + ":older_man:": "👴", + ":older_man_tone1:": "👴🏻", + ":older_man_tone2:": "👴🏼", + ":older_man_tone3:": "👴🏽", + ":older_man_tone4:": "👴🏾", + ":older_man_tone5:": "👴🏿", + ":older_woman:": "👵", + ":older_woman_tone1:": "👵🏻", + ":older_woman_tone2:": "👵🏼", + ":older_woman_tone3:": "👵🏽", + ":older_woman_tone4:": "👵🏾", + ":older_woman_tone5:": "👵🏿", + ":olive:": "🫒", + ":om:": "🇴🇲", + ":om_symbol:": "🕉️", + ":oman:": "🇴🇲", + ":on:": "🔛", + ":oncoming_automobile:": "🚘", + ":oncoming_bus:": "🚍", + ":oncoming_police_car:": "🚔", + ":oncoming_taxi:": "🚖", + ":one:": "1️⃣", + ":one_piece_swimsuit:": "🩱", + ":onion:": "🧅", + ":open_file_folder:": "📂", + ":open_hands:": "👐", + ":open_hands_tone1:": "👐🏻", + ":open_hands_tone2:": "👐🏼", + ":open_hands_tone3:": "👐🏽", + ":open_hands_tone4:": "👐🏾", + ":open_hands_tone5:": "👐🏿", + ":open_mouth:": "😮", + ":open_umbrella:": "☂️", + ":ophiuchus:": "⛎", + ":orange_book:": "📙", + ":orange_circle:": "🟠", + ":orange_heart:": "🧡", + ":orange_square:": "🟧", + ":orangutan:": "🦧", + ":orthodox_cross:": "☦️", + ":otter:": "🦦", + ":outbox_tray:": "📤", + ":owl:": "🦉", + ":ox:": "🐂", + ":oyster:": "🦪", + ":pa:": "🇵🇦", + ":package:": "📦", + ":paella:": "🥘", + ":page_facing_up:": "📄", + ":page_with_curl:": "📃", + ":pager:": "📟", + ":paintbrush:": "🖌️", + ":pakistan:": "🇵🇰", + ":palau:": "🇵🇼", + ":palestinian_territories:": "🇵🇸", + ":palm_tree:": "🌴", + ":palms_up_together:": "🤲", + ":palms_up_together_dark_skin_tone:": "🤲🏿", + ":palms_up_together_light_skin_tone:": "🤲🏻", + ":palms_up_together_medium_dark_skin_tone:": "🤲🏾", + ":palms_up_together_medium_light_skin_tone:": "🤲🏼", + ":palms_up_together_medium_skin_tone:": "🤲🏽", + ":palms_up_together_tone1:": "🤲🏻", + ":palms_up_together_tone2:": "🤲🏼", + ":palms_up_together_tone3:": "🤲🏽", + ":palms_up_together_tone4:": "🤲🏾", + ":palms_up_together_tone5:": "🤲🏿", + ":panama:": "🇵🇦", + ":pancakes:": "🥞", + ":panda_face:": "🐼", + ":paperclip:": "📎", + ":paperclips:": "🖇️", + ":papua_new_guinea:": "🇵🇬", + ":parachute:": "🪂", + ":paraguay:": "🇵🇾", + ":parasol_on_ground:": "⛱", + ":park:": "🏞️", + ":parking:": "🅿️", + ":parrot:": "🦜", + ":part_alternation_mark:": "〽️", + ":partly_sunny:": "⛅", + ":partying_face:": "🥳", + ":passenger_ship:": "🛳️", + ":passport_control:": "🛂", + ":pause_button:": "⏸️", + ":paw_prints:": "🐾", + ":pe:": "🇵🇪", + ":peace:": "☮️", + ":peace_symbol:": "☮️", + ":peach:": "🍑", + ":peacock:": "🦚", + ":peanuts:": "🥜", + ":pear:": "🍐", + ":pen:": "🖊", + ":pen_ballpoint:": "🖊️", + ":pen_fountain:": "🖋️", + ":pencil2:": "✏️", + ":pencil:": "📝", + ":penguin:": "🐧", + ":pensive:": "😔", + ":people_holding_hands:": "🧑‍🤝‍🧑", + ":people_holding_hands_dark_skin_tone:": "🧑🏿‍🤝‍🧑🏿", + ":people_holding_hands_dark_skin_tone_light_skin_tone:": "🧑🏿‍🤝‍🧑🏻", + ":people_holding_hands_dark_skin_tone_medium_dark_skin_tone:": "🧑🏿‍🤝‍🧑🏾", + ":people_holding_hands_dark_skin_tone_medium_light_skin_tone:": "🧑🏿‍🤝‍🧑🏼", + ":people_holding_hands_dark_skin_tone_medium_skin_tone:": "🧑🏿‍🤝‍🧑🏽", + ":people_holding_hands_light_skin_tone:": "🧑🏻‍🤝‍🧑🏻", + ":people_holding_hands_light_skin_tone_dark_skin_tone:": "🧑🏻‍🤝‍🧑🏿", + ":people_holding_hands_light_skin_tone_medium_dark_skin_tone:": "🧑🏻‍🤝‍🧑🏾", + ":people_holding_hands_light_skin_tone_medium_light_skin_tone:": "🧑🏻‍🤝‍🧑🏼", + ":people_holding_hands_light_skin_tone_medium_skin_tone:": "🧑🏻‍🤝‍🧑🏽", + ":people_holding_hands_medium_dark_skin_tone:": "🧑🏾‍🤝‍🧑🏾", + ":people_holding_hands_medium_dark_skin_tone_dark_skin_tone:": "🧑🏾‍🤝‍🧑🏿", + ":people_holding_hands_medium_dark_skin_tone_light_skin_tone:": "🧑🏾‍🤝‍🧑🏻", + ":people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone:": "🧑🏾‍🤝‍🧑🏼", + ":people_holding_hands_medium_dark_skin_tone_medium_skin_tone:": "🧑🏾‍🤝‍🧑🏽", + ":people_holding_hands_medium_light_skin_tone:": "🧑🏼‍🤝‍🧑🏼", + ":people_holding_hands_medium_light_skin_tone_dark_skin_tone:": "🧑🏼‍🤝‍🧑🏿", + ":people_holding_hands_medium_light_skin_tone_light_skin_tone:": "🧑🏼‍🤝‍🧑🏻", + ":people_holding_hands_medium_light_skin_tone_medium_dark_skin_tone:": "🧑🏼‍🤝‍🧑🏾", + ":people_holding_hands_medium_light_skin_tone_medium_skin_tone:": "🧑🏼‍🤝‍🧑🏽", + ":people_holding_hands_medium_skin_tone:": "🧑🏽‍🤝‍🧑🏽", + ":people_holding_hands_medium_skin_tone_dark_skin_tone:": "🧑🏽‍🤝‍🧑🏿", + ":people_holding_hands_medium_skin_tone_light_skin_tone:": "🧑🏽‍🤝‍🧑🏻", + ":people_holding_hands_medium_skin_tone_medium_dark_skin_tone:": "🧑🏽‍🤝‍🧑🏾", + ":people_holding_hands_medium_skin_tone_medium_light_skin_tone:": "🧑🏽‍🤝‍🧑🏼", + ":people_holding_hands_tone1:": "🧑🏻‍🤝‍🧑🏻", + ":people_holding_hands_tone1_tone2:": "🧑🏻‍🤝‍🧑🏼", + ":people_holding_hands_tone1_tone3:": "🧑🏻‍🤝‍🧑🏽", + ":people_holding_hands_tone1_tone4:": "🧑🏻‍🤝‍🧑🏾", + ":people_holding_hands_tone1_tone5:": "🧑🏻‍🤝‍🧑🏿", + ":people_holding_hands_tone2:": "🧑🏼‍🤝‍🧑🏼", + ":people_holding_hands_tone2_tone1:": "🧑🏼‍🤝‍🧑🏻", + ":people_holding_hands_tone2_tone3:": "🧑🏼‍🤝‍🧑🏽", + ":people_holding_hands_tone2_tone4:": "🧑🏼‍🤝‍🧑🏾", + ":people_holding_hands_tone2_tone5:": "🧑🏼‍🤝‍🧑🏿", + ":people_holding_hands_tone3:": "🧑🏽‍🤝‍🧑🏽", + ":people_holding_hands_tone3_tone1:": "🧑🏽‍🤝‍🧑🏻", + ":people_holding_hands_tone3_tone2:": "🧑🏽‍🤝‍🧑🏼", + ":people_holding_hands_tone3_tone4:": "🧑🏽‍🤝‍🧑🏾", + ":people_holding_hands_tone3_tone5:": "🧑🏽‍🤝‍🧑🏿", + ":people_holding_hands_tone4:": "🧑🏾‍🤝‍🧑🏾", + ":people_holding_hands_tone4_tone1:": "🧑🏾‍🤝‍🧑🏻", + ":people_holding_hands_tone4_tone2:": "🧑🏾‍🤝‍🧑🏼", + ":people_holding_hands_tone4_tone3:": "🧑🏾‍🤝‍🧑🏽", + ":people_holding_hands_tone4_tone5:": "🧑🏾‍🤝‍🧑🏿", + ":people_holding_hands_tone5:": "🧑🏿‍🤝‍🧑🏿", + ":people_holding_hands_tone5_tone1:": "🧑🏿‍🤝‍🧑🏻", + ":people_holding_hands_tone5_tone2:": "🧑🏿‍🤝‍🧑🏼", + ":people_holding_hands_tone5_tone3:": "🧑🏿‍🤝‍🧑🏽", + ":people_holding_hands_tone5_tone4:": "🧑🏿‍🤝‍🧑🏾", + ":people_hugging:": "🫂", + ":people_with_bunny_ears_partying:": "👯", + ":people_wrestling:": "🤼", + ":performing_arts:": "🎭", + ":persevere:": "😣", + ":person_bald:": "🧑‍🦲", + ":person_biking:": "🚴", + ":person_biking_tone1:": "🚴🏻", + ":person_biking_tone2:": "🚴🏼", + ":person_biking_tone3:": "🚴🏽", + ":person_biking_tone4:": "🚴🏾", + ":person_biking_tone5:": "🚴🏿", + ":person_bouncing_ball:": "⛹", + ":person_bouncing_ball_tone1:": "⛹🏻", + ":person_bouncing_ball_tone2:": "⛹🏼", + ":person_bouncing_ball_tone3:": "⛹🏽", + ":person_bouncing_ball_tone4:": "⛹🏾", + ":person_bouncing_ball_tone5:": "⛹🏿", + ":person_bowing:": "🙇", + ":person_bowing_tone1:": "🙇🏻", + ":person_bowing_tone2:": "🙇🏼", + ":person_bowing_tone3:": "🙇🏽", + ":person_bowing_tone4:": "🙇🏾", + ":person_bowing_tone5:": "🙇🏿", + ":person_climbing:": "🧗", + ":person_climbing_dark_skin_tone:": "🧗🏿", + ":person_climbing_light_skin_tone:": "🧗🏻", + ":person_climbing_medium_dark_skin_tone:": "🧗🏾", + ":person_climbing_medium_light_skin_tone:": "🧗🏼", + ":person_climbing_medium_skin_tone:": "🧗🏽", + ":person_climbing_tone1:": "🧗🏻", + ":person_climbing_tone2:": "🧗🏼", + ":person_climbing_tone3:": "🧗🏽", + ":person_climbing_tone4:": "🧗🏾", + ":person_climbing_tone5:": "🧗🏿", + ":person_curly_hair:": "🧑‍🦱", + ":person_dark_skin_tone_bald:": "🧑🏿‍🦲", + ":person_dark_skin_tone_curly_hair:": "🧑🏿‍🦱", + ":person_dark_skin_tone_red_hair:": "🧑🏿‍🦰", + ":person_dark_skin_tone_white_hair:": "🧑🏿‍🦳", + ":person_doing_cartwheel:": "🤸", + ":person_doing_cartwheel_tone1:": "🤸🏻", + ":person_doing_cartwheel_tone2:": "🤸🏼", + ":person_doing_cartwheel_tone3:": "🤸🏽", + ":person_doing_cartwheel_tone4:": "🤸🏾", + ":person_doing_cartwheel_tone5:": "🤸🏿", + ":person_facepalming:": "🤦", + ":person_facepalming_tone1:": "🤦🏻", + ":person_facepalming_tone2:": "🤦🏼", + ":person_facepalming_tone3:": "🤦🏽", + ":person_facepalming_tone4:": "🤦🏾", + ":person_facepalming_tone5:": "🤦🏿", + ":person_feeding_baby:": "🧑‍🍼", + ":person_feeding_baby_dark_skin_tone:": "🧑🏿‍🍼", + ":person_feeding_baby_light_skin_tone:": "🧑🏻‍🍼", + ":person_feeding_baby_medium_dark_skin_tone:": "🧑🏾‍🍼", + ":person_feeding_baby_medium_light_skin_tone:": "🧑🏼‍🍼", + ":person_feeding_baby_medium_skin_tone:": "🧑🏽‍🍼", + ":person_feeding_baby_tone1:": "🧑🏻‍🍼", + ":person_feeding_baby_tone2:": "🧑🏼‍🍼", + ":person_feeding_baby_tone3:": "🧑🏽‍🍼", + ":person_feeding_baby_tone4:": "🧑🏾‍🍼", + ":person_feeding_baby_tone5:": "🧑🏿‍🍼", + ":person_fencing:": "🤺", + ":person_frowning:": "🙍", + ":person_frowning_tone1:": "🙍🏻", + ":person_frowning_tone2:": "🙍🏼", + ":person_frowning_tone3:": "🙍🏽", + ":person_frowning_tone4:": "🙍🏾", + ":person_frowning_tone5:": "🙍🏿", + ":person_gesturing_no:": "🙅", + ":person_gesturing_no_tone1:": "🙅🏻", + ":person_gesturing_no_tone2:": "🙅🏼", + ":person_gesturing_no_tone3:": "🙅🏽", + ":person_gesturing_no_tone4:": "🙅🏾", + ":person_gesturing_no_tone5:": "🙅🏿", + ":person_gesturing_ok:": "🙆", + ":person_gesturing_ok_tone1:": "🙆🏻", + ":person_gesturing_ok_tone2:": "🙆🏼", + ":person_gesturing_ok_tone3:": "🙆🏽", + ":person_gesturing_ok_tone4:": "🙆🏾", + ":person_gesturing_ok_tone5:": "🙆🏿", + ":person_getting_haircut:": "💇", + ":person_getting_haircut_tone1:": "💇🏻", + ":person_getting_haircut_tone2:": "💇🏼", + ":person_getting_haircut_tone3:": "💇🏽", + ":person_getting_haircut_tone4:": "💇🏾", + ":person_getting_haircut_tone5:": "💇🏿", + ":person_getting_massage:": "💆", + ":person_getting_massage_tone1:": "💆🏻", + ":person_getting_massage_tone2:": "💆🏼", + ":person_getting_massage_tone3:": "💆🏽", + ":person_getting_massage_tone4:": "💆🏾", + ":person_getting_massage_tone5:": "💆🏿", + ":person_golfing:": "🏌", + ":person_golfing_dark_skin_tone:": "🏌🏿", + ":person_golfing_light_skin_tone:": "🏌🏻", + ":person_golfing_medium_dark_skin_tone:": "🏌🏾", + ":person_golfing_medium_light_skin_tone:": "🏌🏼", + ":person_golfing_medium_skin_tone:": "🏌🏽", + ":person_golfing_tone1:": "🏌🏻", + ":person_golfing_tone2:": "🏌🏼", + ":person_golfing_tone3:": "🏌🏽", + ":person_golfing_tone4:": "🏌🏾", + ":person_golfing_tone5:": "🏌🏿", + ":person_in_bed_dark_skin_tone:": "🛌🏿", + ":person_in_bed_light_skin_tone:": "🛌🏻", + ":person_in_bed_medium_dark_skin_tone:": "🛌🏾", + ":person_in_bed_medium_light_skin_tone:": "🛌🏼", + ":person_in_bed_medium_skin_tone:": "🛌🏽", + ":person_in_bed_tone1:": "🛌🏻", + ":person_in_bed_tone2:": "🛌🏼", + ":person_in_bed_tone3:": "🛌🏽", + ":person_in_bed_tone4:": "🛌🏾", + ":person_in_bed_tone5:": "🛌🏿", + ":person_in_lotus_position:": "🧘", + ":person_in_lotus_position_dark_skin_tone:": "🧘🏿", + ":person_in_lotus_position_light_skin_tone:": "🧘🏻", + ":person_in_lotus_position_medium_dark_skin_tone:": "🧘🏾", + ":person_in_lotus_position_medium_light_skin_tone:": "🧘🏼", + ":person_in_lotus_position_medium_skin_tone:": "🧘🏽", + ":person_in_lotus_position_tone1:": "🧘🏻", + ":person_in_lotus_position_tone2:": "🧘🏼", + ":person_in_lotus_position_tone3:": "🧘🏽", + ":person_in_lotus_position_tone4:": "🧘🏾", + ":person_in_lotus_position_tone5:": "🧘🏿", + ":person_in_manual_wheelchair:": "🧑‍🦽", + ":person_in_manual_wheelchair_dark_skin_tone:": "🧑🏿‍🦽", + ":person_in_manual_wheelchair_light_skin_tone:": "🧑🏻‍🦽", + ":person_in_manual_wheelchair_medium_dark_skin_tone:": "🧑🏾‍🦽", + ":person_in_manual_wheelchair_medium_light_skin_tone:": "🧑🏼‍🦽", + ":person_in_manual_wheelchair_medium_skin_tone:": "🧑🏽‍🦽", + ":person_in_manual_wheelchair_tone1:": "🧑🏻‍🦽", + ":person_in_manual_wheelchair_tone2:": "🧑🏼‍🦽", + ":person_in_manual_wheelchair_tone3:": "🧑🏽‍🦽", + ":person_in_manual_wheelchair_tone4:": "🧑🏾‍🦽", + ":person_in_manual_wheelchair_tone5:": "🧑🏿‍🦽", + ":person_in_motorized_wheelchair:": "🧑‍🦼", + ":person_in_motorized_wheelchair_dark_skin_tone:": "🧑🏿‍🦼", + ":person_in_motorized_wheelchair_light_skin_tone:": "🧑🏻‍🦼", + ":person_in_motorized_wheelchair_medium_dark_skin_tone:": "🧑🏾‍🦼", + ":person_in_motorized_wheelchair_medium_light_skin_tone:": "🧑🏼‍🦼", + ":person_in_motorized_wheelchair_medium_skin_tone:": "🧑🏽‍🦼", + ":person_in_motorized_wheelchair_tone1:": "🧑🏻‍🦼", + ":person_in_motorized_wheelchair_tone2:": "🧑🏼‍🦼", + ":person_in_motorized_wheelchair_tone3:": "🧑🏽‍🦼", + ":person_in_motorized_wheelchair_tone4:": "🧑🏾‍🦼", + ":person_in_motorized_wheelchair_tone5:": "🧑🏿‍🦼", + ":person_in_steamy_room:": "🧖", + ":person_in_steamy_room_dark_skin_tone:": "🧖🏿", + ":person_in_steamy_room_light_skin_tone:": "🧖🏻", + ":person_in_steamy_room_medium_dark_skin_tone:": "🧖🏾", + ":person_in_steamy_room_medium_light_skin_tone:": "🧖🏼", + ":person_in_steamy_room_medium_skin_tone:": "🧖🏽", + ":person_in_steamy_room_tone1:": "🧖🏻", + ":person_in_steamy_room_tone2:": "🧖🏼", + ":person_in_steamy_room_tone3:": "🧖🏽", + ":person_in_steamy_room_tone4:": "🧖🏾", + ":person_in_steamy_room_tone5:": "🧖🏿", + ":person_in_tuxedo:": "🤵", + ":person_in_tuxedo_tone1:": "🤵🏻", + ":person_in_tuxedo_tone2:": "🤵🏼", + ":person_in_tuxedo_tone3:": "🤵🏽", + ":person_in_tuxedo_tone4:": "🤵🏾", + ":person_in_tuxedo_tone5:": "🤵🏿", + ":person_juggling:": "🤹", + ":person_juggling_tone1:": "🤹🏻", + ":person_juggling_tone2:": "🤹🏼", + ":person_juggling_tone3:": "🤹🏽", + ":person_juggling_tone4:": "🤹🏾", + ":person_juggling_tone5:": "🤹🏿", + ":person_kneeling:": "🧎", + ":person_kneeling_dark_skin_tone:": "🧎🏿", + ":person_kneeling_light_skin_tone:": "🧎🏻", + ":person_kneeling_medium_dark_skin_tone:": "🧎🏾", + ":person_kneeling_medium_light_skin_tone:": "🧎🏼", + ":person_kneeling_medium_skin_tone:": "🧎🏽", + ":person_kneeling_tone1:": "🧎🏻", + ":person_kneeling_tone2:": "🧎🏼", + ":person_kneeling_tone3:": "🧎🏽", + ":person_kneeling_tone4:": "🧎🏾", + ":person_kneeling_tone5:": "🧎🏿", + ":person_lifting_weights:": "🏋", + ":person_lifting_weights_tone1:": "🏋🏻", + ":person_lifting_weights_tone2:": "🏋🏼", + ":person_lifting_weights_tone3:": "🏋🏽", + ":person_lifting_weights_tone4:": "🏋🏾", + ":person_lifting_weights_tone5:": "🏋🏿", + ":person_light_skin_tone_bald:": "🧑🏻‍🦲", + ":person_light_skin_tone_curly_hair:": "🧑🏻‍🦱", + ":person_light_skin_tone_red_hair:": "🧑🏻‍🦰", + ":person_light_skin_tone_white_hair:": "🧑🏻‍🦳", + ":person_medium_dark_skin_tone_bald:": "🧑🏾‍🦲", + ":person_medium_dark_skin_tone_curly_hair:": "🧑🏾‍🦱", + ":person_medium_dark_skin_tone_red_hair:": "🧑🏾‍🦰", + ":person_medium_dark_skin_tone_white_hair:": "🧑🏾‍🦳", + ":person_medium_light_skin_tone_bald:": "🧑🏼‍🦲", + ":person_medium_light_skin_tone_curly_hair:": "🧑🏼‍🦱", + ":person_medium_light_skin_tone_red_hair:": "🧑🏼‍🦰", + ":person_medium_light_skin_tone_white_hair:": "🧑🏼‍🦳", + ":person_medium_skin_tone_bald:": "🧑🏽‍🦲", + ":person_medium_skin_tone_curly_hair:": "🧑🏽‍🦱", + ":person_medium_skin_tone_red_hair:": "🧑🏽‍🦰", + ":person_medium_skin_tone_white_hair:": "🧑🏽‍🦳", + ":person_mountain_biking:": "🚵", + ":person_mountain_biking_tone1:": "🚵🏻", + ":person_mountain_biking_tone2:": "🚵🏼", + ":person_mountain_biking_tone3:": "🚵🏽", + ":person_mountain_biking_tone4:": "🚵🏾", + ":person_mountain_biking_tone5:": "🚵🏿", + ":person_playing_handball:": "🤾", + ":person_playing_handball_tone1:": "🤾🏻", + ":person_playing_handball_tone2:": "🤾🏼", + ":person_playing_handball_tone3:": "🤾🏽", + ":person_playing_handball_tone4:": "🤾🏾", + ":person_playing_handball_tone5:": "🤾🏿", + ":person_playing_water_polo:": "🤽", + ":person_playing_water_polo_tone1:": "🤽🏻", + ":person_playing_water_polo_tone2:": "🤽🏼", + ":person_playing_water_polo_tone3:": "🤽🏽", + ":person_playing_water_polo_tone4:": "🤽🏾", + ":person_playing_water_polo_tone5:": "🤽🏿", + ":person_pouting:": "🙎", + ":person_pouting_tone1:": "🙎🏻", + ":person_pouting_tone2:": "🙎🏼", + ":person_pouting_tone3:": "🙎🏽", + ":person_pouting_tone4:": "🙎🏾", + ":person_pouting_tone5:": "🙎🏿", + ":person_raising_hand:": "🙋", + ":person_raising_hand_tone1:": "🙋🏻", + ":person_raising_hand_tone2:": "🙋🏼", + ":person_raising_hand_tone3:": "🙋🏽", + ":person_raising_hand_tone4:": "🙋🏾", + ":person_raising_hand_tone5:": "🙋🏿", + ":person_red_hair:": "🧑‍🦰", + ":person_rowing_boat:": "🚣", + ":person_rowing_boat_tone1:": "🚣🏻", + ":person_rowing_boat_tone2:": "🚣🏼", + ":person_rowing_boat_tone3:": "🚣🏽", + ":person_rowing_boat_tone4:": "🚣🏾", + ":person_rowing_boat_tone5:": "🚣🏿", + ":person_running:": "🏃", + ":person_running_tone1:": "🏃🏻", + ":person_running_tone2:": "🏃🏼", + ":person_running_tone3:": "🏃🏽", + ":person_running_tone4:": "🏃🏾", + ":person_running_tone5:": "🏃🏿", + ":person_shrugging:": "🤷", + ":person_shrugging_tone1:": "🤷🏻", + ":person_shrugging_tone2:": "🤷🏼", + ":person_shrugging_tone3:": "🤷🏽", + ":person_shrugging_tone4:": "🤷🏾", + ":person_shrugging_tone5:": "🤷🏿", + ":person_standing:": "🧍", + ":person_standing_dark_skin_tone:": "🧍🏿", + ":person_standing_light_skin_tone:": "🧍🏻", + ":person_standing_medium_dark_skin_tone:": "🧍🏾", + ":person_standing_medium_light_skin_tone:": "🧍🏼", + ":person_standing_medium_skin_tone:": "🧍🏽", + ":person_standing_tone1:": "🧍🏻", + ":person_standing_tone2:": "🧍🏼", + ":person_standing_tone3:": "🧍🏽", + ":person_standing_tone4:": "🧍🏾", + ":person_standing_tone5:": "🧍🏿", + ":person_surfing:": "🏄", + ":person_surfing_tone1:": "🏄🏻", + ":person_surfing_tone2:": "🏄🏼", + ":person_surfing_tone3:": "🏄🏽", + ":person_surfing_tone4:": "🏄🏾", + ":person_surfing_tone5:": "🏄🏿", + ":person_swimming:": "🏊", + ":person_swimming_tone1:": "🏊🏻", + ":person_swimming_tone2:": "🏊🏼", + ":person_swimming_tone3:": "🏊🏽", + ":person_swimming_tone4:": "🏊🏾", + ":person_swimming_tone5:": "🏊🏿", + ":person_tipping_hand:": "💁", + ":person_tipping_hand_tone1:": "💁🏻", + ":person_tipping_hand_tone2:": "💁🏼", + ":person_tipping_hand_tone3:": "💁🏽", + ":person_tipping_hand_tone4:": "💁🏾", + ":person_tipping_hand_tone5:": "💁🏿", + ":person_tone1_bald:": "🧑🏻‍🦲", + ":person_tone1_curly_hair:": "🧑🏻‍🦱", + ":person_tone1_red_hair:": "🧑🏻‍🦰", + ":person_tone1_white_hair:": "🧑🏻‍🦳", + ":person_tone2_bald:": "🧑🏼‍🦲", + ":person_tone2_curly_hair:": "🧑🏼‍🦱", + ":person_tone2_red_hair:": "🧑🏼‍🦰", + ":person_tone2_white_hair:": "🧑🏼‍🦳", + ":person_tone3_bald:": "🧑🏽‍🦲", + ":person_tone3_curly_hair:": "🧑🏽‍🦱", + ":person_tone3_red_hair:": "🧑🏽‍🦰", + ":person_tone3_white_hair:": "🧑🏽‍🦳", + ":person_tone4_bald:": "🧑🏾‍🦲", + ":person_tone4_curly_hair:": "🧑🏾‍🦱", + ":person_tone4_red_hair:": "🧑🏾‍🦰", + ":person_tone4_white_hair:": "🧑🏾‍🦳", + ":person_tone5_bald:": "🧑🏿‍🦲", + ":person_tone5_curly_hair:": "🧑🏿‍🦱", + ":person_tone5_red_hair:": "🧑🏿‍🦰", + ":person_tone5_white_hair:": "🧑🏿‍🦳", + ":person_walking:": "🚶", + ":person_walking_tone1:": "🚶🏻", + ":person_walking_tone2:": "🚶🏼", + ":person_walking_tone3:": "🚶🏽", + ":person_walking_tone4:": "🚶🏾", + ":person_walking_tone5:": "🚶🏿", + ":person_wearing_turban:": "👳", + ":person_wearing_turban_tone1:": "👳🏻", + ":person_wearing_turban_tone2:": "👳🏼", + ":person_wearing_turban_tone3:": "👳🏽", + ":person_wearing_turban_tone4:": "👳🏾", + ":person_wearing_turban_tone5:": "👳🏿", + ":person_white_hair:": "🧑‍🦳", + ":person_with_ball:": "⛹", + ":person_with_ball_tone1:": "⛹🏻", + ":person_with_ball_tone2:": "⛹🏼", + ":person_with_ball_tone3:": "⛹🏽", + ":person_with_ball_tone4:": "⛹🏾", + ":person_with_ball_tone5:": "⛹🏿", + ":person_with_blond_hair:": "👱", + ":person_with_blond_hair_tone1:": "👱🏻", + ":person_with_blond_hair_tone2:": "👱🏼", + ":person_with_blond_hair_tone3:": "👱🏽", + ":person_with_blond_hair_tone4:": "👱🏾", + ":person_with_blond_hair_tone5:": "👱🏿", + ":person_with_pouting_face:": "🙎", + ":person_with_pouting_face_tone1:": "🙎🏻", + ":person_with_pouting_face_tone2:": "🙎🏼", + ":person_with_pouting_face_tone3:": "🙎🏽", + ":person_with_pouting_face_tone4:": "🙎🏾", + ":person_with_pouting_face_tone5:": "🙎🏿", + ":person_with_probing_cane:": "🧑‍🦯", + ":person_with_probing_cane_dark_skin_tone:": "🧑🏿‍🦯", + ":person_with_probing_cane_light_skin_tone:": "🧑🏻‍🦯", + ":person_with_probing_cane_medium_dark_skin_tone:": "🧑🏾‍🦯", + ":person_with_probing_cane_medium_light_skin_tone:": "🧑🏼‍🦯", + ":person_with_probing_cane_medium_skin_tone:": "🧑🏽‍🦯", + ":person_with_probing_cane_tone1:": "🧑🏻‍🦯", + ":person_with_probing_cane_tone2:": "🧑🏼‍🦯", + ":person_with_probing_cane_tone3:": "🧑🏽‍🦯", + ":person_with_probing_cane_tone4:": "🧑🏾‍🦯", + ":person_with_probing_cane_tone5:": "🧑🏿‍🦯", + ":person_with_veil:": "👰", + ":person_with_veil_tone1:": "👰🏻", + ":person_with_veil_tone2:": "👰🏼", + ":person_with_veil_tone3:": "👰🏽", + ":person_with_veil_tone4:": "👰🏾", + ":person_with_veil_tone5:": "👰🏿", + ":peru:": "🇵🇪", + ":petri_dish:": "🧫", + ":pf:": "🇵🇫", + ":pg:": "🇵🇬", + ":ph:": "🇵🇭", + ":philippines:": "🇵🇭", + ":phone:": "☎️", + ":pick:": "⛏️", + ":pickup_truck:": "🛻", + ":pie:": "🥧", + ":pig2:": "🐖", + ":pig:": "🐷", + ":pig_nose:": "🐽", + ":pill:": "💊", + ":pilot:": "🧑‍✈️", + ":pilot_dark_skin_tone:": "🧑🏿‍✈️", + ":pilot_light_skin_tone:": "🧑🏻‍✈️", + ":pilot_medium_dark_skin_tone:": "🧑🏾‍✈️", + ":pilot_medium_light_skin_tone:": "🧑🏼‍✈️", + ":pilot_medium_skin_tone:": "🧑🏽‍✈️", + ":pilot_tone1:": "🧑🏻‍✈️", + ":pilot_tone2:": "🧑🏼‍✈️", + ":pilot_tone3:": "🧑🏽‍✈️", + ":pilot_tone4:": "🧑🏾‍✈️", + ":pilot_tone5:": "🧑🏿‍✈️", + ":pinched_fingers:": "🤌", + ":pinched_fingers_dark_skin_tone:": "🤌🏿", + ":pinched_fingers_light_skin_tone:": "🤌🏻", + ":pinched_fingers_medium_dark_skin_tone:": "🤌🏾", + ":pinched_fingers_medium_light_skin_tone:": "🤌🏼", + ":pinched_fingers_medium_skin_tone:": "🤌🏽", + ":pinched_fingers_tone1:": "🤌🏻", + ":pinched_fingers_tone2:": "🤌🏼", + ":pinched_fingers_tone3:": "🤌🏽", + ":pinched_fingers_tone4:": "🤌🏾", + ":pinched_fingers_tone5:": "🤌🏿", + ":pinching_hand:": "🤏", + ":pinching_hand_dark_skin_tone:": "🤏🏿", + ":pinching_hand_light_skin_tone:": "🤏🏻", + ":pinching_hand_medium_dark_skin_tone:": "🤏🏾", + ":pinching_hand_medium_light_skin_tone:": "🤏🏼", + ":pinching_hand_medium_skin_tone:": "🤏🏽", + ":pinching_hand_tone1:": "🤏🏻", + ":pinching_hand_tone2:": "🤏🏼", + ":pinching_hand_tone3:": "🤏🏽", + ":pinching_hand_tone4:": "🤏🏾", + ":pinching_hand_tone5:": "🤏🏿", + ":pineapple:": "🍍", + ":ping_pong:": "🏓", + ":pirate_flag:": "🏴‍☠️", + ":pisces:": "♓", + ":pitcairn_islands:": "🇵🇳", + ":pizza:": "🍕", + ":piñata:": "🪅", + ":pk:": "🇵🇰", + ":pl:": "🇵🇱", + ":placard:": "🪧", + ":place_of_worship:": "🛐", + ":plate_with_cutlery:": "🍽", + ":play_or_pause_button:": "⏯", + ":play_pause:": "⏯️", + ":pleading_face:": "🥺", + ":plunger:": "🪠", + ":pm:": "🇵🇲", + ":pn:": "🇵🇳", + ":point_down:": "👇", + ":point_down_tone1:": "👇🏻", + ":point_down_tone2:": "👇🏼", + ":point_down_tone3:": "👇🏽", + ":point_down_tone4:": "👇🏾", + ":point_down_tone5:": "👇🏿", + ":point_left:": "👈", + ":point_left_tone1:": "👈🏻", + ":point_left_tone2:": "👈🏼", + ":point_left_tone3:": "👈🏽", + ":point_left_tone4:": "👈🏾", + ":point_left_tone5:": "👈🏿", + ":point_right:": "👉", + ":point_right_tone1:": "👉🏻", + ":point_right_tone2:": "👉🏼", + ":point_right_tone3:": "👉🏽", + ":point_right_tone4:": "👉🏾", + ":point_right_tone5:": "👉🏿", + ":point_up:": "☝️", + ":point_up_2:": "👆", + ":point_up_2_tone1:": "👆🏻", + ":point_up_2_tone2:": "👆🏼", + ":point_up_2_tone3:": "👆🏽", + ":point_up_2_tone4:": "👆🏾", + ":point_up_2_tone5:": "👆🏿", + ":point_up_tone1:": "☝🏻", + ":point_up_tone2:": "☝🏼", + ":point_up_tone3:": "☝🏽", + ":point_up_tone4:": "☝🏾", + ":point_up_tone5:": "☝🏿", + ":poland:": "🇵🇱", + ":polar_bear:": "🐻‍❄️", + ":police_car:": "🚓", + ":police_officer:": "👮", + ":police_officer_tone1:": "👮🏻", + ":police_officer_tone2:": "👮🏼", + ":police_officer_tone3:": "👮🏽", + ":police_officer_tone4:": "👮🏾", + ":police_officer_tone5:": "👮🏿", + ":policeman:": "👮", + ":policewoman:": "👮‍♀️", + ":poo:": "💩", + ":poodle:": "🐩", + ":poop:": "💩", + ":popcorn:": "🍿", + ":portugal:": "🇵🇹", + ":post_office:": "🏣", + ":postal_horn:": "📯", + ":postbox:": "📮", + ":potable_water:": "🚰", + ":potato:": "🥔", + ":potted_plant:": "🪴", + ":pouch:": "👝", + ":poultry_leg:": "🍗", + ":pound:": "💷", + ":pound_symbol:": "#️", + ":pouting_cat:": "😾", + ":pouting_man:": "🙎‍♂️", + ":pouting_woman:": "🙎", + ":pr:": "🇵🇷", + ":pray:": "🙏", + ":pray_tone1:": "🙏🏻", + ":pray_tone2:": "🙏🏼", + ":pray_tone3:": "🙏🏽", + ":pray_tone4:": "🙏🏾", + ":pray_tone5:": "🙏🏿", + ":prayer_beads:": "📿", + ":pregnant_woman:": "🤰", + ":pregnant_woman_tone1:": "🤰🏻", + ":pregnant_woman_tone2:": "🤰🏼", + ":pregnant_woman_tone3:": "🤰🏽", + ":pregnant_woman_tone4:": "🤰🏾", + ":pregnant_woman_tone5:": "🤰🏿", + ":pretzel:": "🥨", + ":previous_track:": "⏮️", + ":previous_track_button:": "⏮", + ":prince:": "🤴", + ":prince_tone1:": "🤴🏻", + ":prince_tone2:": "🤴🏼", + ":prince_tone3:": "🤴🏽", + ":prince_tone4:": "🤴🏾", + ":prince_tone5:": "🤴🏿", + ":princess:": "👸", + ":princess_tone1:": "👸🏻", + ":princess_tone2:": "👸🏼", + ":princess_tone3:": "👸🏽", + ":princess_tone4:": "👸🏾", + ":princess_tone5:": "👸🏿", + ":printer:": "🖨️", + ":probing_cane:": "🦯", + ":projector:": "📽️", + ":ps:": "🇵🇸", + ":pt:": "🇵🇹", + ":pudding:": "🍮", + ":puerto_rico:": "🇵🇷", + ":punch:": "👊", + ":punch_tone1:": "👊🏻", + ":punch_tone2:": "👊🏼", + ":punch_tone3:": "👊🏽", + ":punch_tone4:": "👊🏾", + ":punch_tone5:": "👊🏿", + ":purple_circle:": "🟣", + ":purple_heart:": "💜", + ":purple_square:": "🟪", + ":purse:": "👛", + ":pushpin:": "📌", + ":put_litter_in_its_place:": "🚮", + ":pw:": "🇵🇼", + ":py:": "🇵🇾", + ":qa:": "🇶🇦", + ":qatar:": "🇶🇦", + ":question:": "❓", + ":rabbit2:": "🐇", + ":rabbit:": "🐰", + ":raccoon:": "🦝", + ":race_car:": "🏎️", + ":racehorse:": "🐎", + ":racing_car:": "🏎️", + ":racing_motorcycle:": "🏍️", + ":radio:": "📻", + ":radio_button:": "🔘", + ":radioactive:": "☢️", + ":radioactive_sign:": "☢️", + ":rage:": "😡", + ":railroad_track:": "🛤️", + ":railway_car:": "🚃", + ":railway_track:": "🛤️", + ":rainbow:": "🌈", + ":rainbow_flag:": "🏳️‍🌈", + ":raised_back_of_hand:": "🤚", + ":raised_back_of_hand_tone1:": "🤚🏻", + ":raised_back_of_hand_tone2:": "🤚🏼", + ":raised_back_of_hand_tone3:": "🤚🏽", + ":raised_back_of_hand_tone4:": "🤚🏾", + ":raised_back_of_hand_tone5:": "🤚🏿", + ":raised_hand:": "✋", + ":raised_hand_tone1:": "✋🏻", + ":raised_hand_tone2:": "✋🏼", + ":raised_hand_tone3:": "✋🏽", + ":raised_hand_tone4:": "✋🏾", + ":raised_hand_tone5:": "✋🏿", + ":raised_hand_with_fingers_splayed:": "🖐", + ":raised_hand_with_fingers_splayed_tone1:": "🖐🏻", + ":raised_hand_with_fingers_splayed_tone2:": "🖐🏼", + ":raised_hand_with_fingers_splayed_tone3:": "🖐🏽", + ":raised_hand_with_fingers_splayed_tone4:": "🖐🏾", + ":raised_hand_with_fingers_splayed_tone5:": "🖐🏿", + ":raised_hand_with_part_between_middle_and_ring_fingers:": "🖖", + ":raised_hand_with_part_between_middle_and_ring_fingers_tone1:": "🖖🏻", + ":raised_hand_with_part_between_middle_and_ring_fingers_tone2:": "🖖🏼", + ":raised_hand_with_part_between_middle_and_ring_fingers_tone3:": "🖖🏽", + ":raised_hand_with_part_between_middle_and_ring_fingers_tone4:": "🖖🏾", + ":raised_hand_with_part_between_middle_and_ring_fingers_tone5:": "🖖🏿", + ":raised_hands:": "🙌", + ":raised_hands_tone1:": "🙌🏻", + ":raised_hands_tone2:": "🙌🏼", + ":raised_hands_tone3:": "🙌🏽", + ":raised_hands_tone4:": "🙌🏾", + ":raised_hands_tone5:": "🙌🏿", + ":raising_hand:": "🙋", + ":raising_hand_man:": "🙋‍♂️", + ":raising_hand_tone1:": "🙋🏻", + ":raising_hand_tone2:": "🙋🏼", + ":raising_hand_tone3:": "🙋🏽", + ":raising_hand_tone4:": "🙋🏾", + ":raising_hand_tone5:": "🙋🏿", + ":raising_hand_woman:": "🙋", + ":ram:": "🐏", + ":ramen:": "🍜", + ":rat:": "🐀", + ":razor:": "🪒", + ":re:": "🇷🇪", + ":receipt:": "🧾", + ":record_button:": "⏺️", + ":recycle:": "♻️", + ":red_car:": "🚗", + ":red_circle:": "🔴", + ":red_envelope:": "🧧", + ":red_haired:": "🦰", + ":red_square:": "🟥", + ":regional_indicator_a:": "🇦", + ":regional_indicator_b:": "🇧", + ":regional_indicator_c:": "🇨", + ":regional_indicator_d:": "🇩", + ":regional_indicator_e:": "🇪", + ":regional_indicator_f:": "🇫", + ":regional_indicator_g:": "🇬", + ":regional_indicator_h:": "🇭", + ":regional_indicator_i:": "🇮", + ":regional_indicator_j:": "🇯", + ":regional_indicator_k:": "🇰", + ":regional_indicator_l:": "🇱", + ":regional_indicator_m:": "🇲", + ":regional_indicator_n:": "🇳", + ":regional_indicator_o:": "🇴", + ":regional_indicator_p:": "🇵", + ":regional_indicator_q:": "🇶", + ":regional_indicator_r:": "🇷", + ":regional_indicator_s:": "🇸", + ":regional_indicator_t:": "🇹", + ":regional_indicator_u:": "🇺", + ":regional_indicator_v:": "🇻", + ":regional_indicator_w:": "🇼", + ":regional_indicator_x:": "🇽", + ":regional_indicator_y:": "🇾", + ":regional_indicator_z:": "🇿", + ":registered:": "®️", + ":relaxed:": "☺️", + ":relieved:": "😌", + ":reminder_ribbon:": "🎗️", + ":repeat:": "🔁", + ":repeat_one:": "🔂", + ":rescue_worker_helmet:": "⛑", + ":restroom:": "🚻", + ":reunion:": "🇷🇪", + ":reversed_hand_with_middle_finger_extended:": "🖕", + ":reversed_hand_with_middle_finger_extended_tone1:": "🖕🏻", + ":reversed_hand_with_middle_finger_extended_tone2:": "🖕🏼", + ":reversed_hand_with_middle_finger_extended_tone3:": "🖕🏽", + ":reversed_hand_with_middle_finger_extended_tone4:": "🖕🏾", + ":reversed_hand_with_middle_finger_extended_tone5:": "🖕🏿", + ":revolving_hearts:": "💞", + ":rewind:": "⏪", + ":rhino:": "🦏", + ":rhinoceros:": "🦏", + ":ribbon:": "🎀", + ":rice:": "🍚", + ":rice_ball:": "🍙", + ":rice_cracker:": "🍘", + ":rice_scene:": "🎑", + ":right_anger_bubble:": "🗯️", + ":right_facing_fist:": "🤜", + ":right_facing_fist_tone1:": "🤜🏻", + ":right_facing_fist_tone2:": "🤜🏼", + ":right_facing_fist_tone3:": "🤜🏽", + ":right_facing_fist_tone4:": "🤜🏾", + ":right_facing_fist_tone5:": "🤜🏿", + ":right_fist:": "🤜", + ":right_fist_tone1:": "🤜🏻", + ":right_fist_tone2:": "🤜🏼", + ":right_fist_tone3:": "🤜🏽", + ":right_fist_tone4:": "🤜🏾", + ":right_fist_tone5:": "🤜🏿", + ":ring:": "💍", + ":ringed_planet:": "🪐", + ":ro:": "🇷🇴", + ":robot:": "🤖", + ":robot_face:": "🤖", + ":rock:": "🪨", + ":rocket:": "🚀", + ":rofl:": "🤣", + ":roll_eyes:": "🙄", + ":roll_of_paper:": "🧻", + ":rolled_up_newspaper:": "🗞️", + ":roller_coaster:": "🎢", + ":roller_skate:": "🛼", + ":rolling_eyes:": "🙄", + ":rolling_on_the_floor_laughing:": "🤣", + ":romania:": "🇷🇴", + ":rooster:": "🐓", + ":rose:": "🌹", + ":rosette:": "🏵️", + ":rotating_light:": "🚨", + ":round_pushpin:": "📍", + ":rowboat:": "🚣", + ":rowboat_tone1:": "🚣🏻", + ":rowboat_tone2:": "🚣🏼", + ":rowboat_tone3:": "🚣🏽", + ":rowboat_tone4:": "🚣🏾", + ":rowboat_tone5:": "🚣🏿", + ":rowing_man:": "🚣", + ":rowing_woman:": "🚣‍♀️", + ":rs:": "🇷🇸", + ":ru:": "🇷🇺", + ":rugby_football:": "🏉", + ":runner:": "🏃", + ":runner_tone1:": "🏃🏻", + ":runner_tone2:": "🏃🏼", + ":runner_tone3:": "🏃🏽", + ":runner_tone4:": "🏃🏾", + ":runner_tone5:": "🏃🏿", + ":running_man:": "🏃", + ":running_shirt_with_sash:": "🎽", + ":running_woman:": "🏃‍♀️", + ":russia:": "🇷🇺", + ":rw:": "🇷🇼", + ":rwanda:": "🇷🇼", + ":sa:": "🈂️", + ":safety_pin:": "🧷", + ":safety_vest:": "🦺", + ":sagittarius:": "♐", + ":sailboat:": "⛵", + ":saint_martin:": "🇲🇫", + ":sake:": "🍶", + ":salad:": "🥗", + ":salt:": "🧂", + ":samoa:": "🇼🇸", + ":san_marino:": "🇸🇲", + ":sandal:": "👡", + ":sandwich:": "🥪", + ":santa:": "🎅", + ":santa_tone1:": "🎅🏻", + ":santa_tone2:": "🎅🏼", + ":santa_tone3:": "🎅🏽", + ":santa_tone4:": "🎅🏾", + ":santa_tone5:": "🎅🏿", + ":sao_tome_principe:": "🇸🇹", + ":sari:": "🥻", + ":satellite:": "📡", + ":satellite_orbital:": "🛰️", + ":satisfied:": "😆", + ":saudi:": "🇸🇦", + ":saudi_arabia:": "🇸🇦", + ":saudiarabia:": "🇸🇦", + ":sauropod:": "🦕", + ":saxophone:": "🎷", + ":sb:": "🇸🇧", + ":sc:": "🇸🇨", + ":scales:": "⚖️", + ":scarf:": "🧣", + ":school:": "🏫", + ":school_satchel:": "🎒", + ":scientist:": "🧑‍🔬", + ":scientist_dark_skin_tone:": "🧑🏿‍🔬", + ":scientist_light_skin_tone:": "🧑🏻‍🔬", + ":scientist_medium_dark_skin_tone:": "🧑🏾‍🔬", + ":scientist_medium_light_skin_tone:": "🧑🏼‍🔬", + ":scientist_medium_skin_tone:": "🧑🏽‍🔬", + ":scientist_tone1:": "🧑🏻‍🔬", + ":scientist_tone2:": "🧑🏼‍🔬", + ":scientist_tone3:": "🧑🏽‍🔬", + ":scientist_tone4:": "🧑🏾‍🔬", + ":scientist_tone5:": "🧑🏿‍🔬", + ":scissors:": "✂️", + ":scooter:": "🛴", + ":scorpion:": "🦂", + ":scorpius:": "♏", + ":scotland:": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", + ":scream:": "😱", + ":scream_cat:": "🙀", + ":screwdriver:": "🪛", + ":scroll:": "📜", + ":sd:": "🇸🇩", + ":se:": "🇸🇪", + ":seal:": "🦭", + ":seat:": "💺", + ":second_place:": "🥈", + ":second_place_medal:": "🥈", + ":secret:": "㊙️", + ":see_no_evil:": "🙈", + ":seedling:": "🌱", + ":selfie:": "🤳", + ":selfie_tone1:": "🤳🏻", + ":selfie_tone2:": "🤳🏼", + ":selfie_tone3:": "🤳🏽", + ":selfie_tone4:": "🤳🏾", + ":selfie_tone5:": "🤳🏿", + ":senegal:": "🇸🇳", + ":serbia:": "🇷🇸", + ":service_dog:": "🐕‍🦺", + ":seven:": "7️⃣", + ":sewing_needle:": "🪡", + ":seychelles:": "🇸🇨", + ":sg:": "🇸🇬", + ":sh:": "🇸🇭", + ":shaking_hands:": "🤝", + ":shaking_hands_tone1:": "🤝🏻", + ":shaking_hands_tone2:": "🤝🏼", + ":shaking_hands_tone3:": "🤝🏽", + ":shaking_hands_tone4:": "🤝🏾", + ":shaking_hands_tone5:": "🤝🏿", + ":shallow_pan_of_food:": "🥘", + ":shamrock:": "☘️", + ":shark:": "🦈", + ":shaved_ice:": "🍧", + ":sheep:": "🐑", + ":shell:": "🐚", + ":shelled_peanut:": "🥜", + ":shield:": "🛡️", + ":shinto_shrine:": "⛩️", + ":ship:": "🚢", + ":shirt:": "👕", + ":shit:": "💩", + ":shopping:": "🛍", + ":shopping_bags:": "🛍️", + ":shopping_cart:": "🛒", + ":shopping_trolley:": "🛒", + ":shorts:": "🩳", + ":shower:": "🚿", + ":shrimp:": "🦐", + ":shrug:": "🤷", + ":shrug_tone1:": "🤷🏻", + ":shrug_tone2:": "🤷🏼", + ":shrug_tone3:": "🤷🏽", + ":shrug_tone4:": "🤷🏾", + ":shrug_tone5:": "🤷🏿", + ":shushing_face:": "🤫", + ":si:": "🇸🇮", + ":sick:": "🤢", + ":sierra_leone:": "🇸🇱", + ":sign_of_the_horns:": "🤘", + ":sign_of_the_horns_tone1:": "🤘🏻", + ":sign_of_the_horns_tone2:": "🤘🏼", + ":sign_of_the_horns_tone3:": "🤘🏽", + ":sign_of_the_horns_tone4:": "🤘🏾", + ":sign_of_the_horns_tone5:": "🤘🏿", + ":signal_strength:": "📶", + ":singapore:": "🇸🇬", + ":singer:": "🧑‍🎤", + ":singer_dark_skin_tone:": "🧑🏿‍🎤", + ":singer_light_skin_tone:": "🧑🏻‍🎤", + ":singer_medium_dark_skin_tone:": "🧑🏾‍🎤", + ":singer_medium_light_skin_tone:": "🧑🏼‍🎤", + ":singer_medium_skin_tone:": "🧑🏽‍🎤", + ":singer_tone1:": "🧑🏻‍🎤", + ":singer_tone2:": "🧑🏼‍🎤", + ":singer_tone3:": "🧑🏽‍🎤", + ":singer_tone4:": "🧑🏾‍🎤", + ":singer_tone5:": "🧑🏿‍🎤", + ":sint_maarten:": "🇸🇽", + ":six:": "6️⃣", + ":six_pointed_star:": "🔯", + ":sj:": "🇸🇯", + ":sk:": "🇸🇰", + ":skateboard:": "🛹", + ":skeleton:": "💀", + ":ski:": "🎿", + ":skier:": "⛷️", + ":skull:": "💀", + ":skull_and_crossbones:": "☠️", + ":skull_crossbones:": "☠️", + ":skunk:": "🦨", + ":sl:": "🇸🇱", + ":sled:": "🛷", + ":sleeping:": "😴", + ":sleeping_accommodation:": "🛌", + ":sleeping_bed:": "🛌", + ":sleepy:": "😪", + ":sleuth_or_spy:": "🕵", + ":sleuth_or_spy_tone1:": "🕵🏻", + ":sleuth_or_spy_tone2:": "🕵🏼", + ":sleuth_or_spy_tone3:": "🕵🏽", + ":sleuth_or_spy_tone4:": "🕵🏾", + ":sleuth_or_spy_tone5:": "🕵🏿", + ":slight_frown:": "🙁", + ":slight_smile:": "🙂", + ":slightly_frowning_face:": "🙁", + ":slightly_smiling_face:": "🙂", + ":slot_machine:": "🎰", + ":sloth:": "🦥", + ":slovakia:": "🇸🇰", + ":slovenia:": "🇸🇮", + ":sm:": "🇸🇲", + ":small_airplane:": "🛩️", + ":small_blue_diamond:": "🔹", + ":small_orange_diamond:": "🔸", + ":small_red_triangle:": "🔺", + ":small_red_triangle_down:": "🔻", + ":smile:": "😄", + ":smile_cat:": "😸", + ":smiley:": "😃", + ":smiley_cat:": "😺", + ":smiling_face_with_3_hearts:": "🥰", + ":smiling_face_with_tear:": "🥲", + ":smiling_imp:": "😈", + ":smirk:": "😏", + ":smirk_cat:": "😼", + ":smoking:": "🚬", + ":sn:": "🇸🇳", + ":snail:": "🐌", + ":snake:": "🐍", + ":sneeze:": "🤧", + ":sneezing_face:": "🤧", + ":snow_capped_mountain:": "🏔️", + ":snowboarder:": "🏂", + ":snowboarder_dark_skin_tone:": "🏂🏿", + ":snowboarder_light_skin_tone:": "🏂🏻", + ":snowboarder_medium_dark_skin_tone:": "🏂🏾", + ":snowboarder_medium_light_skin_tone:": "🏂🏼", + ":snowboarder_medium_skin_tone:": "🏂🏽", + ":snowboarder_tone1:": "🏂🏻", + ":snowboarder_tone2:": "🏂🏼", + ":snowboarder_tone3:": "🏂🏽", + ":snowboarder_tone4:": "🏂🏾", + ":snowboarder_tone5:": "🏂🏿", + ":snowflake:": "❄️", + ":snowman2:": "☃️", + ":snowman:": "⛄", + ":snowman_with_snow:": "☃️", + ":so:": "🇸🇴", + ":soap:": "🧼", + ":sob:": "😭", + ":soccer:": "⚽", + ":socks:": "🧦", + ":softball:": "🥎", + ":solomon_islands:": "🇸🇧", + ":somalia:": "🇸🇴", + ":soon:": "🔜", + ":sos:": "🆘", + ":sound:": "🔉", + ":south_africa:": "🇿🇦", + ":south_georgia_south_sandwich_islands:": "🇬🇸", + ":south_sudan:": "🇸🇸", + ":space_invader:": "👾", + ":spades:": "♠️", + ":spaghetti:": "🍝", + ":spain:": "🇪🇸", + ":sparkle:": "❇️", + ":sparkler:": "🎇", + ":sparkles:": "✨", + ":sparkling_heart:": "💖", + ":speak_no_evil:": "🙊", + ":speaker:": "🔈", + ":speaking_head:": "🗣️", + ":speaking_head_in_silhouette:": "🗣️", + ":speech_balloon:": "💬", + ":speech_left:": "🗨️", + ":speedboat:": "🚤", + ":spider:": "🕷️", + ":spider_web:": "🕸️", + ":spiral_calendar:": "🗓", + ":spiral_calendar_pad:": "🗓️", + ":spiral_note_pad:": "🗒️", + ":spiral_notepad:": "🗒", + ":sponge:": "🧽", + ":spoon:": "🥄", + ":sports_medal:": "🏅", + ":spy:": "🕵", + ":spy_tone1:": "🕵🏻", + ":spy_tone2:": "🕵🏼", + ":spy_tone3:": "🕵🏽", + ":spy_tone4:": "🕵🏾", + ":spy_tone5:": "🕵🏿", + ":squeeze_bottle:": "🧴", + ":squid:": "🦑", + ":sr:": "🇸🇷", + ":sri_lanka:": "🇱🇰", + ":ss:": "🇸🇸", + ":st:": "🇸🇹", + ":st_barthelemy:": "🇧🇱", + ":st_helena:": "🇸🇭", + ":st_kitts_nevis:": "🇰🇳", + ":st_lucia:": "🇱🇨", + ":st_pierre_miquelon:": "🇵🇲", + ":st_vincent_grenadines:": "🇻🇨", + ":stadium:": "🏟️", + ":star2:": "🌟", + ":star:": "⭐", + ":star_and_crescent:": "☪️", + ":star_of_david:": "✡️", + ":star_struck:": "🤩", + ":stars:": "🌠", + ":station:": "🚉", + ":statue_of_liberty:": "🗽", + ":steam_locomotive:": "🚂", + ":stethoscope:": "🩺", + ":stew:": "🍲", + ":stop_button:": "⏹️", + ":stop_sign:": "🛑", + ":stopwatch:": "⏱️", + ":straight_ruler:": "📏", + ":strawberry:": "🍓", + ":stuck_out_tongue:": "😛", + ":stuck_out_tongue_closed_eyes:": "😝", + ":stuck_out_tongue_winking_eye:": "😜", + ":student:": "🧑‍🎓", + ":student_dark_skin_tone:": "🧑🏿‍🎓", + ":student_light_skin_tone:": "🧑🏻‍🎓", + ":student_medium_dark_skin_tone:": "🧑🏾‍🎓", + ":student_medium_light_skin_tone:": "🧑🏼‍🎓", + ":student_medium_skin_tone:": "🧑🏽‍🎓", + ":student_tone1:": "🧑🏻‍🎓", + ":student_tone2:": "🧑🏼‍🎓", + ":student_tone3:": "🧑🏽‍🎓", + ":student_tone4:": "🧑🏾‍🎓", + ":student_tone5:": "🧑🏿‍🎓", + ":studio_microphone:": "🎙️", + ":stuffed_flatbread:": "🥙", + ":stuffed_pita:": "🥙", + ":sudan:": "🇸🇩", + ":sun_behind_large_cloud:": "🌥", + ":sun_behind_rain_cloud:": "🌦", + ":sun_behind_small_cloud:": "🌤", + ":sun_with_face:": "🌞", + ":sunflower:": "🌻", + ":sunglasses:": "😎", + ":sunny:": "☀️", + ":sunrise:": "🌅", + ":sunrise_over_mountains:": "🌄", + ":superhero:": "🦸", + ":superhero_dark_skin_tone:": "🦸🏿", + ":superhero_light_skin_tone:": "🦸🏻", + ":superhero_medium_dark_skin_tone:": "🦸🏾", + ":superhero_medium_light_skin_tone:": "🦸🏼", + ":superhero_medium_skin_tone:": "🦸🏽", + ":superhero_tone1:": "🦸🏻", + ":superhero_tone2:": "🦸🏼", + ":superhero_tone3:": "🦸🏽", + ":superhero_tone4:": "🦸🏾", + ":superhero_tone5:": "🦸🏿", + ":supervillain:": "🦹", + ":supervillain_dark_skin_tone:": "🦹🏿", + ":supervillain_light_skin_tone:": "🦹🏻", + ":supervillain_medium_dark_skin_tone:": "🦹🏾", + ":supervillain_medium_light_skin_tone:": "🦹🏼", + ":supervillain_medium_skin_tone:": "🦹🏽", + ":supervillain_tone1:": "🦹🏻", + ":supervillain_tone2:": "🦹🏼", + ":supervillain_tone3:": "🦹🏽", + ":supervillain_tone4:": "🦹🏾", + ":supervillain_tone5:": "🦹🏿", + ":surfer:": "🏄", + ":surfer_tone1:": "🏄🏻", + ":surfer_tone2:": "🏄🏼", + ":surfer_tone3:": "🏄🏽", + ":surfer_tone4:": "🏄🏾", + ":surfer_tone5:": "🏄🏿", + ":surfing_man:": "🏄", + ":surfing_woman:": "🏄‍♀️", + ":suriname:": "🇸🇷", + ":sushi:": "🍣", + ":suspension_railway:": "🚟", + ":sv:": "🇸🇻", + ":swan:": "🦢", + ":swaziland:": "🇸🇿", + ":sweat:": "😓", + ":sweat_drops:": "💦", + ":sweat_smile:": "😅", + ":sweden:": "🇸🇪", + ":sweet_potato:": "🍠", + ":swimmer:": "🏊", + ":swimmer_tone1:": "🏊🏻", + ":swimmer_tone2:": "🏊🏼", + ":swimmer_tone3:": "🏊🏽", + ":swimmer_tone4:": "🏊🏾", + ":swimmer_tone5:": "🏊🏿", + ":swimming_man:": "🏊", + ":swimming_woman:": "🏊‍♀️", + ":switzerland:": "🇨🇭", + ":sx:": "🇸🇽", + ":sy:": "🇸🇾", + ":symbols:": "🔣", + ":synagogue:": "🕍", + ":syria:": "🇸🇾", + ":syringe:": "💉", + ":sz:": "🇸🇿", + ":t_rex:": "🦖", + ":ta:": "🇹🇦", + ":table_tennis:": "🏓", + ":taco:": "🌮", + ":tada:": "🎉", + ":taiwan:": "🇹🇼", + ":tajikistan:": "🇹🇯", + ":takeout_box:": "🥡", + ":tamale:": "🫔", + ":tanabata_tree:": "🎋", + ":tangerine:": "🍊", + ":tanzania:": "🇹🇿", + ":taurus:": "♉", + ":taxi:": "🚕", + ":tc:": "🇹🇨", + ":td:": "🇹🇩", + ":tea:": "🍵", + ":teacher:": "🧑‍🏫", + ":teacher_dark_skin_tone:": "🧑🏿‍🏫", + ":teacher_light_skin_tone:": "🧑🏻‍🏫", + ":teacher_medium_dark_skin_tone:": "🧑🏾‍🏫", + ":teacher_medium_light_skin_tone:": "🧑🏼‍🏫", + ":teacher_medium_skin_tone:": "🧑🏽‍🏫", + ":teacher_tone1:": "🧑🏻‍🏫", + ":teacher_tone2:": "🧑🏼‍🏫", + ":teacher_tone3:": "🧑🏽‍🏫", + ":teacher_tone4:": "🧑🏾‍🏫", + ":teacher_tone5:": "🧑🏿‍🏫", + ":teapot:": "🫖", + ":technologist:": "🧑‍💻", + ":technologist_dark_skin_tone:": "🧑🏿‍💻", + ":technologist_light_skin_tone:": "🧑🏻‍💻", + ":technologist_medium_dark_skin_tone:": "🧑🏾‍💻", + ":technologist_medium_light_skin_tone:": "🧑🏼‍💻", + ":technologist_medium_skin_tone:": "🧑🏽‍💻", + ":technologist_tone1:": "🧑🏻‍💻", + ":technologist_tone2:": "🧑🏼‍💻", + ":technologist_tone3:": "🧑🏽‍💻", + ":technologist_tone4:": "🧑🏾‍💻", + ":technologist_tone5:": "🧑🏿‍💻", + ":teddy_bear:": "🧸", + ":telephone:": "☎️", + ":telephone_receiver:": "📞", + ":telescope:": "🔭", + ":ten:": "🔟", + ":tennis:": "🎾", + ":tent:": "⛺", + ":test_tube:": "🧪", + ":tf:": "🇹🇫", + ":tg:": "🇹🇬", + ":th:": "🇹🇭", + ":thailand:": "🇹🇭", + ":thermometer:": "🌡️", + ":thermometer_face:": "🤒", + ":thinking:": "🤔", + ":thinking_face:": "🤔", + ":third_place:": "🥉", + ":third_place_medal:": "🥉", + ":thong_sandal:": "🩴", + ":thought_balloon:": "💭", + ":thread:": "🧵", + ":three:": "3️⃣", + ":three_button_mouse:": "🖱️", + ":thumbdown:": "👎", + ":thumbdown_tone1:": "👎🏻", + ":thumbdown_tone2:": "👎🏼", + ":thumbdown_tone3:": "👎🏽", + ":thumbdown_tone4:": "👎🏾", + ":thumbdown_tone5:": "👎🏿", + ":thumbsdown:": "👎", + ":thumbsdown_tone1:": "👎🏻", + ":thumbsdown_tone2:": "👎🏼", + ":thumbsdown_tone3:": "👎🏽", + ":thumbsdown_tone4:": "👎🏾", + ":thumbsdown_tone5:": "👎🏿", + ":thumbsup:": "👍", + ":thumbsup_tone1:": "👍🏻", + ":thumbsup_tone2:": "👍🏼", + ":thumbsup_tone3:": "👍🏽", + ":thumbsup_tone4:": "👍🏾", + ":thumbsup_tone5:": "👍🏿", + ":thumbup:": "👍", + ":thumbup_tone1:": "👍🏻", + ":thumbup_tone2:": "👍🏼", + ":thumbup_tone3:": "👍🏽", + ":thumbup_tone4:": "👍🏾", + ":thumbup_tone5:": "👍🏿", + ":thunder_cloud_and_rain:": "⛈️", + ":thunder_cloud_rain:": "⛈️", + ":ticket:": "🎫", + ":tickets:": "🎟️", + ":tiger2:": "🐅", + ":tiger:": "🐯", + ":timer:": "⏲️", + ":timer_clock:": "⏲️", + ":timor_leste:": "🇹🇱", + ":tipping_hand_man:": "💁‍♂️", + ":tipping_hand_woman:": "💁", + ":tired_face:": "😫", + ":tj:": "🇹🇯", + ":tk:": "🇹🇰", + ":tl:": "🇹🇱", + ":tm:": "™️", + ":tn:": "🇹🇳", + ":to:": "🇹🇴", + ":togo:": "🇹🇬", + ":toilet:": "🚽", + ":tokelau:": "🇹🇰", + ":tokyo_tower:": "🗼", + ":tomato:": "🍅", + ":tone1:": "🏻", + ":tone2:": "🏼", + ":tone3:": "🏽", + ":tone4:": "🏾", + ":tone5:": "🏿", + ":tonga:": "🇹🇴", + ":tongue:": "👅", + ":toolbox:": "🧰", + ":tools:": "🛠️", + ":tooth:": "🦷", + ":toothbrush:": "🪥", + ":top:": "🔝", + ":tophat:": "🎩", + ":tornado:": "🌪", + ":tr:": "🇹🇷", + ":track_next:": "⏭️", + ":track_previous:": "⏮️", + ":trackball:": "🖲️", + ":tractor:": "🚜", + ":traffic_light:": "🚥", + ":train2:": "🚆", + ":train:": "🚋", + ":tram:": "🚊", + ":transgender_flag:": "🏳️‍⚧️", + ":transgender_symbol:": "⚧", + ":triangular_flag_on_post:": "🚩", + ":triangular_ruler:": "📐", + ":trident:": "🔱", + ":trinidad_tobago:": "🇹🇹", + ":tristan_da_cunha:": "🇹🇦", + ":triumph:": "😤", + ":trolleybus:": "🚎", + ":trophy:": "🏆", + ":tropical_drink:": "🍹", + ":tropical_fish:": "🐠", + ":truck:": "🚚", + ":trumpet:": "🎺", + ":tt:": "🇹🇹", + ":tulip:": "🌷", + ":tumbler_glass:": "🥃", + ":tunisia:": "🇹🇳", + ":turkey:": "🦃", + ":turkmenistan:": "🇹🇲", + ":turks_caicos_islands:": "🇹🇨", + ":turtle:": "🐢", + ":tuvalu:": "🇹🇻", + ":tuxedo_tone1:": "🤵🏻", + ":tuxedo_tone2:": "🤵🏼", + ":tuxedo_tone3:": "🤵🏽", + ":tuxedo_tone4:": "🤵🏾", + ":tuxedo_tone5:": "🤵🏿", + ":tv:": "📺", + ":tw:": "🇹🇼", + ":twisted_rightwards_arrows:": "🔀", + ":two:": "2️⃣", + ":two_hearts:": "💕", + ":two_men_holding_hands:": "👬", + ":two_women_holding_hands:": "👭", + ":tz:": "🇹🇿", + ":u5272:": "🈹", + ":u5408:": "🈴", + ":u55b6:": "🈺", + ":u6307:": "🈯", + ":u6708:": "🈷️", + ":u6709:": "🈶", + ":u6e80:": "🈵", + ":u7121:": "🈚", + ":u7533:": "🈸", + ":u7981:": "🈲", + ":u7a7a:": "🈳", + ":ua:": "🇺🇦", + ":ug:": "🇺🇬", + ":uganda:": "🇺🇬", + ":ukraine:": "🇺🇦", + ":um:": "🇺🇲", + ":umbrella2:": "☂️", + ":umbrella:": "☔", + ":umbrella_on_ground:": "⛱️", + ":unamused:": "😒", + ":underage:": "🔞", + ":unicorn:": "🦄", + ":unicorn_face:": "🦄", + ":united_arab_emirates:": "🇦🇪", + ":united_nations:": "🇺🇳", + ":united_states:": "🇺🇸", + ":unlock:": "🔓", + ":up:": "🆙", + ":upside_down:": "🙃", + ":upside_down_face:": "🙃", + ":urn:": "⚱️", + ":uruguay:": "🇺🇾", + ":us:": "🇺🇸", + ":us_virgin_islands:": "🇻🇮", + ":uy:": "🇺🇾", + ":uz:": "🇺🇿", + ":uzbekistan:": "🇺🇿", + ":v:": "✌️", + ":v_tone1:": "✌🏻", + ":v_tone2:": "✌🏼", + ":v_tone3:": "✌🏽", + ":v_tone4:": "✌🏾", + ":v_tone5:": "✌🏿", + ":va:": "🇻🇦", + ":vampire:": "🧛", + ":vampire_dark_skin_tone:": "🧛🏿", + ":vampire_light_skin_tone:": "🧛🏻", + ":vampire_medium_dark_skin_tone:": "🧛🏾", + ":vampire_medium_light_skin_tone:": "🧛🏼", + ":vampire_medium_skin_tone:": "🧛🏽", + ":vampire_tone1:": "🧛🏻", + ":vampire_tone2:": "🧛🏼", + ":vampire_tone3:": "🧛🏽", + ":vampire_tone4:": "🧛🏾", + ":vampire_tone5:": "🧛🏿", + ":vanuatu:": "🇻🇺", + ":vatican_city:": "🇻🇦", + ":vc:": "🇻🇨", + ":ve:": "🇻🇪", + ":venezuela:": "🇻🇪", + ":vertical_traffic_light:": "🚦", + ":vg:": "🇻🇬", + ":vhs:": "📼", + ":vi:": "🇻🇮", + ":vibration_mode:": "📳", + ":video_camera:": "📹", + ":video_game:": "🎮", + ":vietnam:": "🇻🇳", + ":violin:": "🎻", + ":virgo:": "♍", + ":vn:": "🇻🇳", + ":volcano:": "🌋", + ":volleyball:": "🏐", + ":vs:": "🆚", + ":vu:": "🇻🇺", + ":vulcan:": "🖖", + ":vulcan_salute:": "🖖", + ":vulcan_tone1:": "🖖🏻", + ":vulcan_tone2:": "🖖🏼", + ":vulcan_tone3:": "🖖🏽", + ":vulcan_tone4:": "🖖🏾", + ":vulcan_tone5:": "🖖🏿", + ":waffle:": "🧇", + ":wales:": "🏴󠁧󠁢󠁷󠁬󠁳󠁿", + ":walking:": "🚶", + ":walking_man:": "🚶", + ":walking_tone1:": "🚶🏻", + ":walking_tone2:": "🚶🏼", + ":walking_tone3:": "🚶🏽", + ":walking_tone4:": "🚶🏾", + ":walking_tone5:": "🚶🏿", + ":walking_woman:": "🚶‍♀️", + ":wallis_futuna:": "🇼🇫", + ":waning_crescent_moon:": "🌘", + ":waning_gibbous_moon:": "🌖", + ":warning:": "⚠️", + ":wastebasket:": "🗑️", + ":watch:": "⌚", + ":water_buffalo:": "🐃", + ":water_polo:": "🤽", + ":water_polo_tone1:": "🤽🏻", + ":water_polo_tone2:": "🤽🏼", + ":water_polo_tone3:": "🤽🏽", + ":water_polo_tone4:": "🤽🏾", + ":water_polo_tone5:": "🤽🏿", + ":watermelon:": "🍉", + ":wave:": "👋", + ":wave_tone1:": "👋🏻", + ":wave_tone2:": "👋🏼", + ":wave_tone3:": "👋🏽", + ":wave_tone4:": "👋🏾", + ":wave_tone5:": "👋🏿", + ":waving_black_flag:": "🏴", + ":waving_white_flag:": "🏳️", + ":wavy_dash:": "〰️", + ":waxing_crescent_moon:": "🌒", + ":waxing_gibbous_moon:": "🌔", + ":wc:": "🚾", + ":weary:": "😩", + ":wedding:": "💒", + ":weight_lifter:": "🏋", + ":weight_lifter_tone1:": "🏋🏻", + ":weight_lifter_tone2:": "🏋🏼", + ":weight_lifter_tone3:": "🏋🏽", + ":weight_lifter_tone4:": "🏋🏾", + ":weight_lifter_tone5:": "🏋🏿", + ":weight_lifting_man:": "🏋️", + ":weight_lifting_woman:": "🏋️‍♀️", + ":western_sahara:": "🇪🇭", + ":wf:": "🇼🇫", + ":whale2:": "🐋", + ":whale:": "🐳", + ":wheel_of_dharma:": "☸️", + ":wheelchair:": "♿", + ":whisky:": "🥃", + ":white_check_mark:": "✅", + ":white_circle:": "⚪", + ":white_flag:": "🏳️", + ":white_flower:": "💮", + ":white_frowning_face:": "☹️", + ":white_haired:": "🦳", + ":white_heart:": "🤍", + ":white_large_square:": "⬜", + ":white_medium_small_square:": "◽", + ":white_medium_square:": "◻️", + ":white_small_square:": "▫️", + ":white_square_button:": "🔳", + ":white_sun_behind_cloud:": "🌥️", + ":white_sun_behind_cloud_with_rain:": "🌦️", + ":white_sun_cloud:": "🌥️", + ":white_sun_rain_cloud:": "🌦️", + ":white_sun_small_cloud:": "🌤️", + ":white_sun_with_small_cloud:": "🌤️", + ":wilted_flower:": "🥀", + ":wilted_rose:": "🥀", + ":wind_blowing_face:": "🌬️", + ":wind_chime:": "🎐", + ":wind_face:": "🌬", + ":window:": "🪟", + ":wine_glass:": "🍷", + ":wink:": "😉", + ":wolf:": "🐺", + ":woman:": "👩", + ":woman_and_man_holding_hands_dark_skin_tone:": "👫🏿", + ":woman_and_man_holding_hands_dark_skin_tone_light_skin_tone:": "👩🏿‍🤝‍👨🏻", + ":woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone:": "👩🏿‍🤝‍👨🏾", + ":woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone:": "👩🏿‍🤝‍👨🏼", + ":woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone:": "👩🏿‍🤝‍👨🏽", + ":woman_and_man_holding_hands_light_skin_tone:": "👫🏻", + ":woman_and_man_holding_hands_light_skin_tone_dark_skin_tone:": "👩🏻‍🤝‍👨🏿", + ":woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone:": "👩🏻‍🤝‍👨🏾", + ":woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone:": "👩🏻‍🤝‍👨🏼", + ":woman_and_man_holding_hands_light_skin_tone_medium_skin_tone:": "👩🏻‍🤝‍👨🏽", + ":woman_and_man_holding_hands_medium_dark_skin_tone:": "👫🏾", + ":woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone:": "👩🏾‍🤝‍👨🏿", + ":woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone:": "👩🏾‍🤝‍👨🏻", + ":woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone:": "👩🏾‍🤝‍👨🏼", + ":woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone:": "👩🏾‍🤝‍👨🏽", + ":woman_and_man_holding_hands_medium_light_skin_tone:": "👫🏼", + ":woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone:": "👩🏼‍🤝‍👨🏿", + ":woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone:": "👩🏼‍🤝‍👨🏻", + ":woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone:": "👩🏼‍🤝‍👨🏾", + ":woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone:": "👩🏼‍🤝‍👨🏽", + ":woman_and_man_holding_hands_medium_skin_tone:": "👫🏽", + ":woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone:": "👩🏽‍🤝‍👨🏿", + ":woman_and_man_holding_hands_medium_skin_tone_light_skin_tone:": "👩🏽‍🤝‍👨🏻", + ":woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone:": "👩🏽‍🤝‍👨🏾", + ":woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone:": "👩🏽‍🤝‍👨🏼", + ":woman_and_man_holding_hands_tone1:": "👫🏻", + ":woman_and_man_holding_hands_tone1_tone2:": "👩🏻‍🤝‍👨🏼", + ":woman_and_man_holding_hands_tone1_tone3:": "👩🏻‍🤝‍👨🏽", + ":woman_and_man_holding_hands_tone1_tone4:": "👩🏻‍🤝‍👨🏾", + ":woman_and_man_holding_hands_tone1_tone5:": "👩🏻‍🤝‍👨🏿", + ":woman_and_man_holding_hands_tone2:": "👫🏼", + ":woman_and_man_holding_hands_tone2_tone1:": "👩🏼‍🤝‍👨🏻", + ":woman_and_man_holding_hands_tone2_tone3:": "👩🏼‍🤝‍👨🏽", + ":woman_and_man_holding_hands_tone2_tone4:": "👩🏼‍🤝‍👨🏾", + ":woman_and_man_holding_hands_tone2_tone5:": "👩🏼‍🤝‍👨🏿", + ":woman_and_man_holding_hands_tone3:": "👫🏽", + ":woman_and_man_holding_hands_tone3_tone1:": "👩🏽‍🤝‍👨🏻", + ":woman_and_man_holding_hands_tone3_tone2:": "👩🏽‍🤝‍👨🏼", + ":woman_and_man_holding_hands_tone3_tone4:": "👩🏽‍🤝‍👨🏾", + ":woman_and_man_holding_hands_tone3_tone5:": "👩🏽‍🤝‍👨🏿", + ":woman_and_man_holding_hands_tone4:": "👫🏾", + ":woman_and_man_holding_hands_tone4_tone1:": "👩🏾‍🤝‍👨🏻", + ":woman_and_man_holding_hands_tone4_tone2:": "👩🏾‍🤝‍👨🏼", + ":woman_and_man_holding_hands_tone4_tone3:": "👩🏾‍🤝‍👨🏽", + ":woman_and_man_holding_hands_tone4_tone5:": "👩🏾‍🤝‍👨🏿", + ":woman_and_man_holding_hands_tone5:": "👫🏿", + ":woman_and_man_holding_hands_tone5_tone1:": "👩🏿‍🤝‍👨🏻", + ":woman_and_man_holding_hands_tone5_tone2:": "👩🏿‍🤝‍👨🏼", + ":woman_and_man_holding_hands_tone5_tone3:": "👩🏿‍🤝‍👨🏽", + ":woman_and_man_holding_hands_tone5_tone4:": "👩🏿‍🤝‍👨🏾", + ":woman_artist:": "👩‍🎨", + ":woman_artist_dark_skin_tone:": "👩🏿‍🎨", + ":woman_artist_light_skin_tone:": "👩🏻‍🎨", + ":woman_artist_medium_dark_skin_tone:": "👩🏾‍🎨", + ":woman_artist_medium_light_skin_tone:": "👩🏼‍🎨", + ":woman_artist_medium_skin_tone:": "👩🏽‍🎨", + ":woman_artist_tone1:": "👩🏻‍🎨", + ":woman_artist_tone2:": "👩🏼‍🎨", + ":woman_artist_tone3:": "👩🏽‍🎨", + ":woman_artist_tone4:": "👩🏾‍🎨", + ":woman_artist_tone5:": "👩🏿‍🎨", + ":woman_astronaut:": "👩‍🚀", + ":woman_astronaut_dark_skin_tone:": "👩🏿‍🚀", + ":woman_astronaut_light_skin_tone:": "👩🏻‍🚀", + ":woman_astronaut_medium_dark_skin_tone:": "👩🏾‍🚀", + ":woman_astronaut_medium_light_skin_tone:": "👩🏼‍🚀", + ":woman_astronaut_medium_skin_tone:": "👩🏽‍🚀", + ":woman_astronaut_tone1:": "👩🏻‍🚀", + ":woman_astronaut_tone2:": "👩🏼‍🚀", + ":woman_astronaut_tone3:": "👩🏽‍🚀", + ":woman_astronaut_tone4:": "👩🏾‍🚀", + ":woman_astronaut_tone5:": "👩🏿‍🚀", + ":woman_bald:": "👩‍🦲", + ":woman_bald_dark_skin_tone:": "👩🏿‍🦲", + ":woman_bald_light_skin_tone:": "👩🏻‍🦲", + ":woman_bald_medium_dark_skin_tone:": "👩🏾‍🦲", + ":woman_bald_medium_light_skin_tone:": "👩🏼‍🦲", + ":woman_bald_medium_skin_tone:": "👩🏽‍🦲", + ":woman_bald_tone1:": "👩🏻‍🦲", + ":woman_bald_tone2:": "👩🏼‍🦲", + ":woman_bald_tone3:": "👩🏽‍🦲", + ":woman_bald_tone4:": "👩🏾‍🦲", + ":woman_bald_tone5:": "👩🏿‍🦲", + ":woman_beard:": "🧔‍♀️", + ":woman_biking:": "🚴‍♀️", + ":woman_biking_dark_skin_tone:": "🚴🏿‍♀️", + ":woman_biking_light_skin_tone:": "🚴🏻‍♀️", + ":woman_biking_medium_dark_skin_tone:": "🚴🏾‍♀️", + ":woman_biking_medium_light_skin_tone:": "🚴🏼‍♀️", + ":woman_biking_medium_skin_tone:": "🚴🏽‍♀️", + ":woman_biking_tone1:": "🚴🏻‍♀️", + ":woman_biking_tone2:": "🚴🏼‍♀️", + ":woman_biking_tone3:": "🚴🏽‍♀️", + ":woman_biking_tone4:": "🚴🏾‍♀️", + ":woman_biking_tone5:": "🚴🏿‍♀️", + ":woman_bouncing_ball:": "⛹️‍♀️", + ":woman_bouncing_ball_dark_skin_tone:": "⛹🏿‍♀️", + ":woman_bouncing_ball_light_skin_tone:": "⛹🏻‍♀️", + ":woman_bouncing_ball_medium_dark_skin_tone:": "⛹🏾‍♀️", + ":woman_bouncing_ball_medium_light_skin_tone:": "⛹🏼‍♀️", + ":woman_bouncing_ball_medium_skin_tone:": "⛹🏽‍♀️", + ":woman_bouncing_ball_tone1:": "⛹🏻‍♀️", + ":woman_bouncing_ball_tone2:": "⛹🏼‍♀️", + ":woman_bouncing_ball_tone3:": "⛹🏽‍♀️", + ":woman_bouncing_ball_tone4:": "⛹🏾‍♀️", + ":woman_bouncing_ball_tone5:": "⛹🏿‍♀️", + ":woman_bowing:": "🙇‍♀️", + ":woman_bowing_dark_skin_tone:": "🙇🏿‍♀️", + ":woman_bowing_light_skin_tone:": "🙇🏻‍♀️", + ":woman_bowing_medium_dark_skin_tone:": "🙇🏾‍♀️", + ":woman_bowing_medium_light_skin_tone:": "🙇🏼‍♀️", + ":woman_bowing_medium_skin_tone:": "🙇🏽‍♀️", + ":woman_bowing_tone1:": "🙇🏻‍♀️", + ":woman_bowing_tone2:": "🙇🏼‍♀️", + ":woman_bowing_tone3:": "🙇🏽‍♀️", + ":woman_bowing_tone4:": "🙇🏾‍♀️", + ":woman_bowing_tone5:": "🙇🏿‍♀️", + ":woman_cartwheeling:": "🤸‍♀️", + ":woman_cartwheeling_dark_skin_tone:": "🤸🏿‍♀️", + ":woman_cartwheeling_light_skin_tone:": "🤸🏻‍♀️", + ":woman_cartwheeling_medium_dark_skin_tone:": "🤸🏾‍♀️", + ":woman_cartwheeling_medium_light_skin_tone:": "🤸🏼‍♀️", + ":woman_cartwheeling_medium_skin_tone:": "🤸🏽‍♀️", + ":woman_cartwheeling_tone1:": "🤸🏻‍♀️", + ":woman_cartwheeling_tone2:": "🤸🏼‍♀️", + ":woman_cartwheeling_tone3:": "🤸🏽‍♀️", + ":woman_cartwheeling_tone4:": "🤸🏾‍♀️", + ":woman_cartwheeling_tone5:": "🤸🏿‍♀️", + ":woman_climbing:": "🧗‍♀️", + ":woman_climbing_dark_skin_tone:": "🧗🏿‍♀️", + ":woman_climbing_light_skin_tone:": "🧗🏻‍♀️", + ":woman_climbing_medium_dark_skin_tone:": "🧗🏾‍♀️", + ":woman_climbing_medium_light_skin_tone:": "🧗🏼‍♀️", + ":woman_climbing_medium_skin_tone:": "🧗🏽‍♀️", + ":woman_climbing_tone1:": "🧗🏻‍♀️", + ":woman_climbing_tone2:": "🧗🏼‍♀️", + ":woman_climbing_tone3:": "🧗🏽‍♀️", + ":woman_climbing_tone4:": "🧗🏾‍♀️", + ":woman_climbing_tone5:": "🧗🏿‍♀️", + ":woman_construction_worker:": "👷‍♀️", + ":woman_construction_worker_dark_skin_tone:": "👷🏿‍♀️", + ":woman_construction_worker_light_skin_tone:": "👷🏻‍♀️", + ":woman_construction_worker_medium_dark_skin_tone:": "👷🏾‍♀️", + ":woman_construction_worker_medium_light_skin_tone:": "👷🏼‍♀️", + ":woman_construction_worker_medium_skin_tone:": "👷🏽‍♀️", + ":woman_construction_worker_tone1:": "👷🏻‍♀️", + ":woman_construction_worker_tone2:": "👷🏼‍♀️", + ":woman_construction_worker_tone3:": "👷🏽‍♀️", + ":woman_construction_worker_tone4:": "👷🏾‍♀️", + ":woman_construction_worker_tone5:": "👷🏿‍♀️", + ":woman_cook:": "👩‍🍳", + ":woman_cook_dark_skin_tone:": "👩🏿‍🍳", + ":woman_cook_light_skin_tone:": "👩🏻‍🍳", + ":woman_cook_medium_dark_skin_tone:": "👩🏾‍🍳", + ":woman_cook_medium_light_skin_tone:": "👩🏼‍🍳", + ":woman_cook_medium_skin_tone:": "👩🏽‍🍳", + ":woman_cook_tone1:": "👩🏻‍🍳", + ":woman_cook_tone2:": "👩🏼‍🍳", + ":woman_cook_tone3:": "👩🏽‍🍳", + ":woman_cook_tone4:": "👩🏾‍🍳", + ":woman_cook_tone5:": "👩🏿‍🍳", + ":woman_curly_haired:": "👩‍🦱", + ":woman_curly_haired_dark_skin_tone:": "👩🏿‍🦱", + ":woman_curly_haired_light_skin_tone:": "👩🏻‍🦱", + ":woman_curly_haired_medium_dark_skin_tone:": "👩🏾‍🦱", + ":woman_curly_haired_medium_light_skin_tone:": "👩🏼‍🦱", + ":woman_curly_haired_medium_skin_tone:": "👩🏽‍🦱", + ":woman_curly_haired_tone1:": "👩🏻‍🦱", + ":woman_curly_haired_tone2:": "👩🏼‍🦱", + ":woman_curly_haired_tone3:": "👩🏽‍🦱", + ":woman_curly_haired_tone4:": "👩🏾‍🦱", + ":woman_curly_haired_tone5:": "👩🏿‍🦱", + ":woman_dark_skin_tone_beard:": "🧔🏿‍♀️", + ":woman_detective:": "🕵️‍♀️", + ":woman_detective_dark_skin_tone:": "🕵🏿‍♀️", + ":woman_detective_light_skin_tone:": "🕵🏻‍♀️", + ":woman_detective_medium_dark_skin_tone:": "🕵🏾‍♀️", + ":woman_detective_medium_light_skin_tone:": "🕵🏼‍♀️", + ":woman_detective_medium_skin_tone:": "🕵🏽‍♀️", + ":woman_detective_tone1:": "🕵🏻‍♀️", + ":woman_detective_tone2:": "🕵🏼‍♀️", + ":woman_detective_tone3:": "🕵🏽‍♀️", + ":woman_detective_tone4:": "🕵🏾‍♀️", + ":woman_detective_tone5:": "🕵🏿‍♀️", + ":woman_elf:": "🧝‍♀️", + ":woman_elf_dark_skin_tone:": "🧝🏿‍♀️", + ":woman_elf_light_skin_tone:": "🧝🏻‍♀️", + ":woman_elf_medium_dark_skin_tone:": "🧝🏾‍♀️", + ":woman_elf_medium_light_skin_tone:": "🧝🏼‍♀️", + ":woman_elf_medium_skin_tone:": "🧝🏽‍♀️", + ":woman_elf_tone1:": "🧝🏻‍♀️", + ":woman_elf_tone2:": "🧝🏼‍♀️", + ":woman_elf_tone3:": "🧝🏽‍♀️", + ":woman_elf_tone4:": "🧝🏾‍♀️", + ":woman_elf_tone5:": "🧝🏿‍♀️", + ":woman_facepalming:": "🤦‍♀️", + ":woman_facepalming_dark_skin_tone:": "🤦🏿‍♀️", + ":woman_facepalming_light_skin_tone:": "🤦🏻‍♀️", + ":woman_facepalming_medium_dark_skin_tone:": "🤦🏾‍♀️", + ":woman_facepalming_medium_light_skin_tone:": "🤦🏼‍♀️", + ":woman_facepalming_medium_skin_tone:": "🤦🏽‍♀️", + ":woman_facepalming_tone1:": "🤦🏻‍♀️", + ":woman_facepalming_tone2:": "🤦🏼‍♀️", + ":woman_facepalming_tone3:": "🤦🏽‍♀️", + ":woman_facepalming_tone4:": "🤦🏾‍♀️", + ":woman_facepalming_tone5:": "🤦🏿‍♀️", + ":woman_factory_worker:": "👩‍🏭", + ":woman_factory_worker_dark_skin_tone:": "👩🏿‍🏭", + ":woman_factory_worker_light_skin_tone:": "👩🏻‍🏭", + ":woman_factory_worker_medium_dark_skin_tone:": "👩🏾‍🏭", + ":woman_factory_worker_medium_light_skin_tone:": "👩🏼‍🏭", + ":woman_factory_worker_medium_skin_tone:": "👩🏽‍🏭", + ":woman_factory_worker_tone1:": "👩🏻‍🏭", + ":woman_factory_worker_tone2:": "👩🏼‍🏭", + ":woman_factory_worker_tone3:": "👩🏽‍🏭", + ":woman_factory_worker_tone4:": "👩🏾‍🏭", + ":woman_factory_worker_tone5:": "👩🏿‍🏭", + ":woman_fairy:": "🧚‍♀️", + ":woman_fairy_dark_skin_tone:": "🧚🏿‍♀️", + ":woman_fairy_light_skin_tone:": "🧚🏻‍♀️", + ":woman_fairy_medium_dark_skin_tone:": "🧚🏾‍♀️", + ":woman_fairy_medium_light_skin_tone:": "🧚🏼‍♀️", + ":woman_fairy_medium_skin_tone:": "🧚🏽‍♀️", + ":woman_fairy_tone1:": "🧚🏻‍♀️", + ":woman_fairy_tone2:": "🧚🏼‍♀️", + ":woman_fairy_tone3:": "🧚🏽‍♀️", + ":woman_fairy_tone4:": "🧚🏾‍♀️", + ":woman_fairy_tone5:": "🧚🏿‍♀️", + ":woman_farmer:": "👩‍🌾", + ":woman_farmer_dark_skin_tone:": "👩🏿‍🌾", + ":woman_farmer_light_skin_tone:": "👩🏻‍🌾", + ":woman_farmer_medium_dark_skin_tone:": "👩🏾‍🌾", + ":woman_farmer_medium_light_skin_tone:": "👩🏼‍🌾", + ":woman_farmer_medium_skin_tone:": "👩🏽‍🌾", + ":woman_farmer_tone1:": "👩🏻‍🌾", + ":woman_farmer_tone2:": "👩🏼‍🌾", + ":woman_farmer_tone3:": "👩🏽‍🌾", + ":woman_farmer_tone4:": "👩🏾‍🌾", + ":woman_farmer_tone5:": "👩🏿‍🌾", + ":woman_feeding_baby:": "👩‍🍼", + ":woman_feeding_baby_dark_skin_tone:": "👩🏿‍🍼", + ":woman_feeding_baby_light_skin_tone:": "👩🏻‍🍼", + ":woman_feeding_baby_medium_dark_skin_tone:": "👩🏾‍🍼", + ":woman_feeding_baby_medium_light_skin_tone:": "👩🏼‍🍼", + ":woman_feeding_baby_medium_skin_tone:": "👩🏽‍🍼", + ":woman_feeding_baby_tone1:": "👩🏻‍🍼", + ":woman_feeding_baby_tone2:": "👩🏼‍🍼", + ":woman_feeding_baby_tone3:": "👩🏽‍🍼", + ":woman_feeding_baby_tone4:": "👩🏾‍🍼", + ":woman_feeding_baby_tone5:": "👩🏿‍🍼", + ":woman_firefighter:": "👩‍🚒", + ":woman_firefighter_dark_skin_tone:": "👩🏿‍🚒", + ":woman_firefighter_light_skin_tone:": "👩🏻‍🚒", + ":woman_firefighter_medium_dark_skin_tone:": "👩🏾‍🚒", + ":woman_firefighter_medium_light_skin_tone:": "👩🏼‍🚒", + ":woman_firefighter_medium_skin_tone:": "👩🏽‍🚒", + ":woman_firefighter_tone1:": "👩🏻‍🚒", + ":woman_firefighter_tone2:": "👩🏼‍🚒", + ":woman_firefighter_tone3:": "👩🏽‍🚒", + ":woman_firefighter_tone4:": "👩🏾‍🚒", + ":woman_firefighter_tone5:": "👩🏿‍🚒", + ":woman_frowning:": "🙍‍♀️", + ":woman_frowning_dark_skin_tone:": "🙍🏿‍♀️", + ":woman_frowning_light_skin_tone:": "🙍🏻‍♀️", + ":woman_frowning_medium_dark_skin_tone:": "🙍🏾‍♀️", + ":woman_frowning_medium_light_skin_tone:": "🙍🏼‍♀️", + ":woman_frowning_medium_skin_tone:": "🙍🏽‍♀️", + ":woman_frowning_tone1:": "🙍🏻‍♀️", + ":woman_frowning_tone2:": "🙍🏼‍♀️", + ":woman_frowning_tone3:": "🙍🏽‍♀️", + ":woman_frowning_tone4:": "🙍🏾‍♀️", + ":woman_frowning_tone5:": "🙍🏿‍♀️", + ":woman_genie:": "🧞‍♀️", + ":woman_gesturing_no:": "🙅‍♀️", + ":woman_gesturing_no_dark_skin_tone:": "🙅🏿‍♀️", + ":woman_gesturing_no_light_skin_tone:": "🙅🏻‍♀️", + ":woman_gesturing_no_medium_dark_skin_tone:": "🙅🏾‍♀️", + ":woman_gesturing_no_medium_light_skin_tone:": "🙅🏼‍♀️", + ":woman_gesturing_no_medium_skin_tone:": "🙅🏽‍♀️", + ":woman_gesturing_no_tone1:": "🙅🏻‍♀️", + ":woman_gesturing_no_tone2:": "🙅🏼‍♀️", + ":woman_gesturing_no_tone3:": "🙅🏽‍♀️", + ":woman_gesturing_no_tone4:": "🙅🏾‍♀️", + ":woman_gesturing_no_tone5:": "🙅🏿‍♀️", + ":woman_gesturing_ok:": "🙆‍♀️", + ":woman_gesturing_ok_dark_skin_tone:": "🙆🏿‍♀️", + ":woman_gesturing_ok_light_skin_tone:": "🙆🏻‍♀️", + ":woman_gesturing_ok_medium_dark_skin_tone:": "🙆🏾‍♀️", + ":woman_gesturing_ok_medium_light_skin_tone:": "🙆🏼‍♀️", + ":woman_gesturing_ok_medium_skin_tone:": "🙆🏽‍♀️", + ":woman_gesturing_ok_tone1:": "🙆🏻‍♀️", + ":woman_gesturing_ok_tone2:": "🙆🏼‍♀️", + ":woman_gesturing_ok_tone3:": "🙆🏽‍♀️", + ":woman_gesturing_ok_tone4:": "🙆🏾‍♀️", + ":woman_gesturing_ok_tone5:": "🙆🏿‍♀️", + ":woman_getting_face_massage:": "💆‍♀️", + ":woman_getting_face_massage_dark_skin_tone:": "💆🏿‍♀️", + ":woman_getting_face_massage_light_skin_tone:": "💆🏻‍♀️", + ":woman_getting_face_massage_medium_dark_skin_tone:": "💆🏾‍♀️", + ":woman_getting_face_massage_medium_light_skin_tone:": "💆🏼‍♀️", + ":woman_getting_face_massage_medium_skin_tone:": "💆🏽‍♀️", + ":woman_getting_face_massage_tone1:": "💆🏻‍♀️", + ":woman_getting_face_massage_tone2:": "💆🏼‍♀️", + ":woman_getting_face_massage_tone3:": "💆🏽‍♀️", + ":woman_getting_face_massage_tone4:": "💆🏾‍♀️", + ":woman_getting_face_massage_tone5:": "💆🏿‍♀️", + ":woman_getting_haircut:": "💇‍♀️", + ":woman_getting_haircut_dark_skin_tone:": "💇🏿‍♀️", + ":woman_getting_haircut_light_skin_tone:": "💇🏻‍♀️", + ":woman_getting_haircut_medium_dark_skin_tone:": "💇🏾‍♀️", + ":woman_getting_haircut_medium_light_skin_tone:": "💇🏼‍♀️", + ":woman_getting_haircut_medium_skin_tone:": "💇🏽‍♀️", + ":woman_getting_haircut_tone1:": "💇🏻‍♀️", + ":woman_getting_haircut_tone2:": "💇🏼‍♀️", + ":woman_getting_haircut_tone3:": "💇🏽‍♀️", + ":woman_getting_haircut_tone4:": "💇🏾‍♀️", + ":woman_getting_haircut_tone5:": "💇🏿‍♀️", + ":woman_golfing:": "🏌️‍♀️", + ":woman_golfing_dark_skin_tone:": "🏌🏿‍♀️", + ":woman_golfing_light_skin_tone:": "🏌🏻‍♀️", + ":woman_golfing_medium_dark_skin_tone:": "🏌🏾‍♀️", + ":woman_golfing_medium_light_skin_tone:": "🏌🏼‍♀️", + ":woman_golfing_medium_skin_tone:": "🏌🏽‍♀️", + ":woman_golfing_tone1:": "🏌🏻‍♀️", + ":woman_golfing_tone2:": "🏌🏼‍♀️", + ":woman_golfing_tone3:": "🏌🏽‍♀️", + ":woman_golfing_tone4:": "🏌🏾‍♀️", + ":woman_golfing_tone5:": "🏌🏿‍♀️", + ":woman_guard:": "💂‍♀️", + ":woman_guard_dark_skin_tone:": "💂🏿‍♀️", + ":woman_guard_light_skin_tone:": "💂🏻‍♀️", + ":woman_guard_medium_dark_skin_tone:": "💂🏾‍♀️", + ":woman_guard_medium_light_skin_tone:": "💂🏼‍♀️", + ":woman_guard_medium_skin_tone:": "💂🏽‍♀️", + ":woman_guard_tone1:": "💂🏻‍♀️", + ":woman_guard_tone2:": "💂🏼‍♀️", + ":woman_guard_tone3:": "💂🏽‍♀️", + ":woman_guard_tone4:": "💂🏾‍♀️", + ":woman_guard_tone5:": "💂🏿‍♀️", + ":woman_health_worker:": "👩‍⚕️", + ":woman_health_worker_dark_skin_tone:": "👩🏿‍⚕️", + ":woman_health_worker_light_skin_tone:": "👩🏻‍⚕️", + ":woman_health_worker_medium_dark_skin_tone:": "👩🏾‍⚕️", + ":woman_health_worker_medium_light_skin_tone:": "👩🏼‍⚕️", + ":woman_health_worker_medium_skin_tone:": "👩🏽‍⚕️", + ":woman_health_worker_tone1:": "👩🏻‍⚕️", + ":woman_health_worker_tone2:": "👩🏼‍⚕️", + ":woman_health_worker_tone3:": "👩🏽‍⚕️", + ":woman_health_worker_tone4:": "👩🏾‍⚕️", + ":woman_health_worker_tone5:": "👩🏿‍⚕️", + ":woman_in_lotus_position:": "🧘‍♀️", + ":woman_in_lotus_position_dark_skin_tone:": "🧘🏿‍♀️", + ":woman_in_lotus_position_light_skin_tone:": "🧘🏻‍♀️", + ":woman_in_lotus_position_medium_dark_skin_tone:": "🧘🏾‍♀️", + ":woman_in_lotus_position_medium_light_skin_tone:": "🧘🏼‍♀️", + ":woman_in_lotus_position_medium_skin_tone:": "🧘🏽‍♀️", + ":woman_in_lotus_position_tone1:": "🧘🏻‍♀️", + ":woman_in_lotus_position_tone2:": "🧘🏼‍♀️", + ":woman_in_lotus_position_tone3:": "🧘🏽‍♀️", + ":woman_in_lotus_position_tone4:": "🧘🏾‍♀️", + ":woman_in_lotus_position_tone5:": "🧘🏿‍♀️", + ":woman_in_manual_wheelchair:": "👩‍🦽", + ":woman_in_manual_wheelchair_dark_skin_tone:": "👩🏿‍🦽", + ":woman_in_manual_wheelchair_light_skin_tone:": "👩🏻‍🦽", + ":woman_in_manual_wheelchair_medium_dark_skin_tone:": "👩🏾‍🦽", + ":woman_in_manual_wheelchair_medium_light_skin_tone:": "👩🏼‍🦽", + ":woman_in_manual_wheelchair_medium_skin_tone:": "👩🏽‍🦽", + ":woman_in_manual_wheelchair_tone1:": "👩🏻‍🦽", + ":woman_in_manual_wheelchair_tone2:": "👩🏼‍🦽", + ":woman_in_manual_wheelchair_tone3:": "👩🏽‍🦽", + ":woman_in_manual_wheelchair_tone4:": "👩🏾‍🦽", + ":woman_in_manual_wheelchair_tone5:": "👩🏿‍🦽", + ":woman_in_motorized_wheelchair:": "👩‍🦼", + ":woman_in_motorized_wheelchair_dark_skin_tone:": "👩🏿‍🦼", + ":woman_in_motorized_wheelchair_light_skin_tone:": "👩🏻‍🦼", + ":woman_in_motorized_wheelchair_medium_dark_skin_tone:": "👩🏾‍🦼", + ":woman_in_motorized_wheelchair_medium_light_skin_tone:": "👩🏼‍🦼", + ":woman_in_motorized_wheelchair_medium_skin_tone:": "👩🏽‍🦼", + ":woman_in_motorized_wheelchair_tone1:": "👩🏻‍🦼", + ":woman_in_motorized_wheelchair_tone2:": "👩🏼‍🦼", + ":woman_in_motorized_wheelchair_tone3:": "👩🏽‍🦼", + ":woman_in_motorized_wheelchair_tone4:": "👩🏾‍🦼", + ":woman_in_motorized_wheelchair_tone5:": "👩🏿‍🦼", + ":woman_in_steamy_room:": "🧖‍♀️", + ":woman_in_steamy_room_dark_skin_tone:": "🧖🏿‍♀️", + ":woman_in_steamy_room_light_skin_tone:": "🧖🏻‍♀️", + ":woman_in_steamy_room_medium_dark_skin_tone:": "🧖🏾‍♀️", + ":woman_in_steamy_room_medium_light_skin_tone:": "🧖🏼‍♀️", + ":woman_in_steamy_room_medium_skin_tone:": "🧖🏽‍♀️", + ":woman_in_steamy_room_tone1:": "🧖🏻‍♀️", + ":woman_in_steamy_room_tone2:": "🧖🏼‍♀️", + ":woman_in_steamy_room_tone3:": "🧖🏽‍♀️", + ":woman_in_steamy_room_tone4:": "🧖🏾‍♀️", + ":woman_in_steamy_room_tone5:": "🧖🏿‍♀️", + ":woman_in_tuxedo:": "🤵‍♀️", + ":woman_in_tuxedo_dark_skin_tone:": "🤵🏿‍♀️", + ":woman_in_tuxedo_light_skin_tone:": "🤵🏻‍♀️", + ":woman_in_tuxedo_medium_dark_skin_tone:": "🤵🏾‍♀️", + ":woman_in_tuxedo_medium_light_skin_tone:": "🤵🏼‍♀️", + ":woman_in_tuxedo_medium_skin_tone:": "🤵🏽‍♀️", + ":woman_in_tuxedo_tone1:": "🤵🏻‍♀️", + ":woman_in_tuxedo_tone2:": "🤵🏼‍♀️", + ":woman_in_tuxedo_tone3:": "🤵🏽‍♀️", + ":woman_in_tuxedo_tone4:": "🤵🏾‍♀️", + ":woman_in_tuxedo_tone5:": "🤵🏿‍♀️", + ":woman_judge:": "👩‍⚖️", + ":woman_judge_dark_skin_tone:": "👩🏿‍⚖️", + ":woman_judge_light_skin_tone:": "👩🏻‍⚖️", + ":woman_judge_medium_dark_skin_tone:": "👩🏾‍⚖️", + ":woman_judge_medium_light_skin_tone:": "👩🏼‍⚖️", + ":woman_judge_medium_skin_tone:": "👩🏽‍⚖️", + ":woman_judge_tone1:": "👩🏻‍⚖️", + ":woman_judge_tone2:": "👩🏼‍⚖️", + ":woman_judge_tone3:": "👩🏽‍⚖️", + ":woman_judge_tone4:": "👩🏾‍⚖️", + ":woman_judge_tone5:": "👩🏿‍⚖️", + ":woman_juggling:": "🤹‍♀️", + ":woman_juggling_dark_skin_tone:": "🤹🏿‍♀️", + ":woman_juggling_light_skin_tone:": "🤹🏻‍♀️", + ":woman_juggling_medium_dark_skin_tone:": "🤹🏾‍♀️", + ":woman_juggling_medium_light_skin_tone:": "🤹🏼‍♀️", + ":woman_juggling_medium_skin_tone:": "🤹🏽‍♀️", + ":woman_juggling_tone1:": "🤹🏻‍♀️", + ":woman_juggling_tone2:": "🤹🏼‍♀️", + ":woman_juggling_tone3:": "🤹🏽‍♀️", + ":woman_juggling_tone4:": "🤹🏾‍♀️", + ":woman_juggling_tone5:": "🤹🏿‍♀️", + ":woman_kneeling:": "🧎‍♀️", + ":woman_kneeling_dark_skin_tone:": "🧎🏿‍♀️", + ":woman_kneeling_light_skin_tone:": "🧎🏻‍♀️", + ":woman_kneeling_medium_dark_skin_tone:": "🧎🏾‍♀️", + ":woman_kneeling_medium_light_skin_tone:": "🧎🏼‍♀️", + ":woman_kneeling_medium_skin_tone:": "🧎🏽‍♀️", + ":woman_kneeling_tone1:": "🧎🏻‍♀️", + ":woman_kneeling_tone2:": "🧎🏼‍♀️", + ":woman_kneeling_tone3:": "🧎🏽‍♀️", + ":woman_kneeling_tone4:": "🧎🏾‍♀️", + ":woman_kneeling_tone5:": "🧎🏿‍♀️", + ":woman_lifting_weights:": "🏋️‍♀️", + ":woman_lifting_weights_dark_skin_tone:": "🏋🏿‍♀️", + ":woman_lifting_weights_light_skin_tone:": "🏋🏻‍♀️", + ":woman_lifting_weights_medium_dark_skin_tone:": "🏋🏾‍♀️", + ":woman_lifting_weights_medium_light_skin_tone:": "🏋🏼‍♀️", + ":woman_lifting_weights_medium_skin_tone:": "🏋🏽‍♀️", + ":woman_lifting_weights_tone1:": "🏋🏻‍♀️", + ":woman_lifting_weights_tone2:": "🏋🏼‍♀️", + ":woman_lifting_weights_tone3:": "🏋🏽‍♀️", + ":woman_lifting_weights_tone4:": "🏋🏾‍♀️", + ":woman_lifting_weights_tone5:": "🏋🏿‍♀️", + ":woman_light_skin_tone_beard:": "🧔🏻‍♀️", + ":woman_mage:": "🧙‍♀️", + ":woman_mage_dark_skin_tone:": "🧙🏿‍♀️", + ":woman_mage_light_skin_tone:": "🧙🏻‍♀️", + ":woman_mage_medium_dark_skin_tone:": "🧙🏾‍♀️", + ":woman_mage_medium_light_skin_tone:": "🧙🏼‍♀️", + ":woman_mage_medium_skin_tone:": "🧙🏽‍♀️", + ":woman_mage_tone1:": "🧙🏻‍♀️", + ":woman_mage_tone2:": "🧙🏼‍♀️", + ":woman_mage_tone3:": "🧙🏽‍♀️", + ":woman_mage_tone4:": "🧙🏾‍♀️", + ":woman_mage_tone5:": "🧙🏿‍♀️", + ":woman_mechanic:": "👩‍🔧", + ":woman_mechanic_dark_skin_tone:": "👩🏿‍🔧", + ":woman_mechanic_light_skin_tone:": "👩🏻‍🔧", + ":woman_mechanic_medium_dark_skin_tone:": "👩🏾‍🔧", + ":woman_mechanic_medium_light_skin_tone:": "👩🏼‍🔧", + ":woman_mechanic_medium_skin_tone:": "👩🏽‍🔧", + ":woman_mechanic_tone1:": "👩🏻‍🔧", + ":woman_mechanic_tone2:": "👩🏼‍🔧", + ":woman_mechanic_tone3:": "👩🏽‍🔧", + ":woman_mechanic_tone4:": "👩🏾‍🔧", + ":woman_mechanic_tone5:": "👩🏿‍🔧", + ":woman_medium_dark_skin_tone_beard:": "🧔🏾‍♀️", + ":woman_medium_light_skin_tone_beard:": "🧔🏼‍♀️", + ":woman_medium_skin_tone_beard:": "🧔🏽‍♀️", + ":woman_mountain_biking:": "🚵‍♀️", + ":woman_mountain_biking_dark_skin_tone:": "🚵🏿‍♀️", + ":woman_mountain_biking_light_skin_tone:": "🚵🏻‍♀️", + ":woman_mountain_biking_medium_dark_skin_tone:": "🚵🏾‍♀️", + ":woman_mountain_biking_medium_light_skin_tone:": "🚵🏼‍♀️", + ":woman_mountain_biking_medium_skin_tone:": "🚵🏽‍♀️", + ":woman_mountain_biking_tone1:": "🚵🏻‍♀️", + ":woman_mountain_biking_tone2:": "🚵🏼‍♀️", + ":woman_mountain_biking_tone3:": "🚵🏽‍♀️", + ":woman_mountain_biking_tone4:": "🚵🏾‍♀️", + ":woman_mountain_biking_tone5:": "🚵🏿‍♀️", + ":woman_office_worker:": "👩‍💼", + ":woman_office_worker_dark_skin_tone:": "👩🏿‍💼", + ":woman_office_worker_light_skin_tone:": "👩🏻‍💼", + ":woman_office_worker_medium_dark_skin_tone:": "👩🏾‍💼", + ":woman_office_worker_medium_light_skin_tone:": "👩🏼‍💼", + ":woman_office_worker_medium_skin_tone:": "👩🏽‍💼", + ":woman_office_worker_tone1:": "👩🏻‍💼", + ":woman_office_worker_tone2:": "👩🏼‍💼", + ":woman_office_worker_tone3:": "👩🏽‍💼", + ":woman_office_worker_tone4:": "👩🏾‍💼", + ":woman_office_worker_tone5:": "👩🏿‍💼", + ":woman_pilot:": "👩‍✈️", + ":woman_pilot_dark_skin_tone:": "👩🏿‍✈️", + ":woman_pilot_light_skin_tone:": "👩🏻‍✈️", + ":woman_pilot_medium_dark_skin_tone:": "👩🏾‍✈️", + ":woman_pilot_medium_light_skin_tone:": "👩🏼‍✈️", + ":woman_pilot_medium_skin_tone:": "👩🏽‍✈️", + ":woman_pilot_tone1:": "👩🏻‍✈️", + ":woman_pilot_tone2:": "👩🏼‍✈️", + ":woman_pilot_tone3:": "👩🏽‍✈️", + ":woman_pilot_tone4:": "👩🏾‍✈️", + ":woman_pilot_tone5:": "👩🏿‍✈️", + ":woman_playing_handball:": "🤾‍♀️", + ":woman_playing_handball_dark_skin_tone:": "🤾🏿‍♀️", + ":woman_playing_handball_light_skin_tone:": "🤾🏻‍♀️", + ":woman_playing_handball_medium_dark_skin_tone:": "🤾🏾‍♀️", + ":woman_playing_handball_medium_light_skin_tone:": "🤾🏼‍♀️", + ":woman_playing_handball_medium_skin_tone:": "🤾🏽‍♀️", + ":woman_playing_handball_tone1:": "🤾🏻‍♀️", + ":woman_playing_handball_tone2:": "🤾🏼‍♀️", + ":woman_playing_handball_tone3:": "🤾🏽‍♀️", + ":woman_playing_handball_tone4:": "🤾🏾‍♀️", + ":woman_playing_handball_tone5:": "🤾🏿‍♀️", + ":woman_playing_water_polo:": "🤽‍♀️", + ":woman_playing_water_polo_dark_skin_tone:": "🤽🏿‍♀️", + ":woman_playing_water_polo_light_skin_tone:": "🤽🏻‍♀️", + ":woman_playing_water_polo_medium_dark_skin_tone:": "🤽🏾‍♀️", + ":woman_playing_water_polo_medium_light_skin_tone:": "🤽🏼‍♀️", + ":woman_playing_water_polo_medium_skin_tone:": "🤽🏽‍♀️", + ":woman_playing_water_polo_tone1:": "🤽🏻‍♀️", + ":woman_playing_water_polo_tone2:": "🤽🏼‍♀️", + ":woman_playing_water_polo_tone3:": "🤽🏽‍♀️", + ":woman_playing_water_polo_tone4:": "🤽🏾‍♀️", + ":woman_playing_water_polo_tone5:": "🤽🏿‍♀️", + ":woman_police_officer:": "👮‍♀️", + ":woman_police_officer_dark_skin_tone:": "👮🏿‍♀️", + ":woman_police_officer_light_skin_tone:": "👮🏻‍♀️", + ":woman_police_officer_medium_dark_skin_tone:": "👮🏾‍♀️", + ":woman_police_officer_medium_light_skin_tone:": "👮🏼‍♀️", + ":woman_police_officer_medium_skin_tone:": "👮🏽‍♀️", + ":woman_police_officer_tone1:": "👮🏻‍♀️", + ":woman_police_officer_tone2:": "👮🏼‍♀️", + ":woman_police_officer_tone3:": "👮🏽‍♀️", + ":woman_police_officer_tone4:": "👮🏾‍♀️", + ":woman_police_officer_tone5:": "👮🏿‍♀️", + ":woman_pouting:": "🙎‍♀️", + ":woman_pouting_dark_skin_tone:": "🙎🏿‍♀️", + ":woman_pouting_light_skin_tone:": "🙎🏻‍♀️", + ":woman_pouting_medium_dark_skin_tone:": "🙎🏾‍♀️", + ":woman_pouting_medium_light_skin_tone:": "🙎🏼‍♀️", + ":woman_pouting_medium_skin_tone:": "🙎🏽‍♀️", + ":woman_pouting_tone1:": "🙎🏻‍♀️", + ":woman_pouting_tone2:": "🙎🏼‍♀️", + ":woman_pouting_tone3:": "🙎🏽‍♀️", + ":woman_pouting_tone4:": "🙎🏾‍♀️", + ":woman_pouting_tone5:": "🙎🏿‍♀️", + ":woman_raising_hand:": "🙋‍♀️", + ":woman_raising_hand_dark_skin_tone:": "🙋🏿‍♀️", + ":woman_raising_hand_light_skin_tone:": "🙋🏻‍♀️", + ":woman_raising_hand_medium_dark_skin_tone:": "🙋🏾‍♀️", + ":woman_raising_hand_medium_light_skin_tone:": "🙋🏼‍♀️", + ":woman_raising_hand_medium_skin_tone:": "🙋🏽‍♀️", + ":woman_raising_hand_tone1:": "🙋🏻‍♀️", + ":woman_raising_hand_tone2:": "🙋🏼‍♀️", + ":woman_raising_hand_tone3:": "🙋🏽‍♀️", + ":woman_raising_hand_tone4:": "🙋🏾‍♀️", + ":woman_raising_hand_tone5:": "🙋🏿‍♀️", + ":woman_red_haired:": "👩‍🦰", + ":woman_red_haired_dark_skin_tone:": "👩🏿‍🦰", + ":woman_red_haired_light_skin_tone:": "👩🏻‍🦰", + ":woman_red_haired_medium_dark_skin_tone:": "👩🏾‍🦰", + ":woman_red_haired_medium_light_skin_tone:": "👩🏼‍🦰", + ":woman_red_haired_medium_skin_tone:": "👩🏽‍🦰", + ":woman_red_haired_tone1:": "👩🏻‍🦰", + ":woman_red_haired_tone2:": "👩🏼‍🦰", + ":woman_red_haired_tone3:": "👩🏽‍🦰", + ":woman_red_haired_tone4:": "👩🏾‍🦰", + ":woman_red_haired_tone5:": "👩🏿‍🦰", + ":woman_rowing_boat:": "🚣‍♀️", + ":woman_rowing_boat_dark_skin_tone:": "🚣🏿‍♀️", + ":woman_rowing_boat_light_skin_tone:": "🚣🏻‍♀️", + ":woman_rowing_boat_medium_dark_skin_tone:": "🚣🏾‍♀️", + ":woman_rowing_boat_medium_light_skin_tone:": "🚣🏼‍♀️", + ":woman_rowing_boat_medium_skin_tone:": "🚣🏽‍♀️", + ":woman_rowing_boat_tone1:": "🚣🏻‍♀️", + ":woman_rowing_boat_tone2:": "🚣🏼‍♀️", + ":woman_rowing_boat_tone3:": "🚣🏽‍♀️", + ":woman_rowing_boat_tone4:": "🚣🏾‍♀️", + ":woman_rowing_boat_tone5:": "🚣🏿‍♀️", + ":woman_running:": "🏃‍♀️", + ":woman_running_dark_skin_tone:": "🏃🏿‍♀️", + ":woman_running_light_skin_tone:": "🏃🏻‍♀️", + ":woman_running_medium_dark_skin_tone:": "🏃🏾‍♀️", + ":woman_running_medium_light_skin_tone:": "🏃🏼‍♀️", + ":woman_running_medium_skin_tone:": "🏃🏽‍♀️", + ":woman_running_tone1:": "🏃🏻‍♀️", + ":woman_running_tone2:": "🏃🏼‍♀️", + ":woman_running_tone3:": "🏃🏽‍♀️", + ":woman_running_tone4:": "🏃🏾‍♀️", + ":woman_running_tone5:": "🏃🏿‍♀️", + ":woman_scientist:": "👩‍🔬", + ":woman_scientist_dark_skin_tone:": "👩🏿‍🔬", + ":woman_scientist_light_skin_tone:": "👩🏻‍🔬", + ":woman_scientist_medium_dark_skin_tone:": "👩🏾‍🔬", + ":woman_scientist_medium_light_skin_tone:": "👩🏼‍🔬", + ":woman_scientist_medium_skin_tone:": "👩🏽‍🔬", + ":woman_scientist_tone1:": "👩🏻‍🔬", + ":woman_scientist_tone2:": "👩🏼‍🔬", + ":woman_scientist_tone3:": "👩🏽‍🔬", + ":woman_scientist_tone4:": "👩🏾‍🔬", + ":woman_scientist_tone5:": "👩🏿‍🔬", + ":woman_shrugging:": "🤷‍♀️", + ":woman_shrugging_dark_skin_tone:": "🤷🏿‍♀️", + ":woman_shrugging_light_skin_tone:": "🤷🏻‍♀️", + ":woman_shrugging_medium_dark_skin_tone:": "🤷🏾‍♀️", + ":woman_shrugging_medium_light_skin_tone:": "🤷🏼‍♀️", + ":woman_shrugging_medium_skin_tone:": "🤷🏽‍♀️", + ":woman_shrugging_tone1:": "🤷🏻‍♀️", + ":woman_shrugging_tone2:": "🤷🏼‍♀️", + ":woman_shrugging_tone3:": "🤷🏽‍♀️", + ":woman_shrugging_tone4:": "🤷🏾‍♀️", + ":woman_shrugging_tone5:": "🤷🏿‍♀️", + ":woman_singer:": "👩‍🎤", + ":woman_singer_dark_skin_tone:": "👩🏿‍🎤", + ":woman_singer_light_skin_tone:": "👩🏻‍🎤", + ":woman_singer_medium_dark_skin_tone:": "👩🏾‍🎤", + ":woman_singer_medium_light_skin_tone:": "👩🏼‍🎤", + ":woman_singer_medium_skin_tone:": "👩🏽‍🎤", + ":woman_singer_tone1:": "👩🏻‍🎤", + ":woman_singer_tone2:": "👩🏼‍🎤", + ":woman_singer_tone3:": "👩🏽‍🎤", + ":woman_singer_tone4:": "👩🏾‍🎤", + ":woman_singer_tone5:": "👩🏿‍🎤", + ":woman_standing:": "🧍‍♀️", + ":woman_standing_dark_skin_tone:": "🧍🏿‍♀️", + ":woman_standing_light_skin_tone:": "🧍🏻‍♀️", + ":woman_standing_medium_dark_skin_tone:": "🧍🏾‍♀️", + ":woman_standing_medium_light_skin_tone:": "🧍🏼‍♀️", + ":woman_standing_medium_skin_tone:": "🧍🏽‍♀️", + ":woman_standing_tone1:": "🧍🏻‍♀️", + ":woman_standing_tone2:": "🧍🏼‍♀️", + ":woman_standing_tone3:": "🧍🏽‍♀️", + ":woman_standing_tone4:": "🧍🏾‍♀️", + ":woman_standing_tone5:": "🧍🏿‍♀️", + ":woman_student:": "👩‍🎓", + ":woman_student_dark_skin_tone:": "👩🏿‍🎓", + ":woman_student_light_skin_tone:": "👩🏻‍🎓", + ":woman_student_medium_dark_skin_tone:": "👩🏾‍🎓", + ":woman_student_medium_light_skin_tone:": "👩🏼‍🎓", + ":woman_student_medium_skin_tone:": "👩🏽‍🎓", + ":woman_student_tone1:": "👩🏻‍🎓", + ":woman_student_tone2:": "👩🏼‍🎓", + ":woman_student_tone3:": "👩🏽‍🎓", + ":woman_student_tone4:": "👩🏾‍🎓", + ":woman_student_tone5:": "👩🏿‍🎓", + ":woman_superhero:": "🦸‍♀️", + ":woman_superhero_dark_skin_tone:": "🦸🏿‍♀️", + ":woman_superhero_light_skin_tone:": "🦸🏻‍♀️", + ":woman_superhero_medium_dark_skin_tone:": "🦸🏾‍♀️", + ":woman_superhero_medium_light_skin_tone:": "🦸🏼‍♀️", + ":woman_superhero_medium_skin_tone:": "🦸🏽‍♀️", + ":woman_superhero_tone1:": "🦸🏻‍♀️", + ":woman_superhero_tone2:": "🦸🏼‍♀️", + ":woman_superhero_tone3:": "🦸🏽‍♀️", + ":woman_superhero_tone4:": "🦸🏾‍♀️", + ":woman_superhero_tone5:": "🦸🏿‍♀️", + ":woman_supervillain:": "🦹‍♀️", + ":woman_supervillain_dark_skin_tone:": "🦹🏿‍♀️", + ":woman_supervillain_light_skin_tone:": "🦹🏻‍♀️", + ":woman_supervillain_medium_dark_skin_tone:": "🦹🏾‍♀️", + ":woman_supervillain_medium_light_skin_tone:": "🦹🏼‍♀️", + ":woman_supervillain_medium_skin_tone:": "🦹🏽‍♀️", + ":woman_supervillain_tone1:": "🦹🏻‍♀️", + ":woman_supervillain_tone2:": "🦹🏼‍♀️", + ":woman_supervillain_tone3:": "🦹🏽‍♀️", + ":woman_supervillain_tone4:": "🦹🏾‍♀️", + ":woman_supervillain_tone5:": "🦹🏿‍♀️", + ":woman_surfing:": "🏄‍♀️", + ":woman_surfing_dark_skin_tone:": "🏄🏿‍♀️", + ":woman_surfing_light_skin_tone:": "🏄🏻‍♀️", + ":woman_surfing_medium_dark_skin_tone:": "🏄🏾‍♀️", + ":woman_surfing_medium_light_skin_tone:": "🏄🏼‍♀️", + ":woman_surfing_medium_skin_tone:": "🏄🏽‍♀️", + ":woman_surfing_tone1:": "🏄🏻‍♀️", + ":woman_surfing_tone2:": "🏄🏼‍♀️", + ":woman_surfing_tone3:": "🏄🏽‍♀️", + ":woman_surfing_tone4:": "🏄🏾‍♀️", + ":woman_surfing_tone5:": "🏄🏿‍♀️", + ":woman_swimming:": "🏊‍♀️", + ":woman_swimming_dark_skin_tone:": "🏊🏿‍♀️", + ":woman_swimming_light_skin_tone:": "🏊🏻‍♀️", + ":woman_swimming_medium_dark_skin_tone:": "🏊🏾‍♀️", + ":woman_swimming_medium_light_skin_tone:": "🏊🏼‍♀️", + ":woman_swimming_medium_skin_tone:": "🏊🏽‍♀️", + ":woman_swimming_tone1:": "🏊🏻‍♀️", + ":woman_swimming_tone2:": "🏊🏼‍♀️", + ":woman_swimming_tone3:": "🏊🏽‍♀️", + ":woman_swimming_tone4:": "🏊🏾‍♀️", + ":woman_swimming_tone5:": "🏊🏿‍♀️", + ":woman_teacher:": "👩‍🏫", + ":woman_teacher_dark_skin_tone:": "👩🏿‍🏫", + ":woman_teacher_light_skin_tone:": "👩🏻‍🏫", + ":woman_teacher_medium_dark_skin_tone:": "👩🏾‍🏫", + ":woman_teacher_medium_light_skin_tone:": "👩🏼‍🏫", + ":woman_teacher_medium_skin_tone:": "👩🏽‍🏫", + ":woman_teacher_tone1:": "👩🏻‍🏫", + ":woman_teacher_tone2:": "👩🏼‍🏫", + ":woman_teacher_tone3:": "👩🏽‍🏫", + ":woman_teacher_tone4:": "👩🏾‍🏫", + ":woman_teacher_tone5:": "👩🏿‍🏫", + ":woman_technologist:": "👩‍💻", + ":woman_technologist_dark_skin_tone:": "👩🏿‍💻", + ":woman_technologist_light_skin_tone:": "👩🏻‍💻", + ":woman_technologist_medium_dark_skin_tone:": "👩🏾‍💻", + ":woman_technologist_medium_light_skin_tone:": "👩🏼‍💻", + ":woman_technologist_medium_skin_tone:": "👩🏽‍💻", + ":woman_technologist_tone1:": "👩🏻‍💻", + ":woman_technologist_tone2:": "👩🏼‍💻", + ":woman_technologist_tone3:": "👩🏽‍💻", + ":woman_technologist_tone4:": "👩🏾‍💻", + ":woman_technologist_tone5:": "👩🏿‍💻", + ":woman_tipping_hand:": "💁‍♀️", + ":woman_tipping_hand_dark_skin_tone:": "💁🏿‍♀️", + ":woman_tipping_hand_light_skin_tone:": "💁🏻‍♀️", + ":woman_tipping_hand_medium_dark_skin_tone:": "💁🏾‍♀️", + ":woman_tipping_hand_medium_light_skin_tone:": "💁🏼‍♀️", + ":woman_tipping_hand_medium_skin_tone:": "💁🏽‍♀️", + ":woman_tipping_hand_tone1:": "💁🏻‍♀️", + ":woman_tipping_hand_tone2:": "💁🏼‍♀️", + ":woman_tipping_hand_tone3:": "💁🏽‍♀️", + ":woman_tipping_hand_tone4:": "💁🏾‍♀️", + ":woman_tipping_hand_tone5:": "💁🏿‍♀️", + ":woman_tone1:": "👩🏻", + ":woman_tone1_beard:": "🧔🏻‍♀️", + ":woman_tone2:": "👩🏼", + ":woman_tone2_beard:": "🧔🏼‍♀️", + ":woman_tone3:": "👩🏽", + ":woman_tone3_beard:": "🧔🏽‍♀️", + ":woman_tone4:": "👩🏾", + ":woman_tone4_beard:": "🧔🏾‍♀️", + ":woman_tone5:": "👩🏿", + ":woman_tone5_beard:": "🧔🏿‍♀️", + ":woman_vampire:": "🧛‍♀️", + ":woman_vampire_dark_skin_tone:": "🧛🏿‍♀️", + ":woman_vampire_light_skin_tone:": "🧛🏻‍♀️", + ":woman_vampire_medium_dark_skin_tone:": "🧛🏾‍♀️", + ":woman_vampire_medium_light_skin_tone:": "🧛🏼‍♀️", + ":woman_vampire_medium_skin_tone:": "🧛🏽‍♀️", + ":woman_vampire_tone1:": "🧛🏻‍♀️", + ":woman_vampire_tone2:": "🧛🏼‍♀️", + ":woman_vampire_tone3:": "🧛🏽‍♀️", + ":woman_vampire_tone4:": "🧛🏾‍♀️", + ":woman_vampire_tone5:": "🧛🏿‍♀️", + ":woman_walking:": "🚶‍♀️", + ":woman_walking_dark_skin_tone:": "🚶🏿‍♀️", + ":woman_walking_light_skin_tone:": "🚶🏻‍♀️", + ":woman_walking_medium_dark_skin_tone:": "🚶🏾‍♀️", + ":woman_walking_medium_light_skin_tone:": "🚶🏼‍♀️", + ":woman_walking_medium_skin_tone:": "🚶🏽‍♀️", + ":woman_walking_tone1:": "🚶🏻‍♀️", + ":woman_walking_tone2:": "🚶🏼‍♀️", + ":woman_walking_tone3:": "🚶🏽‍♀️", + ":woman_walking_tone4:": "🚶🏾‍♀️", + ":woman_walking_tone5:": "🚶🏿‍♀️", + ":woman_wearing_turban:": "👳‍♀️", + ":woman_wearing_turban_dark_skin_tone:": "👳🏿‍♀️", + ":woman_wearing_turban_light_skin_tone:": "👳🏻‍♀️", + ":woman_wearing_turban_medium_dark_skin_tone:": "👳🏾‍♀️", + ":woman_wearing_turban_medium_light_skin_tone:": "👳🏼‍♀️", + ":woman_wearing_turban_medium_skin_tone:": "👳🏽‍♀️", + ":woman_wearing_turban_tone1:": "👳🏻‍♀️", + ":woman_wearing_turban_tone2:": "👳🏼‍♀️", + ":woman_wearing_turban_tone3:": "👳🏽‍♀️", + ":woman_wearing_turban_tone4:": "👳🏾‍♀️", + ":woman_wearing_turban_tone5:": "👳🏿‍♀️", + ":woman_white_haired:": "👩‍🦳", + ":woman_white_haired_dark_skin_tone:": "👩🏿‍🦳", + ":woman_white_haired_light_skin_tone:": "👩🏻‍🦳", + ":woman_white_haired_medium_dark_skin_tone:": "👩🏾‍🦳", + ":woman_white_haired_medium_light_skin_tone:": "👩🏼‍🦳", + ":woman_white_haired_medium_skin_tone:": "👩🏽‍🦳", + ":woman_white_haired_tone1:": "👩🏻‍🦳", + ":woman_white_haired_tone2:": "👩🏼‍🦳", + ":woman_white_haired_tone3:": "👩🏽‍🦳", + ":woman_white_haired_tone4:": "👩🏾‍🦳", + ":woman_white_haired_tone5:": "👩🏿‍🦳", + ":woman_with_headscarf:": "🧕", + ":woman_with_headscarf_dark_skin_tone:": "🧕🏿", + ":woman_with_headscarf_light_skin_tone:": "🧕🏻", + ":woman_with_headscarf_medium_dark_skin_tone:": "🧕🏾", + ":woman_with_headscarf_medium_light_skin_tone:": "🧕🏼", + ":woman_with_headscarf_medium_skin_tone:": "🧕🏽", + ":woman_with_headscarf_tone1:": "🧕🏻", + ":woman_with_headscarf_tone2:": "🧕🏼", + ":woman_with_headscarf_tone3:": "🧕🏽", + ":woman_with_headscarf_tone4:": "🧕🏾", + ":woman_with_headscarf_tone5:": "🧕🏿", + ":woman_with_probing_cane:": "👩‍🦯", + ":woman_with_probing_cane_dark_skin_tone:": "👩🏿‍🦯", + ":woman_with_probing_cane_light_skin_tone:": "👩🏻‍🦯", + ":woman_with_probing_cane_medium_dark_skin_tone:": "👩🏾‍🦯", + ":woman_with_probing_cane_medium_light_skin_tone:": "👩🏼‍🦯", + ":woman_with_probing_cane_medium_skin_tone:": "👩🏽‍🦯", + ":woman_with_probing_cane_tone1:": "👩🏻‍🦯", + ":woman_with_probing_cane_tone2:": "👩🏼‍🦯", + ":woman_with_probing_cane_tone3:": "👩🏽‍🦯", + ":woman_with_probing_cane_tone4:": "👩🏾‍🦯", + ":woman_with_probing_cane_tone5:": "👩🏿‍🦯", + ":woman_with_turban:": "👳‍♀️", + ":woman_with_veil:": "👰‍♀️", + ":woman_with_veil_dark_skin_tone:": "👰🏿‍♀️", + ":woman_with_veil_light_skin_tone:": "👰🏻‍♀️", + ":woman_with_veil_medium_dark_skin_tone:": "👰🏾‍♀️", + ":woman_with_veil_medium_light_skin_tone:": "👰🏼‍♀️", + ":woman_with_veil_medium_skin_tone:": "👰🏽‍♀️", + ":woman_with_veil_tone1:": "👰🏻‍♀️", + ":woman_with_veil_tone2:": "👰🏼‍♀️", + ":woman_with_veil_tone3:": "👰🏽‍♀️", + ":woman_with_veil_tone4:": "👰🏾‍♀️", + ":woman_with_veil_tone5:": "👰🏿‍♀️", + ":woman_zombie:": "🧟‍♀️", + ":womans_clothes:": "👚", + ":womans_flat_shoe:": "🥿", + ":womans_hat:": "👒", + ":women_holding_hands_dark_skin_tone:": "👭🏿", + ":women_holding_hands_dark_skin_tone_light_skin_tone:": "👩🏿‍🤝‍👩🏻", + ":women_holding_hands_dark_skin_tone_medium_dark_skin_tone:": "👩🏿‍🤝‍👩🏾", + ":women_holding_hands_dark_skin_tone_medium_light_skin_tone:": "👩🏿‍🤝‍👩🏼", + ":women_holding_hands_dark_skin_tone_medium_skin_tone:": "👩🏿‍🤝‍👩🏽", + ":women_holding_hands_light_skin_tone:": "👭🏻", + ":women_holding_hands_light_skin_tone_dark_skin_tone:": "👩🏻‍🤝‍👩🏿", + ":women_holding_hands_light_skin_tone_medium_dark_skin_tone:": "👩🏻‍🤝‍👩🏾", + ":women_holding_hands_light_skin_tone_medium_light_skin_tone:": "👩🏻‍🤝‍👩🏼", + ":women_holding_hands_light_skin_tone_medium_skin_tone:": "👩🏻‍🤝‍👩🏽", + ":women_holding_hands_medium_dark_skin_tone:": "👭🏾", + ":women_holding_hands_medium_dark_skin_tone_dark_skin_tone:": "👩🏾‍🤝‍👩🏿", + ":women_holding_hands_medium_dark_skin_tone_light_skin_tone:": "👩🏾‍🤝‍👩🏻", + ":women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone:": "👩🏾‍🤝‍👩🏼", + ":women_holding_hands_medium_dark_skin_tone_medium_skin_tone:": "👩🏾‍🤝‍👩🏽", + ":women_holding_hands_medium_light_skin_tone:": "👭🏼", + ":women_holding_hands_medium_light_skin_tone_dark_skin_tone:": "👩🏼‍🤝‍👩🏿", + ":women_holding_hands_medium_light_skin_tone_light_skin_tone:": "👩🏼‍🤝‍👩🏻", + ":women_holding_hands_medium_light_skin_tone_medium_dark_skin_tone:": "👩🏼‍🤝‍👩🏾", + ":women_holding_hands_medium_light_skin_tone_medium_skin_tone:": "👩🏼‍🤝‍👩🏽", + ":women_holding_hands_medium_skin_tone:": "👭🏽", + ":women_holding_hands_medium_skin_tone_dark_skin_tone:": "👩🏽‍🤝‍👩🏿", + ":women_holding_hands_medium_skin_tone_light_skin_tone:": "👩🏽‍🤝‍👩🏻", + ":women_holding_hands_medium_skin_tone_medium_dark_skin_tone:": "👩🏽‍🤝‍👩🏾", + ":women_holding_hands_medium_skin_tone_medium_light_skin_tone:": "👩🏽‍🤝‍👩🏼", + ":women_holding_hands_tone1:": "👭🏻", + ":women_holding_hands_tone1_tone2:": "👩🏻‍🤝‍👩🏼", + ":women_holding_hands_tone1_tone3:": "👩🏻‍🤝‍👩🏽", + ":women_holding_hands_tone1_tone4:": "👩🏻‍🤝‍👩🏾", + ":women_holding_hands_tone1_tone5:": "👩🏻‍🤝‍👩🏿", + ":women_holding_hands_tone2:": "👭🏼", + ":women_holding_hands_tone2_tone1:": "👩🏼‍🤝‍👩🏻", + ":women_holding_hands_tone2_tone3:": "👩🏼‍🤝‍👩🏽", + ":women_holding_hands_tone2_tone4:": "👩🏼‍🤝‍👩🏾", + ":women_holding_hands_tone2_tone5:": "👩🏼‍🤝‍👩🏿", + ":women_holding_hands_tone3:": "👭🏽", + ":women_holding_hands_tone3_tone1:": "👩🏽‍🤝‍👩🏻", + ":women_holding_hands_tone3_tone2:": "👩🏽‍🤝‍👩🏼", + ":women_holding_hands_tone3_tone4:": "👩🏽‍🤝‍👩🏾", + ":women_holding_hands_tone3_tone5:": "👩🏽‍🤝‍👩🏿", + ":women_holding_hands_tone4:": "👭🏾", + ":women_holding_hands_tone4_tone1:": "👩🏾‍🤝‍👩🏻", + ":women_holding_hands_tone4_tone2:": "👩🏾‍🤝‍👩🏼", + ":women_holding_hands_tone4_tone3:": "👩🏾‍🤝‍👩🏽", + ":women_holding_hands_tone4_tone5:": "👩🏾‍🤝‍👩🏿", + ":women_holding_hands_tone5:": "👭🏿", + ":women_holding_hands_tone5_tone1:": "👩🏿‍🤝‍👩🏻", + ":women_holding_hands_tone5_tone2:": "👩🏿‍🤝‍👩🏼", + ":women_holding_hands_tone5_tone3:": "👩🏿‍🤝‍👩🏽", + ":women_holding_hands_tone5_tone4:": "👩🏿‍🤝‍👩🏾", + ":women_with_bunny_ears_partying:": "👯‍♀️", + ":women_wrestling:": "🤼‍♀️", + ":womens:": "🚺", + ":wood:": "🪵", + ":woozy_face:": "🥴", + ":world_map:": "🗺️", + ":worm:": "🪱", + ":worried:": "😟", + ":worship_symbol:": "🛐", + ":wrench:": "🔧", + ":wrestlers:": "🤼", + ":wrestlers_tone1:": "🤼🏻", + ":wrestlers_tone2:": "🤼🏼", + ":wrestlers_tone3:": "🤼🏽", + ":wrestlers_tone4:": "🤼🏾", + ":wrestlers_tone5:": "🤼🏿", + ":wrestling:": "🤼", + ":wrestling_tone1:": "🤼🏻", + ":wrestling_tone2:": "🤼🏼", + ":wrestling_tone3:": "🤼🏽", + ":wrestling_tone4:": "🤼🏾", + ":wrestling_tone5:": "🤼🏿", + ":writing_hand:": "✍️", + ":writing_hand_tone1:": "✍🏻", + ":writing_hand_tone2:": "✍🏼", + ":writing_hand_tone3:": "✍🏽", + ":writing_hand_tone4:": "✍🏾", + ":writing_hand_tone5:": "✍🏿", + ":ws:": "🇼🇸", + ":x:": "❌", + ":xk:": "🇽🇰", + ":yarn:": "🧶", + ":yawning_face:": "🥱", + ":ye:": "🇾🇪", + ":yellow_circle:": "🟡", + ":yellow_heart:": "💛", + ":yellow_square:": "🟨", + ":yemen:": "🇾🇪", + ":yen:": "💴", + ":yin_yang:": "☯️", + ":yo_yo:": "🪀", + ":yt:": "🇾🇹", + ":yum:": "😋", + ":za:": "🇿🇦", + ":zambia:": "🇿🇲", + ":zany_face:": "🤪", + ":zap:": "⚡", + ":zebra:": "🦓", + ":zero:": "0️⃣", + ":zimbabwe:": "🇿🇼", + ":zipper_mouth:": "🤐", + ":zipper_mouth_face:": "🤐", + ":zm:": "🇿🇲", + ":zombie:": "🧟", + ":zw:": "🇿🇼", + ":zzz:": "💤" +} diff --git a/docs/source/.gitignore b/docs/source/.gitignore new file mode 100644 index 0000000000..8157632d93 --- /dev/null +++ b/docs/source/.gitignore @@ -0,0 +1,4 @@ +*.rst +!index.rst +!projects/*.rst +!tutorials/*.rst diff --git a/docs/source/conf.py b/docs/source/conf.py index a6bbe78e0b..e9b39f07e1 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -41,6 +41,7 @@ 'sphinx.ext.mathjax', 'sphinx.ext.viewcode', 'sphinx.ext.githubpages', + 'sphinxemoji.sphinxemoji', ] # Add any paths that contain templates here, relative to this directory. diff --git a/docs/source/index.rst b/docs/source/index.rst index cd18cb1cb2..6568b772a5 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1,6 +1,6 @@ -.. include:: ../../README.rst +.. include:: README.rst -.. include:: ../../CHANGELOG.rst +.. include:: CHANGELOG.rst Tutorial -------- diff --git a/docs/update_apidocs.sh b/docs/update_apidocs.sh index e72fbcc034..a605b41ff4 100755 --- a/docs/update_apidocs.sh +++ b/docs/update_apidocs.sh @@ -21,7 +21,11 @@ rm ${PWD}/docs/source/pySDC/*.rst echo "" echo "generating new .rst files ..." -${SPHINX_APIDOC} -o docs/source/pySDC pySDC/core --force -T -${SPHINX_APIDOC} -o docs/source/pySDC pySDC/implementations --force -T -${SPHINX_APIDOC} -o docs/source/pySDC pySDC/helpers --force -T +${SPHINX_APIDOC} -o docs/source/pySDC pySDC/core --force -T -d 2 -e +${SPHINX_APIDOC} -o docs/source/pySDC pySDC/implementations --force -T -d 2 -e +${SPHINX_APIDOC} -o docs/source/pySDC pySDC/helpers --force -T -d 2 -e #rm docs/source/pySDC/pySDC.rst + +echo "Running : pip install sphinxemoji m2r2" +pip install sphinxemoji m2r2 --quiet +./docs/convert_markdown.py From 9cad0f0f5ff7374425e90e634ce2b5af39ad0355 Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Tue, 17 Jan 2023 21:44:52 +0100 Subject: [PATCH 15/21] TL: removed README.rst (now as markdown) --- README.rst | 98 ------------------------------------------------------ 1 file changed, 98 deletions(-) delete mode 100644 README.rst diff --git a/README.rst b/README.rst deleted file mode 100644 index 0a83a53153..0000000000 --- a/README.rst +++ /dev/null @@ -1,98 +0,0 @@ -|badge-ga| -|badge-ossf| -|badge-cc| -|zenodo| - -Welcome to pySDC! -================= - -The `pySDC` project is a Python implementation of the spectral deferred correction (SDC) approach and its flavors, -esp. the multilevel extension MLSDC and PFASST. It is intended for rapid prototyping and educational purposes. -New ideas like e.g. sweepers or predictors can be tested and first toy problems can be easily implemented. - - -Features --------- - -- Variants of SDC: explicit, implicit, IMEX, multi-implicit, Verlet, multi-level, diagonal, multi-step -- Variants of PFASST: virtual parallel or MPI-based parallel, classical of multigrid perspective -- 8 tutorials: from setting up a first collocation problem to SDC, PFASST and advanced topics -- Projects: many documented projects with defined and tested outcomes -- Many different examples, collocation types, data types already implemented -- Works with `FEniCS `_, `mpi4py-fft `_ and `PETSc `_ (through `petsc4py `_) -- Continuous integration via `GitHub Actions `_ and `Gitlab CI `_ -- Fully compatible with Python 3.7 - 3.10, runs at least on Ubuntu and MacOS - - -Getting started ---------------- - -The code is hosted on GitHub, see `https://github.com/Parallel-in-Time/pySDC `_, and PyPI, see `https://pypi.python.org/pypi/pySDC `_. -While using ``pip install pySDC`` will give you a core version of `pySDC` to work with, working with the developer version -is most often the better choice. We thus recommend to checkout the code from GitHub and install the dependencies e.g. by using a `conda `_ environment. -For this, `pySDC` ships with environment files which can be found in the folder ``etc/``. Use these as e.g. - -.. code-block:: bash - - conda env create --yes -f etc/environment-base.yml - -To check your installation, run - -.. code-block:: bash - - pytest pySDC/tests -m NAME - -where ``NAME`` corresponds to the environment you chose (``base`` in the example above). -You may need to update your ``PYTHONPATH`` by running - -.. code-block:: bash - - export PYTHONPATH=$PYTHONPATH:/path/to/pySDC/root/folder - -in particular if you want to run any of the playgrounds, projects or tutorials. -All ``import`` statements there assume that the `pySDC`'s base directory is part of ``PYTHONPATH``. - -For many examples, `LaTeX` is used for the plots, i.e. a decent installation of this is needed in order to run those examples. -When using `fenics` or `petsc4py`, a C++ compiler is required (although installation may go through at first). - -For more details on `pySDC`, check out `http://www.parallel-in-time.org/pySDC `_. - - -How to cite ------------ - -If you use pySDC or parts of it for your work, great! Let us know if we can help you with this. Also, we would greatly appreciate a citation of `this paper `_: - - Robert Speck, **Algorithm 997: pySDC - Prototyping Spectral Deferred Corrections**, - ACM Transactions on Mathematical Software (TOMS), Volume 45 Issue 3, August 2019, - `https://doi.org/10.1145/3310410 `_ - -The current software release can be cited using Zenodo: |zenodo| - -.. |zenodo| image:: https://zenodo.org/badge/26165004.svg - :target: https://zenodo.org/badge/latestdoi/26165004 - -Contributing ------------- - -`pySDC` code was originaly developped by Robert Speck (@pancetta), -and is now maintained and developed by a small community of scientists interested in SDC methods, -that dearly welcomes any contribution. -If you want to take part of this, please take the time to read our `Contribution Guidelines `_. - - -Acknowledgements ----------------- - -This project has received funding from the `European High-Performance Computing Joint Undertaking `_ (JU) under grant agreement No 955701 (`TIME-X `_). -The JU receives support from the European Union’s Horizon 2020 research and innovation programme and Belgium, France, Germany, and Switzerland. -This project also received funding from the `German Federal Ministry of Education and Research `_ (BMBF) grant 16HPC047. -The project also received help from the `Helmholtz Platform for Research Software Engineering - Preparatory Study (HiRSE_PS) `_. - - -.. |badge-ga| image:: https://github.com/Parallel-in-Time/pySDC/actions/workflows/ci_pipeline.yml/badge.svg?branch=master - :target: https://github.com/Parallel-in-Time/pySDC/actions/workflows/ci_pipeline.yml -.. |badge-ossf| image:: https://bestpractices.coreinfrastructure.org/projects/6909/badge - :target: https://bestpractices.coreinfrastructure.org/projects/6909 -.. |badge-cc| image:: https://codecov.io/gh/Parallel-in-Time/pySDC/branch/master/graph/badge.svg?token=hpP18dmtgS - :target: https://codecov.io/gh/Parallel-in-Time/pySDC From bf359c2bab21474c0fb90911f5c9cbfc46c2332c Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Wed, 18 Jan 2023 13:43:09 +0100 Subject: [PATCH 16/21] TL: added contrib section on documentation generation --- docs/contrib/02_continuous_integration.md | 24 +++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/docs/contrib/02_continuous_integration.md b/docs/contrib/02_continuous_integration.md index da7b62cb71..f194ba2932 100644 --- a/docs/contrib/02_continuous_integration.md +++ b/docs/contrib/02_continuous_integration.md @@ -1,7 +1,8 @@ # Continuous Integration in pySDC Any commit in `pySDC` are tested within by GitHub continuous integration (CI). You can see in in the [action panel](https://github.com/Parallel-in-Time/pySDC/actions) the tests for each branches. -Those tests can be divided in two main categories : code linting and code testing. +Those tests can be divided in two main categories : [code linting](#code-linting) and [code testing](#code-testing). +Finally, the CI also build artifacts that are used to generate the documentation website (see http://parallel-in-time.org/pySDC/), more details given in the [documentation generation](#documentation-generation) section. ## Code linting @@ -29,7 +30,7 @@ Some style rules that are automatically enforced : - lines should be not longer than 120 characters - arithmetic operators (`+`, `*`, ...) should be separated with variables by one empty space -# Code testing +## Code testing This is done using[ `pytest`](https://docs.pytest.org/en/7.2.x/), and runs all the tests written in the `pySDC/tests` folder. You can run those locally in the root folder of `pySDC` using : @@ -47,5 +48,24 @@ pytest -v pySDC/tests > pytest -v pySDC/tests/test_nodes.py # only test nodes generation > ``` +## Documentation generation + +To check the documentation generation, you can wait for all the CI tasks to download the `docs` artifacts, unzip it and open the `index.html` file there with you favorite browser. However, when you are working on documentation (of the project, of the code, etc ...), you can already build and check the website locally : + +```bash +# Run all tests, continuing even with errors +pytest --continue-on-collection-errors -v --durations=0 pySDC/tests +# Generate rst files for sphinx +./docs/update_apidocs.sh +# Generate html documentation +sphinx-build -b html docs/source docs/build/html +``` + +Then you can open `docs/build/html/index.html` using you favorite browser and check how your own documentation looks like on the website. + +> :bell: **Important** : running all the tests is necessary to generate graphs and images used by the website. +> But you can still generate the website without it : just all images for the tutorials, projects and playgrounds will be missing. +> This approach can be considered for local testing of your contribution when it does not concern parts containing images (_i.e_ project or code documentation). + :arrow_left: [Back to Pull Request Recommendation](./01_pull_requests.md) --- :arrow_right: [Next to Naming Conventions](./03_naming_conventions.md) \ No newline at end of file From 27be3a41453e5457c748b00c752257907f56c6cf Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Wed, 18 Jan 2023 16:38:30 +0100 Subject: [PATCH 17/21] TL: first step toward cross-reference links --- CONTRIBUTING.md | 2 +- docs/convert_markdown.py | 44 ++++++++++++++++++++++++++++++++++++++-- docs/source/conf.py | 2 +- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4775d2298d..84146809d9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,4 +12,4 @@ Additionally, a _few_ rules are set to enforce code readability, consistency and Others are specific conventions chosen for the pySDC library, that may follow Python standards (or not ...), detailed in the [naming conventions page](./docs/contrib/03_naming_conventions.md). Finally, while `pySDC` provides many base functionalities that implement classical flavors of SDC, it also allows problem-specific applications through Object-Oriented Programming (OOP) and the implementation of custom inherited classes. -This follows a specific OOP framework, for which more details are given [here](.(docs/contrib/../../docs/contrib/04_custom_implementations.md)). \ No newline at end of file +This follows a specific OOP framework, for which more details are given [here](./docs/contrib/04_custom_implementations.md). \ No newline at end of file diff --git a/docs/convert_markdown.py b/docs/convert_markdown.py index 126071674d..0c288c343c 100755 --- a/docs/convert_markdown.py +++ b/docs/convert_markdown.py @@ -9,6 +9,7 @@ import glob import json import m2r2 +import numpy as np mdFiles = [ 'README.md', @@ -19,14 +20,53 @@ docSources = 'docs/source' +counter = np.array(0) + with open('docs/emojis.json') as f: emojis = set(json.load(f).keys()) -def convert(md): - rst = m2r2.parse_from_file(md, parse_relative_links=True) +def wrappEmojis(rst): for emoji in emojis: rst = rst.replace(emoji, f'|{emoji}|') + return rst + +def addSectionRefs(rst, baseName): + sections = {} + lines = rst.splitlines() + # Search for sections in rst file + for i in range(len(lines)-2): + conds = [ + len(lines[i+1]) and lines[i+1][0] in ['=', '-', '^', '"'], + lines[i+2] == lines[i-1] == '', + len(lines[i]) == len(lines[i+1])] + if all(conds): + sections[i] = lines[i] + # Add unique references before each section + for i, title in sections.items(): + ref = '-'.join([elt for elt in title.lower().split(' ') if elt != '']) + for char in ['#', "'", '^', '°', '!']: + ref = ref.replace(char, '') + ref = f'{baseName}/{ref}' + lines[i] = f'.. _{ref}:\n\n'+lines[i] + # Returns all concatenated lines + return '\n'.join(lines) + +def completeRefLinks(rst, baseName): + i = 0 + while i != -1: + i = rst.find(':ref:`', i) + if i != -1: + iLink = rst.find('<', i) + rst = rst[:iLink+1]+f'{baseName}/'+rst[iLink+1:] + i += 6 + return rst + +def convert(md): baseName = os.path.splitext(md)[0] + rst = m2r2.parse_from_file(md, parse_relative_links=True) + rst = wrappEmojis(rst) + rst = addSectionRefs(rst, baseName) + rst = completeRefLinks(rst, baseName) with open(f'{docSources}/{baseName}.rst', 'w') as f: f.write(rst) print(f'Converted {md} to {docSources}/{baseName}.rst') diff --git a/docs/source/conf.py b/docs/source/conf.py index e9b39f07e1..b79855bc70 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -107,7 +107,7 @@ # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # -# add_module_names = True +add_module_names = False # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. From e836332f8fd6845b93495d075ac5eaba7d443853 Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Wed, 18 Jan 2023 18:44:42 +0100 Subject: [PATCH 18/21] TL: CHANGELOG as link in README, fixed refs --- CONTRIBUTING.md | 19 ++++++++-------- README.md | 6 +++-- docs/contrib/02_continuous_integration.md | 10 ++++++--- docs/contrib/03_naming_conventions.md | 1 + docs/contrib/04_custom_implementations.md | 1 + docs/convert_markdown.py | 15 +++++++++---- docs/source/conf.py | 1 + docs/source/index.rst | 22 +++++++++---------- .../sweeper_classes/Runge_Kutta.py | 22 ++++++++++--------- 9 files changed, 57 insertions(+), 40 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 84146809d9..738a4bab09 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,15 +1,16 @@ # How to contribute to pySDC -1. [Pull Requests Recommendations](./docs/contrib/01_pull_requests.md) -2. [Continuous Integration](./docs/contrib/02_continuous_integration.md) -3. [Naming Conventions](./docs/contrib/03_naming_conventions.md) -4. [Custom Implementations](./docs/contrib/04_custom_implementations.md) - -Developments on the `pySDC` code use the classical approach of forks and pull requests from Github. -There is an [extended documentation](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/getting-started/about-collaborative-development-models) on this aspect (that you can skip if you are already used to it). In addition, some recommendations for pull requests are given [here](./docs/contrib/01_pull_requests.md). +Developments on the `pySDC` code use the classical approach of forks and pull requests. +You can look at [extended GitHub documentation](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/getting-started/about-collaborative-development-models) for more details (skip this if you are already used to it). Furthermore, branches on `pySDC` follow a pre-defined structure. To contribute to any of them, please look at the [pull request recommendations](./docs/contrib/01_pull_requests.md). Additionally, a _few_ rules are set to enforce code readability, consistency and reliability. Some of them are automatically tested with each commit, and summarized in the page on [continuous integration (CI)](./docs/contrib/02_continuous_integration.md). -Others are specific conventions chosen for the pySDC library, that may follow Python standards (or not ...), detailed in the [naming conventions page](./docs/contrib/03_naming_conventions.md). +Others are specific conventions chosen for the pySDC library, that may follow Python standards (or not ...), detailed in the [naming conventions](./docs/contrib/03_naming_conventions.md) page. Finally, while `pySDC` provides many base functionalities that implement classical flavors of SDC, it also allows problem-specific applications through Object-Oriented Programming (OOP) and the implementation of custom inherited classes. -This follows a specific OOP framework, for which more details are given [here](./docs/contrib/04_custom_implementations.md). \ No newline at end of file +This follows a specific OOP framework, you can look at the page on [custom implementations](./docs/contrib/04_custom_implementations.md) for more details. + +1. [GitHub Forks and Pull Requests](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/getting-started/about-collaborative-development-models) +2. [Pull Requests Recommendations](./docs/contrib/01_pull_requests.md) +3. [Continuous Integration](./docs/contrib/02_continuous_integration.md) +4. [Naming Conventions](./docs/contrib/03_naming_conventions.md) +5. [Custom Implementations](./docs/contrib/04_custom_implementations.md) \ No newline at end of file diff --git a/README.md b/README.md index eeb099f4af..d67ae0372b 100644 --- a/README.md +++ b/README.md @@ -89,8 +89,10 @@ The current software release can be cited using Zenodo: ## Contributing `pySDC` code was originally developed by [Robert Speck (@pancetta)](https://github.com/pancetta), -and is now maintained and developed by a small community of scientists interested in SDC methods, that dearly welcomes any contribution. -If you want to take part of this, please take the time to read our [Contribution Guidelines](./CONTRIBUTING.md) +and is now maintained and developed by a small community of scientists interested in SDC methods. +Checkout the [Changelog](./CHANGELOG.md) to see pySDC's evolution since 2016. + +Any contribution is dearly welcome ! If you want to take part of this, please take the time to read our [Contribution Guidelines](./CONTRIBUTING.md) (and don't forget to take a pick at our nice [Code of Conduct](./CODE_OF_CONDUCT.md) :wink:). diff --git a/docs/contrib/02_continuous_integration.md b/docs/contrib/02_continuous_integration.md index f194ba2932..245621c23a 100644 --- a/docs/contrib/02_continuous_integration.md +++ b/docs/contrib/02_continuous_integration.md @@ -6,7 +6,7 @@ Finally, the CI also build artifacts that are used to generate the documentation ## Code linting -Code style linting is performed using [`black`](https://black.readthedocs.io/en/stable/) and [`flakeheaven`](https://flakeheaven.readthedocs.io/en/latest/) for code syntax checking. In particular, `black` is used to check compliance with (most of) [PEP-8 guidelines](https://peps.python.org/pep-0008/). +Code style linting is performed using [black](https://black.readthedocs.io/en/stable/) and [flakeheaven](https://flakeheaven.readthedocs.io/en/latest/) for code syntax checking. In particular, `black` is used to check compliance with (most of) [PEP-8 guidelines](https://peps.python.org/pep-0008/). Those tests are conducted for each commit (even for forks), but you can also run it locally in the root folder of `pySDC` before pushing any commit : @@ -32,7 +32,7 @@ Some style rules that are automatically enforced : ## Code testing -This is done using[ `pytest`](https://docs.pytest.org/en/7.2.x/), and runs all the tests written in the `pySDC/tests` folder. You can run those locally in the root folder of `pySDC` using : +This is done using [pytest](https://docs.pytest.org/en/7.2.x/), and runs all the tests written in the `pySDC/tests` folder. You can run those locally in the root folder of `pySDC` using : ```bash # Install required packages (works also with conda/mamba) @@ -50,7 +50,10 @@ pytest -v pySDC/tests ## Documentation generation -To check the documentation generation, you can wait for all the CI tasks to download the `docs` artifacts, unzip it and open the `index.html` file there with you favorite browser. However, when you are working on documentation (of the project, of the code, etc ...), you can already build and check the website locally : +Documentation is built using [sphinx](https://www.sphinx-doc.org/en/master/). +To check its generation, you can wait for all the CI tasks to download the `docs` artifacts, unzip it and open the `index.html` file there with you favorite browser. + +However, when you are working on documentation (of the project, of the code, etc ...), you can already build and check the website locally : ```bash # Run all tests, continuing even with errors @@ -68,4 +71,5 @@ Then you can open `docs/build/html/index.html` using you favorite browser and ch > This approach can be considered for local testing of your contribution when it does not concern parts containing images (_i.e_ project or code documentation). :arrow_left: [Back to Pull Request Recommendation](./01_pull_requests.md) --- +:arrow_up: [Contributing Summary](./../../CONTRIBUTING.md) --- :arrow_right: [Next to Naming Conventions](./03_naming_conventions.md) \ No newline at end of file diff --git a/docs/contrib/03_naming_conventions.md b/docs/contrib/03_naming_conventions.md index 711852c182..d2d06c4e2a 100644 --- a/docs/contrib/03_naming_conventions.md +++ b/docs/contrib/03_naming_conventions.md @@ -140,4 +140,5 @@ class MySweeper(Sweeper): ``` :arrow_left: [Back to Continuous Integration](./02_continuous_integration.md) --- +:arrow_up: [Contributing Summary](./../../CONTRIBUTING.md) --- :arrow_right: [Next to Custom Implementations](./04_custom_implementations.md) \ No newline at end of file diff --git a/docs/contrib/04_custom_implementations.md b/docs/contrib/04_custom_implementations.md index 414cefa413..bd9e997f04 100644 --- a/docs/contrib/04_custom_implementations.md +++ b/docs/contrib/04_custom_implementations.md @@ -3,4 +3,5 @@ ... in construction ... :arrow_left: [Back to Naming Conventions](./03_naming_conventions.md) --- +:arrow_up: [Contributing Summary](./../../CONTRIBUTING.md) --- :arrow_right: [Next to a cute picture of cat](https://www.vecteezy.com/photo/2098203-silver-tabby-cat-sitting-on-green-background) \ No newline at end of file diff --git a/docs/convert_markdown.py b/docs/convert_markdown.py index 0c288c343c..0beb5243f4 100755 --- a/docs/convert_markdown.py +++ b/docs/convert_markdown.py @@ -61,22 +61,29 @@ def completeRefLinks(rst, baseName): i += 6 return rst -def convert(md): +def addOrphanTag(rst): + return '\n:orphan:\n'+rst + +def convert(md, orphan=False, sectionRefs=True): baseName = os.path.splitext(md)[0] rst = m2r2.parse_from_file(md, parse_relative_links=True) rst = wrappEmojis(rst) - rst = addSectionRefs(rst, baseName) + if sectionRefs: + rst = addSectionRefs(rst, baseName) rst = completeRefLinks(rst, baseName) + if orphan: + rst = addOrphanTag(rst) with open(f'{docSources}/{baseName}.rst', 'w') as f: f.write(rst) print(f'Converted {md} to {docSources}/{baseName}.rst') for md in mdFiles: if os.path.isfile(md): - convert(md) + isNotMain = (md != 'README.md') + convert(md, orphan=isNotMain, sectionRefs=isNotMain) elif os.path.isdir(md): os.makedirs(f'{docSources}/{md}', exist_ok=True) for f in glob.glob(f'{md}/*.md'): - convert(f) + convert(f, orphan=True) else: raise ValueError('{md} is not a md file or a folder') diff --git a/docs/source/conf.py b/docs/source/conf.py index b79855bc70..f028c68219 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -108,6 +108,7 @@ # unit titles (such as .. function::). # add_module_names = False +toc_object_entries_show_parents = 'hide' # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. diff --git a/docs/source/index.rst b/docs/source/index.rst index 6568b772a5..3d56f5cb83 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1,6 +1,13 @@ + .. include:: README.rst -.. include:: CHANGELOG.rst +Tests +----- + +.. include:: ../../pySDC/tests/README.rst + +User Guide +========== Tutorial -------- @@ -44,12 +51,6 @@ Projects projects/Resilience.rst -Tests ------ - -.. include:: ../../pySDC/tests/README.rst - - API documentation ----------------- @@ -63,11 +64,8 @@ API documentation pySDC/helpers.rst -Indices and tables ------------------- +Indices and tables : * :ref:`genindex` * :ref:`modindex` -* :ref:`search` - - +* :ref:`search` \ No newline at end of file diff --git a/pySDC/implementations/sweeper_classes/Runge_Kutta.py b/pySDC/implementations/sweeper_classes/Runge_Kutta.py index 2d22a9b4e2..4a53f390e3 100644 --- a/pySDC/implementations/sweeper_classes/Runge_Kutta.py +++ b/pySDC/implementations/sweeper_classes/Runge_Kutta.py @@ -135,10 +135,12 @@ class RungeKutta(generic_implicit): method, which does not require us to solve a system of equations to compute the stages. Please be aware that all fundamental parameters of the Sweeper are ignored. These include + - num_nodes - collocation_class - initial_guess - QI + All of these variables are either determined by the RK rule, or are not part of an RK scheme. Attribues: @@ -245,9 +247,9 @@ def __init__(self, params): class CrankNicholson(RungeKutta): - ''' + """ Implicit Runge-Kutta method of second order - ''' + """ def __init__(self, params): nodes = np.array([0, 1]) @@ -260,9 +262,9 @@ def __init__(self, params): class MidpointMethod(RungeKutta): - ''' + """ Runge-Kutta method of second order - ''' + """ def __init__(self, params): implicit = params.get('implicit', False) @@ -281,9 +283,9 @@ def __init__(self, params): class RK4(RungeKutta): - ''' + """ Explicit Runge-Kutta of fourth order: Everybodies darling. - ''' + """ def __init__(self, params): nodes = np.array([0, 0.5, 0.5, 1]) @@ -297,9 +299,9 @@ def __init__(self, params): class Heun_Euler(RungeKutta): - ''' + """ Second order explicit embedded Runge-Kutta - ''' + """ def __init__(self, params): nodes = np.array([0, 1]) @@ -311,9 +313,9 @@ def __init__(self, params): class Cash_Karp(RungeKutta): - ''' + """ Fifth order explicit embedded Runge-Kutta - ''' + """ def __init__(self, params): nodes = np.array([0, 0.2, 0.3, 0.6, 1.0, 7.0 / 8.0]) From b26c7d0a041ff3e880c3c21034a0c0a7a7927a46 Mon Sep 17 00:00:00 2001 From: Thibaut Lunet Date: Wed, 18 Jan 2023 19:24:13 +0100 Subject: [PATCH 19/21] TL: added image support for documentation website --- README.md | 6 ++++++ docs/convert_markdown.py | 15 +++++++++++++++ docs/img/BMBF_gefoerdert_2017_en.jpg | Bin 0 -> 57235 bytes docs/img/EuroHPC.jpg | Bin 0 -> 38347 bytes docs/img/LogoTime-X.png | Bin 0 -> 29864 bytes 5 files changed, 21 insertions(+) create mode 100644 docs/img/BMBF_gefoerdert_2017_en.jpg create mode 100644 docs/img/EuroHPC.jpg create mode 100644 docs/img/LogoTime-X.png diff --git a/README.md b/README.md index d67ae0372b..e7fa2ef81f 100644 --- a/README.md +++ b/README.md @@ -108,3 +108,9 @@ Education and Research](https://www.bmbf.de/bmbf/en/home/home_node.html) (BMBF) grant 16HPC047. The project also received help from the [Helmholtz Platform for Research Software Engineering - Preparatory Study (HiRSE_PS)](https://www.helmholtz-hirse.de/). + +

+          +          + +

\ No newline at end of file diff --git a/docs/convert_markdown.py b/docs/convert_markdown.py index 0beb5243f4..1bcdf67d8d 100755 --- a/docs/convert_markdown.py +++ b/docs/convert_markdown.py @@ -9,6 +9,7 @@ import glob import json import m2r2 +import shutil import numpy as np mdFiles = [ @@ -20,6 +21,10 @@ docSources = 'docs/source' +# Move already images in the future build directory +os.makedirs('docs/build/html/_images/', exist_ok=True) +shutil.copytree('docs/img', 'docs/build/html/_images/docs/img', dirs_exist_ok=True) + counter = np.array(0) with open('docs/emojis.json') as f: @@ -64,6 +69,15 @@ def completeRefLinks(rst, baseName): def addOrphanTag(rst): return '\n:orphan:\n'+rst +def setImgPath(rst): + i = 0 + while i != -1: + i = rst.find(' Date: Wed, 18 Jan 2023 20:08:21 +0100 Subject: [PATCH 21/21] TL: allowed link to main page for documentation --- CHANGELOG.md | 4 ++++ CODE_OF_CONDUCT.md | 4 ++++ CONTRIBUTING.md | 4 +++- docs/convert_markdown.py | 4 ++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70ba4fe970..869e6cbdb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +:arrow_left: [Back to main page](./README.md) + - October 7, 2022: Version 5 comes with many changes, both visible and invisible ones. Some of those break the existing API, but if you are using tests, you should be fine. Major changes include: @@ -224,3 +226,5 @@ expected - Reworked many of the internal structures for consistency and simplicity + +:arrow_left: [Back to main page](./README.md) \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 6e2d801ca9..42afd279b1 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,5 +1,7 @@ # Contributor Covenant Code of Conduct +:arrow_left: [Back to main page](./README.md) + ## Our Pledge We as members, contributors, and leaders pledge to make participation in our @@ -126,3 +128,5 @@ enforcement ladder](https://github.com/mozilla/diversity). For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations. + +:arrow_left: [Back to main page](./README.md) \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 738a4bab09..68a79a8b73 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,4 +13,6 @@ This follows a specific OOP framework, you can look at the page on [custom imple 2. [Pull Requests Recommendations](./docs/contrib/01_pull_requests.md) 3. [Continuous Integration](./docs/contrib/02_continuous_integration.md) 4. [Naming Conventions](./docs/contrib/03_naming_conventions.md) -5. [Custom Implementations](./docs/contrib/04_custom_implementations.md) \ No newline at end of file +5. [Custom Implementations](./docs/contrib/04_custom_implementations.md) + +:arrow_left: [Back to main page](./README.md) \ No newline at end of file diff --git a/docs/convert_markdown.py b/docs/convert_markdown.py index 1bcdf67d8d..b12e613f5b 100755 --- a/docs/convert_markdown.py +++ b/docs/convert_markdown.py @@ -78,6 +78,9 @@ def setImgPath(rst): i += 16 return rst +def linkReadmeToIndex(rst): + return rst.replace('<./README>', '<./index>') + def convert(md, orphan=False, sectionRefs=True): baseName = os.path.splitext(md)[0] rst = m2r2.parse_from_file(md, parse_relative_links=True) @@ -88,6 +91,7 @@ def convert(md, orphan=False, sectionRefs=True): if orphan: rst = addOrphanTag(rst) rst = setImgPath(rst) + rst = linkReadmeToIndex(rst) with open(f'{docSources}/{baseName}.rst', 'w') as f: f.write(rst) print(f'Converted {md} to {docSources}/{baseName}.rst')