From 3e7bb6711eb0f24eebdcbb20cadbf05abdc6825d Mon Sep 17 00:00:00 2001 From: Alexandre Mutel Date: Tue, 8 Mar 2016 22:27:17 +0900 Subject: [PATCH] Finish support for Emoji. Add TextMatcher --- .../TestMatchPerf.cs | 55 +- src/Textamina.Markdig.Tests/TestPlayParser.cs | 87 +- .../Extensions/Emoji/EmojiExtension.cs | 22 + .../Extensions/Emoji/EmojiInline.cs | 37 + .../Extensions/Emoji/EmojiParser.cs | 1928 +++++++++-------- .../Helpers/DefaultObjectCache.cs | 2 +- src/Textamina.Markdig/Helpers/ObjectCache.cs | 15 +- src/Textamina.Markdig/Helpers/TextMatcher.cs | 175 ++ src/Textamina.Markdig/MarkdownExtensions.cs | 15 +- .../Parsers/MarkdownParser.cs | 12 +- .../Textamina.Markdig.csproj | 3 + 11 files changed, 1322 insertions(+), 1029 deletions(-) create mode 100644 src/Textamina.Markdig/Extensions/Emoji/EmojiExtension.cs create mode 100644 src/Textamina.Markdig/Extensions/Emoji/EmojiInline.cs create mode 100644 src/Textamina.Markdig/Helpers/TextMatcher.cs diff --git a/src/Testamina.Markdig.Benchmarks/TestMatchPerf.cs b/src/Testamina.Markdig.Benchmarks/TestMatchPerf.cs index 9c4944a8..d91e6ef3 100644 --- a/src/Testamina.Markdig.Benchmarks/TestMatchPerf.cs +++ b/src/Testamina.Markdig.Benchmarks/TestMatchPerf.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; using BenchmarkDotNet.Attributes; +using Textamina.Markdig.Helpers; namespace Testamina.Markdig.Benchmarks { @@ -51,57 +52,6 @@ namespace Testamina.Markdig.Benchmarks } } - public class TextMatchHelper - { - private readonly string[] ordered; - - public TextMatchHelper(HashSet strings) - { - var orderedList = new List(strings); - orderedList.Sort(); - ordered = orderedList.ToArray(); - } - - public bool TryMatch(string text, int offset, int length, out string matchText) - { - matchText = null; - int start = 0; - int end = ordered.Length - 1; - while (start <= end) - { - int i = start + (end - start >> 1); - int num3 = Compare(text, offset, length, ordered[i]); - if (num3 == 0) - { - matchText = ordered[i]; - return true; - } - if (num3 < 0) - start = i + 1; - else - end = i - 1; - } - return false; - } - - private static int Compare(string text, int offset, int length, string value) - { - var maxLength = value.Length < length - ? value.Length - : length; - for (int i = 0; i < maxLength; i++, offset++) - { - var result = value[i].CompareTo(text[offset]); - if (result != 0) - { - return result; - } - } - // Either we have a full match, or value string is longer than text - return maxLength == value.Length ? 0 : 1; - } - } - public class TestMatchPerf { @@ -119,7 +69,6 @@ namespace Testamina.Markdig.Benchmarks matcher = new TextMatchHelper(new HashSet(replacers.Keys)); } - [Benchmark] public void TestMatch() { @@ -128,7 +77,7 @@ namespace Testamina.Markdig.Benchmarks { string matchText; //var text = ":z150: this is a long string"; - var text = ":z1"; + var text = ":z1:"; matcher.TryMatch(text, 0, text.Length, out matchText); } } diff --git a/src/Textamina.Markdig.Tests/TestPlayParser.cs b/src/Textamina.Markdig.Tests/TestPlayParser.cs index dad833f8..7b7db292 100644 --- a/src/Textamina.Markdig.Tests/TestPlayParser.cs +++ b/src/Textamina.Markdig.Tests/TestPlayParser.cs @@ -12,61 +12,68 @@ namespace Textamina.Markdig.Tests [Test] public void TestSimple() { - var text = @" -Term 1 -: This is a definition item - With a paragraph - > This is a block quote - - - This is a list - - item2 - - ```java - Test - - - ``` - - And a lazy line -: This ia another definition item - -Term2 -Term3 *with some inline* -: This is another definition for term2 -"; + var text = @" This is a test with a :) and a :angry: smiley"; // var reader = new StringReader(@"> > toto tata //> titi toto //"); //var result = Markdown.ToHtml(text, new MarkdownPipeline().UseFootnotes().UseStrikethroughSuperAndSubScript()); - var result = Markdown.ToHtml(text, new MarkdownPipeline().UseDefinitionList()); + var result = Markdown.ToHtml(text, new MarkdownPipeline().UseEmojiAndSmiley()); //File.WriteAllText("test.html", result, Encoding.UTF8); Console.WriteLine(result); } - +// Test for definition lists: +// // var text = @" -//+-----------------------------------+--------------------------------------+ -//| - this is a list | > We have a blockquote -//| - this is a second item | -//| | -//| ``` | -//| Yes | -//| ``` | -//+===================================+======================================+ -//| This is a second line | -//+-----------------------------------+--------------------------------------+ +//Term 1 +//: This is a definition item +// With a paragraph +// > This is a block quote -//:::spoiler {#yessss} -//This is a spoiler -//::: +// - This is a list +// - item2 -///| we have mult | paragraph | -///| we have a new colspan with a long line -///| and lots of text +// ```java +// Test + + +// ``` + +// And a lazy line +//: This ia another definition item + +//Term2 +//Term3 *with some inline* +//: This is another definition for term2 //"; + // Test for grid table + + + // var text = @" + //+-----------------------------------+--------------------------------------+ + //| - this is a list | > We have a blockquote + //| - this is a second item | + //| | + //| ``` | + //| Yes | + //| ``` | + //+===================================+======================================+ + //| This is a second line | + //+-----------------------------------+--------------------------------------+ + + //:::spoiler {#yessss} + //This is a spoiler + //::: + + ///| we have mult | paragraph | + ///| we have a new colspan with a long line + ///| and lots of text + //"; + + } } \ No newline at end of file diff --git a/src/Textamina.Markdig/Extensions/Emoji/EmojiExtension.cs b/src/Textamina.Markdig/Extensions/Emoji/EmojiExtension.cs new file mode 100644 index 00000000..1db921e4 --- /dev/null +++ b/src/Textamina.Markdig/Extensions/Emoji/EmojiExtension.cs @@ -0,0 +1,22 @@ +๏ปฟ// Copyright (c) Alexandre Mutel. All rights reserved. +// This file is licensed under the BSD-Clause 2 license. +// See the license.txt file in the project root for more information. + +namespace Textamina.Markdig.Extensions.Emoji +{ + /// + /// Extension to allow emoji and smiley replacement. + /// + /// + public class EmojiExtension : IMarkdownExtension + { + public void Setup(MarkdownPipeline pipeline) + { + if (!pipeline.InlineParsers.Contains()) + { + // Insert the parser before any other parsers + pipeline.InlineParsers.Insert(0, new EmojiParser()); + } + } + } +} \ No newline at end of file diff --git a/src/Textamina.Markdig/Extensions/Emoji/EmojiInline.cs b/src/Textamina.Markdig/Extensions/Emoji/EmojiInline.cs new file mode 100644 index 00000000..99682e94 --- /dev/null +++ b/src/Textamina.Markdig/Extensions/Emoji/EmojiInline.cs @@ -0,0 +1,37 @@ +๏ปฟ// Copyright (c) Alexandre Mutel. All rights reserved. +// This file is licensed under the BSD-Clause 2 license. +// See the license.txt file in the project root for more information. + +using Textamina.Markdig.Helpers; +using Textamina.Markdig.Syntax.Inlines; + +namespace Textamina.Markdig.Extensions.Emoji +{ + /// + /// An emoji inline + /// + /// + public class EmojiInline : LiteralInline + { + /// + /// Initializes a new instance of the class. + /// + public EmojiInline() + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The content. + public EmojiInline(string content) + { + Content = new StringSlice(content); + } + + /// + /// Gets or sets the original match string (either an emoji or a text smiley) + /// + public string Match { get; set; } + } +} \ No newline at end of file diff --git a/src/Textamina.Markdig/Extensions/Emoji/EmojiParser.cs b/src/Textamina.Markdig/Extensions/Emoji/EmojiParser.cs index ecc83181..397aff9e 100644 --- a/src/Textamina.Markdig/Extensions/Emoji/EmojiParser.cs +++ b/src/Textamina.Markdig/Extensions/Emoji/EmojiParser.cs @@ -2,6 +2,8 @@ // This file is licensed under the BSD-Clause 2 license. // See the license.txt file in the project root for more information. +using System; +using System.Collections; using System.Collections.Generic; using Textamina.Markdig.Helpers; using Textamina.Markdig.Parsers; @@ -14,964 +16,1030 @@ namespace Textamina.Markdig.Extensions.Emoji /// public class EmojiParser : InlineParser { - private static Dictionary EmojiToUnicode; + private static readonly Dictionary EmojiToUnicodeDefault; + private static readonly Dictionary SmileyToEmojiDefault; + + private TextMatchHelper textMatchHelper; /// /// Initializes a new instance of the class. /// public EmojiParser() { - OpeningCharacters = new[] { '|', '\n' }; - RequireHeaderSeparator = true; + OpeningCharacters = null; + EmojiToUnicode = new Dictionary(EmojiToUnicodeDefault); + SmileyToEmoji = new Dictionary(SmileyToEmojiDefault); } /// - /// Gets or sets a value indicating whether to require header separator. True by default (false to have Kramdown behaviour) + /// Gets the emoji to unicode mapping. This can be modified before this parser is initialized. /// - public bool RequireHeaderSeparator { get; set; } + public Dictionary EmojiToUnicode { get; } + + /// + /// Gets the smiley to emoji mapping. This can be modified before this parser is initialized. + /// + public Dictionary SmileyToEmoji { get; } public override void Initialize(InlineProcessor processor) { + var firstChars = new HashSet(); + var textToMatch = new HashSet(); + foreach (var emoji in EmojiToUnicode) + { + firstChars.Add(emoji.Key[0]); + textToMatch.Add(emoji.Key); + } + foreach (var smiley in SmileyToEmoji) + { + firstChars.Add(smiley.Key[0]); + textToMatch.Add(smiley.Key); + } + textMatchHelper = new TextMatchHelper(textToMatch); - // We are using the linebreak parser + OpeningCharacters = new List(firstChars).ToArray(); + Array.Sort(OpeningCharacters); } public override bool Match(InlineProcessor processor, ref StringSlice slice) { - var c = slice.CurrentChar; + string match; + if (!textMatchHelper.TryMatch(slice.Text, slice.Start, slice.Length, out match)) + { + return false; + } + + string emoji; + if (!SmileyToEmoji.TryGetValue(match, out emoji)) + { + emoji = match; + } + + string unicode; + if (!EmojiToUnicode.TryGetValue(emoji, out unicode)) + { + // Should not happen but in case + return false; + } + + // Move the cursor to the character after the matched string + slice.Start += match.Length; + + // Push the EmojiInline + processor.Inline = new EmojiInline(unicode) {Match = match}; + return true; } - + + #region Emojis and Smileys static EmojiParser() { - EmojiToUnicode = new Dictionary() + EmojiToUnicodeDefault = new Dictionary() { - {":100:","๐Ÿ’ฏ"}, - {":1234:","๐Ÿ”ข"}, - {":smile:","๐Ÿ˜„"}, - {":smiley:","๐Ÿ˜ƒ"}, - {":grinning:","๐Ÿ˜€"}, - {":blush:","๐Ÿ˜Š"}, - {":relaxed:","โ˜บ๏ธ"}, - {":wink:","๐Ÿ˜‰"}, - {":heart_eyes:","๐Ÿ˜"}, - {":kissing_heart:","๐Ÿ˜˜"}, - {":kissing_closed_eyes:","๐Ÿ˜š"}, - {":kissing:","๐Ÿ˜—"}, - {":kissing_smiling_eyes:","๐Ÿ˜™"}, - {":stuck_out_tongue_winking_eye:","๐Ÿ˜œ"}, - {":stuck_out_tongue_closed_eyes:","๐Ÿ˜"}, - {":stuck_out_tongue:","๐Ÿ˜›"}, - {":flushed:","๐Ÿ˜ณ"}, - {":grin:","๐Ÿ˜"}, - {":pensive:","๐Ÿ˜”"}, - {":relieved:","๐Ÿ˜Œ"}, - {":unamused:","๐Ÿ˜’"}, - {":disappointed:","๐Ÿ˜ž"}, - {":persevere:","๐Ÿ˜ฃ"}, - {":cry:","๐Ÿ˜ข"}, - {":joy:","๐Ÿ˜‚"}, - {":sob:","๐Ÿ˜ญ"}, - {":sleepy:","๐Ÿ˜ช"}, - {":disappointed_relieved:","๐Ÿ˜ฅ"}, - {":cold_sweat:","๐Ÿ˜ฐ"}, - {":sweat_smile:","๐Ÿ˜…"}, - {":sweat:","๐Ÿ˜“"}, - {":weary:","๐Ÿ˜ฉ"}, - {":tired_face:","๐Ÿ˜ซ"}, - {":fearful:","๐Ÿ˜จ"}, - {":scream:","๐Ÿ˜ฑ"}, - {":angry:","๐Ÿ˜ "}, - {":rage:","๐Ÿ˜ก"}, - {":triumph:","๐Ÿ˜ค"}, - {":confounded:","๐Ÿ˜–"}, - {":laughing:","๐Ÿ˜†"}, - {":satisfied:","๐Ÿ˜†"}, - {":yum:","๐Ÿ˜‹"}, - {":mask:","๐Ÿ˜ท"}, - {":sunglasses:","๐Ÿ˜Ž"}, - {":sleeping:","๐Ÿ˜ด"}, - {":dizzy_face:","๐Ÿ˜ต"}, - {":astonished:","๐Ÿ˜ฒ"}, - {":worried:","๐Ÿ˜Ÿ"}, - {":frowning:","๐Ÿ˜ฆ"}, - {":anguished:","๐Ÿ˜ง"}, - {":smiling_imp:","๐Ÿ˜ˆ"}, - {":imp:","๐Ÿ‘ฟ"}, - {":open_mouth:","๐Ÿ˜ฎ"}, - {":grimacing:","๐Ÿ˜ฌ"}, - {":neutral_face:","๐Ÿ˜"}, - {":confused:","๐Ÿ˜•"}, - {":hushed:","๐Ÿ˜ฏ"}, - {":no_mouth:","๐Ÿ˜ถ"}, - {":innocent:","๐Ÿ˜‡"}, - {":smirk:","๐Ÿ˜"}, - {":expressionless:","๐Ÿ˜‘"}, - {":man_with_gua_pi_mao:","๐Ÿ‘ฒ"}, - {":man_with_turban:","๐Ÿ‘ณ"}, - {":cop:","๐Ÿ‘ฎ"}, - {":construction_worker:","๐Ÿ‘ท"}, - {":guardsman:","๐Ÿ’‚"}, - {":baby:","๐Ÿ‘ถ"}, - {":boy:","๐Ÿ‘ฆ"}, - {":girl:","๐Ÿ‘ง"}, - {":man:","๐Ÿ‘จ"}, - {":woman:","๐Ÿ‘ฉ"}, - {":older_man:","๐Ÿ‘ด"}, - {":older_woman:","๐Ÿ‘ต"}, - {":person_with_blond_hair:","๐Ÿ‘ฑ"}, - {":angel:","๐Ÿ‘ผ"}, - {":princess:","๐Ÿ‘ธ"}, - {":smiley_cat:","๐Ÿ˜บ"}, - {":smile_cat:","๐Ÿ˜ธ"}, - {":heart_eyes_cat:","๐Ÿ˜ป"}, - {":kissing_cat:","๐Ÿ˜ฝ"}, - {":smirk_cat:","๐Ÿ˜ผ"}, - {":scream_cat:","๐Ÿ™€"}, - {":crying_cat_face:","๐Ÿ˜ฟ"}, - {":joy_cat:","๐Ÿ˜น"}, - {":pouting_cat:","๐Ÿ˜พ"}, - {":japanese_ogre:","๐Ÿ‘น"}, - {":japanese_goblin:","๐Ÿ‘บ"}, - {":see_no_evil:","๐Ÿ™ˆ"}, - {":hear_no_evil:","๐Ÿ™‰"}, - {":speak_no_evil:","๐Ÿ™Š"}, - {":skull:","๐Ÿ’€"}, - {":alien:","๐Ÿ‘ฝ"}, - {":hankey:","๐Ÿ’ฉ"}, - {":poop:","๐Ÿ’ฉ"}, - {":shit:","๐Ÿ’ฉ"}, - {":fire:","๐Ÿ”ฅ"}, - {":sparkles:","โœจ"}, - {":star2:","๐ŸŒŸ"}, - {":dizzy:","๐Ÿ’ซ"}, - {":boom:","๐Ÿ’ฅ"}, - {":collision:","๐Ÿ’ฅ"}, - {":anger:","๐Ÿ’ข"}, - {":sweat_drops:","๐Ÿ’ฆ"}, - {":droplet:","๐Ÿ’ง"}, - {":zzz:","๐Ÿ’ค"}, - {":dash:","๐Ÿ’จ"}, - {":ear:","๐Ÿ‘‚"}, - {":eyes:","๐Ÿ‘€"}, - {":nose:","๐Ÿ‘ƒ"}, - {":tongue:","๐Ÿ‘…"}, - {":lips:","๐Ÿ‘„"}, - {":+1:","๐Ÿ‘"}, - {":thumbsup:","๐Ÿ‘"}, - {":-1:","๐Ÿ‘Ž"}, - {":thumbsdown:","๐Ÿ‘Ž"}, - {":ok_hand:","๐Ÿ‘Œ"}, - {":facepunch:","๐Ÿ‘Š"}, - {":punch:","๐Ÿ‘Š"}, - {":fist:","โœŠ"}, - {":v:","โœŒ๏ธ"}, - {":wave:","๐Ÿ‘‹"}, - {":hand:","โœ‹"}, - {":raised_hand:","โœ‹"}, - {":open_hands:","๐Ÿ‘"}, - {":point_up_2:","๐Ÿ‘†"}, - {":point_down:","๐Ÿ‘‡"}, - {":point_right:","๐Ÿ‘‰"}, - {":point_left:","๐Ÿ‘ˆ"}, - {":raised_hands:","๐Ÿ™Œ"}, - {":pray:","๐Ÿ™"}, - {":point_up:","โ˜๏ธ"}, - {":clap:","๐Ÿ‘"}, - {":muscle:","๐Ÿ’ช"}, - {":walking:","๐Ÿšถ"}, - {":runner:","๐Ÿƒ"}, - {":running:","๐Ÿƒ"}, - {":dancer:","๐Ÿ’ƒ"}, - {":couple:","๐Ÿ‘ซ"}, - {":family:","๐Ÿ‘ช"}, - {":two_men_holding_hands:","๐Ÿ‘ฌ"}, - {":two_women_holding_hands:","๐Ÿ‘ญ"}, - {":couplekiss:","๐Ÿ’"}, - {":couple_with_heart:","๐Ÿ’‘"}, - {":dancers:","๐Ÿ‘ฏ"}, - {":ok_woman:","๐Ÿ™†"}, - {":no_good:","๐Ÿ™…"}, - {":information_desk_person:","๐Ÿ’"}, - {":raising_hand:","๐Ÿ™‹"}, - {":massage:","๐Ÿ’†"}, - {":haircut:","๐Ÿ’‡"}, - {":nail_care:","๐Ÿ’…"}, - {":bride_with_veil:","๐Ÿ‘ฐ"}, - {":person_with_pouting_face:","๐Ÿ™Ž"}, - {":person_frowning:","๐Ÿ™"}, - {":bow:","๐Ÿ™‡"}, - {":tophat:","๐ŸŽฉ"}, - {":crown:","๐Ÿ‘‘"}, - {":womans_hat:","๐Ÿ‘’"}, - {":athletic_shoe:","๐Ÿ‘Ÿ"}, - {":mans_shoe:","๐Ÿ‘ž"}, - {":shoe:","๐Ÿ‘ž"}, - {":sandal:","๐Ÿ‘ก"}, - {":high_heel:","๐Ÿ‘ "}, - {":boot:","๐Ÿ‘ข"}, - {":shirt:","๐Ÿ‘•"}, - {":tshirt:","๐Ÿ‘•"}, - {":necktie:","๐Ÿ‘”"}, - {":womans_clothes:","๐Ÿ‘š"}, - {":dress:","๐Ÿ‘—"}, - {":running_shirt_with_sash:","๐ŸŽฝ"}, - {":jeans:","๐Ÿ‘–"}, - {":kimono:","๐Ÿ‘˜"}, - {":bikini:","๐Ÿ‘™"}, - {":briefcase:","๐Ÿ’ผ"}, - {":handbag:","๐Ÿ‘œ"}, - {":pouch:","๐Ÿ‘"}, - {":purse:","๐Ÿ‘›"}, - {":eyeglasses:","๐Ÿ‘“"}, - {":ribbon:","๐ŸŽ€"}, - {":closed_umbrella:","๐ŸŒ‚"}, - {":lipstick:","๐Ÿ’„"}, - {":yellow_heart:","๐Ÿ’›"}, - {":blue_heart:","๐Ÿ’™"}, - {":purple_heart:","๐Ÿ’œ"}, - {":green_heart:","๐Ÿ’š"}, - {":heart:","โค๏ธ"}, - {":broken_heart:","๐Ÿ’”"}, - {":heartpulse:","๐Ÿ’—"}, - {":heartbeat:","๐Ÿ’“"}, - {":two_hearts:","๐Ÿ’•"}, - {":sparkling_heart:","๐Ÿ’–"}, - {":revolving_hearts:","๐Ÿ’ž"}, - {":cupid:","๐Ÿ’˜"}, - {":love_letter:","๐Ÿ’Œ"}, - {":kiss:","๐Ÿ’‹"}, - {":ring:","๐Ÿ’"}, - {":gem:","๐Ÿ’Ž"}, - {":bust_in_silhouette:","๐Ÿ‘ค"}, - {":busts_in_silhouette:","๐Ÿ‘ฅ"}, - {":speech_balloon:","๐Ÿ’ฌ"}, - {":footprints:","๐Ÿ‘ฃ"}, - {":thought_balloon:","๐Ÿ’ญ"}, - {":dog:","๐Ÿถ"}, - {":wolf:","๐Ÿบ"}, - {":cat:","๐Ÿฑ"}, - {":mouse:","๐Ÿญ"}, - {":hamster:","๐Ÿน"}, - {":rabbit:","๐Ÿฐ"}, - {":frog:","๐Ÿธ"}, - {":tiger:","๐Ÿฏ"}, - {":koala:","๐Ÿจ"}, - {":bear:","๐Ÿป"}, - {":pig:","๐Ÿท"}, - {":pig_nose:","๐Ÿฝ"}, - {":cow:","๐Ÿฎ"}, - {":boar:","๐Ÿ—"}, - {":monkey_face:","๐Ÿต"}, - {":monkey:","๐Ÿ’"}, - {":horse:","๐Ÿด"}, - {":sheep:","๐Ÿ‘"}, - {":elephant:","๐Ÿ˜"}, - {":panda_face:","๐Ÿผ"}, - {":penguin:","๐Ÿง"}, - {":bird:","๐Ÿฆ"}, - {":baby_chick:","๐Ÿค"}, - {":hatched_chick:","๐Ÿฅ"}, - {":hatching_chick:","๐Ÿฃ"}, - {":chicken:","๐Ÿ”"}, - {":snake:","๐Ÿ"}, - {":turtle:","๐Ÿข"}, - {":bug:","๐Ÿ›"}, - {":bee:","๐Ÿ"}, - {":honeybee:","๐Ÿ"}, - {":ant:","๐Ÿœ"}, - {":beetle:","๐Ÿž"}, - {":snail:","๐ŸŒ"}, - {":octopus:","๐Ÿ™"}, - {":shell:","๐Ÿš"}, - {":tropical_fish:","๐Ÿ "}, - {":fish:","๐ŸŸ"}, - {":dolphin:","๐Ÿฌ"}, - {":flipper:","๐Ÿฌ"}, - {":whale:","๐Ÿณ"}, - {":whale2:","๐Ÿ‹"}, - {":cow2:","๐Ÿ„"}, - {":ram:","๐Ÿ"}, - {":rat:","๐Ÿ€"}, - {":water_buffalo:","๐Ÿƒ"}, - {":tiger2:","๐Ÿ…"}, - {":rabbit2:","๐Ÿ‡"}, - {":dragon:","๐Ÿ‰"}, - {":racehorse:","๐ŸŽ"}, - {":goat:","๐Ÿ"}, - {":rooster:","๐Ÿ“"}, - {":dog2:","๐Ÿ•"}, - {":pig2:","๐Ÿ–"}, - {":mouse2:","๐Ÿ"}, - {":ox:","๐Ÿ‚"}, - {":dragon_face:","๐Ÿฒ"}, - {":blowfish:","๐Ÿก"}, - {":crocodile:","๐ŸŠ"}, - {":camel:","๐Ÿซ"}, - {":dromedary_camel:","๐Ÿช"}, - {":leopard:","๐Ÿ†"}, - {":cat2:","๐Ÿˆ"}, - {":poodle:","๐Ÿฉ"}, - {":feet:","๐Ÿพ"}, - {":paw_prints:","๐Ÿพ"}, - {":bouquet:","๐Ÿ’"}, - {":cherry_blossom:","๐ŸŒธ"}, - {":tulip:","๐ŸŒท"}, - {":four_leaf_clover:","๐Ÿ€"}, - {":rose:","๐ŸŒน"}, - {":sunflower:","๐ŸŒป"}, - {":hibiscus:","๐ŸŒบ"}, - {":maple_leaf:","๐Ÿ"}, - {":leaves:","๐Ÿƒ"}, - {":fallen_leaf:","๐Ÿ‚"}, - {":herb:","๐ŸŒฟ"}, - {":ear_of_rice:","๐ŸŒพ"}, - {":mushroom:","๐Ÿ„"}, - {":cactus:","๐ŸŒต"}, - {":palm_tree:","๐ŸŒด"}, - {":evergreen_tree:","๐ŸŒฒ"}, - {":deciduous_tree:","๐ŸŒณ"}, - {":chestnut:","๐ŸŒฐ"}, - {":seedling:","๐ŸŒฑ"}, - {":blossom:","๐ŸŒผ"}, - {":globe_with_meridians:","๐ŸŒ"}, - {":sun_with_face:","๐ŸŒž"}, - {":full_moon_with_face:","๐ŸŒ"}, - {":new_moon_with_face:","๐ŸŒš"}, - {":new_moon:","๐ŸŒ‘"}, - {":waxing_crescent_moon:","๐ŸŒ’"}, - {":first_quarter_moon:","๐ŸŒ“"}, - {":moon:","๐ŸŒ”"}, - {":waxing_gibbous_moon:","๐ŸŒ”"}, - {":full_moon:","๐ŸŒ•"}, - {":waning_gibbous_moon:","๐ŸŒ–"}, - {":last_quarter_moon:","๐ŸŒ—"}, - {":waning_crescent_moon:","๐ŸŒ˜"}, - {":last_quarter_moon_with_face:","๐ŸŒœ"}, - {":first_quarter_moon_with_face:","๐ŸŒ›"}, - {":crescent_moon:","๐ŸŒ™"}, - {":earth_africa:","๐ŸŒ"}, - {":earth_americas:","๐ŸŒŽ"}, - {":earth_asia:","๐ŸŒ"}, - {":volcano:","๐ŸŒ‹"}, - {":milky_way:","๐ŸŒŒ"}, - {":stars:","๐ŸŒ "}, - {":star:","โญ"}, - {":sunny:","โ˜€๏ธ"}, - {":partly_sunny:","โ›…"}, - {":cloud:","โ˜๏ธ"}, - {":zap:","โšก"}, - {":umbrella:","โ˜”"}, - {":snowflake:","โ„๏ธ"}, - {":snowman:","โ›„"}, - {":cyclone:","๐ŸŒ€"}, - {":foggy:","๐ŸŒ"}, - {":rainbow:","๐ŸŒˆ"}, - {":ocean:","๐ŸŒŠ"}, - {":bamboo:","๐ŸŽ"}, - {":gift_heart:","๐Ÿ’"}, - {":dolls:","๐ŸŽŽ"}, - {":school_satchel:","๐ŸŽ’"}, - {":mortar_board:","๐ŸŽ“"}, - {":flags:","๐ŸŽ"}, - {":fireworks:","๐ŸŽ†"}, - {":sparkler:","๐ŸŽ‡"}, - {":wind_chime:","๐ŸŽ"}, - {":rice_scene:","๐ŸŽ‘"}, - {":jack_o_lantern:","๐ŸŽƒ"}, - {":ghost:","๐Ÿ‘ป"}, - {":santa:","๐ŸŽ…"}, - {":christmas_tree:","๐ŸŽ„"}, - {":gift:","๐ŸŽ"}, - {":tanabata_tree:","๐ŸŽ‹"}, - {":tada:","๐ŸŽ‰"}, - {":confetti_ball:","๐ŸŽŠ"}, - {":balloon:","๐ŸŽˆ"}, - {":crossed_flags:","๐ŸŽŒ"}, - {":crystal_ball:","๐Ÿ”ฎ"}, - {":movie_camera:","๐ŸŽฅ"}, - {":camera:","๐Ÿ“ท"}, - {":video_camera:","๐Ÿ“น"}, - {":vhs:","๐Ÿ“ผ"}, - {":cd:","๐Ÿ’ฟ"}, - {":dvd:","๐Ÿ“€"}, - {":minidisc:","๐Ÿ’ฝ"}, - {":floppy_disk:","๐Ÿ’พ"}, - {":computer:","๐Ÿ’ป"}, - {":iphone:","๐Ÿ“ฑ"}, - {":phone:","โ˜Ž๏ธ"}, - {":telephone:","โ˜Ž๏ธ"}, - {":telephone_receiver:","๐Ÿ“ž"}, - {":pager:","๐Ÿ“Ÿ"}, - {":fax:","๐Ÿ“ "}, - {":satellite:","๐Ÿ“ก"}, - {":tv:","๐Ÿ“บ"}, - {":radio:","๐Ÿ“ป"}, - {":loud_sound:","๐Ÿ”Š"}, - {":sound:","๐Ÿ”‰"}, - {":speaker:","๐Ÿ”ˆ"}, - {":mute:","๐Ÿ”‡"}, - {":bell:","๐Ÿ””"}, - {":no_bell:","๐Ÿ”•"}, - {":loudspeaker:","๐Ÿ“ข"}, - {":mega:","๐Ÿ“ฃ"}, - {":hourglass_flowing_sand:","โณ"}, - {":hourglass:","โŒ›"}, - {":alarm_clock:","โฐ"}, - {":watch:","โŒš"}, - {":unlock:","๐Ÿ”“"}, - {":lock:","๐Ÿ”’"}, - {":lock_with_ink_pen:","๐Ÿ”"}, - {":closed_lock_with_key:","๐Ÿ”"}, - {":key:","๐Ÿ”‘"}, - {":mag_right:","๐Ÿ”Ž"}, - {":bulb:","๐Ÿ’ก"}, - {":flashlight:","๐Ÿ”ฆ"}, - {":high_brightness:","๐Ÿ”†"}, - {":low_brightness:","๐Ÿ”…"}, - {":electric_plug:","๐Ÿ”Œ"}, - {":battery:","๐Ÿ”‹"}, - {":mag:","๐Ÿ”"}, - {":bathtub:","๐Ÿ›"}, - {":bath:","๐Ÿ›€"}, - {":shower:","๐Ÿšฟ"}, - {":toilet:","๐Ÿšฝ"}, - {":wrench:","๐Ÿ”ง"}, - {":nut_and_bolt:","๐Ÿ”ฉ"}, - {":hammer:","๐Ÿ”จ"}, - {":door:","๐Ÿšช"}, - {":smoking:","๐Ÿšฌ"}, - {":bomb:","๐Ÿ’ฃ"}, - {":gun:","๐Ÿ”ซ"}, - {":hocho:","๐Ÿ”ช"}, - {":knife:","๐Ÿ”ช"}, - {":pill:","๐Ÿ’Š"}, - {":syringe:","๐Ÿ’‰"}, - {":moneybag:","๐Ÿ’ฐ"}, - {":yen:","๐Ÿ’ด"}, - {":dollar:","๐Ÿ’ต"}, - {":pound:","๐Ÿ’ท"}, - {":euro:","๐Ÿ’ถ"}, - {":credit_card:","๐Ÿ’ณ"}, - {":money_with_wings:","๐Ÿ’ธ"}, - {":calling:","๐Ÿ“ฒ"}, - {":e-mail:","๐Ÿ“ง"}, - {":inbox_tray:","๐Ÿ“ฅ"}, - {":outbox_tray:","๐Ÿ“ค"}, - {":email:","โœ‰๏ธ"}, - {":envelope:","โœ‰๏ธ"}, - {":envelope_with_arrow:","๐Ÿ“ฉ"}, - {":incoming_envelope:","๐Ÿ“จ"}, - {":postal_horn:","๐Ÿ“ฏ"}, - {":mailbox:","๐Ÿ“ซ"}, - {":mailbox_closed:","๐Ÿ“ช"}, - {":mailbox_with_mail:","๐Ÿ“ฌ"}, - {":mailbox_with_no_mail:","๐Ÿ“ญ"}, - {":postbox:","๐Ÿ“ฎ"}, - {":package:","๐Ÿ“ฆ"}, - {":memo:","๐Ÿ“"}, - {":pencil:","๐Ÿ“"}, - {":page_facing_up:","๐Ÿ“„"}, - {":page_with_curl:","๐Ÿ“ƒ"}, - {":bookmark_tabs:","๐Ÿ“‘"}, - {":bar_chart:","๐Ÿ“Š"}, - {":chart_with_upwards_trend:","๐Ÿ“ˆ"}, - {":chart_with_downwards_trend:","๐Ÿ“‰"}, - {":scroll:","๐Ÿ“œ"}, - {":clipboard:","๐Ÿ“‹"}, - {":date:","๐Ÿ“…"}, - {":calendar:","๐Ÿ“†"}, - {":card_index:","๐Ÿ“‡"}, - {":file_folder:","๐Ÿ“"}, - {":open_file_folder:","๐Ÿ“‚"}, - {":scissors:","โœ‚๏ธ"}, - {":pushpin:","๐Ÿ“Œ"}, - {":paperclip:","๐Ÿ“Ž"}, - {":black_nib:","โœ’๏ธ"}, - {":pencil2:","โœ๏ธ"}, - {":straight_ruler:","๐Ÿ“"}, - {":triangular_ruler:","๐Ÿ“"}, - {":closed_book:","๐Ÿ“•"}, - {":green_book:","๐Ÿ“—"}, - {":blue_book:","๐Ÿ“˜"}, - {":orange_book:","๐Ÿ“™"}, - {":notebook:","๐Ÿ““"}, - {":notebook_with_decorative_cover:","๐Ÿ“”"}, - {":ledger:","๐Ÿ“’"}, - {":books:","๐Ÿ“š"}, - {":book:","๐Ÿ“–"}, - {":open_book:","๐Ÿ“–"}, - {":bookmark:","๐Ÿ”–"}, - {":name_badge:","๐Ÿ“›"}, - {":microscope:","๐Ÿ”ฌ"}, - {":telescope:","๐Ÿ”ญ"}, - {":newspaper:","๐Ÿ“ฐ"}, - {":art:","๐ŸŽจ"}, - {":clapper:","๐ŸŽฌ"}, - {":microphone:","๐ŸŽค"}, - {":headphones:","๐ŸŽง"}, - {":musical_score:","๐ŸŽผ"}, - {":musical_note:","๐ŸŽต"}, - {":notes:","๐ŸŽถ"}, - {":musical_keyboard:","๐ŸŽน"}, - {":violin:","๐ŸŽป"}, - {":trumpet:","๐ŸŽบ"}, - {":saxophone:","๐ŸŽท"}, - {":guitar:","๐ŸŽธ"}, - {":space_invader:","๐Ÿ‘พ"}, - {":video_game:","๐ŸŽฎ"}, - {":black_joker:","๐Ÿƒ"}, - {":flower_playing_cards:","๐ŸŽด"}, - {":mahjong:","๐Ÿ€„"}, - {":game_die:","๐ŸŽฒ"}, - {":dart:","๐ŸŽฏ"}, - {":football:","๐Ÿˆ"}, - {":basketball:","๐Ÿ€"}, - {":soccer:","โšฝ"}, - {":baseball:","โšพ๏ธ"}, - {":tennis:","๐ŸŽพ"}, - {":8ball:","๐ŸŽฑ"}, - {":rugby_football:","๐Ÿ‰"}, - {":bowling:","๐ŸŽณ"}, - {":golf:","โ›ณ"}, - {":mountain_bicyclist:","๐Ÿšต"}, - {":bicyclist:","๐Ÿšด"}, - {":checkered_flag:","๐Ÿ"}, - {":horse_racing:","๐Ÿ‡"}, - {":trophy:","๐Ÿ†"}, - {":ski:","๐ŸŽฟ"}, - {":snowboarder:","๐Ÿ‚"}, - {":swimmer:","๐ŸŠ"}, - {":surfer:","๐Ÿ„"}, - {":fishing_pole_and_fish:","๐ŸŽฃ"}, - {":coffee:","โ˜•"}, - {":tea:","๐Ÿต"}, - {":sake:","๐Ÿถ"}, - {":baby_bottle:","๐Ÿผ"}, - {":beer:","๐Ÿบ"}, - {":beers:","๐Ÿป"}, - {":cocktail:","๐Ÿธ"}, - {":tropical_drink:","๐Ÿน"}, - {":wine_glass:","๐Ÿท"}, - {":fork_and_knife:","๐Ÿด"}, - {":pizza:","๐Ÿ•"}, - {":hamburger:","๐Ÿ”"}, - {":fries:","๐ŸŸ"}, - {":poultry_leg:","๐Ÿ—"}, - {":meat_on_bone:","๐Ÿ–"}, - {":spaghetti:","๐Ÿ"}, - {":curry:","๐Ÿ›"}, - {":fried_shrimp:","๐Ÿค"}, - {":bento:","๐Ÿฑ"}, - {":sushi:","๐Ÿฃ"}, - {":fish_cake:","๐Ÿฅ"}, - {":rice_ball:","๐Ÿ™"}, - {":rice_cracker:","๐Ÿ˜"}, - {":rice:","๐Ÿš"}, - {":ramen:","๐Ÿœ"}, - {":stew:","๐Ÿฒ"}, - {":oden:","๐Ÿข"}, - {":dango:","๐Ÿก"}, - {":egg:","๐Ÿณ"}, - {":bread:","๐Ÿž"}, - {":doughnut:","๐Ÿฉ"}, - {":custard:","๐Ÿฎ"}, - {":icecream:","๐Ÿฆ"}, - {":ice_cream:","๐Ÿจ"}, - {":shaved_ice:","๐Ÿง"}, - {":birthday:","๐ŸŽ‚"}, - {":cake:","๐Ÿฐ"}, - {":cookie:","๐Ÿช"}, - {":chocolate_bar:","๐Ÿซ"}, - {":candy:","๐Ÿฌ"}, - {":lollipop:","๐Ÿญ"}, - {":honey_pot:","๐Ÿฏ"}, - {":apple:","๐ŸŽ"}, - {":green_apple:","๐Ÿ"}, - {":tangerine:","๐ŸŠ"}, - {":lemon:","๐Ÿ‹"}, - {":cherries:","๐Ÿ’"}, - {":grapes:","๐Ÿ‡"}, - {":watermelon:","๐Ÿ‰"}, - {":strawberry:","๐Ÿ“"}, - {":peach:","๐Ÿ‘"}, - {":melon:","๐Ÿˆ"}, - {":banana:","๐ŸŒ"}, - {":pear:","๐Ÿ"}, - {":pineapple:","๐Ÿ"}, - {":sweet_potato:","๐Ÿ "}, - {":eggplant:","๐Ÿ†"}, - {":tomato:","๐Ÿ…"}, - {":corn:","๐ŸŒฝ"}, - {":house:","๐Ÿ "}, - {":house_with_garden:","๐Ÿก"}, - {":school:","๐Ÿซ"}, - {":office:","๐Ÿข"}, - {":post_office:","๐Ÿฃ"}, - {":hospital:","๐Ÿฅ"}, - {":bank:","๐Ÿฆ"}, - {":convenience_store:","๐Ÿช"}, - {":love_hotel:","๐Ÿฉ"}, - {":hotel:","๐Ÿจ"}, - {":wedding:","๐Ÿ’’"}, - {":church:","โ›ช"}, - {":department_store:","๐Ÿฌ"}, - {":european_post_office:","๐Ÿค"}, - {":city_sunrise:","๐ŸŒ‡"}, - {":city_sunset:","๐ŸŒ†"}, - {":japanese_castle:","๐Ÿฏ"}, - {":european_castle:","๐Ÿฐ"}, - {":tent:","โ›บ"}, - {":factory:","๐Ÿญ"}, - {":tokyo_tower:","๐Ÿ—ผ"}, - {":japan:","๐Ÿ—พ"}, - {":mount_fuji:","๐Ÿ—ป"}, - {":sunrise_over_mountains:","๐ŸŒ„"}, - {":sunrise:","๐ŸŒ…"}, - {":night_with_stars:","๐ŸŒƒ"}, - {":statue_of_liberty:","๐Ÿ—ฝ"}, - {":bridge_at_night:","๐ŸŒ‰"}, - {":carousel_horse:","๐ŸŽ "}, - {":ferris_wheel:","๐ŸŽก"}, - {":fountain:","โ›ฒ"}, - {":roller_coaster:","๐ŸŽข"}, - {":ship:","๐Ÿšข"}, - {":boat:","โ›ต"}, - {":sailboat:","โ›ต"}, - {":speedboat:","๐Ÿšค"}, - {":rowboat:","๐Ÿšฃ"}, - {":anchor:","โš“"}, - {":rocket:","๐Ÿš€"}, - {":airplane:","โœˆ๏ธ"}, - {":seat:","๐Ÿ’บ"}, - {":helicopter:","๐Ÿš"}, - {":steam_locomotive:","๐Ÿš‚"}, - {":tram:","๐ŸšŠ"}, - {":station:","๐Ÿš‰"}, - {":mountain_railway:","๐Ÿšž"}, - {":train2:","๐Ÿš†"}, - {":bullettrain_side:","๐Ÿš„"}, - {":bullettrain_front:","๐Ÿš…"}, - {":light_rail:","๐Ÿšˆ"}, - {":metro:","๐Ÿš‡"}, - {":monorail:","๐Ÿš"}, - {":train:","๐Ÿš‹"}, - {":railway_car:","๐Ÿšƒ"}, - {":trolleybus:","๐ŸšŽ"}, - {":bus:","๐ŸšŒ"}, - {":oncoming_bus:","๐Ÿš"}, - {":blue_car:","๐Ÿš™"}, - {":oncoming_automobile:","๐Ÿš˜"}, - {":car:","๐Ÿš—"}, - {":red_car:","๐Ÿš—"}, - {":taxi:","๐Ÿš•"}, - {":oncoming_taxi:","๐Ÿš–"}, - {":articulated_lorry:","๐Ÿš›"}, - {":truck:","๐Ÿšš"}, - {":rotating_light:","๐Ÿšจ"}, - {":police_car:","๐Ÿš“"}, - {":oncoming_police_car:","๐Ÿš”"}, - {":fire_engine:","๐Ÿš’"}, - {":ambulance:","๐Ÿš‘"}, - {":minibus:","๐Ÿš"}, - {":bike:","๐Ÿšฒ"}, - {":aerial_tramway:","๐Ÿšก"}, - {":suspension_railway:","๐ŸšŸ"}, - {":mountain_cableway:","๐Ÿš "}, - {":tractor:","๐Ÿšœ"}, - {":barber:","๐Ÿ’ˆ"}, - {":busstop:","๐Ÿš"}, - {":ticket:","๐ŸŽซ"}, - {":vertical_traffic_light:","๐Ÿšฆ"}, - {":traffic_light:","๐Ÿšฅ"}, - {":warning:","โš ๏ธ"}, - {":construction:","๐Ÿšง"}, - {":beginner:","๐Ÿ”ฐ"}, - {":fuelpump:","โ›ฝ"}, - {":izakaya_lantern:","๐Ÿฎ"}, - {":lantern:","๐Ÿฎ"}, - {":slot_machine:","๐ŸŽฐ"}, - {":hotsprings:","โ™จ๏ธ"}, - {":moyai:","๐Ÿ—ฟ"}, - {":circus_tent:","๐ŸŽช"}, - {":performing_arts:","๐ŸŽญ"}, - {":round_pushpin:","๐Ÿ“"}, - {":triangular_flag_on_post:","๐Ÿšฉ"}, - {":jp:","๐Ÿ‡ฏ๐Ÿ‡ต"}, - {":kr:","๐Ÿ‡ฐ๐Ÿ‡ท"}, - {":de:","๐Ÿ‡ฉ๐Ÿ‡ช"}, - {":cn:","๐Ÿ‡จ๐Ÿ‡ณ"}, - {":us:","๐Ÿ‡บ๐Ÿ‡ธ"}, - {":fr:","๐Ÿ‡ซ๐Ÿ‡ท"}, - {":es:","๐Ÿ‡ช๐Ÿ‡ธ"}, - {":it:","๐Ÿ‡ฎ๐Ÿ‡น"}, - {":ru:","๐Ÿ‡ท๐Ÿ‡บ"}, - {":gb:","๐Ÿ‡ฌ๐Ÿ‡ง"}, - {":uk:","๐Ÿ‡ฌ๐Ÿ‡ง"}, - {":one:","1๏ธโƒฃ"}, - {":two:","2๏ธโƒฃ"}, - {":three:","3๏ธโƒฃ"}, - {":four:","4๏ธโƒฃ"}, - {":five:","5๏ธโƒฃ"}, - {":six:","6๏ธโƒฃ"}, - {":seven:","7๏ธโƒฃ"}, - {":eight:","8๏ธโƒฃ"}, - {":nine:","9๏ธโƒฃ"}, - {":zero:","0๏ธโƒฃ"}, - {":keycap_ten:","๐Ÿ”Ÿ"}, - {":hash:","#๏ธโƒฃ"}, - {":symbols:","๐Ÿ”ฃ"}, - {":arrow_up:","โฌ†๏ธ"}, - {":arrow_down:","โฌ‡๏ธ"}, - {":arrow_left:","โฌ…๏ธ"}, - {":arrow_right:","โžก๏ธ"}, - {":capital_abcd:","๐Ÿ” "}, - {":abcd:","๐Ÿ”ก"}, - {":abc:","๐Ÿ”ค"}, - {":arrow_upper_right:","โ†—๏ธ"}, - {":arrow_upper_left:","โ†–๏ธ"}, - {":arrow_lower_right:","โ†˜๏ธ"}, - {":arrow_lower_left:","โ†™๏ธ"}, - {":left_right_arrow:","โ†”๏ธ"}, - {":arrow_up_down:","โ†•๏ธ"}, - {":arrows_counterclockwise:","๐Ÿ”„"}, - {":arrow_backward:","โ—€๏ธ"}, - {":arrow_forward:","โ–ถ๏ธ"}, - {":arrow_up_small:","๐Ÿ”ผ"}, - {":arrow_down_small:","๐Ÿ”ฝ"}, - {":leftwards_arrow_with_hook:","โ†ฉ๏ธ"}, - {":arrow_right_hook:","โ†ช๏ธ"}, - {":information_source:","โ„น๏ธ"}, - {":rewind:","โช"}, - {":fast_forward:","โฉ"}, - {":arrow_double_up:","โซ"}, - {":arrow_double_down:","โฌ"}, - {":arrow_heading_down:","โคต๏ธ"}, - {":arrow_heading_up:","โคด๏ธ"}, - {":ok:","๐Ÿ†—"}, - {":twisted_rightwards_arrows:","๐Ÿ”€"}, - {":repeat:","๐Ÿ”"}, - {":repeat_one:","๐Ÿ”‚"}, - {":new:","๐Ÿ†•"}, - {":up:","๐Ÿ†™"}, - {":cool:","๐Ÿ†’"}, - {":free:","๐Ÿ†“"}, - {":ng:","๐Ÿ†–"}, - {":signal_strength:","๐Ÿ“ถ"}, - {":cinema:","๐ŸŽฆ"}, - {":koko:","๐Ÿˆ"}, - {":u6307:","๐Ÿˆฏ"}, - {":u7a7a:","๐Ÿˆณ"}, - {":u6e80:","๐Ÿˆต"}, - {":u5408:","๐Ÿˆด"}, - {":u7981:","๐Ÿˆฒ"}, - {":ideograph_advantage:","๐Ÿ‰"}, - {":u5272:","๐Ÿˆน"}, - {":u55b6:","๐Ÿˆบ"}, - {":u6709:","๐Ÿˆถ"}, - {":u7121:","๐Ÿˆš"}, - {":restroom:","๐Ÿšป"}, - {":mens:","๐Ÿšน"}, - {":womens:","๐Ÿšบ"}, - {":baby_symbol:","๐Ÿšผ"}, - {":wc:","๐Ÿšพ"}, - {":potable_water:","๐Ÿšฐ"}, - {":put_litter_in_its_place:","๐Ÿšฎ"}, - {":parking:","๐Ÿ…ฟ๏ธ"}, - {":wheelchair:","โ™ฟ"}, - {":no_smoking:","๐Ÿšญ"}, - {":u6708:","๐Ÿˆท๏ธ"}, - {":u7533:","๐Ÿˆธ"}, - {":sa:","๐Ÿˆ‚๏ธ"}, - {":m:","โ“‚๏ธ"}, - {":passport_control:","๐Ÿ›‚"}, - {":baggage_claim:","๐Ÿ›„"}, - {":left_luggage:","๐Ÿ›…"}, - {":customs:","๐Ÿ›ƒ"}, - {":accept:","๐Ÿ‰‘"}, - {":secret:","ใŠ™๏ธ"}, - {":congratulations:","ใŠ—๏ธ"}, - {":cl:","๐Ÿ†‘"}, - {":sos:","๐Ÿ†˜"}, - {":id:","๐Ÿ†”"}, - {":no_entry_sign:","๐Ÿšซ"}, - {":underage:","๐Ÿ”ž"}, - {":no_mobile_phones:","๐Ÿ“ต"}, - {":do_not_litter:","๐Ÿšฏ"}, - {":non-potable_water:","๐Ÿšฑ"}, - {":no_bicycles:","๐Ÿšณ"}, - {":no_pedestrians:","๐Ÿšท"}, - {":children_crossing:","๐Ÿšธ"}, - {":no_entry:","โ›”"}, - {":eight_spoked_asterisk:","โœณ๏ธ"}, - {":sparkle:","โ‡๏ธ"}, - {":negative_squared_cross_mark:","โŽ"}, - {":white_check_mark:","โœ…"}, - {":eight_pointed_black_star:","โœด๏ธ"}, - {":heart_decoration:","๐Ÿ’Ÿ"}, - {":vs:","๐Ÿ†š"}, - {":vibration_mode:","๐Ÿ“ณ"}, - {":mobile_phone_off:","๐Ÿ“ด"}, - {":a:","๐Ÿ…ฐ๏ธ"}, - {":b:","๐Ÿ…ฑ๏ธ"}, - {":ab:","๐Ÿ†Ž"}, - {":o2:","๐Ÿ…พ๏ธ"}, - {":diamond_shape_with_a_dot_inside:","๐Ÿ’ "}, - {":loop:","โžฟ"}, - {":recycle:","โ™ป๏ธ"}, - {":aries:","โ™ˆ"}, - {":taurus:","โ™‰"}, - {":gemini:","โ™Š"}, - {":cancer:","โ™‹"}, - {":leo:","โ™Œ"}, - {":virgo:","โ™"}, - {":libra:","โ™Ž"}, - {":scorpius:","โ™"}, - {":sagittarius:","โ™"}, - {":capricorn:","โ™‘"}, - {":aquarius:","โ™’"}, - {":pisces:","โ™“"}, - {":ophiuchus:","โ›Ž"}, - {":six_pointed_star:","๐Ÿ”ฏ"}, - {":atm:","๐Ÿง"}, - {":chart:","๐Ÿ’น"}, - {":heavy_dollar_sign:","๐Ÿ’ฒ"}, - {":currency_exchange:","๐Ÿ’ฑ"}, - {":copyright:","ยฉ๏ธ"}, - {":registered:","ยฎ๏ธ"}, - {":tm:","โ„ข๏ธ"}, - {":x:","โŒ"}, - {":bangbang:","โ€ผ๏ธ"}, - {":interrobang:","โ‰๏ธ"}, - {":exclamation:","โ—"}, - {":heavy_exclamation_mark:","โ—"}, - {":question:","โ“"}, - {":grey_exclamation:","โ•"}, - {":grey_question:","โ”"}, - {":o:","โญ•"}, - {":top:","๐Ÿ”"}, - {":end:","๐Ÿ”š"}, - {":back:","๐Ÿ”™"}, - {":on:","๐Ÿ”›"}, - {":soon:","๐Ÿ”œ"}, - {":arrows_clockwise:","๐Ÿ”ƒ"}, - {":clock12:","๐Ÿ•›"}, - {":clock1230:","๐Ÿ•ง"}, - {":clock1:","๐Ÿ•"}, - {":clock130:","๐Ÿ•œ"}, - {":clock2:","๐Ÿ•‘"}, - {":clock230:","๐Ÿ•"}, - {":clock3:","๐Ÿ•’"}, - {":clock330:","๐Ÿ•ž"}, - {":clock4:","๐Ÿ•“"}, - {":clock430:","๐Ÿ•Ÿ"}, - {":clock5:","๐Ÿ•”"}, - {":clock530:","๐Ÿ• "}, - {":clock6:","๐Ÿ••"}, - {":clock7:","๐Ÿ•–"}, - {":clock8:","๐Ÿ•—"}, - {":clock9:","๐Ÿ•˜"}, - {":clock10:","๐Ÿ•™"}, - {":clock11:","๐Ÿ•š"}, - {":clock630:","๐Ÿ•ก"}, - {":clock730:","๐Ÿ•ข"}, - {":clock830:","๐Ÿ•ฃ"}, - {":clock930:","๐Ÿ•ค"}, - {":clock1030:","๐Ÿ•ฅ"}, - {":clock1130:","๐Ÿ•ฆ"}, - {":heavy_multiplication_x:","โœ–๏ธ"}, - {":heavy_plus_sign:","โž•"}, - {":heavy_minus_sign:","โž–"}, - {":heavy_division_sign:","โž—"}, - {":spades:","โ™ ๏ธ"}, - {":hearts:","โ™ฅ๏ธ"}, - {":clubs:","โ™ฃ๏ธ"}, - {":diamonds:","โ™ฆ๏ธ"}, - {":white_flower:","๐Ÿ’ฎ"}, - {":heavy_check_mark:","โœ”๏ธ"}, - {":ballot_box_with_check:","โ˜‘๏ธ"}, - {":radio_button:","๐Ÿ”˜"}, - {":link:","๐Ÿ”—"}, - {":curly_loop:","โžฐ"}, - {":wavy_dash:","ใ€ฐ๏ธ"}, - {":part_alternation_mark:","ใ€ฝ๏ธ"}, - {":trident:","๐Ÿ”ฑ"}, - {":black_medium_square:","โ—ผ๏ธ"}, - {":white_medium_square:","โ—ป๏ธ"}, - {":black_medium_small_square:","โ—พ"}, - {":white_medium_small_square:","โ—ฝ"}, - {":black_small_square:","โ–ช๏ธ"}, - {":white_small_square:","โ–ซ๏ธ"}, - {":small_red_triangle:","๐Ÿ”บ"}, - {":black_square_button:","๐Ÿ”ฒ"}, - {":white_square_button:","๐Ÿ”ณ"}, - {":black_circle:","โšซ"}, - {":white_circle:","โšช"}, - {":red_circle:","๐Ÿ”ด"}, - {":large_blue_circle:","๐Ÿ”ต"}, - {":small_red_triangle_down:","๐Ÿ”ป"}, - {":white_large_square:","โฌœ"}, - {":black_large_square:","โฌ›"}, - {":large_orange_diamond:","๐Ÿ”ถ"}, - {":large_blue_diamond:","๐Ÿ”ท"}, - {":small_orange_diamond:","๐Ÿ”ธ"}, - {":small_blue_diamond:","๐Ÿ”น"} + {":100:", "๐Ÿ’ฏ"}, + {":1234:", "๐Ÿ”ข"}, + {":smile:", "๐Ÿ˜„"}, + {":smiley:", "๐Ÿ˜ƒ"}, + {":grinning:", "๐Ÿ˜€"}, + {":blush:", "๐Ÿ˜Š"}, + {":relaxed:", "โ˜บ๏ธ"}, + {":wink:", "๐Ÿ˜‰"}, + {":heart_eyes:", "๐Ÿ˜"}, + {":kissing_heart:", "๐Ÿ˜˜"}, + {":kissing_closed_eyes:", "๐Ÿ˜š"}, + {":kissing:", "๐Ÿ˜—"}, + {":kissing_smiling_eyes:", "๐Ÿ˜™"}, + {":stuck_out_tongue_winking_eye:", "๐Ÿ˜œ"}, + {":stuck_out_tongue_closed_eyes:", "๐Ÿ˜"}, + {":stuck_out_tongue:", "๐Ÿ˜›"}, + {":flushed:", "๐Ÿ˜ณ"}, + {":grin:", "๐Ÿ˜"}, + {":pensive:", "๐Ÿ˜”"}, + {":relieved:", "๐Ÿ˜Œ"}, + {":unamused:", "๐Ÿ˜’"}, + {":disappointed:", "๐Ÿ˜ž"}, + {":persevere:", "๐Ÿ˜ฃ"}, + {":cry:", "๐Ÿ˜ข"}, + {":joy:", "๐Ÿ˜‚"}, + {":sob:", "๐Ÿ˜ญ"}, + {":sleepy:", "๐Ÿ˜ช"}, + {":disappointed_relieved:", "๐Ÿ˜ฅ"}, + {":cold_sweat:", "๐Ÿ˜ฐ"}, + {":sweat_smile:", "๐Ÿ˜…"}, + {":sweat:", "๐Ÿ˜“"}, + {":weary:", "๐Ÿ˜ฉ"}, + {":tired_face:", "๐Ÿ˜ซ"}, + {":fearful:", "๐Ÿ˜จ"}, + {":scream:", "๐Ÿ˜ฑ"}, + {":angry:", "๐Ÿ˜ "}, + {":rage:", "๐Ÿ˜ก"}, + {":triumph:", "๐Ÿ˜ค"}, + {":confounded:", "๐Ÿ˜–"}, + {":laughing:", "๐Ÿ˜†"}, + {":satisfied:", "๐Ÿ˜†"}, + {":yum:", "๐Ÿ˜‹"}, + {":mask:", "๐Ÿ˜ท"}, + {":sunglasses:", "๐Ÿ˜Ž"}, + {":sleeping:", "๐Ÿ˜ด"}, + {":dizzy_face:", "๐Ÿ˜ต"}, + {":astonished:", "๐Ÿ˜ฒ"}, + {":worried:", "๐Ÿ˜Ÿ"}, + {":frowning:", "๐Ÿ˜ฆ"}, + {":anguished:", "๐Ÿ˜ง"}, + {":smiling_imp:", "๐Ÿ˜ˆ"}, + {":imp:", "๐Ÿ‘ฟ"}, + {":open_mouth:", "๐Ÿ˜ฎ"}, + {":grimacing:", "๐Ÿ˜ฌ"}, + {":neutral_face:", "๐Ÿ˜"}, + {":confused:", "๐Ÿ˜•"}, + {":hushed:", "๐Ÿ˜ฏ"}, + {":no_mouth:", "๐Ÿ˜ถ"}, + {":innocent:", "๐Ÿ˜‡"}, + {":smirk:", "๐Ÿ˜"}, + {":expressionless:", "๐Ÿ˜‘"}, + {":man_with_gua_pi_mao:", "๐Ÿ‘ฒ"}, + {":man_with_turban:", "๐Ÿ‘ณ"}, + {":cop:", "๐Ÿ‘ฎ"}, + {":construction_worker:", "๐Ÿ‘ท"}, + {":guardsman:", "๐Ÿ’‚"}, + {":baby:", "๐Ÿ‘ถ"}, + {":boy:", "๐Ÿ‘ฆ"}, + {":girl:", "๐Ÿ‘ง"}, + {":man:", "๐Ÿ‘จ"}, + {":woman:", "๐Ÿ‘ฉ"}, + {":older_man:", "๐Ÿ‘ด"}, + {":older_woman:", "๐Ÿ‘ต"}, + {":person_with_blond_hair:", "๐Ÿ‘ฑ"}, + {":angel:", "๐Ÿ‘ผ"}, + {":princess:", "๐Ÿ‘ธ"}, + {":smiley_cat:", "๐Ÿ˜บ"}, + {":smile_cat:", "๐Ÿ˜ธ"}, + {":heart_eyes_cat:", "๐Ÿ˜ป"}, + {":kissing_cat:", "๐Ÿ˜ฝ"}, + {":smirk_cat:", "๐Ÿ˜ผ"}, + {":scream_cat:", "๐Ÿ™€"}, + {":crying_cat_face:", "๐Ÿ˜ฟ"}, + {":joy_cat:", "๐Ÿ˜น"}, + {":pouting_cat:", "๐Ÿ˜พ"}, + {":japanese_ogre:", "๐Ÿ‘น"}, + {":japanese_goblin:", "๐Ÿ‘บ"}, + {":see_no_evil:", "๐Ÿ™ˆ"}, + {":hear_no_evil:", "๐Ÿ™‰"}, + {":speak_no_evil:", "๐Ÿ™Š"}, + {":skull:", "๐Ÿ’€"}, + {":alien:", "๐Ÿ‘ฝ"}, + {":hankey:", "๐Ÿ’ฉ"}, + {":poop:", "๐Ÿ’ฉ"}, + {":shit:", "๐Ÿ’ฉ"}, + {":fire:", "๐Ÿ”ฅ"}, + {":sparkles:", "โœจ"}, + {":star2:", "๐ŸŒŸ"}, + {":dizzy:", "๐Ÿ’ซ"}, + {":boom:", "๐Ÿ’ฅ"}, + {":collision:", "๐Ÿ’ฅ"}, + {":anger:", "๐Ÿ’ข"}, + {":sweat_drops:", "๐Ÿ’ฆ"}, + {":droplet:", "๐Ÿ’ง"}, + {":zzz:", "๐Ÿ’ค"}, + {":dash:", "๐Ÿ’จ"}, + {":ear:", "๐Ÿ‘‚"}, + {":eyes:", "๐Ÿ‘€"}, + {":nose:", "๐Ÿ‘ƒ"}, + {":tongue:", "๐Ÿ‘…"}, + {":lips:", "๐Ÿ‘„"}, + {":+1:", "๐Ÿ‘"}, + {":thumbsup:", "๐Ÿ‘"}, + {":-1:", "๐Ÿ‘Ž"}, + {":thumbsdown:", "๐Ÿ‘Ž"}, + {":ok_hand:", "๐Ÿ‘Œ"}, + {":facepunch:", "๐Ÿ‘Š"}, + {":punch:", "๐Ÿ‘Š"}, + {":fist:", "โœŠ"}, + {":v:", "โœŒ๏ธ"}, + {":wave:", "๐Ÿ‘‹"}, + {":hand:", "โœ‹"}, + {":raised_hand:", "โœ‹"}, + {":open_hands:", "๐Ÿ‘"}, + {":point_up_2:", "๐Ÿ‘†"}, + {":point_down:", "๐Ÿ‘‡"}, + {":point_right:", "๐Ÿ‘‰"}, + {":point_left:", "๐Ÿ‘ˆ"}, + {":raised_hands:", "๐Ÿ™Œ"}, + {":pray:", "๐Ÿ™"}, + {":point_up:", "โ˜๏ธ"}, + {":clap:", "๐Ÿ‘"}, + {":muscle:", "๐Ÿ’ช"}, + {":walking:", "๐Ÿšถ"}, + {":runner:", "๐Ÿƒ"}, + {":running:", "๐Ÿƒ"}, + {":dancer:", "๐Ÿ’ƒ"}, + {":couple:", "๐Ÿ‘ซ"}, + {":family:", "๐Ÿ‘ช"}, + {":two_men_holding_hands:", "๐Ÿ‘ฌ"}, + {":two_women_holding_hands:", "๐Ÿ‘ญ"}, + {":couplekiss:", "๐Ÿ’"}, + {":couple_with_heart:", "๐Ÿ’‘"}, + {":dancers:", "๐Ÿ‘ฏ"}, + {":ok_woman:", "๐Ÿ™†"}, + {":no_good:", "๐Ÿ™…"}, + {":information_desk_person:", "๐Ÿ’"}, + {":raising_hand:", "๐Ÿ™‹"}, + {":massage:", "๐Ÿ’†"}, + {":haircut:", "๐Ÿ’‡"}, + {":nail_care:", "๐Ÿ’…"}, + {":bride_with_veil:", "๐Ÿ‘ฐ"}, + {":person_with_pouting_face:", "๐Ÿ™Ž"}, + {":person_frowning:", "๐Ÿ™"}, + {":bow:", "๐Ÿ™‡"}, + {":tophat:", "๐ŸŽฉ"}, + {":crown:", "๐Ÿ‘‘"}, + {":womans_hat:", "๐Ÿ‘’"}, + {":athletic_shoe:", "๐Ÿ‘Ÿ"}, + {":mans_shoe:", "๐Ÿ‘ž"}, + {":shoe:", "๐Ÿ‘ž"}, + {":sandal:", "๐Ÿ‘ก"}, + {":high_heel:", "๐Ÿ‘ "}, + {":boot:", "๐Ÿ‘ข"}, + {":shirt:", "๐Ÿ‘•"}, + {":tshirt:", "๐Ÿ‘•"}, + {":necktie:", "๐Ÿ‘”"}, + {":womans_clothes:", "๐Ÿ‘š"}, + {":dress:", "๐Ÿ‘—"}, + {":running_shirt_with_sash:", "๐ŸŽฝ"}, + {":jeans:", "๐Ÿ‘–"}, + {":kimono:", "๐Ÿ‘˜"}, + {":bikini:", "๐Ÿ‘™"}, + {":briefcase:", "๐Ÿ’ผ"}, + {":handbag:", "๐Ÿ‘œ"}, + {":pouch:", "๐Ÿ‘"}, + {":purse:", "๐Ÿ‘›"}, + {":eyeglasses:", "๐Ÿ‘“"}, + {":ribbon:", "๐ŸŽ€"}, + {":closed_umbrella:", "๐ŸŒ‚"}, + {":lipstick:", "๐Ÿ’„"}, + {":yellow_heart:", "๐Ÿ’›"}, + {":blue_heart:", "๐Ÿ’™"}, + {":purple_heart:", "๐Ÿ’œ"}, + {":green_heart:", "๐Ÿ’š"}, + {":heart:", "โค๏ธ"}, + {":broken_heart:", "๐Ÿ’”"}, + {":heartpulse:", "๐Ÿ’—"}, + {":heartbeat:", "๐Ÿ’“"}, + {":two_hearts:", "๐Ÿ’•"}, + {":sparkling_heart:", "๐Ÿ’–"}, + {":revolving_hearts:", "๐Ÿ’ž"}, + {":cupid:", "๐Ÿ’˜"}, + {":love_letter:", "๐Ÿ’Œ"}, + {":kiss:", "๐Ÿ’‹"}, + {":ring:", "๐Ÿ’"}, + {":gem:", "๐Ÿ’Ž"}, + {":bust_in_silhouette:", "๐Ÿ‘ค"}, + {":busts_in_silhouette:", "๐Ÿ‘ฅ"}, + {":speech_balloon:", "๐Ÿ’ฌ"}, + {":footprints:", "๐Ÿ‘ฃ"}, + {":thought_balloon:", "๐Ÿ’ญ"}, + {":dog:", "๐Ÿถ"}, + {":wolf:", "๐Ÿบ"}, + {":cat:", "๐Ÿฑ"}, + {":mouse:", "๐Ÿญ"}, + {":hamster:", "๐Ÿน"}, + {":rabbit:", "๐Ÿฐ"}, + {":frog:", "๐Ÿธ"}, + {":tiger:", "๐Ÿฏ"}, + {":koala:", "๐Ÿจ"}, + {":bear:", "๐Ÿป"}, + {":pig:", "๐Ÿท"}, + {":pig_nose:", "๐Ÿฝ"}, + {":cow:", "๐Ÿฎ"}, + {":boar:", "๐Ÿ—"}, + {":monkey_face:", "๐Ÿต"}, + {":monkey:", "๐Ÿ’"}, + {":horse:", "๐Ÿด"}, + {":sheep:", "๐Ÿ‘"}, + {":elephant:", "๐Ÿ˜"}, + {":panda_face:", "๐Ÿผ"}, + {":penguin:", "๐Ÿง"}, + {":bird:", "๐Ÿฆ"}, + {":baby_chick:", "๐Ÿค"}, + {":hatched_chick:", "๐Ÿฅ"}, + {":hatching_chick:", "๐Ÿฃ"}, + {":chicken:", "๐Ÿ”"}, + {":snake:", "๐Ÿ"}, + {":turtle:", "๐Ÿข"}, + {":bug:", "๐Ÿ›"}, + {":bee:", "๐Ÿ"}, + {":honeybee:", "๐Ÿ"}, + {":ant:", "๐Ÿœ"}, + {":beetle:", "๐Ÿž"}, + {":snail:", "๐ŸŒ"}, + {":octopus:", "๐Ÿ™"}, + {":shell:", "๐Ÿš"}, + {":tropical_fish:", "๐Ÿ "}, + {":fish:", "๐ŸŸ"}, + {":dolphin:", "๐Ÿฌ"}, + {":flipper:", "๐Ÿฌ"}, + {":whale:", "๐Ÿณ"}, + {":whale2:", "๐Ÿ‹"}, + {":cow2:", "๐Ÿ„"}, + {":ram:", "๐Ÿ"}, + {":rat:", "๐Ÿ€"}, + {":water_buffalo:", "๐Ÿƒ"}, + {":tiger2:", "๐Ÿ…"}, + {":rabbit2:", "๐Ÿ‡"}, + {":dragon:", "๐Ÿ‰"}, + {":racehorse:", "๐ŸŽ"}, + {":goat:", "๐Ÿ"}, + {":rooster:", "๐Ÿ“"}, + {":dog2:", "๐Ÿ•"}, + {":pig2:", "๐Ÿ–"}, + {":mouse2:", "๐Ÿ"}, + {":ox:", "๐Ÿ‚"}, + {":dragon_face:", "๐Ÿฒ"}, + {":blowfish:", "๐Ÿก"}, + {":crocodile:", "๐ŸŠ"}, + {":camel:", "๐Ÿซ"}, + {":dromedary_camel:", "๐Ÿช"}, + {":leopard:", "๐Ÿ†"}, + {":cat2:", "๐Ÿˆ"}, + {":poodle:", "๐Ÿฉ"}, + {":feet:", "๐Ÿพ"}, + {":paw_prints:", "๐Ÿพ"}, + {":bouquet:", "๐Ÿ’"}, + {":cherry_blossom:", "๐ŸŒธ"}, + {":tulip:", "๐ŸŒท"}, + {":four_leaf_clover:", "๐Ÿ€"}, + {":rose:", "๐ŸŒน"}, + {":sunflower:", "๐ŸŒป"}, + {":hibiscus:", "๐ŸŒบ"}, + {":maple_leaf:", "๐Ÿ"}, + {":leaves:", "๐Ÿƒ"}, + {":fallen_leaf:", "๐Ÿ‚"}, + {":herb:", "๐ŸŒฟ"}, + {":ear_of_rice:", "๐ŸŒพ"}, + {":mushroom:", "๐Ÿ„"}, + {":cactus:", "๐ŸŒต"}, + {":palm_tree:", "๐ŸŒด"}, + {":evergreen_tree:", "๐ŸŒฒ"}, + {":deciduous_tree:", "๐ŸŒณ"}, + {":chestnut:", "๐ŸŒฐ"}, + {":seedling:", "๐ŸŒฑ"}, + {":blossom:", "๐ŸŒผ"}, + {":globe_with_meridians:", "๐ŸŒ"}, + {":sun_with_face:", "๐ŸŒž"}, + {":full_moon_with_face:", "๐ŸŒ"}, + {":new_moon_with_face:", "๐ŸŒš"}, + {":new_moon:", "๐ŸŒ‘"}, + {":waxing_crescent_moon:", "๐ŸŒ’"}, + {":first_quarter_moon:", "๐ŸŒ“"}, + {":moon:", "๐ŸŒ”"}, + {":waxing_gibbous_moon:", "๐ŸŒ”"}, + {":full_moon:", "๐ŸŒ•"}, + {":waning_gibbous_moon:", "๐ŸŒ–"}, + {":last_quarter_moon:", "๐ŸŒ—"}, + {":waning_crescent_moon:", "๐ŸŒ˜"}, + {":last_quarter_moon_with_face:", "๐ŸŒœ"}, + {":first_quarter_moon_with_face:", "๐ŸŒ›"}, + {":crescent_moon:", "๐ŸŒ™"}, + {":earth_africa:", "๐ŸŒ"}, + {":earth_americas:", "๐ŸŒŽ"}, + {":earth_asia:", "๐ŸŒ"}, + {":volcano:", "๐ŸŒ‹"}, + {":milky_way:", "๐ŸŒŒ"}, + {":stars:", "๐ŸŒ "}, + {":star:", "โญ"}, + {":sunny:", "โ˜€๏ธ"}, + {":partly_sunny:", "โ›…"}, + {":cloud:", "โ˜๏ธ"}, + {":zap:", "โšก"}, + {":umbrella:", "โ˜”"}, + {":snowflake:", "โ„๏ธ"}, + {":snowman:", "โ›„"}, + {":cyclone:", "๐ŸŒ€"}, + {":foggy:", "๐ŸŒ"}, + {":rainbow:", "๐ŸŒˆ"}, + {":ocean:", "๐ŸŒŠ"}, + {":bamboo:", "๐ŸŽ"}, + {":gift_heart:", "๐Ÿ’"}, + {":dolls:", "๐ŸŽŽ"}, + {":school_satchel:", "๐ŸŽ’"}, + {":mortar_board:", "๐ŸŽ“"}, + {":flags:", "๐ŸŽ"}, + {":fireworks:", "๐ŸŽ†"}, + {":sparkler:", "๐ŸŽ‡"}, + {":wind_chime:", "๐ŸŽ"}, + {":rice_scene:", "๐ŸŽ‘"}, + {":jack_o_lantern:", "๐ŸŽƒ"}, + {":ghost:", "๐Ÿ‘ป"}, + {":santa:", "๐ŸŽ…"}, + {":christmas_tree:", "๐ŸŽ„"}, + {":gift:", "๐ŸŽ"}, + {":tanabata_tree:", "๐ŸŽ‹"}, + {":tada:", "๐ŸŽ‰"}, + {":confetti_ball:", "๐ŸŽŠ"}, + {":balloon:", "๐ŸŽˆ"}, + {":crossed_flags:", "๐ŸŽŒ"}, + {":crystal_ball:", "๐Ÿ”ฎ"}, + {":movie_camera:", "๐ŸŽฅ"}, + {":camera:", "๐Ÿ“ท"}, + {":video_camera:", "๐Ÿ“น"}, + {":vhs:", "๐Ÿ“ผ"}, + {":cd:", "๐Ÿ’ฟ"}, + {":dvd:", "๐Ÿ“€"}, + {":minidisc:", "๐Ÿ’ฝ"}, + {":floppy_disk:", "๐Ÿ’พ"}, + {":computer:", "๐Ÿ’ป"}, + {":iphone:", "๐Ÿ“ฑ"}, + {":phone:", "โ˜Ž๏ธ"}, + {":telephone:", "โ˜Ž๏ธ"}, + {":telephone_receiver:", "๐Ÿ“ž"}, + {":pager:", "๐Ÿ“Ÿ"}, + {":fax:", "๐Ÿ“ "}, + {":satellite:", "๐Ÿ“ก"}, + {":tv:", "๐Ÿ“บ"}, + {":radio:", "๐Ÿ“ป"}, + {":loud_sound:", "๐Ÿ”Š"}, + {":sound:", "๐Ÿ”‰"}, + {":speaker:", "๐Ÿ”ˆ"}, + {":mute:", "๐Ÿ”‡"}, + {":bell:", "๐Ÿ””"}, + {":no_bell:", "๐Ÿ”•"}, + {":loudspeaker:", "๐Ÿ“ข"}, + {":mega:", "๐Ÿ“ฃ"}, + {":hourglass_flowing_sand:", "โณ"}, + {":hourglass:", "โŒ›"}, + {":alarm_clock:", "โฐ"}, + {":watch:", "โŒš"}, + {":unlock:", "๐Ÿ”“"}, + {":lock:", "๐Ÿ”’"}, + {":lock_with_ink_pen:", "๐Ÿ”"}, + {":closed_lock_with_key:", "๐Ÿ”"}, + {":key:", "๐Ÿ”‘"}, + {":mag_right:", "๐Ÿ”Ž"}, + {":bulb:", "๐Ÿ’ก"}, + {":flashlight:", "๐Ÿ”ฆ"}, + {":high_brightness:", "๐Ÿ”†"}, + {":low_brightness:", "๐Ÿ”…"}, + {":electric_plug:", "๐Ÿ”Œ"}, + {":battery:", "๐Ÿ”‹"}, + {":mag:", "๐Ÿ”"}, + {":bathtub:", "๐Ÿ›"}, + {":bath:", "๐Ÿ›€"}, + {":shower:", "๐Ÿšฟ"}, + {":toilet:", "๐Ÿšฝ"}, + {":wrench:", "๐Ÿ”ง"}, + {":nut_and_bolt:", "๐Ÿ”ฉ"}, + {":hammer:", "๐Ÿ”จ"}, + {":door:", "๐Ÿšช"}, + {":smoking:", "๐Ÿšฌ"}, + {":bomb:", "๐Ÿ’ฃ"}, + {":gun:", "๐Ÿ”ซ"}, + {":hocho:", "๐Ÿ”ช"}, + {":knife:", "๐Ÿ”ช"}, + {":pill:", "๐Ÿ’Š"}, + {":syringe:", "๐Ÿ’‰"}, + {":moneybag:", "๐Ÿ’ฐ"}, + {":yen:", "๐Ÿ’ด"}, + {":dollar:", "๐Ÿ’ต"}, + {":pound:", "๐Ÿ’ท"}, + {":euro:", "๐Ÿ’ถ"}, + {":credit_card:", "๐Ÿ’ณ"}, + {":money_with_wings:", "๐Ÿ’ธ"}, + {":calling:", "๐Ÿ“ฒ"}, + {":e-mail:", "๐Ÿ“ง"}, + {":inbox_tray:", "๐Ÿ“ฅ"}, + {":outbox_tray:", "๐Ÿ“ค"}, + {":email:", "โœ‰๏ธ"}, + {":envelope:", "โœ‰๏ธ"}, + {":envelope_with_arrow:", "๐Ÿ“ฉ"}, + {":incoming_envelope:", "๐Ÿ“จ"}, + {":postal_horn:", "๐Ÿ“ฏ"}, + {":mailbox:", "๐Ÿ“ซ"}, + {":mailbox_closed:", "๐Ÿ“ช"}, + {":mailbox_with_mail:", "๐Ÿ“ฌ"}, + {":mailbox_with_no_mail:", "๐Ÿ“ญ"}, + {":postbox:", "๐Ÿ“ฎ"}, + {":package:", "๐Ÿ“ฆ"}, + {":memo:", "๐Ÿ“"}, + {":pencil:", "๐Ÿ“"}, + {":page_facing_up:", "๐Ÿ“„"}, + {":page_with_curl:", "๐Ÿ“ƒ"}, + {":bookmark_tabs:", "๐Ÿ“‘"}, + {":bar_chart:", "๐Ÿ“Š"}, + {":chart_with_upwards_trend:", "๐Ÿ“ˆ"}, + {":chart_with_downwards_trend:", "๐Ÿ“‰"}, + {":scroll:", "๐Ÿ“œ"}, + {":clipboard:", "๐Ÿ“‹"}, + {":date:", "๐Ÿ“…"}, + {":calendar:", "๐Ÿ“†"}, + {":card_index:", "๐Ÿ“‡"}, + {":file_folder:", "๐Ÿ“"}, + {":open_file_folder:", "๐Ÿ“‚"}, + {":scissors:", "โœ‚๏ธ"}, + {":pushpin:", "๐Ÿ“Œ"}, + {":paperclip:", "๐Ÿ“Ž"}, + {":black_nib:", "โœ’๏ธ"}, + {":pencil2:", "โœ๏ธ"}, + {":straight_ruler:", "๐Ÿ“"}, + {":triangular_ruler:", "๐Ÿ“"}, + {":closed_book:", "๐Ÿ“•"}, + {":green_book:", "๐Ÿ“—"}, + {":blue_book:", "๐Ÿ“˜"}, + {":orange_book:", "๐Ÿ“™"}, + {":notebook:", "๐Ÿ““"}, + {":notebook_with_decorative_cover:", "๐Ÿ“”"}, + {":ledger:", "๐Ÿ“’"}, + {":books:", "๐Ÿ“š"}, + {":book:", "๐Ÿ“–"}, + {":open_book:", "๐Ÿ“–"}, + {":bookmark:", "๐Ÿ”–"}, + {":name_badge:", "๐Ÿ“›"}, + {":microscope:", "๐Ÿ”ฌ"}, + {":telescope:", "๐Ÿ”ญ"}, + {":newspaper:", "๐Ÿ“ฐ"}, + {":art:", "๐ŸŽจ"}, + {":clapper:", "๐ŸŽฌ"}, + {":microphone:", "๐ŸŽค"}, + {":headphones:", "๐ŸŽง"}, + {":musical_score:", "๐ŸŽผ"}, + {":musical_note:", "๐ŸŽต"}, + {":notes:", "๐ŸŽถ"}, + {":musical_keyboard:", "๐ŸŽน"}, + {":violin:", "๐ŸŽป"}, + {":trumpet:", "๐ŸŽบ"}, + {":saxophone:", "๐ŸŽท"}, + {":guitar:", "๐ŸŽธ"}, + {":space_invader:", "๐Ÿ‘พ"}, + {":video_game:", "๐ŸŽฎ"}, + {":black_joker:", "๐Ÿƒ"}, + {":flower_playing_cards:", "๐ŸŽด"}, + {":mahjong:", "๐Ÿ€„"}, + {":game_die:", "๐ŸŽฒ"}, + {":dart:", "๐ŸŽฏ"}, + {":football:", "๐Ÿˆ"}, + {":basketball:", "๐Ÿ€"}, + {":soccer:", "โšฝ"}, + {":baseball:", "โšพ๏ธ"}, + {":tennis:", "๐ŸŽพ"}, + {":8ball:", "๐ŸŽฑ"}, + {":rugby_football:", "๐Ÿ‰"}, + {":bowling:", "๐ŸŽณ"}, + {":golf:", "โ›ณ"}, + {":mountain_bicyclist:", "๐Ÿšต"}, + {":bicyclist:", "๐Ÿšด"}, + {":checkered_flag:", "๐Ÿ"}, + {":horse_racing:", "๐Ÿ‡"}, + {":trophy:", "๐Ÿ†"}, + {":ski:", "๐ŸŽฟ"}, + {":snowboarder:", "๐Ÿ‚"}, + {":swimmer:", "๐ŸŠ"}, + {":surfer:", "๐Ÿ„"}, + {":fishing_pole_and_fish:", "๐ŸŽฃ"}, + {":coffee:", "โ˜•"}, + {":tea:", "๐Ÿต"}, + {":sake:", "๐Ÿถ"}, + {":baby_bottle:", "๐Ÿผ"}, + {":beer:", "๐Ÿบ"}, + {":beers:", "๐Ÿป"}, + {":cocktail:", "๐Ÿธ"}, + {":tropical_drink:", "๐Ÿน"}, + {":wine_glass:", "๐Ÿท"}, + {":fork_and_knife:", "๐Ÿด"}, + {":pizza:", "๐Ÿ•"}, + {":hamburger:", "๐Ÿ”"}, + {":fries:", "๐ŸŸ"}, + {":poultry_leg:", "๐Ÿ—"}, + {":meat_on_bone:", "๐Ÿ–"}, + {":spaghetti:", "๐Ÿ"}, + {":curry:", "๐Ÿ›"}, + {":fried_shrimp:", "๐Ÿค"}, + {":bento:", "๐Ÿฑ"}, + {":sushi:", "๐Ÿฃ"}, + {":fish_cake:", "๐Ÿฅ"}, + {":rice_ball:", "๐Ÿ™"}, + {":rice_cracker:", "๐Ÿ˜"}, + {":rice:", "๐Ÿš"}, + {":ramen:", "๐Ÿœ"}, + {":stew:", "๐Ÿฒ"}, + {":oden:", "๐Ÿข"}, + {":dango:", "๐Ÿก"}, + {":egg:", "๐Ÿณ"}, + {":bread:", "๐Ÿž"}, + {":doughnut:", "๐Ÿฉ"}, + {":custard:", "๐Ÿฎ"}, + {":icecream:", "๐Ÿฆ"}, + {":ice_cream:", "๐Ÿจ"}, + {":shaved_ice:", "๐Ÿง"}, + {":birthday:", "๐ŸŽ‚"}, + {":cake:", "๐Ÿฐ"}, + {":cookie:", "๐Ÿช"}, + {":chocolate_bar:", "๐Ÿซ"}, + {":candy:", "๐Ÿฌ"}, + {":lollipop:", "๐Ÿญ"}, + {":honey_pot:", "๐Ÿฏ"}, + {":apple:", "๐ŸŽ"}, + {":green_apple:", "๐Ÿ"}, + {":tangerine:", "๐ŸŠ"}, + {":lemon:", "๐Ÿ‹"}, + {":cherries:", "๐Ÿ’"}, + {":grapes:", "๐Ÿ‡"}, + {":watermelon:", "๐Ÿ‰"}, + {":strawberry:", "๐Ÿ“"}, + {":peach:", "๐Ÿ‘"}, + {":melon:", "๐Ÿˆ"}, + {":banana:", "๐ŸŒ"}, + {":pear:", "๐Ÿ"}, + {":pineapple:", "๐Ÿ"}, + {":sweet_potato:", "๐Ÿ "}, + {":eggplant:", "๐Ÿ†"}, + {":tomato:", "๐Ÿ…"}, + {":corn:", "๐ŸŒฝ"}, + {":house:", "๐Ÿ "}, + {":house_with_garden:", "๐Ÿก"}, + {":school:", "๐Ÿซ"}, + {":office:", "๐Ÿข"}, + {":post_office:", "๐Ÿฃ"}, + {":hospital:", "๐Ÿฅ"}, + {":bank:", "๐Ÿฆ"}, + {":convenience_store:", "๐Ÿช"}, + {":love_hotel:", "๐Ÿฉ"}, + {":hotel:", "๐Ÿจ"}, + {":wedding:", "๐Ÿ’’"}, + {":church:", "โ›ช"}, + {":department_store:", "๐Ÿฌ"}, + {":european_post_office:", "๐Ÿค"}, + {":city_sunrise:", "๐ŸŒ‡"}, + {":city_sunset:", "๐ŸŒ†"}, + {":japanese_castle:", "๐Ÿฏ"}, + {":european_castle:", "๐Ÿฐ"}, + {":tent:", "โ›บ"}, + {":factory:", "๐Ÿญ"}, + {":tokyo_tower:", "๐Ÿ—ผ"}, + {":japan:", "๐Ÿ—พ"}, + {":mount_fuji:", "๐Ÿ—ป"}, + {":sunrise_over_mountains:", "๐ŸŒ„"}, + {":sunrise:", "๐ŸŒ…"}, + {":night_with_stars:", "๐ŸŒƒ"}, + {":statue_of_liberty:", "๐Ÿ—ฝ"}, + {":bridge_at_night:", "๐ŸŒ‰"}, + {":carousel_horse:", "๐ŸŽ "}, + {":ferris_wheel:", "๐ŸŽก"}, + {":fountain:", "โ›ฒ"}, + {":roller_coaster:", "๐ŸŽข"}, + {":ship:", "๐Ÿšข"}, + {":boat:", "โ›ต"}, + {":sailboat:", "โ›ต"}, + {":speedboat:", "๐Ÿšค"}, + {":rowboat:", "๐Ÿšฃ"}, + {":anchor:", "โš“"}, + {":rocket:", "๐Ÿš€"}, + {":airplane:", "โœˆ๏ธ"}, + {":seat:", "๐Ÿ’บ"}, + {":helicopter:", "๐Ÿš"}, + {":steam_locomotive:", "๐Ÿš‚"}, + {":tram:", "๐ŸšŠ"}, + {":station:", "๐Ÿš‰"}, + {":mountain_railway:", "๐Ÿšž"}, + {":train2:", "๐Ÿš†"}, + {":bullettrain_side:", "๐Ÿš„"}, + {":bullettrain_front:", "๐Ÿš…"}, + {":light_rail:", "๐Ÿšˆ"}, + {":metro:", "๐Ÿš‡"}, + {":monorail:", "๐Ÿš"}, + {":train:", "๐Ÿš‹"}, + {":railway_car:", "๐Ÿšƒ"}, + {":trolleybus:", "๐ŸšŽ"}, + {":bus:", "๐ŸšŒ"}, + {":oncoming_bus:", "๐Ÿš"}, + {":blue_car:", "๐Ÿš™"}, + {":oncoming_automobile:", "๐Ÿš˜"}, + {":car:", "๐Ÿš—"}, + {":red_car:", "๐Ÿš—"}, + {":taxi:", "๐Ÿš•"}, + {":oncoming_taxi:", "๐Ÿš–"}, + {":articulated_lorry:", "๐Ÿš›"}, + {":truck:", "๐Ÿšš"}, + {":rotating_light:", "๐Ÿšจ"}, + {":police_car:", "๐Ÿš“"}, + {":oncoming_police_car:", "๐Ÿš”"}, + {":fire_engine:", "๐Ÿš’"}, + {":ambulance:", "๐Ÿš‘"}, + {":minibus:", "๐Ÿš"}, + {":bike:", "๐Ÿšฒ"}, + {":aerial_tramway:", "๐Ÿšก"}, + {":suspension_railway:", "๐ŸšŸ"}, + {":mountain_cableway:", "๐Ÿš "}, + {":tractor:", "๐Ÿšœ"}, + {":barber:", "๐Ÿ’ˆ"}, + {":busstop:", "๐Ÿš"}, + {":ticket:", "๐ŸŽซ"}, + {":vertical_traffic_light:", "๐Ÿšฆ"}, + {":traffic_light:", "๐Ÿšฅ"}, + {":warning:", "โš ๏ธ"}, + {":construction:", "๐Ÿšง"}, + {":beginner:", "๐Ÿ”ฐ"}, + {":fuelpump:", "โ›ฝ"}, + {":izakaya_lantern:", "๐Ÿฎ"}, + {":lantern:", "๐Ÿฎ"}, + {":slot_machine:", "๐ŸŽฐ"}, + {":hotsprings:", "โ™จ๏ธ"}, + {":moyai:", "๐Ÿ—ฟ"}, + {":circus_tent:", "๐ŸŽช"}, + {":performing_arts:", "๐ŸŽญ"}, + {":round_pushpin:", "๐Ÿ“"}, + {":triangular_flag_on_post:", "๐Ÿšฉ"}, + {":jp:", "๐Ÿ‡ฏ๐Ÿ‡ต"}, + {":kr:", "๐Ÿ‡ฐ๐Ÿ‡ท"}, + {":de:", "๐Ÿ‡ฉ๐Ÿ‡ช"}, + {":cn:", "๐Ÿ‡จ๐Ÿ‡ณ"}, + {":us:", "๐Ÿ‡บ๐Ÿ‡ธ"}, + {":fr:", "๐Ÿ‡ซ๐Ÿ‡ท"}, + {":es:", "๐Ÿ‡ช๐Ÿ‡ธ"}, + {":it:", "๐Ÿ‡ฎ๐Ÿ‡น"}, + {":ru:", "๐Ÿ‡ท๐Ÿ‡บ"}, + {":gb:", "๐Ÿ‡ฌ๐Ÿ‡ง"}, + {":uk:", "๐Ÿ‡ฌ๐Ÿ‡ง"}, + {":one:", "1๏ธโƒฃ"}, + {":two:", "2๏ธโƒฃ"}, + {":three:", "3๏ธโƒฃ"}, + {":four:", "4๏ธโƒฃ"}, + {":five:", "5๏ธโƒฃ"}, + {":six:", "6๏ธโƒฃ"}, + {":seven:", "7๏ธโƒฃ"}, + {":eight:", "8๏ธโƒฃ"}, + {":nine:", "9๏ธโƒฃ"}, + {":zero:", "0๏ธโƒฃ"}, + {":keycap_ten:", "๐Ÿ”Ÿ"}, + {":hash:", "#๏ธโƒฃ"}, + {":symbols:", "๐Ÿ”ฃ"}, + {":arrow_up:", "โฌ†๏ธ"}, + {":arrow_down:", "โฌ‡๏ธ"}, + {":arrow_left:", "โฌ…๏ธ"}, + {":arrow_right:", "โžก๏ธ"}, + {":capital_abcd:", "๐Ÿ” "}, + {":abcd:", "๐Ÿ”ก"}, + {":abc:", "๐Ÿ”ค"}, + {":arrow_upper_right:", "โ†—๏ธ"}, + {":arrow_upper_left:", "โ†–๏ธ"}, + {":arrow_lower_right:", "โ†˜๏ธ"}, + {":arrow_lower_left:", "โ†™๏ธ"}, + {":left_right_arrow:", "โ†”๏ธ"}, + {":arrow_up_down:", "โ†•๏ธ"}, + {":arrows_counterclockwise:", "๐Ÿ”„"}, + {":arrow_backward:", "โ—€๏ธ"}, + {":arrow_forward:", "โ–ถ๏ธ"}, + {":arrow_up_small:", "๐Ÿ”ผ"}, + {":arrow_down_small:", "๐Ÿ”ฝ"}, + {":leftwards_arrow_with_hook:", "โ†ฉ๏ธ"}, + {":arrow_right_hook:", "โ†ช๏ธ"}, + {":information_source:", "โ„น๏ธ"}, + {":rewind:", "โช"}, + {":fast_forward:", "โฉ"}, + {":arrow_double_up:", "โซ"}, + {":arrow_double_down:", "โฌ"}, + {":arrow_heading_down:", "โคต๏ธ"}, + {":arrow_heading_up:", "โคด๏ธ"}, + {":ok:", "๐Ÿ†—"}, + {":twisted_rightwards_arrows:", "๐Ÿ”€"}, + {":repeat:", "๐Ÿ”"}, + {":repeat_one:", "๐Ÿ”‚"}, + {":new:", "๐Ÿ†•"}, + {":up:", "๐Ÿ†™"}, + {":cool:", "๐Ÿ†’"}, + {":free:", "๐Ÿ†“"}, + {":ng:", "๐Ÿ†–"}, + {":signal_strength:", "๐Ÿ“ถ"}, + {":cinema:", "๐ŸŽฆ"}, + {":koko:", "๐Ÿˆ"}, + {":u6307:", "๐Ÿˆฏ"}, + {":u7a7a:", "๐Ÿˆณ"}, + {":u6e80:", "๐Ÿˆต"}, + {":u5408:", "๐Ÿˆด"}, + {":u7981:", "๐Ÿˆฒ"}, + {":ideograph_advantage:", "๐Ÿ‰"}, + {":u5272:", "๐Ÿˆน"}, + {":u55b6:", "๐Ÿˆบ"}, + {":u6709:", "๐Ÿˆถ"}, + {":u7121:", "๐Ÿˆš"}, + {":restroom:", "๐Ÿšป"}, + {":mens:", "๐Ÿšน"}, + {":womens:", "๐Ÿšบ"}, + {":baby_symbol:", "๐Ÿšผ"}, + {":wc:", "๐Ÿšพ"}, + {":potable_water:", "๐Ÿšฐ"}, + {":put_litter_in_its_place:", "๐Ÿšฎ"}, + {":parking:", "๐Ÿ…ฟ๏ธ"}, + {":wheelchair:", "โ™ฟ"}, + {":no_smoking:", "๐Ÿšญ"}, + {":u6708:", "๐Ÿˆท๏ธ"}, + {":u7533:", "๐Ÿˆธ"}, + {":sa:", "๐Ÿˆ‚๏ธ"}, + {":m:", "โ“‚๏ธ"}, + {":passport_control:", "๐Ÿ›‚"}, + {":baggage_claim:", "๐Ÿ›„"}, + {":left_luggage:", "๐Ÿ›…"}, + {":customs:", "๐Ÿ›ƒ"}, + {":accept:", "๐Ÿ‰‘"}, + {":secret:", "ใŠ™๏ธ"}, + {":congratulations:", "ใŠ—๏ธ"}, + {":cl:", "๐Ÿ†‘"}, + {":sos:", "๐Ÿ†˜"}, + {":id:", "๐Ÿ†”"}, + {":no_entry_sign:", "๐Ÿšซ"}, + {":underage:", "๐Ÿ”ž"}, + {":no_mobile_phones:", "๐Ÿ“ต"}, + {":do_not_litter:", "๐Ÿšฏ"}, + {":non-potable_water:", "๐Ÿšฑ"}, + {":no_bicycles:", "๐Ÿšณ"}, + {":no_pedestrians:", "๐Ÿšท"}, + {":children_crossing:", "๐Ÿšธ"}, + {":no_entry:", "โ›”"}, + {":eight_spoked_asterisk:", "โœณ๏ธ"}, + {":sparkle:", "โ‡๏ธ"}, + {":negative_squared_cross_mark:", "โŽ"}, + {":white_check_mark:", "โœ…"}, + {":eight_pointed_black_star:", "โœด๏ธ"}, + {":heart_decoration:", "๐Ÿ’Ÿ"}, + {":vs:", "๐Ÿ†š"}, + {":vibration_mode:", "๐Ÿ“ณ"}, + {":mobile_phone_off:", "๐Ÿ“ด"}, + {":a:", "๐Ÿ…ฐ๏ธ"}, + {":b:", "๐Ÿ…ฑ๏ธ"}, + {":ab:", "๐Ÿ†Ž"}, + {":o2:", "๐Ÿ…พ๏ธ"}, + {":diamond_shape_with_a_dot_inside:", "๐Ÿ’ "}, + {":loop:", "โžฟ"}, + {":recycle:", "โ™ป๏ธ"}, + {":aries:", "โ™ˆ"}, + {":taurus:", "โ™‰"}, + {":gemini:", "โ™Š"}, + {":cancer:", "โ™‹"}, + {":leo:", "โ™Œ"}, + {":virgo:", "โ™"}, + {":libra:", "โ™Ž"}, + {":scorpius:", "โ™"}, + {":sagittarius:", "โ™"}, + {":capricorn:", "โ™‘"}, + {":aquarius:", "โ™’"}, + {":pisces:", "โ™“"}, + {":ophiuchus:", "โ›Ž"}, + {":six_pointed_star:", "๐Ÿ”ฏ"}, + {":atm:", "๐Ÿง"}, + {":chart:", "๐Ÿ’น"}, + {":heavy_dollar_sign:", "๐Ÿ’ฒ"}, + {":currency_exchange:", "๐Ÿ’ฑ"}, + {":copyright:", "ยฉ๏ธ"}, + {":registered:", "ยฎ๏ธ"}, + {":tm:", "โ„ข๏ธ"}, + {":x:", "โŒ"}, + {":bangbang:", "โ€ผ๏ธ"}, + {":interrobang:", "โ‰๏ธ"}, + {":exclamation:", "โ—"}, + {":heavy_exclamation_mark:", "โ—"}, + {":question:", "โ“"}, + {":grey_exclamation:", "โ•"}, + {":grey_question:", "โ”"}, + {":o:", "โญ•"}, + {":top:", "๐Ÿ”"}, + {":end:", "๐Ÿ”š"}, + {":back:", "๐Ÿ”™"}, + {":on:", "๐Ÿ”›"}, + {":soon:", "๐Ÿ”œ"}, + {":arrows_clockwise:", "๐Ÿ”ƒ"}, + {":clock12:", "๐Ÿ•›"}, + {":clock1230:", "๐Ÿ•ง"}, + {":clock1:", "๐Ÿ•"}, + {":clock130:", "๐Ÿ•œ"}, + {":clock2:", "๐Ÿ•‘"}, + {":clock230:", "๐Ÿ•"}, + {":clock3:", "๐Ÿ•’"}, + {":clock330:", "๐Ÿ•ž"}, + {":clock4:", "๐Ÿ•“"}, + {":clock430:", "๐Ÿ•Ÿ"}, + {":clock5:", "๐Ÿ•”"}, + {":clock530:", "๐Ÿ• "}, + {":clock6:", "๐Ÿ••"}, + {":clock7:", "๐Ÿ•–"}, + {":clock8:", "๐Ÿ•—"}, + {":clock9:", "๐Ÿ•˜"}, + {":clock10:", "๐Ÿ•™"}, + {":clock11:", "๐Ÿ•š"}, + {":clock630:", "๐Ÿ•ก"}, + {":clock730:", "๐Ÿ•ข"}, + {":clock830:", "๐Ÿ•ฃ"}, + {":clock930:", "๐Ÿ•ค"}, + {":clock1030:", "๐Ÿ•ฅ"}, + {":clock1130:", "๐Ÿ•ฆ"}, + {":heavy_multiplication_x:", "โœ–๏ธ"}, + {":heavy_plus_sign:", "โž•"}, + {":heavy_minus_sign:", "โž–"}, + {":heavy_division_sign:", "โž—"}, + {":spades:", "โ™ ๏ธ"}, + {":hearts:", "โ™ฅ๏ธ"}, + {":clubs:", "โ™ฃ๏ธ"}, + {":diamonds:", "โ™ฆ๏ธ"}, + {":white_flower:", "๐Ÿ’ฎ"}, + {":heavy_check_mark:", "โœ”๏ธ"}, + {":ballot_box_with_check:", "โ˜‘๏ธ"}, + {":radio_button:", "๐Ÿ”˜"}, + {":link:", "๐Ÿ”—"}, + {":curly_loop:", "โžฐ"}, + {":wavy_dash:", "ใ€ฐ๏ธ"}, + {":part_alternation_mark:", "ใ€ฝ๏ธ"}, + {":trident:", "๐Ÿ”ฑ"}, + {":black_medium_square:", "โ—ผ๏ธ"}, + {":white_medium_square:", "โ—ป๏ธ"}, + {":black_medium_small_square:", "โ—พ"}, + {":white_medium_small_square:", "โ—ฝ"}, + {":black_small_square:", "โ–ช๏ธ"}, + {":white_small_square:", "โ–ซ๏ธ"}, + {":small_red_triangle:", "๐Ÿ”บ"}, + {":black_square_button:", "๐Ÿ”ฒ"}, + {":white_square_button:", "๐Ÿ”ณ"}, + {":black_circle:", "โšซ"}, + {":white_circle:", "โšช"}, + {":red_circle:", "๐Ÿ”ด"}, + {":large_blue_circle:", "๐Ÿ”ต"}, + {":small_red_triangle_down:", "๐Ÿ”ป"}, + {":white_large_square:", "โฌœ"}, + {":black_large_square:", "โฌ›"}, + {":large_orange_diamond:", "๐Ÿ”ถ"}, + {":large_blue_diamond:", "๐Ÿ”ท"}, + {":small_orange_diamond:", "๐Ÿ”ธ"}, + {":small_blue_diamond:", "๐Ÿ”น"} }; -//{">:(", ":angry:}, -//{">:-(", ":angry:}, -//{":")", ":blush:}, -//{":-\")", ":blush:}, -//{"() + { + {">:(", ":angry:"}, + {">:-(", ":angry:"}, + {":\")", ":blush:"}, + {":-\")", ":blush:"}, + {" /// The type of item to cache /// - public class DefaultObjectCache : ObjectCache where T : class, new() + public abstract class DefaultObjectCache : ObjectCache where T : class, new() { protected override T NewInstance() { diff --git a/src/Textamina.Markdig/Helpers/ObjectCache.cs b/src/Textamina.Markdig/Helpers/ObjectCache.cs index 98d7db94..7f5f6d99 100644 --- a/src/Textamina.Markdig/Helpers/ObjectCache.cs +++ b/src/Textamina.Markdig/Helpers/ObjectCache.cs @@ -22,6 +22,17 @@ namespace Textamina.Markdig.Helpers builders = new Stack(); } + /// + /// Clears this cache. + /// + public void Clear() + { + lock (builders) + { + builders.Clear(); + } + } + /// /// Gets a new instance. /// @@ -64,8 +75,6 @@ namespace Textamina.Markdig.Helpers /// Resets the specified instance when is called before storing back to this cache. /// /// The instance. - protected virtual void Reset(T instance) - { - } + protected abstract void Reset(T instance); } } \ No newline at end of file diff --git a/src/Textamina.Markdig/Helpers/TextMatcher.cs b/src/Textamina.Markdig/Helpers/TextMatcher.cs new file mode 100644 index 00000000..35af13a8 --- /dev/null +++ b/src/Textamina.Markdig/Helpers/TextMatcher.cs @@ -0,0 +1,175 @@ +๏ปฟ// Copyright (c) Alexandre Mutel. All rights reserved. +// This file is licensed under the BSD-Clause 2 license. +// See the license.txt file in the project root for more information. + +using System; +using System.Collections.Generic; + +namespace Textamina.Markdig.Helpers +{ + /// + /// Match a text against a list of ASCII string using internally a tree to speedup the lookup + /// + public class TextMatchHelper + { + private readonly CharNode root; + private readonly ListCache listCache; + private readonly DictionaryCache dictCache; + + /// + /// Initializes a new instance of the class. + /// + /// The matches to match against. + /// + public TextMatchHelper(HashSet matches) + { + if (matches == null) throw new ArgumentNullException(nameof(matches)); + var list = new List(matches); + root = new CharNode(); + dictCache = new DictionaryCache(); + listCache = new ListCache(); + BuildMap(ref root, 0, list); + listCache.Clear(); + dictCache.Clear(); + } + + /// + /// Tries to match in the text, at offset position, the list of string matches registered to this instance. + /// + /// The text. + /// The offset. + /// The length. + /// The match string if the match was successfull. + /// + /// true if the match was successfull; false otherwise + /// + /// + public bool TryMatch(string text, int offset, int length, out string match) + { + if (text == null) throw new ArgumentNullException(nameof(text)); + // TODO(lazy): we should check offset and length for a better exception experience in case of wrong usage + var node = root; + match = null; + while (length > 0) + { + var c = text[offset]; + var nextIndex = c - node.MinChar; + if (nextIndex < 0) + { + return false; + } + var nextNodes = node.NextNodes; + if (nextNodes == null || nextIndex >= nextNodes.Length) + { + return false; + } + + node = nextNodes[nextIndex]; + if (node == null) + { + return false; + } + if (node.Content != null) + { + match = node.Content; + return true; + } + + offset++; + length--; + } + return false; + } + + private void BuildMap(ref CharNode node, int index, List list) + { + // TODO(lazy): This code for building the nodes is not very efficient in terms of memory usage and could be optimized (using structs and indices) + // At least, we are using a cache for the temporary objects build (List and Dictionary) + var charSet = dictCache.Get(); + int minChar = int.MaxValue; + int maxChar = 0; + for (int i = 0; i < list.Count; i++) + { + var str = list[i]; + var c = str[index]; + // Make sure that we don't get something to match that is too large + if (c > 127) + { + throw new InvalidOperationException($"The string [{str}] contains a non ASCII character `{c}`"); + } + + CharNode nextNode; + if (!charSet.TryGetValue(c, out nextNode)) + { + nextNode = new CharNode(); + charSet.Add(c, nextNode); + } + + // We have found a string for this node + if (index + 1 == str.Length) + { + nextNode.Content = str; + } + else + { + if (nextNode.NextList == null) + { + nextNode.NextList = listCache.Get(); + } + nextNode.NextList.Add(str); + } + + if (c < minChar) + { + minChar = c; + } + if (c > maxChar) + { + maxChar = c; + } + } + node.MinChar = minChar; + var chars = new CharNode[maxChar - minChar + 1]; + node.NextNodes = chars; + foreach (var charList in charSet) + { + var nodeIndex = charList.Key - minChar; + chars[nodeIndex] = charList.Value; + if (charList.Value.NextList != null) + { + BuildMap(ref chars[charList.Key - minChar], index + 1, charList.Value.NextList); + listCache.Release(charList.Value.NextList); + charList.Value.NextList = null; + } + } + dictCache.Release(charSet); + } + + private class ListCache : DefaultObjectCache> + { + protected override void Reset(List instance) + { + instance.Clear(); + } + } + + private class DictionaryCache : DefaultObjectCache> + { + protected override void Reset(Dictionary instance) + { + instance.Clear(); + } + } + + private class CharNode + { + public CharNode[] NextNodes; + + public int MinChar; + + public List NextList; + + public string Content { get; set; } + } + } +} \ No newline at end of file diff --git a/src/Textamina.Markdig/MarkdownExtensions.cs b/src/Textamina.Markdig/MarkdownExtensions.cs index 290ae660..b263c083 100644 --- a/src/Textamina.Markdig/MarkdownExtensions.cs +++ b/src/Textamina.Markdig/MarkdownExtensions.cs @@ -5,6 +5,7 @@ using Textamina.Markdig.Extensions; using Textamina.Markdig.Extensions.Attributes; using Textamina.Markdig.Extensions.CustomContainers; using Textamina.Markdig.Extensions.DefinitionLists; +using Textamina.Markdig.Extensions.Emoji; using Textamina.Markdig.Extensions.Footnotes; using Textamina.Markdig.Extensions.Tables; @@ -29,8 +30,9 @@ namespace Textamina.Markdig .UsePipeTable() .UseSoftlineBreakAsHardlineBreak() .UseFootnotes() + .UseEmojiAndSmiley() .UseStrikethroughSuperAndSubScript() - .UseAttributes(); + .UseAttributes(); // Must be last as it is one parser that is modifying other parsers } /// @@ -120,5 +122,16 @@ namespace Textamina.Markdig pipeline.Extensions.AddIfNotAlready(); return pipeline; } + + /// + /// Uses the emoji and smiley extension. + /// + /// The pipeline. + /// The modified pipeline + public static MarkdownPipeline UseEmojiAndSmiley(this MarkdownPipeline pipeline) + { + pipeline.Extensions.AddIfNotAlready(); + return pipeline; + } } } \ No newline at end of file diff --git a/src/Textamina.Markdig/Parsers/MarkdownParser.cs b/src/Textamina.Markdig/Parsers/MarkdownParser.cs index a8d83e3a..1f2ccb23 100644 --- a/src/Textamina.Markdig/Parsers/MarkdownParser.cs +++ b/src/Textamina.Markdig/Parsers/MarkdownParser.cs @@ -125,9 +125,19 @@ namespace Textamina.Markdig.Parsers } } + + private class ContainerItemCache : DefaultObjectCache + { + protected override void Reset(ContainerItem instance) + { + instance.Container = null; + instance.Index = 0; + } + } + private void ProcessInlines() { - var cache = new DefaultObjectCache(); + var cache = new ContainerItemCache(); var blocks = new Stack(); // TODO: Use an ObjectCache for ContainerItem diff --git a/src/Textamina.Markdig/Textamina.Markdig.csproj b/src/Textamina.Markdig/Textamina.Markdig.csproj index b2e46ae6..ab36a105 100644 --- a/src/Textamina.Markdig/Textamina.Markdig.csproj +++ b/src/Textamina.Markdig/Textamina.Markdig.csproj @@ -44,7 +44,9 @@ + + @@ -73,6 +75,7 @@ +