irongit

move everything to .dotfiles, prefix u uploads dotfiles

huncholanehuncholaneauthored
commit 94c019f189dfff87c3e6c12563ccd6877295fb97Browse files

1498 files changed, +143218 -0

This diff is large and was cut short. Clone the repository to see all of it.
+20-0.oh-my-zsh/.devcontainer/devcontainer.json
@@ -0,0 +1,20 @@
1+{
2+ "image": "mcr.microsoft.com/devcontainers/base:noble",
3+ "features": {
4+ "ghcr.io/devcontainers/features/common-utils": {
5+ "installZsh": true,
6+ "configureZshAsDefaultShell": true,
7+ "username": "vscode",
8+ "userUid": 1000,
9+ "userGid": 1000
10+ }
11+ },
12+ "postCreateCommand": "dir=/workspaces/ohmyzsh; rm -rf $HOME/.oh-my-zsh && ln -s $dir $HOME/.oh-my-zsh && cp $dir/templates/minimal.zshrc $HOME/.zshrc && chgrp -R 1000 $dir && chmod g-w,o-w $dir",
13+ "customizations": {
14+ "codespaces": {
15+ "openFiles": [
16+ "README.md"
17+ ]
18+ }
19+ }
20+}
+15-0.oh-my-zsh/.editorconfig
@@ -0,0 +1,15 @@
1+root = true
2+
3+[*]
4+end_of_line = lf
5+insert_final_newline = true
6+charset = utf-8
7+indent_size = 2
8+indent_style = space
9+
10+[*.py]
11+indent_size = 4
12+
13+[devcontainer.json]
14+indent_size = 4
15+indent_style = tab
+19-0.oh-my-zsh/.github/CODEOWNERS
@@ -0,0 +1,19 @@
1+# Plugin owners
2+plugins/archlinux/ @ratijas
3+plugins/dbt/ @msempere
4+plugins/eza/ @pepoluan
5+plugins/genpass/ @atoponce
6+plugins/git-lfs/ @hellovietduc
7+plugins/gitfast/ @felipec
8+plugins/kube-ps1/ @mcornella
9+plugins/kubectl/ @mcornella
10+plugins/kubectx/ @mcornella
11+plugins/opentofu/ @mcornella
12+plugins/react-native @esthor
13+plugins/sdk/ @rgoldberg
14+plugins/shell-proxy/ @septs
15+plugins/starship/ @axieax
16+plugins/terraform/ @mcornella
17+plugins/universalarchive/ @Konfekt
18+plugins/wp-cli/ @joshmedeski
19+plugins/zoxide/ @ajeetdsouza
+2-0.oh-my-zsh/.github/FUNDING.yml
@@ -0,0 +1,2 @@
1+github: [ohmyzsh, robbyrussell, mcornella, larson-carter, carlosala]
2+open_collective: ohmyzsh
+68-0.oh-my-zsh/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,68 @@
1+name: Report a bug
2+description: Report a bug that isn't caused by Oh My Zsh. If unsure, use this form
3+body:
4+ - type: markdown
5+ attributes:
6+ value: |
7+ ## Self Check
8+ - Look for similar errors in existing [GitHub Issues](https://github.com/ohmyzsh/ohmyzsh/issues?q=is%3Aissue) (open or closed).
9+ - Try reaching out on the [Discord server](https://discord.gg/ohmyzsh) for help.
10+ - type: textarea
11+ validations:
12+ required: true
13+ attributes:
14+ label: Describe the bug
15+ description: A clear description of what the bug is.
16+ - type: textarea
17+ validations:
18+ required: true
19+ attributes:
20+ label: Steps to reproduce
21+ description: |
22+ Steps to reproduce the problem.
23+ placeholder: |
24+ For example:
25+ 1. Enable plugin '...'
26+ 2. Run command '...' or try to complete command '...'
27+ 3. See error
28+ - type: textarea
29+ validations:
30+ required: true
31+ attributes:
32+ label: Expected behavior
33+ description: A brief description of what should happen.
34+ - type: textarea
35+ attributes:
36+ label: Screenshots and recordings
37+ description: |
38+ If applicable, add screenshots to help explain your problem. You can also record an asciinema session: https://asciinema.org/
39+ - type: input
40+ validations:
41+ required: true
42+ attributes:
43+ label: OS / Linux distribution
44+ placeholder: Windows 10, Ubuntu 20.04, Arch Linux, macOS 10.15...
45+ - type: input
46+ validations:
47+ required: true
48+ attributes:
49+ label: Zsh version
50+ description: Run `echo $ZSH_VERSION` to check.
51+ placeholder: "5.6"
52+ - type: input
53+ validations:
54+ required: true
55+ attributes:
56+ label: Terminal emulator
57+ placeholder: iTerm2, GNOME Terminal, Terminal.app...
58+ - type: dropdown
59+ attributes:
60+ label: If using WSL on Windows, which version of WSL
61+ description: Run `wsl -l -v` to check.
62+ options:
63+ - WSL1
64+ - WSL2
65+ - type: textarea
66+ attributes:
67+ label: Additional context
68+ description: Add any other context about the problem here. This can be themes, plugins, custom settings...
+77-0.oh-my-zsh/.github/ISSUE_TEMPLATE/bug_report_omz.yml
@@ -0,0 +1,77 @@
1+name: Report a bug in Oh My Zsh
2+description: Create a report to help us improve Oh My Zsh
3+labels: ['Bug']
4+body:
5+ - type: markdown
6+ attributes:
7+ value: |
8+ ## Self Check
9+ - **Make sure this bug only happens with Oh My Zsh enabled**.
10+ - Look for similar errors in existing [GitHub Issues](https://github.com/ohmyzsh/ohmyzsh/issues?q=is%3Aissue) (open or closed).
11+ - Try reaching out on the [Discord server](https://discord.gg/ohmyzsh) for help.
12+ - type: textarea
13+ validations:
14+ required: true
15+ attributes:
16+ label: Describe the bug
17+ description: A clear description of what the bug is.
18+ - type: textarea
19+ validations:
20+ required: true
21+ attributes:
22+ label: Steps to reproduce
23+ description: |
24+ Steps to reproduce the problem.
25+ placeholder: |
26+ For example:
27+ 1. Enable plugin '...'
28+ 2. Run command '...' or try to complete command '...'
29+ 3. See error
30+ - type: textarea
31+ validations:
32+ required: true
33+ attributes:
34+ label: Expected behavior
35+ description: A brief description of what should happen.
36+ - type: textarea
37+ attributes:
38+ label: Screenshots and recordings
39+ description: |
40+ If applicable, add screenshots to help explain your problem. You can also record an asciinema session: https://asciinema.org/
41+ - type: input
42+ validations:
43+ required: true
44+ attributes:
45+ label: OS / Linux distribution
46+ placeholder: Windows 10, Ubuntu 20.04, Arch Linux, macOS 10.15...
47+ - type: input
48+ validations:
49+ required: true
50+ attributes:
51+ label: Zsh version
52+ description: Run `echo $ZSH_VERSION` to check.
53+ placeholder: "5.6"
54+ - type: input
55+ validations:
56+ required: true
57+ attributes:
58+ label: Oh My Zsh version
59+ description: Run `omz version` to check.
60+ placeholder: master (bf303965)
61+ - type: input
62+ validations:
63+ required: true
64+ attributes:
65+ label: Terminal emulator
66+ placeholder: iTerm2, GNOME Terminal, Terminal.app...
67+ - type: dropdown
68+ attributes:
69+ label: If using WSL on Windows, which version of WSL
70+ description: Run `wsl -l -v` to check.
71+ options:
72+ - WSL1
73+ - WSL2
74+ - type: textarea
75+ attributes:
76+ label: Additional context
77+ description: Add any other context about the problem here. This can be themes, plugins, custom settings...
+8-0.oh-my-zsh/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,8 @@
1+blank_issues_enabled: true
2+contact_links:
3+ - name: Support
4+ url: https://github.com/ohmyzsh/ohmyzsh/discussions
5+ about: Ask the community for support
6+ - name: Get help on Discord
7+ url: https://discord.gg/ohmyzsh
8+ about: Have a quick question? Join the Discord server and ask on the appropriate channel.
+37-0.oh-my-zsh/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -0,0 +1,37 @@
1+name: Feature request
2+description: Suggest a feature for Oh My Zsh
3+labels: ["Feature"]
4+body:
5+ - type: markdown
6+ attributes:
7+ value: |
8+ ## Self Check
9+ - Look for similar features in existing [GitHub Issues](https://github.com/ohmyzsh/ohmyzsh/issues?q=is%3Aissue) (open or closed).
10+ - type: input
11+ attributes:
12+ label: If the feature request is for a plugin or theme, specify it here.
13+ description: The name of the plugin or theme that you would like us to improve.
14+ placeholder: e.g. Git plugin, Agnoster theme
15+ - type: textarea
16+ attributes:
17+ label: If the feature solves a problem you have, specify it here.
18+ description: A description of what the problem is.
19+ placeholder: Ex. I'm always frustrated when...
20+ - type: textarea
21+ attributes:
22+ label: Describe the proposed feature.
23+ description: A description of what you want to happen. Be as specific as possible.
24+ validations:
25+ required: true
26+ - type: textarea
27+ attributes:
28+ label: Describe alternatives you've considered
29+ description: A description of any alternative solutions or features you've considered. This can also include other plugins or themes.
30+ - type: textarea
31+ attributes:
32+ label: Additional context
33+ description: Add any other context, screenshots or Discord conversations about the feature request here. Also if you have any PRs related to this issue that are already open that you would like us to look at.
34+ - type: textarea
35+ attributes:
36+ label: Related Issues
37+ description: Is there any open or closed issues that is related to this feature request? If so please link them below!
+20-0.oh-my-zsh/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,20 @@
1+## Standards checklist:
2+
3+<!-- Fill with an x the ones that apply. Example: [x] -->
4+
5+- [ ] The PR title is descriptive.
6+- [ ] The PR doesn't replicate another PR which is already open.
7+- [ ] I have read the contribution guide and followed all the instructions.
8+- [ ] The code follows the code style guide detailed in the wiki.
9+- [ ] The code is mine or it's from somewhere with an MIT-compatible license.
10+- [ ] The code is efficient, to the best of my ability, and does not waste computer resources.
11+- [ ] The code is stable and I have tested it myself, to the best of my abilities.
12+- [ ] If the code introduces new aliases, I provide a valid use case for all plugin users down below.
13+
14+## Changes:
15+
16+- [...]
17+
18+## Other comments:
19+
20+...
+14-0.oh-my-zsh/.github/dependabot.yml
@@ -0,0 +1,14 @@
1+version: 2
2+updates:
3+ - package-ecosystem: github-actions
4+ directory: /
5+ schedule:
6+ interval: "weekly"
7+ day: "sunday"
8+ labels: []
9+ - package-ecosystem: "pip"
10+ directory: "/.github/workflows/dependencies"
11+ schedule:
12+ interval: "weekly"
13+ day: "sunday"
14+ labels: []
+48-0.oh-my-zsh/.github/dependencies.yml
@@ -0,0 +1,48 @@
1+dependencies:
2+ plugins/gitfast:
3+ repo: felipec/git-completion
4+ branch: master
5+ version: tag:v2.2
6+ postcopy: |
7+ set -e
8+ rm -rf git-completion.plugin.zsh Makefile t tools
9+ mv README.adoc MANUAL.adoc
10+ mv -f src/* .
11+ rmdir src
12+ plugins/gradle:
13+ repo: gradle/gradle-completion
14+ branch: master
15+ version: 25da917cf5a88f3e58f05be3868a7b2748c8afe6
16+ precopy: |
17+ set -e
18+ find . ! -name _gradle ! -name LICENSE -delete
19+ plugins/history-substring-search:
20+ repo: zsh-users/zsh-history-substring-search
21+ branch: master
22+ version: 87ce96b1862928d84b1afe7c173316614b30e301
23+ precopy: |
24+ set -e
25+ rm -f zsh-history-substring-search.plugin.zsh
26+ test -e zsh-history-substring-search.zsh && mv zsh-history-substring-search.zsh history-substring-search.zsh
27+ postcopy: |
28+ set -e
29+ test -e dependencies/OMZ-README.md && cat dependencies/OMZ-README.md >> README.md
30+ plugins/wd:
31+ repo: mfaerevaag/wd
32+ branch: master
33+ version: tag:v0.10.0
34+ precopy: |
35+ set -e
36+ rm -r test
37+ rm install.sh tty.gif wd.1
38+ plugins/z:
39+ branch: master
40+ repo: agkozak/zsh-z
41+ version: dd94ef04acc41748ba171eb219971cb455e0040b
42+ precopy: |
43+ set -e
44+ test -e README.md && mv -f README.md MANUAL.md
45+ postcopy: |
46+ set -e
47+ test -e _zshz && mv -f _zshz _z
48+ test -e zsh-z.plugin.zsh && mv -f zsh-z.plugin.zsh z.plugin.zsh
+36-0.oh-my-zsh/.github/workflows/dependencies.yml
@@ -0,0 +1,36 @@
1+name: Update dependencies
2+on:
3+ workflow_dispatch: {}
4+ schedule:
5+ - cron: "0 6 * * 0"
6+
7+jobs:
8+ check:
9+ name: Check for updates
10+ runs-on: ubuntu-latest
11+ if: github.repository == 'ohmyzsh/ohmyzsh'
12+ steps:
13+ - name: Checkout
14+ uses: actions/checkout@v4
15+ with:
16+ fetch-depth: 0
17+ - name: Authenticate as @ohmyzsh
18+ id: generate_token
19+ uses: ohmyzsh/github-app-token@v2
20+ with:
21+ app_id: ${{ secrets.OHMYZSH_APP_ID }}
22+ private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
23+ - name: Setup Python
24+ uses: actions/setup-python@v5
25+ with:
26+ python-version: "3.12"
27+ cache: "pip"
28+ - name: Process dependencies
29+ env:
30+ GH_TOKEN: ${{ steps.generate_token.outputs.token }}
31+ GIT_APP_NAME: ohmyzsh[bot]
32+ GIT_APP_EMAIL: 54982679+ohmyzsh[bot]@users.noreply.github.com
33+ TMP_DIR: ${{ runner.temp }}
34+ run: |
35+ pip install -r .github/workflows/dependencies/requirements.txt
36+ python3 .github/workflows/dependencies/updater.py
+1-0.oh-my-zsh/.github/workflows/dependencies/.gitignore
@@ -0,0 +1 @@
1+.venv
+7-0.oh-my-zsh/.github/workflows/dependencies/requirements.txt
@@ -0,0 +1,7 @@
1+certifi==2025.4.26
2+charset-normalizer==3.4.1
3+idna==3.10
4+PyYAML==6.0.2
5+requests==2.32.3
6+semver==3.0.4
7+urllib3==2.4.0
+598-0.oh-my-zsh/.github/workflows/dependencies/updater.py
@@ -0,0 +1,598 @@
1+import json
2+import os
3+import re
4+import shutil
5+import subprocess
6+import sys
7+import timeit
8+from copy import deepcopy
9+from typing import Literal, NotRequired, Optional, TypedDict
10+
11+import requests
12+import yaml
13+from semver import Version
14+
15+# Get TMP_DIR variable from environment
16+TMP_DIR = os.path.join(os.environ.get("TMP_DIR", "/tmp"), "ohmyzsh")
17+# Relative path to dependencies.yml file
18+DEPS_YAML_FILE = ".github/dependencies.yml"
19+# Dry run flag
20+DRY_RUN = os.environ.get("DRY_RUN", "0") == "1"
21+
22+# utils for tag comparison
23+BASEVERSION = re.compile(
24+ r"""[vV]?
25+ (?P<major>(0|[1-9])\d*)
26+ (\.
27+ (?P<minor>(0|[1-9])\d*)
28+ (\.
29+ (?P<patch>(0|[1-9])\d*)
30+ )?
31+ )?
32+ """,
33+ re.VERBOSE,
34+)
35+
36+
37+def coerce(version: str) -> Optional[Version]:
38+ match = BASEVERSION.search(version)
39+ if not match:
40+ return None
41+
42+ # BASEVERSION looks for `MAJOR.minor.patch` in the string given
43+ # it fills with None if any of them is missing (for example `2.1`)
44+ ver = {
45+ key: 0 if value is None else value for key, value in match.groupdict().items()
46+ }
47+ # Version takes `major`, `minor`, `patch` arguments
48+ ver = Version(**ver) # pyright: ignore[reportArgumentType]
49+ return ver
50+
51+
52+class CodeTimer:
53+ def __init__(self, name=None):
54+ self.name = " '" + name + "'" if name else ""
55+
56+ def __enter__(self):
57+ self.start = timeit.default_timer()
58+
59+ def __exit__(self, exc_type, exc_value, traceback):
60+ self.took = (timeit.default_timer() - self.start) * 1000.0
61+ print("Code block" + self.name + " took: " + str(self.took) + " ms")
62+
63+
64+### YAML representation
65+def str_presenter(dumper, data):
66+ """
67+ Configures yaml for dumping multiline strings
68+ Ref: https://stackoverflow.com/a/33300001
69+ """
70+ if len(data.splitlines()) > 1: # check for multiline string
71+ return dumper.represent_scalar("tag:yaml.org,2002:str", data, style="|")
72+ return dumper.represent_scalar("tag:yaml.org,2002:str", data)
73+
74+
75+yaml.add_representer(str, str_presenter)
76+yaml.representer.SafeRepresenter.add_representer(str, str_presenter)
77+
78+
79+# Types
80+class DependencyDict(TypedDict):
81+ repo: str
82+ branch: str
83+ version: str
84+ precopy: NotRequired[str]
85+ postcopy: NotRequired[str]
86+
87+
88+class DependencyYAML(TypedDict):
89+ dependencies: dict[str, DependencyDict]
90+
91+
92+class UpdateStatusFalse(TypedDict):
93+ has_updates: Literal[False]
94+
95+
96+class UpdateStatusTrue(TypedDict):
97+ has_updates: Literal[True]
98+ version: str
99+ compare_url: str
100+ head_ref: str
101+ head_url: str
102+
103+
104+class CommandRunner:
105+ class Exception(Exception):
106+ def __init__(self, message, returncode, stage, stdout, stderr):
107+ super().__init__(message)
108+ self.returncode = returncode
109+ self.stage = stage
110+ self.stdout = stdout
111+ self.stderr = stderr
112+
113+ @staticmethod
114+ def run_or_fail(command: list[str], stage: str, *args, **kwargs):
115+ if DRY_RUN and command[0] == "gh":
116+ command.insert(0, "echo")
117+
118+ result = subprocess.run(command, *args, capture_output=True, **kwargs)
119+
120+ if result.returncode != 0:
121+ raise CommandRunner.Exception(
122+ f"{stage} command failed with exit code {result.returncode}",
123+ returncode=result.returncode,
124+ stage=stage,
125+ stdout=result.stdout.decode("utf-8"),
126+ stderr=result.stderr.decode("utf-8"),
127+ )
128+
129+ return result
130+
131+
132+class DependencyStore:
133+ store: DependencyYAML = {"dependencies": {}}
134+
135+ @staticmethod
136+ def set(data: DependencyYAML):
137+ DependencyStore.store = data
138+
139+ @staticmethod
140+ def update_dependency_version(path: str, version: str) -> DependencyYAML:
141+ with CodeTimer(f"store deepcopy: {path}"):
142+ store_copy = deepcopy(DependencyStore.store)
143+
144+ dependency = store_copy["dependencies"].get(path)
145+ if dependency is None:
146+ raise ValueError(f"Dependency {path} {version} not found")
147+ dependency["version"] = version
148+ store_copy["dependencies"][path] = dependency
149+
150+ return store_copy
151+
152+ @staticmethod
153+ def write_store(file: str, data: DependencyYAML):
154+ with open(file, "w") as yaml_file:
155+ yaml.safe_dump(data, yaml_file, sort_keys=False)
156+
157+
158+class Dependency:
159+ def __init__(self, path: str, values: DependencyDict):
160+ self.path = path
161+ self.values = values
162+
163+ self.name: str = ""
164+ self.desc: str = ""
165+ self.kind: str = ""
166+
167+ match path.split("/"):
168+ case ["plugins", name]:
169+ self.name = name
170+ self.kind = "plugin"
171+ self.desc = f"{name} plugin"
172+ case ["themes", name]:
173+ self.name = name.replace(".zsh-theme", "")
174+ self.kind = "theme"
175+ self.desc = f"{self.name} theme"
176+ case _:
177+ self.name = self.desc = path
178+
179+ def __str__(self):
180+ output: str = ""
181+ for key in DependencyDict.__dict__["__annotations__"].keys():
182+ if key not in self.values:
183+ output += f"{key}: None\n"
184+ continue
185+
186+ value = self.values[key]
187+ if "\n" not in value:
188+ output += f"{key}: {value}\n"
189+ else:
190+ output += f"{key}:\n "
191+ output += value.replace("\n", "\n ", value.count("\n") - 1)
192+ return output
193+
194+ def update_or_notify(self):
195+ # Print dependency settings
196+ print(f"Processing {self.desc}...", file=sys.stderr)
197+ print(self, file=sys.stderr)
198+
199+ # Check for updates
200+ repo = self.values["repo"]
201+ remote_branch = self.values["branch"]
202+ version = self.values["version"]
203+ is_tag = version.startswith("tag:")
204+
205+ try:
206+ with CodeTimer(f"update check: {repo}"):
207+ if is_tag:
208+ status = GitHub.check_newer_tag(repo, version.replace("tag:", ""))
209+ else:
210+ status = GitHub.check_updates(repo, remote_branch, version)
211+
212+ if status["has_updates"] is True:
213+ short_sha = status["head_ref"][:8]
214+ new_version = status["version"] if is_tag else short_sha
215+
216+ try:
217+ branch_name = f"update/{self.path}/{new_version}"
218+
219+ # Create new branch
220+ branch = Git.checkout_or_create_branch(branch_name)
221+
222+ # Update dependencies.yml file
223+ self.__update_yaml(
224+ f"tag:{new_version}" if is_tag else status["version"]
225+ )
226+
227+ # Update dependency files
228+ self.__apply_upstream_changes()
229+
230+ # Add all changes and commit
231+ has_new_commit = Git.add_and_commit(self.name, new_version)
232+
233+ if has_new_commit:
234+ # Push changes to remote
235+ Git.push(branch)
236+
237+ # Create GitHub PR
238+ GitHub.create_pr(
239+ branch,
240+ f"feat({self.name}): update to version {new_version}",
241+ f"""## Description
242+
243+Update for **{self.desc}**: update to version [{new_version}]({status['head_url']}).
244+Check out the [list of changes]({status['compare_url']}).
245+""",
246+ )
247+
248+ # Clean up repository
249+ Git.clean_repo()
250+ except (CommandRunner.Exception, shutil.Error) as e:
251+ # Handle exception on automatic update
252+ match type(e):
253+ case CommandRunner.Exception:
254+ # Print error message
255+ print(
256+ f"Error running {e.stage} command: {e.returncode}", # pyright: ignore[reportAttributeAccessIssue]
257+ file=sys.stderr,
258+ )
259+ print(e.stderr, file=sys.stderr) # pyright: ignore[reportAttributeAccessIssue]
260+ case shutil.Error:
261+ print(f"Error copying files: {e}", file=sys.stderr)
262+
263+ try:
264+ Git.clean_repo()
265+ except CommandRunner.Exception as e:
266+ print(
267+ f"Error reverting repository to clean state: {e}",
268+ file=sys.stderr,
269+ )
270+ sys.exit(1)
271+
272+ # Create a GitHub issue to notify maintainer
273+ title = f"{self.path}: update to {new_version}"
274+ body = f"""## Description
275+
276+There is a new version of `{self.name}` {self.kind} available.
277+
278+New version: [{new_version}]({status['head_url']})
279+Check out the [list of changes]({status['compare_url']}).
280+"""
281+
282+ print("Creating GitHub issue", file=sys.stderr)
283+ print(f"{title}\n\n{body}", file=sys.stderr)
284+ GitHub.create_issue(title, body)
285+ except Exception as e:
286+ print(e, file=sys.stderr)
287+
288+ def __update_yaml(self, new_version: str) -> None:
289+ dep_yaml = DependencyStore.update_dependency_version(self.path, new_version)
290+ DependencyStore.write_store(DEPS_YAML_FILE, dep_yaml)
291+
292+ def __apply_upstream_changes(self) -> None:
293+ # Patterns to ignore in copying files from upstream repo
294+ GLOBAL_IGNORE = [".git", ".github", ".gitignore"]
295+
296+ path = os.path.abspath(self.path)
297+ precopy = self.values.get("precopy")
298+ postcopy = self.values.get("postcopy")
299+
300+ repo = self.values["repo"]
301+ branch = self.values["branch"]
302+ remote_url = f"https://github.com/{repo}.git"
303+ repo_dir = os.path.join(TMP_DIR, repo)
304+
305+ # Clone repository
306+ Git.clone(remote_url, branch, repo_dir, reclone=True)
307+
308+ # Run precopy on tmp repo
309+ if precopy is not None:
310+ print("Running precopy script:", end="\n ", file=sys.stderr)
311+ print(
312+ precopy.replace("\n", "\n ", precopy.count("\n") - 1), file=sys.stderr
313+ )
314+ CommandRunner.run_or_fail(
315+ ["bash", "-c", precopy], cwd=repo_dir, stage="Precopy"
316+ )
317+
318+ # Copy files from upstream repo
319+ print(f"Copying files from {repo_dir} to {path}", file=sys.stderr)
320+ shutil.copytree(
321+ repo_dir,
322+ path,
323+ dirs_exist_ok=True,
324+ ignore=shutil.ignore_patterns(*GLOBAL_IGNORE),
325+ )
326+
327+ # Run postcopy on our repository
328+ if postcopy is not None:
329+ print("Running postcopy script:", end="\n ", file=sys.stderr)
330+ print(
331+ postcopy.replace("\n", "\n ", postcopy.count("\n") - 1),
332+ file=sys.stderr,
333+ )
334+ CommandRunner.run_or_fail(
335+ ["bash", "-c", postcopy], cwd=path, stage="Postcopy"
336+ )
337+
338+
339+class Git:
340+ default_branch = "master"
341+
342+ @staticmethod
343+ def clone(remote_url: str, branch: str, repo_dir: str, reclone=False):
344+ # If repo needs to be fresh
345+ if reclone and os.path.exists(repo_dir):
346+ shutil.rmtree(repo_dir)
347+
348+ # Clone repo in tmp directory and checkout branch
349+ if not os.path.exists(repo_dir):
350+ print(
351+ f"Cloning {remote_url} to {repo_dir} and checking out {branch}",
352+ file=sys.stderr,
353+ )
354+ CommandRunner.run_or_fail(
355+ ["git", "clone", "--depth=1", "-b", branch, remote_url, repo_dir],
356+ stage="Clone",
357+ )
358+
359+ @staticmethod
360+ def checkout_or_create_branch(branch_name: str):
361+ # Get current branch name
362+ result = CommandRunner.run_or_fail(
363+ ["git", "rev-parse", "--abbrev-ref", "HEAD"], stage="GetDefaultBranch"
364+ )
365+ Git.default_branch = result.stdout.decode("utf-8").strip()
366+
367+ # Create new branch and return created branch name
368+ try:
369+ # try to checkout already existing branch
370+ CommandRunner.run_or_fail(
371+ ["git", "checkout", branch_name], stage="CreateBranch"
372+ )
373+ except CommandRunner.Exception:
374+ # otherwise create new branch
375+ CommandRunner.run_or_fail(
376+ ["git", "checkout", "-b", branch_name], stage="CreateBranch"
377+ )
378+ return branch_name
379+
380+ @staticmethod
381+ def add_and_commit(scope: str, version: str) -> bool:
382+ """
383+ Returns `True` if there were changes and were indeed commited.
384+ Returns `False` if the repo was clean and no changes were commited.
385+ """
386+ # check if repo is clean (clean => no error, no commit)
387+ try:
388+ CommandRunner.run_or_fail(
389+ ["git", "diff", "--exit-code"], stage="CheckRepoClean"
390+ )
391+ return False
392+ except CommandRunner.Exception:
393+ # if it's other kind of error just throw!
394+ pass
395+
396+ user_name = os.environ.get("GIT_APP_NAME")
397+ user_email = os.environ.get("GIT_APP_EMAIL")
398+
399+ # Add all files to git staging
400+ CommandRunner.run_or_fail(["git", "add", "-A", "-v"], stage="AddFiles")
401+
402+ # Reset environment and git config
403+ clean_env = os.environ.copy()
404+ clean_env["LANG"] = "C.UTF-8"
405+ clean_env["GIT_CONFIG_GLOBAL"] = "/dev/null"
406+ clean_env["GIT_CONFIG_NOSYSTEM"] = "1"
407+
408+ # Commit with settings above
409+ CommandRunner.run_or_fail(
410+ [
411+ "git",
412+ "-c",
413+ f"user.name={user_name}",
414+ "-c",
415+ f"user.email={user_email}",
416+ "commit",
417+ "-m",
418+ f"feat({scope}): update to {version}",
419+ ],
420+ stage="CreateCommit",
421+ env=clean_env,
422+ )
423+ return True
424+
425+ @staticmethod
426+ def push(branch: str):
427+ CommandRunner.run_or_fail(
428+ ["git", "push", "-u", "origin", branch], stage="PushBranch"
429+ )
430+
431+ @staticmethod
432+ def clean_repo():
433+ CommandRunner.run_or_fail(
434+ ["git", "reset", "--hard", "HEAD"], stage="ResetRepository"
435+ )
436+ CommandRunner.run_or_fail(
437+ ["git", "checkout", Git.default_branch], stage="CheckoutDefaultBranch"
438+ )
439+
440+
441+class GitHub:
442+ @staticmethod
443+ def check_newer_tag(repo, current_tag) -> UpdateStatusFalse | UpdateStatusTrue:
444+ # GET /repos/:owner/:repo/git/refs/tags
445+ url = f"https://api.github.com/repos/{repo}/git/refs/tags"
446+
447+ # Send a GET request to the GitHub API
448+ response = requests.get(url)
449+ current_version = coerce(current_tag)
450+ if current_version is None:
451+ raise ValueError(
452+ f"Stored {current_version} from {repo} does not follow semver"
453+ )
454+
455+ # If the request was successful
456+ if response.status_code == 200:
457+ # Parse the JSON response
458+ data = response.json()
459+
460+ if len(data) == 0:
461+ return {
462+ "has_updates": False,
463+ }
464+
465+ latest_ref = None
466+ latest_version: Optional[Version] = None
467+ for ref in data:
468+ # we find the tag since GitHub returns it as plain git ref
469+ tag_version = coerce(ref["ref"].replace("refs/tags/", ""))
470+ if tag_version is None:
471+ # we skip every tag that is not semver-complaint
472+ continue
473+ if latest_version is None or tag_version.compare(latest_version) > 0:
474+ # if we have a "greater" semver version, set it as latest
475+ latest_version = tag_version
476+ latest_ref = ref
477+
478+ # raise if no valid semver tag is found
479+ if latest_ref is None or latest_version is None:
480+ raise ValueError(f"No tags following semver found in {repo}")
481+
482+ # we get the tag since GitHub returns it as plain git ref
483+ latest_tag = latest_ref["ref"].replace("refs/tags/", "")
484+
485+ if latest_version.compare(current_version) <= 0:
486+ return {
487+ "has_updates": False,
488+ }
489+
490+ return {
491+ "has_updates": True,
492+ "version": latest_tag,
493+ "compare_url": f"https://github.com/{repo}/compare/{current_tag}...{latest_tag}",
494+ "head_ref": latest_ref["object"]["sha"],
495+ "head_url": f"https://github.com/{repo}/releases/tag/{latest_tag}",
496+ }
497+ else:
498+ # If the request was not successful, raise an exception
499+ raise Exception(
500+ f"GitHub API request failed with status code {response.status_code}: {response.json()}"
501+ )
502+
503+ @staticmethod
504+ def check_updates(repo, branch, version) -> UpdateStatusFalse | UpdateStatusTrue:
505+ url = f"https://api.github.com/repos/{repo}/compare/{version}...{branch}"
506+
507+ # Send a GET request to the GitHub API
508+ response = requests.get(url)
509+
510+ # If the request was successful
511+ if response.status_code == 200:
512+ # Parse the JSON response
513+ data = response.json()
514+
515+ # If the base is behind the head, there is a newer version
516+ has_updates = data["status"] != "identical"
517+
518+ if not has_updates:
519+ return {
520+ "has_updates": False,
521+ }
522+
523+ return {
524+ "has_updates": data["status"] != "identical",
525+ "version": data["commits"][-1]["sha"],
526+ "compare_url": data["permalink_url"],
527+ "head_ref": data["commits"][-1]["sha"],
528+ "head_url": data["commits"][-1]["html_url"],
529+ }
530+ else:
531+ # If the request was not successful, raise an exception
532+ raise Exception(
533+ f"GitHub API request failed with status code {response.status_code}: {response.json()}"
534+ )
535+
536+ @staticmethod
537+ def create_issue(title: str, body: str) -> None:
538+ cmd = ["gh", "issue", "create", "-t", title, "-b", body]
539+ CommandRunner.run_or_fail(cmd, stage="CreateIssue")
540+
541+ @staticmethod
542+ def create_pr(branch: str, title: str, body: str) -> None:
543+ # first of all let's check if PR is already open
544+ check_cmd = [
545+ "gh",
546+ "pr",
547+ "list",
548+ "--state",
549+ "open",
550+ "--head",
551+ branch,
552+ "--json",
553+ "title",
554+ ]
555+ # returncode is 0 also if no PRs are found
556+ output = json.loads(
557+ CommandRunner.run_or_fail(check_cmd, stage="CheckPullRequestOpen")
558+ .stdout.decode("utf-8")
559+ .strip()
560+ )
561+ # we have PR in this case!
562+ if len(output) > 0:
563+ return
564+ cmd = [
565+ "gh",
566+ "pr",
567+ "create",
568+ "-B",
569+ Git.default_branch,
570+ "-H",
571+ branch,
572+ "-t",
573+ title,
574+ "-b",
575+ body,
576+ ]
577+ CommandRunner.run_or_fail(cmd, stage="CreatePullRequest")
578+
579+
580+def main():
581+ # Load the YAML file
582+ with open(DEPS_YAML_FILE, "r") as yaml_file:
583+ data: DependencyYAML = yaml.safe_load(yaml_file)
584+
585+ if "dependencies" not in data:
586+ raise Exception("dependencies.yml not properly formatted")
587+
588+ # Cache YAML version
589+ DependencyStore.set(data)
590+
591+ dependencies = data["dependencies"]
592+ for path in dependencies:
593+ dependency = Dependency(path, dependencies[path])
594+ dependency.update_or_notify()
595+
596+
597+if __name__ == "__main__":
598+ main()
+56-0.oh-my-zsh/.github/workflows/installer.yml
@@ -0,0 +1,56 @@
1+name: Test and Deploy installer
2+on:
3+ workflow_dispatch: {}
4+ push:
5+ paths:
6+ - 'tools/install.sh'
7+ - '.github/workflows/installer/**'
8+ - '.github/workflows/installer.yml'
9+
10+concurrency:
11+ group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
12+ cancel-in-progress: false
13+
14+permissions:
15+ contents: read # to checkout
16+
17+jobs:
18+ test:
19+ name: Test installer
20+ if: github.repository == 'ohmyzsh/ohmyzsh'
21+ runs-on: ${{ matrix.os }}
22+ strategy:
23+ matrix:
24+ os:
25+ - ubuntu-latest
26+ - macos-latest
27+ steps:
28+ - name: Set up git repository
29+ uses: actions/checkout@v4
30+ - name: Install zsh
31+ if: runner.os == 'Linux'
32+ run: sudo apt-get update; sudo apt-get install zsh
33+ - name: Test installer
34+ run: sh ./tools/install.sh
35+
36+ deploy:
37+ name: Deploy installer in install.ohmyz.sh
38+ if: github.ref == 'refs/heads/master'
39+ runs-on: ubuntu-latest
40+ environment: vercel
41+ needs:
42+ - test
43+ steps:
44+ - name: Checkout
45+ uses: actions/checkout@v4
46+ - name: Install Vercel CLI
47+ run: npm install -g vercel
48+ - name: Setup project and deploy
49+ env:
50+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
51+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
52+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
53+ run: |
54+ cp tools/install.sh .github/workflows/installer/install.sh
55+ cd .github/workflows/installer
56+ vc deploy --prod -t "$VERCEL_TOKEN"
+1-0.oh-my-zsh/.github/workflows/installer/.gitignore
@@ -0,0 +1 @@
1+install.sh
+2-0.oh-my-zsh/.github/workflows/installer/.vercelignore
@@ -0,0 +1,2 @@
1+/*
2+!/install.sh
+23-0.oh-my-zsh/.github/workflows/installer/vercel.json
@@ -0,0 +1,23 @@
1+{
2+ "headers": [
3+ {
4+ "source": "/(|install.sh)",
5+ "headers": [
6+ {
7+ "key": "Content-Type",
8+ "value": "text/plain"
9+ },
10+ {
11+ "key": "Content-Disposition",
12+ "value": "inline; filename=\"install.sh\""
13+ }
14+ ]
15+ }
16+ ],
17+ "rewrites": [
18+ {
19+ "source": "/",
20+ "destination": "/install.sh"
21+ }
22+ ]
23+}
+38-0.oh-my-zsh/.github/workflows/main.yml
@@ -0,0 +1,38 @@
1+name: CI
2+on:
3+ pull_request:
4+ types:
5+ - opened
6+ - synchronize
7+ branches:
8+ - master
9+ push:
10+ branches:
11+ - master
12+
13+concurrency:
14+ group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
15+ cancel-in-progress: true
16+
17+permissions:
18+ contents: read # to fetch code (actions/checkout)
19+
20+jobs:
21+ tests:
22+ name: Run tests
23+ runs-on: ubuntu-latest
24+ if: github.repository == 'ohmyzsh/ohmyzsh'
25+ steps:
26+ - name: Set up git repository
27+ uses: actions/checkout@v4
28+ - name: Install zsh
29+ run: sudo apt-get update; sudo apt-get install zsh
30+ - name: Check syntax
31+ run: |
32+ for file in ./oh-my-zsh.sh \
33+ ./lib/*.zsh \
34+ ./plugins/*/*.plugin.zsh \
35+ ./plugins/*/_* \
36+ ./themes/*.zsh-theme; do
37+ zsh -n "$file" || return 1
38+ done
+146-0.oh-my-zsh/.github/workflows/project.yml
@@ -0,0 +1,146 @@
1+name: Project tracking
2+on:
3+ issues:
4+ types: [opened, reopened]
5+ pull_request_target:
6+ types: [opened, reopened, synchronize]
7+
8+concurrency:
9+ group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
10+ cancel-in-progress: true
11+
12+permissions: {}
13+jobs:
14+ add-to-project:
15+ name: Add to project
16+ runs-on: ubuntu-latest
17+ if: github.repository == 'ohmyzsh/ohmyzsh'
18+ steps:
19+ - name: Authenticate as @ohmyzsh
20+ id: generate_token
21+ uses: ohmyzsh/github-app-token@v2
22+ with:
23+ app_id: ${{ secrets.OHMYZSH_APP_ID }}
24+ private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
25+ - name: Store app token
26+ run: echo "GH_TOKEN=${{ steps.generate_token.outputs.token }}" >> "$GITHUB_ENV"
27+ - name: Read project data
28+ env:
29+ ORGANIZATION: ohmyzsh
30+ PROJECT_NUMBER: "1"
31+ run: |
32+ # Get Project data
33+ gh api graphql -f query='
34+ query($org: String!, $number: Int!) {
35+ organization(login: $org){
36+ projectV2(number: $number) {
37+ id
38+ fields(first:20) {
39+ nodes {
40+ ... on ProjectV2Field {
41+ id
42+ name
43+ }
44+ }
45+ }
46+ }
47+ }
48+ }' -f org=$ORGANIZATION -F number=$PROJECT_NUMBER > project_data.json
49+
50+ # Parse project data
51+ cat >> $GITHUB_ENV <<EOF
52+ PROJECT_ID=$(jq '.data.organization.projectV2.id' project_data.json)
53+ PLUGIN_FIELD_ID=$(jq '.data.organization.projectV2.fields.nodes[] | select(.name == "Plugin") | .id' project_data.json)
54+ THEME_FIELD_ID=$(jq '.data.organization.projectV2.fields.nodes[] | select(.name == "Theme") | .id' project_data.json)
55+ EOF
56+
57+ - name: Add to project
58+ env:
59+ ISSUE_OR_PR_ID: ${{ github.event.issue.node_id || github.event.pull_request.node_id }}
60+ run: |
61+ item_id="$(gh api graphql -f query='
62+ mutation($project: ID!, $content: ID!) {
63+ addProjectV2ItemById(input: {projectId: $project, contentId: $content}) {
64+ item {
65+ id
66+ }
67+ }
68+ }
69+ ' -f project=$PROJECT_ID -f content=$ISSUE_OR_PR_ID --jq '.data.addProjectV2ItemById.item.id')"
70+
71+ echo "ITEM_ID=$item_id" >> $GITHUB_ENV
72+
73+ - name: Classify Pull Request
74+ if: github.event_name == 'pull_request_target'
75+ run: |
76+ touch plugins.list themes.list
77+
78+ gh pr view ${{ github.event.pull_request.number }} \
79+ --repo ${{ github.repository }} \
80+ --json files --jq '.files.[].path' | awk -F/ '
81+ /^plugins\// {
82+ plugins[$2] = 1
83+ }
84+ /^themes\// {
85+ gsub(/\.zsh-theme$/, "", $2)
86+ themes[$2] = 1
87+ }
88+ END {
89+ for (plugin in plugins) {
90+ print plugin >> "plugins.list"
91+ }
92+ for (theme in themes) {
93+ print theme >> "themes.list"
94+ }
95+ }
96+ '
97+ # If only one plugin is modified, add it to the plugin field
98+ if [[ $(wc -l < plugins.list) = 1 ]]; then
99+ echo "PLUGIN=$(cat plugins.list)" >> $GITHUB_ENV
100+ fi
101+ # If only one theme is modified, add it to the theme field
102+ if [[ $(wc -l < themes.list) = 1 ]]; then
103+ echo "THEME=$(cat themes.list)" >> $GITHUB_ENV
104+ fi
105+
106+ - name: Fill Pull Request fields in project
107+ if: github.event_name == 'pull_request_target'
108+ run: |
109+ gh api graphql -f query='
110+ mutation (
111+ $project: ID!
112+ $item: ID!
113+ $plugin_field: ID!
114+ $plugin_value: String!
115+ $theme_field: ID!
116+ $theme_value: String!
117+ ) {
118+ set_plugin: updateProjectV2ItemFieldValue(input: {
119+ projectId: $project
120+ itemId: $item
121+ fieldId: $plugin_field
122+ value: {
123+ text: $plugin_value
124+ }
125+ }) {
126+ projectV2Item {
127+ id
128+ }
129+ }
130+ set_theme: updateProjectV2ItemFieldValue(input: {
131+ projectId: $project
132+ itemId: $item
133+ fieldId: $theme_field
134+ value: {
135+ text: $theme_value
136+ }
137+ }) {
138+ projectV2Item {
139+ id
140+ }
141+ }
142+ }
143+ ' -f project=$PROJECT_ID -f item=$ITEM_ID \
144+ -f plugin_field=$PLUGIN_FIELD_ID -f plugin_value=$PLUGIN \
145+ -f theme_field=$THEME_FIELD_ID -f theme_value=$THEME \
146+ --silent
+15-0.oh-my-zsh/.gitignore
@@ -0,0 +1,15 @@
1+# custom files
2+custom/
3+
4+# temp files directories
5+cache/
6+log/
7+*.swp
8+.DS_Store
9+
10+# editor configs
11+.vscode
12+.idea
13+
14+# zcompile cached files
15+*.zwc
+5-0.oh-my-zsh/.gitpod.Dockerfile
@@ -0,0 +1,5 @@
1+FROM gitpod/workspace-full
2+
3+RUN sudo apt-get update && \
4+ sudo apt-get install -y zsh && \
5+ sudo rm -rf /var/lib/apt/lists/*
+9-0.oh-my-zsh/.gitpod.yml
@@ -0,0 +1,9 @@
1+image:
2+ file: .gitpod.Dockerfile
3+
4+tasks:
5+ - init: |
6+ export EDITOR="command gp open -w" VISUAL="command gp open -w"
7+ cp -f /workspace/ohmyzsh/templates/zshrc.zsh-template ~/.zshrc
8+ ln -sf /workspace/ohmyzsh ~/.oh-my-zsh
9+ command: exec zsh
+4-0.oh-my-zsh/.prettierrc
@@ -0,0 +1,4 @@
1+{
2+ "printWidth": 110,
3+ "proseWrap": "always"
4+}
+76-0.oh-my-zsh/CODE_OF_CONDUCT.md
@@ -0,0 +1,76 @@
1+# Contributor Covenant Code of Conduct
2+
3+## Our Pledge
4+
5+In the interest of fostering an open and welcoming environment, we as
6+contributors and maintainers pledge to making participation in our project and
7+our community a harassment-free experience for everyone, regardless of age, body
8+size, disability, ethnicity, sex characteristics, gender identity and expression,
9+level of experience, education, socio-economic status, nationality, personal
10+appearance, race, religion, or sexual identity and orientation.
11+
12+## Our Standards
13+
14+Examples of behavior that contributes to creating a positive environment
15+include:
16+
17+* Using welcoming and inclusive language
18+* Being respectful of differing viewpoints and experiences
19+* Gracefully accepting constructive criticism
20+* Focusing on what is best for the community
21+* Showing empathy towards other community members
22+
23+Examples of unacceptable behavior by participants include:
24+
25+* The use of sexualized language or imagery and unwelcome sexual attention or
26+ advances
27+* Trolling, insulting/derogatory comments, and personal or political attacks
28+* Public or private harassment
29+* Publishing others' private information, such as a physical or electronic
30+ address, without explicit permission
31+* Other conduct which could reasonably be considered inappropriate in a
32+ professional setting
33+
34+## Our Responsibilities
35+
36+Project maintainers are responsible for clarifying the standards of acceptable
37+behavior and are expected to take appropriate and fair corrective action in
38+response to any instances of unacceptable behavior.
39+
40+Project maintainers have the right and responsibility to remove, edit, or
41+reject comments, commits, code, wiki edits, issues, and other contributions
42+that are not aligned to this Code of Conduct, or to ban temporarily or
43+permanently any contributor for other behaviors that they deem inappropriate,
44+threatening, offensive, or harmful.
45+
46+## Scope
47+
48+This Code of Conduct applies within all project spaces, and it also applies when
49+an individual is representing the project or its community in public spaces.
50+Examples of representing a project or community include using an official
51+project e-mail address, posting via an official social media account, or acting
52+as an appointed representative at an online or offline event. Representation of
53+a project may be further defined and clarified by project maintainers.
54+
55+## Enforcement
56+
57+Instances of abusive, harassing, or otherwise unacceptable behavior may be
58+reported by contacting the project team at ohmyzsh@planetargon.com. All
59+complaints will be reviewed and investigated and will result in a response that
60+is deemed necessary and appropriate to the circumstances. The project team is
61+obligated to maintain confidentiality with regard to the reporter of an incident.
62+Further details of specific enforcement policies may be posted separately.
63+
64+Project maintainers who do not follow or enforce the Code of Conduct in good
65+faith may face temporary or permanent repercussions as determined by other
66+members of the project's leadership.
67+
68+## Attribution
69+
70+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
72+
73+[homepage]: https://www.contributor-covenant.org
74+
75+For answers to common questions about this code of conduct, see
76+https://www.contributor-covenant.org/faq
+245-0.oh-my-zsh/CONTRIBUTING.md
@@ -0,0 +1,245 @@
1+# CONTRIBUTING GUIDELINES
2+
3+Oh-My-Zsh is a community-driven project. Contribution is welcome, encouraged, and appreciated.
4+It is also essential for the development of the project.
5+
6+First, please take a moment to review our [code of conduct](CODE_OF_CONDUCT.md).
7+
8+These guidelines are an attempt at better addressing the huge amount of pending
9+issues and pull requests. Please read them closely.
10+
11+Foremost, be so kind as to [search](#use-the-search-luke). This ensures any contribution
12+you would make is not already covered.
13+
14+<!-- TOC updateonsave:true depthfrom:2 -->
15+
16+- [Reporting Issues](#reporting-issues)
17+ - [You have a problem](#you-have-a-problem)
18+ - [You have a suggestion](#you-have-a-suggestion)
19+- [Submitting Pull Requests](#submitting-pull-requests)
20+ - [Getting started](#getting-started)
21+ - [You have a solution](#you-have-a-solution)
22+ - [You have an addition](#you-have-an-addition)
23+- [Use the Search, Luke](#use-the-search-luke)
24+- [Commit Guidelines](#commit-guidelines)
25+ - [Format](#format)
26+ - [Style](#style)
27+- [Volunteer](#volunteer)
28+
29+<!-- /TOC -->
30+
31+## Reporting Issues
32+
33+### You have a problem
34+
35+Please be so kind as to [search](#use-the-search-luke) for any open issue already covering
36+your problem.
37+
38+If you find one, comment on it, so we know more people are experiencing it.
39+
40+If not, look at the [Troubleshooting](https://github.com/ohmyzsh/ohmyzsh/wiki/Troubleshooting)
41+page for instructions on how to gather data to better debug your problem.
42+
43+Then, you can go ahead and create an issue with as much detail as you can provide.
44+It should include the data gathered as indicated above, along with the following:
45+
46+1. How to reproduce the problem
47+2. What the correct behavior should be
48+3. What the actual behavior is
49+
50+Please copy to anyone relevant (e.g. plugin maintainers) by mentioning their GitHub handle
51+(starting with `@`) in your message.
52+
53+We will do our very best to help you.
54+
55+### You have a suggestion
56+
57+Please be so kind as to [search](#use-the-search-luke) for any open issue already covering
58+your suggestion.
59+
60+If you find one, comment on it, so we know more people are supporting it.
61+
62+If not, you can go ahead and create an issue. Please copy to anyone relevant (e.g. plugin
63+maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
64+
65+## Submitting Pull Requests
66+
67+### Getting started
68+
69+You should be familiar with the basics of
70+[contributing on GitHub](https://help.github.com/articles/using-pull-requests) and have a fork
71+[properly set up](https://github.com/ohmyzsh/ohmyzsh/wiki/Contribution-Technical-Practices).
72+
73+You MUST always create PRs with _a dedicated branch_ based on the latest upstream tree.
74+
75+If you create your own PR, please make sure you do it right. Also be so kind as to reference
76+any issue that would be solved in the PR description body,
77+[for instance](https://help.github.com/articles/closing-issues-via-commit-messages/)
78+_"Fixes #XXXX"_ for issue number XXXX.
79+
80+### You have a solution
81+
82+Please be so kind as to [search](#use-the-search-luke) for any open issue already covering
83+your [problem](#you-have-a-problem), and any pending/merged/rejected PR covering your solution.
84+
85+If the solution is already reported, try it out and +1 the pull request if the
86+solution works ok. On the other hand, if you think your solution is better, post
87+it with reference to the other one so we can have both solutions to compare.
88+
89+If not, then go ahead and submit a PR. Please copy to anyone relevant (e.g. plugin
90+maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
91+
92+### You have an addition
93+
94+Please [do not](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#dont-send-us-your-theme-for-now)
95+send themes for now.
96+
97+Please be so kind as to [search](#use-the-search-luke) for any pending, merged or rejected Pull Requests
98+covering or related to what you want to add.
99+
100+If you find one, try it out and work with the author on a common solution.
101+
102+If not, then go ahead and submit a PR. Please copy to anyone relevant (e.g. plugin
103+maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
104+
105+For any extensive change, such as a new plugin, you will have to find testers to +1 your PR.
106+
107+### New plugin aliases
108+
109+We acknowledge that aliases are a core part of Oh My Zsh. There are plugins that have +100 aliases!
110+
111+This has become an issue for two opposing reasons:
112+
113+- Some users want to have their personal aliases in Oh My Zsh.
114+- Some users don't want any aliases at all and feel that there are too many.
115+
116+Because of this, from now on, we require that new aliases follow these conditions:
117+
118+1. They will be used by many people, not just a few.
119+2. The aliases will be used many times and for common tasks.
120+3. Prefer one generic alias over many specific ones.
121+4. When justifying the need for an alias, talk about workflows where you'll use it,
122+ preferably in combination with other aliases.
123+5. If a command with the same name exists, look for a different alias name.
124+
125+This list is not exhaustive! Please remember that your alias will be in the machines of many people,
126+so it should be justified why they should have it.
127+
128+----
129+
130+## Use the Search, Luke
131+
132+_May the Force (of past experiences) be with you_
133+
134+GitHub offers [many search features](https://help.github.com/articles/searching-github/)
135+to help you check whether a similar contribution to yours already exists. Please search
136+before making any contribution, it avoids duplicates and eases maintenance. Trust me,
137+that works 90% of the time.
138+
139+You can also take a look at the [FAQ](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ)
140+to be sure your contribution has not already come up.
141+
142+If all fails, your thing has probably not been reported yet, so you can go ahead
143+and [create an issue](#reporting-issues) or [submit a PR](#submitting-pull-requests).
144+
145+----
146+
147+## Commit Guidelines
148+
149+Oh My Zsh uses the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)
150+specification. The automatic changelog tool uses these to automatically generate
151+a changelog based on the commit messages. Here's a guide to writing a commit message
152+to allow this:
153+
154+### Format
155+
156+```
157+type(scope)!: subject
158+```
159+
160+- `type`: the type of the commit is one of the following:
161+
162+ - `feat`: new features.
163+ - `fix`: bug fixes.
164+ - `docs`: documentation changes.
165+ - `refactor`: refactor of a particular code section without introducing
166+ new features or bug fixes.
167+ - `style`: code style improvements.
168+ - `perf`: performance improvements.
169+ - `test`: changes to the test suite.
170+ - `ci`: changes to the CI system.
171+ - `build`: changes to the build system (we don't yet have one so this shouldn't apply).
172+ - `chore`: for other changes that don't match previous types. This doesn't appear
173+ in the changelog.
174+
175+- `scope`: section of the codebase that the commit makes changes to. If it makes changes to
176+ many sections, or if no section in particular is modified, leave blank without the parentheses.
177+ Examples:
178+
179+ - Commit that changes the `git` plugin:
180+ ```
181+ feat(git): add alias for `git commit`
182+ ```
183+
184+ - Commit that changes many plugins:
185+ ```
186+ style: fix inline declaration of arrays
187+ ```
188+
189+ For changes to plugins or themes, the scope should be the plugin or theme name:
190+
191+ - โœ… `fix(agnoster): commit subject`
192+ - โŒ `fix(theme/agnoster): commit subject`
193+
194+- `!`: this goes after the `scope` (or the `type` if scope is empty), to indicate that the commit
195+ introduces breaking changes.
196+
197+ Optionally, you can specify a message that the changelog tool will display to the user to indicate
198+ what's changed and what they can do to deal with it. You can use multiple lines to type this message;
199+ the changelog parser will keep reading until the end of the commit message or until it finds an empty
200+ line.
201+
202+ Example (made up):
203+
204+ ```
205+ style(agnoster)!: change dirty git repo glyph
206+
207+ BREAKING CHANGE: the glyph to indicate when a git repository is dirty has
208+ changed from a Powerline character to a standard UTF-8 emoji. You can
209+ change it back by setting `ZSH_THEME_DIRTY_GLYPH`.
210+
211+ Fixes #420
212+
213+ Co-authored-by: Username <email>
214+ ```
215+
216+- `subject`: a brief description of the changes. This will be displayed in the changelog. If you need
217+ to specify other details, you can use the commit body, but it won't be visible.
218+
219+ Formatting tricks: the commit subject may contain:
220+
221+ - Links to related issues or PRs by writing `#issue`. This will be highlighted by the changelog tool:
222+ ```
223+ feat(archlinux): add support for aura AUR helper (#9467)
224+ ```
225+
226+ - Formatted inline code by using backticks: the text between backticks will also be highlighted by
227+ the changelog tool:
228+ ```
229+ feat(shell-proxy): enable unexported `DEFAULT_PROXY` setting (#9774)
230+ ```
231+
232+### Style
233+
234+Try to keep the first commit line short. It's harder to do using this commit style but try to be
235+concise, and if you need more space, you can use the commit body. Try to make sure that the commit
236+subject is clear and precise enough that users will know what changed by just looking at the changelog.
237+
238+----
239+
240+## Volunteer
241+
242+Very nice!! :)
243+
244+Please have a look at the [Volunteer](https://github.com/ohmyzsh/ohmyzsh/wiki/Volunteers)
245+page for instructions on where to start and more.
+21-0.oh-my-zsh/LICENSE.txt
@@ -0,0 +1,21 @@
1+MIT License
2+
3+Copyright (c) 2009-2022 Robby Russell and contributors (https://github.com/ohmyzsh/ohmyzsh/contributors)
4+
5+Permission is hereby granted, free of charge, to any person obtaining a copy
6+of this software and associated documentation files (the "Software"), to deal
7+in the Software without restriction, including without limitation the rights
8+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+copies of the Software, and to permit persons to whom the Software is
10+furnished to do so, subject to the following conditions:
11+
12+The above copyright notice and this permission notice shall be included in all
13+copies or substantial portions of the Software.
14+
15+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+SOFTWARE.
+564-0.oh-my-zsh/README.md
@@ -0,0 +1,564 @@
1+<p align="center"><img src="https://ohmyzsh.s3.amazonaws.com/omz-ansi-github.png" alt="Oh My Zsh"></p>
2+
3+Oh My Zsh is an open source, community-driven framework for managing your [zsh](https://www.zsh.org/)
4+configuration.
5+
6+Sounds boring. Let's try again.
7+
8+**Oh My Zsh will not make you a 10x developer...but you may feel like one.**
9+
10+Once installed, your terminal shell will become the talk of the town _or your money back!_ With each keystroke
11+in your command prompt, you'll take advantage of the hundreds of powerful plugins and beautiful themes.
12+Strangers will come up to you in cafรฉs and ask you, _"that is amazing! are you some sort of genius?"_
13+
14+Finally, you'll begin to get the sort of attention that you have always felt you deserved. ...or maybe you'll
15+use the time that you're saving to start flossing more often. ๐Ÿ˜ฌ
16+
17+To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://x.com/ohmyzsh) on X (formerly
18+Twitter), and join us on [Discord](https://discord.gg/ohmyzsh).
19+
20+[![CI](https://github.com/ohmyzsh/ohmyzsh/workflows/CI/badge.svg)](https://github.com/ohmyzsh/ohmyzsh/actions?query=workflow%3ACI)
21+[![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/ohmyzsh?label=%40ohmyzsh&logo=x&style=flat)](https://twitter.com/intent/follow?screen_name=ohmyzsh)
22+[![Mastodon Follow](https://img.shields.io/mastodon/follow/111169632522566717?label=%40ohmyzsh&domain=https%3A%2F%2Fmstdn.social&logo=mastodon&style=flat)](https://mstdn.social/@ohmyzsh)
23+[![Discord server](https://img.shields.io/discord/642496866407284746)](https://discord.gg/ohmyzsh)
24+[![Gitpod ready](https://img.shields.io/badge/Gitpod-ready-blue?logo=gitpod)](https://gitpod.io/#https://github.com/ohmyzsh/ohmyzsh)
25+
26+<details>
27+<summary>Table of Contents</summary>
28+
29+- [Getting Started](#getting-started)
30+ - [Operating System Compatibility](#operating-system-compatibility)
31+ - [Prerequisites](#prerequisites)
32+ - [Basic Installation](#basic-installation)
33+ - [Manual Inspection](#manual-inspection)
34+- [Using Oh My Zsh](#using-oh-my-zsh)
35+ - [Plugins](#plugins)
36+ - [Enabling Plugins](#enabling-plugins)
37+ - [Using Plugins](#using-plugins)
38+ - [Themes](#themes)
39+ - [Selecting A Theme](#selecting-a-theme)
40+ - [FAQ](#faq)
41+- [Advanced Topics](#advanced-topics)
42+ - [Advanced Installation](#advanced-installation)
43+ - [Custom Directory](#custom-directory)
44+ - [Unattended Install](#unattended-install)
45+ - [Installing From A Forked Repository](#installing-from-a-forked-repository)
46+ - [Manual Installation](#manual-installation)
47+ - [Installation Problems](#installation-problems)
48+ - [Custom Plugins And Themes](#custom-plugins-and-themes)
49+ - [Enable GNU ls In macOS And freeBSD Systems](#enable-gnu-ls-in-macos-and-freebsd-systems)
50+ - [Skip Aliases](#skip-aliases)
51+ - [Async git prompt](#async-git-prompt)
52+- [Getting Updates](#getting-updates)
53+ - [Updates Verbosity](#updates-verbosity)
54+ - [Manual Updates](#manual-updates)
55+- [Uninstalling Oh My Zsh](#uninstalling-oh-my-zsh)
56+- [How Do I Contribute To Oh My Zsh?](#how-do-i-contribute-to-oh-my-zsh)
57+ - [Do Not Send Us Themes](#do-not-send-us-themes)
58+- [Contributors](#contributors)
59+- [Follow Us](#follow-us)
60+- [Merchandise](#merchandise)
61+- [License](#license)
62+- [About Planet Argon](#about-planet-argon)
63+
64+</details>
65+
66+## Getting Started
67+
68+### Operating System Compatibility
69+
70+| O/S | Status |
71+| :------------- | :----: |
72+| Android | โœ… |
73+| freeBSD | โœ… |
74+| LCARS | ๐Ÿ›ธ |
75+| Linux | โœ… |
76+| macOS | โœ… |
77+| OS/2 Warp | โŒ |
78+| Windows (WSL2) | โœ… |
79+
80+### Prerequisites
81+
82+- [Zsh](https://www.zsh.org) should be installed (v4.3.9 or more recent is fine but we prefer 5.0.8 and
83+ newer). If not pre-installed (run `zsh --version` to confirm), check the following wiki instructions here:
84+ [Installing ZSH](https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH)
85+- `curl` or `wget` should be installed
86+- `git` should be installed (recommended v2.4.11 or higher)
87+
88+### Basic Installation
89+
90+Oh My Zsh is installed by running one of the following commands in your terminal. You can install this via the
91+command-line with either `curl`, `wget` or another similar tool.
92+
93+| Method | Command |
94+| :-------- | :------------------------------------------------------------------------------------------------ |
95+| **curl** | `sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` |
96+| **wget** | `sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` |
97+| **fetch** | `sh -c "$(fetch -o - https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` |
98+
99+Alternatively, the installer is also mirrored outside GitHub. Using this URL instead may be required if you're
100+in a country like China or India (for certain ISPs), that blocks `raw.githubusercontent.com`:
101+
102+| Method | Command |
103+| :-------- | :------------------------------------------------ |
104+| **curl** | `sh -c "$(curl -fsSL https://install.ohmyz.sh/)"` |
105+| **wget** | `sh -c "$(wget -O- https://install.ohmyz.sh/)"` |
106+| **fetch** | `sh -c "$(fetch -o - https://install.ohmyz.sh/)"` |
107+
108+_Note that any previous `.zshrc` will be renamed to `.zshrc.pre-oh-my-zsh`. After installation, you can move
109+the configuration you want to preserve into the new `.zshrc`._
110+
111+#### Manual Inspection
112+
113+It's a good idea to inspect the install script from projects you don't yet know. You can do that by
114+downloading the install script first, looking through it so everything looks normal, then running it:
115+
116+```sh
117+wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh
118+sh install.sh
119+```
120+
121+If the above URL times out or otherwise fails, you may have to substitute the URL for
122+`https://install.ohmyz.sh` to be able to get the script.
123+
124+## Using Oh My Zsh
125+
126+### Plugins
127+
128+Oh My Zsh comes with a shitload of plugins for you to take advantage of. You can take a look in the
129+[plugins](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins) directory and/or the
130+[wiki](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins) to see what's currently available.
131+
132+#### Enabling Plugins
133+
134+Once you spot a plugin (or several) that you'd like to use with Oh My Zsh, you'll need to enable them in the
135+`.zshrc` file. You'll find the zshrc file in your `$HOME` directory. Open it with your favorite text editor
136+and you'll see a spot to list all the plugins you want to load.
137+
138+```sh
139+vi ~/.zshrc
140+```
141+
142+For example, this might begin to look like this:
143+
144+```sh
145+plugins=(
146+ git
147+ bundler
148+ dotenv
149+ macos
150+ rake
151+ rbenv
152+ ruby
153+)
154+```
155+
156+_Note that the plugins are separated by whitespace (spaces, tabs, new lines...). **Do not** use commas between
157+them or it will break._
158+
159+#### Using Plugins
160+
161+Each built-in plugin includes a **README**, documenting it. This README should show the aliases (if the plugin
162+adds any) and extra goodies that are included in that particular plugin.
163+
164+### Themes
165+
166+We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme-happy. We have over one
167+hundred and fifty themes now bundled. Most of them have
168+[screenshots](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) on the wiki (We are working on updating this!).
169+Check them out!
170+
171+#### Selecting A Theme
172+
173+_Robby's theme is the default one. It's not the fanciest one. It's not the simplest one. It's just the right
174+one (for him)._
175+
176+Once you find a theme that you'd like to use, you will need to edit the `~/.zshrc` file. You'll see an
177+environment variable (all caps) in there that looks like:
178+
179+```sh
180+ZSH_THEME="robbyrussell"
181+```
182+
183+To use a different theme, simply change the value to match the name of your desired theme. For example:
184+
185+```sh
186+ZSH_THEME="agnoster" # (this is one of the fancy ones)
187+# see https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#agnoster
188+```
189+
190+<!-- prettier-ignore-start -->
191+> [!NOTE]
192+> You will many times see screenshots for a zsh theme, and try it out, and find that it doesn't look the same for you.
193+>
194+> This is because many themes require installing a [Powerline Font](https://github.com/powerline/fonts) or a
195+> [Nerd Font](https://github.com/ryanoasis/nerd-fonts) in order to render properly. Without them, these themes
196+> will render weird prompt symbols. Check out
197+> [the FAQ](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#i-have-a-weird-character-in-my-prompt) for more
198+> information.
199+>
200+> Also, beware that themes only control what your prompt looks like. This is, the text you see before or after
201+> your cursor, where you'll type your commands. Themes don't control things such as the colors of your
202+> terminal window (known as _color scheme_) or the font of your terminal. These are settings that you can
203+> change in your terminal emulator. For more information, see
204+> [what is a zsh theme](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#what-is-a-zsh-theme).
205+<!-- prettier-ignore-end -->
206+
207+Open up a new terminal window and your prompt should look something like this:
208+
209+![Agnoster theme](https://cloud.githubusercontent.com/assets/2618447/6316862/70f58fb6-ba03-11e4-82c9-c083bf9a6574.png)
210+
211+In case you did not find a suitable theme for your needs, please have a look at the wiki for
212+[more of them](https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes).
213+
214+If you're feeling feisty, you can let the computer select one randomly for you each time you open a new
215+terminal window.
216+
217+```sh
218+ZSH_THEME="random" # (...please let it be pie... please be some pie..)
219+```
220+
221+And if you want to pick a random theme from a list of your favorite themes:
222+
223+```sh
224+ZSH_THEME_RANDOM_CANDIDATES=(
225+ "robbyrussell"
226+ "agnoster"
227+)
228+```
229+
230+If you only know which themes you don't like, you can add them similarly to an ignored list:
231+
232+```sh
233+ZSH_THEME_RANDOM_IGNORED=(pygmalion tjkirch_mod)
234+```
235+
236+### FAQ
237+
238+If you have some more questions or issues, you might find a solution in our
239+[FAQ](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ).
240+
241+## Advanced Topics
242+
243+If you're the type that likes to get their hands dirty, these sections might resonate.
244+
245+### Advanced Installation
246+
247+Some users may want to manually install Oh My Zsh, or change the default path or other settings that the
248+installer accepts (these settings are also documented at the top of the install script).
249+
250+#### Custom Directory
251+
252+The default location is `~/.oh-my-zsh` (hidden in your home directory, you can access it with
253+`cd ~/.oh-my-zsh`)
254+
255+If you'd like to change the install directory with the `ZSH` environment variable, either by running
256+`export ZSH=/your/path` before installing, or by setting it before the end of the install pipeline like this:
257+
258+```sh
259+ZSH="$HOME/.dotfiles/oh-my-zsh" sh install.sh
260+```
261+
262+#### Unattended Install
263+
264+If you're running the Oh My Zsh install script as part of an automated install, you can pass the
265+`--unattended` flag to the `install.sh` script. This will have the effect of not trying to change the default
266+shell, and it also won't run `zsh` when the installation has finished.
267+
268+```sh
269+sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
270+```
271+
272+If you're in China, India, or another country that blocks `raw.githubusercontent.com`, you may have to
273+substitute the URL for `https://install.ohmyz.sh` for it to install.
274+
275+#### Installing From A Forked Repository
276+
277+The install script also accepts these variables to allow the installation of a different repository:
278+
279+- `REPO` (default: `ohmyzsh/ohmyzsh`): this takes the form of `owner/repository`. If you set this variable,
280+ the installer will look for a repository at `https://github.com/{owner}/{repository}`.
281+
282+- `REMOTE` (default: `https://github.com/${REPO}.git`): this is the full URL of the git repository clone. You
283+ can use this setting if you want to install from a fork that is not on GitHub (GitLab, Bitbucket...) or if
284+ you want to clone with SSH instead of HTTPS (`git@github.com:user/project.git`).
285+
286+ _NOTE: it's incompatible with setting the `REPO` variable. This setting will take precedence._
287+
288+- `BRANCH` (default: `master`): you can use this setting if you want to change the default branch to be
289+ checked out when cloning the repository. This might be useful for testing a Pull Request, or if you want to
290+ use a branch other than `master`.
291+
292+For example:
293+
294+```sh
295+REPO=apjanke/oh-my-zsh BRANCH=edge sh install.sh
296+```
297+
298+#### Manual Installation
299+
300+##### 1. Clone The Repository <!-- omit in toc -->
301+
302+```sh
303+git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh
304+```
305+
306+##### 2. _Optionally_, Backup Your Existing `~/.zshrc` File <!-- omit in toc -->
307+
308+```sh
309+cp ~/.zshrc ~/.zshrc.orig
310+```
311+
312+##### 3. Create A New Zsh Configuration File <!-- omit in toc -->
313+
314+You can create a new zsh config file by copying the template that we have included for you.
315+
316+```sh
317+cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
318+```
319+
320+##### 4. Change Your Default Shell <!-- omit in toc -->
321+
322+```sh
323+chsh -s $(which zsh)
324+```
325+
326+You must log out from your user session and log back in to see this change.
327+
328+##### 5. Initialize Your New Zsh Configuration <!-- omit in toc -->
329+
330+Once you open up a new terminal window, it should load zsh with Oh My Zsh's configuration.
331+
332+### Installation Problems
333+
334+If you have any hiccups installing, here are a few common fixes.
335+
336+- You _might_ need to modify your `PATH` in `~/.zshrc` if you're not able to find some commands after
337+ switching to `oh-my-zsh`.
338+- If you installed manually or changed the install location, check the `ZSH` environment variable in
339+ `~/.zshrc`.
340+
341+### Custom Plugins And Themes
342+
343+If you want to override any of the default behaviors, just add a new file (ending in `.zsh`) in the `custom/`
344+directory.
345+
346+If you have many functions that go well together, you can put them as a `XYZ.plugin.zsh` file in the
347+`custom/plugins/` directory and then enable this plugin.
348+
349+If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the
350+same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`.
351+
352+### Enable GNU ls In macOS And freeBSD Systems
353+
354+<a name="enable-gnu-ls"></a>
355+
356+The default behaviour in Oh My Zsh is to use BSD `ls` in macOS and FreeBSD systems. If GNU `ls` is installed
357+(as `gls` command), you can choose to use it instead. To do it, you can use zstyle-based config before
358+sourcing `oh-my-zsh.sh`:
359+
360+```zsh
361+zstyle ':omz:lib:theme-and-appearance' gnu-ls yes
362+```
363+
364+_Note: this is not compatible with `DISABLE_LS_COLORS=true`_
365+
366+### Skip Aliases
367+
368+<a name="remove-directories-aliases"></a>
369+
370+If you want to skip default Oh My Zsh aliases (those defined in `lib/*` files) or plugin aliases, you can use
371+the settings below in your `~/.zshrc` file, **before Oh My Zsh is loaded**. Note that there are many different
372+ways to skip aliases, depending on your needs.
373+
374+```sh
375+# Skip all aliases, in lib files and enabled plugins
376+zstyle ':omz:*' aliases no
377+
378+# Skip all aliases in lib files
379+zstyle ':omz:lib:*' aliases no
380+# Skip only aliases defined in the directories.zsh lib file
381+zstyle ':omz:lib:directories' aliases no
382+
383+# Skip all plugin aliases
384+zstyle ':omz:plugins:*' aliases no
385+# Skip only the aliases from the git plugin
386+zstyle ':omz:plugins:git' aliases no
387+```
388+
389+You can combine these in other ways taking into account that more specific scopes take precedence:
390+
391+```sh
392+# Skip all plugin aliases, except for the git plugin
393+zstyle ':omz:plugins:*' aliases no
394+zstyle ':omz:plugins:git' aliases yes
395+```
396+
397+A previous version of this feature was using the setting below, which has been removed:
398+
399+```sh
400+zstyle ':omz:directories' aliases no
401+```
402+
403+Instead, you can now use the following:
404+
405+```sh
406+zstyle ':omz:lib:directories' aliases no
407+```
408+
409+#### Notice <!-- omit in toc -->
410+
411+> This feature is currently in a testing phase and it may be subject to change in the future. It is also not
412+> currently compatible with plugin managers such as zpm or zinit, which don't source the init script
413+> (`oh-my-zsh.sh`) where this feature is implemented in.
414+
415+> It is also not currently aware of "aliases" that are defined as functions. Example of such are `gccd`,
416+> `ggf`, or `ggl` functions from the git plugin.
417+
418+### Async git prompt
419+
420+Async prompt functions are an experimental feature (included on April 3, 2024) that allows Oh My Zsh to render
421+prompt information asynchronously. This can improve prompt rendering performance, but it might not work well
422+with some setups. We hope that's not an issue, but if you're seeing problems with this new feature, you can
423+turn it off by setting the following in your .zshrc file, before Oh My Zsh is sourced:
424+
425+```sh
426+zstyle ':omz:alpha:lib:git' async-prompt no
427+```
428+
429+If your problem is that the git prompt just stopped appearing, you can try to force it by setting the following
430+configuration before `oh-my-zsh.sh` is sourced. If it still does not work, please open an issue with your
431+case.
432+
433+```sh
434+zstyle ':omz:alpha:lib:git' async-prompt force
435+```
436+
437+## Getting Updates
438+
439+By default, you will be prompted to check for updates every 2 weeks. You can choose other update modes by
440+adding a line to your `~/.zshrc` file, **before Oh My Zsh is loaded**:
441+
442+1. Automatic update without confirmation prompt:
443+
444+ ```sh
445+ zstyle ':omz:update' mode auto
446+ ```
447+
448+2. Just offer a reminder every few days, if there are updates available:
449+
450+ ```sh
451+ zstyle ':omz:update' mode reminder
452+ ```
453+
454+3. To disable automatic updates entirely:
455+
456+ ```sh
457+ zstyle ':omz:update' mode disabled
458+ ```
459+
460+NOTE: you can control how often Oh My Zsh checks for updates with the following setting:
461+
462+```sh
463+# This will check for updates every 7 days
464+zstyle ':omz:update' frequency 7
465+# This will check for updates every time you open the terminal (not recommended)
466+zstyle ':omz:update' frequency 0
467+```
468+
469+### Updates Verbosity
470+
471+You can also limit the update verbosity with the following settings:
472+
473+```sh
474+zstyle ':omz:update' verbose default # default update prompt
475+
476+zstyle ':omz:update' verbose minimal # only few lines
477+
478+zstyle ':omz:update' verbose silent # only errors
479+```
480+
481+### Manual Updates
482+
483+If you'd like to update at any point in time (maybe someone just released a new plugin and you don't want to
484+wait a week?) you just need to run:
485+
486+```sh
487+omz update
488+```
489+
490+> [!NOTE]
491+> If you want to automate this process in a script, you should call directly the `upgrade` script, like this:
492+>
493+> ```sh
494+> $ZSH/tools/upgrade.sh
495+> ```
496+>
497+> See more options in the [FAQ: How do I update Oh My Zsh?](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#how-do-i-update-oh-my-zsh).
498+>
499+> **USE OF `omz update --unattended` HAS BEEN REMOVED, AS IT HAS SIDE EFFECTS**.
500+
501+Magic! ๐ŸŽ‰
502+
503+## Uninstalling Oh My Zsh
504+
505+Oh My Zsh isn't for everyone. We'll miss you, but we want to make this an easy breakup.
506+
507+If you want to uninstall `oh-my-zsh`, just run `uninstall_oh_my_zsh` from the command-line. It will remove
508+itself and revert your previous `bash` or `zsh` configuration.
509+
510+## How Do I Contribute To Oh My Zsh?
511+
512+Before you participate in our delightful community, please read the [code of conduct](CODE_OF_CONDUCT.md).
513+
514+I'm far from being a [Zsh](https://www.zsh.org/) expert and suspect there are many ways to improve โ€“ if you
515+have ideas on how to make the configuration easier to maintain (and faster), don't hesitate to fork and send
516+pull requests!
517+
518+We also need people to test out pull requests. So take a look through
519+[the open issues](https://github.com/ohmyzsh/ohmyzsh/issues) and help where you can.
520+
521+See [Contributing](CONTRIBUTING.md) for more details.
522+
523+### Do Not Send Us Themes
524+
525+We have (more than) enough themes for the time being. Please add your theme to the
526+[external themes](https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes) wiki page.
527+
528+## Contributors
529+
530+Oh My Zsh has a vibrant community of happy users and delightful contributors. Without all the time and help
531+from our contributors, it wouldn't be so awesome.
532+
533+Thank you so much!
534+
535+<a href="https://github.com/ohmyzsh/ohmyzsh/graphs/contributors">
536+ <img src="https://contrib.rocks/image?repo=ohmyzsh/ohmyzsh" width="100%"/>
537+</a>
538+
539+## Follow Us
540+
541+We're on social media:
542+
543+- [@ohmyzsh](https://x.com/ohmyzsh) on X (formerly Twitter). You should follow it.
544+- [Facebook](https://www.facebook.com/Oh-My-Zsh-296616263819290/) poke us.
545+- [Instagram](https://www.instagram.com/_ohmyzsh/) tag us in your post showing Oh My Zsh!
546+- [Discord](https://discord.gg/ohmyzsh) to chat with us!
547+
548+## Merchandise
549+
550+We have
551+[stickers, shirts, and coffee mugs available](https://shop.planetargon.com/collections/oh-my-zsh?utm_source=github)
552+for you to show off your love of Oh My Zsh. Again, you will become the talk of the town!
553+
554+## License
555+
556+Oh My Zsh is released under the [MIT license](LICENSE.txt).
557+
558+## About Planet Argon
559+
560+![Planet Argon](https://pa-github-assets.s3.amazonaws.com/PARGON_logo_digital_COL-small.jpg)
561+
562+Oh My Zsh was started by the team at [Planet Argon](https://www.planetargon.com/?utm_source=github), a
563+[Ruby on Rails development agency](https://www.planetargon.com/services/ruby-on-rails-development?utm_source=github).
564+Check out our [other open source projects](https://www.planetargon.com/open-source?utm_source=github).
+23-0.oh-my-zsh/SECURITY.md
@@ -0,0 +1,23 @@
1+# Security Policy
2+
3+## Supported Versions
4+
5+At the moment Oh My Zsh only considers the very latest commit to be supported.
6+We combine that with our fast response to incidents and the automated updates
7+to minimize the time between vulnerability publication and patch release.
8+
9+| Version | Supported |
10+|:-------------- |:------------------ |
11+| master | :white_check_mark: |
12+| other commits | :x: |
13+
14+In the near future we will introduce versioning, so expect this section to change.
15+
16+## Reporting a Vulnerability
17+
18+**Do not submit an issue or pull request**: this might reveal the vulnerability.
19+
20+Instead, you should use the form to [privately report a vulnerability to us via GitHub](https://github.com/ohmyzsh/ohmyzsh/security/advisories/new)
21+or email the maintainers directly at: [**security@ohmyz.sh**](mailto:security@ohmyz.sh).
22+
23+We will deal with the vulnerability privately and submit a patch as soon as possible.
+145-0.oh-my-zsh/lib/async_prompt.zsh
@@ -0,0 +1,145 @@
1+# The async code is taken from
2+# https://github.com/zsh-users/zsh-autosuggestions/blob/master/src/async.zsh
3+# https://github.com/woefe/git-prompt.zsh/blob/master/git-prompt.zsh
4+
5+zmodload zsh/system
6+autoload -Uz is-at-least
7+
8+# For now, async prompt function handlers are set up like so:
9+# First, define the async function handler and register the handler
10+# with _omz_register_handler:
11+#
12+# function _git_prompt_status_async {
13+# # Do some expensive operation that outputs to stdout
14+# }
15+# _omz_register_handler _git_prompt_status_async
16+#
17+# Then add a stub prompt function in `$PROMPT` or similar prompt variables,
18+# which will show the output of "$_OMZ_ASYNC_OUTPUT[handler_name]":
19+#
20+# function git_prompt_status {
21+# echo -n $_OMZ_ASYNC_OUTPUT[_git_prompt_status_async]
22+# }
23+#
24+# RPROMPT='$(git_prompt_status)'
25+#
26+# This API is subject to change and optimization. Rely on it at your own risk.
27+
28+function _omz_register_handler {
29+ setopt localoptions noksharrays unset
30+ typeset -ga _omz_async_functions
31+ # we want to do nothing if there's no $1 function or we already set it up
32+ if [[ -z "$1" ]] || (( ! ${+functions[$1]} )) \
33+ || (( ${_omz_async_functions[(Ie)$1]} )); then
34+ return
35+ fi
36+ _omz_async_functions+=("$1")
37+ # let's add the hook to async_request if it's not there yet
38+ if (( ! ${precmd_functions[(Ie)_omz_async_request]} )) \
39+ && (( ${+functions[_omz_async_request]})); then
40+ autoload -Uz add-zsh-hook
41+ add-zsh-hook precmd _omz_async_request
42+ fi
43+}
44+
45+# Set up async handlers and callbacks
46+function _omz_async_request {
47+ setopt localoptions noksharrays unset
48+ local -i ret=$?
49+ typeset -gA _OMZ_ASYNC_FDS _OMZ_ASYNC_PIDS _OMZ_ASYNC_OUTPUT
50+
51+ # executor runs a subshell for all async requests based on key
52+ local handler
53+ for handler in ${_omz_async_functions}; do
54+ (( ${+functions[$handler]} )) || continue
55+
56+ local fd=${_OMZ_ASYNC_FDS[$handler]:--1}
57+ local pid=${_OMZ_ASYNC_PIDS[$handler]:--1}
58+
59+ # If we've got a pending request, cancel it
60+ if (( fd != -1 && pid != -1 )) && { true <&$fd } 2>/dev/null; then
61+ # Close the file descriptor and remove the handler
62+ exec {fd}<&-
63+ zle -F $fd
64+
65+ # Zsh will make a new process group for the child process only if job
66+ # control is enabled (MONITOR option)
67+ if [[ -o MONITOR ]]; then
68+ # Send the signal to the process group to kill any processes that may
69+ # have been forked by the async function handler
70+ kill -TERM -$pid 2>/dev/null
71+ else
72+ # Kill just the child process since it wasn't placed in a new process
73+ # group. If the async function handler forked any child processes they may
74+ # be orphaned and left behind.
75+ kill -TERM $pid 2>/dev/null
76+ fi
77+ fi
78+
79+ # Define global variables to store the file descriptor, PID and output
80+ _OMZ_ASYNC_FDS[$handler]=-1
81+ _OMZ_ASYNC_PIDS[$handler]=-1
82+
83+ # Fork a process to fetch the git status and open a pipe to read from it
84+ exec {fd}< <(
85+ # Tell parent process our PID
86+ builtin echo ${sysparams[pid]}
87+ # Set exit code for the handler if used
88+ () { return $ret }
89+ # Run the async function handler
90+ $handler
91+ )
92+
93+ # Save FD for handler
94+ _OMZ_ASYNC_FDS[$handler]=$fd
95+
96+ # There's a weird bug here where ^C stops working unless we force a fork
97+ # See https://github.com/zsh-users/zsh-autosuggestions/issues/364
98+ # and https://github.com/zsh-users/zsh-autosuggestions/pull/612
99+ is-at-least 5.8 || command true
100+
101+ # Save the PID from the handler child process
102+ read -u $fd "_OMZ_ASYNC_PIDS[$handler]"
103+
104+ # When the fd is readable, call the response handler
105+ zle -F "$fd" _omz_async_callback
106+ done
107+}
108+
109+# Called when new data is ready to be read from the pipe
110+function _omz_async_callback() {
111+ emulate -L zsh
112+
113+ local fd=$1 # First arg will be fd ready for reading
114+ local err=$2 # Second arg will be passed in case of error
115+
116+ if [[ -z "$err" || "$err" == "hup" ]]; then
117+ # Get handler name from fd
118+ local handler="${(k)_OMZ_ASYNC_FDS[(r)$fd]}"
119+
120+ # Store old output which is supposed to be already printed
121+ local old_output="${_OMZ_ASYNC_OUTPUT[$handler]}"
122+
123+ # Read output from fd
124+ IFS= read -r -u $fd -d '' "_OMZ_ASYNC_OUTPUT[$handler]"
125+
126+ # Repaint prompt if output has changed
127+ if [[ "$old_output" != "${_OMZ_ASYNC_OUTPUT[$handler]}" ]]; then
128+ zle .reset-prompt
129+ zle -R
130+ fi
131+
132+ # Close the fd
133+ exec {fd}<&-
134+ fi
135+
136+ # Always remove the handler
137+ zle -F "$fd"
138+
139+ # Unset global FD variable to prevent closing user created FDs in the precmd hook
140+ _OMZ_ASYNC_FDS[$handler]=-1
141+ _OMZ_ASYNC_PIDS[$handler]=-1
142+}
143+
144+autoload -Uz add-zsh-hook
145+add-zsh-hook precmd _omz_async_request
+14-0.oh-my-zsh/lib/bzr.zsh
@@ -0,0 +1,14 @@
1+## Bazaar integration
2+## Just works with the GIT integration. Add $(bzr_prompt_info) to the PROMPT
3+function bzr_prompt_info() {
4+ local bzr_branch
5+ bzr_branch=$(bzr nick 2>/dev/null) || return
6+
7+ if [[ -n "$bzr_branch" ]]; then
8+ local bzr_dirty=""
9+ if [[ -n $(bzr status 2>/dev/null) ]]; then
10+ bzr_dirty=" %{$fg[red]%}*%{$reset_color%}"
11+ fi
12+ printf "%s%s%s%s" "$ZSH_THEME_SCM_PROMPT_PREFIX" "bzr::${bzr_branch##*:}" "$bzr_dirty" "$ZSH_THEME_GIT_PROMPT_SUFFIX"
13+ fi
14+}
+878-0.oh-my-zsh/lib/cli.zsh
@@ -0,0 +1,878 @@
1+#!/usr/bin/env zsh
2+
3+function omz {
4+ setopt localoptions noksharrays
5+ [[ $# -gt 0 ]] || {
6+ _omz::help
7+ return 1
8+ }
9+
10+ local command="$1"
11+ shift
12+
13+ # Subcommand functions start with _ so that they don't
14+ # appear as completion entries when looking for `omz`
15+ (( ${+functions[_omz::$command]} )) || {
16+ _omz::help
17+ return 1
18+ }
19+
20+ _omz::$command "$@"
21+}
22+
23+function _omz {
24+ local -a cmds subcmds
25+ cmds=(
26+ 'changelog:Print the changelog'
27+ 'help:Usage information'
28+ 'plugin:Manage plugins'
29+ 'pr:Manage Oh My Zsh Pull Requests'
30+ 'reload:Reload the current zsh session'
31+ 'theme:Manage themes'
32+ 'update:Update Oh My Zsh'
33+ 'version:Show the version'
34+ )
35+
36+ if (( CURRENT == 2 )); then
37+ _describe 'command' cmds
38+ elif (( CURRENT == 3 )); then
39+ case "$words[2]" in
40+ changelog) local -a refs
41+ refs=("${(@f)$(builtin cd -q "$ZSH"; command git for-each-ref --format="%(refname:short):%(subject)" refs/heads refs/tags)}")
42+ _describe 'command' refs ;;
43+ plugin) subcmds=(
44+ 'disable:Disable plugin(s)'
45+ 'enable:Enable plugin(s)'
46+ 'info:Get plugin information'
47+ 'list:List plugins'
48+ 'load:Load plugin(s)'
49+ )
50+ _describe 'command' subcmds ;;
51+ pr) subcmds=('clean:Delete all Pull Request branches' 'test:Test a Pull Request')
52+ _describe 'command' subcmds ;;
53+ theme) subcmds=('list:List themes' 'set:Set a theme in your .zshrc file' 'use:Load a theme')
54+ _describe 'command' subcmds ;;
55+ esac
56+ elif (( CURRENT == 4 )); then
57+ case "${words[2]}::${words[3]}" in
58+ plugin::(disable|enable|load))
59+ local -aU valid_plugins
60+
61+ if [[ "${words[3]}" = disable ]]; then
62+ # if command is "disable", only offer already enabled plugins
63+ valid_plugins=($plugins)
64+ else
65+ valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
66+ # if command is "enable", remove already enabled plugins
67+ [[ "${words[3]}" = enable ]] && valid_plugins=(${valid_plugins:|plugins})
68+ fi
69+
70+ _describe 'plugin' valid_plugins ;;
71+ plugin::info)
72+ local -aU plugins
73+ plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
74+ _describe 'plugin' plugins ;;
75+ theme::(set|use))
76+ local -aU themes
77+ themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r) "$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::))
78+ _describe 'theme' themes ;;
79+ esac
80+ elif (( CURRENT > 4 )); then
81+ case "${words[2]}::${words[3]}" in
82+ plugin::(enable|disable|load))
83+ local -aU valid_plugins
84+
85+ if [[ "${words[3]}" = disable ]]; then
86+ # if command is "disable", only offer already enabled plugins
87+ valid_plugins=($plugins)
88+ else
89+ valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
90+ # if command is "enable", remove already enabled plugins
91+ [[ "${words[3]}" = enable ]] && valid_plugins=(${valid_plugins:|plugins})
92+ fi
93+
94+ # Remove plugins already passed as arguments
95+ # NOTE: $(( CURRENT - 1 )) is the last plugin argument completely passed, i.e. that which
96+ # has a space after them. This is to avoid removing plugins partially passed, which makes
97+ # the completion not add a space after the completed plugin.
98+ local -a args
99+ args=(${words[4,$(( CURRENT - 1))]})
100+ valid_plugins=(${valid_plugins:|args})
101+
102+ _describe 'plugin' valid_plugins ;;
103+ esac
104+ fi
105+
106+ return 0
107+}
108+
109+# If run from a script, do not set the completion function
110+if (( ${+functions[compdef]} )); then
111+ compdef _omz omz
112+fi
113+
114+## Utility functions
115+
116+function _omz::confirm {
117+ # If question supplied, ask it before reading the answer
118+ # NOTE: uses the logname of the caller function
119+ if [[ -n "$1" ]]; then
120+ _omz::log prompt "$1" "${${functrace[1]#_}%:*}"
121+ fi
122+
123+ # Read one character
124+ read -r -k 1
125+
126+ # If no newline entered, add a newline
127+ if [[ "$REPLY" != $'\n' ]]; then
128+ echo
129+ fi
130+}
131+
132+function _omz::log {
133+ # if promptsubst is set, a message with `` or $()
134+ # will be run even if quoted due to `print -P`
135+ setopt localoptions nopromptsubst
136+
137+ # $1 = info|warn|error|debug
138+ # $2 = text
139+ # $3 = (optional) name of the logger
140+
141+ local logtype=$1
142+ local logname=${3:-${${functrace[1]#_}%:*}}
143+
144+ # Don't print anything if debug is not active
145+ if [[ $logtype = debug && -z $_OMZ_DEBUG ]]; then
146+ return
147+ fi
148+
149+ # Choose coloring based on log type
150+ case "$logtype" in
151+ prompt) print -Pn "%S%F{blue}$logname%f%s: $2" ;;
152+ debug) print -P "%F{white}$logname%f: $2" ;;
153+ info) print -P "%F{green}$logname%f: $2" ;;
154+ warn) print -P "%S%F{yellow}$logname%f%s: $2" ;;
155+ error) print -P "%S%F{red}$logname%f%s: $2" ;;
156+ esac >&2
157+}
158+
159+## User-facing commands
160+
161+function _omz::help {
162+ cat >&2 <<EOF
163+Usage: omz <command> [options]
164+
165+Available commands:
166+
167+ help Print this help message
168+ changelog Print the changelog
169+ plugin <command> Manage plugins
170+ pr <command> Manage Oh My Zsh Pull Requests
171+ reload Reload the current zsh session
172+ theme <command> Manage themes
173+ update Update Oh My Zsh
174+ version Show the version
175+
176+EOF
177+}
178+
179+function _omz::changelog {
180+ local version=${1:-HEAD} format=${3:-"--text"}
181+
182+ if (
183+ builtin cd -q "$ZSH"
184+ ! command git show-ref --verify refs/heads/$version && \
185+ ! command git show-ref --verify refs/tags/$version && \
186+ ! command git rev-parse --verify "${version}^{commit}"
187+ ) &>/dev/null; then
188+ cat >&2 <<EOF
189+Usage: ${(j: :)${(s.::.)0#_}} [version]
190+
191+NOTE: <version> must be a valid branch, tag or commit.
192+EOF
193+ return 1
194+ fi
195+
196+ ZSH="$ZSH" command zsh -f "$ZSH/tools/changelog.sh" "$version" "${2:-}" "$format"
197+}
198+
199+function _omz::plugin {
200+ (( $# > 0 && $+functions[$0::$1] )) || {
201+ cat >&2 <<EOF
202+Usage: ${(j: :)${(s.::.)0#_}} <command> [options]
203+
204+Available commands:
205+
206+ disable <plugin> Disable plugin(s)
207+ enable <plugin> Enable plugin(s)
208+ info <plugin> Get information of a plugin
209+ list List all available Oh My Zsh plugins
210+ load <plugin> Load plugin(s)
211+
212+EOF
213+ return 1
214+ }
215+
216+ local command="$1"
217+ shift
218+
219+ $0::$command "$@"
220+}
221+
222+function _omz::plugin::disable {
223+ if [[ -z "$1" ]]; then
224+ echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <plugin> [...]"
225+ return 1
226+ fi
227+
228+ # Check that plugin is in $plugins
229+ local -a dis_plugins
230+ for plugin in "$@"; do
231+ if [[ ${plugins[(Ie)$plugin]} -eq 0 ]]; then
232+ _omz::log warn "plugin '$plugin' is not enabled."
233+ continue
234+ fi
235+ dis_plugins+=("$plugin")
236+ done
237+
238+ # Exit if there are no enabled plugins to disable
239+ if [[ ${#dis_plugins} -eq 0 ]]; then
240+ return 1
241+ fi
242+
243+ # Remove plugins substitution awk script
244+ local awk_subst_plugins="\
245+ gsub(/[ \t]+(${(j:|:)dis_plugins})[ \t]+/, \" \") # with spaces before or after
246+ gsub(/[ \t]+(${(j:|:)dis_plugins})$/, \"\") # with spaces before and EOL
247+ gsub(/^(${(j:|:)dis_plugins})[ \t]+/, \"\") # with BOL and spaces after
248+
249+ gsub(/\((${(j:|:)dis_plugins})[ \t]+/, \"(\") # with parenthesis before and spaces after
250+ gsub(/[ \t]+(${(j:|:)dis_plugins})\)/, \")\") # with spaces before or parenthesis after
251+ gsub(/\((${(j:|:)dis_plugins})\)/, \"()\") # with only parentheses
252+
253+ gsub(/^(${(j:|:)dis_plugins})\)/, \")\") # with BOL and closing parenthesis
254+ gsub(/\((${(j:|:)dis_plugins})$/, \"(\") # with opening parenthesis and EOL
255+"
256+
257+ # Disable plugins awk script
258+ local awk_script="
259+# if plugins=() is in oneline form, substitute disabled plugins and go to next line
260+/^[ \t]*plugins=\([^#]+\).*\$/ {
261+ $awk_subst_plugins
262+ print \$0
263+ next
264+}
265+
266+# if plugins=() is in multiline form, enable multi flag and disable plugins if they're there
267+/^[ \t]*plugins=\(/ {
268+ multi=1
269+ $awk_subst_plugins
270+ print \$0
271+ next
272+}
273+
274+# if multi flag is enabled and we find a valid closing parenthesis, remove plugins and disable multi flag
275+multi == 1 && /^[^#]*\)/ {
276+ multi=0
277+ $awk_subst_plugins
278+ print \$0
279+ next
280+}
281+
282+multi == 1 && length(\$0) > 0 {
283+ $awk_subst_plugins
284+ if (length(\$0) > 0) print \$0
285+ next
286+}
287+
288+{ print \$0 }
289+"
290+
291+ local zdot="${ZDOTDIR:-$HOME}"
292+ local zshrc="${${:-"${zdot}/.zshrc"}:A}"
293+ awk "$awk_script" "$zshrc" > "$zdot/.zshrc.new" \
294+ && command cp -f "$zshrc" "$zdot/.zshrc.bck" \
295+ && command mv -f "$zdot/.zshrc.new" "$zshrc"
296+
297+ # Exit if the new .zshrc file wasn't created correctly
298+ [[ $? -eq 0 ]] || {
299+ local ret=$?
300+ _omz::log error "error disabling plugins."
301+ return $ret
302+ }
303+
304+ # Exit if the new .zshrc file has syntax errors
305+ if ! command zsh -n "$zdot/.zshrc"; then
306+ _omz::log error "broken syntax in '"${zdot/#$HOME/\~}/.zshrc"'. Rolling back changes..."
307+ command mv -f "$zdot/.zshrc.bck" "$zshrc"
308+ return 1
309+ fi
310+
311+ # Restart the zsh session if there were no errors
312+ _omz::log info "plugins disabled: ${(j:, :)dis_plugins}."
313+
314+ # Only reload zsh if run in an interactive session
315+ [[ ! -o interactive ]] || _omz::reload
316+}
317+
318+function _omz::plugin::enable {
319+ if [[ -z "$1" ]]; then
320+ echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <plugin> [...]"
321+ return 1
322+ fi
323+
324+ # Check that plugin is not in $plugins
325+ local -a add_plugins
326+ for plugin in "$@"; do
327+ if [[ ${plugins[(Ie)$plugin]} -ne 0 ]]; then
328+ _omz::log warn "plugin '$plugin' is already enabled."
329+ continue
330+ fi
331+ add_plugins+=("$plugin")
332+ done
333+
334+ # Exit if there are no plugins to enable
335+ if [[ ${#add_plugins} -eq 0 ]]; then
336+ return 1
337+ fi
338+
339+ # Enable plugins awk script
340+ local awk_script="
341+# if plugins=() is in oneline form, substitute ) with new plugins and go to the next line
342+/^[ \t]*plugins=\([^#]+\).*\$/ {
343+ sub(/\)/, \" $add_plugins&\")
344+ print \$0
345+ next
346+}
347+
348+# if plugins=() is in multiline form, enable multi flag and indent by default with 2 spaces
349+/^[ \t]*plugins=\(/ {
350+ multi=1
351+ indent=\" \"
352+ print \$0
353+ next
354+}
355+
356+# if multi flag is enabled and we find a valid closing parenthesis,
357+# add new plugins with proper indent and disable multi flag
358+multi == 1 && /^[^#]*\)/ {
359+ multi=0
360+ split(\"$add_plugins\",p,\" \")
361+ for (i in p) {
362+ print indent p[i]
363+ }
364+ print \$0
365+ next
366+}
367+
368+# if multi flag is enabled and we didnt find a closing parenthesis,
369+# get the indentation level to match when adding plugins
370+multi == 1 && /^[^#]*/ {
371+ indent=\"\"
372+ for (i = 1; i <= length(\$0); i++) {
373+ char=substr(\$0, i, 1)
374+ if (char == \" \" || char == \"\t\") {
375+ indent = indent char
376+ } else {
377+ break
378+ }
379+ }
380+}
381+
382+{ print \$0 }
383+"
384+
385+ local zdot="${ZDOTDIR:-$HOME}"
386+ local zshrc="${${:-"${zdot}/.zshrc"}:A}"
387+ awk "$awk_script" "$zshrc" > "$zdot/.zshrc.new" \
388+ && command cp -f "$zshrc" "$zdot/.zshrc.bck" \
389+ && command mv -f "$zdot/.zshrc.new" "$zshrc"
390+
391+ # Exit if the new .zshrc file wasn't created correctly
392+ [[ $? -eq 0 ]] || {
393+ local ret=$?
394+ _omz::log error "error enabling plugins."
395+ return $ret
396+ }
397+
398+ # Exit if the new .zshrc file has syntax errors
399+ if ! command zsh -n "$zdot/.zshrc"; then
400+ _omz::log error "broken syntax in '"${zdot/#$HOME/\~}/.zshrc"'. Rolling back changes..."
401+ command mv -f "$zdot/.zshrc.bck" "$zshrc"
402+ return 1
403+ fi
404+
405+ # Restart the zsh session if there were no errors
406+ _omz::log info "plugins enabled: ${(j:, :)add_plugins}."
407+
408+ # Only reload zsh if run in an interactive session
409+ [[ ! -o interactive ]] || _omz::reload
410+}
411+
412+function _omz::plugin::info {
413+ if [[ -z "$1" ]]; then
414+ echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <plugin>"
415+ return 1
416+ fi
417+
418+ local readme
419+ for readme in "$ZSH_CUSTOM/plugins/$1/README.md" "$ZSH/plugins/$1/README.md"; do
420+ if [[ -f "$readme" ]]; then
421+ # If being piped, just cat the README
422+ if [[ ! -t 1 ]]; then
423+ cat "$readme"
424+ return $?
425+ fi
426+
427+ # Enrich the README display depending on the tools we have
428+ # - glow: https://github.com/charmbracelet/glow
429+ # - bat: https://github.com/sharkdp/bat
430+ # - less: typical pager command
431+ case 1 in
432+ ${+commands[glow]}) glow -p "$readme" ;;
433+ ${+commands[bat]}) bat -l md --style plain "$readme" ;;
434+ ${+commands[less]}) less "$readme" ;;
435+ *) cat "$readme" ;;
436+ esac
437+ return $?
438+ fi
439+ done
440+
441+ if [[ -d "$ZSH_CUSTOM/plugins/$1" || -d "$ZSH/plugins/$1" ]]; then
442+ _omz::log error "the '$1' plugin doesn't have a README file"
443+ else
444+ _omz::log error "'$1' plugin not found"
445+ fi
446+
447+ return 1
448+}
449+
450+function _omz::plugin::list {
451+ local -a custom_plugins builtin_plugins
452+ custom_plugins=("$ZSH_CUSTOM"/plugins/*(-/N:t))
453+ builtin_plugins=("$ZSH"/plugins/*(-/N:t))
454+
455+ # If the command is being piped, print all found line by line
456+ if [[ ! -t 1 ]]; then
457+ print -l ${(q-)custom_plugins} ${(q-)builtin_plugins}
458+ return
459+ fi
460+
461+ if (( ${#custom_plugins} )); then
462+ print -P "%U%BCustom plugins%b%u:"
463+ print -lac ${(q-)custom_plugins}
464+ fi
465+
466+ if (( ${#builtin_plugins} )); then
467+ (( ${#custom_plugins} )) && echo # add a line of separation
468+
469+ print -P "%U%BBuilt-in plugins%b%u:"
470+ print -lac ${(q-)builtin_plugins}
471+ fi
472+}
473+
474+function _omz::plugin::load {
475+ if [[ -z "$1" ]]; then
476+ echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <plugin> [...]"
477+ return 1
478+ fi
479+
480+ local plugin base has_completion=0
481+ for plugin in "$@"; do
482+ if [[ -d "$ZSH_CUSTOM/plugins/$plugin" ]]; then
483+ base="$ZSH_CUSTOM/plugins/$plugin"
484+ elif [[ -d "$ZSH/plugins/$plugin" ]]; then
485+ base="$ZSH/plugins/$plugin"
486+ else
487+ _omz::log warn "plugin '$plugin' not found"
488+ continue
489+ fi
490+
491+ # Check if its a valid plugin
492+ if [[ ! -f "$base/_$plugin" && ! -f "$base/$plugin.plugin.zsh" ]]; then
493+ _omz::log warn "'$plugin' is not a valid plugin"
494+ continue
495+ # It is a valid plugin, add its directory to $fpath unless it is already there
496+ elif (( ! ${fpath[(Ie)$base]} )); then
497+ fpath=("$base" $fpath)
498+ fi
499+
500+ # Check if it has completion to reload compinit
501+ local -a comp_files
502+ comp_files=($base/_*(N))
503+ has_completion=$(( $#comp_files > 0 ))
504+
505+ # Load the plugin
506+ if [[ -f "$base/$plugin.plugin.zsh" ]]; then
507+ source "$base/$plugin.plugin.zsh"
508+ fi
509+ done
510+
511+ # If we have completion, we need to reload the completion
512+ # We pass -D to avoid generating a new dump file, which would overwrite our
513+ # current one for the next session (and we don't want that because we're not
514+ # actually enabling the plugins for the next session).
515+ # Note that we still have to pass -d "$_comp_dumpfile", so that compinit
516+ # doesn't use the default zcompdump location (${ZDOTDIR:-$HOME}/.zcompdump).
517+ if (( has_completion )); then
518+ compinit -D -d "$_comp_dumpfile"
519+ fi
520+}
521+
522+function _omz::pr {
523+ (( $# > 0 && $+functions[$0::$1] )) || {
524+ cat >&2 <<EOF
525+Usage: ${(j: :)${(s.::.)0#_}} <command> [options]
526+
527+Available commands:
528+
529+ clean Delete all PR branches (ohmyzsh/pull-*)
530+ test <PR_number_or_URL> Fetch PR #NUMBER and rebase against master
531+
532+EOF
533+ return 1
534+ }
535+
536+ local command="$1"
537+ shift
538+
539+ $0::$command "$@"
540+}
541+
542+function _omz::pr::clean {
543+ (
544+ set -e
545+ builtin cd -q "$ZSH"
546+
547+ # Check if there are PR branches
548+ local fmt branches
549+ fmt="%(color:bold blue)%(align:18,right)%(refname:short)%(end)%(color:reset) %(color:dim bold red)%(objectname:short)%(color:reset) %(color:yellow)%(contents:subject)"
550+ branches="$(command git for-each-ref --sort=-committerdate --color --format="$fmt" "refs/heads/ohmyzsh/pull-*")"
551+
552+ # Exit if there are no PR branches
553+ if [[ -z "$branches" ]]; then
554+ _omz::log info "there are no Pull Request branches to remove."
555+ return
556+ fi
557+
558+ # Print found PR branches
559+ echo "$branches\n"
560+ # Confirm before removing the branches
561+ _omz::confirm "do you want remove these Pull Request branches? [Y/n] "
562+ # Only proceed if the answer is a valid yes option
563+ [[ "$REPLY" != [yY$'\n'] ]] && return
564+
565+ _omz::log info "removing all Oh My Zsh Pull Request branches..."
566+ command git branch --list 'ohmyzsh/pull-*' | while read branch; do
567+ command git branch -D "$branch"
568+ done
569+ )
570+}
571+
572+function _omz::pr::test {
573+ # Allow $1 to be a URL to the pull request
574+ if [[ "$1" = https://* ]]; then
575+ 1="${1:t}"
576+ fi
577+
578+ # Check the input
579+ if ! [[ -n "$1" && "$1" =~ ^[[:digit:]]+$ ]]; then
580+ echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <PR_NUMBER_or_URL>"
581+ return 1
582+ fi
583+
584+ # Save current git HEAD
585+ local branch
586+ branch=$(builtin cd -q "$ZSH"; git symbolic-ref --short HEAD) || {
587+ _omz::log error "error when getting the current git branch. Aborting..."
588+ return 1
589+ }
590+
591+
592+ # Fetch PR onto ohmyzsh/pull-<PR_NUMBER> branch and rebase against master
593+ # If any of these operations fail, undo the changes made
594+ (
595+ set -e
596+ builtin cd -q "$ZSH"
597+
598+ # Get the ohmyzsh git remote
599+ command git remote -v | while read remote url _; do
600+ case "$url" in
601+ https://github.com/ohmyzsh/ohmyzsh(|.git)) found=1; break ;;
602+ git@github.com:ohmyzsh/ohmyzsh(|.git)) found=1; break ;;
603+ esac
604+ done
605+
606+ (( $found )) || {
607+ _omz::log error "could not found the ohmyzsh git remote. Aborting..."
608+ return 1
609+ }
610+
611+ # Fetch pull request head
612+ _omz::log info "fetching PR #$1 to ohmyzsh/pull-$1..."
613+ command git fetch -f "$remote" refs/pull/$1/head:ohmyzsh/pull-$1 || {
614+ _omz::log error "error when trying to fetch PR #$1."
615+ return 1
616+ }
617+
618+ # Rebase pull request branch against the current master
619+ _omz::log info "rebasing PR #$1..."
620+ local ret gpgsign
621+ {
622+ # Back up commit.gpgsign setting: use --local to get the current repository
623+ # setting, not the global one. If --local is not a known option, it will
624+ # exit with a 129 status code.
625+ gpgsign=$(command git config --local commit.gpgsign 2>/dev/null) || ret=$?
626+ [[ $ret -ne 129 ]] || gpgsign=$(command git config commit.gpgsign 2>/dev/null)
627+ command git config commit.gpgsign false
628+
629+ command git rebase master ohmyzsh/pull-$1 || {
630+ command git rebase --abort &>/dev/null
631+ _omz::log warn "could not rebase PR #$1 on top of master."
632+ _omz::log warn "you might not see the latest stable changes."
633+ _omz::log info "run \`zsh\` to test the changes."
634+ return 1
635+ }
636+ } always {
637+ case "$gpgsign" in
638+ "") command git config --unset commit.gpgsign ;;
639+ *) command git config commit.gpgsign "$gpgsign" ;;
640+ esac
641+ }
642+
643+ _omz::log info "fetch of PR #${1} successful."
644+ )
645+
646+ # If there was an error, abort running zsh to test the PR
647+ [[ $? -eq 0 ]] || return 1
648+
649+ # Run zsh to test the changes
650+ _omz::log info "running \`zsh\` to test the changes. Run \`exit\` to go back."
651+ command zsh -l
652+
653+ # After testing, go back to the previous HEAD if the user wants
654+ _omz::confirm "do you want to go back to the previous branch? [Y/n] "
655+ # Only proceed if the answer is a valid yes option
656+ [[ "$REPLY" != [yY$'\n'] ]] && return
657+
658+ (
659+ set -e
660+ builtin cd -q "$ZSH"
661+
662+ command git checkout "$branch" -- || {
663+ _omz::log error "could not go back to the previous branch ('$branch')."
664+ return 1
665+ }
666+ )
667+}
668+
669+function _omz::reload {
670+ # Delete current completion cache
671+ command rm -f $_comp_dumpfile $ZSH_COMPDUMP
672+
673+ # Old zsh versions don't have ZSH_ARGZERO
674+ local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}"
675+ # Check whether to run a login shell
676+ [[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh"
677+}
678+
679+function _omz::theme {
680+ (( $# > 0 && $+functions[$0::$1] )) || {
681+ cat >&2 <<EOF
682+Usage: ${(j: :)${(s.::.)0#_}} <command> [options]
683+
684+Available commands:
685+
686+ list List all available Oh My Zsh themes
687+ set <theme> Set a theme in your .zshrc file
688+ use <theme> Load a theme
689+
690+EOF
691+ return 1
692+ }
693+
694+ local command="$1"
695+ shift
696+
697+ $0::$command "$@"
698+}
699+
700+function _omz::theme::list {
701+ local -a custom_themes builtin_themes
702+ custom_themes=("$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::))
703+ builtin_themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r))
704+
705+ # If the command is being piped, print all found line by line
706+ if [[ ! -t 1 ]]; then
707+ print -l ${(q-)custom_themes} ${(q-)builtin_themes}
708+ return
709+ fi
710+
711+ # Print theme in use
712+ if [[ -n "$ZSH_THEME" ]]; then
713+ print -Pn "%U%BCurrent theme%b%u: "
714+ [[ $ZSH_THEME = random ]] && echo "$RANDOM_THEME (via random)" || echo "$ZSH_THEME"
715+ echo
716+ fi
717+
718+ # Print custom themes if there are any
719+ if (( ${#custom_themes} )); then
720+ print -P "%U%BCustom themes%b%u:"
721+ print -lac ${(q-)custom_themes}
722+ echo
723+ fi
724+
725+ # Print built-in themes
726+ print -P "%U%BBuilt-in themes%b%u:"
727+ print -lac ${(q-)builtin_themes}
728+}
729+
730+function _omz::theme::set {
731+ if [[ -z "$1" ]]; then
732+ echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <theme>"
733+ return 1
734+ fi
735+
736+ # Check that theme exists
737+ if [[ ! -f "$ZSH_CUSTOM/$1.zsh-theme" ]] \
738+ && [[ ! -f "$ZSH_CUSTOM/themes/$1.zsh-theme" ]] \
739+ && [[ ! -f "$ZSH/themes/$1.zsh-theme" ]]; then
740+ _omz::log error "%B$1%b theme not found"
741+ return 1
742+ fi
743+
744+ # Enable theme in .zshrc
745+ local awk_script='
746+!set && /^[ \t]*ZSH_THEME=[^#]+.*$/ {
747+ set=1
748+ sub(/^[ \t]*ZSH_THEME=[^#]+.*$/, "ZSH_THEME=\"'$1'\" # set by `omz`")
749+ print $0
750+ next
751+}
752+
753+{ print $0 }
754+
755+END {
756+ # If no ZSH_THEME= line was found, return an error
757+ if (!set) exit 1
758+}
759+'
760+
761+ local zdot="${ZDOTDIR:-$HOME}"
762+ local zshrc="${${:-"${zdot}/.zshrc"}:A}"
763+ awk "$awk_script" "$zshrc" > "$zdot/.zshrc.new" \
764+ || {
765+ # Prepend ZSH_THEME= line to .zshrc if it doesn't exist
766+ cat <<EOF
767+ZSH_THEME="$1" # set by \`omz\`
768+
769+EOF
770+ cat "$zdot/.zshrc"
771+ } > "$zdot/.zshrc.new" \
772+ && command cp -f "$zshrc" "$zdot/.zshrc.bck" \
773+ && command mv -f "$zdot/.zshrc.new" "$zshrc"
774+
775+ # Exit if the new .zshrc file wasn't created correctly
776+ [[ $? -eq 0 ]] || {
777+ local ret=$?
778+ _omz::log error "error setting theme."
779+ return $ret
780+ }
781+
782+ # Exit if the new .zshrc file has syntax errors
783+ if ! command zsh -n "$zdot/.zshrc"; then
784+ _omz::log error "broken syntax in '"${zdot/#$HOME/\~}/.zshrc"'. Rolling back changes..."
785+ command mv -f "$zdot/.zshrc.bck" "$zshrc"
786+ return 1
787+ fi
788+
789+ # Restart the zsh session if there were no errors
790+ _omz::log info "'$1' theme set correctly."
791+
792+ # Only reload zsh if run in an interactive session
793+ [[ ! -o interactive ]] || _omz::reload
794+}
795+
796+function _omz::theme::use {
797+ if [[ -z "$1" ]]; then
798+ echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <theme>"
799+ return 1
800+ fi
801+
802+ # Respect compatibility with old lookup order
803+ if [[ -f "$ZSH_CUSTOM/$1.zsh-theme" ]]; then
804+ source "$ZSH_CUSTOM/$1.zsh-theme"
805+ elif [[ -f "$ZSH_CUSTOM/themes/$1.zsh-theme" ]]; then
806+ source "$ZSH_CUSTOM/themes/$1.zsh-theme"
807+ elif [[ -f "$ZSH/themes/$1.zsh-theme" ]]; then
808+ source "$ZSH/themes/$1.zsh-theme"
809+ else
810+ _omz::log error "%B$1%b theme not found"
811+ return 1
812+ fi
813+
814+ # Update theme settings
815+ ZSH_THEME="$1"
816+ [[ $1 = random ]] || unset RANDOM_THEME
817+}
818+
819+function _omz::update {
820+ # Check if git command is available
821+ (( $+commands[git] )) || {
822+ _omz::log error "git is not installed. Aborting..."
823+ return 1
824+ }
825+
826+ # Check if --unattended was passed
827+ [[ "$1" != --unattended ]] || {
828+ _omz::log error "the \`\e[2m--unattended\e[0m\` flag is no longer supported, use the \`\e[2mupgrade.sh\e[0m\` script instead."
829+ _omz::log error "for more information see https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#how-do-i-update-oh-my-zsh"
830+ return 1
831+ }
832+
833+ local last_commit=$(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null)
834+ [[ $? -eq 0 ]] || {
835+ _omz::log error "\`$ZSH\` is not a git directory. Aborting..."
836+ return 1
837+ }
838+
839+ # Run update script
840+ zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default
841+ ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode || return $?
842+
843+ # Update last updated file
844+ zmodload zsh/datetime
845+ echo "LAST_EPOCH=$(( EPOCHSECONDS / 60 / 60 / 24 ))" >! "${ZSH_CACHE_DIR}/.zsh-update"
846+ # Remove update lock if it exists
847+ command rm -rf "$ZSH/log/update.lock"
848+
849+ # Restart the zsh session if there were changes
850+ if [[ "$(builtin cd -q "$ZSH"; git rev-parse HEAD)" != "$last_commit" ]]; then
851+ # Old zsh versions don't have ZSH_ARGZERO
852+ local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}"
853+ # Check whether to run a login shell
854+ [[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh"
855+ fi
856+}
857+
858+function _omz::version {
859+ (
860+ builtin cd -q "$ZSH"
861+
862+ # Get the version name:
863+ # 1) try tag-like version
864+ # 2) try branch name
865+ # 3) try name-rev (tag~<rev> or branch~<rev>)
866+ local version
867+ version=$(command git describe --tags HEAD 2>/dev/null) \
868+ || version=$(command git symbolic-ref --quiet --short HEAD 2>/dev/null) \
869+ || version=$(command git name-rev --no-undefined --name-only --exclude="remotes/*" HEAD 2>/dev/null) \
870+ || version="<detached>"
871+
872+ # Get short hash for the current HEAD
873+ local commit=$(command git rev-parse --short HEAD 2>/dev/null)
874+
875+ # Show version and commit hash
876+ printf "%s (%s)\n" "$version" "$commit"
877+ )
878+}
+107-0.oh-my-zsh/lib/clipboard.zsh
@@ -0,0 +1,107 @@
1+# System clipboard integration
2+#
3+# This file has support for doing system clipboard copy and paste operations
4+# from the command line in a generic cross-platform fashion.
5+#
6+# This is uses essentially the same heuristic as neovim, with the additional
7+# special support for Cygwin.
8+# See: https://github.com/neovim/neovim/blob/e682d799fa3cf2e80a02d00c6ea874599d58f0e7/runtime/autoload/provider/clipboard.vim#L55-L121
9+#
10+# - pbcopy, pbpaste (macOS)
11+# - cygwin (Windows running Cygwin)
12+# - wl-copy, wl-paste (if $WAYLAND_DISPLAY is set)
13+# - xsel (if $DISPLAY is set)
14+# - xclip (if $DISPLAY is set)
15+# - lemonade (for SSH) https://github.com/pocke/lemonade
16+# - doitclient (for SSH) http://www.chiark.greenend.org.uk/~sgtatham/doit/
17+# - win32yank (Windows)
18+# - tmux (if $TMUX is set)
19+#
20+# Defines two functions, clipcopy and clippaste, based on the detected platform.
21+##
22+#
23+# clipcopy - Copy data to clipboard
24+#
25+# Usage:
26+#
27+# <command> | clipcopy - copies stdin to clipboard
28+#
29+# clipcopy <file> - copies a file's contents to clipboard
30+#
31+##
32+#
33+# clippaste - "Paste" data from clipboard to stdout
34+#
35+# Usage:
36+#
37+# clippaste - writes clipboard's contents to stdout
38+#
39+# clippaste | <command> - pastes contents and pipes it to another process
40+#
41+# clippaste > <file> - paste contents to a file
42+#
43+# Examples:
44+#
45+# # Pipe to another process
46+# clippaste | grep foo
47+#
48+# # Paste to a file
49+# clippaste > file.txt
50+#
51+function detect-clipboard() {
52+ emulate -L zsh
53+
54+ if [[ "${OSTYPE}" == darwin* ]] && (( ${+commands[pbcopy]} )) && (( ${+commands[pbpaste]} )); then
55+ function clipcopy() { cat "${1:-/dev/stdin}" | pbcopy; }
56+ function clippaste() { pbpaste; }
57+ elif [[ "${OSTYPE}" == (cygwin|msys)* ]]; then
58+ function clipcopy() { cat "${1:-/dev/stdin}" > /dev/clipboard; }
59+ function clippaste() { cat /dev/clipboard; }
60+ elif (( $+commands[clip.exe] )) && (( $+commands[powershell.exe] )); then
61+ function clipcopy() { cat "${1:-/dev/stdin}" | clip.exe; }
62+ function clippaste() { powershell.exe -noprofile -command Get-Clipboard; }
63+ elif [ -n "${WAYLAND_DISPLAY:-}" ] && (( ${+commands[wl-copy]} )) && (( ${+commands[wl-paste]} )); then
64+ function clipcopy() { cat "${1:-/dev/stdin}" | wl-copy &>/dev/null &|; }
65+ function clippaste() { wl-paste --no-newline; }
66+ elif [ -n "${DISPLAY:-}" ] && (( ${+commands[xsel]} )); then
67+ function clipcopy() { cat "${1:-/dev/stdin}" | xsel --clipboard --input; }
68+ function clippaste() { xsel --clipboard --output; }
69+ elif [ -n "${DISPLAY:-}" ] && (( ${+commands[xclip]} )); then
70+ function clipcopy() { cat "${1:-/dev/stdin}" | xclip -selection clipboard -in &>/dev/null &|; }
71+ function clippaste() { xclip -out -selection clipboard; }
72+ elif (( ${+commands[lemonade]} )); then
73+ function clipcopy() { cat "${1:-/dev/stdin}" | lemonade copy; }
74+ function clippaste() { lemonade paste; }
75+ elif (( ${+commands[doitclient]} )); then
76+ function clipcopy() { cat "${1:-/dev/stdin}" | doitclient wclip; }
77+ function clippaste() { doitclient wclip -r; }
78+ elif (( ${+commands[win32yank]} )); then
79+ function clipcopy() { cat "${1:-/dev/stdin}" | win32yank -i; }
80+ function clippaste() { win32yank -o; }
81+ elif [[ $OSTYPE == linux-android* ]] && (( $+commands[termux-clipboard-set] )); then
82+ function clipcopy() { cat "${1:-/dev/stdin}" | termux-clipboard-set; }
83+ function clippaste() { termux-clipboard-get; }
84+ elif [ -n "${TMUX:-}" ] && (( ${+commands[tmux]} )); then
85+ function clipcopy() { tmux load-buffer "${1:--}"; }
86+ function clippaste() { tmux save-buffer -; }
87+ else
88+ function _retry_clipboard_detection_or_fail() {
89+ local clipcmd="${1}"; shift
90+ if detect-clipboard; then
91+ "${clipcmd}" "$@"
92+ else
93+ print "${clipcmd}: Platform $OSTYPE not supported or xclip/xsel not installed" >&2
94+ return 1
95+ fi
96+ }
97+ function clipcopy() { _retry_clipboard_detection_or_fail clipcopy "$@"; }
98+ function clippaste() { _retry_clipboard_detection_or_fail clippaste "$@"; }
99+ return 1
100+ fi
101+}
102+
103+function clipcopy clippaste {
104+ unfunction clipcopy clippaste
105+ detect-clipboard || true # let one retry
106+ "$0" "$@"
107+}
+44-0.oh-my-zsh/lib/compfix.zsh
@@ -0,0 +1,44 @@
1+# Handle completions insecurities (i.e., completion-dependent directories with
2+# insecure ownership or permissions) by:
3+#
4+# * Human-readably notifying the user of these insecurities.
5+function handle_completion_insecurities() {
6+ # List of the absolute paths of all unique insecure directories, split on
7+ # newline from compaudit()'s output resembling:
8+ #
9+ # There are insecure directories:
10+ # /usr/share/zsh/site-functions
11+ # /usr/share/zsh/5.0.6/functions
12+ # /usr/share/zsh
13+ # /usr/share/zsh/5.0.6
14+ #
15+ # Since the ignorable first line is printed to stderr and thus not captured,
16+ # stderr is squelched to prevent this output from leaking to the user.
17+ local -aU insecure_dirs
18+ insecure_dirs=( ${(f@):-"$(compaudit 2>/dev/null)"} )
19+
20+ # If no such directories exist, get us out of here.
21+ [[ -z "${insecure_dirs}" ]] && return
22+
23+ # List ownership and permissions of all insecure directories.
24+ print "[oh-my-zsh] Insecure completion-dependent directories detected:"
25+ ls -ld "${(@)insecure_dirs}"
26+
27+ cat <<EOD
28+
29+[oh-my-zsh] For safety, we will not load completions from these directories until
30+[oh-my-zsh] you fix their permissions and ownership and restart zsh.
31+[oh-my-zsh] See the above list for directories with group or other writability.
32+
33+[oh-my-zsh] To fix your permissions you can do so by disabling
34+[oh-my-zsh] the write permission of "group" and "others" and making sure that the
35+[oh-my-zsh] owner of these directories is either root or your current user.
36+[oh-my-zsh] The following command may help:
37+[oh-my-zsh] compaudit | xargs chmod g-w,o-w
38+
39+[oh-my-zsh] If the above didn't help or you want to skip the verification of
40+[oh-my-zsh] insecure directories you can set the variable ZSH_DISABLE_COMPFIX to
41+[oh-my-zsh] "true" before oh-my-zsh is sourced in your zshrc file.
42+
43+EOD
44+}
+78-0.oh-my-zsh/lib/completion.zsh
@@ -0,0 +1,78 @@
1+# fixme - the load process here seems a bit bizarre
2+zmodload -i zsh/complist
3+
4+WORDCHARS=''
5+
6+unsetopt menu_complete # do not autoselect the first completion entry
7+unsetopt flowcontrol
8+setopt auto_menu # show completion menu on successive tab press
9+setopt complete_in_word
10+setopt always_to_end
11+
12+# should this be in keybindings?
13+bindkey -M menuselect '^o' accept-and-infer-next-history
14+zstyle ':completion:*:*:*:*:*' menu select
15+
16+# case insensitive (all), partial-word and substring completion
17+if [[ "$CASE_SENSITIVE" = true ]]; then
18+ zstyle ':completion:*' matcher-list 'r:|=*' 'l:|=* r:|=*'
19+else
20+ if [[ "$HYPHEN_INSENSITIVE" = true ]]; then
21+ zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]-_}={[:upper:][:lower:]_-}' 'r:|=*' 'l:|=* r:|=*'
22+ else
23+ zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'r:|=*' 'l:|=* r:|=*'
24+ fi
25+fi
26+unset CASE_SENSITIVE HYPHEN_INSENSITIVE
27+
28+# Complete . and .. special directories
29+zstyle ':completion:*' special-dirs true
30+
31+zstyle ':completion:*' list-colors ''
32+zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;34=0=01'
33+
34+if [[ "$OSTYPE" = solaris* ]]; then
35+ zstyle ':completion:*:*:*:*:processes' command "ps -u $USERNAME -o pid,user,comm"
36+else
37+ zstyle ':completion:*:*:*:*:processes' command "ps -u $USERNAME -o pid,user,comm -w -w"
38+fi
39+
40+# disable named-directories autocompletion
41+zstyle ':completion:*:cd:*' tag-order local-directories directory-stack path-directories
42+
43+# Use caching so that commands like apt and dpkg complete are useable
44+zstyle ':completion:*' use-cache yes
45+zstyle ':completion:*' cache-path $ZSH_CACHE_DIR
46+
47+# Don't complete uninteresting users
48+zstyle ':completion:*:*:*:users' ignored-patterns \
49+ adm amanda apache at avahi avahi-autoipd beaglidx bin cacti canna \
50+ clamav daemon dbus distcache dnsmasq dovecot fax ftp games gdm \
51+ gkrellmd gopher hacluster haldaemon halt hsqldb ident junkbust kdm \
52+ ldap lp mail mailman mailnull man messagebus mldonkey mysql nagios \
53+ named netdump news nfsnobody nobody nscd ntp nut nx obsrun openvpn \
54+ operator pcap polkitd postfix postgres privoxy pulse pvm quagga radvd \
55+ rpc rpcuser rpm rtkit scard shutdown squid sshd statd svn sync tftp \
56+ usbmux uucp vcsa wwwrun xfs '_*'
57+
58+# ... unless we really want to.
59+zstyle '*' single-ignored show
60+
61+if [[ ${COMPLETION_WAITING_DOTS:-false} != false ]]; then
62+ expand-or-complete-with-dots() {
63+ # use $COMPLETION_WAITING_DOTS either as toggle or as the sequence to show
64+ [[ $COMPLETION_WAITING_DOTS = true ]] && COMPLETION_WAITING_DOTS="%F{red}โ€ฆ%f"
65+ # turn off line wrapping and print prompt-expanded "dot" sequence
66+ printf '\e[?7l%s\e[?7h' "${(%)COMPLETION_WAITING_DOTS}"
67+ zle expand-or-complete
68+ zle redisplay
69+ }
70+ zle -N expand-or-complete-with-dots
71+ # Set the function as the default tab completion widget
72+ bindkey -M emacs "^I" expand-or-complete-with-dots
73+ bindkey -M viins "^I" expand-or-complete-with-dots
74+ bindkey -M vicmd "^I" expand-or-complete-with-dots
75+fi
76+
77+# automatically load bash completion functions
78+autoload -U +X bashcompinit && bashcompinit
+10-0.oh-my-zsh/lib/correction.zsh
@@ -0,0 +1,10 @@
1+if [[ "$ENABLE_CORRECTION" == "true" ]]; then
2+ alias cp='nocorrect cp'
3+ alias man='nocorrect man'
4+ alias mkdir='nocorrect mkdir'
5+ alias mv='nocorrect mv'
6+ alias sudo='nocorrect sudo'
7+ alias su='nocorrect su'
8+
9+ setopt correct_all
10+fi
+353-0.oh-my-zsh/lib/diagnostics.zsh
@@ -0,0 +1,353 @@
1+# diagnostics.zsh
2+#
3+# Diagnostic and debugging support for oh-my-zsh
4+
5+# omz_diagnostic_dump()
6+#
7+# Author: Andrew Janke <andrew@apjanke.net>
8+#
9+# Usage:
10+#
11+# omz_diagnostic_dump [-v] [-V] [file]
12+#
13+# NOTE: This is a work in progress. Its interface and behavior are going to change,
14+# and probably in non-back-compatible ways.
15+#
16+# Outputs a bunch of information about the state and configuration of
17+# oh-my-zsh, zsh, and the user's system. This is intended to provide a
18+# bunch of context for diagnosing your own or a third party's problems, and to
19+# be suitable for posting to public bug reports.
20+#
21+# The output is human-readable and its format may change over time. It is not
22+# suitable for parsing. All the output is in one single file so it can be posted
23+# as a gist or bug comment on GitHub. GitHub doesn't support attaching tarballs
24+# or other files to bugs; otherwise, this would probably have an option to produce
25+# tarballs that contain copies of the config and customization files instead of
26+# catting them all in to one file.
27+#
28+# This is intended to be widely portable, and run anywhere that oh-my-zsh does.
29+# Feel free to report any portability issues as bugs.
30+#
31+# This is written in a defensive style so it still works (and can detect) cases when
32+# basic functionality like echo and which have been redefined. In particular, almost
33+# everything is invoked with "builtin" or "command", to work in the face of user
34+# redefinitions.
35+#
36+# OPTIONS
37+#
38+# [file] Specifies the output file. If not given, a file in the current directory
39+# is selected automatically.
40+#
41+# -v Increase the verbosity of the dump output. May be specified multiple times.
42+# Verbosity levels:
43+# 0 - Basic info, shell state, omz configuration, git state
44+# 1 - (default) Adds key binding info and configuration file contents
45+# 2 - Adds zcompdump file contents
46+#
47+# -V Reduce the verbosity of the dump output. May be specified multiple times.
48+#
49+# TODO:
50+# * Multi-file capture
51+# * Add automatic gist uploading
52+# * Consider whether to move default output file location to TMPDIR. More robust
53+# but less user friendly.
54+#
55+
56+autoload -Uz is-at-least
57+
58+function omz_diagnostic_dump() {
59+ emulate -L zsh
60+
61+ builtin echo "Generating diagnostic dump; please be patient..."
62+
63+ local thisfcn=omz_diagnostic_dump
64+ local -A opts
65+ local opt_verbose opt_noverbose opt_outfile
66+ local timestamp=$(date +%Y%m%d-%H%M%S)
67+ local outfile=omz_diagdump_$timestamp.txt
68+ builtin zparseopts -A opts -D -- "v+=opt_verbose" "V+=opt_noverbose"
69+ local verbose n_verbose=${#opt_verbose} n_noverbose=${#opt_noverbose}
70+ (( verbose = 1 + n_verbose - n_noverbose ))
71+
72+ if [[ ${#*} > 0 ]]; then
73+ opt_outfile=$1
74+ fi
75+ if [[ ${#*} > 1 ]]; then
76+ builtin echo "$thisfcn: error: too many arguments" >&2
77+ return 1
78+ fi
79+ if [[ -n "$opt_outfile" ]]; then
80+ outfile="$opt_outfile"
81+ fi
82+
83+ # Always write directly to a file so terminal escape sequences are
84+ # captured cleanly
85+ _omz_diag_dump_one_big_text &> "$outfile"
86+ if [[ $? != 0 ]]; then
87+ builtin echo "$thisfcn: error while creating diagnostic dump; see $outfile for details"
88+ fi
89+
90+ builtin echo
91+ builtin echo Diagnostic dump file created at: "$outfile"
92+ builtin echo
93+ builtin echo To share this with OMZ developers, post it as a gist on GitHub
94+ builtin echo at "https://gist.github.com" and share the link to the gist.
95+ builtin echo
96+ builtin echo "WARNING: This dump file contains all your zsh and omz configuration files,"
97+ builtin echo "so don't share it publicly if there's sensitive information in them."
98+ builtin echo
99+
100+}
101+
102+function _omz_diag_dump_one_big_text() {
103+ local program programs progfile md5
104+
105+ builtin echo oh-my-zsh diagnostic dump
106+ builtin echo
107+ builtin echo $outfile
108+ builtin echo
109+
110+ # Basic system and zsh information
111+ command date
112+ command uname -a
113+ builtin echo OSTYPE=$OSTYPE
114+ builtin echo ZSH_VERSION=$ZSH_VERSION
115+ builtin echo User: $USERNAME
116+ builtin echo umask: $(umask)
117+ builtin echo
118+ _omz_diag_dump_os_specific_version
119+ builtin echo
120+
121+ # Installed programs
122+ programs=(sh zsh ksh bash sed cat grep ls find git posh)
123+ local progfile="" extra_str="" sha_str=""
124+ for program in $programs; do
125+ extra_str="" sha_str=""
126+ progfile=$(builtin which $program)
127+ if [[ $? == 0 ]]; then
128+ if [[ -e $progfile ]]; then
129+ if builtin whence shasum &>/dev/null; then
130+ sha_str=($(command shasum $progfile))
131+ sha_str=$sha_str[1]
132+ extra_str+=" SHA $sha_str"
133+ fi
134+ if [[ -h "$progfile" ]]; then
135+ extra_str+=" ( -> ${progfile:A} )"
136+ fi
137+ fi
138+ builtin printf '%-9s %-20s %s\n' "$program is" "$progfile" "$extra_str"
139+ else
140+ builtin echo "$program: not found"
141+ fi
142+ done
143+ builtin echo
144+ builtin echo Command Versions:
145+ builtin echo "zsh: $(zsh --version)"
146+ builtin echo "this zsh session: $ZSH_VERSION"
147+ builtin echo "bash: $(bash --version | command grep bash)"
148+ builtin echo "git: $(git --version)"
149+ builtin echo "grep: $(grep --version)"
150+ builtin echo
151+
152+ # Core command definitions
153+ _omz_diag_dump_check_core_commands || return 1
154+ builtin echo
155+
156+ # ZSH Process state
157+ builtin echo Process state:
158+ builtin echo pwd: $PWD
159+ if builtin whence pstree &>/dev/null; then
160+ builtin echo Process tree for this shell:
161+ pstree -p $$
162+ else
163+ ps -fT
164+ fi
165+ builtin set | command grep -a '^\(ZSH\|plugins\|TERM\|LC_\|LANG\|precmd\|chpwd\|preexec\|FPATH\|TTY\|DISPLAY\|PATH\)\|OMZ'
166+ builtin echo
167+ #TODO: Should this include `env` instead of or in addition to `export`?
168+ builtin echo Exported:
169+ builtin echo $(builtin export | command sed 's/=.*//')
170+ builtin echo
171+ builtin echo Locale:
172+ command locale
173+ builtin echo
174+
175+ # Zsh installation and configuration
176+ builtin echo Zsh configuration:
177+ builtin echo setopt: $(builtin setopt)
178+ builtin echo
179+ builtin echo zstyle:
180+ builtin zstyle
181+ builtin echo
182+ builtin echo 'compaudit output:'
183+ compaudit
184+ builtin echo
185+ builtin echo '$fpath directories:'
186+ command ls -lad $fpath
187+ builtin echo
188+
189+ # Oh-my-zsh installation
190+ builtin echo oh-my-zsh installation:
191+ command ls -ld ~/.z*
192+ command ls -ld ~/.oh*
193+ builtin echo
194+ builtin echo oh-my-zsh git state:
195+ (builtin cd $ZSH && builtin echo "HEAD: $(git rev-parse HEAD)" && git remote -v && git status | command grep "[^[:space:]]")
196+ if [[ $verbose -ge 1 ]]; then
197+ (builtin cd $ZSH && git reflog --date=default | command grep pull)
198+ fi
199+ builtin echo
200+ if [[ -e $ZSH_CUSTOM ]]; then
201+ local custom_dir=$ZSH_CUSTOM
202+ if [[ -h $custom_dir ]]; then
203+ custom_dir=$(builtin cd $custom_dir && pwd -P)
204+ fi
205+ builtin echo "oh-my-zsh custom dir:"
206+ builtin echo " $ZSH_CUSTOM ($custom_dir)"
207+ (builtin cd ${custom_dir:h} && command find ${custom_dir:t} -name .git -prune -o -print)
208+ builtin echo
209+ fi
210+
211+ # Key binding and terminal info
212+ if [[ $verbose -ge 1 ]]; then
213+ builtin echo "bindkey:"
214+ builtin bindkey
215+ builtin echo
216+ builtin echo "infocmp:"
217+ command infocmp -L
218+ builtin echo
219+ fi
220+
221+ # Configuration file info
222+ local zdotdir=${ZDOTDIR:-$HOME}
223+ builtin echo "Zsh configuration files:"
224+ local cfgfile cfgfiles
225+ # Some files for bash that zsh does not use are intentionally included
226+ # to help with diagnosing behavior differences between bash and zsh
227+ cfgfiles=( /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout
228+ $zdotdir/.zshenv $zdotdir/.zprofile $zdotdir/.zshrc $zdotdir/.zlogin $zdotdir/.zlogout
229+ ~/.zsh.pre-oh-my-zsh
230+ /etc/bashrc /etc/profile ~/.bashrc ~/.profile ~/.bash_profile ~/.bash_logout )
231+ command ls -lad $cfgfiles 2>&1
232+ builtin echo
233+ if [[ $verbose -ge 1 ]]; then
234+ for cfgfile in $cfgfiles; do
235+ _omz_diag_dump_echo_file_w_header $cfgfile
236+ done
237+ fi
238+ builtin echo
239+ builtin echo "Zsh compdump files:"
240+ local dumpfile dumpfiles
241+ command ls -lad $zdotdir/.zcompdump*
242+ dumpfiles=( $zdotdir/.zcompdump*(N) )
243+ if [[ $verbose -ge 2 ]]; then
244+ for dumpfile in $dumpfiles; do
245+ _omz_diag_dump_echo_file_w_header $dumpfile
246+ done
247+ fi
248+
249+}
250+
251+function _omz_diag_dump_check_core_commands() {
252+ builtin echo "Core command check:"
253+ local redefined name builtins externals reserved_words
254+ redefined=()
255+ # All the zsh non-module builtin commands
256+ # These are taken from the zsh reference manual for 5.0.2
257+ # Commands from modules should not be included.
258+ # (For back-compatibility, if any of these are newish, they should be removed,
259+ # or at least made conditional on the version of the current running zsh.)
260+ # "history" is also excluded because OMZ is known to redefine that
261+ reserved_words=( do done esac then elif else fi for case if while function
262+ repeat time until select coproc nocorrect foreach end '!' '[[' '{' '}'
263+ )
264+ builtins=( alias autoload bg bindkey break builtin bye cd chdir command
265+ comparguments compcall compctl compdescribe compfiles compgroups compquote comptags
266+ comptry compvalues continue dirs disable disown echo echotc echoti emulate
267+ enable eval exec exit false fc fg functions getln getopts hash
268+ jobs kill let limit log logout noglob popd print printf
269+ pushd pushln pwd r read rehash return sched set setopt shift
270+ source suspend test times trap true ttyctl type ulimit umask unalias
271+ unfunction unhash unlimit unset unsetopt vared wait whence where which zcompile
272+ zle zmodload zparseopts zregexparse zstyle )
273+ if is-at-least 5.1; then
274+ reserved_word+=( declare export integer float local readonly typeset )
275+ else
276+ builtins+=( declare export integer float local readonly typeset )
277+ fi
278+ builtins_fatal=( builtin command local )
279+ externals=( zsh )
280+ for name in $reserved_words; do
281+ if [[ $(builtin whence -w $name) != "$name: reserved" ]]; then
282+ builtin echo "reserved word '$name' has been redefined"
283+ builtin which $name
284+ redefined+=$name
285+ fi
286+ done
287+ for name in $builtins; do
288+ if [[ $(builtin whence -w $name) != "$name: builtin" ]]; then
289+ builtin echo "builtin '$name' has been redefined"
290+ builtin which $name
291+ redefined+=$name
292+ fi
293+ done
294+ for name in $externals; do
295+ if [[ $(builtin whence -w $name) != "$name: command" ]]; then
296+ builtin echo "command '$name' has been redefined"
297+ builtin which $name
298+ redefined+=$name
299+ fi
300+ done
301+
302+ if [[ -n "$redefined" ]]; then
303+ builtin echo "SOME CORE COMMANDS HAVE BEEN REDEFINED: $redefined"
304+ else
305+ builtin echo "All core commands are defined normally"
306+ fi
307+
308+}
309+
310+function _omz_diag_dump_echo_file_w_header() {
311+ local file=$1
312+ if [[ ( -f $file || -h $file ) ]]; then
313+ builtin echo "========== $file =========="
314+ if [[ -h $file ]]; then
315+ builtin echo "========== ( => ${file:A} ) =========="
316+ fi
317+ command cat $file
318+ builtin echo "========== end $file =========="
319+ builtin echo
320+ elif [[ -d $file ]]; then
321+ builtin echo "File '$file' is a directory"
322+ elif [[ ! -e $file ]]; then
323+ builtin echo "File '$file' does not exist"
324+ else
325+ command ls -lad "$file"
326+ fi
327+}
328+
329+function _omz_diag_dump_os_specific_version() {
330+ local osname osver version_file version_files
331+ case "$OSTYPE" in
332+ darwin*)
333+ osname=$(command sw_vers -productName)
334+ osver=$(command sw_vers -productVersion)
335+ builtin echo "OS Version: $osname $osver build $(sw_vers -buildVersion)"
336+ ;;
337+ cygwin)
338+ command systeminfo | command head -n 4 | command tail -n 2
339+ ;;
340+ esac
341+
342+ if builtin which lsb_release >/dev/null; then
343+ builtin echo "OS Release: $(command lsb_release -s -d)"
344+ fi
345+
346+ version_files=( /etc/*-release(N) /etc/*-version(N) /etc/*_version(N) )
347+ for version_file in $version_files; do
348+ builtin echo "$version_file:"
349+ command cat "$version_file"
350+ builtin echo
351+ done
352+}
353+
+40-0.oh-my-zsh/lib/directories.zsh
@@ -0,0 +1,40 @@
1+# Changing/making/removing directory
2+setopt auto_cd
3+setopt auto_pushd
4+setopt pushd_ignore_dups
5+setopt pushdminus
6+
7+
8+alias -g ...='../..'
9+alias -g ....='../../..'
10+alias -g .....='../../../..'
11+alias -g ......='../../../../..'
12+
13+alias -- -='cd -'
14+alias 1='cd -1'
15+alias 2='cd -2'
16+alias 3='cd -3'
17+alias 4='cd -4'
18+alias 5='cd -5'
19+alias 6='cd -6'
20+alias 7='cd -7'
21+alias 8='cd -8'
22+alias 9='cd -9'
23+
24+alias md='mkdir -p'
25+alias rd=rmdir
26+
27+function d () {
28+ if [[ -n $1 ]]; then
29+ dirs "$@"
30+ else
31+ dirs -v | head -n 10
32+ fi
33+}
34+compdef _dirs d
35+
36+# List directory contents
37+alias lsa='ls -lah'
38+alias l='ls -lah'
39+alias ll='ls -lh'
40+alias la='ls -lAh'
+281-0.oh-my-zsh/lib/functions.zsh
@@ -0,0 +1,281 @@
1+function zsh_stats() {
2+ fc -l 1 \
3+ | awk '{ CMD[$2]++; count++; } END { for (a in CMD) print CMD[a] " " CMD[a]*100/count "% " a }' \
4+ | grep -v "./" | sort -nr | head -n 20 | column -c3 -s " " -t | nl
5+}
6+
7+function uninstall_oh_my_zsh() {
8+ command env ZSH="$ZSH" sh "$ZSH/tools/uninstall.sh"
9+}
10+
11+function upgrade_oh_my_zsh() {
12+ echo >&2 "${fg[yellow]}Note: \`$0\` is deprecated. Use \`omz update\` instead.$reset_color"
13+ omz update
14+}
15+
16+function open_command() {
17+ local open_cmd
18+
19+ # define the open command
20+ case "$OSTYPE" in
21+ darwin*) open_cmd='open' ;;
22+ cygwin*) open_cmd='cygstart' ;;
23+ linux*) [[ "$(uname -r)" != *icrosoft* ]] && open_cmd='nohup xdg-open' || {
24+ open_cmd='cmd.exe /c start ""'
25+ [[ -e "$1" ]] && { 1="$(wslpath -w "${1:a}")" || return 1 }
26+ } ;;
27+ msys*) open_cmd='start ""' ;;
28+ *) echo "Platform $OSTYPE not supported"
29+ return 1
30+ ;;
31+ esac
32+
33+ # If a URL is passed, $BROWSER might be set to a local browser within SSH.
34+ # See https://github.com/ohmyzsh/ohmyzsh/issues/11098
35+ if [[ -n "$BROWSER" && "$1" = (http|https)://* ]]; then
36+ "$BROWSER" "$@"
37+ return
38+ fi
39+
40+ ${=open_cmd} "$@" &>/dev/null
41+}
42+
43+# take functions
44+
45+# mkcd is equivalent to takedir
46+function mkcd takedir() {
47+ mkdir -p $@ && cd ${@:$#}
48+}
49+
50+function takeurl() {
51+ local data thedir
52+ data="$(mktemp)"
53+ curl -L "$1" > "$data"
54+ tar xf "$data"
55+ thedir="$(tar tf "$data" | head -n 1)"
56+ rm "$data"
57+ cd "$thedir"
58+}
59+
60+function takezip() {
61+ local data thedir
62+ data="$(mktemp)"
63+ curl -L "$1" > "$data"
64+ unzip "$data" -d "./"
65+ thedir="$(unzip -l "$data" | awk 'NR==4 {print $4}' | sed 's/\/.*//')"
66+ rm "$data"
67+ cd "$thedir"
68+}
69+
70+function takegit() {
71+ git clone "$1"
72+ cd "$(basename ${1%%.git})"
73+}
74+
75+function take() {
76+ if [[ $1 =~ ^(https?|ftp).*\.(tar\.(gz|bz2|xz)|tgz)$ ]]; then
77+ takeurl "$1"
78+ elif [[ $1 =~ ^(https?|ftp).*\.(zip)$ ]]; then
79+ takezip "$1"
80+ elif [[ $1 =~ ^([A-Za-z0-9]\+@|https?|git|ssh|ftps?|rsync).*\.git/?$ ]]; then
81+ takegit "$1"
82+ else
83+ takedir "$@"
84+ fi
85+}
86+
87+#
88+# Get the value of an alias.
89+#
90+# Arguments:
91+# 1. alias - The alias to get its value from
92+# STDOUT:
93+# The value of alias $1 (if it has one).
94+# Return value:
95+# 0 if the alias was found,
96+# 1 if it does not exist
97+#
98+function alias_value() {
99+ (( $+aliases[$1] )) && echo $aliases[$1]
100+}
101+
102+#
103+# Try to get the value of an alias,
104+# otherwise return the input.
105+#
106+# Arguments:
107+# 1. alias - The alias to get its value from
108+# STDOUT:
109+# The value of alias $1, or $1 if there is no alias $1.
110+# Return value:
111+# Always 0
112+#
113+function try_alias_value() {
114+ alias_value "$1" || echo "$1"
115+}
116+
117+#
118+# Set variable "$1" to default value "$2" if "$1" is not yet defined.
119+#
120+# Arguments:
121+# 1. name - The variable to set
122+# 2. val - The default value
123+# Return value:
124+# 0 if the variable exists, 3 if it was set
125+#
126+function default() {
127+ (( $+parameters[$1] )) && return 0
128+ typeset -g "$1"="$2" && return 3
129+}
130+
131+#
132+# Set environment variable "$1" to default value "$2" if "$1" is not yet defined.
133+#
134+# Arguments:
135+# 1. name - The env variable to set
136+# 2. val - The default value
137+# Return value:
138+# 0 if the env variable exists, 3 if it was set
139+#
140+function env_default() {
141+ [[ ${parameters[$1]} = *-export* ]] && return 0
142+ export "$1=$2" && return 3
143+}
144+
145+
146+# Required for $langinfo
147+zmodload zsh/langinfo
148+
149+# URL-encode a string
150+#
151+# Encodes a string using RFC 2396 URL-encoding (%-escaped).
152+# See: https://www.ietf.org/rfc/rfc2396.txt
153+#
154+# By default, reserved characters and unreserved "mark" characters are
155+# not escaped by this function. This allows the common usage of passing
156+# an entire URL in, and encoding just special characters in it, with
157+# the expectation that reserved and mark characters are used appropriately.
158+# The -r and -m options turn on escaping of the reserved and mark characters,
159+# respectively, which allows arbitrary strings to be fully escaped for
160+# embedding inside URLs, where reserved characters might be misinterpreted.
161+#
162+# Prints the encoded string on stdout.
163+# Returns nonzero if encoding failed.
164+#
165+# Usage:
166+# omz_urlencode [-r] [-m] [-P] <string> [<string> ...]
167+#
168+# -r causes reserved characters (;/?:@&=+$,) to be escaped
169+#
170+# -m causes "mark" characters (_.!~*''()-) to be escaped
171+#
172+# -P causes spaces to be encoded as '%20' instead of '+'
173+function omz_urlencode() {
174+ emulate -L zsh
175+ setopt norematchpcre
176+
177+ local -a opts
178+ zparseopts -D -E -a opts r m P
179+
180+ local in_str="$@"
181+ local url_str=""
182+ local spaces_as_plus
183+ if [[ -z $opts[(r)-P] ]]; then spaces_as_plus=1; fi
184+ local str="$in_str"
185+
186+ # URLs must use UTF-8 encoding; convert str to UTF-8 if required
187+ local encoding=$langinfo[CODESET]
188+ local safe_encodings
189+ safe_encodings=(UTF-8 utf8 US-ASCII)
190+ if [[ -z ${safe_encodings[(r)$encoding]} ]]; then
191+ str=$(echo -E "$str" | iconv -f $encoding -t UTF-8)
192+ if [[ $? != 0 ]]; then
193+ echo "Error converting string from $encoding to UTF-8" >&2
194+ return 1
195+ fi
196+ fi
197+
198+ # Use LC_CTYPE=C to process text byte-by-byte
199+ # Note that this doesn't work in Termux, as it only has UTF-8 locale.
200+ # Characters will be processed as UTF-8, which is fine for URLs.
201+ local i byte ord LC_ALL=C
202+ export LC_ALL
203+ local reserved=';/?:@&=+$,'
204+ local mark='_.!~*''()-'
205+ local dont_escape="[A-Za-z0-9"
206+ if [[ -z $opts[(r)-r] ]]; then
207+ dont_escape+=$reserved
208+ fi
209+ # $mark must be last because of the "-"
210+ if [[ -z $opts[(r)-m] ]]; then
211+ dont_escape+=$mark
212+ fi
213+ dont_escape+="]"
214+
215+ # Implemented to use a single printf call and avoid subshells in the loop,
216+ # for performance (primarily on Windows).
217+ local url_str=""
218+ for (( i = 1; i <= ${#str}; ++i )); do
219+ byte="$str[i]"
220+ if [[ "$byte" =~ "$dont_escape" ]]; then
221+ url_str+="$byte"
222+ else
223+ if [[ "$byte" == " " && -n $spaces_as_plus ]]; then
224+ url_str+="+"
225+ elif [[ "$PREFIX" = *com.termux* ]]; then
226+ # Termux does not have non-UTF8 locales, so just send the UTF-8 character directly
227+ url_str+="$byte"
228+ else
229+ ord=$(( [##16] #byte ))
230+ url_str+="%$ord"
231+ fi
232+ fi
233+ done
234+ echo -E "$url_str"
235+}
236+
237+# URL-decode a string
238+#
239+# Decodes a RFC 2396 URL-encoded (%-escaped) string.
240+# This decodes the '+' and '%' escapes in the input string, and leaves
241+# other characters unchanged. Does not enforce that the input is a
242+# valid URL-encoded string. This is a convenience to allow callers to
243+# pass in a full URL or similar strings and decode them for human
244+# presentation.
245+#
246+# Outputs the encoded string on stdout.
247+# Returns nonzero if encoding failed.
248+#
249+# Usage:
250+# omz_urldecode <urlstring> - prints decoded string followed by a newline
251+function omz_urldecode {
252+ emulate -L zsh
253+ local encoded_url=$1
254+
255+ # Work bytewise, since URLs escape UTF-8 octets
256+ local caller_encoding=$langinfo[CODESET]
257+ local LC_ALL=C
258+ export LC_ALL
259+
260+ # Change + back to ' '
261+ local tmp=${encoded_url:gs/+/ /}
262+ # Protect other escapes to pass through the printf unchanged
263+ tmp=${tmp:gs/\\/\\\\/}
264+ # Handle %-escapes by turning them into `\xXX` printf escapes
265+ tmp=${tmp:gs/%/\\x/}
266+ local decoded="$(printf -- "$tmp")"
267+
268+ # Now we have a UTF-8 encoded string in the variable. We need to re-encode
269+ # it if caller is in a non-UTF-8 locale.
270+ local -a safe_encodings
271+ safe_encodings=(UTF-8 utf8 US-ASCII)
272+ if [[ -z ${safe_encodings[(r)$caller_encoding]} ]]; then
273+ decoded=$(echo -E "$decoded" | iconv -f UTF-8 -t $caller_encoding)
274+ if [[ $? != 0 ]]; then
275+ echo "Error converting string from UTF-8 to $caller_encoding" >&2
276+ return 1
277+ fi
278+ fi
279+
280+ echo -E "$decoded"
281+}
+367-0.oh-my-zsh/lib/git.zsh
@@ -0,0 +1,367 @@
1+autoload -Uz is-at-least
2+
3+# The git prompt's git commands are read-only and should not interfere with
4+# other processes. This environment variable is equivalent to running with `git
5+# --no-optional-locks`, but falls back gracefully for older versions of git.
6+# See git(1) for and git-status(1) for a description of that flag.
7+#
8+# We wrap in a local function instead of exporting the variable directly in
9+# order to avoid interfering with manually-run git commands by the user.
10+function __git_prompt_git() {
11+ GIT_OPTIONAL_LOCKS=0 command git "$@"
12+}
13+
14+function _omz_git_prompt_info() {
15+ # If we are on a folder not tracked by git, get out.
16+ # Otherwise, check for hide-info at global and local repository level
17+ if ! __git_prompt_git rev-parse --git-dir &> /dev/null \
18+ || [[ "$(__git_prompt_git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then
19+ return 0
20+ fi
21+
22+ # Get either:
23+ # - the current branch name
24+ # - the tag name if we are on a tag
25+ # - the short SHA of the current commit
26+ local ref
27+ ref=$(__git_prompt_git symbolic-ref --short HEAD 2> /dev/null) \
28+ || ref=$(__git_prompt_git describe --tags --exact-match HEAD 2> /dev/null) \
29+ || ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) \
30+ || return 0
31+
32+ # Use global ZSH_THEME_GIT_SHOW_UPSTREAM=1 for including upstream remote info
33+ local upstream
34+ if (( ${+ZSH_THEME_GIT_SHOW_UPSTREAM} )); then
35+ upstream=$(__git_prompt_git rev-parse --abbrev-ref --symbolic-full-name "@{upstream}" 2>/dev/null) \
36+ && upstream=" -> ${upstream}"
37+ fi
38+
39+ echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref:gs/%/%%}${upstream:gs/%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}"
40+}
41+
42+# Use async version if setting is enabled, or unset but zsh version is at least 5.0.6.
43+# This avoids async prompt issues caused by previous zsh versions:
44+# - https://github.com/ohmyzsh/ohmyzsh/issues/12331
45+# - https://github.com/ohmyzsh/ohmyzsh/issues/12360
46+# TODO(2024-06-12): @mcornella remove workaround when CentOS 7 reaches EOL
47+local _style
48+if zstyle -t ':omz:alpha:lib:git' async-prompt \
49+ || { is-at-least 5.0.6 && zstyle -T ':omz:alpha:lib:git' async-prompt }; then
50+ function git_prompt_info() {
51+ if [[ -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]}" ]]; then
52+ echo -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]}"
53+ fi
54+ }
55+
56+ function git_prompt_status() {
57+ if [[ -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]}" ]]; then
58+ echo -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]}"
59+ fi
60+ }
61+
62+ # Conditionally register the async handler, only if it's needed in $PROMPT
63+ # or any of the other prompt variables
64+ function _defer_async_git_register() {
65+ # Check if git_prompt_info is used in a prompt variable
66+ case "${PS1}:${PS2}:${PS3}:${PS4}:${RPROMPT}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in
67+ *(\$\(git_prompt_info\)|\`git_prompt_info\`)*)
68+ _omz_register_handler _omz_git_prompt_info
69+ ;;
70+ esac
71+
72+ case "${PS1}:${PS2}:${PS3}:${PS4}:${RPROMPT}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in
73+ *(\$\(git_prompt_status\)|\`git_prompt_status\`)*)
74+ _omz_register_handler _omz_git_prompt_status
75+ ;;
76+ esac
77+
78+ add-zsh-hook -d precmd _defer_async_git_register
79+ unset -f _defer_async_git_register
80+ }
81+
82+ # Register the async handler first. This needs to be done before
83+ # the async request prompt is run
84+ precmd_functions=(_defer_async_git_register $precmd_functions)
85+elif zstyle -s ':omz:alpha:lib:git' async-prompt _style && [[ $_style == "force" ]]; then
86+ function git_prompt_info() {
87+ if [[ -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]}" ]]; then
88+ echo -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]}"
89+ fi
90+ }
91+
92+ function git_prompt_status() {
93+ if [[ -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]}" ]]; then
94+ echo -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]}"
95+ fi
96+ }
97+
98+ _omz_register_handler _omz_git_prompt_info
99+ _omz_register_handler _omz_git_prompt_status
100+else
101+ function git_prompt_info() {
102+ _omz_git_prompt_info
103+ }
104+ function git_prompt_status() {
105+ _omz_git_prompt_status
106+ }
107+fi
108+
109+# Checks if working tree is dirty
110+function parse_git_dirty() {
111+ local STATUS
112+ local -a FLAGS
113+ FLAGS=('--porcelain')
114+ if [[ "$(__git_prompt_git config --get oh-my-zsh.hide-dirty)" != "1" ]]; then
115+ if [[ "${DISABLE_UNTRACKED_FILES_DIRTY:-}" == "true" ]]; then
116+ FLAGS+='--untracked-files=no'
117+ fi
118+ case "${GIT_STATUS_IGNORE_SUBMODULES:-}" in
119+ git)
120+ # let git decide (this respects per-repo config in .gitmodules)
121+ ;;
122+ *)
123+ # if unset: ignore dirty submodules
124+ # other values are passed to --ignore-submodules
125+ FLAGS+="--ignore-submodules=${GIT_STATUS_IGNORE_SUBMODULES:-dirty}"
126+ ;;
127+ esac
128+ STATUS=$(__git_prompt_git status ${FLAGS} 2> /dev/null | tail -n 1)
129+ fi
130+ if [[ -n $STATUS ]]; then
131+ echo "$ZSH_THEME_GIT_PROMPT_DIRTY"
132+ else
133+ echo "$ZSH_THEME_GIT_PROMPT_CLEAN"
134+ fi
135+}
136+
137+# Gets the difference between the local and remote branches
138+function git_remote_status() {
139+ local remote ahead behind git_remote_status git_remote_status_detailed
140+ remote=${$(__git_prompt_git rev-parse --verify ${hook_com[branch]}@{upstream} --symbolic-full-name 2>/dev/null)/refs\/remotes\/}
141+ if [[ -n ${remote} ]]; then
142+ ahead=$(__git_prompt_git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l)
143+ behind=$(__git_prompt_git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l)
144+
145+ if [[ $ahead -eq 0 ]] && [[ $behind -eq 0 ]]; then
146+ git_remote_status="$ZSH_THEME_GIT_PROMPT_EQUAL_REMOTE"
147+ elif [[ $ahead -gt 0 ]] && [[ $behind -eq 0 ]]; then
148+ git_remote_status="$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE"
149+ git_remote_status_detailed="$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE$((ahead))%{$reset_color%}"
150+ elif [[ $behind -gt 0 ]] && [[ $ahead -eq 0 ]]; then
151+ git_remote_status="$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE"
152+ git_remote_status_detailed="$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE$((behind))%{$reset_color%}"
153+ elif [[ $ahead -gt 0 ]] && [[ $behind -gt 0 ]]; then
154+ git_remote_status="$ZSH_THEME_GIT_PROMPT_DIVERGED_REMOTE"
155+ git_remote_status_detailed="$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE$((ahead))%{$reset_color%}$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE$((behind))%{$reset_color%}"
156+ fi
157+
158+ if [[ -n $ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_DETAILED ]]; then
159+ git_remote_status="$ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_PREFIX${remote:gs/%/%%}$git_remote_status_detailed$ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_SUFFIX"
160+ fi
161+
162+ echo $git_remote_status
163+ fi
164+}
165+
166+# Outputs the name of the current branch
167+# Usage example: git pull origin $(git_current_branch)
168+# Using '--quiet' with 'symbolic-ref' will not cause a fatal error (128) if
169+# it's not a symbolic ref, but in a Git repo.
170+function git_current_branch() {
171+ local ref
172+ ref=$(__git_prompt_git symbolic-ref --quiet HEAD 2> /dev/null)
173+ local ret=$?
174+ if [[ $ret != 0 ]]; then
175+ [[ $ret == 128 ]] && return # no git repo.
176+ ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) || return
177+ fi
178+ echo ${ref#refs/heads/}
179+}
180+
181+# Outputs the name of the previously checked out branch
182+# Usage example: git pull origin $(git_previous_branch)
183+# rev-parse --symbolic-full-name @{-1} only prints if it is a branch
184+function git_previous_branch() {
185+ local ref
186+ ref=$(__git_prompt_git rev-parse --quiet --symbolic-full-name @{-1} 2> /dev/null)
187+ local ret=$?
188+ if [[ $ret != 0 ]] || [[ -z $ref ]]; then
189+ return # no git repo or non-branch previous ref
190+ fi
191+ echo ${ref#refs/heads/}
192+}
193+
194+# Gets the number of commits ahead from remote
195+function git_commits_ahead() {
196+ if __git_prompt_git rev-parse --git-dir &>/dev/null; then
197+ local commits="$(__git_prompt_git rev-list --count @{upstream}..HEAD 2>/dev/null)"
198+ if [[ -n "$commits" && "$commits" != 0 ]]; then
199+ echo "$ZSH_THEME_GIT_COMMITS_AHEAD_PREFIX$commits$ZSH_THEME_GIT_COMMITS_AHEAD_SUFFIX"
200+ fi
201+ fi
202+}
203+
204+# Gets the number of commits behind remote
205+function git_commits_behind() {
206+ if __git_prompt_git rev-parse --git-dir &>/dev/null; then
207+ local commits="$(__git_prompt_git rev-list --count HEAD..@{upstream} 2>/dev/null)"
208+ if [[ -n "$commits" && "$commits" != 0 ]]; then
209+ echo "$ZSH_THEME_GIT_COMMITS_BEHIND_PREFIX$commits$ZSH_THEME_GIT_COMMITS_BEHIND_SUFFIX"
210+ fi
211+ fi
212+}
213+
214+# Outputs if current branch is ahead of remote
215+function git_prompt_ahead() {
216+ if [[ -n "$(__git_prompt_git rev-list origin/$(git_current_branch)..HEAD 2> /dev/null)" ]]; then
217+ echo "$ZSH_THEME_GIT_PROMPT_AHEAD"
218+ fi
219+}
220+
221+# Outputs if current branch is behind remote
222+function git_prompt_behind() {
223+ if [[ -n "$(__git_prompt_git rev-list HEAD..origin/$(git_current_branch) 2> /dev/null)" ]]; then
224+ echo "$ZSH_THEME_GIT_PROMPT_BEHIND"
225+ fi
226+}
227+
228+# Outputs if current branch exists on remote or not
229+function git_prompt_remote() {
230+ if [[ -n "$(__git_prompt_git show-ref origin/$(git_current_branch) 2> /dev/null)" ]]; then
231+ echo "$ZSH_THEME_GIT_PROMPT_REMOTE_EXISTS"
232+ else
233+ echo "$ZSH_THEME_GIT_PROMPT_REMOTE_MISSING"
234+ fi
235+}
236+
237+# Formats prompt string for current git commit short SHA
238+function git_prompt_short_sha() {
239+ local SHA
240+ SHA=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER"
241+}
242+
243+# Formats prompt string for current git commit long SHA
244+function git_prompt_long_sha() {
245+ local SHA
246+ SHA=$(__git_prompt_git rev-parse HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER"
247+}
248+
249+function _omz_git_prompt_status() {
250+ [[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return
251+
252+ # Maps a git status prefix to an internal constant
253+ # This cannot use the prompt constants, as they may be empty
254+ local -A prefix_constant_map
255+ prefix_constant_map=(
256+ '\?\? ' 'UNTRACKED'
257+ 'A ' 'ADDED'
258+ 'M ' 'MODIFIED'
259+ 'MM ' 'MODIFIED'
260+ ' M ' 'MODIFIED'
261+ 'AM ' 'MODIFIED'
262+ ' T ' 'MODIFIED'
263+ 'R ' 'RENAMED'
264+ ' D ' 'DELETED'
265+ 'D ' 'DELETED'
266+ 'UU ' 'UNMERGED'
267+ 'ahead' 'AHEAD'
268+ 'behind' 'BEHIND'
269+ 'diverged' 'DIVERGED'
270+ 'stashed' 'STASHED'
271+ )
272+
273+ # Maps the internal constant to the prompt theme
274+ local -A constant_prompt_map
275+ constant_prompt_map=(
276+ 'UNTRACKED' "$ZSH_THEME_GIT_PROMPT_UNTRACKED"
277+ 'ADDED' "$ZSH_THEME_GIT_PROMPT_ADDED"
278+ 'MODIFIED' "$ZSH_THEME_GIT_PROMPT_MODIFIED"
279+ 'RENAMED' "$ZSH_THEME_GIT_PROMPT_RENAMED"
280+ 'DELETED' "$ZSH_THEME_GIT_PROMPT_DELETED"
281+ 'UNMERGED' "$ZSH_THEME_GIT_PROMPT_UNMERGED"
282+ 'AHEAD' "$ZSH_THEME_GIT_PROMPT_AHEAD"
283+ 'BEHIND' "$ZSH_THEME_GIT_PROMPT_BEHIND"
284+ 'DIVERGED' "$ZSH_THEME_GIT_PROMPT_DIVERGED"
285+ 'STASHED' "$ZSH_THEME_GIT_PROMPT_STASHED"
286+ )
287+
288+ # The order that the prompt displays should be added to the prompt
289+ local status_constants
290+ status_constants=(
291+ UNTRACKED ADDED MODIFIED RENAMED DELETED
292+ STASHED UNMERGED AHEAD BEHIND DIVERGED
293+ )
294+
295+ local status_text
296+ status_text="$(__git_prompt_git status --porcelain -b 2> /dev/null)"
297+
298+ # Don't continue on a catastrophic failure
299+ if [[ $? -eq 128 ]]; then
300+ return 1
301+ fi
302+
303+ # A lookup table of each git status encountered
304+ local -A statuses_seen
305+
306+ if __git_prompt_git rev-parse --verify refs/stash &>/dev/null; then
307+ statuses_seen[STASHED]=1
308+ fi
309+
310+ local status_lines
311+ status_lines=("${(@f)${status_text}}")
312+
313+ # If the tracking line exists, get and parse it
314+ if [[ "$status_lines[1]" =~ "^## [^ ]+ \[(.*)\]" ]]; then
315+ local branch_statuses
316+ branch_statuses=("${(@s/,/)match}")
317+ for branch_status in $branch_statuses; do
318+ if [[ ! $branch_status =~ "(behind|diverged|ahead) ([0-9]+)?" ]]; then
319+ continue
320+ fi
321+ local last_parsed_status=$prefix_constant_map[$match[1]]
322+ statuses_seen[$last_parsed_status]=$match[2]
323+ done
324+ fi
325+
326+ # For each status prefix, do a regex comparison
327+ for status_prefix in ${(k)prefix_constant_map}; do
328+ local status_constant="${prefix_constant_map[$status_prefix]}"
329+ local status_regex=$'(^|\n)'"$status_prefix"
330+
331+ if [[ "$status_text" =~ $status_regex ]]; then
332+ statuses_seen[$status_constant]=1
333+ fi
334+ done
335+
336+ # Display the seen statuses in the order specified
337+ local status_prompt
338+ for status_constant in $status_constants; do
339+ if (( ${+statuses_seen[$status_constant]} )); then
340+ local next_display=$constant_prompt_map[$status_constant]
341+ status_prompt="$next_display$status_prompt"
342+ fi
343+ done
344+
345+ echo $status_prompt
346+}
347+
348+# Outputs the name of the current user
349+# Usage example: $(git_current_user_name)
350+function git_current_user_name() {
351+ __git_prompt_git config user.name 2>/dev/null
352+}
353+
354+# Outputs the email of the current user
355+# Usage example: $(git_current_user_email)
356+function git_current_user_email() {
357+ __git_prompt_git config user.email 2>/dev/null
358+}
359+
360+# Output the name of the root directory of the git repository
361+# Usage example: $(git_repo_name)
362+function git_repo_name() {
363+ local repo_path
364+ if repo_path="$(__git_prompt_git rev-parse --show-toplevel 2>/dev/null)" && [[ -n "$repo_path" ]]; then
365+ echo ${repo_path:t}
366+ fi
367+}
+41-0.oh-my-zsh/lib/grep.zsh
@@ -0,0 +1,41 @@
1+__GREP_CACHE_FILE="$ZSH_CACHE_DIR"/grep-alias
2+
3+# See if there's a cache file modified in the last day
4+__GREP_ALIAS_CACHES=("$__GREP_CACHE_FILE"(Nm-1))
5+if [[ -n "$__GREP_ALIAS_CACHES" ]]; then
6+ source "$__GREP_CACHE_FILE"
7+else
8+ grep-flags-available() {
9+ command grep "$@" "" &>/dev/null <<< ""
10+ }
11+
12+ # Ignore these folders (if the necessary grep flags are available)
13+ EXC_FOLDERS="{.bzr,CVS,.git,.hg,.svn,.idea,.tox,.venv,venv}"
14+
15+ # Check for --exclude-dir, otherwise check for --exclude. If --exclude
16+ # isn't available, --color won't be either (they were released at the same
17+ # time (v2.5): https://git.savannah.gnu.org/cgit/grep.git/tree/NEWS?id=1236f007
18+ if grep-flags-available --color=auto --exclude-dir=.cvs; then
19+ GREP_OPTIONS="--color=auto --exclude-dir=$EXC_FOLDERS"
20+ elif grep-flags-available --color=auto --exclude=.cvs; then
21+ GREP_OPTIONS="--color=auto --exclude=$EXC_FOLDERS"
22+ fi
23+
24+ if [[ -n "$GREP_OPTIONS" ]]; then
25+ # export grep, egrep and fgrep settings
26+ alias grep="grep $GREP_OPTIONS"
27+ alias egrep="grep -E"
28+ alias fgrep="grep -F"
29+
30+ # write to cache file if cache directory is writable
31+ if [[ -w "$ZSH_CACHE_DIR" ]]; then
32+ alias -L grep egrep fgrep >| "$__GREP_CACHE_FILE"
33+ fi
34+ fi
35+
36+ # Clean up
37+ unset GREP_OPTIONS EXC_FOLDERS
38+ unfunction grep-flags-available
39+fi
40+
41+unset __GREP_CACHE_FILE __GREP_ALIAS_CACHES
+48-0.oh-my-zsh/lib/history.zsh
@@ -0,0 +1,48 @@
1+## History wrapper
2+function omz_history {
3+ # parse arguments and remove from $@
4+ local clear list stamp REPLY
5+ zparseopts -E -D c=clear l=list f=stamp E=stamp i=stamp t:=stamp
6+
7+ if [[ -n "$clear" ]]; then
8+ # if -c provided, clobber the history file
9+
10+ # confirm action before deleting history
11+ print -nu2 "This action will irreversibly delete your command history. Are you sure? [y/N] "
12+ builtin read -E
13+ [[ "$REPLY" = [yY] ]] || return 0
14+
15+ print -nu2 >| "$HISTFILE"
16+ fc -p "$HISTFILE"
17+
18+ print -u2 History file deleted.
19+ elif [[ $# -eq 0 ]]; then
20+ # if no arguments provided, show full history starting from 1
21+ builtin fc $stamp -l 1
22+ else
23+ # otherwise, run `fc -l` with a custom format
24+ builtin fc $stamp -l "$@"
25+ fi
26+}
27+
28+# Timestamp format
29+case ${HIST_STAMPS-} in
30+ "mm/dd/yyyy") alias history='omz_history -f' ;;
31+ "dd.mm.yyyy") alias history='omz_history -E' ;;
32+ "yyyy-mm-dd") alias history='omz_history -i' ;;
33+ "") alias history='omz_history' ;;
34+ *) alias history="omz_history -t '$HIST_STAMPS'" ;;
35+esac
36+
37+## History file configuration
38+[ -z "$HISTFILE" ] && HISTFILE="$HOME/.zsh_history"
39+[ "$HISTSIZE" -lt 50000 ] && HISTSIZE=50000
40+[ "$SAVEHIST" -lt 10000 ] && SAVEHIST=10000
41+
42+## History command configuration
43+setopt extended_history # record timestamp of command in HISTFILE
44+setopt hist_expire_dups_first # delete duplicates first when HISTFILE size exceeds HISTSIZE
45+setopt hist_ignore_dups # ignore duplicated commands history list
46+setopt hist_ignore_space # ignore commands that start with space
47+setopt hist_verify # show command with history expansion to user before running it
48+setopt share_history # share command history data
+145-0.oh-my-zsh/lib/key-bindings.zsh
@@ -0,0 +1,145 @@
1+# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html
2+# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Zle-Builtins
3+# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Standard-Widgets
4+
5+# Make sure that the terminal is in application mode when zle is active, since
6+# only then values from $terminfo are valid
7+if (( ${+terminfo[smkx]} )) && (( ${+terminfo[rmkx]} )); then
8+ function zle-line-init() {
9+ echoti smkx
10+ }
11+ function zle-line-finish() {
12+ echoti rmkx
13+ }
14+ zle -N zle-line-init
15+ zle -N zle-line-finish
16+fi
17+
18+# Use emacs key bindings
19+bindkey -e
20+
21+# [PageUp] - Up a line of history
22+if [[ -n "${terminfo[kpp]}" ]]; then
23+ bindkey -M emacs "${terminfo[kpp]}" up-line-or-history
24+ bindkey -M viins "${terminfo[kpp]}" up-line-or-history
25+ bindkey -M vicmd "${terminfo[kpp]}" up-line-or-history
26+fi
27+# [PageDown] - Down a line of history
28+if [[ -n "${terminfo[knp]}" ]]; then
29+ bindkey -M emacs "${terminfo[knp]}" down-line-or-history
30+ bindkey -M viins "${terminfo[knp]}" down-line-or-history
31+ bindkey -M vicmd "${terminfo[knp]}" down-line-or-history
32+fi
33+
34+# Start typing + [Up-Arrow] - fuzzy find history forward
35+autoload -U up-line-or-beginning-search
36+zle -N up-line-or-beginning-search
37+
38+bindkey -M emacs "^[[A" up-line-or-beginning-search
39+bindkey -M viins "^[[A" up-line-or-beginning-search
40+bindkey -M vicmd "^[[A" up-line-or-beginning-search
41+if [[ -n "${terminfo[kcuu1]}" ]]; then
42+ bindkey -M emacs "${terminfo[kcuu1]}" up-line-or-beginning-search
43+ bindkey -M viins "${terminfo[kcuu1]}" up-line-or-beginning-search
44+ bindkey -M vicmd "${terminfo[kcuu1]}" up-line-or-beginning-search
45+fi
46+
47+# Start typing + [Down-Arrow] - fuzzy find history backward
48+autoload -U down-line-or-beginning-search
49+zle -N down-line-or-beginning-search
50+
51+bindkey -M emacs "^[[B" down-line-or-beginning-search
52+bindkey -M viins "^[[B" down-line-or-beginning-search
53+bindkey -M vicmd "^[[B" down-line-or-beginning-search
54+if [[ -n "${terminfo[kcud1]}" ]]; then
55+ bindkey -M emacs "${terminfo[kcud1]}" down-line-or-beginning-search
56+ bindkey -M viins "${terminfo[kcud1]}" down-line-or-beginning-search
57+ bindkey -M vicmd "${terminfo[kcud1]}" down-line-or-beginning-search
58+fi
59+
60+# [Home] - Go to beginning of line
61+if [[ -n "${terminfo[khome]}" ]]; then
62+ bindkey -M emacs "${terminfo[khome]}" beginning-of-line
63+ bindkey -M viins "${terminfo[khome]}" beginning-of-line
64+ bindkey -M vicmd "${terminfo[khome]}" beginning-of-line
65+fi
66+# [End] - Go to end of line
67+if [[ -n "${terminfo[kend]}" ]]; then
68+ bindkey -M emacs "${terminfo[kend]}" end-of-line
69+ bindkey -M viins "${terminfo[kend]}" end-of-line
70+ bindkey -M vicmd "${terminfo[kend]}" end-of-line
71+fi
72+
73+# [Shift-Tab] - move through the completion menu backwards
74+if [[ -n "${terminfo[kcbt]}" ]]; then
75+ bindkey -M emacs "${terminfo[kcbt]}" reverse-menu-complete
76+ bindkey -M viins "${terminfo[kcbt]}" reverse-menu-complete
77+ bindkey -M vicmd "${terminfo[kcbt]}" reverse-menu-complete
78+fi
79+
80+# [Backspace] - delete backward
81+bindkey -M emacs '^?' backward-delete-char
82+bindkey -M viins '^?' backward-delete-char
83+bindkey -M vicmd '^?' backward-delete-char
84+# [Delete] - delete forward
85+if [[ -n "${terminfo[kdch1]}" ]]; then
86+ bindkey -M emacs "${terminfo[kdch1]}" delete-char
87+ bindkey -M viins "${terminfo[kdch1]}" delete-char
88+ bindkey -M vicmd "${terminfo[kdch1]}" delete-char
89+else
90+ bindkey -M emacs "^[[3~" delete-char
91+ bindkey -M viins "^[[3~" delete-char
92+ bindkey -M vicmd "^[[3~" delete-char
93+
94+ bindkey -M emacs "^[3;5~" delete-char
95+ bindkey -M viins "^[3;5~" delete-char
96+ bindkey -M vicmd "^[3;5~" delete-char
97+fi
98+
99+# [Ctrl-Delete] - delete whole forward-word
100+bindkey -M emacs '^[[3;5~' kill-word
101+bindkey -M viins '^[[3;5~' kill-word
102+bindkey -M vicmd '^[[3;5~' kill-word
103+
104+# [Ctrl-RightArrow] - move forward one word
105+bindkey -M emacs '^[[1;5C' forward-word
106+bindkey -M viins '^[[1;5C' forward-word
107+bindkey -M vicmd '^[[1;5C' forward-word
108+# [Ctrl-LeftArrow] - move backward one word
109+bindkey -M emacs '^[[1;5D' backward-word
110+bindkey -M viins '^[[1;5D' backward-word
111+bindkey -M vicmd '^[[1;5D' backward-word
112+
113+
114+bindkey '\ew' kill-region # [Esc-w] - Kill from the cursor to the mark
115+bindkey -s '\el' 'ls\n' # [Esc-l] - run command: ls
116+bindkey '^r' history-incremental-search-backward # [Ctrl-r] - Search backward incrementally for a specified string. The string may begin with ^ to anchor the search to the beginning of the line.
117+bindkey ' ' magic-space # [Space] - don't do history expansion
118+
119+
120+# Edit the current command line in $EDITOR
121+autoload -U edit-command-line
122+zle -N edit-command-line
123+bindkey '\C-x\C-e' edit-command-line
124+
125+# file rename magick
126+bindkey "^[m" copy-prev-shell-word
127+
128+# consider emacs keybindings:
129+
130+#bindkey -e ## emacs key bindings
131+#
132+#bindkey '^[[A' up-line-or-search
133+#bindkey '^[[B' down-line-or-search
134+#bindkey '^[^[[C' emacs-forward-word
135+#bindkey '^[^[[D' emacs-backward-word
136+#
137+#bindkey -s '^X^Z' '%-^M'
138+#bindkey '^[e' expand-cmd-path
139+#bindkey '^[^I' reverse-menu-complete
140+#bindkey '^X^N' accept-and-infer-next-history
141+#bindkey '^W' kill-region
142+#bindkey '^I' complete-word
143+## Fix weird sequence that rxvt produces
144+#bindkey -s '^[[Z' '\t'
145+#
+38-0.oh-my-zsh/lib/misc.zsh
@@ -0,0 +1,38 @@
1+autoload -Uz is-at-least
2+
3+# *-magic is known buggy in some versions; disable if so
4+if [[ $DISABLE_MAGIC_FUNCTIONS != true ]]; then
5+ for d in $fpath; do
6+ if [[ -e "$d/url-quote-magic" ]]; then
7+ if is-at-least 5.1; then
8+ autoload -Uz bracketed-paste-magic
9+ zle -N bracketed-paste bracketed-paste-magic
10+ fi
11+ autoload -Uz url-quote-magic
12+ zle -N self-insert url-quote-magic
13+ break
14+ fi
15+ done
16+fi
17+
18+setopt multios # enable redirect to multiple streams: echo >file1 >file2
19+setopt long_list_jobs # show long list format job notifications
20+setopt interactivecomments # recognize comments
21+
22+# define pager depending on what is available (less or more)
23+if (( ${+commands[less]} )); then
24+ env_default 'PAGER' 'less'
25+ env_default 'LESS' '-R'
26+elif (( ${+commands[more]} )); then
27+ env_default 'PAGER' 'more'
28+fi
29+
30+## super user alias
31+alias _='sudo '
32+
33+## more intelligent acking for ubuntu users and no alias for users without ack
34+if (( $+commands[ack-grep] )); then
35+ alias afind='ack-grep -il'
36+elif (( $+commands[ack] )); then
37+ alias afind='ack -il'
38+fi
+6-0.oh-my-zsh/lib/nvm.zsh
@@ -0,0 +1,6 @@
1+# get the nvm-controlled node.js version
2+function nvm_prompt_info() {
3+ which nvm &>/dev/null || return
4+ local nvm_prompt=${$(nvm current)#v}
5+ echo "${ZSH_THEME_NVM_PROMPT_PREFIX}${nvm_prompt:gs/%/%%}${ZSH_THEME_NVM_PROMPT_SUFFIX}"
6+}
+45-0.oh-my-zsh/lib/prompt_info_functions.zsh
@@ -0,0 +1,45 @@
1+# *_prompt_info functions for usage in your prompt
2+#
3+# Plugin creators, please add your *_prompt_info function to the list
4+# of dummy implementations to help theme creators not receiving errors
5+# without the need of implementing conditional clauses.
6+#
7+# See also lib/bzr.zsh, lib/git.zsh and lib/nvm.zsh for
8+# git_prompt_info, bzr_prompt_info and nvm_prompt_info
9+
10+# Dummy implementations that return false to prevent command_not_found
11+# errors with themes, that implement these functions
12+# Real implementations will be used when the respective plugins are loaded
13+function chruby_prompt_info \
14+ rbenv_prompt_info \
15+ hg_prompt_info \
16+ pyenv_prompt_info \
17+ svn_prompt_info \
18+ vi_mode_prompt_info \
19+ virtualenv_prompt_info \
20+ jenv_prompt_info \
21+ azure_prompt_info \
22+ tf_prompt_info \
23+ conda_prompt_info \
24+{
25+ return 1
26+}
27+
28+# oh-my-zsh supports an rvm prompt by default
29+# get the name of the rvm ruby version
30+function rvm_prompt_info() {
31+ [ -f $HOME/.rvm/bin/rvm-prompt ] || return 1
32+ local rvm_prompt
33+ rvm_prompt=$($HOME/.rvm/bin/rvm-prompt ${=ZSH_THEME_RVM_PROMPT_OPTIONS} 2>/dev/null)
34+ [[ -z "${rvm_prompt}" ]] && return 1
35+ echo "${ZSH_THEME_RUBY_PROMPT_PREFIX}${rvm_prompt:gs/%/%%}${ZSH_THEME_RUBY_PROMPT_SUFFIX}"
36+}
37+
38+ZSH_THEME_RVM_PROMPT_OPTIONS="i v g"
39+
40+
41+# use this to enable users to see their ruby version, no matter which
42+# version management system they use
43+function ruby_prompt_info() {
44+ echo "$(rvm_prompt_info || rbenv_prompt_info || chruby_prompt_info)"
45+}
+38-0.oh-my-zsh/lib/spectrum.zsh
@@ -0,0 +1,38 @@
1+# A script to make using 256 colors in zsh less painful.
2+# P.C. Shyamshankar <sykora@lucentbeing.com>
3+# Copied from https://github.com/sykora/etc/blob/master/zsh/functions/spectrum/
4+
5+typeset -AHg FX FG BG
6+
7+FX=(
8+ reset "%{%}"
9+ bold "%{%}" no-bold "%{%}"
10+ dim "%{%}" no-dim "%{%}"
11+ italic "%{%}" no-italic "%{%}"
12+ underline "%{%}" no-underline "%{%}"
13+ blink "%{%}" no-blink "%{%}"
14+ reverse "%{%}" no-reverse "%{%}"
15+)
16+
17+for color in {000..255}; do
18+ FG[$color]="%{[38;5;${color}m%}"
19+ BG[$color]="%{[48;5;${color}m%}"
20+done
21+
22+# Show all 256 colors with color number
23+function spectrum_ls() {
24+ setopt localoptions nopromptsubst
25+ local ZSH_SPECTRUM_TEXT=${ZSH_SPECTRUM_TEXT:-Arma virumque cano Troiae qui primus ab oris}
26+ for code in {000..255}; do
27+ print -P -- "$code: ${FG[$code]}${ZSH_SPECTRUM_TEXT}%{$reset_color%}"
28+ done
29+}
30+
31+# Show all 256 colors where the background is set to specific color
32+function spectrum_bls() {
33+ setopt localoptions nopromptsubst
34+ local ZSH_SPECTRUM_TEXT=${ZSH_SPECTRUM_TEXT:-Arma virumque cano Troiae qui primus ab oris}
35+ for code in {000..255}; do
36+ print -P -- "$code: ${BG[$code]}${ZSH_SPECTRUM_TEXT}%{$reset_color%}"
37+ done
38+}
+164-0.oh-my-zsh/lib/termsupport.zsh
@@ -0,0 +1,164 @@
1+# Set terminal window and tab/icon title
2+#
3+# usage: title short_tab_title [long_window_title]
4+#
5+# See: http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#ss3.1
6+# Fully supports screen, iterm, and probably most modern xterm and rxvt
7+# (In screen, only short_tab_title is used)
8+# Limited support for Apple Terminal (Terminal can't set window and tab separately)
9+function title {
10+ setopt localoptions nopromptsubst
11+
12+ # Don't set the title if inside emacs, unless using vterm
13+ [[ -n "${INSIDE_EMACS:-}" && "$INSIDE_EMACS" != vterm ]] && return
14+
15+ # if $2 is unset use $1 as default
16+ # if it is set and empty, leave it as is
17+ : ${2=$1}
18+
19+ case "$TERM" in
20+ cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty*|st*|foot*|contour*)
21+ print -Pn "\e]2;${2:q}\a" # set window name
22+ print -Pn "\e]1;${1:q}\a" # set tab name
23+ ;;
24+ screen*|tmux*)
25+ print -Pn "\ek${1:q}\e\\" # set screen hardstatus
26+ ;;
27+ *)
28+ if [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then
29+ print -Pn "\e]2;${2:q}\a" # set window name
30+ print -Pn "\e]1;${1:q}\a" # set tab name
31+ else
32+ # Try to use terminfo to set the title if the feature is available
33+ if (( ${+terminfo[fsl]} && ${+terminfo[tsl]} )); then
34+ print -Pn "${terminfo[tsl]}$1${terminfo[fsl]}"
35+ fi
36+ fi
37+ ;;
38+ esac
39+}
40+
41+ZSH_THEME_TERM_TAB_TITLE_IDLE="%15<..<%~%<<" #15 char left truncated PWD
42+ZSH_THEME_TERM_TITLE_IDLE="%n@%m:%~"
43+# Avoid duplication of directory in terminals with independent dir display
44+if [[ "$TERM_PROGRAM" == Apple_Terminal ]]; then
45+ ZSH_THEME_TERM_TITLE_IDLE="%n@%m"
46+fi
47+
48+# Runs before showing the prompt
49+function omz_termsupport_precmd {
50+ [[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return 0
51+ title "$ZSH_THEME_TERM_TAB_TITLE_IDLE" "$ZSH_THEME_TERM_TITLE_IDLE"
52+}
53+
54+# Runs before executing the command
55+function omz_termsupport_preexec {
56+ [[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return
57+
58+ emulate -L zsh
59+ setopt extended_glob
60+
61+ # split command into array of arguments
62+ local -a cmdargs
63+ cmdargs=("${(z)2}")
64+ # if running fg, extract the command from the job description
65+ if [[ "${cmdargs[1]}" = fg ]]; then
66+ # get the job id from the first argument passed to the fg command
67+ local job_id jobspec="${cmdargs[2]#%}"
68+ # logic based on jobs arguments:
69+ # http://zsh.sourceforge.net/Doc/Release/Jobs-_0026-Signals.html#Jobs
70+ # https://www.zsh.org/mla/users/2007/msg00704.html
71+ case "$jobspec" in
72+ <->) # %number argument:
73+ # use the same <number> passed as an argument
74+ job_id=${jobspec} ;;
75+ ""|%|+) # empty, %% or %+ argument:
76+ # use the current job, which appears with a + in $jobstates:
77+ # suspended:+:5071=suspended (tty output)
78+ job_id=${(k)jobstates[(r)*:+:*]} ;;
79+ -) # %- argument:
80+ # use the previous job, which appears with a - in $jobstates:
81+ # suspended:-:6493=suspended (signal)
82+ job_id=${(k)jobstates[(r)*:-:*]} ;;
83+ [?]*) # %?string argument:
84+ # use $jobtexts to match for a job whose command *contains* <string>
85+ job_id=${(k)jobtexts[(r)*${(Q)jobspec}*]} ;;
86+ *) # %string argument:
87+ # use $jobtexts to match for a job whose command *starts with* <string>
88+ job_id=${(k)jobtexts[(r)${(Q)jobspec}*]} ;;
89+ esac
90+
91+ # override preexec function arguments with job command
92+ if [[ -n "${jobtexts[$job_id]}" ]]; then
93+ 1="${jobtexts[$job_id]}"
94+ 2="${jobtexts[$job_id]}"
95+ fi
96+ fi
97+
98+ # cmd name only, or if this is sudo or ssh, the next cmd
99+ local CMD="${1[(wr)^(*=*|sudo|ssh|mosh|rake|-*)]:gs/%/%%}"
100+ local LINE="${2:gs/%/%%}"
101+
102+ title "$CMD" "%100>...>${LINE}%<<"
103+}
104+
105+autoload -Uz add-zsh-hook
106+
107+if [[ -z "$INSIDE_EMACS" || "$INSIDE_EMACS" = vterm ]]; then
108+ add-zsh-hook precmd omz_termsupport_precmd
109+ add-zsh-hook preexec omz_termsupport_preexec
110+fi
111+
112+# Keep terminal emulator's current working directory correct,
113+# even if the current working directory path contains symbolic links
114+#
115+# References:
116+# - Apple's Terminal.app: https://superuser.com/a/315029
117+# - iTerm2: https://iterm2.com/documentation-escape-codes.html (iTerm2 Extension / CurrentDir+RemoteHost)
118+# - Konsole: https://bugs.kde.org/show_bug.cgi?id=327720#c1
119+# - libvte (gnome-terminal, mate-terminal, โ€ฆ): https://bugzilla.gnome.org/show_bug.cgi?id=675987#c14
120+# Apparently it had a bug before ~2012 were it would display the unknown OSC 7 code
121+#
122+# As of May 2021 mlterm, PuTTY, rxvt, screen, termux & xterm simply ignore the unknown OSC.
123+
124+# Don't define the function if we're inside Emacs or in an SSH session (#11696)
125+if [[ -n "$INSIDE_EMACS" || -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then
126+ return
127+fi
128+
129+# Don't define the function if we're in an unsupported terminal
130+case "$TERM" in
131+ # all of these either process OSC 7 correctly or ignore entirely
132+ xterm*|putty*|rxvt*|konsole*|mlterm*|alacritty*|screen*|tmux*) ;;
133+ contour*|foot*) ;;
134+ *)
135+ # Terminal.app and iTerm2 process OSC 7 correctly
136+ case "$TERM_PROGRAM" in
137+ Apple_Terminal|iTerm.app) ;;
138+ *) return ;;
139+ esac ;;
140+esac
141+
142+# Emits the control sequence to notify many terminal emulators
143+# of the cwd
144+#
145+# Identifies the directory using a file: URI scheme, including
146+# the host name to disambiguate local vs. remote paths.
147+function omz_termsupport_cwd {
148+ setopt localoptions unset
149+ # Percent-encode the host and path names.
150+ local URL_HOST URL_PATH
151+ URL_HOST="$(omz_urlencode -P $HOST)" || return 1
152+ URL_PATH="$(omz_urlencode -P $PWD)" || return 1
153+
154+ # Konsole errors if the HOST is provided
155+ [[ -z "$KONSOLE_PROFILE_NAME" && -z "$KONSOLE_DBUS_SESSION" ]] || URL_HOST=""
156+
157+ # common control sequence (OSC 7) to set current host and path
158+ printf "\e]7;file://%s%s\e\\" "${URL_HOST}" "${URL_PATH}"
159+}
160+
161+# Use a precmd hook instead of a chpwd hook to avoid contaminating output
162+# i.e. when a script or function changes directory without `cd -q`, chpwd
163+# will be called the output may be swallowed by the script or function.
164+add-zsh-hook precmd omz_termsupport_cwd
+169-0.oh-my-zsh/lib/tests/cli.test.zsh
@@ -0,0 +1,169 @@
1+#!/usr/bin/zsh -df
2+
3+run_awk() {
4+ local -a dis_plugins=(${=1})
5+ local input_text="$2"
6+
7+ (( ! DEBUG )) || set -xv
8+
9+ local awk_subst_plugins="\
10+ gsub(/[ \t]+(${(j:|:)dis_plugins})[ \t]+/, \" \") # with spaces before or after
11+ gsub(/[ \t]+(${(j:|:)dis_plugins})$/, \"\") # with spaces before and EOL
12+ gsub(/^(${(j:|:)dis_plugins})[ \t]+/, \"\") # with BOL and spaces after
13+
14+ gsub(/\((${(j:|:)dis_plugins})[ \t]+/, \"(\") # with parenthesis before and spaces after
15+ gsub(/[ \t]+(${(j:|:)dis_plugins})\)/, \")\") # with spaces before or parenthesis after
16+ gsub(/\((${(j:|:)dis_plugins})\)/, \"()\") # with only parentheses
17+
18+ gsub(/^(${(j:|:)dis_plugins})\)/, \")\") # with BOL and closing parenthesis
19+ gsub(/\((${(j:|:)dis_plugins})$/, \"(\") # with opening parenthesis and EOL
20+ "
21+ # Disable plugins awk script
22+ local awk_script="
23+ # if plugins=() is in oneline form, substitute disabled plugins and go to next line
24+ /^[ \t]*plugins=\([^#]+\).*\$/ {
25+ $awk_subst_plugins
26+ print \$0
27+ next
28+ }
29+
30+ # if plugins=() is in multiline form, enable multi flag and disable plugins if they're there
31+ /^[ \t]*plugins=\(/ {
32+ multi=1
33+ $awk_subst_plugins
34+ print \$0
35+ next
36+ }
37+
38+ # if multi flag is enabled and we find a valid closing parenthesis, remove plugins and disable multi flag
39+ multi == 1 && /^[^#]*\)/ {
40+ multi=0
41+ $awk_subst_plugins
42+ print \$0
43+ next
44+ }
45+
46+ multi == 1 && length(\$0) > 0 {
47+ $awk_subst_plugins
48+ if (length(\$0) > 0) print \$0
49+ next
50+ }
51+
52+ { print \$0 }
53+ "
54+
55+ command awk "$awk_script" <<< "$input_text"
56+
57+ (( ! DEBUG )) || set +xv
58+}
59+
60+# runs awk against stdin, checks if the resulting file is not empty and then checks if the file has valid zsh syntax
61+run_awk_and_test() {
62+ local description="$1"
63+ local plugins_to_disable="$2"
64+ local input_text="$3"
65+ local expected_output="$4"
66+
67+ local tmpfile==(:)
68+
69+ {
70+ print -u2 "Test: $description"
71+ DEBUG=0 run_awk "$plugins_to_disable" "$input_text" >| $tmpfile
72+
73+ if [[ ! -s "$tmpfile" ]]; then
74+ print -u2 "\e[31mError\e[0m: output file empty"
75+ return 1
76+ fi
77+
78+ if ! zsh -n $tmpfile; then
79+ print -u2 "\e[31mError\e[0m: zsh syntax error"
80+ diff -u $tmpfile <(echo "$expected_output")
81+ return 1
82+ fi
83+
84+ if ! diff -u --color=always $tmpfile <(echo "$expected_output"); then
85+ if (( DEBUG )); then
86+ print -u2 ""
87+ DEBUG=1 run_awk "$plugins_to_disable" "$input_text"
88+ print -u2 ""
89+ fi
90+ print -u2 "\e[31mError\e[0m: output file does not match expected output"
91+ return 1
92+ fi
93+
94+ print -u2 "\e[32mSuccess\e[0m"
95+ } always {
96+ print -u2 ""
97+ command rm -f "$tmpfile"
98+ }
99+}
100+
101+# These tests are for the `omz plugin disable` command
102+run_awk_and_test \
103+ "it should delete a single plugin in oneline format" \
104+ "git" \
105+ "plugins=(git)" \
106+ "plugins=()"
107+
108+run_awk_and_test \
109+ "it should delete a single plugin in multiline format" \
110+ "github" \
111+"plugins=(
112+ github
113+)" \
114+"plugins=(
115+)"
116+
117+run_awk_and_test \
118+ "it should delete multiple plugins in oneline format" \
119+ "github git z" \
120+ "plugins=(github git z)" \
121+ "plugins=()"
122+
123+run_awk_and_test \
124+ "it should delete multiple plugins in multiline format" \
125+ "github git z" \
126+"plugins=(
127+ github
128+ git
129+ z
130+)" \
131+"plugins=(
132+)"
133+
134+run_awk_and_test \
135+ "it should delete a single plugin among multiple in oneline format" \
136+ "git" \
137+ "plugins=(github git z)" \
138+ "plugins=(github z)"
139+
140+run_awk_and_test \
141+ "it should delete a single plugin among multiple in multiline format" \
142+ "git" \
143+"plugins=(
144+ github
145+ git
146+ z
147+)" \
148+"plugins=(
149+ github
150+ z
151+)"
152+
153+run_awk_and_test \
154+ "it should delete multiple plugins in mixed format" \
155+ "git z" \
156+"plugins=(github
157+git z)" \
158+"plugins=(github
159+)"
160+
161+run_awk_and_test \
162+ "it should delete multiple plugins in mixed format 2" \
163+ "github z" \
164+"plugins=(github
165+ git
166+z)" \
167+"plugins=(
168+ git
169+)"
+81-0.oh-my-zsh/lib/theme-and-appearance.zsh
@@ -0,0 +1,81 @@
1+# Sets color variable such as $fg, $bg, $color and $reset_color
2+autoload -U colors && colors
3+
4+# Expand variables and commands in PROMPT variables
5+setopt prompt_subst
6+
7+# Prompt function theming defaults
8+ZSH_THEME_GIT_PROMPT_PREFIX="git:(" # Beginning of the git prompt, before the branch name
9+ZSH_THEME_GIT_PROMPT_SUFFIX=")" # End of the git prompt
10+ZSH_THEME_GIT_PROMPT_DIRTY="*" # Text to display if the branch is dirty
11+ZSH_THEME_GIT_PROMPT_CLEAN="" # Text to display if the branch is clean
12+ZSH_THEME_RUBY_PROMPT_PREFIX="("
13+ZSH_THEME_RUBY_PROMPT_SUFFIX=")"
14+
15+
16+# Use diff --color if available
17+if command diff --color /dev/null{,} &>/dev/null; then
18+ function diff {
19+ command diff --color "$@"
20+ }
21+fi
22+
23+# Don't set ls coloring if disabled
24+[[ "$DISABLE_LS_COLORS" != true ]] || return 0
25+
26+# Default coloring for BSD-based ls
27+export LSCOLORS="Gxfxcxdxbxegedabagacad"
28+
29+# Default coloring for GNU-based ls
30+if [[ -z "$LS_COLORS" ]]; then
31+ # Define LS_COLORS via dircolors if available. Otherwise, set a default
32+ # equivalent to LSCOLORS (generated via https://geoff.greer.fm/lscolors)
33+ if (( $+commands[dircolors] )); then
34+ [[ -f "$HOME/.dircolors" ]] \
35+ && source <(dircolors -b "$HOME/.dircolors") \
36+ || source <(dircolors -b)
37+ else
38+ export LS_COLORS="di=1;36:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43"
39+ fi
40+fi
41+
42+function test-ls-args {
43+ local cmd="$1" # ls, gls, colorls, ...
44+ local args="${@[2,-1]}" # arguments except the first one
45+ command "$cmd" "$args" /dev/null &>/dev/null
46+}
47+
48+# Find the option for using colors in ls, depending on the version
49+case "$OSTYPE" in
50+ netbsd*)
51+ # On NetBSD, test if `gls` (GNU ls) is installed (this one supports colors);
52+ # otherwise, leave ls as is, because NetBSD's ls doesn't support -G
53+ test-ls-args gls --color && alias ls='gls --color=tty'
54+ ;;
55+ openbsd*)
56+ # On OpenBSD, `gls` (ls from GNU coreutils) and `colorls` (ls from base,
57+ # with color and multibyte support) are available from ports.
58+ # `colorls` will be installed on purpose and can't be pulled in by installing
59+ # coreutils (which might be installed for ), so prefer it to `gls`.
60+ test-ls-args gls --color && alias ls='gls --color=tty'
61+ test-ls-args colorls -G && alias ls='colorls -G'
62+ ;;
63+ (darwin|freebsd)*)
64+ # This alias works by default just using $LSCOLORS
65+ test-ls-args ls -G && alias ls='ls -G'
66+ # Only use GNU ls if installed and there are user defaults for $LS_COLORS,
67+ # as the default coloring scheme is not very pretty
68+ zstyle -t ':omz:lib:theme-and-appearance' gnu-ls \
69+ && test-ls-args gls --color \
70+ && alias ls='gls --color=tty'
71+ ;;
72+ *)
73+ if test-ls-args ls --color; then
74+ alias ls='ls --color=tty'
75+ elif test-ls-args ls -G; then
76+ alias ls='ls -G'
77+ fi
78+ ;;
79+esac
80+
81+unfunction test-ls-args
+53-0.oh-my-zsh/lib/vcs_info.zsh
@@ -0,0 +1,53 @@
1+# Don't skip this file until a Zsh release does the necessary quoting.
2+# This is because even though 5.8.1 undid recursive prompt_subst inside
3+# prompt sequences, % characters in relevant fields will still be rendered
4+# incorrectly in vcs_info, on all Zsh releases up to writing this.
5+#
6+# There is no release yet that does this right, since it requires changing
7+# how what vcs_info hooks expect to receive. Even so, I'd rather be correct
8+# and break custom vcs_info hooks than have a broken prompt.
9+
10+# Quote necessary $hook_com[<field>] items just before they are used
11+# in the line "VCS_INFO_hook 'post-backend'" of the VCS_INFO_formats
12+# function, where <field> is:
13+#
14+# base: the full path of the repository's root directory.
15+# base-name: the name of the repository's root directory.
16+# branch: the name of the currently checked out branch.
17+# misc: a string that may contain anything the vcs_info backend wants.
18+# revision: an identifier of the currently checked out revision.
19+# subdir: the path of the current directory relative to the
20+# repository's root directory.
21+#
22+# This patch %-quotes these fields previous to their use in vcs_info hooks and
23+# the zformat call and, eventually, when they get expanded in the prompt.
24+# It's important to quote these here, and not later after hooks have modified the
25+# fields, because then we could be quoting % characters from valid prompt sequences,
26+# like %F{color}, %B, etc.
27+#
28+# 32 โ”‚ hook_com[subdir]="$(VCS_INFO_reposub ${hook_com[base]})"
29+# 33 โ”‚ hook_com[subdir_orig]="${hook_com[subdir]}"
30+# 34 โ”‚
31+# 35 + โ”‚ for tmp in base base-name branch misc revision subdir; do
32+# 36 + โ”‚ hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"
33+# 37 + โ”‚ done
34+# 38 + โ”‚
35+# 39 โ”‚ VCS_INFO_hook 'post-backend'
36+#
37+# This is especially important so that no command substitution is performed
38+# due to malicious input as a consequence of CVE-2021-45444, which affects
39+# zsh versions from 5.0.3 to 5.8.
40+#
41+autoload -Uz +X regexp-replace VCS_INFO_formats 2>/dev/null || return 0
42+
43+# We use $tmp here because it's already a local variable in VCS_INFO_formats
44+typeset PATCH='for tmp (base base-name branch misc revision subdir) hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"'
45+# Unique string to avoid reapplying the patch if this code gets called twice
46+typeset PATCH_ID=vcs_info-patch-9b9840f2-91e5-4471-af84-9e9a0dc68c1b
47+# Only patch the VCS_INFO_formats function if not already patched
48+if [[ "$functions[VCS_INFO_formats]" != *$PATCH_ID* ]]; then
49+ regexp-replace 'functions[VCS_INFO_formats]' \
50+ "VCS_INFO_hook 'post-backend'" \
51+ ': ${PATCH_ID}; ${PATCH}; ${MATCH}'
52+fi
53+unset PATCH PATCH_ID
+234-0.oh-my-zsh/oh-my-zsh.sh
@@ -0,0 +1,234 @@
1+# ANSI formatting function (\033[<code>m)
2+# 0: reset, 1: bold, 4: underline, 22: no bold, 24: no underline, 31: red, 33: yellow
3+omz_f() {
4+ [ $# -gt 0 ] || return
5+ IFS=";" printf "\033[%sm" $*
6+}
7+# If stdout is not a terminal ignore all formatting
8+[ -t 1 ] || omz_f() { :; }
9+
10+# Protect against non-zsh execution of Oh My Zsh (use POSIX syntax here)
11+[ -n "$ZSH_VERSION" ] || {
12+ omz_ptree() {
13+ # Get process tree of the current process
14+ pid=$$; pids="$pid"
15+ while [ ${pid-0} -ne 1 ] && ppid=$(ps -e -o pid,ppid | awk "\$1 == $pid { print \$2 }"); do
16+ pids="$pids $pid"; pid=$ppid
17+ done
18+
19+ # Show process tree
20+ case "$(uname)" in
21+ Linux) ps -o ppid,pid,command -f -p $pids 2>/dev/null ;;
22+ Darwin|*) ps -o ppid,pid,command -p $pids 2>/dev/null ;;
23+ esac
24+
25+ # If ps command failed, try Busybox ps
26+ [ $? -eq 0 ] || ps -o ppid,pid,comm | awk "NR == 1 || index(\"$pids\", \$2) != 0"
27+ }
28+
29+ {
30+ shell=$(ps -o pid,comm | awk "\$1 == $$ { print \$2 }")
31+ printf "$(omz_f 1 31)Error:$(omz_f 22) Oh My Zsh can't be loaded from: $(omz_f 1)${shell}$(omz_f 22). "
32+ printf "You need to run $(omz_f 1)zsh$(omz_f 22) instead.$(omz_f 0)\n"
33+ printf "$(omz_f 33)Here's the process tree:$(omz_f 22)\n\n"
34+ omz_ptree
35+ printf "$(omz_f 0)\n"
36+ } >&2
37+
38+ return 1
39+}
40+
41+# Check if in emulation mode, if so early return
42+# https://github.com/ohmyzsh/ohmyzsh/issues/11686
43+[[ "$(emulate)" = zsh ]] || {
44+ printf "$(omz_f 1 31)Error:$(omz_f 22) Oh My Zsh can't be loaded in \`$(emulate)\` emulation mode.$(omz_f 0)\n" >&2
45+ return 1
46+}
47+
48+unset -f omz_f
49+
50+# If ZSH is not defined, use the current script's directory.
51+[[ -n "$ZSH" ]] || export ZSH="${${(%):-%x}:a:h}"
52+
53+# Set ZSH_CUSTOM to the path where your custom config files
54+# and plugins exists, or else we will use the default custom/
55+[[ -n "$ZSH_CUSTOM" ]] || ZSH_CUSTOM="$ZSH/custom"
56+
57+# Set ZSH_CACHE_DIR to the path where cache files should be created
58+# or else we will use the default cache/
59+[[ -n "$ZSH_CACHE_DIR" ]] || ZSH_CACHE_DIR="$ZSH/cache"
60+
61+# Make sure $ZSH_CACHE_DIR is writable, otherwise use a directory in $HOME
62+if [[ ! -w "$ZSH_CACHE_DIR" ]]; then
63+ ZSH_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/oh-my-zsh"
64+fi
65+
66+# Create cache and completions dir and add to $fpath
67+mkdir -p "$ZSH_CACHE_DIR/completions"
68+(( ${fpath[(Ie)$ZSH_CACHE_DIR/completions]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
69+
70+# Check for updates on initial load...
71+source "$ZSH/tools/check_for_upgrade.sh"
72+
73+# Initializes Oh My Zsh
74+
75+# add a function path
76+fpath=($ZSH/{functions,completions} $ZSH_CUSTOM/{functions,completions} $fpath)
77+
78+# Load all stock functions (from $fpath files) called below.
79+autoload -U compaudit compinit zrecompile
80+
81+is_plugin() {
82+ local base_dir=$1
83+ local name=$2
84+ builtin test -f $base_dir/plugins/$name/$name.plugin.zsh \
85+ || builtin test -f $base_dir/plugins/$name/_$name
86+}
87+
88+# Add all defined plugins to fpath. This must be done
89+# before running compinit.
90+for plugin ($plugins); do
91+ if is_plugin "$ZSH_CUSTOM" "$plugin"; then
92+ fpath=("$ZSH_CUSTOM/plugins/$plugin" $fpath)
93+ elif is_plugin "$ZSH" "$plugin"; then
94+ fpath=("$ZSH/plugins/$plugin" $fpath)
95+ else
96+ echo "[oh-my-zsh] plugin '$plugin' not found"
97+ fi
98+done
99+
100+# Figure out the SHORT hostname
101+if [[ "$OSTYPE" = darwin* ]]; then
102+ # macOS's $HOST changes with dhcp, etc. Use ComputerName if possible.
103+ SHORT_HOST=$(scutil --get ComputerName 2>/dev/null) || SHORT_HOST="${HOST/.*/}"
104+else
105+ SHORT_HOST="${HOST/.*/}"
106+fi
107+
108+# Save the location of the current completion dump file.
109+if [[ -z "$ZSH_COMPDUMP" ]]; then
110+ ZSH_COMPDUMP="${ZDOTDIR:-$HOME}/.zcompdump-${SHORT_HOST}-${ZSH_VERSION}"
111+fi
112+
113+# Construct zcompdump OMZ metadata
114+zcompdump_revision="#omz revision: $(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null)"
115+zcompdump_fpath="#omz fpath: $fpath"
116+
117+# Delete the zcompdump file if OMZ zcompdump metadata changed
118+if ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null \
119+ || ! command grep -q -Fx "$zcompdump_fpath" "$ZSH_COMPDUMP" 2>/dev/null; then
120+ command rm -f "$ZSH_COMPDUMP"
121+ zcompdump_refresh=1
122+fi
123+
124+if [[ "$ZSH_DISABLE_COMPFIX" != true ]]; then
125+ source "$ZSH/lib/compfix.zsh"
126+ # Load only from secure directories
127+ compinit -i -d "$ZSH_COMPDUMP"
128+ # If completion insecurities exist, warn the user
129+ handle_completion_insecurities &|
130+else
131+ # If the user wants it, load from all found directories
132+ compinit -u -d "$ZSH_COMPDUMP"
133+fi
134+
135+# Append zcompdump metadata if missing
136+if (( $zcompdump_refresh )) \
137+ || ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null; then
138+ # Use `tee` in case the $ZSH_COMPDUMP filename is invalid, to silence the error
139+ # See https://github.com/ohmyzsh/ohmyzsh/commit/dd1a7269#commitcomment-39003489
140+ tee -a "$ZSH_COMPDUMP" &>/dev/null <<EOF
141+
142+$zcompdump_revision
143+$zcompdump_fpath
144+EOF
145+fi
146+unset zcompdump_revision zcompdump_fpath zcompdump_refresh
147+
148+# zcompile the completion dump file if the .zwc is older or missing.
149+if command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then
150+ zrecompile -q -p "$ZSH_COMPDUMP"
151+ command rm -rf "$ZSH_COMPDUMP.zwc.old" "${ZSH_COMPDUMP}.lock"
152+fi
153+
154+_omz_source() {
155+ local context filepath="$1"
156+
157+ # Construct zstyle context based on path
158+ case "$filepath" in
159+ lib/*) context="lib:${filepath:t:r}" ;; # :t = lib_name.zsh, :r = lib_name
160+ plugins/*) context="plugins:${filepath:h:t}" ;; # :h = plugins/plugin_name, :t = plugin_name
161+ esac
162+
163+ local disable_aliases=0
164+ zstyle -T ":omz:${context}" aliases || disable_aliases=1
165+
166+ # Back up alias names prior to sourcing
167+ local -A aliases_pre galiases_pre
168+ if (( disable_aliases )); then
169+ aliases_pre=("${(@kv)aliases}")
170+ galiases_pre=("${(@kv)galiases}")
171+ fi
172+
173+ # Source file from $ZSH_CUSTOM if it exists, otherwise from $ZSH
174+ if [[ -f "$ZSH_CUSTOM/$filepath" ]]; then
175+ source "$ZSH_CUSTOM/$filepath"
176+ elif [[ -f "$ZSH/$filepath" ]]; then
177+ source "$ZSH/$filepath"
178+ fi
179+
180+ # Unset all aliases that don't appear in the backed up list of aliases
181+ if (( disable_aliases )); then
182+ if (( #aliases_pre )); then
183+ aliases=("${(@kv)aliases_pre}")
184+ else
185+ (( #aliases )) && unalias "${(@k)aliases}"
186+ fi
187+ if (( #galiases_pre )); then
188+ galiases=("${(@kv)galiases_pre}")
189+ else
190+ (( #galiases )) && unalias "${(@k)galiases}"
191+ fi
192+ fi
193+}
194+
195+# Load all of the lib files in ~/.oh-my-zsh/lib that end in .zsh
196+# TIP: Add files you don't want in git to .gitignore
197+for lib_file ("$ZSH"/lib/*.zsh); do
198+ _omz_source "lib/${lib_file:t}"
199+done
200+unset lib_file
201+
202+# Load all of the plugins that were defined in ~/.zshrc
203+for plugin ($plugins); do
204+ _omz_source "plugins/$plugin/$plugin.plugin.zsh"
205+done
206+unset plugin
207+
208+# Load all of your custom configurations from custom/
209+for config_file ("$ZSH_CUSTOM"/*.zsh(N)); do
210+ source "$config_file"
211+done
212+unset config_file
213+
214+# Load the theme
215+is_theme() {
216+ local base_dir=$1
217+ local name=$2
218+ builtin test -f $base_dir/$name.zsh-theme
219+}
220+
221+if [[ -n "$ZSH_THEME" ]]; then
222+ if is_theme "$ZSH_CUSTOM" "$ZSH_THEME"; then
223+ source "$ZSH_CUSTOM/$ZSH_THEME.zsh-theme"
224+ elif is_theme "$ZSH_CUSTOM/themes" "$ZSH_THEME"; then
225+ source "$ZSH_CUSTOM/themes/$ZSH_THEME.zsh-theme"
226+ elif is_theme "$ZSH/themes" "$ZSH_THEME"; then
227+ source "$ZSH/themes/$ZSH_THEME.zsh-theme"
228+ else
229+ echo "[oh-my-zsh] theme '$ZSH_THEME' not found"
230+ fi
231+fi
232+
233+# set completion colors to be the same as `ls`, after theme has been loaded
234+[[ -z "$LS_COLORS" ]] || zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
+15-0.oh-my-zsh/plugins/1password/1password.plugin.zsh
@@ -0,0 +1,15 @@
1+# Do nothing if op is not installed
2+(( ${+commands[op]} )) || return
3+
4+# If the completion file doesn't exist yet, we need to autoload it and
5+# bind it to `op`. Otherwise, compinit will have already done that.
6+if [[ ! -f "$ZSH_CACHE_DIR/completions/_op" ]]; then
7+ typeset -g -A _comps
8+ autoload -Uz _op
9+ _comps[op]=_op
10+fi
11+
12+op completion zsh >| "$ZSH_CACHE_DIR/completions/_op" &|
13+
14+# Load opswd function
15+autoload -Uz opswd
+40-0.oh-my-zsh/plugins/1password/README.md
@@ -0,0 +1,40 @@
1+# 1Password
2+
3+This plugin adds 1Password functionality to oh-my-zsh.
4+
5+To use, add `1password` to the list of plugins in your `.zshrc` file:
6+
7+```zsh
8+plugins=(... 1password)
9+```
10+
11+Then, you can use the command `opswd` to copy passwords for services into your
12+clipboard.
13+
14+## `opswd`
15+
16+The `opswd` command is a wrapper around the `op` command. It takes a service
17+name as an argument and copies the username, then the password for that service
18+to the clipboard, after confirmation on the user part.
19+
20+If the service also contains a TOTP, it is copied to the clipboard after confirmation
21+on the user part. Finally, after 20 seconds, the clipboard is cleared.
22+
23+For example, `opswd github.com` will put your GitHub username into your clipboard. Then,
24+it will ask for confirmation to continue, and copy the password to your clipboard. Finally,
25+if a TOTP is available, it will be copied to the clipboard after your confirmation.
26+
27+This function has completion support, so you can use tab completion to select which
28+service you want to get.
29+
30+> NOTE: you need to be signed in for `opswd` to work. If you are using biometric unlock,
31+> 1Password CLI will automatically prompt you to sign in. See:
32+>
33+> - [Get started with 1Password CLI 2: Sign in](https://developer.1password.com/docs/cli/get-started#sign-in)
34+> - [Sign in to your 1Password account manually](https://developer.1password.com/docs/cli/sign-in-manually)
35+
36+## Requirements
37+
38+- [1Password CLI 2](https://developer.1password.com/docs/cli/get-started#install)
39+
40+ > NOTE: if you're using 1Password CLI 1, [see how to upgrade to CLI 2](https://developer.1password.com/docs/cli/upgrade).
+19-0.oh-my-zsh/plugins/1password/_opswd
@@ -0,0 +1,19 @@
1+#compdef opswd
2+
3+function _opswd() {
4+ local -a services
5+ services=("${(@f)$(op item list --categories Login --cache 2>/dev/null | awk 'NR != 1 { print $2 }')}")
6+ [[ -z "$services" ]] || compadd -a -- services
7+}
8+
9+# TODO: 2022-03-26: Remove support for op CLI 1
10+autoload -Uz is-at-least
11+is-at-least 2.0.0 $(op --version) || {
12+ function _opswd() {
13+ local -a services
14+ services=("${(@f)$(op list items --categories Login 2>/dev/null | op get item - --fields title 2>/dev/null)}")
15+ [[ -z "$services" ]] || compadd -a -- services
16+ }
17+}
18+
19+_opswd "$@"
+90-0.oh-my-zsh/plugins/1password/opswd
@@ -0,0 +1,90 @@
1+#autoload
2+
3+# opswd puts the password of the named service into the clipboard. If there's a
4+# one time password, it will be copied into the clipboard after 10 seconds. The
5+# clipboard is cleared after another 20 seconds.
6+function opswd() {
7+ if [[ $# -lt 1 ]]; then
8+ echo "Usage: opswd <service>"
9+ return 1
10+ fi
11+
12+ local service=$1
13+
14+ # If not logged in, print error and return
15+ op user list > /dev/null || return
16+
17+ local username
18+ # Copy the username to the clipboard
19+ if ! username=$(op item get "$service" --fields username 2>/dev/null); then
20+ echo "error: could not obtain username for $service"
21+ return 1
22+ fi
23+
24+ echo -n "$username" | clipcopy
25+ echo "โœ” username for service $service copied to the clipboard. Press Enter to continue"
26+ read
27+
28+ local password
29+ # Copy the password to the clipboard
30+ if ! password=$(op item get "$service" --reveal --fields password 2>/dev/null); then
31+ echo "error: could not obtain password for $service"
32+ return 1
33+ fi
34+
35+ echo -n "$password" | clipcopy
36+ echo "โœ” password for $service copied to clipboard. Press Enter to continue"
37+ read
38+
39+ # If there's a one time password, copy it to the clipboard
40+ local totp
41+ if totp=$(op item get --otp "$service" 2>/dev/null) && [[ -n "$totp" ]]; then
42+ echo -n "$totp" | clipcopy
43+ echo "โœ” TOTP for $service copied to clipboard"
44+ fi
45+
46+ (sleep 20 && clipcopy </dev/null 2>/dev/null) &!
47+}
48+
49+# TODO: 2022-03-26: Remove support for op CLI 1
50+autoload -Uz is-at-least
51+is-at-least 2.0.0 $(op --version) || {
52+ print -ru2 ${(%):-"%F{yellow}opswd: usage with op version $(op --version) is deprecated. Upgrade to CLI 2 and reload zsh.
53+For instructions, see https://developer.1password.com/docs/cli/upgrade.%f"}
54+
55+ # opswd puts the password of the named service into the clipboard. If there's a
56+ # one time password, it will be copied into the clipboard after 10 seconds. The
57+ # clipboard is cleared after another 20 seconds.
58+ function opswd() {
59+ if [[ $# -lt 1 ]]; then
60+ echo "Usage: opswd <service>"
61+ return 1
62+ fi
63+
64+ local service=$1
65+
66+ # If not logged in, print error and return
67+ op list users > /dev/null || return
68+
69+ local password
70+ # Copy the password to the clipboard
71+ if ! password=$(op get item "$service" --fields password 2>/dev/null); then
72+ echo "error: could not obtain password for $service"
73+ return 1
74+ fi
75+
76+ echo -n "$password" | clipcopy
77+ echo "โœ” password for $service copied to clipboard"
78+
79+ # If there's a one time password, copy it to the clipboard after 5 seconds
80+ local totp
81+ if totp=$(op get totp "$service" 2>/dev/null) && [[ -n "$totp" ]]; then
82+ sleep 10 && echo -n "$totp" | clipcopy
83+ echo "โœ” TOTP for $service copied to clipboard"
84+ fi
85+
86+ (sleep 20 && clipcopy </dev/null 2>/dev/null) &!
87+ }
88+}
89+
90+opswd "$@"
+9-0.oh-my-zsh/plugins/alias-finder/.zunit.yml
@@ -0,0 +1,9 @@
1+tap: false
2+directories:
3+ tests: tests
4+ output: tests/_output
5+ support: tests/_support
6+time_limit: 0
7+fail_fast: false
8+allow_risky: false
9+verbose: true
+68-0.oh-my-zsh/plugins/alias-finder/README.md
@@ -0,0 +1,68 @@
1+# alias-finder plugin
2+
3+This plugin searches the defined aliases and outputs any that match the command inputted. This makes learning new aliases easier.
4+
5+## Setup
6+
7+To use it, add `alias-finder` to the `plugins` array of your zshrc file:
8+```
9+plugins=(... alias-finder)
10+```
11+
12+To enable it for every single command, set zstyle in your `~/.zshrc`.
13+
14+```zsh
15+# ~/.zshrc
16+
17+zstyle ':omz:plugins:alias-finder' autoload yes # disabled by default
18+zstyle ':omz:plugins:alias-finder' longer yes # disabled by default
19+zstyle ':omz:plugins:alias-finder' exact yes # disabled by default
20+zstyle ':omz:plugins:alias-finder' cheaper yes # disabled by default
21+```
22+
23+As you can see, options are also available with zstyle.
24+
25+## Usage
26+
27+When you execute a command alias finder will look at your defined aliases and suggest shorter aliases you could have used, for example:
28+
29+Running the un-aliased `git status` command:
30+```sh
31+โ•ญโ”€tim@fox ~/repo/gitopolis โ€นmainโ€บ
32+โ•ฐโ”€$ git status
33+
34+gst='git status' # <=== shorter suggestion from alias-finder
35+
36+On branch main
37+Your branch is up-to-date with 'origin/main'.
38+nothing to commit, working tree clean
39+```
40+
41+Running a shorter `git st` alias from `.gitconfig` that it suggested :
42+```sh
43+โ•ญโ”€tim@fox ~/repo/gitopolis โ€นmainโ€บ
44+โ•ฐโ”€$ git st
45+gs='git st' # <=== shorter suggestion from alias-finder
46+## main...origin/main
47+```
48+
49+Running the shortest `gs` shell alias that it found:
50+```sh
51+โ•ญโ”€tim@fox ~/repo/gitopolis โ€นmainโ€บ
52+โ•ฐโ”€$ gs
53+ # <=== no suggestions alias-finder because this is the shortest
54+## main...origin/main
55+```
56+
57+![image](https://github.com/ohmyzsh/ohmyzsh/assets/19378/39642750-fb10-4f1a-b7f9-f36789eeb01b)
58+
59+
60+### Options
61+
62+> In order to clarify, let's say `alias a=abc` has source 'abc' and destination 'a'.
63+
64+- Use `--longer` or `-l` to include aliases where the source is longer than the input (in other words, the source could contain the whole input).
65+- Use `--exact` or `-e` to avoid aliases where the source is shorter than the input (in other words, the source must be the same with the input).
66+- Use `--cheaper` or `-c` to avoid aliases where the destination is longer than the input (in other words, the destination must be the shorter than the input).
67+
68+
+66-0.oh-my-zsh/plugins/alias-finder/alias-finder.plugin.zsh
@@ -0,0 +1,66 @@
1+alias-finder() {
2+ local cmd=" " exact="" longer="" cheaper="" wordEnd="'{0,1}$" finder="" filter=""
3+
4+ # build command and options
5+ for c in "$@"; do
6+ case $c in
7+ # TODO: Remove backward compatibility (other than zstyle form)
8+ # set options if exist
9+ -e|--exact) exact=true;;
10+ -l|--longer) longer=true;;
11+ -c|--cheaper) cheaper=true;;
12+ # concatenate cmd
13+ *) cmd="$cmd$c " ;;
14+ esac
15+ done
16+
17+ zstyle -t ':omz:plugins:alias-finder' longer && longer=true
18+ zstyle -t ':omz:plugins:alias-finder' exact && exact=true
19+ zstyle -t ':omz:plugins:alias-finder' cheaper && cheaper=true
20+
21+ # format cmd for grep
22+ ## - replace newlines with spaces
23+ ## - trim both ends
24+ ## - replace multiple spaces with one space
25+ ## - add escaping character to special characters
26+ cmd=$(echo -n "$cmd" | tr '\n' ' ' | xargs | tr -s '[:space:]' | sed 's/[].\|$(){}?+*^[]/\\&/g')
27+
28+ if [[ $longer == true ]]; then
29+ wordEnd="" # remove wordEnd to find longer aliases
30+ fi
31+
32+ # find with alias and grep, removing last word each time until no more words
33+ while [[ $cmd != "" ]]; do
34+ finder="'{0,1}$cmd$wordEnd"
35+
36+ # make filter to find only shorter results than current cmd
37+ if [[ $cheaper == true ]]; then
38+ cmdLen=$(echo -n "$cmd" | wc -c)
39+ if [[ $cmdLen -le 1 ]]; then
40+ return
41+ fi
42+
43+ filter="^'?.{1,$((cmdLen - 1))}'?=" # some aliases is surrounded by single quotes
44+ fi
45+
46+ alias | grep -E "$filter" | grep -E "=$finder"
47+
48+ if [[ $exact == true ]]; then
49+ break # because exact case is only one
50+ elif [[ $longer == true ]]; then
51+ break # because above grep command already found every longer aliases during first cycle
52+ fi
53+
54+ cmd=$(sed -E 's/ {0,}[^ ]*$//' <<< "$cmd") # remove last word
55+ done
56+}
57+
58+preexec_alias-finder() {
59+ # TODO: Remove backward compatibility (other than zstyle form)
60+ zstyle -t ':omz:plugins:alias-finder' autoload && alias-finder $1 || if [[ $ZSH_ALIAS_FINDER_AUTOMATIC = true ]]; then
61+ alias-finder $1
62+ fi
63+}
64+
65+autoload -U add-zsh-hook
66+add-zsh-hook preexec preexec_alias-finder
+0-0.oh-my-zsh/plugins/alias-finder/tests/_output/.gitkeep

No content changes (mode or rename only).

+0-0.oh-my-zsh/plugins/alias-finder/tests/_support/.gitkeep

No content changes (mode or rename only).

+2-0.oh-my-zsh/plugins/alias-finder/tests/_support/bootstrap
@@ -0,0 +1,2 @@
1+#!/usr/bin/env zsh
2+# Write your bootstrap code here
+107-0.oh-my-zsh/plugins/alias-finder/tests/test_run.sh
@@ -0,0 +1,107 @@
1+#!/usr/bin/env zunit
2+
3+@setup {
4+ load ../alias-finder.plugin.zsh
5+
6+ set_git_aliases() {
7+ unalias -a # all
8+ alias g="git"
9+ alias gc="git commit"
10+ alias gcv="git commit -v"
11+ alias gcvs="git commit -v -S"
12+ }
13+}
14+
15+@test 'find aliases that contain input' {
16+ set_git_aliases
17+
18+ run alias-finder "git"
19+
20+ assert "${#lines[@]}" equals 1
21+ assert "${lines[1]}" same_as "g=git"
22+}
23+
24+@test 'find aliases that contain input with whitespaces at ends' {
25+ set_git_aliases
26+
27+ run alias-finder " git "
28+
29+ assert "${#lines[@]}" equals 1
30+ assert "${lines[1]}" same_as "g=git"
31+}
32+
33+@test 'find aliases that contain multiple words' {
34+ set_git_aliases
35+
36+ run alias-finder "git commit -v"
37+
38+ assert "${#lines[@]}" equals 3
39+ assert "${lines[1]}" same_as "gcv='git commit -v'"
40+ assert "${lines[2]}" same_as "gc='git commit'"
41+ assert "${lines[3]}" same_as "g=git"
42+}
43+
44+@test 'find alias that is the same with input when --exact option is set' {
45+ set_git_aliases
46+
47+ run alias-finder -e "git"
48+
49+ assert "${#lines[@]}" equals 1
50+ assert "${lines[1]}" same_as "g=git"
51+}
52+
53+@test 'find alias that is the same with multiple words input when --exact option is set' {
54+ set_git_aliases
55+
56+ run alias-finder -e "git commit -v"
57+
58+ assert "${#lines[@]}" equals 1
59+ assert "${lines[1]}" same_as "gcv='git commit -v'"
60+}
61+
62+@test 'find alias that is the same with or longer than input when --longer option is set' {
63+ set_git_aliases
64+
65+ run alias-finder -l "git"
66+
67+ assert "${#lines[@]}" equals 4
68+ assert "${lines[1]}" same_as "g=git"
69+ assert "${lines[2]}" same_as "gc='git commit'"
70+ assert "${lines[3]}" same_as "gcv='git commit -v'"
71+ assert "${lines[4]}" same_as "gcvs='git commit -v -S'"
72+}
73+
74+@test 'find alias that is the same with or longer than multiple words input when --longer option is set' {
75+ set_git_aliases
76+
77+ run alias-finder -l "git commit -v"
78+
79+ assert "${#lines[@]}" equals 2
80+ assert "${lines[1]}" same_as "gcv='git commit -v'"
81+ assert "${lines[2]}" same_as "gcvs='git commit -v -S'"
82+}
83+
84+@test 'find aliases including expensive (longer) than input' {
85+ set_git_aliases
86+ alias expensiveCommands="git commit"
87+
88+ run alias-finder "git commit -v"
89+
90+ assert "${#lines[@]}" equals 4
91+ assert "${lines[1]}" same_as "gcv='git commit -v'"
92+ assert "${lines[2]}" same_as "expensiveCommands='git commit'"
93+ assert "${lines[3]}" same_as "gc='git commit'"
94+ assert "${lines[4]}" same_as "g=git"
95+}
96+
97+@test 'find aliases excluding expensive (longer) than input when --cheap option is set' {
98+ set_git_aliases
99+ alias expensiveCommands="git commit"
100+
101+ run alias-finder -c "git commit -v"
102+
103+ assert "${#lines[@]}" equals 3
104+ assert "${lines[1]}" same_as "gcv='git commit -v'"
105+ assert "${lines[2]}" same_as "gc='git commit'"
106+ assert "${lines[3]}" same_as "g=git"
107+}
+1-0.oh-my-zsh/plugins/aliases/.gitignore
@@ -0,0 +1 @@
1+__pycache__
+28-0.oh-my-zsh/plugins/aliases/README.md
@@ -0,0 +1,28 @@
1+# Aliases cheatsheet
2+
3+With lots of 3rd-party amazing aliases installed, this plugin helps list the shortcuts
4+that are currently available based on the plugins you have enabled.
5+
6+To use it, add `aliases` to the plugins array in your zshrc file:
7+
8+```zsh
9+plugins=(aliases)
10+```
11+
12+Requirements: Python needs to be installed.
13+
14+**Maintainer:** [@hqingyi](https://github.com/hqingyi)
15+
16+## Usage
17+
18+- `als`: show all aliases by group
19+
20+- `als -h/--help`: print help message
21+
22+- `als <keyword(s)>`: filter and highlight aliases by `<keyword>`
23+
24+- `als -g <group>/--group <group>`: show only aliases for group `<group>`. Multiple uses of the flag show all groups
25+
26+- `als --groups`: show only group names
27+
28+ ![screenshot](https://github.com/ohmyzsh/ohmyzsh/assets/66907184/5bfa00ea-5fc3-4e97-8b22-2f74f6b948c7)
+14-0.oh-my-zsh/plugins/aliases/aliases.plugin.zsh
@@ -0,0 +1,14 @@
1+# Handle $0 according to the standard:
2+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
3+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
4+0="${${(M)0:#/*}:-$PWD/$0}"
5+
6+eval '
7+ function als(){
8+ (( $+commands[python3] )) || {
9+ echo "[error] No python executable detected"
10+ return
11+ }
12+ alias | python3 "'"${0:h}"'/cheatsheet.py" "$@"
13+ }
14+'
+69-0.oh-my-zsh/plugins/aliases/cheatsheet.py
@@ -0,0 +1,69 @@
1+#!/usr/bin/env python3
2+import sys
3+import itertools
4+import termcolor
5+import argparse
6+
7+def parse(line):
8+ left = line[0:line.find('=')].strip()
9+ right = line[line.find('=')+1:].strip('\'"\n ')
10+ try:
11+ cmd = next(part for part in right.split() if len([char for char in '=<>' if char in part])==0)
12+ except StopIteration:
13+ cmd = right
14+ return (left, right, cmd)
15+
16+def cheatsheet(lines):
17+ exps = [ parse(line) for line in lines ]
18+ exps.sort(key=lambda exp:exp[2])
19+ cheatsheet = {'_default': []}
20+ for key, group in itertools.groupby(exps, lambda exp:exp[2]):
21+ group_list = [ item for item in group ]
22+ if len(group_list)==1:
23+ target_aliases = cheatsheet['_default']
24+ else:
25+ if key not in cheatsheet:
26+ cheatsheet[key] = []
27+ target_aliases = cheatsheet[key]
28+ target_aliases.extend(group_list)
29+ return cheatsheet
30+
31+def pretty_print_group(key, aliases, highlight=None, only_groupname=False):
32+ if len(aliases) == 0:
33+ return
34+ group_hl_formatter = lambda g, hl: termcolor.colored(hl, 'yellow').join([termcolor.colored(part, 'red') for part in ('[%s]' % g).split(hl)])
35+ alias_hl_formatter = lambda alias, hl: termcolor.colored(hl, 'yellow').join([termcolor.colored(part, 'green') for part in ('\t%s = %s' % alias[0:2]).split(hl)])
36+ group_formatter = lambda g: termcolor.colored('[%s]' % g, 'red')
37+ alias_formatter = lambda alias: termcolor.colored('\t%s = %s' % alias[0:2], 'green')
38+ if highlight and len(highlight)>0:
39+ print (group_hl_formatter(key, highlight))
40+ if not only_groupname:
41+ print ('\n'.join([alias_hl_formatter(alias, highlight) for alias in aliases]))
42+ else:
43+ print (group_formatter(key))
44+ if not only_groupname:
45+ print ('\n'.join([alias_formatter(alias) for alias in aliases]))
46+ print ('')
47+
48+def pretty_print(cheatsheet, wfilter, group_list=None, groups_only=False):
49+ sorted_key = sorted(cheatsheet.keys())
50+ for key in sorted_key:
51+ if group_list and key not in group_list:
52+ continue
53+ aliases = cheatsheet.get(key)
54+ if not wfilter:
55+ pretty_print_group(key, aliases, wfilter, groups_only)
56+ else:
57+ pretty_print_group(key, [ alias for alias in aliases if alias[0].find(wfilter)>-1 or alias[1].find(wfilter)>-1], wfilter)
58+
59+if __name__ == '__main__':
60+ parser = argparse.ArgumentParser(description="Pretty print aliases.", prog="als")
61+ parser.add_argument('filter', nargs="*", metavar="<keyword>", help="search aliases matching keywords")
62+ parser.add_argument('-g', '--group', dest="group_list", action='append', help="only print aliases in given groups")
63+ parser.add_argument('--groups', dest='groups_only', action='store_true', help="only print alias groups")
64+ args = parser.parse_args()
65+
66+ lines = sys.stdin.readlines()
67+ group_list = args.group_list or None
68+ wfilter = " ".join(args.filter) or None
69+ pretty_print(cheatsheet(lines), wfilter, group_list, args.groups_only)
+168-0.oh-my-zsh/plugins/aliases/termcolor.py
@@ -0,0 +1,168 @@
1+# coding: utf-8
2+# Copyright (c) 2008-2011 Volvox Development Team
3+#
4+# Permission is hereby granted, free of charge, to any person obtaining a copy
5+# of this software and associated documentation files (the "Software"), to deal
6+# in the Software without restriction, including without limitation the rights
7+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8+# copies of the Software, and to permit persons to whom the Software is
9+# furnished to do so, subject to the following conditions:
10+#
11+# The above copyright notice and this permission notice shall be included in
12+# all copies or substantial portions of the Software.
13+#
14+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20+# THE SOFTWARE.
21+#
22+# Author: Konstantin Lepa <konstantin.lepa@gmail.com>
23+
24+"""ANSI Color formatting for output in terminal."""
25+
26+from __future__ import print_function
27+import os
28+
29+
30+__ALL__ = [ 'colored', 'cprint' ]
31+
32+VERSION = (1, 1, 0)
33+
34+ATTRIBUTES = dict(
35+ list(zip([
36+ 'bold',
37+ 'dark',
38+ '',
39+ 'underline',
40+ 'blink',
41+ '',
42+ 'reverse',
43+ 'concealed'
44+ ],
45+ list(range(1, 9))
46+ ))
47+ )
48+del ATTRIBUTES['']
49+
50+
51+HIGHLIGHTS = dict(
52+ list(zip([
53+ 'on_grey',
54+ 'on_red',
55+ 'on_green',
56+ 'on_yellow',
57+ 'on_blue',
58+ 'on_magenta',
59+ 'on_cyan',
60+ 'on_white'
61+ ],
62+ list(range(40, 48))
63+ ))
64+ )
65+
66+
67+COLORS = dict(
68+ list(zip([
69+ 'grey',
70+ 'red',
71+ 'green',
72+ 'yellow',
73+ 'blue',
74+ 'magenta',
75+ 'cyan',
76+ 'white',
77+ ],
78+ list(range(30, 38))
79+ ))
80+ )
81+
82+
83+RESET = '\033[0m'
84+
85+
86+def colored(text, color=None, on_color=None, attrs=None):
87+ """Colorize text.
88+
89+ Available text colors:
90+ red, green, yellow, blue, magenta, cyan, white.
91+
92+ Available text highlights:
93+ on_red, on_green, on_yellow, on_blue, on_magenta, on_cyan, on_white.
94+
95+ Available attributes:
96+ bold, dark, underline, blink, reverse, concealed.
97+
98+ Example:
99+ colored('Hello, World!', 'red', 'on_grey', ['blue', 'blink'])
100+ colored('Hello, World!', 'green')
101+ """
102+ if os.getenv('ANSI_COLORS_DISABLED') is None:
103+ fmt_str = '\033[%dm%s'
104+ if color is not None:
105+ text = fmt_str % (COLORS[color], text)
106+
107+ if on_color is not None:
108+ text = fmt_str % (HIGHLIGHTS[on_color], text)
109+
110+ if attrs is not None:
111+ for attr in attrs:
112+ text = fmt_str % (ATTRIBUTES[attr], text)
113+
114+ text += RESET
115+ return text
116+
117+
118+def cprint(text, color=None, on_color=None, attrs=None, **kwargs):
119+ """Print colorize text.
120+
121+ It accepts arguments of print function.
122+ """
123+
124+ print((colored(text, color, on_color, attrs)), **kwargs)
125+
126+
127+if __name__ == '__main__':
128+ print('Current terminal type: %s' % os.getenv('TERM'))
129+ print('Test basic colors:')
130+ cprint('Grey color', 'grey')
131+ cprint('Red color', 'red')
132+ cprint('Green color', 'green')
133+ cprint('Yellow color', 'yellow')
134+ cprint('Blue color', 'blue')
135+ cprint('Magenta color', 'magenta')
136+ cprint('Cyan color', 'cyan')
137+ cprint('White color', 'white')
138+ print(('-' * 78))
139+
140+ print('Test highlights:')
141+ cprint('On grey color', on_color='on_grey')
142+ cprint('On red color', on_color='on_red')
143+ cprint('On green color', on_color='on_green')
144+ cprint('On yellow color', on_color='on_yellow')
145+ cprint('On blue color', on_color='on_blue')
146+ cprint('On magenta color', on_color='on_magenta')
147+ cprint('On cyan color', on_color='on_cyan')
148+ cprint('On white color', color='grey', on_color='on_white')
149+ print('-' * 78)
150+
151+ print('Test attributes:')
152+ cprint('Bold grey color', 'grey', attrs=['bold'])
153+ cprint('Dark red color', 'red', attrs=['dark'])
154+ cprint('Underline green color', 'green', attrs=['underline'])
155+ cprint('Blink yellow color', 'yellow', attrs=['blink'])
156+ cprint('Reversed blue color', 'blue', attrs=['reverse'])
157+ cprint('Concealed Magenta color', 'magenta', attrs=['concealed'])
158+ cprint('Bold underline reverse cyan color', 'cyan',
159+ attrs=['bold', 'underline', 'reverse'])
160+ cprint('Dark blink concealed white color', 'white',
161+ attrs=['dark', 'blink', 'concealed'])
162+ print(('-' * 78))
163+
164+ print('Test mixing:')
165+ cprint('Underline red on grey color', 'red', 'on_grey',
166+ ['underline'])
167+ cprint('Reversed green on red color', 'green', 'on_red', ['reverse'])
168+
+31-0.oh-my-zsh/plugins/ansible/README.md
@@ -0,0 +1,31 @@
1+# ansible plugin
2+
3+The `ansible plugin` adds several aliases for useful [ansible](https://docs.ansible.com/ansible/latest/index.html) commands and [aliases](#aliases).
4+
5+To use it, add `ansible` to the plugins array of your zshrc file:
6+
7+```
8+plugins=(... ansible)
9+```
10+
11+## Aliases
12+
13+| Command | Description |
14+|:-------------------------------------------|:--------------------------------------------------------------------|
15+| `ansible-version` / `aver` | Show the version on ansible installed in this host |
16+| `ansible-role-init <role name>` / `arinit` | Creates the Ansible Role as per Ansible Galaxy standard |
17+| `a` | command `ansible` |
18+| `aconf` | command `ansible-config` |
19+| `acon` | command `ansible-console` |
20+| `ainv` | command `ansible-inventory` |
21+| `aplaybook` | command `ansible-playbook` |
22+| `adoc` | command `ansible-doc` |
23+| `agal` | command `ansible-galaxy` |
24+| `apull` | command `ansible-pull` |
25+| `aval` | command `ansible-vault` |
26+
27+## Maintainer
28+
29+### [Deepankumar](https://github.com/deepan10)
30+
31+[https://github.com/deepan10/oh-my-zsh/tree/features/ansible-plugin](https://github.com/deepan10/oh-my-zsh/tree/features/ansible-plugin)
+28-0.oh-my-zsh/plugins/ansible/ansible.plugin.zsh
@@ -0,0 +1,28 @@
1+# Functions
2+function ansible-version(){
3+ ansible --version
4+}
5+
6+function ansible-role-init(){
7+ if ! [ -z $1 ] ; then
8+ echo "Ansible Role : $1 Creating...."
9+ ansible-galaxy init $1
10+ tree $1
11+ else
12+ echo "Usage : ansible-role-init <role name>"
13+ echo "Example : ansible-role-init role1"
14+ fi
15+}
16+
17+# Alias
18+alias a='ansible '
19+alias aconf='ansible-config '
20+alias acon='ansible-console '
21+alias aver='ansible-version'
22+alias arinit='ansible-role-init'
23+alias aplaybook='ansible-playbook '
24+alias ainv='ansible-inventory '
25+alias adoc='ansible-doc '
26+alias agal='ansible-galaxy '
27+alias apull='ansible-pull '
28+alias aval='ansible-vault'
+12-0.oh-my-zsh/plugins/ant/README.md
@@ -0,0 +1,12 @@
1+# Ant
2+
3+This plugin provides completion for [Ant](https://ant.apache.org/).
4+
5+To use it, add `ant` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... ant)
9+```
10+
11+It caches ant targets in a file named `.ant_targets`, you might want to add that to
12+your `.gitignore` file.
+22-0.oh-my-zsh/plugins/ant/_ant
@@ -0,0 +1,22 @@
1+#compdef ant
2+
3+_ant_does_target_list_need_generating () {
4+ [[ ! -f .ant_targets ]] && return 0
5+ [[ build.xml -nt .ant_targets ]] && return 0
6+ return 1
7+}
8+
9+_ant () {
10+ if [[ ! -f build.xml ]]; then
11+ return
12+ fi
13+
14+ if ! _ant_does_target_list_need_generating; then
15+ return
16+ fi
17+
18+ ant -p | awk -F " " 'NR > 5 { print lastTarget } { lastTarget = $1 }' >| .ant_targets
19+ compadd -- "$(cat .ant_targets)"
20+}
21+
22+_ant "$@"
+2-0.oh-my-zsh/plugins/ant/ant.plugin.zsh
@@ -0,0 +1,2 @@
1+# Default to colored output
2+export ANT_ARGS='-logger org.apache.tools.ant.listener.AnsiColorLogger'
+21-0.oh-my-zsh/plugins/apache2-macports/README.md
@@ -0,0 +1,21 @@
1+# apache2-macports plugin
2+
3+Enables aliases to control a local Apache2 installed via [MacPorts](https://www.macports.org/).
4+
5+To use it, add `apache2-macports` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... apache2-macports)
9+```
10+
11+## Aliases
12+
13+| Alias | Function | Description |
14+|----------------|-----------------------------------------|-----------------------|
15+| apache2restart | `sudo /path/to/apache2.wrapper restart` | Restart apache daemon |
16+| apache2start | `sudo /path/to/apache2.wrapper start` | Start apache daemon |
17+| apache2stop | `sudo /path/to/apache2.wrapper stop` | Stop apache daemon |
18+
19+## Contributors
20+
21+- Alexander Rinass (alex@rinass.net)
+6-0.oh-my-zsh/plugins/apache2-macports/apache2-macports.plugin.zsh
@@ -0,0 +1,6 @@
1+# commands to control local apache2 server installation
2+# paths are for osx installation via macports
3+
4+alias apache2start='sudo /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper start'
5+alias apache2stop='sudo /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper stop'
6+alias apache2restart='sudo /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper restart'
+43-0.oh-my-zsh/plugins/arcanist/README.md
@@ -0,0 +1,43 @@
1+## arcanist
2+
3+This plugin adds many useful aliases for [arcanist](https://github.com/phacility/arcanist).
4+
5+To use it, add `arcanist` to the plugins array of your zshrc file:
6+
7+```zsh
8+plugins=(... arcanist)
9+```
10+
11+## Aliases
12+
13+| Alias | Command |
14+| ------- | ---------------------------------- |
15+| ara | `arc amend` |
16+| arb | `arc branch` |
17+| arbl | `arc bland` |
18+| arco | `arc cover` |
19+| arci | `arc commit` |
20+| ard | `arc diff` |
21+| ardc | `arc diff --create` |
22+| ardp | `arc diff --preview` |
23+| ardnu | `arc diff --nounit` |
24+| ardnupc | `arc diff --nounit --plan-changes` |
25+| ardpc | `arc diff --plan-changes` |
26+| are | `arc export` |
27+| arh | `arc help` |
28+| arho | `arc hotfix` |
29+| arl | `arc land` |
30+| arli | `arc lint` |
31+| arls | `arc list` |
32+| arpa | `arc patch` |
33+
34+## Functions
35+
36+The following functions make copy pasting revision ids from the URL bar of your browser
37+easier, as they allow for copy pasting the whole URL. For example: `ardu` accepts
38+both `https://arcanist-url.com/<REVISION>` as well as `<REVISION>`.
39+
40+| Function | Command |
41+| ------------------------- | --------------------------------- |
42+| ardu [URL or revision_id] | `arc diff --update` [revision_id] |
43+| arpa [URL or revision_id] | `arc patch` [revision_id] |
+39-0.oh-my-zsh/plugins/arcanist/arcanist.plugin.zsh
@@ -0,0 +1,39 @@
1+#
2+# Aliases
3+# (sorted alphabetically)
4+#
5+
6+alias ara='arc amend'
7+alias arb='arc branch'
8+alias arbl='arc bland'
9+alias arco='arc cover'
10+alias arci='arc commit'
11+
12+alias ard='arc diff'
13+alias ardc='arc diff --create'
14+alias ardnu='arc diff --nounit'
15+alias ardnupc='arc diff --nounit --plan-changes'
16+alias ardpc='arc diff --plan-changes'
17+alias ardp='arc diff --preview' # creates a new diff in the phab interface
18+
19+alias are='arc export'
20+alias arh='arc help'
21+alias arho='arc hotfix'
22+alias arl='arc land'
23+alias arli='arc lint'
24+alias arls='arc list'
25+
26+#
27+# Functions
28+# (sorted alphabetically)
29+#
30+
31+ardu() {
32+ # Both `ardu https://arcanist-url.com/<REVISION>`, and `ardu <REVISION>` work.
33+ arc diff --update "${1:t}"
34+}
35+
36+arpa() {
37+ # Both `arpa https://arcanist-url.com/<REVISION>`, and `arpa <REVISION>` work.
38+ arc patch "${1:t}"
39+}
+184-0.oh-my-zsh/plugins/archlinux/README.md
@@ -0,0 +1,184 @@
1+# Arch Linux plugin
2+
3+This plugin adds some aliases and functions to work with Arch Linux.
4+
5+To use it, add `archlinux` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... archlinux)
9+```
10+
11+## Features
12+
13+### Pacman
14+
15+| Alias | Command | Description |
16+|--------------|----------------------------------------|------------------------------------------------------------------|
17+| pacin | `sudo pacman -S` | Install packages from the repositories |
18+| pacins | `sudo pacman -U` | Install a package from a local file |
19+| pacinsd | `sudo pacman -S --asdeps` | Install packages as dependencies of another package |
20+| paclean | `sudo pacman -Sc` | Clean out old and unused caches and packages |
21+| pacloc | `pacman -Qi` | Display information about a package in the local database |
22+| paclocs | `pacman -Qs` | Search for packages in the local database |
23+| paclr | `sudo pacman -Scc` | Remove all files from the cache |
24+| paclsorphans | `sudo pacman -Qdt` | List all orphaned packages |
25+| pacmir | `sudo pacman -Syy` | Force refresh of all package lists after updating mirrorlist |
26+| pacre | `sudo pacman -R` | Remove packages, keeping its settings and dependencies |
27+| pacrem | `sudo pacman -Rns` | Remove packages, including its settings and dependencies |
28+| pacrep | `pacman -Si` | Display information about a package in the repositories |
29+| pacreps | `pacman -Ss` | Search for packages in the repositories |
30+| pacrmorphans | `sudo pacman -Rs $(pacman -Qtdq)` | Delete all orphaned packages |
31+| pacupd | `sudo pacman -Sy` | Update and refresh local package, ABS and AUR databases |
32+| pacupg | `sudo pacman -Syu` | Sync with repositories before upgrading packages |
33+| pacfileupg | `sudo pacman -Fy` | Download fresh package databases from the server |
34+| pacfiles | `pacman -F` | Search package file names for matching strings |
35+| pacls | `pacman -Ql` | List files in a package |
36+| pacown | `pacman -Qo` | Show which package owns a file |
37+| upgrade[ยน](#f1) | `sudo pacman -Syu` | Sync with repositories before upgrading packages |
38+
39+| Function | Description |
40+|----------------|-----------------------------------------------------------|
41+| pacdisowned | List all disowned files in your system |
42+| paclist | List all explicitly installed packages with a description |
43+| pacmanallkeys | Get all keys for developers and trusted users |
44+| pacmansignkeys | Locally trust all keys passed as parameters |
45+| pacweb | Open the website of an ArchLinux package |
46+
47+Note: paclist used to print packages with a description which are (1) explicitly installed
48+and (2) available for upgrade. Due to flawed scripting, it also printed all packages if no
49+upgrades were available. Use `pacman -Que` instead.
50+
51+### AUR helpers
52+
53+#### Aura
54+
55+| Alias | Command | Description |
56+|---------|-------------------------------------------------|-------------------------------------------------------------------------|
57+| auclean | `sudo aura -Sc` | Clean out old and unused caches and packages |
58+| auclr | `sudo aura -Scc` | Remove all files from the cache |
59+| auin | `sudo aura -S` | Install packages from the repositories |
60+| aurin | `sudo aura -A` | Install packages from the repositories |
61+| auins | `sudo aura -U` | Install a package from a local file |
62+| auinsd | `sudo aura -S --asdeps` | Install packages as dependencies of another package (repositories only) |
63+| aurinsd | `sudo aura -A --asdeps` | Install packages as dependencies of another package (AUR only) |
64+| auloc | `aura -Qi` | Display information about a package in the local database |
65+| aulocs | `aura -Qs` | Search for packages in the local database |
66+| auls | `aura -Qql` | List all files owned by a given package |
67+| aulst | `aura -Qe` | List installed packages including from AUR (tagged as "local") |
68+| aumir | `sudo aura -Syy` | Force refresh of all package lists after updating mirrorlist |
69+| aurph | `sudo aura -Oj` | Remove orphans using aura |
70+| auown | `aura -Qqo` | Search for packages that own the specified file(s) |
71+| aure | `sudo aura -R` | Remove packages, keeping its settings and dependencies |
72+| aurem | `sudo aura -Rns` | Remove packages, including its settings and unneeded dependencies |
73+| aurep | `aura -Si` | Display information about a package in the repositories |
74+| aurrep | `aura -Ai` | Display information about a package from AUR |
75+| aureps | `aura -As --both` | Search for packages in the repositories and AUR |
76+| auras | `aura -As --both` | Same as above |
77+| auupd | `sudo aura -Sy` | Update and refresh local package, ABS and AUR databases |
78+| auupg | `sudo sh -c "aura -Syu && aura -Au"` | Sync with repositories before upgrading all packages (from AUR too) |
79+| ausu | `sudo sh -c "aura -Syu --no-confirm && aura -Au --no-confirm"` | Same as `auupg`, but without confirmation |
80+| upgrade[ยน](#f1) | `sudo aura -Syu` | Sync with repositories before upgrading packages |
81+
82+| Function | Description |
83+|-----------------|---------------------------------------------------------------------|
84+| auownloc _file_ | Display information about a package that owns the specified file(s) |
85+| auownls _file_ | List all files owned by a package that owns the specified file(s) |
86+
87+#### Pacaur
88+
89+| Alias | Command | Description |
90+|---------|-----------------------------------|---------------------------------------------------------------------|
91+| pacclean| `pacaur -Sc` | Clean out old and unused caches and packages |
92+| pacclr | `pacaur -Scc` | Remove all files from the cache |
93+| pain | `pacaur -S` | Install packages from the repositories |
94+| pains | `pacaur -U` | Install a package from a local file |
95+| painsd | `pacaur -S --asdeps` | Install packages as dependencies of another package |
96+| paloc | `pacaur -Qi` | Display information about a package in the local database |
97+| palocs | `pacaur -Qs` | Search for packages in the local database |
98+| palst | `pacaur -Qe` | List installed packages including from AUR (tagged as "local") |
99+| pamir | `pacaur -Syy` | Force refresh of all package lists after updating mirrorlist |
100+| paorph | `pacaur -Qtd` | Remove orphans using pacaur |
101+| pare | `pacaur -R` | Remove packages, keeping its settings and dependencies |
102+| parem | `pacaur -Rns` | Remove packages, including its settings and unneeded dependencies |
103+| parep | `pacaur -Si` | Display information about a package in the repositories |
104+| pareps | `pacaur -Ss` | Search for packages in the repositories |
105+| paupd | `pacaur -Sy` | Update and refresh local package, ABS and AUR databases |
106+| paupg | `pacaur -Syua` | Sync with repositories before upgrading all packages (from AUR too) |
107+| pasu | `pacaur -Syua --no-confirm` | Same as `paupg`, but without confirmation |
108+| upgrade[ยน](#f1) | `pacaur -Syu` | Sync with repositories before upgrading packages |
109+
110+#### Trizen
111+
112+| Alias | Command | Description |
113+|---------|-----------------------------------|---------------------------------------------------------------------|
114+| trconf | `trizen -C` | Fix all configuration files with vimdiff |
115+| trclean | `trizen -Sc` | Clean out old and unused caches and packages |
116+| trclr | `trizen -Scc` | Remove all files from the cache |
117+| trin | `trizen -S` | Install packages from the repositories |
118+| trins | `trizen -U` | Install a package from a local file |
119+| trinsd | `trizen -S --asdeps` | Install packages as dependencies of another package |
120+| trloc | `trizen -Qi` | Display information about a package in the local database |
121+| trlocs | `trizen -Qs` | Search for packages in the local database |
122+| trlst | `trizen -Qe` | List installed packages including from AUR (tagged as "local") |
123+| trmir | `trizen -Syy` | Force refresh of all package lists after updating mirrorlist |
124+| trorph | `trizen -Qtd` | Remove orphans using yaourt |
125+| trre | `trizen -R` | Remove packages, keeping its settings and dependencies |
126+| trrem | `trizen -Rns` | Remove packages, including its settings and unneeded dependencies |
127+| trrep | `trizen -Si` | Display information about a package in the repositories |
128+| trreps | `trizen -Ss` | Search for packages in the repositories |
129+| trupd | `trizen -Sy` | Update and refresh local package, ABS and AUR databases |
130+| trupg | `trizen -Syua` | Sync with repositories before upgrading all packages (from AUR too) |
131+| trsu | `trizen -Syua --no-confirm` | Same as `trupg`, but without confirmation |
132+| upgrade[ยน](#f1) | `trizen -Syu` | Sync with repositories before upgrading packages |
133+
134+#### Yay
135+
136+| Alias | Command | Description |
137+|---------|--------------------------------|-------------------------------------------------------------------|
138+| yaconf | `yay -Pg` | Print current configuration |
139+| yaclean | `yay -Sc` | Clean out old and unused caches and packages |
140+| yaclr | `yay -Scc` | Remove all files from the cache |
141+| yain | `yay -S` | Install packages from the repositories |
142+| yains | `yay -U` | Install a package from a local file |
143+| yainsd | `yay -S --asdeps` | Install packages as dependencies of another package |
144+| yaloc | `yay -Qi` | Display information about a package in the local database |
145+| yalocs | `yay -Qs` | Search for packages in the local database |
146+| yalst | `yay -Qe` | List installed packages including from AUR (tagged as "local") |
147+| yamir | `yay -Syy` | Force refresh of all package lists after updating mirrorlist |
148+| yaorph | `yay -Qtd` | Remove orphans using yay |
149+| yare | `yay -R` | Remove packages, keeping its settings and dependencies |
150+| yarem | `yay -Rns` | Remove packages, including its settings and unneeded dependencies |
151+| yarep | `yay -Si` | Display information about a package in the repositories |
152+| yareps | `yay -Ss` | Search for packages in the repositories |
153+| yaupd | `yay -Sy` | Update and refresh local package, ABS and AUR databases |
154+| yaupg | `yay -Syu` | Sync with repositories before upgrading packages |
155+| yasu | `yay -Syu --no-confirm` | Same as `yaupg`, but without confirmation |
156+| upgrade[ยน](#f1) | `yay -Syu` | Sync with repositories before upgrading packages |
157+
158+---
159+
160+<span id="f1">ยน</span>
161+The `upgrade` alias is set for all package managers. Its value will depend on
162+whether the package manager is installed, checked in the following order:
163+
164+1. `yay`
165+2. `trizen`
166+3. `pacaur`
167+4. `aura`
168+5. `pacman`
169+
170+## Contributors
171+
172+- Benjamin Boudreau - dreurmail@gmail.com
173+- Celso Miranda - contacto@celsomiranda.net
174+- ratijas (ivan tkachenko) - me@ratijas.tk
175+- Juraj Fiala - doctorjellyface@riseup.net
176+- KhasMek - Boushh@gmail.com
177+- Majora320 (Moses Miller) - Majora320@gmail.com
178+- Martin Putniorz - mputniorz@gmail.com
179+- MatthR3D - matthr3d@gmail.com
180+- ornicar - thibault.duplessis@gmail.com
181+- Ybalrid (Arthur Brainville) - ybalrid@ybalrid.info
182+- Jeff M. Hubbard - jeffmhubbard@gmail.com
183+- K. Harishankar(harishnkr) - hari2menon1234@gmail.com
184+- WH-2099 - wh2099@outlook.com
+204-0.oh-my-zsh/plugins/archlinux/archlinux.plugin.zsh
@@ -0,0 +1,204 @@
1+#######################################
2+# Pacman #
3+#######################################
4+
5+# Pacman - https://wiki.archlinux.org/index.php/Pacman_Tips
6+alias pacupg='sudo pacman -Syu'
7+alias pacin='sudo pacman -S'
8+alias paclean='sudo pacman -Sc'
9+alias pacins='sudo pacman -U'
10+alias paclr='sudo pacman -Scc'
11+alias pacre='sudo pacman -R'
12+alias pacrem='sudo pacman -Rns'
13+alias pacrep='pacman -Si'
14+alias pacreps='pacman -Ss'
15+alias pacloc='pacman -Qi'
16+alias paclocs='pacman -Qs'
17+alias pacinsd='sudo pacman -S --asdeps'
18+alias pacmir='sudo pacman -Syy'
19+alias paclsorphans='sudo pacman -Qdt'
20+alias pacrmorphans='sudo pacman -Rs $(pacman -Qtdq)'
21+alias pacfileupg='sudo pacman -Fy'
22+alias pacfiles='pacman -F'
23+alias pacls='pacman -Ql'
24+alias pacown='pacman -Qo'
25+alias pacupd="sudo pacman -Sy"
26+
27+function paclist() {
28+ pacman -Qqe | xargs -I{} -P0 --no-run-if-empty pacman -Qs --color=auto "^{}\$"
29+}
30+
31+function pacdisowned() {
32+ local tmp_dir db fs
33+ tmp_dir=$(mktemp --directory)
34+ db=$tmp_dir/db
35+ fs=$tmp_dir/fs
36+
37+ trap "rm -rf $tmp_dir" EXIT
38+
39+ pacman -Qlq | sort -u > "$db"
40+
41+ find /etc /usr ! -name lost+found \
42+ \( -type d -printf '%p/\n' -o -print \) | sort > "$fs"
43+
44+ comm -23 "$fs" "$db"
45+
46+ rm -rf $tmp_dir
47+}
48+
49+alias pacmanallkeys='sudo pacman-key --refresh-keys'
50+
51+function pacmansignkeys() {
52+ local key
53+ for key in $@; do
54+ sudo pacman-key --recv-keys $key
55+ sudo pacman-key --lsign-key $key
56+ printf 'trust\n3\n' | sudo gpg --homedir /etc/pacman.d/gnupg \
57+ --no-permission-warning --command-fd 0 --edit-key $key
58+ done
59+}
60+
61+if (( $+commands[xdg-open] )); then
62+ function pacweb() {
63+ if [[ $# = 0 || "$1" =~ '--help|-h' ]]; then
64+ local underline_color="\e[${color[underline]}m"
65+ echo "$0 - open the website of an ArchLinux package"
66+ echo
67+ echo "Usage:"
68+ echo " $bold_color$0$reset_color ${underline_color}target${reset_color}"
69+ return 1
70+ fi
71+
72+ local pkg="$1"
73+ local infos="$(LANG=C pacman -Si "$pkg")"
74+ if [[ -z "$infos" ]]; then
75+ return
76+ fi
77+ local repo="$(grep -m 1 '^Repo' <<< "$infos" | grep -oP '[^ ]+$')"
78+ local arch="$(grep -m 1 '^Arch' <<< "$infos" | grep -oP '[^ ]+$')"
79+ xdg-open "https://www.archlinux.org/packages/$repo/$arch/$pkg/" &>/dev/null
80+ }
81+fi
82+
83+#######################################
84+# AUR helpers #
85+#######################################
86+
87+if (( $+commands[aura] )); then
88+ alias auin='sudo aura -S'
89+ alias aurin='sudo aura -A'
90+ alias auclean='sudo aura -Sc'
91+ alias auclr='sudo aura -Scc'
92+ alias auins='sudo aura -U'
93+ alias auinsd='sudo aura -S --asdeps'
94+ alias aurinsd='sudo aura -A --asdeps'
95+ alias auloc='aura -Qi'
96+ alias aulocs='aura -Qs'
97+ alias aulst='aura -Qe'
98+ alias aumir='sudo aura -Syy'
99+ alias aurph='sudo aura -Oj'
100+ alias aure='sudo aura -R'
101+ alias aurem='sudo aura -Rns'
102+ alias aurep='aura -Si'
103+ alias aurrep='aura -Ai'
104+ alias aureps='aura -As --both'
105+ alias auras='aura -As --both'
106+ alias auupd="sudo aura -Sy"
107+ alias auupg='sudo sh -c "aura -Syu && aura -Au"'
108+ alias ausu='sudo sh -c "aura -Syu --no-confirm && aura -Au --no-confirm"'
109+
110+ # extra bonus specially for aura
111+ alias auown="aura -Qqo"
112+ alias auls="aura -Qql"
113+ function auownloc() { aura -Qi $(aura -Qqo $@); }
114+ function auownls () { aura -Qql $(aura -Qqo $@); }
115+fi
116+
117+if (( $+commands[pacaur] )); then
118+ alias pacclean='pacaur -Sc'
119+ alias pacclr='pacaur -Scc'
120+ alias paupg='pacaur -Syu'
121+ alias pasu='pacaur -Syu --noconfirm'
122+ alias pain='pacaur -S'
123+ alias pains='pacaur -U'
124+ alias pare='pacaur -R'
125+ alias parem='pacaur -Rns'
126+ alias parep='pacaur -Si'
127+ alias pareps='pacaur -Ss'
128+ alias paloc='pacaur -Qi'
129+ alias palocs='pacaur -Qs'
130+ alias palst='pacaur -Qe'
131+ alias paorph='pacaur -Qtd'
132+ alias painsd='pacaur -S --asdeps'
133+ alias pamir='pacaur -Syy'
134+ alias paupd="pacaur -Sy"
135+fi
136+
137+if (( $+commands[trizen] )); then
138+ alias trconf='trizen -C'
139+ alias trupg='trizen -Syua'
140+ alias trsu='trizen -Syua --noconfirm'
141+ alias trin='trizen -S'
142+ alias trclean='trizen -Sc'
143+ alias trclr='trizen -Scc'
144+ alias trins='trizen -U'
145+ alias trre='trizen -R'
146+ alias trrem='trizen -Rns'
147+ alias trrep='trizen -Si'
148+ alias trreps='trizen -Ss'
149+ alias trloc='trizen -Qi'
150+ alias trlocs='trizen -Qs'
151+ alias trlst='trizen -Qe'
152+ alias trorph='trizen -Qtd'
153+ alias trinsd='trizen -S --asdeps'
154+ alias trmir='trizen -Syy'
155+ alias trupd="trizen -Sy"
156+fi
157+
158+if (( $+commands[yay] )); then
159+ alias yaconf='yay -Pg'
160+ alias yaclean='yay -Sc'
161+ alias yaclr='yay -Scc'
162+ alias yaupg='yay -Syu'
163+ alias yasu='yay -Syu --noconfirm'
164+ alias yain='yay -S'
165+ alias yains='yay -U'
166+ alias yare='yay -R'
167+ alias yarem='yay -Rns'
168+ alias yarep='yay -Si'
169+ alias yareps='yay -Ss'
170+ alias yaloc='yay -Qi'
171+ alias yalocs='yay -Qs'
172+ alias yalst='yay -Qe'
173+ alias yaorph='yay -Qtd'
174+ alias yainsd='yay -S --asdeps'
175+ alias yamir='yay -Syy'
176+ alias yaupd="yay -Sy"
177+fi
178+
179+# Check Arch Linux PGP Keyring before System Upgrade to prevent failure.
180+function upgrade() {
181+ sudo pacman -Sy
182+ echo ":: Checking Arch Linux PGP Keyring..."
183+ local installedver="$(LANG= sudo pacman -Qi archlinux-keyring | grep -Po '(?<=Version : ).*')"
184+ local currentver="$(LANG= sudo pacman -Si archlinux-keyring | grep -Po '(?<=Version : ).*')"
185+ if [ $installedver != $currentver ]; then
186+ echo " Arch Linux PGP Keyring is out of date."
187+ echo " Updating before full system upgrade."
188+ sudo pacman -S --needed --noconfirm archlinux-keyring
189+ else
190+ echo " Arch Linux PGP Keyring is up to date."
191+ echo " Proceeding with full system upgrade."
192+ fi
193+ if (( $+commands[yay] )); then
194+ yay -Su
195+ elif (( $+commands[trizen] )); then
196+ trizen -Su
197+ elif (( $+commands[pacaur] )); then
198+ pacaur -Su
199+ elif (( $+commands[aura] )); then
200+ sudo aura -Su
201+ else
202+ sudo pacman -Su
203+ fi
204+}
+9-0.oh-my-zsh/plugins/arduino-cli/README.md
@@ -0,0 +1,9 @@
1+# Arduino CLI plugin
2+
3+This plugin adds completion for the [arduino-cli](https://github.com/arduino/arduino-cli) tool.
4+
5+To use it, add `arduino-cli` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... arduino-cli)
9+```
+14-0.oh-my-zsh/plugins/arduino-cli/arduino-cli.plugin.zsh
@@ -0,0 +1,14 @@
1+if (( ! $+commands[arduino-cli] )); then
2+ return
3+fi
4+
5+# If the completion file doesn't exist yet, we need to autoload it and
6+# bind it to `arduino-cli`. Otherwise, compinit will have already done that.
7+if [[ ! -f "$ZSH_CACHE_DIR/completions/_arduino-cli" ]]; then
8+ typeset -g -A _comps
9+ autoload -Uz _arduino-cli
10+ _comps[arduino-cli]=_arduino-cli
11+fi
12+
13+# Generate and load arduino-cli completion
14+arduino-cli completion zsh >! "$ZSH_CACHE_DIR/completions/_arduino-cli" &|
+20-0.oh-my-zsh/plugins/argocd/README.md
@@ -0,0 +1,20 @@
1+# Argo CD plugin
2+
3+This plugin adds completion for the [Argo CD](https://argoproj.github.io/cd/) CLI.
4+
5+To use it, add `argocd` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... argocd)
9+```
10+
11+This plugin does not add any aliases.
12+
13+## Cache
14+
15+This plugin caches the completion script and is automatically updated asynchronously when the plugin is
16+loaded, which is usually when you start up a new terminal emulator.
17+
18+The cache is stored at:
19+
20+- `$ZSH_CACHE/completions/_argocd` completions script
+14-0.oh-my-zsh/plugins/argocd/argocd.plugin.zsh
@@ -0,0 +1,14 @@
1+# Autocompletion for argocd.
2+if (( ! $+commands[argocd] )); then
3+ return
4+fi
5+
6+# If the completion file doesn't exist yet, we need to autoload it and
7+# bind it to `argocd`. Otherwise, compinit will have already done that.
8+if [[ ! -f "$ZSH_CACHE_DIR/completions/_argocd" ]]; then
9+ typeset -g -A _comps
10+ autoload -Uz _argocd
11+ _comps[argocd]=_argocd
12+fi
13+
14+argocd completion zsh >| "$ZSH_CACHE_DIR/completions/_argocd" &|
+48-0.oh-my-zsh/plugins/asdf/README.md
@@ -0,0 +1,48 @@
1+# asdf
2+
3+Adds integration with [asdf](https://github.com/asdf-vm/asdf), the extendable version manager, with support for Ruby, Node.js, Elixir, Erlang and more.
4+
5+## Installation
6+
7+1. [Install](https://asdf-vm.com/guide/getting-started.html#_1-install-asdf) asdf and ensure that's it's discoverable on `$PATH`;
8+2. Enable it by adding it to your `plugins` definition in `~/.zshrc`:
9+
10+```sh
11+plugins=(asdf)
12+```
13+
14+## Usage
15+
16+Refer to the [asdf plugin documentation](https://asdf-vm.com/guide/getting-started.html#_4-install-a-plugin) for information on how to add a plugin and install the many runtime versions for it.
17+
18+Example for installing the nodejs plugin and the many runtimes for it:
19+
20+```sh
21+# Add plugin to asdf
22+asdf plugin add nodejs
23+
24+# Install the latest available version
25+asdf install nodejs latest
26+
27+# Uninstall the latest version
28+asdf uninstall nodejs latest
29+
30+# Install a specific version
31+asdf install nodejs 16.5.0
32+
33+# Set the latest version in .tool-versions of the `current directory`
34+asdf set nodejs latest
35+
36+# Set a specific version in the `parent directory`
37+asdf set -p nodejs 16.5.0 # -p is shorthand for --parent
38+
39+# Set a global version under `$HOME`
40+asdf set -u nodejs 16.5.0 # -u is shorthand for --home
41+```
42+
43+For more commands, run `asdf help` or refer to the
44+[asdf CLI documentation](https://asdf-vm.com/manage/commands.html#all-commands).
45+
46+## Maintainer
47+
48+- [@RobLoach](https://github.com/RobLoach)
+13-0.oh-my-zsh/plugins/asdf/asdf.plugin.zsh
@@ -0,0 +1,13 @@
1+(( ! $+commands[asdf] )) && return
2+
3+export ASDF_DATA_DIR="${ASDF_DATA_DIR:-$HOME/.asdf}"
4+path=("$ASDF_DATA_DIR/shims" $path)
5+
6+# If the completion file doesn't exist yet, we need to autoload it and
7+# bind it to `asdf`. Otherwise, compinit will have already done that.
8+if [[ ! -f "$ZSH_CACHE_DIR/completions/_asdf" ]]; then
9+ typeset -g -A _comps
10+ autoload -Uz _asdf
11+ _comps[asdf]=_asdf
12+fi
13+asdf completion zsh >| "$ZSH_CACHE_DIR/completions/_asdf" &|
+20-0.oh-my-zsh/plugins/autoenv/README.md
@@ -0,0 +1,20 @@
1+# Autoenv plugin
2+
3+This plugin loads the [Autoenv](https://github.com/inishchith/autoenv).
4+
5+To use it, add `autoenv` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... autoenv)
9+```
10+
11+## Functions
12+
13+* `use_env()`: creates and/or activates a virtualenv. For use in `.env` files.
14+ See the source code for details.
15+
16+## Requirements
17+
18+In order to make this work, you will need to have the autoenv installed.
19+
20+More info on the usage and install at [the project's homepage](https://github.com/inishchith/autoenv).
+80-0.oh-my-zsh/plugins/autoenv/autoenv.plugin.zsh
@@ -0,0 +1,80 @@
1+# Initialization: activate autoenv or report its absence
2+() {
3+local d autoenv_dir install_locations
4+if ! type autoenv_init >/dev/null; then
5+ # Check if activate.sh is in $PATH
6+ if (( $+commands[activate.sh] )); then
7+ autoenv_dir="${commands[activate.sh]:h}"
8+ fi
9+
10+ # Locate autoenv installation
11+ if [[ -z $autoenv_dir ]]; then
12+ install_locations=(
13+ ~/.autoenv
14+ ~/.local/bin
15+ /usr/local/opt/autoenv
16+ /opt/homebrew/opt/autoenv
17+ /usr/local/bin
18+ /usr/share/autoenv-git
19+ ~/Library/Python/bin
20+ .venv/bin
21+ venv/bin
22+ env/bin
23+ .env/bin
24+ )
25+ for d ( $install_locations ); do
26+ if [[ -e $d/activate || -e $d/activate.sh ]]; then
27+ autoenv_dir=$d
28+ break
29+ fi
30+ done
31+ fi
32+
33+ # Look for Homebrew path as a last resort
34+ if [[ -z "$autoenv_dir" ]] && (( $+commands[brew] )); then
35+ d=$(brew --prefix)/opt/autoenv
36+ if [[ -e $d/activate || -e $d/activate.sh ]]; then
37+ autoenv_dir=$d
38+ fi
39+ fi
40+
41+ # Complain if autoenv is not installed
42+ if [[ -z $autoenv_dir ]]; then
43+ cat <<END >&2
44+-------- AUTOENV ---------
45+Could not locate autoenv installation.
46+Please check if autoenv is correctly installed.
47+In the meantime the autoenv plugin is DISABLED.
48+--------------------------
49+END
50+ return 1
51+ fi
52+ # Load autoenv
53+ if [[ -e $autoenv_dir/activate ]]; then
54+ source $autoenv_dir/activate
55+ else
56+ source $autoenv_dir/activate.sh
57+ fi
58+fi
59+}
60+[[ $? != 0 ]] && return $?
61+
62+# The use_env call below is a reusable command to activate/create a new Python
63+# virtualenv, requiring only a single declarative line of code in your .env files.
64+# It only performs an action if the requested virtualenv is not the current one.
65+
66+use_env() {
67+ local venv
68+ venv="$1"
69+ if [[ "${VIRTUAL_ENV:t}" != "$venv" ]]; then
70+ if workon | grep -q "$venv"; then
71+ workon "$venv"
72+ else
73+ echo -n "Create virtualenv $venv now? (Yn) "
74+ read answer
75+ if [[ "$answer" == "Y" ]]; then
76+ mkvirtualenv "$venv"
77+ fi
78+ fi
79+ fi
80+}
+11-0.oh-my-zsh/plugins/autojump/README.md
@@ -0,0 +1,11 @@
1+# Autojump plugin
2+
3+This plugin loads the [autojump navigation tool](https://github.com/wting/autojump).
4+
5+To use it, add `autojump` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... autojump)
9+```
10+
11+**Note:** you have to [install autojump](https://github.com/wting/autojump#installation) first.
+41-0.oh-my-zsh/plugins/autojump/autojump.plugin.zsh
@@ -0,0 +1,41 @@
1+declare -a autojump_paths
2+autojump_paths=(
3+ $HOME/.autojump/etc/profile.d/autojump.zsh # manual installation
4+ $HOME/.autojump/share/autojump/autojump.zsh # manual installation
5+ $HOME/.nix-profile/etc/profile.d/autojump.sh # NixOS installation
6+ /run/current-system/sw/share/autojump/autojump.zsh # NixOS installation
7+ /etc/profiles/per-user/$USER/share/autojump/autojump.zsh # Home Manager, NixOS with user-scoped packages
8+ /usr/share/autojump/autojump.zsh # Debian and Ubuntu package
9+ $PREFIX/share/autojump/autojump.zsh # Termux package
10+ /etc/profile.d/autojump.zsh # manual installation
11+ /etc/profile.d/autojump.sh # Gentoo installation
12+ /usr/local/share/autojump/autojump.zsh # FreeBSD installation
13+ /usr/pkg/share/autojump/autojump.zsh # NetBSD installation
14+ /opt/local/etc/profile.d/autojump.sh # macOS with MacPorts
15+ /usr/local/etc/profile.d/autojump.sh # macOS with Homebrew (default)
16+ /opt/homebrew/etc/profile.d/autojump.sh # macOS with Homebrew (default on M1 macs)
17+ /opt/pkg/share/autojump/autojump.zsh # macOS with pkgsrc
18+ /etc/profiles/per-user/$USER/etc/profile.d/autojump.sh # macOS Nix, Home Manager and flakes
19+ /nix/var/nix/gcroots/current-system/sw/share/zsh/site-functions/autojump.zsh # macOS Nix, nix-darwin
20+)
21+
22+for file in $autojump_paths; do
23+ if [[ -f "$file" ]]; then
24+ source "$file"
25+ found=1
26+ break
27+ fi
28+done
29+
30+# if no path found, try Homebrew
31+if (( ! found && $+commands[brew] )); then
32+ file=$(brew --prefix)/etc/profile.d/autojump.sh
33+ if [[ -f "$file" ]]; then
34+ source "$file"
35+ found=1
36+ fi
37+fi
38+
39+(( ! found )) && echo '[oh-my-zsh] autojump not found. Please install it first.'
40+
41+unset autojump_paths file found
+8-0.oh-my-zsh/plugins/autopep8/README.md
@@ -0,0 +1,8 @@
1+# autopep8 plugin
2+
3+This plugin adds completion for [autopep8](https://pypi.org/project/autopep8/), a tool that automatically formats Python code to conform to the [PEP 8](http://www.python.org/dev/peps/pep-0008/) style guide.
4+
5+To use it, add autopep8 to the plugins array of your zshrc file:
6+```
7+plugins=(... autopep8)
8+```
+32-0.oh-my-zsh/plugins/autopep8/_autopep8
@@ -0,0 +1,32 @@
1+#compdef autopep8
2+#
3+# this is zsh completion function file.
4+# generated by genzshcomp(ver: 0.5.1)
5+#
6+
7+typeset -A opt_args
8+local context state line
9+
10+_arguments -s -S \
11+ "--help[show this help message and exit]:" \
12+ "-h[show this help message and exit]:" \
13+ "--version[show program's version number and exit]:" \
14+ "--verbose[print verbose messages; multiple -v result in more verbose messages]" \
15+ "-v[print verbose messages; multiple -v result in more verbose messages]" \
16+ "--diff[print the diff for the fixed source]" \
17+ "-d[print the diff for the fixed source]" \
18+ "--in-place[make changes to files in place]" \
19+ "-i[make changes to files in place]" \
20+ "--recursive[run recursively; must be used with --in-place or --diff]" \
21+ "-r[run recursively; must be used with --in-place or --diff]" \
22+ "--jobs[number of parallel jobs; match CPU count if value is less than 1]::n number of parallel jobs; match CPU count if value is:_files" \
23+ "-j[number of parallel jobs; match CPU count if value is less than 1]::n number of parallel jobs; match CPU count if value is:_files" \
24+ "--pep8-passes[maximum number of additional pep8 passes (default: 100)]::n:_files" \
25+ "-p[maximum number of additional pep8 passes (default: 100)]::n:_files" \
26+ "-a[-a result in more aggressive changes]::result:_files" \
27+ "--exclude[exclude files/directories that match these comma- separated globs]::globs:_files" \
28+ "--list-fixes[list codes for fixes; used by --ignore and --select]" \
29+ "--ignore[do not fix these errors/warnings (default E226,E24)]::errors:_files" \
30+ "--select[fix only these errors/warnings (e.g. E4,W)]::errors:_files" \
31+ "--max-line-length[set maximum allowed line length (default: 79)]::n:_files" \
32+ "*::args:_files"
+98-0.oh-my-zsh/plugins/aws/README.md
@@ -0,0 +1,98 @@
1+# aws
2+
3+This plugin provides completion support for [awscli v2](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/index.html)
4+and a few utilities to manage AWS profiles/regions and display them in the prompt.
5+[awscli v1](https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html) is no longer supported.
6+
7+To use it, add `aws` to the plugins array in your zshrc file.
8+
9+```zsh
10+plugins=(... aws)
11+```
12+
13+## Plugin commands
14+
15+* `asp [<profile>]`: sets `$AWS_PROFILE` and `$AWS_DEFAULT_PROFILE` (legacy) to `<profile>`.
16+ It also sets `$AWS_EB_PROFILE` to `<profile>` for the Elastic Beanstalk CLI. It sets `$AWS_PROFILE_REGION` for display in `aws_prompt_info`.
17+ Run `asp` without arguments to clear the profile.
18+* `asp [<profile>] login`: If AWS SSO has been configured in your aws profile, it will run the `aws sso login` command following profile selection.
19+* `asp [<profile>] login [<sso_session>]`: In addition to `asp [<profile>] login`, if SSO session has been configured in your aws profile, it will run the `aws sso login --sso-session <sso_session>` command following profile selection.
20+* `asp [<profile>] logout`: If AWS SSO has been configured in your aws profile, it will run the `aws sso logout` command following profile selection.
21+
22+* `asr [<region>]`: sets `$AWS_REGION` and `$AWS_DEFAULT_REGION` (legacy) to `<region>`.
23+ Run `asr` without arguments to clear the profile.
24+
25+* `acp [<profile>] [<mfa_token>]`: in addition to `asp` functionality, it actually changes
26+ the profile by assuming the role specified in the `<profile>` configuration. It supports
27+ MFA and sets `$AWS_ACCESS_KEY_ID`, `$AWS_SECRET_ACCESS_KEY` and `$AWS_SESSION_TOKEN`, if
28+ obtained. It requires the roles to be configured as per the
29+ [official guide](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html).
30+ Run `acp` without arguments to clear the profile.
31+
32+* `agp`: gets the current value of `$AWS_PROFILE`.
33+
34+* `agr`: gets the current value of `$AWS_REGION`.
35+
36+* `aws_change_access_key`: changes the AWS access key of a profile.
37+
38+* `aws_profiles`: lists the available profiles in the `$AWS_CONFIG_FILE` (default: `~/.aws/config`).
39+ Used to provide completion for the `asp` function.
40+
41+* `aws_regions`: lists the available regions.
42+ Used to provide completion for the `asr` function.
43+
44+## Plugin options
45+
46+* Set `SHOW_AWS_PROMPT=false` in your zshrc file if you want to prevent the plugin from modifying your RPROMPT.
47+ Some themes might overwrite the value of RPROMPT instead of appending to it, so they'll need to be fixed to
48+ see the AWS profile/region prompt.
49+
50+* Set `AWS_PROFILE_STATE_ENABLED=true` in your zshrc file if you want the aws profile to persist between shell sessions.
51+ This option might slow down your shell startup time.
52+ By default the state file path is `/tmp/.aws_current_profile`. This means that the state won't survive a reboot or otherwise GC.
53+ You can control the state file path using the `AWS_STATE_FILE` environment variable.
54+
55+## Theme
56+
57+The plugin creates an `aws_prompt_info` function that you can use in your theme, which displays
58+the current `$AWS_PROFILE` and `$AWS_REGION`. It uses four variables to control how that is shown:
59+
60+* ZSH_THEME_AWS_PROFILE_PREFIX: sets the prefix of the AWS_PROFILE. Defaults to `<aws:`.
61+
62+* ZSH_THEME_AWS_PROFILE_SUFFIX: sets the suffix of the AWS_PROFILE. Defaults to `>`.
63+
64+* ZSH_THEME_AWS_REGION_PREFIX: sets the prefix of the AWS_REGION. Defaults to `<region:`.
65+
66+* ZSH_THEME_AWS_REGION_SUFFIX: sets the suffix of the AWS_REGION. Defaults to `>`.
67+
68+* ZSH_THEME_AWS_DIVIDER: sets the divider between ZSH_THEME_AWS_PROFILE_SUFFIX and ZSH_THEME_AWS_REGION_PREFIX. Defaults to ` ` (single space).
69+
70+## Configuration
71+
72+[Configuration and credential file settings](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) by AWS
73+
74+### Scenario: IAM roles with a source profile and MFA authentication
75+
76+Source profile credentials in `~/.aws/credentials`:
77+
78+```ini
79+[source-profile-name]
80+aws_access_key_id = ...
81+aws_secret_access_key = ...
82+```
83+
84+Role configuration in `~/.aws/config`:
85+
86+```ini
87+[profile source-profile-name]
88+mfa_serial = arn:aws:iam::111111111111:mfa/myuser
89+region = us-east-1
90+output = json
91+
92+[profile profile-with-role]
93+role_arn = arn:aws:iam::9999999999999:role/myrole
94+mfa_serial = arn:aws:iam::111111111111:mfa/myuser
95+source_profile = source-profile-name
96+region = us-east-1
97+output = json
98+```
+338-0.oh-my-zsh/plugins/aws/aws.plugin.zsh
@@ -0,0 +1,338 @@
1+function agp() {
2+ echo $AWS_PROFILE
3+}
4+
5+function agr() {
6+ echo $AWS_REGION
7+}
8+
9+# Update state file if enabled
10+function _aws_update_state() {
11+ if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then
12+ test -d $(dirname ${AWS_STATE_FILE}) || exit 1
13+ echo "${AWS_PROFILE} ${AWS_REGION}" > "${AWS_STATE_FILE}"
14+ fi
15+}
16+
17+function _aws_clear_state() {
18+ if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then
19+ test -d $(dirname ${AWS_STATE_FILE}) || exit 1
20+ echo -n > "${AWS_STATE_FILE}"
21+ fi
22+}
23+
24+# AWS profile selection
25+function asp() {
26+ if [[ -z "$1" ]]; then
27+ unset AWS_DEFAULT_PROFILE AWS_PROFILE AWS_EB_PROFILE AWS_PROFILE_REGION
28+ _aws_clear_state
29+ echo AWS profile cleared.
30+ return
31+ fi
32+
33+ local -a available_profiles
34+ available_profiles=($(aws_profiles))
35+ if [[ -z "${available_profiles[(r)$1]}" ]]; then
36+ echo "${fg[red]}Profile '$1' not found in '${AWS_CONFIG_FILE:-$HOME/.aws/config}'" >&2
37+ echo "Available profiles: ${(j:, :)available_profiles:-no profiles found}${reset_color}" >&2
38+ return 1
39+ fi
40+
41+ export AWS_DEFAULT_PROFILE=$1
42+ export AWS_PROFILE=$1
43+ export AWS_EB_PROFILE=$1
44+
45+ export AWS_PROFILE_REGION=$(aws configure get region)
46+
47+ _aws_update_state
48+
49+ if [[ "$2" == "login" ]]; then
50+ if [[ -n "$3" ]]; then
51+ aws sso login --sso-session $3
52+ else
53+ aws sso login
54+ fi
55+ elif [[ "$2" == "logout" ]]; then
56+ aws sso logout
57+ fi
58+}
59+
60+# AWS region selection
61+function asr() {
62+ if [[ -z "$1" ]]; then
63+ unset AWS_DEFAULT_REGION AWS_REGION
64+ _aws_update_state
65+ echo AWS region cleared.
66+ return
67+ fi
68+
69+ local -a available_regions
70+ available_regions=($(aws_regions))
71+ if [[ -z "${available_regions[(r)$1]}" ]]; then
72+ echo "${fg[red]}Available regions: \n$(aws_regions)"
73+ return 1
74+ fi
75+
76+ export AWS_REGION=$1
77+ export AWS_DEFAULT_REGION=$1
78+ _aws_update_state
79+}
80+
81+# AWS profile switch
82+function acp() {
83+ if [[ -z "$1" ]]; then
84+ unset AWS_DEFAULT_PROFILE AWS_PROFILE AWS_EB_PROFILE
85+ unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
86+ echo AWS profile cleared.
87+ return
88+ fi
89+
90+ local -a available_profiles
91+ available_profiles=($(aws_profiles))
92+ if [[ -z "${available_profiles[(r)$1]}" ]]; then
93+ echo "${fg[red]}Profile '$1' not found in '${AWS_CONFIG_FILE:-$HOME/.aws/config}'" >&2
94+ echo "Available profiles: ${(j:, :)available_profiles:-no profiles found}${reset_color}" >&2
95+ return 1
96+ fi
97+
98+ local profile="$1"
99+ local mfa_token="$2"
100+
101+ # Get fallback credentials for if the aws command fails or no command is run
102+ local aws_access_key_id="$(aws configure get aws_access_key_id --profile $profile)"
103+ local aws_secret_access_key="$(aws configure get aws_secret_access_key --profile $profile)"
104+ local aws_session_token="$(aws configure get aws_session_token --profile $profile)"
105+
106+
107+ # First, if the profile has MFA configured, lets get the token and session duration
108+ local mfa_serial="$(aws configure get mfa_serial --profile $profile)"
109+ local sess_duration="$(aws configure get duration_seconds --profile $profile)"
110+
111+ if [[ -n "$mfa_serial" ]]; then
112+ local -a mfa_opt
113+ if [[ -z "$mfa_token" ]]; then
114+ echo -n "Please enter your MFA token for $mfa_serial: "
115+ read -r mfa_token
116+ fi
117+ if [[ -z "$sess_duration" ]]; then
118+ echo -n "Please enter the session duration in seconds (900-43200; default: 3600, which is the default maximum for a role): "
119+ read -r sess_duration
120+ fi
121+ mfa_opt=(--serial-number "$mfa_serial" --token-code "$mfa_token" --duration-seconds "${sess_duration:-3600}")
122+ fi
123+
124+ # Now see whether we need to just MFA for the current role, or assume a different one
125+ local role_arn="$(aws configure get role_arn --profile $profile)"
126+ local sess_name="$(aws configure get role_session_name --profile $profile)"
127+
128+ if [[ -n "$role_arn" ]]; then
129+ # Means we need to assume a specified role
130+ aws_command=(aws sts assume-role --role-arn "$role_arn" "${mfa_opt[@]}")
131+
132+ # Check whether external_id is configured to use while assuming the role
133+ local external_id="$(aws configure get external_id --profile $profile)"
134+ if [[ -n "$external_id" ]]; then
135+ aws_command+=(--external-id "$external_id")
136+ fi
137+
138+ # Get source profile to use to assume role
139+ local source_profile="$(aws configure get source_profile --profile $profile)"
140+ if [[ -z "$sess_name" ]]; then
141+ sess_name="${source_profile:-profile}"
142+ fi
143+ aws_command+=(--profile="${source_profile:-profile}" --role-session-name "${sess_name}")
144+
145+ echo "Assuming role $role_arn using profile ${source_profile:-profile}"
146+ else
147+ # Means we only need to do MFA
148+ aws_command=(aws sts get-session-token --profile="$profile" "${mfa_opt[@]}")
149+ echo "Obtaining session token for profile $profile"
150+ fi
151+
152+ # Format output of aws command for easier processing
153+ aws_command+=(--query '[Credentials.AccessKeyId,Credentials.SecretAccessKey,Credentials.SessionToken]' --output text)
154+
155+ # Run the aws command to obtain credentials
156+ local -a credentials
157+ credentials=(${(ps:\t:)"$(${aws_command[@]})"})
158+
159+ if [[ -n "$credentials" ]]; then
160+ aws_access_key_id="${credentials[1]}"
161+ aws_secret_access_key="${credentials[2]}"
162+ aws_session_token="${credentials[3]}"
163+ fi
164+
165+ # Switch to AWS profile
166+ if [[ -n "${aws_access_key_id}" && -n "$aws_secret_access_key" ]]; then
167+ export AWS_DEFAULT_PROFILE="$profile"
168+ export AWS_PROFILE="$profile"
169+ export AWS_EB_PROFILE="$profile"
170+ export AWS_ACCESS_KEY_ID="$aws_access_key_id"
171+ export AWS_SECRET_ACCESS_KEY="$aws_secret_access_key"
172+
173+ if [[ -n "$aws_session_token" ]]; then
174+ export AWS_SESSION_TOKEN="$aws_session_token"
175+ else
176+ unset AWS_SESSION_TOKEN
177+ fi
178+
179+ echo "Switched to AWS Profile: $profile"
180+ fi
181+}
182+
183+function aws_change_access_key() {
184+ if [[ -z "$1" ]]; then
185+ echo "usage: $0 <profile>"
186+ return 1
187+ fi
188+
189+ local profile="$1"
190+ # Get current access key
191+ local original_aws_access_key_id="$(aws configure get aws_access_key_id --profile $profile)"
192+
193+ asp "$profile" || return 1
194+ echo "Generating a new access key pair for you now."
195+ if aws --no-cli-pager iam create-access-key; then
196+ echo "Insert the newly generated credentials when asked."
197+ aws --no-cli-pager configure --profile $profile
198+ else
199+ echo "Current access keys:"
200+ aws --no-cli-pager iam list-access-keys
201+ echo "Profile \"${profile}\" is currently using the $original_aws_access_key_id key. You can delete an old access key by running \`aws --profile $profile iam delete-access-key --access-key-id AccessKeyId\`"
202+ return 1
203+ fi
204+
205+ read -q "yn?Would you like to disable your previous access key (${original_aws_access_key_id}) now? "
206+ case $yn in
207+ [Yy]*)
208+ echo -n "\nDisabling access key ${original_aws_access_key_id}..."
209+ if aws --no-cli-pager iam update-access-key --access-key-id ${original_aws_access_key_id} --status Inactive; then
210+ echo "done."
211+ else
212+ echo "\nFailed to disable ${original_aws_access_key_id} key."
213+ fi
214+ ;;
215+ *)
216+ echo ""
217+ ;;
218+ esac
219+ echo "You can now safely delete the old access key by running \`aws --profile $profile iam delete-access-key --access-key-id ${original_aws_access_key_id}\`"
220+ echo "Your current keys are:"
221+ aws --no-cli-pager iam list-access-keys
222+}
223+
224+function aws_regions() {
225+ local region
226+ if [[ $AWS_DEFAULT_REGION ]];then
227+ region="$AWS_DEFAULT_REGION"
228+ elif [[ $AWS_REGION ]];then
229+ region="$AWS_REGION"
230+ else
231+ region="us-west-1"
232+ fi
233+
234+ if [[ $AWS_DEFAULT_PROFILE || $AWS_PROFILE ]];then
235+ aws ec2 describe-regions --region $region |grep RegionName | awk -F ':' '{gsub(/"/, "", $2);gsub(/,/, "", $2);gsub(/ /, "", $2); print $2}'
236+ else
237+ echo "You must specify a AWS profile."
238+ fi
239+}
240+
241+function aws_profiles() {
242+ aws --no-cli-pager configure list-profiles 2> /dev/null && return
243+ [[ -r "${AWS_CONFIG_FILE:-$HOME/.aws/config}" ]] || return 1
244+ grep --color=never -Eo '\[.*\]' "${AWS_CONFIG_FILE:-$HOME/.aws/config}" | sed -E 's/^[[:space:]]*\[(profile)?[[:space:]]*([^[:space:]]+)\][[:space:]]*$/\2/g'
245+}
246+
247+function _aws_regions() {
248+ reply=($(aws_regions))
249+}
250+compctl -K _aws_regions asr
251+
252+function _aws_profiles() {
253+ reply=($(aws_profiles))
254+}
255+compctl -K _aws_profiles asp acp aws_change_access_key
256+
257+# AWS prompt
258+function aws_prompt_info() {
259+ local _aws_to_show
260+ local region="${AWS_REGION:-${AWS_DEFAULT_REGION:-$AWS_PROFILE_REGION}}"
261+
262+ if [[ -n "$AWS_PROFILE" ]];then
263+ _aws_to_show+="${ZSH_THEME_AWS_PROFILE_PREFIX="<aws:"}${AWS_PROFILE}${ZSH_THEME_AWS_PROFILE_SUFFIX=">"}"
264+ fi
265+
266+ if [[ -n "$region" ]]; then
267+ [[ -n "$_aws_to_show" ]] && _aws_to_show+="${ZSH_THEME_AWS_DIVIDER=" "}"
268+ _aws_to_show+="${ZSH_THEME_AWS_REGION_PREFIX="<region:"}${region}${ZSH_THEME_AWS_REGION_SUFFIX=">"}"
269+ fi
270+
271+ echo "$_aws_to_show"
272+}
273+
274+if [[ "$SHOW_AWS_PROMPT" != false && "$RPROMPT" != *'$(aws_prompt_info)'* ]]; then
275+ RPROMPT='$(aws_prompt_info)'"$RPROMPT"
276+fi
277+
278+if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then
279+ AWS_STATE_FILE="${AWS_STATE_FILE:-/tmp/.aws_current_profile}"
280+ test -s "${AWS_STATE_FILE}" || return
281+
282+ aws_state=($(cat $AWS_STATE_FILE))
283+
284+ export AWS_DEFAULT_PROFILE="${aws_state[1]}"
285+ export AWS_PROFILE="$AWS_DEFAULT_PROFILE"
286+ export AWS_EB_PROFILE="$AWS_DEFAULT_PROFILE"
287+
288+ test -z "${aws_state[2]}" && AWS_REGION=$(aws configure get region)
289+
290+ export AWS_REGION=${AWS_REGION:-$aws_state[2]}
291+ export AWS_DEFAULT_REGION="$AWS_REGION"
292+fi
293+
294+# Load awscli completions
295+
296+# AWS CLI v2 comes with its own autocompletion. Check if that is there, otherwise fall back
297+if command -v aws_completer &> /dev/null; then
298+ autoload -Uz bashcompinit && bashcompinit
299+ complete -C aws_completer aws
300+else
301+ function _awscli-homebrew-installed() {
302+ # check if Homebrew is installed
303+ (( $+commands[brew] )) || return 1
304+
305+ # speculatively check default brew prefix
306+ if [ -h /usr/local/opt/awscli ]; then
307+ _brew_prefix=/usr/local/opt/awscli
308+ else
309+ # ok, it is not in the default prefix
310+ # this call to brew is expensive (about 400 ms), so at least let's make it only once
311+ _brew_prefix=$(brew --prefix awscli)
312+ fi
313+ }
314+
315+ # get aws_zsh_completer.sh location from $PATH
316+ _aws_zsh_completer_path="$commands[aws_zsh_completer.sh]"
317+
318+ # otherwise check common locations
319+ if [[ -z $_aws_zsh_completer_path ]]; then
320+ # Homebrew
321+ if _awscli-homebrew-installed; then
322+ _aws_zsh_completer_path=$_brew_prefix/libexec/bin/aws_zsh_completer.sh
323+ # Ubuntu
324+ elif [[ -e /usr/share/zsh/vendor-completions/_awscli ]]; then
325+ _aws_zsh_completer_path=/usr/share/zsh/vendor-completions/_awscli
326+ # NixOS
327+ elif [[ -e "${commands[aws]:P:h:h}/share/zsh/site-functions/aws_zsh_completer.sh" ]]; then
328+ _aws_zsh_completer_path="${commands[aws]:P:h:h}/share/zsh/site-functions/aws_zsh_completer.sh"
329+ # RPM
330+ else
331+ _aws_zsh_completer_path=/usr/share/zsh/site-functions/aws_zsh_completer.sh
332+ fi
333+ fi
334+
335+ [[ -r $_aws_zsh_completer_path ]] && source $_aws_zsh_completer_path
336+ unset _aws_zsh_completer_path _brew_prefix
337+fi
338+
+49-0.oh-my-zsh/plugins/azure/README.md
@@ -0,0 +1,49 @@
1+# azure
2+
3+This plugin provides completion support for [azure cli](https://docs.microsoft.com/en-us/cli/azure/)
4+and a few utilities to manage azure subscriptions and display them in the prompt.
5+
6+To use it, add `azure` to the plugins array in your zshrc file.
7+
8+```zsh
9+plugins=(... azure)
10+```
11+
12+## Plugin commands
13+
14+
15+* `az_subscriptions`: lists the available subscriptions in the `AZURE_CONFIG_DIR` (default: `~/.azure/`).
16+ Used to provide completion for the `azss` function.
17+
18+* `azgs`: gets the current value of `$azure_subscription`.
19+
20+* `azss [<subscription>]`: sets the `$azure_subscription`.
21+
22+
23+NOTE : because azure keeps the state of active subscription in ${AZURE_CONFIG_DIR:-$HOME/.azure/azureProfile.json}, the prompt command requires `jq` to be enabled to parse the file. If jq is not in the path the prompt will show nothing
24+
25+## Theme
26+
27+The plugin creates an `azure_prompt_info` function that you can use in your theme, which displays
28+the current `$azure_subscription`. It uses two variables to control how that is shown:
29+
30+- ZSH_THEME_AZURE_PREFIX: sets the prefix of the azure_subscription. Defaults to `<az:`.
31+
32+- ZSH_THEME_azure_SUFFIX: sets the suffix of the azure_subscription. Defaults to `>`.
33+
34+
35+```
36+RPROMPT='$(azure_prompt_info)'
37+```
38+
39+## Develop
40+
41+On ubuntu get a working environment with :
42+
43+` docker run -it -v $(pwd):/mnt -w /mnt ubuntu bash`
44+
45+```
46+apt install -y curl jq zsh git vim
47+sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
48+curl -sL https://aka.ms/InstallAzureCLIDeb | bash
49+```
+60-0.oh-my-zsh/plugins/azure/azure.plugin.zsh
@@ -0,0 +1,60 @@
1+# AZ Get Subscriptions
2+function azgs() {
3+ az account show --output tsv --query 'name' 2>/dev/null
4+}
5+
6+# AZ Subscription Selection
7+alias azss="az account set --subscription"
8+
9+
10+function az_subscriptions() {
11+ az account list --all --output tsv --query '[*].name' 2> /dev/null
12+}
13+
14+function _az_subscriptions() {
15+ reply=($(az_subscriptions))
16+}
17+compctl -K _az_subscriptions azss
18+
19+# Azure prompt
20+function azure_prompt_info() {
21+ [[ ! -f "${AZURE_CONFIG_DIR:-$HOME/.azure}/azureProfile.json" ]] && return
22+ # azgs is too expensive, if we have jq, we enable the prompt
23+ (( $+commands[jq] )) || return 1
24+ azgs=$(jq -r '.subscriptions[] | select(.isDefault==true) .name' "${AZURE_CONFIG_DIR:-$HOME/.azure}/azureProfile.json")
25+ echo "${ZSH_THEME_AZURE_PREFIX:=<az:}${azgs}${ZSH_THEME_AZURE_SUFFIX:=>}"
26+}
27+
28+
29+# Load az completions
30+function _az-homebrew-installed() {
31+ # check if Homebrew is installed
32+ (( $+commands[brew] )) || return 1
33+
34+ # if so, we assume it's default way to install brew
35+ if [[ ${commands[brew]:t2} == bin/brew ]]; then
36+ _brew_prefix="${commands[brew]:h:h}" # remove trailing /bin/brew
37+ else
38+ # ok, it is not in the default prefix
39+ # this call to brew is expensive (about 400 ms), so at least let's make it only once
40+ _brew_prefix=$(brew --prefix)
41+ fi
42+}
43+
44+
45+# get az.completion.sh location from $PATH
46+_az_zsh_completer_path="$commands[az_zsh_completer.sh]"
47+
48+# otherwise check common locations
49+if [[ -z $_az_zsh_completer_path ]]; then
50+ # Homebrew
51+ if _az-homebrew-installed; then
52+ _az_zsh_completer_path=$_brew_prefix/etc/bash_completion.d/az
53+ # Linux
54+ else
55+ _az_zsh_completer_path=/etc/bash_completion.d/azure-cli
56+ fi
57+fi
58+
59+[[ -r $_az_zsh_completer_path ]] && autoload -U +X bashcompinit && bashcompinit && source $_az_zsh_completer_path
60+unset _az_zsh_completer_path _brew_prefix
+36-0.oh-my-zsh/plugins/battery/README.md
@@ -0,0 +1,36 @@
1+# Battery Plugin
2+
3+This plugin adds some functions you can use to display battery information in your custom theme.
4+
5+To use, add `battery` to the list of plugins in your `.zshrc` file:
6+
7+`plugins=(... battery)`
8+
9+Then, add the `battery_pct_prompt` function to your custom theme. For example:
10+
11+```zsh
12+RPROMPT='$(battery_pct_prompt) ...'
13+```
14+
15+Also, you set the `BATTERY_CHARGING` variable to your favor.
16+For example:
17+
18+```zsh
19+BATTERY_CHARGING="โšก๏ธ"
20+```
21+
22+## Requirements
23+
24+- On Linux, you must have the `acpi` or `acpitool` commands installed on your operating system.
25+ On Debian/Ubuntu, you can do that with `sudo apt install acpi` or `sudo apt install acpitool`.
26+
27+- On Android (via [Termux](https://play.google.com/store/apps/details?id=com.termux)), you must have:
28+
29+ 1. The `Termux:API` addon app installed:
30+ [Google Play](https://play.google.com/store/apps/details?id=com.termux.api) | [F-Droid](https://f-droid.org/packages/com.termux.api/)
31+
32+ 2. The `termux-api` package installed within termux:
33+
34+ ```sh
35+ pkg install termux-api
36+ ```
+306-0.oh-my-zsh/plugins/battery/battery.plugin.zsh
@@ -0,0 +1,306 @@
1+###########################################
2+# Battery plugin for oh-my-zsh #
3+# Original Author: Peter hoeg (peterhoeg) #
4+# Email: peter@speartail.com #
5+###########################################
6+# Author: Sean Jones (neuralsandwich) #
7+# Email: neuralsandwich@gmail.com #
8+# Modified to add support for Apple Mac #
9+###########################################
10+# Author: J (927589452) #
11+# Modified to add support for FreeBSD #
12+###########################################
13+# Author: Avneet Singh (kalsi-avneet) #
14+# Modified to add support for Android #
15+###########################################
16+# Author: Not Pua (im-notpua) #
17+# Modified to add support for OpenBSD #
18+###########################################
19+
20+
21+if [[ "$OSTYPE" = darwin* ]]; then
22+ function battery_is_charging() {
23+ ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected"\ =\ Yes'
24+ }
25+ function battery_pct() {
26+ pmset -g batt | grep -Eo "\d+%" | cut -d% -f1
27+ }
28+ function battery_pct_remaining() {
29+ if battery_is_charging; then
30+ echo "External Power"
31+ else
32+ battery_pct
33+ fi
34+ }
35+ function battery_time_remaining() {
36+ local smart_battery_status="$(ioreg -rc "AppleSmartBattery")"
37+ if [[ $(echo $smart_battery_status | command grep -c '^.*"ExternalConnected"\ =\ No') -eq 1 ]]; then
38+ timeremaining=$(echo $smart_battery_status | command grep '^.*"AvgTimeToEmpty"\ =\ ' | sed -e 's/^.*"AvgTimeToEmpty"\ =\ //')
39+ if [ $timeremaining -gt 720 ]; then
40+ echo "::"
41+ else
42+ echo "~$((timeremaining / 60)):$((timeremaining % 60))"
43+ fi
44+ else
45+ echo "โˆž"
46+ fi
47+ }
48+ function battery_pct_prompt () {
49+ local battery_pct color
50+ if ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected"\ =\ No'; then
51+ battery_pct=$(battery_pct_remaining)
52+ if [[ $battery_pct -gt 50 ]]; then
53+ color='green'
54+ elif [[ $battery_pct -gt 20 ]]; then
55+ color='yellow'
56+ else
57+ color='red'
58+ fi
59+ echo "%{$fg[$color]%}[${battery_pct}%%]%{$reset_color%}"
60+ else
61+ echo "${BATTERY_CHARGING-โšก๏ธ}"
62+ fi
63+ }
64+
65+elif [[ "$OSTYPE" = freebsd* ]]; then
66+ function battery_is_charging() {
67+ [[ $(sysctl -n hw.acpi.battery.state) -eq 2 ]]
68+ }
69+ function battery_pct() {
70+ if (( $+commands[sysctl] )); then
71+ sysctl -n hw.acpi.battery.life
72+ fi
73+ }
74+ function battery_pct_remaining() {
75+ if ! battery_is_charging; then
76+ battery_pct
77+ else
78+ echo "External Power"
79+ fi
80+ }
81+ function battery_time_remaining() {
82+ local remaining_time
83+ remaining_time=$(sysctl -n hw.acpi.battery.time)
84+ if [[ $remaining_time -ge 0 ]]; then
85+ ((hour = $remaining_time / 60 ))
86+ ((minute = $remaining_time % 60 ))
87+ printf %02d:%02d $hour $minute
88+ fi
89+ }
90+ function battery_pct_prompt() {
91+ local battery_pct color
92+ battery_pct=$(battery_pct_remaining)
93+ if battery_is_charging; then
94+ echo "โˆž"
95+ else
96+ if [[ $battery_pct -gt 50 ]]; then
97+ color='green'
98+ elif [[ $battery_pct -gt 20 ]]; then
99+ color='yellow'
100+ else
101+ color='red'
102+ fi
103+ echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}"
104+ fi
105+ }
106+elif [[ "$OSTYPE" = linux-android ]] && (( ${+commands[termux-battery-status]} )); then
107+ function battery_is_charging() {
108+ termux-battery-status 2>/dev/null | command awk '/status/ { exit ($0 ~ /DISCHARGING/) }'
109+ }
110+ function battery_pct() {
111+ # Sample output:
112+ # {
113+ # "health": "GOOD",
114+ # "percentage": 93,
115+ # "plugged": "UNPLUGGED",
116+ # "status": "DISCHARGING",
117+ # "temperature": 29.0,
118+ # "current": 361816
119+ # }
120+ termux-battery-status 2>/dev/null | command awk '/percentage/ { gsub(/[,]/,""); print $2}'
121+ }
122+ function battery_pct_remaining() {
123+ if ! battery_is_charging; then
124+ battery_pct
125+ else
126+ echo "External Power"
127+ fi
128+ }
129+ function battery_time_remaining() { } # Not available on android
130+ function battery_pct_prompt() {
131+ local battery_pct color
132+ battery_pct=$(battery_pct_remaining)
133+ if battery_is_charging; then
134+ echo "โˆž"
135+ else
136+ if [[ $battery_pct -gt 50 ]]; then
137+ color='green'
138+ elif [[ $battery_pct -gt 20 ]]; then
139+ color='yellow'
140+ else
141+ color='red'
142+ fi
143+ echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}"
144+ fi
145+ }
146+elif [[ "$OSTYPE" = openbsd* ]]; then
147+ function battery_is_charging() {
148+ [[ $(apm -b) -eq 3 ]]
149+ }
150+ function battery_pct() {
151+ apm -l
152+ }
153+ function battery_pct_remaining() {
154+ if ! battery_is_charging; then
155+ battery_pct
156+ else
157+ echo "External Power"
158+ fi
159+ }
160+ function battery_time_remaining() {
161+ local remaining_time
162+ remaining_time=$(apm -m)
163+ if [[ $remaining_time -ge 0 ]]; then
164+ ((hour = $remaining_time / 60 ))
165+ ((minute = $remaining_time % 60 ))
166+ printf %02d:%02d $hour $minute
167+ fi
168+ }
169+ function battery_pct_prompt() {
170+ local battery_pct color
171+ battery_pct=$(battery_pct_remaining)
172+ if battery_is_charging; then
173+ echo "โˆž"
174+ else
175+ if [[ $battery_pct -gt 50 ]]; then
176+ color='green'
177+ elif [[ $battery_pct -gt 20 ]]; then
178+ color='yellow'
179+ else
180+ color='red'
181+ fi
182+ echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}"
183+ fi
184+ }
185+
186+elif [[ "$OSTYPE" = linux* ]]; then
187+ function battery_is_charging() {
188+ if (( $+commands[acpitool] )); then
189+ ! acpitool 2>/dev/null | command grep -qE '^\s+Battery.*Discharging'
190+ elif (( $+commands[acpi] )); then
191+ ! acpi 2>/dev/null | command grep -v "rate information unavailable" | command grep -q '^Battery.*Discharging'
192+ fi
193+ }
194+ function battery_pct() {
195+ if (( $+commands[acpitool] )); then
196+ # Sample output:
197+ # Battery #1 : Unknown, 99.55%
198+ # Battery #2 : Discharging, 49.58%, 01:12:05
199+ # All batteries : 62.60%, 02:03:03
200+ local -i pct=$(acpitool 2>/dev/null | command awk -F, '
201+ /^\s+All batteries/ {
202+ gsub(/[^0-9.]/, "", $1)
203+ pct=$1
204+ exit
205+ }
206+ !pct && /^\s+Battery/ {
207+ gsub(/[^0-9.]/, "", $2)
208+ pct=$2
209+ }
210+ END { print pct }
211+ ')
212+ echo $pct
213+ elif (( $+commands[acpi] )); then
214+ # Sample output:
215+ # Battery 0: Discharging, 0%, rate information unavailable
216+ # Battery 1: Full, 100%
217+ acpi 2>/dev/null | command awk -F, '
218+ /rate information unavailable/ { next }
219+ /^Battery.*: /{ gsub(/[^0-9]/, "", $2); print $2; exit }
220+ '
221+ fi
222+ }
223+ function battery_pct_remaining() {
224+ if ! battery_is_charging; then
225+ battery_pct
226+ else
227+ echo "External Power"
228+ fi
229+ }
230+ function battery_time_remaining() {
231+ if ! battery_is_charging; then
232+ acpi 2>/dev/null | command grep -v "rate information unavailable" | cut -f3 -d ','
233+ fi
234+ }
235+ function battery_pct_prompt() {
236+ local battery_pct color
237+ battery_pct=$(battery_pct_remaining)
238+ if battery_is_charging; then
239+ echo "โˆž"
240+ else
241+ if [[ $battery_pct -gt 50 ]]; then
242+ color='green'
243+ elif [[ $battery_pct -gt 20 ]]; then
244+ color='yellow'
245+ else
246+ color='red'
247+ fi
248+ echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}"
249+ fi
250+ }
251+else
252+ # Empty functions so we don't cause errors in prompts
253+ function battery_is_charging { false }
254+ function battery_pct \
255+ battery_pct_remaining \
256+ battery_time_remaining \
257+ battery_pct_prompt { }
258+fi
259+
260+function battery_level_gauge() {
261+ local gauge_slots=${BATTERY_GAUGE_SLOTS:-10}
262+ local green_threshold=${BATTERY_GREEN_THRESHOLD:-$(( gauge_slots * 0.6 ))}
263+ local yellow_threshold=${BATTERY_YELLOW_THRESHOLD:-$(( gauge_slots * 0.4 ))}
264+ local color_green=${BATTERY_COLOR_GREEN:-%F{green}}
265+ local color_yellow=${BATTERY_COLOR_YELLOW:-%F{yellow}}
266+ local color_red=${BATTERY_COLOR_RED:-%F{red}}
267+ local color_reset=${BATTERY_COLOR_RESET:-%{%f%k%b%}}
268+ local battery_prefix=${BATTERY_GAUGE_PREFIX:-'['}
269+ local battery_suffix=${BATTERY_GAUGE_SUFFIX:-']'}
270+ local filled_symbol=${BATTERY_GAUGE_FILLED_SYMBOL:-'โ–ถ'}
271+ local empty_symbol=${BATTERY_GAUGE_EMPTY_SYMBOL:-'โ–ท'}
272+ local charging_color=${BATTERY_CHARGING_COLOR:-$color_yellow}
273+ local charging_symbol=${BATTERY_CHARGING_SYMBOL:-'โšก'}
274+
275+ local -i battery_remaining_percentage=$(battery_pct)
276+ local filled empty gauge_color
277+
278+ if [[ $battery_remaining_percentage =~ [0-9]+ ]]; then
279+ filled=$(( ($battery_remaining_percentage * $gauge_slots) / 100 ))
280+ empty=$(( $gauge_slots - $filled ))
281+
282+ if [[ $filled -gt $green_threshold ]]; then
283+ gauge_color=$color_green
284+ elif [[ $filled -gt $yellow_threshold ]]; then
285+ gauge_color=$color_yellow
286+ else
287+ gauge_color=$color_red
288+ fi
289+ else
290+ filled=$gauge_slots
291+ empty=0
292+ filled_symbol=${BATTERY_UNKNOWN_SYMBOL:-'.'}
293+ fi
294+
295+ local charging=' '
296+ battery_is_charging && charging=$charging_symbol
297+
298+ # Charging status and prefix
299+ print -n ${charging_color}${charging}${color_reset}${battery_prefix}${gauge_color}
300+ # Filled slots
301+ [[ $filled -gt 0 ]] && printf ${filled_symbol//\%/\%\%}'%.0s' {1..$filled}
302+ # Empty slots
303+ [[ $filled -lt $gauge_slots ]] && printf ${empty_symbol//\%/\%\%}'%.0s' {1..$empty}
304+ # Suffix
305+ print -n ${color_reset}${battery_suffix}${color_reset}
306+}
+29-0.oh-my-zsh/plugins/bazel/README.md
@@ -0,0 +1,29 @@
1+# Bazel plugin
2+
3+This plugin adds completion and aliases for [bazel](https://bazel.build), an open-source build and test tool
4+that scalably supports multi-language and multi-platform projects.
5+
6+To use it, add `bazel` to the plugins array in your zshrc file:
7+
8+```zsh
9+plugins=(... bazel)
10+```
11+
12+The plugin has a copy of [the completion script from the git repository][1].
13+
14+[1]: https://github.com/bazelbuild/bazel/blob/master/scripts/zsh_completion/_bazel
15+
16+## Aliases
17+
18+| Alias | Command | Description |
19+| ----- | ------------- | ------------------------- |
20+| bzb | `bazel build` | The `bazel build` command |
21+| bzt | `bazel test` | The `bazel test` command |
22+| bzr | `bazel run` | The `bazel run` command |
23+| bzq | `bazel query` | The `bazel query` command |
24+
25+## Functions
26+
27+| Function | Description |
28+| -------- | -------------------------------- |
29+| sri-hash | Generate SRI hash used by bzlmod |
+341-0.oh-my-zsh/plugins/bazel/_bazel
@@ -0,0 +1,341 @@
1+#compdef bazel bazelisk
2+
3+# Copyright 2015 The Bazel Authors. All rights reserved.
4+#
5+# Licensed under the Apache License, Version 2.0 (the "License");
6+# you may not use this file except in compliance with the License.
7+# You may obtain a copy of the License at
8+#
9+# http://www.apache.org/licenses/LICENSE-2.0
10+#
11+# Unless required by applicable law or agreed to in writing, software
12+# distributed under the License is distributed on an "AS IS" BASIS,
13+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+# See the License for the specific language governing permissions and
15+# limitations under the License.
16+
17+# Installation
18+# ------------
19+#
20+# 1. Add this script to a directory on your $fpath:
21+# fpath[1,0]=~/.zsh/completion/
22+# mkdir -p ~/.zsh/completion/
23+# cp scripts/zsh_completion/_bazel ~/.zsh/completion
24+#
25+# 2. Optionally, add the following to your .zshrc.
26+# zstyle ':completion:*' use-cache on
27+# zstyle ':completion:*' cache-path ~/.zsh/cache
28+#
29+# This way, the completion script does not have to parse Bazel's options
30+# repeatedly. The directory in cache-path must be created manually.
31+#
32+# 3. Restart the shell
33+#
34+# Options
35+# -------
36+# completion:init:bazel:* cache-lifetime
37+# Lifetime for the completion cache (if turned on, default: 1 week)
38+
39+local curcontext="$curcontext" state line
40+
41+: ${BAZEL_COMPLETION_PACKAGE_PATH:=%workspace%}
42+: ${BAZEL:=bazel}
43+_bazel_b() { ${BAZEL} --noblock_for_lock "$@" 2>/dev/null; }
44+
45+# Default cache lifetime is 1 week
46+zstyle -s ":completion:${curcontext}:" cache-lifetime lifetime
47+if [[ -z "${lifetime}" ]]; then
48+ lifetime=$((60*60*24*7))
49+fi
50+
51+_bazel_cache_policy() {
52+ local -a oldp
53+ oldp=( "$1"(Nms+${lifetime}) )
54+ (( $#oldp ))
55+}
56+
57+_set_cache_policy() {
58+ zstyle -s ":completion:*:$curcontext*" cache-policy update_policy
59+
60+ if [[ -z "$update_policy" ]]; then
61+ zstyle ":completion:$curcontext*" cache-policy _bazel_cache_policy
62+ fi
63+}
64+
65+# Skips over all global arguments. After invocation, OFFSET contains the
66+# position of the bazel command in $words.
67+_adapt_subcommand_offset() {
68+ OFFSET=2
69+ for w in ${words[2,-1]}; do
70+ if [[ $w == (#b)-* ]]; then
71+ (( OFFSET++ ))
72+ else
73+ return
74+ fi
75+ done
76+}
77+
78+# Retrieve the cache but also check that the value is not empty.
79+_bazel_safe_retrieve_cache() {
80+ _retrieve_cache $1 && [[ ${(P)#2} -gt 0 ]]
81+}
82+
83+# Puts the name of the variable that contains the options for the bazel
84+# subcommand handed in as the first argument into the global variable
85+# _bazel_cmd_options.
86+_bazel_get_options() {
87+ local lcmd=$1
88+ _bazel_cmd_options=_bazel_${lcmd}_options
89+ _bazel_cmd_args=_bazel_${lcmd}_args
90+ if [[ ${(P)#_bazel_cmd_options} != 0 ]]; then
91+ return
92+ fi
93+ if _cache_invalid BAZEL_${lcmd}_options || _cache_invalid BAZEL_${lcmd}_args \
94+ || ! _bazel_safe_retrieve_cache BAZEL_${lcmd}_options ${_bazel_cmd_options} \
95+ || ! _retrieve_cache BAZEL_${lcmd}_args ${_bazel_cmd_args}; then
96+ if ! eval "$(_bazel_b help completion)"; then
97+ return
98+ fi
99+ local opts_var
100+ if [[ $lcmd == "startup_options" ]]; then
101+ opts_var="BAZEL_STARTUP_OPTIONS"
102+ else
103+ opts_var="BAZEL_COMMAND_${lcmd:u}_FLAGS"
104+ fi
105+ local -a raw_options
106+ if ! eval "raw_options=(\${(@f)$opts_var})"; then
107+ return
108+ fi
109+
110+ local -a option_list
111+ for opt in $raw_options; do
112+ case $opt in
113+ --*"={"*)
114+ local lst="${${opt##*"={"}%"}"}"
115+ local opt="${opt%%=*}="
116+ option_list+=("${opt}:string:_values '' ${lst//,/ }") ;;
117+ --*=path)
118+ option_list+=("${opt%path}:path:_files") ;;
119+ --*=label)
120+ option_list+=("${opt%label}:target:_bazel_complete_target") ;;
121+ --*=*)
122+ option_list+=("${opt}:string:") ;;
123+ *)
124+ option_list+=("$opt") ;;
125+ esac
126+ done
127+
128+ local -a cmd_args
129+ local cmd_type
130+ if eval "cmd_type=\${BAZEL_COMMAND_${lcmd:u}_ARGUMENT}" && [[ -n $cmd_type ]]; then
131+ case $cmd_type in
132+ label|label-*)
133+ cmd_args+=("*::${cmd_type}:_bazel_complete_target_${cmd_type//-/_}") ;;
134+ info-key)
135+ cmd_args+=('1::key:_bazel_info_key') ;;
136+ path)
137+ cmd_args+=('1::profile:_path_files') ;;
138+ "command|{"*"}")
139+ local lst=${${cmd_type#"command|{"}%"}"}
140+ cmd_args+=("1::topic:_bazel_help_topic -- ${lst//,/ }") ;;
141+ esac
142+ fi
143+
144+ typeset -g "${_bazel_cmd_options}"="${(pj:|:)option_list[*]}"
145+ _store_cache BAZEL_${lcmd}_options ${_bazel_cmd_options}
146+ typeset -g "${_bazel_cmd_args}"="${(pj:|:)cmd_args[*]}"
147+ _store_cache BAZEL_${lcmd}_args ${_bazel_cmd_args}
148+ fi
149+}
150+
151+_get_build_targets() {
152+ local pkg=$1
153+ local rule_re
154+ typeset -a completions
155+ case $target_type in
156+ test)
157+ rule_re=".*_test"
158+ ;;
159+ build)
160+ rule_re=".*"
161+ ;;
162+ bin)
163+ rule_re=".*_test|.*_binary"
164+ ;;
165+ esac
166+ completions=(${$(_bazel_b query "kind(\"${rule_re}\", ${pkg}:all)" 2>/dev/null)##*:})
167+ if ( (( ${#completions} > 0 )) && [[ $target_type != bin ]] ); then
168+ completions+=(all)
169+ fi
170+ echo ${completions[*]}
171+}
172+
173+# Returns all packages that match $PREFIX. PREFIX may start with //, in which
174+# case the workspace roots are searched. Otherwise, they are completed based on
175+# PWD.
176+_get_build_packages() {
177+ local workspace pfx
178+ typeset -a package_roots paths final_paths
179+ workspace=$PWD
180+ package_roots=(${(ps.:.)BAZEL_COMPLETION_PACKAGE_PATH})
181+ package_roots=(${^package_roots//\%workspace\%/$workspace})
182+ if [[ "${(e)PREFIX}" == //* ]]; then
183+ pfx=${(e)PREFIX[2,-1]}
184+ else
185+ pfx=${(e)PREFIX}
186+ fi
187+ paths=(${^package_roots}/${pfx}*(/))
188+ for p in ${paths[*]}; do
189+ if [[ -f ${p}/BUILD || -f ${p}/BUILD.bazel ]]; then
190+ final_paths+=(${p##*/}:)
191+ fi
192+ final_paths+=(${p##*/}/)
193+ done
194+ echo ${final_paths[*]}
195+}
196+
197+_package_remove_slash() {
198+ if [[ $KEYS == ':' && $LBUFFER == */ ]]; then
199+ LBUFFER=${LBUFFER[1,-2]}
200+ fi
201+}
202+
203+# Completion function for BUILD targets, called by the completion system.
204+_bazel_complete_target() {
205+ local expl
206+ typeset -a packages targets
207+ if [[ "${(e)PREFIX}" != *:* ]]; then
208+ # There is no : in the prefix, completion can be either
209+ # a package or a target, if the cwd is a package itself.
210+ if [[ -f $PWD/BUILD || -f $PWD/BUILD.bazel ]]; then
211+ targets=($(_get_build_targets ""))
212+ _description build_target expl "BUILD target"
213+ compadd "${expl[@]}" -a targets
214+ fi
215+ packages=($(_get_build_packages))
216+ _description build_package expl "BUILD package"
217+ # Chop of the leading path segments from the prefix for display.
218+ compset -P '*/'
219+ compadd -R _package_remove_slash -S '' "${expl[@]}" -a packages
220+ else
221+ targets=($(_get_build_targets "${${(e)PREFIX}%:*}"))
222+ _description build_target expl "BUILD target"
223+ # Ignore the current prefix for the upcoming completion, since we only list
224+ # the names of the targets, not the full path.
225+ compset -P '*:'
226+ compadd "${expl[@]}" -a targets
227+ fi
228+}
229+
230+_bazel_complete_target_label() {
231+ typeset -g target_type=build
232+ _bazel_complete_target
233+}
234+
235+_bazel_complete_target_label_test() {
236+ typeset -g target_type=test
237+ _bazel_complete_target
238+}
239+
240+_bazel_complete_target_label_bin() {
241+ typeset -g target_type=bin
242+ _bazel_complete_target
243+}
244+
245+### Actual completion commands
246+
247+_bazel() {
248+ _adapt_subcommand_offset
249+ if (( CURRENT - OFFSET > 0 )); then
250+ # Remember the subcommand name, stored globally so we can access it
251+ # from any subsequent function
252+ cmd=${words[OFFSET]//-/_}
253+
254+ # Set the context for the subcommand.
255+ curcontext="${curcontext%:*:*}:bazel-$cmd:"
256+ _set_cache_policy
257+
258+ # Narrow the range of words we are looking at to exclude cmd
259+ # name and any leading options
260+ (( CURRENT = CURRENT - OFFSET + 1 ))
261+ shift $((OFFSET - 1)) words
262+ # Run the completion for the subcommand
263+ _bazel_get_options $cmd
264+ _arguments : \
265+ ${(Pps:|:)_bazel_cmd_options} \
266+ ${(Pps:|:)_bazel_cmd_args}
267+ else
268+ _set_cache_policy
269+ # Start special handling for global options,
270+ # which can be retrieved by calling
271+ # $ bazel help startup_options
272+ _bazel_get_options startup_options
273+ _arguments : \
274+ ${(Pps:|:)_bazel_cmd_options} \
275+ "*:commands:_bazel_commands"
276+ fi
277+ return
278+}
279+
280+_get_commands() {
281+ # bazel_cmd_list is a global (g) array (a)
282+ typeset -ga _bazel_cmd_list
283+ # Use `bazel help` instead of `bazel help completion` to get command
284+ # descriptions.
285+ if _bazel_cmd_list=("${(@f)$(_bazel_b help | awk '
286+/Available commands/ { command=1; }
287+/ [-a-z]+[ \t]+.+/ { if (command) { printf "%s:", $1; for (i=2; i<=NF; i++) printf "%s ", $i; print "" } }
288+/^$/ { command=0; }')}"); then
289+ _store_cache BAZEL_commands _bazel_cmd_list
290+ fi
291+}
292+
293+# Completion function for bazel subcommands, called by the completion system.
294+_bazel_commands() {
295+ if [[ ${#_bazel_cmd_list} == 0 ]]; then
296+ if _cache_invalid BAZEL_commands \
297+ || ! _bazel_safe_retrieve_cache BAZEL_commands _bazel_cmd_list; then
298+ _get_commands
299+ fi
300+ fi
301+
302+ _describe -t bazel-commands 'Bazel command' _bazel_cmd_list
303+}
304+
305+# Completion function for bazel help options, called by the completion system.
306+_bazel_help_topic() {
307+ if [[ ${#_bazel_cmd_list} == 0 ]]; then
308+ if _cache_invalid BAZEL_commands \
309+ || ! _bazel_safe_retrieve_cache BAZEL_commands _bazel_cmd_list; then
310+ _get_commands
311+ fi
312+ fi
313+
314+ while [[ $# -gt 0 ]]; do
315+ if [[ $1 == -- ]]; then
316+ shift
317+ break
318+ fi
319+ shift
320+ done
321+ _bazel_help_list=($@)
322+ _bazel_help_list+=($_bazel_cmd_list)
323+ _describe -t bazel-help 'Help topic' _bazel_help_list
324+}
325+
326+# Completion function for bazel info keys, called by the completion system.
327+_bazel_info_key() {
328+ if [[ ${#_bazel_info_keys_list} == 0 ]]; then
329+ if _cache_invalid BAZEL_info_keys \
330+ || ! _bazel_safe_retrieve_cache BAZEL_info_keys _bazel_info_keys_list; then
331+ typeset -ga _bazel_info_keys_list
332+ # Use `bazel help` instead of `bazel help completion` to get info-key
333+ # descriptions.
334+ if _bazel_info_keys_list=("${(@f)$(_bazel_b help info-keys | awk '
335+ { printf "%s:", $1; for (i=2; i<=NF; i++) printf "%s ", $i; print "" }')}"); then
336+ _store_cache BAZEL_info_keys _bazel_info_keys_list
337+ fi
338+ fi
339+ fi
340+ _describe -t bazel-info 'Key' _bazel_info_keys_list
341+}
+9-0.oh-my-zsh/plugins/bazel/bazel.plugin.zsh
@@ -0,0 +1,9 @@
1+# Aliases for bazel
2+alias bzb='bazel build'
3+alias bzt='bazel test'
4+alias bzr='bazel run'
5+alias bzq='bazel query'
6+
7+sri-hash() {
8+ openssl dgst -sha256 -binary $1 | openssl base64 -A | sed 's/^/sha256-/'
9+}
+20-0.oh-my-zsh/plugins/bbedit/README.md
@@ -0,0 +1,20 @@
1+## bbedit
2+
3+Plugin for BBEdit, an HTML and text editor for Mac OS X
4+
5+### Requirements
6+
7+ * [BBEdit](https://www.barebones.com/products/bbedit/)
8+ * [BBEdit Command-Line Tools](https://www.barebones.com/support/bbedit/cmd-line-tools.html)
9+
10+### Usage
11+
12+ * If the `bb` command is called without an argument, launch BBEdit
13+
14+ * If `bb` is passed a directory, cd to it and open it in BBEdit
15+
16+ * If `bb` is passed a file, open it in BBEdit
17+
18+ * If `bbpb` create a new BBEdit document with the contents of the clipboard
19+
20+ * If `bbd` alias for BBEdit diff tool
+21-0.oh-my-zsh/plugins/bbedit/bbedit.plugin.zsh
@@ -0,0 +1,21 @@
1+alias bbpb='pbpaste | bbedit --clean --view-top'
2+
3+alias bbd=bbdiff
4+
5+#
6+# If the bb command is called without an argument, launch BBEdit
7+# If bb is passed a directory, cd to it and open it in BBEdit
8+# If bb is passed a file, open it in BBEdit
9+#
10+function bb() {
11+ if [[ -z "$1" ]]
12+ then
13+ bbedit --launch
14+ else
15+ bbedit "$1"
16+ if [[ -d "$1" ]]
17+ then
18+ cd "$1"
19+ fi
20+ fi
21+}
+5-0.oh-my-zsh/plugins/bedtools/README.md
@@ -0,0 +1,5 @@
1+# Bedtools plugin
2+
3+This plugin adds support for the [bedtools suite](http://bedtools.readthedocs.org/en/latest/):
4+
5+* Adds autocomplete options for all bedtools sub commands.
+64-0.oh-my-zsh/plugins/bedtools/_bedtools
@@ -0,0 +1,64 @@
1+#compdef bedtools
2+#autoload
3+
4+local curcontext="$curcontext" state line ret=1
5+local -a _files
6+
7+_arguments -C \
8+ '1: :->cmds' \
9+ '2:: :->args' && ret=0
10+
11+case $state in
12+ cmds)
13+ _values "bedtools command" \
14+ "--contact[Feature requests, bugs, mailing lists, etc.]" \
15+ "--help[Print this help menu.]" \
16+ "--version[What version of bedtools are you using?.]" \
17+ "annotate[Annotate coverage of features from multiple files.]" \
18+ "bamtobed[Convert BAM alignments to BED (& other) formats.]" \
19+ "bamtofastq[Convert BAM records to FASTQ records.]" \
20+ "bed12tobed6[Breaks BED12 intervals into discrete BED6 intervals.]" \
21+ "bedpetobam[Convert BEDPE intervals to BAM records.]" \
22+ "bedtobam[Convert intervals to BAM records.]" \
23+ "closest[Find the closest, potentially non-overlapping interval.]" \
24+ "cluster[Cluster (but don't merge) overlapping/nearby intervals.]" \
25+ "complement[Extract intervals _not_ represented by an interval file.]" \
26+ "coverage[Compute the coverage over defined intervals.]" \
27+ "expand[Replicate lines based on lists of values in columns.]" \
28+ "fisher[Calculate Fisher statistic b/w two feature files.]" \
29+ "flank[Create new intervals from the flanks of existing intervals.]" \
30+ "genomecov[Compute the coverage over an entire genome.]" \
31+ "getfasta[Use intervals to extract sequences from a FASTA file.]" \
32+ "groupby[Group by common cols. & summarize oth. cols. (~ SQL "groupBy")]" \
33+ "igv[Create an IGV snapshot batch script.]" \
34+ "intersect[Find overlapping intervals in various ways.]" \
35+ "jaccard[Calculate the Jaccard statistic b/w two sets of intervals.]" \
36+ "links[Create a HTML page of links to UCSC locations.]" \
37+ "makewindows[Make interval "windows" across a genome.]" \
38+ "map[Apply a function to a column for each overlapping interval.]" \
39+ "maskfasta[Use intervals to mask sequences from a FASTA file.]" \
40+ "merge[Combine overlapping/nearby intervals into a single interval.]" \
41+ "multicov[Counts coverage from multiple BAMs at specific intervals.]" \
42+ "multiinter[Identifies common intervals among multiple interval files.]" \
43+ "nuc[Profile the nucleotide content of intervals in a FASTA file.]" \
44+ "overlap[Computes the amount of overlap from two intervals.]" \
45+ "pairtobed[Find pairs that overlap intervals in various ways.]" \
46+ "pairtopair[Find pairs that overlap other pairs in various ways.]" \
47+ "random[Generate random intervals in a genome.]" \
48+ "reldist[Calculate the distribution of relative distances b/w two files.]" \
49+ "sample[Sample random records from file using reservoir sampling.]" \
50+ "shuffle[Randomly redistribute intervals in a genome.]" \
51+ "slop[Adjust the size of intervals.]" \
52+ "sort[Order the intervals in a file.]" \
53+ "subtract[Remove intervals based on overlaps b/w two files.]" \
54+ "tag[Tag BAM alignments based on overlaps with interval files.]" \
55+ "unionbedg[Combines coverage intervals from multiple BEDGRAPH files.]" \
56+ "window[Find overlapping intervals within a window around an interval.]" \
57+ ret=0
58+ ;;
59+ *)
60+ _files
61+ ;;
62+esac
63+
64+return ret
+64-0.oh-my-zsh/plugins/bgnotify/README.md
@@ -0,0 +1,64 @@
1+# bgnotify zsh plugin
2+
3+cross-platform background notifications for long running commands! Supports OSX and Linux.
4+
5+Standalone homepage: [t413/zsh-background-notify](https://github.com/t413/zsh-background-notify)
6+
7+---
8+
9+## How to use
10+
11+Just add bgnotify to your plugins list in your `.zshrc`
12+
13+- On OS X you'll need [terminal-notifier](https://github.com/alloy/terminal-notifier)
14+ * `brew install terminal-notifier` (or `gem install terminal-notifier`)
15+- On Linux, make sure you have `notify-send` or `kdialog` installed. If you're using Ubuntu you should already be all set!
16+- On Windows you can use [notifu](https://www.paralint.com/projects/notifu/) or the Cygwin Ports libnotify package
17+
18+
19+## Screenshots
20+
21+**Linux**
22+
23+![screenshot from 2014-11-07 15 58 36](https://cloud.githubusercontent.com/assets/326829/4962187/256b465c-66da-11e4-927d-cc2fc105e31f.png)
24+
25+**OS X**
26+
27+![screenshot 2014-11-08 14 15 12](https://cloud.githubusercontent.com/assets/326829/4965780/19fa3eac-6795-11e4-8ed6-0355711123a9.png)
28+
29+**Windows**
30+
31+![screenshot from 2014-11-07 15 55 00](https://cloud.githubusercontent.com/assets/326829/4962159/a2625ca0-66d9-11e4-9e91-c5834913190e.png)
32+
33+
34+## Configuration
35+
36+One can configure a few things:
37+
38+- `bgnotify_bell` enabled or disables the terminal bell (default true)
39+- `bgnotify_threshold` sets the notification threshold time (default 6 seconds)
40+- `function bgnotify_formatted` lets you change the notification. You can for instance customize the message and pass in an icon.
41+- `bgnotify_extraargs` appends extra args to notifier (e.g. `-e` for notify-send to create a transient notification)
42+
43+Use these by adding a function definition before the your call to source. Example:
44+
45+```sh
46+bgnotify_bell=false ## disable terminal bell
47+bgnotify_threshold=4 ## set your own notification threshold
48+
49+function bgnotify_formatted {
50+ ## $1=exit_status, $2=command, $3=elapsed_time
51+
52+ # Humanly readable elapsed time
53+ local elapsed="$(( $3 % 60 ))s"
54+ (( $3 < 60 )) || elapsed="$((( $3 % 3600) / 60 ))m $elapsed"
55+ (( $3 < 3600 )) || elapsed="$(( $3 / 3600 ))h $elapsed"
56+
57+ [ $1 -eq 0 ] && title="Holy Smokes Batman" || title="Holy Graf Zeppelin"
58+ [ $1 -eq 0 ] && icon="$HOME/icons/success.png" || icon="$HOME/icons/fail.png"
59+ bgnotify "$title - took ${elapsed}" "$2" "$icon"
60+}
61+
62+plugins=(git bgnotify) ## add to plugins list
63+source $ZSH/oh-my-zsh.sh ## existing source call
64+```
+141-0.oh-my-zsh/plugins/bgnotify/bgnotify.plugin.zsh
@@ -0,0 +1,141 @@
1+#!/usr/bin/env zsh
2+
3+## Setup
4+
5+[[ -o interactive ]] || return # don't load on non-interactive shells
6+[[ -z "$SSH_CLIENT" && -z "$SSH_TTY" ]] || return # don't load on a SSH connection
7+
8+zmodload zsh/datetime # faster than `date`
9+
10+
11+## Zsh Hooks
12+
13+function bgnotify_begin {
14+ bgnotify_timestamp=$EPOCHSECONDS
15+ bgnotify_lastcmd="${1:-$2}"
16+}
17+
18+function bgnotify_end {
19+ {
20+ local exit_status=$?
21+ local elapsed=$(( EPOCHSECONDS - bgnotify_timestamp ))
22+
23+ # check time elapsed
24+ [[ $bgnotify_timestamp -gt 0 ]] || return 0
25+ [[ $elapsed -ge $bgnotify_threshold ]] || return 0
26+
27+ # check if Terminal app is not active
28+ [[ $(bgnotify_appid) != "$bgnotify_termid" ]] || return 0
29+
30+ bgnotify_formatted "$exit_status" "$bgnotify_lastcmd" "$elapsed"
31+ } always {
32+ bgnotify_timestamp=0
33+ }
34+}
35+
36+autoload -Uz add-zsh-hook
37+add-zsh-hook preexec bgnotify_begin
38+add-zsh-hook precmd bgnotify_end
39+
40+
41+## Functions
42+
43+# allow custom function override
44+(( ${+functions[bgnotify_formatted]} )) || \
45+function bgnotify_formatted {
46+ local exit_status=$1
47+ local cmd="$2"
48+
49+ # humanly readable elapsed time
50+ local elapsed="$(( $3 % 60 ))s"
51+ (( $3 < 60 )) || elapsed="$((( $3 % 3600) / 60 ))m $elapsed"
52+ (( $3 < 3600 )) || elapsed="$(( $3 / 3600 ))h $elapsed"
53+
54+ [[ $bgnotify_bell = true ]] && printf '\a' # beep sound
55+ if [[ $exit_status -eq 0 ]]; then
56+ bgnotify "#win (took $elapsed)" "$cmd"
57+ else
58+ bgnotify "#fail (took $elapsed)" "$cmd"
59+ fi
60+}
61+
62+function bgnotify_appid {
63+ if (( ${+commands[osascript]} )); then
64+ osascript -e "tell application id \"$(bgnotify_programid)\" to get the {id, frontmost, id of front window, visible of front window}" 2>/dev/null
65+ elif [[ -n $WAYLAND_DISPLAY ]] && ([[ -n $SWAYSOCK ]] || [[ -n $I3SOCK ]]) && (( ${+commands[swaymsg]} )); then # wayland+sway
66+ local app_id=$(bgnotify_find_sway_appid)
67+ [[ -n "$app_id" ]] && echo "$app_id" || echo $EPOCHSECONDS
68+ elif [[ -z $WAYLAND_DISPLAY ]] && [[ -n $DISPLAY ]] && (( ${+commands[xprop]} )); then
69+ xprop -root _NET_ACTIVE_WINDOW 2>/dev/null | cut -d' ' -f5
70+ else
71+ echo $EPOCHSECONDS
72+ fi
73+}
74+
75+
76+function bgnotify_find_sway_appid {
77+ # output is "app_id,container_id", for example "Alacritty,1694"
78+ # see example swaymsg output: https://github.com/ohmyzsh/ohmyzsh/files/13463939/output.json
79+ if (( ${+commands[jq]} )); then
80+ swaymsg -t get_tree | jq '.. | select(.type?) | select(.focused==true) | {app_id, id} | join(",")'
81+ else
82+ swaymsg -t get_tree | awk '
83+ BEGIN { Id = ""; Appid = ""; FocusNesting = -1; Nesting = 0 }
84+ {
85+ # Enter a block
86+ if ($0 ~ /.*{$/) Nesting++
87+
88+ # Exit a block. If Nesting is now less than FocusNesting, we have the data we are looking for
89+ if ($0 ~ /^[[:blank:]]*}.*/) { Nesting--; if (FocusNesting > 0 && Nesting < FocusNesting) exit 0 }
90+
91+ # Save the Id, it is potentially what we are looking for
92+ if ($0 ~ /^[[:blank:]]*"id": [0-9]*,?$/) { sub(/^[[:blank:]]*"id": /, ""); sub(/,$/, ""); Id = $0 }
93+
94+ # Save the Appid, it is potentially what we are looking for
95+ if ($0 ~ /^[[:blank:]]*"app_id": ".*",?$/) { sub(/^[[:blank:]]*"app_id": "/, ""); sub(/",$/, ""); Appid = $0 }
96+
97+ # Window is focused, this nesting block contains the Id and Appid we want!
98+ if ($0 ~ /^[[:blank:]]*"focused": true,?$/) { FocusNesting = Nesting }
99+ }
100+ END {
101+ if (Appid != "" && Id != "" && FocusNesting != -1) print Appid "," Id
102+ else print ""
103+ }'
104+ fi
105+}
106+
107+function bgnotify_programid {
108+ case "$TERM_PROGRAM" in
109+ iTerm.app) echo 'com.googlecode.iterm2' ;;
110+ Apple_Terminal) echo 'com.apple.terminal' ;;
111+ esac
112+}
113+
114+function bgnotify {
115+ local title="$1"
116+ local message="$2"
117+ local icon="$3"
118+ if (( ${+commands[terminal-notifier]} )); then # macOS
119+ local term_id=$(bgnotify_programid)
120+ terminal-notifier -message "$message" -title "$title" ${=icon:+-appIcon "$icon"} ${=term_id:+-activate "$term_id"} ${=bgnotify_extraargs:-} &>/dev/null
121+ elif (( ${+commands[growlnotify]} )); then # macOS growl
122+ growlnotify -m "$title" "$message" ${=bgnotify_extraargs:-}
123+ elif (( ${+commands[notify-send]} )); then
124+ notify-send "$title" "$message" ${=icon:+--icon "$icon"} ${=bgnotify_extraargs:-}
125+ elif (( ${+commands[kdialog]} )); then # KDE
126+ kdialog --title "$title" --passivepopup "$message" 5 ${=bgnotify_extraargs:-}
127+ elif (( ${+commands[notifu]} )); then # cygwin
128+ notifu /m "$message" /p "$title" ${=icon:+/i "$icon"} ${=bgnotify_extraargs:-}
129+ fi
130+}
131+
132+## Defaults
133+
134+# enable terminal bell on notify by default
135+bgnotify_bell=${bgnotify_bell:-true}
136+
137+# notify if command took longer than 5s by default
138+bgnotify_threshold=${bgnotify_threshold:-5}
139+
140+# bgnotify_appid is slow in macOS and the terminal ID won't change, so cache it at startup
141+bgnotify_termid="$(bgnotify_appid)"
+17-0.oh-my-zsh/plugins/bower/README.md
@@ -0,0 +1,17 @@
1+# Bower plugin
2+
3+This plugin adds completion for [Bower](https://bower.io/) and a few useful aliases for common Bower commands.
4+
5+To use it, add `bower` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... bower)
9+```
10+
11+## Aliases
12+
13+| Alias | Command | Description |
14+|-------|-----------------|--------------------------------------------------------|
15+| bi | `bower install` | Installs the project dependencies listed in bower.json |
16+| bl | `bower list` | List local packages and possible updates |
17+| bs | `bower search` | Finds all packages or a specific package. |
+58-0.oh-my-zsh/plugins/bower/_bower
@@ -0,0 +1,58 @@
1+
2+
3+# Credits to npm's awesome completion utility.
4+#
5+# Bower completion script, based on npm completion script.
6+
7+###-begin-bower-completion-###
8+#
9+# Installation: bower completion >> ~/.bashrc (or ~/.zshrc)
10+# Or, maybe: bower completion > /usr/local/etc/bash_completion.d/bower
11+#
12+
13+COMP_WORDBREAKS=${COMP_WORDBREAKS/=/}
14+COMP_WORDBREAKS=${COMP_WORDBREAKS/@/}
15+export COMP_WORDBREAKS
16+
17+if type complete &>/dev/null; then
18+ _bower_completion () {
19+ local si="$IFS"
20+ IFS=$'\n' COMPREPLY=($(COMP_CWORD="$COMP_CWORD" \
21+ COMP_LINE="$COMP_LINE" \
22+ COMP_POINT="$COMP_POINT" \
23+ bower completion -- "${COMP_WORDS[@]}" \
24+ 2>/dev/null)) || return $?
25+ IFS="$si"
26+ }
27+ complete -F _bower_completion bower
28+elif type compdef &>/dev/null; then
29+ _bower_completion() {
30+ si=$IFS
31+ compadd -- $(COMP_CWORD=$((CURRENT-1)) \
32+ COMP_LINE=$BUFFER \
33+ COMP_POINT=0 \
34+ bower completion -- "${words[@]}" \
35+ 2>/dev/null)
36+ IFS=$si
37+ }
38+ compdef _bower_completion bower
39+elif type compctl &>/dev/null; then
40+ _bower_completion () {
41+ local cword line point words si
42+ read -Ac words
43+ read -cn cword
44+ let cword-=1
45+ read -l line
46+ read -ln point
47+ si="$IFS"
48+ IFS=$'\n' reply=($(COMP_CWORD="$cword" \
49+ COMP_LINE="$line" \
50+ COMP_POINT="$point" \
51+ bower completion -- "${words[@]}" \
52+ 2>/dev/null)) || return $?
53+ IFS="$si"
54+ }
55+ compctl -K _bower_completion bower
56+fi
57+###-end-bower-completion-###
58+
+84-0.oh-my-zsh/plugins/bower/bower.plugin.zsh
@@ -0,0 +1,84 @@
1+alias bi="bower install"
2+alias bisd="bower install --save-dev"
3+alias bis="bower install --save"
4+alias bl="bower list"
5+alias bs="bower search"
6+
7+_bower_installed_packages () {
8+ bower_package_list=$(bower ls --no-color 2>/dev/null| awk 'NR>3{print p}{p=$0}'| cut -d ' ' -f 2|sed 's/#.*//')
9+}
10+_bower ()
11+{
12+ local -a _1st_arguments _no_color _dopts _save_dev _force_latest _production
13+ local expl
14+ typeset -A opt_args
15+
16+ _no_color=('--no-color[Do not print colors (available in all commands)]')
17+
18+ _dopts=(
19+ '(--save)--save[Save installed packages into the project"s bower.json dependencies]'
20+ '(--force)--force[Force fetching remote resources even if a local copy exists on disk]'
21+ )
22+
23+ _save_dev=('(--save-dev)--save-dev[Save installed packages into the project"s bower.json devDependencies]')
24+
25+ _force_latest=('(--force-latest)--force-latest[Force latest version on conflict]')
26+
27+ _production=('(--production)--production[Do not install project devDependencies]')
28+
29+ _1st_arguments=(
30+ 'cache-clean:Clean the Bower cache, or the specified package caches' \
31+ 'help:Display help information about Bower' \
32+ 'info:Version info and description of a particular package' \
33+ 'init:Interactively create a bower.json file' \
34+ 'install:Install a package locally' \
35+ 'link:Symlink a package folder' \
36+ 'lookup:Look up a package URL by name' \
37+ 'register:Register a package' \
38+ 'search:Search for a package by name' \
39+ 'uninstall:Remove a package' \
40+ 'update:Update a package' \
41+ {ls,list}:'[List all installed packages]'
42+ )
43+ _arguments \
44+ $_no_color \
45+ '*:: :->subcmds' && return 0
46+
47+ if (( CURRENT == 1 )); then
48+ _describe -t commands "bower subcommand" _1st_arguments
49+ return
50+ fi
51+
52+ case "$words[1]" in
53+ install)
54+ _arguments \
55+ $_dopts \
56+ $_save_dev \
57+ $_force_latest \
58+ $_no_color \
59+ $_production
60+ ;;
61+ update)
62+ _arguments \
63+ $_dopts \
64+ $_no_color \
65+ $_force_latest
66+ _bower_installed_packages
67+ compadd "$@" $(echo $bower_package_list)
68+ ;;
69+ uninstall)
70+ _arguments \
71+ $_no_color \
72+ $_dopts
73+ _bower_installed_packages
74+ compadd "$@" $(echo $bower_package_list)
75+ ;;
76+ *)
77+ _arguments \
78+ $_no_color \
79+ ;;
80+ esac
81+
82+}
83+
84+compdef _bower bower
+49-0.oh-my-zsh/plugins/branch/README.md
@@ -0,0 +1,49 @@
1+# Branch plugin
2+
3+This plugin displays the current Git or Mercurial branch, fast. If in a Mercurial repository,
4+also display the current bookmark, if present.
5+
6+To use it, add `branch` to the plugins array in your zshrc file:
7+
8+```zsh
9+plugins=(... branch)
10+```
11+
12+## Speed test
13+
14+- `hg branch`:
15+
16+ ```console
17+ $ time hg branch
18+ 0.11s user 0.14s system 70% cpu 0.355 total
19+ ```
20+
21+- branch plugin:
22+
23+ ```console
24+ $ time zsh /tmp/branch_prompt_info_test.zsh
25+ 0.00s user 0.01s system 78% cpu 0.014 total
26+ ```
27+
28+## Usage
29+
30+Copy your theme to `$ZSH_CUSTOM/themes/` and modify it to add `$(branch_prompt_info)` in your prompt.
31+This example is for the `robbyrussell` theme:
32+
33+```diff
34+diff --git a/themes/robbyrussell.zsh-theme b/themes/robbyrussell.zsh-theme
35+index 2fd5f2cd..9d89a464 100644
36+--- a/themes/robbyrussell.zsh-theme
37++++ b/themes/robbyrussell.zsh-theme
38+@@ -1,5 +1,5 @@
39+ PROMPT="%(?:%{$fg_bold[green]%}โžœ :%{$fg_bold[red]%}โžœ )"
40+-PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)'
41++PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(branch_prompt_info)'
42+
43+ ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[blue]%}git:(%{$fg[red]%}"
44+ ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
45+```
46+
47+## Maintainer
48+
49+Victor Torres (<vpaivatorres@gmail.com>)
+35-0.oh-my-zsh/plugins/branch/branch.plugin.zsh
@@ -0,0 +1,35 @@
1+# Branch: displays the current Git or Mercurial branch fast.
2+# Victor Torres <vpaivatorres@gmail.com>
3+# Oct 2, 2015
4+
5+function branch_prompt_info() {
6+ # Start checking in current working directory
7+ local branch="" dir="$PWD"
8+ while [[ "$dir" != '/' ]]; do
9+ # Found .git directory
10+ if [[ -d "${dir}/.git" ]]; then
11+ branch="${"$(<"${dir}/.git/HEAD")"##ref: refs/heads/}"
12+ echo 'ยฑ' "${branch:gs/%/%%}"
13+ return
14+ fi
15+
16+ # Found .hg directory
17+ if [[ -d "${dir}/.hg" ]]; then
18+ if [[ -f "${dir}/.hg/branch" ]]; then
19+ branch="$(<"${dir}/.hg/branch")"
20+ else
21+ branch="default"
22+ fi
23+
24+ if [[ -f "${dir}/.hg/bookmarks.current" ]]; then
25+ branch="${branch}/$(<"${dir}/.hg/bookmarks.current")"
26+ fi
27+
28+ echo 'โ˜ฟ' "${branch:gs/%/%%}"
29+ return
30+ fi
31+
32+ # Check parent directory
33+ dir="${dir:h}"
34+ done
35+}
+62-0.oh-my-zsh/plugins/brew/README.md
@@ -0,0 +1,62 @@
1+# brew plugin
2+
3+The plugin adds several aliases for common [brew](https://brew.sh) commands.
4+
5+To use it, add `brew` to the plugins array of your zshrc file:
6+
7+```zsh
8+plugins=(... brew)
9+```
10+
11+## Shellenv
12+
13+If `brew` is not found in the PATH, this plugin will attempt to find it in common locations, and execute
14+`brew shellenv` to set the environment appropriately. This plugin will also export
15+`HOMEBREW_PREFIX="$(brew --prefix)"` if not previously defined for convenience.
16+
17+In case you installed `brew` in a non-common location, you can still set `BREW_LOCATION` variable pointing to
18+the `brew` binary before sourcing `oh-my-zsh.sh` and it'll set up the environment.
19+
20+## Aliases
21+
22+| Alias | Command | Description |
23+| -------- | --------------------------------------- | --------------------------------------------------------------------- |
24+| `ba` | `brew autoremove` | Uninstall unnecessary formulae. |
25+| `bci` | `brew info --cask` | Display information about the given cask. |
26+| `bcin` | `brew install --cask` | Install the given cask. |
27+| `bcl` | `brew list --cask` | List installed casks. |
28+| `bcn` | `brew cleanup` | Run cleanup. |
29+| `bco` | `brew outdated --cask` | Report all outdated casks. |
30+| `bcrin` | `brew reinstall --cask` | Reinstall the given cask. |
31+| `bcubc` | `brew upgrade --cask && brew cleanup` | Upgrade outdated casks, then run cleanup. |
32+| `bcubo` | `brew update && brew outdated --cask` | Update Homebrew data, then list outdated casks. |
33+| `bcup` | `brew upgrade --cask` | Upgrade all outdated casks. |
34+| `bfu` | `brew upgrade --formula` | Upgrade only formulae (not casks). |
35+| `bi` | `brew install` | Install a formula. |
36+| `bl` | `brew list` | List all installed formulae. |
37+| `bo` | `brew outdated` | List installed formulae that have an updated version available. |
38+| `brewp` | `brew pin` | Pin a specified formula so that it's not upgraded. |
39+| `brews` | `brew list -1` | List installed formulae or the installed files for a given formula. |
40+| `brewsp` | `brew list --pinned` | List pinned formulae, or show the version of a given formula. |
41+| `bsl` | `brew services list` | List all running services. |
42+| `bsoff` | `brew services stop` | Stop the service and unregister it from launching at login (or boot). |
43+| `bsoffa` | `bsoff --all` | Stop all started services. |
44+| `bson` | `brew services start` | Start the service and register it to launch at login (or boot). |
45+| `bsona` | `bson --all` | Start all stopped services. |
46+| `bsr` | `brew services run` | Run the service without registering to launch at login (or boot). |
47+| `bsra` | `bsr --all` | Run all stopped services. |
48+| `bu` | `brew update` | Update brew and all installed formulae. |
49+| `bubo` | `brew update && brew outdated` | Update Homebrew data, then list outdated formulae and casks. |
50+| `bubu` | `bubo && bup` | Do the last two operations above. |
51+| `bugbc` | `brew upgrade --greedy && brew cleanup` | Upgrade outdated formulae and casks (greedy), then run cleanup. |
52+| `bup` | `brew upgrade` | Upgrade outdated, unpinned brews. |
53+| `buz` | `brew uninstall --zap` | Remove all files associated with a cask. |
54+
55+## Completion
56+
57+This plugin configures paths with Homebrew's completion functions automatically, so you don't need to do it
58+manually. See: https://docs.brew.sh/Shell-Completion#configuring-completions-in-zsh.
59+
60+With the release of Homebrew 1.0, they decided to bundle the zsh completion as part of the brew installation,
61+so we no longer ship it with the brew plugin; now it only has brew aliases. If you find that brew completion
62+no longer works, make sure you have your Homebrew installation fully up to date.
+79-0.oh-my-zsh/plugins/brew/brew.plugin.zsh
@@ -0,0 +1,79 @@
1+if (( ! $+commands[brew] )); then
2+ if [[ -n "$BREW_LOCATION" ]]; then
3+ if [[ ! -x "$BREW_LOCATION" ]]; then
4+ echo "[oh-my-zsh] $BREW_LOCATION is not executable"
5+ return
6+ fi
7+ elif [[ -x /opt/homebrew/bin/brew ]]; then
8+ BREW_LOCATION="/opt/homebrew/bin/brew"
9+ elif [[ -x /usr/local/bin/brew ]]; then
10+ BREW_LOCATION="/usr/local/bin/brew"
11+ elif [[ -x /home/linuxbrew/.linuxbrew/bin/brew ]]; then
12+ BREW_LOCATION="/home/linuxbrew/.linuxbrew/bin/brew"
13+ elif [[ -x "$HOME/.linuxbrew/bin/brew" ]]; then
14+ BREW_LOCATION="$HOME/.linuxbrew/bin/brew"
15+ else
16+ return
17+ fi
18+
19+ # Only add Homebrew installation to PATH, MANPATH, and INFOPATH if brew is
20+ # not already on the path, to prevent duplicate entries. This aligns with
21+ # the behavior of the brew installer.sh post-install steps.
22+ eval "$("$BREW_LOCATION" shellenv)"
23+ unset BREW_LOCATION
24+fi
25+
26+if [[ -z "$HOMEBREW_PREFIX" ]]; then
27+ # Maintain compatibility with potential custom user profiles, where we had
28+ # previously relied on always sourcing shellenv. OMZ plugins should not rely
29+ # on this to be defined due to out of order processing.
30+ export HOMEBREW_PREFIX="$(brew --prefix)"
31+fi
32+
33+if [[ -d "$HOMEBREW_PREFIX/share/zsh/site-functions" ]]; then
34+ fpath+=("$HOMEBREW_PREFIX/share/zsh/site-functions")
35+fi
36+
37+alias ba='brew autoremove'
38+alias bci='brew info --cask'
39+alias bcin='brew install --cask'
40+alias bcl='brew list --cask'
41+alias bcn='brew cleanup'
42+alias bco='brew outdated --cask'
43+alias bcrin='brew reinstall --cask'
44+alias bcubc='brew upgrade --cask && brew cleanup'
45+alias bcubo='brew update && brew outdated --cask'
46+alias bcup='brew upgrade --cask'
47+alias bfu='brew upgrade --formula'
48+alias bi='brew install'
49+alias bl='brew list'
50+alias bo='brew outdated'
51+alias brewp='brew pin'
52+alias brewsp='brew list --pinned'
53+alias bsl='brew services list'
54+alias bsoff='brew services stop'
55+alias bsoffa='bsoff --all'
56+alias bson='brew services start'
57+alias bsona='bson --all'
58+alias bsr='brew services run'
59+alias bsra='bsr --all'
60+alias bu='brew update'
61+alias bubo='brew update && brew outdated'
62+alias bubu='bubo && bup'
63+alias bubug='bubo && bugbc'
64+alias bugbc='brew upgrade --greedy && brew cleanup'
65+alias bup='brew upgrade'
66+alias buz='brew uninstall --zap'
67+
68+function brews() {
69+ local formulae="$(brew leaves | xargs brew deps --installed --for-each)"
70+ local casks="$(brew list --cask 2>/dev/null)"
71+
72+ local blue="$(tput setaf 4)"
73+ local bold="$(tput bold)"
74+ local off="$(tput sgr0)"
75+
76+ echo "${blue}==>${off} ${bold}Formulae${off}"
77+ echo "${formulae}" | sed "s/^\(.*\):\(.*\)$/\1${blue}\2${off}/"
78+ echo "\n${blue}==>${off} ${bold}Casks${off}\n${casks}"
79+}
+26-0.oh-my-zsh/plugins/bridgetown/README.md
@@ -0,0 +1,26 @@
1+# Bridgetown plugin
2+
3+This plugin adds some aliases and autocompletion for common [Bridgetown](https://bridgetownrb.com/) commands.
4+
5+To use it, add `bridgetown` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... bridgetown)
9+```
10+
11+## Aliases
12+
13+| Alias | Command |
14+|-------|----------------------------|
15+| br | `bridgetown` |
16+| bra | `bin/bridgetown apply` |
17+| brb | `bin/bridgetown build` |
18+| brc | `bin/bridgetown console` |
19+| brclean | `bin/bridgetown clean` |
20+| brd | `bin/bridgetown deploy` |
21+| brdoc | `bin/bridgetown doctor` |
22+| brh | `bin/bridgetown help` |
23+| brn | `bridgetown new` |
24+| brp | `bridgetown plugins` |
25+| brpl | `bridgetown plugins list` |
26+| brs | `bin/bridgetown start` |
+12-0.oh-my-zsh/plugins/bridgetown/bridgetown.plugin.zsh
@@ -0,0 +1,12 @@
1+alias br='bridgetown'
2+alias bra='bin/bridgetown apply'
3+alias brb='bin/bridgetown build'
4+alias brc='bin/bridgetown console'
5+alias brclean='bin/bridgetown clean'
6+alias brd='bin/bridgetown deploy'
7+alias brdoc='bin/bridgetown doctor'
8+alias brh='bin/bridgetown help'
9+alias brn='bridgetown new'
10+alias brp='bridgetown plugins'
11+alias brpl='bridgetown plugins list'
12+alias brs='bin/bridgetown start'
+9-0.oh-my-zsh/plugins/buf/README.md
@@ -0,0 +1,9 @@
1+# Buf plugin
2+
3+This plugin adds completion for [Buf CLI](https://github.com/bufbuild/buf), a tool working with Protocol Buffers.
4+
5+To use it, add `buf` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... buf)
9+```
+14-0.oh-my-zsh/plugins/buf/buf.plugin.zsh
@@ -0,0 +1,14 @@
1+# Autocompletion for the Buf CLI (buf).
2+if (( !$+commands[buf] )); then
3+ return
4+fi
5+# If the completion file doesn't exist yet, we need to autoload it and
6+# bind it to `buf`. Otherwise, compinit will have already done that.
7+if [[ ! -f "$ZSH_CACHE_DIR/completions/_buf" ]]; then
8+ typeset -g -A _comps
9+ autoload -Uz _buf
10+ _comps[buf]=_buf
11+fi
12+
13+# Generate and load buf completion
14+buf completion zsh >! "$ZSH_CACHE_DIR/completions/_buf" &|
+20-0.oh-my-zsh/plugins/bun/README.md
@@ -0,0 +1,20 @@
1+# Bun Plugin
2+
3+This plugin sets up completion for [Bun](https://bun.sh).
4+
5+To use it, add `bun` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... bun)
9+```
10+
11+This plugin does not add any aliases.
12+
13+## Cache
14+
15+This plugin caches the completion script and is automatically updated when the
16+plugin is loaded, which is usually when you start up a new terminal emulator.
17+
18+The cache is stored at:
19+
20+- `$ZSH_CACHE_DIR/completions/_bun_` completions script
+14-0.oh-my-zsh/plugins/bun/bun.plugin.zsh
@@ -0,0 +1,14 @@
1+# If Bun is not found, don't do the rest of the script
2+if (( ! $+commands[bun] )); then
3+ return
4+fi
5+
6+# If the completion file doesn't exist yet, we need to autoload it and
7+# bind it to `bun`. Otherwise, compinit will have already done that.
8+if [[ ! -f "$ZSH_CACHE_DIR/completions/_bun" ]]; then
9+ typeset -g -A _comps
10+ autoload -Uz _bun
11+ _comps[bun]=_bun
12+fi
13+
14+SHELL=zsh bun completions >| "$ZSH_CACHE_DIR/completions/_bun" &|
+74-0.oh-my-zsh/plugins/bundler/README.md
@@ -0,0 +1,74 @@
1+# Bundler
2+
3+This plugin adds completion for basic bundler commands, as well as aliases and helper functions for
4+an easier experience with bundler.
5+
6+To use it, add `bundler` to the plugins array in your zshrc file:
7+
8+```zsh
9+plugins=(... bundler)
10+```
11+
12+## Aliases
13+
14+| Alias | Command | Description |
15+|--------|--------------------------------------|------------------------------------------------------------------------------------------|
16+| `ba` | `bundle add` | Add gem to the Gemfile and run bundle install |
17+| `bck` | `bundle check` | Verifies if dependencies are satisfied by installed gems |
18+| `bcn` | `bundle clean` | Cleans up unused gems in your bundler directory |
19+| `be` | `bundle exec` | Execute a command in the context of the bundle |
20+| `bi` | `bundle install --jobs=<core_count>` | Install the dependencies specified in your Gemfile (using all cores in bundler >= 1.4.0) |
21+| `bl` | `bundle list` | List all the gems in the bundle |
22+| `bo` | `bundle open` | Opens the source directory for a gem in your bundle |
23+| `bout` | `bundle outdated` | List installed gems with newer versions available |
24+| `bp` | `bundle package` | Package your needed .gem files into your application |
25+| `bu` | `bundle update` | Update your gems to the latest available versions |
26+
27+## Gem wrapper
28+
29+The plugin adds a wrapper for common gems, which:
30+
31+- Looks for a binstub under `./bin/` and executes it if present.
32+- Calls `bundle exec <gem>` otherwise.
33+
34+Common gems wrapped by default (by name of the executable):
35+
36+`annotate`, `cap`, `capify`, `cucumber`, `foodcritic`, `guard`, `hanami`, `irb`, `jekyll`, `kitchen`, `knife`, `middleman`, `nanoc`, `pry`, `puma`, `rackup`, `rainbows`, `rake`, `rspec`, `rubocop`, `shotgun`, `sidekiq`, `spec`, `spork`, `spring`, `strainer`, `tailor`, `taps`, `thin`, `thor`, `unicorn` and `unicorn_rails`.
37+
38+### Settings
39+
40+You can add or remove gems from the list of wrapped commands.
41+Please **use the exact name of the executable** and not the gem name.
42+
43+#### Include gems to be wrapped (`BUNDLED_COMMANDS`)
44+
45+Add this before the plugin list in your `.zshrc`:
46+
47+```sh
48+BUNDLED_COMMANDS=(rubocop)
49+plugins=(... bundler ...)
50+```
51+
52+This will add the wrapper for the `rubocop` gem (i.e. the executable).
53+
54+#### Exclude gems from being wrapped (`UNBUNDLED_COMMANDS`)
55+
56+Add this before the plugin list in your `.zshrc`:
57+
58+```sh
59+UNBUNDLED_COMMANDS=(foreman spin)
60+plugins=(... bundler ...)
61+```
62+
63+This will exclude the `foreman` and `spin` gems (i.e. their executable) from being wrapped.
64+
65+### Excluded gems
66+
67+These gems should not be called with `bundle exec`. Please see [issue #2923](https://github.com/ohmyzsh/ohmyzsh/pull/2923) on GitHub for clarification:
68+
69+- `berks`
70+- `foreman`
71+- `mailcatcher`
72+- `rails`
73+- `ruby`
74+- `spin`
+105-0.oh-my-zsh/plugins/bundler/_bundler
@@ -0,0 +1,105 @@
1+#compdef bundle bundler
2+
3+local curcontext="$curcontext" state line _gems _opts ret=1
4+
5+_arguments -C -A "-v" -A "--version" \
6+ '(- 1 *)'{-v,--version}'[display version information]' \
7+ '1: :->cmds' \
8+ '*:: :->args' && ret=0
9+
10+case $state in
11+ cmds)
12+ _values "bundle command" \
13+ "install[Install the gems specified by the Gemfile or Gemfile.lock]" \
14+ "update[Update dependencies to their latest versions]" \
15+ "package[Package the .gem files required by your application]" \
16+ "exec[Execute a script in the context of the current bundle]" \
17+ "config[Specify and read configuration options for bundler]" \
18+ "check[Determine whether the requirements for your application are installed]" \
19+ "list[Show all of the gems in the current bundle]" \
20+ "show[Show the source location of a particular gem in the bundle]" \
21+ "info[Show details of a particular gem in the bundle]" \
22+ "outdated[Show all of the outdated gems in the current bundle]" \
23+ "console[Start an IRB session in the context of the current bundle]" \
24+ "open[Open an installed gem in the editor]" \
25+ "viz[Generate a visual representation of your dependencies]" \
26+ "init[Generate a simple Gemfile, placed in the current directory]" \
27+ "gem[Create a simple gem, suitable for development with bundler]" \
28+ "platform[Displays platform compatibility information]" \
29+ "clean[Cleans up unused gems in your bundler directory]" \
30+ "help[Describe available tasks or one specific task]"
31+ ret=0
32+ ;;
33+ args)
34+ case $line[1] in
35+ help)
36+ _values 'commands' \
37+ 'install' \
38+ 'update' \
39+ 'package' \
40+ 'exec' \
41+ 'config' \
42+ 'check' \
43+ 'list' \
44+ 'show' \
45+ 'outdated' \
46+ 'console' \
47+ 'open' \
48+ 'viz' \
49+ 'init' \
50+ 'gem' \
51+ 'platform' \
52+ 'help' && ret=0
53+ ;;
54+ install)
55+ _arguments \
56+ '(--no-color)--no-color[disable colorization in output]' \
57+ '(--local)--local[do not attempt to connect to rubygems.org]' \
58+ '(--quiet)--quiet[only output warnings and errors]' \
59+ '(--gemfile)--gemfile=-[use the specified gemfile instead of Gemfile]:gemfile' \
60+ '(--system)--system[install to the system location]' \
61+ '(--deployment)--deployment[install using defaults tuned for deployment environments]' \
62+ '(--frozen)--frozen[do not allow the Gemfile.lock to be updated after this install]' \
63+ '(--path)--path=-[specify a different path than the system default]:path:_files' \
64+ '(--binstubs)--binstubs=-[generate bin stubs for bundled gems to ./bin]:directory:_files' \
65+ '(--without)--without=-[exclude gems that are part of the specified named group]:groups'
66+ ret=0
67+ ;;
68+ exec)
69+ _normal && ret=0
70+ ;;
71+ clean)
72+ _arguments \
73+ '(--force)--force[forces clean even if --path is not set]' \
74+ '(--dry-run)--dry-run[only print out changes, do not actually clean gems]' \
75+ '(--no-color)--no-color[Disable colorization in output]' \
76+ '(--verbose)--verbose[Enable verbose output mode]'
77+ ret=0
78+ ;;
79+ outdated)
80+ _arguments \
81+ '(--pre)--pre[Check for newer pre-release gems]' \
82+ '(--source)--source[Check against a specific source]' \
83+ '(--local)--local[Do not attempt to fetch gems remotely and use the gem cache instead]' \
84+ '(--no-color)--no-color[Disable colorization in output]' \
85+ '(--verbose)--verbose[Enable verbose output mode]'
86+ ret=0
87+ ;;
88+ (open|show|info)
89+ _gems=( $(bundle show 2> /dev/null | sed -e '/^ \*/!d; s/^ \* \([^ ]*\) .*/\1/') )
90+ if [[ $_gems != "" ]]; then
91+ _values 'gems' $_gems && ret=0
92+ fi
93+ ;;
94+ *)
95+ _opts=( $(bundle help $line[1] | sed -e '/^ \[-/!d; s/^ \[\(-[^=]*\)=.*/\1/') )
96+ _opts+=( $(bundle help $line[1] | sed -e '/^ -/!d; s/^ \(-.\), \[\(-[^=]*\)=.*/\1 \2/') )
97+ if [[ $_opts != "" ]]; then
98+ _values 'options' $_opts && ret=0
99+ fi
100+ ;;
101+ esac
102+ ;;
103+esac
104+
105+return ret
+127-0.oh-my-zsh/plugins/bundler/bundler.plugin.zsh
@@ -0,0 +1,127 @@
1+## Aliases
2+
3+alias ba="bundle add"
4+alias bck="bundle check"
5+alias bcn="bundle clean"
6+alias be="bundle exec"
7+alias bi="bundle_install"
8+alias bl="bundle list"
9+alias bo="bundle open"
10+alias bout="bundle outdated"
11+alias bp="bundle package"
12+alias bu="bundle update"
13+
14+## Functions
15+
16+bundle_install() {
17+ # Bail out if bundler is not installed
18+ if (( ! $+commands[bundle] )); then
19+ echo "Bundler is not installed"
20+ return 1
21+ fi
22+
23+ # Bail out if not in a bundled project
24+ if ! _within-bundled-project; then
25+ echo "Can't 'bundle install' outside a bundled project"
26+ return 1
27+ fi
28+
29+ # Check the bundler version is at least 1.4.0
30+ autoload -Uz is-at-least
31+ local bundler_version=$(bundle version | cut -d' ' -f3)
32+ if ! is-at-least 1.4.0 "$bundler_version"; then
33+ bundle install "$@"
34+ return $?
35+ fi
36+
37+ # If bundler is at least 1.4.0, use all the CPU cores to bundle install
38+ if [[ "$OSTYPE" = (darwin|freebsd)* ]]; then
39+ local cores_num="$(sysctl -n hw.ncpu)"
40+ else
41+ local cores_num="$(nproc)"
42+ fi
43+ BUNDLE_JOBS="$cores_num" bundle install "$@"
44+}
45+
46+## Gem wrapper
47+
48+bundled_commands=(
49+ annotate
50+ cap
51+ capify
52+ cucumber
53+ foodcritic
54+ guard
55+ hanami
56+ irb
57+ jekyll
58+ kitchen
59+ knife
60+ middleman
61+ nanoc
62+ pry
63+ puma
64+ rackup
65+ rainbows
66+ rake
67+ rspec
68+ rubocop
69+ shotgun
70+ sidekiq
71+ spec
72+ spork
73+ spring
74+ strainer
75+ tailor
76+ taps
77+ thin
78+ thor
79+ unicorn
80+ unicorn_rails
81+)
82+
83+# Remove $UNBUNDLED_COMMANDS from the bundled_commands list
84+bundled_commands=(${bundled_commands:|UNBUNDLED_COMMANDS})
85+unset UNBUNDLED_COMMANDS
86+
87+# Add $BUNDLED_COMMANDS to the bundled_commands list
88+bundled_commands+=($BUNDLED_COMMANDS)
89+unset BUNDLED_COMMANDS
90+
91+# Check if in the root or a subdirectory of a bundled project
92+_within-bundled-project() {
93+ local check_dir="$PWD"
94+ while [[ "$check_dir" != "/" ]]; do
95+ if [[ -f "$check_dir/Gemfile" || -f "$check_dir/gems.rb" ]]; then
96+ return 0
97+ fi
98+ check_dir="${check_dir:h}"
99+ done
100+ return 1
101+}
102+
103+_run-with-bundler() {
104+ if (( ! $+commands[bundle] )) || ! _within-bundled-project; then
105+ "$@"
106+ return $?
107+ fi
108+
109+ if [[ -f "./bin/${1}" ]]; then
110+ ./bin/${^^@}
111+ else
112+ bundle exec "$@"
113+ fi
114+}
115+
116+for cmd in $bundled_commands; do
117+ # Create wrappers for bundled and unbundled execution
118+ eval "function unbundled_$cmd () { \"$cmd\" \"\$@\"; }"
119+ eval "function bundled_$cmd () { _run-with-bundler \"$cmd\" \"\$@\"; }"
120+ alias "$cmd"="bundled_$cmd"
121+
122+ # Bind completion function to wrapped gem if available
123+ if (( $+functions[_$cmd] )); then
124+ compdef "_$cmd" "bundled_$cmd"="$cmd"
125+ fi
126+done
127+unset cmd bundled_commands
+9-0.oh-my-zsh/plugins/cabal/README.md
@@ -0,0 +1,9 @@
1+# Cabal
2+
3+This plugin provides completion for [Cabal](https://www.haskell.org/cabal/), a build tool for Haskell. It
4+also provides a function `cabal_sandbox_info` that prints whether the current working directory is in a sandbox.
5+
6+To use it, add cabal to the plugins array of your zshrc file:
7+```
8+plugins=(... cabal)
9+```
+93-0.oh-my-zsh/plugins/cabal/cabal.plugin.zsh
@@ -0,0 +1,93 @@
1+function cabal_sandbox_info() {
2+ cabal_files=(*.cabal(N))
3+ if [ $#cabal_files -gt 0 ]; then
4+ if [ -f cabal.sandbox.config ]; then
5+ echo "%{$fg[green]%}sandboxed%{$reset_color%}"
6+ else
7+ echo "%{$fg[red]%}not sandboxed%{$reset_color%}"
8+ fi
9+ fi
10+}
11+
12+function _cabal_commands() {
13+ local ret=1 state
14+ _arguments ':subcommand:->subcommand' && ret=0
15+
16+ case $state in
17+ subcommand)
18+ subcommands=(
19+ "bench:Run the benchmark, if any (configure with UserHooks)"
20+ "build:Compile all targets or specific target."
21+ "check:Check the package for common mistakes"
22+ "clean:Clean up after a build"
23+ "copy:Copy the files into the install locations"
24+ "configure:Prepare to build the package"
25+ "exec:Run a command with the cabal environment"
26+ "fetch:Downloads packages for later installation"
27+ "freeze:Freeze dependencies."
28+ "get:Gets a package's source code"
29+ "haddock:Generate Haddock HTML documentation"
30+ "help:Help about commands"
31+ "hscolour:Generate HsColour colourised code, in HTML format"
32+ "info:Display detailed information about a particular package"
33+ "init:Interactively create a .cabal file"
34+ "install:Installs a list of packages"
35+ "list:List packages matching a search string"
36+ "register:Register this package with the compiler"
37+ "repl:Open an interpreter session for the given target"
38+ "report:Upload build reports to a remote server"
39+ "run:Runs the compiled executable"
40+ "sandbox:Create/modify/delete a sandbox"
41+ "sdist:Generate a source distribution file (.tar.gz)"
42+ "test:Run the test suite, if any (configure with UserHooks)"
43+ "unpack:Unpacks packages for user inspection"
44+ "update:Updates list of known packages"
45+ "upload:Uploads source packages to Hackage"
46+ )
47+ _describe -t subcommands 'cabal subcommands' subcommands && ret=0
48+ esac
49+
50+ return ret
51+}
52+
53+compdef _cabal_commands cabal
54+
55+function _cab_commands() {
56+ local ret=1 state
57+ _arguments ':subcommand:->subcommand' && ret=0
58+
59+ case $state in
60+ subcommand)
61+ subcommands=(
62+ "sync:Fetch the latest package index"
63+ "install:Install packages"
64+ "uninstall:Uninstall packages"
65+ "installed:List installed packages"
66+ "configure:Configure a cabal package"
67+ "build:Build a cabal package"
68+ "clean:Clean up a build directory"
69+ "outdated:Display outdated packages"
70+ "info:Display information of a package"
71+ "sdist:Make tar.gz for source distribution"
72+ "upload:Uploading tar.gz to HackageDB"
73+ "get:Untar a package in the current directory"
74+ "deps:Show dependencies of this package"
75+ "revdeps:Show reverse dependencies of this package"
76+ "check:Check consistency of packages"
77+ "genpaths:Generate Paths_<pkg>.hs"
78+ "search:Search available packages by package name"
79+ "add:Add a source directory"
80+ "test:Run tests"
81+ "bench:Run benchmarks"
82+ "doc:Generate manuals"
83+ "ghci:Run GHCi (with a sandbox)"
84+ "init:Initialize a sandbox"
85+ "help:Display the help message of the command"
86+ )
87+ _describe -t subcommands 'cab subcommands' subcommands && ret=0
88+ esac
89+
90+ return ret
91+}
92+
93+command -v cab >/dev/null 2>&1 && { compdef _cab_commands cab }
+15-0.oh-my-zsh/plugins/cake/README.md
@@ -0,0 +1,15 @@
1+# Cake
2+
3+This plugin provides completion for [CakePHP](https://cakephp.org/).
4+
5+To use it add cake to the plugins array in your zshrc file.
6+
7+```bash
8+plugins=(... cake)
9+```
10+
11+## Note
12+
13+This plugin generates a cache file of the cake tasks found, named `.cake_task_cache`, in the current working directory.
14+It is regenerated when the Cakefile is newer than the cache file. It is advised that you add the cake file to your
15+`.gitignore` files.
+33-0.oh-my-zsh/plugins/cake/cake.plugin.zsh
@@ -0,0 +1,33 @@
1+# Set this to 1 if you want to cache the tasks
2+_cake_cache_task_list=1
3+
4+# Cache filename
5+_cake_task_cache_file='.cake_task_cache'
6+
7+_cake_get_target_list () {
8+ cake | grep '^cake ' | sed -e "s/cake \([^ ]*\) .*/\1/" | grep -v '^$'
9+}
10+
11+_cake_does_target_list_need_generating () {
12+
13+ if [ ${_cake_cache_task_list} -eq 0 ]; then
14+ return 1;
15+ fi
16+
17+ [ ! -f ${_cake_task_cache_file} ] && return 0;
18+ [ Cakefile -nt ${_cake_task_cache_file} ] && return 0;
19+ return 1;
20+}
21+
22+_cake () {
23+ if [ -f Cakefile ]; then
24+ if _cake_does_target_list_need_generating; then
25+ _cake_get_target_list > ${_cake_task_cache_file}
26+ compadd `cat ${_cake_task_cache_file}`
27+ else
28+ compadd `_cake_get_target_list`
29+ fi
30+ fi
31+}
32+
33+compdef _cake cake
+16-0.oh-my-zsh/plugins/cakephp3/README.md
@@ -0,0 +1,16 @@
1+# cakephp3 plugin
2+
3+The plugin adds aliases and autocompletion for [cakephp3](https://book.cakephp.org/3.0/en/index.html).
4+
5+To use it, add `cakephp3` to the plugins array of your zshrc file:
6+```
7+plugins=(... cakephp3)
8+```
9+
10+## Aliases
11+
12+| Alias | Command |
13+|-----------|-------------------------------|
14+| c3 | `bin/cake` |
15+| c3cache | `bin/cake orm_cache clear` |
16+| c3migrate | `bin/cake migrations migrate` |
+38-0.oh-my-zsh/plugins/cakephp3/cakephp3.plugin.zsh
@@ -0,0 +1,38 @@
1+# CakePHP 3 basic command completion
2+_cakephp3_get_command_list () {
3+ bin/cake completion commands
4+}
5+
6+_cakephp3_get_sub_command_list () {
7+ bin/cake completion subcommands ${words[2]}
8+}
9+
10+_cakephp3_get_3rd_argument () {
11+ bin/cake ${words[2]} ${words[3]} | \grep '\-\ '| \awk '{print $2}'
12+}
13+
14+_cakephp3 () {
15+ local -a has3rdargument
16+ has3rdargument=("all" "controller" "fixture" "model" "template")
17+ if [ -f bin/cake ]; then
18+ if (( CURRENT == 2 )); then
19+ compadd $(_cakephp3_get_command_list)
20+ fi
21+ if (( CURRENT == 3 )); then
22+ compadd $(_cakephp3_get_sub_command_list)
23+ fi
24+ if (( CURRENT == 4 )); then
25+ if [[ ${has3rdargument[(i)${words[3]}]} -le ${#has3rdargument} ]]; then
26+ compadd $(_cakephp3_get_3rd_argument)
27+ fi
28+ fi
29+ fi
30+}
31+
32+compdef _cakephp3 bin/cake
33+compdef _cakephp3 cake
34+
35+#Alias
36+alias c3='bin/cake'
37+alias c3cache='bin/cake schema_cache clear'
38+alias c3migrate='bin/cake migrations migrate'
+14-0.oh-my-zsh/plugins/capistrano/README.md
@@ -0,0 +1,14 @@
1+# Capistrano
2+
3+This plugin provides completion for [Capistrano](https://capistranorb.com/).
4+
5+To use it add capistrano to the plugins array in your zshrc file.
6+
7+```bash
8+plugins=(... capistrano)
9+```
10+
11+For a working completion use the `capit` command instead of `cap`, because cap is a
12+[reserved word in zsh](http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module).
13+
14+`capit` automatically runs cap with bundler if a Gemfile is found.
+49-0.oh-my-zsh/plugins/capistrano/_capistrano
@@ -0,0 +1,49 @@
1+#compdef capit
2+#autoload
3+
4+# Added `capit` because `cap` is a reserved word. `cap` completion doesn't work.
5+# http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module
6+
7+local curcontext="$curcontext" state line ret=1
8+local -a _configs
9+
10+_arguments -C \
11+ '1: :->cmds' \
12+ '2:: :->args' && ret=0
13+
14+_cap_tasks() {
15+ if [[ -f config/deploy.rb || -f Capfile ]]; then
16+ if [[ ! -f .cap_tasks~ ]]; then
17+ capit --tasks | sed 's/\(\[\)\(.*\)\(\]\)/\2:/' | awk '{command=$2; $1=$2=$3=""; gsub(/^[ \t\r\n]+/, "", $0); gsub(":", "\\:", command); print command"["$0"]"}' > .cap_tasks~
18+ fi
19+
20+ OLD_IFS=$IFS
21+ IFS=$'\n'
22+ _values 'cap commands' $(< .cap_tasks~)
23+ IFS=$OLD_IFS
24+ # zmodload zsh/mapfile
25+ # _values ${(f)mapfile[.cap_tasks~]}
26+ fi
27+}
28+
29+_cap_stages() {
30+ compadd $(find config/deploy -name \*.rb | cut -d/ -f3 | sed s:.rb::g)
31+}
32+
33+case $state in
34+ cmds)
35+ # check if it uses multistage
36+ if [[ -d config/deploy ]]; then
37+ _cap_stages
38+ else
39+ _cap_tasks
40+ fi
41+ ret=0
42+ ;;
43+ args)
44+ _cap_tasks
45+ ret=0
46+ ;;
47+esac
48+
49+return ret
+11-0.oh-my-zsh/plugins/capistrano/capistrano.plugin.zsh
@@ -0,0 +1,11 @@
1+# Added `capit` because `cap` is a reserved word. `cap` completion doesn't work.
2+# http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module
3+
4+function capit() {
5+ if [ -f Gemfile ]
6+ then
7+ bundle exec cap $*
8+ else
9+ cap $*
10+ fi
11+}
+15-0.oh-my-zsh/plugins/cask/README.md
@@ -0,0 +1,15 @@
1+# Cask plugin
2+
3+[Cask](https://github.com/cask/cask) is a project management tool for Emacs that helps
4+automate the package development cycle; development, dependencies, testing, building,
5+packaging and more.
6+
7+This plugin loads `cask` completion from non-standard locations, such as if installed
8+via Homebrew or others. To enable it, add `cask` to your plugins array:
9+
10+```zsh
11+plugins=(... cask)
12+```
13+
14+Make sure you have the `cask` directory in your `$PATH` before loading Oh My Zsh,
15+otherwise you'll get a "command not found" error.
+26-0.oh-my-zsh/plugins/cask/cask.plugin.zsh
@@ -0,0 +1,26 @@
1+() {
2+ emulate -L zsh
3+
4+ if ! (( $+commands[cask] )); then
5+ print "zsh cask plugin: cask command not found" >&2
6+ return
7+ fi
8+
9+ cask_base=${commands[cask]:h:h}
10+
11+ # Plain cask installation location (for Cask 0.7.2 and earlier)
12+ comp_files=($cask_base/etc/cask_completion.zsh)
13+
14+ # Mac Homebrew installs the completion in a different location
15+ if (( $+commands[brew] )); then
16+ comp_files+=($(brew --prefix)/share/zsh/site-functions/cask_completion.zsh)
17+ fi
18+
19+ # Load first found file
20+ for f in $comp_files; do
21+ if [[ -f "$f" ]]; then
22+ source "$f"
23+ break
24+ fi
25+ done
26+}
+24-0.oh-my-zsh/plugins/catimg/README.md
@@ -0,0 +1,24 @@
1+# catimg
2+
3+Plugin for displaying images on the terminal using the `catimg.sh` script provided by
4+[posva](https://github.com/posva/catimg)
5+
6+To use it, add `catimg` to the plugins array in your zshrc file:
7+
8+```zsh
9+plugins=(... catimg)
10+```
11+
12+## Requirements
13+
14+- `magick convert` (ImageMagick)
15+
16+## Functions
17+
18+| Function | Description |
19+| -------- | ---------------------------------------- |
20+| `catimg` | Displays the given image on the terminal |
21+
22+## Usage examples
23+
24+[![asciicast](https://asciinema.org/a/204702.png)](https://asciinema.org/a/204702)
+19-0.oh-my-zsh/plugins/catimg/catimg.plugin.zsh
@@ -0,0 +1,19 @@
1+################################################################################
2+# catimg script by Eduardo San Martin Morote aka Posva #
3+# https://posva.net #
4+# #
5+# Output the content of an image to the stdout using the 256 colors of the #
6+# terminal. #
7+# GitHub: https://github.com/posva/catimg #
8+################################################################################
9+
10+
11+function catimg() {
12+ if (( $+commands[magick] )); then
13+ CONVERT_CMD="magick" zsh $ZSH/plugins/catimg/catimg.sh $@
14+ elif (( $+commands[convert] )); then
15+ CONVERT_CMD="convert" zsh $ZSH/plugins/catimg/catimg.sh $@
16+ else
17+ echo "catimg need magick/convert (ImageMagick) to work)"
18+ fi
19+}
+92-0.oh-my-zsh/plugins/catimg/catimg.sh
@@ -0,0 +1,92 @@
1+################################################################################
2+# catimg script by Eduardo San Martin Morote aka Posva #
3+# https://posva.net #
4+# #
5+# Output the content of an image to the stdout using the 256 colors of the #
6+# terminal. #
7+# GitHub: https://github.com/posva/catimg #
8+################################################################################
9+
10+# this should come from outside, either `magick` or `convert`
11+# from imagemagick v7 and ahead `convert` is deprecated
12+: ${CONVERT_CMD:=convert}
13+
14+function help() {
15+ echo "Usage catimg [-h] [-w width] [-c char] img"
16+ echo "By default char is \" \" and w is the terminal width"
17+}
18+
19+# VARIABLES
20+COLOR_FILE=$(dirname $0)/colors.png
21+CHAR=" "
22+
23+WIDTH=""
24+IMG=""
25+
26+while getopts qw:c:h opt; do
27+ case "$opt" in
28+ w) WIDTH="$OPTARG" ;;
29+ c) CHAR="$OPTARG" ;;
30+ h) help; exit ;;
31+ *) help ; exit 1;;
32+ esac
33+ done
34+
35+while [ "$1" ]; do
36+ IMG="$1"
37+ shift
38+done
39+
40+if [ "$IMG" = "" -o ! -f "$IMG" ]; then
41+ help
42+ exit 1
43+fi
44+
45+if [ ! "$WIDTH" ]; then
46+ COLS=$(expr $(tput cols) "/" $(echo -n "$CHAR" | wc -c))
47+else
48+ COLS=$(expr $WIDTH "/" $(echo -n "$CHAR" | wc -c))
49+fi
50+WIDTH=$($CONVERT_CMD "$IMG" -print "%w\n" /dev/null)
51+if [ "$WIDTH" -gt "$COLS" ]; then
52+ WIDTH=$COLS
53+fi
54+
55+REMAP=""
56+if $CONVERT_CMD "$IMG" -resize $COLS\> +dither -remap $COLOR_FILE /dev/null ; then
57+ REMAP="-remap $COLOR_FILE"
58+else
59+ echo "The version of convert is too old, don't expect good results :(" >&2
60+ # $CONVERT_CMD "$IMG" -colors 256 PNG8:tmp.png
61+ # IMG="tmp.png"
62+fi
63+
64+# Display the image
65+I=0
66+$CONVERT_CMD "$IMG" -resize $COLS\> +dither `echo $REMAP` txt:- 2>/dev/null |
67+sed -e 's/.*none.*/NO NO NO/g' -e '1d;s/^.*(\(.*\)[,)].*$/\1/g;y/,/ /' |
68+while read R G B f; do
69+ if [ ! "$R" = "NO" ]; then
70+ if [ "$R" -eq "$G" -a "$G" -eq "$B" ]; then
71+ ((
72+ I++,
73+ IDX = 232 + R * 23 / 255
74+ ))
75+ else
76+ ((
77+ I++,
78+ IDX = 16
79+ + R * 5 / 255 * 36
80+ + G * 5 / 255 * 6
81+ + B * 5 / 255
82+ ))
83+ fi
84+ #echo "$R,$G,$B: $IDX"
85+ echo -ne "\e[48;5;${IDX}m${CHAR}"
86+ else
87+ (( I++ ))
88+ echo -ne "\e[0m${CHAR}"
89+ fi
90+ # New lines
91+ (( $I % $WIDTH )) || echo -e "\e[0m"
92+done
+0-0.oh-my-zsh/plugins/catimg/colors.png

Binary file changed.

+9-0.oh-my-zsh/plugins/celery/README.md
@@ -0,0 +1,9 @@
1+# Celery
2+
3+This plugin provides completion for [Celery](http://www.celeryproject.org/).
4+
5+To use it add celery to the plugins array in your zshrc file.
6+
7+```bash
8+plugins=(... celery)
9+```
+129-0.oh-my-zsh/plugins/celery/_celery
@@ -0,0 +1,129 @@
1+#compdef celery
2+#autoload
3+
4+#celery zsh completion
5+
6+_celery () {
7+local -a _1st_arguments ifargs dopts controlargs
8+
9+typeset -A opt_args
10+
11+_1st_arguments=('worker' 'events' 'beat' 'shell' 'multi' 'amqp' 'status' 'inspect' \
12+ 'control' 'purge' 'list' 'migrate' 'call' 'result' 'report')
13+ifargs=('--app=' '--broker=' '--loader=' '--config=' '--version')
14+dopts=('--detach' '--umask=' '--gid=' '--uid=' '--pidfile=' '--logfile=' '--loglevel=')
15+controlargs=('--timeout' '--destination')
16+_arguments \
17+ '(-A --app=)'{-A,--app}'[app instance to use (e.g. module.attr_name):APP]' \
18+ '(-b --broker=)'{-b,--broker}'[url to broker. default is "amqp://guest@localhost//":BROKER]' \
19+ '(--loader)--loader[name of custom loader class to use.:LOADER]' \
20+ '(--config)--config[Name of the configuration module:CONFIG]' \
21+ '(--workdir)--workdir[Optional directory to change to after detaching.:WORKING_DIRECTORY]' \
22+ '(-q --quiet)'{-q,--quiet}'[Don"t show as much output.]' \
23+ '(-C --no-color)'{-C,--no-color}'[Don"t display colors.]' \
24+ '(--version)--version[show program"s version number and exit]' \
25+ '(- : *)'{-h,--help}'[show this help message and exit]' \
26+ '*:: :->subcmds' && return 0
27+
28+if (( CURRENT == 1 )); then
29+ _describe -t commands "celery subcommand" _1st_arguments
30+ return
31+fi
32+
33+case "$words[1]" in
34+ worker)
35+ _arguments \
36+ '(-C --concurrency=)'{-C,--concurrency=}'[Number of child processes processing the queue. The default is the number of CPUs.]' \
37+ '(--pool)--pool=:::(processes eventlet gevent threads solo)' \
38+ '(--purge --discard)'{--discard,--purge}'[Purges all waiting tasks before the daemon is started.]' \
39+ '(-f --logfile=)'{-f,--logfile=}'[Path to log file. If no logfile is specified, stderr is used.]' \
40+ '(--loglevel=)--loglevel=:::(critical error warning info debug)' \
41+ '(-N --hostname=)'{-N,--hostname=}'[Set custom hostname, e.g. "foo.example.com".]' \
42+ '(-B --beat)'{-B,--beat}'[Also run the celerybeat periodic task scheduler.]' \
43+ '(-s --schedule=)'{-s,--schedule=}'[Path to the schedule database if running with the -B option. Defaults to celerybeat-schedule.]' \
44+ '(-S --statedb=)'{-S,--statedb=}'[Path to the state database.Default: None]' \
45+ '(-E --events)'{-E,--events}'[Send events that can be captured by monitors like celeryev, celerymon, and others.]' \
46+ '(--time-limit=)--time-limit=[nables a hard time limit (in seconds int/float) for tasks]' \
47+ '(--soft-time-limit=)--soft-time-limit=[Enables a soft time limit (in seconds int/float) for tasks]' \
48+ '(--maxtasksperchild=)--maxtasksperchild=[Maximum number of tasks a pool worker can execute before it"s terminated and replaced by a new worker.]' \
49+ '(-Q --queues=)'{-Q,--queues=}'[List of queues to enable for this worker, separated by comma. By default all configured queues are enabled.]' \
50+ '(-I --include=)'{-I,--include=}'[Comma separated list of additional modules to import.]' \
51+ '(--pidfile=)--pidfile=[Optional file used to store the process pid.]' \
52+ '(--autoscale=)--autoscale=[Enable autoscaling by providing max_concurrency, min_concurrency.]' \
53+ '(--autoreload)--autoreload[Enable autoreloading.]' \
54+ '(--no-execv)--no-execv[Don"t do execv after multiprocessing child fork.]'
55+ compadd -a ifargs
56+ ;;
57+ inspect)
58+ _values -s \
59+ 'active[dump active tasks (being processed)]' \
60+ 'active_queues[dump queues being consumed from]' \
61+ 'ping[ping worker(s)]' \
62+ 'registered[dump of registered tasks]' \
63+ 'report[get bugreport info]' \
64+ 'reserved[dump reserved tasks (waiting to be processed)]' \
65+ 'revoked[dump of revoked task ids]' \
66+ 'scheduled[dump scheduled tasks (eta/countdown/retry)]' \
67+ 'stats[dump worker statistics]'
68+ compadd -a controlargs ifargs
69+ ;;
70+ control)
71+ _values -s \
72+ 'add_consumer[tell worker(s) to start consuming a queue]' \
73+ 'autoscale[change autoscale settings]' \
74+ 'cancel_consumer[tell worker(s) to stop consuming a queue]' \
75+ 'disable_events[tell worker(s) to disable events]' \
76+ 'enable_events[tell worker(s) to enable events]' \
77+ 'pool_grow[start more pool processes]' \
78+ 'pool_shrink[use less pool processes]' \
79+ 'rate_limit[tell worker(s) to modify the rate limit for a task type]' \
80+ 'time_limit[tell worker(s) to modify the time limit for a task type.]'
81+ compadd -a controlargs ifargs
82+ ;;
83+ multi)
84+ _values -s \
85+ '--nosplash[Don"t display program info.]' \
86+ '--verbose[Show more output.]' \
87+ '--no-color[Don"t display colors.]' \
88+ '--quiet[Don"t show as much output.]' \
89+ 'start' 'restart' 'stopwait' 'stop' 'show' \
90+ 'names' 'expand' 'get' 'kill'
91+ compadd -a ifargs
92+ ;;
93+ amqp)
94+ _values -s \
95+ 'queue.declare' 'queue.purge' 'exchange.delete' 'basic.publish' \
96+ 'exchange.declare' 'queue.delete' 'queue.bind' 'basic.get'
97+ ;;
98+ list)
99+ _values -s, 'bindings'
100+ ;;
101+ shell)
102+ _values -s \
103+ '--ipython[force iPython.]' \
104+ '--bpython[force bpython.]' \
105+ '--python[force default Python shell.]' \
106+ '--without-tasks[don"t add tasks to locals.]' \
107+ '--eventlet[use eventlet.]' \
108+ '--gevent[use gevent.]'
109+ compadd -a ifargs
110+ ;;
111+ beat)
112+ _arguments \
113+ '(-s --schedule=)'{-s,--schedule=}'[Path to the schedule database. Defaults to celerybeat-schedule.]' \
114+ '(-S --scheduler=)'{-S,--scheduler=}'[Scheduler class to use. Default is celery.beat.PersistentScheduler.]' \
115+ '(--max-interval)--max-interval[]'
116+ compadd -a dopts fargs
117+ ;;
118+ events)
119+ _arguments \
120+ '(-d --dump)'{-d,--dump}'[Dump events to stdout.]' \
121+ '(-c --camera=)'{-c,--camera=}'[Take snapshots of events using this camera.]' \
122+ '(-F --frequency=)'{-F,--frequency=}'[Camera: Shutter frequency. Default is every 1.0 seconds.]' \
123+ '(-r --maxrate=)'{-r,--maxrate=}'[Camera: Optional shutter rate limit (e.g. 10/m).]'
124+ compadd -a dopts fargs
125+ ;;
126+ *)
127+ ;;
128+ esac
129+}
+9-0.oh-my-zsh/plugins/charm/README.md
@@ -0,0 +1,9 @@
1+# Charm plugin
2+
3+This plugin adds completion for the [charm](https://github.com/charmbracelet/charm) CLI.
4+
5+To use it, add `charm` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... charm)
9+```
+14-0.oh-my-zsh/plugins/charm/charm.plugin.zsh
@@ -0,0 +1,14 @@
1+# Autocompletion for the Charm CLI (charm).
2+if (( ! $+commands[charm] )); then
3+ return
4+fi
5+
6+# If the completion file doesn't exist yet, we need to autoload it and
7+# bind it to `charm`. Otherwise, compinit will have already done that.
8+if [[ ! -f "$ZSH_CACHE_DIR/completions/_charm" ]]; then
9+ typeset -g -A _comps
10+ autoload -Uz _charm
11+ _comps[charm]=_charm
12+fi
13+
14+charm completion zsh >| "$ZSH_CACHE_DIR/completions/_charm" &|
+11-0.oh-my-zsh/plugins/chezmoi/README.md
@@ -0,0 +1,11 @@
1+# chezmoi Plugin
2+
3+## Introduction
4+
5+This `chezmoi` plugin sets up completion for [chezmoi](https://chezmoi.io).
6+
7+To use it, add `chezmoi` to the plugins array of your zshrc file:
8+
9+```bash
10+plugins=(... chezmoi)
11+```
+14-0.oh-my-zsh/plugins/chezmoi/chezmoi.plugin.zsh
@@ -0,0 +1,14 @@
1+# COMPLETION FUNCTION
2+if (( ! $+commands[chezmoi] )); then
3+ return
4+fi
5+
6+# If the completion file doesn't exist yet, we need to autoload it and
7+# bind it to `chezmoi`. Otherwise, compinit will have already done that.
8+if [[ ! -f "$ZSH_CACHE_DIR/completions/_chezmoi" ]]; then
9+ typeset -g -A _comps
10+ autoload -Uz _chezmoi
11+ _comps[chezmoi]=_chezmoi
12+fi
13+
14+chezmoi completion zsh >| "$ZSH_CACHE_DIR/completions/_chezmoi" &|
+21-0.oh-my-zsh/plugins/chruby/README.md
@@ -0,0 +1,21 @@
1+# chruby plugin
2+
3+This plugin loads [chruby](https://github.com/postmodern/chruby), a tool that changes the
4+current Ruby version, and completion and a prompt function to display the Ruby version.
5+Supports brew and manual installation of chruby.
6+
7+To use it, add `chruby` to the plugins array in your zshrc file:
8+
9+```zsh
10+plugins=(... chruby)
11+```
12+
13+## Usage
14+
15+If you'd prefer to specify an explicit path to load chruby from
16+you can set variables like so:
17+
18+```zsh
19+zstyle :omz:plugins:chruby path /local/path/to/chruby.sh
20+zstyle :omz:plugins:chruby auto /local/path/to/auto.sh
21+```
+96-0.oh-my-zsh/plugins/chruby/chruby.plugin.zsh
@@ -0,0 +1,96 @@
1+## load chruby from different locations
2+
3+_source-from-omz-settings() {
4+ local _chruby_path _chruby_auto
5+
6+ zstyle -s :omz:plugins:chruby path _chruby_path || return 1
7+ zstyle -s :omz:plugins:chruby auto _chruby_auto || return 1
8+
9+ if [[ -r ${_chruby_path} ]]; then
10+ source ${_chruby_path}
11+ fi
12+
13+ if [[ -r ${_chruby_auto} ]]; then
14+ source ${_chruby_auto}
15+ fi
16+}
17+
18+_source-from-homebrew() {
19+ (( $+commands[brew] )) || return 1
20+
21+ local _brew_prefix
22+ # check default brew prefix
23+ if [[ -h /usr/local/opt/chruby ]];then
24+ _brew_prefix="/usr/local/opt/chruby"
25+ elif [[ -h /opt/homebrew/opt/chruby ]]; then
26+ _brew_prefix="/opt/homebrew/opt/chruby"
27+ else
28+ # ok , it is not default prefix
29+ # this call to brew is expensive ( about 400 ms ), so at least let's make it only once
30+ _brew_prefix=$(brew --prefix chruby)
31+ fi
32+
33+ [[ -r "$_brew_prefix" ]] || return 1
34+
35+ source $_brew_prefix/share/chruby/chruby.sh
36+ source $_brew_prefix/share/chruby/auto.sh
37+}
38+
39+_load-chruby-dirs() {
40+ local dir
41+ for dir in "$HOME/.rubies" "$PREFIX/opt/rubies"; do
42+ if [[ -d "$dir" ]]; then
43+ RUBIES+=("$dir")
44+ fi
45+ done
46+}
47+
48+# Load chruby
49+if _source-from-omz-settings; then
50+ _load-chruby-dirs
51+elif [[ -r "/usr/local/share/chruby/chruby.sh" ]] ; then
52+ source /usr/local/share/chruby/chruby.sh
53+ source /usr/local/share/chruby/auto.sh
54+ _load-chruby-dirs
55+elif _source-from-homebrew; then
56+ _load-chruby-dirs
57+fi
58+
59+unfunction _source-from-homebrew _source-from-omz-settings _load-chruby-dirs
60+
61+
62+## chruby utility functions and aliases
63+
64+# rvm and rbenv plugins also provide this alias
65+alias rubies='chruby'
66+
67+function current_ruby() {
68+ local ruby
69+ ruby="$(chruby | grep \* | tr -d '* ')"
70+ if [[ $(chruby | grep -c \*) -eq 1 ]]; then
71+ echo ${ruby}
72+ else
73+ echo "system"
74+ fi
75+}
76+
77+function chruby_prompt_info() {
78+ echo "${$(current_ruby):gs/%/%%}"
79+}
80+
81+# Complete chruby command with installed rubies
82+_chruby() {
83+ compadd $(chruby | tr -d '* ')
84+ if PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" command ruby &>/dev/null; then
85+ compadd system
86+ fi
87+}
88+
89+compdef _chruby chruby
90+
91+
92+# Simple definition completer for ruby-build
93+if command ruby-build &> /dev/null; then
94+ _ruby-build() { compadd $(ruby-build --definitions) }
95+ compdef _ruby-build ruby-build
96+fi
+1-0.oh-my-zsh/plugins/chucknorris/.gitignore
@@ -0,0 +1 @@
1+fortunes/chucknorris.dat
+45-0.oh-my-zsh/plugins/chucknorris/README.md
@@ -0,0 +1,45 @@
1+# chucknorris
2+
3+Fortunes plugin for Chuck Norris for Oh My Zsh. Perfectly suitable as MOTD.
4+
5+To use it add `chucknorris` to the plugins array in you zshrc file.
6+
7+```zsh
8+plugins=(... chucknorris)
9+```
10+
11+## Usage
12+
13+| Command | Description |
14+| ----------- | ------------------------------- |
15+| `chuck` | Print random Chuck Norris quote |
16+| `chuck_cow` | Print quote in cowthink |
17+
18+Example: output of `chuck_cow`:
19+
20+```
21+Last login: Fri Jan 30 23:12:26 on ttys001
22+ ______________________________________
23+( When Chuck Norris plays Monopoly, it )
24+( affects the actual world economy. )
25+ --------------------------------------
26+ o ^__^
27+ o (oo)\_______
28+ (__)\ )\/\
29+ ||----w |
30+ || ||
31+```
32+
33+## Requirements
34+
35+- `fortune`
36+- `cowsay` if using `chuck_cow`
37+
38+Available via homebrew, apt, ...
39+
40+> [!NOTE]
41+> In addition to installing `fortune`, it may be necessary to run:
42+>
43+> `strfile $ZSH/plugins/chucknorris/fortunes/chucknorris\n`
44+>
45+> (include the "\n" literally) to write the fortune data to the proper directory.
+24-0.oh-my-zsh/plugins/chucknorris/chucknorris.plugin.zsh
@@ -0,0 +1,24 @@
1+() {
2+ # %x: name of file containing code being executed
3+ local fortunes_dir="${${(%):-%x}:h}/fortunes"
4+
5+ # Aliases
6+ alias chuck="fortune -a $fortunes_dir"
7+ alias chuck_cow="chuck | cowthink"
8+
9+ # Automatically generate or update Chuck's compiled fortune data file
10+ if [[ "$fortunes_dir/chucknorris" -ot "$fortunes_dir/chucknorris.dat" ]]; then
11+ return
12+ fi
13+
14+ # For some reason, Cygwin puts strfile in /usr/sbin, which is not on the path by default
15+ local strfile="${commands[strfile]:-/usr/sbin/strfile}"
16+ if [[ ! -x "$strfile" ]]; then
17+ echo "[oh-my-zsh] chucknorris depends on strfile, which is not installed" >&2
18+ echo "[oh-my-zsh] strfile is often provided as part of the 'fortune' package" >&2
19+ return
20+ fi
21+
22+ # Generate the compiled fortune data file
23+ $strfile "$fortunes_dir/chucknorris" "$fortunes_dir/chucknorris.dat" >/dev/null
24+}
+568-0.oh-my-zsh/plugins/chucknorris/fortunes/chucknorris
@@ -0,0 +1,568 @@
1+King Kong climbed the Empire State building in fear of Chuck Norris who was downstairs at the time.
2+%
3+"2012" is code for, Chuck Norris when he is pissed.
4+%
5+"The Big Chuck Norris Roundhouse-Kick Theory"
6+%
7+"The wind cries Chuck Norris"
8+%
9+"Walker Texas Ranger: The Movie 3-D" was considered by Warner Brothers; however the technology to create the visual effects will never be possible.
10+%
11+A Handicapped parking sign does not signify that this spot is for handicapped people. It is actually in fact a warning, that the spot belongs to Chuck Norris and that you will be handicapped if you park there.
12+%
13+Abraham Lincoln didn't die because he was shot, Chuck Norris roundhouse-kicked so fast his foot went back in time and killed Abraham Lincoln.
14+%
15+Achievement Unlocked: Chuck Norris of Death
16+%
17+After Chuck counted to infinity the first time, he vowed to count to infinity a second time....by counting the bodies of those previously roundhoused.
18+%
19+Aliens fear that Chuck Norris might abduct them.
20+%
21+An angry glare from Chuck Norris is known to kill on the spot.
22+%
23+Behind every successful man is Chuck Norris.
24+%
25+Beware of dogs... Dogs, beware of Chuck Norris.
26+%
27+Bruce Lee didn't defeat Chuck Norris. Chuck hit Bruce with a Delayed roundhouse kick that was so fast that Lee only felt the impact a year later!
28+%
29+CNN was originally created as the "Chuck Norris Network" to update Americans with on-the-spot ass kicking in real-time.
30+%
31+Casinos pay Chuck Norris not to play at anything or wish anyone good luck.
32+%
33+Chuck Norris - the new standard.
34+%
35+Chuck Norris CAN balance the light-switch between ON and OFF.
36+%
37+Chuck Norris CAN believe it's not butter.
38+%
39+Chuck Norris CAN spell with an I before E even after C.
40+%
41+Chuck Norris can play the theme from the Twilight Zone with his beard.
42+%
43+Chuck Norris can power solar panels. At night.
44+%
45+Chuck Norris watches "the Nat.Geo. Specials" on Discovery Channel.
46+%
47+Chuck Norris bowled a 301 after constructing another pin out of his beard hair.
48+%
49+Chuck Norris burnt a fire proof vest, UNDERWATER!
50+%
51+Chuck Norris can French kiss his elbow.
52+%
53+Chuck Norris can bake in a freezer.
54+%
55+Chuck Norris can defuse a bomb by cutting the wrong wire.
56+%
57+Chuck Norris can dig a hole in air.
58+%
59+Chuck Norris can divide by zero.
60+%
61+Chuck Norris can do a regime change with a roundhouse kick.
62+%
63+Chuck Norris can fit 10 gallons of water in a 5 gallon bucket.
64+%
65+Chuck Norris can grill a popsicle.
66+%
67+Chuck Norris can lead a horse to water AND make it drink.
68+%
69+Chuck Norris can make his own megazord "The Chuck Norris Roundhouse Kickers Ultimate Super Awesome Megazord".
70+%
71+Chuck Norris can milk an alligator.
72+%
73+Chuck Norris can play the death waltz with his chin.
74+%
75+Chuck Norris can roundhouse kick someone through a window without breaking the glass.
76+%
77+Chuck Norris can roundhouse-kick round houses into squares.
78+%
79+Chuck Norris can rub two fires together and make a stick!
80+%
81+Chuck Norris can see in 3D with just one eye.
82+%
83+Chuck Norris can slam a revolving door.
84+%
85+Chuck Norris can terminate a repeating decimal.
86+%
87+Chuck Norris can turn toast back into bread.
88+%
89+Chuck Norris can win a game of Connect Four in only three moves.
90+%
91+Chuck Norris can win in a top spinning tournament with a cube.
92+%
93+Chuck Norris can't perform Hadoukens, he IS a Hadouken.
94+%
95+Chuck Norris checks under his bed for Fedor Emelianenko because he takes Fedor to the vet regularly.
96+%
97+Chuck Norris counted to infinity - twice.
98+%
99+Chuck Norris created Heavy Metal when he was upset.
100+%
101+Chuck Norris does not get frostbite. Chuck Norris bites frost.
102+%
103+Chuck Norris does not have a cell phone because he hears everything.
104+%
105+Chuck Norris does not sleep. He waits.
106+%
107+Chuck Norris doesn't bowl strikes, he just knocks down one pin and the other nine faint.
108+%
109+Chuck Norris doesn't call the wrong number, you just answer the wrong phone.
110+%
111+Chuck Norris doesn't cheat death, he beats it fair and square.
112+%
113+Chuck Norris doesn't churn butter. He roundhouse kicks the cows and the butter comes straight out.
114+%
115+Chuck Norris doesn't eat, he just sucks the energy out of food by staring at it.
116+%
117+Chuck Norris doesn't exhale. The air runs desperately scared out of his lungs.
118+%
119+Chuck Norris doesn't go hunting.... CHUCK NORRIS GOES KILLING.
120+%
121+Chuck Norris doesn't let it go.
122+%
123+Chuck Norris doesn't like Mudkipz.
124+%
125+Chuck Norris doesn't look for fun. The fun looks for Chuck Norris.
126+%
127+Chuck Norris doesn't need a bulletproof vest. He catches them with his bare hands.
128+%
129+Chuck Norris doesn't need air, he is air.
130+%
131+Chuck Norris doesn't need sunglasses, the sun needs Chuck Norris glasses.
132+%
133+Chuck Norris doesn't need to brush his teeth, his spit acts as a bleach.
134+%
135+Chuck Norris doesn't read books. He stares them down until he gets the information he wants.
136+%
137+Chuck Norris doesn't throw up if he drinks too much. Chuck Norris throws down!
138+%
139+Chuck Norris doesn't eat salad, he eats vegetarians.
140+%
141+Chuck Norris doesn't wash his clothes, he disembowels them.
142+%
143+Chuck Norris doesn't wear a watch. HE decides what time it is.
144+%
145+Chuck Norris doesn't carry a list. He always knows what to do.
146+%
147+Chuck Norris drives an ice cream truck covered in human skulls.
148+%
149+Chuck Norris drowned a man ON LAND.
150+%
151+Chuck Norris fed the Hunger Games.
152+%
153+Chuck Norris found the hay in the needle stack.
154+%
155+Chuck Norris found the last digit of pi.
156+%
157+Chuck Norris had a knife thrown at him. The knife didn't impale him; he impaled the knife.
158+%
159+Chuck Norris has a battle cruiser AND a car.
160+%
161+Chuck Norris has killed the Dead Sea.
162+%
163+Chuck Norris has made a 148 break at snooker.
164+%
165+Chuck Norris invented Kentucky Fried Chicken's famous secret recipe, with eleven herbs and spices. But nobody ever mentions the twelfth ingredient: Fear.
166+%
167+Chuck Norris is allowed two carry-ons.
168+%
169+Chuck Norris is currently suing NBC, claiming Law and Order are trademarked names for his left and right legs.
170+%
171+Chuck Norris is currently suing any broadway theater that plays "The Nutcracker". He claims its an infringement on his "other" roundhouse kick.
172+%
173+Chuck Norris is entitled to his own facts.
174+%
175+Chuck Norris is my Homeboy.
176+%
177+Chuck Norris is so fast, he can run around the world and punch himself in the back of the head.
178+%
179+Chuck Norris is so hard, he uses diamonds as stress balls.
180+%
181+Chuck Norris is so scary, he makes sharks swim backwards away from him.
182+%
183+Chuck Norris is ten feet tall, weighs two-tons, breathes fire, and could eat a hammer and take a shotgun blast standing.
184+%
185+Chuck Norris is the ghost in paranormal activity.
186+%
187+Chuck Norris is the life of parties he doesn't attend.
188+%
189+Chuck Norris is the meaning of life. Too bad he's also the meaning of death.
190+%
191+Chuck Norris is the only man to ever defeat a brick wall in a game of tennis.
192+%
193+Chuck Norris is the only one who can tear a facebook page!
194+%
195+Chuck Norris is the reason that the world will end in 2012. He was getting bored with the Earth.
196+%
197+Chuck Norris is the reason tumbleweeds tumble.
198+%
199+Chuck Norris is the reason why Waldo is hiding.
200+%
201+Chuck Norris is waiting for Mt. St. Helens to erupt again. He's hoping the lava is hot enough to soften his beard so he can shave for the first time.
202+%
203+Chuck Norris isn't allowed at the zoo, because when he's there the animals are too terrified to come out of their cages.
204+%
205+Chuck Norris made a statue bleed.
206+%
207+Chuck Norris made the big bang just by clicking his fingers.
208+%
209+Chuck Norris never trains, because he's Chuck Norris.
210+%
211+Chuck Norris once cried just to see what it was like. The end result was the creation of life.
212+%
213+Chuck Norris once cut a knife with a stick of butter.
214+%
215+Chuck Norris once got a 200 yard punt return.
216+%
217+Chuck Norris once had a pet monkey named KING KONG.
218+%
219+Chuck Norris once had a street named after him. The name removed at once, because nobody crosses Chuck Norris, and lives.
220+%
221+Chuck Norris once had a weak moment, just to know what it felt like.
222+%
223+Chuck Norris once played Duck Duck Goose with a group of Kindergarteners. Only one kid made it to first grade.
224+%
225+Chuck Norris once proved p^~p by induction on his beard hairs.
226+%
227+Chuck Norris once punched the ground to stop an earthquake. The resulting aftershock caused the BP oil spill.
228+%
229+Chuck Norris once round-house kicked a salesman. Over the phone.
230+%
231+Chuck Norris once roundhouse kicked a football. The astronomical society now considers it a planet.
232+%
233+Chuck Norris once thought he was wrong. He was, however, mistaken.
234+%
235+Chuck Norris once walked down a street with his fists in his pockets. He was then arrested for concealing two deadly weapons.
236+%
237+Chuck Norris once won the Tour de France riding a "big wheel".
238+%
239+Chuck Norris originally appeared in the "Street Fighter II" video game, but was removed by Beta Testers because every button caused him to do a roundhouse kick. When asked bout this "glitch," Norris replied, "That's no glitch."
240+%
241+Chuck Norris owns all number 1 pencils.
242+%
243+Chuck Norris pees Adamantium.
244+%
245+Chuck Norris plays Texas Hold'Em with Zeus, every second Wednesday of the month.
246+%
247+Chuck Norris played "Got your Nose" with Voldemort and won.
248+%
249+Chuck Norris played the game of thrones and won.
250+%
251+Chuck Norris protects his bodyguards.
252+%
253+Chuck Norris rolled a 20 on a 6 sided die.
254+%
255+Chuck Norris roundhouse kicks people in the face first and asks questions later.
256+%
257+Chuck Norris sent a BBM to an iPhone.
258+%
259+Chuck Norris shops at Sam's Club, but leaves without having his receipt checked.
260+%
261+Chuck Norris splattered tiger blood and Adonis' DNA on Charlie Sheen with 1 roundhouse kick!
262+%
263+Chuck Norris started Chuck Norris.
264+%
265+Chuck Norris starts his day with 6 live chickens, two cows, three pigs, and a boiling hot cup of pure fury.
266+%
267+Chuck Norris told me to put this here.
268+%
269+Chuck Norris uses a real mouse to move the cursor, type on the keyboard, write e-mails, code entire websites, and make coffee.
270+%
271+Chuck Norris uses pepper spray to spice up his steaks.
272+%
273+Chuck Norris was heard in a soundproof room!
274+%
275+Chuck Norris was once turned down for American Idol. When Simon was questioned about it, he replied "I'm retiring after this season". I wonder why?
276+%
277+Chuck Norris was originally in Mortal Kombat, but that version was deleted because no one can beat Chuck Norris in a fight.
278+%
279+Chuck Norris was the image used for Papa Smurf.
280+%
281+Chuck Norris was the reason why the Great Wall of China was constructed. It failed miserably.
282+%
283+Chuck Norris was what Willis was talking about.
284+%
285+Chuck Norris wasn't born on his birthday.
286+%
287+Chuck Norris watched the first steps on the moon... from his summer home on Mars.
288+%
289+Chuck Norris went up the creek without a paddle... or a canoe.
290+%
291+Chuck Norris will attain statehood in 2009. His state flower will be the Magnolia.
292+%
293+Chuck Norris wins NASCAR races with all right turns.
294+%
295+Chuck Norris won a stepdance contest by standing on his hands.
296+%
297+Chuck Norris yells at drill Sergeants.
298+%
299+Chuck Norris' dog picks up after him.
300+%
301+Chuck Norris' films are factual documentaries.
302+%
303+Chuck Norris' first job was as a paperboy. There were no survivors.
304+%
305+Chuck Norris' glass is never half full or half empty. It stays full even after he takes a drink.
306+%
307+Chuck Norris' hand is the only hand that can beat a Royal Flush.
308+%
309+Chuck Norris' personal airplane is called Air Force Chuck.
310+%
311+Chuck Norris. Enough said.
312+%
313+Chuck Norris: even Naruto can't believe it.
314+%
315+Chuck Norris can make sour milk turn fresh.
316+%
317+Contrary to popular belief, Rome WAS built in a day, by Chuck Norris.
318+%
319+Contrary to popular belief, America is not a democracy, it is a Chucktatorship.
320+%
321+Contrary to popular belief, Chuck Norris, not the box jellyfish of northern Australia, is the most venomous creature on Earth.
322+%
323+Cops don't need badges in their wallets, but only a picture of Chuck Norris.
324+%
325+Crop circles are Chuck Norris' way of telling the world that sometimes corn needs to lie down.
326+%
327+Did you hear about the boy who cried Chuck Norris?
328+%
329+Dog the Bounty Hunter can't track Chuck Norris down.
330+%
331+Don't get Chuck Norris angry. Last time somebody did that, Chuck Norris made the Grand Canyon.
332+%
333+Earth's rotation is purely governed by the direction that Chuck Norris is walking.
334+%
335+Ever wonder what really happened to the dinosaurs? They all dug their own graves when they heard Chuck Norris was coming.
336+%
337+Every line in a Chuck Norris haiku is "A roundhouse kick to the face." And they all have the correct number of syllables.
338+%
339+Every phobia known to man has a phobia of Chuck Norris.
340+%
341+Every time there's an earthquake, you know Chuck Norris is hungry. The earthquake is caused by his stomach growling.
342+%
343+Evolution's driving mechanism is nature's desperate attempt to escape Chuck Norris.
344+%
345+Fear of spiders is arachnophobia. Fear of tight spaces is claustrophobia. Fear of Chuck Norris is called Logic.
346+%
347+Fool me once, shame on you. Fool Chuck Norris once and he will roundhouse you in the face.
348+%
349+Ghosts can see Chuck Norris.
350+%
351+Guns don't kill people. Chuck Norris kills people.
352+%
353+How much wood could a woodchuck chuck if a woodchuck could chuck wood? No woodchuck could chuck Chuck's wood!
354+%
355+If Chuck Norris were a calendar, every month would be named Chucktober, and every day he'd kick your ass.
356+%
357+If Chuck Norris were to get into a fight with another Chuck Norris, Chuck Norris would win.
358+%
359+If God doesn't know, Chuck does.
360+%
361+If Goliath listened to Chuck Norris, he would have won.
362+%
363+If at first you don't succeed, you're not Chuck Norris.
364+%
365+If you ask Chuck Norris what time it is, he always says, "Two seconds 'til." After you ask, "Two seconds 'til what?" he roundhouse kicks you in the face.
366+%
367+If you put in the correct cheat code in Halo 2, you can have Master Chief play without his helmet, revealing himself to be Chuck Norris.
368+%
369+If you see a man in the street who looks like Chuck Norris, but isn't, run: you don't want to be caught in the resulting roundhouse kick to his face.
370+%
371+If you spell Chuck Norris in Scrabble, you win. Forever.
372+%
373+In 1945 The US army asked if they could clone Chuck Norris. Instead he said he could sort out the Japanese.
374+%
375+In Texas, there are five sizes for fountain drinks: small, medium, large, Texas sized, and Chuck Norris sized. It is a cup made of a human skull.
376+%
377+In a rain storm Chuck Norris stays dry. Rain drops are scared to hit him.
378+%
379+In the back of the book of world records, it says "All records are held by Chuck Norris. The ones listed are in second place."
380+%
381+James Bond has a license to kill. He got it from Chuck Norris.
382+%
383+Jedis are now taught to use the "Chuck".
384+%
385+MacGyver immediately tried to make a bomb out of some Q-Tips and Gatorade, but Chuck Norris roundhouse-kicked him in the solar plexus. MacGyver promptly threw up his own heart.
386+%
387+Machiavelli said it is better to be feared than loved because he was inspired by Chuck Norris.
388+%
389+May the Force be with Chuck Norris... for its own good.
390+%
391+Merlin was Chuck Norris' assistant.
392+%
393+Most people have 23 pairs of chromosomes. Chuck Norris has 72... and they're all poisonous.
394+%
395+Note to self: Don't be the cashier to tell Chuck Norris his coupons have expired.
396+%
397+Chuck Norris' keyboard has no control key. Chuck Norris is always in control.
398+%
399+Once upon a time, Chuck Norris found himself in a town called Shit Creek. He opened a Paddle Store.
400+%
401+One glance from Chuck Norris and snow turns itself yellow.
402+%
403+One time a test cheated on Chuck Norris.
404+%
405+Only Chuck Norris can win the mind game, 'cause he never minds.
406+%
407+Only Chuck Norris is stronger than an Altoid.
408+%
409+Outer space exists because it's afraid to be on the same planet with Chuck Norris.
410+%
411+Ozzy Osbourne once accidentally bit the head off a live bat - Chuck Norris once deliberately bit the head off a live pterodactyl.
412+%
413+Pluto is actually an orbiting group of British soldiers from the American Revolution who entered space after the Chuck gave them a roundhouse kick to the face.
414+%
415+Police label anyone attacking Chuck Norris as a Code 45-11.... a suicide.
416+%
417+Remember the Soviet Union? They decided to quit after watching a DeltaForce marathon on Satellite TV.
418+%
419+Simon doesn't say... Chuck Norris says.
420+%
421+Some boots were made for walking. Some boots may walk all over you, but Chuck Norris' boots walk THROUGH you.
422+%
423+Some kids pee their name in snow. Chuck Norris pees his name in concrete.
424+%
425+Some people ask for a Kleenex when they sneeze, Chuck Norris asks for a body bag.
426+%
427+Someone once videotaped Chuck Norris getting pissed off. It was called Walker: Texas Chain Saw Massacre.
428+%
429+Staring at Chuck Norris for extended periods of time without proper eye protection will cause blindness, and possibly foot sized bruises on the face.
430+%
431+Taking Karate Lessons = $100, Buying MMA DVD's = $150, Subscribing to a UFC event = $50, Getting a Roundhouse Kick from Chuck Norris = PRICELESS.
432+%
433+That's not an eclipse. That's the sun hiding from Chuck Norris.
434+%
435+The Beatles are on iTunes because Chuck Norris bought a Mac.
436+%
437+The Earth is made up of two-thirds water and one-third Chuck Norris.
438+%
439+The Earth was almost destroyed by a 50 km wide asteroid in 1984, but Chuck Norris roundhouse kicked it into the Sun.
440+%
441+The Great Wall of China was originally created to keep Chuck Norris out. It failed miserably.
442+%
443+The Joneses are trying to keep up with Chuck Norris.
444+%
445+The Matrix Trilogy would have ended on the first movie had Keanu Reeves said, โ€œI know Chuck Norris.โ€
446+%
447+The answer to life, the universe and everything isn't 42. It's Chuck Norris.
448+%
449+The apple falls far from the tree, when Chuck's roundhouse kick is taken to the trunk.
450+%
451+The best part of waking up is not Folgers in your cup. it's knowing that Chuck Norris let you live.
452+%
453+The chief export of Chuck Norris is pain.
454+%
455+The dictionary references Chuck Norris several times, he is mentioned under Fear, Law, Order and Chucktatorship.
456+%
457+The leading causes of death in the United States are: 1. Heart Disease 2. Chuck Norris 3. Cancer.
458+%
459+The letters in Chuck Norris cannot be unscrambled.
460+%
461+The only place where the Starship Enterprise refuses to boldly go is Chuck Norris' planet... which is all of them.
462+%
463+The only reason that USA lost the 2011 world cup to Japan is because Chuck Norris wasn't there.
464+%
465+The only sure things are Death and Taxes, and when Chuck Norris goes to work for the IRS, they'll be the same thing.
466+%
467+The only way sharks will come near CN underwater is when CN is inside of a cage.
468+%
469+The only word that rhymes with orange is Chuck Norris.
470+%
471+The producers of the movie "The Last Airbender" are now in talks with Chuck Norris in Order to star him in their next sequel "The Last Skull Bender".
472+%
473+The quickest way to a man's heart is with Chuck Norris' fist.
474+%
475+The reason why Batman only comes out at night is because he's afraid he might encounter Chuck Norris in the morning and afternoon.
476+%
477+The red phone in the oval office rings directly to Chuck Norris' cell phone.
478+%
479+The show Survivor had the original premise of putting people on an island with Chuck Norris. There were no survivors, and nobody is brave enough to go to the island to retrieve the footage.
480+%
481+The square root of Chuck Norris is pain. Do not try to square Chuck Norris. The result is death.
482+%
483+The sun only rises every morning because Chuck Norris allows it to.
484+%
485+The truth hurts, doesn't it? Chuck Norris' truth kills.
486+%
487+There is no chin behind Chuck Norris' beard. There is only another fist.
488+%
489+There is no limbo, only a world that doesn't know of Chuck Norris.
490+%
491+There is no such thing as global warming. Chuck Norris was cold, so he turned the sun up.
492+%
493+There is no theory of evolution, just a list of creatures Chuck Norris has allowed to live.
494+%
495+This one time at band camp... BAM! Chuck Norris.
496+%
497+Those who ignore history, are doomed by Chuck Norris.
498+%
499+Trick me once, shame on you, trick Chuck Norris.. rest in peace.
500+%
501+Unlike Jack Bauer, Chuck Norris doesn't need bullets. A quick roundhouse to the face kills twice as fast.
502+%
503+Walker: Texas Ranger went into syndication before the first episode was shot.
504+%
505+What was going through the minds of all of Chuck Norris' victims before they died? His shoe.
506+%
507+Whatever Chuck Norris wants, it will instantly appear.
508+%
509+When Betty White gets angry, she turns into the Hulk. When Valerie Bertinelli gets mad, she turns into Chuck Norris.
510+%
511+When Chuck Norris creates a login, it tells him "password not strong enough." He types in his name and it tells him "password too strong."
512+%
513+When Chuck Norris does a pushup, he isn't lifting himself up, he's pushing the Earth down.
514+%
515+When Chuck Norris drinks water, the water automatically pasteurized.
516+%
517+When Chuck Norris goes to Vegas, he doesn't have to gamble. The casinos just give him stacks of money.
518+%
519+When Chuck Norris goes to rodeos, bulls ride him.
520+%
521+When Chuck Norris goes to the library, he looks for the Guinness book of records in the comedy section.
522+%
523+When Chuck Norris inhales helium, his voice doesn't change.
524+%
525+When Chuck Norris performs a roundhouse kick, he's actually measuring the circumference of the universe.
526+%
527+When Chuck Norris played the card game War with a friend, France surrendered.
528+%
529+When Chuck Norris pokes the Pillsbury Doughboy, it's not a laughing matter.
530+%
531+When Chuck Norris roundhouse-kicks you, he decides when you will feel the impact.
532+%
533+When Chuck Norris sends in his taxes, he sends blank forms and includes only a picture of himself, crouched and ready to attack. Chuck Norris has not had to pay taxes, ever.
534+%
535+When Chuck Norris tosses a coin, it lands on both heads and tails.
536+%
537+When God said "Let there be light!", Chuck Norris said "Only for half the day."
538+%
539+When Presidents speak, their nation listens. When Chuck Norris blinks, the whole world listens.
540+%
541+When Steven Seagal kills a ninja, he only takes its hide. When Chuck Norris kills a ninja, he uses every part.
542+%
543+When chuck Norris was in school, he made his PE teacher run laps.
544+%
545+When does Chuck Norris run out of shotgun bullets? whenever he wants to.
546+%
547+When taking the SAT, write "Chuck Norris" for every answer. You will score over 8000.
548+%
549+When the Boogeyman goes to sleep every night, he checks his closet for Chuck Norris.
550+%
551+When things go bump in the night, it's Chuck Norris
552+%
553+While visiting the Hexagon, Chuck Norris was asked to demonstrate his famous roundhouse kick. Henceforth, it has been known as the Pentagon.
554+%
555+Why didn't the chicken cross the road? Because Chuck Norris got to it first.
556+%
557+You know Chuck Norris' pet lizard, right? Last I heard, he was in the movie "Godzilla". Oh, and his pet turtle starred in "Gamera" as well.
558+%
559+http://chucknorrisfacts.com/ is built in Drupal because Chuck Norris knows a good CMS when he sees one.
560+%
561+Chuck Norris made the first Giraffe by uppercutting a horse.
562+%
563+Chuck Norris can hear sign language.
564+%
565+Chuck Norris make onions cry.
566+%
567+Chuck Norris doesn't shake hands, he makes them tremble.
568+%
+58-0.oh-my-zsh/plugins/cloudfoundry/README.md
@@ -0,0 +1,58 @@
1+# Cloudfoundry Plugin
2+
3+This plugin is intended to offer a few simple aliases for regular users of the [Cloud Foundry Cli][1]. Most are just simple aliases that will save a bit of typing. Others include mini functions and or accept parameters. Take a look at the table below for details.
4+
5+| Alias | Command | Description |
6+|----------|-----------------------------|--------------------------------------------------------------------------|
7+| cfl | `cf login` | Login to Cloud Foundry |
8+| cft | `cf target` | Target the cli at a specific Org/Space in Cloud Foundry |
9+| cfa | `cf apps` | List all applications in the current Org/Space |
10+| cfs | `cf services` | List all services in the current Org/Space |
11+| cfm | `cf marketplace` | List the services available in the Marketplace |
12+| cfp | `cf push` | Push your application code to Cloud Foundry |
13+| cfcs | `cf create-service` | Create a service based on a Marketplace offering |
14+| cfbs | `cf bind-service` | Bind an application to a service you created |
15+| cfus | `cf unbind-service` | Unbind a service from an application |
16+| cfds | `cf delete-service` | Delete a service you no longer have bound |
17+| cfup | `cf cups` | Create a "user-provided-service" |
18+| cflg | `cf logs` | Tail the logs of an application (requires <APP_NAME>) |
19+| cfr | `cf routes` | List all the routes in the current Space |
20+| cfe | `cf env` | Show the environment variables for an application (requires <APP_NAME>) |
21+| cfsh | `cf ssh` | Attach to a running container (requires an <APP_NAME> etc.) |
22+| cfsc | `cf scale` | Scale an application (requires an <APP_NAME> etc.) |
23+| cfev | `cf events` | Show the application events (requires <APP_NAME>) |
24+| cfdor | `cf delete-orphaned-routes` | Delete routes that are no longer bound to applications |
25+| cfbpk | `cf buildpacks` | List the available buildpacks |
26+| cfdm | `cf domains` | List the domains associates with this Cloud Foundry foundation |
27+| cfsp | `cf spaces` | List all the Spaces in the current Org |
28+| cfap | `cf app` | Show the details of a deployed application (requires <APP_NAME>) |
29+| cfh. | `export CF_HOME=$PWD/.cf` | Set the current directory as CF_HOME |
30+| cfh~ | `export CF_HOME=~/.cf` | Set the user's root directory as CF_HOME |
31+| cfhu | `unset CF_HOME` | Unsets CF_HOME |
32+| cfpm | `cf push -f` | Push an application using a manifest (requires <MANIFEST_FILE> location) |
33+| cflr | `cf logs --recent` | Show the recent logs (requires <APP_NAME>) |
34+| cfsrt | `cf start` | Start an application (requires <APP_NAME>) |
35+| cfstp | `cf stop` | Stop an application (requires <APP_NAME>) |
36+| cfstg | `cf restage` | Restage an application (requires <APP_NAME>) |
37+| cfdel | `cf delete` | Delete an application (requires <APP_NAME>) |
38+| cfsrtall | - | Start all apps that are currently in the "Stopped" state |
39+| cfstpall | - | Stop all apps that are currently in the "Started" state |
40+
41+For help and advice on what any of the commands does, consult the built in `cf` help functions as follows:-
42+
43+```bash
44+cf help # List the most popular and commonly used commands
45+cf help -a # Complete list of all possible commands
46+cf <COMMAND_NAME> --help # Help on a specific command including arguments and examples
47+```
48+
49+Alternatively, seek out the [online documentation][3]. And don't forget, there are loads of great [community plugins for the cf-cli][4] command line tool that can greatly extend its power and usefulness.
50+
51+## Contributors
52+
53+Contributed to `oh_my_zsh` by [benwilcock][2].
54+
55+[1]: https://docs.cloudfoundry.org/cf-cli/install-go-cli.html
56+[2]: https://github.com/benwilcock
57+[3]: https://docs.cloudfoundry.org/cf-cli/getting-started.html
58+[4]: https://plugins.cloudfoundry.org/
+34-0.oh-my-zsh/plugins/cloudfoundry/cloudfoundry.plugin.zsh
@@ -0,0 +1,34 @@
1+# Some Useful CloudFoundry Aliases & Functions
2+alias cfl="cf login"
3+alias cft="cf target"
4+alias cfa="cf apps"
5+alias cfs="cf services"
6+alias cfm="cf marketplace"
7+alias cfp="cf push"
8+alias cfcs="cf create-service"
9+alias cfbs="cf bind-service"
10+alias cfus="cf unbind-service"
11+alias cfds="cf delete-service"
12+alias cfup="cf cups"
13+alias cflg="cf logs"
14+alias cfr="cf routes"
15+alias cfe="cf env"
16+alias cfsh="cf ssh"
17+alias cfsc="cf scale"
18+alias cfev="cf events"
19+alias cfdor="cf delete-orphaned-routes"
20+alias cfbpk="cf buildpacks"
21+alias cfdm="cf domains"
22+alias cfsp="cf spaces"
23+function cfap() { cf app $1 }
24+function cfh.() { export CF_HOME=$PWD/.cf }
25+function cfh~() { export CF_HOME=~/.cf }
26+function cfhu() { unset CF_HOME }
27+function cfpm() { cf push -f $1 }
28+function cflr() { cf logs $1 --recent }
29+function cfsrt() { cf start $1 }
30+function cfstp() { cf stop $1 }
31+function cfstg() { cf restage $1 }
32+function cfdel() { cf delete $1 }
33+function cfsrtall() {cf apps | awk '/stopped/ { system("cf start " $1)}'}
34+function cfstpall() {cf apps | awk '/started/ { system("cf stop " $1)}'}
+8-0.oh-my-zsh/plugins/codeclimate/README.md
@@ -0,0 +1,8 @@
1+# codeclimate plugin
2+
3+This plugin adds autocompletion for the [`codeclimate` CLI](https://github.com/codeclimate/codeclimate).
4+
5+To use it, add `codeclimate` to the plugins array in your zshrc file:
6+```zsh
7+plugins=(... codeclimate)
8+```
+82-0.oh-my-zsh/plugins/codeclimate/_codeclimate
@@ -0,0 +1,82 @@
1+#compdef codeclimate
2+
3+_codeclimate_all_engines() {
4+ engines_all=(`codeclimate engines:list | tail -n +2 | gawk '{ print $2 }' | gawk -F: '{ print $1 }'`)
5+}
6+
7+_codeclimate_installed_engines() {
8+ _codeclimate_all_engines
9+
10+ engines_installed=()
11+
12+ if [ -e .codeclimate.yml ]
13+ then
14+ for engine in $engines_all
15+ do
16+ if grep -q $engine ".codeclimate.yml"
17+ then
18+ engines_installed+=$engine
19+ fi
20+ done
21+ fi
22+}
23+
24+_codeclimate_not_installed_engines() {
25+ _codeclimate_all_engines
26+
27+ engines_not_installed=()
28+
29+ if [ -e .codeclimate.yml ]
30+ then
31+ for engine in $engines_all
32+ do
33+ if ! grep -q $engine ".codeclimate.yml"
34+ then
35+ engines_not_installed+=$engine
36+ fi
37+ done
38+ fi
39+}
40+
41+local curcontext="$curcontext" state line ret=1
42+local expl
43+local -a engines_all engines_installed engines_not_installed
44+
45+_arguments \
46+ '1: :->cmds' \
47+ '*:: :->args' && ret=0
48+
49+case $state in
50+ cmds)
51+ _values "bundle command" \
52+ "analyze[Analyze all relevant files in the current working directory]" \
53+ "console[Start an interactive session providing access to the classes within the CLI]" \
54+ "engines\:disable[Prevents the engine from being used in this project]" \
55+ "engines\:enable[This engine will be run the next time your project is analyzed]" \
56+ "engines\:install[Compares the list of engines in your .codeclimate.yml file to those that are currently installed, then installs any missing engines]" \
57+ "engines\:list[Lists all available engines in the Code Climate Docker Hub]" \
58+ "engines\:remove[Removes an engine from your .codeclimate.yml file]" \
59+ "help[Displays a list of commands that can be passed to the Code Climate CLI]" \
60+ "init[Generates a new .codeclimate.yml file in the current working directory]" \
61+ "validate-config[Validates the .codeclimate.yml file in the current working directory]" \
62+ "version[Displays the current version of the Code Climate CLI]"
63+ ret=0
64+ ;;
65+ args)
66+ case $line[1] in
67+ engines:enable)
68+ _codeclimate_not_installed_engines
69+ _wanted engines_not_installed expl 'not installed engines' compadd -a engines_not_installed ;;
70+ engines:disable|engines:remove)
71+ _codeclimate_installed_engines
72+ _wanted engines_installed expl 'installed engines' compadd -a engines_installed ;;
73+ analyze)
74+ _arguments \
75+ '-f:Output Format:(text json)'
76+ ret=0
77+ ;;
78+ esac
79+ ;;
80+esac
81+
82+return ret
+31-0.oh-my-zsh/plugins/coffee/README.md
@@ -0,0 +1,31 @@
1+# Coffeescript Plugin
2+
3+This plugin provides aliases for quickly compiling and previewing your
4+coffeescript code.
5+
6+When writing Coffeescript it's very common to want to preview the output of a
7+certain snippet of code, either because you want to test the output or because
8+you'd like to execute it in a browser console which doesn't accept Coffeescript.
9+
10+Preview the compiled result of your coffeescript with `cf "code"` as per the
11+following:
12+
13+```zsh
14+$ cf 'if a then b else c'
15+if (a) {
16+ b;
17+} else {
18+ c;
19+}
20+```
21+
22+Also provides the following aliases:
23+
24+* **cfc:** Copies the compiled JS to your clipboard. Very useful when you want
25+ to run the code in a JS console.
26+
27+* **cfp:** Compiles from your currently copied clipboard. Useful when you want
28+ to compile large/multi-line snippets
29+
30+* **cfpc:** Paste coffeescript from clipboard, compile to JS, then copy the
31+ the result back to clipboard.
+81-0.oh-my-zsh/plugins/coffee/_coffee
@@ -0,0 +1,81 @@
1+#compdef coffee
2+# ------------------------------------------------------------------------------
3+# Copyright (c) 2011 GitHub zsh-users - https://github.com/zsh-users
4+# All rights reserved.
5+#
6+# Redistribution and use in source and binary forms, with or without
7+# modification, are permitted provided that the following conditions are met:
8+# * Redistributions of source code must retain the above copyright
9+# notice, this list of conditions and the following disclaimer.
10+# * Redistributions in binary form must reproduce the above copyright
11+# notice, this list of conditions and the following disclaimer in the
12+# documentation and/or other materials provided with the distribution.
13+# * Neither the name of the zsh-users nor the
14+# names of its contributors may be used to endorse or promote products
15+# derived from this software without specific prior written permission.
16+#
17+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20+# DISCLAIMED. IN NO EVENT SHALL ZSH-USERS BE LIABLE FOR ANY
21+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27+# ------------------------------------------------------------------------------
28+# Description
29+# -----------
30+#
31+# Completion script for Coffee.js v0.6.11 (https://coffeescript.org)
32+#
33+# ------------------------------------------------------------------------------
34+# Authors
35+# -------
36+#
37+# * Mario Fernandez (https://github.com/sirech)
38+# * Dong Weiming (https://github.com/dongweiming)
39+#
40+# ------------------------------------------------------------------------------
41+
42+local curcontext="$curcontext" state line ret=1 version
43+local -a opts
44+typeset -A opt_args
45+version=(${(f)"$(_call_program version $words[1] --version)"}) || return ret
46+version=${${(z)${version[1]}}[3]}
47+
48+autoload -Uz is-at-least
49+if ! is-at-least 1.6.3 "$version"; then
50+ opts+=('(-l --lint)'{-l,--lint}'[pipe the compiled JavaScript through JavaScript Lint]'
51+ '(-r --require)'{-r,--require}'[require a library before executing your script]:library')
52+fi
53+
54+
55+_arguments -C \
56+ '(- *)'{-h,--help}'[display this help message]' \
57+ '(- *)'{-v,--version}'[display the version number]' \
58+ $opts \
59+ '(-b --bare)'{-b,--bare}'[compile without a top-level function wrapper]' \
60+ '(-e --eval)'{-e,--eval}'[pass a string from the command line as input]:Inline Script' \
61+ '(-i --interactive)'{-i,--interactive}'[run an interactive CoffeeScript REPL]' \
62+ '(-j --join)'{-j,--join}'[concatenate the source CoffeeScript before compiling]:Destination JS file:_files -g "*.js"' \
63+ '(--nodejs)--nodejs[pass options directly to the "node" binary]' \
64+ '(-c --compile)'{-c,--compile}'[compile to JavaScript and save as .js files]' \
65+ '(-o --output)'{-o,--output}'[set the output directory for compiled JavaScript]:Output Directory:_files -/' \
66+ '(-n -t -p)'{-n,--nodes}'[print out the parse tree that the parser produces]' \
67+ '(-n -t -p)'{-p,--print}'[print out the compiled JavaScript]' \
68+ '(-n -t -p)'{-t,--tokens}'[print out the tokens that the lexer/rewriter produce]' \
69+ '(-s --stdio)'{-s,--stdio}'[listen for and compile scripts over stdio]' \
70+ '(-w --watch)'{-w,--watch}'[watch scripts for changes and rerun commands]' \
71+ '*:script or directory:_files' && ret=0
72+
73+return ret
74+
75+# Local Variables:
76+# mode: Shell-Script
77+# sh-indentation: 2
78+# indent-tabs-mode: nil
79+# sh-basic-offset: 2
80+# End:
81+# vim: ft=zsh sw=2 ts=2 et
+16-0.oh-my-zsh/plugins/coffee/coffee.plugin.zsh
@@ -0,0 +1,16 @@
1+#!/bin/zsh
2+
3+# compile a string of coffeescript and print to output
4+cf () {
5+ coffee -peb "$1"
6+}
7+# compile & copy to clipboard
8+cfc () {
9+ cf "$1" | clipcopy
10+}
11+
12+# compile from clipboard & print
13+alias cfp='cf "$(clippaste)"'
14+
15+# compile from clipboard and copy to clipboard
16+alias cfpc='cfp | clipcopy'
+1-0.oh-my-zsh/plugins/colemak/.gitignore
@@ -0,0 +1 @@
1+.less
+48-0.oh-my-zsh/plugins/colemak/README.md
@@ -0,0 +1,48 @@
1+# Colemak plugin
2+
3+This plugin remaps keys in `zsh`'s [`vi`-style navigation mode](http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Keymaps)
4+for a [Colemak](https://colemak.com/) keyboard layout, to match the QWERTY position:
5+
6+![Colemak layout on a US keyboard](https://colemak.com/wiki/images/6/6c/Colemak2.png)
7+
8+To use it, add it to the plugins array in your `~/.zshrc` file:
9+
10+```
11+plugins=(... colemak)
12+```
13+
14+You will also need to enable `vi` mode, so add another line to `~/.zshrc`:
15+```
16+bindkey -v
17+```
18+
19+Restart your shell and hit the `<ESC>` key to activate `vicmd` (navigation) mode,
20+and start navigating `zsh` with your new keybindings!
21+
22+## Key bindings for vicmd
23+
24+| Old | New | Binding | Description |
25+|------------|------------|---------------------------|----------------------------------------------------|
26+| `CTRL`+`j` | `CTRL`+`n` | accept-line | Insert new line |
27+| `j` | `n` | down-line-or-history | Move one line down or command history forwards |
28+| `k` | `e` | up-line-or-history | Move one line up or command history backwards |
29+| `l` | `i` | vi-forward-char | Move one character to the right |
30+| `n` | `k` | vi-repeat-search | Repeat command search forwards |
31+| `N` | `K` | vi-rev-repeat-search | Repeat command search backwards |
32+| `i` | `u` | vi-insert | Enter insert mode |
33+| `I` | `U` | vi-insert-bol | Move to first non-blank char and enter insert mode |
34+| `<none>` | `l` | vi-undo-change | Undo change |
35+| `J` | `N` | vi-join | Join the current line with the next one |
36+| `e` | `j` | vi-forward-word-end | Move to the end of the next word |
37+| `E` | `J` | vi-forward-blank-word-end | Move to end of the current or next word |
38+
39+## Key bindings for less
40+
41+| Keyboard shortcut | `less` key binding |
42+|-------------------|--------------------|
43+| `n` | forw-line |
44+| `e` | back-line |
45+| `k` | repeat-search |
46+| `ESC`+`k` | repeat-search-all |
47+| `K` | reverse-search |
48+| `ESC`+`K` | reverse-search-all |
+6-0.oh-my-zsh/plugins/colemak/colemak-less
@@ -0,0 +1,6 @@
1+n forw-line
2+e back-line
3+k repeat-search
4+\ek repeat-search-all
5+K reverse-search
6+\eK reverse-search-all
+38-0.oh-my-zsh/plugins/colemak/colemak.plugin.zsh
@@ -0,0 +1,38 @@
1+# ctrl-j newline
2+bindkey '^n' accept-line
3+bindkey -a '^n' accept-line
4+
5+# another rotation to match qwerty
6+bindkey -a 'n' down-line-or-history
7+bindkey -a 'e' up-line-or-history
8+bindkey -a 'i' vi-forward-char
9+
10+# make qwerty
11+bindkey -a 'k' vi-repeat-search
12+bindkey -a 'K' vi-rev-repeat-search
13+bindkey -a 'u' vi-insert
14+bindkey -a 'U' vi-insert-bol
15+bindkey -a 'l' vi-undo-change
16+bindkey -a 'N' vi-join
17+
18+# spare
19+bindkey -a 'j' vi-forward-word-end
20+bindkey -a 'J' vi-forward-blank-word-end
21+
22+# Handle $0 according to the standard:
23+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
24+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
25+0="${${(M)0:#/*}:-$PWD/$0}"
26+
27+# New less versions will read this file directly
28+export LESSKEYIN="${0:h:A}/colemak-less"
29+
30+# Only run lesskey if less version is older than v582
31+less_ver=$(less --version | awk '{print $2;exit}')
32+autoload -Uz is-at-least
33+if ! is-at-least 582 $less_ver; then
34+ # Old less versions will read this transformed file
35+ export LESSKEY="${0:h:A}/.less"
36+ lesskey -o "$LESSKEY" "$LESSKEYIN" 2>/dev/null
37+fi
38+unset less_ver
+32-0.oh-my-zsh/plugins/colored-man-pages/README.md
@@ -0,0 +1,32 @@
1+# Colored man pages plugin
2+
3+This plugin adds colors to man pages.
4+
5+To use it, add `colored-man-pages` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... colored-man-pages)
9+```
10+
11+It will also automatically colorize man pages displayed by `dman` or `debman`,
12+from [`debian-goodies`](https://packages.debian.org/stable/debian-goodies).
13+
14+You can also try to color other pages by prefixing the respective command with `colored`:
15+
16+```zsh
17+colored git help clone
18+```
19+
20+## Customization
21+
22+The plugin declares global associative array `less_termcap`, which maps termcap capabilities to escape
23+sequences for the `less` pager. This mapping can be further customized by the user after the plugin is
24+loaded. Check out sources for more.
25+
26+For example: `less_termcap[md]` maps to `LESS_TERMCAP_md` which is the escape sequence that tells `less`
27+how to print something in bold. It's currently shown in bold red, but if you want to change it, you
28+can redefine `less_termcap[md]` in your zshrc file, after OMZ is sourced:
29+
30+```zsh
31+less_termcap[md]="${fg_bold[blue]}" # this tells less to print bold text in bold blue
32+```
+54-0.oh-my-zsh/plugins/colored-man-pages/colored-man-pages.plugin.zsh
@@ -0,0 +1,54 @@
1+# Requires colors autoload.
2+# See termcap(5).
3+
4+# Set up once, and then reuse. This way it supports user overrides after the
5+# plugin is loaded.
6+typeset -AHg less_termcap
7+
8+# bold & blinking mode
9+less_termcap[mb]="${fg_bold[red]}"
10+less_termcap[md]="${fg_bold[red]}"
11+less_termcap[me]="${reset_color}"
12+# standout mode
13+less_termcap[so]="${fg_bold[yellow]}${bg[blue]}"
14+less_termcap[se]="${reset_color}"
15+# underlining
16+less_termcap[us]="${fg_bold[green]}"
17+less_termcap[ue]="${reset_color}"
18+
19+# Handle $0 according to the standard:
20+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
21+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
22+0="${${(M)0:#/*}:-$PWD/$0}"
23+
24+# Absolute path to this file's directory.
25+typeset -g __colored_man_pages_dir="${0:A:h}"
26+
27+function colored() {
28+ local -a environment
29+
30+ # Convert associative array to plain array of NAME=VALUE items.
31+ local k v
32+ for k v in "${(@kv)less_termcap}"; do
33+ environment+=( "LESS_TERMCAP_${k}=${v}" )
34+ done
35+
36+ # Prefer `less` whenever available, since we specifically configured
37+ # environment for it.
38+ environment+=( PAGER="${commands[less]:-$PAGER}" )
39+ environment+=( GROFF_NO_SGR=1 )
40+
41+ # See ./nroff script.
42+ if [[ "$OSTYPE" = solaris* ]]; then
43+ environment+=( PATH="${__colored_man_pages_dir}:$PATH" )
44+ fi
45+
46+ command env $environment "$@"
47+}
48+
49+# Colorize man and dman/debman (from debian-goodies)
50+function man \
51+ dman \
52+ debman {
53+ colored $0 "$@"
54+}
+12-0.oh-my-zsh/plugins/colored-man-pages/nroff
@@ -0,0 +1,12 @@
1+#!/bin/sh
2+
3+# The whole point of this wrapper is to replace emboldening factor -u0 with
4+# -u1 under certain circumstances on Solaris.
5+
6+if [ "$1,$2,$3" = "-u0,-Tlp,-man" ]; then
7+ shift
8+ exec /usr/bin/nroff -u1 "$@"
9+else
10+ # Some other invocation of nroff
11+ exec /usr/bin/nroff "$@"
12+fi
+56-0.oh-my-zsh/plugins/colorize/README.md
@@ -0,0 +1,56 @@
1+# colorize
2+
3+With this plugin you can syntax-highlight file contents of over 300 supported languages and other text formats.
4+
5+Colorize will highlight the content based on the filename extension. If it can't find a syntax-highlighting
6+method for a given extension, it will try to find one by looking at the file contents. If no highlight method
7+is found it will just cat the file normally, without syntax highlighting.
8+
9+## Setup
10+
11+To use it, add colorize to the plugins array of your `~/.zshrc` file:
12+```
13+plugins=(... colorize)
14+```
15+
16+## Configuration
17+
18+### Requirements
19+
20+This plugin requires that at least one of the following tools is installed:
21+
22+* [Chroma](https://github.com/alecthomas/chroma)
23+* [Pygments](https://pygments.org/download/)
24+
25+### Colorize tool
26+
27+Colorize supports `pygmentize` and `chroma` as syntax highlighter. By default colorize uses `pygmentize` unless it's not installed and `chroma` is. This can be overridden by the `ZSH_COLORIZE_TOOL` environment variable:
28+
29+```
30+ZSH_COLORIZE_TOOL=chroma
31+```
32+
33+### Styles
34+
35+Pygments offers multiple styles. By default, the `default` style is used, but you can choose another theme by setting the `ZSH_COLORIZE_STYLE` environment variable:
36+
37+```
38+ZSH_COLORIZE_STYLE="colorful"
39+```
40+
41+### Chroma Formatter Settings
42+
43+Chroma supports terminal output in 8 color, 256 color, and true-color. If you need to change the default terminal output style from the standard 8 color output, set the `ZSH_COLORIZE_CHROMA_FORMATTER` environment variable:
44+
45+```
46+ZSH_COLORIZE_CHROMA_FORMATTER=terminal256
47+```
48+
49+## Usage
50+
51+* `ccat <file> [files]`: colorize the contents of the file (or files, if more than one are provided).
52+ If no files are passed it will colorize the standard input.
53+
54+* `cless [less-options] <file> [files]`: colorize the contents of the file (or files, if more than one are provided) and open less.
55+ If no files are passed it will colorize the standard input.
56+ The LESSOPEN and LESSCLOSE will be overwritten for this to work, but only in a local scope.
+114-0.oh-my-zsh/plugins/colorize/colorize.plugin.zsh
@@ -0,0 +1,114 @@
1+# Easier alias to use the plugin
2+alias ccat="colorize_cat"
3+alias cless="colorize_less"
4+
5+# '$0:A' gets the absolute path of this file
6+ZSH_COLORIZE_PLUGIN_PATH=$0:A
7+
8+colorize_check_requirements() {
9+ local -a available_tools
10+ available_tools=("chroma" "pygmentize")
11+
12+ if [ -z "$ZSH_COLORIZE_TOOL" ]; then
13+ if (( $+commands[pygmentize] )); then
14+ ZSH_COLORIZE_TOOL="pygmentize"
15+ elif (( $+commands[chroma] )); then
16+ ZSH_COLORIZE_TOOL="chroma"
17+ else
18+ echo "Neither 'pygments' nor 'chroma' is installed!" >&2
19+ return 1
20+ fi
21+ fi
22+
23+ if [[ ${available_tools[(Ie)$ZSH_COLORIZE_TOOL]} -eq 0 ]]; then
24+ echo "ZSH_COLORIZE_TOOL '$ZSH_COLORIZE_TOOL' not recognized. Available options are 'pygmentize' and 'chroma'." >&2
25+ return 1
26+ elif ! (( $+commands[$ZSH_COLORIZE_TOOL] )); then
27+ echo "Package '$ZSH_COLORIZE_TOOL' is not installed!" >&2
28+ return 1
29+ fi
30+}
31+
32+colorize_cat() {
33+ if ! colorize_check_requirements; then
34+ return 1
35+ fi
36+
37+ # If the environment variable ZSH_COLORIZE_STYLE
38+ # is set, use that theme instead. Otherwise,
39+ # use the default.
40+ if [ -z "$ZSH_COLORIZE_STYLE" ]; then
41+ # Both pygmentize & chroma support 'emacs'
42+ ZSH_COLORIZE_STYLE="emacs"
43+ fi
44+
45+ # Use stdin if stdin is not attached to a terminal.
46+ if [ ! -t 0 ]; then
47+ if [[ "$ZSH_COLORIZE_TOOL" == "pygmentize" ]]; then
48+ pygmentize -O style="$ZSH_COLORIZE_STYLE" -g
49+ else
50+ chroma --style="$ZSH_COLORIZE_STYLE" --formatter="${ZSH_COLORIZE_CHROMA_FORMATTER:-terminal}" "$@"
51+ fi
52+ return $?
53+ fi
54+
55+ # Guess lexer from file extension, or guess it from file contents if unsuccessful.
56+ local FNAME lexer
57+ for FNAME in "$@"; do
58+ if [[ "$ZSH_COLORIZE_TOOL" == "pygmentize" ]]; then
59+ lexer=$(pygmentize -N "$FNAME")
60+ if [[ $lexer != text ]]; then
61+ pygmentize -O style="$ZSH_COLORIZE_STYLE" -l "$lexer" "$FNAME"
62+ else
63+ pygmentize -O style="$ZSH_COLORIZE_STYLE" -g "$FNAME"
64+ fi
65+ else
66+ chroma --style="$ZSH_COLORIZE_STYLE" --formatter="${ZSH_COLORIZE_CHROMA_FORMATTER:-terminal}" "$FNAME"
67+ fi
68+ done
69+}
70+
71+# The less option 'F - Forward forever; like "tail -f".' will not work in this implementation
72+# caused by the lack of the ability to follow the file within pygmentize.
73+colorize_less() {
74+ if ! colorize_check_requirements; then
75+ return 1
76+ fi
77+
78+ _cless() {
79+ # LESS="-R $LESS" enables raw ANSI colors, while maintain already set options.
80+ local LESS="-R $LESS"
81+
82+ # This variable tells less to pipe every file through the specified command
83+ # (see the man page of less INPUT PREPROCESSOR).
84+ # 'zsh -ic "colorize_cat %s 2> /dev/null"' would not work for huge files like
85+ # the ~/.zsh_history. For such files the tty of the preprocessor will be suspended.
86+ # Therefore we must source this file to make colorize_cat available in the
87+ # preprocessor without the interactive mode.
88+ # `2>/dev/null` will suppress the error for large files 'broken pipe' of the python
89+ # script pygmentize, which will show up if less has not fully "loaded the file"
90+ # (e.g. when not scrolled to the bottom) while already the next file will be displayed.
91+ local LESSOPEN="| zsh -c 'source \"$ZSH_COLORIZE_PLUGIN_PATH\"; \
92+ ZSH_COLORIZE_TOOL=$ZSH_COLORIZE_TOOL ZSH_COLORIZE_STYLE=$ZSH_COLORIZE_STYLE \
93+ colorize_cat %s 2> /dev/null'"
94+
95+ # LESSCLOSE will be set to prevent any errors by executing a user script
96+ # which assumes that his LESSOPEN has been executed.
97+ local LESSCLOSE=""
98+
99+ LESS="$LESS" LESSOPEN="$LESSOPEN" LESSCLOSE="$LESSCLOSE" command less "$@"
100+ }
101+
102+ if [ -t 0 ]; then
103+ _cless "$@"
104+ else
105+ # The input is not associated with a terminal, therefore colorize_cat will
106+ # colorize this input and pass it to less.
107+ # Less has now to decide what to use. If any files have been provided, less
108+ # will ignore the input by default, otherwise the colorized input will be used.
109+ # If files have been supplied and the input has been redirected, this will
110+ # lead to unnecessary overhead, but retains the ability to use the less options
111+ # without checking for them inside this script.
112+ colorize_cat | _cless "$@"
113+ fi
114+}
+35-0.oh-my-zsh/plugins/command-not-found/README.md
@@ -0,0 +1,35 @@
1+# command-not-found plugin
2+
3+This plugin uses the command-not-found package for zsh to provide suggested packages to be installed if a command cannot be found.
4+
5+To use it, add `command-not-found` to the plugins array of your zshrc file:
6+
7+```zsh
8+plugins=(... command-not-found)
9+```
10+
11+An example of how this plugin works in Ubuntu:
12+```
13+$ mutt
14+The program 'mutt' can be found in the following packages:
15+ * mutt
16+ * mutt-kz
17+ * mutt-patched
18+Try: sudo apt install <selected package>
19+```
20+
21+### Supported platforms
22+
23+It works out of the box with the command-not-found packages for:
24+
25+- [Ubuntu](https://www.porcheron.info/command-not-found-for-zsh/)
26+- [Debian](https://packages.debian.org/search?keywords=command-not-found)
27+- [Arch Linux](https://wiki.archlinux.org/index.php/Pkgfile#Command_not_found)
28+- [macOS (Homebrew)](https://github.com/Homebrew/homebrew-command-not-found)
29+- [Fedora](https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound)
30+- [NixOS](https://github.com/NixOS/nixpkgs/tree/master/nixos/modules/programs/command-not-found)
31+- [Termux](https://github.com/termux/command-not-found)
32+- [SUSE](https://www.unix.com/man-page/suse/1/command-not-found/)
33+- [Gentoo](https://github.com/AndrewAmmerlaan/command-not-found-gentoo/tree/main)
34+
35+You can add support for other platforms by submitting a Pull Request.
+70-0.oh-my-zsh/plugins/command-not-found/command-not-found.plugin.zsh
@@ -0,0 +1,70 @@
1+## Platforms with a built-in command-not-found handler init file
2+
3+for file (
4+ # Arch Linux. Must have pkgfile installed: https://wiki.archlinux.org/index.php/Pkgfile#Command_not_found
5+ /usr/share/doc/pkgfile/command-not-found.zsh
6+ # Homebrew: https://github.com/Homebrew/homebrew-command-not-found
7+ /opt/homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh
8+ /usr/local/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh
9+ /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh
10+); do
11+ if [[ -r "$file" ]]; then
12+ source "$file"
13+ unset file
14+ return 0
15+ fi
16+done
17+unset file
18+
19+
20+## Platforms with manual command_not_found_handler() setup
21+
22+# Debian and derivatives: https://launchpad.net/ubuntu/+source/command-not-found
23+if [[ -x /usr/lib/command-not-found || -x /usr/share/command-not-found/command-not-found ]]; then
24+ command_not_found_handler() {
25+ if [[ -x /usr/lib/command-not-found ]]; then
26+ /usr/lib/command-not-found -- "$1"
27+ return $?
28+ elif [[ -x /usr/share/command-not-found/command-not-found ]]; then
29+ /usr/share/command-not-found/command-not-found -- "$1"
30+ return $?
31+ else
32+ printf "zsh: command not found: %s\n" "$1" >&2
33+ return 127
34+ fi
35+ }
36+fi
37+
38+# Fedora: https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound
39+if [[ -x /usr/libexec/pk-command-not-found ]]; then
40+ command_not_found_handler() {
41+ if [[ -S /var/run/dbus/system_bus_socket && -x /usr/libexec/packagekitd ]]; then
42+ /usr/libexec/pk-command-not-found "$@"
43+ return $?
44+ fi
45+
46+ printf "zsh: command not found: %s\n" "$1" >&2
47+ return 127
48+ }
49+fi
50+
51+# NixOS: https://github.com/NixOS/nixpkgs/tree/master/nixos/modules/programs/command-not-found
52+if [[ -x /run/current-system/sw/bin/command-not-found ]]; then
53+ command_not_found_handler() {
54+ /run/current-system/sw/bin/command-not-found "$@"
55+ }
56+fi
57+
58+# Termux: https://github.com/termux/command-not-found
59+if [[ -x /data/data/com.termux/files/usr/libexec/termux/command-not-found ]]; then
60+ command_not_found_handler() {
61+ /data/data/com.termux/files/usr/libexec/termux/command-not-found "$1"
62+ }
63+fi
64+
65+# SUSE and derivates: https://www.unix.com/man-page/suse/1/command-not-found/
66+if [[ -x /usr/bin/command-not-found ]]; then
67+ command_not_found_handler() {
68+ /usr/bin/command-not-found "$1"
69+ }
70+fi
+130-0.oh-my-zsh/plugins/common-aliases/README.md
@@ -0,0 +1,130 @@
1+# Common Aliases Plugin
2+
3+This plugin creates helpful shortcut aliases for many commonly used commands.
4+
5+To use it add `common-aliases` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... common-aliases)
9+```
10+
11+## Aliases
12+
13+### ls command
14+
15+| Alias | Command | Description |
16+| ----- | ------------ | --------------------------------------------------------------------------- |
17+| l | `ls -lFh` | List files as a long list, show size, type, human-readable |
18+| la | `ls -lAFh` | List almost all files as a long list show size, type, human-readable |
19+| lr | `ls -tRFh` | List files recursively sorted by date, show type, human-readable |
20+| lt | `ls -ltFh` | List files as a long list sorted by date, show type, human-readable |
21+| ll | `ls -l` | List files as a long list |
22+| ldot | `ls -ld .*` | List dot files as a long list |
23+| lS | `ls -1FSsh` | List files showing only size and name sorted by size |
24+| lart | `ls -1Fcart` | List all files sorted in reverse of create/modification time (oldest first) |
25+| lrt | `ls -1Fcrt` | List files sorted in reverse of create/modification time(oldest first) |
26+| lsr | `ls -lARFh` | List all files and directories recursively |
27+| lsn | `ls -1` | List files and directories in a single column |
28+
29+### File handling
30+
31+| Alias | Command | Description |
32+| ----- | --------------------- | ------------------------------------------------------------------------------- |
33+| rm | `rm -i` | Remove a file |
34+| cp | `cp -i` | Copy a file |
35+| mv | `mv -i` | Move a file |
36+| zshrc | `${=EDITOR} ~/.zshrc` | Quickly access the ~/.zshrc file |
37+| dud | `du -d 1 -h` | Display the size of files at depth 1 in current location in human-readable form |
38+| duf\* | `du -sh` | Display the size of files in current location in human-readable form |
39+| t | `tail -f` | Shorthand for tail which outputs the last part of a file |
40+
41+\* Only if the [`duf`](https://github.com/muesli/duf) command isn't installed.
42+
43+### find and grep
44+
45+| Alias | Command | Description |
46+| ----- | -------------------------------------------------- | ------------------------------------ |
47+| fd\* | `find . -type d -name` | Find a directory with the given name |
48+| ff | `find . -type f -name` | Find a file with the given name |
49+| grep | `grep --color` | Searches for a query string |
50+| sgrep | `grep -R -n -H -C 5 --exclude-dir={.git,.svn,CVS}` | Useful for searching within files |
51+
52+\* Only if the [`fd`](https://github.com/sharkdp/fd) command isn't installed.
53+
54+### Other Aliases
55+
56+| Alias | Command | Description |
57+| -------- | ------------------ | ----------------------------------------------------------- |
58+| h | `history` | Lists all recently used commands |
59+| hgrep | `fc -El 0 \| grep` | Searches for a word in the list of previously used commands |
60+| help | `man` | Opens up the man page for a command |
61+| p | `ps -f` | Displays currently executing processes |
62+| sortnr | `sort -n -r` | Used to sort the lines of a text file |
63+| unexport | `unset` | Used to unset an environment variable |
64+
65+## Global aliases
66+
67+These aliases are expanded in any position in the command line, meaning you can use them even at the
68+end of the command you've typed. Examples:
69+
70+Quickly pipe to less:
71+
72+```zsh
73+$ ls -l /var/log L
74+# will run
75+$ ls -l /var/log | less
76+```
77+
78+Silences stderr output:
79+
80+```zsh
81+$ find . -type f NE
82+# will run
83+$ find . -type f 2>/dev/null
84+```
85+
86+| Alias | Command | Description |
87+| ----- | --------------------------- | ----------------------------------------------------------- |
88+| H | `\| head` | Pipes output to head which outputs the first part of a file |
89+| T | `\| tail` | Pipes output to tail which outputs the last part of a file |
90+| G | `\| grep` | Pipes output to grep to search for some word |
91+| L | `\| less` | Pipes output to less, useful for paging |
92+| M | `\| most` | Pipes output to more, useful for paging |
93+| LL | `2>&1 \| less` | Writes stderr to stdout and passes it to less |
94+| CA | `2>&1 \| cat -A` | Writes stderr to stdout and passes it to cat |
95+| NE | `2 > /dev/null` | Silences stderr |
96+| NUL | `> /dev/null 2>&1` | Silences both stdout and stderr |
97+| P | `2>&1\| pygmentize -l pytb` | Writes stderr to stdout and passes it to pygmentize |
98+
99+## File extension aliases
100+
101+These are special aliases that are triggered when a file name is passed as the command. For example,
102+if the pdf file extension is aliased to `acroread` (a popular Linux pdf reader), when running `file.pdf`
103+that file will be open with `acroread`.
104+
105+### Reading Docs
106+
107+| Alias | Command | Description |
108+| ----- | ---------- | ---------------------------------- |
109+| pdf | `acroread` | Opens up a document using acroread |
110+| ps | `gv` | Opens up a .ps file using gv |
111+| dvi | `xdvi` | Opens up a .dvi file using xdvi |
112+| chm | `xchm` | Opens up a .chm file using xchm |
113+| djvu | `djview` | Opens up a .djvu file using djview |
114+
115+### Listing files inside a packed file
116+
117+| Alias | Command | Description |
118+| ------ | ---------- | --------------------------------- |
119+| zip | `unzip -l` | Lists files inside a .zip file |
120+| rar | `unrar l` | Lists files inside a .rar file |
121+| tar | `tar tf` | Lists files inside a .tar file |
122+| tar.gz | `echo` | Lists files inside a .tar.gz file |
123+| ace | `unace l` | Lists files inside a .ace file |
124+
125+### Some other features
126+
127+- Opens urls in terminal using browser specified by the variable `$BROWSER`
128+- Opens C, C++, Tex and text files using editor specified by the variable `$EDITOR`
129+- Opens images using image viewer specified by the variable `$XIVIEWER`
130+- Opens videos and other media using mplayer
+90-0.oh-my-zsh/plugins/common-aliases/common-aliases.plugin.zsh
@@ -0,0 +1,90 @@
1+# Advanced Aliases.
2+# Use with caution
3+#
4+
5+# ls, the common ones I use a lot shortened for rapid fire usage
6+alias l='ls -lFh' #size,show type,human readable
7+alias la='ls -lAFh' #long list,show almost all,show type,human readable
8+alias lr='ls -tRFh' #sorted by date,recursive,show type,human readable
9+alias lt='ls -ltFh' #long list,sorted by date,show type,human readable
10+alias ll='ls -l' #long list
11+alias ldot='ls -ld .*'
12+alias lS='ls -1FSsh'
13+alias lart='ls -1Fcart'
14+alias lrt='ls -1Fcrt'
15+alias lsr='ls -lARFh' #Recursive list of files and directories
16+alias lsn='ls -1' #A column contains name of files and directories
17+
18+alias zshrc='${=EDITOR} ${ZDOTDIR:-$HOME}/.zshrc' # Quick access to the .zshrc file
19+
20+alias grep='grep --color'
21+alias sgrep='grep -R -n -H -C 5 --exclude-dir={.git,.svn,CVS} '
22+
23+alias t='tail -f'
24+
25+# Command line head / tail shortcuts
26+alias -g H='| head'
27+alias -g T='| tail'
28+alias -g G='| grep'
29+alias -g L="| less"
30+alias -g M="| most"
31+alias -g LL="2>&1 | less"
32+alias -g CA="2>&1 | cat -A"
33+alias -g NE="2> /dev/null"
34+alias -g NUL="> /dev/null 2>&1"
35+alias -g P="2>&1| pygmentize -l pytb"
36+
37+alias dud='du -d 1 -h'
38+(( $+commands[duf] )) || alias duf='du -sh *'
39+(( $+commands[fd] )) || alias fd='find . -type d -name'
40+alias ff='find . -type f -name'
41+
42+alias h='history'
43+alias hgrep="fc -El 0 | grep"
44+alias help='man'
45+alias p='ps -f'
46+alias sortnr='sort -n -r'
47+alias unexport='unset'
48+
49+alias rm='rm -i'
50+alias cp='cp -i'
51+alias mv='mv -i'
52+
53+# zsh is able to auto-do some kungfoo
54+# depends on the SUFFIX :)
55+autoload -Uz is-at-least
56+if is-at-least 4.2.0; then
57+ # open browser on urls
58+ if [[ -n "$BROWSER" ]]; then
59+ _browser_fts=(htm html de org net com at cx nl se dk)
60+ for ft in $_browser_fts; do alias -s $ft='$BROWSER'; done
61+ fi
62+
63+ _editor_fts=(cpp cxx cc c hh h inl asc txt TXT tex)
64+ for ft in $_editor_fts; do alias -s $ft='$EDITOR'; done
65+
66+ if [[ -n "$XIVIEWER" ]]; then
67+ _image_fts=(jpg jpeg png gif mng tiff tif xpm)
68+ for ft in $_image_fts; do alias -s $ft='$XIVIEWER'; done
69+ fi
70+
71+ _media_fts=(ape avi flv m4a mkv mov mp3 mpeg mpg ogg ogm rm wav webm)
72+ for ft in $_media_fts; do alias -s $ft=mplayer; done
73+
74+ #read documents
75+ alias -s pdf=acroread
76+ alias -s ps=gv
77+ alias -s dvi=xdvi
78+ alias -s chm=xchm
79+ alias -s djvu=djview
80+
81+ #list whats inside packed file
82+ alias -s zip="unzip -l"
83+ alias -s rar="unrar l"
84+ alias -s tar="tar tf"
85+ alias -s tar.gz="echo "
86+ alias -s ace="unace l"
87+fi
88+
89+# Make zsh know about hosts already accessed by SSH
90+zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%[# ]*}//,/ })'
+9-0.oh-my-zsh/plugins/compleat/README.md
@@ -0,0 +1,9 @@
1+# compleat plugin
2+
3+This plugin looks for [compleat](https://github.com/mbrubeck/compleat) and loads its completion.
4+
5+To use it, add compleat to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... compleat)
9+```
+20-0.oh-my-zsh/plugins/compleat/compleat.plugin.zsh
@@ -0,0 +1,20 @@
1+# ------------------------------------------------------------------------------
2+# FILE: compleat.plugin.zsh
3+# DESCRIPTION: oh-my-zsh plugin file.
4+# AUTHOR: Sorin Ionescu (sorin.ionescu@gmail.com)
5+# VERSION: 1.0.0
6+# ------------------------------------------------------------------------------
7+
8+if (( ${+commands[compleat]} )); then
9+ local prefix="${commands[compleat]:h:h}"
10+ local setup="${prefix}/share/compleat-1.0/compleat_setup"
11+
12+ if [[ -f "$setup" ]]; then
13+ if ! bashcompinit >/dev/null 2>&1; then
14+ autoload -U bashcompinit
15+ bashcompinit -i
16+ fi
17+
18+ source "$setup"
19+ fi
20+fi
+35-0.oh-my-zsh/plugins/composer/README.md
@@ -0,0 +1,35 @@
1+# composer
2+
3+This plugin provides completion for [composer](https://getcomposer.org/), as well as aliases
4+for frequent composer commands. It also adds Composer's global binaries to the PATH, using
5+Composer if available.
6+
7+To use it add `composer` to the plugins array in your zshrc file.
8+
9+```zsh
10+plugins=(... composer)
11+```
12+
13+Original author: Daniel Gomes <me@danielcsgomes.com>
14+
15+## Aliases
16+
17+| Alias | Command | Description |
18+| ------ | ---------------------------------- | --------------------------------------------------------------------------------------- |
19+| `c` | `composer` | Starts composer |
20+| `ccp` | `composer create-project` | Create new project from an existing package |
21+| `cdo` | `composer dump-autoload -o` | Converts PSR-0/4 autoloading to classmap for a faster autoloader (good for production) |
22+| `cdu` | `composer dump-autoload` | Updates the autoloader |
23+| `cget` | `curl -s <installer> \| php` | Installs composer in the current directory |
24+| `cgr` | `composer global require` | Allows require command to run on COMPOSER_HOME directory |
25+| `cgrm` | `composer global remove` | Allows remove command to run on COMPOSER_HOME directory |
26+| `cgu` | `composer global update` | Allows update command to run on COMPOSER_HOME directory |
27+| `ci` | `composer install` | Resolves and installs dependencies from `composer.json` |
28+| `co` | `composer outdated` | Shows a list of installed packages with available updates |
29+| `cod` | `composer outdated --direct` | Shows a list of installed packages with available updates which are direct dependencies |
30+| `cr` | `composer require` | Adds new packages to `composer.json` |
31+| `crm` | `composer remove` | Removes packages from `composer.json` |
32+| `cs` | `composer show` | Lists available packages, with optional filtering |
33+| `csu` | `composer self-update` | Updates composer to the latest version |
34+| `cu` | `composer update` | Updates composer dependencies and `composer.lock` file |
35+| `cuh` | `composer update -d <config-home>` | Updates globally installed packages |
+76-0.oh-my-zsh/plugins/composer/composer.plugin.zsh
@@ -0,0 +1,76 @@
1+## Basic Composer command completion
2+# Since Zsh 5.7, an improved composer command completion is provided
3+if ! is-at-least 5.7; then
4+ _composer () {
5+ local curcontext="$curcontext" state line
6+ typeset -A opt_args
7+ _arguments '*:: :->subcmds'
8+
9+ if (( CURRENT == 1 )) || ( (( CURRENT == 2 )) && [[ "$words[1]" = "global" ]] ); then
10+ # Command list
11+ local -a subcmds
12+ subcmds=("${(@f)"$($_comp_command1 --no-ansi 2>/dev/null | awk '
13+ /Available commands/{ r=1 }
14+ r == 1 && /^[ \t]*[a-z]+/{
15+ gsub(/^[ \t]+/, "")
16+ gsub(/ +/, ":")
17+ print $0
18+ }
19+ ')"}")
20+ _describe -t commands 'composer command' subcmds
21+ else
22+ # Required list
23+ compadd $($_comp_command1 show -s --no-ansi 2>/dev/null \
24+ | sed '1,/requires/d' \
25+ | awk 'NF > 0 && !/^requires \(dev\)/{ print $1 }')
26+ fi
27+ }
28+
29+ compdef _composer composer
30+ compdef _composer composer.phar
31+fi
32+
33+
34+## Aliases
35+alias c='composer'
36+alias ccp='composer create-project'
37+alias cdo='composer dump-autoload -o'
38+alias cdu='composer dump-autoload'
39+alias cget='curl -s https://getcomposer.org/installer | php'
40+alias cgr='composer global require'
41+alias cgrm='composer global remove'
42+alias cgu='composer global update'
43+alias ci='composer install'
44+alias co='composer outdated'
45+alias cod='composer outdated --direct'
46+alias cr='composer require'
47+alias crm='composer remove'
48+alias cs='composer show'
49+alias csu='composer self-update'
50+alias cu='composer update'
51+alias cuh='composer update --working-dir=$(composer config -g home)'
52+
53+
54+## If Composer not found, try to add known directories to $PATH
55+if (( ! $+commands[composer] )); then
56+ [[ -d "$HOME/.composer/vendor/bin" ]] && export PATH="$PATH:$HOME/.composer/vendor/bin"
57+ [[ -d "$HOME/.config/composer/vendor/bin" ]] && export PATH="$PATH:$HOME/.config/composer/vendor/bin"
58+
59+ # If still not found, don't do the rest of the script
60+ (( $+commands[composer] )) || return 0
61+fi
62+
63+
64+## Add Composer's global binaries to PATH
65+autoload -Uz _store_cache _retrieve_cache _cache_invalid
66+_retrieve_cache composer
67+
68+if [[ -z $__composer_bin_dir ]]; then
69+ __composer_bin_dir=$(composer global config bin-dir --absolute 2>/dev/null)
70+ _store_cache composer __composer_bin_dir
71+fi
72+
73+# Add Composer's global binaries to PATH
74+export PATH="$PATH:$__composer_bin_dir"
75+
76+unset __composer_bin_dir
+44-0.oh-my-zsh/plugins/conda-env/README.md
@@ -0,0 +1,44 @@
1+# conda-env
2+
3+The plugin displays information of the created virtual container of conda and allows background theming.
4+
5+To use it, add `conda-env` to the plugins array of your zshrc file:
6+```
7+plugins=(... conda-env)
8+```
9+
10+The plugin creates a `conda_prompt_info` function that you can use in your theme, which displays the
11+basename of the current `$CONDA_DEFAULT_ENV`.
12+
13+You can use this prompt function in your themes, by adding it to the `PROMPT` or `RPROMPT` variables. See [Example](#example) for more information.
14+
15+## Settings
16+
17+It uses two variables to control how the information is shown:
18+
19+- `ZSH_THEME_CONDA_PREFIX`: sets the prefix of the CONDA_DEFAULT_ENV.
20+Defaults to `[`.
21+
22+- `ZSH_THEME_CONDA_SUFFIX`: sets the suffix of the CONDA_DEFAULT_ENV.
23+Defaults to `]`.
24+
25+## Example
26+
27+```sh
28+ZSH_THEME_CONDA_PREFIX='conda:%F{green}'
29+ZSH_THEME_CONDA_SUFFIX='%f'
30+RPROMPT='$(conda_prompt_info)'
31+```
32+
33+## `CONDA_CHANGEPS1`
34+
35+This plugin also automatically sets the `CONDA_CHANGEPS1` variable to `false` to avoid conda changing the prompt
36+automatically. This has the same effect as running `conda config --set changeps1 false`.
37+
38+You can override this behavior by adding `unset CONDA_CHANGEPS1` in your `.zshrc` file, after Oh My Zsh has been
39+sourced.
40+
41+References:
42+
43+- https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#determining-your-current-environment
44+- https://conda.io/projects/conda/en/latest/user-guide/configuration/use-condarc.html#precedence
+9-0.oh-my-zsh/plugins/conda-env/conda-env.plugin.zsh
@@ -0,0 +1,9 @@
1+function conda_prompt_info(){
2+ [[ -n ${CONDA_DEFAULT_ENV} ]] || return
3+ echo "${ZSH_THEME_CONDA_PREFIX=[}${CONDA_DEFAULT_ENV:t:gs/%/%%}${ZSH_THEME_CONDA_SUFFIX=]}"
4+}
5+
6+# Has the same effect as `conda config --set changeps1 false`
7+# - https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#determining-your-current-environment
8+# - https://conda.io/projects/conda/en/latest/user-guide/configuration/use-condarc.html#precedence
9+export CONDA_CHANGEPS1=false
+37-0.oh-my-zsh/plugins/conda/README.md
@@ -0,0 +1,37 @@
1+# conda plugin
2+
3+The conda plugin provides [aliases](#aliases) for `conda`, usually installed via [anaconda](https://www.anaconda.com/) or [miniconda](https://docs.conda.io/en/latest/miniconda.html).
4+
5+To use it, add `conda` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... conda)
9+```
10+
11+## Aliases
12+
13+| Alias | Command | Description |
14+| :------- | :-------------------------------------- | :------------------------------------------------------------------------------ |
15+| `cna` | `conda activate` | Activate the specified conda environment |
16+| `cnab` | `conda activate base` | Activate the base conda environment |
17+| `cncf` | `conda env create -f` | Create a new conda environment from a YAML file |
18+| `cncn` | `conda create -y -n` | Create a new conda environment with the given name |
19+| `cnconf` | `conda config` | View or modify conda configuration |
20+| `cncp` | `conda create -y -p` | Create a new conda environment with the given prefix |
21+| `cncr` | `conda create -n` | Create new virtual environment with given name |
22+| `cncss` | `conda config --show-source` | Show the locations of conda configuration sources |
23+| `cnde` | `conda deactivate` | Deactivate the current conda environment |
24+| `cnel` | `conda env list` | List all available conda environments |
25+| `cni` | `conda install` | Install given package |
26+| `cniy` | `conda install -y` | Install given package without confirmation |
27+| `cnl` | `conda list` | List installed packages in the current environment |
28+| `cnle` | `conda list --export` | Export the list of installed packages in the current environment |
29+| `cnles` | `conda list --explicit > spec-file.txt` | Export the list of installed packages in the current environment to a spec file |
30+| `cnr` | `conda remove` | Remove given package |
31+| `cnrn` | `conda remove -y -all -n` | Remove all packages in the specified environment |
32+| `cnrp` | `conda remove -y -all -p` | Remove all packages in the specified prefix |
33+| `cnry` | `conda remove -y` | Remove given package without confirmation |
34+| `cnsr` | `conda search` | Search conda repositories for package |
35+| `cnu` | `conda update` | Update conda package manager |
36+| `cnua` | `conda update --all` | Update all installed packages |
37+| `cnuc` | `conda update conda` | Update conda package manager |
+23-0.oh-my-zsh/plugins/conda/conda.plugin.zsh
@@ -0,0 +1,23 @@
1+alias cna='conda activate'
2+alias cnab='conda activate base'
3+alias cncf='conda env create -f'
4+alias cncn='conda create -y -n'
5+alias cnconf='conda config'
6+alias cncp='conda create -y -p'
7+alias cncr='conda create -n'
8+alias cncss='conda config --show-source'
9+alias cnde='conda deactivate'
10+alias cnel='conda env list'
11+alias cni='conda install'
12+alias cniy='conda install -y'
13+alias cnl='conda list'
14+alias cnle='conda list --export'
15+alias cnles='conda list --explicit > spec-file.txt'
16+alias cnr='conda remove'
17+alias cnrn='conda remove -y --all -n'
18+alias cnrp='conda remove -y --all -p'
19+alias cnry='conda remove -y'
20+alias cnsr='conda search'
21+alias cnu='conda update'
22+alias cnua='conda update --all'
23+alias cnuc='conda update conda'
+11-0.oh-my-zsh/plugins/copybuffer/README.md
@@ -0,0 +1,11 @@
1+# `copybuffer` plugin
2+
3+This plugin adds the <kbd>ctrl-o</kbd> keyboard shortcut to copy the current text
4+in the command line to the system clipboard.
5+
6+This is useful if you type a command - and before you hit enter to execute it - want
7+to copy it maybe so you can paste it into a script, gist or whatnot.
8+
9+```zsh
10+plugins=(... copybuffer)
11+```
+16-0.oh-my-zsh/plugins/copybuffer/copybuffer.plugin.zsh
@@ -0,0 +1,16 @@
1+# copy the active line from the command line buffer
2+# onto the system clipboard
3+
4+copybuffer () {
5+ if builtin which clipcopy &>/dev/null; then
6+ printf "%s" "$BUFFER" | clipcopy
7+ else
8+ zle -M "clipcopy not found. Please make sure you have Oh My Zsh installed correctly."
9+ fi
10+}
11+
12+zle -N copybuffer
13+
14+bindkey -M emacs "^O" copybuffer
15+bindkey -M viins "^O" copybuffer
16+bindkey -M vicmd "^O" copybuffer
+11-0.oh-my-zsh/plugins/copyfile/README.md
@@ -0,0 +1,11 @@
1+# copyfile plugin
2+
3+Puts the contents of a file in your system clipboard so you can paste it anywhere.
4+
5+To use, add `copyfile` to your plugins array:
6+
7+```zsh
8+plugins=(... copyfile)
9+```
10+
11+Then you can run the command `copyfile <filename>` to copy the file named `filename`.
+7-0.oh-my-zsh/plugins/copyfile/copyfile.plugin.zsh
@@ -0,0 +1,7 @@
1+# Copies the contents of a given file to the system or X Windows clipboard
2+#
3+# copyfile <file>
4+function copyfile {
5+ emulate -L zsh
6+ clipcopy $1
7+}
+15-0.oh-my-zsh/plugins/copypath/README.md
@@ -0,0 +1,15 @@
1+# copypath plugin
2+
3+Copies the path of given directory or file to the system clipboard.
4+
5+To use it, add `copypath` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... copypath)
9+```
10+
11+## Usage
12+
13+- `copypath`: copies the absolute path of the current directory.
14+
15+- `copypath <file_or_directory>`: copies the absolute path of the given file.
+15-0.oh-my-zsh/plugins/copypath/copypath.plugin.zsh
@@ -0,0 +1,15 @@
1+# Copies the path of given directory or file to the system or X Windows clipboard.
2+# Copy current directory if no parameter.
3+function copypath {
4+ # If no argument passed, use current directory
5+ local file="${1:-.}"
6+
7+ # If argument is not an absolute path, prepend $PWD
8+ [[ $file = /* ]] || file="$PWD/$file"
9+
10+ # Copy the absolute path without resolving symlinks
11+ # If clipcopy fails, exit the function with an error
12+ print -n "${file:a}" | clipcopy || return 1
13+
14+ echo ${(%):-"%B${file:a}%b copied to clipboard."}
15+}
+32-0.oh-my-zsh/plugins/cp/README.md
@@ -0,0 +1,32 @@
1+# cp plugin
2+
3+This plugin defines a `cpv` function that uses `rsync` so that you
4+get the features and security of this command.
5+
6+To enable, add `cp` to your `plugins` array in your zshrc file:
7+
8+```zsh
9+plugins=(... cp)
10+```
11+
12+## Description
13+
14+The enabled options for rsync are:
15+
16+- `-p`: preserves permissions.
17+
18+- `-o`: preserves owner.
19+
20+* `-g`: preserves group.
21+
22+* `-b`: make a backup of the original file instead of overwriting it, if it exists.
23+
24+* `-r`: recurse directories.
25+
26+* `-hhh`: outputs numbers in human-readable format, in units of 1024 (K, M, G, T).
27+
28+* `--backup-dir="/tmp/rsync-$USERNAME"`: move backup copies to "/tmp/rsync-$USERNAME".
29+
30+* `-e /dev/null`: only work on local files (disable remote shells).
31+
32+* `--progress`: display progress.
+4-0.oh-my-zsh/plugins/cp/cp.plugin.zsh
@@ -0,0 +1,4 @@
1+cpv() {
2+ rsync -pogbr -hhh --backup-dir="/tmp/rsync-${USERNAME}" -e /dev/null --progress "$@"
3+}
4+compdef _files cpv
+9-0.oh-my-zsh/plugins/cpanm/README.md
@@ -0,0 +1,9 @@
1+# Cpanm
2+
3+This plugin provides completion for [Cpanm](https://github.com/miyagawa/cpanminus) ([docs](https://metacpan.org/pod/App::cpanminus)).
4+
5+To use it add cpanm to the plugins array in your zshrc file.
6+
7+```zsh
8+plugins=(... cpanm)
9+```
+64-0.oh-my-zsh/plugins/cpanm/_cpanm
@@ -0,0 +1,64 @@
1+#compdef cpanm
2+
3+##
4+# cpanminus Z Shell completion script
5+##
6+#
7+# Current supported cpanm version: 1.4000 (Tue Mar 8 01:00:49 PST 2011)
8+#
9+
10+local arguments curcontext="$curcontext"
11+typeset -A opt_args
12+
13+
14+arguments=(
15+
16+# Commands
17+# '(--install -i)'{--install,-i}'[Installs the modules]'
18+ '(- :)--self-upgrade[Upgrades itself]'
19+ '(- :)--info[Displays distribution info on CPAN]'
20+ '(--installdeps)--installdeps[Only install dependencies]'
21+ '(--look)--look[Download/unpack the distribution and then open the directory with your shell]'
22+ '(- :)'{--help,-h}'[Displays help information]'
23+ '(- :)'{--version,-V}'[Displays software version]'
24+
25+# Options
26+ {--force,-f}'[Force install]'
27+ {--notest,-n}'[Do not run unit tests]'
28+ {--sudo,-S}'[sudo to run install commands]'
29+ '(-v --verbose --quiet -q)'{--verbose,-v}'[Turns on chatty output]'
30+ '(-q --quiet --verbose -v)'{--quiet,-q}'[Turns off all output]'
31+ {--local-lib,-l}'[Specify the install base to install modules]'
32+ {--local-lib-contained,-L}'[Specify the install base to install all non-core modules]'
33+ '--mirror[Specify the base URL for the mirror (e.g. http://cpan.cpantesters.org/)]:URLs:_urls'
34+ '--mirror-only[Use the mirror\''s index file instead of the CPAN Meta DB]'
35+ '--prompt[Prompt when configure/build/test fails]'
36+ '--reinstall[Reinstall the distribution even if you already have the latest version installed]'
37+ '--interactive[Turn on interactive configure]'
38+
39+ '--scandeps[Scan the dependencies of given modules and output the tree in a text format]'
40+ '--format[Specify what format to display the scanned dependency tree]:scandeps format:(tree json yaml dists)'
41+
42+ '--save-dists[Specify the optional directory path to copy downloaded tarballs]'
43+# '--uninst-shadows[Uninstalls the shadow files of the distribution that you\''re installing]'
44+
45+ '--auto-cleanup[Number of days that cpanm\''s work directories expire in. Defaults to 7]'
46+ '(--no-man-pages)--man-pages[Generates man pages for executables (man1) and libraries (man3)]'
47+ '(--man-pages)--no-man-pages[Do not generate man pages]'
48+
49+
50+ # Note: Normally with "--lwp", "--wget" and "--curl" options set to true (which is the default) cpanm tries LWP,
51+ # Wget, cURL and HTTP::Tiny (in that order) and uses the first one available.
52+ # (So that the exclusions are not enabled here for the completion)
53+ '(--lwp)--lwp[Use LWP module to download stuff]'
54+ '(--wget)--wget[Use GNU Wget (if available) to download stuff]'
55+ '(--curl)--curl[Use cURL (if available) to download stuff]'
56+
57+# Other completions
58+ '*:Local directory or archive:_files -/ -g "*.(tar.gz|tgz|tar.bz2|zip)(-.)"'
59+ # '*::args: _normal' # this looks for default files (any files)
60+)
61+_arguments -s $arguments \
62+ && return 0
63+
64+return 1
+28-0.oh-my-zsh/plugins/dash/README.md
@@ -0,0 +1,28 @@
1+# Dash plugin
2+
3+This plugin adds command line functionality for [Dash](https://kapeli.com/dash),
4+an API Documentation Browser for macOS. This plugin requires Dash to be installed
5+to work.
6+
7+To use it, add `dash` to the plugins array in your zshrc file:
8+
9+```zsh
10+plugins=(... dash)
11+```
12+
13+## Usage
14+
15+- Open and switch to the dash application.
16+```
17+dash
18+```
19+
20+- Query for something in dash app: `dash query`
21+```
22+dash golang
23+```
24+
25+- You can optionally provide a keyword: `dash [keyword:]query`
26+```
27+dash python:tuple
28+```
+84-0.oh-my-zsh/plugins/dash/dash.plugin.zsh
@@ -0,0 +1,84 @@
1+# Usage: dash [keyword:]query
2+dash() { open -a Dash.app "dash://$(omz_urlencode -r $*)" }
3+compdef _dash dash
4+
5+_dash() {
6+ # No sense doing this for anything except the 2nd position and if we haven't
7+ # specified which docset to query against
8+ if [[ $CURRENT -ne 2 || "$words[2]" =~ ":" ]]; then
9+ return
10+ fi
11+
12+ local -aU docsets
13+ docsets=()
14+
15+ # Use defaults to get the array of docsets from preferences
16+ # Have to smash it into one big line so that each docset is an element of our docsets array
17+ # Only output docsets that are actually enabled
18+ local -a enabled_docsets
19+ enabled_docsets=("${(@f)$(defaults read com.kapeli.dashdoc docsets \
20+ | tr -d '\n' | grep -oE '\{.*?\}' | grep -E 'isEnabled = 1;')}")
21+
22+ local docset name keyword
23+ # Now get each docset and output each on their own line
24+ for docset in "$enabled_docsets[@]"; do
25+ keyword=''
26+ # Order of preference as explained to me by @kapeli via email
27+ for locator in keyword suggestedKeyword platform; do
28+ # Echo the docset, try to find the appropriate keyword
29+ # Strip doublequotes and colon from any keyword so that everything has the
30+ # same format when output (we'll add the colon in the completion)
31+ if [[ "$docset" =~ "$locator = ([^;]*);" ]]; then
32+ keyword="${match[1]//[\":]}"
33+ fi
34+
35+ if [[ -z "$keyword" ]]; then
36+ continue
37+ fi
38+
39+ # if we fall back to platform, we should do some checking per @kapeli
40+ if [[ "$locator" == "platform" ]]; then
41+ # Since these are the only special cases right now, let's not do the
42+ # expensive processing unless we have to
43+ if [[ "$keyword" = (python|java|qt|cocos2d) ]]; then
44+ if [[ "$docset" =~ "docsetName = ([^;]*);" ]]; then
45+ name="${match[1]//[\":]}"
46+ case "$keyword" in
47+ python)
48+ case "$name" in
49+ "Python 2") keyword="python2" ;;
50+ "Python 3") keyword="python3" ;;
51+ esac ;;
52+ java)
53+ case "$name" in
54+ "Java SE7") keyword="java7" ;;
55+ "Java SE6") keyword="java6" ;;
56+ "Java SE8") keyword="java8" ;;
57+ esac ;;
58+ qt)
59+ case "$name" in
60+ "Qt 5") keyword="qt5" ;;
61+ "Qt 4"|Qt) keyword="qt4" ;;
62+ esac ;;
63+ cocos2d)
64+ case "$name" in
65+ Cocos3D) keyword="cocos3d" ;;
66+ esac ;;
67+ esac
68+ fi
69+ fi
70+ fi
71+
72+ # Bail once we have a match
73+ break
74+ done
75+
76+ # If we have a keyword, add it to the list!
77+ if [[ -n "$keyword" ]]; then
78+ docsets+=($keyword)
79+ fi
80+ done
81+
82+ # special thanks to [arx] on #zsh for getting me sorted on this piece
83+ compadd -qS: -- "$docsets[@]"
84+}
+27-0.oh-my-zsh/plugins/dbt/README.md
@@ -0,0 +1,27 @@
1+# dbt plugin
2+
3+The `dbt plugin` adds several aliases for useful [dbt](https://docs.getdbt.com/) commands and
4+[aliases](#aliases).
5+
6+To use it, add `dbt` to the plugins array of your zshrc file:
7+
8+```zsh
9+plugins=(... dbt)
10+```
11+
12+## Aliases
13+
14+| Alias | Command | Description |
15+| ------ | ------------------------------------------------ | ---------------------------------------------------- |
16+| dbtlm | `dbt ls -s state:modified` | List modified models only |
17+| dbtrm | `dbt run -s state:modified` | Run modified models only |
18+| dbttm | `dbt test -m state:modified` | Test modified models only |
19+| dbtrtm | `dbtrm && dbttm` | Run and test modified models only |
20+| dbtrs | `dbt clean; dbt deps; dbt seed` | Re-seed data |
21+| dbtfrt | `dbtrs; dbt run --full-refresh; dbt test` | Perform a full fresh run with tests |
22+| dbtcds | `dbt docs generate; dbt docs serve` | Generate docs without compiling |
23+| dbtds | `dbt docs generate --no-compile; dbt docs serve` | Generate and serve docs skipping doc. re-compilation |
24+
25+## Maintainer
26+
27+- [msempere](https://github.com/msempere)
+23-0.oh-my-zsh/plugins/dbt/dbt.plugin.zsh
@@ -0,0 +1,23 @@
1+# list modified models only
2+alias dbtlm="dbt ls -s state:modified"
3+
4+# run modified models only
5+alias dbtrm="dbt run -s state:modified"
6+
7+# test modified models only
8+alias dbttm="dbt test -m state:modified"
9+
10+# run and test modified models only
11+alias dbtrtm="dbtrm && dbttm"
12+
13+# re-seed data
14+alias dbtrs="dbt clean; dbt deps; dbt seed"
15+
16+# perform a full fresh run with tests
17+alias dbtfrt="dbtrs; dbt run --full-refresh; dbt test"
18+
19+# generate and serve docs
20+alias dbtcds="dbt docs generate; dbt docs serve"
21+
22+# generate and serve docs skipping doc. re-compilation
23+alias dbtds="dbt docs generate --no-compile; dbt docs serve"
+92-0.oh-my-zsh/plugins/debian/README.md
@@ -0,0 +1,92 @@
1+# debian
2+
3+This plugin provides Debian-related aliases and functions for zsh.
4+
5+To use it add `debian` to the plugins array in your zshrc file.
6+
7+```zsh
8+plugins=(... debian)
9+```
10+
11+## Settings
12+
13+- `$apt_pref`: use aptitude or apt if installed, fallback is apt-get.
14+- `$apt_upgr`: use upgrade or safe-upgrade (for aptitude).
15+
16+Set **both** `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh My Zsh) to override this behavior, e.g.:
17+
18+```sh
19+apt_pref='apt'
20+apt_upgr='full-upgrade'
21+```
22+
23+## Common Aliases
24+
25+| Alias | Command | Description |
26+| ------ | ---------------------------------------------------------------------- | ---------------------------------------------------------- |
27+| `age` | `apt-get` | Command line tool for handling packages |
28+| `api` | `aptitude` | Same functionality as `apt-get`, provides extra options |
29+| `acs` | `apt-cache search` | Command line tool for searching apt software package cache |
30+| `aps` | `aptitude search` | Searches installed packages using aptitude |
31+| `as` | `aptitude -F '* %p -> %d \n(%v/%V)' --no-gui --disable-columns search` | Print searched packages using a custom format |
32+| `afs` | `apt-file search --regexp` | Search file in packages |
33+| `asrc` | `apt-get source` | Fetch source packages through `apt-get` |
34+| `app` | `apt-cache policy` | Displays priority of package sources |
35+
36+## Superuser Operations Aliases
37+
38+| Alias | Command | Description |
39+| -------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
40+| `aac` | `sudo $apt_pref autoclean` | Clears out the local repository of retrieved package files |
41+| `aar` | `sudo $apt_pref autoremove` | Removes packages installed automatically that are no longer needed |
42+| `abd` | `sudo $apt_pref build-dep` | Installs all dependencies for building packages |
43+| `ac` | `sudo $apt_pref clean` | Clears out the local repository of retrieved package files except lock files |
44+| `ad` | `sudo $apt_pref update` | Updates the package lists for upgrades for packages |
45+| `adg` | `sudo $apt_pref update && sudo $apt_pref $apt_upgr` | Update and upgrade packages |
46+| `ads` | `sudo apt-get dselect-upgrade` | Installs packages from list and removes all not in the list |
47+| `adu` | `sudo $apt_pref update && sudo $apt_pref dist-upgrade` | Smart upgrade that handles dependencies |
48+| `afu` | `sudo apt-file update` | Update the files in packages |
49+| `ai` | `sudo $apt_pref install` | Command-line tool to install package |
50+| `ail` | `sed -e 's/ */ /g' -e 's/ *//' \| cut -s -d ' ' -f 1 \| xargs sudo $apt_pref install` | Install all packages given on the command line while using only the first word of each line |
51+| `alu` | `sudo apt update && apt list -u && sudo apt upgrade` | Update, list and upgrade packages |
52+| `ap` | `sudo $apt_pref purge` | Removes packages along with configuration files |
53+| `au` | `sudo $apt_pref $apt_upgr` | Install package upgrades |
54+| `di` | `sudo dpkg -i` | Install all .deb files in the current directory |
55+| `dia` | `sudo dpkg -i ./*.deb` | Install all .deb files in the current directory |
56+| `kclean` | `sudo aptitude remove -P ?and(~i~nlinux-(ima\|hea) ?not(~n$(uname -r)))` | Remove ALL kernel images and headers EXCEPT the one in use |
57+
58+## Aliases - Commands using `su`
59+
60+| Alias | Command |
61+| ----- | --------------------------------------------------------- |
62+| `aac` | `su -ls "$apt_pref autoclean" root` |
63+| `aar` | `su -ls "$apt_pref autoremove" root` |
64+| `ac` | `su -ls "$apt_pref clean" root` |
65+| `ad` | `su -lc "$apt_pref update" root` |
66+| `adg` | `su -lc "$apt_pref update && aptitude $apt_upgr" root` |
67+| `adu` | `su -lc "$apt_pref update && aptitude dist-upgrade" root` |
68+| `afu` | `su -lc "apt-file update"` |
69+| `au` | `su -lc "$apt_pref $apt_upgr" root` |
70+| `dia` | `su -lc "dpkg -i ./*.deb" root` |
71+
72+## Miscellaneous Aliases
73+
74+| Alias | Command | Description |
75+| --------- | ---------------------------------------------- | ------------------------------ |
76+| `allpkgs` | `aptitude search -F "%p" --disable-columns ~i` | Display all installed packages |
77+| `mydeb` | `time dpkg-buildpackage -rfakeroot -us -uc` | Create a basic .deb package |
78+
79+## Functions
80+
81+| Function | Description |
82+| ------------------- | --------------------------------------------------------------- |
83+| `apt-copy` | Create a simple script that can be used to 'duplicate' a system |
84+| `apt-history` | Displays apt history for a command |
85+| `apt-list-packages` | List packages by size |
86+| `kerndeb` | Builds kernel packages |
87+
88+## Authors
89+
90+- [@AlexBio](https://github.com/AlexBio)
91+- [@dbb](https://github.com/dbb)
92+- [@Mappleconfusers](https://github.com/Mappleconfusers)
+227-0.oh-my-zsh/plugins/debian/debian.plugin.zsh
@@ -0,0 +1,227 @@
1+# Use aptitude or apt if installed, fallback is apt-get
2+# You can just set apt_pref='apt-get' to override it.
3+
4+if [[ -z $apt_pref || -z $apt_upgr ]]; then
5+ if [[ -e $commands[aptitude] ]]; then
6+ apt_pref='aptitude'
7+ apt_upgr='safe-upgrade'
8+ elif [[ -e $commands[apt] ]]; then
9+ apt_pref='apt'
10+ apt_upgr='upgrade'
11+ else
12+ apt_pref='apt-get'
13+ apt_upgr='upgrade'
14+ fi
15+fi
16+
17+# Use sudo by default if it's installed
18+if [[ -e $commands[sudo] ]]; then
19+ use_sudo=1
20+fi
21+
22+# Aliases ###################################################################
23+# These are for more obscure uses of apt-get and aptitude that aren't covered
24+# below.
25+alias age='apt-get'
26+alias api='aptitude'
27+
28+# Some self-explanatory aliases
29+alias acs="apt-cache search"
30+alias aps='aptitude search'
31+alias as="aptitude -F '* %p -> %d \n(%v/%V)' --no-gui --disable-columns search"
32+
33+# apt-file
34+alias afs='apt-file search --regexp'
35+
36+
37+# These are apt-get only
38+alias asrc='apt-get source'
39+alias app='apt-cache policy'
40+
41+# superuser operations ######################################################
42+if [[ $use_sudo -eq 1 ]]; then
43+# commands using sudo #######
44+ alias aac="sudo $apt_pref autoclean"
45+ alias abd="sudo $apt_pref build-dep"
46+ alias ac="sudo $apt_pref clean"
47+ alias ad="sudo $apt_pref update"
48+ alias adg="sudo $apt_pref update && sudo $apt_pref $apt_upgr"
49+ alias adu="sudo $apt_pref update && sudo $apt_pref dist-upgrade"
50+ alias afu="sudo apt-file update"
51+ alias au="sudo $apt_pref $apt_upgr"
52+ alias ai="sudo $apt_pref install"
53+ # Install all packages given on the command line while using only the first word of each line:
54+ # acse ... | ail
55+
56+ alias ail="sed -e 's/ */ /g' -e 's/ *//' | cut -s -d ' ' -f 1 | xargs sudo $apt_pref install"
57+ alias ap="sudo $apt_pref purge"
58+ alias aar="sudo $apt_pref autoremove"
59+
60+ # apt-get only
61+ alias ads="sudo apt-get dselect-upgrade"
62+
63+ # apt only
64+ alias alu="sudo apt update && apt list -u && sudo apt upgrade"
65+
66+ # Install all .deb files in the current directory.
67+ # Warning: you will need to put the glob in single quotes if you use:
68+ # glob_subst
69+ alias dia="sudo dpkg -i ./*.deb"
70+ alias di="sudo dpkg -i"
71+
72+ # Remove ALL kernel images and headers EXCEPT the one in use
73+ alias kclean='sudo aptitude remove -P "?and(~i~nlinux-(ima|hea) ?not(~n$(uname -r)))"'
74+
75+
76+# commands using su #########
77+else
78+ alias aac="su -ls '$apt_pref autoclean' root"
79+ function abd() {
80+ cmd="su -lc '$apt_pref build-dep $@' root"
81+ print "$cmd"
82+ eval "$cmd"
83+ }
84+ alias ac="su -ls '$apt_pref clean' root"
85+ alias ad="su -lc '$apt_pref update' root"
86+ alias adg="su -lc '$apt_pref update && $apt_pref $apt_upgr' root"
87+ alias adu="su -lc '$apt_pref update && $apt_pref dist-upgrade' root"
88+ alias afu="su -lc 'apt-file update'"
89+ alias au="su -lc '$apt_pref $apt_upgr' root"
90+ function ai() {
91+ cmd="su -lc '$apt_pref install $@' root"
92+ print "$cmd"
93+ eval "$cmd"
94+ }
95+ function ap() {
96+ cmd="su -lc '$apt_pref purge $@' root"
97+ print "$cmd"
98+ eval "$cmd"
99+ }
100+ function aar() {
101+ cmd="su -lc '$apt_pref autoremove $@' root"
102+ print "$cmd"
103+ eval "$cmd"
104+ }
105+ # Install all .deb files in the current directory
106+ # Assumes glob_subst is off
107+ alias dia='su -lc "dpkg -i ./*.deb" root'
108+ alias di='su -lc "dpkg -i" root'
109+
110+ # Remove ALL kernel images and headers EXCEPT the one in use
111+ alias kclean='su -lc "aptitude remove -P \"?and(~i~nlinux-(ima|hea) ?not(~n$(uname -r)))\"" root'
112+fi
113+
114+# Completion ################################################################
115+
116+#
117+# Registers a compdef for $1 that calls $apt_pref with the commands $2
118+# To do that it creates a new completion function called _apt_pref_$2
119+#
120+function apt_pref_compdef() {
121+ local f fb
122+ f="_apt_pref_${2}"
123+
124+ eval "function ${f}() {
125+ shift words;
126+ service=\"\$apt_pref\";
127+ words=(\"\$apt_pref\" '$2' \$words);
128+ ((CURRENT++))
129+ test \"\${apt_pref}\" = 'aptitude' && _aptitude || _apt
130+ }"
131+
132+ compdef "$f" "$1"
133+}
134+
135+apt_pref_compdef aac "autoclean"
136+apt_pref_compdef abd "build-dep"
137+apt_pref_compdef ac "clean"
138+apt_pref_compdef ad "update"
139+apt_pref_compdef afu "update"
140+apt_pref_compdef au "$apt_upgr"
141+apt_pref_compdef ai "install"
142+apt_pref_compdef ail "install"
143+apt_pref_compdef ap "purge"
144+apt_pref_compdef aar "autoremove"
145+apt_pref_compdef ads "dselect-upgrade"
146+
147+# Misc. #####################################################################
148+# print all installed packages
149+alias allpkgs='aptitude search -F "%p" --disable-columns ~i'
150+
151+# Create a basic .deb package
152+alias mydeb='time dpkg-buildpackage -rfakeroot -us -uc'
153+
154+
155+# Functions #################################################################
156+# create a simple script that can be used to 'duplicate' a system
157+function apt-copy() {
158+ print '#!/bin/sh'"\n" > apt-copy.sh
159+
160+ cmd='$apt_pref install'
161+
162+ for p in ${(f)"$(aptitude search -F "%p" --disable-columns \~i)"}; {
163+ cmd="${cmd} ${p}"
164+ }
165+
166+ print $cmd "\n" >> apt-copy.sh
167+
168+ chmod +x apt-copy.sh
169+}
170+
171+# Prints apt history
172+# Usage:
173+# apt-history install
174+# apt-history upgrade
175+# apt-history remove
176+# apt-history rollback
177+# apt-history list
178+# Based On: https://linuxcommando.blogspot.com/2008/08/how-to-show-apt-log-history.html
179+function apt-history() {
180+ case "$1" in
181+ install)
182+ zgrep --no-filename 'install ' $(ls -rt /var/log/dpkg*)
183+ ;;
184+ upgrade|remove)
185+ zgrep --no-filename $1 $(ls -rt /var/log/dpkg*)
186+ ;;
187+ rollback)
188+ zgrep --no-filename upgrade $(ls -rt /var/log/dpkg*) | \
189+ grep "$2" -A10000000 | \
190+ grep "$3" -B10000000 | \
191+ awk '{print $4"="$5}'
192+ ;;
193+ list)
194+ zgrep --no-filename '' $(ls -rt /var/log/dpkg*)
195+ ;;
196+ *)
197+ echo "Parameters:"
198+ echo " install - Lists all packages that have been installed."
199+ echo " upgrade - Lists all packages that have been upgraded."
200+ echo " remove - Lists all packages that have been removed."
201+ echo " rollback - Lists rollback information."
202+ echo " list - Lists all contains of dpkg logs."
203+ ;;
204+ esac
205+}
206+
207+# Kernel-package building shortcut
208+function kerndeb() {
209+ # temporarily unset MAKEFLAGS ( '-j3' will fail )
210+ MAKEFLAGS=$( print - $MAKEFLAGS | perl -pe 's/-j\s*[\d]+//g' )
211+ print '$MAKEFLAGS set to '"'$MAKEFLAGS'"
212+ appendage='-custom' # this shows up in $(uname -r )
213+ revision=$(date +"%Y%m%d") # this shows up in the .deb file name
214+
215+ make-kpkg clean
216+
217+ time fakeroot make-kpkg --append-to-version "$appendage" --revision \
218+ "$revision" kernel_image kernel_headers
219+}
220+
221+# List packages by size
222+function apt-list-packages() {
223+ dpkg-query -W --showformat='${Installed-Size} ${Package} ${Status}\n' | \
224+ grep -v deinstall | \
225+ sort -n | \
226+ awk '{print $1" "$2}'
227+}
+20-0.oh-my-zsh/plugins/deno/README.md
@@ -0,0 +1,20 @@
1+# Deno Plugin
2+
3+This plugin sets up completion and aliases for [Deno](https://deno.land).
4+
5+## Aliases
6+
7+| Alias | Full command |
8+| ----- | ------------------- |
9+| db | deno bundle |
10+| dc | deno compile |
11+| dca | deno cache |
12+| dfmt | deno fmt |
13+| dh | deno help |
14+| dli | deno lint |
15+| drn | deno run |
16+| drA | deno run -A |
17+| drw | deno run --watch |
18+| dru | deno run --unstable |
19+| dts | deno test |
20+| dup | deno upgrade |
+28-0.oh-my-zsh/plugins/deno/deno.plugin.zsh
@@ -0,0 +1,28 @@
1+# ALIASES
2+alias db='deno bundle'
3+alias dc='deno compile'
4+alias dca='deno cache'
5+alias dfmt='deno fmt'
6+alias dh='deno help'
7+alias dli='deno lint'
8+alias drn='deno run'
9+alias drA='deno run -A'
10+alias drw='deno run --watch'
11+alias dru='deno run --unstable'
12+alias dts='deno test'
13+alias dup='deno upgrade'
14+
15+# COMPLETION FUNCTION
16+if (( ! $+commands[deno] )); then
17+ return
18+fi
19+
20+# If the completion file doesn't exist yet, we need to autoload it and
21+# bind it to `deno`. Otherwise, compinit will have already done that.
22+if [[ ! -f "$ZSH_CACHE_DIR/completions/_deno" ]]; then
23+ typeset -g -A _comps
24+ autoload -Uz _deno
25+ _comps[deno]=_deno
26+fi
27+
28+deno completions zsh >| "$ZSH_CACHE_DIR/completions/_deno" &|
+82-0.oh-my-zsh/plugins/dircycle/README.md
@@ -0,0 +1,82 @@
1+# dircycle
2+
3+Plugin for cycling through the directory stack
4+
5+This plugin enables directory navigation similar to using back and forward on browsers or common file explorers like Finder or Nautilus. It uses a small zle trick that lets you cycle through your directory stack left or right using <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> / <kbd>Right</kbd> . This is useful when moving back and forth between directories in development environments, and can be thought of as kind of a nondestructive pushd/popd.
6+
7+## Enabling the plugin
8+
9+1. Open your `.zshrc` file and add `dircycle` in the plugins section:
10+
11+ ```zsh
12+ plugins=(
13+ # all your enabled plugins
14+ dircycle
15+ )
16+ ```
17+
18+2. Restart the shell or restart your Terminal session:
19+
20+ ```console
21+ $ exec zsh
22+ $
23+ ```
24+
25+## Usage Examples
26+
27+Say you opened these directories on the terminal:
28+
29+```console
30+~$ cd Projects
31+~/Projects$ cd Hacktoberfest
32+~/Projects/Hacktoberfest$ cd oh-my-zsh
33+~/Projects/Hacktoberfest/oh-my-zsh$ dirs -v
34+0 ~/Projects/Hacktoberfest/oh-my-zsh
35+1 ~/Projects/Hacktoberfest
36+2 ~/Projects
37+3 ~
38+```
39+
40+By pressing <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd>, the current working directory or `$PWD` will be from `oh-my-zsh` to `Hacktoberfest`. Press it again and it will be at `Projects`.
41+
42+And by pressing <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd>, the `$PWD` will be from `Projects` to `Hacktoberfest`. Press it again and it will be at `oh-my-zsh`.
43+
44+Here's a example history table with the same accessed directories like above:
45+
46+| Current `$PWD` | Key press | New `$PWD` |
47+| --------------- | ----------------------------------------------------- | --------------- |
48+| `oh-my-zsh` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> | `Hacktoberfest` |
49+| `Hacktoberfest` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> | `Projects` |
50+| `Projects` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> | `~` |
51+| `~` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `Projects` |
52+| `Projects` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `Hacktoberfest` |
53+| `Hacktoberfest` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `oh-my-zsh` |
54+| `oh-my-zsh` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `~` |
55+
56+Note the last traversal, when pressing <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> on a last known `$PWD`, it will change back to the first known `$PWD`, which in the example is `~`.
57+
58+Here's an asciinema cast demonstrating the example above:
59+
60+[![asciicast](https://asciinema.org/a/204406.png)](https://asciinema.org/a/204406)
61+
62+## Functions
63+
64+| Function | Description |
65+| -------------------- | ------------------------------------------------------------------------------------------------------------------- |
66+| `insert-cycledleft` | Change `$PWD` to the previous known stack, bound to <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> |
67+| `insert-cycledright` | Change `$PWD` to the next known stack, bound to <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> |
68+| `insert-cycledup` | Change `$PWD` to the parent folder, bound to <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Up</kbd> |
69+| `insert-cycleddown` | Change `$PWD` to the first alphabetical child folder, bound to <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Down</kbd> |
70+
71+## Rebinding keys
72+
73+You can bind these functions to other key sequences, as long as you know the bindkey sequence. For example, these commands bind to <kbd>Alt</kbd> + <kbd>Shift</kbd> + <kbd>key</kbd> in `xterm-256color`:
74+
75+```zsh
76+bindkey '^[[1;4D' insert-cycledleft
77+bindkey '^[[1;4C' insert-cycledright
78+bindkey "\e[1;4A" insert-cycledup
79+bindkey "\e[1;4B" insert-cycleddown
80+```
81+
82+You can get the bindkey sequence by pressing <kbd>Ctrl</kbd> + <kbd>V</kbd>, then pressing the keyboard shortcut you want to use.
+87-0.oh-my-zsh/plugins/dircycle/dircycle.plugin.zsh
@@ -0,0 +1,87 @@
1+# enables cycling through the directory stack using
2+# Ctrl+Shift+Left/Right
3+#
4+# left/right direction follows the order in which directories
5+# were visited, like left/right arrows do in a browser
6+
7+# NO_PUSHD_MINUS syntax:
8+# pushd +N: start counting from left of `dirs' output
9+# pushd -N: start counting from right of `dirs' output
10+
11+# Either switch to a directory from dirstack, using +N or -N syntax
12+# or switch to a directory by path, using `switch-to-dir -- <path>`
13+switch-to-dir () {
14+ # If $1 is --, then treat $2 as a directory path
15+ if [[ $1 == -- ]]; then
16+ # We use `-q` because we don't want chpwd to run, we'll do it manually
17+ [[ -d "$2" ]] && builtin pushd -q "$2" &>/dev/null
18+ return $?
19+ fi
20+
21+ setopt localoptions nopushdminus
22+ [[ ${#dirstack} -eq 0 ]] && return 1
23+
24+ while ! builtin pushd -q $1 &>/dev/null; do
25+ # We found a missing directory: pop it out of the dir stack
26+ builtin popd -q $1
27+
28+ # Stop trying if there are no more directories in the dir stack
29+ [[ ${#dirstack} -eq 0 ]] && return 1
30+ done
31+}
32+
33+insert-cycledleft () {
34+ switch-to-dir +1 || return $?
35+
36+ local fn
37+ for fn in chpwd $chpwd_functions precmd $precmd_functions; do
38+ (( $+functions[$fn] )) && $fn
39+ done
40+ zle reset-prompt
41+}
42+zle -N insert-cycledleft
43+
44+insert-cycledright () {
45+ switch-to-dir -0 || return $?
46+
47+ local fn
48+ for fn in chpwd $chpwd_functions precmd $precmd_functions; do
49+ (( $+functions[$fn] )) && $fn
50+ done
51+ zle reset-prompt
52+}
53+zle -N insert-cycledright
54+
55+insert-cycledup () {
56+ switch-to-dir -- .. || return $?
57+
58+ local fn
59+ for fn in chpwd $chpwd_functions precmd $precmd_functions; do
60+ (( $+functions[$fn] )) && $fn
61+ done
62+ zle reset-prompt
63+}
64+zle -N insert-cycledup
65+
66+insert-cycleddown () {
67+ switch-to-dir -- "$(find . -mindepth 1 -maxdepth 1 -type d | sort -n | head -n 1)" || return $?
68+
69+ local fn
70+ for fn in chpwd $chpwd_functions precmd $precmd_functions; do
71+ (( $+functions[$fn] )) && $fn
72+ done
73+ zle reset-prompt
74+}
75+zle -N insert-cycleddown
76+
77+# These sequences work for xterm, Apple Terminal.app, and probably others.
78+# Not for rxvt-unicode, but it doesn't seem differentiate Ctrl-Shift-Arrow
79+# from plain Shift-Arrow, at least by default.
80+#
81+# iTerm2 does not have these key combinations defined by default; you will need
82+# to add them under "Keys" in your profile if you want to use this. You can do
83+# this conveniently by loading the "xterm with Numeric Keypad" preset.
84+bindkey "\e[1;6D" insert-cycledleft # Ctrl+Shift+Left
85+bindkey "\e[1;6C" insert-cycledright # Ctrl+Shift+Right
86+bindkey "\e[1;6A" insert-cycledup # Ctrl+Shift+Up
87+bindkey "\e[1;6B" insert-cycleddown # Ctrl+Shift+Down
+15-0.oh-my-zsh/plugins/direnv/README.md
@@ -0,0 +1,15 @@
1+# direnv plugin
2+
3+This plugin creates the [Direnv](https://direnv.net/) hook.
4+
5+To use it, add `direnv` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... direnv)
9+```
10+
11+## Requirements
12+
13+In order to make this work, you will need to have the direnv installed.
14+
15+More info on the usage and install: https://github.com/direnv/direnv
+19-0.oh-my-zsh/plugins/direnv/direnv.plugin.zsh
@@ -0,0 +1,19 @@
1+# If direnv is not found, don't continue and print a warning
2+if (( ! $+commands[direnv] )); then
3+ echo "Warning: direnv not found. Please install direnv and ensure it's in your PATH before using this plugin."
4+ return
5+fi
6+
7+_direnv_hook() {
8+ trap -- '' SIGINT;
9+ eval "$(direnv export zsh)";
10+ trap - SIGINT;
11+}
12+typeset -ag precmd_functions;
13+if [[ -z "${precmd_functions[(r)_direnv_hook]+1}" ]]; then
14+ precmd_functions=( _direnv_hook ${precmd_functions[@]} )
15+fi
16+typeset -ag chpwd_functions;
17+if [[ -z "${chpwd_functions[(r)_direnv_hook]+1}" ]]; then
18+ chpwd_functions=( _direnv_hook ${chpwd_functions[@]} )
19+fi
+105-0.oh-my-zsh/plugins/dirhistory/README.md
@@ -0,0 +1,105 @@
1+# Dirhistory plugin
2+
3+This plugin adds keyboard shortcuts for navigating directory history and hierarchy.
4+
5+To use it, add `dirhistory` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... dirhistory)
9+```
10+
11+## Keyboard Shortcuts
12+
13+| Shortcut | Description |
14+|-----------------------------------|-----------------------------------------------------------|
15+| <kbd>Alt</kbd> + <kbd>Left</kbd> | Go to previous directory |
16+| <kbd>Alt</kbd> + <kbd>Right</kbd> | Go to next directory |
17+| <kbd>Alt</kbd> + <kbd>Up</kbd> | Move into the parent directory |
18+| <kbd>Alt</kbd> + <kbd>Down</kbd> | Move into the first child directory by alphabetical order |
19+
20+**For macOS: use the Option key (<kbd>โŒฅ</kbd>) instead of <kbd>Alt</kbd>**.
21+
22+> NOTE: some terminals might override the <kbd>Alt</kbd> + Arrows key bindings (e.g. Windows Terminal).
23+> If these don't work check your terminal settings and change them to a different keyboard shortcut.
24+
25+## Usage
26+
27+This plugin allows you to navigate the history of previous working directories using <kbd>Alt</kbd> + <kbd>Left</kbd>
28+and <kbd>Alt</kbd> + <kbd>Right</kbd>. <kbd>Alt</kbd> + <kbd>Left</kbd> moves to past directories, and
29+<kbd>Alt</kbd> + <kbd>Right</kbd> goes back to recent directories.
30+
31+**NOTE: the maximum directory history size is 30.**
32+
33+You can also navigate **directory hierarchies** using <kbd>Alt</kbd> + <kbd>Up</kbd> and <kbd>Alt</kbd> + <kbd>Down</kbd>.
34+<kbd>Alt</kbd> + <kbd>Up</kbd> moves to the parent directory, while <kbd>Alt</kbd> + <kbd>Down</kbd> moves into the first
35+child directory found in alphabetical order (useful to navigate long empty directories, e.g. Java packages).
36+
37+For example, if the shell was started, and the following commands were entered:
38+
39+```shell
40+cd ~
41+cd /usr
42+cd share
43+cd doc
44+```
45+
46+the directory stack (`dirs -v`) would look like this:
47+
48+```console
49+$ dirs -v
50+0 /usr/share/doc
51+1 /usr/share
52+2 /usr
53+3 ~
54+```
55+
56+then entering <kbd>Alt</kbd> + <kbd>Left</kbd> at the prompt would change directory from `/usr/share/doc` to `/usr/share`,
57+then if pressed again to `/usr`, then `~`. If <kbd>Alt</kbd> + <kbd>Right</kbd> were pressed the directory would be changed
58+to `/usr` again.
59+
60+After that, <kbd>Alt</kbd> + <kbd>Down</kbd> will probably go to `/usr/bin` if `bin` is the first directory in alphabetical
61+order (depends on your `/usr` folder structure). <kbd>Alt</kbd> + <kbd>Up</kbd> will return to `/usr`, and once more will get
62+you to the root folder (`/`).
63+
64+### cde
65+
66+This plugin also provides a `cde` alias that allows you to change to a directory without clearing the next directory stack.
67+This changes the default behavior of `dirhistory`, which is to clear the next directory stack when changing directories.
68+
69+For example, if the shell was started, and the following commands were entered:
70+
71+```shell
72+cd ~
73+cd /usr
74+cd share
75+cd doc
76+
77+# <Alt + Left>
78+# <Alt + Left>
79+```
80+
81+The directory stack would look like this:
82+
83+```sh
84+โžœ /usr typeset -pm dirhistory_\*
85+typeset -ax dirhistory_past=( /home/user /usr )
86+typeset -ax dirhistory_future=( /usr/share/doc /usr/share )
87+```
88+
89+This means that pressing <kbd>Alt</kbd> + <kbd>Right</kbd>, you'd go to `/usr/share` and `/usr/share/doc` (the "future" directories).
90+
91+If you run `cd /usr/bin`, the "future" directories will be removed, and you won't be able to access them with <kbd>Alt</kbd> + <kbd>Right</kbd>:
92+
93+```sh
94+โžœ /u/bin typeset -pm dirhistory_\*
95+typeset -ax dirhistory_past=( /home/user /usr )
96+typeset -ax dirhistory_future=( /usr/bin )
97+```
98+
99+If you instead run `cde /usr/bin`, the "future" directories will be preserved:
100+
101+```sh
102+โžœ /u/bin typeset -pm dirhistory_\*
103+typeset -ax dirhistory_past=( /home/user /usr /usr/bin )
104+typeset -ax dirhistory_future=( /usr/share/doc /usr/share )
105+```
+236-0.oh-my-zsh/plugins/dirhistory/dirhistory.plugin.zsh
@@ -0,0 +1,236 @@
1+##
2+# Navigate directory history using ALT-LEFT and ALT-RIGHT. ALT-LEFT moves back to directories
3+# that the user has changed to in the past, and ALT-RIGHT undoes ALT-LEFT.
4+#
5+# Navigate directory hierarchy using ALT-UP and ALT-DOWN.
6+# ALT-UP moves to higher hierarchy (cd ..)
7+# ALT-DOWN moves into the first directory found in alphabetical order
8+#
9+
10+dirhistory_past=($PWD)
11+dirhistory_future=()
12+export dirhistory_past
13+export dirhistory_future
14+export DIRHISTORY_SIZE=30
15+
16+alias cde='dirhistory_cd'
17+
18+# Pop the last element of dirhistory_past.
19+# Pass the name of the variable to return the result in.
20+# Returns the element if the array was not empty,
21+# otherwise returns empty string.
22+function pop_past() {
23+ setopt localoptions no_ksh_arrays
24+ if [[ $#dirhistory_past -gt 0 ]]; then
25+ typeset -g $1="${dirhistory_past[$#dirhistory_past]}"
26+ dirhistory_past[$#dirhistory_past]=()
27+ fi
28+}
29+
30+function pop_future() {
31+ setopt localoptions no_ksh_arrays
32+ if [[ $#dirhistory_future -gt 0 ]]; then
33+ typeset -g $1="${dirhistory_future[$#dirhistory_future]}"
34+ dirhistory_future[$#dirhistory_future]=()
35+ fi
36+}
37+
38+# Push a new element onto the end of dirhistory_past. If the size of the array
39+# is >= DIRHISTORY_SIZE, the array is shifted
40+function push_past() {
41+ setopt localoptions no_ksh_arrays
42+ if [[ $#dirhistory_past -ge $DIRHISTORY_SIZE ]]; then
43+ shift dirhistory_past
44+ fi
45+ if [[ $#dirhistory_past -eq 0 || $dirhistory_past[$#dirhistory_past] != "$1" ]]; then
46+ dirhistory_past+=($1)
47+ fi
48+}
49+
50+function push_future() {
51+ setopt localoptions no_ksh_arrays
52+ if [[ $#dirhistory_future -ge $DIRHISTORY_SIZE ]]; then
53+ shift dirhistory_future
54+ fi
55+ if [[ $#dirhistory_future -eq 0 || $dirhistory_futuret[$#dirhistory_future] != "$1" ]]; then
56+ dirhistory_future+=($1)
57+ fi
58+}
59+
60+# Called by zsh when directory changes
61+autoload -U add-zsh-hook
62+add-zsh-hook chpwd chpwd_dirhistory
63+function chpwd_dirhistory() {
64+ push_past $PWD
65+ # If DIRHISTORY_CD is not set...
66+ if [[ -z "${DIRHISTORY_CD+x}" ]]; then
67+ # ... clear future.
68+ dirhistory_future=()
69+ fi
70+}
71+
72+function dirhistory_cd(){
73+ DIRHISTORY_CD="1"
74+ cd $1
75+ unset DIRHISTORY_CD
76+}
77+
78+# Move backward in directory history
79+function dirhistory_back() {
80+ local cw=""
81+ local d=""
82+ # Last element in dirhistory_past is the cwd.
83+
84+ pop_past cw
85+ if [[ "" == "$cw" ]]; then
86+ # Someone overwrote our variable. Recover it.
87+ dirhistory_past=($PWD)
88+ return
89+ fi
90+
91+ pop_past d
92+ if [[ "" != "$d" ]]; then
93+ dirhistory_cd $d
94+ push_future $cw
95+ else
96+ push_past $cw
97+ fi
98+}
99+
100+
101+# Move forward in directory history
102+function dirhistory_forward() {
103+ local d=""
104+
105+ pop_future d
106+ if [[ "" != "$d" ]]; then
107+ dirhistory_cd $d
108+ push_past $d
109+ fi
110+}
111+
112+
113+# Bind keys to history navigation
114+function dirhistory_zle_dirhistory_back() {
115+ # Erase current line in buffer
116+ zle .kill-buffer
117+ dirhistory_back
118+ zle .accept-line
119+}
120+
121+function dirhistory_zle_dirhistory_future() {
122+ # Erase current line in buffer
123+ zle .kill-buffer
124+ dirhistory_forward
125+ zle .accept-line
126+}
127+
128+zle -N dirhistory_zle_dirhistory_back
129+zle -N dirhistory_zle_dirhistory_future
130+
131+for keymap in emacs vicmd viins; do
132+ # dirhistory_back
133+ bindkey -M $keymap "\e[3D" dirhistory_zle_dirhistory_back # xterm in normal mode
134+ bindkey -M $keymap "\e[1;3D" dirhistory_zle_dirhistory_back # xterm in normal mode
135+ bindkey -M $keymap "\e\e[D" dirhistory_zle_dirhistory_back # Putty
136+ bindkey -M $keymap "\eO3D" dirhistory_zle_dirhistory_back # GNU screen
137+
138+ case "$TERM_PROGRAM" in
139+ Apple_Terminal) bindkey -M $keymap "^[b" dirhistory_zle_dirhistory_back ;; # Terminal.app
140+ ghostty) bindkey -M $keymap "^[b" dirhistory_zle_dirhistory_back ;; # ghostty
141+ iTerm.app)
142+ bindkey -M $keymap "^[^[[D" dirhistory_zle_dirhistory_back
143+ bindkey -M $keymap "^[b" dirhistory_zle_dirhistory_back
144+ ;;
145+ esac
146+
147+ if (( ${+terminfo[kcub1]} )); then
148+ bindkey -M $keymap "^[${terminfo[kcub1]}" dirhistory_zle_dirhistory_back # urxvt
149+ fi
150+
151+ # dirhistory_future
152+ bindkey -M $keymap "\e[3C" dirhistory_zle_dirhistory_future # xterm in normal mode
153+ bindkey -M $keymap "\e[1;3C" dirhistory_zle_dirhistory_future # xterm in normal mode
154+ bindkey -M $keymap "\e\e[C" dirhistory_zle_dirhistory_future # Putty
155+ bindkey -M $keymap "\eO3C" dirhistory_zle_dirhistory_future # GNU screen
156+
157+ case "$TERM_PROGRAM" in
158+ Apple_Terminal) bindkey -M $keymap "^[f" dirhistory_zle_dirhistory_future ;; # Terminal.app
159+ ghostty) bindkey -M $keymap "^[f" dirhistory_zle_dirhistory_future ;; # ghostty
160+ iTerm.app)
161+ bindkey -M $keymap "^[^[[C" dirhistory_zle_dirhistory_future
162+ bindkey -M $keymap "^[f" dirhistory_zle_dirhistory_future
163+ ;;
164+ esac
165+
166+ if (( ${+terminfo[kcuf1]} )); then
167+ bindkey -M $keymap "^[${terminfo[kcuf1]}" dirhistory_zle_dirhistory_future # urxvt
168+ fi
169+done
170+
171+#
172+# HIERARCHY Implemented in this section, in case someone wants to split it to another plugin if it clashes bindings
173+#
174+
175+# Move up in hierarchy
176+function dirhistory_up() {
177+ cd .. || return 1
178+}
179+
180+# Move down in hierarchy
181+function dirhistory_down() {
182+ cd "$(find . -mindepth 1 -maxdepth 1 -type d | sort -n | head -n 1)" || return 1
183+}
184+
185+
186+# Bind keys to hierarchy navigation
187+function dirhistory_zle_dirhistory_up() {
188+ zle .kill-buffer # Erase current line in buffer
189+ dirhistory_up
190+ zle .accept-line
191+}
192+
193+function dirhistory_zle_dirhistory_down() {
194+ zle .kill-buffer # Erase current line in buffer
195+ dirhistory_down
196+ zle .accept-line
197+}
198+
199+zle -N dirhistory_zle_dirhistory_up
200+zle -N dirhistory_zle_dirhistory_down
201+
202+for keymap in emacs vicmd viins; do
203+ # dirhistory_up
204+ bindkey -M $keymap "\e[3A" dirhistory_zle_dirhistory_up # xterm in normal mode
205+ bindkey -M $keymap "\e[1;3A" dirhistory_zle_dirhistory_up # xterm in normal mode
206+ bindkey -M $keymap "\e\e[A" dirhistory_zle_dirhistory_up # Putty
207+ bindkey -M $keymap "\eO3A" dirhistory_zle_dirhistory_up # GNU screen
208+
209+ case "$TERM_PROGRAM" in
210+ Apple_Terminal) bindkey -M $keymap "^[[A" dirhistory_zle_dirhistory_up ;; # Terminal.app
211+ iTerm.app) bindkey -M $keymap "^[^[[A" dirhistory_zle_dirhistory_up ;; # iTerm2
212+ ghostty) bindkey -M $keymap "^[[1;3A" dirhistory_zle_dirhistory_up ;; # ghostty
213+ esac
214+
215+ if (( ${+terminfo[kcuu1]} )); then
216+ bindkey -M $keymap "^[${terminfo[kcuu1]}" dirhistory_zle_dirhistory_up # urxvt
217+ fi
218+
219+ # dirhistory_down
220+ bindkey -M $keymap "\e[3B" dirhistory_zle_dirhistory_down # xterm in normal mode
221+ bindkey -M $keymap "\e[1;3B" dirhistory_zle_dirhistory_down # xterm in normal mode
222+ bindkey -M $keymap "\e\e[B" dirhistory_zle_dirhistory_down # Putty
223+ bindkey -M $keymap "\eO3B" dirhistory_zle_dirhistory_down # GNU screen
224+
225+ case "$TERM_PROGRAM" in
226+ Apple_Terminal) bindkey -M $keymap "^[[B" dirhistory_zle_dirhistory_down ;; # Terminal.app
227+ iTerm.app) bindkey -M $keymap "^[^[[B" dirhistory_zle_dirhistory_down ;; # iTerm2
228+ ghostty) bindkey -M $keymap "^[[1;3B" dirhistory_zle_dirhistory_down ;; # ghostty
229+ esac
230+
231+ if (( ${+terminfo[kcud1]} )); then
232+ bindkey -M $keymap "^[${terminfo[kcud1]}" dirhistory_zle_dirhistory_down # urxvt
233+ fi
234+done
235+
236+unset keymap
+10-0.oh-my-zsh/plugins/dirpersist/README.md
@@ -0,0 +1,10 @@
1+# Dirpersist plugin
2+
3+This plugin keeps a running tally of the previous 20 unique directories in the `$HOME/.zdirs` file.
4+When you cd to a new directory, it is prepended to the beginning of the file.
5+
6+To use it, add `dirpersist` to the plugins array in your zshrc file:
7+
8+```zsh
9+plugins=(... dirpersist)
10+```
+21-0.oh-my-zsh/plugins/dirpersist/dirpersist.plugin.zsh
@@ -0,0 +1,21 @@
1+# Save dirstack history to .zdirs
2+# adapted from:
3+# github.com/grml/grml-etc-core/blob/master/etc/zsh/zshrc#L1547
4+
5+DIRSTACKSIZE=${DIRSTACKSIZE:-20}
6+dirstack_file=${dirstack_file:-${HOME}/.zdirs}
7+
8+if [[ -f ${dirstack_file} ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then
9+ dirstack=( ${(f)"$(< $dirstack_file)"} )
10+ # "cd -" won't work after login by just setting $OLDPWD, so
11+ [[ -d $dirstack[1] ]] && cd $dirstack[1] && cd $OLDPWD
12+fi
13+
14+autoload -U add-zsh-hook
15+add-zsh-hook chpwd chpwd_dirpersist
16+chpwd_dirpersist() {
17+ if (( $DIRSTACKSIZE <= 0 )) || [[ -z $dirstack_file ]]; then return; fi
18+ local -ax my_stack
19+ my_stack=( ${PWD} ${dirstack} )
20+ builtin print -l ${(u)my_stack} >! ${dirstack_file}
21+}
+32-0.oh-my-zsh/plugins/dnf/README.md
@@ -0,0 +1,32 @@
1+# dnf plugin
2+
3+This plugin makes `dnf` usage easier by adding aliases for the most common commands.
4+
5+`dnf` is the new package manager for RPM-based distributions, which replaces `yum`.
6+
7+To use it, add `dnf` to the plugins array in your zshrc file:
8+
9+```zsh
10+plugins=(... dnf)
11+```
12+
13+Classic `dnf` is getting superseded by `dnf5`; this plugin detects the presence
14+of `dnf5` and uses it as drop-in alternative to the slower `dnf`.
15+
16+## Aliases
17+
18+| Alias | Command | Description |
19+|-------|-------------------------|--------------------------|
20+| dnfl | `dnf list` | List packages |
21+| dnfli | `dnf list installed` | List installed packages |
22+| dnfgl | `dnf grouplist` | List package groups |
23+| dnfmc | `dnf makecache` | Generate metadata cache |
24+| dnfp | `dnf info` | Show package information |
25+| dnfs | `dnf search` | Search package |
26+| **Use `sudo`** |
27+| dnfu | `sudo dnf upgrade` | Upgrade package |
28+| dnfi | `sudo dnf install` | Install package |
29+| dnfgi | `sudo dnf groupinstall` | Install package group |
30+| dnfr | `sudo dnf remove` | Remove package |
31+| dnfgr | `sudo dnf groupremove` | Remove package group |
32+| dnfc | `sudo dnf clean all` | Clean cache |
+570-0.oh-my-zsh/plugins/dnf/_dnf5
@@ -0,0 +1,570 @@
1+#compdef dnf5
2+# based on dnf-5.2.6.2
3+
4+# utility functions
5+
6+_dnf5_helper() {
7+ _call_program specs $service "${(q-)@}" "${(q-)PREFIX}\*" \
8+ -qC --assumeno --nogpgcheck 2>/dev/null </dev/null
9+}
10+
11+_dnf5_repositories() {
12+ # required option: -T (all|disabled|enabled)
13+ local selected expl
14+ zparseopts -D -E - T:=selected
15+ selected=$selected[2]
16+ _wanted $selected-repositories expl "$selected repository" \
17+ compadd "$@" - "${(@)${(f)$(_dnf5_helper repo list --$selected)}[2,-1]%% *}"
18+}
19+
20+_dnf5_packages() {
21+ # required option: -T (all|available|installed|upgradable)
22+ local selected opt expl
23+ zparseopts -D -E - T:=selected
24+ selected=$selected[2]
25+ case $selected in
26+ all) opt='' ;; # option --all does not exist
27+ upgradable) opt='--upgrades' ;;
28+ *) opt="--$selected" ;;
29+ esac
30+ _wanted $selected-packages expl "$selected package" \
31+ compadd "$@" - $(_dnf5_helper repoquery $opt --qf='%{name} ')
32+}
33+
34+_dnf5_rpm_files() {
35+ local expl
36+ _wanted rpm-files expl 'rpm file' _files -g '(#i)*.rpm(-.)'
37+}
38+
39+_dnf5_packages_or_rpms() {
40+ if [[ "$words[CURRENT]" = (*/*|\~*) ]]; then # if looks like a path name
41+ _dnf5_rpm_files
42+ else
43+ _dnf5_packages "$@"
44+ fi
45+}
46+
47+_dnf5_groups() {
48+ # optional option: -T (available|installed)
49+ local update_policy selected line pat groups
50+ zparseopts -D -E - T:=selected
51+ selected=$selected[2]
52+ if [[ -z $selected ]]; then
53+ selected=all
54+ opt= # option --all does not exist
55+ else
56+ opt=--$selected
57+ fi
58+ # XXX hidden groups are not included
59+ for line in ${${(f)"$(_dnf5_helper group list $opt)"}[2,-1]}; do
60+ line=( ${(z)line} )
61+ groups+=( "$line[1]:$line[2,-2]" )
62+ done
63+ _describe -t $selected-groups "$selected group" groups
64+}
65+
66+_dnf5_environments() {
67+ local line envs
68+ for line in ${${(f)"$(_dnf5_helper environment list)"}[2,-1]}; do
69+ line=( ${(z)line} )
70+ envs+=( "$line[1]:$line[2,-2]" )
71+ done
72+ _describe -t environments 'environment' envs
73+}
74+
75+# completers for (several) dnf commands
76+
77+_dnf5-advisory () {
78+ _arguments : \
79+ $advisory_opts \
80+ '--contains-pkgs=[only show advisories containing specified packages]: : _sequence _dnf5_packages -T installed' \
81+ + '(with)' \
82+ '--with-cve[show only advisories referencing CVE ticket]' \
83+ '--with-bz[show only advisories referencing Bugzilla ticket]' \
84+ + '(type)' \
85+ '--all[show all advisories]' \
86+ '--available[show advisories containing newer versions of installed packages (default)]' \
87+ '--installed[show advisories containing equal and older version of installed packages]' \
88+ '--updates[show advisories containing upgradable packages]' \
89+ + args \
90+ ':subcommand:(list info summary)' '*:advisory spec:'
91+}
92+
93+_dnf5-group() {
94+ local -a tmp
95+ if (( CURRENT == 2 )); then
96+ tmp=(
97+ 'list:list all matching groups'
98+ 'info:print detailed information about groups'
99+ 'install:install packages from specified groups'
100+ 'remove:remove removable packages in specified groups'
101+ 'upgrade:upgrade specified groups and packages in them'
102+ )
103+ _describe -t subcommands 'subcommand' tmp
104+ else
105+ case $words[2] in
106+ list|info)
107+ tmp=(
108+ '(--installed)--available[show only available groups]'
109+ '(--available)--installed[show only installed groups]'
110+ '--hidden[show also hidden groups]'
111+ '--contains-pkgs=[show only groups containing specified packages]: : _sequence _dnf5_packages -T all'
112+ '*: : _dnf5_groups'
113+ )
114+ ;;
115+ install)
116+ tmp=( $common_opts
117+ '--with-optional[include optional packages from the groups]'
118+ '*: : _dnf5_groups -T available' )
119+ ;|
120+ upgrade)
121+ tmp=( ${common_opts:#--skip-broken*}
122+ '*: : _dnf5_groups -T installed' )
123+ ;|
124+ remove)
125+ tmp=( $offline_opts
126+ '*: : _dnf5_groups -T installed' )
127+ ;|
128+ install|remove)
129+ tmp+=( '--no-packages[operate on groups only, not manipulate any packages]' )
130+ ;|
131+ install|upgrade)
132+ tmp+=( $downgrade_opts )
133+ ;;
134+ esac
135+ _arguments : $tmp
136+ fi
137+}
138+
139+_dnf5-history() {
140+ local -a tmp
141+ if (( CURRENT == 2 )); then
142+ tmp=(
143+ 'list:list info about recorded transactions'
144+ 'info:print detailed about specific transactions'
145+ 'undo:revert all actions from the specified transaction'
146+ 'redo:repeat the specified transaction'
147+ 'rollback:undo all transactions performed after the specified transaction'
148+ 'store:store the transaction into a directory'
149+ )
150+ _describe -t subcommands 'subcommand' tmp
151+ else
152+ case $words[2] in
153+ list|info)
154+ tmp=( '--reverse[reverse the order of transactions in output]' )
155+ ;;
156+ undo|rollback|redo)
157+ tmp=( '--skip-unavailable[allow skipping impossible actions]' )
158+ ;|
159+ undo|rollback)
160+ tmp+=( $replay_opts )
161+ ;;
162+ store)
163+ tmp=( {-o,--output=}'[directory for storing the transaction (default ./transaction)]: : _directories')
164+ esac
165+ _arguments : $tmp '2:transaction:( )'
166+ fi
167+}
168+
169+_dnf5-mark() {
170+ local -a tmp
171+ if (( CURRENT == 2 )); then
172+ tmp=(
173+ 'user:mark the package as user-installed'
174+ 'dependency:mark the package as a dependency'
175+ 'weak:mark the package as a weak dependency'
176+ 'group:mark the package as installed by the specified group'
177+ )
178+ _describe -t subcommands 'subcommand' tmp
179+ else
180+ tmp=(
181+ '--skip-unavailable[skip packages not installed on the system]'
182+ '--store=[store the transaction in specified directory]: : _directories'
183+ )
184+ if [[ $words[2] = group ]]; then
185+ tmp+=( '2:group-id: _dnf5_groups -T installed' )
186+ fi
187+ _arguments : $tmp '*: : _dnf5_packages -T installed'
188+ fi
189+}
190+
191+_dnf5-module() {
192+ local -a tmp
193+ if (( CURRENT == 2 )); then
194+ tmp=(
195+ 'list:list module streams'
196+ 'info:print details about module streams'
197+ 'enable:enable module streams'
198+ 'disable:disable modules including all their streams'
199+ "reset:reset module state so it's no longer enabled or disabled"
200+ )
201+ _describe -t subcommands 'subcommand' tmp
202+ elif (( CURRENT == 3 )) && [[ $cur = -* ]]; then
203+ case $words[2] in
204+ list|info) tmp=( --enabled --disabled ) ;;
205+ enable) tmp=( --skip-broken --skip-unavailable ) ;;
206+ *) tmp=( --skip-unavailable ) ;;
207+ esac
208+ _wanted options expl 'option' compadd -a tmp
209+ else
210+ _message 'module spec'
211+ fi
212+}
213+
214+_dnf5-offline() { # also used by the 'system-upgrade' command
215+ local -a tmp
216+ if (( CURRENT == 2 )); then
217+ tmp=(
218+ 'clean:remove any stored offline transactions and cached packages'
219+ 'log:list boots during which offline transaction was attempted'
220+ 'reboot:prepare the system for offline transaction and reboot'
221+ )
222+ if [[ $cmd = offline ]]; then
223+ tmp+=( 'status:show status of the current offline transaction' )
224+ else
225+ tmp+=( 'download:download all packages needed for upgrade' )
226+ fi
227+ _describe -t subcommands 'subcommand' tmp && ret=0
228+ else
229+ case $words[2] in
230+ download)
231+ _arguments : \
232+ '--releasever=[the version to upgrade to]:version number:' \
233+ '--no-downgrade:do not install packages older than currently installed' '*: :' && ret=0
234+ ;;
235+ log)
236+ _arguments : \
237+ '--number=[show log of transaction specified by number]:transaction number:' '*: :' && ret=0
238+ ;;
239+ reboot)
240+ _wanted options expl 'option' compadd -- --poweroff && ret=0
241+ ;;
242+ esac
243+ fi
244+}
245+
246+_dnf5-repoquery() {
247+ local v
248+ local -a opts=(
249+ $advisory_opts
250+ '--arch=[limit results to specified architectures]:list of archs: '
251+ '--available[limit results to available packages]'
252+ '--disable-modular-filtering[include packages of inactive module streams]'
253+ '--duplicates[limit to installed duplicate packages]'
254+ '--exactdeps[limit to packages that require capability specified by ==what{requires,depends}]'
255+ '--extras[limit to installed packages that are not present in any available repository]'
256+ '--file=[limit results to packages which own specified file]:list of files: _sequence _files'
257+ '--installed[query installed packages]'
258+ '--installonly[limit to installed installonly packages]'
259+ '--latest-limit=[limit to latest packages of specified number]:number:'
260+ '--leaves[limit to groups of installed packages not required by other installed packages]'
261+ '--providers-of=[select packages that provide specified attribute]:attribute:(conflicts depends enhances obsoletes provides recommends requires requires_pre suggests supplement)'
262+ '--recent[limit to only recently changed packages]'
263+ '--recursive[make --whatrequires/--providers-of work recursively]'
264+ '--security[limit to packages in security advisories]'
265+ '--srpm[use the corresponding source RPM]'
266+ '--unneeded[limit to unneeded installed packages]'
267+ '--upgrades[limit to available packages that provide upgrade for installed packages]'
268+ '--userinstalled[limit to packages that are not installed as dependencies]'
269+ '--whatdepends=[limit to packages that require, enhance, recommend, suggest of supplement specified capability]:list of capability:'
270+ '--whatconflicts=[limit to packages that conflicts with specified capabilities]:list of capability: '
271+ )
272+ for v in enhance obsolete provide recommend require suggest supplement; do
273+ opts+=( "--what${v}s=[limit to packages that $v specified capabilities]:list of capability: ")
274+ done
275+ # mutually exclusive formating options
276+ opts+=(
277+ + '(format)'
278+ '--conflicts[display capabilities that the package conflicts with]'
279+ '--depends[display capabilities that the package depends on, enables, recommends, suggests or supplements]'
280+ '--files[show files in the package]'
281+ '--requires-pre[display capabilities required to run pre/post scripts of the package]'
282+ '--sourcerpm[display source RPM of the package]'
283+ '--location[display location of the package]'
284+ '--info[show detailed information about the package]'
285+ '--changelogs[print the package changelogs]'
286+ '(- *)--querytags[list tags recognized by --queryformat]'
287+ '--queryformat=[specify output format]:format:'
288+ )
289+ for v in enhance obsolete provide recommend require suggest supplement; do
290+ opts+=( "--${v}s[display capabilities ${v}ed by the package]" )
291+ done
292+
293+ _arguments : '*: : _dnf5_packages -T all' $opts
294+}
295+
296+# dnf commands
297+
298+_dnf5_commands() {
299+ local -a dnf_cmds=(
300+ 'advisory:manage advisories'
301+ 'autoremove:remove unneeded packages'
302+ 'check:check for problems in package database'
303+ 'check-upgrade:check for available package upgrades'
304+ 'clean:remove or invalidate cached data'
305+ 'distro-sync:up/downgrade installed packages to the latest available'
306+ 'downgrade:downgrade packages'
307+ 'download:download packages'
308+ 'environment:manage comps environments'
309+ 'group:manage comps groups'
310+ 'history:manage transaction history'
311+ 'info:provide detailed information about packages'
312+ 'install:install packages'
313+ 'leaves:list groups of leaf packages'
314+ 'list:list installed or available packages'
315+ 'makecache:generate the metadata cache'
316+ 'mark:change the reason of an installed package'
317+ 'module:manage modules'
318+ 'offline:manage offline transactions'
319+ 'provides:find what package provides the given value'
320+ 'reinstall:reinstall packages'
321+ 'remove:remove packages'
322+ 'replay:replay stored transactions'
323+ 'repo:manage repositories'
324+ 'repoquery:search for packages in repositories'
325+ 'search:search for packages using keywords'
326+ 'swap:remove software and install another in the single transaction'
327+ 'system-upgrade:upgrade the system to a new major release'
328+ 'upgrade:upgrade packages'
329+ 'versionlock:protect packages from updates to newer versions'
330+ )
331+ _describe -t dnf-commands 'dnf command' dnf_cmds
332+}
333+
334+# subcommands and options
335+
336+_dnf5_subcmds_opts() {
337+ local cur=$words[CURRENT] cmd=$words[1] expl ret=1
338+ local -a tmp
339+ # common options
340+ local -a offline_opts=(
341+ '(--store)--offline[store the transaction to be performed offline]'
342+ '(--offline)--store=[store the transaction in specified directory]: : _directories'
343+ )
344+ local -a common_opts=(
345+ $offline_opts
346+ '--allowerasing[allow erasing of installed packages]'
347+ '--skip-broken[resolve dependency problems by skipping problematic packages]'
348+ "--skip-unavailable[skip packages that can't be synchronized]"
349+ '--downloadonly[download packages without executing transaction]'
350+ )
351+ local -a advisory_opts=(
352+ '--advisories=[consider only specified advisories]:list of advisories:'
353+ '--advisory-severities=[limit to advisories with specified severity]:severity:_sequence compadd - critical important moderate low none'
354+ '--bzs=[limit to advisories that fix specified Bugzilla ID]:list of Bugzilla ID:'
355+ '--cves=[limit to advisories that fix specified CVE ID]:list of CVD ID]:'
356+ '--security[limit to security advisories]'
357+ '--bugfix[limit to bugfix advisories]'
358+ '--enhancement[limit to enhancement advisories]'
359+ '--newpackage[limit to newpackage advisories]'
360+ )
361+ local -a downgrade_opts=(
362+ '(--no-allow-downgrade)--allow-downgrade[enable downgrade of dependencies]'
363+ '(--allow-downgrade)--no-allow-downgrade[disable downgrade of dependencies]'
364+ )
365+ local -a replay_opts=(
366+ '--ignore-extras[not consider extra packages]'
367+ '--ignore-installed[mismatches between installed and stored transaction are not errors]'
368+ )
369+ # Deal with some aliases (not comprehensive)
370+ case $cmd in
371+ check-updgrade) cmd=check-update;;
372+ dg) cmd=downgrade;;
373+ dsync) cmd=distro-sync;;
374+ grp) cmd=group;;
375+ if) cmd=info;;
376+ in) cmd=install;;
377+ ls) cmd=list;;
378+ mc) cmd=makecache;;
379+ rei) cmd=reinstall;;
380+ rm) cmd=remove ;;
381+ rq) cmd=repoquery;;
382+ se) cmd=search;;
383+ update|up) cmd=upgrade;;
384+ esac
385+ local curcontext="${curcontext%:*:*}:dnf-${cmd}:"
386+
387+ case $cmd in
388+ advisory|group|history|mark|module|offline|repoquery)
389+ _dnf5-$cmd && ret=0
390+ ;;
391+ system-upgrade)
392+ _dnf5-offline && ret=0
393+ ;;
394+ autoremove)
395+ _arguments : $offline_opts && ret=0
396+ ;;
397+ check)
398+ _arguments : \
399+ '--dependencies[show missing dependencies and conflicts]' \
400+ '--duplicates[show duplicated packages]' \
401+ '--obsoleted[show obsoleted packages]' && ret=0
402+ ;;
403+ check-upgrade)
404+ _arguments : \
405+ $advisory_opts \
406+ '--changelogs[print package changelogs]' \
407+ '--minimal[reports the lowest versions of packages that fix advisories]' \
408+ '*: : _dnf5_packages -T installed' && ret=0
409+ ;;
410+ clean)
411+ tmp=(
412+ 'dbcache:remove cache files generated from the repository metadata'
413+ 'expire-cache:mark the repository metadata expired'
414+ 'metadata:remove the repository metadata'
415+ 'packages:remove any cached packages'
416+ 'all:clean all'
417+ )
418+ _describe -t cache-types 'cache type' tmp && ret=0
419+ ;;
420+ distro-sync)
421+ _arguments : $common_opts '*: : _dnf5_packages -T installed' && ret=0
422+ ;;
423+ downgrade)
424+ _arguments : \
425+ $common_opts $downgrade_opts \
426+ '*: : _dnf5_packages -T installed' && ret=0
427+ ;;
428+ download)
429+ _arguments : \
430+ '--arch=[limit to packages of specified architecture]:list of architectures:' \
431+ '--resolve[resolve and download needed dependencies]' \
432+ '--alldeps[with --resolve, also download already installed dependencies]' \
433+ '--destdir=[download to the specified directory]: : _directories' \
434+ '--srpm[download the source rpm]' \
435+ '--url[print the list of URLs where the rpms can be downloaded]' \
436+ '*--urlprotocol=[with --url, limit to specified protocols]:protocol:_sequence compadd - http https ftp file' \
437+ '*: : _dnf5_packages -T all' && ret=0
438+ ;;
439+ environment)
440+ _arguments : \
441+ '--available[show only available environments]' \
442+ '--installed[show only installed environments]' \
443+ ':subcommand:(list info)' \
444+ '*: : _dnf5_environments' && ret=0
445+ ;;
446+ info|list)
447+ _arguments : \
448+ '--showduplicates[show all versions of the packages]' \
449+ '*: : _dnf5_packages -T all' \
450+ + '(type)' \
451+ '--installed[list only installed packages]:*: : _dnf5_packages -T installed' \
452+ '--available[list only available packages]:*: : _dnf5_packages -T available' \
453+ '--extras[list only extras]' \
454+ '--obsoletes[list only installed but obsoleted packages]:*: : _dnf5_packages -T installed' \
455+ '--recent[list only recently added packages]' \
456+ '--upgrades[list only available upgrades of installed packages]:*: : _dnf5_packages -T upgradable' \
457+ '--autoremove[list only packages that will be autoremoved]:*: : _dnf5_packages -T installed' &&ret=0
458+ ;;
459+ install)
460+ _arguments : \
461+ $common_opts $downgrade_opts $advisory_opts \
462+ '*: : _dnf5_packages_or_rpms -T available' && ret=0
463+ ;;
464+ leaves|makecache)
465+ # nothing to complete
466+ ;;
467+ provides)
468+ _files && ret=0
469+ ;;
470+ reinstall)
471+ _arguments : \
472+ $common_opts $downgrade_opts \
473+ '*: : _dnf5_packages_or_rpms -T installed' && ret=0
474+ ;;
475+ remove)
476+ _arguments : \
477+ $offline_opts \
478+ '--no-autoremove[not remove dependencies that are no longer used]' \
479+ '*: : _dnf5_packages -T installed' && ret=0
480+ ;;
481+ replay)
482+ _arguments : \
483+ $replay_opts \
484+ ':transaction path:_directories' && ret=0
485+ ;;
486+ repo)
487+ _arguments : \
488+ '--all[show info about all repositories]' \
489+ '--enabled[show info only about enabled repositories]' \
490+ '--disabled[show info only about disabled repositories]' \
491+ ':subcommand:(list info)' && ret=0
492+ ;;
493+ search)
494+ _arguments : \
495+ '--all[search patterns also inside description and URL fields]' \
496+ '--showduplicates[show all versions of packages, not only the latest ones]' \
497+ '*:search pattern:' && ret=0
498+ ;;
499+ swap)
500+ _arguments : \
501+ $offline_opts \
502+ '--allowerasing[allow erasing of installed packages]' \
503+ ': : _dnf5_packages -T installed' \
504+ ': : _dnf5_packages -T available' && ret=0
505+ ;;
506+ upgrade)
507+ _arguments : \
508+ ${common_opts:#--skip-broken*} $downgrade_opts $advisory_opts \
509+ '--minimal[upgrade only to the lowest available versions that fix advisories]' \
510+ '--destdir=[specify directory into which downloading packages]: : _directories' \
511+ '*: : _dnf5_packages_or_rpms -T upgradable' && ret=0
512+ ;;
513+ versionlock)
514+ _arguments : \
515+ ':subcommand:(add exclude clear delete list)' \
516+ '*: : _dnf5_packages -T all' && ret=0
517+ ;;
518+ esac
519+ return ret
520+}
521+
522+# main completer
523+
524+_dnf5() {
525+ local curcontext="$curcontext" state state_descr line ret=1
526+ typeset -A opt_args
527+ local -a opts=(
528+ '(-y --assumeyes)--assumeno[answer no for all questions]'
529+ '--best[try the best available package version]'
530+ '(-C --cacheonly)'{-C,--cacheonly}"[run entirely from system cache, don't update cache]"
531+ '--comment=[add comment to transaction history]:comment:'
532+ '(-c --config)'{-c+,--config=}'[specify configuration file]:config file:_files'
533+ '--debugsolver[dump detailed solving results in file ./debugdata]'
534+ '*--disable-plugin=[disable specified plugins]:list of plugin names:'
535+ '(--repo)*--disable-repo=[disable specified repos]: : _sequence _dnf5_repositories -T enabled'
536+ '--dump-main-config[print main configuration values to stdout]'
537+ '*--dump-repo-config=[print repository configuration values to stdout]:repi id'
538+ '--dump-variables[print variable values to stdout]'
539+ '*--enable-plugin=[enable specified plugins]:list of plugin names:'
540+ '*--enable-repo=[enable additional repos]: : _sequence _dnf5_repositories -T disabled'
541+ '--forcearch=[force the use of the specified arch]:arch:'
542+ '(-)'{-h,--help}'[show the help message]'
543+ '--installroot=[set install root]: : _directories'
544+ '--no-best[do not limit transactions to best candidates]'
545+ '--no-docs[do not install documentation]'
546+ '--no-gpgcheck[skip checking GPG signatures on packages]'
547+ '--no-plugins[disable all plugins]'
548+ '(-q --quiet)'{-q,--quiet}'[show just the relevant content]'
549+ '--refresh[force refreshing metadata before running the command]'
550+ '--releasever=[override distribution release in config files]:release ver:'
551+ '(--disablerepo)*--repo=[enable just the specified repo]: : _sequence _dnf5_repositories -T all'
552+ '*--repofrompath=[specify additional repos]:repository_label,path_or_url: '
553+ '*--setopt=[override option in config file]:repoid.option=value:'
554+ '*--setvar=[override DNF5 variable value]'
555+ '--show-new-leaves[show newly installed leaf packages]'
556+ '--use-host-config[use config files and variables from host system]'
557+ '(- *)--version[show dnf version]'
558+ '(-y --assumeyes --assumeno)'{-y,--assumeyes}'[answer yes for all questions]'
559+ '*'{-x+,--exclude=}'[exclude specified packages from transaction]: : _sequence _dnf5_packages -T all'
560+ )
561+ _arguments -C -s : $opts ': :->command' '*:: :->cmd_args' && ret=0
562+
563+ case $state in
564+ command) _dnf5_commands && ret=0 ;;
565+ cmd_args) _dnf5_subcmds_opts && ret=0 ;;
566+ esac
567+ return ret
568+}
569+
570+_dnf5 "$@"
+19-0.oh-my-zsh/plugins/dnf/dnf.plugin.zsh
@@ -0,0 +1,19 @@
1+## Aliases
2+local dnfprog="dnf"
3+
4+# Prefer dnf5 if installed
5+command -v dnf5 > /dev/null && dnfprog=dnf5
6+
7+alias dnfl="${dnfprog} list" # List packages
8+alias dnfli="${dnfprog} list installed" # List installed packages
9+alias dnfgl="${dnfprog} grouplist" # List package groups
10+alias dnfmc="${dnfprog} makecache" # Generate metadata cache
11+alias dnfp="${dnfprog} info" # Show package information
12+alias dnfs="${dnfprog} search" # Search package
13+
14+alias dnfu="sudo ${dnfprog} upgrade" # Upgrade package
15+alias dnfi="sudo ${dnfprog} install" # Install package
16+alias dnfgi="sudo ${dnfprog} groupinstall" # Install package group
17+alias dnfr="sudo ${dnfprog} remove" # Remove package
18+alias dnfgr="sudo ${dnfprog} groupremove" # Remove package group
19+alias dnfc="sudo ${dnfprog} clean all" # Clean cache
+51-0.oh-my-zsh/plugins/dnote/README.md
@@ -0,0 +1,51 @@
1+# Dnote Plugin
2+
3+This plugin adds auto-completion for [Dnote](https://www.getdnote.com/), a simple command line notebook.
4+
5+To use it, add `dnote` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(dnote)
9+```
10+
11+## Usage
12+
13+At the basic level, this plugin completes all Dnote commands.
14+
15+```zsh
16+$ dnote a(press <TAB> here)
17+```
18+
19+would result in:
20+
21+```zsh
22+$ dnote add
23+```
24+
25+For some commands, this plugin dynamically suggests matching book names.
26+
27+For instance, if you have three books that begin with 'j': 'javascript', 'job', 'js',
28+
29+```zsh
30+$ dnote view j(press <TAB> here)
31+```
32+
33+would result in:
34+
35+```zsh
36+$ dnote v j
37+javascript job js
38+```
39+
40+As another example,
41+
42+```zsh
43+$ dnote edit ja(press <TAB> here)
44+```
45+
46+would result in:
47+
48+
49+```zsh
50+$ dnote v javascript
51+``````
+39-0.oh-my-zsh/plugins/dnote/_dnote
@@ -0,0 +1,39 @@
1+#compdef dnote
2+
3+local -a _1st_arguments
4+
5+_1st_arguments=(
6+ 'add:add a new note'
7+ 'view:list books, notes, or view a content'
8+ 'edit:edit a note or a book'
9+ 'remove:remove a note or a book'
10+ 'find:find notes by keywords'
11+ 'sync:sync data with the server'
12+ 'login:login to the dnote server'
13+ 'logout:logout from the dnote server'
14+ 'version:print the current version'
15+ 'help:get help about any command'
16+)
17+
18+get_booknames() {
19+ local names=$(dnote view --name-only)
20+ local -a ret
21+
22+ while read -r line; do
23+ ret+=("${line}")
24+ done <<< "$names"
25+
26+ echo "$ret"
27+}
28+
29+if (( CURRENT == 2 )); then
30+ _describe -t commands "dnote subcommand" _1st_arguments
31+ return
32+elif (( CURRENT == 3 )); then
33+ case "$words[2]" in
34+ v|view|a|add)
35+ _alternative \
36+ "names:book names:($(get_booknames))"
37+ esac
38+fi
39+
+34-0.oh-my-zsh/plugins/docker-compose/README.md
@@ -0,0 +1,34 @@
1+# Docker-compose
2+
3+This plugin provides completion for [docker-compose](https://docs.docker.com/compose/) as well as some
4+aliases for frequent docker-compose commands.
5+
6+To use it, add docker-compose to the plugins array of your zshrc file:
7+
8+```zsh
9+plugins=(... docker-compose)
10+```
11+
12+## Aliases
13+
14+| Alias | Command | Description |
15+|-----------|----------------------------------|----------------------------------------------------------------------------------|
16+| dco | `docker-compose` | Docker-compose main command |
17+| dcb | `docker-compose build` | Build containers |
18+| dce | `docker-compose exec` | Execute command inside a container |
19+| dcps | `docker-compose ps` | List containers |
20+| dcrestart | `docker-compose restart` | Restart container |
21+| dcrm | `docker-compose rm` | Remove container |
22+| dcr | `docker-compose run` | Run a command in container |
23+| dcstop | `docker-compose stop` | Stop a container |
24+| dcup | `docker-compose up` | Build, (re)create, start, and attach to containers for a service |
25+| dcupb | `docker-compose up --build` | Same as `dcup`, but build images before starting containers |
26+| dcupd | `docker-compose up -d` | Same as `dcup`, but starts as daemon |
27+| dcupdb | `docker-compose up -d --build` | Same as `dcup`, but build images before starting containers and starts as daemon |
28+| dcdn | `docker-compose down` | Stop and remove containers |
29+| dcl | `docker-compose logs` | Show logs of container |
30+| dclf | `docker-compose logs -f` | Show logs and follow output |
31+| dclF | `docker-compose logs -f --tail0` | Just follow recent logs |
32+| dcpull | `docker-compose pull` | Pull image of a service |
33+| dcstart | `docker-compose start` | Start a container |
34+| dck | `docker-compose kill` | Kills containers |
+421-0.oh-my-zsh/plugins/docker-compose/_docker-compose
@@ -0,0 +1,421 @@
1+#compdef docker-compose
2+
3+# Description
4+# -----------
5+# zsh completion for docker-compose
6+# -------------------------------------------------------------------------
7+# Authors
8+# -------
9+# * Steve Durrheimer <s.durrheimer@gmail.com>
10+# -------------------------------------------------------------------------
11+# Inspiration
12+# -----------
13+# * @albers docker-compose bash completion script
14+# * @felixr docker zsh completion script : https://github.com/felixr/docker-zsh-completion
15+# -------------------------------------------------------------------------
16+
17+__docker-compose_q() {
18+ docker-compose 2>/dev/null $compose_options "$@"
19+}
20+
21+# All services defined in docker-compose.yml
22+__docker-compose_all_services_in_compose_file() {
23+ local already_selected
24+ local -a services
25+ already_selected=$(echo $words | tr " " "|")
26+ __docker-compose_q ps --services "$@" \
27+ | grep -Ev "^(${already_selected})$"
28+}
29+
30+# All services, even those without an existing container
31+__docker-compose_services_all() {
32+ [[ $PREFIX = -* ]] && return 1
33+ integer ret=1
34+ services=$(__docker-compose_all_services_in_compose_file "$@")
35+ _alternative "args:services:($services)" && ret=0
36+
37+ return ret
38+}
39+
40+# All services that are defined by a Dockerfile reference
41+__docker-compose_services_from_build() {
42+ [[ $PREFIX = -* ]] && return 1
43+ __docker-compose_services_all --filter source=build
44+}
45+
46+# All services that are defined by an image
47+__docker-compose_services_from_image() {
48+ [[ $PREFIX = -* ]] && return 1
49+ __docker-compose_services_all --filter source=image
50+}
51+
52+__docker-compose_pausedservices() {
53+ [[ $PREFIX = -* ]] && return 1
54+ __docker-compose_services_all --filter status=paused
55+}
56+
57+__docker-compose_stoppedservices() {
58+ [[ $PREFIX = -* ]] && return 1
59+ __docker-compose_services_all --filter status=stopped
60+}
61+
62+__docker-compose_runningservices() {
63+ [[ $PREFIX = -* ]] && return 1
64+ __docker-compose_services_all --filter status=running
65+}
66+
67+__docker-compose_services() {
68+ [[ $PREFIX = -* ]] && return 1
69+ __docker-compose_services_all
70+}
71+
72+__docker-compose_caching_policy() {
73+ oldp=( "$1"(Nmh+1) ) # 1 hour
74+ (( $#oldp ))
75+}
76+
77+__docker-compose_commands() {
78+ local cache_policy
79+
80+ zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
81+ if [[ -z "$cache_policy" ]]; then
82+ zstyle ":completion:${curcontext}:" cache-policy __docker-compose_caching_policy
83+ fi
84+
85+ if ( [[ ${+_docker_compose_subcommands} -eq 0 ]] || _cache_invalid docker_compose_subcommands) \
86+ && ! _retrieve_cache docker_compose_subcommands;
87+ then
88+ local -a lines
89+ lines=(${(f)"$(_call_program commands docker-compose 2>&1)"})
90+ _docker_compose_subcommands=(${${${lines[$((${lines[(i)Commands:]} + 1)),${lines[(I) *]}]}## #}/ ##/:})
91+ (( $#_docker_compose_subcommands > 0 )) && _store_cache docker_compose_subcommands _docker_compose_subcommands
92+ fi
93+ _describe -t docker-compose-commands "docker-compose command" _docker_compose_subcommands
94+}
95+
96+__docker-compose_subcommand() {
97+ local opts_help opts_force_recreate opts_no_recreate opts_no_build opts_remove_orphans opts_timeout opts_no_color opts_no_deps
98+
99+ opts_help='(: -)--help[Print usage]'
100+ opts_force_recreate="(--no-recreate)--force-recreate[Recreate containers even if their configuration and image haven't changed. Incompatible with --no-recreate.]"
101+ opts_no_recreate="(--force-recreate)--no-recreate[If containers already exist, don't recreate them. Incompatible with --force-recreate.]"
102+ opts_no_build="(--build)--no-build[Don't build an image, even if it's missing.]"
103+ opts_remove_orphans="--remove-orphans[Remove containers for services not defined in the Compose file]"
104+ opts_timeout=('(-t --timeout)'{-t,--timeout}"[Specify a shutdown timeout in seconds. (default: 10)]:seconds: ")
105+ opts_no_color='--no-color[Produce monochrome output.]'
106+ opts_no_deps="--no-deps[Don't start linked services.]"
107+
108+ integer ret=1
109+
110+ case "$words[1]" in
111+ (build)
112+ _arguments \
113+ $opts_help \
114+ "*--build-arg=[Set build-time variables for one service.]:<varname>=<value>: " \
115+ '--force-rm[Always remove intermediate containers.]' \
116+ '(--quiet -q)'{--quiet,-q}'[Curb build output]' \
117+ '(--memory -m)'{--memory,-m}'[Memory limit for the build container.]' \
118+ '--no-cache[Do not use cache when building the image.]' \
119+ '--pull[Always attempt to pull a newer version of the image.]' \
120+ '--compress[Compress the build context using gzip.]' \
121+ '--parallel[Build images in parallel.]' \
122+ '*:services:__docker-compose_services_from_build' && ret=0
123+ ;;
124+ (config)
125+ _arguments \
126+ $opts_help \
127+ '(--quiet -q)'{--quiet,-q}"[Only validate the configuration, don't print anything.]" \
128+ '--resolve-image-digests[Pin image tags to digests.]' \
129+ '--services[Print the service names, one per line.]' \
130+ '--volumes[Print the volume names, one per line.]' \
131+ '--hash[Print the service config hash, one per line. Set "service1,service2" for a list of specified services.]' && ret=0
132+ ;;
133+ (create)
134+ _arguments \
135+ $opts_help \
136+ $opts_force_recreate \
137+ $opts_no_recreate \
138+ $opts_no_build \
139+ "(--no-build)--build[Build images before creating containers.]" \
140+ '*:services:__docker-compose_services' && ret=0
141+ ;;
142+ (down)
143+ _arguments \
144+ $opts_help \
145+ $opts_timeout \
146+ "--rmi[Remove images. Type must be one of: 'all': Remove all images used by any service. 'local': Remove only images that don't have a custom tag set by the \`image\` field.]:type:(all local)" \
147+ '(-v --volumes)'{-v,--volumes}"[Remove named volumes declared in the \`volumes\` section of the Compose file and anonymous volumes attached to containers.]" \
148+ $opts_remove_orphans && ret=0
149+ ;;
150+ (events)
151+ _arguments \
152+ $opts_help \
153+ '--json[Output events as a stream of json objects]' \
154+ '*:services:__docker-compose_services' && ret=0
155+ ;;
156+ (exec)
157+ _arguments \
158+ $opts_help \
159+ '-d[Detached mode: Run command in the background.]' \
160+ '--privileged[Give extended privileges to the process.]' \
161+ '(-u --user)'{-u,--user=}'[Run the command as this user.]:username:_users' \
162+ '-T[Disable pseudo-tty allocation. By default `docker-compose exec` allocates a TTY.]' \
163+ '--index=[Index of the container if there are multiple instances of a service \[default: 1\]]:index: ' \
164+ '*'{-e,--env}'[KEY=VAL Set an environment variable (can be used multiple times)]:environment variable KEY=VAL: ' \
165+ '(-w --workdir)'{-w,--workdir=}'[Working directory inside the container]:workdir: ' \
166+ '(-):running services:__docker-compose_runningservices' \
167+ '(-):command: _command_names -e' \
168+ '*::arguments: _normal' && ret=0
169+ ;;
170+ (help)
171+ _arguments ':subcommand:__docker-compose_commands' && ret=0
172+ ;;
173+ (images)
174+ _arguments \
175+ $opts_help \
176+ '-q[Only display IDs]' \
177+ '*:services:__docker-compose_services' && ret=0
178+ ;;
179+ (kill)
180+ _arguments \
181+ $opts_help \
182+ '-s[SIGNAL to send to the container. Default signal is SIGKILL.]:signal:_signals' \
183+ '*:running services:__docker-compose_runningservices' && ret=0
184+ ;;
185+ (logs)
186+ _arguments \
187+ $opts_help \
188+ '(-f --follow)'{-f,--follow}'[Follow log output]' \
189+ $opts_no_color \
190+ '--tail=[Number of lines to show from the end of the logs for each container.]:number of lines: ' \
191+ '(-t --timestamps)'{-t,--timestamps}'[Show timestamps]' \
192+ '*:services:__docker-compose_services' && ret=0
193+ ;;
194+ (pause)
195+ _arguments \
196+ $opts_help \
197+ '*:running services:__docker-compose_runningservices' && ret=0
198+ ;;
199+ (port)
200+ _arguments \
201+ $opts_help \
202+ '--protocol=[tcp or udp \[default: tcp\]]:protocol:(tcp udp)' \
203+ '--index=[index of the container if there are multiple instances of a service \[default: 1\]]:index: ' \
204+ '1:running services:__docker-compose_runningservices' \
205+ '2:port:_ports' && ret=0
206+ ;;
207+ (ps)
208+ _arguments \
209+ $opts_help \
210+ '-q[Only display IDs]' \
211+ '--filter KEY=VAL[Filter services by a property]:<filtername>=<value>:' \
212+ '*:services:__docker-compose_services' && ret=0
213+ ;;
214+ (pull)
215+ _arguments \
216+ $opts_help \
217+ '--ignore-pull-failures[Pull what it can and ignores images with pull failures.]' \
218+ '--no-parallel[Disable parallel pulling]' \
219+ '(-q --quiet)'{-q,--quiet}'[Pull without printing progress information]' \
220+ '--include-deps[Also pull services declared as dependencies]' \
221+ '*:services:__docker-compose_services_from_image' && ret=0
222+ ;;
223+ (push)
224+ _arguments \
225+ $opts_help \
226+ '--ignore-push-failures[Push what it can and ignores images with push failures.]' \
227+ '*:services:__docker-compose_services' && ret=0
228+ ;;
229+ (rm)
230+ _arguments \
231+ $opts_help \
232+ '(-f --force)'{-f,--force}"[Don't ask to confirm removal]" \
233+ '-v[Remove any anonymous volumes attached to containers]' \
234+ '*:stopped services:__docker-compose_stoppedservices' && ret=0
235+ ;;
236+ (run)
237+ _arguments \
238+ $opts_help \
239+ $opts_no_deps \
240+ '-d[Detached mode: Run container in the background, print new container name.]' \
241+ '*-e[KEY=VAL Set an environment variable (can be used multiple times)]:environment variable KEY=VAL: ' \
242+ '*'{-l,--label}'[KEY=VAL Add or override a label (can be used multiple times)]:label KEY=VAL: ' \
243+ '--entrypoint[Overwrite the entrypoint of the image.]:entry point: ' \
244+ '--name=[Assign a name to the container]:name: ' \
245+ '(-p --publish)'{-p,--publish=}"[Publish a container's port(s) to the host]" \
246+ '--rm[Remove container after run. Ignored in detached mode.]' \
247+ "--service-ports[Run command with the service's ports enabled and mapped to the host.]" \
248+ '-T[Disable pseudo-tty allocation. By default `docker-compose run` allocates a TTY.]' \
249+ '(-u --user)'{-u,--user=}'[Run as specified username or uid]:username or uid:_users' \
250+ '(-v --volume)*'{-v,--volume=}'[Bind mount a volume]:volume: ' \
251+ '(-w --workdir)'{-w,--workdir=}'[Working directory inside the container]:workdir: ' \
252+ "--use-aliases[Use the services network aliases in the network(s) the container connects to]" \
253+ '(-):services:__docker-compose_services' \
254+ '(-):command: _command_names -e' \
255+ '*::arguments: _normal' && ret=0
256+ ;;
257+ (scale)
258+ _arguments \
259+ $opts_help \
260+ $opts_timeout \
261+ '*:running services:__docker-compose_runningservices' && ret=0
262+ ;;
263+ (start)
264+ _arguments \
265+ $opts_help \
266+ '*:stopped services:__docker-compose_stoppedservices' && ret=0
267+ ;;
268+ (stop|restart)
269+ _arguments \
270+ $opts_help \
271+ $opts_timeout \
272+ '*:running services:__docker-compose_runningservices' && ret=0
273+ ;;
274+ (top)
275+ _arguments \
276+ $opts_help \
277+ '*:running services:__docker-compose_runningservices' && ret=0
278+ ;;
279+ (unpause)
280+ _arguments \
281+ $opts_help \
282+ '*:paused services:__docker-compose_pausedservices' && ret=0
283+ ;;
284+ (up)
285+ _arguments \
286+ $opts_help \
287+ '(--abort-on-container-exit)-d[Detached mode: Run containers in the background, print new container names. Incompatible with --abort-on-container-exit and --attach-dependencies.]' \
288+ $opts_no_color \
289+ $opts_no_deps \
290+ $opts_force_recreate \
291+ $opts_no_recreate \
292+ $opts_no_build \
293+ "(--no-build)--build[Build images before starting containers.]" \
294+ "(-d)--abort-on-container-exit[Stops all containers if any container was stopped. Incompatible with -d.]" \
295+ "(-d)--attach-dependencies[Attach to dependent containers. Incompatible with -d.]" \
296+ '(-t --timeout)'{-t,--timeout}"[Use this timeout in seconds for container shutdown when attached or when containers are already running. (default: 10)]:seconds: " \
297+ '--scale[SERVICE=NUM Scale SERVICE to NUM instances. Overrides the `scale` setting in the Compose file if present.]:service scale SERVICE=NUM: ' \
298+ '--exit-code-from=[Return the exit code of the selected service container. Implies --abort-on-container-exit]:service:__docker-compose_services' \
299+ $opts_remove_orphans \
300+ '*:services:__docker-compose_services' && ret=0
301+ ;;
302+ (version)
303+ _arguments \
304+ $opts_help \
305+ "--short[Shows only Compose's version number.]" && ret=0
306+ ;;
307+ (*)
308+ _message 'Unknown sub command' && ret=1
309+ ;;
310+ esac
311+
312+ return ret
313+}
314+
315+_docker-compose() {
316+ # Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`.
317+ # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`.
318+ if [[ $service != docker-compose ]]; then
319+ _call_function - _$service
320+ return
321+ fi
322+
323+ local curcontext="$curcontext" state line
324+ integer ret=1
325+ typeset -A opt_args
326+
327+ local file_description
328+
329+ if [[ -n ${words[(r)-f]} || -n ${words[(r)--file]} ]] ; then
330+ file_description="Specify an override docker-compose file (default: docker-compose.override.yml)"
331+ else
332+ file_description="Specify an alternate docker-compose file (default: docker-compose.yml)"
333+ fi
334+
335+ _arguments -C \
336+ '(- :)'{-h,--help}'[Get help]' \
337+ '*'{-f,--file}"[${file_description}]:file:_files -g '*.yml'" \
338+ '(-p --project-name)'{-p,--project-name}'[Specify an alternate project name (default: directory name)]:project name:' \
339+ '--env-file[Specify an alternate environment file (default: .env)]:env-file:_files' \
340+ "--compatibility[If set, Compose will attempt to convert keys in v3 files to their non-Swarm equivalent]" \
341+ '(- :)'{-v,--version}'[Print version and exit]' \
342+ '--verbose[Show more output]' \
343+ '--log-level=[Set log level]:level:(DEBUG INFO WARNING ERROR CRITICAL)' \
344+ '--no-ansi[Do not print ANSI control characters]' \
345+ '--ansi=[Control when to print ANSI control characters]:when:(never always auto)' \
346+ '(-H --host)'{-H,--host}'[Daemon socket to connect to]:host:' \
347+ '--tls[Use TLS; implied by --tlsverify]' \
348+ '--tlscacert=[Trust certs signed only by this CA]:ca path:' \
349+ '--tlscert=[Path to TLS certificate file]:client cert path:' \
350+ '--tlskey=[Path to TLS key file]:tls key path:' \
351+ '--tlsverify[Use TLS and verify the remote]' \
352+ "--skip-hostname-check[Don't check the daemon's hostname against the name specified in the client certificate (for example if your docker host is an IP address)]" \
353+ '(-): :->command' \
354+ '(-)*:: :->option-or-argument' && ret=0
355+
356+ local -a relevant_compose_flags relevant_compose_repeatable_flags relevant_docker_flags compose_options docker_options
357+
358+ relevant_compose_flags=(
359+ "--env-file"
360+ "--file" "-f"
361+ "--host" "-H"
362+ "--project-name" "-p"
363+ "--tls"
364+ "--tlscacert"
365+ "--tlscert"
366+ "--tlskey"
367+ "--tlsverify"
368+ "--skip-hostname-check"
369+ )
370+
371+ relevant_compose_repeatable_flags=(
372+ "--file" "-f"
373+ )
374+
375+ relevant_docker_flags=(
376+ "--host" "-H"
377+ "--tls"
378+ "--tlscacert"
379+ "--tlscert"
380+ "--tlskey"
381+ "--tlsverify"
382+ )
383+
384+ for k in "${(@k)opt_args}"; do
385+ if [[ -n "${relevant_docker_flags[(r)$k]}" ]]; then
386+ docker_options+=$k
387+ if [[ -n "$opt_args[$k]" ]]; then
388+ docker_options+=$opt_args[$k]
389+ fi
390+ fi
391+ if [[ -n "${relevant_compose_flags[(r)$k]}" ]]; then
392+ if [[ -n "${relevant_compose_repeatable_flags[(r)$k]}" ]]; then
393+ values=("${(@s/:/)opt_args[$k]}")
394+ for value in $values
395+ do
396+ compose_options+=$k
397+ compose_options+=$value
398+ done
399+ else
400+ compose_options+=$k
401+ if [[ -n "$opt_args[$k]" ]]; then
402+ compose_options+=$opt_args[$k]
403+ fi
404+ fi
405+ fi
406+ done
407+
408+ case $state in
409+ (command)
410+ __docker-compose_commands && ret=0
411+ ;;
412+ (option-or-argument)
413+ curcontext=${curcontext%:*:*}:docker-compose-$words[1]:
414+ __docker-compose_subcommand && ret=0
415+ ;;
416+ esac
417+
418+ return ret
419+}
420+
421+_docker-compose "$@"
+27-0.oh-my-zsh/plugins/docker-compose/docker-compose.plugin.zsh
@@ -0,0 +1,27 @@
1+# Support Compose v2 as docker CLI plugin
2+#
3+# This tests that the (old) docker-compose command is in $PATH and that
4+# it resolves to an existing executable file if it's a symlink.
5+[[ -x "${commands[docker-compose]:A}" ]] && dccmd='docker-compose' || dccmd='docker compose'
6+
7+alias dco="$dccmd"
8+alias dcb="$dccmd build"
9+alias dce="$dccmd exec"
10+alias dcps="$dccmd ps"
11+alias dcrestart="$dccmd restart"
12+alias dcrm="$dccmd rm"
13+alias dcr="$dccmd run"
14+alias dcstop="$dccmd stop"
15+alias dcup="$dccmd up"
16+alias dcupb="$dccmd up --build"
17+alias dcupd="$dccmd up -d"
18+alias dcupdb="$dccmd up -d --build"
19+alias dcdn="$dccmd down"
20+alias dcl="$dccmd logs"
21+alias dclf="$dccmd logs -f"
22+alias dclF="$dccmd logs -f --tail 0"
23+alias dcpull="$dccmd pull"
24+alias dcstart="$dccmd start"
25+alias dck="$dccmd kill"
26+
27+unset dccmd
+86-0.oh-my-zsh/plugins/docker/README.md
@@ -0,0 +1,86 @@
1+# Docker plugin
2+
3+This plugin adds auto-completion and aliases for [docker](https://www.docker.com/).
4+
5+To use it add `docker` to the plugins array in your zshrc file.
6+
7+```zsh
8+plugins=(... docker)
9+```
10+
11+A copy of the completion script from the docker/cli git repo:
12+https://github.com/docker/cli/blob/master/contrib/completion/zsh/_docker
13+
14+## Settings
15+
16+By default, the completion doesn't allow option-stacking, meaning if you try to complete
17+`docker run -it <TAB>` it won't work, because you're _stacking_ the `-i` and `-t` options.
18+
19+[You can enable it](https://github.com/docker/cli/commit/b10fb43048) by **adding the lines below to your zshrc
20+file**, but be aware of the side effects:
21+
22+> This enables Zsh to understand commands like `docker run -it ubuntu`. However, by enabling this, this also
23+> makes Zsh complete `docker run -u<tab>` with `docker run -uapprox` which is not valid. The users have to put
24+> the space or the equal sign themselves before trying to complete.
25+>
26+> Therefore, this behavior is disabled by default. To enable it:
27+>
28+> ```sh
29+> zstyle ':completion:*:*:docker:*' option-stacking yes
30+> zstyle ':completion:*:*:docker-*:*' option-stacking yes
31+> ```
32+
33+### Use old-style completion
34+
35+If the current completion does not work well for you, you can enable legacy completion instead with the
36+following setting. See https://github.com/ohmyzsh/ohmyzsh/issues/11789 for more information.
37+
38+```zsh
39+zstyle ':omz:plugins:docker' legacy-completion yes
40+```
41+
42+### For Podman's Docker wrapper users
43+
44+If you use Podman's Docker wrapper, you need to enable legacy completion. See above section.
45+
46+## Aliases
47+
48+| Alias | Command | Description |
49+| :------ | :---------------------------- | :--------------------------------------------------------------------------------------- |
50+| dbl | `docker build` | Build an image from a Dockerfile |
51+| dcin | `docker container inspect` | Display detailed information on one or more containers |
52+| dcls | `docker container ls` | List all the running docker containers |
53+| dclsa | `docker container ls -a` | List all running and stopped containers |
54+| dib | `docker image build` | Build an image from a Dockerfile (same as docker build) |
55+| dii | `docker image inspect` | Display detailed information on one or more images |
56+| dils | `docker image ls` | List docker images |
57+| dipu | `docker image push` | Push an image or repository to a remote registry |
58+| dipru | `docker image prune -a` | Remove all images not referenced by any container |
59+| dirm | `docker image rm` | Remove one or more images |
60+| dit | `docker image tag` | Add a name and tag to a particular image |
61+| dlo | `docker container logs` | Fetch the logs of a docker container |
62+| dnc | `docker network create` | Create a new network |
63+| dncn | `docker network connect` | Connect a container to a network |
64+| dndcn | `docker network disconnect` | Disconnect a container from a network |
65+| dni | `docker network inspect` | Return information about one or more networks |
66+| dnls | `docker network ls` | List all networks the engine daemon knows about, including those spanning multiple hosts |
67+| dnrm | `docker network rm` | Remove one or more networks |
68+| dpo | `docker container port` | List port mappings or a specific mapping for the container |
69+| dps | `docker ps` | List all the running docker containers |
70+| dpsa | `docker ps -a` | List all running and stopped containers |
71+| dpu | `docker pull` | Pull an image or a repository from a registry |
72+| dr | `docker container run` | Create a new container and start it using the specified command |
73+| drit | `docker container run -it` | Create a new container and start it in an interactive shell |
74+| drm | `docker container rm` | Remove the specified container(s) |
75+| drm! | `docker container rm -f` | Force the removal of a running container (uses SIGKILL) |
76+| dst | `docker container start` | Start one or more stopped containers |
77+| drs | `docker container restart` | Restart one or more containers |
78+| dsta | `docker stop $(docker ps -q)` | Stop all running containers |
79+| dstp | `docker container stop` | Stop one or more running containers |
80+| dsts | `docker stats` | Display real-time streaming statistics for containers |
81+| dtop | `docker top` | Display the running processes of a container |
82+| dvi | `docker volume inspect` | Display detailed information about one or more volumes |
83+| dvls | `docker volume ls` | List all the volumes known to docker |
84+| dvprune | `docker volume prune` | Cleanup dangling volumes |
85+| dxc | `docker container exec` | Run a new command in a running container |
86+| dxcit | `docker container exec -it` | Run a new command in a running container in an interactive shell |
+3126-0.oh-my-zsh/plugins/docker/completions/_docker
@@ -0,0 +1,3126 @@
1+#compdef docker dockerd
2+#
3+# zsh completion for docker (http://docker.com)
4+#
5+# version: 0.3.0
6+# github: https://github.com/felixr/docker-zsh-completion
7+#
8+# contributors:
9+# - Felix Riedel
10+# - Steve Durrheimer
11+# - Vincent Bernat
12+# - Rohan Verma
13+#
14+# license:
15+#
16+# Copyright (c) 2013, Felix Riedel
17+# All rights reserved.
18+#
19+# Redistribution and use in source and binary forms, with or without
20+# modification, are permitted provided that the following conditions are met:
21+# * Redistributions of source code must retain the above copyright
22+# notice, this list of conditions and the following disclaimer.
23+# * Redistributions in binary form must reproduce the above copyright
24+# notice, this list of conditions and the following disclaimer in the
25+# documentation and/or other materials provided with the distribution.
26+# * Neither the name of the <organization> nor the
27+# names of its contributors may be used to endorse or promote products
28+# derived from this software without specific prior written permission.
29+#
30+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
31+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
32+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
33+# DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
34+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
35+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
36+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
37+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
38+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
39+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40+#
41+
42+# Short-option stacking can be enabled with:
43+# zstyle ':completion:*:*:docker:*' option-stacking yes
44+# zstyle ':completion:*:*:docker-*:*' option-stacking yes
45+__docker_arguments() {
46+ if zstyle -t ":completion:${curcontext}:" option-stacking; then
47+ print -- -s
48+ fi
49+}
50+
51+__docker_get_containers() {
52+ [[ $PREFIX = -* ]] && return 1
53+ integer ret=1
54+ local kind type line s
55+ declare -a running stopped lines args names
56+
57+ kind=$1; shift
58+ type=$1; shift
59+ [[ $kind = (stopped|all) ]] && args=($args -a)
60+
61+ lines=(${(f)${:-"$(_call_program commands docker $docker_options ps --format 'table' --no-trunc $args)"$'\n'}})
62+
63+ # Parse header line to find columns
64+ local i=1 j=1 k header=${lines[1]}
65+ declare -A begin end
66+ while (( j < ${#header} - 1 )); do
67+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
68+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
69+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
70+ begin[${header[$i,$((j-1))]}]=$i
71+ end[${header[$i,$((j-1))]}]=$k
72+ done
73+ end[${header[$i,$((j-1))]}]=-1 # Last column, should go to the end of the line
74+ lines=(${lines[2,-1]})
75+
76+ # Container ID
77+ if [[ $type = (ids|all) ]]; then
78+ for line in $lines; do
79+ s="${${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}[0,12]}"
80+ s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}"
81+ s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}"
82+ if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = (Exit*|Created*) ]]; then
83+ stopped=($stopped $s)
84+ else
85+ running=($running $s)
86+ fi
87+ done
88+ fi
89+
90+ # Names: we only display the one without slash. All other names
91+ # are generated and may clutter the completion. However, with
92+ # Swarm, all names may be prefixed by the swarm node name.
93+ if [[ $type = (names|all) ]]; then
94+ for line in $lines; do
95+ names=(${(ps:,:)${${line[${begin[NAMES]},${end[NAMES]}]}%% *}})
96+ # First step: find a common prefix and strip it (swarm node case)
97+ (( ${#${(u)names%%/*}} == 1 )) && names=${names#${names[1]%%/*}/}
98+ # Second step: only keep the first name without a /
99+ s=${${names:#*/*}[1]}
100+ # If no name, well give up.
101+ (( $#s != 0 )) || continue
102+ s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}"
103+ s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}"
104+ if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = (Exit*|Created*) ]]; then
105+ stopped=($stopped $s)
106+ else
107+ running=($running $s)
108+ fi
109+ done
110+ fi
111+
112+ [[ $kind = (running|all) ]] && _describe -t containers-running "running containers" running "$@" && ret=0
113+ [[ $kind = (stopped|all) ]] && _describe -t containers-stopped "stopped containers" stopped "$@" && ret=0
114+ return ret
115+}
116+
117+__docker_complete_stopped_containers() {
118+ [[ $PREFIX = -* ]] && return 1
119+ __docker_get_containers stopped all "$@"
120+}
121+
122+__docker_complete_running_containers() {
123+ [[ $PREFIX = -* ]] && return 1
124+ __docker_get_containers running all "$@"
125+}
126+
127+__docker_complete_containers() {
128+ [[ $PREFIX = -* ]] && return 1
129+ __docker_get_containers all all "$@"
130+}
131+
132+__docker_complete_containers_ids() {
133+ [[ $PREFIX = -* ]] && return 1
134+ __docker_get_containers all ids "$@"
135+}
136+
137+__docker_complete_containers_names() {
138+ [[ $PREFIX = -* ]] && return 1
139+ __docker_get_containers all names "$@"
140+}
141+
142+__docker_complete_info_plugins() {
143+ [[ $PREFIX = -* ]] && return 1
144+ integer ret=1
145+ emulate -L zsh
146+ setopt extendedglob
147+ local -a plugins
148+ plugins=(${(ps: :)${(M)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Plugins:}%%$'\n'^ *}}:# $1: *}## $1: })
149+ _describe -t plugins "$1 plugins" plugins && ret=0
150+ return ret
151+}
152+
153+__docker_complete_images() {
154+ [[ $PREFIX = -* ]] && return 1
155+ integer ret=1
156+ declare -a images
157+ images=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/(#b)([^ ]##) ##([^ ]##) ##([^ ]##)*/${match[3]}:${(r:15:: :::)match[2]} in ${match[1]}})
158+ _describe -t docker-images "images" images && ret=0
159+ __docker_complete_repositories_with_tags && ret=0
160+ return ret
161+}
162+
163+__docker_complete_repositories() {
164+ [[ $PREFIX = -* ]] && return 1
165+ integer ret=1
166+ declare -a repos
167+ repos=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}%% *}[2,-1]})
168+ repos=(${repos#<none>})
169+ _describe -t docker-repos "repositories" repos && ret=0
170+ return ret
171+}
172+
173+__docker_complete_repositories_with_tags() {
174+ [[ $PREFIX = -* ]] && return 1
175+ integer ret=1
176+ declare -a repos onlyrepos matched
177+ declare m
178+ repos=(${${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/ ##/:::}%% *})
179+ repos=(${${repos%:::<none>}#<none>})
180+ # Check if we have a prefix-match for the current prefix.
181+ onlyrepos=(${repos%::*})
182+ for m in $onlyrepos; do
183+ [[ ${PREFIX##${~~m}} != ${PREFIX} ]] && {
184+ # Yes, complete with tags
185+ repos=(${${repos/:::/:}/:/\\:})
186+ _describe -t docker-repos-with-tags "repositories with tags" repos && ret=0
187+ return ret
188+ }
189+ done
190+ # No, only complete repositories
191+ onlyrepos=(${${repos%:::*}/:/\\:})
192+ _describe -t docker-repos "repositories" onlyrepos -qS : && ret=0
193+
194+ return ret
195+}
196+
197+__docker_search() {
198+ [[ $PREFIX = -* ]] && return 1
199+ local cache_policy
200+ zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
201+ if [[ -z "$cache_policy" ]]; then
202+ zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy
203+ fi
204+
205+ local searchterm cachename
206+ searchterm="${words[$CURRENT]%/}"
207+ cachename=_docker-search-$searchterm
208+
209+ local expl
210+ local -a result
211+ if ( [[ ${(P)+cachename} -eq 0 ]] || _cache_invalid ${cachename#_} ) \
212+ && ! _retrieve_cache ${cachename#_}; then
213+ _message "Searching for ${searchterm}..."
214+ result=(${${${(f)${:-"$(_call_program commands docker $docker_options search $searchterm)"$'\n'}}%% *}[2,-1]})
215+ _store_cache ${cachename#_} result
216+ fi
217+ _wanted dockersearch expl 'available images' compadd -a result
218+}
219+
220+__docker_get_log_options() {
221+ [[ $PREFIX = -* ]] && return 1
222+
223+ integer ret=1
224+ local log_driver=${opt_args[--log-driver]:-"all"}
225+ local -a common_options common_options2 awslogs_options fluentd_options gelf_options journald_options json_file_options logentries_options syslog_options splunk_options
226+
227+ common_options=("max-buffer-size" "mode")
228+ common_options2=("env" "env-regex" "labels")
229+ awslogs_options=($common_options "awslogs-create-group" "awslogs-datetime-format" "awslogs-group" "awslogs-multiline-pattern" "awslogs-region" "awslogs-stream" "tag")
230+ fluentd_options=($common_options $common_options2 "fluentd-address" "fluentd-async-connect" "fluentd-buffer-limit" "fluentd-retry-wait" "fluentd-max-retries" "fluentd-sub-second-precision" "tag")
231+ gcplogs_options=($common_options $common_options2 "gcp-log-cmd" "gcp-meta-id" "gcp-meta-name" "gcp-meta-zone" "gcp-project")
232+ gelf_options=($common_options $common_options2 "gelf-address" "gelf-compression-level" "gelf-compression-type" "tag")
233+ journald_options=($common_options $common_options2 "tag")
234+ json_file_options=($common_options $common_options2 "max-file" "max-size")
235+ logentries_options=($common_options $common_options2 "logentries-token" "tag")
236+ syslog_options=($common_options $common_options2 "syslog-address" "syslog-facility" "syslog-format" "syslog-tls-ca-cert" "syslog-tls-cert" "syslog-tls-key" "syslog-tls-skip-verify" "tag")
237+ splunk_options=($common_options $common_options2 "splunk-caname" "splunk-capath" "splunk-format" "splunk-gzip" "splunk-gzip-level" "splunk-index" "splunk-insecureskipverify" "splunk-source" "splunk-sourcetype" "splunk-token" "splunk-url" "splunk-verify-connection" "tag")
238+
239+ [[ $log_driver = (awslogs|all) ]] && _describe -t awslogs-options "awslogs options" awslogs_options "$@" && ret=0
240+ [[ $log_driver = (fluentd|all) ]] && _describe -t fluentd-options "fluentd options" fluentd_options "$@" && ret=0
241+ [[ $log_driver = (gcplogs|all) ]] && _describe -t gcplogs-options "gcplogs options" gcplogs_options "$@" && ret=0
242+ [[ $log_driver = (gelf|all) ]] && _describe -t gelf-options "gelf options" gelf_options "$@" && ret=0
243+ [[ $log_driver = (journald|all) ]] && _describe -t journald-options "journald options" journald_options "$@" && ret=0
244+ [[ $log_driver = (json-file|all) ]] && _describe -t json-file-options "json-file options" json_file_options "$@" && ret=0
245+ [[ $log_driver = (logentries|all) ]] && _describe -t logentries-options "logentries options" logentries_options "$@" && ret=0
246+ [[ $log_driver = (syslog|all) ]] && _describe -t syslog-options "syslog options" syslog_options "$@" && ret=0
247+ [[ $log_driver = (splunk|all) ]] && _describe -t splunk-options "splunk options" splunk_options "$@" && ret=0
248+
249+ return ret
250+}
251+
252+__docker_complete_log_drivers() {
253+ [[ $PREFIX = -* ]] && return 1
254+ integer ret=1
255+ drivers=(awslogs etwlogs fluentd gcplogs gelf journald json-file none splunk syslog)
256+ _describe -t log-drivers "log drivers" drivers && ret=0
257+ return ret
258+}
259+
260+__docker_complete_log_options() {
261+ [[ $PREFIX = -* ]] && return 1
262+ integer ret=1
263+
264+ if compset -P '*='; then
265+ case "${${words[-1]%=*}#*=}" in
266+ (syslog-format)
267+ local opts=('rfc3164' 'rfc5424' 'rfc5424micro')
268+ _describe -t syslog-format-opts "syslog format options" opts && ret=0
269+ ;;
270+ (mode)
271+ local opts=('blocking' 'non-blocking')
272+ _describe -t mode-opts "mode options" opts && ret=0
273+ ;;
274+ *)
275+ _message 'value' && ret=0
276+ ;;
277+ esac
278+ else
279+ __docker_get_log_options -qS "=" && ret=0
280+ fi
281+
282+ return ret
283+}
284+
285+__docker_complete_detach_keys() {
286+ [[ $PREFIX = -* ]] && return 1
287+ integer ret=1
288+
289+ compset -P "*,"
290+ keys=(${:-{a-z}})
291+ ctrl_keys=(${:-ctrl-{{a-z},{@,'[','\\','^',']',_}}})
292+ _describe -t detach_keys "[a-z]" keys -qS "," && ret=0
293+ _describe -t detach_keys-ctrl "'ctrl-' + 'a-z @ [ \\\\ ] ^ _'" ctrl_keys -qS "," && ret=0
294+}
295+
296+__docker_complete_pid() {
297+ [[ $PREFIX = -* ]] && return 1
298+ integer ret=1
299+ local -a opts vopts
300+
301+ opts=('host')
302+ vopts=('container')
303+
304+ if compset -P '*:'; then
305+ case "${${words[-1]%:*}#*=}" in
306+ (container)
307+ __docker_complete_running_containers && ret=0
308+ ;;
309+ *)
310+ _message 'value' && ret=0
311+ ;;
312+ esac
313+ else
314+ _describe -t pid-value-opts "PID Options with value" vopts -qS ":" && ret=0
315+ _describe -t pid-opts "PID Options" opts && ret=0
316+ fi
317+
318+ return ret
319+}
320+
321+__docker_complete_runtimes() {
322+ [[ $PREFIX = -* ]] && return 1
323+ integer ret=1
324+
325+ emulate -L zsh
326+ setopt extendedglob
327+ local -a runtimes_opts
328+ runtimes_opts=(${(ps: :)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Runtimes: }%%$'\n'^ *}}})
329+ _describe -t runtimes-opts "runtimes options" runtimes_opts && ret=0
330+}
331+
332+__docker_complete_ps_filters() {
333+ [[ $PREFIX = -* ]] && return 1
334+ integer ret=1
335+
336+ if compset -P '*='; then
337+ case "${${words[-1]%=*}#*=}" in
338+ (ancestor)
339+ __docker_complete_images && ret=0
340+ ;;
341+ (before|since)
342+ __docker_complete_containers && ret=0
343+ ;;
344+ (health)
345+ health_opts=('healthy' 'none' 'starting' 'unhealthy')
346+ _describe -t health-filter-opts "health filter options" health_opts && ret=0
347+ ;;
348+ (id)
349+ __docker_complete_containers_ids && ret=0
350+ ;;
351+ (is-task)
352+ _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0
353+ ;;
354+ (name)
355+ __docker_complete_containers_names && ret=0
356+ ;;
357+ (network)
358+ __docker_complete_networks && ret=0
359+ ;;
360+ (status)
361+ status_opts=('created' 'dead' 'exited' 'paused' 'restarting' 'running' 'removing')
362+ _describe -t status-filter-opts "status filter options" status_opts && ret=0
363+ ;;
364+ (volume)
365+ __docker_complete_volumes && ret=0
366+ ;;
367+ *)
368+ _message 'value' && ret=0
369+ ;;
370+ esac
371+ else
372+ opts=('ancestor' 'before' 'exited' 'expose' 'health' 'id' 'label' 'name' 'network' 'publish' 'since' 'status' 'volume')
373+ _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0
374+ fi
375+
376+ return ret
377+}
378+
379+__docker_complete_search_filters() {
380+ [[ $PREFIX = -* ]] && return 1
381+ integer ret=1
382+ declare -a boolean_opts opts
383+
384+ boolean_opts=('true' 'false')
385+ opts=('is-automated' 'is-official' 'stars')
386+
387+ if compset -P '*='; then
388+ case "${${words[-1]%=*}#*=}" in
389+ (is-automated|is-official)
390+ _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0
391+ ;;
392+ *)
393+ _message 'value' && ret=0
394+ ;;
395+ esac
396+ else
397+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
398+ fi
399+
400+ return ret
401+}
402+
403+__docker_complete_images_filters() {
404+ [[ $PREFIX = -* ]] && return 1
405+ integer ret=1
406+ declare -a boolean_opts opts
407+
408+ boolean_opts=('true' 'false')
409+ opts=('before' 'dangling' 'label' 'reference' 'since')
410+
411+ if compset -P '*='; then
412+ case "${${words[-1]%=*}#*=}" in
413+ (before|reference|since)
414+ __docker_complete_images && ret=0
415+ ;;
416+ (dangling)
417+ _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0
418+ ;;
419+ *)
420+ _message 'value' && ret=0
421+ ;;
422+ esac
423+ else
424+ _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0
425+ fi
426+
427+ return ret
428+}
429+
430+__docker_complete_events_filter() {
431+ [[ $PREFIX = -* ]] && return 1
432+ integer ret=1
433+ declare -a opts
434+
435+ opts=('container' 'daemon' 'event' 'image' 'label' 'network' 'scope' 'type' 'volume')
436+
437+ if compset -P '*='; then
438+ case "${${words[-1]%=*}#*=}" in
439+ (container)
440+ __docker_complete_containers && ret=0
441+ ;;
442+ (daemon)
443+ emulate -L zsh
444+ setopt extendedglob
445+ local -a daemon_opts
446+ daemon_opts=(
447+ ${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Name: }%%$'\n'^ *}}
448+ ${${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'ID: }%%$'\n'^ *}}//:/\\:}
449+ )
450+ _describe -t daemon-filter-opts "daemon filter options" daemon_opts && ret=0
451+ ;;
452+ (event)
453+ local -a event_opts
454+ event_opts=('attach' 'commit' 'connect' 'copy' 'create' 'delete' 'destroy' 'detach' 'die' 'disable' 'disconnect' 'enable' 'exec_create' 'exec_detach'
455+ 'exec_start' 'export' 'health_status' 'import' 'install' 'kill' 'load' 'mount' 'oom' 'pause' 'pull' 'push' 'reload' 'remove' 'rename' 'resize'
456+ 'restart' 'save' 'start' 'stop' 'tag' 'top' 'unmount' 'unpause' 'untag' 'update')
457+ _describe -t event-filter-opts "event filter options" event_opts && ret=0
458+ ;;
459+ (image)
460+ __docker_complete_images && ret=0
461+ ;;
462+ (network)
463+ __docker_complete_networks && ret=0
464+ ;;
465+ (scope)
466+ local -a scope_opts
467+ scope_opts=('local' 'swarm')
468+ _describe -t scope-filter-opts "scope filter options" scope_opts && ret=0
469+ ;;
470+ (type)
471+ local -a type_opts
472+ type_opts=('container' 'daemon' 'image' 'network' 'volume')
473+ _describe -t type-filter-opts "type filter options" type_opts && ret=0
474+ ;;
475+ (volume)
476+ __docker_complete_volumes && ret=0
477+ ;;
478+ *)
479+ _message 'value' && ret=0
480+ ;;
481+ esac
482+ else
483+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
484+ fi
485+
486+ return ret
487+}
488+
489+__docker_complete_prune_filters() {
490+ [[ $PREFIX = -* ]] && return 1
491+ integer ret=1
492+ declare -a opts
493+
494+ opts=('until')
495+
496+ if compset -P '*='; then
497+ case "${${words[-1]%=*}#*=}" in
498+ *)
499+ _message 'value' && ret=0
500+ ;;
501+ esac
502+ else
503+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
504+ fi
505+
506+ return ret
507+}
508+
509+# BO checkpoint
510+
511+__docker_checkpoint_commands() {
512+ local -a _docker_checkpoint_subcommands
513+ _docker_checkpoint_subcommands=(
514+ "create:Create a checkpoint from a running container"
515+ "ls:List checkpoints for a container"
516+ "rm:Remove a checkpoint"
517+ )
518+ _describe -t docker-checkpoint-commands "docker checkpoint command" _docker_checkpoint_subcommands
519+}
520+
521+__docker_checkpoint_subcommand() {
522+ local -a _command_args opts_help
523+ local expl help="--help"
524+ integer ret=1
525+
526+ opts_help=("(: -)--help[Print usage]")
527+
528+ case "$words[1]" in
529+ (create)
530+ _arguments $(__docker_arguments) \
531+ $opts_help \
532+ "($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \
533+ "($help)--leave-running[Leave the container running after checkpoint]" \
534+ "($help -)1:container:__docker_complete_running_containers" \
535+ "($help -)2:checkpoint: " && ret=0
536+ ;;
537+ (ls|list)
538+ _arguments $(__docker_arguments) \
539+ $opts_help \
540+ "($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \
541+ "($help -)1:container:__docker_complete_containers" && ret=0
542+ ;;
543+ (rm|remove)
544+ _arguments $(__docker_arguments) \
545+ $opts_help \
546+ "($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \
547+ "($help -)1:container:__docker_complete_containers" \
548+ "($help -)2:checkpoint: " && ret=0
549+ ;;
550+ (help)
551+ _arguments $(__docker_arguments) ":subcommand:__docker_checkpoint_commands" && ret=0
552+ ;;
553+ esac
554+
555+ return ret
556+}
557+
558+# EO checkpoint
559+
560+# BO container
561+
562+__docker_container_commands() {
563+ local -a _docker_container_subcommands
564+ _docker_container_subcommands=(
565+ "attach:Attach to a running container"
566+ "commit:Create a new image from a container's changes"
567+ "cp:Copy files/folders between a container and the local filesystem"
568+ "create:Create a new container"
569+ "diff:Inspect changes on a container's filesystem"
570+ "exec:Execute a command in a running container"
571+ "export:Export a container's filesystem as a tar archive"
572+ "inspect:Display detailed information on one or more containers"
573+ "kill:Kill one or more running containers"
574+ "logs:Fetch the logs of a container"
575+ "ls:List containers"
576+ "pause:Pause all processes within one or more containers"
577+ "port:List port mappings or a specific mapping for the container"
578+ "prune:Remove all stopped containers"
579+ "rename:Rename a container"
580+ "restart:Restart one or more containers"
581+ "rm:Remove one or more containers"
582+ "run:Create and run a new container from an image"
583+ "start:Start one or more stopped containers"
584+ "stats:Display a live stream of container(s) resource usage statistics"
585+ "stop:Stop one or more running containers"
586+ "top:Display the running processes of a container"
587+ "unpause:Unpause all processes within one or more containers"
588+ "update:Update configuration of one or more containers"
589+ "wait:Block until one or more containers stop, then print their exit codes"
590+ )
591+ _describe -t docker-container-commands "docker container command" _docker_container_subcommands
592+}
593+
594+__docker_container_subcommand() {
595+ local -a _command_args opts_help opts_attach_exec_run_start opts_create_run opts_create_run_update
596+ local expl help="--help"
597+ integer ret=1
598+
599+ opts_attach_exec_run_start=(
600+ "($help)--detach-keys=[Escape key sequence used to detach a container]:sequence:__docker_complete_detach_keys"
601+ )
602+ opts_create_run=(
603+ "($help -a --attach)"{-a=,--attach=}"[Attach to stdin, stdout or stderr]:device:(STDIN STDOUT STDERR)"
604+ "($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: "
605+ "($help)*--annotation=[Add an annotation to the container (passed through to the OCI runtime)]:annotations: "
606+ "($help)*--blkio-weight-device=[Block IO (relative device weight)]:device:Block IO weight: "
607+ "($help)*--cap-add=[Add Linux capabilities]:capability: "
608+ "($help)*--cap-drop=[Drop Linux capabilities]:capability: "
609+ "($help)--cgroupns=[Cgroup namespace mode to use]:cgroup namespace mode: "
610+ "($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: "
611+ "($help)--cidfile=[Write the container ID to the file]:CID file:_files"
612+ "($help)--cpus=[Number of CPUs (default 0.000)]:cpus: "
613+ "($help)*--device=[Add a host device to the container]:device:_files"
614+ "($help)*--device-cgroup-rule=[Add a rule to the cgroup allowed devices list]:device:cgroup: "
615+ "($help)*--device-read-bps=[Limit the read rate (bytes per second) from a device]:device:IO rate: "
616+ "($help)*--device-read-iops=[Limit the read rate (IO per second) from a device]:device:IO rate: "
617+ "($help)*--device-write-bps=[Limit the write rate (bytes per second) to a device]:device:IO rate: "
618+ "($help)*--device-write-iops=[Limit the write rate (IO per second) to a device]:device:IO rate: "
619+ "($help)--disable-content-trust[Skip image verification]"
620+ "($help)*--dns=[Custom DNS servers]:DNS server: "
621+ "($help)*--dns-option=[Custom DNS options]:DNS option: "
622+ "($help)*--dns-search=[Custom DNS search domains]:DNS domains: "
623+ "($help)*--domainname=[Container NIS domain name]:domainname:_hosts"
624+ "($help)*"{-e=,--env=}"[Environment variables]:environment variable: "
625+ "($help)--entrypoint=[Overwrite the default entrypoint of the image]:entry point: "
626+ "($help)*--env-file=[Read environment variables from a file]:environment file:_files"
627+ "($help)*--expose=[Expose a port from the container without publishing it]: "
628+ "($help)*--gpus=[GPU devices to add to the container ('all' to pass all GPUs)]:device: "
629+ "($help)*--group-add=[Set one or more supplementary user groups for the container]:group:_groups"
630+ "($help -h --hostname)"{-h=,--hostname=}"[Container host name]:hostname:_hosts"
631+ "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]"
632+ "($help)--init[Run an init inside the container that forwards signals and reaps processes]"
633+ "($help)--ip=[IPv4 address]:IPv4: "
634+ "($help)--ip6=[IPv6 address]:IPv6: "
635+ "($help)--ipc=[IPC namespace to use]:IPC namespace: "
636+ "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)"
637+ "($help)*--link=[Add link to another container]:link:->link"
638+ "($help)*--link-local-ip=[Container IPv4/IPv6 link-local addresses]:IPv4/IPv6: "
639+ "($help)*"{-l=,--label=}"[Container metadata]:label: "
640+ "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers"
641+ "($help)*--log-opt=[Log driver specific options]:log driver options:__docker_complete_log_options"
642+ "($help)--mac-address=[Container MAC address]:MAC address: "
643+ "($help)*--mount=[Attach a filesystem mount to the container]:mount: "
644+ "($help)--name=[Container name]:name: "
645+ "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)"
646+ "($help)*--network-alias=[Add network-scoped alias for the container]:alias: "
647+ "($help)--oom-kill-disable[Disable OOM Killer]"
648+ "($help)--oom-score-adj[Tune the host's OOM preferences for containers (accepts -1000 to 1000)]"
649+ "($help)--pids-limit[Tune container pids limit (set -1 for unlimited)]"
650+ "($help -P --publish-all)"{-P,--publish-all}"[Publish all exposed ports]"
651+ "($help)*"{-p=,--publish=}"[Expose a container's port to the host]:port:_ports"
652+ "($help)--pid=[PID namespace to use]:PID namespace:__docker_complete_pid"
653+ "($help)--privileged[Give extended privileges to this container]"
654+ "($help -q --quiet)"{-q,--quiet}"[Suppress the pull output]"
655+ "($help)--read-only[Mount the container's root filesystem as read only]"
656+ "($help)*--security-opt=[Security options]:security option: "
657+ "($help)*--shm-size=[Size of '/dev/shm' (format is '<number><unit>')]:shm size: "
658+ "($help)--stop-signal=[Signal to kill a container]:signal:_signals"
659+ "($help)--stop-timeout=[Timeout (in seconds) to stop a container]:time: "
660+ "($help)*--sysctl=-[sysctl options]:sysctl: "
661+ "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]"
662+ "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users"
663+ "($help)*--ulimit=[ulimit options]:ulimit: "
664+ "($help)--userns=[Container user namespace]:user namespace:(host)"
665+ "($help)--tmpfs[mount tmpfs]"
666+ "($help)*-v[Bind mount a volume]:volume:_directories -W / -P '/' -S '\:' -r '/ '"
667+ "($help)--volume-driver=[Optional volume driver for the container]:volume driver:(local)"
668+ "($help)*--volumes-from=[Mount volumes from the specified container]:volume: "
669+ "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories"
670+ )
671+ opts_create_run_update=(
672+ "($help)--blkio-weight=[Block IO (relative weight), between 10 and 1000]:Block IO weight:(10 100 500 1000)"
673+ "($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)"
674+ "($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: "
675+ "($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: "
676+ "($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: "
677+ "($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: "
678+ "($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: "
679+ "($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: "
680+ "($help)--kernel-memory=[Kernel memory limit in bytes]:Memory limit: "
681+ "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: "
682+ "($help)--memory-reservation=[Memory soft limit]:Memory limit: "
683+ "($help)--memory-swap=[Total memory limit with swap]:Memory limit: "
684+ "($help)--pids-limit[Tune container pids limit (set -1 for unlimited)]"
685+ "($help)--restart=[Restart policy]:restart policy:(no on-failure always unless-stopped)"
686+ )
687+ opts_help=("(: -)--help[Print usage]")
688+
689+ case "$words[1]" in
690+ (attach)
691+ _arguments $(__docker_arguments) \
692+ $opts_help \
693+ $opts_attach_exec_run_start \
694+ "($help)--no-stdin[Do not attach stdin]" \
695+ "($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \
696+ "($help -):containers:__docker_complete_running_containers" && ret=0
697+ ;;
698+ (commit)
699+ _arguments $(__docker_arguments) \
700+ $opts_help \
701+ "($help -a --author)"{-a=,--author=}"[Author]:author: " \
702+ "($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \
703+ "($help -m --message)"{-m=,--message=}"[Commit message]:message: " \
704+ "($help -p --pause)"{-p,--pause}"[Pause container during commit]" \
705+ "($help -):container:__docker_complete_containers" \
706+ "($help -): :__docker_complete_repositories_with_tags" && ret=0
707+ ;;
708+ (cp)
709+ local state
710+ _arguments $(__docker_arguments) \
711+ $opts_help \
712+ "($help -L --follow-link)"{-L,--follow-link}"[Always follow symbol link]" \
713+ "($help -)1:container:->container" \
714+ "($help -)2:hostpath:_files" && ret=0
715+ case $state in
716+ (container)
717+ if compset -P "*:"; then
718+ _files && ret=0
719+ else
720+ __docker_complete_containers -qS ":" && ret=0
721+ fi
722+ ;;
723+ esac
724+ ;;
725+ (create)
726+ local state
727+ _arguments $(__docker_arguments) \
728+ $opts_help \
729+ $opts_create_run \
730+ $opts_create_run_update \
731+ "($help -): :__docker_complete_images" \
732+ "($help -):command: _command_names -e" \
733+ "($help -)*::arguments: _normal" && ret=0
734+ case $state in
735+ (link)
736+ if compset -P "*:"; then
737+ _wanted alias expl "Alias" compadd -E "" && ret=0
738+ else
739+ __docker_complete_running_containers -qS ":" && ret=0
740+ fi
741+ ;;
742+ esac
743+ ;;
744+ (diff)
745+ _arguments $(__docker_arguments) \
746+ $opts_help \
747+ "($help -)*:containers:__docker_complete_containers" && ret=0
748+ ;;
749+ (exec)
750+ local state
751+ _arguments $(__docker_arguments) \
752+ $opts_help \
753+ $opts_attach_exec_run_start \
754+ "($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \
755+ "($help)*"{-e=,--env=}"[Set environment variables]:environment variable: " \
756+ "($help)*--env-file=[Read environment variables from a file]:environment file:_files" \
757+ "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]" \
758+ "($help)--privileged[Give extended Linux capabilities to the command]" \
759+ "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]" \
760+ "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" \
761+ "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" \
762+ "($help -):containers:__docker_complete_running_containers" \
763+ "($help -)*::command:->anycommand" && ret=0
764+ case $state in
765+ (anycommand)
766+ shift 1 words
767+ (( CURRENT-- ))
768+ _normal && ret=0
769+ ;;
770+ esac
771+ ;;
772+ (export)
773+ _arguments $(__docker_arguments) \
774+ $opts_help \
775+ "($help -o --output)"{-o=,--output=}"[Write to a file, instead of stdout]:output file:_files" \
776+ "($help -)*:containers:__docker_complete_containers" && ret=0
777+ ;;
778+ (inspect)
779+ _arguments $(__docker_arguments) \
780+ $opts_help \
781+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
782+ "($help -s --size)"{-s,--size}"[Display total file sizes]" \
783+ "($help -)*:containers:__docker_complete_containers" && ret=0
784+ ;;
785+ (kill)
786+ _arguments $(__docker_arguments) \
787+ $opts_help \
788+ "($help -s --signal)"{-s=,--signal=}"[Signal to send]:signal:_signals" \
789+ "($help -)*:containers:__docker_complete_running_containers" && ret=0
790+ ;;
791+ (logs)
792+ _arguments $(__docker_arguments) \
793+ $opts_help \
794+ "($help)--details[Show extra details provided to logs]" \
795+ "($help -f --follow)"{-f,--follow}"[Follow log output]" \
796+ "($help -s --since)"{-s=,--since=}"[Show logs since this timestamp]:timestamp: " \
797+ "($help -t --timestamps)"{-t,--timestamps}"[Show timestamps]" \
798+ "($help -n --tail)"{-n=,--tail=}"[Number of lines to show from the end of the logs]:lines:(1 10 20 50 all)" \
799+ "($help -)*:containers:__docker_complete_containers" && ret=0
800+ ;;
801+ (ls|list)
802+ _arguments $(__docker_arguments) \
803+ $opts_help \
804+ "($help -a --all)"{-a,--all}"[Show all containers]" \
805+ "($help)--before=[Show only container created before...]:containers:__docker_complete_containers" \
806+ "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_ps_filters" \
807+ "($help)--format=[Format the output using the given Go template]:template: " \
808+ "($help -l --latest)"{-l,--latest}"[Show only the latest created container]" \
809+ "($help -n --last)"{-n=,--last=}"[Show n last created containers (includes all states)]:n:(1 5 10 25 50)" \
810+ "($help)--no-trunc[Do not truncate output]" \
811+ "($help -q --quiet)"{-q,--quiet}"[Only show container IDs]" \
812+ "($help -s --size)"{-s,--size}"[Display total file sizes]" \
813+ "($help)--since=[Show only containers created since...]:containers:__docker_complete_containers" && ret=0
814+ ;;
815+ (pause|unpause)
816+ _arguments $(__docker_arguments) \
817+ $opts_help \
818+ "($help -)*:containers:__docker_complete_running_containers" && ret=0
819+ ;;
820+ (port)
821+ _arguments $(__docker_arguments) \
822+ $opts_help \
823+ "($help -)1:containers:__docker_complete_running_containers" \
824+ "($help -)2:port:_ports" && ret=0
825+ ;;
826+ (prune)
827+ _arguments $(__docker_arguments) \
828+ $opts_help \
829+ "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
830+ "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0
831+ ;;
832+ (rename)
833+ _arguments $(__docker_arguments) \
834+ $opts_help \
835+ "($help -):old name:__docker_complete_containers" \
836+ "($help -):new name: " && ret=0
837+ ;;
838+ (restart)
839+ _arguments $(__docker_arguments) \
840+ $opts_help \
841+ "($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \
842+ "($help -)*:containers:__docker_complete_containers" && ret=0
843+ ;;
844+ (rm)
845+ local state
846+ _arguments $(__docker_arguments) \
847+ $opts_help \
848+ "($help -f --force)"{-f,--force}"[Force removal]" \
849+ "($help -l --link)"{-l,--link}"[Remove the specified link and not the underlying container]" \
850+ "($help -v --volumes)"{-v,--volumes}"[Remove the volumes associated to the container]" \
851+ "($help -)*:containers:->values" && ret=0
852+ case $state in
853+ (values)
854+ if [[ ${words[(r)-f]} == -f || ${words[(r)--force]} == --force ]]; then
855+ __docker_complete_containers && ret=0
856+ else
857+ __docker_complete_stopped_containers && ret=0
858+ fi
859+ ;;
860+ esac
861+ ;;
862+ (run)
863+ local state
864+ _arguments $(__docker_arguments) \
865+ $opts_help \
866+ $opts_create_run \
867+ $opts_create_run_update \
868+ $opts_attach_exec_run_start \
869+ "($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \
870+ "($help)--health-cmd=[Command to run to check health]:command: " \
871+ "($help)--health-interval=[Time between running the check]:time: " \
872+ "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" \
873+ "($help)--health-timeout=[Maximum time to allow one check to run]:time: " \
874+ "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" \
875+ "($help)--rm[Remove intermediate containers when it exits]" \
876+ "($help)--runtime=[Name of the runtime to be used for that container]:runtime:__docker_complete_runtimes" \
877+ "($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \
878+ "($help)--storage-opt=[Storage driver options for the container]:storage options:->storage-opt" \
879+ "($help -): :__docker_complete_images" \
880+ "($help -):command: _command_names -e" \
881+ "($help -)*::arguments: _normal" && ret=0
882+ case $state in
883+ (link)
884+ if compset -P "*:"; then
885+ _wanted alias expl "Alias" compadd -E "" && ret=0
886+ else
887+ __docker_complete_running_containers -qS ":" && ret=0
888+ fi
889+ ;;
890+ (storage-opt)
891+ if compset -P "*="; then
892+ _message "value" && ret=0
893+ else
894+ opts=('size')
895+ _describe -t filter-opts "storage options" opts -qS "=" && ret=0
896+ fi
897+ ;;
898+ esac
899+ ;;
900+ (start)
901+ _arguments $(__docker_arguments) \
902+ $opts_help \
903+ $opts_attach_exec_run_start \
904+ "($help -a --attach)"{-a,--attach}"[Attach container's stdout/stderr and forward all signals]" \
905+ "($help -i --interactive)"{-i,--interactive}"[Attach container's stdin]" \
906+ "($help -)*:containers:__docker_complete_stopped_containers" && ret=0
907+ ;;
908+ (stats)
909+ _arguments $(__docker_arguments) \
910+ $opts_help \
911+ "($help -a --all)"{-a,--all}"[Show all containers (default shows just running)]" \
912+ "($help)--format=[Format the output using the given Go template]:template: " \
913+ "($help)--no-stream[Disable streaming stats and only pull the first result]" \
914+ "($help)--no-trunc[Do not truncate output]" \
915+ "($help -)*:containers:__docker_complete_running_containers" && ret=0
916+ ;;
917+ (stop)
918+ _arguments $(__docker_arguments) \
919+ $opts_help \
920+ "($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \
921+ "($help -)*:containers:__docker_complete_running_containers" && ret=0
922+ ;;
923+ (top)
924+ local state
925+ _arguments $(__docker_arguments) \
926+ $opts_help \
927+ "($help -)1:containers:__docker_complete_running_containers" \
928+ "($help -)*:: :->ps-arguments" && ret=0
929+ case $state in
930+ (ps-arguments)
931+ _ps && ret=0
932+ ;;
933+ esac
934+ ;;
935+ (update)
936+ local state
937+ _arguments $(__docker_arguments) \
938+ $opts_help \
939+ $opts_create_run_update \
940+ "($help -)*: :->values" && ret=0
941+ case $state in
942+ (values)
943+ if [[ ${words[(r)--kernel-memory*]} = (--kernel-memory*) ]]; then
944+ __docker_complete_stopped_containers && ret=0
945+ else
946+ __docker_complete_containers && ret=0
947+ fi
948+ ;;
949+ esac
950+ ;;
951+ (wait)
952+ _arguments $(__docker_arguments) \
953+ $opts_help \
954+ "($help -)*:containers:__docker_complete_running_containers" && ret=0
955+ ;;
956+ (help)
957+ _arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0
958+ ;;
959+ esac
960+
961+ return ret
962+}
963+
964+# EO container
965+
966+# BO image
967+
968+__docker_image_commands() {
969+ local -a _docker_image_subcommands
970+ _docker_image_subcommands=(
971+ "build:Build an image from a Dockerfile"
972+ "history:Show the history of an image"
973+ "import:Import the contents from a tarball to create a filesystem image"
974+ "inspect:Display detailed information on one or more images"
975+ "load:Load an image from a tar archive or STDIN"
976+ "ls:List images"
977+ "prune:Remove unused images"
978+ "pull:Download an image from a registry"
979+ "push:Upload an image to a registry"
980+ "rm:Remove one or more images"
981+ "save:Save one or more images to a tar archive (streamed to STDOUT by default)"
982+ "tag:Tag an image into a repository"
983+ )
984+ _describe -t docker-image-commands "docker image command" _docker_image_subcommands
985+}
986+
987+__docker_image_subcommand() {
988+ local -a _command_args opts_help
989+ local expl help="--help"
990+ integer ret=1
991+
992+ opts_help=("(: -)--help[Print usage]")
993+
994+ case "$words[1]" in
995+ (build)
996+ _arguments $(__docker_arguments) \
997+ $opts_help \
998+ "($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: " \
999+ "($help)*--build-arg=[Build-time variables]:<varname>=<value>: " \
1000+ "($help)*--cache-from=[Images to consider as cache sources]: :__docker_complete_repositories_with_tags" \
1001+ "($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)" \
1002+ "($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: " \
1003+ "($help)--compress[Compress the build context using gzip]" \
1004+ "($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: " \
1005+ "($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: " \
1006+ "($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: " \
1007+ "($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: " \
1008+ "($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: " \
1009+ "($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: " \
1010+ "($help)--disable-content-trust[Skip image verification]" \
1011+ "($help -f --file)"{-f=,--file=}"[Name of the Dockerfile]:Dockerfile:_files" \
1012+ "($help)--force-rm[Always remove intermediate containers]" \
1013+ "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)" \
1014+ "($help)*--label=[Set metadata for an image]:label=value: " \
1015+ "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: " \
1016+ "($help)--memory-swap=[Total memory limit with swap]:Memory limit: " \
1017+ "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" \
1018+ "($help)--no-cache[Do not use cache when building the image]" \
1019+ "($help)--pull[Attempt to pull a newer version of the image]" \
1020+ "($help -q --quiet)"{-q,--quiet}"[Suppress verbose build output]" \
1021+ "($help)--rm[Remove intermediate containers after a successful build]" \
1022+ "($help)*--shm-size=[Size of '/dev/shm' (format is '<number><unit>')]:shm size: " \
1023+ "($help)--squash[Squash newly built layers into a single new layer]" \
1024+ "($help -t --tag)*"{-t=,--tag=}"[Repository, name and tag for the image]: :__docker_complete_repositories_with_tags" \
1025+ "($help)--target=[Set the target build stage to build.]" \
1026+ "($help)*--ulimit=[ulimit options]:ulimit: " \
1027+ "($help)--userns=[Container user namespace]:user namespace:(host)" \
1028+ "($help -):path or URL:_directories" && ret=0
1029+ ;;
1030+ (history)
1031+ _arguments $(__docker_arguments) \
1032+ $opts_help \
1033+ "($help -H --human)"{-H,--human}"[Print sizes and dates in human readable format]" \
1034+ "($help)--no-trunc[Do not truncate output]" \
1035+ "($help -q --quiet)"{-q,--quiet}"[Only show image IDs]" \
1036+ "($help -)*: :__docker_complete_images" && ret=0
1037+ ;;
1038+ (import)
1039+ _arguments $(__docker_arguments) \
1040+ $opts_help \
1041+ "($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \
1042+ "($help -m --message)"{-m=,--message=}"[Commit message for imported image]:message: " \
1043+ "($help -):URL:(- http:// file://)" \
1044+ "($help -): :__docker_complete_repositories_with_tags" && ret=0
1045+ ;;
1046+ (inspect)
1047+ _arguments $(__docker_arguments) \
1048+ $opts_help \
1049+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
1050+ "($help -)*:images:__docker_complete_images" && ret=0
1051+ ;;
1052+ (load)
1053+ _arguments $(__docker_arguments) \
1054+ $opts_help \
1055+ "($help -i --input)"{-i=,--input=}"[Read from tar archive file]:archive file:_files -g \"*.((tar|TAR)(.gz|.GZ|.Z|.bz2|.lzma|.xz|)|(tbz|tgz|txz))(-.)\"" \
1056+ "($help -q --quiet)"{-q,--quiet}"[Suppress the load output]" && ret=0
1057+ ;;
1058+ (ls|list)
1059+ local state
1060+ _arguments $(__docker_arguments) \
1061+ $opts_help \
1062+ "($help -a --all)"{-a,--all}"[Show all images]" \
1063+ "($help)--digests[Show digests]" \
1064+ "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_images_filters" \
1065+ "($help)--format=[Format the output using the given Go template]:template: " \
1066+ "($help)--no-trunc[Do not truncate output]" \
1067+ "($help -q --quiet)"{-q,--quiet}"[Only show image IDs]" \
1068+ "($help -): :__docker_complete_repositories" && ret=0
1069+ ;;
1070+ (prune)
1071+ _arguments $(__docker_arguments) \
1072+ $opts_help \
1073+ "($help -a --all)"{-a,--all}"[Remove all unused images, not just dangling ones]" \
1074+ "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
1075+ "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0
1076+ ;;
1077+ (pull)
1078+ _arguments $(__docker_arguments) \
1079+ $opts_help \
1080+ "($help -a --all-tags)"{-a,--all-tags}"[Download all tagged images]" \
1081+ "($help)--disable-content-trust[Skip image verification]" \
1082+ "($help -):name:__docker_search" && ret=0
1083+ ;;
1084+ (push)
1085+ _arguments $(__docker_arguments) \
1086+ $opts_help \
1087+ "($help -a --all-tags)"{-a,--all-tags}"[Push all tags of an image to the repository]" \
1088+ "($help)--disable-content-trust[Skip image signing]" \
1089+ "($help -): :__docker_complete_images" && ret=0
1090+ ;;
1091+ (rm)
1092+ _arguments $(__docker_arguments) \
1093+ $opts_help \
1094+ "($help -f --force)"{-f,--force}"[Force removal]" \
1095+ "($help)--no-prune[Do not delete untagged parents]" \
1096+ "($help -)*: :__docker_complete_images" && ret=0
1097+ ;;
1098+ (save)
1099+ _arguments $(__docker_arguments) \
1100+ $opts_help \
1101+ "($help -o --output)"{-o=,--output=}"[Write to file]:file:_files" \
1102+ "($help -)*: :__docker_complete_images" && ret=0
1103+ ;;
1104+ (tag)
1105+ _arguments $(__docker_arguments) \
1106+ $opts_help \
1107+ "($help -):source:__docker_complete_images"\
1108+ "($help -):destination:__docker_complete_repositories_with_tags" && ret=0
1109+ ;;
1110+ (help)
1111+ _arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0
1112+ ;;
1113+ esac
1114+
1115+ return ret
1116+}
1117+
1118+# EO image
1119+
1120+# BO network
1121+
1122+__docker_network_complete_ls_filters() {
1123+ [[ $PREFIX = -* ]] && return 1
1124+ integer ret=1
1125+
1126+ if compset -P '*='; then
1127+ case "${${words[-1]%=*}#*=}" in
1128+ (driver)
1129+ __docker_complete_info_plugins Network && ret=0
1130+ ;;
1131+ (id)
1132+ __docker_complete_networks_ids && ret=0
1133+ ;;
1134+ (name)
1135+ __docker_complete_networks_names && ret=0
1136+ ;;
1137+ (scope)
1138+ opts=('global' 'local' 'swarm')
1139+ _describe -t scope-filter-opts "Scope filter options" opts && ret=0
1140+ ;;
1141+ (type)
1142+ opts=('builtin' 'custom')
1143+ _describe -t type-filter-opts "Type filter options" opts && ret=0
1144+ ;;
1145+ *)
1146+ _message 'value' && ret=0
1147+ ;;
1148+ esac
1149+ else
1150+ opts=('driver' 'id' 'label' 'name' 'scope' 'type')
1151+ _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0
1152+ fi
1153+
1154+ return ret
1155+}
1156+
1157+__docker_get_networks() {
1158+ [[ $PREFIX = -* ]] && return 1
1159+ integer ret=1
1160+ local line s
1161+ declare -a lines networks
1162+
1163+ type=$1; shift
1164+
1165+ lines=(${(f)${:-"$(_call_program commands docker $docker_options network ls)"$'\n'}})
1166+
1167+ # Parse header line to find columns
1168+ local i=1 j=1 k header=${lines[1]}
1169+ declare -A begin end
1170+ while (( j < ${#header} - 1 )); do
1171+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
1172+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
1173+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
1174+ begin[${header[$i,$((j-1))]}]=$i
1175+ end[${header[$i,$((j-1))]}]=$k
1176+ done
1177+ end[${header[$i,$((j-1))]}]=-1
1178+ lines=(${lines[2,-1]})
1179+
1180+ # Network ID
1181+ if [[ $type = (ids|all) ]]; then
1182+ for line in $lines; do
1183+ s="${line[${begin[NETWORK ID]},${end[NETWORK ID]}]%% ##}"
1184+ s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}"
1185+ s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}"
1186+ networks=($networks $s)
1187+ done
1188+ fi
1189+
1190+ # Names
1191+ if [[ $type = (names|all) ]]; then
1192+ for line in $lines; do
1193+ s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
1194+ s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}"
1195+ s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}"
1196+ networks=($networks $s)
1197+ done
1198+ fi
1199+
1200+ _describe -t networks-list "networks" networks "$@" && ret=0
1201+ return ret
1202+}
1203+
1204+__docker_complete_networks() {
1205+ [[ $PREFIX = -* ]] && return 1
1206+ __docker_get_networks all "$@"
1207+}
1208+
1209+__docker_complete_networks_ids() {
1210+ [[ $PREFIX = -* ]] && return 1
1211+ __docker_get_networks ids "$@"
1212+}
1213+
1214+__docker_complete_networks_names() {
1215+ [[ $PREFIX = -* ]] && return 1
1216+ __docker_get_networks names "$@"
1217+}
1218+
1219+__docker_network_commands() {
1220+ local -a _docker_network_subcommands
1221+ _docker_network_subcommands=(
1222+ "connect:Connect a container to a network"
1223+ "create:Creates a new network with a name specified by the user"
1224+ "disconnect:Disconnects a container from a network"
1225+ "inspect:Displays detailed information on a network"
1226+ "ls:Lists all the networks created by the user"
1227+ "prune:Remove all unused networks"
1228+ "rm:Deletes one or more networks"
1229+ )
1230+ _describe -t docker-network-commands "docker network command" _docker_network_subcommands
1231+}
1232+
1233+__docker_network_subcommand() {
1234+ local -a _command_args opts_help
1235+ local expl help="--help"
1236+ integer ret=1
1237+
1238+ opts_help=("(: -)--help[Print usage]")
1239+
1240+ case "$words[1]" in
1241+ (connect)
1242+ _arguments $(__docker_arguments) \
1243+ $opts_help \
1244+ "($help)*--alias=[Add network-scoped alias for the container]:alias: " \
1245+ "($help)--ip=[IPv4 address]:IPv4: " \
1246+ "($help)--ip6=[IPv6 address]:IPv6: " \
1247+ "($help)*--link=[Add a link to another container]:link:->link" \
1248+ "($help)*--link-local-ip=[Add a link-local address for the container]:IPv4/IPv6: " \
1249+ "($help -)1:network:__docker_complete_networks" \
1250+ "($help -)2:containers:__docker_complete_containers" && ret=0
1251+
1252+ case $state in
1253+ (link)
1254+ if compset -P "*:"; then
1255+ _wanted alias expl "Alias" compadd -E "" && ret=0
1256+ else
1257+ __docker_complete_running_containers -qS ":" && ret=0
1258+ fi
1259+ ;;
1260+ esac
1261+ ;;
1262+ (create)
1263+ _arguments $(__docker_arguments) -A '-*' \
1264+ $opts_help \
1265+ "($help)--attachable[Enable manual container attachment]" \
1266+ "($help)*--aux-address[Auxiliary IPv4 or IPv6 addresses used by network driver]:key=IP: " \
1267+ "($help -d --driver)"{-d=,--driver=}"[Driver to manage the Network]:driver:(null host bridge overlay)" \
1268+ "($help)*--gateway=[IPv4 or IPv6 Gateway for the master subnet]:IP: " \
1269+ "($help)--internal[Restricts external access to the network]" \
1270+ "($help)*--ip-range=[Allocate container ip from a sub-range]:IP/mask: " \
1271+ "($help)--ipam-driver=[IP Address Management Driver]:driver:(default)" \
1272+ "($help)*--ipam-opt=[Custom IPAM plugin options]:opt=value: " \
1273+ "($help)--ipv6[Enable IPv6 networking]" \
1274+ "($help)*--label=[Set metadata on a network]:label=value: " \
1275+ "($help)*"{-o=,--opt=}"[Driver specific options]:opt=value: " \
1276+ "($help)*--subnet=[Subnet in CIDR format that represents a network segment]:IP/mask: " \
1277+ "($help -)1:Network Name: " && ret=0
1278+ ;;
1279+ (disconnect)
1280+ _arguments $(__docker_arguments) \
1281+ $opts_help \
1282+ "($help -)1:network:__docker_complete_networks" \
1283+ "($help -)2:containers:__docker_complete_containers" && ret=0
1284+ ;;
1285+ (inspect)
1286+ _arguments $(__docker_arguments) \
1287+ $opts_help \
1288+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
1289+ "($help)--verbose[Show detailed information]" \
1290+ "($help -)*:network:__docker_complete_networks" && ret=0
1291+ ;;
1292+ (ls)
1293+ _arguments $(__docker_arguments) \
1294+ $opts_help \
1295+ "($help)--no-trunc[Do not truncate the output]" \
1296+ "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_network_complete_ls_filters" \
1297+ "($help)--format=[Format the output using the given Go template]:template: " \
1298+ "($help -q --quiet)"{-q,--quiet}"[Only display network IDs]" && ret=0
1299+ ;;
1300+ (prune)
1301+ _arguments $(__docker_arguments) \
1302+ $opts_help \
1303+ "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
1304+ "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0
1305+ ;;
1306+ (rm)
1307+ _arguments $(__docker_arguments) \
1308+ $opts_help \
1309+ "($help -)*:network:__docker_complete_networks" && ret=0
1310+ ;;
1311+ (help)
1312+ _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0
1313+ ;;
1314+ esac
1315+
1316+ return ret
1317+}
1318+
1319+# EO network
1320+
1321+# BO node
1322+
1323+__docker_node_complete_ls_filters() {
1324+ [[ $PREFIX = -* ]] && return 1
1325+ integer ret=1
1326+
1327+ if compset -P '*='; then
1328+ case "${${words[-1]%=*}#*=}" in
1329+ (id)
1330+ __docker_complete_nodes_ids && ret=0
1331+ ;;
1332+ (membership)
1333+ membership_opts=('accepted' 'pending' 'rejected')
1334+ _describe -t membership-opts "membership options" membership_opts && ret=0
1335+ ;;
1336+ (name)
1337+ __docker_complete_nodes_names && ret=0
1338+ ;;
1339+ (role)
1340+ role_opts=('manager' 'worker')
1341+ _describe -t role-opts "role options" role_opts && ret=0
1342+ ;;
1343+ *)
1344+ _message 'value' && ret=0
1345+ ;;
1346+ esac
1347+ else
1348+ opts=('id' 'label' 'membership' 'name' 'node.label' 'role')
1349+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
1350+ fi
1351+
1352+ return ret
1353+}
1354+
1355+__docker_node_complete_ps_filters() {
1356+ [[ $PREFIX = -* ]] && return 1
1357+ integer ret=1
1358+
1359+ if compset -P '*='; then
1360+ case "${${words[-1]%=*}#*=}" in
1361+ (desired-state)
1362+ state_opts=('accepted' 'running' 'shutdown')
1363+ _describe -t state-opts "desired state options" state_opts && ret=0
1364+ ;;
1365+ *)
1366+ _message 'value' && ret=0
1367+ ;;
1368+ esac
1369+ else
1370+ opts=('desired-state' 'id' 'label' 'name')
1371+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
1372+ fi
1373+
1374+ return ret
1375+}
1376+
1377+__docker_nodes() {
1378+ [[ $PREFIX = -* ]] && return 1
1379+ integer ret=1
1380+ local line s
1381+ declare -a lines nodes args
1382+
1383+ type=$1; shift
1384+ filter=$1; shift
1385+ [[ $filter != "none" ]] && args=("-f $filter")
1386+
1387+ lines=(${(f)${:-"$(_call_program commands docker $docker_options node ls $args)"$'\n'}})
1388+ # Parse header line to find columns
1389+ local i=1 j=1 k header=${lines[1]}
1390+ declare -A begin end
1391+ while (( j < ${#header} - 1 )); do
1392+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
1393+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
1394+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
1395+ begin[${header[$i,$((j-1))]}]=$i
1396+ end[${header[$i,$((j-1))]}]=$k
1397+ done
1398+ end[${header[$i,$((j-1))]}]=-1
1399+ lines=(${lines[2,-1]})
1400+
1401+ # Node ID
1402+ if [[ $type = (ids|all) ]]; then
1403+ for line in $lines; do
1404+ s="${line[${begin[ID]},${end[ID]}]%% ##}"
1405+ nodes=($nodes $s)
1406+ done
1407+ fi
1408+
1409+ # Names
1410+ if [[ $type = (names|all) ]]; then
1411+ for line in $lines; do
1412+ s="${line[${begin[HOSTNAME]},${end[HOSTNAME]}]%% ##}"
1413+ nodes=($nodes $s)
1414+ done
1415+ fi
1416+
1417+ _describe -t nodes-list "nodes" nodes "$@" && ret=0
1418+ return ret
1419+}
1420+
1421+__docker_complete_nodes() {
1422+ [[ $PREFIX = -* ]] && return 1
1423+ __docker_nodes all none "$@"
1424+}
1425+
1426+__docker_complete_nodes_ids() {
1427+ [[ $PREFIX = -* ]] && return 1
1428+ __docker_nodes ids none "$@"
1429+}
1430+
1431+__docker_complete_nodes_names() {
1432+ [[ $PREFIX = -* ]] && return 1
1433+ __docker_nodes names none "$@"
1434+}
1435+
1436+__docker_complete_pending_nodes() {
1437+ [[ $PREFIX = -* ]] && return 1
1438+ __docker_nodes all "membership=pending" "$@"
1439+}
1440+
1441+__docker_complete_manager_nodes() {
1442+ [[ $PREFIX = -* ]] && return 1
1443+ __docker_nodes all "role=manager" "$@"
1444+}
1445+
1446+__docker_complete_worker_nodes() {
1447+ [[ $PREFIX = -* ]] && return 1
1448+ __docker_nodes all "role=worker" "$@"
1449+}
1450+
1451+__docker_node_commands() {
1452+ local -a _docker_node_subcommands
1453+ _docker_node_subcommands=(
1454+ "demote:Demote a node as manager in the swarm"
1455+ "inspect:Display detailed information on one or more nodes"
1456+ "ls:List nodes in the swarm"
1457+ "promote:Promote a node as manager in the swarm"
1458+ "rm:Remove one or more nodes from the swarm"
1459+ "ps:List tasks running on one or more nodes, defaults to current node"
1460+ "update:Update a node"
1461+ )
1462+ _describe -t docker-node-commands "docker node command" _docker_node_subcommands
1463+}
1464+
1465+__docker_node_subcommand() {
1466+ local -a _command_args opts_help
1467+ local expl help="--help"
1468+ integer ret=1
1469+
1470+ opts_help=("(: -)--help[Print usage]")
1471+
1472+ case "$words[1]" in
1473+ (rm|remove)
1474+ _arguments $(__docker_arguments) \
1475+ $opts_help \
1476+ "($help -f --force)"{-f,--force}"[Force remove a node from the swarm]" \
1477+ "($help -)*:node:__docker_complete_pending_nodes" && ret=0
1478+ ;;
1479+ (demote)
1480+ _arguments $(__docker_arguments) \
1481+ $opts_help \
1482+ "($help -)*:node:__docker_complete_manager_nodes" && ret=0
1483+ ;;
1484+ (inspect)
1485+ _arguments $(__docker_arguments) \
1486+ $opts_help \
1487+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
1488+ "($help)--pretty[Print the information in a human friendly format]" \
1489+ "($help -)*:node:__docker_complete_nodes" && ret=0
1490+ ;;
1491+ (ls|list)
1492+ _arguments $(__docker_arguments) \
1493+ $opts_help \
1494+ "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_node_complete_ls_filters" \
1495+ "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
1496+ ;;
1497+ (promote)
1498+ _arguments $(__docker_arguments) \
1499+ $opts_help \
1500+ "($help -)*:node:__docker_complete_worker_nodes" && ret=0
1501+ ;;
1502+ (ps)
1503+ _arguments $(__docker_arguments) \
1504+ $opts_help \
1505+ "($help -a --all)"{-a,--all}"[Display all instances]" \
1506+ "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_node_complete_ps_filters" \
1507+ "($help)--format=[Format the output using the given go template]:template: " \
1508+ "($help)--no-resolve[Do not map IDs to Names]" \
1509+ "($help)--no-trunc[Do not truncate output]" \
1510+ "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \
1511+ "($help -)*:node:__docker_complete_nodes" && ret=0
1512+ ;;
1513+ (update)
1514+ _arguments $(__docker_arguments) \
1515+ $opts_help \
1516+ "($help)--availability=[Availability of the node]:availability:(active pause drain)" \
1517+ "($help)*--label-add=[Add or update a node label]:key=value: " \
1518+ "($help)*--label-rm=[Remove a node label if exists]:label: " \
1519+ "($help)--role=[Role of the node]:role:(manager worker)" \
1520+ "($help -)1:node:__docker_complete_nodes" && ret=0
1521+ ;;
1522+ (help)
1523+ _arguments $(__docker_arguments) ":subcommand:__docker_node_commands" && ret=0
1524+ ;;
1525+ esac
1526+
1527+ return ret
1528+}
1529+
1530+# EO node
1531+
1532+# BO plugin
1533+
1534+__docker_plugin_complete_ls_filters() {
1535+ [[ $PREFIX = -* ]] && return 1
1536+ integer ret=1
1537+
1538+ if compset -P '*='; then
1539+ case "${${words[-1]%=*}#*=}" in
1540+ (capability)
1541+ opts=('authz' 'ipamdriver' 'logdriver' 'metricscollector' 'networkdriver' 'volumedriver')
1542+ _describe -t capability-opts "capability options" opts && ret=0
1543+ ;;
1544+ (enabled)
1545+ opts=('false' 'true')
1546+ _describe -t enabled-opts "enabled options" opts && ret=0
1547+ ;;
1548+ *)
1549+ _message 'value' && ret=0
1550+ ;;
1551+ esac
1552+ else
1553+ opts=('capability' 'enabled')
1554+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
1555+ fi
1556+
1557+ return ret
1558+}
1559+
1560+__docker_plugins() {
1561+ [[ $PREFIX = -* ]] && return 1
1562+ integer ret=1
1563+ local line s
1564+ declare -a lines plugins args
1565+
1566+ filter=$1; shift
1567+ [[ $filter != "none" ]] && args=("-f $filter")
1568+
1569+ lines=(${(f)${:-"$(_call_program commands docker $docker_options plugin ls $args)"$'\n'}})
1570+
1571+ # Parse header line to find columns
1572+ local i=1 j=1 k header=${lines[1]}
1573+ declare -A begin end
1574+ while (( j < ${#header} - 1 )); do
1575+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
1576+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
1577+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
1578+ begin[${header[$i,$((j-1))]}]=$i
1579+ end[${header[$i,$((j-1))]}]=$k
1580+ done
1581+ end[${header[$i,$((j-1))]}]=-1
1582+ lines=(${lines[2,-1]})
1583+
1584+ # Name
1585+ for line in $lines; do
1586+ s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
1587+ s="$s:${(l:7:: :::)${${line[${begin[TAG]},${end[TAG]}]}%% ##}}"
1588+ plugins=($plugins $s)
1589+ done
1590+
1591+ _describe -t plugins-list "plugins" plugins "$@" && ret=0
1592+ return ret
1593+}
1594+
1595+__docker_complete_plugins() {
1596+ [[ $PREFIX = -* ]] && return 1
1597+ __docker_plugins none "$@"
1598+}
1599+
1600+__docker_complete_enabled_plugins() {
1601+ [[ $PREFIX = -* ]] && return 1
1602+ __docker_plugins enabled=true "$@"
1603+}
1604+
1605+__docker_complete_disabled_plugins() {
1606+ [[ $PREFIX = -* ]] && return 1
1607+ __docker_plugins enabled=false "$@"
1608+}
1609+
1610+__docker_plugin_commands() {
1611+ local -a _docker_plugin_subcommands
1612+ _docker_plugin_subcommands=(
1613+ "disable:Disable a plugin"
1614+ "enable:Enable a plugin"
1615+ "inspect:Return low-level information about a plugin"
1616+ "install:Install a plugin"
1617+ "ls:List plugins"
1618+ "push:Push a plugin"
1619+ "rm:Remove a plugin"
1620+ "set:Change settings for a plugin"
1621+ "upgrade:Upgrade an existing plugin"
1622+ )
1623+ _describe -t docker-plugin-commands "docker plugin command" _docker_plugin_subcommands
1624+}
1625+
1626+__docker_plugin_subcommand() {
1627+ local -a _command_args opts_help
1628+ local expl help="--help"
1629+ integer ret=1
1630+
1631+ opts_help=("(: -)--help[Print usage]")
1632+
1633+ case "$words[1]" in
1634+ (disable)
1635+ _arguments $(__docker_arguments) \
1636+ $opts_help \
1637+ "($help -f --force)"{-f,--force}"[Force the disable of an active plugin]" \
1638+ "($help -)1:plugin:__docker_complete_enabled_plugins" && ret=0
1639+ ;;
1640+ (enable)
1641+ _arguments $(__docker_arguments) \
1642+ $opts_help \
1643+ "($help)--timeout=[HTTP client timeout (in seconds)]:timeout: " \
1644+ "($help -)1:plugin:__docker_complete_disabled_plugins" && ret=0
1645+ ;;
1646+ (inspect)
1647+ _arguments $(__docker_arguments) \
1648+ $opts_help \
1649+ "($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \
1650+ "($help -)*:plugin:__docker_complete_plugins" && ret=0
1651+ ;;
1652+ (install)
1653+ _arguments $(__docker_arguments) \
1654+ $opts_help \
1655+ "($help)--alias=[Local name for plugin]:alias: " \
1656+ "($help)--disable[Do not enable the plugin on install]" \
1657+ "($help)--disable-content-trust[Skip image verification (default true)]" \
1658+ "($help)--grant-all-permissions[Grant all permissions necessary to run the plugin]" \
1659+ "($help -)1:plugin:__docker_complete_plugins" \
1660+ "($help -)*:key=value: " && ret=0
1661+ ;;
1662+ (ls|list)
1663+ _arguments $(__docker_arguments) \
1664+ $opts_help \
1665+ "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_plugin_complete_ls_filters" \
1666+ "($help --format)--format=[Format the output using the given Go template]:template: " \
1667+ "($help)--no-trunc[Don't truncate output]" \
1668+ "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
1669+ ;;
1670+ (push)
1671+ _arguments $(__docker_arguments) \
1672+ $opts_help \
1673+ "($help)--disable-content-trust[Skip image verification (default true)]" \
1674+ "($help -)1:plugin:__docker_complete_plugins" && ret=0
1675+ ;;
1676+ (rm|remove)
1677+ _arguments $(__docker_arguments) \
1678+ $opts_help \
1679+ "($help -f --force)"{-f,--force}"[Force the removal of an active plugin]" \
1680+ "($help -)*:plugin:__docker_complete_plugins" && ret=0
1681+ ;;
1682+ (set)
1683+ _arguments $(__docker_arguments) \
1684+ $opts_help \
1685+ "($help -)1:plugin:__docker_complete_plugins" \
1686+ "($help -)*:key=value: " && ret=0
1687+ ;;
1688+ (upgrade)
1689+ _arguments $(__docker_arguments) \
1690+ $opts_help \
1691+ "($help)--disable-content-trust[Skip image verification (default true)]" \
1692+ "($help)--grant-all-permissions[Grant all permissions necessary to run the plugin]" \
1693+ "($help)--skip-remote-check[Do not check if specified remote plugin matches existing plugin image]" \
1694+ "($help -)1:plugin:__docker_complete_plugins" \
1695+ "($help -):remote: " && ret=0
1696+ ;;
1697+ (help)
1698+ _arguments $(__docker_arguments) ":subcommand:__docker_plugin_commands" && ret=0
1699+ ;;
1700+ esac
1701+
1702+ return ret
1703+}
1704+
1705+# EO plugin
1706+
1707+# BO secret
1708+
1709+__docker_secrets() {
1710+ [[ $PREFIX = -* ]] && return 1
1711+ integer ret=1
1712+ local line s
1713+ declare -a lines secrets
1714+
1715+ type=$1; shift
1716+
1717+ lines=(${(f)${:-"$(_call_program commands docker $docker_options secret ls)"$'\n'}})
1718+
1719+ # Parse header line to find columns
1720+ local i=1 j=1 k header=${lines[1]}
1721+ declare -A begin end
1722+ while (( j < ${#header} - 1 )); do
1723+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
1724+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
1725+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
1726+ begin[${header[$i,$((j-1))]}]=$i
1727+ end[${header[$i,$((j-1))]}]=$k
1728+ done
1729+ end[${header[$i,$((j-1))]}]=-1
1730+ lines=(${lines[2,-1]})
1731+
1732+ # ID
1733+ if [[ $type = (ids|all) ]]; then
1734+ for line in $lines; do
1735+ s="${line[${begin[ID]},${end[ID]}]%% ##}"
1736+ secrets=($secrets $s)
1737+ done
1738+ fi
1739+
1740+ # Names
1741+ if [[ $type = (names|all) ]]; then
1742+ for line in $lines; do
1743+ s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
1744+ secrets=($secrets $s)
1745+ done
1746+ fi
1747+
1748+ _describe -t secrets-list "secrets" secrets "$@" && ret=0
1749+ return ret
1750+}
1751+
1752+__docker_complete_secrets() {
1753+ [[ $PREFIX = -* ]] && return 1
1754+ __docker_secrets all "$@"
1755+}
1756+
1757+__docker_secret_commands() {
1758+ local -a _docker_secret_subcommands
1759+ _docker_secret_subcommands=(
1760+ "create:Create a secret using stdin as content"
1761+ "inspect:Display detailed information on one or more secrets"
1762+ "ls:List secrets"
1763+ "rm:Remove one or more secrets"
1764+ )
1765+ _describe -t docker-secret-commands "docker secret command" _docker_secret_subcommands
1766+}
1767+
1768+__docker_secret_subcommand() {
1769+ local -a _command_args opts_help
1770+ local expl help="--help"
1771+ integer ret=1
1772+
1773+ opts_help=("(: -)--help[Print usage]")
1774+
1775+ case "$words[1]" in
1776+ (create)
1777+ _arguments $(__docker_arguments) -A '-*' \
1778+ $opts_help \
1779+ "($help)*"{-l=,--label=}"[Secret labels]:label: " \
1780+ "($help -):secret: " && ret=0
1781+ ;;
1782+ (inspect)
1783+ _arguments $(__docker_arguments) \
1784+ $opts_help \
1785+ "($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \
1786+ "($help -)*:secret:__docker_complete_secrets" && ret=0
1787+ ;;
1788+ (ls|list)
1789+ _arguments $(__docker_arguments) \
1790+ $opts_help \
1791+ "($help)--format=[Format the output using the given go template]:template: " \
1792+ "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
1793+ ;;
1794+ (rm|remove)
1795+ _arguments $(__docker_arguments) \
1796+ $opts_help \
1797+ "($help -)*:secret:__docker_complete_secrets" && ret=0
1798+ ;;
1799+ (help)
1800+ _arguments $(__docker_arguments) ":subcommand:__docker_secret_commands" && ret=0
1801+ ;;
1802+ esac
1803+
1804+ return ret
1805+}
1806+
1807+# EO secret
1808+
1809+# BO service
1810+
1811+__docker_service_complete_ls_filters() {
1812+ [[ $PREFIX = -* ]] && return 1
1813+ integer ret=1
1814+
1815+ if compset -P '*='; then
1816+ case "${${words[-1]%=*}#*=}" in
1817+ (id)
1818+ __docker_complete_services_ids && ret=0
1819+ ;;
1820+ (mode)
1821+ opts=('global' 'replicated')
1822+ _describe -t mode-opts "mode options" opts && ret=0
1823+ ;;
1824+ (name)
1825+ __docker_complete_services_names && ret=0
1826+ ;;
1827+ *)
1828+ _message 'value' && ret=0
1829+ ;;
1830+ esac
1831+ else
1832+ opts=('id' 'label' 'mode' 'name')
1833+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
1834+ fi
1835+
1836+ return ret
1837+}
1838+
1839+__docker_service_complete_ps_filters() {
1840+ [[ $PREFIX = -* ]] && return 1
1841+ integer ret=1
1842+
1843+ if compset -P '*='; then
1844+ case "${${words[-1]%=*}#*=}" in
1845+ (desired-state)
1846+ state_opts=('accepted' 'running' 'shutdown')
1847+ _describe -t state-opts "desired state options" state_opts && ret=0
1848+ ;;
1849+ *)
1850+ _message 'value' && ret=0
1851+ ;;
1852+ esac
1853+ else
1854+ opts=('desired-state' 'id' 'label' 'name')
1855+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
1856+ fi
1857+
1858+ return ret
1859+}
1860+
1861+__docker_service_complete_placement_pref() {
1862+ [[ $PREFIX = -* ]] && return 1
1863+ integer ret=1
1864+
1865+ if compset -P '*='; then
1866+ case "${${words[-1]%=*}#*=}" in
1867+ (spread)
1868+ opts=('engine.labels' 'node.labels')
1869+ _describe -t spread-opts "spread options" opts -qS "." && ret=0
1870+ ;;
1871+ *)
1872+ _message 'value' && ret=0
1873+ ;;
1874+ esac
1875+ else
1876+ opts=('spread')
1877+ _describe -t pref-opts "placement pref options" opts -qS "=" && ret=0
1878+ fi
1879+
1880+ return ret
1881+}
1882+
1883+__docker_services() {
1884+ [[ $PREFIX = -* ]] && return 1
1885+ integer ret=1
1886+ local line s
1887+ declare -a lines services
1888+
1889+ type=$1; shift
1890+
1891+ lines=(${(f)${:-"$(_call_program commands docker $docker_options service ls)"$'\n'}})
1892+
1893+ # Parse header line to find columns
1894+ local i=1 j=1 k header=${lines[1]}
1895+ declare -A begin end
1896+ while (( j < ${#header} - 1 )); do
1897+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
1898+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
1899+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
1900+ begin[${header[$i,$((j-1))]}]=$i
1901+ end[${header[$i,$((j-1))]}]=$k
1902+ done
1903+ end[${header[$i,$((j-1))]}]=-1
1904+ lines=(${lines[2,-1]})
1905+
1906+ # Service ID
1907+ if [[ $type = (ids|all) ]]; then
1908+ for line in $lines; do
1909+ s="${line[${begin[ID]},${end[ID]}]%% ##}"
1910+ s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}"
1911+ services=($services $s)
1912+ done
1913+ fi
1914+
1915+ # Names
1916+ if [[ $type = (names|all) ]]; then
1917+ for line in $lines; do
1918+ s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
1919+ s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}"
1920+ services=($services $s)
1921+ done
1922+ fi
1923+
1924+ _describe -t services-list "services" services "$@" && ret=0
1925+ return ret
1926+}
1927+
1928+__docker_complete_services() {
1929+ [[ $PREFIX = -* ]] && return 1
1930+ __docker_services all "$@"
1931+}
1932+
1933+__docker_complete_services_ids() {
1934+ [[ $PREFIX = -* ]] && return 1
1935+ __docker_services ids "$@"
1936+}
1937+
1938+__docker_complete_services_names() {
1939+ [[ $PREFIX = -* ]] && return 1
1940+ __docker_services names "$@"
1941+}
1942+
1943+__docker_service_commands() {
1944+ local -a _docker_service_subcommands
1945+ _docker_service_subcommands=(
1946+ "create:Create a new service"
1947+ "inspect:Display detailed information on one or more services"
1948+ "logs:Fetch the logs of a service or task"
1949+ "ls:List services"
1950+ "rm:Remove one or more services"
1951+ "rollback:Revert changes to a service's configuration"
1952+ "scale:Scale one or multiple replicated services"
1953+ "ps:List the tasks of a service"
1954+ "update:Update a service"
1955+ )
1956+ _describe -t docker-service-commands "docker service command" _docker_service_subcommands
1957+}
1958+
1959+__docker_service_subcommand() {
1960+ local -a _command_args opts_help opts_create_update
1961+ local expl help="--help"
1962+ integer ret=1
1963+
1964+ opts_help=("(: -)--help[Print usage]")
1965+ opts_create_update=(
1966+ "($help)*--cap-add=[Add Linux capabilities]:capability: "
1967+ "($help)*--cap-drop=[Drop Linux capabilities]:capability: "
1968+ "($help)*--constraint=[Placement constraints]:constraint: "
1969+ "($help)--endpoint-mode=[Placement constraints]:mode:(dnsrr vip)"
1970+ "($help)*"{-e=,--env=}"[Set environment variables]:env: "
1971+ "($help)--health-cmd=[Command to run to check health]:command: "
1972+ "($help)--health-interval=[Time between running the check]:time: "
1973+ "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)"
1974+ "($help)--health-timeout=[Maximum time to allow one check to run]:time: "
1975+ "($help)--hostname=[Service container hostname]:hostname: " \
1976+ "($help)--isolation=[Service container isolation mode]:isolation:(default process hyperv)" \
1977+ "($help)*--label=[Service labels]:label: "
1978+ "($help)--limit-cpu=[Limit CPUs]:value: "
1979+ "($help)--limit-memory=[Limit Memory]:value: "
1980+ "($help)--limit-pids[Limit maximum number of processes (default 0 = unlimited)]"
1981+ "($help)--log-driver=[Logging driver for service]:logging driver:__docker_complete_log_drivers"
1982+ "($help)*--log-opt=[Logging driver options]:log driver options:__docker_complete_log_options"
1983+ "($help)*--mount=[Attach a filesystem mount to the service]:mount: "
1984+ "($help)*--network=[Network attachments]:network: "
1985+ "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]"
1986+ "($help)--read-only[Mount the container's root filesystem as read only]"
1987+ "($help)--replicas=[Number of tasks]:replicas: "
1988+ "($help)--reserve-cpu=[Reserve CPUs]:value: "
1989+ "($help)--reserve-memory=[Reserve Memory]:value: "
1990+ "($help)--restart-condition=[Restart when condition is met]:mode:(any none on-failure)"
1991+ "($help)--restart-delay=[Delay between restart attempts]:delay: "
1992+ "($help)--restart-max-attempts=[Maximum number of restarts before giving up]:max-attempts: "
1993+ "($help)--restart-window=[Window used to evaluate the restart policy]:duration: "
1994+ "($help)--rollback-delay=[Delay between task rollbacks]:duration: "
1995+ "($help)--rollback-failure-action=[Action on rollback failure]:action:(continue pause)"
1996+ "($help)--rollback-max-failure-ratio=[Failure rate to tolerate during a rollback]:failure rate: "
1997+ "($help)--rollback-monitor=[Duration after each task rollback to monitor for failure]:duration: "
1998+ "($help)--rollback-parallelism=[Maximum number of tasks rolled back simultaneously]:number: "
1999+ "($help)*--secret=[Specify secrets to expose to the service]:secret:__docker_complete_secrets"
2000+ "($help)--stop-grace-period=[Time to wait before force killing a container]:grace period: "
2001+ "($help)--stop-signal=[Signal to stop the container]:signal:_signals"
2002+ "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-TTY]"
2003+ "($help)--update-delay=[Delay between updates]:delay: "
2004+ "($help)--update-failure-action=[Action on update failure]:mode:(continue pause rollback)"
2005+ "($help)--update-max-failure-ratio=[Failure rate to tolerate during an update]:fraction: "
2006+ "($help)--update-monitor=[Duration after each task update to monitor for failure]:window: "
2007+ "($help)--update-parallelism=[Maximum number of tasks updated simultaneously]:number: "
2008+ "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users"
2009+ "($help)--with-registry-auth[Send registry authentication details to swarm agents]"
2010+ "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories"
2011+ )
2012+
2013+ case "$words[1]" in
2014+ (create)
2015+ _arguments $(__docker_arguments) \
2016+ $opts_help \
2017+ $opts_create_update \
2018+ "($help)*--container-label=[Container labels]:label: " \
2019+ "($help)*--dns=[Set custom DNS servers]:DNS: " \
2020+ "($help)*--dns-option=[Set DNS options]:DNS option: " \
2021+ "($help)*--dns-search=[Set custom DNS search domains]:DNS search: " \
2022+ "($help)*--env-file=[Read environment variables from a file]:environment file:_files" \
2023+ "($help)*--group=[Set one or more supplementary user groups for the container]:group: _groups " \
2024+ "($help)--mode=[Service Mode]:mode:(global replicated)" \
2025+ "($help)--name=[Service name]:name: " \
2026+ "($help)*--placement-pref=[Add a placement preference]:pref:__docker_service_complete_placement_pref" \
2027+ "($help)*"{-p=,--publish=}"[Publish a port as a node port]:port: " \
2028+ "($help -): :__docker_complete_images" \
2029+ "($help -):command: _command_names -e" \
2030+ "($help -)*::arguments: _normal" && ret=0
2031+ ;;
2032+ (inspect)
2033+ _arguments $(__docker_arguments) \
2034+ $opts_help \
2035+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
2036+ "($help)--pretty[Print the information in a human friendly format]" \
2037+ "($help -)*:service:__docker_complete_services" && ret=0
2038+ ;;
2039+ (logs)
2040+ _arguments $(__docker_arguments) \
2041+ $opts_help \
2042+ "($help -f --follow)"{-f,--follow}"[Follow log output]" \
2043+ "($help)--no-resolve[Do not map IDs to Names]" \
2044+ "($help)--no-task-ids[Do not include task IDs]" \
2045+ "($help)--no-trunc[Do not truncate output]" \
2046+ "($help)--since=[Show logs since timestamp]:timestamp: " \
2047+ "($help -n --tail)"{-n=,--tail=}"[Number of lines to show from the end of the logs]:lines:(1 10 20 50 all)" \
2048+ "($help -t --timestamps)"{-t,--timestamps}"[Show timestamps]" \
2049+ "($help -)1:service:__docker_complete_services" && ret=0
2050+ ;;
2051+ (ls|list)
2052+ _arguments $(__docker_arguments) \
2053+ $opts_help \
2054+ "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_service_complete_ls_filters" \
2055+ "($help)--format=[Format the output using the given Go template]:template: " \
2056+ "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
2057+ ;;
2058+ (rm|remove)
2059+ _arguments $(__docker_arguments) \
2060+ $opts_help \
2061+ "($help -)*:service:__docker_complete_services" && ret=0
2062+ ;;
2063+ (rollback)
2064+ _arguments $(__docker_arguments) \
2065+ $opts_help \
2066+ "($help -d --detach)"{-d=false,--detach=false}"[Disable detached mode]" \
2067+ "($help -q --quiet)"{-q,--quiet}"[Suppress progress output]" \
2068+ "($help -)*:service:__docker_complete_services" && ret=0
2069+ ;;
2070+ (scale)
2071+ _arguments $(__docker_arguments) \
2072+ $opts_help \
2073+ "($help -d --detach)"{-d=false,--detach=false}"[Disable detached mode]" \
2074+ "($help -)*:service:->values" && ret=0
2075+ case $state in
2076+ (values)
2077+ if compset -P '*='; then
2078+ _message 'replicas' && ret=0
2079+ else
2080+ __docker_complete_services -qS "="
2081+ fi
2082+ ;;
2083+ esac
2084+ ;;
2085+ (ps)
2086+ _arguments $(__docker_arguments) \
2087+ $opts_help \
2088+ "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_service_complete_ps_filters" \
2089+ "($help)--format=[Format the output using the given go template]:template: " \
2090+ "($help)--no-resolve[Do not map IDs to Names]" \
2091+ "($help)--no-trunc[Do not truncate output]" \
2092+ "($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \
2093+ "($help -)*:service:__docker_complete_services" && ret=0
2094+ ;;
2095+ (update)
2096+ _arguments $(__docker_arguments) \
2097+ $opts_help \
2098+ $opts_create_update \
2099+ "($help)--arg=[Service command args]:arguments: _normal" \
2100+ "($help)*--container-label-add=[Add or update container labels]:label: " \
2101+ "($help)*--container-label-rm=[Remove a container label by its key]:label: " \
2102+ "($help)*--dns-add=[Add or update custom DNS servers]:DNS: " \
2103+ "($help)*--dns-rm=[Remove custom DNS servers]:DNS: " \
2104+ "($help)*--dns-option-add=[Add or update DNS options]:DNS option: " \
2105+ "($help)*--dns-option-rm=[Remove DNS options]:DNS option: " \
2106+ "($help)*--dns-search-add=[Add or update custom DNS search domains]:DNS search: " \
2107+ "($help)*--dns-search-rm=[Remove DNS search domains]:DNS search: " \
2108+ "($help)--force[Force update]" \
2109+ "($help)*--group-add=[Add additional supplementary user groups to the container]:group:_groups" \
2110+ "($help)*--group-rm=[Remove previously added supplementary user groups from the container]:group:_groups" \
2111+ "($help)--image=[Service image tag]:image:__docker_complete_repositories" \
2112+ "($help)*--placement-pref-add=[Add a placement preference]:pref:__docker_service_complete_placement_pref" \
2113+ "($help)*--placement-pref-rm=[Remove a placement preference]:pref:__docker_service_complete_placement_pref" \
2114+ "($help)*--publish-add=[Add or update a port]:port: " \
2115+ "($help)*--publish-rm=[Remove a port(target-port mandatory)]:port: " \
2116+ "($help)--rollback[Rollback to previous specification]" \
2117+ "($help -)1:service:__docker_complete_services" && ret=0
2118+ ;;
2119+ (help)
2120+ _arguments $(__docker_arguments) ":subcommand:__docker_service_commands" && ret=0
2121+ ;;
2122+ esac
2123+
2124+ return ret
2125+}
2126+
2127+# EO service
2128+
2129+# BO stack
2130+
2131+__docker_stack_complete_ps_filters() {
2132+ [[ $PREFIX = -* ]] && return 1
2133+ integer ret=1
2134+
2135+ if compset -P '*='; then
2136+ case "${${words[-1]%=*}#*=}" in
2137+ (desired-state)
2138+ state_opts=('accepted' 'running' 'shutdown')
2139+ _describe -t state-opts "desired state options" state_opts && ret=0
2140+ ;;
2141+ *)
2142+ _message 'value' && ret=0
2143+ ;;
2144+ esac
2145+ else
2146+ opts=('desired-state' 'id' 'name')
2147+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
2148+ fi
2149+
2150+ return ret
2151+}
2152+
2153+__docker_stack_complete_services_filters() {
2154+ [[ $PREFIX = -* ]] && return 1
2155+ integer ret=1
2156+
2157+ if compset -P '*='; then
2158+ case "${${words[-1]%=*}#*=}" in
2159+ *)
2160+ _message 'value' && ret=0
2161+ ;;
2162+ esac
2163+ else
2164+ opts=('id' 'label' 'name')
2165+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
2166+ fi
2167+
2168+ return ret
2169+}
2170+
2171+__docker_stacks() {
2172+ [[ $PREFIX = -* ]] && return 1
2173+ integer ret=1
2174+ local line s
2175+ declare -a lines stacks
2176+
2177+ lines=(${(f)${:-"$(_call_program commands docker $docker_options stack ls)"$'\n'}})
2178+
2179+ # Parse header line to find columns
2180+ local i=1 j=1 k header=${lines[1]}
2181+ declare -A begin end
2182+ while (( j < ${#header} - 1 )); do
2183+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
2184+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
2185+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
2186+ begin[${header[$i,$((j-1))]}]=$i
2187+ end[${header[$i,$((j-1))]}]=$k
2188+ done
2189+ end[${header[$i,$((j-1))]}]=-1
2190+ lines=(${lines[2,-1]})
2191+
2192+ # Service NAME
2193+ for line in $lines; do
2194+ s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
2195+ stacks=($stacks $s)
2196+ done
2197+
2198+ _describe -t stacks-list "stacks" stacks "$@" && ret=0
2199+ return ret
2200+}
2201+
2202+__docker_complete_stacks() {
2203+ [[ $PREFIX = -* ]] && return 1
2204+ __docker_stacks "$@"
2205+}
2206+
2207+__docker_stack_commands() {
2208+ local -a _docker_stack_subcommands
2209+ _docker_stack_subcommands=(
2210+ "deploy:Deploy a new stack or update an existing stack"
2211+ "ls:List stacks"
2212+ "ps:List the tasks in the stack"
2213+ "rm:Remove the stack"
2214+ "services:List the services in the stack"
2215+ )
2216+ _describe -t docker-stack-commands "docker stack command" _docker_stack_subcommands
2217+}
2218+
2219+__docker_stack_subcommand() {
2220+ local -a _command_args opts_help
2221+ local expl help="--help"
2222+ integer ret=1
2223+
2224+ opts_help=("(: -)--help[Print usage]")
2225+
2226+ case "$words[1]" in
2227+ (deploy|up)
2228+ _arguments $(__docker_arguments) \
2229+ $opts_help \
2230+ "($help -c --compose-file)"{-c=,--compose-file=}"[Path to a Compose file, or '-' to read from stdin]:compose file:_files -g \"*.(yml|yaml)\"" \
2231+ "($help)--with-registry-auth[Send registry authentication details to Swarm agents]" \
2232+ "($help -):stack:__docker_complete_stacks" && ret=0
2233+ ;;
2234+ (ls|list)
2235+ _arguments $(__docker_arguments) \
2236+ $opts_help && ret=0
2237+ ;;
2238+ (ps)
2239+ _arguments $(__docker_arguments) \
2240+ $opts_help \
2241+ "($help -a --all)"{-a,--all}"[Display all tasks]" \
2242+ "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_ps_filters" \
2243+ "($help)--format=[Format the output using the given go template]:template: " \
2244+ "($help)--no-resolve[Do not map IDs to Names]" \
2245+ "($help)--no-trunc[Do not truncate output]" \
2246+ "($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \
2247+ "($help -):stack:__docker_complete_stacks" && ret=0
2248+ ;;
2249+ (rm|remove|down)
2250+ _arguments $(__docker_arguments) \
2251+ $opts_help \
2252+ "($help -):stack:__docker_complete_stacks" && ret=0
2253+ ;;
2254+ (services)
2255+ _arguments $(__docker_arguments) \
2256+ $opts_help \
2257+ "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_services_filters" \
2258+ "($help)--format=[Format the output using the given Go template]:template: " \
2259+ "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \
2260+ "($help -):stack:__docker_complete_stacks" && ret=0
2261+ ;;
2262+ (help)
2263+ _arguments $(__docker_arguments) ":subcommand:__docker_stack_commands" && ret=0
2264+ ;;
2265+ esac
2266+
2267+ return ret
2268+}
2269+
2270+# EO stack
2271+
2272+# BO swarm
2273+
2274+__docker_swarm_commands() {
2275+ local -a _docker_swarm_subcommands
2276+ _docker_swarm_subcommands=(
2277+ "init:Initialize a swarm"
2278+ "join:Join a swarm as a node and/or manager"
2279+ "join-token:Manage join tokens"
2280+ "leave:Leave a swarm"
2281+ "unlock:Unlock swarm"
2282+ "unlock-key:Manage the unlock key"
2283+ "update:Update the swarm"
2284+ )
2285+ _describe -t docker-swarm-commands "docker swarm command" _docker_swarm_subcommands
2286+}
2287+
2288+__docker_swarm_subcommand() {
2289+ local -a _command_args opts_help
2290+ local expl help="--help"
2291+ integer ret=1
2292+
2293+ opts_help=("(: -)--help[Print usage]")
2294+
2295+ case "$words[1]" in
2296+ (init)
2297+ _arguments $(__docker_arguments) \
2298+ $opts_help \
2299+ "($help)--advertise-addr=[Advertised address]:ip\:port: " \
2300+ "($help)--data-path-addr=[Data path IP or interface]:ip " \
2301+ "($help)--data-path-port=[Data Path Port]:port " \
2302+ "($help)--default-addr-pool=[Default address pool]" \
2303+ "($help)--default-addr-pool-mask-length=[Default address pool subnet mask length]" \
2304+ "($help)--autolock[Enable manager autolocking]" \
2305+ "($help)--availability=[Availability of the node]:availability:(active drain pause)" \
2306+ "($help)--cert-expiry=[Validity period for node certificates]:duration: " \
2307+ "($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \
2308+ "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \
2309+ "($help)--force-new-cluster[Force create a new cluster from current state]" \
2310+ "($help)--listen-addr=[Listen address]:ip\:port: " \
2311+ "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \
2312+ "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \
2313+ "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0
2314+ ;;
2315+ (join)
2316+ _arguments $(__docker_arguments) -A '-*' \
2317+ $opts_help \
2318+ "($help)--advertise-addr=[Advertised address]:ip\:port: " \
2319+ "($help)--data-path-addr=[Data path IP or interface]:ip " \
2320+ "($help)--availability=[Availability of the node]:availability:(active drain pause)" \
2321+ "($help)--listen-addr=[Listen address]:ip\:port: " \
2322+ "($help)--token=[Token for entry into the swarm]:secret: " \
2323+ "($help -):host\:port: " && ret=0
2324+ ;;
2325+ (join-token)
2326+ _arguments $(__docker_arguments) \
2327+ $opts_help \
2328+ "($help -q --quiet)"{-q,--quiet}"[Only display token]" \
2329+ "($help)--rotate[Rotate join token]" \
2330+ "($help -):role:(manager worker)" && ret=0
2331+ ;;
2332+ (leave)
2333+ _arguments $(__docker_arguments) \
2334+ $opts_help \
2335+ "($help -f --force)"{-f,--force}"[Force this node to leave the swarm, ignoring warnings]" && ret=0
2336+ ;;
2337+ (unlock)
2338+ _arguments $(__docker_arguments) \
2339+ $opts_help && ret=0
2340+ ;;
2341+ (unlock-key)
2342+ _arguments $(__docker_arguments) \
2343+ $opts_help \
2344+ "($help -q --quiet)"{-q,--quiet}"[Only display token]" \
2345+ "($help)--rotate[Rotate unlock token]" && ret=0
2346+ ;;
2347+ (update)
2348+ _arguments $(__docker_arguments) \
2349+ $opts_help \
2350+ "($help)--autolock[Enable manager autolocking]" \
2351+ "($help)--cert-expiry=[Validity period for node certificates]:duration: " \
2352+ "($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \
2353+ "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \
2354+ "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \
2355+ "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \
2356+ "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0
2357+ ;;
2358+ (help)
2359+ _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0
2360+ ;;
2361+ esac
2362+
2363+ return ret
2364+}
2365+
2366+# EO swarm
2367+
2368+# BO system
2369+
2370+__docker_system_commands() {
2371+ local -a _docker_system_subcommands
2372+ _docker_system_subcommands=(
2373+ "df:Show docker filesystem usage"
2374+ "events:Get real time events from the server"
2375+ "info:Display system-wide information"
2376+ "prune:Remove unused data"
2377+ )
2378+ _describe -t docker-system-commands "docker system command" _docker_system_subcommands
2379+}
2380+
2381+__docker_system_subcommand() {
2382+ local -a _command_args opts_help
2383+ local expl help="--help"
2384+ integer ret=1
2385+
2386+ opts_help=("(: -)--help[Print usage]")
2387+
2388+ case "$words[1]" in
2389+ (df)
2390+ _arguments $(__docker_arguments) \
2391+ $opts_help \
2392+ "($help -v --verbose)"{-v,--verbose}"[Show detailed information on space usage]" && ret=0
2393+ ;;
2394+ (events)
2395+ _arguments $(__docker_arguments) \
2396+ $opts_help \
2397+ "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_events_filter" \
2398+ "($help)--since=[Events created since this timestamp]:timestamp: " \
2399+ "($help)--until=[Events created until this timestamp]:timestamp: " \
2400+ "($help)--format=[Format the output using the given go template]:template: " && ret=0
2401+ ;;
2402+ (info)
2403+ _arguments $(__docker_arguments) \
2404+ $opts_help \
2405+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0
2406+ ;;
2407+ (prune)
2408+ _arguments $(__docker_arguments) \
2409+ $opts_help \
2410+ "($help -a --all)"{-a,--all}"[Remove all unused data, not just dangling ones]" \
2411+ "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
2412+ "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" \
2413+ "($help)--volumes=[Remove all unused volumes]" && ret=0
2414+ ;;
2415+ (help)
2416+ _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0
2417+ ;;
2418+ esac
2419+
2420+ return ret
2421+}
2422+
2423+# EO system
2424+
2425+# BO volume
2426+
2427+__docker_volume_complete_ls_filters() {
2428+ [[ $PREFIX = -* ]] && return 1
2429+ integer ret=1
2430+
2431+ if compset -P '*='; then
2432+ case "${${words[-1]%=*}#*=}" in
2433+ (dangling)
2434+ dangling_opts=('true' 'false')
2435+ _describe -t dangling-filter-opts "Dangling Filter Options" dangling_opts && ret=0
2436+ ;;
2437+ (driver)
2438+ __docker_complete_info_plugins Volume && ret=0
2439+ ;;
2440+ (name)
2441+ __docker_complete_volumes && ret=0
2442+ ;;
2443+ *)
2444+ _message 'value' && ret=0
2445+ ;;
2446+ esac
2447+ else
2448+ opts=('dangling' 'driver' 'label' 'name')
2449+ _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0
2450+ fi
2451+
2452+ return ret
2453+}
2454+
2455+__docker_complete_volumes() {
2456+ [[ $PREFIX = -* ]] && return 1
2457+ integer ret=1
2458+ declare -a lines volumes
2459+
2460+ lines=(${(f)${:-"$(_call_program commands docker $docker_options volume ls)"$'\n'}})
2461+
2462+ # Parse header line to find columns
2463+ local i=1 j=1 k header=${lines[1]}
2464+ declare -A begin end
2465+ while (( j < ${#header} - 1 )); do
2466+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
2467+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
2468+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
2469+ begin[${header[$i,$((j-1))]}]=$i
2470+ end[${header[$i,$((j-1))]}]=$k
2471+ done
2472+ end[${header[$i,$((j-1))]}]=-1
2473+ lines=(${lines[2,-1]})
2474+
2475+ # Names
2476+ local line s
2477+ for line in $lines; do
2478+ s="${line[${begin[VOLUME NAME]},${end[VOLUME NAME]}]%% ##}"
2479+ s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}"
2480+ volumes=($volumes $s)
2481+ done
2482+
2483+ _describe -t volumes-list "volumes" volumes && ret=0
2484+ return ret
2485+}
2486+
2487+__docker_volume_commands() {
2488+ local -a _docker_volume_subcommands
2489+ _docker_volume_subcommands=(
2490+ "create:Create a volume"
2491+ "inspect:Display detailed information on one or more volumes"
2492+ "ls:List volumes"
2493+ "prune:Remove all unused volumes"
2494+ "rm:Remove one or more volumes"
2495+ )
2496+ _describe -t docker-volume-commands "docker volume command" _docker_volume_subcommands
2497+}
2498+
2499+__docker_volume_subcommand() {
2500+ local -a _command_args opts_help
2501+ local expl help="--help"
2502+ integer ret=1
2503+
2504+ opts_help=("(: -)--help[Print usage]")
2505+
2506+ case "$words[1]" in
2507+ (create)
2508+ _arguments $(__docker_arguments) -A '-*' \
2509+ $opts_help \
2510+ "($help -d --driver)"{-d=,--driver=}"[Volume driver name]:Driver name:(local)" \
2511+ "($help)*--label=[Set metadata for a volume]:label=value: " \
2512+ "($help)*"{-o=,--opt=}"[Driver specific options]:Driver option: " \
2513+ "($help -)1:Volume name: " && ret=0
2514+ ;;
2515+ (inspect)
2516+ _arguments $(__docker_arguments) \
2517+ $opts_help \
2518+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
2519+ "($help -)1:volume:__docker_complete_volumes" && ret=0
2520+ ;;
2521+ (ls)
2522+ _arguments $(__docker_arguments) \
2523+ $opts_help \
2524+ "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_volume_complete_ls_filters" \
2525+ "($help)--format=[Format the output using the given Go template]:template: " \
2526+ "($help -q --quiet)"{-q,--quiet}"[Only display volume names]" && ret=0
2527+ ;;
2528+ (prune)
2529+ _arguments $(__docker_arguments) \
2530+ $opts_help \
2531+ "($help -a --all)"{-a,--all}"[Remove all unused local volumes, not just anonymous ones]" \
2532+ "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
2533+ "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0
2534+ ;;
2535+ (rm)
2536+ _arguments $(__docker_arguments) \
2537+ $opts_help \
2538+ "($help -f --force)"{-f,--force}"[Force the removal of one or more volumes]" \
2539+ "($help -):volume:__docker_complete_volumes" && ret=0
2540+ ;;
2541+ (help)
2542+ _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0
2543+ ;;
2544+ esac
2545+
2546+ return ret
2547+}
2548+
2549+# EO volume
2550+
2551+# BO context
2552+
2553+__docker_complete_contexts() {
2554+ [[ $PREFIX = -* ]] && return 1
2555+ integer ret=1
2556+ declare -a contexts
2557+
2558+ contexts=(${(f)${:-"$(_call_program commands docker $docker_options context ls -q)"$'\n'}})
2559+
2560+ _describe -t context-list "context" contexts && ret=0
2561+ return ret
2562+}
2563+
2564+__docker_context_commands() {
2565+ local -a _docker_context_subcommands
2566+ _docker_context_subcommands=(
2567+ "create:Create new context"
2568+ "inspect:Display detailed information on one or more contexts"
2569+ "list:List available contexts"
2570+ "rm:Remove one or more contexts"
2571+ "show:Print the current context"
2572+ "update:Update a context"
2573+ "use:Set the default context"
2574+ )
2575+ _describe -t docker-context-commands "docker context command" _docker_context_subcommands
2576+}
2577+
2578+__docker_context_subcommand() {
2579+ local -a _command_args opts_help
2580+ local expl help="--help"
2581+ integer ret=1
2582+
2583+ opts_help=("(: -)--help[Print usage]")
2584+
2585+ case "$words[1]" in
2586+ (create)
2587+ _arguments $(__docker_arguments) \
2588+ $opts_help \
2589+ "($help)--description=[Description of the context]:description:" \
2590+ "($help)--docker=[Set the docker endpoint]:docker:" \
2591+ "($help)--from=[Create context from a named context]:from:__docker_complete_contexts" \
2592+ "($help -):name: " && ret=0
2593+ ;;
2594+ (use)
2595+ _arguments $(__docker_arguments) \
2596+ $opts_help \
2597+ "($help -)1:context:__docker_complete_contexts" && ret=0
2598+ ;;
2599+ (inspect)
2600+ _arguments $(__docker_arguments) \
2601+ $opts_help \
2602+ "($help -)1:context:__docker_complete_contexts" && ret=0
2603+ ;;
2604+ (rm)
2605+ _arguments $(__docker_arguments) \
2606+ $opts_help \
2607+ "($help -)1:context:__docker_complete_contexts" && ret=0
2608+ ;;
2609+ (update)
2610+ _arguments $(__docker_arguments) \
2611+ $opts_help \
2612+ "($help)--description=[Description of the context]:description:" \
2613+ "($help)--docker=[Set the docker endpoint]:docker:" \
2614+ "($help -):name:" && ret=0
2615+ ;;
2616+ esac
2617+
2618+ return ret
2619+}
2620+
2621+# EO context
2622+
2623+__docker_caching_policy() {
2624+ oldp=( "$1"(Nmh+1) ) # 1 hour
2625+ (( $#oldp ))
2626+}
2627+
2628+__docker_commands() {
2629+ local cache_policy
2630+ integer force_invalidation=0
2631+
2632+ zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
2633+ if [[ -z "$cache_policy" ]]; then
2634+ zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy
2635+ fi
2636+
2637+ if ( (( ! ${+_docker_hide_legacy_commands} )) || _cache_invalid docker_hide_legacy_commands ) \
2638+ && ! _retrieve_cache docker_hide_legacy_commands;
2639+ then
2640+ _docker_hide_legacy_commands="${DOCKER_HIDE_LEGACY_COMMANDS}"
2641+ _store_cache docker_hide_legacy_commands _docker_hide_legacy_commands
2642+ fi
2643+
2644+ if [[ "${_docker_hide_legacy_commands}" != "${DOCKER_HIDE_LEGACY_COMMANDS}" ]]; then
2645+ force_invalidation=1
2646+ _docker_hide_legacy_commands="${DOCKER_HIDE_LEGACY_COMMANDS}"
2647+ _store_cache docker_hide_legacy_commands _docker_hide_legacy_commands
2648+ fi
2649+
2650+ if ( [[ ${+_docker_subcommands} -eq 0 ]] || _cache_invalid docker_subcommands ) \
2651+ && ! _retrieve_cache docker_subcommands || [[ ${force_invalidation} -eq 1 ]];
2652+ then
2653+ local -a lines
2654+ lines=(${(f)"$(_call_program commands docker 2>&1)"})
2655+ _docker_subcommands=(${${${(M)${lines[$((${lines[(i)*Commands:]} + 1)),-1]}:# *}## #}/\*# ##/:})
2656+ _docker_subcommands=($_docker_subcommands 'daemon:Enable daemon mode' 'help:Show help for a command')
2657+ (( $#_docker_subcommands > 2 )) && _store_cache docker_subcommands _docker_subcommands
2658+ fi
2659+ _describe -t docker-commands "docker command" _docker_subcommands
2660+}
2661+
2662+__docker_subcommand() {
2663+ local -a _command_args opts_help
2664+ local expl help="--help"
2665+ integer ret=1
2666+
2667+ opts_help=("(: -)--help[Print usage]")
2668+
2669+ case "$words[1]" in
2670+ (attach|commit|cp|create|diff|exec|export|kill|logs|pause|unpause|port|rename|restart|rm|run|start|stats|stop|top|update|wait)
2671+ __docker_container_subcommand && ret=0
2672+ ;;
2673+ (build|history|import|load|pull|push|save|tag)
2674+ __docker_image_subcommand && ret=0
2675+ ;;
2676+ (checkpoint)
2677+ local curcontext="$curcontext" state
2678+ _arguments $(__docker_arguments) \
2679+ $opts_help \
2680+ "($help -): :->command" \
2681+ "($help -)*:: :->option-or-argument" && ret=0
2682+
2683+ case $state in
2684+ (command)
2685+ __docker_checkpoint_commands && ret=0
2686+ ;;
2687+ (option-or-argument)
2688+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
2689+ __docker_checkpoint_subcommand && ret=0
2690+ ;;
2691+ esac
2692+ ;;
2693+ (container)
2694+ local curcontext="$curcontext" state
2695+ _arguments $(__docker_arguments) \
2696+ $opts_help \
2697+ "($help -): :->command" \
2698+ "($help -)*:: :->option-or-argument" && ret=0
2699+
2700+ case $state in
2701+ (command)
2702+ __docker_container_commands && ret=0
2703+ ;;
2704+ (option-or-argument)
2705+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
2706+ __docker_container_subcommand && ret=0
2707+ ;;
2708+ esac
2709+ ;;
2710+ (context)
2711+ local curcontext="$curcontext" state
2712+ _arguments $(__docker_arguments) \
2713+ $opts_help \
2714+ "($help -): :->command" \
2715+ "($help -)*:: :->option-or-argument" && ret=0
2716+
2717+ case $state in
2718+ (command)
2719+ __docker_context_commands && ret=0
2720+ ;;
2721+ (option-or-argument)
2722+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
2723+ __docker_context_subcommand && ret=0
2724+ ;;
2725+ esac
2726+ ;;
2727+ (daemon)
2728+ _arguments $(__docker_arguments) \
2729+ $opts_help \
2730+ "($help)*--add-runtime=[Register an additional OCI compatible runtime]:runtime:__docker_complete_runtimes" \
2731+ "($help)*--allow-nondistributable-artifacts=[Push nondistributable artifacts to specified registries]:registry: " \
2732+ "($help)--api-cors-header=[CORS headers in the Engine API]:CORS headers: " \
2733+ "($help)*--authorization-plugin=[Authorization plugins to load]" \
2734+ "($help -b --bridge)"{-b=,--bridge=}"[Attach containers to a network bridge]:bridge:_net_interfaces" \
2735+ "($help)--bip=[Network bridge IP]:IP address: " \
2736+ "($help)--cgroup-parent=[Parent cgroup for all containers]:cgroup: " \
2737+ "($help)--config-file=[Path to daemon configuration file]:Config File:_files" \
2738+ "($help)--containerd=[Path to containerd socket]:socket:_files -g \"*.sock\"" \
2739+ "($help)--containerd-namespace=[Containerd namespace to use]:containerd namespace:" \
2740+ "($help)--containerd-plugins-namespace=[Containerd namespace to use for plugins]:containerd namespace:" \
2741+ "($help)--data-root=[Root directory of persisted Docker data]:path:_directories" \
2742+ "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \
2743+ "($help)--default-gateway[Container default gateway IPv4 address]:IPv4 address: " \
2744+ "($help)--default-gateway-v6[Container default gateway IPv6 address]:IPv6 address: " \
2745+ "($help)--default-shm-size=[Default shm size for containers]:size:" \
2746+ "($help)*--default-ulimit=[Default ulimits for containers]:ulimit: " \
2747+ "($help)*--dns=[DNS server to use]:DNS: " \
2748+ "($help)*--dns-opt=[DNS options to use]:DNS option: " \
2749+ "($help)*--dns-search=[DNS search domains to use]:DNS search: " \
2750+ "($help)*--exec-opt=[Runtime execution options]:runtime execution options: " \
2751+ "($help)--exec-root=[Root directory for execution state files]:path:_directories" \
2752+ "($help)--experimental[Enable experimental features]" \
2753+ "($help)--fixed-cidr=[IPv4 subnet for fixed IPs]:IPv4 subnet: " \
2754+ "($help)--fixed-cidr-v6=[IPv6 subnet for fixed IPs]:IPv6 subnet: " \
2755+ "($help -G --group)"{-G=,--group=}"[Group for the unix socket]:group:_groups" \
2756+ "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \
2757+ "($help)--icc[Enable inter-container communication]" \
2758+ "($help)--init[Run an init inside containers to forward signals and reap processes]" \
2759+ "($help)--init-path=[Path to the docker-init binary]:docker-init binary:_files" \
2760+ "($help)*--insecure-registry=[Enable insecure registry communication]:registry: " \
2761+ "($help)--ip=[Default IP when binding container ports]" \
2762+ "($help)--ip-forward[Enable net.ipv4.ip_forward]" \
2763+ "($help)--ip-masq[Enable IP masquerading]" \
2764+ "($help)--iptables[Enable addition of iptables rules]" \
2765+ "($help)--ipv6[Enable IPv6 networking]" \
2766+ "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \
2767+ "($help)*--label=[Key=value labels]:label: " \
2768+ "($help)--live-restore[Enable live restore of docker when containers are still running]" \
2769+ "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" \
2770+ "($help)*--log-opt=[Default log driver options for containers]:log driver options:__docker_complete_log_options" \
2771+ "($help)--max-concurrent-downloads[Set the max concurrent downloads]" \
2772+ "($help)--max-concurrent-uploads[Set the max concurrent uploads]" \
2773+ "($help)--max-download-attempts[Set the max download attempts for each pull]" \
2774+ "($help)--mtu=[Network MTU]:mtu:(0 576 1420 1500 9000)" \
2775+ "($help)--oom-score-adjust=[Set the oom_score_adj for the daemon]:oom-score:(-500)" \
2776+ "($help -p --pidfile)"{-p=,--pidfile=}"[Path to use for daemon PID file]:PID file:_files" \
2777+ "($help)--raw-logs[Full timestamps without ANSI coloring]" \
2778+ "($help)*--registry-mirror=[Preferred registry mirror]:registry mirror: " \
2779+ "($help)--seccomp-profile=[Path to seccomp profile]:path:_files -g \"*.json\"" \
2780+ "($help -s --storage-driver)"{-s=,--storage-driver=}"[Storage driver to use]:driver:(btrfs devicemapper overlay2 vfs zfs)" \
2781+ "($help)--selinux-enabled[Enable selinux support]" \
2782+ "($help)--shutdown-timeout=[Set the shutdown timeout value in seconds]:time: " \
2783+ "($help)*--storage-opt=[Storage driver options]:storage driver options: " \
2784+ "($help)--tls[Use TLS]" \
2785+ "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g \"*.(pem|crt)\"" \
2786+ "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g \"*.(pem|crt)\"" \
2787+ "($help)--tlskey=[Path to TLS key file]:Key file:_files -g \"*.(pem|key)\"" \
2788+ "($help)--tlsverify[Use TLS and verify the remote]" \
2789+ "($help)--userns-remap=[User/Group setting for user namespaces]:user\:group:->users-groups" \
2790+ "($help)--userland-proxy[Use userland proxy for loopback traffic]" \
2791+ "($help)--userland-proxy-path=[Path to the userland proxy binary]:binary:_files" \
2792+ "($help)--validate[Validate daemon configuration and exit]" && ret=0
2793+
2794+ case $state in
2795+ (users-groups)
2796+ if compset -P '*:'; then
2797+ _groups && ret=0
2798+ else
2799+ _describe -t userns-default "default Docker user management" '(default)' && ret=0
2800+ _users && ret=0
2801+ fi
2802+ ;;
2803+ esac
2804+ ;;
2805+ (events|info)
2806+ __docker_system_subcommand && ret=0
2807+ ;;
2808+ (image)
2809+ local curcontext="$curcontext" state
2810+ _arguments $(__docker_arguments) \
2811+ $opts_help \
2812+ "($help -): :->command" \
2813+ "($help -)*:: :->option-or-argument" && ret=0
2814+
2815+ case $state in
2816+ (command)
2817+ __docker_image_commands && ret=0
2818+ ;;
2819+ (option-or-argument)
2820+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
2821+ __docker_image_subcommand && ret=0
2822+ ;;
2823+ esac
2824+ ;;
2825+ (images)
2826+ words[1]='ls'
2827+ __docker_image_subcommand && ret=0
2828+ ;;
2829+ (inspect)
2830+ local state
2831+ _arguments $(__docker_arguments) \
2832+ $opts_help \
2833+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
2834+ "($help -s --size)"{-s,--size}"[Display total file sizes if the type is container]" \
2835+ "($help)--type=[Return JSON for specified type]:type:(container image network node plugin service volume)" \
2836+ "($help -)*: :->values" && ret=0
2837+
2838+ case $state in
2839+ (values)
2840+ if [[ ${words[(r)--type=container]} == --type=container ]]; then
2841+ __docker_complete_containers && ret=0
2842+ elif [[ ${words[(r)--type=image]} == --type=image ]]; then
2843+ __docker_complete_images && ret=0
2844+ elif [[ ${words[(r)--type=network]} == --type=network ]]; then
2845+ __docker_complete_networks && ret=0
2846+ elif [[ ${words[(r)--type=node]} == --type=node ]]; then
2847+ __docker_complete_nodes && ret=0
2848+ elif [[ ${words[(r)--type=plugin]} == --type=plugin ]]; then
2849+ __docker_complete_plugins && ret=0
2850+ elif [[ ${words[(r)--type=service]} == --type=secrets ]]; then
2851+ __docker_complete_secrets && ret=0
2852+ elif [[ ${words[(r)--type=service]} == --type=service ]]; then
2853+ __docker_complete_services && ret=0
2854+ elif [[ ${words[(r)--type=volume]} == --type=volume ]]; then
2855+ __docker_complete_volumes && ret=0
2856+ else
2857+ __docker_complete_containers
2858+ __docker_complete_images
2859+ __docker_complete_networks
2860+ __docker_complete_nodes
2861+ __docker_complete_plugins
2862+ __docker_complete_secrets
2863+ __docker_complete_services
2864+ __docker_complete_volumes && ret=0
2865+ fi
2866+ ;;
2867+ esac
2868+ ;;
2869+ (login)
2870+ _arguments $(__docker_arguments) -A '-*' \
2871+ $opts_help \
2872+ "($help -p --password)"{-p=,--password=}"[Password]:password: " \
2873+ "($help)--password-stdin[Read password from stdin]" \
2874+ "($help -u --username)"{-u=,--username=}"[Username]:username: " \
2875+ "($help -)1:server: " && ret=0
2876+ ;;
2877+ (logout)
2878+ _arguments $(__docker_arguments) -A '-*' \
2879+ $opts_help \
2880+ "($help -)1:server: " && ret=0
2881+ ;;
2882+ (network)
2883+ local curcontext="$curcontext" state
2884+ _arguments $(__docker_arguments) \
2885+ $opts_help \
2886+ "($help -): :->command" \
2887+ "($help -)*:: :->option-or-argument" && ret=0
2888+
2889+ case $state in
2890+ (command)
2891+ __docker_network_commands && ret=0
2892+ ;;
2893+ (option-or-argument)
2894+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
2895+ __docker_network_subcommand && ret=0
2896+ ;;
2897+ esac
2898+ ;;
2899+ (node)
2900+ local curcontext="$curcontext" state
2901+ _arguments $(__docker_arguments) \
2902+ $opts_help \
2903+ "($help -): :->command" \
2904+ "($help -)*:: :->option-or-argument" && ret=0
2905+
2906+ case $state in
2907+ (command)
2908+ __docker_node_commands && ret=0
2909+ ;;
2910+ (option-or-argument)
2911+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
2912+ __docker_node_subcommand && ret=0
2913+ ;;
2914+ esac
2915+ ;;
2916+ (plugin)
2917+ local curcontext="$curcontext" state
2918+ _arguments $(__docker_arguments) \
2919+ $opts_help \
2920+ "($help -): :->command" \
2921+ "($help -)*:: :->option-or-argument" && ret=0
2922+
2923+ case $state in
2924+ (command)
2925+ __docker_plugin_commands && ret=0
2926+ ;;
2927+ (option-or-argument)
2928+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
2929+ __docker_plugin_subcommand && ret=0
2930+ ;;
2931+ esac
2932+ ;;
2933+ (ps)
2934+ words[1]='ls'
2935+ __docker_container_subcommand && ret=0
2936+ ;;
2937+ (rmi)
2938+ words[1]='rm'
2939+ __docker_image_subcommand && ret=0
2940+ ;;
2941+ (search)
2942+ _arguments $(__docker_arguments) -A '-*' \
2943+ $opts_help \
2944+ "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_search_filters" \
2945+ "($help)--limit=[Maximum returned search results]:limit:(1 5 10 25 50)" \
2946+ "($help)--no-trunc[Do not truncate output]" \
2947+ "($help -):term: " && ret=0
2948+ ;;
2949+ (secret)
2950+ local curcontext="$curcontext" state
2951+ _arguments $(__docker_arguments) \
2952+ $opts_help \
2953+ "($help -): :->command" \
2954+ "($help -)*:: :->option-or-argument" && ret=0
2955+
2956+ case $state in
2957+ (command)
2958+ __docker_secret_commands && ret=0
2959+ ;;
2960+ (option-or-argument)
2961+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
2962+ __docker_secret_subcommand && ret=0
2963+ ;;
2964+ esac
2965+ ;;
2966+ (service)
2967+ local curcontext="$curcontext" state
2968+ _arguments $(__docker_arguments) \
2969+ $opts_help \
2970+ "($help -): :->command" \
2971+ "($help -)*:: :->option-or-argument" && ret=0
2972+
2973+ case $state in
2974+ (command)
2975+ __docker_service_commands && ret=0
2976+ ;;
2977+ (option-or-argument)
2978+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
2979+ __docker_service_subcommand && ret=0
2980+ ;;
2981+ esac
2982+ ;;
2983+ (stack)
2984+ local curcontext="$curcontext" state
2985+ _arguments $(__docker_arguments) \
2986+ $opts_help \
2987+ "($help -): :->command" \
2988+ "($help -)*:: :->option-or-argument" && ret=0
2989+
2990+ case $state in
2991+ (command)
2992+ __docker_stack_commands && ret=0
2993+ ;;
2994+ (option-or-argument)
2995+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
2996+ __docker_stack_subcommand && ret=0
2997+ ;;
2998+ esac
2999+ ;;
3000+ (swarm)
3001+ local curcontext="$curcontext" state
3002+ _arguments $(__docker_arguments) \
3003+ $opts_help \
3004+ "($help -): :->command" \
3005+ "($help -)*:: :->option-or-argument" && ret=0
3006+
3007+ case $state in
3008+ (command)
3009+ __docker_swarm_commands && ret=0
3010+ ;;
3011+ (option-or-argument)
3012+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
3013+ __docker_swarm_subcommand && ret=0
3014+ ;;
3015+ esac
3016+ ;;
3017+ (system)
3018+ local curcontext="$curcontext" state
3019+ _arguments $(__docker_arguments) \
3020+ $opts_help \
3021+ "($help -): :->command" \
3022+ "($help -)*:: :->option-or-argument" && ret=0
3023+
3024+ case $state in
3025+ (command)
3026+ __docker_system_commands && ret=0
3027+ ;;
3028+ (option-or-argument)
3029+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
3030+ __docker_system_subcommand && ret=0
3031+ ;;
3032+ esac
3033+ ;;
3034+ (version)
3035+ _arguments $(__docker_arguments) \
3036+ $opts_help \
3037+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0
3038+ ;;
3039+ (volume)
3040+ local curcontext="$curcontext" state
3041+ _arguments $(__docker_arguments) \
3042+ $opts_help \
3043+ "($help -): :->command" \
3044+ "($help -)*:: :->option-or-argument" && ret=0
3045+
3046+ case $state in
3047+ (command)
3048+ __docker_volume_commands && ret=0
3049+ ;;
3050+ (option-or-argument)
3051+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
3052+ __docker_volume_subcommand && ret=0
3053+ ;;
3054+ esac
3055+ ;;
3056+ (help)
3057+ _arguments $(__docker_arguments) ":subcommand:__docker_commands" && ret=0
3058+ ;;
3059+ esac
3060+
3061+ return ret
3062+}
3063+
3064+_docker() {
3065+ # Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`.
3066+ # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`.
3067+ if [[ $service != docker ]]; then
3068+ _call_function - _$service
3069+ return
3070+ fi
3071+
3072+ local curcontext="$curcontext" state line help="-h --help"
3073+ integer ret=1
3074+ typeset -A opt_args
3075+
3076+ _arguments $(__docker_arguments) -C \
3077+ "(: -)"{-h,--help}"[Print usage]" \
3078+ "($help)--config[Location of client config files]:path:_directories" \
3079+ "($help -c --context)"{-c=,--context=}"[Execute the command in a docker context]:context:__docker_complete_contexts" \
3080+ "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \
3081+ "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \
3082+ "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \
3083+ "($help)--tls[Use TLS]" \
3084+ "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g "*.(pem|crt)"" \
3085+ "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g "*.(pem|crt)"" \
3086+ "($help)--tlskey=[Path to TLS key file]:Key file:_files -g "*.(pem|key)"" \
3087+ "($help)--tlsverify[Use TLS and verify the remote]" \
3088+ "($help)--userland-proxy[Use userland proxy for loopback traffic]" \
3089+ "($help -v --version)"{-v,--version}"[Print version information and quit]" \
3090+ "($help -): :->command" \
3091+ "($help -)*:: :->option-or-argument" && ret=0
3092+
3093+ local host=${opt_args[-H]}${opt_args[--host]}
3094+ local config=${opt_args[--config]}
3095+ local context=${opt_args[-c]}${opt_args[--context]}
3096+ local docker_options="${host:+--host $host} ${config:+--config $config} ${context:+--context $context} "
3097+
3098+ case $state in
3099+ (command)
3100+ __docker_commands && ret=0
3101+ ;;
3102+ (option-or-argument)
3103+ curcontext=${curcontext%:*:*}:docker-$words[1]:
3104+ __docker_subcommand && ret=0
3105+ ;;
3106+ esac
3107+
3108+ return ret
3109+}
3110+
3111+_dockerd() {
3112+ integer ret=1
3113+ words[1]='daemon'
3114+ __docker_subcommand && ret=0
3115+ return ret
3116+}
3117+
3118+_docker "$@"
3119+
3120+# Local Variables:
3121+# mode: Shell-Script
3122+# sh-indentation: 4
3123+# indent-tabs-mode: nil
3124+# sh-basic-offset: 4
3125+# End:
3126+# vim: ft=zsh sw=4 ts=4 et
+66-0.oh-my-zsh/plugins/docker/docker.plugin.zsh
@@ -0,0 +1,66 @@
1+alias dbl='docker build'
2+alias dcin='docker container inspect'
3+alias dcls='docker container ls'
4+alias dclsa='docker container ls -a'
5+alias dib='docker image build'
6+alias dii='docker image inspect'
7+alias dils='docker image ls'
8+alias dipu='docker image push'
9+alias dipru='docker image prune -a'
10+alias dirm='docker image rm'
11+alias dit='docker image tag'
12+alias dlo='docker container logs'
13+alias dnc='docker network create'
14+alias dncn='docker network connect'
15+alias dndcn='docker network disconnect'
16+alias dni='docker network inspect'
17+alias dnls='docker network ls'
18+alias dnrm='docker network rm'
19+alias dpo='docker container port'
20+alias dps='docker ps'
21+alias dpsa='docker ps -a'
22+alias dpu='docker pull'
23+alias dr='docker container run'
24+alias drit='docker container run -it'
25+alias drm='docker container rm'
26+alias 'drm!'='docker container rm -f'
27+alias dst='docker container start'
28+alias drs='docker container restart'
29+alias dsta='docker stop $(docker ps -q)'
30+alias dstp='docker container stop'
31+alias dsts='docker stats'
32+alias dtop='docker top'
33+alias dvi='docker volume inspect'
34+alias dvls='docker volume ls'
35+alias dvprune='docker volume prune'
36+alias dxc='docker container exec'
37+alias dxcit='docker container exec -it'
38+
39+if (( ! $+commands[docker] )); then
40+ return
41+fi
42+
43+# Standardized $0 handling
44+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
45+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
46+0="${${(M)0:#/*}:-$PWD/$0}"
47+
48+# If the completion file doesn't exist yet, we need to autoload it and
49+# bind it to `docker`. Otherwise, compinit will have already done that.
50+if [[ ! -f "$ZSH_CACHE_DIR/completions/_docker" ]]; then
51+ typeset -g -A _comps
52+ autoload -Uz _docker
53+ _comps[docker]=_docker
54+fi
55+
56+{
57+ # `docker completion` is only available from 23.0.0 on
58+ # docker version returns `Docker version 24.0.2, build cb74dfcd85`
59+ # with `s:,:` remove the comma after the version, and select third word of it
60+ if zstyle -t ':omz:plugins:docker' legacy-completion || \
61+ ! is-at-least 23.0.0 ${${(s:,:z)"$(command docker --version)"}[3]}; then
62+ command cp "${0:h}/completions/_docker" "$ZSH_CACHE_DIR/completions/_docker"
63+ else
64+ command docker completion zsh | tee "$ZSH_CACHE_DIR/completions/_docker" > /dev/null
65+ fi
66+} &|
+9-0.oh-my-zsh/plugins/doctl/README.md
@@ -0,0 +1,9 @@
1+# Doctl
2+
3+This plugin provides completion for [Doctl](https://github.com/digitalocean/doctl).
4+
5+To use it add doctl to the plugins array in your zshrc file.
6+
7+```bash
8+plugins=(... doctl)
9+```
+17-0.oh-my-zsh/plugins/doctl/doctl.plugin.zsh
@@ -0,0 +1,17 @@
1+# Autocompletion for doctl, the command line tool for DigitalOcean service
2+#
3+# doctl project: https://github.com/digitalocean/doctl
4+#
5+# Author: https://github.com/HalisCz
6+
7+if (( ! $+commands[doctl] )); then
8+ return
9+fi
10+
11+if [[ ! -f "$ZSH_CACHE_DIR/completions/_doctl" ]]; then
12+ typeset -g -A _comps
13+ autoload -Uz _doctl
14+ _comps[doctl]=_doctl
15+fi
16+
17+doctl completion zsh >| "$ZSH_CACHE_DIR/completions/_doctl" &|
+92-0.oh-my-zsh/plugins/dotenv/README.md
@@ -0,0 +1,92 @@
1+# dotenv
2+
3+Automatically load your project ENV variables from `.env` file when you `cd` into project root directory.
4+
5+Storing configuration in the environment is one of the tenets of a [twelve-factor app](https://www.12factor.net). Anything that is likely to change between deployment environments, such as resource handles for databases or credentials for external services, should be extracted from the code into environment variables.
6+
7+To use it, add `dotenv` to the plugins array in your zshrc file:
8+
9+```sh
10+plugins=(... dotenv)
11+```
12+
13+## Usage
14+
15+Create `.env` file inside your project root directory and put your ENV variables there.
16+
17+For example:
18+
19+```sh
20+export AWS_S3_TOKEN=d84a83539134f28f412c652b09f9f98eff96c9a
21+export SECRET_KEY=7c6c72d959416d5aa368a409362ec6e2ac90d7f
22+export MONGO_URI=mongodb://127.0.0.1:27017
23+export PORT=3001
24+```
25+
26+`export` is optional. This format works as well:
27+
28+```sh
29+AWS_S3_TOKEN=d84a83539134f28f412c652b09f9f98eff96c9a
30+SECRET_KEY=7c6c72d959416d5aa368a409362ec6e2ac90d7f
31+MONGO_URI=mongodb://127.0.0.1:27017
32+PORT=3001
33+```
34+
35+You can even mix both formats, although it's probably a bad idea.
36+
37+## Settings
38+
39+### ZSH_DOTENV_FILE
40+
41+You can also modify the name of the file to be loaded with the variable `ZSH_DOTENV_FILE`.
42+If the variable isn't set, the plugin will default to use `.env`.
43+For example, this will make the plugin look for files named `.dotenv` and load them:
44+
45+```zsh
46+# in ~/.zshrc, before Oh My Zsh is sourced:
47+ZSH_DOTENV_FILE=.dotenv
48+```
49+
50+### ZSH_DOTENV_PROMPT
51+
52+Set `ZSH_DOTENV_PROMPT=false` in your zshrc file if you don't want the confirmation message.
53+You can also choose the `Always` option when prompted to always allow sourcing the .env file
54+in that directory. See the next section for more details.
55+
56+### ZSH_DOTENV_ALLOWED_LIST, ZSH_DOTENV_DISALLOWED_LIST
57+
58+The default behavior of the plugin is to always ask whether to source a dotenv file. There's
59+a **Y**es, **N**o, **A**lways and N**e**ver option. If you choose Always, the directory of the .env file
60+will be added to an allowed list; if you choose Never, it will be added to a disallowed list.
61+If a directory is found in either of those lists, the plugin won't ask for confirmation and will
62+instead either source the .env file or proceed without action respectively.
63+
64+The allowed and disallowed lists are saved by default in `$ZSH_CACHE_DIR/dotenv-allowed.list` and
65+`$ZSH_CACHE_DIR/dotenv-disallowed.list` respectively. If you want to change that location,
66+change the `$ZSH_DOTENV_ALLOWED_LIST` and `$ZSH_DOTENV_DISALLOWED_LIST` variables, like so:
67+
68+```zsh
69+# in ~/.zshrc, before Oh My Zsh is sourced:
70+ZSH_DOTENV_ALLOWED_LIST=/path/to/dotenv/allowed/list
71+ZSH_DOTENV_DISALLOWED_LIST=/path/to/dotenv/disallowed/list
72+```
73+
74+The file is just a list of directories, separated by a newline character. If you want
75+to change your decision, just edit the file and remove the line for the directory you want to
76+change.
77+
78+NOTE: if a directory is found in both the allowed and disallowed lists, the disallowed list
79+takes preference, _i.e._ the .env file will never be sourced.
80+
81+## Version Control
82+
83+**It's strongly recommended to add `.env` file to `.gitignore`**, because usually it contains sensitive information such as your credentials, secret keys, passwords etc. You don't want to commit this file, it's supposed to be local only.
84+
85+## Disclaimer
86+
87+This plugin only sources the `.env` file. Nothing less, nothing more. It doesn't do any checks. It's designed to be the fastest and simplest option. You're responsible for the `.env` file content. You can put some code (or weird symbols) there, but do it on your own risk. `dotenv` is the basic tool, yet it does the job.
88+
89+If you need more advanced and feature-rich ENV management, check out these awesome projects:
90+
91+* [direnv](https://github.com/direnv/direnv)
92+* [zsh-autoenv](https://github.com/Tarrasch/zsh-autoenv)
+67-0.oh-my-zsh/plugins/dotenv/dotenv.plugin.zsh
@@ -0,0 +1,67 @@
1+## Settings
2+
3+# Filename of the dotenv file to look for
4+: ${ZSH_DOTENV_FILE:=.env}
5+
6+# Path to the file containing allowed paths
7+: ${ZSH_DOTENV_ALLOWED_LIST:="${ZSH_CACHE_DIR:-$ZSH/cache}/dotenv-allowed.list"}
8+: ${ZSH_DOTENV_DISALLOWED_LIST:="${ZSH_CACHE_DIR:-$ZSH/cache}/dotenv-disallowed.list"}
9+
10+
11+## Functions
12+
13+source_env() {
14+ if [[ ! -f "$ZSH_DOTENV_FILE" ]]; then
15+ return
16+ fi
17+
18+ if [[ "$ZSH_DOTENV_PROMPT" != false ]]; then
19+ local confirmation dirpath="${PWD:A}"
20+
21+ # make sure there is an (dis-)allowed file
22+ touch "$ZSH_DOTENV_ALLOWED_LIST"
23+ touch "$ZSH_DOTENV_DISALLOWED_LIST"
24+
25+ # early return if disallowed
26+ if command grep -Fx -q "$dirpath" "$ZSH_DOTENV_DISALLOWED_LIST" &>/dev/null; then
27+ return
28+ fi
29+
30+ # check if current directory's .env file is allowed or ask for confirmation
31+ if ! command grep -Fx -q "$dirpath" "$ZSH_DOTENV_ALLOWED_LIST" &>/dev/null; then
32+ # get cursor column and print new line before prompt if not at line beginning
33+ local column
34+ echo -ne "\e[6n" > /dev/tty
35+ read -t 1 -s -d R column < /dev/tty
36+ column="${column##*\[*;}"
37+ [[ $column -eq 1 ]] || echo
38+
39+ # print same-line prompt and output newline character if necessary
40+ echo -n "dotenv: found '$ZSH_DOTENV_FILE' file. Source it? ([Y]es/[n]o/[a]lways/n[e]ver) "
41+ read -k 1 confirmation
42+ [[ "$confirmation" = $'\n' ]] || echo
43+
44+ # check input
45+ case "$confirmation" in
46+ [nN]) return ;;
47+ [aA]) echo "$dirpath" >> "$ZSH_DOTENV_ALLOWED_LIST" ;;
48+ [eE]) echo "$dirpath" >> "$ZSH_DOTENV_DISALLOWED_LIST"; return ;;
49+ *) ;; # interpret anything else as a yes
50+ esac
51+ fi
52+ fi
53+
54+ # test .env syntax
55+ zsh -fn $ZSH_DOTENV_FILE || {
56+ echo "dotenv: error when sourcing '$ZSH_DOTENV_FILE' file" >&2
57+ return 1
58+ }
59+
60+ setopt localoptions allexport
61+ source $ZSH_DOTENV_FILE
62+}
63+
64+autoload -U add-zsh-hook
65+add-zsh-hook chpwd source_env
66+
67+source_env
+25-0.oh-my-zsh/plugins/dotnet/README.md
@@ -0,0 +1,25 @@
1+# .NET Core CLI plugin
2+
3+This plugin provides completion and useful aliases for [.NET Core CLI](https://dotnet.microsoft.com/).
4+
5+To use it, add `dotnet` to the plugins array in your zshrc file.
6+
7+```
8+plugins=(... dotnet)
9+```
10+
11+## Aliases
12+
13+| Alias | Command | Description |
14+|-------|------------------|-------------------------------------------------------------------|
15+| dn | dotnet new | Create a new .NET project or file. |
16+| dr | dotnet run | Build and run a .NET project output. |
17+| dt | dotnet test | Run unit tests using the test runner specified in a .NET project. |
18+| dw | dotnet watch | Watch for source file changes and restart the dotnet command. |
19+| dwr | dotnet watch run | Watch for source file changes and restart the `run` command. |
20+| dwt | dotnet watch test| Watch for source file changes and restart the `test` command. |
21+| ds | dotnet sln | Modify Visual Studio solution files. |
22+| da | dotnet add | Add a package or reference to a .NET project. |
23+| dp | dotnet pack | Create a NuGet package. |
24+| dng | dotnet nuget | Provides additional NuGet commands. |
25+| db | dotnet build | Build a .NET project |
+26-0.oh-my-zsh/plugins/dotnet/dotnet.plugin.zsh
@@ -0,0 +1,26 @@
1+# This scripts is copied from (MIT License):
2+# https://raw.githubusercontent.com/dotnet/sdk/main/scripts/register-completions.zsh
3+
4+#compdef dotnet
5+_dotnet_completion() {
6+ local -a completions=("${(@f)$(dotnet complete "${words}")}")
7+ compadd -a completions
8+ _files
9+}
10+
11+compdef _dotnet_completion dotnet
12+
13+# Aliases bellow are here for backwards compatibility
14+# added by Shaun Tabone (https://github.com/xontab)
15+
16+alias dn='dotnet new'
17+alias dr='dotnet run'
18+alias dt='dotnet test'
19+alias dw='dotnet watch'
20+alias dwr='dotnet watch run'
21+alias dwt='dotnet watch test'
22+alias ds='dotnet sln'
23+alias da='dotnet add'
24+alias dp='dotnet pack'
25+alias dng='dotnet nuget'
26+alias db='dotnet build'
+19-0.oh-my-zsh/plugins/droplr/README.md
@@ -0,0 +1,19 @@
1+# droplr
2+
3+Use [Droplr](https://droplr.com/) from the command line to upload files and shorten
4+links. It needs to have [Droplr.app](https://droplr.com/apps) installed and logged
5+in. MacOS only.
6+
7+To use it, add `droplr` to the `$plugins` variable in your zshrc file:
8+
9+```zsh
10+plugins=(... droplr)
11+```
12+
13+Author: [Fabio Fernandes](https://github.com/fabiofl)
14+
15+## Examples
16+
17+- Upload a file: `droplr ./path/to/file/`
18+
19+- Shorten a link: `droplr https://example.com`
+15-0.oh-my-zsh/plugins/droplr/droplr.plugin.zsh
@@ -0,0 +1,15 @@
1+# Only compatible with MacOS
2+[[ "$OSTYPE" == darwin* ]] || return
3+
4+droplr() {
5+ if [[ $# -eq 0 ]]; then
6+ echo You need to specify a parameter. >&2
7+ return 1
8+ fi
9+
10+ if [[ "$1" =~ ^https?:// ]]; then
11+ osascript -e 'tell app "Droplr" to shorten "'"$1"'"'
12+ else
13+ open -ga /Applications/Droplr.app "$1"
14+ fi
15+}
+66-0.oh-my-zsh/plugins/drush/README.md
@@ -0,0 +1,66 @@
1+# Drush
2+
3+This plugin adds aliases and functions for [Drush](https://www.drush.org), a command-line shell
4+and Unix scripting interface for Drupal. It also adds completion for the `drush` command.
5+
6+To enable it, add `drush` to the plugins array in zshrc file:
7+
8+```zsh
9+plugins=(... drush)
10+```
11+
12+## Aliases
13+
14+| Alias | Command | Description |
15+| ------- | ----------------------------------------------------------- | -------------------------------------------------------------------- |
16+| `dr` | `drush` | Display drush help |
17+| `drca` | `drush cc all` | _(Deprecated in Drush 8)_ Clear all drupal caches |
18+| `drcb` | `drush cc block` | _(Deprecated in Drush 8)_ Clear block cache |
19+| `drcex` | `drush config:export -y` | Export Drupal configuration to a directory |
20+| `drcg` | `drush cc registry` | _(Deprecated in Drush 8)_ Clear registry cache |
21+| `drcim` | `drush config:import -y` | Import config from a config directory |
22+| `drcj` | `drush cc css-js` | Clear css-js cache |
23+| `drcm` | `drush cc menu` | Clear menu cache |
24+| `drcml` | `drush cc module-list` | Clear module-list cache |
25+| `drcr` | `drush core-cron` | Run all cron hooks in all active modules for specified site |
26+| `drct` | `drush cc theme-registry` | Clear theme-registry cache |
27+| `drcv` | `drush cc views` | Clear views cache _(make sure that the views module is enabled)_ |
28+| `drdmp` | `drush drush sql-dump --ordered-dump --result-file=dumpsql` | Backup database in a new dump.sql file |
29+| `drf` | `drush features` | Display features status |
30+| `drfr` | `drush features-revert -y` | Revert a feature module on your site |
31+| `drfra` | `drush features-revert-all` | Revert all enabled feature module on your site |
32+| `drfu` | `drush features-update -y` | Update a feature module on your site |
33+| `drif` | `drush image-flush --all` | Flush all derived images |
34+| `drpm` | `drush pm-list --type=module` | Show a list of available modules |
35+| `drst` | `drush core-status` | Provides a birds-eye view of the current Drupal installation, if any |
36+| `druli` | `drush user:login` | Display a one time login link for user ID 1, or another user |
37+| `drup` | `drush updatedb` | Apply any database updates required (as with running update.php) |
38+| `drups` | `drush updatedb-status` | List any pending database updates |
39+| `drv` | `drush version` | Show drush version |
40+| `drvd` | `drush variable-del` | Delete a variable |
41+| `drvg` | `drush variable-get` | Get a list of some or all site variables and values |
42+| `drvs` | `drush variable-set` | Set a variable |
43+| `drws` | `drush watchdog:show` | Show watchdog messages |
44+| `drwse` | `drush watchdog:show --extended` | Show watchdog messages with extended information |
45+| `drwst` | `drush watchdog:tail` | Tail watchdog messages |
46+
47+## Functions
48+
49+- `dren`: download and enable one or more extensions (modules or themes). Must be
50+ invoked with one or more parameters, e.g.: `dren devel` or `dren devel module_filter views`.
51+
52+- `drf`: edit drushrc, site alias, and Drupal settings.php files.
53+ Can be invoked with one or without parameters, e.g.: `drf 1`.
54+
55+- `dris`: disable one or more extensions (modules or themes). Must be invoked with
56+ one or more parameters, e.g.: `dris devel` or `dris devel module_filter views`.
57+
58+- `drpu`: uninstall one or more modules. Must be invoked with one or more
59+ parameters, e.g.: `drpu devel` or `drpu devel module_filter views`.
60+
61+- `drnew`: creates a brand new drupal website. Note: as soon as the installation
62+ is complete, `drush` will print a username and a random password into the terminal:
63+
64+ ```text
65+ Installation complete. User name: admin User password: cf7t8yqNEm
66+ ```
+50-0.oh-my-zsh/plugins/drush/drush.complete.sh
@@ -0,0 +1,50 @@
1+# BASH completion script for Drush.
2+#
3+# Place this in your /etc/bash_completion.d/ directory or source it from your
4+# ~/.bash_completion or ~/.bash_profile files. Alternatively, source
5+# examples/example.bashrc instead, as it will automatically find and source
6+# this file.
7+#
8+# If you're using ZSH instead of BASH, add the following to your ~/.zshrc file
9+# and source it.
10+#
11+# autoload bashcompinit
12+# bashcompinit
13+# source /path/to/your/drush.complete.sh
14+
15+# Ensure drush is available.
16+which drush > /dev/null || alias drush &> /dev/null || return
17+
18+__drush_ps1() {
19+ f="${TMPDIR:-/tmp/}/drush-env-${USER}/drush-drupal-site-$$"
20+ if [ -f $f ]
21+ then
22+ __DRUPAL_SITE=$(cat "$f")
23+ else
24+ __DRUPAL_SITE="$DRUPAL_SITE"
25+ fi
26+
27+ # Set DRUSH_PS1_SHOWCOLORHINTS to a non-empty value and define a
28+ # __drush_ps1_colorize_alias() function for color hints in your Drush PS1
29+ # prompt. See example.prompt.sh for an example implementation.
30+ if [ -n "${__DRUPAL_SITE-}" ] && [ -n "${DRUSH_PS1_SHOWCOLORHINTS-}" ]; then
31+ __drush_ps1_colorize_alias
32+ fi
33+
34+ [[ -n "$__DRUPAL_SITE" ]] && printf "${1:- (%s)}" "$__DRUPAL_SITE"
35+}
36+
37+# Completion function, uses the "drush complete" command to retrieve
38+# completions for a specific command line COMP_WORDS.
39+_drush_completion() {
40+ # Set IFS to newline (locally), since we only use newline separators, and
41+ # need to retain spaces (or not) after completions.
42+ local IFS=$'\n'
43+ # The '< /dev/null' is a work around for a bug in php libedit stdin handling.
44+ # Note that libedit in place of libreadline in some distributions. See:
45+ # https://bugs.launchpad.net/ubuntu/+source/php5/+bug/322214
46+ COMPREPLY=( $(drush --early=includes/complete.inc "${COMP_WORDS[@]}" < /dev/null 2> /dev/null) )
47+}
48+
49+# Register our completion function. We include common short aliases for Drush.
50+complete -o bashdefault -o default -o nospace -F _drush_completion d dr drush drush5 drush6 drush7 drush8 drush.php
+107-0.oh-my-zsh/plugins/drush/drush.plugin.zsh
@@ -0,0 +1,107 @@
1+# Functions
2+function dren() {
3+ drush en "$@" -y
4+}
5+
6+function dris() {
7+ drush pm-disable "$@" -y
8+}
9+
10+function drpu() {
11+ drush pm-uninstall "$@" -y
12+}
13+
14+function drf() {
15+ if [[ -z "$1" ]] then
16+ drush core-config
17+ else
18+ drush core-config --choice=$1
19+ fi
20+}
21+
22+function drfi() {
23+ case "$1" in
24+ fields) drush field-info fields ;;
25+ types) drush field-info types ;;
26+ *) drush field-info ;;
27+ esac
28+}
29+
30+function drnew() {
31+ (
32+ cd
33+ echo "Website's name: "
34+ read WEBSITE_NAME
35+
36+ HOST=http://$(hostname -i)/
37+
38+ if [[ $WEBSITE_NAME == "" ]] then
39+ MINUTES=$(date +%M:%S)
40+ WEBSITE_NAME="Drupal-$MINUTES"
41+ echo "Your website will be named: $WEBSITE_NAME"
42+ fi
43+
44+ drush dl drupal --drupal-project-rename=$WEBSITE_NAME
45+
46+ echo "Type your localhost directory: (Leave empty for /var/www/html/)"
47+ read DIRECTORY
48+
49+ if [[ $DIRECTORY == "" ]] then
50+ DIRECTORY="/var/www/html/"
51+ fi
52+
53+ echo "Moving to $DIRECTORY$WEBSITE_NAME"
54+ sudo mv $WEBSITE_NAME $DIRECTORY
55+ cd $DIRECTORY$WEBSITE_NAME
56+
57+ echo "Database's user: "
58+ read DATABASE_USR
59+ echo "Database's password: "
60+ read -s DATABASE_PWD
61+ echo "Database's name for your project: "
62+ read DATABASE
63+
64+ DB_URL="mysql://$DATABASE_USR:$DATABASE_PWD@localhost/$DATABASE"
65+ drush site-install standard --db-url=$DB_URL --site-name=$WEBSITE_NAME
66+
67+ open_command $HOST$WEBSITE_NAME
68+ echo "Done"
69+ )
70+}
71+
72+# Aliases
73+alias dr="drush"
74+alias drca="drush cc all" # Deprecated for Drush 8
75+alias drcb="drush cc block" # Deprecated for Drush 8
76+alias drcex="drush config:export -y"
77+alias drcg="drush cc registry" # Deprecated for Drush 8
78+alias drcim="drush config:import -y"
79+alias drcj="drush cc css-js"
80+alias drcm="drush cc menu"
81+alias drcml="drush cc module-list"
82+alias drcr="drush core-cron"
83+alias drct="drush cc theme-registry"
84+alias drcv="drush cc views"
85+alias drdmp="drush sql-dump --ordered-dump --result-file=dump.sql"
86+alias drf="drush features"
87+alias drfr="drush features-revert -y"
88+alias drfra="drush features-revert-all"
89+alias drfu="drush features-update -y"
90+alias drif="drush image-flush --all"
91+alias drpm="drush pm-list --type=module"
92+alias drst="drush core-status"
93+alias druli="drush user:login"
94+alias drup="drush updatedb"
95+alias drups="drush updatedb-status"
96+alias drv="drush version"
97+alias drvd="drush variable-del"
98+alias drvg="drush variable-get"
99+alias drvs="drush variable-set"
100+alias drws="drush watchdog:show"
101+alias drwse="drush watchdog:show --extended"
102+alias drwst="drush watchdog:tail"
103+
104+# Enable drush autocomplete support
105+autoload bashcompinit
106+bashcompinit
107+source $(dirname $0)/drush.complete.sh
+11-0.oh-my-zsh/plugins/eecms/README.md
@@ -0,0 +1,11 @@
1+# eecms plugin
2+
3+This plugin adds auto-completion of console commands for [`eecms`](https://github.com/ExpressionEngine/ExpressionEngine).
4+
5+To use it, add `eecms` to the plugins array of your `.zshrc` file:
6+```
7+plugins=(... eecms)
8+```
9+
10+It also adds the alias `eecms` which finds the eecms file in the current project
11+and runs it with php.
+20-0.oh-my-zsh/plugins/eecms/eecms.plugin.zsh
@@ -0,0 +1,20 @@
1+# ExpressionEngine CMS basic command completion
2+
3+_eecms_console () {
4+ echo "php $(find . -maxdepth 3 -mindepth 1 -name 'eecms' -type f | head -n 1)"
5+}
6+
7+_eecms_get_command_list () {
8+ `_eecms_console` | sed "/Available commands/,/^/d" | sed "s/[[:space:]].*//g"
9+}
10+
11+_eecms () {
12+ compadd `_eecms_get_command_list`
13+}
14+
15+compdef _eecms '`_eecms_console`'
16+compdef _eecms 'system/ee/eecms'
17+compdef _eecms eecms
18+
19+#Alias
20+alias eecms='`_eecms_console`'
+30-0.oh-my-zsh/plugins/emacs/README.md
@@ -0,0 +1,30 @@
1+# Emacs plugin
2+
3+This plugin utilizes the Emacs daemon capability, allowing the user to quickly open frames, whether they are opened in a terminal via a ssh connection, or X frames opened on the same host. The plugin also provides some aliases for such operations.
4+
5+- You don't have the cost of starting Emacs all the time anymore
6+- Opening a file is as fast as Emacs does not have anything else to do.
7+- You can share opened buffered across opened frames.
8+- Configuration changes made at runtime are applied to all frames.
9+
10+**NOTE:** requires Emacs 24 and newer.
11+
12+To use it, add emacs to the plugins array in your zshrc file:
13+
14+```zsh
15+plugins=(... emacs)
16+```
17+
18+## Aliases
19+
20+The plugin uses a custom launcher (which we'll call here `$EMACS_LAUNCHER`) that is just a wrapper around [`emacsclient`](https://www.emacswiki.org/emacs/EmacsClient).
21+
22+| Alias | Command | Description |
23+|--------|----------------------------------------------------|----------------------------------------------------------------|
24+| emacs | `$EMACS_LAUNCHER --no-wait` | Opens a temporary emacsclient frame |
25+| e | `emacs` | Same as emacs alias |
26+| te | `$EMACS_LAUNCHER -nw` | Open terminal emacsclient |
27+| eeval | `$EMACS_LAUNCHER --eval` | Same as `M-x eval` but from outside Emacs |
28+| eframe | `emacsclient --alternate-editor="" --create-frame` | Create new X frame |
29+| efile | - | Print the path to the file open in the current buffer |
30+| ecd | - | Print the directory of the file open in the current buffer |
+68-0.oh-my-zsh/plugins/emacs/emacs.plugin.zsh
@@ -0,0 +1,68 @@
1+# Emacs 23 daemon capability is a killing feature.
2+# One emacs process handles all your frames whether
3+# you use a frame opened in a terminal via a ssh connection or X frames
4+# opened on the same host.
5+
6+# Benefits are multiple
7+# - You don't have the cost of starting Emacs all the time anymore
8+# - Opening a file is as fast as Emacs does not have anything else to do.
9+# - You can share opened buffered across opened frames.
10+# - Configuration changes made at runtime are applied to all frames.
11+
12+# Require emacs version to be minimum 24
13+autoload -Uz is-at-least
14+is-at-least 24 "${${(Az)"$(emacsclient --version 2>/dev/null)"}[2]}" || return 0
15+
16+# Handle $0 according to the standard:
17+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
18+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
19+0="${${(M)0:#/*}:-$PWD/$0}"
20+
21+# Path to custom emacsclient launcher
22+export EMACS_PLUGIN_LAUNCHER="${0:A:h}/emacsclient.sh"
23+
24+# set EDITOR if not already defined.
25+export EDITOR="${EDITOR:-${EMACS_PLUGIN_LAUNCHER}}"
26+
27+alias emacs="$EMACS_PLUGIN_LAUNCHER --no-wait"
28+alias e=emacs
29+# open terminal emacsclient
30+alias te="$EMACS_PLUGIN_LAUNCHER -nw"
31+
32+# same than M-x eval but from outside Emacs.
33+alias eeval="$EMACS_PLUGIN_LAUNCHER --eval"
34+# create a new X frame
35+alias eframe='emacsclient --alternate-editor="" --create-frame'
36+
37+# Emacs ANSI Term tracking
38+if [[ -n "$INSIDE_EMACS" ]] && [[ "$INSIDE_EMACS" != "vterm" ]]; then
39+ chpwd_emacs() { print -P "\033AnSiTc %d"; }
40+ print -P "\033AnSiTc %d" # Track current working directory
41+ print -P "\033AnSiTu %n" # Track username
42+
43+ # add chpwd hook
44+ autoload -Uz add-zsh-hook
45+ add-zsh-hook chpwd chpwd_emacs
46+fi
47+
48+# Write to standard output the path to the file
49+# opened in the current buffer.
50+function efile {
51+ local cmd="(buffer-file-name (window-buffer))"
52+ local file="$("$EMACS_PLUGIN_LAUNCHER" --eval "$cmd" | tr -d \")"
53+
54+ if [[ -z "$file" ]]; then
55+ echo "Can't deduce current buffer filename." >&2
56+ return 1
57+ fi
58+
59+ echo "$file"
60+}
61+
62+# Write to standard output the directory of the file
63+# opened in the current buffer
64+function ecd {
65+ local file
66+ file="$(efile)" || return $?
67+ echo "${file:h}"
68+}
+38-0.oh-my-zsh/plugins/emacs/emacsclient.sh
@@ -0,0 +1,38 @@
1+#!/bin/sh
2+
3+emacsfun() {
4+ local cmd frames
5+
6+ # Build the Emacs Lisp command to check for suitable frames
7+ # See https://www.gnu.org/software/emacs/manual/html_node/elisp/Frames.html#index-framep
8+ case "$*" in
9+ *-t*|*--tty*|*-nw*) cmd="(memq 't (mapcar 'framep (frame-list)))" ;; # if != nil, there are tty frames
10+ *) cmd="(delete 't (mapcar 'framep (frame-list)))" ;; # if != nil, there are graphical terminals (x, w32, ns)
11+ esac
12+
13+ # Check if there are suitable frames
14+ frames="$(emacsclient -a '' -n -e "$cmd" 2>/dev/null |sed 's/.*\x07//g' )"
15+
16+ # Only create another X frame if there isn't one present
17+ if [ -z "$frames" -o "$frames" = nil ]; then
18+ emacsclient --alternate-editor="" --create-frame "$@"
19+ return $?
20+ fi
21+
22+ emacsclient --alternate-editor="" "$@"
23+}
24+
25+# Adapted from https://github.com/davidshepherd7/emacs-read-stdin/blob/master/emacs-read-stdin.sh
26+# If the second argument is - then write stdin to a tempfile and open the
27+# tempfile. (first argument will be `--no-wait` passed in by the plugin.zsh)
28+if [ $# -ge 2 -a "$2" = "-" ]; then
29+ # Create a tempfile to hold stdin
30+ tempfile="$(mktemp --tmpdir emacs-stdin-$USERNAME.XXXXXXX 2>/dev/null \
31+ || mktemp -t emacs-stdin-$USERNAME)" # support BSD mktemp
32+ # Redirect stdin to the tempfile
33+ cat - > "$tempfile"
34+ # Reset $2 to the tempfile so that "$@" works as expected
35+ set -- "$1" "$tempfile" "${@:3}"
36+fi
37+
38+emacsfun "$@"
+33-0.oh-my-zsh/plugins/ember-cli/README.md
@@ -0,0 +1,33 @@
1+# Ember CLI
2+
3+This plugin adds completion and aliases for using [`ember-cli`](https://cli.emberjs.com/).
4+
5+To use it, add `ember-cli` to the plugins array in your zshrc file:
6+
7+```zsh
8+plugins=(... ember-cli)
9+```
10+
11+## Aliases
12+
13+| Alias | Command |
14+| ----- | -------------------- |
15+| `ea` | `ember addon` |
16+| `eb` | `ember build` |
17+| `ed` | `ember destroy` |
18+| `eg` | `ember generate` |
19+| `eh` | `ember help` |
20+| `ei` | `ember install` |
21+| `ein` | `ember init` |
22+| `es` | `ember serve` |
23+| `et` | `ember test` |
24+| `ets` | `ember test --serve` |
25+| `eu` | `ember update` |
26+| `ev` | `ember version` |
27+
28+## Maintainers
29+
30+- [BilalBudhani](https://github.com/BilalBudhani)
31+- [eubenesa](https://github.com/eubenesa)
32+- [scottkidder](https://github.com/scottkidder)
33+- [t-sauer](https://www.github.com/t-sauer)
+189-0.oh-my-zsh/plugins/ember-cli/_ember-cli
@@ -0,0 +1,189 @@
1+#compdef ember
2+
3+local curcontext="$curcontext" state line ret=1
4+
5+_arguments -C -A "--version" -A "--help" \
6+ '(- 1 *)--help' \
7+ '(- 1 *)--version' \
8+ '1: :->cmds' \
9+ '*:: :->args' && ret=0
10+
11+case $state in
12+ cmds)
13+ _values "ember command" \
14+ "addon[Generates a new folder structure for building an addon, complete with test harness]" \
15+ "asset-sizes[Shows the sizes of your asset files]" \
16+ "build[Builds your app and places it into the output path (dist/ by default)]" \
17+ "destroy[Destroys code generated by generate command]" \
18+ "generate[Generates new code from blueprints]" \
19+ "help[Outputs the usage instructions for all commands or the provided command]" \
20+ "init[Creates a new ember-cli project in the current folder]" \
21+ "install[Installs an ember-cli addon from npm]" \
22+ "new[Creates a new directory and runs ember init in it]" \
23+ "serve[Builds and serves your app, rebuilding on file changes]" \
24+ "test[Runs your app's test suite]" \
25+ "version[outputs ember-cli version]"
26+ ret=0
27+ ;;
28+ args)
29+ case $line[1] in
30+ help)
31+ _values 'commands' \
32+ 'addon' \
33+ 'asset-sizes' \
34+ 'build' \
35+ 'destroy' \
36+ 'generate' \
37+ 'help' \
38+ 'init' \
39+ 'install' \
40+ 'new' \
41+ 'serve' \
42+ 'test' \
43+ 'vesion' && ret=0
44+ ;;
45+ addon)
46+ _arguments \
47+ '(--blueprint)--blueprint=-' \
48+ '(--directory)--directory=-' \
49+ '(--dry-run)--dry-run' \
50+ '(--skip-bower)--skip-bower' \
51+ '(--skip-git)--skip-git' \
52+ '(--skip-npm)--skip-npm' \
53+ '(--verbose)--verbose'
54+ ;;
55+ asset-sizes)
56+ _arguments \
57+ '(--output-path)--output-path=-'
58+ ;;
59+ build)
60+ _arguments \
61+ '(--environment)--environment=-' \
62+ '(--output-path)--output-path=-' \
63+ '(--output-path)--suppress-sizes' \
64+ '(--watch)--watch' \
65+ '(--watcher)--watcher=-' \
66+ '(-dev)-dev' \
67+ '(-prod)-prod'
68+ ;;
69+ destroy|generate)
70+ _values 'arguments' \
71+ '(--classic)--classic' \
72+ '(--dry-run)--dry-run' \
73+ '(--dummy)--dummy' \
74+ '(--in-repo-addon)--in-repo-addon-=' \
75+ '(--pod)--pod' \
76+ '(--verbose)--verbose' && ret=0
77+ _values 'blueprints' \
78+ 'acceptance-test' \
79+ 'adapter' \
80+ 'adapter-test' \
81+ 'component' \
82+ 'component-addon' \
83+ 'component-test' \
84+ 'controller' \
85+ 'controller-test' \
86+ 'helper' \
87+ 'helper-addon' \
88+ 'helper-test' \
89+ 'initializer' \
90+ 'initializer-addon' \
91+ 'initializer-test' \
92+ 'instance-initializer' \
93+ 'instance-initializer-addon' \
94+ 'instance-initializer-test' \
95+ 'mixin' \
96+ 'mixin-test' \
97+ 'model' \
98+ 'model-test' \
99+ 'resource' \
100+ 'route' \
101+ 'route-addon' \
102+ 'route-test' \
103+ 'serializer' \
104+ 'serializer-test' \
105+ 'service' \
106+ 'service-test' \
107+ 'template' \
108+ 'test-helper' \
109+ 'transform' \
110+ 'transform-test' \
111+ 'util' \
112+ 'util-test' \
113+ 'view' \
114+ 'view-test' \
115+ 'addon' \
116+ 'addon-import' \
117+ 'app' \
118+ 'blueprint' \
119+ 'http-mock' \
120+ 'http-proxy' \
121+ 'in-repo-addon' \
122+ 'lib' \
123+ 'server' \
124+ 'vendor-shim' && ret=0
125+ ;;
126+ init)
127+ _arguments \
128+ '(--blueprint)--blueprint=-' \
129+ '(--name)--name=-' \
130+ '(--dry-run)--dry-run' \
131+ '(--skip-bower)--skip-bower' \
132+ '(--skip-npm)--skip-npm' \
133+ '(--verbose)--verbose'
134+ ;;
135+ install)
136+ _arguments \
137+ '(--save-dev)--save-dev' \
138+ '(--save)--save'
139+ ;;
140+ new)
141+ _arguments \
142+ '(--blueprint)--blueprint=-' \
143+ '(--directory)--directory=-' \
144+ '(--dry-run)--dry-run' \
145+ '(--skip-bower)--skip-bower' \
146+ '(--skip-git)--skip-git' \
147+ '(--skip-npm)--skip-npm' \
148+ '(--verbose)--verbose'
149+ ;;
150+ serve)
151+ _arguments \
152+ '(--port)--port=-[To use a port different than 4200. Pass 0 to automatically pick an available port.]' \
153+ '(--host)--host=-[Listens on all interfaces by default]' \
154+ '(--proxy)--proxy=-' \
155+ '(--secure-proxy)--secure-proxy[Set to false to proxy self-signed SSL certificates]' \
156+ '(--transparent-proxy)--transparent-proxy[Set to false to omit x-forwarded-* headers when proxying]' \
157+ '(--watcher)--watcher=-' \
158+ '(--live-reload)--live-reload' \
159+ '(--live-reload-host)--live-reload-host=-[Defaults to host]' \
160+ '(--live-reload-base-url)--live-reload-base-url=-[Defaults to baseURL]' \
161+ '(--live-reload-port)--live-reload-port=-[Defaults to port number within \[49152...65535\]]' \
162+ '(--environment)--environment=-' \
163+ '(--output-path)--output-path=-' \
164+ '(--ssl)--ssl' \
165+ '(--ssl-key)--ssl-key=-' \
166+ '(--ssl-cert)--ssl-cert=-'
167+ ;;
168+ test)
169+ _arguments \
170+ '(--environment)--environment=-' \
171+ '(--config-file)--config-file=-' \
172+ '(--server)--server' \
173+ '(--host)--host=-' \
174+ '(--test-port)--test-port=-[The test port to use when running with --server.]' \
175+ '(--filter)--filter=-[A string to filter tests to run]' \
176+ '(--module)--module=-[The name of a test module to run]' \
177+ '(--watcher)--watcher=-' \
178+ '(--launch)--launch=-[A comma separated list of browsers to launch for tests.]' \
179+ '(--reporter)--reporter=-[Test reporter to use \[tap|dot|xunit\] (default: tap)]' \
180+ '(--silent)--silent[Suppress any output except for the test report]' \
181+ '(--test-page)--test-page=-[Test page to invoke]' \
182+ '(--path)--path=-[Reuse an existing build at given path.]' \
183+ '(--query)--query=-[A query string to append to the test page URL.]'
184+ ;;
185+ esac
186+ ;;
187+esac
188+
189+return ret
+12-0.oh-my-zsh/plugins/ember-cli/ember-cli.plugin.zsh
@@ -0,0 +1,12 @@
1+alias ea='ember addon'
2+alias eb='ember build'
3+alias ed='ember destroy'
4+alias eg='ember generate'
5+alias eh='ember help'
6+alias ei='ember install'
7+alias ein='ember init'
8+alias es='ember serve'
9+alias et='ember test'
10+alias ets='ember test --serve'
11+alias eu='ember update'
12+alias ev='ember version'
+14-0.oh-my-zsh/plugins/emoji-clock/README.md
@@ -0,0 +1,14 @@
1+# emoji-clock
2+
3+The plugin displays current time as an emoji symbol with half hour accuracy.
4+
5+To use it, add `emoji-clock` to the plugins array of your zshrc file:
6+```
7+plugins=(... emoji-clock)
8+```
9+
10+## Features
11+
12+| Function | Description |
13+|-------------------|----------------------------------------------------------------------|
14+| `emoji-clock` | Displays current time in clock emoji symbol with half hour accuracy |
+33-0.oh-my-zsh/plugins/emoji-clock/emoji-clock.plugin.zsh
@@ -0,0 +1,33 @@
1+# ------------------------------------------------------------------------------
2+# FILE: emoji-clock.plugin.zsh
3+# DESCRIPTION: The current time with half hour accuracy as an emoji symbol.
4+# Inspired by Andre Torrez' "Put A Burger In Your Shell"
5+# https://notes.torrez.org/2013/04/put-a-burger-in-your-shell.html
6+# AUTHOR: Alexis Hildebrandt (afh[at]surryhill.net)
7+# VERSION: 1.0.0
8+# -----------------------------------------------------------------------------
9+
10+function emoji-clock() {
11+ # Add 15 minutes to the current time and save the value as $minutes.
12+ (( minutes = $(date '+%M') + 15 ))
13+ (( hour = $(date '+%I') + minutes / 60 ))
14+ # make sure minutes and hours don't exceed 60 nor 12 respectively
15+ (( minutes %= 60 )); (( hour %= 12 ))
16+
17+ case $hour in
18+ 0) clock="๐Ÿ•›"; [ $minutes -ge 30 ] && clock="๐Ÿ•ง";;
19+ 1) clock="๐Ÿ•"; [ $minutes -ge 30 ] && clock="๐Ÿ•œ";;
20+ 2) clock="๐Ÿ•‘"; [ $minutes -ge 30 ] && clock="๐Ÿ•";;
21+ 3) clock="๐Ÿ•’"; [ $minutes -ge 30 ] && clock="๐Ÿ•ž";;
22+ 4) clock="๐Ÿ•“"; [ $minutes -ge 30 ] && clock="๐Ÿ•Ÿ";;
23+ 5) clock="๐Ÿ•”"; [ $minutes -ge 30 ] && clock="๐Ÿ• ";;
24+ 6) clock="๐Ÿ••"; [ $minutes -ge 30 ] && clock="๐Ÿ•ก";;
25+ 7) clock="๐Ÿ•–"; [ $minutes -ge 30 ] && clock="๐Ÿ•ข";;
26+ 8) clock="๐Ÿ•—"; [ $minutes -ge 30 ] && clock="๐Ÿ•ฃ";;
27+ 9) clock="๐Ÿ•˜"; [ $minutes -ge 30 ] && clock="๐Ÿ•ค";;
28+ 10) clock="๐Ÿ•™"; [ $minutes -ge 30 ] && clock="๐Ÿ•ฅ";;
29+ 11) clock="๐Ÿ•š"; [ $minutes -ge 30 ] && clock="๐Ÿ•ฆ";;
30+ *) clock="โŒ›";;
31+ esac
32+ echo $clock
33+}
+127-0.oh-my-zsh/plugins/emoji/README.md
@@ -0,0 +1,127 @@
1+# emoji plugin
2+
3+Support for conveniently working with Unicode emoji in Zsh.
4+
5+## Features
6+
7+This plugin provides support for working with Unicode emoji characters in `zsh` using human-readable identifiers. It provides global variables which map emoji names to the actual characters, country names to their flags, and some named groupings of emoji. It also provides associated functions for displaying them.
8+
9+#### Variables
10+
11+Variable | Description
12+----------------- | --------------------------------
13+ $emoji | Maps emoji names to characters (except flags)
14+ $emoji_flags | Maps country names to flag characters (using region indicators)
15+ $emoji_groups | Named groups of emoji. Keys are group names; values are whitespace-separated lists of character names
16+
17+You may define new emoji groups at run time by modifying `$emoji_groups`. The special group name `all` is reserved for use by the plugin. You should not modify `$emoji` or `$emoji_flags`.
18+
19+#### Functions
20+
21+Function | Description
22+---------------- | -------------------------------
23+ random_emoji | Prints a random emoji character
24+ display_emoji | Displays emoji, along with their names
25+
26+## Usage and Examples
27+
28+To output a specific emoji, use:
29+```
30+$> echo $emoji[<name>]
31+```
32+E.g.:
33+```
34+$> echo $emoji[mouse_face]
35+```
36+
37+To output a random emoji, use:
38+```
39+$> random_emoji
40+```
41+To output a random emoji from a particular group, use:
42+```
43+$> random_emoji <group>
44+```
45+E.g.:
46+```
47+$> random_emoji fruits
48+$> random_emoji animals
49+$> random_emoji vehicles
50+$> random_emoji faces
51+```
52+
53+The defined group names can be found with `echo ${(k)emoji_groups}`.
54+
55+To list all available emoji with their names, use:
56+```
57+$> display_emoji
58+$> display_emoji faces
59+$> display_emoji people
60+```
61+
62+To use emoji in a prompt:
63+```
64+PROMPT="$emoji[penguin] > ""
65+PROMPT='$(random_emoji fruits) > '
66+surfer=$emoji[surfer]
67+PROMPT="$surfer > "
68+```
69+
70+## Technical Details
71+
72+The emoji names and codes are sourced from Unicode Technical Report \#51, which provides information on emoji support in Unicode. It can be found at https://www.unicode.org/reports/tr51/index.html.
73+
74+The group definitions are added by this OMZ plugin. They are not based on external definitions.
75+
76+The values in the `$emoji*` maps are the emoji characters themselves, not escape sequences or other forms that require interpretation. They can be used in any context and do not require escape sequence support from commands like `echo` or `print`.
77+
78+The emoji in the main `$emoji` map are standalone character sequences which can all be output on their own, without worrying about combining characters. The values may actually be multi-code-point sequences, instead of a single code point, and may include combining characters in those sequences. But they're arranged so their effects do not extend beyond that sequence.
79+
80+The exception to this is the skin tone / hair style variation selectors. These are included in the main `$emoji` map because they can be displayed on their own, as well as used as combining characters. (If they follow a character that is not one of the emoji characters they combine with, they are displayed as color swatches.)
81+
82+
83+## Experimental Features
84+
85+This defines some additional variables and functions, but these are experimental and subject to change at any time. You shouldn't rely on them being available. They're mostly for the use of emoji plugin developers to help decide what to include in future revisions.
86+
87+Variables:
88+
89+Variable | Description
90+----------------- | --------------------------------
91+ $emoji_skintone | Skin tone modifiers (from Unicode 8.0)
92+
93+
94+#### Skin Tone Variation Selection
95+
96+This includes experimental support for the skin tone Variation Selectors introduced with Unicode 8.0, which let you select different skin tones for emoji involving humans.
97+
98+NOTE: This really is experimental. The skin tone selectors are a relatively new feature and may not be supported by all systems. And the support in this plugin is a work in progress. It may not work in all places. In fact, I haven't gotten it to work anywhere yet. -apjanke
99+
100+The "variation selectors" are combining characters which change the appearance of the preceding character. A variation selector character can be output immediately following a human emoji to change its skin tone color. You can also output a variation selector on its own to display a color swatch of that skin tone.
101+
102+The `$emoji_skintone` associative array maps skin tone IDs to the variation selector characters. To use one, output it immediately following a smiley or other human emoji.
103+
104+```
105+echo $emoji[waving_hand]$emoji_skintone[5]
106+```
107+
108+Note that `$emoji_skintone` is an associative array, and its keys are the *names* of "Fitzpatrick Skin Type" groups, not linear indexes into a normal array. The names are `1_2`, `3`, `4`, `5`, and `6`. (Types 1 and 2 are combined into a single color.) See the [Diversity section in Unicode TR 51](https://www.unicode.org/reports/tr51/index.html#Diversity) for details.
109+
110+#### Gemoji support
111+
112+The [gemoji project](https://github.com/github/gemoji) seems to be the de facto main source for short names and other emoji-related metadata that isn't included in the official Unicode reports. So, our list of emojis incorporates some of their aliases to make your life more convenient:
113+
114+```
115+echo $emoji[grinning_face_with_smiling_eyes]
116+echo $emoji[smile]
117+```
118+
119+These two commands yield the same emoji (๐Ÿ˜„). The first name is the official one, in the Unicode reference, and the second one is the alias that was in Gemoji's database.
120+
121+## TODO
122+
123+These are things that could be enhanced in future revisions of the plugin.
124+
125+* Incorporate CLDR data for ordering and groupings
126+* Short :bracket: style names (from gemoji)
127+* ZWJ combining function?
+7274-0.oh-my-zsh/plugins/emoji/emoji-char-definitions.zsh
@@ -0,0 +1,7274 @@
1+
2+# emoji-char-definitions.zsh - Emoji definitions for oh-my-zsh emoji plugin
3+#
4+# This file is auto-generated by update_emoji.py. Do not edit it manually.
5+#
6+# This contains the definition for:
7+# $emoji - which maps character names to Unicode characters
8+# $emoji_flags - maps country names to Unicode flag characters using region
9+# indicators
10+# $emoji_mod - maps modifier components to Unicode characters
11+# $emoji_groups - a single associative array to avoid cluttering up the
12+# global namespace, and to allow adding additional group
13+# definitions at run time. The keys are the group names, and
14+# the values are whitespace-separated lists of emoji
15+# character names.
16+
17+# Main emoji
18+typeset -gAH emoji
19+# National flags
20+typeset -gAH emoji_flags
21+# Combining modifiers
22+typeset -gAH emoji_mod
23+# Emoji groups
24+typeset -gAH emoji_groups
25+emoji[grinning_face]=$'\U1F600'
26+emoji[grinning]=$'\U1F600'
27+emoji[grinning_face_with_big_eyes]=$'\U1F603'
28+emoji[smiley]=$'\U1F603'
29+emoji[grinning_face_with_smiling_eyes]=$'\U1F604'
30+emoji[smile]=$'\U1F604'
31+emoji[beaming_face_with_smiling_eyes]=$'\U1F601'
32+emoji[grin]=$'\U1F601'
33+emoji[grinning_squinting_face]=$'\U1F606'
34+emoji[laughing]=$'\U1F606'
35+emoji[satisfied]=$'\U1F606'
36+emoji[grinning_face_with_sweat]=$'\U1F605'
37+emoji[sweat_smile]=$'\U1F605'
38+emoji[rolling_on_the_floor_laughing]=$'\U1F923'
39+emoji[rofl]=$'\U1F923'
40+emoji[face_with_tears_of_joy]=$'\U1F602'
41+emoji[joy]=$'\U1F602'
42+emoji[slightly_smiling_face]=$'\U1F642'
43+emoji[upside_down_face]=$'\U1F643'
44+emoji[winking_face]=$'\U1F609'
45+emoji[wink]=$'\U1F609'
46+emoji[smiling_face_with_smiling_eyes]=$'\U1F60A'
47+emoji[blush]=$'\U1F60A'
48+emoji[smiling_face_with_halo]=$'\U1F607'
49+emoji[innocent]=$'\U1F607'
50+emoji[smiling_face_with_hearts]=$'\U1F970'
51+emoji[smiling_face_with_three_hearts]=$'\U1F970'
52+emoji[smiling_face_with_heart_eyes]=$'\U1F60D'
53+emoji[heart_eyes]=$'\U1F60D'
54+emoji[star_struck]=$'\U1F929'
55+emoji[face_blowing_a_kiss]=$'\U1F618'
56+emoji[kissing_heart]=$'\U1F618'
57+emoji[kissing_face]=$'\U1F617'
58+emoji[kissing]=$'\U1F617'
59+emoji[smiling_face]=$'\U263A\UFE0F'
60+emoji[relaxed]=$'\U263A\UFE0F'
61+emoji[smiling_face_unqualified]=$'\U263A'
62+emoji[kissing_face_with_closed_eyes]=$'\U1F61A'
63+emoji[kissing_closed_eyes]=$'\U1F61A'
64+emoji[kissing_face_with_smiling_eyes]=$'\U1F619'
65+emoji[kissing_smiling_eyes]=$'\U1F619'
66+emoji[face_savoring_food]=$'\U1F60B'
67+emoji[yum]=$'\U1F60B'
68+emoji[face_with_tongue]=$'\U1F61B'
69+emoji[stuck_out_tongue]=$'\U1F61B'
70+emoji[winking_face_with_tongue]=$'\U1F61C'
71+emoji[stuck_out_tongue_winking_eye]=$'\U1F61C'
72+emoji[zany_face]=$'\U1F92A'
73+emoji[squinting_face_with_tongue]=$'\U1F61D'
74+emoji[stuck_out_tongue_closed_eyes]=$'\U1F61D'
75+emoji[money_mouth_face]=$'\U1F911'
76+emoji[hugging_face]=$'\U1F917'
77+emoji[hugs]=$'\U1F917'
78+emoji[face_with_hand_over_mouth]=$'\U1F92D'
79+emoji[hand_over_mouth]=$'\U1F92D'
80+emoji[shushing_face]=$'\U1F92B'
81+emoji[thinking_face]=$'\U1F914'
82+emoji[thinking]=$'\U1F914'
83+emoji[zipper_mouth_face]=$'\U1F910'
84+emoji[face_with_raised_eyebrow]=$'\U1F928'
85+emoji[raised_eyebrow]=$'\U1F928'
86+emoji[neutral_face]=$'\U1F610'
87+emoji[expressionless_face]=$'\U1F611'
88+emoji[expressionless]=$'\U1F611'
89+emoji[face_without_mouth]=$'\U1F636'
90+emoji[no_mouth]=$'\U1F636'
91+emoji[smirking_face]=$'\U1F60F'
92+emoji[smirk]=$'\U1F60F'
93+emoji[unamused_face]=$'\U1F612'
94+emoji[unamused]=$'\U1F612'
95+emoji[face_with_rolling_eyes]=$'\U1F644'
96+emoji[roll_eyes]=$'\U1F644'
97+emoji[grimacing_face]=$'\U1F62C'
98+emoji[grimacing]=$'\U1F62C'
99+emoji[lying_face]=$'\U1F925'
100+emoji[relieved_face]=$'\U1F60C'
101+emoji[relieved]=$'\U1F60C'
102+emoji[pensive_face]=$'\U1F614'
103+emoji[pensive]=$'\U1F614'
104+emoji[sleepy_face]=$'\U1F62A'
105+emoji[sleepy]=$'\U1F62A'
106+emoji[drooling_face]=$'\U1F924'
107+emoji[sleeping_face]=$'\U1F634'
108+emoji[sleeping]=$'\U1F634'
109+emoji[face_with_medical_mask]=$'\U1F637'
110+emoji[mask]=$'\U1F637'
111+emoji[face_with_thermometer]=$'\U1F912'
112+emoji[face_with_head_bandage]=$'\U1F915'
113+emoji[nauseated_face]=$'\U1F922'
114+emoji[face_vomiting]=$'\U1F92E'
115+emoji[vomiting_face]=$'\U1F92E'
116+emoji[sneezing_face]=$'\U1F927'
117+emoji[hot_face]=$'\U1F975'
118+emoji[cold_face]=$'\U1F976'
119+emoji[woozy_face]=$'\U1F974'
120+emoji[dizzy_face]=$'\U1F635'
121+emoji[exploding_head]=$'\U1F92F'
122+emoji[cowboy_hat_face]=$'\U1F920'
123+emoji[partying_face]=$'\U1F973'
124+emoji[smiling_face_with_sunglasses]=$'\U1F60E'
125+emoji[nerd_face]=$'\U1F913'
126+emoji[face_with_monocle]=$'\U1F9D0'
127+emoji[monocle_face]=$'\U1F9D0'
128+emoji[confused_face]=$'\U1F615'
129+emoji[confused]=$'\U1F615'
130+emoji[worried_face]=$'\U1F61F'
131+emoji[worried]=$'\U1F61F'
132+emoji[slightly_frowning_face]=$'\U1F641'
133+emoji[slightly_frowning_face_1]=$'\U2639\UFE0F'
134+emoji[frowning_face_unqualified]=$'\U2639'
135+emoji[frowning_face]=$'\U2639'
136+emoji[face_with_open_mouth]=$'\U1F62E'
137+emoji[open_mouth]=$'\U1F62E'
138+emoji[hushed_face]=$'\U1F62F'
139+emoji[hushed]=$'\U1F62F'
140+emoji[astonished_face]=$'\U1F632'
141+emoji[astonished]=$'\U1F632'
142+emoji[flushed_face]=$'\U1F633'
143+emoji[flushed]=$'\U1F633'
144+emoji[pleading_face]=$'\U1F97A'
145+emoji[frowning_face_with_open_mouth]=$'\U1F626'
146+emoji[frowning]=$'\U1F626'
147+emoji[anguished_face]=$'\U1F627'
148+emoji[anguished]=$'\U1F627'
149+emoji[fearful_face]=$'\U1F628'
150+emoji[fearful]=$'\U1F628'
151+emoji[anxious_face_with_sweat]=$'\U1F630'
152+emoji[cold_sweat]=$'\U1F630'
153+emoji[sad_but_relieved_face]=$'\U1F625'
154+emoji[disappointed_relieved]=$'\U1F625'
155+emoji[crying_face]=$'\U1F622'
156+emoji[cry]=$'\U1F622'
157+emoji[loudly_crying_face]=$'\U1F62D'
158+emoji[sob]=$'\U1F62D'
159+emoji[face_screaming_in_fear]=$'\U1F631'
160+emoji[scream]=$'\U1F631'
161+emoji[confounded_face]=$'\U1F616'
162+emoji[confounded]=$'\U1F616'
163+emoji[persevering_face]=$'\U1F623'
164+emoji[persevere]=$'\U1F623'
165+emoji[disappointed_face]=$'\U1F61E'
166+emoji[disappointed]=$'\U1F61E'
167+emoji[downcast_face_with_sweat]=$'\U1F613'
168+emoji[sweat]=$'\U1F613'
169+emoji[weary_face]=$'\U1F629'
170+emoji[weary]=$'\U1F629'
171+emoji[tired_face]=$'\U1F62B'
172+emoji[yawning_face]=$'\U1F971'
173+emoji[face_with_steam_from_nose]=$'\U1F624'
174+emoji[triumph]=$'\U1F624'
175+emoji[pouting_face]=$'\U1F621'
176+emoji[rage]=$'\U1F621'
177+emoji[pout]=$'\U1F621'
178+emoji[angry_face]=$'\U1F620'
179+emoji[angry]=$'\U1F620'
180+emoji[face_with_symbols_on_mouth]=$'\U1F92C'
181+emoji[cursing_face]=$'\U1F92C'
182+emoji[smiling_face_with_horns]=$'\U1F608'
183+emoji[smiling_imp]=$'\U1F608'
184+emoji[angry_face_with_horns]=$'\U1F47F'
185+emoji[imp]=$'\U1F47F'
186+emoji[skull]=$'\U1F480'
187+emoji[skull_and_crossbones]=$'\U2620\UFE0F'
188+emoji[skull_and_crossbones_unqualified]=$'\U2620'
189+emoji[pile_of_poo]=$'\U1F4A9'
190+emoji[hankey]=$'\U1F4A9'
191+emoji[poop]=$'\U1F4A9'
192+emoji[shit]=$'\U1F4A9'
193+emoji[clown_face]=$'\U1F921'
194+emoji[ogre]=$'\U1F479'
195+emoji[japanese_ogre]=$'\U1F479'
196+emoji[goblin]=$'\U1F47A'
197+emoji[japanese_goblin]=$'\U1F47A'
198+emoji[ghost]=$'\U1F47B'
199+emoji[alien]=$'\U1F47D'
200+emoji[alien_monster]=$'\U1F47E'
201+emoji[space_invader]=$'\U1F47E'
202+emoji[robot]=$'\U1F916'
203+emoji[grinning_cat]=$'\U1F63A'
204+emoji[smiley_cat]=$'\U1F63A'
205+emoji[grinning_cat_with_smiling_eyes]=$'\U1F638'
206+emoji[smile_cat]=$'\U1F638'
207+emoji[cat_with_tears_of_joy]=$'\U1F639'
208+emoji[joy_cat]=$'\U1F639'
209+emoji[smiling_cat_with_heart_eyes]=$'\U1F63B'
210+emoji[heart_eyes_cat]=$'\U1F63B'
211+emoji[cat_with_wry_smile]=$'\U1F63C'
212+emoji[smirk_cat]=$'\U1F63C'
213+emoji[kissing_cat]=$'\U1F63D'
214+emoji[weary_cat]=$'\U1F640'
215+emoji[scream_cat]=$'\U1F640'
216+emoji[crying_cat]=$'\U1F63F'
217+emoji[crying_cat_face]=$'\U1F63F'
218+emoji[pouting_cat]=$'\U1F63E'
219+emoji[see_no_evil_monkey]=$'\U1F648'
220+emoji[see_no_evil]=$'\U1F648'
221+emoji[hear_no_evil_monkey]=$'\U1F649'
222+emoji[hear_no_evil]=$'\U1F649'
223+emoji[speak_no_evil_monkey]=$'\U1F64A'
224+emoji[speak_no_evil]=$'\U1F64A'
225+emoji[kiss_mark]=$'\U1F48B'
226+emoji[love_letter]=$'\U1F48C'
227+emoji[heart_with_arrow]=$'\U1F498'
228+emoji[cupid]=$'\U1F498'
229+emoji[heart_with_ribbon]=$'\U1F49D'
230+emoji[gift_heart]=$'\U1F49D'
231+emoji[sparkling_heart]=$'\U1F496'
232+emoji[growing_heart]=$'\U1F497'
233+emoji[heartpulse]=$'\U1F497'
234+emoji[beating_heart]=$'\U1F493'
235+emoji[heartbeat]=$'\U1F493'
236+emoji[revolving_hearts]=$'\U1F49E'
237+emoji[two_hearts]=$'\U1F495'
238+emoji[heart_decoration]=$'\U1F49F'
239+emoji[heart_exclamation]=$'\U2763\UFE0F'
240+emoji[heavy_heart_exclamation]=$'\U2763\UFE0F'
241+emoji[heart_exclamation_unqualified]=$'\U2763'
242+emoji[broken_heart]=$'\U1F494'
243+emoji[red_heart]=$'\U2764\UFE0F'
244+emoji[heart]=$'\U2764\UFE0F'
245+emoji[red_heart_unqualified]=$'\U2764'
246+emoji[orange_heart]=$'\U1F9E1'
247+emoji[yellow_heart]=$'\U1F49B'
248+emoji[green_heart]=$'\U1F49A'
249+emoji[blue_heart]=$'\U1F499'
250+emoji[purple_heart]=$'\U1F49C'
251+emoji[brown_heart]=$'\U1F90E'
252+emoji[black_heart]=$'\U1F5A4'
253+emoji[white_heart]=$'\U1F90D'
254+emoji[hundred_points]=$'\U1F4AF'
255+emoji[100]=$'\U1F4AF'
256+emoji[anger_symbol]=$'\U1F4A2'
257+emoji[anger]=$'\U1F4A2'
258+emoji[collision]=$'\U1F4A5'
259+emoji[boom]=$'\U1F4A5'
260+emoji[dizzy]=$'\U1F4AB'
261+emoji[sweat_droplets]=$'\U1F4A6'
262+emoji[sweat_drops]=$'\U1F4A6'
263+emoji[dashing_away]=$'\U1F4A8'
264+emoji[dash]=$'\U1F4A8'
265+emoji[hole]=$'\U1F573\UFE0F'
266+emoji[hole_unqualified]=$'\U1F573'
267+emoji[bomb]=$'\U1F4A3'
268+emoji[speech_balloon]=$'\U1F4AC'
269+emoji[eye_in_speech_bubble]=$'\U1F441\UFE0F\U200D\U1F5E8\UFE0F'
270+emoji[eye_speech_bubble]=$'\U1F441\UFE0F\U200D\U1F5E8\UFE0F'
271+emoji[eye_in_speech_bubble_unqualified]=$'\U1F441\U200D\U1F5E8\UFE0F'
272+emoji[eye_in_speech_bubble_unqualified_1]=$'\U1F441\UFE0F\U200D\U1F5E8'
273+emoji[eye_in_speech_bubble_unqualified_2]=$'\U1F441\U200D\U1F5E8'
274+emoji[left_speech_bubble]=$'\U1F5E8\UFE0F'
275+emoji[left_speech_bubble_unqualified]=$'\U1F5E8'
276+emoji[right_anger_bubble]=$'\U1F5EF\UFE0F'
277+emoji[right_anger_bubble_unqualified]=$'\U1F5EF'
278+emoji[thought_balloon]=$'\U1F4AD'
279+emoji[zzz]=$'\U1F4A4'
280+emoji[waving_hand]=$'\U1F44B'
281+emoji[wave]=$'\U1F44B'
282+emoji[waving_hand_light_skin_tone]=$'\U1F44B\U1F3FB'
283+emoji[waving_hand_medium_light_skin_tone]=$'\U1F44B\U1F3FC'
284+emoji[waving_hand_medium_skin_tone]=$'\U1F44B\U1F3FD'
285+emoji[waving_hand_medium_dark_skin_tone]=$'\U1F44B\U1F3FE'
286+emoji[waving_hand_dark_skin_tone]=$'\U1F44B\U1F3FF'
287+emoji[raised_back_of_hand]=$'\U1F91A'
288+emoji[raised_back_of_hand_light_skin_tone]=$'\U1F91A\U1F3FB'
289+emoji[raised_back_of_hand_medium_light_skin_tone]=$'\U1F91A\U1F3FC'
290+emoji[raised_back_of_hand_medium_skin_tone]=$'\U1F91A\U1F3FD'
291+emoji[raised_back_of_hand_medium_dark_skin_tone]=$'\U1F91A\U1F3FE'
292+emoji[raised_back_of_hand_dark_skin_tone]=$'\U1F91A\U1F3FF'
293+emoji[hand_with_fingers_splayed]=$'\U1F590\UFE0F'
294+emoji[hand_with_fingers_splayed_unqualified]=$'\U1F590'
295+emoji[raised_hand_with_fingers_splayed]=$'\U1F590'
296+emoji[hand_with_fingers_splayed_light_skin_tone]=$'\U1F590\U1F3FB'
297+emoji[hand_with_fingers_splayed_medium_light_skin_tone]=$'\U1F590\U1F3FC'
298+emoji[hand_with_fingers_splayed_medium_skin_tone]=$'\U1F590\U1F3FD'
299+emoji[hand_with_fingers_splayed_medium_dark_skin_tone]=$'\U1F590\U1F3FE'
300+emoji[hand_with_fingers_splayed_dark_skin_tone]=$'\U1F590\U1F3FF'
301+emoji[raised_hand]=$'\U270B'
302+emoji[hand]=$'\U270B'
303+emoji[raised_hand_light_skin_tone]=$'\U270B\U1F3FB'
304+emoji[raised_hand_medium_light_skin_tone]=$'\U270B\U1F3FC'
305+emoji[raised_hand_medium_skin_tone]=$'\U270B\U1F3FD'
306+emoji[raised_hand_medium_dark_skin_tone]=$'\U270B\U1F3FE'
307+emoji[raised_hand_dark_skin_tone]=$'\U270B\U1F3FF'
308+emoji[vulcan_salute]=$'\U1F596'
309+emoji[vulcan_salute_light_skin_tone]=$'\U1F596\U1F3FB'
310+emoji[vulcan_salute_medium_light_skin_tone]=$'\U1F596\U1F3FC'
311+emoji[vulcan_salute_medium_skin_tone]=$'\U1F596\U1F3FD'
312+emoji[vulcan_salute_medium_dark_skin_tone]=$'\U1F596\U1F3FE'
313+emoji[vulcan_salute_dark_skin_tone]=$'\U1F596\U1F3FF'
314+emoji[OK_hand]=$'\U1F44C'
315+emoji[ok_hand]=$'\U1F44C'
316+emoji[OK_hand_light_skin_tone]=$'\U1F44C\U1F3FB'
317+emoji[OK_hand_medium_light_skin_tone]=$'\U1F44C\U1F3FC'
318+emoji[OK_hand_medium_skin_tone]=$'\U1F44C\U1F3FD'
319+emoji[OK_hand_medium_dark_skin_tone]=$'\U1F44C\U1F3FE'
320+emoji[OK_hand_dark_skin_tone]=$'\U1F44C\U1F3FF'
321+emoji[pinching_hand]=$'\U1F90F'
322+emoji[pinching_hand_light_skin_tone]=$'\U1F90F\U1F3FB'
323+emoji[pinching_hand_medium_light_skin_tone]=$'\U1F90F\U1F3FC'
324+emoji[pinching_hand_medium_skin_tone]=$'\U1F90F\U1F3FD'
325+emoji[pinching_hand_medium_dark_skin_tone]=$'\U1F90F\U1F3FE'
326+emoji[pinching_hand_dark_skin_tone]=$'\U1F90F\U1F3FF'
327+emoji[victory_hand]=$'\U270C\UFE0F'
328+emoji[v]=$'\U270C\UFE0F'
329+emoji[victory_hand_unqualified]=$'\U270C'
330+emoji[victory_hand_light_skin_tone]=$'\U270C\U1F3FB'
331+emoji[victory_hand_medium_light_skin_tone]=$'\U270C\U1F3FC'
332+emoji[victory_hand_medium_skin_tone]=$'\U270C\U1F3FD'
333+emoji[victory_hand_medium_dark_skin_tone]=$'\U270C\U1F3FE'
334+emoji[victory_hand_dark_skin_tone]=$'\U270C\U1F3FF'
335+emoji[crossed_fingers]=$'\U1F91E'
336+emoji[crossed_fingers_light_skin_tone]=$'\U1F91E\U1F3FB'
337+emoji[crossed_fingers_medium_light_skin_tone]=$'\U1F91E\U1F3FC'
338+emoji[crossed_fingers_medium_skin_tone]=$'\U1F91E\U1F3FD'
339+emoji[crossed_fingers_medium_dark_skin_tone]=$'\U1F91E\U1F3FE'
340+emoji[crossed_fingers_dark_skin_tone]=$'\U1F91E\U1F3FF'
341+emoji[love_you_gesture]=$'\U1F91F'
342+emoji[love_you_gesture_light_skin_tone]=$'\U1F91F\U1F3FB'
343+emoji[love_you_gesture_medium_light_skin_tone]=$'\U1F91F\U1F3FC'
344+emoji[love_you_gesture_medium_skin_tone]=$'\U1F91F\U1F3FD'
345+emoji[love_you_gesture_medium_dark_skin_tone]=$'\U1F91F\U1F3FE'
346+emoji[love_you_gesture_dark_skin_tone]=$'\U1F91F\U1F3FF'
347+emoji[sign_of_the_horns]=$'\U1F918'
348+emoji[metal]=$'\U1F918'
349+emoji[sign_of_the_horns_light_skin_tone]=$'\U1F918\U1F3FB'
350+emoji[sign_of_the_horns_medium_light_skin_tone]=$'\U1F918\U1F3FC'
351+emoji[sign_of_the_horns_medium_skin_tone]=$'\U1F918\U1F3FD'
352+emoji[sign_of_the_horns_medium_dark_skin_tone]=$'\U1F918\U1F3FE'
353+emoji[sign_of_the_horns_dark_skin_tone]=$'\U1F918\U1F3FF'
354+emoji[call_me_hand]=$'\U1F919'
355+emoji[call_me_hand_light_skin_tone]=$'\U1F919\U1F3FB'
356+emoji[call_me_hand_medium_light_skin_tone]=$'\U1F919\U1F3FC'
357+emoji[call_me_hand_medium_skin_tone]=$'\U1F919\U1F3FD'
358+emoji[call_me_hand_medium_dark_skin_tone]=$'\U1F919\U1F3FE'
359+emoji[call_me_hand_dark_skin_tone]=$'\U1F919\U1F3FF'
360+emoji[backhand_index_pointing_left]=$'\U1F448'
361+emoji[point_left]=$'\U1F448'
362+emoji[backhand_index_pointing_left_light_skin_tone]=$'\U1F448\U1F3FB'
363+emoji[backhand_index_pointing_left_medium_light_skin_tone]=$'\U1F448\U1F3FC'
364+emoji[backhand_index_pointing_left_medium_skin_tone]=$'\U1F448\U1F3FD'
365+emoji[backhand_index_pointing_left_medium_dark_skin_tone]=$'\U1F448\U1F3FE'
366+emoji[backhand_index_pointing_left_dark_skin_tone]=$'\U1F448\U1F3FF'
367+emoji[backhand_index_pointing_right]=$'\U1F449'
368+emoji[point_right]=$'\U1F449'
369+emoji[backhand_index_pointing_right_light_skin_tone]=$'\U1F449\U1F3FB'
370+emoji[backhand_index_pointing_right_medium_light_skin_tone]=$'\U1F449\U1F3FC'
371+emoji[backhand_index_pointing_right_medium_skin_tone]=$'\U1F449\U1F3FD'
372+emoji[backhand_index_pointing_right_medium_dark_skin_tone]=$'\U1F449\U1F3FE'
373+emoji[backhand_index_pointing_right_dark_skin_tone]=$'\U1F449\U1F3FF'
374+emoji[backhand_index_pointing_up]=$'\U1F446'
375+emoji[point_up_2]=$'\U1F446'
376+emoji[backhand_index_pointing_up_light_skin_tone]=$'\U1F446\U1F3FB'
377+emoji[backhand_index_pointing_up_medium_light_skin_tone]=$'\U1F446\U1F3FC'
378+emoji[backhand_index_pointing_up_medium_skin_tone]=$'\U1F446\U1F3FD'
379+emoji[backhand_index_pointing_up_medium_dark_skin_tone]=$'\U1F446\U1F3FE'
380+emoji[backhand_index_pointing_up_dark_skin_tone]=$'\U1F446\U1F3FF'
381+emoji[middle_finger]=$'\U1F595'
382+emoji[fu]=$'\U1F595'
383+emoji[middle_finger_light_skin_tone]=$'\U1F595\U1F3FB'
384+emoji[middle_finger_medium_light_skin_tone]=$'\U1F595\U1F3FC'
385+emoji[middle_finger_medium_skin_tone]=$'\U1F595\U1F3FD'
386+emoji[middle_finger_medium_dark_skin_tone]=$'\U1F595\U1F3FE'
387+emoji[middle_finger_dark_skin_tone]=$'\U1F595\U1F3FF'
388+emoji[backhand_index_pointing_down]=$'\U1F447'
389+emoji[point_down]=$'\U1F447'
390+emoji[backhand_index_pointing_down_light_skin_tone]=$'\U1F447\U1F3FB'
391+emoji[backhand_index_pointing_down_medium_light_skin_tone]=$'\U1F447\U1F3FC'
392+emoji[backhand_index_pointing_down_medium_skin_tone]=$'\U1F447\U1F3FD'
393+emoji[backhand_index_pointing_down_medium_dark_skin_tone]=$'\U1F447\U1F3FE'
394+emoji[backhand_index_pointing_down_dark_skin_tone]=$'\U1F447\U1F3FF'
395+emoji[index_pointing_up]=$'\U261D\UFE0F'
396+emoji[point_up]=$'\U261D\UFE0F'
397+emoji[index_pointing_up_unqualified]=$'\U261D'
398+emoji[index_pointing_up_light_skin_tone]=$'\U261D\U1F3FB'
399+emoji[index_pointing_up_medium_light_skin_tone]=$'\U261D\U1F3FC'
400+emoji[index_pointing_up_medium_skin_tone]=$'\U261D\U1F3FD'
401+emoji[index_pointing_up_medium_dark_skin_tone]=$'\U261D\U1F3FE'
402+emoji[index_pointing_up_dark_skin_tone]=$'\U261D\U1F3FF'
403+emoji[thumbs_up]=$'\U1F44D'
404+emoji[+1]=$'\U1F44D'
405+emoji[thumbsup]=$'\U1F44D'
406+emoji[thumbs_up_light_skin_tone]=$'\U1F44D\U1F3FB'
407+emoji[thumbs_up_medium_light_skin_tone]=$'\U1F44D\U1F3FC'
408+emoji[thumbs_up_medium_skin_tone]=$'\U1F44D\U1F3FD'
409+emoji[thumbs_up_medium_dark_skin_tone]=$'\U1F44D\U1F3FE'
410+emoji[thumbs_up_dark_skin_tone]=$'\U1F44D\U1F3FF'
411+emoji[thumbs_down]=$'\U1F44E'
412+emoji[-1]=$'\U1F44E'
413+emoji[thumbsdown]=$'\U1F44E'
414+emoji[thumbs_down_light_skin_tone]=$'\U1F44E\U1F3FB'
415+emoji[thumbs_down_medium_light_skin_tone]=$'\U1F44E\U1F3FC'
416+emoji[thumbs_down_medium_skin_tone]=$'\U1F44E\U1F3FD'
417+emoji[thumbs_down_medium_dark_skin_tone]=$'\U1F44E\U1F3FE'
418+emoji[thumbs_down_dark_skin_tone]=$'\U1F44E\U1F3FF'
419+emoji[raised_fist]=$'\U270A'
420+emoji[fist_raised]=$'\U270A'
421+emoji[fist]=$'\U270A'
422+emoji[raised_fist_light_skin_tone]=$'\U270A\U1F3FB'
423+emoji[raised_fist_medium_light_skin_tone]=$'\U270A\U1F3FC'
424+emoji[raised_fist_medium_skin_tone]=$'\U270A\U1F3FD'
425+emoji[raised_fist_medium_dark_skin_tone]=$'\U270A\U1F3FE'
426+emoji[raised_fist_dark_skin_tone]=$'\U270A\U1F3FF'
427+emoji[oncoming_fist]=$'\U1F44A'
428+emoji[fist_oncoming]=$'\U1F44A'
429+emoji[facepunch]=$'\U1F44A'
430+emoji[punch]=$'\U1F44A'
431+emoji[oncoming_fist_light_skin_tone]=$'\U1F44A\U1F3FB'
432+emoji[oncoming_fist_medium_light_skin_tone]=$'\U1F44A\U1F3FC'
433+emoji[oncoming_fist_medium_skin_tone]=$'\U1F44A\U1F3FD'
434+emoji[oncoming_fist_medium_dark_skin_tone]=$'\U1F44A\U1F3FE'
435+emoji[oncoming_fist_dark_skin_tone]=$'\U1F44A\U1F3FF'
436+emoji[left_facing_fist]=$'\U1F91B'
437+emoji[fist_left]=$'\U1F91B'
438+emoji[left_facing_fist_light_skin_tone]=$'\U1F91B\U1F3FB'
439+emoji[left_facing_fist_medium_light_skin_tone]=$'\U1F91B\U1F3FC'
440+emoji[left_facing_fist_medium_skin_tone]=$'\U1F91B\U1F3FD'
441+emoji[left_facing_fist_medium_dark_skin_tone]=$'\U1F91B\U1F3FE'
442+emoji[left_facing_fist_dark_skin_tone]=$'\U1F91B\U1F3FF'
443+emoji[right_facing_fist]=$'\U1F91C'
444+emoji[fist_right]=$'\U1F91C'
445+emoji[right_facing_fist_light_skin_tone]=$'\U1F91C\U1F3FB'
446+emoji[right_facing_fist_medium_light_skin_tone]=$'\U1F91C\U1F3FC'
447+emoji[right_facing_fist_medium_skin_tone]=$'\U1F91C\U1F3FD'
448+emoji[right_facing_fist_medium_dark_skin_tone]=$'\U1F91C\U1F3FE'
449+emoji[right_facing_fist_dark_skin_tone]=$'\U1F91C\U1F3FF'
450+emoji[clapping_hands]=$'\U1F44F'
451+emoji[clap]=$'\U1F44F'
452+emoji[clapping_hands_light_skin_tone]=$'\U1F44F\U1F3FB'
453+emoji[clapping_hands_medium_light_skin_tone]=$'\U1F44F\U1F3FC'
454+emoji[clapping_hands_medium_skin_tone]=$'\U1F44F\U1F3FD'
455+emoji[clapping_hands_medium_dark_skin_tone]=$'\U1F44F\U1F3FE'
456+emoji[clapping_hands_dark_skin_tone]=$'\U1F44F\U1F3FF'
457+emoji[raising_hands]=$'\U1F64C'
458+emoji[raised_hands]=$'\U1F64C'
459+emoji[raising_hands_light_skin_tone]=$'\U1F64C\U1F3FB'
460+emoji[raising_hands_medium_light_skin_tone]=$'\U1F64C\U1F3FC'
461+emoji[raising_hands_medium_skin_tone]=$'\U1F64C\U1F3FD'
462+emoji[raising_hands_medium_dark_skin_tone]=$'\U1F64C\U1F3FE'
463+emoji[raising_hands_dark_skin_tone]=$'\U1F64C\U1F3FF'
464+emoji[open_hands]=$'\U1F450'
465+emoji[open_hands_light_skin_tone]=$'\U1F450\U1F3FB'
466+emoji[open_hands_medium_light_skin_tone]=$'\U1F450\U1F3FC'
467+emoji[open_hands_medium_skin_tone]=$'\U1F450\U1F3FD'
468+emoji[open_hands_medium_dark_skin_tone]=$'\U1F450\U1F3FE'
469+emoji[open_hands_dark_skin_tone]=$'\U1F450\U1F3FF'
470+emoji[palms_up_together]=$'\U1F932'
471+emoji[palms_up_together_light_skin_tone]=$'\U1F932\U1F3FB'
472+emoji[palms_up_together_medium_light_skin_tone]=$'\U1F932\U1F3FC'
473+emoji[palms_up_together_medium_skin_tone]=$'\U1F932\U1F3FD'
474+emoji[palms_up_together_medium_dark_skin_tone]=$'\U1F932\U1F3FE'
475+emoji[palms_up_together_dark_skin_tone]=$'\U1F932\U1F3FF'
476+emoji[handshake]=$'\U1F91D'
477+emoji[folded_hands]=$'\U1F64F'
478+emoji[pray]=$'\U1F64F'
479+emoji[folded_hands_light_skin_tone]=$'\U1F64F\U1F3FB'
480+emoji[folded_hands_medium_light_skin_tone]=$'\U1F64F\U1F3FC'
481+emoji[folded_hands_medium_skin_tone]=$'\U1F64F\U1F3FD'
482+emoji[folded_hands_medium_dark_skin_tone]=$'\U1F64F\U1F3FE'
483+emoji[folded_hands_dark_skin_tone]=$'\U1F64F\U1F3FF'
484+emoji[writing_hand]=$'\U270D\UFE0F'
485+emoji[writing_hand_unqualified]=$'\U270D'
486+emoji[writing_hand_light_skin_tone]=$'\U270D\U1F3FB'
487+emoji[writing_hand_medium_light_skin_tone]=$'\U270D\U1F3FC'
488+emoji[writing_hand_medium_skin_tone]=$'\U270D\U1F3FD'
489+emoji[writing_hand_medium_dark_skin_tone]=$'\U270D\U1F3FE'
490+emoji[writing_hand_dark_skin_tone]=$'\U270D\U1F3FF'
491+emoji[nail_polish]=$'\U1F485'
492+emoji[nail_care]=$'\U1F485'
493+emoji[nail_polish_light_skin_tone]=$'\U1F485\U1F3FB'
494+emoji[nail_polish_medium_light_skin_tone]=$'\U1F485\U1F3FC'
495+emoji[nail_polish_medium_skin_tone]=$'\U1F485\U1F3FD'
496+emoji[nail_polish_medium_dark_skin_tone]=$'\U1F485\U1F3FE'
497+emoji[nail_polish_dark_skin_tone]=$'\U1F485\U1F3FF'
498+emoji[selfie]=$'\U1F933'
499+emoji[selfie_light_skin_tone]=$'\U1F933\U1F3FB'
500+emoji[selfie_medium_light_skin_tone]=$'\U1F933\U1F3FC'
501+emoji[selfie_medium_skin_tone]=$'\U1F933\U1F3FD'
502+emoji[selfie_medium_dark_skin_tone]=$'\U1F933\U1F3FE'
503+emoji[selfie_dark_skin_tone]=$'\U1F933\U1F3FF'
504+emoji[flexed_biceps]=$'\U1F4AA'
505+emoji[muscle]=$'\U1F4AA'
506+emoji[flexed_biceps_light_skin_tone]=$'\U1F4AA\U1F3FB'
507+emoji[flexed_biceps_medium_light_skin_tone]=$'\U1F4AA\U1F3FC'
508+emoji[flexed_biceps_medium_skin_tone]=$'\U1F4AA\U1F3FD'
509+emoji[flexed_biceps_medium_dark_skin_tone]=$'\U1F4AA\U1F3FE'
510+emoji[flexed_biceps_dark_skin_tone]=$'\U1F4AA\U1F3FF'
511+emoji[mechanical_arm]=$'\U1F9BE'
512+emoji[mechanical_leg]=$'\U1F9BF'
513+emoji[mechanical_leg_1]=$'\U1F9B5'
514+emoji[leg]=$'\U1F9B5'
515+emoji[leg_light_skin_tone]=$'\U1F9B5\U1F3FB'
516+emoji[leg_medium_light_skin_tone]=$'\U1F9B5\U1F3FC'
517+emoji[leg_medium_skin_tone]=$'\U1F9B5\U1F3FD'
518+emoji[leg_medium_dark_skin_tone]=$'\U1F9B5\U1F3FE'
519+emoji[leg_dark_skin_tone]=$'\U1F9B5\U1F3FF'
520+emoji[foot]=$'\U1F9B6'
521+emoji[foot_light_skin_tone]=$'\U1F9B6\U1F3FB'
522+emoji[foot_medium_light_skin_tone]=$'\U1F9B6\U1F3FC'
523+emoji[foot_medium_skin_tone]=$'\U1F9B6\U1F3FD'
524+emoji[foot_medium_dark_skin_tone]=$'\U1F9B6\U1F3FE'
525+emoji[foot_dark_skin_tone]=$'\U1F9B6\U1F3FF'
526+emoji[ear]=$'\U1F442'
527+emoji[ear_light_skin_tone]=$'\U1F442\U1F3FB'
528+emoji[ear_medium_light_skin_tone]=$'\U1F442\U1F3FC'
529+emoji[ear_medium_skin_tone]=$'\U1F442\U1F3FD'
530+emoji[ear_medium_dark_skin_tone]=$'\U1F442\U1F3FE'
531+emoji[ear_dark_skin_tone]=$'\U1F442\U1F3FF'
532+emoji[ear_with_hearing_aid]=$'\U1F9BB'
533+emoji[ear_with_hearing_aid_light_skin_tone]=$'\U1F9BB\U1F3FB'
534+emoji[ear_with_hearing_aid_medium_light_skin_tone]=$'\U1F9BB\U1F3FC'
535+emoji[ear_with_hearing_aid_medium_skin_tone]=$'\U1F9BB\U1F3FD'
536+emoji[ear_with_hearing_aid_medium_dark_skin_tone]=$'\U1F9BB\U1F3FE'
537+emoji[ear_with_hearing_aid_dark_skin_tone]=$'\U1F9BB\U1F3FF'
538+emoji[nose]=$'\U1F443'
539+emoji[nose_light_skin_tone]=$'\U1F443\U1F3FB'
540+emoji[nose_medium_light_skin_tone]=$'\U1F443\U1F3FC'
541+emoji[nose_medium_skin_tone]=$'\U1F443\U1F3FD'
542+emoji[nose_medium_dark_skin_tone]=$'\U1F443\U1F3FE'
543+emoji[nose_dark_skin_tone]=$'\U1F443\U1F3FF'
544+emoji[brain]=$'\U1F9E0'
545+emoji[tooth]=$'\U1F9B7'
546+emoji[bone]=$'\U1F9B4'
547+emoji[eyes]=$'\U1F440'
548+emoji[eyes_1]=$'\U1F441\UFE0F'
549+emoji[eye_unqualified]=$'\U1F441'
550+emoji[eye]=$'\U1F441'
551+emoji[tongue]=$'\U1F445'
552+emoji[mouth]=$'\U1F444'
553+emoji[lips]=$'\U1F444'
554+emoji[baby]=$'\U1F476'
555+emoji[baby_light_skin_tone]=$'\U1F476\U1F3FB'
556+emoji[baby_medium_light_skin_tone]=$'\U1F476\U1F3FC'
557+emoji[baby_medium_skin_tone]=$'\U1F476\U1F3FD'
558+emoji[baby_medium_dark_skin_tone]=$'\U1F476\U1F3FE'
559+emoji[baby_dark_skin_tone]=$'\U1F476\U1F3FF'
560+emoji[child]=$'\U1F9D2'
561+emoji[child_light_skin_tone]=$'\U1F9D2\U1F3FB'
562+emoji[child_medium_light_skin_tone]=$'\U1F9D2\U1F3FC'
563+emoji[child_medium_skin_tone]=$'\U1F9D2\U1F3FD'
564+emoji[child_medium_dark_skin_tone]=$'\U1F9D2\U1F3FE'
565+emoji[child_dark_skin_tone]=$'\U1F9D2\U1F3FF'
566+emoji[boy]=$'\U1F466'
567+emoji[boy_light_skin_tone]=$'\U1F466\U1F3FB'
568+emoji[boy_medium_light_skin_tone]=$'\U1F466\U1F3FC'
569+emoji[boy_medium_skin_tone]=$'\U1F466\U1F3FD'
570+emoji[boy_medium_dark_skin_tone]=$'\U1F466\U1F3FE'
571+emoji[boy_dark_skin_tone]=$'\U1F466\U1F3FF'
572+emoji[girl]=$'\U1F467'
573+emoji[girl_light_skin_tone]=$'\U1F467\U1F3FB'
574+emoji[girl_medium_light_skin_tone]=$'\U1F467\U1F3FC'
575+emoji[girl_medium_skin_tone]=$'\U1F467\U1F3FD'
576+emoji[girl_medium_dark_skin_tone]=$'\U1F467\U1F3FE'
577+emoji[girl_dark_skin_tone]=$'\U1F467\U1F3FF'
578+emoji[person]=$'\U1F9D1'
579+emoji[adult]=$'\U1F9D1'
580+emoji[person_light_skin_tone]=$'\U1F9D1\U1F3FB'
581+emoji[person_medium_light_skin_tone]=$'\U1F9D1\U1F3FC'
582+emoji[person_medium_skin_tone]=$'\U1F9D1\U1F3FD'
583+emoji[person_medium_dark_skin_tone]=$'\U1F9D1\U1F3FE'
584+emoji[person_dark_skin_tone]=$'\U1F9D1\U1F3FF'
585+emoji[person_blond_hair]=$'\U1F471'
586+emoji[blond_haired_person]=$'\U1F471'
587+emoji[person_light_skin_tone_blond_hair]=$'\U1F471\U1F3FB'
588+emoji[person_medium_light_skin_tone_blond_hair]=$'\U1F471\U1F3FC'
589+emoji[person_medium_skin_tone_blond_hair]=$'\U1F471\U1F3FD'
590+emoji[person_medium_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FE'
591+emoji[person_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FF'
592+emoji[man]=$'\U1F468'
593+emoji[man_light_skin_tone]=$'\U1F468\U1F3FB'
594+emoji[man_medium_light_skin_tone]=$'\U1F468\U1F3FC'
595+emoji[man_medium_skin_tone]=$'\U1F468\U1F3FD'
596+emoji[man_medium_dark_skin_tone]=$'\U1F468\U1F3FE'
597+emoji[man_dark_skin_tone]=$'\U1F468\U1F3FF'
598+emoji[man_beard]=$'\U1F9D4'
599+emoji[bearded_person]=$'\U1F9D4'
600+emoji[man_light_skin_tone_beard]=$'\U1F9D4\U1F3FB'
601+emoji[man_medium_light_skin_tone_beard]=$'\U1F9D4\U1F3FC'
602+emoji[man_medium_skin_tone_beard]=$'\U1F9D4\U1F3FD'
603+emoji[man_medium_dark_skin_tone_beard]=$'\U1F9D4\U1F3FE'
604+emoji[man_dark_skin_tone_beard]=$'\U1F9D4\U1F3FF'
605+emoji[man_blond_hair]=$'\U1F471\U200D\U2642\UFE0F'
606+emoji[man_blond_hair_minimally]=$'\U1F471\U200D\U2642'
607+emoji[blond_haired_man]=$'\U1F471\U200D\U2642'
608+emoji[man_light_skin_tone_blond_hair]=$'\U1F471\U1F3FB\U200D\U2642\UFE0F'
609+emoji[man_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FB\U200D\U2642'
610+emoji[man_medium_light_skin_tone_blond_hair]=$'\U1F471\U1F3FC\U200D\U2642\UFE0F'
611+emoji[man_medium_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FC\U200D\U2642'
612+emoji[man_medium_skin_tone_blond_hair]=$'\U1F471\U1F3FD\U200D\U2642\UFE0F'
613+emoji[man_medium_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FD\U200D\U2642'
614+emoji[man_medium_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FE\U200D\U2642\UFE0F'
615+emoji[man_medium_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FE\U200D\U2642'
616+emoji[man_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FF\U200D\U2642\UFE0F'
617+emoji[man_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FF\U200D\U2642'
618+emoji[man_red_hair]=$'\U1F468\U200D\U1F9B0'
619+emoji[red_haired_man]=$'\U1F468\U200D\U1F9B0'
620+emoji[man_light_skin_tone_red_hair]=$'\U1F468\U1F3FB\U200D\U1F9B0'
621+emoji[man_medium_light_skin_tone_red_hair]=$'\U1F468\U1F3FC\U200D\U1F9B0'
622+emoji[man_medium_skin_tone_red_hair]=$'\U1F468\U1F3FD\U200D\U1F9B0'
623+emoji[man_medium_dark_skin_tone_red_hair]=$'\U1F468\U1F3FE\U200D\U1F9B0'
624+emoji[man_dark_skin_tone_red_hair]=$'\U1F468\U1F3FF\U200D\U1F9B0'
625+emoji[man_curly_hair]=$'\U1F468\U200D\U1F9B1'
626+emoji[curly_haired_man]=$'\U1F468\U200D\U1F9B1'
627+emoji[man_light_skin_tone_curly_hair]=$'\U1F468\U1F3FB\U200D\U1F9B1'
628+emoji[man_medium_light_skin_tone_curly_hair]=$'\U1F468\U1F3FC\U200D\U1F9B1'
629+emoji[man_medium_skin_tone_curly_hair]=$'\U1F468\U1F3FD\U200D\U1F9B1'
630+emoji[man_medium_dark_skin_tone_curly_hair]=$'\U1F468\U1F3FE\U200D\U1F9B1'
631+emoji[man_dark_skin_tone_curly_hair]=$'\U1F468\U1F3FF\U200D\U1F9B1'
632+emoji[man_white_hair]=$'\U1F468\U200D\U1F9B3'
633+emoji[white_haired_man]=$'\U1F468\U200D\U1F9B3'
634+emoji[man_light_skin_tone_white_hair]=$'\U1F468\U1F3FB\U200D\U1F9B3'
635+emoji[man_medium_light_skin_tone_white_hair]=$'\U1F468\U1F3FC\U200D\U1F9B3'
636+emoji[man_medium_skin_tone_white_hair]=$'\U1F468\U1F3FD\U200D\U1F9B3'
637+emoji[man_medium_dark_skin_tone_white_hair]=$'\U1F468\U1F3FE\U200D\U1F9B3'
638+emoji[man_dark_skin_tone_white_hair]=$'\U1F468\U1F3FF\U200D\U1F9B3'
639+emoji[man_bald]=$'\U1F468\U200D\U1F9B2'
640+emoji[bald_man]=$'\U1F468\U200D\U1F9B2'
641+emoji[man_light_skin_tone_bald]=$'\U1F468\U1F3FB\U200D\U1F9B2'
642+emoji[man_medium_light_skin_tone_bald]=$'\U1F468\U1F3FC\U200D\U1F9B2'
643+emoji[man_medium_skin_tone_bald]=$'\U1F468\U1F3FD\U200D\U1F9B2'
644+emoji[man_medium_dark_skin_tone_bald]=$'\U1F468\U1F3FE\U200D\U1F9B2'
645+emoji[man_dark_skin_tone_bald]=$'\U1F468\U1F3FF\U200D\U1F9B2'
646+emoji[woman]=$'\U1F469'
647+emoji[woman_light_skin_tone]=$'\U1F469\U1F3FB'
648+emoji[woman_medium_light_skin_tone]=$'\U1F469\U1F3FC'
649+emoji[woman_medium_skin_tone]=$'\U1F469\U1F3FD'
650+emoji[woman_medium_dark_skin_tone]=$'\U1F469\U1F3FE'
651+emoji[woman_dark_skin_tone]=$'\U1F469\U1F3FF'
652+emoji[woman_blond_hair]=$'\U1F471\U200D\U2640\UFE0F'
653+emoji[woman_blond_hair_minimally]=$'\U1F471\U200D\U2640'
654+emoji[blond_haired_woman]=$'\U1F471\U200D\U2640'
655+emoji[blonde_woman]=$'\U1F471\U200D\U2640'
656+emoji[woman_light_skin_tone_blond_hair]=$'\U1F471\U1F3FB\U200D\U2640\UFE0F'
657+emoji[woman_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FB\U200D\U2640'
658+emoji[woman_medium_light_skin_tone_blond_hair]=$'\U1F471\U1F3FC\U200D\U2640\UFE0F'
659+emoji[woman_medium_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FC\U200D\U2640'
660+emoji[woman_medium_skin_tone_blond_hair]=$'\U1F471\U1F3FD\U200D\U2640\UFE0F'
661+emoji[woman_medium_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FD\U200D\U2640'
662+emoji[woman_medium_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FE\U200D\U2640\UFE0F'
663+emoji[woman_medium_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FE\U200D\U2640'
664+emoji[woman_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FF\U200D\U2640\UFE0F'
665+emoji[woman_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FF\U200D\U2640'
666+emoji[woman_red_hair]=$'\U1F469\U200D\U1F9B0'
667+emoji[red_haired_woman]=$'\U1F469\U200D\U1F9B0'
668+emoji[woman_light_skin_tone_red_hair]=$'\U1F469\U1F3FB\U200D\U1F9B0'
669+emoji[woman_medium_light_skin_tone_red_hair]=$'\U1F469\U1F3FC\U200D\U1F9B0'
670+emoji[woman_medium_skin_tone_red_hair]=$'\U1F469\U1F3FD\U200D\U1F9B0'
671+emoji[woman_medium_dark_skin_tone_red_hair]=$'\U1F469\U1F3FE\U200D\U1F9B0'
672+emoji[woman_dark_skin_tone_red_hair]=$'\U1F469\U1F3FF\U200D\U1F9B0'
673+emoji[woman_curly_hair]=$'\U1F469\U200D\U1F9B1'
674+emoji[curly_haired_woman]=$'\U1F469\U200D\U1F9B1'
675+emoji[woman_light_skin_tone_curly_hair]=$'\U1F469\U1F3FB\U200D\U1F9B1'
676+emoji[woman_medium_light_skin_tone_curly_hair]=$'\U1F469\U1F3FC\U200D\U1F9B1'
677+emoji[woman_medium_skin_tone_curly_hair]=$'\U1F469\U1F3FD\U200D\U1F9B1'
678+emoji[woman_medium_dark_skin_tone_curly_hair]=$'\U1F469\U1F3FE\U200D\U1F9B1'
679+emoji[woman_dark_skin_tone_curly_hair]=$'\U1F469\U1F3FF\U200D\U1F9B1'
680+emoji[woman_white_hair]=$'\U1F469\U200D\U1F9B3'
681+emoji[white_haired_woman]=$'\U1F469\U200D\U1F9B3'
682+emoji[woman_light_skin_tone_white_hair]=$'\U1F469\U1F3FB\U200D\U1F9B3'
683+emoji[woman_medium_light_skin_tone_white_hair]=$'\U1F469\U1F3FC\U200D\U1F9B3'
684+emoji[woman_medium_skin_tone_white_hair]=$'\U1F469\U1F3FD\U200D\U1F9B3'
685+emoji[woman_medium_dark_skin_tone_white_hair]=$'\U1F469\U1F3FE\U200D\U1F9B3'
686+emoji[woman_dark_skin_tone_white_hair]=$'\U1F469\U1F3FF\U200D\U1F9B3'
687+emoji[woman_bald]=$'\U1F469\U200D\U1F9B2'
688+emoji[bald_woman]=$'\U1F469\U200D\U1F9B2'
689+emoji[woman_light_skin_tone_bald]=$'\U1F469\U1F3FB\U200D\U1F9B2'
690+emoji[woman_medium_light_skin_tone_bald]=$'\U1F469\U1F3FC\U200D\U1F9B2'
691+emoji[woman_medium_skin_tone_bald]=$'\U1F469\U1F3FD\U200D\U1F9B2'
692+emoji[woman_medium_dark_skin_tone_bald]=$'\U1F469\U1F3FE\U200D\U1F9B2'
693+emoji[woman_dark_skin_tone_bald]=$'\U1F469\U1F3FF\U200D\U1F9B2'
694+emoji[older_person]=$'\U1F9D3'
695+emoji[older_adult]=$'\U1F9D3'
696+emoji[older_person_light_skin_tone]=$'\U1F9D3\U1F3FB'
697+emoji[older_person_medium_light_skin_tone]=$'\U1F9D3\U1F3FC'
698+emoji[older_person_medium_skin_tone]=$'\U1F9D3\U1F3FD'
699+emoji[older_person_medium_dark_skin_tone]=$'\U1F9D3\U1F3FE'
700+emoji[older_person_dark_skin_tone]=$'\U1F9D3\U1F3FF'
701+emoji[old_man]=$'\U1F474'
702+emoji[older_man]=$'\U1F474'
703+emoji[old_man_light_skin_tone]=$'\U1F474\U1F3FB'
704+emoji[old_man_medium_light_skin_tone]=$'\U1F474\U1F3FC'
705+emoji[old_man_medium_skin_tone]=$'\U1F474\U1F3FD'
706+emoji[old_man_medium_dark_skin_tone]=$'\U1F474\U1F3FE'
707+emoji[old_man_dark_skin_tone]=$'\U1F474\U1F3FF'
708+emoji[old_woman]=$'\U1F475'
709+emoji[older_woman]=$'\U1F475'
710+emoji[old_woman_light_skin_tone]=$'\U1F475\U1F3FB'
711+emoji[old_woman_medium_light_skin_tone]=$'\U1F475\U1F3FC'
712+emoji[old_woman_medium_skin_tone]=$'\U1F475\U1F3FD'
713+emoji[old_woman_medium_dark_skin_tone]=$'\U1F475\U1F3FE'
714+emoji[old_woman_dark_skin_tone]=$'\U1F475\U1F3FF'
715+emoji[person_frowning]=$'\U1F64D'
716+emoji[frowning_person]=$'\U1F64D'
717+emoji[person_frowning_light_skin_tone]=$'\U1F64D\U1F3FB'
718+emoji[person_frowning_medium_light_skin_tone]=$'\U1F64D\U1F3FC'
719+emoji[person_frowning_medium_skin_tone]=$'\U1F64D\U1F3FD'
720+emoji[person_frowning_medium_dark_skin_tone]=$'\U1F64D\U1F3FE'
721+emoji[person_frowning_dark_skin_tone]=$'\U1F64D\U1F3FF'
722+emoji[man_frowning]=$'\U1F64D\U200D\U2642\UFE0F'
723+emoji[man_frowning_minimally]=$'\U1F64D\U200D\U2642'
724+emoji[frowning_man]=$'\U1F64D\U200D\U2642'
725+emoji[man_frowning_light_skin_tone]=$'\U1F64D\U1F3FB\U200D\U2642\UFE0F'
726+emoji[man_frowning_light_skin_tone_minimally]=$'\U1F64D\U1F3FB\U200D\U2642'
727+emoji[man_frowning_medium_light_skin_tone]=$'\U1F64D\U1F3FC\U200D\U2642\UFE0F'
728+emoji[man_frowning_medium_light_skin_tone_minimally]=$'\U1F64D\U1F3FC\U200D\U2642'
729+emoji[man_frowning_medium_skin_tone]=$'\U1F64D\U1F3FD\U200D\U2642\UFE0F'
730+emoji[man_frowning_medium_skin_tone_minimally]=$'\U1F64D\U1F3FD\U200D\U2642'
731+emoji[man_frowning_medium_dark_skin_tone]=$'\U1F64D\U1F3FE\U200D\U2642\UFE0F'
732+emoji[man_frowning_medium_dark_skin_tone_minimally]=$'\U1F64D\U1F3FE\U200D\U2642'
733+emoji[man_frowning_dark_skin_tone]=$'\U1F64D\U1F3FF\U200D\U2642\UFE0F'
734+emoji[man_frowning_dark_skin_tone_minimally]=$'\U1F64D\U1F3FF\U200D\U2642'
735+emoji[woman_frowning]=$'\U1F64D\U200D\U2640\UFE0F'
736+emoji[woman_frowning_minimally]=$'\U1F64D\U200D\U2640'
737+emoji[frowning_woman]=$'\U1F64D\U200D\U2640'
738+emoji[woman_frowning_light_skin_tone]=$'\U1F64D\U1F3FB\U200D\U2640\UFE0F'
739+emoji[woman_frowning_light_skin_tone_minimally]=$'\U1F64D\U1F3FB\U200D\U2640'
740+emoji[woman_frowning_medium_light_skin_tone]=$'\U1F64D\U1F3FC\U200D\U2640\UFE0F'
741+emoji[woman_frowning_medium_light_skin_tone_minimally]=$'\U1F64D\U1F3FC\U200D\U2640'
742+emoji[woman_frowning_medium_skin_tone]=$'\U1F64D\U1F3FD\U200D\U2640\UFE0F'
743+emoji[woman_frowning_medium_skin_tone_minimally]=$'\U1F64D\U1F3FD\U200D\U2640'
744+emoji[woman_frowning_medium_dark_skin_tone]=$'\U1F64D\U1F3FE\U200D\U2640\UFE0F'
745+emoji[woman_frowning_medium_dark_skin_tone_minimally]=$'\U1F64D\U1F3FE\U200D\U2640'
746+emoji[woman_frowning_dark_skin_tone]=$'\U1F64D\U1F3FF\U200D\U2640\UFE0F'
747+emoji[woman_frowning_dark_skin_tone_minimally]=$'\U1F64D\U1F3FF\U200D\U2640'
748+emoji[person_pouting]=$'\U1F64E'
749+emoji[person_pouting_light_skin_tone]=$'\U1F64E\U1F3FB'
750+emoji[person_pouting_medium_light_skin_tone]=$'\U1F64E\U1F3FC'
751+emoji[person_pouting_medium_skin_tone]=$'\U1F64E\U1F3FD'
752+emoji[person_pouting_medium_dark_skin_tone]=$'\U1F64E\U1F3FE'
753+emoji[person_pouting_dark_skin_tone]=$'\U1F64E\U1F3FF'
754+emoji[man_pouting]=$'\U1F64E\U200D\U2642\UFE0F'
755+emoji[man_pouting_minimally]=$'\U1F64E\U200D\U2642'
756+emoji[pouting_man]=$'\U1F64E\U200D\U2642'
757+emoji[man_pouting_light_skin_tone]=$'\U1F64E\U1F3FB\U200D\U2642\UFE0F'
758+emoji[man_pouting_light_skin_tone_minimally]=$'\U1F64E\U1F3FB\U200D\U2642'
759+emoji[man_pouting_medium_light_skin_tone]=$'\U1F64E\U1F3FC\U200D\U2642\UFE0F'
760+emoji[man_pouting_medium_light_skin_tone_minimally]=$'\U1F64E\U1F3FC\U200D\U2642'
761+emoji[man_pouting_medium_skin_tone]=$'\U1F64E\U1F3FD\U200D\U2642\UFE0F'
762+emoji[man_pouting_medium_skin_tone_minimally]=$'\U1F64E\U1F3FD\U200D\U2642'
763+emoji[man_pouting_medium_dark_skin_tone]=$'\U1F64E\U1F3FE\U200D\U2642\UFE0F'
764+emoji[man_pouting_medium_dark_skin_tone_minimally]=$'\U1F64E\U1F3FE\U200D\U2642'
765+emoji[man_pouting_dark_skin_tone]=$'\U1F64E\U1F3FF\U200D\U2642\UFE0F'
766+emoji[man_pouting_dark_skin_tone_minimally]=$'\U1F64E\U1F3FF\U200D\U2642'
767+emoji[woman_pouting]=$'\U1F64E\U200D\U2640\UFE0F'
768+emoji[woman_pouting_minimally]=$'\U1F64E\U200D\U2640'
769+emoji[pouting_woman]=$'\U1F64E\U200D\U2640'
770+emoji[woman_pouting_light_skin_tone]=$'\U1F64E\U1F3FB\U200D\U2640\UFE0F'
771+emoji[woman_pouting_light_skin_tone_minimally]=$'\U1F64E\U1F3FB\U200D\U2640'
772+emoji[woman_pouting_medium_light_skin_tone]=$'\U1F64E\U1F3FC\U200D\U2640\UFE0F'
773+emoji[woman_pouting_medium_light_skin_tone_minimally]=$'\U1F64E\U1F3FC\U200D\U2640'
774+emoji[woman_pouting_medium_skin_tone]=$'\U1F64E\U1F3FD\U200D\U2640\UFE0F'
775+emoji[woman_pouting_medium_skin_tone_minimally]=$'\U1F64E\U1F3FD\U200D\U2640'
776+emoji[woman_pouting_medium_dark_skin_tone]=$'\U1F64E\U1F3FE\U200D\U2640\UFE0F'
777+emoji[woman_pouting_medium_dark_skin_tone_minimally]=$'\U1F64E\U1F3FE\U200D\U2640'
778+emoji[woman_pouting_dark_skin_tone]=$'\U1F64E\U1F3FF\U200D\U2640\UFE0F'
779+emoji[woman_pouting_dark_skin_tone_minimally]=$'\U1F64E\U1F3FF\U200D\U2640'
780+emoji[person_gesturing_NO]=$'\U1F645'
781+emoji[no_good]=$'\U1F645'
782+emoji[person_gesturing_NO_light_skin_tone]=$'\U1F645\U1F3FB'
783+emoji[person_gesturing_NO_medium_light_skin_tone]=$'\U1F645\U1F3FC'
784+emoji[person_gesturing_NO_medium_skin_tone]=$'\U1F645\U1F3FD'
785+emoji[person_gesturing_NO_medium_dark_skin_tone]=$'\U1F645\U1F3FE'
786+emoji[person_gesturing_NO_dark_skin_tone]=$'\U1F645\U1F3FF'
787+emoji[man_gesturing_NO]=$'\U1F645\U200D\U2642\UFE0F'
788+emoji[man_gesturing_NO_minimally]=$'\U1F645\U200D\U2642'
789+emoji[no_good_man]=$'\U1F645\U200D\U2642'
790+emoji[ng_man]=$'\U1F645\U200D\U2642'
791+emoji[man_gesturing_NO_light_skin_tone]=$'\U1F645\U1F3FB\U200D\U2642\UFE0F'
792+emoji[man_gesturing_NO_light_skin_tone_minimally]=$'\U1F645\U1F3FB\U200D\U2642'
793+emoji[man_gesturing_NO_medium_light_skin_tone]=$'\U1F645\U1F3FC\U200D\U2642\UFE0F'
794+emoji[man_gesturing_NO_medium_light_skin_tone_minimally]=$'\U1F645\U1F3FC\U200D\U2642'
795+emoji[man_gesturing_NO_medium_skin_tone]=$'\U1F645\U1F3FD\U200D\U2642\UFE0F'
796+emoji[man_gesturing_NO_medium_skin_tone_minimally]=$'\U1F645\U1F3FD\U200D\U2642'
797+emoji[man_gesturing_NO_medium_dark_skin_tone]=$'\U1F645\U1F3FE\U200D\U2642\UFE0F'
798+emoji[man_gesturing_NO_medium_dark_skin_tone_minimally]=$'\U1F645\U1F3FE\U200D\U2642'
799+emoji[man_gesturing_NO_dark_skin_tone]=$'\U1F645\U1F3FF\U200D\U2642\UFE0F'
800+emoji[man_gesturing_NO_dark_skin_tone_minimally]=$'\U1F645\U1F3FF\U200D\U2642'
801+emoji[woman_gesturing_NO]=$'\U1F645\U200D\U2640\UFE0F'
802+emoji[woman_gesturing_NO_minimally]=$'\U1F645\U200D\U2640'
803+emoji[no_good_woman]=$'\U1F645\U200D\U2640'
804+emoji[ng_woman]=$'\U1F645\U200D\U2640'
805+emoji[woman_gesturing_NO_light_skin_tone]=$'\U1F645\U1F3FB\U200D\U2640\UFE0F'
806+emoji[woman_gesturing_NO_light_skin_tone_minimally]=$'\U1F645\U1F3FB\U200D\U2640'
807+emoji[woman_gesturing_NO_medium_light_skin_tone]=$'\U1F645\U1F3FC\U200D\U2640\UFE0F'
808+emoji[woman_gesturing_NO_medium_light_skin_tone_minimally]=$'\U1F645\U1F3FC\U200D\U2640'
809+emoji[woman_gesturing_NO_medium_skin_tone]=$'\U1F645\U1F3FD\U200D\U2640\UFE0F'
810+emoji[woman_gesturing_NO_medium_skin_tone_minimally]=$'\U1F645\U1F3FD\U200D\U2640'
811+emoji[woman_gesturing_NO_medium_dark_skin_tone]=$'\U1F645\U1F3FE\U200D\U2640\UFE0F'
812+emoji[woman_gesturing_NO_medium_dark_skin_tone_minimally]=$'\U1F645\U1F3FE\U200D\U2640'
813+emoji[woman_gesturing_NO_dark_skin_tone]=$'\U1F645\U1F3FF\U200D\U2640\UFE0F'
814+emoji[woman_gesturing_NO_dark_skin_tone_minimally]=$'\U1F645\U1F3FF\U200D\U2640'
815+emoji[person_gesturing_OK]=$'\U1F646'
816+emoji[ok_person]=$'\U1F646'
817+emoji[person_gesturing_OK_light_skin_tone]=$'\U1F646\U1F3FB'
818+emoji[person_gesturing_OK_medium_light_skin_tone]=$'\U1F646\U1F3FC'
819+emoji[person_gesturing_OK_medium_skin_tone]=$'\U1F646\U1F3FD'
820+emoji[person_gesturing_OK_medium_dark_skin_tone]=$'\U1F646\U1F3FE'
821+emoji[person_gesturing_OK_dark_skin_tone]=$'\U1F646\U1F3FF'
822+emoji[man_gesturing_OK]=$'\U1F646\U200D\U2642\UFE0F'
823+emoji[man_gesturing_OK_minimally]=$'\U1F646\U200D\U2642'
824+emoji[ok_man]=$'\U1F646\U200D\U2642'
825+emoji[man_gesturing_OK_light_skin_tone]=$'\U1F646\U1F3FB\U200D\U2642\UFE0F'
826+emoji[man_gesturing_OK_light_skin_tone_minimally]=$'\U1F646\U1F3FB\U200D\U2642'
827+emoji[man_gesturing_OK_medium_light_skin_tone]=$'\U1F646\U1F3FC\U200D\U2642\UFE0F'
828+emoji[man_gesturing_OK_medium_light_skin_tone_minimally]=$'\U1F646\U1F3FC\U200D\U2642'
829+emoji[man_gesturing_OK_medium_skin_tone]=$'\U1F646\U1F3FD\U200D\U2642\UFE0F'
830+emoji[man_gesturing_OK_medium_skin_tone_minimally]=$'\U1F646\U1F3FD\U200D\U2642'
831+emoji[man_gesturing_OK_medium_dark_skin_tone]=$'\U1F646\U1F3FE\U200D\U2642\UFE0F'
832+emoji[man_gesturing_OK_medium_dark_skin_tone_minimally]=$'\U1F646\U1F3FE\U200D\U2642'
833+emoji[man_gesturing_OK_dark_skin_tone]=$'\U1F646\U1F3FF\U200D\U2642\UFE0F'
834+emoji[man_gesturing_OK_dark_skin_tone_minimally]=$'\U1F646\U1F3FF\U200D\U2642'
835+emoji[woman_gesturing_OK]=$'\U1F646\U200D\U2640\UFE0F'
836+emoji[woman_gesturing_OK_minimally]=$'\U1F646\U200D\U2640'
837+emoji[ok_woman]=$'\U1F646\U200D\U2640'
838+emoji[woman_gesturing_OK_light_skin_tone]=$'\U1F646\U1F3FB\U200D\U2640\UFE0F'
839+emoji[woman_gesturing_OK_light_skin_tone_minimally]=$'\U1F646\U1F3FB\U200D\U2640'
840+emoji[woman_gesturing_OK_medium_light_skin_tone]=$'\U1F646\U1F3FC\U200D\U2640\UFE0F'
841+emoji[woman_gesturing_OK_medium_light_skin_tone_minimally]=$'\U1F646\U1F3FC\U200D\U2640'
842+emoji[woman_gesturing_OK_medium_skin_tone]=$'\U1F646\U1F3FD\U200D\U2640\UFE0F'
843+emoji[woman_gesturing_OK_medium_skin_tone_minimally]=$'\U1F646\U1F3FD\U200D\U2640'
844+emoji[woman_gesturing_OK_medium_dark_skin_tone]=$'\U1F646\U1F3FE\U200D\U2640\UFE0F'
845+emoji[woman_gesturing_OK_medium_dark_skin_tone_minimally]=$'\U1F646\U1F3FE\U200D\U2640'
846+emoji[woman_gesturing_OK_dark_skin_tone]=$'\U1F646\U1F3FF\U200D\U2640\UFE0F'
847+emoji[woman_gesturing_OK_dark_skin_tone_minimally]=$'\U1F646\U1F3FF\U200D\U2640'
848+emoji[person_tipping_hand]=$'\U1F481'
849+emoji[tipping_hand_person]=$'\U1F481'
850+emoji[information_desk_person]=$'\U1F481'
851+emoji[person_tipping_hand_light_skin_tone]=$'\U1F481\U1F3FB'
852+emoji[person_tipping_hand_medium_light_skin_tone]=$'\U1F481\U1F3FC'
853+emoji[person_tipping_hand_medium_skin_tone]=$'\U1F481\U1F3FD'
854+emoji[person_tipping_hand_medium_dark_skin_tone]=$'\U1F481\U1F3FE'
855+emoji[person_tipping_hand_dark_skin_tone]=$'\U1F481\U1F3FF'
856+emoji[man_tipping_hand]=$'\U1F481\U200D\U2642\UFE0F'
857+emoji[man_tipping_hand_minimally]=$'\U1F481\U200D\U2642'
858+emoji[tipping_hand_man]=$'\U1F481\U200D\U2642'
859+emoji[sassy_man]=$'\U1F481\U200D\U2642'
860+emoji[man_tipping_hand_light_skin_tone]=$'\U1F481\U1F3FB\U200D\U2642\UFE0F'
861+emoji[man_tipping_hand_light_skin_tone_minimally]=$'\U1F481\U1F3FB\U200D\U2642'
862+emoji[man_tipping_hand_medium_light_skin_tone]=$'\U1F481\U1F3FC\U200D\U2642\UFE0F'
863+emoji[man_tipping_hand_medium_light_skin_tone_minimally]=$'\U1F481\U1F3FC\U200D\U2642'
864+emoji[man_tipping_hand_medium_skin_tone]=$'\U1F481\U1F3FD\U200D\U2642\UFE0F'
865+emoji[man_tipping_hand_medium_skin_tone_minimally]=$'\U1F481\U1F3FD\U200D\U2642'
866+emoji[man_tipping_hand_medium_dark_skin_tone]=$'\U1F481\U1F3FE\U200D\U2642\UFE0F'
867+emoji[man_tipping_hand_medium_dark_skin_tone_minimally]=$'\U1F481\U1F3FE\U200D\U2642'
868+emoji[man_tipping_hand_dark_skin_tone]=$'\U1F481\U1F3FF\U200D\U2642\UFE0F'
869+emoji[man_tipping_hand_dark_skin_tone_minimally]=$'\U1F481\U1F3FF\U200D\U2642'
870+emoji[woman_tipping_hand]=$'\U1F481\U200D\U2640\UFE0F'
871+emoji[woman_tipping_hand_minimally]=$'\U1F481\U200D\U2640'
872+emoji[tipping_hand_woman]=$'\U1F481\U200D\U2640'
873+emoji[sassy_woman]=$'\U1F481\U200D\U2640'
874+emoji[woman_tipping_hand_light_skin_tone]=$'\U1F481\U1F3FB\U200D\U2640\UFE0F'
875+emoji[woman_tipping_hand_light_skin_tone_minimally]=$'\U1F481\U1F3FB\U200D\U2640'
876+emoji[woman_tipping_hand_medium_light_skin_tone]=$'\U1F481\U1F3FC\U200D\U2640\UFE0F'
877+emoji[woman_tipping_hand_medium_light_skin_tone_minimally]=$'\U1F481\U1F3FC\U200D\U2640'
878+emoji[woman_tipping_hand_medium_skin_tone]=$'\U1F481\U1F3FD\U200D\U2640\UFE0F'
879+emoji[woman_tipping_hand_medium_skin_tone_minimally]=$'\U1F481\U1F3FD\U200D\U2640'
880+emoji[woman_tipping_hand_medium_dark_skin_tone]=$'\U1F481\U1F3FE\U200D\U2640\UFE0F'
881+emoji[woman_tipping_hand_medium_dark_skin_tone_minimally]=$'\U1F481\U1F3FE\U200D\U2640'
882+emoji[woman_tipping_hand_dark_skin_tone]=$'\U1F481\U1F3FF\U200D\U2640\UFE0F'
883+emoji[woman_tipping_hand_dark_skin_tone_minimally]=$'\U1F481\U1F3FF\U200D\U2640'
884+emoji[person_raising_hand]=$'\U1F64B'
885+emoji[raising_hand]=$'\U1F64B'
886+emoji[person_raising_hand_light_skin_tone]=$'\U1F64B\U1F3FB'
887+emoji[person_raising_hand_medium_light_skin_tone]=$'\U1F64B\U1F3FC'
888+emoji[person_raising_hand_medium_skin_tone]=$'\U1F64B\U1F3FD'
889+emoji[person_raising_hand_medium_dark_skin_tone]=$'\U1F64B\U1F3FE'
890+emoji[person_raising_hand_dark_skin_tone]=$'\U1F64B\U1F3FF'
891+emoji[man_raising_hand]=$'\U1F64B\U200D\U2642\UFE0F'
892+emoji[man_raising_hand_minimally]=$'\U1F64B\U200D\U2642'
893+emoji[raising_hand_man]=$'\U1F64B\U200D\U2642'
894+emoji[man_raising_hand_light_skin_tone]=$'\U1F64B\U1F3FB\U200D\U2642\UFE0F'
895+emoji[man_raising_hand_light_skin_tone_minimally]=$'\U1F64B\U1F3FB\U200D\U2642'
896+emoji[man_raising_hand_medium_light_skin_tone]=$'\U1F64B\U1F3FC\U200D\U2642\UFE0F'
897+emoji[man_raising_hand_medium_light_skin_tone_minimally]=$'\U1F64B\U1F3FC\U200D\U2642'
898+emoji[man_raising_hand_medium_skin_tone]=$'\U1F64B\U1F3FD\U200D\U2642\UFE0F'
899+emoji[man_raising_hand_medium_skin_tone_minimally]=$'\U1F64B\U1F3FD\U200D\U2642'
900+emoji[man_raising_hand_medium_dark_skin_tone]=$'\U1F64B\U1F3FE\U200D\U2642\UFE0F'
901+emoji[man_raising_hand_medium_dark_skin_tone_minimally]=$'\U1F64B\U1F3FE\U200D\U2642'
902+emoji[man_raising_hand_dark_skin_tone]=$'\U1F64B\U1F3FF\U200D\U2642\UFE0F'
903+emoji[man_raising_hand_dark_skin_tone_minimally]=$'\U1F64B\U1F3FF\U200D\U2642'
904+emoji[woman_raising_hand]=$'\U1F64B\U200D\U2640\UFE0F'
905+emoji[woman_raising_hand_minimally]=$'\U1F64B\U200D\U2640'
906+emoji[raising_hand_woman]=$'\U1F64B\U200D\U2640'
907+emoji[woman_raising_hand_light_skin_tone]=$'\U1F64B\U1F3FB\U200D\U2640\UFE0F'
908+emoji[woman_raising_hand_light_skin_tone_minimally]=$'\U1F64B\U1F3FB\U200D\U2640'
909+emoji[woman_raising_hand_medium_light_skin_tone]=$'\U1F64B\U1F3FC\U200D\U2640\UFE0F'
910+emoji[woman_raising_hand_medium_light_skin_tone_minimally]=$'\U1F64B\U1F3FC\U200D\U2640'
911+emoji[woman_raising_hand_medium_skin_tone]=$'\U1F64B\U1F3FD\U200D\U2640\UFE0F'
912+emoji[woman_raising_hand_medium_skin_tone_minimally]=$'\U1F64B\U1F3FD\U200D\U2640'
913+emoji[woman_raising_hand_medium_dark_skin_tone]=$'\U1F64B\U1F3FE\U200D\U2640\UFE0F'
914+emoji[woman_raising_hand_medium_dark_skin_tone_minimally]=$'\U1F64B\U1F3FE\U200D\U2640'
915+emoji[woman_raising_hand_dark_skin_tone]=$'\U1F64B\U1F3FF\U200D\U2640\UFE0F'
916+emoji[woman_raising_hand_dark_skin_tone_minimally]=$'\U1F64B\U1F3FF\U200D\U2640'
917+emoji[deaf_person]=$'\U1F9CF'
918+emoji[deaf_person_light_skin_tone]=$'\U1F9CF\U1F3FB'
919+emoji[deaf_person_medium_light_skin_tone]=$'\U1F9CF\U1F3FC'
920+emoji[deaf_person_medium_skin_tone]=$'\U1F9CF\U1F3FD'
921+emoji[deaf_person_medium_dark_skin_tone]=$'\U1F9CF\U1F3FE'
922+emoji[deaf_person_dark_skin_tone]=$'\U1F9CF\U1F3FF'
923+emoji[deaf_man]=$'\U1F9CF\U200D\U2642\UFE0F'
924+emoji[deaf_man_minimally]=$'\U1F9CF\U200D\U2642'
925+emoji[deaf_man_light_skin_tone]=$'\U1F9CF\U1F3FB\U200D\U2642\UFE0F'
926+emoji[deaf_man_light_skin_tone_minimally]=$'\U1F9CF\U1F3FB\U200D\U2642'
927+emoji[deaf_man_medium_light_skin_tone]=$'\U1F9CF\U1F3FC\U200D\U2642\UFE0F'
928+emoji[deaf_man_medium_light_skin_tone_minimally]=$'\U1F9CF\U1F3FC\U200D\U2642'
929+emoji[deaf_man_medium_skin_tone]=$'\U1F9CF\U1F3FD\U200D\U2642\UFE0F'
930+emoji[deaf_man_medium_skin_tone_minimally]=$'\U1F9CF\U1F3FD\U200D\U2642'
931+emoji[deaf_man_medium_dark_skin_tone]=$'\U1F9CF\U1F3FE\U200D\U2642\UFE0F'
932+emoji[deaf_man_medium_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FE\U200D\U2642'
933+emoji[deaf_man_dark_skin_tone]=$'\U1F9CF\U1F3FF\U200D\U2642\UFE0F'
934+emoji[deaf_man_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FF\U200D\U2642'
935+emoji[deaf_woman]=$'\U1F9CF\U200D\U2640\UFE0F'
936+emoji[deaf_woman_minimally]=$'\U1F9CF\U200D\U2640'
937+emoji[deaf_woman_light_skin_tone]=$'\U1F9CF\U1F3FB\U200D\U2640\UFE0F'
938+emoji[deaf_woman_light_skin_tone_minimally]=$'\U1F9CF\U1F3FB\U200D\U2640'
939+emoji[deaf_woman_medium_light_skin_tone]=$'\U1F9CF\U1F3FC\U200D\U2640\UFE0F'
940+emoji[deaf_woman_medium_light_skin_tone_minimally]=$'\U1F9CF\U1F3FC\U200D\U2640'
941+emoji[deaf_woman_medium_skin_tone]=$'\U1F9CF\U1F3FD\U200D\U2640\UFE0F'
942+emoji[deaf_woman_medium_skin_tone_minimally]=$'\U1F9CF\U1F3FD\U200D\U2640'
943+emoji[deaf_woman_medium_dark_skin_tone]=$'\U1F9CF\U1F3FE\U200D\U2640\UFE0F'
944+emoji[deaf_woman_medium_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FE\U200D\U2640'
945+emoji[deaf_woman_dark_skin_tone]=$'\U1F9CF\U1F3FF\U200D\U2640\UFE0F'
946+emoji[deaf_woman_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FF\U200D\U2640'
947+emoji[person_bowing]=$'\U1F647'
948+emoji[bow]=$'\U1F647'
949+emoji[person_bowing_light_skin_tone]=$'\U1F647\U1F3FB'
950+emoji[person_bowing_medium_light_skin_tone]=$'\U1F647\U1F3FC'
951+emoji[person_bowing_medium_skin_tone]=$'\U1F647\U1F3FD'
952+emoji[person_bowing_medium_dark_skin_tone]=$'\U1F647\U1F3FE'
953+emoji[person_bowing_dark_skin_tone]=$'\U1F647\U1F3FF'
954+emoji[man_bowing]=$'\U1F647\U200D\U2642\UFE0F'
955+emoji[man_bowing_minimally]=$'\U1F647\U200D\U2642'
956+emoji[bowing_man]=$'\U1F647\U200D\U2642'
957+emoji[man_bowing_light_skin_tone]=$'\U1F647\U1F3FB\U200D\U2642\UFE0F'
958+emoji[man_bowing_light_skin_tone_minimally]=$'\U1F647\U1F3FB\U200D\U2642'
959+emoji[man_bowing_medium_light_skin_tone]=$'\U1F647\U1F3FC\U200D\U2642\UFE0F'
960+emoji[man_bowing_medium_light_skin_tone_minimally]=$'\U1F647\U1F3FC\U200D\U2642'
961+emoji[man_bowing_medium_skin_tone]=$'\U1F647\U1F3FD\U200D\U2642\UFE0F'
962+emoji[man_bowing_medium_skin_tone_minimally]=$'\U1F647\U1F3FD\U200D\U2642'
963+emoji[man_bowing_medium_dark_skin_tone]=$'\U1F647\U1F3FE\U200D\U2642\UFE0F'
964+emoji[man_bowing_medium_dark_skin_tone_minimally]=$'\U1F647\U1F3FE\U200D\U2642'
965+emoji[man_bowing_dark_skin_tone]=$'\U1F647\U1F3FF\U200D\U2642\UFE0F'
966+emoji[man_bowing_dark_skin_tone_minimally]=$'\U1F647\U1F3FF\U200D\U2642'
967+emoji[woman_bowing]=$'\U1F647\U200D\U2640\UFE0F'
968+emoji[woman_bowing_minimally]=$'\U1F647\U200D\U2640'
969+emoji[bowing_woman]=$'\U1F647\U200D\U2640'
970+emoji[woman_bowing_light_skin_tone]=$'\U1F647\U1F3FB\U200D\U2640\UFE0F'
971+emoji[woman_bowing_light_skin_tone_minimally]=$'\U1F647\U1F3FB\U200D\U2640'
972+emoji[woman_bowing_medium_light_skin_tone]=$'\U1F647\U1F3FC\U200D\U2640\UFE0F'
973+emoji[woman_bowing_medium_light_skin_tone_minimally]=$'\U1F647\U1F3FC\U200D\U2640'
974+emoji[woman_bowing_medium_skin_tone]=$'\U1F647\U1F3FD\U200D\U2640\UFE0F'
975+emoji[woman_bowing_medium_skin_tone_minimally]=$'\U1F647\U1F3FD\U200D\U2640'
976+emoji[woman_bowing_medium_dark_skin_tone]=$'\U1F647\U1F3FE\U200D\U2640\UFE0F'
977+emoji[woman_bowing_medium_dark_skin_tone_minimally]=$'\U1F647\U1F3FE\U200D\U2640'
978+emoji[woman_bowing_dark_skin_tone]=$'\U1F647\U1F3FF\U200D\U2640\UFE0F'
979+emoji[woman_bowing_dark_skin_tone_minimally]=$'\U1F647\U1F3FF\U200D\U2640'
980+emoji[person_facepalming]=$'\U1F926'
981+emoji[facepalm]=$'\U1F926'
982+emoji[person_facepalming_light_skin_tone]=$'\U1F926\U1F3FB'
983+emoji[person_facepalming_medium_light_skin_tone]=$'\U1F926\U1F3FC'
984+emoji[person_facepalming_medium_skin_tone]=$'\U1F926\U1F3FD'
985+emoji[person_facepalming_medium_dark_skin_tone]=$'\U1F926\U1F3FE'
986+emoji[person_facepalming_dark_skin_tone]=$'\U1F926\U1F3FF'
987+emoji[man_facepalming]=$'\U1F926\U200D\U2642\UFE0F'
988+emoji[man_facepalming_minimally]=$'\U1F926\U200D\U2642'
989+emoji[man_facepalming_light_skin_tone]=$'\U1F926\U1F3FB\U200D\U2642\UFE0F'
990+emoji[man_facepalming_light_skin_tone_minimally]=$'\U1F926\U1F3FB\U200D\U2642'
991+emoji[man_facepalming_medium_light_skin_tone]=$'\U1F926\U1F3FC\U200D\U2642\UFE0F'
992+emoji[man_facepalming_medium_light_skin_tone_minimally]=$'\U1F926\U1F3FC\U200D\U2642'
993+emoji[man_facepalming_medium_skin_tone]=$'\U1F926\U1F3FD\U200D\U2642\UFE0F'
994+emoji[man_facepalming_medium_skin_tone_minimally]=$'\U1F926\U1F3FD\U200D\U2642'
995+emoji[man_facepalming_medium_dark_skin_tone]=$'\U1F926\U1F3FE\U200D\U2642\UFE0F'
996+emoji[man_facepalming_medium_dark_skin_tone_minimally]=$'\U1F926\U1F3FE\U200D\U2642'
997+emoji[man_facepalming_dark_skin_tone]=$'\U1F926\U1F3FF\U200D\U2642\UFE0F'
998+emoji[man_facepalming_dark_skin_tone_minimally]=$'\U1F926\U1F3FF\U200D\U2642'
999+emoji[woman_facepalming]=$'\U1F926\U200D\U2640\UFE0F'
1000+emoji[woman_facepalming_minimally]=$'\U1F926\U200D\U2640'
1001+emoji[woman_facepalming_light_skin_tone]=$'\U1F926\U1F3FB\U200D\U2640\UFE0F'
1002+emoji[woman_facepalming_light_skin_tone_minimally]=$'\U1F926\U1F3FB\U200D\U2640'
1003+emoji[woman_facepalming_medium_light_skin_tone]=$'\U1F926\U1F3FC\U200D\U2640\UFE0F'
1004+emoji[woman_facepalming_medium_light_skin_tone_minimally]=$'\U1F926\U1F3FC\U200D\U2640'
1005+emoji[woman_facepalming_medium_skin_tone]=$'\U1F926\U1F3FD\U200D\U2640\UFE0F'
1006+emoji[woman_facepalming_medium_skin_tone_minimally]=$'\U1F926\U1F3FD\U200D\U2640'
1007+emoji[woman_facepalming_medium_dark_skin_tone]=$'\U1F926\U1F3FE\U200D\U2640\UFE0F'
1008+emoji[woman_facepalming_medium_dark_skin_tone_minimally]=$'\U1F926\U1F3FE\U200D\U2640'
1009+emoji[woman_facepalming_dark_skin_tone]=$'\U1F926\U1F3FF\U200D\U2640\UFE0F'
1010+emoji[woman_facepalming_dark_skin_tone_minimally]=$'\U1F926\U1F3FF\U200D\U2640'
1011+emoji[person_shrugging]=$'\U1F937'
1012+emoji[shrug]=$'\U1F937'
1013+emoji[person_shrugging_light_skin_tone]=$'\U1F937\U1F3FB'
1014+emoji[person_shrugging_medium_light_skin_tone]=$'\U1F937\U1F3FC'
1015+emoji[person_shrugging_medium_skin_tone]=$'\U1F937\U1F3FD'
1016+emoji[person_shrugging_medium_dark_skin_tone]=$'\U1F937\U1F3FE'
1017+emoji[person_shrugging_dark_skin_tone]=$'\U1F937\U1F3FF'
1018+emoji[man_shrugging]=$'\U1F937\U200D\U2642\UFE0F'
1019+emoji[man_shrugging_minimally]=$'\U1F937\U200D\U2642'
1020+emoji[man_shrugging_light_skin_tone]=$'\U1F937\U1F3FB\U200D\U2642\UFE0F'
1021+emoji[man_shrugging_light_skin_tone_minimally]=$'\U1F937\U1F3FB\U200D\U2642'
1022+emoji[man_shrugging_medium_light_skin_tone]=$'\U1F937\U1F3FC\U200D\U2642\UFE0F'
1023+emoji[man_shrugging_medium_light_skin_tone_minimally]=$'\U1F937\U1F3FC\U200D\U2642'
1024+emoji[man_shrugging_medium_skin_tone]=$'\U1F937\U1F3FD\U200D\U2642\UFE0F'
1025+emoji[man_shrugging_medium_skin_tone_minimally]=$'\U1F937\U1F3FD\U200D\U2642'
1026+emoji[man_shrugging_medium_dark_skin_tone]=$'\U1F937\U1F3FE\U200D\U2642\UFE0F'
1027+emoji[man_shrugging_medium_dark_skin_tone_minimally]=$'\U1F937\U1F3FE\U200D\U2642'
1028+emoji[man_shrugging_dark_skin_tone]=$'\U1F937\U1F3FF\U200D\U2642\UFE0F'
1029+emoji[man_shrugging_dark_skin_tone_minimally]=$'\U1F937\U1F3FF\U200D\U2642'
1030+emoji[woman_shrugging]=$'\U1F937\U200D\U2640\UFE0F'
1031+emoji[woman_shrugging_minimally]=$'\U1F937\U200D\U2640'
1032+emoji[woman_shrugging_light_skin_tone]=$'\U1F937\U1F3FB\U200D\U2640\UFE0F'
1033+emoji[woman_shrugging_light_skin_tone_minimally]=$'\U1F937\U1F3FB\U200D\U2640'
1034+emoji[woman_shrugging_medium_light_skin_tone]=$'\U1F937\U1F3FC\U200D\U2640\UFE0F'
1035+emoji[woman_shrugging_medium_light_skin_tone_minimally]=$'\U1F937\U1F3FC\U200D\U2640'
1036+emoji[woman_shrugging_medium_skin_tone]=$'\U1F937\U1F3FD\U200D\U2640\UFE0F'
1037+emoji[woman_shrugging_medium_skin_tone_minimally]=$'\U1F937\U1F3FD\U200D\U2640'
1038+emoji[woman_shrugging_medium_dark_skin_tone]=$'\U1F937\U1F3FE\U200D\U2640\UFE0F'
1039+emoji[woman_shrugging_medium_dark_skin_tone_minimally]=$'\U1F937\U1F3FE\U200D\U2640'
1040+emoji[woman_shrugging_dark_skin_tone]=$'\U1F937\U1F3FF\U200D\U2640\UFE0F'
1041+emoji[woman_shrugging_dark_skin_tone_minimally]=$'\U1F937\U1F3FF\U200D\U2640'
1042+emoji[man_health_worker]=$'\U1F468\U200D\U2695\UFE0F'
1043+emoji[man_health_worker_minimally]=$'\U1F468\U200D\U2695'
1044+emoji[man_health_worker_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U2695\UFE0F'
1045+emoji[man_health_worker_light_skin_tone_minimally]=$'\U1F468\U1F3FB\U200D\U2695'
1046+emoji[man_health_worker_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U2695\UFE0F'
1047+emoji[man_health_worker_medium_light_skin_tone_minimally]=$'\U1F468\U1F3FC\U200D\U2695'
1048+emoji[man_health_worker_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U2695\UFE0F'
1049+emoji[man_health_worker_medium_skin_tone_minimally]=$'\U1F468\U1F3FD\U200D\U2695'
1050+emoji[man_health_worker_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U2695\UFE0F'
1051+emoji[man_health_worker_medium_dark_skin_tone_minimally]=$'\U1F468\U1F3FE\U200D\U2695'
1052+emoji[man_health_worker_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U2695\UFE0F'
1053+emoji[man_health_worker_dark_skin_tone_minimally]=$'\U1F468\U1F3FF\U200D\U2695'
1054+emoji[woman_health_worker]=$'\U1F469\U200D\U2695\UFE0F'
1055+emoji[woman_health_worker_minimally]=$'\U1F469\U200D\U2695'
1056+emoji[woman_health_worker_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U2695\UFE0F'
1057+emoji[woman_health_worker_light_skin_tone_minimally]=$'\U1F469\U1F3FB\U200D\U2695'
1058+emoji[woman_health_worker_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U2695\UFE0F'
1059+emoji[woman_health_worker_medium_light_skin_tone_minimally]=$'\U1F469\U1F3FC\U200D\U2695'
1060+emoji[woman_health_worker_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U2695\UFE0F'
1061+emoji[woman_health_worker_medium_skin_tone_minimally]=$'\U1F469\U1F3FD\U200D\U2695'
1062+emoji[woman_health_worker_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U2695\UFE0F'
1063+emoji[woman_health_worker_medium_dark_skin_tone_minimally]=$'\U1F469\U1F3FE\U200D\U2695'
1064+emoji[woman_health_worker_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U2695\UFE0F'
1065+emoji[woman_health_worker_dark_skin_tone_minimally]=$'\U1F469\U1F3FF\U200D\U2695'
1066+emoji[man_student]=$'\U1F468\U200D\U1F393'
1067+emoji[man_student_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F393'
1068+emoji[man_student_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F393'
1069+emoji[man_student_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F393'
1070+emoji[man_student_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F393'
1071+emoji[man_student_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F393'
1072+emoji[woman_student]=$'\U1F469\U200D\U1F393'
1073+emoji[woman_student_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F393'
1074+emoji[woman_student_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F393'
1075+emoji[woman_student_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F393'
1076+emoji[woman_student_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F393'
1077+emoji[woman_student_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F393'
1078+emoji[man_teacher]=$'\U1F468\U200D\U1F3EB'
1079+emoji[man_teacher_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3EB'
1080+emoji[man_teacher_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3EB'
1081+emoji[man_teacher_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3EB'
1082+emoji[man_teacher_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3EB'
1083+emoji[man_teacher_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3EB'
1084+emoji[woman_teacher]=$'\U1F469\U200D\U1F3EB'
1085+emoji[woman_teacher_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3EB'
1086+emoji[woman_teacher_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3EB'
1087+emoji[woman_teacher_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3EB'
1088+emoji[woman_teacher_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3EB'
1089+emoji[woman_teacher_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3EB'
1090+emoji[man_judge]=$'\U1F468\U200D\U2696\UFE0F'
1091+emoji[man_judge_minimally]=$'\U1F468\U200D\U2696'
1092+emoji[man_judge_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U2696\UFE0F'
1093+emoji[man_judge_light_skin_tone_minimally]=$'\U1F468\U1F3FB\U200D\U2696'
1094+emoji[man_judge_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U2696\UFE0F'
1095+emoji[man_judge_medium_light_skin_tone_minimally]=$'\U1F468\U1F3FC\U200D\U2696'
1096+emoji[man_judge_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U2696\UFE0F'
1097+emoji[man_judge_medium_skin_tone_minimally]=$'\U1F468\U1F3FD\U200D\U2696'
1098+emoji[man_judge_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U2696\UFE0F'
1099+emoji[man_judge_medium_dark_skin_tone_minimally]=$'\U1F468\U1F3FE\U200D\U2696'
1100+emoji[man_judge_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U2696\UFE0F'
1101+emoji[man_judge_dark_skin_tone_minimally]=$'\U1F468\U1F3FF\U200D\U2696'
1102+emoji[woman_judge]=$'\U1F469\U200D\U2696\UFE0F'
1103+emoji[woman_judge_minimally]=$'\U1F469\U200D\U2696'
1104+emoji[woman_judge_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U2696\UFE0F'
1105+emoji[woman_judge_light_skin_tone_minimally]=$'\U1F469\U1F3FB\U200D\U2696'
1106+emoji[woman_judge_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U2696\UFE0F'
1107+emoji[woman_judge_medium_light_skin_tone_minimally]=$'\U1F469\U1F3FC\U200D\U2696'
1108+emoji[woman_judge_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U2696\UFE0F'
1109+emoji[woman_judge_medium_skin_tone_minimally]=$'\U1F469\U1F3FD\U200D\U2696'
1110+emoji[woman_judge_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U2696\UFE0F'
1111+emoji[woman_judge_medium_dark_skin_tone_minimally]=$'\U1F469\U1F3FE\U200D\U2696'
1112+emoji[woman_judge_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U2696\UFE0F'
1113+emoji[woman_judge_dark_skin_tone_minimally]=$'\U1F469\U1F3FF\U200D\U2696'
1114+emoji[man_farmer]=$'\U1F468\U200D\U1F33E'
1115+emoji[man_farmer_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F33E'
1116+emoji[man_farmer_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F33E'
1117+emoji[man_farmer_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F33E'
1118+emoji[man_farmer_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F33E'
1119+emoji[man_farmer_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F33E'
1120+emoji[woman_farmer]=$'\U1F469\U200D\U1F33E'
1121+emoji[woman_farmer_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F33E'
1122+emoji[woman_farmer_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F33E'
1123+emoji[woman_farmer_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F33E'
1124+emoji[woman_farmer_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F33E'
1125+emoji[woman_farmer_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F33E'
1126+emoji[man_cook]=$'\U1F468\U200D\U1F373'
1127+emoji[man_cook_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F373'
1128+emoji[man_cook_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F373'
1129+emoji[man_cook_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F373'
1130+emoji[man_cook_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F373'
1131+emoji[man_cook_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F373'
1132+emoji[woman_cook]=$'\U1F469\U200D\U1F373'
1133+emoji[woman_cook_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F373'
1134+emoji[woman_cook_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F373'
1135+emoji[woman_cook_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F373'
1136+emoji[woman_cook_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F373'
1137+emoji[woman_cook_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F373'
1138+emoji[man_mechanic]=$'\U1F468\U200D\U1F527'
1139+emoji[man_mechanic_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F527'
1140+emoji[man_mechanic_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F527'
1141+emoji[man_mechanic_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F527'
1142+emoji[man_mechanic_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F527'
1143+emoji[man_mechanic_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F527'
1144+emoji[woman_mechanic]=$'\U1F469\U200D\U1F527'
1145+emoji[woman_mechanic_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F527'
1146+emoji[woman_mechanic_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F527'
1147+emoji[woman_mechanic_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F527'
1148+emoji[woman_mechanic_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F527'
1149+emoji[woman_mechanic_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F527'
1150+emoji[man_factory_worker]=$'\U1F468\U200D\U1F3ED'
1151+emoji[man_factory_worker_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3ED'
1152+emoji[man_factory_worker_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3ED'
1153+emoji[man_factory_worker_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3ED'
1154+emoji[man_factory_worker_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3ED'
1155+emoji[man_factory_worker_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3ED'
1156+emoji[woman_factory_worker]=$'\U1F469\U200D\U1F3ED'
1157+emoji[woman_factory_worker_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3ED'
1158+emoji[woman_factory_worker_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3ED'
1159+emoji[woman_factory_worker_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3ED'
1160+emoji[woman_factory_worker_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3ED'
1161+emoji[woman_factory_worker_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3ED'
1162+emoji[man_office_worker]=$'\U1F468\U200D\U1F4BC'
1163+emoji[man_office_worker_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F4BC'
1164+emoji[man_office_worker_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F4BC'
1165+emoji[man_office_worker_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F4BC'
1166+emoji[man_office_worker_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F4BC'
1167+emoji[man_office_worker_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F4BC'
1168+emoji[woman_office_worker]=$'\U1F469\U200D\U1F4BC'
1169+emoji[woman_office_worker_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F4BC'
1170+emoji[woman_office_worker_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F4BC'
1171+emoji[woman_office_worker_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F4BC'
1172+emoji[woman_office_worker_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F4BC'
1173+emoji[woman_office_worker_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F4BC'
1174+emoji[man_scientist]=$'\U1F468\U200D\U1F52C'
1175+emoji[man_scientist_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F52C'
1176+emoji[man_scientist_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F52C'
1177+emoji[man_scientist_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F52C'
1178+emoji[man_scientist_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F52C'
1179+emoji[man_scientist_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F52C'
1180+emoji[woman_scientist]=$'\U1F469\U200D\U1F52C'
1181+emoji[woman_scientist_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F52C'
1182+emoji[woman_scientist_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F52C'
1183+emoji[woman_scientist_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F52C'
1184+emoji[woman_scientist_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F52C'
1185+emoji[woman_scientist_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F52C'
1186+emoji[man_technologist]=$'\U1F468\U200D\U1F4BB'
1187+emoji[man_technologist_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F4BB'
1188+emoji[man_technologist_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F4BB'
1189+emoji[man_technologist_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F4BB'
1190+emoji[man_technologist_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F4BB'
1191+emoji[man_technologist_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F4BB'
1192+emoji[woman_technologist]=$'\U1F469\U200D\U1F4BB'
1193+emoji[woman_technologist_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F4BB'
1194+emoji[woman_technologist_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F4BB'
1195+emoji[woman_technologist_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F4BB'
1196+emoji[woman_technologist_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F4BB'
1197+emoji[woman_technologist_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F4BB'
1198+emoji[man_singer]=$'\U1F468\U200D\U1F3A4'
1199+emoji[man_singer_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3A4'
1200+emoji[man_singer_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3A4'
1201+emoji[man_singer_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3A4'
1202+emoji[man_singer_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3A4'
1203+emoji[man_singer_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3A4'
1204+emoji[woman_singer]=$'\U1F469\U200D\U1F3A4'
1205+emoji[woman_singer_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3A4'
1206+emoji[woman_singer_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3A4'
1207+emoji[woman_singer_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3A4'
1208+emoji[woman_singer_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3A4'
1209+emoji[woman_singer_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3A4'
1210+emoji[man_artist]=$'\U1F468\U200D\U1F3A8'
1211+emoji[man_artist_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3A8'
1212+emoji[man_artist_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3A8'
1213+emoji[man_artist_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3A8'
1214+emoji[man_artist_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3A8'
1215+emoji[man_artist_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3A8'
1216+emoji[woman_artist]=$'\U1F469\U200D\U1F3A8'
1217+emoji[woman_artist_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3A8'
1218+emoji[woman_artist_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3A8'
1219+emoji[woman_artist_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3A8'
1220+emoji[woman_artist_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3A8'
1221+emoji[woman_artist_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3A8'
1222+emoji[man_pilot]=$'\U1F468\U200D\U2708\UFE0F'
1223+emoji[man_pilot_minimally]=$'\U1F468\U200D\U2708'
1224+emoji[man_pilot_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U2708\UFE0F'
1225+emoji[man_pilot_light_skin_tone_minimally]=$'\U1F468\U1F3FB\U200D\U2708'
1226+emoji[man_pilot_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U2708\UFE0F'
1227+emoji[man_pilot_medium_light_skin_tone_minimally]=$'\U1F468\U1F3FC\U200D\U2708'
1228+emoji[man_pilot_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U2708\UFE0F'
1229+emoji[man_pilot_medium_skin_tone_minimally]=$'\U1F468\U1F3FD\U200D\U2708'
1230+emoji[man_pilot_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U2708\UFE0F'
1231+emoji[man_pilot_medium_dark_skin_tone_minimally]=$'\U1F468\U1F3FE\U200D\U2708'
1232+emoji[man_pilot_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U2708\UFE0F'
1233+emoji[man_pilot_dark_skin_tone_minimally]=$'\U1F468\U1F3FF\U200D\U2708'
1234+emoji[woman_pilot]=$'\U1F469\U200D\U2708\UFE0F'
1235+emoji[woman_pilot_minimally]=$'\U1F469\U200D\U2708'
1236+emoji[woman_pilot_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U2708\UFE0F'
1237+emoji[woman_pilot_light_skin_tone_minimally]=$'\U1F469\U1F3FB\U200D\U2708'
1238+emoji[woman_pilot_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U2708\UFE0F'
1239+emoji[woman_pilot_medium_light_skin_tone_minimally]=$'\U1F469\U1F3FC\U200D\U2708'
1240+emoji[woman_pilot_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U2708\UFE0F'
1241+emoji[woman_pilot_medium_skin_tone_minimally]=$'\U1F469\U1F3FD\U200D\U2708'
1242+emoji[woman_pilot_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U2708\UFE0F'
1243+emoji[woman_pilot_medium_dark_skin_tone_minimally]=$'\U1F469\U1F3FE\U200D\U2708'
1244+emoji[woman_pilot_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U2708\UFE0F'
1245+emoji[woman_pilot_dark_skin_tone_minimally]=$'\U1F469\U1F3FF\U200D\U2708'
1246+emoji[man_astronaut]=$'\U1F468\U200D\U1F680'
1247+emoji[man_astronaut_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F680'
1248+emoji[man_astronaut_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F680'
1249+emoji[man_astronaut_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F680'
1250+emoji[man_astronaut_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F680'
1251+emoji[man_astronaut_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F680'
1252+emoji[woman_astronaut]=$'\U1F469\U200D\U1F680'
1253+emoji[woman_astronaut_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F680'
1254+emoji[woman_astronaut_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F680'
1255+emoji[woman_astronaut_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F680'
1256+emoji[woman_astronaut_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F680'
1257+emoji[woman_astronaut_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F680'
1258+emoji[man_firefighter]=$'\U1F468\U200D\U1F692'
1259+emoji[man_firefighter_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F692'
1260+emoji[man_firefighter_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F692'
1261+emoji[man_firefighter_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F692'
1262+emoji[man_firefighter_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F692'
1263+emoji[man_firefighter_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F692'
1264+emoji[woman_firefighter]=$'\U1F469\U200D\U1F692'
1265+emoji[woman_firefighter_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F692'
1266+emoji[woman_firefighter_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F692'
1267+emoji[woman_firefighter_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F692'
1268+emoji[woman_firefighter_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F692'
1269+emoji[woman_firefighter_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F692'
1270+emoji[police_officer]=$'\U1F46E'
1271+emoji[cop]=$'\U1F46E'
1272+emoji[police_officer_light_skin_tone]=$'\U1F46E\U1F3FB'
1273+emoji[police_officer_medium_light_skin_tone]=$'\U1F46E\U1F3FC'
1274+emoji[police_officer_medium_skin_tone]=$'\U1F46E\U1F3FD'
1275+emoji[police_officer_medium_dark_skin_tone]=$'\U1F46E\U1F3FE'
1276+emoji[police_officer_dark_skin_tone]=$'\U1F46E\U1F3FF'
1277+emoji[man_police_officer]=$'\U1F46E\U200D\U2642\UFE0F'
1278+emoji[man_police_officer_minimally]=$'\U1F46E\U200D\U2642'
1279+emoji[policeman]=$'\U1F46E\U200D\U2642'
1280+emoji[man_police_officer_light_skin_tone]=$'\U1F46E\U1F3FB\U200D\U2642\UFE0F'
1281+emoji[man_police_officer_light_skin_tone_minimally]=$'\U1F46E\U1F3FB\U200D\U2642'
1282+emoji[man_police_officer_medium_light_skin_tone]=$'\U1F46E\U1F3FC\U200D\U2642\UFE0F'
1283+emoji[man_police_officer_medium_light_skin_tone_minimally]=$'\U1F46E\U1F3FC\U200D\U2642'
1284+emoji[man_police_officer_medium_skin_tone]=$'\U1F46E\U1F3FD\U200D\U2642\UFE0F'
1285+emoji[man_police_officer_medium_skin_tone_minimally]=$'\U1F46E\U1F3FD\U200D\U2642'
1286+emoji[man_police_officer_medium_dark_skin_tone]=$'\U1F46E\U1F3FE\U200D\U2642\UFE0F'
1287+emoji[man_police_officer_medium_dark_skin_tone_minimally]=$'\U1F46E\U1F3FE\U200D\U2642'
1288+emoji[man_police_officer_dark_skin_tone]=$'\U1F46E\U1F3FF\U200D\U2642\UFE0F'
1289+emoji[man_police_officer_dark_skin_tone_minimally]=$'\U1F46E\U1F3FF\U200D\U2642'
1290+emoji[woman_police_officer]=$'\U1F46E\U200D\U2640\UFE0F'
1291+emoji[woman_police_officer_minimally]=$'\U1F46E\U200D\U2640'
1292+emoji[policewoman]=$'\U1F46E\U200D\U2640'
1293+emoji[woman_police_officer_light_skin_tone]=$'\U1F46E\U1F3FB\U200D\U2640\UFE0F'
1294+emoji[woman_police_officer_light_skin_tone_minimally]=$'\U1F46E\U1F3FB\U200D\U2640'
1295+emoji[woman_police_officer_medium_light_skin_tone]=$'\U1F46E\U1F3FC\U200D\U2640\UFE0F'
1296+emoji[woman_police_officer_medium_light_skin_tone_minimally]=$'\U1F46E\U1F3FC\U200D\U2640'
1297+emoji[woman_police_officer_medium_skin_tone]=$'\U1F46E\U1F3FD\U200D\U2640\UFE0F'
1298+emoji[woman_police_officer_medium_skin_tone_minimally]=$'\U1F46E\U1F3FD\U200D\U2640'
1299+emoji[woman_police_officer_medium_dark_skin_tone]=$'\U1F46E\U1F3FE\U200D\U2640\UFE0F'
1300+emoji[woman_police_officer_medium_dark_skin_tone_minimally]=$'\U1F46E\U1F3FE\U200D\U2640'
1301+emoji[woman_police_officer_dark_skin_tone]=$'\U1F46E\U1F3FF\U200D\U2640\UFE0F'
1302+emoji[woman_police_officer_dark_skin_tone_minimally]=$'\U1F46E\U1F3FF\U200D\U2640'
1303+emoji[detective]=$'\U1F575\UFE0F'
1304+emoji[detective_unqualified]=$'\U1F575'
1305+emoji[detective_light_skin_tone]=$'\U1F575\U1F3FB'
1306+emoji[detective_medium_light_skin_tone]=$'\U1F575\U1F3FC'
1307+emoji[detective_medium_skin_tone]=$'\U1F575\U1F3FD'
1308+emoji[detective_medium_dark_skin_tone]=$'\U1F575\U1F3FE'
1309+emoji[detective_dark_skin_tone]=$'\U1F575\U1F3FF'
1310+emoji[man_detective]=$'\U1F575\UFE0F\U200D\U2642\UFE0F'
1311+emoji[male_detective]=$'\U1F575\UFE0F\U200D\U2642\UFE0F'
1312+emoji[man_detective_unqualified]=$'\U1F575\U200D\U2642\UFE0F'
1313+emoji[man_detective_unqualified_1]=$'\U1F575\UFE0F\U200D\U2642'
1314+emoji[man_detective_unqualified_2]=$'\U1F575\U200D\U2642'
1315+emoji[man_detective_light_skin_tone]=$'\U1F575\U1F3FB\U200D\U2642\UFE0F'
1316+emoji[man_detective_light_skin_tone_minimally]=$'\U1F575\U1F3FB\U200D\U2642'
1317+emoji[man_detective_medium_light_skin_tone]=$'\U1F575\U1F3FC\U200D\U2642\UFE0F'
1318+emoji[man_detective_medium_light_skin_tone_minimally]=$'\U1F575\U1F3FC\U200D\U2642'
1319+emoji[man_detective_medium_skin_tone]=$'\U1F575\U1F3FD\U200D\U2642\UFE0F'
1320+emoji[man_detective_medium_skin_tone_minimally]=$'\U1F575\U1F3FD\U200D\U2642'
1321+emoji[man_detective_medium_dark_skin_tone]=$'\U1F575\U1F3FE\U200D\U2642\UFE0F'
1322+emoji[man_detective_medium_dark_skin_tone_minimally]=$'\U1F575\U1F3FE\U200D\U2642'
1323+emoji[man_detective_dark_skin_tone]=$'\U1F575\U1F3FF\U200D\U2642\UFE0F'
1324+emoji[man_detective_dark_skin_tone_minimally]=$'\U1F575\U1F3FF\U200D\U2642'
1325+emoji[woman_detective]=$'\U1F575\UFE0F\U200D\U2640\UFE0F'
1326+emoji[female_detective]=$'\U1F575\UFE0F\U200D\U2640\UFE0F'
1327+emoji[woman_detective_unqualified]=$'\U1F575\U200D\U2640\UFE0F'
1328+emoji[woman_detective_unqualified_1]=$'\U1F575\UFE0F\U200D\U2640'
1329+emoji[woman_detective_unqualified_2]=$'\U1F575\U200D\U2640'
1330+emoji[woman_detective_light_skin_tone]=$'\U1F575\U1F3FB\U200D\U2640\UFE0F'
1331+emoji[woman_detective_light_skin_tone_minimally]=$'\U1F575\U1F3FB\U200D\U2640'
1332+emoji[woman_detective_medium_light_skin_tone]=$'\U1F575\U1F3FC\U200D\U2640\UFE0F'
1333+emoji[woman_detective_medium_light_skin_tone_minimally]=$'\U1F575\U1F3FC\U200D\U2640'
1334+emoji[woman_detective_medium_skin_tone]=$'\U1F575\U1F3FD\U200D\U2640\UFE0F'
1335+emoji[woman_detective_medium_skin_tone_minimally]=$'\U1F575\U1F3FD\U200D\U2640'
1336+emoji[woman_detective_medium_dark_skin_tone]=$'\U1F575\U1F3FE\U200D\U2640\UFE0F'
1337+emoji[woman_detective_medium_dark_skin_tone_minimally]=$'\U1F575\U1F3FE\U200D\U2640'
1338+emoji[woman_detective_dark_skin_tone]=$'\U1F575\U1F3FF\U200D\U2640\UFE0F'
1339+emoji[woman_detective_dark_skin_tone_minimally]=$'\U1F575\U1F3FF\U200D\U2640'
1340+emoji[guard]=$'\U1F482'
1341+emoji[guard_light_skin_tone]=$'\U1F482\U1F3FB'
1342+emoji[guard_medium_light_skin_tone]=$'\U1F482\U1F3FC'
1343+emoji[guard_medium_skin_tone]=$'\U1F482\U1F3FD'
1344+emoji[guard_medium_dark_skin_tone]=$'\U1F482\U1F3FE'
1345+emoji[guard_dark_skin_tone]=$'\U1F482\U1F3FF'
1346+emoji[man_guard]=$'\U1F482\U200D\U2642\UFE0F'
1347+emoji[man_guard_minimally]=$'\U1F482\U200D\U2642'
1348+emoji[guardsman]=$'\U1F482\U200D\U2642'
1349+emoji[man_guard_light_skin_tone]=$'\U1F482\U1F3FB\U200D\U2642\UFE0F'
1350+emoji[man_guard_light_skin_tone_minimally]=$'\U1F482\U1F3FB\U200D\U2642'
1351+emoji[man_guard_medium_light_skin_tone]=$'\U1F482\U1F3FC\U200D\U2642\UFE0F'
1352+emoji[man_guard_medium_light_skin_tone_minimally]=$'\U1F482\U1F3FC\U200D\U2642'
1353+emoji[man_guard_medium_skin_tone]=$'\U1F482\U1F3FD\U200D\U2642\UFE0F'
1354+emoji[man_guard_medium_skin_tone_minimally]=$'\U1F482\U1F3FD\U200D\U2642'
1355+emoji[man_guard_medium_dark_skin_tone]=$'\U1F482\U1F3FE\U200D\U2642\UFE0F'
1356+emoji[man_guard_medium_dark_skin_tone_minimally]=$'\U1F482\U1F3FE\U200D\U2642'
1357+emoji[man_guard_dark_skin_tone]=$'\U1F482\U1F3FF\U200D\U2642\UFE0F'
1358+emoji[man_guard_dark_skin_tone_minimally]=$'\U1F482\U1F3FF\U200D\U2642'
1359+emoji[woman_guard]=$'\U1F482\U200D\U2640\UFE0F'
1360+emoji[woman_guard_minimally]=$'\U1F482\U200D\U2640'
1361+emoji[guardswoman]=$'\U1F482\U200D\U2640'
1362+emoji[woman_guard_light_skin_tone]=$'\U1F482\U1F3FB\U200D\U2640\UFE0F'
1363+emoji[woman_guard_light_skin_tone_minimally]=$'\U1F482\U1F3FB\U200D\U2640'
1364+emoji[woman_guard_medium_light_skin_tone]=$'\U1F482\U1F3FC\U200D\U2640\UFE0F'
1365+emoji[woman_guard_medium_light_skin_tone_minimally]=$'\U1F482\U1F3FC\U200D\U2640'
1366+emoji[woman_guard_medium_skin_tone]=$'\U1F482\U1F3FD\U200D\U2640\UFE0F'
1367+emoji[woman_guard_medium_skin_tone_minimally]=$'\U1F482\U1F3FD\U200D\U2640'
1368+emoji[woman_guard_medium_dark_skin_tone]=$'\U1F482\U1F3FE\U200D\U2640\UFE0F'
1369+emoji[woman_guard_medium_dark_skin_tone_minimally]=$'\U1F482\U1F3FE\U200D\U2640'
1370+emoji[woman_guard_dark_skin_tone]=$'\U1F482\U1F3FF\U200D\U2640\UFE0F'
1371+emoji[woman_guard_dark_skin_tone_minimally]=$'\U1F482\U1F3FF\U200D\U2640'
1372+emoji[construction_worker]=$'\U1F477'
1373+emoji[construction_worker_light_skin_tone]=$'\U1F477\U1F3FB'
1374+emoji[construction_worker_medium_light_skin_tone]=$'\U1F477\U1F3FC'
1375+emoji[construction_worker_medium_skin_tone]=$'\U1F477\U1F3FD'
1376+emoji[construction_worker_medium_dark_skin_tone]=$'\U1F477\U1F3FE'
1377+emoji[construction_worker_dark_skin_tone]=$'\U1F477\U1F3FF'
1378+emoji[man_construction_worker]=$'\U1F477\U200D\U2642\UFE0F'
1379+emoji[man_construction_worker_minimally]=$'\U1F477\U200D\U2642'
1380+emoji[construction_worker_man]=$'\U1F477\U200D\U2642'
1381+emoji[man_construction_worker_light_skin_tone]=$'\U1F477\U1F3FB\U200D\U2642\UFE0F'
1382+emoji[man_construction_worker_light_skin_tone_minimally]=$'\U1F477\U1F3FB\U200D\U2642'
1383+emoji[man_construction_worker_medium_light_skin_tone]=$'\U1F477\U1F3FC\U200D\U2642\UFE0F'
1384+emoji[man_construction_worker_medium_light_skin_tone_minimally]=$'\U1F477\U1F3FC\U200D\U2642'
1385+emoji[man_construction_worker_medium_skin_tone]=$'\U1F477\U1F3FD\U200D\U2642\UFE0F'
1386+emoji[man_construction_worker_medium_skin_tone_minimally]=$'\U1F477\U1F3FD\U200D\U2642'
1387+emoji[man_construction_worker_medium_dark_skin_tone]=$'\U1F477\U1F3FE\U200D\U2642\UFE0F'
1388+emoji[man_construction_worker_medium_dark_skin_tone_minimally]=$'\U1F477\U1F3FE\U200D\U2642'
1389+emoji[man_construction_worker_dark_skin_tone]=$'\U1F477\U1F3FF\U200D\U2642\UFE0F'
1390+emoji[man_construction_worker_dark_skin_tone_minimally]=$'\U1F477\U1F3FF\U200D\U2642'
1391+emoji[woman_construction_worker]=$'\U1F477\U200D\U2640\UFE0F'
1392+emoji[woman_construction_worker_minimally]=$'\U1F477\U200D\U2640'
1393+emoji[construction_worker_woman]=$'\U1F477\U200D\U2640'
1394+emoji[woman_construction_worker_light_skin_tone]=$'\U1F477\U1F3FB\U200D\U2640\UFE0F'
1395+emoji[woman_construction_worker_light_skin_tone_minimally]=$'\U1F477\U1F3FB\U200D\U2640'
1396+emoji[woman_construction_worker_medium_light_skin_tone]=$'\U1F477\U1F3FC\U200D\U2640\UFE0F'
1397+emoji[woman_construction_worker_medium_light_skin_tone_minimally]=$'\U1F477\U1F3FC\U200D\U2640'
1398+emoji[woman_construction_worker_medium_skin_tone]=$'\U1F477\U1F3FD\U200D\U2640\UFE0F'
1399+emoji[woman_construction_worker_medium_skin_tone_minimally]=$'\U1F477\U1F3FD\U200D\U2640'
1400+emoji[woman_construction_worker_medium_dark_skin_tone]=$'\U1F477\U1F3FE\U200D\U2640\UFE0F'
1401+emoji[woman_construction_worker_medium_dark_skin_tone_minimally]=$'\U1F477\U1F3FE\U200D\U2640'
1402+emoji[woman_construction_worker_dark_skin_tone]=$'\U1F477\U1F3FF\U200D\U2640\UFE0F'
1403+emoji[woman_construction_worker_dark_skin_tone_minimally]=$'\U1F477\U1F3FF\U200D\U2640'
1404+emoji[prince]=$'\U1F934'
1405+emoji[prince_light_skin_tone]=$'\U1F934\U1F3FB'
1406+emoji[prince_medium_light_skin_tone]=$'\U1F934\U1F3FC'
1407+emoji[prince_medium_skin_tone]=$'\U1F934\U1F3FD'
1408+emoji[prince_medium_dark_skin_tone]=$'\U1F934\U1F3FE'
1409+emoji[prince_dark_skin_tone]=$'\U1F934\U1F3FF'
1410+emoji[princess]=$'\U1F478'
1411+emoji[princess_light_skin_tone]=$'\U1F478\U1F3FB'
1412+emoji[princess_medium_light_skin_tone]=$'\U1F478\U1F3FC'
1413+emoji[princess_medium_skin_tone]=$'\U1F478\U1F3FD'
1414+emoji[princess_medium_dark_skin_tone]=$'\U1F478\U1F3FE'
1415+emoji[princess_dark_skin_tone]=$'\U1F478\U1F3FF'
1416+emoji[person_wearing_turban]=$'\U1F473'
1417+emoji[person_with_turban]=$'\U1F473'
1418+emoji[person_wearing_turban_light_skin_tone]=$'\U1F473\U1F3FB'
1419+emoji[person_wearing_turban_medium_light_skin_tone]=$'\U1F473\U1F3FC'
1420+emoji[person_wearing_turban_medium_skin_tone]=$'\U1F473\U1F3FD'
1421+emoji[person_wearing_turban_medium_dark_skin_tone]=$'\U1F473\U1F3FE'
1422+emoji[person_wearing_turban_dark_skin_tone]=$'\U1F473\U1F3FF'
1423+emoji[man_wearing_turban]=$'\U1F473\U200D\U2642\UFE0F'
1424+emoji[man_wearing_turban_minimally]=$'\U1F473\U200D\U2642'
1425+emoji[man_with_turban]=$'\U1F473\U200D\U2642'
1426+emoji[man_wearing_turban_light_skin_tone]=$'\U1F473\U1F3FB\U200D\U2642\UFE0F'
1427+emoji[man_wearing_turban_light_skin_tone_minimally]=$'\U1F473\U1F3FB\U200D\U2642'
1428+emoji[man_wearing_turban_medium_light_skin_tone]=$'\U1F473\U1F3FC\U200D\U2642\UFE0F'
1429+emoji[man_wearing_turban_medium_light_skin_tone_minimally]=$'\U1F473\U1F3FC\U200D\U2642'
1430+emoji[man_wearing_turban_medium_skin_tone]=$'\U1F473\U1F3FD\U200D\U2642\UFE0F'
1431+emoji[man_wearing_turban_medium_skin_tone_minimally]=$'\U1F473\U1F3FD\U200D\U2642'
1432+emoji[man_wearing_turban_medium_dark_skin_tone]=$'\U1F473\U1F3FE\U200D\U2642\UFE0F'
1433+emoji[man_wearing_turban_medium_dark_skin_tone_minimally]=$'\U1F473\U1F3FE\U200D\U2642'
1434+emoji[man_wearing_turban_dark_skin_tone]=$'\U1F473\U1F3FF\U200D\U2642\UFE0F'
1435+emoji[man_wearing_turban_dark_skin_tone_minimally]=$'\U1F473\U1F3FF\U200D\U2642'
1436+emoji[woman_wearing_turban]=$'\U1F473\U200D\U2640\UFE0F'
1437+emoji[woman_wearing_turban_minimally]=$'\U1F473\U200D\U2640'
1438+emoji[woman_with_turban]=$'\U1F473\U200D\U2640'
1439+emoji[woman_wearing_turban_light_skin_tone]=$'\U1F473\U1F3FB\U200D\U2640\UFE0F'
1440+emoji[woman_wearing_turban_light_skin_tone_minimally]=$'\U1F473\U1F3FB\U200D\U2640'
1441+emoji[woman_wearing_turban_medium_light_skin_tone]=$'\U1F473\U1F3FC\U200D\U2640\UFE0F'
1442+emoji[woman_wearing_turban_medium_light_skin_tone_minimally]=$'\U1F473\U1F3FC\U200D\U2640'
1443+emoji[woman_wearing_turban_medium_skin_tone]=$'\U1F473\U1F3FD\U200D\U2640\UFE0F'
1444+emoji[woman_wearing_turban_medium_skin_tone_minimally]=$'\U1F473\U1F3FD\U200D\U2640'
1445+emoji[woman_wearing_turban_medium_dark_skin_tone]=$'\U1F473\U1F3FE\U200D\U2640\UFE0F'
1446+emoji[woman_wearing_turban_medium_dark_skin_tone_minimally]=$'\U1F473\U1F3FE\U200D\U2640'
1447+emoji[woman_wearing_turban_dark_skin_tone]=$'\U1F473\U1F3FF\U200D\U2640\UFE0F'
1448+emoji[woman_wearing_turban_dark_skin_tone_minimally]=$'\U1F473\U1F3FF\U200D\U2640'
1449+emoji[man_with_Chinese_cap]=$'\U1F472'
1450+emoji[man_with_gua_pi_mao]=$'\U1F472'
1451+emoji[man_with_Chinese_cap_light_skin_tone]=$'\U1F472\U1F3FB'
1452+emoji[man_with_Chinese_cap_medium_light_skin_tone]=$'\U1F472\U1F3FC'
1453+emoji[man_with_Chinese_cap_medium_skin_tone]=$'\U1F472\U1F3FD'
1454+emoji[man_with_Chinese_cap_medium_dark_skin_tone]=$'\U1F472\U1F3FE'
1455+emoji[man_with_Chinese_cap_dark_skin_tone]=$'\U1F472\U1F3FF'
1456+emoji[woman_with_headscarf]=$'\U1F9D5'
1457+emoji[woman_with_headscarf_light_skin_tone]=$'\U1F9D5\U1F3FB'
1458+emoji[woman_with_headscarf_medium_light_skin_tone]=$'\U1F9D5\U1F3FC'
1459+emoji[woman_with_headscarf_medium_skin_tone]=$'\U1F9D5\U1F3FD'
1460+emoji[woman_with_headscarf_medium_dark_skin_tone]=$'\U1F9D5\U1F3FE'
1461+emoji[woman_with_headscarf_dark_skin_tone]=$'\U1F9D5\U1F3FF'
1462+emoji[man_in_tuxedo]=$'\U1F935'
1463+emoji[man_in_tuxedo_light_skin_tone]=$'\U1F935\U1F3FB'
1464+emoji[man_in_tuxedo_medium_light_skin_tone]=$'\U1F935\U1F3FC'
1465+emoji[man_in_tuxedo_medium_skin_tone]=$'\U1F935\U1F3FD'
1466+emoji[man_in_tuxedo_medium_dark_skin_tone]=$'\U1F935\U1F3FE'
1467+emoji[man_in_tuxedo_dark_skin_tone]=$'\U1F935\U1F3FF'
1468+emoji[bride_with_veil]=$'\U1F470'
1469+emoji[bride_with_veil_light_skin_tone]=$'\U1F470\U1F3FB'
1470+emoji[bride_with_veil_medium_light_skin_tone]=$'\U1F470\U1F3FC'
1471+emoji[bride_with_veil_medium_skin_tone]=$'\U1F470\U1F3FD'
1472+emoji[bride_with_veil_medium_dark_skin_tone]=$'\U1F470\U1F3FE'
1473+emoji[bride_with_veil_dark_skin_tone]=$'\U1F470\U1F3FF'
1474+emoji[pregnant_woman]=$'\U1F930'
1475+emoji[pregnant_woman_light_skin_tone]=$'\U1F930\U1F3FB'
1476+emoji[pregnant_woman_medium_light_skin_tone]=$'\U1F930\U1F3FC'
1477+emoji[pregnant_woman_medium_skin_tone]=$'\U1F930\U1F3FD'
1478+emoji[pregnant_woman_medium_dark_skin_tone]=$'\U1F930\U1F3FE'
1479+emoji[pregnant_woman_dark_skin_tone]=$'\U1F930\U1F3FF'
1480+emoji[breast_feeding]=$'\U1F931'
1481+emoji[breast_feeding_light_skin_tone]=$'\U1F931\U1F3FB'
1482+emoji[breast_feeding_medium_light_skin_tone]=$'\U1F931\U1F3FC'
1483+emoji[breast_feeding_medium_skin_tone]=$'\U1F931\U1F3FD'
1484+emoji[breast_feeding_medium_dark_skin_tone]=$'\U1F931\U1F3FE'
1485+emoji[breast_feeding_dark_skin_tone]=$'\U1F931\U1F3FF'
1486+emoji[baby_angel]=$'\U1F47C'
1487+emoji[angel]=$'\U1F47C'
1488+emoji[baby_angel_light_skin_tone]=$'\U1F47C\U1F3FB'
1489+emoji[baby_angel_medium_light_skin_tone]=$'\U1F47C\U1F3FC'
1490+emoji[baby_angel_medium_skin_tone]=$'\U1F47C\U1F3FD'
1491+emoji[baby_angel_medium_dark_skin_tone]=$'\U1F47C\U1F3FE'
1492+emoji[baby_angel_dark_skin_tone]=$'\U1F47C\U1F3FF'
1493+emoji[Santa_Claus]=$'\U1F385'
1494+emoji[santa]=$'\U1F385'
1495+emoji[Santa_Claus_light_skin_tone]=$'\U1F385\U1F3FB'
1496+emoji[Santa_Claus_medium_light_skin_tone]=$'\U1F385\U1F3FC'
1497+emoji[Santa_Claus_medium_skin_tone]=$'\U1F385\U1F3FD'
1498+emoji[Santa_Claus_medium_dark_skin_tone]=$'\U1F385\U1F3FE'
1499+emoji[Santa_Claus_dark_skin_tone]=$'\U1F385\U1F3FF'
1500+emoji[Mrs_Claus]=$'\U1F936'
1501+emoji[mrs_claus]=$'\U1F936'
1502+emoji[Mrs_Claus_light_skin_tone]=$'\U1F936\U1F3FB'
1503+emoji[Mrs_Claus_medium_light_skin_tone]=$'\U1F936\U1F3FC'
1504+emoji[Mrs_Claus_medium_skin_tone]=$'\U1F936\U1F3FD'
1505+emoji[Mrs_Claus_medium_dark_skin_tone]=$'\U1F936\U1F3FE'
1506+emoji[Mrs_Claus_dark_skin_tone]=$'\U1F936\U1F3FF'
1507+emoji[superhero]=$'\U1F9B8'
1508+emoji[superhero_light_skin_tone]=$'\U1F9B8\U1F3FB'
1509+emoji[superhero_medium_light_skin_tone]=$'\U1F9B8\U1F3FC'
1510+emoji[superhero_medium_skin_tone]=$'\U1F9B8\U1F3FD'
1511+emoji[superhero_medium_dark_skin_tone]=$'\U1F9B8\U1F3FE'
1512+emoji[superhero_dark_skin_tone]=$'\U1F9B8\U1F3FF'
1513+emoji[man_superhero]=$'\U1F9B8\U200D\U2642\UFE0F'
1514+emoji[man_superhero_minimally]=$'\U1F9B8\U200D\U2642'
1515+emoji[superhero_man]=$'\U1F9B8\U200D\U2642'
1516+emoji[man_superhero_light_skin_tone]=$'\U1F9B8\U1F3FB\U200D\U2642\UFE0F'
1517+emoji[man_superhero_light_skin_tone_minimally]=$'\U1F9B8\U1F3FB\U200D\U2642'
1518+emoji[man_superhero_medium_light_skin_tone]=$'\U1F9B8\U1F3FC\U200D\U2642\UFE0F'
1519+emoji[man_superhero_medium_light_skin_tone_minimally]=$'\U1F9B8\U1F3FC\U200D\U2642'
1520+emoji[man_superhero_medium_skin_tone]=$'\U1F9B8\U1F3FD\U200D\U2642\UFE0F'
1521+emoji[man_superhero_medium_skin_tone_minimally]=$'\U1F9B8\U1F3FD\U200D\U2642'
1522+emoji[man_superhero_medium_dark_skin_tone]=$'\U1F9B8\U1F3FE\U200D\U2642\UFE0F'
1523+emoji[man_superhero_medium_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FE\U200D\U2642'
1524+emoji[man_superhero_dark_skin_tone]=$'\U1F9B8\U1F3FF\U200D\U2642\UFE0F'
1525+emoji[man_superhero_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FF\U200D\U2642'
1526+emoji[woman_superhero]=$'\U1F9B8\U200D\U2640\UFE0F'
1527+emoji[woman_superhero_minimally]=$'\U1F9B8\U200D\U2640'
1528+emoji[superhero_woman]=$'\U1F9B8\U200D\U2640'
1529+emoji[woman_superhero_light_skin_tone]=$'\U1F9B8\U1F3FB\U200D\U2640\UFE0F'
1530+emoji[woman_superhero_light_skin_tone_minimally]=$'\U1F9B8\U1F3FB\U200D\U2640'
1531+emoji[woman_superhero_medium_light_skin_tone]=$'\U1F9B8\U1F3FC\U200D\U2640\UFE0F'
1532+emoji[woman_superhero_medium_light_skin_tone_minimally]=$'\U1F9B8\U1F3FC\U200D\U2640'
1533+emoji[woman_superhero_medium_skin_tone]=$'\U1F9B8\U1F3FD\U200D\U2640\UFE0F'
1534+emoji[woman_superhero_medium_skin_tone_minimally]=$'\U1F9B8\U1F3FD\U200D\U2640'
1535+emoji[woman_superhero_medium_dark_skin_tone]=$'\U1F9B8\U1F3FE\U200D\U2640\UFE0F'
1536+emoji[woman_superhero_medium_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FE\U200D\U2640'
1537+emoji[woman_superhero_dark_skin_tone]=$'\U1F9B8\U1F3FF\U200D\U2640\UFE0F'
1538+emoji[woman_superhero_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FF\U200D\U2640'
1539+emoji[supervillain]=$'\U1F9B9'
1540+emoji[supervillain_light_skin_tone]=$'\U1F9B9\U1F3FB'
1541+emoji[supervillain_medium_light_skin_tone]=$'\U1F9B9\U1F3FC'
1542+emoji[supervillain_medium_skin_tone]=$'\U1F9B9\U1F3FD'
1543+emoji[supervillain_medium_dark_skin_tone]=$'\U1F9B9\U1F3FE'
1544+emoji[supervillain_dark_skin_tone]=$'\U1F9B9\U1F3FF'
1545+emoji[man_supervillain]=$'\U1F9B9\U200D\U2642\UFE0F'
1546+emoji[man_supervillain_minimally]=$'\U1F9B9\U200D\U2642'
1547+emoji[supervillain_man]=$'\U1F9B9\U200D\U2642'
1548+emoji[man_supervillain_light_skin_tone]=$'\U1F9B9\U1F3FB\U200D\U2642\UFE0F'
1549+emoji[man_supervillain_light_skin_tone_minimally]=$'\U1F9B9\U1F3FB\U200D\U2642'
1550+emoji[man_supervillain_medium_light_skin_tone]=$'\U1F9B9\U1F3FC\U200D\U2642\UFE0F'
1551+emoji[man_supervillain_medium_light_skin_tone_minimally]=$'\U1F9B9\U1F3FC\U200D\U2642'
1552+emoji[man_supervillain_medium_skin_tone]=$'\U1F9B9\U1F3FD\U200D\U2642\UFE0F'
1553+emoji[man_supervillain_medium_skin_tone_minimally]=$'\U1F9B9\U1F3FD\U200D\U2642'
1554+emoji[man_supervillain_medium_dark_skin_tone]=$'\U1F9B9\U1F3FE\U200D\U2642\UFE0F'
1555+emoji[man_supervillain_medium_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FE\U200D\U2642'
1556+emoji[man_supervillain_dark_skin_tone]=$'\U1F9B9\U1F3FF\U200D\U2642\UFE0F'
1557+emoji[man_supervillain_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FF\U200D\U2642'
1558+emoji[woman_supervillain]=$'\U1F9B9\U200D\U2640\UFE0F'
1559+emoji[woman_supervillain_minimally]=$'\U1F9B9\U200D\U2640'
1560+emoji[supervillain_woman]=$'\U1F9B9\U200D\U2640'
1561+emoji[woman_supervillain_light_skin_tone]=$'\U1F9B9\U1F3FB\U200D\U2640\UFE0F'
1562+emoji[woman_supervillain_light_skin_tone_minimally]=$'\U1F9B9\U1F3FB\U200D\U2640'
1563+emoji[woman_supervillain_medium_light_skin_tone]=$'\U1F9B9\U1F3FC\U200D\U2640\UFE0F'
1564+emoji[woman_supervillain_medium_light_skin_tone_minimally]=$'\U1F9B9\U1F3FC\U200D\U2640'
1565+emoji[woman_supervillain_medium_skin_tone]=$'\U1F9B9\U1F3FD\U200D\U2640\UFE0F'
1566+emoji[woman_supervillain_medium_skin_tone_minimally]=$'\U1F9B9\U1F3FD\U200D\U2640'
1567+emoji[woman_supervillain_medium_dark_skin_tone]=$'\U1F9B9\U1F3FE\U200D\U2640\UFE0F'
1568+emoji[woman_supervillain_medium_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FE\U200D\U2640'
1569+emoji[woman_supervillain_dark_skin_tone]=$'\U1F9B9\U1F3FF\U200D\U2640\UFE0F'
1570+emoji[woman_supervillain_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FF\U200D\U2640'
1571+emoji[mage]=$'\U1F9D9'
1572+emoji[mage_light_skin_tone]=$'\U1F9D9\U1F3FB'
1573+emoji[mage_medium_light_skin_tone]=$'\U1F9D9\U1F3FC'
1574+emoji[mage_medium_skin_tone]=$'\U1F9D9\U1F3FD'
1575+emoji[mage_medium_dark_skin_tone]=$'\U1F9D9\U1F3FE'
1576+emoji[mage_dark_skin_tone]=$'\U1F9D9\U1F3FF'
1577+emoji[man_mage]=$'\U1F9D9\U200D\U2642\UFE0F'
1578+emoji[man_mage_minimally]=$'\U1F9D9\U200D\U2642'
1579+emoji[mage_man]=$'\U1F9D9\U200D\U2642'
1580+emoji[man_mage_light_skin_tone]=$'\U1F9D9\U1F3FB\U200D\U2642\UFE0F'
1581+emoji[man_mage_light_skin_tone_minimally]=$'\U1F9D9\U1F3FB\U200D\U2642'
1582+emoji[man_mage_medium_light_skin_tone]=$'\U1F9D9\U1F3FC\U200D\U2642\UFE0F'
1583+emoji[man_mage_medium_light_skin_tone_minimally]=$'\U1F9D9\U1F3FC\U200D\U2642'
1584+emoji[man_mage_medium_skin_tone]=$'\U1F9D9\U1F3FD\U200D\U2642\UFE0F'
1585+emoji[man_mage_medium_skin_tone_minimally]=$'\U1F9D9\U1F3FD\U200D\U2642'
1586+emoji[man_mage_medium_dark_skin_tone]=$'\U1F9D9\U1F3FE\U200D\U2642\UFE0F'
1587+emoji[man_mage_medium_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FE\U200D\U2642'
1588+emoji[man_mage_dark_skin_tone]=$'\U1F9D9\U1F3FF\U200D\U2642\UFE0F'
1589+emoji[man_mage_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FF\U200D\U2642'
1590+emoji[woman_mage]=$'\U1F9D9\U200D\U2640\UFE0F'
1591+emoji[woman_mage_minimally]=$'\U1F9D9\U200D\U2640'
1592+emoji[mage_woman]=$'\U1F9D9\U200D\U2640'
1593+emoji[woman_mage_light_skin_tone]=$'\U1F9D9\U1F3FB\U200D\U2640\UFE0F'
1594+emoji[woman_mage_light_skin_tone_minimally]=$'\U1F9D9\U1F3FB\U200D\U2640'
1595+emoji[woman_mage_medium_light_skin_tone]=$'\U1F9D9\U1F3FC\U200D\U2640\UFE0F'
1596+emoji[woman_mage_medium_light_skin_tone_minimally]=$'\U1F9D9\U1F3FC\U200D\U2640'
1597+emoji[woman_mage_medium_skin_tone]=$'\U1F9D9\U1F3FD\U200D\U2640\UFE0F'
1598+emoji[woman_mage_medium_skin_tone_minimally]=$'\U1F9D9\U1F3FD\U200D\U2640'
1599+emoji[woman_mage_medium_dark_skin_tone]=$'\U1F9D9\U1F3FE\U200D\U2640\UFE0F'
1600+emoji[woman_mage_medium_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FE\U200D\U2640'
1601+emoji[woman_mage_dark_skin_tone]=$'\U1F9D9\U1F3FF\U200D\U2640\UFE0F'
1602+emoji[woman_mage_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FF\U200D\U2640'
1603+emoji[fairy]=$'\U1F9DA'
1604+emoji[fairy_light_skin_tone]=$'\U1F9DA\U1F3FB'
1605+emoji[fairy_medium_light_skin_tone]=$'\U1F9DA\U1F3FC'
1606+emoji[fairy_medium_skin_tone]=$'\U1F9DA\U1F3FD'
1607+emoji[fairy_medium_dark_skin_tone]=$'\U1F9DA\U1F3FE'
1608+emoji[fairy_dark_skin_tone]=$'\U1F9DA\U1F3FF'
1609+emoji[man_fairy]=$'\U1F9DA\U200D\U2642\UFE0F'
1610+emoji[man_fairy_minimally]=$'\U1F9DA\U200D\U2642'
1611+emoji[fairy_man]=$'\U1F9DA\U200D\U2642'
1612+emoji[man_fairy_light_skin_tone]=$'\U1F9DA\U1F3FB\U200D\U2642\UFE0F'
1613+emoji[man_fairy_light_skin_tone_minimally]=$'\U1F9DA\U1F3FB\U200D\U2642'
1614+emoji[man_fairy_medium_light_skin_tone]=$'\U1F9DA\U1F3FC\U200D\U2642\UFE0F'
1615+emoji[man_fairy_medium_light_skin_tone_minimally]=$'\U1F9DA\U1F3FC\U200D\U2642'
1616+emoji[man_fairy_medium_skin_tone]=$'\U1F9DA\U1F3FD\U200D\U2642\UFE0F'
1617+emoji[man_fairy_medium_skin_tone_minimally]=$'\U1F9DA\U1F3FD\U200D\U2642'
1618+emoji[man_fairy_medium_dark_skin_tone]=$'\U1F9DA\U1F3FE\U200D\U2642\UFE0F'
1619+emoji[man_fairy_medium_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FE\U200D\U2642'
1620+emoji[man_fairy_dark_skin_tone]=$'\U1F9DA\U1F3FF\U200D\U2642\UFE0F'
1621+emoji[man_fairy_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FF\U200D\U2642'
1622+emoji[woman_fairy]=$'\U1F9DA\U200D\U2640\UFE0F'
1623+emoji[woman_fairy_minimally]=$'\U1F9DA\U200D\U2640'
1624+emoji[fairy_woman]=$'\U1F9DA\U200D\U2640'
1625+emoji[woman_fairy_light_skin_tone]=$'\U1F9DA\U1F3FB\U200D\U2640\UFE0F'
1626+emoji[woman_fairy_light_skin_tone_minimally]=$'\U1F9DA\U1F3FB\U200D\U2640'
1627+emoji[woman_fairy_medium_light_skin_tone]=$'\U1F9DA\U1F3FC\U200D\U2640\UFE0F'
1628+emoji[woman_fairy_medium_light_skin_tone_minimally]=$'\U1F9DA\U1F3FC\U200D\U2640'
1629+emoji[woman_fairy_medium_skin_tone]=$'\U1F9DA\U1F3FD\U200D\U2640\UFE0F'
1630+emoji[woman_fairy_medium_skin_tone_minimally]=$'\U1F9DA\U1F3FD\U200D\U2640'
1631+emoji[woman_fairy_medium_dark_skin_tone]=$'\U1F9DA\U1F3FE\U200D\U2640\UFE0F'
1632+emoji[woman_fairy_medium_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FE\U200D\U2640'
1633+emoji[woman_fairy_dark_skin_tone]=$'\U1F9DA\U1F3FF\U200D\U2640\UFE0F'
1634+emoji[woman_fairy_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FF\U200D\U2640'
1635+emoji[vampire]=$'\U1F9DB'
1636+emoji[vampire_light_skin_tone]=$'\U1F9DB\U1F3FB'
1637+emoji[vampire_medium_light_skin_tone]=$'\U1F9DB\U1F3FC'
1638+emoji[vampire_medium_skin_tone]=$'\U1F9DB\U1F3FD'
1639+emoji[vampire_medium_dark_skin_tone]=$'\U1F9DB\U1F3FE'
1640+emoji[vampire_dark_skin_tone]=$'\U1F9DB\U1F3FF'
1641+emoji[man_vampire]=$'\U1F9DB\U200D\U2642\UFE0F'
1642+emoji[man_vampire_minimally]=$'\U1F9DB\U200D\U2642'
1643+emoji[vampire_man]=$'\U1F9DB\U200D\U2642'
1644+emoji[man_vampire_light_skin_tone]=$'\U1F9DB\U1F3FB\U200D\U2642\UFE0F'
1645+emoji[man_vampire_light_skin_tone_minimally]=$'\U1F9DB\U1F3FB\U200D\U2642'
1646+emoji[man_vampire_medium_light_skin_tone]=$'\U1F9DB\U1F3FC\U200D\U2642\UFE0F'
1647+emoji[man_vampire_medium_light_skin_tone_minimally]=$'\U1F9DB\U1F3FC\U200D\U2642'
1648+emoji[man_vampire_medium_skin_tone]=$'\U1F9DB\U1F3FD\U200D\U2642\UFE0F'
1649+emoji[man_vampire_medium_skin_tone_minimally]=$'\U1F9DB\U1F3FD\U200D\U2642'
1650+emoji[man_vampire_medium_dark_skin_tone]=$'\U1F9DB\U1F3FE\U200D\U2642\UFE0F'
1651+emoji[man_vampire_medium_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FE\U200D\U2642'
1652+emoji[man_vampire_dark_skin_tone]=$'\U1F9DB\U1F3FF\U200D\U2642\UFE0F'
1653+emoji[man_vampire_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FF\U200D\U2642'
1654+emoji[woman_vampire]=$'\U1F9DB\U200D\U2640\UFE0F'
1655+emoji[woman_vampire_minimally]=$'\U1F9DB\U200D\U2640'
1656+emoji[vampire_woman]=$'\U1F9DB\U200D\U2640'
1657+emoji[woman_vampire_light_skin_tone]=$'\U1F9DB\U1F3FB\U200D\U2640\UFE0F'
1658+emoji[woman_vampire_light_skin_tone_minimally]=$'\U1F9DB\U1F3FB\U200D\U2640'
1659+emoji[woman_vampire_medium_light_skin_tone]=$'\U1F9DB\U1F3FC\U200D\U2640\UFE0F'
1660+emoji[woman_vampire_medium_light_skin_tone_minimally]=$'\U1F9DB\U1F3FC\U200D\U2640'
1661+emoji[woman_vampire_medium_skin_tone]=$'\U1F9DB\U1F3FD\U200D\U2640\UFE0F'
1662+emoji[woman_vampire_medium_skin_tone_minimally]=$'\U1F9DB\U1F3FD\U200D\U2640'
1663+emoji[woman_vampire_medium_dark_skin_tone]=$'\U1F9DB\U1F3FE\U200D\U2640\UFE0F'
1664+emoji[woman_vampire_medium_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FE\U200D\U2640'
1665+emoji[woman_vampire_dark_skin_tone]=$'\U1F9DB\U1F3FF\U200D\U2640\UFE0F'
1666+emoji[woman_vampire_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FF\U200D\U2640'
1667+emoji[merperson]=$'\U1F9DC'
1668+emoji[merperson_light_skin_tone]=$'\U1F9DC\U1F3FB'
1669+emoji[merperson_medium_light_skin_tone]=$'\U1F9DC\U1F3FC'
1670+emoji[merperson_medium_skin_tone]=$'\U1F9DC\U1F3FD'
1671+emoji[merperson_medium_dark_skin_tone]=$'\U1F9DC\U1F3FE'
1672+emoji[merperson_dark_skin_tone]=$'\U1F9DC\U1F3FF'
1673+emoji[merman]=$'\U1F9DC\U200D\U2642\UFE0F'
1674+emoji[merman_minimally]=$'\U1F9DC\U200D\U2642'
1675+emoji[merman_light_skin_tone]=$'\U1F9DC\U1F3FB\U200D\U2642\UFE0F'
1676+emoji[merman_light_skin_tone_minimally]=$'\U1F9DC\U1F3FB\U200D\U2642'
1677+emoji[merman_medium_light_skin_tone]=$'\U1F9DC\U1F3FC\U200D\U2642\UFE0F'
1678+emoji[merman_medium_light_skin_tone_minimally]=$'\U1F9DC\U1F3FC\U200D\U2642'
1679+emoji[merman_medium_skin_tone]=$'\U1F9DC\U1F3FD\U200D\U2642\UFE0F'
1680+emoji[merman_medium_skin_tone_minimally]=$'\U1F9DC\U1F3FD\U200D\U2642'
1681+emoji[merman_medium_dark_skin_tone]=$'\U1F9DC\U1F3FE\U200D\U2642\UFE0F'
1682+emoji[merman_medium_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FE\U200D\U2642'
1683+emoji[merman_dark_skin_tone]=$'\U1F9DC\U1F3FF\U200D\U2642\UFE0F'
1684+emoji[merman_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FF\U200D\U2642'
1685+emoji[mermaid]=$'\U1F9DC\U200D\U2640\UFE0F'
1686+emoji[mermaid_minimally]=$'\U1F9DC\U200D\U2640'
1687+emoji[mermaid_light_skin_tone]=$'\U1F9DC\U1F3FB\U200D\U2640\UFE0F'
1688+emoji[mermaid_light_skin_tone_minimally]=$'\U1F9DC\U1F3FB\U200D\U2640'
1689+emoji[mermaid_medium_light_skin_tone]=$'\U1F9DC\U1F3FC\U200D\U2640\UFE0F'
1690+emoji[mermaid_medium_light_skin_tone_minimally]=$'\U1F9DC\U1F3FC\U200D\U2640'
1691+emoji[mermaid_medium_skin_tone]=$'\U1F9DC\U1F3FD\U200D\U2640\UFE0F'
1692+emoji[mermaid_medium_skin_tone_minimally]=$'\U1F9DC\U1F3FD\U200D\U2640'
1693+emoji[mermaid_medium_dark_skin_tone]=$'\U1F9DC\U1F3FE\U200D\U2640\UFE0F'
1694+emoji[mermaid_medium_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FE\U200D\U2640'
1695+emoji[mermaid_dark_skin_tone]=$'\U1F9DC\U1F3FF\U200D\U2640\UFE0F'
1696+emoji[mermaid_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FF\U200D\U2640'
1697+emoji[elf]=$'\U1F9DD'
1698+emoji[elf_light_skin_tone]=$'\U1F9DD\U1F3FB'
1699+emoji[elf_medium_light_skin_tone]=$'\U1F9DD\U1F3FC'
1700+emoji[elf_medium_skin_tone]=$'\U1F9DD\U1F3FD'
1701+emoji[elf_medium_dark_skin_tone]=$'\U1F9DD\U1F3FE'
1702+emoji[elf_dark_skin_tone]=$'\U1F9DD\U1F3FF'
1703+emoji[man_elf]=$'\U1F9DD\U200D\U2642\UFE0F'
1704+emoji[man_elf_minimally]=$'\U1F9DD\U200D\U2642'
1705+emoji[elf_man]=$'\U1F9DD\U200D\U2642'
1706+emoji[man_elf_light_skin_tone]=$'\U1F9DD\U1F3FB\U200D\U2642\UFE0F'
1707+emoji[man_elf_light_skin_tone_minimally]=$'\U1F9DD\U1F3FB\U200D\U2642'
1708+emoji[man_elf_medium_light_skin_tone]=$'\U1F9DD\U1F3FC\U200D\U2642\UFE0F'
1709+emoji[man_elf_medium_light_skin_tone_minimally]=$'\U1F9DD\U1F3FC\U200D\U2642'
1710+emoji[man_elf_medium_skin_tone]=$'\U1F9DD\U1F3FD\U200D\U2642\UFE0F'
1711+emoji[man_elf_medium_skin_tone_minimally]=$'\U1F9DD\U1F3FD\U200D\U2642'
1712+emoji[man_elf_medium_dark_skin_tone]=$'\U1F9DD\U1F3FE\U200D\U2642\UFE0F'
1713+emoji[man_elf_medium_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FE\U200D\U2642'
1714+emoji[man_elf_dark_skin_tone]=$'\U1F9DD\U1F3FF\U200D\U2642\UFE0F'
1715+emoji[man_elf_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FF\U200D\U2642'
1716+emoji[woman_elf]=$'\U1F9DD\U200D\U2640\UFE0F'
1717+emoji[woman_elf_minimally]=$'\U1F9DD\U200D\U2640'
1718+emoji[elf_woman]=$'\U1F9DD\U200D\U2640'
1719+emoji[woman_elf_light_skin_tone]=$'\U1F9DD\U1F3FB\U200D\U2640\UFE0F'
1720+emoji[woman_elf_light_skin_tone_minimally]=$'\U1F9DD\U1F3FB\U200D\U2640'
1721+emoji[woman_elf_medium_light_skin_tone]=$'\U1F9DD\U1F3FC\U200D\U2640\UFE0F'
1722+emoji[woman_elf_medium_light_skin_tone_minimally]=$'\U1F9DD\U1F3FC\U200D\U2640'
1723+emoji[woman_elf_medium_skin_tone]=$'\U1F9DD\U1F3FD\U200D\U2640\UFE0F'
1724+emoji[woman_elf_medium_skin_tone_minimally]=$'\U1F9DD\U1F3FD\U200D\U2640'
1725+emoji[woman_elf_medium_dark_skin_tone]=$'\U1F9DD\U1F3FE\U200D\U2640\UFE0F'
1726+emoji[woman_elf_medium_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FE\U200D\U2640'
1727+emoji[woman_elf_dark_skin_tone]=$'\U1F9DD\U1F3FF\U200D\U2640\UFE0F'
1728+emoji[woman_elf_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FF\U200D\U2640'
1729+emoji[genie]=$'\U1F9DE'
1730+emoji[man_genie]=$'\U1F9DE\U200D\U2642\UFE0F'
1731+emoji[man_genie_minimally]=$'\U1F9DE\U200D\U2642'
1732+emoji[genie_man]=$'\U1F9DE\U200D\U2642'
1733+emoji[woman_genie]=$'\U1F9DE\U200D\U2640\UFE0F'
1734+emoji[woman_genie_minimally]=$'\U1F9DE\U200D\U2640'
1735+emoji[genie_woman]=$'\U1F9DE\U200D\U2640'
1736+emoji[zombie]=$'\U1F9DF'
1737+emoji[man_zombie]=$'\U1F9DF\U200D\U2642\UFE0F'
1738+emoji[man_zombie_minimally]=$'\U1F9DF\U200D\U2642'
1739+emoji[zombie_man]=$'\U1F9DF\U200D\U2642'
1740+emoji[woman_zombie]=$'\U1F9DF\U200D\U2640\UFE0F'
1741+emoji[woman_zombie_minimally]=$'\U1F9DF\U200D\U2640'
1742+emoji[zombie_woman]=$'\U1F9DF\U200D\U2640'
1743+emoji[person_getting_massage]=$'\U1F486'
1744+emoji[massage]=$'\U1F486'
1745+emoji[person_getting_massage_light_skin_tone]=$'\U1F486\U1F3FB'
1746+emoji[person_getting_massage_medium_light_skin_tone]=$'\U1F486\U1F3FC'
1747+emoji[person_getting_massage_medium_skin_tone]=$'\U1F486\U1F3FD'
1748+emoji[person_getting_massage_medium_dark_skin_tone]=$'\U1F486\U1F3FE'
1749+emoji[person_getting_massage_dark_skin_tone]=$'\U1F486\U1F3FF'
1750+emoji[man_getting_massage]=$'\U1F486\U200D\U2642\UFE0F'
1751+emoji[man_getting_massage_minimally]=$'\U1F486\U200D\U2642'
1752+emoji[massage_man]=$'\U1F486\U200D\U2642'
1753+emoji[man_getting_massage_light_skin_tone]=$'\U1F486\U1F3FB\U200D\U2642\UFE0F'
1754+emoji[man_getting_massage_light_skin_tone_minimally]=$'\U1F486\U1F3FB\U200D\U2642'
1755+emoji[man_getting_massage_medium_light_skin_tone]=$'\U1F486\U1F3FC\U200D\U2642\UFE0F'
1756+emoji[man_getting_massage_medium_light_skin_tone_minimally]=$'\U1F486\U1F3FC\U200D\U2642'
1757+emoji[man_getting_massage_medium_skin_tone]=$'\U1F486\U1F3FD\U200D\U2642\UFE0F'
1758+emoji[man_getting_massage_medium_skin_tone_minimally]=$'\U1F486\U1F3FD\U200D\U2642'
1759+emoji[man_getting_massage_medium_dark_skin_tone]=$'\U1F486\U1F3FE\U200D\U2642\UFE0F'
1760+emoji[man_getting_massage_medium_dark_skin_tone_minimally]=$'\U1F486\U1F3FE\U200D\U2642'
1761+emoji[man_getting_massage_dark_skin_tone]=$'\U1F486\U1F3FF\U200D\U2642\UFE0F'
1762+emoji[man_getting_massage_dark_skin_tone_minimally]=$'\U1F486\U1F3FF\U200D\U2642'
1763+emoji[woman_getting_massage]=$'\U1F486\U200D\U2640\UFE0F'
1764+emoji[woman_getting_massage_minimally]=$'\U1F486\U200D\U2640'
1765+emoji[massage_woman]=$'\U1F486\U200D\U2640'
1766+emoji[woman_getting_massage_light_skin_tone]=$'\U1F486\U1F3FB\U200D\U2640\UFE0F'
1767+emoji[woman_getting_massage_light_skin_tone_minimally]=$'\U1F486\U1F3FB\U200D\U2640'
1768+emoji[woman_getting_massage_medium_light_skin_tone]=$'\U1F486\U1F3FC\U200D\U2640\UFE0F'
1769+emoji[woman_getting_massage_medium_light_skin_tone_minimally]=$'\U1F486\U1F3FC\U200D\U2640'
1770+emoji[woman_getting_massage_medium_skin_tone]=$'\U1F486\U1F3FD\U200D\U2640\UFE0F'
1771+emoji[woman_getting_massage_medium_skin_tone_minimally]=$'\U1F486\U1F3FD\U200D\U2640'
1772+emoji[woman_getting_massage_medium_dark_skin_tone]=$'\U1F486\U1F3FE\U200D\U2640\UFE0F'
1773+emoji[woman_getting_massage_medium_dark_skin_tone_minimally]=$'\U1F486\U1F3FE\U200D\U2640'
1774+emoji[woman_getting_massage_dark_skin_tone]=$'\U1F486\U1F3FF\U200D\U2640\UFE0F'
1775+emoji[woman_getting_massage_dark_skin_tone_minimally]=$'\U1F486\U1F3FF\U200D\U2640'
1776+emoji[person_getting_haircut]=$'\U1F487'
1777+emoji[haircut]=$'\U1F487'
1778+emoji[person_getting_haircut_light_skin_tone]=$'\U1F487\U1F3FB'
1779+emoji[person_getting_haircut_medium_light_skin_tone]=$'\U1F487\U1F3FC'
1780+emoji[person_getting_haircut_medium_skin_tone]=$'\U1F487\U1F3FD'
1781+emoji[person_getting_haircut_medium_dark_skin_tone]=$'\U1F487\U1F3FE'
1782+emoji[person_getting_haircut_dark_skin_tone]=$'\U1F487\U1F3FF'
1783+emoji[man_getting_haircut]=$'\U1F487\U200D\U2642\UFE0F'
1784+emoji[man_getting_haircut_minimally]=$'\U1F487\U200D\U2642'
1785+emoji[haircut_man]=$'\U1F487\U200D\U2642'
1786+emoji[man_getting_haircut_light_skin_tone]=$'\U1F487\U1F3FB\U200D\U2642\UFE0F'
1787+emoji[man_getting_haircut_light_skin_tone_minimally]=$'\U1F487\U1F3FB\U200D\U2642'
1788+emoji[man_getting_haircut_medium_light_skin_tone]=$'\U1F487\U1F3FC\U200D\U2642\UFE0F'
1789+emoji[man_getting_haircut_medium_light_skin_tone_minimally]=$'\U1F487\U1F3FC\U200D\U2642'
1790+emoji[man_getting_haircut_medium_skin_tone]=$'\U1F487\U1F3FD\U200D\U2642\UFE0F'
1791+emoji[man_getting_haircut_medium_skin_tone_minimally]=$'\U1F487\U1F3FD\U200D\U2642'
1792+emoji[man_getting_haircut_medium_dark_skin_tone]=$'\U1F487\U1F3FE\U200D\U2642\UFE0F'
1793+emoji[man_getting_haircut_medium_dark_skin_tone_minimally]=$'\U1F487\U1F3FE\U200D\U2642'
1794+emoji[man_getting_haircut_dark_skin_tone]=$'\U1F487\U1F3FF\U200D\U2642\UFE0F'
1795+emoji[man_getting_haircut_dark_skin_tone_minimally]=$'\U1F487\U1F3FF\U200D\U2642'
1796+emoji[woman_getting_haircut]=$'\U1F487\U200D\U2640\UFE0F'
1797+emoji[woman_getting_haircut_minimally]=$'\U1F487\U200D\U2640'
1798+emoji[haircut_woman]=$'\U1F487\U200D\U2640'
1799+emoji[woman_getting_haircut_light_skin_tone]=$'\U1F487\U1F3FB\U200D\U2640\UFE0F'
1800+emoji[woman_getting_haircut_light_skin_tone_minimally]=$'\U1F487\U1F3FB\U200D\U2640'
1801+emoji[woman_getting_haircut_medium_light_skin_tone]=$'\U1F487\U1F3FC\U200D\U2640\UFE0F'
1802+emoji[woman_getting_haircut_medium_light_skin_tone_minimally]=$'\U1F487\U1F3FC\U200D\U2640'
1803+emoji[woman_getting_haircut_medium_skin_tone]=$'\U1F487\U1F3FD\U200D\U2640\UFE0F'
1804+emoji[woman_getting_haircut_medium_skin_tone_minimally]=$'\U1F487\U1F3FD\U200D\U2640'
1805+emoji[woman_getting_haircut_medium_dark_skin_tone]=$'\U1F487\U1F3FE\U200D\U2640\UFE0F'
1806+emoji[woman_getting_haircut_medium_dark_skin_tone_minimally]=$'\U1F487\U1F3FE\U200D\U2640'
1807+emoji[woman_getting_haircut_dark_skin_tone]=$'\U1F487\U1F3FF\U200D\U2640\UFE0F'
1808+emoji[woman_getting_haircut_dark_skin_tone_minimally]=$'\U1F487\U1F3FF\U200D\U2640'
1809+emoji[person_walking]=$'\U1F6B6'
1810+emoji[walking]=$'\U1F6B6'
1811+emoji[person_walking_light_skin_tone]=$'\U1F6B6\U1F3FB'
1812+emoji[person_walking_medium_light_skin_tone]=$'\U1F6B6\U1F3FC'
1813+emoji[person_walking_medium_skin_tone]=$'\U1F6B6\U1F3FD'
1814+emoji[person_walking_medium_dark_skin_tone]=$'\U1F6B6\U1F3FE'
1815+emoji[person_walking_dark_skin_tone]=$'\U1F6B6\U1F3FF'
1816+emoji[man_walking]=$'\U1F6B6\U200D\U2642\UFE0F'
1817+emoji[man_walking_minimally]=$'\U1F6B6\U200D\U2642'
1818+emoji[walking_man]=$'\U1F6B6\U200D\U2642'
1819+emoji[man_walking_light_skin_tone]=$'\U1F6B6\U1F3FB\U200D\U2642\UFE0F'
1820+emoji[man_walking_light_skin_tone_minimally]=$'\U1F6B6\U1F3FB\U200D\U2642'
1821+emoji[man_walking_medium_light_skin_tone]=$'\U1F6B6\U1F3FC\U200D\U2642\UFE0F'
1822+emoji[man_walking_medium_light_skin_tone_minimally]=$'\U1F6B6\U1F3FC\U200D\U2642'
1823+emoji[man_walking_medium_skin_tone]=$'\U1F6B6\U1F3FD\U200D\U2642\UFE0F'
1824+emoji[man_walking_medium_skin_tone_minimally]=$'\U1F6B6\U1F3FD\U200D\U2642'
1825+emoji[man_walking_medium_dark_skin_tone]=$'\U1F6B6\U1F3FE\U200D\U2642\UFE0F'
1826+emoji[man_walking_medium_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FE\U200D\U2642'
1827+emoji[man_walking_dark_skin_tone]=$'\U1F6B6\U1F3FF\U200D\U2642\UFE0F'
1828+emoji[man_walking_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FF\U200D\U2642'
1829+emoji[woman_walking]=$'\U1F6B6\U200D\U2640\UFE0F'
1830+emoji[woman_walking_minimally]=$'\U1F6B6\U200D\U2640'
1831+emoji[walking_woman]=$'\U1F6B6\U200D\U2640'
1832+emoji[woman_walking_light_skin_tone]=$'\U1F6B6\U1F3FB\U200D\U2640\UFE0F'
1833+emoji[woman_walking_light_skin_tone_minimally]=$'\U1F6B6\U1F3FB\U200D\U2640'
1834+emoji[woman_walking_medium_light_skin_tone]=$'\U1F6B6\U1F3FC\U200D\U2640\UFE0F'
1835+emoji[woman_walking_medium_light_skin_tone_minimally]=$'\U1F6B6\U1F3FC\U200D\U2640'
1836+emoji[woman_walking_medium_skin_tone]=$'\U1F6B6\U1F3FD\U200D\U2640\UFE0F'
1837+emoji[woman_walking_medium_skin_tone_minimally]=$'\U1F6B6\U1F3FD\U200D\U2640'
1838+emoji[woman_walking_medium_dark_skin_tone]=$'\U1F6B6\U1F3FE\U200D\U2640\UFE0F'
1839+emoji[woman_walking_medium_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FE\U200D\U2640'
1840+emoji[woman_walking_dark_skin_tone]=$'\U1F6B6\U1F3FF\U200D\U2640\UFE0F'
1841+emoji[woman_walking_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FF\U200D\U2640'
1842+emoji[person_standing]=$'\U1F9CD'
1843+emoji[standing_person]=$'\U1F9CD'
1844+emoji[person_standing_light_skin_tone]=$'\U1F9CD\U1F3FB'
1845+emoji[person_standing_medium_light_skin_tone]=$'\U1F9CD\U1F3FC'
1846+emoji[person_standing_medium_skin_tone]=$'\U1F9CD\U1F3FD'
1847+emoji[person_standing_medium_dark_skin_tone]=$'\U1F9CD\U1F3FE'
1848+emoji[person_standing_dark_skin_tone]=$'\U1F9CD\U1F3FF'
1849+emoji[man_standing]=$'\U1F9CD\U200D\U2642\UFE0F'
1850+emoji[man_standing_minimally]=$'\U1F9CD\U200D\U2642'
1851+emoji[standing_man]=$'\U1F9CD\U200D\U2642'
1852+emoji[man_standing_light_skin_tone]=$'\U1F9CD\U1F3FB\U200D\U2642\UFE0F'
1853+emoji[man_standing_light_skin_tone_minimally]=$'\U1F9CD\U1F3FB\U200D\U2642'
1854+emoji[man_standing_medium_light_skin_tone]=$'\U1F9CD\U1F3FC\U200D\U2642\UFE0F'
1855+emoji[man_standing_medium_light_skin_tone_minimally]=$'\U1F9CD\U1F3FC\U200D\U2642'
1856+emoji[man_standing_medium_skin_tone]=$'\U1F9CD\U1F3FD\U200D\U2642\UFE0F'
1857+emoji[man_standing_medium_skin_tone_minimally]=$'\U1F9CD\U1F3FD\U200D\U2642'
1858+emoji[man_standing_medium_dark_skin_tone]=$'\U1F9CD\U1F3FE\U200D\U2642\UFE0F'
1859+emoji[man_standing_medium_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FE\U200D\U2642'
1860+emoji[man_standing_dark_skin_tone]=$'\U1F9CD\U1F3FF\U200D\U2642\UFE0F'
1861+emoji[man_standing_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FF\U200D\U2642'
1862+emoji[woman_standing]=$'\U1F9CD\U200D\U2640\UFE0F'
1863+emoji[woman_standing_minimally]=$'\U1F9CD\U200D\U2640'
1864+emoji[standing_woman]=$'\U1F9CD\U200D\U2640'
1865+emoji[woman_standing_light_skin_tone]=$'\U1F9CD\U1F3FB\U200D\U2640\UFE0F'
1866+emoji[woman_standing_light_skin_tone_minimally]=$'\U1F9CD\U1F3FB\U200D\U2640'
1867+emoji[woman_standing_medium_light_skin_tone]=$'\U1F9CD\U1F3FC\U200D\U2640\UFE0F'
1868+emoji[woman_standing_medium_light_skin_tone_minimally]=$'\U1F9CD\U1F3FC\U200D\U2640'
1869+emoji[woman_standing_medium_skin_tone]=$'\U1F9CD\U1F3FD\U200D\U2640\UFE0F'
1870+emoji[woman_standing_medium_skin_tone_minimally]=$'\U1F9CD\U1F3FD\U200D\U2640'
1871+emoji[woman_standing_medium_dark_skin_tone]=$'\U1F9CD\U1F3FE\U200D\U2640\UFE0F'
1872+emoji[woman_standing_medium_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FE\U200D\U2640'
1873+emoji[woman_standing_dark_skin_tone]=$'\U1F9CD\U1F3FF\U200D\U2640\UFE0F'
1874+emoji[woman_standing_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FF\U200D\U2640'
1875+emoji[person_kneeling]=$'\U1F9CE'
1876+emoji[kneeling_person]=$'\U1F9CE'
1877+emoji[person_kneeling_light_skin_tone]=$'\U1F9CE\U1F3FB'
1878+emoji[person_kneeling_medium_light_skin_tone]=$'\U1F9CE\U1F3FC'
1879+emoji[person_kneeling_medium_skin_tone]=$'\U1F9CE\U1F3FD'
1880+emoji[person_kneeling_medium_dark_skin_tone]=$'\U1F9CE\U1F3FE'
1881+emoji[person_kneeling_dark_skin_tone]=$'\U1F9CE\U1F3FF'
1882+emoji[man_kneeling]=$'\U1F9CE\U200D\U2642\UFE0F'
1883+emoji[man_kneeling_minimally]=$'\U1F9CE\U200D\U2642'
1884+emoji[kneeling_man]=$'\U1F9CE\U200D\U2642'
1885+emoji[man_kneeling_light_skin_tone]=$'\U1F9CE\U1F3FB\U200D\U2642\UFE0F'
1886+emoji[man_kneeling_light_skin_tone_minimally]=$'\U1F9CE\U1F3FB\U200D\U2642'
1887+emoji[man_kneeling_medium_light_skin_tone]=$'\U1F9CE\U1F3FC\U200D\U2642\UFE0F'
1888+emoji[man_kneeling_medium_light_skin_tone_minimally]=$'\U1F9CE\U1F3FC\U200D\U2642'
1889+emoji[man_kneeling_medium_skin_tone]=$'\U1F9CE\U1F3FD\U200D\U2642\UFE0F'
1890+emoji[man_kneeling_medium_skin_tone_minimally]=$'\U1F9CE\U1F3FD\U200D\U2642'
1891+emoji[man_kneeling_medium_dark_skin_tone]=$'\U1F9CE\U1F3FE\U200D\U2642\UFE0F'
1892+emoji[man_kneeling_medium_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FE\U200D\U2642'
1893+emoji[man_kneeling_dark_skin_tone]=$'\U1F9CE\U1F3FF\U200D\U2642\UFE0F'
1894+emoji[man_kneeling_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FF\U200D\U2642'
1895+emoji[woman_kneeling]=$'\U1F9CE\U200D\U2640\UFE0F'
1896+emoji[woman_kneeling_minimally]=$'\U1F9CE\U200D\U2640'
1897+emoji[kneeling_woman]=$'\U1F9CE\U200D\U2640'
1898+emoji[woman_kneeling_light_skin_tone]=$'\U1F9CE\U1F3FB\U200D\U2640\UFE0F'
1899+emoji[woman_kneeling_light_skin_tone_minimally]=$'\U1F9CE\U1F3FB\U200D\U2640'
1900+emoji[woman_kneeling_medium_light_skin_tone]=$'\U1F9CE\U1F3FC\U200D\U2640\UFE0F'
1901+emoji[woman_kneeling_medium_light_skin_tone_minimally]=$'\U1F9CE\U1F3FC\U200D\U2640'
1902+emoji[woman_kneeling_medium_skin_tone]=$'\U1F9CE\U1F3FD\U200D\U2640\UFE0F'
1903+emoji[woman_kneeling_medium_skin_tone_minimally]=$'\U1F9CE\U1F3FD\U200D\U2640'
1904+emoji[woman_kneeling_medium_dark_skin_tone]=$'\U1F9CE\U1F3FE\U200D\U2640\UFE0F'
1905+emoji[woman_kneeling_medium_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FE\U200D\U2640'
1906+emoji[woman_kneeling_dark_skin_tone]=$'\U1F9CE\U1F3FF\U200D\U2640\UFE0F'
1907+emoji[woman_kneeling_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FF\U200D\U2640'
1908+emoji[man_with_probing_cane]=$'\U1F468\U200D\U1F9AF'
1909+emoji[man_with_probing_cane_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F9AF'
1910+emoji[man_with_probing_cane_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F9AF'
1911+emoji[man_with_probing_cane_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F9AF'
1912+emoji[man_with_probing_cane_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F9AF'
1913+emoji[man_with_probing_cane_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F9AF'
1914+emoji[woman_with_probing_cane]=$'\U1F469\U200D\U1F9AF'
1915+emoji[woman_with_probing_cane_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F9AF'
1916+emoji[woman_with_probing_cane_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F9AF'
1917+emoji[woman_with_probing_cane_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F9AF'
1918+emoji[woman_with_probing_cane_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F9AF'
1919+emoji[woman_with_probing_cane_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F9AF'
1920+emoji[man_in_motorized_wheelchair]=$'\U1F468\U200D\U1F9BC'
1921+emoji[man_in_motorized_wheelchair_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F9BC'
1922+emoji[man_in_motorized_wheelchair_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F9BC'
1923+emoji[man_in_motorized_wheelchair_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F9BC'
1924+emoji[man_in_motorized_wheelchair_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F9BC'
1925+emoji[man_in_motorized_wheelchair_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F9BC'
1926+emoji[woman_in_motorized_wheelchair]=$'\U1F469\U200D\U1F9BC'
1927+emoji[woman_in_motorized_wheelchair_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F9BC'
1928+emoji[woman_in_motorized_wheelchair_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F9BC'
1929+emoji[woman_in_motorized_wheelchair_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F9BC'
1930+emoji[woman_in_motorized_wheelchair_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F9BC'
1931+emoji[woman_in_motorized_wheelchair_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F9BC'
1932+emoji[man_in_manual_wheelchair]=$'\U1F468\U200D\U1F9BD'
1933+emoji[man_in_manual_wheelchair_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F9BD'
1934+emoji[man_in_manual_wheelchair_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F9BD'
1935+emoji[man_in_manual_wheelchair_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F9BD'
1936+emoji[man_in_manual_wheelchair_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F9BD'
1937+emoji[man_in_manual_wheelchair_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F9BD'
1938+emoji[woman_in_manual_wheelchair]=$'\U1F469\U200D\U1F9BD'
1939+emoji[woman_in_manual_wheelchair_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F9BD'
1940+emoji[woman_in_manual_wheelchair_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F9BD'
1941+emoji[woman_in_manual_wheelchair_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F9BD'
1942+emoji[woman_in_manual_wheelchair_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F9BD'
1943+emoji[woman_in_manual_wheelchair_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F9BD'
1944+emoji[person_running]=$'\U1F3C3'
1945+emoji[runner]=$'\U1F3C3'
1946+emoji[running]=$'\U1F3C3'
1947+emoji[person_running_light_skin_tone]=$'\U1F3C3\U1F3FB'
1948+emoji[person_running_medium_light_skin_tone]=$'\U1F3C3\U1F3FC'
1949+emoji[person_running_medium_skin_tone]=$'\U1F3C3\U1F3FD'
1950+emoji[person_running_medium_dark_skin_tone]=$'\U1F3C3\U1F3FE'
1951+emoji[person_running_dark_skin_tone]=$'\U1F3C3\U1F3FF'
1952+emoji[man_running]=$'\U1F3C3\U200D\U2642\UFE0F'
1953+emoji[man_running_minimally]=$'\U1F3C3\U200D\U2642'
1954+emoji[running_man]=$'\U1F3C3\U200D\U2642'
1955+emoji[man_running_light_skin_tone]=$'\U1F3C3\U1F3FB\U200D\U2642\UFE0F'
1956+emoji[man_running_light_skin_tone_minimally]=$'\U1F3C3\U1F3FB\U200D\U2642'
1957+emoji[man_running_medium_light_skin_tone]=$'\U1F3C3\U1F3FC\U200D\U2642\UFE0F'
1958+emoji[man_running_medium_light_skin_tone_minimally]=$'\U1F3C3\U1F3FC\U200D\U2642'
1959+emoji[man_running_medium_skin_tone]=$'\U1F3C3\U1F3FD\U200D\U2642\UFE0F'
1960+emoji[man_running_medium_skin_tone_minimally]=$'\U1F3C3\U1F3FD\U200D\U2642'
1961+emoji[man_running_medium_dark_skin_tone]=$'\U1F3C3\U1F3FE\U200D\U2642\UFE0F'
1962+emoji[man_running_medium_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FE\U200D\U2642'
1963+emoji[man_running_dark_skin_tone]=$'\U1F3C3\U1F3FF\U200D\U2642\UFE0F'
1964+emoji[man_running_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FF\U200D\U2642'
1965+emoji[woman_running]=$'\U1F3C3\U200D\U2640\UFE0F'
1966+emoji[woman_running_minimally]=$'\U1F3C3\U200D\U2640'
1967+emoji[running_woman]=$'\U1F3C3\U200D\U2640'
1968+emoji[woman_running_light_skin_tone]=$'\U1F3C3\U1F3FB\U200D\U2640\UFE0F'
1969+emoji[woman_running_light_skin_tone_minimally]=$'\U1F3C3\U1F3FB\U200D\U2640'
1970+emoji[woman_running_medium_light_skin_tone]=$'\U1F3C3\U1F3FC\U200D\U2640\UFE0F'
1971+emoji[woman_running_medium_light_skin_tone_minimally]=$'\U1F3C3\U1F3FC\U200D\U2640'
1972+emoji[woman_running_medium_skin_tone]=$'\U1F3C3\U1F3FD\U200D\U2640\UFE0F'
1973+emoji[woman_running_medium_skin_tone_minimally]=$'\U1F3C3\U1F3FD\U200D\U2640'
1974+emoji[woman_running_medium_dark_skin_tone]=$'\U1F3C3\U1F3FE\U200D\U2640\UFE0F'
1975+emoji[woman_running_medium_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FE\U200D\U2640'
1976+emoji[woman_running_dark_skin_tone]=$'\U1F3C3\U1F3FF\U200D\U2640\UFE0F'
1977+emoji[woman_running_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FF\U200D\U2640'
1978+emoji[woman_dancing]=$'\U1F483'
1979+emoji[dancer]=$'\U1F483'
1980+emoji[woman_dancing_light_skin_tone]=$'\U1F483\U1F3FB'
1981+emoji[woman_dancing_medium_light_skin_tone]=$'\U1F483\U1F3FC'
1982+emoji[woman_dancing_medium_skin_tone]=$'\U1F483\U1F3FD'
1983+emoji[woman_dancing_medium_dark_skin_tone]=$'\U1F483\U1F3FE'
1984+emoji[woman_dancing_dark_skin_tone]=$'\U1F483\U1F3FF'
1985+emoji[woman_dancing_dark_skin_tone_1]=$'\U1F57A'
1986+emoji[man_dancing]=$'\U1F57A'
1987+emoji[man_dancing_light_skin_tone]=$'\U1F57A\U1F3FB'
1988+emoji[man_dancing_medium_light_skin_tone]=$'\U1F57A\U1F3FC'
1989+emoji[man_dancing_medium_skin_tone]=$'\U1F57A\U1F3FD'
1990+emoji[man_dancing_medium_dark_skin_tone]=$'\U1F57A\U1F3FE'
1991+emoji[man_dancing_dark_skin_tone]=$'\U1F57A\U1F3FF'
1992+emoji[man_in_suit_levitating]=$'\U1F574\UFE0F'
1993+emoji[man_in_suit_levitating_unqualified]=$'\U1F574'
1994+emoji[business_suit_levitating]=$'\U1F574'
1995+emoji[man_in_suit_levitating_light_skin_tone]=$'\U1F574\U1F3FB'
1996+emoji[man_in_suit_levitating_medium_light_skin_tone]=$'\U1F574\U1F3FC'
1997+emoji[man_in_suit_levitating_medium_skin_tone]=$'\U1F574\U1F3FD'
1998+emoji[man_in_suit_levitating_medium_dark_skin_tone]=$'\U1F574\U1F3FE'
1999+emoji[man_in_suit_levitating_dark_skin_tone]=$'\U1F574\U1F3FF'
2000+emoji[people_with_bunny_ears]=$'\U1F46F'
2001+emoji[dancers]=$'\U1F46F'
2002+emoji[men_with_bunny_ears]=$'\U1F46F\U200D\U2642\UFE0F'
2003+emoji[men_with_bunny_ears_minimally]=$'\U1F46F\U200D\U2642'
2004+emoji[dancing_men]=$'\U1F46F\U200D\U2642'
2005+emoji[women_with_bunny_ears]=$'\U1F46F\U200D\U2640\UFE0F'
2006+emoji[women_with_bunny_ears_minimally]=$'\U1F46F\U200D\U2640'
2007+emoji[dancing_women]=$'\U1F46F\U200D\U2640'
2008+emoji[person_in_steamy_room]=$'\U1F9D6'
2009+emoji[sauna_person]=$'\U1F9D6'
2010+emoji[person_in_steamy_room_light_skin_tone]=$'\U1F9D6\U1F3FB'
2011+emoji[person_in_steamy_room_medium_light_skin_tone]=$'\U1F9D6\U1F3FC'
2012+emoji[person_in_steamy_room_medium_skin_tone]=$'\U1F9D6\U1F3FD'
2013+emoji[person_in_steamy_room_medium_dark_skin_tone]=$'\U1F9D6\U1F3FE'
2014+emoji[person_in_steamy_room_dark_skin_tone]=$'\U1F9D6\U1F3FF'
2015+emoji[man_in_steamy_room]=$'\U1F9D6\U200D\U2642\UFE0F'
2016+emoji[man_in_steamy_room_minimally]=$'\U1F9D6\U200D\U2642'
2017+emoji[sauna_man]=$'\U1F9D6\U200D\U2642'
2018+emoji[man_in_steamy_room_light_skin_tone]=$'\U1F9D6\U1F3FB\U200D\U2642\UFE0F'
2019+emoji[man_in_steamy_room_light_skin_tone_minimally]=$'\U1F9D6\U1F3FB\U200D\U2642'
2020+emoji[man_in_steamy_room_medium_light_skin_tone]=$'\U1F9D6\U1F3FC\U200D\U2642\UFE0F'
2021+emoji[man_in_steamy_room_medium_light_skin_tone_minimally]=$'\U1F9D6\U1F3FC\U200D\U2642'
2022+emoji[man_in_steamy_room_medium_skin_tone]=$'\U1F9D6\U1F3FD\U200D\U2642\UFE0F'
2023+emoji[man_in_steamy_room_medium_skin_tone_minimally]=$'\U1F9D6\U1F3FD\U200D\U2642'
2024+emoji[man_in_steamy_room_medium_dark_skin_tone]=$'\U1F9D6\U1F3FE\U200D\U2642\UFE0F'
2025+emoji[man_in_steamy_room_medium_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FE\U200D\U2642'
2026+emoji[man_in_steamy_room_dark_skin_tone]=$'\U1F9D6\U1F3FF\U200D\U2642\UFE0F'
2027+emoji[man_in_steamy_room_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FF\U200D\U2642'
2028+emoji[woman_in_steamy_room]=$'\U1F9D6\U200D\U2640\UFE0F'
2029+emoji[woman_in_steamy_room_minimally]=$'\U1F9D6\U200D\U2640'
2030+emoji[sauna_woman]=$'\U1F9D6\U200D\U2640'
2031+emoji[woman_in_steamy_room_light_skin_tone]=$'\U1F9D6\U1F3FB\U200D\U2640\UFE0F'
2032+emoji[woman_in_steamy_room_light_skin_tone_minimally]=$'\U1F9D6\U1F3FB\U200D\U2640'
2033+emoji[woman_in_steamy_room_medium_light_skin_tone]=$'\U1F9D6\U1F3FC\U200D\U2640\UFE0F'
2034+emoji[woman_in_steamy_room_medium_light_skin_tone_minimally]=$'\U1F9D6\U1F3FC\U200D\U2640'
2035+emoji[woman_in_steamy_room_medium_skin_tone]=$'\U1F9D6\U1F3FD\U200D\U2640\UFE0F'
2036+emoji[woman_in_steamy_room_medium_skin_tone_minimally]=$'\U1F9D6\U1F3FD\U200D\U2640'
2037+emoji[woman_in_steamy_room_medium_dark_skin_tone]=$'\U1F9D6\U1F3FE\U200D\U2640\UFE0F'
2038+emoji[woman_in_steamy_room_medium_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FE\U200D\U2640'
2039+emoji[woman_in_steamy_room_dark_skin_tone]=$'\U1F9D6\U1F3FF\U200D\U2640\UFE0F'
2040+emoji[woman_in_steamy_room_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FF\U200D\U2640'
2041+emoji[person_climbing]=$'\U1F9D7'
2042+emoji[climbing]=$'\U1F9D7'
2043+emoji[person_climbing_light_skin_tone]=$'\U1F9D7\U1F3FB'
2044+emoji[person_climbing_medium_light_skin_tone]=$'\U1F9D7\U1F3FC'
2045+emoji[person_climbing_medium_skin_tone]=$'\U1F9D7\U1F3FD'
2046+emoji[person_climbing_medium_dark_skin_tone]=$'\U1F9D7\U1F3FE'
2047+emoji[person_climbing_dark_skin_tone]=$'\U1F9D7\U1F3FF'
2048+emoji[man_climbing]=$'\U1F9D7\U200D\U2642\UFE0F'
2049+emoji[man_climbing_minimally]=$'\U1F9D7\U200D\U2642'
2050+emoji[climbing_man]=$'\U1F9D7\U200D\U2642'
2051+emoji[man_climbing_light_skin_tone]=$'\U1F9D7\U1F3FB\U200D\U2642\UFE0F'
2052+emoji[man_climbing_light_skin_tone_minimally]=$'\U1F9D7\U1F3FB\U200D\U2642'
2053+emoji[man_climbing_medium_light_skin_tone]=$'\U1F9D7\U1F3FC\U200D\U2642\UFE0F'
2054+emoji[man_climbing_medium_light_skin_tone_minimally]=$'\U1F9D7\U1F3FC\U200D\U2642'
2055+emoji[man_climbing_medium_skin_tone]=$'\U1F9D7\U1F3FD\U200D\U2642\UFE0F'
2056+emoji[man_climbing_medium_skin_tone_minimally]=$'\U1F9D7\U1F3FD\U200D\U2642'
2057+emoji[man_climbing_medium_dark_skin_tone]=$'\U1F9D7\U1F3FE\U200D\U2642\UFE0F'
2058+emoji[man_climbing_medium_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FE\U200D\U2642'
2059+emoji[man_climbing_dark_skin_tone]=$'\U1F9D7\U1F3FF\U200D\U2642\UFE0F'
2060+emoji[man_climbing_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FF\U200D\U2642'
2061+emoji[woman_climbing]=$'\U1F9D7\U200D\U2640\UFE0F'
2062+emoji[woman_climbing_minimally]=$'\U1F9D7\U200D\U2640'
2063+emoji[climbing_woman]=$'\U1F9D7\U200D\U2640'
2064+emoji[woman_climbing_light_skin_tone]=$'\U1F9D7\U1F3FB\U200D\U2640\UFE0F'
2065+emoji[woman_climbing_light_skin_tone_minimally]=$'\U1F9D7\U1F3FB\U200D\U2640'
2066+emoji[woman_climbing_medium_light_skin_tone]=$'\U1F9D7\U1F3FC\U200D\U2640\UFE0F'
2067+emoji[woman_climbing_medium_light_skin_tone_minimally]=$'\U1F9D7\U1F3FC\U200D\U2640'
2068+emoji[woman_climbing_medium_skin_tone]=$'\U1F9D7\U1F3FD\U200D\U2640\UFE0F'
2069+emoji[woman_climbing_medium_skin_tone_minimally]=$'\U1F9D7\U1F3FD\U200D\U2640'
2070+emoji[woman_climbing_medium_dark_skin_tone]=$'\U1F9D7\U1F3FE\U200D\U2640\UFE0F'
2071+emoji[woman_climbing_medium_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FE\U200D\U2640'
2072+emoji[woman_climbing_dark_skin_tone]=$'\U1F9D7\U1F3FF\U200D\U2640\UFE0F'
2073+emoji[woman_climbing_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FF\U200D\U2640'
2074+emoji[person_fencing]=$'\U1F93A'
2075+emoji[horse_racing]=$'\U1F3C7'
2076+emoji[horse_racing_light_skin_tone]=$'\U1F3C7\U1F3FB'
2077+emoji[horse_racing_medium_light_skin_tone]=$'\U1F3C7\U1F3FC'
2078+emoji[horse_racing_medium_skin_tone]=$'\U1F3C7\U1F3FD'
2079+emoji[horse_racing_medium_dark_skin_tone]=$'\U1F3C7\U1F3FE'
2080+emoji[horse_racing_dark_skin_tone]=$'\U1F3C7\U1F3FF'
2081+emoji[skier]=$'\U26F7\UFE0F'
2082+emoji[skier_unqualified]=$'\U26F7'
2083+emoji[snowboarder]=$'\U1F3C2'
2084+emoji[snowboarder_light_skin_tone]=$'\U1F3C2\U1F3FB'
2085+emoji[snowboarder_medium_light_skin_tone]=$'\U1F3C2\U1F3FC'
2086+emoji[snowboarder_medium_skin_tone]=$'\U1F3C2\U1F3FD'
2087+emoji[snowboarder_medium_dark_skin_tone]=$'\U1F3C2\U1F3FE'
2088+emoji[snowboarder_dark_skin_tone]=$'\U1F3C2\U1F3FF'
2089+emoji[person_golfing]=$'\U1F3CC\UFE0F'
2090+emoji[person_golfing_unqualified]=$'\U1F3CC'
2091+emoji[golfing]=$'\U1F3CC'
2092+emoji[person_golfing_light_skin_tone]=$'\U1F3CC\U1F3FB'
2093+emoji[person_golfing_medium_light_skin_tone]=$'\U1F3CC\U1F3FC'
2094+emoji[person_golfing_medium_skin_tone]=$'\U1F3CC\U1F3FD'
2095+emoji[person_golfing_medium_dark_skin_tone]=$'\U1F3CC\U1F3FE'
2096+emoji[person_golfing_dark_skin_tone]=$'\U1F3CC\U1F3FF'
2097+emoji[man_golfing]=$'\U1F3CC\UFE0F\U200D\U2642\UFE0F'
2098+emoji[golfing_man]=$'\U1F3CC\UFE0F\U200D\U2642\UFE0F'
2099+emoji[man_golfing_unqualified]=$'\U1F3CC\U200D\U2642\UFE0F'
2100+emoji[man_golfing_unqualified_1]=$'\U1F3CC\UFE0F\U200D\U2642'
2101+emoji[man_golfing_unqualified_2]=$'\U1F3CC\U200D\U2642'
2102+emoji[man_golfing_light_skin_tone]=$'\U1F3CC\U1F3FB\U200D\U2642\UFE0F'
2103+emoji[man_golfing_light_skin_tone_minimally]=$'\U1F3CC\U1F3FB\U200D\U2642'
2104+emoji[man_golfing_medium_light_skin_tone]=$'\U1F3CC\U1F3FC\U200D\U2642\UFE0F'
2105+emoji[man_golfing_medium_light_skin_tone_minimally]=$'\U1F3CC\U1F3FC\U200D\U2642'
2106+emoji[man_golfing_medium_skin_tone]=$'\U1F3CC\U1F3FD\U200D\U2642\UFE0F'
2107+emoji[man_golfing_medium_skin_tone_minimally]=$'\U1F3CC\U1F3FD\U200D\U2642'
2108+emoji[man_golfing_medium_dark_skin_tone]=$'\U1F3CC\U1F3FE\U200D\U2642\UFE0F'
2109+emoji[man_golfing_medium_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FE\U200D\U2642'
2110+emoji[man_golfing_dark_skin_tone]=$'\U1F3CC\U1F3FF\U200D\U2642\UFE0F'
2111+emoji[man_golfing_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FF\U200D\U2642'
2112+emoji[woman_golfing]=$'\U1F3CC\UFE0F\U200D\U2640\UFE0F'
2113+emoji[golfing_woman]=$'\U1F3CC\UFE0F\U200D\U2640\UFE0F'
2114+emoji[woman_golfing_unqualified]=$'\U1F3CC\U200D\U2640\UFE0F'
2115+emoji[woman_golfing_unqualified_1]=$'\U1F3CC\UFE0F\U200D\U2640'
2116+emoji[woman_golfing_unqualified_2]=$'\U1F3CC\U200D\U2640'
2117+emoji[woman_golfing_light_skin_tone]=$'\U1F3CC\U1F3FB\U200D\U2640\UFE0F'
2118+emoji[woman_golfing_light_skin_tone_minimally]=$'\U1F3CC\U1F3FB\U200D\U2640'
2119+emoji[woman_golfing_medium_light_skin_tone]=$'\U1F3CC\U1F3FC\U200D\U2640\UFE0F'
2120+emoji[woman_golfing_medium_light_skin_tone_minimally]=$'\U1F3CC\U1F3FC\U200D\U2640'
2121+emoji[woman_golfing_medium_skin_tone]=$'\U1F3CC\U1F3FD\U200D\U2640\UFE0F'
2122+emoji[woman_golfing_medium_skin_tone_minimally]=$'\U1F3CC\U1F3FD\U200D\U2640'
2123+emoji[woman_golfing_medium_dark_skin_tone]=$'\U1F3CC\U1F3FE\U200D\U2640\UFE0F'
2124+emoji[woman_golfing_medium_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FE\U200D\U2640'
2125+emoji[woman_golfing_dark_skin_tone]=$'\U1F3CC\U1F3FF\U200D\U2640\UFE0F'
2126+emoji[woman_golfing_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FF\U200D\U2640'
2127+emoji[person_surfing]=$'\U1F3C4'
2128+emoji[surfer]=$'\U1F3C4'
2129+emoji[person_surfing_light_skin_tone]=$'\U1F3C4\U1F3FB'
2130+emoji[person_surfing_medium_light_skin_tone]=$'\U1F3C4\U1F3FC'
2131+emoji[person_surfing_medium_skin_tone]=$'\U1F3C4\U1F3FD'
2132+emoji[person_surfing_medium_dark_skin_tone]=$'\U1F3C4\U1F3FE'
2133+emoji[person_surfing_dark_skin_tone]=$'\U1F3C4\U1F3FF'
2134+emoji[man_surfing]=$'\U1F3C4\U200D\U2642\UFE0F'
2135+emoji[man_surfing_minimally]=$'\U1F3C4\U200D\U2642'
2136+emoji[surfing_man]=$'\U1F3C4\U200D\U2642'
2137+emoji[man_surfing_light_skin_tone]=$'\U1F3C4\U1F3FB\U200D\U2642\UFE0F'
2138+emoji[man_surfing_light_skin_tone_minimally]=$'\U1F3C4\U1F3FB\U200D\U2642'
2139+emoji[man_surfing_medium_light_skin_tone]=$'\U1F3C4\U1F3FC\U200D\U2642\UFE0F'
2140+emoji[man_surfing_medium_light_skin_tone_minimally]=$'\U1F3C4\U1F3FC\U200D\U2642'
2141+emoji[man_surfing_medium_skin_tone]=$'\U1F3C4\U1F3FD\U200D\U2642\UFE0F'
2142+emoji[man_surfing_medium_skin_tone_minimally]=$'\U1F3C4\U1F3FD\U200D\U2642'
2143+emoji[man_surfing_medium_dark_skin_tone]=$'\U1F3C4\U1F3FE\U200D\U2642\UFE0F'
2144+emoji[man_surfing_medium_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FE\U200D\U2642'
2145+emoji[man_surfing_dark_skin_tone]=$'\U1F3C4\U1F3FF\U200D\U2642\UFE0F'
2146+emoji[man_surfing_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FF\U200D\U2642'
2147+emoji[woman_surfing]=$'\U1F3C4\U200D\U2640\UFE0F'
2148+emoji[woman_surfing_minimally]=$'\U1F3C4\U200D\U2640'
2149+emoji[surfing_woman]=$'\U1F3C4\U200D\U2640'
2150+emoji[woman_surfing_light_skin_tone]=$'\U1F3C4\U1F3FB\U200D\U2640\UFE0F'
2151+emoji[woman_surfing_light_skin_tone_minimally]=$'\U1F3C4\U1F3FB\U200D\U2640'
2152+emoji[woman_surfing_medium_light_skin_tone]=$'\U1F3C4\U1F3FC\U200D\U2640\UFE0F'
2153+emoji[woman_surfing_medium_light_skin_tone_minimally]=$'\U1F3C4\U1F3FC\U200D\U2640'
2154+emoji[woman_surfing_medium_skin_tone]=$'\U1F3C4\U1F3FD\U200D\U2640\UFE0F'
2155+emoji[woman_surfing_medium_skin_tone_minimally]=$'\U1F3C4\U1F3FD\U200D\U2640'
2156+emoji[woman_surfing_medium_dark_skin_tone]=$'\U1F3C4\U1F3FE\U200D\U2640\UFE0F'
2157+emoji[woman_surfing_medium_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FE\U200D\U2640'
2158+emoji[woman_surfing_dark_skin_tone]=$'\U1F3C4\U1F3FF\U200D\U2640\UFE0F'
2159+emoji[woman_surfing_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FF\U200D\U2640'
2160+emoji[person_rowing_boat]=$'\U1F6A3'
2161+emoji[rowboat]=$'\U1F6A3'
2162+emoji[person_rowing_boat_light_skin_tone]=$'\U1F6A3\U1F3FB'
2163+emoji[person_rowing_boat_medium_light_skin_tone]=$'\U1F6A3\U1F3FC'
2164+emoji[person_rowing_boat_medium_skin_tone]=$'\U1F6A3\U1F3FD'
2165+emoji[person_rowing_boat_medium_dark_skin_tone]=$'\U1F6A3\U1F3FE'
2166+emoji[person_rowing_boat_dark_skin_tone]=$'\U1F6A3\U1F3FF'
2167+emoji[man_rowing_boat]=$'\U1F6A3\U200D\U2642\UFE0F'
2168+emoji[man_rowing_boat_minimally]=$'\U1F6A3\U200D\U2642'
2169+emoji[rowing_man]=$'\U1F6A3\U200D\U2642'
2170+emoji[man_rowing_boat_light_skin_tone]=$'\U1F6A3\U1F3FB\U200D\U2642\UFE0F'
2171+emoji[man_rowing_boat_light_skin_tone_minimally]=$'\U1F6A3\U1F3FB\U200D\U2642'
2172+emoji[man_rowing_boat_medium_light_skin_tone]=$'\U1F6A3\U1F3FC\U200D\U2642\UFE0F'
2173+emoji[man_rowing_boat_medium_light_skin_tone_minimally]=$'\U1F6A3\U1F3FC\U200D\U2642'
2174+emoji[man_rowing_boat_medium_skin_tone]=$'\U1F6A3\U1F3FD\U200D\U2642\UFE0F'
2175+emoji[man_rowing_boat_medium_skin_tone_minimally]=$'\U1F6A3\U1F3FD\U200D\U2642'
2176+emoji[man_rowing_boat_medium_dark_skin_tone]=$'\U1F6A3\U1F3FE\U200D\U2642\UFE0F'
2177+emoji[man_rowing_boat_medium_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FE\U200D\U2642'
2178+emoji[man_rowing_boat_dark_skin_tone]=$'\U1F6A3\U1F3FF\U200D\U2642\UFE0F'
2179+emoji[man_rowing_boat_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FF\U200D\U2642'
2180+emoji[woman_rowing_boat]=$'\U1F6A3\U200D\U2640\UFE0F'
2181+emoji[woman_rowing_boat_minimally]=$'\U1F6A3\U200D\U2640'
2182+emoji[rowing_woman]=$'\U1F6A3\U200D\U2640'
2183+emoji[woman_rowing_boat_light_skin_tone]=$'\U1F6A3\U1F3FB\U200D\U2640\UFE0F'
2184+emoji[woman_rowing_boat_light_skin_tone_minimally]=$'\U1F6A3\U1F3FB\U200D\U2640'
2185+emoji[woman_rowing_boat_medium_light_skin_tone]=$'\U1F6A3\U1F3FC\U200D\U2640\UFE0F'
2186+emoji[woman_rowing_boat_medium_light_skin_tone_minimally]=$'\U1F6A3\U1F3FC\U200D\U2640'
2187+emoji[woman_rowing_boat_medium_skin_tone]=$'\U1F6A3\U1F3FD\U200D\U2640\UFE0F'
2188+emoji[woman_rowing_boat_medium_skin_tone_minimally]=$'\U1F6A3\U1F3FD\U200D\U2640'
2189+emoji[woman_rowing_boat_medium_dark_skin_tone]=$'\U1F6A3\U1F3FE\U200D\U2640\UFE0F'
2190+emoji[woman_rowing_boat_medium_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FE\U200D\U2640'
2191+emoji[woman_rowing_boat_dark_skin_tone]=$'\U1F6A3\U1F3FF\U200D\U2640\UFE0F'
2192+emoji[woman_rowing_boat_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FF\U200D\U2640'
2193+emoji[person_swimming]=$'\U1F3CA'
2194+emoji[swimmer]=$'\U1F3CA'
2195+emoji[person_swimming_light_skin_tone]=$'\U1F3CA\U1F3FB'
2196+emoji[person_swimming_medium_light_skin_tone]=$'\U1F3CA\U1F3FC'
2197+emoji[person_swimming_medium_skin_tone]=$'\U1F3CA\U1F3FD'
2198+emoji[person_swimming_medium_dark_skin_tone]=$'\U1F3CA\U1F3FE'
2199+emoji[person_swimming_dark_skin_tone]=$'\U1F3CA\U1F3FF'
2200+emoji[man_swimming]=$'\U1F3CA\U200D\U2642\UFE0F'
2201+emoji[man_swimming_minimally]=$'\U1F3CA\U200D\U2642'
2202+emoji[swimming_man]=$'\U1F3CA\U200D\U2642'
2203+emoji[man_swimming_light_skin_tone]=$'\U1F3CA\U1F3FB\U200D\U2642\UFE0F'
2204+emoji[man_swimming_light_skin_tone_minimally]=$'\U1F3CA\U1F3FB\U200D\U2642'
2205+emoji[man_swimming_medium_light_skin_tone]=$'\U1F3CA\U1F3FC\U200D\U2642\UFE0F'
2206+emoji[man_swimming_medium_light_skin_tone_minimally]=$'\U1F3CA\U1F3FC\U200D\U2642'
2207+emoji[man_swimming_medium_skin_tone]=$'\U1F3CA\U1F3FD\U200D\U2642\UFE0F'
2208+emoji[man_swimming_medium_skin_tone_minimally]=$'\U1F3CA\U1F3FD\U200D\U2642'
2209+emoji[man_swimming_medium_dark_skin_tone]=$'\U1F3CA\U1F3FE\U200D\U2642\UFE0F'
2210+emoji[man_swimming_medium_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FE\U200D\U2642'
2211+emoji[man_swimming_dark_skin_tone]=$'\U1F3CA\U1F3FF\U200D\U2642\UFE0F'
2212+emoji[man_swimming_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FF\U200D\U2642'
2213+emoji[woman_swimming]=$'\U1F3CA\U200D\U2640\UFE0F'
2214+emoji[woman_swimming_minimally]=$'\U1F3CA\U200D\U2640'
2215+emoji[swimming_woman]=$'\U1F3CA\U200D\U2640'
2216+emoji[woman_swimming_light_skin_tone]=$'\U1F3CA\U1F3FB\U200D\U2640\UFE0F'
2217+emoji[woman_swimming_light_skin_tone_minimally]=$'\U1F3CA\U1F3FB\U200D\U2640'
2218+emoji[woman_swimming_medium_light_skin_tone]=$'\U1F3CA\U1F3FC\U200D\U2640\UFE0F'
2219+emoji[woman_swimming_medium_light_skin_tone_minimally]=$'\U1F3CA\U1F3FC\U200D\U2640'
2220+emoji[woman_swimming_medium_skin_tone]=$'\U1F3CA\U1F3FD\U200D\U2640\UFE0F'
2221+emoji[woman_swimming_medium_skin_tone_minimally]=$'\U1F3CA\U1F3FD\U200D\U2640'
2222+emoji[woman_swimming_medium_dark_skin_tone]=$'\U1F3CA\U1F3FE\U200D\U2640\UFE0F'
2223+emoji[woman_swimming_medium_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FE\U200D\U2640'
2224+emoji[woman_swimming_dark_skin_tone]=$'\U1F3CA\U1F3FF\U200D\U2640\UFE0F'
2225+emoji[woman_swimming_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FF\U200D\U2640'
2226+emoji[person_bouncing_ball]=$'\U26F9\UFE0F'
2227+emoji[person_bouncing_ball_unqualified]=$'\U26F9'
2228+emoji[bouncing_ball_person]=$'\U26F9'
2229+emoji[person_bouncing_ball_light_skin_tone]=$'\U26F9\U1F3FB'
2230+emoji[person_bouncing_ball_medium_light_skin_tone]=$'\U26F9\U1F3FC'
2231+emoji[person_bouncing_ball_medium_skin_tone]=$'\U26F9\U1F3FD'
2232+emoji[person_bouncing_ball_medium_dark_skin_tone]=$'\U26F9\U1F3FE'
2233+emoji[person_bouncing_ball_dark_skin_tone]=$'\U26F9\U1F3FF'
2234+emoji[man_bouncing_ball]=$'\U26F9\UFE0F\U200D\U2642\UFE0F'
2235+emoji[bouncing_ball_man]=$'\U26F9\UFE0F\U200D\U2642\UFE0F'
2236+emoji[basketball_man]=$'\U26F9\UFE0F\U200D\U2642\UFE0F'
2237+emoji[man_bouncing_ball_unqualified]=$'\U26F9\U200D\U2642\UFE0F'
2238+emoji[man_bouncing_ball_unqualified_1]=$'\U26F9\UFE0F\U200D\U2642'
2239+emoji[man_bouncing_ball_unqualified_2]=$'\U26F9\U200D\U2642'
2240+emoji[man_bouncing_ball_light_skin_tone]=$'\U26F9\U1F3FB\U200D\U2642\UFE0F'
2241+emoji[man_bouncing_ball_light_skin_tone_minimally]=$'\U26F9\U1F3FB\U200D\U2642'
2242+emoji[man_bouncing_ball_medium_light_skin_tone]=$'\U26F9\U1F3FC\U200D\U2642\UFE0F'
2243+emoji[man_bouncing_ball_medium_light_skin_tone_minimally]=$'\U26F9\U1F3FC\U200D\U2642'
2244+emoji[man_bouncing_ball_medium_skin_tone]=$'\U26F9\U1F3FD\U200D\U2642\UFE0F'
2245+emoji[man_bouncing_ball_medium_skin_tone_minimally]=$'\U26F9\U1F3FD\U200D\U2642'
2246+emoji[man_bouncing_ball_medium_dark_skin_tone]=$'\U26F9\U1F3FE\U200D\U2642\UFE0F'
2247+emoji[man_bouncing_ball_medium_dark_skin_tone_minimally]=$'\U26F9\U1F3FE\U200D\U2642'
2248+emoji[man_bouncing_ball_dark_skin_tone]=$'\U26F9\U1F3FF\U200D\U2642\UFE0F'
2249+emoji[man_bouncing_ball_dark_skin_tone_minimally]=$'\U26F9\U1F3FF\U200D\U2642'
2250+emoji[woman_bouncing_ball]=$'\U26F9\UFE0F\U200D\U2640\UFE0F'
2251+emoji[bouncing_ball_woman]=$'\U26F9\UFE0F\U200D\U2640\UFE0F'
2252+emoji[basketball_woman]=$'\U26F9\UFE0F\U200D\U2640\UFE0F'
2253+emoji[woman_bouncing_ball_unqualified]=$'\U26F9\U200D\U2640\UFE0F'
2254+emoji[woman_bouncing_ball_unqualified_1]=$'\U26F9\UFE0F\U200D\U2640'
2255+emoji[woman_bouncing_ball_unqualified_2]=$'\U26F9\U200D\U2640'
2256+emoji[woman_bouncing_ball_light_skin_tone]=$'\U26F9\U1F3FB\U200D\U2640\UFE0F'
2257+emoji[woman_bouncing_ball_light_skin_tone_minimally]=$'\U26F9\U1F3FB\U200D\U2640'
2258+emoji[woman_bouncing_ball_medium_light_skin_tone]=$'\U26F9\U1F3FC\U200D\U2640\UFE0F'
2259+emoji[woman_bouncing_ball_medium_light_skin_tone_minimally]=$'\U26F9\U1F3FC\U200D\U2640'
2260+emoji[woman_bouncing_ball_medium_skin_tone]=$'\U26F9\U1F3FD\U200D\U2640\UFE0F'
2261+emoji[woman_bouncing_ball_medium_skin_tone_minimally]=$'\U26F9\U1F3FD\U200D\U2640'
2262+emoji[woman_bouncing_ball_medium_dark_skin_tone]=$'\U26F9\U1F3FE\U200D\U2640\UFE0F'
2263+emoji[woman_bouncing_ball_medium_dark_skin_tone_minimally]=$'\U26F9\U1F3FE\U200D\U2640'
2264+emoji[woman_bouncing_ball_dark_skin_tone]=$'\U26F9\U1F3FF\U200D\U2640\UFE0F'
2265+emoji[woman_bouncing_ball_dark_skin_tone_minimally]=$'\U26F9\U1F3FF\U200D\U2640'
2266+emoji[person_lifting_weights]=$'\U1F3CB\UFE0F'
2267+emoji[person_lifting_weights_unqualified]=$'\U1F3CB'
2268+emoji[weight_lifting]=$'\U1F3CB'
2269+emoji[person_lifting_weights_light_skin_tone]=$'\U1F3CB\U1F3FB'
2270+emoji[person_lifting_weights_medium_light_skin_tone]=$'\U1F3CB\U1F3FC'
2271+emoji[person_lifting_weights_medium_skin_tone]=$'\U1F3CB\U1F3FD'
2272+emoji[person_lifting_weights_medium_dark_skin_tone]=$'\U1F3CB\U1F3FE'
2273+emoji[person_lifting_weights_dark_skin_tone]=$'\U1F3CB\U1F3FF'
2274+emoji[man_lifting_weights]=$'\U1F3CB\UFE0F\U200D\U2642\UFE0F'
2275+emoji[weight_lifting_man]=$'\U1F3CB\UFE0F\U200D\U2642\UFE0F'
2276+emoji[man_lifting_weights_unqualified]=$'\U1F3CB\U200D\U2642\UFE0F'
2277+emoji[man_lifting_weights_unqualified_1]=$'\U1F3CB\UFE0F\U200D\U2642'
2278+emoji[man_lifting_weights_unqualified_2]=$'\U1F3CB\U200D\U2642'
2279+emoji[man_lifting_weights_light_skin_tone]=$'\U1F3CB\U1F3FB\U200D\U2642\UFE0F'
2280+emoji[man_lifting_weights_light_skin_tone_minimally]=$'\U1F3CB\U1F3FB\U200D\U2642'
2281+emoji[man_lifting_weights_medium_light_skin_tone]=$'\U1F3CB\U1F3FC\U200D\U2642\UFE0F'
2282+emoji[man_lifting_weights_medium_light_skin_tone_minimally]=$'\U1F3CB\U1F3FC\U200D\U2642'
2283+emoji[man_lifting_weights_medium_skin_tone]=$'\U1F3CB\U1F3FD\U200D\U2642\UFE0F'
2284+emoji[man_lifting_weights_medium_skin_tone_minimally]=$'\U1F3CB\U1F3FD\U200D\U2642'
2285+emoji[man_lifting_weights_medium_dark_skin_tone]=$'\U1F3CB\U1F3FE\U200D\U2642\UFE0F'
2286+emoji[man_lifting_weights_medium_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FE\U200D\U2642'
2287+emoji[man_lifting_weights_dark_skin_tone]=$'\U1F3CB\U1F3FF\U200D\U2642\UFE0F'
2288+emoji[man_lifting_weights_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FF\U200D\U2642'
2289+emoji[woman_lifting_weights]=$'\U1F3CB\UFE0F\U200D\U2640\UFE0F'
2290+emoji[weight_lifting_woman]=$'\U1F3CB\UFE0F\U200D\U2640\UFE0F'
2291+emoji[woman_lifting_weights_unqualified]=$'\U1F3CB\U200D\U2640\UFE0F'
2292+emoji[woman_lifting_weights_unqualified_1]=$'\U1F3CB\UFE0F\U200D\U2640'
2293+emoji[woman_lifting_weights_unqualified_2]=$'\U1F3CB\U200D\U2640'
2294+emoji[woman_lifting_weights_light_skin_tone]=$'\U1F3CB\U1F3FB\U200D\U2640\UFE0F'
2295+emoji[woman_lifting_weights_light_skin_tone_minimally]=$'\U1F3CB\U1F3FB\U200D\U2640'
2296+emoji[woman_lifting_weights_medium_light_skin_tone]=$'\U1F3CB\U1F3FC\U200D\U2640\UFE0F'
2297+emoji[woman_lifting_weights_medium_light_skin_tone_minimally]=$'\U1F3CB\U1F3FC\U200D\U2640'
2298+emoji[woman_lifting_weights_medium_skin_tone]=$'\U1F3CB\U1F3FD\U200D\U2640\UFE0F'
2299+emoji[woman_lifting_weights_medium_skin_tone_minimally]=$'\U1F3CB\U1F3FD\U200D\U2640'
2300+emoji[woman_lifting_weights_medium_dark_skin_tone]=$'\U1F3CB\U1F3FE\U200D\U2640\UFE0F'
2301+emoji[woman_lifting_weights_medium_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FE\U200D\U2640'
2302+emoji[woman_lifting_weights_dark_skin_tone]=$'\U1F3CB\U1F3FF\U200D\U2640\UFE0F'
2303+emoji[woman_lifting_weights_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FF\U200D\U2640'
2304+emoji[person_biking]=$'\U1F6B4'
2305+emoji[bicyclist]=$'\U1F6B4'
2306+emoji[person_biking_light_skin_tone]=$'\U1F6B4\U1F3FB'
2307+emoji[person_biking_medium_light_skin_tone]=$'\U1F6B4\U1F3FC'
2308+emoji[person_biking_medium_skin_tone]=$'\U1F6B4\U1F3FD'
2309+emoji[person_biking_medium_dark_skin_tone]=$'\U1F6B4\U1F3FE'
2310+emoji[person_biking_dark_skin_tone]=$'\U1F6B4\U1F3FF'
2311+emoji[man_biking]=$'\U1F6B4\U200D\U2642\UFE0F'
2312+emoji[man_biking_minimally]=$'\U1F6B4\U200D\U2642'
2313+emoji[biking_man]=$'\U1F6B4\U200D\U2642'
2314+emoji[man_biking_light_skin_tone]=$'\U1F6B4\U1F3FB\U200D\U2642\UFE0F'
2315+emoji[man_biking_light_skin_tone_minimally]=$'\U1F6B4\U1F3FB\U200D\U2642'
2316+emoji[man_biking_medium_light_skin_tone]=$'\U1F6B4\U1F3FC\U200D\U2642\UFE0F'
2317+emoji[man_biking_medium_light_skin_tone_minimally]=$'\U1F6B4\U1F3FC\U200D\U2642'
2318+emoji[man_biking_medium_skin_tone]=$'\U1F6B4\U1F3FD\U200D\U2642\UFE0F'
2319+emoji[man_biking_medium_skin_tone_minimally]=$'\U1F6B4\U1F3FD\U200D\U2642'
2320+emoji[man_biking_medium_dark_skin_tone]=$'\U1F6B4\U1F3FE\U200D\U2642\UFE0F'
2321+emoji[man_biking_medium_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FE\U200D\U2642'
2322+emoji[man_biking_dark_skin_tone]=$'\U1F6B4\U1F3FF\U200D\U2642\UFE0F'
2323+emoji[man_biking_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FF\U200D\U2642'
2324+emoji[woman_biking]=$'\U1F6B4\U200D\U2640\UFE0F'
2325+emoji[woman_biking_minimally]=$'\U1F6B4\U200D\U2640'
2326+emoji[biking_woman]=$'\U1F6B4\U200D\U2640'
2327+emoji[woman_biking_light_skin_tone]=$'\U1F6B4\U1F3FB\U200D\U2640\UFE0F'
2328+emoji[woman_biking_light_skin_tone_minimally]=$'\U1F6B4\U1F3FB\U200D\U2640'
2329+emoji[woman_biking_medium_light_skin_tone]=$'\U1F6B4\U1F3FC\U200D\U2640\UFE0F'
2330+emoji[woman_biking_medium_light_skin_tone_minimally]=$'\U1F6B4\U1F3FC\U200D\U2640'
2331+emoji[woman_biking_medium_skin_tone]=$'\U1F6B4\U1F3FD\U200D\U2640\UFE0F'
2332+emoji[woman_biking_medium_skin_tone_minimally]=$'\U1F6B4\U1F3FD\U200D\U2640'
2333+emoji[woman_biking_medium_dark_skin_tone]=$'\U1F6B4\U1F3FE\U200D\U2640\UFE0F'
2334+emoji[woman_biking_medium_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FE\U200D\U2640'
2335+emoji[woman_biking_dark_skin_tone]=$'\U1F6B4\U1F3FF\U200D\U2640\UFE0F'
2336+emoji[woman_biking_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FF\U200D\U2640'
2337+emoji[person_mountain_biking]=$'\U1F6B5'
2338+emoji[mountain_bicyclist]=$'\U1F6B5'
2339+emoji[person_mountain_biking_light_skin_tone]=$'\U1F6B5\U1F3FB'
2340+emoji[person_mountain_biking_medium_light_skin_tone]=$'\U1F6B5\U1F3FC'
2341+emoji[person_mountain_biking_medium_skin_tone]=$'\U1F6B5\U1F3FD'
2342+emoji[person_mountain_biking_medium_dark_skin_tone]=$'\U1F6B5\U1F3FE'
2343+emoji[person_mountain_biking_dark_skin_tone]=$'\U1F6B5\U1F3FF'
2344+emoji[man_mountain_biking]=$'\U1F6B5\U200D\U2642\UFE0F'
2345+emoji[man_mountain_biking_minimally]=$'\U1F6B5\U200D\U2642'
2346+emoji[mountain_biking_man]=$'\U1F6B5\U200D\U2642'
2347+emoji[man_mountain_biking_light_skin_tone]=$'\U1F6B5\U1F3FB\U200D\U2642\UFE0F'
2348+emoji[man_mountain_biking_light_skin_tone_minimally]=$'\U1F6B5\U1F3FB\U200D\U2642'
2349+emoji[man_mountain_biking_medium_light_skin_tone]=$'\U1F6B5\U1F3FC\U200D\U2642\UFE0F'
2350+emoji[man_mountain_biking_medium_light_skin_tone_minimally]=$'\U1F6B5\U1F3FC\U200D\U2642'
2351+emoji[man_mountain_biking_medium_skin_tone]=$'\U1F6B5\U1F3FD\U200D\U2642\UFE0F'
2352+emoji[man_mountain_biking_medium_skin_tone_minimally]=$'\U1F6B5\U1F3FD\U200D\U2642'
2353+emoji[man_mountain_biking_medium_dark_skin_tone]=$'\U1F6B5\U1F3FE\U200D\U2642\UFE0F'
2354+emoji[man_mountain_biking_medium_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FE\U200D\U2642'
2355+emoji[man_mountain_biking_dark_skin_tone]=$'\U1F6B5\U1F3FF\U200D\U2642\UFE0F'
2356+emoji[man_mountain_biking_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FF\U200D\U2642'
2357+emoji[woman_mountain_biking]=$'\U1F6B5\U200D\U2640\UFE0F'
2358+emoji[woman_mountain_biking_minimally]=$'\U1F6B5\U200D\U2640'
2359+emoji[mountain_biking_woman]=$'\U1F6B5\U200D\U2640'
2360+emoji[woman_mountain_biking_light_skin_tone]=$'\U1F6B5\U1F3FB\U200D\U2640\UFE0F'
2361+emoji[woman_mountain_biking_light_skin_tone_minimally]=$'\U1F6B5\U1F3FB\U200D\U2640'
2362+emoji[woman_mountain_biking_medium_light_skin_tone]=$'\U1F6B5\U1F3FC\U200D\U2640\UFE0F'
2363+emoji[woman_mountain_biking_medium_light_skin_tone_minimally]=$'\U1F6B5\U1F3FC\U200D\U2640'
2364+emoji[woman_mountain_biking_medium_skin_tone]=$'\U1F6B5\U1F3FD\U200D\U2640\UFE0F'
2365+emoji[woman_mountain_biking_medium_skin_tone_minimally]=$'\U1F6B5\U1F3FD\U200D\U2640'
2366+emoji[woman_mountain_biking_medium_dark_skin_tone]=$'\U1F6B5\U1F3FE\U200D\U2640\UFE0F'
2367+emoji[woman_mountain_biking_medium_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FE\U200D\U2640'
2368+emoji[woman_mountain_biking_dark_skin_tone]=$'\U1F6B5\U1F3FF\U200D\U2640\UFE0F'
2369+emoji[woman_mountain_biking_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FF\U200D\U2640'
2370+emoji[person_cartwheeling]=$'\U1F938'
2371+emoji[cartwheeling]=$'\U1F938'
2372+emoji[person_cartwheeling_light_skin_tone]=$'\U1F938\U1F3FB'
2373+emoji[person_cartwheeling_medium_light_skin_tone]=$'\U1F938\U1F3FC'
2374+emoji[person_cartwheeling_medium_skin_tone]=$'\U1F938\U1F3FD'
2375+emoji[person_cartwheeling_medium_dark_skin_tone]=$'\U1F938\U1F3FE'
2376+emoji[person_cartwheeling_dark_skin_tone]=$'\U1F938\U1F3FF'
2377+emoji[man_cartwheeling]=$'\U1F938\U200D\U2642\UFE0F'
2378+emoji[man_cartwheeling_minimally]=$'\U1F938\U200D\U2642'
2379+emoji[man_cartwheeling_light_skin_tone]=$'\U1F938\U1F3FB\U200D\U2642\UFE0F'
2380+emoji[man_cartwheeling_light_skin_tone_minimally]=$'\U1F938\U1F3FB\U200D\U2642'
2381+emoji[man_cartwheeling_medium_light_skin_tone]=$'\U1F938\U1F3FC\U200D\U2642\UFE0F'
2382+emoji[man_cartwheeling_medium_light_skin_tone_minimally]=$'\U1F938\U1F3FC\U200D\U2642'
2383+emoji[man_cartwheeling_medium_skin_tone]=$'\U1F938\U1F3FD\U200D\U2642\UFE0F'
2384+emoji[man_cartwheeling_medium_skin_tone_minimally]=$'\U1F938\U1F3FD\U200D\U2642'
2385+emoji[man_cartwheeling_medium_dark_skin_tone]=$'\U1F938\U1F3FE\U200D\U2642\UFE0F'
2386+emoji[man_cartwheeling_medium_dark_skin_tone_minimally]=$'\U1F938\U1F3FE\U200D\U2642'
2387+emoji[man_cartwheeling_dark_skin_tone]=$'\U1F938\U1F3FF\U200D\U2642\UFE0F'
2388+emoji[man_cartwheeling_dark_skin_tone_minimally]=$'\U1F938\U1F3FF\U200D\U2642'
2389+emoji[woman_cartwheeling]=$'\U1F938\U200D\U2640\UFE0F'
2390+emoji[woman_cartwheeling_minimally]=$'\U1F938\U200D\U2640'
2391+emoji[woman_cartwheeling_light_skin_tone]=$'\U1F938\U1F3FB\U200D\U2640\UFE0F'
2392+emoji[woman_cartwheeling_light_skin_tone_minimally]=$'\U1F938\U1F3FB\U200D\U2640'
2393+emoji[woman_cartwheeling_medium_light_skin_tone]=$'\U1F938\U1F3FC\U200D\U2640\UFE0F'
2394+emoji[woman_cartwheeling_medium_light_skin_tone_minimally]=$'\U1F938\U1F3FC\U200D\U2640'
2395+emoji[woman_cartwheeling_medium_skin_tone]=$'\U1F938\U1F3FD\U200D\U2640\UFE0F'
2396+emoji[woman_cartwheeling_medium_skin_tone_minimally]=$'\U1F938\U1F3FD\U200D\U2640'
2397+emoji[woman_cartwheeling_medium_dark_skin_tone]=$'\U1F938\U1F3FE\U200D\U2640\UFE0F'
2398+emoji[woman_cartwheeling_medium_dark_skin_tone_minimally]=$'\U1F938\U1F3FE\U200D\U2640'
2399+emoji[woman_cartwheeling_dark_skin_tone]=$'\U1F938\U1F3FF\U200D\U2640\UFE0F'
2400+emoji[woman_cartwheeling_dark_skin_tone_minimally]=$'\U1F938\U1F3FF\U200D\U2640'
2401+emoji[people_wrestling]=$'\U1F93C'
2402+emoji[wrestling]=$'\U1F93C'
2403+emoji[men_wrestling]=$'\U1F93C\U200D\U2642\UFE0F'
2404+emoji[men_wrestling_minimally]=$'\U1F93C\U200D\U2642'
2405+emoji[women_wrestling]=$'\U1F93C\U200D\U2640\UFE0F'
2406+emoji[women_wrestling_minimally]=$'\U1F93C\U200D\U2640'
2407+emoji[person_playing_water_polo]=$'\U1F93D'
2408+emoji[water_polo]=$'\U1F93D'
2409+emoji[person_playing_water_polo_light_skin_tone]=$'\U1F93D\U1F3FB'
2410+emoji[person_playing_water_polo_medium_light_skin_tone]=$'\U1F93D\U1F3FC'
2411+emoji[person_playing_water_polo_medium_skin_tone]=$'\U1F93D\U1F3FD'
2412+emoji[person_playing_water_polo_medium_dark_skin_tone]=$'\U1F93D\U1F3FE'
2413+emoji[person_playing_water_polo_dark_skin_tone]=$'\U1F93D\U1F3FF'
2414+emoji[man_playing_water_polo]=$'\U1F93D\U200D\U2642\UFE0F'
2415+emoji[man_playing_water_polo_minimally]=$'\U1F93D\U200D\U2642'
2416+emoji[man_playing_water_polo_light_skin_tone]=$'\U1F93D\U1F3FB\U200D\U2642\UFE0F'
2417+emoji[man_playing_water_polo_light_skin_tone_minimally]=$'\U1F93D\U1F3FB\U200D\U2642'
2418+emoji[man_playing_water_polo_medium_light_skin_tone]=$'\U1F93D\U1F3FC\U200D\U2642\UFE0F'
2419+emoji[man_playing_water_polo_medium_light_skin_tone_minimally]=$'\U1F93D\U1F3FC\U200D\U2642'
2420+emoji[man_playing_water_polo_medium_skin_tone]=$'\U1F93D\U1F3FD\U200D\U2642\UFE0F'
2421+emoji[man_playing_water_polo_medium_skin_tone_minimally]=$'\U1F93D\U1F3FD\U200D\U2642'
2422+emoji[man_playing_water_polo_medium_dark_skin_tone]=$'\U1F93D\U1F3FE\U200D\U2642\UFE0F'
2423+emoji[man_playing_water_polo_medium_dark_skin_tone_minimally]=$'\U1F93D\U1F3FE\U200D\U2642'
2424+emoji[man_playing_water_polo_dark_skin_tone]=$'\U1F93D\U1F3FF\U200D\U2642\UFE0F'
2425+emoji[man_playing_water_polo_dark_skin_tone_minimally]=$'\U1F93D\U1F3FF\U200D\U2642'
2426+emoji[woman_playing_water_polo]=$'\U1F93D\U200D\U2640\UFE0F'
2427+emoji[woman_playing_water_polo_minimally]=$'\U1F93D\U200D\U2640'
2428+emoji[woman_playing_water_polo_light_skin_tone]=$'\U1F93D\U1F3FB\U200D\U2640\UFE0F'
2429+emoji[woman_playing_water_polo_light_skin_tone_minimally]=$'\U1F93D\U1F3FB\U200D\U2640'
2430+emoji[woman_playing_water_polo_medium_light_skin_tone]=$'\U1F93D\U1F3FC\U200D\U2640\UFE0F'
2431+emoji[woman_playing_water_polo_medium_light_skin_tone_minimally]=$'\U1F93D\U1F3FC\U200D\U2640'
2432+emoji[woman_playing_water_polo_medium_skin_tone]=$'\U1F93D\U1F3FD\U200D\U2640\UFE0F'
2433+emoji[woman_playing_water_polo_medium_skin_tone_minimally]=$'\U1F93D\U1F3FD\U200D\U2640'
2434+emoji[woman_playing_water_polo_medium_dark_skin_tone]=$'\U1F93D\U1F3FE\U200D\U2640\UFE0F'
2435+emoji[woman_playing_water_polo_medium_dark_skin_tone_minimally]=$'\U1F93D\U1F3FE\U200D\U2640'
2436+emoji[woman_playing_water_polo_dark_skin_tone]=$'\U1F93D\U1F3FF\U200D\U2640\UFE0F'
2437+emoji[woman_playing_water_polo_dark_skin_tone_minimally]=$'\U1F93D\U1F3FF\U200D\U2640'
2438+emoji[person_playing_handball]=$'\U1F93E'
2439+emoji[handball_person]=$'\U1F93E'
2440+emoji[person_playing_handball_light_skin_tone]=$'\U1F93E\U1F3FB'
2441+emoji[person_playing_handball_medium_light_skin_tone]=$'\U1F93E\U1F3FC'
2442+emoji[person_playing_handball_medium_skin_tone]=$'\U1F93E\U1F3FD'
2443+emoji[person_playing_handball_medium_dark_skin_tone]=$'\U1F93E\U1F3FE'
2444+emoji[person_playing_handball_dark_skin_tone]=$'\U1F93E\U1F3FF'
2445+emoji[man_playing_handball]=$'\U1F93E\U200D\U2642\UFE0F'
2446+emoji[man_playing_handball_minimally]=$'\U1F93E\U200D\U2642'
2447+emoji[man_playing_handball_light_skin_tone]=$'\U1F93E\U1F3FB\U200D\U2642\UFE0F'
2448+emoji[man_playing_handball_light_skin_tone_minimally]=$'\U1F93E\U1F3FB\U200D\U2642'
2449+emoji[man_playing_handball_medium_light_skin_tone]=$'\U1F93E\U1F3FC\U200D\U2642\UFE0F'
2450+emoji[man_playing_handball_medium_light_skin_tone_minimally]=$'\U1F93E\U1F3FC\U200D\U2642'
2451+emoji[man_playing_handball_medium_skin_tone]=$'\U1F93E\U1F3FD\U200D\U2642\UFE0F'
2452+emoji[man_playing_handball_medium_skin_tone_minimally]=$'\U1F93E\U1F3FD\U200D\U2642'
2453+emoji[man_playing_handball_medium_dark_skin_tone]=$'\U1F93E\U1F3FE\U200D\U2642\UFE0F'
2454+emoji[man_playing_handball_medium_dark_skin_tone_minimally]=$'\U1F93E\U1F3FE\U200D\U2642'
2455+emoji[man_playing_handball_dark_skin_tone]=$'\U1F93E\U1F3FF\U200D\U2642\UFE0F'
2456+emoji[man_playing_handball_dark_skin_tone_minimally]=$'\U1F93E\U1F3FF\U200D\U2642'
2457+emoji[woman_playing_handball]=$'\U1F93E\U200D\U2640\UFE0F'
2458+emoji[woman_playing_handball_minimally]=$'\U1F93E\U200D\U2640'
2459+emoji[woman_playing_handball_light_skin_tone]=$'\U1F93E\U1F3FB\U200D\U2640\UFE0F'
2460+emoji[woman_playing_handball_light_skin_tone_minimally]=$'\U1F93E\U1F3FB\U200D\U2640'
2461+emoji[woman_playing_handball_medium_light_skin_tone]=$'\U1F93E\U1F3FC\U200D\U2640\UFE0F'
2462+emoji[woman_playing_handball_medium_light_skin_tone_minimally]=$'\U1F93E\U1F3FC\U200D\U2640'
2463+emoji[woman_playing_handball_medium_skin_tone]=$'\U1F93E\U1F3FD\U200D\U2640\UFE0F'
2464+emoji[woman_playing_handball_medium_skin_tone_minimally]=$'\U1F93E\U1F3FD\U200D\U2640'
2465+emoji[woman_playing_handball_medium_dark_skin_tone]=$'\U1F93E\U1F3FE\U200D\U2640\UFE0F'
2466+emoji[woman_playing_handball_medium_dark_skin_tone_minimally]=$'\U1F93E\U1F3FE\U200D\U2640'
2467+emoji[woman_playing_handball_dark_skin_tone]=$'\U1F93E\U1F3FF\U200D\U2640\UFE0F'
2468+emoji[woman_playing_handball_dark_skin_tone_minimally]=$'\U1F93E\U1F3FF\U200D\U2640'
2469+emoji[person_juggling]=$'\U1F939'
2470+emoji[juggling_person]=$'\U1F939'
2471+emoji[person_juggling_light_skin_tone]=$'\U1F939\U1F3FB'
2472+emoji[person_juggling_medium_light_skin_tone]=$'\U1F939\U1F3FC'
2473+emoji[person_juggling_medium_skin_tone]=$'\U1F939\U1F3FD'
2474+emoji[person_juggling_medium_dark_skin_tone]=$'\U1F939\U1F3FE'
2475+emoji[person_juggling_dark_skin_tone]=$'\U1F939\U1F3FF'
2476+emoji[man_juggling]=$'\U1F939\U200D\U2642\UFE0F'
2477+emoji[man_juggling_minimally]=$'\U1F939\U200D\U2642'
2478+emoji[man_juggling_light_skin_tone]=$'\U1F939\U1F3FB\U200D\U2642\UFE0F'
2479+emoji[man_juggling_light_skin_tone_minimally]=$'\U1F939\U1F3FB\U200D\U2642'
2480+emoji[man_juggling_medium_light_skin_tone]=$'\U1F939\U1F3FC\U200D\U2642\UFE0F'
2481+emoji[man_juggling_medium_light_skin_tone_minimally]=$'\U1F939\U1F3FC\U200D\U2642'
2482+emoji[man_juggling_medium_skin_tone]=$'\U1F939\U1F3FD\U200D\U2642\UFE0F'
2483+emoji[man_juggling_medium_skin_tone_minimally]=$'\U1F939\U1F3FD\U200D\U2642'
2484+emoji[man_juggling_medium_dark_skin_tone]=$'\U1F939\U1F3FE\U200D\U2642\UFE0F'
2485+emoji[man_juggling_medium_dark_skin_tone_minimally]=$'\U1F939\U1F3FE\U200D\U2642'
2486+emoji[man_juggling_dark_skin_tone]=$'\U1F939\U1F3FF\U200D\U2642\UFE0F'
2487+emoji[man_juggling_dark_skin_tone_minimally]=$'\U1F939\U1F3FF\U200D\U2642'
2488+emoji[woman_juggling]=$'\U1F939\U200D\U2640\UFE0F'
2489+emoji[woman_juggling_minimally]=$'\U1F939\U200D\U2640'
2490+emoji[woman_juggling_light_skin_tone]=$'\U1F939\U1F3FB\U200D\U2640\UFE0F'
2491+emoji[woman_juggling_light_skin_tone_minimally]=$'\U1F939\U1F3FB\U200D\U2640'
2492+emoji[woman_juggling_medium_light_skin_tone]=$'\U1F939\U1F3FC\U200D\U2640\UFE0F'
2493+emoji[woman_juggling_medium_light_skin_tone_minimally]=$'\U1F939\U1F3FC\U200D\U2640'
2494+emoji[woman_juggling_medium_skin_tone]=$'\U1F939\U1F3FD\U200D\U2640\UFE0F'
2495+emoji[woman_juggling_medium_skin_tone_minimally]=$'\U1F939\U1F3FD\U200D\U2640'
2496+emoji[woman_juggling_medium_dark_skin_tone]=$'\U1F939\U1F3FE\U200D\U2640\UFE0F'
2497+emoji[woman_juggling_medium_dark_skin_tone_minimally]=$'\U1F939\U1F3FE\U200D\U2640'
2498+emoji[woman_juggling_dark_skin_tone]=$'\U1F939\U1F3FF\U200D\U2640\UFE0F'
2499+emoji[woman_juggling_dark_skin_tone_minimally]=$'\U1F939\U1F3FF\U200D\U2640'
2500+emoji[person_in_lotus_position]=$'\U1F9D8'
2501+emoji[lotus_position]=$'\U1F9D8'
2502+emoji[person_in_lotus_position_light_skin_tone]=$'\U1F9D8\U1F3FB'
2503+emoji[person_in_lotus_position_medium_light_skin_tone]=$'\U1F9D8\U1F3FC'
2504+emoji[person_in_lotus_position_medium_skin_tone]=$'\U1F9D8\U1F3FD'
2505+emoji[person_in_lotus_position_medium_dark_skin_tone]=$'\U1F9D8\U1F3FE'
2506+emoji[person_in_lotus_position_dark_skin_tone]=$'\U1F9D8\U1F3FF'
2507+emoji[man_in_lotus_position]=$'\U1F9D8\U200D\U2642\UFE0F'
2508+emoji[man_in_lotus_position_minimally]=$'\U1F9D8\U200D\U2642'
2509+emoji[lotus_position_man]=$'\U1F9D8\U200D\U2642'
2510+emoji[man_in_lotus_position_light_skin_tone]=$'\U1F9D8\U1F3FB\U200D\U2642\UFE0F'
2511+emoji[man_in_lotus_position_light_skin_tone_minimally]=$'\U1F9D8\U1F3FB\U200D\U2642'
2512+emoji[man_in_lotus_position_medium_light_skin_tone]=$'\U1F9D8\U1F3FC\U200D\U2642\UFE0F'
2513+emoji[man_in_lotus_position_medium_light_skin_tone_minimally]=$'\U1F9D8\U1F3FC\U200D\U2642'
2514+emoji[man_in_lotus_position_medium_skin_tone]=$'\U1F9D8\U1F3FD\U200D\U2642\UFE0F'
2515+emoji[man_in_lotus_position_medium_skin_tone_minimally]=$'\U1F9D8\U1F3FD\U200D\U2642'
2516+emoji[man_in_lotus_position_medium_dark_skin_tone]=$'\U1F9D8\U1F3FE\U200D\U2642\UFE0F'
2517+emoji[man_in_lotus_position_medium_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FE\U200D\U2642'
2518+emoji[man_in_lotus_position_dark_skin_tone]=$'\U1F9D8\U1F3FF\U200D\U2642\UFE0F'
2519+emoji[man_in_lotus_position_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FF\U200D\U2642'
2520+emoji[woman_in_lotus_position]=$'\U1F9D8\U200D\U2640\UFE0F'
2521+emoji[woman_in_lotus_position_minimally]=$'\U1F9D8\U200D\U2640'
2522+emoji[lotus_position_woman]=$'\U1F9D8\U200D\U2640'
2523+emoji[woman_in_lotus_position_light_skin_tone]=$'\U1F9D8\U1F3FB\U200D\U2640\UFE0F'
2524+emoji[woman_in_lotus_position_light_skin_tone_minimally]=$'\U1F9D8\U1F3FB\U200D\U2640'
2525+emoji[woman_in_lotus_position_medium_light_skin_tone]=$'\U1F9D8\U1F3FC\U200D\U2640\UFE0F'
2526+emoji[woman_in_lotus_position_medium_light_skin_tone_minimally]=$'\U1F9D8\U1F3FC\U200D\U2640'
2527+emoji[woman_in_lotus_position_medium_skin_tone]=$'\U1F9D8\U1F3FD\U200D\U2640\UFE0F'
2528+emoji[woman_in_lotus_position_medium_skin_tone_minimally]=$'\U1F9D8\U1F3FD\U200D\U2640'
2529+emoji[woman_in_lotus_position_medium_dark_skin_tone]=$'\U1F9D8\U1F3FE\U200D\U2640\UFE0F'
2530+emoji[woman_in_lotus_position_medium_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FE\U200D\U2640'
2531+emoji[woman_in_lotus_position_dark_skin_tone]=$'\U1F9D8\U1F3FF\U200D\U2640\UFE0F'
2532+emoji[woman_in_lotus_position_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FF\U200D\U2640'
2533+emoji[person_taking_bath]=$'\U1F6C0'
2534+emoji[bath]=$'\U1F6C0'
2535+emoji[person_taking_bath_light_skin_tone]=$'\U1F6C0\U1F3FB'
2536+emoji[person_taking_bath_medium_light_skin_tone]=$'\U1F6C0\U1F3FC'
2537+emoji[person_taking_bath_medium_skin_tone]=$'\U1F6C0\U1F3FD'
2538+emoji[person_taking_bath_medium_dark_skin_tone]=$'\U1F6C0\U1F3FE'
2539+emoji[person_taking_bath_dark_skin_tone]=$'\U1F6C0\U1F3FF'
2540+emoji[person_in_bed]=$'\U1F6CC'
2541+emoji[sleeping_bed]=$'\U1F6CC'
2542+emoji[person_in_bed_light_skin_tone]=$'\U1F6CC\U1F3FB'
2543+emoji[person_in_bed_medium_light_skin_tone]=$'\U1F6CC\U1F3FC'
2544+emoji[person_in_bed_medium_skin_tone]=$'\U1F6CC\U1F3FD'
2545+emoji[person_in_bed_medium_dark_skin_tone]=$'\U1F6CC\U1F3FE'
2546+emoji[person_in_bed_dark_skin_tone]=$'\U1F6CC\U1F3FF'
2547+emoji[people_holding_hands]=$'\U1F9D1\U200D\U1F91D\U200D\U1F9D1'
2548+emoji[people_holding_hands_light_skin_tone]=$'\U1F9D1\U1F3FB\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
2549+emoji[people_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FC\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
2550+emoji[people_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F9D1\U1F3FC\U200D\U1F91D\U200D\U1F9D1\U1F3FC'
2551+emoji[people_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FD\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
2552+emoji[people_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F9D1\U1F3FD\U200D\U1F91D\U200D\U1F9D1\U1F3FC'
2553+emoji[people_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F9D1\U1F3FD\U200D\U1F91D\U200D\U1F9D1\U1F3FD'
2554+emoji[people_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
2555+emoji[people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FC'
2556+emoji[people_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FD'
2557+emoji[people_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FE'
2558+emoji[people_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
2559+emoji[people_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FC'
2560+emoji[people_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FD'
2561+emoji[people_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FE'
2562+emoji[people_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FF'
2563+emoji[women_holding_hands]=$'\U1F46D'
2564+emoji[two_women_holding_hands]=$'\U1F46D'
2565+emoji[women_holding_hands_light_skin_tone]=$'\U1F46D\U1F3FB'
2566+emoji[women_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F469\U1F3FB'
2567+emoji[women_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F46D\U1F3FC'
2568+emoji[women_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F469\U1F3FB'
2569+emoji[women_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F469\U1F3FC'
2570+emoji[women_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F46D\U1F3FD'
2571+emoji[women_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F469\U1F3FB'
2572+emoji[women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F469\U1F3FC'
2573+emoji[women_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F469\U1F3FD'
2574+emoji[women_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F46D\U1F3FE'
2575+emoji[women_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FB'
2576+emoji[women_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FC'
2577+emoji[women_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FD'
2578+emoji[women_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FE'
2579+emoji[women_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F46D\U1F3FF'
2580+emoji[woman_and_man_holding_hands]=$'\U1F46B'
2581+emoji[couple]=$'\U1F46B'
2582+emoji[woman_and_man_holding_hands_light_skin_tone]=$'\U1F46B\U1F3FB'
2583+emoji[woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FC'
2584+emoji[woman_and_man_holding_hands_light_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FD'
2585+emoji[woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FE'
2586+emoji[woman_and_man_holding_hands_light_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FF'
2587+emoji[woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FB'
2588+emoji[woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F46B\U1F3FC'
2589+emoji[woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FD'
2590+emoji[woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FE'
2591+emoji[woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FF'
2592+emoji[woman_and_man_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FB'
2593+emoji[woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FC'
2594+emoji[woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F46B\U1F3FD'
2595+emoji[woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FE'
2596+emoji[woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FF'
2597+emoji[woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FB'
2598+emoji[woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FC'
2599+emoji[woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FD'
2600+emoji[woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F46B\U1F3FE'
2601+emoji[woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FF'
2602+emoji[woman_and_man_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FB'
2603+emoji[woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FC'
2604+emoji[woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FD'
2605+emoji[woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FE'
2606+emoji[woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F46B\U1F3FF'
2607+emoji[men_holding_hands]=$'\U1F46C'
2608+emoji[two_men_holding_hands]=$'\U1F46C'
2609+emoji[men_holding_hands_light_skin_tone]=$'\U1F46C\U1F3FB'
2610+emoji[men_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FB'
2611+emoji[men_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F46C\U1F3FC'
2612+emoji[men_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FB'
2613+emoji[men_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FC'
2614+emoji[men_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F46C\U1F3FD'
2615+emoji[men_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FB'
2616+emoji[men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FC'
2617+emoji[men_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FD'
2618+emoji[men_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F46C\U1F3FE'
2619+emoji[men_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FB'
2620+emoji[men_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FC'
2621+emoji[men_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FD'
2622+emoji[men_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FE'
2623+emoji[men_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F46C\U1F3FF'
2624+emoji[kiss]=$'\U1F48F'
2625+emoji[couplekiss]=$'\U1F48F'
2626+emoji[kiss_woman_man]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468'
2627+emoji[couplekiss_man_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468'
2628+emoji[kiss_woman_man_minimally]=$'\U1F469\U200D\U2764\U200D\U1F48B\U200D\U1F468'
2629+emoji[kiss_man_man]=$'\U1F468\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468'
2630+emoji[couplekiss_man_man]=$'\U1F468\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468'
2631+emoji[kiss_man_man_minimally]=$'\U1F468\U200D\U2764\U200D\U1F48B\U200D\U1F468'
2632+emoji[kiss_woman_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F469'
2633+emoji[couplekiss_woman_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F469'
2634+emoji[kiss_woman_woman_minimally]=$'\U1F469\U200D\U2764\U200D\U1F48B\U200D\U1F469'
2635+emoji[couple_with_heart]=$'\U1F491'
2636+emoji[couple_with_heart_woman_man]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F468'
2637+emoji[couple_with_heart_woman_man_minimally]=$'\U1F469\U200D\U2764\U200D\U1F468'
2638+emoji[couple_with_heart_man_man]=$'\U1F468\U200D\U2764\UFE0F\U200D\U1F468'
2639+emoji[couple_with_heart_man_man_minimally]=$'\U1F468\U200D\U2764\U200D\U1F468'
2640+emoji[couple_with_heart_woman_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F469'
2641+emoji[couple_with_heart_woman_woman_minimally]=$'\U1F469\U200D\U2764\U200D\U1F469'
2642+emoji[family]=$'\U1F46A'
2643+emoji[family_man_woman_boy]=$'\U1F468\U200D\U1F469\U200D\U1F466'
2644+emoji[family_man_woman_girl]=$'\U1F468\U200D\U1F469\U200D\U1F467'
2645+emoji[family_man_woman_girl_boy]=$'\U1F468\U200D\U1F469\U200D\U1F467\U200D\U1F466'
2646+emoji[family_man_woman_boy_boy]=$'\U1F468\U200D\U1F469\U200D\U1F466\U200D\U1F466'
2647+emoji[family_man_woman_girl_girl]=$'\U1F468\U200D\U1F469\U200D\U1F467\U200D\U1F467'
2648+emoji[family_man_man_boy]=$'\U1F468\U200D\U1F468\U200D\U1F466'
2649+emoji[family_man_man_girl]=$'\U1F468\U200D\U1F468\U200D\U1F467'
2650+emoji[family_man_man_girl_boy]=$'\U1F468\U200D\U1F468\U200D\U1F467\U200D\U1F466'
2651+emoji[family_man_man_boy_boy]=$'\U1F468\U200D\U1F468\U200D\U1F466\U200D\U1F466'
2652+emoji[family_man_man_girl_girl]=$'\U1F468\U200D\U1F468\U200D\U1F467\U200D\U1F467'
2653+emoji[family_woman_woman_boy]=$'\U1F469\U200D\U1F469\U200D\U1F466'
2654+emoji[family_woman_woman_girl]=$'\U1F469\U200D\U1F469\U200D\U1F467'
2655+emoji[family_woman_woman_girl_boy]=$'\U1F469\U200D\U1F469\U200D\U1F467\U200D\U1F466'
2656+emoji[family_woman_woman_boy_boy]=$'\U1F469\U200D\U1F469\U200D\U1F466\U200D\U1F466'
2657+emoji[family_woman_woman_girl_girl]=$'\U1F469\U200D\U1F469\U200D\U1F467\U200D\U1F467'
2658+emoji[family_man_boy]=$'\U1F468\U200D\U1F466'
2659+emoji[family_man_boy_boy]=$'\U1F468\U200D\U1F466\U200D\U1F466'
2660+emoji[family_man_girl]=$'\U1F468\U200D\U1F467'
2661+emoji[family_man_girl_boy]=$'\U1F468\U200D\U1F467\U200D\U1F466'
2662+emoji[family_man_girl_girl]=$'\U1F468\U200D\U1F467\U200D\U1F467'
2663+emoji[family_woman_boy]=$'\U1F469\U200D\U1F466'
2664+emoji[family_woman_boy_boy]=$'\U1F469\U200D\U1F466\U200D\U1F466'
2665+emoji[family_woman_girl]=$'\U1F469\U200D\U1F467'
2666+emoji[family_woman_girl_boy]=$'\U1F469\U200D\U1F467\U200D\U1F466'
2667+emoji[family_woman_girl_girl]=$'\U1F469\U200D\U1F467\U200D\U1F467'
2668+emoji[speaking_head]=$'\U1F5E3\UFE0F'
2669+emoji[speaking_head_unqualified]=$'\U1F5E3'
2670+emoji[bust_in_silhouette]=$'\U1F464'
2671+emoji[busts_in_silhouette]=$'\U1F465'
2672+emoji[footprints]=$'\U1F463'
2673+emoji_mod[light_skin_tone]=$'\U1F3FB'
2674+emoji_mod[medium_light_skin_tone]=$'\U1F3FC'
2675+emoji_mod[medium_skin_tone]=$'\U1F3FD'
2676+emoji_mod[medium_dark_skin_tone]=$'\U1F3FE'
2677+emoji_mod[medium_dark_skin_tone_1]=$'\U1F3FF'
2678+emoji_mod[red_hair]=$'\U1F9B0'
2679+emoji_mod[curly_hair]=$'\U1F9B1'
2680+emoji_mod[white_hair]=$'\U1F9B3'
2681+emoji_mod[bald]=$'\U1F9B2'
2682+emoji[monkey_face]=$'\U1F435'
2683+emoji[monkey_face_1]=$'\U1F412'
2684+emoji[monkey]=$'\U1F412'
2685+emoji[gorilla]=$'\U1F98D'
2686+emoji[orangutan]=$'\U1F9A7'
2687+emoji[dog_face]=$'\U1F436'
2688+emoji[dog]=$'\U1F436'
2689+emoji[dog_face_1]=$'\U1F415'
2690+emoji[dog2]=$'\U1F415'
2691+emoji[guide_dog]=$'\U1F9AE'
2692+emoji[service_dog]=$'\U1F415\U200D\U1F9BA'
2693+emoji[poodle]=$'\U1F429'
2694+emoji[wolf]=$'\U1F43A'
2695+emoji[fox]=$'\U1F98A'
2696+emoji[fox_face]=$'\U1F98A'
2697+emoji[raccoon]=$'\U1F99D'
2698+emoji[cat_face]=$'\U1F431'
2699+emoji[cat]=$'\U1F431'
2700+emoji[cat_face_1]=$'\U1F408'
2701+emoji[cat2]=$'\U1F408'
2702+emoji[lion]=$'\U1F981'
2703+emoji[tiger_face]=$'\U1F42F'
2704+emoji[tiger]=$'\U1F42F'
2705+emoji[tiger_face_1]=$'\U1F405'
2706+emoji[tiger2]=$'\U1F405'
2707+emoji[leopard]=$'\U1F406'
2708+emoji[horse_face]=$'\U1F434'
2709+emoji[horse]=$'\U1F434'
2710+emoji[horse_face_1]=$'\U1F40E'
2711+emoji[racehorse]=$'\U1F40E'
2712+emoji[unicorn]=$'\U1F984'
2713+emoji[zebra]=$'\U1F993'
2714+emoji[deer]=$'\U1F98C'
2715+emoji[cow_face]=$'\U1F42E'
2716+emoji[ox]=$'\U1F402'
2717+emoji[water_buffalo]=$'\U1F403'
2718+emoji[cow]=$'\U1F404'
2719+emoji[cow2]=$'\U1F404'
2720+emoji[pig_face]=$'\U1F437'
2721+emoji[pig]=$'\U1F437'
2722+emoji[pig_face_1]=$'\U1F416'
2723+emoji[pig2]=$'\U1F416'
2724+emoji[boar]=$'\U1F417'
2725+emoji[pig_nose]=$'\U1F43D'
2726+emoji[ram]=$'\U1F40F'
2727+emoji[ewe]=$'\U1F411'
2728+emoji[sheep]=$'\U1F411'
2729+emoji[goat]=$'\U1F410'
2730+emoji[camel]=$'\U1F42A'
2731+emoji[dromedary_camel]=$'\U1F42A'
2732+emoji[two_hump_camel]=$'\U1F42B'
2733+emoji[llama]=$'\U1F999'
2734+emoji[giraffe]=$'\U1F992'
2735+emoji[elephant]=$'\U1F418'
2736+emoji[rhinoceros]=$'\U1F98F'
2737+emoji[hippopotamus]=$'\U1F99B'
2738+emoji[mouse_face]=$'\U1F42D'
2739+emoji[mouse]=$'\U1F42D'
2740+emoji[mouse_face_1]=$'\U1F401'
2741+emoji[mouse2]=$'\U1F401'
2742+emoji[rat]=$'\U1F400'
2743+emoji[hamster]=$'\U1F439'
2744+emoji[rabbit_face]=$'\U1F430'
2745+emoji[rabbit]=$'\U1F430'
2746+emoji[rabbit_face_1]=$'\U1F407'
2747+emoji[rabbit2]=$'\U1F407'
2748+emoji[chipmunk]=$'\U1F43F\UFE0F'
2749+emoji[chipmunk_unqualified]=$'\U1F43F'
2750+emoji[hedgehog]=$'\U1F994'
2751+emoji[bat]=$'\U1F987'
2752+emoji[bear]=$'\U1F43B'
2753+emoji[koala]=$'\U1F428'
2754+emoji[panda]=$'\U1F43C'
2755+emoji[panda_face]=$'\U1F43C'
2756+emoji[sloth]=$'\U1F9A5'
2757+emoji[otter]=$'\U1F9A6'
2758+emoji[skunk]=$'\U1F9A8'
2759+emoji[kangaroo]=$'\U1F998'
2760+emoji[badger]=$'\U1F9A1'
2761+emoji[paw_prints]=$'\U1F43E'
2762+emoji[feet]=$'\U1F43E'
2763+emoji[turkey]=$'\U1F983'
2764+emoji[chicken]=$'\U1F414'
2765+emoji[rooster]=$'\U1F413'
2766+emoji[hatching_chick]=$'\U1F423'
2767+emoji[baby_chick]=$'\U1F424'
2768+emoji[front_facing_baby_chick]=$'\U1F425'
2769+emoji[hatched_chick]=$'\U1F425'
2770+emoji[bird]=$'\U1F426'
2771+emoji[penguin]=$'\U1F427'
2772+emoji[dove]=$'\U1F54A\UFE0F'
2773+emoji[dove_unqualified]=$'\U1F54A'
2774+emoji[eagle]=$'\U1F985'
2775+emoji[duck]=$'\U1F986'
2776+emoji[swan]=$'\U1F9A2'
2777+emoji[owl]=$'\U1F989'
2778+emoji[flamingo]=$'\U1F9A9'
2779+emoji[peacock]=$'\U1F99A'
2780+emoji[parrot]=$'\U1F99C'
2781+emoji[frog]=$'\U1F438'
2782+emoji[crocodile]=$'\U1F40A'
2783+emoji[turtle]=$'\U1F422'
2784+emoji[lizard]=$'\U1F98E'
2785+emoji[snake]=$'\U1F40D'
2786+emoji[dragon_face]=$'\U1F432'
2787+emoji[dragon_face_1]=$'\U1F409'
2788+emoji[dragon]=$'\U1F409'
2789+emoji[sauropod]=$'\U1F995'
2790+emoji[T_Rex]=$'\U1F996'
2791+emoji[t-rex]=$'\U1F996'
2792+emoji[spouting_whale]=$'\U1F433'
2793+emoji[whale]=$'\U1F433'
2794+emoji[spouting_whale_1]=$'\U1F40B'
2795+emoji[whale2]=$'\U1F40B'
2796+emoji[dolphin]=$'\U1F42C'
2797+emoji[flipper]=$'\U1F42C'
2798+emoji[fish]=$'\U1F41F'
2799+emoji[tropical_fish]=$'\U1F420'
2800+emoji[blowfish]=$'\U1F421'
2801+emoji[shark]=$'\U1F988'
2802+emoji[octopus]=$'\U1F419'
2803+emoji[spiral_shell]=$'\U1F41A'
2804+emoji[shell]=$'\U1F41A'
2805+emoji[snail]=$'\U1F40C'
2806+emoji[butterfly]=$'\U1F98B'
2807+emoji[bug]=$'\U1F41B'
2808+emoji[ant]=$'\U1F41C'
2809+emoji[honeybee]=$'\U1F41D'
2810+emoji[bee]=$'\U1F41D'
2811+emoji[lady_beetle]=$'\U1F41E'
2812+emoji[beetle]=$'\U1F41E'
2813+emoji[cricket]=$'\U1F997'
2814+emoji[spider]=$'\U1F577\UFE0F'
2815+emoji[spider_unqualified]=$'\U1F577'
2816+emoji[spider_web]=$'\U1F578\UFE0F'
2817+emoji[spider_web_unqualified]=$'\U1F578'
2818+emoji[scorpion]=$'\U1F982'
2819+emoji[mosquito]=$'\U1F99F'
2820+emoji[microbe]=$'\U1F9A0'
2821+emoji[bouquet]=$'\U1F490'
2822+emoji[cherry_blossom]=$'\U1F338'
2823+emoji[white_flower]=$'\U1F4AE'
2824+emoji[rosette]=$'\U1F3F5\UFE0F'
2825+emoji[rosette_unqualified]=$'\U1F3F5'
2826+emoji[rosette_unqualified_1]=$'\U1F339'
2827+emoji[rose]=$'\U1F339'
2828+emoji[wilted_flower]=$'\U1F940'
2829+emoji[hibiscus]=$'\U1F33A'
2830+emoji[sunflower]=$'\U1F33B'
2831+emoji[blossom]=$'\U1F33C'
2832+emoji[tulip]=$'\U1F337'
2833+emoji[seedling]=$'\U1F331'
2834+emoji[evergreen_tree]=$'\U1F332'
2835+emoji[deciduous_tree]=$'\U1F333'
2836+emoji[palm_tree]=$'\U1F334'
2837+emoji[cactus]=$'\U1F335'
2838+emoji[sheaf_of_rice]=$'\U1F33E'
2839+emoji[ear_of_rice]=$'\U1F33E'
2840+emoji[herb]=$'\U1F33F'
2841+emoji[shamrock]=$'\U2618\UFE0F'
2842+emoji[shamrock_unqualified]=$'\U2618'
2843+emoji[four_leaf_clover]=$'\U1F340'
2844+emoji[maple_leaf]=$'\U1F341'
2845+emoji[fallen_leaf]=$'\U1F342'
2846+emoji[leaf_fluttering_in_wind]=$'\U1F343'
2847+emoji[leaves]=$'\U1F343'
2848+emoji[grapes]=$'\U1F347'
2849+emoji[melon]=$'\U1F348'
2850+emoji[watermelon]=$'\U1F349'
2851+emoji[tangerine]=$'\U1F34A'
2852+emoji[orange]=$'\U1F34A'
2853+emoji[mandarin]=$'\U1F34A'
2854+emoji[lemon]=$'\U1F34B'
2855+emoji[banana]=$'\U1F34C'
2856+emoji[pineapple]=$'\U1F34D'
2857+emoji[mango]=$'\U1F96D'
2858+emoji[red_apple]=$'\U1F34E'
2859+emoji[apple]=$'\U1F34E'
2860+emoji[green_apple]=$'\U1F34F'
2861+emoji[pear]=$'\U1F350'
2862+emoji[peach]=$'\U1F351'
2863+emoji[cherries]=$'\U1F352'
2864+emoji[strawberry]=$'\U1F353'
2865+emoji[kiwi_fruit]=$'\U1F95D'
2866+emoji[tomato]=$'\U1F345'
2867+emoji[coconut]=$'\U1F965'
2868+emoji[avocado]=$'\U1F951'
2869+emoji[eggplant]=$'\U1F346'
2870+emoji[potato]=$'\U1F954'
2871+emoji[carrot]=$'\U1F955'
2872+emoji[ear_of_corn]=$'\U1F33D'
2873+emoji[corn]=$'\U1F33D'
2874+emoji[hot_pepper]=$'\U1F336\UFE0F'
2875+emoji[hot_pepper_unqualified]=$'\U1F336'
2876+emoji[cucumber]=$'\U1F952'
2877+emoji[leafy_green]=$'\U1F96C'
2878+emoji[broccoli]=$'\U1F966'
2879+emoji[garlic]=$'\U1F9C4'
2880+emoji[onion]=$'\U1F9C5'
2881+emoji[mushroom]=$'\U1F344'
2882+emoji[peanuts]=$'\U1F95C'
2883+emoji[chestnut]=$'\U1F330'
2884+emoji[bread]=$'\U1F35E'
2885+emoji[croissant]=$'\U1F950'
2886+emoji[baguette_bread]=$'\U1F956'
2887+emoji[pretzel]=$'\U1F968'
2888+emoji[bagel]=$'\U1F96F'
2889+emoji[pancakes]=$'\U1F95E'
2890+emoji[waffle]=$'\U1F9C7'
2891+emoji[cheese_wedge]=$'\U1F9C0'
2892+emoji[cheese]=$'\U1F9C0'
2893+emoji[meat_on_bone]=$'\U1F356'
2894+emoji[poultry_leg]=$'\U1F357'
2895+emoji[cut_of_meat]=$'\U1F969'
2896+emoji[bacon]=$'\U1F953'
2897+emoji[hamburger]=$'\U1F354'
2898+emoji[french_fries]=$'\U1F35F'
2899+emoji[fries]=$'\U1F35F'
2900+emoji[pizza]=$'\U1F355'
2901+emoji[hot_dog]=$'\U1F32D'
2902+emoji[hotdog]=$'\U1F32D'
2903+emoji[sandwich]=$'\U1F96A'
2904+emoji[taco]=$'\U1F32E'
2905+emoji[burrito]=$'\U1F32F'
2906+emoji[stuffed_flatbread]=$'\U1F959'
2907+emoji[falafel]=$'\U1F9C6'
2908+emoji[egg]=$'\U1F95A'
2909+emoji[cooking]=$'\U1F373'
2910+emoji[fried_egg]=$'\U1F373'
2911+emoji[shallow_pan_of_food]=$'\U1F958'
2912+emoji[pot_of_food]=$'\U1F372'
2913+emoji[stew]=$'\U1F372'
2914+emoji[bowl_with_spoon]=$'\U1F963'
2915+emoji[green_salad]=$'\U1F957'
2916+emoji[popcorn]=$'\U1F37F'
2917+emoji[butter]=$'\U1F9C8'
2918+emoji[salt]=$'\U1F9C2'
2919+emoji[canned_food]=$'\U1F96B'
2920+emoji[bento_box]=$'\U1F371'
2921+emoji[bento]=$'\U1F371'
2922+emoji[rice_cracker]=$'\U1F358'
2923+emoji[rice_ball]=$'\U1F359'
2924+emoji[cooked_rice]=$'\U1F35A'
2925+emoji[rice]=$'\U1F35A'
2926+emoji[curry_rice]=$'\U1F35B'
2927+emoji[curry]=$'\U1F35B'
2928+emoji[steaming_bowl]=$'\U1F35C'
2929+emoji[ramen]=$'\U1F35C'
2930+emoji[spaghetti]=$'\U1F35D'
2931+emoji[roasted_sweet_potato]=$'\U1F360'
2932+emoji[sweet_potato]=$'\U1F360'
2933+emoji[oden]=$'\U1F362'
2934+emoji[sushi]=$'\U1F363'
2935+emoji[fried_shrimp]=$'\U1F364'
2936+emoji[fish_cake_with_swirl]=$'\U1F365'
2937+emoji[fish_cake]=$'\U1F365'
2938+emoji[moon_cake]=$'\U1F96E'
2939+emoji[dango]=$'\U1F361'
2940+emoji[dumpling]=$'\U1F95F'
2941+emoji[fortune_cookie]=$'\U1F960'
2942+emoji[takeout_box]=$'\U1F961'
2943+emoji[crab]=$'\U1F980'
2944+emoji[lobster]=$'\U1F99E'
2945+emoji[shrimp]=$'\U1F990'
2946+emoji[squid]=$'\U1F991'
2947+emoji[oyster]=$'\U1F9AA'
2948+emoji[soft_ice_cream]=$'\U1F366'
2949+emoji[icecream]=$'\U1F366'
2950+emoji[shaved_ice]=$'\U1F367'
2951+emoji[ice_cream]=$'\U1F368'
2952+emoji[doughnut]=$'\U1F369'
2953+emoji[cookie]=$'\U1F36A'
2954+emoji[birthday_cake]=$'\U1F382'
2955+emoji[birthday]=$'\U1F382'
2956+emoji[shortcake]=$'\U1F370'
2957+emoji[cake]=$'\U1F370'
2958+emoji[cupcake]=$'\U1F9C1'
2959+emoji[pie]=$'\U1F967'
2960+emoji[chocolate_bar]=$'\U1F36B'
2961+emoji[candy]=$'\U1F36C'
2962+emoji[lollipop]=$'\U1F36D'
2963+emoji[custard]=$'\U1F36E'
2964+emoji[honey_pot]=$'\U1F36F'
2965+emoji[baby_bottle]=$'\U1F37C'
2966+emoji[glass_of_milk]=$'\U1F95B'
2967+emoji[milk_glass]=$'\U1F95B'
2968+emoji[hot_beverage]=$'\U2615'
2969+emoji[coffee]=$'\U2615'
2970+emoji[teacup_without_handle]=$'\U1F375'
2971+emoji[tea]=$'\U1F375'
2972+emoji[sake]=$'\U1F376'
2973+emoji[bottle_with_popping_cork]=$'\U1F37E'
2974+emoji[champagne]=$'\U1F37E'
2975+emoji[wine_glass]=$'\U1F377'
2976+emoji[cocktail_glass]=$'\U1F378'
2977+emoji[cocktail]=$'\U1F378'
2978+emoji[tropical_drink]=$'\U1F379'
2979+emoji[beer_mug]=$'\U1F37A'
2980+emoji[beer]=$'\U1F37A'
2981+emoji[clinking_beer_mugs]=$'\U1F37B'
2982+emoji[beers]=$'\U1F37B'
2983+emoji[clinking_glasses]=$'\U1F942'
2984+emoji[tumbler_glass]=$'\U1F943'
2985+emoji[cup_with_straw]=$'\U1F964'
2986+emoji[beverage_box]=$'\U1F9C3'
2987+emoji[mate]=$'\U1F9C9'
2988+emoji[ice_cube]=$'\U1F9CA'
2989+emoji[chopsticks]=$'\U1F962'
2990+emoji[fork_and_knife_with_plate]=$'\U1F37D\UFE0F'
2991+emoji[fork_and_knife_with_plate_unqualified]=$'\U1F37D'
2992+emoji[plate_with_cutlery]=$'\U1F37D'
2993+emoji[fork_and_knife_with_plate_unqualified_1]=$'\U1F374'
2994+emoji[fork_and_knife]=$'\U1F374'
2995+emoji[spoon]=$'\U1F944'
2996+emoji[kitchen_knife]=$'\U1F52A'
2997+emoji[hocho]=$'\U1F52A'
2998+emoji[knife]=$'\U1F52A'
2999+emoji[amphora]=$'\U1F3FA'
3000+emoji[globe_showing_Europe_Africa]=$'\U1F30D'
3001+emoji[earth_africa]=$'\U1F30D'
3002+emoji[globe_showing_Americas]=$'\U1F30E'
3003+emoji[earth_americas]=$'\U1F30E'
3004+emoji[globe_showing_Asia_Australia]=$'\U1F30F'
3005+emoji[earth_asia]=$'\U1F30F'
3006+emoji[globe_with_meridians]=$'\U1F310'
3007+emoji[world_map]=$'\U1F5FA\UFE0F'
3008+emoji[world_map_unqualified]=$'\U1F5FA'
3009+emoji[map_of_Japan]=$'\U1F5FE'
3010+emoji[japan]=$'\U1F5FE'
3011+emoji[compass]=$'\U1F9ED'
3012+emoji[snow_capped_mountain]=$'\U1F3D4\UFE0F'
3013+emoji[snow_capped_mountain_unqualified]=$'\U1F3D4'
3014+emoji[mountain_snow]=$'\U1F3D4'
3015+emoji[snow_capped_mountain_unqualified_1]=$'\U26F0\UFE0F'
3016+emoji[snow_capped_mountain_unqualified_2]=$'\U26F0'
3017+emoji[mountain]=$'\U26F0'
3018+emoji[volcano]=$'\U1F30B'
3019+emoji[mount_fuji]=$'\U1F5FB'
3020+emoji[camping]=$'\U1F3D5\UFE0F'
3021+emoji[camping_unqualified]=$'\U1F3D5'
3022+emoji[beach_with_umbrella]=$'\U1F3D6\UFE0F'
3023+emoji[beach_with_umbrella_unqualified]=$'\U1F3D6'
3024+emoji[beach_umbrella]=$'\U1F3D6'
3025+emoji[desert]=$'\U1F3DC\UFE0F'
3026+emoji[desert_unqualified]=$'\U1F3DC'
3027+emoji[desert_island]=$'\U1F3DD\UFE0F'
3028+emoji[desert_island_unqualified]=$'\U1F3DD'
3029+emoji[national_park]=$'\U1F3DE\UFE0F'
3030+emoji[national_park_unqualified]=$'\U1F3DE'
3031+emoji[stadium]=$'\U1F3DF\UFE0F'
3032+emoji[stadium_unqualified]=$'\U1F3DF'
3033+emoji[classical_building]=$'\U1F3DB\UFE0F'
3034+emoji[classical_building_unqualified]=$'\U1F3DB'
3035+emoji[building_construction]=$'\U1F3D7\UFE0F'
3036+emoji[building_construction_unqualified]=$'\U1F3D7'
3037+emoji[brick]=$'\U1F9F1'
3038+emoji[bricks]=$'\U1F9F1'
3039+emoji[houses]=$'\U1F3D8\UFE0F'
3040+emoji[houses_unqualified]=$'\U1F3D8'
3041+emoji[derelict_house]=$'\U1F3DA\UFE0F'
3042+emoji[derelict_house_unqualified]=$'\U1F3DA'
3043+emoji[derelict_house_unqualified_1]=$'\U1F3E0'
3044+emoji[house]=$'\U1F3E0'
3045+emoji[house_with_garden]=$'\U1F3E1'
3046+emoji[office_building]=$'\U1F3E2'
3047+emoji[office]=$'\U1F3E2'
3048+emoji[Japanese_post_office]=$'\U1F3E3'
3049+emoji[post_office]=$'\U1F3E3'
3050+emoji[Japanese_post_office_1]=$'\U1F3E4'
3051+emoji[european_post_office]=$'\U1F3E4'
3052+emoji[hospital]=$'\U1F3E5'
3053+emoji[bank]=$'\U1F3E6'
3054+emoji[hotel]=$'\U1F3E8'
3055+emoji[love_hotel]=$'\U1F3E9'
3056+emoji[convenience_store]=$'\U1F3EA'
3057+emoji[school]=$'\U1F3EB'
3058+emoji[department_store]=$'\U1F3EC'
3059+emoji[factory]=$'\U1F3ED'
3060+emoji[Japanese_castle]=$'\U1F3EF'
3061+emoji[japanese_castle]=$'\U1F3EF'
3062+emoji[Japanese_castle_1]=$'\U1F3F0'
3063+emoji[european_castle]=$'\U1F3F0'
3064+emoji[wedding]=$'\U1F492'
3065+emoji[Tokyo_tower]=$'\U1F5FC'
3066+emoji[tokyo_tower]=$'\U1F5FC'
3067+emoji[Statue_of_Liberty]=$'\U1F5FD'
3068+emoji[statue_of_liberty]=$'\U1F5FD'
3069+emoji[church]=$'\U26EA'
3070+emoji[mosque]=$'\U1F54C'
3071+emoji[hindu_temple]=$'\U1F6D5'
3072+emoji[synagogue]=$'\U1F54D'
3073+emoji[shinto_shrine]=$'\U26E9\UFE0F'
3074+emoji[shinto_shrine_unqualified]=$'\U26E9'
3075+emoji[kaaba]=$'\U1F54B'
3076+emoji[fountain]=$'\U26F2'
3077+emoji[tent]=$'\U26FA'
3078+emoji[foggy]=$'\U1F301'
3079+emoji[night_with_stars]=$'\U1F303'
3080+emoji[cityscape]=$'\U1F3D9\UFE0F'
3081+emoji[cityscape_unqualified]=$'\U1F3D9'
3082+emoji[sunrise_over_mountains]=$'\U1F304'
3083+emoji[sunrise_over_mountains_1]=$'\U1F305'
3084+emoji[sunrise]=$'\U1F305'
3085+emoji[cityscape_at_dusk]=$'\U1F306'
3086+emoji[city_sunset]=$'\U1F306'
3087+emoji[sunset]=$'\U1F307'
3088+emoji[city_sunrise]=$'\U1F307'
3089+emoji[bridge_at_night]=$'\U1F309'
3090+emoji[hot_springs]=$'\U2668\UFE0F'
3091+emoji[hotsprings]=$'\U2668\UFE0F'
3092+emoji[hot_springs_unqualified]=$'\U2668'
3093+emoji[carousel_horse]=$'\U1F3A0'
3094+emoji[ferris_wheel]=$'\U1F3A1'
3095+emoji[roller_coaster]=$'\U1F3A2'
3096+emoji[barber_pole]=$'\U1F488'
3097+emoji[barber]=$'\U1F488'
3098+emoji[circus_tent]=$'\U1F3AA'
3099+emoji[locomotive]=$'\U1F682'
3100+emoji[steam_locomotive]=$'\U1F682'
3101+emoji[railway_car]=$'\U1F683'
3102+emoji[high_speed_train]=$'\U1F684'
3103+emoji[bullettrain_side]=$'\U1F684'
3104+emoji[bullet_train]=$'\U1F685'
3105+emoji[bullettrain_front]=$'\U1F685'
3106+emoji[bullet_train_1]=$'\U1F686'
3107+emoji[train2]=$'\U1F686'
3108+emoji[metro]=$'\U1F687'
3109+emoji[light_rail]=$'\U1F688'
3110+emoji[station]=$'\U1F689'
3111+emoji[tram]=$'\U1F68A'
3112+emoji[monorail]=$'\U1F69D'
3113+emoji[mountain_railway]=$'\U1F69E'
3114+emoji[tram_car]=$'\U1F68B'
3115+emoji[train]=$'\U1F68B'
3116+emoji[bus]=$'\U1F68C'
3117+emoji[oncoming_bus]=$'\U1F68D'
3118+emoji[trolleybus]=$'\U1F68E'
3119+emoji[minibus]=$'\U1F690'
3120+emoji[ambulance]=$'\U1F691'
3121+emoji[fire_engine]=$'\U1F692'
3122+emoji[police_car]=$'\U1F693'
3123+emoji[oncoming_police_car]=$'\U1F694'
3124+emoji[taxi]=$'\U1F695'
3125+emoji[oncoming_taxi]=$'\U1F696'
3126+emoji[automobile]=$'\U1F697'
3127+emoji[car]=$'\U1F697'
3128+emoji[red_car]=$'\U1F697'
3129+emoji[oncoming_automobile]=$'\U1F698'
3130+emoji[sport_utility_vehicle]=$'\U1F699'
3131+emoji[blue_car]=$'\U1F699'
3132+emoji[delivery_truck]=$'\U1F69A'
3133+emoji[truck]=$'\U1F69A'
3134+emoji[articulated_lorry]=$'\U1F69B'
3135+emoji[tractor]=$'\U1F69C'
3136+emoji[racing_car]=$'\U1F3CE\UFE0F'
3137+emoji[racing_car_unqualified]=$'\U1F3CE'
3138+emoji[motorcycle]=$'\U1F3CD\UFE0F'
3139+emoji[motorcycle_unqualified]=$'\U1F3CD'
3140+emoji[motor_scooter]=$'\U1F6F5'
3141+emoji[manual_wheelchair]=$'\U1F9BD'
3142+emoji[motorized_wheelchair]=$'\U1F9BC'
3143+emoji[auto_rickshaw]=$'\U1F6FA'
3144+emoji[bicycle]=$'\U1F6B2'
3145+emoji[bike]=$'\U1F6B2'
3146+emoji[kick_scooter]=$'\U1F6F4'
3147+emoji[skateboard]=$'\U1F6F9'
3148+emoji[bus_stop]=$'\U1F68F'
3149+emoji[busstop]=$'\U1F68F'
3150+emoji[motorway]=$'\U1F6E3\UFE0F'
3151+emoji[motorway_unqualified]=$'\U1F6E3'
3152+emoji[railway_track]=$'\U1F6E4\UFE0F'
3153+emoji[railway_track_unqualified]=$'\U1F6E4'
3154+emoji[oil_drum]=$'\U1F6E2\UFE0F'
3155+emoji[oil_drum_unqualified]=$'\U1F6E2'
3156+emoji[fuel_pump]=$'\U26FD'
3157+emoji[fuelpump]=$'\U26FD'
3158+emoji[police_car_light]=$'\U1F6A8'
3159+emoji[rotating_light]=$'\U1F6A8'
3160+emoji[horizontal_traffic_light]=$'\U1F6A5'
3161+emoji[traffic_light]=$'\U1F6A5'
3162+emoji[vertical_traffic_light]=$'\U1F6A6'
3163+emoji[stop_sign]=$'\U1F6D1'
3164+emoji[construction]=$'\U1F6A7'
3165+emoji[anchor]=$'\U2693'
3166+emoji[sailboat]=$'\U26F5'
3167+emoji[boat]=$'\U26F5'
3168+emoji[canoe]=$'\U1F6F6'
3169+emoji[speedboat]=$'\U1F6A4'
3170+emoji[passenger_ship]=$'\U1F6F3\UFE0F'
3171+emoji[passenger_ship_unqualified]=$'\U1F6F3'
3172+emoji[ferry]=$'\U26F4\UFE0F'
3173+emoji[ferry_unqualified]=$'\U26F4'
3174+emoji[motor_boat]=$'\U1F6E5\UFE0F'
3175+emoji[motor_boat_unqualified]=$'\U1F6E5'
3176+emoji[ship]=$'\U1F6A2'
3177+emoji[airplane]=$'\U2708\UFE0F'
3178+emoji[airplane_unqualified]=$'\U2708'
3179+emoji[small_airplane]=$'\U1F6E9\UFE0F'
3180+emoji[small_airplane_unqualified]=$'\U1F6E9'
3181+emoji[airplane_departure]=$'\U1F6EB'
3182+emoji[flight_departure]=$'\U1F6EB'
3183+emoji[airplane_arrival]=$'\U1F6EC'
3184+emoji[flight_arrival]=$'\U1F6EC'
3185+emoji[parachute]=$'\U1FA82'
3186+emoji[seat]=$'\U1F4BA'
3187+emoji[helicopter]=$'\U1F681'
3188+emoji[suspension_railway]=$'\U1F69F'
3189+emoji[mountain_cableway]=$'\U1F6A0'
3190+emoji[aerial_tramway]=$'\U1F6A1'
3191+emoji[satellite]=$'\U1F6F0\UFE0F'
3192+emoji[satellite_unqualified]=$'\U1F6F0'
3193+emoji[artificial_satellite]=$'\U1F6F0'
3194+emoji[rocket]=$'\U1F680'
3195+emoji[flying_saucer]=$'\U1F6F8'
3196+emoji[bellhop_bell]=$'\U1F6CE\UFE0F'
3197+emoji[bellhop_bell_unqualified]=$'\U1F6CE'
3198+emoji[luggage]=$'\U1F9F3'
3199+emoji[hourglass_done]=$'\U231B'
3200+emoji[hourglass]=$'\U231B'
3201+emoji[hourglass_not_done]=$'\U23F3'
3202+emoji[hourglass_flowing_sand]=$'\U23F3'
3203+emoji[watch]=$'\U231A'
3204+emoji[alarm_clock]=$'\U23F0'
3205+emoji[stopwatch]=$'\U23F1\UFE0F'
3206+emoji[stopwatch_unqualified]=$'\U23F1'
3207+emoji[timer_clock]=$'\U23F2\UFE0F'
3208+emoji[timer_clock_unqualified]=$'\U23F2'
3209+emoji[mantelpiece_clock]=$'\U1F570\UFE0F'
3210+emoji[mantelpiece_clock_unqualified]=$'\U1F570'
3211+emoji[twelve_o_clock]=$'\U1F55B'
3212+emoji[clock12]=$'\U1F55B'
3213+emoji[twelve_thirty]=$'\U1F567'
3214+emoji[clock1230]=$'\U1F567'
3215+emoji[one_o_clock]=$'\U1F550'
3216+emoji[clock1]=$'\U1F550'
3217+emoji[one_thirty]=$'\U1F55C'
3218+emoji[clock130]=$'\U1F55C'
3219+emoji[two_o_clock]=$'\U1F551'
3220+emoji[clock2]=$'\U1F551'
3221+emoji[two_thirty]=$'\U1F55D'
3222+emoji[clock230]=$'\U1F55D'
3223+emoji[three_o_clock]=$'\U1F552'
3224+emoji[clock3]=$'\U1F552'
3225+emoji[three_thirty]=$'\U1F55E'
3226+emoji[clock330]=$'\U1F55E'
3227+emoji[four_o_clock]=$'\U1F553'
3228+emoji[clock4]=$'\U1F553'
3229+emoji[four_thirty]=$'\U1F55F'
3230+emoji[clock430]=$'\U1F55F'
3231+emoji[five_o_clock]=$'\U1F554'
3232+emoji[clock5]=$'\U1F554'
3233+emoji[five_thirty]=$'\U1F560'
3234+emoji[clock530]=$'\U1F560'
3235+emoji[six_o_clock]=$'\U1F555'
3236+emoji[clock6]=$'\U1F555'
3237+emoji[six_thirty]=$'\U1F561'
3238+emoji[clock630]=$'\U1F561'
3239+emoji[seven_o_clock]=$'\U1F556'
3240+emoji[clock7]=$'\U1F556'
3241+emoji[seven_thirty]=$'\U1F562'
3242+emoji[clock730]=$'\U1F562'
3243+emoji[eight_o_clock]=$'\U1F557'
3244+emoji[clock8]=$'\U1F557'
3245+emoji[eight_thirty]=$'\U1F563'
3246+emoji[clock830]=$'\U1F563'
3247+emoji[nine_o_clock]=$'\U1F558'
3248+emoji[clock9]=$'\U1F558'
3249+emoji[nine_thirty]=$'\U1F564'
3250+emoji[clock930]=$'\U1F564'
3251+emoji[ten_o_clock]=$'\U1F559'
3252+emoji[clock10]=$'\U1F559'
3253+emoji[ten_thirty]=$'\U1F565'
3254+emoji[clock1030]=$'\U1F565'
3255+emoji[eleven_o_clock]=$'\U1F55A'
3256+emoji[clock11]=$'\U1F55A'
3257+emoji[eleven_thirty]=$'\U1F566'
3258+emoji[clock1130]=$'\U1F566'
3259+emoji[new_moon]=$'\U1F311'
3260+emoji[waxing_crescent_moon]=$'\U1F312'
3261+emoji[first_quarter_moon]=$'\U1F313'
3262+emoji[waxing_gibbous_moon]=$'\U1F314'
3263+emoji[moon]=$'\U1F314'
3264+emoji[full_moon]=$'\U1F315'
3265+emoji[waning_gibbous_moon]=$'\U1F316'
3266+emoji[last_quarter_moon]=$'\U1F317'
3267+emoji[waning_crescent_moon]=$'\U1F318'
3268+emoji[waning_crescent_moon_1]=$'\U1F319'
3269+emoji[crescent_moon]=$'\U1F319'
3270+emoji[new_moon_face]=$'\U1F31A'
3271+emoji[new_moon_with_face]=$'\U1F31A'
3272+emoji[first_quarter_moon_face]=$'\U1F31B'
3273+emoji[first_quarter_moon_with_face]=$'\U1F31B'
3274+emoji[last_quarter_moon_face]=$'\U1F31C'
3275+emoji[last_quarter_moon_with_face]=$'\U1F31C'
3276+emoji[thermometer]=$'\U1F321\UFE0F'
3277+emoji[thermometer_unqualified]=$'\U1F321'
3278+emoji[sun]=$'\U2600\UFE0F'
3279+emoji[sunny]=$'\U2600\UFE0F'
3280+emoji[sun_unqualified]=$'\U2600'
3281+emoji[full_moon_face]=$'\U1F31D'
3282+emoji[full_moon_with_face]=$'\U1F31D'
3283+emoji[sun_with_face]=$'\U1F31E'
3284+emoji[ringed_planet]=$'\U1FA90'
3285+emoji[star]=$'\U2B50'
3286+emoji[glowing_star]=$'\U1F31F'
3287+emoji[star2]=$'\U1F31F'
3288+emoji[shooting_star]=$'\U1F320'
3289+emoji[stars]=$'\U1F320'
3290+emoji[milky_way]=$'\U1F30C'
3291+emoji[cloud]=$'\U2601\UFE0F'
3292+emoji[cloud_unqualified]=$'\U2601'
3293+emoji[sun_behind_cloud]=$'\U26C5'
3294+emoji[partly_sunny]=$'\U26C5'
3295+emoji[cloud_with_lightning_and_rain]=$'\U26C8\UFE0F'
3296+emoji[cloud_with_lightning_and_rain_unqualified]=$'\U26C8'
3297+emoji[sun_behind_small_cloud]=$'\U1F324\UFE0F'
3298+emoji[sun_behind_small_cloud_unqualified]=$'\U1F324'
3299+emoji[sun_behind_large_cloud]=$'\U1F325\UFE0F'
3300+emoji[sun_behind_large_cloud_unqualified]=$'\U1F325'
3301+emoji[sun_behind_rain_cloud]=$'\U1F326\UFE0F'
3302+emoji[sun_behind_rain_cloud_unqualified]=$'\U1F326'
3303+emoji[cloud_with_rain]=$'\U1F327\UFE0F'
3304+emoji[cloud_with_rain_unqualified]=$'\U1F327'
3305+emoji[cloud_with_snow]=$'\U1F328\UFE0F'
3306+emoji[cloud_with_snow_unqualified]=$'\U1F328'
3307+emoji[cloud_with_lightning]=$'\U1F329\UFE0F'
3308+emoji[cloud_with_lightning_unqualified]=$'\U1F329'
3309+emoji[tornado]=$'\U1F32A\UFE0F'
3310+emoji[tornado_unqualified]=$'\U1F32A'
3311+emoji[fog]=$'\U1F32B\UFE0F'
3312+emoji[fog_unqualified]=$'\U1F32B'
3313+emoji[wind_face]=$'\U1F32C\UFE0F'
3314+emoji[wind_face_unqualified]=$'\U1F32C'
3315+emoji[cyclone]=$'\U1F300'
3316+emoji[rainbow]=$'\U1F308'
3317+emoji[closed_umbrella]=$'\U1F302'
3318+emoji[closed_umbrella_1]=$'\U2602\UFE0F'
3319+emoji[open_umbrella]=$'\U2602\UFE0F'
3320+emoji[umbrella_unqualified]=$'\U2602'
3321+emoji[umbrella_with_rain_drops]=$'\U2614'
3322+emoji[umbrella]=$'\U2614'
3323+emoji[umbrella_on_ground]=$'\U26F1\UFE0F'
3324+emoji[umbrella_on_ground_unqualified]=$'\U26F1'
3325+emoji[parasol_on_ground]=$'\U26F1'
3326+emoji[high_voltage]=$'\U26A1'
3327+emoji[zap]=$'\U26A1'
3328+emoji[snowflake]=$'\U2744\UFE0F'
3329+emoji[snowflake_unqualified]=$'\U2744'
3330+emoji[snowman]=$'\U2603\UFE0F'
3331+emoji[snowman_with_snow]=$'\U2603\UFE0F'
3332+emoji[snowman_unqualified]=$'\U2603'
3333+emoji[snowman_without_snow]=$'\U26C4'
3334+emoji[comet]=$'\U2604\UFE0F'
3335+emoji[comet_unqualified]=$'\U2604'
3336+emoji[fire]=$'\U1F525'
3337+emoji[droplet]=$'\U1F4A7'
3338+emoji[water_wave]=$'\U1F30A'
3339+emoji[ocean]=$'\U1F30A'
3340+emoji[jack_o_lantern]=$'\U1F383'
3341+emoji[Christmas_tree]=$'\U1F384'
3342+emoji[christmas_tree]=$'\U1F384'
3343+emoji[fireworks]=$'\U1F386'
3344+emoji[sparkler]=$'\U1F387'
3345+emoji[firecracker]=$'\U1F9E8'
3346+emoji[sparkles]=$'\U2728'
3347+emoji[balloon]=$'\U1F388'
3348+emoji[party_popper]=$'\U1F389'
3349+emoji[tada]=$'\U1F389'
3350+emoji[confetti_ball]=$'\U1F38A'
3351+emoji[tanabata_tree]=$'\U1F38B'
3352+emoji[pine_decoration]=$'\U1F38D'
3353+emoji[bamboo]=$'\U1F38D'
3354+emoji[Japanese_dolls]=$'\U1F38E'
3355+emoji[dolls]=$'\U1F38E'
3356+emoji[carp_streamer]=$'\U1F38F'
3357+emoji[flags]=$'\U1F38F'
3358+emoji[wind_chime]=$'\U1F390'
3359+emoji[moon_viewing_ceremony]=$'\U1F391'
3360+emoji[rice_scene]=$'\U1F391'
3361+emoji[red_envelope]=$'\U1F9E7'
3362+emoji[ribbon]=$'\U1F380'
3363+emoji[wrapped_gift]=$'\U1F381'
3364+emoji[gift]=$'\U1F381'
3365+emoji[reminder_ribbon]=$'\U1F397\UFE0F'
3366+emoji[reminder_ribbon_unqualified]=$'\U1F397'
3367+emoji[admission_tickets]=$'\U1F39F\UFE0F'
3368+emoji[admission_tickets_unqualified]=$'\U1F39F'
3369+emoji[tickets]=$'\U1F39F'
3370+emoji[admission_tickets_unqualified_1]=$'\U1F3AB'
3371+emoji[ticket]=$'\U1F3AB'
3372+emoji[military_medal]=$'\U1F396\UFE0F'
3373+emoji[military_medal_unqualified]=$'\U1F396'
3374+emoji[medal_military]=$'\U1F396'
3375+emoji[trophy]=$'\U1F3C6'
3376+emoji[sports_medal]=$'\U1F3C5'
3377+emoji[medal_sports]=$'\U1F3C5'
3378+emoji[1st_place_medal]=$'\U1F947'
3379+emoji[2nd_place_medal]=$'\U1F948'
3380+emoji[3rd_place_medal]=$'\U1F949'
3381+emoji[soccer_ball]=$'\U26BD'
3382+emoji[soccer]=$'\U26BD'
3383+emoji[baseball]=$'\U26BE'
3384+emoji[softball]=$'\U1F94E'
3385+emoji[basketball]=$'\U1F3C0'
3386+emoji[volleyball]=$'\U1F3D0'
3387+emoji[american_football]=$'\U1F3C8'
3388+emoji[football]=$'\U1F3C8'
3389+emoji[rugby_football]=$'\U1F3C9'
3390+emoji[tennis]=$'\U1F3BE'
3391+emoji[flying_disc]=$'\U1F94F'
3392+emoji[bowling]=$'\U1F3B3'
3393+emoji[cricket_game]=$'\U1F3CF'
3394+emoji[field_hockey]=$'\U1F3D1'
3395+emoji[ice_hockey]=$'\U1F3D2'
3396+emoji[lacrosse]=$'\U1F94D'
3397+emoji[ping_pong]=$'\U1F3D3'
3398+emoji[badminton]=$'\U1F3F8'
3399+emoji[boxing_glove]=$'\U1F94A'
3400+emoji[martial_arts_uniform]=$'\U1F94B'
3401+emoji[goal_net]=$'\U1F945'
3402+emoji[flag_in_hole]=$'\U26F3'
3403+emoji[golf]=$'\U26F3'
3404+emoji[ice_skate]=$'\U26F8\UFE0F'
3405+emoji[ice_skate_unqualified]=$'\U26F8'
3406+emoji[fishing_pole]=$'\U1F3A3'
3407+emoji[fishing_pole_and_fish]=$'\U1F3A3'
3408+emoji[diving_mask]=$'\U1F93F'
3409+emoji[running_shirt]=$'\U1F3BD'
3410+emoji[running_shirt_with_sash]=$'\U1F3BD'
3411+emoji[skis]=$'\U1F3BF'
3412+emoji[ski]=$'\U1F3BF'
3413+emoji[sled]=$'\U1F6F7'
3414+emoji[curling_stone]=$'\U1F94C'
3415+emoji[direct_hit]=$'\U1F3AF'
3416+emoji[dart]=$'\U1F3AF'
3417+emoji[yo_yo]=$'\U1FA80'
3418+emoji[kite]=$'\U1FA81'
3419+emoji[pool_8_ball]=$'\U1F3B1'
3420+emoji[8ball]=$'\U1F3B1'
3421+emoji[crystal_ball]=$'\U1F52E'
3422+emoji[nazar_amulet]=$'\U1F9FF'
3423+emoji[video_game]=$'\U1F3AE'
3424+emoji[joystick]=$'\U1F579\UFE0F'
3425+emoji[joystick_unqualified]=$'\U1F579'
3426+emoji[slot_machine]=$'\U1F3B0'
3427+emoji[game_die]=$'\U1F3B2'
3428+emoji[puzzle_piece]=$'\U1F9E9'
3429+emoji[jigsaw]=$'\U1F9E9'
3430+emoji[teddy_bear]=$'\U1F9F8'
3431+emoji[spade_suit]=$'\U2660\UFE0F'
3432+emoji[spades]=$'\U2660\UFE0F'
3433+emoji[spade_suit_unqualified]=$'\U2660'
3434+emoji[heart_suit]=$'\U2665\UFE0F'
3435+emoji[hearts]=$'\U2665\UFE0F'
3436+emoji[heart_suit_unqualified]=$'\U2665'
3437+emoji[diamond_suit]=$'\U2666\UFE0F'
3438+emoji[diamonds]=$'\U2666\UFE0F'
3439+emoji[diamond_suit_unqualified]=$'\U2666'
3440+emoji[club_suit]=$'\U2663\UFE0F'
3441+emoji[clubs]=$'\U2663\UFE0F'
3442+emoji[club_suit_unqualified]=$'\U2663'
3443+emoji[chess_pawn]=$'\U265F\UFE0F'
3444+emoji[chess_pawn_unqualified]=$'\U265F'
3445+emoji[joker]=$'\U1F0CF'
3446+emoji[black_joker]=$'\U1F0CF'
3447+emoji[mahjong_red_dragon]=$'\U1F004'
3448+emoji[mahjong]=$'\U1F004'
3449+emoji[flower_playing_cards]=$'\U1F3B4'
3450+emoji[performing_arts]=$'\U1F3AD'
3451+emoji[framed_picture]=$'\U1F5BC\UFE0F'
3452+emoji[framed_picture_unqualified]=$'\U1F5BC'
3453+emoji[artist_palette]=$'\U1F3A8'
3454+emoji[art]=$'\U1F3A8'
3455+emoji[thread]=$'\U1F9F5'
3456+emoji[yarn]=$'\U1F9F6'
3457+emoji[glasses]=$'\U1F453'
3458+emoji[eyeglasses]=$'\U1F453'
3459+emoji[sunglasses]=$'\U1F576\UFE0F'
3460+emoji[sunglasses_unqualified]=$'\U1F576'
3461+emoji[dark_sunglasses]=$'\U1F576'
3462+emoji[goggles]=$'\U1F97D'
3463+emoji[lab_coat]=$'\U1F97C'
3464+emoji[safety_vest]=$'\U1F9BA'
3465+emoji[necktie]=$'\U1F454'
3466+emoji[t_shirt]=$'\U1F455'
3467+emoji[shirt]=$'\U1F455'
3468+emoji[tshirt]=$'\U1F455'
3469+emoji[jeans]=$'\U1F456'
3470+emoji[scarf]=$'\U1F9E3'
3471+emoji[gloves]=$'\U1F9E4'
3472+emoji[coat]=$'\U1F9E5'
3473+emoji[socks]=$'\U1F9E6'
3474+emoji[dress]=$'\U1F457'
3475+emoji[kimono]=$'\U1F458'
3476+emoji[sari]=$'\U1F97B'
3477+emoji[one_piece_swimsuit]=$'\U1FA71'
3478+emoji[swim_brief]=$'\U1FA72'
3479+emoji[shorts]=$'\U1FA73'
3480+emoji[bikini]=$'\U1F459'
3481+emoji[woman_s_clothes]=$'\U1F45A'
3482+emoji[womans_clothes]=$'\U1F45A'
3483+emoji[purse]=$'\U1F45B'
3484+emoji[handbag]=$'\U1F45C'
3485+emoji[clutch_bag]=$'\U1F45D'
3486+emoji[pouch]=$'\U1F45D'
3487+emoji[shopping_bags]=$'\U1F6CD\UFE0F'
3488+emoji[shopping_bags_unqualified]=$'\U1F6CD'
3489+emoji[shopping]=$'\U1F6CD'
3490+emoji[backpack]=$'\U1F392'
3491+emoji[school_satchel]=$'\U1F392'
3492+emoji[man_s_shoe]=$'\U1F45E'
3493+emoji[mans_shoe]=$'\U1F45E'
3494+emoji[shoe]=$'\U1F45E'
3495+emoji[running_shoe]=$'\U1F45F'
3496+emoji[athletic_shoe]=$'\U1F45F'
3497+emoji[hiking_boot]=$'\U1F97E'
3498+emoji[flat_shoe]=$'\U1F97F'
3499+emoji[high_heeled_shoe]=$'\U1F460'
3500+emoji[high_heel]=$'\U1F460'
3501+emoji[woman_s_sandal]=$'\U1F461'
3502+emoji[sandal]=$'\U1F461'
3503+emoji[ballet_shoes]=$'\U1FA70'
3504+emoji[woman_s_boot]=$'\U1F462'
3505+emoji[boot]=$'\U1F462'
3506+emoji[crown]=$'\U1F451'
3507+emoji[woman_s_hat]=$'\U1F452'
3508+emoji[womans_hat]=$'\U1F452'
3509+emoji[top_hat]=$'\U1F3A9'
3510+emoji[tophat]=$'\U1F3A9'
3511+emoji[graduation_cap]=$'\U1F393'
3512+emoji[mortar_board]=$'\U1F393'
3513+emoji[billed_cap]=$'\U1F9E2'
3514+emoji[rescue_worker_s_helmet]=$'\U26D1\UFE0F'
3515+emoji[rescue_worker_s_helmet_unqualified]=$'\U26D1'
3516+emoji[rescue_worker_helmet]=$'\U26D1'
3517+emoji[prayer_beads]=$'\U1F4FF'
3518+emoji[lipstick]=$'\U1F484'
3519+emoji[ring]=$'\U1F48D'
3520+emoji[gem_stone]=$'\U1F48E'
3521+emoji[gem]=$'\U1F48E'
3522+emoji[muted_speaker]=$'\U1F507'
3523+emoji[mute]=$'\U1F507'
3524+emoji[speaker_low_volume]=$'\U1F508'
3525+emoji[speaker]=$'\U1F508'
3526+emoji[speaker_medium_volume]=$'\U1F509'
3527+emoji[sound]=$'\U1F509'
3528+emoji[speaker_high_volume]=$'\U1F50A'
3529+emoji[loud_sound]=$'\U1F50A'
3530+emoji[loudspeaker]=$'\U1F4E2'
3531+emoji[megaphone]=$'\U1F4E3'
3532+emoji[mega]=$'\U1F4E3'
3533+emoji[postal_horn]=$'\U1F4EF'
3534+emoji[bell]=$'\U1F514'
3535+emoji[bell_with_slash]=$'\U1F515'
3536+emoji[no_bell]=$'\U1F515'
3537+emoji[musical_score]=$'\U1F3BC'
3538+emoji[musical_note]=$'\U1F3B5'
3539+emoji[musical_notes]=$'\U1F3B6'
3540+emoji[notes]=$'\U1F3B6'
3541+emoji[studio_microphone]=$'\U1F399\UFE0F'
3542+emoji[studio_microphone_unqualified]=$'\U1F399'
3543+emoji[level_slider]=$'\U1F39A\UFE0F'
3544+emoji[level_slider_unqualified]=$'\U1F39A'
3545+emoji[control_knobs]=$'\U1F39B\UFE0F'
3546+emoji[control_knobs_unqualified]=$'\U1F39B'
3547+emoji[microphone]=$'\U1F3A4'
3548+emoji[headphone]=$'\U1F3A7'
3549+emoji[headphones]=$'\U1F3A7'
3550+emoji[radio]=$'\U1F4FB'
3551+emoji[saxophone]=$'\U1F3B7'
3552+emoji[guitar]=$'\U1F3B8'
3553+emoji[musical_keyboard]=$'\U1F3B9'
3554+emoji[trumpet]=$'\U1F3BA'
3555+emoji[violin]=$'\U1F3BB'
3556+emoji[banjo]=$'\U1FA95'
3557+emoji[drum]=$'\U1F941'
3558+emoji[mobile_phone]=$'\U1F4F1'
3559+emoji[iphone]=$'\U1F4F1'
3560+emoji[mobile_phone_with_arrow]=$'\U1F4F2'
3561+emoji[calling]=$'\U1F4F2'
3562+emoji[telephone]=$'\U260E\UFE0F'
3563+emoji[phone]=$'\U260E\UFE0F'
3564+emoji[telephone_unqualified]=$'\U260E'
3565+emoji[telephone_receiver]=$'\U1F4DE'
3566+emoji[pager]=$'\U1F4DF'
3567+emoji[fax_machine]=$'\U1F4E0'
3568+emoji[fax]=$'\U1F4E0'
3569+emoji[battery]=$'\U1F50B'
3570+emoji[electric_plug]=$'\U1F50C'
3571+emoji[laptop_computer]=$'\U1F4BB'
3572+emoji[computer]=$'\U1F4BB'
3573+emoji[desktop_computer]=$'\U1F5A5\UFE0F'
3574+emoji[desktop_computer_unqualified]=$'\U1F5A5'
3575+emoji[printer]=$'\U1F5A8\UFE0F'
3576+emoji[printer_unqualified]=$'\U1F5A8'
3577+emoji[keyboard]=$'\U2328\UFE0F'
3578+emoji[keyboard_unqualified]=$'\U2328'
3579+emoji[computer_mouse]=$'\U1F5B1\UFE0F'
3580+emoji[computer_mouse_unqualified]=$'\U1F5B1'
3581+emoji[trackball]=$'\U1F5B2\UFE0F'
3582+emoji[trackball_unqualified]=$'\U1F5B2'
3583+emoji[computer_disk]=$'\U1F4BD'
3584+emoji[minidisc]=$'\U1F4BD'
3585+emoji[floppy_disk]=$'\U1F4BE'
3586+emoji[optical_disk]=$'\U1F4BF'
3587+emoji[cd]=$'\U1F4BF'
3588+emoji[dvd]=$'\U1F4C0'
3589+emoji[abacus]=$'\U1F9EE'
3590+emoji[movie_camera]=$'\U1F3A5'
3591+emoji[film_frames]=$'\U1F39E\UFE0F'
3592+emoji[film_frames_unqualified]=$'\U1F39E'
3593+emoji[film_strip]=$'\U1F39E'
3594+emoji[film_projector]=$'\U1F4FD\UFE0F'
3595+emoji[film_projector_unqualified]=$'\U1F4FD'
3596+emoji[clapper_board]=$'\U1F3AC'
3597+emoji[clapper]=$'\U1F3AC'
3598+emoji[television]=$'\U1F4FA'
3599+emoji[tv]=$'\U1F4FA'
3600+emoji[camera]=$'\U1F4F7'
3601+emoji[camera_with_flash]=$'\U1F4F8'
3602+emoji[camera_flash]=$'\U1F4F8'
3603+emoji[video_camera]=$'\U1F4F9'
3604+emoji[videocassette]=$'\U1F4FC'
3605+emoji[vhs]=$'\U1F4FC'
3606+emoji[magnifying_glass_tilted_left]=$'\U1F50D'
3607+emoji[mag]=$'\U1F50D'
3608+emoji[magnifying_glass_tilted_right]=$'\U1F50E'
3609+emoji[mag_right]=$'\U1F50E'
3610+emoji[candle]=$'\U1F56F\UFE0F'
3611+emoji[candle_unqualified]=$'\U1F56F'
3612+emoji[light_bulb]=$'\U1F4A1'
3613+emoji[bulb]=$'\U1F4A1'
3614+emoji[flashlight]=$'\U1F526'
3615+emoji[red_paper_lantern]=$'\U1F3EE'
3616+emoji[izakaya_lantern]=$'\U1F3EE'
3617+emoji[lantern]=$'\U1F3EE'
3618+emoji[diya_lamp]=$'\U1FA94'
3619+emoji[notebook_with_decorative_cover]=$'\U1F4D4'
3620+emoji[closed_book]=$'\U1F4D5'
3621+emoji[open_book]=$'\U1F4D6'
3622+emoji[book]=$'\U1F4D6'
3623+emoji[green_book]=$'\U1F4D7'
3624+emoji[blue_book]=$'\U1F4D8'
3625+emoji[orange_book]=$'\U1F4D9'
3626+emoji[books]=$'\U1F4DA'
3627+emoji[notebook]=$'\U1F4D3'
3628+emoji[ledger]=$'\U1F4D2'
3629+emoji[page_with_curl]=$'\U1F4C3'
3630+emoji[scroll]=$'\U1F4DC'
3631+emoji[page_facing_up]=$'\U1F4C4'
3632+emoji[newspaper]=$'\U1F4F0'
3633+emoji[rolled_up_newspaper]=$'\U1F5DE\UFE0F'
3634+emoji[rolled_up_newspaper_unqualified]=$'\U1F5DE'
3635+emoji[newspaper_roll]=$'\U1F5DE'
3636+emoji[bookmark_tabs]=$'\U1F4D1'
3637+emoji[bookmark_tabs_1]=$'\U1F516'
3638+emoji[bookmark]=$'\U1F516'
3639+emoji[label]=$'\U1F3F7\UFE0F'
3640+emoji[label_unqualified]=$'\U1F3F7'
3641+emoji[money_bag]=$'\U1F4B0'
3642+emoji[moneybag]=$'\U1F4B0'
3643+emoji[yen_banknote]=$'\U1F4B4'
3644+emoji[yen]=$'\U1F4B4'
3645+emoji[dollar_banknote]=$'\U1F4B5'
3646+emoji[dollar]=$'\U1F4B5'
3647+emoji[euro_banknote]=$'\U1F4B6'
3648+emoji[euro]=$'\U1F4B6'
3649+emoji[pound_banknote]=$'\U1F4B7'
3650+emoji[pound]=$'\U1F4B7'
3651+emoji[money_with_wings]=$'\U1F4B8'
3652+emoji[credit_card]=$'\U1F4B3'
3653+emoji[receipt]=$'\U1F9FE'
3654+emoji[chart_increasing_with_yen]=$'\U1F4B9'
3655+emoji[chart]=$'\U1F4B9'
3656+emoji[currency_exchange]=$'\U1F4B1'
3657+emoji[heavy_dollar_sign]=$'\U1F4B2'
3658+emoji[envelope]=$'\U2709\UFE0F'
3659+emoji[email]=$'\U2709\UFE0F'
3660+emoji[envelope_unqualified]=$'\U2709'
3661+emoji[e_mail]=$'\U1F4E7'
3662+emoji[e-mail]=$'\U1F4E7'
3663+emoji[incoming_envelope]=$'\U1F4E8'
3664+emoji[envelope_with_arrow]=$'\U1F4E9'
3665+emoji[outbox_tray]=$'\U1F4E4'
3666+emoji[inbox_tray]=$'\U1F4E5'
3667+emoji[package]=$'\U1F4E6'
3668+emoji[closed_mailbox_with_raised_flag]=$'\U1F4EB'
3669+emoji[mailbox]=$'\U1F4EB'
3670+emoji[closed_mailbox_with_lowered_flag]=$'\U1F4EA'
3671+emoji[mailbox_closed]=$'\U1F4EA'
3672+emoji[open_mailbox_with_raised_flag]=$'\U1F4EC'
3673+emoji[mailbox_with_mail]=$'\U1F4EC'
3674+emoji[open_mailbox_with_lowered_flag]=$'\U1F4ED'
3675+emoji[mailbox_with_no_mail]=$'\U1F4ED'
3676+emoji[postbox]=$'\U1F4EE'
3677+emoji[ballot_box_with_ballot]=$'\U1F5F3\UFE0F'
3678+emoji[ballot_box_with_ballot_unqualified]=$'\U1F5F3'
3679+emoji[ballot_box]=$'\U1F5F3'
3680+emoji[pencil]=$'\U270F\UFE0F'
3681+emoji[pencil2]=$'\U270F\UFE0F'
3682+emoji[pencil_unqualified]=$'\U270F'
3683+emoji[black_nib]=$'\U2712\UFE0F'
3684+emoji[black_nib_unqualified]=$'\U2712'
3685+emoji[fountain_pen]=$'\U1F58B\UFE0F'
3686+emoji[fountain_pen_unqualified]=$'\U1F58B'
3687+emoji[fountain_pen_unqualified_1]=$'\U1F58A\UFE0F'
3688+emoji[fountain_pen_unqualified_2]=$'\U1F58A'
3689+emoji[pen]=$'\U1F58A'
3690+emoji[paintbrush]=$'\U1F58C\UFE0F'
3691+emoji[paintbrush_unqualified]=$'\U1F58C'
3692+emoji[crayon]=$'\U1F58D\UFE0F'
3693+emoji[crayon_unqualified]=$'\U1F58D'
3694+emoji[memo]=$'\U1F4DD'
3695+emoji[briefcase]=$'\U1F4BC'
3696+emoji[file_folder]=$'\U1F4C1'
3697+emoji[open_file_folder]=$'\U1F4C2'
3698+emoji[card_index_dividers]=$'\U1F5C2\UFE0F'
3699+emoji[card_index_dividers_unqualified]=$'\U1F5C2'
3700+emoji[calendar]=$'\U1F4C5'
3701+emoji[date]=$'\U1F4C5'
3702+emoji[tear_off_calendar]=$'\U1F4C6'
3703+emoji[spiral_notepad]=$'\U1F5D2\UFE0F'
3704+emoji[spiral_notepad_unqualified]=$'\U1F5D2'
3705+emoji[spiral_calendar]=$'\U1F5D3\UFE0F'
3706+emoji[spiral_calendar_unqualified]=$'\U1F5D3'
3707+emoji[card_index]=$'\U1F4C7'
3708+emoji[chart_increasing]=$'\U1F4C8'
3709+emoji[chart_with_upwards_trend]=$'\U1F4C8'
3710+emoji[chart_decreasing]=$'\U1F4C9'
3711+emoji[chart_with_downwards_trend]=$'\U1F4C9'
3712+emoji[bar_chart]=$'\U1F4CA'
3713+emoji[clipboard]=$'\U1F4CB'
3714+emoji[pushpin]=$'\U1F4CC'
3715+emoji[round_pushpin]=$'\U1F4CD'
3716+emoji[paperclip]=$'\U1F4CE'
3717+emoji[linked_paperclips]=$'\U1F587\UFE0F'
3718+emoji[linked_paperclips_unqualified]=$'\U1F587'
3719+emoji[paperclips]=$'\U1F587'
3720+emoji[straight_ruler]=$'\U1F4CF'
3721+emoji[triangular_ruler]=$'\U1F4D0'
3722+emoji[scissors]=$'\U2702\UFE0F'
3723+emoji[scissors_unqualified]=$'\U2702'
3724+emoji[card_file_box]=$'\U1F5C3\UFE0F'
3725+emoji[card_file_box_unqualified]=$'\U1F5C3'
3726+emoji[file_cabinet]=$'\U1F5C4\UFE0F'
3727+emoji[file_cabinet_unqualified]=$'\U1F5C4'
3728+emoji[wastebasket]=$'\U1F5D1\UFE0F'
3729+emoji[wastebasket_unqualified]=$'\U1F5D1'
3730+emoji[locked]=$'\U1F512'
3731+emoji[lock]=$'\U1F512'
3732+emoji[unlocked]=$'\U1F513'
3733+emoji[unlock]=$'\U1F513'
3734+emoji[locked_with_pen]=$'\U1F50F'
3735+emoji[lock_with_ink_pen]=$'\U1F50F'
3736+emoji[locked_with_key]=$'\U1F510'
3737+emoji[closed_lock_with_key]=$'\U1F510'
3738+emoji[locked_with_key_1]=$'\U1F511'
3739+emoji[key]=$'\U1F511'
3740+emoji[old_key]=$'\U1F5DD\UFE0F'
3741+emoji[old_key_unqualified]=$'\U1F5DD'
3742+emoji[hammer]=$'\U1F528'
3743+emoji[axe]=$'\U1FA93'
3744+emoji[pick]=$'\U26CF\UFE0F'
3745+emoji[pick_unqualified]=$'\U26CF'
3746+emoji[hammer_and_pick]=$'\U2692\UFE0F'
3747+emoji[hammer_and_pick_unqualified]=$'\U2692'
3748+emoji[hammer_and_wrench]=$'\U1F6E0\UFE0F'
3749+emoji[hammer_and_wrench_unqualified]=$'\U1F6E0'
3750+emoji[dagger]=$'\U1F5E1\UFE0F'
3751+emoji[dagger_unqualified]=$'\U1F5E1'
3752+emoji[crossed_swords]=$'\U2694\UFE0F'
3753+emoji[crossed_swords_unqualified]=$'\U2694'
3754+emoji[pistol]=$'\U1F52B'
3755+emoji[gun]=$'\U1F52B'
3756+emoji[bow_and_arrow]=$'\U1F3F9'
3757+emoji[shield]=$'\U1F6E1\UFE0F'
3758+emoji[shield_unqualified]=$'\U1F6E1'
3759+emoji[wrench]=$'\U1F527'
3760+emoji[nut_and_bolt]=$'\U1F529'
3761+emoji[gear]=$'\U2699\UFE0F'
3762+emoji[gear_unqualified]=$'\U2699'
3763+emoji[clamp]=$'\U1F5DC\UFE0F'
3764+emoji[clamp_unqualified]=$'\U1F5DC'
3765+emoji[balance_scale]=$'\U2696\UFE0F'
3766+emoji[balance_scale_unqualified]=$'\U2696'
3767+emoji[probing_cane]=$'\U1F9AF'
3768+emoji[link]=$'\U1F517'
3769+emoji[chains]=$'\U26D3\UFE0F'
3770+emoji[chains_unqualified]=$'\U26D3'
3771+emoji[toolbox]=$'\U1F9F0'
3772+emoji[magnet]=$'\U1F9F2'
3773+emoji[alembic]=$'\U2697\UFE0F'
3774+emoji[alembic_unqualified]=$'\U2697'
3775+emoji[test_tube]=$'\U1F9EA'
3776+emoji[petri_dish]=$'\U1F9EB'
3777+emoji[dna]=$'\U1F9EC'
3778+emoji[microscope]=$'\U1F52C'
3779+emoji[telescope]=$'\U1F52D'
3780+emoji[satellite_antenna]=$'\U1F4E1'
3781+emoji[syringe]=$'\U1F489'
3782+emoji[drop_of_blood]=$'\U1FA78'
3783+emoji[pill]=$'\U1F48A'
3784+emoji[adhesive_bandage]=$'\U1FA79'
3785+emoji[stethoscope]=$'\U1FA7A'
3786+emoji[door]=$'\U1F6AA'
3787+emoji[bed]=$'\U1F6CF\UFE0F'
3788+emoji[bed_unqualified]=$'\U1F6CF'
3789+emoji[couch_and_lamp]=$'\U1F6CB\UFE0F'
3790+emoji[couch_and_lamp_unqualified]=$'\U1F6CB'
3791+emoji[chair]=$'\U1FA91'
3792+emoji[toilet]=$'\U1F6BD'
3793+emoji[shower]=$'\U1F6BF'
3794+emoji[bathtub]=$'\U1F6C1'
3795+emoji[razor]=$'\U1FA92'
3796+emoji[lotion_bottle]=$'\U1F9F4'
3797+emoji[safety_pin]=$'\U1F9F7'
3798+emoji[broom]=$'\U1F9F9'
3799+emoji[basket]=$'\U1F9FA'
3800+emoji[roll_of_paper]=$'\U1F9FB'
3801+emoji[soap]=$'\U1F9FC'
3802+emoji[sponge]=$'\U1F9FD'
3803+emoji[fire_extinguisher]=$'\U1F9EF'
3804+emoji[shopping_cart]=$'\U1F6D2'
3805+emoji[cigarette]=$'\U1F6AC'
3806+emoji[smoking]=$'\U1F6AC'
3807+emoji[coffin]=$'\U26B0\UFE0F'
3808+emoji[coffin_unqualified]=$'\U26B0'
3809+emoji[funeral_urn]=$'\U26B1\UFE0F'
3810+emoji[funeral_urn_unqualified]=$'\U26B1'
3811+emoji[moai]=$'\U1F5FF'
3812+emoji[moyai]=$'\U1F5FF'
3813+emoji[ATM_sign]=$'\U1F3E7'
3814+emoji[atm]=$'\U1F3E7'
3815+emoji[litter_in_bin_sign]=$'\U1F6AE'
3816+emoji[put_litter_in_its_place]=$'\U1F6AE'
3817+emoji[potable_water]=$'\U1F6B0'
3818+emoji[wheelchair_symbol]=$'\U267F'
3819+emoji[wheelchair]=$'\U267F'
3820+emoji[men_s_room]=$'\U1F6B9'
3821+emoji[mens]=$'\U1F6B9'
3822+emoji[women_s_room]=$'\U1F6BA'
3823+emoji[womens]=$'\U1F6BA'
3824+emoji[restroom]=$'\U1F6BB'
3825+emoji[baby_symbol]=$'\U1F6BC'
3826+emoji[water_closet]=$'\U1F6BE'
3827+emoji[wc]=$'\U1F6BE'
3828+emoji[passport_control]=$'\U1F6C2'
3829+emoji[customs]=$'\U1F6C3'
3830+emoji[baggage_claim]=$'\U1F6C4'
3831+emoji[left_luggage]=$'\U1F6C5'
3832+emoji[warning]=$'\U26A0\UFE0F'
3833+emoji[warning_unqualified]=$'\U26A0'
3834+emoji[children_crossing]=$'\U1F6B8'
3835+emoji[no_entry]=$'\U26D4'
3836+emoji[prohibited]=$'\U1F6AB'
3837+emoji[no_entry_sign]=$'\U1F6AB'
3838+emoji[no_bicycles]=$'\U1F6B3'
3839+emoji[no_smoking]=$'\U1F6AD'
3840+emoji[no_littering]=$'\U1F6AF'
3841+emoji[do_not_litter]=$'\U1F6AF'
3842+emoji[non_potable_water]=$'\U1F6B1'
3843+emoji[non-potable_water]=$'\U1F6B1'
3844+emoji[no_pedestrians]=$'\U1F6B7'
3845+emoji[no_mobile_phones]=$'\U1F4F5'
3846+emoji[no_one_under_eighteen]=$'\U1F51E'
3847+emoji[underage]=$'\U1F51E'
3848+emoji[radioactive]=$'\U2622\UFE0F'
3849+emoji[radioactive_unqualified]=$'\U2622'
3850+emoji[biohazard]=$'\U2623\UFE0F'
3851+emoji[biohazard_unqualified]=$'\U2623'
3852+emoji[up_arrow]=$'\U2B06\UFE0F'
3853+emoji[arrow_up]=$'\U2B06\UFE0F'
3854+emoji[up_arrow_unqualified]=$'\U2B06'
3855+emoji[up_right_arrow]=$'\U2197\UFE0F'
3856+emoji[arrow_upper_right]=$'\U2197\UFE0F'
3857+emoji[up_right_arrow_unqualified]=$'\U2197'
3858+emoji[up_right_arrow_unqualified_1]=$'\U27A1\UFE0F'
3859+emoji[arrow_right]=$'\U27A1\UFE0F'
3860+emoji[up_right_arrow_unqualified_2]=$'\U27A1'
3861+emoji[down_right_arrow]=$'\U2198\UFE0F'
3862+emoji[arrow_lower_right]=$'\U2198\UFE0F'
3863+emoji[down_right_arrow_unqualified]=$'\U2198'
3864+emoji[down_arrow]=$'\U2B07\UFE0F'
3865+emoji[arrow_down]=$'\U2B07\UFE0F'
3866+emoji[down_arrow_unqualified]=$'\U2B07'
3867+emoji[down_left_arrow]=$'\U2199\UFE0F'
3868+emoji[arrow_lower_left]=$'\U2199\UFE0F'
3869+emoji[down_left_arrow_unqualified]=$'\U2199'
3870+emoji[down_left_arrow_unqualified_1]=$'\U2B05\UFE0F'
3871+emoji[arrow_left]=$'\U2B05\UFE0F'
3872+emoji[down_left_arrow_unqualified_2]=$'\U2B05'
3873+emoji[up_left_arrow]=$'\U2196\UFE0F'
3874+emoji[arrow_upper_left]=$'\U2196\UFE0F'
3875+emoji[up_left_arrow_unqualified]=$'\U2196'
3876+emoji[up_down_arrow]=$'\U2195\UFE0F'
3877+emoji[arrow_up_down]=$'\U2195\UFE0F'
3878+emoji[up_down_arrow_unqualified]=$'\U2195'
3879+emoji[left_right_arrow]=$'\U2194\UFE0F'
3880+emoji[left_right_arrow_unqualified]=$'\U2194'
3881+emoji[right_arrow_curving_left]=$'\U21A9\UFE0F'
3882+emoji[leftwards_arrow_with_hook]=$'\U21A9\UFE0F'
3883+emoji[right_arrow_curving_left_unqualified]=$'\U21A9'
3884+emoji[left_arrow_curving_right]=$'\U21AA\UFE0F'
3885+emoji[arrow_right_hook]=$'\U21AA\UFE0F'
3886+emoji[left_arrow_curving_right_unqualified]=$'\U21AA'
3887+emoji[right_arrow_curving_up]=$'\U2934\UFE0F'
3888+emoji[arrow_heading_up]=$'\U2934\UFE0F'
3889+emoji[right_arrow_curving_up_unqualified]=$'\U2934'
3890+emoji[right_arrow_curving_down]=$'\U2935\UFE0F'
3891+emoji[arrow_heading_down]=$'\U2935\UFE0F'
3892+emoji[right_arrow_curving_down_unqualified]=$'\U2935'
3893+emoji[clockwise_vertical_arrows]=$'\U1F503'
3894+emoji[arrows_clockwise]=$'\U1F503'
3895+emoji[counterclockwise_arrows_button]=$'\U1F504'
3896+emoji[arrows_counterclockwise]=$'\U1F504'
3897+emoji[BACK_arrow]=$'\U1F519'
3898+emoji[back]=$'\U1F519'
3899+emoji[END_arrow]=$'\U1F51A'
3900+emoji[end]=$'\U1F51A'
3901+emoji[ON_arrow]=$'\U1F51B'
3902+emoji[on]=$'\U1F51B'
3903+emoji[SOON_arrow]=$'\U1F51C'
3904+emoji[soon]=$'\U1F51C'
3905+emoji[TOP_arrow]=$'\U1F51D'
3906+emoji[top]=$'\U1F51D'
3907+emoji[place_of_worship]=$'\U1F6D0'
3908+emoji[atom_symbol]=$'\U269B\UFE0F'
3909+emoji[atom_symbol_unqualified]=$'\U269B'
3910+emoji[atom_symbol_unqualified_1]=$'\U1F549\UFE0F'
3911+emoji[om_unqualified]=$'\U1F549'
3912+emoji[om]=$'\U1F549'
3913+emoji[star_of_David]=$'\U2721\UFE0F'
3914+emoji[star_of_david]=$'\U2721\UFE0F'
3915+emoji[star_of_David_unqualified]=$'\U2721'
3916+emoji[wheel_of_dharma]=$'\U2638\UFE0F'
3917+emoji[wheel_of_dharma_unqualified]=$'\U2638'
3918+emoji[yin_yang]=$'\U262F\UFE0F'
3919+emoji[yin_yang_unqualified]=$'\U262F'
3920+emoji[latin_cross]=$'\U271D\UFE0F'
3921+emoji[latin_cross_unqualified]=$'\U271D'
3922+emoji[orthodox_cross]=$'\U2626\UFE0F'
3923+emoji[orthodox_cross_unqualified]=$'\U2626'
3924+emoji[star_and_crescent]=$'\U262A\UFE0F'
3925+emoji[star_and_crescent_unqualified]=$'\U262A'
3926+emoji[peace_symbol]=$'\U262E\UFE0F'
3927+emoji[peace_symbol_unqualified]=$'\U262E'
3928+emoji[menorah]=$'\U1F54E'
3929+emoji[dotted_six_pointed_star]=$'\U1F52F'
3930+emoji[six_pointed_star]=$'\U1F52F'
3931+emoji[Aries]=$'\U2648'
3932+emoji[aries]=$'\U2648'
3933+emoji[Taurus]=$'\U2649'
3934+emoji[taurus]=$'\U2649'
3935+emoji[Gemini]=$'\U264A'
3936+emoji[gemini]=$'\U264A'
3937+emoji[Cancer]=$'\U264B'
3938+emoji[cancer]=$'\U264B'
3939+emoji[Leo]=$'\U264C'
3940+emoji[leo]=$'\U264C'
3941+emoji[Virgo]=$'\U264D'
3942+emoji[virgo]=$'\U264D'
3943+emoji[Libra]=$'\U264E'
3944+emoji[libra]=$'\U264E'
3945+emoji[Scorpio]=$'\U264F'
3946+emoji[scorpius]=$'\U264F'
3947+emoji[Sagittarius]=$'\U2650'
3948+emoji[sagittarius]=$'\U2650'
3949+emoji[Capricorn]=$'\U2651'
3950+emoji[capricorn]=$'\U2651'
3951+emoji[Aquarius]=$'\U2652'
3952+emoji[aquarius]=$'\U2652'
3953+emoji[Pisces]=$'\U2653'
3954+emoji[pisces]=$'\U2653'
3955+emoji[Ophiuchus]=$'\U26CE'
3956+emoji[ophiuchus]=$'\U26CE'
3957+emoji[shuffle_tracks_button]=$'\U1F500'
3958+emoji[twisted_rightwards_arrows]=$'\U1F500'
3959+emoji[repeat_button]=$'\U1F501'
3960+emoji[repeat]=$'\U1F501'
3961+emoji[repeat_single_button]=$'\U1F502'
3962+emoji[repeat_one]=$'\U1F502'
3963+emoji[play_button]=$'\U25B6\UFE0F'
3964+emoji[arrow_forward]=$'\U25B6\UFE0F'
3965+emoji[play_button_unqualified]=$'\U25B6'
3966+emoji[fast_forward_button]=$'\U23E9'
3967+emoji[fast_forward]=$'\U23E9'
3968+emoji[next_track_button]=$'\U23ED\UFE0F'
3969+emoji[next_track_button_unqualified]=$'\U23ED'
3970+emoji[play_or_pause_button]=$'\U23EF\UFE0F'
3971+emoji[play_or_pause_button_unqualified]=$'\U23EF'
3972+emoji[reverse_button]=$'\U25C0\UFE0F'
3973+emoji[arrow_backward]=$'\U25C0\UFE0F'
3974+emoji[reverse_button_unqualified]=$'\U25C0'
3975+emoji[fast_reverse_button]=$'\U23EA'
3976+emoji[rewind]=$'\U23EA'
3977+emoji[last_track_button]=$'\U23EE\UFE0F'
3978+emoji[last_track_button_unqualified]=$'\U23EE'
3979+emoji[previous_track_button]=$'\U23EE'
3980+emoji[upwards_button]=$'\U1F53C'
3981+emoji[arrow_up_small]=$'\U1F53C'
3982+emoji[fast_up_button]=$'\U23EB'
3983+emoji[arrow_double_up]=$'\U23EB'
3984+emoji[downwards_button]=$'\U1F53D'
3985+emoji[arrow_down_small]=$'\U1F53D'
3986+emoji[fast_down_button]=$'\U23EC'
3987+emoji[arrow_double_down]=$'\U23EC'
3988+emoji[pause_button]=$'\U23F8\UFE0F'
3989+emoji[pause_button_unqualified]=$'\U23F8'
3990+emoji[stop_button]=$'\U23F9\UFE0F'
3991+emoji[stop_button_unqualified]=$'\U23F9'
3992+emoji[record_button]=$'\U23FA\UFE0F'
3993+emoji[record_button_unqualified]=$'\U23FA'
3994+emoji[eject_button]=$'\U23CF\UFE0F'
3995+emoji[eject_button_unqualified]=$'\U23CF'
3996+emoji[cinema]=$'\U1F3A6'
3997+emoji[dim_button]=$'\U1F505'
3998+emoji[low_brightness]=$'\U1F505'
3999+emoji[bright_button]=$'\U1F506'
4000+emoji[high_brightness]=$'\U1F506'
4001+emoji[antenna_bars]=$'\U1F4F6'
4002+emoji[signal_strength]=$'\U1F4F6'
4003+emoji[vibration_mode]=$'\U1F4F3'
4004+emoji[mobile_phone_off]=$'\U1F4F4'
4005+emoji[female_sign]=$'\U2640\UFE0F'
4006+emoji[female_sign_unqualified]=$'\U2640'
4007+emoji[female_sign_unqualified_1]=$'\U2642\UFE0F'
4008+emoji[male_sign]=$'\U2642\UFE0F'
4009+emoji[female_sign_unqualified_2]=$'\U2642'
4010+emoji[medical_symbol]=$'\U2695\UFE0F'
4011+emoji[medical_symbol_unqualified]=$'\U2695'
4012+emoji[infinity]=$'\U267E\UFE0F'
4013+emoji[infinity_unqualified]=$'\U267E'
4014+emoji[recycling_symbol]=$'\U267B\UFE0F'
4015+emoji[recycle]=$'\U267B\UFE0F'
4016+emoji[recycling_symbol_unqualified]=$'\U267B'
4017+emoji[fleur_de_lis]=$'\U269C\UFE0F'
4018+emoji[fleur_de_lis_unqualified]=$'\U269C'
4019+emoji[trident_emblem]=$'\U1F531'
4020+emoji[trident]=$'\U1F531'
4021+emoji[name_badge]=$'\U1F4DB'
4022+emoji[Japanese_symbol_for_beginner]=$'\U1F530'
4023+emoji[beginner]=$'\U1F530'
4024+emoji[hollow_red_circle]=$'\U2B55'
4025+emoji[o]=$'\U2B55'
4026+emoji[check_mark_button]=$'\U2705'
4027+emoji[white_check_mark]=$'\U2705'
4028+emoji[check_box_with_check]=$'\U2611\UFE0F'
4029+emoji[ballot_box_with_check]=$'\U2611\UFE0F'
4030+emoji[check_box_with_check_unqualified]=$'\U2611'
4031+emoji[check_mark]=$'\U2714\UFE0F'
4032+emoji[heavy_check_mark]=$'\U2714\UFE0F'
4033+emoji[check_mark_unqualified]=$'\U2714'
4034+emoji[multiplication_sign]=$'\U2716\UFE0F'
4035+emoji[heavy_multiplication_x]=$'\U2716\UFE0F'
4036+emoji[multiplication_sign_unqualified]=$'\U2716'
4037+emoji[cross_mark]=$'\U274C'
4038+emoji[x]=$'\U274C'
4039+emoji[cross_mark_button]=$'\U274E'
4040+emoji[negative_squared_cross_mark]=$'\U274E'
4041+emoji[plus_sign]=$'\U2795'
4042+emoji[heavy_plus_sign]=$'\U2795'
4043+emoji[minus_sign]=$'\U2796'
4044+emoji[heavy_minus_sign]=$'\U2796'
4045+emoji[division_sign]=$'\U2797'
4046+emoji[heavy_division_sign]=$'\U2797'
4047+emoji[curly_loop]=$'\U27B0'
4048+emoji[double_curly_loop]=$'\U27BF'
4049+emoji[loop]=$'\U27BF'
4050+emoji[part_alternation_mark]=$'\U303D\UFE0F'
4051+emoji[part_alternation_mark_unqualified]=$'\U303D'
4052+emoji[eight_spoked_asterisk]=$'\U2733\UFE0F'
4053+emoji[eight_spoked_asterisk_unqualified]=$'\U2733'
4054+emoji[eight_pointed_star]=$'\U2734\UFE0F'
4055+emoji[eight_pointed_black_star]=$'\U2734\UFE0F'
4056+emoji[eight_pointed_star_unqualified]=$'\U2734'
4057+emoji[sparkle]=$'\U2747\UFE0F'
4058+emoji[sparkle_unqualified]=$'\U2747'
4059+emoji[double_exclamation_mark]=$'\U203C\UFE0F'
4060+emoji[bangbang]=$'\U203C\UFE0F'
4061+emoji[double_exclamation_mark_unqualified]=$'\U203C'
4062+emoji[exclamation_question_mark]=$'\U2049\UFE0F'
4063+emoji[interrobang]=$'\U2049\UFE0F'
4064+emoji[exclamation_question_mark_unqualified]=$'\U2049'
4065+emoji[exclamation_question_mark_unqualified_1]=$'\U2753'
4066+emoji[question]=$'\U2753'
4067+emoji[white_question_mark]=$'\U2754'
4068+emoji[grey_question]=$'\U2754'
4069+emoji[white_exclamation_mark]=$'\U2755'
4070+emoji[grey_exclamation]=$'\U2755'
4071+emoji[white_exclamation_mark_1]=$'\U2757'
4072+emoji[exclamation]=$'\U2757'
4073+emoji[heavy_exclamation_mark]=$'\U2757'
4074+emoji[wavy_dash]=$'\U3030\UFE0F'
4075+emoji[wavy_dash_unqualified]=$'\U3030'
4076+emoji[copyright]=$'\U00A9\UFE0F'
4077+emoji[copyright_unqualified]=$'\U00A9'
4078+emoji[registered]=$'\U00AE\UFE0F'
4079+emoji[registered_unqualified]=$'\U00AE'
4080+emoji[trade_mark]=$'\U2122\UFE0F'
4081+emoji[tm]=$'\U2122\UFE0F'
4082+emoji[trade_mark_unqualified]=$'\U2122'
4083+emoji[keycap_#]=$'\U0023\UFE0F\U20E3'
4084+emoji[hash]=$'\U0023\UFE0F\U20E3'
4085+emoji[keycap_#_unqualified]=$'\U0023\U20E3'
4086+emoji[keycap_*]=$'\U002A\UFE0F\U20E3'
4087+emoji[asterisk]=$'\U002A\UFE0F\U20E3'
4088+emoji[keycap_*_unqualified]=$'\U002A\U20E3'
4089+emoji[keycap_0]=$'\U0030\UFE0F\U20E3'
4090+emoji[zero]=$'\U0030\UFE0F\U20E3'
4091+emoji[keycap_0_unqualified]=$'\U0030\U20E3'
4092+emoji[keycap_1]=$'\U0031\UFE0F\U20E3'
4093+emoji[one]=$'\U0031\UFE0F\U20E3'
4094+emoji[keycap_1_unqualified]=$'\U0031\U20E3'
4095+emoji[keycap_2]=$'\U0032\UFE0F\U20E3'
4096+emoji[two]=$'\U0032\UFE0F\U20E3'
4097+emoji[keycap_2_unqualified]=$'\U0032\U20E3'
4098+emoji[keycap_3]=$'\U0033\UFE0F\U20E3'
4099+emoji[three]=$'\U0033\UFE0F\U20E3'
4100+emoji[keycap_3_unqualified]=$'\U0033\U20E3'
4101+emoji[keycap_4]=$'\U0034\UFE0F\U20E3'
4102+emoji[four]=$'\U0034\UFE0F\U20E3'
4103+emoji[keycap_4_unqualified]=$'\U0034\U20E3'
4104+emoji[keycap_5]=$'\U0035\UFE0F\U20E3'
4105+emoji[five]=$'\U0035\UFE0F\U20E3'
4106+emoji[keycap_5_unqualified]=$'\U0035\U20E3'
4107+emoji[keycap_6]=$'\U0036\UFE0F\U20E3'
4108+emoji[six]=$'\U0036\UFE0F\U20E3'
4109+emoji[keycap_6_unqualified]=$'\U0036\U20E3'
4110+emoji[keycap_7]=$'\U0037\UFE0F\U20E3'
4111+emoji[seven]=$'\U0037\UFE0F\U20E3'
4112+emoji[keycap_7_unqualified]=$'\U0037\U20E3'
4113+emoji[keycap_8]=$'\U0038\UFE0F\U20E3'
4114+emoji[eight]=$'\U0038\UFE0F\U20E3'
4115+emoji[keycap_8_unqualified]=$'\U0038\U20E3'
4116+emoji[keycap_9]=$'\U0039\UFE0F\U20E3'
4117+emoji[nine]=$'\U0039\UFE0F\U20E3'
4118+emoji[keycap_9_unqualified]=$'\U0039\U20E3'
4119+emoji[keycap_10]=$'\U1F51F'
4120+emoji[keycap_ten]=$'\U1F51F'
4121+emoji[input_latin_uppercase]=$'\U1F520'
4122+emoji[capital_abcd]=$'\U1F520'
4123+emoji[input_latin_lowercase]=$'\U1F521'
4124+emoji[abcd]=$'\U1F521'
4125+emoji[input_numbers]=$'\U1F522'
4126+emoji[1234]=$'\U1F522'
4127+emoji[input_symbols]=$'\U1F523'
4128+emoji[symbols]=$'\U1F523'
4129+emoji[input_latin_letters]=$'\U1F524'
4130+emoji[abc]=$'\U1F524'
4131+emoji[A_button_blood_type_]=$'\U1F170\UFE0F'
4132+emoji[a]=$'\U1F170\UFE0F'
4133+emoji[A_button_blood_type__unqualified]=$'\U1F170'
4134+emoji[AB_button_blood_type_]=$'\U1F18E'
4135+emoji[ab]=$'\U1F18E'
4136+emoji[AB_button_blood_type__1]=$'\U1F171\UFE0F'
4137+emoji[b]=$'\U1F171\UFE0F'
4138+emoji[B_button_blood_type__unqualified]=$'\U1F171'
4139+emoji[CL_button]=$'\U1F191'
4140+emoji[cl]=$'\U1F191'
4141+emoji[COOL_button]=$'\U1F192'
4142+emoji[cool]=$'\U1F192'
4143+emoji[FREE_button]=$'\U1F193'
4144+emoji[free]=$'\U1F193'
4145+emoji[information]=$'\U2139\UFE0F'
4146+emoji[information_source]=$'\U2139\UFE0F'
4147+emoji[information_unqualified]=$'\U2139'
4148+emoji[ID_button]=$'\U1F194'
4149+emoji[id]=$'\U1F194'
4150+emoji[circled_M]=$'\U24C2\UFE0F'
4151+emoji[m]=$'\U24C2\UFE0F'
4152+emoji[circled_M_unqualified]=$'\U24C2'
4153+emoji[NEW_button]=$'\U1F195'
4154+emoji[new]=$'\U1F195'
4155+emoji[NG_button]=$'\U1F196'
4156+emoji[ng]=$'\U1F196'
4157+emoji[O_button_blood_type_]=$'\U1F17E\UFE0F'
4158+emoji[o2]=$'\U1F17E\UFE0F'
4159+emoji[O_button_blood_type__unqualified]=$'\U1F17E'
4160+emoji[OK_button]=$'\U1F197'
4161+emoji[ok]=$'\U1F197'
4162+emoji[P_button]=$'\U1F17F\UFE0F'
4163+emoji[parking]=$'\U1F17F\UFE0F'
4164+emoji[P_button_unqualified]=$'\U1F17F'
4165+emoji[SOS_button]=$'\U1F198'
4166+emoji[sos]=$'\U1F198'
4167+emoji[UP_button]=$'\U1F199'
4168+emoji[up]=$'\U1F199'
4169+emoji[VS_button]=$'\U1F19A'
4170+emoji[vs]=$'\U1F19A'
4171+emoji[Japanese_here_button]=$'\U1F201'
4172+emoji[koko]=$'\U1F201'
4173+emoji[Japanese_service_charge_button]=$'\U1F202\UFE0F'
4174+emoji[sa]=$'\U1F202\UFE0F'
4175+emoji[Japanese_service_charge_button_unqualified]=$'\U1F202'
4176+emoji[Japanese_monthly_amount_button]=$'\U1F237\UFE0F'
4177+emoji[u6708]=$'\U1F237\UFE0F'
4178+emoji[Japanese_monthly_amount_button_unqualified]=$'\U1F237'
4179+emoji[Japanese_not_free_of_charge_button]=$'\U1F236'
4180+emoji[u6709]=$'\U1F236'
4181+emoji[Japanese_reserved_button]=$'\U1F22F'
4182+emoji[u6307]=$'\U1F22F'
4183+emoji[Japanese_bargain_button]=$'\U1F250'
4184+emoji[ideograph_advantage]=$'\U1F250'
4185+emoji[Japanese_discount_button]=$'\U1F239'
4186+emoji[u5272]=$'\U1F239'
4187+emoji[Japanese_free_of_charge_button]=$'\U1F21A'
4188+emoji[u7121]=$'\U1F21A'
4189+emoji[Japanese_prohibited_button]=$'\U1F232'
4190+emoji[u7981]=$'\U1F232'
4191+emoji[Japanese_acceptable_button]=$'\U1F251'
4192+emoji[accept]=$'\U1F251'
4193+emoji[Japanese_application_button]=$'\U1F238'
4194+emoji[u7533]=$'\U1F238'
4195+emoji[Japanese_passing_grade_button]=$'\U1F234'
4196+emoji[u5408]=$'\U1F234'
4197+emoji[Japanese_vacancy_button]=$'\U1F233'
4198+emoji[u7a7a]=$'\U1F233'
4199+emoji[Japanese_congratulations_button]=$'\U3297\UFE0F'
4200+emoji[congratulations]=$'\U3297\UFE0F'
4201+emoji[Japanese_congratulations_button_unqualified]=$'\U3297'
4202+emoji[Japanese_secret_button]=$'\U3299\UFE0F'
4203+emoji[secret]=$'\U3299\UFE0F'
4204+emoji[Japanese_secret_button_unqualified]=$'\U3299'
4205+emoji[Japanese_open_for_business_button]=$'\U1F23A'
4206+emoji[u55b6]=$'\U1F23A'
4207+emoji[Japanese_no_vacancy_button]=$'\U1F235'
4208+emoji[u6e80]=$'\U1F235'
4209+emoji[red_circle]=$'\U1F534'
4210+emoji[orange_circle]=$'\U1F7E0'
4211+emoji[yellow_circle]=$'\U1F7E1'
4212+emoji[green_circle]=$'\U1F7E2'
4213+emoji[blue_circle]=$'\U1F535'
4214+emoji[large_blue_circle]=$'\U1F535'
4215+emoji[purple_circle]=$'\U1F7E3'
4216+emoji[brown_circle]=$'\U1F7E4'
4217+emoji[black_circle]=$'\U26AB'
4218+emoji[white_circle]=$'\U26AA'
4219+emoji[red_square]=$'\U1F7E5'
4220+emoji[orange_square]=$'\U1F7E7'
4221+emoji[yellow_square]=$'\U1F7E8'
4222+emoji[green_square]=$'\U1F7E9'
4223+emoji[blue_square]=$'\U1F7E6'
4224+emoji[purple_square]=$'\U1F7EA'
4225+emoji[brown_square]=$'\U1F7EB'
4226+emoji[black_large_square]=$'\U2B1B'
4227+emoji[white_large_square]=$'\U2B1C'
4228+emoji[black_medium_square]=$'\U25FC\UFE0F'
4229+emoji[black_medium_square_unqualified]=$'\U25FC'
4230+emoji[white_medium_square]=$'\U25FB\UFE0F'
4231+emoji[white_medium_square_unqualified]=$'\U25FB'
4232+emoji[black_medium_small_square]=$'\U25FE'
4233+emoji[white_medium_small_square]=$'\U25FD'
4234+emoji[black_small_square]=$'\U25AA\UFE0F'
4235+emoji[black_small_square_unqualified]=$'\U25AA'
4236+emoji[white_small_square]=$'\U25AB\UFE0F'
4237+emoji[white_small_square_unqualified]=$'\U25AB'
4238+emoji[large_orange_diamond]=$'\U1F536'
4239+emoji[large_blue_diamond]=$'\U1F537'
4240+emoji[small_orange_diamond]=$'\U1F538'
4241+emoji[small_blue_diamond]=$'\U1F539'
4242+emoji[red_triangle_pointed_up]=$'\U1F53A'
4243+emoji[small_red_triangle]=$'\U1F53A'
4244+emoji[red_triangle_pointed_down]=$'\U1F53B'
4245+emoji[small_red_triangle_down]=$'\U1F53B'
4246+emoji[diamond_with_a_dot]=$'\U1F4A0'
4247+emoji[diamond_shape_with_a_dot_inside]=$'\U1F4A0'
4248+emoji[radio_button]=$'\U1F518'
4249+emoji[white_square_button]=$'\U1F533'
4250+emoji[black_square_button]=$'\U1F532'
4251+emoji_flags[chequered_flag]=$'\U1F3C1'
4252+emoji_flags[checkered_flag]=$'\U1F3C1'
4253+emoji_flags[triangular_flag]=$'\U1F6A9'
4254+emoji_flags[triangular_flag_on_post]=$'\U1F6A9'
4255+emoji_flags[crossed_flags]=$'\U1F38C'
4256+emoji_flags[black_flag]=$'\U1F3F4'
4257+emoji_flags[white_flag]=$'\U1F3F3\UFE0F'
4258+emoji_flags[white_flag_unqualified]=$'\U1F3F3'
4259+emoji_flags[rainbow_flag]=$'\U1F3F3\UFE0F\U200D\U1F308'
4260+emoji_flags[rainbow_flag_unqualified]=$'\U1F3F3\U200D\U1F308'
4261+emoji_flags[pirate_flag]=$'\U1F3F4\U200D\U2620\UFE0F'
4262+emoji_flags[pirate_flag_minimally]=$'\U1F3F4\U200D\U2620'
4263+emoji_flags[Ascension_Island]=$'\U1F1E6\U1F1E8'
4264+emoji_flags[ascension_island]=$'\U1F1E6\U1F1E8'
4265+emoji_flags[Andorra]=$'\U1F1E6\U1F1E9'
4266+emoji_flags[AD]=$'\U1F1E6\U1F1E9'
4267+emoji_flags[AND]=$'\U1F1E6\U1F1E9'
4268+emoji_flags[andorra]=$'\U1F1E6\U1F1E9'
4269+emoji_flags[United_Arab_Emirates]=$'\U1F1E6\U1F1EA'
4270+emoji_flags[AE]=$'\U1F1E6\U1F1EA'
4271+emoji_flags[ARE]=$'\U1F1E6\U1F1EA'
4272+emoji_flags[united_arab_emirates]=$'\U1F1E6\U1F1EA'
4273+emoji_flags[Afghanistan]=$'\U1F1E6\U1F1EB'
4274+emoji_flags[AF]=$'\U1F1E6\U1F1EB'
4275+emoji_flags[AFG]=$'\U1F1E6\U1F1EB'
4276+emoji_flags[afghanistan]=$'\U1F1E6\U1F1EB'
4277+emoji_flags[Antigua_and_Barbuda]=$'\U1F1E6\U1F1EC'
4278+emoji_flags[AG]=$'\U1F1E6\U1F1EC'
4279+emoji_flags[ATG]=$'\U1F1E6\U1F1EC'
4280+emoji_flags[antigua_barbuda]=$'\U1F1E6\U1F1EC'
4281+emoji_flags[Anguilla]=$'\U1F1E6\U1F1EE'
4282+emoji_flags[AI]=$'\U1F1E6\U1F1EE'
4283+emoji_flags[AIA]=$'\U1F1E6\U1F1EE'
4284+emoji_flags[anguilla]=$'\U1F1E6\U1F1EE'
4285+emoji_flags[Albania]=$'\U1F1E6\U1F1F1'
4286+emoji_flags[AL]=$'\U1F1E6\U1F1F1'
4287+emoji_flags[ALB]=$'\U1F1E6\U1F1F1'
4288+emoji_flags[albania]=$'\U1F1E6\U1F1F1'
4289+emoji_flags[Armenia]=$'\U1F1E6\U1F1F2'
4290+emoji_flags[AM]=$'\U1F1E6\U1F1F2'
4291+emoji_flags[ARM]=$'\U1F1E6\U1F1F2'
4292+emoji_flags[armenia]=$'\U1F1E6\U1F1F2'
4293+emoji_flags[Angola]=$'\U1F1E6\U1F1F4'
4294+emoji_flags[AO]=$'\U1F1E6\U1F1F4'
4295+emoji_flags[AGO]=$'\U1F1E6\U1F1F4'
4296+emoji_flags[angola]=$'\U1F1E6\U1F1F4'
4297+emoji_flags[Antarctica]=$'\U1F1E6\U1F1F6'
4298+emoji_flags[AQ]=$'\U1F1E6\U1F1F6'
4299+emoji_flags[ATA]=$'\U1F1E6\U1F1F6'
4300+emoji_flags[antarctica]=$'\U1F1E6\U1F1F6'
4301+emoji_flags[Argentina]=$'\U1F1E6\U1F1F7'
4302+emoji_flags[AR]=$'\U1F1E6\U1F1F7'
4303+emoji_flags[ARG]=$'\U1F1E6\U1F1F7'
4304+emoji_flags[argentina]=$'\U1F1E6\U1F1F7'
4305+emoji_flags[American_Samoa]=$'\U1F1E6\U1F1F8'
4306+emoji_flags[AS]=$'\U1F1E6\U1F1F8'
4307+emoji_flags[ASM]=$'\U1F1E6\U1F1F8'
4308+emoji_flags[american_samoa]=$'\U1F1E6\U1F1F8'
4309+emoji_flags[Austria]=$'\U1F1E6\U1F1F9'
4310+emoji_flags[AT]=$'\U1F1E6\U1F1F9'
4311+emoji_flags[AUT]=$'\U1F1E6\U1F1F9'
4312+emoji_flags[austria]=$'\U1F1E6\U1F1F9'
4313+emoji_flags[Australia]=$'\U1F1E6\U1F1FA'
4314+emoji_flags[AU]=$'\U1F1E6\U1F1FA'
4315+emoji_flags[AUS]=$'\U1F1E6\U1F1FA'
4316+emoji_flags[australia]=$'\U1F1E6\U1F1FA'
4317+emoji_flags[Aruba]=$'\U1F1E6\U1F1FC'
4318+emoji_flags[AW]=$'\U1F1E6\U1F1FC'
4319+emoji_flags[ABW]=$'\U1F1E6\U1F1FC'
4320+emoji_flags[aruba]=$'\U1F1E6\U1F1FC'
4321+emoji_flags[ร…land_Islands]=$'\U1F1E6\U1F1FD'
4322+emoji_flags[AX]=$'\U1F1E6\U1F1FD'
4323+emoji_flags[ALA]=$'\U1F1E6\U1F1FD'
4324+emoji_flags[aland_islands]=$'\U1F1E6\U1F1FD'
4325+emoji_flags[Azerbaijan]=$'\U1F1E6\U1F1FF'
4326+emoji_flags[AZ]=$'\U1F1E6\U1F1FF'
4327+emoji_flags[AZE]=$'\U1F1E6\U1F1FF'
4328+emoji_flags[azerbaijan]=$'\U1F1E6\U1F1FF'
4329+emoji_flags[Bosnia_and_Herzegovina]=$'\U1F1E7\U1F1E6'
4330+emoji_flags[BA]=$'\U1F1E7\U1F1E6'
4331+emoji_flags[BIH]=$'\U1F1E7\U1F1E6'
4332+emoji_flags[bosnia_herzegovina]=$'\U1F1E7\U1F1E6'
4333+emoji_flags[Barbados]=$'\U1F1E7\U1F1E7'
4334+emoji_flags[BB]=$'\U1F1E7\U1F1E7'
4335+emoji_flags[BRB]=$'\U1F1E7\U1F1E7'
4336+emoji_flags[barbados]=$'\U1F1E7\U1F1E7'
4337+emoji_flags[Bangladesh]=$'\U1F1E7\U1F1E9'
4338+emoji_flags[BD]=$'\U1F1E7\U1F1E9'
4339+emoji_flags[BGD]=$'\U1F1E7\U1F1E9'
4340+emoji_flags[bangladesh]=$'\U1F1E7\U1F1E9'
4341+emoji_flags[Belgium]=$'\U1F1E7\U1F1EA'
4342+emoji_flags[BE]=$'\U1F1E7\U1F1EA'
4343+emoji_flags[BEL]=$'\U1F1E7\U1F1EA'
4344+emoji_flags[belgium]=$'\U1F1E7\U1F1EA'
4345+emoji_flags[Burkina_Faso]=$'\U1F1E7\U1F1EB'
4346+emoji_flags[BF]=$'\U1F1E7\U1F1EB'
4347+emoji_flags[BFA]=$'\U1F1E7\U1F1EB'
4348+emoji_flags[burkina_faso]=$'\U1F1E7\U1F1EB'
4349+emoji_flags[Bulgaria]=$'\U1F1E7\U1F1EC'
4350+emoji_flags[BG]=$'\U1F1E7\U1F1EC'
4351+emoji_flags[BGR]=$'\U1F1E7\U1F1EC'
4352+emoji_flags[bulgaria]=$'\U1F1E7\U1F1EC'
4353+emoji_flags[Bahrain]=$'\U1F1E7\U1F1ED'
4354+emoji_flags[BH]=$'\U1F1E7\U1F1ED'
4355+emoji_flags[BHR]=$'\U1F1E7\U1F1ED'
4356+emoji_flags[bahrain]=$'\U1F1E7\U1F1ED'
4357+emoji_flags[Burundi]=$'\U1F1E7\U1F1EE'
4358+emoji_flags[BI]=$'\U1F1E7\U1F1EE'
4359+emoji_flags[BDI]=$'\U1F1E7\U1F1EE'
4360+emoji_flags[burundi]=$'\U1F1E7\U1F1EE'
4361+emoji_flags[Benin]=$'\U1F1E7\U1F1EF'
4362+emoji_flags[BJ]=$'\U1F1E7\U1F1EF'
4363+emoji_flags[BEN]=$'\U1F1E7\U1F1EF'
4364+emoji_flags[benin]=$'\U1F1E7\U1F1EF'
4365+emoji_flags[St_Barthรฉlemy]=$'\U1F1E7\U1F1F1'
4366+emoji_flags[BL]=$'\U1F1E7\U1F1F1'
4367+emoji_flags[BLM]=$'\U1F1E7\U1F1F1'
4368+emoji_flags[st_barthelemy]=$'\U1F1E7\U1F1F1'
4369+emoji_flags[Bermuda]=$'\U1F1E7\U1F1F2'
4370+emoji_flags[BM]=$'\U1F1E7\U1F1F2'
4371+emoji_flags[BMU]=$'\U1F1E7\U1F1F2'
4372+emoji_flags[bermuda]=$'\U1F1E7\U1F1F2'
4373+emoji_flags[Brunei]=$'\U1F1E7\U1F1F3'
4374+emoji_flags[BN]=$'\U1F1E7\U1F1F3'
4375+emoji_flags[BRN]=$'\U1F1E7\U1F1F3'
4376+emoji_flags[brunei]=$'\U1F1E7\U1F1F3'
4377+emoji_flags[Bolivia]=$'\U1F1E7\U1F1F4'
4378+emoji_flags[BO]=$'\U1F1E7\U1F1F4'
4379+emoji_flags[BOL]=$'\U1F1E7\U1F1F4'
4380+emoji_flags[bolivia]=$'\U1F1E7\U1F1F4'
4381+emoji_flags[Caribbean_Netherlands]=$'\U1F1E7\U1F1F6'
4382+emoji_flags[BQ]=$'\U1F1E7\U1F1F6'
4383+emoji_flags[BES]=$'\U1F1E7\U1F1F6'
4384+emoji_flags[caribbean_netherlands]=$'\U1F1E7\U1F1F6'
4385+emoji_flags[Brazil]=$'\U1F1E7\U1F1F7'
4386+emoji_flags[BR]=$'\U1F1E7\U1F1F7'
4387+emoji_flags[BRA]=$'\U1F1E7\U1F1F7'
4388+emoji_flags[brazil]=$'\U1F1E7\U1F1F7'
4389+emoji_flags[Bahamas]=$'\U1F1E7\U1F1F8'
4390+emoji_flags[BS]=$'\U1F1E7\U1F1F8'
4391+emoji_flags[BHS]=$'\U1F1E7\U1F1F8'
4392+emoji_flags[bahamas]=$'\U1F1E7\U1F1F8'
4393+emoji_flags[Bhutan]=$'\U1F1E7\U1F1F9'
4394+emoji_flags[BT]=$'\U1F1E7\U1F1F9'
4395+emoji_flags[BTN]=$'\U1F1E7\U1F1F9'
4396+emoji_flags[bhutan]=$'\U1F1E7\U1F1F9'
4397+emoji_flags[Bouvet_Island]=$'\U1F1E7\U1F1FB'
4398+emoji_flags[BV]=$'\U1F1E7\U1F1FB'
4399+emoji_flags[BVT]=$'\U1F1E7\U1F1FB'
4400+emoji_flags[bouvet_island]=$'\U1F1E7\U1F1FB'
4401+emoji_flags[Botswana]=$'\U1F1E7\U1F1FC'
4402+emoji_flags[BW]=$'\U1F1E7\U1F1FC'
4403+emoji_flags[BWA]=$'\U1F1E7\U1F1FC'
4404+emoji_flags[botswana]=$'\U1F1E7\U1F1FC'
4405+emoji_flags[Belarus]=$'\U1F1E7\U1F1FE'
4406+emoji_flags[BY]=$'\U1F1E7\U1F1FE'
4407+emoji_flags[BLR]=$'\U1F1E7\U1F1FE'
4408+emoji_flags[belarus]=$'\U1F1E7\U1F1FE'
4409+emoji_flags[Belize]=$'\U1F1E7\U1F1FF'
4410+emoji_flags[BZ]=$'\U1F1E7\U1F1FF'
4411+emoji_flags[BLZ]=$'\U1F1E7\U1F1FF'
4412+emoji_flags[belize]=$'\U1F1E7\U1F1FF'
4413+emoji_flags[Canada]=$'\U1F1E8\U1F1E6'
4414+emoji_flags[CA]=$'\U1F1E8\U1F1E6'
4415+emoji_flags[CAN]=$'\U1F1E8\U1F1E6'
4416+emoji_flags[canada]=$'\U1F1E8\U1F1E6'
4417+emoji_flags[Cocos_Keeling_Islands]=$'\U1F1E8\U1F1E8'
4418+emoji_flags[CC]=$'\U1F1E8\U1F1E8'
4419+emoji_flags[CCK]=$'\U1F1E8\U1F1E8'
4420+emoji_flags[cocos_islands]=$'\U1F1E8\U1F1E8'
4421+emoji_flags[Congo__Kinshasa]=$'\U1F1E8\U1F1E9'
4422+emoji_flags[CD]=$'\U1F1E8\U1F1E9'
4423+emoji_flags[COD]=$'\U1F1E8\U1F1E9'
4424+emoji_flags[congo_kinshasa]=$'\U1F1E8\U1F1E9'
4425+emoji_flags[Central_African_Republic]=$'\U1F1E8\U1F1EB'
4426+emoji_flags[CF]=$'\U1F1E8\U1F1EB'
4427+emoji_flags[CAF]=$'\U1F1E8\U1F1EB'
4428+emoji_flags[central_african_republic]=$'\U1F1E8\U1F1EB'
4429+emoji_flags[Congo__Brazzaville]=$'\U1F1E8\U1F1EC'
4430+emoji_flags[CG]=$'\U1F1E8\U1F1EC'
4431+emoji_flags[COG]=$'\U1F1E8\U1F1EC'
4432+emoji_flags[congo_brazzaville]=$'\U1F1E8\U1F1EC'
4433+emoji_flags[Switzerland]=$'\U1F1E8\U1F1ED'
4434+emoji_flags[CH]=$'\U1F1E8\U1F1ED'
4435+emoji_flags[CHE]=$'\U1F1E8\U1F1ED'
4436+emoji_flags[switzerland]=$'\U1F1E8\U1F1ED'
4437+emoji_flags[Cรดte_d_Ivoire]=$'\U1F1E8\U1F1EE'
4438+emoji_flags[CI]=$'\U1F1E8\U1F1EE'
4439+emoji_flags[CIV]=$'\U1F1E8\U1F1EE'
4440+emoji_flags[cote_divoire]=$'\U1F1E8\U1F1EE'
4441+emoji_flags[Cook_Islands]=$'\U1F1E8\U1F1F0'
4442+emoji_flags[CK]=$'\U1F1E8\U1F1F0'
4443+emoji_flags[COK]=$'\U1F1E8\U1F1F0'
4444+emoji_flags[cook_islands]=$'\U1F1E8\U1F1F0'
4445+emoji_flags[Chile]=$'\U1F1E8\U1F1F1'
4446+emoji_flags[CL]=$'\U1F1E8\U1F1F1'
4447+emoji_flags[CHL]=$'\U1F1E8\U1F1F1'
4448+emoji_flags[chile]=$'\U1F1E8\U1F1F1'
4449+emoji_flags[Cameroon]=$'\U1F1E8\U1F1F2'
4450+emoji_flags[CM]=$'\U1F1E8\U1F1F2'
4451+emoji_flags[CMR]=$'\U1F1E8\U1F1F2'
4452+emoji_flags[cameroon]=$'\U1F1E8\U1F1F2'
4453+emoji_flags[China]=$'\U1F1E8\U1F1F3'
4454+emoji_flags[CN]=$'\U1F1E8\U1F1F3'
4455+emoji_flags[CHN]=$'\U1F1E8\U1F1F3'
4456+emoji_flags[cn]=$'\U1F1E8\U1F1F3'
4457+emoji_flags[Colombia]=$'\U1F1E8\U1F1F4'
4458+emoji_flags[CO]=$'\U1F1E8\U1F1F4'
4459+emoji_flags[COL]=$'\U1F1E8\U1F1F4'
4460+emoji_flags[colombia]=$'\U1F1E8\U1F1F4'
4461+emoji_flags[Clipperton_Island]=$'\U1F1E8\U1F1F5'
4462+emoji_flags[clipperton_island]=$'\U1F1E8\U1F1F5'
4463+emoji_flags[Costa_Rica]=$'\U1F1E8\U1F1F7'
4464+emoji_flags[CR]=$'\U1F1E8\U1F1F7'
4465+emoji_flags[CRI]=$'\U1F1E8\U1F1F7'
4466+emoji_flags[costa_rica]=$'\U1F1E8\U1F1F7'
4467+emoji_flags[Cuba]=$'\U1F1E8\U1F1FA'
4468+emoji_flags[CU]=$'\U1F1E8\U1F1FA'
4469+emoji_flags[CUB]=$'\U1F1E8\U1F1FA'
4470+emoji_flags[cuba]=$'\U1F1E8\U1F1FA'
4471+emoji_flags[Cape_Verde]=$'\U1F1E8\U1F1FB'
4472+emoji_flags[CV]=$'\U1F1E8\U1F1FB'
4473+emoji_flags[CPV]=$'\U1F1E8\U1F1FB'
4474+emoji_flags[cape_verde]=$'\U1F1E8\U1F1FB'
4475+emoji_flags[Curaรงao]=$'\U1F1E8\U1F1FC'
4476+emoji_flags[CW]=$'\U1F1E8\U1F1FC'
4477+emoji_flags[CUW]=$'\U1F1E8\U1F1FC'
4478+emoji_flags[curacao]=$'\U1F1E8\U1F1FC'
4479+emoji_flags[Christmas_Island]=$'\U1F1E8\U1F1FD'
4480+emoji_flags[CX]=$'\U1F1E8\U1F1FD'
4481+emoji_flags[CXR]=$'\U1F1E8\U1F1FD'
4482+emoji_flags[christmas_island]=$'\U1F1E8\U1F1FD'
4483+emoji_flags[Cyprus]=$'\U1F1E8\U1F1FE'
4484+emoji_flags[CY]=$'\U1F1E8\U1F1FE'
4485+emoji_flags[CYP]=$'\U1F1E8\U1F1FE'
4486+emoji_flags[cyprus]=$'\U1F1E8\U1F1FE'
4487+emoji_flags[Czechia]=$'\U1F1E8\U1F1FF'
4488+emoji_flags[CZ]=$'\U1F1E8\U1F1FF'
4489+emoji_flags[CZE]=$'\U1F1E8\U1F1FF'
4490+emoji_flags[czech_republic]=$'\U1F1E8\U1F1FF'
4491+emoji_flags[Germany]=$'\U1F1E9\U1F1EA'
4492+emoji_flags[DE]=$'\U1F1E9\U1F1EA'
4493+emoji_flags[DEU]=$'\U1F1E9\U1F1EA'
4494+emoji_flags[de]=$'\U1F1E9\U1F1EA'
4495+emoji_flags[Diego_Garcia]=$'\U1F1E9\U1F1EC'
4496+emoji_flags[diego_garcia]=$'\U1F1E9\U1F1EC'
4497+emoji_flags[Djibouti]=$'\U1F1E9\U1F1EF'
4498+emoji_flags[DJ]=$'\U1F1E9\U1F1EF'
4499+emoji_flags[DJI]=$'\U1F1E9\U1F1EF'
4500+emoji_flags[djibouti]=$'\U1F1E9\U1F1EF'
4501+emoji_flags[Denmark]=$'\U1F1E9\U1F1F0'
4502+emoji_flags[DK]=$'\U1F1E9\U1F1F0'
4503+emoji_flags[DNK]=$'\U1F1E9\U1F1F0'
4504+emoji_flags[denmark]=$'\U1F1E9\U1F1F0'
4505+emoji_flags[Dominica]=$'\U1F1E9\U1F1F2'
4506+emoji_flags[DM]=$'\U1F1E9\U1F1F2'
4507+emoji_flags[DMA]=$'\U1F1E9\U1F1F2'
4508+emoji_flags[dominica]=$'\U1F1E9\U1F1F2'
4509+emoji_flags[Dominican_Republic]=$'\U1F1E9\U1F1F4'
4510+emoji_flags[DO]=$'\U1F1E9\U1F1F4'
4511+emoji_flags[DOM]=$'\U1F1E9\U1F1F4'
4512+emoji_flags[dominican_republic]=$'\U1F1E9\U1F1F4'
4513+emoji_flags[Algeria]=$'\U1F1E9\U1F1FF'
4514+emoji_flags[DZ]=$'\U1F1E9\U1F1FF'
4515+emoji_flags[DZA]=$'\U1F1E9\U1F1FF'
4516+emoji_flags[algeria]=$'\U1F1E9\U1F1FF'
4517+emoji_flags[Ceuta_and_Melilla]=$'\U1F1EA\U1F1E6'
4518+emoji_flags[ceuta_melilla]=$'\U1F1EA\U1F1E6'
4519+emoji_flags[Ecuador]=$'\U1F1EA\U1F1E8'
4520+emoji_flags[EC]=$'\U1F1EA\U1F1E8'
4521+emoji_flags[ECU]=$'\U1F1EA\U1F1E8'
4522+emoji_flags[ecuador]=$'\U1F1EA\U1F1E8'
4523+emoji_flags[Estonia]=$'\U1F1EA\U1F1EA'
4524+emoji_flags[EE]=$'\U1F1EA\U1F1EA'
4525+emoji_flags[EST]=$'\U1F1EA\U1F1EA'
4526+emoji_flags[estonia]=$'\U1F1EA\U1F1EA'
4527+emoji_flags[Egypt]=$'\U1F1EA\U1F1EC'
4528+emoji_flags[EG]=$'\U1F1EA\U1F1EC'
4529+emoji_flags[EGY]=$'\U1F1EA\U1F1EC'
4530+emoji_flags[egypt]=$'\U1F1EA\U1F1EC'
4531+emoji_flags[Western_Sahara]=$'\U1F1EA\U1F1ED'
4532+emoji_flags[EH]=$'\U1F1EA\U1F1ED'
4533+emoji_flags[ESH]=$'\U1F1EA\U1F1ED'
4534+emoji_flags[western_sahara]=$'\U1F1EA\U1F1ED'
4535+emoji_flags[Eritrea]=$'\U1F1EA\U1F1F7'
4536+emoji_flags[ER]=$'\U1F1EA\U1F1F7'
4537+emoji_flags[ERI]=$'\U1F1EA\U1F1F7'
4538+emoji_flags[eritrea]=$'\U1F1EA\U1F1F7'
4539+emoji_flags[Spain]=$'\U1F1EA\U1F1F8'
4540+emoji_flags[ES]=$'\U1F1EA\U1F1F8'
4541+emoji_flags[ESP]=$'\U1F1EA\U1F1F8'
4542+emoji_flags[es]=$'\U1F1EA\U1F1F8'
4543+emoji_flags[Ethiopia]=$'\U1F1EA\U1F1F9'
4544+emoji_flags[ET]=$'\U1F1EA\U1F1F9'
4545+emoji_flags[ETH]=$'\U1F1EA\U1F1F9'
4546+emoji_flags[ethiopia]=$'\U1F1EA\U1F1F9'
4547+emoji_flags[European_Union]=$'\U1F1EA\U1F1FA'
4548+emoji_flags[eu]=$'\U1F1EA\U1F1FA'
4549+emoji_flags[european_union]=$'\U1F1EA\U1F1FA'
4550+emoji_flags[Finland]=$'\U1F1EB\U1F1EE'
4551+emoji_flags[FI]=$'\U1F1EB\U1F1EE'
4552+emoji_flags[FIN]=$'\U1F1EB\U1F1EE'
4553+emoji_flags[finland]=$'\U1F1EB\U1F1EE'
4554+emoji_flags[Fiji]=$'\U1F1EB\U1F1EF'
4555+emoji_flags[FJ]=$'\U1F1EB\U1F1EF'
4556+emoji_flags[FJI]=$'\U1F1EB\U1F1EF'
4557+emoji_flags[fiji]=$'\U1F1EB\U1F1EF'
4558+emoji_flags[Falkland_Islands]=$'\U1F1EB\U1F1F0'
4559+emoji_flags[FK]=$'\U1F1EB\U1F1F0'
4560+emoji_flags[FLK]=$'\U1F1EB\U1F1F0'
4561+emoji_flags[falkland_islands]=$'\U1F1EB\U1F1F0'
4562+emoji_flags[Micronesia]=$'\U1F1EB\U1F1F2'
4563+emoji_flags[FM]=$'\U1F1EB\U1F1F2'
4564+emoji_flags[FSM]=$'\U1F1EB\U1F1F2'
4565+emoji_flags[micronesia]=$'\U1F1EB\U1F1F2'
4566+emoji_flags[Faroe_Islands]=$'\U1F1EB\U1F1F4'
4567+emoji_flags[FO]=$'\U1F1EB\U1F1F4'
4568+emoji_flags[FRO]=$'\U1F1EB\U1F1F4'
4569+emoji_flags[faroe_islands]=$'\U1F1EB\U1F1F4'
4570+emoji_flags[France]=$'\U1F1EB\U1F1F7'
4571+emoji_flags[FR]=$'\U1F1EB\U1F1F7'
4572+emoji_flags[FRA]=$'\U1F1EB\U1F1F7'
4573+emoji_flags[fr]=$'\U1F1EB\U1F1F7'
4574+emoji_flags[Gabon]=$'\U1F1EC\U1F1E6'
4575+emoji_flags[GA]=$'\U1F1EC\U1F1E6'
4576+emoji_flags[GAB]=$'\U1F1EC\U1F1E6'
4577+emoji_flags[gabon]=$'\U1F1EC\U1F1E6'
4578+emoji_flags[United_Kingdom]=$'\U1F1EC\U1F1E7'
4579+emoji_flags[GB]=$'\U1F1EC\U1F1E7'
4580+emoji_flags[GBR]=$'\U1F1EC\U1F1E7'
4581+emoji_flags[gb]=$'\U1F1EC\U1F1E7'
4582+emoji_flags[uk]=$'\U1F1EC\U1F1E7'
4583+emoji_flags[Grenada]=$'\U1F1EC\U1F1E9'
4584+emoji_flags[GD]=$'\U1F1EC\U1F1E9'
4585+emoji_flags[GRD]=$'\U1F1EC\U1F1E9'
4586+emoji_flags[grenada]=$'\U1F1EC\U1F1E9'
4587+emoji_flags[Georgia]=$'\U1F1EC\U1F1EA'
4588+emoji_flags[GE]=$'\U1F1EC\U1F1EA'
4589+emoji_flags[GEO]=$'\U1F1EC\U1F1EA'
4590+emoji_flags[georgia]=$'\U1F1EC\U1F1EA'
4591+emoji_flags[French_Guiana]=$'\U1F1EC\U1F1EB'
4592+emoji_flags[GF]=$'\U1F1EC\U1F1EB'
4593+emoji_flags[GUF]=$'\U1F1EC\U1F1EB'
4594+emoji_flags[french_guiana]=$'\U1F1EC\U1F1EB'
4595+emoji_flags[Guernsey]=$'\U1F1EC\U1F1EC'
4596+emoji_flags[GG]=$'\U1F1EC\U1F1EC'
4597+emoji_flags[GGY]=$'\U1F1EC\U1F1EC'
4598+emoji_flags[guernsey]=$'\U1F1EC\U1F1EC'
4599+emoji_flags[Ghana]=$'\U1F1EC\U1F1ED'
4600+emoji_flags[GH]=$'\U1F1EC\U1F1ED'
4601+emoji_flags[GHA]=$'\U1F1EC\U1F1ED'
4602+emoji_flags[ghana]=$'\U1F1EC\U1F1ED'
4603+emoji_flags[Gibraltar]=$'\U1F1EC\U1F1EE'
4604+emoji_flags[GI]=$'\U1F1EC\U1F1EE'
4605+emoji_flags[GIB]=$'\U1F1EC\U1F1EE'
4606+emoji_flags[gibraltar]=$'\U1F1EC\U1F1EE'
4607+emoji_flags[Greenland]=$'\U1F1EC\U1F1F1'
4608+emoji_flags[GL]=$'\U1F1EC\U1F1F1'
4609+emoji_flags[GRL]=$'\U1F1EC\U1F1F1'
4610+emoji_flags[greenland]=$'\U1F1EC\U1F1F1'
4611+emoji_flags[Gambia]=$'\U1F1EC\U1F1F2'
4612+emoji_flags[GM]=$'\U1F1EC\U1F1F2'
4613+emoji_flags[GMB]=$'\U1F1EC\U1F1F2'
4614+emoji_flags[gambia]=$'\U1F1EC\U1F1F2'
4615+emoji_flags[Guinea]=$'\U1F1EC\U1F1F3'
4616+emoji_flags[GN]=$'\U1F1EC\U1F1F3'
4617+emoji_flags[GIN]=$'\U1F1EC\U1F1F3'
4618+emoji_flags[guinea]=$'\U1F1EC\U1F1F3'
4619+emoji_flags[Guadeloupe]=$'\U1F1EC\U1F1F5'
4620+emoji_flags[GP]=$'\U1F1EC\U1F1F5'
4621+emoji_flags[GLP]=$'\U1F1EC\U1F1F5'
4622+emoji_flags[guadeloupe]=$'\U1F1EC\U1F1F5'
4623+emoji_flags[Equatorial_Guinea]=$'\U1F1EC\U1F1F6'
4624+emoji_flags[GQ]=$'\U1F1EC\U1F1F6'
4625+emoji_flags[GNQ]=$'\U1F1EC\U1F1F6'
4626+emoji_flags[equatorial_guinea]=$'\U1F1EC\U1F1F6'
4627+emoji_flags[Greece]=$'\U1F1EC\U1F1F7'
4628+emoji_flags[GR]=$'\U1F1EC\U1F1F7'
4629+emoji_flags[GRC]=$'\U1F1EC\U1F1F7'
4630+emoji_flags[greece]=$'\U1F1EC\U1F1F7'
4631+emoji_flags[South_Georgia_and_South_Sandwich_Islands]=$'\U1F1EC\U1F1F8'
4632+emoji_flags[GS]=$'\U1F1EC\U1F1F8'
4633+emoji_flags[SGS]=$'\U1F1EC\U1F1F8'
4634+emoji_flags[south_georgia_south_sandwich_islands]=$'\U1F1EC\U1F1F8'
4635+emoji_flags[Guatemala]=$'\U1F1EC\U1F1F9'
4636+emoji_flags[GT]=$'\U1F1EC\U1F1F9'
4637+emoji_flags[GTM]=$'\U1F1EC\U1F1F9'
4638+emoji_flags[guatemala]=$'\U1F1EC\U1F1F9'
4639+emoji_flags[Guam]=$'\U1F1EC\U1F1FA'
4640+emoji_flags[GU]=$'\U1F1EC\U1F1FA'
4641+emoji_flags[GUM]=$'\U1F1EC\U1F1FA'
4642+emoji_flags[guam]=$'\U1F1EC\U1F1FA'
4643+emoji_flags[Guinea_Bissau]=$'\U1F1EC\U1F1FC'
4644+emoji_flags[GW]=$'\U1F1EC\U1F1FC'
4645+emoji_flags[GNB]=$'\U1F1EC\U1F1FC'
4646+emoji_flags[guinea_bissau]=$'\U1F1EC\U1F1FC'
4647+emoji_flags[Guyana]=$'\U1F1EC\U1F1FE'
4648+emoji_flags[GY]=$'\U1F1EC\U1F1FE'
4649+emoji_flags[GUY]=$'\U1F1EC\U1F1FE'
4650+emoji_flags[guyana]=$'\U1F1EC\U1F1FE'
4651+emoji_flags[Hong_Kong_SAR_China]=$'\U1F1ED\U1F1F0'
4652+emoji_flags[HK]=$'\U1F1ED\U1F1F0'
4653+emoji_flags[HKG]=$'\U1F1ED\U1F1F0'
4654+emoji_flags[hong_kong]=$'\U1F1ED\U1F1F0'
4655+emoji_flags[Heard_and_McDonald_Islands]=$'\U1F1ED\U1F1F2'
4656+emoji_flags[HM]=$'\U1F1ED\U1F1F2'
4657+emoji_flags[HMD]=$'\U1F1ED\U1F1F2'
4658+emoji_flags[heard_mcdonald_islands]=$'\U1F1ED\U1F1F2'
4659+emoji_flags[Honduras]=$'\U1F1ED\U1F1F3'
4660+emoji_flags[HN]=$'\U1F1ED\U1F1F3'
4661+emoji_flags[HND]=$'\U1F1ED\U1F1F3'
4662+emoji_flags[honduras]=$'\U1F1ED\U1F1F3'
4663+emoji_flags[Croatia]=$'\U1F1ED\U1F1F7'
4664+emoji_flags[HR]=$'\U1F1ED\U1F1F7'
4665+emoji_flags[HRV]=$'\U1F1ED\U1F1F7'
4666+emoji_flags[croatia]=$'\U1F1ED\U1F1F7'
4667+emoji_flags[Haiti]=$'\U1F1ED\U1F1F9'
4668+emoji_flags[HT]=$'\U1F1ED\U1F1F9'
4669+emoji_flags[HTI]=$'\U1F1ED\U1F1F9'
4670+emoji_flags[haiti]=$'\U1F1ED\U1F1F9'
4671+emoji_flags[Hungary]=$'\U1F1ED\U1F1FA'
4672+emoji_flags[HU]=$'\U1F1ED\U1F1FA'
4673+emoji_flags[HUN]=$'\U1F1ED\U1F1FA'
4674+emoji_flags[hungary]=$'\U1F1ED\U1F1FA'
4675+emoji_flags[Canary_Islands]=$'\U1F1EE\U1F1E8'
4676+emoji_flags[canary_islands]=$'\U1F1EE\U1F1E8'
4677+emoji_flags[Indonesia]=$'\U1F1EE\U1F1E9'
4678+emoji_flags[ID]=$'\U1F1EE\U1F1E9'
4679+emoji_flags[IDN]=$'\U1F1EE\U1F1E9'
4680+emoji_flags[indonesia]=$'\U1F1EE\U1F1E9'
4681+emoji_flags[Ireland]=$'\U1F1EE\U1F1EA'
4682+emoji_flags[IE]=$'\U1F1EE\U1F1EA'
4683+emoji_flags[IRL]=$'\U1F1EE\U1F1EA'
4684+emoji_flags[ireland]=$'\U1F1EE\U1F1EA'
4685+emoji_flags[Israel]=$'\U1F1EE\U1F1F1'
4686+emoji_flags[IL]=$'\U1F1EE\U1F1F1'
4687+emoji_flags[ISR]=$'\U1F1EE\U1F1F1'
4688+emoji_flags[israel]=$'\U1F1EE\U1F1F1'
4689+emoji_flags[Isle_of_Man]=$'\U1F1EE\U1F1F2'
4690+emoji_flags[IM]=$'\U1F1EE\U1F1F2'
4691+emoji_flags[IMN]=$'\U1F1EE\U1F1F2'
4692+emoji_flags[isle_of_man]=$'\U1F1EE\U1F1F2'
4693+emoji_flags[India]=$'\U1F1EE\U1F1F3'
4694+emoji_flags[IN]=$'\U1F1EE\U1F1F3'
4695+emoji_flags[IND]=$'\U1F1EE\U1F1F3'
4696+emoji_flags[india]=$'\U1F1EE\U1F1F3'
4697+emoji_flags[British_Indian_Ocean_Territory]=$'\U1F1EE\U1F1F4'
4698+emoji_flags[IO]=$'\U1F1EE\U1F1F4'
4699+emoji_flags[IOT]=$'\U1F1EE\U1F1F4'
4700+emoji_flags[british_indian_ocean_territory]=$'\U1F1EE\U1F1F4'
4701+emoji_flags[Iraq]=$'\U1F1EE\U1F1F6'
4702+emoji_flags[IQ]=$'\U1F1EE\U1F1F6'
4703+emoji_flags[IRQ]=$'\U1F1EE\U1F1F6'
4704+emoji_flags[iraq]=$'\U1F1EE\U1F1F6'
4705+emoji_flags[Iran]=$'\U1F1EE\U1F1F7'
4706+emoji_flags[IR]=$'\U1F1EE\U1F1F7'
4707+emoji_flags[IRN]=$'\U1F1EE\U1F1F7'
4708+emoji_flags[iran]=$'\U1F1EE\U1F1F7'
4709+emoji_flags[Iceland]=$'\U1F1EE\U1F1F8'
4710+emoji_flags[IS]=$'\U1F1EE\U1F1F8'
4711+emoji_flags[ISL]=$'\U1F1EE\U1F1F8'
4712+emoji_flags[iceland]=$'\U1F1EE\U1F1F8'
4713+emoji_flags[Italy]=$'\U1F1EE\U1F1F9'
4714+emoji_flags[IT]=$'\U1F1EE\U1F1F9'
4715+emoji_flags[ITA]=$'\U1F1EE\U1F1F9'
4716+emoji_flags[it]=$'\U1F1EE\U1F1F9'
4717+emoji_flags[Jersey]=$'\U1F1EF\U1F1EA'
4718+emoji_flags[JE]=$'\U1F1EF\U1F1EA'
4719+emoji_flags[JEY]=$'\U1F1EF\U1F1EA'
4720+emoji_flags[jersey]=$'\U1F1EF\U1F1EA'
4721+emoji_flags[Jamaica]=$'\U1F1EF\U1F1F2'
4722+emoji_flags[JM]=$'\U1F1EF\U1F1F2'
4723+emoji_flags[JAM]=$'\U1F1EF\U1F1F2'
4724+emoji_flags[jamaica]=$'\U1F1EF\U1F1F2'
4725+emoji_flags[Jordan]=$'\U1F1EF\U1F1F4'
4726+emoji_flags[JO]=$'\U1F1EF\U1F1F4'
4727+emoji_flags[JOR]=$'\U1F1EF\U1F1F4'
4728+emoji_flags[jordan]=$'\U1F1EF\U1F1F4'
4729+emoji_flags[Japan]=$'\U1F1EF\U1F1F5'
4730+emoji_flags[JP]=$'\U1F1EF\U1F1F5'
4731+emoji_flags[JPN]=$'\U1F1EF\U1F1F5'
4732+emoji_flags[jp]=$'\U1F1EF\U1F1F5'
4733+emoji_flags[Kenya]=$'\U1F1F0\U1F1EA'
4734+emoji_flags[KE]=$'\U1F1F0\U1F1EA'
4735+emoji_flags[KEN]=$'\U1F1F0\U1F1EA'
4736+emoji_flags[kenya]=$'\U1F1F0\U1F1EA'
4737+emoji_flags[Kyrgyzstan]=$'\U1F1F0\U1F1EC'
4738+emoji_flags[KG]=$'\U1F1F0\U1F1EC'
4739+emoji_flags[KGZ]=$'\U1F1F0\U1F1EC'
4740+emoji_flags[kyrgyzstan]=$'\U1F1F0\U1F1EC'
4741+emoji_flags[Cambodia]=$'\U1F1F0\U1F1ED'
4742+emoji_flags[KH]=$'\U1F1F0\U1F1ED'
4743+emoji_flags[KHM]=$'\U1F1F0\U1F1ED'
4744+emoji_flags[cambodia]=$'\U1F1F0\U1F1ED'
4745+emoji_flags[Kiribati]=$'\U1F1F0\U1F1EE'
4746+emoji_flags[KI]=$'\U1F1F0\U1F1EE'
4747+emoji_flags[KIR]=$'\U1F1F0\U1F1EE'
4748+emoji_flags[kiribati]=$'\U1F1F0\U1F1EE'
4749+emoji_flags[Comoros]=$'\U1F1F0\U1F1F2'
4750+emoji_flags[KM]=$'\U1F1F0\U1F1F2'
4751+emoji_flags[COM]=$'\U1F1F0\U1F1F2'
4752+emoji_flags[comoros]=$'\U1F1F0\U1F1F2'
4753+emoji_flags[St_Kitts_and_Nevis]=$'\U1F1F0\U1F1F3'
4754+emoji_flags[KN]=$'\U1F1F0\U1F1F3'
4755+emoji_flags[KNA]=$'\U1F1F0\U1F1F3'
4756+emoji_flags[st_kitts_nevis]=$'\U1F1F0\U1F1F3'
4757+emoji_flags[North_Korea]=$'\U1F1F0\U1F1F5'
4758+emoji_flags[KP]=$'\U1F1F0\U1F1F5'
4759+emoji_flags[PRK]=$'\U1F1F0\U1F1F5'
4760+emoji_flags[north_korea]=$'\U1F1F0\U1F1F5'
4761+emoji_flags[South_Korea]=$'\U1F1F0\U1F1F7'
4762+emoji_flags[KR]=$'\U1F1F0\U1F1F7'
4763+emoji_flags[KOR]=$'\U1F1F0\U1F1F7'
4764+emoji_flags[kr]=$'\U1F1F0\U1F1F7'
4765+emoji_flags[Kuwait]=$'\U1F1F0\U1F1FC'
4766+emoji_flags[KW]=$'\U1F1F0\U1F1FC'
4767+emoji_flags[KWT]=$'\U1F1F0\U1F1FC'
4768+emoji_flags[kuwait]=$'\U1F1F0\U1F1FC'
4769+emoji_flags[Cayman_Islands]=$'\U1F1F0\U1F1FE'
4770+emoji_flags[KY]=$'\U1F1F0\U1F1FE'
4771+emoji_flags[CYM]=$'\U1F1F0\U1F1FE'
4772+emoji_flags[cayman_islands]=$'\U1F1F0\U1F1FE'
4773+emoji_flags[Kazakhstan]=$'\U1F1F0\U1F1FF'
4774+emoji_flags[KZ]=$'\U1F1F0\U1F1FF'
4775+emoji_flags[KAZ]=$'\U1F1F0\U1F1FF'
4776+emoji_flags[kazakhstan]=$'\U1F1F0\U1F1FF'
4777+emoji_flags[Laos]=$'\U1F1F1\U1F1E6'
4778+emoji_flags[LA]=$'\U1F1F1\U1F1E6'
4779+emoji_flags[LAO]=$'\U1F1F1\U1F1E6'
4780+emoji_flags[laos]=$'\U1F1F1\U1F1E6'
4781+emoji_flags[Lebanon]=$'\U1F1F1\U1F1E7'
4782+emoji_flags[LB]=$'\U1F1F1\U1F1E7'
4783+emoji_flags[LBN]=$'\U1F1F1\U1F1E7'
4784+emoji_flags[lebanon]=$'\U1F1F1\U1F1E7'
4785+emoji_flags[St_Lucia]=$'\U1F1F1\U1F1E8'
4786+emoji_flags[LC]=$'\U1F1F1\U1F1E8'
4787+emoji_flags[LCA]=$'\U1F1F1\U1F1E8'
4788+emoji_flags[st_lucia]=$'\U1F1F1\U1F1E8'
4789+emoji_flags[Liechtenstein]=$'\U1F1F1\U1F1EE'
4790+emoji_flags[LI]=$'\U1F1F1\U1F1EE'
4791+emoji_flags[LIE]=$'\U1F1F1\U1F1EE'
4792+emoji_flags[liechtenstein]=$'\U1F1F1\U1F1EE'
4793+emoji_flags[Sri_Lanka]=$'\U1F1F1\U1F1F0'
4794+emoji_flags[LK]=$'\U1F1F1\U1F1F0'
4795+emoji_flags[LKA]=$'\U1F1F1\U1F1F0'
4796+emoji_flags[sri_lanka]=$'\U1F1F1\U1F1F0'
4797+emoji_flags[Liberia]=$'\U1F1F1\U1F1F7'
4798+emoji_flags[LR]=$'\U1F1F1\U1F1F7'
4799+emoji_flags[LBR]=$'\U1F1F1\U1F1F7'
4800+emoji_flags[liberia]=$'\U1F1F1\U1F1F7'
4801+emoji_flags[Lesotho]=$'\U1F1F1\U1F1F8'
4802+emoji_flags[LS]=$'\U1F1F1\U1F1F8'
4803+emoji_flags[LSO]=$'\U1F1F1\U1F1F8'
4804+emoji_flags[lesotho]=$'\U1F1F1\U1F1F8'
4805+emoji_flags[Lithuania]=$'\U1F1F1\U1F1F9'
4806+emoji_flags[LT]=$'\U1F1F1\U1F1F9'
4807+emoji_flags[LTU]=$'\U1F1F1\U1F1F9'
4808+emoji_flags[lithuania]=$'\U1F1F1\U1F1F9'
4809+emoji_flags[Luxembourg]=$'\U1F1F1\U1F1FA'
4810+emoji_flags[LU]=$'\U1F1F1\U1F1FA'
4811+emoji_flags[LUX]=$'\U1F1F1\U1F1FA'
4812+emoji_flags[luxembourg]=$'\U1F1F1\U1F1FA'
4813+emoji_flags[Latvia]=$'\U1F1F1\U1F1FB'
4814+emoji_flags[LV]=$'\U1F1F1\U1F1FB'
4815+emoji_flags[LVA]=$'\U1F1F1\U1F1FB'
4816+emoji_flags[latvia]=$'\U1F1F1\U1F1FB'
4817+emoji_flags[Libya]=$'\U1F1F1\U1F1FE'
4818+emoji_flags[LY]=$'\U1F1F1\U1F1FE'
4819+emoji_flags[LBY]=$'\U1F1F1\U1F1FE'
4820+emoji_flags[libya]=$'\U1F1F1\U1F1FE'
4821+emoji_flags[Morocco]=$'\U1F1F2\U1F1E6'
4822+emoji_flags[MA]=$'\U1F1F2\U1F1E6'
4823+emoji_flags[MAR]=$'\U1F1F2\U1F1E6'
4824+emoji_flags[morocco]=$'\U1F1F2\U1F1E6'
4825+emoji_flags[Monaco]=$'\U1F1F2\U1F1E8'
4826+emoji_flags[MC]=$'\U1F1F2\U1F1E8'
4827+emoji_flags[MCO]=$'\U1F1F2\U1F1E8'
4828+emoji_flags[monaco]=$'\U1F1F2\U1F1E8'
4829+emoji_flags[Moldova]=$'\U1F1F2\U1F1E9'
4830+emoji_flags[MD]=$'\U1F1F2\U1F1E9'
4831+emoji_flags[MDA]=$'\U1F1F2\U1F1E9'
4832+emoji_flags[moldova]=$'\U1F1F2\U1F1E9'
4833+emoji_flags[Montenegro]=$'\U1F1F2\U1F1EA'
4834+emoji_flags[ME]=$'\U1F1F2\U1F1EA'
4835+emoji_flags[MNE]=$'\U1F1F2\U1F1EA'
4836+emoji_flags[montenegro]=$'\U1F1F2\U1F1EA'
4837+emoji_flags[St_Martin]=$'\U1F1F2\U1F1EB'
4838+emoji_flags[MF]=$'\U1F1F2\U1F1EB'
4839+emoji_flags[MAF]=$'\U1F1F2\U1F1EB'
4840+emoji_flags[st_martin]=$'\U1F1F2\U1F1EB'
4841+emoji_flags[Madagascar]=$'\U1F1F2\U1F1EC'
4842+emoji_flags[MG]=$'\U1F1F2\U1F1EC'
4843+emoji_flags[MDG]=$'\U1F1F2\U1F1EC'
4844+emoji_flags[madagascar]=$'\U1F1F2\U1F1EC'
4845+emoji_flags[Marshall_Islands]=$'\U1F1F2\U1F1ED'
4846+emoji_flags[MH]=$'\U1F1F2\U1F1ED'
4847+emoji_flags[MHL]=$'\U1F1F2\U1F1ED'
4848+emoji_flags[marshall_islands]=$'\U1F1F2\U1F1ED'
4849+emoji_flags[Macedonia]=$'\U1F1F2\U1F1F0'
4850+emoji_flags[MK]=$'\U1F1F2\U1F1F0'
4851+emoji_flags[MKD]=$'\U1F1F2\U1F1F0'
4852+emoji_flags[macedonia]=$'\U1F1F2\U1F1F0'
4853+emoji_flags[Mali]=$'\U1F1F2\U1F1F1'
4854+emoji_flags[ML]=$'\U1F1F2\U1F1F1'
4855+emoji_flags[MLI]=$'\U1F1F2\U1F1F1'
4856+emoji_flags[mali]=$'\U1F1F2\U1F1F1'
4857+emoji_flags[Myanmar_Burma_]=$'\U1F1F2\U1F1F2'
4858+emoji_flags[MM]=$'\U1F1F2\U1F1F2'
4859+emoji_flags[MMR]=$'\U1F1F2\U1F1F2'
4860+emoji_flags[myanmar]=$'\U1F1F2\U1F1F2'
4861+emoji_flags[Mongolia]=$'\U1F1F2\U1F1F3'
4862+emoji_flags[MN]=$'\U1F1F2\U1F1F3'
4863+emoji_flags[MNG]=$'\U1F1F2\U1F1F3'
4864+emoji_flags[mongolia]=$'\U1F1F2\U1F1F3'
4865+emoji_flags[Macao_SAR_China]=$'\U1F1F2\U1F1F4'
4866+emoji_flags[MO]=$'\U1F1F2\U1F1F4'
4867+emoji_flags[MAC]=$'\U1F1F2\U1F1F4'
4868+emoji_flags[macau]=$'\U1F1F2\U1F1F4'
4869+emoji_flags[Northern_Mariana_Islands]=$'\U1F1F2\U1F1F5'
4870+emoji_flags[MP]=$'\U1F1F2\U1F1F5'
4871+emoji_flags[MNP]=$'\U1F1F2\U1F1F5'
4872+emoji_flags[northern_mariana_islands]=$'\U1F1F2\U1F1F5'
4873+emoji_flags[Martinique]=$'\U1F1F2\U1F1F6'
4874+emoji_flags[MQ]=$'\U1F1F2\U1F1F6'
4875+emoji_flags[MTQ]=$'\U1F1F2\U1F1F6'
4876+emoji_flags[martinique]=$'\U1F1F2\U1F1F6'
4877+emoji_flags[Mauritania]=$'\U1F1F2\U1F1F7'
4878+emoji_flags[MR]=$'\U1F1F2\U1F1F7'
4879+emoji_flags[MRT]=$'\U1F1F2\U1F1F7'
4880+emoji_flags[mauritania]=$'\U1F1F2\U1F1F7'
4881+emoji_flags[Montserrat]=$'\U1F1F2\U1F1F8'
4882+emoji_flags[MS]=$'\U1F1F2\U1F1F8'
4883+emoji_flags[MSR]=$'\U1F1F2\U1F1F8'
4884+emoji_flags[montserrat]=$'\U1F1F2\U1F1F8'
4885+emoji_flags[Malta]=$'\U1F1F2\U1F1F9'
4886+emoji_flags[MT]=$'\U1F1F2\U1F1F9'
4887+emoji_flags[MLT]=$'\U1F1F2\U1F1F9'
4888+emoji_flags[malta]=$'\U1F1F2\U1F1F9'
4889+emoji_flags[Mauritius]=$'\U1F1F2\U1F1FA'
4890+emoji_flags[MU]=$'\U1F1F2\U1F1FA'
4891+emoji_flags[MUS]=$'\U1F1F2\U1F1FA'
4892+emoji_flags[mauritius]=$'\U1F1F2\U1F1FA'
4893+emoji_flags[Maldives]=$'\U1F1F2\U1F1FB'
4894+emoji_flags[MV]=$'\U1F1F2\U1F1FB'
4895+emoji_flags[MDV]=$'\U1F1F2\U1F1FB'
4896+emoji_flags[maldives]=$'\U1F1F2\U1F1FB'
4897+emoji_flags[Malawi]=$'\U1F1F2\U1F1FC'
4898+emoji_flags[MW]=$'\U1F1F2\U1F1FC'
4899+emoji_flags[MWI]=$'\U1F1F2\U1F1FC'
4900+emoji_flags[malawi]=$'\U1F1F2\U1F1FC'
4901+emoji_flags[Mexico]=$'\U1F1F2\U1F1FD'
4902+emoji_flags[MX]=$'\U1F1F2\U1F1FD'
4903+emoji_flags[MEX]=$'\U1F1F2\U1F1FD'
4904+emoji_flags[mexico]=$'\U1F1F2\U1F1FD'
4905+emoji_flags[Malaysia]=$'\U1F1F2\U1F1FE'
4906+emoji_flags[MY]=$'\U1F1F2\U1F1FE'
4907+emoji_flags[MYS]=$'\U1F1F2\U1F1FE'
4908+emoji_flags[malaysia]=$'\U1F1F2\U1F1FE'
4909+emoji_flags[Mozambique]=$'\U1F1F2\U1F1FF'
4910+emoji_flags[MZ]=$'\U1F1F2\U1F1FF'
4911+emoji_flags[MOZ]=$'\U1F1F2\U1F1FF'
4912+emoji_flags[mozambique]=$'\U1F1F2\U1F1FF'
4913+emoji_flags[Namibia]=$'\U1F1F3\U1F1E6'
4914+emoji_flags[NA]=$'\U1F1F3\U1F1E6'
4915+emoji_flags[NAM]=$'\U1F1F3\U1F1E6'
4916+emoji_flags[namibia]=$'\U1F1F3\U1F1E6'
4917+emoji_flags[New_Caledonia]=$'\U1F1F3\U1F1E8'
4918+emoji_flags[NC]=$'\U1F1F3\U1F1E8'
4919+emoji_flags[NCL]=$'\U1F1F3\U1F1E8'
4920+emoji_flags[new_caledonia]=$'\U1F1F3\U1F1E8'
4921+emoji_flags[Niger]=$'\U1F1F3\U1F1EA'
4922+emoji_flags[NE]=$'\U1F1F3\U1F1EA'
4923+emoji_flags[NER]=$'\U1F1F3\U1F1EA'
4924+emoji_flags[niger]=$'\U1F1F3\U1F1EA'
4925+emoji_flags[Norfolk_Island]=$'\U1F1F3\U1F1EB'
4926+emoji_flags[NF]=$'\U1F1F3\U1F1EB'
4927+emoji_flags[NFK]=$'\U1F1F3\U1F1EB'
4928+emoji_flags[norfolk_island]=$'\U1F1F3\U1F1EB'
4929+emoji_flags[Nigeria]=$'\U1F1F3\U1F1EC'
4930+emoji_flags[NG]=$'\U1F1F3\U1F1EC'
4931+emoji_flags[NGA]=$'\U1F1F3\U1F1EC'
4932+emoji_flags[nigeria]=$'\U1F1F3\U1F1EC'
4933+emoji_flags[Nicaragua]=$'\U1F1F3\U1F1EE'
4934+emoji_flags[NI]=$'\U1F1F3\U1F1EE'
4935+emoji_flags[NIC]=$'\U1F1F3\U1F1EE'
4936+emoji_flags[nicaragua]=$'\U1F1F3\U1F1EE'
4937+emoji_flags[Netherlands]=$'\U1F1F3\U1F1F1'
4938+emoji_flags[NL]=$'\U1F1F3\U1F1F1'
4939+emoji_flags[NLD]=$'\U1F1F3\U1F1F1'
4940+emoji_flags[netherlands]=$'\U1F1F3\U1F1F1'
4941+emoji_flags[Norway]=$'\U1F1F3\U1F1F4'
4942+emoji_flags[NO]=$'\U1F1F3\U1F1F4'
4943+emoji_flags[NOR]=$'\U1F1F3\U1F1F4'
4944+emoji_flags[norway]=$'\U1F1F3\U1F1F4'
4945+emoji_flags[Nepal]=$'\U1F1F3\U1F1F5'
4946+emoji_flags[NP]=$'\U1F1F3\U1F1F5'
4947+emoji_flags[NPL]=$'\U1F1F3\U1F1F5'
4948+emoji_flags[nepal]=$'\U1F1F3\U1F1F5'
4949+emoji_flags[Nauru]=$'\U1F1F3\U1F1F7'
4950+emoji_flags[NR]=$'\U1F1F3\U1F1F7'
4951+emoji_flags[NRU]=$'\U1F1F3\U1F1F7'
4952+emoji_flags[nauru]=$'\U1F1F3\U1F1F7'
4953+emoji_flags[Niue]=$'\U1F1F3\U1F1FA'
4954+emoji_flags[NU]=$'\U1F1F3\U1F1FA'
4955+emoji_flags[NIU]=$'\U1F1F3\U1F1FA'
4956+emoji_flags[niue]=$'\U1F1F3\U1F1FA'
4957+emoji_flags[New_Zealand]=$'\U1F1F3\U1F1FF'
4958+emoji_flags[NZ]=$'\U1F1F3\U1F1FF'
4959+emoji_flags[NZL]=$'\U1F1F3\U1F1FF'
4960+emoji_flags[new_zealand]=$'\U1F1F3\U1F1FF'
4961+emoji_flags[Oman]=$'\U1F1F4\U1F1F2'
4962+emoji_flags[OM]=$'\U1F1F4\U1F1F2'
4963+emoji_flags[OMN]=$'\U1F1F4\U1F1F2'
4964+emoji_flags[oman]=$'\U1F1F4\U1F1F2'
4965+emoji_flags[Panama]=$'\U1F1F5\U1F1E6'
4966+emoji_flags[PA]=$'\U1F1F5\U1F1E6'
4967+emoji_flags[PAN]=$'\U1F1F5\U1F1E6'
4968+emoji_flags[panama]=$'\U1F1F5\U1F1E6'
4969+emoji_flags[Peru]=$'\U1F1F5\U1F1EA'
4970+emoji_flags[PE]=$'\U1F1F5\U1F1EA'
4971+emoji_flags[PER]=$'\U1F1F5\U1F1EA'
4972+emoji_flags[peru]=$'\U1F1F5\U1F1EA'
4973+emoji_flags[French_Polynesia]=$'\U1F1F5\U1F1EB'
4974+emoji_flags[PF]=$'\U1F1F5\U1F1EB'
4975+emoji_flags[PYF]=$'\U1F1F5\U1F1EB'
4976+emoji_flags[french_polynesia]=$'\U1F1F5\U1F1EB'
4977+emoji_flags[Papua_New_Guinea]=$'\U1F1F5\U1F1EC'
4978+emoji_flags[PG]=$'\U1F1F5\U1F1EC'
4979+emoji_flags[PNG]=$'\U1F1F5\U1F1EC'
4980+emoji_flags[papua_new_guinea]=$'\U1F1F5\U1F1EC'
4981+emoji_flags[Philippines]=$'\U1F1F5\U1F1ED'
4982+emoji_flags[PH]=$'\U1F1F5\U1F1ED'
4983+emoji_flags[PHL]=$'\U1F1F5\U1F1ED'
4984+emoji_flags[philippines]=$'\U1F1F5\U1F1ED'
4985+emoji_flags[Pakistan]=$'\U1F1F5\U1F1F0'
4986+emoji_flags[PK]=$'\U1F1F5\U1F1F0'
4987+emoji_flags[PAK]=$'\U1F1F5\U1F1F0'
4988+emoji_flags[pakistan]=$'\U1F1F5\U1F1F0'
4989+emoji_flags[Poland]=$'\U1F1F5\U1F1F1'
4990+emoji_flags[PL]=$'\U1F1F5\U1F1F1'
4991+emoji_flags[POL]=$'\U1F1F5\U1F1F1'
4992+emoji_flags[poland]=$'\U1F1F5\U1F1F1'
4993+emoji_flags[St_Pierre_and_Miquelon]=$'\U1F1F5\U1F1F2'
4994+emoji_flags[PM]=$'\U1F1F5\U1F1F2'
4995+emoji_flags[SPM]=$'\U1F1F5\U1F1F2'
4996+emoji_flags[st_pierre_miquelon]=$'\U1F1F5\U1F1F2'
4997+emoji_flags[Pitcairn_Islands]=$'\U1F1F5\U1F1F3'
4998+emoji_flags[PN]=$'\U1F1F5\U1F1F3'
4999+emoji_flags[PCN]=$'\U1F1F5\U1F1F3'
5000+emoji_flags[pitcairn_islands]=$'\U1F1F5\U1F1F3'
5001+emoji_flags[Puerto_Rico]=$'\U1F1F5\U1F1F7'
5002+emoji_flags[PR]=$'\U1F1F5\U1F1F7'
5003+emoji_flags[PRI]=$'\U1F1F5\U1F1F7'
5004+emoji_flags[puerto_rico]=$'\U1F1F5\U1F1F7'
5005+emoji_flags[Palestinian_Territories]=$'\U1F1F5\U1F1F8'
5006+emoji_flags[PS]=$'\U1F1F5\U1F1F8'
5007+emoji_flags[PSE]=$'\U1F1F5\U1F1F8'
5008+emoji_flags[palestinian_territories]=$'\U1F1F5\U1F1F8'
5009+emoji_flags[Portugal]=$'\U1F1F5\U1F1F9'
5010+emoji_flags[PT]=$'\U1F1F5\U1F1F9'
5011+emoji_flags[PRT]=$'\U1F1F5\U1F1F9'
5012+emoji_flags[portugal]=$'\U1F1F5\U1F1F9'
5013+emoji_flags[Palau]=$'\U1F1F5\U1F1FC'
5014+emoji_flags[PW]=$'\U1F1F5\U1F1FC'
5015+emoji_flags[PLW]=$'\U1F1F5\U1F1FC'
5016+emoji_flags[palau]=$'\U1F1F5\U1F1FC'
5017+emoji_flags[Paraguay]=$'\U1F1F5\U1F1FE'
5018+emoji_flags[PY]=$'\U1F1F5\U1F1FE'
5019+emoji_flags[PRY]=$'\U1F1F5\U1F1FE'
5020+emoji_flags[paraguay]=$'\U1F1F5\U1F1FE'
5021+emoji_flags[Qatar]=$'\U1F1F6\U1F1E6'
5022+emoji_flags[QA]=$'\U1F1F6\U1F1E6'
5023+emoji_flags[QAT]=$'\U1F1F6\U1F1E6'
5024+emoji_flags[qatar]=$'\U1F1F6\U1F1E6'
5025+emoji_flags[Rรฉunion]=$'\U1F1F7\U1F1EA'
5026+emoji_flags[RE]=$'\U1F1F7\U1F1EA'
5027+emoji_flags[REU]=$'\U1F1F7\U1F1EA'
5028+emoji_flags[reunion]=$'\U1F1F7\U1F1EA'
5029+emoji_flags[Romania]=$'\U1F1F7\U1F1F4'
5030+emoji_flags[RO]=$'\U1F1F7\U1F1F4'
5031+emoji_flags[ROU]=$'\U1F1F7\U1F1F4'
5032+emoji_flags[romania]=$'\U1F1F7\U1F1F4'
5033+emoji_flags[Serbia]=$'\U1F1F7\U1F1F8'
5034+emoji_flags[RS]=$'\U1F1F7\U1F1F8'
5035+emoji_flags[SRB]=$'\U1F1F7\U1F1F8'
5036+emoji_flags[serbia]=$'\U1F1F7\U1F1F8'
5037+emoji_flags[Russia]=$'\U1F1F7\U1F1FA'
5038+emoji_flags[RU]=$'\U1F1F7\U1F1FA'
5039+emoji_flags[RUS]=$'\U1F1F7\U1F1FA'
5040+emoji_flags[ru]=$'\U1F1F7\U1F1FA'
5041+emoji_flags[Rwanda]=$'\U1F1F7\U1F1FC'
5042+emoji_flags[RW]=$'\U1F1F7\U1F1FC'
5043+emoji_flags[RWA]=$'\U1F1F7\U1F1FC'
5044+emoji_flags[rwanda]=$'\U1F1F7\U1F1FC'
5045+emoji_flags[Saudi_Arabia]=$'\U1F1F8\U1F1E6'
5046+emoji_flags[SA]=$'\U1F1F8\U1F1E6'
5047+emoji_flags[SAU]=$'\U1F1F8\U1F1E6'
5048+emoji_flags[saudi_arabia]=$'\U1F1F8\U1F1E6'
5049+emoji_flags[Solomon_Islands]=$'\U1F1F8\U1F1E7'
5050+emoji_flags[SB]=$'\U1F1F8\U1F1E7'
5051+emoji_flags[SLB]=$'\U1F1F8\U1F1E7'
5052+emoji_flags[solomon_islands]=$'\U1F1F8\U1F1E7'
5053+emoji_flags[Seychelles]=$'\U1F1F8\U1F1E8'
5054+emoji_flags[SC]=$'\U1F1F8\U1F1E8'
5055+emoji_flags[SYC]=$'\U1F1F8\U1F1E8'
5056+emoji_flags[seychelles]=$'\U1F1F8\U1F1E8'
5057+emoji_flags[Sudan]=$'\U1F1F8\U1F1E9'
5058+emoji_flags[SD]=$'\U1F1F8\U1F1E9'
5059+emoji_flags[SDN]=$'\U1F1F8\U1F1E9'
5060+emoji_flags[sudan]=$'\U1F1F8\U1F1E9'
5061+emoji_flags[Sweden]=$'\U1F1F8\U1F1EA'
5062+emoji_flags[SE]=$'\U1F1F8\U1F1EA'
5063+emoji_flags[SWE]=$'\U1F1F8\U1F1EA'
5064+emoji_flags[sweden]=$'\U1F1F8\U1F1EA'
5065+emoji_flags[Singapore]=$'\U1F1F8\U1F1EC'
5066+emoji_flags[SG]=$'\U1F1F8\U1F1EC'
5067+emoji_flags[SGP]=$'\U1F1F8\U1F1EC'
5068+emoji_flags[singapore]=$'\U1F1F8\U1F1EC'
5069+emoji_flags[St_Helena]=$'\U1F1F8\U1F1ED'
5070+emoji_flags[SH]=$'\U1F1F8\U1F1ED'
5071+emoji_flags[SHN]=$'\U1F1F8\U1F1ED'
5072+emoji_flags[st_helena]=$'\U1F1F8\U1F1ED'
5073+emoji_flags[Slovenia]=$'\U1F1F8\U1F1EE'
5074+emoji_flags[SI]=$'\U1F1F8\U1F1EE'
5075+emoji_flags[SVN]=$'\U1F1F8\U1F1EE'
5076+emoji_flags[slovenia]=$'\U1F1F8\U1F1EE'
5077+emoji_flags[Svalbard_and_Jan_Mayen]=$'\U1F1F8\U1F1EF'
5078+emoji_flags[SJ]=$'\U1F1F8\U1F1EF'
5079+emoji_flags[SJM]=$'\U1F1F8\U1F1EF'
5080+emoji_flags[svalbard_jan_mayen]=$'\U1F1F8\U1F1EF'
5081+emoji_flags[Slovakia]=$'\U1F1F8\U1F1F0'
5082+emoji_flags[SK]=$'\U1F1F8\U1F1F0'
5083+emoji_flags[SVK]=$'\U1F1F8\U1F1F0'
5084+emoji_flags[slovakia]=$'\U1F1F8\U1F1F0'
5085+emoji_flags[Sierra_Leone]=$'\U1F1F8\U1F1F1'
5086+emoji_flags[SL]=$'\U1F1F8\U1F1F1'
5087+emoji_flags[SLE]=$'\U1F1F8\U1F1F1'
5088+emoji_flags[sierra_leone]=$'\U1F1F8\U1F1F1'
5089+emoji_flags[San_Marino]=$'\U1F1F8\U1F1F2'
5090+emoji_flags[SM]=$'\U1F1F8\U1F1F2'
5091+emoji_flags[SMR]=$'\U1F1F8\U1F1F2'
5092+emoji_flags[san_marino]=$'\U1F1F8\U1F1F2'
5093+emoji_flags[Senegal]=$'\U1F1F8\U1F1F3'
5094+emoji_flags[SN]=$'\U1F1F8\U1F1F3'
5095+emoji_flags[SEN]=$'\U1F1F8\U1F1F3'
5096+emoji_flags[senegal]=$'\U1F1F8\U1F1F3'
5097+emoji_flags[Somalia]=$'\U1F1F8\U1F1F4'
5098+emoji_flags[SO]=$'\U1F1F8\U1F1F4'
5099+emoji_flags[SOM]=$'\U1F1F8\U1F1F4'
5100+emoji_flags[somalia]=$'\U1F1F8\U1F1F4'
5101+emoji_flags[Suriname]=$'\U1F1F8\U1F1F7'
5102+emoji_flags[SR]=$'\U1F1F8\U1F1F7'
5103+emoji_flags[SUR]=$'\U1F1F8\U1F1F7'
5104+emoji_flags[suriname]=$'\U1F1F8\U1F1F7'
5105+emoji_flags[South_Sudan]=$'\U1F1F8\U1F1F8'
5106+emoji_flags[SS]=$'\U1F1F8\U1F1F8'
5107+emoji_flags[SSD]=$'\U1F1F8\U1F1F8'
5108+emoji_flags[south_sudan]=$'\U1F1F8\U1F1F8'
5109+emoji_flags[Sรฃo_Tomรฉ_and_Prรญncipe]=$'\U1F1F8\U1F1F9'
5110+emoji_flags[sao_tome_principe]=$'\U1F1F8\U1F1F9'
5111+emoji_flags[El_Salvador]=$'\U1F1F8\U1F1FB'
5112+emoji_flags[SV]=$'\U1F1F8\U1F1FB'
5113+emoji_flags[SLV]=$'\U1F1F8\U1F1FB'
5114+emoji_flags[el_salvador]=$'\U1F1F8\U1F1FB'
5115+emoji_flags[Sint_Maarten]=$'\U1F1F8\U1F1FD'
5116+emoji_flags[SX]=$'\U1F1F8\U1F1FD'
5117+emoji_flags[SXM]=$'\U1F1F8\U1F1FD'
5118+emoji_flags[sint_maarten]=$'\U1F1F8\U1F1FD'
5119+emoji_flags[Syria]=$'\U1F1F8\U1F1FE'
5120+emoji_flags[SY]=$'\U1F1F8\U1F1FE'
5121+emoji_flags[SYR]=$'\U1F1F8\U1F1FE'
5122+emoji_flags[syria]=$'\U1F1F8\U1F1FE'
5123+emoji_flags[Eswatini]=$'\U1F1F8\U1F1FF'
5124+emoji_flags[SZ]=$'\U1F1F8\U1F1FF'
5125+emoji_flags[SWZ]=$'\U1F1F8\U1F1FF'
5126+emoji_flags[swaziland]=$'\U1F1F8\U1F1FF'
5127+emoji_flags[Tristan_da_Cunha]=$'\U1F1F9\U1F1E6'
5128+emoji_flags[tristan_da_cunha]=$'\U1F1F9\U1F1E6'
5129+emoji_flags[Turks_and_Caicos_Islands]=$'\U1F1F9\U1F1E8'
5130+emoji_flags[TC]=$'\U1F1F9\U1F1E8'
5131+emoji_flags[TCA]=$'\U1F1F9\U1F1E8'
5132+emoji_flags[turks_caicos_islands]=$'\U1F1F9\U1F1E8'
5133+emoji_flags[Chad]=$'\U1F1F9\U1F1E9'
5134+emoji_flags[TD]=$'\U1F1F9\U1F1E9'
5135+emoji_flags[TCD]=$'\U1F1F9\U1F1E9'
5136+emoji_flags[chad]=$'\U1F1F9\U1F1E9'
5137+emoji_flags[French_Southern_Territories]=$'\U1F1F9\U1F1EB'
5138+emoji_flags[TF]=$'\U1F1F9\U1F1EB'
5139+emoji_flags[ATF]=$'\U1F1F9\U1F1EB'
5140+emoji_flags[french_southern_territories]=$'\U1F1F9\U1F1EB'
5141+emoji_flags[Togo]=$'\U1F1F9\U1F1EC'
5142+emoji_flags[TG]=$'\U1F1F9\U1F1EC'
5143+emoji_flags[TGO]=$'\U1F1F9\U1F1EC'
5144+emoji_flags[togo]=$'\U1F1F9\U1F1EC'
5145+emoji_flags[Thailand]=$'\U1F1F9\U1F1ED'
5146+emoji_flags[TH]=$'\U1F1F9\U1F1ED'
5147+emoji_flags[THA]=$'\U1F1F9\U1F1ED'
5148+emoji_flags[thailand]=$'\U1F1F9\U1F1ED'
5149+emoji_flags[Tajikistan]=$'\U1F1F9\U1F1EF'
5150+emoji_flags[TJ]=$'\U1F1F9\U1F1EF'
5151+emoji_flags[TJK]=$'\U1F1F9\U1F1EF'
5152+emoji_flags[tajikistan]=$'\U1F1F9\U1F1EF'
5153+emoji_flags[Tokelau]=$'\U1F1F9\U1F1F0'
5154+emoji_flags[TK]=$'\U1F1F9\U1F1F0'
5155+emoji_flags[TKL]=$'\U1F1F9\U1F1F0'
5156+emoji_flags[tokelau]=$'\U1F1F9\U1F1F0'
5157+emoji_flags[Timor_Leste]=$'\U1F1F9\U1F1F1'
5158+emoji_flags[TL]=$'\U1F1F9\U1F1F1'
5159+emoji_flags[TLS]=$'\U1F1F9\U1F1F1'
5160+emoji_flags[timor_leste]=$'\U1F1F9\U1F1F1'
5161+emoji_flags[Turkmenistan]=$'\U1F1F9\U1F1F2'
5162+emoji_flags[TM]=$'\U1F1F9\U1F1F2'
5163+emoji_flags[TKM]=$'\U1F1F9\U1F1F2'
5164+emoji_flags[turkmenistan]=$'\U1F1F9\U1F1F2'
5165+emoji_flags[Tunisia]=$'\U1F1F9\U1F1F3'
5166+emoji_flags[TN]=$'\U1F1F9\U1F1F3'
5167+emoji_flags[TUN]=$'\U1F1F9\U1F1F3'
5168+emoji_flags[tunisia]=$'\U1F1F9\U1F1F3'
5169+emoji_flags[Tonga]=$'\U1F1F9\U1F1F4'
5170+emoji_flags[TO]=$'\U1F1F9\U1F1F4'
5171+emoji_flags[TON]=$'\U1F1F9\U1F1F4'
5172+emoji_flags[tonga]=$'\U1F1F9\U1F1F4'
5173+emoji_flags[Turkey]=$'\U1F1F9\U1F1F7'
5174+emoji_flags[TR]=$'\U1F1F9\U1F1F7'
5175+emoji_flags[TUR]=$'\U1F1F9\U1F1F7'
5176+emoji_flags[tr]=$'\U1F1F9\U1F1F7'
5177+emoji_flags[Trinidad_and_Tobago]=$'\U1F1F9\U1F1F9'
5178+emoji_flags[TT]=$'\U1F1F9\U1F1F9'
5179+emoji_flags[TTO]=$'\U1F1F9\U1F1F9'
5180+emoji_flags[trinidad_tobago]=$'\U1F1F9\U1F1F9'
5181+emoji_flags[Tuvalu]=$'\U1F1F9\U1F1FB'
5182+emoji_flags[TV]=$'\U1F1F9\U1F1FB'
5183+emoji_flags[TUV]=$'\U1F1F9\U1F1FB'
5184+emoji_flags[tuvalu]=$'\U1F1F9\U1F1FB'
5185+emoji_flags[Taiwan]=$'\U1F1F9\U1F1FC'
5186+emoji_flags[TW]=$'\U1F1F9\U1F1FC'
5187+emoji_flags[TWN]=$'\U1F1F9\U1F1FC'
5188+emoji_flags[taiwan]=$'\U1F1F9\U1F1FC'
5189+emoji_flags[Tanzania]=$'\U1F1F9\U1F1FF'
5190+emoji_flags[TZ]=$'\U1F1F9\U1F1FF'
5191+emoji_flags[TZA]=$'\U1F1F9\U1F1FF'
5192+emoji_flags[tanzania]=$'\U1F1F9\U1F1FF'
5193+emoji_flags[Ukraine]=$'\U1F1FA\U1F1E6'
5194+emoji_flags[UA]=$'\U1F1FA\U1F1E6'
5195+emoji_flags[UKR]=$'\U1F1FA\U1F1E6'
5196+emoji_flags[ukraine]=$'\U1F1FA\U1F1E6'
5197+emoji_flags[Uganda]=$'\U1F1FA\U1F1EC'
5198+emoji_flags[UG]=$'\U1F1FA\U1F1EC'
5199+emoji_flags[UGA]=$'\U1F1FA\U1F1EC'
5200+emoji_flags[uganda]=$'\U1F1FA\U1F1EC'
5201+emoji_flags[U_S_Outlying_Islands]=$'\U1F1FA\U1F1F2'
5202+emoji_flags[us_outlying_islands]=$'\U1F1FA\U1F1F2'
5203+emoji_flags[United_Nations]=$'\U1F1FA\U1F1F3'
5204+emoji_flags[united_nations]=$'\U1F1FA\U1F1F3'
5205+emoji_flags[United_States]=$'\U1F1FA\U1F1F8'
5206+emoji_flags[US]=$'\U1F1FA\U1F1F8'
5207+emoji_flags[USA]=$'\U1F1FA\U1F1F8'
5208+emoji_flags[us]=$'\U1F1FA\U1F1F8'
5209+emoji_flags[Uruguay]=$'\U1F1FA\U1F1FE'
5210+emoji_flags[UY]=$'\U1F1FA\U1F1FE'
5211+emoji_flags[URY]=$'\U1F1FA\U1F1FE'
5212+emoji_flags[uruguay]=$'\U1F1FA\U1F1FE'
5213+emoji_flags[Uzbekistan]=$'\U1F1FA\U1F1FF'
5214+emoji_flags[UZ]=$'\U1F1FA\U1F1FF'
5215+emoji_flags[UZB]=$'\U1F1FA\U1F1FF'
5216+emoji_flags[uzbekistan]=$'\U1F1FA\U1F1FF'
5217+emoji_flags[Vatican_City]=$'\U1F1FB\U1F1E6'
5218+emoji_flags[VA]=$'\U1F1FB\U1F1E6'
5219+emoji_flags[VAT]=$'\U1F1FB\U1F1E6'
5220+emoji_flags[vatican_city]=$'\U1F1FB\U1F1E6'
5221+emoji_flags[St_Vincent_and_Grenadines]=$'\U1F1FB\U1F1E8'
5222+emoji_flags[VC]=$'\U1F1FB\U1F1E8'
5223+emoji_flags[VCT]=$'\U1F1FB\U1F1E8'
5224+emoji_flags[st_vincent_grenadines]=$'\U1F1FB\U1F1E8'
5225+emoji_flags[Venezuela]=$'\U1F1FB\U1F1EA'
5226+emoji_flags[VE]=$'\U1F1FB\U1F1EA'
5227+emoji_flags[VEN]=$'\U1F1FB\U1F1EA'
5228+emoji_flags[venezuela]=$'\U1F1FB\U1F1EA'
5229+emoji_flags[British_Virgin_Islands]=$'\U1F1FB\U1F1EC'
5230+emoji_flags[VG]=$'\U1F1FB\U1F1EC'
5231+emoji_flags[VGB]=$'\U1F1FB\U1F1EC'
5232+emoji_flags[british_virgin_islands]=$'\U1F1FB\U1F1EC'
5233+emoji_flags[U_S_Virgin_Islands]=$'\U1F1FB\U1F1EE'
5234+emoji_flags[VI]=$'\U1F1FB\U1F1EE'
5235+emoji_flags[VIR]=$'\U1F1FB\U1F1EE'
5236+emoji_flags[us_virgin_islands]=$'\U1F1FB\U1F1EE'
5237+emoji_flags[Vietnam]=$'\U1F1FB\U1F1F3'
5238+emoji_flags[VN]=$'\U1F1FB\U1F1F3'
5239+emoji_flags[VNM]=$'\U1F1FB\U1F1F3'
5240+emoji_flags[vietnam]=$'\U1F1FB\U1F1F3'
5241+emoji_flags[Vanuatu]=$'\U1F1FB\U1F1FA'
5242+emoji_flags[VU]=$'\U1F1FB\U1F1FA'
5243+emoji_flags[VUT]=$'\U1F1FB\U1F1FA'
5244+emoji_flags[vanuatu]=$'\U1F1FB\U1F1FA'
5245+emoji_flags[Wallis_and_Futuna]=$'\U1F1FC\U1F1EB'
5246+emoji_flags[WF]=$'\U1F1FC\U1F1EB'
5247+emoji_flags[WLF]=$'\U1F1FC\U1F1EB'
5248+emoji_flags[wallis_futuna]=$'\U1F1FC\U1F1EB'
5249+emoji_flags[Samoa]=$'\U1F1FC\U1F1F8'
5250+emoji_flags[WS]=$'\U1F1FC\U1F1F8'
5251+emoji_flags[WSM]=$'\U1F1FC\U1F1F8'
5252+emoji_flags[samoa]=$'\U1F1FC\U1F1F8'
5253+emoji_flags[Kosovo]=$'\U1F1FD\U1F1F0'
5254+emoji_flags[XK]=$'\U1F1FD\U1F1F0'
5255+emoji_flags[XKX]=$'\U1F1FD\U1F1F0'
5256+emoji_flags[kosovo]=$'\U1F1FD\U1F1F0'
5257+emoji_flags[Yemen]=$'\U1F1FE\U1F1EA'
5258+emoji_flags[YE]=$'\U1F1FE\U1F1EA'
5259+emoji_flags[YEM]=$'\U1F1FE\U1F1EA'
5260+emoji_flags[yemen]=$'\U1F1FE\U1F1EA'
5261+emoji_flags[Mayotte]=$'\U1F1FE\U1F1F9'
5262+emoji_flags[YT]=$'\U1F1FE\U1F1F9'
5263+emoji_flags[MYT]=$'\U1F1FE\U1F1F9'
5264+emoji_flags[mayotte]=$'\U1F1FE\U1F1F9'
5265+emoji_flags[South_Africa]=$'\U1F1FF\U1F1E6'
5266+emoji_flags[ZA]=$'\U1F1FF\U1F1E6'
5267+emoji_flags[ZAF]=$'\U1F1FF\U1F1E6'
5268+emoji_flags[south_africa]=$'\U1F1FF\U1F1E6'
5269+emoji_flags[Zambia]=$'\U1F1FF\U1F1F2'
5270+emoji_flags[ZM]=$'\U1F1FF\U1F1F2'
5271+emoji_flags[ZMB]=$'\U1F1FF\U1F1F2'
5272+emoji_flags[zambia]=$'\U1F1FF\U1F1F2'
5273+emoji_flags[Zimbabwe]=$'\U1F1FF\U1F1FC'
5274+emoji_flags[ZW]=$'\U1F1FF\U1F1FC'
5275+emoji_flags[ZWE]=$'\U1F1FF\U1F1FC'
5276+emoji_flags[zimbabwe]=$'\U1F1FF\U1F1FC'
5277+emoji_flags[England]=$'\U1F3F4\UE0067\UE0062\UE0065\UE006E\UE0067\UE007F'
5278+emoji_flags[england]=$'\U1F3F4\UE0067\UE0062\UE0065\UE006E\UE0067\UE007F'
5279+emoji_flags[Scotland]=$'\U1F3F4\UE0067\UE0062\UE0073\UE0063\UE0074\UE007F'
5280+emoji_flags[scotland]=$'\U1F3F4\UE0067\UE0062\UE0073\UE0063\UE0074\UE007F'
5281+emoji_flags[Wales]=$'\U1F3F4\UE0067\UE0062\UE0077\UE006C\UE0073\UE007F'
5282+emoji_flags[wales]=$'\U1F3F4\UE0067\UE0062\UE0077\UE006C\UE0073\UE007F'
5283+
5284+emoji_groups[fruits]="
5285+ grapes
5286+ melon
5287+ watermelon
5288+ tangerine
5289+ lemon
5290+ banana
5291+ pineapple
5292+ mango
5293+ red_apple
5294+ green_apple
5295+ pear
5296+ peach
5297+ cherries
5298+ strawberry
5299+ kiwi_fruit
5300+ tomato
5301+ coconut
5302+"
5303+
5304+emoji_groups[vehicles]="
5305+ locomotive
5306+ railway_car
5307+ high_speed_train
5308+ bullet_train
5309+ bullet_train_1
5310+ metro
5311+ light_rail
5312+ station
5313+ tram
5314+ monorail
5315+ mountain_railway
5316+ tram_car
5317+ bus
5318+ oncoming_bus
5319+ trolleybus
5320+ minibus
5321+ ambulance
5322+ fire_engine
5323+ police_car
5324+ oncoming_police_car
5325+ taxi
5326+ oncoming_taxi
5327+ automobile
5328+ oncoming_automobile
5329+ sport_utility_vehicle
5330+ delivery_truck
5331+ articulated_lorry
5332+ tractor
5333+ racing_car
5334+ motorcycle
5335+ motor_scooter
5336+ manual_wheelchair
5337+ motorized_wheelchair
5338+ auto_rickshaw
5339+ bicycle
5340+ kick_scooter
5341+ skateboard
5342+ bus_stop
5343+ motorway
5344+ railway_track
5345+ oil_drum
5346+ fuel_pump
5347+ police_car_light
5348+ horizontal_traffic_light
5349+ vertical_traffic_light
5350+ stop_sign
5351+ construction
5352+ anchor
5353+ sailboat
5354+ canoe
5355+ speedboat
5356+ passenger_ship
5357+ ferry
5358+ motor_boat
5359+ ship
5360+ airplane
5361+ small_airplane
5362+ airplane_departure
5363+ airplane_arrival
5364+ parachute
5365+ seat
5366+ helicopter
5367+ suspension_railway
5368+ mountain_cableway
5369+ aerial_tramway
5370+ satellite
5371+ rocket
5372+ flying_saucer
5373+ ATM_sign
5374+ litter_in_bin_sign
5375+ potable_water
5376+ wheelchair_symbol
5377+ men_s_room
5378+ women_s_room
5379+ restroom
5380+ baby_symbol
5381+ water_closet
5382+ passport_control
5383+ customs
5384+ baggage_claim
5385+ left_luggage
5386+"
5387+
5388+emoji_groups[hands]="
5389+ waving_hand
5390+ waving_hand_light_skin_tone
5391+ waving_hand_medium_light_skin_tone
5392+ waving_hand_medium_skin_tone
5393+ waving_hand_medium_dark_skin_tone
5394+ waving_hand_dark_skin_tone
5395+ raised_back_of_hand
5396+ raised_back_of_hand_light_skin_tone
5397+ raised_back_of_hand_medium_light_skin_tone
5398+ raised_back_of_hand_medium_skin_tone
5399+ raised_back_of_hand_medium_dark_skin_tone
5400+ raised_back_of_hand_dark_skin_tone
5401+ hand_with_fingers_splayed
5402+ hand_with_fingers_splayed_light_skin_tone
5403+ hand_with_fingers_splayed_medium_light_skin_tone
5404+ hand_with_fingers_splayed_medium_skin_tone
5405+ hand_with_fingers_splayed_medium_dark_skin_tone
5406+ hand_with_fingers_splayed_dark_skin_tone
5407+ raised_hand
5408+ raised_hand_light_skin_tone
5409+ raised_hand_medium_light_skin_tone
5410+ raised_hand_medium_skin_tone
5411+ raised_hand_medium_dark_skin_tone
5412+ raised_hand_dark_skin_tone
5413+ vulcan_salute
5414+ vulcan_salute_light_skin_tone
5415+ vulcan_salute_medium_light_skin_tone
5416+ vulcan_salute_medium_skin_tone
5417+ vulcan_salute_medium_dark_skin_tone
5418+ vulcan_salute_dark_skin_tone
5419+ OK_hand
5420+ OK_hand_light_skin_tone
5421+ OK_hand_medium_light_skin_tone
5422+ OK_hand_medium_skin_tone
5423+ OK_hand_medium_dark_skin_tone
5424+ OK_hand_dark_skin_tone
5425+ pinching_hand
5426+ pinching_hand_light_skin_tone
5427+ pinching_hand_medium_light_skin_tone
5428+ pinching_hand_medium_skin_tone
5429+ pinching_hand_medium_dark_skin_tone
5430+ pinching_hand_dark_skin_tone
5431+ victory_hand
5432+ victory_hand_light_skin_tone
5433+ victory_hand_medium_light_skin_tone
5434+ victory_hand_medium_skin_tone
5435+ victory_hand_medium_dark_skin_tone
5436+ victory_hand_dark_skin_tone
5437+ crossed_fingers
5438+ crossed_fingers_light_skin_tone
5439+ crossed_fingers_medium_light_skin_tone
5440+ crossed_fingers_medium_skin_tone
5441+ crossed_fingers_medium_dark_skin_tone
5442+ crossed_fingers_dark_skin_tone
5443+ love_you_gesture
5444+ love_you_gesture_light_skin_tone
5445+ love_you_gesture_medium_light_skin_tone
5446+ love_you_gesture_medium_skin_tone
5447+ love_you_gesture_medium_dark_skin_tone
5448+ love_you_gesture_dark_skin_tone
5449+ sign_of_the_horns
5450+ sign_of_the_horns_light_skin_tone
5451+ sign_of_the_horns_medium_light_skin_tone
5452+ sign_of_the_horns_medium_skin_tone
5453+ sign_of_the_horns_medium_dark_skin_tone
5454+ sign_of_the_horns_dark_skin_tone
5455+ call_me_hand
5456+ call_me_hand_light_skin_tone
5457+ call_me_hand_medium_light_skin_tone
5458+ call_me_hand_medium_skin_tone
5459+ call_me_hand_medium_dark_skin_tone
5460+ call_me_hand_dark_skin_tone
5461+ backhand_index_pointing_left
5462+ backhand_index_pointing_left_light_skin_tone
5463+ backhand_index_pointing_left_medium_light_skin_tone
5464+ backhand_index_pointing_left_medium_skin_tone
5465+ backhand_index_pointing_left_medium_dark_skin_tone
5466+ backhand_index_pointing_left_dark_skin_tone
5467+ backhand_index_pointing_right
5468+ backhand_index_pointing_right_light_skin_tone
5469+ backhand_index_pointing_right_medium_light_skin_tone
5470+ backhand_index_pointing_right_medium_skin_tone
5471+ backhand_index_pointing_right_medium_dark_skin_tone
5472+ backhand_index_pointing_right_dark_skin_tone
5473+ backhand_index_pointing_up
5474+ backhand_index_pointing_up_light_skin_tone
5475+ backhand_index_pointing_up_medium_light_skin_tone
5476+ backhand_index_pointing_up_medium_skin_tone
5477+ backhand_index_pointing_up_medium_dark_skin_tone
5478+ backhand_index_pointing_up_dark_skin_tone
5479+ middle_finger
5480+ middle_finger_light_skin_tone
5481+ middle_finger_medium_light_skin_tone
5482+ middle_finger_medium_skin_tone
5483+ middle_finger_medium_dark_skin_tone
5484+ middle_finger_dark_skin_tone
5485+ backhand_index_pointing_down
5486+ backhand_index_pointing_down_light_skin_tone
5487+ backhand_index_pointing_down_medium_light_skin_tone
5488+ backhand_index_pointing_down_medium_skin_tone
5489+ backhand_index_pointing_down_medium_dark_skin_tone
5490+ backhand_index_pointing_down_dark_skin_tone
5491+ index_pointing_up
5492+ index_pointing_up_light_skin_tone
5493+ index_pointing_up_medium_light_skin_tone
5494+ index_pointing_up_medium_skin_tone
5495+ index_pointing_up_medium_dark_skin_tone
5496+ index_pointing_up_dark_skin_tone
5497+ thumbs_up
5498+ thumbs_up_light_skin_tone
5499+ thumbs_up_medium_light_skin_tone
5500+ thumbs_up_medium_skin_tone
5501+ thumbs_up_medium_dark_skin_tone
5502+ thumbs_up_dark_skin_tone
5503+ thumbs_down
5504+ thumbs_down_light_skin_tone
5505+ thumbs_down_medium_light_skin_tone
5506+ thumbs_down_medium_skin_tone
5507+ thumbs_down_medium_dark_skin_tone
5508+ thumbs_down_dark_skin_tone
5509+ raised_fist
5510+ raised_fist_light_skin_tone
5511+ raised_fist_medium_light_skin_tone
5512+ raised_fist_medium_skin_tone
5513+ raised_fist_medium_dark_skin_tone
5514+ raised_fist_dark_skin_tone
5515+ oncoming_fist
5516+ oncoming_fist_light_skin_tone
5517+ oncoming_fist_medium_light_skin_tone
5518+ oncoming_fist_medium_skin_tone
5519+ oncoming_fist_medium_dark_skin_tone
5520+ oncoming_fist_dark_skin_tone
5521+ left_facing_fist
5522+ left_facing_fist_light_skin_tone
5523+ left_facing_fist_medium_light_skin_tone
5524+ left_facing_fist_medium_skin_tone
5525+ left_facing_fist_medium_dark_skin_tone
5526+ left_facing_fist_dark_skin_tone
5527+ right_facing_fist
5528+ right_facing_fist_light_skin_tone
5529+ right_facing_fist_medium_light_skin_tone
5530+ right_facing_fist_medium_skin_tone
5531+ right_facing_fist_medium_dark_skin_tone
5532+ right_facing_fist_dark_skin_tone
5533+ writing_hand
5534+ writing_hand_light_skin_tone
5535+ writing_hand_medium_light_skin_tone
5536+ writing_hand_medium_skin_tone
5537+ writing_hand_medium_dark_skin_tone
5538+ writing_hand_dark_skin_tone
5539+ nail_polish
5540+ nail_polish_light_skin_tone
5541+ nail_polish_medium_light_skin_tone
5542+ nail_polish_medium_skin_tone
5543+ nail_polish_medium_dark_skin_tone
5544+ nail_polish_dark_skin_tone
5545+ selfie
5546+ selfie_light_skin_tone
5547+ selfie_medium_light_skin_tone
5548+ selfie_medium_skin_tone
5549+ selfie_medium_dark_skin_tone
5550+ selfie_dark_skin_tone
5551+"
5552+
5553+emoji_groups[people]="
5554+ person_frowning
5555+ person_frowning_light_skin_tone
5556+ person_frowning_medium_light_skin_tone
5557+ person_frowning_medium_skin_tone
5558+ person_frowning_medium_dark_skin_tone
5559+ person_frowning_dark_skin_tone
5560+ man_frowning
5561+ man_frowning_light_skin_tone
5562+ man_frowning_medium_light_skin_tone
5563+ man_frowning_medium_skin_tone
5564+ man_frowning_medium_dark_skin_tone
5565+ man_frowning_dark_skin_tone
5566+ woman_frowning
5567+ woman_frowning_light_skin_tone
5568+ woman_frowning_medium_light_skin_tone
5569+ woman_frowning_medium_skin_tone
5570+ woman_frowning_medium_dark_skin_tone
5571+ woman_frowning_dark_skin_tone
5572+ person_pouting
5573+ person_pouting_light_skin_tone
5574+ person_pouting_medium_light_skin_tone
5575+ person_pouting_medium_skin_tone
5576+ person_pouting_medium_dark_skin_tone
5577+ person_pouting_dark_skin_tone
5578+ man_pouting
5579+ man_pouting_light_skin_tone
5580+ man_pouting_medium_light_skin_tone
5581+ man_pouting_medium_skin_tone
5582+ man_pouting_medium_dark_skin_tone
5583+ man_pouting_dark_skin_tone
5584+ woman_pouting
5585+ woman_pouting_light_skin_tone
5586+ woman_pouting_medium_light_skin_tone
5587+ woman_pouting_medium_skin_tone
5588+ woman_pouting_medium_dark_skin_tone
5589+ woman_pouting_dark_skin_tone
5590+ person_gesturing_NO
5591+ person_gesturing_NO_light_skin_tone
5592+ person_gesturing_NO_medium_light_skin_tone
5593+ person_gesturing_NO_medium_skin_tone
5594+ person_gesturing_NO_medium_dark_skin_tone
5595+ person_gesturing_NO_dark_skin_tone
5596+ man_gesturing_NO
5597+ man_gesturing_NO_light_skin_tone
5598+ man_gesturing_NO_medium_light_skin_tone
5599+ man_gesturing_NO_medium_skin_tone
5600+ man_gesturing_NO_medium_dark_skin_tone
5601+ man_gesturing_NO_dark_skin_tone
5602+ woman_gesturing_NO
5603+ woman_gesturing_NO_light_skin_tone
5604+ woman_gesturing_NO_medium_light_skin_tone
5605+ woman_gesturing_NO_medium_skin_tone
5606+ woman_gesturing_NO_medium_dark_skin_tone
5607+ woman_gesturing_NO_dark_skin_tone
5608+ person_gesturing_OK
5609+ person_gesturing_OK_light_skin_tone
5610+ person_gesturing_OK_medium_light_skin_tone
5611+ person_gesturing_OK_medium_skin_tone
5612+ person_gesturing_OK_medium_dark_skin_tone
5613+ person_gesturing_OK_dark_skin_tone
5614+ man_gesturing_OK
5615+ man_gesturing_OK_light_skin_tone
5616+ man_gesturing_OK_medium_light_skin_tone
5617+ man_gesturing_OK_medium_skin_tone
5618+ man_gesturing_OK_medium_dark_skin_tone
5619+ man_gesturing_OK_dark_skin_tone
5620+ woman_gesturing_OK
5621+ woman_gesturing_OK_light_skin_tone
5622+ woman_gesturing_OK_medium_light_skin_tone
5623+ woman_gesturing_OK_medium_skin_tone
5624+ woman_gesturing_OK_medium_dark_skin_tone
5625+ woman_gesturing_OK_dark_skin_tone
5626+ person_tipping_hand
5627+ person_tipping_hand_light_skin_tone
5628+ person_tipping_hand_medium_light_skin_tone
5629+ person_tipping_hand_medium_skin_tone
5630+ person_tipping_hand_medium_dark_skin_tone
5631+ person_tipping_hand_dark_skin_tone
5632+ man_tipping_hand
5633+ man_tipping_hand_light_skin_tone
5634+ man_tipping_hand_medium_light_skin_tone
5635+ man_tipping_hand_medium_skin_tone
5636+ man_tipping_hand_medium_dark_skin_tone
5637+ man_tipping_hand_dark_skin_tone
5638+ woman_tipping_hand
5639+ woman_tipping_hand_light_skin_tone
5640+ woman_tipping_hand_medium_light_skin_tone
5641+ woman_tipping_hand_medium_skin_tone
5642+ woman_tipping_hand_medium_dark_skin_tone
5643+ woman_tipping_hand_dark_skin_tone
5644+ person_raising_hand
5645+ person_raising_hand_light_skin_tone
5646+ person_raising_hand_medium_light_skin_tone
5647+ person_raising_hand_medium_skin_tone
5648+ person_raising_hand_medium_dark_skin_tone
5649+ person_raising_hand_dark_skin_tone
5650+ man_raising_hand
5651+ man_raising_hand_light_skin_tone
5652+ man_raising_hand_medium_light_skin_tone
5653+ man_raising_hand_medium_skin_tone
5654+ man_raising_hand_medium_dark_skin_tone
5655+ man_raising_hand_dark_skin_tone
5656+ woman_raising_hand
5657+ woman_raising_hand_light_skin_tone
5658+ woman_raising_hand_medium_light_skin_tone
5659+ woman_raising_hand_medium_skin_tone
5660+ woman_raising_hand_medium_dark_skin_tone
5661+ woman_raising_hand_dark_skin_tone
5662+ deaf_person
5663+ deaf_person_light_skin_tone
5664+ deaf_person_medium_light_skin_tone
5665+ deaf_person_medium_skin_tone
5666+ deaf_person_medium_dark_skin_tone
5667+ deaf_person_dark_skin_tone
5668+ deaf_man
5669+ deaf_man_light_skin_tone
5670+ deaf_man_medium_light_skin_tone
5671+ deaf_man_medium_skin_tone
5672+ deaf_man_medium_dark_skin_tone
5673+ deaf_man_dark_skin_tone
5674+ deaf_woman
5675+ deaf_woman_light_skin_tone
5676+ deaf_woman_medium_light_skin_tone
5677+ deaf_woman_medium_skin_tone
5678+ deaf_woman_medium_dark_skin_tone
5679+ deaf_woman_dark_skin_tone
5680+ person_bowing
5681+ person_bowing_light_skin_tone
5682+ person_bowing_medium_light_skin_tone
5683+ person_bowing_medium_skin_tone
5684+ person_bowing_medium_dark_skin_tone
5685+ person_bowing_dark_skin_tone
5686+ man_bowing
5687+ man_bowing_light_skin_tone
5688+ man_bowing_medium_light_skin_tone
5689+ man_bowing_medium_skin_tone
5690+ man_bowing_medium_dark_skin_tone
5691+ man_bowing_dark_skin_tone
5692+ woman_bowing
5693+ woman_bowing_light_skin_tone
5694+ woman_bowing_medium_light_skin_tone
5695+ woman_bowing_medium_skin_tone
5696+ woman_bowing_medium_dark_skin_tone
5697+ woman_bowing_dark_skin_tone
5698+ person_facepalming
5699+ person_facepalming_light_skin_tone
5700+ person_facepalming_medium_light_skin_tone
5701+ person_facepalming_medium_skin_tone
5702+ person_facepalming_medium_dark_skin_tone
5703+ person_facepalming_dark_skin_tone
5704+ man_facepalming
5705+ man_facepalming_light_skin_tone
5706+ man_facepalming_medium_light_skin_tone
5707+ man_facepalming_medium_skin_tone
5708+ man_facepalming_medium_dark_skin_tone
5709+ man_facepalming_dark_skin_tone
5710+ woman_facepalming
5711+ woman_facepalming_light_skin_tone
5712+ woman_facepalming_medium_light_skin_tone
5713+ woman_facepalming_medium_skin_tone
5714+ woman_facepalming_medium_dark_skin_tone
5715+ woman_facepalming_dark_skin_tone
5716+ person_shrugging
5717+ person_shrugging_light_skin_tone
5718+ person_shrugging_medium_light_skin_tone
5719+ person_shrugging_medium_skin_tone
5720+ person_shrugging_medium_dark_skin_tone
5721+ person_shrugging_dark_skin_tone
5722+ man_shrugging
5723+ man_shrugging_light_skin_tone
5724+ man_shrugging_medium_light_skin_tone
5725+ man_shrugging_medium_skin_tone
5726+ man_shrugging_medium_dark_skin_tone
5727+ man_shrugging_dark_skin_tone
5728+ woman_shrugging
5729+ woman_shrugging_light_skin_tone
5730+ woman_shrugging_medium_light_skin_tone
5731+ woman_shrugging_medium_skin_tone
5732+ woman_shrugging_medium_dark_skin_tone
5733+ woman_shrugging_dark_skin_tone
5734+ man_health_worker
5735+ man_health_worker_light_skin_tone
5736+ man_health_worker_medium_light_skin_tone
5737+ man_health_worker_medium_skin_tone
5738+ man_health_worker_medium_dark_skin_tone
5739+ man_health_worker_dark_skin_tone
5740+ woman_health_worker
5741+ woman_health_worker_light_skin_tone
5742+ woman_health_worker_medium_light_skin_tone
5743+ woman_health_worker_medium_skin_tone
5744+ woman_health_worker_medium_dark_skin_tone
5745+ woman_health_worker_dark_skin_tone
5746+ man_student
5747+ man_student_light_skin_tone
5748+ man_student_medium_light_skin_tone
5749+ man_student_medium_skin_tone
5750+ man_student_medium_dark_skin_tone
5751+ man_student_dark_skin_tone
5752+ woman_student
5753+ woman_student_light_skin_tone
5754+ woman_student_medium_light_skin_tone
5755+ woman_student_medium_skin_tone
5756+ woman_student_medium_dark_skin_tone
5757+ woman_student_dark_skin_tone
5758+ man_teacher
5759+ man_teacher_light_skin_tone
5760+ man_teacher_medium_light_skin_tone
5761+ man_teacher_medium_skin_tone
5762+ man_teacher_medium_dark_skin_tone
5763+ man_teacher_dark_skin_tone
5764+ woman_teacher
5765+ woman_teacher_light_skin_tone
5766+ woman_teacher_medium_light_skin_tone
5767+ woman_teacher_medium_skin_tone
5768+ woman_teacher_medium_dark_skin_tone
5769+ woman_teacher_dark_skin_tone
5770+ man_judge
5771+ man_judge_light_skin_tone
5772+ man_judge_medium_light_skin_tone
5773+ man_judge_medium_skin_tone
5774+ man_judge_medium_dark_skin_tone
5775+ man_judge_dark_skin_tone
5776+ woman_judge
5777+ woman_judge_light_skin_tone
5778+ woman_judge_medium_light_skin_tone
5779+ woman_judge_medium_skin_tone
5780+ woman_judge_medium_dark_skin_tone
5781+ woman_judge_dark_skin_tone
5782+ man_farmer
5783+ man_farmer_light_skin_tone
5784+ man_farmer_medium_light_skin_tone
5785+ man_farmer_medium_skin_tone
5786+ man_farmer_medium_dark_skin_tone
5787+ man_farmer_dark_skin_tone
5788+ woman_farmer
5789+ woman_farmer_light_skin_tone
5790+ woman_farmer_medium_light_skin_tone
5791+ woman_farmer_medium_skin_tone
5792+ woman_farmer_medium_dark_skin_tone
5793+ woman_farmer_dark_skin_tone
5794+ man_cook
5795+ man_cook_light_skin_tone
5796+ man_cook_medium_light_skin_tone
5797+ man_cook_medium_skin_tone
5798+ man_cook_medium_dark_skin_tone
5799+ man_cook_dark_skin_tone
5800+ woman_cook
5801+ woman_cook_light_skin_tone
5802+ woman_cook_medium_light_skin_tone
5803+ woman_cook_medium_skin_tone
5804+ woman_cook_medium_dark_skin_tone
5805+ woman_cook_dark_skin_tone
5806+ man_mechanic
5807+ man_mechanic_light_skin_tone
5808+ man_mechanic_medium_light_skin_tone
5809+ man_mechanic_medium_skin_tone
5810+ man_mechanic_medium_dark_skin_tone
5811+ man_mechanic_dark_skin_tone
5812+ woman_mechanic
5813+ woman_mechanic_light_skin_tone
5814+ woman_mechanic_medium_light_skin_tone
5815+ woman_mechanic_medium_skin_tone
5816+ woman_mechanic_medium_dark_skin_tone
5817+ woman_mechanic_dark_skin_tone
5818+ man_factory_worker
5819+ man_factory_worker_light_skin_tone
5820+ man_factory_worker_medium_light_skin_tone
5821+ man_factory_worker_medium_skin_tone
5822+ man_factory_worker_medium_dark_skin_tone
5823+ man_factory_worker_dark_skin_tone
5824+ woman_factory_worker
5825+ woman_factory_worker_light_skin_tone
5826+ woman_factory_worker_medium_light_skin_tone
5827+ woman_factory_worker_medium_skin_tone
5828+ woman_factory_worker_medium_dark_skin_tone
5829+ woman_factory_worker_dark_skin_tone
5830+ man_office_worker
5831+ man_office_worker_light_skin_tone
5832+ man_office_worker_medium_light_skin_tone
5833+ man_office_worker_medium_skin_tone
5834+ man_office_worker_medium_dark_skin_tone
5835+ man_office_worker_dark_skin_tone
5836+ woman_office_worker
5837+ woman_office_worker_light_skin_tone
5838+ woman_office_worker_medium_light_skin_tone
5839+ woman_office_worker_medium_skin_tone
5840+ woman_office_worker_medium_dark_skin_tone
5841+ woman_office_worker_dark_skin_tone
5842+ man_scientist
5843+ man_scientist_light_skin_tone
5844+ man_scientist_medium_light_skin_tone
5845+ man_scientist_medium_skin_tone
5846+ man_scientist_medium_dark_skin_tone
5847+ man_scientist_dark_skin_tone
5848+ woman_scientist
5849+ woman_scientist_light_skin_tone
5850+ woman_scientist_medium_light_skin_tone
5851+ woman_scientist_medium_skin_tone
5852+ woman_scientist_medium_dark_skin_tone
5853+ woman_scientist_dark_skin_tone
5854+ man_technologist
5855+ man_technologist_light_skin_tone
5856+ man_technologist_medium_light_skin_tone
5857+ man_technologist_medium_skin_tone
5858+ man_technologist_medium_dark_skin_tone
5859+ man_technologist_dark_skin_tone
5860+ woman_technologist
5861+ woman_technologist_light_skin_tone
5862+ woman_technologist_medium_light_skin_tone
5863+ woman_technologist_medium_skin_tone
5864+ woman_technologist_medium_dark_skin_tone
5865+ woman_technologist_dark_skin_tone
5866+ man_singer
5867+ man_singer_light_skin_tone
5868+ man_singer_medium_light_skin_tone
5869+ man_singer_medium_skin_tone
5870+ man_singer_medium_dark_skin_tone
5871+ man_singer_dark_skin_tone
5872+ woman_singer
5873+ woman_singer_light_skin_tone
5874+ woman_singer_medium_light_skin_tone
5875+ woman_singer_medium_skin_tone
5876+ woman_singer_medium_dark_skin_tone
5877+ woman_singer_dark_skin_tone
5878+ man_artist
5879+ man_artist_light_skin_tone
5880+ man_artist_medium_light_skin_tone
5881+ man_artist_medium_skin_tone
5882+ man_artist_medium_dark_skin_tone
5883+ man_artist_dark_skin_tone
5884+ woman_artist
5885+ woman_artist_light_skin_tone
5886+ woman_artist_medium_light_skin_tone
5887+ woman_artist_medium_skin_tone
5888+ woman_artist_medium_dark_skin_tone
5889+ woman_artist_dark_skin_tone
5890+ man_pilot
5891+ man_pilot_light_skin_tone
5892+ man_pilot_medium_light_skin_tone
5893+ man_pilot_medium_skin_tone
5894+ man_pilot_medium_dark_skin_tone
5895+ man_pilot_dark_skin_tone
5896+ woman_pilot
5897+ woman_pilot_light_skin_tone
5898+ woman_pilot_medium_light_skin_tone
5899+ woman_pilot_medium_skin_tone
5900+ woman_pilot_medium_dark_skin_tone
5901+ woman_pilot_dark_skin_tone
5902+ man_astronaut
5903+ man_astronaut_light_skin_tone
5904+ man_astronaut_medium_light_skin_tone
5905+ man_astronaut_medium_skin_tone
5906+ man_astronaut_medium_dark_skin_tone
5907+ man_astronaut_dark_skin_tone
5908+ woman_astronaut
5909+ woman_astronaut_light_skin_tone
5910+ woman_astronaut_medium_light_skin_tone
5911+ woman_astronaut_medium_skin_tone
5912+ woman_astronaut_medium_dark_skin_tone
5913+ woman_astronaut_dark_skin_tone
5914+ man_firefighter
5915+ man_firefighter_light_skin_tone
5916+ man_firefighter_medium_light_skin_tone
5917+ man_firefighter_medium_skin_tone
5918+ man_firefighter_medium_dark_skin_tone
5919+ man_firefighter_dark_skin_tone
5920+ woman_firefighter
5921+ woman_firefighter_light_skin_tone
5922+ woman_firefighter_medium_light_skin_tone
5923+ woman_firefighter_medium_skin_tone
5924+ woman_firefighter_medium_dark_skin_tone
5925+ woman_firefighter_dark_skin_tone
5926+ police_officer
5927+ police_officer_light_skin_tone
5928+ police_officer_medium_light_skin_tone
5929+ police_officer_medium_skin_tone
5930+ police_officer_medium_dark_skin_tone
5931+ police_officer_dark_skin_tone
5932+ man_police_officer
5933+ man_police_officer_light_skin_tone
5934+ man_police_officer_medium_light_skin_tone
5935+ man_police_officer_medium_skin_tone
5936+ man_police_officer_medium_dark_skin_tone
5937+ man_police_officer_dark_skin_tone
5938+ woman_police_officer
5939+ woman_police_officer_light_skin_tone
5940+ woman_police_officer_medium_light_skin_tone
5941+ woman_police_officer_medium_skin_tone
5942+ woman_police_officer_medium_dark_skin_tone
5943+ woman_police_officer_dark_skin_tone
5944+ detective
5945+ detective_light_skin_tone
5946+ detective_medium_light_skin_tone
5947+ detective_medium_skin_tone
5948+ detective_medium_dark_skin_tone
5949+ detective_dark_skin_tone
5950+ man_detective
5951+ man_detective_light_skin_tone
5952+ man_detective_medium_light_skin_tone
5953+ man_detective_medium_skin_tone
5954+ man_detective_medium_dark_skin_tone
5955+ man_detective_dark_skin_tone
5956+ woman_detective
5957+ woman_detective_light_skin_tone
5958+ woman_detective_medium_light_skin_tone
5959+ woman_detective_medium_skin_tone
5960+ woman_detective_medium_dark_skin_tone
5961+ woman_detective_dark_skin_tone
5962+ guard
5963+ guard_light_skin_tone
5964+ guard_medium_light_skin_tone
5965+ guard_medium_skin_tone
5966+ guard_medium_dark_skin_tone
5967+ guard_dark_skin_tone
5968+ man_guard
5969+ man_guard_light_skin_tone
5970+ man_guard_medium_light_skin_tone
5971+ man_guard_medium_skin_tone
5972+ man_guard_medium_dark_skin_tone
5973+ man_guard_dark_skin_tone
5974+ woman_guard
5975+ woman_guard_light_skin_tone
5976+ woman_guard_medium_light_skin_tone
5977+ woman_guard_medium_skin_tone
5978+ woman_guard_medium_dark_skin_tone
5979+ woman_guard_dark_skin_tone
5980+ construction_worker
5981+ construction_worker_light_skin_tone
5982+ construction_worker_medium_light_skin_tone
5983+ construction_worker_medium_skin_tone
5984+ construction_worker_medium_dark_skin_tone
5985+ construction_worker_dark_skin_tone
5986+ man_construction_worker
5987+ man_construction_worker_light_skin_tone
5988+ man_construction_worker_medium_light_skin_tone
5989+ man_construction_worker_medium_skin_tone
5990+ man_construction_worker_medium_dark_skin_tone
5991+ man_construction_worker_dark_skin_tone
5992+ woman_construction_worker
5993+ woman_construction_worker_light_skin_tone
5994+ woman_construction_worker_medium_light_skin_tone
5995+ woman_construction_worker_medium_skin_tone
5996+ woman_construction_worker_medium_dark_skin_tone
5997+ woman_construction_worker_dark_skin_tone
5998+ prince
5999+ prince_light_skin_tone
6000+ prince_medium_light_skin_tone
6001+ prince_medium_skin_tone
6002+ prince_medium_dark_skin_tone
6003+ prince_dark_skin_tone
6004+ princess
6005+ princess_light_skin_tone
6006+ princess_medium_light_skin_tone
6007+ princess_medium_skin_tone
6008+ princess_medium_dark_skin_tone
6009+ princess_dark_skin_tone
6010+ person_wearing_turban
6011+ person_wearing_turban_light_skin_tone
6012+ person_wearing_turban_medium_light_skin_tone
6013+ person_wearing_turban_medium_skin_tone
6014+ person_wearing_turban_medium_dark_skin_tone
6015+ person_wearing_turban_dark_skin_tone
6016+ man_wearing_turban
6017+ man_wearing_turban_light_skin_tone
6018+ man_wearing_turban_medium_light_skin_tone
6019+ man_wearing_turban_medium_skin_tone
6020+ man_wearing_turban_medium_dark_skin_tone
6021+ man_wearing_turban_dark_skin_tone
6022+ woman_wearing_turban
6023+ woman_wearing_turban_light_skin_tone
6024+ woman_wearing_turban_medium_light_skin_tone
6025+ woman_wearing_turban_medium_skin_tone
6026+ woman_wearing_turban_medium_dark_skin_tone
6027+ woman_wearing_turban_dark_skin_tone
6028+ man_with_Chinese_cap
6029+ man_with_Chinese_cap_light_skin_tone
6030+ man_with_Chinese_cap_medium_light_skin_tone
6031+ man_with_Chinese_cap_medium_skin_tone
6032+ man_with_Chinese_cap_medium_dark_skin_tone
6033+ man_with_Chinese_cap_dark_skin_tone
6034+ woman_with_headscarf
6035+ woman_with_headscarf_light_skin_tone
6036+ woman_with_headscarf_medium_light_skin_tone
6037+ woman_with_headscarf_medium_skin_tone
6038+ woman_with_headscarf_medium_dark_skin_tone
6039+ woman_with_headscarf_dark_skin_tone
6040+ man_in_tuxedo
6041+ man_in_tuxedo_light_skin_tone
6042+ man_in_tuxedo_medium_light_skin_tone
6043+ man_in_tuxedo_medium_skin_tone
6044+ man_in_tuxedo_medium_dark_skin_tone
6045+ man_in_tuxedo_dark_skin_tone
6046+ bride_with_veil
6047+ bride_with_veil_light_skin_tone
6048+ bride_with_veil_medium_light_skin_tone
6049+ bride_with_veil_medium_skin_tone
6050+ bride_with_veil_medium_dark_skin_tone
6051+ bride_with_veil_dark_skin_tone
6052+ pregnant_woman
6053+ pregnant_woman_light_skin_tone
6054+ pregnant_woman_medium_light_skin_tone
6055+ pregnant_woman_medium_skin_tone
6056+ pregnant_woman_medium_dark_skin_tone
6057+ pregnant_woman_dark_skin_tone
6058+ breast_feeding
6059+ breast_feeding_light_skin_tone
6060+ breast_feeding_medium_light_skin_tone
6061+ breast_feeding_medium_skin_tone
6062+ breast_feeding_medium_dark_skin_tone
6063+ breast_feeding_dark_skin_tone
6064+ baby_angel
6065+ baby_angel_light_skin_tone
6066+ baby_angel_medium_light_skin_tone
6067+ baby_angel_medium_skin_tone
6068+ baby_angel_medium_dark_skin_tone
6069+ baby_angel_dark_skin_tone
6070+ Santa_Claus
6071+ Santa_Claus_light_skin_tone
6072+ Santa_Claus_medium_light_skin_tone
6073+ Santa_Claus_medium_skin_tone
6074+ Santa_Claus_medium_dark_skin_tone
6075+ Santa_Claus_dark_skin_tone
6076+ Mrs_Claus
6077+ Mrs_Claus_light_skin_tone
6078+ Mrs_Claus_medium_light_skin_tone
6079+ Mrs_Claus_medium_skin_tone
6080+ Mrs_Claus_medium_dark_skin_tone
6081+ Mrs_Claus_dark_skin_tone
6082+ superhero
6083+ superhero_light_skin_tone
6084+ superhero_medium_light_skin_tone
6085+ superhero_medium_skin_tone
6086+ superhero_medium_dark_skin_tone
6087+ superhero_dark_skin_tone
6088+ man_superhero
6089+ man_superhero_light_skin_tone
6090+ man_superhero_medium_light_skin_tone
6091+ man_superhero_medium_skin_tone
6092+ man_superhero_medium_dark_skin_tone
6093+ man_superhero_dark_skin_tone
6094+ woman_superhero
6095+ woman_superhero_light_skin_tone
6096+ woman_superhero_medium_light_skin_tone
6097+ woman_superhero_medium_skin_tone
6098+ woman_superhero_medium_dark_skin_tone
6099+ woman_superhero_dark_skin_tone
6100+ supervillain
6101+ supervillain_light_skin_tone
6102+ supervillain_medium_light_skin_tone
6103+ supervillain_medium_skin_tone
6104+ supervillain_medium_dark_skin_tone
6105+ supervillain_dark_skin_tone
6106+ man_supervillain
6107+ man_supervillain_light_skin_tone
6108+ man_supervillain_medium_light_skin_tone
6109+ man_supervillain_medium_skin_tone
6110+ man_supervillain_medium_dark_skin_tone
6111+ man_supervillain_dark_skin_tone
6112+ woman_supervillain
6113+ woman_supervillain_light_skin_tone
6114+ woman_supervillain_medium_light_skin_tone
6115+ woman_supervillain_medium_skin_tone
6116+ woman_supervillain_medium_dark_skin_tone
6117+ woman_supervillain_dark_skin_tone
6118+ mage
6119+ mage_light_skin_tone
6120+ mage_medium_light_skin_tone
6121+ mage_medium_skin_tone
6122+ mage_medium_dark_skin_tone
6123+ mage_dark_skin_tone
6124+ man_mage
6125+ man_mage_light_skin_tone
6126+ man_mage_medium_light_skin_tone
6127+ man_mage_medium_skin_tone
6128+ man_mage_medium_dark_skin_tone
6129+ man_mage_dark_skin_tone
6130+ woman_mage
6131+ woman_mage_light_skin_tone
6132+ woman_mage_medium_light_skin_tone
6133+ woman_mage_medium_skin_tone
6134+ woman_mage_medium_dark_skin_tone
6135+ woman_mage_dark_skin_tone
6136+ fairy
6137+ fairy_light_skin_tone
6138+ fairy_medium_light_skin_tone
6139+ fairy_medium_skin_tone
6140+ fairy_medium_dark_skin_tone
6141+ fairy_dark_skin_tone
6142+ man_fairy
6143+ man_fairy_light_skin_tone
6144+ man_fairy_medium_light_skin_tone
6145+ man_fairy_medium_skin_tone
6146+ man_fairy_medium_dark_skin_tone
6147+ man_fairy_dark_skin_tone
6148+ woman_fairy
6149+ woman_fairy_light_skin_tone
6150+ woman_fairy_medium_light_skin_tone
6151+ woman_fairy_medium_skin_tone
6152+ woman_fairy_medium_dark_skin_tone
6153+ woman_fairy_dark_skin_tone
6154+ vampire
6155+ vampire_light_skin_tone
6156+ vampire_medium_light_skin_tone
6157+ vampire_medium_skin_tone
6158+ vampire_medium_dark_skin_tone
6159+ vampire_dark_skin_tone
6160+ man_vampire
6161+ man_vampire_light_skin_tone
6162+ man_vampire_medium_light_skin_tone
6163+ man_vampire_medium_skin_tone
6164+ man_vampire_medium_dark_skin_tone
6165+ man_vampire_dark_skin_tone
6166+ woman_vampire
6167+ woman_vampire_light_skin_tone
6168+ woman_vampire_medium_light_skin_tone
6169+ woman_vampire_medium_skin_tone
6170+ woman_vampire_medium_dark_skin_tone
6171+ woman_vampire_dark_skin_tone
6172+ merperson
6173+ merperson_light_skin_tone
6174+ merperson_medium_light_skin_tone
6175+ merperson_medium_skin_tone
6176+ merperson_medium_dark_skin_tone
6177+ merperson_dark_skin_tone
6178+ merman
6179+ merman_light_skin_tone
6180+ merman_medium_light_skin_tone
6181+ merman_medium_skin_tone
6182+ merman_medium_dark_skin_tone
6183+ merman_dark_skin_tone
6184+ mermaid
6185+ mermaid_light_skin_tone
6186+ mermaid_medium_light_skin_tone
6187+ mermaid_medium_skin_tone
6188+ mermaid_medium_dark_skin_tone
6189+ mermaid_dark_skin_tone
6190+ elf
6191+ elf_light_skin_tone
6192+ elf_medium_light_skin_tone
6193+ elf_medium_skin_tone
6194+ elf_medium_dark_skin_tone
6195+ elf_dark_skin_tone
6196+ man_elf
6197+ man_elf_light_skin_tone
6198+ man_elf_medium_light_skin_tone
6199+ man_elf_medium_skin_tone
6200+ man_elf_medium_dark_skin_tone
6201+ man_elf_dark_skin_tone
6202+ woman_elf
6203+ woman_elf_light_skin_tone
6204+ woman_elf_medium_light_skin_tone
6205+ woman_elf_medium_skin_tone
6206+ woman_elf_medium_dark_skin_tone
6207+ woman_elf_dark_skin_tone
6208+ genie
6209+ man_genie
6210+ woman_genie
6211+ zombie
6212+ man_zombie
6213+ woman_zombie
6214+ person_getting_massage
6215+ person_getting_massage_light_skin_tone
6216+ person_getting_massage_medium_light_skin_tone
6217+ person_getting_massage_medium_skin_tone
6218+ person_getting_massage_medium_dark_skin_tone
6219+ person_getting_massage_dark_skin_tone
6220+ man_getting_massage
6221+ man_getting_massage_light_skin_tone
6222+ man_getting_massage_medium_light_skin_tone
6223+ man_getting_massage_medium_skin_tone
6224+ man_getting_massage_medium_dark_skin_tone
6225+ man_getting_massage_dark_skin_tone
6226+ woman_getting_massage
6227+ woman_getting_massage_light_skin_tone
6228+ woman_getting_massage_medium_light_skin_tone
6229+ woman_getting_massage_medium_skin_tone
6230+ woman_getting_massage_medium_dark_skin_tone
6231+ woman_getting_massage_dark_skin_tone
6232+ person_getting_haircut
6233+ person_getting_haircut_light_skin_tone
6234+ person_getting_haircut_medium_light_skin_tone
6235+ person_getting_haircut_medium_skin_tone
6236+ person_getting_haircut_medium_dark_skin_tone
6237+ person_getting_haircut_dark_skin_tone
6238+ man_getting_haircut
6239+ man_getting_haircut_light_skin_tone
6240+ man_getting_haircut_medium_light_skin_tone
6241+ man_getting_haircut_medium_skin_tone
6242+ man_getting_haircut_medium_dark_skin_tone
6243+ man_getting_haircut_dark_skin_tone
6244+ woman_getting_haircut
6245+ woman_getting_haircut_light_skin_tone
6246+ woman_getting_haircut_medium_light_skin_tone
6247+ woman_getting_haircut_medium_skin_tone
6248+ woman_getting_haircut_medium_dark_skin_tone
6249+ woman_getting_haircut_dark_skin_tone
6250+ person_walking
6251+ person_walking_light_skin_tone
6252+ person_walking_medium_light_skin_tone
6253+ person_walking_medium_skin_tone
6254+ person_walking_medium_dark_skin_tone
6255+ person_walking_dark_skin_tone
6256+ man_walking
6257+ man_walking_light_skin_tone
6258+ man_walking_medium_light_skin_tone
6259+ man_walking_medium_skin_tone
6260+ man_walking_medium_dark_skin_tone
6261+ man_walking_dark_skin_tone
6262+ woman_walking
6263+ woman_walking_light_skin_tone
6264+ woman_walking_medium_light_skin_tone
6265+ woman_walking_medium_skin_tone
6266+ woman_walking_medium_dark_skin_tone
6267+ woman_walking_dark_skin_tone
6268+ person_standing
6269+ person_standing_light_skin_tone
6270+ person_standing_medium_light_skin_tone
6271+ person_standing_medium_skin_tone
6272+ person_standing_medium_dark_skin_tone
6273+ person_standing_dark_skin_tone
6274+ man_standing
6275+ man_standing_light_skin_tone
6276+ man_standing_medium_light_skin_tone
6277+ man_standing_medium_skin_tone
6278+ man_standing_medium_dark_skin_tone
6279+ man_standing_dark_skin_tone
6280+ woman_standing
6281+ woman_standing_light_skin_tone
6282+ woman_standing_medium_light_skin_tone
6283+ woman_standing_medium_skin_tone
6284+ woman_standing_medium_dark_skin_tone
6285+ woman_standing_dark_skin_tone
6286+ person_kneeling
6287+ person_kneeling_light_skin_tone
6288+ person_kneeling_medium_light_skin_tone
6289+ person_kneeling_medium_skin_tone
6290+ person_kneeling_medium_dark_skin_tone
6291+ person_kneeling_dark_skin_tone
6292+ man_kneeling
6293+ man_kneeling_light_skin_tone
6294+ man_kneeling_medium_light_skin_tone
6295+ man_kneeling_medium_skin_tone
6296+ man_kneeling_medium_dark_skin_tone
6297+ man_kneeling_dark_skin_tone
6298+ woman_kneeling
6299+ woman_kneeling_light_skin_tone
6300+ woman_kneeling_medium_light_skin_tone
6301+ woman_kneeling_medium_skin_tone
6302+ woman_kneeling_medium_dark_skin_tone
6303+ woman_kneeling_dark_skin_tone
6304+ man_with_probing_cane
6305+ man_with_probing_cane_light_skin_tone
6306+ man_with_probing_cane_medium_light_skin_tone
6307+ man_with_probing_cane_medium_skin_tone
6308+ man_with_probing_cane_medium_dark_skin_tone
6309+ man_with_probing_cane_dark_skin_tone
6310+ woman_with_probing_cane
6311+ woman_with_probing_cane_light_skin_tone
6312+ woman_with_probing_cane_medium_light_skin_tone
6313+ woman_with_probing_cane_medium_skin_tone
6314+ woman_with_probing_cane_medium_dark_skin_tone
6315+ woman_with_probing_cane_dark_skin_tone
6316+ man_in_motorized_wheelchair
6317+ man_in_motorized_wheelchair_light_skin_tone
6318+ man_in_motorized_wheelchair_medium_light_skin_tone
6319+ man_in_motorized_wheelchair_medium_skin_tone
6320+ man_in_motorized_wheelchair_medium_dark_skin_tone
6321+ man_in_motorized_wheelchair_dark_skin_tone
6322+ woman_in_motorized_wheelchair
6323+ woman_in_motorized_wheelchair_light_skin_tone
6324+ woman_in_motorized_wheelchair_medium_light_skin_tone
6325+ woman_in_motorized_wheelchair_medium_skin_tone
6326+ woman_in_motorized_wheelchair_medium_dark_skin_tone
6327+ woman_in_motorized_wheelchair_dark_skin_tone
6328+ man_in_manual_wheelchair
6329+ man_in_manual_wheelchair_light_skin_tone
6330+ man_in_manual_wheelchair_medium_light_skin_tone
6331+ man_in_manual_wheelchair_medium_skin_tone
6332+ man_in_manual_wheelchair_medium_dark_skin_tone
6333+ man_in_manual_wheelchair_dark_skin_tone
6334+ woman_in_manual_wheelchair
6335+ woman_in_manual_wheelchair_light_skin_tone
6336+ woman_in_manual_wheelchair_medium_light_skin_tone
6337+ woman_in_manual_wheelchair_medium_skin_tone
6338+ woman_in_manual_wheelchair_medium_dark_skin_tone
6339+ woman_in_manual_wheelchair_dark_skin_tone
6340+ person_running
6341+ person_running_light_skin_tone
6342+ person_running_medium_light_skin_tone
6343+ person_running_medium_skin_tone
6344+ person_running_medium_dark_skin_tone
6345+ person_running_dark_skin_tone
6346+ man_running
6347+ man_running_light_skin_tone
6348+ man_running_medium_light_skin_tone
6349+ man_running_medium_skin_tone
6350+ man_running_medium_dark_skin_tone
6351+ man_running_dark_skin_tone
6352+ woman_running
6353+ woman_running_light_skin_tone
6354+ woman_running_medium_light_skin_tone
6355+ woman_running_medium_skin_tone
6356+ woman_running_medium_dark_skin_tone
6357+ woman_running_dark_skin_tone
6358+ woman_dancing
6359+ woman_dancing_light_skin_tone
6360+ woman_dancing_medium_light_skin_tone
6361+ woman_dancing_medium_skin_tone
6362+ woman_dancing_medium_dark_skin_tone
6363+ woman_dancing_dark_skin_tone
6364+ woman_dancing_dark_skin_tone_1
6365+ man_dancing_light_skin_tone
6366+ man_dancing_medium_light_skin_tone
6367+ man_dancing_medium_skin_tone
6368+ man_dancing_medium_dark_skin_tone
6369+ man_dancing_dark_skin_tone
6370+ man_in_suit_levitating
6371+ man_in_suit_levitating_light_skin_tone
6372+ man_in_suit_levitating_medium_light_skin_tone
6373+ man_in_suit_levitating_medium_skin_tone
6374+ man_in_suit_levitating_medium_dark_skin_tone
6375+ man_in_suit_levitating_dark_skin_tone
6376+ people_with_bunny_ears
6377+ men_with_bunny_ears
6378+ women_with_bunny_ears
6379+ person_in_steamy_room
6380+ person_in_steamy_room_light_skin_tone
6381+ person_in_steamy_room_medium_light_skin_tone
6382+ person_in_steamy_room_medium_skin_tone
6383+ person_in_steamy_room_medium_dark_skin_tone
6384+ person_in_steamy_room_dark_skin_tone
6385+ man_in_steamy_room
6386+ man_in_steamy_room_light_skin_tone
6387+ man_in_steamy_room_medium_light_skin_tone
6388+ man_in_steamy_room_medium_skin_tone
6389+ man_in_steamy_room_medium_dark_skin_tone
6390+ man_in_steamy_room_dark_skin_tone
6391+ woman_in_steamy_room
6392+ woman_in_steamy_room_light_skin_tone
6393+ woman_in_steamy_room_medium_light_skin_tone
6394+ woman_in_steamy_room_medium_skin_tone
6395+ woman_in_steamy_room_medium_dark_skin_tone
6396+ woman_in_steamy_room_dark_skin_tone
6397+ person_climbing
6398+ person_climbing_light_skin_tone
6399+ person_climbing_medium_light_skin_tone
6400+ person_climbing_medium_skin_tone
6401+ person_climbing_medium_dark_skin_tone
6402+ person_climbing_dark_skin_tone
6403+ man_climbing
6404+ man_climbing_light_skin_tone
6405+ man_climbing_medium_light_skin_tone
6406+ man_climbing_medium_skin_tone
6407+ man_climbing_medium_dark_skin_tone
6408+ man_climbing_dark_skin_tone
6409+ woman_climbing
6410+ woman_climbing_light_skin_tone
6411+ woman_climbing_medium_light_skin_tone
6412+ woman_climbing_medium_skin_tone
6413+ woman_climbing_medium_dark_skin_tone
6414+ woman_climbing_dark_skin_tone
6415+ person_fencing
6416+ horse_racing
6417+ horse_racing_light_skin_tone
6418+ horse_racing_medium_light_skin_tone
6419+ horse_racing_medium_skin_tone
6420+ horse_racing_medium_dark_skin_tone
6421+ horse_racing_dark_skin_tone
6422+ skier
6423+ snowboarder
6424+ snowboarder_light_skin_tone
6425+ snowboarder_medium_light_skin_tone
6426+ snowboarder_medium_skin_tone
6427+ snowboarder_medium_dark_skin_tone
6428+ snowboarder_dark_skin_tone
6429+ person_golfing
6430+ person_golfing_light_skin_tone
6431+ person_golfing_medium_light_skin_tone
6432+ person_golfing_medium_skin_tone
6433+ person_golfing_medium_dark_skin_tone
6434+ person_golfing_dark_skin_tone
6435+ man_golfing
6436+ man_golfing_light_skin_tone
6437+ man_golfing_medium_light_skin_tone
6438+ man_golfing_medium_skin_tone
6439+ man_golfing_medium_dark_skin_tone
6440+ man_golfing_dark_skin_tone
6441+ woman_golfing
6442+ woman_golfing_light_skin_tone
6443+ woman_golfing_medium_light_skin_tone
6444+ woman_golfing_medium_skin_tone
6445+ woman_golfing_medium_dark_skin_tone
6446+ woman_golfing_dark_skin_tone
6447+ person_surfing
6448+ person_surfing_light_skin_tone
6449+ person_surfing_medium_light_skin_tone
6450+ person_surfing_medium_skin_tone
6451+ person_surfing_medium_dark_skin_tone
6452+ person_surfing_dark_skin_tone
6453+ man_surfing
6454+ man_surfing_light_skin_tone
6455+ man_surfing_medium_light_skin_tone
6456+ man_surfing_medium_skin_tone
6457+ man_surfing_medium_dark_skin_tone
6458+ man_surfing_dark_skin_tone
6459+ woman_surfing
6460+ woman_surfing_light_skin_tone
6461+ woman_surfing_medium_light_skin_tone
6462+ woman_surfing_medium_skin_tone
6463+ woman_surfing_medium_dark_skin_tone
6464+ woman_surfing_dark_skin_tone
6465+ person_rowing_boat
6466+ person_rowing_boat_light_skin_tone
6467+ person_rowing_boat_medium_light_skin_tone
6468+ person_rowing_boat_medium_skin_tone
6469+ person_rowing_boat_medium_dark_skin_tone
6470+ person_rowing_boat_dark_skin_tone
6471+ man_rowing_boat
6472+ man_rowing_boat_light_skin_tone
6473+ man_rowing_boat_medium_light_skin_tone
6474+ man_rowing_boat_medium_skin_tone
6475+ man_rowing_boat_medium_dark_skin_tone
6476+ man_rowing_boat_dark_skin_tone
6477+ woman_rowing_boat
6478+ woman_rowing_boat_light_skin_tone
6479+ woman_rowing_boat_medium_light_skin_tone
6480+ woman_rowing_boat_medium_skin_tone
6481+ woman_rowing_boat_medium_dark_skin_tone
6482+ woman_rowing_boat_dark_skin_tone
6483+ person_swimming
6484+ person_swimming_light_skin_tone
6485+ person_swimming_medium_light_skin_tone
6486+ person_swimming_medium_skin_tone
6487+ person_swimming_medium_dark_skin_tone
6488+ person_swimming_dark_skin_tone
6489+ man_swimming
6490+ man_swimming_light_skin_tone
6491+ man_swimming_medium_light_skin_tone
6492+ man_swimming_medium_skin_tone
6493+ man_swimming_medium_dark_skin_tone
6494+ man_swimming_dark_skin_tone
6495+ woman_swimming
6496+ woman_swimming_light_skin_tone
6497+ woman_swimming_medium_light_skin_tone
6498+ woman_swimming_medium_skin_tone
6499+ woman_swimming_medium_dark_skin_tone
6500+ woman_swimming_dark_skin_tone
6501+ person_bouncing_ball
6502+ person_bouncing_ball_light_skin_tone
6503+ person_bouncing_ball_medium_light_skin_tone
6504+ person_bouncing_ball_medium_skin_tone
6505+ person_bouncing_ball_medium_dark_skin_tone
6506+ person_bouncing_ball_dark_skin_tone
6507+ man_bouncing_ball
6508+ man_bouncing_ball_light_skin_tone
6509+ man_bouncing_ball_medium_light_skin_tone
6510+ man_bouncing_ball_medium_skin_tone
6511+ man_bouncing_ball_medium_dark_skin_tone
6512+ man_bouncing_ball_dark_skin_tone
6513+ woman_bouncing_ball
6514+ woman_bouncing_ball_light_skin_tone
6515+ woman_bouncing_ball_medium_light_skin_tone
6516+ woman_bouncing_ball_medium_skin_tone
6517+ woman_bouncing_ball_medium_dark_skin_tone
6518+ woman_bouncing_ball_dark_skin_tone
6519+ person_lifting_weights
6520+ person_lifting_weights_light_skin_tone
6521+ person_lifting_weights_medium_light_skin_tone
6522+ person_lifting_weights_medium_skin_tone
6523+ person_lifting_weights_medium_dark_skin_tone
6524+ person_lifting_weights_dark_skin_tone
6525+ man_lifting_weights
6526+ man_lifting_weights_light_skin_tone
6527+ man_lifting_weights_medium_light_skin_tone
6528+ man_lifting_weights_medium_skin_tone
6529+ man_lifting_weights_medium_dark_skin_tone
6530+ man_lifting_weights_dark_skin_tone
6531+ woman_lifting_weights
6532+ woman_lifting_weights_light_skin_tone
6533+ woman_lifting_weights_medium_light_skin_tone
6534+ woman_lifting_weights_medium_skin_tone
6535+ woman_lifting_weights_medium_dark_skin_tone
6536+ woman_lifting_weights_dark_skin_tone
6537+ person_biking
6538+ person_biking_light_skin_tone
6539+ person_biking_medium_light_skin_tone
6540+ person_biking_medium_skin_tone
6541+ person_biking_medium_dark_skin_tone
6542+ person_biking_dark_skin_tone
6543+ man_biking
6544+ man_biking_light_skin_tone
6545+ man_biking_medium_light_skin_tone
6546+ man_biking_medium_skin_tone
6547+ man_biking_medium_dark_skin_tone
6548+ man_biking_dark_skin_tone
6549+ woman_biking
6550+ woman_biking_light_skin_tone
6551+ woman_biking_medium_light_skin_tone
6552+ woman_biking_medium_skin_tone
6553+ woman_biking_medium_dark_skin_tone
6554+ woman_biking_dark_skin_tone
6555+ person_mountain_biking
6556+ person_mountain_biking_light_skin_tone
6557+ person_mountain_biking_medium_light_skin_tone
6558+ person_mountain_biking_medium_skin_tone
6559+ person_mountain_biking_medium_dark_skin_tone
6560+ person_mountain_biking_dark_skin_tone
6561+ man_mountain_biking
6562+ man_mountain_biking_light_skin_tone
6563+ man_mountain_biking_medium_light_skin_tone
6564+ man_mountain_biking_medium_skin_tone
6565+ man_mountain_biking_medium_dark_skin_tone
6566+ man_mountain_biking_dark_skin_tone
6567+ woman_mountain_biking
6568+ woman_mountain_biking_light_skin_tone
6569+ woman_mountain_biking_medium_light_skin_tone
6570+ woman_mountain_biking_medium_skin_tone
6571+ woman_mountain_biking_medium_dark_skin_tone
6572+ woman_mountain_biking_dark_skin_tone
6573+ person_cartwheeling
6574+ person_cartwheeling_light_skin_tone
6575+ person_cartwheeling_medium_light_skin_tone
6576+ person_cartwheeling_medium_skin_tone
6577+ person_cartwheeling_medium_dark_skin_tone
6578+ person_cartwheeling_dark_skin_tone
6579+ man_cartwheeling
6580+ man_cartwheeling_light_skin_tone
6581+ man_cartwheeling_medium_light_skin_tone
6582+ man_cartwheeling_medium_skin_tone
6583+ man_cartwheeling_medium_dark_skin_tone
6584+ man_cartwheeling_dark_skin_tone
6585+ woman_cartwheeling
6586+ woman_cartwheeling_light_skin_tone
6587+ woman_cartwheeling_medium_light_skin_tone
6588+ woman_cartwheeling_medium_skin_tone
6589+ woman_cartwheeling_medium_dark_skin_tone
6590+ woman_cartwheeling_dark_skin_tone
6591+ people_wrestling
6592+ men_wrestling
6593+ women_wrestling
6594+ person_playing_water_polo
6595+ person_playing_water_polo_light_skin_tone
6596+ person_playing_water_polo_medium_light_skin_tone
6597+ person_playing_water_polo_medium_skin_tone
6598+ person_playing_water_polo_medium_dark_skin_tone
6599+ person_playing_water_polo_dark_skin_tone
6600+ man_playing_water_polo
6601+ man_playing_water_polo_light_skin_tone
6602+ man_playing_water_polo_medium_light_skin_tone
6603+ man_playing_water_polo_medium_skin_tone
6604+ man_playing_water_polo_medium_dark_skin_tone
6605+ man_playing_water_polo_dark_skin_tone
6606+ woman_playing_water_polo
6607+ woman_playing_water_polo_light_skin_tone
6608+ woman_playing_water_polo_medium_light_skin_tone
6609+ woman_playing_water_polo_medium_skin_tone
6610+ woman_playing_water_polo_medium_dark_skin_tone
6611+ woman_playing_water_polo_dark_skin_tone
6612+ person_playing_handball
6613+ person_playing_handball_light_skin_tone
6614+ person_playing_handball_medium_light_skin_tone
6615+ person_playing_handball_medium_skin_tone
6616+ person_playing_handball_medium_dark_skin_tone
6617+ person_playing_handball_dark_skin_tone
6618+ man_playing_handball
6619+ man_playing_handball_light_skin_tone
6620+ man_playing_handball_medium_light_skin_tone
6621+ man_playing_handball_medium_skin_tone
6622+ man_playing_handball_medium_dark_skin_tone
6623+ man_playing_handball_dark_skin_tone
6624+ woman_playing_handball
6625+ woman_playing_handball_light_skin_tone
6626+ woman_playing_handball_medium_light_skin_tone
6627+ woman_playing_handball_medium_skin_tone
6628+ woman_playing_handball_medium_dark_skin_tone
6629+ woman_playing_handball_dark_skin_tone
6630+ person_juggling
6631+ person_juggling_light_skin_tone
6632+ person_juggling_medium_light_skin_tone
6633+ person_juggling_medium_skin_tone
6634+ person_juggling_medium_dark_skin_tone
6635+ person_juggling_dark_skin_tone
6636+ man_juggling
6637+ man_juggling_light_skin_tone
6638+ man_juggling_medium_light_skin_tone
6639+ man_juggling_medium_skin_tone
6640+ man_juggling_medium_dark_skin_tone
6641+ man_juggling_dark_skin_tone
6642+ woman_juggling
6643+ woman_juggling_light_skin_tone
6644+ woman_juggling_medium_light_skin_tone
6645+ woman_juggling_medium_skin_tone
6646+ woman_juggling_medium_dark_skin_tone
6647+ woman_juggling_dark_skin_tone
6648+ person_in_lotus_position
6649+ person_in_lotus_position_light_skin_tone
6650+ person_in_lotus_position_medium_light_skin_tone
6651+ person_in_lotus_position_medium_skin_tone
6652+ person_in_lotus_position_medium_dark_skin_tone
6653+ person_in_lotus_position_dark_skin_tone
6654+ man_in_lotus_position
6655+ man_in_lotus_position_light_skin_tone
6656+ man_in_lotus_position_medium_light_skin_tone
6657+ man_in_lotus_position_medium_skin_tone
6658+ man_in_lotus_position_medium_dark_skin_tone
6659+ man_in_lotus_position_dark_skin_tone
6660+ woman_in_lotus_position
6661+ woman_in_lotus_position_light_skin_tone
6662+ woman_in_lotus_position_medium_light_skin_tone
6663+ woman_in_lotus_position_medium_skin_tone
6664+ woman_in_lotus_position_medium_dark_skin_tone
6665+ woman_in_lotus_position_dark_skin_tone
6666+ person_taking_bath
6667+ person_taking_bath_light_skin_tone
6668+ person_taking_bath_medium_light_skin_tone
6669+ person_taking_bath_medium_skin_tone
6670+ person_taking_bath_medium_dark_skin_tone
6671+ person_taking_bath_dark_skin_tone
6672+ person_in_bed
6673+ person_in_bed_light_skin_tone
6674+ person_in_bed_medium_light_skin_tone
6675+ person_in_bed_medium_skin_tone
6676+ person_in_bed_medium_dark_skin_tone
6677+ person_in_bed_dark_skin_tone
6678+ people_holding_hands
6679+ people_holding_hands_light_skin_tone
6680+ people_holding_hands_medium_light_skin_tone_light_skin_tone
6681+ people_holding_hands_medium_light_skin_tone_light_skin_tone_1
6682+ people_holding_hands_medium_skin_tone_light_skin_tone
6683+ people_holding_hands_medium_skin_tone_medium_light_skin_tone
6684+ people_holding_hands_medium_skin_tone_medium_light_skin_tone_1
6685+ people_holding_hands_medium_dark_skin_tone_light_skin_tone
6686+ people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone
6687+ people_holding_hands_medium_dark_skin_tone_medium_skin_tone
6688+ people_holding_hands_medium_dark_skin_tone_medium_skin_tone_1
6689+ people_holding_hands_dark_skin_tone_light_skin_tone
6690+ people_holding_hands_dark_skin_tone_medium_light_skin_tone
6691+ people_holding_hands_dark_skin_tone_medium_skin_tone
6692+ people_holding_hands_dark_skin_tone_medium_dark_skin_tone
6693+ people_holding_hands_dark_skin_tone_medium_dark_skin_tone_1
6694+ women_holding_hands
6695+ women_holding_hands_light_skin_tone
6696+ women_holding_hands_medium_light_skin_tone_light_skin_tone
6697+ women_holding_hands_medium_light_skin_tone_light_skin_tone_1
6698+ women_holding_hands_medium_skin_tone_light_skin_tone
6699+ women_holding_hands_medium_skin_tone_medium_light_skin_tone
6700+ women_holding_hands_medium_skin_tone_medium_light_skin_tone_1
6701+ women_holding_hands_medium_dark_skin_tone_light_skin_tone
6702+ women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone
6703+ women_holding_hands_medium_dark_skin_tone_medium_skin_tone
6704+ women_holding_hands_medium_dark_skin_tone_medium_skin_tone_1
6705+ women_holding_hands_dark_skin_tone_light_skin_tone
6706+ women_holding_hands_dark_skin_tone_medium_light_skin_tone
6707+ women_holding_hands_dark_skin_tone_medium_skin_tone
6708+ women_holding_hands_dark_skin_tone_medium_dark_skin_tone
6709+ women_holding_hands_dark_skin_tone_medium_dark_skin_tone_1
6710+ woman_and_man_holding_hands
6711+ woman_and_man_holding_hands_light_skin_tone
6712+ woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone
6713+ woman_and_man_holding_hands_light_skin_tone_medium_skin_tone
6714+ woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone
6715+ woman_and_man_holding_hands_light_skin_tone_dark_skin_tone
6716+ woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone
6717+ woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone_1
6718+ woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone
6719+ woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone
6720+ woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone
6721+ woman_and_man_holding_hands_medium_skin_tone_light_skin_tone
6722+ woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone
6723+ woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone_1
6724+ woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone
6725+ woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone
6726+ woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone
6727+ woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone
6728+ woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone
6729+ woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone_1
6730+ woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone
6731+ woman_and_man_holding_hands_dark_skin_tone_light_skin_tone
6732+ woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone
6733+ woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone
6734+ woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone
6735+ woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone_1
6736+ men_holding_hands
6737+ men_holding_hands_light_skin_tone
6738+ men_holding_hands_medium_light_skin_tone_light_skin_tone
6739+ men_holding_hands_medium_light_skin_tone_light_skin_tone_1
6740+ men_holding_hands_medium_skin_tone_light_skin_tone
6741+ men_holding_hands_medium_skin_tone_medium_light_skin_tone
6742+ men_holding_hands_medium_skin_tone_medium_light_skin_tone_1
6743+ men_holding_hands_medium_dark_skin_tone_light_skin_tone
6744+ men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone
6745+ men_holding_hands_medium_dark_skin_tone_medium_skin_tone
6746+ men_holding_hands_medium_dark_skin_tone_medium_skin_tone_1
6747+ men_holding_hands_dark_skin_tone_light_skin_tone
6748+ men_holding_hands_dark_skin_tone_medium_light_skin_tone
6749+ men_holding_hands_dark_skin_tone_medium_skin_tone
6750+ men_holding_hands_dark_skin_tone_medium_dark_skin_tone
6751+ men_holding_hands_dark_skin_tone_medium_dark_skin_tone_1
6752+ kiss
6753+ kiss_woman_man
6754+ kiss_man_man
6755+ kiss_woman_woman
6756+ couple_with_heart
6757+ couple_with_heart_woman_man
6758+ couple_with_heart_man_man
6759+ couple_with_heart_woman_woman
6760+ family
6761+ family_man_woman_boy
6762+ family_man_woman_girl
6763+ family_man_woman_girl_boy
6764+ family_man_woman_boy_boy
6765+ family_man_woman_girl_girl
6766+ family_man_man_boy
6767+ family_man_man_girl
6768+ family_man_man_girl_boy
6769+ family_man_man_boy_boy
6770+ family_man_man_girl_girl
6771+ family_woman_woman_boy
6772+ family_woman_woman_girl
6773+ family_woman_woman_girl_boy
6774+ family_woman_woman_boy_boy
6775+ family_woman_woman_girl_girl
6776+ family_man_boy
6777+ family_man_boy_boy
6778+ family_man_girl
6779+ family_man_girl_boy
6780+ family_man_girl_girl
6781+ family_woman_boy
6782+ family_woman_boy_boy
6783+ family_woman_girl
6784+ family_woman_girl_boy
6785+ family_woman_girl_girl
6786+ speaking_head
6787+ bust_in_silhouette
6788+ busts_in_silhouette
6789+ footprints
6790+"
6791+
6792+emoji_groups[animals]="
6793+ monkey_face
6794+ monkey_face_1
6795+ gorilla
6796+ orangutan
6797+ dog_face
6798+ dog_face_1
6799+ guide_dog
6800+ service_dog
6801+ poodle
6802+ wolf
6803+ fox
6804+ raccoon
6805+ cat_face
6806+ cat_face_1
6807+ lion
6808+ tiger_face
6809+ tiger_face_1
6810+ leopard
6811+ horse_face
6812+ horse_face_1
6813+ unicorn
6814+ zebra
6815+ deer
6816+ cow_face
6817+ ox
6818+ water_buffalo
6819+ cow
6820+ pig_face
6821+ pig_face_1
6822+ boar
6823+ pig_nose
6824+ ram
6825+ ewe
6826+ goat
6827+ camel
6828+ two_hump_camel
6829+ llama
6830+ giraffe
6831+ elephant
6832+ rhinoceros
6833+ hippopotamus
6834+ mouse_face
6835+ mouse_face_1
6836+ rat
6837+ hamster
6838+ rabbit_face
6839+ rabbit_face_1
6840+ chipmunk
6841+ hedgehog
6842+ bat
6843+ bear
6844+ koala
6845+ panda
6846+ sloth
6847+ otter
6848+ skunk
6849+ kangaroo
6850+ badger
6851+ paw_prints
6852+ turkey
6853+ chicken
6854+ rooster
6855+ hatching_chick
6856+ baby_chick
6857+ front_facing_baby_chick
6858+ bird
6859+ penguin
6860+ dove
6861+ eagle
6862+ duck
6863+ swan
6864+ owl
6865+ flamingo
6866+ peacock
6867+ parrot
6868+ frog
6869+ crocodile
6870+ turtle
6871+ lizard
6872+ snake
6873+ dragon_face
6874+ dragon_face_1
6875+ sauropod
6876+ T_Rex
6877+ spouting_whale
6878+ spouting_whale_1
6879+ dolphin
6880+ fish
6881+ tropical_fish
6882+ blowfish
6883+ shark
6884+ octopus
6885+ spiral_shell
6886+ snail
6887+ butterfly
6888+ bug
6889+ ant
6890+ honeybee
6891+ lady_beetle
6892+ cricket
6893+ spider
6894+ spider_web
6895+ scorpion
6896+ mosquito
6897+ microbe
6898+"
6899+
6900+emoji_groups[faces]="
6901+ grinning_face
6902+ grinning_face_with_big_eyes
6903+ grinning_face_with_smiling_eyes
6904+ beaming_face_with_smiling_eyes
6905+ grinning_squinting_face
6906+ grinning_face_with_sweat
6907+ rolling_on_the_floor_laughing
6908+ face_with_tears_of_joy
6909+ slightly_smiling_face
6910+ upside_down_face
6911+ winking_face
6912+ smiling_face_with_smiling_eyes
6913+ smiling_face_with_halo
6914+ smiling_face_with_hearts
6915+ smiling_face_with_heart_eyes
6916+ star_struck
6917+ face_blowing_a_kiss
6918+ kissing_face
6919+ smiling_face
6920+ kissing_face_with_closed_eyes
6921+ kissing_face_with_smiling_eyes
6922+ face_savoring_food
6923+ face_with_tongue
6924+ winking_face_with_tongue
6925+ zany_face
6926+ squinting_face_with_tongue
6927+ money_mouth_face
6928+ hugging_face
6929+ face_with_hand_over_mouth
6930+ shushing_face
6931+ thinking_face
6932+ zipper_mouth_face
6933+ face_with_raised_eyebrow
6934+ neutral_face
6935+ expressionless_face
6936+ face_without_mouth
6937+ smirking_face
6938+ unamused_face
6939+ face_with_rolling_eyes
6940+ grimacing_face
6941+ lying_face
6942+ relieved_face
6943+ pensive_face
6944+ sleepy_face
6945+ drooling_face
6946+ sleeping_face
6947+ face_with_medical_mask
6948+ face_with_thermometer
6949+ face_with_head_bandage
6950+ nauseated_face
6951+ face_vomiting
6952+ sneezing_face
6953+ hot_face
6954+ cold_face
6955+ woozy_face
6956+ dizzy_face
6957+ exploding_head
6958+ cowboy_hat_face
6959+ partying_face
6960+ smiling_face_with_sunglasses
6961+ nerd_face
6962+ face_with_monocle
6963+ confused_face
6964+ worried_face
6965+ slightly_frowning_face
6966+ slightly_frowning_face_1
6967+ face_with_open_mouth
6968+ hushed_face
6969+ astonished_face
6970+ flushed_face
6971+ pleading_face
6972+ frowning_face_with_open_mouth
6973+ anguished_face
6974+ fearful_face
6975+ anxious_face_with_sweat
6976+ sad_but_relieved_face
6977+ crying_face
6978+ loudly_crying_face
6979+ face_screaming_in_fear
6980+ confounded_face
6981+ persevering_face
6982+ disappointed_face
6983+ downcast_face_with_sweat
6984+ weary_face
6985+ tired_face
6986+ yawning_face
6987+ face_with_steam_from_nose
6988+ pouting_face
6989+ angry_face
6990+ face_with_symbols_on_mouth
6991+ smiling_face_with_horns
6992+ angry_face_with_horns
6993+ skull
6994+ skull_and_crossbones
6995+ pile_of_poo
6996+ clown_face
6997+ ogre
6998+ goblin
6999+ ghost
7000+ alien
7001+ alien_monster
7002+ robot
7003+"
7004+
7005+emoji_groups[flags]="
7006+ chequered_flag
7007+ triangular_flag
7008+ crossed_flags
7009+ black_flag
7010+ white_flag
7011+ rainbow_flag
7012+ pirate_flag
7013+ Ascension_Island
7014+ Andorra
7015+ United_Arab_Emirates
7016+ Afghanistan
7017+ Antigua_and_Barbuda
7018+ Anguilla
7019+ Albania
7020+ Armenia
7021+ Angola
7022+ Antarctica
7023+ Argentina
7024+ American_Samoa
7025+ Austria
7026+ Australia
7027+ Aruba
7028+ ร…land_Islands
7029+ Azerbaijan
7030+ Bosnia_and_Herzegovina
7031+ Barbados
7032+ Bangladesh
7033+ Belgium
7034+ Burkina_Faso
7035+ Bulgaria
7036+ Bahrain
7037+ Burundi
7038+ Benin
7039+ St_Barthรฉlemy
7040+ Bermuda
7041+ Brunei
7042+ Bolivia
7043+ Caribbean_Netherlands
7044+ Brazil
7045+ Bahamas
7046+ Bhutan
7047+ Bouvet_Island
7048+ Botswana
7049+ Belarus
7050+ Belize
7051+ Canada
7052+ Cocos_Keeling_Islands
7053+ Congo__Kinshasa
7054+ Central_African_Republic
7055+ Congo__Brazzaville
7056+ Switzerland
7057+ Cรดte_d_Ivoire
7058+ Cook_Islands
7059+ Chile
7060+ Cameroon
7061+ China
7062+ Colombia
7063+ Clipperton_Island
7064+ Costa_Rica
7065+ Cuba
7066+ Cape_Verde
7067+ Curaรงao
7068+ Christmas_Island
7069+ Cyprus
7070+ Czechia
7071+ Germany
7072+ Diego_Garcia
7073+ Djibouti
7074+ Denmark
7075+ Dominica
7076+ Dominican_Republic
7077+ Algeria
7078+ Ceuta_and_Melilla
7079+ Ecuador
7080+ Estonia
7081+ Egypt
7082+ Western_Sahara
7083+ Eritrea
7084+ Spain
7085+ Ethiopia
7086+ European_Union
7087+ Finland
7088+ Fiji
7089+ Falkland_Islands
7090+ Micronesia
7091+ Faroe_Islands
7092+ France
7093+ Gabon
7094+ United_Kingdom
7095+ Grenada
7096+ Georgia
7097+ French_Guiana
7098+ Guernsey
7099+ Ghana
7100+ Gibraltar
7101+ Greenland
7102+ Gambia
7103+ Guinea
7104+ Guadeloupe
7105+ Equatorial_Guinea
7106+ Greece
7107+ South_Georgia_and_South_Sandwich_Islands
7108+ Guatemala
7109+ Guam
7110+ Guinea_Bissau
7111+ Guyana
7112+ Hong_Kong_SAR_China
7113+ Heard_and_McDonald_Islands
7114+ Honduras
7115+ Croatia
7116+ Haiti
7117+ Hungary
7118+ Canary_Islands
7119+ Indonesia
7120+ Ireland
7121+ Israel
7122+ Isle_of_Man
7123+ India
7124+ British_Indian_Ocean_Territory
7125+ Iraq
7126+ Iran
7127+ Iceland
7128+ Italy
7129+ Jersey
7130+ Jamaica
7131+ Jordan
7132+ Japan
7133+ Kenya
7134+ Kyrgyzstan
7135+ Cambodia
7136+ Kiribati
7137+ Comoros
7138+ St_Kitts_and_Nevis
7139+ North_Korea
7140+ South_Korea
7141+ Kuwait
7142+ Cayman_Islands
7143+ Kazakhstan
7144+ Laos
7145+ Lebanon
7146+ St_Lucia
7147+ Liechtenstein
7148+ Sri_Lanka
7149+ Liberia
7150+ Lesotho
7151+ Lithuania
7152+ Luxembourg
7153+ Latvia
7154+ Libya
7155+ Morocco
7156+ Monaco
7157+ Moldova
7158+ Montenegro
7159+ St_Martin
7160+ Madagascar
7161+ Marshall_Islands
7162+ Macedonia
7163+ Mali
7164+ Myanmar_Burma_
7165+ Mongolia
7166+ Macao_SAR_China
7167+ Northern_Mariana_Islands
7168+ Martinique
7169+ Mauritania
7170+ Montserrat
7171+ Malta
7172+ Mauritius
7173+ Maldives
7174+ Malawi
7175+ Mexico
7176+ Malaysia
7177+ Mozambique
7178+ Namibia
7179+ New_Caledonia
7180+ Niger
7181+ Norfolk_Island
7182+ Nigeria
7183+ Nicaragua
7184+ Netherlands
7185+ Norway
7186+ Nepal
7187+ Nauru
7188+ Niue
7189+ New_Zealand
7190+ Oman
7191+ Panama
7192+ Peru
7193+ French_Polynesia
7194+ Papua_New_Guinea
7195+ Philippines
7196+ Pakistan
7197+ Poland
7198+ St_Pierre_and_Miquelon
7199+ Pitcairn_Islands
7200+ Puerto_Rico
7201+ Palestinian_Territories
7202+ Portugal
7203+ Palau
7204+ Paraguay
7205+ Qatar
7206+ Rรฉunion
7207+ Romania
7208+ Serbia
7209+ Russia
7210+ Rwanda
7211+ Saudi_Arabia
7212+ Solomon_Islands
7213+ Seychelles
7214+ Sudan
7215+ Sweden
7216+ Singapore
7217+ St_Helena
7218+ Slovenia
7219+ Svalbard_and_Jan_Mayen
7220+ Slovakia
7221+ Sierra_Leone
7222+ San_Marino
7223+ Senegal
7224+ Somalia
7225+ Suriname
7226+ South_Sudan
7227+ Sรฃo_Tomรฉ_and_Prรญncipe
7228+ El_Salvador
7229+ Sint_Maarten
7230+ Syria
7231+ Eswatini
7232+ Tristan_da_Cunha
7233+ Turks_and_Caicos_Islands
7234+ Chad
7235+ French_Southern_Territories
7236+ Togo
7237+ Thailand
7238+ Tajikistan
7239+ Tokelau
7240+ Timor_Leste
7241+ Turkmenistan
7242+ Tunisia
7243+ Tonga
7244+ Turkey
7245+ Trinidad_and_Tobago
7246+ Tuvalu
7247+ Taiwan
7248+ Tanzania
7249+ Ukraine
7250+ Uganda
7251+ U_S_Outlying_Islands
7252+ United_Nations
7253+ United_States
7254+ Uruguay
7255+ Uzbekistan
7256+ Vatican_City
7257+ St_Vincent_and_Grenadines
7258+ Venezuela
7259+ British_Virgin_Islands
7260+ U_S_Virgin_Islands
7261+ Vietnam
7262+ Vanuatu
7263+ Wallis_and_Futuna
7264+ Samoa
7265+ Kosovo
7266+ Yemen
7267+ Mayotte
7268+ South_Africa
7269+ Zambia
7270+ Zimbabwe
7271+ England
7272+ Scotland
7273+ Wales
7274+"
+4122-0.oh-my-zsh/plugins/emoji/emoji-data.txt
@@ -0,0 +1,4122 @@
1+# emoji-data.txt
2+# (Originally emoji-test.txt)
3+# (Retrieved from https://unicode.org/Public/emoji/12.0/emoji-test.txt)
4+
5+# Date: 2019-01-27, 15:43:01 GMT
6+# ยฉ 2019 Unicodeยฎ, Inc.
7+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
8+# For terms of use, see http://www.unicode.org/terms_of_use.html
9+#
10+# Emoji Keyboard/Display Test Data for UTS #51
11+# Version: 12.0
12+#
13+# For documentation and usage, see http://www.unicode.org/reports/tr51
14+#
15+# This file provides data for testing which emoji forms should be in keyboards and which should also be displayed/processed.
16+# Format: code points; status # emoji name
17+# Code points โ€” list of one or more hex code points, separated by spaces
18+# Status
19+# component โ€” an Emoji_Component,
20+# excluding Regional_Indicators, ASCII, and non-Emoji.
21+# fully-qualified โ€” a fully-qualified emoji (see ED-18 in UTS #51),
22+# excluding Emoji_Component
23+# minimally-qualified โ€” a minimally-qualified emoji (see ED-18a in UTS #51)
24+# unqualified โ€” a unqualified emoji (See ED-19 in UTS #51)
25+# Notes:
26+# โ€ข This includes the emoji components that need emoji presentation (skin tone and hair)
27+# when isolated, but omits the components that need not have an emoji
28+# presentation when isolated.
29+# โ€ข The RGI set is covered by the listed fully-qualified emoji.
30+# โ€ข The listed minimally-qualified and unqualified cover all cases where an
31+# element of the RGI set is missing one or more emoji presentation selectors.
32+# โ€ข The file is in CLDR order, not codepoint order. This is recommended (but not required!) for keyboard palettes.
33+# โ€ข The groups and subgroups are illustrative. See the Emoji Order chart for more information.
34+
35+
36+# group: Smileys & Emotion
37+
38+# subgroup: face-smiling
39+1F600 ; fully-qualified # ๐Ÿ˜€ grinning face
40+1F603 ; fully-qualified # ๐Ÿ˜ƒ grinning face with big eyes
41+1F604 ; fully-qualified # ๐Ÿ˜„ grinning face with smiling eyes
42+1F601 ; fully-qualified # ๐Ÿ˜ beaming face with smiling eyes
43+1F606 ; fully-qualified # ๐Ÿ˜† grinning squinting face
44+1F605 ; fully-qualified # ๐Ÿ˜… grinning face with sweat
45+1F923 ; fully-qualified # ๐Ÿคฃ rolling on the floor laughing
46+1F602 ; fully-qualified # ๐Ÿ˜‚ face with tears of joy
47+1F642 ; fully-qualified # ๐Ÿ™‚ slightly smiling face
48+1F643 ; fully-qualified # ๐Ÿ™ƒ upside-down face
49+1F609 ; fully-qualified # ๐Ÿ˜‰ winking face
50+1F60A ; fully-qualified # ๐Ÿ˜Š smiling face with smiling eyes
51+1F607 ; fully-qualified # ๐Ÿ˜‡ smiling face with halo
52+
53+# subgroup: face-affection
54+1F970 ; fully-qualified # ๐Ÿฅฐ smiling face with hearts
55+1F60D ; fully-qualified # ๐Ÿ˜ smiling face with heart-eyes
56+1F929 ; fully-qualified # ๐Ÿคฉ star-struck
57+1F618 ; fully-qualified # ๐Ÿ˜˜ face blowing a kiss
58+1F617 ; fully-qualified # ๐Ÿ˜— kissing face
59+263A FE0F ; fully-qualified # โ˜บ๏ธ smiling face
60+263A ; unqualified # โ˜บ smiling face
61+1F61A ; fully-qualified # ๐Ÿ˜š kissing face with closed eyes
62+1F619 ; fully-qualified # ๐Ÿ˜™ kissing face with smiling eyes
63+
64+# subgroup: face-tongue
65+1F60B ; fully-qualified # ๐Ÿ˜‹ face savoring food
66+1F61B ; fully-qualified # ๐Ÿ˜› face with tongue
67+1F61C ; fully-qualified # ๐Ÿ˜œ winking face with tongue
68+1F92A ; fully-qualified # ๐Ÿคช zany face
69+1F61D ; fully-qualified # ๐Ÿ˜ squinting face with tongue
70+1F911 ; fully-qualified # ๐Ÿค‘ money-mouth face
71+
72+# subgroup: face-hand
73+1F917 ; fully-qualified # ๐Ÿค— hugging face
74+1F92D ; fully-qualified # ๐Ÿคญ face with hand over mouth
75+1F92B ; fully-qualified # ๐Ÿคซ shushing face
76+1F914 ; fully-qualified # ๐Ÿค” thinking face
77+
78+# subgroup: face-neutral-skeptical
79+1F910 ; fully-qualified # ๐Ÿค zipper-mouth face
80+1F928 ; fully-qualified # ๐Ÿคจ face with raised eyebrow
81+1F610 ; fully-qualified # ๐Ÿ˜ neutral face
82+1F611 ; fully-qualified # ๐Ÿ˜‘ expressionless face
83+1F636 ; fully-qualified # ๐Ÿ˜ถ face without mouth
84+1F60F ; fully-qualified # ๐Ÿ˜ smirking face
85+1F612 ; fully-qualified # ๐Ÿ˜’ unamused face
86+1F644 ; fully-qualified # ๐Ÿ™„ face with rolling eyes
87+1F62C ; fully-qualified # ๐Ÿ˜ฌ grimacing face
88+1F925 ; fully-qualified # ๐Ÿคฅ lying face
89+
90+# subgroup: face-sleepy
91+1F60C ; fully-qualified # ๐Ÿ˜Œ relieved face
92+1F614 ; fully-qualified # ๐Ÿ˜” pensive face
93+1F62A ; fully-qualified # ๐Ÿ˜ช sleepy face
94+1F924 ; fully-qualified # ๐Ÿคค drooling face
95+1F634 ; fully-qualified # ๐Ÿ˜ด sleeping face
96+
97+# subgroup: face-unwell
98+1F637 ; fully-qualified # ๐Ÿ˜ท face with medical mask
99+1F912 ; fully-qualified # ๐Ÿค’ face with thermometer
100+1F915 ; fully-qualified # ๐Ÿค• face with head-bandage
101+1F922 ; fully-qualified # ๐Ÿคข nauseated face
102+1F92E ; fully-qualified # ๐Ÿคฎ face vomiting
103+1F927 ; fully-qualified # ๐Ÿคง sneezing face
104+1F975 ; fully-qualified # ๐Ÿฅต hot face
105+1F976 ; fully-qualified # ๐Ÿฅถ cold face
106+1F974 ; fully-qualified # ๐Ÿฅด woozy face
107+1F635 ; fully-qualified # ๐Ÿ˜ต dizzy face
108+1F92F ; fully-qualified # ๐Ÿคฏ exploding head
109+
110+# subgroup: face-hat
111+1F920 ; fully-qualified # ๐Ÿค  cowboy hat face
112+1F973 ; fully-qualified # ๐Ÿฅณ partying face
113+
114+# subgroup: face-glasses
115+1F60E ; fully-qualified # ๐Ÿ˜Ž smiling face with sunglasses
116+1F913 ; fully-qualified # ๐Ÿค“ nerd face
117+1F9D0 ; fully-qualified # ๐Ÿง face with monocle
118+
119+# subgroup: face-concerned
120+1F615 ; fully-qualified # ๐Ÿ˜• confused face
121+1F61F ; fully-qualified # ๐Ÿ˜Ÿ worried face
122+1F641 ; fully-qualified # ๐Ÿ™ slightly frowning face
123+2639 FE0F ; fully-qualified # โ˜น๏ธ frowning face
124+2639 ; unqualified # โ˜น frowning face
125+1F62E ; fully-qualified # ๐Ÿ˜ฎ face with open mouth
126+1F62F ; fully-qualified # ๐Ÿ˜ฏ hushed face
127+1F632 ; fully-qualified # ๐Ÿ˜ฒ astonished face
128+1F633 ; fully-qualified # ๐Ÿ˜ณ flushed face
129+1F97A ; fully-qualified # ๐Ÿฅบ pleading face
130+1F626 ; fully-qualified # ๐Ÿ˜ฆ frowning face with open mouth
131+1F627 ; fully-qualified # ๐Ÿ˜ง anguished face
132+1F628 ; fully-qualified # ๐Ÿ˜จ fearful face
133+1F630 ; fully-qualified # ๐Ÿ˜ฐ anxious face with sweat
134+1F625 ; fully-qualified # ๐Ÿ˜ฅ sad but relieved face
135+1F622 ; fully-qualified # ๐Ÿ˜ข crying face
136+1F62D ; fully-qualified # ๐Ÿ˜ญ loudly crying face
137+1F631 ; fully-qualified # ๐Ÿ˜ฑ face screaming in fear
138+1F616 ; fully-qualified # ๐Ÿ˜– confounded face
139+1F623 ; fully-qualified # ๐Ÿ˜ฃ persevering face
140+1F61E ; fully-qualified # ๐Ÿ˜ž disappointed face
141+1F613 ; fully-qualified # ๐Ÿ˜“ downcast face with sweat
142+1F629 ; fully-qualified # ๐Ÿ˜ฉ weary face
143+1F62B ; fully-qualified # ๐Ÿ˜ซ tired face
144+1F971 ; fully-qualified # ๐Ÿฅฑ yawning face
145+
146+# subgroup: face-negative
147+1F624 ; fully-qualified # ๐Ÿ˜ค face with steam from nose
148+1F621 ; fully-qualified # ๐Ÿ˜ก pouting face
149+1F620 ; fully-qualified # ๐Ÿ˜  angry face
150+1F92C ; fully-qualified # ๐Ÿคฌ face with symbols on mouth
151+1F608 ; fully-qualified # ๐Ÿ˜ˆ smiling face with horns
152+1F47F ; fully-qualified # ๐Ÿ‘ฟ angry face with horns
153+1F480 ; fully-qualified # ๐Ÿ’€ skull
154+2620 FE0F ; fully-qualified # โ˜ ๏ธ skull and crossbones
155+2620 ; unqualified # โ˜  skull and crossbones
156+
157+# subgroup: face-costume
158+1F4A9 ; fully-qualified # ๐Ÿ’ฉ pile of poo
159+1F921 ; fully-qualified # ๐Ÿคก clown face
160+1F479 ; fully-qualified # ๐Ÿ‘น ogre
161+1F47A ; fully-qualified # ๐Ÿ‘บ goblin
162+1F47B ; fully-qualified # ๐Ÿ‘ป ghost
163+1F47D ; fully-qualified # ๐Ÿ‘ฝ alien
164+1F47E ; fully-qualified # ๐Ÿ‘พ alien monster
165+1F916 ; fully-qualified # ๐Ÿค– robot
166+
167+# subgroup: cat-face
168+1F63A ; fully-qualified # ๐Ÿ˜บ grinning cat
169+1F638 ; fully-qualified # ๐Ÿ˜ธ grinning cat with smiling eyes
170+1F639 ; fully-qualified # ๐Ÿ˜น cat with tears of joy
171+1F63B ; fully-qualified # ๐Ÿ˜ป smiling cat with heart-eyes
172+1F63C ; fully-qualified # ๐Ÿ˜ผ cat with wry smile
173+1F63D ; fully-qualified # ๐Ÿ˜ฝ kissing cat
174+1F640 ; fully-qualified # ๐Ÿ™€ weary cat
175+1F63F ; fully-qualified # ๐Ÿ˜ฟ crying cat
176+1F63E ; fully-qualified # ๐Ÿ˜พ pouting cat
177+
178+# subgroup: monkey-face
179+1F648 ; fully-qualified # ๐Ÿ™ˆ see-no-evil monkey
180+1F649 ; fully-qualified # ๐Ÿ™‰ hear-no-evil monkey
181+1F64A ; fully-qualified # ๐Ÿ™Š speak-no-evil monkey
182+
183+# subgroup: emotion
184+1F48B ; fully-qualified # ๐Ÿ’‹ kiss mark
185+1F48C ; fully-qualified # ๐Ÿ’Œ love letter
186+1F498 ; fully-qualified # ๐Ÿ’˜ heart with arrow
187+1F49D ; fully-qualified # ๐Ÿ’ heart with ribbon
188+1F496 ; fully-qualified # ๐Ÿ’– sparkling heart
189+1F497 ; fully-qualified # ๐Ÿ’— growing heart
190+1F493 ; fully-qualified # ๐Ÿ’“ beating heart
191+1F49E ; fully-qualified # ๐Ÿ’ž revolving hearts
192+1F495 ; fully-qualified # ๐Ÿ’• two hearts
193+1F49F ; fully-qualified # ๐Ÿ’Ÿ heart decoration
194+2763 FE0F ; fully-qualified # โฃ๏ธ heart exclamation
195+2763 ; unqualified # โฃ heart exclamation
196+1F494 ; fully-qualified # ๐Ÿ’” broken heart
197+2764 FE0F ; fully-qualified # โค๏ธ red heart
198+2764 ; unqualified # โค red heart
199+1F9E1 ; fully-qualified # ๐Ÿงก orange heart
200+1F49B ; fully-qualified # ๐Ÿ’› yellow heart
201+1F49A ; fully-qualified # ๐Ÿ’š green heart
202+1F499 ; fully-qualified # ๐Ÿ’™ blue heart
203+1F49C ; fully-qualified # ๐Ÿ’œ purple heart
204+1F90E ; fully-qualified # ๐ŸคŽ brown heart
205+1F5A4 ; fully-qualified # ๐Ÿ–ค black heart
206+1F90D ; fully-qualified # ๐Ÿค white heart
207+1F4AF ; fully-qualified # ๐Ÿ’ฏ hundred points
208+1F4A2 ; fully-qualified # ๐Ÿ’ข anger symbol
209+1F4A5 ; fully-qualified # ๐Ÿ’ฅ collision
210+1F4AB ; fully-qualified # ๐Ÿ’ซ dizzy
211+1F4A6 ; fully-qualified # ๐Ÿ’ฆ sweat droplets
212+1F4A8 ; fully-qualified # ๐Ÿ’จ dashing away
213+1F573 FE0F ; fully-qualified # ๐Ÿ•ณ๏ธ hole
214+1F573 ; unqualified # ๐Ÿ•ณ hole
215+1F4A3 ; fully-qualified # ๐Ÿ’ฃ bomb
216+1F4AC ; fully-qualified # ๐Ÿ’ฌ speech balloon
217+1F441 FE0F 200D 1F5E8 FE0F ; fully-qualified # ๐Ÿ‘๏ธโ€๐Ÿ—จ๏ธ eye in speech bubble
218+1F441 200D 1F5E8 FE0F ; unqualified # ๐Ÿ‘โ€๐Ÿ—จ๏ธ eye in speech bubble
219+1F441 FE0F 200D 1F5E8 ; unqualified # ๐Ÿ‘๏ธโ€๐Ÿ—จ eye in speech bubble
220+1F441 200D 1F5E8 ; unqualified # ๐Ÿ‘โ€๐Ÿ—จ eye in speech bubble
221+1F5E8 FE0F ; fully-qualified # ๐Ÿ—จ๏ธ left speech bubble
222+1F5E8 ; unqualified # ๐Ÿ—จ left speech bubble
223+1F5EF FE0F ; fully-qualified # ๐Ÿ—ฏ๏ธ right anger bubble
224+1F5EF ; unqualified # ๐Ÿ—ฏ right anger bubble
225+1F4AD ; fully-qualified # ๐Ÿ’ญ thought balloon
226+1F4A4 ; fully-qualified # ๐Ÿ’ค zzz
227+
228+# Smileys & Emotion subtotal: 160
229+# Smileys & Emotion subtotal: 160 w/o modifiers
230+
231+# group: People & Body
232+
233+# subgroup: hand-fingers-open
234+1F44B ; fully-qualified # ๐Ÿ‘‹ waving hand
235+1F44B 1F3FB ; fully-qualified # ๐Ÿ‘‹๐Ÿป waving hand: light skin tone
236+1F44B 1F3FC ; fully-qualified # ๐Ÿ‘‹๐Ÿผ waving hand: medium-light skin tone
237+1F44B 1F3FD ; fully-qualified # ๐Ÿ‘‹๐Ÿฝ waving hand: medium skin tone
238+1F44B 1F3FE ; fully-qualified # ๐Ÿ‘‹๐Ÿพ waving hand: medium-dark skin tone
239+1F44B 1F3FF ; fully-qualified # ๐Ÿ‘‹๐Ÿฟ waving hand: dark skin tone
240+1F91A ; fully-qualified # ๐Ÿคš raised back of hand
241+1F91A 1F3FB ; fully-qualified # ๐Ÿคš๐Ÿป raised back of hand: light skin tone
242+1F91A 1F3FC ; fully-qualified # ๐Ÿคš๐Ÿผ raised back of hand: medium-light skin tone
243+1F91A 1F3FD ; fully-qualified # ๐Ÿคš๐Ÿฝ raised back of hand: medium skin tone
244+1F91A 1F3FE ; fully-qualified # ๐Ÿคš๐Ÿพ raised back of hand: medium-dark skin tone
245+1F91A 1F3FF ; fully-qualified # ๐Ÿคš๐Ÿฟ raised back of hand: dark skin tone
246+1F590 FE0F ; fully-qualified # ๐Ÿ–๏ธ hand with fingers splayed
247+1F590 ; unqualified # ๐Ÿ– hand with fingers splayed
248+1F590 1F3FB ; fully-qualified # ๐Ÿ–๐Ÿป hand with fingers splayed: light skin tone
249+1F590 1F3FC ; fully-qualified # ๐Ÿ–๐Ÿผ hand with fingers splayed: medium-light skin tone
250+1F590 1F3FD ; fully-qualified # ๐Ÿ–๐Ÿฝ hand with fingers splayed: medium skin tone
251+1F590 1F3FE ; fully-qualified # ๐Ÿ–๐Ÿพ hand with fingers splayed: medium-dark skin tone
252+1F590 1F3FF ; fully-qualified # ๐Ÿ–๐Ÿฟ hand with fingers splayed: dark skin tone
253+270B ; fully-qualified # โœ‹ raised hand
254+270B 1F3FB ; fully-qualified # โœ‹๐Ÿป raised hand: light skin tone
255+270B 1F3FC ; fully-qualified # โœ‹๐Ÿผ raised hand: medium-light skin tone
256+270B 1F3FD ; fully-qualified # โœ‹๐Ÿฝ raised hand: medium skin tone
257+270B 1F3FE ; fully-qualified # โœ‹๐Ÿพ raised hand: medium-dark skin tone
258+270B 1F3FF ; fully-qualified # โœ‹๐Ÿฟ raised hand: dark skin tone
259+1F596 ; fully-qualified # ๐Ÿ–– vulcan salute
260+1F596 1F3FB ; fully-qualified # ๐Ÿ––๐Ÿป vulcan salute: light skin tone
261+1F596 1F3FC ; fully-qualified # ๐Ÿ––๐Ÿผ vulcan salute: medium-light skin tone
262+1F596 1F3FD ; fully-qualified # ๐Ÿ––๐Ÿฝ vulcan salute: medium skin tone
263+1F596 1F3FE ; fully-qualified # ๐Ÿ––๐Ÿพ vulcan salute: medium-dark skin tone
264+1F596 1F3FF ; fully-qualified # ๐Ÿ––๐Ÿฟ vulcan salute: dark skin tone
265+
266+# subgroup: hand-fingers-partial
267+1F44C ; fully-qualified # ๐Ÿ‘Œ OK hand
268+1F44C 1F3FB ; fully-qualified # ๐Ÿ‘Œ๐Ÿป OK hand: light skin tone
269+1F44C 1F3FC ; fully-qualified # ๐Ÿ‘Œ๐Ÿผ OK hand: medium-light skin tone
270+1F44C 1F3FD ; fully-qualified # ๐Ÿ‘Œ๐Ÿฝ OK hand: medium skin tone
271+1F44C 1F3FE ; fully-qualified # ๐Ÿ‘Œ๐Ÿพ OK hand: medium-dark skin tone
272+1F44C 1F3FF ; fully-qualified # ๐Ÿ‘Œ๐Ÿฟ OK hand: dark skin tone
273+1F90F ; fully-qualified # ๐Ÿค pinching hand
274+1F90F 1F3FB ; fully-qualified # ๐Ÿค๐Ÿป pinching hand: light skin tone
275+1F90F 1F3FC ; fully-qualified # ๐Ÿค๐Ÿผ pinching hand: medium-light skin tone
276+1F90F 1F3FD ; fully-qualified # ๐Ÿค๐Ÿฝ pinching hand: medium skin tone
277+1F90F 1F3FE ; fully-qualified # ๐Ÿค๐Ÿพ pinching hand: medium-dark skin tone
278+1F90F 1F3FF ; fully-qualified # ๐Ÿค๐Ÿฟ pinching hand: dark skin tone
279+270C FE0F ; fully-qualified # โœŒ๏ธ victory hand
280+270C ; unqualified # โœŒ victory hand
281+270C 1F3FB ; fully-qualified # โœŒ๐Ÿป victory hand: light skin tone
282+270C 1F3FC ; fully-qualified # โœŒ๐Ÿผ victory hand: medium-light skin tone
283+270C 1F3FD ; fully-qualified # โœŒ๐Ÿฝ victory hand: medium skin tone
284+270C 1F3FE ; fully-qualified # โœŒ๐Ÿพ victory hand: medium-dark skin tone
285+270C 1F3FF ; fully-qualified # โœŒ๐Ÿฟ victory hand: dark skin tone
286+1F91E ; fully-qualified # ๐Ÿคž crossed fingers
287+1F91E 1F3FB ; fully-qualified # ๐Ÿคž๐Ÿป crossed fingers: light skin tone
288+1F91E 1F3FC ; fully-qualified # ๐Ÿคž๐Ÿผ crossed fingers: medium-light skin tone
289+1F91E 1F3FD ; fully-qualified # ๐Ÿคž๐Ÿฝ crossed fingers: medium skin tone
290+1F91E 1F3FE ; fully-qualified # ๐Ÿคž๐Ÿพ crossed fingers: medium-dark skin tone
291+1F91E 1F3FF ; fully-qualified # ๐Ÿคž๐Ÿฟ crossed fingers: dark skin tone
292+1F91F ; fully-qualified # ๐ŸคŸ love-you gesture
293+1F91F 1F3FB ; fully-qualified # ๐ŸคŸ๐Ÿป love-you gesture: light skin tone
294+1F91F 1F3FC ; fully-qualified # ๐ŸคŸ๐Ÿผ love-you gesture: medium-light skin tone
295+1F91F 1F3FD ; fully-qualified # ๐ŸคŸ๐Ÿฝ love-you gesture: medium skin tone
296+1F91F 1F3FE ; fully-qualified # ๐ŸคŸ๐Ÿพ love-you gesture: medium-dark skin tone
297+1F91F 1F3FF ; fully-qualified # ๐ŸคŸ๐Ÿฟ love-you gesture: dark skin tone
298+1F918 ; fully-qualified # ๐Ÿค˜ sign of the horns
299+1F918 1F3FB ; fully-qualified # ๐Ÿค˜๐Ÿป sign of the horns: light skin tone
300+1F918 1F3FC ; fully-qualified # ๐Ÿค˜๐Ÿผ sign of the horns: medium-light skin tone
301+1F918 1F3FD ; fully-qualified # ๐Ÿค˜๐Ÿฝ sign of the horns: medium skin tone
302+1F918 1F3FE ; fully-qualified # ๐Ÿค˜๐Ÿพ sign of the horns: medium-dark skin tone
303+1F918 1F3FF ; fully-qualified # ๐Ÿค˜๐Ÿฟ sign of the horns: dark skin tone
304+1F919 ; fully-qualified # ๐Ÿค™ call me hand
305+1F919 1F3FB ; fully-qualified # ๐Ÿค™๐Ÿป call me hand: light skin tone
306+1F919 1F3FC ; fully-qualified # ๐Ÿค™๐Ÿผ call me hand: medium-light skin tone
307+1F919 1F3FD ; fully-qualified # ๐Ÿค™๐Ÿฝ call me hand: medium skin tone
308+1F919 1F3FE ; fully-qualified # ๐Ÿค™๐Ÿพ call me hand: medium-dark skin tone
309+1F919 1F3FF ; fully-qualified # ๐Ÿค™๐Ÿฟ call me hand: dark skin tone
310+
311+# subgroup: hand-single-finger
312+1F448 ; fully-qualified # ๐Ÿ‘ˆ backhand index pointing left
313+1F448 1F3FB ; fully-qualified # ๐Ÿ‘ˆ๐Ÿป backhand index pointing left: light skin tone
314+1F448 1F3FC ; fully-qualified # ๐Ÿ‘ˆ๐Ÿผ backhand index pointing left: medium-light skin tone
315+1F448 1F3FD ; fully-qualified # ๐Ÿ‘ˆ๐Ÿฝ backhand index pointing left: medium skin tone
316+1F448 1F3FE ; fully-qualified # ๐Ÿ‘ˆ๐Ÿพ backhand index pointing left: medium-dark skin tone
317+1F448 1F3FF ; fully-qualified # ๐Ÿ‘ˆ๐Ÿฟ backhand index pointing left: dark skin tone
318+1F449 ; fully-qualified # ๐Ÿ‘‰ backhand index pointing right
319+1F449 1F3FB ; fully-qualified # ๐Ÿ‘‰๐Ÿป backhand index pointing right: light skin tone
320+1F449 1F3FC ; fully-qualified # ๐Ÿ‘‰๐Ÿผ backhand index pointing right: medium-light skin tone
321+1F449 1F3FD ; fully-qualified # ๐Ÿ‘‰๐Ÿฝ backhand index pointing right: medium skin tone
322+1F449 1F3FE ; fully-qualified # ๐Ÿ‘‰๐Ÿพ backhand index pointing right: medium-dark skin tone
323+1F449 1F3FF ; fully-qualified # ๐Ÿ‘‰๐Ÿฟ backhand index pointing right: dark skin tone
324+1F446 ; fully-qualified # ๐Ÿ‘† backhand index pointing up
325+1F446 1F3FB ; fully-qualified # ๐Ÿ‘†๐Ÿป backhand index pointing up: light skin tone
326+1F446 1F3FC ; fully-qualified # ๐Ÿ‘†๐Ÿผ backhand index pointing up: medium-light skin tone
327+1F446 1F3FD ; fully-qualified # ๐Ÿ‘†๐Ÿฝ backhand index pointing up: medium skin tone
328+1F446 1F3FE ; fully-qualified # ๐Ÿ‘†๐Ÿพ backhand index pointing up: medium-dark skin tone
329+1F446 1F3FF ; fully-qualified # ๐Ÿ‘†๐Ÿฟ backhand index pointing up: dark skin tone
330+1F595 ; fully-qualified # ๐Ÿ–• middle finger
331+1F595 1F3FB ; fully-qualified # ๐Ÿ–•๐Ÿป middle finger: light skin tone
332+1F595 1F3FC ; fully-qualified # ๐Ÿ–•๐Ÿผ middle finger: medium-light skin tone
333+1F595 1F3FD ; fully-qualified # ๐Ÿ–•๐Ÿฝ middle finger: medium skin tone
334+1F595 1F3FE ; fully-qualified # ๐Ÿ–•๐Ÿพ middle finger: medium-dark skin tone
335+1F595 1F3FF ; fully-qualified # ๐Ÿ–•๐Ÿฟ middle finger: dark skin tone
336+1F447 ; fully-qualified # ๐Ÿ‘‡ backhand index pointing down
337+1F447 1F3FB ; fully-qualified # ๐Ÿ‘‡๐Ÿป backhand index pointing down: light skin tone
338+1F447 1F3FC ; fully-qualified # ๐Ÿ‘‡๐Ÿผ backhand index pointing down: medium-light skin tone
339+1F447 1F3FD ; fully-qualified # ๐Ÿ‘‡๐Ÿฝ backhand index pointing down: medium skin tone
340+1F447 1F3FE ; fully-qualified # ๐Ÿ‘‡๐Ÿพ backhand index pointing down: medium-dark skin tone
341+1F447 1F3FF ; fully-qualified # ๐Ÿ‘‡๐Ÿฟ backhand index pointing down: dark skin tone
342+261D FE0F ; fully-qualified # โ˜๏ธ index pointing up
343+261D ; unqualified # โ˜ index pointing up
344+261D 1F3FB ; fully-qualified # โ˜๐Ÿป index pointing up: light skin tone
345+261D 1F3FC ; fully-qualified # โ˜๐Ÿผ index pointing up: medium-light skin tone
346+261D 1F3FD ; fully-qualified # โ˜๐Ÿฝ index pointing up: medium skin tone
347+261D 1F3FE ; fully-qualified # โ˜๐Ÿพ index pointing up: medium-dark skin tone
348+261D 1F3FF ; fully-qualified # โ˜๐Ÿฟ index pointing up: dark skin tone
349+
350+# subgroup: hand-fingers-closed
351+1F44D ; fully-qualified # ๐Ÿ‘ thumbs up
352+1F44D 1F3FB ; fully-qualified # ๐Ÿ‘๐Ÿป thumbs up: light skin tone
353+1F44D 1F3FC ; fully-qualified # ๐Ÿ‘๐Ÿผ thumbs up: medium-light skin tone
354+1F44D 1F3FD ; fully-qualified # ๐Ÿ‘๐Ÿฝ thumbs up: medium skin tone
355+1F44D 1F3FE ; fully-qualified # ๐Ÿ‘๐Ÿพ thumbs up: medium-dark skin tone
356+1F44D 1F3FF ; fully-qualified # ๐Ÿ‘๐Ÿฟ thumbs up: dark skin tone
357+1F44E ; fully-qualified # ๐Ÿ‘Ž thumbs down
358+1F44E 1F3FB ; fully-qualified # ๐Ÿ‘Ž๐Ÿป thumbs down: light skin tone
359+1F44E 1F3FC ; fully-qualified # ๐Ÿ‘Ž๐Ÿผ thumbs down: medium-light skin tone
360+1F44E 1F3FD ; fully-qualified # ๐Ÿ‘Ž๐Ÿฝ thumbs down: medium skin tone
361+1F44E 1F3FE ; fully-qualified # ๐Ÿ‘Ž๐Ÿพ thumbs down: medium-dark skin tone
362+1F44E 1F3FF ; fully-qualified # ๐Ÿ‘Ž๐Ÿฟ thumbs down: dark skin tone
363+270A ; fully-qualified # โœŠ raised fist
364+270A 1F3FB ; fully-qualified # โœŠ๐Ÿป raised fist: light skin tone
365+270A 1F3FC ; fully-qualified # โœŠ๐Ÿผ raised fist: medium-light skin tone
366+270A 1F3FD ; fully-qualified # โœŠ๐Ÿฝ raised fist: medium skin tone
367+270A 1F3FE ; fully-qualified # โœŠ๐Ÿพ raised fist: medium-dark skin tone
368+270A 1F3FF ; fully-qualified # โœŠ๐Ÿฟ raised fist: dark skin tone
369+1F44A ; fully-qualified # ๐Ÿ‘Š oncoming fist
370+1F44A 1F3FB ; fully-qualified # ๐Ÿ‘Š๐Ÿป oncoming fist: light skin tone
371+1F44A 1F3FC ; fully-qualified # ๐Ÿ‘Š๐Ÿผ oncoming fist: medium-light skin tone
372+1F44A 1F3FD ; fully-qualified # ๐Ÿ‘Š๐Ÿฝ oncoming fist: medium skin tone
373+1F44A 1F3FE ; fully-qualified # ๐Ÿ‘Š๐Ÿพ oncoming fist: medium-dark skin tone
374+1F44A 1F3FF ; fully-qualified # ๐Ÿ‘Š๐Ÿฟ oncoming fist: dark skin tone
375+1F91B ; fully-qualified # ๐Ÿค› left-facing fist
376+1F91B 1F3FB ; fully-qualified # ๐Ÿค›๐Ÿป left-facing fist: light skin tone
377+1F91B 1F3FC ; fully-qualified # ๐Ÿค›๐Ÿผ left-facing fist: medium-light skin tone
378+1F91B 1F3FD ; fully-qualified # ๐Ÿค›๐Ÿฝ left-facing fist: medium skin tone
379+1F91B 1F3FE ; fully-qualified # ๐Ÿค›๐Ÿพ left-facing fist: medium-dark skin tone
380+1F91B 1F3FF ; fully-qualified # ๐Ÿค›๐Ÿฟ left-facing fist: dark skin tone
381+1F91C ; fully-qualified # ๐Ÿคœ right-facing fist
382+1F91C 1F3FB ; fully-qualified # ๐Ÿคœ๐Ÿป right-facing fist: light skin tone
383+1F91C 1F3FC ; fully-qualified # ๐Ÿคœ๐Ÿผ right-facing fist: medium-light skin tone
384+1F91C 1F3FD ; fully-qualified # ๐Ÿคœ๐Ÿฝ right-facing fist: medium skin tone
385+1F91C 1F3FE ; fully-qualified # ๐Ÿคœ๐Ÿพ right-facing fist: medium-dark skin tone
386+1F91C 1F3FF ; fully-qualified # ๐Ÿคœ๐Ÿฟ right-facing fist: dark skin tone
387+
388+# subgroup: hands
389+1F44F ; fully-qualified # ๐Ÿ‘ clapping hands
390+1F44F 1F3FB ; fully-qualified # ๐Ÿ‘๐Ÿป clapping hands: light skin tone
391+1F44F 1F3FC ; fully-qualified # ๐Ÿ‘๐Ÿผ clapping hands: medium-light skin tone
392+1F44F 1F3FD ; fully-qualified # ๐Ÿ‘๐Ÿฝ clapping hands: medium skin tone
393+1F44F 1F3FE ; fully-qualified # ๐Ÿ‘๐Ÿพ clapping hands: medium-dark skin tone
394+1F44F 1F3FF ; fully-qualified # ๐Ÿ‘๐Ÿฟ clapping hands: dark skin tone
395+1F64C ; fully-qualified # ๐Ÿ™Œ raising hands
396+1F64C 1F3FB ; fully-qualified # ๐Ÿ™Œ๐Ÿป raising hands: light skin tone
397+1F64C 1F3FC ; fully-qualified # ๐Ÿ™Œ๐Ÿผ raising hands: medium-light skin tone
398+1F64C 1F3FD ; fully-qualified # ๐Ÿ™Œ๐Ÿฝ raising hands: medium skin tone
399+1F64C 1F3FE ; fully-qualified # ๐Ÿ™Œ๐Ÿพ raising hands: medium-dark skin tone
400+1F64C 1F3FF ; fully-qualified # ๐Ÿ™Œ๐Ÿฟ raising hands: dark skin tone
401+1F450 ; fully-qualified # ๐Ÿ‘ open hands
402+1F450 1F3FB ; fully-qualified # ๐Ÿ‘๐Ÿป open hands: light skin tone
403+1F450 1F3FC ; fully-qualified # ๐Ÿ‘๐Ÿผ open hands: medium-light skin tone
404+1F450 1F3FD ; fully-qualified # ๐Ÿ‘๐Ÿฝ open hands: medium skin tone
405+1F450 1F3FE ; fully-qualified # ๐Ÿ‘๐Ÿพ open hands: medium-dark skin tone
406+1F450 1F3FF ; fully-qualified # ๐Ÿ‘๐Ÿฟ open hands: dark skin tone
407+1F932 ; fully-qualified # ๐Ÿคฒ palms up together
408+1F932 1F3FB ; fully-qualified # ๐Ÿคฒ๐Ÿป palms up together: light skin tone
409+1F932 1F3FC ; fully-qualified # ๐Ÿคฒ๐Ÿผ palms up together: medium-light skin tone
410+1F932 1F3FD ; fully-qualified # ๐Ÿคฒ๐Ÿฝ palms up together: medium skin tone
411+1F932 1F3FE ; fully-qualified # ๐Ÿคฒ๐Ÿพ palms up together: medium-dark skin tone
412+1F932 1F3FF ; fully-qualified # ๐Ÿคฒ๐Ÿฟ palms up together: dark skin tone
413+1F91D ; fully-qualified # ๐Ÿค handshake
414+1F64F ; fully-qualified # ๐Ÿ™ folded hands
415+1F64F 1F3FB ; fully-qualified # ๐Ÿ™๐Ÿป folded hands: light skin tone
416+1F64F 1F3FC ; fully-qualified # ๐Ÿ™๐Ÿผ folded hands: medium-light skin tone
417+1F64F 1F3FD ; fully-qualified # ๐Ÿ™๐Ÿฝ folded hands: medium skin tone
418+1F64F 1F3FE ; fully-qualified # ๐Ÿ™๐Ÿพ folded hands: medium-dark skin tone
419+1F64F 1F3FF ; fully-qualified # ๐Ÿ™๐Ÿฟ folded hands: dark skin tone
420+
421+# subgroup: hand-prop
422+270D FE0F ; fully-qualified # โœ๏ธ writing hand
423+270D ; unqualified # โœ writing hand
424+270D 1F3FB ; fully-qualified # โœ๐Ÿป writing hand: light skin tone
425+270D 1F3FC ; fully-qualified # โœ๐Ÿผ writing hand: medium-light skin tone
426+270D 1F3FD ; fully-qualified # โœ๐Ÿฝ writing hand: medium skin tone
427+270D 1F3FE ; fully-qualified # โœ๐Ÿพ writing hand: medium-dark skin tone
428+270D 1F3FF ; fully-qualified # โœ๐Ÿฟ writing hand: dark skin tone
429+1F485 ; fully-qualified # ๐Ÿ’… nail polish
430+1F485 1F3FB ; fully-qualified # ๐Ÿ’…๐Ÿป nail polish: light skin tone
431+1F485 1F3FC ; fully-qualified # ๐Ÿ’…๐Ÿผ nail polish: medium-light skin tone
432+1F485 1F3FD ; fully-qualified # ๐Ÿ’…๐Ÿฝ nail polish: medium skin tone
433+1F485 1F3FE ; fully-qualified # ๐Ÿ’…๐Ÿพ nail polish: medium-dark skin tone
434+1F485 1F3FF ; fully-qualified # ๐Ÿ’…๐Ÿฟ nail polish: dark skin tone
435+1F933 ; fully-qualified # ๐Ÿคณ selfie
436+1F933 1F3FB ; fully-qualified # ๐Ÿคณ๐Ÿป selfie: light skin tone
437+1F933 1F3FC ; fully-qualified # ๐Ÿคณ๐Ÿผ selfie: medium-light skin tone
438+1F933 1F3FD ; fully-qualified # ๐Ÿคณ๐Ÿฝ selfie: medium skin tone
439+1F933 1F3FE ; fully-qualified # ๐Ÿคณ๐Ÿพ selfie: medium-dark skin tone
440+1F933 1F3FF ; fully-qualified # ๐Ÿคณ๐Ÿฟ selfie: dark skin tone
441+
442+# subgroup: body-parts
443+1F4AA ; fully-qualified # ๐Ÿ’ช flexed biceps
444+1F4AA 1F3FB ; fully-qualified # ๐Ÿ’ช๐Ÿป flexed biceps: light skin tone
445+1F4AA 1F3FC ; fully-qualified # ๐Ÿ’ช๐Ÿผ flexed biceps: medium-light skin tone
446+1F4AA 1F3FD ; fully-qualified # ๐Ÿ’ช๐Ÿฝ flexed biceps: medium skin tone
447+1F4AA 1F3FE ; fully-qualified # ๐Ÿ’ช๐Ÿพ flexed biceps: medium-dark skin tone
448+1F4AA 1F3FF ; fully-qualified # ๐Ÿ’ช๐Ÿฟ flexed biceps: dark skin tone
449+1F9BE ; fully-qualified # ๐Ÿฆพ mechanical arm
450+1F9BF ; fully-qualified # ๐Ÿฆฟ mechanical leg
451+1F9B5 ; fully-qualified # ๐Ÿฆต leg
452+1F9B5 1F3FB ; fully-qualified # ๐Ÿฆต๐Ÿป leg: light skin tone
453+1F9B5 1F3FC ; fully-qualified # ๐Ÿฆต๐Ÿผ leg: medium-light skin tone
454+1F9B5 1F3FD ; fully-qualified # ๐Ÿฆต๐Ÿฝ leg: medium skin tone
455+1F9B5 1F3FE ; fully-qualified # ๐Ÿฆต๐Ÿพ leg: medium-dark skin tone
456+1F9B5 1F3FF ; fully-qualified # ๐Ÿฆต๐Ÿฟ leg: dark skin tone
457+1F9B6 ; fully-qualified # ๐Ÿฆถ foot
458+1F9B6 1F3FB ; fully-qualified # ๐Ÿฆถ๐Ÿป foot: light skin tone
459+1F9B6 1F3FC ; fully-qualified # ๐Ÿฆถ๐Ÿผ foot: medium-light skin tone
460+1F9B6 1F3FD ; fully-qualified # ๐Ÿฆถ๐Ÿฝ foot: medium skin tone
461+1F9B6 1F3FE ; fully-qualified # ๐Ÿฆถ๐Ÿพ foot: medium-dark skin tone
462+1F9B6 1F3FF ; fully-qualified # ๐Ÿฆถ๐Ÿฟ foot: dark skin tone
463+1F442 ; fully-qualified # ๐Ÿ‘‚ ear
464+1F442 1F3FB ; fully-qualified # ๐Ÿ‘‚๐Ÿป ear: light skin tone
465+1F442 1F3FC ; fully-qualified # ๐Ÿ‘‚๐Ÿผ ear: medium-light skin tone
466+1F442 1F3FD ; fully-qualified # ๐Ÿ‘‚๐Ÿฝ ear: medium skin tone
467+1F442 1F3FE ; fully-qualified # ๐Ÿ‘‚๐Ÿพ ear: medium-dark skin tone
468+1F442 1F3FF ; fully-qualified # ๐Ÿ‘‚๐Ÿฟ ear: dark skin tone
469+1F9BB ; fully-qualified # ๐Ÿฆป ear with hearing aid
470+1F9BB 1F3FB ; fully-qualified # ๐Ÿฆป๐Ÿป ear with hearing aid: light skin tone
471+1F9BB 1F3FC ; fully-qualified # ๐Ÿฆป๐Ÿผ ear with hearing aid: medium-light skin tone
472+1F9BB 1F3FD ; fully-qualified # ๐Ÿฆป๐Ÿฝ ear with hearing aid: medium skin tone
473+1F9BB 1F3FE ; fully-qualified # ๐Ÿฆป๐Ÿพ ear with hearing aid: medium-dark skin tone
474+1F9BB 1F3FF ; fully-qualified # ๐Ÿฆป๐Ÿฟ ear with hearing aid: dark skin tone
475+1F443 ; fully-qualified # ๐Ÿ‘ƒ nose
476+1F443 1F3FB ; fully-qualified # ๐Ÿ‘ƒ๐Ÿป nose: light skin tone
477+1F443 1F3FC ; fully-qualified # ๐Ÿ‘ƒ๐Ÿผ nose: medium-light skin tone
478+1F443 1F3FD ; fully-qualified # ๐Ÿ‘ƒ๐Ÿฝ nose: medium skin tone
479+1F443 1F3FE ; fully-qualified # ๐Ÿ‘ƒ๐Ÿพ nose: medium-dark skin tone
480+1F443 1F3FF ; fully-qualified # ๐Ÿ‘ƒ๐Ÿฟ nose: dark skin tone
481+1F9E0 ; fully-qualified # ๐Ÿง  brain
482+1F9B7 ; fully-qualified # ๐Ÿฆท tooth
483+1F9B4 ; fully-qualified # ๐Ÿฆด bone
484+1F440 ; fully-qualified # ๐Ÿ‘€ eyes
485+1F441 FE0F ; fully-qualified # ๐Ÿ‘๏ธ eye
486+1F441 ; unqualified # ๐Ÿ‘ eye
487+1F445 ; fully-qualified # ๐Ÿ‘… tongue
488+1F444 ; fully-qualified # ๐Ÿ‘„ mouth
489+
490+# subgroup: person
491+1F476 ; fully-qualified # ๐Ÿ‘ถ baby
492+1F476 1F3FB ; fully-qualified # ๐Ÿ‘ถ๐Ÿป baby: light skin tone
493+1F476 1F3FC ; fully-qualified # ๐Ÿ‘ถ๐Ÿผ baby: medium-light skin tone
494+1F476 1F3FD ; fully-qualified # ๐Ÿ‘ถ๐Ÿฝ baby: medium skin tone
495+1F476 1F3FE ; fully-qualified # ๐Ÿ‘ถ๐Ÿพ baby: medium-dark skin tone
496+1F476 1F3FF ; fully-qualified # ๐Ÿ‘ถ๐Ÿฟ baby: dark skin tone
497+1F9D2 ; fully-qualified # ๐Ÿง’ child
498+1F9D2 1F3FB ; fully-qualified # ๐Ÿง’๐Ÿป child: light skin tone
499+1F9D2 1F3FC ; fully-qualified # ๐Ÿง’๐Ÿผ child: medium-light skin tone
500+1F9D2 1F3FD ; fully-qualified # ๐Ÿง’๐Ÿฝ child: medium skin tone
501+1F9D2 1F3FE ; fully-qualified # ๐Ÿง’๐Ÿพ child: medium-dark skin tone
502+1F9D2 1F3FF ; fully-qualified # ๐Ÿง’๐Ÿฟ child: dark skin tone
503+1F466 ; fully-qualified # ๐Ÿ‘ฆ boy
504+1F466 1F3FB ; fully-qualified # ๐Ÿ‘ฆ๐Ÿป boy: light skin tone
505+1F466 1F3FC ; fully-qualified # ๐Ÿ‘ฆ๐Ÿผ boy: medium-light skin tone
506+1F466 1F3FD ; fully-qualified # ๐Ÿ‘ฆ๐Ÿฝ boy: medium skin tone
507+1F466 1F3FE ; fully-qualified # ๐Ÿ‘ฆ๐Ÿพ boy: medium-dark skin tone
508+1F466 1F3FF ; fully-qualified # ๐Ÿ‘ฆ๐Ÿฟ boy: dark skin tone
509+1F467 ; fully-qualified # ๐Ÿ‘ง girl
510+1F467 1F3FB ; fully-qualified # ๐Ÿ‘ง๐Ÿป girl: light skin tone
511+1F467 1F3FC ; fully-qualified # ๐Ÿ‘ง๐Ÿผ girl: medium-light skin tone
512+1F467 1F3FD ; fully-qualified # ๐Ÿ‘ง๐Ÿฝ girl: medium skin tone
513+1F467 1F3FE ; fully-qualified # ๐Ÿ‘ง๐Ÿพ girl: medium-dark skin tone
514+1F467 1F3FF ; fully-qualified # ๐Ÿ‘ง๐Ÿฟ girl: dark skin tone
515+1F9D1 ; fully-qualified # ๐Ÿง‘ person
516+1F9D1 1F3FB ; fully-qualified # ๐Ÿง‘๐Ÿป person: light skin tone
517+1F9D1 1F3FC ; fully-qualified # ๐Ÿง‘๐Ÿผ person: medium-light skin tone
518+1F9D1 1F3FD ; fully-qualified # ๐Ÿง‘๐Ÿฝ person: medium skin tone
519+1F9D1 1F3FE ; fully-qualified # ๐Ÿง‘๐Ÿพ person: medium-dark skin tone
520+1F9D1 1F3FF ; fully-qualified # ๐Ÿง‘๐Ÿฟ person: dark skin tone
521+1F471 ; fully-qualified # ๐Ÿ‘ฑ person: blond hair
522+1F471 1F3FB ; fully-qualified # ๐Ÿ‘ฑ๐Ÿป person: light skin tone, blond hair
523+1F471 1F3FC ; fully-qualified # ๐Ÿ‘ฑ๐Ÿผ person: medium-light skin tone, blond hair
524+1F471 1F3FD ; fully-qualified # ๐Ÿ‘ฑ๐Ÿฝ person: medium skin tone, blond hair
525+1F471 1F3FE ; fully-qualified # ๐Ÿ‘ฑ๐Ÿพ person: medium-dark skin tone, blond hair
526+1F471 1F3FF ; fully-qualified # ๐Ÿ‘ฑ๐Ÿฟ person: dark skin tone, blond hair
527+1F468 ; fully-qualified # ๐Ÿ‘จ man
528+1F468 1F3FB ; fully-qualified # ๐Ÿ‘จ๐Ÿป man: light skin tone
529+1F468 1F3FC ; fully-qualified # ๐Ÿ‘จ๐Ÿผ man: medium-light skin tone
530+1F468 1F3FD ; fully-qualified # ๐Ÿ‘จ๐Ÿฝ man: medium skin tone
531+1F468 1F3FE ; fully-qualified # ๐Ÿ‘จ๐Ÿพ man: medium-dark skin tone
532+1F468 1F3FF ; fully-qualified # ๐Ÿ‘จ๐Ÿฟ man: dark skin tone
533+1F9D4 ; fully-qualified # ๐Ÿง” man: beard
534+1F9D4 1F3FB ; fully-qualified # ๐Ÿง”๐Ÿป man: light skin tone, beard
535+1F9D4 1F3FC ; fully-qualified # ๐Ÿง”๐Ÿผ man: medium-light skin tone, beard
536+1F9D4 1F3FD ; fully-qualified # ๐Ÿง”๐Ÿฝ man: medium skin tone, beard
537+1F9D4 1F3FE ; fully-qualified # ๐Ÿง”๐Ÿพ man: medium-dark skin tone, beard
538+1F9D4 1F3FF ; fully-qualified # ๐Ÿง”๐Ÿฟ man: dark skin tone, beard
539+1F471 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฑโ€โ™‚๏ธ man: blond hair
540+1F471 200D 2642 ; minimally-qualified # ๐Ÿ‘ฑโ€โ™‚ man: blond hair
541+1F471 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿปโ€โ™‚๏ธ man: light skin tone, blond hair
542+1F471 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ‘ฑ๐Ÿปโ€โ™‚ man: light skin tone, blond hair
543+1F471 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿผโ€โ™‚๏ธ man: medium-light skin tone, blond hair
544+1F471 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ‘ฑ๐Ÿผโ€โ™‚ man: medium-light skin tone, blond hair
545+1F471 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿฝโ€โ™‚๏ธ man: medium skin tone, blond hair
546+1F471 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ‘ฑ๐Ÿฝโ€โ™‚ man: medium skin tone, blond hair
547+1F471 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿพโ€โ™‚๏ธ man: medium-dark skin tone, blond hair
548+1F471 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ‘ฑ๐Ÿพโ€โ™‚ man: medium-dark skin tone, blond hair
549+1F471 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿฟโ€โ™‚๏ธ man: dark skin tone, blond hair
550+1F471 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ‘ฑ๐Ÿฟโ€โ™‚ man: dark skin tone, blond hair
551+1F468 200D 1F9B0 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿฆฐ man: red hair
552+1F468 1F3FB 200D 1F9B0 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฐ man: light skin tone, red hair
553+1F468 1F3FC 200D 1F9B0 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฐ man: medium-light skin tone, red hair
554+1F468 1F3FD 200D 1F9B0 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฐ man: medium skin tone, red hair
555+1F468 1F3FE 200D 1F9B0 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฐ man: medium-dark skin tone, red hair
556+1F468 1F3FF 200D 1F9B0 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฐ man: dark skin tone, red hair
557+1F468 200D 1F9B1 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿฆฑ man: curly hair
558+1F468 1F3FB 200D 1F9B1 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฑ man: light skin tone, curly hair
559+1F468 1F3FC 200D 1F9B1 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฑ man: medium-light skin tone, curly hair
560+1F468 1F3FD 200D 1F9B1 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฑ man: medium skin tone, curly hair
561+1F468 1F3FE 200D 1F9B1 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฑ man: medium-dark skin tone, curly hair
562+1F468 1F3FF 200D 1F9B1 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฑ man: dark skin tone, curly hair
563+1F468 200D 1F9B3 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿฆณ man: white hair
564+1F468 1F3FB 200D 1F9B3 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿฆณ man: light skin tone, white hair
565+1F468 1F3FC 200D 1F9B3 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿฆณ man: medium-light skin tone, white hair
566+1F468 1F3FD 200D 1F9B3 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆณ man: medium skin tone, white hair
567+1F468 1F3FE 200D 1F9B3 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿฆณ man: medium-dark skin tone, white hair
568+1F468 1F3FF 200D 1F9B3 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆณ man: dark skin tone, white hair
569+1F468 200D 1F9B2 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿฆฒ man: bald
570+1F468 1F3FB 200D 1F9B2 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฒ man: light skin tone, bald
571+1F468 1F3FC 200D 1F9B2 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฒ man: medium-light skin tone, bald
572+1F468 1F3FD 200D 1F9B2 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฒ man: medium skin tone, bald
573+1F468 1F3FE 200D 1F9B2 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฒ man: medium-dark skin tone, bald
574+1F468 1F3FF 200D 1F9B2 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฒ man: dark skin tone, bald
575+1F469 ; fully-qualified # ๐Ÿ‘ฉ woman
576+1F469 1F3FB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿป woman: light skin tone
577+1F469 1F3FC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผ woman: medium-light skin tone
578+1F469 1F3FD ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝ woman: medium skin tone
579+1F469 1F3FE ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพ woman: medium-dark skin tone
580+1F469 1F3FF ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟ woman: dark skin tone
581+1F471 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฑโ€โ™€๏ธ woman: blond hair
582+1F471 200D 2640 ; minimally-qualified # ๐Ÿ‘ฑโ€โ™€ woman: blond hair
583+1F471 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿปโ€โ™€๏ธ woman: light skin tone, blond hair
584+1F471 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ‘ฑ๐Ÿปโ€โ™€ woman: light skin tone, blond hair
585+1F471 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿผโ€โ™€๏ธ woman: medium-light skin tone, blond hair
586+1F471 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ‘ฑ๐Ÿผโ€โ™€ woman: medium-light skin tone, blond hair
587+1F471 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿฝโ€โ™€๏ธ woman: medium skin tone, blond hair
588+1F471 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ‘ฑ๐Ÿฝโ€โ™€ woman: medium skin tone, blond hair
589+1F471 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿพโ€โ™€๏ธ woman: medium-dark skin tone, blond hair
590+1F471 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ‘ฑ๐Ÿพโ€โ™€ woman: medium-dark skin tone, blond hair
591+1F471 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿฟโ€โ™€๏ธ woman: dark skin tone, blond hair
592+1F471 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ‘ฑ๐Ÿฟโ€โ™€ woman: dark skin tone, blond hair
593+1F469 200D 1F9B0 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿฆฐ woman: red hair
594+1F469 1F3FB 200D 1F9B0 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฐ woman: light skin tone, red hair
595+1F469 1F3FC 200D 1F9B0 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฐ woman: medium-light skin tone, red hair
596+1F469 1F3FD 200D 1F9B0 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฐ woman: medium skin tone, red hair
597+1F469 1F3FE 200D 1F9B0 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฐ woman: medium-dark skin tone, red hair
598+1F469 1F3FF 200D 1F9B0 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฐ woman: dark skin tone, red hair
599+1F469 200D 1F9B1 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿฆฑ woman: curly hair
600+1F469 1F3FB 200D 1F9B1 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฑ woman: light skin tone, curly hair
601+1F469 1F3FC 200D 1F9B1 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฑ woman: medium-light skin tone, curly hair
602+1F469 1F3FD 200D 1F9B1 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฑ woman: medium skin tone, curly hair
603+1F469 1F3FE 200D 1F9B1 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฑ woman: medium-dark skin tone, curly hair
604+1F469 1F3FF 200D 1F9B1 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฑ woman: dark skin tone, curly hair
605+1F469 200D 1F9B3 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿฆณ woman: white hair
606+1F469 1F3FB 200D 1F9B3 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆณ woman: light skin tone, white hair
607+1F469 1F3FC 200D 1F9B3 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆณ woman: medium-light skin tone, white hair
608+1F469 1F3FD 200D 1F9B3 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆณ woman: medium skin tone, white hair
609+1F469 1F3FE 200D 1F9B3 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆณ woman: medium-dark skin tone, white hair
610+1F469 1F3FF 200D 1F9B3 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆณ woman: dark skin tone, white hair
611+1F469 200D 1F9B2 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿฆฒ woman: bald
612+1F469 1F3FB 200D 1F9B2 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฒ woman: light skin tone, bald
613+1F469 1F3FC 200D 1F9B2 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฒ woman: medium-light skin tone, bald
614+1F469 1F3FD 200D 1F9B2 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฒ woman: medium skin tone, bald
615+1F469 1F3FE 200D 1F9B2 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฒ woman: medium-dark skin tone, bald
616+1F469 1F3FF 200D 1F9B2 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฒ woman: dark skin tone, bald
617+1F9D3 ; fully-qualified # ๐Ÿง“ older person
618+1F9D3 1F3FB ; fully-qualified # ๐Ÿง“๐Ÿป older person: light skin tone
619+1F9D3 1F3FC ; fully-qualified # ๐Ÿง“๐Ÿผ older person: medium-light skin tone
620+1F9D3 1F3FD ; fully-qualified # ๐Ÿง“๐Ÿฝ older person: medium skin tone
621+1F9D3 1F3FE ; fully-qualified # ๐Ÿง“๐Ÿพ older person: medium-dark skin tone
622+1F9D3 1F3FF ; fully-qualified # ๐Ÿง“๐Ÿฟ older person: dark skin tone
623+1F474 ; fully-qualified # ๐Ÿ‘ด old man
624+1F474 1F3FB ; fully-qualified # ๐Ÿ‘ด๐Ÿป old man: light skin tone
625+1F474 1F3FC ; fully-qualified # ๐Ÿ‘ด๐Ÿผ old man: medium-light skin tone
626+1F474 1F3FD ; fully-qualified # ๐Ÿ‘ด๐Ÿฝ old man: medium skin tone
627+1F474 1F3FE ; fully-qualified # ๐Ÿ‘ด๐Ÿพ old man: medium-dark skin tone
628+1F474 1F3FF ; fully-qualified # ๐Ÿ‘ด๐Ÿฟ old man: dark skin tone
629+1F475 ; fully-qualified # ๐Ÿ‘ต old woman
630+1F475 1F3FB ; fully-qualified # ๐Ÿ‘ต๐Ÿป old woman: light skin tone
631+1F475 1F3FC ; fully-qualified # ๐Ÿ‘ต๐Ÿผ old woman: medium-light skin tone
632+1F475 1F3FD ; fully-qualified # ๐Ÿ‘ต๐Ÿฝ old woman: medium skin tone
633+1F475 1F3FE ; fully-qualified # ๐Ÿ‘ต๐Ÿพ old woman: medium-dark skin tone
634+1F475 1F3FF ; fully-qualified # ๐Ÿ‘ต๐Ÿฟ old woman: dark skin tone
635+
636+# subgroup: person-gesture
637+1F64D ; fully-qualified # ๐Ÿ™ person frowning
638+1F64D 1F3FB ; fully-qualified # ๐Ÿ™๐Ÿป person frowning: light skin tone
639+1F64D 1F3FC ; fully-qualified # ๐Ÿ™๐Ÿผ person frowning: medium-light skin tone
640+1F64D 1F3FD ; fully-qualified # ๐Ÿ™๐Ÿฝ person frowning: medium skin tone
641+1F64D 1F3FE ; fully-qualified # ๐Ÿ™๐Ÿพ person frowning: medium-dark skin tone
642+1F64D 1F3FF ; fully-qualified # ๐Ÿ™๐Ÿฟ person frowning: dark skin tone
643+1F64D 200D 2642 FE0F ; fully-qualified # ๐Ÿ™โ€โ™‚๏ธ man frowning
644+1F64D 200D 2642 ; minimally-qualified # ๐Ÿ™โ€โ™‚ man frowning
645+1F64D 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ™๐Ÿปโ€โ™‚๏ธ man frowning: light skin tone
646+1F64D 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ™๐Ÿปโ€โ™‚ man frowning: light skin tone
647+1F64D 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ™๐Ÿผโ€โ™‚๏ธ man frowning: medium-light skin tone
648+1F64D 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ™๐Ÿผโ€โ™‚ man frowning: medium-light skin tone
649+1F64D 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ™๐Ÿฝโ€โ™‚๏ธ man frowning: medium skin tone
650+1F64D 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ™๐Ÿฝโ€โ™‚ man frowning: medium skin tone
651+1F64D 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ™๐Ÿพโ€โ™‚๏ธ man frowning: medium-dark skin tone
652+1F64D 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ™๐Ÿพโ€โ™‚ man frowning: medium-dark skin tone
653+1F64D 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ™๐Ÿฟโ€โ™‚๏ธ man frowning: dark skin tone
654+1F64D 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ™๐Ÿฟโ€โ™‚ man frowning: dark skin tone
655+1F64D 200D 2640 FE0F ; fully-qualified # ๐Ÿ™โ€โ™€๏ธ woman frowning
656+1F64D 200D 2640 ; minimally-qualified # ๐Ÿ™โ€โ™€ woman frowning
657+1F64D 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ™๐Ÿปโ€โ™€๏ธ woman frowning: light skin tone
658+1F64D 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ™๐Ÿปโ€โ™€ woman frowning: light skin tone
659+1F64D 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ™๐Ÿผโ€โ™€๏ธ woman frowning: medium-light skin tone
660+1F64D 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ™๐Ÿผโ€โ™€ woman frowning: medium-light skin tone
661+1F64D 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ™๐Ÿฝโ€โ™€๏ธ woman frowning: medium skin tone
662+1F64D 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ™๐Ÿฝโ€โ™€ woman frowning: medium skin tone
663+1F64D 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ™๐Ÿพโ€โ™€๏ธ woman frowning: medium-dark skin tone
664+1F64D 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ™๐Ÿพโ€โ™€ woman frowning: medium-dark skin tone
665+1F64D 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ™๐Ÿฟโ€โ™€๏ธ woman frowning: dark skin tone
666+1F64D 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ™๐Ÿฟโ€โ™€ woman frowning: dark skin tone
667+1F64E ; fully-qualified # ๐Ÿ™Ž person pouting
668+1F64E 1F3FB ; fully-qualified # ๐Ÿ™Ž๐Ÿป person pouting: light skin tone
669+1F64E 1F3FC ; fully-qualified # ๐Ÿ™Ž๐Ÿผ person pouting: medium-light skin tone
670+1F64E 1F3FD ; fully-qualified # ๐Ÿ™Ž๐Ÿฝ person pouting: medium skin tone
671+1F64E 1F3FE ; fully-qualified # ๐Ÿ™Ž๐Ÿพ person pouting: medium-dark skin tone
672+1F64E 1F3FF ; fully-qualified # ๐Ÿ™Ž๐Ÿฟ person pouting: dark skin tone
673+1F64E 200D 2642 FE0F ; fully-qualified # ๐Ÿ™Žโ€โ™‚๏ธ man pouting
674+1F64E 200D 2642 ; minimally-qualified # ๐Ÿ™Žโ€โ™‚ man pouting
675+1F64E 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿปโ€โ™‚๏ธ man pouting: light skin tone
676+1F64E 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ™Ž๐Ÿปโ€โ™‚ man pouting: light skin tone
677+1F64E 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿผโ€โ™‚๏ธ man pouting: medium-light skin tone
678+1F64E 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ™Ž๐Ÿผโ€โ™‚ man pouting: medium-light skin tone
679+1F64E 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿฝโ€โ™‚๏ธ man pouting: medium skin tone
680+1F64E 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ™Ž๐Ÿฝโ€โ™‚ man pouting: medium skin tone
681+1F64E 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿพโ€โ™‚๏ธ man pouting: medium-dark skin tone
682+1F64E 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ™Ž๐Ÿพโ€โ™‚ man pouting: medium-dark skin tone
683+1F64E 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿฟโ€โ™‚๏ธ man pouting: dark skin tone
684+1F64E 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ™Ž๐Ÿฟโ€โ™‚ man pouting: dark skin tone
685+1F64E 200D 2640 FE0F ; fully-qualified # ๐Ÿ™Žโ€โ™€๏ธ woman pouting
686+1F64E 200D 2640 ; minimally-qualified # ๐Ÿ™Žโ€โ™€ woman pouting
687+1F64E 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿปโ€โ™€๏ธ woman pouting: light skin tone
688+1F64E 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ™Ž๐Ÿปโ€โ™€ woman pouting: light skin tone
689+1F64E 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿผโ€โ™€๏ธ woman pouting: medium-light skin tone
690+1F64E 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ™Ž๐Ÿผโ€โ™€ woman pouting: medium-light skin tone
691+1F64E 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿฝโ€โ™€๏ธ woman pouting: medium skin tone
692+1F64E 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ™Ž๐Ÿฝโ€โ™€ woman pouting: medium skin tone
693+1F64E 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿพโ€โ™€๏ธ woman pouting: medium-dark skin tone
694+1F64E 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ™Ž๐Ÿพโ€โ™€ woman pouting: medium-dark skin tone
695+1F64E 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿฟโ€โ™€๏ธ woman pouting: dark skin tone
696+1F64E 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ™Ž๐Ÿฟโ€โ™€ woman pouting: dark skin tone
697+1F645 ; fully-qualified # ๐Ÿ™… person gesturing NO
698+1F645 1F3FB ; fully-qualified # ๐Ÿ™…๐Ÿป person gesturing NO: light skin tone
699+1F645 1F3FC ; fully-qualified # ๐Ÿ™…๐Ÿผ person gesturing NO: medium-light skin tone
700+1F645 1F3FD ; fully-qualified # ๐Ÿ™…๐Ÿฝ person gesturing NO: medium skin tone
701+1F645 1F3FE ; fully-qualified # ๐Ÿ™…๐Ÿพ person gesturing NO: medium-dark skin tone
702+1F645 1F3FF ; fully-qualified # ๐Ÿ™…๐Ÿฟ person gesturing NO: dark skin tone
703+1F645 200D 2642 FE0F ; fully-qualified # ๐Ÿ™…โ€โ™‚๏ธ man gesturing NO
704+1F645 200D 2642 ; minimally-qualified # ๐Ÿ™…โ€โ™‚ man gesturing NO
705+1F645 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿปโ€โ™‚๏ธ man gesturing NO: light skin tone
706+1F645 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ™…๐Ÿปโ€โ™‚ man gesturing NO: light skin tone
707+1F645 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿผโ€โ™‚๏ธ man gesturing NO: medium-light skin tone
708+1F645 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ™…๐Ÿผโ€โ™‚ man gesturing NO: medium-light skin tone
709+1F645 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿฝโ€โ™‚๏ธ man gesturing NO: medium skin tone
710+1F645 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ™…๐Ÿฝโ€โ™‚ man gesturing NO: medium skin tone
711+1F645 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿพโ€โ™‚๏ธ man gesturing NO: medium-dark skin tone
712+1F645 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ™…๐Ÿพโ€โ™‚ man gesturing NO: medium-dark skin tone
713+1F645 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿฟโ€โ™‚๏ธ man gesturing NO: dark skin tone
714+1F645 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ™…๐Ÿฟโ€โ™‚ man gesturing NO: dark skin tone
715+1F645 200D 2640 FE0F ; fully-qualified # ๐Ÿ™…โ€โ™€๏ธ woman gesturing NO
716+1F645 200D 2640 ; minimally-qualified # ๐Ÿ™…โ€โ™€ woman gesturing NO
717+1F645 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿปโ€โ™€๏ธ woman gesturing NO: light skin tone
718+1F645 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ™…๐Ÿปโ€โ™€ woman gesturing NO: light skin tone
719+1F645 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿผโ€โ™€๏ธ woman gesturing NO: medium-light skin tone
720+1F645 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ™…๐Ÿผโ€โ™€ woman gesturing NO: medium-light skin tone
721+1F645 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿฝโ€โ™€๏ธ woman gesturing NO: medium skin tone
722+1F645 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ™…๐Ÿฝโ€โ™€ woman gesturing NO: medium skin tone
723+1F645 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿพโ€โ™€๏ธ woman gesturing NO: medium-dark skin tone
724+1F645 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ™…๐Ÿพโ€โ™€ woman gesturing NO: medium-dark skin tone
725+1F645 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿฟโ€โ™€๏ธ woman gesturing NO: dark skin tone
726+1F645 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ™…๐Ÿฟโ€โ™€ woman gesturing NO: dark skin tone
727+1F646 ; fully-qualified # ๐Ÿ™† person gesturing OK
728+1F646 1F3FB ; fully-qualified # ๐Ÿ™†๐Ÿป person gesturing OK: light skin tone
729+1F646 1F3FC ; fully-qualified # ๐Ÿ™†๐Ÿผ person gesturing OK: medium-light skin tone
730+1F646 1F3FD ; fully-qualified # ๐Ÿ™†๐Ÿฝ person gesturing OK: medium skin tone
731+1F646 1F3FE ; fully-qualified # ๐Ÿ™†๐Ÿพ person gesturing OK: medium-dark skin tone
732+1F646 1F3FF ; fully-qualified # ๐Ÿ™†๐Ÿฟ person gesturing OK: dark skin tone
733+1F646 200D 2642 FE0F ; fully-qualified # ๐Ÿ™†โ€โ™‚๏ธ man gesturing OK
734+1F646 200D 2642 ; minimally-qualified # ๐Ÿ™†โ€โ™‚ man gesturing OK
735+1F646 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿปโ€โ™‚๏ธ man gesturing OK: light skin tone
736+1F646 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ™†๐Ÿปโ€โ™‚ man gesturing OK: light skin tone
737+1F646 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿผโ€โ™‚๏ธ man gesturing OK: medium-light skin tone
738+1F646 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ™†๐Ÿผโ€โ™‚ man gesturing OK: medium-light skin tone
739+1F646 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿฝโ€โ™‚๏ธ man gesturing OK: medium skin tone
740+1F646 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ™†๐Ÿฝโ€โ™‚ man gesturing OK: medium skin tone
741+1F646 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿพโ€โ™‚๏ธ man gesturing OK: medium-dark skin tone
742+1F646 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ™†๐Ÿพโ€โ™‚ man gesturing OK: medium-dark skin tone
743+1F646 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿฟโ€โ™‚๏ธ man gesturing OK: dark skin tone
744+1F646 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ™†๐Ÿฟโ€โ™‚ man gesturing OK: dark skin tone
745+1F646 200D 2640 FE0F ; fully-qualified # ๐Ÿ™†โ€โ™€๏ธ woman gesturing OK
746+1F646 200D 2640 ; minimally-qualified # ๐Ÿ™†โ€โ™€ woman gesturing OK
747+1F646 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿปโ€โ™€๏ธ woman gesturing OK: light skin tone
748+1F646 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ™†๐Ÿปโ€โ™€ woman gesturing OK: light skin tone
749+1F646 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿผโ€โ™€๏ธ woman gesturing OK: medium-light skin tone
750+1F646 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ™†๐Ÿผโ€โ™€ woman gesturing OK: medium-light skin tone
751+1F646 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿฝโ€โ™€๏ธ woman gesturing OK: medium skin tone
752+1F646 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ™†๐Ÿฝโ€โ™€ woman gesturing OK: medium skin tone
753+1F646 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿพโ€โ™€๏ธ woman gesturing OK: medium-dark skin tone
754+1F646 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ™†๐Ÿพโ€โ™€ woman gesturing OK: medium-dark skin tone
755+1F646 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿฟโ€โ™€๏ธ woman gesturing OK: dark skin tone
756+1F646 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ™†๐Ÿฟโ€โ™€ woman gesturing OK: dark skin tone
757+1F481 ; fully-qualified # ๐Ÿ’ person tipping hand
758+1F481 1F3FB ; fully-qualified # ๐Ÿ’๐Ÿป person tipping hand: light skin tone
759+1F481 1F3FC ; fully-qualified # ๐Ÿ’๐Ÿผ person tipping hand: medium-light skin tone
760+1F481 1F3FD ; fully-qualified # ๐Ÿ’๐Ÿฝ person tipping hand: medium skin tone
761+1F481 1F3FE ; fully-qualified # ๐Ÿ’๐Ÿพ person tipping hand: medium-dark skin tone
762+1F481 1F3FF ; fully-qualified # ๐Ÿ’๐Ÿฟ person tipping hand: dark skin tone
763+1F481 200D 2642 FE0F ; fully-qualified # ๐Ÿ’โ€โ™‚๏ธ man tipping hand
764+1F481 200D 2642 ; minimally-qualified # ๐Ÿ’โ€โ™‚ man tipping hand
765+1F481 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ’๐Ÿปโ€โ™‚๏ธ man tipping hand: light skin tone
766+1F481 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ’๐Ÿปโ€โ™‚ man tipping hand: light skin tone
767+1F481 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ’๐Ÿผโ€โ™‚๏ธ man tipping hand: medium-light skin tone
768+1F481 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ’๐Ÿผโ€โ™‚ man tipping hand: medium-light skin tone
769+1F481 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ’๐Ÿฝโ€โ™‚๏ธ man tipping hand: medium skin tone
770+1F481 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ’๐Ÿฝโ€โ™‚ man tipping hand: medium skin tone
771+1F481 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ’๐Ÿพโ€โ™‚๏ธ man tipping hand: medium-dark skin tone
772+1F481 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ’๐Ÿพโ€โ™‚ man tipping hand: medium-dark skin tone
773+1F481 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ’๐Ÿฟโ€โ™‚๏ธ man tipping hand: dark skin tone
774+1F481 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ’๐Ÿฟโ€โ™‚ man tipping hand: dark skin tone
775+1F481 200D 2640 FE0F ; fully-qualified # ๐Ÿ’โ€โ™€๏ธ woman tipping hand
776+1F481 200D 2640 ; minimally-qualified # ๐Ÿ’โ€โ™€ woman tipping hand
777+1F481 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ’๐Ÿปโ€โ™€๏ธ woman tipping hand: light skin tone
778+1F481 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ’๐Ÿปโ€โ™€ woman tipping hand: light skin tone
779+1F481 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ’๐Ÿผโ€โ™€๏ธ woman tipping hand: medium-light skin tone
780+1F481 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ’๐Ÿผโ€โ™€ woman tipping hand: medium-light skin tone
781+1F481 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ’๐Ÿฝโ€โ™€๏ธ woman tipping hand: medium skin tone
782+1F481 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ’๐Ÿฝโ€โ™€ woman tipping hand: medium skin tone
783+1F481 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ’๐Ÿพโ€โ™€๏ธ woman tipping hand: medium-dark skin tone
784+1F481 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ’๐Ÿพโ€โ™€ woman tipping hand: medium-dark skin tone
785+1F481 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ’๐Ÿฟโ€โ™€๏ธ woman tipping hand: dark skin tone
786+1F481 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ’๐Ÿฟโ€โ™€ woman tipping hand: dark skin tone
787+1F64B ; fully-qualified # ๐Ÿ™‹ person raising hand
788+1F64B 1F3FB ; fully-qualified # ๐Ÿ™‹๐Ÿป person raising hand: light skin tone
789+1F64B 1F3FC ; fully-qualified # ๐Ÿ™‹๐Ÿผ person raising hand: medium-light skin tone
790+1F64B 1F3FD ; fully-qualified # ๐Ÿ™‹๐Ÿฝ person raising hand: medium skin tone
791+1F64B 1F3FE ; fully-qualified # ๐Ÿ™‹๐Ÿพ person raising hand: medium-dark skin tone
792+1F64B 1F3FF ; fully-qualified # ๐Ÿ™‹๐Ÿฟ person raising hand: dark skin tone
793+1F64B 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‹โ€โ™‚๏ธ man raising hand
794+1F64B 200D 2642 ; minimally-qualified # ๐Ÿ™‹โ€โ™‚ man raising hand
795+1F64B 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿปโ€โ™‚๏ธ man raising hand: light skin tone
796+1F64B 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ™‹๐Ÿปโ€โ™‚ man raising hand: light skin tone
797+1F64B 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿผโ€โ™‚๏ธ man raising hand: medium-light skin tone
798+1F64B 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ™‹๐Ÿผโ€โ™‚ man raising hand: medium-light skin tone
799+1F64B 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿฝโ€โ™‚๏ธ man raising hand: medium skin tone
800+1F64B 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ™‹๐Ÿฝโ€โ™‚ man raising hand: medium skin tone
801+1F64B 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿพโ€โ™‚๏ธ man raising hand: medium-dark skin tone
802+1F64B 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ™‹๐Ÿพโ€โ™‚ man raising hand: medium-dark skin tone
803+1F64B 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿฟโ€โ™‚๏ธ man raising hand: dark skin tone
804+1F64B 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ™‹๐Ÿฟโ€โ™‚ man raising hand: dark skin tone
805+1F64B 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‹โ€โ™€๏ธ woman raising hand
806+1F64B 200D 2640 ; minimally-qualified # ๐Ÿ™‹โ€โ™€ woman raising hand
807+1F64B 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿปโ€โ™€๏ธ woman raising hand: light skin tone
808+1F64B 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ™‹๐Ÿปโ€โ™€ woman raising hand: light skin tone
809+1F64B 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿผโ€โ™€๏ธ woman raising hand: medium-light skin tone
810+1F64B 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ™‹๐Ÿผโ€โ™€ woman raising hand: medium-light skin tone
811+1F64B 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿฝโ€โ™€๏ธ woman raising hand: medium skin tone
812+1F64B 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ™‹๐Ÿฝโ€โ™€ woman raising hand: medium skin tone
813+1F64B 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿพโ€โ™€๏ธ woman raising hand: medium-dark skin tone
814+1F64B 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ™‹๐Ÿพโ€โ™€ woman raising hand: medium-dark skin tone
815+1F64B 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿฟโ€โ™€๏ธ woman raising hand: dark skin tone
816+1F64B 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ™‹๐Ÿฟโ€โ™€ woman raising hand: dark skin tone
817+1F9CF ; fully-qualified # ๐Ÿง deaf person
818+1F9CF 1F3FB ; fully-qualified # ๐Ÿง๐Ÿป deaf person: light skin tone
819+1F9CF 1F3FC ; fully-qualified # ๐Ÿง๐Ÿผ deaf person: medium-light skin tone
820+1F9CF 1F3FD ; fully-qualified # ๐Ÿง๐Ÿฝ deaf person: medium skin tone
821+1F9CF 1F3FE ; fully-qualified # ๐Ÿง๐Ÿพ deaf person: medium-dark skin tone
822+1F9CF 1F3FF ; fully-qualified # ๐Ÿง๐Ÿฟ deaf person: dark skin tone
823+1F9CF 200D 2642 FE0F ; fully-qualified # ๐Ÿงโ€โ™‚๏ธ deaf man
824+1F9CF 200D 2642 ; minimally-qualified # ๐Ÿงโ€โ™‚ deaf man
825+1F9CF 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿปโ€โ™‚๏ธ deaf man: light skin tone
826+1F9CF 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿปโ€โ™‚ deaf man: light skin tone
827+1F9CF 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿผโ€โ™‚๏ธ deaf man: medium-light skin tone
828+1F9CF 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿผโ€โ™‚ deaf man: medium-light skin tone
829+1F9CF 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿฝโ€โ™‚๏ธ deaf man: medium skin tone
830+1F9CF 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿฝโ€โ™‚ deaf man: medium skin tone
831+1F9CF 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿพโ€โ™‚๏ธ deaf man: medium-dark skin tone
832+1F9CF 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿพโ€โ™‚ deaf man: medium-dark skin tone
833+1F9CF 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿฟโ€โ™‚๏ธ deaf man: dark skin tone
834+1F9CF 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿฟโ€โ™‚ deaf man: dark skin tone
835+1F9CF 200D 2640 FE0F ; fully-qualified # ๐Ÿงโ€โ™€๏ธ deaf woman
836+1F9CF 200D 2640 ; minimally-qualified # ๐Ÿงโ€โ™€ deaf woman
837+1F9CF 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿปโ€โ™€๏ธ deaf woman: light skin tone
838+1F9CF 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿปโ€โ™€ deaf woman: light skin tone
839+1F9CF 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿผโ€โ™€๏ธ deaf woman: medium-light skin tone
840+1F9CF 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿผโ€โ™€ deaf woman: medium-light skin tone
841+1F9CF 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿฝโ€โ™€๏ธ deaf woman: medium skin tone
842+1F9CF 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿฝโ€โ™€ deaf woman: medium skin tone
843+1F9CF 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿพโ€โ™€๏ธ deaf woman: medium-dark skin tone
844+1F9CF 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿพโ€โ™€ deaf woman: medium-dark skin tone
845+1F9CF 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿฟโ€โ™€๏ธ deaf woman: dark skin tone
846+1F9CF 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿฟโ€โ™€ deaf woman: dark skin tone
847+1F647 ; fully-qualified # ๐Ÿ™‡ person bowing
848+1F647 1F3FB ; fully-qualified # ๐Ÿ™‡๐Ÿป person bowing: light skin tone
849+1F647 1F3FC ; fully-qualified # ๐Ÿ™‡๐Ÿผ person bowing: medium-light skin tone
850+1F647 1F3FD ; fully-qualified # ๐Ÿ™‡๐Ÿฝ person bowing: medium skin tone
851+1F647 1F3FE ; fully-qualified # ๐Ÿ™‡๐Ÿพ person bowing: medium-dark skin tone
852+1F647 1F3FF ; fully-qualified # ๐Ÿ™‡๐Ÿฟ person bowing: dark skin tone
853+1F647 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‡โ€โ™‚๏ธ man bowing
854+1F647 200D 2642 ; minimally-qualified # ๐Ÿ™‡โ€โ™‚ man bowing
855+1F647 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿปโ€โ™‚๏ธ man bowing: light skin tone
856+1F647 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ™‡๐Ÿปโ€โ™‚ man bowing: light skin tone
857+1F647 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿผโ€โ™‚๏ธ man bowing: medium-light skin tone
858+1F647 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ™‡๐Ÿผโ€โ™‚ man bowing: medium-light skin tone
859+1F647 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿฝโ€โ™‚๏ธ man bowing: medium skin tone
860+1F647 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ™‡๐Ÿฝโ€โ™‚ man bowing: medium skin tone
861+1F647 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿพโ€โ™‚๏ธ man bowing: medium-dark skin tone
862+1F647 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ™‡๐Ÿพโ€โ™‚ man bowing: medium-dark skin tone
863+1F647 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿฟโ€โ™‚๏ธ man bowing: dark skin tone
864+1F647 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ™‡๐Ÿฟโ€โ™‚ man bowing: dark skin tone
865+1F647 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‡โ€โ™€๏ธ woman bowing
866+1F647 200D 2640 ; minimally-qualified # ๐Ÿ™‡โ€โ™€ woman bowing
867+1F647 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿปโ€โ™€๏ธ woman bowing: light skin tone
868+1F647 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ™‡๐Ÿปโ€โ™€ woman bowing: light skin tone
869+1F647 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿผโ€โ™€๏ธ woman bowing: medium-light skin tone
870+1F647 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ™‡๐Ÿผโ€โ™€ woman bowing: medium-light skin tone
871+1F647 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿฝโ€โ™€๏ธ woman bowing: medium skin tone
872+1F647 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ™‡๐Ÿฝโ€โ™€ woman bowing: medium skin tone
873+1F647 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿพโ€โ™€๏ธ woman bowing: medium-dark skin tone
874+1F647 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ™‡๐Ÿพโ€โ™€ woman bowing: medium-dark skin tone
875+1F647 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿฟโ€โ™€๏ธ woman bowing: dark skin tone
876+1F647 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ™‡๐Ÿฟโ€โ™€ woman bowing: dark skin tone
877+1F926 ; fully-qualified # ๐Ÿคฆ person facepalming
878+1F926 1F3FB ; fully-qualified # ๐Ÿคฆ๐Ÿป person facepalming: light skin tone
879+1F926 1F3FC ; fully-qualified # ๐Ÿคฆ๐Ÿผ person facepalming: medium-light skin tone
880+1F926 1F3FD ; fully-qualified # ๐Ÿคฆ๐Ÿฝ person facepalming: medium skin tone
881+1F926 1F3FE ; fully-qualified # ๐Ÿคฆ๐Ÿพ person facepalming: medium-dark skin tone
882+1F926 1F3FF ; fully-qualified # ๐Ÿคฆ๐Ÿฟ person facepalming: dark skin tone
883+1F926 200D 2642 FE0F ; fully-qualified # ๐Ÿคฆโ€โ™‚๏ธ man facepalming
884+1F926 200D 2642 ; minimally-qualified # ๐Ÿคฆโ€โ™‚ man facepalming
885+1F926 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿปโ€โ™‚๏ธ man facepalming: light skin tone
886+1F926 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿคฆ๐Ÿปโ€โ™‚ man facepalming: light skin tone
887+1F926 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿผโ€โ™‚๏ธ man facepalming: medium-light skin tone
888+1F926 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿคฆ๐Ÿผโ€โ™‚ man facepalming: medium-light skin tone
889+1F926 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿฝโ€โ™‚๏ธ man facepalming: medium skin tone
890+1F926 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿคฆ๐Ÿฝโ€โ™‚ man facepalming: medium skin tone
891+1F926 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿพโ€โ™‚๏ธ man facepalming: medium-dark skin tone
892+1F926 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿคฆ๐Ÿพโ€โ™‚ man facepalming: medium-dark skin tone
893+1F926 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿฟโ€โ™‚๏ธ man facepalming: dark skin tone
894+1F926 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿคฆ๐Ÿฟโ€โ™‚ man facepalming: dark skin tone
895+1F926 200D 2640 FE0F ; fully-qualified # ๐Ÿคฆโ€โ™€๏ธ woman facepalming
896+1F926 200D 2640 ; minimally-qualified # ๐Ÿคฆโ€โ™€ woman facepalming
897+1F926 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿปโ€โ™€๏ธ woman facepalming: light skin tone
898+1F926 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿคฆ๐Ÿปโ€โ™€ woman facepalming: light skin tone
899+1F926 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿผโ€โ™€๏ธ woman facepalming: medium-light skin tone
900+1F926 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿคฆ๐Ÿผโ€โ™€ woman facepalming: medium-light skin tone
901+1F926 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿฝโ€โ™€๏ธ woman facepalming: medium skin tone
902+1F926 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿคฆ๐Ÿฝโ€โ™€ woman facepalming: medium skin tone
903+1F926 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿพโ€โ™€๏ธ woman facepalming: medium-dark skin tone
904+1F926 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿคฆ๐Ÿพโ€โ™€ woman facepalming: medium-dark skin tone
905+1F926 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿฟโ€โ™€๏ธ woman facepalming: dark skin tone
906+1F926 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿคฆ๐Ÿฟโ€โ™€ woman facepalming: dark skin tone
907+1F937 ; fully-qualified # ๐Ÿคท person shrugging
908+1F937 1F3FB ; fully-qualified # ๐Ÿคท๐Ÿป person shrugging: light skin tone
909+1F937 1F3FC ; fully-qualified # ๐Ÿคท๐Ÿผ person shrugging: medium-light skin tone
910+1F937 1F3FD ; fully-qualified # ๐Ÿคท๐Ÿฝ person shrugging: medium skin tone
911+1F937 1F3FE ; fully-qualified # ๐Ÿคท๐Ÿพ person shrugging: medium-dark skin tone
912+1F937 1F3FF ; fully-qualified # ๐Ÿคท๐Ÿฟ person shrugging: dark skin tone
913+1F937 200D 2642 FE0F ; fully-qualified # ๐Ÿคทโ€โ™‚๏ธ man shrugging
914+1F937 200D 2642 ; minimally-qualified # ๐Ÿคทโ€โ™‚ man shrugging
915+1F937 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿคท๐Ÿปโ€โ™‚๏ธ man shrugging: light skin tone
916+1F937 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿคท๐Ÿปโ€โ™‚ man shrugging: light skin tone
917+1F937 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿคท๐Ÿผโ€โ™‚๏ธ man shrugging: medium-light skin tone
918+1F937 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿคท๐Ÿผโ€โ™‚ man shrugging: medium-light skin tone
919+1F937 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿคท๐Ÿฝโ€โ™‚๏ธ man shrugging: medium skin tone
920+1F937 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿคท๐Ÿฝโ€โ™‚ man shrugging: medium skin tone
921+1F937 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿคท๐Ÿพโ€โ™‚๏ธ man shrugging: medium-dark skin tone
922+1F937 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿคท๐Ÿพโ€โ™‚ man shrugging: medium-dark skin tone
923+1F937 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿคท๐Ÿฟโ€โ™‚๏ธ man shrugging: dark skin tone
924+1F937 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿคท๐Ÿฟโ€โ™‚ man shrugging: dark skin tone
925+1F937 200D 2640 FE0F ; fully-qualified # ๐Ÿคทโ€โ™€๏ธ woman shrugging
926+1F937 200D 2640 ; minimally-qualified # ๐Ÿคทโ€โ™€ woman shrugging
927+1F937 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿคท๐Ÿปโ€โ™€๏ธ woman shrugging: light skin tone
928+1F937 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿคท๐Ÿปโ€โ™€ woman shrugging: light skin tone
929+1F937 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿคท๐Ÿผโ€โ™€๏ธ woman shrugging: medium-light skin tone
930+1F937 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿคท๐Ÿผโ€โ™€ woman shrugging: medium-light skin tone
931+1F937 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿคท๐Ÿฝโ€โ™€๏ธ woman shrugging: medium skin tone
932+1F937 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿคท๐Ÿฝโ€โ™€ woman shrugging: medium skin tone
933+1F937 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿคท๐Ÿพโ€โ™€๏ธ woman shrugging: medium-dark skin tone
934+1F937 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿคท๐Ÿพโ€โ™€ woman shrugging: medium-dark skin tone
935+1F937 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿคท๐Ÿฟโ€โ™€๏ธ woman shrugging: dark skin tone
936+1F937 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿคท๐Ÿฟโ€โ™€ woman shrugging: dark skin tone
937+
938+# subgroup: person-role
939+1F468 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘จโ€โš•๏ธ man health worker
940+1F468 200D 2695 ; minimally-qualified # ๐Ÿ‘จโ€โš• man health worker
941+1F468 1F3FB 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€โš•๏ธ man health worker: light skin tone
942+1F468 1F3FB 200D 2695 ; minimally-qualified # ๐Ÿ‘จ๐Ÿปโ€โš• man health worker: light skin tone
943+1F468 1F3FC 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€โš•๏ธ man health worker: medium-light skin tone
944+1F468 1F3FC 200D 2695 ; minimally-qualified # ๐Ÿ‘จ๐Ÿผโ€โš• man health worker: medium-light skin tone
945+1F468 1F3FD 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€โš•๏ธ man health worker: medium skin tone
946+1F468 1F3FD 200D 2695 ; minimally-qualified # ๐Ÿ‘จ๐Ÿฝโ€โš• man health worker: medium skin tone
947+1F468 1F3FE 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€โš•๏ธ man health worker: medium-dark skin tone
948+1F468 1F3FE 200D 2695 ; minimally-qualified # ๐Ÿ‘จ๐Ÿพโ€โš• man health worker: medium-dark skin tone
949+1F468 1F3FF 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€โš•๏ธ man health worker: dark skin tone
950+1F468 1F3FF 200D 2695 ; minimally-qualified # ๐Ÿ‘จ๐Ÿฟโ€โš• man health worker: dark skin tone
951+1F469 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘ฉโ€โš•๏ธ woman health worker
952+1F469 200D 2695 ; minimally-qualified # ๐Ÿ‘ฉโ€โš• woman health worker
953+1F469 1F3FB 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€โš•๏ธ woman health worker: light skin tone
954+1F469 1F3FB 200D 2695 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿปโ€โš• woman health worker: light skin tone
955+1F469 1F3FC 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€โš•๏ธ woman health worker: medium-light skin tone
956+1F469 1F3FC 200D 2695 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿผโ€โš• woman health worker: medium-light skin tone
957+1F469 1F3FD 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€โš•๏ธ woman health worker: medium skin tone
958+1F469 1F3FD 200D 2695 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€โš• woman health worker: medium skin tone
959+1F469 1F3FE 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€โš•๏ธ woman health worker: medium-dark skin tone
960+1F469 1F3FE 200D 2695 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿพโ€โš• woman health worker: medium-dark skin tone
961+1F469 1F3FF 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€โš•๏ธ woman health worker: dark skin tone
962+1F469 1F3FF 200D 2695 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€โš• woman health worker: dark skin tone
963+1F468 200D 1F393 ; fully-qualified # ๐Ÿ‘จโ€๐ŸŽ“ man student
964+1F468 1F3FB 200D 1F393 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐ŸŽ“ man student: light skin tone
965+1F468 1F3FC 200D 1F393 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐ŸŽ“ man student: medium-light skin tone
966+1F468 1F3FD 200D 1F393 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐ŸŽ“ man student: medium skin tone
967+1F468 1F3FE 200D 1F393 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐ŸŽ“ man student: medium-dark skin tone
968+1F468 1F3FF 200D 1F393 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐ŸŽ“ man student: dark skin tone
969+1F469 200D 1F393 ; fully-qualified # ๐Ÿ‘ฉโ€๐ŸŽ“ woman student
970+1F469 1F3FB 200D 1F393 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽ“ woman student: light skin tone
971+1F469 1F3FC 200D 1F393 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽ“ woman student: medium-light skin tone
972+1F469 1F3FD 200D 1F393 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽ“ woman student: medium skin tone
973+1F469 1F3FE 200D 1F393 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽ“ woman student: medium-dark skin tone
974+1F469 1F3FF 200D 1F393 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽ“ woman student: dark skin tone
975+1F468 200D 1F3EB ; fully-qualified # ๐Ÿ‘จโ€๐Ÿซ man teacher
976+1F468 1F3FB 200D 1F3EB ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿซ man teacher: light skin tone
977+1F468 1F3FC 200D 1F3EB ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿซ man teacher: medium-light skin tone
978+1F468 1F3FD 200D 1F3EB ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿซ man teacher: medium skin tone
979+1F468 1F3FE 200D 1F3EB ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿซ man teacher: medium-dark skin tone
980+1F468 1F3FF 200D 1F3EB ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿซ man teacher: dark skin tone
981+1F469 200D 1F3EB ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿซ woman teacher
982+1F469 1F3FB 200D 1F3EB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿซ woman teacher: light skin tone
983+1F469 1F3FC 200D 1F3EB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿซ woman teacher: medium-light skin tone
984+1F469 1F3FD 200D 1F3EB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿซ woman teacher: medium skin tone
985+1F469 1F3FE 200D 1F3EB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿซ woman teacher: medium-dark skin tone
986+1F469 1F3FF 200D 1F3EB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿซ woman teacher: dark skin tone
987+1F468 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘จโ€โš–๏ธ man judge
988+1F468 200D 2696 ; minimally-qualified # ๐Ÿ‘จโ€โš– man judge
989+1F468 1F3FB 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€โš–๏ธ man judge: light skin tone
990+1F468 1F3FB 200D 2696 ; minimally-qualified # ๐Ÿ‘จ๐Ÿปโ€โš– man judge: light skin tone
991+1F468 1F3FC 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€โš–๏ธ man judge: medium-light skin tone
992+1F468 1F3FC 200D 2696 ; minimally-qualified # ๐Ÿ‘จ๐Ÿผโ€โš– man judge: medium-light skin tone
993+1F468 1F3FD 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€โš–๏ธ man judge: medium skin tone
994+1F468 1F3FD 200D 2696 ; minimally-qualified # ๐Ÿ‘จ๐Ÿฝโ€โš– man judge: medium skin tone
995+1F468 1F3FE 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€โš–๏ธ man judge: medium-dark skin tone
996+1F468 1F3FE 200D 2696 ; minimally-qualified # ๐Ÿ‘จ๐Ÿพโ€โš– man judge: medium-dark skin tone
997+1F468 1F3FF 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€โš–๏ธ man judge: dark skin tone
998+1F468 1F3FF 200D 2696 ; minimally-qualified # ๐Ÿ‘จ๐Ÿฟโ€โš– man judge: dark skin tone
999+1F469 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘ฉโ€โš–๏ธ woman judge
1000+1F469 200D 2696 ; minimally-qualified # ๐Ÿ‘ฉโ€โš– woman judge
1001+1F469 1F3FB 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€โš–๏ธ woman judge: light skin tone
1002+1F469 1F3FB 200D 2696 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿปโ€โš– woman judge: light skin tone
1003+1F469 1F3FC 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€โš–๏ธ woman judge: medium-light skin tone
1004+1F469 1F3FC 200D 2696 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿผโ€โš– woman judge: medium-light skin tone
1005+1F469 1F3FD 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€โš–๏ธ woman judge: medium skin tone
1006+1F469 1F3FD 200D 2696 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€โš– woman judge: medium skin tone
1007+1F469 1F3FE 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€โš–๏ธ woman judge: medium-dark skin tone
1008+1F469 1F3FE 200D 2696 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿพโ€โš– woman judge: medium-dark skin tone
1009+1F469 1F3FF 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€โš–๏ธ woman judge: dark skin tone
1010+1F469 1F3FF 200D 2696 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€โš– woman judge: dark skin tone
1011+1F468 200D 1F33E ; fully-qualified # ๐Ÿ‘จโ€๐ŸŒพ man farmer
1012+1F468 1F3FB 200D 1F33E ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐ŸŒพ man farmer: light skin tone
1013+1F468 1F3FC 200D 1F33E ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐ŸŒพ man farmer: medium-light skin tone
1014+1F468 1F3FD 200D 1F33E ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐ŸŒพ man farmer: medium skin tone
1015+1F468 1F3FE 200D 1F33E ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐ŸŒพ man farmer: medium-dark skin tone
1016+1F468 1F3FF 200D 1F33E ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐ŸŒพ man farmer: dark skin tone
1017+1F469 200D 1F33E ; fully-qualified # ๐Ÿ‘ฉโ€๐ŸŒพ woman farmer
1018+1F469 1F3FB 200D 1F33E ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐ŸŒพ woman farmer: light skin tone
1019+1F469 1F3FC 200D 1F33E ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐ŸŒพ woman farmer: medium-light skin tone
1020+1F469 1F3FD 200D 1F33E ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŒพ woman farmer: medium skin tone
1021+1F469 1F3FE 200D 1F33E ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐ŸŒพ woman farmer: medium-dark skin tone
1022+1F469 1F3FF 200D 1F33E ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŒพ woman farmer: dark skin tone
1023+1F468 200D 1F373 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿณ man cook
1024+1F468 1F3FB 200D 1F373 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿณ man cook: light skin tone
1025+1F468 1F3FC 200D 1F373 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿณ man cook: medium-light skin tone
1026+1F468 1F3FD 200D 1F373 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿณ man cook: medium skin tone
1027+1F468 1F3FE 200D 1F373 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿณ man cook: medium-dark skin tone
1028+1F468 1F3FF 200D 1F373 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿณ man cook: dark skin tone
1029+1F469 200D 1F373 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿณ woman cook
1030+1F469 1F3FB 200D 1F373 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿณ woman cook: light skin tone
1031+1F469 1F3FC 200D 1F373 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿณ woman cook: medium-light skin tone
1032+1F469 1F3FD 200D 1F373 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿณ woman cook: medium skin tone
1033+1F469 1F3FE 200D 1F373 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿณ woman cook: medium-dark skin tone
1034+1F469 1F3FF 200D 1F373 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿณ woman cook: dark skin tone
1035+1F468 200D 1F527 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ”ง man mechanic
1036+1F468 1F3FB 200D 1F527 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿ”ง man mechanic: light skin tone
1037+1F468 1F3FC 200D 1F527 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿ”ง man mechanic: medium-light skin tone
1038+1F468 1F3FD 200D 1F527 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿ”ง man mechanic: medium skin tone
1039+1F468 1F3FE 200D 1F527 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿ”ง man mechanic: medium-dark skin tone
1040+1F468 1F3FF 200D 1F527 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿ”ง man mechanic: dark skin tone
1041+1F469 200D 1F527 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ”ง woman mechanic
1042+1F469 1F3FB 200D 1F527 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ”ง woman mechanic: light skin tone
1043+1F469 1F3FC 200D 1F527 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ”ง woman mechanic: medium-light skin tone
1044+1F469 1F3FD 200D 1F527 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ”ง woman mechanic: medium skin tone
1045+1F469 1F3FE 200D 1F527 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ”ง woman mechanic: medium-dark skin tone
1046+1F469 1F3FF 200D 1F527 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ”ง woman mechanic: dark skin tone
1047+1F468 200D 1F3ED ; fully-qualified # ๐Ÿ‘จโ€๐Ÿญ man factory worker
1048+1F468 1F3FB 200D 1F3ED ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿญ man factory worker: light skin tone
1049+1F468 1F3FC 200D 1F3ED ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿญ man factory worker: medium-light skin tone
1050+1F468 1F3FD 200D 1F3ED ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿญ man factory worker: medium skin tone
1051+1F468 1F3FE 200D 1F3ED ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿญ man factory worker: medium-dark skin tone
1052+1F468 1F3FF 200D 1F3ED ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿญ man factory worker: dark skin tone
1053+1F469 200D 1F3ED ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿญ woman factory worker
1054+1F469 1F3FB 200D 1F3ED ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿญ woman factory worker: light skin tone
1055+1F469 1F3FC 200D 1F3ED ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿญ woman factory worker: medium-light skin tone
1056+1F469 1F3FD 200D 1F3ED ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿญ woman factory worker: medium skin tone
1057+1F469 1F3FE 200D 1F3ED ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿญ woman factory worker: medium-dark skin tone
1058+1F469 1F3FF 200D 1F3ED ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿญ woman factory worker: dark skin tone
1059+1F468 200D 1F4BC ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ’ผ man office worker
1060+1F468 1F3FB 200D 1F4BC ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ผ man office worker: light skin tone
1061+1F468 1F3FC 200D 1F4BC ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿ’ผ man office worker: medium-light skin tone
1062+1F468 1F3FD 200D 1F4BC ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ผ man office worker: medium skin tone
1063+1F468 1F3FE 200D 1F4BC ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿ’ผ man office worker: medium-dark skin tone
1064+1F468 1F3FF 200D 1F4BC ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿ’ผ man office worker: dark skin tone
1065+1F469 200D 1F4BC ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ’ผ woman office worker
1066+1F469 1F3FB 200D 1F4BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ผ woman office worker: light skin tone
1067+1F469 1F3FC 200D 1F4BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ’ผ woman office worker: medium-light skin tone
1068+1F469 1F3FD 200D 1F4BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ผ woman office worker: medium skin tone
1069+1F469 1F3FE 200D 1F4BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ’ผ woman office worker: medium-dark skin tone
1070+1F469 1F3FF 200D 1F4BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ผ woman office worker: dark skin tone
1071+1F468 200D 1F52C ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ”ฌ man scientist
1072+1F468 1F3FB 200D 1F52C ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿ”ฌ man scientist: light skin tone
1073+1F468 1F3FC 200D 1F52C ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿ”ฌ man scientist: medium-light skin tone
1074+1F468 1F3FD 200D 1F52C ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿ”ฌ man scientist: medium skin tone
1075+1F468 1F3FE 200D 1F52C ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿ”ฌ man scientist: medium-dark skin tone
1076+1F468 1F3FF 200D 1F52C ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿ”ฌ man scientist: dark skin tone
1077+1F469 200D 1F52C ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ”ฌ woman scientist
1078+1F469 1F3FB 200D 1F52C ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ”ฌ woman scientist: light skin tone
1079+1F469 1F3FC 200D 1F52C ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ”ฌ woman scientist: medium-light skin tone
1080+1F469 1F3FD 200D 1F52C ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ”ฌ woman scientist: medium skin tone
1081+1F469 1F3FE 200D 1F52C ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ”ฌ woman scientist: medium-dark skin tone
1082+1F469 1F3FF 200D 1F52C ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ”ฌ woman scientist: dark skin tone
1083+1F468 200D 1F4BB ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ’ป man technologist
1084+1F468 1F3FB 200D 1F4BB ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป man technologist: light skin tone
1085+1F468 1F3FC 200D 1F4BB ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿ’ป man technologist: medium-light skin tone
1086+1F468 1F3FD 200D 1F4BB ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ป man technologist: medium skin tone
1087+1F468 1F3FE 200D 1F4BB ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿ’ป man technologist: medium-dark skin tone
1088+1F468 1F3FF 200D 1F4BB ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿ’ป man technologist: dark skin tone
1089+1F469 200D 1F4BB ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ’ป woman technologist
1090+1F469 1F3FB 200D 1F4BB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป woman technologist: light skin tone
1091+1F469 1F3FC 200D 1F4BB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ’ป woman technologist: medium-light skin tone
1092+1F469 1F3FD 200D 1F4BB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ป woman technologist: medium skin tone
1093+1F469 1F3FE 200D 1F4BB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ’ป woman technologist: medium-dark skin tone
1094+1F469 1F3FF 200D 1F4BB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ป woman technologist: dark skin tone
1095+1F468 200D 1F3A4 ; fully-qualified # ๐Ÿ‘จโ€๐ŸŽค man singer
1096+1F468 1F3FB 200D 1F3A4 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐ŸŽค man singer: light skin tone
1097+1F468 1F3FC 200D 1F3A4 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐ŸŽค man singer: medium-light skin tone
1098+1F468 1F3FD 200D 1F3A4 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐ŸŽค man singer: medium skin tone
1099+1F468 1F3FE 200D 1F3A4 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐ŸŽค man singer: medium-dark skin tone
1100+1F468 1F3FF 200D 1F3A4 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐ŸŽค man singer: dark skin tone
1101+1F469 200D 1F3A4 ; fully-qualified # ๐Ÿ‘ฉโ€๐ŸŽค woman singer
1102+1F469 1F3FB 200D 1F3A4 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽค woman singer: light skin tone
1103+1F469 1F3FC 200D 1F3A4 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽค woman singer: medium-light skin tone
1104+1F469 1F3FD 200D 1F3A4 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽค woman singer: medium skin tone
1105+1F469 1F3FE 200D 1F3A4 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽค woman singer: medium-dark skin tone
1106+1F469 1F3FF 200D 1F3A4 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽค woman singer: dark skin tone
1107+1F468 200D 1F3A8 ; fully-qualified # ๐Ÿ‘จโ€๐ŸŽจ man artist
1108+1F468 1F3FB 200D 1F3A8 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐ŸŽจ man artist: light skin tone
1109+1F468 1F3FC 200D 1F3A8 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐ŸŽจ man artist: medium-light skin tone
1110+1F468 1F3FD 200D 1F3A8 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐ŸŽจ man artist: medium skin tone
1111+1F468 1F3FE 200D 1F3A8 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐ŸŽจ man artist: medium-dark skin tone
1112+1F468 1F3FF 200D 1F3A8 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐ŸŽจ man artist: dark skin tone
1113+1F469 200D 1F3A8 ; fully-qualified # ๐Ÿ‘ฉโ€๐ŸŽจ woman artist
1114+1F469 1F3FB 200D 1F3A8 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽจ woman artist: light skin tone
1115+1F469 1F3FC 200D 1F3A8 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽจ woman artist: medium-light skin tone
1116+1F469 1F3FD 200D 1F3A8 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽจ woman artist: medium skin tone
1117+1F469 1F3FE 200D 1F3A8 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽจ woman artist: medium-dark skin tone
1118+1F469 1F3FF 200D 1F3A8 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽจ woman artist: dark skin tone
1119+1F468 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘จโ€โœˆ๏ธ man pilot
1120+1F468 200D 2708 ; minimally-qualified # ๐Ÿ‘จโ€โœˆ man pilot
1121+1F468 1F3FB 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€โœˆ๏ธ man pilot: light skin tone
1122+1F468 1F3FB 200D 2708 ; minimally-qualified # ๐Ÿ‘จ๐Ÿปโ€โœˆ man pilot: light skin tone
1123+1F468 1F3FC 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€โœˆ๏ธ man pilot: medium-light skin tone
1124+1F468 1F3FC 200D 2708 ; minimally-qualified # ๐Ÿ‘จ๐Ÿผโ€โœˆ man pilot: medium-light skin tone
1125+1F468 1F3FD 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€โœˆ๏ธ man pilot: medium skin tone
1126+1F468 1F3FD 200D 2708 ; minimally-qualified # ๐Ÿ‘จ๐Ÿฝโ€โœˆ man pilot: medium skin tone
1127+1F468 1F3FE 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€โœˆ๏ธ man pilot: medium-dark skin tone
1128+1F468 1F3FE 200D 2708 ; minimally-qualified # ๐Ÿ‘จ๐Ÿพโ€โœˆ man pilot: medium-dark skin tone
1129+1F468 1F3FF 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€โœˆ๏ธ man pilot: dark skin tone
1130+1F468 1F3FF 200D 2708 ; minimally-qualified # ๐Ÿ‘จ๐Ÿฟโ€โœˆ man pilot: dark skin tone
1131+1F469 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘ฉโ€โœˆ๏ธ woman pilot
1132+1F469 200D 2708 ; minimally-qualified # ๐Ÿ‘ฉโ€โœˆ woman pilot
1133+1F469 1F3FB 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€โœˆ๏ธ woman pilot: light skin tone
1134+1F469 1F3FB 200D 2708 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿปโ€โœˆ woman pilot: light skin tone
1135+1F469 1F3FC 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€โœˆ๏ธ woman pilot: medium-light skin tone
1136+1F469 1F3FC 200D 2708 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿผโ€โœˆ woman pilot: medium-light skin tone
1137+1F469 1F3FD 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€โœˆ๏ธ woman pilot: medium skin tone
1138+1F469 1F3FD 200D 2708 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€โœˆ woman pilot: medium skin tone
1139+1F469 1F3FE 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€โœˆ๏ธ woman pilot: medium-dark skin tone
1140+1F469 1F3FE 200D 2708 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿพโ€โœˆ woman pilot: medium-dark skin tone
1141+1F469 1F3FF 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€โœˆ๏ธ woman pilot: dark skin tone
1142+1F469 1F3FF 200D 2708 ; minimally-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€โœˆ woman pilot: dark skin tone
1143+1F468 200D 1F680 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿš€ man astronaut
1144+1F468 1F3FB 200D 1F680 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿš€ man astronaut: light skin tone
1145+1F468 1F3FC 200D 1F680 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿš€ man astronaut: medium-light skin tone
1146+1F468 1F3FD 200D 1F680 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿš€ man astronaut: medium skin tone
1147+1F468 1F3FE 200D 1F680 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿš€ man astronaut: medium-dark skin tone
1148+1F468 1F3FF 200D 1F680 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿš€ man astronaut: dark skin tone
1149+1F469 200D 1F680 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿš€ woman astronaut
1150+1F469 1F3FB 200D 1F680 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿš€ woman astronaut: light skin tone
1151+1F469 1F3FC 200D 1F680 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿš€ woman astronaut: medium-light skin tone
1152+1F469 1F3FD 200D 1F680 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿš€ woman astronaut: medium skin tone
1153+1F469 1F3FE 200D 1F680 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿš€ woman astronaut: medium-dark skin tone
1154+1F469 1F3FF 200D 1F680 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿš€ woman astronaut: dark skin tone
1155+1F468 200D 1F692 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿš’ man firefighter
1156+1F468 1F3FB 200D 1F692 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿš’ man firefighter: light skin tone
1157+1F468 1F3FC 200D 1F692 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿš’ man firefighter: medium-light skin tone
1158+1F468 1F3FD 200D 1F692 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿš’ man firefighter: medium skin tone
1159+1F468 1F3FE 200D 1F692 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿš’ man firefighter: medium-dark skin tone
1160+1F468 1F3FF 200D 1F692 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿš’ man firefighter: dark skin tone
1161+1F469 200D 1F692 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿš’ woman firefighter
1162+1F469 1F3FB 200D 1F692 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿš’ woman firefighter: light skin tone
1163+1F469 1F3FC 200D 1F692 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿš’ woman firefighter: medium-light skin tone
1164+1F469 1F3FD 200D 1F692 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿš’ woman firefighter: medium skin tone
1165+1F469 1F3FE 200D 1F692 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿš’ woman firefighter: medium-dark skin tone
1166+1F469 1F3FF 200D 1F692 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿš’ woman firefighter: dark skin tone
1167+1F46E ; fully-qualified # ๐Ÿ‘ฎ police officer
1168+1F46E 1F3FB ; fully-qualified # ๐Ÿ‘ฎ๐Ÿป police officer: light skin tone
1169+1F46E 1F3FC ; fully-qualified # ๐Ÿ‘ฎ๐Ÿผ police officer: medium-light skin tone
1170+1F46E 1F3FD ; fully-qualified # ๐Ÿ‘ฎ๐Ÿฝ police officer: medium skin tone
1171+1F46E 1F3FE ; fully-qualified # ๐Ÿ‘ฎ๐Ÿพ police officer: medium-dark skin tone
1172+1F46E 1F3FF ; fully-qualified # ๐Ÿ‘ฎ๐Ÿฟ police officer: dark skin tone
1173+1F46E 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฎโ€โ™‚๏ธ man police officer
1174+1F46E 200D 2642 ; minimally-qualified # ๐Ÿ‘ฎโ€โ™‚ man police officer
1175+1F46E 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿปโ€โ™‚๏ธ man police officer: light skin tone
1176+1F46E 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ‘ฎ๐Ÿปโ€โ™‚ man police officer: light skin tone
1177+1F46E 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿผโ€โ™‚๏ธ man police officer: medium-light skin tone
1178+1F46E 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ‘ฎ๐Ÿผโ€โ™‚ man police officer: medium-light skin tone
1179+1F46E 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿฝโ€โ™‚๏ธ man police officer: medium skin tone
1180+1F46E 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ‘ฎ๐Ÿฝโ€โ™‚ man police officer: medium skin tone
1181+1F46E 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿพโ€โ™‚๏ธ man police officer: medium-dark skin tone
1182+1F46E 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ‘ฎ๐Ÿพโ€โ™‚ man police officer: medium-dark skin tone
1183+1F46E 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿฟโ€โ™‚๏ธ man police officer: dark skin tone
1184+1F46E 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ‘ฎ๐Ÿฟโ€โ™‚ man police officer: dark skin tone
1185+1F46E 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฎโ€โ™€๏ธ woman police officer
1186+1F46E 200D 2640 ; minimally-qualified # ๐Ÿ‘ฎโ€โ™€ woman police officer
1187+1F46E 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿปโ€โ™€๏ธ woman police officer: light skin tone
1188+1F46E 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ‘ฎ๐Ÿปโ€โ™€ woman police officer: light skin tone
1189+1F46E 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿผโ€โ™€๏ธ woman police officer: medium-light skin tone
1190+1F46E 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ‘ฎ๐Ÿผโ€โ™€ woman police officer: medium-light skin tone
1191+1F46E 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿฝโ€โ™€๏ธ woman police officer: medium skin tone
1192+1F46E 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ‘ฎ๐Ÿฝโ€โ™€ woman police officer: medium skin tone
1193+1F46E 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿพโ€โ™€๏ธ woman police officer: medium-dark skin tone
1194+1F46E 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ‘ฎ๐Ÿพโ€โ™€ woman police officer: medium-dark skin tone
1195+1F46E 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿฟโ€โ™€๏ธ woman police officer: dark skin tone
1196+1F46E 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ‘ฎ๐Ÿฟโ€โ™€ woman police officer: dark skin tone
1197+1F575 FE0F ; fully-qualified # ๐Ÿ•ต๏ธ detective
1198+1F575 ; unqualified # ๐Ÿ•ต detective
1199+1F575 1F3FB ; fully-qualified # ๐Ÿ•ต๐Ÿป detective: light skin tone
1200+1F575 1F3FC ; fully-qualified # ๐Ÿ•ต๐Ÿผ detective: medium-light skin tone
1201+1F575 1F3FD ; fully-qualified # ๐Ÿ•ต๐Ÿฝ detective: medium skin tone
1202+1F575 1F3FE ; fully-qualified # ๐Ÿ•ต๐Ÿพ detective: medium-dark skin tone
1203+1F575 1F3FF ; fully-qualified # ๐Ÿ•ต๐Ÿฟ detective: dark skin tone
1204+1F575 FE0F 200D 2642 FE0F ; fully-qualified # ๐Ÿ•ต๏ธโ€โ™‚๏ธ man detective
1205+1F575 200D 2642 FE0F ; unqualified # ๐Ÿ•ตโ€โ™‚๏ธ man detective
1206+1F575 FE0F 200D 2642 ; unqualified # ๐Ÿ•ต๏ธโ€โ™‚ man detective
1207+1F575 200D 2642 ; unqualified # ๐Ÿ•ตโ€โ™‚ man detective
1208+1F575 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿปโ€โ™‚๏ธ man detective: light skin tone
1209+1F575 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ•ต๐Ÿปโ€โ™‚ man detective: light skin tone
1210+1F575 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿผโ€โ™‚๏ธ man detective: medium-light skin tone
1211+1F575 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ•ต๐Ÿผโ€โ™‚ man detective: medium-light skin tone
1212+1F575 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿฝโ€โ™‚๏ธ man detective: medium skin tone
1213+1F575 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ•ต๐Ÿฝโ€โ™‚ man detective: medium skin tone
1214+1F575 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿพโ€โ™‚๏ธ man detective: medium-dark skin tone
1215+1F575 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ•ต๐Ÿพโ€โ™‚ man detective: medium-dark skin tone
1216+1F575 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿฟโ€โ™‚๏ธ man detective: dark skin tone
1217+1F575 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ•ต๐Ÿฟโ€โ™‚ man detective: dark skin tone
1218+1F575 FE0F 200D 2640 FE0F ; fully-qualified # ๐Ÿ•ต๏ธโ€โ™€๏ธ woman detective
1219+1F575 200D 2640 FE0F ; unqualified # ๐Ÿ•ตโ€โ™€๏ธ woman detective
1220+1F575 FE0F 200D 2640 ; unqualified # ๐Ÿ•ต๏ธโ€โ™€ woman detective
1221+1F575 200D 2640 ; unqualified # ๐Ÿ•ตโ€โ™€ woman detective
1222+1F575 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿปโ€โ™€๏ธ woman detective: light skin tone
1223+1F575 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ•ต๐Ÿปโ€โ™€ woman detective: light skin tone
1224+1F575 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿผโ€โ™€๏ธ woman detective: medium-light skin tone
1225+1F575 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ•ต๐Ÿผโ€โ™€ woman detective: medium-light skin tone
1226+1F575 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿฝโ€โ™€๏ธ woman detective: medium skin tone
1227+1F575 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ•ต๐Ÿฝโ€โ™€ woman detective: medium skin tone
1228+1F575 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿพโ€โ™€๏ธ woman detective: medium-dark skin tone
1229+1F575 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ•ต๐Ÿพโ€โ™€ woman detective: medium-dark skin tone
1230+1F575 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿฟโ€โ™€๏ธ woman detective: dark skin tone
1231+1F575 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ•ต๐Ÿฟโ€โ™€ woman detective: dark skin tone
1232+1F482 ; fully-qualified # ๐Ÿ’‚ guard
1233+1F482 1F3FB ; fully-qualified # ๐Ÿ’‚๐Ÿป guard: light skin tone
1234+1F482 1F3FC ; fully-qualified # ๐Ÿ’‚๐Ÿผ guard: medium-light skin tone
1235+1F482 1F3FD ; fully-qualified # ๐Ÿ’‚๐Ÿฝ guard: medium skin tone
1236+1F482 1F3FE ; fully-qualified # ๐Ÿ’‚๐Ÿพ guard: medium-dark skin tone
1237+1F482 1F3FF ; fully-qualified # ๐Ÿ’‚๐Ÿฟ guard: dark skin tone
1238+1F482 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‚โ€โ™‚๏ธ man guard
1239+1F482 200D 2642 ; minimally-qualified # ๐Ÿ’‚โ€โ™‚ man guard
1240+1F482 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿปโ€โ™‚๏ธ man guard: light skin tone
1241+1F482 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ’‚๐Ÿปโ€โ™‚ man guard: light skin tone
1242+1F482 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿผโ€โ™‚๏ธ man guard: medium-light skin tone
1243+1F482 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ’‚๐Ÿผโ€โ™‚ man guard: medium-light skin tone
1244+1F482 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿฝโ€โ™‚๏ธ man guard: medium skin tone
1245+1F482 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ’‚๐Ÿฝโ€โ™‚ man guard: medium skin tone
1246+1F482 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿพโ€โ™‚๏ธ man guard: medium-dark skin tone
1247+1F482 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ’‚๐Ÿพโ€โ™‚ man guard: medium-dark skin tone
1248+1F482 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿฟโ€โ™‚๏ธ man guard: dark skin tone
1249+1F482 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ’‚๐Ÿฟโ€โ™‚ man guard: dark skin tone
1250+1F482 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‚โ€โ™€๏ธ woman guard
1251+1F482 200D 2640 ; minimally-qualified # ๐Ÿ’‚โ€โ™€ woman guard
1252+1F482 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿปโ€โ™€๏ธ woman guard: light skin tone
1253+1F482 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ’‚๐Ÿปโ€โ™€ woman guard: light skin tone
1254+1F482 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿผโ€โ™€๏ธ woman guard: medium-light skin tone
1255+1F482 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ’‚๐Ÿผโ€โ™€ woman guard: medium-light skin tone
1256+1F482 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿฝโ€โ™€๏ธ woman guard: medium skin tone
1257+1F482 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ’‚๐Ÿฝโ€โ™€ woman guard: medium skin tone
1258+1F482 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿพโ€โ™€๏ธ woman guard: medium-dark skin tone
1259+1F482 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ’‚๐Ÿพโ€โ™€ woman guard: medium-dark skin tone
1260+1F482 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿฟโ€โ™€๏ธ woman guard: dark skin tone
1261+1F482 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ’‚๐Ÿฟโ€โ™€ woman guard: dark skin tone
1262+1F477 ; fully-qualified # ๐Ÿ‘ท construction worker
1263+1F477 1F3FB ; fully-qualified # ๐Ÿ‘ท๐Ÿป construction worker: light skin tone
1264+1F477 1F3FC ; fully-qualified # ๐Ÿ‘ท๐Ÿผ construction worker: medium-light skin tone
1265+1F477 1F3FD ; fully-qualified # ๐Ÿ‘ท๐Ÿฝ construction worker: medium skin tone
1266+1F477 1F3FE ; fully-qualified # ๐Ÿ‘ท๐Ÿพ construction worker: medium-dark skin tone
1267+1F477 1F3FF ; fully-qualified # ๐Ÿ‘ท๐Ÿฟ construction worker: dark skin tone
1268+1F477 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ทโ€โ™‚๏ธ man construction worker
1269+1F477 200D 2642 ; minimally-qualified # ๐Ÿ‘ทโ€โ™‚ man construction worker
1270+1F477 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿปโ€โ™‚๏ธ man construction worker: light skin tone
1271+1F477 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ‘ท๐Ÿปโ€โ™‚ man construction worker: light skin tone
1272+1F477 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿผโ€โ™‚๏ธ man construction worker: medium-light skin tone
1273+1F477 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ‘ท๐Ÿผโ€โ™‚ man construction worker: medium-light skin tone
1274+1F477 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿฝโ€โ™‚๏ธ man construction worker: medium skin tone
1275+1F477 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ‘ท๐Ÿฝโ€โ™‚ man construction worker: medium skin tone
1276+1F477 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿพโ€โ™‚๏ธ man construction worker: medium-dark skin tone
1277+1F477 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ‘ท๐Ÿพโ€โ™‚ man construction worker: medium-dark skin tone
1278+1F477 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿฟโ€โ™‚๏ธ man construction worker: dark skin tone
1279+1F477 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ‘ท๐Ÿฟโ€โ™‚ man construction worker: dark skin tone
1280+1F477 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ทโ€โ™€๏ธ woman construction worker
1281+1F477 200D 2640 ; minimally-qualified # ๐Ÿ‘ทโ€โ™€ woman construction worker
1282+1F477 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿปโ€โ™€๏ธ woman construction worker: light skin tone
1283+1F477 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ‘ท๐Ÿปโ€โ™€ woman construction worker: light skin tone
1284+1F477 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿผโ€โ™€๏ธ woman construction worker: medium-light skin tone
1285+1F477 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ‘ท๐Ÿผโ€โ™€ woman construction worker: medium-light skin tone
1286+1F477 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿฝโ€โ™€๏ธ woman construction worker: medium skin tone
1287+1F477 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ‘ท๐Ÿฝโ€โ™€ woman construction worker: medium skin tone
1288+1F477 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿพโ€โ™€๏ธ woman construction worker: medium-dark skin tone
1289+1F477 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ‘ท๐Ÿพโ€โ™€ woman construction worker: medium-dark skin tone
1290+1F477 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿฟโ€โ™€๏ธ woman construction worker: dark skin tone
1291+1F477 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ‘ท๐Ÿฟโ€โ™€ woman construction worker: dark skin tone
1292+1F934 ; fully-qualified # ๐Ÿคด prince
1293+1F934 1F3FB ; fully-qualified # ๐Ÿคด๐Ÿป prince: light skin tone
1294+1F934 1F3FC ; fully-qualified # ๐Ÿคด๐Ÿผ prince: medium-light skin tone
1295+1F934 1F3FD ; fully-qualified # ๐Ÿคด๐Ÿฝ prince: medium skin tone
1296+1F934 1F3FE ; fully-qualified # ๐Ÿคด๐Ÿพ prince: medium-dark skin tone
1297+1F934 1F3FF ; fully-qualified # ๐Ÿคด๐Ÿฟ prince: dark skin tone
1298+1F478 ; fully-qualified # ๐Ÿ‘ธ princess
1299+1F478 1F3FB ; fully-qualified # ๐Ÿ‘ธ๐Ÿป princess: light skin tone
1300+1F478 1F3FC ; fully-qualified # ๐Ÿ‘ธ๐Ÿผ princess: medium-light skin tone
1301+1F478 1F3FD ; fully-qualified # ๐Ÿ‘ธ๐Ÿฝ princess: medium skin tone
1302+1F478 1F3FE ; fully-qualified # ๐Ÿ‘ธ๐Ÿพ princess: medium-dark skin tone
1303+1F478 1F3FF ; fully-qualified # ๐Ÿ‘ธ๐Ÿฟ princess: dark skin tone
1304+1F473 ; fully-qualified # ๐Ÿ‘ณ person wearing turban
1305+1F473 1F3FB ; fully-qualified # ๐Ÿ‘ณ๐Ÿป person wearing turban: light skin tone
1306+1F473 1F3FC ; fully-qualified # ๐Ÿ‘ณ๐Ÿผ person wearing turban: medium-light skin tone
1307+1F473 1F3FD ; fully-qualified # ๐Ÿ‘ณ๐Ÿฝ person wearing turban: medium skin tone
1308+1F473 1F3FE ; fully-qualified # ๐Ÿ‘ณ๐Ÿพ person wearing turban: medium-dark skin tone
1309+1F473 1F3FF ; fully-qualified # ๐Ÿ‘ณ๐Ÿฟ person wearing turban: dark skin tone
1310+1F473 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ณโ€โ™‚๏ธ man wearing turban
1311+1F473 200D 2642 ; minimally-qualified # ๐Ÿ‘ณโ€โ™‚ man wearing turban
1312+1F473 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿปโ€โ™‚๏ธ man wearing turban: light skin tone
1313+1F473 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ‘ณ๐Ÿปโ€โ™‚ man wearing turban: light skin tone
1314+1F473 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿผโ€โ™‚๏ธ man wearing turban: medium-light skin tone
1315+1F473 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ‘ณ๐Ÿผโ€โ™‚ man wearing turban: medium-light skin tone
1316+1F473 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿฝโ€โ™‚๏ธ man wearing turban: medium skin tone
1317+1F473 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ‘ณ๐Ÿฝโ€โ™‚ man wearing turban: medium skin tone
1318+1F473 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿพโ€โ™‚๏ธ man wearing turban: medium-dark skin tone
1319+1F473 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ‘ณ๐Ÿพโ€โ™‚ man wearing turban: medium-dark skin tone
1320+1F473 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿฟโ€โ™‚๏ธ man wearing turban: dark skin tone
1321+1F473 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ‘ณ๐Ÿฟโ€โ™‚ man wearing turban: dark skin tone
1322+1F473 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ณโ€โ™€๏ธ woman wearing turban
1323+1F473 200D 2640 ; minimally-qualified # ๐Ÿ‘ณโ€โ™€ woman wearing turban
1324+1F473 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿปโ€โ™€๏ธ woman wearing turban: light skin tone
1325+1F473 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ‘ณ๐Ÿปโ€โ™€ woman wearing turban: light skin tone
1326+1F473 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿผโ€โ™€๏ธ woman wearing turban: medium-light skin tone
1327+1F473 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ‘ณ๐Ÿผโ€โ™€ woman wearing turban: medium-light skin tone
1328+1F473 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿฝโ€โ™€๏ธ woman wearing turban: medium skin tone
1329+1F473 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ‘ณ๐Ÿฝโ€โ™€ woman wearing turban: medium skin tone
1330+1F473 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿพโ€โ™€๏ธ woman wearing turban: medium-dark skin tone
1331+1F473 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ‘ณ๐Ÿพโ€โ™€ woman wearing turban: medium-dark skin tone
1332+1F473 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿฟโ€โ™€๏ธ woman wearing turban: dark skin tone
1333+1F473 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ‘ณ๐Ÿฟโ€โ™€ woman wearing turban: dark skin tone
1334+1F472 ; fully-qualified # ๐Ÿ‘ฒ man with Chinese cap
1335+1F472 1F3FB ; fully-qualified # ๐Ÿ‘ฒ๐Ÿป man with Chinese cap: light skin tone
1336+1F472 1F3FC ; fully-qualified # ๐Ÿ‘ฒ๐Ÿผ man with Chinese cap: medium-light skin tone
1337+1F472 1F3FD ; fully-qualified # ๐Ÿ‘ฒ๐Ÿฝ man with Chinese cap: medium skin tone
1338+1F472 1F3FE ; fully-qualified # ๐Ÿ‘ฒ๐Ÿพ man with Chinese cap: medium-dark skin tone
1339+1F472 1F3FF ; fully-qualified # ๐Ÿ‘ฒ๐Ÿฟ man with Chinese cap: dark skin tone
1340+1F9D5 ; fully-qualified # ๐Ÿง• woman with headscarf
1341+1F9D5 1F3FB ; fully-qualified # ๐Ÿง•๐Ÿป woman with headscarf: light skin tone
1342+1F9D5 1F3FC ; fully-qualified # ๐Ÿง•๐Ÿผ woman with headscarf: medium-light skin tone
1343+1F9D5 1F3FD ; fully-qualified # ๐Ÿง•๐Ÿฝ woman with headscarf: medium skin tone
1344+1F9D5 1F3FE ; fully-qualified # ๐Ÿง•๐Ÿพ woman with headscarf: medium-dark skin tone
1345+1F9D5 1F3FF ; fully-qualified # ๐Ÿง•๐Ÿฟ woman with headscarf: dark skin tone
1346+1F935 ; fully-qualified # ๐Ÿคต man in tuxedo
1347+1F935 1F3FB ; fully-qualified # ๐Ÿคต๐Ÿป man in tuxedo: light skin tone
1348+1F935 1F3FC ; fully-qualified # ๐Ÿคต๐Ÿผ man in tuxedo: medium-light skin tone
1349+1F935 1F3FD ; fully-qualified # ๐Ÿคต๐Ÿฝ man in tuxedo: medium skin tone
1350+1F935 1F3FE ; fully-qualified # ๐Ÿคต๐Ÿพ man in tuxedo: medium-dark skin tone
1351+1F935 1F3FF ; fully-qualified # ๐Ÿคต๐Ÿฟ man in tuxedo: dark skin tone
1352+1F470 ; fully-qualified # ๐Ÿ‘ฐ bride with veil
1353+1F470 1F3FB ; fully-qualified # ๐Ÿ‘ฐ๐Ÿป bride with veil: light skin tone
1354+1F470 1F3FC ; fully-qualified # ๐Ÿ‘ฐ๐Ÿผ bride with veil: medium-light skin tone
1355+1F470 1F3FD ; fully-qualified # ๐Ÿ‘ฐ๐Ÿฝ bride with veil: medium skin tone
1356+1F470 1F3FE ; fully-qualified # ๐Ÿ‘ฐ๐Ÿพ bride with veil: medium-dark skin tone
1357+1F470 1F3FF ; fully-qualified # ๐Ÿ‘ฐ๐Ÿฟ bride with veil: dark skin tone
1358+1F930 ; fully-qualified # ๐Ÿคฐ pregnant woman
1359+1F930 1F3FB ; fully-qualified # ๐Ÿคฐ๐Ÿป pregnant woman: light skin tone
1360+1F930 1F3FC ; fully-qualified # ๐Ÿคฐ๐Ÿผ pregnant woman: medium-light skin tone
1361+1F930 1F3FD ; fully-qualified # ๐Ÿคฐ๐Ÿฝ pregnant woman: medium skin tone
1362+1F930 1F3FE ; fully-qualified # ๐Ÿคฐ๐Ÿพ pregnant woman: medium-dark skin tone
1363+1F930 1F3FF ; fully-qualified # ๐Ÿคฐ๐Ÿฟ pregnant woman: dark skin tone
1364+1F931 ; fully-qualified # ๐Ÿคฑ breast-feeding
1365+1F931 1F3FB ; fully-qualified # ๐Ÿคฑ๐Ÿป breast-feeding: light skin tone
1366+1F931 1F3FC ; fully-qualified # ๐Ÿคฑ๐Ÿผ breast-feeding: medium-light skin tone
1367+1F931 1F3FD ; fully-qualified # ๐Ÿคฑ๐Ÿฝ breast-feeding: medium skin tone
1368+1F931 1F3FE ; fully-qualified # ๐Ÿคฑ๐Ÿพ breast-feeding: medium-dark skin tone
1369+1F931 1F3FF ; fully-qualified # ๐Ÿคฑ๐Ÿฟ breast-feeding: dark skin tone
1370+
1371+# subgroup: person-fantasy
1372+1F47C ; fully-qualified # ๐Ÿ‘ผ baby angel
1373+1F47C 1F3FB ; fully-qualified # ๐Ÿ‘ผ๐Ÿป baby angel: light skin tone
1374+1F47C 1F3FC ; fully-qualified # ๐Ÿ‘ผ๐Ÿผ baby angel: medium-light skin tone
1375+1F47C 1F3FD ; fully-qualified # ๐Ÿ‘ผ๐Ÿฝ baby angel: medium skin tone
1376+1F47C 1F3FE ; fully-qualified # ๐Ÿ‘ผ๐Ÿพ baby angel: medium-dark skin tone
1377+1F47C 1F3FF ; fully-qualified # ๐Ÿ‘ผ๐Ÿฟ baby angel: dark skin tone
1378+1F385 ; fully-qualified # ๐ŸŽ… Santa Claus
1379+1F385 1F3FB ; fully-qualified # ๐ŸŽ…๐Ÿป Santa Claus: light skin tone
1380+1F385 1F3FC ; fully-qualified # ๐ŸŽ…๐Ÿผ Santa Claus: medium-light skin tone
1381+1F385 1F3FD ; fully-qualified # ๐ŸŽ…๐Ÿฝ Santa Claus: medium skin tone
1382+1F385 1F3FE ; fully-qualified # ๐ŸŽ…๐Ÿพ Santa Claus: medium-dark skin tone
1383+1F385 1F3FF ; fully-qualified # ๐ŸŽ…๐Ÿฟ Santa Claus: dark skin tone
1384+1F936 ; fully-qualified # ๐Ÿคถ Mrs. Claus
1385+1F936 1F3FB ; fully-qualified # ๐Ÿคถ๐Ÿป Mrs. Claus: light skin tone
1386+1F936 1F3FC ; fully-qualified # ๐Ÿคถ๐Ÿผ Mrs. Claus: medium-light skin tone
1387+1F936 1F3FD ; fully-qualified # ๐Ÿคถ๐Ÿฝ Mrs. Claus: medium skin tone
1388+1F936 1F3FE ; fully-qualified # ๐Ÿคถ๐Ÿพ Mrs. Claus: medium-dark skin tone
1389+1F936 1F3FF ; fully-qualified # ๐Ÿคถ๐Ÿฟ Mrs. Claus: dark skin tone
1390+1F9B8 ; fully-qualified # ๐Ÿฆธ superhero
1391+1F9B8 1F3FB ; fully-qualified # ๐Ÿฆธ๐Ÿป superhero: light skin tone
1392+1F9B8 1F3FC ; fully-qualified # ๐Ÿฆธ๐Ÿผ superhero: medium-light skin tone
1393+1F9B8 1F3FD ; fully-qualified # ๐Ÿฆธ๐Ÿฝ superhero: medium skin tone
1394+1F9B8 1F3FE ; fully-qualified # ๐Ÿฆธ๐Ÿพ superhero: medium-dark skin tone
1395+1F9B8 1F3FF ; fully-qualified # ๐Ÿฆธ๐Ÿฟ superhero: dark skin tone
1396+1F9B8 200D 2642 FE0F ; fully-qualified # ๐Ÿฆธโ€โ™‚๏ธ man superhero
1397+1F9B8 200D 2642 ; minimally-qualified # ๐Ÿฆธโ€โ™‚ man superhero
1398+1F9B8 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿปโ€โ™‚๏ธ man superhero: light skin tone
1399+1F9B8 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿฆธ๐Ÿปโ€โ™‚ man superhero: light skin tone
1400+1F9B8 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿผโ€โ™‚๏ธ man superhero: medium-light skin tone
1401+1F9B8 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿฆธ๐Ÿผโ€โ™‚ man superhero: medium-light skin tone
1402+1F9B8 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿฝโ€โ™‚๏ธ man superhero: medium skin tone
1403+1F9B8 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿฆธ๐Ÿฝโ€โ™‚ man superhero: medium skin tone
1404+1F9B8 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿพโ€โ™‚๏ธ man superhero: medium-dark skin tone
1405+1F9B8 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿฆธ๐Ÿพโ€โ™‚ man superhero: medium-dark skin tone
1406+1F9B8 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿฟโ€โ™‚๏ธ man superhero: dark skin tone
1407+1F9B8 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿฆธ๐Ÿฟโ€โ™‚ man superhero: dark skin tone
1408+1F9B8 200D 2640 FE0F ; fully-qualified # ๐Ÿฆธโ€โ™€๏ธ woman superhero
1409+1F9B8 200D 2640 ; minimally-qualified # ๐Ÿฆธโ€โ™€ woman superhero
1410+1F9B8 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿปโ€โ™€๏ธ woman superhero: light skin tone
1411+1F9B8 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿฆธ๐Ÿปโ€โ™€ woman superhero: light skin tone
1412+1F9B8 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿผโ€โ™€๏ธ woman superhero: medium-light skin tone
1413+1F9B8 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿฆธ๐Ÿผโ€โ™€ woman superhero: medium-light skin tone
1414+1F9B8 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿฝโ€โ™€๏ธ woman superhero: medium skin tone
1415+1F9B8 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿฆธ๐Ÿฝโ€โ™€ woman superhero: medium skin tone
1416+1F9B8 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿพโ€โ™€๏ธ woman superhero: medium-dark skin tone
1417+1F9B8 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿฆธ๐Ÿพโ€โ™€ woman superhero: medium-dark skin tone
1418+1F9B8 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿฟโ€โ™€๏ธ woman superhero: dark skin tone
1419+1F9B8 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿฆธ๐Ÿฟโ€โ™€ woman superhero: dark skin tone
1420+1F9B9 ; fully-qualified # ๐Ÿฆน supervillain
1421+1F9B9 1F3FB ; fully-qualified # ๐Ÿฆน๐Ÿป supervillain: light skin tone
1422+1F9B9 1F3FC ; fully-qualified # ๐Ÿฆน๐Ÿผ supervillain: medium-light skin tone
1423+1F9B9 1F3FD ; fully-qualified # ๐Ÿฆน๐Ÿฝ supervillain: medium skin tone
1424+1F9B9 1F3FE ; fully-qualified # ๐Ÿฆน๐Ÿพ supervillain: medium-dark skin tone
1425+1F9B9 1F3FF ; fully-qualified # ๐Ÿฆน๐Ÿฟ supervillain: dark skin tone
1426+1F9B9 200D 2642 FE0F ; fully-qualified # ๐Ÿฆนโ€โ™‚๏ธ man supervillain
1427+1F9B9 200D 2642 ; minimally-qualified # ๐Ÿฆนโ€โ™‚ man supervillain
1428+1F9B9 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿปโ€โ™‚๏ธ man supervillain: light skin tone
1429+1F9B9 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿฆน๐Ÿปโ€โ™‚ man supervillain: light skin tone
1430+1F9B9 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿผโ€โ™‚๏ธ man supervillain: medium-light skin tone
1431+1F9B9 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿฆน๐Ÿผโ€โ™‚ man supervillain: medium-light skin tone
1432+1F9B9 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿฝโ€โ™‚๏ธ man supervillain: medium skin tone
1433+1F9B9 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿฆน๐Ÿฝโ€โ™‚ man supervillain: medium skin tone
1434+1F9B9 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿพโ€โ™‚๏ธ man supervillain: medium-dark skin tone
1435+1F9B9 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿฆน๐Ÿพโ€โ™‚ man supervillain: medium-dark skin tone
1436+1F9B9 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿฟโ€โ™‚๏ธ man supervillain: dark skin tone
1437+1F9B9 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿฆน๐Ÿฟโ€โ™‚ man supervillain: dark skin tone
1438+1F9B9 200D 2640 FE0F ; fully-qualified # ๐Ÿฆนโ€โ™€๏ธ woman supervillain
1439+1F9B9 200D 2640 ; minimally-qualified # ๐Ÿฆนโ€โ™€ woman supervillain
1440+1F9B9 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿปโ€โ™€๏ธ woman supervillain: light skin tone
1441+1F9B9 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿฆน๐Ÿปโ€โ™€ woman supervillain: light skin tone
1442+1F9B9 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿผโ€โ™€๏ธ woman supervillain: medium-light skin tone
1443+1F9B9 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿฆน๐Ÿผโ€โ™€ woman supervillain: medium-light skin tone
1444+1F9B9 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿฝโ€โ™€๏ธ woman supervillain: medium skin tone
1445+1F9B9 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿฆน๐Ÿฝโ€โ™€ woman supervillain: medium skin tone
1446+1F9B9 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿพโ€โ™€๏ธ woman supervillain: medium-dark skin tone
1447+1F9B9 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿฆน๐Ÿพโ€โ™€ woman supervillain: medium-dark skin tone
1448+1F9B9 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿฟโ€โ™€๏ธ woman supervillain: dark skin tone
1449+1F9B9 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿฆน๐Ÿฟโ€โ™€ woman supervillain: dark skin tone
1450+1F9D9 ; fully-qualified # ๐Ÿง™ mage
1451+1F9D9 1F3FB ; fully-qualified # ๐Ÿง™๐Ÿป mage: light skin tone
1452+1F9D9 1F3FC ; fully-qualified # ๐Ÿง™๐Ÿผ mage: medium-light skin tone
1453+1F9D9 1F3FD ; fully-qualified # ๐Ÿง™๐Ÿฝ mage: medium skin tone
1454+1F9D9 1F3FE ; fully-qualified # ๐Ÿง™๐Ÿพ mage: medium-dark skin tone
1455+1F9D9 1F3FF ; fully-qualified # ๐Ÿง™๐Ÿฟ mage: dark skin tone
1456+1F9D9 200D 2642 FE0F ; fully-qualified # ๐Ÿง™โ€โ™‚๏ธ man mage
1457+1F9D9 200D 2642 ; minimally-qualified # ๐Ÿง™โ€โ™‚ man mage
1458+1F9D9 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿง™๐Ÿปโ€โ™‚๏ธ man mage: light skin tone
1459+1F9D9 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿง™๐Ÿปโ€โ™‚ man mage: light skin tone
1460+1F9D9 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿง™๐Ÿผโ€โ™‚๏ธ man mage: medium-light skin tone
1461+1F9D9 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿง™๐Ÿผโ€โ™‚ man mage: medium-light skin tone
1462+1F9D9 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿง™๐Ÿฝโ€โ™‚๏ธ man mage: medium skin tone
1463+1F9D9 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿง™๐Ÿฝโ€โ™‚ man mage: medium skin tone
1464+1F9D9 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿง™๐Ÿพโ€โ™‚๏ธ man mage: medium-dark skin tone
1465+1F9D9 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿง™๐Ÿพโ€โ™‚ man mage: medium-dark skin tone
1466+1F9D9 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿง™๐Ÿฟโ€โ™‚๏ธ man mage: dark skin tone
1467+1F9D9 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿง™๐Ÿฟโ€โ™‚ man mage: dark skin tone
1468+1F9D9 200D 2640 FE0F ; fully-qualified # ๐Ÿง™โ€โ™€๏ธ woman mage
1469+1F9D9 200D 2640 ; minimally-qualified # ๐Ÿง™โ€โ™€ woman mage
1470+1F9D9 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿง™๐Ÿปโ€โ™€๏ธ woman mage: light skin tone
1471+1F9D9 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿง™๐Ÿปโ€โ™€ woman mage: light skin tone
1472+1F9D9 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿง™๐Ÿผโ€โ™€๏ธ woman mage: medium-light skin tone
1473+1F9D9 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿง™๐Ÿผโ€โ™€ woman mage: medium-light skin tone
1474+1F9D9 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿง™๐Ÿฝโ€โ™€๏ธ woman mage: medium skin tone
1475+1F9D9 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿง™๐Ÿฝโ€โ™€ woman mage: medium skin tone
1476+1F9D9 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿง™๐Ÿพโ€โ™€๏ธ woman mage: medium-dark skin tone
1477+1F9D9 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿง™๐Ÿพโ€โ™€ woman mage: medium-dark skin tone
1478+1F9D9 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿง™๐Ÿฟโ€โ™€๏ธ woman mage: dark skin tone
1479+1F9D9 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿง™๐Ÿฟโ€โ™€ woman mage: dark skin tone
1480+1F9DA ; fully-qualified # ๐Ÿงš fairy
1481+1F9DA 1F3FB ; fully-qualified # ๐Ÿงš๐Ÿป fairy: light skin tone
1482+1F9DA 1F3FC ; fully-qualified # ๐Ÿงš๐Ÿผ fairy: medium-light skin tone
1483+1F9DA 1F3FD ; fully-qualified # ๐Ÿงš๐Ÿฝ fairy: medium skin tone
1484+1F9DA 1F3FE ; fully-qualified # ๐Ÿงš๐Ÿพ fairy: medium-dark skin tone
1485+1F9DA 1F3FF ; fully-qualified # ๐Ÿงš๐Ÿฟ fairy: dark skin tone
1486+1F9DA 200D 2642 FE0F ; fully-qualified # ๐Ÿงšโ€โ™‚๏ธ man fairy
1487+1F9DA 200D 2642 ; minimally-qualified # ๐Ÿงšโ€โ™‚ man fairy
1488+1F9DA 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿงš๐Ÿปโ€โ™‚๏ธ man fairy: light skin tone
1489+1F9DA 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿงš๐Ÿปโ€โ™‚ man fairy: light skin tone
1490+1F9DA 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿงš๐Ÿผโ€โ™‚๏ธ man fairy: medium-light skin tone
1491+1F9DA 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿงš๐Ÿผโ€โ™‚ man fairy: medium-light skin tone
1492+1F9DA 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿงš๐Ÿฝโ€โ™‚๏ธ man fairy: medium skin tone
1493+1F9DA 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿงš๐Ÿฝโ€โ™‚ man fairy: medium skin tone
1494+1F9DA 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿงš๐Ÿพโ€โ™‚๏ธ man fairy: medium-dark skin tone
1495+1F9DA 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿงš๐Ÿพโ€โ™‚ man fairy: medium-dark skin tone
1496+1F9DA 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿงš๐Ÿฟโ€โ™‚๏ธ man fairy: dark skin tone
1497+1F9DA 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿงš๐Ÿฟโ€โ™‚ man fairy: dark skin tone
1498+1F9DA 200D 2640 FE0F ; fully-qualified # ๐Ÿงšโ€โ™€๏ธ woman fairy
1499+1F9DA 200D 2640 ; minimally-qualified # ๐Ÿงšโ€โ™€ woman fairy
1500+1F9DA 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿงš๐Ÿปโ€โ™€๏ธ woman fairy: light skin tone
1501+1F9DA 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿงš๐Ÿปโ€โ™€ woman fairy: light skin tone
1502+1F9DA 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿงš๐Ÿผโ€โ™€๏ธ woman fairy: medium-light skin tone
1503+1F9DA 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿงš๐Ÿผโ€โ™€ woman fairy: medium-light skin tone
1504+1F9DA 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿงš๐Ÿฝโ€โ™€๏ธ woman fairy: medium skin tone
1505+1F9DA 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿงš๐Ÿฝโ€โ™€ woman fairy: medium skin tone
1506+1F9DA 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿงš๐Ÿพโ€โ™€๏ธ woman fairy: medium-dark skin tone
1507+1F9DA 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿงš๐Ÿพโ€โ™€ woman fairy: medium-dark skin tone
1508+1F9DA 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿงš๐Ÿฟโ€โ™€๏ธ woman fairy: dark skin tone
1509+1F9DA 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿงš๐Ÿฟโ€โ™€ woman fairy: dark skin tone
1510+1F9DB ; fully-qualified # ๐Ÿง› vampire
1511+1F9DB 1F3FB ; fully-qualified # ๐Ÿง›๐Ÿป vampire: light skin tone
1512+1F9DB 1F3FC ; fully-qualified # ๐Ÿง›๐Ÿผ vampire: medium-light skin tone
1513+1F9DB 1F3FD ; fully-qualified # ๐Ÿง›๐Ÿฝ vampire: medium skin tone
1514+1F9DB 1F3FE ; fully-qualified # ๐Ÿง›๐Ÿพ vampire: medium-dark skin tone
1515+1F9DB 1F3FF ; fully-qualified # ๐Ÿง›๐Ÿฟ vampire: dark skin tone
1516+1F9DB 200D 2642 FE0F ; fully-qualified # ๐Ÿง›โ€โ™‚๏ธ man vampire
1517+1F9DB 200D 2642 ; minimally-qualified # ๐Ÿง›โ€โ™‚ man vampire
1518+1F9DB 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿง›๐Ÿปโ€โ™‚๏ธ man vampire: light skin tone
1519+1F9DB 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿง›๐Ÿปโ€โ™‚ man vampire: light skin tone
1520+1F9DB 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿง›๐Ÿผโ€โ™‚๏ธ man vampire: medium-light skin tone
1521+1F9DB 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿง›๐Ÿผโ€โ™‚ man vampire: medium-light skin tone
1522+1F9DB 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿง›๐Ÿฝโ€โ™‚๏ธ man vampire: medium skin tone
1523+1F9DB 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿง›๐Ÿฝโ€โ™‚ man vampire: medium skin tone
1524+1F9DB 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿง›๐Ÿพโ€โ™‚๏ธ man vampire: medium-dark skin tone
1525+1F9DB 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿง›๐Ÿพโ€โ™‚ man vampire: medium-dark skin tone
1526+1F9DB 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿง›๐Ÿฟโ€โ™‚๏ธ man vampire: dark skin tone
1527+1F9DB 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿง›๐Ÿฟโ€โ™‚ man vampire: dark skin tone
1528+1F9DB 200D 2640 FE0F ; fully-qualified # ๐Ÿง›โ€โ™€๏ธ woman vampire
1529+1F9DB 200D 2640 ; minimally-qualified # ๐Ÿง›โ€โ™€ woman vampire
1530+1F9DB 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿง›๐Ÿปโ€โ™€๏ธ woman vampire: light skin tone
1531+1F9DB 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿง›๐Ÿปโ€โ™€ woman vampire: light skin tone
1532+1F9DB 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿง›๐Ÿผโ€โ™€๏ธ woman vampire: medium-light skin tone
1533+1F9DB 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿง›๐Ÿผโ€โ™€ woman vampire: medium-light skin tone
1534+1F9DB 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿง›๐Ÿฝโ€โ™€๏ธ woman vampire: medium skin tone
1535+1F9DB 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿง›๐Ÿฝโ€โ™€ woman vampire: medium skin tone
1536+1F9DB 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿง›๐Ÿพโ€โ™€๏ธ woman vampire: medium-dark skin tone
1537+1F9DB 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿง›๐Ÿพโ€โ™€ woman vampire: medium-dark skin tone
1538+1F9DB 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿง›๐Ÿฟโ€โ™€๏ธ woman vampire: dark skin tone
1539+1F9DB 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿง›๐Ÿฟโ€โ™€ woman vampire: dark skin tone
1540+1F9DC ; fully-qualified # ๐Ÿงœ merperson
1541+1F9DC 1F3FB ; fully-qualified # ๐Ÿงœ๐Ÿป merperson: light skin tone
1542+1F9DC 1F3FC ; fully-qualified # ๐Ÿงœ๐Ÿผ merperson: medium-light skin tone
1543+1F9DC 1F3FD ; fully-qualified # ๐Ÿงœ๐Ÿฝ merperson: medium skin tone
1544+1F9DC 1F3FE ; fully-qualified # ๐Ÿงœ๐Ÿพ merperson: medium-dark skin tone
1545+1F9DC 1F3FF ; fully-qualified # ๐Ÿงœ๐Ÿฟ merperson: dark skin tone
1546+1F9DC 200D 2642 FE0F ; fully-qualified # ๐Ÿงœโ€โ™‚๏ธ merman
1547+1F9DC 200D 2642 ; minimally-qualified # ๐Ÿงœโ€โ™‚ merman
1548+1F9DC 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿปโ€โ™‚๏ธ merman: light skin tone
1549+1F9DC 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿงœ๐Ÿปโ€โ™‚ merman: light skin tone
1550+1F9DC 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿผโ€โ™‚๏ธ merman: medium-light skin tone
1551+1F9DC 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿงœ๐Ÿผโ€โ™‚ merman: medium-light skin tone
1552+1F9DC 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿฝโ€โ™‚๏ธ merman: medium skin tone
1553+1F9DC 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿงœ๐Ÿฝโ€โ™‚ merman: medium skin tone
1554+1F9DC 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿพโ€โ™‚๏ธ merman: medium-dark skin tone
1555+1F9DC 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿงœ๐Ÿพโ€โ™‚ merman: medium-dark skin tone
1556+1F9DC 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿฟโ€โ™‚๏ธ merman: dark skin tone
1557+1F9DC 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿงœ๐Ÿฟโ€โ™‚ merman: dark skin tone
1558+1F9DC 200D 2640 FE0F ; fully-qualified # ๐Ÿงœโ€โ™€๏ธ mermaid
1559+1F9DC 200D 2640 ; minimally-qualified # ๐Ÿงœโ€โ™€ mermaid
1560+1F9DC 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿปโ€โ™€๏ธ mermaid: light skin tone
1561+1F9DC 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿงœ๐Ÿปโ€โ™€ mermaid: light skin tone
1562+1F9DC 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿผโ€โ™€๏ธ mermaid: medium-light skin tone
1563+1F9DC 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿงœ๐Ÿผโ€โ™€ mermaid: medium-light skin tone
1564+1F9DC 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿฝโ€โ™€๏ธ mermaid: medium skin tone
1565+1F9DC 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿงœ๐Ÿฝโ€โ™€ mermaid: medium skin tone
1566+1F9DC 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿพโ€โ™€๏ธ mermaid: medium-dark skin tone
1567+1F9DC 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿงœ๐Ÿพโ€โ™€ mermaid: medium-dark skin tone
1568+1F9DC 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿฟโ€โ™€๏ธ mermaid: dark skin tone
1569+1F9DC 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿงœ๐Ÿฟโ€โ™€ mermaid: dark skin tone
1570+1F9DD ; fully-qualified # ๐Ÿง elf
1571+1F9DD 1F3FB ; fully-qualified # ๐Ÿง๐Ÿป elf: light skin tone
1572+1F9DD 1F3FC ; fully-qualified # ๐Ÿง๐Ÿผ elf: medium-light skin tone
1573+1F9DD 1F3FD ; fully-qualified # ๐Ÿง๐Ÿฝ elf: medium skin tone
1574+1F9DD 1F3FE ; fully-qualified # ๐Ÿง๐Ÿพ elf: medium-dark skin tone
1575+1F9DD 1F3FF ; fully-qualified # ๐Ÿง๐Ÿฟ elf: dark skin tone
1576+1F9DD 200D 2642 FE0F ; fully-qualified # ๐Ÿงโ€โ™‚๏ธ man elf
1577+1F9DD 200D 2642 ; minimally-qualified # ๐Ÿงโ€โ™‚ man elf
1578+1F9DD 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿปโ€โ™‚๏ธ man elf: light skin tone
1579+1F9DD 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿปโ€โ™‚ man elf: light skin tone
1580+1F9DD 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿผโ€โ™‚๏ธ man elf: medium-light skin tone
1581+1F9DD 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿผโ€โ™‚ man elf: medium-light skin tone
1582+1F9DD 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿฝโ€โ™‚๏ธ man elf: medium skin tone
1583+1F9DD 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿฝโ€โ™‚ man elf: medium skin tone
1584+1F9DD 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿพโ€โ™‚๏ธ man elf: medium-dark skin tone
1585+1F9DD 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿพโ€โ™‚ man elf: medium-dark skin tone
1586+1F9DD 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿฟโ€โ™‚๏ธ man elf: dark skin tone
1587+1F9DD 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿฟโ€โ™‚ man elf: dark skin tone
1588+1F9DD 200D 2640 FE0F ; fully-qualified # ๐Ÿงโ€โ™€๏ธ woman elf
1589+1F9DD 200D 2640 ; minimally-qualified # ๐Ÿงโ€โ™€ woman elf
1590+1F9DD 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿปโ€โ™€๏ธ woman elf: light skin tone
1591+1F9DD 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿปโ€โ™€ woman elf: light skin tone
1592+1F9DD 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿผโ€โ™€๏ธ woman elf: medium-light skin tone
1593+1F9DD 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿผโ€โ™€ woman elf: medium-light skin tone
1594+1F9DD 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿฝโ€โ™€๏ธ woman elf: medium skin tone
1595+1F9DD 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿฝโ€โ™€ woman elf: medium skin tone
1596+1F9DD 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿพโ€โ™€๏ธ woman elf: medium-dark skin tone
1597+1F9DD 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿพโ€โ™€ woman elf: medium-dark skin tone
1598+1F9DD 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿฟโ€โ™€๏ธ woman elf: dark skin tone
1599+1F9DD 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿฟโ€โ™€ woman elf: dark skin tone
1600+1F9DE ; fully-qualified # ๐Ÿงž genie
1601+1F9DE 200D 2642 FE0F ; fully-qualified # ๐Ÿงžโ€โ™‚๏ธ man genie
1602+1F9DE 200D 2642 ; minimally-qualified # ๐Ÿงžโ€โ™‚ man genie
1603+1F9DE 200D 2640 FE0F ; fully-qualified # ๐Ÿงžโ€โ™€๏ธ woman genie
1604+1F9DE 200D 2640 ; minimally-qualified # ๐Ÿงžโ€โ™€ woman genie
1605+1F9DF ; fully-qualified # ๐ŸงŸ zombie
1606+1F9DF 200D 2642 FE0F ; fully-qualified # ๐ŸงŸโ€โ™‚๏ธ man zombie
1607+1F9DF 200D 2642 ; minimally-qualified # ๐ŸงŸโ€โ™‚ man zombie
1608+1F9DF 200D 2640 FE0F ; fully-qualified # ๐ŸงŸโ€โ™€๏ธ woman zombie
1609+1F9DF 200D 2640 ; minimally-qualified # ๐ŸงŸโ€โ™€ woman zombie
1610+
1611+# subgroup: person-activity
1612+1F486 ; fully-qualified # ๐Ÿ’† person getting massage
1613+1F486 1F3FB ; fully-qualified # ๐Ÿ’†๐Ÿป person getting massage: light skin tone
1614+1F486 1F3FC ; fully-qualified # ๐Ÿ’†๐Ÿผ person getting massage: medium-light skin tone
1615+1F486 1F3FD ; fully-qualified # ๐Ÿ’†๐Ÿฝ person getting massage: medium skin tone
1616+1F486 1F3FE ; fully-qualified # ๐Ÿ’†๐Ÿพ person getting massage: medium-dark skin tone
1617+1F486 1F3FF ; fully-qualified # ๐Ÿ’†๐Ÿฟ person getting massage: dark skin tone
1618+1F486 200D 2642 FE0F ; fully-qualified # ๐Ÿ’†โ€โ™‚๏ธ man getting massage
1619+1F486 200D 2642 ; minimally-qualified # ๐Ÿ’†โ€โ™‚ man getting massage
1620+1F486 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿปโ€โ™‚๏ธ man getting massage: light skin tone
1621+1F486 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ’†๐Ÿปโ€โ™‚ man getting massage: light skin tone
1622+1F486 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿผโ€โ™‚๏ธ man getting massage: medium-light skin tone
1623+1F486 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ’†๐Ÿผโ€โ™‚ man getting massage: medium-light skin tone
1624+1F486 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿฝโ€โ™‚๏ธ man getting massage: medium skin tone
1625+1F486 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ’†๐Ÿฝโ€โ™‚ man getting massage: medium skin tone
1626+1F486 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿพโ€โ™‚๏ธ man getting massage: medium-dark skin tone
1627+1F486 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ’†๐Ÿพโ€โ™‚ man getting massage: medium-dark skin tone
1628+1F486 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿฟโ€โ™‚๏ธ man getting massage: dark skin tone
1629+1F486 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ’†๐Ÿฟโ€โ™‚ man getting massage: dark skin tone
1630+1F486 200D 2640 FE0F ; fully-qualified # ๐Ÿ’†โ€โ™€๏ธ woman getting massage
1631+1F486 200D 2640 ; minimally-qualified # ๐Ÿ’†โ€โ™€ woman getting massage
1632+1F486 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿปโ€โ™€๏ธ woman getting massage: light skin tone
1633+1F486 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ’†๐Ÿปโ€โ™€ woman getting massage: light skin tone
1634+1F486 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿผโ€โ™€๏ธ woman getting massage: medium-light skin tone
1635+1F486 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ’†๐Ÿผโ€โ™€ woman getting massage: medium-light skin tone
1636+1F486 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿฝโ€โ™€๏ธ woman getting massage: medium skin tone
1637+1F486 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ’†๐Ÿฝโ€โ™€ woman getting massage: medium skin tone
1638+1F486 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿพโ€โ™€๏ธ woman getting massage: medium-dark skin tone
1639+1F486 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ’†๐Ÿพโ€โ™€ woman getting massage: medium-dark skin tone
1640+1F486 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿฟโ€โ™€๏ธ woman getting massage: dark skin tone
1641+1F486 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ’†๐Ÿฟโ€โ™€ woman getting massage: dark skin tone
1642+1F487 ; fully-qualified # ๐Ÿ’‡ person getting haircut
1643+1F487 1F3FB ; fully-qualified # ๐Ÿ’‡๐Ÿป person getting haircut: light skin tone
1644+1F487 1F3FC ; fully-qualified # ๐Ÿ’‡๐Ÿผ person getting haircut: medium-light skin tone
1645+1F487 1F3FD ; fully-qualified # ๐Ÿ’‡๐Ÿฝ person getting haircut: medium skin tone
1646+1F487 1F3FE ; fully-qualified # ๐Ÿ’‡๐Ÿพ person getting haircut: medium-dark skin tone
1647+1F487 1F3FF ; fully-qualified # ๐Ÿ’‡๐Ÿฟ person getting haircut: dark skin tone
1648+1F487 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‡โ€โ™‚๏ธ man getting haircut
1649+1F487 200D 2642 ; minimally-qualified # ๐Ÿ’‡โ€โ™‚ man getting haircut
1650+1F487 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿปโ€โ™‚๏ธ man getting haircut: light skin tone
1651+1F487 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ’‡๐Ÿปโ€โ™‚ man getting haircut: light skin tone
1652+1F487 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿผโ€โ™‚๏ธ man getting haircut: medium-light skin tone
1653+1F487 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ’‡๐Ÿผโ€โ™‚ man getting haircut: medium-light skin tone
1654+1F487 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿฝโ€โ™‚๏ธ man getting haircut: medium skin tone
1655+1F487 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ’‡๐Ÿฝโ€โ™‚ man getting haircut: medium skin tone
1656+1F487 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿพโ€โ™‚๏ธ man getting haircut: medium-dark skin tone
1657+1F487 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ’‡๐Ÿพโ€โ™‚ man getting haircut: medium-dark skin tone
1658+1F487 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿฟโ€โ™‚๏ธ man getting haircut: dark skin tone
1659+1F487 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ’‡๐Ÿฟโ€โ™‚ man getting haircut: dark skin tone
1660+1F487 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‡โ€โ™€๏ธ woman getting haircut
1661+1F487 200D 2640 ; minimally-qualified # ๐Ÿ’‡โ€โ™€ woman getting haircut
1662+1F487 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿปโ€โ™€๏ธ woman getting haircut: light skin tone
1663+1F487 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ’‡๐Ÿปโ€โ™€ woman getting haircut: light skin tone
1664+1F487 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿผโ€โ™€๏ธ woman getting haircut: medium-light skin tone
1665+1F487 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ’‡๐Ÿผโ€โ™€ woman getting haircut: medium-light skin tone
1666+1F487 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿฝโ€โ™€๏ธ woman getting haircut: medium skin tone
1667+1F487 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ’‡๐Ÿฝโ€โ™€ woman getting haircut: medium skin tone
1668+1F487 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿพโ€โ™€๏ธ woman getting haircut: medium-dark skin tone
1669+1F487 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ’‡๐Ÿพโ€โ™€ woman getting haircut: medium-dark skin tone
1670+1F487 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿฟโ€โ™€๏ธ woman getting haircut: dark skin tone
1671+1F487 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ’‡๐Ÿฟโ€โ™€ woman getting haircut: dark skin tone
1672+1F6B6 ; fully-qualified # ๐Ÿšถ person walking
1673+1F6B6 1F3FB ; fully-qualified # ๐Ÿšถ๐Ÿป person walking: light skin tone
1674+1F6B6 1F3FC ; fully-qualified # ๐Ÿšถ๐Ÿผ person walking: medium-light skin tone
1675+1F6B6 1F3FD ; fully-qualified # ๐Ÿšถ๐Ÿฝ person walking: medium skin tone
1676+1F6B6 1F3FE ; fully-qualified # ๐Ÿšถ๐Ÿพ person walking: medium-dark skin tone
1677+1F6B6 1F3FF ; fully-qualified # ๐Ÿšถ๐Ÿฟ person walking: dark skin tone
1678+1F6B6 200D 2642 FE0F ; fully-qualified # ๐Ÿšถโ€โ™‚๏ธ man walking
1679+1F6B6 200D 2642 ; minimally-qualified # ๐Ÿšถโ€โ™‚ man walking
1680+1F6B6 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿปโ€โ™‚๏ธ man walking: light skin tone
1681+1F6B6 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿšถ๐Ÿปโ€โ™‚ man walking: light skin tone
1682+1F6B6 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿผโ€โ™‚๏ธ man walking: medium-light skin tone
1683+1F6B6 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿšถ๐Ÿผโ€โ™‚ man walking: medium-light skin tone
1684+1F6B6 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿฝโ€โ™‚๏ธ man walking: medium skin tone
1685+1F6B6 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿšถ๐Ÿฝโ€โ™‚ man walking: medium skin tone
1686+1F6B6 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿพโ€โ™‚๏ธ man walking: medium-dark skin tone
1687+1F6B6 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿšถ๐Ÿพโ€โ™‚ man walking: medium-dark skin tone
1688+1F6B6 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿฟโ€โ™‚๏ธ man walking: dark skin tone
1689+1F6B6 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿšถ๐Ÿฟโ€โ™‚ man walking: dark skin tone
1690+1F6B6 200D 2640 FE0F ; fully-qualified # ๐Ÿšถโ€โ™€๏ธ woman walking
1691+1F6B6 200D 2640 ; minimally-qualified # ๐Ÿšถโ€โ™€ woman walking
1692+1F6B6 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿปโ€โ™€๏ธ woman walking: light skin tone
1693+1F6B6 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿšถ๐Ÿปโ€โ™€ woman walking: light skin tone
1694+1F6B6 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿผโ€โ™€๏ธ woman walking: medium-light skin tone
1695+1F6B6 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿšถ๐Ÿผโ€โ™€ woman walking: medium-light skin tone
1696+1F6B6 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿฝโ€โ™€๏ธ woman walking: medium skin tone
1697+1F6B6 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿšถ๐Ÿฝโ€โ™€ woman walking: medium skin tone
1698+1F6B6 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿพโ€โ™€๏ธ woman walking: medium-dark skin tone
1699+1F6B6 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿšถ๐Ÿพโ€โ™€ woman walking: medium-dark skin tone
1700+1F6B6 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿฟโ€โ™€๏ธ woman walking: dark skin tone
1701+1F6B6 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿšถ๐Ÿฟโ€โ™€ woman walking: dark skin tone
1702+1F9CD ; fully-qualified # ๐Ÿง person standing
1703+1F9CD 1F3FB ; fully-qualified # ๐Ÿง๐Ÿป person standing: light skin tone
1704+1F9CD 1F3FC ; fully-qualified # ๐Ÿง๐Ÿผ person standing: medium-light skin tone
1705+1F9CD 1F3FD ; fully-qualified # ๐Ÿง๐Ÿฝ person standing: medium skin tone
1706+1F9CD 1F3FE ; fully-qualified # ๐Ÿง๐Ÿพ person standing: medium-dark skin tone
1707+1F9CD 1F3FF ; fully-qualified # ๐Ÿง๐Ÿฟ person standing: dark skin tone
1708+1F9CD 200D 2642 FE0F ; fully-qualified # ๐Ÿงโ€โ™‚๏ธ man standing
1709+1F9CD 200D 2642 ; minimally-qualified # ๐Ÿงโ€โ™‚ man standing
1710+1F9CD 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿปโ€โ™‚๏ธ man standing: light skin tone
1711+1F9CD 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿปโ€โ™‚ man standing: light skin tone
1712+1F9CD 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿผโ€โ™‚๏ธ man standing: medium-light skin tone
1713+1F9CD 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿผโ€โ™‚ man standing: medium-light skin tone
1714+1F9CD 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿฝโ€โ™‚๏ธ man standing: medium skin tone
1715+1F9CD 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿฝโ€โ™‚ man standing: medium skin tone
1716+1F9CD 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿพโ€โ™‚๏ธ man standing: medium-dark skin tone
1717+1F9CD 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿพโ€โ™‚ man standing: medium-dark skin tone
1718+1F9CD 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿฟโ€โ™‚๏ธ man standing: dark skin tone
1719+1F9CD 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿง๐Ÿฟโ€โ™‚ man standing: dark skin tone
1720+1F9CD 200D 2640 FE0F ; fully-qualified # ๐Ÿงโ€โ™€๏ธ woman standing
1721+1F9CD 200D 2640 ; minimally-qualified # ๐Ÿงโ€โ™€ woman standing
1722+1F9CD 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿปโ€โ™€๏ธ woman standing: light skin tone
1723+1F9CD 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿปโ€โ™€ woman standing: light skin tone
1724+1F9CD 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿผโ€โ™€๏ธ woman standing: medium-light skin tone
1725+1F9CD 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿผโ€โ™€ woman standing: medium-light skin tone
1726+1F9CD 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿฝโ€โ™€๏ธ woman standing: medium skin tone
1727+1F9CD 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿฝโ€โ™€ woman standing: medium skin tone
1728+1F9CD 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿพโ€โ™€๏ธ woman standing: medium-dark skin tone
1729+1F9CD 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿพโ€โ™€ woman standing: medium-dark skin tone
1730+1F9CD 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿฟโ€โ™€๏ธ woman standing: dark skin tone
1731+1F9CD 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿง๐Ÿฟโ€โ™€ woman standing: dark skin tone
1732+1F9CE ; fully-qualified # ๐ŸงŽ person kneeling
1733+1F9CE 1F3FB ; fully-qualified # ๐ŸงŽ๐Ÿป person kneeling: light skin tone
1734+1F9CE 1F3FC ; fully-qualified # ๐ŸงŽ๐Ÿผ person kneeling: medium-light skin tone
1735+1F9CE 1F3FD ; fully-qualified # ๐ŸงŽ๐Ÿฝ person kneeling: medium skin tone
1736+1F9CE 1F3FE ; fully-qualified # ๐ŸงŽ๐Ÿพ person kneeling: medium-dark skin tone
1737+1F9CE 1F3FF ; fully-qualified # ๐ŸงŽ๐Ÿฟ person kneeling: dark skin tone
1738+1F9CE 200D 2642 FE0F ; fully-qualified # ๐ŸงŽโ€โ™‚๏ธ man kneeling
1739+1F9CE 200D 2642 ; minimally-qualified # ๐ŸงŽโ€โ™‚ man kneeling
1740+1F9CE 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ŸงŽ๐Ÿปโ€โ™‚๏ธ man kneeling: light skin tone
1741+1F9CE 1F3FB 200D 2642 ; minimally-qualified # ๐ŸงŽ๐Ÿปโ€โ™‚ man kneeling: light skin tone
1742+1F9CE 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ŸงŽ๐Ÿผโ€โ™‚๏ธ man kneeling: medium-light skin tone
1743+1F9CE 1F3FC 200D 2642 ; minimally-qualified # ๐ŸงŽ๐Ÿผโ€โ™‚ man kneeling: medium-light skin tone
1744+1F9CE 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ŸงŽ๐Ÿฝโ€โ™‚๏ธ man kneeling: medium skin tone
1745+1F9CE 1F3FD 200D 2642 ; minimally-qualified # ๐ŸงŽ๐Ÿฝโ€โ™‚ man kneeling: medium skin tone
1746+1F9CE 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ŸงŽ๐Ÿพโ€โ™‚๏ธ man kneeling: medium-dark skin tone
1747+1F9CE 1F3FE 200D 2642 ; minimally-qualified # ๐ŸงŽ๐Ÿพโ€โ™‚ man kneeling: medium-dark skin tone
1748+1F9CE 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ŸงŽ๐Ÿฟโ€โ™‚๏ธ man kneeling: dark skin tone
1749+1F9CE 1F3FF 200D 2642 ; minimally-qualified # ๐ŸงŽ๐Ÿฟโ€โ™‚ man kneeling: dark skin tone
1750+1F9CE 200D 2640 FE0F ; fully-qualified # ๐ŸงŽโ€โ™€๏ธ woman kneeling
1751+1F9CE 200D 2640 ; minimally-qualified # ๐ŸงŽโ€โ™€ woman kneeling
1752+1F9CE 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ŸงŽ๐Ÿปโ€โ™€๏ธ woman kneeling: light skin tone
1753+1F9CE 1F3FB 200D 2640 ; minimally-qualified # ๐ŸงŽ๐Ÿปโ€โ™€ woman kneeling: light skin tone
1754+1F9CE 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ŸงŽ๐Ÿผโ€โ™€๏ธ woman kneeling: medium-light skin tone
1755+1F9CE 1F3FC 200D 2640 ; minimally-qualified # ๐ŸงŽ๐Ÿผโ€โ™€ woman kneeling: medium-light skin tone
1756+1F9CE 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ŸงŽ๐Ÿฝโ€โ™€๏ธ woman kneeling: medium skin tone
1757+1F9CE 1F3FD 200D 2640 ; minimally-qualified # ๐ŸงŽ๐Ÿฝโ€โ™€ woman kneeling: medium skin tone
1758+1F9CE 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ŸงŽ๐Ÿพโ€โ™€๏ธ woman kneeling: medium-dark skin tone
1759+1F9CE 1F3FE 200D 2640 ; minimally-qualified # ๐ŸงŽ๐Ÿพโ€โ™€ woman kneeling: medium-dark skin tone
1760+1F9CE 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ŸงŽ๐Ÿฟโ€โ™€๏ธ woman kneeling: dark skin tone
1761+1F9CE 1F3FF 200D 2640 ; minimally-qualified # ๐ŸงŽ๐Ÿฟโ€โ™€ woman kneeling: dark skin tone
1762+1F468 200D 1F9AF ; fully-qualified # ๐Ÿ‘จโ€๐Ÿฆฏ man with probing cane
1763+1F468 1F3FB 200D 1F9AF ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฏ man with probing cane: light skin tone
1764+1F468 1F3FC 200D 1F9AF ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฏ man with probing cane: medium-light skin tone
1765+1F468 1F3FD 200D 1F9AF ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฏ man with probing cane: medium skin tone
1766+1F468 1F3FE 200D 1F9AF ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฏ man with probing cane: medium-dark skin tone
1767+1F468 1F3FF 200D 1F9AF ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฏ man with probing cane: dark skin tone
1768+1F469 200D 1F9AF ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿฆฏ woman with probing cane
1769+1F469 1F3FB 200D 1F9AF ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฏ woman with probing cane: light skin tone
1770+1F469 1F3FC 200D 1F9AF ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฏ woman with probing cane: medium-light skin tone
1771+1F469 1F3FD 200D 1F9AF ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฏ woman with probing cane: medium skin tone
1772+1F469 1F3FE 200D 1F9AF ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฏ woman with probing cane: medium-dark skin tone
1773+1F469 1F3FF 200D 1F9AF ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฏ woman with probing cane: dark skin tone
1774+1F468 200D 1F9BC ; fully-qualified # ๐Ÿ‘จโ€๐Ÿฆผ man in motorized wheelchair
1775+1F468 1F3FB 200D 1F9BC ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿฆผ man in motorized wheelchair: light skin tone
1776+1F468 1F3FC 200D 1F9BC ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿฆผ man in motorized wheelchair: medium-light skin tone
1777+1F468 1F3FD 200D 1F9BC ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆผ man in motorized wheelchair: medium skin tone
1778+1F468 1F3FE 200D 1F9BC ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿฆผ man in motorized wheelchair: medium-dark skin tone
1779+1F468 1F3FF 200D 1F9BC ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆผ man in motorized wheelchair: dark skin tone
1780+1F469 200D 1F9BC ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿฆผ woman in motorized wheelchair
1781+1F469 1F3FB 200D 1F9BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆผ woman in motorized wheelchair: light skin tone
1782+1F469 1F3FC 200D 1F9BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆผ woman in motorized wheelchair: medium-light skin tone
1783+1F469 1F3FD 200D 1F9BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆผ woman in motorized wheelchair: medium skin tone
1784+1F469 1F3FE 200D 1F9BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆผ woman in motorized wheelchair: medium-dark skin tone
1785+1F469 1F3FF 200D 1F9BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆผ woman in motorized wheelchair: dark skin tone
1786+1F468 200D 1F9BD ; fully-qualified # ๐Ÿ‘จโ€๐Ÿฆฝ man in manual wheelchair
1787+1F468 1F3FB 200D 1F9BD ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฝ man in manual wheelchair: light skin tone
1788+1F468 1F3FC 200D 1F9BD ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฝ man in manual wheelchair: medium-light skin tone
1789+1F468 1F3FD 200D 1F9BD ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฝ man in manual wheelchair: medium skin tone
1790+1F468 1F3FE 200D 1F9BD ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฝ man in manual wheelchair: medium-dark skin tone
1791+1F468 1F3FF 200D 1F9BD ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฝ man in manual wheelchair: dark skin tone
1792+1F469 200D 1F9BD ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿฆฝ woman in manual wheelchair
1793+1F469 1F3FB 200D 1F9BD ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฝ woman in manual wheelchair: light skin tone
1794+1F469 1F3FC 200D 1F9BD ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฝ woman in manual wheelchair: medium-light skin tone
1795+1F469 1F3FD 200D 1F9BD ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฝ woman in manual wheelchair: medium skin tone
1796+1F469 1F3FE 200D 1F9BD ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฝ woman in manual wheelchair: medium-dark skin tone
1797+1F469 1F3FF 200D 1F9BD ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฝ woman in manual wheelchair: dark skin tone
1798+1F3C3 ; fully-qualified # ๐Ÿƒ person running
1799+1F3C3 1F3FB ; fully-qualified # ๐Ÿƒ๐Ÿป person running: light skin tone
1800+1F3C3 1F3FC ; fully-qualified # ๐Ÿƒ๐Ÿผ person running: medium-light skin tone
1801+1F3C3 1F3FD ; fully-qualified # ๐Ÿƒ๐Ÿฝ person running: medium skin tone
1802+1F3C3 1F3FE ; fully-qualified # ๐Ÿƒ๐Ÿพ person running: medium-dark skin tone
1803+1F3C3 1F3FF ; fully-qualified # ๐Ÿƒ๐Ÿฟ person running: dark skin tone
1804+1F3C3 200D 2642 FE0F ; fully-qualified # ๐Ÿƒโ€โ™‚๏ธ man running
1805+1F3C3 200D 2642 ; minimally-qualified # ๐Ÿƒโ€โ™‚ man running
1806+1F3C3 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿปโ€โ™‚๏ธ man running: light skin tone
1807+1F3C3 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿƒ๐Ÿปโ€โ™‚ man running: light skin tone
1808+1F3C3 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿผโ€โ™‚๏ธ man running: medium-light skin tone
1809+1F3C3 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿƒ๐Ÿผโ€โ™‚ man running: medium-light skin tone
1810+1F3C3 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿฝโ€โ™‚๏ธ man running: medium skin tone
1811+1F3C3 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿƒ๐Ÿฝโ€โ™‚ man running: medium skin tone
1812+1F3C3 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿพโ€โ™‚๏ธ man running: medium-dark skin tone
1813+1F3C3 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿƒ๐Ÿพโ€โ™‚ man running: medium-dark skin tone
1814+1F3C3 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿฟโ€โ™‚๏ธ man running: dark skin tone
1815+1F3C3 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿƒ๐Ÿฟโ€โ™‚ man running: dark skin tone
1816+1F3C3 200D 2640 FE0F ; fully-qualified # ๐Ÿƒโ€โ™€๏ธ woman running
1817+1F3C3 200D 2640 ; minimally-qualified # ๐Ÿƒโ€โ™€ woman running
1818+1F3C3 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿปโ€โ™€๏ธ woman running: light skin tone
1819+1F3C3 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿƒ๐Ÿปโ€โ™€ woman running: light skin tone
1820+1F3C3 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿผโ€โ™€๏ธ woman running: medium-light skin tone
1821+1F3C3 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿƒ๐Ÿผโ€โ™€ woman running: medium-light skin tone
1822+1F3C3 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿฝโ€โ™€๏ธ woman running: medium skin tone
1823+1F3C3 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿƒ๐Ÿฝโ€โ™€ woman running: medium skin tone
1824+1F3C3 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿพโ€โ™€๏ธ woman running: medium-dark skin tone
1825+1F3C3 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿƒ๐Ÿพโ€โ™€ woman running: medium-dark skin tone
1826+1F3C3 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿฟโ€โ™€๏ธ woman running: dark skin tone
1827+1F3C3 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿƒ๐Ÿฟโ€โ™€ woman running: dark skin tone
1828+1F483 ; fully-qualified # ๐Ÿ’ƒ woman dancing
1829+1F483 1F3FB ; fully-qualified # ๐Ÿ’ƒ๐Ÿป woman dancing: light skin tone
1830+1F483 1F3FC ; fully-qualified # ๐Ÿ’ƒ๐Ÿผ woman dancing: medium-light skin tone
1831+1F483 1F3FD ; fully-qualified # ๐Ÿ’ƒ๐Ÿฝ woman dancing: medium skin tone
1832+1F483 1F3FE ; fully-qualified # ๐Ÿ’ƒ๐Ÿพ woman dancing: medium-dark skin tone
1833+1F483 1F3FF ; fully-qualified # ๐Ÿ’ƒ๐Ÿฟ woman dancing: dark skin tone
1834+1F57A ; fully-qualified # ๐Ÿ•บ man dancing
1835+1F57A 1F3FB ; fully-qualified # ๐Ÿ•บ๐Ÿป man dancing: light skin tone
1836+1F57A 1F3FC ; fully-qualified # ๐Ÿ•บ๐Ÿผ man dancing: medium-light skin tone
1837+1F57A 1F3FD ; fully-qualified # ๐Ÿ•บ๐Ÿฝ man dancing: medium skin tone
1838+1F57A 1F3FE ; fully-qualified # ๐Ÿ•บ๐Ÿพ man dancing: medium-dark skin tone
1839+1F57A 1F3FF ; fully-qualified # ๐Ÿ•บ๐Ÿฟ man dancing: dark skin tone
1840+1F574 FE0F ; fully-qualified # ๐Ÿ•ด๏ธ man in suit levitating
1841+1F574 ; unqualified # ๐Ÿ•ด man in suit levitating
1842+1F574 1F3FB ; fully-qualified # ๐Ÿ•ด๐Ÿป man in suit levitating: light skin tone
1843+1F574 1F3FC ; fully-qualified # ๐Ÿ•ด๐Ÿผ man in suit levitating: medium-light skin tone
1844+1F574 1F3FD ; fully-qualified # ๐Ÿ•ด๐Ÿฝ man in suit levitating: medium skin tone
1845+1F574 1F3FE ; fully-qualified # ๐Ÿ•ด๐Ÿพ man in suit levitating: medium-dark skin tone
1846+1F574 1F3FF ; fully-qualified # ๐Ÿ•ด๐Ÿฟ man in suit levitating: dark skin tone
1847+1F46F ; fully-qualified # ๐Ÿ‘ฏ people with bunny ears
1848+1F46F 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฏโ€โ™‚๏ธ men with bunny ears
1849+1F46F 200D 2642 ; minimally-qualified # ๐Ÿ‘ฏโ€โ™‚ men with bunny ears
1850+1F46F 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฏโ€โ™€๏ธ women with bunny ears
1851+1F46F 200D 2640 ; minimally-qualified # ๐Ÿ‘ฏโ€โ™€ women with bunny ears
1852+1F9D6 ; fully-qualified # ๐Ÿง– person in steamy room
1853+1F9D6 1F3FB ; fully-qualified # ๐Ÿง–๐Ÿป person in steamy room: light skin tone
1854+1F9D6 1F3FC ; fully-qualified # ๐Ÿง–๐Ÿผ person in steamy room: medium-light skin tone
1855+1F9D6 1F3FD ; fully-qualified # ๐Ÿง–๐Ÿฝ person in steamy room: medium skin tone
1856+1F9D6 1F3FE ; fully-qualified # ๐Ÿง–๐Ÿพ person in steamy room: medium-dark skin tone
1857+1F9D6 1F3FF ; fully-qualified # ๐Ÿง–๐Ÿฟ person in steamy room: dark skin tone
1858+1F9D6 200D 2642 FE0F ; fully-qualified # ๐Ÿง–โ€โ™‚๏ธ man in steamy room
1859+1F9D6 200D 2642 ; minimally-qualified # ๐Ÿง–โ€โ™‚ man in steamy room
1860+1F9D6 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿง–๐Ÿปโ€โ™‚๏ธ man in steamy room: light skin tone
1861+1F9D6 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿง–๐Ÿปโ€โ™‚ man in steamy room: light skin tone
1862+1F9D6 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿง–๐Ÿผโ€โ™‚๏ธ man in steamy room: medium-light skin tone
1863+1F9D6 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿง–๐Ÿผโ€โ™‚ man in steamy room: medium-light skin tone
1864+1F9D6 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿง–๐Ÿฝโ€โ™‚๏ธ man in steamy room: medium skin tone
1865+1F9D6 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿง–๐Ÿฝโ€โ™‚ man in steamy room: medium skin tone
1866+1F9D6 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿง–๐Ÿพโ€โ™‚๏ธ man in steamy room: medium-dark skin tone
1867+1F9D6 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿง–๐Ÿพโ€โ™‚ man in steamy room: medium-dark skin tone
1868+1F9D6 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿง–๐Ÿฟโ€โ™‚๏ธ man in steamy room: dark skin tone
1869+1F9D6 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿง–๐Ÿฟโ€โ™‚ man in steamy room: dark skin tone
1870+1F9D6 200D 2640 FE0F ; fully-qualified # ๐Ÿง–โ€โ™€๏ธ woman in steamy room
1871+1F9D6 200D 2640 ; minimally-qualified # ๐Ÿง–โ€โ™€ woman in steamy room
1872+1F9D6 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿง–๐Ÿปโ€โ™€๏ธ woman in steamy room: light skin tone
1873+1F9D6 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿง–๐Ÿปโ€โ™€ woman in steamy room: light skin tone
1874+1F9D6 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿง–๐Ÿผโ€โ™€๏ธ woman in steamy room: medium-light skin tone
1875+1F9D6 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿง–๐Ÿผโ€โ™€ woman in steamy room: medium-light skin tone
1876+1F9D6 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿง–๐Ÿฝโ€โ™€๏ธ woman in steamy room: medium skin tone
1877+1F9D6 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿง–๐Ÿฝโ€โ™€ woman in steamy room: medium skin tone
1878+1F9D6 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿง–๐Ÿพโ€โ™€๏ธ woman in steamy room: medium-dark skin tone
1879+1F9D6 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿง–๐Ÿพโ€โ™€ woman in steamy room: medium-dark skin tone
1880+1F9D6 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿง–๐Ÿฟโ€โ™€๏ธ woman in steamy room: dark skin tone
1881+1F9D6 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿง–๐Ÿฟโ€โ™€ woman in steamy room: dark skin tone
1882+1F9D7 ; fully-qualified # ๐Ÿง— person climbing
1883+1F9D7 1F3FB ; fully-qualified # ๐Ÿง—๐Ÿป person climbing: light skin tone
1884+1F9D7 1F3FC ; fully-qualified # ๐Ÿง—๐Ÿผ person climbing: medium-light skin tone
1885+1F9D7 1F3FD ; fully-qualified # ๐Ÿง—๐Ÿฝ person climbing: medium skin tone
1886+1F9D7 1F3FE ; fully-qualified # ๐Ÿง—๐Ÿพ person climbing: medium-dark skin tone
1887+1F9D7 1F3FF ; fully-qualified # ๐Ÿง—๐Ÿฟ person climbing: dark skin tone
1888+1F9D7 200D 2642 FE0F ; fully-qualified # ๐Ÿง—โ€โ™‚๏ธ man climbing
1889+1F9D7 200D 2642 ; minimally-qualified # ๐Ÿง—โ€โ™‚ man climbing
1890+1F9D7 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿง—๐Ÿปโ€โ™‚๏ธ man climbing: light skin tone
1891+1F9D7 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿง—๐Ÿปโ€โ™‚ man climbing: light skin tone
1892+1F9D7 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿง—๐Ÿผโ€โ™‚๏ธ man climbing: medium-light skin tone
1893+1F9D7 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿง—๐Ÿผโ€โ™‚ man climbing: medium-light skin tone
1894+1F9D7 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿง—๐Ÿฝโ€โ™‚๏ธ man climbing: medium skin tone
1895+1F9D7 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿง—๐Ÿฝโ€โ™‚ man climbing: medium skin tone
1896+1F9D7 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿง—๐Ÿพโ€โ™‚๏ธ man climbing: medium-dark skin tone
1897+1F9D7 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿง—๐Ÿพโ€โ™‚ man climbing: medium-dark skin tone
1898+1F9D7 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿง—๐Ÿฟโ€โ™‚๏ธ man climbing: dark skin tone
1899+1F9D7 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿง—๐Ÿฟโ€โ™‚ man climbing: dark skin tone
1900+1F9D7 200D 2640 FE0F ; fully-qualified # ๐Ÿง—โ€โ™€๏ธ woman climbing
1901+1F9D7 200D 2640 ; minimally-qualified # ๐Ÿง—โ€โ™€ woman climbing
1902+1F9D7 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿง—๐Ÿปโ€โ™€๏ธ woman climbing: light skin tone
1903+1F9D7 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿง—๐Ÿปโ€โ™€ woman climbing: light skin tone
1904+1F9D7 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿง—๐Ÿผโ€โ™€๏ธ woman climbing: medium-light skin tone
1905+1F9D7 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿง—๐Ÿผโ€โ™€ woman climbing: medium-light skin tone
1906+1F9D7 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿง—๐Ÿฝโ€โ™€๏ธ woman climbing: medium skin tone
1907+1F9D7 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿง—๐Ÿฝโ€โ™€ woman climbing: medium skin tone
1908+1F9D7 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿง—๐Ÿพโ€โ™€๏ธ woman climbing: medium-dark skin tone
1909+1F9D7 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿง—๐Ÿพโ€โ™€ woman climbing: medium-dark skin tone
1910+1F9D7 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿง—๐Ÿฟโ€โ™€๏ธ woman climbing: dark skin tone
1911+1F9D7 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿง—๐Ÿฟโ€โ™€ woman climbing: dark skin tone
1912+
1913+# subgroup: person-sport
1914+1F93A ; fully-qualified # ๐Ÿคบ person fencing
1915+1F3C7 ; fully-qualified # ๐Ÿ‡ horse racing
1916+1F3C7 1F3FB ; fully-qualified # ๐Ÿ‡๐Ÿป horse racing: light skin tone
1917+1F3C7 1F3FC ; fully-qualified # ๐Ÿ‡๐Ÿผ horse racing: medium-light skin tone
1918+1F3C7 1F3FD ; fully-qualified # ๐Ÿ‡๐Ÿฝ horse racing: medium skin tone
1919+1F3C7 1F3FE ; fully-qualified # ๐Ÿ‡๐Ÿพ horse racing: medium-dark skin tone
1920+1F3C7 1F3FF ; fully-qualified # ๐Ÿ‡๐Ÿฟ horse racing: dark skin tone
1921+26F7 FE0F ; fully-qualified # โ›ท๏ธ skier
1922+26F7 ; unqualified # โ›ท skier
1923+1F3C2 ; fully-qualified # ๐Ÿ‚ snowboarder
1924+1F3C2 1F3FB ; fully-qualified # ๐Ÿ‚๐Ÿป snowboarder: light skin tone
1925+1F3C2 1F3FC ; fully-qualified # ๐Ÿ‚๐Ÿผ snowboarder: medium-light skin tone
1926+1F3C2 1F3FD ; fully-qualified # ๐Ÿ‚๐Ÿฝ snowboarder: medium skin tone
1927+1F3C2 1F3FE ; fully-qualified # ๐Ÿ‚๐Ÿพ snowboarder: medium-dark skin tone
1928+1F3C2 1F3FF ; fully-qualified # ๐Ÿ‚๐Ÿฟ snowboarder: dark skin tone
1929+1F3CC FE0F ; fully-qualified # ๐ŸŒ๏ธ person golfing
1930+1F3CC ; unqualified # ๐ŸŒ person golfing
1931+1F3CC 1F3FB ; fully-qualified # ๐ŸŒ๐Ÿป person golfing: light skin tone
1932+1F3CC 1F3FC ; fully-qualified # ๐ŸŒ๐Ÿผ person golfing: medium-light skin tone
1933+1F3CC 1F3FD ; fully-qualified # ๐ŸŒ๐Ÿฝ person golfing: medium skin tone
1934+1F3CC 1F3FE ; fully-qualified # ๐ŸŒ๐Ÿพ person golfing: medium-dark skin tone
1935+1F3CC 1F3FF ; fully-qualified # ๐ŸŒ๐Ÿฟ person golfing: dark skin tone
1936+1F3CC FE0F 200D 2642 FE0F ; fully-qualified # ๐ŸŒ๏ธโ€โ™‚๏ธ man golfing
1937+1F3CC 200D 2642 FE0F ; unqualified # ๐ŸŒโ€โ™‚๏ธ man golfing
1938+1F3CC FE0F 200D 2642 ; unqualified # ๐ŸŒ๏ธโ€โ™‚ man golfing
1939+1F3CC 200D 2642 ; unqualified # ๐ŸŒโ€โ™‚ man golfing
1940+1F3CC 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ŸŒ๐Ÿปโ€โ™‚๏ธ man golfing: light skin tone
1941+1F3CC 1F3FB 200D 2642 ; minimally-qualified # ๐ŸŒ๐Ÿปโ€โ™‚ man golfing: light skin tone
1942+1F3CC 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ŸŒ๐Ÿผโ€โ™‚๏ธ man golfing: medium-light skin tone
1943+1F3CC 1F3FC 200D 2642 ; minimally-qualified # ๐ŸŒ๐Ÿผโ€โ™‚ man golfing: medium-light skin tone
1944+1F3CC 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ŸŒ๐Ÿฝโ€โ™‚๏ธ man golfing: medium skin tone
1945+1F3CC 1F3FD 200D 2642 ; minimally-qualified # ๐ŸŒ๐Ÿฝโ€โ™‚ man golfing: medium skin tone
1946+1F3CC 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ŸŒ๐Ÿพโ€โ™‚๏ธ man golfing: medium-dark skin tone
1947+1F3CC 1F3FE 200D 2642 ; minimally-qualified # ๐ŸŒ๐Ÿพโ€โ™‚ man golfing: medium-dark skin tone
1948+1F3CC 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ŸŒ๐Ÿฟโ€โ™‚๏ธ man golfing: dark skin tone
1949+1F3CC 1F3FF 200D 2642 ; minimally-qualified # ๐ŸŒ๐Ÿฟโ€โ™‚ man golfing: dark skin tone
1950+1F3CC FE0F 200D 2640 FE0F ; fully-qualified # ๐ŸŒ๏ธโ€โ™€๏ธ woman golfing
1951+1F3CC 200D 2640 FE0F ; unqualified # ๐ŸŒโ€โ™€๏ธ woman golfing
1952+1F3CC FE0F 200D 2640 ; unqualified # ๐ŸŒ๏ธโ€โ™€ woman golfing
1953+1F3CC 200D 2640 ; unqualified # ๐ŸŒโ€โ™€ woman golfing
1954+1F3CC 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ŸŒ๐Ÿปโ€โ™€๏ธ woman golfing: light skin tone
1955+1F3CC 1F3FB 200D 2640 ; minimally-qualified # ๐ŸŒ๐Ÿปโ€โ™€ woman golfing: light skin tone
1956+1F3CC 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ŸŒ๐Ÿผโ€โ™€๏ธ woman golfing: medium-light skin tone
1957+1F3CC 1F3FC 200D 2640 ; minimally-qualified # ๐ŸŒ๐Ÿผโ€โ™€ woman golfing: medium-light skin tone
1958+1F3CC 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ŸŒ๐Ÿฝโ€โ™€๏ธ woman golfing: medium skin tone
1959+1F3CC 1F3FD 200D 2640 ; minimally-qualified # ๐ŸŒ๐Ÿฝโ€โ™€ woman golfing: medium skin tone
1960+1F3CC 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ŸŒ๐Ÿพโ€โ™€๏ธ woman golfing: medium-dark skin tone
1961+1F3CC 1F3FE 200D 2640 ; minimally-qualified # ๐ŸŒ๐Ÿพโ€โ™€ woman golfing: medium-dark skin tone
1962+1F3CC 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ŸŒ๐Ÿฟโ€โ™€๏ธ woman golfing: dark skin tone
1963+1F3CC 1F3FF 200D 2640 ; minimally-qualified # ๐ŸŒ๐Ÿฟโ€โ™€ woman golfing: dark skin tone
1964+1F3C4 ; fully-qualified # ๐Ÿ„ person surfing
1965+1F3C4 1F3FB ; fully-qualified # ๐Ÿ„๐Ÿป person surfing: light skin tone
1966+1F3C4 1F3FC ; fully-qualified # ๐Ÿ„๐Ÿผ person surfing: medium-light skin tone
1967+1F3C4 1F3FD ; fully-qualified # ๐Ÿ„๐Ÿฝ person surfing: medium skin tone
1968+1F3C4 1F3FE ; fully-qualified # ๐Ÿ„๐Ÿพ person surfing: medium-dark skin tone
1969+1F3C4 1F3FF ; fully-qualified # ๐Ÿ„๐Ÿฟ person surfing: dark skin tone
1970+1F3C4 200D 2642 FE0F ; fully-qualified # ๐Ÿ„โ€โ™‚๏ธ man surfing
1971+1F3C4 200D 2642 ; minimally-qualified # ๐Ÿ„โ€โ™‚ man surfing
1972+1F3C4 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ„๐Ÿปโ€โ™‚๏ธ man surfing: light skin tone
1973+1F3C4 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ„๐Ÿปโ€โ™‚ man surfing: light skin tone
1974+1F3C4 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ„๐Ÿผโ€โ™‚๏ธ man surfing: medium-light skin tone
1975+1F3C4 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ„๐Ÿผโ€โ™‚ man surfing: medium-light skin tone
1976+1F3C4 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ„๐Ÿฝโ€โ™‚๏ธ man surfing: medium skin tone
1977+1F3C4 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ„๐Ÿฝโ€โ™‚ man surfing: medium skin tone
1978+1F3C4 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ„๐Ÿพโ€โ™‚๏ธ man surfing: medium-dark skin tone
1979+1F3C4 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ„๐Ÿพโ€โ™‚ man surfing: medium-dark skin tone
1980+1F3C4 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ„๐Ÿฟโ€โ™‚๏ธ man surfing: dark skin tone
1981+1F3C4 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ„๐Ÿฟโ€โ™‚ man surfing: dark skin tone
1982+1F3C4 200D 2640 FE0F ; fully-qualified # ๐Ÿ„โ€โ™€๏ธ woman surfing
1983+1F3C4 200D 2640 ; minimally-qualified # ๐Ÿ„โ€โ™€ woman surfing
1984+1F3C4 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ„๐Ÿปโ€โ™€๏ธ woman surfing: light skin tone
1985+1F3C4 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ„๐Ÿปโ€โ™€ woman surfing: light skin tone
1986+1F3C4 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ„๐Ÿผโ€โ™€๏ธ woman surfing: medium-light skin tone
1987+1F3C4 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ„๐Ÿผโ€โ™€ woman surfing: medium-light skin tone
1988+1F3C4 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ„๐Ÿฝโ€โ™€๏ธ woman surfing: medium skin tone
1989+1F3C4 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ„๐Ÿฝโ€โ™€ woman surfing: medium skin tone
1990+1F3C4 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ„๐Ÿพโ€โ™€๏ธ woman surfing: medium-dark skin tone
1991+1F3C4 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ„๐Ÿพโ€โ™€ woman surfing: medium-dark skin tone
1992+1F3C4 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ„๐Ÿฟโ€โ™€๏ธ woman surfing: dark skin tone
1993+1F3C4 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ„๐Ÿฟโ€โ™€ woman surfing: dark skin tone
1994+1F6A3 ; fully-qualified # ๐Ÿšฃ person rowing boat
1995+1F6A3 1F3FB ; fully-qualified # ๐Ÿšฃ๐Ÿป person rowing boat: light skin tone
1996+1F6A3 1F3FC ; fully-qualified # ๐Ÿšฃ๐Ÿผ person rowing boat: medium-light skin tone
1997+1F6A3 1F3FD ; fully-qualified # ๐Ÿšฃ๐Ÿฝ person rowing boat: medium skin tone
1998+1F6A3 1F3FE ; fully-qualified # ๐Ÿšฃ๐Ÿพ person rowing boat: medium-dark skin tone
1999+1F6A3 1F3FF ; fully-qualified # ๐Ÿšฃ๐Ÿฟ person rowing boat: dark skin tone
2000+1F6A3 200D 2642 FE0F ; fully-qualified # ๐Ÿšฃโ€โ™‚๏ธ man rowing boat
2001+1F6A3 200D 2642 ; minimally-qualified # ๐Ÿšฃโ€โ™‚ man rowing boat
2002+1F6A3 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿปโ€โ™‚๏ธ man rowing boat: light skin tone
2003+1F6A3 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿšฃ๐Ÿปโ€โ™‚ man rowing boat: light skin tone
2004+1F6A3 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿผโ€โ™‚๏ธ man rowing boat: medium-light skin tone
2005+1F6A3 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿšฃ๐Ÿผโ€โ™‚ man rowing boat: medium-light skin tone
2006+1F6A3 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿฝโ€โ™‚๏ธ man rowing boat: medium skin tone
2007+1F6A3 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿšฃ๐Ÿฝโ€โ™‚ man rowing boat: medium skin tone
2008+1F6A3 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿพโ€โ™‚๏ธ man rowing boat: medium-dark skin tone
2009+1F6A3 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿšฃ๐Ÿพโ€โ™‚ man rowing boat: medium-dark skin tone
2010+1F6A3 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿฟโ€โ™‚๏ธ man rowing boat: dark skin tone
2011+1F6A3 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿšฃ๐Ÿฟโ€โ™‚ man rowing boat: dark skin tone
2012+1F6A3 200D 2640 FE0F ; fully-qualified # ๐Ÿšฃโ€โ™€๏ธ woman rowing boat
2013+1F6A3 200D 2640 ; minimally-qualified # ๐Ÿšฃโ€โ™€ woman rowing boat
2014+1F6A3 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿปโ€โ™€๏ธ woman rowing boat: light skin tone
2015+1F6A3 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿšฃ๐Ÿปโ€โ™€ woman rowing boat: light skin tone
2016+1F6A3 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿผโ€โ™€๏ธ woman rowing boat: medium-light skin tone
2017+1F6A3 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿšฃ๐Ÿผโ€โ™€ woman rowing boat: medium-light skin tone
2018+1F6A3 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿฝโ€โ™€๏ธ woman rowing boat: medium skin tone
2019+1F6A3 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿšฃ๐Ÿฝโ€โ™€ woman rowing boat: medium skin tone
2020+1F6A3 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿพโ€โ™€๏ธ woman rowing boat: medium-dark skin tone
2021+1F6A3 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿšฃ๐Ÿพโ€โ™€ woman rowing boat: medium-dark skin tone
2022+1F6A3 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿฟโ€โ™€๏ธ woman rowing boat: dark skin tone
2023+1F6A3 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿšฃ๐Ÿฟโ€โ™€ woman rowing boat: dark skin tone
2024+1F3CA ; fully-qualified # ๐ŸŠ person swimming
2025+1F3CA 1F3FB ; fully-qualified # ๐ŸŠ๐Ÿป person swimming: light skin tone
2026+1F3CA 1F3FC ; fully-qualified # ๐ŸŠ๐Ÿผ person swimming: medium-light skin tone
2027+1F3CA 1F3FD ; fully-qualified # ๐ŸŠ๐Ÿฝ person swimming: medium skin tone
2028+1F3CA 1F3FE ; fully-qualified # ๐ŸŠ๐Ÿพ person swimming: medium-dark skin tone
2029+1F3CA 1F3FF ; fully-qualified # ๐ŸŠ๐Ÿฟ person swimming: dark skin tone
2030+1F3CA 200D 2642 FE0F ; fully-qualified # ๐ŸŠโ€โ™‚๏ธ man swimming
2031+1F3CA 200D 2642 ; minimally-qualified # ๐ŸŠโ€โ™‚ man swimming
2032+1F3CA 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ŸŠ๐Ÿปโ€โ™‚๏ธ man swimming: light skin tone
2033+1F3CA 1F3FB 200D 2642 ; minimally-qualified # ๐ŸŠ๐Ÿปโ€โ™‚ man swimming: light skin tone
2034+1F3CA 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ŸŠ๐Ÿผโ€โ™‚๏ธ man swimming: medium-light skin tone
2035+1F3CA 1F3FC 200D 2642 ; minimally-qualified # ๐ŸŠ๐Ÿผโ€โ™‚ man swimming: medium-light skin tone
2036+1F3CA 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ŸŠ๐Ÿฝโ€โ™‚๏ธ man swimming: medium skin tone
2037+1F3CA 1F3FD 200D 2642 ; minimally-qualified # ๐ŸŠ๐Ÿฝโ€โ™‚ man swimming: medium skin tone
2038+1F3CA 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ŸŠ๐Ÿพโ€โ™‚๏ธ man swimming: medium-dark skin tone
2039+1F3CA 1F3FE 200D 2642 ; minimally-qualified # ๐ŸŠ๐Ÿพโ€โ™‚ man swimming: medium-dark skin tone
2040+1F3CA 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ŸŠ๐Ÿฟโ€โ™‚๏ธ man swimming: dark skin tone
2041+1F3CA 1F3FF 200D 2642 ; minimally-qualified # ๐ŸŠ๐Ÿฟโ€โ™‚ man swimming: dark skin tone
2042+1F3CA 200D 2640 FE0F ; fully-qualified # ๐ŸŠโ€โ™€๏ธ woman swimming
2043+1F3CA 200D 2640 ; minimally-qualified # ๐ŸŠโ€โ™€ woman swimming
2044+1F3CA 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ŸŠ๐Ÿปโ€โ™€๏ธ woman swimming: light skin tone
2045+1F3CA 1F3FB 200D 2640 ; minimally-qualified # ๐ŸŠ๐Ÿปโ€โ™€ woman swimming: light skin tone
2046+1F3CA 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ŸŠ๐Ÿผโ€โ™€๏ธ woman swimming: medium-light skin tone
2047+1F3CA 1F3FC 200D 2640 ; minimally-qualified # ๐ŸŠ๐Ÿผโ€โ™€ woman swimming: medium-light skin tone
2048+1F3CA 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ŸŠ๐Ÿฝโ€โ™€๏ธ woman swimming: medium skin tone
2049+1F3CA 1F3FD 200D 2640 ; minimally-qualified # ๐ŸŠ๐Ÿฝโ€โ™€ woman swimming: medium skin tone
2050+1F3CA 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ŸŠ๐Ÿพโ€โ™€๏ธ woman swimming: medium-dark skin tone
2051+1F3CA 1F3FE 200D 2640 ; minimally-qualified # ๐ŸŠ๐Ÿพโ€โ™€ woman swimming: medium-dark skin tone
2052+1F3CA 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ŸŠ๐Ÿฟโ€โ™€๏ธ woman swimming: dark skin tone
2053+1F3CA 1F3FF 200D 2640 ; minimally-qualified # ๐ŸŠ๐Ÿฟโ€โ™€ woman swimming: dark skin tone
2054+26F9 FE0F ; fully-qualified # โ›น๏ธ person bouncing ball
2055+26F9 ; unqualified # โ›น person bouncing ball
2056+26F9 1F3FB ; fully-qualified # โ›น๐Ÿป person bouncing ball: light skin tone
2057+26F9 1F3FC ; fully-qualified # โ›น๐Ÿผ person bouncing ball: medium-light skin tone
2058+26F9 1F3FD ; fully-qualified # โ›น๐Ÿฝ person bouncing ball: medium skin tone
2059+26F9 1F3FE ; fully-qualified # โ›น๐Ÿพ person bouncing ball: medium-dark skin tone
2060+26F9 1F3FF ; fully-qualified # โ›น๐Ÿฟ person bouncing ball: dark skin tone
2061+26F9 FE0F 200D 2642 FE0F ; fully-qualified # โ›น๏ธโ€โ™‚๏ธ man bouncing ball
2062+26F9 200D 2642 FE0F ; unqualified # โ›นโ€โ™‚๏ธ man bouncing ball
2063+26F9 FE0F 200D 2642 ; unqualified # โ›น๏ธโ€โ™‚ man bouncing ball
2064+26F9 200D 2642 ; unqualified # โ›นโ€โ™‚ man bouncing ball
2065+26F9 1F3FB 200D 2642 FE0F ; fully-qualified # โ›น๐Ÿปโ€โ™‚๏ธ man bouncing ball: light skin tone
2066+26F9 1F3FB 200D 2642 ; minimally-qualified # โ›น๐Ÿปโ€โ™‚ man bouncing ball: light skin tone
2067+26F9 1F3FC 200D 2642 FE0F ; fully-qualified # โ›น๐Ÿผโ€โ™‚๏ธ man bouncing ball: medium-light skin tone
2068+26F9 1F3FC 200D 2642 ; minimally-qualified # โ›น๐Ÿผโ€โ™‚ man bouncing ball: medium-light skin tone
2069+26F9 1F3FD 200D 2642 FE0F ; fully-qualified # โ›น๐Ÿฝโ€โ™‚๏ธ man bouncing ball: medium skin tone
2070+26F9 1F3FD 200D 2642 ; minimally-qualified # โ›น๐Ÿฝโ€โ™‚ man bouncing ball: medium skin tone
2071+26F9 1F3FE 200D 2642 FE0F ; fully-qualified # โ›น๐Ÿพโ€โ™‚๏ธ man bouncing ball: medium-dark skin tone
2072+26F9 1F3FE 200D 2642 ; minimally-qualified # โ›น๐Ÿพโ€โ™‚ man bouncing ball: medium-dark skin tone
2073+26F9 1F3FF 200D 2642 FE0F ; fully-qualified # โ›น๐Ÿฟโ€โ™‚๏ธ man bouncing ball: dark skin tone
2074+26F9 1F3FF 200D 2642 ; minimally-qualified # โ›น๐Ÿฟโ€โ™‚ man bouncing ball: dark skin tone
2075+26F9 FE0F 200D 2640 FE0F ; fully-qualified # โ›น๏ธโ€โ™€๏ธ woman bouncing ball
2076+26F9 200D 2640 FE0F ; unqualified # โ›นโ€โ™€๏ธ woman bouncing ball
2077+26F9 FE0F 200D 2640 ; unqualified # โ›น๏ธโ€โ™€ woman bouncing ball
2078+26F9 200D 2640 ; unqualified # โ›นโ€โ™€ woman bouncing ball
2079+26F9 1F3FB 200D 2640 FE0F ; fully-qualified # โ›น๐Ÿปโ€โ™€๏ธ woman bouncing ball: light skin tone
2080+26F9 1F3FB 200D 2640 ; minimally-qualified # โ›น๐Ÿปโ€โ™€ woman bouncing ball: light skin tone
2081+26F9 1F3FC 200D 2640 FE0F ; fully-qualified # โ›น๐Ÿผโ€โ™€๏ธ woman bouncing ball: medium-light skin tone
2082+26F9 1F3FC 200D 2640 ; minimally-qualified # โ›น๐Ÿผโ€โ™€ woman bouncing ball: medium-light skin tone
2083+26F9 1F3FD 200D 2640 FE0F ; fully-qualified # โ›น๐Ÿฝโ€โ™€๏ธ woman bouncing ball: medium skin tone
2084+26F9 1F3FD 200D 2640 ; minimally-qualified # โ›น๐Ÿฝโ€โ™€ woman bouncing ball: medium skin tone
2085+26F9 1F3FE 200D 2640 FE0F ; fully-qualified # โ›น๐Ÿพโ€โ™€๏ธ woman bouncing ball: medium-dark skin tone
2086+26F9 1F3FE 200D 2640 ; minimally-qualified # โ›น๐Ÿพโ€โ™€ woman bouncing ball: medium-dark skin tone
2087+26F9 1F3FF 200D 2640 FE0F ; fully-qualified # โ›น๐Ÿฟโ€โ™€๏ธ woman bouncing ball: dark skin tone
2088+26F9 1F3FF 200D 2640 ; minimally-qualified # โ›น๐Ÿฟโ€โ™€ woman bouncing ball: dark skin tone
2089+1F3CB FE0F ; fully-qualified # ๐Ÿ‹๏ธ person lifting weights
2090+1F3CB ; unqualified # ๐Ÿ‹ person lifting weights
2091+1F3CB 1F3FB ; fully-qualified # ๐Ÿ‹๐Ÿป person lifting weights: light skin tone
2092+1F3CB 1F3FC ; fully-qualified # ๐Ÿ‹๐Ÿผ person lifting weights: medium-light skin tone
2093+1F3CB 1F3FD ; fully-qualified # ๐Ÿ‹๐Ÿฝ person lifting weights: medium skin tone
2094+1F3CB 1F3FE ; fully-qualified # ๐Ÿ‹๐Ÿพ person lifting weights: medium-dark skin tone
2095+1F3CB 1F3FF ; fully-qualified # ๐Ÿ‹๐Ÿฟ person lifting weights: dark skin tone
2096+1F3CB FE0F 200D 2642 FE0F ; fully-qualified # ๐Ÿ‹๏ธโ€โ™‚๏ธ man lifting weights
2097+1F3CB 200D 2642 FE0F ; unqualified # ๐Ÿ‹โ€โ™‚๏ธ man lifting weights
2098+1F3CB FE0F 200D 2642 ; unqualified # ๐Ÿ‹๏ธโ€โ™‚ man lifting weights
2099+1F3CB 200D 2642 ; unqualified # ๐Ÿ‹โ€โ™‚ man lifting weights
2100+1F3CB 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿปโ€โ™‚๏ธ man lifting weights: light skin tone
2101+1F3CB 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿ‹๐Ÿปโ€โ™‚ man lifting weights: light skin tone
2102+1F3CB 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿผโ€โ™‚๏ธ man lifting weights: medium-light skin tone
2103+1F3CB 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿ‹๐Ÿผโ€โ™‚ man lifting weights: medium-light skin tone
2104+1F3CB 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿฝโ€โ™‚๏ธ man lifting weights: medium skin tone
2105+1F3CB 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿ‹๐Ÿฝโ€โ™‚ man lifting weights: medium skin tone
2106+1F3CB 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿพโ€โ™‚๏ธ man lifting weights: medium-dark skin tone
2107+1F3CB 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿ‹๐Ÿพโ€โ™‚ man lifting weights: medium-dark skin tone
2108+1F3CB 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿฟโ€โ™‚๏ธ man lifting weights: dark skin tone
2109+1F3CB 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿ‹๐Ÿฟโ€โ™‚ man lifting weights: dark skin tone
2110+1F3CB FE0F 200D 2640 FE0F ; fully-qualified # ๐Ÿ‹๏ธโ€โ™€๏ธ woman lifting weights
2111+1F3CB 200D 2640 FE0F ; unqualified # ๐Ÿ‹โ€โ™€๏ธ woman lifting weights
2112+1F3CB FE0F 200D 2640 ; unqualified # ๐Ÿ‹๏ธโ€โ™€ woman lifting weights
2113+1F3CB 200D 2640 ; unqualified # ๐Ÿ‹โ€โ™€ woman lifting weights
2114+1F3CB 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿปโ€โ™€๏ธ woman lifting weights: light skin tone
2115+1F3CB 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿ‹๐Ÿปโ€โ™€ woman lifting weights: light skin tone
2116+1F3CB 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿผโ€โ™€๏ธ woman lifting weights: medium-light skin tone
2117+1F3CB 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿ‹๐Ÿผโ€โ™€ woman lifting weights: medium-light skin tone
2118+1F3CB 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿฝโ€โ™€๏ธ woman lifting weights: medium skin tone
2119+1F3CB 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿ‹๐Ÿฝโ€โ™€ woman lifting weights: medium skin tone
2120+1F3CB 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿพโ€โ™€๏ธ woman lifting weights: medium-dark skin tone
2121+1F3CB 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿ‹๐Ÿพโ€โ™€ woman lifting weights: medium-dark skin tone
2122+1F3CB 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿฟโ€โ™€๏ธ woman lifting weights: dark skin tone
2123+1F3CB 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿ‹๐Ÿฟโ€โ™€ woman lifting weights: dark skin tone
2124+1F6B4 ; fully-qualified # ๐Ÿšด person biking
2125+1F6B4 1F3FB ; fully-qualified # ๐Ÿšด๐Ÿป person biking: light skin tone
2126+1F6B4 1F3FC ; fully-qualified # ๐Ÿšด๐Ÿผ person biking: medium-light skin tone
2127+1F6B4 1F3FD ; fully-qualified # ๐Ÿšด๐Ÿฝ person biking: medium skin tone
2128+1F6B4 1F3FE ; fully-qualified # ๐Ÿšด๐Ÿพ person biking: medium-dark skin tone
2129+1F6B4 1F3FF ; fully-qualified # ๐Ÿšด๐Ÿฟ person biking: dark skin tone
2130+1F6B4 200D 2642 FE0F ; fully-qualified # ๐Ÿšดโ€โ™‚๏ธ man biking
2131+1F6B4 200D 2642 ; minimally-qualified # ๐Ÿšดโ€โ™‚ man biking
2132+1F6B4 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿšด๐Ÿปโ€โ™‚๏ธ man biking: light skin tone
2133+1F6B4 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿšด๐Ÿปโ€โ™‚ man biking: light skin tone
2134+1F6B4 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿšด๐Ÿผโ€โ™‚๏ธ man biking: medium-light skin tone
2135+1F6B4 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿšด๐Ÿผโ€โ™‚ man biking: medium-light skin tone
2136+1F6B4 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿšด๐Ÿฝโ€โ™‚๏ธ man biking: medium skin tone
2137+1F6B4 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿšด๐Ÿฝโ€โ™‚ man biking: medium skin tone
2138+1F6B4 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿšด๐Ÿพโ€โ™‚๏ธ man biking: medium-dark skin tone
2139+1F6B4 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿšด๐Ÿพโ€โ™‚ man biking: medium-dark skin tone
2140+1F6B4 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿšด๐Ÿฟโ€โ™‚๏ธ man biking: dark skin tone
2141+1F6B4 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿšด๐Ÿฟโ€โ™‚ man biking: dark skin tone
2142+1F6B4 200D 2640 FE0F ; fully-qualified # ๐Ÿšดโ€โ™€๏ธ woman biking
2143+1F6B4 200D 2640 ; minimally-qualified # ๐Ÿšดโ€โ™€ woman biking
2144+1F6B4 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿšด๐Ÿปโ€โ™€๏ธ woman biking: light skin tone
2145+1F6B4 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿšด๐Ÿปโ€โ™€ woman biking: light skin tone
2146+1F6B4 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿšด๐Ÿผโ€โ™€๏ธ woman biking: medium-light skin tone
2147+1F6B4 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿšด๐Ÿผโ€โ™€ woman biking: medium-light skin tone
2148+1F6B4 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿšด๐Ÿฝโ€โ™€๏ธ woman biking: medium skin tone
2149+1F6B4 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿšด๐Ÿฝโ€โ™€ woman biking: medium skin tone
2150+1F6B4 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿšด๐Ÿพโ€โ™€๏ธ woman biking: medium-dark skin tone
2151+1F6B4 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿšด๐Ÿพโ€โ™€ woman biking: medium-dark skin tone
2152+1F6B4 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿšด๐Ÿฟโ€โ™€๏ธ woman biking: dark skin tone
2153+1F6B4 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿšด๐Ÿฟโ€โ™€ woman biking: dark skin tone
2154+1F6B5 ; fully-qualified # ๐Ÿšต person mountain biking
2155+1F6B5 1F3FB ; fully-qualified # ๐Ÿšต๐Ÿป person mountain biking: light skin tone
2156+1F6B5 1F3FC ; fully-qualified # ๐Ÿšต๐Ÿผ person mountain biking: medium-light skin tone
2157+1F6B5 1F3FD ; fully-qualified # ๐Ÿšต๐Ÿฝ person mountain biking: medium skin tone
2158+1F6B5 1F3FE ; fully-qualified # ๐Ÿšต๐Ÿพ person mountain biking: medium-dark skin tone
2159+1F6B5 1F3FF ; fully-qualified # ๐Ÿšต๐Ÿฟ person mountain biking: dark skin tone
2160+1F6B5 200D 2642 FE0F ; fully-qualified # ๐Ÿšตโ€โ™‚๏ธ man mountain biking
2161+1F6B5 200D 2642 ; minimally-qualified # ๐Ÿšตโ€โ™‚ man mountain biking
2162+1F6B5 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿšต๐Ÿปโ€โ™‚๏ธ man mountain biking: light skin tone
2163+1F6B5 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿšต๐Ÿปโ€โ™‚ man mountain biking: light skin tone
2164+1F6B5 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿšต๐Ÿผโ€โ™‚๏ธ man mountain biking: medium-light skin tone
2165+1F6B5 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿšต๐Ÿผโ€โ™‚ man mountain biking: medium-light skin tone
2166+1F6B5 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿšต๐Ÿฝโ€โ™‚๏ธ man mountain biking: medium skin tone
2167+1F6B5 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿšต๐Ÿฝโ€โ™‚ man mountain biking: medium skin tone
2168+1F6B5 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿšต๐Ÿพโ€โ™‚๏ธ man mountain biking: medium-dark skin tone
2169+1F6B5 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿšต๐Ÿพโ€โ™‚ man mountain biking: medium-dark skin tone
2170+1F6B5 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿšต๐Ÿฟโ€โ™‚๏ธ man mountain biking: dark skin tone
2171+1F6B5 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿšต๐Ÿฟโ€โ™‚ man mountain biking: dark skin tone
2172+1F6B5 200D 2640 FE0F ; fully-qualified # ๐Ÿšตโ€โ™€๏ธ woman mountain biking
2173+1F6B5 200D 2640 ; minimally-qualified # ๐Ÿšตโ€โ™€ woman mountain biking
2174+1F6B5 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿšต๐Ÿปโ€โ™€๏ธ woman mountain biking: light skin tone
2175+1F6B5 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿšต๐Ÿปโ€โ™€ woman mountain biking: light skin tone
2176+1F6B5 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿšต๐Ÿผโ€โ™€๏ธ woman mountain biking: medium-light skin tone
2177+1F6B5 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿšต๐Ÿผโ€โ™€ woman mountain biking: medium-light skin tone
2178+1F6B5 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿšต๐Ÿฝโ€โ™€๏ธ woman mountain biking: medium skin tone
2179+1F6B5 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿšต๐Ÿฝโ€โ™€ woman mountain biking: medium skin tone
2180+1F6B5 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿšต๐Ÿพโ€โ™€๏ธ woman mountain biking: medium-dark skin tone
2181+1F6B5 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿšต๐Ÿพโ€โ™€ woman mountain biking: medium-dark skin tone
2182+1F6B5 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿšต๐Ÿฟโ€โ™€๏ธ woman mountain biking: dark skin tone
2183+1F6B5 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿšต๐Ÿฟโ€โ™€ woman mountain biking: dark skin tone
2184+1F938 ; fully-qualified # ๐Ÿคธ person cartwheeling
2185+1F938 1F3FB ; fully-qualified # ๐Ÿคธ๐Ÿป person cartwheeling: light skin tone
2186+1F938 1F3FC ; fully-qualified # ๐Ÿคธ๐Ÿผ person cartwheeling: medium-light skin tone
2187+1F938 1F3FD ; fully-qualified # ๐Ÿคธ๐Ÿฝ person cartwheeling: medium skin tone
2188+1F938 1F3FE ; fully-qualified # ๐Ÿคธ๐Ÿพ person cartwheeling: medium-dark skin tone
2189+1F938 1F3FF ; fully-qualified # ๐Ÿคธ๐Ÿฟ person cartwheeling: dark skin tone
2190+1F938 200D 2642 FE0F ; fully-qualified # ๐Ÿคธโ€โ™‚๏ธ man cartwheeling
2191+1F938 200D 2642 ; minimally-qualified # ๐Ÿคธโ€โ™‚ man cartwheeling
2192+1F938 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿปโ€โ™‚๏ธ man cartwheeling: light skin tone
2193+1F938 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿคธ๐Ÿปโ€โ™‚ man cartwheeling: light skin tone
2194+1F938 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿผโ€โ™‚๏ธ man cartwheeling: medium-light skin tone
2195+1F938 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿคธ๐Ÿผโ€โ™‚ man cartwheeling: medium-light skin tone
2196+1F938 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿฝโ€โ™‚๏ธ man cartwheeling: medium skin tone
2197+1F938 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿคธ๐Ÿฝโ€โ™‚ man cartwheeling: medium skin tone
2198+1F938 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿพโ€โ™‚๏ธ man cartwheeling: medium-dark skin tone
2199+1F938 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿคธ๐Ÿพโ€โ™‚ man cartwheeling: medium-dark skin tone
2200+1F938 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿฟโ€โ™‚๏ธ man cartwheeling: dark skin tone
2201+1F938 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿคธ๐Ÿฟโ€โ™‚ man cartwheeling: dark skin tone
2202+1F938 200D 2640 FE0F ; fully-qualified # ๐Ÿคธโ€โ™€๏ธ woman cartwheeling
2203+1F938 200D 2640 ; minimally-qualified # ๐Ÿคธโ€โ™€ woman cartwheeling
2204+1F938 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿปโ€โ™€๏ธ woman cartwheeling: light skin tone
2205+1F938 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿคธ๐Ÿปโ€โ™€ woman cartwheeling: light skin tone
2206+1F938 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿผโ€โ™€๏ธ woman cartwheeling: medium-light skin tone
2207+1F938 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿคธ๐Ÿผโ€โ™€ woman cartwheeling: medium-light skin tone
2208+1F938 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿฝโ€โ™€๏ธ woman cartwheeling: medium skin tone
2209+1F938 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿคธ๐Ÿฝโ€โ™€ woman cartwheeling: medium skin tone
2210+1F938 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿพโ€โ™€๏ธ woman cartwheeling: medium-dark skin tone
2211+1F938 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿคธ๐Ÿพโ€โ™€ woman cartwheeling: medium-dark skin tone
2212+1F938 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿฟโ€โ™€๏ธ woman cartwheeling: dark skin tone
2213+1F938 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿคธ๐Ÿฟโ€โ™€ woman cartwheeling: dark skin tone
2214+1F93C ; fully-qualified # ๐Ÿคผ people wrestling
2215+1F93C 200D 2642 FE0F ; fully-qualified # ๐Ÿคผโ€โ™‚๏ธ men wrestling
2216+1F93C 200D 2642 ; minimally-qualified # ๐Ÿคผโ€โ™‚ men wrestling
2217+1F93C 200D 2640 FE0F ; fully-qualified # ๐Ÿคผโ€โ™€๏ธ women wrestling
2218+1F93C 200D 2640 ; minimally-qualified # ๐Ÿคผโ€โ™€ women wrestling
2219+1F93D ; fully-qualified # ๐Ÿคฝ person playing water polo
2220+1F93D 1F3FB ; fully-qualified # ๐Ÿคฝ๐Ÿป person playing water polo: light skin tone
2221+1F93D 1F3FC ; fully-qualified # ๐Ÿคฝ๐Ÿผ person playing water polo: medium-light skin tone
2222+1F93D 1F3FD ; fully-qualified # ๐Ÿคฝ๐Ÿฝ person playing water polo: medium skin tone
2223+1F93D 1F3FE ; fully-qualified # ๐Ÿคฝ๐Ÿพ person playing water polo: medium-dark skin tone
2224+1F93D 1F3FF ; fully-qualified # ๐Ÿคฝ๐Ÿฟ person playing water polo: dark skin tone
2225+1F93D 200D 2642 FE0F ; fully-qualified # ๐Ÿคฝโ€โ™‚๏ธ man playing water polo
2226+1F93D 200D 2642 ; minimally-qualified # ๐Ÿคฝโ€โ™‚ man playing water polo
2227+1F93D 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿปโ€โ™‚๏ธ man playing water polo: light skin tone
2228+1F93D 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿคฝ๐Ÿปโ€โ™‚ man playing water polo: light skin tone
2229+1F93D 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿผโ€โ™‚๏ธ man playing water polo: medium-light skin tone
2230+1F93D 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿคฝ๐Ÿผโ€โ™‚ man playing water polo: medium-light skin tone
2231+1F93D 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿฝโ€โ™‚๏ธ man playing water polo: medium skin tone
2232+1F93D 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿคฝ๐Ÿฝโ€โ™‚ man playing water polo: medium skin tone
2233+1F93D 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿพโ€โ™‚๏ธ man playing water polo: medium-dark skin tone
2234+1F93D 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿคฝ๐Ÿพโ€โ™‚ man playing water polo: medium-dark skin tone
2235+1F93D 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿฟโ€โ™‚๏ธ man playing water polo: dark skin tone
2236+1F93D 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿคฝ๐Ÿฟโ€โ™‚ man playing water polo: dark skin tone
2237+1F93D 200D 2640 FE0F ; fully-qualified # ๐Ÿคฝโ€โ™€๏ธ woman playing water polo
2238+1F93D 200D 2640 ; minimally-qualified # ๐Ÿคฝโ€โ™€ woman playing water polo
2239+1F93D 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿปโ€โ™€๏ธ woman playing water polo: light skin tone
2240+1F93D 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿคฝ๐Ÿปโ€โ™€ woman playing water polo: light skin tone
2241+1F93D 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿผโ€โ™€๏ธ woman playing water polo: medium-light skin tone
2242+1F93D 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿคฝ๐Ÿผโ€โ™€ woman playing water polo: medium-light skin tone
2243+1F93D 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿฝโ€โ™€๏ธ woman playing water polo: medium skin tone
2244+1F93D 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿคฝ๐Ÿฝโ€โ™€ woman playing water polo: medium skin tone
2245+1F93D 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿพโ€โ™€๏ธ woman playing water polo: medium-dark skin tone
2246+1F93D 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿคฝ๐Ÿพโ€โ™€ woman playing water polo: medium-dark skin tone
2247+1F93D 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿฟโ€โ™€๏ธ woman playing water polo: dark skin tone
2248+1F93D 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿคฝ๐Ÿฟโ€โ™€ woman playing water polo: dark skin tone
2249+1F93E ; fully-qualified # ๐Ÿคพ person playing handball
2250+1F93E 1F3FB ; fully-qualified # ๐Ÿคพ๐Ÿป person playing handball: light skin tone
2251+1F93E 1F3FC ; fully-qualified # ๐Ÿคพ๐Ÿผ person playing handball: medium-light skin tone
2252+1F93E 1F3FD ; fully-qualified # ๐Ÿคพ๐Ÿฝ person playing handball: medium skin tone
2253+1F93E 1F3FE ; fully-qualified # ๐Ÿคพ๐Ÿพ person playing handball: medium-dark skin tone
2254+1F93E 1F3FF ; fully-qualified # ๐Ÿคพ๐Ÿฟ person playing handball: dark skin tone
2255+1F93E 200D 2642 FE0F ; fully-qualified # ๐Ÿคพโ€โ™‚๏ธ man playing handball
2256+1F93E 200D 2642 ; minimally-qualified # ๐Ÿคพโ€โ™‚ man playing handball
2257+1F93E 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿปโ€โ™‚๏ธ man playing handball: light skin tone
2258+1F93E 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿคพ๐Ÿปโ€โ™‚ man playing handball: light skin tone
2259+1F93E 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿผโ€โ™‚๏ธ man playing handball: medium-light skin tone
2260+1F93E 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿคพ๐Ÿผโ€โ™‚ man playing handball: medium-light skin tone
2261+1F93E 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿฝโ€โ™‚๏ธ man playing handball: medium skin tone
2262+1F93E 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿคพ๐Ÿฝโ€โ™‚ man playing handball: medium skin tone
2263+1F93E 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿพโ€โ™‚๏ธ man playing handball: medium-dark skin tone
2264+1F93E 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿคพ๐Ÿพโ€โ™‚ man playing handball: medium-dark skin tone
2265+1F93E 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿฟโ€โ™‚๏ธ man playing handball: dark skin tone
2266+1F93E 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿคพ๐Ÿฟโ€โ™‚ man playing handball: dark skin tone
2267+1F93E 200D 2640 FE0F ; fully-qualified # ๐Ÿคพโ€โ™€๏ธ woman playing handball
2268+1F93E 200D 2640 ; minimally-qualified # ๐Ÿคพโ€โ™€ woman playing handball
2269+1F93E 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿปโ€โ™€๏ธ woman playing handball: light skin tone
2270+1F93E 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿคพ๐Ÿปโ€โ™€ woman playing handball: light skin tone
2271+1F93E 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿผโ€โ™€๏ธ woman playing handball: medium-light skin tone
2272+1F93E 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿคพ๐Ÿผโ€โ™€ woman playing handball: medium-light skin tone
2273+1F93E 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿฝโ€โ™€๏ธ woman playing handball: medium skin tone
2274+1F93E 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿคพ๐Ÿฝโ€โ™€ woman playing handball: medium skin tone
2275+1F93E 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿพโ€โ™€๏ธ woman playing handball: medium-dark skin tone
2276+1F93E 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿคพ๐Ÿพโ€โ™€ woman playing handball: medium-dark skin tone
2277+1F93E 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿฟโ€โ™€๏ธ woman playing handball: dark skin tone
2278+1F93E 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿคพ๐Ÿฟโ€โ™€ woman playing handball: dark skin tone
2279+1F939 ; fully-qualified # ๐Ÿคน person juggling
2280+1F939 1F3FB ; fully-qualified # ๐Ÿคน๐Ÿป person juggling: light skin tone
2281+1F939 1F3FC ; fully-qualified # ๐Ÿคน๐Ÿผ person juggling: medium-light skin tone
2282+1F939 1F3FD ; fully-qualified # ๐Ÿคน๐Ÿฝ person juggling: medium skin tone
2283+1F939 1F3FE ; fully-qualified # ๐Ÿคน๐Ÿพ person juggling: medium-dark skin tone
2284+1F939 1F3FF ; fully-qualified # ๐Ÿคน๐Ÿฟ person juggling: dark skin tone
2285+1F939 200D 2642 FE0F ; fully-qualified # ๐Ÿคนโ€โ™‚๏ธ man juggling
2286+1F939 200D 2642 ; minimally-qualified # ๐Ÿคนโ€โ™‚ man juggling
2287+1F939 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿคน๐Ÿปโ€โ™‚๏ธ man juggling: light skin tone
2288+1F939 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿคน๐Ÿปโ€โ™‚ man juggling: light skin tone
2289+1F939 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿคน๐Ÿผโ€โ™‚๏ธ man juggling: medium-light skin tone
2290+1F939 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿคน๐Ÿผโ€โ™‚ man juggling: medium-light skin tone
2291+1F939 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿคน๐Ÿฝโ€โ™‚๏ธ man juggling: medium skin tone
2292+1F939 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿคน๐Ÿฝโ€โ™‚ man juggling: medium skin tone
2293+1F939 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿคน๐Ÿพโ€โ™‚๏ธ man juggling: medium-dark skin tone
2294+1F939 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿคน๐Ÿพโ€โ™‚ man juggling: medium-dark skin tone
2295+1F939 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿคน๐Ÿฟโ€โ™‚๏ธ man juggling: dark skin tone
2296+1F939 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿคน๐Ÿฟโ€โ™‚ man juggling: dark skin tone
2297+1F939 200D 2640 FE0F ; fully-qualified # ๐Ÿคนโ€โ™€๏ธ woman juggling
2298+1F939 200D 2640 ; minimally-qualified # ๐Ÿคนโ€โ™€ woman juggling
2299+1F939 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿคน๐Ÿปโ€โ™€๏ธ woman juggling: light skin tone
2300+1F939 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿคน๐Ÿปโ€โ™€ woman juggling: light skin tone
2301+1F939 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿคน๐Ÿผโ€โ™€๏ธ woman juggling: medium-light skin tone
2302+1F939 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿคน๐Ÿผโ€โ™€ woman juggling: medium-light skin tone
2303+1F939 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿคน๐Ÿฝโ€โ™€๏ธ woman juggling: medium skin tone
2304+1F939 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿคน๐Ÿฝโ€โ™€ woman juggling: medium skin tone
2305+1F939 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿคน๐Ÿพโ€โ™€๏ธ woman juggling: medium-dark skin tone
2306+1F939 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿคน๐Ÿพโ€โ™€ woman juggling: medium-dark skin tone
2307+1F939 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿคน๐Ÿฟโ€โ™€๏ธ woman juggling: dark skin tone
2308+1F939 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿคน๐Ÿฟโ€โ™€ woman juggling: dark skin tone
2309+
2310+# subgroup: person-resting
2311+1F9D8 ; fully-qualified # ๐Ÿง˜ person in lotus position
2312+1F9D8 1F3FB ; fully-qualified # ๐Ÿง˜๐Ÿป person in lotus position: light skin tone
2313+1F9D8 1F3FC ; fully-qualified # ๐Ÿง˜๐Ÿผ person in lotus position: medium-light skin tone
2314+1F9D8 1F3FD ; fully-qualified # ๐Ÿง˜๐Ÿฝ person in lotus position: medium skin tone
2315+1F9D8 1F3FE ; fully-qualified # ๐Ÿง˜๐Ÿพ person in lotus position: medium-dark skin tone
2316+1F9D8 1F3FF ; fully-qualified # ๐Ÿง˜๐Ÿฟ person in lotus position: dark skin tone
2317+1F9D8 200D 2642 FE0F ; fully-qualified # ๐Ÿง˜โ€โ™‚๏ธ man in lotus position
2318+1F9D8 200D 2642 ; minimally-qualified # ๐Ÿง˜โ€โ™‚ man in lotus position
2319+1F9D8 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿปโ€โ™‚๏ธ man in lotus position: light skin tone
2320+1F9D8 1F3FB 200D 2642 ; minimally-qualified # ๐Ÿง˜๐Ÿปโ€โ™‚ man in lotus position: light skin tone
2321+1F9D8 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿผโ€โ™‚๏ธ man in lotus position: medium-light skin tone
2322+1F9D8 1F3FC 200D 2642 ; minimally-qualified # ๐Ÿง˜๐Ÿผโ€โ™‚ man in lotus position: medium-light skin tone
2323+1F9D8 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿฝโ€โ™‚๏ธ man in lotus position: medium skin tone
2324+1F9D8 1F3FD 200D 2642 ; minimally-qualified # ๐Ÿง˜๐Ÿฝโ€โ™‚ man in lotus position: medium skin tone
2325+1F9D8 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿพโ€โ™‚๏ธ man in lotus position: medium-dark skin tone
2326+1F9D8 1F3FE 200D 2642 ; minimally-qualified # ๐Ÿง˜๐Ÿพโ€โ™‚ man in lotus position: medium-dark skin tone
2327+1F9D8 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿฟโ€โ™‚๏ธ man in lotus position: dark skin tone
2328+1F9D8 1F3FF 200D 2642 ; minimally-qualified # ๐Ÿง˜๐Ÿฟโ€โ™‚ man in lotus position: dark skin tone
2329+1F9D8 200D 2640 FE0F ; fully-qualified # ๐Ÿง˜โ€โ™€๏ธ woman in lotus position
2330+1F9D8 200D 2640 ; minimally-qualified # ๐Ÿง˜โ€โ™€ woman in lotus position
2331+1F9D8 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿปโ€โ™€๏ธ woman in lotus position: light skin tone
2332+1F9D8 1F3FB 200D 2640 ; minimally-qualified # ๐Ÿง˜๐Ÿปโ€โ™€ woman in lotus position: light skin tone
2333+1F9D8 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿผโ€โ™€๏ธ woman in lotus position: medium-light skin tone
2334+1F9D8 1F3FC 200D 2640 ; minimally-qualified # ๐Ÿง˜๐Ÿผโ€โ™€ woman in lotus position: medium-light skin tone
2335+1F9D8 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿฝโ€โ™€๏ธ woman in lotus position: medium skin tone
2336+1F9D8 1F3FD 200D 2640 ; minimally-qualified # ๐Ÿง˜๐Ÿฝโ€โ™€ woman in lotus position: medium skin tone
2337+1F9D8 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿพโ€โ™€๏ธ woman in lotus position: medium-dark skin tone
2338+1F9D8 1F3FE 200D 2640 ; minimally-qualified # ๐Ÿง˜๐Ÿพโ€โ™€ woman in lotus position: medium-dark skin tone
2339+1F9D8 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿฟโ€โ™€๏ธ woman in lotus position: dark skin tone
2340+1F9D8 1F3FF 200D 2640 ; minimally-qualified # ๐Ÿง˜๐Ÿฟโ€โ™€ woman in lotus position: dark skin tone
2341+1F6C0 ; fully-qualified # ๐Ÿ›€ person taking bath
2342+1F6C0 1F3FB ; fully-qualified # ๐Ÿ›€๐Ÿป person taking bath: light skin tone
2343+1F6C0 1F3FC ; fully-qualified # ๐Ÿ›€๐Ÿผ person taking bath: medium-light skin tone
2344+1F6C0 1F3FD ; fully-qualified # ๐Ÿ›€๐Ÿฝ person taking bath: medium skin tone
2345+1F6C0 1F3FE ; fully-qualified # ๐Ÿ›€๐Ÿพ person taking bath: medium-dark skin tone
2346+1F6C0 1F3FF ; fully-qualified # ๐Ÿ›€๐Ÿฟ person taking bath: dark skin tone
2347+1F6CC ; fully-qualified # ๐Ÿ›Œ person in bed
2348+1F6CC 1F3FB ; fully-qualified # ๐Ÿ›Œ๐Ÿป person in bed: light skin tone
2349+1F6CC 1F3FC ; fully-qualified # ๐Ÿ›Œ๐Ÿผ person in bed: medium-light skin tone
2350+1F6CC 1F3FD ; fully-qualified # ๐Ÿ›Œ๐Ÿฝ person in bed: medium skin tone
2351+1F6CC 1F3FE ; fully-qualified # ๐Ÿ›Œ๐Ÿพ person in bed: medium-dark skin tone
2352+1F6CC 1F3FF ; fully-qualified # ๐Ÿ›Œ๐Ÿฟ person in bed: dark skin tone
2353+
2354+# subgroup: family
2355+1F9D1 200D 1F91D 200D 1F9D1 ; fully-qualified # ๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘ people holding hands
2356+1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # ๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿป people holding hands: light skin tone
2357+1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # ๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿป people holding hands: medium-light skin tone, light skin tone
2358+1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # ๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ people holding hands: medium-light skin tone
2359+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # ๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿป people holding hands: medium skin tone, light skin tone
2360+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # ๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ people holding hands: medium skin tone, medium-light skin tone
2361+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FD ; fully-qualified # ๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ people holding hands: medium skin tone
2362+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # ๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿป people holding hands: medium-dark skin tone, light skin tone
2363+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # ๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ people holding hands: medium-dark skin tone, medium-light skin tone
2364+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FD ; fully-qualified # ๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ people holding hands: medium-dark skin tone, medium skin tone
2365+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FE ; fully-qualified # ๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ people holding hands: medium-dark skin tone
2366+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # ๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿป people holding hands: dark skin tone, light skin tone
2367+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # ๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ people holding hands: dark skin tone, medium-light skin tone
2368+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FD ; fully-qualified # ๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ people holding hands: dark skin tone, medium skin tone
2369+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FE ; fully-qualified # ๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ people holding hands: dark skin tone, medium-dark skin tone
2370+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FF ; fully-qualified # ๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ people holding hands: dark skin tone
2371+1F46D ; fully-qualified # ๐Ÿ‘ญ women holding hands
2372+1F46D 1F3FB ; fully-qualified # ๐Ÿ‘ญ๐Ÿป women holding hands: light skin tone
2373+1F469 1F3FC 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป women holding hands: medium-light skin tone, light skin tone
2374+1F46D 1F3FC ; fully-qualified # ๐Ÿ‘ญ๐Ÿผ women holding hands: medium-light skin tone
2375+1F469 1F3FD 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป women holding hands: medium skin tone, light skin tone
2376+1F469 1F3FD 200D 1F91D 200D 1F469 1F3FC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ women holding hands: medium skin tone, medium-light skin tone
2377+1F46D 1F3FD ; fully-qualified # ๐Ÿ‘ญ๐Ÿฝ women holding hands: medium skin tone
2378+1F469 1F3FE 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป women holding hands: medium-dark skin tone, light skin tone
2379+1F469 1F3FE 200D 1F91D 200D 1F469 1F3FC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ women holding hands: medium-dark skin tone, medium-light skin tone
2380+1F469 1F3FE 200D 1F91D 200D 1F469 1F3FD ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ women holding hands: medium-dark skin tone, medium skin tone
2381+1F46D 1F3FE ; fully-qualified # ๐Ÿ‘ญ๐Ÿพ women holding hands: medium-dark skin tone
2382+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป women holding hands: dark skin tone, light skin tone
2383+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ women holding hands: dark skin tone, medium-light skin tone
2384+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FD ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ women holding hands: dark skin tone, medium skin tone
2385+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FE ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ women holding hands: dark skin tone, medium-dark skin tone
2386+1F46D 1F3FF ; fully-qualified # ๐Ÿ‘ญ๐Ÿฟ women holding hands: dark skin tone
2387+1F46B ; fully-qualified # ๐Ÿ‘ซ woman and man holding hands
2388+1F46B 1F3FB ; fully-qualified # ๐Ÿ‘ซ๐Ÿป woman and man holding hands: light skin tone
2389+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ woman and man holding hands: light skin tone, medium-light skin tone
2390+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ woman and man holding hands: light skin tone, medium skin tone
2391+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ woman and man holding hands: light skin tone, medium-dark skin tone
2392+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ woman and man holding hands: light skin tone, dark skin tone
2393+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป woman and man holding hands: medium-light skin tone, light skin tone
2394+1F46B 1F3FC ; fully-qualified # ๐Ÿ‘ซ๐Ÿผ woman and man holding hands: medium-light skin tone
2395+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ woman and man holding hands: medium-light skin tone, medium skin tone
2396+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ woman and man holding hands: medium-light skin tone, medium-dark skin tone
2397+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ woman and man holding hands: medium-light skin tone, dark skin tone
2398+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป woman and man holding hands: medium skin tone, light skin tone
2399+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ woman and man holding hands: medium skin tone, medium-light skin tone
2400+1F46B 1F3FD ; fully-qualified # ๐Ÿ‘ซ๐Ÿฝ woman and man holding hands: medium skin tone
2401+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ woman and man holding hands: medium skin tone, medium-dark skin tone
2402+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ woman and man holding hands: medium skin tone, dark skin tone
2403+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป woman and man holding hands: medium-dark skin tone, light skin tone
2404+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ woman and man holding hands: medium-dark skin tone, medium-light skin tone
2405+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ woman and man holding hands: medium-dark skin tone, medium skin tone
2406+1F46B 1F3FE ; fully-qualified # ๐Ÿ‘ซ๐Ÿพ woman and man holding hands: medium-dark skin tone
2407+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ woman and man holding hands: medium-dark skin tone, dark skin tone
2408+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป woman and man holding hands: dark skin tone, light skin tone
2409+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ woman and man holding hands: dark skin tone, medium-light skin tone
2410+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ woman and man holding hands: dark skin tone, medium skin tone
2411+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ woman and man holding hands: dark skin tone, medium-dark skin tone
2412+1F46B 1F3FF ; fully-qualified # ๐Ÿ‘ซ๐Ÿฟ woman and man holding hands: dark skin tone
2413+1F46C ; fully-qualified # ๐Ÿ‘ฌ men holding hands
2414+1F46C 1F3FB ; fully-qualified # ๐Ÿ‘ฌ๐Ÿป men holding hands: light skin tone
2415+1F468 1F3FC 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป men holding hands: medium-light skin tone, light skin tone
2416+1F46C 1F3FC ; fully-qualified # ๐Ÿ‘ฌ๐Ÿผ men holding hands: medium-light skin tone
2417+1F468 1F3FD 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป men holding hands: medium skin tone, light skin tone
2418+1F468 1F3FD 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ men holding hands: medium skin tone, medium-light skin tone
2419+1F46C 1F3FD ; fully-qualified # ๐Ÿ‘ฌ๐Ÿฝ men holding hands: medium skin tone
2420+1F468 1F3FE 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป men holding hands: medium-dark skin tone, light skin tone
2421+1F468 1F3FE 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ men holding hands: medium-dark skin tone, medium-light skin tone
2422+1F468 1F3FE 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ men holding hands: medium-dark skin tone, medium skin tone
2423+1F46C 1F3FE ; fully-qualified # ๐Ÿ‘ฌ๐Ÿพ men holding hands: medium-dark skin tone
2424+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป men holding hands: dark skin tone, light skin tone
2425+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ men holding hands: dark skin tone, medium-light skin tone
2426+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ men holding hands: dark skin tone, medium skin tone
2427+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ men holding hands: dark skin tone, medium-dark skin tone
2428+1F46C 1F3FF ; fully-qualified # ๐Ÿ‘ฌ๐Ÿฟ men holding hands: dark skin tone
2429+1F48F ; fully-qualified # ๐Ÿ’ kiss
2430+1F469 200D 2764 FE0F 200D 1F48B 200D 1F468 ; fully-qualified # ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ kiss: woman, man
2431+1F469 200D 2764 200D 1F48B 200D 1F468 ; minimally-qualified # ๐Ÿ‘ฉโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ kiss: woman, man
2432+1F468 200D 2764 FE0F 200D 1F48B 200D 1F468 ; fully-qualified # ๐Ÿ‘จโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ kiss: man, man
2433+1F468 200D 2764 200D 1F48B 200D 1F468 ; minimally-qualified # ๐Ÿ‘จโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ kiss: man, man
2434+1F469 200D 2764 FE0F 200D 1F48B 200D 1F469 ; fully-qualified # ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ kiss: woman, woman
2435+1F469 200D 2764 200D 1F48B 200D 1F469 ; minimally-qualified # ๐Ÿ‘ฉโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ kiss: woman, woman
2436+1F491 ; fully-qualified # ๐Ÿ’‘ couple with heart
2437+1F469 200D 2764 FE0F 200D 1F468 ; fully-qualified # ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘จ couple with heart: woman, man
2438+1F469 200D 2764 200D 1F468 ; minimally-qualified # ๐Ÿ‘ฉโ€โคโ€๐Ÿ‘จ couple with heart: woman, man
2439+1F468 200D 2764 FE0F 200D 1F468 ; fully-qualified # ๐Ÿ‘จโ€โค๏ธโ€๐Ÿ‘จ couple with heart: man, man
2440+1F468 200D 2764 200D 1F468 ; minimally-qualified # ๐Ÿ‘จโ€โคโ€๐Ÿ‘จ couple with heart: man, man
2441+1F469 200D 2764 FE0F 200D 1F469 ; fully-qualified # ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘ฉ couple with heart: woman, woman
2442+1F469 200D 2764 200D 1F469 ; minimally-qualified # ๐Ÿ‘ฉโ€โคโ€๐Ÿ‘ฉ couple with heart: woman, woman
2443+1F46A ; fully-qualified # ๐Ÿ‘ช family
2444+1F468 200D 1F469 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ family: man, woman, boy
2445+1F468 200D 1F469 200D 1F467 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง family: man, woman, girl
2446+1F468 200D 1F469 200D 1F467 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family: man, woman, girl, boy
2447+1F468 200D 1F469 200D 1F466 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family: man, woman, boy, boy
2448+1F468 200D 1F469 200D 1F467 200D 1F467 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง family: man, woman, girl, girl
2449+1F468 200D 1F468 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ family: man, man, boy
2450+1F468 200D 1F468 200D 1F467 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง family: man, man, girl
2451+1F468 200D 1F468 200D 1F467 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family: man, man, girl, boy
2452+1F468 200D 1F468 200D 1F466 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family: man, man, boy, boy
2453+1F468 200D 1F468 200D 1F467 200D 1F467 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง family: man, man, girl, girl
2454+1F469 200D 1F469 200D 1F466 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ family: woman, woman, boy
2455+1F469 200D 1F469 200D 1F467 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง family: woman, woman, girl
2456+1F469 200D 1F469 200D 1F467 200D 1F466 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family: woman, woman, girl, boy
2457+1F469 200D 1F469 200D 1F466 200D 1F466 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family: woman, woman, boy, boy
2458+1F469 200D 1F469 200D 1F467 200D 1F467 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง family: woman, woman, girl, girl
2459+1F468 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ฆ family: man, boy
2460+1F468 200D 1F466 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family: man, boy, boy
2461+1F468 200D 1F467 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ง family: man, girl
2462+1F468 200D 1F467 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family: man, girl, boy
2463+1F468 200D 1F467 200D 1F467 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง family: man, girl, girl
2464+1F469 200D 1F466 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ฆ family: woman, boy
2465+1F469 200D 1F466 200D 1F466 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family: woman, boy, boy
2466+1F469 200D 1F467 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ง family: woman, girl
2467+1F469 200D 1F467 200D 1F466 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family: woman, girl, boy
2468+1F469 200D 1F467 200D 1F467 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง family: woman, girl, girl
2469+
2470+# subgroup: person-symbol
2471+1F5E3 FE0F ; fully-qualified # ๐Ÿ—ฃ๏ธ speaking head
2472+1F5E3 ; unqualified # ๐Ÿ—ฃ speaking head
2473+1F464 ; fully-qualified # ๐Ÿ‘ค bust in silhouette
2474+1F465 ; fully-qualified # ๐Ÿ‘ฅ busts in silhouette
2475+1F463 ; fully-qualified # ๐Ÿ‘ฃ footprints
2476+
2477+# People & Body subtotal: 2212
2478+# People & Body subtotal: 447 w/o modifiers
2479+
2480+# group: Component
2481+
2482+# subgroup: skin-tone
2483+1F3FB ; component # ๐Ÿป light skin tone
2484+1F3FC ; component # ๐Ÿผ medium-light skin tone
2485+1F3FD ; component # ๐Ÿฝ medium skin tone
2486+1F3FE ; component # ๐Ÿพ medium-dark skin tone
2487+1F3FF ; component # ๐Ÿฟ dark skin tone
2488+
2489+# subgroup: hair-style
2490+1F9B0 ; component # ๐Ÿฆฐ red hair
2491+1F9B1 ; component # ๐Ÿฆฑ curly hair
2492+1F9B3 ; component # ๐Ÿฆณ white hair
2493+1F9B2 ; component # ๐Ÿฆฒ bald
2494+
2495+# Component subtotal: 9
2496+# Component subtotal: 4 w/o modifiers
2497+
2498+# group: Animals & Nature
2499+
2500+# subgroup: animal-mammal
2501+1F435 ; fully-qualified # ๐Ÿต monkey face
2502+1F412 ; fully-qualified # ๐Ÿ’ monkey
2503+1F98D ; fully-qualified # ๐Ÿฆ gorilla
2504+1F9A7 ; fully-qualified # ๐Ÿฆง orangutan
2505+1F436 ; fully-qualified # ๐Ÿถ dog face
2506+1F415 ; fully-qualified # ๐Ÿ• dog
2507+1F9AE ; fully-qualified # ๐Ÿฆฎ guide dog
2508+1F415 200D 1F9BA ; fully-qualified # ๐Ÿ•โ€๐Ÿฆบ service dog
2509+1F429 ; fully-qualified # ๐Ÿฉ poodle
2510+1F43A ; fully-qualified # ๐Ÿบ wolf
2511+1F98A ; fully-qualified # ๐ŸฆŠ fox
2512+1F99D ; fully-qualified # ๐Ÿฆ raccoon
2513+1F431 ; fully-qualified # ๐Ÿฑ cat face
2514+1F408 ; fully-qualified # ๐Ÿˆ cat
2515+1F981 ; fully-qualified # ๐Ÿฆ lion
2516+1F42F ; fully-qualified # ๐Ÿฏ tiger face
2517+1F405 ; fully-qualified # ๐Ÿ… tiger
2518+1F406 ; fully-qualified # ๐Ÿ† leopard
2519+1F434 ; fully-qualified # ๐Ÿด horse face
2520+1F40E ; fully-qualified # ๐ŸŽ horse
2521+1F984 ; fully-qualified # ๐Ÿฆ„ unicorn
2522+1F993 ; fully-qualified # ๐Ÿฆ“ zebra
2523+1F98C ; fully-qualified # ๐ŸฆŒ deer
2524+1F42E ; fully-qualified # ๐Ÿฎ cow face
2525+1F402 ; fully-qualified # ๐Ÿ‚ ox
2526+1F403 ; fully-qualified # ๐Ÿƒ water buffalo
2527+1F404 ; fully-qualified # ๐Ÿ„ cow
2528+1F437 ; fully-qualified # ๐Ÿท pig face
2529+1F416 ; fully-qualified # ๐Ÿ– pig
2530+1F417 ; fully-qualified # ๐Ÿ— boar
2531+1F43D ; fully-qualified # ๐Ÿฝ pig nose
2532+1F40F ; fully-qualified # ๐Ÿ ram
2533+1F411 ; fully-qualified # ๐Ÿ‘ ewe
2534+1F410 ; fully-qualified # ๐Ÿ goat
2535+1F42A ; fully-qualified # ๐Ÿช camel
2536+1F42B ; fully-qualified # ๐Ÿซ two-hump camel
2537+1F999 ; fully-qualified # ๐Ÿฆ™ llama
2538+1F992 ; fully-qualified # ๐Ÿฆ’ giraffe
2539+1F418 ; fully-qualified # ๐Ÿ˜ elephant
2540+1F98F ; fully-qualified # ๐Ÿฆ rhinoceros
2541+1F99B ; fully-qualified # ๐Ÿฆ› hippopotamus
2542+1F42D ; fully-qualified # ๐Ÿญ mouse face
2543+1F401 ; fully-qualified # ๐Ÿ mouse
2544+1F400 ; fully-qualified # ๐Ÿ€ rat
2545+1F439 ; fully-qualified # ๐Ÿน hamster
2546+1F430 ; fully-qualified # ๐Ÿฐ rabbit face
2547+1F407 ; fully-qualified # ๐Ÿ‡ rabbit
2548+1F43F FE0F ; fully-qualified # ๐Ÿฟ๏ธ chipmunk
2549+1F43F ; unqualified # ๐Ÿฟ chipmunk
2550+1F994 ; fully-qualified # ๐Ÿฆ” hedgehog
2551+1F987 ; fully-qualified # ๐Ÿฆ‡ bat
2552+1F43B ; fully-qualified # ๐Ÿป bear
2553+1F428 ; fully-qualified # ๐Ÿจ koala
2554+1F43C ; fully-qualified # ๐Ÿผ panda
2555+1F9A5 ; fully-qualified # ๐Ÿฆฅ sloth
2556+1F9A6 ; fully-qualified # ๐Ÿฆฆ otter
2557+1F9A8 ; fully-qualified # ๐Ÿฆจ skunk
2558+1F998 ; fully-qualified # ๐Ÿฆ˜ kangaroo
2559+1F9A1 ; fully-qualified # ๐Ÿฆก badger
2560+1F43E ; fully-qualified # ๐Ÿพ paw prints
2561+
2562+# subgroup: animal-bird
2563+1F983 ; fully-qualified # ๐Ÿฆƒ turkey
2564+1F414 ; fully-qualified # ๐Ÿ” chicken
2565+1F413 ; fully-qualified # ๐Ÿ“ rooster
2566+1F423 ; fully-qualified # ๐Ÿฃ hatching chick
2567+1F424 ; fully-qualified # ๐Ÿค baby chick
2568+1F425 ; fully-qualified # ๐Ÿฅ front-facing baby chick
2569+1F426 ; fully-qualified # ๐Ÿฆ bird
2570+1F427 ; fully-qualified # ๐Ÿง penguin
2571+1F54A FE0F ; fully-qualified # ๐Ÿ•Š๏ธ dove
2572+1F54A ; unqualified # ๐Ÿ•Š dove
2573+1F985 ; fully-qualified # ๐Ÿฆ… eagle
2574+1F986 ; fully-qualified # ๐Ÿฆ† duck
2575+1F9A2 ; fully-qualified # ๐Ÿฆข swan
2576+1F989 ; fully-qualified # ๐Ÿฆ‰ owl
2577+1F9A9 ; fully-qualified # ๐Ÿฆฉ flamingo
2578+1F99A ; fully-qualified # ๐Ÿฆš peacock
2579+1F99C ; fully-qualified # ๐Ÿฆœ parrot
2580+
2581+# subgroup: animal-amphibian
2582+1F438 ; fully-qualified # ๐Ÿธ frog
2583+
2584+# subgroup: animal-reptile
2585+1F40A ; fully-qualified # ๐ŸŠ crocodile
2586+1F422 ; fully-qualified # ๐Ÿข turtle
2587+1F98E ; fully-qualified # ๐ŸฆŽ lizard
2588+1F40D ; fully-qualified # ๐Ÿ snake
2589+1F432 ; fully-qualified # ๐Ÿฒ dragon face
2590+1F409 ; fully-qualified # ๐Ÿ‰ dragon
2591+1F995 ; fully-qualified # ๐Ÿฆ• sauropod
2592+1F996 ; fully-qualified # ๐Ÿฆ– T-Rex
2593+
2594+# subgroup: animal-marine
2595+1F433 ; fully-qualified # ๐Ÿณ spouting whale
2596+1F40B ; fully-qualified # ๐Ÿ‹ whale
2597+1F42C ; fully-qualified # ๐Ÿฌ dolphin
2598+1F41F ; fully-qualified # ๐ŸŸ fish
2599+1F420 ; fully-qualified # ๐Ÿ  tropical fish
2600+1F421 ; fully-qualified # ๐Ÿก blowfish
2601+1F988 ; fully-qualified # ๐Ÿฆˆ shark
2602+1F419 ; fully-qualified # ๐Ÿ™ octopus
2603+1F41A ; fully-qualified # ๐Ÿš spiral shell
2604+
2605+# subgroup: animal-bug
2606+1F40C ; fully-qualified # ๐ŸŒ snail
2607+1F98B ; fully-qualified # ๐Ÿฆ‹ butterfly
2608+1F41B ; fully-qualified # ๐Ÿ› bug
2609+1F41C ; fully-qualified # ๐Ÿœ ant
2610+1F41D ; fully-qualified # ๐Ÿ honeybee
2611+1F41E ; fully-qualified # ๐Ÿž lady beetle
2612+1F997 ; fully-qualified # ๐Ÿฆ— cricket
2613+1F577 FE0F ; fully-qualified # ๐Ÿ•ท๏ธ spider
2614+1F577 ; unqualified # ๐Ÿ•ท spider
2615+1F578 FE0F ; fully-qualified # ๐Ÿ•ธ๏ธ spider web
2616+1F578 ; unqualified # ๐Ÿ•ธ spider web
2617+1F982 ; fully-qualified # ๐Ÿฆ‚ scorpion
2618+1F99F ; fully-qualified # ๐ŸฆŸ mosquito
2619+1F9A0 ; fully-qualified # ๐Ÿฆ  microbe
2620+
2621+# subgroup: plant-flower
2622+1F490 ; fully-qualified # ๐Ÿ’ bouquet
2623+1F338 ; fully-qualified # ๐ŸŒธ cherry blossom
2624+1F4AE ; fully-qualified # ๐Ÿ’ฎ white flower
2625+1F3F5 FE0F ; fully-qualified # ๐Ÿต๏ธ rosette
2626+1F3F5 ; unqualified # ๐Ÿต rosette
2627+1F339 ; fully-qualified # ๐ŸŒน rose
2628+1F940 ; fully-qualified # ๐Ÿฅ€ wilted flower
2629+1F33A ; fully-qualified # ๐ŸŒบ hibiscus
2630+1F33B ; fully-qualified # ๐ŸŒป sunflower
2631+1F33C ; fully-qualified # ๐ŸŒผ blossom
2632+1F337 ; fully-qualified # ๐ŸŒท tulip
2633+
2634+# subgroup: plant-other
2635+1F331 ; fully-qualified # ๐ŸŒฑ seedling
2636+1F332 ; fully-qualified # ๐ŸŒฒ evergreen tree
2637+1F333 ; fully-qualified # ๐ŸŒณ deciduous tree
2638+1F334 ; fully-qualified # ๐ŸŒด palm tree
2639+1F335 ; fully-qualified # ๐ŸŒต cactus
2640+1F33E ; fully-qualified # ๐ŸŒพ sheaf of rice
2641+1F33F ; fully-qualified # ๐ŸŒฟ herb
2642+2618 FE0F ; fully-qualified # โ˜˜๏ธ shamrock
2643+2618 ; unqualified # โ˜˜ shamrock
2644+1F340 ; fully-qualified # ๐Ÿ€ four leaf clover
2645+1F341 ; fully-qualified # ๐Ÿ maple leaf
2646+1F342 ; fully-qualified # ๐Ÿ‚ fallen leaf
2647+1F343 ; fully-qualified # ๐Ÿƒ leaf fluttering in wind
2648+
2649+# Animals & Nature subtotal: 133
2650+# Animals & Nature subtotal: 133 w/o modifiers
2651+
2652+# group: Food & Drink
2653+
2654+# subgroup: food-fruit
2655+1F347 ; fully-qualified # ๐Ÿ‡ grapes
2656+1F348 ; fully-qualified # ๐Ÿˆ melon
2657+1F349 ; fully-qualified # ๐Ÿ‰ watermelon
2658+1F34A ; fully-qualified # ๐ŸŠ tangerine
2659+1F34B ; fully-qualified # ๐Ÿ‹ lemon
2660+1F34C ; fully-qualified # ๐ŸŒ banana
2661+1F34D ; fully-qualified # ๐Ÿ pineapple
2662+1F96D ; fully-qualified # ๐Ÿฅญ mango
2663+1F34E ; fully-qualified # ๐ŸŽ red apple
2664+1F34F ; fully-qualified # ๐Ÿ green apple
2665+1F350 ; fully-qualified # ๐Ÿ pear
2666+1F351 ; fully-qualified # ๐Ÿ‘ peach
2667+1F352 ; fully-qualified # ๐Ÿ’ cherries
2668+1F353 ; fully-qualified # ๐Ÿ“ strawberry
2669+1F95D ; fully-qualified # ๐Ÿฅ kiwi fruit
2670+1F345 ; fully-qualified # ๐Ÿ… tomato
2671+1F965 ; fully-qualified # ๐Ÿฅฅ coconut
2672+
2673+# subgroup: food-vegetable
2674+1F951 ; fully-qualified # ๐Ÿฅ‘ avocado
2675+1F346 ; fully-qualified # ๐Ÿ† eggplant
2676+1F954 ; fully-qualified # ๐Ÿฅ” potato
2677+1F955 ; fully-qualified # ๐Ÿฅ• carrot
2678+1F33D ; fully-qualified # ๐ŸŒฝ ear of corn
2679+1F336 FE0F ; fully-qualified # ๐ŸŒถ๏ธ hot pepper
2680+1F336 ; unqualified # ๐ŸŒถ hot pepper
2681+1F952 ; fully-qualified # ๐Ÿฅ’ cucumber
2682+1F96C ; fully-qualified # ๐Ÿฅฌ leafy green
2683+1F966 ; fully-qualified # ๐Ÿฅฆ broccoli
2684+1F9C4 ; fully-qualified # ๐Ÿง„ garlic
2685+1F9C5 ; fully-qualified # ๐Ÿง… onion
2686+1F344 ; fully-qualified # ๐Ÿ„ mushroom
2687+1F95C ; fully-qualified # ๐Ÿฅœ peanuts
2688+1F330 ; fully-qualified # ๐ŸŒฐ chestnut
2689+
2690+# subgroup: food-prepared
2691+1F35E ; fully-qualified # ๐Ÿž bread
2692+1F950 ; fully-qualified # ๐Ÿฅ croissant
2693+1F956 ; fully-qualified # ๐Ÿฅ– baguette bread
2694+1F968 ; fully-qualified # ๐Ÿฅจ pretzel
2695+1F96F ; fully-qualified # ๐Ÿฅฏ bagel
2696+1F95E ; fully-qualified # ๐Ÿฅž pancakes
2697+1F9C7 ; fully-qualified # ๐Ÿง‡ waffle
2698+1F9C0 ; fully-qualified # ๐Ÿง€ cheese wedge
2699+1F356 ; fully-qualified # ๐Ÿ– meat on bone
2700+1F357 ; fully-qualified # ๐Ÿ— poultry leg
2701+1F969 ; fully-qualified # ๐Ÿฅฉ cut of meat
2702+1F953 ; fully-qualified # ๐Ÿฅ“ bacon
2703+1F354 ; fully-qualified # ๐Ÿ” hamburger
2704+1F35F ; fully-qualified # ๐ŸŸ french fries
2705+1F355 ; fully-qualified # ๐Ÿ• pizza
2706+1F32D ; fully-qualified # ๐ŸŒญ hot dog
2707+1F96A ; fully-qualified # ๐Ÿฅช sandwich
2708+1F32E ; fully-qualified # ๐ŸŒฎ taco
2709+1F32F ; fully-qualified # ๐ŸŒฏ burrito
2710+1F959 ; fully-qualified # ๐Ÿฅ™ stuffed flatbread
2711+1F9C6 ; fully-qualified # ๐Ÿง† falafel
2712+1F95A ; fully-qualified # ๐Ÿฅš egg
2713+1F373 ; fully-qualified # ๐Ÿณ cooking
2714+1F958 ; fully-qualified # ๐Ÿฅ˜ shallow pan of food
2715+1F372 ; fully-qualified # ๐Ÿฒ pot of food
2716+1F963 ; fully-qualified # ๐Ÿฅฃ bowl with spoon
2717+1F957 ; fully-qualified # ๐Ÿฅ— green salad
2718+1F37F ; fully-qualified # ๐Ÿฟ popcorn
2719+1F9C8 ; fully-qualified # ๐Ÿงˆ butter
2720+1F9C2 ; fully-qualified # ๐Ÿง‚ salt
2721+1F96B ; fully-qualified # ๐Ÿฅซ canned food
2722+
2723+# subgroup: food-asian
2724+1F371 ; fully-qualified # ๐Ÿฑ bento box
2725+1F358 ; fully-qualified # ๐Ÿ˜ rice cracker
2726+1F359 ; fully-qualified # ๐Ÿ™ rice ball
2727+1F35A ; fully-qualified # ๐Ÿš cooked rice
2728+1F35B ; fully-qualified # ๐Ÿ› curry rice
2729+1F35C ; fully-qualified # ๐Ÿœ steaming bowl
2730+1F35D ; fully-qualified # ๐Ÿ spaghetti
2731+1F360 ; fully-qualified # ๐Ÿ  roasted sweet potato
2732+1F362 ; fully-qualified # ๐Ÿข oden
2733+1F363 ; fully-qualified # ๐Ÿฃ sushi
2734+1F364 ; fully-qualified # ๐Ÿค fried shrimp
2735+1F365 ; fully-qualified # ๐Ÿฅ fish cake with swirl
2736+1F96E ; fully-qualified # ๐Ÿฅฎ moon cake
2737+1F361 ; fully-qualified # ๐Ÿก dango
2738+1F95F ; fully-qualified # ๐ŸฅŸ dumpling
2739+1F960 ; fully-qualified # ๐Ÿฅ  fortune cookie
2740+1F961 ; fully-qualified # ๐Ÿฅก takeout box
2741+
2742+# subgroup: food-marine
2743+1F980 ; fully-qualified # ๐Ÿฆ€ crab
2744+1F99E ; fully-qualified # ๐Ÿฆž lobster
2745+1F990 ; fully-qualified # ๐Ÿฆ shrimp
2746+1F991 ; fully-qualified # ๐Ÿฆ‘ squid
2747+1F9AA ; fully-qualified # ๐Ÿฆช oyster
2748+
2749+# subgroup: food-sweet
2750+1F366 ; fully-qualified # ๐Ÿฆ soft ice cream
2751+1F367 ; fully-qualified # ๐Ÿง shaved ice
2752+1F368 ; fully-qualified # ๐Ÿจ ice cream
2753+1F369 ; fully-qualified # ๐Ÿฉ doughnut
2754+1F36A ; fully-qualified # ๐Ÿช cookie
2755+1F382 ; fully-qualified # ๐ŸŽ‚ birthday cake
2756+1F370 ; fully-qualified # ๐Ÿฐ shortcake
2757+1F9C1 ; fully-qualified # ๐Ÿง cupcake
2758+1F967 ; fully-qualified # ๐Ÿฅง pie
2759+1F36B ; fully-qualified # ๐Ÿซ chocolate bar
2760+1F36C ; fully-qualified # ๐Ÿฌ candy
2761+1F36D ; fully-qualified # ๐Ÿญ lollipop
2762+1F36E ; fully-qualified # ๐Ÿฎ custard
2763+1F36F ; fully-qualified # ๐Ÿฏ honey pot
2764+
2765+# subgroup: drink
2766+1F37C ; fully-qualified # ๐Ÿผ baby bottle
2767+1F95B ; fully-qualified # ๐Ÿฅ› glass of milk
2768+2615 ; fully-qualified # โ˜• hot beverage
2769+1F375 ; fully-qualified # ๐Ÿต teacup without handle
2770+1F376 ; fully-qualified # ๐Ÿถ sake
2771+1F37E ; fully-qualified # ๐Ÿพ bottle with popping cork
2772+1F377 ; fully-qualified # ๐Ÿท wine glass
2773+1F378 ; fully-qualified # ๐Ÿธ cocktail glass
2774+1F379 ; fully-qualified # ๐Ÿน tropical drink
2775+1F37A ; fully-qualified # ๐Ÿบ beer mug
2776+1F37B ; fully-qualified # ๐Ÿป clinking beer mugs
2777+1F942 ; fully-qualified # ๐Ÿฅ‚ clinking glasses
2778+1F943 ; fully-qualified # ๐Ÿฅƒ tumbler glass
2779+1F964 ; fully-qualified # ๐Ÿฅค cup with straw
2780+1F9C3 ; fully-qualified # ๐Ÿงƒ beverage box
2781+1F9C9 ; fully-qualified # ๐Ÿง‰ mate
2782+1F9CA ; fully-qualified # ๐ŸงŠ ice cube
2783+
2784+# subgroup: dishware
2785+1F962 ; fully-qualified # ๐Ÿฅข chopsticks
2786+1F37D FE0F ; fully-qualified # ๐Ÿฝ๏ธ fork and knife with plate
2787+1F37D ; unqualified # ๐Ÿฝ fork and knife with plate
2788+1F374 ; fully-qualified # ๐Ÿด fork and knife
2789+1F944 ; fully-qualified # ๐Ÿฅ„ spoon
2790+1F52A ; fully-qualified # ๐Ÿ”ช kitchen knife
2791+1F3FA ; fully-qualified # ๐Ÿบ amphora
2792+
2793+# Food & Drink subtotal: 123
2794+# Food & Drink subtotal: 123 w/o modifiers
2795+
2796+# group: Travel & Places
2797+
2798+# subgroup: place-map
2799+1F30D ; fully-qualified # ๐ŸŒ globe showing Europe-Africa
2800+1F30E ; fully-qualified # ๐ŸŒŽ globe showing Americas
2801+1F30F ; fully-qualified # ๐ŸŒ globe showing Asia-Australia
2802+1F310 ; fully-qualified # ๐ŸŒ globe with meridians
2803+1F5FA FE0F ; fully-qualified # ๐Ÿ—บ๏ธ world map
2804+1F5FA ; unqualified # ๐Ÿ—บ world map
2805+1F5FE ; fully-qualified # ๐Ÿ—พ map of Japan
2806+1F9ED ; fully-qualified # ๐Ÿงญ compass
2807+
2808+# subgroup: place-geographic
2809+1F3D4 FE0F ; fully-qualified # ๐Ÿ”๏ธ snow-capped mountain
2810+1F3D4 ; unqualified # ๐Ÿ” snow-capped mountain
2811+26F0 FE0F ; fully-qualified # โ›ฐ๏ธ mountain
2812+26F0 ; unqualified # โ›ฐ mountain
2813+1F30B ; fully-qualified # ๐ŸŒ‹ volcano
2814+1F5FB ; fully-qualified # ๐Ÿ—ป mount fuji
2815+1F3D5 FE0F ; fully-qualified # ๐Ÿ•๏ธ camping
2816+1F3D5 ; unqualified # ๐Ÿ• camping
2817+1F3D6 FE0F ; fully-qualified # ๐Ÿ–๏ธ beach with umbrella
2818+1F3D6 ; unqualified # ๐Ÿ– beach with umbrella
2819+1F3DC FE0F ; fully-qualified # ๐Ÿœ๏ธ desert
2820+1F3DC ; unqualified # ๐Ÿœ desert
2821+1F3DD FE0F ; fully-qualified # ๐Ÿ๏ธ desert island
2822+1F3DD ; unqualified # ๐Ÿ desert island
2823+1F3DE FE0F ; fully-qualified # ๐Ÿž๏ธ national park
2824+1F3DE ; unqualified # ๐Ÿž national park
2825+
2826+# subgroup: place-building
2827+1F3DF FE0F ; fully-qualified # ๐ŸŸ๏ธ stadium
2828+1F3DF ; unqualified # ๐ŸŸ stadium
2829+1F3DB FE0F ; fully-qualified # ๐Ÿ›๏ธ classical building
2830+1F3DB ; unqualified # ๐Ÿ› classical building
2831+1F3D7 FE0F ; fully-qualified # ๐Ÿ—๏ธ building construction
2832+1F3D7 ; unqualified # ๐Ÿ— building construction
2833+1F9F1 ; fully-qualified # ๐Ÿงฑ brick
2834+1F3D8 FE0F ; fully-qualified # ๐Ÿ˜๏ธ houses
2835+1F3D8 ; unqualified # ๐Ÿ˜ houses
2836+1F3DA FE0F ; fully-qualified # ๐Ÿš๏ธ derelict house
2837+1F3DA ; unqualified # ๐Ÿš derelict house
2838+1F3E0 ; fully-qualified # ๐Ÿ  house
2839+1F3E1 ; fully-qualified # ๐Ÿก house with garden
2840+1F3E2 ; fully-qualified # ๐Ÿข office building
2841+1F3E3 ; fully-qualified # ๐Ÿฃ Japanese post office
2842+1F3E4 ; fully-qualified # ๐Ÿค post office
2843+1F3E5 ; fully-qualified # ๐Ÿฅ hospital
2844+1F3E6 ; fully-qualified # ๐Ÿฆ bank
2845+1F3E8 ; fully-qualified # ๐Ÿจ hotel
2846+1F3E9 ; fully-qualified # ๐Ÿฉ love hotel
2847+1F3EA ; fully-qualified # ๐Ÿช convenience store
2848+1F3EB ; fully-qualified # ๐Ÿซ school
2849+1F3EC ; fully-qualified # ๐Ÿฌ department store
2850+1F3ED ; fully-qualified # ๐Ÿญ factory
2851+1F3EF ; fully-qualified # ๐Ÿฏ Japanese castle
2852+1F3F0 ; fully-qualified # ๐Ÿฐ castle
2853+1F492 ; fully-qualified # ๐Ÿ’’ wedding
2854+1F5FC ; fully-qualified # ๐Ÿ—ผ Tokyo tower
2855+1F5FD ; fully-qualified # ๐Ÿ—ฝ Statue of Liberty
2856+
2857+# subgroup: place-religious
2858+26EA ; fully-qualified # โ›ช church
2859+1F54C ; fully-qualified # ๐Ÿ•Œ mosque
2860+1F6D5 ; fully-qualified # ๐Ÿ›• hindu temple
2861+1F54D ; fully-qualified # ๐Ÿ• synagogue
2862+26E9 FE0F ; fully-qualified # โ›ฉ๏ธ shinto shrine
2863+26E9 ; unqualified # โ›ฉ shinto shrine
2864+1F54B ; fully-qualified # ๐Ÿ•‹ kaaba
2865+
2866+# subgroup: place-other
2867+26F2 ; fully-qualified # โ›ฒ fountain
2868+26FA ; fully-qualified # โ›บ tent
2869+1F301 ; fully-qualified # ๐ŸŒ foggy
2870+1F303 ; fully-qualified # ๐ŸŒƒ night with stars
2871+1F3D9 FE0F ; fully-qualified # ๐Ÿ™๏ธ cityscape
2872+1F3D9 ; unqualified # ๐Ÿ™ cityscape
2873+1F304 ; fully-qualified # ๐ŸŒ„ sunrise over mountains
2874+1F305 ; fully-qualified # ๐ŸŒ… sunrise
2875+1F306 ; fully-qualified # ๐ŸŒ† cityscape at dusk
2876+1F307 ; fully-qualified # ๐ŸŒ‡ sunset
2877+1F309 ; fully-qualified # ๐ŸŒ‰ bridge at night
2878+2668 FE0F ; fully-qualified # โ™จ๏ธ hot springs
2879+2668 ; unqualified # โ™จ hot springs
2880+1F3A0 ; fully-qualified # ๐ŸŽ  carousel horse
2881+1F3A1 ; fully-qualified # ๐ŸŽก ferris wheel
2882+1F3A2 ; fully-qualified # ๐ŸŽข roller coaster
2883+1F488 ; fully-qualified # ๐Ÿ’ˆ barber pole
2884+1F3AA ; fully-qualified # ๐ŸŽช circus tent
2885+
2886+# subgroup: transport-ground
2887+1F682 ; fully-qualified # ๐Ÿš‚ locomotive
2888+1F683 ; fully-qualified # ๐Ÿšƒ railway car
2889+1F684 ; fully-qualified # ๐Ÿš„ high-speed train
2890+1F685 ; fully-qualified # ๐Ÿš… bullet train
2891+1F686 ; fully-qualified # ๐Ÿš† train
2892+1F687 ; fully-qualified # ๐Ÿš‡ metro
2893+1F688 ; fully-qualified # ๐Ÿšˆ light rail
2894+1F689 ; fully-qualified # ๐Ÿš‰ station
2895+1F68A ; fully-qualified # ๐ŸšŠ tram
2896+1F69D ; fully-qualified # ๐Ÿš monorail
2897+1F69E ; fully-qualified # ๐Ÿšž mountain railway
2898+1F68B ; fully-qualified # ๐Ÿš‹ tram car
2899+1F68C ; fully-qualified # ๐ŸšŒ bus
2900+1F68D ; fully-qualified # ๐Ÿš oncoming bus
2901+1F68E ; fully-qualified # ๐ŸšŽ trolleybus
2902+1F690 ; fully-qualified # ๐Ÿš minibus
2903+1F691 ; fully-qualified # ๐Ÿš‘ ambulance
2904+1F692 ; fully-qualified # ๐Ÿš’ fire engine
2905+1F693 ; fully-qualified # ๐Ÿš“ police car
2906+1F694 ; fully-qualified # ๐Ÿš” oncoming police car
2907+1F695 ; fully-qualified # ๐Ÿš• taxi
2908+1F696 ; fully-qualified # ๐Ÿš– oncoming taxi
2909+1F697 ; fully-qualified # ๐Ÿš— automobile
2910+1F698 ; fully-qualified # ๐Ÿš˜ oncoming automobile
2911+1F699 ; fully-qualified # ๐Ÿš™ sport utility vehicle
2912+1F69A ; fully-qualified # ๐Ÿšš delivery truck
2913+1F69B ; fully-qualified # ๐Ÿš› articulated lorry
2914+1F69C ; fully-qualified # ๐Ÿšœ tractor
2915+1F3CE FE0F ; fully-qualified # ๐ŸŽ๏ธ racing car
2916+1F3CE ; unqualified # ๐ŸŽ racing car
2917+1F3CD FE0F ; fully-qualified # ๐Ÿ๏ธ motorcycle
2918+1F3CD ; unqualified # ๐Ÿ motorcycle
2919+1F6F5 ; fully-qualified # ๐Ÿ›ต motor scooter
2920+1F9BD ; fully-qualified # ๐Ÿฆฝ manual wheelchair
2921+1F9BC ; fully-qualified # ๐Ÿฆผ motorized wheelchair
2922+1F6FA ; fully-qualified # ๐Ÿ›บ auto rickshaw
2923+1F6B2 ; fully-qualified # ๐Ÿšฒ bicycle
2924+1F6F4 ; fully-qualified # ๐Ÿ›ด kick scooter
2925+1F6F9 ; fully-qualified # ๐Ÿ›น skateboard
2926+1F68F ; fully-qualified # ๐Ÿš bus stop
2927+1F6E3 FE0F ; fully-qualified # ๐Ÿ›ฃ๏ธ motorway
2928+1F6E3 ; unqualified # ๐Ÿ›ฃ motorway
2929+1F6E4 FE0F ; fully-qualified # ๐Ÿ›ค๏ธ railway track
2930+1F6E4 ; unqualified # ๐Ÿ›ค railway track
2931+1F6E2 FE0F ; fully-qualified # ๐Ÿ›ข๏ธ oil drum
2932+1F6E2 ; unqualified # ๐Ÿ›ข oil drum
2933+26FD ; fully-qualified # โ›ฝ fuel pump
2934+1F6A8 ; fully-qualified # ๐Ÿšจ police car light
2935+1F6A5 ; fully-qualified # ๐Ÿšฅ horizontal traffic light
2936+1F6A6 ; fully-qualified # ๐Ÿšฆ vertical traffic light
2937+1F6D1 ; fully-qualified # ๐Ÿ›‘ stop sign
2938+1F6A7 ; fully-qualified # ๐Ÿšง construction
2939+
2940+# subgroup: transport-water
2941+2693 ; fully-qualified # โš“ anchor
2942+26F5 ; fully-qualified # โ›ต sailboat
2943+1F6F6 ; fully-qualified # ๐Ÿ›ถ canoe
2944+1F6A4 ; fully-qualified # ๐Ÿšค speedboat
2945+1F6F3 FE0F ; fully-qualified # ๐Ÿ›ณ๏ธ passenger ship
2946+1F6F3 ; unqualified # ๐Ÿ›ณ passenger ship
2947+26F4 FE0F ; fully-qualified # โ›ด๏ธ ferry
2948+26F4 ; unqualified # โ›ด ferry
2949+1F6E5 FE0F ; fully-qualified # ๐Ÿ›ฅ๏ธ motor boat
2950+1F6E5 ; unqualified # ๐Ÿ›ฅ motor boat
2951+1F6A2 ; fully-qualified # ๐Ÿšข ship
2952+
2953+# subgroup: transport-air
2954+2708 FE0F ; fully-qualified # โœˆ๏ธ airplane
2955+2708 ; unqualified # โœˆ airplane
2956+1F6E9 FE0F ; fully-qualified # ๐Ÿ›ฉ๏ธ small airplane
2957+1F6E9 ; unqualified # ๐Ÿ›ฉ small airplane
2958+1F6EB ; fully-qualified # ๐Ÿ›ซ airplane departure
2959+1F6EC ; fully-qualified # ๐Ÿ›ฌ airplane arrival
2960+1FA82 ; fully-qualified # ๐Ÿช‚ parachute
2961+1F4BA ; fully-qualified # ๐Ÿ’บ seat
2962+1F681 ; fully-qualified # ๐Ÿš helicopter
2963+1F69F ; fully-qualified # ๐ŸšŸ suspension railway
2964+1F6A0 ; fully-qualified # ๐Ÿš  mountain cableway
2965+1F6A1 ; fully-qualified # ๐Ÿšก aerial tramway
2966+1F6F0 FE0F ; fully-qualified # ๐Ÿ›ฐ๏ธ satellite
2967+1F6F0 ; unqualified # ๐Ÿ›ฐ satellite
2968+1F680 ; fully-qualified # ๐Ÿš€ rocket
2969+1F6F8 ; fully-qualified # ๐Ÿ›ธ flying saucer
2970+
2971+# subgroup: hotel
2972+1F6CE FE0F ; fully-qualified # ๐Ÿ›Ž๏ธ bellhop bell
2973+1F6CE ; unqualified # ๐Ÿ›Ž bellhop bell
2974+1F9F3 ; fully-qualified # ๐Ÿงณ luggage
2975+
2976+# subgroup: time
2977+231B ; fully-qualified # โŒ› hourglass done
2978+23F3 ; fully-qualified # โณ hourglass not done
2979+231A ; fully-qualified # โŒš watch
2980+23F0 ; fully-qualified # โฐ alarm clock
2981+23F1 FE0F ; fully-qualified # โฑ๏ธ stopwatch
2982+23F1 ; unqualified # โฑ stopwatch
2983+23F2 FE0F ; fully-qualified # โฒ๏ธ timer clock
2984+23F2 ; unqualified # โฒ timer clock
2985+1F570 FE0F ; fully-qualified # ๐Ÿ•ฐ๏ธ mantelpiece clock
2986+1F570 ; unqualified # ๐Ÿ•ฐ mantelpiece clock
2987+1F55B ; fully-qualified # ๐Ÿ•› twelve oโ€™clock
2988+1F567 ; fully-qualified # ๐Ÿ•ง twelve-thirty
2989+1F550 ; fully-qualified # ๐Ÿ• one oโ€™clock
2990+1F55C ; fully-qualified # ๐Ÿ•œ one-thirty
2991+1F551 ; fully-qualified # ๐Ÿ•‘ two oโ€™clock
2992+1F55D ; fully-qualified # ๐Ÿ• two-thirty
2993+1F552 ; fully-qualified # ๐Ÿ•’ three oโ€™clock
2994+1F55E ; fully-qualified # ๐Ÿ•ž three-thirty
2995+1F553 ; fully-qualified # ๐Ÿ•“ four oโ€™clock
2996+1F55F ; fully-qualified # ๐Ÿ•Ÿ four-thirty
2997+1F554 ; fully-qualified # ๐Ÿ•” five oโ€™clock
2998+1F560 ; fully-qualified # ๐Ÿ•  five-thirty
2999+1F555 ; fully-qualified # ๐Ÿ•• six oโ€™clock
3000+1F561 ; fully-qualified # ๐Ÿ•ก six-thirty
3001+1F556 ; fully-qualified # ๐Ÿ•– seven oโ€™clock
3002+1F562 ; fully-qualified # ๐Ÿ•ข seven-thirty
3003+1F557 ; fully-qualified # ๐Ÿ•— eight oโ€™clock
3004+1F563 ; fully-qualified # ๐Ÿ•ฃ eight-thirty
3005+1F558 ; fully-qualified # ๐Ÿ•˜ nine oโ€™clock
3006+1F564 ; fully-qualified # ๐Ÿ•ค nine-thirty
3007+1F559 ; fully-qualified # ๐Ÿ•™ ten oโ€™clock
3008+1F565 ; fully-qualified # ๐Ÿ•ฅ ten-thirty
3009+1F55A ; fully-qualified # ๐Ÿ•š eleven oโ€™clock
3010+1F566 ; fully-qualified # ๐Ÿ•ฆ eleven-thirty
3011+
3012+# subgroup: sky & weather
3013+1F311 ; fully-qualified # ๐ŸŒ‘ new moon
3014+1F312 ; fully-qualified # ๐ŸŒ’ waxing crescent moon
3015+1F313 ; fully-qualified # ๐ŸŒ“ first quarter moon
3016+1F314 ; fully-qualified # ๐ŸŒ” waxing gibbous moon
3017+1F315 ; fully-qualified # ๐ŸŒ• full moon
3018+1F316 ; fully-qualified # ๐ŸŒ– waning gibbous moon
3019+1F317 ; fully-qualified # ๐ŸŒ— last quarter moon
3020+1F318 ; fully-qualified # ๐ŸŒ˜ waning crescent moon
3021+1F319 ; fully-qualified # ๐ŸŒ™ crescent moon
3022+1F31A ; fully-qualified # ๐ŸŒš new moon face
3023+1F31B ; fully-qualified # ๐ŸŒ› first quarter moon face
3024+1F31C ; fully-qualified # ๐ŸŒœ last quarter moon face
3025+1F321 FE0F ; fully-qualified # ๐ŸŒก๏ธ thermometer
3026+1F321 ; unqualified # ๐ŸŒก thermometer
3027+2600 FE0F ; fully-qualified # โ˜€๏ธ sun
3028+2600 ; unqualified # โ˜€ sun
3029+1F31D ; fully-qualified # ๐ŸŒ full moon face
3030+1F31E ; fully-qualified # ๐ŸŒž sun with face
3031+1FA90 ; fully-qualified # ๐Ÿช ringed planet
3032+2B50 ; fully-qualified # โญ star
3033+1F31F ; fully-qualified # ๐ŸŒŸ glowing star
3034+1F320 ; fully-qualified # ๐ŸŒ  shooting star
3035+1F30C ; fully-qualified # ๐ŸŒŒ milky way
3036+2601 FE0F ; fully-qualified # โ˜๏ธ cloud
3037+2601 ; unqualified # โ˜ cloud
3038+26C5 ; fully-qualified # โ›… sun behind cloud
3039+26C8 FE0F ; fully-qualified # โ›ˆ๏ธ cloud with lightning and rain
3040+26C8 ; unqualified # โ›ˆ cloud with lightning and rain
3041+1F324 FE0F ; fully-qualified # ๐ŸŒค๏ธ sun behind small cloud
3042+1F324 ; unqualified # ๐ŸŒค sun behind small cloud
3043+1F325 FE0F ; fully-qualified # ๐ŸŒฅ๏ธ sun behind large cloud
3044+1F325 ; unqualified # ๐ŸŒฅ sun behind large cloud
3045+1F326 FE0F ; fully-qualified # ๐ŸŒฆ๏ธ sun behind rain cloud
3046+1F326 ; unqualified # ๐ŸŒฆ sun behind rain cloud
3047+1F327 FE0F ; fully-qualified # ๐ŸŒง๏ธ cloud with rain
3048+1F327 ; unqualified # ๐ŸŒง cloud with rain
3049+1F328 FE0F ; fully-qualified # ๐ŸŒจ๏ธ cloud with snow
3050+1F328 ; unqualified # ๐ŸŒจ cloud with snow
3051+1F329 FE0F ; fully-qualified # ๐ŸŒฉ๏ธ cloud with lightning
3052+1F329 ; unqualified # ๐ŸŒฉ cloud with lightning
3053+1F32A FE0F ; fully-qualified # ๐ŸŒช๏ธ tornado
3054+1F32A ; unqualified # ๐ŸŒช tornado
3055+1F32B FE0F ; fully-qualified # ๐ŸŒซ๏ธ fog
3056+1F32B ; unqualified # ๐ŸŒซ fog
3057+1F32C FE0F ; fully-qualified # ๐ŸŒฌ๏ธ wind face
3058+1F32C ; unqualified # ๐ŸŒฌ wind face
3059+1F300 ; fully-qualified # ๐ŸŒ€ cyclone
3060+1F308 ; fully-qualified # ๐ŸŒˆ rainbow
3061+1F302 ; fully-qualified # ๐ŸŒ‚ closed umbrella
3062+2602 FE0F ; fully-qualified # โ˜‚๏ธ umbrella
3063+2602 ; unqualified # โ˜‚ umbrella
3064+2614 ; fully-qualified # โ˜” umbrella with rain drops
3065+26F1 FE0F ; fully-qualified # โ›ฑ๏ธ umbrella on ground
3066+26F1 ; unqualified # โ›ฑ umbrella on ground
3067+26A1 ; fully-qualified # โšก high voltage
3068+2744 FE0F ; fully-qualified # โ„๏ธ snowflake
3069+2744 ; unqualified # โ„ snowflake
3070+2603 FE0F ; fully-qualified # โ˜ƒ๏ธ snowman
3071+2603 ; unqualified # โ˜ƒ snowman
3072+26C4 ; fully-qualified # โ›„ snowman without snow
3073+2604 FE0F ; fully-qualified # โ˜„๏ธ comet
3074+2604 ; unqualified # โ˜„ comet
3075+1F525 ; fully-qualified # ๐Ÿ”ฅ fire
3076+1F4A7 ; fully-qualified # ๐Ÿ’ง droplet
3077+1F30A ; fully-qualified # ๐ŸŒŠ water wave
3078+
3079+# Travel & Places subtotal: 259
3080+# Travel & Places subtotal: 259 w/o modifiers
3081+
3082+# group: Activities
3083+
3084+# subgroup: event
3085+1F383 ; fully-qualified # ๐ŸŽƒ jack-o-lantern
3086+1F384 ; fully-qualified # ๐ŸŽ„ Christmas tree
3087+1F386 ; fully-qualified # ๐ŸŽ† fireworks
3088+1F387 ; fully-qualified # ๐ŸŽ‡ sparkler
3089+1F9E8 ; fully-qualified # ๐Ÿงจ firecracker
3090+2728 ; fully-qualified # โœจ sparkles
3091+1F388 ; fully-qualified # ๐ŸŽˆ balloon
3092+1F389 ; fully-qualified # ๐ŸŽ‰ party popper
3093+1F38A ; fully-qualified # ๐ŸŽŠ confetti ball
3094+1F38B ; fully-qualified # ๐ŸŽ‹ tanabata tree
3095+1F38D ; fully-qualified # ๐ŸŽ pine decoration
3096+1F38E ; fully-qualified # ๐ŸŽŽ Japanese dolls
3097+1F38F ; fully-qualified # ๐ŸŽ carp streamer
3098+1F390 ; fully-qualified # ๐ŸŽ wind chime
3099+1F391 ; fully-qualified # ๐ŸŽ‘ moon viewing ceremony
3100+1F9E7 ; fully-qualified # ๐Ÿงง red envelope
3101+1F380 ; fully-qualified # ๐ŸŽ€ ribbon
3102+1F381 ; fully-qualified # ๐ŸŽ wrapped gift
3103+1F397 FE0F ; fully-qualified # ๐ŸŽ—๏ธ reminder ribbon
3104+1F397 ; unqualified # ๐ŸŽ— reminder ribbon
3105+1F39F FE0F ; fully-qualified # ๐ŸŽŸ๏ธ admission tickets
3106+1F39F ; unqualified # ๐ŸŽŸ admission tickets
3107+1F3AB ; fully-qualified # ๐ŸŽซ ticket
3108+
3109+# subgroup: award-medal
3110+1F396 FE0F ; fully-qualified # ๐ŸŽ–๏ธ military medal
3111+1F396 ; unqualified # ๐ŸŽ– military medal
3112+1F3C6 ; fully-qualified # ๐Ÿ† trophy
3113+1F3C5 ; fully-qualified # ๐Ÿ… sports medal
3114+1F947 ; fully-qualified # ๐Ÿฅ‡ 1st place medal
3115+1F948 ; fully-qualified # ๐Ÿฅˆ 2nd place medal
3116+1F949 ; fully-qualified # ๐Ÿฅ‰ 3rd place medal
3117+
3118+# subgroup: sport
3119+26BD ; fully-qualified # โšฝ soccer ball
3120+26BE ; fully-qualified # โšพ baseball
3121+1F94E ; fully-qualified # ๐ŸฅŽ softball
3122+1F3C0 ; fully-qualified # ๐Ÿ€ basketball
3123+1F3D0 ; fully-qualified # ๐Ÿ volleyball
3124+1F3C8 ; fully-qualified # ๐Ÿˆ american football
3125+1F3C9 ; fully-qualified # ๐Ÿ‰ rugby football
3126+1F3BE ; fully-qualified # ๐ŸŽพ tennis
3127+1F94F ; fully-qualified # ๐Ÿฅ flying disc
3128+1F3B3 ; fully-qualified # ๐ŸŽณ bowling
3129+1F3CF ; fully-qualified # ๐Ÿ cricket game
3130+1F3D1 ; fully-qualified # ๐Ÿ‘ field hockey
3131+1F3D2 ; fully-qualified # ๐Ÿ’ ice hockey
3132+1F94D ; fully-qualified # ๐Ÿฅ lacrosse
3133+1F3D3 ; fully-qualified # ๐Ÿ“ ping pong
3134+1F3F8 ; fully-qualified # ๐Ÿธ badminton
3135+1F94A ; fully-qualified # ๐ŸฅŠ boxing glove
3136+1F94B ; fully-qualified # ๐Ÿฅ‹ martial arts uniform
3137+1F945 ; fully-qualified # ๐Ÿฅ… goal net
3138+26F3 ; fully-qualified # โ›ณ flag in hole
3139+26F8 FE0F ; fully-qualified # โ›ธ๏ธ ice skate
3140+26F8 ; unqualified # โ›ธ ice skate
3141+1F3A3 ; fully-qualified # ๐ŸŽฃ fishing pole
3142+1F93F ; fully-qualified # ๐Ÿคฟ diving mask
3143+1F3BD ; fully-qualified # ๐ŸŽฝ running shirt
3144+1F3BF ; fully-qualified # ๐ŸŽฟ skis
3145+1F6F7 ; fully-qualified # ๐Ÿ›ท sled
3146+1F94C ; fully-qualified # ๐ŸฅŒ curling stone
3147+
3148+# subgroup: game
3149+1F3AF ; fully-qualified # ๐ŸŽฏ direct hit
3150+1FA80 ; fully-qualified # ๐Ÿช€ yo-yo
3151+1FA81 ; fully-qualified # ๐Ÿช kite
3152+1F3B1 ; fully-qualified # ๐ŸŽฑ pool 8 ball
3153+1F52E ; fully-qualified # ๐Ÿ”ฎ crystal ball
3154+1F9FF ; fully-qualified # ๐Ÿงฟ nazar amulet
3155+1F3AE ; fully-qualified # ๐ŸŽฎ video game
3156+1F579 FE0F ; fully-qualified # ๐Ÿ•น๏ธ joystick
3157+1F579 ; unqualified # ๐Ÿ•น joystick
3158+1F3B0 ; fully-qualified # ๐ŸŽฐ slot machine
3159+1F3B2 ; fully-qualified # ๐ŸŽฒ game die
3160+1F9E9 ; fully-qualified # ๐Ÿงฉ puzzle piece
3161+1F9F8 ; fully-qualified # ๐Ÿงธ teddy bear
3162+2660 FE0F ; fully-qualified # โ™ ๏ธ spade suit
3163+2660 ; unqualified # โ™  spade suit
3164+2665 FE0F ; fully-qualified # โ™ฅ๏ธ heart suit
3165+2665 ; unqualified # โ™ฅ heart suit
3166+2666 FE0F ; fully-qualified # โ™ฆ๏ธ diamond suit
3167+2666 ; unqualified # โ™ฆ diamond suit
3168+2663 FE0F ; fully-qualified # โ™ฃ๏ธ club suit
3169+2663 ; unqualified # โ™ฃ club suit
3170+265F FE0F ; fully-qualified # โ™Ÿ๏ธ chess pawn
3171+265F ; unqualified # โ™Ÿ chess pawn
3172+1F0CF ; fully-qualified # ๐Ÿƒ joker
3173+1F004 ; fully-qualified # ๐Ÿ€„ mahjong red dragon
3174+1F3B4 ; fully-qualified # ๐ŸŽด flower playing cards
3175+
3176+# subgroup: arts & crafts
3177+1F3AD ; fully-qualified # ๐ŸŽญ performing arts
3178+1F5BC FE0F ; fully-qualified # ๐Ÿ–ผ๏ธ framed picture
3179+1F5BC ; unqualified # ๐Ÿ–ผ framed picture
3180+1F3A8 ; fully-qualified # ๐ŸŽจ artist palette
3181+1F9F5 ; fully-qualified # ๐Ÿงต thread
3182+1F9F6 ; fully-qualified # ๐Ÿงถ yarn
3183+
3184+# Activities subtotal: 90
3185+# Activities subtotal: 90 w/o modifiers
3186+
3187+# group: Objects
3188+
3189+# subgroup: clothing
3190+1F453 ; fully-qualified # ๐Ÿ‘“ glasses
3191+1F576 FE0F ; fully-qualified # ๐Ÿ•ถ๏ธ sunglasses
3192+1F576 ; unqualified # ๐Ÿ•ถ sunglasses
3193+1F97D ; fully-qualified # ๐Ÿฅฝ goggles
3194+1F97C ; fully-qualified # ๐Ÿฅผ lab coat
3195+1F9BA ; fully-qualified # ๐Ÿฆบ safety vest
3196+1F454 ; fully-qualified # ๐Ÿ‘” necktie
3197+1F455 ; fully-qualified # ๐Ÿ‘• t-shirt
3198+1F456 ; fully-qualified # ๐Ÿ‘– jeans
3199+1F9E3 ; fully-qualified # ๐Ÿงฃ scarf
3200+1F9E4 ; fully-qualified # ๐Ÿงค gloves
3201+1F9E5 ; fully-qualified # ๐Ÿงฅ coat
3202+1F9E6 ; fully-qualified # ๐Ÿงฆ socks
3203+1F457 ; fully-qualified # ๐Ÿ‘— dress
3204+1F458 ; fully-qualified # ๐Ÿ‘˜ kimono
3205+1F97B ; fully-qualified # ๐Ÿฅป sari
3206+1FA71 ; fully-qualified # ๐Ÿฉฑ one-piece swimsuit
3207+1FA72 ; fully-qualified # ๐Ÿฉฒ swim brief
3208+1FA73 ; fully-qualified # ๐Ÿฉณ shorts
3209+1F459 ; fully-qualified # ๐Ÿ‘™ bikini
3210+1F45A ; fully-qualified # ๐Ÿ‘š womanโ€™s clothes
3211+1F45B ; fully-qualified # ๐Ÿ‘› purse
3212+1F45C ; fully-qualified # ๐Ÿ‘œ handbag
3213+1F45D ; fully-qualified # ๐Ÿ‘ clutch bag
3214+1F6CD FE0F ; fully-qualified # ๐Ÿ›๏ธ shopping bags
3215+1F6CD ; unqualified # ๐Ÿ› shopping bags
3216+1F392 ; fully-qualified # ๐ŸŽ’ backpack
3217+1F45E ; fully-qualified # ๐Ÿ‘ž manโ€™s shoe
3218+1F45F ; fully-qualified # ๐Ÿ‘Ÿ running shoe
3219+1F97E ; fully-qualified # ๐Ÿฅพ hiking boot
3220+1F97F ; fully-qualified # ๐Ÿฅฟ flat shoe
3221+1F460 ; fully-qualified # ๐Ÿ‘  high-heeled shoe
3222+1F461 ; fully-qualified # ๐Ÿ‘ก womanโ€™s sandal
3223+1FA70 ; fully-qualified # ๐Ÿฉฐ ballet shoes
3224+1F462 ; fully-qualified # ๐Ÿ‘ข womanโ€™s boot
3225+1F451 ; fully-qualified # ๐Ÿ‘‘ crown
3226+1F452 ; fully-qualified # ๐Ÿ‘’ womanโ€™s hat
3227+1F3A9 ; fully-qualified # ๐ŸŽฉ top hat
3228+1F393 ; fully-qualified # ๐ŸŽ“ graduation cap
3229+1F9E2 ; fully-qualified # ๐Ÿงข billed cap
3230+26D1 FE0F ; fully-qualified # โ›‘๏ธ rescue workerโ€™s helmet
3231+26D1 ; unqualified # โ›‘ rescue workerโ€™s helmet
3232+1F4FF ; fully-qualified # ๐Ÿ“ฟ prayer beads
3233+1F484 ; fully-qualified # ๐Ÿ’„ lipstick
3234+1F48D ; fully-qualified # ๐Ÿ’ ring
3235+1F48E ; fully-qualified # ๐Ÿ’Ž gem stone
3236+
3237+# subgroup: sound
3238+1F507 ; fully-qualified # ๐Ÿ”‡ muted speaker
3239+1F508 ; fully-qualified # ๐Ÿ”ˆ speaker low volume
3240+1F509 ; fully-qualified # ๐Ÿ”‰ speaker medium volume
3241+1F50A ; fully-qualified # ๐Ÿ”Š speaker high volume
3242+1F4E2 ; fully-qualified # ๐Ÿ“ข loudspeaker
3243+1F4E3 ; fully-qualified # ๐Ÿ“ฃ megaphone
3244+1F4EF ; fully-qualified # ๐Ÿ“ฏ postal horn
3245+1F514 ; fully-qualified # ๐Ÿ”” bell
3246+1F515 ; fully-qualified # ๐Ÿ”• bell with slash
3247+
3248+# subgroup: music
3249+1F3BC ; fully-qualified # ๐ŸŽผ musical score
3250+1F3B5 ; fully-qualified # ๐ŸŽต musical note
3251+1F3B6 ; fully-qualified # ๐ŸŽถ musical notes
3252+1F399 FE0F ; fully-qualified # ๐ŸŽ™๏ธ studio microphone
3253+1F399 ; unqualified # ๐ŸŽ™ studio microphone
3254+1F39A FE0F ; fully-qualified # ๐ŸŽš๏ธ level slider
3255+1F39A ; unqualified # ๐ŸŽš level slider
3256+1F39B FE0F ; fully-qualified # ๐ŸŽ›๏ธ control knobs
3257+1F39B ; unqualified # ๐ŸŽ› control knobs
3258+1F3A4 ; fully-qualified # ๐ŸŽค microphone
3259+1F3A7 ; fully-qualified # ๐ŸŽง headphone
3260+1F4FB ; fully-qualified # ๐Ÿ“ป radio
3261+
3262+# subgroup: musical-instrument
3263+1F3B7 ; fully-qualified # ๐ŸŽท saxophone
3264+1F3B8 ; fully-qualified # ๐ŸŽธ guitar
3265+1F3B9 ; fully-qualified # ๐ŸŽน musical keyboard
3266+1F3BA ; fully-qualified # ๐ŸŽบ trumpet
3267+1F3BB ; fully-qualified # ๐ŸŽป violin
3268+1FA95 ; fully-qualified # ๐Ÿช• banjo
3269+1F941 ; fully-qualified # ๐Ÿฅ drum
3270+
3271+# subgroup: phone
3272+1F4F1 ; fully-qualified # ๐Ÿ“ฑ mobile phone
3273+1F4F2 ; fully-qualified # ๐Ÿ“ฒ mobile phone with arrow
3274+260E FE0F ; fully-qualified # โ˜Ž๏ธ telephone
3275+260E ; unqualified # โ˜Ž telephone
3276+1F4DE ; fully-qualified # ๐Ÿ“ž telephone receiver
3277+1F4DF ; fully-qualified # ๐Ÿ“Ÿ pager
3278+1F4E0 ; fully-qualified # ๐Ÿ“  fax machine
3279+
3280+# subgroup: computer
3281+1F50B ; fully-qualified # ๐Ÿ”‹ battery
3282+1F50C ; fully-qualified # ๐Ÿ”Œ electric plug
3283+1F4BB ; fully-qualified # ๐Ÿ’ป laptop computer
3284+1F5A5 FE0F ; fully-qualified # ๐Ÿ–ฅ๏ธ desktop computer
3285+1F5A5 ; unqualified # ๐Ÿ–ฅ desktop computer
3286+1F5A8 FE0F ; fully-qualified # ๐Ÿ–จ๏ธ printer
3287+1F5A8 ; unqualified # ๐Ÿ–จ printer
3288+2328 FE0F ; fully-qualified # โŒจ๏ธ keyboard
3289+2328 ; unqualified # โŒจ keyboard
3290+1F5B1 FE0F ; fully-qualified # ๐Ÿ–ฑ๏ธ computer mouse
3291+1F5B1 ; unqualified # ๐Ÿ–ฑ computer mouse
3292+1F5B2 FE0F ; fully-qualified # ๐Ÿ–ฒ๏ธ trackball
3293+1F5B2 ; unqualified # ๐Ÿ–ฒ trackball
3294+1F4BD ; fully-qualified # ๐Ÿ’ฝ computer disk
3295+1F4BE ; fully-qualified # ๐Ÿ’พ floppy disk
3296+1F4BF ; fully-qualified # ๐Ÿ’ฟ optical disk
3297+1F4C0 ; fully-qualified # ๐Ÿ“€ dvd
3298+1F9EE ; fully-qualified # ๐Ÿงฎ abacus
3299+
3300+# subgroup: light & video
3301+1F3A5 ; fully-qualified # ๐ŸŽฅ movie camera
3302+1F39E FE0F ; fully-qualified # ๐ŸŽž๏ธ film frames
3303+1F39E ; unqualified # ๐ŸŽž film frames
3304+1F4FD FE0F ; fully-qualified # ๐Ÿ“ฝ๏ธ film projector
3305+1F4FD ; unqualified # ๐Ÿ“ฝ film projector
3306+1F3AC ; fully-qualified # ๐ŸŽฌ clapper board
3307+1F4FA ; fully-qualified # ๐Ÿ“บ television
3308+1F4F7 ; fully-qualified # ๐Ÿ“ท camera
3309+1F4F8 ; fully-qualified # ๐Ÿ“ธ camera with flash
3310+1F4F9 ; fully-qualified # ๐Ÿ“น video camera
3311+1F4FC ; fully-qualified # ๐Ÿ“ผ videocassette
3312+1F50D ; fully-qualified # ๐Ÿ” magnifying glass tilted left
3313+1F50E ; fully-qualified # ๐Ÿ”Ž magnifying glass tilted right
3314+1F56F FE0F ; fully-qualified # ๐Ÿ•ฏ๏ธ candle
3315+1F56F ; unqualified # ๐Ÿ•ฏ candle
3316+1F4A1 ; fully-qualified # ๐Ÿ’ก light bulb
3317+1F526 ; fully-qualified # ๐Ÿ”ฆ flashlight
3318+1F3EE ; fully-qualified # ๐Ÿฎ red paper lantern
3319+1FA94 ; fully-qualified # ๐Ÿช” diya lamp
3320+
3321+# subgroup: book-paper
3322+1F4D4 ; fully-qualified # ๐Ÿ“” notebook with decorative cover
3323+1F4D5 ; fully-qualified # ๐Ÿ“• closed book
3324+1F4D6 ; fully-qualified # ๐Ÿ“– open book
3325+1F4D7 ; fully-qualified # ๐Ÿ“— green book
3326+1F4D8 ; fully-qualified # ๐Ÿ“˜ blue book
3327+1F4D9 ; fully-qualified # ๐Ÿ“™ orange book
3328+1F4DA ; fully-qualified # ๐Ÿ“š books
3329+1F4D3 ; fully-qualified # ๐Ÿ““ notebook
3330+1F4D2 ; fully-qualified # ๐Ÿ“’ ledger
3331+1F4C3 ; fully-qualified # ๐Ÿ“ƒ page with curl
3332+1F4DC ; fully-qualified # ๐Ÿ“œ scroll
3333+1F4C4 ; fully-qualified # ๐Ÿ“„ page facing up
3334+1F4F0 ; fully-qualified # ๐Ÿ“ฐ newspaper
3335+1F5DE FE0F ; fully-qualified # ๐Ÿ—ž๏ธ rolled-up newspaper
3336+1F5DE ; unqualified # ๐Ÿ—ž rolled-up newspaper
3337+1F4D1 ; fully-qualified # ๐Ÿ“‘ bookmark tabs
3338+1F516 ; fully-qualified # ๐Ÿ”– bookmark
3339+1F3F7 FE0F ; fully-qualified # ๐Ÿท๏ธ label
3340+1F3F7 ; unqualified # ๐Ÿท label
3341+
3342+# subgroup: money
3343+1F4B0 ; fully-qualified # ๐Ÿ’ฐ money bag
3344+1F4B4 ; fully-qualified # ๐Ÿ’ด yen banknote
3345+1F4B5 ; fully-qualified # ๐Ÿ’ต dollar banknote
3346+1F4B6 ; fully-qualified # ๐Ÿ’ถ euro banknote
3347+1F4B7 ; fully-qualified # ๐Ÿ’ท pound banknote
3348+1F4B8 ; fully-qualified # ๐Ÿ’ธ money with wings
3349+1F4B3 ; fully-qualified # ๐Ÿ’ณ credit card
3350+1F9FE ; fully-qualified # ๐Ÿงพ receipt
3351+1F4B9 ; fully-qualified # ๐Ÿ’น chart increasing with yen
3352+1F4B1 ; fully-qualified # ๐Ÿ’ฑ currency exchange
3353+1F4B2 ; fully-qualified # ๐Ÿ’ฒ heavy dollar sign
3354+
3355+# subgroup: mail
3356+2709 FE0F ; fully-qualified # โœ‰๏ธ envelope
3357+2709 ; unqualified # โœ‰ envelope
3358+1F4E7 ; fully-qualified # ๐Ÿ“ง e-mail
3359+1F4E8 ; fully-qualified # ๐Ÿ“จ incoming envelope
3360+1F4E9 ; fully-qualified # ๐Ÿ“ฉ envelope with arrow
3361+1F4E4 ; fully-qualified # ๐Ÿ“ค outbox tray
3362+1F4E5 ; fully-qualified # ๐Ÿ“ฅ inbox tray
3363+1F4E6 ; fully-qualified # ๐Ÿ“ฆ package
3364+1F4EB ; fully-qualified # ๐Ÿ“ซ closed mailbox with raised flag
3365+1F4EA ; fully-qualified # ๐Ÿ“ช closed mailbox with lowered flag
3366+1F4EC ; fully-qualified # ๐Ÿ“ฌ open mailbox with raised flag
3367+1F4ED ; fully-qualified # ๐Ÿ“ญ open mailbox with lowered flag
3368+1F4EE ; fully-qualified # ๐Ÿ“ฎ postbox
3369+1F5F3 FE0F ; fully-qualified # ๐Ÿ—ณ๏ธ ballot box with ballot
3370+1F5F3 ; unqualified # ๐Ÿ—ณ ballot box with ballot
3371+
3372+# subgroup: writing
3373+270F FE0F ; fully-qualified # โœ๏ธ pencil
3374+270F ; unqualified # โœ pencil
3375+2712 FE0F ; fully-qualified # โœ’๏ธ black nib
3376+2712 ; unqualified # โœ’ black nib
3377+1F58B FE0F ; fully-qualified # ๐Ÿ–‹๏ธ fountain pen
3378+1F58B ; unqualified # ๐Ÿ–‹ fountain pen
3379+1F58A FE0F ; fully-qualified # ๐Ÿ–Š๏ธ pen
3380+1F58A ; unqualified # ๐Ÿ–Š pen
3381+1F58C FE0F ; fully-qualified # ๐Ÿ–Œ๏ธ paintbrush
3382+1F58C ; unqualified # ๐Ÿ–Œ paintbrush
3383+1F58D FE0F ; fully-qualified # ๐Ÿ–๏ธ crayon
3384+1F58D ; unqualified # ๐Ÿ– crayon
3385+1F4DD ; fully-qualified # ๐Ÿ“ memo
3386+
3387+# subgroup: office
3388+1F4BC ; fully-qualified # ๐Ÿ’ผ briefcase
3389+1F4C1 ; fully-qualified # ๐Ÿ“ file folder
3390+1F4C2 ; fully-qualified # ๐Ÿ“‚ open file folder
3391+1F5C2 FE0F ; fully-qualified # ๐Ÿ—‚๏ธ card index dividers
3392+1F5C2 ; unqualified # ๐Ÿ—‚ card index dividers
3393+1F4C5 ; fully-qualified # ๐Ÿ“… calendar
3394+1F4C6 ; fully-qualified # ๐Ÿ“† tear-off calendar
3395+1F5D2 FE0F ; fully-qualified # ๐Ÿ—’๏ธ spiral notepad
3396+1F5D2 ; unqualified # ๐Ÿ—’ spiral notepad
3397+1F5D3 FE0F ; fully-qualified # ๐Ÿ—“๏ธ spiral calendar
3398+1F5D3 ; unqualified # ๐Ÿ—“ spiral calendar
3399+1F4C7 ; fully-qualified # ๐Ÿ“‡ card index
3400+1F4C8 ; fully-qualified # ๐Ÿ“ˆ chart increasing
3401+1F4C9 ; fully-qualified # ๐Ÿ“‰ chart decreasing
3402+1F4CA ; fully-qualified # ๐Ÿ“Š bar chart
3403+1F4CB ; fully-qualified # ๐Ÿ“‹ clipboard
3404+1F4CC ; fully-qualified # ๐Ÿ“Œ pushpin
3405+1F4CD ; fully-qualified # ๐Ÿ“ round pushpin
3406+1F4CE ; fully-qualified # ๐Ÿ“Ž paperclip
3407+1F587 FE0F ; fully-qualified # ๐Ÿ–‡๏ธ linked paperclips
3408+1F587 ; unqualified # ๐Ÿ–‡ linked paperclips
3409+1F4CF ; fully-qualified # ๐Ÿ“ straight ruler
3410+1F4D0 ; fully-qualified # ๐Ÿ“ triangular ruler
3411+2702 FE0F ; fully-qualified # โœ‚๏ธ scissors
3412+2702 ; unqualified # โœ‚ scissors
3413+1F5C3 FE0F ; fully-qualified # ๐Ÿ—ƒ๏ธ card file box
3414+1F5C3 ; unqualified # ๐Ÿ—ƒ card file box
3415+1F5C4 FE0F ; fully-qualified # ๐Ÿ—„๏ธ file cabinet
3416+1F5C4 ; unqualified # ๐Ÿ—„ file cabinet
3417+1F5D1 FE0F ; fully-qualified # ๐Ÿ—‘๏ธ wastebasket
3418+1F5D1 ; unqualified # ๐Ÿ—‘ wastebasket
3419+
3420+# subgroup: lock
3421+1F512 ; fully-qualified # ๐Ÿ”’ locked
3422+1F513 ; fully-qualified # ๐Ÿ”“ unlocked
3423+1F50F ; fully-qualified # ๐Ÿ” locked with pen
3424+1F510 ; fully-qualified # ๐Ÿ” locked with key
3425+1F511 ; fully-qualified # ๐Ÿ”‘ key
3426+1F5DD FE0F ; fully-qualified # ๐Ÿ—๏ธ old key
3427+1F5DD ; unqualified # ๐Ÿ— old key
3428+
3429+# subgroup: tool
3430+1F528 ; fully-qualified # ๐Ÿ”จ hammer
3431+1FA93 ; fully-qualified # ๐Ÿช“ axe
3432+26CF FE0F ; fully-qualified # โ›๏ธ pick
3433+26CF ; unqualified # โ› pick
3434+2692 FE0F ; fully-qualified # โš’๏ธ hammer and pick
3435+2692 ; unqualified # โš’ hammer and pick
3436+1F6E0 FE0F ; fully-qualified # ๐Ÿ› ๏ธ hammer and wrench
3437+1F6E0 ; unqualified # ๐Ÿ›  hammer and wrench
3438+1F5E1 FE0F ; fully-qualified # ๐Ÿ—ก๏ธ dagger
3439+1F5E1 ; unqualified # ๐Ÿ—ก dagger
3440+2694 FE0F ; fully-qualified # โš”๏ธ crossed swords
3441+2694 ; unqualified # โš” crossed swords
3442+1F52B ; fully-qualified # ๐Ÿ”ซ pistol
3443+1F3F9 ; fully-qualified # ๐Ÿน bow and arrow
3444+1F6E1 FE0F ; fully-qualified # ๐Ÿ›ก๏ธ shield
3445+1F6E1 ; unqualified # ๐Ÿ›ก shield
3446+1F527 ; fully-qualified # ๐Ÿ”ง wrench
3447+1F529 ; fully-qualified # ๐Ÿ”ฉ nut and bolt
3448+2699 FE0F ; fully-qualified # โš™๏ธ gear
3449+2699 ; unqualified # โš™ gear
3450+1F5DC FE0F ; fully-qualified # ๐Ÿ—œ๏ธ clamp
3451+1F5DC ; unqualified # ๐Ÿ—œ clamp
3452+2696 FE0F ; fully-qualified # โš–๏ธ balance scale
3453+2696 ; unqualified # โš– balance scale
3454+1F9AF ; fully-qualified # ๐Ÿฆฏ probing cane
3455+1F517 ; fully-qualified # ๐Ÿ”— link
3456+26D3 FE0F ; fully-qualified # โ›“๏ธ chains
3457+26D3 ; unqualified # โ›“ chains
3458+1F9F0 ; fully-qualified # ๐Ÿงฐ toolbox
3459+1F9F2 ; fully-qualified # ๐Ÿงฒ magnet
3460+
3461+# subgroup: science
3462+2697 FE0F ; fully-qualified # โš—๏ธ alembic
3463+2697 ; unqualified # โš— alembic
3464+1F9EA ; fully-qualified # ๐Ÿงช test tube
3465+1F9EB ; fully-qualified # ๐Ÿงซ petri dish
3466+1F9EC ; fully-qualified # ๐Ÿงฌ dna
3467+1F52C ; fully-qualified # ๐Ÿ”ฌ microscope
3468+1F52D ; fully-qualified # ๐Ÿ”ญ telescope
3469+1F4E1 ; fully-qualified # ๐Ÿ“ก satellite antenna
3470+
3471+# subgroup: medical
3472+1F489 ; fully-qualified # ๐Ÿ’‰ syringe
3473+1FA78 ; fully-qualified # ๐Ÿฉธ drop of blood
3474+1F48A ; fully-qualified # ๐Ÿ’Š pill
3475+1FA79 ; fully-qualified # ๐Ÿฉน adhesive bandage
3476+1FA7A ; fully-qualified # ๐Ÿฉบ stethoscope
3477+
3478+# subgroup: household
3479+1F6AA ; fully-qualified # ๐Ÿšช door
3480+1F6CF FE0F ; fully-qualified # ๐Ÿ›๏ธ bed
3481+1F6CF ; unqualified # ๐Ÿ› bed
3482+1F6CB FE0F ; fully-qualified # ๐Ÿ›‹๏ธ couch and lamp
3483+1F6CB ; unqualified # ๐Ÿ›‹ couch and lamp
3484+1FA91 ; fully-qualified # ๐Ÿช‘ chair
3485+1F6BD ; fully-qualified # ๐Ÿšฝ toilet
3486+1F6BF ; fully-qualified # ๐Ÿšฟ shower
3487+1F6C1 ; fully-qualified # ๐Ÿ› bathtub
3488+1FA92 ; fully-qualified # ๐Ÿช’ razor
3489+1F9F4 ; fully-qualified # ๐Ÿงด lotion bottle
3490+1F9F7 ; fully-qualified # ๐Ÿงท safety pin
3491+1F9F9 ; fully-qualified # ๐Ÿงน broom
3492+1F9FA ; fully-qualified # ๐Ÿงบ basket
3493+1F9FB ; fully-qualified # ๐Ÿงป roll of paper
3494+1F9FC ; fully-qualified # ๐Ÿงผ soap
3495+1F9FD ; fully-qualified # ๐Ÿงฝ sponge
3496+1F9EF ; fully-qualified # ๐Ÿงฏ fire extinguisher
3497+1F6D2 ; fully-qualified # ๐Ÿ›’ shopping cart
3498+
3499+# subgroup: other-object
3500+1F6AC ; fully-qualified # ๐Ÿšฌ cigarette
3501+26B0 FE0F ; fully-qualified # โšฐ๏ธ coffin
3502+26B0 ; unqualified # โšฐ coffin
3503+26B1 FE0F ; fully-qualified # โšฑ๏ธ funeral urn
3504+26B1 ; unqualified # โšฑ funeral urn
3505+1F5FF ; fully-qualified # ๐Ÿ—ฟ moai
3506+
3507+# Objects subtotal: 282
3508+# Objects subtotal: 282 w/o modifiers
3509+
3510+# group: Symbols
3511+
3512+# subgroup: transport-sign
3513+1F3E7 ; fully-qualified # ๐Ÿง ATM sign
3514+1F6AE ; fully-qualified # ๐Ÿšฎ litter in bin sign
3515+1F6B0 ; fully-qualified # ๐Ÿšฐ potable water
3516+267F ; fully-qualified # โ™ฟ wheelchair symbol
3517+1F6B9 ; fully-qualified # ๐Ÿšน menโ€™s room
3518+1F6BA ; fully-qualified # ๐Ÿšบ womenโ€™s room
3519+1F6BB ; fully-qualified # ๐Ÿšป restroom
3520+1F6BC ; fully-qualified # ๐Ÿšผ baby symbol
3521+1F6BE ; fully-qualified # ๐Ÿšพ water closet
3522+1F6C2 ; fully-qualified # ๐Ÿ›‚ passport control
3523+1F6C3 ; fully-qualified # ๐Ÿ›ƒ customs
3524+1F6C4 ; fully-qualified # ๐Ÿ›„ baggage claim
3525+1F6C5 ; fully-qualified # ๐Ÿ›… left luggage
3526+
3527+# subgroup: warning
3528+26A0 FE0F ; fully-qualified # โš ๏ธ warning
3529+26A0 ; unqualified # โš  warning
3530+1F6B8 ; fully-qualified # ๐Ÿšธ children crossing
3531+26D4 ; fully-qualified # โ›” no entry
3532+1F6AB ; fully-qualified # ๐Ÿšซ prohibited
3533+1F6B3 ; fully-qualified # ๐Ÿšณ no bicycles
3534+1F6AD ; fully-qualified # ๐Ÿšญ no smoking
3535+1F6AF ; fully-qualified # ๐Ÿšฏ no littering
3536+1F6B1 ; fully-qualified # ๐Ÿšฑ non-potable water
3537+1F6B7 ; fully-qualified # ๐Ÿšท no pedestrians
3538+1F4F5 ; fully-qualified # ๐Ÿ“ต no mobile phones
3539+1F51E ; fully-qualified # ๐Ÿ”ž no one under eighteen
3540+2622 FE0F ; fully-qualified # โ˜ข๏ธ radioactive
3541+2622 ; unqualified # โ˜ข radioactive
3542+2623 FE0F ; fully-qualified # โ˜ฃ๏ธ biohazard
3543+2623 ; unqualified # โ˜ฃ biohazard
3544+
3545+# subgroup: arrow
3546+2B06 FE0F ; fully-qualified # โฌ†๏ธ up arrow
3547+2B06 ; unqualified # โฌ† up arrow
3548+2197 FE0F ; fully-qualified # โ†—๏ธ up-right arrow
3549+2197 ; unqualified # โ†— up-right arrow
3550+27A1 FE0F ; fully-qualified # โžก๏ธ right arrow
3551+27A1 ; unqualified # โžก right arrow
3552+2198 FE0F ; fully-qualified # โ†˜๏ธ down-right arrow
3553+2198 ; unqualified # โ†˜ down-right arrow
3554+2B07 FE0F ; fully-qualified # โฌ‡๏ธ down arrow
3555+2B07 ; unqualified # โฌ‡ down arrow
3556+2199 FE0F ; fully-qualified # โ†™๏ธ down-left arrow
3557+2199 ; unqualified # โ†™ down-left arrow
3558+2B05 FE0F ; fully-qualified # โฌ…๏ธ left arrow
3559+2B05 ; unqualified # โฌ… left arrow
3560+2196 FE0F ; fully-qualified # โ†–๏ธ up-left arrow
3561+2196 ; unqualified # โ†– up-left arrow
3562+2195 FE0F ; fully-qualified # โ†•๏ธ up-down arrow
3563+2195 ; unqualified # โ†• up-down arrow
3564+2194 FE0F ; fully-qualified # โ†”๏ธ left-right arrow
3565+2194 ; unqualified # โ†” left-right arrow
3566+21A9 FE0F ; fully-qualified # โ†ฉ๏ธ right arrow curving left
3567+21A9 ; unqualified # โ†ฉ right arrow curving left
3568+21AA FE0F ; fully-qualified # โ†ช๏ธ left arrow curving right
3569+21AA ; unqualified # โ†ช left arrow curving right
3570+2934 FE0F ; fully-qualified # โคด๏ธ right arrow curving up
3571+2934 ; unqualified # โคด right arrow curving up
3572+2935 FE0F ; fully-qualified # โคต๏ธ right arrow curving down
3573+2935 ; unqualified # โคต right arrow curving down
3574+1F503 ; fully-qualified # ๐Ÿ”ƒ clockwise vertical arrows
3575+1F504 ; fully-qualified # ๐Ÿ”„ counterclockwise arrows button
3576+1F519 ; fully-qualified # ๐Ÿ”™ BACK arrow
3577+1F51A ; fully-qualified # ๐Ÿ”š END arrow
3578+1F51B ; fully-qualified # ๐Ÿ”› ON! arrow
3579+1F51C ; fully-qualified # ๐Ÿ”œ SOON arrow
3580+1F51D ; fully-qualified # ๐Ÿ” TOP arrow
3581+
3582+# subgroup: religion
3583+1F6D0 ; fully-qualified # ๐Ÿ› place of worship
3584+269B FE0F ; fully-qualified # โš›๏ธ atom symbol
3585+269B ; unqualified # โš› atom symbol
3586+1F549 FE0F ; fully-qualified # ๐Ÿ•‰๏ธ om
3587+1F549 ; unqualified # ๐Ÿ•‰ om
3588+2721 FE0F ; fully-qualified # โœก๏ธ star of David
3589+2721 ; unqualified # โœก star of David
3590+2638 FE0F ; fully-qualified # โ˜ธ๏ธ wheel of dharma
3591+2638 ; unqualified # โ˜ธ wheel of dharma
3592+262F FE0F ; fully-qualified # โ˜ฏ๏ธ yin yang
3593+262F ; unqualified # โ˜ฏ yin yang
3594+271D FE0F ; fully-qualified # โœ๏ธ latin cross
3595+271D ; unqualified # โœ latin cross
3596+2626 FE0F ; fully-qualified # โ˜ฆ๏ธ orthodox cross
3597+2626 ; unqualified # โ˜ฆ orthodox cross
3598+262A FE0F ; fully-qualified # โ˜ช๏ธ star and crescent
3599+262A ; unqualified # โ˜ช star and crescent
3600+262E FE0F ; fully-qualified # โ˜ฎ๏ธ peace symbol
3601+262E ; unqualified # โ˜ฎ peace symbol
3602+1F54E ; fully-qualified # ๐Ÿ•Ž menorah
3603+1F52F ; fully-qualified # ๐Ÿ”ฏ dotted six-pointed star
3604+
3605+# subgroup: zodiac
3606+2648 ; fully-qualified # โ™ˆ Aries
3607+2649 ; fully-qualified # โ™‰ Taurus
3608+264A ; fully-qualified # โ™Š Gemini
3609+264B ; fully-qualified # โ™‹ Cancer
3610+264C ; fully-qualified # โ™Œ Leo
3611+264D ; fully-qualified # โ™ Virgo
3612+264E ; fully-qualified # โ™Ž Libra
3613+264F ; fully-qualified # โ™ Scorpio
3614+2650 ; fully-qualified # โ™ Sagittarius
3615+2651 ; fully-qualified # โ™‘ Capricorn
3616+2652 ; fully-qualified # โ™’ Aquarius
3617+2653 ; fully-qualified # โ™“ Pisces
3618+26CE ; fully-qualified # โ›Ž Ophiuchus
3619+
3620+# subgroup: av-symbol
3621+1F500 ; fully-qualified # ๐Ÿ”€ shuffle tracks button
3622+1F501 ; fully-qualified # ๐Ÿ” repeat button
3623+1F502 ; fully-qualified # ๐Ÿ”‚ repeat single button
3624+25B6 FE0F ; fully-qualified # โ–ถ๏ธ play button
3625+25B6 ; unqualified # โ–ถ play button
3626+23E9 ; fully-qualified # โฉ fast-forward button
3627+23ED FE0F ; fully-qualified # โญ๏ธ next track button
3628+23ED ; unqualified # โญ next track button
3629+23EF FE0F ; fully-qualified # โฏ๏ธ play or pause button
3630+23EF ; unqualified # โฏ play or pause button
3631+25C0 FE0F ; fully-qualified # โ—€๏ธ reverse button
3632+25C0 ; unqualified # โ—€ reverse button
3633+23EA ; fully-qualified # โช fast reverse button
3634+23EE FE0F ; fully-qualified # โฎ๏ธ last track button
3635+23EE ; unqualified # โฎ last track button
3636+1F53C ; fully-qualified # ๐Ÿ”ผ upwards button
3637+23EB ; fully-qualified # โซ fast up button
3638+1F53D ; fully-qualified # ๐Ÿ”ฝ downwards button
3639+23EC ; fully-qualified # โฌ fast down button
3640+23F8 FE0F ; fully-qualified # โธ๏ธ pause button
3641+23F8 ; unqualified # โธ pause button
3642+23F9 FE0F ; fully-qualified # โน๏ธ stop button
3643+23F9 ; unqualified # โน stop button
3644+23FA FE0F ; fully-qualified # โบ๏ธ record button
3645+23FA ; unqualified # โบ record button
3646+23CF FE0F ; fully-qualified # โ๏ธ eject button
3647+23CF ; unqualified # โ eject button
3648+1F3A6 ; fully-qualified # ๐ŸŽฆ cinema
3649+1F505 ; fully-qualified # ๐Ÿ”… dim button
3650+1F506 ; fully-qualified # ๐Ÿ”† bright button
3651+1F4F6 ; fully-qualified # ๐Ÿ“ถ antenna bars
3652+1F4F3 ; fully-qualified # ๐Ÿ“ณ vibration mode
3653+1F4F4 ; fully-qualified # ๐Ÿ“ด mobile phone off
3654+
3655+# subgroup: gender
3656+2640 FE0F ; fully-qualified # โ™€๏ธ female sign
3657+2640 ; unqualified # โ™€ female sign
3658+2642 FE0F ; fully-qualified # โ™‚๏ธ male sign
3659+2642 ; unqualified # โ™‚ male sign
3660+
3661+# subgroup: other-symbol
3662+2695 FE0F ; fully-qualified # โš•๏ธ medical symbol
3663+2695 ; unqualified # โš• medical symbol
3664+267E FE0F ; fully-qualified # โ™พ๏ธ infinity
3665+267E ; unqualified # โ™พ infinity
3666+267B FE0F ; fully-qualified # โ™ป๏ธ recycling symbol
3667+267B ; unqualified # โ™ป recycling symbol
3668+269C FE0F ; fully-qualified # โšœ๏ธ fleur-de-lis
3669+269C ; unqualified # โšœ fleur-de-lis
3670+1F531 ; fully-qualified # ๐Ÿ”ฑ trident emblem
3671+1F4DB ; fully-qualified # ๐Ÿ“› name badge
3672+1F530 ; fully-qualified # ๐Ÿ”ฐ Japanese symbol for beginner
3673+2B55 ; fully-qualified # โญ• hollow red circle
3674+2705 ; fully-qualified # โœ… check mark button
3675+2611 FE0F ; fully-qualified # โ˜‘๏ธ check box with check
3676+2611 ; unqualified # โ˜‘ check box with check
3677+2714 FE0F ; fully-qualified # โœ”๏ธ check mark
3678+2714 ; unqualified # โœ” check mark
3679+2716 FE0F ; fully-qualified # โœ–๏ธ multiplication sign
3680+2716 ; unqualified # โœ– multiplication sign
3681+274C ; fully-qualified # โŒ cross mark
3682+274E ; fully-qualified # โŽ cross mark button
3683+2795 ; fully-qualified # โž• plus sign
3684+2796 ; fully-qualified # โž– minus sign
3685+2797 ; fully-qualified # โž— division sign
3686+27B0 ; fully-qualified # โžฐ curly loop
3687+27BF ; fully-qualified # โžฟ double curly loop
3688+303D FE0F ; fully-qualified # ใ€ฝ๏ธ part alternation mark
3689+303D ; unqualified # ใ€ฝ part alternation mark
3690+2733 FE0F ; fully-qualified # โœณ๏ธ eight-spoked asterisk
3691+2733 ; unqualified # โœณ eight-spoked asterisk
3692+2734 FE0F ; fully-qualified # โœด๏ธ eight-pointed star
3693+2734 ; unqualified # โœด eight-pointed star
3694+2747 FE0F ; fully-qualified # โ‡๏ธ sparkle
3695+2747 ; unqualified # โ‡ sparkle
3696+203C FE0F ; fully-qualified # โ€ผ๏ธ double exclamation mark
3697+203C ; unqualified # โ€ผ double exclamation mark
3698+2049 FE0F ; fully-qualified # โ‰๏ธ exclamation question mark
3699+2049 ; unqualified # โ‰ exclamation question mark
3700+2753 ; fully-qualified # โ“ question mark
3701+2754 ; fully-qualified # โ” white question mark
3702+2755 ; fully-qualified # โ• white exclamation mark
3703+2757 ; fully-qualified # โ— exclamation mark
3704+3030 FE0F ; fully-qualified # ใ€ฐ๏ธ wavy dash
3705+3030 ; unqualified # ใ€ฐ wavy dash
3706+00A9 FE0F ; fully-qualified # ยฉ๏ธ copyright
3707+00A9 ; unqualified # ยฉ copyright
3708+00AE FE0F ; fully-qualified # ยฎ๏ธ registered
3709+00AE ; unqualified # ยฎ registered
3710+2122 FE0F ; fully-qualified # โ„ข๏ธ trade mark
3711+2122 ; unqualified # โ„ข trade mark
3712+
3713+# subgroup: keycap
3714+0023 FE0F 20E3 ; fully-qualified # #๏ธโƒฃ keycap: #
3715+0023 20E3 ; unqualified # #โƒฃ keycap: #
3716+002A FE0F 20E3 ; fully-qualified # *๏ธโƒฃ keycap: *
3717+002A 20E3 ; unqualified # *โƒฃ keycap: *
3718+0030 FE0F 20E3 ; fully-qualified # 0๏ธโƒฃ keycap: 0
3719+0030 20E3 ; unqualified # 0โƒฃ keycap: 0
3720+0031 FE0F 20E3 ; fully-qualified # 1๏ธโƒฃ keycap: 1
3721+0031 20E3 ; unqualified # 1โƒฃ keycap: 1
3722+0032 FE0F 20E3 ; fully-qualified # 2๏ธโƒฃ keycap: 2
3723+0032 20E3 ; unqualified # 2โƒฃ keycap: 2
3724+0033 FE0F 20E3 ; fully-qualified # 3๏ธโƒฃ keycap: 3
3725+0033 20E3 ; unqualified # 3โƒฃ keycap: 3
3726+0034 FE0F 20E3 ; fully-qualified # 4๏ธโƒฃ keycap: 4
3727+0034 20E3 ; unqualified # 4โƒฃ keycap: 4
3728+0035 FE0F 20E3 ; fully-qualified # 5๏ธโƒฃ keycap: 5
3729+0035 20E3 ; unqualified # 5โƒฃ keycap: 5
3730+0036 FE0F 20E3 ; fully-qualified # 6๏ธโƒฃ keycap: 6
3731+0036 20E3 ; unqualified # 6โƒฃ keycap: 6
3732+0037 FE0F 20E3 ; fully-qualified # 7๏ธโƒฃ keycap: 7
3733+0037 20E3 ; unqualified # 7โƒฃ keycap: 7
3734+0038 FE0F 20E3 ; fully-qualified # 8๏ธโƒฃ keycap: 8
3735+0038 20E3 ; unqualified # 8โƒฃ keycap: 8
3736+0039 FE0F 20E3 ; fully-qualified # 9๏ธโƒฃ keycap: 9
3737+0039 20E3 ; unqualified # 9โƒฃ keycap: 9
3738+1F51F ; fully-qualified # ๐Ÿ”Ÿ keycap: 10
3739+
3740+# subgroup: alphanum
3741+1F520 ; fully-qualified # ๐Ÿ”  input latin uppercase
3742+1F521 ; fully-qualified # ๐Ÿ”ก input latin lowercase
3743+1F522 ; fully-qualified # ๐Ÿ”ข input numbers
3744+1F523 ; fully-qualified # ๐Ÿ”ฃ input symbols
3745+1F524 ; fully-qualified # ๐Ÿ”ค input latin letters
3746+1F170 FE0F ; fully-qualified # ๐Ÿ…ฐ๏ธ A button (blood type)
3747+1F170 ; unqualified # ๐Ÿ…ฐ A button (blood type)
3748+1F18E ; fully-qualified # ๐Ÿ†Ž AB button (blood type)
3749+1F171 FE0F ; fully-qualified # ๐Ÿ…ฑ๏ธ B button (blood type)
3750+1F171 ; unqualified # ๐Ÿ…ฑ B button (blood type)
3751+1F191 ; fully-qualified # ๐Ÿ†‘ CL button
3752+1F192 ; fully-qualified # ๐Ÿ†’ COOL button
3753+1F193 ; fully-qualified # ๐Ÿ†“ FREE button
3754+2139 FE0F ; fully-qualified # โ„น๏ธ information
3755+2139 ; unqualified # โ„น information
3756+1F194 ; fully-qualified # ๐Ÿ†” ID button
3757+24C2 FE0F ; fully-qualified # โ“‚๏ธ circled M
3758+24C2 ; unqualified # โ“‚ circled M
3759+1F195 ; fully-qualified # ๐Ÿ†• NEW button
3760+1F196 ; fully-qualified # ๐Ÿ†– NG button
3761+1F17E FE0F ; fully-qualified # ๐Ÿ…พ๏ธ O button (blood type)
3762+1F17E ; unqualified # ๐Ÿ…พ O button (blood type)
3763+1F197 ; fully-qualified # ๐Ÿ†— OK button
3764+1F17F FE0F ; fully-qualified # ๐Ÿ…ฟ๏ธ P button
3765+1F17F ; unqualified # ๐Ÿ…ฟ P button
3766+1F198 ; fully-qualified # ๐Ÿ†˜ SOS button
3767+1F199 ; fully-qualified # ๐Ÿ†™ UP! button
3768+1F19A ; fully-qualified # ๐Ÿ†š VS button
3769+1F201 ; fully-qualified # ๐Ÿˆ Japanese โ€œhereโ€ button
3770+1F202 FE0F ; fully-qualified # ๐Ÿˆ‚๏ธ Japanese โ€œservice chargeโ€ button
3771+1F202 ; unqualified # ๐Ÿˆ‚ Japanese โ€œservice chargeโ€ button
3772+1F237 FE0F ; fully-qualified # ๐Ÿˆท๏ธ Japanese โ€œmonthly amountโ€ button
3773+1F237 ; unqualified # ๐Ÿˆท Japanese โ€œmonthly amountโ€ button
3774+1F236 ; fully-qualified # ๐Ÿˆถ Japanese โ€œnot free of chargeโ€ button
3775+1F22F ; fully-qualified # ๐Ÿˆฏ Japanese โ€œreservedโ€ button
3776+1F250 ; fully-qualified # ๐Ÿ‰ Japanese โ€œbargainโ€ button
3777+1F239 ; fully-qualified # ๐Ÿˆน Japanese โ€œdiscountโ€ button
3778+1F21A ; fully-qualified # ๐Ÿˆš Japanese โ€œfree of chargeโ€ button
3779+1F232 ; fully-qualified # ๐Ÿˆฒ Japanese โ€œprohibitedโ€ button
3780+1F251 ; fully-qualified # ๐Ÿ‰‘ Japanese โ€œacceptableโ€ button
3781+1F238 ; fully-qualified # ๐Ÿˆธ Japanese โ€œapplicationโ€ button
3782+1F234 ; fully-qualified # ๐Ÿˆด Japanese โ€œpassing gradeโ€ button
3783+1F233 ; fully-qualified # ๐Ÿˆณ Japanese โ€œvacancyโ€ button
3784+3297 FE0F ; fully-qualified # ใŠ—๏ธ Japanese โ€œcongratulationsโ€ button
3785+3297 ; unqualified # ใŠ— Japanese โ€œcongratulationsโ€ button
3786+3299 FE0F ; fully-qualified # ใŠ™๏ธ Japanese โ€œsecretโ€ button
3787+3299 ; unqualified # ใŠ™ Japanese โ€œsecretโ€ button
3788+1F23A ; fully-qualified # ๐Ÿˆบ Japanese โ€œopen for businessโ€ button
3789+1F235 ; fully-qualified # ๐Ÿˆต Japanese โ€œno vacancyโ€ button
3790+
3791+# subgroup: geometric
3792+1F534 ; fully-qualified # ๐Ÿ”ด red circle
3793+1F7E0 ; fully-qualified # ๐ŸŸ  orange circle
3794+1F7E1 ; fully-qualified # ๐ŸŸก yellow circle
3795+1F7E2 ; fully-qualified # ๐ŸŸข green circle
3796+1F535 ; fully-qualified # ๐Ÿ”ต blue circle
3797+1F7E3 ; fully-qualified # ๐ŸŸฃ purple circle
3798+1F7E4 ; fully-qualified # ๐ŸŸค brown circle
3799+26AB ; fully-qualified # โšซ black circle
3800+26AA ; fully-qualified # โšช white circle
3801+1F7E5 ; fully-qualified # ๐ŸŸฅ red square
3802+1F7E7 ; fully-qualified # ๐ŸŸง orange square
3803+1F7E8 ; fully-qualified # ๐ŸŸจ yellow square
3804+1F7E9 ; fully-qualified # ๐ŸŸฉ green square
3805+1F7E6 ; fully-qualified # ๐ŸŸฆ blue square
3806+1F7EA ; fully-qualified # ๐ŸŸช purple square
3807+1F7EB ; fully-qualified # ๐ŸŸซ brown square
3808+2B1B ; fully-qualified # โฌ› black large square
3809+2B1C ; fully-qualified # โฌœ white large square
3810+25FC FE0F ; fully-qualified # โ—ผ๏ธ black medium square
3811+25FC ; unqualified # โ—ผ black medium square
3812+25FB FE0F ; fully-qualified # โ—ป๏ธ white medium square
3813+25FB ; unqualified # โ—ป white medium square
3814+25FE ; fully-qualified # โ—พ black medium-small square
3815+25FD ; fully-qualified # โ—ฝ white medium-small square
3816+25AA FE0F ; fully-qualified # โ–ช๏ธ black small square
3817+25AA ; unqualified # โ–ช black small square
3818+25AB FE0F ; fully-qualified # โ–ซ๏ธ white small square
3819+25AB ; unqualified # โ–ซ white small square
3820+1F536 ; fully-qualified # ๐Ÿ”ถ large orange diamond
3821+1F537 ; fully-qualified # ๐Ÿ”ท large blue diamond
3822+1F538 ; fully-qualified # ๐Ÿ”ธ small orange diamond
3823+1F539 ; fully-qualified # ๐Ÿ”น small blue diamond
3824+1F53A ; fully-qualified # ๐Ÿ”บ red triangle pointed up
3825+1F53B ; fully-qualified # ๐Ÿ”ป red triangle pointed down
3826+1F4A0 ; fully-qualified # ๐Ÿ’  diamond with a dot
3827+1F518 ; fully-qualified # ๐Ÿ”˜ radio button
3828+1F533 ; fully-qualified # ๐Ÿ”ณ white square button
3829+1F532 ; fully-qualified # ๐Ÿ”ฒ black square button
3830+
3831+# Symbols subtotal: 297
3832+# Symbols subtotal: 297 w/o modifiers
3833+
3834+# group: Flags
3835+
3836+# subgroup: flag
3837+1F3C1 ; fully-qualified # ๐Ÿ chequered flag
3838+1F6A9 ; fully-qualified # ๐Ÿšฉ triangular flag
3839+1F38C ; fully-qualified # ๐ŸŽŒ crossed flags
3840+1F3F4 ; fully-qualified # ๐Ÿด black flag
3841+1F3F3 FE0F ; fully-qualified # ๐Ÿณ๏ธ white flag
3842+1F3F3 ; unqualified # ๐Ÿณ white flag
3843+1F3F3 FE0F 200D 1F308 ; fully-qualified # ๐Ÿณ๏ธโ€๐ŸŒˆ rainbow flag
3844+1F3F3 200D 1F308 ; unqualified # ๐Ÿณโ€๐ŸŒˆ rainbow flag
3845+1F3F4 200D 2620 FE0F ; fully-qualified # ๐Ÿดโ€โ˜ ๏ธ pirate flag
3846+1F3F4 200D 2620 ; minimally-qualified # ๐Ÿดโ€โ˜  pirate flag
3847+
3848+# subgroup: country-flag
3849+1F1E6 1F1E8 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡จ flag: Ascension Island
3850+1F1E6 1F1E9 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ฉ flag: Andorra
3851+1F1E6 1F1EA ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ช flag: United Arab Emirates
3852+1F1E6 1F1EB ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ซ flag: Afghanistan
3853+1F1E6 1F1EC ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ฌ flag: Antigua & Barbuda
3854+1F1E6 1F1EE ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ฎ flag: Anguilla
3855+1F1E6 1F1F1 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ฑ flag: Albania
3856+1F1E6 1F1F2 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ฒ flag: Armenia
3857+1F1E6 1F1F4 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ด flag: Angola
3858+1F1E6 1F1F6 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ถ flag: Antarctica
3859+1F1E6 1F1F7 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ท flag: Argentina
3860+1F1E6 1F1F8 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ธ flag: American Samoa
3861+1F1E6 1F1F9 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡น flag: Austria
3862+1F1E6 1F1FA ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡บ flag: Australia
3863+1F1E6 1F1FC ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ผ flag: Aruba
3864+1F1E6 1F1FD ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ฝ flag: ร…land Islands
3865+1F1E6 1F1FF ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ฟ flag: Azerbaijan
3866+1F1E7 1F1E6 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฆ flag: Bosnia & Herzegovina
3867+1F1E7 1F1E7 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ง flag: Barbados
3868+1F1E7 1F1E9 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฉ flag: Bangladesh
3869+1F1E7 1F1EA ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ช flag: Belgium
3870+1F1E7 1F1EB ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ซ flag: Burkina Faso
3871+1F1E7 1F1EC ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฌ flag: Bulgaria
3872+1F1E7 1F1ED ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ญ flag: Bahrain
3873+1F1E7 1F1EE ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฎ flag: Burundi
3874+1F1E7 1F1EF ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฏ flag: Benin
3875+1F1E7 1F1F1 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฑ flag: St. Barthรฉlemy
3876+1F1E7 1F1F2 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฒ flag: Bermuda
3877+1F1E7 1F1F3 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ณ flag: Brunei
3878+1F1E7 1F1F4 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ด flag: Bolivia
3879+1F1E7 1F1F6 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ถ flag: Caribbean Netherlands
3880+1F1E7 1F1F7 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ท flag: Brazil
3881+1F1E7 1F1F8 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ธ flag: Bahamas
3882+1F1E7 1F1F9 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡น flag: Bhutan
3883+1F1E7 1F1FB ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ป flag: Bouvet Island
3884+1F1E7 1F1FC ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ผ flag: Botswana
3885+1F1E7 1F1FE ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡พ flag: Belarus
3886+1F1E7 1F1FF ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฟ flag: Belize
3887+1F1E8 1F1E6 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฆ flag: Canada
3888+1F1E8 1F1E8 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡จ flag: Cocos (Keeling) Islands
3889+1F1E8 1F1E9 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฉ flag: Congo - Kinshasa
3890+1F1E8 1F1EB ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ซ flag: Central African Republic
3891+1F1E8 1F1EC ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฌ flag: Congo - Brazzaville
3892+1F1E8 1F1ED ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ญ flag: Switzerland
3893+1F1E8 1F1EE ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฎ flag: Cรดte dโ€™Ivoire
3894+1F1E8 1F1F0 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฐ flag: Cook Islands
3895+1F1E8 1F1F1 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฑ flag: Chile
3896+1F1E8 1F1F2 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฒ flag: Cameroon
3897+1F1E8 1F1F3 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ณ flag: China
3898+1F1E8 1F1F4 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ด flag: Colombia
3899+1F1E8 1F1F5 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ต flag: Clipperton Island
3900+1F1E8 1F1F7 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ท flag: Costa Rica
3901+1F1E8 1F1FA ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡บ flag: Cuba
3902+1F1E8 1F1FB ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ป flag: Cape Verde
3903+1F1E8 1F1FC ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ผ flag: Curaรงao
3904+1F1E8 1F1FD ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฝ flag: Christmas Island
3905+1F1E8 1F1FE ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡พ flag: Cyprus
3906+1F1E8 1F1FF ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฟ flag: Czechia
3907+1F1E9 1F1EA ; fully-qualified # ๐Ÿ‡ฉ๐Ÿ‡ช flag: Germany
3908+1F1E9 1F1EC ; fully-qualified # ๐Ÿ‡ฉ๐Ÿ‡ฌ flag: Diego Garcia
3909+1F1E9 1F1EF ; fully-qualified # ๐Ÿ‡ฉ๐Ÿ‡ฏ flag: Djibouti
3910+1F1E9 1F1F0 ; fully-qualified # ๐Ÿ‡ฉ๐Ÿ‡ฐ flag: Denmark
3911+1F1E9 1F1F2 ; fully-qualified # ๐Ÿ‡ฉ๐Ÿ‡ฒ flag: Dominica
3912+1F1E9 1F1F4 ; fully-qualified # ๐Ÿ‡ฉ๐Ÿ‡ด flag: Dominican Republic
3913+1F1E9 1F1FF ; fully-qualified # ๐Ÿ‡ฉ๐Ÿ‡ฟ flag: Algeria
3914+1F1EA 1F1E6 ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡ฆ flag: Ceuta & Melilla
3915+1F1EA 1F1E8 ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡จ flag: Ecuador
3916+1F1EA 1F1EA ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡ช flag: Estonia
3917+1F1EA 1F1EC ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡ฌ flag: Egypt
3918+1F1EA 1F1ED ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡ญ flag: Western Sahara
3919+1F1EA 1F1F7 ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡ท flag: Eritrea
3920+1F1EA 1F1F8 ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡ธ flag: Spain
3921+1F1EA 1F1F9 ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡น flag: Ethiopia
3922+1F1EA 1F1FA ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡บ flag: European Union
3923+1F1EB 1F1EE ; fully-qualified # ๐Ÿ‡ซ๐Ÿ‡ฎ flag: Finland
3924+1F1EB 1F1EF ; fully-qualified # ๐Ÿ‡ซ๐Ÿ‡ฏ flag: Fiji
3925+1F1EB 1F1F0 ; fully-qualified # ๐Ÿ‡ซ๐Ÿ‡ฐ flag: Falkland Islands
3926+1F1EB 1F1F2 ; fully-qualified # ๐Ÿ‡ซ๐Ÿ‡ฒ flag: Micronesia
3927+1F1EB 1F1F4 ; fully-qualified # ๐Ÿ‡ซ๐Ÿ‡ด flag: Faroe Islands
3928+1F1EB 1F1F7 ; fully-qualified # ๐Ÿ‡ซ๐Ÿ‡ท flag: France
3929+1F1EC 1F1E6 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ฆ flag: Gabon
3930+1F1EC 1F1E7 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ง flag: United Kingdom
3931+1F1EC 1F1E9 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ฉ flag: Grenada
3932+1F1EC 1F1EA ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ช flag: Georgia
3933+1F1EC 1F1EB ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ซ flag: French Guiana
3934+1F1EC 1F1EC ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ฌ flag: Guernsey
3935+1F1EC 1F1ED ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ญ flag: Ghana
3936+1F1EC 1F1EE ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ฎ flag: Gibraltar
3937+1F1EC 1F1F1 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ฑ flag: Greenland
3938+1F1EC 1F1F2 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ฒ flag: Gambia
3939+1F1EC 1F1F3 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ณ flag: Guinea
3940+1F1EC 1F1F5 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ต flag: Guadeloupe
3941+1F1EC 1F1F6 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ถ flag: Equatorial Guinea
3942+1F1EC 1F1F7 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ท flag: Greece
3943+1F1EC 1F1F8 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ธ flag: South Georgia & South Sandwich Islands
3944+1F1EC 1F1F9 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡น flag: Guatemala
3945+1F1EC 1F1FA ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡บ flag: Guam
3946+1F1EC 1F1FC ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ผ flag: Guinea-Bissau
3947+1F1EC 1F1FE ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡พ flag: Guyana
3948+1F1ED 1F1F0 ; fully-qualified # ๐Ÿ‡ญ๐Ÿ‡ฐ flag: Hong Kong SAR China
3949+1F1ED 1F1F2 ; fully-qualified # ๐Ÿ‡ญ๐Ÿ‡ฒ flag: Heard & McDonald Islands
3950+1F1ED 1F1F3 ; fully-qualified # ๐Ÿ‡ญ๐Ÿ‡ณ flag: Honduras
3951+1F1ED 1F1F7 ; fully-qualified # ๐Ÿ‡ญ๐Ÿ‡ท flag: Croatia
3952+1F1ED 1F1F9 ; fully-qualified # ๐Ÿ‡ญ๐Ÿ‡น flag: Haiti
3953+1F1ED 1F1FA ; fully-qualified # ๐Ÿ‡ญ๐Ÿ‡บ flag: Hungary
3954+1F1EE 1F1E8 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡จ flag: Canary Islands
3955+1F1EE 1F1E9 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ฉ flag: Indonesia
3956+1F1EE 1F1EA ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ช flag: Ireland
3957+1F1EE 1F1F1 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ฑ flag: Israel
3958+1F1EE 1F1F2 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ฒ flag: Isle of Man
3959+1F1EE 1F1F3 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ณ flag: India
3960+1F1EE 1F1F4 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ด flag: British Indian Ocean Territory
3961+1F1EE 1F1F6 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ถ flag: Iraq
3962+1F1EE 1F1F7 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ท flag: Iran
3963+1F1EE 1F1F8 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ธ flag: Iceland
3964+1F1EE 1F1F9 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡น flag: Italy
3965+1F1EF 1F1EA ; fully-qualified # ๐Ÿ‡ฏ๐Ÿ‡ช flag: Jersey
3966+1F1EF 1F1F2 ; fully-qualified # ๐Ÿ‡ฏ๐Ÿ‡ฒ flag: Jamaica
3967+1F1EF 1F1F4 ; fully-qualified # ๐Ÿ‡ฏ๐Ÿ‡ด flag: Jordan
3968+1F1EF 1F1F5 ; fully-qualified # ๐Ÿ‡ฏ๐Ÿ‡ต flag: Japan
3969+1F1F0 1F1EA ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ช flag: Kenya
3970+1F1F0 1F1EC ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ฌ flag: Kyrgyzstan
3971+1F1F0 1F1ED ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ญ flag: Cambodia
3972+1F1F0 1F1EE ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ฎ flag: Kiribati
3973+1F1F0 1F1F2 ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ฒ flag: Comoros
3974+1F1F0 1F1F3 ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ณ flag: St. Kitts & Nevis
3975+1F1F0 1F1F5 ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ต flag: North Korea
3976+1F1F0 1F1F7 ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ท flag: South Korea
3977+1F1F0 1F1FC ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ผ flag: Kuwait
3978+1F1F0 1F1FE ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡พ flag: Cayman Islands
3979+1F1F0 1F1FF ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ฟ flag: Kazakhstan
3980+1F1F1 1F1E6 ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡ฆ flag: Laos
3981+1F1F1 1F1E7 ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡ง flag: Lebanon
3982+1F1F1 1F1E8 ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡จ flag: St. Lucia
3983+1F1F1 1F1EE ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡ฎ flag: Liechtenstein
3984+1F1F1 1F1F0 ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡ฐ flag: Sri Lanka
3985+1F1F1 1F1F7 ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡ท flag: Liberia
3986+1F1F1 1F1F8 ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡ธ flag: Lesotho
3987+1F1F1 1F1F9 ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡น flag: Lithuania
3988+1F1F1 1F1FA ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡บ flag: Luxembourg
3989+1F1F1 1F1FB ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡ป flag: Latvia
3990+1F1F1 1F1FE ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡พ flag: Libya
3991+1F1F2 1F1E6 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฆ flag: Morocco
3992+1F1F2 1F1E8 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡จ flag: Monaco
3993+1F1F2 1F1E9 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฉ flag: Moldova
3994+1F1F2 1F1EA ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ช flag: Montenegro
3995+1F1F2 1F1EB ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ซ flag: St. Martin
3996+1F1F2 1F1EC ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฌ flag: Madagascar
3997+1F1F2 1F1ED ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ญ flag: Marshall Islands
3998+1F1F2 1F1F0 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฐ flag: Macedonia
3999+1F1F2 1F1F1 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฑ flag: Mali
4000+1F1F2 1F1F2 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฒ flag: Myanmar (Burma)
4001+1F1F2 1F1F3 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ณ flag: Mongolia
4002+1F1F2 1F1F4 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ด flag: Macao SAR China
4003+1F1F2 1F1F5 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ต flag: Northern Mariana Islands
4004+1F1F2 1F1F6 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ถ flag: Martinique
4005+1F1F2 1F1F7 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ท flag: Mauritania
4006+1F1F2 1F1F8 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ธ flag: Montserrat
4007+1F1F2 1F1F9 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡น flag: Malta
4008+1F1F2 1F1FA ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡บ flag: Mauritius
4009+1F1F2 1F1FB ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ป flag: Maldives
4010+1F1F2 1F1FC ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ผ flag: Malawi
4011+1F1F2 1F1FD ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฝ flag: Mexico
4012+1F1F2 1F1FE ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡พ flag: Malaysia
4013+1F1F2 1F1FF ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฟ flag: Mozambique
4014+1F1F3 1F1E6 ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ฆ flag: Namibia
4015+1F1F3 1F1E8 ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡จ flag: New Caledonia
4016+1F1F3 1F1EA ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ช flag: Niger
4017+1F1F3 1F1EB ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ซ flag: Norfolk Island
4018+1F1F3 1F1EC ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ฌ flag: Nigeria
4019+1F1F3 1F1EE ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ฎ flag: Nicaragua
4020+1F1F3 1F1F1 ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ฑ flag: Netherlands
4021+1F1F3 1F1F4 ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ด flag: Norway
4022+1F1F3 1F1F5 ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ต flag: Nepal
4023+1F1F3 1F1F7 ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ท flag: Nauru
4024+1F1F3 1F1FA ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡บ flag: Niue
4025+1F1F3 1F1FF ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ฟ flag: New Zealand
4026+1F1F4 1F1F2 ; fully-qualified # ๐Ÿ‡ด๐Ÿ‡ฒ flag: Oman
4027+1F1F5 1F1E6 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ฆ flag: Panama
4028+1F1F5 1F1EA ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ช flag: Peru
4029+1F1F5 1F1EB ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ซ flag: French Polynesia
4030+1F1F5 1F1EC ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ฌ flag: Papua New Guinea
4031+1F1F5 1F1ED ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ญ flag: Philippines
4032+1F1F5 1F1F0 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ฐ flag: Pakistan
4033+1F1F5 1F1F1 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ฑ flag: Poland
4034+1F1F5 1F1F2 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ฒ flag: St. Pierre & Miquelon
4035+1F1F5 1F1F3 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ณ flag: Pitcairn Islands
4036+1F1F5 1F1F7 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ท flag: Puerto Rico
4037+1F1F5 1F1F8 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ธ flag: Palestinian Territories
4038+1F1F5 1F1F9 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡น flag: Portugal
4039+1F1F5 1F1FC ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ผ flag: Palau
4040+1F1F5 1F1FE ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡พ flag: Paraguay
4041+1F1F6 1F1E6 ; fully-qualified # ๐Ÿ‡ถ๐Ÿ‡ฆ flag: Qatar
4042+1F1F7 1F1EA ; fully-qualified # ๐Ÿ‡ท๐Ÿ‡ช flag: Rรฉunion
4043+1F1F7 1F1F4 ; fully-qualified # ๐Ÿ‡ท๐Ÿ‡ด flag: Romania
4044+1F1F7 1F1F8 ; fully-qualified # ๐Ÿ‡ท๐Ÿ‡ธ flag: Serbia
4045+1F1F7 1F1FA ; fully-qualified # ๐Ÿ‡ท๐Ÿ‡บ flag: Russia
4046+1F1F7 1F1FC ; fully-qualified # ๐Ÿ‡ท๐Ÿ‡ผ flag: Rwanda
4047+1F1F8 1F1E6 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฆ flag: Saudi Arabia
4048+1F1F8 1F1E7 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ง flag: Solomon Islands
4049+1F1F8 1F1E8 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡จ flag: Seychelles
4050+1F1F8 1F1E9 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฉ flag: Sudan
4051+1F1F8 1F1EA ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ช flag: Sweden
4052+1F1F8 1F1EC ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฌ flag: Singapore
4053+1F1F8 1F1ED ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ญ flag: St. Helena
4054+1F1F8 1F1EE ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฎ flag: Slovenia
4055+1F1F8 1F1EF ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฏ flag: Svalbard & Jan Mayen
4056+1F1F8 1F1F0 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฐ flag: Slovakia
4057+1F1F8 1F1F1 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฑ flag: Sierra Leone
4058+1F1F8 1F1F2 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฒ flag: San Marino
4059+1F1F8 1F1F3 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ณ flag: Senegal
4060+1F1F8 1F1F4 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ด flag: Somalia
4061+1F1F8 1F1F7 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ท flag: Suriname
4062+1F1F8 1F1F8 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ธ flag: South Sudan
4063+1F1F8 1F1F9 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡น flag: Sรฃo Tomรฉ & Prรญncipe
4064+1F1F8 1F1FB ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ป flag: El Salvador
4065+1F1F8 1F1FD ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฝ flag: Sint Maarten
4066+1F1F8 1F1FE ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡พ flag: Syria
4067+1F1F8 1F1FF ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฟ flag: Eswatini
4068+1F1F9 1F1E6 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฆ flag: Tristan da Cunha
4069+1F1F9 1F1E8 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡จ flag: Turks & Caicos Islands
4070+1F1F9 1F1E9 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฉ flag: Chad
4071+1F1F9 1F1EB ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ซ flag: French Southern Territories
4072+1F1F9 1F1EC ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฌ flag: Togo
4073+1F1F9 1F1ED ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ญ flag: Thailand
4074+1F1F9 1F1EF ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฏ flag: Tajikistan
4075+1F1F9 1F1F0 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฐ flag: Tokelau
4076+1F1F9 1F1F1 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฑ flag: Timor-Leste
4077+1F1F9 1F1F2 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฒ flag: Turkmenistan
4078+1F1F9 1F1F3 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ณ flag: Tunisia
4079+1F1F9 1F1F4 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ด flag: Tonga
4080+1F1F9 1F1F7 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ท flag: Turkey
4081+1F1F9 1F1F9 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡น flag: Trinidad & Tobago
4082+1F1F9 1F1FB ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ป flag: Tuvalu
4083+1F1F9 1F1FC ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ผ flag: Taiwan
4084+1F1F9 1F1FF ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฟ flag: Tanzania
4085+1F1FA 1F1E6 ; fully-qualified # ๐Ÿ‡บ๐Ÿ‡ฆ flag: Ukraine
4086+1F1FA 1F1EC ; fully-qualified # ๐Ÿ‡บ๐Ÿ‡ฌ flag: Uganda
4087+1F1FA 1F1F2 ; fully-qualified # ๐Ÿ‡บ๐Ÿ‡ฒ flag: U.S. Outlying Islands
4088+1F1FA 1F1F3 ; fully-qualified # ๐Ÿ‡บ๐Ÿ‡ณ flag: United Nations
4089+1F1FA 1F1F8 ; fully-qualified # ๐Ÿ‡บ๐Ÿ‡ธ flag: United States
4090+1F1FA 1F1FE ; fully-qualified # ๐Ÿ‡บ๐Ÿ‡พ flag: Uruguay
4091+1F1FA 1F1FF ; fully-qualified # ๐Ÿ‡บ๐Ÿ‡ฟ flag: Uzbekistan
4092+1F1FB 1F1E6 ; fully-qualified # ๐Ÿ‡ป๐Ÿ‡ฆ flag: Vatican City
4093+1F1FB 1F1E8 ; fully-qualified # ๐Ÿ‡ป๐Ÿ‡จ flag: St. Vincent & Grenadines
4094+1F1FB 1F1EA ; fully-qualified # ๐Ÿ‡ป๐Ÿ‡ช flag: Venezuela
4095+1F1FB 1F1EC ; fully-qualified # ๐Ÿ‡ป๐Ÿ‡ฌ flag: British Virgin Islands
4096+1F1FB 1F1EE ; fully-qualified # ๐Ÿ‡ป๐Ÿ‡ฎ flag: U.S. Virgin Islands
4097+1F1FB 1F1F3 ; fully-qualified # ๐Ÿ‡ป๐Ÿ‡ณ flag: Vietnam
4098+1F1FB 1F1FA ; fully-qualified # ๐Ÿ‡ป๐Ÿ‡บ flag: Vanuatu
4099+1F1FC 1F1EB ; fully-qualified # ๐Ÿ‡ผ๐Ÿ‡ซ flag: Wallis & Futuna
4100+1F1FC 1F1F8 ; fully-qualified # ๐Ÿ‡ผ๐Ÿ‡ธ flag: Samoa
4101+1F1FD 1F1F0 ; fully-qualified # ๐Ÿ‡ฝ๐Ÿ‡ฐ flag: Kosovo
4102+1F1FE 1F1EA ; fully-qualified # ๐Ÿ‡พ๐Ÿ‡ช flag: Yemen
4103+1F1FE 1F1F9 ; fully-qualified # ๐Ÿ‡พ๐Ÿ‡น flag: Mayotte
4104+1F1FF 1F1E6 ; fully-qualified # ๐Ÿ‡ฟ๐Ÿ‡ฆ flag: South Africa
4105+1F1FF 1F1F2 ; fully-qualified # ๐Ÿ‡ฟ๐Ÿ‡ฒ flag: Zambia
4106+1F1FF 1F1FC ; fully-qualified # ๐Ÿ‡ฟ๐Ÿ‡ผ flag: Zimbabwe
4107+
4108+# subgroup: subdivision-flag
4109+1F3F4 E0067 E0062 E0065 E006E E0067 E007F ; fully-qualified # ๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ flag: England
4110+1F3F4 E0067 E0062 E0073 E0063 E0074 E007F ; fully-qualified # ๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ flag: Scotland
4111+1F3F4 E0067 E0062 E0077 E006C E0073 E007F ; fully-qualified # ๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ flag: Wales
4112+
4113+# Flags subtotal: 271
4114+# Flags subtotal: 271 w/o modifiers
4115+
4116+# Status Counts
4117+# fully-qualified : 3010
4118+# minimally-qualified : 571
4119+# unqualified : 246
4120+# component : 9
4121+
4122+#EOF
+110-0.oh-my-zsh/plugins/emoji/emoji.plugin.zsh
@@ -0,0 +1,110 @@
1+# emoji plugin
2+#
3+# Makes emoji support available within ZSH
4+#
5+# See the README for documentation.
6+
7+# Handle $0 according to the standard:
8+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
9+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
10+0="${${(M)0:#/*}:-$PWD/$0}"
11+
12+_omz_emoji_plugin_dir="${0:h}"
13+
14+() {
15+
16+local LC_ALL=en_US.UTF-8
17+
18+typeset -gAH emoji_skintone
19+
20+source "$_omz_emoji_plugin_dir/emoji-char-definitions.zsh"
21+unset _omz_emoji_plugin_dir
22+
23+# These additional emoji are not in the definition file, but are useful in conjunction with it
24+
25+# This is a combining character that can be placed after any other character to surround
26+# it in a "keycap" symbol.
27+# The digits 0-9 are already in the emoji table as keycap_digit_<N>, keycap_ten, etc.
28+# It's unclear whether this should be in the $emoji array, because those characters are all ones
29+# which can be displayed on their own.
30+
31+emoji[regional_indicator_symbol_letter_d_regional_indicator_symbol_letter_e]=$'\xF0\x9F\x87\xA9\xF0\x9F\x87\xAA'
32+emoji[regional_indicator_symbol_letter_g_regional_indicator_symbol_letter_b]=$'\xF0\x9F\x87\xAC\xF0\x9F\x87\xA7'
33+emoji[regional_indicator_symbol_letter_c_regional_indicator_symbol_letter_n]=$'\xF0\x9F\x87\xA8\xF0\x9F\x87\xB3'
34+emoji[regional_indicator_symbol_letter_j_regional_indicator_symbol_letter_p]=$'\xF0\x9F\x87\xAF\xF0\x9F\x87\xB5'
35+emoji[regional_indicator_symbol_letter_k_regional_indicator_symbol_letter_r]=$'\xF0\x9F\x87\xB0\xF0\x9F\x87\xB7'
36+emoji[regional_indicator_symbol_letter_f_regional_indicator_symbol_letter_r]=$'\xF0\x9F\x87\xAB\xF0\x9F\x87\xB7'
37+emoji[regional_indicator_symbol_letter_e_regional_indicator_symbol_letter_s]=$'\xF0\x9F\x87\xAA\xF0\x9F\x87\xB8'
38+emoji[regional_indicator_symbol_letter_i_regional_indicator_symbol_letter_t]=$'\xF0\x9F\x87\xAE\xF0\x9F\x87\xB9'
39+emoji[regional_indicator_symbol_letter_u_regional_indicator_symbol_letter_s]=$'\xF0\x9F\x87\xBA\xF0\x9F\x87\xB8'
40+emoji[regional_indicator_symbol_letter_r_regional_indicator_symbol_letter_u]=$'\xF0\x9F\x87\xB7\xF0\x9F\x87\xBA'
41+
42+# Easier access to skin tone modifiers
43+emoji_skintone[1_2]=$'\U1F3FB'
44+emoji_skintone[3]=$'\U1F3FC'
45+emoji_skintone[4]=$'\U1F3FD'
46+emoji_skintone[5]=$'\U1F3FE'
47+emoji_skintone[6]=$'\U1F3FF'
48+}
49+
50+# Prints a random emoji character
51+#
52+# random_emoji [group]
53+#
54+function random_emoji() {
55+ local group=$1
56+ local names
57+ if [[ -z "$group" || "$group" == "all" ]]; then
58+ names=(${(k)emoji})
59+ else
60+ names=(${=emoji_groups[$group]})
61+ fi
62+ local list_size=${#names}
63+ [[ $list_size -eq 0 ]] && return 1
64+ local random_index=$(( ( RANDOM % $list_size ) + 1 ))
65+ local name=${names[$random_index]}
66+ if [[ "$group" == "flags" ]]; then
67+ echo ${emoji_flags[$name]}
68+ else
69+ echo ${emoji[$name]}
70+ fi
71+}
72+
73+# Displays a listing of emoji with their names
74+#
75+# display_emoji [group]
76+#
77+function display_emoji() {
78+ local group=$1
79+ local names
80+ if [[ -z "$group" || "$group" == "all" ]]; then
81+ names=(${(k)emoji})
82+ else
83+ names=(${=emoji_groups[$group]})
84+ fi
85+ # The extra spaces in output here are a hack for readability, since some
86+ # terminals treat these emoji chars as single-width.
87+ local counter=1
88+ for i in $names; do
89+ if [[ "$group" == "flags" ]]; then
90+ printf '%s ' "$emoji_flags[$i]"
91+ else
92+ printf '%s ' "$emoji[$i]"
93+ fi
94+ # New line every 20 emoji, to avoid weirdnesses
95+ if (($counter % 20 == 0)); then
96+ printf "\n"
97+ fi
98+ let counter=$counter+1
99+ done
100+ print
101+ for i in $names; do
102+ if [[ "$group" == "flags" ]]; then
103+ echo "${emoji_flags[$i]} = $i"
104+ else
105+ echo "${emoji[$i]} = $i"
106+ fi
107+ done
108+}
109+
110+
+169-0.oh-my-zsh/plugins/emoji/gemoji_db.json
@@ -0,0 +1,21538 @@
1+[
2+ {
3+ "emoji": "๐Ÿ˜€"
4+ , "description": "grinning face"
5+ , "category": "Smileys & Emotion"
6+ , "aliases": [
7+ "grinning"
8+ ]
9+ , "tags": [
10+ "smile"
11+ , "happy"
12+ ]
13+ , "unicode_version": "6.1"
14+ , "ios_version": "6.0"
15+ }
16+, {
17+ "emoji": "๐Ÿ˜ƒ"
18+ , "description": "grinning face with big eyes"
19+ , "category": "Smileys & Emotion"
20+ , "aliases": [
21+ "smiley"
22+ ]
23+ , "tags": [
24+ "happy"
25+ , "joy"
26+ , "haha"
27+ ]
28+ , "unicode_version": "6.0"
29+ , "ios_version": "6.0"
30+ }
31+, {
32+ "emoji": "๐Ÿ˜„"
33+ , "description": "grinning face with smiling eyes"
34+ , "category": "Smileys & Emotion"
35+ , "aliases": [
36+ "smile"
37+ ]
38+ , "tags": [
39+ "happy"
40+ , "joy"
41+ , "laugh"
42+ , "pleased"
43+ ]
44+ , "unicode_version": "6.0"
45+ , "ios_version": "6.0"
46+ }
47+, {
48+ "emoji": "๐Ÿ˜"
49+ , "description": "beaming face with smiling eyes"
50+ , "category": "Smileys & Emotion"
51+ , "aliases": [
52+ "grin"
53+ ]
54+ , "tags": [
55+ ]
56+ , "unicode_version": "6.0"
57+ , "ios_version": "6.0"
58+ }
59+, {
60+ "emoji": "๐Ÿ˜†"
61+ , "description": "grinning squinting face"
62+ , "category": "Smileys & Emotion"
63+ , "aliases": [
64+ "laughing"
65+ , "satisfied"
66+ ]
67+ , "tags": [
68+ "happy"
69+ , "haha"
70+ ]
71+ , "unicode_version": "6.0"
72+ , "ios_version": "6.0"
73+ }
74+, {
75+ "emoji": "๐Ÿ˜…"
76+ , "description": "grinning face with sweat"
77+ , "category": "Smileys & Emotion"
78+ , "aliases": [
79+ "sweat_smile"
80+ ]
81+ , "tags": [
82+ "hot"
83+ ]
84+ , "unicode_version": "6.0"
85+ , "ios_version": "6.0"
86+ }
87+, {
88+ "emoji": "๐Ÿคฃ"
89+ , "description": "rolling on the floor laughing"
90+ , "category": "Smileys & Emotion"
91+ , "aliases": [
92+ "rofl"
93+ ]
94+ , "tags": [
95+ "lol"
96+ , "laughing"
97+ ]
98+ , "unicode_version": "9.0"
99+ , "ios_version": "10.2"
100+ }
101+, {
102+ "emoji": "๐Ÿ˜‚"
103+ , "description": "face with tears of joy"
104+ , "category": "Smileys & Emotion"
105+ , "aliases": [
106+ "joy"
107+ ]
108+ , "tags": [
109+ "tears"
110+ ]
111+ , "unicode_version": "6.0"
112+ , "ios_version": "6.0"
113+ }
114+, {
115+ "emoji": "๐Ÿ™‚"
116+ , "description": "slightly smiling face"
117+ , "category": "Smileys & Emotion"
118+ , "aliases": [
119+ "slightly_smiling_face"
120+ ]
121+ , "tags": [
122+ ]
123+ , "unicode_version": "7.0"
124+ , "ios_version": "9.1"
125+ }
126+, {
127+ "emoji": "๐Ÿ™ƒ"
128+ , "description": "upside-down face"
129+ , "category": "Smileys & Emotion"
130+ , "aliases": [
131+ "upside_down_face"
132+ ]
133+ , "tags": [
134+ ]
135+ , "unicode_version": "8.0"
136+ , "ios_version": "9.1"
137+ }
138+, {
139+ "emoji": "๐Ÿ˜‰"
140+ , "description": "winking face"
141+ , "category": "Smileys & Emotion"
142+ , "aliases": [
143+ "wink"
144+ ]
145+ , "tags": [
146+ "flirt"
147+ ]
148+ , "unicode_version": "6.0"
149+ , "ios_version": "6.0"
150+ }
151+, {
152+ "emoji": "๐Ÿ˜Š"
153+ , "description": "smiling face with smiling eyes"
154+ , "category": "Smileys & Emotion"
155+ , "aliases": [
156+ "blush"
157+ ]
158+ , "tags": [
159+ "proud"
160+ ]
161+ , "unicode_version": "6.0"
162+ , "ios_version": "6.0"
163+ }
164+, {
165+ "emoji": "๐Ÿ˜‡"
166+ , "description": "smiling face with halo"
167+ , "category": "Smileys & Emotion"
168+ , "aliases": [
169+