Changes
393 changed files (+4159/-3383)
-
-
@@ -5,6 +5,6 @@ [build]cmd = "make backend" bin = "gitea" include_ext = ["go", "tmpl"] exclude_dir = ["modules/git/tests", "services/gitdiff/testdata", "modules/avatar/testdata"] include_dir = ["cmd", "models", "modules", "options", "routers", "services", "templates"] exclude_dir = ["modules/git/tests", "services/gitdiff/testdata", "modules/avatar/testdata", "models/fixtures", "models/migrations/fixtures", "modules/migration/file_format_testdata", "modules/avatar/identicon/testdata"] include_dir = ["cmd", "models", "modules", "options", "routers", "services"] exclude_regex = ["_test.go$", "_gen.go$"]
-
-
-
@@ -4,7 +4,203 @@ This changelog goes through all the changes that have been made in each releasewithout substantial changes to our git log; to see the highlights of what has been added to each release, please refer to the [blog](https://blog.gitea.io). ## [1.17.4](https://github.com/go-gitea/gitea/releases/tag/1.17.4) - 2022-12-21 ## [1.18.0](https://github.com/go-gitea/gitea/releases/tag/v1.18.0) - 2022-12-29 * SECURITY * Remove ReverseProxy authentication from the API (#22219) (#22251) * Support Go Vulnerability Management (#21139) * Forbid HTML string tooltips (#20935) * BREAKING * Rework mailer settings (#18982) * Remove U2F support (#20141) * Refactor `i18n` to `locale` (#20153) * Enable contenthash in filename for dynamic assets (#20813) * FEATURES * Add color previews in markdown (#21474) * Allow package version sorting (#21453) * Add support for Chocolatey/NuGet v2 API (#21393) * Add API endpoint to get changed files of a PR (#21177) * Add filetree on left of diff view (#21012) * Support Issue forms and PR forms (#20987) * Add support for Vagrant packages (#20930) * Add support for `npm unpublish` (#20688) * Add badge capabilities to users (#20607) * Add issue filter for Author (#20578) * Add KaTeX rendering to Markdown. (#20571) * Add support for Pub packages (#20560) * Support localized README (#20508) * Add support mCaptcha as captcha provider (#20458) * Add team member invite by email (#20307) * Added email notification option to receive all own messages (#20179) * Switch Unicode Escaping to a VSCode-like system (#19990) * Add user/organization code search (#19977) * Only show relevant repositories on explore page (#19361) * User keypairs and HTTP signatures for ActivityPub federation using go-ap (#19133) * Add sitemap support (#18407) * Allow creation of OAuth2 applications for orgs (#18084) * Add system setting table with cache and also add cache supports for user setting (#18058) * Add pages to view watched repos and subscribed issues/PRs (#17156) * Support Proxy protocol (#12527) * Implement sync push mirror on commit (#19411) * API * Allow empty assignees on pull request edit (#22150) (#22214) * Make external issue tracker regexp configurable via API (#21338) * Add name field for org api (#21270) * Show teams with no members if user is admin (#21204) * Add latest commit's SHA to content response (#20398) * Add allow_rebase_update, default_delete_branch_after_merge to repository api response (#20079) * Add new endpoints for push mirrors management (#19841) * ENHANCEMENTS * Add setting to disable the git apply step in test patch (#22130) (#22170) * Multiple improvements for comment edit diff (#21990) (#22007) * Fix button in branch list, avoid unexpected page jump before restore branch actually done (#21562) (#21928) * Fix flex layout for repo list icons (#21896) (#21920) * Fix vertical align of committer avatar rendered by email address (#21884) (#21918) * Fix setting HTTP headers after write (#21833) (#21877) * Color and Style enhancements (#21784, #21799) (#21868) * Ignore line anchor links with leading zeroes (#21728) (#21776) * Quick fixes monaco-editor error: "vs.editor.nullLanguage" (#21734) (#21738) * Use CSS color-scheme instead of invert (#21616) (#21623) * Respect user's locale when rendering the date range in the repo activity page (#21410) * Change `commits-table` column width (#21564) * Refactor git command arguments and make all arguments to be safe to be used (#21535) * CSS color enhancements (#21534) * Add link to user profile in markdown mention only if user exists (#21533, #21554) * Add option to skip index dirs (#21501) * Diff file tree tweaks (#21446) * Localize all timestamps (#21440) * Add `code` highlighting in issue titles (#21432) * Use Name instead of DisplayName in LFS Lock (#21415) * Consolidate more CSS colors into variables (#21402) * Redirect to new repository owner (#21398) * Use ISO date format instead of hard-coded English date format for date range in repo activity page (#21396) * Use weighted algorithm for string matching when finding files in repo (#21370) * Show private data in feeds (#21369) * Refactor parseTreeEntries, speed up tree list (#21368) * Add GET and DELETE endpoints for Docker blob uploads (#21367) * Add nicer error handling on template compile errors (#21350) * Add `stat` to `ToCommit` function for speed (#21337) * Support instance-wide OAuth2 applications (#21335) * Record OAuth client type at registration (#21316) * Add new CSS variables --color-accent and --color-small-accent (#21305) * Improve error descriptions for unauthorized_client (#21292) * Case-insensitive "find files in repo" (#21269) * Consolidate more CSS rules, fix inline code on arc-green (#21260) * Log real ip of requests from ssh (#21216) * Save files in local storage as group readable (#21198) * Enable fluid page layout on medium size viewports (#21178) * File header tweaks (#21175) * Added missing headers on user packages page (#21172) * Display image digest for container packages (#21170) * Skip dirty check for team forms (#21154) * Keep path when creating a new branch (#21153) * Remove fomantic image module (#21145) * Make labels clickable in the comments section. (#21137) * Sort branches and tags by date descending (#21136) * Better repo API unit checks (#21130) * Improve commit status icons (#21124) * Limit length of repo description and repo url input fields (#21119) * Show .editorconfig errors in frontend (#21088) * Allow poster to choose reviewers (#21084) * Remove black labels and CSS cleanup (#21003) * Make e-mail sanity check more precise (#20991) * Use native inputs in whitespace dropdown (#20980) * Enhance package date display (#20928) * Display total blob size of a package version (#20927) * Show language name on hover (#20923) * Show instructions for all generic package files (#20917) * Refactor AssertExistsAndLoadBean to use generics (#20797) * Move the official website link at the footer of gitea (#20777) * Add support for full name in reverse proxy auth (#20776) * Remove useless JS operation for relative time tooltips (#20756) * Replace some icons with SVG (#20741) * Change commit status icons to SVG (#20736) * Improve single repo action for issue and pull requests (#20730) * Allow multiple files in generic packages (#20661) * Add option to create new issue from /issues page (#20650) * Background color of private list-items updated (#20630) * Added search input field to issue filter (#20623) * Increase default item listing size `ISSUE_PAGING_NUM` to 20 (#20547) * Modify milestone search keywords to be case insensitive again (#20513) * Show hint to link package to repo when viewing empty repo package list (#20504) * Add Tar ZSTD support (#20493) * Make code review checkboxes clickable (#20481) * Add "X-Gitea-Object-Type" header for GET `/raw/` & `/media/` API (#20438) * Display project in issue list (#20434) * Prepend commit message to template content when opening a new PR (#20429) * Replace fomantic popup module with tippy.js (#20428) * Allow to specify colors for text in markup (#20363) * Allow access to the Public Organization Member lists with minimal permissions (#20330) * Use default values when provided values are empty (#20318) * Vertical align navbar avatar at middle (#20302) * Delete cancel button in repo creation page (#21381) * Include login_name in adminCreateUser response (#20283) * fix: icon margin in user/settings/repos (#20281) * Remove blue text on migrate page (#20273) * Modify milestone search keywords to be case insensitive (#20266) * Move some files into models' sub packages (#20262) * Add tooltip to repo icons in explore page (#20241) * Remove deprecated licenses (#20222) * Webhook for Wiki changes (#20219) * Share HTML template renderers and create a watcher framework (#20218) * Allow enable LDAP source and disable user sync via CLI (#20206) * Adds a checkbox to select all issues/PRs (#20177) * Refactor `i18n` to `locale` (#20153) * Disable status checks in template if none found (#20088) * Allow manager logging to set SQL (#20064) * Add order by for assignee no sort issue (#20053) * Take a stab at porting existing components to Vue3 (#20044) * Add doctor command to write commit-graphs (#20007) * Add support for authentication based on reverse proxy email (#19949) * Enable spellcheck for EasyMDE, use contenteditable mode (#19776) * Allow specifying SECRET_KEY_URI, similar to INTERNAL_TOKEN_URI (#19663) * Rework mailer settings (#18982) * Add option to purge users (#18064) * Add author search input (#21246) * Make rss/atom identifier globally unique (#21550) * BUGFIXES * Auth interface return error when verify failure (#22119) (#22259) * Use complete SHA to create and query commit status (#22244) (#22257) * Update bleve and zapx to fix unaligned atomic (#22031) (#22218) * Prevent panic in doctor command when running default checks (#21791) (#21807) * Load GitRepo in API before deleting issue (#21720) (#21796) * Ignore line anchor links with leading zeroes (#21728) (#21776) * Set last login when activating account (#21731) (#21755) * Fix UI language switching bug (#21597) (#21749) * Quick fixes monaco-editor error: "vs.editor.nullLanguage" (#21734) (#21738) * Allow local package identifiers for PyPI packages (#21690) (#21727) * Deal with markdown template without metadata (#21639) (#21654) * Fix opaque background on mermaid diagrams (#21642) (#21652) * Fix repository adoption on Windows (#21646) (#21650) * Sync git hooks when config file path changed (#21619) (#21626) * Fix 500 on PR files API (#21602) (#21607) * Fix `Timestamp.IsZero` (#21593) (#21603) * Fix viewing user subscriptions (#21482) * Fix mermaid-related bugs (#21431) * Fix branch dropdown shifting on page load (#21428) * Fix default theme-auto selector when nologin (#21346) * Fix and improve incorrect error messages (#21342) * Fix formatted link for PR review notifications to matrix (#21319) * Center-aligning content of WebAuthN page (#21127) * Remove follow from commits by file (#20765) * Fix commit status popup (#20737) * Fix init mail render logic (#20704) * Use correct page size for link header pagination (#20546) * Preserve unix socket file (#20499) * Use tippy.js for context popup (#20393) * Add missing parameter for error in log message (#20144) * Do not allow organisation owners add themselves as collaborator (#20043) * Rework file highlight rendering and fix yaml copy-paste (#19967) * Improve code diff highlight, fix incorrect rendered diff result (#19958) * TESTING * Improve OAuth integration tests (#21390) * Add playwright tests (#20123) * BUILD * Switch to building with go1.19 (#20695) * Update JS dependencies, adjust eslint (#20659) * Add more linters to improve code readability (#19989) ## [1.17.4](https://github.com/go-gitea/gitea/releases/tag/v1.17.4) - 2022-12-21 * SECURITY * Do not allow Ghost access to limited visible user/org (#21849) (#21875)
-
-
-
@@ -190,6 +190,8 @@ - **services:** Support functions for common routing operations. Uses models and modules to handle the request.- **templates:** Golang templates for generating the html output. - **tests/e2e:** End to end tests - **tests/integration:** Integration tests - **tests/gitea-repositories-meta:** Sample repos used in integration tests. Adding a new repo requires editing `models/fixtures/repositories.yml` and `models/fixtures/repo_unit.yml` to match. - **tests/gitea-lfs-meta:** Sample LFS objects used in integration tests. Adding a new object requires editing `models/fixtures/lfs_meta_object.yml` to match. - **vendor:** External code that Gitea depends on. ## Documentation
-
@@ -439,7 +441,7 @@Code that you contribute should use the standard copyright header: ``` // Copyright 2022 The Gitea Authors. All rights reserved. // Copyright <year> The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT ```
-
-
-
@@ -359,7 +359,7 @@ NODE_ENV=development npx webpack --watch --progress.PHONY: watch-backend watch-backend: go-check $(GO) run $(AIR_PACKAGE) -c .air.toml GITEA_RUN_MODE=dev $(GO) run $(AIR_PACKAGE) -c .air.toml .PHONY: test test: test-frontend test-backend
-
-
-
@@ -1,1 +1,1 @@[{"emoji":"๐","aliases":["+1","thumbsup"]},{"emoji":"๐","aliases":["-1","thumbsdown"]},{"emoji":"๐ฏ","aliases":["100"]},{"emoji":"๐ข","aliases":["1234"]},{"emoji":"๐ฅ","aliases":["1st_place_medal"]},{"emoji":"๐ฅ","aliases":["2nd_place_medal"]},{"emoji":"๐ฅ","aliases":["3rd_place_medal"]},{"emoji":"๐ฑ","aliases":["8ball"]},{"emoji":"๐ ฐ๏ธ","aliases":["a"]},{"emoji":"๐","aliases":["ab"]},{"emoji":"๐งฎ","aliases":["abacus"]},{"emoji":"๐ค","aliases":["abc"]},{"emoji":"๐ก","aliases":["abcd"]},{"emoji":"๐","aliases":["accept"]},{"emoji":"๐ฉน","aliases":["adhesive_bandage"]},{"emoji":"๐ง","aliases":["adult"]},{"emoji":"๐ก","aliases":["aerial_tramway"]},{"emoji":"๐ฆ๐ซ","aliases":["afghanistan"]},{"emoji":"โ๏ธ","aliases":["airplane"]},{"emoji":"๐ฆ๐ฝ","aliases":["aland_islands"]},{"emoji":"โฐ","aliases":["alarm_clock"]},{"emoji":"๐ฆ๐ฑ","aliases":["albania"]},{"emoji":"โ๏ธ","aliases":["alembic"]},{"emoji":"๐ฉ๐ฟ","aliases":["algeria"]},{"emoji":"๐ฝ","aliases":["alien"]},{"emoji":"๐","aliases":["ambulance"]},{"emoji":"๐ฆ๐ธ","aliases":["american_samoa"]},{"emoji":"๐บ","aliases":["amphora"]},{"emoji":"โ","aliases":["anchor"]},{"emoji":"๐ฆ๐ฉ","aliases":["andorra"]},{"emoji":"๐ผ","aliases":["angel"]},{"emoji":"๐ข","aliases":["anger"]},{"emoji":"๐ฆ๐ด","aliases":["angola"]},{"emoji":"๐ ","aliases":["angry"]},{"emoji":"๐ฆ๐ฎ","aliases":["anguilla"]},{"emoji":"๐ง","aliases":["anguished"]},{"emoji":"๐","aliases":["ant"]},{"emoji":"๐ฆ๐ถ","aliases":["antarctica"]},{"emoji":"๐ฆ๐ฌ","aliases":["antigua_barbuda"]},{"emoji":"๐","aliases":["apple"]},{"emoji":"โ","aliases":["aquarius"]},{"emoji":"๐ฆ๐ท","aliases":["argentina"]},{"emoji":"โ","aliases":["aries"]},{"emoji":"๐ฆ๐ฒ","aliases":["armenia"]},{"emoji":"โ๏ธ","aliases":["arrow_backward"]},{"emoji":"โฌ","aliases":["arrow_double_down"]},{"emoji":"โซ","aliases":["arrow_double_up"]},{"emoji":"โฌ๏ธ","aliases":["arrow_down"]},{"emoji":"๐ฝ","aliases":["arrow_down_small"]},{"emoji":"โถ๏ธ","aliases":["arrow_forward"]},{"emoji":"โคต๏ธ","aliases":["arrow_heading_down"]},{"emoji":"โคด๏ธ","aliases":["arrow_heading_up"]},{"emoji":"โฌ ๏ธ","aliases":["arrow_left"]},{"emoji":"โ๏ธ","aliases":["arrow_lower_left"]},{"emoji":"โ๏ธ","aliases":["arrow_lower_right"]},{"emoji":"โก๏ธ","aliases":["arrow_right"]},{"emoji":"โช๏ธ","aliases":["arrow_right_hook"]},{"emoji":"โฌ๏ธ","aliases":["arrow_up"]},{"emoji":"โ๏ธ","aliases":["arrow_up_down"]},{"emoji":"๐ผ","aliases":["arrow_up_small"]},{"emoji":"โ๏ธ","aliases":["arrow_upper_left"]},{"emoji":"โ๏ธ","aliases":["arrow_upper_right"]},{"emoji":"๐","aliases":["arrows_clockwise"]},{"emoji":"๐","aliases":["arrows_counterclockwise"]},{"emoji":"๐จ","aliases":["art"]},{"emoji":"๐","aliases":["articulated_lorry"]},{"emoji":"๐ฐ๏ธ","aliases":["artificial_satellite"]},{"emoji":"๐งโ๐จ","aliases":["artist"]},{"emoji":"๐ฆ๐ผ","aliases":["aruba"]},{"emoji":"๐ฆ๐จ","aliases":["ascension_island"]},{"emoji":"*๏ธโฃ","aliases":["asterisk"]},{"emoji":"๐ฒ","aliases":["astonished"]},{"emoji":"๐งโ๐","aliases":["astronaut"]},{"emoji":"๐","aliases":["athletic_shoe"]},{"emoji":"๐ง","aliases":["atm"]},{"emoji":"โ๏ธ","aliases":["atom_symbol"]},{"emoji":"๐ฆ๐บ","aliases":["australia"]},{"emoji":"๐ฆ๐น","aliases":["austria"]},{"emoji":"๐บ","aliases":["auto_rickshaw"]},{"emoji":"๐ฅ","aliases":["avocado"]},{"emoji":"๐ช","aliases":["axe"]},{"emoji":"๐ฆ๐ฟ","aliases":["azerbaijan"]},{"emoji":"๐ ฑ๏ธ","aliases":["b"]},{"emoji":"๐ถ","aliases":["baby"]},{"emoji":"๐ผ","aliases":["baby_bottle"]},{"emoji":"๐ค","aliases":["baby_chick"]},{"emoji":"๐ผ","aliases":["baby_symbol"]},{"emoji":"๐","aliases":["back"]},{"emoji":"๐ฅ","aliases":["bacon"]},{"emoji":"๐ฆก","aliases":["badger"]},{"emoji":"๐ธ","aliases":["badminton"]},{"emoji":"๐ฅฏ","aliases":["bagel"]},{"emoji":"๐","aliases":["baggage_claim"]},{"emoji":"๐ฅ","aliases":["baguette_bread"]},{"emoji":"๐ง๐ธ","aliases":["bahamas"]},{"emoji":"๐ง๐ญ","aliases":["bahrain"]},{"emoji":"โ๏ธ","aliases":["balance_scale"]},{"emoji":"๐จโ๐ฆฒ","aliases":["bald_man"]},{"emoji":"๐ฉโ๐ฆฒ","aliases":["bald_woman"]},{"emoji":"๐ฉฐ","aliases":["ballet_shoes"]},{"emoji":"๐","aliases":["balloon"]},{"emoji":"๐ณ๏ธ","aliases":["ballot_box"]},{"emoji":"โ๏ธ","aliases":["ballot_box_with_check"]},{"emoji":"๐","aliases":["bamboo"]},{"emoji":"๐","aliases":["banana"]},{"emoji":"โผ๏ธ","aliases":["bangbang"]},{"emoji":"๐ง๐ฉ","aliases":["bangladesh"]},{"emoji":"๐ช","aliases":["banjo"]},{"emoji":"๐ฆ","aliases":["bank"]},{"emoji":"๐","aliases":["bar_chart"]},{"emoji":"๐ง๐ง","aliases":["barbados"]},{"emoji":"๐","aliases":["barber"]},{"emoji":"โพ","aliases":["baseball"]},{"emoji":"๐งบ","aliases":["basket"]},{"emoji":"๐","aliases":["basketball"]},{"emoji":"๐ฆ","aliases":["bat"]},{"emoji":"๐","aliases":["bath"]},{"emoji":"๐","aliases":["bathtub"]},{"emoji":"๐","aliases":["battery"]},{"emoji":"๐๏ธ","aliases":["beach_umbrella"]},{"emoji":"๐ป","aliases":["bear"]},{"emoji":"๐ง","aliases":["bearded_person"]},{"emoji":"๐๏ธ","aliases":["bed"]},{"emoji":"๐","aliases":["bee","honeybee"]},{"emoji":"๐บ","aliases":["beer"]},{"emoji":"๐ป","aliases":["beers"]},{"emoji":"๐ฐ","aliases":["beginner"]},{"emoji":"๐ง๐พ","aliases":["belarus"]},{"emoji":"๐ง๐ช","aliases":["belgium"]},{"emoji":"๐ง๐ฟ","aliases":["belize"]},{"emoji":"๐","aliases":["bell"]},{"emoji":"๐๏ธ","aliases":["bellhop_bell"]},{"emoji":"๐ง๐ฏ","aliases":["benin"]},{"emoji":"๐ฑ","aliases":["bento"]},{"emoji":"๐ง๐ฒ","aliases":["bermuda"]},{"emoji":"๐ง","aliases":["beverage_box"]},{"emoji":"๐ง๐น","aliases":["bhutan"]},{"emoji":"๐ด","aliases":["bicyclist"]},{"emoji":"๐ฒ","aliases":["bike"]},{"emoji":"๐ดโโ๏ธ","aliases":["biking_man"]},{"emoji":"๐ดโโ๏ธ","aliases":["biking_woman"]},{"emoji":"๐","aliases":["bikini"]},{"emoji":"๐งข","aliases":["billed_cap"]},{"emoji":"โฃ๏ธ","aliases":["biohazard"]},{"emoji":"๐ฆ","aliases":["bird"]},{"emoji":"๐","aliases":["birthday"]},{"emoji":"โซ","aliases":["black_circle"]},{"emoji":"๐ด","aliases":["black_flag"]},{"emoji":"๐ค","aliases":["black_heart"]},{"emoji":"๐","aliases":["black_joker"]},{"emoji":"โฌ","aliases":["black_large_square"]},{"emoji":"โพ","aliases":["black_medium_small_square"]},{"emoji":"โผ๏ธ","aliases":["black_medium_square"]},{"emoji":"โ๏ธ","aliases":["black_nib"]},{"emoji":"โช๏ธ","aliases":["black_small_square"]},{"emoji":"๐ฒ","aliases":["black_square_button"]},{"emoji":"๐ฑโโ๏ธ","aliases":["blond_haired_man"]},{"emoji":"๐ฑ","aliases":["blond_haired_person"]},{"emoji":"๐ฑโโ๏ธ","aliases":["blond_haired_woman","blonde_woman"]},{"emoji":"๐ผ","aliases":["blossom"]},{"emoji":"๐ก","aliases":["blowfish"]},{"emoji":"๐","aliases":["blue_book"]},{"emoji":"๐","aliases":["blue_car"]},{"emoji":"๐","aliases":["blue_heart"]},{"emoji":"๐ฆ","aliases":["blue_square"]},{"emoji":"๐","aliases":["blush"]},{"emoji":"๐","aliases":["boar"]},{"emoji":"โต","aliases":["boat","sailboat"]},{"emoji":"๐ง๐ด","aliases":["bolivia"]},{"emoji":"๐ฃ","aliases":["bomb"]},{"emoji":"๐ฆด","aliases":["bone"]},{"emoji":"๐","aliases":["book","open_book"]},{"emoji":"๐","aliases":["bookmark"]},{"emoji":"๐","aliases":["bookmark_tabs"]},{"emoji":"๐","aliases":["books"]},{"emoji":"๐ฅ","aliases":["boom","collision"]},{"emoji":"๐ข","aliases":["boot"]},{"emoji":"๐ง๐ฆ","aliases":["bosnia_herzegovina"]},{"emoji":"๐ง๐ผ","aliases":["botswana"]},{"emoji":"โน๏ธโโ๏ธ","aliases":["bouncing_ball_man","basketball_man"]},{"emoji":"โน๏ธ","aliases":["bouncing_ball_person"]},{"emoji":"โน๏ธโโ๏ธ","aliases":["bouncing_ball_woman","basketball_woman"]},{"emoji":"๐","aliases":["bouquet"]},{"emoji":"๐ง๐ป","aliases":["bouvet_island"]},{"emoji":"๐","aliases":["bow"]},{"emoji":"๐น","aliases":["bow_and_arrow"]},{"emoji":"๐โโ๏ธ","aliases":["bowing_man"]},{"emoji":"๐โโ๏ธ","aliases":["bowing_woman"]},{"emoji":"๐ฅฃ","aliases":["bowl_with_spoon"]},{"emoji":"๐ณ","aliases":["bowling"]},{"emoji":"๐ฅ","aliases":["boxing_glove"]},{"emoji":"๐ฆ","aliases":["boy"]},{"emoji":"๐ง ","aliases":["brain"]},{"emoji":"๐ง๐ท","aliases":["brazil"]},{"emoji":"๐","aliases":["bread"]},{"emoji":"๐คฑ","aliases":["breast_feeding"]},{"emoji":"๐งฑ","aliases":["bricks"]},{"emoji":"๐","aliases":["bridge_at_night"]},{"emoji":"๐ผ","aliases":["briefcase"]},{"emoji":"๐ฎ๐ด","aliases":["british_indian_ocean_territory"]},{"emoji":"๐ป๐ฌ","aliases":["british_virgin_islands"]},{"emoji":"๐ฅฆ","aliases":["broccoli"]},{"emoji":"๐","aliases":["broken_heart"]},{"emoji":"๐งน","aliases":["broom"]},{"emoji":"๐ค","aliases":["brown_circle"]},{"emoji":"๐ค","aliases":["brown_heart"]},{"emoji":"๐ซ","aliases":["brown_square"]},{"emoji":"๐ง๐ณ","aliases":["brunei"]},{"emoji":"๐","aliases":["bug"]},{"emoji":"๐๏ธ","aliases":["building_construction"]},{"emoji":"๐ก","aliases":["bulb"]},{"emoji":"๐ง๐ฌ","aliases":["bulgaria"]},{"emoji":"๐ ","aliases":["bullettrain_front"]},{"emoji":"๐","aliases":["bullettrain_side"]},{"emoji":"๐ง๐ซ","aliases":["burkina_faso"]},{"emoji":"๐ฏ","aliases":["burrito"]},{"emoji":"๐ง๐ฎ","aliases":["burundi"]},{"emoji":"๐","aliases":["bus"]},{"emoji":"๐ด๏ธ","aliases":["business_suit_levitating"]},{"emoji":"๐","aliases":["busstop"]},{"emoji":"๐ค","aliases":["bust_in_silhouette"]},{"emoji":"๐ฅ","aliases":["busts_in_silhouette"]},{"emoji":"๐ง","aliases":["butter"]},{"emoji":"๐ฆ","aliases":["butterfly"]},{"emoji":"๐ต","aliases":["cactus"]},{"emoji":"๐ฐ","aliases":["cake"]},{"emoji":"๐","aliases":["calendar"]},{"emoji":"๐ค","aliases":["call_me_hand"]},{"emoji":"๐ฒ","aliases":["calling"]},{"emoji":"๐ฐ๐ญ","aliases":["cambodia"]},{"emoji":"๐ซ","aliases":["camel"]},{"emoji":"๐ท","aliases":["camera"]},{"emoji":"๐ธ","aliases":["camera_flash"]},{"emoji":"๐จ๐ฒ","aliases":["cameroon"]},{"emoji":"๐๏ธ","aliases":["camping"]},{"emoji":"๐จ๐ฆ","aliases":["canada"]},{"emoji":"๐ฎ๐จ","aliases":["canary_islands"]},{"emoji":"โ","aliases":["cancer"]},{"emoji":"๐ฏ๏ธ","aliases":["candle"]},{"emoji":"๐ฌ","aliases":["candy"]},{"emoji":"๐ฅซ","aliases":["canned_food"]},{"emoji":"๐ถ","aliases":["canoe"]},{"emoji":"๐จ๐ป","aliases":["cape_verde"]},{"emoji":"๐ ","aliases":["capital_abcd"]},{"emoji":"โ","aliases":["capricorn"]},{"emoji":"๐","aliases":["car","red_car"]},{"emoji":"๐๏ธ","aliases":["card_file_box"]},{"emoji":"๐","aliases":["card_index"]},{"emoji":"๐๏ธ","aliases":["card_index_dividers"]},{"emoji":"๐ง๐ถ","aliases":["caribbean_netherlands"]},{"emoji":"๐ ","aliases":["carousel_horse"]},{"emoji":"๐ฅ","aliases":["carrot"]},{"emoji":"๐คธ","aliases":["cartwheeling"]},{"emoji":"๐ฑ","aliases":["cat"]},{"emoji":"๐","aliases":["cat2"]},{"emoji":"๐ฐ๐พ","aliases":["cayman_islands"]},{"emoji":"๐ฟ","aliases":["cd"]},{"emoji":"๐จ๐ซ","aliases":["central_african_republic"]},{"emoji":"๐ช๐ฆ","aliases":["ceuta_melilla"]},{"emoji":"๐น๐ฉ","aliases":["chad"]},{"emoji":"โ๏ธ","aliases":["chains"]},{"emoji":"๐ช","aliases":["chair"]},{"emoji":"๐พ","aliases":["champagne"]},{"emoji":"๐น","aliases":["chart"]},{"emoji":"๐","aliases":["chart_with_downwards_trend"]},{"emoji":"๐","aliases":["chart_with_upwards_trend"]},{"emoji":"๐","aliases":["checkered_flag"]},{"emoji":"๐ง","aliases":["cheese"]},{"emoji":"๐","aliases":["cherries"]},{"emoji":"๐ธ","aliases":["cherry_blossom"]},{"emoji":"โ๏ธ","aliases":["chess_pawn"]},{"emoji":"๐ฐ","aliases":["chestnut"]},{"emoji":"๐","aliases":["chicken"]},{"emoji":"๐ง","aliases":["child"]},{"emoji":"๐ธ","aliases":["children_crossing"]},{"emoji":"๐จ๐ฑ","aliases":["chile"]},{"emoji":"๐ฟ๏ธ","aliases":["chipmunk"]},{"emoji":"๐ซ","aliases":["chocolate_bar"]},{"emoji":"๐ฅข","aliases":["chopsticks"]},{"emoji":"๐จ๐ฝ","aliases":["christmas_island"]},{"emoji":"๐","aliases":["christmas_tree"]},{"emoji":"โช","aliases":["church"]},{"emoji":"๐ฆ","aliases":["cinema"]},{"emoji":"๐ช","aliases":["circus_tent"]},{"emoji":"๐","aliases":["city_sunrise"]},{"emoji":"๐","aliases":["city_sunset"]},{"emoji":"๐๏ธ","aliases":["cityscape"]},{"emoji":"๐","aliases":["cl"]},{"emoji":"๐๏ธ","aliases":["clamp"]},{"emoji":"๐","aliases":["clap"]},{"emoji":"๐ฌ","aliases":["clapper"]},{"emoji":"๐๏ธ","aliases":["classical_building"]},{"emoji":"๐ง","aliases":["climbing"]},{"emoji":"๐งโโ๏ธ","aliases":["climbing_man"]},{"emoji":"๐งโโ๏ธ","aliases":["climbing_woman"]},{"emoji":"๐ฅ","aliases":["clinking_glasses"]},{"emoji":"๐","aliases":["clipboard"]},{"emoji":"๐จ๐ต","aliases":["clipperton_island"]},{"emoji":"๐","aliases":["clock1"]},{"emoji":"๐","aliases":["clock10"]},{"emoji":"๐ฅ","aliases":["clock1030"]},{"emoji":"๐","aliases":["clock11"]},{"emoji":"๐ฆ","aliases":["clock1130"]},{"emoji":"๐","aliases":["clock12"]},{"emoji":"๐ง","aliases":["clock1230"]},{"emoji":"๐","aliases":["clock130"]},{"emoji":"๐","aliases":["clock2"]},{"emoji":"๐","aliases":["clock230"]},{"emoji":"๐","aliases":["clock3"]},{"emoji":"๐","aliases":["clock330"]},{"emoji":"๐","aliases":["clock4"]},{"emoji":"๐","aliases":["clock430"]},{"emoji":"๐","aliases":["clock5"]},{"emoji":"๐ ","aliases":["clock530"]},{"emoji":"๐","aliases":["clock6"]},{"emoji":"๐ก","aliases":["clock630"]},{"emoji":"๐","aliases":["clock7"]},{"emoji":"๐ข","aliases":["clock730"]},{"emoji":"๐","aliases":["clock8"]},{"emoji":"๐ฃ","aliases":["clock830"]},{"emoji":"๐","aliases":["clock9"]},{"emoji":"๐ค","aliases":["clock930"]},{"emoji":"๐","aliases":["closed_book"]},{"emoji":"๐","aliases":["closed_lock_with_key"]},{"emoji":"๐","aliases":["closed_umbrella"]},{"emoji":"โ๏ธ","aliases":["cloud"]},{"emoji":"๐ฉ๏ธ","aliases":["cloud_with_lightning"]},{"emoji":"โ๏ธ","aliases":["cloud_with_lightning_and_rain"]},{"emoji":"๐ง๏ธ","aliases":["cloud_with_rain"]},{"emoji":"๐จ๏ธ","aliases":["cloud_with_snow"]},{"emoji":"๐คก","aliases":["clown_face"]},{"emoji":"โฃ๏ธ","aliases":["clubs"]},{"emoji":"๐จ๐ณ","aliases":["cn"]},{"emoji":"๐งฅ","aliases":["coat"]},{"emoji":"๐ธ","aliases":["cocktail"]},{"emoji":"๐ฅฅ","aliases":["coconut"]},{"emoji":"๐จ๐จ","aliases":["cocos_islands"]},{"emoji":"โ","aliases":["coffee"]},{"emoji":"โฐ๏ธ","aliases":["coffin"]},{"emoji":"๐ฅถ","aliases":["cold_face"]},{"emoji":"๐ฐ","aliases":["cold_sweat"]},{"emoji":"๐จ๐ด","aliases":["colombia"]},{"emoji":"โ๏ธ","aliases":["comet"]},{"emoji":"๐ฐ๐ฒ","aliases":["comoros"]},{"emoji":"๐งญ","aliases":["compass"]},{"emoji":"๐ป","aliases":["computer"]},{"emoji":"๐ฑ๏ธ","aliases":["computer_mouse"]},{"emoji":"๐","aliases":["confetti_ball"]},{"emoji":"๐","aliases":["confounded"]},{"emoji":"๐","aliases":["confused"]},{"emoji":"๐จ๐ฌ","aliases":["congo_brazzaville"]},{"emoji":"๐จ๐ฉ","aliases":["congo_kinshasa"]},{"emoji":"ใ๏ธ","aliases":["congratulations"]},{"emoji":"๐ง","aliases":["construction"]},{"emoji":"๐ท","aliases":["construction_worker"]},{"emoji":"๐ทโโ๏ธ","aliases":["construction_worker_man"]},{"emoji":"๐ทโโ๏ธ","aliases":["construction_worker_woman"]},{"emoji":"๐๏ธ","aliases":["control_knobs"]},{"emoji":"๐ช","aliases":["convenience_store"]},{"emoji":"๐งโ๐ณ","aliases":["cook"]},{"emoji":"๐จ๐ฐ","aliases":["cook_islands"]},{"emoji":"๐ช","aliases":["cookie"]},{"emoji":"๐","aliases":["cool"]},{"emoji":"ยฉ๏ธ","aliases":["copyright"]},{"emoji":"๐ฝ","aliases":["corn"]},{"emoji":"๐จ๐ท","aliases":["costa_rica"]},{"emoji":"๐จ๐ฎ","aliases":["cote_divoire"]},{"emoji":"๐๏ธ","aliases":["couch_and_lamp"]},{"emoji":"๐ซ","aliases":["couple"]},{"emoji":"๐","aliases":["couple_with_heart"]},{"emoji":"๐จโโค๏ธโ๐จ","aliases":["couple_with_heart_man_man"]},{"emoji":"๐ฉโโค๏ธโ๐จ","aliases":["couple_with_heart_woman_man"]},{"emoji":"๐ฉโโค๏ธโ๐ฉ","aliases":["couple_with_heart_woman_woman"]},{"emoji":"๐","aliases":["couplekiss"]},{"emoji":"๐จโโค๏ธโ๐โ๐จ","aliases":["couplekiss_man_man"]},{"emoji":"๐ฉโโค๏ธโ๐โ๐จ","aliases":["couplekiss_man_woman"]},{"emoji":"๐ฉโโค๏ธโ๐โ๐ฉ","aliases":["couplekiss_woman_woman"]},{"emoji":"๐ฎ","aliases":["cow"]},{"emoji":"๐","aliases":["cow2"]},{"emoji":"๐ค ","aliases":["cowboy_hat_face"]},{"emoji":"๐ฆ","aliases":["crab"]},{"emoji":"๐๏ธ","aliases":["crayon"]},{"emoji":"๐ณ","aliases":["credit_card"]},{"emoji":"๐","aliases":["crescent_moon"]},{"emoji":"๐ฆ","aliases":["cricket"]},{"emoji":"๐","aliases":["cricket_game"]},{"emoji":"๐ญ๐ท","aliases":["croatia"]},{"emoji":"๐","aliases":["crocodile"]},{"emoji":"๐ฅ","aliases":["croissant"]},{"emoji":"๐ค","aliases":["crossed_fingers"]},{"emoji":"๐","aliases":["crossed_flags"]},{"emoji":"โ๏ธ","aliases":["crossed_swords"]},{"emoji":"๐","aliases":["crown"]},{"emoji":"๐ข","aliases":["cry"]},{"emoji":"๐ฟ","aliases":["crying_cat_face"]},{"emoji":"๐ฎ","aliases":["crystal_ball"]},{"emoji":"๐จ๐บ","aliases":["cuba"]},{"emoji":"๐ฅ","aliases":["cucumber"]},{"emoji":"๐ฅค","aliases":["cup_with_straw"]},{"emoji":"๐ง","aliases":["cupcake"]},{"emoji":"๐","aliases":["cupid"]},{"emoji":"๐จ๐ผ","aliases":["curacao"]},{"emoji":"๐ฅ","aliases":["curling_stone"]},{"emoji":"๐จโ๐ฆฑ","aliases":["curly_haired_man"]},{"emoji":"๐ฉโ๐ฆฑ","aliases":["curly_haired_woman"]},{"emoji":"โฐ","aliases":["curly_loop"]},{"emoji":"๐ฑ","aliases":["currency_exchange"]},{"emoji":"๐","aliases":["curry"]},{"emoji":"๐คฌ","aliases":["cursing_face"]},{"emoji":"๐ฎ","aliases":["custard"]},{"emoji":"๐","aliases":["customs"]},{"emoji":"๐ฅฉ","aliases":["cut_of_meat"]},{"emoji":"๐","aliases":["cyclone"]},{"emoji":"๐จ๐พ","aliases":["cyprus"]},{"emoji":"๐จ๐ฟ","aliases":["czech_republic"]},{"emoji":"๐ก๏ธ","aliases":["dagger"]},{"emoji":"๐ฏ","aliases":["dancers"]},{"emoji":"๐ฏโโ๏ธ","aliases":["dancing_men"]},{"emoji":"๐ฏโโ๏ธ","aliases":["dancing_women"]},{"emoji":"๐ก","aliases":["dango"]},{"emoji":"๐ถ๏ธ","aliases":["dark_sunglasses"]},{"emoji":"๐ฏ","aliases":["dart"]},{"emoji":"๐จ","aliases":["dash"]},{"emoji":"๐ ","aliases":["date"]},{"emoji":"๐ฉ๐ช","aliases":["de"]},{"emoji":"๐งโโ๏ธ","aliases":["deaf_man"]},{"emoji":"๐ง","aliases":["deaf_person"]},{"emoji":"๐งโโ๏ธ","aliases":["deaf_woman"]},{"emoji":"๐ณ","aliases":["deciduous_tree"]},{"emoji":"๐ฆ","aliases":["deer"]},{"emoji":"๐ฉ๐ฐ","aliases":["denmark"]},{"emoji":"๐ฌ","aliases":["department_store"]},{"emoji":"๐๏ธ","aliases":["derelict_house"]},{"emoji":"๐๏ธ","aliases":["desert"]},{"emoji":"๐๏ธ","aliases":["desert_island"]},{"emoji":"๐ฅ๏ธ","aliases":["desktop_computer"]},{"emoji":"๐ต๏ธ","aliases":["detective"]},{"emoji":"๐ ","aliases":["diamond_shape_with_a_dot_inside"]},{"emoji":"โฆ๏ธ","aliases":["diamonds"]},{"emoji":"๐ฉ๐ฌ","aliases":["diego_garcia"]},{"emoji":"๐","aliases":["disappointed"]},{"emoji":"๐ฅ","aliases":["disappointed_relieved"]},{"emoji":"๐คฟ","aliases":["diving_mask"]},{"emoji":"๐ช","aliases":["diya_lamp"]},{"emoji":"๐ซ","aliases":["dizzy"]},{"emoji":"๐ต","aliases":["dizzy_face"]},{"emoji":"๐ฉ๐ฏ","aliases":["djibouti"]},{"emoji":"๐งฌ","aliases":["dna"]},{"emoji":"๐ฏ","aliases":["do_not_litter"]},{"emoji":"๐ถ","aliases":["dog"]},{"emoji":"๐","aliases":["dog2"]},{"emoji":"๐ต","aliases":["dollar"]},{"emoji":"๐","aliases":["dolls"]},{"emoji":"๐ฌ","aliases":["dolphin","flipper"]},{"emoji":"๐ฉ๐ฒ","aliases":["dominica"]},{"emoji":"๐ฉ๐ด","aliases":["dominican_republic"]},{"emoji":"๐ช","aliases":["door"]},{"emoji":"๐ฉ","aliases":["doughnut"]},{"emoji":"๐๏ธ","aliases":["dove"]},{"emoji":"๐","aliases":["dragon"]},{"emoji":"๐ฒ","aliases":["dragon_face"]},{"emoji":"๐","aliases":["dress"]},{"emoji":"๐ช","aliases":["dromedary_camel"]},{"emoji":"๐คค","aliases":["drooling_face"]},{"emoji":"๐ฉธ","aliases":["drop_of_blood"]},{"emoji":"๐ง","aliases":["droplet"]},{"emoji":"๐ฅ","aliases":["drum"]},{"emoji":"๐ฆ","aliases":["duck"]},{"emoji":"๐ฅ","aliases":["dumpling"]},{"emoji":"๐","aliases":["dvd"]},{"emoji":"๐ฆ ","aliases":["eagle"]},{"emoji":"๐","aliases":["ear"]},{"emoji":"๐พ","aliases":["ear_of_rice"]},{"emoji":"๐ฆป","aliases":["ear_with_hearing_aid"]},{"emoji":"๐","aliases":["earth_africa"]},{"emoji":"๐","aliases":["earth_americas"]},{"emoji":"๐","aliases":["earth_asia"]},{"emoji":"๐ช๐จ","aliases":["ecuador"]},{"emoji":"๐ฅ","aliases":["egg"]},{"emoji":"๐","aliases":["eggplant"]},{"emoji":"๐ช๐ฌ","aliases":["egypt"]},{"emoji":"8๏ธโฃ","aliases":["eight"]},{"emoji":"โด๏ธ","aliases":["eight_pointed_black_star"]},{"emoji":"โณ๏ธ","aliases":["eight_spoked_asterisk"]},{"emoji":"โ๏ธ","aliases":["eject_button"]},{"emoji":"๐ธ๐ป","aliases":["el_salvador"]},{"emoji":"๐","aliases":["electric_plug"]},{"emoji":"๐","aliases":["elephant"]},{"emoji":"๐ง","aliases":["elf"]},{"emoji":"๐งโโ๏ธ","aliases":["elf_man"]},{"emoji":"๐งโโ๏ธ","aliases":["elf_woman"]},{"emoji":"๐ง","aliases":["email","e-mail"]},{"emoji":"๐","aliases":["end"]},{"emoji":"๐ด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ","aliases":["england"]},{"emoji":"โ๏ธ","aliases":["envelope"]},{"emoji":"๐ฉ","aliases":["envelope_with_arrow"]},{"emoji":"๐ฌ๐ถ","aliases":["equatorial_guinea"]},{"emoji":"๐ช๐ท","aliases":["eritrea"]},{"emoji":"๐ช๐ธ","aliases":["es"]},{"emoji":"๐ช๐ช","aliases":["estonia"]},{"emoji":"๐ช๐น","aliases":["ethiopia"]},{"emoji":"๐ช๐บ","aliases":["eu","european_union"]},{"emoji":"๐ถ","aliases":["euro"]},{"emoji":"๐ฐ","aliases":["european_castle"]},{"emoji":"๐ค","aliases":["european_post_office"]},{"emoji":"๐ฒ","aliases":["evergreen_tree"]},{"emoji":"โ","aliases":["exclamation","heavy_exclamation_mark"]},{"emoji":"๐คฏ","aliases":["exploding_head"]},{"emoji":"๐","aliases":["expressionless"]},{"emoji":"๐๏ธ","aliases":["eye"]},{"emoji":"๐๏ธโ๐จ๏ธ","aliases":["eye_speech_bubble"]},{"emoji":"๐","aliases":["eyeglasses"]},{"emoji":"๐","aliases":["eyes"]},{"emoji":"๐ค","aliases":["face_with_head_bandage"]},{"emoji":"๐ค","aliases":["face_with_thermometer"]},{"emoji":"๐คฆ","aliases":["facepalm"]},{"emoji":"๐ญ","aliases":["factory"]},{"emoji":"๐งโ๐ญ","aliases":["factory_worker"]},{"emoji":"๐ง","aliases":["fairy"]},{"emoji":"๐งโโ๏ธ","aliases":["fairy_man"]},{"emoji":"๐งโโ๏ธ","aliases":["fairy_woman"]},{"emoji":"๐ง","aliases":["falafel"]},{"emoji":"๐ซ๐ฐ","aliases":["falkland_islands"]},{"emoji":"๐","aliases":["fallen_leaf"]},{"emoji":"๐ช","aliases":["family"]},{"emoji":"๐จโ๐ฆ","aliases":["family_man_boy"]},{"emoji":"๐จโ๐ฆโ๐ฆ","aliases":["family_man_boy_boy"]},{"emoji":"๐จโ๐ง","aliases":["family_man_girl"]},{"emoji":"๐จโ๐งโ๐ฆ","aliases":["family_man_girl_boy"]},{"emoji":"๐จโ๐งโ๐ง","aliases":["family_man_girl_girl"]},{"emoji":"๐จโ๐จโ๐ฆ","aliases":["family_man_man_boy"]},{"emoji":"๐จโ๐จโ๐ฆโ๐ฆ","aliases":["family_man_man_boy_boy"]},{"emoji":"๐จโ๐จโ๐ง","aliases":["family_man_man_girl"]},{"emoji":"๐จโ๐จโ๐งโ๐ฆ","aliases":["family_man_man_girl_boy"]},{"emoji":"๐จโ๐จโ๐งโ๐ง","aliases":["family_man_man_girl_girl"]},{"emoji":"๐จโ๐ฉโ๐ฆ","aliases":["family_man_woman_boy"]},{"emoji":"๐จโ๐ฉโ๐ฆโ๐ฆ","aliases":["family_man_woman_boy_boy"]},{"emoji":"๐จโ๐ฉโ๐ง","aliases":["family_man_woman_girl"]},{"emoji":"๐จโ๐ฉโ๐งโ๐ฆ","aliases":["family_man_woman_girl_boy"]},{"emoji":"๐จโ๐ฉโ๐งโ๐ง","aliases":["family_man_woman_girl_girl"]},{"emoji":"๐ฉโ๐ฆ","aliases":["family_woman_boy"]},{"emoji":"๐ฉโ๐ฆโ๐ฆ","aliases":["family_woman_boy_boy"]},{"emoji":"๐ฉโ๐ง","aliases":["family_woman_girl"]},{"emoji":"๐ฉโ๐งโ๐ฆ","aliases":["family_woman_girl_boy"]},{"emoji":"๐ฉโ๐งโ๐ง","aliases":["family_woman_girl_girl"]},{"emoji":"๐ฉโ๐ฉโ๐ฆ","aliases":["family_woman_woman_boy"]},{"emoji":"๐ฉโ๐ฉโ๐ฆโ๐ฆ","aliases":["family_woman_woman_boy_boy"]},{"emoji":"๐ฉโ๐ฉโ๐ง","aliases":["family_woman_woman_girl"]},{"emoji":"๐ฉโ๐ฉโ๐งโ๐ฆ","aliases":["family_woman_woman_girl_boy"]},{"emoji":"๐ฉโ๐ฉโ๐งโ๐ง","aliases":["family_woman_woman_girl_girl"]},{"emoji":"๐งโ๐พ","aliases":["farmer"]},{"emoji":"๐ซ๐ด","aliases":["faroe_islands"]},{"emoji":"โฉ","aliases":["fast_forward"]},{"emoji":"๐ ","aliases":["fax"]},{"emoji":"๐จ","aliases":["fearful"]},{"emoji":"๐พ","aliases":["feet","paw_prints"]},{"emoji":"๐ต๏ธโโ๏ธ","aliases":["female_detective"]},{"emoji":"โ๏ธ","aliases":["female_sign"]},{"emoji":"๐ก","aliases":["ferris_wheel"]},{"emoji":"โด๏ธ","aliases":["ferry"]},{"emoji":"๐","aliases":["field_hockey"]},{"emoji":"๐ซ๐ฏ","aliases":["fiji"]},{"emoji":"๐๏ธ","aliases":["file_cabinet"]},{"emoji":"๐","aliases":["file_folder"]},{"emoji":"๐ฝ๏ธ","aliases":["film_projector"]},{"emoji":"๐๏ธ","aliases":["film_strip"]},{"emoji":"๐ซ๐ฎ","aliases":["finland"]},{"emoji":"๐ฅ","aliases":["fire"]},{"emoji":"๐","aliases":["fire_engine"]},{"emoji":"๐งฏ","aliases":["fire_extinguisher"]},{"emoji":"๐งจ","aliases":["firecracker"]},{"emoji":"๐งโ๐","aliases":["firefighter"]},{"emoji":"๐","aliases":["fireworks"]},{"emoji":"๐","aliases":["first_quarter_moon"]},{"emoji":"๐","aliases":["first_quarter_moon_with_face"]},{"emoji":"๐","aliases":["fish"]},{"emoji":"๐ฅ","aliases":["fish_cake"]},{"emoji":"๐ฃ","aliases":["fishing_pole_and_fish"]},{"emoji":"๐ค","aliases":["fist_left"]},{"emoji":"๐","aliases":["fist_oncoming","facepunch","punch"]},{"emoji":"โ","aliases":["fist_raised","fist"]},{"emoji":"๐ค","aliases":["fist_right"]},{"emoji":"5๏ธโฃ","aliases":["five"]},{"emoji":"๐","aliases":["flags"]},{"emoji":"๐ฆฉ","aliases":["flamingo"]},{"emoji":"๐ฆ","aliases":["flashlight"]},{"emoji":"๐ฅฟ","aliases":["flat_shoe"]},{"emoji":"โ๏ธ","aliases":["fleur_de_lis"]},{"emoji":"๐ฌ","aliases":["flight_arrival"]},{"emoji":"๐ซ","aliases":["flight_departure"]},{"emoji":"๐พ","aliases":["floppy_disk"]},{"emoji":"๐ด","aliases":["flower_playing_cards"]},{"emoji":"๐ณ","aliases":["flushed"]},{"emoji":"๐ฅ","aliases":["flying_disc"]},{"emoji":"๐ธ","aliases":["flying_saucer"]},{"emoji":"๐ซ๏ธ","aliases":["fog"]},{"emoji":"๐","aliases":["foggy"]},{"emoji":"๐ฆถ","aliases":["foot"]},{"emoji":"๐","aliases":["football"]},{"emoji":"๐ฃ","aliases":["footprints"]},{"emoji":"๐ด","aliases":["fork_and_knife"]},{"emoji":"๐ฅ ","aliases":["fortune_cookie"]},{"emoji":"โฒ","aliases":["fountain"]},{"emoji":"๐๏ธ","aliases":["fountain_pen"]},{"emoji":"4๏ธโฃ","aliases":["four"]},{"emoji":"๐","aliases":["four_leaf_clover"]},{"emoji":"๐ฆ","aliases":["fox_face"]},{"emoji":"๐ซ๐ท","aliases":["fr"]},{"emoji":"๐ผ๏ธ","aliases":["framed_picture"]},{"emoji":"๐","aliases":["free"]},{"emoji":"๐ฌ๐ซ","aliases":["french_guiana"]},{"emoji":"๐ต๐ซ","aliases":["french_polynesia"]},{"emoji":"๐น๐ซ","aliases":["french_southern_territories"]},{"emoji":"๐ณ","aliases":["fried_egg"]},{"emoji":"๐ค","aliases":["fried_shrimp"]},{"emoji":"๐","aliases":["fries"]},{"emoji":"๐ธ","aliases":["frog"]},{"emoji":"๐ฆ","aliases":["frowning"]},{"emoji":"โน๏ธ","aliases":["frowning_face"]},{"emoji":"๐โโ๏ธ","aliases":["frowning_man"]},{"emoji":"๐","aliases":["frowning_person"]},{"emoji":"๐โโ๏ธ","aliases":["frowning_woman"]},{"emoji":"โฝ","aliases":["fuelpump"]},{"emoji":"๐","aliases":["full_moon"]},{"emoji":"๐","aliases":["full_moon_with_face"]},{"emoji":"โฑ๏ธ","aliases":["funeral_urn"]},{"emoji":"๐ฌ๐ฆ","aliases":["gabon"]},{"emoji":"๐ฌ๐ฒ","aliases":["gambia"]},{"emoji":"๐ฒ","aliases":["game_die"]},{"emoji":"๐ง","aliases":["garlic"]},{"emoji":"๐ฌ๐ง","aliases":["gb","uk"]},{"emoji":"โ๏ธ","aliases":["gear"]},{"emoji":"๐","aliases":["gem"]},{"emoji":"โ","aliases":["gemini"]},{"emoji":"๐ง","aliases":["genie"]},{"emoji":"๐งโโ๏ธ","aliases":["genie_man"]},{"emoji":"๐งโโ๏ธ","aliases":["genie_woman"]},{"emoji":"๐ฌ๐ช","aliases":["georgia"]},{"emoji":"๐ฌ๐ญ","aliases":["ghana"]},{"emoji":"๐ป","aliases":["ghost"]},{"emoji":"๐ฌ๐ฎ","aliases":["gibraltar"]},{"emoji":"๐","aliases":["gift"]},{"emoji":"๐","aliases":["gift_heart"]},{"emoji":"๐ฆ","aliases":["giraffe"]},{"emoji":"๐ง","aliases":["girl"]},{"emoji":"๐","aliases":["globe_with_meridians"]},{"emoji":"๐งค","aliases":["gloves"]},{"emoji":"๐ฅ ","aliases":["goal_net"]},{"emoji":"๐","aliases":["goat"]},{"emoji":"๐ฅฝ","aliases":["goggles"]},{"emoji":"โณ","aliases":["golf"]},{"emoji":"๐๏ธ","aliases":["golfing"]},{"emoji":"๐๏ธโโ๏ธ","aliases":["golfing_man"]},{"emoji":"๐๏ธโโ๏ธ","aliases":["golfing_woman"]},{"emoji":"๐ฆ","aliases":["gorilla"]},{"emoji":"๐","aliases":["grapes"]},{"emoji":"๐ฌ๐ท","aliases":["greece"]},{"emoji":"๐","aliases":["green_apple"]},{"emoji":"๐","aliases":["green_book"]},{"emoji":"๐ข","aliases":["green_circle"]},{"emoji":"๐","aliases":["green_heart"]},{"emoji":"๐ฅ","aliases":["green_salad"]},{"emoji":"๐ฉ","aliases":["green_square"]},{"emoji":"๐ฌ๐ฑ","aliases":["greenland"]},{"emoji":"๐ฌ๐ฉ","aliases":["grenada"]},{"emoji":"โ","aliases":["grey_exclamation"]},{"emoji":"โ","aliases":["grey_question"]},{"emoji":"๐ฌ","aliases":["grimacing"]},{"emoji":"๐","aliases":["grin"]},{"emoji":"๐","aliases":["grinning"]},{"emoji":"๐ฌ๐ต","aliases":["guadeloupe"]},{"emoji":"๐ฌ๐บ","aliases":["guam"]},{"emoji":"๐","aliases":["guard"]},{"emoji":"๐โโ๏ธ","aliases":["guardsman"]},{"emoji":"๐โโ๏ธ","aliases":["guardswoman"]},{"emoji":"๐ฌ๐น","aliases":["guatemala"]},{"emoji":"๐ฌ๐ฌ","aliases":["guernsey"]},{"emoji":"๐ฆฎ","aliases":["guide_dog"]},{"emoji":"๐ฌ๐ณ","aliases":["guinea"]},{"emoji":"๐ฌ๐ผ","aliases":["guinea_bissau"]},{"emoji":"๐ธ","aliases":["guitar"]},{"emoji":"๐ซ","aliases":["gun"]},{"emoji":"๐ฌ๐พ","aliases":["guyana"]},{"emoji":"๐","aliases":["haircut"]},{"emoji":"๐โโ๏ธ","aliases":["haircut_man"]},{"emoji":"๐โโ๏ธ","aliases":["haircut_woman"]},{"emoji":"๐ญ๐น","aliases":["haiti"]},{"emoji":"๐","aliases":["hamburger"]},{"emoji":"๐จ","aliases":["hammer"]},{"emoji":"โ๏ธ","aliases":["hammer_and_pick"]},{"emoji":"๐ ๏ธ","aliases":["hammer_and_wrench"]},{"emoji":"๐น","aliases":["hamster"]},{"emoji":"โ","aliases":["hand","raised_hand"]},{"emoji":"๐คญ","aliases":["hand_over_mouth"]},{"emoji":"๐","aliases":["handbag"]},{"emoji":"๐คพ","aliases":["handball_person"]},{"emoji":"๐ค","aliases":["handshake"]},{"emoji":"๐ฉ","aliases":["hankey","poop","shit"]},{"emoji":"#๏ธโฃ","aliases":["hash"]},{"emoji":"๐ฅ","aliases":["hatched_chick"]},{"emoji":"๐ฃ","aliases":["hatching_chick"]},{"emoji":"๐ง","aliases":["headphones"]},{"emoji":"๐งโโ๏ธ","aliases":["health_worker"]},{"emoji":"๐","aliases":["hear_no_evil"]},{"emoji":"๐ญ๐ฒ","aliases":["heard_mcdonald_islands"]},{"emoji":"โค๏ธ","aliases":["heart"]},{"emoji":"๐","aliases":["heart_decoration"]},{"emoji":"๐","aliases":["heart_eyes"]},{"emoji":"๐ป","aliases":["heart_eyes_cat"]},{"emoji":"๐","aliases":["heartbeat"]},{"emoji":"๐","aliases":["heartpulse"]},{"emoji":"โฅ๏ธ","aliases":["hearts"]},{"emoji":"โ๏ธ","aliases":["heavy_check_mark"]},{"emoji":"โ","aliases":["heavy_division_sign"]},{"emoji":"๐ฒ","aliases":["heavy_dollar_sign"]},{"emoji":"โฃ๏ธ","aliases":["heavy_heart_exclamation"]},{"emoji":"โ","aliases":["heavy_minus_sign"]},{"emoji":"โ๏ธ","aliases":["heavy_multiplication_x"]},{"emoji":"โ","aliases":["heavy_plus_sign"]},{"emoji":"๐ฆ","aliases":["hedgehog"]},{"emoji":"๐","aliases":["helicopter"]},{"emoji":"๐ฟ","aliases":["herb"]},{"emoji":"๐บ","aliases":["hibiscus"]},{"emoji":"๐","aliases":["high_brightness"]},{"emoji":"๐ ","aliases":["high_heel"]},{"emoji":"๐ฅพ","aliases":["hiking_boot"]},{"emoji":"๐","aliases":["hindu_temple"]},{"emoji":"๐ฆ","aliases":["hippopotamus"]},{"emoji":"๐ช","aliases":["hocho","knife"]},{"emoji":"๐ณ๏ธ","aliases":["hole"]},{"emoji":"๐ญ๐ณ","aliases":["honduras"]},{"emoji":"๐ฏ","aliases":["honey_pot"]},{"emoji":"๐ญ๐ฐ","aliases":["hong_kong"]},{"emoji":"๐ด","aliases":["horse"]},{"emoji":"๐","aliases":["horse_racing"]},{"emoji":"๐ฅ","aliases":["hospital"]},{"emoji":"๐ฅต","aliases":["hot_face"]},{"emoji":"๐ถ๏ธ","aliases":["hot_pepper"]},{"emoji":"๐ญ","aliases":["hotdog"]},{"emoji":"๐จ","aliases":["hotel"]},{"emoji":"โจ๏ธ","aliases":["hotsprings"]},{"emoji":"โ","aliases":["hourglass"]},{"emoji":"โณ","aliases":["hourglass_flowing_sand"]},{"emoji":"๐ ","aliases":["house"]},{"emoji":"๐ก","aliases":["house_with_garden"]},{"emoji":"๐๏ธ","aliases":["houses"]},{"emoji":"๐ค","aliases":["hugs"]},{"emoji":"๐ญ๐บ","aliases":["hungary"]},{"emoji":"๐ฏ","aliases":["hushed"]},{"emoji":"๐จ","aliases":["ice_cream"]},{"emoji":"๐ง","aliases":["ice_cube"]},{"emoji":"๐","aliases":["ice_hockey"]},{"emoji":"โธ๏ธ","aliases":["ice_skate"]},{"emoji":"๐ฆ","aliases":["icecream"]},{"emoji":"๐ฎ๐ธ","aliases":["iceland"]},{"emoji":"๐","aliases":["id"]},{"emoji":"๐","aliases":["ideograph_advantage"]},{"emoji":"๐ฟ","aliases":["imp"]},{"emoji":"๐ฅ","aliases":["inbox_tray"]},{"emoji":"๐จ","aliases":["incoming_envelope"]},{"emoji":"๐ฎ๐ณ","aliases":["india"]},{"emoji":"๐ฎ๐ฉ","aliases":["indonesia"]},{"emoji":"โพ๏ธ","aliases":["infinity"]},{"emoji":"โน๏ธ","aliases":["information_source"]},{"emoji":"๐","aliases":["innocent"]},{"emoji":"โ๏ธ","aliases":["interrobang"]},{"emoji":"๐ฑ","aliases":["iphone"]},{"emoji":"๐ฎ๐ท","aliases":["iran"]},{"emoji":"๐ฎ๐ถ","aliases":["iraq"]},{"emoji":"๐ฎ๐ช","aliases":["ireland"]},{"emoji":"๐ฎ๐ฒ","aliases":["isle_of_man"]},{"emoji":"๐ฎ๐ฑ","aliases":["israel"]},{"emoji":"๐ฎ๐น","aliases":["it"]},{"emoji":"๐ฎ","aliases":["izakaya_lantern","lantern"]},{"emoji":"๐","aliases":["jack_o_lantern"]},{"emoji":"๐ฏ๐ฒ","aliases":["jamaica"]},{"emoji":"๐พ","aliases":["japan"]},{"emoji":"๐ฏ","aliases":["japanese_castle"]},{"emoji":"๐บ","aliases":["japanese_goblin"]},{"emoji":"๐น","aliases":["japanese_ogre"]},{"emoji":"๐","aliases":["jeans"]},{"emoji":"๐ฏ๐ช","aliases":["jersey"]},{"emoji":"๐งฉ","aliases":["jigsaw"]},{"emoji":"๐ฏ๐ด","aliases":["jordan"]},{"emoji":"๐","aliases":["joy"]},{"emoji":"๐น","aliases":["joy_cat"]},{"emoji":"๐น๏ธ","aliases":["joystick"]},{"emoji":"๐ฏ๐ต","aliases":["jp"]},{"emoji":"๐งโโ๏ธ","aliases":["judge"]},{"emoji":"๐คน","aliases":["juggling_person"]},{"emoji":"๐","aliases":["kaaba"]},{"emoji":"๐ฆ","aliases":["kangaroo"]},{"emoji":"๐ฐ๐ฟ","aliases":["kazakhstan"]},{"emoji":"๐ฐ๐ช","aliases":["kenya"]},{"emoji":"๐","aliases":["key"]},{"emoji":"โจ๏ธ","aliases":["keyboard"]},{"emoji":"๐","aliases":["keycap_ten"]},{"emoji":"๐ด","aliases":["kick_scooter"]},{"emoji":"๐","aliases":["kimono"]},{"emoji":"๐ฐ๐ฎ","aliases":["kiribati"]},{"emoji":"๐","aliases":["kiss"]},{"emoji":"๐","aliases":["kissing"]},{"emoji":"๐ฝ","aliases":["kissing_cat"]},{"emoji":"๐","aliases":["kissing_closed_eyes"]},{"emoji":"๐","aliases":["kissing_heart"]},{"emoji":"๐","aliases":["kissing_smiling_eyes"]},{"emoji":"๐ช","aliases":["kite"]},{"emoji":"๐ฅ","aliases":["kiwi_fruit"]},{"emoji":"๐งโโ๏ธ","aliases":["kneeling_man"]},{"emoji":"๐ง","aliases":["kneeling_person"]},{"emoji":"๐งโโ๏ธ","aliases":["kneeling_woman"]},{"emoji":"๐จ","aliases":["koala"]},{"emoji":"๐","aliases":["koko"]},{"emoji":"๐ฝ๐ฐ","aliases":["kosovo"]},{"emoji":"๐ฐ๐ท","aliases":["kr"]},{"emoji":"๐ฐ๐ผ","aliases":["kuwait"]},{"emoji":"๐ฐ๐ฌ","aliases":["kyrgyzstan"]},{"emoji":"๐ฅผ","aliases":["lab_coat"]},{"emoji":"๐ท๏ธ","aliases":["label"]},{"emoji":"๐ฅ","aliases":["lacrosse"]},{"emoji":"๐","aliases":["lady_beetle"]},{"emoji":"๐ฑ๐ฆ","aliases":["laos"]},{"emoji":"๐ต","aliases":["large_blue_circle"]},{"emoji":"๐ท","aliases":["large_blue_diamond"]},{"emoji":"๐ถ","aliases":["large_orange_diamond"]},{"emoji":"๐","aliases":["last_quarter_moon"]},{"emoji":"๐","aliases":["last_quarter_moon_with_face"]},{"emoji":"โ๏ธ","aliases":["latin_cross"]},{"emoji":"๐ฑ๐ป","aliases":["latvia"]},{"emoji":"๐","aliases":["laughing","satisfied","laugh"]},{"emoji":"๐ฅฌ","aliases":["leafy_green"]},{"emoji":"๐","aliases":["leaves"]},{"emoji":"๐ฑ๐ง","aliases":["lebanon"]},{"emoji":"๐","aliases":["ledger"]},{"emoji":"๐ ","aliases":["left_luggage"]},{"emoji":"โ๏ธ","aliases":["left_right_arrow"]},{"emoji":"๐จ๏ธ","aliases":["left_speech_bubble"]},{"emoji":"โฉ๏ธ","aliases":["leftwards_arrow_with_hook"]},{"emoji":"๐ฆต","aliases":["leg"]},{"emoji":"๐","aliases":["lemon"]},{"emoji":"โ","aliases":["leo"]},{"emoji":"๐","aliases":["leopard"]},{"emoji":"๐ฑ๐ธ","aliases":["lesotho"]},{"emoji":"๐๏ธ","aliases":["level_slider"]},{"emoji":"๐ฑ๐ท","aliases":["liberia"]},{"emoji":"โ","aliases":["libra"]},{"emoji":"๐ฑ๐พ","aliases":["libya"]},{"emoji":"๐ฑ๐ฎ","aliases":["liechtenstein"]},{"emoji":"๐","aliases":["light_rail"]},{"emoji":"๐","aliases":["link"]},{"emoji":"๐ฆ","aliases":["lion"]},{"emoji":"๐","aliases":["lips"]},{"emoji":"๐","aliases":["lipstick"]},{"emoji":"๐ฑ๐น","aliases":["lithuania"]},{"emoji":"๐ฆ","aliases":["lizard"]},{"emoji":"๐ฆ","aliases":["llama"]},{"emoji":"๐ฆ","aliases":["lobster"]},{"emoji":"๐","aliases":["lock"]},{"emoji":"๐","aliases":["lock_with_ink_pen"]},{"emoji":"๐ญ","aliases":["lollipop"]},{"emoji":"โฟ","aliases":["loop"]},{"emoji":"๐งด","aliases":["lotion_bottle"]},{"emoji":"๐ง","aliases":["lotus_position"]},{"emoji":"๐งโโ๏ธ","aliases":["lotus_position_man"]},{"emoji":"๐งโโ๏ธ","aliases":["lotus_position_woman"]},{"emoji":"๐","aliases":["loud_sound"]},{"emoji":"๐ข","aliases":["loudspeaker"]},{"emoji":"๐ฉ","aliases":["love_hotel"]},{"emoji":"๐","aliases":["love_letter"]},{"emoji":"๐ค","aliases":["love_you_gesture"]},{"emoji":"๐ ","aliases":["low_brightness"]},{"emoji":"๐งณ","aliases":["luggage"]},{"emoji":"๐ฑ๐บ","aliases":["luxembourg"]},{"emoji":"๐คฅ","aliases":["lying_face"]},{"emoji":"โ๏ธ","aliases":["m"]},{"emoji":"๐ฒ๐ด","aliases":["macau"]},{"emoji":"๐ฒ๐ฐ","aliases":["macedonia"]},{"emoji":"๐ฒ๐ฌ","aliases":["madagascar"]},{"emoji":"๐","aliases":["mag"]},{"emoji":"๐","aliases":["mag_right"]},{"emoji":"๐ง","aliases":["mage"]},{"emoji":"๐งโโ๏ธ","aliases":["mage_man"]},{"emoji":"๐งโโ๏ธ","aliases":["mage_woman"]},{"emoji":"๐งฒ","aliases":["magnet"]},{"emoji":"๐","aliases":["mahjong"]},{"emoji":"๐ซ","aliases":["mailbox"]},{"emoji":"๐ช","aliases":["mailbox_closed"]},{"emoji":"๐ฌ","aliases":["mailbox_with_mail"]},{"emoji":"๐ญ","aliases":["mailbox_with_no_mail"]},{"emoji":"๐ฒ๐ผ","aliases":["malawi"]},{"emoji":"๐ฒ๐พ","aliases":["malaysia"]},{"emoji":"๐ฒ๐ป","aliases":["maldives"]},{"emoji":"๐ต๏ธโโ๏ธ","aliases":["male_detective"]},{"emoji":"โ๏ธ","aliases":["male_sign"]},{"emoji":"๐ฒ๐ฑ","aliases":["mali"]},{"emoji":"๐ฒ๐น","aliases":["malta"]},{"emoji":"๐จ","aliases":["man"]},{"emoji":"๐จโ๐จ","aliases":["man_artist"]},{"emoji":"๐จโ๐","aliases":["man_astronaut"]},{"emoji":"๐คธโโ๏ธ","aliases":["man_cartwheeling"]},{"emoji":"๐จโ๐ณ","aliases":["man_cook"]},{"emoji":"๐บ","aliases":["man_dancing"]},{"emoji":"๐คฆโโ๏ธ","aliases":["man_facepalming"]},{"emoji":"๐จโ๐ญ","aliases":["man_factory_worker"]},{"emoji":"๐จโ๐พ","aliases":["man_farmer"]},{"emoji":"๐จโ๐","aliases":["man_firefighter"]},{"emoji":"๐จโโ๏ธ","aliases":["man_health_worker"]},{"emoji":"๐จโ๐ฆฝ","aliases":["man_in_manual_wheelchair"]},{"emoji":"๐จโ๐ฆผ","aliases":["man_in_motorized_wheelchair"]},{"emoji":"๐จโโ๏ธ","aliases":["man_judge"]},{"emoji":"๐คนโโ๏ธ","aliases":["man_juggling"]},{"emoji":"๐จโ๐ง","aliases":["man_mechanic"]},{"emoji":"๐จโ๐ผ","aliases":["man_office_worker"]},{"emoji":"๐จโโ๏ธ","aliases":["man_pilot"]},{"emoji":"๐คพโโ๏ธ","aliases":["man_playing_handball"]},{"emoji":"๐คฝโโ๏ธ","aliases":["man_playing_water_polo"]},{"emoji":"๐จโ๐ฌ","aliases":["man_scientist"]},{"emoji":"๐คทโโ๏ธ","aliases":["man_shrugging"]},{"emoji":"๐จโ๐ค","aliases":["man_singer"]},{"emoji":"๐จโ๐","aliases":["man_student"]},{"emoji":"๐จโ๐ซ","aliases":["man_teacher"]},{"emoji":"๐จโ๐ป","aliases":["man_technologist"]},{"emoji":"๐ฒ","aliases":["man_with_gua_pi_mao"]},{"emoji":"๐จโ๐ฆฏ","aliases":["man_with_probing_cane"]},{"emoji":"๐ณโโ๏ธ","aliases":["man_with_turban"]},{"emoji":"๐ฅญ","aliases":["mango"]},{"emoji":"๐","aliases":["mans_shoe","shoe"]},{"emoji":"๐ฐ๏ธ","aliases":["mantelpiece_clock"]},{"emoji":"๐ฆฝ","aliases":["manual_wheelchair"]},{"emoji":"๐","aliases":["maple_leaf"]},{"emoji":"๐ฒ๐ญ","aliases":["marshall_islands"]},{"emoji":"๐ฅ","aliases":["martial_arts_uniform"]},{"emoji":"๐ฒ๐ถ","aliases":["martinique"]},{"emoji":"๐ท","aliases":["mask"]},{"emoji":"๐","aliases":["massage"]},{"emoji":"๐โโ๏ธ","aliases":["massage_man"]},{"emoji":"๐โโ๏ธ","aliases":["massage_woman"]},{"emoji":"๐ง","aliases":["mate"]},{"emoji":"๐ฒ๐ท","aliases":["mauritania"]},{"emoji":"๐ฒ๐บ","aliases":["mauritius"]},{"emoji":"๐พ๐น","aliases":["mayotte"]},{"emoji":"๐","aliases":["meat_on_bone"]},{"emoji":"๐งโ๐ง","aliases":["mechanic"]},{"emoji":"๐ฆพ","aliases":["mechanical_arm"]},{"emoji":"๐ฆฟ","aliases":["mechanical_leg"]},{"emoji":"๐๏ธ","aliases":["medal_military"]},{"emoji":"๐ ","aliases":["medal_sports"]},{"emoji":"โ๏ธ","aliases":["medical_symbol"]},{"emoji":"๐ฃ","aliases":["mega"]},{"emoji":"๐","aliases":["melon"]},{"emoji":"๐","aliases":["memo","pencil"]},{"emoji":"๐คผโโ๏ธ","aliases":["men_wrestling"]},{"emoji":"๐","aliases":["menorah"]},{"emoji":"๐น","aliases":["mens"]},{"emoji":"๐งโโ๏ธ","aliases":["mermaid"]},{"emoji":"๐งโโ๏ธ","aliases":["merman"]},{"emoji":"๐ง","aliases":["merperson"]},{"emoji":"๐ค","aliases":["metal"]},{"emoji":"๐","aliases":["metro"]},{"emoji":"๐ฒ๐ฝ","aliases":["mexico"]},{"emoji":"๐ฆ ","aliases":["microbe"]},{"emoji":"๐ซ๐ฒ","aliases":["micronesia"]},{"emoji":"๐ค","aliases":["microphone"]},{"emoji":"๐ฌ","aliases":["microscope"]},{"emoji":"๐","aliases":["middle_finger","fu"]},{"emoji":"๐ฅ","aliases":["milk_glass"]},{"emoji":"๐","aliases":["milky_way"]},{"emoji":"๐","aliases":["minibus"]},{"emoji":"๐ฝ","aliases":["minidisc"]},{"emoji":"๐ด","aliases":["mobile_phone_off"]},{"emoji":"๐ฒ๐ฉ","aliases":["moldova"]},{"emoji":"๐ฒ๐จ","aliases":["monaco"]},{"emoji":"๐ค","aliases":["money_mouth_face"]},{"emoji":"๐ธ","aliases":["money_with_wings"]},{"emoji":"๐ฐ","aliases":["moneybag"]},{"emoji":"๐ฒ๐ณ","aliases":["mongolia"]},{"emoji":"๐","aliases":["monkey"]},{"emoji":"๐ต","aliases":["monkey_face"]},{"emoji":"๐ง","aliases":["monocle_face"]},{"emoji":"๐","aliases":["monorail"]},{"emoji":"๐ฒ๐ช","aliases":["montenegro"]},{"emoji":"๐ฒ๐ธ","aliases":["montserrat"]},{"emoji":"๐","aliases":["moon","waxing_gibbous_moon"]},{"emoji":"๐ฅฎ","aliases":["moon_cake"]},{"emoji":"๐ฒ๐ฆ","aliases":["morocco"]},{"emoji":"๐","aliases":["mortar_board"]},{"emoji":"๐","aliases":["mosque"]},{"emoji":"๐ฆ","aliases":["mosquito"]},{"emoji":"๐ฅ๏ธ","aliases":["motor_boat"]},{"emoji":"๐ต","aliases":["motor_scooter"]},{"emoji":"๐๏ธ","aliases":["motorcycle"]},{"emoji":"๐ฆผ","aliases":["motorized_wheelchair"]},{"emoji":"๐ฃ๏ธ","aliases":["motorway"]},{"emoji":"๐ป","aliases":["mount_fuji"]},{"emoji":"โฐ๏ธ","aliases":["mountain"]},{"emoji":"๐ต","aliases":["mountain_bicyclist"]},{"emoji":"๐ตโโ๏ธ","aliases":["mountain_biking_man"]},{"emoji":"๐ตโโ๏ธ","aliases":["mountain_biking_woman"]},{"emoji":"๐ ","aliases":["mountain_cableway"]},{"emoji":"๐","aliases":["mountain_railway"]},{"emoji":"๐๏ธ","aliases":["mountain_snow"]},{"emoji":"๐ญ","aliases":["mouse"]},{"emoji":"๐","aliases":["mouse2"]},{"emoji":"๐ฅ","aliases":["movie_camera"]},{"emoji":"๐ฟ","aliases":["moyai"]},{"emoji":"๐ฒ๐ฟ","aliases":["mozambique"]},{"emoji":"๐คถ","aliases":["mrs_claus"]},{"emoji":"๐ช","aliases":["muscle"]},{"emoji":"๐","aliases":["mushroom"]},{"emoji":"๐น","aliases":["musical_keyboard"]},{"emoji":"๐ต","aliases":["musical_note"]},{"emoji":"๐ผ","aliases":["musical_score"]},{"emoji":"๐","aliases":["mute"]},{"emoji":"๐ฒ๐ฒ","aliases":["myanmar"]},{"emoji":"๐ ","aliases":["nail_care"]},{"emoji":"๐","aliases":["name_badge"]},{"emoji":"๐ณ๐ฆ","aliases":["namibia"]},{"emoji":"๐๏ธ","aliases":["national_park"]},{"emoji":"๐ณ๐ท","aliases":["nauru"]},{"emoji":"๐คข","aliases":["nauseated_face"]},{"emoji":"๐งฟ","aliases":["nazar_amulet"]},{"emoji":"๐","aliases":["necktie"]},{"emoji":"โ","aliases":["negative_squared_cross_mark"]},{"emoji":"๐ณ๐ต","aliases":["nepal"]},{"emoji":"๐ค","aliases":["nerd_face"]},{"emoji":"๐ณ๐ฑ","aliases":["netherlands"]},{"emoji":"๐","aliases":["neutral_face"]},{"emoji":"๐","aliases":["new"]},{"emoji":"๐ณ๐จ","aliases":["new_caledonia"]},{"emoji":"๐","aliases":["new_moon"]},{"emoji":"๐","aliases":["new_moon_with_face"]},{"emoji":"๐ณ๐ฟ","aliases":["new_zealand"]},{"emoji":"๐ฐ","aliases":["newspaper"]},{"emoji":"๐๏ธ","aliases":["newspaper_roll"]},{"emoji":"โญ๏ธ","aliases":["next_track_button"]},{"emoji":"๐","aliases":["ng"]},{"emoji":"๐ณ๐ฎ","aliases":["nicaragua"]},{"emoji":"๐ณ๐ช","aliases":["niger"]},{"emoji":"๐ณ๐ฌ","aliases":["nigeria"]},{"emoji":"๐","aliases":["night_with_stars"]},{"emoji":"9๏ธโฃ","aliases":["nine"]},{"emoji":"๐ณ๐บ","aliases":["niue"]},{"emoji":"๐","aliases":["no_bell"]},{"emoji":"๐ณ","aliases":["no_bicycles"]},{"emoji":"โ","aliases":["no_entry"]},{"emoji":"๐ซ","aliases":["no_entry_sign"]},{"emoji":"๐ ","aliases":["no_good"]},{"emoji":"๐ โโ๏ธ","aliases":["no_good_man","ng_man"]},{"emoji":"๐ โโ๏ธ","aliases":["no_good_woman","ng_woman"]},{"emoji":"๐ต","aliases":["no_mobile_phones"]},{"emoji":"๐ถ","aliases":["no_mouth"]},{"emoji":"๐ท","aliases":["no_pedestrians"]},{"emoji":"๐ญ","aliases":["no_smoking"]},{"emoji":"๐ฑ","aliases":["non-potable_water"]},{"emoji":"๐ณ๐ซ","aliases":["norfolk_island"]},{"emoji":"๐ฐ๐ต","aliases":["north_korea"]},{"emoji":"๐ฒ๐ต","aliases":["northern_mariana_islands"]},{"emoji":"๐ณ๐ด","aliases":["norway"]},{"emoji":"๐","aliases":["nose"]},{"emoji":"๐","aliases":["notebook"]},{"emoji":"๐","aliases":["notebook_with_decorative_cover"]},{"emoji":"๐ถ","aliases":["notes"]},{"emoji":"๐ฉ","aliases":["nut_and_bolt"]},{"emoji":"โญ","aliases":["o"]},{"emoji":"๐ พ๏ธ","aliases":["o2"]},{"emoji":"๐","aliases":["ocean"]},{"emoji":"๐","aliases":["octopus"]},{"emoji":"๐ข","aliases":["oden"]},{"emoji":"๐ข","aliases":["office"]},{"emoji":"๐งโ๐ผ","aliases":["office_worker"]},{"emoji":"๐ข๏ธ","aliases":["oil_drum"]},{"emoji":"๐","aliases":["ok"]},{"emoji":"๐","aliases":["ok_hand"]},{"emoji":"๐โโ๏ธ","aliases":["ok_man"]},{"emoji":"๐","aliases":["ok_person"]},{"emoji":"๐โโ๏ธ","aliases":["ok_woman"]},{"emoji":"๐๏ธ","aliases":["old_key"]},{"emoji":"๐ง","aliases":["older_adult"]},{"emoji":"๐ด","aliases":["older_man"]},{"emoji":"๐ต","aliases":["older_woman"]},{"emoji":"๐๏ธ","aliases":["om"]},{"emoji":"๐ด๐ฒ","aliases":["oman"]},{"emoji":"๐","aliases":["on"]},{"emoji":"๐","aliases":["oncoming_automobile"]},{"emoji":"๐","aliases":["oncoming_bus"]},{"emoji":"๐","aliases":["oncoming_police_car"]},{"emoji":"๐","aliases":["oncoming_taxi"]},{"emoji":"1๏ธโฃ","aliases":["one"]},{"emoji":"๐ฉฑ","aliases":["one_piece_swimsuit"]},{"emoji":"๐ง ","aliases":["onion"]},{"emoji":"๐","aliases":["open_file_folder"]},{"emoji":"๐","aliases":["open_hands"]},{"emoji":"๐ฎ","aliases":["open_mouth"]},{"emoji":"โ๏ธ","aliases":["open_umbrella"]},{"emoji":"โ","aliases":["ophiuchus"]},{"emoji":"๐","aliases":["orange_book"]},{"emoji":"๐ ","aliases":["orange_circle"]},{"emoji":"๐งก","aliases":["orange_heart"]},{"emoji":"๐ง","aliases":["orange_square"]},{"emoji":"๐ฆง","aliases":["orangutan"]},{"emoji":"โฆ๏ธ","aliases":["orthodox_cross"]},{"emoji":"๐ฆฆ","aliases":["otter"]},{"emoji":"๐ค","aliases":["outbox_tray"]},{"emoji":"๐ฆ","aliases":["owl"]},{"emoji":"๐","aliases":["ox"]},{"emoji":"๐ฆช","aliases":["oyster"]},{"emoji":"๐ฆ","aliases":["package"]},{"emoji":"๐","aliases":["page_facing_up"]},{"emoji":"๐","aliases":["page_with_curl"]},{"emoji":"๐","aliases":["pager"]},{"emoji":"๐๏ธ","aliases":["paintbrush"]},{"emoji":"๐ต๐ฐ","aliases":["pakistan"]},{"emoji":"๐ต๐ผ","aliases":["palau"]},{"emoji":"๐ต๐ธ","aliases":["palestinian_territories"]},{"emoji":"๐ด","aliases":["palm_tree"]},{"emoji":"๐คฒ","aliases":["palms_up_together"]},{"emoji":"๐ต๐ฆ","aliases":["panama"]},{"emoji":"๐ฅ","aliases":["pancakes"]},{"emoji":"๐ผ","aliases":["panda_face"]},{"emoji":"๐","aliases":["paperclip"]},{"emoji":"๐๏ธ","aliases":["paperclips"]},{"emoji":"๐ต๐ฌ","aliases":["papua_new_guinea"]},{"emoji":"๐ช","aliases":["parachute"]},{"emoji":"๐ต๐พ","aliases":["paraguay"]},{"emoji":"โฑ๏ธ","aliases":["parasol_on_ground"]},{"emoji":"๐ ฟ๏ธ","aliases":["parking"]},{"emoji":"๐ฆ","aliases":["parrot"]},{"emoji":"ใฝ๏ธ","aliases":["part_alternation_mark"]},{"emoji":"โ ","aliases":["partly_sunny"]},{"emoji":"๐ฅณ","aliases":["partying_face"]},{"emoji":"๐ณ๏ธ","aliases":["passenger_ship"]},{"emoji":"๐","aliases":["passport_control"]},{"emoji":"โธ๏ธ","aliases":["pause_button"]},{"emoji":"โฎ๏ธ","aliases":["peace_symbol"]},{"emoji":"๐","aliases":["peach"]},{"emoji":"๐ฆ","aliases":["peacock"]},{"emoji":"๐ฅ","aliases":["peanuts"]},{"emoji":"๐","aliases":["pear"]},{"emoji":"๐๏ธ","aliases":["pen"]},{"emoji":"โ๏ธ","aliases":["pencil2"]},{"emoji":"๐ง","aliases":["penguin"]},{"emoji":"๐","aliases":["pensive"]},{"emoji":"๐งโ๐คโ๐ง","aliases":["people_holding_hands"]},{"emoji":"๐ญ","aliases":["performing_arts"]},{"emoji":"๐ฃ","aliases":["persevere"]},{"emoji":"๐งโ๐ฆฒ","aliases":["person_bald"]},{"emoji":"๐งโ๐ฆฑ","aliases":["person_curly_hair"]},{"emoji":"๐คบ","aliases":["person_fencing"]},{"emoji":"๐งโ๐ฆฝ","aliases":["person_in_manual_wheelchair"]},{"emoji":"๐งโ๐ฆผ","aliases":["person_in_motorized_wheelchair"]},{"emoji":"๐คต","aliases":["person_in_tuxedo"]},{"emoji":"๐งโ๐ฆฐ","aliases":["person_red_hair"]},{"emoji":"๐งโ๐ฆณ","aliases":["person_white_hair"]},{"emoji":"๐งโ๐ฆฏ","aliases":["person_with_probing_cane"]},{"emoji":"๐ณ","aliases":["person_with_turban"]},{"emoji":"๐ฐ","aliases":["person_with_veil"]},{"emoji":"๐ต๐ช","aliases":["peru"]},{"emoji":"๐งซ","aliases":["petri_dish"]},{"emoji":"๐ต๐ญ","aliases":["philippines"]},{"emoji":"โ๏ธ","aliases":["phone","telephone"]},{"emoji":"โ๏ธ","aliases":["pick"]},{"emoji":"๐ฅง","aliases":["pie"]},{"emoji":"๐ท","aliases":["pig"]},{"emoji":"๐","aliases":["pig2"]},{"emoji":"๐ฝ","aliases":["pig_nose"]},{"emoji":"๐","aliases":["pill"]},{"emoji":"๐งโโ๏ธ","aliases":["pilot"]},{"emoji":"๐ค","aliases":["pinching_hand"]},{"emoji":"๐","aliases":["pineapple"]},{"emoji":"๐","aliases":["ping_pong"]},{"emoji":"๐ดโโ ๏ธ","aliases":["pirate_flag"]},{"emoji":"โ","aliases":["pisces"]},{"emoji":"๐ต๐ณ","aliases":["pitcairn_islands"]},{"emoji":"๐","aliases":["pizza"]},{"emoji":"๐","aliases":["place_of_worship"]},{"emoji":"๐ฝ๏ธ","aliases":["plate_with_cutlery"]},{"emoji":"โฏ๏ธ","aliases":["play_or_pause_button"]},{"emoji":"๐ฅบ","aliases":["pleading_face"]},{"emoji":"๐","aliases":["point_down"]},{"emoji":"๐","aliases":["point_left"]},{"emoji":"๐","aliases":["point_right"]},{"emoji":"โ๏ธ","aliases":["point_up"]},{"emoji":"๐","aliases":["point_up_2"]},{"emoji":"๐ต๐ฑ","aliases":["poland"]},{"emoji":"๐","aliases":["police_car"]},{"emoji":"๐ฎ","aliases":["police_officer","cop"]},{"emoji":"๐ฎโโ๏ธ","aliases":["policeman"]},{"emoji":"๐ฎโโ๏ธ","aliases":["policewoman"]},{"emoji":"๐ฉ","aliases":["poodle"]},{"emoji":"๐ฟ","aliases":["popcorn"]},{"emoji":"๐ต๐น","aliases":["portugal"]},{"emoji":"๐ฃ","aliases":["post_office"]},{"emoji":"๐ฏ","aliases":["postal_horn"]},{"emoji":"๐ฎ","aliases":["postbox"]},{"emoji":"๐ฐ","aliases":["potable_water"]},{"emoji":"๐ฅ","aliases":["potato"]},{"emoji":"๐","aliases":["pouch"]},{"emoji":"๐","aliases":["poultry_leg"]},{"emoji":"๐ท","aliases":["pound"]},{"emoji":"๐พ","aliases":["pouting_cat"]},{"emoji":"๐","aliases":["pouting_face"]},{"emoji":"๐โโ๏ธ","aliases":["pouting_man"]},{"emoji":"๐โโ๏ธ","aliases":["pouting_woman"]},{"emoji":"๐","aliases":["pray"]},{"emoji":"๐ฟ","aliases":["prayer_beads"]},{"emoji":"๐คฐ","aliases":["pregnant_woman"]},{"emoji":"๐ฅจ","aliases":["pretzel"]},{"emoji":"โฎ๏ธ","aliases":["previous_track_button"]},{"emoji":"๐คด","aliases":["prince"]},{"emoji":"๐ธ","aliases":["princess"]},{"emoji":"๐จ๏ธ","aliases":["printer"]},{"emoji":"๐ฆฏ","aliases":["probing_cane"]},{"emoji":"๐ต๐ท","aliases":["puerto_rico"]},{"emoji":"๐ฃ","aliases":["purple_circle"]},{"emoji":"๐","aliases":["purple_heart"]},{"emoji":"๐ช","aliases":["purple_square"]},{"emoji":"๐","aliases":["purse"]},{"emoji":"๐","aliases":["pushpin"]},{"emoji":"๐ฎ","aliases":["put_litter_in_its_place"]},{"emoji":"๐ถ๐ฆ","aliases":["qatar"]},{"emoji":"โ","aliases":["question"]},{"emoji":"๐ฐ","aliases":["rabbit"]},{"emoji":"๐","aliases":["rabbit2"]},{"emoji":"๐ฆ","aliases":["raccoon"]},{"emoji":"๐","aliases":["racehorse"]},{"emoji":"๐๏ธ","aliases":["racing_car"]},{"emoji":"๐ป","aliases":["radio"]},{"emoji":"๐","aliases":["radio_button"]},{"emoji":"โข๏ธ","aliases":["radioactive"]},{"emoji":"๐ก","aliases":["rage","pout"]},{"emoji":"๐","aliases":["railway_car"]},{"emoji":"๐ค๏ธ","aliases":["railway_track"]},{"emoji":"๐","aliases":["rainbow"]},{"emoji":"๐ณ๏ธโ๐","aliases":["rainbow_flag"]},{"emoji":"๐ค","aliases":["raised_back_of_hand"]},{"emoji":"๐คจ","aliases":["raised_eyebrow"]},{"emoji":"๐๏ธ","aliases":["raised_hand_with_fingers_splayed"]},{"emoji":"๐","aliases":["raised_hands"]},{"emoji":"๐","aliases":["raising_hand"]},{"emoji":"๐โโ๏ธ","aliases":["raising_hand_man"]},{"emoji":"๐โโ๏ธ","aliases":["raising_hand_woman"]},{"emoji":"๐","aliases":["ram"]},{"emoji":"๐","aliases":["ramen"]},{"emoji":"๐","aliases":["rat"]},{"emoji":"๐ช","aliases":["razor"]},{"emoji":"๐งพ","aliases":["receipt"]},{"emoji":"โบ๏ธ","aliases":["record_button"]},{"emoji":"โป๏ธ","aliases":["recycle"]},{"emoji":"๐ด","aliases":["red_circle"]},{"emoji":"๐งง","aliases":["red_envelope"]},{"emoji":"๐จโ๐ฆฐ","aliases":["red_haired_man"]},{"emoji":"๐ฉโ๐ฆฐ","aliases":["red_haired_woman"]},{"emoji":"๐ฅ","aliases":["red_square"]},{"emoji":"ยฎ๏ธ","aliases":["registered"]},{"emoji":"โบ๏ธ","aliases":["relaxed"]},{"emoji":"๐","aliases":["relieved"]},{"emoji":"๐๏ธ","aliases":["reminder_ribbon"]},{"emoji":"๐","aliases":["repeat"]},{"emoji":"๐","aliases":["repeat_one"]},{"emoji":"โ๏ธ","aliases":["rescue_worker_helmet"]},{"emoji":"๐ป","aliases":["restroom"]},{"emoji":"๐ท๐ช","aliases":["reunion"]},{"emoji":"๐","aliases":["revolving_hearts"]},{"emoji":"โช","aliases":["rewind"]},{"emoji":"๐ฆ","aliases":["rhinoceros"]},{"emoji":"๐","aliases":["ribbon"]},{"emoji":"๐","aliases":["rice"]},{"emoji":"๐","aliases":["rice_ball"]},{"emoji":"๐","aliases":["rice_cracker"]},{"emoji":"๐","aliases":["rice_scene"]},{"emoji":"๐ฏ๏ธ","aliases":["right_anger_bubble"]},{"emoji":"๐","aliases":["ring"]},{"emoji":"๐ช","aliases":["ringed_planet"]},{"emoji":"๐ค","aliases":["robot"]},{"emoji":"๐","aliases":["rocket"]},{"emoji":"๐คฃ","aliases":["rofl"]},{"emoji":"๐","aliases":["roll_eyes"]},{"emoji":"๐งป","aliases":["roll_of_paper"]},{"emoji":"๐ข","aliases":["roller_coaster"]},{"emoji":"๐ท๐ด","aliases":["romania"]},{"emoji":"๐","aliases":["rooster"]},{"emoji":"๐น","aliases":["rose"]},{"emoji":"๐ต๏ธ","aliases":["rosette"]},{"emoji":"๐จ","aliases":["rotating_light"]},{"emoji":"๐","aliases":["round_pushpin"]},{"emoji":"๐ฃ","aliases":["rowboat"]},{"emoji":"๐ฃโโ๏ธ","aliases":["rowing_man"]},{"emoji":"๐ฃโโ๏ธ","aliases":["rowing_woman"]},{"emoji":"๐ท๐บ","aliases":["ru"]},{"emoji":"๐","aliases":["rugby_football"]},{"emoji":"๐","aliases":["runner","running"]},{"emoji":"๐โโ๏ธ","aliases":["running_man"]},{"emoji":"๐ฝ","aliases":["running_shirt_with_sash"]},{"emoji":"๐โโ๏ธ","aliases":["running_woman"]},{"emoji":"๐ท๐ผ","aliases":["rwanda"]},{"emoji":"๐๏ธ","aliases":["sa"]},{"emoji":"๐งท","aliases":["safety_pin"]},{"emoji":"๐ฆบ","aliases":["safety_vest"]},{"emoji":"โ","aliases":["sagittarius"]},{"emoji":"๐ถ","aliases":["sake"]},{"emoji":"๐ง","aliases":["salt"]},{"emoji":"๐ผ๐ธ","aliases":["samoa"]},{"emoji":"๐ธ๐ฒ","aliases":["san_marino"]},{"emoji":"๐ก","aliases":["sandal"]},{"emoji":"๐ฅช","aliases":["sandwich"]},{"emoji":"๐ ","aliases":["santa"]},{"emoji":"๐ธ๐น","aliases":["sao_tome_principe"]},{"emoji":"๐ฅป","aliases":["sari"]},{"emoji":"๐ก","aliases":["satellite"]},{"emoji":"๐ธ๐ฆ","aliases":["saudi_arabia"]},{"emoji":"๐งโโ๏ธ","aliases":["sauna_man"]},{"emoji":"๐ง","aliases":["sauna_person"]},{"emoji":"๐งโโ๏ธ","aliases":["sauna_woman"]},{"emoji":"๐ฆ","aliases":["sauropod"]},{"emoji":"๐ท","aliases":["saxophone"]},{"emoji":"๐งฃ","aliases":["scarf"]},{"emoji":"๐ซ","aliases":["school"]},{"emoji":"๐","aliases":["school_satchel"]},{"emoji":"๐งโ๐ฌ","aliases":["scientist"]},{"emoji":"โ๏ธ","aliases":["scissors"]},{"emoji":"๐ฆ","aliases":["scorpion"]},{"emoji":"โ","aliases":["scorpius"]},{"emoji":"๐ด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ","aliases":["scotland"]},{"emoji":"๐ฑ","aliases":["scream"]},{"emoji":"๐","aliases":["scream_cat"]},{"emoji":"๐","aliases":["scroll"]},{"emoji":"๐บ","aliases":["seat"]},{"emoji":"ใ๏ธ","aliases":["secret"]},{"emoji":"๐","aliases":["see_no_evil"]},{"emoji":"๐ฑ","aliases":["seedling"]},{"emoji":"๐คณ","aliases":["selfie"]},{"emoji":"๐ธ๐ณ","aliases":["senegal"]},{"emoji":"๐ท๐ธ","aliases":["serbia"]},{"emoji":"๐โ๐ฆบ","aliases":["service_dog"]},{"emoji":"7๏ธโฃ","aliases":["seven"]},{"emoji":"๐ธ๐จ","aliases":["seychelles"]},{"emoji":"๐ฅ","aliases":["shallow_pan_of_food"]},{"emoji":"โ๏ธ","aliases":["shamrock"]},{"emoji":"๐ฆ","aliases":["shark"]},{"emoji":"๐ง","aliases":["shaved_ice"]},{"emoji":"๐","aliases":["sheep"]},{"emoji":"๐","aliases":["shell"]},{"emoji":"๐ก๏ธ","aliases":["shield"]},{"emoji":"โฉ๏ธ","aliases":["shinto_shrine"]},{"emoji":"๐ข","aliases":["ship"]},{"emoji":"๐","aliases":["shirt","tshirt"]},{"emoji":"๐๏ธ","aliases":["shopping"]},{"emoji":"๐","aliases":["shopping_cart"]},{"emoji":"๐ฉณ","aliases":["shorts"]},{"emoji":"๐ฟ","aliases":["shower"]},{"emoji":"๐ฆ","aliases":["shrimp"]},{"emoji":"๐คท","aliases":["shrug"]},{"emoji":"๐คซ","aliases":["shushing_face"]},{"emoji":"๐ธ๐ฑ","aliases":["sierra_leone"]},{"emoji":"๐ถ","aliases":["signal_strength"]},{"emoji":"๐ธ๐ฌ","aliases":["singapore"]},{"emoji":"๐งโ๐ค","aliases":["singer"]},{"emoji":"๐ธ๐ฝ","aliases":["sint_maarten"]},{"emoji":"6๏ธโฃ","aliases":["six"]},{"emoji":"๐ฏ","aliases":["six_pointed_star"]},{"emoji":"๐น","aliases":["skateboard"]},{"emoji":"๐ฟ","aliases":["ski"]},{"emoji":"โท๏ธ","aliases":["skier"]},{"emoji":"๐","aliases":["skull"]},{"emoji":"โ ๏ธ","aliases":["skull_and_crossbones"]},{"emoji":"๐ฆจ","aliases":["skunk"]},{"emoji":"๐ท","aliases":["sled"]},{"emoji":"๐ด","aliases":["sleeping"]},{"emoji":"๐","aliases":["sleeping_bed"]},{"emoji":"๐ช","aliases":["sleepy"]},{"emoji":"๐","aliases":["slightly_frowning_face"]},{"emoji":"๐","aliases":["slightly_smiling_face"]},{"emoji":"๐ฐ","aliases":["slot_machine"]},{"emoji":"๐ฆฅ","aliases":["sloth"]},{"emoji":"๐ธ๐ฐ","aliases":["slovakia"]},{"emoji":"๐ธ๐ฎ","aliases":["slovenia"]},{"emoji":"๐ฉ๏ธ","aliases":["small_airplane"]},{"emoji":"๐น","aliases":["small_blue_diamond"]},{"emoji":"๐ธ","aliases":["small_orange_diamond"]},{"emoji":"๐บ","aliases":["small_red_triangle"]},{"emoji":"๐ป","aliases":["small_red_triangle_down"]},{"emoji":"๐","aliases":["smile"]},{"emoji":"๐ธ","aliases":["smile_cat"]},{"emoji":"๐","aliases":["smiley"]},{"emoji":"๐บ","aliases":["smiley_cat"]},{"emoji":"๐ฅฐ","aliases":["smiling_face_with_three_hearts"]},{"emoji":"๐","aliases":["smiling_imp"]},{"emoji":"๐","aliases":["smirk"]},{"emoji":"๐ผ","aliases":["smirk_cat"]},{"emoji":"๐ฌ","aliases":["smoking"]},{"emoji":"๐","aliases":["snail"]},{"emoji":"๐","aliases":["snake"]},{"emoji":"๐คง","aliases":["sneezing_face"]},{"emoji":"๐","aliases":["snowboarder"]},{"emoji":"โ๏ธ","aliases":["snowflake"]},{"emoji":"โ","aliases":["snowman"]},{"emoji":"โ๏ธ","aliases":["snowman_with_snow"]},{"emoji":"๐งผ","aliases":["soap"]},{"emoji":"๐ญ","aliases":["sob"]},{"emoji":"โฝ","aliases":["soccer"]},{"emoji":"๐งฆ","aliases":["socks"]},{"emoji":"๐ฅ","aliases":["softball"]},{"emoji":"๐ธ๐ง","aliases":["solomon_islands"]},{"emoji":"๐ธ๐ด","aliases":["somalia"]},{"emoji":"๐","aliases":["soon"]},{"emoji":"๐","aliases":["sos"]},{"emoji":"๐","aliases":["sound"]},{"emoji":"๐ฟ๐ฆ","aliases":["south_africa"]},{"emoji":"๐ฌ๐ธ","aliases":["south_georgia_south_sandwich_islands"]},{"emoji":"๐ธ๐ธ","aliases":["south_sudan"]},{"emoji":"๐พ","aliases":["space_invader"]},{"emoji":"โ ๏ธ","aliases":["spades"]},{"emoji":"๐","aliases":["spaghetti"]},{"emoji":"โ๏ธ","aliases":["sparkle"]},{"emoji":"๐","aliases":["sparkler"]},{"emoji":"โจ","aliases":["sparkles"]},{"emoji":"๐","aliases":["sparkling_heart"]},{"emoji":"๐","aliases":["speak_no_evil"]},{"emoji":"๐","aliases":["speaker"]},{"emoji":"๐ฃ๏ธ","aliases":["speaking_head"]},{"emoji":"๐ฌ","aliases":["speech_balloon"]},{"emoji":"๐ค","aliases":["speedboat"]},{"emoji":"๐ท๏ธ","aliases":["spider"]},{"emoji":"๐ธ๏ธ","aliases":["spider_web"]},{"emoji":"๐๏ธ","aliases":["spiral_calendar"]},{"emoji":"๐๏ธ","aliases":["spiral_notepad"]},{"emoji":"๐งฝ","aliases":["sponge"]},{"emoji":"๐ฅ","aliases":["spoon"]},{"emoji":"๐ฆ","aliases":["squid"]},{"emoji":"๐ฑ๐ฐ","aliases":["sri_lanka"]},{"emoji":"๐ง๐ฑ","aliases":["st_barthelemy"]},{"emoji":"๐ธ๐ญ","aliases":["st_helena"]},{"emoji":"๐ฐ๐ณ","aliases":["st_kitts_nevis"]},{"emoji":"๐ฑ๐จ","aliases":["st_lucia"]},{"emoji":"๐ฒ๐ซ","aliases":["st_martin"]},{"emoji":"๐ต๐ฒ","aliases":["st_pierre_miquelon"]},{"emoji":"๐ป๐จ","aliases":["st_vincent_grenadines"]},{"emoji":"๐๏ธ","aliases":["stadium"]},{"emoji":"๐งโโ๏ธ","aliases":["standing_man"]},{"emoji":"๐ง","aliases":["standing_person"]},{"emoji":"๐งโโ๏ธ","aliases":["standing_woman"]},{"emoji":"โญ","aliases":["star"]},{"emoji":"๐","aliases":["star2"]},{"emoji":"โช๏ธ","aliases":["star_and_crescent"]},{"emoji":"โก๏ธ","aliases":["star_of_david"]},{"emoji":"๐คฉ","aliases":["star_struck"]},{"emoji":"๐ ","aliases":["stars"]},{"emoji":"๐","aliases":["station"]},{"emoji":"๐ฝ","aliases":["statue_of_liberty"]},{"emoji":"๐","aliases":["steam_locomotive"]},{"emoji":"๐ฉบ","aliases":["stethoscope"]},{"emoji":"๐ฒ","aliases":["stew"]},{"emoji":"โน๏ธ","aliases":["stop_button"]},{"emoji":"๐","aliases":["stop_sign"]},{"emoji":"โฑ๏ธ","aliases":["stopwatch"]},{"emoji":"๐","aliases":["straight_ruler"]},{"emoji":"๐","aliases":["strawberry"]},{"emoji":"๐","aliases":["stuck_out_tongue"]},{"emoji":"๐","aliases":["stuck_out_tongue_closed_eyes"]},{"emoji":"๐","aliases":["stuck_out_tongue_winking_eye"]},{"emoji":"๐งโ๐","aliases":["student"]},{"emoji":"๐๏ธ","aliases":["studio_microphone"]},{"emoji":"๐ฅ","aliases":["stuffed_flatbread"]},{"emoji":"๐ธ๐ฉ","aliases":["sudan"]},{"emoji":"๐ฅ๏ธ","aliases":["sun_behind_large_cloud"]},{"emoji":"๐ฆ๏ธ","aliases":["sun_behind_rain_cloud"]},{"emoji":"๐ค๏ธ","aliases":["sun_behind_small_cloud"]},{"emoji":"๐","aliases":["sun_with_face"]},{"emoji":"๐ป","aliases":["sunflower"]},{"emoji":"๐","aliases":["sunglasses"]},{"emoji":"โ๏ธ","aliases":["sunny"]},{"emoji":"๐ ","aliases":["sunrise"]},{"emoji":"๐","aliases":["sunrise_over_mountains"]},{"emoji":"๐ฆธ","aliases":["superhero"]},{"emoji":"๐ฆธโโ๏ธ","aliases":["superhero_man"]},{"emoji":"๐ฆธโโ๏ธ","aliases":["superhero_woman"]},{"emoji":"๐ฆน","aliases":["supervillain"]},{"emoji":"๐ฆนโโ๏ธ","aliases":["supervillain_man"]},{"emoji":"๐ฆนโโ๏ธ","aliases":["supervillain_woman"]},{"emoji":"๐","aliases":["surfer"]},{"emoji":"๐โโ๏ธ","aliases":["surfing_man"]},{"emoji":"๐โโ๏ธ","aliases":["surfing_woman"]},{"emoji":"๐ธ๐ท","aliases":["suriname"]},{"emoji":"๐ฃ","aliases":["sushi"]},{"emoji":"๐","aliases":["suspension_railway"]},{"emoji":"๐ธ๐ฏ","aliases":["svalbard_jan_mayen"]},{"emoji":"๐ฆข","aliases":["swan"]},{"emoji":"๐ธ๐ฟ","aliases":["swaziland"]},{"emoji":"๐","aliases":["sweat"]},{"emoji":"๐ฆ","aliases":["sweat_drops"]},{"emoji":"๐ ","aliases":["sweat_smile"]},{"emoji":"๐ธ๐ช","aliases":["sweden"]},{"emoji":"๐ ","aliases":["sweet_potato"]},{"emoji":"๐ฉฒ","aliases":["swim_brief"]},{"emoji":"๐","aliases":["swimmer"]},{"emoji":"๐โโ๏ธ","aliases":["swimming_man"]},{"emoji":"๐โโ๏ธ","aliases":["swimming_woman"]},{"emoji":"๐จ๐ญ","aliases":["switzerland"]},{"emoji":"๐ฃ","aliases":["symbols"]},{"emoji":"๐","aliases":["synagogue"]},{"emoji":"๐ธ๐พ","aliases":["syria"]},{"emoji":"๐","aliases":["syringe"]},{"emoji":"๐ฆ","aliases":["t-rex"]},{"emoji":"๐ฎ","aliases":["taco"]},{"emoji":"๐","aliases":["tada","hooray"]},{"emoji":"๐น๐ผ","aliases":["taiwan"]},{"emoji":"๐น๐ฏ","aliases":["tajikistan"]},{"emoji":"๐ฅก","aliases":["takeout_box"]},{"emoji":"๐","aliases":["tanabata_tree"]},{"emoji":"๐","aliases":["tangerine","orange","mandarin"]},{"emoji":"๐น๐ฟ","aliases":["tanzania"]},{"emoji":"โ","aliases":["taurus"]},{"emoji":"๐","aliases":["taxi"]},{"emoji":"๐ต","aliases":["tea"]},{"emoji":"๐งโ๐ซ","aliases":["teacher"]},{"emoji":"๐งโ๐ป","aliases":["technologist"]},{"emoji":"๐งธ","aliases":["teddy_bear"]},{"emoji":"๐","aliases":["telephone_receiver"]},{"emoji":"๐ญ","aliases":["telescope"]},{"emoji":"๐พ","aliases":["tennis"]},{"emoji":"โบ","aliases":["tent"]},{"emoji":"๐งช","aliases":["test_tube"]},{"emoji":"๐น๐ญ","aliases":["thailand"]},{"emoji":"๐ก๏ธ","aliases":["thermometer"]},{"emoji":"๐ค","aliases":["thinking"]},{"emoji":"๐ญ","aliases":["thought_balloon"]},{"emoji":"๐งต","aliases":["thread"]},{"emoji":"3๏ธโฃ","aliases":["three"]},{"emoji":"๐ซ","aliases":["ticket"]},{"emoji":"๐๏ธ","aliases":["tickets"]},{"emoji":"๐ฏ","aliases":["tiger"]},{"emoji":"๐ ","aliases":["tiger2"]},{"emoji":"โฒ๏ธ","aliases":["timer_clock"]},{"emoji":"๐น๐ฑ","aliases":["timor_leste"]},{"emoji":"๐โโ๏ธ","aliases":["tipping_hand_man","sassy_man"]},{"emoji":"๐","aliases":["tipping_hand_person","information_desk_person"]},{"emoji":"๐โโ๏ธ","aliases":["tipping_hand_woman","sassy_woman"]},{"emoji":"๐ซ","aliases":["tired_face"]},{"emoji":"โข๏ธ","aliases":["tm"]},{"emoji":"๐น๐ฌ","aliases":["togo"]},{"emoji":"๐ฝ","aliases":["toilet"]},{"emoji":"๐น๐ฐ","aliases":["tokelau"]},{"emoji":"๐ผ","aliases":["tokyo_tower"]},{"emoji":"๐ ","aliases":["tomato"]},{"emoji":"๐น๐ด","aliases":["tonga"]},{"emoji":"๐ ","aliases":["tongue"]},{"emoji":"๐งฐ","aliases":["toolbox"]},{"emoji":"๐ฆท","aliases":["tooth"]},{"emoji":"๐","aliases":["top"]},{"emoji":"๐ฉ","aliases":["tophat"]},{"emoji":"๐ช๏ธ","aliases":["tornado"]},{"emoji":"๐น๐ท","aliases":["tr"]},{"emoji":"๐ฒ๏ธ","aliases":["trackball"]},{"emoji":"๐","aliases":["tractor"]},{"emoji":"๐ฅ","aliases":["traffic_light"]},{"emoji":"๐","aliases":["train"]},{"emoji":"๐","aliases":["train2"]},{"emoji":"๐","aliases":["tram"]},{"emoji":"๐ฉ","aliases":["triangular_flag_on_post"]},{"emoji":"๐","aliases":["triangular_ruler"]},{"emoji":"๐ฑ","aliases":["trident"]},{"emoji":"๐น๐น","aliases":["trinidad_tobago"]},{"emoji":"๐น๐ฆ","aliases":["tristan_da_cunha"]},{"emoji":"๐ค","aliases":["triumph"]},{"emoji":"๐","aliases":["trolleybus"]},{"emoji":"๐","aliases":["trophy"]},{"emoji":"๐น","aliases":["tropical_drink"]},{"emoji":"๐ ","aliases":["tropical_fish"]},{"emoji":"๐","aliases":["truck"]},{"emoji":"๐บ","aliases":["trumpet"]},{"emoji":"๐ท","aliases":["tulip"]},{"emoji":"๐ฅ","aliases":["tumbler_glass"]},{"emoji":"๐น๐ณ","aliases":["tunisia"]},{"emoji":"๐ฆ","aliases":["turkey"]},{"emoji":"๐น๐ฒ","aliases":["turkmenistan"]},{"emoji":"๐น๐จ","aliases":["turks_caicos_islands"]},{"emoji":"๐ข","aliases":["turtle"]},{"emoji":"๐น๐ป","aliases":["tuvalu"]},{"emoji":"๐บ","aliases":["tv"]},{"emoji":"๐","aliases":["twisted_rightwards_arrows"]},{"emoji":"2๏ธโฃ","aliases":["two"]},{"emoji":"๐","aliases":["two_hearts"]},{"emoji":"๐ฌ","aliases":["two_men_holding_hands"]},{"emoji":"๐ญ","aliases":["two_women_holding_hands"]},{"emoji":"๐น","aliases":["u5272"]},{"emoji":"๐ด","aliases":["u5408"]},{"emoji":"๐บ","aliases":["u55b6"]},{"emoji":"๐ฏ","aliases":["u6307"]},{"emoji":"๐ท๏ธ","aliases":["u6708"]},{"emoji":"๐ถ","aliases":["u6709"]},{"emoji":"๐ต","aliases":["u6e80"]},{"emoji":"๐","aliases":["u7121"]},{"emoji":"๐ธ","aliases":["u7533"]},{"emoji":"๐ฒ","aliases":["u7981"]},{"emoji":"๐ณ","aliases":["u7a7a"]},{"emoji":"๐บ๐ฌ","aliases":["uganda"]},{"emoji":"๐บ๐ฆ","aliases":["ukraine"]},{"emoji":"โ","aliases":["umbrella"]},{"emoji":"๐","aliases":["unamused"]},{"emoji":"๐","aliases":["underage"]},{"emoji":"๐ฆ","aliases":["unicorn"]},{"emoji":"๐ฆ๐ช","aliases":["united_arab_emirates"]},{"emoji":"๐บ๐ณ","aliases":["united_nations"]},{"emoji":"๐","aliases":["unlock"]},{"emoji":"๐","aliases":["up"]},{"emoji":"๐","aliases":["upside_down_face"]},{"emoji":"๐บ๐พ","aliases":["uruguay"]},{"emoji":"๐บ๐ธ","aliases":["us"]},{"emoji":"๐บ๐ฒ","aliases":["us_outlying_islands"]},{"emoji":"๐ป๐ฎ","aliases":["us_virgin_islands"]},{"emoji":"๐บ๐ฟ","aliases":["uzbekistan"]},{"emoji":"โ๏ธ","aliases":["v"]},{"emoji":"๐ง","aliases":["vampire"]},{"emoji":"๐งโโ๏ธ","aliases":["vampire_man"]},{"emoji":"๐งโโ๏ธ","aliases":["vampire_woman"]},{"emoji":"๐ป๐บ","aliases":["vanuatu"]},{"emoji":"๐ป๐ฆ","aliases":["vatican_city"]},{"emoji":"๐ป๐ช","aliases":["venezuela"]},{"emoji":"๐ฆ","aliases":["vertical_traffic_light"]},{"emoji":"๐ผ","aliases":["vhs"]},{"emoji":"๐ณ","aliases":["vibration_mode"]},{"emoji":"๐น","aliases":["video_camera"]},{"emoji":"๐ฎ","aliases":["video_game"]},{"emoji":"๐ป๐ณ","aliases":["vietnam"]},{"emoji":"๐ป","aliases":["violin"]},{"emoji":"โ","aliases":["virgo"]},{"emoji":"๐","aliases":["volcano"]},{"emoji":"๐","aliases":["volleyball"]},{"emoji":"๐คฎ","aliases":["vomiting_face"]},{"emoji":"๐","aliases":["vs"]},{"emoji":"๐","aliases":["vulcan_salute"]},{"emoji":"๐ง","aliases":["waffle"]},{"emoji":"๐ด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ","aliases":["wales"]},{"emoji":"๐ถ","aliases":["walking"]},{"emoji":"๐ถโโ๏ธ","aliases":["walking_man"]},{"emoji":"๐ถโโ๏ธ","aliases":["walking_woman"]},{"emoji":"๐ผ๐ซ","aliases":["wallis_futuna"]},{"emoji":"๐","aliases":["waning_crescent_moon"]},{"emoji":"๐","aliases":["waning_gibbous_moon"]},{"emoji":"โ ๏ธ","aliases":["warning"]},{"emoji":"๐๏ธ","aliases":["wastebasket"]},{"emoji":"โ","aliases":["watch"]},{"emoji":"๐","aliases":["water_buffalo"]},{"emoji":"๐คฝ","aliases":["water_polo"]},{"emoji":"๐","aliases":["watermelon"]},{"emoji":"๐","aliases":["wave"]},{"emoji":"ใฐ๏ธ","aliases":["wavy_dash"]},{"emoji":"๐","aliases":["waxing_crescent_moon"]},{"emoji":"๐พ","aliases":["wc"]},{"emoji":"๐ฉ","aliases":["weary"]},{"emoji":"๐","aliases":["wedding"]},{"emoji":"๐๏ธ","aliases":["weight_lifting"]},{"emoji":"๐๏ธโโ๏ธ","aliases":["weight_lifting_man"]},{"emoji":"๐๏ธโโ๏ธ","aliases":["weight_lifting_woman"]},{"emoji":"๐ช๐ญ","aliases":["western_sahara"]},{"emoji":"๐ณ","aliases":["whale"]},{"emoji":"๐","aliases":["whale2"]},{"emoji":"โธ๏ธ","aliases":["wheel_of_dharma"]},{"emoji":"โฟ","aliases":["wheelchair"]},{"emoji":"โ ","aliases":["white_check_mark"]},{"emoji":"โช","aliases":["white_circle"]},{"emoji":"๐ณ๏ธ","aliases":["white_flag"]},{"emoji":"๐ฎ","aliases":["white_flower"]},{"emoji":"๐จโ๐ฆณ","aliases":["white_haired_man"]},{"emoji":"๐ฉโ๐ฆณ","aliases":["white_haired_woman"]},{"emoji":"๐ค","aliases":["white_heart"]},{"emoji":"โฌ","aliases":["white_large_square"]},{"emoji":"โฝ","aliases":["white_medium_small_square"]},{"emoji":"โป๏ธ","aliases":["white_medium_square"]},{"emoji":"โซ๏ธ","aliases":["white_small_square"]},{"emoji":"๐ณ","aliases":["white_square_button"]},{"emoji":"๐ฅ","aliases":["wilted_flower"]},{"emoji":"๐","aliases":["wind_chime"]},{"emoji":"๐ฌ๏ธ","aliases":["wind_face"]},{"emoji":"๐ท","aliases":["wine_glass"]},{"emoji":"๐","aliases":["wink"]},{"emoji":"๐บ","aliases":["wolf"]},{"emoji":"๐ฉ","aliases":["woman"]},{"emoji":"๐ฉโ๐จ","aliases":["woman_artist"]},{"emoji":"๐ฉโ๐","aliases":["woman_astronaut"]},{"emoji":"๐คธโโ๏ธ","aliases":["woman_cartwheeling"]},{"emoji":"๐ฉโ๐ณ","aliases":["woman_cook"]},{"emoji":"๐","aliases":["woman_dancing","dancer"]},{"emoji":"๐คฆโโ๏ธ","aliases":["woman_facepalming"]},{"emoji":"๐ฉโ๐ญ","aliases":["woman_factory_worker"]},{"emoji":"๐ฉโ๐พ","aliases":["woman_farmer"]},{"emoji":"๐ฉโ๐","aliases":["woman_firefighter"]},{"emoji":"๐ฉโโ๏ธ","aliases":["woman_health_worker"]},{"emoji":"๐ฉโ๐ฆฝ","aliases":["woman_in_manual_wheelchair"]},{"emoji":"๐ฉโ๐ฆผ","aliases":["woman_in_motorized_wheelchair"]},{"emoji":"๐ฉโโ๏ธ","aliases":["woman_judge"]},{"emoji":"๐คนโโ๏ธ","aliases":["woman_juggling"]},{"emoji":"๐ฉโ๐ง","aliases":["woman_mechanic"]},{"emoji":"๐ฉโ๐ผ","aliases":["woman_office_worker"]},{"emoji":"๐ฉโโ๏ธ","aliases":["woman_pilot"]},{"emoji":"๐คพโโ๏ธ","aliases":["woman_playing_handball"]},{"emoji":"๐คฝโโ๏ธ","aliases":["woman_playing_water_polo"]},{"emoji":"๐ฉโ๐ฌ","aliases":["woman_scientist"]},{"emoji":"๐คทโโ๏ธ","aliases":["woman_shrugging"]},{"emoji":"๐ฉโ๐ค","aliases":["woman_singer"]},{"emoji":"๐ฉโ๐","aliases":["woman_student"]},{"emoji":"๐ฉโ๐ซ","aliases":["woman_teacher"]},{"emoji":"๐ฉโ๐ป","aliases":["woman_technologist"]},{"emoji":"๐ง","aliases":["woman_with_headscarf"]},{"emoji":"๐ฉโ๐ฆฏ","aliases":["woman_with_probing_cane"]},{"emoji":"๐ณโโ๏ธ","aliases":["woman_with_turban"]},{"emoji":"๐","aliases":["womans_clothes"]},{"emoji":"๐","aliases":["womans_hat"]},{"emoji":"๐คผโโ๏ธ","aliases":["women_wrestling"]},{"emoji":"๐บ","aliases":["womens"]},{"emoji":"๐ฅด","aliases":["woozy_face"]},{"emoji":"๐บ๏ธ","aliases":["world_map"]},{"emoji":"๐","aliases":["worried"]},{"emoji":"๐ง","aliases":["wrench"]},{"emoji":"๐คผ","aliases":["wrestling"]},{"emoji":"โ๏ธ","aliases":["writing_hand"]},{"emoji":"โ","aliases":["x"]},{"emoji":"๐งถ","aliases":["yarn"]},{"emoji":"๐ฅฑ","aliases":["yawning_face"]},{"emoji":"๐ก","aliases":["yellow_circle"]},{"emoji":"๐","aliases":["yellow_heart"]},{"emoji":"๐จ","aliases":["yellow_square"]},{"emoji":"๐พ๐ช","aliases":["yemen"]},{"emoji":"๐ด","aliases":["yen"]},{"emoji":"โฏ๏ธ","aliases":["yin_yang"]},{"emoji":"๐ช","aliases":["yo_yo"]},{"emoji":"๐","aliases":["yum"]},{"emoji":"๐ฟ๐ฒ","aliases":["zambia"]},{"emoji":"๐คช","aliases":["zany_face"]},{"emoji":"โก","aliases":["zap"]},{"emoji":"๐ฆ","aliases":["zebra"]},{"emoji":"0๏ธโฃ","aliases":["zero"]},{"emoji":"๐ฟ๐ผ","aliases":["zimbabwe"]},{"emoji":"๐ค","aliases":["zipper_mouth_face"]},{"emoji":"๐ง","aliases":["zombie"]},{"emoji":"๐งโโ๏ธ","aliases":["zombie_man"]},{"emoji":"๐งโโ๏ธ","aliases":["zombie_woman"]},{"emoji":"๐ค","aliases":["zzz"]}] [{"emoji":"๐","aliases":["+1","thumbsup"]},{"emoji":"๐","aliases":["-1","thumbsdown"]},{"emoji":"๐ฏ","aliases":["100"]},{"emoji":"๐ข","aliases":["1234"]},{"emoji":"๐ฅ","aliases":["1st_place_medal"]},{"emoji":"๐ฅ","aliases":["2nd_place_medal"]},{"emoji":"๐ฅ","aliases":["3rd_place_medal"]},{"emoji":"๐ฑ","aliases":["8ball"]},{"emoji":"๐ ฐ๏ธ","aliases":["a"]},{"emoji":"๐","aliases":["ab"]},{"emoji":"๐งฎ","aliases":["abacus"]},{"emoji":"๐ค","aliases":["abc"]},{"emoji":"๐ก","aliases":["abcd"]},{"emoji":"๐","aliases":["accept"]},{"emoji":"๐ช","aliases":["accordion"]},{"emoji":"๐ฉน","aliases":["adhesive_bandage"]},{"emoji":"๐ง","aliases":["adult"]},{"emoji":"๐ก","aliases":["aerial_tramway"]},{"emoji":"๐ฆ๐ซ","aliases":["afghanistan"]},{"emoji":"โ๏ธ","aliases":["airplane"]},{"emoji":"๐ฆ๐ฝ","aliases":["aland_islands"]},{"emoji":"โฐ","aliases":["alarm_clock"]},{"emoji":"๐ฆ๐ฑ","aliases":["albania"]},{"emoji":"โ๏ธ","aliases":["alembic"]},{"emoji":"๐ฉ๐ฟ","aliases":["algeria"]},{"emoji":"๐ฝ","aliases":["alien"]},{"emoji":"๐","aliases":["ambulance"]},{"emoji":"๐ฆ๐ธ","aliases":["american_samoa"]},{"emoji":"๐บ","aliases":["amphora"]},{"emoji":"๐ซ","aliases":["anatomical_heart"]},{"emoji":"โ","aliases":["anchor"]},{"emoji":"๐ฆ๐ฉ","aliases":["andorra"]},{"emoji":"๐ผ","aliases":["angel"]},{"emoji":"๐ข","aliases":["anger"]},{"emoji":"๐ฆ๐ด","aliases":["angola"]},{"emoji":"๐ ","aliases":["angry"]},{"emoji":"๐ฆ๐ฎ","aliases":["anguilla"]},{"emoji":"๐ง","aliases":["anguished"]},{"emoji":"๐","aliases":["ant"]},{"emoji":"๐ฆ๐ถ","aliases":["antarctica"]},{"emoji":"๐ฆ๐ฌ","aliases":["antigua_barbuda"]},{"emoji":"๐","aliases":["apple"]},{"emoji":"โ","aliases":["aquarius"]},{"emoji":"๐ฆ๐ท","aliases":["argentina"]},{"emoji":"โ","aliases":["aries"]},{"emoji":"๐ฆ๐ฒ","aliases":["armenia"]},{"emoji":"โ๏ธ","aliases":["arrow_backward"]},{"emoji":"โฌ","aliases":["arrow_double_down"]},{"emoji":"โซ","aliases":["arrow_double_up"]},{"emoji":"โฌ๏ธ","aliases":["arrow_down"]},{"emoji":"๐ฝ","aliases":["arrow_down_small"]},{"emoji":"โถ๏ธ","aliases":["arrow_forward"]},{"emoji":"โคต๏ธ","aliases":["arrow_heading_down"]},{"emoji":"โคด๏ธ","aliases":["arrow_heading_up"]},{"emoji":"โฌ ๏ธ","aliases":["arrow_left"]},{"emoji":"โ๏ธ","aliases":["arrow_lower_left"]},{"emoji":"โ๏ธ","aliases":["arrow_lower_right"]},{"emoji":"โก๏ธ","aliases":["arrow_right"]},{"emoji":"โช๏ธ","aliases":["arrow_right_hook"]},{"emoji":"โฌ๏ธ","aliases":["arrow_up"]},{"emoji":"โ๏ธ","aliases":["arrow_up_down"]},{"emoji":"๐ผ","aliases":["arrow_up_small"]},{"emoji":"โ๏ธ","aliases":["arrow_upper_left"]},{"emoji":"โ๏ธ","aliases":["arrow_upper_right"]},{"emoji":"๐","aliases":["arrows_clockwise"]},{"emoji":"๐","aliases":["arrows_counterclockwise"]},{"emoji":"๐จ","aliases":["art"]},{"emoji":"๐","aliases":["articulated_lorry"]},{"emoji":"๐ฐ๏ธ","aliases":["artificial_satellite"]},{"emoji":"๐งโ๐จ","aliases":["artist"]},{"emoji":"๐ฆ๐ผ","aliases":["aruba"]},{"emoji":"๐ฆ๐จ","aliases":["ascension_island"]},{"emoji":"*๏ธโฃ","aliases":["asterisk"]},{"emoji":"๐ฒ","aliases":["astonished"]},{"emoji":"๐งโ๐","aliases":["astronaut"]},{"emoji":"๐","aliases":["athletic_shoe"]},{"emoji":"๐ง","aliases":["atm"]},{"emoji":"โ๏ธ","aliases":["atom_symbol"]},{"emoji":"๐ฆ๐บ","aliases":["australia"]},{"emoji":"๐ฆ๐น","aliases":["austria"]},{"emoji":"๐บ","aliases":["auto_rickshaw"]},{"emoji":"๐ฅ","aliases":["avocado"]},{"emoji":"๐ช","aliases":["axe"]},{"emoji":"๐ฆ๐ฟ","aliases":["azerbaijan"]},{"emoji":"๐ ฑ๏ธ","aliases":["b"]},{"emoji":"๐ถ","aliases":["baby"]},{"emoji":"๐ผ","aliases":["baby_bottle"]},{"emoji":"๐ค","aliases":["baby_chick"]},{"emoji":"๐ผ","aliases":["baby_symbol"]},{"emoji":"๐","aliases":["back"]},{"emoji":"๐ฅ","aliases":["bacon"]},{"emoji":"๐ฆก","aliases":["badger"]},{"emoji":"๐ธ","aliases":["badminton"]},{"emoji":"๐ฅฏ","aliases":["bagel"]},{"emoji":"๐","aliases":["baggage_claim"]},{"emoji":"๐ฅ","aliases":["baguette_bread"]},{"emoji":"๐ง๐ธ","aliases":["bahamas"]},{"emoji":"๐ง๐ญ","aliases":["bahrain"]},{"emoji":"โ๏ธ","aliases":["balance_scale"]},{"emoji":"๐จโ๐ฆฒ","aliases":["bald_man"]},{"emoji":"๐ฉโ๐ฆฒ","aliases":["bald_woman"]},{"emoji":"๐ฉฐ","aliases":["ballet_shoes"]},{"emoji":"๐","aliases":["balloon"]},{"emoji":"๐ณ๏ธ","aliases":["ballot_box"]},{"emoji":"โ๏ธ","aliases":["ballot_box_with_check"]},{"emoji":"๐","aliases":["bamboo"]},{"emoji":"๐","aliases":["banana"]},{"emoji":"โผ๏ธ","aliases":["bangbang"]},{"emoji":"๐ง๐ฉ","aliases":["bangladesh"]},{"emoji":"๐ช","aliases":["banjo"]},{"emoji":"๐ฆ","aliases":["bank"]},{"emoji":"๐","aliases":["bar_chart"]},{"emoji":"๐ง๐ง","aliases":["barbados"]},{"emoji":"๐","aliases":["barber"]},{"emoji":"โพ","aliases":["baseball"]},{"emoji":"๐งบ","aliases":["basket"]},{"emoji":"๐","aliases":["basketball"]},{"emoji":"๐ฆ","aliases":["bat"]},{"emoji":"๐","aliases":["bath"]},{"emoji":"๐","aliases":["bathtub"]},{"emoji":"๐","aliases":["battery"]},{"emoji":"๐๏ธ","aliases":["beach_umbrella"]},{"emoji":"๐ซ","aliases":["beans"]},{"emoji":"๐ป","aliases":["bear"]},{"emoji":"๐ง","aliases":["bearded_person"]},{"emoji":"๐ฆซ","aliases":["beaver"]},{"emoji":"๐๏ธ","aliases":["bed"]},{"emoji":"๐","aliases":["bee","honeybee"]},{"emoji":"๐บ","aliases":["beer"]},{"emoji":"๐ป","aliases":["beers"]},{"emoji":"๐ชฒ","aliases":["beetle"]},{"emoji":"๐ฐ","aliases":["beginner"]},{"emoji":"๐ง๐พ","aliases":["belarus"]},{"emoji":"๐ง๐ช","aliases":["belgium"]},{"emoji":"๐ง๐ฟ","aliases":["belize"]},{"emoji":"๐","aliases":["bell"]},{"emoji":"๐ซ","aliases":["bell_pepper"]},{"emoji":"๐๏ธ","aliases":["bellhop_bell"]},{"emoji":"๐ง๐ฏ","aliases":["benin"]},{"emoji":"๐ฑ","aliases":["bento"]},{"emoji":"๐ง๐ฒ","aliases":["bermuda"]},{"emoji":"๐ง","aliases":["beverage_box"]},{"emoji":"๐ง๐น","aliases":["bhutan"]},{"emoji":"๐ด","aliases":["bicyclist"]},{"emoji":"๐ฒ","aliases":["bike"]},{"emoji":"๐ดโโ๏ธ","aliases":["biking_man"]},{"emoji":"๐ดโโ๏ธ","aliases":["biking_woman"]},{"emoji":"๐","aliases":["bikini"]},{"emoji":"๐งข","aliases":["billed_cap"]},{"emoji":"โฃ๏ธ","aliases":["biohazard"]},{"emoji":"๐ฆ","aliases":["bird"]},{"emoji":"๐","aliases":["birthday"]},{"emoji":"๐ฆฌ","aliases":["bison"]},{"emoji":"๐ซฆ","aliases":["biting_lip"]},{"emoji":"๐โโฌ","aliases":["black_cat"]},{"emoji":"โซ","aliases":["black_circle"]},{"emoji":"๐ด","aliases":["black_flag"]},{"emoji":"๐ค","aliases":["black_heart"]},{"emoji":"๐","aliases":["black_joker"]},{"emoji":"โฌ","aliases":["black_large_square"]},{"emoji":"โพ","aliases":["black_medium_small_square"]},{"emoji":"โผ๏ธ","aliases":["black_medium_square"]},{"emoji":"โ๏ธ","aliases":["black_nib"]},{"emoji":"โช๏ธ","aliases":["black_small_square"]},{"emoji":"๐ฒ","aliases":["black_square_button"]},{"emoji":"๐ฑโโ๏ธ","aliases":["blond_haired_man"]},{"emoji":"๐ฑ","aliases":["blond_haired_person"]},{"emoji":"๐ฑโโ๏ธ","aliases":["blond_haired_woman","blonde_woman"]},{"emoji":"๐ผ","aliases":["blossom"]},{"emoji":"๐ก","aliases":["blowfish"]},{"emoji":"๐","aliases":["blue_book"]},{"emoji":"๐","aliases":["blue_car"]},{"emoji":"๐","aliases":["blue_heart"]},{"emoji":"๐ฆ","aliases":["blue_square"]},{"emoji":"๐ซ","aliases":["blueberries"]},{"emoji":"๐","aliases":["blush"]},{"emoji":"๐","aliases":["boar"]},{"emoji":"โต","aliases":["boat","sailboat"]},{"emoji":"๐ง๐ด","aliases":["bolivia"]},{"emoji":"๐ฃ","aliases":["bomb"]},{"emoji":"๐ฆด","aliases":["bone"]},{"emoji":"๐","aliases":["book","open_book"]},{"emoji":"๐","aliases":["bookmark"]},{"emoji":"๐","aliases":["bookmark_tabs"]},{"emoji":"๐","aliases":["books"]},{"emoji":"๐ฅ","aliases":["boom","collision"]},{"emoji":"๐ช","aliases":["boomerang"]},{"emoji":"๐ข","aliases":["boot"]},{"emoji":"๐ง๐ฆ","aliases":["bosnia_herzegovina"]},{"emoji":"๐ง๐ผ","aliases":["botswana"]},{"emoji":"โน๏ธโโ๏ธ","aliases":["bouncing_ball_man","basketball_man"]},{"emoji":"โน๏ธ","aliases":["bouncing_ball_person"]},{"emoji":"โน๏ธโโ๏ธ","aliases":["bouncing_ball_woman","basketball_woman"]},{"emoji":"๐","aliases":["bouquet"]},{"emoji":"๐ง๐ป","aliases":["bouvet_island"]},{"emoji":"๐","aliases":["bow"]},{"emoji":"๐น","aliases":["bow_and_arrow"]},{"emoji":"๐โโ๏ธ","aliases":["bowing_man"]},{"emoji":"๐โโ๏ธ","aliases":["bowing_woman"]},{"emoji":"๐ฅฃ","aliases":["bowl_with_spoon"]},{"emoji":"๐ณ","aliases":["bowling"]},{"emoji":"๐ฅ","aliases":["boxing_glove"]},{"emoji":"๐ฆ","aliases":["boy"]},{"emoji":"๐ง ","aliases":["brain"]},{"emoji":"๐ง๐ท","aliases":["brazil"]},{"emoji":"๐","aliases":["bread"]},{"emoji":"๐คฑ","aliases":["breast_feeding"]},{"emoji":"๐งฑ","aliases":["bricks"]},{"emoji":"๐","aliases":["bridge_at_night"]},{"emoji":"๐ผ","aliases":["briefcase"]},{"emoji":"๐ฎ๐ด","aliases":["british_indian_ocean_territory"]},{"emoji":"๐ป๐ฌ","aliases":["british_virgin_islands"]},{"emoji":"๐ฅฆ","aliases":["broccoli"]},{"emoji":"๐","aliases":["broken_heart"]},{"emoji":"๐งน","aliases":["broom"]},{"emoji":"๐ค","aliases":["brown_circle"]},{"emoji":"๐ค","aliases":["brown_heart"]},{"emoji":"๐ซ","aliases":["brown_square"]},{"emoji":"๐ง๐ณ","aliases":["brunei"]},{"emoji":"๐ง","aliases":["bubble_tea"]},{"emoji":"๐ซง","aliases":["bubbles"]},{"emoji":"๐ชฃ","aliases":["bucket"]},{"emoji":"๐","aliases":["bug"]},{"emoji":"๐๏ธ","aliases":["building_construction"]},{"emoji":"๐ก","aliases":["bulb"]},{"emoji":"๐ง๐ฌ","aliases":["bulgaria"]},{"emoji":"๐ ","aliases":["bullettrain_front"]},{"emoji":"๐","aliases":["bullettrain_side"]},{"emoji":"๐ง๐ซ","aliases":["burkina_faso"]},{"emoji":"๐ฏ","aliases":["burrito"]},{"emoji":"๐ง๐ฎ","aliases":["burundi"]},{"emoji":"๐","aliases":["bus"]},{"emoji":"๐ด๏ธ","aliases":["business_suit_levitating"]},{"emoji":"๐","aliases":["busstop"]},{"emoji":"๐ค","aliases":["bust_in_silhouette"]},{"emoji":"๐ฅ","aliases":["busts_in_silhouette"]},{"emoji":"๐ง","aliases":["butter"]},{"emoji":"๐ฆ","aliases":["butterfly"]},{"emoji":"๐ต","aliases":["cactus"]},{"emoji":"๐ฐ","aliases":["cake"]},{"emoji":"๐","aliases":["calendar"]},{"emoji":"๐ค","aliases":["call_me_hand"]},{"emoji":"๐ฒ","aliases":["calling"]},{"emoji":"๐ฐ๐ญ","aliases":["cambodia"]},{"emoji":"๐ซ","aliases":["camel"]},{"emoji":"๐ท","aliases":["camera"]},{"emoji":"๐ธ","aliases":["camera_flash"]},{"emoji":"๐จ๐ฒ","aliases":["cameroon"]},{"emoji":"๐๏ธ","aliases":["camping"]},{"emoji":"๐จ๐ฆ","aliases":["canada"]},{"emoji":"๐ฎ๐จ","aliases":["canary_islands"]},{"emoji":"โ","aliases":["cancer"]},{"emoji":"๐ฏ๏ธ","aliases":["candle"]},{"emoji":"๐ฌ","aliases":["candy"]},{"emoji":"๐ฅซ","aliases":["canned_food"]},{"emoji":"๐ถ","aliases":["canoe"]},{"emoji":"๐จ๐ป","aliases":["cape_verde"]},{"emoji":"๐ ","aliases":["capital_abcd"]},{"emoji":"โ","aliases":["capricorn"]},{"emoji":"๐","aliases":["car","red_car"]},{"emoji":"๐๏ธ","aliases":["card_file_box"]},{"emoji":"๐","aliases":["card_index"]},{"emoji":"๐๏ธ","aliases":["card_index_dividers"]},{"emoji":"๐ง๐ถ","aliases":["caribbean_netherlands"]},{"emoji":"๐ ","aliases":["carousel_horse"]},{"emoji":"๐ช","aliases":["carpentry_saw"]},{"emoji":"๐ฅ","aliases":["carrot"]},{"emoji":"๐คธ","aliases":["cartwheeling"]},{"emoji":"๐ฑ","aliases":["cat"]},{"emoji":"๐","aliases":["cat2"]},{"emoji":"๐ฐ๐พ","aliases":["cayman_islands"]},{"emoji":"๐ฟ","aliases":["cd"]},{"emoji":"๐จ๐ซ","aliases":["central_african_republic"]},{"emoji":"๐ช๐ฆ","aliases":["ceuta_melilla"]},{"emoji":"๐น๐ฉ","aliases":["chad"]},{"emoji":"โ๏ธ","aliases":["chains"]},{"emoji":"๐ช","aliases":["chair"]},{"emoji":"๐พ","aliases":["champagne"]},{"emoji":"๐น","aliases":["chart"]},{"emoji":"๐","aliases":["chart_with_downwards_trend"]},{"emoji":"๐","aliases":["chart_with_upwards_trend"]},{"emoji":"๐","aliases":["checkered_flag"]},{"emoji":"๐ง","aliases":["cheese"]},{"emoji":"๐","aliases":["cherries"]},{"emoji":"๐ธ","aliases":["cherry_blossom"]},{"emoji":"โ๏ธ","aliases":["chess_pawn"]},{"emoji":"๐ฐ","aliases":["chestnut"]},{"emoji":"๐","aliases":["chicken"]},{"emoji":"๐ง","aliases":["child"]},{"emoji":"๐ธ","aliases":["children_crossing"]},{"emoji":"๐จ๐ฑ","aliases":["chile"]},{"emoji":"๐ฟ๏ธ","aliases":["chipmunk"]},{"emoji":"๐ซ","aliases":["chocolate_bar"]},{"emoji":"๐ฅข","aliases":["chopsticks"]},{"emoji":"๐จ๐ฝ","aliases":["christmas_island"]},{"emoji":"๐","aliases":["christmas_tree"]},{"emoji":"โช","aliases":["church"]},{"emoji":"๐ฆ","aliases":["cinema"]},{"emoji":"๐ช","aliases":["circus_tent"]},{"emoji":"๐","aliases":["city_sunrise"]},{"emoji":"๐","aliases":["city_sunset"]},{"emoji":"๐๏ธ","aliases":["cityscape"]},{"emoji":"๐","aliases":["cl"]},{"emoji":"๐๏ธ","aliases":["clamp"]},{"emoji":"๐","aliases":["clap"]},{"emoji":"๐ฌ","aliases":["clapper"]},{"emoji":"๐๏ธ","aliases":["classical_building"]},{"emoji":"๐ง","aliases":["climbing"]},{"emoji":"๐งโโ๏ธ","aliases":["climbing_man"]},{"emoji":"๐งโโ๏ธ","aliases":["climbing_woman"]},{"emoji":"๐ฅ","aliases":["clinking_glasses"]},{"emoji":"๐","aliases":["clipboard"]},{"emoji":"๐จ๐ต","aliases":["clipperton_island"]},{"emoji":"๐","aliases":["clock1"]},{"emoji":"๐","aliases":["clock10"]},{"emoji":"๐ฅ","aliases":["clock1030"]},{"emoji":"๐","aliases":["clock11"]},{"emoji":"๐ฆ","aliases":["clock1130"]},{"emoji":"๐","aliases":["clock12"]},{"emoji":"๐ง","aliases":["clock1230"]},{"emoji":"๐","aliases":["clock130"]},{"emoji":"๐","aliases":["clock2"]},{"emoji":"๐","aliases":["clock230"]},{"emoji":"๐","aliases":["clock3"]},{"emoji":"๐","aliases":["clock330"]},{"emoji":"๐","aliases":["clock4"]},{"emoji":"๐","aliases":["clock430"]},{"emoji":"๐","aliases":["clock5"]},{"emoji":"๐ ","aliases":["clock530"]},{"emoji":"๐","aliases":["clock6"]},{"emoji":"๐ก","aliases":["clock630"]},{"emoji":"๐","aliases":["clock7"]},{"emoji":"๐ข","aliases":["clock730"]},{"emoji":"๐","aliases":["clock8"]},{"emoji":"๐ฃ","aliases":["clock830"]},{"emoji":"๐","aliases":["clock9"]},{"emoji":"๐ค","aliases":["clock930"]},{"emoji":"๐","aliases":["closed_book"]},{"emoji":"๐","aliases":["closed_lock_with_key"]},{"emoji":"๐","aliases":["closed_umbrella"]},{"emoji":"โ๏ธ","aliases":["cloud"]},{"emoji":"๐ฉ๏ธ","aliases":["cloud_with_lightning"]},{"emoji":"โ๏ธ","aliases":["cloud_with_lightning_and_rain"]},{"emoji":"๐ง๏ธ","aliases":["cloud_with_rain"]},{"emoji":"๐จ๏ธ","aliases":["cloud_with_snow"]},{"emoji":"๐คก","aliases":["clown_face"]},{"emoji":"โฃ๏ธ","aliases":["clubs"]},{"emoji":"๐จ๐ณ","aliases":["cn"]},{"emoji":"๐งฅ","aliases":["coat"]},{"emoji":"๐ชณ","aliases":["cockroach"]},{"emoji":"๐ธ","aliases":["cocktail"]},{"emoji":"๐ฅฅ","aliases":["coconut"]},{"emoji":"๐จ๐จ","aliases":["cocos_islands"]},{"emoji":"โ","aliases":["coffee"]},{"emoji":"โฐ๏ธ","aliases":["coffin"]},{"emoji":"๐ช","aliases":["coin"]},{"emoji":"๐ฅถ","aliases":["cold_face"]},{"emoji":"๐ฐ","aliases":["cold_sweat"]},{"emoji":"๐จ๐ด","aliases":["colombia"]},{"emoji":"โ๏ธ","aliases":["comet"]},{"emoji":"๐ฐ๐ฒ","aliases":["comoros"]},{"emoji":"๐งญ","aliases":["compass"]},{"emoji":"๐ป","aliases":["computer"]},{"emoji":"๐ฑ๏ธ","aliases":["computer_mouse"]},{"emoji":"๐","aliases":["confetti_ball"]},{"emoji":"๐","aliases":["confounded"]},{"emoji":"๐","aliases":["confused"]},{"emoji":"๐จ๐ฌ","aliases":["congo_brazzaville"]},{"emoji":"๐จ๐ฉ","aliases":["congo_kinshasa"]},{"emoji":"ใ๏ธ","aliases":["congratulations"]},{"emoji":"๐ง","aliases":["construction"]},{"emoji":"๐ท","aliases":["construction_worker"]},{"emoji":"๐ทโโ๏ธ","aliases":["construction_worker_man"]},{"emoji":"๐ทโโ๏ธ","aliases":["construction_worker_woman"]},{"emoji":"๐๏ธ","aliases":["control_knobs"]},{"emoji":"๐ช","aliases":["convenience_store"]},{"emoji":"๐งโ๐ณ","aliases":["cook"]},{"emoji":"๐จ๐ฐ","aliases":["cook_islands"]},{"emoji":"๐ช","aliases":["cookie"]},{"emoji":"๐","aliases":["cool"]},{"emoji":"ยฉ๏ธ","aliases":["copyright"]},{"emoji":"๐ชธ","aliases":["coral"]},{"emoji":"๐ฝ","aliases":["corn"]},{"emoji":"๐จ๐ท","aliases":["costa_rica"]},{"emoji":"๐จ๐ฎ","aliases":["cote_divoire"]},{"emoji":"๐๏ธ","aliases":["couch_and_lamp"]},{"emoji":"๐ซ","aliases":["couple"]},{"emoji":"๐","aliases":["couple_with_heart"]},{"emoji":"๐จโโค๏ธโ๐จ","aliases":["couple_with_heart_man_man"]},{"emoji":"๐ฉโโค๏ธโ๐จ","aliases":["couple_with_heart_woman_man"]},{"emoji":"๐ฉโโค๏ธโ๐ฉ","aliases":["couple_with_heart_woman_woman"]},{"emoji":"๐","aliases":["couplekiss"]},{"emoji":"๐จโโค๏ธโ๐โ๐จ","aliases":["couplekiss_man_man"]},{"emoji":"๐ฉโโค๏ธโ๐โ๐จ","aliases":["couplekiss_man_woman"]},{"emoji":"๐ฉโโค๏ธโ๐โ๐ฉ","aliases":["couplekiss_woman_woman"]},{"emoji":"๐ฎ","aliases":["cow"]},{"emoji":"๐","aliases":["cow2"]},{"emoji":"๐ค ","aliases":["cowboy_hat_face"]},{"emoji":"๐ฆ","aliases":["crab"]},{"emoji":"๐๏ธ","aliases":["crayon"]},{"emoji":"๐ณ","aliases":["credit_card"]},{"emoji":"๐","aliases":["crescent_moon"]},{"emoji":"๐ฆ","aliases":["cricket"]},{"emoji":"๐","aliases":["cricket_game"]},{"emoji":"๐ญ๐ท","aliases":["croatia"]},{"emoji":"๐","aliases":["crocodile"]},{"emoji":"๐ฅ","aliases":["croissant"]},{"emoji":"๐ค","aliases":["crossed_fingers"]},{"emoji":"๐","aliases":["crossed_flags"]},{"emoji":"โ๏ธ","aliases":["crossed_swords"]},{"emoji":"๐","aliases":["crown"]},{"emoji":"๐ฉผ","aliases":["crutch"]},{"emoji":"๐ข","aliases":["cry"]},{"emoji":"๐ฟ","aliases":["crying_cat_face"]},{"emoji":"๐ฎ","aliases":["crystal_ball"]},{"emoji":"๐จ๐บ","aliases":["cuba"]},{"emoji":"๐ฅ","aliases":["cucumber"]},{"emoji":"๐ฅค","aliases":["cup_with_straw"]},{"emoji":"๐ง","aliases":["cupcake"]},{"emoji":"๐","aliases":["cupid"]},{"emoji":"๐จ๐ผ","aliases":["curacao"]},{"emoji":"๐ฅ","aliases":["curling_stone"]},{"emoji":"๐จโ๐ฆฑ","aliases":["curly_haired_man"]},{"emoji":"๐ฉโ๐ฆฑ","aliases":["curly_haired_woman"]},{"emoji":"โฐ","aliases":["curly_loop"]},{"emoji":"๐ฑ","aliases":["currency_exchange"]},{"emoji":"๐","aliases":["curry"]},{"emoji":"๐คฌ","aliases":["cursing_face"]},{"emoji":"๐ฎ","aliases":["custard"]},{"emoji":"๐","aliases":["customs"]},{"emoji":"๐ฅฉ","aliases":["cut_of_meat"]},{"emoji":"๐","aliases":["cyclone"]},{"emoji":"๐จ๐พ","aliases":["cyprus"]},{"emoji":"๐จ๐ฟ","aliases":["czech_republic"]},{"emoji":"๐ก๏ธ","aliases":["dagger"]},{"emoji":"๐ฏ","aliases":["dancers"]},{"emoji":"๐ฏโโ๏ธ","aliases":["dancing_men"]},{"emoji":"๐ฏโโ๏ธ","aliases":["dancing_women"]},{"emoji":"๐ก","aliases":["dango"]},{"emoji":"๐ถ๏ธ","aliases":["dark_sunglasses"]},{"emoji":"๐ฏ","aliases":["dart"]},{"emoji":"๐จ","aliases":["dash"]},{"emoji":"๐ ","aliases":["date"]},{"emoji":"๐ฉ๐ช","aliases":["de"]},{"emoji":"๐งโโ๏ธ","aliases":["deaf_man"]},{"emoji":"๐ง","aliases":["deaf_person"]},{"emoji":"๐งโโ๏ธ","aliases":["deaf_woman"]},{"emoji":"๐ณ","aliases":["deciduous_tree"]},{"emoji":"๐ฆ","aliases":["deer"]},{"emoji":"๐ฉ๐ฐ","aliases":["denmark"]},{"emoji":"๐ฌ","aliases":["department_store"]},{"emoji":"๐๏ธ","aliases":["derelict_house"]},{"emoji":"๐๏ธ","aliases":["desert"]},{"emoji":"๐๏ธ","aliases":["desert_island"]},{"emoji":"๐ฅ๏ธ","aliases":["desktop_computer"]},{"emoji":"๐ต๏ธ","aliases":["detective"]},{"emoji":"๐ ","aliases":["diamond_shape_with_a_dot_inside"]},{"emoji":"โฆ๏ธ","aliases":["diamonds"]},{"emoji":"๐ฉ๐ฌ","aliases":["diego_garcia"]},{"emoji":"๐","aliases":["disappointed"]},{"emoji":"๐ฅ","aliases":["disappointed_relieved"]},{"emoji":"๐ฅธ","aliases":["disguised_face"]},{"emoji":"๐คฟ","aliases":["diving_mask"]},{"emoji":"๐ช","aliases":["diya_lamp"]},{"emoji":"๐ซ","aliases":["dizzy"]},{"emoji":"๐ต","aliases":["dizzy_face"]},{"emoji":"๐ฉ๐ฏ","aliases":["djibouti"]},{"emoji":"๐งฌ","aliases":["dna"]},{"emoji":"๐ฏ","aliases":["do_not_litter"]},{"emoji":"๐ฆค","aliases":["dodo"]},{"emoji":"๐ถ","aliases":["dog"]},{"emoji":"๐","aliases":["dog2"]},{"emoji":"๐ต","aliases":["dollar"]},{"emoji":"๐","aliases":["dolls"]},{"emoji":"๐ฌ","aliases":["dolphin","flipper"]},{"emoji":"๐ฉ๐ฒ","aliases":["dominica"]},{"emoji":"๐ฉ๐ด","aliases":["dominican_republic"]},{"emoji":"๐ช","aliases":["door"]},{"emoji":"๐ซฅ","aliases":["dotted_line_face"]},{"emoji":"๐ฉ","aliases":["doughnut"]},{"emoji":"๐๏ธ","aliases":["dove"]},{"emoji":"๐","aliases":["dragon"]},{"emoji":"๐ฒ","aliases":["dragon_face"]},{"emoji":"๐","aliases":["dress"]},{"emoji":"๐ช","aliases":["dromedary_camel"]},{"emoji":"๐คค","aliases":["drooling_face"]},{"emoji":"๐ฉธ","aliases":["drop_of_blood"]},{"emoji":"๐ง","aliases":["droplet"]},{"emoji":"๐ฅ","aliases":["drum"]},{"emoji":"๐ฆ","aliases":["duck"]},{"emoji":"๐ฅ","aliases":["dumpling"]},{"emoji":"๐","aliases":["dvd"]},{"emoji":"๐ฆ ","aliases":["eagle"]},{"emoji":"๐","aliases":["ear"]},{"emoji":"๐พ","aliases":["ear_of_rice"]},{"emoji":"๐ฆป","aliases":["ear_with_hearing_aid"]},{"emoji":"๐","aliases":["earth_africa"]},{"emoji":"๐","aliases":["earth_americas"]},{"emoji":"๐","aliases":["earth_asia"]},{"emoji":"๐ช๐จ","aliases":["ecuador"]},{"emoji":"๐ฅ","aliases":["egg"]},{"emoji":"๐","aliases":["eggplant"]},{"emoji":"๐ช๐ฌ","aliases":["egypt"]},{"emoji":"8๏ธโฃ","aliases":["eight"]},{"emoji":"โด๏ธ","aliases":["eight_pointed_black_star"]},{"emoji":"โณ๏ธ","aliases":["eight_spoked_asterisk"]},{"emoji":"โ๏ธ","aliases":["eject_button"]},{"emoji":"๐ธ๐ป","aliases":["el_salvador"]},{"emoji":"๐","aliases":["electric_plug"]},{"emoji":"๐","aliases":["elephant"]},{"emoji":"๐","aliases":["elevator"]},{"emoji":"๐ง","aliases":["elf"]},{"emoji":"๐งโโ๏ธ","aliases":["elf_man"]},{"emoji":"๐งโโ๏ธ","aliases":["elf_woman"]},{"emoji":"๐ง","aliases":["email","e-mail"]},{"emoji":"๐ชน","aliases":["empty_nest"]},{"emoji":"๐","aliases":["end"]},{"emoji":"๐ด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ","aliases":["england"]},{"emoji":"โ๏ธ","aliases":["envelope"]},{"emoji":"๐ฉ","aliases":["envelope_with_arrow"]},{"emoji":"๐ฌ๐ถ","aliases":["equatorial_guinea"]},{"emoji":"๐ช๐ท","aliases":["eritrea"]},{"emoji":"๐ช๐ธ","aliases":["es"]},{"emoji":"๐ช๐ช","aliases":["estonia"]},{"emoji":"๐ช๐น","aliases":["ethiopia"]},{"emoji":"๐ช๐บ","aliases":["eu","european_union"]},{"emoji":"๐ถ","aliases":["euro"]},{"emoji":"๐ฐ","aliases":["european_castle"]},{"emoji":"๐ค","aliases":["european_post_office"]},{"emoji":"๐ฒ","aliases":["evergreen_tree"]},{"emoji":"โ","aliases":["exclamation","heavy_exclamation_mark"]},{"emoji":"๐คฏ","aliases":["exploding_head"]},{"emoji":"๐","aliases":["expressionless"]},{"emoji":"๐๏ธ","aliases":["eye"]},{"emoji":"๐๏ธโ๐จ๏ธ","aliases":["eye_speech_bubble"]},{"emoji":"๐","aliases":["eyeglasses"]},{"emoji":"๐","aliases":["eyes"]},{"emoji":"๐ฎโ๐จ","aliases":["face_exhaling"]},{"emoji":"๐ฅน","aliases":["face_holding_back_tears"]},{"emoji":"๐ถโ๐ซ๏ธ","aliases":["face_in_clouds"]},{"emoji":"๐ซค","aliases":["face_with_diagonal_mouth"]},{"emoji":"๐ค","aliases":["face_with_head_bandage"]},{"emoji":"๐ซข","aliases":["face_with_open_eyes_and_hand_over_mouth"]},{"emoji":"๐ซฃ","aliases":["face_with_peeking_eye"]},{"emoji":"๐ตโ๐ซ","aliases":["face_with_spiral_eyes"]},{"emoji":"๐ค","aliases":["face_with_thermometer"]},{"emoji":"๐คฆ","aliases":["facepalm"]},{"emoji":"๐ญ","aliases":["factory"]},{"emoji":"๐งโ๐ญ","aliases":["factory_worker"]},{"emoji":"๐ง","aliases":["fairy"]},{"emoji":"๐งโโ๏ธ","aliases":["fairy_man"]},{"emoji":"๐งโโ๏ธ","aliases":["fairy_woman"]},{"emoji":"๐ง","aliases":["falafel"]},{"emoji":"๐ซ๐ฐ","aliases":["falkland_islands"]},{"emoji":"๐","aliases":["fallen_leaf"]},{"emoji":"๐ช","aliases":["family"]},{"emoji":"๐จโ๐ฆ","aliases":["family_man_boy"]},{"emoji":"๐จโ๐ฆโ๐ฆ","aliases":["family_man_boy_boy"]},{"emoji":"๐จโ๐ง","aliases":["family_man_girl"]},{"emoji":"๐จโ๐งโ๐ฆ","aliases":["family_man_girl_boy"]},{"emoji":"๐จโ๐งโ๐ง","aliases":["family_man_girl_girl"]},{"emoji":"๐จโ๐จโ๐ฆ","aliases":["family_man_man_boy"]},{"emoji":"๐จโ๐จโ๐ฆโ๐ฆ","aliases":["family_man_man_boy_boy"]},{"emoji":"๐จโ๐จโ๐ง","aliases":["family_man_man_girl"]},{"emoji":"๐จโ๐จโ๐งโ๐ฆ","aliases":["family_man_man_girl_boy"]},{"emoji":"๐จโ๐จโ๐งโ๐ง","aliases":["family_man_man_girl_girl"]},{"emoji":"๐จโ๐ฉโ๐ฆ","aliases":["family_man_woman_boy"]},{"emoji":"๐จโ๐ฉโ๐ฆโ๐ฆ","aliases":["family_man_woman_boy_boy"]},{"emoji":"๐จโ๐ฉโ๐ง","aliases":["family_man_woman_girl"]},{"emoji":"๐จโ๐ฉโ๐งโ๐ฆ","aliases":["family_man_woman_girl_boy"]},{"emoji":"๐จโ๐ฉโ๐งโ๐ง","aliases":["family_man_woman_girl_girl"]},{"emoji":"๐ฉโ๐ฆ","aliases":["family_woman_boy"]},{"emoji":"๐ฉโ๐ฆโ๐ฆ","aliases":["family_woman_boy_boy"]},{"emoji":"๐ฉโ๐ง","aliases":["family_woman_girl"]},{"emoji":"๐ฉโ๐งโ๐ฆ","aliases":["family_woman_girl_boy"]},{"emoji":"๐ฉโ๐งโ๐ง","aliases":["family_woman_girl_girl"]},{"emoji":"๐ฉโ๐ฉโ๐ฆ","aliases":["family_woman_woman_boy"]},{"emoji":"๐ฉโ๐ฉโ๐ฆโ๐ฆ","aliases":["family_woman_woman_boy_boy"]},{"emoji":"๐ฉโ๐ฉโ๐ง","aliases":["family_woman_woman_girl"]},{"emoji":"๐ฉโ๐ฉโ๐งโ๐ฆ","aliases":["family_woman_woman_girl_boy"]},{"emoji":"๐ฉโ๐ฉโ๐งโ๐ง","aliases":["family_woman_woman_girl_girl"]},{"emoji":"๐งโ๐พ","aliases":["farmer"]},{"emoji":"๐ซ๐ด","aliases":["faroe_islands"]},{"emoji":"โฉ","aliases":["fast_forward"]},{"emoji":"๐ ","aliases":["fax"]},{"emoji":"๐จ","aliases":["fearful"]},{"emoji":"๐ชถ","aliases":["feather"]},{"emoji":"๐พ","aliases":["feet","paw_prints"]},{"emoji":"๐ต๏ธโโ๏ธ","aliases":["female_detective"]},{"emoji":"โ๏ธ","aliases":["female_sign"]},{"emoji":"๐ก","aliases":["ferris_wheel"]},{"emoji":"โด๏ธ","aliases":["ferry"]},{"emoji":"๐","aliases":["field_hockey"]},{"emoji":"๐ซ๐ฏ","aliases":["fiji"]},{"emoji":"๐๏ธ","aliases":["file_cabinet"]},{"emoji":"๐","aliases":["file_folder"]},{"emoji":"๐ฝ๏ธ","aliases":["film_projector"]},{"emoji":"๐๏ธ","aliases":["film_strip"]},{"emoji":"๐ซ๐ฎ","aliases":["finland"]},{"emoji":"๐ฅ","aliases":["fire"]},{"emoji":"๐","aliases":["fire_engine"]},{"emoji":"๐งฏ","aliases":["fire_extinguisher"]},{"emoji":"๐งจ","aliases":["firecracker"]},{"emoji":"๐งโ๐","aliases":["firefighter"]},{"emoji":"๐","aliases":["fireworks"]},{"emoji":"๐","aliases":["first_quarter_moon"]},{"emoji":"๐","aliases":["first_quarter_moon_with_face"]},{"emoji":"๐","aliases":["fish"]},{"emoji":"๐ฅ","aliases":["fish_cake"]},{"emoji":"๐ฃ","aliases":["fishing_pole_and_fish"]},{"emoji":"๐ค","aliases":["fist_left"]},{"emoji":"๐","aliases":["fist_oncoming","facepunch","punch"]},{"emoji":"โ","aliases":["fist_raised","fist"]},{"emoji":"๐ค","aliases":["fist_right"]},{"emoji":"5๏ธโฃ","aliases":["five"]},{"emoji":"๐","aliases":["flags"]},{"emoji":"๐ฆฉ","aliases":["flamingo"]},{"emoji":"๐ฆ","aliases":["flashlight"]},{"emoji":"๐ฅฟ","aliases":["flat_shoe"]},{"emoji":"๐ซ","aliases":["flatbread"]},{"emoji":"โ๏ธ","aliases":["fleur_de_lis"]},{"emoji":"๐ฌ","aliases":["flight_arrival"]},{"emoji":"๐ซ","aliases":["flight_departure"]},{"emoji":"๐พ","aliases":["floppy_disk"]},{"emoji":"๐ด","aliases":["flower_playing_cards"]},{"emoji":"๐ณ","aliases":["flushed"]},{"emoji":"๐ชฐ","aliases":["fly"]},{"emoji":"๐ฅ","aliases":["flying_disc"]},{"emoji":"๐ธ","aliases":["flying_saucer"]},{"emoji":"๐ซ๏ธ","aliases":["fog"]},{"emoji":"๐","aliases":["foggy"]},{"emoji":"๐ซ","aliases":["fondue"]},{"emoji":"๐ฆถ","aliases":["foot"]},{"emoji":"๐","aliases":["football"]},{"emoji":"๐ฃ","aliases":["footprints"]},{"emoji":"๐ด","aliases":["fork_and_knife"]},{"emoji":"๐ฅ ","aliases":["fortune_cookie"]},{"emoji":"โฒ","aliases":["fountain"]},{"emoji":"๐๏ธ","aliases":["fountain_pen"]},{"emoji":"4๏ธโฃ","aliases":["four"]},{"emoji":"๐","aliases":["four_leaf_clover"]},{"emoji":"๐ฆ","aliases":["fox_face"]},{"emoji":"๐ซ๐ท","aliases":["fr"]},{"emoji":"๐ผ๏ธ","aliases":["framed_picture"]},{"emoji":"๐","aliases":["free"]},{"emoji":"๐ฌ๐ซ","aliases":["french_guiana"]},{"emoji":"๐ต๐ซ","aliases":["french_polynesia"]},{"emoji":"๐น๐ซ","aliases":["french_southern_territories"]},{"emoji":"๐ณ","aliases":["fried_egg"]},{"emoji":"๐ค","aliases":["fried_shrimp"]},{"emoji":"๐","aliases":["fries"]},{"emoji":"๐ธ","aliases":["frog"]},{"emoji":"๐ฆ","aliases":["frowning"]},{"emoji":"โน๏ธ","aliases":["frowning_face"]},{"emoji":"๐โโ๏ธ","aliases":["frowning_man"]},{"emoji":"๐","aliases":["frowning_person"]},{"emoji":"๐โโ๏ธ","aliases":["frowning_woman"]},{"emoji":"โฝ","aliases":["fuelpump"]},{"emoji":"๐","aliases":["full_moon"]},{"emoji":"๐","aliases":["full_moon_with_face"]},{"emoji":"โฑ๏ธ","aliases":["funeral_urn"]},{"emoji":"๐ฌ๐ฆ","aliases":["gabon"]},{"emoji":"๐ฌ๐ฒ","aliases":["gambia"]},{"emoji":"๐ฒ","aliases":["game_die"]},{"emoji":"๐ง","aliases":["garlic"]},{"emoji":"๐ฌ๐ง","aliases":["gb","uk"]},{"emoji":"โ๏ธ","aliases":["gear"]},{"emoji":"๐","aliases":["gem"]},{"emoji":"โ","aliases":["gemini"]},{"emoji":"๐ง","aliases":["genie"]},{"emoji":"๐งโโ๏ธ","aliases":["genie_man"]},{"emoji":"๐งโโ๏ธ","aliases":["genie_woman"]},{"emoji":"๐ฌ๐ช","aliases":["georgia"]},{"emoji":"๐ฌ๐ญ","aliases":["ghana"]},{"emoji":"๐ป","aliases":["ghost"]},{"emoji":"๐ฌ๐ฎ","aliases":["gibraltar"]},{"emoji":"๐","aliases":["gift"]},{"emoji":"๐","aliases":["gift_heart"]},{"emoji":"๐ฆ","aliases":["giraffe"]},{"emoji":"๐ง","aliases":["girl"]},{"emoji":"๐","aliases":["globe_with_meridians"]},{"emoji":"๐งค","aliases":["gloves"]},{"emoji":"๐ฅ ","aliases":["goal_net"]},{"emoji":"๐","aliases":["goat"]},{"emoji":"๐ฅฝ","aliases":["goggles"]},{"emoji":"โณ","aliases":["golf"]},{"emoji":"๐๏ธ","aliases":["golfing"]},{"emoji":"๐๏ธโโ๏ธ","aliases":["golfing_man"]},{"emoji":"๐๏ธโโ๏ธ","aliases":["golfing_woman"]},{"emoji":"๐ฆ","aliases":["gorilla"]},{"emoji":"๐","aliases":["grapes"]},{"emoji":"๐ฌ๐ท","aliases":["greece"]},{"emoji":"๐","aliases":["green_apple"]},{"emoji":"๐","aliases":["green_book"]},{"emoji":"๐ข","aliases":["green_circle"]},{"emoji":"๐","aliases":["green_heart"]},{"emoji":"๐ฅ","aliases":["green_salad"]},{"emoji":"๐ฉ","aliases":["green_square"]},{"emoji":"๐ฌ๐ฑ","aliases":["greenland"]},{"emoji":"๐ฌ๐ฉ","aliases":["grenada"]},{"emoji":"โ","aliases":["grey_exclamation"]},{"emoji":"โ","aliases":["grey_question"]},{"emoji":"๐ฌ","aliases":["grimacing"]},{"emoji":"๐","aliases":["grin"]},{"emoji":"๐","aliases":["grinning"]},{"emoji":"๐ฌ๐ต","aliases":["guadeloupe"]},{"emoji":"๐ฌ๐บ","aliases":["guam"]},{"emoji":"๐","aliases":["guard"]},{"emoji":"๐โโ๏ธ","aliases":["guardsman"]},{"emoji":"๐โโ๏ธ","aliases":["guardswoman"]},{"emoji":"๐ฌ๐น","aliases":["guatemala"]},{"emoji":"๐ฌ๐ฌ","aliases":["guernsey"]},{"emoji":"๐ฆฎ","aliases":["guide_dog"]},{"emoji":"๐ฌ๐ณ","aliases":["guinea"]},{"emoji":"๐ฌ๐ผ","aliases":["guinea_bissau"]},{"emoji":"๐ธ","aliases":["guitar"]},{"emoji":"๐ซ","aliases":["gun"]},{"emoji":"๐ฌ๐พ","aliases":["guyana"]},{"emoji":"๐","aliases":["haircut"]},{"emoji":"๐โโ๏ธ","aliases":["haircut_man"]},{"emoji":"๐โโ๏ธ","aliases":["haircut_woman"]},{"emoji":"๐ญ๐น","aliases":["haiti"]},{"emoji":"๐","aliases":["hamburger"]},{"emoji":"๐จ","aliases":["hammer"]},{"emoji":"โ๏ธ","aliases":["hammer_and_pick"]},{"emoji":"๐ ๏ธ","aliases":["hammer_and_wrench"]},{"emoji":"๐ชฌ","aliases":["hamsa"]},{"emoji":"๐น","aliases":["hamster"]},{"emoji":"โ","aliases":["hand","raised_hand"]},{"emoji":"๐คญ","aliases":["hand_over_mouth"]},{"emoji":"๐ซฐ","aliases":["hand_with_index_finger_and_thumb_crossed"]},{"emoji":"๐","aliases":["handbag"]},{"emoji":"๐คพ","aliases":["handball_person"]},{"emoji":"๐ค","aliases":["handshake"]},{"emoji":"๐ฉ","aliases":["hankey","poop","shit"]},{"emoji":"#๏ธโฃ","aliases":["hash"]},{"emoji":"๐ฅ","aliases":["hatched_chick"]},{"emoji":"๐ฃ","aliases":["hatching_chick"]},{"emoji":"๐ง","aliases":["headphones"]},{"emoji":"๐ชฆ","aliases":["headstone"]},{"emoji":"๐งโโ๏ธ","aliases":["health_worker"]},{"emoji":"๐","aliases":["hear_no_evil"]},{"emoji":"๐ญ๐ฒ","aliases":["heard_mcdonald_islands"]},{"emoji":"โค๏ธ","aliases":["heart"]},{"emoji":"๐","aliases":["heart_decoration"]},{"emoji":"๐","aliases":["heart_eyes"]},{"emoji":"๐ป","aliases":["heart_eyes_cat"]},{"emoji":"๐ซถ","aliases":["heart_hands"]},{"emoji":"โค๏ธโ๐ฅ","aliases":["heart_on_fire"]},{"emoji":"๐","aliases":["heartbeat"]},{"emoji":"๐","aliases":["heartpulse"]},{"emoji":"โฅ๏ธ","aliases":["hearts"]},{"emoji":"โ๏ธ","aliases":["heavy_check_mark"]},{"emoji":"โ","aliases":["heavy_division_sign"]},{"emoji":"๐ฒ","aliases":["heavy_dollar_sign"]},{"emoji":"๐ฐ","aliases":["heavy_equals_sign"]},{"emoji":"โฃ๏ธ","aliases":["heavy_heart_exclamation"]},{"emoji":"โ","aliases":["heavy_minus_sign"]},{"emoji":"โ๏ธ","aliases":["heavy_multiplication_x"]},{"emoji":"โ","aliases":["heavy_plus_sign"]},{"emoji":"๐ฆ","aliases":["hedgehog"]},{"emoji":"๐","aliases":["helicopter"]},{"emoji":"๐ฟ","aliases":["herb"]},{"emoji":"๐บ","aliases":["hibiscus"]},{"emoji":"๐","aliases":["high_brightness"]},{"emoji":"๐ ","aliases":["high_heel"]},{"emoji":"๐ฅพ","aliases":["hiking_boot"]},{"emoji":"๐","aliases":["hindu_temple"]},{"emoji":"๐ฆ","aliases":["hippopotamus"]},{"emoji":"๐ช","aliases":["hocho","knife"]},{"emoji":"๐ณ๏ธ","aliases":["hole"]},{"emoji":"๐ญ๐ณ","aliases":["honduras"]},{"emoji":"๐ฏ","aliases":["honey_pot"]},{"emoji":"๐ญ๐ฐ","aliases":["hong_kong"]},{"emoji":"๐ช","aliases":["hook"]},{"emoji":"๐ด","aliases":["horse"]},{"emoji":"๐","aliases":["horse_racing"]},{"emoji":"๐ฅ","aliases":["hospital"]},{"emoji":"๐ฅต","aliases":["hot_face"]},{"emoji":"๐ถ๏ธ","aliases":["hot_pepper"]},{"emoji":"๐ญ","aliases":["hotdog"]},{"emoji":"๐จ","aliases":["hotel"]},{"emoji":"โจ๏ธ","aliases":["hotsprings"]},{"emoji":"โ","aliases":["hourglass"]},{"emoji":"โณ","aliases":["hourglass_flowing_sand"]},{"emoji":"๐ ","aliases":["house"]},{"emoji":"๐ก","aliases":["house_with_garden"]},{"emoji":"๐๏ธ","aliases":["houses"]},{"emoji":"๐ค","aliases":["hugs"]},{"emoji":"๐ญ๐บ","aliases":["hungary"]},{"emoji":"๐ฏ","aliases":["hushed"]},{"emoji":"๐","aliases":["hut"]},{"emoji":"๐จ","aliases":["ice_cream"]},{"emoji":"๐ง","aliases":["ice_cube"]},{"emoji":"๐","aliases":["ice_hockey"]},{"emoji":"โธ๏ธ","aliases":["ice_skate"]},{"emoji":"๐ฆ","aliases":["icecream"]},{"emoji":"๐ฎ๐ธ","aliases":["iceland"]},{"emoji":"๐","aliases":["id"]},{"emoji":"๐ชช","aliases":["identification_card"]},{"emoji":"๐","aliases":["ideograph_advantage"]},{"emoji":"๐ฟ","aliases":["imp"]},{"emoji":"๐ฅ","aliases":["inbox_tray"]},{"emoji":"๐จ","aliases":["incoming_envelope"]},{"emoji":"๐ซต","aliases":["index_pointing_at_the_viewer"]},{"emoji":"๐ฎ๐ณ","aliases":["india"]},{"emoji":"๐ฎ๐ฉ","aliases":["indonesia"]},{"emoji":"โพ๏ธ","aliases":["infinity"]},{"emoji":"โน๏ธ","aliases":["information_source"]},{"emoji":"๐","aliases":["innocent"]},{"emoji":"โ๏ธ","aliases":["interrobang"]},{"emoji":"๐ฑ","aliases":["iphone"]},{"emoji":"๐ฎ๐ท","aliases":["iran"]},{"emoji":"๐ฎ๐ถ","aliases":["iraq"]},{"emoji":"๐ฎ๐ช","aliases":["ireland"]},{"emoji":"๐ฎ๐ฒ","aliases":["isle_of_man"]},{"emoji":"๐ฎ๐ฑ","aliases":["israel"]},{"emoji":"๐ฎ๐น","aliases":["it"]},{"emoji":"๐ฎ","aliases":["izakaya_lantern","lantern"]},{"emoji":"๐","aliases":["jack_o_lantern"]},{"emoji":"๐ฏ๐ฒ","aliases":["jamaica"]},{"emoji":"๐พ","aliases":["japan"]},{"emoji":"๐ฏ","aliases":["japanese_castle"]},{"emoji":"๐บ","aliases":["japanese_goblin"]},{"emoji":"๐น","aliases":["japanese_ogre"]},{"emoji":"๐ซ","aliases":["jar"]},{"emoji":"๐","aliases":["jeans"]},{"emoji":"๐ฏ๐ช","aliases":["jersey"]},{"emoji":"๐งฉ","aliases":["jigsaw"]},{"emoji":"๐ฏ๐ด","aliases":["jordan"]},{"emoji":"๐","aliases":["joy"]},{"emoji":"๐น","aliases":["joy_cat"]},{"emoji":"๐น๏ธ","aliases":["joystick"]},{"emoji":"๐ฏ๐ต","aliases":["jp"]},{"emoji":"๐งโโ๏ธ","aliases":["judge"]},{"emoji":"๐คน","aliases":["juggling_person"]},{"emoji":"๐","aliases":["kaaba"]},{"emoji":"๐ฆ","aliases":["kangaroo"]},{"emoji":"๐ฐ๐ฟ","aliases":["kazakhstan"]},{"emoji":"๐ฐ๐ช","aliases":["kenya"]},{"emoji":"๐","aliases":["key"]},{"emoji":"โจ๏ธ","aliases":["keyboard"]},{"emoji":"๐","aliases":["keycap_ten"]},{"emoji":"๐ด","aliases":["kick_scooter"]},{"emoji":"๐","aliases":["kimono"]},{"emoji":"๐ฐ๐ฎ","aliases":["kiribati"]},{"emoji":"๐","aliases":["kiss"]},{"emoji":"๐","aliases":["kissing"]},{"emoji":"๐ฝ","aliases":["kissing_cat"]},{"emoji":"๐","aliases":["kissing_closed_eyes"]},{"emoji":"๐","aliases":["kissing_heart"]},{"emoji":"๐","aliases":["kissing_smiling_eyes"]},{"emoji":"๐ช","aliases":["kite"]},{"emoji":"๐ฅ","aliases":["kiwi_fruit"]},{"emoji":"๐งโโ๏ธ","aliases":["kneeling_man"]},{"emoji":"๐ง","aliases":["kneeling_person"]},{"emoji":"๐งโโ๏ธ","aliases":["kneeling_woman"]},{"emoji":"๐ชข","aliases":["knot"]},{"emoji":"๐จ","aliases":["koala"]},{"emoji":"๐","aliases":["koko"]},{"emoji":"๐ฝ๐ฐ","aliases":["kosovo"]},{"emoji":"๐ฐ๐ท","aliases":["kr"]},{"emoji":"๐ฐ๐ผ","aliases":["kuwait"]},{"emoji":"๐ฐ๐ฌ","aliases":["kyrgyzstan"]},{"emoji":"๐ฅผ","aliases":["lab_coat"]},{"emoji":"๐ท๏ธ","aliases":["label"]},{"emoji":"๐ฅ","aliases":["lacrosse"]},{"emoji":"๐ช","aliases":["ladder"]},{"emoji":"๐","aliases":["lady_beetle"]},{"emoji":"๐ฑ๐ฆ","aliases":["laos"]},{"emoji":"๐ต","aliases":["large_blue_circle"]},{"emoji":"๐ท","aliases":["large_blue_diamond"]},{"emoji":"๐ถ","aliases":["large_orange_diamond"]},{"emoji":"๐","aliases":["last_quarter_moon"]},{"emoji":"๐","aliases":["last_quarter_moon_with_face"]},{"emoji":"โ๏ธ","aliases":["latin_cross"]},{"emoji":"๐ฑ๐ป","aliases":["latvia"]},{"emoji":"๐","aliases":["laughing","satisfied","laugh"]},{"emoji":"๐ฅฌ","aliases":["leafy_green"]},{"emoji":"๐","aliases":["leaves"]},{"emoji":"๐ฑ๐ง","aliases":["lebanon"]},{"emoji":"๐","aliases":["ledger"]},{"emoji":"๐ ","aliases":["left_luggage"]},{"emoji":"โ๏ธ","aliases":["left_right_arrow"]},{"emoji":"๐จ๏ธ","aliases":["left_speech_bubble"]},{"emoji":"โฉ๏ธ","aliases":["leftwards_arrow_with_hook"]},{"emoji":"๐ซฒ","aliases":["leftwards_hand"]},{"emoji":"๐ฆต","aliases":["leg"]},{"emoji":"๐","aliases":["lemon"]},{"emoji":"โ","aliases":["leo"]},{"emoji":"๐","aliases":["leopard"]},{"emoji":"๐ฑ๐ธ","aliases":["lesotho"]},{"emoji":"๐๏ธ","aliases":["level_slider"]},{"emoji":"๐ฑ๐ท","aliases":["liberia"]},{"emoji":"โ","aliases":["libra"]},{"emoji":"๐ฑ๐พ","aliases":["libya"]},{"emoji":"๐ฑ๐ฎ","aliases":["liechtenstein"]},{"emoji":"๐","aliases":["light_rail"]},{"emoji":"๐","aliases":["link"]},{"emoji":"๐ฆ","aliases":["lion"]},{"emoji":"๐","aliases":["lips"]},{"emoji":"๐","aliases":["lipstick"]},{"emoji":"๐ฑ๐น","aliases":["lithuania"]},{"emoji":"๐ฆ","aliases":["lizard"]},{"emoji":"๐ฆ","aliases":["llama"]},{"emoji":"๐ฆ","aliases":["lobster"]},{"emoji":"๐","aliases":["lock"]},{"emoji":"๐","aliases":["lock_with_ink_pen"]},{"emoji":"๐ญ","aliases":["lollipop"]},{"emoji":"๐ช","aliases":["long_drum"]},{"emoji":"โฟ","aliases":["loop"]},{"emoji":"๐งด","aliases":["lotion_bottle"]},{"emoji":"๐ชท","aliases":["lotus"]},{"emoji":"๐ง","aliases":["lotus_position"]},{"emoji":"๐งโโ๏ธ","aliases":["lotus_position_man"]},{"emoji":"๐งโโ๏ธ","aliases":["lotus_position_woman"]},{"emoji":"๐","aliases":["loud_sound"]},{"emoji":"๐ข","aliases":["loudspeaker"]},{"emoji":"๐ฉ","aliases":["love_hotel"]},{"emoji":"๐","aliases":["love_letter"]},{"emoji":"๐ค","aliases":["love_you_gesture"]},{"emoji":"๐ชซ","aliases":["low_battery"]},{"emoji":"๐ ","aliases":["low_brightness"]},{"emoji":"๐งณ","aliases":["luggage"]},{"emoji":"๐ซ","aliases":["lungs"]},{"emoji":"๐ฑ๐บ","aliases":["luxembourg"]},{"emoji":"๐คฅ","aliases":["lying_face"]},{"emoji":"โ๏ธ","aliases":["m"]},{"emoji":"๐ฒ๐ด","aliases":["macau"]},{"emoji":"๐ฒ๐ฐ","aliases":["macedonia"]},{"emoji":"๐ฒ๐ฌ","aliases":["madagascar"]},{"emoji":"๐","aliases":["mag"]},{"emoji":"๐","aliases":["mag_right"]},{"emoji":"๐ง","aliases":["mage"]},{"emoji":"๐งโโ๏ธ","aliases":["mage_man"]},{"emoji":"๐งโโ๏ธ","aliases":["mage_woman"]},{"emoji":"๐ช","aliases":["magic_wand"]},{"emoji":"๐งฒ","aliases":["magnet"]},{"emoji":"๐","aliases":["mahjong"]},{"emoji":"๐ซ","aliases":["mailbox"]},{"emoji":"๐ช","aliases":["mailbox_closed"]},{"emoji":"๐ฌ","aliases":["mailbox_with_mail"]},{"emoji":"๐ญ","aliases":["mailbox_with_no_mail"]},{"emoji":"๐ฒ๐ผ","aliases":["malawi"]},{"emoji":"๐ฒ๐พ","aliases":["malaysia"]},{"emoji":"๐ฒ๐ป","aliases":["maldives"]},{"emoji":"๐ต๏ธโโ๏ธ","aliases":["male_detective"]},{"emoji":"โ๏ธ","aliases":["male_sign"]},{"emoji":"๐ฒ๐ฑ","aliases":["mali"]},{"emoji":"๐ฒ๐น","aliases":["malta"]},{"emoji":"๐ฆฃ","aliases":["mammoth"]},{"emoji":"๐จ","aliases":["man"]},{"emoji":"๐จโ๐จ","aliases":["man_artist"]},{"emoji":"๐จโ๐","aliases":["man_astronaut"]},{"emoji":"๐งโโ๏ธ","aliases":["man_beard"]},{"emoji":"๐คธโโ๏ธ","aliases":["man_cartwheeling"]},{"emoji":"๐จโ๐ณ","aliases":["man_cook"]},{"emoji":"๐บ","aliases":["man_dancing"]},{"emoji":"๐คฆโโ๏ธ","aliases":["man_facepalming"]},{"emoji":"๐จโ๐ญ","aliases":["man_factory_worker"]},{"emoji":"๐จโ๐พ","aliases":["man_farmer"]},{"emoji":"๐จโ๐ผ","aliases":["man_feeding_baby"]},{"emoji":"๐จโ๐","aliases":["man_firefighter"]},{"emoji":"๐จโโ๏ธ","aliases":["man_health_worker"]},{"emoji":"๐จโ๐ฆฝ","aliases":["man_in_manual_wheelchair"]},{"emoji":"๐จโ๐ฆผ","aliases":["man_in_motorized_wheelchair"]},{"emoji":"๐คตโโ๏ธ","aliases":["man_in_tuxedo"]},{"emoji":"๐จโโ๏ธ","aliases":["man_judge"]},{"emoji":"๐คนโโ๏ธ","aliases":["man_juggling"]},{"emoji":"๐จโ๐ง","aliases":["man_mechanic"]},{"emoji":"๐จโ๐ผ","aliases":["man_office_worker"]},{"emoji":"๐จโโ๏ธ","aliases":["man_pilot"]},{"emoji":"๐คพโโ๏ธ","aliases":["man_playing_handball"]},{"emoji":"๐คฝโโ๏ธ","aliases":["man_playing_water_polo"]},{"emoji":"๐จโ๐ฌ","aliases":["man_scientist"]},{"emoji":"๐คทโโ๏ธ","aliases":["man_shrugging"]},{"emoji":"๐จโ๐ค","aliases":["man_singer"]},{"emoji":"๐จโ๐","aliases":["man_student"]},{"emoji":"๐จโ๐ซ","aliases":["man_teacher"]},{"emoji":"๐จโ๐ป","aliases":["man_technologist"]},{"emoji":"๐ฒ","aliases":["man_with_gua_pi_mao"]},{"emoji":"๐จโ๐ฆฏ","aliases":["man_with_probing_cane"]},{"emoji":"๐ณโโ๏ธ","aliases":["man_with_turban"]},{"emoji":"๐ฐโโ๏ธ","aliases":["man_with_veil"]},{"emoji":"๐ฅญ","aliases":["mango"]},{"emoji":"๐","aliases":["mans_shoe","shoe"]},{"emoji":"๐ฐ๏ธ","aliases":["mantelpiece_clock"]},{"emoji":"๐ฆฝ","aliases":["manual_wheelchair"]},{"emoji":"๐","aliases":["maple_leaf"]},{"emoji":"๐ฒ๐ญ","aliases":["marshall_islands"]},{"emoji":"๐ฅ","aliases":["martial_arts_uniform"]},{"emoji":"๐ฒ๐ถ","aliases":["martinique"]},{"emoji":"๐ท","aliases":["mask"]},{"emoji":"๐","aliases":["massage"]},{"emoji":"๐โโ๏ธ","aliases":["massage_man"]},{"emoji":"๐โโ๏ธ","aliases":["massage_woman"]},{"emoji":"๐ง","aliases":["mate"]},{"emoji":"๐ฒ๐ท","aliases":["mauritania"]},{"emoji":"๐ฒ๐บ","aliases":["mauritius"]},{"emoji":"๐พ๐น","aliases":["mayotte"]},{"emoji":"๐","aliases":["meat_on_bone"]},{"emoji":"๐งโ๐ง","aliases":["mechanic"]},{"emoji":"๐ฆพ","aliases":["mechanical_arm"]},{"emoji":"๐ฆฟ","aliases":["mechanical_leg"]},{"emoji":"๐๏ธ","aliases":["medal_military"]},{"emoji":"๐ ","aliases":["medal_sports"]},{"emoji":"โ๏ธ","aliases":["medical_symbol"]},{"emoji":"๐ฃ","aliases":["mega"]},{"emoji":"๐","aliases":["melon"]},{"emoji":"๐ซ ","aliases":["melting_face"]},{"emoji":"๐","aliases":["memo","pencil"]},{"emoji":"๐คผโโ๏ธ","aliases":["men_wrestling"]},{"emoji":"โค๏ธโ๐ฉน","aliases":["mending_heart"]},{"emoji":"๐","aliases":["menorah"]},{"emoji":"๐น","aliases":["mens"]},{"emoji":"๐งโโ๏ธ","aliases":["mermaid"]},{"emoji":"๐งโโ๏ธ","aliases":["merman"]},{"emoji":"๐ง","aliases":["merperson"]},{"emoji":"๐ค","aliases":["metal"]},{"emoji":"๐","aliases":["metro"]},{"emoji":"๐ฒ๐ฝ","aliases":["mexico"]},{"emoji":"๐ฆ ","aliases":["microbe"]},{"emoji":"๐ซ๐ฒ","aliases":["micronesia"]},{"emoji":"๐ค","aliases":["microphone"]},{"emoji":"๐ฌ","aliases":["microscope"]},{"emoji":"๐","aliases":["middle_finger","fu"]},{"emoji":"๐ช","aliases":["military_helmet"]},{"emoji":"๐ฅ","aliases":["milk_glass"]},{"emoji":"๐","aliases":["milky_way"]},{"emoji":"๐","aliases":["minibus"]},{"emoji":"๐ฝ","aliases":["minidisc"]},{"emoji":"๐ช","aliases":["mirror"]},{"emoji":"๐ชฉ","aliases":["mirror_ball"]},{"emoji":"๐ด","aliases":["mobile_phone_off"]},{"emoji":"๐ฒ๐ฉ","aliases":["moldova"]},{"emoji":"๐ฒ๐จ","aliases":["monaco"]},{"emoji":"๐ค","aliases":["money_mouth_face"]},{"emoji":"๐ธ","aliases":["money_with_wings"]},{"emoji":"๐ฐ","aliases":["moneybag"]},{"emoji":"๐ฒ๐ณ","aliases":["mongolia"]},{"emoji":"๐","aliases":["monkey"]},{"emoji":"๐ต","aliases":["monkey_face"]},{"emoji":"๐ง","aliases":["monocle_face"]},{"emoji":"๐","aliases":["monorail"]},{"emoji":"๐ฒ๐ช","aliases":["montenegro"]},{"emoji":"๐ฒ๐ธ","aliases":["montserrat"]},{"emoji":"๐","aliases":["moon","waxing_gibbous_moon"]},{"emoji":"๐ฅฎ","aliases":["moon_cake"]},{"emoji":"๐ฒ๐ฆ","aliases":["morocco"]},{"emoji":"๐","aliases":["mortar_board"]},{"emoji":"๐","aliases":["mosque"]},{"emoji":"๐ฆ","aliases":["mosquito"]},{"emoji":"๐ฅ๏ธ","aliases":["motor_boat"]},{"emoji":"๐ต","aliases":["motor_scooter"]},{"emoji":"๐๏ธ","aliases":["motorcycle"]},{"emoji":"๐ฆผ","aliases":["motorized_wheelchair"]},{"emoji":"๐ฃ๏ธ","aliases":["motorway"]},{"emoji":"๐ป","aliases":["mount_fuji"]},{"emoji":"โฐ๏ธ","aliases":["mountain"]},{"emoji":"๐ต","aliases":["mountain_bicyclist"]},{"emoji":"๐ตโโ๏ธ","aliases":["mountain_biking_man"]},{"emoji":"๐ตโโ๏ธ","aliases":["mountain_biking_woman"]},{"emoji":"๐ ","aliases":["mountain_cableway"]},{"emoji":"๐","aliases":["mountain_railway"]},{"emoji":"๐๏ธ","aliases":["mountain_snow"]},{"emoji":"๐ญ","aliases":["mouse"]},{"emoji":"๐","aliases":["mouse2"]},{"emoji":"๐ชค","aliases":["mouse_trap"]},{"emoji":"๐ฅ","aliases":["movie_camera"]},{"emoji":"๐ฟ","aliases":["moyai"]},{"emoji":"๐ฒ๐ฟ","aliases":["mozambique"]},{"emoji":"๐คถ","aliases":["mrs_claus"]},{"emoji":"๐ช","aliases":["muscle"]},{"emoji":"๐","aliases":["mushroom"]},{"emoji":"๐น","aliases":["musical_keyboard"]},{"emoji":"๐ต","aliases":["musical_note"]},{"emoji":"๐ผ","aliases":["musical_score"]},{"emoji":"๐","aliases":["mute"]},{"emoji":"๐งโ๐","aliases":["mx_claus"]},{"emoji":"๐ฒ๐ฒ","aliases":["myanmar"]},{"emoji":"๐ ","aliases":["nail_care"]},{"emoji":"๐","aliases":["name_badge"]},{"emoji":"๐ณ๐ฆ","aliases":["namibia"]},{"emoji":"๐๏ธ","aliases":["national_park"]},{"emoji":"๐ณ๐ท","aliases":["nauru"]},{"emoji":"๐คข","aliases":["nauseated_face"]},{"emoji":"๐งฟ","aliases":["nazar_amulet"]},{"emoji":"๐","aliases":["necktie"]},{"emoji":"โ","aliases":["negative_squared_cross_mark"]},{"emoji":"๐ณ๐ต","aliases":["nepal"]},{"emoji":"๐ค","aliases":["nerd_face"]},{"emoji":"๐ชบ","aliases":["nest_with_eggs"]},{"emoji":"๐ช","aliases":["nesting_dolls"]},{"emoji":"๐ณ๐ฑ","aliases":["netherlands"]},{"emoji":"๐","aliases":["neutral_face"]},{"emoji":"๐","aliases":["new"]},{"emoji":"๐ณ๐จ","aliases":["new_caledonia"]},{"emoji":"๐","aliases":["new_moon"]},{"emoji":"๐","aliases":["new_moon_with_face"]},{"emoji":"๐ณ๐ฟ","aliases":["new_zealand"]},{"emoji":"๐ฐ","aliases":["newspaper"]},{"emoji":"๐๏ธ","aliases":["newspaper_roll"]},{"emoji":"โญ๏ธ","aliases":["next_track_button"]},{"emoji":"๐","aliases":["ng"]},{"emoji":"๐ณ๐ฎ","aliases":["nicaragua"]},{"emoji":"๐ณ๐ช","aliases":["niger"]},{"emoji":"๐ณ๐ฌ","aliases":["nigeria"]},{"emoji":"๐","aliases":["night_with_stars"]},{"emoji":"9๏ธโฃ","aliases":["nine"]},{"emoji":"๐ฅท","aliases":["ninja"]},{"emoji":"๐ณ๐บ","aliases":["niue"]},{"emoji":"๐","aliases":["no_bell"]},{"emoji":"๐ณ","aliases":["no_bicycles"]},{"emoji":"โ","aliases":["no_entry"]},{"emoji":"๐ซ","aliases":["no_entry_sign"]},{"emoji":"๐ ","aliases":["no_good"]},{"emoji":"๐ โโ๏ธ","aliases":["no_good_man","ng_man"]},{"emoji":"๐ โโ๏ธ","aliases":["no_good_woman","ng_woman"]},{"emoji":"๐ต","aliases":["no_mobile_phones"]},{"emoji":"๐ถ","aliases":["no_mouth"]},{"emoji":"๐ท","aliases":["no_pedestrians"]},{"emoji":"๐ญ","aliases":["no_smoking"]},{"emoji":"๐ฑ","aliases":["non-potable_water"]},{"emoji":"๐ณ๐ซ","aliases":["norfolk_island"]},{"emoji":"๐ฐ๐ต","aliases":["north_korea"]},{"emoji":"๐ฒ๐ต","aliases":["northern_mariana_islands"]},{"emoji":"๐ณ๐ด","aliases":["norway"]},{"emoji":"๐","aliases":["nose"]},{"emoji":"๐","aliases":["notebook"]},{"emoji":"๐","aliases":["notebook_with_decorative_cover"]},{"emoji":"๐ถ","aliases":["notes"]},{"emoji":"๐ฉ","aliases":["nut_and_bolt"]},{"emoji":"โญ","aliases":["o"]},{"emoji":"๐ พ๏ธ","aliases":["o2"]},{"emoji":"๐","aliases":["ocean"]},{"emoji":"๐","aliases":["octopus"]},{"emoji":"๐ข","aliases":["oden"]},{"emoji":"๐ข","aliases":["office"]},{"emoji":"๐งโ๐ผ","aliases":["office_worker"]},{"emoji":"๐ข๏ธ","aliases":["oil_drum"]},{"emoji":"๐","aliases":["ok"]},{"emoji":"๐","aliases":["ok_hand"]},{"emoji":"๐โโ๏ธ","aliases":["ok_man"]},{"emoji":"๐","aliases":["ok_person"]},{"emoji":"๐โโ๏ธ","aliases":["ok_woman"]},{"emoji":"๐๏ธ","aliases":["old_key"]},{"emoji":"๐ง","aliases":["older_adult"]},{"emoji":"๐ด","aliases":["older_man"]},{"emoji":"๐ต","aliases":["older_woman"]},{"emoji":"๐ซ","aliases":["olive"]},{"emoji":"๐๏ธ","aliases":["om"]},{"emoji":"๐ด๐ฒ","aliases":["oman"]},{"emoji":"๐","aliases":["on"]},{"emoji":"๐","aliases":["oncoming_automobile"]},{"emoji":"๐","aliases":["oncoming_bus"]},{"emoji":"๐","aliases":["oncoming_police_car"]},{"emoji":"๐","aliases":["oncoming_taxi"]},{"emoji":"1๏ธโฃ","aliases":["one"]},{"emoji":"๐ฉฑ","aliases":["one_piece_swimsuit"]},{"emoji":"๐ง ","aliases":["onion"]},{"emoji":"๐","aliases":["open_file_folder"]},{"emoji":"๐","aliases":["open_hands"]},{"emoji":"๐ฎ","aliases":["open_mouth"]},{"emoji":"โ๏ธ","aliases":["open_umbrella"]},{"emoji":"โ","aliases":["ophiuchus"]},{"emoji":"๐","aliases":["orange_book"]},{"emoji":"๐ ","aliases":["orange_circle"]},{"emoji":"๐งก","aliases":["orange_heart"]},{"emoji":"๐ง","aliases":["orange_square"]},{"emoji":"๐ฆง","aliases":["orangutan"]},{"emoji":"โฆ๏ธ","aliases":["orthodox_cross"]},{"emoji":"๐ฆฆ","aliases":["otter"]},{"emoji":"๐ค","aliases":["outbox_tray"]},{"emoji":"๐ฆ","aliases":["owl"]},{"emoji":"๐","aliases":["ox"]},{"emoji":"๐ฆช","aliases":["oyster"]},{"emoji":"๐ฆ","aliases":["package"]},{"emoji":"๐","aliases":["page_facing_up"]},{"emoji":"๐","aliases":["page_with_curl"]},{"emoji":"๐","aliases":["pager"]},{"emoji":"๐๏ธ","aliases":["paintbrush"]},{"emoji":"๐ต๐ฐ","aliases":["pakistan"]},{"emoji":"๐ต๐ผ","aliases":["palau"]},{"emoji":"๐ต๐ธ","aliases":["palestinian_territories"]},{"emoji":"๐ซณ","aliases":["palm_down_hand"]},{"emoji":"๐ด","aliases":["palm_tree"]},{"emoji":"๐ซด","aliases":["palm_up_hand"]},{"emoji":"๐คฒ","aliases":["palms_up_together"]},{"emoji":"๐ต๐ฆ","aliases":["panama"]},{"emoji":"๐ฅ","aliases":["pancakes"]},{"emoji":"๐ผ","aliases":["panda_face"]},{"emoji":"๐","aliases":["paperclip"]},{"emoji":"๐๏ธ","aliases":["paperclips"]},{"emoji":"๐ต๐ฌ","aliases":["papua_new_guinea"]},{"emoji":"๐ช","aliases":["parachute"]},{"emoji":"๐ต๐พ","aliases":["paraguay"]},{"emoji":"โฑ๏ธ","aliases":["parasol_on_ground"]},{"emoji":"๐ ฟ๏ธ","aliases":["parking"]},{"emoji":"๐ฆ","aliases":["parrot"]},{"emoji":"ใฝ๏ธ","aliases":["part_alternation_mark"]},{"emoji":"โ ","aliases":["partly_sunny"]},{"emoji":"๐ฅณ","aliases":["partying_face"]},{"emoji":"๐ณ๏ธ","aliases":["passenger_ship"]},{"emoji":"๐","aliases":["passport_control"]},{"emoji":"โธ๏ธ","aliases":["pause_button"]},{"emoji":"โฎ๏ธ","aliases":["peace_symbol"]},{"emoji":"๐","aliases":["peach"]},{"emoji":"๐ฆ","aliases":["peacock"]},{"emoji":"๐ฅ","aliases":["peanuts"]},{"emoji":"๐","aliases":["pear"]},{"emoji":"๐๏ธ","aliases":["pen"]},{"emoji":"โ๏ธ","aliases":["pencil2"]},{"emoji":"๐ง","aliases":["penguin"]},{"emoji":"๐","aliases":["pensive"]},{"emoji":"๐งโ๐คโ๐ง","aliases":["people_holding_hands"]},{"emoji":"๐ซ","aliases":["people_hugging"]},{"emoji":"๐ญ","aliases":["performing_arts"]},{"emoji":"๐ฃ","aliases":["persevere"]},{"emoji":"๐งโ๐ฆฒ","aliases":["person_bald"]},{"emoji":"๐งโ๐ฆฑ","aliases":["person_curly_hair"]},{"emoji":"๐งโ๐ผ","aliases":["person_feeding_baby"]},{"emoji":"๐คบ","aliases":["person_fencing"]},{"emoji":"๐งโ๐ฆฝ","aliases":["person_in_manual_wheelchair"]},{"emoji":"๐งโ๐ฆผ","aliases":["person_in_motorized_wheelchair"]},{"emoji":"๐คต","aliases":["person_in_tuxedo"]},{"emoji":"๐งโ๐ฆฐ","aliases":["person_red_hair"]},{"emoji":"๐งโ๐ฆณ","aliases":["person_white_hair"]},{"emoji":"๐ซ ","aliases":["person_with_crown"]},{"emoji":"๐งโ๐ฆฏ","aliases":["person_with_probing_cane"]},{"emoji":"๐ณ","aliases":["person_with_turban"]},{"emoji":"๐ฐ","aliases":["person_with_veil"]},{"emoji":"๐ต๐ช","aliases":["peru"]},{"emoji":"๐งซ","aliases":["petri_dish"]},{"emoji":"๐ต๐ญ","aliases":["philippines"]},{"emoji":"โ๏ธ","aliases":["phone","telephone"]},{"emoji":"โ๏ธ","aliases":["pick"]},{"emoji":"๐ป","aliases":["pickup_truck"]},{"emoji":"๐ฅง","aliases":["pie"]},{"emoji":"๐ท","aliases":["pig"]},{"emoji":"๐","aliases":["pig2"]},{"emoji":"๐ฝ","aliases":["pig_nose"]},{"emoji":"๐","aliases":["pill"]},{"emoji":"๐งโโ๏ธ","aliases":["pilot"]},{"emoji":"๐ช ","aliases":["pinata"]},{"emoji":"๐ค","aliases":["pinched_fingers"]},{"emoji":"๐ค","aliases":["pinching_hand"]},{"emoji":"๐","aliases":["pineapple"]},{"emoji":"๐","aliases":["ping_pong"]},{"emoji":"๐ดโโ ๏ธ","aliases":["pirate_flag"]},{"emoji":"โ","aliases":["pisces"]},{"emoji":"๐ต๐ณ","aliases":["pitcairn_islands"]},{"emoji":"๐","aliases":["pizza"]},{"emoji":"๐ชง","aliases":["placard"]},{"emoji":"๐","aliases":["place_of_worship"]},{"emoji":"๐ฝ๏ธ","aliases":["plate_with_cutlery"]},{"emoji":"โฏ๏ธ","aliases":["play_or_pause_button"]},{"emoji":"๐","aliases":["playground_slide"]},{"emoji":"๐ฅบ","aliases":["pleading_face"]},{"emoji":"๐ช ","aliases":["plunger"]},{"emoji":"๐","aliases":["point_down"]},{"emoji":"๐","aliases":["point_left"]},{"emoji":"๐","aliases":["point_right"]},{"emoji":"โ๏ธ","aliases":["point_up"]},{"emoji":"๐","aliases":["point_up_2"]},{"emoji":"๐ต๐ฑ","aliases":["poland"]},{"emoji":"๐ปโโ๏ธ","aliases":["polar_bear"]},{"emoji":"๐","aliases":["police_car"]},{"emoji":"๐ฎ","aliases":["police_officer","cop"]},{"emoji":"๐ฎโโ๏ธ","aliases":["policeman"]},{"emoji":"๐ฎโโ๏ธ","aliases":["policewoman"]},{"emoji":"๐ฉ","aliases":["poodle"]},{"emoji":"๐ฟ","aliases":["popcorn"]},{"emoji":"๐ต๐น","aliases":["portugal"]},{"emoji":"๐ฃ","aliases":["post_office"]},{"emoji":"๐ฏ","aliases":["postal_horn"]},{"emoji":"๐ฎ","aliases":["postbox"]},{"emoji":"๐ฐ","aliases":["potable_water"]},{"emoji":"๐ฅ","aliases":["potato"]},{"emoji":"๐ชด","aliases":["potted_plant"]},{"emoji":"๐","aliases":["pouch"]},{"emoji":"๐","aliases":["poultry_leg"]},{"emoji":"๐ท","aliases":["pound"]},{"emoji":"๐ซ","aliases":["pouring_liquid"]},{"emoji":"๐พ","aliases":["pouting_cat"]},{"emoji":"๐","aliases":["pouting_face"]},{"emoji":"๐โโ๏ธ","aliases":["pouting_man"]},{"emoji":"๐โโ๏ธ","aliases":["pouting_woman"]},{"emoji":"๐","aliases":["pray"]},{"emoji":"๐ฟ","aliases":["prayer_beads"]},{"emoji":"๐ซ","aliases":["pregnant_man"]},{"emoji":"๐ซ","aliases":["pregnant_person"]},{"emoji":"๐คฐ","aliases":["pregnant_woman"]},{"emoji":"๐ฅจ","aliases":["pretzel"]},{"emoji":"โฎ๏ธ","aliases":["previous_track_button"]},{"emoji":"๐คด","aliases":["prince"]},{"emoji":"๐ธ","aliases":["princess"]},{"emoji":"๐จ๏ธ","aliases":["printer"]},{"emoji":"๐ฆฏ","aliases":["probing_cane"]},{"emoji":"๐ต๐ท","aliases":["puerto_rico"]},{"emoji":"๐ฃ","aliases":["purple_circle"]},{"emoji":"๐","aliases":["purple_heart"]},{"emoji":"๐ช","aliases":["purple_square"]},{"emoji":"๐","aliases":["purse"]},{"emoji":"๐","aliases":["pushpin"]},{"emoji":"๐ฎ","aliases":["put_litter_in_its_place"]},{"emoji":"๐ถ๐ฆ","aliases":["qatar"]},{"emoji":"โ","aliases":["question"]},{"emoji":"๐ฐ","aliases":["rabbit"]},{"emoji":"๐","aliases":["rabbit2"]},{"emoji":"๐ฆ","aliases":["raccoon"]},{"emoji":"๐","aliases":["racehorse"]},{"emoji":"๐๏ธ","aliases":["racing_car"]},{"emoji":"๐ป","aliases":["radio"]},{"emoji":"๐","aliases":["radio_button"]},{"emoji":"โข๏ธ","aliases":["radioactive"]},{"emoji":"๐ก","aliases":["rage","pout"]},{"emoji":"๐","aliases":["railway_car"]},{"emoji":"๐ค๏ธ","aliases":["railway_track"]},{"emoji":"๐","aliases":["rainbow"]},{"emoji":"๐ณ๏ธโ๐","aliases":["rainbow_flag"]},{"emoji":"๐ค","aliases":["raised_back_of_hand"]},{"emoji":"๐คจ","aliases":["raised_eyebrow"]},{"emoji":"๐๏ธ","aliases":["raised_hand_with_fingers_splayed"]},{"emoji":"๐","aliases":["raised_hands"]},{"emoji":"๐","aliases":["raising_hand"]},{"emoji":"๐โโ๏ธ","aliases":["raising_hand_man"]},{"emoji":"๐โโ๏ธ","aliases":["raising_hand_woman"]},{"emoji":"๐","aliases":["ram"]},{"emoji":"๐","aliases":["ramen"]},{"emoji":"๐","aliases":["rat"]},{"emoji":"๐ช","aliases":["razor"]},{"emoji":"๐งพ","aliases":["receipt"]},{"emoji":"โบ๏ธ","aliases":["record_button"]},{"emoji":"โป๏ธ","aliases":["recycle"]},{"emoji":"๐ด","aliases":["red_circle"]},{"emoji":"๐งง","aliases":["red_envelope"]},{"emoji":"๐จโ๐ฆฐ","aliases":["red_haired_man"]},{"emoji":"๐ฉโ๐ฆฐ","aliases":["red_haired_woman"]},{"emoji":"๐ฅ","aliases":["red_square"]},{"emoji":"ยฎ๏ธ","aliases":["registered"]},{"emoji":"โบ๏ธ","aliases":["relaxed"]},{"emoji":"๐","aliases":["relieved"]},{"emoji":"๐๏ธ","aliases":["reminder_ribbon"]},{"emoji":"๐","aliases":["repeat"]},{"emoji":"๐","aliases":["repeat_one"]},{"emoji":"โ๏ธ","aliases":["rescue_worker_helmet"]},{"emoji":"๐ป","aliases":["restroom"]},{"emoji":"๐ท๐ช","aliases":["reunion"]},{"emoji":"๐","aliases":["revolving_hearts"]},{"emoji":"โช","aliases":["rewind"]},{"emoji":"๐ฆ","aliases":["rhinoceros"]},{"emoji":"๐","aliases":["ribbon"]},{"emoji":"๐","aliases":["rice"]},{"emoji":"๐","aliases":["rice_ball"]},{"emoji":"๐","aliases":["rice_cracker"]},{"emoji":"๐","aliases":["rice_scene"]},{"emoji":"๐ฏ๏ธ","aliases":["right_anger_bubble"]},{"emoji":"๐ซฑ","aliases":["rightwards_hand"]},{"emoji":"๐","aliases":["ring"]},{"emoji":"๐","aliases":["ring_buoy"]},{"emoji":"๐ช","aliases":["ringed_planet"]},{"emoji":"๐ค","aliases":["robot"]},{"emoji":"๐ชจ","aliases":["rock"]},{"emoji":"๐","aliases":["rocket"]},{"emoji":"๐คฃ","aliases":["rofl"]},{"emoji":"๐","aliases":["roll_eyes"]},{"emoji":"๐งป","aliases":["roll_of_paper"]},{"emoji":"๐ข","aliases":["roller_coaster"]},{"emoji":"๐ผ","aliases":["roller_skate"]},{"emoji":"๐ท๐ด","aliases":["romania"]},{"emoji":"๐","aliases":["rooster"]},{"emoji":"๐น","aliases":["rose"]},{"emoji":"๐ต๏ธ","aliases":["rosette"]},{"emoji":"๐จ","aliases":["rotating_light"]},{"emoji":"๐","aliases":["round_pushpin"]},{"emoji":"๐ฃ","aliases":["rowboat"]},{"emoji":"๐ฃโโ๏ธ","aliases":["rowing_man"]},{"emoji":"๐ฃโโ๏ธ","aliases":["rowing_woman"]},{"emoji":"๐ท๐บ","aliases":["ru"]},{"emoji":"๐","aliases":["rugby_football"]},{"emoji":"๐","aliases":["runner","running"]},{"emoji":"๐โโ๏ธ","aliases":["running_man"]},{"emoji":"๐ฝ","aliases":["running_shirt_with_sash"]},{"emoji":"๐โโ๏ธ","aliases":["running_woman"]},{"emoji":"๐ท๐ผ","aliases":["rwanda"]},{"emoji":"๐๏ธ","aliases":["sa"]},{"emoji":"๐งท","aliases":["safety_pin"]},{"emoji":"๐ฆบ","aliases":["safety_vest"]},{"emoji":"โ","aliases":["sagittarius"]},{"emoji":"๐ถ","aliases":["sake"]},{"emoji":"๐ง","aliases":["salt"]},{"emoji":"๐ซก","aliases":["saluting_face"]},{"emoji":"๐ผ๐ธ","aliases":["samoa"]},{"emoji":"๐ธ๐ฒ","aliases":["san_marino"]},{"emoji":"๐ก","aliases":["sandal"]},{"emoji":"๐ฅช","aliases":["sandwich"]},{"emoji":"๐ ","aliases":["santa"]},{"emoji":"๐ธ๐น","aliases":["sao_tome_principe"]},{"emoji":"๐ฅป","aliases":["sari"]},{"emoji":"๐ก","aliases":["satellite"]},{"emoji":"๐ธ๐ฆ","aliases":["saudi_arabia"]},{"emoji":"๐งโโ๏ธ","aliases":["sauna_man"]},{"emoji":"๐ง","aliases":["sauna_person"]},{"emoji":"๐งโโ๏ธ","aliases":["sauna_woman"]},{"emoji":"๐ฆ","aliases":["sauropod"]},{"emoji":"๐ท","aliases":["saxophone"]},{"emoji":"๐งฃ","aliases":["scarf"]},{"emoji":"๐ซ","aliases":["school"]},{"emoji":"๐","aliases":["school_satchel"]},{"emoji":"๐งโ๐ฌ","aliases":["scientist"]},{"emoji":"โ๏ธ","aliases":["scissors"]},{"emoji":"๐ฆ","aliases":["scorpion"]},{"emoji":"โ","aliases":["scorpius"]},{"emoji":"๐ด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ","aliases":["scotland"]},{"emoji":"๐ฑ","aliases":["scream"]},{"emoji":"๐","aliases":["scream_cat"]},{"emoji":"๐ช","aliases":["screwdriver"]},{"emoji":"๐","aliases":["scroll"]},{"emoji":"๐ฆญ","aliases":["seal"]},{"emoji":"๐บ","aliases":["seat"]},{"emoji":"ใ๏ธ","aliases":["secret"]},{"emoji":"๐","aliases":["see_no_evil"]},{"emoji":"๐ฑ","aliases":["seedling"]},{"emoji":"๐คณ","aliases":["selfie"]},{"emoji":"๐ธ๐ณ","aliases":["senegal"]},{"emoji":"๐ท๐ธ","aliases":["serbia"]},{"emoji":"๐โ๐ฆบ","aliases":["service_dog"]},{"emoji":"7๏ธโฃ","aliases":["seven"]},{"emoji":"๐ชก","aliases":["sewing_needle"]},{"emoji":"๐ธ๐จ","aliases":["seychelles"]},{"emoji":"๐ฅ","aliases":["shallow_pan_of_food"]},{"emoji":"โ๏ธ","aliases":["shamrock"]},{"emoji":"๐ฆ","aliases":["shark"]},{"emoji":"๐ง","aliases":["shaved_ice"]},{"emoji":"๐","aliases":["sheep"]},{"emoji":"๐","aliases":["shell"]},{"emoji":"๐ก๏ธ","aliases":["shield"]},{"emoji":"โฉ๏ธ","aliases":["shinto_shrine"]},{"emoji":"๐ข","aliases":["ship"]},{"emoji":"๐","aliases":["shirt","tshirt"]},{"emoji":"๐๏ธ","aliases":["shopping"]},{"emoji":"๐","aliases":["shopping_cart"]},{"emoji":"๐ฉณ","aliases":["shorts"]},{"emoji":"๐ฟ","aliases":["shower"]},{"emoji":"๐ฆ","aliases":["shrimp"]},{"emoji":"๐คท","aliases":["shrug"]},{"emoji":"๐คซ","aliases":["shushing_face"]},{"emoji":"๐ธ๐ฑ","aliases":["sierra_leone"]},{"emoji":"๐ถ","aliases":["signal_strength"]},{"emoji":"๐ธ๐ฌ","aliases":["singapore"]},{"emoji":"๐งโ๐ค","aliases":["singer"]},{"emoji":"๐ธ๐ฝ","aliases":["sint_maarten"]},{"emoji":"6๏ธโฃ","aliases":["six"]},{"emoji":"๐ฏ","aliases":["six_pointed_star"]},{"emoji":"๐น","aliases":["skateboard"]},{"emoji":"๐ฟ","aliases":["ski"]},{"emoji":"โท๏ธ","aliases":["skier"]},{"emoji":"๐","aliases":["skull"]},{"emoji":"โ ๏ธ","aliases":["skull_and_crossbones"]},{"emoji":"๐ฆจ","aliases":["skunk"]},{"emoji":"๐ท","aliases":["sled"]},{"emoji":"๐ด","aliases":["sleeping"]},{"emoji":"๐","aliases":["sleeping_bed"]},{"emoji":"๐ช","aliases":["sleepy"]},{"emoji":"๐","aliases":["slightly_frowning_face"]},{"emoji":"๐","aliases":["slightly_smiling_face"]},{"emoji":"๐ฐ","aliases":["slot_machine"]},{"emoji":"๐ฆฅ","aliases":["sloth"]},{"emoji":"๐ธ๐ฐ","aliases":["slovakia"]},{"emoji":"๐ธ๐ฎ","aliases":["slovenia"]},{"emoji":"๐ฉ๏ธ","aliases":["small_airplane"]},{"emoji":"๐น","aliases":["small_blue_diamond"]},{"emoji":"๐ธ","aliases":["small_orange_diamond"]},{"emoji":"๐บ","aliases":["small_red_triangle"]},{"emoji":"๐ป","aliases":["small_red_triangle_down"]},{"emoji":"๐","aliases":["smile"]},{"emoji":"๐ธ","aliases":["smile_cat"]},{"emoji":"๐","aliases":["smiley"]},{"emoji":"๐บ","aliases":["smiley_cat"]},{"emoji":"๐ฅฒ","aliases":["smiling_face_with_tear"]},{"emoji":"๐ฅฐ","aliases":["smiling_face_with_three_hearts"]},{"emoji":"๐","aliases":["smiling_imp"]},{"emoji":"๐","aliases":["smirk"]},{"emoji":"๐ผ","aliases":["smirk_cat"]},{"emoji":"๐ฌ","aliases":["smoking"]},{"emoji":"๐","aliases":["snail"]},{"emoji":"๐","aliases":["snake"]},{"emoji":"๐คง","aliases":["sneezing_face"]},{"emoji":"๐","aliases":["snowboarder"]},{"emoji":"โ๏ธ","aliases":["snowflake"]},{"emoji":"โ","aliases":["snowman"]},{"emoji":"โ๏ธ","aliases":["snowman_with_snow"]},{"emoji":"๐งผ","aliases":["soap"]},{"emoji":"๐ญ","aliases":["sob"]},{"emoji":"โฝ","aliases":["soccer"]},{"emoji":"๐งฆ","aliases":["socks"]},{"emoji":"๐ฅ","aliases":["softball"]},{"emoji":"๐ธ๐ง","aliases":["solomon_islands"]},{"emoji":"๐ธ๐ด","aliases":["somalia"]},{"emoji":"๐","aliases":["soon"]},{"emoji":"๐","aliases":["sos"]},{"emoji":"๐","aliases":["sound"]},{"emoji":"๐ฟ๐ฆ","aliases":["south_africa"]},{"emoji":"๐ฌ๐ธ","aliases":["south_georgia_south_sandwich_islands"]},{"emoji":"๐ธ๐ธ","aliases":["south_sudan"]},{"emoji":"๐พ","aliases":["space_invader"]},{"emoji":"โ ๏ธ","aliases":["spades"]},{"emoji":"๐","aliases":["spaghetti"]},{"emoji":"โ๏ธ","aliases":["sparkle"]},{"emoji":"๐","aliases":["sparkler"]},{"emoji":"โจ","aliases":["sparkles"]},{"emoji":"๐","aliases":["sparkling_heart"]},{"emoji":"๐","aliases":["speak_no_evil"]},{"emoji":"๐","aliases":["speaker"]},{"emoji":"๐ฃ๏ธ","aliases":["speaking_head"]},{"emoji":"๐ฌ","aliases":["speech_balloon"]},{"emoji":"๐ค","aliases":["speedboat"]},{"emoji":"๐ท๏ธ","aliases":["spider"]},{"emoji":"๐ธ๏ธ","aliases":["spider_web"]},{"emoji":"๐๏ธ","aliases":["spiral_calendar"]},{"emoji":"๐๏ธ","aliases":["spiral_notepad"]},{"emoji":"๐งฝ","aliases":["sponge"]},{"emoji":"๐ฅ","aliases":["spoon"]},{"emoji":"๐ฆ","aliases":["squid"]},{"emoji":"๐ฑ๐ฐ","aliases":["sri_lanka"]},{"emoji":"๐ง๐ฑ","aliases":["st_barthelemy"]},{"emoji":"๐ธ๐ญ","aliases":["st_helena"]},{"emoji":"๐ฐ๐ณ","aliases":["st_kitts_nevis"]},{"emoji":"๐ฑ๐จ","aliases":["st_lucia"]},{"emoji":"๐ฒ๐ซ","aliases":["st_martin"]},{"emoji":"๐ต๐ฒ","aliases":["st_pierre_miquelon"]},{"emoji":"๐ป๐จ","aliases":["st_vincent_grenadines"]},{"emoji":"๐๏ธ","aliases":["stadium"]},{"emoji":"๐งโโ๏ธ","aliases":["standing_man"]},{"emoji":"๐ง","aliases":["standing_person"]},{"emoji":"๐งโโ๏ธ","aliases":["standing_woman"]},{"emoji":"โญ","aliases":["star"]},{"emoji":"๐","aliases":["star2"]},{"emoji":"โช๏ธ","aliases":["star_and_crescent"]},{"emoji":"โก๏ธ","aliases":["star_of_david"]},{"emoji":"๐คฉ","aliases":["star_struck"]},{"emoji":"๐ ","aliases":["stars"]},{"emoji":"๐","aliases":["station"]},{"emoji":"๐ฝ","aliases":["statue_of_liberty"]},{"emoji":"๐","aliases":["steam_locomotive"]},{"emoji":"๐ฉบ","aliases":["stethoscope"]},{"emoji":"๐ฒ","aliases":["stew"]},{"emoji":"โน๏ธ","aliases":["stop_button"]},{"emoji":"๐","aliases":["stop_sign"]},{"emoji":"โฑ๏ธ","aliases":["stopwatch"]},{"emoji":"๐","aliases":["straight_ruler"]},{"emoji":"๐","aliases":["strawberry"]},{"emoji":"๐","aliases":["stuck_out_tongue"]},{"emoji":"๐","aliases":["stuck_out_tongue_closed_eyes"]},{"emoji":"๐","aliases":["stuck_out_tongue_winking_eye"]},{"emoji":"๐งโ๐","aliases":["student"]},{"emoji":"๐๏ธ","aliases":["studio_microphone"]},{"emoji":"๐ฅ","aliases":["stuffed_flatbread"]},{"emoji":"๐ธ๐ฉ","aliases":["sudan"]},{"emoji":"๐ฅ๏ธ","aliases":["sun_behind_large_cloud"]},{"emoji":"๐ฆ๏ธ","aliases":["sun_behind_rain_cloud"]},{"emoji":"๐ค๏ธ","aliases":["sun_behind_small_cloud"]},{"emoji":"๐","aliases":["sun_with_face"]},{"emoji":"๐ป","aliases":["sunflower"]},{"emoji":"๐","aliases":["sunglasses"]},{"emoji":"โ๏ธ","aliases":["sunny"]},{"emoji":"๐ ","aliases":["sunrise"]},{"emoji":"๐","aliases":["sunrise_over_mountains"]},{"emoji":"๐ฆธ","aliases":["superhero"]},{"emoji":"๐ฆธโโ๏ธ","aliases":["superhero_man"]},{"emoji":"๐ฆธโโ๏ธ","aliases":["superhero_woman"]},{"emoji":"๐ฆน","aliases":["supervillain"]},{"emoji":"๐ฆนโโ๏ธ","aliases":["supervillain_man"]},{"emoji":"๐ฆนโโ๏ธ","aliases":["supervillain_woman"]},{"emoji":"๐","aliases":["surfer"]},{"emoji":"๐โโ๏ธ","aliases":["surfing_man"]},{"emoji":"๐โโ๏ธ","aliases":["surfing_woman"]},{"emoji":"๐ธ๐ท","aliases":["suriname"]},{"emoji":"๐ฃ","aliases":["sushi"]},{"emoji":"๐","aliases":["suspension_railway"]},{"emoji":"๐ธ๐ฏ","aliases":["svalbard_jan_mayen"]},{"emoji":"๐ฆข","aliases":["swan"]},{"emoji":"๐ธ๐ฟ","aliases":["swaziland"]},{"emoji":"๐","aliases":["sweat"]},{"emoji":"๐ฆ","aliases":["sweat_drops"]},{"emoji":"๐ ","aliases":["sweat_smile"]},{"emoji":"๐ธ๐ช","aliases":["sweden"]},{"emoji":"๐ ","aliases":["sweet_potato"]},{"emoji":"๐ฉฒ","aliases":["swim_brief"]},{"emoji":"๐","aliases":["swimmer"]},{"emoji":"๐โโ๏ธ","aliases":["swimming_man"]},{"emoji":"๐โโ๏ธ","aliases":["swimming_woman"]},{"emoji":"๐จ๐ญ","aliases":["switzerland"]},{"emoji":"๐ฃ","aliases":["symbols"]},{"emoji":"๐","aliases":["synagogue"]},{"emoji":"๐ธ๐พ","aliases":["syria"]},{"emoji":"๐","aliases":["syringe"]},{"emoji":"๐ฆ","aliases":["t-rex"]},{"emoji":"๐ฎ","aliases":["taco"]},{"emoji":"๐","aliases":["tada","hooray"]},{"emoji":"๐น๐ผ","aliases":["taiwan"]},{"emoji":"๐น๐ฏ","aliases":["tajikistan"]},{"emoji":"๐ฅก","aliases":["takeout_box"]},{"emoji":"๐ซ","aliases":["tamale"]},{"emoji":"๐","aliases":["tanabata_tree"]},{"emoji":"๐","aliases":["tangerine","orange","mandarin"]},{"emoji":"๐น๐ฟ","aliases":["tanzania"]},{"emoji":"โ","aliases":["taurus"]},{"emoji":"๐","aliases":["taxi"]},{"emoji":"๐ต","aliases":["tea"]},{"emoji":"๐งโ๐ซ","aliases":["teacher"]},{"emoji":"๐ซ","aliases":["teapot"]},{"emoji":"๐งโ๐ป","aliases":["technologist"]},{"emoji":"๐งธ","aliases":["teddy_bear"]},{"emoji":"๐","aliases":["telephone_receiver"]},{"emoji":"๐ญ","aliases":["telescope"]},{"emoji":"๐พ","aliases":["tennis"]},{"emoji":"โบ","aliases":["tent"]},{"emoji":"๐งช","aliases":["test_tube"]},{"emoji":"๐น๐ญ","aliases":["thailand"]},{"emoji":"๐ก๏ธ","aliases":["thermometer"]},{"emoji":"๐ค","aliases":["thinking"]},{"emoji":"๐ฉด","aliases":["thong_sandal"]},{"emoji":"๐ญ","aliases":["thought_balloon"]},{"emoji":"๐งต","aliases":["thread"]},{"emoji":"3๏ธโฃ","aliases":["three"]},{"emoji":"๐ซ","aliases":["ticket"]},{"emoji":"๐๏ธ","aliases":["tickets"]},{"emoji":"๐ฏ","aliases":["tiger"]},{"emoji":"๐ ","aliases":["tiger2"]},{"emoji":"โฒ๏ธ","aliases":["timer_clock"]},{"emoji":"๐น๐ฑ","aliases":["timor_leste"]},{"emoji":"๐โโ๏ธ","aliases":["tipping_hand_man","sassy_man"]},{"emoji":"๐","aliases":["tipping_hand_person","information_desk_person"]},{"emoji":"๐โโ๏ธ","aliases":["tipping_hand_woman","sassy_woman"]},{"emoji":"๐ซ","aliases":["tired_face"]},{"emoji":"โข๏ธ","aliases":["tm"]},{"emoji":"๐น๐ฌ","aliases":["togo"]},{"emoji":"๐ฝ","aliases":["toilet"]},{"emoji":"๐น๐ฐ","aliases":["tokelau"]},{"emoji":"๐ผ","aliases":["tokyo_tower"]},{"emoji":"๐ ","aliases":["tomato"]},{"emoji":"๐น๐ด","aliases":["tonga"]},{"emoji":"๐ ","aliases":["tongue"]},{"emoji":"๐งฐ","aliases":["toolbox"]},{"emoji":"๐ฆท","aliases":["tooth"]},{"emoji":"๐ชฅ","aliases":["toothbrush"]},{"emoji":"๐","aliases":["top"]},{"emoji":"๐ฉ","aliases":["tophat"]},{"emoji":"๐ช๏ธ","aliases":["tornado"]},{"emoji":"๐น๐ท","aliases":["tr"]},{"emoji":"๐ฒ๏ธ","aliases":["trackball"]},{"emoji":"๐","aliases":["tractor"]},{"emoji":"๐ฅ","aliases":["traffic_light"]},{"emoji":"๐","aliases":["train"]},{"emoji":"๐","aliases":["train2"]},{"emoji":"๐","aliases":["tram"]},{"emoji":"๐ณ๏ธโโง๏ธ","aliases":["transgender_flag"]},{"emoji":"โง๏ธ","aliases":["transgender_symbol"]},{"emoji":"๐ฉ","aliases":["triangular_flag_on_post"]},{"emoji":"๐","aliases":["triangular_ruler"]},{"emoji":"๐ฑ","aliases":["trident"]},{"emoji":"๐น๐น","aliases":["trinidad_tobago"]},{"emoji":"๐น๐ฆ","aliases":["tristan_da_cunha"]},{"emoji":"๐ค","aliases":["triumph"]},{"emoji":"๐ง","aliases":["troll"]},{"emoji":"๐","aliases":["trolleybus"]},{"emoji":"๐","aliases":["trophy"]},{"emoji":"๐น","aliases":["tropical_drink"]},{"emoji":"๐ ","aliases":["tropical_fish"]},{"emoji":"๐","aliases":["truck"]},{"emoji":"๐บ","aliases":["trumpet"]},{"emoji":"๐ท","aliases":["tulip"]},{"emoji":"๐ฅ","aliases":["tumbler_glass"]},{"emoji":"๐น๐ณ","aliases":["tunisia"]},{"emoji":"๐ฆ","aliases":["turkey"]},{"emoji":"๐น๐ฒ","aliases":["turkmenistan"]},{"emoji":"๐น๐จ","aliases":["turks_caicos_islands"]},{"emoji":"๐ข","aliases":["turtle"]},{"emoji":"๐น๐ป","aliases":["tuvalu"]},{"emoji":"๐บ","aliases":["tv"]},{"emoji":"๐","aliases":["twisted_rightwards_arrows"]},{"emoji":"2๏ธโฃ","aliases":["two"]},{"emoji":"๐","aliases":["two_hearts"]},{"emoji":"๐ฌ","aliases":["two_men_holding_hands"]},{"emoji":"๐ญ","aliases":["two_women_holding_hands"]},{"emoji":"๐น","aliases":["u5272"]},{"emoji":"๐ด","aliases":["u5408"]},{"emoji":"๐บ","aliases":["u55b6"]},{"emoji":"๐ฏ","aliases":["u6307"]},{"emoji":"๐ท๏ธ","aliases":["u6708"]},{"emoji":"๐ถ","aliases":["u6709"]},{"emoji":"๐ต","aliases":["u6e80"]},{"emoji":"๐","aliases":["u7121"]},{"emoji":"๐ธ","aliases":["u7533"]},{"emoji":"๐ฒ","aliases":["u7981"]},{"emoji":"๐ณ","aliases":["u7a7a"]},{"emoji":"๐บ๐ฌ","aliases":["uganda"]},{"emoji":"๐บ๐ฆ","aliases":["ukraine"]},{"emoji":"โ","aliases":["umbrella"]},{"emoji":"๐","aliases":["unamused"]},{"emoji":"๐","aliases":["underage"]},{"emoji":"๐ฆ","aliases":["unicorn"]},{"emoji":"๐ฆ๐ช","aliases":["united_arab_emirates"]},{"emoji":"๐บ๐ณ","aliases":["united_nations"]},{"emoji":"๐","aliases":["unlock"]},{"emoji":"๐","aliases":["up"]},{"emoji":"๐","aliases":["upside_down_face"]},{"emoji":"๐บ๐พ","aliases":["uruguay"]},{"emoji":"๐บ๐ธ","aliases":["us"]},{"emoji":"๐บ๐ฒ","aliases":["us_outlying_islands"]},{"emoji":"๐ป๐ฎ","aliases":["us_virgin_islands"]},{"emoji":"๐บ๐ฟ","aliases":["uzbekistan"]},{"emoji":"โ๏ธ","aliases":["v"]},{"emoji":"๐ง","aliases":["vampire"]},{"emoji":"๐งโโ๏ธ","aliases":["vampire_man"]},{"emoji":"๐งโโ๏ธ","aliases":["vampire_woman"]},{"emoji":"๐ป๐บ","aliases":["vanuatu"]},{"emoji":"๐ป๐ฆ","aliases":["vatican_city"]},{"emoji":"๐ป๐ช","aliases":["venezuela"]},{"emoji":"๐ฆ","aliases":["vertical_traffic_light"]},{"emoji":"๐ผ","aliases":["vhs"]},{"emoji":"๐ณ","aliases":["vibration_mode"]},{"emoji":"๐น","aliases":["video_camera"]},{"emoji":"๐ฎ","aliases":["video_game"]},{"emoji":"๐ป๐ณ","aliases":["vietnam"]},{"emoji":"๐ป","aliases":["violin"]},{"emoji":"โ","aliases":["virgo"]},{"emoji":"๐","aliases":["volcano"]},{"emoji":"๐","aliases":["volleyball"]},{"emoji":"๐คฎ","aliases":["vomiting_face"]},{"emoji":"๐","aliases":["vs"]},{"emoji":"๐","aliases":["vulcan_salute"]},{"emoji":"๐ง","aliases":["waffle"]},{"emoji":"๐ด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ","aliases":["wales"]},{"emoji":"๐ถ","aliases":["walking"]},{"emoji":"๐ถโโ๏ธ","aliases":["walking_man"]},{"emoji":"๐ถโโ๏ธ","aliases":["walking_woman"]},{"emoji":"๐ผ๐ซ","aliases":["wallis_futuna"]},{"emoji":"๐","aliases":["waning_crescent_moon"]},{"emoji":"๐","aliases":["waning_gibbous_moon"]},{"emoji":"โ ๏ธ","aliases":["warning"]},{"emoji":"๐๏ธ","aliases":["wastebasket"]},{"emoji":"โ","aliases":["watch"]},{"emoji":"๐","aliases":["water_buffalo"]},{"emoji":"๐คฝ","aliases":["water_polo"]},{"emoji":"๐","aliases":["watermelon"]},{"emoji":"๐","aliases":["wave"]},{"emoji":"ใฐ๏ธ","aliases":["wavy_dash"]},{"emoji":"๐","aliases":["waxing_crescent_moon"]},{"emoji":"๐พ","aliases":["wc"]},{"emoji":"๐ฉ","aliases":["weary"]},{"emoji":"๐","aliases":["wedding"]},{"emoji":"๐๏ธ","aliases":["weight_lifting"]},{"emoji":"๐๏ธโโ๏ธ","aliases":["weight_lifting_man"]},{"emoji":"๐๏ธโโ๏ธ","aliases":["weight_lifting_woman"]},{"emoji":"๐ช๐ญ","aliases":["western_sahara"]},{"emoji":"๐ณ","aliases":["whale"]},{"emoji":"๐","aliases":["whale2"]},{"emoji":"๐","aliases":["wheel"]},{"emoji":"โธ๏ธ","aliases":["wheel_of_dharma"]},{"emoji":"โฟ","aliases":["wheelchair"]},{"emoji":"โ ","aliases":["white_check_mark"]},{"emoji":"โช","aliases":["white_circle"]},{"emoji":"๐ณ๏ธ","aliases":["white_flag"]},{"emoji":"๐ฎ","aliases":["white_flower"]},{"emoji":"๐จโ๐ฆณ","aliases":["white_haired_man"]},{"emoji":"๐ฉโ๐ฆณ","aliases":["white_haired_woman"]},{"emoji":"๐ค","aliases":["white_heart"]},{"emoji":"โฌ","aliases":["white_large_square"]},{"emoji":"โฝ","aliases":["white_medium_small_square"]},{"emoji":"โป๏ธ","aliases":["white_medium_square"]},{"emoji":"โซ๏ธ","aliases":["white_small_square"]},{"emoji":"๐ณ","aliases":["white_square_button"]},{"emoji":"๐ฅ","aliases":["wilted_flower"]},{"emoji":"๐","aliases":["wind_chime"]},{"emoji":"๐ฌ๏ธ","aliases":["wind_face"]},{"emoji":"๐ช","aliases":["window"]},{"emoji":"๐ท","aliases":["wine_glass"]},{"emoji":"๐","aliases":["wink"]},{"emoji":"๐บ","aliases":["wolf"]},{"emoji":"๐ฉ","aliases":["woman"]},{"emoji":"๐ฉโ๐จ","aliases":["woman_artist"]},{"emoji":"๐ฉโ๐","aliases":["woman_astronaut"]},{"emoji":"๐งโโ๏ธ","aliases":["woman_beard"]},{"emoji":"๐คธโโ๏ธ","aliases":["woman_cartwheeling"]},{"emoji":"๐ฉโ๐ณ","aliases":["woman_cook"]},{"emoji":"๐","aliases":["woman_dancing","dancer"]},{"emoji":"๐คฆโโ๏ธ","aliases":["woman_facepalming"]},{"emoji":"๐ฉโ๐ญ","aliases":["woman_factory_worker"]},{"emoji":"๐ฉโ๐พ","aliases":["woman_farmer"]},{"emoji":"๐ฉโ๐ผ","aliases":["woman_feeding_baby"]},{"emoji":"๐ฉโ๐","aliases":["woman_firefighter"]},{"emoji":"๐ฉโโ๏ธ","aliases":["woman_health_worker"]},{"emoji":"๐ฉโ๐ฆฝ","aliases":["woman_in_manual_wheelchair"]},{"emoji":"๐ฉโ๐ฆผ","aliases":["woman_in_motorized_wheelchair"]},{"emoji":"๐คตโโ๏ธ","aliases":["woman_in_tuxedo"]},{"emoji":"๐ฉโโ๏ธ","aliases":["woman_judge"]},{"emoji":"๐คนโโ๏ธ","aliases":["woman_juggling"]},{"emoji":"๐ฉโ๐ง","aliases":["woman_mechanic"]},{"emoji":"๐ฉโ๐ผ","aliases":["woman_office_worker"]},{"emoji":"๐ฉโโ๏ธ","aliases":["woman_pilot"]},{"emoji":"๐คพโโ๏ธ","aliases":["woman_playing_handball"]},{"emoji":"๐คฝโโ๏ธ","aliases":["woman_playing_water_polo"]},{"emoji":"๐ฉโ๐ฌ","aliases":["woman_scientist"]},{"emoji":"๐คทโโ๏ธ","aliases":["woman_shrugging"]},{"emoji":"๐ฉโ๐ค","aliases":["woman_singer"]},{"emoji":"๐ฉโ๐","aliases":["woman_student"]},{"emoji":"๐ฉโ๐ซ","aliases":["woman_teacher"]},{"emoji":"๐ฉโ๐ป","aliases":["woman_technologist"]},{"emoji":"๐ง","aliases":["woman_with_headscarf"]},{"emoji":"๐ฉโ๐ฆฏ","aliases":["woman_with_probing_cane"]},{"emoji":"๐ณโโ๏ธ","aliases":["woman_with_turban"]},{"emoji":"๐ฐโโ๏ธ","aliases":["woman_with_veil","bride_with_veil"]},{"emoji":"๐","aliases":["womans_clothes"]},{"emoji":"๐","aliases":["womans_hat"]},{"emoji":"๐คผโโ๏ธ","aliases":["women_wrestling"]},{"emoji":"๐บ","aliases":["womens"]},{"emoji":"๐ชต","aliases":["wood"]},{"emoji":"๐ฅด","aliases":["woozy_face"]},{"emoji":"๐บ๏ธ","aliases":["world_map"]},{"emoji":"๐ชฑ","aliases":["worm"]},{"emoji":"๐","aliases":["worried"]},{"emoji":"๐ง","aliases":["wrench"]},{"emoji":"๐คผ","aliases":["wrestling"]},{"emoji":"โ๏ธ","aliases":["writing_hand"]},{"emoji":"โ","aliases":["x"]},{"emoji":"๐ฉป","aliases":["x_ray"]},{"emoji":"๐งถ","aliases":["yarn"]},{"emoji":"๐ฅฑ","aliases":["yawning_face"]},{"emoji":"๐ก","aliases":["yellow_circle"]},{"emoji":"๐","aliases":["yellow_heart"]},{"emoji":"๐จ","aliases":["yellow_square"]},{"emoji":"๐พ๐ช","aliases":["yemen"]},{"emoji":"๐ด","aliases":["yen"]},{"emoji":"โฏ๏ธ","aliases":["yin_yang"]},{"emoji":"๐ช","aliases":["yo_yo"]},{"emoji":"๐","aliases":["yum"]},{"emoji":"๐ฟ๐ฒ","aliases":["zambia"]},{"emoji":"๐คช","aliases":["zany_face"]},{"emoji":"โก","aliases":["zap"]},{"emoji":"๐ฆ","aliases":["zebra"]},{"emoji":"0๏ธโฃ","aliases":["zero"]},{"emoji":"๐ฟ๐ผ","aliases":["zimbabwe"]},{"emoji":"๐ค","aliases":["zipper_mouth_face"]},{"emoji":"๐ง","aliases":["zombie"]},{"emoji":"๐งโโ๏ธ","aliases":["zombie_man"]},{"emoji":"๐งโโ๏ธ","aliases":["zombie_woman"]},{"emoji":"๐ค","aliases":["zzz"]}]
-
-
-
@@ -25,7 +25,7 @@ )const ( gemojiURL = "https://raw.githubusercontent.com/github/gemoji/master/db/emoji.json" maxUnicodeVersion = 12 maxUnicodeVersion = 14 ) var flagOut = flag.String("o", "modules/emoji/emoji_data.go", "out")
-
@@ -188,6 +188,10 @@ data = append(data, newData)} } } sort.Slice(data, func(i, j int) bool { return data[i].Aliases[0] < data[j].Aliases[0] }) // add header str := replacer.Replace(fmt.Sprintf(hdr, gemojiURL, data))
-
-
-
@@ -10,13 +10,13 @@ "fmt""os" "strings" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/log" base "code.gitea.io/gitea/modules/migration" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/services/migrations" "github.com/urfave/cli"
-
-
-
@@ -957,6 +957,9 @@;; Don't allow download source archive files from UI ;DISABLE_DOWNLOAD_SOURCE_ARCHIVES = false ;; Allow fork repositories without maximum number limit ;ALLOW_FORK_WITHOUT_MAXIMUM_LIMIT = true ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;[repository.editor]
-
-
-
@@ -18,10 +18,10 @@ params:description: Git with a cup of tea author: The Gitea Authors website: https://docs.gitea.io version: 1.17.4 version: 1.18.0 minGoVersion: 1.18 goVersion: 1.19 minNodeVersion: 14 minNodeVersion: 16 search: nav repo: "https://github.com/go-gitea/gitea" docContentPath: "docs/content"
-
-
-
@@ -112,6 +112,7 @@ - `DEFAULT_BRANCH`: **main**: Default branch name of all repositories.- `ALLOW_ADOPTION_OF_UNADOPTED_REPOSITORIES`: **false**: Allow non-admin users to adopt unadopted repositories - `ALLOW_DELETION_OF_UNADOPTED_REPOSITORIES`: **false**: Allow non-admin users to delete unadopted repositories - `DISABLE_DOWNLOAD_SOURCE_ARCHIVES`: **false**: Don't allow download source archive files from UI - `ALLOW_FORK_WITHOUT_MAXIMUM_LIMIT`: **true**: Allow fork repositories without maximum number limit ### Repository - Editor (`repository.editor`)
-
@@ -238,6 +239,10 @@ - `USER_PAGING_NUM`: **50**: Number of users that are shown in one page.- `REPO_PAGING_NUM`: **50**: Number of repos that are shown in one page. - `NOTICE_PAGING_NUM`: **25**: Number of notices that are shown in one page. - `ORG_PAGING_NUM`: **50**: Number of organizations that are shown in one page. ### UI - User (`ui.user`) - `REPO_PAGING_NUM`: **15**: Number of repos that are shown in one page. ### UI - Metadata (`ui.meta`)
-
@@ -777,9 +782,9 @@ ## Picture (`picture`)- `GRAVATAR_SOURCE`: **gravatar**: Can be `gravatar`, `duoshuo` or anything like `http://cn.gravatar.com/avatar/`. - `DISABLE_GRAVATAR`: **false**: Enable this to use local avatars only. - `DISABLE_GRAVATAR`: **false**: Enable this to use local avatars only. **DEPRECATED [v1.18+]** moved to database. Use admin panel to configure. - `ENABLE_FEDERATED_AVATAR`: **false**: Enable support for federated avatars (see [http://www.libravatar.org](http://www.libravatar.org)). [http://www.libravatar.org](http://www.libravatar.org)). **DEPRECATED [v1.18+]** moved to database. Use admin panel to configure. - `AVATAR_STORAGE_TYPE`: **default**: Storage type defined in `[storage.xxx]`. Default is `default` which will read `[storage]` if no section `[storage]` will be a type `local`. - `AVATAR_UPLOAD_PATH`: **data/avatars**: Path to store user avatar image files.
-
@@ -1145,7 +1150,7 @@## Time (`time`) - `FORMAT`: Time format to display on UI. i.e. RFC1123 or 2006-01-02 15:04:05 - `DEFAULT_UI_LOCATION`: Default location of time on the UI, so that we can display correct user's time on UI. i.e. Shanghai/Asia - `DEFAULT_UI_LOCATION`: Default location of time on the UI, so that we can display correct user's time on UI. i.e. Asia/Shanghai ## Task (`task`)
-
-
-
@@ -43,6 +43,14 @@ ```shpacman -S gitea ``` ## Gentoo Linux The rolling release distribution has [Gitea](https://packages.gentoo.org/packages/www-apps/gitea) in their official community repository and package updates are provided with new Gitea releases. ```sh emerge gitea -va ``` ## Canonical Snap There is a [Gitea Snap](https://snapcraft.io/gitea) package which follows the latest stable version.
-
-
-
@@ -76,12 +76,15 @@```ini [mailer] ENABLED = true HOST = smtp.gmail.com:465 ; Remove this line for Gitea >= 1.18.0 SMTP_ADDR = smtp.gmail.com SMTP_PORT = 465 FROM = example@gmail.com USER = example@gmail.com FROM = example.user@gmail.com USER = example.user PASSWD = *** MAILER_TYPE = smtp IS_TLS_ENABLED = true HELO_HOSTNAME = example.com ``` Note that you'll need to create and use an [App password](https://support.google.com/accounts/answer/185833?hl=en) by enabling 2FA on your Google account. You won't be able to use your Google account password directly.
-
-
-
@@ -1,5 +1,5 @@--- date: "2016-11-08T16:00:00+02:00" date: "2023-01-07T22:03:00+01:00" title: "Dokumentation" slug: "documentation" url: "/de-de/"
-
@@ -27,11 +27,11 @@ * Ein Raspberry Pi 3 ist leistungsstark genug, um Gitea fรผr kleine Belastungen laufen zu lassen.* 2 CPU Kerne und 1GB RAM sind fรผr kleine Teams/Projekte ausreichend. * Gitea sollte unter einem seperaten nicht-root Account auf UNIX-Systemen ausgefรผhrt werden. * Achtung: Gitea verwaltet die `~/.ssh/authorized_keys` Datei. Gitea unter einem normalen Benutzer auszufรผhren kรถnnte dazu fรผhren, dass dieser sich nicht mehr anmelden kann. * [Git](https://git-scm.com/) Version 2.0 oder spรคter wird benรถtigt. * Wenn git >= 2.1.2. und [Git large file storage](https://git-lfs.github.com/) aktiviert ist, dann wird es auch in Gitea verwendbar sein. * Wenn git >= 2.18, dann wird das Rendern von Commit-Graphen automatisch aktiviert. * [Git](https://git-scm.com/) Version 2.0 oder aktueller wird benรถtigt. * Wenn Git >= 2.1.2 und [Git LFS](https://git-lfs.github.com/) vorhanden ist, dann wird Git LFS Support automatisch fรผr Gitea aktiviert. * Wenn Git >= 2.18, dann wird das Rendern von Commit-Graphen automatisch aktiviert. ## Browser Unterstรผtzung * Letzten 2 Versions von Chrome, Firefox, Safari und Edge * Die neuesten zwei Versionen von Chrome, Firefox, Safari und Edge * Firefox ESR
-
-
-
@@ -33,7 +33,7 @@ github.com/fsnotify/fsnotify v1.5.4github.com/gliderlabs/ssh v0.3.5 github.com/go-ap/activitypub v0.0.0-20220917143152-e4e7018838c0 github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73 github.com/go-chi/chi/v5 v5.0.7 github.com/go-chi/chi/v5 v5.0.8 github.com/go-chi/cors v1.2.1 github.com/go-enry/go-enry/v2 v2.8.3 github.com/go-fed/httpsig v1.1.1-0.20201223112313-55836744818e
-
@@ -303,8 +303,6 @@ replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1replace github.com/shurcooL/vfsgen => github.com/lunny/vfsgen v0.0.0-20220105142115-2c99e1ffdfa0 replace github.com/satori/go.uuid v1.2.0 => github.com/gofrs/uuid v4.2.0+incompatible replace github.com/go-ap/activitypub => gitea.com/xy/activitypub v0.0.0-20221126171442-81405e14ea3b replace github.com/blevesearch/zapx/v15 v15.3.6 => github.com/zeripath/zapx/v15 v15.3.6-alignment-fix
-
@@ -314,3 +312,5 @@exclude github.com/gofrs/uuid v4.0.0+incompatible exclude github.com/goccy/go-json v0.4.11 exclude github.com/satori/go.uuid v1.2.0
-
-
-
@@ -475,8 +475,8 @@ github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A=github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-chi/chi/v5 v5.0.1/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-chi/chi/v5 v5.0.4/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4= github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58= github.com/go-enry/go-enry/v2 v2.8.3 h1:BwvNrN58JqBJhyyVdZSl5QD3xoxEEGYUrRyPh31FGhw=
-
@@ -596,7 +596,6 @@ github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA=github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-
-
-
@@ -272,7 +272,7 @@ case strings.HasPrefix(a.RefName, git.BranchPrefix):return a.GetRepoLink() + "/src/branch/" + util.PathEscapeSegments(strings.TrimPrefix(a.RefName, git.BranchPrefix)) case strings.HasPrefix(a.RefName, git.TagPrefix): return a.GetRepoLink() + "/src/tag/" + util.PathEscapeSegments(strings.TrimPrefix(a.RefName, git.TagPrefix)) case len(a.RefName) == 40 && git.IsValidSHAPattern(a.RefName): case len(a.RefName) == git.SHAFullLength && git.IsValidSHAPattern(a.RefName): return a.GetRepoLink() + "/src/commit/" + a.RefName default: // FIXME: we will just assume it's a branch - this was the old way - at some point we may want to enforce that there is always a ref here.
-
-
-
@@ -141,7 +141,7 @@ }// CreateRepoTransferNotification creates notification for the user a repository was transferred to func CreateRepoTransferNotification(ctx context.Context, doer, newOwner *user_model.User, repo *repo_model.Repository) error { return db.AutoTx(ctx, func(ctx context.Context) error { return db.WithTx(ctx, func(ctx context.Context) error { var notify []*Notification if newOwner.IsOrganization() {
-
-
-
@@ -64,11 +64,16 @@ }// PaddedKeyID show KeyID padded to 16 characters func (key *GPGKey) PaddedKeyID() string { if len(key.KeyID) > 15 { return key.KeyID return PaddedKeyID(key.KeyID) } // PaddedKeyID show KeyID padded to 16 characters func PaddedKeyID(keyID string) string { if len(keyID) > 15 { return keyID } zeros := "0000000000000000" return zeros[0:16-len(key.KeyID)] + key.KeyID return zeros[0:16-len(keyID)] + keyID } // ListGPGKeys returns a list of public keys belongs to given user.
-
-
-
@@ -5,7 +5,6 @@ package asymkeyimport ( "context" "errors" "fmt" "strings"
-
@@ -59,9 +58,9 @@ if err != nil {if strings.Contains(stderr, "is not a public key file") { return "", ErrKeyUnableVerify{stderr} } return "", fmt.Errorf("'ssh-keygen -lf %s' failed with error '%s': %s", tmpPath, err, stderr) return "", util.NewInvalidArgumentErrorf("'ssh-keygen -lf %s' failed with error '%s': %s", tmpPath, err, stderr) } else if len(stdout) < 2 { return "", errors.New("not enough output for calculating fingerprint: " + stdout) return "", util.NewInvalidArgumentErrorf("not enough output for calculating fingerprint: %s", stdout) } return strings.Split(stdout, " ")[1], nil }
-
-
-
@@ -10,7 +10,6 @@ "encoding/asn1""encoding/base64" "encoding/binary" "encoding/pem" "errors" "fmt" "math/big" "os"
-
@@ -122,7 +121,7 @@parts := strings.SplitN(content, " ", 3) switch len(parts) { case 0: return "", errors.New("empty key") return "", util.NewInvalidArgumentErrorf("empty key") case 1: keyContent = parts[0] case 2:
-
@@ -167,7 +166,7 @@ }content = strings.TrimRight(content, "\n\r") if strings.ContainsAny(content, "\n\r") { return "", errors.New("only a single line with a single key please") return "", util.NewInvalidArgumentErrorf("only a single line with a single key please") } // remove any unnecessary whitespace now
-
-
-
@@ -4,7 +4,6 @@package asymkey import ( "errors" "fmt" "strings"
-
@@ -12,6 +11,7 @@ "code.gitea.io/gitea/models/db""code.gitea.io/gitea/models/perm" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" ) // __________ .__ .__ .__
-
@@ -70,7 +70,7 @@ }content = strings.TrimSpace(content) if strings.ContainsAny(content, "\r\n") { return "", errors.New("only a single line with a single principal please") return "", util.NewInvalidArgumentErrorf("only a single line with a single principal please") } // check all the allowed principals, email, username or anything
-
-
-
@@ -153,8 +153,7 @@ if email == "" {return DefaultAvatarLink() } enableFederatedAvatarSetting, _ := system_model.GetSetting(system_model.KeyPictureEnableFederatedAvatar) enableFederatedAvatar := enableFederatedAvatarSetting.GetValueBool() enableFederatedAvatar := system_model.GetSettingBool(system_model.KeyPictureEnableFederatedAvatar) var err error if enableFederatedAvatar && system_model.LibravatarService != nil {
-
@@ -175,9 +174,7 @@ }return urlStr } disableGravatarSetting, _ := system_model.GetSetting(system_model.KeyPictureDisableGravatar) disableGravatar := disableGravatarSetting.GetValueBool() disableGravatar := system_model.GetSettingBool(system_model.KeyPictureDisableGravatar) if !disableGravatar { // copy GravatarSourceURL, because we will modify its Path. avatarURLCopy := *system_model.GravatarSourceURL
-
-
-
@@ -71,6 +71,14 @@ }// GetEngine will get a db Engine from this context or return an Engine restricted to this context func GetEngine(ctx context.Context) Engine { if e := getEngine(ctx); e != nil { return e } return x.Context(ctx) } // getEngine will get a db Engine from this context or return nil func getEngine(ctx context.Context) Engine { if engined, ok := ctx.(Engined); ok { return engined.Engine() }
-
@@ -78,7 +86,7 @@ enginedInterface := ctx.Value(enginedContextKey)if enginedInterface != nil { return enginedInterface.(Engined).Engine() } return x.Context(ctx) return nil } // Committer represents an interface to Commit or Close the Context
-
@@ -87,10 +95,34 @@ Commit() errorClose() error } // TxContext represents a transaction Context // halfCommitter is a wrapper of Committer. // It can be closed early, but can't be committed early, it is useful for reusing a transaction. type halfCommitter struct { committer Committer committed bool } func (c *halfCommitter) Commit() error { c.committed = true // should do nothing, and the parent committer will commit later return nil } func (c *halfCommitter) Close() error { if c.committed { // it's "commit and close", should do nothing, and the parent committer will commit later return nil } // it's "rollback and close", let the parent committer rollback right now return c.committer.Close() } // TxContext represents a transaction Context, // it will reuse the existing transaction in the parent context or create a new one. func TxContext(parentCtx context.Context) (*Context, Committer, error) { if InTransaction(parentCtx) { return nil, nil, ErrAlreadyInTransaction if sess, ok := inTransaction(parentCtx); ok { return newContext(parentCtx, sess, true), &halfCommitter{committer: sess}, nil } sess := x.NewSession()
-
@@ -102,20 +134,16 @@return newContext(DefaultContext, sess, true), sess, nil } // WithTx represents executing database operations on a transaction // This function will always open a new transaction, if a transaction exist in parentCtx return an error. // WithTx represents executing database operations on a transaction, if the transaction exist, // this function will reuse it otherwise will create a new one and close it when finished. func WithTx(parentCtx context.Context, f func(ctx context.Context) error) error { if InTransaction(parentCtx) { return ErrAlreadyInTransaction } return txWithNoCheck(parentCtx, f) } // AutoTx represents executing database operations on a transaction, if the transaction exist, // this function will reuse it otherwise will create a new one and close it when finished. func AutoTx(parentCtx context.Context, f func(ctx context.Context) error) error { if InTransaction(parentCtx) { return f(newContext(parentCtx, GetEngine(parentCtx), true)) if sess, ok := inTransaction(parentCtx); ok { err := f(newContext(parentCtx, sess, true)) if err != nil { // rollback immediately, in case the caller ignores returned error and tries to commit the transaction. _ = sess.Close() } return err } return txWithNoCheck(parentCtx, f) }
-
@@ -188,7 +216,10 @@ switch x.Dialect().URI().DBType {case schemas.MYSQL: _, err = e.Context(ctx).SQL("SELECT table_rows FROM information_schema.tables WHERE tables.table_name = ? AND tables.table_schema = ?;", tablename, x.Dialect().URI().DBName).Get(&rows) case schemas.POSTGRES: _, err = e.Context(ctx).SQL("SELECT reltuples AS estimate FROM pg_class WHERE relname = ?;", tablename).Get(&rows) // the table can live in multiple schemas of a postgres database // See https://wiki.postgresql.org/wiki/Count_estimate tablename = x.TableName(bean, true) _, err = e.Context(ctx).SQL("SELECT reltuples::bigint AS estimate FROM pg_class WHERE oid = ?::regclass;", tablename).Get(&rows) case schemas.MSSQL: _, err = e.Context(ctx).SQL("sp_spaceused ?;", tablename).Get(&rows) default:
-
@@ -199,25 +230,25 @@ }// InTransaction returns true if the engine is in a transaction otherwise return false func InTransaction(ctx context.Context) bool { var e Engine if engined, ok := ctx.(Engined); ok { e = engined.Engine() } else { enginedInterface := ctx.Value(enginedContextKey) if enginedInterface != nil { e = enginedInterface.(Engined).Engine() } } _, ok := inTransaction(ctx) return ok } func inTransaction(ctx context.Context) (*xorm.Session, bool) { e := getEngine(ctx) if e == nil { return false return nil, false } switch t := e.(type) { case *xorm.Engine: return false return nil, false case *xorm.Session: return t.IsInTx() if t.IsInTx() { return t, true } return nil, false default: return false return nil, false } }
-
-
-
@@ -0,0 +1,102 @@// Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package db // it's not db_test, because this file is for testing the private type halfCommitter import ( "fmt" "testing" "github.com/stretchr/testify/assert" ) type MockCommitter struct { wants []string gots []string } func NewMockCommitter(wants ...string) *MockCommitter { return &MockCommitter{ wants: wants, } } func (c *MockCommitter) Commit() error { c.gots = append(c.gots, "commit") return nil } func (c *MockCommitter) Close() error { c.gots = append(c.gots, "close") return nil } func (c *MockCommitter) Assert(t *testing.T) { assert.Equal(t, c.wants, c.gots, "want operations %v, but got %v", c.wants, c.gots) } func Test_halfCommitter(t *testing.T) { /* Do something like: ctx, committer, err := db.TxContext(db.DefaultContext) if err != nil { return nil } defer committer.Close() // ... if err != nil { return nil } // ... return committer.Commit() */ testWithCommitter := func(committer Committer, f func(committer Committer) error) { if err := f(&halfCommitter{committer: committer}); err == nil { committer.Commit() } committer.Close() } t.Run("commit and close", func(t *testing.T) { mockCommitter := NewMockCommitter("commit", "close") testWithCommitter(mockCommitter, func(committer Committer) error { defer committer.Close() return committer.Commit() }) mockCommitter.Assert(t) }) t.Run("rollback and close", func(t *testing.T) { mockCommitter := NewMockCommitter("close", "close") testWithCommitter(mockCommitter, func(committer Committer) error { defer committer.Close() if true { return fmt.Errorf("error") } return committer.Commit() }) mockCommitter.Assert(t) }) t.Run("close and commit", func(t *testing.T) { mockCommitter := NewMockCommitter("close", "close") testWithCommitter(mockCommitter, func(committer Committer) error { committer.Close() committer.Commit() return fmt.Errorf("error") }) mockCommitter.Assert(t) }) }
-
-
-
@@ -25,8 +25,62 @@ ctx, committer, err := db.TxContext(db.DefaultContext)assert.NoError(t, err) defer committer.Close() assert.True(t, db.InTransaction(ctx)) assert.Error(t, db.WithTx(ctx, func(ctx context.Context) error { assert.NoError(t, db.WithTx(ctx, func(ctx context.Context) error { assert.True(t, db.InTransaction(ctx)) return nil })) } func TestTxContext(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) { // create new transaction ctx, committer, err := db.TxContext(db.DefaultContext) assert.NoError(t, err) assert.True(t, db.InTransaction(ctx)) assert.NoError(t, committer.Commit()) } { // reuse the transaction created by TxContext and commit it ctx, committer, err := db.TxContext(db.DefaultContext) engine := db.GetEngine(ctx) assert.NoError(t, err) assert.True(t, db.InTransaction(ctx)) { ctx, committer, err := db.TxContext(ctx) assert.NoError(t, err) assert.True(t, db.InTransaction(ctx)) assert.Equal(t, engine, db.GetEngine(ctx)) assert.NoError(t, committer.Commit()) } assert.NoError(t, committer.Commit()) } { // reuse the transaction created by TxContext and close it ctx, committer, err := db.TxContext(db.DefaultContext) engine := db.GetEngine(ctx) assert.NoError(t, err) assert.True(t, db.InTransaction(ctx)) { ctx, committer, err := db.TxContext(ctx) assert.NoError(t, err) assert.True(t, db.InTransaction(ctx)) assert.Equal(t, engine, db.GetEngine(ctx)) assert.NoError(t, committer.Close()) } assert.NoError(t, committer.Close()) } { // reuse the transaction created by WithTx assert.NoError(t, db.WithTx(db.DefaultContext, func(ctx context.Context) error { assert.True(t, db.InTransaction(ctx)) { ctx, committer, err := db.TxContext(ctx) assert.NoError(t, err) assert.True(t, db.InTransaction(ctx)) assert.NoError(t, committer.Commit()) } return nil })) } }
-
-
-
@@ -12,6 +12,8 @@ issues_model "code.gitea.io/gitea/models/issues""code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/modules/setting" _ "code.gitea.io/gitea/cmd" // for TestPrimaryKeys "github.com/stretchr/testify/assert" )
-
@@ -51,3 +53,34 @@ countAfter, err := db.GetEngine(db.DefaultContext).Count(&issues_model.PullRequest{})assert.NoError(t, err) assert.EqualValues(t, countBefore, countAfter) } func TestPrimaryKeys(t *testing.T) { // Some dbs require that all tables have primary keys, see // https://github.com/go-gitea/gitea/issues/21086 // https://github.com/go-gitea/gitea/issues/16802 // To avoid creating tables without primary key again, this test will check them. // Import "code.gitea.io/gitea/cmd" to make sure each db.RegisterModel in init functions has been called. beans, err := db.NamesToBean() if err != nil { t.Fatal(err) } whitelist := map[string]string{ "the_table_name_to_skip_checking": "Write a note here to explain why", } for _, bean := range beans { table, err := db.TableInfo(bean) if err != nil { t.Fatal(err) } if why, ok := whitelist[table.Name]; ok { t.Logf("ignore %q because %q", table.Name, why) continue } if len(table.PrimaryKeys) == 0 { t.Errorf("table %q has no primary key", table.Name) } } }
-
-
-
@@ -4,13 +4,10 @@package db import ( "errors" "fmt" "code.gitea.io/gitea/modules/util" ) var ErrAlreadyInTransaction = errors.New("database connection has already been in a transaction") // ErrCancelled represents an error due to context cancellation type ErrCancelled struct {
-
-
-
@@ -25,7 +25,7 @@ repoCnt++return nil }) assert.NoError(t, err) assert.EqualValues(t, 80, repoCnt) assert.EqualValues(t, 81, repoCnt) err = db.Iterate(db.DefaultContext, nil, func(ctx context.Context, repoUnit *repo_model.RepoUnit) error { reopUnit2 := repo_model.RepoUnit{ID: repoUnit.ID}
-
-
models/fixtures/foreign_reference.yml (deleted)
-
@@ -1,1 +0,0 @@[] # empty
-
-
-
@@ -0,0 +1,32 @@# These are the LFS objects in user2/lfs.git - id: 1 oid: 0b8d8b5f15046343fd32f451df93acc2bdd9e6373be478b968e4cad6b6647351 size: 107 repository_id: 54 created_unix: 1671607299 - id: 2 oid: 2eccdb43825d2a49d99d542daa20075cff1d97d9d2349a8977efe9c03661737c size: 107 repository_id: 54 created_unix: 1671607299 - id: 3 oid: 7b6b2c88dba9f760a1a58469b67fee2b698ef7e9399c4ca4f34a14ccbe39f623 size: 27 repository_id: 54 created_unix: 1671607299 - id: 4 oid: 9d172e5c64b4f0024b9901ec6afe9ea052f3c9b6ff9f4b07956d8c48c86fca82 size: 25 repository_id: 54 created_unix: 1671607299
-
-
-
@@ -550,3 +550,9 @@ id: 80repo_id: 53 type: 1 created_unix: 946684810 - id: 81 repo_id: 54 type: 1 created_unix: 946684810
-
-
-
@@ -1585,3 +1585,14 @@ template_id: 0size: 0 is_fsck_enabled: true close_issues_via_commit_in_any_branch: false - id: 54 owner_id: 2 owner_name: user2 lower_name: lfs name: lfs is_empty: false is_archived: false is_private: true status: 0
-
-
-
@@ -66,7 +66,7 @@ use_custom_avatar: falsenum_followers: 2 num_following: 1 num_stars: 2 num_repos: 9 num_repos: 10 num_teams: 0 num_members: 0 visibility: 0
-
-
models/foreignreference/error.go (deleted)
-
@@ -1,52 +0,0 @@// Copyright 2022 Gitea. All rights reserved. // SPDX-License-Identifier: MIT package foreignreference import ( "fmt" "code.gitea.io/gitea/modules/util" ) // ErrLocalIndexNotExist represents a "LocalIndexNotExist" kind of error. type ErrLocalIndexNotExist struct { RepoID int64 ForeignIndex int64 Type string } // ErrLocalIndexNotExist checks if an error is a ErrLocalIndexNotExist. func IsErrLocalIndexNotExist(err error) bool { _, ok := err.(ErrLocalIndexNotExist) return ok } func (err ErrLocalIndexNotExist) Error() string { return fmt.Sprintf("repository %d has no LocalIndex for ForeignIndex %d of type %s", err.RepoID, err.ForeignIndex, err.Type) } func (err ErrLocalIndexNotExist) Unwrap() error { return util.ErrNotExist } // ErrForeignIndexNotExist represents a "ForeignIndexNotExist" kind of error. type ErrForeignIndexNotExist struct { RepoID int64 LocalIndex int64 Type string } // ErrForeignIndexNotExist checks if an error is a ErrForeignIndexNotExist. func IsErrForeignIndexNotExist(err error) bool { _, ok := err.(ErrForeignIndexNotExist) return ok } func (err ErrForeignIndexNotExist) Error() string { return fmt.Sprintf("repository %d has no ForeignIndex for LocalIndex %d of type %s", err.RepoID, err.LocalIndex, err.Type) } func (err ErrForeignIndexNotExist) Unwrap() error { return util.ErrNotExist }
-
-
-
@@ -1,31 +0,0 @@// Copyright 2022 Gitea. All rights reserved. // SPDX-License-Identifier: MIT package foreignreference import ( "code.gitea.io/gitea/models/db" ) // Type* are valid values for the Type field of ForeignReference const ( TypeIssue = "issue" TypePullRequest = "pull_request" TypeComment = "comment" TypeReview = "review" TypeReviewComment = "review_comment" TypeRelease = "release" ) // ForeignReference represents external references type ForeignReference struct { // RepoID is the first column in all indices. now we only need 2 indices: (repo, local) and (repo, foreign, type) RepoID int64 `xorm:"UNIQUE(repo_foreign_type) INDEX(repo_local)" ` LocalIndex int64 `xorm:"INDEX(repo_local)"` // the resource key inside Gitea, it can be IssueIndex, or some model ID. ForeignIndex string `xorm:"INDEX UNIQUE(repo_foreign_type)"` Type string `xorm:"VARCHAR(16) INDEX UNIQUE(repo_foreign_type)"` } func init() { db.RegisterModel(new(ForeignReference)) }
-
-
-
@@ -67,19 +67,19 @@ return protectBranch.ID > 0} // CanUserPush returns if some user could push to this protected branch func (protectBranch *ProtectedBranch) CanUserPush(userID int64) bool { func (protectBranch *ProtectedBranch) CanUserPush(ctx context.Context, userID int64) bool { if !protectBranch.CanPush { return false } if !protectBranch.EnableWhitelist { if user, err := user_model.GetUserByID(db.DefaultContext, userID); err != nil { if user, err := user_model.GetUserByID(ctx, userID); err != nil { log.Error("GetUserByID: %v", err) return false } else if repo, err := repo_model.GetRepositoryByID(db.DefaultContext, protectBranch.RepoID); err != nil { } else if repo, err := repo_model.GetRepositoryByID(ctx, protectBranch.RepoID); err != nil { log.Error("repo_model.GetRepositoryByID: %v", err) return false } else if writeAccess, err := access_model.HasAccessUnit(db.DefaultContext, user, repo, unit.TypeCode, perm.AccessModeWrite); err != nil { } else if writeAccess, err := access_model.HasAccessUnit(ctx, user, repo, unit.TypeCode, perm.AccessModeWrite); err != nil { log.Error("HasAccessUnit: %v", err) return false } else {
-
@@ -95,7 +95,7 @@ if len(protectBranch.WhitelistTeamIDs) == 0 {return false } in, err := organization.IsUserInTeams(db.DefaultContext, userID, protectBranch.WhitelistTeamIDs) in, err := organization.IsUserInTeams(ctx, userID, protectBranch.WhitelistTeamIDs) if err != nil { log.Error("IsUserInTeams: %v", err) return false
-
@@ -320,19 +320,19 @@ return nil} // GetProtectedBranches get all protected branches func GetProtectedBranches(repoID int64) ([]*ProtectedBranch, error) { func GetProtectedBranches(ctx context.Context, repoID int64) ([]*ProtectedBranch, error) { protectedBranches := make([]*ProtectedBranch, 0) return protectedBranches, db.GetEngine(db.DefaultContext).Find(&protectedBranches, &ProtectedBranch{RepoID: repoID}) return protectedBranches, db.GetEngine(ctx).Find(&protectedBranches, &ProtectedBranch{RepoID: repoID}) } // IsProtectedBranch checks if branch is protected func IsProtectedBranch(repoID int64, branchName string) (bool, error) { func IsProtectedBranch(ctx context.Context, repoID int64, branchName string) (bool, error) { protectedBranch := &ProtectedBranch{ RepoID: repoID, BranchName: branchName, } has, err := db.GetEngine(db.DefaultContext).Exist(protectedBranch) has, err := db.GetEngine(ctx).Exist(protectedBranch) if err != nil { return true, err }
-
@@ -413,13 +413,13 @@ return whitelist, err} // DeleteProtectedBranch removes ProtectedBranch relation between the user and repository. func DeleteProtectedBranch(repoID, id int64) (err error) { func DeleteProtectedBranch(ctx context.Context, repoID, id int64) (err error) { protectedBranch := &ProtectedBranch{ RepoID: repoID, ID: id, } if affected, err := db.GetEngine(db.DefaultContext).Delete(protectedBranch); err != nil { if affected, err := db.GetEngine(ctx).Delete(protectedBranch); err != nil { return err } else if affected != 1 { return fmt.Errorf("delete protected branch ID(%v) failed", id)
-
@@ -440,7 +440,7 @@ DeletedUnix timeutil.TimeStamp `xorm:"INDEX created"`} // AddDeletedBranch adds a deleted branch to the database func AddDeletedBranch(repoID int64, branchName, commit string, deletedByID int64) error { func AddDeletedBranch(ctx context.Context, repoID int64, branchName, commit string, deletedByID int64) error { deletedBranch := &DeletedBranch{ RepoID: repoID, Name: branchName,
-
@@ -448,20 +448,20 @@ Commit: commit,DeletedByID: deletedByID, } _, err := db.GetEngine(db.DefaultContext).Insert(deletedBranch) _, err := db.GetEngine(ctx).Insert(deletedBranch) return err } // GetDeletedBranches returns all the deleted branches func GetDeletedBranches(repoID int64) ([]*DeletedBranch, error) { func GetDeletedBranches(ctx context.Context, repoID int64) ([]*DeletedBranch, error) { deletedBranches := make([]*DeletedBranch, 0) return deletedBranches, db.GetEngine(db.DefaultContext).Where("repo_id = ?", repoID).Desc("deleted_unix").Find(&deletedBranches) return deletedBranches, db.GetEngine(ctx).Where("repo_id = ?", repoID).Desc("deleted_unix").Find(&deletedBranches) } // GetDeletedBranchByID get a deleted branch by its ID func GetDeletedBranchByID(repoID, id int64) (*DeletedBranch, error) { func GetDeletedBranchByID(ctx context.Context, repoID, id int64) (*DeletedBranch, error) { deletedBranch := &DeletedBranch{} has, err := db.GetEngine(db.DefaultContext).Where("repo_id = ?", repoID).And("id = ?", id).Get(deletedBranch) has, err := db.GetEngine(ctx).Where("repo_id = ?", repoID).And("id = ?", id).Get(deletedBranch) if err != nil { return nil, err }
-
@@ -472,13 +472,13 @@ return deletedBranch, nil} // RemoveDeletedBranchByID removes a deleted branch from the database func RemoveDeletedBranchByID(repoID, id int64) (err error) { func RemoveDeletedBranchByID(ctx context.Context, repoID, id int64) (err error) { deletedBranch := &DeletedBranch{ RepoID: repoID, ID: id, } if affected, err := db.GetEngine(db.DefaultContext).Delete(deletedBranch); err != nil { if affected, err := db.GetEngine(ctx).Delete(deletedBranch); err != nil { return err } else if affected != 1 { return fmt.Errorf("remove deleted branch ID(%v) failed", id)
-
@@ -498,8 +498,8 @@ deletedBranch.DeletedBy = user} // RemoveDeletedBranchByName removes all deleted branches func RemoveDeletedBranchByName(repoID int64, branch string) error { _, err := db.GetEngine(db.DefaultContext).Where("repo_id=? AND name=?", repoID, branch).Delete(new(DeletedBranch)) func RemoveDeletedBranchByName(ctx context.Context, repoID int64, branch string) error { _, err := db.GetEngine(ctx).Where("repo_id=? AND name=?", repoID, branch).Delete(new(DeletedBranch)) return err }
-
@@ -509,7 +509,7 @@ // Nothing to do for shutdown or terminatelog.Trace("Doing: DeletedBranchesCleanup") deleteBefore := time.Now().Add(-olderThan) _, err := db.GetEngine(db.DefaultContext).Where("deleted_unix < ?", deleteBefore.Unix()).Delete(new(DeletedBranch)) _, err := db.GetEngine(ctx).Where("deleted_unix < ?", deleteBefore.Unix()).Delete(new(DeletedBranch)) if err != nil { log.Error("DeletedBranchesCleanup: %v", err) }
-
@@ -526,19 +526,19 @@ CreatedUnix timeutil.TimeStamp `xorm:"created"`} // FindRenamedBranch check if a branch was renamed func FindRenamedBranch(repoID int64, from string) (branch *RenamedBranch, exist bool, err error) { func FindRenamedBranch(ctx context.Context, repoID int64, from string) (branch *RenamedBranch, exist bool, err error) { branch = &RenamedBranch{ RepoID: repoID, From: from, } exist, err = db.GetEngine(db.DefaultContext).Get(branch) exist, err = db.GetEngine(ctx).Get(branch) return branch, exist, err } // RenameBranch rename a branch func RenameBranch(repo *repo_model.Repository, from, to string, gitAction func(isDefault bool) error) (err error) { ctx, committer, err := db.TxContext(db.DefaultContext) func RenameBranch(ctx context.Context, repo *repo_model.Repository, from, to string, gitAction func(isDefault bool) error) (err error) { ctx, committer, err := db.TxContext(ctx) if err != nil { return err }
-
-
-
@@ -20,15 +20,15 @@ assert.NoError(t, unittest.PrepareTestDatabase())repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) firstBranch := unittest.AssertExistsAndLoadBean(t, &git_model.DeletedBranch{ID: 1}) assert.Error(t, git_model.AddDeletedBranch(repo.ID, firstBranch.Name, firstBranch.Commit, firstBranch.DeletedByID)) assert.NoError(t, git_model.AddDeletedBranch(repo.ID, "test", "5655464564554545466464656", int64(1))) assert.Error(t, git_model.AddDeletedBranch(db.DefaultContext, repo.ID, firstBranch.Name, firstBranch.Commit, firstBranch.DeletedByID)) assert.NoError(t, git_model.AddDeletedBranch(db.DefaultContext, repo.ID, "test", "5655464564554545466464656", int64(1))) } func TestGetDeletedBranches(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) branches, err := git_model.GetDeletedBranches(repo.ID) branches, err := git_model.GetDeletedBranches(db.DefaultContext, repo.ID) assert.NoError(t, err) assert.Len(t, branches, 2) }
-
@@ -65,7 +65,7 @@ repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})firstBranch := unittest.AssertExistsAndLoadBean(t, &git_model.DeletedBranch{ID: 1}) err := git_model.RemoveDeletedBranchByID(repo.ID, 1) err := git_model.RemoveDeletedBranchByID(db.DefaultContext, repo.ID, 1) assert.NoError(t, err) unittest.AssertNotExistsBean(t, firstBranch) unittest.AssertExistsAndLoadBean(t, &git_model.DeletedBranch{ID: 2})
-
@@ -74,7 +74,7 @@func getDeletedBranch(t *testing.T, branch *git_model.DeletedBranch) *git_model.DeletedBranch { repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) deletedBranch, err := git_model.GetDeletedBranchByID(repo.ID, branch.ID) deletedBranch, err := git_model.GetDeletedBranchByID(db.DefaultContext, repo.ID, branch.ID) assert.NoError(t, err) assert.Equal(t, branch.ID, deletedBranch.ID) assert.Equal(t, branch.Name, deletedBranch.Name)
-
@@ -86,12 +86,12 @@ }func TestFindRenamedBranch(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) branch, exist, err := git_model.FindRenamedBranch(1, "dev") branch, exist, err := git_model.FindRenamedBranch(db.DefaultContext, 1, "dev") assert.NoError(t, err) assert.Equal(t, true, exist) assert.Equal(t, "master", branch.To) _, exist, err = git_model.FindRenamedBranch(1, "unknow") _, exist, err = git_model.FindRenamedBranch(db.DefaultContext, 1, "unknow") assert.NoError(t, err) assert.Equal(t, false, exist) }
-
@@ -110,7 +110,7 @@ BranchName: "master",}, git_model.WhitelistOptions{})) assert.NoError(t, committer.Commit()) assert.NoError(t, git_model.RenameBranch(repo1, "master", "main", func(isDefault bool) error { assert.NoError(t, git_model.RenameBranch(db.DefaultContext, repo1, "master", "main", func(isDefault bool) error { _isDefault = isDefault return nil }))
-
@@ -144,7 +144,7 @@ // This should return a nil branch as this deleted branch// is actually on repo with ID 1. repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) deletedBranch, err := git_model.GetDeletedBranchByID(repo2.ID, 1) deletedBranch, err := git_model.GetDeletedBranchByID(db.DefaultContext, repo2.ID, 1) // Expect no error, and the returned branch is nil. assert.NoError(t, err)
-
@@ -154,7 +154,7 @@ // Now get the deletedBranch with ID of 1 on repo with ID 1.// This should return the deletedBranch. repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) deletedBranch, err = git_model.GetDeletedBranchByID(repo1.ID, 1) deletedBranch, err = git_model.GetDeletedBranchByID(db.DefaultContext, repo1.ID, 1) // Expect no error, and the returned branch to be not nil. assert.NoError(t, err)
-
-
-
@@ -129,8 +129,8 @@ return nil} // APIURL returns the absolute APIURL to this commit-status. func (status *CommitStatus) APIURL() string { _ = status.loadAttributes(db.DefaultContext) func (status *CommitStatus) APIURL(ctx context.Context) string { _ = status.loadAttributes(ctx) return status.Repo.APIURL() + "/statuses/" + url.PathEscape(status.SHA) }
-
@@ -162,7 +162,7 @@ SortType string} // GetCommitStatuses returns all statuses for a given commit. func GetCommitStatuses(repo *repo_model.Repository, sha string, opts *CommitStatusOptions) ([]*CommitStatus, int64, error) { func GetCommitStatuses(ctx context.Context, repo *repo_model.Repository, sha string, opts *CommitStatusOptions) ([]*CommitStatus, int64, error) { if opts.Page <= 0 { opts.Page = 1 }
-
@@ -170,7 +170,7 @@ if opts.PageSize <= 0 {opts.Page = setting.ItemsPerPage } countSession := listCommitStatusesStatement(repo, sha, opts) countSession := listCommitStatusesStatement(ctx, repo, sha, opts) countSession = db.SetSessionPagination(countSession, opts) maxResults, err := countSession.Count(new(CommitStatus)) if err != nil {
-
@@ -179,14 +179,14 @@ return nil, maxResults, err} statuses := make([]*CommitStatus, 0, opts.PageSize) findSession := listCommitStatusesStatement(repo, sha, opts) findSession := listCommitStatusesStatement(ctx, repo, sha, opts) findSession = db.SetSessionPagination(findSession, opts) sortCommitStatusesSession(findSession, opts.SortType) return statuses, maxResults, findSession.Find(&statuses) } func listCommitStatusesStatement(repo *repo_model.Repository, sha string, opts *CommitStatusOptions) *xorm.Session { sess := db.GetEngine(db.DefaultContext).Where("repo_id = ?", repo.ID).And("sha = ?", sha) func listCommitStatusesStatement(ctx context.Context, repo *repo_model.Repository, sha string, opts *CommitStatusOptions) *xorm.Session { sess := db.GetEngine(ctx).Where("repo_id = ?", repo.ID).And("sha = ?", sha) switch opts.State { case "pending", "success", "error", "failure", "warning": sess.And("state = ?", opts.State)
-
@@ -241,10 +241,10 @@ return statuses, count, db.GetEngine(ctx).In("id", ids).Find(&statuses)} // FindRepoRecentCommitStatusContexts returns repository's recent commit status contexts func FindRepoRecentCommitStatusContexts(repoID int64, before time.Duration) ([]string, error) { func FindRepoRecentCommitStatusContexts(ctx context.Context, repoID int64, before time.Duration) ([]string, error) { start := timeutil.TimeStampNow().AddDuration(-before) ids := make([]int64, 0, 10) if err := db.GetEngine(db.DefaultContext).Table("commit_status"). if err := db.GetEngine(ctx).Table("commit_status"). Where("repo_id = ?", repoID). And("updated_unix >= ?", start). Select("max( id ) as id").
-
@@ -257,7 +257,7 @@ contexts := make([]string, 0, len(ids))if len(ids) == 0 { return contexts, nil } return contexts, db.GetEngine(db.DefaultContext).Select("context").Table("commit_status").In("id", ids).Find(&contexts) return contexts, db.GetEngine(ctx).Select("context").Table("commit_status").In("id", ids).Find(&contexts) } // NewCommitStatusOptions holds options for creating a CommitStatus
-
@@ -269,7 +269,7 @@ CommitStatus *CommitStatus} // NewCommitStatus save commit statuses into database func NewCommitStatus(opts NewCommitStatusOptions) error { func NewCommitStatus(ctx context.Context, opts NewCommitStatusOptions) error { if opts.Repo == nil { return fmt.Errorf("NewCommitStatus[nil, %s]: no repository specified", opts.SHA) }
-
@@ -279,7 +279,11 @@ if opts.Creator == nil {return fmt.Errorf("NewCommitStatus[%s, %s]: no user specified", repoPath, opts.SHA) } ctx, committer, err := db.TxContext(db.DefaultContext) if _, err := git.NewIDFromString(opts.SHA); err != nil { return fmt.Errorf("NewCommitStatus[%s, %s]: invalid sha: %w", repoPath, opts.SHA, err) } ctx, committer, err := db.TxContext(ctx) if err != nil { return fmt.Errorf("NewCommitStatus[repo_id: %d, user_id: %d, sha: %s]: %w", opts.Repo.ID, opts.Creator.ID, opts.SHA, err) }
-
@@ -318,14 +322,14 @@ *asymkey_model.SignCommit} // ParseCommitsWithStatus checks commits latest statuses and calculates its worst status state func ParseCommitsWithStatus(oldCommits []*asymkey_model.SignCommit, repo *repo_model.Repository) []*SignCommitWithStatuses { func ParseCommitsWithStatus(ctx context.Context, oldCommits []*asymkey_model.SignCommit, repo *repo_model.Repository) []*SignCommitWithStatuses { newCommits := make([]*SignCommitWithStatuses, 0, len(oldCommits)) for _, c := range oldCommits { commit := &SignCommitWithStatuses{ SignCommit: c, } statuses, _, err := GetLatestCommitStatus(db.DefaultContext, repo.ID, commit.ID.String(), db.ListOptions{}) statuses, _, err := GetLatestCommitStatus(ctx, repo.ID, commit.ID.String(), db.ListOptions{}) if err != nil { log.Error("GetLatestCommitStatus: %v", err) } else {
-
@@ -344,8 +348,8 @@ return fmt.Sprintf("%x", sha1.Sum([]byte(context)))} // ConvertFromGitCommit converts git commits into SignCommitWithStatuses func ConvertFromGitCommit(commits []*git.Commit, repo *repo_model.Repository) []*SignCommitWithStatuses { return ParseCommitsWithStatus( func ConvertFromGitCommit(ctx context.Context, commits []*git.Commit, repo *repo_model.Repository) []*SignCommitWithStatuses { return ParseCommitsWithStatus(ctx, asymkey_model.ParseCommitsWithSignature( user_model.ValidateCommitsWithEmails(commits), repo.GetTrustModel(),
-
-
-
@@ -22,28 +22,28 @@ repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})sha1 := "1234123412341234123412341234123412341234" statuses, maxResults, err := git_model.GetCommitStatuses(repo1, sha1, &git_model.CommitStatusOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 50}}) statuses, maxResults, err := git_model.GetCommitStatuses(db.DefaultContext, repo1, sha1, &git_model.CommitStatusOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 50}}) assert.NoError(t, err) assert.Equal(t, int(maxResults), 5) assert.Len(t, statuses, 5) assert.Equal(t, "ci/awesomeness", statuses[0].Context) assert.Equal(t, structs.CommitStatusPending, statuses[0].State) assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[0].APIURL()) assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[0].APIURL(db.DefaultContext)) assert.Equal(t, "cov/awesomeness", statuses[1].Context) assert.Equal(t, structs.CommitStatusWarning, statuses[1].State) assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[1].APIURL()) assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[1].APIURL(db.DefaultContext)) assert.Equal(t, "cov/awesomeness", statuses[2].Context) assert.Equal(t, structs.CommitStatusSuccess, statuses[2].State) assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[2].APIURL()) assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[2].APIURL(db.DefaultContext)) assert.Equal(t, "ci/awesomeness", statuses[3].Context) assert.Equal(t, structs.CommitStatusFailure, statuses[3].State) assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[3].APIURL()) assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[3].APIURL(db.DefaultContext)) assert.Equal(t, "deploy/awesomeness", statuses[4].Context) assert.Equal(t, structs.CommitStatusError, statuses[4].State) assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[4].APIURL()) assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[4].APIURL(db.DefaultContext)) }
-
-
-
@@ -135,10 +135,10 @@ var ErrLFSObjectNotExist = db.ErrNotExist{Resource: "LFS Meta object"}// NewLFSMetaObject stores a given populated LFSMetaObject structure in the database // if it is not already present. func NewLFSMetaObject(m *LFSMetaObject) (*LFSMetaObject, error) { func NewLFSMetaObject(ctx context.Context, m *LFSMetaObject) (*LFSMetaObject, error) { var err error ctx, committer, err := db.TxContext(db.DefaultContext) ctx, committer, err := db.TxContext(ctx) if err != nil { return nil, err }
-
@@ -164,13 +164,13 @@// GetLFSMetaObjectByOid selects a LFSMetaObject entry from database by its OID. // It may return ErrLFSObjectNotExist or a database error. If the error is nil, // the returned pointer is a valid LFSMetaObject. func GetLFSMetaObjectByOid(repoID int64, oid string) (*LFSMetaObject, error) { func GetLFSMetaObjectByOid(ctx context.Context, repoID int64, oid string) (*LFSMetaObject, error) { if len(oid) == 0 { return nil, ErrLFSObjectNotExist } m := &LFSMetaObject{Pointer: lfs.Pointer{Oid: oid}, RepositoryID: repoID} has, err := db.GetEngine(db.DefaultContext).Get(m) has, err := db.GetEngine(ctx).Get(m) if err != nil { return nil, err } else if !has {
-
@@ -181,18 +181,18 @@ }// RemoveLFSMetaObjectByOid removes a LFSMetaObject entry from database by its OID. // It may return ErrLFSObjectNotExist or a database error. func RemoveLFSMetaObjectByOid(repoID int64, oid string) (int64, error) { return RemoveLFSMetaObjectByOidFn(repoID, oid, nil) func RemoveLFSMetaObjectByOid(ctx context.Context, repoID int64, oid string) (int64, error) { return RemoveLFSMetaObjectByOidFn(ctx, repoID, oid, nil) } // RemoveLFSMetaObjectByOidFn removes a LFSMetaObject entry from database by its OID. // It may return ErrLFSObjectNotExist or a database error. It will run Fn with the current count within the transaction func RemoveLFSMetaObjectByOidFn(repoID int64, oid string, fn func(count int64) error) (int64, error) { func RemoveLFSMetaObjectByOidFn(ctx context.Context, repoID int64, oid string, fn func(count int64) error) (int64, error) { if len(oid) == 0 { return 0, ErrLFSObjectNotExist } ctx, committer, err := db.TxContext(db.DefaultContext) ctx, committer, err := db.TxContext(ctx) if err != nil { return 0, err }
-
@@ -218,8 +218,8 @@ return count, committer.Commit()} // GetLFSMetaObjects returns all LFSMetaObjects associated with a repository func GetLFSMetaObjects(repoID int64, page, pageSize int) ([]*LFSMetaObject, error) { sess := db.GetEngine(db.DefaultContext) func GetLFSMetaObjects(ctx context.Context, repoID int64, page, pageSize int) ([]*LFSMetaObject, error) { sess := db.GetEngine(ctx) if page >= 0 && pageSize > 0 { start := 0
-
@@ -233,18 +233,18 @@ return lfsObjects, sess.Find(&lfsObjects, &LFSMetaObject{RepositoryID: repoID})} // CountLFSMetaObjects returns a count of all LFSMetaObjects associated with a repository func CountLFSMetaObjects(repoID int64) (int64, error) { return db.GetEngine(db.DefaultContext).Count(&LFSMetaObject{RepositoryID: repoID}) func CountLFSMetaObjects(ctx context.Context, repoID int64) (int64, error) { return db.GetEngine(ctx).Count(&LFSMetaObject{RepositoryID: repoID}) } // LFSObjectAccessible checks if a provided Oid is accessible to the user func LFSObjectAccessible(user *user_model.User, oid string) (bool, error) { func LFSObjectAccessible(ctx context.Context, user *user_model.User, oid string) (bool, error) { if user.IsAdmin { count, err := db.GetEngine(db.DefaultContext).Count(&LFSMetaObject{Pointer: lfs.Pointer{Oid: oid}}) count, err := db.GetEngine(ctx).Count(&LFSMetaObject{Pointer: lfs.Pointer{Oid: oid}}) return count > 0, err } cond := repo_model.AccessibleRepositoryCondition(user, unit.TypeInvalid) count, err := db.GetEngine(db.DefaultContext).Where(cond).Join("INNER", "repository", "`lfs_meta_object`.repository_id = `repository`.id").Count(&LFSMetaObject{Pointer: lfs.Pointer{Oid: oid}}) count, err := db.GetEngine(ctx).Where(cond).Join("INNER", "repository", "`lfs_meta_object`.repository_id = `repository`.id").Count(&LFSMetaObject{Pointer: lfs.Pointer{Oid: oid}}) return count > 0, err }
-
@@ -254,8 +254,8 @@ return db.GetEngine(ctx).Exist(&LFSMetaObject{Pointer: lfs.Pointer{Oid: oid}})} // LFSAutoAssociate auto associates accessible LFSMetaObjects func LFSAutoAssociate(metas []*LFSMetaObject, user *user_model.User, repoID int64) error { ctx, committer, err := db.TxContext(db.DefaultContext) func LFSAutoAssociate(ctx context.Context, metas []*LFSMetaObject, user *user_model.User, repoID int64) error { ctx, committer, err := db.TxContext(ctx) if err != nil { return err }
-
-
-
@@ -42,8 +42,8 @@ return path.Clean("/" + p)[1:]} // CreateLFSLock creates a new lock. func CreateLFSLock(repo *repo_model.Repository, lock *LFSLock) (*LFSLock, error) { dbCtx, committer, err := db.TxContext(db.DefaultContext) func CreateLFSLock(ctx context.Context, repo *repo_model.Repository, lock *LFSLock) (*LFSLock, error) { dbCtx, committer, err := db.TxContext(ctx) if err != nil { return nil, err }
-
@@ -98,8 +98,8 @@ return lock, nil} // GetLFSLockByRepoID returns a list of locks of repository. func GetLFSLockByRepoID(repoID int64, page, pageSize int) ([]*LFSLock, error) { e := db.GetEngine(db.DefaultContext) func GetLFSLockByRepoID(ctx context.Context, repoID int64, page, pageSize int) ([]*LFSLock, error) { e := db.GetEngine(ctx) if page >= 0 && pageSize > 0 { start := 0 if page > 0 {
-
@@ -112,12 +112,12 @@ return lfsLocks, e.Find(&lfsLocks, &LFSLock{RepoID: repoID})} // GetTreePathLock returns LSF lock for the treePath func GetTreePathLock(repoID int64, treePath string) (*LFSLock, error) { func GetTreePathLock(ctx context.Context, repoID int64, treePath string) (*LFSLock, error) { if !setting.LFS.StartServer { return nil, nil } locks, err := GetLFSLockByRepoID(repoID, 0, 0) locks, err := GetLFSLockByRepoID(ctx, repoID, 0, 0) if err != nil { return nil, err }
-
@@ -130,13 +130,13 @@ return nil, nil} // CountLFSLockByRepoID returns a count of all LFSLocks associated with a repository. func CountLFSLockByRepoID(repoID int64) (int64, error) { return db.GetEngine(db.DefaultContext).Count(&LFSLock{RepoID: repoID}) func CountLFSLockByRepoID(ctx context.Context, repoID int64) (int64, error) { return db.GetEngine(ctx).Count(&LFSLock{RepoID: repoID}) } // DeleteLFSLockByID deletes a lock by given ID. func DeleteLFSLockByID(id int64, repo *repo_model.Repository, u *user_model.User, force bool) (*LFSLock, error) { dbCtx, committer, err := db.TxContext(db.DefaultContext) func DeleteLFSLockByID(ctx context.Context, id int64, repo *repo_model.Repository, u *user_model.User, force bool) (*LFSLock, error) { dbCtx, committer, err := db.TxContext(ctx) if err != nil { return nil, err }
-
-
-
@@ -57,14 +57,14 @@ return pt.GlobPattern.Match(name)} // InsertProtectedTag inserts a protected tag to database func InsertProtectedTag(pt *ProtectedTag) error { _, err := db.GetEngine(db.DefaultContext).Insert(pt) func InsertProtectedTag(ctx context.Context, pt *ProtectedTag) error { _, err := db.GetEngine(ctx).Insert(pt) return err } // UpdateProtectedTag updates the protected tag func UpdateProtectedTag(pt *ProtectedTag) error { _, err := db.GetEngine(db.DefaultContext).ID(pt.ID).AllCols().Update(pt) func UpdateProtectedTag(ctx context.Context, pt *ProtectedTag) error { _, err := db.GetEngine(ctx).ID(pt.ID).AllCols().Update(pt) return err }
-
@@ -98,9 +98,9 @@ return tags, db.GetEngine(ctx).Find(&tags, &ProtectedTag{RepoID: repoID})} // GetProtectedTagByID gets the protected tag with the specific id func GetProtectedTagByID(id int64) (*ProtectedTag, error) { func GetProtectedTagByID(ctx context.Context, id int64) (*ProtectedTag, error) { tag := new(ProtectedTag) has, err := db.GetEngine(db.DefaultContext).ID(id).Get(tag) has, err := db.GetEngine(ctx).ID(id).Get(tag) if err != nil { return nil, err }
-
-
-
@@ -773,7 +773,7 @@ return err} defer closer.Close() c.Commits = git_model.ConvertFromGitCommit(gitRepo.GetCommitsFromIDs(data.CommitIDs), c.Issue.Repo) c.Commits = git_model.ConvertFromGitCommit(ctx, gitRepo.GetCommitsFromIDs(data.CommitIDs), c.Issue.Repo) c.CommitsNum = int64(len(c.Commits)) }
-
-
-
@@ -13,7 +13,6 @@ "strconv""strings" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/foreignreference" "code.gitea.io/gitea/models/organization" "code.gitea.io/gitea/models/perm" access_model "code.gitea.io/gitea/models/perm/access"
-
@@ -137,12 +136,11 @@ CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` ClosedUnix timeutil.TimeStamp `xorm:"INDEX"` Attachments []*repo_model.Attachment `xorm:"-"` Comments []*Comment `xorm:"-"` Reactions ReactionList `xorm:"-"` TotalTrackedTime int64 `xorm:"-"` Assignees []*user_model.User `xorm:"-"` ForeignReference *foreignreference.ForeignReference `xorm:"-"` Attachments []*repo_model.Attachment `xorm:"-"` Comments []*Comment `xorm:"-"` Reactions ReactionList `xorm:"-"` TotalTrackedTime int64 `xorm:"-"` Assignees []*user_model.User `xorm:"-"` // IsLocked limits commenting abilities to users on an issue // with write access
-
@@ -322,29 +320,6 @@ }return nil } func (issue *Issue) loadForeignReference(ctx context.Context) (err error) { if issue.ForeignReference != nil { return nil } reference := &foreignreference.ForeignReference{ RepoID: issue.RepoID, LocalIndex: issue.Index, Type: foreignreference.TypeIssue, } has, err := db.GetEngine(ctx).Get(reference) if err != nil { return err } else if !has { return foreignreference.ErrForeignIndexNotExist{ RepoID: issue.RepoID, LocalIndex: issue.Index, Type: foreignreference.TypeIssue, } } issue.ForeignReference = reference return nil } // LoadMilestone load milestone of this issue. func (issue *Issue) LoadMilestone(ctx context.Context) (err error) { if (issue.Milestone == nil || issue.Milestone.ID != issue.MilestoneID) && issue.MilestoneID > 0 {
-
@@ -405,10 +380,6 @@ if issue.IsTimetrackerEnabled(ctx) {if err = issue.LoadTotalTimes(ctx); err != nil { return err } } if err = issue.loadForeignReference(ctx); err != nil && !foreignreference.IsErrForeignIndexNotExist(err) { return err } return issue.loadReactions(ctx)
-
@@ -1096,26 +1067,6 @@ } else if !has {return nil, ErrIssueNotExist{0, repoID, index} } return issue, nil } // GetIssueByForeignIndex returns raw issue by foreign ID func GetIssueByForeignIndex(ctx context.Context, repoID, foreignIndex int64) (*Issue, error) { reference := &foreignreference.ForeignReference{ RepoID: repoID, ForeignIndex: strconv.FormatInt(foreignIndex, 10), Type: foreignreference.TypeIssue, } has, err := db.GetEngine(ctx).Get(reference) if err != nil { return nil, err } else if !has { return nil, foreignreference.ErrLocalIndexNotExist{ RepoID: repoID, ForeignIndex: foreignIndex, Type: foreignreference.TypeIssue, } } return GetIssueByIndex(repoID, reference.LocalIndex) } // GetIssueWithAttrsByIndex returns issue by index in a repository.
-
@@ -2416,7 +2367,7 @@// DeleteOrphanedIssues delete issues without a repo func DeleteOrphanedIssues(ctx context.Context) error { var attachmentPaths []string err := db.AutoTx(ctx, func(ctx context.Context) error { err := db.WithTx(ctx, func(ctx context.Context) error { var ids []int64 if err := db.GetEngine(ctx).Table("issue").Distinct("issue.repo_id").
-
-
-
@@ -7,13 +7,11 @@ import ("context" "fmt" "sort" "strconv" "sync" "testing" "time" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/foreignreference" issues_model "code.gitea.io/gitea/models/issues" "code.gitea.io/gitea/models/organization" repo_model "code.gitea.io/gitea/models/repo"
-
@@ -499,38 +497,6 @@// Now check the values. assert.NoError(t, err) assert.EqualValues(t, issueStats.OpenCount, issueAmount) } func TestIssueForeignReference(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 4}) assert.NotEqualValues(t, issue.Index, issue.ID) // make sure they are different to avoid false positive // it is fine for an issue to not have a foreign reference err := issue.LoadAttributes(db.DefaultContext) assert.NoError(t, err) assert.Nil(t, issue.ForeignReference) var foreignIndex int64 = 12345 _, err = issues_model.GetIssueByForeignIndex(context.Background(), issue.RepoID, foreignIndex) assert.True(t, foreignreference.IsErrLocalIndexNotExist(err)) err = db.Insert(db.DefaultContext, &foreignreference.ForeignReference{ LocalIndex: issue.Index, ForeignIndex: strconv.FormatInt(foreignIndex, 10), RepoID: issue.RepoID, Type: foreignreference.TypeIssue, }) assert.NoError(t, err) err = issue.LoadAttributes(db.DefaultContext) assert.NoError(t, err) assert.EqualValues(t, issue.ForeignReference.ForeignIndex, strconv.FormatInt(foreignIndex, 10)) found, err := issues_model.GetIssueByForeignIndex(context.Background(), issue.RepoID, foreignIndex) assert.NoError(t, err) assert.EqualValues(t, found.Index, issue.Index) } func TestMilestoneList_LoadTotalTrackedTimes(t *testing.T) {
-
-
-
@@ -83,13 +83,6 @@ return err} } if issue.ForeignReference != nil { issue.ForeignReference.LocalIndex = issue.Index if _, err := sess.Insert(issue.ForeignReference); err != nil { return err } } return nil }
-
-
-
@@ -4,11 +4,9 @@package models import ( "strconv" "testing" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/foreignreference" issues_model "code.gitea.io/gitea/models/issues" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unittest"
-
@@ -48,7 +46,6 @@ Type: "heart",UserID: owner.ID, } foreignIndex := int64(12345) title := "issuetitle1" is := &issues_model.Issue{ RepoID: repo.ID,
-
@@ -62,20 +59,11 @@ Poster: owner,IsClosed: true, Labels: []*issues_model.Label{label}, Reactions: []*issues_model.Reaction{reaction}, ForeignReference: &foreignreference.ForeignReference{ ForeignIndex: strconv.FormatInt(foreignIndex, 10), RepoID: repo.ID, Type: foreignreference.TypeIssue, }, } err := InsertIssues(is) assert.NoError(t, err) i := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{Title: title}) assert.Nil(t, i.ForeignReference) err = i.LoadAttributes(db.DefaultContext) assert.NoError(t, err) assert.EqualValues(t, strconv.FormatInt(foreignIndex, 10), i.ForeignReference.ForeignIndex) unittest.AssertExistsAndLoadBean(t, &issues_model.Reaction{Type: "heart", UserID: owner.ID, IssueID: i.ID}) }
-
-
-
@@ -444,6 +444,8 @@ // v235 -> v236NewMigration("Add index for access_token", v1_19.AddIndexForAccessToken), // v236 -> v237 NewMigration("Create secrets table", v1_19.CreateSecretsTable), // v237 -> v238 NewMigration("Drop ForeignReference table", v1_19.DropForeignReferenceTable), } // GetCurrentDBVersion returns the current db version
-
-
-
@@ -6,7 +6,6 @@import ( "fmt" "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/secret" "code.gitea.io/gitea/modules/setting"
-
@@ -56,9 +55,9 @@func AddHeaderAuthorizationEncryptedColWebhook(x *xorm.Engine) error { // Add the column to the table type Webhook struct { ID int64 `xorm:"pk autoincr"` Type webhook.HookType `xorm:"VARCHAR(16) 'type'"` Meta string `xorm:"TEXT"` // store hook-specific attributes ID int64 `xorm:"pk autoincr"` Type string `xorm:"VARCHAR(16) 'type'"` Meta string `xorm:"TEXT"` // store hook-specific attributes // HeaderAuthorizationEncrypted should be accessed using HeaderAuthorization() and SetHeaderAuthorization() HeaderAuthorizationEncrypted string `xorm:"TEXT"`
-
-
-
@@ -7,10 +7,10 @@ import ("testing" "code.gitea.io/gitea/models/migrations/base" "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/secret" "code.gitea.io/gitea/modules/setting" webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" )
-
@@ -18,9 +18,9 @@func Test_AddHeaderAuthorizationEncryptedColWebhook(t *testing.T) { // Create Webhook table type Webhook struct { ID int64 `xorm:"pk autoincr"` Type webhook.HookType `xorm:"VARCHAR(16) 'type'"` Meta string `xorm:"TEXT"` // store hook-specific attributes ID int64 `xorm:"pk autoincr"` Type webhook_module.HookType `xorm:"VARCHAR(16) 'type'"` Meta string `xorm:"TEXT"` // store hook-specific attributes // HeaderAuthorizationEncrypted should be accessed using HeaderAuthorization() and SetHeaderAuthorization() HeaderAuthorizationEncrypted string `xorm:"TEXT"`
-
-
-
@@ -0,0 +1,15 @@// Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package v1_19 //nolint import ( "xorm.io/xorm" ) func DropForeignReferenceTable(x *xorm.Engine) error { // Drop the table introduced in `v211`, it's considered badly designed and doesn't look like to be used. // See: https://github.com/go-gitea/gitea/issues/21086#issuecomment-1318217453 type ForeignReference struct{} return x.DropTables(new(ForeignReference)) }
-
-
-
@@ -6,7 +6,6 @@ package modelsimport ( "context" "errors" "fmt" "strings"
-
@@ -235,7 +234,7 @@ // NewTeam creates a record of new team.// It's caller's responsibility to assign organization ID. func NewTeam(t *organization.Team) (err error) { if len(t.Name) == 0 { return errors.New("empty team name") return util.NewInvalidArgumentErrorf("empty team name") } if err = organization.IsUsableTeamName(t.Name); err != nil {
-
@@ -300,7 +299,7 @@// UpdateTeam updates information of team. func UpdateTeam(t *organization.Team, authChanged, includeAllChanged bool) (err error) { if len(t.Name) == 0 { return errors.New("empty team name") return util.NewInvalidArgumentErrorf("empty team name") } if len(t.Description) > 255 {
-
-
-
@@ -5,7 +5,6 @@ package conanimport ( "context" "errors" "strconv" "strings"
-
@@ -13,13 +12,14 @@ "code.gitea.io/gitea/models/db""code.gitea.io/gitea/models/packages" conan_module "code.gitea.io/gitea/modules/packages/conan" "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) var ( ErrRecipeReferenceNotExist = errors.New("Recipe reference does not exist") ErrPackageReferenceNotExist = errors.New("Package reference does not exist") ErrRecipeReferenceNotExist = util.NewNotExistErrorf("recipe reference does not exist") ErrPackageReferenceNotExist = util.NewNotExistErrorf("package reference does not exist") ) // RecipeExists checks if a recipe exists
-
-
-
@@ -5,7 +5,6 @@ package containerimport ( "context" "errors" "strings" "time"
-
@@ -13,11 +12,12 @@ "code.gitea.io/gitea/models/db""code.gitea.io/gitea/models/packages" user_model "code.gitea.io/gitea/models/user" container_module "code.gitea.io/gitea/modules/packages/container" "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) var ErrContainerBlobNotExist = errors.New("Container blob does not exist") var ErrContainerBlobNotExist = util.NewNotExistErrorf("container blob does not exist") type BlobSearchOptions struct { OwnerID int64
-
-
-
@@ -5,11 +5,11 @@ package packagesimport ( "context" "errors" "fmt" "strings" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/util" "xorm.io/builder" )
-
@@ -20,9 +20,9 @@ }var ( // ErrDuplicatePackage indicates a duplicated package error ErrDuplicatePackage = errors.New("Package does exist already") ErrDuplicatePackage = util.NewAlreadyExistErrorf("package already exists") // ErrPackageNotExist indicates a package not exist error ErrPackageNotExist = errors.New("Package does not exist") ErrPackageNotExist = util.NewNotExistErrorf("package does not exist") ) // Type of a package
-
-
-
@@ -5,15 +5,15 @@ package packagesimport ( "context" "errors" "time" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/util" ) // ErrPackageBlobNotExist indicates a package blob not exist error var ErrPackageBlobNotExist = errors.New("Package blob does not exist") var ErrPackageBlobNotExist = util.NewNotExistErrorf("package blob does not exist") func init() { db.RegisterModel(new(PackageBlob))
-
-
-
@@ -5,7 +5,6 @@ package packagesimport ( "context" "errors" "strings" "time"
-
@@ -15,7 +14,7 @@ "code.gitea.io/gitea/modules/util") // ErrPackageBlobUploadNotExist indicates a package blob upload not exist error var ErrPackageBlobUploadNotExist = errors.New("Package blob upload does not exist") var ErrPackageBlobUploadNotExist = util.NewNotExistErrorf("package blob upload does not exist") func init() { db.RegisterModel(new(PackageBlobUpload))
-
-
-
@@ -5,17 +5,17 @@ package packagesimport ( "context" "errors" "fmt" "regexp" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) var ErrPackageCleanupRuleNotExist = errors.New("Package blob does not exist") var ErrPackageCleanupRuleNotExist = util.NewNotExistErrorf("package blob does not exist") func init() { db.RegisterModel(new(PackageCleanupRule))
-
-
-
@@ -5,13 +5,13 @@ package packagesimport ( "context" "errors" "strconv" "strings" "time" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/util" "xorm.io/builder" )
-
@@ -22,9 +22,9 @@ }var ( // ErrDuplicatePackageFile indicates a duplicated package file error ErrDuplicatePackageFile = errors.New("Package file does exist already") ErrDuplicatePackageFile = util.NewAlreadyExistErrorf("package file already exists") // ErrPackageFileNotExist indicates a package file not exist error ErrPackageFileNotExist = errors.New("Package file does not exist") ErrPackageFileNotExist = util.NewNotExistErrorf("package file does not exist") ) // EmptyFileKey is a named constant for an empty file key
-
-
-
@@ -5,7 +5,6 @@ package packagesimport ( "context" "errors" "strconv" "strings"
-
@@ -17,7 +16,7 @@ "xorm.io/builder") // ErrDuplicatePackageVersion indicates a duplicated package version error var ErrDuplicatePackageVersion = errors.New("Package version already exists") var ErrDuplicatePackageVersion = util.NewAlreadyExistErrorf("package version already exists") func init() { db.RegisterModel(new(PackageVersion))
-
-
-
@@ -5,7 +5,6 @@ package projectimport ( "context" "errors" "fmt" "code.gitea.io/gitea/models/db"
-
@@ -176,7 +175,7 @@ p.BoardType = BoardTypeNone} if !IsTypeValid(p.Type) { return errors.New("project type is not valid") return util.NewInvalidArgumentErrorf("project type is not valid") } ctx, committer, err := db.TxContext(db.DefaultContext)
-
@@ -301,7 +300,7 @@// DeleteProjectByID deletes a project from a repository. if it's not in a database // transaction, it will start a new database transaction func DeleteProjectByID(ctx context.Context, id int64) error { return db.AutoTx(ctx, func(ctx context.Context) error { return db.WithTx(ctx, func(ctx context.Context) error { p, err := GetProjectByID(ctx, id) if err != nil { if IsErrProjectNotExist(err) {
-
-
-
@@ -105,7 +105,7 @@ if mode <= perm.AccessModeNone || mode > perm.AccessModeOwner {return nil } return db.AutoTx(ctx, func(ctx context.Context) error { return db.WithTx(ctx, func(ctx context.Context) error { e := db.GetEngine(ctx) collaboration := &Collaboration{
-
-
-
@@ -6,16 +6,16 @@ package repoimport ( "context" "errors" "time" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/util" ) // ErrMirrorNotExist mirror does not exist error var ErrMirrorNotExist = errors.New("Mirror does not exist") var ErrMirrorNotExist = util.NewNotExistErrorf("Mirror does not exist") // Mirror represents mirror information of a repository. type Mirror struct {
-
-
-
@@ -5,18 +5,18 @@ package repoimport ( "context" "errors" "time" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) // ErrPushMirrorNotExist mirror does not exist error var ErrPushMirrorNotExist = errors.New("PushMirror does not exist") var ErrPushMirrorNotExist = util.NewNotExistErrorf("PushMirror does not exist") // PushMirror represents mirror information of a repository. type PushMirror struct {
-
@@ -90,7 +90,7 @@ if opts.RepoID > 0 {_, err := db.GetEngine(ctx).Where(opts.toConds()).Delete(&PushMirror{}) return err } return errors.New("repoID required and must be set") return util.NewInvalidArgumentErrorf("repoID required and must be set") } func GetPushMirror(ctx context.Context, opts PushMirrorOptions) (*PushMirror, error) {
-
-
-
@@ -6,7 +6,6 @@ package repoimport ( "context" "errors" "fmt" "sort" "strconv"
-
@@ -156,7 +155,7 @@ }for i := range attachments { if attachments[i].ReleaseID != 0 { return errors.New("release permission denied") return util.NewPermissionDeniedErrorf("release permission denied") } attachments[i].ReleaseID = releaseID // No assign value could be 0, so ignore AllCols().
-
-
-
@@ -5,7 +5,6 @@ package repoimport ( "context" "errors" "fmt" "strings"
-
@@ -708,7 +707,7 @@ }cond := builder.NewCond() if opts.Actor == nil { return nil, 0, errors.New("GetUserRepositories: Actor is needed but not given") return nil, 0, util.NewInvalidArgumentErrorf("GetUserRepositories: Actor is needed but not given") } cond = cond.And(builder.Eq{"owner_id": opts.Actor.ID}) if !opts.Private {
-
-
-
@@ -155,7 +155,7 @@// CreatePendingRepositoryTransfer transfer a repo from one owner to a new one. // it marks the repository transfer as "pending" func CreatePendingRepositoryTransfer(ctx context.Context, doer, newOwner *user_model.User, repoID int64, teams []*organization.Team) error { return db.AutoTx(ctx, func(ctx context.Context) error { return db.WithTx(ctx, func(ctx context.Context) error { repo, err := repo_model.GetRepositoryByID(ctx, repoID) if err != nil { return err
-
-
-
@@ -12,7 +12,7 @@ "strings""code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/cache" "code.gitea.io/gitea/modules/setting" setting_module "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/timeutil" "strk.kbt.io/projects/go/libravatar"
-
@@ -88,17 +88,17 @@ }if len(v) == 0 { return nil, ErrSettingIsNotExist{key} } return v[key], nil return v[strings.ToLower(key)], nil } // GetSetting returns the setting value via the key func GetSetting(key string) (*Setting, error) { return cache.Get(genSettingCacheKey(key), func() (*Setting, error) { func GetSetting(key string) (string, error) { return cache.GetString(genSettingCacheKey(key), func() (string, error) { res, err := GetSettingNoCache(key) if err != nil { return nil, err return "", err } return res, nil return res.SettingValue, nil }) }
-
@@ -106,7 +106,8 @@ // GetSettingBool return bool value of setting,// none existing keys and errors are ignored and result in false func GetSettingBool(key string) bool { s, _ := GetSetting(key) return s.GetValueBool() v, _ := strconv.ParseBool(s) return v } // GetSettings returns specific settings
-
@@ -130,7 +131,7 @@type AllSettings map[string]*Setting func (settings AllSettings) Get(key string) Setting { if v, ok := settings[key]; ok { if v, ok := settings[strings.ToLower(key)]; ok { return *v } return Setting{}
-
@@ -183,14 +184,17 @@ }// SetSetting updates a users' setting for a specific key func SetSetting(setting *Setting) error { _, err := cache.Set(genSettingCacheKey(setting.SettingKey), func() (*Setting, error) { return setting, upsertSettingValue(strings.ToLower(setting.SettingKey), setting.SettingValue, setting.Version) }) if err != nil { if err := upsertSettingValue(strings.ToLower(setting.SettingKey), setting.SettingValue, setting.Version); err != nil { return err } setting.Version++ cc := cache.GetCache() if cc != nil { return cc.Put(genSettingCacheKey(setting.SettingKey), setting.SettingValue, setting_module.CacheService.TTLSeconds()) } return nil }
-
@@ -242,7 +246,7 @@ func Init() error {var disableGravatar bool disableGravatarSetting, err := GetSettingNoCache(KeyPictureDisableGravatar) if IsErrSettingIsNotExist(err) { disableGravatar = setting.GetDefaultDisableGravatar() disableGravatar = setting_module.GetDefaultDisableGravatar() disableGravatarSetting = &Setting{SettingValue: strconv.FormatBool(disableGravatar)} } else if err != nil { return err
-
@@ -253,7 +257,7 @@var enableFederatedAvatar bool enableFederatedAvatarSetting, err := GetSettingNoCache(KeyPictureEnableFederatedAvatar) if IsErrSettingIsNotExist(err) { enableFederatedAvatar = setting.GetDefaultEnableFederatedAvatar(disableGravatar) enableFederatedAvatar = setting_module.GetDefaultEnableFederatedAvatar(disableGravatar) enableFederatedAvatarSetting = &Setting{SettingValue: strconv.FormatBool(enableFederatedAvatar)} } else if err != nil { return err
-
@@ -261,20 +265,20 @@ } else {enableFederatedAvatar = disableGravatarSetting.GetValueBool() } if setting.OfflineMode { if setting_module.OfflineMode { disableGravatar = true enableFederatedAvatar = false } if disableGravatar || !enableFederatedAvatar { if enableFederatedAvatar || !disableGravatar { var err error GravatarSourceURL, err = url.Parse(setting.GravatarSource) GravatarSourceURL, err = url.Parse(setting_module.GravatarSource) if err != nil { return fmt.Errorf("Failed to parse Gravatar URL(%s): %w", setting.GravatarSource, err) return fmt.Errorf("Failed to parse Gravatar URL(%s): %w", setting_module.GravatarSource, err) } } if enableFederatedAvatarSetting.GetValueBool() { if GravatarSourceURL != nil && enableFederatedAvatarSetting.GetValueBool() { LibravatarService = libravatar.New() if GravatarSourceURL.Scheme == "https" { LibravatarService.SetUseHTTPS(true)
-
-
-
@@ -33,9 +33,13 @@ assert.Len(t, settings, 1)assert.EqualValues(t, newSetting.SettingValue, settings[strings.ToLower(keyName)].SettingValue) // updated setting updatedSetting := &system.Setting{SettingKey: keyName, SettingValue: "100", Version: newSetting.Version} updatedSetting := &system.Setting{SettingKey: keyName, SettingValue: "100", Version: settings[strings.ToLower(keyName)].Version} err = system.SetSetting(updatedSetting) assert.NoError(t, err) value, err := system.GetSetting(keyName) assert.NoError(t, err) assert.EqualValues(t, updatedSetting.SettingValue, value) // get all settings settings, err = system.GetAllSettings()
-
-
-
@@ -64,7 +64,7 @@ // It returns error when error occurs in underlying functions.func CopyDir(srcPath, destPath string, filters ...func(filePath string) bool) error { // Check if target directory exists. if _, err := os.Stat(destPath); !errors.Is(err, os.ErrNotExist) { return errors.New("file or directory already exists: " + destPath) return util.NewAlreadyExistErrorf("file or directory already exists: %s", destPath) } err := os.MkdirAll(destPath, os.ModePerm)
-
-
-
@@ -67,9 +67,7 @@useLocalAvatar := false autoGenerateAvatar := false disableGravatarSetting, _ := system_model.GetSetting(system_model.KeyPictureDisableGravatar) disableGravatar := disableGravatarSetting.GetValueBool() disableGravatar := system_model.GetSettingBool(system_model.KeyPictureDisableGravatar) switch { case u.UseCustomAvatar:
-
-
-
@@ -6,7 +6,6 @@ package userimport ( "context" "errors" "fmt" "net/mail" "regexp"
-
@@ -22,7 +21,7 @@ "xorm.io/builder") // ErrEmailNotActivated e-mail address has not been activated error var ErrEmailNotActivated = errors.New("e-mail address has not been activated") var ErrEmailNotActivated = util.NewInvalidArgumentErrorf("e-mail address has not been activated") // ErrEmailCharIsNotSupported e-mail address contains unsupported character type ErrEmailCharIsNotSupported struct {
-
-
-
@@ -5,7 +5,6 @@ package userimport ( "context" "errors" "fmt" "code.gitea.io/gitea/models/db"
-
@@ -13,7 +12,7 @@ "code.gitea.io/gitea/modules/util") // ErrOpenIDNotExist openid is not known var ErrOpenIDNotExist = errors.New("OpenID is unknown") var ErrOpenIDNotExist = util.NewNotExistErrorf("OpenID is unknown") // UserOpenID is the list of all OpenID identities of a user. // Since this is a middle table, name it OpenID is not suitable, so we ignore the lint here
-
-
-
@@ -53,13 +53,13 @@ return fmt.Sprintf("user_%d.setting.%s", userID, key)} // GetSetting returns the setting value via the key func GetSetting(uid int64, key string) (*Setting, error) { return cache.Get(genSettingCacheKey(uid, key), func() (*Setting, error) { func GetSetting(uid int64, key string) (string, error) { return cache.GetString(genSettingCacheKey(uid, key), func() (string, error) { res, err := GetSettingNoCache(uid, key) if err != nil { return nil, err return "", err } return res, nil return res.SettingValue, nil }) }
-
@@ -154,7 +154,7 @@ if err := validateUserSettingKey(key); err != nil {return err } _, err := cache.Set(genSettingCacheKey(userID, key), func() (string, error) { _, err := cache.GetString(genSettingCacheKey(userID, key), func() (string, error) { return value, upsertUserSettingValue(userID, key, value) })
-
-
-
@@ -275,6 +275,15 @@ func (u *User) CanEditGitHook() bool {return !setting.DisableGitHooks && (u.IsAdmin || u.AllowGitHook) } // CanForkRepo returns if user login can fork a repository // It checks especially that the user can create repos, and potentially more func (u *User) CanForkRepo() bool { if setting.Repository.AllowForkWithoutMaximumLimit { return true } return u.CanCreateRepo() } // CanImportLocal returns true if user can migrate repository by local path. func (u *User) CanImportLocal() bool { if !setting.ImportLocalPaths || u == nil {
-
-
-
@@ -12,6 +12,7 @@ "code.gitea.io/gitea/modules/json""code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" gouuid "github.com/google/uuid" )
-
@@ -23,69 +24,6 @@ // \ Y ( <_> | <_> ) < | | / __ \_\___ \| <// \___|_ / \____/ \____/|__|_ \ |____| (____ /____ >__|_ \ // \/ \/ \/ \/ \/ // HookEventType is the type of an hook event type HookEventType string // Types of hook events const ( HookEventCreate HookEventType = "create" HookEventDelete HookEventType = "delete" HookEventFork HookEventType = "fork" HookEventPush HookEventType = "push" HookEventIssues HookEventType = "issues" HookEventIssueAssign HookEventType = "issue_assign" HookEventIssueLabel HookEventType = "issue_label" HookEventIssueMilestone HookEventType = "issue_milestone" HookEventIssueComment HookEventType = "issue_comment" HookEventPullRequest HookEventType = "pull_request" HookEventPullRequestAssign HookEventType = "pull_request_assign" HookEventPullRequestLabel HookEventType = "pull_request_label" HookEventPullRequestMilestone HookEventType = "pull_request_milestone" HookEventPullRequestComment HookEventType = "pull_request_comment" HookEventPullRequestReviewApproved HookEventType = "pull_request_review_approved" HookEventPullRequestReviewRejected HookEventType = "pull_request_review_rejected" HookEventPullRequestReviewComment HookEventType = "pull_request_review_comment" HookEventPullRequestSync HookEventType = "pull_request_sync" HookEventWiki HookEventType = "wiki" HookEventRepository HookEventType = "repository" HookEventRelease HookEventType = "release" HookEventPackage HookEventType = "package" ) // Event returns the HookEventType as an event string func (h HookEventType) Event() string { switch h { case HookEventCreate: return "create" case HookEventDelete: return "delete" case HookEventFork: return "fork" case HookEventPush: return "push" case HookEventIssues, HookEventIssueAssign, HookEventIssueLabel, HookEventIssueMilestone: return "issues" case HookEventPullRequest, HookEventPullRequestAssign, HookEventPullRequestLabel, HookEventPullRequestMilestone, HookEventPullRequestSync: return "pull_request" case HookEventIssueComment, HookEventPullRequestComment: return "issue_comment" case HookEventPullRequestReviewApproved: return "pull_request_approved" case HookEventPullRequestReviewRejected: return "pull_request_rejected" case HookEventPullRequestReviewComment: return "pull_request_comment" case HookEventWiki: return "wiki" case HookEventRepository: return "repository" case HookEventRelease: return "release" } return "" } // HookRequest represents hook task request information. type HookRequest struct { URL string `json:"url"`
-
@@ -107,7 +45,7 @@ HookID int64 `xorm:"index"`UUID string `xorm:"unique"` api.Payloader `xorm:"-"` PayloadContent string `xorm:"LONGTEXT"` EventType HookEventType EventType webhook_module.HookEventType IsDelivered bool Delivered int64 DeliveredString string `xorm:"-"`
-
-
-
@@ -16,6 +16,7 @@ "code.gitea.io/gitea/modules/secret""code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/util" webhook_module "code.gitea.io/gitea/modules/webhook" "xorm.io/builder" )
-
@@ -46,7 +47,7 @@ HookID int64UUID string } // IsErrWebhookNotExist checks if an error is a ErrWebhookNotExist. // IsErrHookTaskNotExist checks if an error is a ErrHookTaskNotExist. func IsErrHookTaskNotExist(err error) bool { _, ok := err.(ErrHookTaskNotExist) return ok
-
@@ -117,84 +118,22 @@ _, ok := hookContentTypes[name]return ok } // HookEvents is a set of web hook events type HookEvents struct { Create bool `json:"create"` Delete bool `json:"delete"` Fork bool `json:"fork"` Issues bool `json:"issues"` IssueAssign bool `json:"issue_assign"` IssueLabel bool `json:"issue_label"` IssueMilestone bool `json:"issue_milestone"` IssueComment bool `json:"issue_comment"` Push bool `json:"push"` PullRequest bool `json:"pull_request"` PullRequestAssign bool `json:"pull_request_assign"` PullRequestLabel bool `json:"pull_request_label"` PullRequestMilestone bool `json:"pull_request_milestone"` PullRequestComment bool `json:"pull_request_comment"` PullRequestReview bool `json:"pull_request_review"` PullRequestSync bool `json:"pull_request_sync"` Wiki bool `json:"wiki"` Repository bool `json:"repository"` Release bool `json:"release"` Package bool `json:"package"` } // HookEvent represents events that will delivery hook. type HookEvent struct { PushOnly bool `json:"push_only"` SendEverything bool `json:"send_everything"` ChooseEvents bool `json:"choose_events"` BranchFilter string `json:"branch_filter"` HookEvents `json:"events"` } // HookType is the type of a webhook type HookType = string // Types of webhooks const ( GITEA HookType = "gitea" GOGS HookType = "gogs" SLACK HookType = "slack" DISCORD HookType = "discord" DINGTALK HookType = "dingtalk" TELEGRAM HookType = "telegram" MSTEAMS HookType = "msteams" FEISHU HookType = "feishu" MATRIX HookType = "matrix" WECHATWORK HookType = "wechatwork" PACKAGIST HookType = "packagist" ) // HookStatus is the status of a web hook type HookStatus int // Possible statuses of a web hook const ( HookStatusNone = iota HookStatusSucceed HookStatusFail ) // Webhook represents a web hook object. type Webhook struct { ID int64 `xorm:"pk autoincr"` RepoID int64 `xorm:"INDEX"` // An ID of 0 indicates either a default or system webhook OrgID int64 `xorm:"INDEX"` IsSystemWebhook bool URL string `xorm:"url TEXT"` HTTPMethod string `xorm:"http_method"` ContentType HookContentType Secret string `xorm:"TEXT"` Events string `xorm:"TEXT"` *HookEvent `xorm:"-"` IsActive bool `xorm:"INDEX"` Type HookType `xorm:"VARCHAR(16) 'type'"` Meta string `xorm:"TEXT"` // store hook-specific attributes LastStatus HookStatus // Last delivery status ID int64 `xorm:"pk autoincr"` RepoID int64 `xorm:"INDEX"` // An ID of 0 indicates either a default or system webhook OrgID int64 `xorm:"INDEX"` IsSystemWebhook bool URL string `xorm:"url TEXT"` HTTPMethod string `xorm:"http_method"` ContentType HookContentType Secret string `xorm:"TEXT"` Events string `xorm:"TEXT"` *webhook_module.HookEvent `xorm:"-"` IsActive bool `xorm:"INDEX"` Type webhook_module.HookType `xorm:"VARCHAR(16) 'type'"` Meta string `xorm:"TEXT"` // store hook-specific attributes LastStatus webhook_module.HookStatus // Last delivery status // HeaderAuthorizationEncrypted should be accessed using HeaderAuthorization() and SetHeaderAuthorization() HeaderAuthorizationEncrypted string `xorm:"TEXT"`
-
@@ -209,7 +148,7 @@ }// AfterLoad updates the webhook object upon setting a column func (w *Webhook) AfterLoad() { w.HookEvent = &HookEvent{} w.HookEvent = &webhook_module.HookEvent{} if err := json.Unmarshal([]byte(w.Events), w.HookEvent); err != nil { log.Error("Unmarshal[%d]: %v", w.ID, err) }
-
@@ -362,34 +301,34 @@// EventCheckers returns event checkers func (w *Webhook) EventCheckers() []struct { Has func() bool Type HookEventType Type webhook_module.HookEventType } { return []struct { Has func() bool Type HookEventType Type webhook_module.HookEventType }{ {w.HasCreateEvent, HookEventCreate}, {w.HasDeleteEvent, HookEventDelete}, {w.HasForkEvent, HookEventFork}, {w.HasPushEvent, HookEventPush}, {w.HasIssuesEvent, HookEventIssues}, {w.HasIssuesAssignEvent, HookEventIssueAssign}, {w.HasIssuesLabelEvent, HookEventIssueLabel}, {w.HasIssuesMilestoneEvent, HookEventIssueMilestone}, {w.HasIssueCommentEvent, HookEventIssueComment}, {w.HasPullRequestEvent, HookEventPullRequest}, {w.HasPullRequestAssignEvent, HookEventPullRequestAssign}, {w.HasPullRequestLabelEvent, HookEventPullRequestLabel}, {w.HasPullRequestMilestoneEvent, HookEventPullRequestMilestone}, {w.HasPullRequestCommentEvent, HookEventPullRequestComment}, {w.HasPullRequestApprovedEvent, HookEventPullRequestReviewApproved}, {w.HasPullRequestRejectedEvent, HookEventPullRequestReviewRejected}, {w.HasPullRequestCommentEvent, HookEventPullRequestReviewComment}, {w.HasPullRequestSyncEvent, HookEventPullRequestSync}, {w.HasWikiEvent, HookEventWiki}, {w.HasRepositoryEvent, HookEventRepository}, {w.HasReleaseEvent, HookEventRelease}, {w.HasPackageEvent, HookEventPackage}, {w.HasCreateEvent, webhook_module.HookEventCreate}, {w.HasDeleteEvent, webhook_module.HookEventDelete}, {w.HasForkEvent, webhook_module.HookEventFork}, {w.HasPushEvent, webhook_module.HookEventPush}, {w.HasIssuesEvent, webhook_module.HookEventIssues}, {w.HasIssuesAssignEvent, webhook_module.HookEventIssueAssign}, {w.HasIssuesLabelEvent, webhook_module.HookEventIssueLabel}, {w.HasIssuesMilestoneEvent, webhook_module.HookEventIssueMilestone}, {w.HasIssueCommentEvent, webhook_module.HookEventIssueComment}, {w.HasPullRequestEvent, webhook_module.HookEventPullRequest}, {w.HasPullRequestAssignEvent, webhook_module.HookEventPullRequestAssign}, {w.HasPullRequestLabelEvent, webhook_module.HookEventPullRequestLabel}, {w.HasPullRequestMilestoneEvent, webhook_module.HookEventPullRequestMilestone}, {w.HasPullRequestCommentEvent, webhook_module.HookEventPullRequestComment}, {w.HasPullRequestApprovedEvent, webhook_module.HookEventPullRequestReviewApproved}, {w.HasPullRequestRejectedEvent, webhook_module.HookEventPullRequestReviewRejected}, {w.HasPullRequestCommentEvent, webhook_module.HookEventPullRequestReviewComment}, {w.HasPullRequestSyncEvent, webhook_module.HookEventPullRequestSync}, {w.HasWikiEvent, webhook_module.HookEventWiki}, {w.HasRepositoryEvent, webhook_module.HookEventRepository}, {w.HasReleaseEvent, webhook_module.HookEventRelease}, {w.HasPackageEvent, webhook_module.HookEventPackage}, } }
-
@@ -453,7 +392,7 @@ has, err := db.GetEngine(db.DefaultContext).Get(bean)if err != nil { return nil, err } else if !has { return nil, ErrWebhookNotExist{bean.ID} return nil, ErrWebhookNotExist{ID: bean.ID} } return bean, nil }
-
@@ -541,7 +480,7 @@ Get(webhook)if err != nil { return nil, err } else if !has { return nil, ErrWebhookNotExist{id} return nil, ErrWebhookNotExist{ID: id} } return webhook, nil }
-
-
-
@@ -13,6 +13,7 @@ "code.gitea.io/gitea/models/unittest""code.gitea.io/gitea/modules/json" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" )
-
@@ -46,11 +47,11 @@func TestWebhook_UpdateEvent(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) webhook := unittest.AssertExistsAndLoadBean(t, &Webhook{ID: 1}) hookEvent := &HookEvent{ hookEvent := &webhook_module.HookEvent{ PushOnly: true, SendEverything: false, ChooseEvents: false, HookEvents: HookEvents{ HookEvents: webhook_module.HookEvents{ Create: false, Push: true, PullRequest: false,
-
@@ -59,7 +60,7 @@ }webhook.HookEvent = hookEvent assert.NoError(t, webhook.UpdateEvent()) assert.NotEmpty(t, webhook.Events) actualHookEvent := &HookEvent{} actualHookEvent := &webhook_module.HookEvent{} assert.NoError(t, json.Unmarshal([]byte(webhook.Events), actualHookEvent)) assert.Equal(t, *hookEvent, *actualHookEvent) }
-
@@ -74,13 +75,13 @@ "pull_request_review_comment", "pull_request_sync", "wiki", "repository", "release","package", }, (&Webhook{ HookEvent: &HookEvent{SendEverything: true}, HookEvent: &webhook_module.HookEvent{SendEverything: true}, }).EventsArray(), ) assert.Equal(t, []string{"push"}, (&Webhook{ HookEvent: &HookEvent{PushOnly: true}, HookEvent: &webhook_module.HookEvent{PushOnly: true}, }).EventsArray(), ) }
-
-
modules/avatar/hash.go (new)
-
@@ -0,0 +1,28 @@// Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package avatar import ( "crypto/sha256" "encoding/hex" "strconv" ) // HashAvatar will generate a unique string, which ensures that when there's a // different unique ID while the data is the same, it will generate a different // output. It will generate the output according to: // HEX(HASH(uniqueID || - || data)) // The hash being used is SHA256. // The sole purpose of the unique ID is to generate a distinct hash Such that // two unique IDs with the same data will have a different hash output. // The "-" byte is important to ensure that data cannot be modified such that // the first byte is a number, which could lead to a "collision" with the hash // of another unique ID. func HashAvatar(uniqueID int64, data []byte) string { h := sha256.New() h.Write([]byte(strconv.FormatInt(uniqueID, 10))) h.Write([]byte{'-'}) h.Write(data) return hex.EncodeToString(h.Sum(nil)) }
-
-
-
@@ -45,39 +45,6 @@ func GetCache() mc.Cache {return conn } // Get returns the key value from cache with callback when no key exists in cache func Get[V interface{}](key string, getFunc func() (V, error)) (V, error) { if conn == nil || setting.CacheService.TTL == 0 { return getFunc() } cached := conn.Get(key) if value, ok := cached.(V); ok { return value, nil } value, err := getFunc() if err != nil { return value, err } return value, conn.Put(key, value, setting.CacheService.TTLSeconds()) } // Set updates and returns the key value in the cache with callback. The old value is only removed if the updateFunc() is successful func Set[V interface{}](key string, valueFunc func() (V, error)) (V, error) { if conn == nil || setting.CacheService.TTL == 0 { return valueFunc() } value, err := valueFunc() if err != nil { return value, err } return value, conn.Put(key, value, setting.CacheService.TTLSeconds()) } // GetString returns the key value from cache with callback when no key exists in cache func GetString(key string, getFunc func() (string, error)) (string, error) { if conn == nil || setting.CacheService.TTL == 0 {
-
-
-
@@ -219,7 +219,13 @@ // APIAuth converts auth_service.Auth as a middlewarefunc APIAuth(authMethod auth_service.Method) func(*APIContext) { return func(ctx *APIContext) { // Get user from session if logged in. ctx.Doer = authMethod.Verify(ctx.Req, ctx.Resp, ctx, ctx.Session) var err error ctx.Doer, err = authMethod.Verify(ctx.Req, ctx.Resp, ctx, ctx.Session) if err != nil { ctx.Error(http.StatusUnauthorized, "APIAuth", err) return } if ctx.Doer != nil { if ctx.Locale.Language() != ctx.Doer.Language { ctx.Locale = middleware.Locale(ctx.Resp, ctx.Req)
-
@@ -387,7 +393,7 @@ ctx.InternalServerError(err)return } ctx.Repo.CommitID = ctx.Repo.Commit.ID.String() } else if len(refName) == 40 { } else if len(refName) == git.SHAFullLength { ctx.Repo.CommitID = refName ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommit(refName) if err != nil {
-
-
-
@@ -662,7 +662,13 @@// Auth converts auth.Auth as a middleware func Auth(authMethod auth.Method) func(*Context) { return func(ctx *Context) { ctx.Doer = authMethod.Verify(ctx.Req, ctx.Resp, ctx, ctx.Session) var err error ctx.Doer, err = authMethod.Verify(ctx.Req, ctx.Resp, ctx, ctx.Session) if err != nil { log.Error("Failed to verify user %v: %v", ctx.Req.RemoteAddr, err) ctx.Error(http.StatusUnauthorized, "Verify") return } if ctx.Doer != nil { if ctx.Locale.Language() != ctx.Doer.Language { ctx.Locale = middleware.Locale(ctx.Resp, ctx.Req)
-
-
-
@@ -126,7 +126,7 @@ }userCanPush := true requireSigned := false if protectedBranch != nil { userCanPush = protectedBranch.CanUserPush(doer.ID) userCanPush = protectedBranch.CanUserPush(ctx, doer.ID) requireSigned = protectedBranch.RequireSignedCommits }
-
@@ -817,7 +817,7 @@ return refName} // For legacy and API support only full commit sha parts := strings.Split(path, "/") if len(parts) > 0 && len(parts[0]) == 40 { if len(parts) > 0 && len(parts[0]) == git.SHAFullLength { ctx.Repo.TreePath = strings.Join(parts[1:], "/") return parts[0] }
-
@@ -831,7 +831,7 @@ ref := getRefNameFromPath(ctx, path, ctx.Repo.GitRepo.IsBranchExist)if len(ref) == 0 { // maybe it's a renamed branch return getRefNameFromPath(ctx, path, func(s string) bool { b, exist, err := git_model.FindRenamedBranch(ctx.Repo.Repository.ID, s) b, exist, err := git_model.FindRenamedBranch(ctx, ctx.Repo.Repository.ID, s) if err != nil { log.Error("FindRenamedBranch", err) return false
-
@@ -853,7 +853,7 @@ case RepoRefTag:return getRefNameFromPath(ctx, path, ctx.Repo.GitRepo.IsTagExist) case RepoRefCommit: parts := strings.Split(path, "/") if len(parts) > 0 && len(parts[0]) >= 7 && len(parts[0]) <= 40 { if len(parts) > 0 && len(parts[0]) >= 7 && len(parts[0]) <= git.SHAFullLength { ctx.Repo.TreePath = strings.Join(parts[1:], "/") return parts[0] }
-
@@ -962,7 +962,7 @@ ctx.ServerError("GetTagCommit", err)return } ctx.Repo.CommitID = ctx.Repo.Commit.ID.String() } else if len(refName) >= 7 && len(refName) <= 40 { } else if len(refName) >= 7 && len(refName) <= git.SHAFullLength { ctx.Repo.IsViewCommit = true ctx.Repo.CommitID = refName
-
@@ -972,7 +972,7 @@ ctx.NotFound("GetCommit", err)return } // If short commit ID add canonical link header if len(refName) < 40 { if len(refName) < git.SHAFullLength { ctx.RespHeader().Set("Link", fmt.Sprintf("<%s>; rel=\"canonical\"", util.URLJoin(setting.AppURL, strings.Replace(ctx.Req.URL.RequestURI(), util.PathEscapeSegments(refName), url.PathEscape(ctx.Repo.Commit.ID.String()), 1)))) }
-
-
-
-
@@ -22,13 +22,11 @@ access_model "code.gitea.io/gitea/models/perm/access"repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/log" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/services/gitdiff" webhook_service "code.gitea.io/gitea/services/webhook" ) // ToEmail convert models.EmailAddress to api.Email
-
@@ -89,7 +87,7 @@ permission, err := access_model.GetUserRepoPermission(db.DefaultContext, repo, user)if err != nil { return nil, err } branch.UserCanPush = bp.CanUserPush(user.ID) branch.UserCanPush = bp.CanUserPush(db.DefaultContext, user.ID) branch.UserCanMerge = git_model.IsUserMergeWhitelisted(db.DefaultContext, bp, user.ID, permission) }
-
@@ -240,38 +238,6 @@ return &api.GPGKeyEmail{Email: email.Email, Verified: email.IsActivated, } } // ToHook convert models.Webhook to api.Hook func ToHook(repoLink string, w *webhook.Webhook) (*api.Hook, error) { config := map[string]string{ "url": w.URL, "content_type": w.ContentType.Name(), } if w.Type == webhook.SLACK { s := webhook_service.GetSlackHook(w) config["channel"] = s.Channel config["username"] = s.Username config["icon_url"] = s.IconURL config["color"] = s.Color } authorizationHeader, err := w.HeaderAuthorization() if err != nil { return nil, err } return &api.Hook{ ID: w.ID, Type: w.Type, URL: fmt.Sprintf("%s/settings/hooks/%d", repoLink, w.ID), Active: w.IsActive, Config: config, Events: w.EventsArray(), AuthorizationHeader: authorizationHeader, Updated: w.UpdatedUnix.AsTime(), Created: w.CreatedUnix.AsTime(), }, nil } // ToGitHook convert git.Hook to api.GitHook
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -20,7 +20,7 @@ State: status.State,TargetURL: status.TargetURL, Description: status.Description, ID: status.Index, URL: status.APIURL(), URL: status.APIURL(ctx), Context: status.Context, }
-
-
-
-
-
-
-
-
@@ -7,7 +7,17 @@ // Code generated by build/generate-emoji.go. DO NOT EDIT.// Sourced from https://raw.githubusercontent.com/github/gemoji/master/db/emoji.json var GemojiData = Gemoji{ {"\U0001f44d", "thumbs up", []string{"+1", "thumbsup"}, "6.0", true}, {"\U0001f44d\U0001f3ff", "thumbs up: Dark Skin Tone", []string{"+1_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44d\U0001f3fb", "thumbs up: Light Skin Tone", []string{"+1_Light_Skin_Tone"}, "12.0", false}, {"\U0001f44d\U0001f3fe", "thumbs up: Medium-Dark Skin Tone", []string{"+1_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44d\U0001f3fc", "thumbs up: Medium-Light Skin Tone", []string{"+1_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f44d\U0001f3fd", "thumbs up: Medium Skin Tone", []string{"+1_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f44e", "thumbs down", []string{"-1", "thumbsdown"}, "6.0", true}, {"\U0001f44e\U0001f3ff", "thumbs down: Dark Skin Tone", []string{"-1_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44e\U0001f3fb", "thumbs down: Light Skin Tone", []string{"-1_Light_Skin_Tone"}, "12.0", false}, {"\U0001f44e\U0001f3fe", "thumbs down: Medium-Dark Skin Tone", []string{"-1_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44e\U0001f3fc", "thumbs down: Medium-Light Skin Tone", []string{"-1_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f44e\U0001f3fd", "thumbs down: Medium Skin Tone", []string{"-1_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f4af", "hundred points", []string{"100"}, "6.0", false}, {"\U0001f522", "input numbers", []string{"1234"}, "6.0", false}, {"\U0001f947", "1st place medal", []string{"1st_place_medal"}, "9.0", false},
-
@@ -20,8 +30,14 @@ {"\U0001f9ee", "abacus", []string{"abacus"}, "11.0", false},{"\U0001f524", "input latin letters", []string{"abc"}, "6.0", false}, {"\U0001f521", "input latin lowercase", []string{"abcd"}, "6.0", false}, {"\U0001f251", "Japanese โacceptableโ button", []string{"accept"}, "6.0", false}, {"\U0001fa97", "accordion", []string{"accordion"}, "13.0", false}, {"\U0001fa79", "adhesive bandage", []string{"adhesive_bandage"}, "12.0", false}, {"\U0001f9d1", "person", []string{"adult"}, "11.0", true}, {"\U0001f9d1\U0001f3ff", "person: Dark Skin Tone", []string{"adult_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb", "person: Light Skin Tone", []string{"adult_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe", "person: Medium-Dark Skin Tone", []string{"adult_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc", "person: Medium-Light Skin Tone", []string{"adult_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd", "person: Medium Skin Tone", []string{"adult_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6a1", "aerial tramway", []string{"aerial_tramway"}, "6.0", false}, {"\U0001f1e6\U0001f1eb", "flag: Afghanistan", []string{"afghanistan"}, "6.0", false}, {"\u2708\ufe0f", "airplane", []string{"airplane"}, "", false},
-
@@ -34,9 +50,15 @@ {"\U0001f47d", "alien", []string{"alien"}, "6.0", false},{"\U0001f691", "ambulance", []string{"ambulance"}, "6.0", false}, {"\U0001f1e6\U0001f1f8", "flag: American Samoa", []string{"american_samoa"}, "6.0", false}, {"\U0001f3fa", "amphora", []string{"amphora"}, "8.0", false}, {"\U0001fac0", "anatomical heart", []string{"anatomical_heart"}, "13.0", false}, {"\u2693", "anchor", []string{"anchor"}, "4.1", false}, {"\U0001f1e6\U0001f1e9", "flag: Andorra", []string{"andorra"}, "6.0", false}, {"\U0001f47c", "baby angel", []string{"angel"}, "6.0", true}, {"\U0001f47c\U0001f3ff", "baby angel: Dark Skin Tone", []string{"angel_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f47c\U0001f3fb", "baby angel: Light Skin Tone", []string{"angel_Light_Skin_Tone"}, "12.0", false}, {"\U0001f47c\U0001f3fe", "baby angel: Medium-Dark Skin Tone", []string{"angel_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f47c\U0001f3fc", "baby angel: Medium-Light Skin Tone", []string{"angel_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f47c\U0001f3fd", "baby angel: Medium Skin Tone", []string{"angel_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f4a2", "anger symbol", []string{"anger"}, "6.0", false}, {"\U0001f1e6\U0001f1f4", "flag: Angola", []string{"angola"}, "6.0", false}, {"\U0001f620", "angry face", []string{"angry"}, "6.0", false},
-
@@ -74,11 +96,21 @@ {"\U0001f3a8", "artist palette", []string{"art"}, "6.0", false},{"\U0001f69b", "articulated lorry", []string{"articulated_lorry"}, "6.0", false}, {"\U0001f6f0\ufe0f", "satellite", []string{"artificial_satellite"}, "7.0", false}, {"\U0001f9d1\u200d\U0001f3a8", "artist", []string{"artist"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f3a8", "artist: Dark Skin Tone", []string{"artist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f3a8", "artist: Light Skin Tone", []string{"artist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f3a8", "artist: Medium-Dark Skin Tone", []string{"artist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f3a8", "artist: Medium-Light Skin Tone", []string{"artist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f3a8", "artist: Medium Skin Tone", []string{"artist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1e6\U0001f1fc", "flag: Aruba", []string{"aruba"}, "6.0", false}, {"\U0001f1e6\U0001f1e8", "flag: Ascension Island", []string{"ascension_island"}, "11.0", false}, {"*\ufe0f\u20e3", "keycap: *", []string{"asterisk"}, "", false}, {"\U0001f632", "astonished face", []string{"astonished"}, "6.0", false}, {"\U0001f9d1\u200d\U0001f680", "astronaut", []string{"astronaut"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f680", "astronaut: Dark Skin Tone", []string{"astronaut_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f680", "astronaut: Light Skin Tone", []string{"astronaut_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f680", "astronaut: Medium-Dark Skin Tone", []string{"astronaut_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f680", "astronaut: Medium-Light Skin Tone", []string{"astronaut_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f680", "astronaut: Medium Skin Tone", []string{"astronaut_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f45f", "running shoe", []string{"athletic_shoe"}, "6.0", false}, {"\U0001f3e7", "ATM sign", []string{"atm"}, "6.0", false}, {"\u269b\ufe0f", "atom symbol", []string{"atom_symbol"}, "4.1", false},
-
@@ -90,6 +122,11 @@ {"\U0001fa93", "axe", []string{"axe"}, "12.0", false},{"\U0001f1e6\U0001f1ff", "flag: Azerbaijan", []string{"azerbaijan"}, "6.0", false}, {"\U0001f171\ufe0f", "B button (blood type)", []string{"b"}, "6.0", false}, {"\U0001f476", "baby", []string{"baby"}, "6.0", true}, {"\U0001f476\U0001f3ff", "baby: Dark Skin Tone", []string{"baby_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f476\U0001f3fb", "baby: Light Skin Tone", []string{"baby_Light_Skin_Tone"}, "12.0", false}, {"\U0001f476\U0001f3fe", "baby: Medium-Dark Skin Tone", []string{"baby_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f476\U0001f3fc", "baby: Medium-Light Skin Tone", []string{"baby_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f476\U0001f3fd", "baby: Medium Skin Tone", []string{"baby_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f37c", "baby bottle", []string{"baby_bottle"}, "6.0", false}, {"\U0001f424", "baby chick", []string{"baby_chick"}, "6.0", false}, {"\U0001f6bc", "baby symbol", []string{"baby_symbol"}, "6.0", false},
-
@@ -104,7 +141,17 @@ {"\U0001f1e7\U0001f1f8", "flag: Bahamas", []string{"bahamas"}, "6.0", false},{"\U0001f1e7\U0001f1ed", "flag: Bahrain", []string{"bahrain"}, "6.0", false}, {"\u2696\ufe0f", "balance scale", []string{"balance_scale"}, "4.1", false}, {"\U0001f468\u200d\U0001f9b2", "man: bald", []string{"bald_man"}, "11.0", true}, {"\U0001f468\U0001f3ff\u200d\U0001f9b2", "man: bald: Dark Skin Tone", []string{"bald_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f9b2", "man: bald: Light Skin Tone", []string{"bald_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f9b2", "man: bald: Medium-Dark Skin Tone", []string{"bald_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f9b2", "man: bald: Medium-Light Skin Tone", []string{"bald_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f9b2", "man: bald: Medium Skin Tone", []string{"bald_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f9b2", "woman: bald", []string{"bald_woman"}, "11.0", true}, {"\U0001f469\U0001f3ff\u200d\U0001f9b2", "woman: bald: Dark Skin Tone", []string{"bald_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f9b2", "woman: bald: Light Skin Tone", []string{"bald_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f9b2", "woman: bald: Medium-Dark Skin Tone", []string{"bald_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f9b2", "woman: bald: Medium-Light Skin Tone", []string{"bald_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f9b2", "woman: bald: Medium Skin Tone", []string{"bald_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001fa70", "ballet shoes", []string{"ballet_shoes"}, "12.0", false}, {"\U0001f388", "balloon", []string{"balloon"}, "6.0", false}, {"\U0001f5f3\ufe0f", "ballot box with ballot", []string{"ballot_box"}, "7.0", false},
-
@@ -123,20 +170,34 @@ {"\U0001f9fa", "basket", []string{"basket"}, "11.0", false},{"\U0001f3c0", "basketball", []string{"basketball"}, "6.0", false}, {"\U0001f987", "bat", []string{"bat"}, "9.0", false}, {"\U0001f6c0", "person taking bath", []string{"bath"}, "6.0", true}, {"\U0001f6c0\U0001f3ff", "person taking bath: Dark Skin Tone", []string{"bath_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6c0\U0001f3fb", "person taking bath: Light Skin Tone", []string{"bath_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6c0\U0001f3fe", "person taking bath: Medium-Dark Skin Tone", []string{"bath_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6c0\U0001f3fc", "person taking bath: Medium-Light Skin Tone", []string{"bath_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6c0\U0001f3fd", "person taking bath: Medium Skin Tone", []string{"bath_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6c1", "bathtub", []string{"bathtub"}, "6.0", false}, {"\U0001f50b", "battery", []string{"battery"}, "6.0", false}, {"\U0001f3d6\ufe0f", "beach with umbrella", []string{"beach_umbrella"}, "7.0", false}, {"\U0001fad8", "beans", []string{"beans"}, "14.0", false}, {"\U0001f43b", "bear", []string{"bear"}, "6.0", false}, {"\U0001f9d4", "person: beard", []string{"bearded_person"}, "11.0", true}, {"\U0001f9d4\U0001f3ff", "person: beard: Dark Skin Tone", []string{"bearded_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fb", "person: beard: Light Skin Tone", []string{"bearded_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fe", "person: beard: Medium-Dark Skin Tone", []string{"bearded_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fc", "person: beard: Medium-Light Skin Tone", []string{"bearded_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fd", "person: beard: Medium Skin Tone", []string{"bearded_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9ab", "beaver", []string{"beaver"}, "13.0", false}, {"\U0001f6cf\ufe0f", "bed", []string{"bed"}, "7.0", false}, {"\U0001f41d", "honeybee", []string{"bee", "honeybee"}, "6.0", false}, {"\U0001f37a", "beer mug", []string{"beer"}, "6.0", false}, {"\U0001f37b", "clinking beer mugs", []string{"beers"}, "6.0", false}, {"\U0001fab2", "beetle", []string{"beetle"}, "13.0", false}, {"\U0001f530", "Japanese symbol for beginner", []string{"beginner"}, "6.0", false}, {"\U0001f1e7\U0001f1fe", "flag: Belarus", []string{"belarus"}, "6.0", false}, {"\U0001f1e7\U0001f1ea", "flag: Belgium", []string{"belgium"}, "6.0", false}, {"\U0001f1e7\U0001f1ff", "flag: Belize", []string{"belize"}, "6.0", false}, {"\U0001f514", "bell", []string{"bell"}, "6.0", false}, {"\U0001fad1", "bell pepper", []string{"bell_pepper"}, "13.0", false}, {"\U0001f6ce\ufe0f", "bellhop bell", []string{"bellhop_bell"}, "7.0", false}, {"\U0001f1e7\U0001f1ef", "flag: Benin", []string{"benin"}, "6.0", false}, {"\U0001f371", "bento box", []string{"bento"}, "6.0", false},
-
@@ -144,14 +205,32 @@ {"\U0001f1e7\U0001f1f2", "flag: Bermuda", []string{"bermuda"}, "6.0", false},{"\U0001f9c3", "beverage box", []string{"beverage_box"}, "12.0", false}, {"\U0001f1e7\U0001f1f9", "flag: Bhutan", []string{"bhutan"}, "6.0", false}, {"\U0001f6b4", "person biking", []string{"bicyclist"}, "6.0", true}, {"\U0001f6b4\U0001f3ff", "person biking: Dark Skin Tone", []string{"bicyclist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fb", "person biking: Light Skin Tone", []string{"bicyclist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fe", "person biking: Medium-Dark Skin Tone", []string{"bicyclist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fc", "person biking: Medium-Light Skin Tone", []string{"bicyclist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fd", "person biking: Medium Skin Tone", []string{"bicyclist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6b2", "bicycle", []string{"bike"}, "6.0", false}, {"\U0001f6b4\u200d\u2642\ufe0f", "man biking", []string{"biking_man"}, "11.0", true}, {"\U0001f6b4\U0001f3ff\u200d\u2642\ufe0f", "man biking: Dark Skin Tone", []string{"biking_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fb\u200d\u2642\ufe0f", "man biking: Light Skin Tone", []string{"biking_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fe\u200d\u2642\ufe0f", "man biking: Medium-Dark Skin Tone", []string{"biking_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fc\u200d\u2642\ufe0f", "man biking: Medium-Light Skin Tone", []string{"biking_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fd\u200d\u2642\ufe0f", "man biking: Medium Skin Tone", []string{"biking_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\u200d\u2640\ufe0f", "woman biking", []string{"biking_woman"}, "6.0", true}, {"\U0001f6b4\U0001f3ff\u200d\u2640\ufe0f", "woman biking: Dark Skin Tone", []string{"biking_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fb\u200d\u2640\ufe0f", "woman biking: Light Skin Tone", []string{"biking_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fe\u200d\u2640\ufe0f", "woman biking: Medium-Dark Skin Tone", []string{"biking_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fc\u200d\u2640\ufe0f", "woman biking: Medium-Light Skin Tone", []string{"biking_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fd\u200d\u2640\ufe0f", "woman biking: Medium Skin Tone", []string{"biking_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f459", "bikini", []string{"bikini"}, "6.0", false}, {"\U0001f9e2", "billed cap", []string{"billed_cap"}, "11.0", false}, {"\u2623\ufe0f", "biohazard", []string{"biohazard"}, "", false}, {"\U0001f426", "bird", []string{"bird"}, "6.0", false}, {"\U0001f382", "birthday cake", []string{"birthday"}, "6.0", false}, {"\U0001f9ac", "bison", []string{"bison"}, "13.0", false}, {"\U0001fae6", "biting lip", []string{"biting_lip"}, "14.0", false}, {"\U0001f408\u200d\u2b1b", "black cat", []string{"black_cat"}, "13.0", false}, {"\u26ab", "black circle", []string{"black_circle"}, "4.1", false}, {"\U0001f3f4", "black flag", []string{"black_flag"}, "7.0", false}, {"\U0001f5a4", "black heart", []string{"black_heart"}, "9.0", false},
-
@@ -163,14 +242,30 @@ {"\u2712\ufe0f", "black nib", []string{"black_nib"}, "", false},{"\u25aa\ufe0f", "black small square", []string{"black_small_square"}, "", false}, {"\U0001f532", "black square button", []string{"black_square_button"}, "6.0", false}, {"\U0001f471\u200d\u2642\ufe0f", "man: blond hair", []string{"blond_haired_man"}, "11.0", true}, {"\U0001f471\U0001f3ff\u200d\u2642\ufe0f", "man: blond hair: Dark Skin Tone", []string{"blond_haired_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fb\u200d\u2642\ufe0f", "man: blond hair: Light Skin Tone", []string{"blond_haired_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fe\u200d\u2642\ufe0f", "man: blond hair: Medium-Dark Skin Tone", []string{"blond_haired_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fc\u200d\u2642\ufe0f", "man: blond hair: Medium-Light Skin Tone", []string{"blond_haired_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fd\u200d\u2642\ufe0f", "man: blond hair: Medium Skin Tone", []string{"blond_haired_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f471", "person: blond hair", []string{"blond_haired_person"}, "6.0", true}, {"\U0001f471\U0001f3ff", "person: blond hair: Dark Skin Tone", []string{"blond_haired_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fb", "person: blond hair: Light Skin Tone", []string{"blond_haired_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fe", "person: blond hair: Medium-Dark Skin Tone", []string{"blond_haired_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fc", "person: blond hair: Medium-Light Skin Tone", []string{"blond_haired_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fd", "person: blond hair: Medium Skin Tone", []string{"blond_haired_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f471\u200d\u2640\ufe0f", "woman: blond hair", []string{"blond_haired_woman", "blonde_woman"}, "6.0", true}, {"\U0001f471\U0001f3ff\u200d\u2640\ufe0f", "woman: blond hair: Dark Skin Tone", []string{"blond_haired_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fb\u200d\u2640\ufe0f", "woman: blond hair: Light Skin Tone", []string{"blond_haired_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fe\u200d\u2640\ufe0f", "woman: blond hair: Medium-Dark Skin Tone", []string{"blond_haired_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fc\u200d\u2640\ufe0f", "woman: blond hair: Medium-Light Skin Tone", []string{"blond_haired_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fd\u200d\u2640\ufe0f", "woman: blond hair: Medium Skin Tone", []string{"blond_haired_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f33c", "blossom", []string{"blossom"}, "6.0", false}, {"\U0001f421", "blowfish", []string{"blowfish"}, "6.0", false}, {"\U0001f4d8", "blue book", []string{"blue_book"}, "6.0", false}, {"\U0001f699", "sport utility vehicle", []string{"blue_car"}, "6.0", false}, {"\U0001f499", "blue heart", []string{"blue_heart"}, "6.0", false}, {"\U0001f7e6", "blue square", []string{"blue_square"}, "12.0", false}, {"\U0001fad0", "blueberries", []string{"blueberries"}, "13.0", false}, {"\U0001f60a", "smiling face with smiling eyes", []string{"blush"}, "6.0", false}, {"\U0001f417", "boar", []string{"boar"}, "6.0", false}, {"\u26f5", "sailboat", []string{"boat", "sailboat"}, "5.2", false},
-
@@ -182,26 +277,67 @@ {"\U0001f516", "bookmark", []string{"bookmark"}, "6.0", false},{"\U0001f4d1", "bookmark tabs", []string{"bookmark_tabs"}, "6.0", false}, {"\U0001f4da", "books", []string{"books"}, "6.0", false}, {"\U0001f4a5", "collision", []string{"boom", "collision"}, "6.0", false}, {"\U0001fa83", "boomerang", []string{"boomerang"}, "13.0", false}, {"\U0001f462", "womanโs boot", []string{"boot"}, "6.0", false}, {"\U0001f1e7\U0001f1e6", "flag: Bosnia & Herzegovina", []string{"bosnia_herzegovina"}, "6.0", false}, {"\U0001f1e7\U0001f1fc", "flag: Botswana", []string{"botswana"}, "6.0", false}, {"\u26f9\ufe0f\u200d\u2642\ufe0f", "man bouncing ball", []string{"bouncing_ball_man", "basketball_man"}, "11.0", true}, {"\u26f9\U0001f3ff\ufe0f\u200d\u2642\ufe0f", "man bouncing ball: Dark Skin Tone", []string{"bouncing_ball_man_Dark_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fb\ufe0f\u200d\u2642\ufe0f", "man bouncing ball: Light Skin Tone", []string{"bouncing_ball_man_Light_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fe\ufe0f\u200d\u2642\ufe0f", "man bouncing ball: Medium-Dark Skin Tone", []string{"bouncing_ball_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fc\ufe0f\u200d\u2642\ufe0f", "man bouncing ball: Medium-Light Skin Tone", []string{"bouncing_ball_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fd\ufe0f\u200d\u2642\ufe0f", "man bouncing ball: Medium Skin Tone", []string{"bouncing_ball_man_Medium_Skin_Tone"}, "12.0", false}, {"\u26f9\ufe0f", "person bouncing ball", []string{"bouncing_ball_person"}, "5.2", true}, {"\u26f9\U0001f3ff\ufe0f", "person bouncing ball: Dark Skin Tone", []string{"bouncing_ball_person_Dark_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fb\ufe0f", "person bouncing ball: Light Skin Tone", []string{"bouncing_ball_person_Light_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fe\ufe0f", "person bouncing ball: Medium-Dark Skin Tone", []string{"bouncing_ball_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fc\ufe0f", "person bouncing ball: Medium-Light Skin Tone", []string{"bouncing_ball_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fd\ufe0f", "person bouncing ball: Medium Skin Tone", []string{"bouncing_ball_person_Medium_Skin_Tone"}, "12.0", false}, {"\u26f9\ufe0f\u200d\u2640\ufe0f", "woman bouncing ball", []string{"bouncing_ball_woman", "basketball_woman"}, "7.0", true}, {"\u26f9\U0001f3ff\ufe0f\u200d\u2640\ufe0f", "woman bouncing ball: Dark Skin Tone", []string{"bouncing_ball_woman_Dark_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fb\ufe0f\u200d\u2640\ufe0f", "woman bouncing ball: Light Skin Tone", []string{"bouncing_ball_woman_Light_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fe\ufe0f\u200d\u2640\ufe0f", "woman bouncing ball: Medium-Dark Skin Tone", []string{"bouncing_ball_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fc\ufe0f\u200d\u2640\ufe0f", "woman bouncing ball: Medium-Light Skin Tone", []string{"bouncing_ball_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fd\ufe0f\u200d\u2640\ufe0f", "woman bouncing ball: Medium Skin Tone", []string{"bouncing_ball_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f490", "bouquet", []string{"bouquet"}, "6.0", false}, {"\U0001f1e7\U0001f1fb", "flag: Bouvet Island", []string{"bouvet_island"}, "11.0", false}, {"\U0001f647", "person bowing", []string{"bow"}, "6.0", true}, {"\U0001f647\U0001f3ff", "person bowing: Dark Skin Tone", []string{"bow_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fb", "person bowing: Light Skin Tone", []string{"bow_Light_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fe", "person bowing: Medium-Dark Skin Tone", []string{"bow_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fc", "person bowing: Medium-Light Skin Tone", []string{"bow_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fd", "person bowing: Medium Skin Tone", []string{"bow_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3f9", "bow and arrow", []string{"bow_and_arrow"}, "8.0", false}, {"\U0001f647\u200d\u2642\ufe0f", "man bowing", []string{"bowing_man"}, "11.0", true}, {"\U0001f647\U0001f3ff\u200d\u2642\ufe0f", "man bowing: Dark Skin Tone", []string{"bowing_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fb\u200d\u2642\ufe0f", "man bowing: Light Skin Tone", []string{"bowing_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fe\u200d\u2642\ufe0f", "man bowing: Medium-Dark Skin Tone", []string{"bowing_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fc\u200d\u2642\ufe0f", "man bowing: Medium-Light Skin Tone", []string{"bowing_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fd\u200d\u2642\ufe0f", "man bowing: Medium Skin Tone", []string{"bowing_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f647\u200d\u2640\ufe0f", "woman bowing", []string{"bowing_woman"}, "6.0", true}, {"\U0001f647\U0001f3ff\u200d\u2640\ufe0f", "woman bowing: Dark Skin Tone", []string{"bowing_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fb\u200d\u2640\ufe0f", "woman bowing: Light Skin Tone", []string{"bowing_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fe\u200d\u2640\ufe0f", "woman bowing: Medium-Dark Skin Tone", []string{"bowing_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fc\u200d\u2640\ufe0f", "woman bowing: Medium-Light Skin Tone", []string{"bowing_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fd\u200d\u2640\ufe0f", "woman bowing: Medium Skin Tone", []string{"bowing_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f963", "bowl with spoon", []string{"bowl_with_spoon"}, "11.0", false}, {"\U0001f3b3", "bowling", []string{"bowling"}, "6.0", false}, {"\U0001f94a", "boxing glove", []string{"boxing_glove"}, "9.0", false}, {"\U0001f466", "boy", []string{"boy"}, "6.0", true}, {"\U0001f466\U0001f3ff", "boy: Dark Skin Tone", []string{"boy_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f466\U0001f3fb", "boy: Light Skin Tone", []string{"boy_Light_Skin_Tone"}, "12.0", false}, {"\U0001f466\U0001f3fe", "boy: Medium-Dark Skin Tone", []string{"boy_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f466\U0001f3fc", "boy: Medium-Light Skin Tone", []string{"boy_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f466\U0001f3fd", "boy: Medium Skin Tone", []string{"boy_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9e0", "brain", []string{"brain"}, "11.0", false}, {"\U0001f1e7\U0001f1f7", "flag: Brazil", []string{"brazil"}, "6.0", false}, {"\U0001f35e", "bread", []string{"bread"}, "6.0", false}, {"\U0001f931", "breast-feeding", []string{"breast_feeding"}, "11.0", true}, {"\U0001f931\U0001f3ff", "breast-feeding: Dark Skin Tone", []string{"breast_feeding_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f931\U0001f3fb", "breast-feeding: Light Skin Tone", []string{"breast_feeding_Light_Skin_Tone"}, "12.0", false}, {"\U0001f931\U0001f3fe", "breast-feeding: Medium-Dark Skin Tone", []string{"breast_feeding_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f931\U0001f3fc", "breast-feeding: Medium-Light Skin Tone", []string{"breast_feeding_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f931\U0001f3fd", "breast-feeding: Medium Skin Tone", []string{"breast_feeding_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9f1", "brick", []string{"bricks"}, "11.0", false}, {"\U0001f309", "bridge at night", []string{"bridge_at_night"}, "6.0", false}, {"\U0001f4bc", "briefcase", []string{"briefcase"}, "6.0", false},
-
@@ -214,6 +350,9 @@ {"\U0001f7e4", "brown circle", []string{"brown_circle"}, "12.0", false},{"\U0001f90e", "brown heart", []string{"brown_heart"}, "12.0", false}, {"\U0001f7eb", "brown square", []string{"brown_square"}, "12.0", false}, {"\U0001f1e7\U0001f1f3", "flag: Brunei", []string{"brunei"}, "6.0", false}, {"\U0001f9cb", "bubble tea", []string{"bubble_tea"}, "13.0", false}, {"\U0001fae7", "bubbles", []string{"bubbles"}, "14.0", false}, {"\U0001faa3", "bucket", []string{"bucket"}, "13.0", false}, {"\U0001f41b", "bug", []string{"bug"}, "6.0", false}, {"\U0001f3d7\ufe0f", "building construction", []string{"building_construction"}, "7.0", false}, {"\U0001f4a1", "light bulb", []string{"bulb"}, "6.0", false},
-
@@ -225,6 +364,11 @@ {"\U0001f32f", "burrito", []string{"burrito"}, "8.0", false},{"\U0001f1e7\U0001f1ee", "flag: Burundi", []string{"burundi"}, "6.0", false}, {"\U0001f68c", "bus", []string{"bus"}, "6.0", false}, {"\U0001f574\ufe0f", "person in suit levitating", []string{"business_suit_levitating"}, "7.0", true}, {"\U0001f574\U0001f3ff\ufe0f", "person in suit levitating: Dark Skin Tone", []string{"business_suit_levitating_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f574\U0001f3fb\ufe0f", "person in suit levitating: Light Skin Tone", []string{"business_suit_levitating_Light_Skin_Tone"}, "12.0", false}, {"\U0001f574\U0001f3fe\ufe0f", "person in suit levitating: Medium-Dark Skin Tone", []string{"business_suit_levitating_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f574\U0001f3fc\ufe0f", "person in suit levitating: Medium-Light Skin Tone", []string{"business_suit_levitating_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f574\U0001f3fd\ufe0f", "person in suit levitating: Medium Skin Tone", []string{"business_suit_levitating_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f68f", "bus stop", []string{"busstop"}, "6.0", false}, {"\U0001f464", "bust in silhouette", []string{"bust_in_silhouette"}, "6.0", false}, {"\U0001f465", "busts in silhouette", []string{"busts_in_silhouette"}, "6.0", false},
-
@@ -234,6 +378,11 @@ {"\U0001f335", "cactus", []string{"cactus"}, "6.0", false},{"\U0001f370", "shortcake", []string{"cake"}, "6.0", false}, {"\U0001f4c6", "tear-off calendar", []string{"calendar"}, "6.0", false}, {"\U0001f919", "call me hand", []string{"call_me_hand"}, "9.0", true}, {"\U0001f919\U0001f3ff", "call me hand: Dark Skin Tone", []string{"call_me_hand_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f919\U0001f3fb", "call me hand: Light Skin Tone", []string{"call_me_hand_Light_Skin_Tone"}, "12.0", false}, {"\U0001f919\U0001f3fe", "call me hand: Medium-Dark Skin Tone", []string{"call_me_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f919\U0001f3fc", "call me hand: Medium-Light Skin Tone", []string{"call_me_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f919\U0001f3fd", "call me hand: Medium Skin Tone", []string{"call_me_hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f4f2", "mobile phone with arrow", []string{"calling"}, "6.0", false}, {"\U0001f1f0\U0001f1ed", "flag: Cambodia", []string{"cambodia"}, "6.0", false}, {"\U0001f42b", "two-hump camel", []string{"camel"}, "6.0", false},
-
@@ -257,8 +406,14 @@ {"\U0001f4c7", "card index", []string{"card_index"}, "6.0", false},{"\U0001f5c2\ufe0f", "card index dividers", []string{"card_index_dividers"}, "7.0", false}, {"\U0001f1e7\U0001f1f6", "flag: Caribbean Netherlands", []string{"caribbean_netherlands"}, "6.0", false}, {"\U0001f3a0", "carousel horse", []string{"carousel_horse"}, "6.0", false}, {"\U0001fa9a", "carpentry saw", []string{"carpentry_saw"}, "13.0", false}, {"\U0001f955", "carrot", []string{"carrot"}, "9.0", false}, {"\U0001f938", "person cartwheeling", []string{"cartwheeling"}, "11.0", true}, {"\U0001f938\U0001f3ff", "person cartwheeling: Dark Skin Tone", []string{"cartwheeling_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fb", "person cartwheeling: Light Skin Tone", []string{"cartwheeling_Light_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fe", "person cartwheeling: Medium-Dark Skin Tone", []string{"cartwheeling_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fc", "person cartwheeling: Medium-Light Skin Tone", []string{"cartwheeling_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fd", "person cartwheeling: Medium Skin Tone", []string{"cartwheeling_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f431", "cat face", []string{"cat"}, "6.0", false}, {"\U0001f408", "cat", []string{"cat2"}, "6.0", false}, {"\U0001f1f0\U0001f1fe", "flag: Cayman Islands", []string{"cayman_islands"}, "6.0", false},
-
@@ -280,6 +435,11 @@ {"\u265f\ufe0f", "chess pawn", []string{"chess_pawn"}, "11.0", false},{"\U0001f330", "chestnut", []string{"chestnut"}, "6.0", false}, {"\U0001f414", "chicken", []string{"chicken"}, "6.0", false}, {"\U0001f9d2", "child", []string{"child"}, "11.0", true}, {"\U0001f9d2\U0001f3ff", "child: Dark Skin Tone", []string{"child_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d2\U0001f3fb", "child: Light Skin Tone", []string{"child_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d2\U0001f3fe", "child: Medium-Dark Skin Tone", []string{"child_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d2\U0001f3fc", "child: Medium-Light Skin Tone", []string{"child_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d2\U0001f3fd", "child: Medium Skin Tone", []string{"child_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6b8", "children crossing", []string{"children_crossing"}, "6.0", false}, {"\U0001f1e8\U0001f1f1", "flag: Chile", []string{"chile"}, "6.0", false}, {"\U0001f43f\ufe0f", "chipmunk", []string{"chipmunk"}, "7.0", false},
-
@@ -296,11 +456,31 @@ {"\U0001f3d9\ufe0f", "cityscape", []string{"cityscape"}, "7.0", false},{"\U0001f191", "CL button", []string{"cl"}, "6.0", false}, {"\U0001f5dc\ufe0f", "clamp", []string{"clamp"}, "7.0", false}, {"\U0001f44f", "clapping hands", []string{"clap"}, "6.0", true}, {"\U0001f44f\U0001f3ff", "clapping hands: Dark Skin Tone", []string{"clap_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44f\U0001f3fb", "clapping hands: Light Skin Tone", []string{"clap_Light_Skin_Tone"}, "12.0", false}, {"\U0001f44f\U0001f3fe", "clapping hands: Medium-Dark Skin Tone", []string{"clap_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44f\U0001f3fc", "clapping hands: Medium-Light Skin Tone", []string{"clap_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f44f\U0001f3fd", "clapping hands: Medium Skin Tone", []string{"clap_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3ac", "clapper board", []string{"clapper"}, "6.0", false}, {"\U0001f3db\ufe0f", "classical building", []string{"classical_building"}, "7.0", false}, {"\U0001f9d7", "person climbing", []string{"climbing"}, "11.0", true}, {"\U0001f9d7\U0001f3ff", "person climbing: Dark Skin Tone", []string{"climbing_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fb", "person climbing: Light Skin Tone", []string{"climbing_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fe", "person climbing: Medium-Dark Skin Tone", []string{"climbing_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fc", "person climbing: Medium-Light Skin Tone", []string{"climbing_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fd", "person climbing: Medium Skin Tone", []string{"climbing_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\u200d\u2642\ufe0f", "man climbing", []string{"climbing_man"}, "11.0", true}, {"\U0001f9d7\U0001f3ff\u200d\u2642\ufe0f", "man climbing: Dark Skin Tone", []string{"climbing_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fb\u200d\u2642\ufe0f", "man climbing: Light Skin Tone", []string{"climbing_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fe\u200d\u2642\ufe0f", "man climbing: Medium-Dark Skin Tone", []string{"climbing_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fc\u200d\u2642\ufe0f", "man climbing: Medium-Light Skin Tone", []string{"climbing_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fd\u200d\u2642\ufe0f", "man climbing: Medium Skin Tone", []string{"climbing_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\u200d\u2640\ufe0f", "woman climbing", []string{"climbing_woman"}, "11.0", true}, {"\U0001f9d7\U0001f3ff\u200d\u2640\ufe0f", "woman climbing: Dark Skin Tone", []string{"climbing_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fb\u200d\u2640\ufe0f", "woman climbing: Light Skin Tone", []string{"climbing_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fe\u200d\u2640\ufe0f", "woman climbing: Medium-Dark Skin Tone", []string{"climbing_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fc\u200d\u2640\ufe0f", "woman climbing: Medium-Light Skin Tone", []string{"climbing_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fd\u200d\u2640\ufe0f", "woman climbing: Medium Skin Tone", []string{"climbing_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f942", "clinking glasses", []string{"clinking_glasses"}, "9.0", false}, {"\U0001f4cb", "clipboard", []string{"clipboard"}, "6.0", false}, {"\U0001f1e8\U0001f1f5", "flag: Clipperton Island", []string{"clipperton_island"}, "11.0", false},
-
@@ -340,11 +520,13 @@ {"\U0001f921", "clown face", []string{"clown_face"}, "9.0", false},{"\u2663\ufe0f", "club suit", []string{"clubs"}, "", false}, {"\U0001f1e8\U0001f1f3", "flag: China", []string{"cn"}, "6.0", false}, {"\U0001f9e5", "coat", []string{"coat"}, "11.0", false}, {"\U0001fab3", "cockroach", []string{"cockroach"}, "13.0", false}, {"\U0001f378", "cocktail glass", []string{"cocktail"}, "6.0", false}, {"\U0001f965", "coconut", []string{"coconut"}, "11.0", false}, {"\U0001f1e8\U0001f1e8", "flag: Cocos (Keeling) Islands", []string{"cocos_islands"}, "6.0", false}, {"\u2615", "hot beverage", []string{"coffee"}, "4.0", false}, {"\u26b0\ufe0f", "coffin", []string{"coffin"}, "4.1", false}, {"\U0001fa99", "coin", []string{"coin"}, "13.0", false}, {"\U0001f976", "cold face", []string{"cold_face"}, "11.0", false}, {"\U0001f630", "anxious face with sweat", []string{"cold_sweat"}, "6.0", false}, {"\U0001f1e8\U0001f1f4", "flag: Colombia", []string{"colombia"}, "6.0", false},
-
@@ -361,28 +543,94 @@ {"\U0001f1e8\U0001f1e9", "flag: Congo - Kinshasa", []string{"congo_kinshasa"}, "6.0", false},{"\u3297\ufe0f", "Japanese โcongratulationsโ button", []string{"congratulations"}, "", false}, {"\U0001f6a7", "construction", []string{"construction"}, "6.0", false}, {"\U0001f477", "construction worker", []string{"construction_worker"}, "6.0", true}, {"\U0001f477\U0001f3ff", "construction worker: Dark Skin Tone", []string{"construction_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fb", "construction worker: Light Skin Tone", []string{"construction_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fe", "construction worker: Medium-Dark Skin Tone", []string{"construction_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fc", "construction worker: Medium-Light Skin Tone", []string{"construction_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fd", "construction worker: Medium Skin Tone", []string{"construction_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f477\u200d\u2642\ufe0f", "man construction worker", []string{"construction_worker_man"}, "11.0", true}, {"\U0001f477\U0001f3ff\u200d\u2642\ufe0f", "man construction worker: Dark Skin Tone", []string{"construction_worker_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fb\u200d\u2642\ufe0f", "man construction worker: Light Skin Tone", []string{"construction_worker_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fe\u200d\u2642\ufe0f", "man construction worker: Medium-Dark Skin Tone", []string{"construction_worker_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fc\u200d\u2642\ufe0f", "man construction worker: Medium-Light Skin Tone", []string{"construction_worker_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fd\u200d\u2642\ufe0f", "man construction worker: Medium Skin Tone", []string{"construction_worker_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f477\u200d\u2640\ufe0f", "woman construction worker", []string{"construction_worker_woman"}, "6.0", true}, {"\U0001f477\U0001f3ff\u200d\u2640\ufe0f", "woman construction worker: Dark Skin Tone", []string{"construction_worker_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fb\u200d\u2640\ufe0f", "woman construction worker: Light Skin Tone", []string{"construction_worker_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fe\u200d\u2640\ufe0f", "woman construction worker: Medium-Dark Skin Tone", []string{"construction_worker_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fc\u200d\u2640\ufe0f", "woman construction worker: Medium-Light Skin Tone", []string{"construction_worker_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fd\u200d\u2640\ufe0f", "woman construction worker: Medium Skin Tone", []string{"construction_worker_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f39b\ufe0f", "control knobs", []string{"control_knobs"}, "7.0", false}, {"\U0001f3ea", "convenience store", []string{"convenience_store"}, "6.0", false}, {"\U0001f9d1\u200d\U0001f373", "cook", []string{"cook"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f373", "cook: Dark Skin Tone", []string{"cook_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f373", "cook: Light Skin Tone", []string{"cook_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f373", "cook: Medium-Dark Skin Tone", []string{"cook_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f373", "cook: Medium-Light Skin Tone", []string{"cook_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f373", "cook: Medium Skin Tone", []string{"cook_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1e8\U0001f1f0", "flag: Cook Islands", []string{"cook_islands"}, "6.0", false}, {"\U0001f36a", "cookie", []string{"cookie"}, "6.0", false}, {"\U0001f192", "COOL button", []string{"cool"}, "6.0", false}, {"\u00a9\ufe0f", "copyright", []string{"copyright"}, "", false}, {"\U0001fab8", "coral", []string{"coral"}, "14.0", false}, {"\U0001f33d", "ear of corn", []string{"corn"}, "6.0", false}, {"\U0001f1e8\U0001f1f7", "flag: Costa Rica", []string{"costa_rica"}, "6.0", false}, {"\U0001f1e8\U0001f1ee", "flag: Cรดte dโIvoire", []string{"cote_divoire"}, "6.0", false}, {"\U0001f6cb\ufe0f", "couch and lamp", []string{"couch_and_lamp"}, "7.0", false}, {"\U0001f46b", "woman and man holding hands", []string{"couple"}, "6.0", true}, {"\U0001f46b\U0001f3ff", "woman and man holding hands: Dark Skin Tone", []string{"couple_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46b\U0001f3fb", "woman and man holding hands: Light Skin Tone", []string{"couple_Light_Skin_Tone"}, "12.0", false}, {"\U0001f46b\U0001f3fe", "woman and man holding hands: Medium-Dark Skin Tone", []string{"couple_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46b\U0001f3fc", "woman and man holding hands: Medium-Light Skin Tone", []string{"couple_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f46b\U0001f3fd", "woman and man holding hands: Medium Skin Tone", []string{"couple_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f491", "couple with heart", []string{"couple_with_heart"}, "6.0", true}, {"\U0001f491\U0001f3ff", "couple with heart: Dark Skin Tone", []string{"couple_with_heart_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f491\U0001f3fb", "couple with heart: Light Skin Tone", []string{"couple_with_heart_Light_Skin_Tone"}, "12.0", false}, {"\U0001f491\U0001f3fe", "couple with heart: Medium-Dark Skin Tone", []string{"couple_with_heart_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f491\U0001f3fc", "couple with heart: Medium-Light Skin Tone", []string{"couple_with_heart_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f491\U0001f3fd", "couple with heart: Medium Skin Tone", []string{"couple_with_heart_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: man, man", []string{"couple_with_heart_man_man"}, "6.0", true}, {"\U0001f468\U0001f3ff\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: man, man: Dark Skin Tone", []string{"couple_with_heart_man_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: man, man: Light Skin Tone", []string{"couple_with_heart_man_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: man, man: Medium-Dark Skin Tone", []string{"couple_with_heart_man_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: man, man: Medium-Light Skin Tone", []string{"couple_with_heart_man_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: man, man: Medium Skin Tone", []string{"couple_with_heart_man_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: woman, man", []string{"couple_with_heart_woman_man"}, "11.0", true}, {"\U0001f469\U0001f3ff\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: woman, man: Dark Skin Tone", []string{"couple_with_heart_woman_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: woman, man: Light Skin Tone", []string{"couple_with_heart_woman_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: woman, man: Medium-Dark Skin Tone", []string{"couple_with_heart_woman_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: woman, man: Medium-Light Skin Tone", []string{"couple_with_heart_woman_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: woman, man: Medium Skin Tone", []string{"couple_with_heart_woman_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\u2764\ufe0f\u200d\U0001f469", "couple with heart: woman, woman", []string{"couple_with_heart_woman_woman"}, "6.0", true}, {"\U0001f469\U0001f3ff\u200d\u2764\ufe0f\u200d\U0001f469", "couple with heart: woman, woman: Dark Skin Tone", []string{"couple_with_heart_woman_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\u2764\ufe0f\u200d\U0001f469", "couple with heart: woman, woman: Light Skin Tone", []string{"couple_with_heart_woman_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\u2764\ufe0f\u200d\U0001f469", "couple with heart: woman, woman: Medium-Dark Skin Tone", []string{"couple_with_heart_woman_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\u2764\ufe0f\u200d\U0001f469", "couple with heart: woman, woman: Medium-Light Skin Tone", []string{"couple_with_heart_woman_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\u2764\ufe0f\u200d\U0001f469", "couple with heart: woman, woman: Medium Skin Tone", []string{"couple_with_heart_woman_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f48f", "kiss", []string{"couplekiss"}, "6.0", true}, {"\U0001f48f\U0001f3ff", "kiss: Dark Skin Tone", []string{"couplekiss_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f48f\U0001f3fb", "kiss: Light Skin Tone", []string{"couplekiss_Light_Skin_Tone"}, "12.0", false}, {"\U0001f48f\U0001f3fe", "kiss: Medium-Dark Skin Tone", []string{"couplekiss_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f48f\U0001f3fc", "kiss: Medium-Light Skin Tone", []string{"couplekiss_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f48f\U0001f3fd", "kiss: Medium Skin Tone", []string{"couplekiss_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: man, man", []string{"couplekiss_man_man"}, "6.0", true}, {"\U0001f468\U0001f3ff\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: man, man: Dark Skin Tone", []string{"couplekiss_man_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: man, man: Light Skin Tone", []string{"couplekiss_man_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: man, man: Medium-Dark Skin Tone", []string{"couplekiss_man_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: man, man: Medium-Light Skin Tone", []string{"couplekiss_man_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: man, man: Medium Skin Tone", []string{"couplekiss_man_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: woman, man", []string{"couplekiss_man_woman"}, "11.0", true}, {"\U0001f469\U0001f3ff\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: woman, man: Dark Skin Tone", []string{"couplekiss_man_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: woman, man: Light Skin Tone", []string{"couplekiss_man_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: woman, man: Medium-Dark Skin Tone", []string{"couplekiss_man_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: woman, man: Medium-Light Skin Tone", []string{"couplekiss_man_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: woman, man: Medium Skin Tone", []string{"couplekiss_man_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f469", "kiss: woman, woman", []string{"couplekiss_woman_woman"}, "6.0", true}, {"\U0001f469\U0001f3ff\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f469", "kiss: woman, woman: Dark Skin Tone", []string{"couplekiss_woman_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f469", "kiss: woman, woman: Light Skin Tone", []string{"couplekiss_woman_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f469", "kiss: woman, woman: Medium-Dark Skin Tone", []string{"couplekiss_woman_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f469", "kiss: woman, woman: Medium-Light Skin Tone", []string{"couplekiss_woman_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f469", "kiss: woman, woman: Medium Skin Tone", []string{"couplekiss_woman_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f42e", "cow face", []string{"cow"}, "6.0", false}, {"\U0001f404", "cow", []string{"cow2"}, "6.0", false}, {"\U0001f920", "cowboy hat face", []string{"cowboy_hat_face"}, "9.0", false},
-
@@ -396,9 +644,15 @@ {"\U0001f1ed\U0001f1f7", "flag: Croatia", []string{"croatia"}, "6.0", false},{"\U0001f40a", "crocodile", []string{"crocodile"}, "6.0", false}, {"\U0001f950", "croissant", []string{"croissant"}, "9.0", false}, {"\U0001f91e", "crossed fingers", []string{"crossed_fingers"}, "9.0", true}, {"\U0001f91e\U0001f3ff", "crossed fingers: Dark Skin Tone", []string{"crossed_fingers_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91e\U0001f3fb", "crossed fingers: Light Skin Tone", []string{"crossed_fingers_Light_Skin_Tone"}, "12.0", false}, {"\U0001f91e\U0001f3fe", "crossed fingers: Medium-Dark Skin Tone", []string{"crossed_fingers_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91e\U0001f3fc", "crossed fingers: Medium-Light Skin Tone", []string{"crossed_fingers_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f91e\U0001f3fd", "crossed fingers: Medium Skin Tone", []string{"crossed_fingers_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f38c", "crossed flags", []string{"crossed_flags"}, "6.0", false}, {"\u2694\ufe0f", "crossed swords", []string{"crossed_swords"}, "4.1", false}, {"\U0001f451", "crown", []string{"crown"}, "6.0", false}, {"\U0001fa7c", "crutch", []string{"crutch"}, "14.0", false}, {"\U0001f622", "crying face", []string{"cry"}, "6.0", false}, {"\U0001f63f", "crying cat", []string{"crying_cat_face"}, "6.0", false}, {"\U0001f52e", "crystal ball", []string{"crystal_ball"}, "6.0", false},
-
@@ -410,7 +664,17 @@ {"\U0001f498", "heart with arrow", []string{"cupid"}, "6.0", false},{"\U0001f1e8\U0001f1fc", "flag: Curaรงao", []string{"curacao"}, "6.0", false}, {"\U0001f94c", "curling stone", []string{"curling_stone"}, "11.0", false}, {"\U0001f468\u200d\U0001f9b1", "man: curly hair", []string{"curly_haired_man"}, "11.0", true}, {"\U0001f468\U0001f3ff\u200d\U0001f9b1", "man: curly hair: Dark Skin Tone", []string{"curly_haired_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f9b1", "man: curly hair: Light Skin Tone", []string{"curly_haired_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f9b1", "man: curly hair: Medium-Dark Skin Tone", []string{"curly_haired_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f9b1", "man: curly hair: Medium-Light Skin Tone", []string{"curly_haired_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f9b1", "man: curly hair: Medium Skin Tone", []string{"curly_haired_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f9b1", "woman: curly hair", []string{"curly_haired_woman"}, "11.0", true}, {"\U0001f469\U0001f3ff\u200d\U0001f9b1", "woman: curly hair: Dark Skin Tone", []string{"curly_haired_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f9b1", "woman: curly hair: Light Skin Tone", []string{"curly_haired_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f9b1", "woman: curly hair: Medium-Dark Skin Tone", []string{"curly_haired_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f9b1", "woman: curly hair: Medium-Light Skin Tone", []string{"curly_haired_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f9b1", "woman: curly hair: Medium Skin Tone", []string{"curly_haired_woman_Medium_Skin_Tone"}, "12.0", false}, {"\u27b0", "curly loop", []string{"curly_loop"}, "6.0", false}, {"\U0001f4b1", "currency exchange", []string{"currency_exchange"}, "6.0", false}, {"\U0001f35b", "curry rice", []string{"curry"}, "6.0", false},
-
@@ -432,8 +696,23 @@ {"\U0001f4a8", "dashing away", []string{"dash"}, "6.0", false},{"\U0001f4c5", "calendar", []string{"date"}, "6.0", false}, {"\U0001f1e9\U0001f1ea", "flag: Germany", []string{"de"}, "6.0", false}, {"\U0001f9cf\u200d\u2642\ufe0f", "deaf man", []string{"deaf_man"}, "12.0", true}, {"\U0001f9cf\U0001f3ff\u200d\u2642\ufe0f", "deaf man: Dark Skin Tone", []string{"deaf_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fb\u200d\u2642\ufe0f", "deaf man: Light Skin Tone", []string{"deaf_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fe\u200d\u2642\ufe0f", "deaf man: Medium-Dark Skin Tone", []string{"deaf_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fc\u200d\u2642\ufe0f", "deaf man: Medium-Light Skin Tone", []string{"deaf_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fd\u200d\u2642\ufe0f", "deaf man: Medium Skin Tone", []string{"deaf_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9cf", "deaf person", []string{"deaf_person"}, "12.0", true}, {"\U0001f9cf\U0001f3ff", "deaf person: Dark Skin Tone", []string{"deaf_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fb", "deaf person: Light Skin Tone", []string{"deaf_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fe", "deaf person: Medium-Dark Skin Tone", []string{"deaf_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fc", "deaf person: Medium-Light Skin Tone", []string{"deaf_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fd", "deaf person: Medium Skin Tone", []string{"deaf_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\u200d\u2640\ufe0f", "deaf woman", []string{"deaf_woman"}, "12.0", true}, {"\U0001f9cf\U0001f3ff\u200d\u2640\ufe0f", "deaf woman: Dark Skin Tone", []string{"deaf_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fb\u200d\u2640\ufe0f", "deaf woman: Light Skin Tone", []string{"deaf_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fe\u200d\u2640\ufe0f", "deaf woman: Medium-Dark Skin Tone", []string{"deaf_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fc\u200d\u2640\ufe0f", "deaf woman: Medium-Light Skin Tone", []string{"deaf_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fd\u200d\u2640\ufe0f", "deaf woman: Medium Skin Tone", []string{"deaf_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f333", "deciduous tree", []string{"deciduous_tree"}, "6.0", false}, {"\U0001f98c", "deer", []string{"deer"}, "9.0", false}, {"\U0001f1e9\U0001f1f0", "flag: Denmark", []string{"denmark"}, "6.0", false},
-
@@ -443,18 +722,25 @@ {"\U0001f3dc\ufe0f", "desert", []string{"desert"}, "7.0", false},{"\U0001f3dd\ufe0f", "desert island", []string{"desert_island"}, "7.0", false}, {"\U0001f5a5\ufe0f", "desktop computer", []string{"desktop_computer"}, "7.0", false}, {"\U0001f575\ufe0f", "detective", []string{"detective"}, "7.0", true}, {"\U0001f575\U0001f3ff\ufe0f", "detective: Dark Skin Tone", []string{"detective_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fb\ufe0f", "detective: Light Skin Tone", []string{"detective_Light_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fe\ufe0f", "detective: Medium-Dark Skin Tone", []string{"detective_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fc\ufe0f", "detective: Medium-Light Skin Tone", []string{"detective_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fd\ufe0f", "detective: Medium Skin Tone", []string{"detective_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f4a0", "diamond with a dot", []string{"diamond_shape_with_a_dot_inside"}, "6.0", false}, {"\u2666\ufe0f", "diamond suit", []string{"diamonds"}, "", false}, {"\U0001f1e9\U0001f1ec", "flag: Diego Garcia", []string{"diego_garcia"}, "11.0", false}, {"\U0001f61e", "disappointed face", []string{"disappointed"}, "6.0", false}, {"\U0001f625", "sad but relieved face", []string{"disappointed_relieved"}, "6.0", false}, {"\U0001f978", "disguised face", []string{"disguised_face"}, "13.0", false}, {"\U0001f93f", "diving mask", []string{"diving_mask"}, "12.0", false}, {"\U0001fa94", "diya lamp", []string{"diya_lamp"}, "12.0", false}, {"\U0001f4ab", "dizzy", []string{"dizzy"}, "6.0", false}, {"\U0001f635", "knocked-out face", []string{"dizzy_face"}, "6.0", false}, {"\U0001f635", "face with crossed-out eyes", []string{"dizzy_face"}, "6.0", false}, {"\U0001f1e9\U0001f1ef", "flag: Djibouti", []string{"djibouti"}, "6.0", false}, {"\U0001f9ec", "dna", []string{"dna"}, "11.0", false}, {"\U0001f6af", "no littering", []string{"do_not_litter"}, "6.0", false}, {"\U0001f9a4", "dodo", []string{"dodo"}, "13.0", false}, {"\U0001f436", "dog face", []string{"dog"}, "6.0", false}, {"\U0001f415", "dog", []string{"dog2"}, "6.0", false}, {"\U0001f4b5", "dollar banknote", []string{"dollar"}, "6.0", false},
-
@@ -463,6 +749,7 @@ {"\U0001f42c", "dolphin", []string{"dolphin", "flipper"}, "6.0", false},{"\U0001f1e9\U0001f1f2", "flag: Dominica", []string{"dominica"}, "6.0", false}, {"\U0001f1e9\U0001f1f4", "flag: Dominican Republic", []string{"dominican_republic"}, "6.0", false}, {"\U0001f6aa", "door", []string{"door"}, "6.0", false}, {"\U0001fae5", "dotted line face", []string{"dotted_line_face"}, "14.0", false}, {"\U0001f369", "doughnut", []string{"doughnut"}, "6.0", false}, {"\U0001f54a\ufe0f", "dove", []string{"dove"}, "7.0", false}, {"\U0001f409", "dragon", []string{"dragon"}, "6.0", false},
-
@@ -478,8 +765,18 @@ {"\U0001f95f", "dumpling", []string{"dumpling"}, "11.0", false},{"\U0001f4c0", "dvd", []string{"dvd"}, "6.0", false}, {"\U0001f985", "eagle", []string{"eagle"}, "9.0", false}, {"\U0001f442", "ear", []string{"ear"}, "6.0", true}, {"\U0001f442\U0001f3ff", "ear: Dark Skin Tone", []string{"ear_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f442\U0001f3fb", "ear: Light Skin Tone", []string{"ear_Light_Skin_Tone"}, "12.0", false}, {"\U0001f442\U0001f3fe", "ear: Medium-Dark Skin Tone", []string{"ear_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f442\U0001f3fc", "ear: Medium-Light Skin Tone", []string{"ear_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f442\U0001f3fd", "ear: Medium Skin Tone", []string{"ear_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f33e", "sheaf of rice", []string{"ear_of_rice"}, "6.0", false}, {"\U0001f9bb", "ear with hearing aid", []string{"ear_with_hearing_aid"}, "12.0", true}, {"\U0001f9bb\U0001f3ff", "ear with hearing aid: Dark Skin Tone", []string{"ear_with_hearing_aid_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9bb\U0001f3fb", "ear with hearing aid: Light Skin Tone", []string{"ear_with_hearing_aid_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9bb\U0001f3fe", "ear with hearing aid: Medium-Dark Skin Tone", []string{"ear_with_hearing_aid_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9bb\U0001f3fc", "ear with hearing aid: Medium-Light Skin Tone", []string{"ear_with_hearing_aid_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9bb\U0001f3fd", "ear with hearing aid: Medium Skin Tone", []string{"ear_with_hearing_aid_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f30d", "globe showing Europe-Africa", []string{"earth_africa"}, "6.0", false}, {"\U0001f30e", "globe showing Americas", []string{"earth_americas"}, "6.0", false}, {"\U0001f30f", "globe showing Asia-Australia", []string{"earth_asia"}, "6.0", false},
-
@@ -494,10 +791,27 @@ {"\u23cf\ufe0f", "eject button", []string{"eject_button"}, "11.0", false},{"\U0001f1f8\U0001f1fb", "flag: El Salvador", []string{"el_salvador"}, "6.0", false}, {"\U0001f50c", "electric plug", []string{"electric_plug"}, "6.0", false}, {"\U0001f418", "elephant", []string{"elephant"}, "6.0", false}, {"\U0001f6d7", "elevator", []string{"elevator"}, "13.0", false}, {"\U0001f9dd", "elf", []string{"elf"}, "11.0", true}, {"\U0001f9dd\U0001f3ff", "elf: Dark Skin Tone", []string{"elf_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fb", "elf: Light Skin Tone", []string{"elf_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fe", "elf: Medium-Dark Skin Tone", []string{"elf_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fc", "elf: Medium-Light Skin Tone", []string{"elf_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fd", "elf: Medium Skin Tone", []string{"elf_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\u200d\u2642\ufe0f", "man elf", []string{"elf_man"}, "11.0", true}, {"\U0001f9dd\U0001f3ff\u200d\u2642\ufe0f", "man elf: Dark Skin Tone", []string{"elf_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fb\u200d\u2642\ufe0f", "man elf: Light Skin Tone", []string{"elf_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fe\u200d\u2642\ufe0f", "man elf: Medium-Dark Skin Tone", []string{"elf_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fc\u200d\u2642\ufe0f", "man elf: Medium-Light Skin Tone", []string{"elf_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fd\u200d\u2642\ufe0f", "man elf: Medium Skin Tone", []string{"elf_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\u200d\u2640\ufe0f", "woman elf", []string{"elf_woman"}, "11.0", true}, {"\U0001f9dd\U0001f3ff\u200d\u2640\ufe0f", "woman elf: Dark Skin Tone", []string{"elf_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fb\u200d\u2640\ufe0f", "woman elf: Light Skin Tone", []string{"elf_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fe\u200d\u2640\ufe0f", "woman elf: Medium-Dark Skin Tone", []string{"elf_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fc\u200d\u2640\ufe0f", "woman elf: Medium-Light Skin Tone", []string{"elf_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fd\u200d\u2640\ufe0f", "woman elf: Medium Skin Tone", []string{"elf_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f4e7", "e-mail", []string{"email", "e-mail"}, "6.0", false}, {"\U0001fab9", "empty nest", []string{"empty_nest"}, "14.0", false}, {"\U0001f51a", "END arrow", []string{"end"}, "6.0", false}, {"\U0001f3f4\U000e0067\U000e0062\U000e0065\U000e006e\U000e0067\U000e007f", "flag: England", []string{"england"}, "11.0", false}, {"\u2709\ufe0f", "envelope", []string{"envelope"}, "", false},
-
@@ -519,14 +833,46 @@ {"\U0001f441\ufe0f", "eye", []string{"eye"}, "7.0", false},{"\U0001f441\ufe0f\u200d\U0001f5e8\ufe0f", "eye in speech bubble", []string{"eye_speech_bubble"}, "11.0", false}, {"\U0001f453", "glasses", []string{"eyeglasses"}, "6.0", false}, {"\U0001f440", "eyes", []string{"eyes"}, "6.0", false}, {"\U0001f62e\u200d\U0001f4a8", "face exhaling", []string{"face_exhaling"}, "13.1", false}, {"\U0001f979", "face holding back tears", []string{"face_holding_back_tears"}, "14.0", false}, {"\U0001f636\u200d\U0001f32b\ufe0f", "face in clouds", []string{"face_in_clouds"}, "13.1", false}, {"\U0001fae4", "face with diagonal mouth", []string{"face_with_diagonal_mouth"}, "14.0", false}, {"\U0001f915", "face with head-bandage", []string{"face_with_head_bandage"}, "8.0", false}, {"\U0001fae2", "face with open eyes and hand over mouth", []string{"face_with_open_eyes_and_hand_over_mouth"}, "14.0", false}, {"\U0001fae3", "face with peeking eye", []string{"face_with_peeking_eye"}, "14.0", false}, {"\U0001f635\u200d\U0001f4ab", "face with spiral eyes", []string{"face_with_spiral_eyes"}, "13.1", false}, {"\U0001f912", "face with thermometer", []string{"face_with_thermometer"}, "8.0", false}, {"\U0001f926", "person facepalming", []string{"facepalm"}, "11.0", true}, {"\U0001f926\U0001f3ff", "person facepalming: Dark Skin Tone", []string{"facepalm_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fb", "person facepalming: Light Skin Tone", []string{"facepalm_Light_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fe", "person facepalming: Medium-Dark Skin Tone", []string{"facepalm_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fc", "person facepalming: Medium-Light Skin Tone", []string{"facepalm_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fd", "person facepalming: Medium Skin Tone", []string{"facepalm_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3ed", "factory", []string{"factory"}, "6.0", false}, {"\U0001f9d1\u200d\U0001f3ed", "factory worker", []string{"factory_worker"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f3ed", "factory worker: Dark Skin Tone", []string{"factory_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f3ed", "factory worker: Light Skin Tone", []string{"factory_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f3ed", "factory worker: Medium-Dark Skin Tone", []string{"factory_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f3ed", "factory worker: Medium-Light Skin Tone", []string{"factory_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f3ed", "factory worker: Medium Skin Tone", []string{"factory_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9da", "fairy", []string{"fairy"}, "11.0", true}, {"\U0001f9da\U0001f3ff", "fairy: Dark Skin Tone", []string{"fairy_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fb", "fairy: Light Skin Tone", []string{"fairy_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fe", "fairy: Medium-Dark Skin Tone", []string{"fairy_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fc", "fairy: Medium-Light Skin Tone", []string{"fairy_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fd", "fairy: Medium Skin Tone", []string{"fairy_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9da\u200d\u2642\ufe0f", "man fairy", []string{"fairy_man"}, "11.0", true}, {"\U0001f9da\U0001f3ff\u200d\u2642\ufe0f", "man fairy: Dark Skin Tone", []string{"fairy_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fb\u200d\u2642\ufe0f", "man fairy: Light Skin Tone", []string{"fairy_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fe\u200d\u2642\ufe0f", "man fairy: Medium-Dark Skin Tone", []string{"fairy_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fc\u200d\u2642\ufe0f", "man fairy: Medium-Light Skin Tone", []string{"fairy_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fd\u200d\u2642\ufe0f", "man fairy: Medium Skin Tone", []string{"fairy_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9da\u200d\u2640\ufe0f", "woman fairy", []string{"fairy_woman"}, "11.0", true}, {"\U0001f9da\U0001f3ff\u200d\u2640\ufe0f", "woman fairy: Dark Skin Tone", []string{"fairy_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fb\u200d\u2640\ufe0f", "woman fairy: Light Skin Tone", []string{"fairy_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fe\u200d\u2640\ufe0f", "woman fairy: Medium-Dark Skin Tone", []string{"fairy_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fc\u200d\u2640\ufe0f", "woman fairy: Medium-Light Skin Tone", []string{"fairy_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fd\u200d\u2640\ufe0f", "woman fairy: Medium Skin Tone", []string{"fairy_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9c6", "falafel", []string{"falafel"}, "12.0", false}, {"\U0001f1eb\U0001f1f0", "flag: Falkland Islands", []string{"falkland_islands"}, "6.0", false}, {"\U0001f342", "fallen leaf", []string{"fallen_leaf"}, "6.0", false},
-
@@ -557,12 +903,23 @@ {"\U0001f469\u200d\U0001f469\u200d\U0001f467", "family: woman, woman, girl", []string{"family_woman_woman_girl"}, "6.0", false},{"\U0001f469\u200d\U0001f469\u200d\U0001f467\u200d\U0001f466", "family: woman, woman, girl, boy", []string{"family_woman_woman_girl_boy"}, "6.0", false}, {"\U0001f469\u200d\U0001f469\u200d\U0001f467\u200d\U0001f467", "family: woman, woman, girl, girl", []string{"family_woman_woman_girl_girl"}, "6.0", false}, {"\U0001f9d1\u200d\U0001f33e", "farmer", []string{"farmer"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f33e", "farmer: Dark Skin Tone", []string{"farmer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f33e", "farmer: Light Skin Tone", []string{"farmer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f33e", "farmer: Medium-Dark Skin Tone", []string{"farmer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f33e", "farmer: Medium-Light Skin Tone", []string{"farmer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f33e", "farmer: Medium Skin Tone", []string{"farmer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1eb\U0001f1f4", "flag: Faroe Islands", []string{"faroe_islands"}, "6.0", false}, {"\u23e9", "fast-forward button", []string{"fast_forward"}, "6.0", false}, {"\U0001f4e0", "fax machine", []string{"fax"}, "6.0", false}, {"\U0001f628", "fearful face", []string{"fearful"}, "6.0", false}, {"\U0001fab6", "feather", []string{"feather"}, "13.0", false}, {"\U0001f43e", "paw prints", []string{"feet", "paw_prints"}, "6.0", false}, {"\U0001f575\ufe0f\u200d\u2640\ufe0f", "woman detective", []string{"female_detective"}, "6.0", true}, {"\U0001f575\U0001f3ff\ufe0f\u200d\u2640\ufe0f", "woman detective: Dark Skin Tone", []string{"female_detective_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fb\ufe0f\u200d\u2640\ufe0f", "woman detective: Light Skin Tone", []string{"female_detective_Light_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fe\ufe0f\u200d\u2640\ufe0f", "woman detective: Medium-Dark Skin Tone", []string{"female_detective_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fc\ufe0f\u200d\u2640\ufe0f", "woman detective: Medium-Light Skin Tone", []string{"female_detective_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fd\ufe0f\u200d\u2640\ufe0f", "woman detective: Medium Skin Tone", []string{"female_detective_Medium_Skin_Tone"}, "12.0", false}, {"\u2640\ufe0f", "female sign", []string{"female_sign"}, "11.0", false}, {"\U0001f3a1", "ferris wheel", []string{"ferris_wheel"}, "6.0", false}, {"\u26f4\ufe0f", "ferry", []string{"ferry"}, "5.2", false},
-
@@ -578,6 +935,11 @@ {"\U0001f692", "fire engine", []string{"fire_engine"}, "6.0", false},{"\U0001f9ef", "fire extinguisher", []string{"fire_extinguisher"}, "11.0", false}, {"\U0001f9e8", "firecracker", []string{"firecracker"}, "11.0", false}, {"\U0001f9d1\u200d\U0001f692", "firefighter", []string{"firefighter"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f692", "firefighter: Dark Skin Tone", []string{"firefighter_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f692", "firefighter: Light Skin Tone", []string{"firefighter_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f692", "firefighter: Medium-Dark Skin Tone", []string{"firefighter_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f692", "firefighter: Medium-Light Skin Tone", []string{"firefighter_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f692", "firefighter: Medium Skin Tone", []string{"firefighter_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f386", "fireworks", []string{"fireworks"}, "6.0", false}, {"\U0001f313", "first quarter moon", []string{"first_quarter_moon"}, "6.0", false}, {"\U0001f31b", "first quarter moon face", []string{"first_quarter_moon_with_face"}, "6.0", false},
-
@@ -585,25 +947,53 @@ {"\U0001f41f", "fish", []string{"fish"}, "6.0", false},{"\U0001f365", "fish cake with swirl", []string{"fish_cake"}, "6.0", false}, {"\U0001f3a3", "fishing pole", []string{"fishing_pole_and_fish"}, "6.0", false}, {"\U0001f91b", "left-facing fist", []string{"fist_left"}, "9.0", true}, {"\U0001f91b\U0001f3ff", "left-facing fist: Dark Skin Tone", []string{"fist_left_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91b\U0001f3fb", "left-facing fist: Light Skin Tone", []string{"fist_left_Light_Skin_Tone"}, "12.0", false}, {"\U0001f91b\U0001f3fe", "left-facing fist: Medium-Dark Skin Tone", []string{"fist_left_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91b\U0001f3fc", "left-facing fist: Medium-Light Skin Tone", []string{"fist_left_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f91b\U0001f3fd", "left-facing fist: Medium Skin Tone", []string{"fist_left_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f44a", "oncoming fist", []string{"fist_oncoming", "facepunch", "punch"}, "6.0", true}, {"\U0001f44a\U0001f3ff", "oncoming fist: Dark Skin Tone", []string{"fist_oncoming_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44a\U0001f3fb", "oncoming fist: Light Skin Tone", []string{"fist_oncoming_Light_Skin_Tone"}, "12.0", false}, {"\U0001f44a\U0001f3fe", "oncoming fist: Medium-Dark Skin Tone", []string{"fist_oncoming_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44a\U0001f3fc", "oncoming fist: Medium-Light Skin Tone", []string{"fist_oncoming_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f44a\U0001f3fd", "oncoming fist: Medium Skin Tone", []string{"fist_oncoming_Medium_Skin_Tone"}, "12.0", false}, {"\u270a", "raised fist", []string{"fist_raised", "fist"}, "6.0", true}, {"\u270a\U0001f3ff", "raised fist: Dark Skin Tone", []string{"fist_raised_Dark_Skin_Tone"}, "12.0", false}, {"\u270a\U0001f3fb", "raised fist: Light Skin Tone", []string{"fist_raised_Light_Skin_Tone"}, "12.0", false}, {"\u270a\U0001f3fe", "raised fist: Medium-Dark Skin Tone", []string{"fist_raised_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u270a\U0001f3fc", "raised fist: Medium-Light Skin Tone", []string{"fist_raised_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u270a\U0001f3fd", "raised fist: Medium Skin Tone", []string{"fist_raised_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f91c", "right-facing fist", []string{"fist_right"}, "9.0", true}, {"\U0001f91c\U0001f3ff", "right-facing fist: Dark Skin Tone", []string{"fist_right_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91c\U0001f3fb", "right-facing fist: Light Skin Tone", []string{"fist_right_Light_Skin_Tone"}, "12.0", false}, {"\U0001f91c\U0001f3fe", "right-facing fist: Medium-Dark Skin Tone", []string{"fist_right_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91c\U0001f3fc", "right-facing fist: Medium-Light Skin Tone", []string{"fist_right_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f91c\U0001f3fd", "right-facing fist: Medium Skin Tone", []string{"fist_right_Medium_Skin_Tone"}, "12.0", false}, {"5\ufe0f\u20e3", "keycap: 5", []string{"five"}, "", false}, {"\U0001f38f", "carp streamer", []string{"flags"}, "6.0", false}, {"\U0001f9a9", "flamingo", []string{"flamingo"}, "12.0", false}, {"\U0001f526", "flashlight", []string{"flashlight"}, "6.0", false}, {"\U0001f97f", "flat shoe", []string{"flat_shoe"}, "11.0", false}, {"\U0001fad3", "flatbread", []string{"flatbread"}, "13.0", false}, {"\u269c\ufe0f", "fleur-de-lis", []string{"fleur_de_lis"}, "4.1", false}, {"\U0001f6ec", "airplane arrival", []string{"flight_arrival"}, "7.0", false}, {"\U0001f6eb", "airplane departure", []string{"flight_departure"}, "7.0", false}, {"\U0001f4be", "floppy disk", []string{"floppy_disk"}, "6.0", false}, {"\U0001f3b4", "flower playing cards", []string{"flower_playing_cards"}, "6.0", false}, {"\U0001f633", "flushed face", []string{"flushed"}, "6.0", false}, {"\U0001fab0", "fly", []string{"fly"}, "13.0", false}, {"\U0001f94f", "flying disc", []string{"flying_disc"}, "11.0", false}, {"\U0001f6f8", "flying saucer", []string{"flying_saucer"}, "11.0", false}, {"\U0001f32b\ufe0f", "fog", []string{"fog"}, "7.0", false}, {"\U0001f301", "foggy", []string{"foggy"}, "6.0", false}, {"\U0001fad5", "fondue", []string{"fondue"}, "13.0", false}, {"\U0001f9b6", "foot", []string{"foot"}, "11.0", true}, {"\U0001f9b6\U0001f3ff", "foot: Dark Skin Tone", []string{"foot_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b6\U0001f3fb", "foot: Light Skin Tone", []string{"foot_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b6\U0001f3fe", "foot: Medium-Dark Skin Tone", []string{"foot_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b6\U0001f3fc", "foot: Medium-Light Skin Tone", []string{"foot_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b6\U0001f3fd", "foot: Medium Skin Tone", []string{"foot_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3c8", "american football", []string{"football"}, "6.0", false}, {"\U0001f463", "footprints", []string{"footprints"}, "6.0", false}, {"\U0001f374", "fork and knife", []string{"fork_and_knife"}, "6.0", false},
-
@@ -626,8 +1016,23 @@ {"\U0001f438", "frog", []string{"frog"}, "6.0", false},{"\U0001f626", "frowning face with open mouth", []string{"frowning"}, "6.1", false}, {"\u2639\ufe0f", "frowning face", []string{"frowning_face"}, "", false}, {"\U0001f64d\u200d\u2642\ufe0f", "man frowning", []string{"frowning_man"}, "6.0", true}, {"\U0001f64d\U0001f3ff\u200d\u2642\ufe0f", "man frowning: Dark Skin Tone", []string{"frowning_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fb\u200d\u2642\ufe0f", "man frowning: Light Skin Tone", []string{"frowning_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fe\u200d\u2642\ufe0f", "man frowning: Medium-Dark Skin Tone", []string{"frowning_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fc\u200d\u2642\ufe0f", "man frowning: Medium-Light Skin Tone", []string{"frowning_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fd\u200d\u2642\ufe0f", "man frowning: Medium Skin Tone", []string{"frowning_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64d", "person frowning", []string{"frowning_person"}, "6.0", true}, {"\U0001f64d\U0001f3ff", "person frowning: Dark Skin Tone", []string{"frowning_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fb", "person frowning: Light Skin Tone", []string{"frowning_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fe", "person frowning: Medium-Dark Skin Tone", []string{"frowning_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fc", "person frowning: Medium-Light Skin Tone", []string{"frowning_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fd", "person frowning: Medium Skin Tone", []string{"frowning_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64d\u200d\u2640\ufe0f", "woman frowning", []string{"frowning_woman"}, "11.0", true}, {"\U0001f64d\U0001f3ff\u200d\u2640\ufe0f", "woman frowning: Dark Skin Tone", []string{"frowning_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fb\u200d\u2640\ufe0f", "woman frowning: Light Skin Tone", []string{"frowning_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fe\u200d\u2640\ufe0f", "woman frowning: Medium-Dark Skin Tone", []string{"frowning_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fc\u200d\u2640\ufe0f", "woman frowning: Medium-Light Skin Tone", []string{"frowning_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fd\u200d\u2640\ufe0f", "woman frowning: Medium Skin Tone", []string{"frowning_woman_Medium_Skin_Tone"}, "12.0", false}, {"\u26fd", "fuel pump", []string{"fuelpump"}, "5.2", false}, {"\U0001f315", "full moon", []string{"full_moon"}, "6.0", false}, {"\U0001f31d", "full moon face", []string{"full_moon_with_face"}, "6.0", false},
-
@@ -651,6 +1056,11 @@ {"\U0001f381", "wrapped gift", []string{"gift"}, "6.0", false},{"\U0001f49d", "heart with ribbon", []string{"gift_heart"}, "6.0", false}, {"\U0001f992", "giraffe", []string{"giraffe"}, "11.0", false}, {"\U0001f467", "girl", []string{"girl"}, "6.0", true}, {"\U0001f467\U0001f3ff", "girl: Dark Skin Tone", []string{"girl_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f467\U0001f3fb", "girl: Light Skin Tone", []string{"girl_Light_Skin_Tone"}, "12.0", false}, {"\U0001f467\U0001f3fe", "girl: Medium-Dark Skin Tone", []string{"girl_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f467\U0001f3fc", "girl: Medium-Light Skin Tone", []string{"girl_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f467\U0001f3fd", "girl: Medium Skin Tone", []string{"girl_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f310", "globe with meridians", []string{"globe_with_meridians"}, "6.0", false}, {"\U0001f9e4", "gloves", []string{"gloves"}, "11.0", false}, {"\U0001f945", "goal net", []string{"goal_net"}, "9.0", false},
-
@@ -658,8 +1068,23 @@ {"\U0001f410", "goat", []string{"goat"}, "6.0", false},{"\U0001f97d", "goggles", []string{"goggles"}, "11.0", false}, {"\u26f3", "flag in hole", []string{"golf"}, "5.2", false}, {"\U0001f3cc\ufe0f", "person golfing", []string{"golfing"}, "7.0", true}, {"\U0001f3cc\U0001f3ff\ufe0f", "person golfing: Dark Skin Tone", []string{"golfing_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fb\ufe0f", "person golfing: Light Skin Tone", []string{"golfing_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fe\ufe0f", "person golfing: Medium-Dark Skin Tone", []string{"golfing_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fc\ufe0f", "person golfing: Medium-Light Skin Tone", []string{"golfing_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fd\ufe0f", "person golfing: Medium Skin Tone", []string{"golfing_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\ufe0f\u200d\u2642\ufe0f", "man golfing", []string{"golfing_man"}, "11.0", true}, {"\U0001f3cc\U0001f3ff\ufe0f\u200d\u2642\ufe0f", "man golfing: Dark Skin Tone", []string{"golfing_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fb\ufe0f\u200d\u2642\ufe0f", "man golfing: Light Skin Tone", []string{"golfing_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fe\ufe0f\u200d\u2642\ufe0f", "man golfing: Medium-Dark Skin Tone", []string{"golfing_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fc\ufe0f\u200d\u2642\ufe0f", "man golfing: Medium-Light Skin Tone", []string{"golfing_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fd\ufe0f\u200d\u2642\ufe0f", "man golfing: Medium Skin Tone", []string{"golfing_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\ufe0f\u200d\u2640\ufe0f", "woman golfing", []string{"golfing_woman"}, "", true}, {"\U0001f3cc\U0001f3ff\ufe0f\u200d\u2640\ufe0f", "woman golfing: Dark Skin Tone", []string{"golfing_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fb\ufe0f\u200d\u2640\ufe0f", "woman golfing: Light Skin Tone", []string{"golfing_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fe\ufe0f\u200d\u2640\ufe0f", "woman golfing: Medium-Dark Skin Tone", []string{"golfing_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fc\ufe0f\u200d\u2640\ufe0f", "woman golfing: Medium-Light Skin Tone", []string{"golfing_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fd\ufe0f\u200d\u2640\ufe0f", "woman golfing: Medium Skin Tone", []string{"golfing_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f98d", "gorilla", []string{"gorilla"}, "9.0", false}, {"\U0001f347", "grapes", []string{"grapes"}, "6.0", false}, {"\U0001f1ec\U0001f1f7", "flag: Greece", []string{"greece"}, "6.0", false},
-
@@ -679,8 +1104,23 @@ {"\U0001f600", "grinning face", []string{"grinning"}, "6.1", false},{"\U0001f1ec\U0001f1f5", "flag: Guadeloupe", []string{"guadeloupe"}, "6.0", false}, {"\U0001f1ec\U0001f1fa", "flag: Guam", []string{"guam"}, "6.0", false}, {"\U0001f482", "guard", []string{"guard"}, "6.0", true}, {"\U0001f482\U0001f3ff", "guard: Dark Skin Tone", []string{"guard_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fb", "guard: Light Skin Tone", []string{"guard_Light_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fe", "guard: Medium-Dark Skin Tone", []string{"guard_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fc", "guard: Medium-Light Skin Tone", []string{"guard_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fd", "guard: Medium Skin Tone", []string{"guard_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f482\u200d\u2642\ufe0f", "man guard", []string{"guardsman"}, "11.0", true}, {"\U0001f482\U0001f3ff\u200d\u2642\ufe0f", "man guard: Dark Skin Tone", []string{"guardsman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fb\u200d\u2642\ufe0f", "man guard: Light Skin Tone", []string{"guardsman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fe\u200d\u2642\ufe0f", "man guard: Medium-Dark Skin Tone", []string{"guardsman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fc\u200d\u2642\ufe0f", "man guard: Medium-Light Skin Tone", []string{"guardsman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fd\u200d\u2642\ufe0f", "man guard: Medium Skin Tone", []string{"guardsman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f482\u200d\u2640\ufe0f", "woman guard", []string{"guardswoman"}, "6.0", true}, {"\U0001f482\U0001f3ff\u200d\u2640\ufe0f", "woman guard: Dark Skin Tone", []string{"guardswoman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fb\u200d\u2640\ufe0f", "woman guard: Light Skin Tone", []string{"guardswoman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fe\u200d\u2640\ufe0f", "woman guard: Medium-Dark Skin Tone", []string{"guardswoman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fc\u200d\u2640\ufe0f", "woman guard: Medium-Light Skin Tone", []string{"guardswoman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fd\u200d\u2640\ufe0f", "woman guard: Medium Skin Tone", []string{"guardswoman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1ec\U0001f1f9", "flag: Guatemala", []string{"guatemala"}, "6.0", false}, {"\U0001f1ec\U0001f1ec", "flag: Guernsey", []string{"guernsey"}, "6.0", false}, {"\U0001f9ae", "guide dog", []string{"guide_dog"}, "12.0", false},
-
@@ -690,37 +1130,88 @@ {"\U0001f3b8", "guitar", []string{"guitar"}, "6.0", false},{"\U0001f52b", "water pistol", []string{"gun"}, "6.0", false}, {"\U0001f1ec\U0001f1fe", "flag: Guyana", []string{"guyana"}, "6.0", false}, {"\U0001f487", "person getting haircut", []string{"haircut"}, "6.0", true}, {"\U0001f487\U0001f3ff", "person getting haircut: Dark Skin Tone", []string{"haircut_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fb", "person getting haircut: Light Skin Tone", []string{"haircut_Light_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fe", "person getting haircut: Medium-Dark Skin Tone", []string{"haircut_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fc", "person getting haircut: Medium-Light Skin Tone", []string{"haircut_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fd", "person getting haircut: Medium Skin Tone", []string{"haircut_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f487\u200d\u2642\ufe0f", "man getting haircut", []string{"haircut_man"}, "6.0", true}, {"\U0001f487\U0001f3ff\u200d\u2642\ufe0f", "man getting haircut: Dark Skin Tone", []string{"haircut_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fb\u200d\u2642\ufe0f", "man getting haircut: Light Skin Tone", []string{"haircut_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fe\u200d\u2642\ufe0f", "man getting haircut: Medium-Dark Skin Tone", []string{"haircut_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fc\u200d\u2642\ufe0f", "man getting haircut: Medium-Light Skin Tone", []string{"haircut_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fd\u200d\u2642\ufe0f", "man getting haircut: Medium Skin Tone", []string{"haircut_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f487\u200d\u2640\ufe0f", "woman getting haircut", []string{"haircut_woman"}, "11.0", true}, {"\U0001f487\U0001f3ff\u200d\u2640\ufe0f", "woman getting haircut: Dark Skin Tone", []string{"haircut_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fb\u200d\u2640\ufe0f", "woman getting haircut: Light Skin Tone", []string{"haircut_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fe\u200d\u2640\ufe0f", "woman getting haircut: Medium-Dark Skin Tone", []string{"haircut_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fc\u200d\u2640\ufe0f", "woman getting haircut: Medium-Light Skin Tone", []string{"haircut_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fd\u200d\u2640\ufe0f", "woman getting haircut: Medium Skin Tone", []string{"haircut_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1ed\U0001f1f9", "flag: Haiti", []string{"haiti"}, "6.0", false}, {"\U0001f354", "hamburger", []string{"hamburger"}, "6.0", false}, {"\U0001f528", "hammer", []string{"hammer"}, "6.0", false}, {"\u2692\ufe0f", "hammer and pick", []string{"hammer_and_pick"}, "4.1", false}, {"\U0001f6e0\ufe0f", "hammer and wrench", []string{"hammer_and_wrench"}, "7.0", false}, {"\U0001faac", "hamsa", []string{"hamsa"}, "14.0", false}, {"\U0001f439", "hamster", []string{"hamster"}, "6.0", false}, {"\u270b", "raised hand", []string{"hand", "raised_hand"}, "6.0", true}, {"\u270b\U0001f3ff", "raised hand: Dark Skin Tone", []string{"hand_Dark_Skin_Tone"}, "12.0", false}, {"\u270b\U0001f3fb", "raised hand: Light Skin Tone", []string{"hand_Light_Skin_Tone"}, "12.0", false}, {"\u270b\U0001f3fe", "raised hand: Medium-Dark Skin Tone", []string{"hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u270b\U0001f3fc", "raised hand: Medium-Light Skin Tone", []string{"hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u270b\U0001f3fd", "raised hand: Medium Skin Tone", []string{"hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f92d", "face with hand over mouth", []string{"hand_over_mouth"}, "11.0", false}, {"\U0001faf0", "hand with index finger and thumb crossed", []string{"hand_with_index_finger_and_thumb_crossed"}, "14.0", true}, {"\U0001faf0\U0001f3ff", "hand with index finger and thumb crossed: Dark Skin Tone", []string{"hand_with_index_finger_and_thumb_crossed_Dark_Skin_Tone"}, "12.0", false}, {"\U0001faf0\U0001f3fb", "hand with index finger and thumb crossed: Light Skin Tone", []string{"hand_with_index_finger_and_thumb_crossed_Light_Skin_Tone"}, "12.0", false}, {"\U0001faf0\U0001f3fe", "hand with index finger and thumb crossed: Medium-Dark Skin Tone", []string{"hand_with_index_finger_and_thumb_crossed_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001faf0\U0001f3fc", "hand with index finger and thumb crossed: Medium-Light Skin Tone", []string{"hand_with_index_finger_and_thumb_crossed_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001faf0\U0001f3fd", "hand with index finger and thumb crossed: Medium Skin Tone", []string{"hand_with_index_finger_and_thumb_crossed_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f45c", "handbag", []string{"handbag"}, "6.0", false}, {"\U0001f93e", "person playing handball", []string{"handball_person"}, "11.0", true}, {"\U0001f91d", "handshake", []string{"handshake"}, "9.0", false}, {"\U0001f93e\U0001f3ff", "person playing handball: Dark Skin Tone", []string{"handball_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fb", "person playing handball: Light Skin Tone", []string{"handball_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fe", "person playing handball: Medium-Dark Skin Tone", []string{"handball_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fc", "person playing handball: Medium-Light Skin Tone", []string{"handball_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fd", "person playing handball: Medium Skin Tone", []string{"handball_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f91d", "handshake", []string{"handshake"}, "9.0", true}, {"\U0001f91d\U0001f3ff", "handshake: Dark Skin Tone", []string{"handshake_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91d\U0001f3fb", "handshake: Light Skin Tone", []string{"handshake_Light_Skin_Tone"}, "12.0", false}, {"\U0001f91d\U0001f3fe", "handshake: Medium-Dark Skin Tone", []string{"handshake_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91d\U0001f3fc", "handshake: Medium-Light Skin Tone", []string{"handshake_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f91d\U0001f3fd", "handshake: Medium Skin Tone", []string{"handshake_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f4a9", "pile of poo", []string{"hankey", "poop", "shit"}, "6.0", false}, {"#\ufe0f\u20e3", "keycap: #", []string{"hash"}, "", false}, {"\U0001f425", "front-facing baby chick", []string{"hatched_chick"}, "6.0", false}, {"\U0001f423", "hatching chick", []string{"hatching_chick"}, "6.0", false}, {"\U0001f3a7", "headphone", []string{"headphones"}, "6.0", false}, {"\U0001faa6", "headstone", []string{"headstone"}, "13.0", false}, {"\U0001f9d1\u200d\u2695\ufe0f", "health worker", []string{"health_worker"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\u2695\ufe0f", "health worker: Dark Skin Tone", []string{"health_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\u2695\ufe0f", "health worker: Light Skin Tone", []string{"health_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\u2695\ufe0f", "health worker: Medium-Dark Skin Tone", []string{"health_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\u2695\ufe0f", "health worker: Medium-Light Skin Tone", []string{"health_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\u2695\ufe0f", "health worker: Medium Skin Tone", []string{"health_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f649", "hear-no-evil monkey", []string{"hear_no_evil"}, "6.0", false}, {"\U0001f1ed\U0001f1f2", "flag: Heard & McDonald Islands", []string{"heard_mcdonald_islands"}, "11.0", false}, {"\u2764\ufe0f", "red heart", []string{"heart"}, "", false}, {"\U0001f49f", "heart decoration", []string{"heart_decoration"}, "6.0", false}, {"\U0001f60d", "smiling face with heart-eyes", []string{"heart_eyes"}, "6.0", false}, {"\U0001f63b", "smiling cat with heart-eyes", []string{"heart_eyes_cat"}, "6.0", false}, {"\U0001faf6", "heart hands", []string{"heart_hands"}, "14.0", true}, {"\U0001faf6\U0001f3ff", "heart hands: Dark Skin Tone", []string{"heart_hands_Dark_Skin_Tone"}, "12.0", false}, {"\U0001faf6\U0001f3fb", "heart hands: Light Skin Tone", []string{"heart_hands_Light_Skin_Tone"}, "12.0", false}, {"\U0001faf6\U0001f3fe", "heart hands: Medium-Dark Skin Tone", []string{"heart_hands_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001faf6\U0001f3fc", "heart hands: Medium-Light Skin Tone", []string{"heart_hands_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001faf6\U0001f3fd", "heart hands: Medium Skin Tone", []string{"heart_hands_Medium_Skin_Tone"}, "12.0", false}, {"\u2764\ufe0f\u200d\U0001f525", "heart on fire", []string{"heart_on_fire"}, "13.1", false}, {"\U0001f493", "beating heart", []string{"heartbeat"}, "6.0", false}, {"\U0001f497", "growing heart", []string{"heartpulse"}, "6.0", false}, {"\u2665\ufe0f", "heart suit", []string{"hearts"}, "", false}, {"\u2714\ufe0f", "check mark", []string{"heavy_check_mark"}, "", false}, {"\u2797", "divide", []string{"heavy_division_sign"}, "6.0", false}, {"\U0001f4b2", "heavy dollar sign", []string{"heavy_dollar_sign"}, "6.0", false}, {"\U0001f7f0", "heavy equals sign", []string{"heavy_equals_sign"}, "14.0", false}, {"\u2763\ufe0f", "heart exclamation", []string{"heavy_heart_exclamation"}, "", false}, {"\u2796", "minus", []string{"heavy_minus_sign"}, "6.0", false}, {"\u2716\ufe0f", "multiply", []string{"heavy_multiplication_x"}, "", false},
-
@@ -739,8 +1230,14 @@ {"\U0001f573\ufe0f", "hole", []string{"hole"}, "7.0", false},{"\U0001f1ed\U0001f1f3", "flag: Honduras", []string{"honduras"}, "6.0", false}, {"\U0001f36f", "honey pot", []string{"honey_pot"}, "6.0", false}, {"\U0001f1ed\U0001f1f0", "flag: Hong Kong SAR China", []string{"hong_kong"}, "6.0", false}, {"\U0001fa9d", "hook", []string{"hook"}, "13.0", false}, {"\U0001f434", "horse face", []string{"horse"}, "6.0", false}, {"\U0001f3c7", "horse racing", []string{"horse_racing"}, "6.0", true}, {"\U0001f3c7\U0001f3ff", "horse racing: Dark Skin Tone", []string{"horse_racing_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c7\U0001f3fb", "horse racing: Light Skin Tone", []string{"horse_racing_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c7\U0001f3fe", "horse racing: Medium-Dark Skin Tone", []string{"horse_racing_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c7\U0001f3fc", "horse racing: Medium-Light Skin Tone", []string{"horse_racing_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c7\U0001f3fd", "horse racing: Medium Skin Tone", []string{"horse_racing_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3e5", "hospital", []string{"hospital"}, "6.0", false}, {"\U0001f975", "hot face", []string{"hot_face"}, "11.0", false}, {"\U0001f336\ufe0f", "hot pepper", []string{"hot_pepper"}, "7.0", false},
-
@@ -752,9 +1249,10 @@ {"\u23f3", "hourglass not done", []string{"hourglass_flowing_sand"}, "6.0", false},{"\U0001f3e0", "house", []string{"house"}, "6.0", false}, {"\U0001f3e1", "house with garden", []string{"house_with_garden"}, "6.0", false}, {"\U0001f3d8\ufe0f", "houses", []string{"houses"}, "7.0", false}, {"\U0001f917", "hugging face", []string{"hugs"}, "8.0", false}, {"\U0001f917", "smiling face with open hands", []string{"hugs"}, "8.0", false}, {"\U0001f1ed\U0001f1fa", "flag: Hungary", []string{"hungary"}, "6.0", false}, {"\U0001f62f", "hushed face", []string{"hushed"}, "6.1", false}, {"\U0001f6d6", "hut", []string{"hut"}, "13.0", false}, {"\U0001f368", "ice cream", []string{"ice_cream"}, "6.0", false}, {"\U0001f9ca", "ice", []string{"ice_cube"}, "12.0", false}, {"\U0001f3d2", "ice hockey", []string{"ice_hockey"}, "8.0", false},
-
@@ -762,10 +1260,17 @@ {"\u26f8\ufe0f", "ice skate", []string{"ice_skate"}, "5.2", false},{"\U0001f366", "soft ice cream", []string{"icecream"}, "6.0", false}, {"\U0001f1ee\U0001f1f8", "flag: Iceland", []string{"iceland"}, "6.0", false}, {"\U0001f194", "ID button", []string{"id"}, "6.0", false}, {"\U0001faaa", "identification card", []string{"identification_card"}, "14.0", false}, {"\U0001f250", "Japanese โbargainโ button", []string{"ideograph_advantage"}, "6.0", false}, {"\U0001f47f", "angry face with horns", []string{"imp"}, "6.0", false}, {"\U0001f4e5", "inbox tray", []string{"inbox_tray"}, "6.0", false}, {"\U0001f4e8", "incoming envelope", []string{"incoming_envelope"}, "6.0", false}, {"\U0001faf5", "index pointing at the viewer", []string{"index_pointing_at_the_viewer"}, "14.0", true}, {"\U0001faf5\U0001f3ff", "index pointing at the viewer: Dark Skin Tone", []string{"index_pointing_at_the_viewer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001faf5\U0001f3fb", "index pointing at the viewer: Light Skin Tone", []string{"index_pointing_at_the_viewer_Light_Skin_Tone"}, "12.0", false}, {"\U0001faf5\U0001f3fe", "index pointing at the viewer: Medium-Dark Skin Tone", []string{"index_pointing_at_the_viewer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001faf5\U0001f3fc", "index pointing at the viewer: Medium-Light Skin Tone", []string{"index_pointing_at_the_viewer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001faf5\U0001f3fd", "index pointing at the viewer: Medium Skin Tone", []string{"index_pointing_at_the_viewer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1ee\U0001f1f3", "flag: India", []string{"india"}, "6.0", false}, {"\U0001f1ee\U0001f1e9", "flag: Indonesia", []string{"indonesia"}, "6.0", false}, {"\u267e\ufe0f", "infinity", []string{"infinity"}, "11.0", false},
-
@@ -786,6 +1291,7 @@ {"\U0001f5fe", "map of Japan", []string{"japan"}, "6.0", false},{"\U0001f3ef", "Japanese castle", []string{"japanese_castle"}, "6.0", false}, {"\U0001f47a", "goblin", []string{"japanese_goblin"}, "6.0", false}, {"\U0001f479", "ogre", []string{"japanese_ogre"}, "6.0", false}, {"\U0001fad9", "jar", []string{"jar"}, "14.0", false}, {"\U0001f456", "jeans", []string{"jeans"}, "6.0", false}, {"\U0001f1ef\U0001f1ea", "flag: Jersey", []string{"jersey"}, "6.0", false}, {"\U0001f9e9", "puzzle piece", []string{"jigsaw"}, "11.0", false},
-
@@ -795,7 +1301,17 @@ {"\U0001f639", "cat with tears of joy", []string{"joy_cat"}, "6.0", false},{"\U0001f579\ufe0f", "joystick", []string{"joystick"}, "7.0", false}, {"\U0001f1ef\U0001f1f5", "flag: Japan", []string{"jp"}, "6.0", false}, {"\U0001f9d1\u200d\u2696\ufe0f", "judge", []string{"judge"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\u2696\ufe0f", "judge: Dark Skin Tone", []string{"judge_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\u2696\ufe0f", "judge: Light Skin Tone", []string{"judge_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\u2696\ufe0f", "judge: Medium-Dark Skin Tone", []string{"judge_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\u2696\ufe0f", "judge: Medium-Light Skin Tone", []string{"judge_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\u2696\ufe0f", "judge: Medium Skin Tone", []string{"judge_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f939", "person juggling", []string{"juggling_person"}, "11.0", true}, {"\U0001f939\U0001f3ff", "person juggling: Dark Skin Tone", []string{"juggling_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fb", "person juggling: Light Skin Tone", []string{"juggling_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fe", "person juggling: Medium-Dark Skin Tone", []string{"juggling_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fc", "person juggling: Medium-Light Skin Tone", []string{"juggling_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fd", "person juggling: Medium Skin Tone", []string{"juggling_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f54b", "kaaba", []string{"kaaba"}, "8.0", false}, {"\U0001f998", "kangaroo", []string{"kangaroo"}, "11.0", false}, {"\U0001f1f0\U0001f1ff", "flag: Kazakhstan", []string{"kazakhstan"}, "6.0", false},
-
@@ -815,8 +1331,24 @@ {"\U0001f619", "kissing face with smiling eyes", []string{"kissing_smiling_eyes"}, "6.1", false},{"\U0001fa81", "kite", []string{"kite"}, "12.0", false}, {"\U0001f95d", "kiwi fruit", []string{"kiwi_fruit"}, "9.0", false}, {"\U0001f9ce\u200d\u2642\ufe0f", "man kneeling", []string{"kneeling_man"}, "12.0", true}, {"\U0001f9ce\U0001f3ff\u200d\u2642\ufe0f", "man kneeling: Dark Skin Tone", []string{"kneeling_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fb\u200d\u2642\ufe0f", "man kneeling: Light Skin Tone", []string{"kneeling_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fe\u200d\u2642\ufe0f", "man kneeling: Medium-Dark Skin Tone", []string{"kneeling_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fc\u200d\u2642\ufe0f", "man kneeling: Medium-Light Skin Tone", []string{"kneeling_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fd\u200d\u2642\ufe0f", "man kneeling: Medium Skin Tone", []string{"kneeling_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9ce", "person kneeling", []string{"kneeling_person"}, "12.0", true}, {"\U0001f9ce\U0001f3ff", "person kneeling: Dark Skin Tone", []string{"kneeling_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fb", "person kneeling: Light Skin Tone", []string{"kneeling_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fe", "person kneeling: Medium-Dark Skin Tone", []string{"kneeling_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fc", "person kneeling: Medium-Light Skin Tone", []string{"kneeling_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fd", "person kneeling: Medium Skin Tone", []string{"kneeling_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\u200d\u2640\ufe0f", "woman kneeling", []string{"kneeling_woman"}, "12.0", true}, {"\U0001f9ce\U0001f3ff\u200d\u2640\ufe0f", "woman kneeling: Dark Skin Tone", []string{"kneeling_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fb\u200d\u2640\ufe0f", "woman kneeling: Light Skin Tone", []string{"kneeling_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fe\u200d\u2640\ufe0f", "woman kneeling: Medium-Dark Skin Tone", []string{"kneeling_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fc\u200d\u2640\ufe0f", "woman kneeling: Medium-Light Skin Tone", []string{"kneeling_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fd\u200d\u2640\ufe0f", "woman kneeling: Medium Skin Tone", []string{"kneeling_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001faa2", "knot", []string{"knot"}, "13.0", false}, {"\U0001f428", "koala", []string{"koala"}, "6.0", false}, {"\U0001f201", "Japanese โhereโ button", []string{"koko"}, "6.0", false}, {"\U0001f1fd\U0001f1f0", "flag: Kosovo", []string{"kosovo"}, "6.0", false},
-
@@ -826,6 +1358,7 @@ {"\U0001f1f0\U0001f1ec", "flag: Kyrgyzstan", []string{"kyrgyzstan"}, "6.0", false},{"\U0001f97c", "lab coat", []string{"lab_coat"}, "11.0", false}, {"\U0001f3f7\ufe0f", "label", []string{"label"}, "7.0", false}, {"\U0001f94d", "lacrosse", []string{"lacrosse"}, "11.0", false}, {"\U0001fa9c", "ladder", []string{"ladder"}, "13.0", false}, {"\U0001f41e", "lady beetle", []string{"lady_beetle"}, "6.0", false}, {"\U0001f1f1\U0001f1e6", "flag: Laos", []string{"laos"}, "6.0", false}, {"\U0001f535", "blue circle", []string{"large_blue_circle"}, "6.0", false},
-
@@ -844,7 +1377,18 @@ {"\U0001f6c5", "left luggage", []string{"left_luggage"}, "6.0", false},{"\u2194\ufe0f", "left-right arrow", []string{"left_right_arrow"}, "", false}, {"\U0001f5e8\ufe0f", "left speech bubble", []string{"left_speech_bubble"}, "11.0", false}, {"\u21a9\ufe0f", "right arrow curving left", []string{"leftwards_arrow_with_hook"}, "", false}, {"\U0001faf2", "leftwards hand", []string{"leftwards_hand"}, "14.0", true}, {"\U0001faf2\U0001f3ff", "leftwards hand: Dark Skin Tone", []string{"leftwards_hand_Dark_Skin_Tone"}, "12.0", false}, {"\U0001faf2\U0001f3fb", "leftwards hand: Light Skin Tone", []string{"leftwards_hand_Light_Skin_Tone"}, "12.0", false}, {"\U0001faf2\U0001f3fe", "leftwards hand: Medium-Dark Skin Tone", []string{"leftwards_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001faf2\U0001f3fc", "leftwards hand: Medium-Light Skin Tone", []string{"leftwards_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001faf2\U0001f3fd", "leftwards hand: Medium Skin Tone", []string{"leftwards_hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9b5", "leg", []string{"leg"}, "11.0", true}, {"\U0001f9b5\U0001f3ff", "leg: Dark Skin Tone", []string{"leg_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b5\U0001f3fb", "leg: Light Skin Tone", []string{"leg_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b5\U0001f3fe", "leg: Medium-Dark Skin Tone", []string{"leg_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b5\U0001f3fc", "leg: Medium-Light Skin Tone", []string{"leg_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b5\U0001f3fd", "leg: Medium Skin Tone", []string{"leg_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f34b", "lemon", []string{"lemon"}, "6.0", false}, {"\u264c", "Leo", []string{"leo"}, "", false}, {"\U0001f406", "leopard", []string{"leopard"}, "6.0", false},
-
@@ -866,18 +1410,42 @@ {"\U0001f99e", "lobster", []string{"lobster"}, "11.0", false},{"\U0001f512", "locked", []string{"lock"}, "6.0", false}, {"\U0001f50f", "locked with pen", []string{"lock_with_ink_pen"}, "6.0", false}, {"\U0001f36d", "lollipop", []string{"lollipop"}, "6.0", false}, {"\U0001fa98", "long drum", []string{"long_drum"}, "13.0", false}, {"\u27bf", "double curly loop", []string{"loop"}, "6.0", false}, {"\U0001f9f4", "lotion bottle", []string{"lotion_bottle"}, "11.0", false}, {"\U0001fab7", "lotus", []string{"lotus"}, "14.0", false}, {"\U0001f9d8", "person in lotus position", []string{"lotus_position"}, "11.0", true}, {"\U0001f9d8\U0001f3ff", "person in lotus position: Dark Skin Tone", []string{"lotus_position_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fb", "person in lotus position: Light Skin Tone", []string{"lotus_position_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fe", "person in lotus position: Medium-Dark Skin Tone", []string{"lotus_position_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fc", "person in lotus position: Medium-Light Skin Tone", []string{"lotus_position_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fd", "person in lotus position: Medium Skin Tone", []string{"lotus_position_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\u200d\u2642\ufe0f", "man in lotus position", []string{"lotus_position_man"}, "11.0", true}, {"\U0001f9d8\U0001f3ff\u200d\u2642\ufe0f", "man in lotus position: Dark Skin Tone", []string{"lotus_position_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fb\u200d\u2642\ufe0f", "man in lotus position: Light Skin Tone", []string{"lotus_position_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fe\u200d\u2642\ufe0f", "man in lotus position: Medium-Dark Skin Tone", []string{"lotus_position_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fc\u200d\u2642\ufe0f", "man in lotus position: Medium-Light Skin Tone", []string{"lotus_position_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fd\u200d\u2642\ufe0f", "man in lotus position: Medium Skin Tone", []string{"lotus_position_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\u200d\u2640\ufe0f", "woman in lotus position", []string{"lotus_position_woman"}, "11.0", true}, {"\U0001f9d8\U0001f3ff\u200d\u2640\ufe0f", "woman in lotus position: Dark Skin Tone", []string{"lotus_position_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fb\u200d\u2640\ufe0f", "woman in lotus position: Light Skin Tone", []string{"lotus_position_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fe\u200d\u2640\ufe0f", "woman in lotus position: Medium-Dark Skin Tone", []string{"lotus_position_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fc\u200d\u2640\ufe0f", "woman in lotus position: Medium-Light Skin Tone", []string{"lotus_position_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fd\u200d\u2640\ufe0f", "woman in lotus position: Medium Skin Tone", []string{"lotus_position_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f50a", "speaker high volume", []string{"loud_sound"}, "6.0", false}, {"\U0001f4e2", "loudspeaker", []string{"loudspeaker"}, "6.0", false}, {"\U0001f3e9", "love hotel", []string{"love_hotel"}, "6.0", false}, {"\U0001f48c", "love letter", []string{"love_letter"}, "6.0", false}, {"\U0001f91f", "love-you gesture", []string{"love_you_gesture"}, "11.0", true}, {"\U0001f91f\U0001f3ff", "love-you gesture: Dark Skin Tone", []string{"love_you_gesture_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91f\U0001f3fb", "love-you gesture: Light Skin Tone", []string{"love_you_gesture_Light_Skin_Tone"}, "12.0", false}, {"\U0001f91f\U0001f3fe", "love-you gesture: Medium-Dark Skin Tone", []string{"love_you_gesture_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91f\U0001f3fc", "love-you gesture: Medium-Light Skin Tone", []string{"love_you_gesture_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f91f\U0001f3fd", "love-you gesture: Medium Skin Tone", []string{"love_you_gesture_Medium_Skin_Tone"}, "12.0", false}, {"\U0001faab", "low battery", []string{"low_battery"}, "14.0", false}, {"\U0001f505", "dim button", []string{"low_brightness"}, "6.0", false}, {"\U0001f9f3", "luggage", []string{"luggage"}, "11.0", false}, {"\U0001fac1", "lungs", []string{"lungs"}, "13.0", false}, {"\U0001f1f1\U0001f1fa", "flag: Luxembourg", []string{"luxembourg"}, "6.0", false}, {"\U0001f925", "lying face", []string{"lying_face"}, "9.0", false}, {"\u24c2\ufe0f", "circled M", []string{"m"}, "", false},
-
@@ -887,8 +1455,24 @@ {"\U0001f1f2\U0001f1ec", "flag: Madagascar", []string{"madagascar"}, "6.0", false},{"\U0001f50d", "magnifying glass tilted left", []string{"mag"}, "6.0", false}, {"\U0001f50e", "magnifying glass tilted right", []string{"mag_right"}, "6.0", false}, {"\U0001f9d9", "mage", []string{"mage"}, "11.0", true}, {"\U0001f9d9\U0001f3ff", "mage: Dark Skin Tone", []string{"mage_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fb", "mage: Light Skin Tone", []string{"mage_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fe", "mage: Medium-Dark Skin Tone", []string{"mage_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fc", "mage: Medium-Light Skin Tone", []string{"mage_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fd", "mage: Medium Skin Tone", []string{"mage_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\u200d\u2642\ufe0f", "man mage", []string{"mage_man"}, "11.0", true}, {"\U0001f9d9\U0001f3ff\u200d\u2642\ufe0f", "man mage: Dark Skin Tone", []string{"mage_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fb\u200d\u2642\ufe0f", "man mage: Light Skin Tone", []string{"mage_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fe\u200d\u2642\ufe0f", "man mage: Medium-Dark Skin Tone", []string{"mage_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fc\u200d\u2642\ufe0f", "man mage: Medium-Light Skin Tone", []string{"mage_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fd\u200d\u2642\ufe0f", "man mage: Medium Skin Tone", []string{"mage_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\u200d\u2640\ufe0f", "woman mage", []string{"mage_woman"}, "11.0", true}, {"\U0001f9d9\U0001f3ff\u200d\u2640\ufe0f", "woman mage: Dark Skin Tone", []string{"mage_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fb\u200d\u2640\ufe0f", "woman mage: Light Skin Tone", []string{"mage_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fe\u200d\u2640\ufe0f", "woman mage: Medium-Dark Skin Tone", []string{"mage_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fc\u200d\u2640\ufe0f", "woman mage: Medium-Light Skin Tone", []string{"mage_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fd\u200d\u2640\ufe0f", "woman mage: Medium Skin Tone", []string{"mage_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001fa84", "magic wand", []string{"magic_wand"}, "13.0", false}, {"\U0001f9f2", "magnet", []string{"magnet"}, "11.0", false}, {"\U0001f004", "mahjong red dragon", []string{"mahjong"}, "", false}, {"\U0001f4eb", "closed mailbox with raised flag", []string{"mailbox"}, "6.0", false},
-
@@ -899,38 +1483,213 @@ {"\U0001f1f2\U0001f1fc", "flag: Malawi", []string{"malawi"}, "6.0", false},{"\U0001f1f2\U0001f1fe", "flag: Malaysia", []string{"malaysia"}, "6.0", false}, {"\U0001f1f2\U0001f1fb", "flag: Maldives", []string{"maldives"}, "6.0", false}, {"\U0001f575\ufe0f\u200d\u2642\ufe0f", "man detective", []string{"male_detective"}, "11.0", true}, {"\U0001f575\U0001f3ff\ufe0f\u200d\u2642\ufe0f", "man detective: Dark Skin Tone", []string{"male_detective_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fb\ufe0f\u200d\u2642\ufe0f", "man detective: Light Skin Tone", []string{"male_detective_Light_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fe\ufe0f\u200d\u2642\ufe0f", "man detective: Medium-Dark Skin Tone", []string{"male_detective_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fc\ufe0f\u200d\u2642\ufe0f", "man detective: Medium-Light Skin Tone", []string{"male_detective_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fd\ufe0f\u200d\u2642\ufe0f", "man detective: Medium Skin Tone", []string{"male_detective_Medium_Skin_Tone"}, "12.0", false}, {"\u2642\ufe0f", "male sign", []string{"male_sign"}, "11.0", false}, {"\U0001f1f2\U0001f1f1", "flag: Mali", []string{"mali"}, "6.0", false}, {"\U0001f1f2\U0001f1f9", "flag: Malta", []string{"malta"}, "6.0", false}, {"\U0001f9a3", "mammoth", []string{"mammoth"}, "13.0", false}, {"\U0001f468", "man", []string{"man"}, "6.0", true}, {"\U0001f468\U0001f3ff", "man: Dark Skin Tone", []string{"man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb", "man: Light Skin Tone", []string{"man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe", "man: Medium-Dark Skin Tone", []string{"man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc", "man: Medium-Light Skin Tone", []string{"man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd", "man: Medium Skin Tone", []string{"man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f3a8", "man artist", []string{"man_artist"}, "", true}, {"\U0001f468\U0001f3ff\u200d\U0001f3a8", "man artist: Dark Skin Tone", []string{"man_artist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f3a8", "man artist: Light Skin Tone", []string{"man_artist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f3a8", "man artist: Medium-Dark Skin Tone", []string{"man_artist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f3a8", "man artist: Medium-Light Skin Tone", []string{"man_artist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f3a8", "man artist: Medium Skin Tone", []string{"man_artist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f680", "man astronaut", []string{"man_astronaut"}, "", true}, {"\U0001f468\U0001f3ff\u200d\U0001f680", "man astronaut: Dark Skin Tone", []string{"man_astronaut_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f680", "man astronaut: Light Skin Tone", []string{"man_astronaut_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f680", "man astronaut: Medium-Dark Skin Tone", []string{"man_astronaut_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f680", "man astronaut: Medium-Light Skin Tone", []string{"man_astronaut_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f680", "man astronaut: Medium Skin Tone", []string{"man_astronaut_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\u200d\u2642\ufe0f", "man: beard", []string{"man_beard"}, "13.1", true}, {"\U0001f9d4\U0001f3ff\u200d\u2642\ufe0f", "man: beard: Dark Skin Tone", []string{"man_beard_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fb\u200d\u2642\ufe0f", "man: beard: Light Skin Tone", []string{"man_beard_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fe\u200d\u2642\ufe0f", "man: beard: Medium-Dark Skin Tone", []string{"man_beard_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fc\u200d\u2642\ufe0f", "man: beard: Medium-Light Skin Tone", []string{"man_beard_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fd\u200d\u2642\ufe0f", "man: beard: Medium Skin Tone", []string{"man_beard_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f938\u200d\u2642\ufe0f", "man cartwheeling", []string{"man_cartwheeling"}, "", true}, {"\U0001f938\U0001f3ff\u200d\u2642\ufe0f", "man cartwheeling: Dark Skin Tone", []string{"man_cartwheeling_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fb\u200d\u2642\ufe0f", "man cartwheeling: Light Skin Tone", []string{"man_cartwheeling_Light_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fe\u200d\u2642\ufe0f", "man cartwheeling: Medium-Dark Skin Tone", []string{"man_cartwheeling_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fc\u200d\u2642\ufe0f", "man cartwheeling: Medium-Light Skin Tone", []string{"man_cartwheeling_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fd\u200d\u2642\ufe0f", "man cartwheeling: Medium Skin Tone", []string{"man_cartwheeling_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f373", "man cook", []string{"man_cook"}, "", true}, {"\U0001f468\U0001f3ff\u200d\U0001f373", "man cook: Dark Skin Tone", []string{"man_cook_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f373", "man cook: Light Skin Tone", []string{"man_cook_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f373", "man cook: Medium-Dark Skin Tone", []string{"man_cook_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f373", "man cook: Medium-Light Skin Tone", []string{"man_cook_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f373", "man cook: Medium Skin Tone", []string{"man_cook_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f57a", "man dancing", []string{"man_dancing"}, "9.0", true}, {"\U0001f57a\U0001f3ff", "man dancing: Dark Skin Tone", []string{"man_dancing_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f57a\U0001f3fb", "man dancing: Light Skin Tone", []string{"man_dancing_Light_Skin_Tone"}, "12.0", false}, {"\U0001f57a\U0001f3fe", "man dancing: Medium-Dark Skin Tone", []string{"man_dancing_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f57a\U0001f3fc", "man dancing: Medium-Light Skin Tone", []string{"man_dancing_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f57a\U0001f3fd", "man dancing: Medium Skin Tone", []string{"man_dancing_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f926\u200d\u2642\ufe0f", "man facepalming", []string{"man_facepalming"}, "9.0", true}, {"\U0001f926\U0001f3ff\u200d\u2642\ufe0f", "man facepalming: Dark Skin Tone", []string{"man_facepalming_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fb\u200d\u2642\ufe0f", "man facepalming: Light Skin Tone", []string{"man_facepalming_Light_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fe\u200d\u2642\ufe0f", "man facepalming: Medium-Dark Skin Tone", []string{"man_facepalming_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fc\u200d\u2642\ufe0f", "man facepalming: Medium-Light Skin Tone", []string{"man_facepalming_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fd\u200d\u2642\ufe0f", "man facepalming: Medium Skin Tone", []string{"man_facepalming_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f3ed", "man factory worker", []string{"man_factory_worker"}, "", true}, {"\U0001f468\U0001f3ff\u200d\U0001f3ed", "man factory worker: Dark Skin Tone", []string{"man_factory_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f3ed", "man factory worker: Light Skin Tone", []string{"man_factory_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f3ed", "man factory worker: Medium-Dark Skin Tone", []string{"man_factory_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f3ed", "man factory worker: Medium-Light Skin Tone", []string{"man_factory_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f3ed", "man factory worker: Medium Skin Tone", []string{"man_factory_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f33e", "man farmer", []string{"man_farmer"}, "", true}, {"\U0001f468\U0001f3ff\u200d\U0001f33e", "man farmer: Dark Skin Tone", []string{"man_farmer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f33e", "man farmer: Light Skin Tone", []string{"man_farmer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f33e", "man farmer: Medium-Dark Skin Tone", []string{"man_farmer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f33e", "man farmer: Medium-Light Skin Tone", []string{"man_farmer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f33e", "man farmer: Medium Skin Tone", []string{"man_farmer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f37c", "man feeding baby", []string{"man_feeding_baby"}, "13.0", true}, {"\U0001f468\U0001f3ff\u200d\U0001f37c", "man feeding baby: Dark Skin Tone", []string{"man_feeding_baby_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f37c", "man feeding baby: Light Skin Tone", []string{"man_feeding_baby_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f37c", "man feeding baby: Medium-Dark Skin Tone", []string{"man_feeding_baby_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f37c", "man feeding baby: Medium-Light Skin Tone", []string{"man_feeding_baby_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f37c", "man feeding baby: Medium Skin Tone", []string{"man_feeding_baby_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f692", "man firefighter", []string{"man_firefighter"}, "", true}, {"\U0001f468\U0001f3ff\u200d\U0001f692", "man firefighter: Dark Skin Tone", []string{"man_firefighter_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f692", "man firefighter: Light Skin Tone", []string{"man_firefighter_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f692", "man firefighter: Medium-Dark Skin Tone", []string{"man_firefighter_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f692", "man firefighter: Medium-Light Skin Tone", []string{"man_firefighter_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f692", "man firefighter: Medium Skin Tone", []string{"man_firefighter_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\u2695\ufe0f", "man health worker", []string{"man_health_worker"}, "", true}, {"\U0001f468\U0001f3ff\u200d\u2695\ufe0f", "man health worker: Dark Skin Tone", []string{"man_health_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\u2695\ufe0f", "man health worker: Light Skin Tone", []string{"man_health_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\u2695\ufe0f", "man health worker: Medium-Dark Skin Tone", []string{"man_health_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\u2695\ufe0f", "man health worker: Medium-Light Skin Tone", []string{"man_health_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\u2695\ufe0f", "man health worker: Medium Skin Tone", []string{"man_health_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f9bd", "man in manual wheelchair", []string{"man_in_manual_wheelchair"}, "12.0", true}, {"\U0001f468\U0001f3ff\u200d\U0001f9bd", "man in manual wheelchair: Dark Skin Tone", []string{"man_in_manual_wheelchair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f9bd", "man in manual wheelchair: Light Skin Tone", []string{"man_in_manual_wheelchair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f9bd", "man in manual wheelchair: Medium-Dark Skin Tone", []string{"man_in_manual_wheelchair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f9bd", "man in manual wheelchair: Medium-Light Skin Tone", []string{"man_in_manual_wheelchair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f9bd", "man in manual wheelchair: Medium Skin Tone", []string{"man_in_manual_wheelchair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f9bc", "man in motorized wheelchair", []string{"man_in_motorized_wheelchair"}, "12.0", true}, {"\U0001f468\U0001f3ff\u200d\U0001f9bc", "man in motorized wheelchair: Dark Skin Tone", []string{"man_in_motorized_wheelchair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f9bc", "man in motorized wheelchair: Light Skin Tone", []string{"man_in_motorized_wheelchair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f9bc", "man in motorized wheelchair: Medium-Dark Skin Tone", []string{"man_in_motorized_wheelchair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f9bc", "man in motorized wheelchair: Medium-Light Skin Tone", []string{"man_in_motorized_wheelchair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f9bc", "man in motorized wheelchair: Medium Skin Tone", []string{"man_in_motorized_wheelchair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f935\u200d\u2642\ufe0f", "man in tuxedo", []string{"man_in_tuxedo"}, "13.0", true}, {"\U0001f935\U0001f3ff\u200d\u2642\ufe0f", "man in tuxedo: Dark Skin Tone", []string{"man_in_tuxedo_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fb\u200d\u2642\ufe0f", "man in tuxedo: Light Skin Tone", []string{"man_in_tuxedo_Light_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fe\u200d\u2642\ufe0f", "man in tuxedo: Medium-Dark Skin Tone", []string{"man_in_tuxedo_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fc\u200d\u2642\ufe0f", "man in tuxedo: Medium-Light Skin Tone", []string{"man_in_tuxedo_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fd\u200d\u2642\ufe0f", "man in tuxedo: Medium Skin Tone", []string{"man_in_tuxedo_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\u2696\ufe0f", "man judge", []string{"man_judge"}, "", true}, {"\U0001f468\U0001f3ff\u200d\u2696\ufe0f", "man judge: Dark Skin Tone", []string{"man_judge_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\u2696\ufe0f", "man judge: Light Skin Tone", []string{"man_judge_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\u2696\ufe0f", "man judge: Medium-Dark Skin Tone", []string{"man_judge_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\u2696\ufe0f", "man judge: Medium-Light Skin Tone", []string{"man_judge_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\u2696\ufe0f", "man judge: Medium Skin Tone", []string{"man_judge_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f939\u200d\u2642\ufe0f", "man juggling", []string{"man_juggling"}, "9.0", true}, {"\U0001f939\U0001f3ff\u200d\u2642\ufe0f", "man juggling: Dark Skin Tone", []string{"man_juggling_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fb\u200d\u2642\ufe0f", "man juggling: Light Skin Tone", []string{"man_juggling_Light_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fe\u200d\u2642\ufe0f", "man juggling: Medium-Dark Skin Tone", []string{"man_juggling_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fc\u200d\u2642\ufe0f", "man juggling: Medium-Light Skin Tone", []string{"man_juggling_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fd\u200d\u2642\ufe0f", "man juggling: Medium Skin Tone", []string{"man_juggling_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f527", "man mechanic", []string{"man_mechanic"}, "", true}, {"\U0001f468\U0001f3ff\u200d\U0001f527", "man mechanic: Dark Skin Tone", []string{"man_mechanic_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f527", "man mechanic: Light Skin Tone", []string{"man_mechanic_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f527", "man mechanic: Medium-Dark Skin Tone", []string{"man_mechanic_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f527", "man mechanic: Medium-Light Skin Tone", []string{"man_mechanic_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f527", "man mechanic: Medium Skin Tone", []string{"man_mechanic_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f4bc", "man office worker", []string{"man_office_worker"}, "", true}, {"\U0001f468\U0001f3ff\u200d\U0001f4bc", "man office worker: Dark Skin Tone", []string{"man_office_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f4bc", "man office worker: Light Skin Tone", []string{"man_office_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f4bc", "man office worker: Medium-Dark Skin Tone", []string{"man_office_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f4bc", "man office worker: Medium-Light Skin Tone", []string{"man_office_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f4bc", "man office worker: Medium Skin Tone", []string{"man_office_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\u2708\ufe0f", "man pilot", []string{"man_pilot"}, "", true}, {"\U0001f468\U0001f3ff\u200d\u2708\ufe0f", "man pilot: Dark Skin Tone", []string{"man_pilot_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\u2708\ufe0f", "man pilot: Light Skin Tone", []string{"man_pilot_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\u2708\ufe0f", "man pilot: Medium-Dark Skin Tone", []string{"man_pilot_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\u2708\ufe0f", "man pilot: Medium-Light Skin Tone", []string{"man_pilot_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\u2708\ufe0f", "man pilot: Medium Skin Tone", []string{"man_pilot_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f93e\u200d\u2642\ufe0f", "man playing handball", []string{"man_playing_handball"}, "9.0", true}, {"\U0001f93e\U0001f3ff\u200d\u2642\ufe0f", "man playing handball: Dark Skin Tone", []string{"man_playing_handball_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fb\u200d\u2642\ufe0f", "man playing handball: Light Skin Tone", []string{"man_playing_handball_Light_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fe\u200d\u2642\ufe0f", "man playing handball: Medium-Dark Skin Tone", []string{"man_playing_handball_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fc\u200d\u2642\ufe0f", "man playing handball: Medium-Light Skin Tone", []string{"man_playing_handball_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fd\u200d\u2642\ufe0f", "man playing handball: Medium Skin Tone", []string{"man_playing_handball_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f93d\u200d\u2642\ufe0f", "man playing water polo", []string{"man_playing_water_polo"}, "9.0", true}, {"\U0001f93d\U0001f3ff\u200d\u2642\ufe0f", "man playing water polo: Dark Skin Tone", []string{"man_playing_water_polo_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fb\u200d\u2642\ufe0f", "man playing water polo: Light Skin Tone", []string{"man_playing_water_polo_Light_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fe\u200d\u2642\ufe0f", "man playing water polo: Medium-Dark Skin Tone", []string{"man_playing_water_polo_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fc\u200d\u2642\ufe0f", "man playing water polo: Medium-Light Skin Tone", []string{"man_playing_water_polo_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fd\u200d\u2642\ufe0f", "man playing water polo: Medium Skin Tone", []string{"man_playing_water_polo_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f52c", "man scientist", []string{"man_scientist"}, "", true}, {"\U0001f468\U0001f3ff\u200d\U0001f52c", "man scientist: Dark Skin Tone", []string{"man_scientist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f52c", "man scientist: Light Skin Tone", []string{"man_scientist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f52c", "man scientist: Medium-Dark Skin Tone", []string{"man_scientist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f52c", "man scientist: Medium-Light Skin Tone", []string{"man_scientist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f52c", "man scientist: Medium Skin Tone", []string{"man_scientist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f937\u200d\u2642\ufe0f", "man shrugging", []string{"man_shrugging"}, "9.0", true}, {"\U0001f937\U0001f3ff\u200d\u2642\ufe0f", "man shrugging: Dark Skin Tone", []string{"man_shrugging_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fb\u200d\u2642\ufe0f", "man shrugging: Light Skin Tone", []string{"man_shrugging_Light_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fe\u200d\u2642\ufe0f", "man shrugging: Medium-Dark Skin Tone", []string{"man_shrugging_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fc\u200d\u2642\ufe0f", "man shrugging: Medium-Light Skin Tone", []string{"man_shrugging_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fd\u200d\u2642\ufe0f", "man shrugging: Medium Skin Tone", []string{"man_shrugging_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f3a4", "man singer", []string{"man_singer"}, "", true}, {"\U0001f468\U0001f3ff\u200d\U0001f3a4", "man singer: Dark Skin Tone", []string{"man_singer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f3a4", "man singer: Light Skin Tone", []string{"man_singer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f3a4", "man singer: Medium-Dark Skin Tone", []string{"man_singer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f3a4", "man singer: Medium-Light Skin Tone", []string{"man_singer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f3a4", "man singer: Medium Skin Tone", []string{"man_singer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f393", "man student", []string{"man_student"}, "", true}, {"\U0001f468\U0001f3ff\u200d\U0001f393", "man student: Dark Skin Tone", []string{"man_student_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f393", "man student: Light Skin Tone", []string{"man_student_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f393", "man student: Medium-Dark Skin Tone", []string{"man_student_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f393", "man student: Medium-Light Skin Tone", []string{"man_student_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f393", "man student: Medium Skin Tone", []string{"man_student_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f3eb", "man teacher", []string{"man_teacher"}, "", true}, {"\U0001f468\U0001f3ff\u200d\U0001f3eb", "man teacher: Dark Skin Tone", []string{"man_teacher_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f3eb", "man teacher: Light Skin Tone", []string{"man_teacher_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f3eb", "man teacher: Medium-Dark Skin Tone", []string{"man_teacher_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f3eb", "man teacher: Medium-Light Skin Tone", []string{"man_teacher_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f3eb", "man teacher: Medium Skin Tone", []string{"man_teacher_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f4bb", "man technologist", []string{"man_technologist"}, "", true}, {"\U0001f468\U0001f3ff\u200d\U0001f4bb", "man technologist: Dark Skin Tone", []string{"man_technologist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f4bb", "man technologist: Light Skin Tone", []string{"man_technologist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f4bb", "man technologist: Medium-Dark Skin Tone", []string{"man_technologist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f4bb", "man technologist: Medium-Light Skin Tone", []string{"man_technologist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f4bb", "man technologist: Medium Skin Tone", []string{"man_technologist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f472", "person with skullcap", []string{"man_with_gua_pi_mao"}, "6.0", true}, {"\U0001f472\U0001f3ff", "person with skullcap: Dark Skin Tone", []string{"man_with_gua_pi_mao_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f472\U0001f3fb", "person with skullcap: Light Skin Tone", []string{"man_with_gua_pi_mao_Light_Skin_Tone"}, "12.0", false}, {"\U0001f472\U0001f3fe", "person with skullcap: Medium-Dark Skin Tone", []string{"man_with_gua_pi_mao_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f472\U0001f3fc", "person with skullcap: Medium-Light Skin Tone", []string{"man_with_gua_pi_mao_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f472\U0001f3fd", "person with skullcap: Medium Skin Tone", []string{"man_with_gua_pi_mao_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\u200d\U0001f9af", "man with white cane", []string{"man_with_probing_cane"}, "12.0", true}, {"\U0001f468\U0001f3ff\u200d\U0001f9af", "man with white cane: Dark Skin Tone", []string{"man_with_probing_cane_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f9af", "man with white cane: Light Skin Tone", []string{"man_with_probing_cane_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f9af", "man with white cane: Medium-Dark Skin Tone", []string{"man_with_probing_cane_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f9af", "man with white cane: Medium-Light Skin Tone", []string{"man_with_probing_cane_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f9af", "man with white cane: Medium Skin Tone", []string{"man_with_probing_cane_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f473\u200d\u2642\ufe0f", "man wearing turban", []string{"man_with_turban"}, "11.0", true}, {"\U0001f473\U0001f3ff\u200d\u2642\ufe0f", "man wearing turban: Dark Skin Tone", []string{"man_with_turban_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fb\u200d\u2642\ufe0f", "man wearing turban: Light Skin Tone", []string{"man_with_turban_Light_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fe\u200d\u2642\ufe0f", "man wearing turban: Medium-Dark Skin Tone", []string{"man_with_turban_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fc\u200d\u2642\ufe0f", "man wearing turban: Medium-Light Skin Tone", []string{"man_with_turban_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fd\u200d\u2642\ufe0f", "man wearing turban: Medium Skin Tone", []string{"man_with_turban_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f470\u200d\u2642\ufe0f", "man with veil", []string{"man_with_veil"}, "13.0", true}, {"\U0001f470\U0001f3ff\u200d\u2642\ufe0f", "man with veil: Dark Skin Tone", []string{"man_with_veil_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fb\u200d\u2642\ufe0f", "man with veil: Light Skin Tone", []string{"man_with_veil_Light_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fe\u200d\u2642\ufe0f", "man with veil: Medium-Dark Skin Tone", []string{"man_with_veil_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fc\u200d\u2642\ufe0f", "man with veil: Medium-Light Skin Tone", []string{"man_with_veil_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fd\u200d\u2642\ufe0f", "man with veil: Medium Skin Tone", []string{"man_with_veil_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f96d", "mango", []string{"mango"}, "11.0", false}, {"\U0001f45e", "manโs shoe", []string{"mans_shoe", "shoe"}, "6.0", false}, {"\U0001f570\ufe0f", "mantelpiece clock", []string{"mantelpiece_clock"}, "7.0", false},
-
@@ -941,14 +1700,34 @@ {"\U0001f94b", "martial arts uniform", []string{"martial_arts_uniform"}, "9.0", false},{"\U0001f1f2\U0001f1f6", "flag: Martinique", []string{"martinique"}, "6.0", false}, {"\U0001f637", "face with medical mask", []string{"mask"}, "6.0", false}, {"\U0001f486", "person getting massage", []string{"massage"}, "6.0", true}, {"\U0001f486\U0001f3ff", "person getting massage: Dark Skin Tone", []string{"massage_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fb", "person getting massage: Light Skin Tone", []string{"massage_Light_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fe", "person getting massage: Medium-Dark Skin Tone", []string{"massage_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fc", "person getting massage: Medium-Light Skin Tone", []string{"massage_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fd", "person getting massage: Medium Skin Tone", []string{"massage_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f486\u200d\u2642\ufe0f", "man getting massage", []string{"massage_man"}, "6.0", true}, {"\U0001f486\U0001f3ff\u200d\u2642\ufe0f", "man getting massage: Dark Skin Tone", []string{"massage_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fb\u200d\u2642\ufe0f", "man getting massage: Light Skin Tone", []string{"massage_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fe\u200d\u2642\ufe0f", "man getting massage: Medium-Dark Skin Tone", []string{"massage_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fc\u200d\u2642\ufe0f", "man getting massage: Medium-Light Skin Tone", []string{"massage_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fd\u200d\u2642\ufe0f", "man getting massage: Medium Skin Tone", []string{"massage_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f486\u200d\u2640\ufe0f", "woman getting massage", []string{"massage_woman"}, "11.0", true}, {"\U0001f486\U0001f3ff\u200d\u2640\ufe0f", "woman getting massage: Dark Skin Tone", []string{"massage_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fb\u200d\u2640\ufe0f", "woman getting massage: Light Skin Tone", []string{"massage_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fe\u200d\u2640\ufe0f", "woman getting massage: Medium-Dark Skin Tone", []string{"massage_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fc\u200d\u2640\ufe0f", "woman getting massage: Medium-Light Skin Tone", []string{"massage_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fd\u200d\u2640\ufe0f", "woman getting massage: Medium Skin Tone", []string{"massage_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9c9", "mate", []string{"mate"}, "12.0", false}, {"\U0001f1f2\U0001f1f7", "flag: Mauritania", []string{"mauritania"}, "6.0", false}, {"\U0001f1f2\U0001f1fa", "flag: Mauritius", []string{"mauritius"}, "6.0", false}, {"\U0001f1fe\U0001f1f9", "flag: Mayotte", []string{"mayotte"}, "6.0", false}, {"\U0001f356", "meat on bone", []string{"meat_on_bone"}, "6.0", false}, {"\U0001f9d1\u200d\U0001f527", "mechanic", []string{"mechanic"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f527", "mechanic: Dark Skin Tone", []string{"mechanic_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f527", "mechanic: Light Skin Tone", []string{"mechanic_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f527", "mechanic: Medium-Dark Skin Tone", []string{"mechanic_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f527", "mechanic: Medium-Light Skin Tone", []string{"mechanic_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f527", "mechanic: Medium Skin Tone", []string{"mechanic_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9be", "mechanical arm", []string{"mechanical_arm"}, "12.0", false}, {"\U0001f9bf", "mechanical leg", []string{"mechanical_leg"}, "12.0", false}, {"\U0001f396\ufe0f", "military medal", []string{"medal_military"}, "7.0", false},
-
@@ -956,14 +1735,36 @@ {"\U0001f3c5", "sports medal", []string{"medal_sports"}, "7.0", false},{"\u2695\ufe0f", "medical symbol", []string{"medical_symbol"}, "11.0", false}, {"\U0001f4e3", "megaphone", []string{"mega"}, "6.0", false}, {"\U0001f348", "melon", []string{"melon"}, "6.0", false}, {"\U0001fae0", "melting face", []string{"melting_face"}, "14.0", false}, {"\U0001f4dd", "memo", []string{"memo", "pencil"}, "6.0", false}, {"\U0001f93c\u200d\u2642\ufe0f", "men wrestling", []string{"men_wrestling"}, "9.0", false}, {"\u2764\ufe0f\u200d\U0001fa79", "mending heart", []string{"mending_heart"}, "13.1", false}, {"\U0001f54e", "menorah", []string{"menorah"}, "8.0", false}, {"\U0001f6b9", "menโs room", []string{"mens"}, "6.0", false}, {"\U0001f9dc\u200d\u2640\ufe0f", "mermaid", []string{"mermaid"}, "11.0", true}, {"\U0001f9dc\U0001f3ff\u200d\u2640\ufe0f", "mermaid: Dark Skin Tone", []string{"mermaid_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fb\u200d\u2640\ufe0f", "mermaid: Light Skin Tone", []string{"mermaid_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fe\u200d\u2640\ufe0f", "mermaid: Medium-Dark Skin Tone", []string{"mermaid_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fc\u200d\u2640\ufe0f", "mermaid: Medium-Light Skin Tone", []string{"mermaid_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fd\u200d\u2640\ufe0f", "mermaid: Medium Skin Tone", []string{"mermaid_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\u200d\u2642\ufe0f", "merman", []string{"merman"}, "11.0", true}, {"\U0001f9dc\U0001f3ff\u200d\u2642\ufe0f", "merman: Dark Skin Tone", []string{"merman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fb\u200d\u2642\ufe0f", "merman: Light Skin Tone", []string{"merman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fe\u200d\u2642\ufe0f", "merman: Medium-Dark Skin Tone", []string{"merman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fc\u200d\u2642\ufe0f", "merman: Medium-Light Skin Tone", []string{"merman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fd\u200d\u2642\ufe0f", "merman: Medium Skin Tone", []string{"merman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9dc", "merperson", []string{"merperson"}, "11.0", true}, {"\U0001f9dc\U0001f3ff", "merperson: Dark Skin Tone", []string{"merperson_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fb", "merperson: Light Skin Tone", []string{"merperson_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fe", "merperson: Medium-Dark Skin Tone", []string{"merperson_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fc", "merperson: Medium-Light Skin Tone", []string{"merperson_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fd", "merperson: Medium Skin Tone", []string{"merperson_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f918", "sign of the horns", []string{"metal"}, "8.0", true}, {"\U0001f918\U0001f3ff", "sign of the horns: Dark Skin Tone", []string{"metal_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f918\U0001f3fb", "sign of the horns: Light Skin Tone", []string{"metal_Light_Skin_Tone"}, "12.0", false}, {"\U0001f918\U0001f3fe", "sign of the horns: Medium-Dark Skin Tone", []string{"metal_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f918\U0001f3fc", "sign of the horns: Medium-Light Skin Tone", []string{"metal_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f918\U0001f3fd", "sign of the horns: Medium Skin Tone", []string{"metal_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f687", "metro", []string{"metro"}, "6.0", false}, {"\U0001f1f2\U0001f1fd", "flag: Mexico", []string{"mexico"}, "6.0", false}, {"\U0001f9a0", "microbe", []string{"microbe"}, "11.0", false},
-
@@ -971,10 +1772,18 @@ {"\U0001f1eb\U0001f1f2", "flag: Micronesia", []string{"micronesia"}, "6.0", false},{"\U0001f3a4", "microphone", []string{"microphone"}, "6.0", false}, {"\U0001f52c", "microscope", []string{"microscope"}, "6.0", false}, {"\U0001f595", "middle finger", []string{"middle_finger", "fu"}, "7.0", true}, {"\U0001f595\U0001f3ff", "middle finger: Dark Skin Tone", []string{"middle_finger_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f595\U0001f3fb", "middle finger: Light Skin Tone", []string{"middle_finger_Light_Skin_Tone"}, "12.0", false}, {"\U0001f595\U0001f3fe", "middle finger: Medium-Dark Skin Tone", []string{"middle_finger_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f595\U0001f3fc", "middle finger: Medium-Light Skin Tone", []string{"middle_finger_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f595\U0001f3fd", "middle finger: Medium Skin Tone", []string{"middle_finger_Medium_Skin_Tone"}, "12.0", false}, {"\U0001fa96", "military helmet", []string{"military_helmet"}, "13.0", false}, {"\U0001f95b", "glass of milk", []string{"milk_glass"}, "9.0", false}, {"\U0001f30c", "milky way", []string{"milky_way"}, "6.0", false}, {"\U0001f690", "minibus", []string{"minibus"}, "6.0", false}, {"\U0001f4bd", "computer disk", []string{"minidisc"}, "6.0", false}, {"\U0001fa9e", "mirror", []string{"mirror"}, "13.0", false}, {"\U0001faa9", "mirror ball", []string{"mirror_ball"}, "14.0", false}, {"\U0001f4f4", "mobile phone off", []string{"mobile_phone_off"}, "6.0", false}, {"\U0001f1f2\U0001f1e9", "flag: Moldova", []string{"moldova"}, "6.0", false}, {"\U0001f1f2\U0001f1e8", "flag: Monaco", []string{"monaco"}, "6.0", false},
-
@@ -1002,25 +1811,62 @@ {"\U0001f6e3\ufe0f", "motorway", []string{"motorway"}, "7.0", false},{"\U0001f5fb", "mount fuji", []string{"mount_fuji"}, "6.0", false}, {"\u26f0\ufe0f", "mountain", []string{"mountain"}, "5.2", false}, {"\U0001f6b5", "person mountain biking", []string{"mountain_bicyclist"}, "6.0", true}, {"\U0001f6b5\U0001f3ff", "person mountain biking: Dark Skin Tone", []string{"mountain_bicyclist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fb", "person mountain biking: Light Skin Tone", []string{"mountain_bicyclist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fe", "person mountain biking: Medium-Dark Skin Tone", []string{"mountain_bicyclist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fc", "person mountain biking: Medium-Light Skin Tone", []string{"mountain_bicyclist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fd", "person mountain biking: Medium Skin Tone", []string{"mountain_bicyclist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\u200d\u2642\ufe0f", "man mountain biking", []string{"mountain_biking_man"}, "11.0", true}, {"\U0001f6b5\U0001f3ff\u200d\u2642\ufe0f", "man mountain biking: Dark Skin Tone", []string{"mountain_biking_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fb\u200d\u2642\ufe0f", "man mountain biking: Light Skin Tone", []string{"mountain_biking_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fe\u200d\u2642\ufe0f", "man mountain biking: Medium-Dark Skin Tone", []string{"mountain_biking_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fc\u200d\u2642\ufe0f", "man mountain biking: Medium-Light Skin Tone", []string{"mountain_biking_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fd\u200d\u2642\ufe0f", "man mountain biking: Medium Skin Tone", []string{"mountain_biking_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\u200d\u2640\ufe0f", "woman mountain biking", []string{"mountain_biking_woman"}, "6.0", true}, {"\U0001f6b5\U0001f3ff\u200d\u2640\ufe0f", "woman mountain biking: Dark Skin Tone", []string{"mountain_biking_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fb\u200d\u2640\ufe0f", "woman mountain biking: Light Skin Tone", []string{"mountain_biking_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fe\u200d\u2640\ufe0f", "woman mountain biking: Medium-Dark Skin Tone", []string{"mountain_biking_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fc\u200d\u2640\ufe0f", "woman mountain biking: Medium-Light Skin Tone", []string{"mountain_biking_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fd\u200d\u2640\ufe0f", "woman mountain biking: Medium Skin Tone", []string{"mountain_biking_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6a0", "mountain cableway", []string{"mountain_cableway"}, "6.0", false}, {"\U0001f69e", "mountain railway", []string{"mountain_railway"}, "6.0", false}, {"\U0001f3d4\ufe0f", "snow-capped mountain", []string{"mountain_snow"}, "7.0", false}, {"\U0001f42d", "mouse face", []string{"mouse"}, "6.0", false}, {"\U0001f401", "mouse", []string{"mouse2"}, "6.0", false}, {"\U0001faa4", "mouse trap", []string{"mouse_trap"}, "13.0", false}, {"\U0001f3a5", "movie camera", []string{"movie_camera"}, "6.0", false}, {"\U0001f5ff", "moai", []string{"moyai"}, "6.0", false}, {"\U0001f1f2\U0001f1ff", "flag: Mozambique", []string{"mozambique"}, "6.0", false}, {"\U0001f936", "Mrs. Claus", []string{"mrs_claus"}, "9.0", true}, {"\U0001f936\U0001f3ff", "Mrs. Claus: Dark Skin Tone", []string{"mrs_claus_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f936\U0001f3fb", "Mrs. Claus: Light Skin Tone", []string{"mrs_claus_Light_Skin_Tone"}, "12.0", false}, {"\U0001f936\U0001f3fe", "Mrs. Claus: Medium-Dark Skin Tone", []string{"mrs_claus_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f936\U0001f3fc", "Mrs. Claus: Medium-Light Skin Tone", []string{"mrs_claus_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f936\U0001f3fd", "Mrs. Claus: Medium Skin Tone", []string{"mrs_claus_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f4aa", "flexed biceps", []string{"muscle"}, "6.0", true}, {"\U0001f4aa\U0001f3ff", "flexed biceps: Dark Skin Tone", []string{"muscle_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f4aa\U0001f3fb", "flexed biceps: Light Skin Tone", []string{"muscle_Light_Skin_Tone"}, "12.0", false}, {"\U0001f4aa\U0001f3fe", "flexed biceps: Medium-Dark Skin Tone", []string{"muscle_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f4aa\U0001f3fc", "flexed biceps: Medium-Light Skin Tone", []string{"muscle_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f4aa\U0001f3fd", "flexed biceps: Medium Skin Tone", []string{"muscle_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f344", "mushroom", []string{"mushroom"}, "6.0", false}, {"\U0001f3b9", "musical keyboard", []string{"musical_keyboard"}, "6.0", false}, {"\U0001f3b5", "musical note", []string{"musical_note"}, "6.0", false}, {"\U0001f3bc", "musical score", []string{"musical_score"}, "6.0", false}, {"\U0001f507", "muted speaker", []string{"mute"}, "6.0", false}, {"\U0001f9d1\u200d\U0001f384", "mx claus", []string{"mx_claus"}, "13.0", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f384", "mx claus: Dark Skin Tone", []string{"mx_claus_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f384", "mx claus: Light Skin Tone", []string{"mx_claus_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f384", "mx claus: Medium-Dark Skin Tone", []string{"mx_claus_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f384", "mx claus: Medium-Light Skin Tone", []string{"mx_claus_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f384", "mx claus: Medium Skin Tone", []string{"mx_claus_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1f2\U0001f1f2", "flag: Myanmar (Burma)", []string{"myanmar"}, "6.0", false}, {"\U0001f485", "nail polish", []string{"nail_care"}, "6.0", true}, {"\U0001f485\U0001f3ff", "nail polish: Dark Skin Tone", []string{"nail_care_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f485\U0001f3fb", "nail polish: Light Skin Tone", []string{"nail_care_Light_Skin_Tone"}, "12.0", false}, {"\U0001f485\U0001f3fe", "nail polish: Medium-Dark Skin Tone", []string{"nail_care_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f485\U0001f3fc", "nail polish: Medium-Light Skin Tone", []string{"nail_care_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f485\U0001f3fd", "nail polish: Medium Skin Tone", []string{"nail_care_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f4db", "name badge", []string{"name_badge"}, "6.0", false}, {"\U0001f1f3\U0001f1e6", "flag: Namibia", []string{"namibia"}, "6.0", false}, {"\U0001f3de\ufe0f", "national park", []string{"national_park"}, "7.0", false},
-
@@ -1031,6 +1877,8 @@ {"\U0001f454", "necktie", []string{"necktie"}, "6.0", false},{"\u274e", "cross mark button", []string{"negative_squared_cross_mark"}, "6.0", false}, {"\U0001f1f3\U0001f1f5", "flag: Nepal", []string{"nepal"}, "6.0", false}, {"\U0001f913", "nerd face", []string{"nerd_face"}, "8.0", false}, {"\U0001faba", "nest with eggs", []string{"nest_with_eggs"}, "14.0", false}, {"\U0001fa86", "nesting dolls", []string{"nesting_dolls"}, "13.0", false}, {"\U0001f1f3\U0001f1f1", "flag: Netherlands", []string{"netherlands"}, "6.0", false}, {"\U0001f610", "neutral face", []string{"neutral_face"}, "6.0", false}, {"\U0001f195", "NEW button", []string{"new"}, "6.0", false},
-
@@ -1047,14 +1895,35 @@ {"\U0001f1f3\U0001f1ea", "flag: Niger", []string{"niger"}, "6.0", false},{"\U0001f1f3\U0001f1ec", "flag: Nigeria", []string{"nigeria"}, "6.0", false}, {"\U0001f303", "night with stars", []string{"night_with_stars"}, "6.0", false}, {"9\ufe0f\u20e3", "keycap: 9", []string{"nine"}, "", false}, {"\U0001f977", "ninja", []string{"ninja"}, "13.0", true}, {"\U0001f977\U0001f3ff", "ninja: Dark Skin Tone", []string{"ninja_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f977\U0001f3fb", "ninja: Light Skin Tone", []string{"ninja_Light_Skin_Tone"}, "12.0", false}, {"\U0001f977\U0001f3fe", "ninja: Medium-Dark Skin Tone", []string{"ninja_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f977\U0001f3fc", "ninja: Medium-Light Skin Tone", []string{"ninja_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f977\U0001f3fd", "ninja: Medium Skin Tone", []string{"ninja_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1f3\U0001f1fa", "flag: Niue", []string{"niue"}, "6.0", false}, {"\U0001f515", "bell with slash", []string{"no_bell"}, "6.0", false}, {"\U0001f6b3", "no bicycles", []string{"no_bicycles"}, "6.0", false}, {"\u26d4", "no entry", []string{"no_entry"}, "5.2", false}, {"\U0001f6ab", "prohibited", []string{"no_entry_sign"}, "6.0", false}, {"\U0001f645", "person gesturing NO", []string{"no_good"}, "6.0", true}, {"\U0001f645\U0001f3ff", "person gesturing NO: Dark Skin Tone", []string{"no_good_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fb", "person gesturing NO: Light Skin Tone", []string{"no_good_Light_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fe", "person gesturing NO: Medium-Dark Skin Tone", []string{"no_good_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fc", "person gesturing NO: Medium-Light Skin Tone", []string{"no_good_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fd", "person gesturing NO: Medium Skin Tone", []string{"no_good_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f645\u200d\u2642\ufe0f", "man gesturing NO", []string{"no_good_man", "ng_man"}, "6.0", true}, {"\U0001f645\U0001f3ff\u200d\u2642\ufe0f", "man gesturing NO: Dark Skin Tone", []string{"no_good_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fb\u200d\u2642\ufe0f", "man gesturing NO: Light Skin Tone", []string{"no_good_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fe\u200d\u2642\ufe0f", "man gesturing NO: Medium-Dark Skin Tone", []string{"no_good_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fc\u200d\u2642\ufe0f", "man gesturing NO: Medium-Light Skin Tone", []string{"no_good_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fd\u200d\u2642\ufe0f", "man gesturing NO: Medium Skin Tone", []string{"no_good_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f645\u200d\u2640\ufe0f", "woman gesturing NO", []string{"no_good_woman", "ng_woman"}, "11.0", true}, {"\U0001f645\U0001f3ff\u200d\u2640\ufe0f", "woman gesturing NO: Dark Skin Tone", []string{"no_good_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fb\u200d\u2640\ufe0f", "woman gesturing NO: Light Skin Tone", []string{"no_good_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fe\u200d\u2640\ufe0f", "woman gesturing NO: Medium-Dark Skin Tone", []string{"no_good_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fc\u200d\u2640\ufe0f", "woman gesturing NO: Medium-Light Skin Tone", []string{"no_good_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fd\u200d\u2640\ufe0f", "woman gesturing NO: Medium Skin Tone", []string{"no_good_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f4f5", "no mobile phones", []string{"no_mobile_phones"}, "6.0", false}, {"\U0001f636", "face without mouth", []string{"no_mouth"}, "6.0", false}, {"\U0001f6b7", "no pedestrians", []string{"no_pedestrians"}, "6.0", false},
-
@@ -1065,6 +1934,11 @@ {"\U0001f1f0\U0001f1f5", "flag: North Korea", []string{"north_korea"}, "6.0", false},{"\U0001f1f2\U0001f1f5", "flag: Northern Mariana Islands", []string{"northern_mariana_islands"}, "6.0", false}, {"\U0001f1f3\U0001f1f4", "flag: Norway", []string{"norway"}, "6.0", false}, {"\U0001f443", "nose", []string{"nose"}, "6.0", true}, {"\U0001f443\U0001f3ff", "nose: Dark Skin Tone", []string{"nose_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f443\U0001f3fb", "nose: Light Skin Tone", []string{"nose_Light_Skin_Tone"}, "12.0", false}, {"\U0001f443\U0001f3fe", "nose: Medium-Dark Skin Tone", []string{"nose_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f443\U0001f3fc", "nose: Medium-Light Skin Tone", []string{"nose_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f443\U0001f3fd", "nose: Medium Skin Tone", []string{"nose_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f4d3", "notebook", []string{"notebook"}, "6.0", false}, {"\U0001f4d4", "notebook with decorative cover", []string{"notebook_with_decorative_cover"}, "6.0", false}, {"\U0001f3b6", "musical notes", []string{"notes"}, "6.0", false},
-
@@ -1076,16 +1950,57 @@ {"\U0001f419", "octopus", []string{"octopus"}, "6.0", false},{"\U0001f362", "oden", []string{"oden"}, "6.0", false}, {"\U0001f3e2", "office building", []string{"office"}, "6.0", false}, {"\U0001f9d1\u200d\U0001f4bc", "office worker", []string{"office_worker"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f4bc", "office worker: Dark Skin Tone", []string{"office_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f4bc", "office worker: Light Skin Tone", []string{"office_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f4bc", "office worker: Medium-Dark Skin Tone", []string{"office_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f4bc", "office worker: Medium-Light Skin Tone", []string{"office_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f4bc", "office worker: Medium Skin Tone", []string{"office_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6e2\ufe0f", "oil drum", []string{"oil_drum"}, "7.0", false}, {"\U0001f197", "OK button", []string{"ok"}, "6.0", false}, {"\U0001f44c", "OK hand", []string{"ok_hand"}, "6.0", true}, {"\U0001f44c\U0001f3ff", "OK hand: Dark Skin Tone", []string{"ok_hand_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44c\U0001f3fb", "OK hand: Light Skin Tone", []string{"ok_hand_Light_Skin_Tone"}, "12.0", false}, {"\U0001f44c\U0001f3fe", "OK hand: Medium-Dark Skin Tone", []string{"ok_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44c\U0001f3fc", "OK hand: Medium-Light Skin Tone", []string{"ok_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f44c\U0001f3fd", "OK hand: Medium Skin Tone", []string{"ok_hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f646\u200d\u2642\ufe0f", "man gesturing OK", []string{"ok_man"}, "6.0", true}, {"\U0001f646\U0001f3ff\u200d\u2642\ufe0f", "man gesturing OK: Dark Skin Tone", []string{"ok_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fb\u200d\u2642\ufe0f", "man gesturing OK: Light Skin Tone", []string{"ok_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fe\u200d\u2642\ufe0f", "man gesturing OK: Medium-Dark Skin Tone", []string{"ok_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fc\u200d\u2642\ufe0f", "man gesturing OK: Medium-Light Skin Tone", []string{"ok_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fd\u200d\u2642\ufe0f", "man gesturing OK: Medium Skin Tone", []string{"ok_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f646", "person gesturing OK", []string{"ok_person"}, "6.0", true}, {"\U0001f646\U0001f3ff", "person gesturing OK: Dark Skin Tone", []string{"ok_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fb", "person gesturing OK: Light Skin Tone", []string{"ok_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fe", "person gesturing OK: Medium-Dark Skin Tone", []string{"ok_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fc", "person gesturing OK: Medium-Light Skin Tone", []string{"ok_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fd", "person gesturing OK: Medium Skin Tone", []string{"ok_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f646\u200d\u2640\ufe0f", "woman gesturing OK", []string{"ok_woman"}, "11.0", true}, {"\U0001f646\U0001f3ff\u200d\u2640\ufe0f", "woman gesturing OK: Dark Skin Tone", []string{"ok_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fb\u200d\u2640\ufe0f", "woman gesturing OK: Light Skin Tone", []string{"ok_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fe\u200d\u2640\ufe0f", "woman gesturing OK: Medium-Dark Skin Tone", []string{"ok_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fc\u200d\u2640\ufe0f", "woman gesturing OK: Medium-Light Skin Tone", []string{"ok_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fd\u200d\u2640\ufe0f", "woman gesturing OK: Medium Skin Tone", []string{"ok_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f5dd\ufe0f", "old key", []string{"old_key"}, "7.0", false}, {"\U0001f9d3", "older person", []string{"older_adult"}, "11.0", true}, {"\U0001f9d3\U0001f3ff", "older person: Dark Skin Tone", []string{"older_adult_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d3\U0001f3fb", "older person: Light Skin Tone", []string{"older_adult_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d3\U0001f3fe", "older person: Medium-Dark Skin Tone", []string{"older_adult_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d3\U0001f3fc", "older person: Medium-Light Skin Tone", []string{"older_adult_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d3\U0001f3fd", "older person: Medium Skin Tone", []string{"older_adult_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f474", "old man", []string{"older_man"}, "6.0", true}, {"\U0001f474\U0001f3ff", "old man: Dark Skin Tone", []string{"older_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f474\U0001f3fb", "old man: Light Skin Tone", []string{"older_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f474\U0001f3fe", "old man: Medium-Dark Skin Tone", []string{"older_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f474\U0001f3fc", "old man: Medium-Light Skin Tone", []string{"older_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f474\U0001f3fd", "old man: Medium Skin Tone", []string{"older_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f475", "old woman", []string{"older_woman"}, "6.0", true}, {"\U0001f475\U0001f3ff", "old woman: Dark Skin Tone", []string{"older_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f475\U0001f3fb", "old woman: Light Skin Tone", []string{"older_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f475\U0001f3fe", "old woman: Medium-Dark Skin Tone", []string{"older_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f475\U0001f3fc", "old woman: Medium-Light Skin Tone", []string{"older_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f475\U0001f3fd", "old woman: Medium Skin Tone", []string{"older_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001fad2", "olive", []string{"olive"}, "13.0", false}, {"\U0001f549\ufe0f", "om", []string{"om"}, "7.0", false}, {"\U0001f1f4\U0001f1f2", "flag: Oman", []string{"oman"}, "6.0", false}, {"\U0001f51b", "ON! arrow", []string{"on"}, "6.0", false},
-
@@ -1098,6 +2013,11 @@ {"\U0001fa71", "one-piece swimsuit", []string{"one_piece_swimsuit"}, "12.0", false},{"\U0001f9c5", "onion", []string{"onion"}, "12.0", false}, {"\U0001f4c2", "open file folder", []string{"open_file_folder"}, "6.0", false}, {"\U0001f450", "open hands", []string{"open_hands"}, "6.0", true}, {"\U0001f450\U0001f3ff", "open hands: Dark Skin Tone", []string{"open_hands_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f450\U0001f3fb", "open hands: Light Skin Tone", []string{"open_hands_Light_Skin_Tone"}, "12.0", false}, {"\U0001f450\U0001f3fe", "open hands: Medium-Dark Skin Tone", []string{"open_hands_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f450\U0001f3fc", "open hands: Medium-Light Skin Tone", []string{"open_hands_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f450\U0001f3fd", "open hands: Medium Skin Tone", []string{"open_hands_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f62e", "face with open mouth", []string{"open_mouth"}, "6.1", false}, {"\u2602\ufe0f", "umbrella", []string{"open_umbrella"}, "", false}, {"\u26ce", "Ophiuchus", []string{"ophiuchus"}, "6.0", false},
-
@@ -1120,8 +2040,25 @@ {"\U0001f58c\ufe0f", "paintbrush", []string{"paintbrush"}, "7.0", false},{"\U0001f1f5\U0001f1f0", "flag: Pakistan", []string{"pakistan"}, "6.0", false}, {"\U0001f1f5\U0001f1fc", "flag: Palau", []string{"palau"}, "6.0", false}, {"\U0001f1f5\U0001f1f8", "flag: Palestinian Territories", []string{"palestinian_territories"}, "6.0", false}, {"\U0001faf3", "palm down hand", []string{"palm_down_hand"}, "14.0", true}, {"\U0001faf3\U0001f3ff", "palm down hand: Dark Skin Tone", []string{"palm_down_hand_Dark_Skin_Tone"}, "12.0", false}, {"\U0001faf3\U0001f3fb", "palm down hand: Light Skin Tone", []string{"palm_down_hand_Light_Skin_Tone"}, "12.0", false}, {"\U0001faf3\U0001f3fe", "palm down hand: Medium-Dark Skin Tone", []string{"palm_down_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001faf3\U0001f3fc", "palm down hand: Medium-Light Skin Tone", []string{"palm_down_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001faf3\U0001f3fd", "palm down hand: Medium Skin Tone", []string{"palm_down_hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f334", "palm tree", []string{"palm_tree"}, "6.0", false}, {"\U0001faf4", "palm up hand", []string{"palm_up_hand"}, "14.0", true}, {"\U0001faf4\U0001f3ff", "palm up hand: Dark Skin Tone", []string{"palm_up_hand_Dark_Skin_Tone"}, "12.0", false}, {"\U0001faf4\U0001f3fb", "palm up hand: Light Skin Tone", []string{"palm_up_hand_Light_Skin_Tone"}, "12.0", false}, {"\U0001faf4\U0001f3fe", "palm up hand: Medium-Dark Skin Tone", []string{"palm_up_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001faf4\U0001f3fc", "palm up hand: Medium-Light Skin Tone", []string{"palm_up_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001faf4\U0001f3fd", "palm up hand: Medium Skin Tone", []string{"palm_up_hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f932", "palms up together", []string{"palms_up_together"}, "11.0", true}, {"\U0001f932\U0001f3ff", "palms up together: Dark Skin Tone", []string{"palms_up_together_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f932\U0001f3fb", "palms up together: Light Skin Tone", []string{"palms_up_together_Light_Skin_Tone"}, "12.0", false}, {"\U0001f932\U0001f3fe", "palms up together: Medium-Dark Skin Tone", []string{"palms_up_together_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f932\U0001f3fc", "palms up together: Medium-Light Skin Tone", []string{"palms_up_together_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f932\U0001f3fd", "palms up together: Medium Skin Tone", []string{"palms_up_together_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1f5\U0001f1e6", "flag: Panama", []string{"panama"}, "6.0", false}, {"\U0001f95e", "pancakes", []string{"pancakes"}, "9.0", false}, {"\U0001f43c", "panda", []string{"panda_face"}, "6.0", false},
-
@@ -1148,52 +2085,177 @@ {"\U0001f58a\ufe0f", "pen", []string{"pen"}, "7.0", false},{"\u270f\ufe0f", "pencil", []string{"pencil2"}, "", false}, {"\U0001f427", "penguin", []string{"penguin"}, "6.0", false}, {"\U0001f614", "pensive face", []string{"pensive"}, "6.0", false}, {"\U0001f9d1\u200d\U0001f91d\u200d\U0001f9d1", "people holding hands", []string{"people_holding_hands"}, "12.0", true}, {"\U0001f9d1\u200d\U0001f91d\u200d\U0001f9d1", "people holding hands", []string{"people_holding_hands"}, "12.0", false}, {"\U0001fac2", "people hugging", []string{"people_hugging"}, "13.0", false}, {"\U0001f3ad", "performing arts", []string{"performing_arts"}, "6.0", false}, {"\U0001f623", "persevering face", []string{"persevere"}, "6.0", false}, {"\U0001f9d1\u200d\U0001f9b2", "person: bald", []string{"person_bald"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f9b2", "person: bald: Dark Skin Tone", []string{"person_bald_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f9b2", "person: bald: Light Skin Tone", []string{"person_bald_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f9b2", "person: bald: Medium-Dark Skin Tone", []string{"person_bald_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f9b2", "person: bald: Medium-Light Skin Tone", []string{"person_bald_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f9b2", "person: bald: Medium Skin Tone", []string{"person_bald_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\u200d\U0001f9b1", "person: curly hair", []string{"person_curly_hair"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f9b1", "person: curly hair: Dark Skin Tone", []string{"person_curly_hair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f9b1", "person: curly hair: Light Skin Tone", []string{"person_curly_hair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f9b1", "person: curly hair: Medium-Dark Skin Tone", []string{"person_curly_hair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f9b1", "person: curly hair: Medium-Light Skin Tone", []string{"person_curly_hair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f9b1", "person: curly hair: Medium Skin Tone", []string{"person_curly_hair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\u200d\U0001f37c", "person feeding baby", []string{"person_feeding_baby"}, "13.0", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f37c", "person feeding baby: Dark Skin Tone", []string{"person_feeding_baby_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f37c", "person feeding baby: Light Skin Tone", []string{"person_feeding_baby_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f37c", "person feeding baby: Medium-Dark Skin Tone", []string{"person_feeding_baby_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f37c", "person feeding baby: Medium-Light Skin Tone", []string{"person_feeding_baby_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f37c", "person feeding baby: Medium Skin Tone", []string{"person_feeding_baby_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f93a", "person fencing", []string{"person_fencing"}, "9.0", false}, {"\U0001f9d1\u200d\U0001f9bd", "person in manual wheelchair", []string{"person_in_manual_wheelchair"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f9bd", "person in manual wheelchair: Dark Skin Tone", []string{"person_in_manual_wheelchair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f9bd", "person in manual wheelchair: Light Skin Tone", []string{"person_in_manual_wheelchair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f9bd", "person in manual wheelchair: Medium-Dark Skin Tone", []string{"person_in_manual_wheelchair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f9bd", "person in manual wheelchair: Medium-Light Skin Tone", []string{"person_in_manual_wheelchair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f9bd", "person in manual wheelchair: Medium Skin Tone", []string{"person_in_manual_wheelchair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\u200d\U0001f9bc", "person in motorized wheelchair", []string{"person_in_motorized_wheelchair"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f9bc", "person in motorized wheelchair: Dark Skin Tone", []string{"person_in_motorized_wheelchair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f9bc", "person in motorized wheelchair: Light Skin Tone", []string{"person_in_motorized_wheelchair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f9bc", "person in motorized wheelchair: Medium-Dark Skin Tone", []string{"person_in_motorized_wheelchair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f9bc", "person in motorized wheelchair: Medium-Light Skin Tone", []string{"person_in_motorized_wheelchair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f9bc", "person in motorized wheelchair: Medium Skin Tone", []string{"person_in_motorized_wheelchair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f935", "person in tuxedo", []string{"person_in_tuxedo"}, "9.0", true}, {"\U0001f935\U0001f3ff", "person in tuxedo: Dark Skin Tone", []string{"person_in_tuxedo_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fb", "person in tuxedo: Light Skin Tone", []string{"person_in_tuxedo_Light_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fe", "person in tuxedo: Medium-Dark Skin Tone", []string{"person_in_tuxedo_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fc", "person in tuxedo: Medium-Light Skin Tone", []string{"person_in_tuxedo_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fd", "person in tuxedo: Medium Skin Tone", []string{"person_in_tuxedo_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\u200d\U0001f9b0", "person: red hair", []string{"person_red_hair"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f9b0", "person: red hair: Dark Skin Tone", []string{"person_red_hair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f9b0", "person: red hair: Light Skin Tone", []string{"person_red_hair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f9b0", "person: red hair: Medium-Dark Skin Tone", []string{"person_red_hair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f9b0", "person: red hair: Medium-Light Skin Tone", []string{"person_red_hair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f9b0", "person: red hair: Medium Skin Tone", []string{"person_red_hair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\u200d\U0001f9b3", "person: white hair", []string{"person_white_hair"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f9b3", "person: white hair: Dark Skin Tone", []string{"person_white_hair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f9b3", "person: white hair: Light Skin Tone", []string{"person_white_hair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f9b3", "person: white hair: Medium-Dark Skin Tone", []string{"person_white_hair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f9b3", "person: white hair: Medium-Light Skin Tone", []string{"person_white_hair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f9b3", "person: white hair: Medium Skin Tone", []string{"person_white_hair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001fac5", "person with crown", []string{"person_with_crown"}, "14.0", true}, {"\U0001fac5\U0001f3ff", "person with crown: Dark Skin Tone", []string{"person_with_crown_Dark_Skin_Tone"}, "12.0", false}, {"\U0001fac5\U0001f3fb", "person with crown: Light Skin Tone", []string{"person_with_crown_Light_Skin_Tone"}, "12.0", false}, {"\U0001fac5\U0001f3fe", "person with crown: Medium-Dark Skin Tone", []string{"person_with_crown_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001fac5\U0001f3fc", "person with crown: Medium-Light Skin Tone", []string{"person_with_crown_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001fac5\U0001f3fd", "person with crown: Medium Skin Tone", []string{"person_with_crown_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\u200d\U0001f9af", "person with white cane", []string{"person_with_probing_cane"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f9af", "person with white cane: Dark Skin Tone", []string{"person_with_probing_cane_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f9af", "person with white cane: Light Skin Tone", []string{"person_with_probing_cane_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f9af", "person with white cane: Medium-Dark Skin Tone", []string{"person_with_probing_cane_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f9af", "person with white cane: Medium-Light Skin Tone", []string{"person_with_probing_cane_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f9af", "person with white cane: Medium Skin Tone", []string{"person_with_probing_cane_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f473", "person wearing turban", []string{"person_with_turban"}, "6.0", true}, {"\U0001f473\U0001f3ff", "person wearing turban: Dark Skin Tone", []string{"person_with_turban_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fb", "person wearing turban: Light Skin Tone", []string{"person_with_turban_Light_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fe", "person wearing turban: Medium-Dark Skin Tone", []string{"person_with_turban_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fc", "person wearing turban: Medium-Light Skin Tone", []string{"person_with_turban_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fd", "person wearing turban: Medium Skin Tone", []string{"person_with_turban_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f470", "person with veil", []string{"person_with_veil"}, "6.0", true}, {"\U0001f470\U0001f3ff", "person with veil: Dark Skin Tone", []string{"person_with_veil_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fb", "person with veil: Light Skin Tone", []string{"person_with_veil_Light_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fe", "person with veil: Medium-Dark Skin Tone", []string{"person_with_veil_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fc", "person with veil: Medium-Light Skin Tone", []string{"person_with_veil_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fd", "person with veil: Medium Skin Tone", []string{"person_with_veil_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1f5\U0001f1ea", "flag: Peru", []string{"peru"}, "6.0", false}, {"\U0001f9eb", "petri dish", []string{"petri_dish"}, "11.0", false}, {"\U0001f1f5\U0001f1ed", "flag: Philippines", []string{"philippines"}, "6.0", false}, {"\u260e\ufe0f", "telephone", []string{"phone", "telephone"}, "", false}, {"\u26cf\ufe0f", "pick", []string{"pick"}, "5.2", false}, {"\U0001f6fb", "pickup truck", []string{"pickup_truck"}, "13.0", false}, {"\U0001f967", "pie", []string{"pie"}, "11.0", false}, {"\U0001f437", "pig face", []string{"pig"}, "6.0", false}, {"\U0001f416", "pig", []string{"pig2"}, "6.0", false}, {"\U0001f43d", "pig nose", []string{"pig_nose"}, "6.0", false}, {"\U0001f48a", "pill", []string{"pill"}, "6.0", false}, {"\U0001f9d1\u200d\u2708\ufe0f", "pilot", []string{"pilot"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\u2708\ufe0f", "pilot: Dark Skin Tone", []string{"pilot_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\u2708\ufe0f", "pilot: Light Skin Tone", []string{"pilot_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\u2708\ufe0f", "pilot: Medium-Dark Skin Tone", []string{"pilot_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\u2708\ufe0f", "pilot: Medium-Light Skin Tone", []string{"pilot_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\u2708\ufe0f", "pilot: Medium Skin Tone", []string{"pilot_Medium_Skin_Tone"}, "12.0", false}, {"\U0001fa85", "piรฑata", []string{"pinata"}, "13.0", false}, {"\U0001f90c", "pinched fingers", []string{"pinched_fingers"}, "13.0", true}, {"\U0001f90c\U0001f3ff", "pinched fingers: Dark Skin Tone", []string{"pinched_fingers_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f90c\U0001f3fb", "pinched fingers: Light Skin Tone", []string{"pinched_fingers_Light_Skin_Tone"}, "12.0", false}, {"\U0001f90c\U0001f3fe", "pinched fingers: Medium-Dark Skin Tone", []string{"pinched_fingers_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f90c\U0001f3fc", "pinched fingers: Medium-Light Skin Tone", []string{"pinched_fingers_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f90c\U0001f3fd", "pinched fingers: Medium Skin Tone", []string{"pinched_fingers_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f90f", "pinching hand", []string{"pinching_hand"}, "12.0", true}, {"\U0001f90f\U0001f3ff", "pinching hand: Dark Skin Tone", []string{"pinching_hand_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f90f\U0001f3fb", "pinching hand: Light Skin Tone", []string{"pinching_hand_Light_Skin_Tone"}, "12.0", false}, {"\U0001f90f\U0001f3fe", "pinching hand: Medium-Dark Skin Tone", []string{"pinching_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f90f\U0001f3fc", "pinching hand: Medium-Light Skin Tone", []string{"pinching_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f90f\U0001f3fd", "pinching hand: Medium Skin Tone", []string{"pinching_hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f34d", "pineapple", []string{"pineapple"}, "6.0", false}, {"\U0001f3d3", "ping pong", []string{"ping_pong"}, "8.0", false}, {"\U0001f3f4\u200d\u2620\ufe0f", "pirate flag", []string{"pirate_flag"}, "11.0", false}, {"\u2653", "Pisces", []string{"pisces"}, "", false}, {"\U0001f1f5\U0001f1f3", "flag: Pitcairn Islands", []string{"pitcairn_islands"}, "6.0", false}, {"\U0001f355", "pizza", []string{"pizza"}, "6.0", false}, {"\U0001faa7", "placard", []string{"placard"}, "13.0", false}, {"\U0001f6d0", "place of worship", []string{"place_of_worship"}, "8.0", false}, {"\U0001f37d\ufe0f", "fork and knife with plate", []string{"plate_with_cutlery"}, "7.0", false}, {"\u23ef\ufe0f", "play or pause button", []string{"play_or_pause_button"}, "6.0", false}, {"\U0001f6dd", "playground slide", []string{"playground_slide"}, "14.0", false}, {"\U0001f97a", "pleading face", []string{"pleading_face"}, "11.0", false}, {"\U0001faa0", "plunger", []string{"plunger"}, "13.0", false}, {"\U0001f447", "backhand index pointing down", []string{"point_down"}, "6.0", true}, {"\U0001f447\U0001f3ff", "backhand index pointing down: Dark Skin Tone", []string{"point_down_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f447\U0001f3fb", "backhand index pointing down: Light Skin Tone", []string{"point_down_Light_Skin_Tone"}, "12.0", false}, {"\U0001f447\U0001f3fe", "backhand index pointing down: Medium-Dark Skin Tone", []string{"point_down_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f447\U0001f3fc", "backhand index pointing down: Medium-Light Skin Tone", []string{"point_down_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f447\U0001f3fd", "backhand index pointing down: Medium Skin Tone", []string{"point_down_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f448", "backhand index pointing left", []string{"point_left"}, "6.0", true}, {"\U0001f448\U0001f3ff", "backhand index pointing left: Dark Skin Tone", []string{"point_left_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f448\U0001f3fb", "backhand index pointing left: Light Skin Tone", []string{"point_left_Light_Skin_Tone"}, "12.0", false}, {"\U0001f448\U0001f3fe", "backhand index pointing left: Medium-Dark Skin Tone", []string{"point_left_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f448\U0001f3fc", "backhand index pointing left: Medium-Light Skin Tone", []string{"point_left_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f448\U0001f3fd", "backhand index pointing left: Medium Skin Tone", []string{"point_left_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f449", "backhand index pointing right", []string{"point_right"}, "6.0", true}, {"\U0001f449\U0001f3ff", "backhand index pointing right: Dark Skin Tone", []string{"point_right_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f449\U0001f3fb", "backhand index pointing right: Light Skin Tone", []string{"point_right_Light_Skin_Tone"}, "12.0", false}, {"\U0001f449\U0001f3fe", "backhand index pointing right: Medium-Dark Skin Tone", []string{"point_right_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f449\U0001f3fc", "backhand index pointing right: Medium-Light Skin Tone", []string{"point_right_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f449\U0001f3fd", "backhand index pointing right: Medium Skin Tone", []string{"point_right_Medium_Skin_Tone"}, "12.0", false}, {"\u261d\ufe0f", "index pointing up", []string{"point_up"}, "", true}, {"\U0001f446", "backhand index pointing up", []string{"point_up_2"}, "6.0", true}, {"\U0001f446\U0001f3ff", "backhand index pointing up: Dark Skin Tone", []string{"point_up_2_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f446\U0001f3fb", "backhand index pointing up: Light Skin Tone", []string{"point_up_2_Light_Skin_Tone"}, "12.0", false}, {"\U0001f446\U0001f3fe", "backhand index pointing up: Medium-Dark Skin Tone", []string{"point_up_2_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f446\U0001f3fc", "backhand index pointing up: Medium-Light Skin Tone", []string{"point_up_2_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f446\U0001f3fd", "backhand index pointing up: Medium Skin Tone", []string{"point_up_2_Medium_Skin_Tone"}, "12.0", false}, {"\u261d\U0001f3ff\ufe0f", "index pointing up: Dark Skin Tone", []string{"point_up_Dark_Skin_Tone"}, "12.0", false}, {"\u261d\U0001f3fb\ufe0f", "index pointing up: Light Skin Tone", []string{"point_up_Light_Skin_Tone"}, "12.0", false}, {"\u261d\U0001f3fe\ufe0f", "index pointing up: Medium-Dark Skin Tone", []string{"point_up_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u261d\U0001f3fc\ufe0f", "index pointing up: Medium-Light Skin Tone", []string{"point_up_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u261d\U0001f3fd\ufe0f", "index pointing up: Medium Skin Tone", []string{"point_up_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1f5\U0001f1f1", "flag: Poland", []string{"poland"}, "6.0", false}, {"\U0001f43b\u200d\u2744\ufe0f", "polar bear", []string{"polar_bear"}, "13.0", false}, {"\U0001f693", "police car", []string{"police_car"}, "6.0", false}, {"\U0001f46e", "police officer", []string{"police_officer", "cop"}, "6.0", true}, {"\U0001f46e\U0001f3ff", "police officer: Dark Skin Tone", []string{"police_officer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fb", "police officer: Light Skin Tone", []string{"police_officer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fe", "police officer: Medium-Dark Skin Tone", []string{"police_officer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fc", "police officer: Medium-Light Skin Tone", []string{"police_officer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fd", "police officer: Medium Skin Tone", []string{"police_officer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f46e\u200d\u2642\ufe0f", "man police officer", []string{"policeman"}, "11.0", true}, {"\U0001f46e\U0001f3ff\u200d\u2642\ufe0f", "man police officer: Dark Skin Tone", []string{"policeman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fb\u200d\u2642\ufe0f", "man police officer: Light Skin Tone", []string{"policeman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fe\u200d\u2642\ufe0f", "man police officer: Medium-Dark Skin Tone", []string{"policeman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fc\u200d\u2642\ufe0f", "man police officer: Medium-Light Skin Tone", []string{"policeman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fd\u200d\u2642\ufe0f", "man police officer: Medium Skin Tone", []string{"policeman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f46e\u200d\u2640\ufe0f", "woman police officer", []string{"policewoman"}, "6.0", true}, {"\U0001f46e\U0001f3ff\u200d\u2640\ufe0f", "woman police officer: Dark Skin Tone", []string{"policewoman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fb\u200d\u2640\ufe0f", "woman police officer: Light Skin Tone", []string{"policewoman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fe\u200d\u2640\ufe0f", "woman police officer: Medium-Dark Skin Tone", []string{"policewoman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fc\u200d\u2640\ufe0f", "woman police officer: Medium-Light Skin Tone", []string{"policewoman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fd\u200d\u2640\ufe0f", "woman police officer: Medium Skin Tone", []string{"policewoman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f429", "poodle", []string{"poodle"}, "6.0", false}, {"\U0001f37f", "popcorn", []string{"popcorn"}, "8.0", false}, {"\U0001f1f5\U0001f1f9", "flag: Portugal", []string{"portugal"}, "6.0", false},
-
@@ -1202,20 +2264,69 @@ {"\U0001f4ef", "postal horn", []string{"postal_horn"}, "6.0", false},{"\U0001f4ee", "postbox", []string{"postbox"}, "6.0", false}, {"\U0001f6b0", "potable water", []string{"potable_water"}, "6.0", false}, {"\U0001f954", "potato", []string{"potato"}, "9.0", false}, {"\U0001fab4", "potted plant", []string{"potted_plant"}, "13.0", false}, {"\U0001f45d", "clutch bag", []string{"pouch"}, "6.0", false}, {"\U0001f357", "poultry leg", []string{"poultry_leg"}, "6.0", false}, {"\U0001f4b7", "pound banknote", []string{"pound"}, "6.0", false}, {"\U0001fad7", "pouring liquid", []string{"pouring_liquid"}, "14.0", false}, {"\U0001f63e", "pouting cat", []string{"pouting_cat"}, "6.0", false}, {"\U0001f64e", "person pouting", []string{"pouting_face"}, "6.0", true}, {"\U0001f64e\U0001f3ff", "person pouting: Dark Skin Tone", []string{"pouting_face_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fb", "person pouting: Light Skin Tone", []string{"pouting_face_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fe", "person pouting: Medium-Dark Skin Tone", []string{"pouting_face_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fc", "person pouting: Medium-Light Skin Tone", []string{"pouting_face_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fd", "person pouting: Medium Skin Tone", []string{"pouting_face_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64e\u200d\u2642\ufe0f", "man pouting", []string{"pouting_man"}, "6.0", true}, {"\U0001f64e\U0001f3ff\u200d\u2642\ufe0f", "man pouting: Dark Skin Tone", []string{"pouting_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fb\u200d\u2642\ufe0f", "man pouting: Light Skin Tone", []string{"pouting_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fe\u200d\u2642\ufe0f", "man pouting: Medium-Dark Skin Tone", []string{"pouting_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fc\u200d\u2642\ufe0f", "man pouting: Medium-Light Skin Tone", []string{"pouting_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fd\u200d\u2642\ufe0f", "man pouting: Medium Skin Tone", []string{"pouting_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64e\u200d\u2640\ufe0f", "woman pouting", []string{"pouting_woman"}, "11.0", true}, {"\U0001f64e\U0001f3ff\u200d\u2640\ufe0f", "woman pouting: Dark Skin Tone", []string{"pouting_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fb\u200d\u2640\ufe0f", "woman pouting: Light Skin Tone", []string{"pouting_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fe\u200d\u2640\ufe0f", "woman pouting: Medium-Dark Skin Tone", []string{"pouting_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fc\u200d\u2640\ufe0f", "woman pouting: Medium-Light Skin Tone", []string{"pouting_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fd\u200d\u2640\ufe0f", "woman pouting: Medium Skin Tone", []string{"pouting_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64f", "folded hands", []string{"pray"}, "6.0", true}, {"\U0001f64f\U0001f3ff", "folded hands: Dark Skin Tone", []string{"pray_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64f\U0001f3fb", "folded hands: Light Skin Tone", []string{"pray_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64f\U0001f3fe", "folded hands: Medium-Dark Skin Tone", []string{"pray_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64f\U0001f3fc", "folded hands: Medium-Light Skin Tone", []string{"pray_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64f\U0001f3fd", "folded hands: Medium Skin Tone", []string{"pray_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f4ff", "prayer beads", []string{"prayer_beads"}, "8.0", false}, {"\U0001fac3", "pregnant man", []string{"pregnant_man"}, "14.0", true}, {"\U0001fac3\U0001f3ff", "pregnant man: Dark Skin Tone", []string{"pregnant_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001fac3\U0001f3fb", "pregnant man: Light Skin Tone", []string{"pregnant_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001fac3\U0001f3fe", "pregnant man: Medium-Dark Skin Tone", []string{"pregnant_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001fac3\U0001f3fc", "pregnant man: Medium-Light Skin Tone", []string{"pregnant_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001fac3\U0001f3fd", "pregnant man: Medium Skin Tone", []string{"pregnant_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001fac4", "pregnant person", []string{"pregnant_person"}, "14.0", true}, {"\U0001fac4\U0001f3ff", "pregnant person: Dark Skin Tone", []string{"pregnant_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001fac4\U0001f3fb", "pregnant person: Light Skin Tone", []string{"pregnant_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001fac4\U0001f3fe", "pregnant person: Medium-Dark Skin Tone", []string{"pregnant_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001fac4\U0001f3fc", "pregnant person: Medium-Light Skin Tone", []string{"pregnant_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001fac4\U0001f3fd", "pregnant person: Medium Skin Tone", []string{"pregnant_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f930", "pregnant woman", []string{"pregnant_woman"}, "9.0", true}, {"\U0001f930\U0001f3ff", "pregnant woman: Dark Skin Tone", []string{"pregnant_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f930\U0001f3fb", "pregnant woman: Light Skin Tone", []string{"pregnant_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f930\U0001f3fe", "pregnant woman: Medium-Dark Skin Tone", []string{"pregnant_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f930\U0001f3fc", "pregnant woman: Medium-Light Skin Tone", []string{"pregnant_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f930\U0001f3fd", "pregnant woman: Medium Skin Tone", []string{"pregnant_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f968", "pretzel", []string{"pretzel"}, "11.0", false}, {"\u23ee\ufe0f", "last track button", []string{"previous_track_button"}, "6.0", false}, {"\U0001f934", "prince", []string{"prince"}, "9.0", true}, {"\U0001f934\U0001f3ff", "prince: Dark Skin Tone", []string{"prince_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f934\U0001f3fb", "prince: Light Skin Tone", []string{"prince_Light_Skin_Tone"}, "12.0", false}, {"\U0001f934\U0001f3fe", "prince: Medium-Dark Skin Tone", []string{"prince_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f934\U0001f3fc", "prince: Medium-Light Skin Tone", []string{"prince_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f934\U0001f3fd", "prince: Medium Skin Tone", []string{"prince_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f478", "princess", []string{"princess"}, "6.0", true}, {"\U0001f478\U0001f3ff", "princess: Dark Skin Tone", []string{"princess_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f478\U0001f3fb", "princess: Light Skin Tone", []string{"princess_Light_Skin_Tone"}, "12.0", false}, {"\U0001f478\U0001f3fe", "princess: Medium-Dark Skin Tone", []string{"princess_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f478\U0001f3fc", "princess: Medium-Light Skin Tone", []string{"princess_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f478\U0001f3fd", "princess: Medium Skin Tone", []string{"princess_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f5a8\ufe0f", "printer", []string{"printer"}, "7.0", false}, {"\U0001f9af", "white cane", []string{"probing_cane"}, "12.0", false}, {"\U0001f1f5\U0001f1f7", "flag: Puerto Rico", []string{"puerto_rico"}, "6.0", false},
-
@@ -1241,12 +2352,42 @@ {"\U0001f6e4\ufe0f", "railway track", []string{"railway_track"}, "7.0", false},{"\U0001f308", "rainbow", []string{"rainbow"}, "6.0", false}, {"\U0001f3f3\ufe0f\u200d\U0001f308", "rainbow flag", []string{"rainbow_flag"}, "6.0", false}, {"\U0001f91a", "raised back of hand", []string{"raised_back_of_hand"}, "9.0", true}, {"\U0001f91a\U0001f3ff", "raised back of hand: Dark Skin Tone", []string{"raised_back_of_hand_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91a\U0001f3fb", "raised back of hand: Light Skin Tone", []string{"raised_back_of_hand_Light_Skin_Tone"}, "12.0", false}, {"\U0001f91a\U0001f3fe", "raised back of hand: Medium-Dark Skin Tone", []string{"raised_back_of_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91a\U0001f3fc", "raised back of hand: Medium-Light Skin Tone", []string{"raised_back_of_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f91a\U0001f3fd", "raised back of hand: Medium Skin Tone", []string{"raised_back_of_hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f928", "face with raised eyebrow", []string{"raised_eyebrow"}, "11.0", false}, {"\U0001f590\ufe0f", "hand with fingers splayed", []string{"raised_hand_with_fingers_splayed"}, "7.0", true}, {"\U0001f590\U0001f3ff\ufe0f", "hand with fingers splayed: Dark Skin Tone", []string{"raised_hand_with_fingers_splayed_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f590\U0001f3fb\ufe0f", "hand with fingers splayed: Light Skin Tone", []string{"raised_hand_with_fingers_splayed_Light_Skin_Tone"}, "12.0", false}, {"\U0001f590\U0001f3fe\ufe0f", "hand with fingers splayed: Medium-Dark Skin Tone", []string{"raised_hand_with_fingers_splayed_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f590\U0001f3fc\ufe0f", "hand with fingers splayed: Medium-Light Skin Tone", []string{"raised_hand_with_fingers_splayed_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f590\U0001f3fd\ufe0f", "hand with fingers splayed: Medium Skin Tone", []string{"raised_hand_with_fingers_splayed_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64c", "raising hands", []string{"raised_hands"}, "6.0", true}, {"\U0001f64c\U0001f3ff", "raising hands: Dark Skin Tone", []string{"raised_hands_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64c\U0001f3fb", "raising hands: Light Skin Tone", []string{"raised_hands_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64c\U0001f3fe", "raising hands: Medium-Dark Skin Tone", []string{"raised_hands_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64c\U0001f3fc", "raising hands: Medium-Light Skin Tone", []string{"raised_hands_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64c\U0001f3fd", "raising hands: Medium Skin Tone", []string{"raised_hands_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64b", "person raising hand", []string{"raising_hand"}, "6.0", true}, {"\U0001f64b\U0001f3ff", "person raising hand: Dark Skin Tone", []string{"raising_hand_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fb", "person raising hand: Light Skin Tone", []string{"raising_hand_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fe", "person raising hand: Medium-Dark Skin Tone", []string{"raising_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fc", "person raising hand: Medium-Light Skin Tone", []string{"raising_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fd", "person raising hand: Medium Skin Tone", []string{"raising_hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64b\u200d\u2642\ufe0f", "man raising hand", []string{"raising_hand_man"}, "6.0", true}, {"\U0001f64b\U0001f3ff\u200d\u2642\ufe0f", "man raising hand: Dark Skin Tone", []string{"raising_hand_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fb\u200d\u2642\ufe0f", "man raising hand: Light Skin Tone", []string{"raising_hand_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fe\u200d\u2642\ufe0f", "man raising hand: Medium-Dark Skin Tone", []string{"raising_hand_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fc\u200d\u2642\ufe0f", "man raising hand: Medium-Light Skin Tone", []string{"raising_hand_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fd\u200d\u2642\ufe0f", "man raising hand: Medium Skin Tone", []string{"raising_hand_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64b\u200d\u2640\ufe0f", "woman raising hand", []string{"raising_hand_woman"}, "11.0", true}, {"\U0001f64b\U0001f3ff\u200d\u2640\ufe0f", "woman raising hand: Dark Skin Tone", []string{"raising_hand_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fb\u200d\u2640\ufe0f", "woman raising hand: Light Skin Tone", []string{"raising_hand_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fe\u200d\u2640\ufe0f", "woman raising hand: Medium-Dark Skin Tone", []string{"raising_hand_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fc\u200d\u2640\ufe0f", "woman raising hand: Medium-Light Skin Tone", []string{"raising_hand_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fd\u200d\u2640\ufe0f", "woman raising hand: Medium Skin Tone", []string{"raising_hand_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f40f", "ram", []string{"ram"}, "6.0", false}, {"\U0001f35c", "steaming bowl", []string{"ramen"}, "6.0", false}, {"\U0001f400", "rat", []string{"rat"}, "6.0", false},
-
@@ -1257,7 +2398,17 @@ {"\u267b\ufe0f", "recycling symbol", []string{"recycle"}, "3.2", false},{"\U0001f534", "red circle", []string{"red_circle"}, "6.0", false}, {"\U0001f9e7", "red envelope", []string{"red_envelope"}, "11.0", false}, {"\U0001f468\u200d\U0001f9b0", "man: red hair", []string{"red_haired_man"}, "11.0", true}, {"\U0001f468\U0001f3ff\u200d\U0001f9b0", "man: red hair: Dark Skin Tone", []string{"red_haired_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f9b0", "man: red hair: Light Skin Tone", []string{"red_haired_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f9b0", "man: red hair: Medium-Dark Skin Tone", []string{"red_haired_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f9b0", "man: red hair: Medium-Light Skin Tone", []string{"red_haired_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f9b0", "man: red hair: Medium Skin Tone", []string{"red_haired_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f9b0", "woman: red hair", []string{"red_haired_woman"}, "11.0", true}, {"\U0001f469\U0001f3ff\u200d\U0001f9b0", "woman: red hair: Dark Skin Tone", []string{"red_haired_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f9b0", "woman: red hair: Light Skin Tone", []string{"red_haired_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f9b0", "woman: red hair: Medium-Dark Skin Tone", []string{"red_haired_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f9b0", "woman: red hair: Medium-Light Skin Tone", []string{"red_haired_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f9b0", "woman: red hair: Medium Skin Tone", []string{"red_haired_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f7e5", "red square", []string{"red_square"}, "12.0", false}, {"\u00ae\ufe0f", "registered", []string{"registered"}, "", false}, {"\u263a\ufe0f", "smiling face", []string{"relaxed"}, "", false},
-
@@ -1277,14 +2428,23 @@ {"\U0001f359", "rice ball", []string{"rice_ball"}, "6.0", false},{"\U0001f358", "rice cracker", []string{"rice_cracker"}, "6.0", false}, {"\U0001f391", "moon viewing ceremony", []string{"rice_scene"}, "6.0", false}, {"\U0001f5ef\ufe0f", "right anger bubble", []string{"right_anger_bubble"}, "7.0", false}, {"\U0001faf1", "rightwards hand", []string{"rightwards_hand"}, "14.0", true}, {"\U0001faf1\U0001f3ff", "rightwards hand: Dark Skin Tone", []string{"rightwards_hand_Dark_Skin_Tone"}, "12.0", false}, {"\U0001faf1\U0001f3fb", "rightwards hand: Light Skin Tone", []string{"rightwards_hand_Light_Skin_Tone"}, "12.0", false}, {"\U0001faf1\U0001f3fe", "rightwards hand: Medium-Dark Skin Tone", []string{"rightwards_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001faf1\U0001f3fc", "rightwards hand: Medium-Light Skin Tone", []string{"rightwards_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001faf1\U0001f3fd", "rightwards hand: Medium Skin Tone", []string{"rightwards_hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f48d", "ring", []string{"ring"}, "6.0", false}, {"\U0001f6df", "ring buoy", []string{"ring_buoy"}, "14.0", false}, {"\U0001fa90", "ringed planet", []string{"ringed_planet"}, "12.0", false}, {"\U0001f916", "robot", []string{"robot"}, "8.0", false}, {"\U0001faa8", "rock", []string{"rock"}, "13.0", false}, {"\U0001f680", "rocket", []string{"rocket"}, "6.0", false}, {"\U0001f923", "rolling on the floor laughing", []string{"rofl"}, "9.0", false}, {"\U0001f644", "face with rolling eyes", []string{"roll_eyes"}, "8.0", false}, {"\U0001f9fb", "roll of paper", []string{"roll_of_paper"}, "11.0", false}, {"\U0001f3a2", "roller coaster", []string{"roller_coaster"}, "6.0", false}, {"\U0001f6fc", "roller skate", []string{"roller_skate"}, "13.0", false}, {"\U0001f1f7\U0001f1f4", "flag: Romania", []string{"romania"}, "6.0", false}, {"\U0001f413", "rooster", []string{"rooster"}, "6.0", false}, {"\U0001f339", "rose", []string{"rose"}, "6.0", false},
-
@@ -1292,14 +2452,44 @@ {"\U0001f3f5\ufe0f", "rosette", []string{"rosette"}, "7.0", false},{"\U0001f6a8", "police car light", []string{"rotating_light"}, "6.0", false}, {"\U0001f4cd", "round pushpin", []string{"round_pushpin"}, "6.0", false}, {"\U0001f6a3", "person rowing boat", []string{"rowboat"}, "6.0", true}, {"\U0001f6a3\U0001f3ff", "person rowing boat: Dark Skin Tone", []string{"rowboat_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fb", "person rowing boat: Light Skin Tone", []string{"rowboat_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fe", "person rowing boat: Medium-Dark Skin Tone", []string{"rowboat_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fc", "person rowing boat: Medium-Light Skin Tone", []string{"rowboat_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fd", "person rowing boat: Medium Skin Tone", []string{"rowboat_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\u200d\u2642\ufe0f", "man rowing boat", []string{"rowing_man"}, "11.0", true}, {"\U0001f6a3\U0001f3ff\u200d\u2642\ufe0f", "man rowing boat: Dark Skin Tone", []string{"rowing_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fb\u200d\u2642\ufe0f", "man rowing boat: Light Skin Tone", []string{"rowing_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fe\u200d\u2642\ufe0f", "man rowing boat: Medium-Dark Skin Tone", []string{"rowing_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fc\u200d\u2642\ufe0f", "man rowing boat: Medium-Light Skin Tone", []string{"rowing_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fd\u200d\u2642\ufe0f", "man rowing boat: Medium Skin Tone", []string{"rowing_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\u200d\u2640\ufe0f", "woman rowing boat", []string{"rowing_woman"}, "6.0", true}, {"\U0001f6a3\U0001f3ff\u200d\u2640\ufe0f", "woman rowing boat: Dark Skin Tone", []string{"rowing_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fb\u200d\u2640\ufe0f", "woman rowing boat: Light Skin Tone", []string{"rowing_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fe\u200d\u2640\ufe0f", "woman rowing boat: Medium-Dark Skin Tone", []string{"rowing_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fc\u200d\u2640\ufe0f", "woman rowing boat: Medium-Light Skin Tone", []string{"rowing_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fd\u200d\u2640\ufe0f", "woman rowing boat: Medium Skin Tone", []string{"rowing_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1f7\U0001f1fa", "flag: Russia", []string{"ru"}, "6.0", false}, {"\U0001f3c9", "rugby football", []string{"rugby_football"}, "6.0", false}, {"\U0001f3c3", "person running", []string{"runner", "running"}, "6.0", true}, {"\U0001f3c3\U0001f3ff", "person running: Dark Skin Tone", []string{"runner_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fb", "person running: Light Skin Tone", []string{"runner_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fe", "person running: Medium-Dark Skin Tone", []string{"runner_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fc", "person running: Medium-Light Skin Tone", []string{"runner_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fd", "person running: Medium Skin Tone", []string{"runner_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\u200d\u2642\ufe0f", "man running", []string{"running_man"}, "11.0", true}, {"\U0001f3c3\U0001f3ff\u200d\u2642\ufe0f", "man running: Dark Skin Tone", []string{"running_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fb\u200d\u2642\ufe0f", "man running: Light Skin Tone", []string{"running_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fe\u200d\u2642\ufe0f", "man running: Medium-Dark Skin Tone", []string{"running_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fc\u200d\u2642\ufe0f", "man running: Medium-Light Skin Tone", []string{"running_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fd\u200d\u2642\ufe0f", "man running: Medium Skin Tone", []string{"running_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3bd", "running shirt", []string{"running_shirt_with_sash"}, "6.0", false}, {"\U0001f3c3\u200d\u2640\ufe0f", "woman running", []string{"running_woman"}, "6.0", true}, {"\U0001f3c3\U0001f3ff\u200d\u2640\ufe0f", "woman running: Dark Skin Tone", []string{"running_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fb\u200d\u2640\ufe0f", "woman running: Light Skin Tone", []string{"running_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fe\u200d\u2640\ufe0f", "woman running: Medium-Dark Skin Tone", []string{"running_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fc\u200d\u2640\ufe0f", "woman running: Medium-Light Skin Tone", []string{"running_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fd\u200d\u2640\ufe0f", "woman running: Medium Skin Tone", []string{"running_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1f7\U0001f1fc", "flag: Rwanda", []string{"rwanda"}, "6.0", false}, {"\U0001f202\ufe0f", "Japanese โservice chargeโ button", []string{"sa"}, "6.0", false}, {"\U0001f9f7", "safety pin", []string{"safety_pin"}, "11.0", false},
-
@@ -1307,40 +2497,74 @@ {"\U0001f9ba", "safety vest", []string{"safety_vest"}, "12.0", false},{"\u2650", "Sagittarius", []string{"sagittarius"}, "", false}, {"\U0001f376", "sake", []string{"sake"}, "6.0", false}, {"\U0001f9c2", "salt", []string{"salt"}, "11.0", false}, {"\U0001fae1", "saluting face", []string{"saluting_face"}, "14.0", false}, {"\U0001f1fc\U0001f1f8", "flag: Samoa", []string{"samoa"}, "6.0", false}, {"\U0001f1f8\U0001f1f2", "flag: San Marino", []string{"san_marino"}, "6.0", false}, {"\U0001f461", "womanโs sandal", []string{"sandal"}, "6.0", false}, {"\U0001f96a", "sandwich", []string{"sandwich"}, "11.0", false}, {"\U0001f385", "Santa Claus", []string{"santa"}, "6.0", true}, {"\U0001f385\U0001f3ff", "Santa Claus: Dark Skin Tone", []string{"santa_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f385\U0001f3fb", "Santa Claus: Light Skin Tone", []string{"santa_Light_Skin_Tone"}, "12.0", false}, {"\U0001f385\U0001f3fe", "Santa Claus: Medium-Dark Skin Tone", []string{"santa_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f385\U0001f3fc", "Santa Claus: Medium-Light Skin Tone", []string{"santa_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f385\U0001f3fd", "Santa Claus: Medium Skin Tone", []string{"santa_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1f8\U0001f1f9", "flag: Sรฃo Tomรฉ & Prรญncipe", []string{"sao_tome_principe"}, "6.0", false}, {"\U0001f97b", "sari", []string{"sari"}, "12.0", false}, {"\U0001f4e1", "satellite antenna", []string{"satellite"}, "6.0", false}, {"\U0001f1f8\U0001f1e6", "flag: Saudi Arabia", []string{"saudi_arabia"}, "6.0", false}, {"\U0001f9d6\u200d\u2642\ufe0f", "man in steamy room", []string{"sauna_man"}, "11.0", true}, {"\U0001f9d6\U0001f3ff\u200d\u2642\ufe0f", "man in steamy room: Dark Skin Tone", []string{"sauna_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fb\u200d\u2642\ufe0f", "man in steamy room: Light Skin Tone", []string{"sauna_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fe\u200d\u2642\ufe0f", "man in steamy room: Medium-Dark Skin Tone", []string{"sauna_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fc\u200d\u2642\ufe0f", "man in steamy room: Medium-Light Skin Tone", []string{"sauna_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fd\u200d\u2642\ufe0f", "man in steamy room: Medium Skin Tone", []string{"sauna_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d6", "person in steamy room", []string{"sauna_person"}, "11.0", true}, {"\U0001f9d6\U0001f3ff", "person in steamy room: Dark Skin Tone", []string{"sauna_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fb", "person in steamy room: Light Skin Tone", []string{"sauna_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fe", "person in steamy room: Medium-Dark Skin Tone", []string{"sauna_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fc", "person in steamy room: Medium-Light Skin Tone", []string{"sauna_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fd", "person in steamy room: Medium Skin Tone", []string{"sauna_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\u200d\u2640\ufe0f", "woman in steamy room", []string{"sauna_woman"}, "11.0", true}, {"\U0001f9d6\U0001f3ff\u200d\u2640\ufe0f", "woman in steamy room: Dark Skin Tone", []string{"sauna_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fb\u200d\u2640\ufe0f", "woman in steamy room: Light Skin Tone", []string{"sauna_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fe\u200d\u2640\ufe0f", "woman in steamy room: Medium-Dark Skin Tone", []string{"sauna_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fc\u200d\u2640\ufe0f", "woman in steamy room: Medium-Light Skin Tone", []string{"sauna_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fd\u200d\u2640\ufe0f", "woman in steamy room: Medium Skin Tone", []string{"sauna_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f995", "sauropod", []string{"sauropod"}, "11.0", false}, {"\U0001f3b7", "saxophone", []string{"saxophone"}, "6.0", false}, {"\U0001f9e3", "scarf", []string{"scarf"}, "11.0", false}, {"\U0001f3eb", "school", []string{"school"}, "6.0", false}, {"\U0001f392", "backpack", []string{"school_satchel"}, "6.0", false}, {"\U0001f9d1\u200d\U0001f52c", "scientist", []string{"scientist"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f52c", "scientist: Dark Skin Tone", []string{"scientist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f52c", "scientist: Light Skin Tone", []string{"scientist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f52c", "scientist: Medium-Dark Skin Tone", []string{"scientist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f52c", "scientist: Medium-Light Skin Tone", []string{"scientist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f52c", "scientist: Medium Skin Tone", []string{"scientist_Medium_Skin_Tone"}, "12.0", false}, {"\u2702\ufe0f", "scissors", []string{"scissors"}, "", false}, {"\U0001f982", "scorpion", []string{"scorpion"}, "8.0", false}, {"\u264f", "Scorpio", []string{"scorpius"}, "", false}, {"\U0001f3f4\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f", "flag: Scotland", []string{"scotland"}, "11.0", false}, {"\U0001f631", "face screaming in fear", []string{"scream"}, "6.0", false}, {"\U0001f640", "weary cat", []string{"scream_cat"}, "6.0", false}, {"\U0001fa9b", "screwdriver", []string{"screwdriver"}, "13.0", false}, {"\U0001f4dc", "scroll", []string{"scroll"}, "6.0", false}, {"\U0001f9ad", "seal", []string{"seal"}, "13.0", false}, {"\U0001f4ba", "seat", []string{"seat"}, "6.0", false}, {"\u3299\ufe0f", "Japanese โsecretโ button", []string{"secret"}, "", false}, {"\U0001f648", "see-no-evil monkey", []string{"see_no_evil"}, "6.0", false}, {"\U0001f331", "seedling", []string{"seedling"}, "6.0", false}, {"\U0001f933", "selfie", []string{"selfie"}, "9.0", true}, {"\U0001f933\U0001f3ff", "selfie: Dark Skin Tone", []string{"selfie_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f933\U0001f3fb", "selfie: Light Skin Tone", []string{"selfie_Light_Skin_Tone"}, "12.0", false}, {"\U0001f933\U0001f3fe", "selfie: Medium-Dark Skin Tone", []string{"selfie_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f933\U0001f3fc", "selfie: Medium-Light Skin Tone", []string{"selfie_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f933\U0001f3fd", "selfie: Medium Skin Tone", []string{"selfie_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1f8\U0001f1f3", "flag: Senegal", []string{"senegal"}, "6.0", false}, {"\U0001f1f7\U0001f1f8", "flag: Serbia", []string{"serbia"}, "6.0", false}, {"\U0001f415\u200d\U0001f9ba", "service dog", []string{"service_dog"}, "12.0", false}, {"7\ufe0f\u20e3", "keycap: 7", []string{"seven"}, "", false}, {"\U0001faa1", "sewing needle", []string{"sewing_needle"}, "13.0", false}, {"\U0001f1f8\U0001f1e8", "flag: Seychelles", []string{"seychelles"}, "6.0", false}, {"\U0001f958", "shallow pan of food", []string{"shallow_pan_of_food"}, "", false}, {"\u2618\ufe0f", "shamrock", []string{"shamrock"}, "4.1", false},
-
@@ -1358,11 +2582,21 @@ {"\U0001fa73", "shorts", []string{"shorts"}, "12.0", false},{"\U0001f6bf", "shower", []string{"shower"}, "6.0", false}, {"\U0001f990", "shrimp", []string{"shrimp"}, "9.0", false}, {"\U0001f937", "person shrugging", []string{"shrug"}, "11.0", true}, {"\U0001f937\U0001f3ff", "person shrugging: Dark Skin Tone", []string{"shrug_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fb", "person shrugging: Light Skin Tone", []string{"shrug_Light_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fe", "person shrugging: Medium-Dark Skin Tone", []string{"shrug_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fc", "person shrugging: Medium-Light Skin Tone", []string{"shrug_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fd", "person shrugging: Medium Skin Tone", []string{"shrug_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f92b", "shushing face", []string{"shushing_face"}, "11.0", false}, {"\U0001f1f8\U0001f1f1", "flag: Sierra Leone", []string{"sierra_leone"}, "6.0", false}, {"\U0001f4f6", "antenna bars", []string{"signal_strength"}, "6.0", false}, {"\U0001f1f8\U0001f1ec", "flag: Singapore", []string{"singapore"}, "6.0", false}, {"\U0001f9d1\u200d\U0001f3a4", "singer", []string{"singer"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f3a4", "singer: Dark Skin Tone", []string{"singer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f3a4", "singer: Light Skin Tone", []string{"singer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f3a4", "singer: Medium-Dark Skin Tone", []string{"singer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f3a4", "singer: Medium-Light Skin Tone", []string{"singer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f3a4", "singer: Medium Skin Tone", []string{"singer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1f8\U0001f1fd", "flag: Sint Maarten", []string{"sint_maarten"}, "6.0", false}, {"6\ufe0f\u20e3", "keycap: 6", []string{"six"}, "", false}, {"\U0001f52f", "dotted six-pointed star", []string{"six_pointed_star"}, "6.0", false},
-
@@ -1375,6 +2609,11 @@ {"\U0001f9a8", "skunk", []string{"skunk"}, "12.0", false},{"\U0001f6f7", "sled", []string{"sled"}, "11.0", false}, {"\U0001f634", "sleeping face", []string{"sleeping"}, "6.1", false}, {"\U0001f6cc", "person in bed", []string{"sleeping_bed"}, "7.0", true}, {"\U0001f6cc\U0001f3ff", "person in bed: Dark Skin Tone", []string{"sleeping_bed_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6cc\U0001f3fb", "person in bed: Light Skin Tone", []string{"sleeping_bed_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6cc\U0001f3fe", "person in bed: Medium-Dark Skin Tone", []string{"sleeping_bed_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6cc\U0001f3fc", "person in bed: Medium-Light Skin Tone", []string{"sleeping_bed_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6cc\U0001f3fd", "person in bed: Medium Skin Tone", []string{"sleeping_bed_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f62a", "sleepy face", []string{"sleepy"}, "6.0", false}, {"\U0001f641", "slightly frowning face", []string{"slightly_frowning_face"}, "7.0", false}, {"\U0001f642", "slightly smiling face", []string{"slightly_smiling_face"}, "7.0", false},
-
@@ -1391,6 +2630,7 @@ {"\U0001f604", "grinning face with smiling eyes", []string{"smile"}, "6.0", false},{"\U0001f638", "grinning cat with smiling eyes", []string{"smile_cat"}, "6.0", false}, {"\U0001f603", "grinning face with big eyes", []string{"smiley"}, "6.0", false}, {"\U0001f63a", "grinning cat", []string{"smiley_cat"}, "6.0", false}, {"\U0001f972", "smiling face with tear", []string{"smiling_face_with_tear"}, "13.0", false}, {"\U0001f970", "smiling face with hearts", []string{"smiling_face_with_three_hearts"}, "11.0", false}, {"\U0001f608", "smiling face with horns", []string{"smiling_imp"}, "6.0", false}, {"\U0001f60f", "smirking face", []string{"smirk"}, "6.0", false},
-
@@ -1400,6 +2640,11 @@ {"\U0001f40c", "snail", []string{"snail"}, "6.0", false},{"\U0001f40d", "snake", []string{"snake"}, "6.0", false}, {"\U0001f927", "sneezing face", []string{"sneezing_face"}, "9.0", false}, {"\U0001f3c2", "snowboarder", []string{"snowboarder"}, "6.0", true}, {"\U0001f3c2\U0001f3ff", "snowboarder: Dark Skin Tone", []string{"snowboarder_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c2\U0001f3fb", "snowboarder: Light Skin Tone", []string{"snowboarder_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c2\U0001f3fe", "snowboarder: Medium-Dark Skin Tone", []string{"snowboarder_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c2\U0001f3fc", "snowboarder: Medium-Light Skin Tone", []string{"snowboarder_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c2\U0001f3fd", "snowboarder: Medium Skin Tone", []string{"snowboarder_Medium_Skin_Tone"}, "12.0", false}, {"\u2744\ufe0f", "snowflake", []string{"snowflake"}, "", false}, {"\u26c4", "snowman without snow", []string{"snowman"}, "5.2", false}, {"\u2603\ufe0f", "snowman", []string{"snowman_with_snow"}, "", false},
-
@@ -1445,8 +2690,23 @@ {"\U0001f1f5\U0001f1f2", "flag: St. Pierre & Miquelon", []string{"st_pierre_miquelon"}, "6.0", false},{"\U0001f1fb\U0001f1e8", "flag: St. Vincent & Grenadines", []string{"st_vincent_grenadines"}, "6.0", false}, {"\U0001f3df\ufe0f", "stadium", []string{"stadium"}, "7.0", false}, {"\U0001f9cd\u200d\u2642\ufe0f", "man standing", []string{"standing_man"}, "12.0", true}, {"\U0001f9cd\U0001f3ff\u200d\u2642\ufe0f", "man standing: Dark Skin Tone", []string{"standing_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fb\u200d\u2642\ufe0f", "man standing: Light Skin Tone", []string{"standing_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fe\u200d\u2642\ufe0f", "man standing: Medium-Dark Skin Tone", []string{"standing_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fc\u200d\u2642\ufe0f", "man standing: Medium-Light Skin Tone", []string{"standing_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fd\u200d\u2642\ufe0f", "man standing: Medium Skin Tone", []string{"standing_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9cd", "person standing", []string{"standing_person"}, "12.0", true}, {"\U0001f9cd\U0001f3ff", "person standing: Dark Skin Tone", []string{"standing_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fb", "person standing: Light Skin Tone", []string{"standing_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fe", "person standing: Medium-Dark Skin Tone", []string{"standing_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fc", "person standing: Medium-Light Skin Tone", []string{"standing_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fd", "person standing: Medium Skin Tone", []string{"standing_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\u200d\u2640\ufe0f", "woman standing", []string{"standing_woman"}, "12.0", true}, {"\U0001f9cd\U0001f3ff\u200d\u2640\ufe0f", "woman standing: Dark Skin Tone", []string{"standing_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fb\u200d\u2640\ufe0f", "woman standing: Light Skin Tone", []string{"standing_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fe\u200d\u2640\ufe0f", "woman standing: Medium-Dark Skin Tone", []string{"standing_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fc\u200d\u2640\ufe0f", "woman standing: Medium-Light Skin Tone", []string{"standing_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fd\u200d\u2640\ufe0f", "woman standing: Medium Skin Tone", []string{"standing_woman_Medium_Skin_Tone"}, "12.0", false}, {"\u2b50", "star", []string{"star"}, "5.1", false}, {"\U0001f31f", "glowing star", []string{"star2"}, "6.0", false}, {"\u262a\ufe0f", "star and crescent", []string{"star_and_crescent"}, "", false},
-
@@ -1467,6 +2727,11 @@ {"\U0001f61b", "face with tongue", []string{"stuck_out_tongue"}, "6.1", false},{"\U0001f61d", "squinting face with tongue", []string{"stuck_out_tongue_closed_eyes"}, "6.0", false}, {"\U0001f61c", "winking face with tongue", []string{"stuck_out_tongue_winking_eye"}, "6.0", false}, {"\U0001f9d1\u200d\U0001f393", "student", []string{"student"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f393", "student: Dark Skin Tone", []string{"student_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f393", "student: Light Skin Tone", []string{"student_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f393", "student: Medium-Dark Skin Tone", []string{"student_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f393", "student: Medium-Light Skin Tone", []string{"student_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f393", "student: Medium Skin Tone", []string{"student_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f399\ufe0f", "studio microphone", []string{"studio_microphone"}, "7.0", false}, {"\U0001f959", "stuffed flatbread", []string{"stuffed_flatbread"}, "9.0", false}, {"\U0001f1f8\U0001f1e9", "flag: Sudan", []string{"sudan"}, "6.0", false},
-
@@ -1480,14 +2745,59 @@ {"\u2600\ufe0f", "sun", []string{"sunny"}, "", false},{"\U0001f305", "sunrise", []string{"sunrise"}, "6.0", false}, {"\U0001f304", "sunrise over mountains", []string{"sunrise_over_mountains"}, "6.0", false}, {"\U0001f9b8", "superhero", []string{"superhero"}, "11.0", true}, {"\U0001f9b8\U0001f3ff", "superhero: Dark Skin Tone", []string{"superhero_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fb", "superhero: Light Skin Tone", []string{"superhero_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fe", "superhero: Medium-Dark Skin Tone", []string{"superhero_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fc", "superhero: Medium-Light Skin Tone", []string{"superhero_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fd", "superhero: Medium Skin Tone", []string{"superhero_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\u200d\u2642\ufe0f", "man superhero", []string{"superhero_man"}, "11.0", true}, {"\U0001f9b8\U0001f3ff\u200d\u2642\ufe0f", "man superhero: Dark Skin Tone", []string{"superhero_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fb\u200d\u2642\ufe0f", "man superhero: Light Skin Tone", []string{"superhero_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fe\u200d\u2642\ufe0f", "man superhero: Medium-Dark Skin Tone", []string{"superhero_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fc\u200d\u2642\ufe0f", "man superhero: Medium-Light Skin Tone", []string{"superhero_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fd\u200d\u2642\ufe0f", "man superhero: Medium Skin Tone", []string{"superhero_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\u200d\u2640\ufe0f", "woman superhero", []string{"superhero_woman"}, "11.0", true}, {"\U0001f9b8\U0001f3ff\u200d\u2640\ufe0f", "woman superhero: Dark Skin Tone", []string{"superhero_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fb\u200d\u2640\ufe0f", "woman superhero: Light Skin Tone", []string{"superhero_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fe\u200d\u2640\ufe0f", "woman superhero: Medium-Dark Skin Tone", []string{"superhero_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fc\u200d\u2640\ufe0f", "woman superhero: Medium-Light Skin Tone", []string{"superhero_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fd\u200d\u2640\ufe0f", "woman superhero: Medium Skin Tone", []string{"superhero_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9b9", "supervillain", []string{"supervillain"}, "11.0", true}, {"\U0001f9b9\U0001f3ff", "supervillain: Dark Skin Tone", []string{"supervillain_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fb", "supervillain: Light Skin Tone", []string{"supervillain_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fe", "supervillain: Medium-Dark Skin Tone", []string{"supervillain_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fc", "supervillain: Medium-Light Skin Tone", []string{"supervillain_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fd", "supervillain: Medium Skin Tone", []string{"supervillain_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\u200d\u2642\ufe0f", "man supervillain", []string{"supervillain_man"}, "11.0", true}, {"\U0001f9b9\U0001f3ff\u200d\u2642\ufe0f", "man supervillain: Dark Skin Tone", []string{"supervillain_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fb\u200d\u2642\ufe0f", "man supervillain: Light Skin Tone", []string{"supervillain_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fe\u200d\u2642\ufe0f", "man supervillain: Medium-Dark Skin Tone", []string{"supervillain_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fc\u200d\u2642\ufe0f", "man supervillain: Medium-Light Skin Tone", []string{"supervillain_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fd\u200d\u2642\ufe0f", "man supervillain: Medium Skin Tone", []string{"supervillain_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\u200d\u2640\ufe0f", "woman supervillain", []string{"supervillain_woman"}, "11.0", true}, {"\U0001f9b9\U0001f3ff\u200d\u2640\ufe0f", "woman supervillain: Dark Skin Tone", []string{"supervillain_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fb\u200d\u2640\ufe0f", "woman supervillain: Light Skin Tone", []string{"supervillain_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fe\u200d\u2640\ufe0f", "woman supervillain: Medium-Dark Skin Tone", []string{"supervillain_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fc\u200d\u2640\ufe0f", "woman supervillain: Medium-Light Skin Tone", []string{"supervillain_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fd\u200d\u2640\ufe0f", "woman supervillain: Medium Skin Tone", []string{"supervillain_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3c4", "person surfing", []string{"surfer"}, "6.0", true}, {"\U0001f3c4\U0001f3ff", "person surfing: Dark Skin Tone", []string{"surfer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fb", "person surfing: Light Skin Tone", []string{"surfer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fe", "person surfing: Medium-Dark Skin Tone", []string{"surfer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fc", "person surfing: Medium-Light Skin Tone", []string{"surfer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fd", "person surfing: Medium Skin Tone", []string{"surfer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\u200d\u2642\ufe0f", "man surfing", []string{"surfing_man"}, "11.0", true}, {"\U0001f3c4\U0001f3ff\u200d\u2642\ufe0f", "man surfing: Dark Skin Tone", []string{"surfing_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fb\u200d\u2642\ufe0f", "man surfing: Light Skin Tone", []string{"surfing_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fe\u200d\u2642\ufe0f", "man surfing: Medium-Dark Skin Tone", []string{"surfing_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fc\u200d\u2642\ufe0f", "man surfing: Medium-Light Skin Tone", []string{"surfing_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fd\u200d\u2642\ufe0f", "man surfing: Medium Skin Tone", []string{"surfing_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\u200d\u2640\ufe0f", "woman surfing", []string{"surfing_woman"}, "7.0", true}, {"\U0001f3c4\U0001f3ff\u200d\u2640\ufe0f", "woman surfing: Dark Skin Tone", []string{"surfing_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fb\u200d\u2640\ufe0f", "woman surfing: Light Skin Tone", []string{"surfing_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fe\u200d\u2640\ufe0f", "woman surfing: Medium-Dark Skin Tone", []string{"surfing_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fc\u200d\u2640\ufe0f", "woman surfing: Medium-Light Skin Tone", []string{"surfing_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fd\u200d\u2640\ufe0f", "woman surfing: Medium Skin Tone", []string{"surfing_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1f8\U0001f1f7", "flag: Suriname", []string{"suriname"}, "6.0", false}, {"\U0001f363", "sushi", []string{"sushi"}, "6.0", false}, {"\U0001f69f", "suspension railway", []string{"suspension_railway"}, "6.0", false},
-
@@ -1501,8 +2811,23 @@ {"\U0001f1f8\U0001f1ea", "flag: Sweden", []string{"sweden"}, "6.0", false},{"\U0001f360", "roasted sweet potato", []string{"sweet_potato"}, "6.0", false}, {"\U0001fa72", "briefs", []string{"swim_brief"}, "12.0", false}, {"\U0001f3ca", "person swimming", []string{"swimmer"}, "6.0", true}, {"\U0001f3ca\U0001f3ff", "person swimming: Dark Skin Tone", []string{"swimmer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fb", "person swimming: Light Skin Tone", []string{"swimmer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fe", "person swimming: Medium-Dark Skin Tone", []string{"swimmer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fc", "person swimming: Medium-Light Skin Tone", []string{"swimmer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fd", "person swimming: Medium Skin Tone", []string{"swimmer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\u200d\u2642\ufe0f", "man swimming", []string{"swimming_man"}, "11.0", true}, {"\U0001f3ca\U0001f3ff\u200d\u2642\ufe0f", "man swimming: Dark Skin Tone", []string{"swimming_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fb\u200d\u2642\ufe0f", "man swimming: Light Skin Tone", []string{"swimming_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fe\u200d\u2642\ufe0f", "man swimming: Medium-Dark Skin Tone", []string{"swimming_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fc\u200d\u2642\ufe0f", "man swimming: Medium-Light Skin Tone", []string{"swimming_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fd\u200d\u2642\ufe0f", "man swimming: Medium Skin Tone", []string{"swimming_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\u200d\u2640\ufe0f", "woman swimming", []string{"swimming_woman"}, "6.0", true}, {"\U0001f3ca\U0001f3ff\u200d\u2640\ufe0f", "woman swimming: Dark Skin Tone", []string{"swimming_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fb\u200d\u2640\ufe0f", "woman swimming: Light Skin Tone", []string{"swimming_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fe\u200d\u2640\ufe0f", "woman swimming: Medium-Dark Skin Tone", []string{"swimming_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fc\u200d\u2640\ufe0f", "woman swimming: Medium-Light Skin Tone", []string{"swimming_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fd\u200d\u2640\ufe0f", "woman swimming: Medium Skin Tone", []string{"swimming_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1e8\U0001f1ed", "flag: Switzerland", []string{"switzerland"}, "6.0", false}, {"\U0001f523", "input symbols", []string{"symbols"}, "6.0", false}, {"\U0001f54d", "synagogue", []string{"synagogue"}, "8.0", false},
-
@@ -1514,6 +2839,7 @@ {"\U0001f389", "party popper", []string{"tada", "hooray"}, "6.0", false},{"\U0001f1f9\U0001f1fc", "flag: Taiwan", []string{"taiwan"}, "6.0", false}, {"\U0001f1f9\U0001f1ef", "flag: Tajikistan", []string{"tajikistan"}, "6.0", false}, {"\U0001f961", "takeout box", []string{"takeout_box"}, "11.0", false}, {"\U0001fad4", "tamale", []string{"tamale"}, "13.0", false}, {"\U0001f38b", "tanabata tree", []string{"tanabata_tree"}, "6.0", false}, {"\U0001f34a", "tangerine", []string{"tangerine", "orange", "mandarin"}, "6.0", false}, {"\U0001f1f9\U0001f1ff", "flag: Tanzania", []string{"tanzania"}, "6.0", false},
-
@@ -1521,7 +2847,18 @@ {"\u2649", "Taurus", []string{"taurus"}, "", false},{"\U0001f695", "taxi", []string{"taxi"}, "6.0", false}, {"\U0001f375", "teacup without handle", []string{"tea"}, "6.0", false}, {"\U0001f9d1\u200d\U0001f3eb", "teacher", []string{"teacher"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f3eb", "teacher: Dark Skin Tone", []string{"teacher_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f3eb", "teacher: Light Skin Tone", []string{"teacher_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f3eb", "teacher: Medium-Dark Skin Tone", []string{"teacher_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f3eb", "teacher: Medium-Light Skin Tone", []string{"teacher_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f3eb", "teacher: Medium Skin Tone", []string{"teacher_Medium_Skin_Tone"}, "12.0", false}, {"\U0001fad6", "teapot", []string{"teapot"}, "13.0", false}, {"\U0001f9d1\u200d\U0001f4bb", "technologist", []string{"technologist"}, "12.1", true}, {"\U0001f9d1\U0001f3ff\u200d\U0001f4bb", "technologist: Dark Skin Tone", []string{"technologist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f4bb", "technologist: Light Skin Tone", []string{"technologist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f4bb", "technologist: Medium-Dark Skin Tone", []string{"technologist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f4bb", "technologist: Medium-Light Skin Tone", []string{"technologist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f4bb", "technologist: Medium Skin Tone", []string{"technologist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9f8", "teddy bear", []string{"teddy_bear"}, "11.0", false}, {"\U0001f4de", "telephone receiver", []string{"telephone_receiver"}, "6.0", false}, {"\U0001f52d", "telescope", []string{"telescope"}, "6.0", false},
-
@@ -1531,6 +2868,7 @@ {"\U0001f9ea", "test tube", []string{"test_tube"}, "11.0", false},{"\U0001f1f9\U0001f1ed", "flag: Thailand", []string{"thailand"}, "6.0", false}, {"\U0001f321\ufe0f", "thermometer", []string{"thermometer"}, "7.0", false}, {"\U0001f914", "thinking face", []string{"thinking"}, "8.0", false}, {"\U0001fa74", "thong sandal", []string{"thong_sandal"}, "13.0", false}, {"\U0001f4ad", "thought balloon", []string{"thought_balloon"}, "6.0", false}, {"\U0001f9f5", "thread", []string{"thread"}, "11.0", false}, {"3\ufe0f\u20e3", "keycap: 3", []string{"three"}, "", false},
-
@@ -1541,8 +2879,23 @@ {"\U0001f405", "tiger", []string{"tiger2"}, "6.0", false},{"\u23f2\ufe0f", "timer clock", []string{"timer_clock"}, "6.0", false}, {"\U0001f1f9\U0001f1f1", "flag: Timor-Leste", []string{"timor_leste"}, "6.0", false}, {"\U0001f481\u200d\u2642\ufe0f", "man tipping hand", []string{"tipping_hand_man", "sassy_man"}, "6.0", true}, {"\U0001f481\U0001f3ff\u200d\u2642\ufe0f", "man tipping hand: Dark Skin Tone", []string{"tipping_hand_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fb\u200d\u2642\ufe0f", "man tipping hand: Light Skin Tone", []string{"tipping_hand_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fe\u200d\u2642\ufe0f", "man tipping hand: Medium-Dark Skin Tone", []string{"tipping_hand_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fc\u200d\u2642\ufe0f", "man tipping hand: Medium-Light Skin Tone", []string{"tipping_hand_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fd\u200d\u2642\ufe0f", "man tipping hand: Medium Skin Tone", []string{"tipping_hand_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f481", "person tipping hand", []string{"tipping_hand_person", "information_desk_person"}, "6.0", true}, {"\U0001f481\U0001f3ff", "person tipping hand: Dark Skin Tone", []string{"tipping_hand_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fb", "person tipping hand: Light Skin Tone", []string{"tipping_hand_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fe", "person tipping hand: Medium-Dark Skin Tone", []string{"tipping_hand_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fc", "person tipping hand: Medium-Light Skin Tone", []string{"tipping_hand_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fd", "person tipping hand: Medium Skin Tone", []string{"tipping_hand_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f481\u200d\u2640\ufe0f", "woman tipping hand", []string{"tipping_hand_woman", "sassy_woman"}, "11.0", true}, {"\U0001f481\U0001f3ff\u200d\u2640\ufe0f", "woman tipping hand: Dark Skin Tone", []string{"tipping_hand_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fb\u200d\u2640\ufe0f", "woman tipping hand: Light Skin Tone", []string{"tipping_hand_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fe\u200d\u2640\ufe0f", "woman tipping hand: Medium-Dark Skin Tone", []string{"tipping_hand_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fc\u200d\u2640\ufe0f", "woman tipping hand: Medium-Light Skin Tone", []string{"tipping_hand_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fd\u200d\u2640\ufe0f", "woman tipping hand: Medium Skin Tone", []string{"tipping_hand_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f62b", "tired face", []string{"tired_face"}, "6.0", false}, {"\u2122\ufe0f", "trade mark", []string{"tm"}, "", false}, {"\U0001f1f9\U0001f1ec", "flag: Togo", []string{"togo"}, "6.0", false},
-
@@ -1554,6 +2907,7 @@ {"\U0001f1f9\U0001f1f4", "flag: Tonga", []string{"tonga"}, "6.0", false},{"\U0001f445", "tongue", []string{"tongue"}, "6.0", false}, {"\U0001f9f0", "toolbox", []string{"toolbox"}, "11.0", false}, {"\U0001f9b7", "tooth", []string{"tooth"}, "11.0", false}, {"\U0001faa5", "toothbrush", []string{"toothbrush"}, "13.0", false}, {"\U0001f51d", "TOP arrow", []string{"top"}, "6.0", false}, {"\U0001f3a9", "top hat", []string{"tophat"}, "6.0", false}, {"\U0001f32a\ufe0f", "tornado", []string{"tornado"}, "7.0", false},
-
@@ -1564,12 +2918,15 @@ {"\U0001f6a5", "horizontal traffic light", []string{"traffic_light"}, "6.0", false},{"\U0001f68b", "tram car", []string{"train"}, "6.0", false}, {"\U0001f686", "train", []string{"train2"}, "6.0", false}, {"\U0001f68a", "tram", []string{"tram"}, "6.0", false}, {"\U0001f3f3\ufe0f\u200d\u26a7\ufe0f", "transgender flag", []string{"transgender_flag"}, "13.0", false}, {"\u26a7\ufe0f", "transgender symbol", []string{"transgender_symbol"}, "13.0", false}, {"\U0001f6a9", "triangular flag", []string{"triangular_flag_on_post"}, "6.0", false}, {"\U0001f4d0", "triangular ruler", []string{"triangular_ruler"}, "6.0", false}, {"\U0001f531", "trident emblem", []string{"trident"}, "6.0", false}, {"\U0001f1f9\U0001f1f9", "flag: Trinidad & Tobago", []string{"trinidad_tobago"}, "6.0", false}, {"\U0001f1f9\U0001f1e6", "flag: Tristan da Cunha", []string{"tristan_da_cunha"}, "11.0", false}, {"\U0001f624", "face with steam from nose", []string{"triumph"}, "6.0", false}, {"\U0001f9cc", "troll", []string{"troll"}, "14.0", false}, {"\U0001f68e", "trolleybus", []string{"trolleybus"}, "6.0", false}, {"\U0001f3c6", "trophy", []string{"trophy"}, "6.0", false}, {"\U0001f379", "tropical drink", []string{"tropical_drink"}, "6.0", false},
-
@@ -1589,7 +2946,17 @@ {"\U0001f500", "shuffle tracks button", []string{"twisted_rightwards_arrows"}, "6.0", false},{"2\ufe0f\u20e3", "keycap: 2", []string{"two"}, "", false}, {"\U0001f495", "two hearts", []string{"two_hearts"}, "6.0", false}, {"\U0001f46c", "men holding hands", []string{"two_men_holding_hands"}, "6.0", true}, {"\U0001f46c\U0001f3ff", "men holding hands: Dark Skin Tone", []string{"two_men_holding_hands_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46c\U0001f3fb", "men holding hands: Light Skin Tone", []string{"two_men_holding_hands_Light_Skin_Tone"}, "12.0", false}, {"\U0001f46c\U0001f3fe", "men holding hands: Medium-Dark Skin Tone", []string{"two_men_holding_hands_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46c\U0001f3fc", "men holding hands: Medium-Light Skin Tone", []string{"two_men_holding_hands_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f46c\U0001f3fd", "men holding hands: Medium Skin Tone", []string{"two_men_holding_hands_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f46d", "women holding hands", []string{"two_women_holding_hands"}, "6.0", true}, {"\U0001f46d\U0001f3ff", "women holding hands: Dark Skin Tone", []string{"two_women_holding_hands_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46d\U0001f3fb", "women holding hands: Light Skin Tone", []string{"two_women_holding_hands_Light_Skin_Tone"}, "12.0", false}, {"\U0001f46d\U0001f3fe", "women holding hands: Medium-Dark Skin Tone", []string{"two_women_holding_hands_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46d\U0001f3fc", "women holding hands: Medium-Light Skin Tone", []string{"two_women_holding_hands_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f46d\U0001f3fd", "women holding hands: Medium Skin Tone", []string{"two_women_holding_hands_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f239", "Japanese โdiscountโ button", []string{"u5272"}, "6.0", false}, {"\U0001f234", "Japanese โpassing gradeโ button", []string{"u5408"}, "6.0", false}, {"\U0001f23a", "Japanese โopen for businessโ button", []string{"u55b6"}, "6.0", false},
-
@@ -1618,9 +2985,29 @@ {"\U0001f1fa\U0001f1f2", "flag: U.S. Outlying Islands", []string{"us_outlying_islands"}, "11.0", false},{"\U0001f1fb\U0001f1ee", "flag: U.S. Virgin Islands", []string{"us_virgin_islands"}, "6.0", false}, {"\U0001f1fa\U0001f1ff", "flag: Uzbekistan", []string{"uzbekistan"}, "6.0", false}, {"\u270c\ufe0f", "victory hand", []string{"v"}, "", true}, {"\u270c\U0001f3ff\ufe0f", "victory hand: Dark Skin Tone", []string{"v_Dark_Skin_Tone"}, "12.0", false}, {"\u270c\U0001f3fb\ufe0f", "victory hand: Light Skin Tone", []string{"v_Light_Skin_Tone"}, "12.0", false}, {"\u270c\U0001f3fe\ufe0f", "victory hand: Medium-Dark Skin Tone", []string{"v_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u270c\U0001f3fc\ufe0f", "victory hand: Medium-Light Skin Tone", []string{"v_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u270c\U0001f3fd\ufe0f", "victory hand: Medium Skin Tone", []string{"v_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9db", "vampire", []string{"vampire"}, "11.0", true}, {"\U0001f9db\U0001f3ff", "vampire: Dark Skin Tone", []string{"vampire_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fb", "vampire: Light Skin Tone", []string{"vampire_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fe", "vampire: Medium-Dark Skin Tone", []string{"vampire_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fc", "vampire: Medium-Light Skin Tone", []string{"vampire_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fd", "vampire: Medium Skin Tone", []string{"vampire_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9db\u200d\u2642\ufe0f", "man vampire", []string{"vampire_man"}, "11.0", true}, {"\U0001f9db\U0001f3ff\u200d\u2642\ufe0f", "man vampire: Dark Skin Tone", []string{"vampire_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fb\u200d\u2642\ufe0f", "man vampire: Light Skin Tone", []string{"vampire_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fe\u200d\u2642\ufe0f", "man vampire: Medium-Dark Skin Tone", []string{"vampire_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fc\u200d\u2642\ufe0f", "man vampire: Medium-Light Skin Tone", []string{"vampire_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fd\u200d\u2642\ufe0f", "man vampire: Medium Skin Tone", []string{"vampire_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9db\u200d\u2640\ufe0f", "woman vampire", []string{"vampire_woman"}, "11.0", true}, {"\U0001f9db\U0001f3ff\u200d\u2640\ufe0f", "woman vampire: Dark Skin Tone", []string{"vampire_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fb\u200d\u2640\ufe0f", "woman vampire: Light Skin Tone", []string{"vampire_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fe\u200d\u2640\ufe0f", "woman vampire: Medium-Dark Skin Tone", []string{"vampire_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fc\u200d\u2640\ufe0f", "woman vampire: Medium-Light Skin Tone", []string{"vampire_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fd\u200d\u2640\ufe0f", "woman vampire: Medium Skin Tone", []string{"vampire_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1fb\U0001f1fa", "flag: Vanuatu", []string{"vanuatu"}, "6.0", false}, {"\U0001f1fb\U0001f1e6", "flag: Vatican City", []string{"vatican_city"}, "6.0", false}, {"\U0001f1fb\U0001f1ea", "flag: Venezuela", []string{"venezuela"}, "6.0", false},
-
@@ -1637,11 +3024,31 @@ {"\U0001f3d0", "volleyball", []string{"volleyball"}, "8.0", false},{"\U0001f92e", "face vomiting", []string{"vomiting_face"}, "11.0", false}, {"\U0001f19a", "VS button", []string{"vs"}, "6.0", false}, {"\U0001f596", "vulcan salute", []string{"vulcan_salute"}, "7.0", true}, {"\U0001f596\U0001f3ff", "vulcan salute: Dark Skin Tone", []string{"vulcan_salute_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f596\U0001f3fb", "vulcan salute: Light Skin Tone", []string{"vulcan_salute_Light_Skin_Tone"}, "12.0", false}, {"\U0001f596\U0001f3fe", "vulcan salute: Medium-Dark Skin Tone", []string{"vulcan_salute_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f596\U0001f3fc", "vulcan salute: Medium-Light Skin Tone", []string{"vulcan_salute_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f596\U0001f3fd", "vulcan salute: Medium Skin Tone", []string{"vulcan_salute_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9c7", "waffle", []string{"waffle"}, "12.0", false}, {"\U0001f3f4\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f", "flag: Wales", []string{"wales"}, "11.0", false}, {"\U0001f6b6", "person walking", []string{"walking"}, "6.0", true}, {"\U0001f6b6\U0001f3ff", "person walking: Dark Skin Tone", []string{"walking_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fb", "person walking: Light Skin Tone", []string{"walking_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fe", "person walking: Medium-Dark Skin Tone", []string{"walking_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fc", "person walking: Medium-Light Skin Tone", []string{"walking_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fd", "person walking: Medium Skin Tone", []string{"walking_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\u200d\u2642\ufe0f", "man walking", []string{"walking_man"}, "11.0", true}, {"\U0001f6b6\U0001f3ff\u200d\u2642\ufe0f", "man walking: Dark Skin Tone", []string{"walking_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fb\u200d\u2642\ufe0f", "man walking: Light Skin Tone", []string{"walking_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fe\u200d\u2642\ufe0f", "man walking: Medium-Dark Skin Tone", []string{"walking_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fc\u200d\u2642\ufe0f", "man walking: Medium-Light Skin Tone", []string{"walking_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fd\u200d\u2642\ufe0f", "man walking: Medium Skin Tone", []string{"walking_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\u200d\u2640\ufe0f", "woman walking", []string{"walking_woman"}, "6.0", true}, {"\U0001f6b6\U0001f3ff\u200d\u2640\ufe0f", "woman walking: Dark Skin Tone", []string{"walking_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fb\u200d\u2640\ufe0f", "woman walking: Light Skin Tone", []string{"walking_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fe\u200d\u2640\ufe0f", "woman walking: Medium-Dark Skin Tone", []string{"walking_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fc\u200d\u2640\ufe0f", "woman walking: Medium-Light Skin Tone", []string{"walking_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fd\u200d\u2640\ufe0f", "woman walking: Medium Skin Tone", []string{"walking_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1fc\U0001f1eb", "flag: Wallis & Futuna", []string{"wallis_futuna"}, "6.0", false}, {"\U0001f318", "waning crescent moon", []string{"waning_crescent_moon"}, "6.0", false}, {"\U0001f316", "waning gibbous moon", []string{"waning_gibbous_moon"}, "6.0", false},
-
@@ -1650,19 +3057,45 @@ {"\U0001f5d1\ufe0f", "wastebasket", []string{"wastebasket"}, "7.0", false},{"\u231a", "watch", []string{"watch"}, "", false}, {"\U0001f403", "water buffalo", []string{"water_buffalo"}, "6.0", false}, {"\U0001f93d", "person playing water polo", []string{"water_polo"}, "11.0", true}, {"\U0001f93d\U0001f3ff", "person playing water polo: Dark Skin Tone", []string{"water_polo_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fb", "person playing water polo: Light Skin Tone", []string{"water_polo_Light_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fe", "person playing water polo: Medium-Dark Skin Tone", []string{"water_polo_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fc", "person playing water polo: Medium-Light Skin Tone", []string{"water_polo_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fd", "person playing water polo: Medium Skin Tone", []string{"water_polo_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f349", "watermelon", []string{"watermelon"}, "6.0", false}, {"\U0001f44b", "waving hand", []string{"wave"}, "6.0", true}, {"\U0001f44b\U0001f3ff", "waving hand: Dark Skin Tone", []string{"wave_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44b\U0001f3fb", "waving hand: Light Skin Tone", []string{"wave_Light_Skin_Tone"}, "12.0", false}, {"\U0001f44b\U0001f3fe", "waving hand: Medium-Dark Skin Tone", []string{"wave_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44b\U0001f3fc", "waving hand: Medium-Light Skin Tone", []string{"wave_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f44b\U0001f3fd", "waving hand: Medium Skin Tone", []string{"wave_Medium_Skin_Tone"}, "12.0", false}, {"\u3030\ufe0f", "wavy dash", []string{"wavy_dash"}, "", false}, {"\U0001f312", "waxing crescent moon", []string{"waxing_crescent_moon"}, "6.0", false}, {"\U0001f6be", "water closet", []string{"wc"}, "6.0", false}, {"\U0001f629", "weary face", []string{"weary"}, "6.0", false}, {"\U0001f492", "wedding", []string{"wedding"}, "6.0", false}, {"\U0001f3cb\ufe0f", "person lifting weights", []string{"weight_lifting"}, "7.0", true}, {"\U0001f3cb\U0001f3ff\ufe0f", "person lifting weights: Dark Skin Tone", []string{"weight_lifting_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fb\ufe0f", "person lifting weights: Light Skin Tone", []string{"weight_lifting_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fe\ufe0f", "person lifting weights: Medium-Dark Skin Tone", []string{"weight_lifting_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fc\ufe0f", "person lifting weights: Medium-Light Skin Tone", []string{"weight_lifting_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fd\ufe0f", "person lifting weights: Medium Skin Tone", []string{"weight_lifting_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\ufe0f\u200d\u2642\ufe0f", "man lifting weights", []string{"weight_lifting_man"}, "11.0", true}, {"\U0001f3cb\U0001f3ff\ufe0f\u200d\u2642\ufe0f", "man lifting weights: Dark Skin Tone", []string{"weight_lifting_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fb\ufe0f\u200d\u2642\ufe0f", "man lifting weights: Light Skin Tone", []string{"weight_lifting_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fe\ufe0f\u200d\u2642\ufe0f", "man lifting weights: Medium-Dark Skin Tone", []string{"weight_lifting_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fc\ufe0f\u200d\u2642\ufe0f", "man lifting weights: Medium-Light Skin Tone", []string{"weight_lifting_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fd\ufe0f\u200d\u2642\ufe0f", "man lifting weights: Medium Skin Tone", []string{"weight_lifting_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\ufe0f\u200d\u2640\ufe0f", "woman lifting weights", []string{"weight_lifting_woman"}, "6.0", true}, {"\U0001f3cb\U0001f3ff\ufe0f\u200d\u2640\ufe0f", "woman lifting weights: Dark Skin Tone", []string{"weight_lifting_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fb\ufe0f\u200d\u2640\ufe0f", "woman lifting weights: Light Skin Tone", []string{"weight_lifting_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fe\ufe0f\u200d\u2640\ufe0f", "woman lifting weights: Medium-Dark Skin Tone", []string{"weight_lifting_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fc\ufe0f\u200d\u2640\ufe0f", "woman lifting weights: Medium-Light Skin Tone", []string{"weight_lifting_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fd\ufe0f\u200d\u2640\ufe0f", "woman lifting weights: Medium Skin Tone", []string{"weight_lifting_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f1ea\U0001f1ed", "flag: Western Sahara", []string{"western_sahara"}, "6.0", false}, {"\U0001f433", "spouting whale", []string{"whale"}, "6.0", false}, {"\U0001f40b", "whale", []string{"whale2"}, "6.0", false}, {"\U0001f6de", "wheel", []string{"wheel"}, "14.0", false}, {"\u2638\ufe0f", "wheel of dharma", []string{"wheel_of_dharma"}, "", false}, {"\u267f", "wheelchair symbol", []string{"wheelchair"}, "4.1", false}, {"\u2705", "check mark button", []string{"white_check_mark"}, "6.0", false},
-
@@ -1670,7 +3103,17 @@ {"\u26aa", "white circle", []string{"white_circle"}, "4.1", false},{"\U0001f3f3\ufe0f", "white flag", []string{"white_flag"}, "7.0", false}, {"\U0001f4ae", "white flower", []string{"white_flower"}, "6.0", false}, {"\U0001f468\u200d\U0001f9b3", "man: white hair", []string{"white_haired_man"}, "11.0", true}, {"\U0001f468\U0001f3ff\u200d\U0001f9b3", "man: white hair: Dark Skin Tone", []string{"white_haired_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f9b3", "man: white hair: Light Skin Tone", []string{"white_haired_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f9b3", "man: white hair: Medium-Dark Skin Tone", []string{"white_haired_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f9b3", "man: white hair: Medium-Light Skin Tone", []string{"white_haired_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f9b3", "man: white hair: Medium Skin Tone", []string{"white_haired_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f9b3", "woman: white hair", []string{"white_haired_woman"}, "11.0", true}, {"\U0001f469\U0001f3ff\u200d\U0001f9b3", "woman: white hair: Dark Skin Tone", []string{"white_haired_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f9b3", "woman: white hair: Light Skin Tone", []string{"white_haired_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f9b3", "woman: white hair: Medium-Dark Skin Tone", []string{"white_haired_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f9b3", "woman: white hair: Medium-Light Skin Tone", []string{"white_haired_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f9b3", "woman: white hair: Medium Skin Tone", []string{"white_haired_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f90d", "white heart", []string{"white_heart"}, "12.0", false}, {"\u2b1c", "white large square", []string{"white_large_square"}, "5.1", false}, {"\u25fd", "white medium-small square", []string{"white_medium_small_square"}, "3.2", false},
-
@@ -1680,1468 +3123,246 @@ {"\U0001f533", "white square button", []string{"white_square_button"}, "6.0", false},{"\U0001f940", "wilted flower", []string{"wilted_flower"}, "9.0", false}, {"\U0001f390", "wind chime", []string{"wind_chime"}, "6.0", false}, {"\U0001f32c\ufe0f", "wind face", []string{"wind_face"}, "7.0", false}, {"\U0001fa9f", "window", []string{"window"}, "13.0", false}, {"\U0001f377", "wine glass", []string{"wine_glass"}, "6.0", false}, {"\U0001f609", "winking face", []string{"wink"}, "6.0", false}, {"\U0001f43a", "wolf", []string{"wolf"}, "6.0", false}, {"\U0001f469", "woman", []string{"woman"}, "6.0", true}, {"\U0001f469\u200d\U0001f3a8", "woman artist", []string{"woman_artist"}, "", true}, {"\U0001f469\u200d\U0001f680", "woman astronaut", []string{"woman_astronaut"}, "", true}, {"\U0001f938\u200d\u2640\ufe0f", "woman cartwheeling", []string{"woman_cartwheeling"}, "", true}, {"\U0001f469\u200d\U0001f373", "woman cook", []string{"woman_cook"}, "", true}, {"\U0001f483", "woman dancing", []string{"woman_dancing", "dancer"}, "6.0", true}, {"\U0001f926\u200d\u2640\ufe0f", "woman facepalming", []string{"woman_facepalming"}, "9.0", true}, {"\U0001f469\u200d\U0001f3ed", "woman factory worker", []string{"woman_factory_worker"}, "", true}, {"\U0001f469\u200d\U0001f33e", "woman farmer", []string{"woman_farmer"}, "", true}, {"\U0001f469\u200d\U0001f692", "woman firefighter", []string{"woman_firefighter"}, "", true}, {"\U0001f469\u200d\u2695\ufe0f", "woman health worker", []string{"woman_health_worker"}, "", true}, {"\U0001f469\u200d\U0001f9bd", "woman in manual wheelchair", []string{"woman_in_manual_wheelchair"}, "12.0", true}, {"\U0001f469\u200d\U0001f9bc", "woman in motorized wheelchair", []string{"woman_in_motorized_wheelchair"}, "12.0", true}, {"\U0001f469\u200d\u2696\ufe0f", "woman judge", []string{"woman_judge"}, "", true}, {"\U0001f939\u200d\u2640\ufe0f", "woman juggling", []string{"woman_juggling"}, "9.0", true}, {"\U0001f469\u200d\U0001f527", "woman mechanic", []string{"woman_mechanic"}, "", true}, {"\U0001f469\u200d\U0001f4bc", "woman office worker", []string{"woman_office_worker"}, "", true}, {"\U0001f469\u200d\u2708\ufe0f", "woman pilot", []string{"woman_pilot"}, "", true}, {"\U0001f93e\u200d\u2640\ufe0f", "woman playing handball", []string{"woman_playing_handball"}, "9.0", true}, {"\U0001f93d\u200d\u2640\ufe0f", "woman playing water polo", []string{"woman_playing_water_polo"}, "9.0", true}, {"\U0001f469\u200d\U0001f52c", "woman scientist", []string{"woman_scientist"}, "", true}, {"\U0001f937\u200d\u2640\ufe0f", "woman shrugging", []string{"woman_shrugging"}, "9.0", true}, {"\U0001f469\u200d\U0001f3a4", "woman singer", []string{"woman_singer"}, "", true}, {"\U0001f469\u200d\U0001f393", "woman student", []string{"woman_student"}, "", true}, {"\U0001f469\u200d\U0001f3eb", "woman teacher", []string{"woman_teacher"}, "", true}, {"\U0001f469\u200d\U0001f4bb", "woman technologist", []string{"woman_technologist"}, "", true}, {"\U0001f9d5", "woman with headscarf", []string{"woman_with_headscarf"}, "11.0", true}, {"\U0001f469\u200d\U0001f9af", "woman with white cane", []string{"woman_with_probing_cane"}, "12.0", true}, {"\U0001f473\u200d\u2640\ufe0f", "woman wearing turban", []string{"woman_with_turban"}, "6.0", true}, {"\U0001f45a", "womanโs clothes", []string{"womans_clothes"}, "6.0", false}, {"\U0001f452", "womanโs hat", []string{"womans_hat"}, "6.0", false}, {"\U0001f93c\u200d\u2640\ufe0f", "women wrestling", []string{"women_wrestling"}, "9.0", false}, {"\U0001f6ba", "womenโs room", []string{"womens"}, "6.0", false}, {"\U0001f974", "woozy face", []string{"woozy_face"}, "11.0", false}, {"\U0001f5fa\ufe0f", "world map", []string{"world_map"}, "7.0", false}, {"\U0001f61f", "worried face", []string{"worried"}, "6.1", false}, {"\U0001f527", "wrench", []string{"wrench"}, "6.0", false}, {"\U0001f93c", "people wrestling", []string{"wrestling"}, "11.0", false}, {"\u270d\ufe0f", "writing hand", []string{"writing_hand"}, "", true}, {"\u274c", "cross mark", []string{"x"}, "6.0", false}, {"\U0001f9f6", "yarn", []string{"yarn"}, "11.0", false}, {"\U0001f971", "yawning face", []string{"yawning_face"}, "12.0", false}, {"\U0001f7e1", "yellow circle", []string{"yellow_circle"}, "12.0", false}, {"\U0001f49b", "yellow heart", []string{"yellow_heart"}, "6.0", false}, {"\U0001f7e8", "yellow square", []string{"yellow_square"}, "12.0", false}, {"\U0001f1fe\U0001f1ea", "flag: Yemen", []string{"yemen"}, "6.0", false}, {"\U0001f4b4", "yen banknote", []string{"yen"}, "6.0", false}, {"\u262f\ufe0f", "yin yang", []string{"yin_yang"}, "", false}, {"\U0001fa80", "yo-yo", []string{"yo_yo"}, "12.0", false}, {"\U0001f60b", "face savoring food", []string{"yum"}, "6.0", false}, {"\U0001f1ff\U0001f1f2", "flag: Zambia", []string{"zambia"}, "6.0", false}, {"\U0001f92a", "zany face", []string{"zany_face"}, "11.0", false}, {"\u26a1", "high voltage", []string{"zap"}, "4.0", false}, {"\U0001f993", "zebra", []string{"zebra"}, "11.0", false}, {"0\ufe0f\u20e3", "keycap: 0", []string{"zero"}, "", false}, {"\U0001f1ff\U0001f1fc", "flag: Zimbabwe", []string{"zimbabwe"}, "6.0", false}, {"\U0001f910", "zipper-mouth face", []string{"zipper_mouth_face"}, "8.0", false}, {"\U0001f9df", "zombie", []string{"zombie"}, "11.0", false}, {"\U0001f9df\u200d\u2642\ufe0f", "man zombie", []string{"zombie_man"}, "11.0", false}, {"\U0001f9df\u200d\u2640\ufe0f", "woman zombie", []string{"zombie_woman"}, "11.0", false}, {"\U0001f4a4", "zzz", []string{"zzz"}, "6.0", false}, {"\U0001f44d\U0001f3ff", "thumbs up: Dark Skin Tone", []string{"+1_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44d\U0001f3fb", "thumbs up: Light Skin Tone", []string{"+1_Light_Skin_Tone"}, "12.0", false}, {"\U0001f44d\U0001f3fc", "thumbs up: Medium-Light Skin Tone", []string{"+1_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f44d\U0001f3fd", "thumbs up: Medium Skin Tone", []string{"+1_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f44d\U0001f3fe", "thumbs up: Medium-Dark Skin Tone", []string{"+1_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44e\U0001f3ff", "thumbs down: Dark Skin Tone", []string{"-1_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44e\U0001f3fb", "thumbs down: Light Skin Tone", []string{"-1_Light_Skin_Tone"}, "12.0", false}, {"\U0001f44e\U0001f3fc", "thumbs down: Medium-Light Skin Tone", []string{"-1_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f44e\U0001f3fd", "thumbs down: Medium Skin Tone", []string{"-1_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f44e\U0001f3fe", "thumbs down: Medium-Dark Skin Tone", []string{"-1_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc", "person: Medium-Light Skin Tone", []string{"adult_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd", "person: Medium Skin Tone", []string{"adult_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe", "person: Medium-Dark Skin Tone", []string{"adult_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff", "person: Dark Skin Tone", []string{"adult_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb", "person: Light Skin Tone", []string{"adult_Light_Skin_Tone"}, "12.0", false}, {"\U0001f47c\U0001f3fb", "baby angel: Light Skin Tone", []string{"angel_Light_Skin_Tone"}, "12.0", false}, {"\U0001f47c\U0001f3fc", "baby angel: Medium-Light Skin Tone", []string{"angel_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f47c\U0001f3fd", "baby angel: Medium Skin Tone", []string{"angel_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f47c\U0001f3fe", "baby angel: Medium-Dark Skin Tone", []string{"angel_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f47c\U0001f3ff", "baby angel: Dark Skin Tone", []string{"angel_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f3a8", "artist: Light Skin Tone", []string{"artist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f3a8", "artist: Medium-Light Skin Tone", []string{"artist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f3a8", "artist: Medium Skin Tone", []string{"artist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f3a8", "artist: Medium-Dark Skin Tone", []string{"artist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f3a8", "artist: Dark Skin Tone", []string{"artist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f680", "astronaut: Medium-Light Skin Tone", []string{"astronaut_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f680", "astronaut: Medium Skin Tone", []string{"astronaut_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f680", "astronaut: Medium-Dark Skin Tone", []string{"astronaut_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f680", "astronaut: Dark Skin Tone", []string{"astronaut_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f680", "astronaut: Light Skin Tone", []string{"astronaut_Light_Skin_Tone"}, "12.0", false}, {"\U0001f476\U0001f3fb", "baby: Light Skin Tone", []string{"baby_Light_Skin_Tone"}, "12.0", false}, {"\U0001f476\U0001f3fc", "baby: Medium-Light Skin Tone", []string{"baby_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f476\U0001f3fd", "baby: Medium Skin Tone", []string{"baby_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f476\U0001f3fe", "baby: Medium-Dark Skin Tone", []string{"baby_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f476\U0001f3ff", "baby: Dark Skin Tone", []string{"baby_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f9b2", "man: bald: Medium-Dark Skin Tone", []string{"bald_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f9b2", "man: bald: Dark Skin Tone", []string{"bald_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f9b2", "man: bald: Light Skin Tone", []string{"bald_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f9b2", "man: bald: Medium-Light Skin Tone", []string{"bald_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f9b2", "man: bald: Medium Skin Tone", []string{"bald_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f9b2", "woman: bald: Medium-Light Skin Tone", []string{"bald_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f9b2", "woman: bald: Medium Skin Tone", []string{"bald_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f9b2", "woman: bald: Medium-Dark Skin Tone", []string{"bald_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f9b2", "woman: bald: Dark Skin Tone", []string{"bald_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f9b2", "woman: bald: Light Skin Tone", []string{"bald_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6c0\U0001f3fe", "person taking bath: Medium-Dark Skin Tone", []string{"bath_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6c0\U0001f3ff", "person taking bath: Dark Skin Tone", []string{"bath_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6c0\U0001f3fb", "person taking bath: Light Skin Tone", []string{"bath_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6c0\U0001f3fc", "person taking bath: Medium-Light Skin Tone", []string{"bath_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6c0\U0001f3fd", "person taking bath: Medium Skin Tone", []string{"bath_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fd", "person: beard: Medium Skin Tone", []string{"bearded_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fe", "person: beard: Medium-Dark Skin Tone", []string{"bearded_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3ff", "person: beard: Dark Skin Tone", []string{"bearded_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fb", "person: beard: Light Skin Tone", []string{"bearded_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fc", "person: beard: Medium-Light Skin Tone", []string{"bearded_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fd", "person biking: Medium Skin Tone", []string{"bicyclist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fe", "person biking: Medium-Dark Skin Tone", []string{"bicyclist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3ff", "person biking: Dark Skin Tone", []string{"bicyclist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fb", "person biking: Light Skin Tone", []string{"bicyclist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fc", "person biking: Medium-Light Skin Tone", []string{"bicyclist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fe\u200d\u2642\ufe0f", "man biking: Medium-Dark Skin Tone", []string{"biking_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3ff\u200d\u2642\ufe0f", "man biking: Dark Skin Tone", []string{"biking_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fb\u200d\u2642\ufe0f", "man biking: Light Skin Tone", []string{"biking_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fc\u200d\u2642\ufe0f", "man biking: Medium-Light Skin Tone", []string{"biking_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fd\u200d\u2642\ufe0f", "man biking: Medium Skin Tone", []string{"biking_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fb\u200d\u2640\ufe0f", "woman biking: Light Skin Tone", []string{"biking_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fc\u200d\u2640\ufe0f", "woman biking: Medium-Light Skin Tone", []string{"biking_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fd\u200d\u2640\ufe0f", "woman biking: Medium Skin Tone", []string{"biking_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3fe\u200d\u2640\ufe0f", "woman biking: Medium-Dark Skin Tone", []string{"biking_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b4\U0001f3ff\u200d\u2640\ufe0f", "woman biking: Dark Skin Tone", []string{"biking_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fb\u200d\u2642\ufe0f", "man: blond hair: Light Skin Tone", []string{"blond_haired_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fc\u200d\u2642\ufe0f", "man: blond hair: Medium-Light Skin Tone", []string{"blond_haired_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fd\u200d\u2642\ufe0f", "man: blond hair: Medium Skin Tone", []string{"blond_haired_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fe\u200d\u2642\ufe0f", "man: blond hair: Medium-Dark Skin Tone", []string{"blond_haired_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3ff\u200d\u2642\ufe0f", "man: blond hair: Dark Skin Tone", []string{"blond_haired_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fd", "person: blond hair: Medium Skin Tone", []string{"blond_haired_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fe", "person: blond hair: Medium-Dark Skin Tone", []string{"blond_haired_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3ff", "person: blond hair: Dark Skin Tone", []string{"blond_haired_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fb", "person: blond hair: Light Skin Tone", []string{"blond_haired_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fc", "person: blond hair: Medium-Light Skin Tone", []string{"blond_haired_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fb\u200d\u2640\ufe0f", "woman: blond hair: Light Skin Tone", []string{"blond_haired_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fc\u200d\u2640\ufe0f", "woman: blond hair: Medium-Light Skin Tone", []string{"blond_haired_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fd\u200d\u2640\ufe0f", "woman: blond hair: Medium Skin Tone", []string{"blond_haired_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3fe\u200d\u2640\ufe0f", "woman: blond hair: Medium-Dark Skin Tone", []string{"blond_haired_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f471\U0001f3ff\u200d\u2640\ufe0f", "woman: blond hair: Dark Skin Tone", []string{"blond_haired_woman_Dark_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fb\ufe0f\u200d\u2642\ufe0f", "man bouncing ball: Light Skin Tone", []string{"bouncing_ball_man_Light_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fc\ufe0f\u200d\u2642\ufe0f", "man bouncing ball: Medium-Light Skin Tone", []string{"bouncing_ball_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fd\ufe0f\u200d\u2642\ufe0f", "man bouncing ball: Medium Skin Tone", []string{"bouncing_ball_man_Medium_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fe\ufe0f\u200d\u2642\ufe0f", "man bouncing ball: Medium-Dark Skin Tone", []string{"bouncing_ball_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3ff\ufe0f\u200d\u2642\ufe0f", "man bouncing ball: Dark Skin Tone", []string{"bouncing_ball_man_Dark_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fb\ufe0f", "person bouncing ball: Light Skin Tone", []string{"bouncing_ball_person_Light_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fc\ufe0f", "person bouncing ball: Medium-Light Skin Tone", []string{"bouncing_ball_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fd\ufe0f", "person bouncing ball: Medium Skin Tone", []string{"bouncing_ball_person_Medium_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fe\ufe0f", "person bouncing ball: Medium-Dark Skin Tone", []string{"bouncing_ball_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3ff\ufe0f", "person bouncing ball: Dark Skin Tone", []string{"bouncing_ball_person_Dark_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fe\ufe0f\u200d\u2640\ufe0f", "woman bouncing ball: Medium-Dark Skin Tone", []string{"bouncing_ball_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3ff\ufe0f\u200d\u2640\ufe0f", "woman bouncing ball: Dark Skin Tone", []string{"bouncing_ball_woman_Dark_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fb\ufe0f\u200d\u2640\ufe0f", "woman bouncing ball: Light Skin Tone", []string{"bouncing_ball_woman_Light_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fc\ufe0f\u200d\u2640\ufe0f", "woman bouncing ball: Medium-Light Skin Tone", []string{"bouncing_ball_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u26f9\U0001f3fd\ufe0f\u200d\u2640\ufe0f", "woman bouncing ball: Medium Skin Tone", []string{"bouncing_ball_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fd", "person bowing: Medium Skin Tone", []string{"bow_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fe", "person bowing: Medium-Dark Skin Tone", []string{"bow_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3ff", "person bowing: Dark Skin Tone", []string{"bow_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fb", "person bowing: Light Skin Tone", []string{"bow_Light_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fc", "person bowing: Medium-Light Skin Tone", []string{"bow_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3ff\u200d\u2642\ufe0f", "man bowing: Dark Skin Tone", []string{"bowing_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fb\u200d\u2642\ufe0f", "man bowing: Light Skin Tone", []string{"bowing_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fc\u200d\u2642\ufe0f", "man bowing: Medium-Light Skin Tone", []string{"bowing_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fd\u200d\u2642\ufe0f", "man bowing: Medium Skin Tone", []string{"bowing_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fe\u200d\u2642\ufe0f", "man bowing: Medium-Dark Skin Tone", []string{"bowing_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fb\u200d\u2640\ufe0f", "woman bowing: Light Skin Tone", []string{"bowing_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fc\u200d\u2640\ufe0f", "woman bowing: Medium-Light Skin Tone", []string{"bowing_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fd\u200d\u2640\ufe0f", "woman bowing: Medium Skin Tone", []string{"bowing_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3fe\u200d\u2640\ufe0f", "woman bowing: Medium-Dark Skin Tone", []string{"bowing_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f647\U0001f3ff\u200d\u2640\ufe0f", "woman bowing: Dark Skin Tone", []string{"bowing_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f466\U0001f3fb", "boy: Light Skin Tone", []string{"boy_Light_Skin_Tone"}, "12.0", false}, {"\U0001f466\U0001f3fc", "boy: Medium-Light Skin Tone", []string{"boy_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f466\U0001f3fd", "boy: Medium Skin Tone", []string{"boy_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f466\U0001f3fe", "boy: Medium-Dark Skin Tone", []string{"boy_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f466\U0001f3ff", "boy: Dark Skin Tone", []string{"boy_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f931\U0001f3fb", "breast-feeding: Light Skin Tone", []string{"breast_feeding_Light_Skin_Tone"}, "12.0", false}, {"\U0001f931\U0001f3fc", "breast-feeding: Medium-Light Skin Tone", []string{"breast_feeding_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f931\U0001f3fd", "breast-feeding: Medium Skin Tone", []string{"breast_feeding_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f931\U0001f3fe", "breast-feeding: Medium-Dark Skin Tone", []string{"breast_feeding_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f931\U0001f3ff", "breast-feeding: Dark Skin Tone", []string{"breast_feeding_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f574\U0001f3fb\ufe0f", "person in suit levitating: Light Skin Tone", []string{"business_suit_levitating_Light_Skin_Tone"}, "12.0", false}, {"\U0001f574\U0001f3fc\ufe0f", "person in suit levitating: Medium-Light Skin Tone", []string{"business_suit_levitating_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f574\U0001f3fd\ufe0f", "person in suit levitating: Medium Skin Tone", []string{"business_suit_levitating_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f574\U0001f3fe\ufe0f", "person in suit levitating: Medium-Dark Skin Tone", []string{"business_suit_levitating_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f574\U0001f3ff\ufe0f", "person in suit levitating: Dark Skin Tone", []string{"business_suit_levitating_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f919\U0001f3fb", "call me hand: Light Skin Tone", []string{"call_me_hand_Light_Skin_Tone"}, "12.0", false}, {"\U0001f919\U0001f3fc", "call me hand: Medium-Light Skin Tone", []string{"call_me_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f919\U0001f3fd", "call me hand: Medium Skin Tone", []string{"call_me_hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f919\U0001f3fe", "call me hand: Medium-Dark Skin Tone", []string{"call_me_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f919\U0001f3ff", "call me hand: Dark Skin Tone", []string{"call_me_hand_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3ff", "person cartwheeling: Dark Skin Tone", []string{"cartwheeling_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fb", "person cartwheeling: Light Skin Tone", []string{"cartwheeling_Light_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fc", "person cartwheeling: Medium-Light Skin Tone", []string{"cartwheeling_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fd", "person cartwheeling: Medium Skin Tone", []string{"cartwheeling_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fe", "person cartwheeling: Medium-Dark Skin Tone", []string{"cartwheeling_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d2\U0001f3fb", "child: Light Skin Tone", []string{"child_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d2\U0001f3fc", "child: Medium-Light Skin Tone", []string{"child_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d2\U0001f3fd", "child: Medium Skin Tone", []string{"child_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d2\U0001f3fe", "child: Medium-Dark Skin Tone", []string{"child_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d2\U0001f3ff", "child: Dark Skin Tone", []string{"child_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44f\U0001f3fd", "clapping hands: Medium Skin Tone", []string{"clap_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f44f\U0001f3fe", "clapping hands: Medium-Dark Skin Tone", []string{"clap_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44f\U0001f3ff", "clapping hands: Dark Skin Tone", []string{"clap_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44f\U0001f3fb", "clapping hands: Light Skin Tone", []string{"clap_Light_Skin_Tone"}, "12.0", false}, {"\U0001f44f\U0001f3fc", "clapping hands: Medium-Light Skin Tone", []string{"clap_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fb", "person climbing: Light Skin Tone", []string{"climbing_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fc", "person climbing: Medium-Light Skin Tone", []string{"climbing_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fd", "person climbing: Medium Skin Tone", []string{"climbing_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fe", "person climbing: Medium-Dark Skin Tone", []string{"climbing_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3ff", "person climbing: Dark Skin Tone", []string{"climbing_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3ff\u200d\u2642\ufe0f", "man climbing: Dark Skin Tone", []string{"climbing_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fb\u200d\u2642\ufe0f", "man climbing: Light Skin Tone", []string{"climbing_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fc\u200d\u2642\ufe0f", "man climbing: Medium-Light Skin Tone", []string{"climbing_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fd\u200d\u2642\ufe0f", "man climbing: Medium Skin Tone", []string{"climbing_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fe\u200d\u2642\ufe0f", "man climbing: Medium-Dark Skin Tone", []string{"climbing_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fb\u200d\u2640\ufe0f", "woman climbing: Light Skin Tone", []string{"climbing_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fc\u200d\u2640\ufe0f", "woman climbing: Medium-Light Skin Tone", []string{"climbing_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fd\u200d\u2640\ufe0f", "woman climbing: Medium Skin Tone", []string{"climbing_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3fe\u200d\u2640\ufe0f", "woman climbing: Medium-Dark Skin Tone", []string{"climbing_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d7\U0001f3ff\u200d\u2640\ufe0f", "woman climbing: Dark Skin Tone", []string{"climbing_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fd", "construction worker: Medium Skin Tone", []string{"construction_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fe", "construction worker: Medium-Dark Skin Tone", []string{"construction_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3ff", "construction worker: Dark Skin Tone", []string{"construction_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fb", "construction worker: Light Skin Tone", []string{"construction_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fc", "construction worker: Medium-Light Skin Tone", []string{"construction_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3ff\u200d\u2642\ufe0f", "man construction worker: Dark Skin Tone", []string{"construction_worker_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fb\u200d\u2642\ufe0f", "man construction worker: Light Skin Tone", []string{"construction_worker_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fc\u200d\u2642\ufe0f", "man construction worker: Medium-Light Skin Tone", []string{"construction_worker_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fd\u200d\u2642\ufe0f", "man construction worker: Medium Skin Tone", []string{"construction_worker_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fe\u200d\u2642\ufe0f", "man construction worker: Medium-Dark Skin Tone", []string{"construction_worker_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3ff\u200d\u2640\ufe0f", "woman construction worker: Dark Skin Tone", []string{"construction_worker_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fb\u200d\u2640\ufe0f", "woman construction worker: Light Skin Tone", []string{"construction_worker_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fc\u200d\u2640\ufe0f", "woman construction worker: Medium-Light Skin Tone", []string{"construction_worker_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fd\u200d\u2640\ufe0f", "woman construction worker: Medium Skin Tone", []string{"construction_worker_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f477\U0001f3fe\u200d\u2640\ufe0f", "woman construction worker: Medium-Dark Skin Tone", []string{"construction_worker_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f373", "cook: Light Skin Tone", []string{"cook_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f373", "cook: Medium-Light Skin Tone", []string{"cook_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f373", "cook: Medium Skin Tone", []string{"cook_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f373", "cook: Medium-Dark Skin Tone", []string{"cook_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f373", "cook: Dark Skin Tone", []string{"cook_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46b\U0001f3fb", "woman and man holding hands: Light Skin Tone", []string{"couple_Light_Skin_Tone"}, "12.0", false}, {"\U0001f46b\U0001f3fc", "woman and man holding hands: Medium-Light Skin Tone", []string{"couple_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f46b\U0001f3fd", "woman and man holding hands: Medium Skin Tone", []string{"couple_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f46b\U0001f3fe", "woman and man holding hands: Medium-Dark Skin Tone", []string{"couple_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46b\U0001f3ff", "woman and man holding hands: Dark Skin Tone", []string{"couple_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f491\U0001f3fd", "couple with heart: Medium Skin Tone", []string{"couple_with_heart_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f491\U0001f3fe", "couple with heart: Medium-Dark Skin Tone", []string{"couple_with_heart_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f491\U0001f3ff", "couple with heart: Dark Skin Tone", []string{"couple_with_heart_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f491\U0001f3fb", "couple with heart: Light Skin Tone", []string{"couple_with_heart_Light_Skin_Tone"}, "12.0", false}, {"\U0001f491\U0001f3fc", "couple with heart: Medium-Light Skin Tone", []string{"couple_with_heart_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: man, man: Medium Skin Tone", []string{"couple_with_heart_man_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: man, man: Medium-Dark Skin Tone", []string{"couple_with_heart_man_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: man, man: Dark Skin Tone", []string{"couple_with_heart_man_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: man, man: Light Skin Tone", []string{"couple_with_heart_man_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: man, man: Medium-Light Skin Tone", []string{"couple_with_heart_man_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: woman, man: Light Skin Tone", []string{"couple_with_heart_woman_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: woman, man: Medium-Light Skin Tone", []string{"couple_with_heart_woman_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: woman, man: Medium Skin Tone", []string{"couple_with_heart_woman_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: woman, man: Medium-Dark Skin Tone", []string{"couple_with_heart_woman_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\u2764\ufe0f\u200d\U0001f468", "couple with heart: woman, man: Dark Skin Tone", []string{"couple_with_heart_woman_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\u2764\ufe0f\u200d\U0001f469", "couple with heart: woman, woman: Medium Skin Tone", []string{"couple_with_heart_woman_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\u2764\ufe0f\u200d\U0001f469", "couple with heart: woman, woman: Medium-Dark Skin Tone", []string{"couple_with_heart_woman_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\u2764\ufe0f\u200d\U0001f469", "couple with heart: woman, woman: Dark Skin Tone", []string{"couple_with_heart_woman_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\u2764\ufe0f\u200d\U0001f469", "couple with heart: woman, woman: Light Skin Tone", []string{"couple_with_heart_woman_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\u2764\ufe0f\u200d\U0001f469", "couple with heart: woman, woman: Medium-Light Skin Tone", []string{"couple_with_heart_woman_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f48f\U0001f3fe", "kiss: Medium-Dark Skin Tone", []string{"couplekiss_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f48f\U0001f3ff", "kiss: Dark Skin Tone", []string{"couplekiss_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f48f\U0001f3fb", "kiss: Light Skin Tone", []string{"couplekiss_Light_Skin_Tone"}, "12.0", false}, {"\U0001f48f\U0001f3fc", "kiss: Medium-Light Skin Tone", []string{"couplekiss_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f48f\U0001f3fd", "kiss: Medium Skin Tone", []string{"couplekiss_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: man, man: Dark Skin Tone", []string{"couplekiss_man_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: man, man: Light Skin Tone", []string{"couplekiss_man_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: man, man: Medium-Light Skin Tone", []string{"couplekiss_man_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: man, man: Medium Skin Tone", []string{"couplekiss_man_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: man, man: Medium-Dark Skin Tone", []string{"couplekiss_man_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: woman, man: Light Skin Tone", []string{"couplekiss_man_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: woman, man: Medium-Light Skin Tone", []string{"couplekiss_man_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: woman, man: Medium Skin Tone", []string{"couplekiss_man_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: woman, man: Medium-Dark Skin Tone", []string{"couplekiss_man_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f468", "kiss: woman, man: Dark Skin Tone", []string{"couplekiss_man_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f469", "kiss: woman, woman: Light Skin Tone", []string{"couplekiss_woman_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f469", "kiss: woman, woman: Medium-Light Skin Tone", []string{"couplekiss_woman_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f469", "kiss: woman, woman: Medium Skin Tone", []string{"couplekiss_woman_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f469", "kiss: woman, woman: Medium-Dark Skin Tone", []string{"couplekiss_woman_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\u2764\ufe0f\u200d\U0001f48b\u200d\U0001f469", "kiss: woman, woman: Dark Skin Tone", []string{"couplekiss_woman_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91e\U0001f3fe", "crossed fingers: Medium-Dark Skin Tone", []string{"crossed_fingers_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91e\U0001f3ff", "crossed fingers: Dark Skin Tone", []string{"crossed_fingers_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91e\U0001f3fb", "crossed fingers: Light Skin Tone", []string{"crossed_fingers_Light_Skin_Tone"}, "12.0", false}, {"\U0001f91e\U0001f3fc", "crossed fingers: Medium-Light Skin Tone", []string{"crossed_fingers_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f91e\U0001f3fd", "crossed fingers: Medium Skin Tone", []string{"crossed_fingers_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f9b1", "man: curly hair: Dark Skin Tone", []string{"curly_haired_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f9b1", "man: curly hair: Light Skin Tone", []string{"curly_haired_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f9b1", "man: curly hair: Medium-Light Skin Tone", []string{"curly_haired_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f9b1", "man: curly hair: Medium Skin Tone", []string{"curly_haired_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f9b1", "man: curly hair: Medium-Dark Skin Tone", []string{"curly_haired_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f9b1", "woman: curly hair: Dark Skin Tone", []string{"curly_haired_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f9b1", "woman: curly hair: Light Skin Tone", []string{"curly_haired_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f9b1", "woman: curly hair: Medium-Light Skin Tone", []string{"curly_haired_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f9b1", "woman: curly hair: Medium Skin Tone", []string{"curly_haired_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f9b1", "woman: curly hair: Medium-Dark Skin Tone", []string{"curly_haired_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3ff\u200d\u2642\ufe0f", "deaf man: Dark Skin Tone", []string{"deaf_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fb\u200d\u2642\ufe0f", "deaf man: Light Skin Tone", []string{"deaf_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fc\u200d\u2642\ufe0f", "deaf man: Medium-Light Skin Tone", []string{"deaf_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fd\u200d\u2642\ufe0f", "deaf man: Medium Skin Tone", []string{"deaf_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fe\u200d\u2642\ufe0f", "deaf man: Medium-Dark Skin Tone", []string{"deaf_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fb", "deaf person: Light Skin Tone", []string{"deaf_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fc", "deaf person: Medium-Light Skin Tone", []string{"deaf_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fd", "deaf person: Medium Skin Tone", []string{"deaf_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fe", "deaf person: Medium-Dark Skin Tone", []string{"deaf_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3ff", "deaf person: Dark Skin Tone", []string{"deaf_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fe\u200d\u2640\ufe0f", "deaf woman: Medium-Dark Skin Tone", []string{"deaf_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3ff\u200d\u2640\ufe0f", "deaf woman: Dark Skin Tone", []string{"deaf_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fb\u200d\u2640\ufe0f", "deaf woman: Light Skin Tone", []string{"deaf_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fc\u200d\u2640\ufe0f", "deaf woman: Medium-Light Skin Tone", []string{"deaf_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cf\U0001f3fd\u200d\u2640\ufe0f", "deaf woman: Medium Skin Tone", []string{"deaf_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fb\ufe0f", "detective: Light Skin Tone", []string{"detective_Light_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fc\ufe0f", "detective: Medium-Light Skin Tone", []string{"detective_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fd\ufe0f", "detective: Medium Skin Tone", []string{"detective_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fe\ufe0f", "detective: Medium-Dark Skin Tone", []string{"detective_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3ff\ufe0f", "detective: Dark Skin Tone", []string{"detective_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f442\U0001f3fe", "ear: Medium-Dark Skin Tone", []string{"ear_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f442\U0001f3ff", "ear: Dark Skin Tone", []string{"ear_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f442\U0001f3fb", "ear: Light Skin Tone", []string{"ear_Light_Skin_Tone"}, "12.0", false}, {"\U0001f442\U0001f3fc", "ear: Medium-Light Skin Tone", []string{"ear_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f442\U0001f3fd", "ear: Medium Skin Tone", []string{"ear_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9bb\U0001f3fe", "ear with hearing aid: Medium-Dark Skin Tone", []string{"ear_with_hearing_aid_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9bb\U0001f3ff", "ear with hearing aid: Dark Skin Tone", []string{"ear_with_hearing_aid_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9bb\U0001f3fb", "ear with hearing aid: Light Skin Tone", []string{"ear_with_hearing_aid_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9bb\U0001f3fc", "ear with hearing aid: Medium-Light Skin Tone", []string{"ear_with_hearing_aid_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9bb\U0001f3fd", "ear with hearing aid: Medium Skin Tone", []string{"ear_with_hearing_aid_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fb", "elf: Light Skin Tone", []string{"elf_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fc", "elf: Medium-Light Skin Tone", []string{"elf_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fd", "elf: Medium Skin Tone", []string{"elf_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fe", "elf: Medium-Dark Skin Tone", []string{"elf_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3ff", "elf: Dark Skin Tone", []string{"elf_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fb\u200d\u2642\ufe0f", "man elf: Light Skin Tone", []string{"elf_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fc\u200d\u2642\ufe0f", "man elf: Medium-Light Skin Tone", []string{"elf_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fd\u200d\u2642\ufe0f", "man elf: Medium Skin Tone", []string{"elf_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fe\u200d\u2642\ufe0f", "man elf: Medium-Dark Skin Tone", []string{"elf_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3ff\u200d\u2642\ufe0f", "man elf: Dark Skin Tone", []string{"elf_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fb\u200d\u2640\ufe0f", "woman elf: Light Skin Tone", []string{"elf_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fc\u200d\u2640\ufe0f", "woman elf: Medium-Light Skin Tone", []string{"elf_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fd\u200d\u2640\ufe0f", "woman elf: Medium Skin Tone", []string{"elf_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3fe\u200d\u2640\ufe0f", "woman elf: Medium-Dark Skin Tone", []string{"elf_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dd\U0001f3ff\u200d\u2640\ufe0f", "woman elf: Dark Skin Tone", []string{"elf_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fb", "person facepalming: Light Skin Tone", []string{"facepalm_Light_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fc", "person facepalming: Medium-Light Skin Tone", []string{"facepalm_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fd", "person facepalming: Medium Skin Tone", []string{"facepalm_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fe", "person facepalming: Medium-Dark Skin Tone", []string{"facepalm_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3ff", "person facepalming: Dark Skin Tone", []string{"facepalm_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f3ed", "factory worker: Light Skin Tone", []string{"factory_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f3ed", "factory worker: Medium-Light Skin Tone", []string{"factory_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f3ed", "factory worker: Medium Skin Tone", []string{"factory_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f3ed", "factory worker: Medium-Dark Skin Tone", []string{"factory_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f3ed", "factory worker: Dark Skin Tone", []string{"factory_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fe", "fairy: Medium-Dark Skin Tone", []string{"fairy_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3ff", "fairy: Dark Skin Tone", []string{"fairy_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fb", "fairy: Light Skin Tone", []string{"fairy_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fc", "fairy: Medium-Light Skin Tone", []string{"fairy_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fd", "fairy: Medium Skin Tone", []string{"fairy_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fb\u200d\u2642\ufe0f", "man fairy: Light Skin Tone", []string{"fairy_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fc\u200d\u2642\ufe0f", "man fairy: Medium-Light Skin Tone", []string{"fairy_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fd\u200d\u2642\ufe0f", "man fairy: Medium Skin Tone", []string{"fairy_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fe\u200d\u2642\ufe0f", "man fairy: Medium-Dark Skin Tone", []string{"fairy_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3ff\u200d\u2642\ufe0f", "man fairy: Dark Skin Tone", []string{"fairy_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3ff\u200d\u2640\ufe0f", "woman fairy: Dark Skin Tone", []string{"fairy_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fb\u200d\u2640\ufe0f", "woman fairy: Light Skin Tone", []string{"fairy_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fc\u200d\u2640\ufe0f", "woman fairy: Medium-Light Skin Tone", []string{"fairy_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fd\u200d\u2640\ufe0f", "woman fairy: Medium Skin Tone", []string{"fairy_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9da\U0001f3fe\u200d\u2640\ufe0f", "woman fairy: Medium-Dark Skin Tone", []string{"fairy_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f33e", "farmer: Medium Skin Tone", []string{"farmer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f33e", "farmer: Medium-Dark Skin Tone", []string{"farmer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f33e", "farmer: Dark Skin Tone", []string{"farmer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f33e", "farmer: Light Skin Tone", []string{"farmer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f33e", "farmer: Medium-Light Skin Tone", []string{"farmer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3ff\ufe0f\u200d\u2640\ufe0f", "woman detective: Dark Skin Tone", []string{"female_detective_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fb\ufe0f\u200d\u2640\ufe0f", "woman detective: Light Skin Tone", []string{"female_detective_Light_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fc\ufe0f\u200d\u2640\ufe0f", "woman detective: Medium-Light Skin Tone", []string{"female_detective_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fd\ufe0f\u200d\u2640\ufe0f", "woman detective: Medium Skin Tone", []string{"female_detective_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fe\ufe0f\u200d\u2640\ufe0f", "woman detective: Medium-Dark Skin Tone", []string{"female_detective_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f692", "firefighter: Medium-Light Skin Tone", []string{"firefighter_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f692", "firefighter: Medium Skin Tone", []string{"firefighter_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f692", "firefighter: Medium-Dark Skin Tone", []string{"firefighter_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f692", "firefighter: Dark Skin Tone", []string{"firefighter_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f692", "firefighter: Light Skin Tone", []string{"firefighter_Light_Skin_Tone"}, "12.0", false}, {"\U0001f91b\U0001f3fb", "left-facing fist: Light Skin Tone", []string{"fist_left_Light_Skin_Tone"}, "12.0", false}, {"\U0001f91b\U0001f3fc", "left-facing fist: Medium-Light Skin Tone", []string{"fist_left_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f91b\U0001f3fd", "left-facing fist: Medium Skin Tone", []string{"fist_left_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f91b\U0001f3fe", "left-facing fist: Medium-Dark Skin Tone", []string{"fist_left_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91b\U0001f3ff", "left-facing fist: Dark Skin Tone", []string{"fist_left_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44a\U0001f3fb", "oncoming fist: Light Skin Tone", []string{"fist_oncoming_Light_Skin_Tone"}, "12.0", false}, {"\U0001f44a\U0001f3fc", "oncoming fist: Medium-Light Skin Tone", []string{"fist_oncoming_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f44a\U0001f3fd", "oncoming fist: Medium Skin Tone", []string{"fist_oncoming_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f44a\U0001f3fe", "oncoming fist: Medium-Dark Skin Tone", []string{"fist_oncoming_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44a\U0001f3ff", "oncoming fist: Dark Skin Tone", []string{"fist_oncoming_Dark_Skin_Tone"}, "12.0", false}, {"\u270a\U0001f3fb", "raised fist: Light Skin Tone", []string{"fist_raised_Light_Skin_Tone"}, "12.0", false}, {"\u270a\U0001f3fc", "raised fist: Medium-Light Skin Tone", []string{"fist_raised_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u270a\U0001f3fd", "raised fist: Medium Skin Tone", []string{"fist_raised_Medium_Skin_Tone"}, "12.0", false}, {"\u270a\U0001f3fe", "raised fist: Medium-Dark Skin Tone", []string{"fist_raised_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u270a\U0001f3ff", "raised fist: Dark Skin Tone", []string{"fist_raised_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91c\U0001f3fb", "right-facing fist: Light Skin Tone", []string{"fist_right_Light_Skin_Tone"}, "12.0", false}, {"\U0001f91c\U0001f3fc", "right-facing fist: Medium-Light Skin Tone", []string{"fist_right_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f91c\U0001f3fd", "right-facing fist: Medium Skin Tone", []string{"fist_right_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f91c\U0001f3fe", "right-facing fist: Medium-Dark Skin Tone", []string{"fist_right_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91c\U0001f3ff", "right-facing fist: Dark Skin Tone", []string{"fist_right_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b6\U0001f3fc", "foot: Medium-Light Skin Tone", []string{"foot_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b6\U0001f3fd", "foot: Medium Skin Tone", []string{"foot_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9b6\U0001f3fe", "foot: Medium-Dark Skin Tone", []string{"foot_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b6\U0001f3ff", "foot: Dark Skin Tone", []string{"foot_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b6\U0001f3fb", "foot: Light Skin Tone", []string{"foot_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fd\u200d\u2642\ufe0f", "man frowning: Medium Skin Tone", []string{"frowning_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fe\u200d\u2642\ufe0f", "man frowning: Medium-Dark Skin Tone", []string{"frowning_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3ff\u200d\u2642\ufe0f", "man frowning: Dark Skin Tone", []string{"frowning_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fb\u200d\u2642\ufe0f", "man frowning: Light Skin Tone", []string{"frowning_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fc\u200d\u2642\ufe0f", "man frowning: Medium-Light Skin Tone", []string{"frowning_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fb", "person frowning: Light Skin Tone", []string{"frowning_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fc", "person frowning: Medium-Light Skin Tone", []string{"frowning_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fd", "person frowning: Medium Skin Tone", []string{"frowning_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fe", "person frowning: Medium-Dark Skin Tone", []string{"frowning_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3ff", "person frowning: Dark Skin Tone", []string{"frowning_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fb\u200d\u2640\ufe0f", "woman frowning: Light Skin Tone", []string{"frowning_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fc\u200d\u2640\ufe0f", "woman frowning: Medium-Light Skin Tone", []string{"frowning_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fd\u200d\u2640\ufe0f", "woman frowning: Medium Skin Tone", []string{"frowning_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3fe\u200d\u2640\ufe0f", "woman frowning: Medium-Dark Skin Tone", []string{"frowning_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64d\U0001f3ff\u200d\u2640\ufe0f", "woman frowning: Dark Skin Tone", []string{"frowning_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f467\U0001f3fd", "girl: Medium Skin Tone", []string{"girl_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f467\U0001f3fe", "girl: Medium-Dark Skin Tone", []string{"girl_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f467\U0001f3ff", "girl: Dark Skin Tone", []string{"girl_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f467\U0001f3fb", "girl: Light Skin Tone", []string{"girl_Light_Skin_Tone"}, "12.0", false}, {"\U0001f467\U0001f3fc", "girl: Medium-Light Skin Tone", []string{"girl_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3ff\ufe0f", "person golfing: Dark Skin Tone", []string{"golfing_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fb\ufe0f", "person golfing: Light Skin Tone", []string{"golfing_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fc\ufe0f", "person golfing: Medium-Light Skin Tone", []string{"golfing_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fd\ufe0f", "person golfing: Medium Skin Tone", []string{"golfing_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fe\ufe0f", "person golfing: Medium-Dark Skin Tone", []string{"golfing_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fb\ufe0f\u200d\u2642\ufe0f", "man golfing: Light Skin Tone", []string{"golfing_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fc\ufe0f\u200d\u2642\ufe0f", "man golfing: Medium-Light Skin Tone", []string{"golfing_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fd\ufe0f\u200d\u2642\ufe0f", "man golfing: Medium Skin Tone", []string{"golfing_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fe\ufe0f\u200d\u2642\ufe0f", "man golfing: Medium-Dark Skin Tone", []string{"golfing_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3ff\ufe0f\u200d\u2642\ufe0f", "man golfing: Dark Skin Tone", []string{"golfing_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fd\ufe0f\u200d\u2640\ufe0f", "woman golfing: Medium Skin Tone", []string{"golfing_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fe\ufe0f\u200d\u2640\ufe0f", "woman golfing: Medium-Dark Skin Tone", []string{"golfing_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3ff\ufe0f\u200d\u2640\ufe0f", "woman golfing: Dark Skin Tone", []string{"golfing_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fb\ufe0f\u200d\u2640\ufe0f", "woman golfing: Light Skin Tone", []string{"golfing_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cc\U0001f3fc\ufe0f\u200d\u2640\ufe0f", "woman golfing: Medium-Light Skin Tone", []string{"golfing_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fb", "guard: Light Skin Tone", []string{"guard_Light_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fc", "guard: Medium-Light Skin Tone", []string{"guard_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fd", "guard: Medium Skin Tone", []string{"guard_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fe", "guard: Medium-Dark Skin Tone", []string{"guard_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3ff", "guard: Dark Skin Tone", []string{"guard_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fd\u200d\u2642\ufe0f", "man guard: Medium Skin Tone", []string{"guardsman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fe\u200d\u2642\ufe0f", "man guard: Medium-Dark Skin Tone", []string{"guardsman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3ff\u200d\u2642\ufe0f", "man guard: Dark Skin Tone", []string{"guardsman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fb\u200d\u2642\ufe0f", "man guard: Light Skin Tone", []string{"guardsman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fc\u200d\u2642\ufe0f", "man guard: Medium-Light Skin Tone", []string{"guardsman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fb\u200d\u2640\ufe0f", "woman guard: Light Skin Tone", []string{"guardswoman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fc\u200d\u2640\ufe0f", "woman guard: Medium-Light Skin Tone", []string{"guardswoman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fd\u200d\u2640\ufe0f", "woman guard: Medium Skin Tone", []string{"guardswoman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3fe\u200d\u2640\ufe0f", "woman guard: Medium-Dark Skin Tone", []string{"guardswoman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f482\U0001f3ff\u200d\u2640\ufe0f", "woman guard: Dark Skin Tone", []string{"guardswoman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fe", "person getting haircut: Medium-Dark Skin Tone", []string{"haircut_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3ff", "person getting haircut: Dark Skin Tone", []string{"haircut_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fb", "person getting haircut: Light Skin Tone", []string{"haircut_Light_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fc", "person getting haircut: Medium-Light Skin Tone", []string{"haircut_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fd", "person getting haircut: Medium Skin Tone", []string{"haircut_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fc\u200d\u2642\ufe0f", "man getting haircut: Medium-Light Skin Tone", []string{"haircut_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fd\u200d\u2642\ufe0f", "man getting haircut: Medium Skin Tone", []string{"haircut_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fe\u200d\u2642\ufe0f", "man getting haircut: Medium-Dark Skin Tone", []string{"haircut_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3ff\u200d\u2642\ufe0f", "man getting haircut: Dark Skin Tone", []string{"haircut_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fb\u200d\u2642\ufe0f", "man getting haircut: Light Skin Tone", []string{"haircut_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3ff\u200d\u2640\ufe0f", "woman getting haircut: Dark Skin Tone", []string{"haircut_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fb\u200d\u2640\ufe0f", "woman getting haircut: Light Skin Tone", []string{"haircut_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fc\u200d\u2640\ufe0f", "woman getting haircut: Medium-Light Skin Tone", []string{"haircut_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fd\u200d\u2640\ufe0f", "woman getting haircut: Medium Skin Tone", []string{"haircut_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f487\U0001f3fe\u200d\u2640\ufe0f", "woman getting haircut: Medium-Dark Skin Tone", []string{"haircut_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u270b\U0001f3ff", "raised hand: Dark Skin Tone", []string{"hand_Dark_Skin_Tone"}, "12.0", false}, {"\u270b\U0001f3fb", "raised hand: Light Skin Tone", []string{"hand_Light_Skin_Tone"}, "12.0", false}, {"\u270b\U0001f3fc", "raised hand: Medium-Light Skin Tone", []string{"hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u270b\U0001f3fd", "raised hand: Medium Skin Tone", []string{"hand_Medium_Skin_Tone"}, "12.0", false}, {"\u270b\U0001f3fe", "raised hand: Medium-Dark Skin Tone", []string{"hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fd", "person playing handball: Medium Skin Tone", []string{"handball_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fe", "person playing handball: Medium-Dark Skin Tone", []string{"handball_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3ff", "person playing handball: Dark Skin Tone", []string{"handball_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fb", "person playing handball: Light Skin Tone", []string{"handball_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fc", "person playing handball: Medium-Light Skin Tone", []string{"handball_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\u2695\ufe0f", "health worker: Light Skin Tone", []string{"health_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\u2695\ufe0f", "health worker: Medium-Light Skin Tone", []string{"health_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\u2695\ufe0f", "health worker: Medium Skin Tone", []string{"health_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\u2695\ufe0f", "health worker: Medium-Dark Skin Tone", []string{"health_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\u2695\ufe0f", "health worker: Dark Skin Tone", []string{"health_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c7\U0001f3fb", "horse racing: Light Skin Tone", []string{"horse_racing_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c7\U0001f3fc", "horse racing: Medium-Light Skin Tone", []string{"horse_racing_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c7\U0001f3fd", "horse racing: Medium Skin Tone", []string{"horse_racing_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3c7\U0001f3fe", "horse racing: Medium-Dark Skin Tone", []string{"horse_racing_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c7\U0001f3ff", "horse racing: Dark Skin Tone", []string{"horse_racing_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\u2696\ufe0f", "judge: Dark Skin Tone", []string{"judge_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\u2696\ufe0f", "judge: Light Skin Tone", []string{"judge_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\u2696\ufe0f", "judge: Medium-Light Skin Tone", []string{"judge_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\u2696\ufe0f", "judge: Medium Skin Tone", []string{"judge_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\u2696\ufe0f", "judge: Medium-Dark Skin Tone", []string{"judge_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fd", "person juggling: Medium Skin Tone", []string{"juggling_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fe", "person juggling: Medium-Dark Skin Tone", []string{"juggling_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3ff", "person juggling: Dark Skin Tone", []string{"juggling_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fb", "person juggling: Light Skin Tone", []string{"juggling_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fc", "person juggling: Medium-Light Skin Tone", []string{"juggling_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fd\u200d\u2642\ufe0f", "man kneeling: Medium Skin Tone", []string{"kneeling_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fe\u200d\u2642\ufe0f", "man kneeling: Medium-Dark Skin Tone", []string{"kneeling_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3ff\u200d\u2642\ufe0f", "man kneeling: Dark Skin Tone", []string{"kneeling_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fb\u200d\u2642\ufe0f", "man kneeling: Light Skin Tone", []string{"kneeling_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fc\u200d\u2642\ufe0f", "man kneeling: Medium-Light Skin Tone", []string{"kneeling_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fb", "person kneeling: Light Skin Tone", []string{"kneeling_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fc", "person kneeling: Medium-Light Skin Tone", []string{"kneeling_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fd", "person kneeling: Medium Skin Tone", []string{"kneeling_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fe", "person kneeling: Medium-Dark Skin Tone", []string{"kneeling_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3ff", "person kneeling: Dark Skin Tone", []string{"kneeling_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fc\u200d\u2640\ufe0f", "woman kneeling: Medium-Light Skin Tone", []string{"kneeling_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fd\u200d\u2640\ufe0f", "woman kneeling: Medium Skin Tone", []string{"kneeling_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fe\u200d\u2640\ufe0f", "woman kneeling: Medium-Dark Skin Tone", []string{"kneeling_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3ff\u200d\u2640\ufe0f", "woman kneeling: Dark Skin Tone", []string{"kneeling_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9ce\U0001f3fb\u200d\u2640\ufe0f", "woman kneeling: Light Skin Tone", []string{"kneeling_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b5\U0001f3fb", "leg: Light Skin Tone", []string{"leg_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b5\U0001f3fc", "leg: Medium-Light Skin Tone", []string{"leg_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b5\U0001f3fd", "leg: Medium Skin Tone", []string{"leg_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9b5\U0001f3fe", "leg: Medium-Dark Skin Tone", []string{"leg_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b5\U0001f3ff", "leg: Dark Skin Tone", []string{"leg_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fb", "person in lotus position: Light Skin Tone", []string{"lotus_position_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fc", "person in lotus position: Medium-Light Skin Tone", []string{"lotus_position_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fd", "person in lotus position: Medium Skin Tone", []string{"lotus_position_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fe", "person in lotus position: Medium-Dark Skin Tone", []string{"lotus_position_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3ff", "person in lotus position: Dark Skin Tone", []string{"lotus_position_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3ff\u200d\u2642\ufe0f", "man in lotus position: Dark Skin Tone", []string{"lotus_position_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fb\u200d\u2642\ufe0f", "man in lotus position: Light Skin Tone", []string{"lotus_position_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fc\u200d\u2642\ufe0f", "man in lotus position: Medium-Light Skin Tone", []string{"lotus_position_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fd\u200d\u2642\ufe0f", "man in lotus position: Medium Skin Tone", []string{"lotus_position_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fe\u200d\u2642\ufe0f", "man in lotus position: Medium-Dark Skin Tone", []string{"lotus_position_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fb\u200d\u2640\ufe0f", "woman in lotus position: Light Skin Tone", []string{"lotus_position_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fc\u200d\u2640\ufe0f", "woman in lotus position: Medium-Light Skin Tone", []string{"lotus_position_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fd\u200d\u2640\ufe0f", "woman in lotus position: Medium Skin Tone", []string{"lotus_position_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3fe\u200d\u2640\ufe0f", "woman in lotus position: Medium-Dark Skin Tone", []string{"lotus_position_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d8\U0001f3ff\u200d\u2640\ufe0f", "woman in lotus position: Dark Skin Tone", []string{"lotus_position_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91f\U0001f3ff", "love-you gesture: Dark Skin Tone", []string{"love_you_gesture_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91f\U0001f3fb", "love-you gesture: Light Skin Tone", []string{"love_you_gesture_Light_Skin_Tone"}, "12.0", false}, {"\U0001f91f\U0001f3fc", "love-you gesture: Medium-Light Skin Tone", []string{"love_you_gesture_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f91f\U0001f3fd", "love-you gesture: Medium Skin Tone", []string{"love_you_gesture_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f91f\U0001f3fe", "love-you gesture: Medium-Dark Skin Tone", []string{"love_you_gesture_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fb", "mage: Light Skin Tone", []string{"mage_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fc", "mage: Medium-Light Skin Tone", []string{"mage_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fd", "mage: Medium Skin Tone", []string{"mage_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fe", "mage: Medium-Dark Skin Tone", []string{"mage_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3ff", "mage: Dark Skin Tone", []string{"mage_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fb\u200d\u2642\ufe0f", "man mage: Light Skin Tone", []string{"mage_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fc\u200d\u2642\ufe0f", "man mage: Medium-Light Skin Tone", []string{"mage_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fd\u200d\u2642\ufe0f", "man mage: Medium Skin Tone", []string{"mage_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fe\u200d\u2642\ufe0f", "man mage: Medium-Dark Skin Tone", []string{"mage_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3ff\u200d\u2642\ufe0f", "man mage: Dark Skin Tone", []string{"mage_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fd\u200d\u2640\ufe0f", "woman mage: Medium Skin Tone", []string{"mage_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fe\u200d\u2640\ufe0f", "woman mage: Medium-Dark Skin Tone", []string{"mage_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3ff\u200d\u2640\ufe0f", "woman mage: Dark Skin Tone", []string{"mage_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fb\u200d\u2640\ufe0f", "woman mage: Light Skin Tone", []string{"mage_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d9\U0001f3fc\u200d\u2640\ufe0f", "woman mage: Medium-Light Skin Tone", []string{"mage_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fb\ufe0f\u200d\u2642\ufe0f", "man detective: Light Skin Tone", []string{"male_detective_Light_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fc\ufe0f\u200d\u2642\ufe0f", "man detective: Medium-Light Skin Tone", []string{"male_detective_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fd\ufe0f\u200d\u2642\ufe0f", "man detective: Medium Skin Tone", []string{"male_detective_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3fe\ufe0f\u200d\u2642\ufe0f", "man detective: Medium-Dark Skin Tone", []string{"male_detective_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f575\U0001f3ff\ufe0f\u200d\u2642\ufe0f", "man detective: Dark Skin Tone", []string{"male_detective_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb", "man: Light Skin Tone", []string{"man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc", "man: Medium-Light Skin Tone", []string{"man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd", "man: Medium Skin Tone", []string{"man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe", "man: Medium-Dark Skin Tone", []string{"man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff", "man: Dark Skin Tone", []string{"man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f3a8", "man artist: Medium Skin Tone", []string{"man_artist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f3a8", "man artist: Medium-Dark Skin Tone", []string{"man_artist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f3a8", "man artist: Dark Skin Tone", []string{"man_artist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f3a8", "man artist: Light Skin Tone", []string{"man_artist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f3a8", "man artist: Medium-Light Skin Tone", []string{"man_artist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f680", "man astronaut: Medium-Light Skin Tone", []string{"man_astronaut_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f680", "man astronaut: Medium Skin Tone", []string{"man_astronaut_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f680", "man astronaut: Medium-Dark Skin Tone", []string{"man_astronaut_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f680", "man astronaut: Dark Skin Tone", []string{"man_astronaut_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f680", "man astronaut: Light Skin Tone", []string{"man_astronaut_Light_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fb\u200d\u2642\ufe0f", "man cartwheeling: Light Skin Tone", []string{"man_cartwheeling_Light_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fc\u200d\u2642\ufe0f", "man cartwheeling: Medium-Light Skin Tone", []string{"man_cartwheeling_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fd\u200d\u2642\ufe0f", "man cartwheeling: Medium Skin Tone", []string{"man_cartwheeling_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fe\u200d\u2642\ufe0f", "man cartwheeling: Medium-Dark Skin Tone", []string{"man_cartwheeling_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3ff\u200d\u2642\ufe0f", "man cartwheeling: Dark Skin Tone", []string{"man_cartwheeling_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f373", "man cook: Dark Skin Tone", []string{"man_cook_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f373", "man cook: Light Skin Tone", []string{"man_cook_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f373", "man cook: Medium-Light Skin Tone", []string{"man_cook_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f373", "man cook: Medium Skin Tone", []string{"man_cook_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f373", "man cook: Medium-Dark Skin Tone", []string{"man_cook_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f57a\U0001f3fb", "man dancing: Light Skin Tone", []string{"man_dancing_Light_Skin_Tone"}, "12.0", false}, {"\U0001f57a\U0001f3fc", "man dancing: Medium-Light Skin Tone", []string{"man_dancing_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f57a\U0001f3fd", "man dancing: Medium Skin Tone", []string{"man_dancing_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f57a\U0001f3fe", "man dancing: Medium-Dark Skin Tone", []string{"man_dancing_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f57a\U0001f3ff", "man dancing: Dark Skin Tone", []string{"man_dancing_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fe\u200d\u2642\ufe0f", "man facepalming: Medium-Dark Skin Tone", []string{"man_facepalming_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3ff\u200d\u2642\ufe0f", "man facepalming: Dark Skin Tone", []string{"man_facepalming_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fb\u200d\u2642\ufe0f", "man facepalming: Light Skin Tone", []string{"man_facepalming_Light_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fc\u200d\u2642\ufe0f", "man facepalming: Medium-Light Skin Tone", []string{"man_facepalming_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fd\u200d\u2642\ufe0f", "man facepalming: Medium Skin Tone", []string{"man_facepalming_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f3ed", "man factory worker: Light Skin Tone", []string{"man_factory_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f3ed", "man factory worker: Medium-Light Skin Tone", []string{"man_factory_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f3ed", "man factory worker: Medium Skin Tone", []string{"man_factory_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f3ed", "man factory worker: Medium-Dark Skin Tone", []string{"man_factory_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f3ed", "man factory worker: Dark Skin Tone", []string{"man_factory_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f33e", "man farmer: Light Skin Tone", []string{"man_farmer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f33e", "man farmer: Medium-Light Skin Tone", []string{"man_farmer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f33e", "man farmer: Medium Skin Tone", []string{"man_farmer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f33e", "man farmer: Medium-Dark Skin Tone", []string{"man_farmer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f33e", "man farmer: Dark Skin Tone", []string{"man_farmer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f692", "man firefighter: Light Skin Tone", []string{"man_firefighter_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f692", "man firefighter: Medium-Light Skin Tone", []string{"man_firefighter_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f692", "man firefighter: Medium Skin Tone", []string{"man_firefighter_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f692", "man firefighter: Medium-Dark Skin Tone", []string{"man_firefighter_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f692", "man firefighter: Dark Skin Tone", []string{"man_firefighter_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\u2695\ufe0f", "man health worker: Medium-Dark Skin Tone", []string{"man_health_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\u2695\ufe0f", "man health worker: Dark Skin Tone", []string{"man_health_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\u2695\ufe0f", "man health worker: Light Skin Tone", []string{"man_health_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\u2695\ufe0f", "man health worker: Medium-Light Skin Tone", []string{"man_health_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\u2695\ufe0f", "man health worker: Medium Skin Tone", []string{"man_health_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f9bd", "man in manual wheelchair: Medium Skin Tone", []string{"man_in_manual_wheelchair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f9bd", "man in manual wheelchair: Medium-Dark Skin Tone", []string{"man_in_manual_wheelchair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f9bd", "man in manual wheelchair: Dark Skin Tone", []string{"man_in_manual_wheelchair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f9bd", "man in manual wheelchair: Light Skin Tone", []string{"man_in_manual_wheelchair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f9bd", "man in manual wheelchair: Medium-Light Skin Tone", []string{"man_in_manual_wheelchair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f9bc", "man in motorized wheelchair: Medium Skin Tone", []string{"man_in_motorized_wheelchair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f9bc", "man in motorized wheelchair: Medium-Dark Skin Tone", []string{"man_in_motorized_wheelchair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f9bc", "man in motorized wheelchair: Dark Skin Tone", []string{"man_in_motorized_wheelchair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f9bc", "man in motorized wheelchair: Light Skin Tone", []string{"man_in_motorized_wheelchair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f9bc", "man in motorized wheelchair: Medium-Light Skin Tone", []string{"man_in_motorized_wheelchair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\u2696\ufe0f", "man judge: Light Skin Tone", []string{"man_judge_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\u2696\ufe0f", "man judge: Medium-Light Skin Tone", []string{"man_judge_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\u2696\ufe0f", "man judge: Medium Skin Tone", []string{"man_judge_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\u2696\ufe0f", "man judge: Medium-Dark Skin Tone", []string{"man_judge_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\u2696\ufe0f", "man judge: Dark Skin Tone", []string{"man_judge_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fc\u200d\u2642\ufe0f", "man juggling: Medium-Light Skin Tone", []string{"man_juggling_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fd\u200d\u2642\ufe0f", "man juggling: Medium Skin Tone", []string{"man_juggling_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fe\u200d\u2642\ufe0f", "man juggling: Medium-Dark Skin Tone", []string{"man_juggling_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3ff\u200d\u2642\ufe0f", "man juggling: Dark Skin Tone", []string{"man_juggling_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fb\u200d\u2642\ufe0f", "man juggling: Light Skin Tone", []string{"man_juggling_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f527", "man mechanic: Medium Skin Tone", []string{"man_mechanic_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f527", "man mechanic: Medium-Dark Skin Tone", []string{"man_mechanic_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f527", "man mechanic: Dark Skin Tone", []string{"man_mechanic_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f527", "man mechanic: Light Skin Tone", []string{"man_mechanic_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f527", "man mechanic: Medium-Light Skin Tone", []string{"man_mechanic_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f4bc", "man office worker: Light Skin Tone", []string{"man_office_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f4bc", "man office worker: Medium-Light Skin Tone", []string{"man_office_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f4bc", "man office worker: Medium Skin Tone", []string{"man_office_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f4bc", "man office worker: Medium-Dark Skin Tone", []string{"man_office_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f4bc", "man office worker: Dark Skin Tone", []string{"man_office_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\u2708\ufe0f", "man pilot: Medium Skin Tone", []string{"man_pilot_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\u2708\ufe0f", "man pilot: Medium-Dark Skin Tone", []string{"man_pilot_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\u2708\ufe0f", "man pilot: Dark Skin Tone", []string{"man_pilot_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\u2708\ufe0f", "man pilot: Light Skin Tone", []string{"man_pilot_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\u2708\ufe0f", "man pilot: Medium-Light Skin Tone", []string{"man_pilot_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fb\u200d\u2642\ufe0f", "man playing handball: Light Skin Tone", []string{"man_playing_handball_Light_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fc\u200d\u2642\ufe0f", "man playing handball: Medium-Light Skin Tone", []string{"man_playing_handball_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fd\u200d\u2642\ufe0f", "man playing handball: Medium Skin Tone", []string{"man_playing_handball_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fe\u200d\u2642\ufe0f", "man playing handball: Medium-Dark Skin Tone", []string{"man_playing_handball_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3ff\u200d\u2642\ufe0f", "man playing handball: Dark Skin Tone", []string{"man_playing_handball_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fb\u200d\u2642\ufe0f", "man playing water polo: Light Skin Tone", []string{"man_playing_water_polo_Light_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fc\u200d\u2642\ufe0f", "man playing water polo: Medium-Light Skin Tone", []string{"man_playing_water_polo_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fd\u200d\u2642\ufe0f", "man playing water polo: Medium Skin Tone", []string{"man_playing_water_polo_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fe\u200d\u2642\ufe0f", "man playing water polo: Medium-Dark Skin Tone", []string{"man_playing_water_polo_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3ff\u200d\u2642\ufe0f", "man playing water polo: Dark Skin Tone", []string{"man_playing_water_polo_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f52c", "man scientist: Light Skin Tone", []string{"man_scientist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f52c", "man scientist: Medium-Light Skin Tone", []string{"man_scientist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f52c", "man scientist: Medium Skin Tone", []string{"man_scientist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f52c", "man scientist: Medium-Dark Skin Tone", []string{"man_scientist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f52c", "man scientist: Dark Skin Tone", []string{"man_scientist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fe\u200d\u2642\ufe0f", "man shrugging: Medium-Dark Skin Tone", []string{"man_shrugging_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3ff\u200d\u2642\ufe0f", "man shrugging: Dark Skin Tone", []string{"man_shrugging_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fb\u200d\u2642\ufe0f", "man shrugging: Light Skin Tone", []string{"man_shrugging_Light_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fc\u200d\u2642\ufe0f", "man shrugging: Medium-Light Skin Tone", []string{"man_shrugging_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fd\u200d\u2642\ufe0f", "man shrugging: Medium Skin Tone", []string{"man_shrugging_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f3a4", "man singer: Light Skin Tone", []string{"man_singer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f3a4", "man singer: Medium-Light Skin Tone", []string{"man_singer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f3a4", "man singer: Medium Skin Tone", []string{"man_singer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f3a4", "man singer: Medium-Dark Skin Tone", []string{"man_singer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f3a4", "man singer: Dark Skin Tone", []string{"man_singer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f393", "man student: Light Skin Tone", []string{"man_student_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f393", "man student: Medium-Light Skin Tone", []string{"man_student_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f393", "man student: Medium Skin Tone", []string{"man_student_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f393", "man student: Medium-Dark Skin Tone", []string{"man_student_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f393", "man student: Dark Skin Tone", []string{"man_student_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f3eb", "man teacher: Dark Skin Tone", []string{"man_teacher_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f3eb", "man teacher: Light Skin Tone", []string{"man_teacher_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f3eb", "man teacher: Medium-Light Skin Tone", []string{"man_teacher_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f3eb", "man teacher: Medium Skin Tone", []string{"man_teacher_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f3eb", "man teacher: Medium-Dark Skin Tone", []string{"man_teacher_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f4bb", "man technologist: Light Skin Tone", []string{"man_technologist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f4bb", "man technologist: Medium-Light Skin Tone", []string{"man_technologist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f4bb", "man technologist: Medium Skin Tone", []string{"man_technologist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f4bb", "man technologist: Medium-Dark Skin Tone", []string{"man_technologist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f4bb", "man technologist: Dark Skin Tone", []string{"man_technologist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f472\U0001f3fe", "person with skullcap: Medium-Dark Skin Tone", []string{"man_with_gua_pi_mao_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f472\U0001f3ff", "person with skullcap: Dark Skin Tone", []string{"man_with_gua_pi_mao_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f472\U0001f3fb", "person with skullcap: Light Skin Tone", []string{"man_with_gua_pi_mao_Light_Skin_Tone"}, "12.0", false}, {"\U0001f472\U0001f3fc", "person with skullcap: Medium-Light Skin Tone", []string{"man_with_gua_pi_mao_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f472\U0001f3fd", "person with skullcap: Medium Skin Tone", []string{"man_with_gua_pi_mao_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f9af", "man with white cane: Light Skin Tone", []string{"man_with_probing_cane_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f9af", "man with white cane: Medium-Light Skin Tone", []string{"man_with_probing_cane_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f9af", "man with white cane: Medium Skin Tone", []string{"man_with_probing_cane_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f9af", "man with white cane: Medium-Dark Skin Tone", []string{"man_with_probing_cane_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f9af", "man with white cane: Dark Skin Tone", []string{"man_with_probing_cane_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fc\u200d\u2642\ufe0f", "man wearing turban: Medium-Light Skin Tone", []string{"man_with_turban_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fd\u200d\u2642\ufe0f", "man wearing turban: Medium Skin Tone", []string{"man_with_turban_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fe\u200d\u2642\ufe0f", "man wearing turban: Medium-Dark Skin Tone", []string{"man_with_turban_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3ff\u200d\u2642\ufe0f", "man wearing turban: Dark Skin Tone", []string{"man_with_turban_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fb\u200d\u2642\ufe0f", "man wearing turban: Light Skin Tone", []string{"man_with_turban_Light_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fb", "person getting massage: Light Skin Tone", []string{"massage_Light_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fc", "person getting massage: Medium-Light Skin Tone", []string{"massage_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fd", "person getting massage: Medium Skin Tone", []string{"massage_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fe", "person getting massage: Medium-Dark Skin Tone", []string{"massage_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3ff", "person getting massage: Dark Skin Tone", []string{"massage_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3ff\u200d\u2642\ufe0f", "man getting massage: Dark Skin Tone", []string{"massage_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fb\u200d\u2642\ufe0f", "man getting massage: Light Skin Tone", []string{"massage_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fc\u200d\u2642\ufe0f", "man getting massage: Medium-Light Skin Tone", []string{"massage_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fd\u200d\u2642\ufe0f", "man getting massage: Medium Skin Tone", []string{"massage_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fe\u200d\u2642\ufe0f", "man getting massage: Medium-Dark Skin Tone", []string{"massage_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fc\u200d\u2640\ufe0f", "woman getting massage: Medium-Light Skin Tone", []string{"massage_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fd\u200d\u2640\ufe0f", "woman getting massage: Medium Skin Tone", []string{"massage_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fe\u200d\u2640\ufe0f", "woman getting massage: Medium-Dark Skin Tone", []string{"massage_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3ff\u200d\u2640\ufe0f", "woman getting massage: Dark Skin Tone", []string{"massage_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f486\U0001f3fb\u200d\u2640\ufe0f", "woman getting massage: Light Skin Tone", []string{"massage_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f527", "mechanic: Medium-Dark Skin Tone", []string{"mechanic_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f527", "mechanic: Dark Skin Tone", []string{"mechanic_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f527", "mechanic: Light Skin Tone", []string{"mechanic_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f527", "mechanic: Medium-Light Skin Tone", []string{"mechanic_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f527", "mechanic: Medium Skin Tone", []string{"mechanic_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fb\u200d\u2640\ufe0f", "mermaid: Light Skin Tone", []string{"mermaid_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fc\u200d\u2640\ufe0f", "mermaid: Medium-Light Skin Tone", []string{"mermaid_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fd\u200d\u2640\ufe0f", "mermaid: Medium Skin Tone", []string{"mermaid_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fe\u200d\u2640\ufe0f", "mermaid: Medium-Dark Skin Tone", []string{"mermaid_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3ff\u200d\u2640\ufe0f", "mermaid: Dark Skin Tone", []string{"mermaid_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fe\u200d\u2642\ufe0f", "merman: Medium-Dark Skin Tone", []string{"merman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3ff\u200d\u2642\ufe0f", "merman: Dark Skin Tone", []string{"merman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fb\u200d\u2642\ufe0f", "merman: Light Skin Tone", []string{"merman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fc\u200d\u2642\ufe0f", "merman: Medium-Light Skin Tone", []string{"merman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fd\u200d\u2642\ufe0f", "merman: Medium Skin Tone", []string{"merman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fc", "merperson: Medium-Light Skin Tone", []string{"merperson_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fd", "merperson: Medium Skin Tone", []string{"merperson_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fe", "merperson: Medium-Dark Skin Tone", []string{"merperson_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3ff", "merperson: Dark Skin Tone", []string{"merperson_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9dc\U0001f3fb", "merperson: Light Skin Tone", []string{"merperson_Light_Skin_Tone"}, "12.0", false}, {"\U0001f918\U0001f3fc", "sign of the horns: Medium-Light Skin Tone", []string{"metal_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f918\U0001f3fd", "sign of the horns: Medium Skin Tone", []string{"metal_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f918\U0001f3fe", "sign of the horns: Medium-Dark Skin Tone", []string{"metal_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f918\U0001f3ff", "sign of the horns: Dark Skin Tone", []string{"metal_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f918\U0001f3fb", "sign of the horns: Light Skin Tone", []string{"metal_Light_Skin_Tone"}, "12.0", false}, {"\U0001f595\U0001f3fc", "middle finger: Medium-Light Skin Tone", []string{"middle_finger_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f595\U0001f3fd", "middle finger: Medium Skin Tone", []string{"middle_finger_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f595\U0001f3fe", "middle finger: Medium-Dark Skin Tone", []string{"middle_finger_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f595\U0001f3ff", "middle finger: Dark Skin Tone", []string{"middle_finger_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f595\U0001f3fb", "middle finger: Light Skin Tone", []string{"middle_finger_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fe", "person mountain biking: Medium-Dark Skin Tone", []string{"mountain_bicyclist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3ff", "person mountain biking: Dark Skin Tone", []string{"mountain_bicyclist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fb", "person mountain biking: Light Skin Tone", []string{"mountain_bicyclist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fc", "person mountain biking: Medium-Light Skin Tone", []string{"mountain_bicyclist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fd", "person mountain biking: Medium Skin Tone", []string{"mountain_bicyclist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fb\u200d\u2642\ufe0f", "man mountain biking: Light Skin Tone", []string{"mountain_biking_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fc\u200d\u2642\ufe0f", "man mountain biking: Medium-Light Skin Tone", []string{"mountain_biking_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fd\u200d\u2642\ufe0f", "man mountain biking: Medium Skin Tone", []string{"mountain_biking_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fe\u200d\u2642\ufe0f", "man mountain biking: Medium-Dark Skin Tone", []string{"mountain_biking_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3ff\u200d\u2642\ufe0f", "man mountain biking: Dark Skin Tone", []string{"mountain_biking_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fe\u200d\u2640\ufe0f", "woman mountain biking: Medium-Dark Skin Tone", []string{"mountain_biking_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3ff\u200d\u2640\ufe0f", "woman mountain biking: Dark Skin Tone", []string{"mountain_biking_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fb\u200d\u2640\ufe0f", "woman mountain biking: Light Skin Tone", []string{"mountain_biking_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fc\u200d\u2640\ufe0f", "woman mountain biking: Medium-Light Skin Tone", []string{"mountain_biking_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b5\U0001f3fd\u200d\u2640\ufe0f", "woman mountain biking: Medium Skin Tone", []string{"mountain_biking_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f936\U0001f3fb", "Mrs. Claus: Light Skin Tone", []string{"mrs_claus_Light_Skin_Tone"}, "12.0", false}, {"\U0001f936\U0001f3fc", "Mrs. Claus: Medium-Light Skin Tone", []string{"mrs_claus_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f936\U0001f3fd", "Mrs. Claus: Medium Skin Tone", []string{"mrs_claus_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f936\U0001f3fe", "Mrs. Claus: Medium-Dark Skin Tone", []string{"mrs_claus_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f936\U0001f3ff", "Mrs. Claus: Dark Skin Tone", []string{"mrs_claus_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f4aa\U0001f3fb", "flexed biceps: Light Skin Tone", []string{"muscle_Light_Skin_Tone"}, "12.0", false}, {"\U0001f4aa\U0001f3fc", "flexed biceps: Medium-Light Skin Tone", []string{"muscle_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f4aa\U0001f3fd", "flexed biceps: Medium Skin Tone", []string{"muscle_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f4aa\U0001f3fe", "flexed biceps: Medium-Dark Skin Tone", []string{"muscle_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f4aa\U0001f3ff", "flexed biceps: Dark Skin Tone", []string{"muscle_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f485\U0001f3fb", "nail polish: Light Skin Tone", []string{"nail_care_Light_Skin_Tone"}, "12.0", false}, {"\U0001f485\U0001f3fc", "nail polish: Medium-Light Skin Tone", []string{"nail_care_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f485\U0001f3fd", "nail polish: Medium Skin Tone", []string{"nail_care_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f485\U0001f3fe", "nail polish: Medium-Dark Skin Tone", []string{"nail_care_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f485\U0001f3ff", "nail polish: Dark Skin Tone", []string{"nail_care_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fb", "person gesturing NO: Light Skin Tone", []string{"no_good_Light_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fc", "person gesturing NO: Medium-Light Skin Tone", []string{"no_good_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fd", "person gesturing NO: Medium Skin Tone", []string{"no_good_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fe", "person gesturing NO: Medium-Dark Skin Tone", []string{"no_good_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3ff", "person gesturing NO: Dark Skin Tone", []string{"no_good_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fc\u200d\u2642\ufe0f", "man gesturing NO: Medium-Light Skin Tone", []string{"no_good_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fd\u200d\u2642\ufe0f", "man gesturing NO: Medium Skin Tone", []string{"no_good_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fe\u200d\u2642\ufe0f", "man gesturing NO: Medium-Dark Skin Tone", []string{"no_good_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3ff\u200d\u2642\ufe0f", "man gesturing NO: Dark Skin Tone", []string{"no_good_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fb\u200d\u2642\ufe0f", "man gesturing NO: Light Skin Tone", []string{"no_good_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fb\u200d\u2640\ufe0f", "woman gesturing NO: Light Skin Tone", []string{"no_good_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fc\u200d\u2640\ufe0f", "woman gesturing NO: Medium-Light Skin Tone", []string{"no_good_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fd\u200d\u2640\ufe0f", "woman gesturing NO: Medium Skin Tone", []string{"no_good_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3fe\u200d\u2640\ufe0f", "woman gesturing NO: Medium-Dark Skin Tone", []string{"no_good_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f645\U0001f3ff\u200d\u2640\ufe0f", "woman gesturing NO: Dark Skin Tone", []string{"no_good_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f443\U0001f3fb", "nose: Light Skin Tone", []string{"nose_Light_Skin_Tone"}, "12.0", false}, {"\U0001f443\U0001f3fc", "nose: Medium-Light Skin Tone", []string{"nose_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f443\U0001f3fd", "nose: Medium Skin Tone", []string{"nose_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f443\U0001f3fe", "nose: Medium-Dark Skin Tone", []string{"nose_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f443\U0001f3ff", "nose: Dark Skin Tone", []string{"nose_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f4bc", "office worker: Medium Skin Tone", []string{"office_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f4bc", "office worker: Medium-Dark Skin Tone", []string{"office_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f4bc", "office worker: Dark Skin Tone", []string{"office_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f4bc", "office worker: Light Skin Tone", []string{"office_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f4bc", "office worker: Medium-Light Skin Tone", []string{"office_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f44c\U0001f3fe", "OK hand: Medium-Dark Skin Tone", []string{"ok_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44c\U0001f3ff", "OK hand: Dark Skin Tone", []string{"ok_hand_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44c\U0001f3fb", "OK hand: Light Skin Tone", []string{"ok_hand_Light_Skin_Tone"}, "12.0", false}, {"\U0001f44c\U0001f3fc", "OK hand: Medium-Light Skin Tone", []string{"ok_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f44c\U0001f3fd", "OK hand: Medium Skin Tone", []string{"ok_hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fb\u200d\u2642\ufe0f", "man gesturing OK: Light Skin Tone", []string{"ok_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fc\u200d\u2642\ufe0f", "man gesturing OK: Medium-Light Skin Tone", []string{"ok_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fd\u200d\u2642\ufe0f", "man gesturing OK: Medium Skin Tone", []string{"ok_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fe\u200d\u2642\ufe0f", "man gesturing OK: Medium-Dark Skin Tone", []string{"ok_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3ff\u200d\u2642\ufe0f", "man gesturing OK: Dark Skin Tone", []string{"ok_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3ff", "person gesturing OK: Dark Skin Tone", []string{"ok_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fb", "person gesturing OK: Light Skin Tone", []string{"ok_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fc", "person gesturing OK: Medium-Light Skin Tone", []string{"ok_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fd", "person gesturing OK: Medium Skin Tone", []string{"ok_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fe", "person gesturing OK: Medium-Dark Skin Tone", []string{"ok_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fc\u200d\u2640\ufe0f", "woman gesturing OK: Medium-Light Skin Tone", []string{"ok_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fd\u200d\u2640\ufe0f", "woman gesturing OK: Medium Skin Tone", []string{"ok_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fe\u200d\u2640\ufe0f", "woman gesturing OK: Medium-Dark Skin Tone", []string{"ok_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3ff\u200d\u2640\ufe0f", "woman gesturing OK: Dark Skin Tone", []string{"ok_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f646\U0001f3fb\u200d\u2640\ufe0f", "woman gesturing OK: Light Skin Tone", []string{"ok_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d3\U0001f3fb", "older person: Light Skin Tone", []string{"older_adult_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d3\U0001f3fc", "older person: Medium-Light Skin Tone", []string{"older_adult_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d3\U0001f3fd", "older person: Medium Skin Tone", []string{"older_adult_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d3\U0001f3fe", "older person: Medium-Dark Skin Tone", []string{"older_adult_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d3\U0001f3ff", "older person: Dark Skin Tone", []string{"older_adult_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f474\U0001f3fb", "old man: Light Skin Tone", []string{"older_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f474\U0001f3fc", "old man: Medium-Light Skin Tone", []string{"older_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f474\U0001f3fd", "old man: Medium Skin Tone", []string{"older_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f474\U0001f3fe", "old man: Medium-Dark Skin Tone", []string{"older_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f474\U0001f3ff", "old man: Dark Skin Tone", []string{"older_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f475\U0001f3fb", "old woman: Light Skin Tone", []string{"older_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f475\U0001f3fc", "old woman: Medium-Light Skin Tone", []string{"older_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f475\U0001f3fd", "old woman: Medium Skin Tone", []string{"older_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f475\U0001f3fe", "old woman: Medium-Dark Skin Tone", []string{"older_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f475\U0001f3ff", "old woman: Dark Skin Tone", []string{"older_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f450\U0001f3fc", "open hands: Medium-Light Skin Tone", []string{"open_hands_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f450\U0001f3fd", "open hands: Medium Skin Tone", []string{"open_hands_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f450\U0001f3fe", "open hands: Medium-Dark Skin Tone", []string{"open_hands_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f450\U0001f3ff", "open hands: Dark Skin Tone", []string{"open_hands_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f450\U0001f3fb", "open hands: Light Skin Tone", []string{"open_hands_Light_Skin_Tone"}, "12.0", false}, {"\U0001f932\U0001f3fd", "palms up together: Medium Skin Tone", []string{"palms_up_together_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f932\U0001f3fe", "palms up together: Medium-Dark Skin Tone", []string{"palms_up_together_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f932\U0001f3ff", "palms up together: Dark Skin Tone", []string{"palms_up_together_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f932\U0001f3fb", "palms up together: Light Skin Tone", []string{"palms_up_together_Light_Skin_Tone"}, "12.0", false}, {"\U0001f932\U0001f3fc", "palms up together: Medium-Light Skin Tone", []string{"palms_up_together_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f91d\u200d\U0001f9d1", "people holding hands: Light Skin Tone", []string{"people_holding_hands_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f91d\u200d\U0001f9d1", "people holding hands: Medium-Light Skin Tone", []string{"people_holding_hands_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f91d\u200d\U0001f9d1", "people holding hands: Medium Skin Tone", []string{"people_holding_hands_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f91d\u200d\U0001f9d1", "people holding hands: Medium-Dark Skin Tone", []string{"people_holding_hands_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f91d\u200d\U0001f9d1", "people holding hands: Dark Skin Tone", []string{"people_holding_hands_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f9b2", "person: bald: Dark Skin Tone", []string{"person_bald_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f9b2", "person: bald: Light Skin Tone", []string{"person_bald_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f9b2", "person: bald: Medium-Light Skin Tone", []string{"person_bald_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f9b2", "person: bald: Medium Skin Tone", []string{"person_bald_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f9b2", "person: bald: Medium-Dark Skin Tone", []string{"person_bald_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f9b1", "person: curly hair: Medium Skin Tone", []string{"person_curly_hair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f9b1", "person: curly hair: Medium-Dark Skin Tone", []string{"person_curly_hair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f9b1", "person: curly hair: Dark Skin Tone", []string{"person_curly_hair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f9b1", "person: curly hair: Light Skin Tone", []string{"person_curly_hair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f9b1", "person: curly hair: Medium-Light Skin Tone", []string{"person_curly_hair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f9bd", "person in manual wheelchair: Medium-Dark Skin Tone", []string{"person_in_manual_wheelchair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f9bd", "person in manual wheelchair: Dark Skin Tone", []string{"person_in_manual_wheelchair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f9bd", "person in manual wheelchair: Light Skin Tone", []string{"person_in_manual_wheelchair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f9bd", "person in manual wheelchair: Medium-Light Skin Tone", []string{"person_in_manual_wheelchair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f9bd", "person in manual wheelchair: Medium Skin Tone", []string{"person_in_manual_wheelchair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f9bc", "person in motorized wheelchair: Medium-Dark Skin Tone", []string{"person_in_motorized_wheelchair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f9bc", "person in motorized wheelchair: Dark Skin Tone", []string{"person_in_motorized_wheelchair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f9bc", "person in motorized wheelchair: Light Skin Tone", []string{"person_in_motorized_wheelchair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f9bc", "person in motorized wheelchair: Medium-Light Skin Tone", []string{"person_in_motorized_wheelchair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f9bc", "person in motorized wheelchair: Medium Skin Tone", []string{"person_in_motorized_wheelchair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fb", "person in tuxedo: Light Skin Tone", []string{"person_in_tuxedo_Light_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fc", "person in tuxedo: Medium-Light Skin Tone", []string{"person_in_tuxedo_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fd", "person in tuxedo: Medium Skin Tone", []string{"person_in_tuxedo_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fe", "person in tuxedo: Medium-Dark Skin Tone", []string{"person_in_tuxedo_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3ff", "person in tuxedo: Dark Skin Tone", []string{"person_in_tuxedo_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f9b0", "person: red hair: Dark Skin Tone", []string{"person_red_hair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f9b0", "person: red hair: Light Skin Tone", []string{"person_red_hair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f9b0", "person: red hair: Medium-Light Skin Tone", []string{"person_red_hair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f9b0", "person: red hair: Medium Skin Tone", []string{"person_red_hair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f9b0", "person: red hair: Medium-Dark Skin Tone", []string{"person_red_hair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f9b3", "person: white hair: Light Skin Tone", []string{"person_white_hair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f9b3", "person: white hair: Medium-Light Skin Tone", []string{"person_white_hair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f9b3", "person: white hair: Medium Skin Tone", []string{"person_white_hair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f9b3", "person: white hair: Medium-Dark Skin Tone", []string{"person_white_hair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f9b3", "person: white hair: Dark Skin Tone", []string{"person_white_hair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f9af", "person with white cane: Light Skin Tone", []string{"person_with_probing_cane_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f9af", "person with white cane: Medium-Light Skin Tone", []string{"person_with_probing_cane_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f9af", "person with white cane: Medium Skin Tone", []string{"person_with_probing_cane_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f9af", "person with white cane: Medium-Dark Skin Tone", []string{"person_with_probing_cane_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f9af", "person with white cane: Dark Skin Tone", []string{"person_with_probing_cane_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fe", "person wearing turban: Medium-Dark Skin Tone", []string{"person_with_turban_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3ff", "person wearing turban: Dark Skin Tone", []string{"person_with_turban_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fb", "person wearing turban: Light Skin Tone", []string{"person_with_turban_Light_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fc", "person wearing turban: Medium-Light Skin Tone", []string{"person_with_turban_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fd", "person wearing turban: Medium Skin Tone", []string{"person_with_turban_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fd", "person with veil: Medium Skin Tone", []string{"person_with_veil_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fe", "person with veil: Medium-Dark Skin Tone", []string{"person_with_veil_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3ff", "person with veil: Dark Skin Tone", []string{"person_with_veil_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fb", "person with veil: Light Skin Tone", []string{"person_with_veil_Light_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fc", "person with veil: Medium-Light Skin Tone", []string{"person_with_veil_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\u2708\ufe0f", "pilot: Light Skin Tone", []string{"pilot_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\u2708\ufe0f", "pilot: Medium-Light Skin Tone", []string{"pilot_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\u2708\ufe0f", "pilot: Medium Skin Tone", []string{"pilot_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\u2708\ufe0f", "pilot: Medium-Dark Skin Tone", []string{"pilot_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\u2708\ufe0f", "pilot: Dark Skin Tone", []string{"pilot_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f90f\U0001f3fe", "pinching hand: Medium-Dark Skin Tone", []string{"pinching_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f90f\U0001f3ff", "pinching hand: Dark Skin Tone", []string{"pinching_hand_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f90f\U0001f3fb", "pinching hand: Light Skin Tone", []string{"pinching_hand_Light_Skin_Tone"}, "12.0", false}, {"\U0001f90f\U0001f3fc", "pinching hand: Medium-Light Skin Tone", []string{"pinching_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f90f\U0001f3fd", "pinching hand: Medium Skin Tone", []string{"pinching_hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f447\U0001f3ff", "backhand index pointing down: Dark Skin Tone", []string{"point_down_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f447\U0001f3fb", "backhand index pointing down: Light Skin Tone", []string{"point_down_Light_Skin_Tone"}, "12.0", false}, {"\U0001f447\U0001f3fc", "backhand index pointing down: Medium-Light Skin Tone", []string{"point_down_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f447\U0001f3fd", "backhand index pointing down: Medium Skin Tone", []string{"point_down_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f447\U0001f3fe", "backhand index pointing down: Medium-Dark Skin Tone", []string{"point_down_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f448\U0001f3fe", "backhand index pointing left: Medium-Dark Skin Tone", []string{"point_left_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f448\U0001f3ff", "backhand index pointing left: Dark Skin Tone", []string{"point_left_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f448\U0001f3fb", "backhand index pointing left: Light Skin Tone", []string{"point_left_Light_Skin_Tone"}, "12.0", false}, {"\U0001f448\U0001f3fc", "backhand index pointing left: Medium-Light Skin Tone", []string{"point_left_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f448\U0001f3fd", "backhand index pointing left: Medium Skin Tone", []string{"point_left_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f449\U0001f3fb", "backhand index pointing right: Light Skin Tone", []string{"point_right_Light_Skin_Tone"}, "12.0", false}, {"\U0001f449\U0001f3fc", "backhand index pointing right: Medium-Light Skin Tone", []string{"point_right_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f449\U0001f3fd", "backhand index pointing right: Medium Skin Tone", []string{"point_right_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f449\U0001f3fe", "backhand index pointing right: Medium-Dark Skin Tone", []string{"point_right_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f449\U0001f3ff", "backhand index pointing right: Dark Skin Tone", []string{"point_right_Dark_Skin_Tone"}, "12.0", false}, {"\u261d\U0001f3fc\ufe0f", "index pointing up: Medium-Light Skin Tone", []string{"point_up_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u261d\U0001f3fd\ufe0f", "index pointing up: Medium Skin Tone", []string{"point_up_Medium_Skin_Tone"}, "12.0", false}, {"\u261d\U0001f3fe\ufe0f", "index pointing up: Medium-Dark Skin Tone", []string{"point_up_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u261d\U0001f3ff\ufe0f", "index pointing up: Dark Skin Tone", []string{"point_up_Dark_Skin_Tone"}, "12.0", false}, {"\u261d\U0001f3fb\ufe0f", "index pointing up: Light Skin Tone", []string{"point_up_Light_Skin_Tone"}, "12.0", false}, {"\U0001f446\U0001f3fb", "backhand index pointing up: Light Skin Tone", []string{"point_up_2_Light_Skin_Tone"}, "12.0", false}, {"\U0001f446\U0001f3fc", "backhand index pointing up: Medium-Light Skin Tone", []string{"point_up_2_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f446\U0001f3fd", "backhand index pointing up: Medium Skin Tone", []string{"point_up_2_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f446\U0001f3fe", "backhand index pointing up: Medium-Dark Skin Tone", []string{"point_up_2_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f446\U0001f3ff", "backhand index pointing up: Dark Skin Tone", []string{"point_up_2_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3ff", "police officer: Dark Skin Tone", []string{"police_officer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fb", "police officer: Light Skin Tone", []string{"police_officer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fc", "police officer: Medium-Light Skin Tone", []string{"police_officer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fd", "police officer: Medium Skin Tone", []string{"police_officer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fe", "police officer: Medium-Dark Skin Tone", []string{"police_officer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fd\u200d\u2642\ufe0f", "man police officer: Medium Skin Tone", []string{"policeman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fe\u200d\u2642\ufe0f", "man police officer: Medium-Dark Skin Tone", []string{"policeman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3ff\u200d\u2642\ufe0f", "man police officer: Dark Skin Tone", []string{"policeman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fb\u200d\u2642\ufe0f", "man police officer: Light Skin Tone", []string{"policeman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fc\u200d\u2642\ufe0f", "man police officer: Medium-Light Skin Tone", []string{"policeman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fd\u200d\u2640\ufe0f", "woman police officer: Medium Skin Tone", []string{"policewoman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fe\u200d\u2640\ufe0f", "woman police officer: Medium-Dark Skin Tone", []string{"policewoman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3ff\u200d\u2640\ufe0f", "woman police officer: Dark Skin Tone", []string{"policewoman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fb\u200d\u2640\ufe0f", "woman police officer: Light Skin Tone", []string{"policewoman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f46e\U0001f3fc\u200d\u2640\ufe0f", "woman police officer: Medium-Light Skin Tone", []string{"policewoman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fb", "person pouting: Light Skin Tone", []string{"pouting_face_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fc", "person pouting: Medium-Light Skin Tone", []string{"pouting_face_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fd", "person pouting: Medium Skin Tone", []string{"pouting_face_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fe", "person pouting: Medium-Dark Skin Tone", []string{"pouting_face_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3ff", "person pouting: Dark Skin Tone", []string{"pouting_face_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fe\u200d\u2642\ufe0f", "man pouting: Medium-Dark Skin Tone", []string{"pouting_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3ff\u200d\u2642\ufe0f", "man pouting: Dark Skin Tone", []string{"pouting_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fb\u200d\u2642\ufe0f", "man pouting: Light Skin Tone", []string{"pouting_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fc\u200d\u2642\ufe0f", "man pouting: Medium-Light Skin Tone", []string{"pouting_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fd\u200d\u2642\ufe0f", "man pouting: Medium Skin Tone", []string{"pouting_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fb\u200d\u2640\ufe0f", "woman pouting: Light Skin Tone", []string{"pouting_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fc\u200d\u2640\ufe0f", "woman pouting: Medium-Light Skin Tone", []string{"pouting_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fd\u200d\u2640\ufe0f", "woman pouting: Medium Skin Tone", []string{"pouting_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3fe\u200d\u2640\ufe0f", "woman pouting: Medium-Dark Skin Tone", []string{"pouting_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64e\U0001f3ff\u200d\u2640\ufe0f", "woman pouting: Dark Skin Tone", []string{"pouting_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64f\U0001f3fb", "folded hands: Light Skin Tone", []string{"pray_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64f\U0001f3fc", "folded hands: Medium-Light Skin Tone", []string{"pray_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64f\U0001f3fd", "folded hands: Medium Skin Tone", []string{"pray_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64f\U0001f3fe", "folded hands: Medium-Dark Skin Tone", []string{"pray_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64f\U0001f3ff", "folded hands: Dark Skin Tone", []string{"pray_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f930\U0001f3fb", "pregnant woman: Light Skin Tone", []string{"pregnant_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f930\U0001f3fc", "pregnant woman: Medium-Light Skin Tone", []string{"pregnant_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f930\U0001f3fd", "pregnant woman: Medium Skin Tone", []string{"pregnant_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f930\U0001f3fe", "pregnant woman: Medium-Dark Skin Tone", []string{"pregnant_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f930\U0001f3ff", "pregnant woman: Dark Skin Tone", []string{"pregnant_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f934\U0001f3ff", "prince: Dark Skin Tone", []string{"prince_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f934\U0001f3fb", "prince: Light Skin Tone", []string{"prince_Light_Skin_Tone"}, "12.0", false}, {"\U0001f934\U0001f3fc", "prince: Medium-Light Skin Tone", []string{"prince_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f934\U0001f3fd", "prince: Medium Skin Tone", []string{"prince_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f934\U0001f3fe", "prince: Medium-Dark Skin Tone", []string{"prince_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f478\U0001f3fc", "princess: Medium-Light Skin Tone", []string{"princess_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f478\U0001f3fd", "princess: Medium Skin Tone", []string{"princess_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f478\U0001f3fe", "princess: Medium-Dark Skin Tone", []string{"princess_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f478\U0001f3ff", "princess: Dark Skin Tone", []string{"princess_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f478\U0001f3fb", "princess: Light Skin Tone", []string{"princess_Light_Skin_Tone"}, "12.0", false}, {"\U0001f91a\U0001f3ff", "raised back of hand: Dark Skin Tone", []string{"raised_back_of_hand_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f91a\U0001f3fb", "raised back of hand: Light Skin Tone", []string{"raised_back_of_hand_Light_Skin_Tone"}, "12.0", false}, {"\U0001f91a\U0001f3fc", "raised back of hand: Medium-Light Skin Tone", []string{"raised_back_of_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f91a\U0001f3fd", "raised back of hand: Medium Skin Tone", []string{"raised_back_of_hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f91a\U0001f3fe", "raised back of hand: Medium-Dark Skin Tone", []string{"raised_back_of_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f590\U0001f3fd\ufe0f", "hand with fingers splayed: Medium Skin Tone", []string{"raised_hand_with_fingers_splayed_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f590\U0001f3fe\ufe0f", "hand with fingers splayed: Medium-Dark Skin Tone", []string{"raised_hand_with_fingers_splayed_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f590\U0001f3ff\ufe0f", "hand with fingers splayed: Dark Skin Tone", []string{"raised_hand_with_fingers_splayed_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f590\U0001f3fb\ufe0f", "hand with fingers splayed: Light Skin Tone", []string{"raised_hand_with_fingers_splayed_Light_Skin_Tone"}, "12.0", false}, {"\U0001f590\U0001f3fc\ufe0f", "hand with fingers splayed: Medium-Light Skin Tone", []string{"raised_hand_with_fingers_splayed_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64c\U0001f3fb", "raising hands: Light Skin Tone", []string{"raised_hands_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64c\U0001f3fc", "raising hands: Medium-Light Skin Tone", []string{"raised_hands_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64c\U0001f3fd", "raising hands: Medium Skin Tone", []string{"raised_hands_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64c\U0001f3fe", "raising hands: Medium-Dark Skin Tone", []string{"raised_hands_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64c\U0001f3ff", "raising hands: Dark Skin Tone", []string{"raised_hands_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3ff", "person raising hand: Dark Skin Tone", []string{"raising_hand_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fb", "person raising hand: Light Skin Tone", []string{"raising_hand_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fc", "person raising hand: Medium-Light Skin Tone", []string{"raising_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fd", "person raising hand: Medium Skin Tone", []string{"raising_hand_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fe", "person raising hand: Medium-Dark Skin Tone", []string{"raising_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3ff\u200d\u2642\ufe0f", "man raising hand: Dark Skin Tone", []string{"raising_hand_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fb\u200d\u2642\ufe0f", "man raising hand: Light Skin Tone", []string{"raising_hand_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fc\u200d\u2642\ufe0f", "man raising hand: Medium-Light Skin Tone", []string{"raising_hand_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fd\u200d\u2642\ufe0f", "man raising hand: Medium Skin Tone", []string{"raising_hand_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fe\u200d\u2642\ufe0f", "man raising hand: Medium-Dark Skin Tone", []string{"raising_hand_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fb\u200d\u2640\ufe0f", "woman raising hand: Light Skin Tone", []string{"raising_hand_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fc\u200d\u2640\ufe0f", "woman raising hand: Medium-Light Skin Tone", []string{"raising_hand_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fd\u200d\u2640\ufe0f", "woman raising hand: Medium Skin Tone", []string{"raising_hand_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3fe\u200d\u2640\ufe0f", "woman raising hand: Medium-Dark Skin Tone", []string{"raising_hand_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f64b\U0001f3ff\u200d\u2640\ufe0f", "woman raising hand: Dark Skin Tone", []string{"raising_hand_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f9b0", "man: red hair: Medium Skin Tone", []string{"red_haired_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f9b0", "man: red hair: Medium-Dark Skin Tone", []string{"red_haired_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f9b0", "man: red hair: Dark Skin Tone", []string{"red_haired_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f9b0", "man: red hair: Light Skin Tone", []string{"red_haired_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f9b0", "man: red hair: Medium-Light Skin Tone", []string{"red_haired_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f9b0", "woman: red hair: Medium-Dark Skin Tone", []string{"red_haired_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f9b0", "woman: red hair: Dark Skin Tone", []string{"red_haired_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f9b0", "woman: red hair: Light Skin Tone", []string{"red_haired_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f9b0", "woman: red hair: Medium-Light Skin Tone", []string{"red_haired_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f9b0", "woman: red hair: Medium Skin Tone", []string{"red_haired_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fb", "person rowing boat: Light Skin Tone", []string{"rowboat_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fc", "person rowing boat: Medium-Light Skin Tone", []string{"rowboat_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fd", "person rowing boat: Medium Skin Tone", []string{"rowboat_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fe", "person rowing boat: Medium-Dark Skin Tone", []string{"rowboat_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3ff", "person rowing boat: Dark Skin Tone", []string{"rowboat_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3ff\u200d\u2642\ufe0f", "man rowing boat: Dark Skin Tone", []string{"rowing_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fb\u200d\u2642\ufe0f", "man rowing boat: Light Skin Tone", []string{"rowing_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fc\u200d\u2642\ufe0f", "man rowing boat: Medium-Light Skin Tone", []string{"rowing_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fd\u200d\u2642\ufe0f", "man rowing boat: Medium Skin Tone", []string{"rowing_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fe\u200d\u2642\ufe0f", "man rowing boat: Medium-Dark Skin Tone", []string{"rowing_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fb\u200d\u2640\ufe0f", "woman rowing boat: Light Skin Tone", []string{"rowing_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fc\u200d\u2640\ufe0f", "woman rowing boat: Medium-Light Skin Tone", []string{"rowing_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fd\u200d\u2640\ufe0f", "woman rowing boat: Medium Skin Tone", []string{"rowing_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3fe\u200d\u2640\ufe0f", "woman rowing boat: Medium-Dark Skin Tone", []string{"rowing_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6a3\U0001f3ff\u200d\u2640\ufe0f", "woman rowing boat: Dark Skin Tone", []string{"rowing_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fb", "person running: Light Skin Tone", []string{"runner_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fc", "person running: Medium-Light Skin Tone", []string{"runner_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fd", "person running: Medium Skin Tone", []string{"runner_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fe", "person running: Medium-Dark Skin Tone", []string{"runner_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3ff", "person running: Dark Skin Tone", []string{"runner_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fb\u200d\u2642\ufe0f", "man running: Light Skin Tone", []string{"running_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fc\u200d\u2642\ufe0f", "man running: Medium-Light Skin Tone", []string{"running_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fd\u200d\u2642\ufe0f", "man running: Medium Skin Tone", []string{"running_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fe\u200d\u2642\ufe0f", "man running: Medium-Dark Skin Tone", []string{"running_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3ff\u200d\u2642\ufe0f", "man running: Dark Skin Tone", []string{"running_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3ff\u200d\u2640\ufe0f", "woman running: Dark Skin Tone", []string{"running_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fb\u200d\u2640\ufe0f", "woman running: Light Skin Tone", []string{"running_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fc\u200d\u2640\ufe0f", "woman running: Medium-Light Skin Tone", []string{"running_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fd\u200d\u2640\ufe0f", "woman running: Medium Skin Tone", []string{"running_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3c3\U0001f3fe\u200d\u2640\ufe0f", "woman running: Medium-Dark Skin Tone", []string{"running_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f385\U0001f3fb", "Santa Claus: Light Skin Tone", []string{"santa_Light_Skin_Tone"}, "12.0", false}, {"\U0001f385\U0001f3fc", "Santa Claus: Medium-Light Skin Tone", []string{"santa_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f385\U0001f3fd", "Santa Claus: Medium Skin Tone", []string{"santa_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f385\U0001f3fe", "Santa Claus: Medium-Dark Skin Tone", []string{"santa_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f385\U0001f3ff", "Santa Claus: Dark Skin Tone", []string{"santa_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fb\u200d\u2642\ufe0f", "man in steamy room: Light Skin Tone", []string{"sauna_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fc\u200d\u2642\ufe0f", "man in steamy room: Medium-Light Skin Tone", []string{"sauna_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fd\u200d\u2642\ufe0f", "man in steamy room: Medium Skin Tone", []string{"sauna_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fe\u200d\u2642\ufe0f", "man in steamy room: Medium-Dark Skin Tone", []string{"sauna_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3ff\u200d\u2642\ufe0f", "man in steamy room: Dark Skin Tone", []string{"sauna_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3ff", "person in steamy room: Dark Skin Tone", []string{"sauna_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fb", "person in steamy room: Light Skin Tone", []string{"sauna_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fc", "person in steamy room: Medium-Light Skin Tone", []string{"sauna_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fd", "person in steamy room: Medium Skin Tone", []string{"sauna_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fe", "person in steamy room: Medium-Dark Skin Tone", []string{"sauna_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fc\u200d\u2640\ufe0f", "woman in steamy room: Medium-Light Skin Tone", []string{"sauna_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fd\u200d\u2640\ufe0f", "woman in steamy room: Medium Skin Tone", []string{"sauna_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fe\u200d\u2640\ufe0f", "woman in steamy room: Medium-Dark Skin Tone", []string{"sauna_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3ff\u200d\u2640\ufe0f", "woman in steamy room: Dark Skin Tone", []string{"sauna_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d6\U0001f3fb\u200d\u2640\ufe0f", "woman in steamy room: Light Skin Tone", []string{"sauna_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f52c", "scientist: Light Skin Tone", []string{"scientist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f52c", "scientist: Medium-Light Skin Tone", []string{"scientist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f52c", "scientist: Medium Skin Tone", []string{"scientist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f52c", "scientist: Medium-Dark Skin Tone", []string{"scientist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f52c", "scientist: Dark Skin Tone", []string{"scientist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f933\U0001f3fb", "selfie: Light Skin Tone", []string{"selfie_Light_Skin_Tone"}, "12.0", false}, {"\U0001f933\U0001f3fc", "selfie: Medium-Light Skin Tone", []string{"selfie_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f933\U0001f3fd", "selfie: Medium Skin Tone", []string{"selfie_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f933\U0001f3fe", "selfie: Medium-Dark Skin Tone", []string{"selfie_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f933\U0001f3ff", "selfie: Dark Skin Tone", []string{"selfie_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fe", "person shrugging: Medium-Dark Skin Tone", []string{"shrug_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3ff", "person shrugging: Dark Skin Tone", []string{"shrug_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fb", "person shrugging: Light Skin Tone", []string{"shrug_Light_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fc", "person shrugging: Medium-Light Skin Tone", []string{"shrug_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fd", "person shrugging: Medium Skin Tone", []string{"shrug_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f3a4", "singer: Light Skin Tone", []string{"singer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f3a4", "singer: Medium-Light Skin Tone", []string{"singer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f3a4", "singer: Medium Skin Tone", []string{"singer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f3a4", "singer: Medium-Dark Skin Tone", []string{"singer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f3a4", "singer: Dark Skin Tone", []string{"singer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6cc\U0001f3fd", "person in bed: Medium Skin Tone", []string{"sleeping_bed_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6cc\U0001f3fe", "person in bed: Medium-Dark Skin Tone", []string{"sleeping_bed_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6cc\U0001f3ff", "person in bed: Dark Skin Tone", []string{"sleeping_bed_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6cc\U0001f3fb", "person in bed: Light Skin Tone", []string{"sleeping_bed_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6cc\U0001f3fc", "person in bed: Medium-Light Skin Tone", []string{"sleeping_bed_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c2\U0001f3fe", "snowboarder: Medium-Dark Skin Tone", []string{"snowboarder_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c2\U0001f3ff", "snowboarder: Dark Skin Tone", []string{"snowboarder_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c2\U0001f3fb", "snowboarder: Light Skin Tone", []string{"snowboarder_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c2\U0001f3fc", "snowboarder: Medium-Light Skin Tone", []string{"snowboarder_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c2\U0001f3fd", "snowboarder: Medium Skin Tone", []string{"snowboarder_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3ff\u200d\u2642\ufe0f", "man standing: Dark Skin Tone", []string{"standing_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fb\u200d\u2642\ufe0f", "man standing: Light Skin Tone", []string{"standing_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fc\u200d\u2642\ufe0f", "man standing: Medium-Light Skin Tone", []string{"standing_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fd\u200d\u2642\ufe0f", "man standing: Medium Skin Tone", []string{"standing_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fe\u200d\u2642\ufe0f", "man standing: Medium-Dark Skin Tone", []string{"standing_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fb", "person standing: Light Skin Tone", []string{"standing_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fc", "person standing: Medium-Light Skin Tone", []string{"standing_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fd", "person standing: Medium Skin Tone", []string{"standing_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fe", "person standing: Medium-Dark Skin Tone", []string{"standing_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3ff", "person standing: Dark Skin Tone", []string{"standing_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3ff\u200d\u2640\ufe0f", "woman standing: Dark Skin Tone", []string{"standing_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fb\u200d\u2640\ufe0f", "woman standing: Light Skin Tone", []string{"standing_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fc\u200d\u2640\ufe0f", "woman standing: Medium-Light Skin Tone", []string{"standing_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fd\u200d\u2640\ufe0f", "woman standing: Medium Skin Tone", []string{"standing_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9cd\U0001f3fe\u200d\u2640\ufe0f", "woman standing: Medium-Dark Skin Tone", []string{"standing_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f393", "student: Light Skin Tone", []string{"student_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f393", "student: Medium-Light Skin Tone", []string{"student_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f393", "student: Medium Skin Tone", []string{"student_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f393", "student: Medium-Dark Skin Tone", []string{"student_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f393", "student: Dark Skin Tone", []string{"student_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fb", "superhero: Light Skin Tone", []string{"superhero_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fc", "superhero: Medium-Light Skin Tone", []string{"superhero_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fd", "superhero: Medium Skin Tone", []string{"superhero_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fe", "superhero: Medium-Dark Skin Tone", []string{"superhero_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3ff", "superhero: Dark Skin Tone", []string{"superhero_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fb\u200d\u2642\ufe0f", "man superhero: Light Skin Tone", []string{"superhero_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fc\u200d\u2642\ufe0f", "man superhero: Medium-Light Skin Tone", []string{"superhero_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fd\u200d\u2642\ufe0f", "man superhero: Medium Skin Tone", []string{"superhero_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fe\u200d\u2642\ufe0f", "man superhero: Medium-Dark Skin Tone", []string{"superhero_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3ff\u200d\u2642\ufe0f", "man superhero: Dark Skin Tone", []string{"superhero_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fb\u200d\u2640\ufe0f", "woman superhero: Light Skin Tone", []string{"superhero_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fc\u200d\u2640\ufe0f", "woman superhero: Medium-Light Skin Tone", []string{"superhero_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fd\u200d\u2640\ufe0f", "woman superhero: Medium Skin Tone", []string{"superhero_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3fe\u200d\u2640\ufe0f", "woman superhero: Medium-Dark Skin Tone", []string{"superhero_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b8\U0001f3ff\u200d\u2640\ufe0f", "woman superhero: Dark Skin Tone", []string{"superhero_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fe", "supervillain: Medium-Dark Skin Tone", []string{"supervillain_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3ff", "supervillain: Dark Skin Tone", []string{"supervillain_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fb", "supervillain: Light Skin Tone", []string{"supervillain_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fc", "supervillain: Medium-Light Skin Tone", []string{"supervillain_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fd", "supervillain: Medium Skin Tone", []string{"supervillain_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fb\u200d\u2642\ufe0f", "man supervillain: Light Skin Tone", []string{"supervillain_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fc\u200d\u2642\ufe0f", "man supervillain: Medium-Light Skin Tone", []string{"supervillain_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fd\u200d\u2642\ufe0f", "man supervillain: Medium Skin Tone", []string{"supervillain_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fe\u200d\u2642\ufe0f", "man supervillain: Medium-Dark Skin Tone", []string{"supervillain_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3ff\u200d\u2642\ufe0f", "man supervillain: Dark Skin Tone", []string{"supervillain_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fb\u200d\u2640\ufe0f", "woman supervillain: Light Skin Tone", []string{"supervillain_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fc\u200d\u2640\ufe0f", "woman supervillain: Medium-Light Skin Tone", []string{"supervillain_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fd\u200d\u2640\ufe0f", "woman supervillain: Medium Skin Tone", []string{"supervillain_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3fe\u200d\u2640\ufe0f", "woman supervillain: Medium-Dark Skin Tone", []string{"supervillain_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9b9\U0001f3ff\u200d\u2640\ufe0f", "woman supervillain: Dark Skin Tone", []string{"supervillain_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fb", "person surfing: Light Skin Tone", []string{"surfer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fc", "person surfing: Medium-Light Skin Tone", []string{"surfer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fd", "person surfing: Medium Skin Tone", []string{"surfer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fe", "person surfing: Medium-Dark Skin Tone", []string{"surfer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3ff", "person surfing: Dark Skin Tone", []string{"surfer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fc\u200d\u2642\ufe0f", "man surfing: Medium-Light Skin Tone", []string{"surfing_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fd\u200d\u2642\ufe0f", "man surfing: Medium Skin Tone", []string{"surfing_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fe\u200d\u2642\ufe0f", "man surfing: Medium-Dark Skin Tone", []string{"surfing_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3ff\u200d\u2642\ufe0f", "man surfing: Dark Skin Tone", []string{"surfing_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fb\u200d\u2642\ufe0f", "man surfing: Light Skin Tone", []string{"surfing_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fb\u200d\u2640\ufe0f", "woman surfing: Light Skin Tone", []string{"surfing_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fc\u200d\u2640\ufe0f", "woman surfing: Medium-Light Skin Tone", []string{"surfing_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fd\u200d\u2640\ufe0f", "woman surfing: Medium Skin Tone", []string{"surfing_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3fe\u200d\u2640\ufe0f", "woman surfing: Medium-Dark Skin Tone", []string{"surfing_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3c4\U0001f3ff\u200d\u2640\ufe0f", "woman surfing: Dark Skin Tone", []string{"surfing_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fb", "person swimming: Light Skin Tone", []string{"swimmer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fc", "person swimming: Medium-Light Skin Tone", []string{"swimmer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fd", "person swimming: Medium Skin Tone", []string{"swimmer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fe", "person swimming: Medium-Dark Skin Tone", []string{"swimmer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3ff", "person swimming: Dark Skin Tone", []string{"swimmer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fb\u200d\u2642\ufe0f", "man swimming: Light Skin Tone", []string{"swimming_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fc\u200d\u2642\ufe0f", "man swimming: Medium-Light Skin Tone", []string{"swimming_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fd\u200d\u2642\ufe0f", "man swimming: Medium Skin Tone", []string{"swimming_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fe\u200d\u2642\ufe0f", "man swimming: Medium-Dark Skin Tone", []string{"swimming_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3ff\u200d\u2642\ufe0f", "man swimming: Dark Skin Tone", []string{"swimming_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fe\u200d\u2640\ufe0f", "woman swimming: Medium-Dark Skin Tone", []string{"swimming_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3ff\u200d\u2640\ufe0f", "woman swimming: Dark Skin Tone", []string{"swimming_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fb\u200d\u2640\ufe0f", "woman swimming: Light Skin Tone", []string{"swimming_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fc\u200d\u2640\ufe0f", "woman swimming: Medium-Light Skin Tone", []string{"swimming_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3ca\U0001f3fd\u200d\u2640\ufe0f", "woman swimming: Medium Skin Tone", []string{"swimming_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f3eb", "teacher: Light Skin Tone", []string{"teacher_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f3eb", "teacher: Medium-Light Skin Tone", []string{"teacher_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f3eb", "teacher: Medium Skin Tone", []string{"teacher_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f3eb", "teacher: Medium-Dark Skin Tone", []string{"teacher_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f3eb", "teacher: Dark Skin Tone", []string{"teacher_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fb\u200d\U0001f4bb", "technologist: Light Skin Tone", []string{"technologist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fc\u200d\U0001f4bb", "technologist: Medium-Light Skin Tone", []string{"technologist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fd\u200d\U0001f4bb", "technologist: Medium Skin Tone", []string{"technologist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3fe\u200d\U0001f4bb", "technologist: Medium-Dark Skin Tone", []string{"technologist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d1\U0001f3ff\u200d\U0001f4bb", "technologist: Dark Skin Tone", []string{"technologist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fb\u200d\u2642\ufe0f", "man tipping hand: Light Skin Tone", []string{"tipping_hand_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fc\u200d\u2642\ufe0f", "man tipping hand: Medium-Light Skin Tone", []string{"tipping_hand_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fd\u200d\u2642\ufe0f", "man tipping hand: Medium Skin Tone", []string{"tipping_hand_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fe\u200d\u2642\ufe0f", "man tipping hand: Medium-Dark Skin Tone", []string{"tipping_hand_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3ff\u200d\u2642\ufe0f", "man tipping hand: Dark Skin Tone", []string{"tipping_hand_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fb", "person tipping hand: Light Skin Tone", []string{"tipping_hand_person_Light_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fc", "person tipping hand: Medium-Light Skin Tone", []string{"tipping_hand_person_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fd", "person tipping hand: Medium Skin Tone", []string{"tipping_hand_person_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fe", "person tipping hand: Medium-Dark Skin Tone", []string{"tipping_hand_person_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3ff", "person tipping hand: Dark Skin Tone", []string{"tipping_hand_person_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fb\u200d\u2640\ufe0f", "woman tipping hand: Light Skin Tone", []string{"tipping_hand_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fc\u200d\u2640\ufe0f", "woman tipping hand: Medium-Light Skin Tone", []string{"tipping_hand_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fd\u200d\u2640\ufe0f", "woman tipping hand: Medium Skin Tone", []string{"tipping_hand_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3fe\u200d\u2640\ufe0f", "woman tipping hand: Medium-Dark Skin Tone", []string{"tipping_hand_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f481\U0001f3ff\u200d\u2640\ufe0f", "woman tipping hand: Dark Skin Tone", []string{"tipping_hand_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46c\U0001f3fb", "men holding hands: Light Skin Tone", []string{"two_men_holding_hands_Light_Skin_Tone"}, "12.0", false}, {"\U0001f46c\U0001f3fc", "men holding hands: Medium-Light Skin Tone", []string{"two_men_holding_hands_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f46c\U0001f3fd", "men holding hands: Medium Skin Tone", []string{"two_men_holding_hands_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f46c\U0001f3fe", "men holding hands: Medium-Dark Skin Tone", []string{"two_men_holding_hands_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46c\U0001f3ff", "men holding hands: Dark Skin Tone", []string{"two_men_holding_hands_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46d\U0001f3fb", "women holding hands: Light Skin Tone", []string{"two_women_holding_hands_Light_Skin_Tone"}, "12.0", false}, {"\U0001f46d\U0001f3fc", "women holding hands: Medium-Light Skin Tone", []string{"two_women_holding_hands_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f46d\U0001f3fd", "women holding hands: Medium Skin Tone", []string{"two_women_holding_hands_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f46d\U0001f3fe", "women holding hands: Medium-Dark Skin Tone", []string{"two_women_holding_hands_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f46d\U0001f3ff", "women holding hands: Dark Skin Tone", []string{"two_women_holding_hands_Dark_Skin_Tone"}, "12.0", false}, {"\u270c\U0001f3fb\ufe0f", "victory hand: Light Skin Tone", []string{"v_Light_Skin_Tone"}, "12.0", false}, {"\u270c\U0001f3fc\ufe0f", "victory hand: Medium-Light Skin Tone", []string{"v_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u270c\U0001f3fd\ufe0f", "victory hand: Medium Skin Tone", []string{"v_Medium_Skin_Tone"}, "12.0", false}, {"\u270c\U0001f3fe\ufe0f", "victory hand: Medium-Dark Skin Tone", []string{"v_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u270c\U0001f3ff\ufe0f", "victory hand: Dark Skin Tone", []string{"v_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fd", "vampire: Medium Skin Tone", []string{"vampire_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fe", "vampire: Medium-Dark Skin Tone", []string{"vampire_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3ff", "vampire: Dark Skin Tone", []string{"vampire_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fb", "vampire: Light Skin Tone", []string{"vampire_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fc", "vampire: Medium-Light Skin Tone", []string{"vampire_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fb\u200d\u2642\ufe0f", "man vampire: Light Skin Tone", []string{"vampire_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fc\u200d\u2642\ufe0f", "man vampire: Medium-Light Skin Tone", []string{"vampire_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fd\u200d\u2642\ufe0f", "man vampire: Medium Skin Tone", []string{"vampire_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fe\u200d\u2642\ufe0f", "man vampire: Medium-Dark Skin Tone", []string{"vampire_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3ff\u200d\u2642\ufe0f", "man vampire: Dark Skin Tone", []string{"vampire_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fb\u200d\u2640\ufe0f", "woman vampire: Light Skin Tone", []string{"vampire_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fc\u200d\u2640\ufe0f", "woman vampire: Medium-Light Skin Tone", []string{"vampire_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fd\u200d\u2640\ufe0f", "woman vampire: Medium Skin Tone", []string{"vampire_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3fe\u200d\u2640\ufe0f", "woman vampire: Medium-Dark Skin Tone", []string{"vampire_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9db\U0001f3ff\u200d\u2640\ufe0f", "woman vampire: Dark Skin Tone", []string{"vampire_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f596\U0001f3fb", "vulcan salute: Light Skin Tone", []string{"vulcan_salute_Light_Skin_Tone"}, "12.0", false}, {"\U0001f596\U0001f3fc", "vulcan salute: Medium-Light Skin Tone", []string{"vulcan_salute_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f596\U0001f3fd", "vulcan salute: Medium Skin Tone", []string{"vulcan_salute_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f596\U0001f3fe", "vulcan salute: Medium-Dark Skin Tone", []string{"vulcan_salute_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f596\U0001f3ff", "vulcan salute: Dark Skin Tone", []string{"vulcan_salute_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fb", "person walking: Light Skin Tone", []string{"walking_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fc", "person walking: Medium-Light Skin Tone", []string{"walking_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fd", "person walking: Medium Skin Tone", []string{"walking_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fe", "person walking: Medium-Dark Skin Tone", []string{"walking_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3ff", "person walking: Dark Skin Tone", []string{"walking_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fc\u200d\u2642\ufe0f", "man walking: Medium-Light Skin Tone", []string{"walking_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fd\u200d\u2642\ufe0f", "man walking: Medium Skin Tone", []string{"walking_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fe\u200d\u2642\ufe0f", "man walking: Medium-Dark Skin Tone", []string{"walking_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3ff\u200d\u2642\ufe0f", "man walking: Dark Skin Tone", []string{"walking_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fb\u200d\u2642\ufe0f", "man walking: Light Skin Tone", []string{"walking_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fe\u200d\u2640\ufe0f", "woman walking: Medium-Dark Skin Tone", []string{"walking_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3ff\u200d\u2640\ufe0f", "woman walking: Dark Skin Tone", []string{"walking_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fb\u200d\u2640\ufe0f", "woman walking: Light Skin Tone", []string{"walking_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fc\u200d\u2640\ufe0f", "woman walking: Medium-Light Skin Tone", []string{"walking_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f6b6\U0001f3fd\u200d\u2640\ufe0f", "woman walking: Medium Skin Tone", []string{"walking_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fb", "person playing water polo: Light Skin Tone", []string{"water_polo_Light_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fc", "person playing water polo: Medium-Light Skin Tone", []string{"water_polo_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fd", "person playing water polo: Medium Skin Tone", []string{"water_polo_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fe", "person playing water polo: Medium-Dark Skin Tone", []string{"water_polo_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3ff", "person playing water polo: Dark Skin Tone", []string{"water_polo_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44b\U0001f3ff", "waving hand: Dark Skin Tone", []string{"wave_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f44b\U0001f3fb", "waving hand: Light Skin Tone", []string{"wave_Light_Skin_Tone"}, "12.0", false}, {"\U0001f44b\U0001f3fc", "waving hand: Medium-Light Skin Tone", []string{"wave_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f44b\U0001f3fd", "waving hand: Medium Skin Tone", []string{"wave_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f44b\U0001f3fe", "waving hand: Medium-Dark Skin Tone", []string{"wave_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fb\ufe0f", "person lifting weights: Light Skin Tone", []string{"weight_lifting_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fc\ufe0f", "person lifting weights: Medium-Light Skin Tone", []string{"weight_lifting_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fd\ufe0f", "person lifting weights: Medium Skin Tone", []string{"weight_lifting_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fe\ufe0f", "person lifting weights: Medium-Dark Skin Tone", []string{"weight_lifting_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3ff\ufe0f", "person lifting weights: Dark Skin Tone", []string{"weight_lifting_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fb\ufe0f\u200d\u2642\ufe0f", "man lifting weights: Light Skin Tone", []string{"weight_lifting_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fc\ufe0f\u200d\u2642\ufe0f", "man lifting weights: Medium-Light Skin Tone", []string{"weight_lifting_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fd\ufe0f\u200d\u2642\ufe0f", "man lifting weights: Medium Skin Tone", []string{"weight_lifting_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fe\ufe0f\u200d\u2642\ufe0f", "man lifting weights: Medium-Dark Skin Tone", []string{"weight_lifting_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3ff\ufe0f\u200d\u2642\ufe0f", "man lifting weights: Dark Skin Tone", []string{"weight_lifting_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fb\ufe0f\u200d\u2640\ufe0f", "woman lifting weights: Light Skin Tone", []string{"weight_lifting_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fc\ufe0f\u200d\u2640\ufe0f", "woman lifting weights: Medium-Light Skin Tone", []string{"weight_lifting_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fd\ufe0f\u200d\u2640\ufe0f", "woman lifting weights: Medium Skin Tone", []string{"weight_lifting_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3fe\ufe0f\u200d\u2640\ufe0f", "woman lifting weights: Medium-Dark Skin Tone", []string{"weight_lifting_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f3cb\U0001f3ff\ufe0f\u200d\u2640\ufe0f", "woman lifting weights: Dark Skin Tone", []string{"weight_lifting_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fc\u200d\U0001f9b3", "man: white hair: Medium-Light Skin Tone", []string{"white_haired_man_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fd\u200d\U0001f9b3", "man: white hair: Medium Skin Tone", []string{"white_haired_man_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fe\u200d\U0001f9b3", "man: white hair: Medium-Dark Skin Tone", []string{"white_haired_man_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3ff\u200d\U0001f9b3", "man: white hair: Dark Skin Tone", []string{"white_haired_man_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f468\U0001f3fb\u200d\U0001f9b3", "man: white hair: Light Skin Tone", []string{"white_haired_man_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f9b3", "woman: white hair: Dark Skin Tone", []string{"white_haired_woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f9b3", "woman: white hair: Light Skin Tone", []string{"white_haired_woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f9b3", "woman: white hair: Medium-Light Skin Tone", []string{"white_haired_woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f9b3", "woman: white hair: Medium Skin Tone", []string{"white_haired_woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f9b3", "woman: white hair: Medium-Dark Skin Tone", []string{"white_haired_woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff", "woman: Dark Skin Tone", []string{"woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb", "woman: Light Skin Tone", []string{"woman_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe", "woman: Medium-Dark Skin Tone", []string{"woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc", "woman: Medium-Light Skin Tone", []string{"woman_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd", "woman: Medium Skin Tone", []string{"woman_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe", "woman: Medium-Dark Skin Tone", []string{"woman_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff", "woman: Dark Skin Tone", []string{"woman_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f3a8", "woman artist", []string{"woman_artist"}, "", true}, {"\U0001f469\U0001f3ff\u200d\U0001f3a8", "woman artist: Dark Skin Tone", []string{"woman_artist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f3a8", "woman artist: Light Skin Tone", []string{"woman_artist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f3a8", "woman artist: Medium-Dark Skin Tone", []string{"woman_artist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f3a8", "woman artist: Medium-Light Skin Tone", []string{"woman_artist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f3a8", "woman artist: Medium Skin Tone", []string{"woman_artist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f3a8", "woman artist: Medium-Dark Skin Tone", []string{"woman_artist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f3a8", "woman artist: Dark Skin Tone", []string{"woman_artist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f680", "woman astronaut", []string{"woman_astronaut"}, "", true}, {"\U0001f469\U0001f3ff\u200d\U0001f680", "woman astronaut: Dark Skin Tone", []string{"woman_astronaut_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f680", "woman astronaut: Light Skin Tone", []string{"woman_astronaut_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f680", "woman astronaut: Medium-Dark Skin Tone", []string{"woman_astronaut_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f680", "woman astronaut: Medium-Light Skin Tone", []string{"woman_astronaut_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f680", "woman astronaut: Medium Skin Tone", []string{"woman_astronaut_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f680", "woman astronaut: Medium-Dark Skin Tone", []string{"woman_astronaut_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\u200d\u2640\ufe0f", "woman: beard", []string{"woman_beard"}, "13.1", true}, {"\U0001f9d4\U0001f3ff\u200d\u2640\ufe0f", "woman: beard: Dark Skin Tone", []string{"woman_beard_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fb\u200d\u2640\ufe0f", "woman: beard: Light Skin Tone", []string{"woman_beard_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fe\u200d\u2640\ufe0f", "woman: beard: Medium-Dark Skin Tone", []string{"woman_beard_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fc\u200d\u2640\ufe0f", "woman: beard: Medium-Light Skin Tone", []string{"woman_beard_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d4\U0001f3fd\u200d\u2640\ufe0f", "woman: beard: Medium Skin Tone", []string{"woman_beard_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f938\u200d\u2640\ufe0f", "woman cartwheeling", []string{"woman_cartwheeling"}, "", true}, {"\U0001f938\U0001f3ff\u200d\u2640\ufe0f", "woman cartwheeling: Dark Skin Tone", []string{"woman_cartwheeling_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fb\u200d\u2640\ufe0f", "woman cartwheeling: Light Skin Tone", []string{"woman_cartwheeling_Light_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fe\u200d\u2640\ufe0f", "woman cartwheeling: Medium-Dark Skin Tone", []string{"woman_cartwheeling_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fc\u200d\u2640\ufe0f", "woman cartwheeling: Medium-Light Skin Tone", []string{"woman_cartwheeling_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fd\u200d\u2640\ufe0f", "woman cartwheeling: Medium Skin Tone", []string{"woman_cartwheeling_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3fe\u200d\u2640\ufe0f", "woman cartwheeling: Medium-Dark Skin Tone", []string{"woman_cartwheeling_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f938\U0001f3ff\u200d\u2640\ufe0f", "woman cartwheeling: Dark Skin Tone", []string{"woman_cartwheeling_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f373", "woman cook", []string{"woman_cook"}, "", true}, {"\U0001f469\U0001f3ff\u200d\U0001f373", "woman cook: Dark Skin Tone", []string{"woman_cook_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f373", "woman cook: Light Skin Tone", []string{"woman_cook_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f373", "woman cook: Medium-Dark Skin Tone", []string{"woman_cook_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f373", "woman cook: Medium-Light Skin Tone", []string{"woman_cook_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f373", "woman cook: Medium Skin Tone", []string{"woman_cook_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f373", "woman cook: Medium-Dark Skin Tone", []string{"woman_cook_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f373", "woman cook: Dark Skin Tone", []string{"woman_cook_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f483", "woman dancing", []string{"woman_dancing", "dancer"}, "6.0", true}, {"\U0001f483\U0001f3ff", "woman dancing: Dark Skin Tone", []string{"woman_dancing_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f483\U0001f3fb", "woman dancing: Light Skin Tone", []string{"woman_dancing_Light_Skin_Tone"}, "12.0", false}, {"\U0001f483\U0001f3fe", "woman dancing: Medium-Dark Skin Tone", []string{"woman_dancing_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f483\U0001f3fc", "woman dancing: Medium-Light Skin Tone", []string{"woman_dancing_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f483\U0001f3fd", "woman dancing: Medium Skin Tone", []string{"woman_dancing_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f483\U0001f3fe", "woman dancing: Medium-Dark Skin Tone", []string{"woman_dancing_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f483\U0001f3ff", "woman dancing: Dark Skin Tone", []string{"woman_dancing_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f926\u200d\u2640\ufe0f", "woman facepalming", []string{"woman_facepalming"}, "9.0", true}, {"\U0001f926\U0001f3ff\u200d\u2640\ufe0f", "woman facepalming: Dark Skin Tone", []string{"woman_facepalming_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fb\u200d\u2640\ufe0f", "woman facepalming: Light Skin Tone", []string{"woman_facepalming_Light_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fe\u200d\u2640\ufe0f", "woman facepalming: Medium-Dark Skin Tone", []string{"woman_facepalming_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fc\u200d\u2640\ufe0f", "woman facepalming: Medium-Light Skin Tone", []string{"woman_facepalming_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fd\u200d\u2640\ufe0f", "woman facepalming: Medium Skin Tone", []string{"woman_facepalming_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3fe\u200d\u2640\ufe0f", "woman facepalming: Medium-Dark Skin Tone", []string{"woman_facepalming_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f926\U0001f3ff\u200d\u2640\ufe0f", "woman facepalming: Dark Skin Tone", []string{"woman_facepalming_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f3ed", "woman factory worker", []string{"woman_factory_worker"}, "", true}, {"\U0001f469\U0001f3ff\u200d\U0001f3ed", "woman factory worker: Dark Skin Tone", []string{"woman_factory_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f3ed", "woman factory worker: Light Skin Tone", []string{"woman_factory_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f3ed", "woman factory worker: Medium-Dark Skin Tone", []string{"woman_factory_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f3ed", "woman factory worker: Medium-Light Skin Tone", []string{"woman_factory_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f3ed", "woman factory worker: Medium Skin Tone", []string{"woman_factory_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f3ed", "woman factory worker: Medium-Dark Skin Tone", []string{"woman_factory_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f3ed", "woman factory worker: Dark Skin Tone", []string{"woman_factory_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f33e", "woman farmer", []string{"woman_farmer"}, "", true}, {"\U0001f469\U0001f3ff\u200d\U0001f33e", "woman farmer: Dark Skin Tone", []string{"woman_farmer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f33e", "woman farmer: Light Skin Tone", []string{"woman_farmer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f33e", "woman farmer: Medium-Dark Skin Tone", []string{"woman_farmer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f33e", "woman farmer: Medium-Light Skin Tone", []string{"woman_farmer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f33e", "woman farmer: Medium Skin Tone", []string{"woman_farmer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f33e", "woman farmer: Medium-Dark Skin Tone", []string{"woman_farmer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f33e", "woman farmer: Dark Skin Tone", []string{"woman_farmer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f37c", "woman feeding baby", []string{"woman_feeding_baby"}, "13.0", true}, {"\U0001f469\U0001f3ff\u200d\U0001f37c", "woman feeding baby: Dark Skin Tone", []string{"woman_feeding_baby_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f37c", "woman feeding baby: Light Skin Tone", []string{"woman_feeding_baby_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f37c", "woman feeding baby: Medium-Dark Skin Tone", []string{"woman_feeding_baby_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f37c", "woman feeding baby: Medium-Light Skin Tone", []string{"woman_feeding_baby_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f37c", "woman feeding baby: Medium Skin Tone", []string{"woman_feeding_baby_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f692", "woman firefighter", []string{"woman_firefighter"}, "", true}, {"\U0001f469\U0001f3ff\u200d\U0001f692", "woman firefighter: Dark Skin Tone", []string{"woman_firefighter_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f692", "woman firefighter: Light Skin Tone", []string{"woman_firefighter_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f692", "woman firefighter: Medium-Dark Skin Tone", []string{"woman_firefighter_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f692", "woman firefighter: Medium-Light Skin Tone", []string{"woman_firefighter_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f692", "woman firefighter: Medium Skin Tone", []string{"woman_firefighter_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f692", "woman firefighter: Medium-Dark Skin Tone", []string{"woman_firefighter_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f692", "woman firefighter: Dark Skin Tone", []string{"woman_firefighter_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f692", "woman firefighter: Light Skin Tone", []string{"woman_firefighter_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\u2695\ufe0f", "woman health worker", []string{"woman_health_worker"}, "", true}, {"\U0001f469\U0001f3ff\u200d\u2695\ufe0f", "woman health worker: Dark Skin Tone", []string{"woman_health_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\u2695\ufe0f", "woman health worker: Light Skin Tone", []string{"woman_health_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\u2695\ufe0f", "woman health worker: Medium-Dark Skin Tone", []string{"woman_health_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\u2695\ufe0f", "woman health worker: Medium-Light Skin Tone", []string{"woman_health_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\u2695\ufe0f", "woman health worker: Medium Skin Tone", []string{"woman_health_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\u2695\ufe0f", "woman health worker: Medium-Dark Skin Tone", []string{"woman_health_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\u2695\ufe0f", "woman health worker: Dark Skin Tone", []string{"woman_health_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f9bd", "woman in manual wheelchair: Medium-Dark Skin Tone", []string{"woman_in_manual_wheelchair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f9bd", "woman in manual wheelchair", []string{"woman_in_manual_wheelchair"}, "12.0", true}, {"\U0001f469\U0001f3ff\u200d\U0001f9bd", "woman in manual wheelchair: Dark Skin Tone", []string{"woman_in_manual_wheelchair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f9bd", "woman in manual wheelchair: Light Skin Tone", []string{"woman_in_manual_wheelchair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f9bd", "woman in manual wheelchair: Medium-Dark Skin Tone", []string{"woman_in_manual_wheelchair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f9bd", "woman in manual wheelchair: Medium-Light Skin Tone", []string{"woman_in_manual_wheelchair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f9bd", "woman in manual wheelchair: Medium Skin Tone", []string{"woman_in_manual_wheelchair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f9bc", "woman in motorized wheelchair", []string{"woman_in_motorized_wheelchair"}, "12.0", true}, {"\U0001f469\U0001f3ff\u200d\U0001f9bc", "woman in motorized wheelchair: Dark Skin Tone", []string{"woman_in_motorized_wheelchair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f9bc", "woman in motorized wheelchair: Light Skin Tone", []string{"woman_in_motorized_wheelchair_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f9bc", "woman in motorized wheelchair: Medium-Dark Skin Tone", []string{"woman_in_motorized_wheelchair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f9bc", "woman in motorized wheelchair: Medium-Light Skin Tone", []string{"woman_in_motorized_wheelchair_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f9bc", "woman in motorized wheelchair: Medium Skin Tone", []string{"woman_in_motorized_wheelchair_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f9bc", "woman in motorized wheelchair: Medium-Dark Skin Tone", []string{"woman_in_motorized_wheelchair_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f9bc", "woman in motorized wheelchair: Dark Skin Tone", []string{"woman_in_motorized_wheelchair_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f935\u200d\u2640\ufe0f", "woman in tuxedo", []string{"woman_in_tuxedo"}, "13.0", true}, {"\U0001f935\U0001f3ff\u200d\u2640\ufe0f", "woman in tuxedo: Dark Skin Tone", []string{"woman_in_tuxedo_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fb\u200d\u2640\ufe0f", "woman in tuxedo: Light Skin Tone", []string{"woman_in_tuxedo_Light_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fe\u200d\u2640\ufe0f", "woman in tuxedo: Medium-Dark Skin Tone", []string{"woman_in_tuxedo_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fc\u200d\u2640\ufe0f", "woman in tuxedo: Medium-Light Skin Tone", []string{"woman_in_tuxedo_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f935\U0001f3fd\u200d\u2640\ufe0f", "woman in tuxedo: Medium Skin Tone", []string{"woman_in_tuxedo_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\u2696\ufe0f", "woman judge", []string{"woman_judge"}, "", true}, {"\U0001f469\U0001f3ff\u200d\u2696\ufe0f", "woman judge: Dark Skin Tone", []string{"woman_judge_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\u2696\ufe0f", "woman judge: Light Skin Tone", []string{"woman_judge_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\u2696\ufe0f", "woman judge: Medium-Dark Skin Tone", []string{"woman_judge_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\u2696\ufe0f", "woman judge: Medium-Light Skin Tone", []string{"woman_judge_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\u2696\ufe0f", "woman judge: Medium Skin Tone", []string{"woman_judge_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\u2696\ufe0f", "woman judge: Medium-Dark Skin Tone", []string{"woman_judge_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\u2696\ufe0f", "woman judge: Dark Skin Tone", []string{"woman_judge_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\u2696\ufe0f", "woman judge: Light Skin Tone", []string{"woman_judge_Light_Skin_Tone"}, "12.0", false}, {"\U0001f939\u200d\u2640\ufe0f", "woman juggling", []string{"woman_juggling"}, "9.0", true}, {"\U0001f939\U0001f3ff\u200d\u2640\ufe0f", "woman juggling: Dark Skin Tone", []string{"woman_juggling_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fb\u200d\u2640\ufe0f", "woman juggling: Light Skin Tone", []string{"woman_juggling_Light_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fe\u200d\u2640\ufe0f", "woman juggling: Medium-Dark Skin Tone", []string{"woman_juggling_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fc\u200d\u2640\ufe0f", "woman juggling: Medium-Light Skin Tone", []string{"woman_juggling_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fd\u200d\u2640\ufe0f", "woman juggling: Medium Skin Tone", []string{"woman_juggling_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3fe\u200d\u2640\ufe0f", "woman juggling: Medium-Dark Skin Tone", []string{"woman_juggling_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f939\U0001f3ff\u200d\u2640\ufe0f", "woman juggling: Dark Skin Tone", []string{"woman_juggling_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f527", "woman mechanic", []string{"woman_mechanic"}, "", true}, {"\U0001f469\U0001f3ff\u200d\U0001f527", "woman mechanic: Dark Skin Tone", []string{"woman_mechanic_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f527", "woman mechanic: Light Skin Tone", []string{"woman_mechanic_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f527", "woman mechanic: Medium-Dark Skin Tone", []string{"woman_mechanic_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f527", "woman mechanic: Medium-Light Skin Tone", []string{"woman_mechanic_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f527", "woman mechanic: Medium Skin Tone", []string{"woman_mechanic_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f527", "woman mechanic: Medium-Dark Skin Tone", []string{"woman_mechanic_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f527", "woman mechanic: Dark Skin Tone", []string{"woman_mechanic_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f4bc", "woman office worker", []string{"woman_office_worker"}, "", true}, {"\U0001f469\U0001f3ff\u200d\U0001f4bc", "woman office worker: Dark Skin Tone", []string{"woman_office_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f4bc", "woman office worker: Light Skin Tone", []string{"woman_office_worker_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f4bc", "woman office worker: Medium-Dark Skin Tone", []string{"woman_office_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f4bc", "woman office worker: Medium-Light Skin Tone", []string{"woman_office_worker_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f4bc", "woman office worker: Medium Skin Tone", []string{"woman_office_worker_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f4bc", "woman office worker: Medium-Dark Skin Tone", []string{"woman_office_worker_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f4bc", "woman office worker: Dark Skin Tone", []string{"woman_office_worker_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\u2708\ufe0f", "woman pilot: Medium Skin Tone", []string{"woman_pilot_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\u2708\ufe0f", "woman pilot: Medium-Dark Skin Tone", []string{"woman_pilot_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\u2708\ufe0f", "woman pilot", []string{"woman_pilot"}, "", true}, {"\U0001f469\U0001f3ff\u200d\u2708\ufe0f", "woman pilot: Dark Skin Tone", []string{"woman_pilot_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\u2708\ufe0f", "woman pilot: Light Skin Tone", []string{"woman_pilot_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\u2708\ufe0f", "woman pilot: Medium-Dark Skin Tone", []string{"woman_pilot_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\u2708\ufe0f", "woman pilot: Medium-Light Skin Tone", []string{"woman_pilot_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\u2708\ufe0f", "woman pilot: Medium Skin Tone", []string{"woman_pilot_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f93e\u200d\u2640\ufe0f", "woman playing handball", []string{"woman_playing_handball"}, "9.0", true}, {"\U0001f93e\U0001f3ff\u200d\u2640\ufe0f", "woman playing handball: Dark Skin Tone", []string{"woman_playing_handball_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fb\u200d\u2640\ufe0f", "woman playing handball: Light Skin Tone", []string{"woman_playing_handball_Light_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fe\u200d\u2640\ufe0f", "woman playing handball: Medium-Dark Skin Tone", []string{"woman_playing_handball_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fc\u200d\u2640\ufe0f", "woman playing handball: Medium-Light Skin Tone", []string{"woman_playing_handball_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fd\u200d\u2640\ufe0f", "woman playing handball: Medium Skin Tone", []string{"woman_playing_handball_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3fe\u200d\u2640\ufe0f", "woman playing handball: Medium-Dark Skin Tone", []string{"woman_playing_handball_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93e\U0001f3ff\u200d\u2640\ufe0f", "woman playing handball: Dark Skin Tone", []string{"woman_playing_handball_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93d\u200d\u2640\ufe0f", "woman playing water polo", []string{"woman_playing_water_polo"}, "9.0", true}, {"\U0001f93d\U0001f3ff\u200d\u2640\ufe0f", "woman playing water polo: Dark Skin Tone", []string{"woman_playing_water_polo_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fb\u200d\u2640\ufe0f", "woman playing water polo: Light Skin Tone", []string{"woman_playing_water_polo_Light_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fe\u200d\u2640\ufe0f", "woman playing water polo: Medium-Dark Skin Tone", []string{"woman_playing_water_polo_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fc\u200d\u2640\ufe0f", "woman playing water polo: Medium-Light Skin Tone", []string{"woman_playing_water_polo_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fd\u200d\u2640\ufe0f", "woman playing water polo: Medium Skin Tone", []string{"woman_playing_water_polo_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3fe\u200d\u2640\ufe0f", "woman playing water polo: Medium-Dark Skin Tone", []string{"woman_playing_water_polo_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f93d\U0001f3ff\u200d\u2640\ufe0f", "woman playing water polo: Dark Skin Tone", []string{"woman_playing_water_polo_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f52c", "woman scientist", []string{"woman_scientist"}, "", true}, {"\U0001f469\U0001f3ff\u200d\U0001f52c", "woman scientist: Dark Skin Tone", []string{"woman_scientist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f52c", "woman scientist: Light Skin Tone", []string{"woman_scientist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f52c", "woman scientist: Medium-Dark Skin Tone", []string{"woman_scientist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f52c", "woman scientist: Medium-Light Skin Tone", []string{"woman_scientist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f52c", "woman scientist: Medium Skin Tone", []string{"woman_scientist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f52c", "woman scientist: Medium-Dark Skin Tone", []string{"woman_scientist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f52c", "woman scientist: Dark Skin Tone", []string{"woman_scientist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f937\u200d\u2640\ufe0f", "woman shrugging", []string{"woman_shrugging"}, "9.0", true}, {"\U0001f937\U0001f3ff\u200d\u2640\ufe0f", "woman shrugging: Dark Skin Tone", []string{"woman_shrugging_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fb\u200d\u2640\ufe0f", "woman shrugging: Light Skin Tone", []string{"woman_shrugging_Light_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fe\u200d\u2640\ufe0f", "woman shrugging: Medium-Dark Skin Tone", []string{"woman_shrugging_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fc\u200d\u2640\ufe0f", "woman shrugging: Medium-Light Skin Tone", []string{"woman_shrugging_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fd\u200d\u2640\ufe0f", "woman shrugging: Medium Skin Tone", []string{"woman_shrugging_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f937\U0001f3fe\u200d\u2640\ufe0f", "woman shrugging: Medium-Dark Skin Tone", []string{"woman_shrugging_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f3a4", "woman singer", []string{"woman_singer"}, "", true}, {"\U0001f469\U0001f3ff\u200d\U0001f3a4", "woman singer: Dark Skin Tone", []string{"woman_singer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f3a4", "woman singer: Light Skin Tone", []string{"woman_singer_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f3a4", "woman singer: Medium-Dark Skin Tone", []string{"woman_singer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f3a4", "woman singer: Medium-Light Skin Tone", []string{"woman_singer_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f3a4", "woman singer: Medium Skin Tone", []string{"woman_singer_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f3a4", "woman singer: Medium-Dark Skin Tone", []string{"woman_singer_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f3a4", "woman singer: Dark Skin Tone", []string{"woman_singer_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f393", "woman student", []string{"woman_student"}, "", true}, {"\U0001f469\U0001f3ff\u200d\U0001f393", "woman student: Dark Skin Tone", []string{"woman_student_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f393", "woman student: Light Skin Tone", []string{"woman_student_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f393", "woman student: Medium-Dark Skin Tone", []string{"woman_student_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f393", "woman student: Medium-Light Skin Tone", []string{"woman_student_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f393", "woman student: Medium Skin Tone", []string{"woman_student_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f393", "woman student: Medium-Dark Skin Tone", []string{"woman_student_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3ff\u200d\U0001f393", "woman student: Dark Skin Tone", []string{"woman_student_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f3eb", "woman teacher: Medium-Light Skin Tone", []string{"woman_teacher_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f3eb", "woman teacher: Medium Skin Tone", []string{"woman_teacher_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f3eb", "woman teacher: Medium-Dark Skin Tone", []string{"woman_teacher_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f3eb", "woman teacher", []string{"woman_teacher"}, "", true}, {"\U0001f469\U0001f3ff\u200d\U0001f3eb", "woman teacher: Dark Skin Tone", []string{"woman_teacher_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f3eb", "woman teacher: Light Skin Tone", []string{"woman_teacher_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f4bb", "woman technologist: Medium-Dark Skin Tone", []string{"woman_technologist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f3eb", "woman teacher: Medium-Dark Skin Tone", []string{"woman_teacher_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f3eb", "woman teacher: Medium-Light Skin Tone", []string{"woman_teacher_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f3eb", "woman teacher: Medium Skin Tone", []string{"woman_teacher_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f4bb", "woman technologist", []string{"woman_technologist"}, "", true}, {"\U0001f469\U0001f3ff\u200d\U0001f4bb", "woman technologist: Dark Skin Tone", []string{"woman_technologist_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f4bb", "woman technologist: Light Skin Tone", []string{"woman_technologist_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f4bb", "woman technologist: Medium-Dark Skin Tone", []string{"woman_technologist_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f4bb", "woman technologist: Medium-Light Skin Tone", []string{"woman_technologist_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f4bb", "woman technologist: Medium Skin Tone", []string{"woman_technologist_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d5\U0001f3fd", "woman with headscarf: Medium Skin Tone", []string{"woman_with_headscarf_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f9d5\U0001f3fe", "woman with headscarf: Medium-Dark Skin Tone", []string{"woman_with_headscarf_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d5", "woman with headscarf", []string{"woman_with_headscarf"}, "11.0", true}, {"\U0001f9d5\U0001f3ff", "woman with headscarf: Dark Skin Tone", []string{"woman_with_headscarf_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d5\U0001f3fb", "woman with headscarf: Light Skin Tone", []string{"woman_with_headscarf_Light_Skin_Tone"}, "12.0", false}, {"\U0001f9d5\U0001f3fe", "woman with headscarf: Medium-Dark Skin Tone", []string{"woman_with_headscarf_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d5\U0001f3fc", "woman with headscarf: Medium-Light Skin Tone", []string{"woman_with_headscarf_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f9af", "woman with white cane: Medium-Dark Skin Tone", []string{"woman_with_probing_cane_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f9d5\U0001f3fd", "woman with headscarf: Medium Skin Tone", []string{"woman_with_headscarf_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f469\u200d\U0001f9af", "woman with white cane", []string{"woman_with_probing_cane"}, "12.0", true}, {"\U0001f469\U0001f3ff\u200d\U0001f9af", "woman with white cane: Dark Skin Tone", []string{"woman_with_probing_cane_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fb\u200d\U0001f9af", "woman with white cane: Light Skin Tone", []string{"woman_with_probing_cane_Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fe\u200d\U0001f9af", "woman with white cane: Medium-Dark Skin Tone", []string{"woman_with_probing_cane_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fc\u200d\U0001f9af", "woman with white cane: Medium-Light Skin Tone", []string{"woman_with_probing_cane_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f469\U0001f3fd\u200d\U0001f9af", "woman with white cane: Medium Skin Tone", []string{"woman_with_probing_cane_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fd\u200d\u2640\ufe0f", "woman wearing turban: Medium Skin Tone", []string{"woman_with_turban_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fe\u200d\u2640\ufe0f", "woman wearing turban: Medium-Dark Skin Tone", []string{"woman_with_turban_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f473\u200d\u2640\ufe0f", "woman wearing turban", []string{"woman_with_turban"}, "6.0", true}, {"\U0001f473\U0001f3ff\u200d\u2640\ufe0f", "woman wearing turban: Dark Skin Tone", []string{"woman_with_turban_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fb\u200d\u2640\ufe0f", "woman wearing turban: Light Skin Tone", []string{"woman_with_turban_Light_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fe\u200d\u2640\ufe0f", "woman wearing turban: Medium-Dark Skin Tone", []string{"woman_with_turban_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fc\u200d\u2640\ufe0f", "woman wearing turban: Medium-Light Skin Tone", []string{"woman_with_turban_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f473\U0001f3fd\u200d\u2640\ufe0f", "woman wearing turban: Medium Skin Tone", []string{"woman_with_turban_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f470\u200d\u2640\ufe0f", "woman with veil", []string{"woman_with_veil", "bride_with_veil"}, "13.0", true}, {"\U0001f470\U0001f3ff\u200d\u2640\ufe0f", "woman with veil: Dark Skin Tone", []string{"woman_with_veil_Dark_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fb\u200d\u2640\ufe0f", "woman with veil: Light Skin Tone", []string{"woman_with_veil_Light_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fe\u200d\u2640\ufe0f", "woman with veil: Medium-Dark Skin Tone", []string{"woman_with_veil_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fc\u200d\u2640\ufe0f", "woman with veil: Medium-Light Skin Tone", []string{"woman_with_veil_Medium-Light_Skin_Tone"}, "12.0", false}, {"\U0001f470\U0001f3fd\u200d\u2640\ufe0f", "woman with veil: Medium Skin Tone", []string{"woman_with_veil_Medium_Skin_Tone"}, "12.0", false}, {"\U0001f45a", "womanโs clothes", []string{"womans_clothes"}, "6.0", false}, {"\U0001f452", "womanโs hat", []string{"womans_hat"}, "6.0", false}, {"\U0001f93c\u200d\u2640\ufe0f", "women wrestling", []string{"women_wrestling"}, "9.0", false}, {"\U0001f6ba", "womenโs room", []string{"womens"}, "6.0", false}, {"\U0001fab5", "wood", []string{"wood"}, "13.0", false}, {"\U0001f974", "woozy face", []string{"woozy_face"}, "11.0", false}, {"\U0001f5fa\ufe0f", "world map", []string{"world_map"}, "7.0", false}, {"\U0001fab1", "worm", []string{"worm"}, "13.0", false}, {"\U0001f61f", "worried face", []string{"worried"}, "6.1", false}, {"\U0001f527", "wrench", []string{"wrench"}, "6.0", false}, {"\U0001f93c", "people wrestling", []string{"wrestling"}, "11.0", false}, {"\u270d\ufe0f", "writing hand", []string{"writing_hand"}, "", true}, {"\u270d\U0001f3ff\ufe0f", "writing hand: Dark Skin Tone", []string{"writing_hand_Dark_Skin_Tone"}, "12.0", false}, {"\u270d\U0001f3fb\ufe0f", "writing hand: Light Skin Tone", []string{"writing_hand_Light_Skin_Tone"}, "12.0", false}, {"\u270d\U0001f3fe\ufe0f", "writing hand: Medium-Dark Skin Tone", []string{"writing_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u270d\U0001f3fc\ufe0f", "writing hand: Medium-Light Skin Tone", []string{"writing_hand_Medium-Light_Skin_Tone"}, "12.0", false}, {"\u270d\U0001f3fd\ufe0f", "writing hand: Medium Skin Tone", []string{"writing_hand_Medium_Skin_Tone"}, "12.0", false}, {"\u270d\U0001f3fe\ufe0f", "writing hand: Medium-Dark Skin Tone", []string{"writing_hand_Medium-Dark_Skin_Tone"}, "12.0", false}, {"\u270d\U0001f3ff\ufe0f", "writing hand: Dark Skin Tone", []string{"writing_hand_Dark_Skin_Tone"}, "12.0", false}, {"\u274c", "cross mark", []string{"x"}, "6.0", false}, {"\U0001fa7b", "x-ray", []string{"x_ray"}, "14.0", false}, {"\U0001f9f6", "yarn", []string{"yarn"}, "11.0", false}, {"\U0001f971", "yawning face", []string{"yawning_face"}, "12.0", false}, {"\U0001f7e1", "yellow circle", []string{"yellow_circle"}, "12.0", false}, {"\U0001f49b", "yellow heart", []string{"yellow_heart"}, "6.0", false}, {"\U0001f7e8", "yellow square", []string{"yellow_square"}, "12.0", false}, {"\U0001f1fe\U0001f1ea", "flag: Yemen", []string{"yemen"}, "6.0", false}, {"\U0001f4b4", "yen banknote", []string{"yen"}, "6.0", false}, {"\u262f\ufe0f", "yin yang", []string{"yin_yang"}, "", false}, {"\U0001fa80", "yo-yo", []string{"yo_yo"}, "12.0", false}, {"\U0001f60b", "face savoring food", []string{"yum"}, "6.0", false}, {"\U0001f1ff\U0001f1f2", "flag: Zambia", []string{"zambia"}, "6.0", false}, {"\U0001f92a", "zany face", []string{"zany_face"}, "11.0", false}, {"\u26a1", "high voltage", []string{"zap"}, "4.0", false}, {"\U0001f993", "zebra", []string{"zebra"}, "11.0", false}, {"0\ufe0f\u20e3", "keycap: 0", []string{"zero"}, "", false}, {"\U0001f1ff\U0001f1fc", "flag: Zimbabwe", []string{"zimbabwe"}, "6.0", false}, {"\U0001f910", "zipper-mouth face", []string{"zipper_mouth_face"}, "8.0", false}, {"\U0001f9df", "zombie", []string{"zombie"}, "11.0", false}, {"\U0001f9df\u200d\u2642\ufe0f", "man zombie", []string{"zombie_man"}, "11.0", false}, {"\U0001f9df\u200d\u2640\ufe0f", "woman zombie", []string{"zombie_woman"}, "11.0", false}, {"\U0001f4a4", "zzz", []string{"zzz"}, "6.0", false}, }
-
-
-
@@ -9,13 +9,13 @@ "time"activities_model "code.gitea.io/gitea/models/activities" issues_model "code.gitea.io/gitea/models/issues" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/graceful" "code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/process" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/services/convert" ) // Init starts this eventsource
-
-
-
@@ -9,10 +9,7 @@ "context""fmt" "io" "os" "os/exec" "regexp" "code.gitea.io/gitea/modules/process" ) // BlamePart represents block of blame - continuous lines with one sha
-
@@ -23,12 +20,11 @@ }// BlameReader returns part of file blame one by one type BlameReader struct { cmd *exec.Cmd output io.ReadCloser reader *bufio.Reader lastSha *string cancel context.CancelFunc // Cancels the context that this reader runs in finished process.FinishedFunc // Tells the process manager we're finished and it can remove the associated process from the process table cmd *Command output io.WriteCloser reader io.ReadCloser done chan error lastSha *string } var shaLineRegex = regexp.MustCompile("^([a-z0-9]{40})")
-
@@ -37,7 +33,7 @@ // NextPart returns next part of blame (sequential code lines with the same commit)func (r *BlameReader) NextPart() (*BlamePart, error) { var blamePart *BlamePart reader := r.reader reader := bufio.NewReader(r.reader) if r.lastSha != nil { blamePart = &BlamePart{*r.lastSha, make([]string, 0)}
-
@@ -99,51 +95,41 @@ }// Close BlameReader - don't run NextPart after invoking that func (r *BlameReader) Close() error { defer r.finished() // Only remove the process from the process table when the underlying command is closed r.cancel() // However, first cancel our own context early err := <-r.done _ = r.reader.Close() _ = r.output.Close() if err := r.cmd.Wait(); err != nil { return fmt.Errorf("Wait: %w", err) } return nil return err } // CreateBlameReader creates reader for given repository, commit and file func CreateBlameReader(ctx context.Context, repoPath, commitID, file string) (*BlameReader, error) { return createBlameReader(ctx, repoPath, GitExecutable, "blame", commitID, "--porcelain", "--", file) } func createBlameReader(ctx context.Context, dir string, command ...string) (*BlameReader, error) { // Here we use the provided context - this should be tied to the request performing the blame so that it does not hang around. ctx, cancel, finished := process.GetManager().AddContext(ctx, fmt.Sprintf("GetBlame [repo_path: %s]", dir)) cmd := exec.CommandContext(ctx, command[0], command[1:]...) cmd.Dir = dir cmd.Stderr = os.Stderr process.SetSysProcAttribute(cmd) stdout, err := cmd.StdoutPipe() cmd := NewCommandContextNoGlobals(ctx, "blame", "--porcelain"). AddDynamicArguments(commitID). AddDashesAndList(file). SetDescription(fmt.Sprintf("GetBlame [repo_path: %s]", repoPath)) reader, stdout, err := os.Pipe() if err != nil { defer finished() return nil, fmt.Errorf("StdoutPipe: %w", err) return nil, err } if err = cmd.Start(); err != nil { defer finished() _ = stdout.Close() return nil, fmt.Errorf("Start: %w", err) } done := make(chan error, 1) reader := bufio.NewReader(stdout) go func(cmd *Command, dir string, stdout io.WriteCloser, done chan error) { if err := cmd.Run(&RunOpts{ UseContextTimeout: true, Dir: dir, Stdout: stdout, Stderr: os.Stderr, }); err == nil { stdout.Close() } done <- err }(cmd, repoPath, stdout, done) return &BlameReader{ cmd: cmd, output: stdout, reader: reader, cancel: cancel, finished: finished, cmd: cmd, output: stdout, reader: reader, done: done, }, nil }
-
-
-
@@ -5,139 +5,36 @@ package gitimport ( "context" "os" "testing" "github.com/stretchr/testify/assert" ) const exampleBlame = ` 4b92a6c2df28054ad766bc262f308db9f6066596 1 1 1 author Unknown author-mail <joe2010xtmf@163.com> author-time 1392833071 author-tz -0500 committer Unknown committer-mail <joe2010xtmf@163.com> committer-time 1392833071 committer-tz -0500 summary Add code of delete user previous be0ba9ea88aff8a658d0495d36accf944b74888d gogs.go filename gogs.go // Copyright 2014 The Gogs Authors. All rights reserved. ce21ed6c3490cdfad797319cbb1145e2330a8fef 2 2 1 author Joubert RedRat author-mail <eu+github@redrat.com.br> author-time 1482322397 author-tz -0200 committer Lunny Xiao committer-mail <xiaolunwen@gmail.com> committer-time 1482322397 committer-tz +0800 summary Remove remaining Gogs reference on locales and cmd (#430) previous 618407c018cdf668ceedde7454c42fb22ba422d8 main.go filename main.go // Copyright 2016 The Gitea Authors. All rights reserved. 4b92a6c2df28054ad766bc262f308db9f6066596 2 3 2 author Unknown author-mail <joe2010xtmf@163.com> author-time 1392833071 author-tz -0500 committer Unknown committer-mail <joe2010xtmf@163.com> committer-time 1392833071 committer-tz -0500 summary Add code of delete user previous be0ba9ea88aff8a658d0495d36accf944b74888d gogs.go filename gogs.go // Use of this source code is governed by a MIT-style 4b92a6c2df28054ad766bc262f308db9f6066596 3 4 author Unknown author-mail <joe2010xtmf@163.com> author-time 1392833071 author-tz -0500 committer Unknown committer-mail <joe2010xtmf@163.com> committer-time 1392833071 committer-tz -0500 summary Add code of delete user previous be0ba9ea88aff8a658d0495d36accf944b74888d gogs.go filename gogs.go // license that can be found in the LICENSE file. e2aa991e10ffd924a828ec149951f2f20eecead2 6 6 2 author Lunny Xiao author-mail <xiaolunwen@gmail.com> author-time 1478872595 author-tz +0800 committer Sandro Santilli committer-mail <strk@kbt.io> committer-time 1478872595 committer-tz +0100 summary ask for go get from code.gitea.io/gitea and change gogs to gitea on main file (#146) previous 5fc370e332171b8658caed771b48585576f11737 main.go filename main.go // Gitea (git with a cup of tea) is a painless self-hosted Git Service. e2aa991e10ffd924a828ec149951f2f20eecead2 7 7 package main // import "code.gitea.io/gitea" ` func TestReadingBlameOutput(t *testing.T) { tempFile, err := os.CreateTemp("", ".txt") if err != nil { panic(err) } defer tempFile.Close() if _, err = tempFile.WriteString(exampleBlame); err != nil { panic(err) } ctx, cancel := context.WithCancel(context.Background()) defer cancel() blameReader, err := createBlameReader(ctx, "", "cat", tempFile.Name()) if err != nil { panic(err) } blameReader, err := CreateBlameReader(ctx, "./tests/repos/repo5_pulls", "f32b0a9dfd09a60f616f29158f772cedd89942d2", "README.md") assert.NoError(t, err) defer blameReader.Close() parts := []*BlamePart{ { "4b92a6c2df28054ad766bc262f308db9f6066596", "72866af952e98d02a73003501836074b286a78f6", []string{ "// Copyright 2014 The Gogs Authors. All rights reserved.", "# test_repo", "Test repository for testing migration from github to gitea", }, }, { "ce21ed6c3490cdfad797319cbb1145e2330a8fef", []string{ "// Copyright 2016 The Gitea Authors. All rights reserved.", }, "f32b0a9dfd09a60f616f29158f772cedd89942d2", []string{}, }, { "4b92a6c2df28054ad766bc262f308db9f6066596", []string{ "// Use of this source code is governed by a MIT-style", "// license that can be found in the LICENSE file.", "", }, }, { "e2aa991e10ffd924a828ec149951f2f20eecead2", []string{ "// Gitea (git with a cup of tea) is a painless self-hosted Git Service.", "package main // import \"code.gitea.io/gitea\"", }, }, nil, } for _, part := range parts { actualPart, err := blameReader.NextPart() if err != nil { panic(err) } assert.NoError(t, err) assert.Equal(t, part, actualPart) } }
-
-
-
@@ -9,8 +9,6 @@ "context""fmt" "io" "os" "strconv" "strings" "code.gitea.io/gitea/modules/log" )
-
@@ -278,102 +276,6 @@ return wr.attributes} func (wr *nulSeparatedAttributeWriter) Close() error { select { case <-wr.closed: return nil default: } close(wr.attributes) close(wr.closed) return nil } type lineSeparatedAttributeWriter struct { tmp []byte attributes chan attributeTriple closed chan struct{} } func (wr *lineSeparatedAttributeWriter) Write(p []byte) (n int, err error) { l := len(p) nlIdx := bytes.IndexByte(p, '\n') for nlIdx >= 0 { wr.tmp = append(wr.tmp, p[:nlIdx]...) if len(wr.tmp) == 0 { // This should not happen if len(p) > nlIdx+1 { wr.tmp = wr.tmp[:0] p = p[nlIdx+1:] nlIdx = bytes.IndexByte(p, '\n') continue } else { return l, nil } } working := attributeTriple{} if wr.tmp[0] == '"' { sb := new(strings.Builder) remaining := string(wr.tmp[1:]) for len(remaining) > 0 { rn, _, tail, err := strconv.UnquoteChar(remaining, '"') if err != nil { if len(remaining) > 2 && remaining[0] == '"' && remaining[1] == ':' && remaining[2] == ' ' { working.Filename = sb.String() wr.tmp = []byte(remaining[3:]) break } return l, fmt.Errorf("unexpected tail %s", remaining) } _, _ = sb.WriteRune(rn) remaining = tail } } else { idx := bytes.IndexByte(wr.tmp, ':') if idx < 0 { return l, fmt.Errorf("unexpected input %s", string(wr.tmp)) } working.Filename = string(wr.tmp[:idx]) if len(wr.tmp) < idx+2 { return l, fmt.Errorf("unexpected input %s", string(wr.tmp)) } wr.tmp = wr.tmp[idx+2:] } idx := bytes.IndexByte(wr.tmp, ':') if idx < 0 { return l, fmt.Errorf("unexpected input %s", string(wr.tmp)) } working.Attribute = string(wr.tmp[:idx]) if len(wr.tmp) < idx+2 { return l, fmt.Errorf("unexpected input %s", string(wr.tmp)) } working.Value = string(wr.tmp[idx+2:]) wr.attributes <- working wr.tmp = wr.tmp[:0] if len(p) > nlIdx+1 { p = p[nlIdx+1:] nlIdx = bytes.IndexByte(p, '\n') continue } else { return l, nil } } wr.tmp = append(wr.tmp, p...) return l, nil } func (wr *lineSeparatedAttributeWriter) ReadAttribute() <-chan attributeTriple { return wr.attributes } func (wr *lineSeparatedAttributeWriter) Close() error { select { case <-wr.closed: return nil
-
-
-
@@ -95,64 +95,3 @@ Attribute: "linguist-language",Value: "unspecified", }, attr) } func Test_lineSeparatedAttributeWriter_ReadAttribute(t *testing.T) { wr := &lineSeparatedAttributeWriter{ attributes: make(chan attributeTriple, 5), } testStr := `".gitignore\"\n": linguist-vendored: unspecified ` n, err := wr.Write([]byte(testStr)) assert.Equal(t, n, len(testStr)) assert.NoError(t, err) select { case attr := <-wr.ReadAttribute(): assert.Equal(t, ".gitignore\"\n", attr.Filename) assert.Equal(t, "linguist-vendored", attr.Attribute) assert.Equal(t, "unspecified", attr.Value) case <-time.After(100 * time.Millisecond): assert.Fail(t, "took too long to read an attribute from the list") } // Write a second attribute again n, err = wr.Write([]byte(testStr)) assert.Equal(t, n, len(testStr)) assert.NoError(t, err) select { case attr := <-wr.ReadAttribute(): assert.Equal(t, ".gitignore\"\n", attr.Filename) assert.Equal(t, "linguist-vendored", attr.Attribute) assert.Equal(t, "unspecified", attr.Value) case <-time.After(100 * time.Millisecond): assert.Fail(t, "took too long to read an attribute from the list") } // Write a partial attribute _, err = wr.Write([]byte("incomplete-file")) assert.NoError(t, err) _, err = wr.Write([]byte("name: ")) assert.NoError(t, err) select { case <-wr.ReadAttribute(): assert.Fail(t, "There should not be an attribute ready to read") case <-time.After(100 * time.Millisecond): } _, err = wr.Write([]byte("attribute: ")) assert.NoError(t, err) select { case <-wr.ReadAttribute(): assert.Fail(t, "There should not be an attribute ready to read") case <-time.After(100 * time.Millisecond): } _, err = wr.Write([]byte("value\n")) assert.NoError(t, err) attr := <-wr.ReadAttribute() assert.Equal(t, "incomplete-filename", attr.Filename) assert.Equal(t, "attribute", attr.Attribute) assert.Equal(t, "value", attr.Value) }
-
-
-
@@ -41,7 +41,7 @@ }// ConvertToSHA1 returns a Hash object from a potential ID string func (repo *Repository) ConvertToSHA1(commitID string) (SHA1, error) { if len(commitID) == 40 { if len(commitID) == SHAFullLength { sha1, err := NewIDFromString(commitID) if err == nil { return sha1, nil
-
-
-
@@ -137,7 +137,7 @@ }// ConvertToSHA1 returns a Hash object from a potential ID string func (repo *Repository) ConvertToSHA1(commitID string) (SHA1, error) { if len(commitID) == 40 && IsValidSHAPattern(commitID) { if len(commitID) == SHAFullLength && IsValidSHAPattern(commitID) { sha1, err := NewIDFromString(commitID) if err == nil { return sha1, nil
-
-
-
@@ -16,7 +16,7 @@ )// ReadTreeToIndex reads a treeish to the index func (repo *Repository) ReadTreeToIndex(treeish string, indexFilename ...string) error { if len(treeish) != 40 { if len(treeish) != SHAFullLength { res, _, err := NewCommand(repo.Ctx, "rev-parse", "--verify").AddDynamicArguments(treeish).RunStdString(&RunOpts{Dir: repo.Path}) if err != nil { return err
-
-
-
@@ -19,7 +19,7 @@ }// GetTree find the tree object in the repository. func (repo *Repository) GetTree(idStr string) (*Tree, error) { if len(idStr) != 40 { if len(idStr) != SHAFullLength { res, _, err := NewCommand(repo.Ctx, "rev-parse", "--verify").AddDynamicArguments(idStr).RunStdString(&RunOpts{Dir: repo.Path}) if err != nil { return nil, err
-
-
-
@@ -66,7 +66,7 @@ }// GetTree find the tree object in the repository. func (repo *Repository) GetTree(idStr string) (*Tree, error) { if len(idStr) != 40 { if len(idStr) != SHAFullLength { res, err := repo.GetRefCommitID(idStr) if err != nil { return nil, err
-
-
-
@@ -17,6 +17,9 @@// EmptyTreeSHA is the SHA of an empty tree const EmptyTreeSHA = "4b825dc642cb6eb9a060e54bf8d69288fbee4904" // SHAFullLength is the full length of a git SHA const SHAFullLength = 40 // SHAPattern can be used to determine if a string is an valid sha var shaPattern = regexp.MustCompile(`^[0-9a-f]{4,40}$`)
-
@@ -50,7 +53,7 @@ // NewIDFromString creates a new SHA1 from a ID string of length 40.func NewIDFromString(s string) (SHA1, error) { var id SHA1 s = strings.TrimSpace(s) if len(s) != 40 { if len(s) != SHAFullLength { return id, fmt.Errorf("Length must be 40: %s", s) } b, err := hex.DecodeString(s)
-
-
-
@@ -289,9 +289,3 @@ return "", err} return buf.String(), nil } // IsMarkdownFile reports whether name looks like a Markdown file // based on its extension. func IsMarkdownFile(name string) bool { return markup.IsMarkupFile(name, MarkupName) }
-
-
-
@@ -74,28 +74,6 @@ `<p><a href="`+lnk+`" rel="nofollow">WikiPage</a></p>`,`<p><a href="`+lnkWiki+`" rel="nofollow">WikiPage</a></p>`) } func TestMisc_IsMarkdownFile(t *testing.T) { setting.Markdown.FileExtensions = []string{".md", ".markdown", ".mdown", ".mkd"} trueTestCases := []string{ "test.md", "wow.MARKDOWN", "LOL.mDoWn", } falseTestCases := []string{ "test", "abcdefg", "abcdefghijklmnopqrstuvwxyz", "test.md.test", } for _, testCase := range trueTestCases { assert.True(t, IsMarkdownFile(testCase)) } for _, testCase := range falseTestCases { assert.False(t, IsMarkdownFile(testCase)) } } func TestRender_Images(t *testing.T) { setting.AppURL = AppURL setting.AppSubURL = AppSubURL
-
-
-
@@ -16,7 +16,6 @@ "code.gitea.io/gitea/modules/notification/indexer""code.gitea.io/gitea/modules/notification/mail" "code.gitea.io/gitea/modules/notification/mirror" "code.gitea.io/gitea/modules/notification/ui" "code.gitea.io/gitea/modules/notification/webhook" "code.gitea.io/gitea/modules/repository" "code.gitea.io/gitea/modules/setting" )
-
@@ -36,7 +35,6 @@ if setting.Service.EnableNotifyMail {RegisterNotifier(mail.NewNotifier()) } RegisterNotifier(indexer.NewNotifier()) RegisterNotifier(webhook.NewNotifier()) RegisterNotifier(action.NewNotifier()) RegisterNotifier(mirror.NewNotifier()) }
-
-
-
@@ -243,7 +243,7 @@ }} func (ns *notificationService) NotifyRepoPendingTransfer(ctx context.Context, doer, newOwner *user_model.User, repo *repo_model.Repository) { err := db.AutoTx(ctx, func(ctx context.Context) error { err := db.WithTx(ctx, func(ctx context.Context) error { return activities_model.CreateRepoTransferNotification(ctx, doer, newOwner, repo) }) if err != nil {
-
-
-
@@ -13,16 +13,20 @@ access_model "code.gitea.io/gitea/models/perm/access"repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/notification" "code.gitea.io/gitea/modules/notification/base" "code.gitea.io/gitea/modules/repository" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" webhook_services "code.gitea.io/gitea/services/webhook" webhook_module "code.gitea.io/gitea/modules/webhook" "code.gitea.io/gitea/services/convert" ) func init() { notification.RegisterNotifier(&webhookNotifier{}) } type webhookNotifier struct { base.NullNotifier
-
@@ -54,7 +58,7 @@ log.Error("LoadPullRequest: %v", err)return } err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequestLabel, &api.PullRequestPayload{ err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestLabel, &api.PullRequestPayload{ Action: api.HookIssueLabelCleared, Index: issue.Index, PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil),
-
@@ -62,7 +66,7 @@ Repository: convert.ToRepo(ctx, issue.Repo, mode),Sender: convert.ToUser(doer, nil), }) } else { err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssueLabel, &api.IssuePayload{ err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssueLabel, &api.IssuePayload{ Action: api.HookIssueLabelCleared, Index: issue.Index, Issue: convert.ToAPIIssue(ctx, issue),
-
@@ -80,7 +84,7 @@ oldMode, _ := access_model.AccessLevel(ctx, doer, oldRepo)mode, _ := access_model.AccessLevel(ctx, doer, repo) // forked webhook if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: oldRepo}, webhook.HookEventFork, &api.ForkPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: oldRepo}, webhook_module.HookEventFork, &api.ForkPayload{ Forkee: convert.ToRepo(ctx, oldRepo, oldMode), Repo: convert.ToRepo(ctx, repo, mode), Sender: convert.ToUser(doer, nil),
-
@@ -92,7 +96,7 @@ u := repo.MustOwner(ctx)// Add to hook queue for created repo after session commit. if u.IsOrganization() { if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventRepository, &api.RepositoryPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventRepository, &api.RepositoryPayload{ Action: api.HookRepoCreated, Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner), Organization: convert.ToUser(u, nil),
-
@@ -105,7 +109,7 @@ }func (m *webhookNotifier) NotifyCreateRepository(ctx context.Context, doer, u *user_model.User, repo *repo_model.Repository) { // Add to hook queue for created repo after session commit. if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventRepository, &api.RepositoryPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventRepository, &api.RepositoryPayload{ Action: api.HookRepoCreated, Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner), Organization: convert.ToUser(u, nil),
-
@@ -116,7 +120,7 @@ }} func (m *webhookNotifier) NotifyDeleteRepository(ctx context.Context, doer *user_model.User, repo *repo_model.Repository) { if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventRepository, &api.RepositoryPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventRepository, &api.RepositoryPayload{ Action: api.HookRepoDeleted, Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner), Organization: convert.ToUser(repo.MustOwner(ctx), nil),
-
@@ -128,7 +132,7 @@ }func (m *webhookNotifier) NotifyMigrateRepository(ctx context.Context, doer, u *user_model.User, repo *repo_model.Repository) { // Add to hook queue for created repo after session commit. if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventRepository, &api.RepositoryPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventRepository, &api.RepositoryPayload{ Action: api.HookRepoCreated, Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner), Organization: convert.ToUser(u, nil),
-
@@ -159,7 +163,7 @@ } else {apiPullRequest.Action = api.HookIssueAssigned } // Assignee comment triggers a webhook if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequestAssign, apiPullRequest); err != nil { if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestAssign, apiPullRequest); err != nil { log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, removed, err) return }
-
@@ -177,7 +181,7 @@ } else {apiIssue.Action = api.HookIssueAssigned } // Assignee comment triggers a webhook if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssueAssign, apiIssue); err != nil { if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssueAssign, apiIssue); err != nil { log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, removed, err) return }
-
@@ -193,7 +197,7 @@ log.Error("LoadPullRequest failed: %v", err)return } issue.PullRequest.Issue = issue err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequest, &api.PullRequestPayload{ err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequest, &api.PullRequestPayload{ Action: api.HookIssueEdited, Index: issue.Index, Changes: &api.ChangesPayload{
-
@@ -206,7 +210,7 @@ Repository: convert.ToRepo(ctx, issue.Repo, mode),Sender: convert.ToUser(doer, nil), }) } else { err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssues, &api.IssuePayload{ err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssues, &api.IssuePayload{ Action: api.HookIssueEdited, Index: issue.Index, Changes: &api.ChangesPayload{
-
@@ -245,7 +249,7 @@ apiPullRequest.Action = api.HookIssueClosed} else { apiPullRequest.Action = api.HookIssueReOpened } err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequest, apiPullRequest) err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequest, apiPullRequest) } else { apiIssue := &api.IssuePayload{ Index: issue.Index,
-
@@ -258,7 +262,7 @@ apiIssue.Action = api.HookIssueClosed} else { apiIssue.Action = api.HookIssueReOpened } err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssues, apiIssue) err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssues, apiIssue) } if err != nil { log.Error("PrepareWebhooks [is_pull: %v, is_closed: %v]: %v", issue.IsPull, isClosed, err)
-
@@ -276,7 +280,7 @@ return} mode, _ := access_model.AccessLevel(ctx, issue.Poster, issue.Repo) if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssues, &api.IssuePayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssues, &api.IssuePayload{ Action: api.HookIssueOpened, Index: issue.Index, Issue: convert.ToAPIIssue(ctx, issue),
-
@@ -302,7 +306,7 @@ return} mode, _ := access_model.AccessLevel(ctx, pull.Issue.Poster, pull.Issue.Repo) if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: pull.Issue.Repo}, webhook.HookEventPullRequest, &api.PullRequestPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: pull.Issue.Repo}, webhook_module.HookEventPullRequest, &api.PullRequestPayload{ Action: api.HookIssueOpened, Index: pull.Issue.Index, PullRequest: convert.ToAPIPullRequest(ctx, pull, nil),
-
@@ -323,7 +327,7 @@ mode, _ := access_model.AccessLevel(ctx, issue.Poster, issue.Repo)var err error if issue.IsPull { issue.PullRequest.Issue = issue err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequest, &api.PullRequestPayload{ err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequest, &api.PullRequestPayload{ Action: api.HookIssueEdited, Index: issue.Index, Changes: &api.ChangesPayload{
-
@@ -336,7 +340,7 @@ Repository: convert.ToRepo(ctx, issue.Repo, mode),Sender: convert.ToUser(doer, nil), }) } else { err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssues, &api.IssuePayload{ err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssues, &api.IssuePayload{ Action: api.HookIssueEdited, Index: issue.Index, Changes: &api.ChangesPayload{
-
@@ -369,15 +373,15 @@ log.Error("LoadAttributes: %v", err)return } var eventType webhook.HookEventType var eventType webhook_module.HookEventType if c.Issue.IsPull { eventType = webhook.HookEventPullRequestComment eventType = webhook_module.HookEventPullRequestComment } else { eventType = webhook.HookEventIssueComment eventType = webhook_module.HookEventIssueComment } mode, _ := access_model.AccessLevel(ctx, doer, c.Issue.Repo) if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: c.Issue.Repo}, eventType, &api.IssueCommentPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: c.Issue.Repo}, eventType, &api.IssueCommentPayload{ Action: api.HookIssueCommentEdited, Issue: convert.ToAPIIssue(ctx, c.Issue), Comment: convert.ToComment(c),
-
@@ -397,15 +401,15 @@func (m *webhookNotifier) NotifyCreateIssueComment(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, issue *issues_model.Issue, comment *issues_model.Comment, mentions []*user_model.User, ) { var eventType webhook.HookEventType var eventType webhook_module.HookEventType if issue.IsPull { eventType = webhook.HookEventPullRequestComment eventType = webhook_module.HookEventPullRequestComment } else { eventType = webhook.HookEventIssueComment eventType = webhook_module.HookEventIssueComment } mode, _ := access_model.AccessLevel(ctx, doer, repo) if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, eventType, &api.IssueCommentPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, eventType, &api.IssueCommentPayload{ Action: api.HookIssueCommentCreated, Issue: convert.ToAPIIssue(ctx, issue), Comment: convert.ToComment(comment),
-
@@ -434,15 +438,15 @@ log.Error("LoadAttributes: %v", err)return } var eventType webhook.HookEventType var eventType webhook_module.HookEventType if comment.Issue.IsPull { eventType = webhook.HookEventPullRequestComment eventType = webhook_module.HookEventPullRequestComment } else { eventType = webhook.HookEventIssueComment eventType = webhook_module.HookEventIssueComment } mode, _ := access_model.AccessLevel(ctx, doer, comment.Issue.Repo) if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: comment.Issue.Repo}, eventType, &api.IssueCommentPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: comment.Issue.Repo}, eventType, &api.IssueCommentPayload{ Action: api.HookIssueCommentDeleted, Issue: convert.ToAPIIssue(ctx, comment.Issue), Comment: convert.ToComment(comment),
-
@@ -456,7 +460,7 @@ }func (m *webhookNotifier) NotifyNewWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, page, comment string) { // Add to hook queue for created wiki page. if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventWiki, &api.WikiPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventWiki, &api.WikiPayload{ Action: api.HookWikiCreated, Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner), Sender: convert.ToUser(doer, nil),
-
@@ -469,7 +473,7 @@ }func (m *webhookNotifier) NotifyEditWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, page, comment string) { // Add to hook queue for edit wiki page. if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventWiki, &api.WikiPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventWiki, &api.WikiPayload{ Action: api.HookWikiEdited, Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner), Sender: convert.ToUser(doer, nil),
-
@@ -482,7 +486,7 @@ }func (m *webhookNotifier) NotifyDeleteWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, page string) { // Add to hook queue for edit wiki page. if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventWiki, &api.WikiPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventWiki, &api.WikiPayload{ Action: api.HookWikiDeleted, Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner), Sender: convert.ToUser(doer, nil),
-
@@ -517,7 +521,7 @@ if err = issue.PullRequest.LoadIssue(ctx); err != nil {log.Error("LoadIssue: %v", err) return } err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequestLabel, &api.PullRequestPayload{ err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestLabel, &api.PullRequestPayload{ Action: api.HookIssueLabelUpdated, Index: issue.Index, PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil),
-
@@ -525,7 +529,7 @@ Repository: convert.ToRepo(ctx, issue.Repo, perm.AccessModeNone),Sender: convert.ToUser(doer, nil), }) } else { err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssueLabel, &api.IssuePayload{ err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssueLabel, &api.IssuePayload{ Action: api.HookIssueLabelUpdated, Index: issue.Index, Issue: convert.ToAPIIssue(ctx, issue),
-
@@ -559,7 +563,7 @@ if err != nil {log.Error("LoadIssue: %v", err) return } err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequestMilestone, &api.PullRequestPayload{ err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestMilestone, &api.PullRequestPayload{ Action: hookAction, Index: issue.Index, PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil),
-
@@ -567,7 +571,7 @@ Repository: convert.ToRepo(ctx, issue.Repo, mode),Sender: convert.ToUser(doer, nil), }) } else { err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssueMilestone, &api.IssuePayload{ err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssueMilestone, &api.IssuePayload{ Action: hookAction, Index: issue.Index, Issue: convert.ToAPIIssue(ctx, issue),
-
@@ -588,7 +592,7 @@ log.Error("commits.ToAPIPayloadCommits failed: %v", err)return } if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventPush, &api.PushPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventPush, &api.PushPayload{ Ref: opts.RefFullName, Before: opts.OldCommitID, After: opts.NewCommitID,
-
@@ -641,7 +645,7 @@ Sender: convert.ToUser(doer, nil),Action: api.HookIssueClosed, } if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: pr.Issue.Repo}, webhook.HookEventPullRequest, apiPullRequest); err != nil { if err := PrepareWebhooks(ctx, EventSource{Repository: pr.Issue.Repo}, webhook_module.HookEventPullRequest, apiPullRequest); err != nil { log.Error("PrepareWebhooks: %v", err) } }
-
@@ -655,7 +659,7 @@issue := pr.Issue mode, _ := access_model.AccessLevel(ctx, issue.Poster, issue.Repo) if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequest, &api.PullRequestPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequest, &api.PullRequestPayload{ Action: api.HookIssueEdited, Index: issue.Index, Changes: &api.ChangesPayload{
-
@@ -672,15 +676,15 @@ }} func (m *webhookNotifier) NotifyPullRequestReview(ctx context.Context, pr *issues_model.PullRequest, review *issues_model.Review, comment *issues_model.Comment, mentions []*user_model.User) { var reviewHookType webhook.HookEventType var reviewHookType webhook_module.HookEventType switch review.Type { case issues_model.ReviewTypeApprove: reviewHookType = webhook.HookEventPullRequestReviewApproved reviewHookType = webhook_module.HookEventPullRequestReviewApproved case issues_model.ReviewTypeComment: reviewHookType = webhook.HookEventPullRequestComment reviewHookType = webhook_module.HookEventPullRequestComment case issues_model.ReviewTypeReject: reviewHookType = webhook.HookEventPullRequestReviewRejected reviewHookType = webhook_module.HookEventPullRequestReviewRejected default: // unsupported review webhook type here log.Error("Unsupported review webhook type")
-
@@ -697,7 +701,7 @@ if err != nil {log.Error("models.AccessLevel: %v", err) return } if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: review.Issue.Repo}, reviewHookType, &api.PullRequestPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: review.Issue.Repo}, reviewHookType, &api.PullRequestPayload{ Action: api.HookIssueReviewed, Index: review.Issue.Index, PullRequest: convert.ToAPIPullRequest(ctx, pr, nil),
-
@@ -717,7 +721,7 @@ apiPusher := convert.ToUser(pusher, nil)apiRepo := convert.ToRepo(ctx, repo, perm.AccessModeNone) refName := git.RefEndName(refFullName) if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventCreate, &api.CreatePayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventCreate, &api.CreatePayload{ Ref: refName, Sha: refID, RefType: refType,
-
@@ -738,7 +742,7 @@ log.Error("LoadAttributes: %v", err)return } if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: pr.Issue.Repo}, webhook.HookEventPullRequestSync, &api.PullRequestPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: pr.Issue.Repo}, webhook_module.HookEventPullRequestSync, &api.PullRequestPayload{ Action: api.HookIssueSynchronized, Index: pr.Issue.Index, PullRequest: convert.ToAPIPullRequest(ctx, pr, nil),
-
@@ -754,7 +758,7 @@ apiPusher := convert.ToUser(pusher, nil)apiRepo := convert.ToRepo(ctx, repo, perm.AccessModeNone) refName := git.RefEndName(refFullName) if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventDelete, &api.DeletePayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventDelete, &api.DeletePayload{ Ref: refName, RefType: refType, PusherType: api.PusherTypeUser,
-
@@ -772,7 +776,7 @@ return} mode, _ := access_model.AccessLevel(ctx, doer, rel.Repo) if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: rel.Repo}, webhook.HookEventRelease, &api.ReleasePayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: rel.Repo}, webhook_module.HookEventRelease, &api.ReleasePayload{ Action: action, Release: convert.ToRelease(rel), Repository: convert.ToRepo(ctx, rel.Repo, mode),
-
@@ -802,7 +806,7 @@ log.Error("commits.ToAPIPayloadCommits failed: %v", err)return } if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventPush, &api.PushPayload{ if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventPush, &api.PushPayload{ Ref: opts.RefFullName, Before: opts.OldCommitID, After: opts.NewCommitID,
-
@@ -835,7 +839,7 @@ notifyPackage(ctx, doer, pd, api.HookPackageDeleted)} func notifyPackage(ctx context.Context, sender *user_model.User, pd *packages_model.PackageDescriptor, action api.HookPackageAction) { source := webhook_services.EventSource{ source := EventSource{ Repository: pd.Repository, Owner: pd.Owner, }
-
@@ -846,7 +850,7 @@ log.Error("Error converting package: %v", err)return } if err := webhook_services.PrepareWebhooks(ctx, source, webhook.HookEventPackage, &api.PackagePayload{ if err := PrepareWebhooks(ctx, source, webhook_module.HookEventPackage, &api.PackagePayload{ Action: action, Package: apiPackage, Sender: convert.ToUser(sender, nil),
-
-
-
@@ -5,12 +5,12 @@ package composerimport ( "archive/zip" "errors" "io" "regexp" "strings" "code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/validation" "github.com/hashicorp/go-version"
-
@@ -21,11 +21,11 @@ const TypeProperty = "composer.type"var ( // ErrMissingComposerFile indicates a missing composer.json file ErrMissingComposerFile = errors.New("composer.json file is missing") ErrMissingComposerFile = util.NewInvalidArgumentErrorf("composer.json file is missing") // ErrInvalidName indicates an invalid package name ErrInvalidName = errors.New("package name is invalid") ErrInvalidName = util.NewInvalidArgumentErrorf("package name is invalid") // ErrInvalidVersion indicates an invalid package version ErrInvalidVersion = errors.New("package version is invalid") ErrInvalidVersion = util.NewInvalidArgumentErrorf("package version is invalid") ) // Package represents a Composer package
-
-
-
@@ -5,9 +5,10 @@ package conanimport ( "bufio" "errors" "io" "strings" "code.gitea.io/gitea/modules/util" ) // Conaninfo represents infos of a Conan package
-
@@ -79,7 +80,7 @@ }continue } if line != "" { return nil, errors.New("Invalid conaninfo.txt") return nil, util.NewInvalidArgumentErrorf("invalid conaninfo.txt") } } if err := scanner.Err(); err != nil {
-
-
-
@@ -4,12 +4,12 @@package conan import ( "errors" "fmt" "regexp" "strings" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/util" ) const (
-
@@ -25,7 +25,7 @@ var (namePattern = regexp.MustCompile(fmt.Sprintf(`^[a-zA-Z0-9_][a-zA-Z0-9_\+\.-]{%d,%d}$`, minChars-1, maxChars-1)) revisionPattern = regexp.MustCompile(fmt.Sprintf(`^[a-zA-Z0-9]{1,%d}$`, maxChars)) ErrValidation = errors.New("Could not validate one or more reference fields") ErrValidation = util.NewInvalidArgumentErrorf("could not validate one or more reference fields") ) // RecipeReference represents a recipe <Name>/<Version>@<User>/<Channel>#<Revision>
-
-
-
@@ -6,10 +6,10 @@import ( "archive/tar" "compress/gzip" "errors" "io" "strings" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/validation" "github.com/hashicorp/go-version"
-
@@ -18,13 +18,13 @@ )var ( // ErrMissingChartFile indicates a missing Chart.yaml file ErrMissingChartFile = errors.New("Chart.yaml file is missing") ErrMissingChartFile = util.NewInvalidArgumentErrorf("Chart.yaml file is missing") // ErrInvalidName indicates an invalid package name ErrInvalidName = errors.New("package name is invalid") ErrInvalidName = util.NewInvalidArgumentErrorf("package name is invalid") // ErrInvalidVersion indicates an invalid package version ErrInvalidVersion = errors.New("package version is invalid") ErrInvalidVersion = util.NewInvalidArgumentErrorf("package version is invalid") // ErrInvalidChart indicates an invalid chart ErrInvalidChart = errors.New("chart is invalid") ErrInvalidChart = util.NewInvalidArgumentErrorf("chart is invalid") ) // Metadata for a Chart file. This models the structure of a Chart.yaml file.
-
-
-
@@ -8,7 +8,6 @@ "bytes""crypto/sha1" "crypto/sha512" "encoding/base64" "errors" "fmt" "io" "regexp"
-
@@ -16,6 +15,7 @@ "strings""time" "code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/validation" "github.com/hashicorp/go-version"
-
@@ -23,15 +23,15 @@ )var ( // ErrInvalidPackage indicates an invalid package ErrInvalidPackage = errors.New("The package is invalid") ErrInvalidPackage = util.NewInvalidArgumentErrorf("package is invalid") // ErrInvalidPackageName indicates an invalid name ErrInvalidPackageName = errors.New("The package name is invalid") ErrInvalidPackageName = util.NewInvalidArgumentErrorf("package name is invalid") // ErrInvalidPackageVersion indicates an invalid version ErrInvalidPackageVersion = errors.New("The package version is invalid") ErrInvalidPackageVersion = util.NewInvalidArgumentErrorf("package version is invalid") // ErrInvalidAttachment indicates a invalid attachment ErrInvalidAttachment = errors.New("The package attachment is invalid") ErrInvalidAttachment = util.NewInvalidArgumentErrorf("package attachment is invalid") // ErrInvalidIntegrity indicates an integrity validation error ErrInvalidIntegrity = errors.New("Failed to validate integrity") ErrInvalidIntegrity = util.NewInvalidArgumentErrorf("failed to validate integrity") ) var nameMatch = regexp.MustCompile(`\A((@[^\s\/~'!\(\)\*]+?)[\/])?([^_.][^\s\/~'!\(\)\*]+)\z`)
-
-
-
@@ -7,13 +7,13 @@ import ("archive/zip" "bytes" "encoding/xml" "errors" "fmt" "io" "path/filepath" "regexp" "strings" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/validation" "github.com/hashicorp/go-version"
-
@@ -21,13 +21,13 @@ )var ( // ErrMissingNuspecFile indicates a missing Nuspec file ErrMissingNuspecFile = errors.New("Nuspec file is missing") ErrMissingNuspecFile = util.NewInvalidArgumentErrorf("Nuspec file is missing") // ErrNuspecFileTooLarge indicates a Nuspec file which is too large ErrNuspecFileTooLarge = errors.New("Nuspec file is too large") ErrNuspecFileTooLarge = util.NewInvalidArgumentErrorf("Nuspec file is too large") // ErrNuspecInvalidID indicates an invalid id in the Nuspec file ErrNuspecInvalidID = errors.New("Nuspec file contains an invalid id") ErrNuspecInvalidID = util.NewInvalidArgumentErrorf("Nuspec file contains an invalid id") // ErrNuspecInvalidVersion indicates an invalid version in the Nuspec file ErrNuspecInvalidVersion = errors.New("Nuspec file contains an invalid version") ErrNuspecInvalidVersion = util.NewInvalidArgumentErrorf("Nuspec file contains an invalid version") ) // PackageType specifies the package type the metadata describes
-
-
-
@@ -7,7 +7,6 @@ import ("archive/zip" "bytes" "encoding/binary" "errors" "fmt" "io" "path"
-
@@ -15,13 +14,14 @@ "path/filepath""strings" "code.gitea.io/gitea/modules/packages" "code.gitea.io/gitea/modules/util" ) var ( ErrMissingPdbFiles = errors.New("Package does not contain PDB files") ErrInvalidFiles = errors.New("Package contains invalid files") ErrInvalidPdbMagicNumber = errors.New("Invalid Portable PDB magic number") ErrMissingPdbStream = errors.New("Missing PDB stream") ErrMissingPdbFiles = util.NewInvalidArgumentErrorf("package does not contain PDB files") ErrInvalidFiles = util.NewInvalidArgumentErrorf("package contains invalid files") ErrInvalidPdbMagicNumber = util.NewInvalidArgumentErrorf("invalid Portable PDB magic number") ErrMissingPdbStream = util.NewInvalidArgumentErrorf("missing PDB stream") ) type PortablePdb struct {
-
-
-
@@ -6,11 +6,11 @@import ( "archive/tar" "compress/gzip" "errors" "io" "regexp" "strings" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/validation" "github.com/hashicorp/go-version"
-
@@ -18,10 +18,10 @@ "gopkg.in/yaml.v3") var ( ErrMissingPubspecFile = errors.New("Pubspec file is missing") ErrPubspecFileTooLarge = errors.New("Pubspec file is too large") ErrInvalidName = errors.New("Package name is invalid") ErrInvalidVersion = errors.New("Package version is invalid") ErrMissingPubspecFile = util.NewInvalidArgumentErrorf("Pubspec file is missing") ErrPubspecFileTooLarge = util.NewInvalidArgumentErrorf("Pubspec file is too large") ErrInvalidName = util.NewInvalidArgumentErrorf("package name is invalid") ErrInvalidVersion = util.NewInvalidArgumentErrorf("package version is invalid") ) var namePattern = regexp.MustCompile(`\A[a-zA-Z_][a-zA-Z0-9_]*\z`)
-
-
-
@@ -6,9 +6,10 @@import ( "bufio" "bytes" "errors" "io" "reflect" "code.gitea.io/gitea/modules/util" ) const (
-
@@ -31,9 +32,9 @@ )var ( // ErrUnsupportedType indicates an unsupported type ErrUnsupportedType = errors.New("Type is unsupported") ErrUnsupportedType = util.NewInvalidArgumentErrorf("type is unsupported") // ErrInvalidIntRange indicates an invalid number range ErrInvalidIntRange = errors.New("Number is not in valid range") ErrInvalidIntRange = util.NewInvalidArgumentErrorf("number is not in valid range") ) // RubyUserMarshal is a Ruby object that has a marshal_load function.
-
-
-
@@ -6,11 +6,11 @@import ( "archive/tar" "compress/gzip" "errors" "io" "regexp" "strings" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/validation" "gopkg.in/yaml.v3"
-
@@ -18,11 +18,11 @@ )var ( // ErrMissingMetadataFile indicates a missing metadata.gz file ErrMissingMetadataFile = errors.New("Metadata file is missing") ErrMissingMetadataFile = util.NewInvalidArgumentErrorf("metadata.gz file is missing") // ErrInvalidName indicates an invalid id in the metadata.gz file ErrInvalidName = errors.New("Metadata file contains an invalid name") ErrInvalidName = util.NewInvalidArgumentErrorf("package name is invalid") // ErrInvalidVersion indicates an invalid version in the metadata.gz file ErrInvalidVersion = errors.New("Metadata file contains an invalid version") ErrInvalidVersion = util.NewInvalidArgumentErrorf("package version is invalid") ) var versionMatcher = regexp.MustCompile(`\A[0-9]+(?:\.[0-9a-zA-Z]+)*(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?\z`)
-
-
-
@@ -109,32 +109,6 @@ defer cancel()return q.FlushWithContext(ctx) } // FlushWithContext is very similar to CleanUp but it will return as soon as the dataChan is empty func (q *ChannelQueue) FlushWithContext(ctx context.Context) error { log.Trace("ChannelQueue: %d Flush", q.qid) paused, _ := q.IsPausedIsResumed() for { select { case <-paused: return nil case data, ok := <-q.dataChan: if !ok { return nil } if unhandled := q.handle(data); unhandled != nil { log.Error("Unhandled Data whilst flushing queue %d", q.qid) } atomic.AddInt64(&q.numInQueue, -1) case <-q.baseCtx.Done(): return q.baseCtx.Err() case <-ctx.Done(): return ctx.Err() default: return nil } } } // Shutdown processing from this queue func (q *ChannelQueue) Shutdown() { q.lock.Lock()
-
-
-
@@ -8,7 +8,6 @@ "context""fmt" "runtime/pprof" "sync" "sync/atomic" "time" "code.gitea.io/gitea/modules/container"
-
@@ -165,35 +164,6 @@ }ctx, cancel := q.commonRegisterWorkers(1, timeout, true) defer cancel() return q.FlushWithContext(ctx) } // FlushWithContext is very similar to CleanUp but it will return as soon as the dataChan is empty func (q *ChannelUniqueQueue) FlushWithContext(ctx context.Context) error { log.Trace("ChannelUniqueQueue: %d Flush", q.qid) paused, _ := q.IsPausedIsResumed() for { select { case <-paused: return nil default: } select { case data, ok := <-q.dataChan: if !ok { return nil } if unhandled := q.handle(data); unhandled != nil { log.Error("Unhandled Data whilst flushing queue %d", q.qid) } atomic.AddInt64(&q.numInQueue, -1) case <-q.baseCtx.Done(): return q.baseCtx.Err() case <-ctx.Done(): return ctx.Err() default: return nil } } } // Shutdown processing from this queue
-
-
-
@@ -463,13 +463,43 @@ func (p *WorkerPool) IsEmpty() bool {return atomic.LoadInt64(&p.numInQueue) == 0 } // contextError returns either ctx.Done(), the base context's error or nil func (p *WorkerPool) contextError(ctx context.Context) error { select { case <-p.baseCtx.Done(): return p.baseCtx.Err() case <-ctx.Done(): return ctx.Err() default: return nil } } // FlushWithContext is very similar to CleanUp but it will return as soon as the dataChan is empty // NB: The worker will not be registered with the manager. func (p *WorkerPool) FlushWithContext(ctx context.Context) error { log.Trace("WorkerPool: %d Flush", p.qid) paused, _ := p.IsPausedIsResumed() for { // Because select will return any case that is satisified at random we precheck here before looking at dataChan. select { case data := <-p.dataChan: case <-paused: // Ensure that even if paused that the cancelled error is still sent return p.contextError(ctx) case <-p.baseCtx.Done(): return p.baseCtx.Err() case <-ctx.Done(): return ctx.Err() default: } select { case <-paused: return p.contextError(ctx) case data, ok := <-p.dataChan: if !ok { return nil } if unhandled := p.handle(data); unhandled != nil { log.Error("Unhandled Data whilst flushing queue %d", p.qid) }
-
@@ -495,6 +525,7 @@paused, _ := p.IsPausedIsResumed() data := make([]Data, 0, p.batchLength) for { // Because select will return any case that is satisified at random we precheck here before looking at dataChan. select { case <-paused: log.Trace("Worker for Queue %d Pausing", p.qid)
-
@@ -515,8 +546,19 @@ case <-ctx.Done():log.Trace("Worker shutting down") return } case <-ctx.Done(): if len(data) > 0 { log.Trace("Handling: %d data, %v", len(data), data) if unhandled := p.handle(data...); unhandled != nil { log.Error("Unhandled Data in queue %d", p.qid) } atomic.AddInt64(&p.numInQueue, -1*int64(len(data))) } log.Trace("Worker shutting down") return default: } select { case <-paused: // go back around
-
-
-
@@ -14,7 +14,7 @@ user_model "code.gitea.io/gitea/models/user") func AddCollaborator(ctx context.Context, repo *repo_model.Repository, u *user_model.User) error { return db.AutoTx(ctx, func(ctx context.Context) error { return db.WithTx(ctx, func(ctx context.Context) error { collaboration := &repo_model.Collaboration{ RepoID: repo.ID, UserID: u.ID,
-
-
-
@@ -394,7 +394,7 @@ }defer content.Close() _, err := git_model.NewLFSMetaObject(&git_model.LFSMetaObject{Pointer: p, RepositoryID: repo.ID}) _, err := git_model.NewLFSMetaObject(ctx, &git_model.LFSMetaObject{Pointer: p, RepositoryID: repo.ID}) if err != nil { log.Error("Repo[%-v]: Error creating LFS meta object %-v: %v", repo, p, err) return err
-
@@ -402,7 +402,7 @@ }if err := contentStore.Put(p, content); err != nil { log.Error("Repo[%-v]: Error storing content for LFS meta object %-v: %v", repo, p, err) if _, err2 := git_model.RemoveLFSMetaObjectByOid(repo.ID, p.Oid); err2 != nil { if _, err2 := git_model.RemoveLFSMetaObjectByOid(ctx, repo.ID, p.Oid); err2 != nil { log.Error("Repo[%-v]: Error removing LFS meta object %-v: %v", repo, p, err2) } return err
-
@@ -421,7 +421,7 @@ }var batch []lfs.Pointer for pointerBlob := range pointerChan { meta, err := git_model.GetLFSMetaObjectByOid(repo.ID, pointerBlob.Oid) meta, err := git_model.GetLFSMetaObjectByOid(ctx, repo.ID, pointerBlob.Oid) if err != nil && err != git_model.ErrLFSObjectNotExist { log.Error("Repo[%-v]: Error querying LFS meta object %-v: %v", repo, pointerBlob.Pointer, err) return err
-
@@ -441,7 +441,7 @@ }if exist { log.Trace("Repo[%-v]: LFS object %-v already present; creating meta object", repo, pointerBlob.Pointer) _, err := git_model.NewLFSMetaObject(&git_model.LFSMetaObject{Pointer: pointerBlob.Pointer, RepositoryID: repo.ID}) _, err := git_model.NewLFSMetaObject(ctx, &git_model.LFSMetaObject{Pointer: pointerBlob.Pointer, RepositoryID: repo.ID}) if err != nil { log.Error("Repo[%-v]: Error creating LFS meta object %-v: %v", repo, pointerBlob.Pointer, err) return err
-
-
-
@@ -284,8 +284,6 @@ }} func newLogService() { log.Info("Gitea v%s%s", AppVer, AppBuiltWith) options := newDefaultLogOptions() options.bufferLength = Cfg.Section("log").Key("BUFFER_LEN").MustInt64(10000) EnableSSHLog = Cfg.Section("log").Key("ENABLE_SSH_LOG").MustBool(false)
-
@@ -297,23 +295,13 @@sections := strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",") useConsole := false for i := 0; i < len(sections); i++ { sections[i] = strings.TrimSpace(sections[i]) if sections[i] == "console" { useConsole = true } } if !useConsole { err := log.DelLogger("console") if err != nil { log.Fatal("DelLogger: %v", err) } } for _, name := range sections { if len(name) == 0 { name = strings.TrimSpace(name) if name == "" { continue } if name == "console" { useConsole = true } sec, err := Cfg.GetSection("log." + name + ".default")
-
@@ -335,6 +323,13 @@ log.Info("Gitea Log Mode: %s(%s:%s)", util.ToTitleCase(name), util.ToTitleCase(provider), levelName)} AddLogDescription(log.DEFAULT, &description) if !useConsole { log.Info("According to the configuration, subsequent logs will not be printed to the console") if err := log.DelLogger("console"); err != nil { log.Fatal("Cannot delete console logger: %v", err) } } // Finally redirect the default golog to here golog.SetFlags(0)
-
-
-
@@ -178,14 +178,25 @@ }// we want to warn if users use SMTP on a non-local IP; // we might as well take the opportunity to check that it has an IP at all ips := tryResolveAddr(MailService.SMTPAddr) if MailService.Protocol == "smtp" { for _, ip := range ips { if !ip.IsLoopback() { log.Warn("connecting over insecure SMTP protocol to non-local address is not recommended") break // This check is not needed for sendmail switch MailService.Protocol { case "sendmail": var err error MailService.SendmailArgs, err = shellquote.Split(sec.Key("SENDMAIL_ARGS").String()) if err != nil { log.Error("Failed to parse Sendmail args: '%s' with error %v", sec.Key("SENDMAIL_ARGS").String(), err) } case "smtp", "smtps", "smtp+starttls", "smtp+unix": ips := tryResolveAddr(MailService.SMTPAddr) if MailService.Protocol == "smtp" { for _, ip := range ips { if !ip.IsLoopback() { log.Warn("connecting over insecure SMTP protocol to non-local address is not recommended") break } } } case "dummy": // just mention and do nothing } if MailService.From != "" {
-
@@ -212,14 +223,6 @@ log.Fatal("Invalid mailer.ENVELOPE_FROM (%s): %v", MailService.EnvelopeFrom, err)} MailService.OverrideEnvelopeFrom = true MailService.EnvelopeFrom = parsed.Address } if MailService.Protocol == "sendmail" { var err error MailService.SendmailArgs, err = shellquote.Split(sec.Key("SENDMAIL_ARGS").String()) if err != nil { log.Error("Failed to parse Sendmail args: %s with error %v", CustomConf, err) } } log.Info("Mail Service Enabled")
-
-
-
@@ -68,7 +68,7 @@ newRepoAvatarService()} func GetDefaultDisableGravatar() bool { return !OfflineMode return OfflineMode } func GetDefaultEnableFederatedAvatar(disableGravatar bool) bool {
-
-
-
@@ -48,6 +48,7 @@ DefaultBranch stringAllowAdoptionOfUnadoptedRepositories bool AllowDeleteOfUnadoptedRepositories bool DisableDownloadSourceArchives bool AllowForkWithoutMaximumLimit bool // Repository editor settings Editor struct {
-
@@ -160,6 +161,7 @@ PrefixArchiveFiles: true,DisableMigrations: false, DisableStars: false, DefaultBranch: "main", AllowForkWithoutMaximumLimit: true, // Repository editor settings Editor: struct {
-
-
-
@@ -1043,7 +1043,10 @@ RunUser = Cfg.Section("").Key("RUN_USER").MustString(user.CurrentUsername())// The following is a purposefully undocumented option. Please do not run Gitea as root. It will only cause future headaches. // Please don't use root as a bandaid to "fix" something that is broken, instead the broken thing should instead be fixed properly. unsafeAllowRunAsRoot := Cfg.Section("").Key("I_AM_BEING_UNSAFE_RUNNING_AS_ROOT").MustBool(false) RunMode = Cfg.Section("").Key("RUN_MODE").MustString("prod") RunMode = os.Getenv("GITEA_RUN_MODE") if RunMode == "" { RunMode = Cfg.Section("").Key("RUN_MODE").MustString("prod") } IsProd = strings.EqualFold(RunMode, "prod") // Does not check run user when the install lock is off. if InstallLock {
-
-
-
@@ -11,48 +11,62 @@ "io""time" ) // sitemapFileLimit contains the maximum size of a sitemap file const sitemapFileLimit = 50 * 1024 * 1024 const ( sitemapFileLimit = 50 * 1024 * 1024 // the maximum size of a sitemap file urlsLimit = 50000 schemaURL = "http://www.sitemaps.org/schemas/sitemap/0.9" urlsetName = "urlset" sitemapindexName = "sitemapindex" ) // Url represents a single sitemap entry // URL represents a single sitemap entry type URL struct { URL string `xml:"loc"` LastMod *time.Time `xml:"lastmod,omitempty"` } // SitemapUrl represents a sitemap // Sitemap represents a sitemap type Sitemap struct { XMLName xml.Name Namespace string `xml:"xmlns,attr"` URLs []URL `xml:"url"` URLs []URL `xml:"url"` Sitemaps []URL `xml:"sitemap"` } // NewSitemap creates a sitemap func NewSitemap() *Sitemap { return &Sitemap{ XMLName: xml.Name{Local: "urlset"}, Namespace: "http://www.sitemaps.org/schemas/sitemap/0.9", XMLName: xml.Name{Local: urlsetName}, Namespace: schemaURL, } } // NewSitemap creates a sitemap index. // NewSitemapIndex creates a sitemap index. func NewSitemapIndex() *Sitemap { return &Sitemap{ XMLName: xml.Name{Local: "sitemapindex"}, Namespace: "http://www.sitemaps.org/schemas/sitemap/0.9", XMLName: xml.Name{Local: sitemapindexName}, Namespace: schemaURL, } } // Add adds a URL to the sitemap func (s *Sitemap) Add(u URL) { s.URLs = append(s.URLs, u) if s.XMLName.Local == sitemapindexName { s.Sitemaps = append(s.Sitemaps, u) } else { s.URLs = append(s.URLs, u) } } // Write writes the sitemap to a response // WriteTo writes the sitemap to a response func (s *Sitemap) WriteTo(w io.Writer) (int64, error) { if len(s.URLs) > 50000 { return 0, fmt.Errorf("The sitemap contains too many URLs: %d", len(s.URLs)) if l := len(s.URLs); l > urlsLimit { return 0, fmt.Errorf("The sitemap contains %d URLs, but only %d are allowed", l, urlsLimit) } if l := len(s.Sitemaps); l > urlsLimit { return 0, fmt.Errorf("The sitemap contains %d sub-sitemaps, but only %d are allowed", l, urlsLimit) } buf := bytes.NewBufferString(xml.Header) if err := xml.NewEncoder(buf).Encode(s); err != nil {
-
@@ -62,7 +76,7 @@ if err := buf.WriteByte('\n'); err != nil {return 0, err } if buf.Len() > sitemapFileLimit { return 0, fmt.Errorf("The sitemap is too big: %d", buf.Len()) return 0, fmt.Errorf("The sitemap has %d bytes, but only %d are allowed", buf.Len(), sitemapFileLimit) } return buf.WriteTo(w) }
-
-
-
@@ -6,7 +6,6 @@import ( "bytes" "encoding/xml" "fmt" "strings" "testing" "time"
-
@@ -14,63 +13,154 @@"github.com/stretchr/testify/assert" ) func TestOk(t *testing.T) { testReal := func(s *Sitemap, name string, urls []URL, expected string) { for _, url := range urls { s.Add(url) } buf := &bytes.Buffer{} _, err := s.WriteTo(buf) assert.NoError(t, nil, err) assert.Equal(t, xml.Header+"<"+name+" xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">"+expected+"</"+name+">\n", buf.String()) func TestNewSitemap(t *testing.T) { ts := time.Unix(1651322008, 0).UTC() tests := []struct { name string urls []URL want string wantErr string }{ { name: "empty", urls: []URL{}, want: xml.Header + `<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">` + "" + "</urlset>\n", }, { name: "regular", urls: []URL{ {URL: "https://gitea.io/test1", LastMod: &ts}, }, want: xml.Header + `<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">` + "<url><loc>https://gitea.io/test1</loc><lastmod>2022-04-30T12:33:28Z</lastmod></url>" + "</urlset>\n", }, { name: "without lastmod", urls: []URL{ {URL: "https://gitea.io/test1"}, }, want: xml.Header + `<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">` + "<url><loc>https://gitea.io/test1</loc></url>" + "</urlset>\n", }, { name: "multiple", urls: []URL{ {URL: "https://gitea.io/test1", LastMod: &ts}, {URL: "https://gitea.io/test2", LastMod: nil}, }, want: xml.Header + `<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">` + "<url><loc>https://gitea.io/test1</loc><lastmod>2022-04-30T12:33:28Z</lastmod></url>" + "<url><loc>https://gitea.io/test2</loc></url>" + "</urlset>\n", }, { name: "too many urls", urls: make([]URL, 50001), wantErr: "The sitemap contains 50001 URLs, but only 50000 are allowed", }, { name: "too big file", urls: []URL{ {URL: strings.Repeat("b", 50*1024*1024+1)}, }, wantErr: "The sitemap has 52428932 bytes, but only 52428800 are allowed", }, } test := func(urls []URL, expected string) { testReal(NewSitemap(), "urlset", urls, expected) testReal(NewSitemapIndex(), "sitemapindex", urls, expected) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s := NewSitemap() for _, url := range tt.urls { s.Add(url) } buf := &bytes.Buffer{} _, err := s.WriteTo(buf) if tt.wantErr != "" { assert.EqualError(t, err, tt.wantErr) } else { assert.NoError(t, err) assert.Equalf(t, tt.want, buf.String(), "NewSitemap()") } }) } } func TestNewSitemapIndex(t *testing.T) { ts := time.Unix(1651322008, 0).UTC() test( []URL{}, "", ) test( []URL{ {URL: "https://gitea.io/test1", LastMod: &ts}, tests := []struct { name string urls []URL want string wantErr string }{ { name: "empty", urls: []URL{}, want: xml.Header + `<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">` + "" + "</sitemapindex>\n", }, "<url><loc>https://gitea.io/test1</loc><lastmod>2022-04-30T12:33:28Z</lastmod></url>", ) test( []URL{ {URL: "https://gitea.io/test2", LastMod: nil}, { name: "regular", urls: []URL{ {URL: "https://gitea.io/test1", LastMod: &ts}, }, want: xml.Header + `<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">` + "<sitemap><loc>https://gitea.io/test1</loc><lastmod>2022-04-30T12:33:28Z</lastmod></sitemap>" + "</sitemapindex>\n", }, "<url><loc>https://gitea.io/test2</loc></url>", ) test( []URL{ {URL: "https://gitea.io/test1", LastMod: &ts}, {URL: "https://gitea.io/test2", LastMod: nil}, { name: "without lastmod", urls: []URL{ {URL: "https://gitea.io/test1"}, }, want: xml.Header + `<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">` + "<sitemap><loc>https://gitea.io/test1</loc></sitemap>" + "</sitemapindex>\n", }, "<url><loc>https://gitea.io/test1</loc><lastmod>2022-04-30T12:33:28Z</lastmod></url>"+ "<url><loc>https://gitea.io/test2</loc></url>", ) } func TestTooManyURLs(t *testing.T) { s := NewSitemap() for i := 0; i < 50001; i++ { s.Add(URL{URL: fmt.Sprintf("https://gitea.io/test%d", i)}) { name: "multiple", urls: []URL{ {URL: "https://gitea.io/test1", LastMod: &ts}, {URL: "https://gitea.io/test2", LastMod: nil}, }, want: xml.Header + `<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">` + "<sitemap><loc>https://gitea.io/test1</loc><lastmod>2022-04-30T12:33:28Z</lastmod></sitemap>" + "<sitemap><loc>https://gitea.io/test2</loc></sitemap>" + "</sitemapindex>\n", }, { name: "too many sitemaps", urls: make([]URL, 50001), wantErr: "The sitemap contains 50001 sub-sitemaps, but only 50000 are allowed", }, { name: "too big file", urls: []URL{ {URL: strings.Repeat("b", 50*1024*1024+1)}, }, wantErr: "The sitemap has 52428952 bytes, but only 52428800 are allowed", }, } buf := &bytes.Buffer{} _, err := s.WriteTo(buf) assert.EqualError(t, err, "The sitemap contains too many URLs: 50001") } func TestSitemapTooBig(t *testing.T) { s := NewSitemap() s.Add(URL{URL: strings.Repeat("b", sitemapFileLimit)}) buf := &bytes.Buffer{} _, err := s.WriteTo(buf) assert.EqualError(t, err, "The sitemap is too big: 52428931") for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s := NewSitemapIndex() for _, url := range tt.urls { s.Add(url) } buf := &bytes.Buffer{} _, err := s.WriteTo(buf) if tt.wantErr != "" { assert.EqualError(t, err, tt.wantErr) } else { assert.NoError(t, err) assert.Equalf(t, tt.want, buf.String(), "NewSitemapIndex()") } }) } }
-
-
-
@@ -9,6 +9,7 @@ RemoteAddress string `json:"remote_address"`RemoteUsername string `json:"remote_username"` RemotePassword string `json:"remote_password"` Interval string `json:"interval"` SyncOnCommit bool `json:"sync_on_commit"` } // PushMirror represents information of a push mirror
-
@@ -21,4 +22,5 @@ CreatedUnix string `json:"created"`LastUpdateUnix string `json:"last_update"` LastError string `json:"last_error"` Interval string `json:"interval"` SyncOnCommit bool `json:"sync_on_commit"` }
-
-
-
@@ -75,8 +75,15 @@ })compilingTemplates = false if !setting.IsProd { watcher.CreateWatcher(ctx, "HTML Templates", &watcher.CreateWatcherOpts{ PathsCallback: walkTemplateFiles, BetweenCallback: renderer.CompileTemplates, PathsCallback: walkTemplateFiles, BetweenCallback: func() { defer func() { if err := recover(); err != nil { log.Error("PANIC: %v\n%s", err, log.Stack(2)) } }() renderer.CompileTemplates() }, }) } return context.WithValue(ctx, rendererKey, renderer), renderer
-
-
-
@@ -5,6 +5,7 @@ package utilimport ( "errors" "fmt" ) // Common Errors forming the base of our error system
-
@@ -34,3 +35,31 @@ // Unwrap returns the underlying errorfunc (w SilentWrap) Unwrap() error { return w.Err } // NewSilentWrapErrorf returns an error that formats as the given text but unwraps as the provided error func NewSilentWrapErrorf(unwrap error, message string, args ...interface{}) error { if len(args) == 0 { return SilentWrap{Message: message, Err: unwrap} } return SilentWrap{Message: fmt.Sprintf(message, args...), Err: unwrap} } // NewInvalidArgumentErrorf returns an error that formats as the given text but unwraps as an ErrInvalidArgument func NewInvalidArgumentErrorf(message string, args ...interface{}) error { return NewSilentWrapErrorf(ErrInvalidArgument, message, args...) } // NewPermissionDeniedErrorf returns an error that formats as the given text but unwraps as an ErrPermissionDenied func NewPermissionDeniedErrorf(message string, args ...interface{}) error { return NewSilentWrapErrorf(ErrPermissionDenied, message, args...) } // NewAlreadyExistErrorf returns an error that formats as the given text but unwraps as an ErrAlreadyExist func NewAlreadyExistErrorf(message string, args ...interface{}) error { return NewSilentWrapErrorf(ErrAlreadyExist, message, args...) } // NewNotExistErrorf returns an error that formats as the given text but unwraps as an ErrNotExist func NewNotExistErrorf(message string, args ...interface{}) error { return NewSilentWrapErrorf(ErrNotExist, message, args...) }
-
-
-
@@ -0,0 +1,38 @@// Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package webhook // HookEvents is a set of web hook events type HookEvents struct { Create bool `json:"create"` Delete bool `json:"delete"` Fork bool `json:"fork"` Issues bool `json:"issues"` IssueAssign bool `json:"issue_assign"` IssueLabel bool `json:"issue_label"` IssueMilestone bool `json:"issue_milestone"` IssueComment bool `json:"issue_comment"` Push bool `json:"push"` PullRequest bool `json:"pull_request"` PullRequestAssign bool `json:"pull_request_assign"` PullRequestLabel bool `json:"pull_request_label"` PullRequestMilestone bool `json:"pull_request_milestone"` PullRequestComment bool `json:"pull_request_comment"` PullRequestReview bool `json:"pull_request_review"` PullRequestSync bool `json:"pull_request_sync"` Wiki bool `json:"wiki"` Repository bool `json:"repository"` Release bool `json:"release"` Package bool `json:"package"` } // HookEvent represents events that will delivery hook. type HookEvent struct { PushOnly bool `json:"push_only"` SendEverything bool `json:"send_everything"` ChooseEvents bool `json:"choose_events"` BranchFilter string `json:"branch_filter"` HookEvents `json:"events"` }
-
-
modules/webhook/type.go (new)
-
@@ -0,0 +1,95 @@// Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package webhook // HookEventType is the type of a hook event type HookEventType string // Types of hook events const ( HookEventCreate HookEventType = "create" HookEventDelete HookEventType = "delete" HookEventFork HookEventType = "fork" HookEventPush HookEventType = "push" HookEventIssues HookEventType = "issues" HookEventIssueAssign HookEventType = "issue_assign" HookEventIssueLabel HookEventType = "issue_label" HookEventIssueMilestone HookEventType = "issue_milestone" HookEventIssueComment HookEventType = "issue_comment" HookEventPullRequest HookEventType = "pull_request" HookEventPullRequestAssign HookEventType = "pull_request_assign" HookEventPullRequestLabel HookEventType = "pull_request_label" HookEventPullRequestMilestone HookEventType = "pull_request_milestone" HookEventPullRequestComment HookEventType = "pull_request_comment" HookEventPullRequestReviewApproved HookEventType = "pull_request_review_approved" HookEventPullRequestReviewRejected HookEventType = "pull_request_review_rejected" HookEventPullRequestReviewComment HookEventType = "pull_request_review_comment" HookEventPullRequestSync HookEventType = "pull_request_sync" HookEventWiki HookEventType = "wiki" HookEventRepository HookEventType = "repository" HookEventRelease HookEventType = "release" HookEventPackage HookEventType = "package" ) // Event returns the HookEventType as an event string func (h HookEventType) Event() string { switch h { case HookEventCreate: return "create" case HookEventDelete: return "delete" case HookEventFork: return "fork" case HookEventPush: return "push" case HookEventIssues, HookEventIssueAssign, HookEventIssueLabel, HookEventIssueMilestone: return "issues" case HookEventPullRequest, HookEventPullRequestAssign, HookEventPullRequestLabel, HookEventPullRequestMilestone, HookEventPullRequestSync: return "pull_request" case HookEventIssueComment, HookEventPullRequestComment: return "issue_comment" case HookEventPullRequestReviewApproved: return "pull_request_approved" case HookEventPullRequestReviewRejected: return "pull_request_rejected" case HookEventPullRequestReviewComment: return "pull_request_comment" case HookEventWiki: return "wiki" case HookEventRepository: return "repository" case HookEventRelease: return "release" } return "" } // HookType is the type of a webhook type HookType = string // Types of webhooks const ( GITEA HookType = "gitea" GOGS HookType = "gogs" SLACK HookType = "slack" DISCORD HookType = "discord" DINGTALK HookType = "dingtalk" TELEGRAM HookType = "telegram" MSTEAMS HookType = "msteams" FEISHU HookType = "feishu" MATRIX HookType = "matrix" WECHATWORK HookType = "wechatwork" PACKAGIST HookType = "packagist" ) // HookStatus is the status of a web hook type HookStatus int // Possible statuses of a web hook const ( HookStatusNone HookStatus = iota HookStatusSucceed HookStatusFail )
-
-
-
@@ -1,3 +1,6 @@# Godot 4+ specific ignores .godot/ # Godot-specific ignores .import/ export.cfg
-
@@ -9,3 +12,4 @@# Mono-specific ignores .mono/ data_*/ mono_crash.*.json
-
-
-
@@ -0,0 +1,9 @@(c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA. You are hereby granted permission under all Bitstream propriety rights to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts for any purpose and without restriction; provided, that this notice is left intact on all copies of such fonts and that Bitstream's trademark is acknowledged as shown below on all unmodified copies of the 4 Charter Type 1 fonts. BITSTREAM CHARTER is a registered trademark of Bitstream Inc.
-
-
-
@@ -0,0 +1,5 @@LICENSE This code repository predates the concept of Open Source, and predates most licenses along such lines. As such, the official license truly is: EULA: The Graphics Gems code is copyright-protected. In other words, you cannot claim the text of the code as your own and resell it. Using the code is permitted in any program, product, or library, non-commercial or commercial. Giving credit is not required, though is a nice gesture. The code comes as-is, and if there are any flaws or problems with any Gems code, nobody involved with Gems - authors, editors, publishers, or webmasters - are to be held responsible. Basically, don't be a jerk, and remember that anything free comes with no guarantee.
-
-
-
@@ -0,0 +1,5 @@Copyright (C) 1990 by the Massachusetts Institute of Technology Export of this software from the United States of America may require a specific license from the United States Government. It is the responsibility of any person or organization contemplating export to obtain such a license before exporting. WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of M.I.T. not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. M.I.T. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty.
-
-
-
@@ -0,0 +1,35 @@The authors make NO WARRANTY or representation, either express or implied, with respect to this software, its quality, accuracy, merchantability, or fitness for a particular purpose. This software is provided "AS IS", and you, its user, assume the entire risk as to its quality and accuracy. This software is copyright (C) 1991, 1992, Thomas G. Lane. All Rights Reserved except as specified below. Permission is hereby granted to use, copy, modify, and distribute this software (or portions thereof) for any purpose, without fee, subject to these conditions: (1) If any part of the source code for this software is distributed, then this README file must be included, with this copyright and no-warranty notice unaltered; and any additions, deletions, or changes to the original files must be clearly indicated in accompanying documentation. (2) If only executable code is distributed, then the accompanying documentation must state that "this software is based in part on the work of the Independent JPEG Group". (3) Permission for use of this software is granted only if the user accepts full responsibility for any undesirable consequences; the authors accept NO LIABILITY for damages of any kind. Permission is NOT granted for the use of any IJG author's name or company name in advertising or publicity relating to this software or products derived from it. This software may be referred to only as "the Independent JPEG Group's software". We specifically permit and encourage the use of this software as the basis of commercial products, provided that all warranty or liability claims are assumed by the product vendor.
-
-
options/license/MIT-Wu (new)
-
@@ -0,0 +1,28 @@Copyright (c) 2003-2005 Tom Wu All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. In addition, the following condition applies: All redistributions must retain an intact copy of this copyright notice and disclaimer.
-
-
options/license/TPDL (new)
-
@@ -0,0 +1,2 @@Copyright (C) 1996-2010 David Muir Sharnoff. Copyright (C) 2011 Google, Inc. License hereby granted for anyone to use, modify or redistribute this module at their own risk. Please feed useful changes back to cpan@dave.sharnoff.org.
-
-
options/license/TTWL (new)
-
@@ -0,0 +1,8 @@Copyright (C) 1996-2002,2005,2006 David Muir Sharnoff. Copyright (C) 2005 Aristotle Pagaltzis Copyright (C) 2012-2013 Google, Inc. This module may be modified, used, copied, and redistributed at your own risk. Although allowed by the preceding license, please do not publicly redistribute modified versions of this code with the name "Text::Tabs" unless it passes the unmodified Text::Tabs test suite.
-
-
-
@@ -95,7 +95,7 @@ copy_content = Copy contentcopy_branch = Copy branch name copy_success = Copied! copy_error = Copy failed copy_type_unsupported = This file type can not be copied copy_type_unsupported = This file type cannot be copied write = Write preview = Preview
-
@@ -302,7 +302,7 @@ social_register_helper_msg = Already have an account? Link it now!disable_register_prompt = Registration is disabled. Please contact your site administrator. disable_register_mail = Email confirmation for registration is disabled. manual_activation_only = Contact your site administrator to complete activation. remember_me = Remember this Device remember_me = Remember This Device forgot_password_title= Forgot Password forgot_password = Forgot password? sign_up_now = Need an account? Register now.
-
@@ -325,7 +325,7 @@ invalid_code = Your confirmation code is invalid or has expired.reset_password_helper = Recover Account reset_password_wrong_user = You are signed in as %s, but the account recovery link is for %s password_too_short = Password length cannot be less than %d characters. non_local_account = Non-local users can not update their password through the Gitea web interface. non_local_account = Non-local users cannot update their password through the Gitea web interface. verify = Verify scratch_code = Scratch code use_scratch_code = Use a scratch code
-
@@ -507,10 +507,10 @@ cannot_add_org_to_team = An organization cannot be added as a team member.duplicate_invite_to_team = The user was already invited as a team member. organization_leave_success = You have successfully left the organization %s. invalid_ssh_key = Can not verify your SSH key: %s invalid_gpg_key = Can not verify your GPG key: %s invalid_ssh_key = Cannot verify your SSH key: %s invalid_gpg_key = Cannot verify your GPG key: %s invalid_ssh_principal = Invalid principal: %s unable_verify_ssh_key = "Can not verify the SSH key; double-check it for mistakes." unable_verify_ssh_key = "Cannot verify the SSH key; double-check it for mistakes." auth_failed = Authentication failed: %v still_own_repo = "Your account owns one or more repositories; delete or transfer them first."
-
@@ -618,7 +618,7 @@ new_password = New Passwordretype_new_password = Re-Type New Password password_incorrect = The current password is incorrect. change_password_success = Your password has been updated. Sign in using your new password from now on. password_change_disabled = Non-local users can not update their password through the Gitea web interface. password_change_disabled = Non-local users cannot update their password through the Gitea web interface. emails = Email Addresses manage_emails = Manage Email Addresses
-
@@ -813,7 +813,7 @@ orgs_none = You are not a member of any organizations.repos_none = You do not own any repositories delete_account = Delete Your Account delete_prompt = This operation will permanently delete your user account. It <strong>CAN NOT</strong> be undone. delete_prompt = This operation will permanently delete your user account. It <strong>CANNOT</strong> be undone. delete_with_all_comments = Your account is younger than %s. To avoid ghost comments, all issue/PR comments will be deleted with it. confirm_delete_account = Confirm Deletion delete_account_title = Delete User Account
-
@@ -977,7 +977,7 @@ migrate.clone_address_desc = The HTTP(S) or Git 'clone' URL of an existing repositorymigrate.github_token_desc = You can put one or more tokens with comma separated here to make migrating faster because of GitHub API rate limit. WARN: Abusing this feature may violate the service provider's policy and lead to account blocking. migrate.clone_local_path = or a local server path migrate.permission_denied = You are not allowed to import local repositories. migrate.permission_denied_blocked = You can not import from disallowed hosts, please ask the admin to check ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS settings. migrate.permission_denied_blocked = You cannot import from disallowed hosts, please ask the admin to check ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS settings. migrate.invalid_local_path = "The local path is invalid. It does not exist or is not a directory." migrate.invalid_lfs_endpoint = The LFS endpoint is not valid. migrate.failed = Migration failed: %v
-
@@ -1590,7 +1590,7 @@ pulls.wrong_commit_id = "commit id must be a commit id on the target branch"pulls.no_merge_desc = This pull request cannot be merged because all repository merge options are disabled. pulls.no_merge_helper = Enable merge options in the repository settings or merge the pull request manually. pulls.no_merge_wip = This pull request can not be merged because it is marked as being a work in progress. pulls.no_merge_wip = This pull request cannot be merged because it is marked as being a work in progress. pulls.no_merge_not_ready = This pull request is not ready to be merged, check review status and status checks. pulls.no_merge_access = You are not authorized to merge this pull request. pulls.merge_pull_request = Create merge commit
-
@@ -1925,8 +1925,8 @@ settings.update_settings_success = The repository settings have been updated.settings.confirm_delete = Delete Repository settings.add_collaborator = Add Collaborator settings.add_collaborator_success = The collaborator has been added. settings.add_collaborator_inactive_user = Can not add an inactive user as a collaborator. settings.add_collaborator_owner = Can not add an owner as a collaborator. settings.add_collaborator_inactive_user = Cannot add an inactive user as a collaborator. settings.add_collaborator_owner = Cannot add an owner as a collaborator. settings.add_collaborator_duplicate = The collaborator is already added to this repository. settings.delete_collaborator = Remove settings.collaborator_deletion = Remove Collaborator
-
@@ -2071,7 +2071,7 @@ settings.branches = Branchessettings.protected_branch = Branch Protection settings.protected_branch_can_push = Allow push? settings.protected_branch_can_push_yes = You can push settings.protected_branch_can_push_no = You can not push settings.protected_branch_can_push_no = You cannot push settings.branch_protection = Branch Protection for Branch '<b>%s</b>' settings.protect_this_branch = Enable Branch Protection settings.protect_this_branch_desc = Prevents deletion and restricts Git pushing and merging to the branch.
-
@@ -2323,7 +2323,7 @@ tag.create_success = Tag '%s' has been created.topic.manage_topics = Manage Topics topic.done = Done topic.count_prompt = You can not select more than 25 topics topic.count_prompt = You cannot select more than 25 topics topic.format_prompt = Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long. find_file.go_to_file = Go to file
-
@@ -3061,7 +3061,7 @@ raw_minutes = minutes[dropzone] default_message = Drop files or click here to upload. invalid_input_type = You can not upload files of this type. invalid_input_type = You cannot upload files of this type. file_too_big = File size ({{filesize}} MB) exceeds the maximum size of ({{maxFilesize}} MB). remove_file = Remove file
-
-
-
@@ -5893,9 +5893,9 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==","dev": true }, "node_modules/json5": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" },
-
@@ -8937,9 +8937,9 @@ "strip-bom": "^3.0.0"} }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0"
-
@@ -14210,9 +14210,9 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==","dev": true }, "json5": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==" "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonc-parser": { "version": "2.2.1",
-
@@ -16502,9 +16502,9 @@ "strip-bom": "^3.0.0"}, "dependencies": { "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0"
-
-
-
@@ -11,6 +11,7 @@ "strings""code.gitea.io/gitea/models/perm" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/packages/composer"
-
@@ -58,7 +59,13 @@ }authGroup := auth.NewGroup(authMethods...) r.Use(func(ctx *context.Context) { ctx.Doer = authGroup.Verify(ctx.Req, ctx.Resp, ctx, ctx.Session) var err error ctx.Doer, err = authGroup.Verify(ctx.Req, ctx.Resp, ctx, ctx.Session) if err != nil { log.Error("Verify: %v", err) ctx.Error(http.StatusUnauthorized, "authGroup.Verify") return } ctx.IsSigned = ctx.Doer != nil })
-
@@ -321,7 +328,13 @@ }authGroup := auth.NewGroup(authMethods...) r.Use(func(ctx *context.Context) { ctx.Doer = authGroup.Verify(ctx.Req, ctx.Resp, ctx, ctx.Session) var err error ctx.Doer, err = authGroup.Verify(ctx.Req, ctx.Resp, ctx, ctx.Session) if err != nil { log.Error("Failed to verify user: %v", err) ctx.Error(http.StatusUnauthorized, "Verify") return } ctx.IsSigned = ctx.Doer != nil })
-
-
-
@@ -4,6 +4,7 @@package composer import ( "errors" "fmt" "io" "net/http"
-
@@ -14,12 +15,12 @@"code.gitea.io/gitea/models/db" packages_model "code.gitea.io/gitea/models/packages" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" packages_module "code.gitea.io/gitea/modules/packages" composer_module "code.gitea.io/gitea/modules/packages/composer" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/routers/api/packages/helper" "code.gitea.io/gitea/services/convert" packages_service "code.gitea.io/gitea/services/packages" "github.com/hashicorp/go-version"
-
@@ -200,7 +201,11 @@ defer buf.Close()cp, err := composer_module.ParsePackage(buf, buf.Size()) if err != nil { apiError(ctx, http.StatusBadRequest, err) if errors.Is(err, util.ErrInvalidArgument) { apiError(ctx, http.StatusBadRequest, err) } else { apiError(ctx, http.StatusInternalServerError, err) } return }
-
-
-
@@ -19,22 +19,22 @@ return "conan"} // Verify extracts the user from the Bearer token func (a *Auth) Verify(req *http.Request, w http.ResponseWriter, store auth.DataStore, sess auth.SessionStore) *user_model.User { func (a *Auth) Verify(req *http.Request, w http.ResponseWriter, store auth.DataStore, sess auth.SessionStore) (*user_model.User, error) { uid, err := packages.ParseAuthorizationToken(req) if err != nil { log.Trace("ParseAuthorizationToken: %v", err) return nil return nil, err } if uid == 0 { return nil return nil, nil } u, err := user_model.GetUserByID(req.Context(), uid) if err != nil { log.Error("GetUserByID: %v", err) return nil return nil, err } return u return u, nil }
-
-
-
@@ -20,25 +20,25 @@ }// Verify extracts the user from the Bearer token // If it's an anonymous session a ghost user is returned func (a *Auth) Verify(req *http.Request, w http.ResponseWriter, store auth.DataStore, sess auth.SessionStore) *user_model.User { func (a *Auth) Verify(req *http.Request, w http.ResponseWriter, store auth.DataStore, sess auth.SessionStore) (*user_model.User, error) { uid, err := packages.ParseAuthorizationToken(req) if err != nil { log.Trace("ParseAuthorizationToken: %v", err) return nil return nil, err } if uid == 0 { return nil return nil, nil } if uid == -1 { return user_model.NewGhostUser() return user_model.NewGhostUser(), nil } u, err := user_model.GetUserByID(req.Context(), uid) if err != nil { log.Error("GetUserByID: %v", err) return nil return nil, err } return u return u, nil }
-
-
-
@@ -4,6 +4,7 @@package helm import ( "errors" "fmt" "io" "net/http"
-
@@ -163,7 +164,11 @@ defer buf.Close()metadata, err := helm_module.ParseChartArchive(buf) if err != nil { apiError(ctx, http.StatusBadRequest, err) if errors.Is(err, util.ErrInvalidArgument) { apiError(ctx, http.StatusBadRequest, err) } else { apiError(ctx, http.StatusInternalServerError, err) } return }
-
-
-
@@ -158,7 +158,11 @@ // UploadPackage creates a new packagefunc UploadPackage(ctx *context.Context) { npmPackage, err := npm_module.ParsePackage(ctx.Req.Body) if err != nil { apiError(ctx, http.StatusBadRequest, err) if errors.Is(err, util.ErrInvalidArgument) { apiError(ctx, http.StatusBadRequest, err) } else { apiError(ctx, http.StatusInternalServerError, err) } return }
-
-
-
@@ -20,19 +20,20 @@ return "nuget"} // https://docs.microsoft.com/en-us/nuget/api/package-publish-resource#request-parameters func (a *Auth) Verify(req *http.Request, w http.ResponseWriter, store auth.DataStore, sess auth.SessionStore) *user_model.User { func (a *Auth) Verify(req *http.Request, w http.ResponseWriter, store auth.DataStore, sess auth.SessionStore) (*user_model.User, error) { token, err := auth_model.GetAccessTokenBySHA(req.Header.Get("X-NuGet-ApiKey")) if err != nil { if !(auth_model.IsErrAccessTokenNotExist(err) || auth_model.IsErrAccessTokenEmpty(err)) { log.Error("GetAccessTokenBySHA: %v", err) return nil, err } return nil return nil, nil } u, err := user_model.GetUserByID(req.Context(), token.UID) if err != nil { log.Error("GetUserByID: %v", err) return nil return nil, err } token.UpdatedUnix = timeutil.TimeStampNow()
-
@@ -40,5 +41,5 @@ if err := auth_model.UpdateAccessToken(token); err != nil {log.Error("UpdateAccessToken: %v", err) } return u return u, nil }
-
-
-
@@ -411,7 +411,11 @@ }pdbs, err := nuget_module.ExtractPortablePdb(buf, buf.Size()) if err != nil { apiError(ctx, http.StatusBadRequest, err) if errors.Is(err, util.ErrInvalidArgument) { apiError(ctx, http.StatusBadRequest, err) } else { apiError(ctx, http.StatusInternalServerError, err) } return } defer pdbs.Close()
-
@@ -507,7 +511,7 @@ closables = append(closables, buf)np, err := nuget_module.ParsePackageMetaData(buf, buf.Size()) if err != nil { if err == nuget_module.ErrMissingNuspecFile || err == nuget_module.ErrNuspecFileTooLarge || err == nuget_module.ErrNuspecInvalidID || err == nuget_module.ErrNuspecInvalidVersion { if errors.Is(err, util.ErrInvalidArgument) { apiError(ctx, http.StatusBadRequest, err) } else { apiError(ctx, http.StatusInternalServerError, err)
-
-
-
@@ -4,6 +4,7 @@package pub import ( "errors" "fmt" "io" "net/http"
-
@@ -19,6 +20,7 @@ "code.gitea.io/gitea/modules/log"packages_module "code.gitea.io/gitea/modules/packages" pub_module "code.gitea.io/gitea/modules/packages/pub" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/routers/api/packages/helper" packages_service "code.gitea.io/gitea/services/packages" )
-
@@ -173,7 +175,11 @@ defer buf.Close()pck, err := pub_module.ParsePackage(buf) if err != nil { apiError(ctx, http.StatusInternalServerError, err) if errors.Is(err, util.ErrInvalidArgument) { apiError(ctx, http.StatusBadRequest, err) } else { apiError(ctx, http.StatusInternalServerError, err) } return }
-
-
-
@@ -6,6 +6,7 @@import ( "compress/gzip" "compress/zlib" "errors" "fmt" "io" "net/http"
-
@@ -217,7 +218,11 @@ defer buf.Close()rp, err := rubygems_module.ParsePackageMetaData(buf) if err != nil { apiError(ctx, http.StatusInternalServerError, err) if errors.Is(err, util.ErrInvalidArgument) { apiError(ctx, http.StatusBadRequest, err) } else { apiError(ctx, http.StatusInternalServerError, err) } return } if _, err := buf.Seek(0, io.SeekStart); err != nil {
-
-
-
@@ -14,11 +14,11 @@ "code.gitea.io/gitea/models/db"repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/forgefed" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/activitypub" "code.gitea.io/gitea/services/convert" ap "github.com/go-ap/activitypub" )
-
-
-
@@ -11,10 +11,10 @@ "code.gitea.io/gitea/models/db""code.gitea.io/gitea/models/organization" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // CreateOrg api for create organization
-
-
-
@@ -16,7 +16,6 @@ "code.gitea.io/gitea/models/auth""code.gitea.io/gitea/models/db" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/password" "code.gitea.io/gitea/modules/setting"
-
@@ -26,6 +25,7 @@ "code.gitea.io/gitea/modules/web""code.gitea.io/gitea/routers/api/v1/user" "code.gitea.io/gitea/routers/api/v1/utils" asymkey_service "code.gitea.io/gitea/services/asymkey" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/services/mailer" user_service "code.gitea.io/gitea/services/user" )
-
-
-
@@ -230,13 +230,10 @@ }} } func reqBasicOrRevProxyAuth() func(ctx *context.APIContext) { func reqBasicAuth() func(ctx *context.APIContext) { return func(ctx *context.APIContext) { if ctx.IsSigned && setting.Service.EnableReverseProxyAuth && ctx.Data["AuthedMethod"].(string) == auth.ReverseProxyMethodName { return } if !ctx.Context.IsBasicAuth { ctx.Error(http.StatusUnauthorized, "reqBasicOrRevProxyAuth", "auth required") ctx.Error(http.StatusUnauthorized, "reqBasicAuth", "auth required") return } ctx.CheckForOTP()
-
@@ -598,9 +595,6 @@ &auth.OAuth2{},&auth.HTTPSign{}, &auth.Basic{}, // FIXME: this should be removed once we don't allow basic auth in API ) if setting.Service.EnableReverseProxyAuth { group.Add(&auth.ReverseProxy{}) } specialAdd(group) return group
-
@@ -703,7 +697,7 @@ m.Group("/tokens", func() {m.Combo("").Get(user.ListAccessTokens). Post(bind(api.CreateAccessTokenOption{}), user.CreateAccessToken) m.Combo("/{id}").Delete(user.DeleteAccessToken) }, reqBasicOrRevProxyAuth()) }, reqBasicAuth()) }, context_service.UserAssignmentAPI()) })
-
-
-
@@ -10,9 +10,9 @@ "time"activities_model "code.gitea.io/gitea/models/activities" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/services/convert" ) func statusStringToNotificationStatus(status string) activities_model.NotificationStatus {
-
-
-
@@ -11,7 +11,7 @@ activities_model "code.gitea.io/gitea/models/activities""code.gitea.io/gitea/models/db" issues_model "code.gitea.io/gitea/models/issues" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/services/convert" ) // GetThread get notification by ID
-
-
-
@@ -9,8 +9,8 @@ "time"activities_model "code.gitea.io/gitea/models/activities" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/services/convert" ) // ListNotifications list users's notification threads
-
-
-
@@ -6,12 +6,12 @@import ( "net/http" "code.gitea.io/gitea/models/webhook" webhook_model "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" webhook_service "code.gitea.io/gitea/services/webhook" ) // ListHooks list an organziation's webhooks
-
@@ -39,18 +39,18 @@ // responses:// "200": // "$ref": "#/responses/HookList" opts := &webhook.ListWebhookOptions{ opts := &webhook_model.ListWebhookOptions{ ListOptions: utils.GetListOptions(ctx), OrgID: ctx.Org.Organization.ID, } count, err := webhook.CountWebhooksByOpts(opts) count, err := webhook_model.CountWebhooksByOpts(opts) if err != nil { ctx.InternalServerError(err) return } orgHooks, err := webhook.ListWebhooksByOpts(ctx, opts) orgHooks, err := webhook_model.ListWebhooksByOpts(ctx, opts) if err != nil { ctx.InternalServerError(err) return
-
@@ -58,7 +58,7 @@ }hooks := make([]*api.Hook, len(orgHooks)) for i, hook := range orgHooks { hooks[i], err = convert.ToHook(ctx.Org.Organization.AsUser().HomeLink(), hook) hooks[i], err = webhook_service.ToHook(ctx.Org.Organization.AsUser().HomeLink(), hook) if err != nil { ctx.InternalServerError(err) return
-
@@ -99,7 +99,7 @@ if err != nil {return } apiHook, err := convert.ToHook(org.AsUser().HomeLink(), hook) apiHook, err := webhook_service.ToHook(org.AsUser().HomeLink(), hook) if err != nil { ctx.InternalServerError(err) return
-
@@ -200,8 +200,8 @@ // "$ref": "#/responses/empty"org := ctx.Org.Organization hookID := ctx.ParamsInt64(":id") if err := webhook.DeleteWebhookByOrgID(org.ID, hookID); err != nil { if webhook.IsErrWebhookNotExist(err) { if err := webhook_model.DeleteWebhookByOrgID(org.ID, hookID); err != nil { if webhook_model.IsErrWebhookNotExist(err) { ctx.NotFound() } else { ctx.Error(http.StatusInternalServerError, "DeleteWebhookByOrgID", err)
-
-
-
@@ -11,10 +11,10 @@ "strings"issues_model "code.gitea.io/gitea/models/issues" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // ListLabels list all the labels of an organization
-
-
-
@@ -10,11 +10,11 @@"code.gitea.io/gitea/models" "code.gitea.io/gitea/models/organization" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/routers/api/v1/user" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // listMembers list an organization's members
-
-
-
@@ -12,11 +12,11 @@ "code.gitea.io/gitea/models/organization""code.gitea.io/gitea/models/perm" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/user" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/services/org" )
-
-
-
@@ -15,12 +15,12 @@ access_model "code.gitea.io/gitea/models/perm/access"repo_model "code.gitea.io/gitea/models/repo" unit_model "code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/log" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/user" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" org_service "code.gitea.io/gitea/services/org" )
-
-
-
@@ -8,10 +8,10 @@ "net/http""code.gitea.io/gitea/models/packages" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" packages_service "code.gitea.io/gitea/services/packages" )
-
-
-
@@ -14,11 +14,11 @@ git_model "code.gitea.io/gitea/models/git""code.gitea.io/gitea/models/organization" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/git" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" pull_service "code.gitea.io/gitea/services/pull" repo_service "code.gitea.io/gitea/services/repository" )
-
@@ -364,7 +364,7 @@ // "200":// "$ref": "#/responses/BranchProtectionList" repo := ctx.Repo.Repository bps, err := git_model.GetProtectedBranches(repo.ID) bps, err := git_model.GetProtectedBranches(ctx, repo.ID) if err != nil { ctx.Error(http.StatusInternalServerError, "GetProtectedBranches", err) return
-
@@ -820,7 +820,7 @@ ctx.NotFound()return } if err := git_model.DeleteProtectedBranch(ctx.Repo.Repository.ID, bp.ID); err != nil { if err := git_model.DeleteProtectedBranch(ctx, ctx.Repo.Repository.ID, bp.ID); err != nil { ctx.Error(http.StatusInternalServerError, "DeleteProtectedBranch", err) return }
-
-
-
@@ -14,11 +14,11 @@ access_model "code.gitea.io/gitea/models/perm/access"repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" repo_module "code.gitea.io/gitea/modules/repository" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // ListCollaborators list a repository's collaborators
-
-
-
@@ -12,11 +12,11 @@ "strconv"user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // GetSingleCommit get a commit via sha
-
-
-
@@ -179,7 +179,7 @@ return} // Now check if there is a meta object for this pointer meta, err := git_model.GetLFSMetaObjectByOid(ctx.Repo.Repository.ID, pointer.Oid) meta, err := git_model.GetLFSMetaObjectByOid(ctx, ctx.Repo.Repository.ID, pointer.Oid) // If there isn't one just serve the data directly if err == git_model.ErrLFSObjectNotExist {
-
-
-
@@ -14,10 +14,10 @@ access_model "code.gitea.io/gitea/models/perm/access"repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" repo_service "code.gitea.io/gitea/services/repository" )
-
@@ -141,7 +141,7 @@ Name: name,Description: repo.Description, }) if err != nil { if repo_model.IsErrRepoAlreadyExist(err) { if repo_model.IsErrReachLimitOfRepo(err) || repo_model.IsErrRepoAlreadyExist(err) { ctx.Error(http.StatusConflict, "ForkRepository", err) } else { ctx.Error(http.StatusInternalServerError, "ForkRepository", err)
-
-
-
@@ -7,10 +7,10 @@ import ("net/http" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/git" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/services/convert" ) // ListGitHooks list all Git hooks of a repository
-
-
-
@@ -10,12 +10,13 @@"code.gitea.io/gitea/models/perm" "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" webhook_module "code.gitea.io/gitea/modules/webhook" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" webhook_service "code.gitea.io/gitea/services/webhook" )
-
@@ -68,7 +69,7 @@ }apiHooks := make([]*api.Hook, len(hooks)) for i := range hooks { apiHooks[i], err = convert.ToHook(ctx.Repo.RepoLink, hooks[i]) apiHooks[i], err = webhook_service.ToHook(ctx.Repo.RepoLink, hooks[i]) if err != nil { ctx.InternalServerError(err) return
-
@@ -115,7 +116,7 @@ hook, err := utils.GetRepoHook(ctx, repo.Repository.ID, hookID)if err != nil { return } apiHook, err := convert.ToHook(repo.RepoLink, hook) apiHook, err := webhook_service.ToHook(repo.RepoLink, hook) if err != nil { ctx.InternalServerError(err) return
-
@@ -176,7 +177,7 @@commit := convert.ToPayloadCommit(ctx.Repo.Repository, ctx.Repo.Commit) commitID := ctx.Repo.Commit.ID.String() if err := webhook_service.PrepareWebhook(ctx, hook, webhook.HookEventPush, &api.PushPayload{ if err := webhook_service.PrepareWebhook(ctx, hook, webhook_module.HookEventPush, &api.PushPayload{ Ref: ref, Before: commitID, After: commitID,
-
-
-
@@ -19,7 +19,6 @@ repo_model "code.gitea.io/gitea/models/repo""code.gitea.io/gitea/models/unit" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" issue_indexer "code.gitea.io/gitea/modules/indexer/issues" "code.gitea.io/gitea/modules/notification" "code.gitea.io/gitea/modules/setting"
-
@@ -28,6 +27,7 @@ "code.gitea.io/gitea/modules/timeutil""code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" issue_service "code.gitea.io/gitea/services/issue" )
-
-
-
@@ -9,12 +9,12 @@issues_model "code.gitea.io/gitea/models/issues" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/services/attachment" "code.gitea.io/gitea/services/convert" issue_service "code.gitea.io/gitea/services/issue" )
-
-
-
@@ -14,10 +14,10 @@ access_model "code.gitea.io/gitea/models/perm/access"repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" issue_service "code.gitea.io/gitea/services/issue" )
-
-
-
@@ -9,12 +9,12 @@issues_model "code.gitea.io/gitea/models/issues" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/services/attachment" "code.gitea.io/gitea/services/convert" issue_service "code.gitea.io/gitea/services/issue" )
-
-
-
@@ -9,9 +9,9 @@ "net/http"issues_model "code.gitea.io/gitea/models/issues" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/services/convert" issue_service "code.gitea.io/gitea/services/issue" )
-
-
-
@@ -9,10 +9,10 @@ "net/http"issues_model "code.gitea.io/gitea/models/issues" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // GetIssueCommentReactions list reactions of a comment from an issue
-
-
-
@@ -9,8 +9,8 @@ "net/http"issues_model "code.gitea.io/gitea/models/issues" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // StartIssueStopwatch creates a stopwatch for the given issue.
-
-
-
@@ -10,9 +10,9 @@issues_model "code.gitea.io/gitea/models/issues" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // AddIssueSubscription Subscribe user to issue
-
-
-
@@ -13,10 +13,10 @@ issues_model "code.gitea.io/gitea/models/issues""code.gitea.io/gitea/models/unit" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // ListTrackedTimes list all the tracked times of an issue
-
-
-
@@ -15,12 +15,12 @@ "code.gitea.io/gitea/models/db""code.gitea.io/gitea/models/perm" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" asymkey_service "code.gitea.io/gitea/services/asymkey" "code.gitea.io/gitea/services/convert" ) // appendPrivateInformation appends the owner and key type information to api.PublicKey
-
-
-
@@ -12,10 +12,10 @@ "strings"issues_model "code.gitea.io/gitea/models/issues" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // ListLabels list all the labels of a repository
-
-
-
@@ -17,7 +17,6 @@ "code.gitea.io/gitea/models/perm"repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/graceful" "code.gitea.io/gitea/modules/lfs" "code.gitea.io/gitea/modules/log"
-
@@ -28,6 +27,7 @@ "code.gitea.io/gitea/modules/setting"api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/services/forms" "code.gitea.io/gitea/services/migrations" )
-
-
-
@@ -11,11 +11,11 @@ "time"issues_model "code.gitea.io/gitea/models/issues" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // ListMilestones list milestones for a repository
-
-
-
@@ -14,13 +14,13 @@ "code.gitea.io/gitea/models/db"repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" mirror_module "code.gitea.io/gitea/modules/mirror" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/services/forms" "code.gitea.io/gitea/services/migrations" mirror_service "code.gitea.io/gitea/services/mirror"
-
@@ -345,10 +345,11 @@ return} pushMirror := &repo_model.PushMirror{ RepoID: repo.ID, Repo: repo, RemoteName: fmt.Sprintf("remote_mirror_%s", remoteSuffix), Interval: interval, RepoID: repo.ID, Repo: repo, RemoteName: fmt.Sprintf("remote_mirror_%s", remoteSuffix), Interval: interval, SyncOnCommit: mirrorOption.SyncOnCommit, } if err = repo_model.InsertPushMirror(ctx, pushMirror); err != nil {
-
-
-
@@ -8,9 +8,9 @@ "fmt""net/http" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/git" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/services/convert" ) // GetNote Get a note corresponding to a single commit from a repository
-
-
-
@@ -21,7 +21,6 @@ repo_model "code.gitea.io/gitea/models/repo""code.gitea.io/gitea/models/unit" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/notification"
-
@@ -32,6 +31,7 @@ "code.gitea.io/gitea/modules/web""code.gitea.io/gitea/routers/api/v1/utils" asymkey_service "code.gitea.io/gitea/services/asymkey" "code.gitea.io/gitea/services/automerge" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/services/forms" "code.gitea.io/gitea/services/gitdiff" issue_service "code.gitea.io/gitea/services/issue"
-
@@ -815,7 +815,7 @@ }message := strings.TrimSpace(form.MergeTitleField) if len(message) == 0 { message, err = pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pr, repo_model.MergeStyle(form.Do)) message, _, err = pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pr, repo_model.MergeStyle(form.Do)) if err != nil { ctx.Error(http.StatusInternalServerError, "GetDefaultMergeMessage", err) return
-
-
-
@@ -13,11 +13,11 @@ "code.gitea.io/gitea/models/organization"access_model "code.gitea.io/gitea/models/perm/access" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/git" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" issue_service "code.gitea.io/gitea/services/issue" pull_service "code.gitea.io/gitea/services/pull" )
-
-
-
@@ -11,10 +11,10 @@ "code.gitea.io/gitea/models/perm"repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" release_service "code.gitea.io/gitea/services/release" )
-
-
-
@@ -8,13 +8,13 @@ "net/http"repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/upload" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/services/attachment" "code.gitea.io/gitea/services/convert" ) // GetReleaseAttachment gets a single attachment of the release
-
-
-
@@ -9,7 +9,7 @@"code.gitea.io/gitea/models" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/services/convert" releaseservice "code.gitea.io/gitea/services/release" )
-
-
-
@@ -18,7 +18,6 @@ repo_model "code.gitea.io/gitea/models/repo"unit_model "code.gitea.io/gitea/models/unit" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/log" repo_module "code.gitea.io/gitea/modules/repository"
-
@@ -28,6 +27,7 @@ "code.gitea.io/gitea/modules/util""code.gitea.io/gitea/modules/validation" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" repo_service "code.gitea.io/gitea/services/repository" )
-
-
-
@@ -8,9 +8,9 @@ "net/http"repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // ListStargazers list a repository's stargazers
-
-
-
@@ -9,10 +9,10 @@ "net/http"git_model "code.gitea.io/gitea/models/git" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" files_service "code.gitea.io/gitea/services/repository/files" )
-
@@ -183,11 +183,12 @@ if len(sha) == 0 {ctx.Error(http.StatusBadRequest, "ref/sha not given", nil) return } sha = utils.MustConvertToSHA1(ctx.Context, sha) repo := ctx.Repo.Repository listOptions := utils.GetListOptions(ctx) statuses, maxResults, err := git_model.GetCommitStatuses(repo, sha, &git_model.CommitStatusOptions{ statuses, maxResults, err := git_model.GetCommitStatuses(ctx, repo, sha, &git_model.CommitStatusOptions{ ListOptions: listOptions, SortType: ctx.FormTrim("sort"), State: ctx.FormTrim("state"),
-
-
-
@@ -8,9 +8,9 @@ "net/http"repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // ListSubscribers list a repo's subscribers (i.e. watchers)
-
-
-
@@ -11,10 +11,10 @@"code.gitea.io/gitea/models" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" releaseservice "code.gitea.io/gitea/services/release" )
-
-
-
@@ -10,7 +10,7 @@"code.gitea.io/gitea/models" "code.gitea.io/gitea/models/organization" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/services/convert" org_service "code.gitea.io/gitea/services/org" )
-
-
-
@@ -9,11 +9,11 @@ "strings"repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/log" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // ListTopics returns list of current topics for repo
-
-
-
@@ -13,10 +13,10 @@ "code.gitea.io/gitea/models/perm"repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/log" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/services/convert" repo_service "code.gitea.io/gitea/services/repository" )
-
-
-
@@ -11,13 +11,13 @@ "net/url"repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/notification" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/services/convert" wiki_service "code.gitea.io/gitea/services/wiki" )
-
-
-
@@ -12,10 +12,10 @@ "strconv"auth_model "code.gitea.io/gitea/models/auth" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // ListAccessTokens list all the access tokens
-
-
-
@@ -9,10 +9,10 @@ "net/http"user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/services/convert" ) // ListEmails list all of the authenticated user's email addresses
-
-
-
@@ -9,9 +9,9 @@ "net/http"user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" user_service "code.gitea.io/gitea/services/user" )
-
-
-
@@ -11,10 +11,10 @@asymkey_model "code.gitea.io/gitea/models/asymkey" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) func listGPGKeys(ctx *context.APIContext, uid int64, listOptions db.ListOptions) {
-
-
-
@@ -11,13 +11,13 @@ "code.gitea.io/gitea/models/db""code.gitea.io/gitea/models/perm" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/repo" "code.gitea.io/gitea/routers/api/v1/utils" asymkey_service "code.gitea.io/gitea/services/asymkey" "code.gitea.io/gitea/services/convert" ) // appendPrivateInformation appends the owner and key type information to api.PublicKey
-
-
-
@@ -11,9 +11,9 @@ access_model "code.gitea.io/gitea/models/perm/access"repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // listUserRepos - List the repositories owned by the given user.
-
-
-
@@ -8,9 +8,9 @@ "net/http"user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/services/convert" ) // GetUserSettings returns user settings
-
-
-
@@ -13,9 +13,9 @@ access_model "code.gitea.io/gitea/models/perm/access"repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" repo_service "code.gitea.io/gitea/services/repository" )
-
-
-
@@ -10,8 +10,8 @@activities_model "code.gitea.io/gitea/models/activities" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // Search search users
-
-
-
@@ -12,9 +12,9 @@ access_model "code.gitea.io/gitea/models/perm/access"repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/convert" ) // getWatchedRepos returns the repos that the user with the specified userID is watching
-
-
-
@@ -33,6 +33,8 @@ break} } sha = MustConvertToSHA1(ctx.Context, sha) if ctx.Repo.GitRepo != nil { err := ctx.Repo.GitRepo.AddLastCommitCache(ctx.Repo.Repository.GetCommitsCountCacheKey(ref, ref != sha), ctx.Repo.Repository.FullName(), sha) if err != nil {
-
@@ -65,3 +67,30 @@ return refs[0].Object.String(), "", nil // Return found SHA} return "", "", nil } // ConvertToSHA1 returns a full-length SHA1 from a potential ID string func ConvertToSHA1(ctx *context.Context, commitID string) (git.SHA1, error) { if len(commitID) == git.SHAFullLength && git.IsValidSHAPattern(commitID) { sha1, err := git.NewIDFromString(commitID) if err == nil { return sha1, nil } } gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, ctx.Repo.Repository.RepoPath()) if err != nil { return git.SHA1{}, fmt.Errorf("RepositoryFromContextOrOpen: %w", err) } defer closer.Close() return gitRepo.ConvertToSHA1(commitID) } // MustConvertToSHA1 returns a full-length SHA1 string from a potential ID string, or returns origin input if it can't convert to SHA1 func MustConvertToSHA1(ctx *context.Context, commitID string) string { sha, err := ConvertToSHA1(ctx, commitID) if err != nil { return commitID } return sha.String() }
-
-
-
@@ -10,10 +10,10 @@ "strings""code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/json" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" webhook_module "code.gitea.io/gitea/modules/webhook" webhook_service "code.gitea.io/gitea/services/webhook" )
-
@@ -98,7 +98,7 @@// toAPIHook converts the hook to its API representation. // If there is an error, write to `ctx` accordingly. Return (hook, ok) func toAPIHook(ctx *context.APIContext, repoLink string, hook *webhook.Webhook) (*api.Hook, bool) { apiHook, err := convert.ToHook(repoLink, hook) apiHook, err := webhook_service.ToHook(repoLink, hook) if err != nil { ctx.Error(http.StatusInternalServerError, "ToHook", err) return nil, false
-
@@ -107,11 +107,11 @@ return apiHook, true} func issuesHook(events []string, event string) bool { return util.IsStringInSlice(event, events, true) || util.IsStringInSlice(string(webhook.HookEventIssues), events, true) return util.IsStringInSlice(event, events, true) || util.IsStringInSlice(string(webhook_module.HookEventIssues), events, true) } func pullHook(events []string, event string) bool { return util.IsStringInSlice(event, events, true) || util.IsStringInSlice(string(webhook.HookEventPullRequest), events, true) return util.IsStringInSlice(event, events, true) || util.IsStringInSlice(string(webhook_module.HookEventPullRequest), events, true) } // addHook add the hook specified by `form`, `orgID` and `repoID`. If there is
-
@@ -127,28 +127,28 @@ URL: form.Config["url"],ContentType: webhook.ToHookContentType(form.Config["content_type"]), Secret: form.Config["secret"], HTTPMethod: "POST", HookEvent: &webhook.HookEvent{ HookEvent: &webhook_module.HookEvent{ ChooseEvents: true, HookEvents: webhook.HookEvents{ Create: util.IsStringInSlice(string(webhook.HookEventCreate), form.Events, true), Delete: util.IsStringInSlice(string(webhook.HookEventDelete), form.Events, true), Fork: util.IsStringInSlice(string(webhook.HookEventFork), form.Events, true), HookEvents: webhook_module.HookEvents{ Create: util.IsStringInSlice(string(webhook_module.HookEventCreate), form.Events, true), Delete: util.IsStringInSlice(string(webhook_module.HookEventDelete), form.Events, true), Fork: util.IsStringInSlice(string(webhook_module.HookEventFork), form.Events, true), Issues: issuesHook(form.Events, "issues_only"), IssueAssign: issuesHook(form.Events, string(webhook.HookEventIssueAssign)), IssueLabel: issuesHook(form.Events, string(webhook.HookEventIssueLabel)), IssueMilestone: issuesHook(form.Events, string(webhook.HookEventIssueMilestone)), IssueComment: issuesHook(form.Events, string(webhook.HookEventIssueComment)), Push: util.IsStringInSlice(string(webhook.HookEventPush), form.Events, true), IssueAssign: issuesHook(form.Events, string(webhook_module.HookEventIssueAssign)), IssueLabel: issuesHook(form.Events, string(webhook_module.HookEventIssueLabel)), IssueMilestone: issuesHook(form.Events, string(webhook_module.HookEventIssueMilestone)), IssueComment: issuesHook(form.Events, string(webhook_module.HookEventIssueComment)), Push: util.IsStringInSlice(string(webhook_module.HookEventPush), form.Events, true), PullRequest: pullHook(form.Events, "pull_request_only"), PullRequestAssign: pullHook(form.Events, string(webhook.HookEventPullRequestAssign)), PullRequestLabel: pullHook(form.Events, string(webhook.HookEventPullRequestLabel)), PullRequestMilestone: pullHook(form.Events, string(webhook.HookEventPullRequestMilestone)), PullRequestComment: pullHook(form.Events, string(webhook.HookEventPullRequestComment)), PullRequestAssign: pullHook(form.Events, string(webhook_module.HookEventPullRequestAssign)), PullRequestLabel: pullHook(form.Events, string(webhook_module.HookEventPullRequestLabel)), PullRequestMilestone: pullHook(form.Events, string(webhook_module.HookEventPullRequestMilestone)), PullRequestComment: pullHook(form.Events, string(webhook_module.HookEventPullRequestComment)), PullRequestReview: pullHook(form.Events, "pull_request_review"), PullRequestSync: pullHook(form.Events, string(webhook.HookEventPullRequestSync)), Wiki: util.IsStringInSlice(string(webhook.HookEventWiki), form.Events, true), Repository: util.IsStringInSlice(string(webhook.HookEventRepository), form.Events, true), Release: util.IsStringInSlice(string(webhook.HookEventRelease), form.Events, true), PullRequestSync: pullHook(form.Events, string(webhook_module.HookEventPullRequestSync)), Wiki: util.IsStringInSlice(string(webhook_module.HookEventWiki), form.Events, true), Repository: util.IsStringInSlice(string(webhook_module.HookEventRepository), form.Events, true), Release: util.IsStringInSlice(string(webhook_module.HookEventRelease), form.Events, true), }, BranchFilter: form.BranchFilter, },
-
@@ -160,7 +160,7 @@ if err != nil {ctx.Error(http.StatusInternalServerError, "SetHeaderAuthorization", err) return nil, false } if w.Type == webhook.SLACK { if w.Type == webhook_module.SLACK { channel, ok := form.Config["channel"] if !ok { ctx.Error(http.StatusUnprocessableEntity, "", "Missing config option: channel")
-
@@ -253,7 +253,7 @@ }w.ContentType = webhook.ToHookContentType(ct) } if w.Type == webhook.SLACK { if w.Type == webhook_module.SLACK { if channel, ok := form.Config["channel"]; ok { meta, err := json.Marshal(&webhook_service.SlackMeta{ Channel: channel,
-
@@ -277,14 +277,14 @@ }w.PushOnly = false w.SendEverything = false w.ChooseEvents = true w.Create = util.IsStringInSlice(string(webhook.HookEventCreate), form.Events, true) w.Push = util.IsStringInSlice(string(webhook.HookEventPush), form.Events, true) w.Create = util.IsStringInSlice(string(webhook.HookEventCreate), form.Events, true) w.Delete = util.IsStringInSlice(string(webhook.HookEventDelete), form.Events, true) w.Fork = util.IsStringInSlice(string(webhook.HookEventFork), form.Events, true) w.Repository = util.IsStringInSlice(string(webhook.HookEventRepository), form.Events, true) w.Wiki = util.IsStringInSlice(string(webhook.HookEventWiki), form.Events, true) w.Release = util.IsStringInSlice(string(webhook.HookEventRelease), form.Events, true) w.Create = util.IsStringInSlice(string(webhook_module.HookEventCreate), form.Events, true) w.Push = util.IsStringInSlice(string(webhook_module.HookEventPush), form.Events, true) w.Create = util.IsStringInSlice(string(webhook_module.HookEventCreate), form.Events, true) w.Delete = util.IsStringInSlice(string(webhook_module.HookEventDelete), form.Events, true) w.Fork = util.IsStringInSlice(string(webhook_module.HookEventFork), form.Events, true) w.Repository = util.IsStringInSlice(string(webhook_module.HookEventRepository), form.Events, true) w.Wiki = util.IsStringInSlice(string(webhook_module.HookEventWiki), form.Events, true) w.Release = util.IsStringInSlice(string(webhook_module.HookEventRelease), form.Events, true) w.BranchFilter = form.BranchFilter err := w.SetHeaderAuthorization(form.AuthorizationHeader)
-
@@ -295,19 +295,19 @@ }// Issues w.Issues = issuesHook(form.Events, "issues_only") w.IssueAssign = issuesHook(form.Events, string(webhook.HookEventIssueAssign)) w.IssueLabel = issuesHook(form.Events, string(webhook.HookEventIssueLabel)) w.IssueMilestone = issuesHook(form.Events, string(webhook.HookEventIssueMilestone)) w.IssueComment = issuesHook(form.Events, string(webhook.HookEventIssueComment)) w.IssueAssign = issuesHook(form.Events, string(webhook_module.HookEventIssueAssign)) w.IssueLabel = issuesHook(form.Events, string(webhook_module.HookEventIssueLabel)) w.IssueMilestone = issuesHook(form.Events, string(webhook_module.HookEventIssueMilestone)) w.IssueComment = issuesHook(form.Events, string(webhook_module.HookEventIssueComment)) // Pull requests w.PullRequest = pullHook(form.Events, "pull_request_only") w.PullRequestAssign = pullHook(form.Events, string(webhook.HookEventPullRequestAssign)) w.PullRequestLabel = pullHook(form.Events, string(webhook.HookEventPullRequestLabel)) w.PullRequestMilestone = pullHook(form.Events, string(webhook.HookEventPullRequestMilestone)) w.PullRequestComment = pullHook(form.Events, string(webhook.HookEventPullRequestComment)) w.PullRequestAssign = pullHook(form.Events, string(webhook_module.HookEventPullRequestAssign)) w.PullRequestLabel = pullHook(form.Events, string(webhook_module.HookEventPullRequestLabel)) w.PullRequestMilestone = pullHook(form.Events, string(webhook_module.HookEventPullRequestMilestone)) w.PullRequestComment = pullHook(form.Events, string(webhook_module.HookEventPullRequestComment)) w.PullRequestReview = pullHook(form.Events, "pull_request_review") w.PullRequestSync = pullHook(form.Events, string(webhook.HookEventPullRequestSync)) w.PullRequestSync = pullHook(form.Events, string(webhook_module.HookEventPullRequestSync)) if err := w.UpdateEvent(); err != nil { ctx.Error(http.StatusInternalServerError, "UpdateEvent", err)
-
-
-
@@ -6,7 +6,7 @@import ( "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/services/convert" ) // GetListOptions returns list options using the page and limit parameters
-
-
-
@@ -119,6 +119,7 @@ log.Info("Custom path: %s", setting.CustomPath)log.Info("Log path: %s", setting.LogRootPath) log.Info("Configuration file: %s", setting.CustomConf) log.Info("Run Mode: %s", util.ToTitleCase(setting.RunMode)) log.Info("Gitea v%s%s", setting.AppVer, setting.AppBuiltWith) // Setup i18n translation.InitLocales(ctx)
-
-
-
@@ -148,8 +148,8 @@ form.MailNotify = setting.Service.EnableNotifyMail// Server and other services settings form.OfflineMode = setting.OfflineMode form.DisableGravatar = false // when installing, there is no database connection so that given a default value form.EnableFederatedAvatar = false // when installing, there is no database connection so that given a default value form.DisableGravatar = setting.DisableGravatar // when installing, there is no database connection so that given a default value form.EnableFederatedAvatar = setting.EnableFederatedAvatar // when installing, there is no database connection so that given a default value form.EnableOpenIDSignIn = setting.Service.EnableOpenIDSignIn form.EnableOpenIDSignUp = setting.Service.EnableOpenIDSignUp
-
@@ -442,10 +442,13 @@cfg.Section("server").Key("OFFLINE_MODE").SetValue(fmt.Sprint(form.OfflineMode)) // if you are reinstalling, this maybe not right because of missing version if err := system_model.SetSettingNoVersion(system_model.KeyPictureDisableGravatar, strconv.FormatBool(form.DisableGravatar)); err != nil { ctx.RenderWithErr(ctx.Tr("install.secret_key_failed", err), tplInstall, &form) ctx.RenderWithErr(ctx.Tr("install.save_config_failed", err), tplInstall, &form) return } if err := system_model.SetSettingNoVersion(system_model.KeyPictureEnableFederatedAvatar, strconv.FormatBool(form.EnableFederatedAvatar)); err != nil { ctx.RenderWithErr(ctx.Tr("install.save_config_failed", err), tplInstall, &form) return } cfg.Section("picture").Key("ENABLE_FEDERATED_AVATAR").SetValue(fmt.Sprint(form.EnableFederatedAvatar)) cfg.Section("openid").Key("ENABLE_OPENID_SIGNIN").SetValue(fmt.Sprint(form.EnableOpenIDSignIn)) cfg.Section("openid").Key("ENABLE_OPENID_SIGNUP").SetValue(fmt.Sprint(form.EnableOpenIDSignUp)) cfg.Section("service").Key("DISABLE_REGISTRATION").SetValue(fmt.Sprint(form.DisableRegistration))
-
-
-
@@ -251,7 +251,7 @@ var canPush boolif ctx.opts.DeployKeyID != 0 { canPush = !changedProtectedfiles && protectBranch.CanPush && (!protectBranch.EnableWhitelist || protectBranch.WhitelistDeployKeys) } else { canPush = !changedProtectedfiles && protectBranch.CanUserPush(ctx.opts.UserID) canPush = !changedProtectedfiles && protectBranch.CanUserPush(ctx, ctx.opts.UserID) } // 6. If we're not allowed to push directly
-
-
-
@@ -62,6 +62,7 @@ ctx.Data["PageIsAdmin"] = truectx.Data["PageIsAdminPackages"] = true ctx.Data["Query"] = query ctx.Data["PackageType"] = packageType ctx.Data["AvailableTypes"] = packages_model.TypeList ctx.Data["SortType"] = sort ctx.Data["PackageDescriptors"] = pds ctx.Data["Total"] = total
-
-
-
@@ -9,8 +9,8 @@"code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/services/convert" ) // TopicSearch search for creating topic
-
-
-
@@ -20,11 +20,11 @@ unit_model "code.gitea.io/gitea/models/unit"user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/utils" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/services/forms" org_service "code.gitea.io/gitea/services/org" )
-
-
-
@@ -120,7 +120,7 @@branchID := ctx.FormInt64("branch_id") branchName := ctx.FormString("name") deletedBranch, err := git_model.GetDeletedBranchByID(ctx.Repo.Repository.ID, branchID) deletedBranch, err := git_model.GetDeletedBranchByID(ctx, ctx.Repo.Repository.ID, branchID) if err != nil { log.Error("GetDeletedBranchByID: %v", err) ctx.Flash.Error(ctx.Tr("repo.branch.restore_failed", branchName))
-
@@ -189,7 +189,7 @@ ctx.ServerError("GetBranches", err)return nil, nil, 0 } protectedBranches, err := git_model.GetProtectedBranches(ctx.Repo.Repository.ID) protectedBranches, err := git_model.GetProtectedBranches(ctx, ctx.Repo.Repository.ID) if err != nil { ctx.ServerError("GetProtectedBranches", err) return nil, nil, 0
-
@@ -331,7 +331,7 @@func getDeletedBranches(ctx *context.Context) ([]*Branch, error) { branches := []*Branch{} deletedBranches, err := git_model.GetDeletedBranches(ctx.Repo.Repository.ID) deletedBranches, err := git_model.GetDeletedBranches(ctx, ctx.Repo.Repository.ID) if err != nil { return branches, err }
-
-
-
@@ -75,7 +75,7 @@ if err != nil {ctx.ServerError("CommitsByRange", err) return } ctx.Data["Commits"] = git_model.ConvertFromGitCommit(commits, ctx.Repo.Repository) ctx.Data["Commits"] = git_model.ConvertFromGitCommit(ctx, commits, ctx.Repo.Repository) ctx.Data["Username"] = ctx.Repo.Owner.Name ctx.Data["Reponame"] = ctx.Repo.Repository.Name
-
@@ -194,7 +194,7 @@ ctx.ServerError("SearchCommits", err)return } ctx.Data["CommitCount"] = len(commits) ctx.Data["Commits"] = git_model.ConvertFromGitCommit(commits, ctx.Repo.Repository) ctx.Data["Commits"] = git_model.ConvertFromGitCommit(ctx, commits, ctx.Repo.Repository) ctx.Data["Keyword"] = query if all {
-
@@ -235,7 +235,7 @@ if err != nil {ctx.ServerError("CommitsByFileAndRange", err) return } ctx.Data["Commits"] = git_model.ConvertFromGitCommit(commits, ctx.Repo.Repository) ctx.Data["Commits"] = git_model.ConvertFromGitCommit(ctx, commits, ctx.Repo.Repository) ctx.Data["Username"] = ctx.Repo.Owner.Name ctx.Data["Reponame"] = ctx.Repo.Repository.Name
-
@@ -283,7 +283,7 @@ ctx.ServerError("Repo.GitRepo.GetCommit", err)} return } if len(commitID) != 40 { if len(commitID) != git.SHAFullLength { commitID = commit.ID.String() }
-
-
-
@@ -636,7 +636,7 @@ ctx.ServerError("GetCommit", err)return false } commits := git_model.ConvertFromGitCommit(ci.CompareInfo.Commits, ci.HeadRepo) commits := git_model.ConvertFromGitCommit(ctx, ci.CompareInfo.Commits, ci.HeadRepo) ctx.Data["Commits"] = commits ctx.Data["CommitCount"] = len(commits)
-
-
-
@@ -41,7 +41,7 @@ }()pointer, _ := lfs.ReadPointer(dataRc) if pointer.IsValid() { meta, _ := git_model.GetLFSMetaObjectByOid(ctx.Repo.Repository.ID, pointer.Oid) meta, _ := git_model.GetLFSMetaObjectByOid(ctx, ctx.Repo.Repository.ID, pointer.Oid) if meta == nil { if err = dataRc.Close(); err != nil { log.Error("ServeBlobOrLFS: Close: %v", err)
-
-
-
@@ -31,7 +31,6 @@ user_model "code.gitea.io/gitea/models/user""code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/container" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/git" issue_indexer "code.gitea.io/gitea/modules/indexer/issues" issue_template "code.gitea.io/gitea/modules/issue/template"
-
@@ -47,6 +46,7 @@ "code.gitea.io/gitea/modules/util""code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/utils" asymkey_service "code.gitea.io/gitea/services/asymkey" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/services/forms" issue_service "code.gitea.io/gitea/services/issue" pull_service "code.gitea.io/gitea/services/pull"
-
@@ -1604,7 +1604,7 @@ }if perm.CanWrite(unit.TypeCode) { // Check if branch is not protected if pull.HeadBranch != pull.HeadRepo.DefaultBranch { if protected, err := git_model.IsProtectedBranch(pull.HeadRepo.ID, pull.HeadBranch); err != nil { if protected, err := git_model.IsProtectedBranch(ctx, pull.HeadRepo.ID, pull.HeadBranch); err != nil { log.Error("IsProtectedBranch: %v", err) } else if !protected { canDelete = true
-
@@ -1664,19 +1664,21 @@ }ctx.Data["MergeStyle"] = mergeStyle defaultMergeMessage, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, mergeStyle) defaultMergeMessage, defaultMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, mergeStyle) if err != nil { ctx.ServerError("GetDefaultMergeMessage", err) return } ctx.Data["DefaultMergeMessage"] = defaultMergeMessage ctx.Data["DefaultMergeBody"] = defaultMergeBody defaultSquashMergeMessage, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, repo_model.MergeStyleSquash) defaultSquashMergeMessage, defaultSquashMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, repo_model.MergeStyleSquash) if err != nil { ctx.ServerError("GetDefaultSquashMergeMessage", err) return } ctx.Data["DefaultSquashMergeMessage"] = defaultSquashMergeMessage ctx.Data["DefaultSquashMergeBody"] = defaultSquashMergeBody if err = pull.LoadProtectedBranch(ctx); err != nil { ctx.ServerError("LoadProtectedBranch", err)
-
@@ -1686,7 +1688,7 @@ ctx.Data["ShowMergeInstructions"] = trueif pull.ProtectedBranch != nil { var showMergeInstructions bool if ctx.Doer != nil { showMergeInstructions = pull.ProtectedBranch.CanUserPush(ctx.Doer.ID) showMergeInstructions = pull.ProtectedBranch.CanUserPush(ctx, ctx.Doer.ID) } ctx.Data["IsBlockedByApprovals"] = !issues_model.HasEnoughApprovals(ctx, pull.ProtectedBranch, pull) ctx.Data["IsBlockedByRejection"] = issues_model.MergeBlockedByRejectedReview(ctx, pull.ProtectedBranch, pull)
-
-
-
@@ -48,7 +48,7 @@ page := ctx.FormInt("page")if page <= 1 { page = 1 } total, err := git_model.CountLFSMetaObjects(ctx.Repo.Repository.ID) total, err := git_model.CountLFSMetaObjects(ctx, ctx.Repo.Repository.ID) if err != nil { ctx.ServerError("LFSFiles", err) return
-
@@ -58,7 +58,7 @@pager := context.NewPagination(int(total), setting.UI.ExplorePagingNum, page, 5) ctx.Data["Title"] = ctx.Tr("repo.settings.lfs") ctx.Data["PageIsSettingsLFS"] = true lfsMetaObjects, err := git_model.GetLFSMetaObjects(ctx.Repo.Repository.ID, pager.Paginater.Current(), setting.UI.ExplorePagingNum) lfsMetaObjects, err := git_model.GetLFSMetaObjects(ctx, ctx.Repo.Repository.ID, pager.Paginater.Current(), setting.UI.ExplorePagingNum) if err != nil { ctx.ServerError("LFSFiles", err) return
-
@@ -80,7 +80,7 @@ page := ctx.FormInt("page")if page <= 1 { page = 1 } total, err := git_model.CountLFSLockByRepoID(ctx.Repo.Repository.ID) total, err := git_model.CountLFSLockByRepoID(ctx, ctx.Repo.Repository.ID) if err != nil { ctx.ServerError("LFSLocks", err) return
-
@@ -90,7 +90,7 @@pager := context.NewPagination(int(total), setting.UI.ExplorePagingNum, page, 5) ctx.Data["Title"] = ctx.Tr("repo.settings.lfs_locks") ctx.Data["PageIsSettingsLFS"] = true lfsLocks, err := git_model.GetLFSLockByRepoID(ctx.Repo.Repository.ID, pager.Paginater.Current(), setting.UI.ExplorePagingNum) lfsLocks, err := git_model.GetLFSLockByRepoID(ctx, ctx.Repo.Repository.ID, pager.Paginater.Current(), setting.UI.ExplorePagingNum) if err != nil { ctx.ServerError("LFSLocks", err) return
-
@@ -214,7 +214,7 @@ ctx.Redirect(ctx.Repo.RepoLink + "/settings/lfs/locks")return } _, err := git_model.CreateLFSLock(ctx.Repo.Repository, &git_model.LFSLock{ _, err := git_model.CreateLFSLock(ctx, ctx.Repo.Repository, &git_model.LFSLock{ Path: lockPath, OwnerID: ctx.Doer.ID, })
-
@@ -236,7 +236,7 @@ if !setting.LFS.StartServer {ctx.NotFound("LFSUnlock", nil) return } _, err := git_model.DeleteLFSLockByID(ctx.ParamsInt64("lid"), ctx.Repo.Repository, ctx.Doer, true) _, err := git_model.DeleteLFSLockByID(ctx, ctx.ParamsInt64("lid"), ctx.Repo.Repository, ctx.Doer, true) if err != nil { ctx.ServerError("LFSUnlock", err) return
-
@@ -261,7 +261,7 @@ }ctx.Data["Title"] = oid ctx.Data["PageIsSettingsLFS"] = true meta, err := git_model.GetLFSMetaObjectByOid(ctx.Repo.Repository.ID, oid) meta, err := git_model.GetLFSMetaObjectByOid(ctx, ctx.Repo.Repository.ID, oid) if err != nil { if err == git_model.ErrLFSObjectNotExist { ctx.NotFound("LFSFileGet", nil)
-
@@ -355,7 +355,7 @@ ctx.NotFound("LFSDelete", nil)return } count, err := git_model.RemoveLFSMetaObjectByOid(ctx.Repo.Repository.ID, oid) count, err := git_model.RemoveLFSMetaObjectByOid(ctx, ctx.Repo.Repository.ID, oid) if err != nil { ctx.ServerError("LFSDelete", err) return
-
@@ -454,7 +454,7 @@ Oid: pointerBlob.Oid,Size: pointerBlob.Size, } if _, err := git_model.GetLFSMetaObjectByOid(repo.ID, pointerBlob.Oid); err != nil { if _, err := git_model.GetLFSMetaObjectByOid(ctx, repo.ID, pointerBlob.Oid); err != nil { if err != git_model.ErrLFSObjectNotExist { return err }
-
@@ -472,7 +472,7 @@ if !result.InRepo {// Can we fix? // OK well that's "simple" // - we need to check whether current user has access to a repo that has access to the file result.Associatable, err = git_model.LFSObjectAccessible(ctx.Doer, pointerBlob.Oid) result.Associatable, err = git_model.LFSObjectAccessible(ctx, ctx.Doer, pointerBlob.Oid) if err != nil { return err }
-
@@ -547,7 +547,7 @@ }metas[i].Oid = oid[:idx] // metas[i].RepositoryID = ctx.Repo.Repository.ID } if err := git_model.LFSAutoAssociate(metas, ctx.Doer, ctx.Repo.Repository.ID); err != nil { if err := git_model.LFSAutoAssociate(ctx, metas, ctx.Doer, ctx.Repo.Repository.ID); err != nil { ctx.ServerError("LFSAutoAssociate", err) return }
-
-
-
@@ -61,6 +61,7 @@ ctx.Data["IsPackagesPage"] = truectx.Data["ContextUser"] = ctx.ContextUser ctx.Data["Query"] = query ctx.Data["PackageType"] = packageType ctx.Data["AvailableTypes"] = packages.TypeList ctx.Data["HasPackages"] = hasPackages if ctx.Repo != nil { ctx.Data["CanWritePackages"] = ctx.IsUserRepoWriter([]unit.Type{unit.TypePackages}) || ctx.IsUserSiteAdmin()
-
-
-
@@ -182,6 +182,15 @@ // Fork render repository fork pagefunc Fork(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("new_fork") if ctx.Doer.CanForkRepo() { ctx.Data["CanForkRepo"] = true } else { maxCreationLimit := ctx.Doer.MaxCreationLimit() msg := ctx.TrN(maxCreationLimit, "repo.form.reach_limit_of_creation_1", "repo.form.reach_limit_of_creation_n", maxCreationLimit) ctx.Data["Flash"] = ctx.Flash ctx.Flash.Error(msg) } getForkRepository(ctx) if ctx.Written() { return
-
@@ -254,6 +263,10 @@ })if err != nil { ctx.Data["Err_RepoName"] = true switch { case repo_model.IsErrReachLimitOfRepo(err): maxCreationLimit := ctxUser.MaxCreationLimit() msg := ctx.TrN(maxCreationLimit, "repo.form.reach_limit_of_creation_1", "repo.form.reach_limit_of_creation_n", maxCreationLimit) ctx.RenderWithErr(msg, tplFork, &form) case repo_model.IsErrRepoAlreadyExist(err): ctx.RenderWithErr(ctx.Tr("repo.settings.new_owner_has_same_repo"), tplFork, &form) case db.IsErrNameReserved(err):
-
@@ -646,7 +659,7 @@ctx.Data["Username"] = ctx.Repo.Owner.Name ctx.Data["Reponame"] = ctx.Repo.Repository.Name commits := git_model.ConvertFromGitCommit(prInfo.Commits, ctx.Repo.Repository) commits := git_model.ConvertFromGitCommit(ctx, prInfo.Commits, ctx.Repo.Repository) ctx.Data["Commits"] = commits ctx.Data["CommitCount"] = len(commits)
-
@@ -973,7 +986,7 @@message := strings.TrimSpace(form.MergeTitleField) if len(message) == 0 { var err error message, err = pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pr, repo_model.MergeStyle(form.Do)) message, _, err = pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pr, repo_model.MergeStyle(form.Do)) if err != nil { ctx.ServerError("GetDefaultMergeMessage", err) return
-
-
-
@@ -19,7 +19,6 @@ "code.gitea.io/gitea/models/unit"user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/log" repo_module "code.gitea.io/gitea/modules/repository" "code.gitea.io/gitea/modules/setting"
-
@@ -27,6 +26,7 @@ "code.gitea.io/gitea/modules/storage"api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/services/forms" repo_service "code.gitea.io/gitea/services/repository" archiver_service "code.gitea.io/gitea/services/repository/archiver"
-
-
-
@@ -31,7 +31,7 @@ func ProtectedBranch(ctx *context.Context) {ctx.Data["Title"] = ctx.Tr("repo.settings") ctx.Data["PageIsSettingsBranches"] = true protectedBranches, err := git_model.GetProtectedBranches(ctx.Repo.Repository.ID) protectedBranches, err := git_model.GetProtectedBranches(ctx, ctx.Repo.Repository.ID) if err != nil { ctx.ServerError("GetProtectedBranches", err) return
-
@@ -134,7 +134,7 @@ c.Data["Users"] = usersc.Data["whitelist_users"] = strings.Join(base.Int64sToStrings(protectBranch.WhitelistUserIDs), ",") c.Data["merge_whitelist_users"] = strings.Join(base.Int64sToStrings(protectBranch.MergeWhitelistUserIDs), ",") c.Data["approvals_whitelist_users"] = strings.Join(base.Int64sToStrings(protectBranch.ApprovalsWhitelistUserIDs), ",") contexts, _ := git_model.FindRepoRecentCommitStatusContexts(c.Repo.Repository.ID, 7*24*time.Hour) // Find last week status check contexts contexts, _ := git_model.FindRepoRecentCommitStatusContexts(c, c.Repo.Repository.ID, 7*24*time.Hour) // Find last week status check contexts for _, ctx := range protectBranch.StatusCheckContexts { var found bool for i := range contexts {
-
@@ -281,7 +281,7 @@ ctx.Flash.Success(ctx.Tr("repo.settings.update_protect_branch_success", branch))ctx.Redirect(fmt.Sprintf("%s/settings/branches/%s", ctx.Repo.RepoLink, util.PathEscapeSegments(branch))) } else { if protectBranch != nil { if err := git_model.DeleteProtectedBranch(ctx.Repo.Repository.ID, protectBranch.ID); err != nil { if err := git_model.DeleteProtectedBranch(ctx, ctx.Repo.Repository.ID, protectBranch.ID); err != nil { ctx.ServerError("DeleteProtectedBranch", err) return }
-
-
-
@@ -54,7 +54,7 @@ if strings.TrimSpace(form.AllowlistTeams) != "" {pt.AllowlistTeamIDs, _ = base.StringsToInt64s(strings.Split(form.AllowlistTeams, ",")) } if err := git_model.InsertProtectedTag(pt); err != nil { if err := git_model.InsertProtectedTag(ctx, pt); err != nil { ctx.ServerError("InsertProtectedTag", err) return }
-
@@ -107,7 +107,7 @@ pt.NamePattern = strings.TrimSpace(form.NamePattern)pt.AllowlistUserIDs, _ = base.StringsToInt64s(strings.Split(form.AllowlistUsers, ",")) pt.AllowlistTeamIDs, _ = base.StringsToInt64s(strings.Split(form.AllowlistTeams, ",")) if err := git_model.UpdateProtectedTag(pt); err != nil { if err := git_model.UpdateProtectedTag(ctx, pt); err != nil { ctx.ServerError("UpdateProtectedTag", err) return }
-
@@ -168,7 +168,7 @@ if id == 0 {id = ctx.ParamsInt64(":id") } tag, err := git_model.GetProtectedTagByID(id) tag, err := git_model.GetProtectedTagByID(ctx, id) if err != nil { ctx.ServerError("GetProtectedTagByID", err) return nil
-
-
-
@@ -271,7 +271,7 @@ if !pointer.IsValid() { // fallback to plain filereturn buf, dataRc, &fileInfo{isTextFile, false, blob.Size(), nil, st}, nil } meta, err := git_model.GetLFSMetaObjectByOid(repoID, pointer.Oid) meta, err := git_model.GetLFSMetaObjectByOid(db.DefaultContext, repoID, pointer.Oid) if err != nil && err != git_model.ErrLFSObjectNotExist { // fallback to plain file return buf, dataRc, &fileInfo{isTextFile, false, blob.Size(), nil, st}, nil }
-
@@ -412,7 +412,7 @@ ctx.Data["CanCopyContent"] = true} // Check LFS Lock lfsLock, err := git_model.GetTreePathLock(ctx.Repo.Repository.ID, ctx.Repo.TreePath) lfsLock, err := git_model.GetTreePathLock(ctx, ctx.Repo.Repository.ID, ctx.Repo.TreePath) ctx.Data["LFSLock"] = lfsLock if err != nil { ctx.ServerError("GetTreePathLock", err)
-
-
-
@@ -17,13 +17,14 @@ user_model "code.gitea.io/gitea/models/user""code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" webhook_module "code.gitea.io/gitea/modules/webhook" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/services/forms" webhook_service "code.gitea.io/gitea/services/webhook" )
-
@@ -119,7 +120,7 @@// WebhooksNew render creating webhook page func WebhooksNew(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook") ctx.Data["Webhook"] = webhook.Webhook{HookEvent: &webhook.HookEvent{}} ctx.Data["Webhook"] = webhook.Webhook{HookEvent: &webhook_module.HookEvent{}} orCtx, err := getOrgRepoCtx(ctx) if err != nil {
-
@@ -154,12 +155,12 @@ ctx.HTML(http.StatusOK, orCtx.NewTemplate)} // ParseHookEvent convert web form content to webhook.HookEvent func ParseHookEvent(form forms.WebhookForm) *webhook.HookEvent { return &webhook.HookEvent{ func ParseHookEvent(form forms.WebhookForm) *webhook_module.HookEvent { return &webhook_module.HookEvent{ PushOnly: form.PushOnly(), SendEverything: form.SendEverything(), ChooseEvents: form.ChooseEvents(), HookEvents: webhook.HookEvents{ HookEvents: webhook_module.HookEvents{ Create: form.Create, Delete: form.Delete, Fork: form.Fork,
-
@@ -201,7 +202,7 @@ func createWebhook(ctx *context.Context, params webhookParams) {ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook") ctx.Data["PageIsSettingsHooks"] = true ctx.Data["PageIsSettingsHooksNew"] = true ctx.Data["Webhook"] = webhook.Webhook{HookEvent: &webhook.HookEvent{}} ctx.Data["Webhook"] = webhook.Webhook{HookEvent: &webhook_module.HookEvent{}} ctx.Data["HookType"] = params.Type orCtx, err := getOrgRepoCtx(ctx)
-
@@ -326,7 +327,7 @@ contentType = webhook.ContentTypeForm} return webhookParams{ Type: webhook.GITEA, Type: webhook_module.GITEA, URL: form.PayloadURL, ContentType: contentType, Secret: form.Secret,
-
@@ -354,7 +355,7 @@ contentType = webhook.ContentTypeForm} return webhookParams{ Type: webhook.GOGS, Type: webhook_module.GOGS, URL: form.PayloadURL, ContentType: contentType, Secret: form.Secret,
-
@@ -376,7 +377,7 @@ func discordHookParams(ctx *context.Context) webhookParams {form := web.GetForm(ctx).(*forms.NewDiscordHookForm) return webhookParams{ Type: webhook.DISCORD, Type: webhook_module.DISCORD, URL: form.PayloadURL, ContentType: webhook.ContentTypeJSON, WebhookForm: form.WebhookForm,
-
@@ -401,7 +402,7 @@ func dingtalkHookParams(ctx *context.Context) webhookParams {form := web.GetForm(ctx).(*forms.NewDingtalkHookForm) return webhookParams{ Type: webhook.DINGTALK, Type: webhook_module.DINGTALK, URL: form.PayloadURL, ContentType: webhook.ContentTypeJSON, WebhookForm: form.WebhookForm,
-
@@ -422,7 +423,7 @@ func telegramHookParams(ctx *context.Context) webhookParams {form := web.GetForm(ctx).(*forms.NewTelegramHookForm) return webhookParams{ Type: webhook.TELEGRAM, Type: webhook_module.TELEGRAM, URL: fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage?chat_id=%s", url.PathEscape(form.BotToken), url.QueryEscape(form.ChatID)), ContentType: webhook.ContentTypeJSON, WebhookForm: form.WebhookForm,
-
@@ -447,7 +448,7 @@ func matrixHookParams(ctx *context.Context) webhookParams {form := web.GetForm(ctx).(*forms.NewMatrixHookForm) return webhookParams{ Type: webhook.MATRIX, Type: webhook_module.MATRIX, URL: fmt.Sprintf("%s/_matrix/client/r0/rooms/%s/send/m.room.message", form.HomeserverURL, url.PathEscape(form.RoomID)), ContentType: webhook.ContentTypeJSON, HTTPMethod: http.MethodPut,
-
@@ -474,7 +475,7 @@ func mSTeamsHookParams(ctx *context.Context) webhookParams {form := web.GetForm(ctx).(*forms.NewMSTeamsHookForm) return webhookParams{ Type: webhook.MSTEAMS, Type: webhook_module.MSTEAMS, URL: form.PayloadURL, ContentType: webhook.ContentTypeJSON, WebhookForm: form.WebhookForm,
-
@@ -495,7 +496,7 @@ func slackHookParams(ctx *context.Context) webhookParams {form := web.GetForm(ctx).(*forms.NewSlackHookForm) return webhookParams{ Type: webhook.SLACK, Type: webhook_module.SLACK, URL: form.PayloadURL, ContentType: webhook.ContentTypeJSON, WebhookForm: form.WebhookForm,
-
@@ -522,7 +523,7 @@ func feishuHookParams(ctx *context.Context) webhookParams {form := web.GetForm(ctx).(*forms.NewFeishuHookForm) return webhookParams{ Type: webhook.FEISHU, Type: webhook_module.FEISHU, URL: form.PayloadURL, ContentType: webhook.ContentTypeJSON, WebhookForm: form.WebhookForm,
-
@@ -543,7 +544,7 @@ func wechatworkHookParams(ctx *context.Context) webhookParams {form := web.GetForm(ctx).(*forms.NewWechatWorkHookForm) return webhookParams{ Type: webhook.WECHATWORK, Type: webhook_module.WECHATWORK, URL: form.PayloadURL, ContentType: webhook.ContentTypeJSON, WebhookForm: form.WebhookForm,
-
@@ -564,7 +565,7 @@ func packagistHookParams(ctx *context.Context) webhookParams {form := web.GetForm(ctx).(*forms.NewPackagistHookForm) return webhookParams{ Type: webhook.PACKAGIST, Type: webhook_module.PACKAGIST, URL: fmt.Sprintf("https://packagist.org/api/update-package?username=%s&apiToken=%s", url.QueryEscape(form.Username), url.QueryEscape(form.APIToken)), ContentType: webhook.ContentTypeJSON, WebhookForm: form.WebhookForm,
-
@@ -603,15 +604,15 @@ }ctx.Data["HookType"] = w.Type switch w.Type { case webhook.SLACK: case webhook_module.SLACK: ctx.Data["SlackHook"] = webhook_service.GetSlackHook(w) case webhook.DISCORD: case webhook_module.DISCORD: ctx.Data["DiscordHook"] = webhook_service.GetDiscordHook(w) case webhook.TELEGRAM: case webhook_module.TELEGRAM: ctx.Data["TelegramHook"] = webhook_service.GetTelegramHook(w) case webhook.MATRIX: case webhook_module.MATRIX: ctx.Data["MatrixHook"] = webhook_service.GetMatrixHook(w) case webhook.PACKAGIST: case webhook_module.PACKAGIST: ctx.Data["PackagistHook"] = webhook_service.GetPackagistHook(w) }
-
@@ -688,7 +689,7 @@ Repo: convert.ToRepo(ctx, ctx.Repo.Repository, perm.AccessModeNone),Pusher: apiUser, Sender: apiUser, } if err := webhook_service.PrepareWebhook(ctx, w, webhook.HookEventPush, p); err != nil { if err := webhook_service.PrepareWebhook(ctx, w, webhook_module.HookEventPush, p); err != nil { ctx.Flash.Error("PrepareWebhook: " + err.Error()) ctx.Status(http.StatusInternalServerError) } else {
-
-
-
@@ -368,7 +368,7 @@ }ctx.ServerError("CommitsByFileAndRange", err) return nil, nil } ctx.Data["Commits"] = git_model.ConvertFromGitCommit(commitsHistory, ctx.Repo.Repository) ctx.Data["Commits"] = git_model.ConvertFromGitCommit(ctx, commitsHistory, ctx.Repo.Repository) pager := context.NewPagination(int(commitsCount), setting.Git.CommitsRangeSize, page, 5) pager.SetDefaultParams(ctx)
-
-
-
@@ -26,7 +26,7 @@ }ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled ctx.Data["Title"] = ctx.Tr("code.title") ctx.Data["Title"] = ctx.Tr("explore.code") ctx.Data["ContextUser"] = ctx.ContextUser language := ctx.FormTrim("l")
-
-
-
@@ -89,6 +89,7 @@ ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabledctx.Data["ContextUser"] = ctx.ContextUser ctx.Data["Query"] = query ctx.Data["PackageType"] = packageType ctx.Data["AvailableTypes"] = packages_model.TypeList ctx.Data["HasPackages"] = hasPackages ctx.Data["PackageDescriptors"] = pds ctx.Data["Total"] = total
-
-
-
@@ -9,7 +9,7 @@"code.gitea.io/gitea/models/db" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/services/convert" ) // Search search users
-
-
-
@@ -99,14 +99,18 @@ case asymkey_model.IsErrGPGInvalidTokenSignature(err):loadKeysData(ctx) ctx.Data["Err_Content"] = true ctx.Data["Err_Signature"] = true ctx.Data["KeyID"] = err.(asymkey_model.ErrGPGInvalidTokenSignature).ID keyID := err.(asymkey_model.ErrGPGInvalidTokenSignature).ID ctx.Data["KeyID"] = keyID ctx.Data["PaddedKeyID"] = asymkey_model.PaddedKeyID(keyID) ctx.RenderWithErr(ctx.Tr("settings.gpg_invalid_token_signature"), tplSettingsKeys, &form) case asymkey_model.IsErrGPGNoEmailFound(err): loadKeysData(ctx) ctx.Data["Err_Content"] = true ctx.Data["Err_Signature"] = true ctx.Data["KeyID"] = err.(asymkey_model.ErrGPGNoEmailFound).ID keyID := err.(asymkey_model.ErrGPGNoEmailFound).ID ctx.Data["KeyID"] = keyID ctx.Data["PaddedKeyID"] = asymkey_model.PaddedKeyID(keyID) ctx.RenderWithErr(ctx.Tr("settings.gpg_no_key_email_found"), tplSettingsKeys, &form) default: ctx.ServerError("AddPublicKey", err)
-
@@ -138,7 +142,9 @@ case asymkey_model.IsErrGPGInvalidTokenSignature(err):loadKeysData(ctx) ctx.Data["VerifyingID"] = form.KeyID ctx.Data["Err_Signature"] = true ctx.Data["KeyID"] = err.(asymkey_model.ErrGPGInvalidTokenSignature).ID keyID := err.(asymkey_model.ErrGPGInvalidTokenSignature).ID ctx.Data["KeyID"] = keyID ctx.Data["PaddedKeyID"] = asymkey_model.PaddedKeyID(keyID) ctx.RenderWithErr(ctx.Tr("settings.gpg_invalid_token_signature"), tplSettingsKeys, &form) default: ctx.ServerError("VerifyGPG", err)
-
-
-
@@ -9,7 +9,7 @@"code.gitea.io/gitea/models/db" issues_model "code.gitea.io/gitea/models/issues" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/services/convert" ) // GetStopwatches get all stopwatches
-
-
-
@@ -634,7 +634,7 @@ })http.ServeFile(ctx.Resp, ctx.Req, path.Join(setting.StaticRootPath, "public/img/favicon.png")) }) m.Group("/{username}", func() { m.Get(".png", func(ctx *context.Context) { ctx.Error(http.StatusNotFound) }) m.Get(".png", user.AvatarByUserName) m.Get(".keys", user.ShowSSHKeys) m.Get(".gpg", user.ShowGPGKeys) m.Get(".rss", feedEnabled, feed.ShowUserFeedRSS)
-
-
-
@@ -40,20 +40,20 @@ // Verify extracts and validates Basic data (username and password/token) from the// "Authorization" header of the request and returns the corresponding user object for that // name/token on successful validation. // Returns nil if header is empty or validation fails. func (b *Basic) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) *user_model.User { func (b *Basic) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) (*user_model.User, error) { // Basic authentication should only fire on API, Download or on Git or LFSPaths if !middleware.IsAPIPath(req) && !isContainerPath(req) && !isAttachmentDownload(req) && !isGitRawReleaseOrLFSPath(req) { return nil return nil, nil } baHead := req.Header.Get("Authorization") if len(baHead) == 0 { return nil return nil, nil } auths := strings.SplitN(baHead, " ", 2) if len(auths) != 2 || (strings.ToLower(auths[0]) != "basic") { return nil return nil, nil } uname, passwd, _ := base.BasicAuthDecode(auths[1])
-
@@ -77,11 +77,11 @@u, err := user_model.GetUserByID(req.Context(), uid) if err != nil { log.Error("GetUserByID: %v", err) return nil return nil, err } store.GetData()["IsApiToken"] = true return u return u, nil } token, err := auth_model.GetAccessTokenBySHA(authToken)
-
@@ -90,7 +90,7 @@ log.Trace("Basic Authorization: Valid AccessToken for user[%d]", uid)u, err := user_model.GetUserByID(req.Context(), token.UID) if err != nil { log.Error("GetUserByID: %v", err) return nil return nil, err } token.UpdatedUnix = timeutil.TimeStampNow()
-
@@ -99,13 +99,13 @@ log.Error("UpdateAccessToken: %v", err)} store.GetData()["IsApiToken"] = true return u return u, nil } else if !auth_model.IsErrAccessTokenNotExist(err) && !auth_model.IsErrAccessTokenEmpty(err) { log.Error("GetAccessTokenBySha: %v", err) } if !setting.Service.EnableBasicAuth { return nil return nil, nil } log.Trace("Basic Authorization: Attempting SignIn for %s", uname)
-
@@ -114,7 +114,7 @@ if err != nil {if !user_model.IsErrUserNotExist(err) { log.Error("UserSignIn: %v", err) } return nil return nil, err } if skipper, ok := source.Cfg.(LocalTwoFASkipper); ok && skipper.IsSkipLocalTwoFA() {
-
@@ -123,5 +123,5 @@ }log.Trace("Basic Authorization: Logged in user %-v", u) return u return u, nil }
-
-
-
@@ -9,7 +9,6 @@ "net/http""reflect" "strings" "code.gitea.io/gitea/models/db" user_model "code.gitea.io/gitea/models/user" )
-
@@ -80,23 +79,23 @@ return nil} // Verify extracts and validates func (b *Group) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) *user_model.User { if !db.HasEngine { return nil } func (b *Group) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) (*user_model.User, error) { // Try to sign in with each of the enabled plugins for _, ssoMethod := range b.methods { user := ssoMethod.Verify(req, w, store, sess) user, err := ssoMethod.Verify(req, w, store, sess) if err != nil { return nil, err } if user != nil { if store.GetData()["AuthedMethod"] == nil { if named, ok := ssoMethod.(Named); ok { store.GetData()["AuthedMethod"] = named.Name() } } return user return user, nil } } return nil return nil, nil }
-
-
-
@@ -39,10 +39,10 @@// Verify extracts and validates HTTPsign from the Signature header of the request and returns // the corresponding user object on successful validation. // Returns nil if header is empty or validation fails. func (h *HTTPSign) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) *user_model.User { func (h *HTTPSign) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) (*user_model.User, error) { sigHead := req.Header.Get("Signature") if len(sigHead) == 0 { return nil return nil, nil } var (
-
@@ -53,14 +53,14 @@if len(req.Header.Get("X-Ssh-Certificate")) != 0 { // Handle Signature signed by SSH certificates if len(setting.SSH.TrustedUserCAKeys) == 0 { return nil return nil, nil } publicKey, err = VerifyCert(req) if err != nil { log.Debug("VerifyCert on request from %s: failed: %v", req.RemoteAddr, err) log.Warn("Failed authentication attempt from %s", req.RemoteAddr) return nil return nil, nil } } else { // Handle Signature signed by Public Key
-
@@ -68,21 +68,21 @@ publicKey, err = VerifyPubKey(req)if err != nil { log.Debug("VerifyPubKey on request from %s: failed: %v", req.RemoteAddr, err) log.Warn("Failed authentication attempt from %s", req.RemoteAddr) return nil return nil, nil } } u, err := user_model.GetUserByID(req.Context(), publicKey.OwnerID) if err != nil { log.Error("GetUserByID: %v", err) return nil return nil, err } store.GetData()["IsApiToken"] = true log.Trace("HTTP Sign: Logged in user %-v", u) return u return u, nil } func VerifyPubKey(r *http.Request) (*asymkey_model.PublicKey, error) {
-
-
-
@@ -24,8 +24,9 @@ // Verify tries to verify the authentication data contained in the request.// If verification is successful returns either an existing user object (with id > 0) // or a new user object (with id = 0) populated with the information that was found // in the authentication data (username or email). // Returns nil if verification fails. Verify(http *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) *user_model.User // Second argument returns err if verification fails, otherwise // First return argument returns nil if no matched verification condition Verify(http *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) (*user_model.User, error) } // Initializable represents a structure that requires initialization
-
-
-
@@ -108,18 +108,14 @@ // Verify extracts the user ID from the OAuth token in the query parameters// or the "Authorization" header and returns the corresponding user object for that ID. // If verification is successful returns an existing user object. // Returns nil if verification fails. func (o *OAuth2) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) *user_model.User { if !db.HasEngine { return nil } func (o *OAuth2) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) (*user_model.User, error) { if !middleware.IsAPIPath(req) && !isAttachmentDownload(req) && !isAuthenticatedTokenRequest(req) { return nil return nil, nil } id := o.userIDFromToken(req, store) if id <= 0 { return nil return nil, nil } log.Trace("OAuth2 Authorization: Found token for user[%d]", id)
-
@@ -128,11 +124,11 @@ if err != nil {if !user_model.IsErrUserNotExist(err) { log.Error("GetUserByName: %v", err) } return nil return nil, err } log.Trace("OAuth2 Authorization: Logged in user %-v", user) return user return user, nil } func isAuthenticatedTokenRequest(req *http.Request) bool {
-
-
-
@@ -51,10 +51,10 @@ // the reverse proxy.// If a username is available in the "setting.ReverseProxyAuthUser" header an existing // user object is returned (populated with username or email found in header). // Returns nil if header is empty. func (r *ReverseProxy) getUserFromAuthUser(req *http.Request) *user_model.User { func (r *ReverseProxy) getUserFromAuthUser(req *http.Request) (*user_model.User, error) { username := r.getUserName(req) if len(username) == 0 { return nil return nil, nil } log.Trace("ReverseProxy Authorization: Found username: %s", username)
-
@@ -62,11 +62,11 @@ user, err := user_model.GetUserByName(req.Context(), username)if err != nil { if !user_model.IsErrUserNotExist(err) || !r.isAutoRegisterAllowed() { log.Error("GetUserByName: %v", err) return nil return nil, err } user = r.newUser(req) } return user return user, nil } // getEmail extracts the email from the "setting.ReverseProxyAuthEmail" header
-
@@ -106,12 +106,15 @@ // Verify attempts to load a user object based on headers sent by the reverse proxy.// First it will attempt to load it based on the username (see docs for getUserFromAuthUser), // and failing that it will attempt to load it based on the email (see docs for getUserFromAuthEmail). // Returns nil if the headers are empty or the user is not found. func (r *ReverseProxy) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) *user_model.User { user := r.getUserFromAuthUser(req) func (r *ReverseProxy) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) (*user_model.User, error) { user, err := r.getUserFromAuthUser(req) if err != nil { return nil, err } if user == nil { user = r.getUserFromAuthEmail(req) if user == nil { return nil return nil, nil } }
-
@@ -124,7 +127,7 @@ }store.GetData()["IsReverseProxy"] = true log.Trace("ReverseProxy Authorization: Logged in user %-v", user) return user return user, nil } // isAutoRegisterAllowed checks if EnableReverseProxyAutoRegister setting is true
-
-
-
@@ -29,12 +29,12 @@// Verify checks if there is a user uid stored in the session and returns the user // object for that uid. // Returns nil if there is no user uid stored in the session. func (s *Session) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) *user_model.User { func (s *Session) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) (*user_model.User, error) { user := SessionUser(sess) if user != nil { return user return user, nil } return nil return nil, nil } // SessionUser returns the user object corresponding to the "uid" session variable.
-
-
-
@@ -77,15 +77,15 @@ // Verify uses SSPI (Windows implementation of SPNEGO) to authenticate the request.// If authentication is successful, returns the corresponding user object. // If negotiation should continue or authentication fails, immediately returns a 401 HTTP // response code, as required by the SPNEGO protocol. func (s *SSPI) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) *user_model.User { func (s *SSPI) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) (*user_model.User, error) { if !s.shouldAuthenticate(req) { return nil return nil, nil } cfg, err := s.getConfig() if err != nil { log.Error("could not get SSPI config: %v", err) return nil return nil, err } log.Trace("SSPI Authorization: Attempting to authenticate")
-
@@ -108,7 +108,7 @@ if err != nil {log.Error("%v", err) } return nil return nil, err } if outToken != "" { sspiAuth.AppendAuthenticateHeader(w, outToken)
-
@@ -116,7 +116,7 @@ }username := sanitizeUsername(userInfo.Username, cfg) if len(username) == 0 { return nil return nil, nil } log.Info("Authenticated as %s\n", username)
-
@@ -124,16 +124,16 @@ user, err := user_model.GetUserByName(req.Context(), username)if err != nil { if !user_model.IsErrUserNotExist(err) { log.Error("GetUserByName: %v", err) return nil return nil, err } if !cfg.AutoCreateUsers { log.Error("User '%s' not found", username) return nil return nil, nil } user, err = s.newUser(username, cfg) if err != nil { log.Error("CreateUser: %v", err) return nil return nil, err } }
-
@@ -143,7 +143,7 @@ handleSignIn(w, req, sess, user)} log.Trace("SSPI Authorization: Logged in user %-v", user) return user return user, nil } // getConfig retrieves the SSPI configuration from login sources
-
-
-
@@ -138,7 +138,7 @@ }// DeleteComment deletes the comment func DeleteComment(ctx context.Context, doer *user_model.User, comment *issues_model.Comment) error { err := db.AutoTx(ctx, func(ctx context.Context) error { err := db.WithTx(ctx, func(ctx context.Context) error { return issues_model.DeleteComment(ctx, comment) }) if err != nil {
-
-
-
@@ -11,12 +11,12 @@git_model "code.gitea.io/gitea/models/git" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/json" lfs_module "code.gitea.io/gitea/modules/lfs" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/services/convert" ) func handleLockListOut(ctx *context.Context, repo *repo_model.Repository, lock *git_model.LFSLock, err error) {
-
@@ -106,7 +106,7 @@ return} // If no query params path or id lockList, err := git_model.GetLFSLockByRepoID(repository.ID, cursor, limit) lockList, err := git_model.GetLFSLockByRepoID(ctx, repository.ID, cursor, limit) if err != nil { log.Error("Unable to list locks for repository ID[%d]: Error: %v", repository.ID, err) ctx.JSON(http.StatusInternalServerError, api.LFSLockError{
-
@@ -167,7 +167,7 @@ writeStatus(ctx, http.StatusBadRequest)return } lock, err := git_model.CreateLFSLock(repository, &git_model.LFSLock{ lock, err := git_model.CreateLFSLock(ctx, repository, &git_model.LFSLock{ Path: req.Path, OwnerID: ctx.Doer.ID, })
-
@@ -233,7 +233,7 @@ limit = setting.LFS.LocksPagingNum} else if limit < 0 { limit = 0 } lockList, err := git_model.GetLFSLockByRepoID(repository.ID, cursor, limit) lockList, err := git_model.GetLFSLockByRepoID(ctx, repository.ID, cursor, limit) if err != nil { log.Error("Unable to list locks for repository ID[%d]: Error: %v", repository.ID, err) ctx.JSON(http.StatusInternalServerError, api.LFSLockError{
-
@@ -300,7 +300,7 @@ writeStatus(ctx, http.StatusBadRequest)return } lock, err := git_model.DeleteLFSLockByID(ctx.ParamsInt64("lid"), repository, ctx.Doer, req.Force) lock, err := git_model.DeleteLFSLockByID(ctx, ctx.ParamsInt64("lid"), repository, ctx.Doer, req.Force) if err != nil { if git_model.IsErrLFSUnauthorizedAction(err) { ctx.Resp.Header().Set("WWW-Authenticate", "Basic realm=gitea-lfs")
-
-
-
@@ -197,7 +197,7 @@ writeStatus(ctx, http.StatusInternalServerError)return } meta, err := git_model.GetLFSMetaObjectByOid(repository.ID, p.Oid) meta, err := git_model.GetLFSMetaObjectByOid(ctx, repository.ID, p.Oid) if err != nil && err != git_model.ErrLFSObjectNotExist { log.Error("Unable to get LFS MetaObject [%s] for %s/%s. Error: %v", p.Oid, rc.User, rc.Repo, err) writeStatus(ctx, http.StatusInternalServerError)
-
@@ -223,14 +223,14 @@ }} if exists && meta == nil { accessible, err := git_model.LFSObjectAccessible(ctx.Doer, p.Oid) accessible, err := git_model.LFSObjectAccessible(ctx, ctx.Doer, p.Oid) if err != nil { log.Error("Unable to check if LFS MetaObject [%s] is accessible. Error: %v", p.Oid, err) writeStatus(ctx, http.StatusInternalServerError) return } if accessible { _, err := git_model.NewLFSMetaObject(&git_model.LFSMetaObject{Pointer: p, RepositoryID: repository.ID}) _, err := git_model.NewLFSMetaObject(ctx, &git_model.LFSMetaObject{Pointer: p, RepositoryID: repository.ID}) if err != nil { log.Error("Unable to create LFS MetaObject [%s] for %s/%s. Error: %v", p.Oid, rc.User, rc.Repo, err) writeStatus(ctx, http.StatusInternalServerError)
-
@@ -297,7 +297,7 @@ }uploadOrVerify := func() error { if exists { accessible, err := git_model.LFSObjectAccessible(ctx.Doer, p.Oid) accessible, err := git_model.LFSObjectAccessible(ctx, ctx.Doer, p.Oid) if err != nil { log.Error("Unable to check if LFS MetaObject [%s] is accessible. Error: %v", p.Oid, err) return err
-
@@ -323,7 +323,7 @@ } else if err := contentStore.Put(p, ctx.Req.Body); err != nil {log.Error("Error putting LFS MetaObject [%s] into content store. Error: %v", p.Oid, err) return err } _, err := git_model.NewLFSMetaObject(&git_model.LFSMetaObject{Pointer: p, RepositoryID: repository.ID}) _, err := git_model.NewLFSMetaObject(ctx, &git_model.LFSMetaObject{Pointer: p, RepositoryID: repository.ID}) return err }
-
@@ -335,7 +335,7 @@ writeStatusMessage(ctx, http.StatusUnprocessableEntity, err.Error())} else { writeStatus(ctx, http.StatusInternalServerError) } if _, err = git_model.RemoveLFSMetaObjectByOid(repository.ID, p.Oid); err != nil { if _, err = git_model.RemoveLFSMetaObjectByOid(ctx, repository.ID, p.Oid); err != nil { log.Error("Error whilst removing metaobject for LFS OID[%s]: %v", p.Oid, err) } return
-
@@ -398,7 +398,7 @@ if repository == nil {return nil } meta, err := git_model.GetLFSMetaObjectByOid(repository.ID, p.Oid) meta, err := git_model.GetLFSMetaObjectByOid(ctx, repository.ID, p.Oid) if err != nil { log.Error("Unable to get LFS OID[%s] Error: %v", p.Oid, err) writeStatus(ctx, http.StatusNotFound)
-
-
-
@@ -17,7 +17,6 @@ "time""code.gitea.io/gitea/models" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/foreignreference" issues_model "code.gitea.io/gitea/models/issues" repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user"
-
@@ -403,16 +402,6 @@ MilestoneID: milestoneID,Labels: labels, CreatedUnix: timeutil.TimeStamp(issue.Created.Unix()), UpdatedUnix: timeutil.TimeStamp(issue.Updated.Unix()), ForeignReference: &foreignreference.ForeignReference{ LocalIndex: issue.GetLocalIndex(), ForeignIndex: strconv.FormatInt(issue.GetForeignIndex(), 10), RepoID: g.repo.ID, Type: foreignreference.TypeIssue, }, } if is.ForeignReference.ForeignIndex == "0" { is.ForeignReference.ForeignIndex = strconv.FormatInt(is.Index, 10) } if err := g.remapUser(issue, &is); err != nil {
-
-
-
@@ -10,6 +10,7 @@ "strings""time" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "github.com/golang-jwt/jwt/v4"
-
@@ -41,9 +42,15 @@ return tokenString, nil} func ParseAuthorizationToken(req *http.Request) (int64, error) { parts := strings.SplitN(req.Header.Get("Authorization"), " ", 2) h := req.Header.Get("Authorization") if h == "" { return 0, nil } parts := strings.SplitN(h, " ", 2) if len(parts) != 2 { return 0, fmt.Errorf("no token") log.Error("split token failed: %s", h) return 0, fmt.Errorf("split token failed") } token, err := jwt.ParseWithClaims(parts[1], &packageClaims{}, func(t *jwt.Token) (interface{}, error) {
-
-
-
@@ -199,19 +199,19 @@ if err != nil {return nil, fmt.Errorf("ReadFile(%s): %w", headFile, err) } commitID := string(commitIDBytes) if len(commitID) < 40 { if len(commitID) < git.SHAFullLength { return nil, fmt.Errorf(`ReadFile(%s): invalid commit-ID "%s"`, headFile, commitID) } cmd := commitID[:40] + ".." + pr.BaseBranch cmd := commitID[:git.SHAFullLength] + ".." + pr.BaseBranch // Get the commit from BaseBranch where the pull request got merged mergeCommit, _, err := git.NewCommand(ctx, "rev-list", "--ancestry-path", "--merges", "--reverse").AddDynamicArguments(cmd). RunStdString(&git.RunOpts{Dir: "", Env: []string{"GIT_INDEX_FILE=" + indexTmpPath, "GIT_DIR=" + pr.BaseRepo.RepoPath()}}) if err != nil { return nil, fmt.Errorf("git rev-list --ancestry-path --merges --reverse: %w", err) } else if len(mergeCommit) < 40 { } else if len(mergeCommit) < git.SHAFullLength { // PR was maybe fast-forwarded, so just use last commit of PR mergeCommit = commitID[:40] mergeCommit = commitID[:git.SHAFullLength] } gitRepo, err := git.OpenRepository(ctx, pr.BaseRepo.RepoPath())
-
@@ -220,9 +220,9 @@ return nil, fmt.Errorf("OpenRepository: %w", err)} defer gitRepo.Close() commit, err := gitRepo.GetCommit(mergeCommit[:40]) commit, err := gitRepo.GetCommit(mergeCommit[:git.SHAFullLength]) if err != nil { return nil, fmt.Errorf("GetMergeCommit[%v]: %w", mergeCommit[:40], err) return nil, fmt.Errorf("GetMergeCommit[%v]: %w", mergeCommit[:git.SHAFullLength], err) } return commit, nil
-
-
-
@@ -11,6 +11,7 @@ "io""strconv" "sync" "code.gitea.io/gitea/models/db" git_model "code.gitea.io/gitea/models/git" issues_model "code.gitea.io/gitea/models/issues" "code.gitea.io/gitea/modules/git/pipeline"
-
@@ -115,7 +116,7 @@ continue} // Then we need to check that this pointer is in the db if _, err := git_model.GetLFSMetaObjectByOid(pr.HeadRepo.ID, pointer.Oid); err != nil { if _, err := git_model.GetLFSMetaObjectByOid(db.DefaultContext, pr.HeadRepo.ID, pointer.Oid); err != nil { if err == git_model.ErrLFSObjectNotExist { log.Warn("During merge of: %d in %-v, there is a pointer to LFS Oid: %s which although present in the LFS store is not associated with the head repo %-v", pr.Index, pr.BaseRepo, pointer.Oid, pr.HeadRepo) continue
-
@@ -128,7 +129,7 @@ // and is actually a file in the LFS// Therefore it should be associated with the base repo meta := &git_model.LFSMetaObject{Pointer: pointer} meta.RepositoryID = pr.BaseRepoID if _, err := git_model.NewLFSMetaObject(meta); err != nil { if _, err := git_model.NewLFSMetaObject(db.DefaultContext, meta); err != nil { _ = catFileBatchReader.CloseWithError(err) break }
-
-
-
@@ -39,19 +39,19 @@ issue_service "code.gitea.io/gitea/services/issue") // GetDefaultMergeMessage returns default message used when merging pull request func GetDefaultMergeMessage(ctx context.Context, baseGitRepo *git.Repository, pr *issues_model.PullRequest, mergeStyle repo_model.MergeStyle) (string, error) { func GetDefaultMergeMessage(ctx context.Context, baseGitRepo *git.Repository, pr *issues_model.PullRequest, mergeStyle repo_model.MergeStyle) (message, body string, err error) { if err := pr.LoadHeadRepo(ctx); err != nil { return "", err return "", "", err } if err := pr.LoadBaseRepo(ctx); err != nil { return "", err return "", "", err } if pr.BaseRepo == nil { return "", repo_model.ErrRepoNotExist{ID: pr.BaseRepoID} return "", "", repo_model.ErrRepoNotExist{ID: pr.BaseRepoID} } if err := pr.LoadIssue(ctx); err != nil { return "", err return "", "", err } isExternalTracker := pr.BaseRepo.UnitEnabled(ctx, unit.TypeExternalTracker)
-
@@ -64,12 +64,12 @@ if mergeStyle != "" {templateFilepath := fmt.Sprintf(".gitea/default_merge_message/%s_TEMPLATE.md", strings.ToUpper(string(mergeStyle))) commit, err := baseGitRepo.GetBranchCommit(pr.BaseRepo.DefaultBranch) if err != nil { return "", err return "", "", err } templateContent, err := commit.GetFileContent(templateFilepath, setting.Repository.PullRequest.DefaultMergeMessageSize) if err != nil { if !git.IsErrNotExist(err) { return "", err return "", "", err } } else { vars := map[string]string{
-
@@ -107,27 +107,35 @@ } else {vars["ClosingIssues"] = "" } } return os.Expand(templateContent, func(s string) string { return vars[s] }), nil message, body = expandDefaultMergeMessage(templateContent, vars) return message, body, nil } } // Squash merge has a different from other styles. if mergeStyle == repo_model.MergeStyleSquash { return fmt.Sprintf("%s (%s%d)", pr.Issue.Title, issueReference, pr.Issue.Index), nil return fmt.Sprintf("%s (%s%d)", pr.Issue.Title, issueReference, pr.Issue.Index), "", nil } if pr.BaseRepoID == pr.HeadRepoID { return fmt.Sprintf("Merge pull request '%s' (%s%d) from %s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadBranch, pr.BaseBranch), nil return fmt.Sprintf("Merge pull request '%s' (%s%d) from %s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadBranch, pr.BaseBranch), "", nil } if pr.HeadRepo == nil { return fmt.Sprintf("Merge pull request '%s' (%s%d) from <deleted>:%s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadBranch, pr.BaseBranch), nil return fmt.Sprintf("Merge pull request '%s' (%s%d) from <deleted>:%s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadBranch, pr.BaseBranch), "", nil } return fmt.Sprintf("Merge pull request '%s' (%s%d) from %s:%s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseBranch), nil return fmt.Sprintf("Merge pull request '%s' (%s%d) from %s:%s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseBranch), "", nil } func expandDefaultMergeMessage(template string, vars map[string]string) (message, body string) { message = strings.TrimSpace(template) if splits := strings.SplitN(message, "\n", 2); len(splits) == 2 { message = splits[0] body = strings.TrimSpace(splits[1]) } mapping := func(s string) string { return vars[s] } return os.Expand(message, mapping), os.Expand(body, mapping) } // Merge merges pull request to base repository.
-
@@ -839,7 +847,7 @@ if !prConfig.IsMergeStyleAllowed(repo_model.MergeStyleManuallyMerged) {return models.ErrInvalidMergeStyle{ID: pr.BaseRepo.ID, Style: repo_model.MergeStyleManuallyMerged} } if len(commitID) < 40 { if len(commitID) < git.SHAFullLength { return fmt.Errorf("Wrong commit ID") }
-
-
-
@@ -0,0 +1,67 @@// Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package pull import ( "testing" "github.com/stretchr/testify/assert" ) func Test_expandDefaultMergeMessage(t *testing.T) { type args struct { template string vars map[string]string } tests := []struct { name string args args want string wantBody string }{ { name: "single line", args: args{ template: "Merge ${PullRequestTitle}", vars: map[string]string{ "PullRequestTitle": "PullRequestTitle", "PullRequestDescription": "Pull\nRequest\nDescription\n", }, }, want: "Merge PullRequestTitle", wantBody: "", }, { name: "multiple lines", args: args{ template: "Merge ${PullRequestTitle}\nDescription:\n\n${PullRequestDescription}\n", vars: map[string]string{ "PullRequestTitle": "PullRequestTitle", "PullRequestDescription": "Pull\nRequest\nDescription\n", }, }, want: "Merge PullRequestTitle", wantBody: "Description:\n\nPull\nRequest\nDescription\n", }, { name: "leading newlines", args: args{ template: "\n\n\nMerge ${PullRequestTitle}\n\n\nDescription:\n\n${PullRequestDescription}\n", vars: map[string]string{ "PullRequestTitle": "PullRequestTitle", "PullRequestDescription": "Pull\nRequest\nDescription\n", }, }, want: "Merge PullRequestTitle", wantBody: "Description:\n\nPull\nRequest\nDescription\n", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, got1 := expandDefaultMergeMessage(tt.args.template, tt.args.vars) assert.Equalf(t, tt.want, got, "expandDefaultMergeMessage(%v, %v)", tt.args.template, tt.args.vars) assert.Equalf(t, tt.wantBody, got1, "expandDefaultMergeMessage(%v, %v)", tt.args.template, tt.args.vars) }) } }
-
-
-
@@ -45,13 +45,13 @@ gitRepo, err := git.OpenRepository(git.DefaultContext, pr.BaseRepo.RepoPath())assert.NoError(t, err) defer gitRepo.Close() mergeMessage, err := GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "") mergeMessage, _, err := GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "") assert.NoError(t, err) assert.Equal(t, "Merge pull request 'issue3' (#3) from branch2 into master", mergeMessage) pr.BaseRepoID = 1 pr.HeadRepoID = 2 mergeMessage, err = GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "") mergeMessage, _, err = GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "") assert.NoError(t, err) assert.Equal(t, "Merge pull request 'issue3' (#3) from user2/repo1:branch2 into master", mergeMessage) }
-
@@ -75,7 +75,7 @@ gitRepo, err := git.OpenRepository(git.DefaultContext, pr.BaseRepo.RepoPath())assert.NoError(t, err) defer gitRepo.Close() mergeMessage, err := GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "") mergeMessage, _, err := GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "") assert.NoError(t, err) assert.Equal(t, "Merge pull request 'issue3' (!3) from branch2 into master", mergeMessage)
-
@@ -84,7 +84,7 @@ pr.BaseRepoID = 1pr.HeadRepoID = 2 pr.BaseRepo = nil pr.HeadRepo = nil mergeMessage, err = GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "") mergeMessage, _, err = GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "") assert.NoError(t, err) assert.Equal(t, "Merge pull request 'issue3' (#3) from user2/repo2:branch2 into master", mergeMessage)
-
-
-
@@ -166,7 +166,7 @@ // Fetch head branchvar headBranch string if pr.Flow == issues_model.PullRequestFlowGithub { headBranch = git.BranchPrefix + pr.HeadBranch } else if len(pr.HeadCommitID) == 40 { // for not created pull request } else if len(pr.HeadCommitID) == git.SHAFullLength { // for not created pull request headBranch = pr.HeadCommitID } else { headBranch = pr.GetGitRefName()
-
-
-
@@ -115,7 +115,7 @@ rebaseAllowed = prUnit.PullRequestsConfig().AllowRebaseUpdate} // Update function need push permission if pr.ProtectedBranch != nil && !pr.ProtectedBranch.CanUserPush(user.ID) { if pr.ProtectedBranch != nil && !pr.ProtectedBranch.CanUserPush(ctx, user.ID) { return false, false, nil }
-
-
-
@@ -5,7 +5,6 @@ package repositoryimport ( "context" "crypto/md5" "fmt" "image/png" "io"
-
@@ -27,7 +26,7 @@ if err != nil {return err } newAvatar := fmt.Sprintf("%d-%x", repo.ID, md5.Sum(data)) newAvatar := avatar.HashAvatar(repo.ID, data) if repo.Avatar == newAvatar { // upload the same picture return nil }
-
-
-
@@ -5,14 +5,13 @@ package repositoryimport ( "bytes" "crypto/md5" "fmt" "image" "image/png" "testing" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/modules/avatar" "github.com/stretchr/testify/assert" )
-
@@ -28,7 +27,7 @@ repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10})err := UploadAvatar(repo, buff.Bytes()) assert.NoError(t, err) assert.Equal(t, fmt.Sprintf("%d-%x", 10, md5.Sum(buff.Bytes())), repo.Avatar) assert.Equal(t, avatar.HashAvatar(10, buff.Bytes()), repo.Avatar) } func TestUploadBigAvatar(t *testing.T) {
-
-
-
@@ -119,7 +119,7 @@ if !gitRepo.IsBranchExist(from) {return "from_not_exist", nil } if err := git_model.RenameBranch(repo, from, to, func(isDefault bool) error { if err := git_model.RenameBranch(db.DefaultContext, repo, from, to, func(isDefault bool) error { err2 := gitRepo.RenameBranch(from, to) if err2 != nil { return err2
-
@@ -159,7 +159,7 @@ if branchName == repo.DefaultBranch {return ErrBranchIsDefault } isProtected, err := git_model.IsProtectedBranch(repo.ID, branchName) isProtected, err := git_model.IsProtectedBranch(db.DefaultContext, repo.ID, branchName) if err != nil { return err }
-
@@ -197,7 +197,7 @@ }); err != nil {log.Error("Update: %v", err) } if err := git_model.AddDeletedBranch(repo.ID, branchName, commit.ID.String(), doer.ID); err != nil { if err := git_model.AddDeletedBranch(db.DefaultContext, repo.ID, branchName, commit.ID.String(), doer.ID); err != nil { log.Warn("AddDeletedBranch: %v", err) }
-
-
-
@@ -29,13 +29,16 @@ return fmt.Errorf("OpenRepository[%s]: %w", repoPath, err)} defer closer.Close() if _, err := gitRepo.GetCommit(sha); err != nil { if commit, err := gitRepo.GetCommit(sha); err != nil { gitRepo.Close() return fmt.Errorf("GetCommit[%s]: %w", sha, err) } else if len(sha) != git.SHAFullLength { // use complete commit sha sha = commit.ID.String() } gitRepo.Close() if err := git_model.NewCommitStatus(git_model.NewCommitStatusOptions{ if err := git_model.NewCommitStatus(ctx, git_model.NewCommitStatusOptions{ Repo: repo, Creator: creator, SHA: sha,
-
-
-
@@ -70,7 +70,7 @@ protectedBranch, err := git_model.GetProtectedBranchBy(ctx, repo.ID, opts.OldBranch)if err != nil { return err } if protectedBranch != nil && !protectedBranch.CanUserPush(doer.ID) { if protectedBranch != nil && !protectedBranch.CanUserPush(ctx, doer.ID) { return models.ErrUserCannotCommit{ UserName: doer.LowerName, }
-
-
-
@@ -49,7 +49,7 @@ copy(treeURL, apiURL)copy(treeURL[apiURLLen:], "/git/trees/") // 40 is the size of the sha1 hash in hexadecimal format. copyPos := len(treeURL) - 40 copyPos := len(treeURL) - git.SHAFullLength if perPage <= 0 || perPage > setting.API.DefaultGitTreesPerPage { perPage = setting.API.DefaultGitTreesPerPage
-
-
-
@@ -12,6 +12,7 @@ "strings""time" "code.gitea.io/gitea/models" "code.gitea.io/gitea/models/db" git_model "code.gitea.io/gitea/models/git" repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user"
-
@@ -75,7 +76,7 @@if setting.LFS.StartServer { pointer, _ := lfs.ReadPointerFromBuffer(buf) if pointer.IsValid() { meta, err := git_model.GetLFSMetaObjectByOid(repo.ID, pointer.Oid) meta, err := git_model.GetLFSMetaObjectByOid(db.DefaultContext, repo.ID, pointer.Oid) if err != nil && err != git_model.ErrLFSObjectNotExist { // return default return "UTF-8", false
-
@@ -423,7 +424,7 @@ }if lfsMetaObject != nil { // We have an LFS object - create it lfsMetaObject, err = git_model.NewLFSMetaObject(lfsMetaObject) lfsMetaObject, err = git_model.NewLFSMetaObject(ctx, lfsMetaObject) if err != nil { return nil, err }
-
@@ -434,7 +435,7 @@ return nil, err} if !exist { if err := contentStore.Put(lfsMetaObject.Pointer, strings.NewReader(opts.Content)); err != nil { if _, err2 := git_model.RemoveLFSMetaObjectByOid(repo.ID, lfsMetaObject.Oid); err2 != nil { if _, err2 := git_model.RemoveLFSMetaObjectByOid(ctx, repo.ID, lfsMetaObject.Oid); err2 != nil { return nil, fmt.Errorf("Error whilst removing failed inserted LFS object %s: %v (Prev Error: %w)", lfsMetaObject.Oid, err2, err) } return nil, err
-
@@ -472,7 +473,7 @@ glob := protectedBranch.GetUnprotectedFilePatterns()if len(glob) != 0 { isUnprotectedFile = protectedBranch.IsUnprotectedFile(glob, treePath) } if !protectedBranch.CanUserPush(doer.ID) && !isUnprotectedFile { if !protectedBranch.CanUserPush(ctx, doer.ID) && !isUnprotectedFile { return models.ErrUserCannotCommit{ UserName: doer.LowerName, }
-
-
-
@@ -10,6 +10,7 @@ "os""path" "strings" "code.gitea.io/gitea/models/db" git_model "code.gitea.io/gitea/models/git" repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user"
-
@@ -40,7 +41,7 @@ if info.lfsMetaObject == nil {continue } if !info.lfsMetaObject.Existing { if _, err := git_model.RemoveLFSMetaObjectByOid(t.repo.ID, info.lfsMetaObject.Oid); err != nil { if _, err := git_model.RemoveLFSMetaObjectByOid(db.DefaultContext, t.repo.ID, info.lfsMetaObject.Oid); err != nil { original = fmt.Errorf("%w, %v", original, err) // We wrap the original error - as this is the underlying error that required the fallback } }
-
@@ -64,7 +65,7 @@ infos := make([]uploadInfo, len(uploads))for i, upload := range uploads { // Check file is not lfs locked, will return nil if lock setting not enabled filepath := path.Join(opts.TreePath, upload.Name) lfsLock, err := git_model.GetTreePathLock(repo.ID, filepath) lfsLock, err := git_model.GetTreePathLock(ctx, repo.ID, filepath) if err != nil { return err }
-
@@ -132,7 +133,7 @@ for i := range infos {if infos[i].lfsMetaObject == nil { continue } infos[i].lfsMetaObject, err = git_model.NewLFSMetaObject(infos[i].lfsMetaObject) infos[i].lfsMetaObject, err = git_model.NewLFSMetaObject(ctx, infos[i].lfsMetaObject) if err != nil { // OK Now we need to cleanup return cleanUpAfterFailure(&infos, t, err)
-
-
-
@@ -51,6 +51,13 @@ }// ForkRepository forks a repository func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts ForkRepoOptions) (*repo_model.Repository, error) { // Fork is prohibited, if user has reached maximum limit of repositories if !owner.CanForkRepo() { return nil, repo_model.ErrReachLimitOfRepo{ Limit: owner.MaxRepoCreation, } } forkedRepo, err := repo_model.GetUserFork(ctx, opts.BaseRepo.ID, owner.ID) if err != nil { return nil, err
-
-
-
@@ -10,6 +10,7 @@ repo_model "code.gitea.io/gitea/models/repo""code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" )
-
@@ -29,4 +30,19 @@ })assert.Nil(t, fork) assert.Error(t, err) assert.True(t, IsErrForkAlreadyExist(err)) // user not reached maximum limit of repositories assert.False(t, repo_model.IsErrReachLimitOfRepo(err)) // change AllowForkWithoutMaximumLimit to false for the test setting.Repository.AllowForkWithoutMaximumLimit = false // user has reached maximum limit of repositories user.MaxRepoCreation = 0 fork2, err := ForkRepository(git.DefaultContext, user, user, ForkRepoOptions{ BaseRepo: repo, Name: "test", Description: "test", }) assert.Nil(t, fork2) assert.True(t, repo_model.IsErrReachLimitOfRepo(err)) }
-
-
-
@@ -74,7 +74,7 @@ if !autofix {return nil } // Non-existent pointer file _, err = git_model.RemoveLFSMetaObjectByOidFn(repo.ID, metaObject.Oid, func(count int64) error { _, err = git_model.RemoveLFSMetaObjectByOidFn(ctx, repo.ID, metaObject.Oid, func(count int64) error { if count > 0 { return nil }
-
-
-
@@ -251,7 +251,7 @@ }notification.NotifyPushCommits(db.DefaultContext, pusher, repo, opts, commits) if err = git_model.RemoveDeletedBranchByName(repo.ID, branch); err != nil { if err = git_model.RemoveDeletedBranchByName(ctx, repo.ID, branch); err != nil { log.Error("models.RemoveDeletedBranch %s/%s failed: %v", repo.ID, branch, err) }
-
-
-
@@ -5,7 +5,6 @@ package userimport ( "context" "crypto/md5" "fmt" "image/png" "io"
-
@@ -243,11 +242,7 @@ }defer committer.Close() u.UseCustomAvatar = true // Different users can upload same image as avatar // If we prefix it with u.ID, it will be separated // Otherwise, if any of the users delete his avatar // Other users will lose their avatars too. u.Avatar = fmt.Sprintf("%x", md5.Sum([]byte(fmt.Sprintf("%d-%x", u.ID, md5.Sum(data))))) u.Avatar = avatar.HashAvatar(u.ID, data) if err = user_model.UpdateUserCols(ctx, u, "use_custom_avatar", "avatar"); err != nil { return fmt.Errorf("updateUser: %w", err) }
-
-
-
@@ -26,6 +26,7 @@ "code.gitea.io/gitea/modules/process""code.gitea.io/gitea/modules/proxy" "code.gitea.io/gitea/modules/queue" "code.gitea.io/gitea/modules/setting" webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/gobwas/glob" )
-
@@ -89,7 +90,7 @@ return fmt.Errorf("unable to deliver webhook task[%d] as unable to create HTTP request for webhook url %s: %w", t.ID, w.URL, err)} case http.MethodPut: switch w.Type { case webhook_model.MATRIX: case webhook_module.MATRIX: txnID, err := getMatrixTxnID([]byte(t.PayloadContent)) if err != nil { return err
-
@@ -189,9 +190,9 @@ }// Update webhook last delivery status. if t.IsSucceed { w.LastStatus = webhook_model.HookStatusSucceed w.LastStatus = webhook_module.HookStatusSucceed } else { w.LastStatus = webhook_model.HookStatusFail w.LastStatus = webhook_module.HookStatusFail } if err = webhook_model.UpdateWebhookLastStatus(w); err != nil { log.Error("UpdateWebhookLastStatus: %v", err)
-
-
-
@@ -16,6 +16,7 @@ "code.gitea.io/gitea/models/unittest"webhook_model "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" )
-
@@ -62,14 +63,14 @@ RepoID: 3,URL: s.URL + "/webhook", ContentType: webhook_model.ContentTypeJSON, IsActive: true, Type: webhook_model.GITEA, Type: webhook_module.GITEA, } err := hook.SetHeaderAuthorization("Bearer s3cr3t-t0ken") assert.NoError(t, err) assert.NoError(t, webhook_model.CreateWebhook(db.DefaultContext, hook)) db.GetEngine(db.DefaultContext).NoAutoTime().DB().Logger.ShowSQL(true) hookTask := &webhook_model.HookTask{HookID: hook.ID, EventType: webhook_model.HookEventPush, Payloader: &api.PushPayload{}} hookTask := &webhook_model.HookTask{HookID: hook.ID, EventType: webhook_module.HookEventPush, Payloader: &api.PushPayload{}} hookTask, err = webhook_model.CreateHookTask(db.DefaultContext, hookTask) assert.NoError(t, err)
-
-
-
@@ -8,11 +8,11 @@ "fmt""net/url" "strings" webhook_model "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/json" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" webhook_module "code.gitea.io/gitea/modules/webhook" dingtalk "gitea.com/lunny/dingtalk_webhook" )
-
@@ -129,7 +129,7 @@ return createDingtalkPayload(issueTitle, text+"\r\n\r\n"+attachmentText, "view pull request", p.PullRequest.HTMLURL), nil} // Review implements PayloadConvertor Review method func (d *DingtalkPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { func (d *DingtalkPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { var text, title string switch p.Action { case api.HookIssueReviewed:
-
@@ -190,6 +190,6 @@ }} // GetDingtalkPayload converts a ding talk webhook into a DingtalkPayload func GetDingtalkPayload(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) { func GetDingtalkPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { return convertPayloader(new(DingtalkPayload), p, event) }
-
-
-
@@ -7,8 +7,8 @@ import ("net/url" "testing" webhook_model "code.gitea.io/gitea/models/webhook" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require"
-
@@ -162,7 +162,7 @@ p := pullRequestTestPayload()p.Action = api.HookIssueReviewed d := new(DingtalkPayload) pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) require.NoError(t, err) require.NotNil(t, pl) require.IsType(t, &DingtalkPayload{}, pl)
-
-
-
@@ -17,6 +17,7 @@ "code.gitea.io/gitea/modules/log""code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" webhook_module "code.gitea.io/gitea/modules/webhook" ) type (
-
@@ -190,7 +191,7 @@ return d.createPayload(p.Sender, title, text, p.PullRequest.HTMLURL, color), nil} // Review implements PayloadConvertor Review method func (d *DiscordPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { func (d *DiscordPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { var text, title string var color int switch p.Action {
-
@@ -204,11 +205,11 @@ title = fmt.Sprintf("[%s] Pull request review %s: #%d %s", p.Repository.FullName, action, p.Index, p.PullRequest.Title)text = p.Review.Content switch event { case webhook_model.HookEventPullRequestReviewApproved: case webhook_module.HookEventPullRequestReviewApproved: color = greenColor case webhook_model.HookEventPullRequestReviewRejected: case webhook_module.HookEventPullRequestReviewRejected: color = redColor case webhook_model.HookEventPullRequestComment: case webhook_module.HookEventPullRequestComment: color = greyColor default: color = yellowColor
-
@@ -256,7 +257,7 @@ return d.createPayload(p.Sender, text, p.Release.Note, p.Release.URL, color), nil} // GetDiscordPayload converts a discord webhook into a DiscordPayload func GetDiscordPayload(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) { func GetDiscordPayload(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) { s := new(DiscordPayload) discord := &DiscordMeta{}
-
@@ -269,14 +270,14 @@return convertPayloader(s, p, event) } func parseHookPullRequestEventType(event webhook_model.HookEventType) (string, error) { func parseHookPullRequestEventType(event webhook_module.HookEventType) (string, error) { switch event { case webhook_model.HookEventPullRequestReviewApproved: case webhook_module.HookEventPullRequestReviewApproved: return "approved", nil case webhook_model.HookEventPullRequestReviewRejected: case webhook_module.HookEventPullRequestReviewRejected: return "rejected", nil case webhook_model.HookEventPullRequestComment: case webhook_module.HookEventPullRequestComment: return "comment", nil default:
-
-
-
@@ -6,9 +6,9 @@import ( "testing" webhook_model "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require"
-
@@ -179,7 +179,7 @@ p := pullRequestTestPayload()p.Action = api.HookIssueReviewed d := new(DiscordPayload) pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) require.NoError(t, err) require.NotNil(t, pl) require.IsType(t, &DiscordPayload{}, pl)
-
-
-
@@ -7,10 +7,10 @@ import ("fmt" "strings" webhook_model "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/json" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" ) type (
-
@@ -117,7 +117,7 @@ return newFeishuTextPayload(issueTitle + "\r\n" + text + "\r\n\r\n" + attachmentText), nil} // Review implements PayloadConvertor Review method func (f *FeishuPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { func (f *FeishuPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { action, err := parseHookPullRequestEventType(event) if err != nil { return nil, err
-
@@ -159,6 +159,6 @@ return newFeishuTextPayload(text), nil} // GetFeishuPayload converts a ding talk webhook into a FeishuPayload func GetFeishuPayload(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) { func GetFeishuPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { return convertPayloader(new(FeishuPayload), p, event) }
-
-
-
@@ -6,8 +6,8 @@import ( "testing" webhook_model "code.gitea.io/gitea/models/webhook" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require"
-
@@ -124,7 +124,7 @@ p := pullRequestTestPayload()p.Action = api.HookIssueReviewed d := new(FeishuPayload) pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) require.NoError(t, err) require.NotNil(t, pl) require.IsType(t, &FeishuPayload{}, pl)
-
-
-
@@ -9,9 +9,11 @@ "html""net/url" "strings" webhook_model "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" webhook_module "code.gitea.io/gitea/modules/webhook" ) type linkFormatter = func(string, string) string
-
@@ -223,3 +225,36 @@ }return text, issueTitle, color } // ToHook convert models.Webhook to api.Hook // This function is not part of the convert package to prevent an import cycle func ToHook(repoLink string, w *webhook_model.Webhook) (*api.Hook, error) { config := map[string]string{ "url": w.URL, "content_type": w.ContentType.Name(), } if w.Type == webhook_module.SLACK { s := GetSlackHook(w) config["channel"] = s.Channel config["username"] = s.Username config["icon_url"] = s.IconURL config["color"] = s.Color } authorizationHeader, err := w.HeaderAuthorization() if err != nil { return nil, err } return &api.Hook{ ID: w.ID, Type: w.Type, URL: fmt.Sprintf("%s/settings/hooks/%d", repoLink, w.ID), Active: w.IsActive, Config: config, Events: w.EventsArray(), AuthorizationHeader: authorizationHeader, Updated: w.UpdatedUnix.AsTime(), Created: w.CreatedUnix.AsTime(), }, nil }
-
-
-
@@ -20,6 +20,7 @@ "code.gitea.io/gitea/modules/log""code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" webhook_module "code.gitea.io/gitea/modules/webhook" ) const matrixPayloadSizeLimit = 1024 * 64
-
@@ -173,7 +174,7 @@ return getMatrixPayload(text, nil, m.MsgType), nil} // Review implements PayloadConvertor Review method func (m *MatrixPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { func (m *MatrixPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { senderLink := MatrixLinkFormatter(setting.AppURL+url.PathEscape(p.Sender.UserName), p.Sender.UserName) title := fmt.Sprintf("#%d %s", p.Index, p.PullRequest.Title) titleLink := MatrixLinkFormatter(p.PullRequest.URL, title)
-
@@ -210,7 +211,7 @@ return getMatrixPayload(text, nil, m.MsgType), nil} // GetMatrixPayload converts a Matrix webhook into a MatrixPayload func GetMatrixPayload(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) { func GetMatrixPayload(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) { s := new(MatrixPayload) matrix := &MatrixMeta{}
-
-
-
@@ -6,8 +6,8 @@import ( "testing" webhook_model "code.gitea.io/gitea/models/webhook" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require"
-
@@ -133,7 +133,7 @@ p := pullRequestTestPayload()p.Action = api.HookIssueReviewed d := new(MatrixPayload) pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) require.NoError(t, err) require.NotNil(t, pl) require.IsType(t, &MatrixPayload{}, pl)
-
-
-
@@ -8,11 +8,11 @@ "fmt""net/url" "strings" webhook_model "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/json" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" webhook_module "code.gitea.io/gitea/modules/webhook" ) type (
-
@@ -205,7 +205,7 @@ ), nil} // Review implements PayloadConvertor Review method func (m *MSTeamsPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { func (m *MSTeamsPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { var text, title string var color int switch p.Action {
-
@@ -219,11 +219,11 @@ title = fmt.Sprintf("[%s] Pull request review %s: #%d %s", p.Repository.FullName, action, p.Index, p.PullRequest.Title)text = p.Review.Content switch event { case webhook_model.HookEventPullRequestReviewApproved: case webhook_module.HookEventPullRequestReviewApproved: color = greenColor case webhook_model.HookEventPullRequestReviewRejected: case webhook_module.HookEventPullRequestReviewRejected: color = redColor case webhook_model.HookEventPullRequestComment: case webhook_module.HookEventPullRequestComment: color = greyColor default: color = yellowColor
-
@@ -297,7 +297,7 @@ ), nil} // GetMSTeamsPayload converts a MSTeams webhook into a MSTeamsPayload func GetMSTeamsPayload(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) { func GetMSTeamsPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { return convertPayloader(new(MSTeamsPayload), p, event) }
-
-
-
@@ -6,8 +6,8 @@import ( "testing" webhook_model "code.gitea.io/gitea/models/webhook" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require"
-
@@ -277,7 +277,7 @@ p := pullRequestTestPayload()p.Action = api.HookIssueReviewed d := new(MSTeamsPayload) pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) require.NoError(t, err) require.NotNil(t, pl) require.IsType(t, &MSTeamsPayload{}, pl)
-
-
-
@@ -10,6 +10,7 @@ webhook_model "code.gitea.io/gitea/models/webhook""code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/log" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" ) type (
-
@@ -20,7 +21,7 @@ URL string `json:"url"`} `json:"repository"` } // PackagistMeta contains the meta data for the webhook // PackagistMeta contains the metadata for the webhook PackagistMeta struct { Username string `json:"username"` APIToken string `json:"api_token"`
-
@@ -49,62 +50,62 @@var _ PayloadConvertor = &PackagistPayload{} // Create implements PayloadConvertor Create method func (f *PackagistPayload) Create(p *api.CreatePayload) (api.Payloader, error) { func (f *PackagistPayload) Create(_ *api.CreatePayload) (api.Payloader, error) { return nil, nil } // Delete implements PayloadConvertor Delete method func (f *PackagistPayload) Delete(p *api.DeletePayload) (api.Payloader, error) { func (f *PackagistPayload) Delete(_ *api.DeletePayload) (api.Payloader, error) { return nil, nil } // Fork implements PayloadConvertor Fork method func (f *PackagistPayload) Fork(p *api.ForkPayload) (api.Payloader, error) { func (f *PackagistPayload) Fork(_ *api.ForkPayload) (api.Payloader, error) { return nil, nil } // Push implements PayloadConvertor Push method func (f *PackagistPayload) Push(p *api.PushPayload) (api.Payloader, error) { func (f *PackagistPayload) Push(_ *api.PushPayload) (api.Payloader, error) { return f, nil } // Issue implements PayloadConvertor Issue method func (f *PackagistPayload) Issue(p *api.IssuePayload) (api.Payloader, error) { func (f *PackagistPayload) Issue(_ *api.IssuePayload) (api.Payloader, error) { return nil, nil } // IssueComment implements PayloadConvertor IssueComment method func (f *PackagistPayload) IssueComment(p *api.IssueCommentPayload) (api.Payloader, error) { func (f *PackagistPayload) IssueComment(_ *api.IssueCommentPayload) (api.Payloader, error) { return nil, nil } // PullRequest implements PayloadConvertor PullRequest method func (f *PackagistPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader, error) { func (f *PackagistPayload) PullRequest(_ *api.PullRequestPayload) (api.Payloader, error) { return nil, nil } // Review implements PayloadConvertor Review method func (f *PackagistPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { func (f *PackagistPayload) Review(_ *api.PullRequestPayload, _ webhook_module.HookEventType) (api.Payloader, error) { return nil, nil } // Repository implements PayloadConvertor Repository method func (f *PackagistPayload) Repository(p *api.RepositoryPayload) (api.Payloader, error) { func (f *PackagistPayload) Repository(_ *api.RepositoryPayload) (api.Payloader, error) { return nil, nil } // Wiki implements PayloadConvertor Wiki method func (f *PackagistPayload) Wiki(p *api.WikiPayload) (api.Payloader, error) { func (f *PackagistPayload) Wiki(_ *api.WikiPayload) (api.Payloader, error) { return nil, nil } // Release implements PayloadConvertor Release method func (f *PackagistPayload) Release(p *api.ReleasePayload) (api.Payloader, error) { func (f *PackagistPayload) Release(_ *api.ReleasePayload) (api.Payloader, error) { return nil, nil } // GetPackagistPayload converts a packagist webhook into a PackagistPayload func GetPackagistPayload(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) { func GetPackagistPayload(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) { s := new(PackagistPayload) packagist := &PackagistMeta{}
-
-
-
@@ -6,8 +6,8 @@import ( "testing" webhook_model "code.gitea.io/gitea/models/webhook" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require"
-
@@ -101,7 +101,7 @@ p := pullRequestTestPayload()p.Action = api.HookIssueReviewed d := new(PackagistPayload) pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) require.NoError(t, err) require.Nil(t, pl) })
-
-
-
@@ -4,8 +4,8 @@package webhook import ( webhook_model "code.gitea.io/gitea/models/webhook" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" ) // PayloadConvertor defines the interface to convert system webhook payload to external payload
-
@@ -18,40 +18,40 @@ Issue(*api.IssuePayload) (api.Payloader, error)IssueComment(*api.IssueCommentPayload) (api.Payloader, error) Push(*api.PushPayload) (api.Payloader, error) PullRequest(*api.PullRequestPayload) (api.Payloader, error) Review(*api.PullRequestPayload, webhook_model.HookEventType) (api.Payloader, error) Review(*api.PullRequestPayload, webhook_module.HookEventType) (api.Payloader, error) Repository(*api.RepositoryPayload) (api.Payloader, error) Release(*api.ReleasePayload) (api.Payloader, error) Wiki(*api.WikiPayload) (api.Payloader, error) } func convertPayloader(s PayloadConvertor, p api.Payloader, event webhook_model.HookEventType) (api.Payloader, error) { func convertPayloader(s PayloadConvertor, p api.Payloader, event webhook_module.HookEventType) (api.Payloader, error) { switch event { case webhook_model.HookEventCreate: case webhook_module.HookEventCreate: return s.Create(p.(*api.CreatePayload)) case webhook_model.HookEventDelete: case webhook_module.HookEventDelete: return s.Delete(p.(*api.DeletePayload)) case webhook_model.HookEventFork: case webhook_module.HookEventFork: return s.Fork(p.(*api.ForkPayload)) case webhook_model.HookEventIssues, webhook_model.HookEventIssueAssign, webhook_model.HookEventIssueLabel, webhook_model.HookEventIssueMilestone: case webhook_module.HookEventIssues, webhook_module.HookEventIssueAssign, webhook_module.HookEventIssueLabel, webhook_module.HookEventIssueMilestone: return s.Issue(p.(*api.IssuePayload)) case webhook_model.HookEventIssueComment, webhook_model.HookEventPullRequestComment: case webhook_module.HookEventIssueComment, webhook_module.HookEventPullRequestComment: pl, ok := p.(*api.IssueCommentPayload) if ok { return s.IssueComment(pl) } return s.PullRequest(p.(*api.PullRequestPayload)) case webhook_model.HookEventPush: case webhook_module.HookEventPush: return s.Push(p.(*api.PushPayload)) case webhook_model.HookEventPullRequest, webhook_model.HookEventPullRequestAssign, webhook_model.HookEventPullRequestLabel, webhook_model.HookEventPullRequestMilestone, webhook_model.HookEventPullRequestSync: case webhook_module.HookEventPullRequest, webhook_module.HookEventPullRequestAssign, webhook_module.HookEventPullRequestLabel, webhook_module.HookEventPullRequestMilestone, webhook_module.HookEventPullRequestSync: return s.PullRequest(p.(*api.PullRequestPayload)) case webhook_model.HookEventPullRequestReviewApproved, webhook_model.HookEventPullRequestReviewRejected, webhook_model.HookEventPullRequestReviewComment: case webhook_module.HookEventPullRequestReviewApproved, webhook_module.HookEventPullRequestReviewRejected, webhook_module.HookEventPullRequestReviewComment: return s.Review(p.(*api.PullRequestPayload), event) case webhook_model.HookEventRepository: case webhook_module.HookEventRepository: return s.Repository(p.(*api.RepositoryPayload)) case webhook_model.HookEventRelease: case webhook_module.HookEventRelease: return s.Release(p.(*api.ReleasePayload)) case webhook_model.HookEventWiki: case webhook_module.HookEventWiki: return s.Wiki(p.(*api.WikiPayload)) } return s, nil
-
-
-
@@ -15,6 +15,7 @@ "code.gitea.io/gitea/modules/json""code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" ) // SlackMeta contains the slack metadata
-
@@ -231,7 +232,7 @@ return s.createPayload(text, attachments), nil} // Review implements PayloadConvertor Review method func (s *SlackPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { func (s *SlackPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { senderLink := SlackLinkFormatter(setting.AppURL+p.Sender.UserName, p.Sender.UserName) title := fmt.Sprintf("#%d %s", p.Index, p.PullRequest.Title) titleLink := fmt.Sprintf("%s/pulls/%d", p.Repository.HTMLURL, p.Index)
-
@@ -278,7 +279,7 @@ }} // GetSlackPayload converts a slack webhook into a SlackPayload func GetSlackPayload(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) { func GetSlackPayload(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) { s := new(SlackPayload) slack := &SlackMeta{}
-
-
-
@@ -6,8 +6,8 @@import ( "testing" webhook_model "code.gitea.io/gitea/models/webhook" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require"
-
@@ -124,7 +124,7 @@ p := pullRequestTestPayload()p.Action = api.HookIssueReviewed d := new(SlackPayload) pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) require.NoError(t, err) require.NotNil(t, pl) require.IsType(t, &SlackPayload{}, pl)
-
-
-
@@ -13,6 +13,7 @@ "code.gitea.io/gitea/modules/json""code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/markup" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" ) type (
-
@@ -140,7 +141,7 @@ return createTelegramPayload(text + "\n" + attachmentText), nil} // Review implements PayloadConvertor Review method func (t *TelegramPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { func (t *TelegramPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { var text, attachmentText string switch p.Action { case api.HookIssueReviewed:
-
@@ -185,7 +186,7 @@ return createTelegramPayload(text), nil} // GetTelegramPayload converts a telegram webhook into a TelegramPayload func GetTelegramPayload(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) { func GetTelegramPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { return convertPayloader(new(TelegramPayload), p, event) }
-
-
-
@@ -6,8 +6,8 @@import ( "testing" webhook_model "code.gitea.io/gitea/models/webhook" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require"
-
@@ -124,7 +124,7 @@ p := pullRequestTestPayload()p.Action = api.HookIssueReviewed d := new(TelegramPayload) pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) require.NoError(t, err) require.NotNil(t, pl) require.IsType(t, &TelegramPayload{}, pl)
-
-
-
@@ -18,62 +18,58 @@ "code.gitea.io/gitea/modules/queue""code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/gobwas/glob" ) type webhook struct { name webhook_model.HookType payloadCreator func(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) name webhook_module.HookType payloadCreator func(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) } var webhooks = map[webhook_model.HookType]*webhook{ webhook_model.SLACK: { name: webhook_model.SLACK, var webhooks = map[webhook_module.HookType]*webhook{ webhook_module.SLACK: { name: webhook_module.SLACK, payloadCreator: GetSlackPayload, }, webhook_model.DISCORD: { name: webhook_model.DISCORD, webhook_module.DISCORD: { name: webhook_module.DISCORD, payloadCreator: GetDiscordPayload, }, webhook_model.DINGTALK: { name: webhook_model.DINGTALK, webhook_module.DINGTALK: { name: webhook_module.DINGTALK, payloadCreator: GetDingtalkPayload, }, webhook_model.TELEGRAM: { name: webhook_model.TELEGRAM, webhook_module.TELEGRAM: { name: webhook_module.TELEGRAM, payloadCreator: GetTelegramPayload, }, webhook_model.MSTEAMS: { name: webhook_model.MSTEAMS, webhook_module.MSTEAMS: { name: webhook_module.MSTEAMS, payloadCreator: GetMSTeamsPayload, }, webhook_model.FEISHU: { name: webhook_model.FEISHU, webhook_module.FEISHU: { name: webhook_module.FEISHU, payloadCreator: GetFeishuPayload, }, webhook_model.MATRIX: { name: webhook_model.MATRIX, webhook_module.MATRIX: { name: webhook_module.MATRIX, payloadCreator: GetMatrixPayload, }, webhook_model.WECHATWORK: { name: webhook_model.WECHATWORK, webhook_module.WECHATWORK: { name: webhook_module.WECHATWORK, payloadCreator: GetWechatworkPayload, }, webhook_model.PACKAGIST: { name: webhook_model.PACKAGIST, webhook_module.PACKAGIST: { name: webhook_module.PACKAGIST, payloadCreator: GetPackagistPayload, }, } // RegisterWebhook registers a webhook func RegisterWebhook(name string, webhook *webhook) { webhooks[name] = webhook } // IsValidHookTaskType returns true if a webhook registered func IsValidHookTaskType(name string) bool { if name == webhook_model.GITEA || name == webhook_model.GOGS { if name == webhook_module.GITEA || name == webhook_module.GOGS { return true } _, ok := webhooks[name]
-
@@ -157,7 +153,7 @@ return g.Match(branch)} // PrepareWebhook creates a hook task and enqueues it for processing func PrepareWebhook(ctx context.Context, w *webhook_model.Webhook, event webhook_model.HookEventType, p api.Payloader) error { func PrepareWebhook(ctx context.Context, w *webhook_model.Webhook, event webhook_module.HookEventType, p api.Payloader) error { // Skip sending if webhooks are disabled. if setting.DisableWebhooks { return nil
-
@@ -176,7 +172,7 @@// Avoid sending "0 new commits" to non-integration relevant webhooks (e.g. slack, discord, etc.). // Integration webhooks (e.g. drone) still receive the required data. if pushEvent, ok := p.(*api.PushPayload); ok && w.Type != webhook_model.GITEA && w.Type != webhook_model.GOGS && w.Type != webhook_module.GITEA && w.Type != webhook_module.GOGS && len(pushEvent.Commits) == 0 { return nil }
-
@@ -215,7 +211,7 @@ return enqueueHookTask(task.ID)} // PrepareWebhooks adds new webhooks to task queue for given payload. func PrepareWebhooks(ctx context.Context, source EventSource, event webhook_model.HookEventType, p api.Payloader) error { func PrepareWebhooks(ctx context.Context, source EventSource, event webhook_module.HookEventType, p api.Payloader) error { owner := source.Owner var ws []*webhook_model.Webhook
-
-
-
@@ -11,6 +11,7 @@ repo_model "code.gitea.io/gitea/models/repo""code.gitea.io/gitea/models/unittest" webhook_model "code.gitea.io/gitea/models/webhook" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" )
-
@@ -32,12 +33,12 @@ assert.NoError(t, unittest.PrepareTestDatabase())repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) hookTasks := []*webhook_model.HookTask{ {HookID: 1, EventType: webhook_model.HookEventPush}, {HookID: 1, EventType: webhook_module.HookEventPush}, } for _, hookTask := range hookTasks { unittest.AssertNotExistsBean(t, hookTask) } assert.NoError(t, PrepareWebhooks(db.DefaultContext, EventSource{Repository: repo}, webhook_model.HookEventPush, &api.PushPayload{Commits: []*api.PayloadCommit{{}}})) assert.NoError(t, PrepareWebhooks(db.DefaultContext, EventSource{Repository: repo}, webhook_module.HookEventPush, &api.PushPayload{Commits: []*api.PayloadCommit{{}}})) for _, hookTask := range hookTasks { unittest.AssertExistsAndLoadBean(t, hookTask) }
-
@@ -48,13 +49,13 @@ assert.NoError(t, unittest.PrepareTestDatabase())repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) hookTasks := []*webhook_model.HookTask{ {HookID: 4, EventType: webhook_model.HookEventPush}, {HookID: 4, EventType: webhook_module.HookEventPush}, } for _, hookTask := range hookTasks { unittest.AssertNotExistsBean(t, hookTask) } // this test also ensures that * doesn't handle / in any special way (like shell would) assert.NoError(t, PrepareWebhooks(db.DefaultContext, EventSource{Repository: repo}, webhook_model.HookEventPush, &api.PushPayload{Ref: "refs/heads/feature/7791", Commits: []*api.PayloadCommit{{}}})) assert.NoError(t, PrepareWebhooks(db.DefaultContext, EventSource{Repository: repo}, webhook_module.HookEventPush, &api.PushPayload{Ref: "refs/heads/feature/7791", Commits: []*api.PayloadCommit{{}}})) for _, hookTask := range hookTasks { unittest.AssertExistsAndLoadBean(t, hookTask) }
-
@@ -65,12 +66,12 @@ assert.NoError(t, unittest.PrepareTestDatabase())repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) hookTasks := []*webhook_model.HookTask{ {HookID: 4, EventType: webhook_model.HookEventPush}, {HookID: 4, EventType: webhook_module.HookEventPush}, } for _, hookTask := range hookTasks { unittest.AssertNotExistsBean(t, hookTask) } assert.NoError(t, PrepareWebhooks(db.DefaultContext, EventSource{Repository: repo}, webhook_model.HookEventPush, &api.PushPayload{Ref: "refs/heads/fix_weird_bug"})) assert.NoError(t, PrepareWebhooks(db.DefaultContext, EventSource{Repository: repo}, webhook_module.HookEventPush, &api.PushPayload{Ref: "refs/heads/fix_weird_bug"})) for _, hookTask := range hookTasks { unittest.AssertNotExistsBean(t, hookTask)
-
-
-
@@ -7,10 +7,10 @@ import ("fmt" "strings" webhook_model "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/json" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" ) type (
-
@@ -135,7 +135,7 @@ return newWechatworkMarkdownPayload(pr), nil} // Review implements PayloadConvertor Review method func (f *WechatworkPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { func (f *WechatworkPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { var text, title string switch p.Action { case api.HookIssueReviewed:
-
@@ -180,6 +180,6 @@ return newWechatworkMarkdownPayload(text), nil} // GetWechatworkPayload GetWechatworkPayload converts a ding talk webhook into a WechatworkPayload func GetWechatworkPayload(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) { func GetWechatworkPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { return convertPayloader(new(WechatworkPayload), p, event) }
-
-
-
@@ -13,18 +13,9 @@ <input name="q" value="{{.Query}}" placeholder="{{.locale.Tr "explore.search"}}..." autofocus><select class="ui dropdown" name="type"> <option value="">{{.locale.Tr "packages.filter.type"}}</option> <option value="all">{{.locale.Tr "packages.filter.type.all"}}</option> <option value="composer" {{if eq .PackageType "composer"}}selected="selected"{{end}}>Composer</option> <option value="conan" {{if eq .PackageType "conan"}}selected="selected"{{end}}>Conan</option> <option value="container" {{if eq .PackageType "container"}}selected="selected"{{end}}>Container</option> <option value="generic" {{if eq .PackageType "generic"}}selected="selected"{{end}}>Generic</option> <option value="helm" {{if eq .PackageType "helm"}}selected="selected"{{end}}>Helm</option> <option value="maven" {{if eq .PackageType "maven"}}selected="selected"{{end}}>Maven</option> <option value="npm" {{if eq .PackageType "npm"}}selected="selected"{{end}}>npm</option> <option value="nuget" {{if eq .PackageType "nuget"}}selected="selected"{{end}}>NuGet</option> <option value="pub" {{if eq .PackageType "pub"}}selected="selected"{{end}}>Pub</option> <option value="pypi" {{if eq .PackageType "pypi"}}selected="selected"{{end}}>PyPi</option> <option value="rubygems" {{if eq .PackageType "rubygems"}}selected="selected"{{end}}>RubyGems</option> <option value="vagrant" {{if eq .PackageType "vagrant"}}selected="selected"{{end}}>Vagrant</option> {{range $type := .AvailableTypes}} <option{{if eq $.PackageType $type}} selected="selected"{{end}} value="{{$type}}">{{$type.Name}}</option> {{end}} </select> <button class="ui primary button">{{.locale.Tr "explore.search"}}</button> </div>
-
-
-
@@ -77,6 +77,7 @@ </div><!-- end dropdown avatar menu --></div> {{else if .IsSigned}} <div class="right stackable menu"> {{if EnableTimetracking}} <a class="active-stopwatch-trigger item ui label {{if not .ActiveStopwatch}}hidden{{end}}" href="{{.ActiveStopwatch.IssueLink}}"> <span class="text"> <span class="fitted item">
-
@@ -115,6 +116,7 @@ >{{svg "octicon-trash"}}</button></form> </div> </div> {{end}} <a href="{{AppSubUrl}}/notifications" class="item tooltip not-mobile" data-content="{{.locale.Tr "notifications"}}" aria-label="{{.locale.Tr "notifications"}}"> <span class="text">
-
-
-
@@ -6,18 +6,9 @@ <input name="q" value="{{.Query}}" placeholder="{{.locale.Tr "explore.search"}}..." autofocus><select class="ui dropdown" name="type"> <option value="">{{.locale.Tr "packages.filter.type"}}</option> <option value="all">{{.locale.Tr "packages.filter.type.all"}}</option> <option value="composer" {{if eq .PackageType "composer"}}selected="selected"{{end}}>Composer</option> <option value="conan" {{if eq .PackageType "conan"}}selected="selected"{{end}}>Conan</option> <option value="container" {{if eq .PackageType "container"}}selected="selected"{{end}}>Container</option> <option value="generic" {{if eq .PackageType "generic"}}selected="selected"{{end}}>Generic</option> <option value="helm" {{if eq .PackageType "helm"}}selected="selected"{{end}}>Helm</option> <option value="maven" {{if eq .PackageType "maven"}}selected="selected"{{end}}>Maven</option> <option value="npm" {{if eq .PackageType "npm"}}selected="selected"{{end}}>npm</option> <option value="nuget" {{if eq .PackageType "nuget"}}selected="selected"{{end}}>NuGet</option> <option value="pub" {{if eq .PackageType "pub"}}selected="selected"{{end}}>Pub</option> <option value="pypi" {{if eq .PackageType "pypi"}}selected="selected"{{end}}>PyPi</option> <option value="rubygems" {{if eq .PackageType "rubygems"}}selected="selected"{{end}}>RubyGems</option> <option value="vagrant" {{if eq .PackageType "vagrant"}}selected="selected"{{end}}>Vagrant</option> {{range $type := .AvailableTypes}} <option{{if eq $.PackageType $type}} selected="selected"{{end}} value="{{$type}}">{{$type.Name}}</option> {{end}} </select> <button class="ui primary button">{{.locale.Tr "explore.search"}}</button> </div>
-
-
-
@@ -343,7 +343,8 @@ <script>(() => { const defaultMergeTitle = {{.DefaultMergeMessage}}; const defaultSquashMergeTitle = {{.DefaultSquashMergeMessage}}; const defaultMergeMessage = 'Reviewed-on: ' + {{$.Issue.HTMLURL}} + '\n' + {{$approvers}}; const defaultMergeMessage = {{if .DefaultMergeBody}}{{.DefaultMergeBody}}{{else}}'Reviewed-on: ' + {{$.Issue.HTMLURL}} + '\n' + {{$approvers}}{{end}}; const defaultSquashMergeMessage = {{if .DefaultSquashMergeBody}}{{.DefaultSquashMergeBody}}{{else}}'Reviewed-on: ' + {{$.Issue.HTMLURL}} + '\n' + {{$approvers}}{{end}}; const mergeForm = { 'baseLink': {{.Link}}, 'textCancel': {{$.locale.Tr "cancel"}},
-
@@ -398,7 +399,7 @@ 'name': 'squash','allowed': {{$prUnit.PullRequestsConfig.AllowSquash}}, 'textDoMerge': {{$.locale.Tr "repo.pulls.squash_merge_pull_request"}}, 'mergeTitleFieldText': defaultSquashMergeTitle, 'mergeMessageFieldText': {{.GetCommitMessages}} + defaultMergeMessage, 'mergeMessageFieldText': {{.GetCommitMessages}} + defaultSquashMergeMessage, 'hideAutoMerge': generalHideAutoMerge, }, {
-
-
-
@@ -413,7 +413,7 @@ <p><div class="df sb ac"> <div class="due-date tooltip {{if .Issue.IsOverdue}}text red{{end}}" {{if .Issue.IsOverdue}}data-content="{{.locale.Tr "repo.issues.due_date_overdue"}}"{{end}}> {{svg "octicon-calendar" 16 "mr-3"}} <time data-format="date" datetime="{{.Issue.DeadlineUnix.FormatLong}}">{{.Issue.DeadlineUnix.FormatDate}}</time> <time data-format="date" datetime="{{.Issue.DeadlineUnix.FormatDate}}">{{.Issue.DeadlineUnix.FormatDate}}</time> </div> <div> {{if and .HasIssuesOrPullsWritePermission (not .Repository.IsArchived)}}
-
-
-
@@ -58,7 +58,7 @@ </div><div class="inline field"> <label></label> <button class="ui green button"> <button class="ui green button{{if not .CanForkRepo}} disabled{{end}}"> {{.locale.Tr "repo.fork_repo"}} </button> </div>
-
-
-
@@ -15673,6 +15673,10 @@ },"remote_username": { "type": "string", "x-go-name": "RemoteUsername" }, "sync_on_commit": { "type": "boolean", "x-go-name": "SyncOnCommit" } }, "x-go-package": "code.gitea.io/gitea/modules/structs"
-
@@ -18873,6 +18877,10 @@ },"repo_name": { "type": "string", "x-go-name": "RepoName" }, "sync_on_commit": { "type": "boolean", "x-go-name": "SyncOnCommit" } }, "x-go-package": "code.gitea.io/gitea/modules/structs"
-
-
-
@@ -18,7 +18,7 @@ <div class="ui error message"><p>{{.locale.Tr "settings.gpg_token_required"}}</p> </div> <div class="field"> <label for="token">{{.locale.Tr "setting.gpg_token"}} <label for="token">{{.locale.Tr "settings.gpg_token"}} <input readonly="" value="{{.TokenToSign}}"> <div class="help"> <p>{{.locale.Tr "settings.gpg_token_help"}}</p>
-
-
tests/fuzz/fuzz_test.go (new)
-
@@ -0,0 +1,38 @@// Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package fuzz import ( "bytes" "context" "io" "testing" "code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/markup/markdown" "code.gitea.io/gitea/modules/setting" ) var renderContext = markup.RenderContext{ Ctx: context.Background(), URLPrefix: "https://example.com/go-gitea/gitea", Metas: map[string]string{ "user": "go-gitea", "repo": "gitea", }, } func FuzzMarkdownRenderRaw(f *testing.F) { f.Fuzz(func(t *testing.T, data []byte) { setting.AppURL = "http://localhost:3000/" markdown.RenderRaw(&renderContext, bytes.NewReader(data), io.Discard) }) } func FuzzMarkupPostProcess(f *testing.F) { f.Fuzz(func(t *testing.T, data []byte) { setting.AppURL = "http://localhost:3000/" markup.PostProcess(&renderContext, bytes.NewReader(data), io.Discard) }) }
-
-
-
-
-
@@ -0,0 +1,1 @@# Testing documents in LFS
-
-
-
@@ -0,0 +1,1 @@# Testing READMEs in LFS
-
-
-
@@ -0,0 +1,1 @@ref: refs/heads/master
-
-
-
@@ -0,0 +1,4 @@[core] repositoryformatversion = 0 filemode = true bare = true
-
-
-
-
-
-
@@ -0,0 +1,2 @@xQ B!E๛vณbฦฃADฟืิ7๐ฬ0ตVะ฿แยน'ึRrฒด้Mศ่Y0Y";2มธ8:/Aฆฤ&ฒZ_๛ฝ6ธฝคม๕]แธาg๙๘๒\dk9ฑ%ๆiถhีXGญๅ?O]นgฟภ๏@}97
-
-
-
-
-
-
-
-
-
@@ -0,0 +1,1 @@73cf03db6ece34e12bf91e8853dc58f678f2f82d
-
-
-
@@ -16,8 +16,8 @@ issues_model "code.gitea.io/gitea/models/issues"repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert"
-
-
-
@@ -14,8 +14,8 @@ issues_model "code.gitea.io/gitea/models/issues"repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert"
-
-
-
@@ -13,8 +13,8 @@ "code.gitea.io/gitea/models/db"issues_model "code.gitea.io/gitea/models/issues" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert"
-
-
-
@@ -77,7 +77,7 @@ repo := createLFSTestRepository(t, "batch")content := []byte("dummy1") oid := storeObjectInRepo(t, repo.ID, &content) defer git_model.RemoveLFSMetaObjectByOid(repo.ID, oid) defer git_model.RemoveLFSMetaObjectByOid(db.DefaultContext, repo.ID, oid) session := loginUser(t, "user2")
-
@@ -261,7 +261,7 @@ repo2 := createLFSTestRepository(t, "batch2")content := []byte("dummy0") storeObjectInRepo(t, repo2.ID, &content) meta, err := git_model.GetLFSMetaObjectByOid(repo.ID, p.Oid) meta, err := git_model.GetLFSMetaObjectByOid(db.DefaultContext, repo.ID, p.Oid) assert.Nil(t, meta) assert.Equal(t, git_model.ErrLFSObjectNotExist, err)
-
@@ -276,7 +276,7 @@ assert.Len(t, br.Objects, 1)assert.Nil(t, br.Objects[0].Error) assert.Empty(t, br.Objects[0].Actions) meta, err = git_model.GetLFSMetaObjectByOid(repo.ID, p.Oid) meta, err = git_model.GetLFSMetaObjectByOid(db.DefaultContext, repo.ID, p.Oid) assert.NoError(t, err) assert.NotNil(t, meta)
-
@@ -337,7 +337,7 @@ repo := createLFSTestRepository(t, "upload")content := []byte("dummy3") oid := storeObjectInRepo(t, repo.ID, &content) defer git_model.RemoveLFSMetaObjectByOid(repo.ID, oid) defer git_model.RemoveLFSMetaObjectByOid(db.DefaultContext, repo.ID, oid) session := loginUser(t, "user2")
-
@@ -366,7 +366,7 @@ assert.False(t, exist)err = contentStore.Put(p, bytes.NewReader([]byte("dummy5"))) assert.NoError(t, err) meta, err := git_model.GetLFSMetaObjectByOid(repo.ID, p.Oid) meta, err := git_model.GetLFSMetaObjectByOid(db.DefaultContext, repo.ID, p.Oid) assert.Nil(t, meta) assert.Equal(t, git_model.ErrLFSObjectNotExist, err)
-
@@ -379,7 +379,7 @@ t.Run("ValidAccess", func(t *testing.T) {req := newRequest(t, p, "dummy5") session.MakeRequest(t, req, http.StatusOK) meta, err = git_model.GetLFSMetaObjectByOid(repo.ID, p.Oid) meta, err = git_model.GetLFSMetaObjectByOid(db.DefaultContext, repo.ID, p.Oid) assert.NoError(t, err) assert.NotNil(t, meta) })
-
@@ -427,7 +427,7 @@ exist, err := contentStore.Exists(p)assert.NoError(t, err) assert.True(t, exist) meta, err := git_model.GetLFSMetaObjectByOid(repo.ID, p.Oid) meta, err := git_model.GetLFSMetaObjectByOid(db.DefaultContext, repo.ID, p.Oid) assert.NoError(t, err) assert.NotNil(t, meta) })
-
@@ -442,7 +442,7 @@ repo := createLFSTestRepository(t, "verify")content := []byte("dummy3") oid := storeObjectInRepo(t, repo.ID, &content) defer git_model.RemoveLFSMetaObjectByOid(repo.ID, oid) defer git_model.RemoveLFSMetaObjectByOid(db.DefaultContext, repo.ID, oid) session := loginUser(t, "user2")
-
-
-
@@ -14,8 +14,8 @@ "code.gitea.io/gitea/models/repo""code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert"
-
-
-
@@ -10,8 +10,8 @@ "time""code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/convert" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/services/convert" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert"
-
-
-
@@ -11,6 +11,8 @@ repo_model "code.gitea.io/gitea/models/repo""code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) func TestEmptyRepo(t *testing.T) {
-
@@ -21,7 +23,8 @@ "raw/foo","commit/1ae57b34ccf7e18373", "graph", } emptyRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{}, unittest.Cond("is_empty = ?", true)) emptyRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 5}) assert.True(t, emptyRepo.IsEmpty) owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: emptyRepo.OwnerID}) for _, subpath := range subpaths { req := NewRequestf(t, "GET", "/%s/%s/%s", owner.Name, emptyRepo.Name, subpath)
-
-
-
@@ -28,7 +28,7 @@ func storeObjectInRepo(t *testing.T, repositoryID int64, content *[]byte) string {pointer, err := lfs.GeneratePointer(bytes.NewReader(*content)) assert.NoError(t, err) _, err = git_model.NewLFSMetaObject(&git_model.LFSMetaObject{Pointer: pointer, RepositoryID: repositoryID}) _, err = git_model.NewLFSMetaObject(db.DefaultContext, &git_model.LFSMetaObject{Pointer: pointer, RepositoryID: repositoryID}) assert.NoError(t, err) contentStore := lfs.NewContentStore() exist, err := contentStore.Exists(pointer)
-
@@ -44,7 +44,7 @@ func storeAndGetLfs(t *testing.T, content *[]byte, extraHeader *http.Header, expectedStatus int) *httptest.ResponseRecorder {repo, err := repo_model.GetRepositoryByOwnerAndName(db.DefaultContext, "user2", "repo1") assert.NoError(t, err) oid := storeObjectInRepo(t, repo.ID, content) defer git_model.RemoveLFSMetaObjectByOid(repo.ID, oid) defer git_model.RemoveLFSMetaObjectByOid(db.DefaultContext, repo.ID, oid) session := loginUser(t, "user2")
-
-
-
@@ -0,0 +1,83 @@// Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package integration import ( "net/http" "testing" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) // check that files stored in LFS render properly in the web UI func TestLFSRender(t *testing.T) { defer tests.PrepareTestEnv(t)() session := loginUser(t, "user2") // check that a markup file is flagged with "Stored in Git LFS" and shows its text t.Run("Markup", func(t *testing.T) { defer tests.PrintCurrentTest(t)() req := NewRequest(t, "GET", "/user2/lfs/src/branch/master/CONTRIBUTING.md") resp := session.MakeRequest(t, req, http.StatusOK) doc := NewHTMLParser(t, resp.Body).doc fileInfo := doc.Find("div.file-info-entry").First().Text() assert.Contains(t, fileInfo, "Stored with Git LFS") content := doc.Find("div.file-view").Text() assert.Contains(t, content, "Testing documents in LFS") }) // check that an image is flagged with "Stored in Git LFS" and renders inline t.Run("Image", func(t *testing.T) { defer tests.PrintCurrentTest(t)() req := NewRequest(t, "GET", "/user2/lfs/src/branch/master/jpeg.jpg") resp := session.MakeRequest(t, req, http.StatusOK) doc := NewHTMLParser(t, resp.Body).doc fileInfo := doc.Find("div.file-info-entry").First().Text() assert.Contains(t, fileInfo, "Stored with Git LFS") src, exists := doc.Find(".file-view img").Attr("src") assert.True(t, exists, "The image should be in an <img> tag") assert.Equal(t, "/user2/lfs/media/branch/master/jpeg.jpg", src, "The image should use the /media link because it's in LFS") }) // check that a binary file is flagged with "Stored in Git LFS" and renders a /media/ link instead of a /raw/ link t.Run("Binary", func(t *testing.T) { defer tests.PrintCurrentTest(t)() req := NewRequest(t, "GET", "/user2/lfs/src/branch/master/crypt.bin") resp := session.MakeRequest(t, req, http.StatusOK) doc := NewHTMLParser(t, resp.Body).doc fileInfo := doc.Find("div.file-info-entry").First().Text() assert.Contains(t, fileInfo, "Stored with Git LFS") rawLink, exists := doc.Find("div.file-view > div.view-raw > a").Attr("href") assert.True(t, exists, "Download link should render instead of content because this is a binary file") assert.Equal(t, "/user2/lfs/media/branch/master/crypt.bin", rawLink, "The download link should use the proper /media link because it's in LFS") }) // check that a directory with a README file shows its text t.Run("Readme", func(t *testing.T) { defer tests.PrintCurrentTest(t)() req := NewRequest(t, "GET", "/user2/lfs/src/branch/master/subdir") resp := session.MakeRequest(t, req, http.StatusOK) doc := NewHTMLParser(t, resp.Body).doc content := doc.Find("div.file-view").Text() assert.Contains(t, content, "Testing READMEs in LFS") }) }
-
-
-
@@ -68,6 +68,11 @@ req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/"+path.Base(commitURL)+"/statuses")reqOne := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/"+path.Base(commitURL)+"/status") testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), session.MakeRequest(t, reqOne, http.StatusOK), state) // By short SHA req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/"+path.Base(commitURL)[:10]+"/statuses") reqOne = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/"+path.Base(commitURL)[:10]+"/status") testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), session.MakeRequest(t, reqOne, http.StatusOK), state) // By Ref req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/master/statuses") reqOne = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/master/status")
-
-
-
@@ -32,12 +32,12 @@err := release.CreateNewTag(git.DefaultContext, owner, repo, "master", "v-1", "first tag") assert.NoError(t, err) err = git_model.InsertProtectedTag(&git_model.ProtectedTag{ err = git_model.InsertProtectedTag(db.DefaultContext, &git_model.ProtectedTag{ RepoID: repo.ID, NamePattern: "v-*", }) assert.NoError(t, err) err = git_model.InsertProtectedTag(&git_model.ProtectedTag{ err = git_model.InsertProtectedTag(db.DefaultContext, &git_model.ProtectedTag{ RepoID: repo.ID, NamePattern: "v-1.1", AllowlistUserIDs: []int64{repo.OwnerID},
-
-
-
@@ -167,7 +167,11 @@ if len(skip) > 0 {ourSkip += skip[0] } deferFn := PrintCurrentTest(t, ourSkip) // load database fixtures assert.NoError(t, unittest.LoadFixtures()) // load git repo fixtures assert.NoError(t, util.RemoveAll(setting.RepoRootPath)) assert.NoError(t, unittest.CopyDir(path.Join(filepath.Dir(setting.AppPath), "tests/gitea-repositories-meta"), setting.RepoRootPath)) ownerDirs, err := os.ReadDir(setting.RepoRootPath)
-
@@ -189,6 +193,16 @@ _ = os.MkdirAll(filepath.Join(setting.RepoRootPath, ownerDir.Name(), repoDir.Name(), "refs", "heads"), 0o755)_ = os.MkdirAll(filepath.Join(setting.RepoRootPath, ownerDir.Name(), repoDir.Name(), "refs", "tag"), 0o755) } } // load LFS object fixtures // (LFS storage can be on any of several backends, including remote servers, so we init it with the storage API) lfsFixtures, err := storage.NewStorage("", storage.LocalStorageConfig{Path: path.Join(filepath.Dir(setting.AppPath), "tests/gitea-lfs-meta")}) assert.NoError(t, err) assert.NoError(t, storage.Clean(storage.LFS)) assert.NoError(t, lfsFixtures.IterateObjects(func(path string, _ storage.Object) error { _, err := storage.Copy(storage.LFS, path, lfsFixtures, path) return err })) return deferFn }
-
@@ -198,7 +212,11 @@ // Most tests should call defer tests.PrepareTestEnv(t)() (or have onGiteaRun do that for them) but sometimes// within a single test this is required func ResetFixtures(t *testing.T) { assert.NoError(t, queue.GetManager().FlushAll(context.Background(), -1)) // load database fixtures assert.NoError(t, unittest.LoadFixtures()) // load git repo fixtures assert.NoError(t, util.RemoveAll(setting.RepoRootPath)) assert.NoError(t, unittest.CopyDir(path.Join(filepath.Dir(setting.AppPath), "tests/gitea-repositories-meta"), setting.RepoRootPath)) ownerDirs, err := os.ReadDir(setting.RepoRootPath)
-
@@ -220,4 +238,14 @@ _ = os.MkdirAll(filepath.Join(setting.RepoRootPath, ownerDir.Name(), repoDir.Name(), "refs", "heads"), 0o755)_ = os.MkdirAll(filepath.Join(setting.RepoRootPath, ownerDir.Name(), repoDir.Name(), "refs", "tag"), 0o755) } } // load LFS object fixtures // (LFS storage can be on any of several backends, including remote servers, so we init it with the storage API) lfsFixtures, err := storage.NewStorage("", storage.LocalStorageConfig{Path: path.Join(filepath.Dir(setting.AppPath), "tests/gitea-lfs-meta")}) assert.NoError(t, err) assert.NoError(t, storage.Clean(storage.LFS)) assert.NoError(t, lfsFixtures.IterateObjects(func(path string, _ storage.Object) error { _, err := storage.Copy(storage.LFS, path, lfsFixtures, path) return err })) }
-
-
tools/fuzz.go (deleted)
-
@@ -1,50 +0,0 @@// Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT //go:build gofuzz package fuzz import ( "bytes" "context" "io" "code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/markup/markdown" "code.gitea.io/gitea/modules/setting" ) // Contains fuzzing functions executed by // fuzzing engine https://github.com/dvyukov/go-fuzz // // The function must return 1 if the fuzzer should increase priority of the given input during subsequent fuzzing // (for example, the input is lexically correct and was parsed successfully). // -1 if the input must not be added to corpus even if gives new coverage and 0 otherwise. var renderContext = markup.RenderContext{ Ctx: context.Background(), URLPrefix: "https://example.com/go-gitea/gitea", Metas: map[string]string{ "user": "go-gitea", "repo": "gitea", }, } func FuzzMarkdownRenderRaw(data []byte) int { setting.AppURL = "http://localhost:3000/" err := markdown.RenderRaw(&renderContext, bytes.NewReader(data), io.Discard) if err != nil { return 0 } return 1 } func FuzzMarkupPostProcess(data []byte) int { setting.AppURL = "http://localhost:3000/" err := markup.PostProcess(&renderContext, bytes.NewReader(data), io.Discard) if err != nil { return 0 } return 1 }
-
-
-
@@ -18,7 +18,6 @@ <script>import {CalendarHeatmap} from 'vue3-calendar-heatmap'; export default { name: 'ActivityHeatmap', components: {CalendarHeatmap}, props: { values: {
-
-
-
@@ -46,19 +46,13 @@ };const luminanceThreshold = 0.179; export default { name: 'ContextPopup', components: { SvgIcon, }, components: {SvgIcon}, data: () => ({ loading: false, issue: null, i18nErrorOccurred: i18n.error_occurred, i18nErrorMessage: null, }), computed: { createdAt() { return new Date(this.issue.created_at).toLocaleDateString(undefined, {year: 'numeric', month: 'short', day: 'numeric'});
-
@@ -107,7 +101,6 @@ return {name: label.name, color: `#${label.color}`, textColor};}); } }, mounted() { this.$refs.root.addEventListener('us-load-context-popup', (e) => { const data = e.detail;
-
@@ -116,7 +109,6 @@ this.load(data);} }); }, methods: { load(data) { this.loading = true;
-
-
-
@@ -27,12 +27,9 @@const {pageData} = window.config; export default { name: 'DiffFileList', data: () => { return pageData.diffFileInfo; }, watch: { fileListIsVisible(newValue) { if (newValue === true) {
-
@@ -44,15 +41,12 @@ });} } }, mounted() { document.getElementById('show-file-list-btn').addEventListener('click', this.toggleFileList); }, unmounted() { document.getElementById('show-file-list-btn').removeEventListener('click', this.toggleFileList); }, methods: { toggleFileList() { this.fileListIsVisible = !this.fileListIsVisible;
-
-
-
@@ -21,15 +21,12 @@ const {pageData} = window.config;const LOCAL_STORAGE_KEY = 'diff_file_tree_visible'; export default { name: 'DiffFileTree', components: {DiffFileTreeItem}, data: () => { const fileTreeIsVisible = localStorage.getItem(LOCAL_STORAGE_KEY) === 'true'; pageData.diffFileInfo.fileTreeIsVisible = fileTreeIsVisible; return pageData.diffFileInfo; }, computed: { fileTree() { const result = [];
-
@@ -94,7 +91,6 @@ mergeChildIfOnlyOneDir(result);return result; } }, mounted() { // ensure correct buttons when we are mounted to the dom this.adjustToggleButton(this.fileTreeIsVisible);
-
@@ -125,7 +121,7 @@ this.isLoadingNewData = true;doLoadMoreFiles(this.link, this.diffEnd, () => { this.isLoadingNewData = false; }); } }, }, }; </script>
-
-
-
@@ -43,11 +43,7 @@ <script>import {SvgIcon} from '../svg.js'; export default { name: 'DiffFileTreeItem', components: { SvgIcon, }, components: {SvgIcon}, props: { item: { type: Object,
-
@@ -59,7 +55,6 @@ required: false,default: true } }, data: () => ({ collapsed: false, }),
-
-
-
@@ -111,11 +111,7 @@const {csrfToken, pageData} = window.config; export default { name: 'PullRequestMergeForm', components: { SvgIcon, }, components: {SvgIcon}, data: () => ({ csrfToken, mergeForm: pageData.pullRequestMergeForm,
-
@@ -137,20 +133,17 @@showMergeStyleMenu: false, showActionForm: false, }), computed: { mergeButtonStyleClass() { if (this.mergeForm.allOverridableChecksOk) return 'green'; return this.autoMergeWhenSucceed ? 'blue' : 'red'; } }, watch: { mergeStyle(val) { this.mergeStyleDetail = this.mergeForm.mergeStyles.find((e) => e.name === val); } }, created() { this.mergeStyleAllowedCount = this.mergeForm.mergeStyles.reduce((v, msd) => v + (msd.allowed ? 1 : 0), 0);
-
@@ -158,15 +151,12 @@ let mergeStyle = this.mergeForm.mergeStyles.find((e) => e.allowed && e.name === this.mergeForm.defaultMergeStyle)?.name;if (!mergeStyle) mergeStyle = this.mergeForm.mergeStyles.find((e) => e.allowed)?.name; this.switchMergeStyle(mergeStyle, !this.mergeForm.canMergeNow); }, mounted() { document.addEventListener('mouseup', this.hideMergeStyleMenu); }, unmounted() { document.removeEventListener('mouseup', this.hideMergeStyleMenu); }, methods: { hideMergeStyleMenu() { this.showMergeStyleMenu = false;
-
-
-
@@ -44,7 +44,7 @@ }// For all DOM elements with [data-clipboard-target] or [data-clipboard-text], // this copy-to-clipboard will work for them export default function initGlobalCopyToClipboardListener() { export function initGlobalCopyToClipboardListener() { document.addEventListener('click', (e) => { let target = e.target; // in case <button data-clipboard-text><svg></button>, so we just search
-
-
-
@@ -1,4 +1,4 @@export default async function createColorPicker($els) { export async function createColorPicker($els) { if (!$els || !$els.length) return; await Promise.all([
-
-
-
@@ -1,7 +1,7 @@import $ from 'jquery'; import 'jquery.are-you-sure'; import {mqBinarySearch} from '../utils.js'; import createDropzone from './dropzone.js'; import {createDropzone} from './dropzone.js'; import {initCompColorPicker} from './comp/ColorPicker.js'; import {showGlobalErrorMessage} from '../bootstrap.js'; import {attachDropdownAria} from './aria.js';
-
-
-
@@ -1,5 +1,5 @@import $ from 'jquery'; import createColorPicker from '../colorpicker.js'; import {createColorPicker} from '../colorpicker.js'; export function initCompColorPicker() { createColorPicker($('.color-picker'));
-
-
-
@@ -1,5 +1,5 @@import $ from 'jquery'; import attachTribute from '../tribute.js'; import {attachTribute} from '../tribute.js'; import {handleGlobalEnterQuickSubmit} from './QuickSubmit.js'; /**
-
-
-
@@ -2,7 +2,6 @@ import $ from 'jquery';import {htmlEscape} from 'escape-goat'; const {appSubUrl} = window.config; const looksLikeEmailAddressCheck = /^\S+@\S+$/; export function initCompSearchUserBox() {
-
-
-
@@ -1,4 +1,5 @@import $ from 'jquery'; const {csrfToken} = window.config; export function initCompWebHookEditor() {
-
-
-
@@ -4,7 +4,7 @@ import ContextPopup from '../components/ContextPopup.vue';import {parseIssueHref} from '../utils.js'; import {createTippy} from '../modules/tippy.js'; export default function initContextPopups() { export function initContextPopups() { const refIssues = $('.ref-issue'); if (!refIssues.length) return;
-
-
-
@@ -1,6 +1,7 @@import {copyToClipboard} from './clipboard.js'; import {showTemporaryTooltip} from '../modules/tippy.js'; import {convertImage} from '../utils.js'; const {i18n} = window.config; async function doCopy(content, btn) {
-
-
-
@@ -1,4 +1,4 @@export default async function createDropzone(el, opts) { export async function createDropzone(el, opts) { const [{Dropzone}] = await Promise.all([ import(/* webpackChunkName: "dropzone" */'dropzone'), import(/* webpackChunkName: "dropzone" */'dropzone/dist/dropzone.css'),
-
-
-
@@ -1,7 +1,6 @@import emojis from '../../../assets/emoji.json'; const {assetUrlPrefix} = window.config; const {customEmojis} = window.config; const {assetUrlPrefix, customEmojis} = window.config; const tempMap = {...customEmojis}; for (const {emoji, aliases} of emojis) {
-
-
-
@@ -1,6 +1,5 @@import {svg} from '../svg.js'; // Hides the file if newFold is true, and shows it otherwise. The actual hiding is performed using CSS. // // The fold arrow is the icon displayed on the upper left of the file box, especially intended for components having the 'fold-file' class.
-
-
-
@@ -1,7 +1,6 @@import {prettyNumber} from '../utils.js'; const {lang} = document.documentElement; const dateFormatter = new Intl.DateTimeFormat(lang, {year: 'numeric', month: 'long', day: 'numeric'}); const shortDateFormatter = new Intl.DateTimeFormat(lang, {year: 'numeric', month: 'short', day: 'numeric'}); const dateTimeFormatter = new Intl.DateTimeFormat(lang, {year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric'});
-
-
-
@@ -1,7 +1,8 @@import {createApp} from 'vue'; import ActivityHeatmap from '../components/ActivityHeatmap.vue'; import {translateMonth, translateDay} from '../utils.js'; export default function initHeatmap() { export function initHeatmap() { const el = document.getElementById('user-heatmap'); if (!el) return;
-
-
-
@@ -34,7 +34,7 @@ }return null; } export default function initImageDiff() { export function initImageDiff() { function createContext(image1, image2) { const size1 = { width: image1 && image1.width || 0,
-
-
-
@@ -2,7 +2,7 @@ import {createApp} from 'vue';import DiffFileTree from '../components/DiffFileTree.vue'; import DiffFileList from '../components/DiffFileList.vue'; export default function initDiffFileTree() { export function initDiffFileTree() { const el = document.getElementById('diff-file-tree'); if (!el) return;
-
-
-
@@ -1,6 +1,6 @@import $ from 'jquery'; import {svg} from '../svg.js'; const {csrf} = window.config; const threshold = 50;
-
-
-
@@ -1,6 +1,6 @@import $ from 'jquery'; export default function initRepoGraphGit() { export function initRepoGraphGit() { const graphContainer = document.getElementById('git-graph-container'); if (!graphContainer) return;
-
-
-
@@ -1,7 +1,7 @@import {createApp} from 'vue'; import PullRequestMergeForm from '../components/PullRequestMergeForm.vue'; export default function initPullRequestMergeForm() { export function initRepoPullRequestMergeForm() { const el = document.getElementById('pull-request-merge-form'); if (!el) return;
-
-
-
@@ -1,6 +1,6 @@import $ from 'jquery'; import {htmlEscape} from 'escape-goat'; import attachTribute from './tribute.js'; import {attachTribute} from './tribute.js'; import {createCommentEasyMDE, getAttachedEasyMDE} from './comp/EasyMDE.js'; import {initEasyMDEImagePaste} from './comp/ImagePaste.js'; import {initCompMarkupContentPreviewTab} from './comp/MarkupContentPreview.js';
-
-
-
@@ -3,33 +3,28 @@ import {createCommentEasyMDE, getAttachedEasyMDE} from './comp/EasyMDE.js';import {initCompMarkupContentPreviewTab} from './comp/MarkupContentPreview.js'; import {initEasyMDEImagePaste} from './comp/ImagePaste.js'; import { initRepoIssueBranchSelect, initRepoIssueCodeCommentCancel, initRepoIssueCommentDelete, initRepoIssueComments, initRepoIssueDependencyDelete, initRepoIssueReferenceIssue, initRepoIssueStatusButton, initRepoIssueTitleEdit, initRepoIssueWipToggle, initRepoPullRequestUpdate, updateIssuesMeta, initRepoIssueBranchSelect, initRepoIssueCodeCommentCancel, initRepoIssueCommentDelete, initRepoIssueComments, initRepoIssueDependencyDelete, initRepoIssueReferenceIssue, initRepoIssueStatusButton, initRepoIssueTitleEdit, initRepoIssueWipToggle, initRepoPullRequestUpdate, updateIssuesMeta, } from './repo-issue.js'; import {initUnicodeEscapeButton} from './repo-unicode-escape.js'; import {svg} from '../svg.js'; import {htmlEscape} from 'escape-goat'; import {initRepoBranchTagDropdown} from '../components/RepoBranchTagDropdown.js'; import { initRepoCloneLink, initRepoCommonBranchOrTagDropdown, initRepoCommonFilterSearchDropdown, initRepoCloneLink, initRepoCommonBranchOrTagDropdown, initRepoCommonFilterSearchDropdown, initRepoCommonLanguageStats, } from './repo-common.js'; import {initCitationFileCopyContent} from './citation.js'; import {initCompLabelEdit} from './comp/LabelEdit.js'; import {initRepoDiffConversationNav} from './repo-diff.js'; import attachTribute from './tribute.js'; import createDropzone from './dropzone.js'; import {attachTribute} from './tribute.js'; import {createDropzone} from './dropzone.js'; import {initCommentContent, initMarkupContent} from '../markup/content.js'; import {initCompReactionSelector} from './comp/ReactionSelector.js'; import {initRepoSettingBranches} from './repo-settings.js'; import initRepoPullRequestMergeForm from './repo-issue-pr-form.js'; import {initRepoPullRequestMergeForm} from './repo-issue-pr-form.js'; const {csrfToken} = window.config;
-
-
-
@@ -10,7 +10,7 @@ const $lfsSettings = $('#lfs_settings');const $lfsEndpoint = $('#lfs_endpoint'); const $items = $('#migrate_items').find('input[type=checkbox]'); export default function initRepoMigration() { export function initRepoMigration() { checkAuth(); setLFSSettingsVisibility();
-
-
-
@@ -84,7 +84,7 @@ });} } export default function initRepoProject() { export function initRepoProject() { if (!$('.repository.projects').length) { return; }
-
-
-
@@ -1,5 +1,5 @@import $ from 'jquery'; import attachTribute from './tribute.js'; import {attachTribute} from './tribute.js'; import {initCompMarkupContentPreviewTab} from './comp/MarkupContentPreview.js'; import {initEasyMDEImagePaste} from './comp/ImagePaste.js'; import {createCommentEasyMDE} from './comp/EasyMDE.js';
-
-
-
@@ -35,7 +35,7 @@ localStorage.setItem('staticCacheKey', cacheKey);} } export default async function initServiceWorker() { export async function initServiceWorker() { if (!('serviceWorker' in navigator)) return; if (useServiceWorker) {
-
-
-
@@ -24,6 +24,7 @@ placement: 'bottom-end',trigger: 'click', maxWidth: 'none', interactive: true, hideOnClick: true, }); // global stop watch (in the head_navbar), it should always work in any case either the EventSource or the PeriodicPoller is used.
-
-
-
@@ -1,4 +1,4 @@export default function initTableSort() { export function initTableSort() { for (const header of document.querySelectorAll('th[data-sortt-asc]') || []) { const sorttAsc = header.getAttribute('data-sortt-asc'); const sorttDesc = header.getAttribute('data-sortt-desc');
-
-
-
@@ -49,7 +49,7 @@return collections; } export default async function attachTribute(elementOrNodeList, {mentions, emoji} = {}) { export async function attachTribute(elementOrNodeList, {mentions, emoji} = {}) { if (!window.config.requireTribute || !elementOrNodeList) return; const nodes = Array.from('length' in elementOrNodeList ? elementOrNodeList : [elementOrNodeList]); if (!nodes.length) return;
-
-
-
@@ -6,16 +6,16 @@ import {initVueEnv} from './components/VueComponentLoader.js';import {initRepoActivityTopAuthorsChart} from './components/RepoActivityTopAuthors.vue'; import {initDashboardRepoList} from './components/DashboardRepoList.js'; import attachTribute from './features/tribute.js'; import initGlobalCopyToClipboardListener from './features/clipboard.js'; import initContextPopups from './features/contextpopup.js'; import initRepoGraphGit from './features/repo-graph.js'; import initHeatmap from './features/heatmap.js'; import initImageDiff from './features/imagediff.js'; import initRepoMigration from './features/repo-migration.js'; import initRepoProject from './features/repo-projects.js'; import initServiceWorker from './features/serviceworker.js'; import initTableSort from './features/tablesort.js'; import {attachTribute} from './features/tribute.js'; import {initGlobalCopyToClipboardListener} from './features/clipboard.js'; import {initContextPopups} from './features/contextpopup.js'; import {initRepoGraphGit} from './features/repo-graph.js'; import {initHeatmap} from './features/heatmap.js'; import {initImageDiff} from './features/imagediff.js'; import {initRepoMigration} from './features/repo-migration.js'; import {initRepoProject} from './features/repo-projects.js'; import {initServiceWorker} from './features/serviceworker.js'; import {initTableSort} from './features/tablesort.js'; import {initAdminUserListSearchForm} from './features/admin/users.js'; import {initAdminConfigs} from './features/admin/config.js'; import {initMarkupAnchors} from './markup/anchors.js';
-
@@ -24,7 +24,7 @@ import {initRepoIssueContentHistory} from './features/repo-issue-content.js';import {initStopwatch} from './features/stopwatch.js'; import {initFindFileInRepo} from './features/repo-findfile.js'; import {initCommentContent, initMarkupContent} from './markup/content.js'; import initDiffFileTree from './features/repo-diff-filetree.js'; import {initDiffFileTree} from './features/repo-diff-filetree.js'; import {initUserAuthLinkAccountView, initUserAuthOauth2} from './features/user-auth.js'; import {
-
-
-
@@ -1,15 +1,18 @@import {svg} from '../svg.js'; export function makeCodeCopyButton() { const button = document.createElement('button'); button.classList.add('code-copy', 'ui', 'button'); button.innerHTML = svg('octicon-copy'); return button; } export function renderCodeCopy() { const els = document.querySelectorAll('.markup .code-block code'); if (!els.length) return; const button = document.createElement('button'); button.classList.add('code-copy', 'ui', 'button'); button.innerHTML = svg('octicon-copy'); for (const el of els) { const btn = button.cloneNode(true); const btn = makeCodeCopyButton(); btn.setAttribute('data-clipboard-text', el.textContent); el.after(btn); }
-
-
-
@@ -1,4 +1,6 @@import {isDarkTheme} from '../utils.js'; import {makeCodeCopyButton} from './codecopy.js'; const {mermaidMaxSourceCharacters} = window.config; const iframeCss = `
-
@@ -58,7 +60,13 @@ iframe.classList.add('markup-render');iframe.sandbox = 'allow-scripts'; iframe.style.height = `${Math.ceil(parseFloat(heightStr))}px`; iframe.srcdoc = `<html><head><style>${iframeCss}</style></head><body>${svgStr}</body></html>`; el.closest('pre').replaceWith(iframe); const mermaidBlock = document.createElement('div'); mermaidBlock.classList.add('mermaid-block'); mermaidBlock.append(iframe); const btn = makeCodeCopyButton(); btn.setAttribute('data-clipboard-text', source); mermaidBlock.append(btn); el.closest('pre').replaceWith(mermaidBlock); }); } catch (err) { displayError(el, err);
-
-
-
@@ -6,6 +6,7 @@ appendTo: document.body,placement: target.getAttribute('data-placement') || 'top-start', animation: false, allowHTML: false, hideOnClick: false, interactiveBorder: 30, ignoreAttributes: true, maxWidth: 500, // increase over default 350px
-
@@ -46,7 +47,7 @@ tippy = initTooltip(target, {content});} tippy.setContent(content); tippy.show(); if (!tippy.state.isShown) tippy.show(); tippy.setProps({ onHidden: (tippy) => { if (oldContent) {
-
-
-
@@ -26,7 +26,6 @@ import octiconSidebarExpand from '../../public/img/svg/octicon-sidebar-expand.svg';import octiconTriangleDown from '../../public/img/svg/octicon-triangle-down.svg'; import octiconX from '../../public/img/svg/octicon-x.svg'; export const svgs = { 'octicon-chevron-down': octiconChevronDown, 'octicon-chevron-right': octiconChevronRight,
-
@@ -56,7 +55,6 @@ 'octicon-sidebar-expand': octiconSidebarExpand,'octicon-triangle-down': octiconTriangleDown, 'octicon-x': octiconX, }; const parser = new DOMParser(); const serializer = new XMLSerializer();
-
-
-
@@ -1595,6 +1595,8 @@ z-index: 8;border-bottom: 1px solid var(--color-secondary); padding-left: 2px; padding-right: 2px; margin-left: -1px; margin-right: -1px; } > div::after {
-
-
-
@@ -1,4 +1,5 @@.markup .code-block { .markup .code-block, .markup .mermaid-block { position: relative; }
-
@@ -26,7 +27,8 @@ .markup .code-copy:active {background: var(--color-secondary-dark-1) !important; } .markup .code-block:hover .code-copy { .markup .code-block:hover .code-copy, .markup .mermaid-block:hover .code-copy { visibility: visible; animation: fadein .2s both; }
-