blob: 7abfaf8ea3075b015364cb30f95630519d49123b [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/fonts/symbols_iterator.h"
#include "testing/gtest/include/gtest/gtest.h"
#include <string>
namespace blink {
struct FallbackTestRun {
std::string text;
FontFallbackPriority font_fallback_priority;
};
struct FallbackExpectedRun {
unsigned limit;
FontFallbackPriority font_fallback_priority;
FallbackExpectedRun(unsigned the_limit,
FontFallbackPriority the_font_fallback_priority)
: limit(the_limit), font_fallback_priority(the_font_fallback_priority) {}
};
class SymbolsIteratorTest : public testing::Test {
protected:
void CheckRuns(const Vector<FallbackTestRun>& runs) {
String text(g_empty_string16_bit);
Vector<FallbackExpectedRun> expect;
for (auto& run : runs) {
text.append(String::FromUTF8(run.text.c_str()));
expect.push_back(
FallbackExpectedRun(text.length(), run.font_fallback_priority));
}
SymbolsIterator symbols_iterator(text.Characters16(), text.length());
VerifyRuns(&symbols_iterator, expect);
}
void VerifyRuns(SymbolsIterator* symbols_iterator,
const Vector<FallbackExpectedRun>& expect) {
unsigned limit;
FontFallbackPriority font_fallback_priority;
unsigned long run_count = 0;
while (symbols_iterator->Consume(&limit, &font_fallback_priority)) {
ASSERT_LT(run_count, expect.size());
ASSERT_EQ(expect[run_count].limit, limit);
ASSERT_EQ(expect[run_count].font_fallback_priority,
font_fallback_priority);
++run_count;
}
ASSERT_EQ(expect.size(), run_count);
}
};
TEST_F(SymbolsIteratorTest, Empty) {
String empty(g_empty_string16_bit);
SymbolsIterator symbols_iterator(empty.Characters16(), empty.length());
unsigned limit = 0;
FontFallbackPriority symbols_font = FontFallbackPriority::kInvalid;
DCHECK(!symbols_iterator.Consume(&limit, &symbols_font));
ASSERT_EQ(limit, 0u);
ASSERT_EQ(symbols_font, FontFallbackPriority::kInvalid);
}
TEST_F(SymbolsIteratorTest, Space) {
CheckRuns({{" ", FontFallbackPriority::kText}});
}
TEST_F(SymbolsIteratorTest, Latin) {
CheckRuns({{"Aa", FontFallbackPriority::kText}});
}
TEST_F(SymbolsIteratorTest, LatinColorEmojiTextEmoji) {
CheckRuns({{"a", FontFallbackPriority::kText},
{"⌚", FontFallbackPriority::kEmojiEmoji},
{"☎", FontFallbackPriority::kEmojiText}});
}
TEST_F(SymbolsIteratorTest, IgnoreVSInMath) {
CheckRuns({{u8"⊆⊇⊈\U0000FE0E⊙⊚⊚", FontFallbackPriority::kText}});
}
TEST_F(SymbolsIteratorTest, IgnoreVS15InText) {
CheckRuns({{u8"abcdef\U0000FE0Eghji", FontFallbackPriority::kText}});
}
TEST_F(SymbolsIteratorTest, IgnoreVS16InText) {
CheckRuns({{u8"abcdef\U0000FE0Fghji", FontFallbackPriority::kText}});
}
TEST_F(SymbolsIteratorTest, AllHexValuesText) {
// Helps with detecting incorrect emoji pattern definitions which are
// missing a \U000... prefix for example.
CheckRuns({{"abcdef0123456789ABCDEF", FontFallbackPriority::kText}});
}
TEST_F(SymbolsIteratorTest, NumbersAndHashNormalAndEmoji) {
CheckRuns({{"0123456789#*", FontFallbackPriority::kText},
{"0⃣1⃣2⃣3⃣4⃣5⃣6⃣7⃣8⃣9⃣*⃣", FontFallbackPriority::kEmojiEmoji},
{"0123456789#*", FontFallbackPriority::kText}});
}
TEST_F(SymbolsIteratorTest, VS16onDigits) {
CheckRuns({{"#", FontFallbackPriority::kText},
{"#\uFE0F#\uFE0F\u20E3", FontFallbackPriority::kEmojiEmoji},
{"#", FontFallbackPriority::kText}});
}
TEST_F(SymbolsIteratorTest, SingleFlag) {
CheckRuns({{"🇺", FontFallbackPriority::kText}});
}
TEST_F(SymbolsIteratorTest, CombiningCircle) {
CheckRuns({{"◌́◌̀◌̈◌̂◌̄◌̊", FontFallbackPriority::kText}});
}
TEST_F(SymbolsIteratorTest, CombiningEnclosingCircleBackslash) {
CheckRuns({{"A⃠B⃠C⃠", FontFallbackPriority::kText},
{"🚷🚯🚱🔞📵🚭🚫", FontFallbackPriority::kEmojiEmoji},
{"🎙⃠", FontFallbackPriority::kEmojiText},
{"📸⃠🔫⃠", FontFallbackPriority::kEmojiEmoji},
{"a⃠b⃠c⃠", FontFallbackPriority::kText}});
}
// TODO: Perhaps check for invalid country indicator combinations?
TEST_F(SymbolsIteratorTest, FlagsVsNonFlags) {
CheckRuns({{"🇺🇸🇸", FontFallbackPriority::kEmojiEmoji}, // "US"
{"abc", FontFallbackPriority::kText},
{"🇺🇸", FontFallbackPriority::kEmojiEmoji},
{"a🇿", FontFallbackPriority::kText}});
}
TEST_F(SymbolsIteratorTest, EmojiVS15) {
// A VS15 after the anchor must trigger text display.
CheckRuns({{"⚓\U0000FE0E", FontFallbackPriority::kEmojiText},
{"⛵", FontFallbackPriority::kEmojiEmoji}});
}
TEST_F(SymbolsIteratorTest, EmojiZWSSequences) {
CheckRuns({{"👩‍👩‍👧‍👦👩‍❤️‍💋‍👨",
FontFallbackPriority::kEmojiEmoji},
{"abcd", FontFallbackPriority::kText},
{"👩‍👩‍", FontFallbackPriority::kEmojiEmoji},
{"efgh", FontFallbackPriority::kText}});
}
TEST_F(SymbolsIteratorTest, AllEmojiZWSSequences) {
// clang-format gets confused by Emojis, http://llvm.org/PR30530
// clang-format off
CheckRuns(
{{"💏👩‍❤️‍💋‍👨👨‍❤️‍💋‍👨👩‍❤️‍💋‍👩💑👩‍❤️‍👨👨‍❤"
"️"
"‍👨👩‍❤️"
"‍👩👪👨‍👩‍👦👨‍👩‍👧👨‍👩‍👧‍👦👨‍👩‍👦‍👦👨‍👩‍👧‍👧👨‍👨"
"‍"
"👦👨‍👨‍👧👨‍👨‍👧‍👦👨‍👨‍👦‍👦👨‍👨‍👧"
"‍"
"👧"
"👩‍👩‍👦👩‍👩‍👧👩‍👩‍👧‍👦👩‍👩‍👦‍👦👩‍👩‍👧‍👧👁"
"‍"
"🗨",
FontFallbackPriority::kEmojiEmoji}});
// clang-format on
}
TEST_F(SymbolsIteratorTest, ModifierPlusGender) {
CheckRuns({{"⛹🏻‍♂", FontFallbackPriority::kEmojiEmoji}});
}
TEST_F(SymbolsIteratorTest, TextMemberZwjSequence) {
CheckRuns({{"👨‍⚕", FontFallbackPriority::kEmojiEmoji}});
}
TEST_F(SymbolsIteratorTest, FacepalmCartwheelShrugModifierFemale) {
CheckRuns({{"🤦‍♀🤸‍♀🤷‍♀🤷🏾‍♀",
FontFallbackPriority::kEmojiEmoji}});
}
TEST_F(SymbolsIteratorTest, AesculapiusMaleFemalEmoji) {
// Emoji Data 4 has upgraded those three characters to Emoji.
CheckRuns({{"a", FontFallbackPriority::kText},
{"⚕♀♂", FontFallbackPriority::kEmojiText}});
}
TEST_F(SymbolsIteratorTest, EyeSpeechBubble) {
CheckRuns({{"👁‍🗨", FontFallbackPriority::kEmojiEmoji}});
}
TEST_F(SymbolsIteratorTest, Modifier) {
CheckRuns({{"👶🏿", FontFallbackPriority::kEmojiEmoji}});
}
TEST_F(SymbolsIteratorTest, DingbatsMiscSymbolsModifier) {
CheckRuns({{"⛹🏻✍🏻✊🏼", FontFallbackPriority::kEmojiEmoji}});
}
TEST_F(SymbolsIteratorTest, ExtraZWJPrefix) {
CheckRuns({{u8"\U0000200D", FontFallbackPriority::kText},
{u8"\U0001F469\U0000200D\U00002764\U0000FE0F\U0000200D\U0001F48B"
u8"\U0000200D\U0001F468",
FontFallbackPriority::kEmojiEmoji}});
}
TEST_F(SymbolsIteratorTest, Arrows) {
CheckRuns({{"x→←x←↑↓→", FontFallbackPriority::kText}});
}
TEST_F(SymbolsIteratorTest, JudgePilot) {
CheckRuns({{"👨‍⚖️👩‍⚖️👨🏼‍⚖️👩🏼‍⚖️",
FontFallbackPriority::kEmojiEmoji}});
}
// Extracted from http://unicode.org/emoji/charts/emoji-released.html for Emoji
// v5.0, except for the subdivision-flag section.
// Before ICU 59 new emoji sequences and new single emoji are not detected as
// emoji type text and sequences get split up in the middle so that shaping
// cannot form the right glyph from the emoji font. Running this as one run in
// one test ensures that the new emoji form an unbroken emoji-type sequence.
TEST_F(SymbolsIteratorTest, Emoji5AdditionsExceptFlags) {
CheckRuns(
{{u8"\U0001F9D4\U0001F3FB\U0001F9D4\U0001F3FC\U0001F9D4\U0001F3FD"
u8"\U0001F9D4\U0001F3FE\U0001F9D4\U0001F3FF\U0001F931\U0001F931"
u8"\U0001F3FB\U0001F931\U0001F3FC\U0001F931\U0001F3FD\U0001F931"
u8"\U0001F3FE\U0001F931\U0001F3FF\U0001F9D9\U0001F9D9\U0001F3FB"
u8"\U0001F9D9\U0001F3FC\U0001F9D9\U0001F3FD\U0001F9D9\U0001F3FE"
u8"\U0001F9D9\U0001F3FF\U0001F9D9\U0000200D\U00002640\U0000FE0F"
u8"\U0001F9D9\U0001F3FB\U0000200D\U00002640\U0000FE0F\U0001F9D9"
u8"\U0001F3FC\U0000200D\U00002640\U0000FE0F\U0001F9D9\U0001F3FD"
u8"\U0000200D\U00002640\U0000FE0F\U0001F9D9\U0001F3FE\U0000200D"
u8"\U00002640\U0000FE0F\U0001F9D9\U0001F3FF\U0000200D\U00002640"
u8"\U0000FE0F\U0001F9D9\U0000200D\U00002642\U0000FE0F\U0001F9D9"
u8"\U0001F3FB\U0000200D\U00002642\U0000FE0F\U0001F9D9\U0001F3FC"
u8"\U0000200D\U00002642\U0000FE0F\U0001F9D9\U0001F3FD\U0000200D"
u8"\U00002642\U0000FE0F\U0001F9D9\U0001F3FE\U0000200D\U00002642"
u8"\U0000FE0F\U0001F9D9\U0001F3FF\U0000200D\U00002642\U0000FE0F"
u8"\U0001F9DA\U0001F9DA\U0001F3FB\U0001F9DA\U0001F3FC\U0001F9DA"
u8"\U0001F3FD\U0001F9DA\U0001F3FE\U0001F9DA\U0001F3FF\U0001F9DA"
u8"\U0000200D\U00002640\U0000FE0F\U0001F9DA\U0001F3FB\U0000200D"
u8"\U00002640\U0000FE0F\U0001F9DA\U0001F3FC\U0000200D\U00002640"
u8"\U0000FE0F\U0001F9DA\U0001F3FD\U0000200D\U00002640\U0000FE0F"
u8"\U0001F9DA\U0001F3FE\U0000200D\U00002640\U0000FE0F\U0001F9DA"
u8"\U0001F3FF\U0000200D\U00002640\U0000FE0F\U0001F9DA\U0000200D"
u8"\U00002642\U0000FE0F\U0001F9DA\U0001F3FB\U0000200D\U00002642"
u8"\U0000FE0F\U0001F9DA\U0001F3FC\U0000200D\U00002642\U0000FE0F"
u8"\U0001F9DA\U0001F3FD\U0000200D\U00002642\U0000FE0F\U0001F9DA"
u8"\U0001F3FE\U0000200D\U00002642\U0000FE0F\U0001F9DA\U0001F3FF"
u8"\U0000200D\U00002642\U0000FE0F\U0001F9DB\U0001F9DB\U0001F3FB"
u8"\U0001F9DB\U0001F3FC\U0001F9DB\U0001F3FD\U0001F9DB\U0001F3FE"
u8"\U0001F9DB\U0001F3FF\U0001F9DB\U0000200D\U00002640\U0000FE0F"
u8"\U0001F9DB\U0001F3FB\U0000200D\U00002640\U0000FE0F\U0001F9DB"
u8"\U0001F3FC\U0000200D\U00002640\U0000FE0F\U0001F9DB\U0001F3FD"
u8"\U0000200D\U00002640\U0000FE0F\U0001F9DB\U0001F3FE\U0000200D"
u8"\U00002640\U0000FE0F\U0001F9DB\U0001F3FF\U0000200D\U00002640"
u8"\U0000FE0F\U0001F9DB\U0000200D\U00002642\U0000FE0F\U0001F9DB"
u8"\U0001F3FB\U0000200D\U00002642\U0000FE0F\U0001F9DB\U0001F3FC"
u8"\U0000200D\U00002642\U0000FE0F\U0001F9DB\U0001F3FD\U0000200D"
u8"\U00002642\U0000FE0F\U0001F9DB\U0001F3FE\U0000200D\U00002642"
u8"\U0000FE0F\U0001F9DB\U0001F3FF\U0000200D\U00002642\U0000FE0F"
u8"\U0001F9DC\U0001F9DC\U0001F3FB\U0001F9DC\U0001F3FC\U0001F9DC"
u8"\U0001F3FD\U0001F9DC\U0001F3FE\U0001F9DC\U0001F3FF\U0001F9DC"
u8"\U0000200D\U00002640\U0000FE0F\U0001F9DC\U0001F3FB\U0000200D"
u8"\U00002640\U0000FE0F\U0001F9DC\U0001F3FC\U0000200D\U00002640"
u8"\U0000FE0F\U0001F9DC\U0001F3FD\U0000200D\U00002640\U0000FE0F"
u8"\U0001F9DC\U0001F3FE\U0000200D\U00002640\U0000FE0F\U0001F9DC"
u8"\U0001F3FF\U0000200D\U00002640\U0000FE0F\U0001F9DC\U0000200D"
u8"\U00002642\U0000FE0F\U0001F9DC\U0001F3FB\U0000200D\U00002642"
u8"\U0000FE0F\U0001F9DC\U0001F3FC\U0000200D\U00002642\U0000FE0F"
u8"\U0001F9DC\U0001F3FD\U0000200D\U00002642\U0000FE0F\U0001F9DC"
u8"\U0001F3FE\U0000200D\U00002642\U0000FE0F\U0001F9DC\U0001F3FF"
u8"\U0000200D\U00002642\U0000FE0F\U0001F9DD\U0001F9DD\U0001F3FB"
u8"\U0001F9DD\U0001F3FC\U0001F9DD\U0001F3FD\U0001F9DD\U0001F3FE"
u8"\U0001F9DD\U0001F3FF\U0001F9DD\U0000200D\U00002640\U0000FE0F"
u8"\U0001F9DD\U0001F3FB\U0000200D\U00002640\U0000FE0F\U0001F9DD"
u8"\U0001F3FC\U0000200D\U00002640\U0000FE0F\U0001F9DD\U0001F3FD"
u8"\U0000200D\U00002640\U0000FE0F\U0001F9DD\U0001F3FE\U0000200D"
u8"\U00002640\U0000FE0F\U0001F9DD\U0001F3FF\U0000200D\U00002640"
u8"\U0000FE0F\U0001F9DD\U0000200D\U00002642\U0000FE0F\U0001F9DD"
u8"\U0001F3FB\U0000200D\U00002642\U0000FE0F\U0001F9DD\U0001F3FC"
u8"\U0000200D\U00002642\U0000FE0F\U0001F9DD\U0001F3FD\U0000200D"
u8"\U00002642\U0000FE0F\U0001F9DD\U0001F3FE\U0000200D\U00002642"
u8"\U0000FE0F\U0001F9DD\U0001F3FF\U0000200D\U00002642\U0000FE0F"
u8"\U0001F9DE\U0001F9DE\U0000200D\U00002640\U0000FE0F\U0001F9DE"
u8"\U0000200D\U00002642\U0000FE0F\U0001F9DF\U0001F9DF\U0000200D"
u8"\U00002640\U0000FE0F\U0001F9DF\U0000200D\U00002642\U0000FE0F"
u8"\U0001F9D6\U0001F9D6\U0001F3FB\U0001F9D6\U0001F3FC\U0001F9D6"
u8"\U0001F3FD\U0001F9D6\U0001F3FE\U0001F9D6\U0001F3FF\U0001F9D6"
u8"\U0000200D\U00002640\U0000FE0F\U0001F9D6\U0001F3FB\U0000200D"
u8"\U00002640\U0000FE0F\U0001F9D6\U0001F3FC\U0000200D\U00002640"
u8"\U0000FE0F\U0001F9D6\U0001F3FD\U0000200D\U00002640\U0000FE0F"
u8"\U0001F9D6\U0001F3FE\U0000200D\U00002640\U0000FE0F\U0001F9D6"
u8"\U0001F3FF\U0000200D\U00002640\U0000FE0F\U0001F9D6\U0000200D"
u8"\U00002642\U0000FE0F\U0001F9D6\U0001F3FB\U0000200D\U00002642"
u8"\U0000FE0F\U0001F9D6\U0001F3FC\U0000200D\U00002642\U0000FE0F"
u8"\U0001F9D6\U0001F3FD\U0000200D\U00002642\U0000FE0F\U0001F9D6"
u8"\U0001F3FE\U0000200D\U00002642\U0000FE0F\U0001F9D6\U0001F3FF"
u8"\U0000200D\U00002642\U0000FE0F\U0001F9D7\U0001F9D7\U0001F3FB"
u8"\U0001F9D7\U0001F3FC\U0001F9D7\U0001F3FD\U0001F9D7\U0001F3FE"
u8"\U0001F9D7\U0001F3FF\U0001F9D7\U0000200D\U00002640\U0000FE0F"
u8"\U0001F9D7\U0001F3FB\U0000200D\U00002640\U0000FE0F\U0001F9D7"
u8"\U0001F3FC\U0000200D\U00002640\U0000FE0F\U0001F9D7\U0001F3FD"
u8"\U0000200D\U00002640\U0000FE0F\U0001F9D7\U0001F3FE\U0000200D"
u8"\U00002640\U0000FE0F\U0001F9D7\U0001F3FF\U0000200D\U00002640"
u8"\U0000FE0F\U0001F9D7\U0000200D\U00002642\U0000FE0F\U0001F9D7"
u8"\U0001F3FB\U0000200D\U00002642\U0000FE0F\U0001F9D7\U0001F3FC"
u8"\U0000200D\U00002642\U0000FE0F\U0001F9D7\U0001F3FD\U0000200D"
u8"\U00002642\U0000FE0F\U0001F9D7\U0001F3FE\U0000200D\U00002642"
u8"\U0000FE0F\U0001F9D7\U0001F3FF\U0000200D\U00002642\U0000FE0F"
u8"\U0001F9D8\U0001F9D8\U0001F3FB\U0001F9D8\U0001F3FC\U0001F9D8"
u8"\U0001F3FD\U0001F9D8\U0001F3FE\U0001F9D8\U0001F3FF\U0001F9D8"
u8"\U0000200D\U00002640\U0000FE0F\U0001F9D8\U0001F3FB\U0000200D"
u8"\U00002640\U0000FE0F\U0001F9D8\U0001F3FC\U0000200D\U00002640"
u8"\U0000FE0F\U0001F9D8\U0001F3FD\U0000200D\U00002640\U0000FE0F"
u8"\U0001F9D8\U0001F3FE\U0000200D\U00002640\U0000FE0F\U0001F9D8"
u8"\U0001F3FF\U0000200D\U00002640\U0000FE0F\U0001F9D8\U0000200D"
u8"\U00002642\U0000FE0F\U0001F9D8\U0001F3FB\U0000200D\U00002642"
u8"\U0000FE0F\U0001F9D8\U0001F3FC\U0000200D\U00002642\U0000FE0F"
u8"\U0001F9D8\U0001F3FD\U0000200D\U00002642\U0000FE0F\U0001F9D8"
u8"\U0001F3FE\U0000200D\U00002642\U0000FE0F\U0001F9D8\U0001F3FF"
u8"\U0000200D\U00002642\U0000FE0F\U0001F91F\U0001F91F\U0001F3FB"
u8"\U0001F91F\U0001F3FC\U0001F91F\U0001F3FD\U0001F91F\U0001F3FE"
u8"\U0001F91F\U0001F3FF\U0001F932\U0001F932\U0001F3FB\U0001F932"
u8"\U0001F3FC\U0001F932\U0001F3FD\U0001F932\U0001F3FE\U0001F932"
u8"\U0001F3FF\U0001F9E0\U0001F9E1\U0001F9E3\U0001F9E4\U0001F9E5"
u8"\U0001F9E6\U0001F9E2\U0001F993\U0001F992\U0001F994\U0001F995"
u8"\U0001F996\U0001F997\U0001F965\U0001F966\U0001F968\U0001F969"
u8"\U0001F96A\U0001F963\U0001F96B\U0001F95F\U0001F960\U0001F961"
u8"\U0001F967\U0001F964\U0001F962\U0001F6F8\U0001F6F7\U0001F94C",
FontFallbackPriority::kEmojiEmoji}});
}
TEST_F(SymbolsIteratorTest, EmojiSubdivisionFlags) {
CheckRuns(
{{"🏴󠁧󠁢󠁷󠁬󠁳󠁿🏴󠁧󠁢󠁳󠁣󠁴󠁿🏴󠁧󠁢",
FontFallbackPriority::kEmojiEmoji}});
}
// Extracted from http://unicode.org/emoji/charts/emoji-released.html for Emoji
// v11, removed U+265F Chess Pawn and U+267E as they do not have default emoji
// presentation.
TEST_F(SymbolsIteratorTest, Emoji11Additions) {
CheckRuns(
{{u8"\U0001F970\U0001F975\U0001F976\U0001F973\U0001F974\U0001F97A"
u8"\U0001F468\U0000200D\U0001F9B0\U0001F468\U0001F3FB\U0000200D"
u8"\U0001F9B0\U0001F468\U0001F3FC\U0000200D\U0001F9B0\U0001F468"
u8"\U0001F3FD\U0000200D\U0001F9B0\U0001F468\U0001F3FE\U0000200D"
u8"\U0001F9B0\U0001F468\U0001F3FF\U0000200D\U0001F9B0\U0001F468"
u8"\U0000200D\U0001F9B1\U0001F468\U0001F3FB\U0000200D\U0001F9B1"
u8"\U0001F468\U0001F3FC\U0000200D\U0001F9B1\U0001F468\U0001F3FD"
u8"\U0000200D\U0001F9B1\U0001F468\U0001F3FE\U0000200D\U0001F9B1"
u8"\U0001F468\U0001F3FF\U0000200D\U0001F9B1\U0001F468\U0000200D"
u8"\U0001F9B3\U0001F468\U0001F3FB\U0000200D\U0001F9B3\U0001F468"
u8"\U0001F3FC\U0000200D\U0001F9B3\U0001F468\U0001F3FD\U0000200D"
u8"\U0001F9B3\U0001F468\U0001F3FE\U0000200D\U0001F9B3\U0001F468"
u8"\U0001F3FF\U0000200D\U0001F9B3\U0001F468\U0000200D\U0001F9B2"
u8"\U0001F468\U0001F3FB\U0000200D\U0001F9B2\U0001F468\U0001F3FC"
u8"\U0000200D\U0001F9B2\U0001F468\U0001F3FD\U0000200D\U0001F9B2"
u8"\U0001F468\U0001F3FE\U0000200D\U0001F9B2\U0001F468\U0001F3FF"
u8"\U0000200D\U0001F9B2\U0001F469\U0000200D\U0001F9B0\U0001F469"
u8"\U0001F3FB\U0000200D\U0001F9B0\U0001F469\U0001F3FC\U0000200D"
u8"\U0001F9B0\U0001F469\U0001F3FD\U0000200D\U0001F9B0\U0001F469"
u8"\U0001F3FE\U0000200D\U0001F9B0\U0001F469\U0001F3FF\U0000200D"
u8"\U0001F9B0\U0001F469\U0000200D\U0001F9B1\U0001F469\U0001F3FB"
u8"\U0000200D\U0001F9B1\U0001F469\U0001F3FC\U0000200D\U0001F9B1"
u8"\U0001F469\U0001F3FD\U0000200D\U0001F9B1\U0001F469\U0001F3FE"
u8"\U0000200D\U0001F9B1\U0001F469\U0001F3FF\U0000200D\U0001F9B1"
u8"\U0001F469\U0000200D\U0001F9B3\U0001F469\U0001F3FB\U0000200D"
u8"\U0001F9B3\U0001F469\U0001F3FC\U0000200D\U0001F9B3\U0001F469"
u8"\U0001F3FD\U0000200D\U0001F9B3\U0001F469\U0001F3FE\U0000200D"
u8"\U0001F9B3\U0001F469\U0001F3FF\U0000200D\U0001F9B3\U0001F469"
u8"\U0000200D\U0001F9B2\U0001F469\U0001F3FB\U0000200D\U0001F9B2"
u8"\U0001F469\U0001F3FC\U0000200D\U0001F9B2\U0001F469\U0001F3FD"
u8"\U0000200D\U0001F9B2\U0001F469\U0001F3FE\U0000200D\U0001F9B2"
u8"\U0001F469\U0001F3FF\U0000200D\U0001F9B2\U0001F9B8\U0001F9B8"
u8"\U0001F3FB\U0001F9B8\U0001F3FC\U0001F9B8\U0001F3FD\U0001F9B8"
u8"\U0001F3FE\U0001F9B8\U0001F3FF\U0001F9B8\U0000200D\U00002640"
u8"\U0000FE0F\U0001F9B8\U0001F3FB\U0000200D\U00002640\U0000FE0F"
u8"\U0001F9B8\U0001F3FC\U0000200D\U00002640\U0000FE0F\U0001F9B8"
u8"\U0001F3FD\U0000200D\U00002640\U0000FE0F\U0001F9B8\U0001F3FE"
u8"\U0000200D\U00002640\U0000FE0F\U0001F9B8\U0001F3FF\U0000200D"
u8"\U00002640\U0000FE0F\U0001F9B8\U0000200D\U00002642\U0000FE0F"
u8"\U0001F9B8\U0001F3FB\U0000200D\U00002642\U0000FE0F\U0001F9B8"
u8"\U0001F3FC\U0000200D\U00002642\U0000FE0F\U0001F9B8\U0001F3FD"
u8"\U0000200D\U00002642\U0000FE0F\U0001F9B8\U0001F3FE\U0000200D"
u8"\U00002642\U0000FE0F\U0001F9B8\U0001F3FF\U0000200D\U00002642"
u8"\U0000FE0F\U0001F9B9\U0001F9B9\U0001F3FB\U0001F9B9\U0001F3FC"
u8"\U0001F9B9\U0001F3FD\U0001F9B9\U0001F3FE\U0001F9B9\U0001F3FF"
u8"\U0001F9B9\U0000200D\U00002640\U0000FE0F\U0001F9B9\U0001F3FB"
u8"\U0000200D\U00002640\U0000FE0F\U0001F9B9\U0001F3FC\U0000200D"
u8"\U00002640\U0000FE0F\U0001F9B9\U0001F3FD\U0000200D\U00002640"
u8"\U0000FE0F\U0001F9B9\U0001F3FE\U0000200D\U00002640\U0000FE0F"
u8"\U0001F9B9\U0001F3FF\U0000200D\U00002640\U0000FE0F\U0001F9B9"
u8"\U0000200D\U00002642\U0000FE0F\U0001F9B9\U0001F3FB\U0000200D"
u8"\U00002642\U0000FE0F\U0001F9B9\U0001F3FC\U0000200D\U00002642"
u8"\U0000FE0F\U0001F9B9\U0001F3FD\U0000200D\U00002642\U0000FE0F"
u8"\U0001F9B9\U0001F3FE\U0000200D\U00002642\U0000FE0F\U0001F9B9"
u8"\U0001F3FF\U0000200D\U00002642\U0000FE0F\U0001F9B5\U0001F9B5"
u8"\U0001F3FB\U0001F9B5\U0001F3FC\U0001F9B5\U0001F3FD\U0001F9B5"
u8"\U0001F3FE\U0001F9B5\U0001F3FF\U0001F9B6\U0001F9B6\U0001F3FB"
u8"\U0001F9B6\U0001F3FC\U0001F9B6\U0001F3FD\U0001F9B6\U0001F3FE"
u8"\U0001F9B6\U0001F3FF\U0001F9B4\U0001F9B7\U0001F9B0\U0001F9B1"
u8"\U0001F9B3\U0001F9B2\U0001F97D\U0001F97C\U0001F97E\U0001F97F"
u8"\U0001F99D\U0001F999\U0001F99B\U0001F998\U0001F9A1\U0001F9A2"
u8"\U0001F99A\U0001F99C\U0001F99E\U0001F99F\U0001F9A0\U0001F96D"
u8"\U0001F96C\U0001F96F\U0001F9C2\U0001F96E\U0001F9C1\U0001F9ED"
u8"\U0001F9F1\U0001F6F9\U0001F9F3\U0001F9E8\U0001F9E7\U0001F94E"
u8"\U0001F94F\U0001F94D\U0001F9FF\U0001F9E9\U0001F9F8\U0001F9F5"
u8"\U0001F9F6\U0001F9EE\U0001F9FE\U0001F9F0\U0001F9F2\U0001F9EA"
u8"\U0001F9EB\U0001F9EC\U0001F9F4\U0001F9F7\U0001F9F9\U0001F9FA"
u8"\U0001F9FB\U0001F9FC\U0001F9FD\U0001F9EF\U0001F3F4\U0000200D"
u8"\U00002620\U0000FE0F",
FontFallbackPriority::kEmojiEmoji}});
}
} // namespace blink