├── .gitignore ├── EmojiFoundation ├── EMFEmojiCategory.h ├── EMFEmojiLocaleData.h ├── EMFEmojiPreferences.h ├── EMFEmojiToken.h ├── EMFStringUtilities.h └── EmojiFoundation.h ├── EmojiTester ├── Makefile ├── main.m └── snapshot.txt ├── EmojiUIKit ├── EmojiPageControl.h ├── EmojiUIKit-Structs.h ├── EmojiUIKit.h ├── UIKBKeyView+KBResize.h ├── UIKBRenderConfig+iOS83UIModern.h ├── UIKBRenderFactoryEmoji_iPhone.h ├── UIKBRenderFactory_Emoji.h ├── UIKBRenderFactoryiPhone_Emoji.h ├── UIKeyboardEmoji+EmojiHUD.h ├── UIKeyboardEmoji.h ├── UIKeyboardEmojiCategoriesControl.h ├── UIKeyboardEmojiCategoriesControl_iPad.h ├── UIKeyboardEmojiCategoriesControl_iPhone.h ├── UIKeyboardEmojiCategory+EmojiLocalization.h ├── UIKeyboardEmojiCategory.h ├── UIKeyboardEmojiCategoryBar.h ├── UIKeyboardEmojiCategoryBar_iPad.h ├── UIKeyboardEmojiCategoryBar_iPhone.h ├── UIKeyboardEmojiCategoryController.h ├── UIKeyboardEmojiCategoryUpdate.h ├── UIKeyboardEmojiCollectionInputView.h ├── UIKeyboardEmojiCollectionView.h ├── UIKeyboardEmojiCollectionViewCell.h ├── UIKeyboardEmojiDefaultsController.h ├── UIKeyboardEmojiFactory.h ├── UIKeyboardEmojiFamilyConfigurationView.h ├── UIKeyboardEmojiGraphics.h ├── UIKeyboardEmojiGraphicsTraits.h ├── UIKeyboardEmojiImageView.h ├── UIKeyboardEmojiInput.h ├── UIKeyboardEmojiInputController.h ├── UIKeyboardEmojiKeyDisplayController.h ├── UIKeyboardEmojiKeyView.h ├── UIKeyboardEmojiPage.h ├── UIKeyboardEmojiPreferences.h ├── UIKeyboardEmojiPressIndicationDelegate.h ├── UIKeyboardEmojiRecentsController.h ├── UIKeyboardEmojiScrollView.h ├── UIKeyboardEmojiScrubBarView.h ├── UIKeyboardEmojiSplit.h ├── UIKeyboardEmojiSplitCategoryPicker.h ├── UIKeyboardEmojiView.h ├── UIKeyboardEmojiWellView.h ├── UIKeyboardLayoutEmoji.h ├── UIPeripheralHost+iOS83UIModern.h ├── _UIBackdropViewSettingsLightEmojiKeyboard.h └── _UIEmojiPageControl.h ├── Header.h ├── LICENSE ├── Makefile ├── NSString+MacExtras.m ├── PSEmojiCategory.h ├── PSEmojiType.h ├── PSEmojiUtilities+Emoji.m ├── PSEmojiUtilities+Functions.m ├── PSEmojiUtilities.h ├── PSEmojiUtilities.m ├── buildUniversalLib.sh ├── control ├── copyResources.sh ├── generateHeaders.sh ├── install_to_theos.sh └── libEmojiLibrary.tbd /.gitignore: -------------------------------------------------------------------------------- 1 | obj 2 | .theos 3 | packages/* 4 | .DS_Store 5 | Font-* 6 | EmojiTester/bin -------------------------------------------------------------------------------- /EmojiFoundation/EMFEmojiCategory.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface EMFEmojiCategory : NSObject 4 | + (id)_emojiSetForIdentifier:(NSString *)identifier setCount:(NSUInteger *)count; // iOS 10-10.1 5 | + (NSArray *)_emojiSetForIdentifier:(NSString *)identifier; // iOS 10.2+ 6 | - (NSString *)identifier; 7 | @end 8 | -------------------------------------------------------------------------------- /EmojiFoundation/EMFEmojiLocaleData.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface EMFEmojiLocaleData : NSObject 4 | @end 5 | -------------------------------------------------------------------------------- /EmojiFoundation/EMFEmojiPreferences.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface EMFEmojiPreferences : NSObject 4 | - (void)readEmojiDefaults; 5 | - (void)writeEmojiDefaults; 6 | - (void)resetEmojiDefaults; 7 | @end 8 | -------------------------------------------------------------------------------- /EmojiFoundation/EMFEmojiToken.h: -------------------------------------------------------------------------------- 1 | #import "EMFEmojiLocaleData.h" 2 | 3 | @interface EMFEmojiToken : NSObject 4 | + (instancetype)emojiTokenWithString:(NSString *)string localeData:(EMFEmojiLocaleData *)localeData; 5 | - (NSString *)string; 6 | @end 7 | -------------------------------------------------------------------------------- /EmojiFoundation/EMFStringUtilities.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface EMFStringUtilities : NSObject 4 | + (NSString *)_stringWithUnichar:(UChar32)unichar; 5 | + (NSString *)_baseFirstCharacterString:(NSString *)string; 6 | + (NSString *)_baseStringForEmojiString:(NSString *)emojiString; 7 | + (NSString *)professionSkinToneEmojiBaseKey:(NSString *)emojiString; 8 | + (NSMutableArray *)_skinToneVariantsForString:(NSString *)emojiString; 9 | + (UChar32)_firstLongCharacterOfString:(NSString *)string; 10 | + (int)_skinToneForString:(NSString *)emojiString; 11 | + (BOOL)_emojiString:(NSString *)emojiString containsSubstring:(NSString *)substring; 12 | + (BOOL)_genderEmojiBaseStringNeedVariantSelector:(NSString *)emojiBaseString; 13 | + (BOOL)_hasSkinToneVariantsForString:(NSString *)emojiString; 14 | @end 15 | -------------------------------------------------------------------------------- /EmojiFoundation/EmojiFoundation.h: -------------------------------------------------------------------------------- 1 | #import "EMFEmojiCategory.h" 2 | #import "EMFEmojiLocaleData.h" 3 | #import "EMFEmojiPreferences.h" 4 | #import "EMFEmojiToken.h" 5 | #import "EMFStringUtilities.h" 6 | -------------------------------------------------------------------------------- /EmojiTester/Makefile: -------------------------------------------------------------------------------- 1 | TARGET = macosx 2 | 3 | include $(THEOS)/makefiles/common.mk 4 | 5 | TOOL_NAME = EmojiTester 6 | 7 | EmojiTester_FILES = ../NSString+MacExtras.m ../PSEmojiUtilities.m ../PSEmojiUtilities+Emoji.m ../PSEmojiUtilities+Functions.m main.m 8 | 9 | include $(THEOS_MAKE_PATH)/tool.mk 10 | 11 | after-all:: 12 | @mkdir -p bin 13 | @cp -v $(THEOS_OBJ_DIR)/EmojiTester bin/ -------------------------------------------------------------------------------- /EmojiTester/main.m: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #import "../PSEmojiUtilities.h" 4 | 5 | void prettyPrint(NSArray *array, BOOL wq, int perLine) { 6 | int x = 1; 7 | NSMutableString *string = [NSMutableString string]; 8 | NSLog(@"Total: %lu", (unsigned long)array.count); 9 | for (NSString *substring in array) { 10 | if (wq) 11 | [string appendString:@"@\""]; 12 | [string appendString:substring]; 13 | if (wq) 14 | [string appendString:@"\","]; 15 | else 16 | [string appendString:@","]; 17 | if (x++ % perLine == 0) { 18 | NSLog(@"%@", string); 19 | string.string = @""; 20 | } 21 | else 22 | [string appendString:@" "]; 23 | } 24 | NSLog(@"%@", string); 25 | } 26 | 27 | void printArray(NSString *title, NSArray *array) { 28 | NSLog(@"%@: %@", title, [array componentsJoinedByString:@", "]); 29 | } 30 | 31 | NSString *toUTF32(NSString *string) { 32 | if (string.length == 1) 33 | return [NSString stringWithFormat:@"%x", [PSEmojiUtilities firstLongCharacter:string]]; 34 | NSMutableArray *utf32 = [NSMutableArray array]; 35 | for (int i = 0; i < string.length - 1; i += 2) { 36 | UChar32 cbase = [string characterAtIndex:i]; 37 | if ((cbase & 0xFC00) == 0xD800 && i + 1 < string.length) { 38 | UChar32 y = [string characterAtIndex:i + 1]; 39 | if ((y & 0xFC00) == 0xDC00) 40 | cbase = (cbase << 10) + y - 0x35FDC00; 41 | } else 42 | --i; 43 | [utf32 addObject:[NSString stringWithFormat:@"%x", cbase]]; 44 | } 45 | return [utf32 componentsJoinedByString:@" "]; 46 | } 47 | 48 | void printWithCodepoints(NSString *title, NSString *emoji) { 49 | NSLog(@"%@: %@ %@", title, emoji, toUTF32(emoji)); 50 | } 51 | 52 | void testMultiPerson(NSString *emoji) { 53 | static int modifiers[] = { 1, 3, 4, 5, 6, -1, 0 }; // -1 None, 0 silhouette 54 | NSMutableArray *variants = [NSMutableArray array]; 55 | for (int i = 0; i < 7; ++i) { 56 | NSString *specifier1 = modifiers[i] == 0 ? @"EMFSkinToneSpecifierTypeFitzpatrickSilhouette" : [PSEmojiUtilities skinToneSpecifierTypeFromEmojiFitzpatrickModifier:modifiers[i]]; 57 | for (int j = 0; j < 7; ++j) { 58 | NSString *specifier2 = modifiers[j] == 0 ? @"EMFSkinToneSpecifierTypeFitzpatrickSilhouette" : [PSEmojiUtilities skinToneSpecifierTypeFromEmojiFitzpatrickModifier:modifiers[j]]; 59 | NSString *skinned = [PSEmojiUtilities multiPersonStringForString:emoji skinToneVariantSpecifier:@[specifier1, specifier2]]; 60 | [variants addObject:skinned]; 61 | } 62 | } 63 | NSLog(@"Base %@", emoji); 64 | prettyPrint(variants, YES, 7); 65 | } 66 | 67 | int main(int argc, char *argv[], char *envp[]) { 68 | if (argc != 2) { 69 | printf("Usage: EmojiTester [c|u]\n"); 70 | return EXIT_FAILURE; 71 | } 72 | const char *opt = argv[1]; 73 | bool out = strcmp(opt, "u") == 0; 74 | if (!out && strcmp(opt, "c")) { 75 | printf("Don't\n"); 76 | return EXIT_FAILURE; 77 | } 78 | FILE *fp; 79 | char buffer[4096]; 80 | if ((fp = fopen("snapshot.txt", out ? "w+" : "r")) == NULL) { 81 | printf("Unable to open file: snapshot.txt\n"); 82 | return EXIT_FAILURE; 83 | } 84 | for (NSString *emoji in [PSEmojiUtilities PeopleEmoji]) { 85 | NSMutableString *line = [NSMutableString string]; 86 | NSMutableString *skinCodes = [NSMutableString string]; 87 | [line appendString:emoji]; 88 | if ([PSEmojiUtilities hasSkinToneVariants:emoji]) { 89 | NSArray *variants = [PSEmojiUtilities skinToneVariantsForString:emoji withSelf:NO]; 90 | for (NSString *variant in variants) { 91 | [line appendFormat:@" %@", variant]; 92 | [skinCodes appendFormat:@" %@ /", toUTF32(variant)]; 93 | } 94 | if ([PSEmojiUtilities supportsCoupleSkinToneSelection:emoji]) 95 | testMultiPerson(emoji); 96 | [line appendFormat:@" %@ |%@", toUTF32(emoji), skinCodes]; 97 | } else 98 | [line appendFormat:@" %@", toUTF32(emoji)]; 99 | NSLog(@"%@", line); 100 | const char *cline = [line UTF8String]; 101 | if (out) { 102 | fputs(cline, fp); 103 | fputs("\n", fp); 104 | } else { 105 | fgets(buffer, 4096, fp); 106 | size_t len = strlen(buffer); 107 | if (buffer[len - 1] == '\n') 108 | buffer[len - 1] = '\0'; 109 | if (strcmp(cline, buffer)) { 110 | printf("Snapshot mismatched!\n"); 111 | return EXIT_FAILURE; 112 | } 113 | } 114 | } 115 | fclose(fp); 116 | return 0; 117 | } 118 | -------------------------------------------------------------------------------- /EmojiTester/snapshot.txt: -------------------------------------------------------------------------------- 1 | 😀 1f600 2 | 😃 1f603 3 | 😄 1f604 4 | 😁 1f601 5 | 😆 1f606 6 | 🥹 1f979 7 | 😅 1f605 8 | 😂 1f602 9 | 🤣 1f923 10 | 🥲 1f972 11 | ☺️ 263a 12 | 😊 1f60a 13 | 😇 1f607 14 | 🙂 1f642 15 | 🙃 1f643 16 | 😉 1f609 17 | 😌 1f60c 18 | 😍 1f60d 19 | 🥰 1f970 20 | 😘 1f618 21 | 😗 1f617 22 | 😙 1f619 23 | 😚 1f61a 24 | 😋 1f60b 25 | 😛 1f61b 26 | 😝 1f61d 27 | 😜 1f61c 28 | 🤪 1f92a 29 | 🤨 1f928 30 | 🧐 1f9d0 31 | 🤓 1f913 32 | 😎 1f60e 33 | 🥸 1f978 34 | 🤩 1f929 35 | 🥳 1f973 36 | 🙂‍↕️ 1f642 200d 2195 37 | 😏 1f60f 38 | 😒 1f612 39 | 🙂‍↔️ 1f642 200d 2194 40 | 😞 1f61e 41 | 😔 1f614 42 | 😟 1f61f 43 | 😕 1f615 44 | 🙁 1f641 45 | ☹️ 2639 46 | 😣 1f623 47 | 😖 1f616 48 | 😫 1f62b 49 | 😩 1f629 50 | 🥺 1f97a 51 | 😢 1f622 52 | 😭 1f62d 53 | 😤 1f624 54 | 😠 1f620 55 | 😡 1f621 56 | 🤬 1f92c 57 | 🤯 1f92f 58 | 😳 1f633 59 | 🥵 1f975 60 | 🥶 1f976 61 | 😶‍🌫️ 1f636 200d 1f32b 62 | 😱 1f631 63 | 😨 1f628 64 | 😰 1f630 65 | 😥 1f625 66 | 😓 1f613 67 | 🤗 1f917 68 | 🤔 1f914 69 | 🫣 1fae3 70 | 🤭 1f92d 71 | 🫢 1fae2 72 | 🫡 1fae1 73 | 🤫 1f92b 74 | 🫠 1fae0 75 | 🤥 1f925 76 | 😶 1f636 77 | 🫥 1fae5 78 | 😐 1f610 79 | 🫤 1fae4 80 | 😑 1f611 81 | 🫨 1fae8 82 | 😬 1f62c 83 | 🙄 1f644 84 | 😯 1f62f 85 | 😦 1f626 86 | 😧 1f627 87 | 😮 1f62e 88 | 😲 1f632 89 | 🥱 1f971 90 | 😴 1f634 91 | 🤤 1f924 92 | 😪 1f62a 93 | 😮‍💨 1f62e 200d 1f4a8 94 | 😵 1f635 95 | 😵‍💫 1f635 200d 1f4ab 96 | 🤐 1f910 97 | 🥴 1f974 98 | 🤢 1f922 99 | 🤮 1f92e 100 | 🤧 1f927 101 | 😷 1f637 102 | 🤒 1f912 103 | 🤕 1f915 104 | 🤑 1f911 105 | 🤠 1f920 106 | 😈 1f608 107 | 👿 1f47f 108 | 👹 1f479 109 | 👺 1f47a 110 | 🤡 1f921 111 | 💩 1f4a9 112 | 👻 1f47b 113 | 💀 1f480 114 | ☠️ 2620 115 | 👽 1f47d 116 | 👾 1f47e 117 | 🤖 1f916 118 | 🎃 1f383 119 | 😺 1f63a 120 | 😸 1f638 121 | 😹 1f639 122 | 😻 1f63b 123 | 😼 1f63c 124 | 😽 1f63d 125 | 🙀 1f640 126 | 😿 1f63f 127 | 😾 1f63e 128 | 🫶 🫶🏻 🫶🏼 🫶🏽 🫶🏾 🫶🏿 1faf6 | 1faf6 1f3fb / 1faf6 1f3fc / 1faf6 1f3fd / 1faf6 1f3fe / 1faf6 1f3ff / 129 | 🤲 🤲🏻 🤲🏼 🤲🏽 🤲🏾 🤲🏿 1f932 | 1f932 1f3fb / 1f932 1f3fc / 1f932 1f3fd / 1f932 1f3fe / 1f932 1f3ff / 130 | 👐 👐🏻 👐🏼 👐🏽 👐🏾 👐🏿 1f450 | 1f450 1f3fb / 1f450 1f3fc / 1f450 1f3fd / 1f450 1f3fe / 1f450 1f3ff / 131 | 🙌 🙌🏻 🙌🏼 🙌🏽 🙌🏾 🙌🏿 1f64c | 1f64c 1f3fb / 1f64c 1f3fc / 1f64c 1f3fd / 1f64c 1f3fe / 1f64c 1f3ff / 132 | 👏 👏🏻 👏🏼 👏🏽 👏🏾 👏🏿 1f44f | 1f44f 1f3fb / 1f44f 1f3fc / 1f44f 1f3fd / 1f44f 1f3fe / 1f44f 1f3ff / 133 | 🤝 🤝🏻 🫱🏻‍🫲🏼 🫱🏻‍🫲🏽 🫱🏻‍🫲🏾 🫱🏻‍🫲🏿 🫱🏼‍🫲🏻 🤝🏼 🫱🏼‍🫲🏽 🫱🏼‍🫲🏾 🫱🏼‍🫲🏿 🫱🏽‍🫲🏻 🫱🏽‍🫲🏼 🤝🏽 🫱🏽‍🫲🏾 🫱🏽‍🫲🏿 🫱🏾‍🫲🏻 🫱🏾‍🫲🏼 🫱🏾‍🫲🏽 🤝🏾 🫱🏾‍🫲🏿 🫱🏿‍🫲🏻 🫱🏿‍🫲🏼 🫱🏿‍🫲🏽 🫱🏿‍🫲🏾 🤝🏿 1f91d | 1f91d 1f3fb / 1faf1 1f3fb 200d 1faf2 1f3fc / 1faf1 1f3fb 200d 1faf2 1f3fd / 1faf1 1f3fb 200d 1faf2 1f3fe / 1faf1 1f3fb 200d 1faf2 1f3ff / 1faf1 1f3fc 200d 1faf2 1f3fb / 1f91d 1f3fc / 1faf1 1f3fc 200d 1faf2 1f3fd / 1faf1 1f3fc 200d 1faf2 1f3fe / 1faf1 1f3fc 200d 1faf2 1f3ff / 1faf1 1f3fd 200d 1faf2 1f3fb / 1faf1 1f3fd 200d 1faf2 1f3fc / 1f91d 1f3fd / 1faf1 1f3fd 200d 1faf2 1f3fe / 1faf1 1f3fd 200d 1faf2 1f3ff / 1faf1 1f3fe 200d 1faf2 1f3fb / 1faf1 1f3fe 200d 1faf2 1f3fc / 1faf1 1f3fe 200d 1faf2 1f3fd / 1f91d 1f3fe / 1faf1 1f3fe 200d 1faf2 1f3ff / 1faf1 1f3ff 200d 1faf2 1f3fb / 1faf1 1f3ff 200d 1faf2 1f3fc / 1faf1 1f3ff 200d 1faf2 1f3fd / 1faf1 1f3ff 200d 1faf2 1f3fe / 1f91d 1f3ff / 134 | 👍 👍🏻 👍🏼 👍🏽 👍🏾 👍🏿 1f44d | 1f44d 1f3fb / 1f44d 1f3fc / 1f44d 1f3fd / 1f44d 1f3fe / 1f44d 1f3ff / 135 | 👎 👎🏻 👎🏼 👎🏽 👎🏾 👎🏿 1f44e | 1f44e 1f3fb / 1f44e 1f3fc / 1f44e 1f3fd / 1f44e 1f3fe / 1f44e 1f3ff / 136 | 👊 👊🏻 👊🏼 👊🏽 👊🏾 👊🏿 1f44a | 1f44a 1f3fb / 1f44a 1f3fc / 1f44a 1f3fd / 1f44a 1f3fe / 1f44a 1f3ff / 137 | ✊ ✊🏻 ✊🏼 ✊🏽 ✊🏾 ✊🏿 270a | 270a 1f3fb / 270a 1f3fc / 270a 1f3fd / 270a 1f3fe / 270a 1f3ff / 138 | 🤛 🤛🏻 🤛🏼 🤛🏽 🤛🏾 🤛🏿 1f91b | 1f91b 1f3fb / 1f91b 1f3fc / 1f91b 1f3fd / 1f91b 1f3fe / 1f91b 1f3ff / 139 | 🤜 🤜🏻 🤜🏼 🤜🏽 🤜🏾 🤜🏿 1f91c | 1f91c 1f3fb / 1f91c 1f3fc / 1f91c 1f3fd / 1f91c 1f3fe / 1f91c 1f3ff / 140 | 🫷 🫷🏻 🫷🏼 🫷🏽 🫷🏾 🫷🏿 1faf7 | 1faf7 1f3fb / 1faf7 1f3fc / 1faf7 1f3fd / 1faf7 1f3fe / 1faf7 1f3ff / 141 | 🫸 🫸🏻 🫸🏼 🫸🏽 🫸🏾 🫸🏿 1faf8 | 1faf8 1f3fb / 1faf8 1f3fc / 1faf8 1f3fd / 1faf8 1f3fe / 1faf8 1f3ff / 142 | 🤞 🤞🏻 🤞🏼 🤞🏽 🤞🏾 🤞🏿 1f91e | 1f91e 1f3fb / 1f91e 1f3fc / 1f91e 1f3fd / 1f91e 1f3fe / 1f91e 1f3ff / 143 | ✌️ ✌🏻 ✌🏼 ✌🏽 ✌🏾 ✌🏿 270c | 270c 1f3fb / 270c 1f3fc / 270c 1f3fd / 270c 1f3fe / 270c 1f3ff / 144 | 🫰 🫰🏻 🫰🏼 🫰🏽 🫰🏾 🫰🏿 1faf0 | 1faf0 1f3fb / 1faf0 1f3fc / 1faf0 1f3fd / 1faf0 1f3fe / 1faf0 1f3ff / 145 | 🤟 🤟🏻 🤟🏼 🤟🏽 🤟🏾 🤟🏿 1f91f | 1f91f 1f3fb / 1f91f 1f3fc / 1f91f 1f3fd / 1f91f 1f3fe / 1f91f 1f3ff / 146 | 🤘 🤘🏻 🤘🏼 🤘🏽 🤘🏾 🤘🏿 1f918 | 1f918 1f3fb / 1f918 1f3fc / 1f918 1f3fd / 1f918 1f3fe / 1f918 1f3ff / 147 | 👌 👌🏻 👌🏼 👌🏽 👌🏾 👌🏿 1f44c | 1f44c 1f3fb / 1f44c 1f3fc / 1f44c 1f3fd / 1f44c 1f3fe / 1f44c 1f3ff / 148 | 🤌 🤌🏻 🤌🏼 🤌🏽 🤌🏾 🤌🏿 1f90c | 1f90c 1f3fb / 1f90c 1f3fc / 1f90c 1f3fd / 1f90c 1f3fe / 1f90c 1f3ff / 149 | 🤏 🤏🏻 🤏🏼 🤏🏽 🤏🏾 🤏🏿 1f90f | 1f90f 1f3fb / 1f90f 1f3fc / 1f90f 1f3fd / 1f90f 1f3fe / 1f90f 1f3ff / 150 | 🫳 🫳🏻 🫳🏼 🫳🏽 🫳🏾 🫳🏿 1faf3 | 1faf3 1f3fb / 1faf3 1f3fc / 1faf3 1f3fd / 1faf3 1f3fe / 1faf3 1f3ff / 151 | 🫴 🫴🏻 🫴🏼 🫴🏽 🫴🏾 🫴🏿 1faf4 | 1faf4 1f3fb / 1faf4 1f3fc / 1faf4 1f3fd / 1faf4 1f3fe / 1faf4 1f3ff / 152 | 👈 👈🏻 👈🏼 👈🏽 👈🏾 👈🏿 1f448 | 1f448 1f3fb / 1f448 1f3fc / 1f448 1f3fd / 1f448 1f3fe / 1f448 1f3ff / 153 | 👉 👉🏻 👉🏼 👉🏽 👉🏾 👉🏿 1f449 | 1f449 1f3fb / 1f449 1f3fc / 1f449 1f3fd / 1f449 1f3fe / 1f449 1f3ff / 154 | 👆 👆🏻 👆🏼 👆🏽 👆🏾 👆🏿 1f446 | 1f446 1f3fb / 1f446 1f3fc / 1f446 1f3fd / 1f446 1f3fe / 1f446 1f3ff / 155 | 👇 👇🏻 👇🏼 👇🏽 👇🏾 👇🏿 1f447 | 1f447 1f3fb / 1f447 1f3fc / 1f447 1f3fd / 1f447 1f3fe / 1f447 1f3ff / 156 | ☝️ ☝🏻 ☝🏼 ☝🏽 ☝🏾 ☝🏿 261d | 261d 1f3fb / 261d 1f3fc / 261d 1f3fd / 261d 1f3fe / 261d 1f3ff / 157 | ✋ ✋🏻 ✋🏼 ✋🏽 ✋🏾 ✋🏿 270b | 270b 1f3fb / 270b 1f3fc / 270b 1f3fd / 270b 1f3fe / 270b 1f3ff / 158 | 🤚 🤚🏻 🤚🏼 🤚🏽 🤚🏾 🤚🏿 1f91a | 1f91a 1f3fb / 1f91a 1f3fc / 1f91a 1f3fd / 1f91a 1f3fe / 1f91a 1f3ff / 159 | 🖐️ 🖐🏻 🖐🏼 🖐🏽 🖐🏾 🖐🏿 1f590 | 1f590 1f3fb / 1f590 1f3fc / 1f590 1f3fd / 1f590 1f3fe / 1f590 1f3ff / 160 | 🖖 🖖🏻 🖖🏼 🖖🏽 🖖🏾 🖖🏿 1f596 | 1f596 1f3fb / 1f596 1f3fc / 1f596 1f3fd / 1f596 1f3fe / 1f596 1f3ff / 161 | 👋 👋🏻 👋🏼 👋🏽 👋🏾 👋🏿 1f44b | 1f44b 1f3fb / 1f44b 1f3fc / 1f44b 1f3fd / 1f44b 1f3fe / 1f44b 1f3ff / 162 | 🤙 🤙🏻 🤙🏼 🤙🏽 🤙🏾 🤙🏿 1f919 | 1f919 1f3fb / 1f919 1f3fc / 1f919 1f3fd / 1f919 1f3fe / 1f919 1f3ff / 163 | 🫲 🫲🏻 🫲🏼 🫲🏽 🫲🏾 🫲🏿 1faf2 | 1faf2 1f3fb / 1faf2 1f3fc / 1faf2 1f3fd / 1faf2 1f3fe / 1faf2 1f3ff / 164 | 🫱 🫱🏻 🫱🏼 🫱🏽 🫱🏾 🫱🏿 1faf1 | 1faf1 1f3fb / 1faf1 1f3fc / 1faf1 1f3fd / 1faf1 1f3fe / 1faf1 1f3ff / 165 | 💪 💪🏻 💪🏼 💪🏽 💪🏾 💪🏿 1f4aa | 1f4aa 1f3fb / 1f4aa 1f3fc / 1f4aa 1f3fd / 1f4aa 1f3fe / 1f4aa 1f3ff / 166 | 🦾 1f9be 167 | 🖕 🖕🏻 🖕🏼 🖕🏽 🖕🏾 🖕🏿 1f595 | 1f595 1f3fb / 1f595 1f3fc / 1f595 1f3fd / 1f595 1f3fe / 1f595 1f3ff / 168 | ✍️ ✍🏻 ✍🏼 ✍🏽 ✍🏾 ✍🏿 270d | 270d 1f3fb / 270d 1f3fc / 270d 1f3fd / 270d 1f3fe / 270d 1f3ff / 169 | 🙏 🙏🏻 🙏🏼 🙏🏽 🙏🏾 🙏🏿 1f64f | 1f64f 1f3fb / 1f64f 1f3fc / 1f64f 1f3fd / 1f64f 1f3fe / 1f64f 1f3ff / 170 | 🫵 🫵🏻 🫵🏼 🫵🏽 🫵🏾 🫵🏿 1faf5 | 1faf5 1f3fb / 1faf5 1f3fc / 1faf5 1f3fd / 1faf5 1f3fe / 1faf5 1f3ff / 171 | 🦶 🦶🏻 🦶🏼 🦶🏽 🦶🏾 🦶🏿 1f9b6 | 1f9b6 1f3fb / 1f9b6 1f3fc / 1f9b6 1f3fd / 1f9b6 1f3fe / 1f9b6 1f3ff / 172 | 🦵 🦵🏻 🦵🏼 🦵🏽 🦵🏾 🦵🏿 1f9b5 | 1f9b5 1f3fb / 1f9b5 1f3fc / 1f9b5 1f3fd / 1f9b5 1f3fe / 1f9b5 1f3ff / 173 | 🦿 1f9bf 174 | 💄 1f484 175 | 💋 1f48b 176 | 👄 1f444 177 | 🫦 1fae6 178 | 🦷 1f9b7 179 | 👅 1f445 180 | 👂 👂🏻 👂🏼 👂🏽 👂🏾 👂🏿 1f442 | 1f442 1f3fb / 1f442 1f3fc / 1f442 1f3fd / 1f442 1f3fe / 1f442 1f3ff / 181 | 🦻 🦻🏻 🦻🏼 🦻🏽 🦻🏾 🦻🏿 1f9bb | 1f9bb 1f3fb / 1f9bb 1f3fc / 1f9bb 1f3fd / 1f9bb 1f3fe / 1f9bb 1f3ff / 182 | 👃 👃🏻 👃🏼 👃🏽 👃🏾 👃🏿 1f443 | 1f443 1f3fb / 1f443 1f3fc / 1f443 1f3fd / 1f443 1f3fe / 1f443 1f3ff / 183 | 👣 1f463 184 | 👁️ 1f441 185 | 👀 1f440 186 | 🫀 1fac0 187 | 🫁 1fac1 188 | 🧠 1f9e0 189 | 🗣️ 1f5e3 190 | 👤 1f464 191 | 👥 1f465 192 | 🫂 1fac2 193 | 👶 👶🏻 👶🏼 👶🏽 👶🏾 👶🏿 1f476 | 1f476 1f3fb / 1f476 1f3fc / 1f476 1f3fd / 1f476 1f3fe / 1f476 1f3ff / 194 | 👧 👧🏻 👧🏼 👧🏽 👧🏾 👧🏿 1f467 | 1f467 1f3fb / 1f467 1f3fc / 1f467 1f3fd / 1f467 1f3fe / 1f467 1f3ff / 195 | 🧒 🧒🏻 🧒🏼 🧒🏽 🧒🏾 🧒🏿 1f9d2 | 1f9d2 1f3fb / 1f9d2 1f3fc / 1f9d2 1f3fd / 1f9d2 1f3fe / 1f9d2 1f3ff / 196 | 👦 👦🏻 👦🏼 👦🏽 👦🏾 👦🏿 1f466 | 1f466 1f3fb / 1f466 1f3fc / 1f466 1f3fd / 1f466 1f3fe / 1f466 1f3ff / 197 | 👩 👩🏻 👩🏼 👩🏽 👩🏾 👩🏿 1f469 | 1f469 1f3fb / 1f469 1f3fc / 1f469 1f3fd / 1f469 1f3fe / 1f469 1f3ff / 198 | 🧑 🧑🏻 🧑🏼 🧑🏽 🧑🏾 🧑🏿 1f9d1 | 1f9d1 1f3fb / 1f9d1 1f3fc / 1f9d1 1f3fd / 1f9d1 1f3fe / 1f9d1 1f3ff / 199 | 👨 👨🏻 👨🏼 👨🏽 👨🏾 👨🏿 1f468 | 1f468 1f3fb / 1f468 1f3fc / 1f468 1f3fd / 1f468 1f3fe / 1f468 1f3ff / 200 | 👩‍🦱 👩🏻‍🦱 👩🏼‍🦱 👩🏽‍🦱 👩🏾‍🦱 👩🏿‍🦱 1f469 200d 1f9b1 | 1f469 1f3fb 200d 1f9b1 / 1f469 1f3fc 200d 1f9b1 / 1f469 1f3fd 200d 1f9b1 / 1f469 1f3fe 200d 1f9b1 / 1f469 1f3ff 200d 1f9b1 / 201 | 🧑‍🦱 🧑🏻‍🦱 🧑🏼‍🦱 🧑🏽‍🦱 🧑🏾‍🦱 🧑🏿‍🦱 1f9d1 200d 1f9b1 | 1f9d1 1f3fb 200d 1f9b1 / 1f9d1 1f3fc 200d 1f9b1 / 1f9d1 1f3fd 200d 1f9b1 / 1f9d1 1f3fe 200d 1f9b1 / 1f9d1 1f3ff 200d 1f9b1 / 202 | 👨‍🦱 👨🏻‍🦱 👨🏼‍🦱 👨🏽‍🦱 👨🏾‍🦱 👨🏿‍🦱 1f468 200d 1f9b1 | 1f468 1f3fb 200d 1f9b1 / 1f468 1f3fc 200d 1f9b1 / 1f468 1f3fd 200d 1f9b1 / 1f468 1f3fe 200d 1f9b1 / 1f468 1f3ff 200d 1f9b1 / 203 | 👩‍🦰 👩🏻‍🦰 👩🏼‍🦰 👩🏽‍🦰 👩🏾‍🦰 👩🏿‍🦰 1f469 200d 1f9b0 | 1f469 1f3fb 200d 1f9b0 / 1f469 1f3fc 200d 1f9b0 / 1f469 1f3fd 200d 1f9b0 / 1f469 1f3fe 200d 1f9b0 / 1f469 1f3ff 200d 1f9b0 / 204 | 🧑‍🦰 🧑🏻‍🦰 🧑🏼‍🦰 🧑🏽‍🦰 🧑🏾‍🦰 🧑🏿‍🦰 1f9d1 200d 1f9b0 | 1f9d1 1f3fb 200d 1f9b0 / 1f9d1 1f3fc 200d 1f9b0 / 1f9d1 1f3fd 200d 1f9b0 / 1f9d1 1f3fe 200d 1f9b0 / 1f9d1 1f3ff 200d 1f9b0 / 205 | 👨‍🦰 👨🏻‍🦰 👨🏼‍🦰 👨🏽‍🦰 👨🏾‍🦰 👨🏿‍🦰 1f468 200d 1f9b0 | 1f468 1f3fb 200d 1f9b0 / 1f468 1f3fc 200d 1f9b0 / 1f468 1f3fd 200d 1f9b0 / 1f468 1f3fe 200d 1f9b0 / 1f468 1f3ff 200d 1f9b0 / 206 | 👱‍♀️ 👱🏻‍♀️ 👱🏼‍♀️ 👱🏽‍♀️ 👱🏾‍♀️ 👱🏿‍♀️ 1f471 200d 2640 | 1f471 1f3fb 200d 2640 / 1f471 1f3fc 200d 2640 / 1f471 1f3fd 200d 2640 / 1f471 1f3fe 200d 2640 / 1f471 1f3ff 200d 2640 / 207 | 👱 👱🏻 👱🏼 👱🏽 👱🏾 👱🏿 1f471 | 1f471 1f3fb / 1f471 1f3fc / 1f471 1f3fd / 1f471 1f3fe / 1f471 1f3ff / 208 | 👱‍♂️ 👱🏻‍♂️ 👱🏼‍♂️ 👱🏽‍♂️ 👱🏾‍♂️ 👱🏿‍♂️ 1f471 200d 2642 | 1f471 1f3fb 200d 2642 / 1f471 1f3fc 200d 2642 / 1f471 1f3fd 200d 2642 / 1f471 1f3fe 200d 2642 / 1f471 1f3ff 200d 2642 / 209 | 👩‍🦳 👩🏻‍🦳 👩🏼‍🦳 👩🏽‍🦳 👩🏾‍🦳 👩🏿‍🦳 1f469 200d 1f9b3 | 1f469 1f3fb 200d 1f9b3 / 1f469 1f3fc 200d 1f9b3 / 1f469 1f3fd 200d 1f9b3 / 1f469 1f3fe 200d 1f9b3 / 1f469 1f3ff 200d 1f9b3 / 210 | 🧑‍🦳 🧑🏻‍🦳 🧑🏼‍🦳 🧑🏽‍🦳 🧑🏾‍🦳 🧑🏿‍🦳 1f9d1 200d 1f9b3 | 1f9d1 1f3fb 200d 1f9b3 / 1f9d1 1f3fc 200d 1f9b3 / 1f9d1 1f3fd 200d 1f9b3 / 1f9d1 1f3fe 200d 1f9b3 / 1f9d1 1f3ff 200d 1f9b3 / 211 | 👨‍🦳 👨🏻‍🦳 👨🏼‍🦳 👨🏽‍🦳 👨🏾‍🦳 👨🏿‍🦳 1f468 200d 1f9b3 | 1f468 1f3fb 200d 1f9b3 / 1f468 1f3fc 200d 1f9b3 / 1f468 1f3fd 200d 1f9b3 / 1f468 1f3fe 200d 1f9b3 / 1f468 1f3ff 200d 1f9b3 / 212 | 👩‍🦲 👩🏻‍🦲 👩🏼‍🦲 👩🏽‍🦲 👩🏾‍🦲 👩🏿‍🦲 1f469 200d 1f9b2 | 1f469 1f3fb 200d 1f9b2 / 1f469 1f3fc 200d 1f9b2 / 1f469 1f3fd 200d 1f9b2 / 1f469 1f3fe 200d 1f9b2 / 1f469 1f3ff 200d 1f9b2 / 213 | 🧑‍🦲 🧑🏻‍🦲 🧑🏼‍🦲 🧑🏽‍🦲 🧑🏾‍🦲 🧑🏿‍🦲 1f9d1 200d 1f9b2 | 1f9d1 1f3fb 200d 1f9b2 / 1f9d1 1f3fc 200d 1f9b2 / 1f9d1 1f3fd 200d 1f9b2 / 1f9d1 1f3fe 200d 1f9b2 / 1f9d1 1f3ff 200d 1f9b2 / 214 | 👨‍🦲 👨🏻‍🦲 👨🏼‍🦲 👨🏽‍🦲 👨🏾‍🦲 👨🏿‍🦲 1f468 200d 1f9b2 | 1f468 1f3fb 200d 1f9b2 / 1f468 1f3fc 200d 1f9b2 / 1f468 1f3fd 200d 1f9b2 / 1f468 1f3fe 200d 1f9b2 / 1f468 1f3ff 200d 1f9b2 / 215 | 🧔‍♀️ 🧔🏻‍♀️ 🧔🏼‍♀️ 🧔🏽‍♀️ 🧔🏾‍♀️ 🧔🏿‍♀️ 1f9d4 200d 2640 | 1f9d4 1f3fb 200d 2640 / 1f9d4 1f3fc 200d 2640 / 1f9d4 1f3fd 200d 2640 / 1f9d4 1f3fe 200d 2640 / 1f9d4 1f3ff 200d 2640 / 216 | 🧔 🧔🏻 🧔🏼 🧔🏽 🧔🏾 🧔🏿 1f9d4 | 1f9d4 1f3fb / 1f9d4 1f3fc / 1f9d4 1f3fd / 1f9d4 1f3fe / 1f9d4 1f3ff / 217 | 🧔‍♂️ 🧔🏻‍♂️ 🧔🏼‍♂️ 🧔🏽‍♂️ 🧔🏾‍♂️ 🧔🏿‍♂️ 1f9d4 200d 2642 | 1f9d4 1f3fb 200d 2642 / 1f9d4 1f3fc 200d 2642 / 1f9d4 1f3fd 200d 2642 / 1f9d4 1f3fe 200d 2642 / 1f9d4 1f3ff 200d 2642 / 218 | 👵 👵🏻 👵🏼 👵🏽 👵🏾 👵🏿 1f475 | 1f475 1f3fb / 1f475 1f3fc / 1f475 1f3fd / 1f475 1f3fe / 1f475 1f3ff / 219 | 🧓 🧓🏻 🧓🏼 🧓🏽 🧓🏾 🧓🏿 1f9d3 | 1f9d3 1f3fb / 1f9d3 1f3fc / 1f9d3 1f3fd / 1f9d3 1f3fe / 1f9d3 1f3ff / 220 | 👴 👴🏻 👴🏼 👴🏽 👴🏾 👴🏿 1f474 | 1f474 1f3fb / 1f474 1f3fc / 1f474 1f3fd / 1f474 1f3fe / 1f474 1f3ff / 221 | 👲 👲🏻 👲🏼 👲🏽 👲🏾 👲🏿 1f472 | 1f472 1f3fb / 1f472 1f3fc / 1f472 1f3fd / 1f472 1f3fe / 1f472 1f3ff / 222 | 👳‍♀️ 👳🏻‍♀️ 👳🏼‍♀️ 👳🏽‍♀️ 👳🏾‍♀️ 👳🏿‍♀️ 1f473 200d 2640 | 1f473 1f3fb 200d 2640 / 1f473 1f3fc 200d 2640 / 1f473 1f3fd 200d 2640 / 1f473 1f3fe 200d 2640 / 1f473 1f3ff 200d 2640 / 223 | 👳 👳🏻 👳🏼 👳🏽 👳🏾 👳🏿 1f473 | 1f473 1f3fb / 1f473 1f3fc / 1f473 1f3fd / 1f473 1f3fe / 1f473 1f3ff / 224 | 👳‍♂️ 👳🏻‍♂️ 👳🏼‍♂️ 👳🏽‍♂️ 👳🏾‍♂️ 👳🏿‍♂️ 1f473 200d 2642 | 1f473 1f3fb 200d 2642 / 1f473 1f3fc 200d 2642 / 1f473 1f3fd 200d 2642 / 1f473 1f3fe 200d 2642 / 1f473 1f3ff 200d 2642 / 225 | 🧕 🧕🏻 🧕🏼 🧕🏽 🧕🏾 🧕🏿 1f9d5 | 1f9d5 1f3fb / 1f9d5 1f3fc / 1f9d5 1f3fd / 1f9d5 1f3fe / 1f9d5 1f3ff / 226 | 👮‍♀️ 👮🏻‍♀️ 👮🏼‍♀️ 👮🏽‍♀️ 👮🏾‍♀️ 👮🏿‍♀️ 1f46e 200d 2640 | 1f46e 1f3fb 200d 2640 / 1f46e 1f3fc 200d 2640 / 1f46e 1f3fd 200d 2640 / 1f46e 1f3fe 200d 2640 / 1f46e 1f3ff 200d 2640 / 227 | 👮 👮🏻 👮🏼 👮🏽 👮🏾 👮🏿 1f46e | 1f46e 1f3fb / 1f46e 1f3fc / 1f46e 1f3fd / 1f46e 1f3fe / 1f46e 1f3ff / 228 | 👮‍♂️ 👮🏻‍♂️ 👮🏼‍♂️ 👮🏽‍♂️ 👮🏾‍♂️ 👮🏿‍♂️ 1f46e 200d 2642 | 1f46e 1f3fb 200d 2642 / 1f46e 1f3fc 200d 2642 / 1f46e 1f3fd 200d 2642 / 1f46e 1f3fe 200d 2642 / 1f46e 1f3ff 200d 2642 / 229 | 👷‍♀️ 👷🏻‍♀️ 👷🏼‍♀️ 👷🏽‍♀️ 👷🏾‍♀️ 👷🏿‍♀️ 1f477 200d 2640 | 1f477 1f3fb 200d 2640 / 1f477 1f3fc 200d 2640 / 1f477 1f3fd 200d 2640 / 1f477 1f3fe 200d 2640 / 1f477 1f3ff 200d 2640 / 230 | 👷 👷🏻 👷🏼 👷🏽 👷🏾 👷🏿 1f477 | 1f477 1f3fb / 1f477 1f3fc / 1f477 1f3fd / 1f477 1f3fe / 1f477 1f3ff / 231 | 👷‍♂️ 👷🏻‍♂️ 👷🏼‍♂️ 👷🏽‍♂️ 👷🏾‍♂️ 👷🏿‍♂️ 1f477 200d 2642 | 1f477 1f3fb 200d 2642 / 1f477 1f3fc 200d 2642 / 1f477 1f3fd 200d 2642 / 1f477 1f3fe 200d 2642 / 1f477 1f3ff 200d 2642 / 232 | 💂‍♀️ 💂🏻‍♀️ 💂🏼‍♀️ 💂🏽‍♀️ 💂🏾‍♀️ 💂🏿‍♀️ 1f482 200d 2640 | 1f482 1f3fb 200d 2640 / 1f482 1f3fc 200d 2640 / 1f482 1f3fd 200d 2640 / 1f482 1f3fe 200d 2640 / 1f482 1f3ff 200d 2640 / 233 | 💂 💂🏻 💂🏼 💂🏽 💂🏾 💂🏿 1f482 | 1f482 1f3fb / 1f482 1f3fc / 1f482 1f3fd / 1f482 1f3fe / 1f482 1f3ff / 234 | 💂‍♂️ 💂🏻‍♂️ 💂🏼‍♂️ 💂🏽‍♂️ 💂🏾‍♂️ 💂🏿‍♂️ 1f482 200d 2642 | 1f482 1f3fb 200d 2642 / 1f482 1f3fc 200d 2642 / 1f482 1f3fd 200d 2642 / 1f482 1f3fe 200d 2642 / 1f482 1f3ff 200d 2642 / 235 | 🕵️‍♀️ 🕵🏻‍♀️ 🕵🏼‍♀️ 🕵🏽‍♀️ 🕵🏾‍♀️ 🕵🏿‍♀️ 1f575 fe0f 200d 2640 | 1f575 1f3fb 200d 2640 / 1f575 1f3fc 200d 2640 / 1f575 1f3fd 200d 2640 / 1f575 1f3fe 200d 2640 / 1f575 1f3ff 200d 2640 / 236 | 🕵️ 🕵🏻 🕵🏼 🕵🏽 🕵🏾 🕵🏿 1f575 | 1f575 1f3fb / 1f575 1f3fc / 1f575 1f3fd / 1f575 1f3fe / 1f575 1f3ff / 237 | 🕵️‍♂️ 🕵🏻‍♂️ 🕵🏼‍♂️ 🕵🏽‍♂️ 🕵🏾‍♂️ 🕵🏿‍♂️ 1f575 fe0f 200d 2642 | 1f575 1f3fb 200d 2642 / 1f575 1f3fc 200d 2642 / 1f575 1f3fd 200d 2642 / 1f575 1f3fe 200d 2642 / 1f575 1f3ff 200d 2642 / 238 | 👩‍⚕️ 👩🏻‍⚕️ 👩🏼‍⚕️ 👩🏽‍⚕️ 👩🏾‍⚕️ 👩🏿‍⚕️ 1f469 200d 2695 | 1f469 1f3fb 200d 2695 / 1f469 1f3fc 200d 2695 / 1f469 1f3fd 200d 2695 / 1f469 1f3fe 200d 2695 / 1f469 1f3ff 200d 2695 / 239 | 🧑‍⚕️ 🧑🏻‍⚕️ 🧑🏼‍⚕️ 🧑🏽‍⚕️ 🧑🏾‍⚕️ 🧑🏿‍⚕️ 1f9d1 200d 2695 | 1f9d1 1f3fb 200d 2695 / 1f9d1 1f3fc 200d 2695 / 1f9d1 1f3fd 200d 2695 / 1f9d1 1f3fe 200d 2695 / 1f9d1 1f3ff 200d 2695 / 240 | 👨‍⚕️ 👨🏻‍⚕️ 👨🏼‍⚕️ 👨🏽‍⚕️ 👨🏾‍⚕️ 👨🏿‍⚕️ 1f468 200d 2695 | 1f468 1f3fb 200d 2695 / 1f468 1f3fc 200d 2695 / 1f468 1f3fd 200d 2695 / 1f468 1f3fe 200d 2695 / 1f468 1f3ff 200d 2695 / 241 | 👩‍🌾 👩🏻‍🌾 👩🏼‍🌾 👩🏽‍🌾 👩🏾‍🌾 👩🏿‍🌾 1f469 200d 1f33e | 1f469 1f3fb 200d 1f33e / 1f469 1f3fc 200d 1f33e / 1f469 1f3fd 200d 1f33e / 1f469 1f3fe 200d 1f33e / 1f469 1f3ff 200d 1f33e / 242 | 🧑‍🌾 🧑🏻‍🌾 🧑🏼‍🌾 🧑🏽‍🌾 🧑🏾‍🌾 🧑🏿‍🌾 1f9d1 200d 1f33e | 1f9d1 1f3fb 200d 1f33e / 1f9d1 1f3fc 200d 1f33e / 1f9d1 1f3fd 200d 1f33e / 1f9d1 1f3fe 200d 1f33e / 1f9d1 1f3ff 200d 1f33e / 243 | 👨‍🌾 👨🏻‍🌾 👨🏼‍🌾 👨🏽‍🌾 👨🏾‍🌾 👨🏿‍🌾 1f468 200d 1f33e | 1f468 1f3fb 200d 1f33e / 1f468 1f3fc 200d 1f33e / 1f468 1f3fd 200d 1f33e / 1f468 1f3fe 200d 1f33e / 1f468 1f3ff 200d 1f33e / 244 | 👩‍🍳 👩🏻‍🍳 👩🏼‍🍳 👩🏽‍🍳 👩🏾‍🍳 👩🏿‍🍳 1f469 200d 1f373 | 1f469 1f3fb 200d 1f373 / 1f469 1f3fc 200d 1f373 / 1f469 1f3fd 200d 1f373 / 1f469 1f3fe 200d 1f373 / 1f469 1f3ff 200d 1f373 / 245 | 🧑‍🍳 🧑🏻‍🍳 🧑🏼‍🍳 🧑🏽‍🍳 🧑🏾‍🍳 🧑🏿‍🍳 1f9d1 200d 1f373 | 1f9d1 1f3fb 200d 1f373 / 1f9d1 1f3fc 200d 1f373 / 1f9d1 1f3fd 200d 1f373 / 1f9d1 1f3fe 200d 1f373 / 1f9d1 1f3ff 200d 1f373 / 246 | 👨‍🍳 👨🏻‍🍳 👨🏼‍🍳 👨🏽‍🍳 👨🏾‍🍳 👨🏿‍🍳 1f468 200d 1f373 | 1f468 1f3fb 200d 1f373 / 1f468 1f3fc 200d 1f373 / 1f468 1f3fd 200d 1f373 / 1f468 1f3fe 200d 1f373 / 1f468 1f3ff 200d 1f373 / 247 | 👩‍🎓 👩🏻‍🎓 👩🏼‍🎓 👩🏽‍🎓 👩🏾‍🎓 👩🏿‍🎓 1f469 200d 1f393 | 1f469 1f3fb 200d 1f393 / 1f469 1f3fc 200d 1f393 / 1f469 1f3fd 200d 1f393 / 1f469 1f3fe 200d 1f393 / 1f469 1f3ff 200d 1f393 / 248 | 🧑‍🎓 🧑🏻‍🎓 🧑🏼‍🎓 🧑🏽‍🎓 🧑🏾‍🎓 🧑🏿‍🎓 1f9d1 200d 1f393 | 1f9d1 1f3fb 200d 1f393 / 1f9d1 1f3fc 200d 1f393 / 1f9d1 1f3fd 200d 1f393 / 1f9d1 1f3fe 200d 1f393 / 1f9d1 1f3ff 200d 1f393 / 249 | 👨‍🎓 👨🏻‍🎓 👨🏼‍🎓 👨🏽‍🎓 👨🏾‍🎓 👨🏿‍🎓 1f468 200d 1f393 | 1f468 1f3fb 200d 1f393 / 1f468 1f3fc 200d 1f393 / 1f468 1f3fd 200d 1f393 / 1f468 1f3fe 200d 1f393 / 1f468 1f3ff 200d 1f393 / 250 | 👩‍🎤 👩🏻‍🎤 👩🏼‍🎤 👩🏽‍🎤 👩🏾‍🎤 👩🏿‍🎤 1f469 200d 1f3a4 | 1f469 1f3fb 200d 1f3a4 / 1f469 1f3fc 200d 1f3a4 / 1f469 1f3fd 200d 1f3a4 / 1f469 1f3fe 200d 1f3a4 / 1f469 1f3ff 200d 1f3a4 / 251 | 🧑‍🎤 🧑🏻‍🎤 🧑🏼‍🎤 🧑🏽‍🎤 🧑🏾‍🎤 🧑🏿‍🎤 1f9d1 200d 1f3a4 | 1f9d1 1f3fb 200d 1f3a4 / 1f9d1 1f3fc 200d 1f3a4 / 1f9d1 1f3fd 200d 1f3a4 / 1f9d1 1f3fe 200d 1f3a4 / 1f9d1 1f3ff 200d 1f3a4 / 252 | 👨‍🎤 👨🏻‍🎤 👨🏼‍🎤 👨🏽‍🎤 👨🏾‍🎤 👨🏿‍🎤 1f468 200d 1f3a4 | 1f468 1f3fb 200d 1f3a4 / 1f468 1f3fc 200d 1f3a4 / 1f468 1f3fd 200d 1f3a4 / 1f468 1f3fe 200d 1f3a4 / 1f468 1f3ff 200d 1f3a4 / 253 | 👩‍🏫 👩🏻‍🏫 👩🏼‍🏫 👩🏽‍🏫 👩🏾‍🏫 👩🏿‍🏫 1f469 200d 1f3eb | 1f469 1f3fb 200d 1f3eb / 1f469 1f3fc 200d 1f3eb / 1f469 1f3fd 200d 1f3eb / 1f469 1f3fe 200d 1f3eb / 1f469 1f3ff 200d 1f3eb / 254 | 🧑‍🏫 🧑🏻‍🏫 🧑🏼‍🏫 🧑🏽‍🏫 🧑🏾‍🏫 🧑🏿‍🏫 1f9d1 200d 1f3eb | 1f9d1 1f3fb 200d 1f3eb / 1f9d1 1f3fc 200d 1f3eb / 1f9d1 1f3fd 200d 1f3eb / 1f9d1 1f3fe 200d 1f3eb / 1f9d1 1f3ff 200d 1f3eb / 255 | 👨‍🏫 👨🏻‍🏫 👨🏼‍🏫 👨🏽‍🏫 👨🏾‍🏫 👨🏿‍🏫 1f468 200d 1f3eb | 1f468 1f3fb 200d 1f3eb / 1f468 1f3fc 200d 1f3eb / 1f468 1f3fd 200d 1f3eb / 1f468 1f3fe 200d 1f3eb / 1f468 1f3ff 200d 1f3eb / 256 | 👩‍🏭 👩🏻‍🏭 👩🏼‍🏭 👩🏽‍🏭 👩🏾‍🏭 👩🏿‍🏭 1f469 200d 1f3ed | 1f469 1f3fb 200d 1f3ed / 1f469 1f3fc 200d 1f3ed / 1f469 1f3fd 200d 1f3ed / 1f469 1f3fe 200d 1f3ed / 1f469 1f3ff 200d 1f3ed / 257 | 🧑‍🏭 🧑🏻‍🏭 🧑🏼‍🏭 🧑🏽‍🏭 🧑🏾‍🏭 🧑🏿‍🏭 1f9d1 200d 1f3ed | 1f9d1 1f3fb 200d 1f3ed / 1f9d1 1f3fc 200d 1f3ed / 1f9d1 1f3fd 200d 1f3ed / 1f9d1 1f3fe 200d 1f3ed / 1f9d1 1f3ff 200d 1f3ed / 258 | 👨‍🏭 👨🏻‍🏭 👨🏼‍🏭 👨🏽‍🏭 👨🏾‍🏭 👨🏿‍🏭 1f468 200d 1f3ed | 1f468 1f3fb 200d 1f3ed / 1f468 1f3fc 200d 1f3ed / 1f468 1f3fd 200d 1f3ed / 1f468 1f3fe 200d 1f3ed / 1f468 1f3ff 200d 1f3ed / 259 | 👩‍💻 👩🏻‍💻 👩🏼‍💻 👩🏽‍💻 👩🏾‍💻 👩🏿‍💻 1f469 200d 1f4bb | 1f469 1f3fb 200d 1f4bb / 1f469 1f3fc 200d 1f4bb / 1f469 1f3fd 200d 1f4bb / 1f469 1f3fe 200d 1f4bb / 1f469 1f3ff 200d 1f4bb / 260 | 🧑‍💻 🧑🏻‍💻 🧑🏼‍💻 🧑🏽‍💻 🧑🏾‍💻 🧑🏿‍💻 1f9d1 200d 1f4bb | 1f9d1 1f3fb 200d 1f4bb / 1f9d1 1f3fc 200d 1f4bb / 1f9d1 1f3fd 200d 1f4bb / 1f9d1 1f3fe 200d 1f4bb / 1f9d1 1f3ff 200d 1f4bb / 261 | 👨‍💻 👨🏻‍💻 👨🏼‍💻 👨🏽‍💻 👨🏾‍💻 👨🏿‍💻 1f468 200d 1f4bb | 1f468 1f3fb 200d 1f4bb / 1f468 1f3fc 200d 1f4bb / 1f468 1f3fd 200d 1f4bb / 1f468 1f3fe 200d 1f4bb / 1f468 1f3ff 200d 1f4bb / 262 | 👩‍💼 👩🏻‍💼 👩🏼‍💼 👩🏽‍💼 👩🏾‍💼 👩🏿‍💼 1f469 200d 1f4bc | 1f469 1f3fb 200d 1f4bc / 1f469 1f3fc 200d 1f4bc / 1f469 1f3fd 200d 1f4bc / 1f469 1f3fe 200d 1f4bc / 1f469 1f3ff 200d 1f4bc / 263 | 🧑‍💼 🧑🏻‍💼 🧑🏼‍💼 🧑🏽‍💼 🧑🏾‍💼 🧑🏿‍💼 1f9d1 200d 1f4bc | 1f9d1 1f3fb 200d 1f4bc / 1f9d1 1f3fc 200d 1f4bc / 1f9d1 1f3fd 200d 1f4bc / 1f9d1 1f3fe 200d 1f4bc / 1f9d1 1f3ff 200d 1f4bc / 264 | 👨‍💼 👨🏻‍💼 👨🏼‍💼 👨🏽‍💼 👨🏾‍💼 👨🏿‍💼 1f468 200d 1f4bc | 1f468 1f3fb 200d 1f4bc / 1f468 1f3fc 200d 1f4bc / 1f468 1f3fd 200d 1f4bc / 1f468 1f3fe 200d 1f4bc / 1f468 1f3ff 200d 1f4bc / 265 | 👩‍🔧 👩🏻‍🔧 👩🏼‍🔧 👩🏽‍🔧 👩🏾‍🔧 👩🏿‍🔧 1f469 200d 1f527 | 1f469 1f3fb 200d 1f527 / 1f469 1f3fc 200d 1f527 / 1f469 1f3fd 200d 1f527 / 1f469 1f3fe 200d 1f527 / 1f469 1f3ff 200d 1f527 / 266 | 🧑‍🔧 🧑🏻‍🔧 🧑🏼‍🔧 🧑🏽‍🔧 🧑🏾‍🔧 🧑🏿‍🔧 1f9d1 200d 1f527 | 1f9d1 1f3fb 200d 1f527 / 1f9d1 1f3fc 200d 1f527 / 1f9d1 1f3fd 200d 1f527 / 1f9d1 1f3fe 200d 1f527 / 1f9d1 1f3ff 200d 1f527 / 267 | 👨‍🔧 👨🏻‍🔧 👨🏼‍🔧 👨🏽‍🔧 👨🏾‍🔧 👨🏿‍🔧 1f468 200d 1f527 | 1f468 1f3fb 200d 1f527 / 1f468 1f3fc 200d 1f527 / 1f468 1f3fd 200d 1f527 / 1f468 1f3fe 200d 1f527 / 1f468 1f3ff 200d 1f527 / 268 | 👩‍🔬 👩🏻‍🔬 👩🏼‍🔬 👩🏽‍🔬 👩🏾‍🔬 👩🏿‍🔬 1f469 200d 1f52c | 1f469 1f3fb 200d 1f52c / 1f469 1f3fc 200d 1f52c / 1f469 1f3fd 200d 1f52c / 1f469 1f3fe 200d 1f52c / 1f469 1f3ff 200d 1f52c / 269 | 🧑‍🔬 🧑🏻‍🔬 🧑🏼‍🔬 🧑🏽‍🔬 🧑🏾‍🔬 🧑🏿‍🔬 1f9d1 200d 1f52c | 1f9d1 1f3fb 200d 1f52c / 1f9d1 1f3fc 200d 1f52c / 1f9d1 1f3fd 200d 1f52c / 1f9d1 1f3fe 200d 1f52c / 1f9d1 1f3ff 200d 1f52c / 270 | 👨‍🔬 👨🏻‍🔬 👨🏼‍🔬 👨🏽‍🔬 👨🏾‍🔬 👨🏿‍🔬 1f468 200d 1f52c | 1f468 1f3fb 200d 1f52c / 1f468 1f3fc 200d 1f52c / 1f468 1f3fd 200d 1f52c / 1f468 1f3fe 200d 1f52c / 1f468 1f3ff 200d 1f52c / 271 | 👩‍🎨 👩🏻‍🎨 👩🏼‍🎨 👩🏽‍🎨 👩🏾‍🎨 👩🏿‍🎨 1f469 200d 1f3a8 | 1f469 1f3fb 200d 1f3a8 / 1f469 1f3fc 200d 1f3a8 / 1f469 1f3fd 200d 1f3a8 / 1f469 1f3fe 200d 1f3a8 / 1f469 1f3ff 200d 1f3a8 / 272 | 🧑‍🎨 🧑🏻‍🎨 🧑🏼‍🎨 🧑🏽‍🎨 🧑🏾‍🎨 🧑🏿‍🎨 1f9d1 200d 1f3a8 | 1f9d1 1f3fb 200d 1f3a8 / 1f9d1 1f3fc 200d 1f3a8 / 1f9d1 1f3fd 200d 1f3a8 / 1f9d1 1f3fe 200d 1f3a8 / 1f9d1 1f3ff 200d 1f3a8 / 273 | 👨‍🎨 👨🏻‍🎨 👨🏼‍🎨 👨🏽‍🎨 👨🏾‍🎨 👨🏿‍🎨 1f468 200d 1f3a8 | 1f468 1f3fb 200d 1f3a8 / 1f468 1f3fc 200d 1f3a8 / 1f468 1f3fd 200d 1f3a8 / 1f468 1f3fe 200d 1f3a8 / 1f468 1f3ff 200d 1f3a8 / 274 | 👩‍🚒 👩🏻‍🚒 👩🏼‍🚒 👩🏽‍🚒 👩🏾‍🚒 👩🏿‍🚒 1f469 200d 1f692 | 1f469 1f3fb 200d 1f692 / 1f469 1f3fc 200d 1f692 / 1f469 1f3fd 200d 1f692 / 1f469 1f3fe 200d 1f692 / 1f469 1f3ff 200d 1f692 / 275 | 🧑‍🚒 🧑🏻‍🚒 🧑🏼‍🚒 🧑🏽‍🚒 🧑🏾‍🚒 🧑🏿‍🚒 1f9d1 200d 1f692 | 1f9d1 1f3fb 200d 1f692 / 1f9d1 1f3fc 200d 1f692 / 1f9d1 1f3fd 200d 1f692 / 1f9d1 1f3fe 200d 1f692 / 1f9d1 1f3ff 200d 1f692 / 276 | 👨‍🚒 👨🏻‍🚒 👨🏼‍🚒 👨🏽‍🚒 👨🏾‍🚒 👨🏿‍🚒 1f468 200d 1f692 | 1f468 1f3fb 200d 1f692 / 1f468 1f3fc 200d 1f692 / 1f468 1f3fd 200d 1f692 / 1f468 1f3fe 200d 1f692 / 1f468 1f3ff 200d 1f692 / 277 | 👩‍✈️ 👩🏻‍✈️ 👩🏼‍✈️ 👩🏽‍✈️ 👩🏾‍✈️ 👩🏿‍✈️ 1f469 200d 2708 | 1f469 1f3fb 200d 2708 / 1f469 1f3fc 200d 2708 / 1f469 1f3fd 200d 2708 / 1f469 1f3fe 200d 2708 / 1f469 1f3ff 200d 2708 / 278 | 🧑‍✈️ 🧑🏻‍✈️ 🧑🏼‍✈️ 🧑🏽‍✈️ 🧑🏾‍✈️ 🧑🏿‍✈️ 1f9d1 200d 2708 | 1f9d1 1f3fb 200d 2708 / 1f9d1 1f3fc 200d 2708 / 1f9d1 1f3fd 200d 2708 / 1f9d1 1f3fe 200d 2708 / 1f9d1 1f3ff 200d 2708 / 279 | 👨‍✈️ 👨🏻‍✈️ 👨🏼‍✈️ 👨🏽‍✈️ 👨🏾‍✈️ 👨🏿‍✈️ 1f468 200d 2708 | 1f468 1f3fb 200d 2708 / 1f468 1f3fc 200d 2708 / 1f468 1f3fd 200d 2708 / 1f468 1f3fe 200d 2708 / 1f468 1f3ff 200d 2708 / 280 | 👩‍🚀 👩🏻‍🚀 👩🏼‍🚀 👩🏽‍🚀 👩🏾‍🚀 👩🏿‍🚀 1f469 200d 1f680 | 1f469 1f3fb 200d 1f680 / 1f469 1f3fc 200d 1f680 / 1f469 1f3fd 200d 1f680 / 1f469 1f3fe 200d 1f680 / 1f469 1f3ff 200d 1f680 / 281 | 🧑‍🚀 🧑🏻‍🚀 🧑🏼‍🚀 🧑🏽‍🚀 🧑🏾‍🚀 🧑🏿‍🚀 1f9d1 200d 1f680 | 1f9d1 1f3fb 200d 1f680 / 1f9d1 1f3fc 200d 1f680 / 1f9d1 1f3fd 200d 1f680 / 1f9d1 1f3fe 200d 1f680 / 1f9d1 1f3ff 200d 1f680 / 282 | 👨‍🚀 👨🏻‍🚀 👨🏼‍🚀 👨🏽‍🚀 👨🏾‍🚀 👨🏿‍🚀 1f468 200d 1f680 | 1f468 1f3fb 200d 1f680 / 1f468 1f3fc 200d 1f680 / 1f468 1f3fd 200d 1f680 / 1f468 1f3fe 200d 1f680 / 1f468 1f3ff 200d 1f680 / 283 | 👩‍⚖️ 👩🏻‍⚖️ 👩🏼‍⚖️ 👩🏽‍⚖️ 👩🏾‍⚖️ 👩🏿‍⚖️ 1f469 200d 2696 | 1f469 1f3fb 200d 2696 / 1f469 1f3fc 200d 2696 / 1f469 1f3fd 200d 2696 / 1f469 1f3fe 200d 2696 / 1f469 1f3ff 200d 2696 / 284 | 🧑‍⚖️ 🧑🏻‍⚖️ 🧑🏼‍⚖️ 🧑🏽‍⚖️ 🧑🏾‍⚖️ 🧑🏿‍⚖️ 1f9d1 200d 2696 | 1f9d1 1f3fb 200d 2696 / 1f9d1 1f3fc 200d 2696 / 1f9d1 1f3fd 200d 2696 / 1f9d1 1f3fe 200d 2696 / 1f9d1 1f3ff 200d 2696 / 285 | 👨‍⚖️ 👨🏻‍⚖️ 👨🏼‍⚖️ 👨🏽‍⚖️ 👨🏾‍⚖️ 👨🏿‍⚖️ 1f468 200d 2696 | 1f468 1f3fb 200d 2696 / 1f468 1f3fc 200d 2696 / 1f468 1f3fd 200d 2696 / 1f468 1f3fe 200d 2696 / 1f468 1f3ff 200d 2696 / 286 | 👰‍♀️ 👰🏻‍♀️ 👰🏼‍♀️ 👰🏽‍♀️ 👰🏾‍♀️ 👰🏿‍♀️ 1f470 200d 2640 | 1f470 1f3fb 200d 2640 / 1f470 1f3fc 200d 2640 / 1f470 1f3fd 200d 2640 / 1f470 1f3fe 200d 2640 / 1f470 1f3ff 200d 2640 / 287 | 👰 👰🏻 👰🏼 👰🏽 👰🏾 👰🏿 1f470 | 1f470 1f3fb / 1f470 1f3fc / 1f470 1f3fd / 1f470 1f3fe / 1f470 1f3ff / 288 | 👰‍♂️ 👰🏻‍♂️ 👰🏼‍♂️ 👰🏽‍♂️ 👰🏾‍♂️ 👰🏿‍♂️ 1f470 200d 2642 | 1f470 1f3fb 200d 2642 / 1f470 1f3fc 200d 2642 / 1f470 1f3fd 200d 2642 / 1f470 1f3fe 200d 2642 / 1f470 1f3ff 200d 2642 / 289 | 🤵‍♀️ 🤵🏻‍♀️ 🤵🏼‍♀️ 🤵🏽‍♀️ 🤵🏾‍♀️ 🤵🏿‍♀️ 1f935 200d 2640 | 1f935 1f3fb 200d 2640 / 1f935 1f3fc 200d 2640 / 1f935 1f3fd 200d 2640 / 1f935 1f3fe 200d 2640 / 1f935 1f3ff 200d 2640 / 290 | 🤵 🤵🏻 🤵🏼 🤵🏽 🤵🏾 🤵🏿 1f935 | 1f935 1f3fb / 1f935 1f3fc / 1f935 1f3fd / 1f935 1f3fe / 1f935 1f3ff / 291 | 🤵‍♂️ 🤵🏻‍♂️ 🤵🏼‍♂️ 🤵🏽‍♂️ 🤵🏾‍♂️ 🤵🏿‍♂️ 1f935 200d 2642 | 1f935 1f3fb 200d 2642 / 1f935 1f3fc 200d 2642 / 1f935 1f3fd 200d 2642 / 1f935 1f3fe 200d 2642 / 1f935 1f3ff 200d 2642 / 292 | 👸 👸🏻 👸🏼 👸🏽 👸🏾 👸🏿 1f478 | 1f478 1f3fb / 1f478 1f3fc / 1f478 1f3fd / 1f478 1f3fe / 1f478 1f3ff / 293 | 🫅 🫅🏻 🫅🏼 🫅🏽 🫅🏾 🫅🏿 1fac5 | 1fac5 1f3fb / 1fac5 1f3fc / 1fac5 1f3fd / 1fac5 1f3fe / 1fac5 1f3ff / 294 | 🤴 🤴🏻 🤴🏼 🤴🏽 🤴🏾 🤴🏿 1f934 | 1f934 1f3fb / 1f934 1f3fc / 1f934 1f3fd / 1f934 1f3fe / 1f934 1f3ff / 295 | 🥷 🥷🏻 🥷🏼 🥷🏽 🥷🏾 🥷🏿 1f977 | 1f977 1f3fb / 1f977 1f3fc / 1f977 1f3fd / 1f977 1f3fe / 1f977 1f3ff / 296 | 🦸‍♀️ 🦸🏻‍♀️ 🦸🏼‍♀️ 🦸🏽‍♀️ 🦸🏾‍♀️ 🦸🏿‍♀️ 1f9b8 200d 2640 | 1f9b8 1f3fb 200d 2640 / 1f9b8 1f3fc 200d 2640 / 1f9b8 1f3fd 200d 2640 / 1f9b8 1f3fe 200d 2640 / 1f9b8 1f3ff 200d 2640 / 297 | 🦸 🦸🏻 🦸🏼 🦸🏽 🦸🏾 🦸🏿 1f9b8 | 1f9b8 1f3fb / 1f9b8 1f3fc / 1f9b8 1f3fd / 1f9b8 1f3fe / 1f9b8 1f3ff / 298 | 🦸‍♂️ 🦸🏻‍♂️ 🦸🏼‍♂️ 🦸🏽‍♂️ 🦸🏾‍♂️ 🦸🏿‍♂️ 1f9b8 200d 2642 | 1f9b8 1f3fb 200d 2642 / 1f9b8 1f3fc 200d 2642 / 1f9b8 1f3fd 200d 2642 / 1f9b8 1f3fe 200d 2642 / 1f9b8 1f3ff 200d 2642 / 299 | 🦹‍♀️ 🦹🏻‍♀️ 🦹🏼‍♀️ 🦹🏽‍♀️ 🦹🏾‍♀️ 🦹🏿‍♀️ 1f9b9 200d 2640 | 1f9b9 1f3fb 200d 2640 / 1f9b9 1f3fc 200d 2640 / 1f9b9 1f3fd 200d 2640 / 1f9b9 1f3fe 200d 2640 / 1f9b9 1f3ff 200d 2640 / 300 | 🦹 🦹🏻 🦹🏼 🦹🏽 🦹🏾 🦹🏿 1f9b9 | 1f9b9 1f3fb / 1f9b9 1f3fc / 1f9b9 1f3fd / 1f9b9 1f3fe / 1f9b9 1f3ff / 301 | 🦹‍♂️ 🦹🏻‍♂️ 🦹🏼‍♂️ 🦹🏽‍♂️ 🦹🏾‍♂️ 🦹🏿‍♂️ 1f9b9 200d 2642 | 1f9b9 1f3fb 200d 2642 / 1f9b9 1f3fc 200d 2642 / 1f9b9 1f3fd 200d 2642 / 1f9b9 1f3fe 200d 2642 / 1f9b9 1f3ff 200d 2642 / 302 | 🤶 🤶🏻 🤶🏼 🤶🏽 🤶🏾 🤶🏿 1f936 | 1f936 1f3fb / 1f936 1f3fc / 1f936 1f3fd / 1f936 1f3fe / 1f936 1f3ff / 303 | 🧑‍🎄 🧑🏻‍🎄 🧑🏼‍🎄 🧑🏽‍🎄 🧑🏾‍🎄 🧑🏿‍🎄 1f9d1 200d 1f384 | 1f9d1 1f3fb 200d 1f384 / 1f9d1 1f3fc 200d 1f384 / 1f9d1 1f3fd 200d 1f384 / 1f9d1 1f3fe 200d 1f384 / 1f9d1 1f3ff 200d 1f384 / 304 | 🎅 🎅🏻 🎅🏼 🎅🏽 🎅🏾 🎅🏿 1f385 | 1f385 1f3fb / 1f385 1f3fc / 1f385 1f3fd / 1f385 1f3fe / 1f385 1f3ff / 305 | 🧙‍♀️ 🧙🏻‍♀️ 🧙🏼‍♀️ 🧙🏽‍♀️ 🧙🏾‍♀️ 🧙🏿‍♀️ 1f9d9 200d 2640 | 1f9d9 1f3fb 200d 2640 / 1f9d9 1f3fc 200d 2640 / 1f9d9 1f3fd 200d 2640 / 1f9d9 1f3fe 200d 2640 / 1f9d9 1f3ff 200d 2640 / 306 | 🧙 🧙🏻 🧙🏼 🧙🏽 🧙🏾 🧙🏿 1f9d9 | 1f9d9 1f3fb / 1f9d9 1f3fc / 1f9d9 1f3fd / 1f9d9 1f3fe / 1f9d9 1f3ff / 307 | 🧙‍♂️ 🧙🏻‍♂️ 🧙🏼‍♂️ 🧙🏽‍♂️ 🧙🏾‍♂️ 🧙🏿‍♂️ 1f9d9 200d 2642 | 1f9d9 1f3fb 200d 2642 / 1f9d9 1f3fc 200d 2642 / 1f9d9 1f3fd 200d 2642 / 1f9d9 1f3fe 200d 2642 / 1f9d9 1f3ff 200d 2642 / 308 | 🧝‍♀️ 🧝🏻‍♀️ 🧝🏼‍♀️ 🧝🏽‍♀️ 🧝🏾‍♀️ 🧝🏿‍♀️ 1f9dd 200d 2640 | 1f9dd 1f3fb 200d 2640 / 1f9dd 1f3fc 200d 2640 / 1f9dd 1f3fd 200d 2640 / 1f9dd 1f3fe 200d 2640 / 1f9dd 1f3ff 200d 2640 / 309 | 🧝 🧝🏻 🧝🏼 🧝🏽 🧝🏾 🧝🏿 1f9dd | 1f9dd 1f3fb / 1f9dd 1f3fc / 1f9dd 1f3fd / 1f9dd 1f3fe / 1f9dd 1f3ff / 310 | 🧝‍♂️ 🧝🏻‍♂️ 🧝🏼‍♂️ 🧝🏽‍♂️ 🧝🏾‍♂️ 🧝🏿‍♂️ 1f9dd 200d 2642 | 1f9dd 1f3fb 200d 2642 / 1f9dd 1f3fc 200d 2642 / 1f9dd 1f3fd 200d 2642 / 1f9dd 1f3fe 200d 2642 / 1f9dd 1f3ff 200d 2642 / 311 | 🧌 1f9cc 312 | 🧛‍♀️ 🧛🏻‍♀️ 🧛🏼‍♀️ 🧛🏽‍♀️ 🧛🏾‍♀️ 🧛🏿‍♀️ 1f9db 200d 2640 | 1f9db 1f3fb 200d 2640 / 1f9db 1f3fc 200d 2640 / 1f9db 1f3fd 200d 2640 / 1f9db 1f3fe 200d 2640 / 1f9db 1f3ff 200d 2640 / 313 | 🧛 🧛🏻 🧛🏼 🧛🏽 🧛🏾 🧛🏿 1f9db | 1f9db 1f3fb / 1f9db 1f3fc / 1f9db 1f3fd / 1f9db 1f3fe / 1f9db 1f3ff / 314 | 🧛‍♂️ 🧛🏻‍♂️ 🧛🏼‍♂️ 🧛🏽‍♂️ 🧛🏾‍♂️ 🧛🏿‍♂️ 1f9db 200d 2642 | 1f9db 1f3fb 200d 2642 / 1f9db 1f3fc 200d 2642 / 1f9db 1f3fd 200d 2642 / 1f9db 1f3fe 200d 2642 / 1f9db 1f3ff 200d 2642 / 315 | 🧟‍♀️ 1f9df 200d 2640 316 | 🧟 1f9df 317 | 🧟‍♂️ 1f9df 200d 2642 318 | 🧞‍♀️ 1f9de 200d 2640 319 | 🧞 1f9de 320 | 🧞‍♂️ 1f9de 200d 2642 321 | 🧜‍♀️ 🧜🏻‍♀️ 🧜🏼‍♀️ 🧜🏽‍♀️ 🧜🏾‍♀️ 🧜🏿‍♀️ 1f9dc 200d 2640 | 1f9dc 1f3fb 200d 2640 / 1f9dc 1f3fc 200d 2640 / 1f9dc 1f3fd 200d 2640 / 1f9dc 1f3fe 200d 2640 / 1f9dc 1f3ff 200d 2640 / 322 | 🧜 🧜🏻 🧜🏼 🧜🏽 🧜🏾 🧜🏿 1f9dc | 1f9dc 1f3fb / 1f9dc 1f3fc / 1f9dc 1f3fd / 1f9dc 1f3fe / 1f9dc 1f3ff / 323 | 🧜‍♂️ 🧜🏻‍♂️ 🧜🏼‍♂️ 🧜🏽‍♂️ 🧜🏾‍♂️ 🧜🏿‍♂️ 1f9dc 200d 2642 | 1f9dc 1f3fb 200d 2642 / 1f9dc 1f3fc 200d 2642 / 1f9dc 1f3fd 200d 2642 / 1f9dc 1f3fe 200d 2642 / 1f9dc 1f3ff 200d 2642 / 324 | 🧚‍♀️ 🧚🏻‍♀️ 🧚🏼‍♀️ 🧚🏽‍♀️ 🧚🏾‍♀️ 🧚🏿‍♀️ 1f9da 200d 2640 | 1f9da 1f3fb 200d 2640 / 1f9da 1f3fc 200d 2640 / 1f9da 1f3fd 200d 2640 / 1f9da 1f3fe 200d 2640 / 1f9da 1f3ff 200d 2640 / 325 | 🧚 🧚🏻 🧚🏼 🧚🏽 🧚🏾 🧚🏿 1f9da | 1f9da 1f3fb / 1f9da 1f3fc / 1f9da 1f3fd / 1f9da 1f3fe / 1f9da 1f3ff / 326 | 🧚‍♂️ 🧚🏻‍♂️ 🧚🏼‍♂️ 🧚🏽‍♂️ 🧚🏾‍♂️ 🧚🏿‍♂️ 1f9da 200d 2642 | 1f9da 1f3fb 200d 2642 / 1f9da 1f3fc 200d 2642 / 1f9da 1f3fd 200d 2642 / 1f9da 1f3fe 200d 2642 / 1f9da 1f3ff 200d 2642 / 327 | 👼 👼🏻 👼🏼 👼🏽 👼🏾 👼🏿 1f47c | 1f47c 1f3fb / 1f47c 1f3fc / 1f47c 1f3fd / 1f47c 1f3fe / 1f47c 1f3ff / 328 | 🤰 🤰🏻 🤰🏼 🤰🏽 🤰🏾 🤰🏿 1f930 | 1f930 1f3fb / 1f930 1f3fc / 1f930 1f3fd / 1f930 1f3fe / 1f930 1f3ff / 329 | 🫄 🫄🏻 🫄🏼 🫄🏽 🫄🏾 🫄🏿 1fac4 | 1fac4 1f3fb / 1fac4 1f3fc / 1fac4 1f3fd / 1fac4 1f3fe / 1fac4 1f3ff / 330 | 🫃 🫃🏻 🫃🏼 🫃🏽 🫃🏾 🫃🏿 1fac3 | 1fac3 1f3fb / 1fac3 1f3fc / 1fac3 1f3fd / 1fac3 1f3fe / 1fac3 1f3ff / 331 | 🤱 🤱🏻 🤱🏼 🤱🏽 🤱🏾 🤱🏿 1f931 | 1f931 1f3fb / 1f931 1f3fc / 1f931 1f3fd / 1f931 1f3fe / 1f931 1f3ff / 332 | 👩‍🍼 👩🏻‍🍼 👩🏼‍🍼 👩🏽‍🍼 👩🏾‍🍼 👩🏿‍🍼 1f469 200d 1f37c | 1f469 1f3fb 200d 1f37c / 1f469 1f3fc 200d 1f37c / 1f469 1f3fd 200d 1f37c / 1f469 1f3fe 200d 1f37c / 1f469 1f3ff 200d 1f37c / 333 | 🧑‍🍼 🧑🏻‍🍼 🧑🏼‍🍼 🧑🏽‍🍼 🧑🏾‍🍼 🧑🏿‍🍼 1f9d1 200d 1f37c | 1f9d1 1f3fb 200d 1f37c / 1f9d1 1f3fc 200d 1f37c / 1f9d1 1f3fd 200d 1f37c / 1f9d1 1f3fe 200d 1f37c / 1f9d1 1f3ff 200d 1f37c / 334 | 👨‍🍼 👨🏻‍🍼 👨🏼‍🍼 👨🏽‍🍼 👨🏾‍🍼 👨🏿‍🍼 1f468 200d 1f37c | 1f468 1f3fb 200d 1f37c / 1f468 1f3fc 200d 1f37c / 1f468 1f3fd 200d 1f37c / 1f468 1f3fe 200d 1f37c / 1f468 1f3ff 200d 1f37c / 335 | 🙇‍♀️ 🙇🏻‍♀️ 🙇🏼‍♀️ 🙇🏽‍♀️ 🙇🏾‍♀️ 🙇🏿‍♀️ 1f647 200d 2640 | 1f647 1f3fb 200d 2640 / 1f647 1f3fc 200d 2640 / 1f647 1f3fd 200d 2640 / 1f647 1f3fe 200d 2640 / 1f647 1f3ff 200d 2640 / 336 | 🙇 🙇🏻 🙇🏼 🙇🏽 🙇🏾 🙇🏿 1f647 | 1f647 1f3fb / 1f647 1f3fc / 1f647 1f3fd / 1f647 1f3fe / 1f647 1f3ff / 337 | 🙇‍♂️ 🙇🏻‍♂️ 🙇🏼‍♂️ 🙇🏽‍♂️ 🙇🏾‍♂️ 🙇🏿‍♂️ 1f647 200d 2642 | 1f647 1f3fb 200d 2642 / 1f647 1f3fc 200d 2642 / 1f647 1f3fd 200d 2642 / 1f647 1f3fe 200d 2642 / 1f647 1f3ff 200d 2642 / 338 | 💁‍♀️ 💁🏻‍♀️ 💁🏼‍♀️ 💁🏽‍♀️ 💁🏾‍♀️ 💁🏿‍♀️ 1f481 200d 2640 | 1f481 1f3fb 200d 2640 / 1f481 1f3fc 200d 2640 / 1f481 1f3fd 200d 2640 / 1f481 1f3fe 200d 2640 / 1f481 1f3ff 200d 2640 / 339 | 💁 💁🏻 💁🏼 💁🏽 💁🏾 💁🏿 1f481 | 1f481 1f3fb / 1f481 1f3fc / 1f481 1f3fd / 1f481 1f3fe / 1f481 1f3ff / 340 | 💁‍♂️ 💁🏻‍♂️ 💁🏼‍♂️ 💁🏽‍♂️ 💁🏾‍♂️ 💁🏿‍♂️ 1f481 200d 2642 | 1f481 1f3fb 200d 2642 / 1f481 1f3fc 200d 2642 / 1f481 1f3fd 200d 2642 / 1f481 1f3fe 200d 2642 / 1f481 1f3ff 200d 2642 / 341 | 🙅‍♀️ 🙅🏻‍♀️ 🙅🏼‍♀️ 🙅🏽‍♀️ 🙅🏾‍♀️ 🙅🏿‍♀️ 1f645 200d 2640 | 1f645 1f3fb 200d 2640 / 1f645 1f3fc 200d 2640 / 1f645 1f3fd 200d 2640 / 1f645 1f3fe 200d 2640 / 1f645 1f3ff 200d 2640 / 342 | 🙅 🙅🏻 🙅🏼 🙅🏽 🙅🏾 🙅🏿 1f645 | 1f645 1f3fb / 1f645 1f3fc / 1f645 1f3fd / 1f645 1f3fe / 1f645 1f3ff / 343 | 🙅‍♂️ 🙅🏻‍♂️ 🙅🏼‍♂️ 🙅🏽‍♂️ 🙅🏾‍♂️ 🙅🏿‍♂️ 1f645 200d 2642 | 1f645 1f3fb 200d 2642 / 1f645 1f3fc 200d 2642 / 1f645 1f3fd 200d 2642 / 1f645 1f3fe 200d 2642 / 1f645 1f3ff 200d 2642 / 344 | 🙆‍♀️ 🙆🏻‍♀️ 🙆🏼‍♀️ 🙆🏽‍♀️ 🙆🏾‍♀️ 🙆🏿‍♀️ 1f646 200d 2640 | 1f646 1f3fb 200d 2640 / 1f646 1f3fc 200d 2640 / 1f646 1f3fd 200d 2640 / 1f646 1f3fe 200d 2640 / 1f646 1f3ff 200d 2640 / 345 | 🙆 🙆🏻 🙆🏼 🙆🏽 🙆🏾 🙆🏿 1f646 | 1f646 1f3fb / 1f646 1f3fc / 1f646 1f3fd / 1f646 1f3fe / 1f646 1f3ff / 346 | 🙆‍♂️ 🙆🏻‍♂️ 🙆🏼‍♂️ 🙆🏽‍♂️ 🙆🏾‍♂️ 🙆🏿‍♂️ 1f646 200d 2642 | 1f646 1f3fb 200d 2642 / 1f646 1f3fc 200d 2642 / 1f646 1f3fd 200d 2642 / 1f646 1f3fe 200d 2642 / 1f646 1f3ff 200d 2642 / 347 | 🙋‍♀️ 🙋🏻‍♀️ 🙋🏼‍♀️ 🙋🏽‍♀️ 🙋🏾‍♀️ 🙋🏿‍♀️ 1f64b 200d 2640 | 1f64b 1f3fb 200d 2640 / 1f64b 1f3fc 200d 2640 / 1f64b 1f3fd 200d 2640 / 1f64b 1f3fe 200d 2640 / 1f64b 1f3ff 200d 2640 / 348 | 🙋 🙋🏻 🙋🏼 🙋🏽 🙋🏾 🙋🏿 1f64b | 1f64b 1f3fb / 1f64b 1f3fc / 1f64b 1f3fd / 1f64b 1f3fe / 1f64b 1f3ff / 349 | 🙋‍♂️ 🙋🏻‍♂️ 🙋🏼‍♂️ 🙋🏽‍♂️ 🙋🏾‍♂️ 🙋🏿‍♂️ 1f64b 200d 2642 | 1f64b 1f3fb 200d 2642 / 1f64b 1f3fc 200d 2642 / 1f64b 1f3fd 200d 2642 / 1f64b 1f3fe 200d 2642 / 1f64b 1f3ff 200d 2642 / 350 | 🧏‍♀️ 🧏🏻‍♀️ 🧏🏼‍♀️ 🧏🏽‍♀️ 🧏🏾‍♀️ 🧏🏿‍♀️ 1f9cf 200d 2640 | 1f9cf 1f3fb 200d 2640 / 1f9cf 1f3fc 200d 2640 / 1f9cf 1f3fd 200d 2640 / 1f9cf 1f3fe 200d 2640 / 1f9cf 1f3ff 200d 2640 / 351 | 🧏 🧏🏻 🧏🏼 🧏🏽 🧏🏾 🧏🏿 1f9cf | 1f9cf 1f3fb / 1f9cf 1f3fc / 1f9cf 1f3fd / 1f9cf 1f3fe / 1f9cf 1f3ff / 352 | 🧏‍♂️ 🧏🏻‍♂️ 🧏🏼‍♂️ 🧏🏽‍♂️ 🧏🏾‍♂️ 🧏🏿‍♂️ 1f9cf 200d 2642 | 1f9cf 1f3fb 200d 2642 / 1f9cf 1f3fc 200d 2642 / 1f9cf 1f3fd 200d 2642 / 1f9cf 1f3fe 200d 2642 / 1f9cf 1f3ff 200d 2642 / 353 | 🤦‍♀️ 🤦🏻‍♀️ 🤦🏼‍♀️ 🤦🏽‍♀️ 🤦🏾‍♀️ 🤦🏿‍♀️ 1f926 200d 2640 | 1f926 1f3fb 200d 2640 / 1f926 1f3fc 200d 2640 / 1f926 1f3fd 200d 2640 / 1f926 1f3fe 200d 2640 / 1f926 1f3ff 200d 2640 / 354 | 🤦 🤦🏻 🤦🏼 🤦🏽 🤦🏾 🤦🏿 1f926 | 1f926 1f3fb / 1f926 1f3fc / 1f926 1f3fd / 1f926 1f3fe / 1f926 1f3ff / 355 | 🤦‍♂️ 🤦🏻‍♂️ 🤦🏼‍♂️ 🤦🏽‍♂️ 🤦🏾‍♂️ 🤦🏿‍♂️ 1f926 200d 2642 | 1f926 1f3fb 200d 2642 / 1f926 1f3fc 200d 2642 / 1f926 1f3fd 200d 2642 / 1f926 1f3fe 200d 2642 / 1f926 1f3ff 200d 2642 / 356 | 🤷‍♀️ 🤷🏻‍♀️ 🤷🏼‍♀️ 🤷🏽‍♀️ 🤷🏾‍♀️ 🤷🏿‍♀️ 1f937 200d 2640 | 1f937 1f3fb 200d 2640 / 1f937 1f3fc 200d 2640 / 1f937 1f3fd 200d 2640 / 1f937 1f3fe 200d 2640 / 1f937 1f3ff 200d 2640 / 357 | 🤷 🤷🏻 🤷🏼 🤷🏽 🤷🏾 🤷🏿 1f937 | 1f937 1f3fb / 1f937 1f3fc / 1f937 1f3fd / 1f937 1f3fe / 1f937 1f3ff / 358 | 🤷‍♂️ 🤷🏻‍♂️ 🤷🏼‍♂️ 🤷🏽‍♂️ 🤷🏾‍♂️ 🤷🏿‍♂️ 1f937 200d 2642 | 1f937 1f3fb 200d 2642 / 1f937 1f3fc 200d 2642 / 1f937 1f3fd 200d 2642 / 1f937 1f3fe 200d 2642 / 1f937 1f3ff 200d 2642 / 359 | 🙎‍♀️ 🙎🏻‍♀️ 🙎🏼‍♀️ 🙎🏽‍♀️ 🙎🏾‍♀️ 🙎🏿‍♀️ 1f64e 200d 2640 | 1f64e 1f3fb 200d 2640 / 1f64e 1f3fc 200d 2640 / 1f64e 1f3fd 200d 2640 / 1f64e 1f3fe 200d 2640 / 1f64e 1f3ff 200d 2640 / 360 | 🙎 🙎🏻 🙎🏼 🙎🏽 🙎🏾 🙎🏿 1f64e | 1f64e 1f3fb / 1f64e 1f3fc / 1f64e 1f3fd / 1f64e 1f3fe / 1f64e 1f3ff / 361 | 🙎‍♂️ 🙎🏻‍♂️ 🙎🏼‍♂️ 🙎🏽‍♂️ 🙎🏾‍♂️ 🙎🏿‍♂️ 1f64e 200d 2642 | 1f64e 1f3fb 200d 2642 / 1f64e 1f3fc 200d 2642 / 1f64e 1f3fd 200d 2642 / 1f64e 1f3fe 200d 2642 / 1f64e 1f3ff 200d 2642 / 362 | 🙍‍♀️ 🙍🏻‍♀️ 🙍🏼‍♀️ 🙍🏽‍♀️ 🙍🏾‍♀️ 🙍🏿‍♀️ 1f64d 200d 2640 | 1f64d 1f3fb 200d 2640 / 1f64d 1f3fc 200d 2640 / 1f64d 1f3fd 200d 2640 / 1f64d 1f3fe 200d 2640 / 1f64d 1f3ff 200d 2640 / 363 | 🙍 🙍🏻 🙍🏼 🙍🏽 🙍🏾 🙍🏿 1f64d | 1f64d 1f3fb / 1f64d 1f3fc / 1f64d 1f3fd / 1f64d 1f3fe / 1f64d 1f3ff / 364 | 🙍‍♂️ 🙍🏻‍♂️ 🙍🏼‍♂️ 🙍🏽‍♂️ 🙍🏾‍♂️ 🙍🏿‍♂️ 1f64d 200d 2642 | 1f64d 1f3fb 200d 2642 / 1f64d 1f3fc 200d 2642 / 1f64d 1f3fd 200d 2642 / 1f64d 1f3fe 200d 2642 / 1f64d 1f3ff 200d 2642 / 365 | 💇‍♀️ 💇🏻‍♀️ 💇🏼‍♀️ 💇🏽‍♀️ 💇🏾‍♀️ 💇🏿‍♀️ 1f487 200d 2640 | 1f487 1f3fb 200d 2640 / 1f487 1f3fc 200d 2640 / 1f487 1f3fd 200d 2640 / 1f487 1f3fe 200d 2640 / 1f487 1f3ff 200d 2640 / 366 | 💇 💇🏻 💇🏼 💇🏽 💇🏾 💇🏿 1f487 | 1f487 1f3fb / 1f487 1f3fc / 1f487 1f3fd / 1f487 1f3fe / 1f487 1f3ff / 367 | 💇‍♂️ 💇🏻‍♂️ 💇🏼‍♂️ 💇🏽‍♂️ 💇🏾‍♂️ 💇🏿‍♂️ 1f487 200d 2642 | 1f487 1f3fb 200d 2642 / 1f487 1f3fc 200d 2642 / 1f487 1f3fd 200d 2642 / 1f487 1f3fe 200d 2642 / 1f487 1f3ff 200d 2642 / 368 | 💆‍♀️ 💆🏻‍♀️ 💆🏼‍♀️ 💆🏽‍♀️ 💆🏾‍♀️ 💆🏿‍♀️ 1f486 200d 2640 | 1f486 1f3fb 200d 2640 / 1f486 1f3fc 200d 2640 / 1f486 1f3fd 200d 2640 / 1f486 1f3fe 200d 2640 / 1f486 1f3ff 200d 2640 / 369 | 💆 💆🏻 💆🏼 💆🏽 💆🏾 💆🏿 1f486 | 1f486 1f3fb / 1f486 1f3fc / 1f486 1f3fd / 1f486 1f3fe / 1f486 1f3ff / 370 | 💆‍♂️ 💆🏻‍♂️ 💆🏼‍♂️ 💆🏽‍♂️ 💆🏾‍♂️ 💆🏿‍♂️ 1f486 200d 2642 | 1f486 1f3fb 200d 2642 / 1f486 1f3fc 200d 2642 / 1f486 1f3fd 200d 2642 / 1f486 1f3fe 200d 2642 / 1f486 1f3ff 200d 2642 / 371 | 🧖‍♀️ 🧖🏻‍♀️ 🧖🏼‍♀️ 🧖🏽‍♀️ 🧖🏾‍♀️ 🧖🏿‍♀️ 1f9d6 200d 2640 | 1f9d6 1f3fb 200d 2640 / 1f9d6 1f3fc 200d 2640 / 1f9d6 1f3fd 200d 2640 / 1f9d6 1f3fe 200d 2640 / 1f9d6 1f3ff 200d 2640 / 372 | 🧖 🧖🏻 🧖🏼 🧖🏽 🧖🏾 🧖🏿 1f9d6 | 1f9d6 1f3fb / 1f9d6 1f3fc / 1f9d6 1f3fd / 1f9d6 1f3fe / 1f9d6 1f3ff / 373 | 🧖‍♂️ 🧖🏻‍♂️ 🧖🏼‍♂️ 🧖🏽‍♂️ 🧖🏾‍♂️ 🧖🏿‍♂️ 1f9d6 200d 2642 | 1f9d6 1f3fb 200d 2642 / 1f9d6 1f3fc 200d 2642 / 1f9d6 1f3fd 200d 2642 / 1f9d6 1f3fe 200d 2642 / 1f9d6 1f3ff 200d 2642 / 374 | 💅 💅🏻 💅🏼 💅🏽 💅🏾 💅🏿 1f485 | 1f485 1f3fb / 1f485 1f3fc / 1f485 1f3fd / 1f485 1f3fe / 1f485 1f3ff / 375 | 🤳 🤳🏻 🤳🏼 🤳🏽 🤳🏾 🤳🏿 1f933 | 1f933 1f3fb / 1f933 1f3fc / 1f933 1f3fd / 1f933 1f3fe / 1f933 1f3ff / 376 | 💃 💃🏻 💃🏼 💃🏽 💃🏾 💃🏿 1f483 | 1f483 1f3fb / 1f483 1f3fc / 1f483 1f3fd / 1f483 1f3fe / 1f483 1f3ff / 377 | 🕺 🕺🏻 🕺🏼 🕺🏽 🕺🏾 🕺🏿 1f57a | 1f57a 1f3fb / 1f57a 1f3fc / 1f57a 1f3fd / 1f57a 1f3fe / 1f57a 1f3ff / 378 | 👯‍♀️ 1f46f 200d 2640 379 | 👯 1f46f 380 | 👯‍♂️ 1f46f 200d 2642 381 | 🕴️ 🕴🏻 🕴🏼 🕴🏽 🕴🏾 🕴🏿 1f574 | 1f574 1f3fb / 1f574 1f3fc / 1f574 1f3fd / 1f574 1f3fe / 1f574 1f3ff / 382 | 👩‍🦽 👩🏻‍🦽 👩🏼‍🦽 👩🏽‍🦽 👩🏾‍🦽 👩🏿‍🦽 1f469 200d 1f9bd | 1f469 1f3fb 200d 1f9bd / 1f469 1f3fc 200d 1f9bd / 1f469 1f3fd 200d 1f9bd / 1f469 1f3fe 200d 1f9bd / 1f469 1f3ff 200d 1f9bd / 383 | 🧑‍🦽 🧑🏻‍🦽 🧑🏼‍🦽 🧑🏽‍🦽 🧑🏾‍🦽 🧑🏿‍🦽 1f9d1 200d 1f9bd | 1f9d1 1f3fb 200d 1f9bd / 1f9d1 1f3fc 200d 1f9bd / 1f9d1 1f3fd 200d 1f9bd / 1f9d1 1f3fe 200d 1f9bd / 1f9d1 1f3ff 200d 1f9bd / 384 | 👨‍🦽 👨🏻‍🦽 👨🏼‍🦽 👨🏽‍🦽 👨🏾‍🦽 👨🏿‍🦽 1f468 200d 1f9bd | 1f468 1f3fb 200d 1f9bd / 1f468 1f3fc 200d 1f9bd / 1f468 1f3fd 200d 1f9bd / 1f468 1f3fe 200d 1f9bd / 1f468 1f3ff 200d 1f9bd / 385 | 👩‍🦽‍➡️ 👩🏻‍🦽‍➡️ 👩🏼‍🦽‍➡️ 👩🏽‍🦽‍➡️ 👩🏾‍🦽‍➡️ 👩🏿‍🦽‍➡️ 1f469 200d 1f9bd 200d 27a1 | 1f469 1f3fb 200d 1f9bd 200d 27a1 / 1f469 1f3fc 200d 1f9bd 200d 27a1 / 1f469 1f3fd 200d 1f9bd 200d 27a1 / 1f469 1f3fe 200d 1f9bd 200d 27a1 / 1f469 1f3ff 200d 1f9bd 200d 27a1 / 386 | 🧑‍🦽‍➡️ 🧑🏻‍🦽‍➡️ 🧑🏼‍🦽‍➡️ 🧑🏽‍🦽‍➡️ 🧑🏾‍🦽‍➡️ 🧑🏿‍🦽‍➡️ 1f9d1 200d 1f9bd 200d 27a1 | 1f9d1 1f3fb 200d 1f9bd 200d 27a1 / 1f9d1 1f3fc 200d 1f9bd 200d 27a1 / 1f9d1 1f3fd 200d 1f9bd 200d 27a1 / 1f9d1 1f3fe 200d 1f9bd 200d 27a1 / 1f9d1 1f3ff 200d 1f9bd 200d 27a1 / 387 | 👨‍🦽‍➡️ 👨🏻‍🦽‍➡️ 👨🏼‍🦽‍➡️ 👨🏽‍🦽‍➡️ 👨🏾‍🦽‍➡️ 👨🏿‍🦽‍➡️ 1f468 200d 1f9bd 200d 27a1 | 1f468 1f3fb 200d 1f9bd 200d 27a1 / 1f468 1f3fc 200d 1f9bd 200d 27a1 / 1f468 1f3fd 200d 1f9bd 200d 27a1 / 1f468 1f3fe 200d 1f9bd 200d 27a1 / 1f468 1f3ff 200d 1f9bd 200d 27a1 / 388 | 👩‍🦼 👩🏻‍🦼 👩🏼‍🦼 👩🏽‍🦼 👩🏾‍🦼 👩🏿‍🦼 1f469 200d 1f9bc | 1f469 1f3fb 200d 1f9bc / 1f469 1f3fc 200d 1f9bc / 1f469 1f3fd 200d 1f9bc / 1f469 1f3fe 200d 1f9bc / 1f469 1f3ff 200d 1f9bc / 389 | 🧑‍🦼 🧑🏻‍🦼 🧑🏼‍🦼 🧑🏽‍🦼 🧑🏾‍🦼 🧑🏿‍🦼 1f9d1 200d 1f9bc | 1f9d1 1f3fb 200d 1f9bc / 1f9d1 1f3fc 200d 1f9bc / 1f9d1 1f3fd 200d 1f9bc / 1f9d1 1f3fe 200d 1f9bc / 1f9d1 1f3ff 200d 1f9bc / 390 | 👨‍🦼 👨🏻‍🦼 👨🏼‍🦼 👨🏽‍🦼 👨🏾‍🦼 👨🏿‍🦼 1f468 200d 1f9bc | 1f468 1f3fb 200d 1f9bc / 1f468 1f3fc 200d 1f9bc / 1f468 1f3fd 200d 1f9bc / 1f468 1f3fe 200d 1f9bc / 1f468 1f3ff 200d 1f9bc / 391 | 👩‍🦼‍➡️ 👩🏻‍🦼‍➡️ 👩🏼‍🦼‍➡️ 👩🏽‍🦼‍➡️ 👩🏾‍🦼‍➡️ 👩🏿‍🦼‍➡️ 1f469 200d 1f9bc 200d 27a1 | 1f469 1f3fb 200d 1f9bc 200d 27a1 / 1f469 1f3fc 200d 1f9bc 200d 27a1 / 1f469 1f3fd 200d 1f9bc 200d 27a1 / 1f469 1f3fe 200d 1f9bc 200d 27a1 / 1f469 1f3ff 200d 1f9bc 200d 27a1 / 392 | 🧑‍🦼‍➡️ 🧑🏻‍🦼‍➡️ 🧑🏼‍🦼‍➡️ 🧑🏽‍🦼‍➡️ 🧑🏾‍🦼‍➡️ 🧑🏿‍🦼‍➡️ 1f9d1 200d 1f9bc 200d 27a1 | 1f9d1 1f3fb 200d 1f9bc 200d 27a1 / 1f9d1 1f3fc 200d 1f9bc 200d 27a1 / 1f9d1 1f3fd 200d 1f9bc 200d 27a1 / 1f9d1 1f3fe 200d 1f9bc 200d 27a1 / 1f9d1 1f3ff 200d 1f9bc 200d 27a1 / 393 | 👨‍🦼‍➡️ 👨🏻‍🦼‍➡️ 👨🏼‍🦼‍➡️ 👨🏽‍🦼‍➡️ 👨🏾‍🦼‍➡️ 👨🏿‍🦼‍➡️ 1f468 200d 1f9bc 200d 27a1 | 1f468 1f3fb 200d 1f9bc 200d 27a1 / 1f468 1f3fc 200d 1f9bc 200d 27a1 / 1f468 1f3fd 200d 1f9bc 200d 27a1 / 1f468 1f3fe 200d 1f9bc 200d 27a1 / 1f468 1f3ff 200d 1f9bc 200d 27a1 / 394 | 🚶‍♀️ 🚶🏻‍♀️ 🚶🏼‍♀️ 🚶🏽‍♀️ 🚶🏾‍♀️ 🚶🏿‍♀️ 1f6b6 200d 2640 | 1f6b6 1f3fb 200d 2640 / 1f6b6 1f3fc 200d 2640 / 1f6b6 1f3fd 200d 2640 / 1f6b6 1f3fe 200d 2640 / 1f6b6 1f3ff 200d 2640 / 395 | 🚶 🚶🏻 🚶🏼 🚶🏽 🚶🏾 🚶🏿 1f6b6 | 1f6b6 1f3fb / 1f6b6 1f3fc / 1f6b6 1f3fd / 1f6b6 1f3fe / 1f6b6 1f3ff / 396 | 🚶‍♂️ 🚶🏻‍♂️ 🚶🏼‍♂️ 🚶🏽‍♂️ 🚶🏾‍♂️ 🚶🏿‍♂️ 1f6b6 200d 2642 | 1f6b6 1f3fb 200d 2642 / 1f6b6 1f3fc 200d 2642 / 1f6b6 1f3fd 200d 2642 / 1f6b6 1f3fe 200d 2642 / 1f6b6 1f3ff 200d 2642 / 397 | 🚶‍♀️‍➡️ 🚶🏻‍♀️‍➡️ 🚶🏼‍♀️‍➡️ 🚶🏽‍♀️‍➡️ 🚶🏾‍♀️‍➡️ 🚶🏿‍♀️‍➡️ 1f6b6 200d 2640 fe0f 200d 27a1 | 1f6b6 1f3fb 200d 2640 fe0f 200d 27a1 / 1f6b6 1f3fc 200d 2640 fe0f 200d 27a1 / 1f6b6 1f3fd 200d 2640 fe0f 200d 27a1 / 1f6b6 1f3fe 200d 2640 fe0f 200d 27a1 / 1f6b6 1f3ff 200d 2640 fe0f 200d 27a1 / 398 | 🚶‍➡️ 🚶🏻‍➡️ 🚶🏼‍➡️ 🚶🏽‍➡️ 🚶🏾‍➡️ 🚶🏿‍➡️ 1f6b6 200d 27a1 | 1f6b6 1f3fb 200d 27a1 / 1f6b6 1f3fc 200d 27a1 / 1f6b6 1f3fd 200d 27a1 / 1f6b6 1f3fe 200d 27a1 / 1f6b6 1f3ff 200d 27a1 / 399 | 🚶‍♂️‍➡️ 🚶🏻‍♂️‍➡️ 🚶🏼‍♂️‍➡️ 🚶🏽‍♂️‍➡️ 🚶🏾‍♂️‍➡️ 🚶🏿‍♂️‍➡️ 1f6b6 200d 2642 fe0f 200d 27a1 | 1f6b6 1f3fb 200d 2642 fe0f 200d 27a1 / 1f6b6 1f3fc 200d 2642 fe0f 200d 27a1 / 1f6b6 1f3fd 200d 2642 fe0f 200d 27a1 / 1f6b6 1f3fe 200d 2642 fe0f 200d 27a1 / 1f6b6 1f3ff 200d 2642 fe0f 200d 27a1 / 400 | 👩‍🦯 👩🏻‍🦯 👩🏼‍🦯 👩🏽‍🦯 👩🏾‍🦯 👩🏿‍🦯 1f469 200d 1f9af | 1f469 1f3fb 200d 1f9af / 1f469 1f3fc 200d 1f9af / 1f469 1f3fd 200d 1f9af / 1f469 1f3fe 200d 1f9af / 1f469 1f3ff 200d 1f9af / 401 | 🧑‍🦯 🧑🏻‍🦯 🧑🏼‍🦯 🧑🏽‍🦯 🧑🏾‍🦯 🧑🏿‍🦯 1f9d1 200d 1f9af | 1f9d1 1f3fb 200d 1f9af / 1f9d1 1f3fc 200d 1f9af / 1f9d1 1f3fd 200d 1f9af / 1f9d1 1f3fe 200d 1f9af / 1f9d1 1f3ff 200d 1f9af / 402 | 👨‍🦯 👨🏻‍🦯 👨🏼‍🦯 👨🏽‍🦯 👨🏾‍🦯 👨🏿‍🦯 1f468 200d 1f9af | 1f468 1f3fb 200d 1f9af / 1f468 1f3fc 200d 1f9af / 1f468 1f3fd 200d 1f9af / 1f468 1f3fe 200d 1f9af / 1f468 1f3ff 200d 1f9af / 403 | 👩‍🦯‍➡️ 👩🏻‍🦯‍➡️ 👩🏼‍🦯‍➡️ 👩🏽‍🦯‍➡️ 👩🏾‍🦯‍➡️ 👩🏿‍🦯‍➡️ 1f469 200d 1f9af 200d 27a1 | 1f469 1f3fb 200d 1f9af 200d 27a1 / 1f469 1f3fc 200d 1f9af 200d 27a1 / 1f469 1f3fd 200d 1f9af 200d 27a1 / 1f469 1f3fe 200d 1f9af 200d 27a1 / 1f469 1f3ff 200d 1f9af 200d 27a1 / 404 | 🧑‍🦯‍➡️ 🧑🏻‍🦯‍➡️ 🧑🏼‍🦯‍➡️ 🧑🏽‍🦯‍➡️ 🧑🏾‍🦯‍➡️ 🧑🏿‍🦯‍➡️ 1f9d1 200d 1f9af 200d 27a1 | 1f9d1 1f3fb 200d 1f9af 200d 27a1 / 1f9d1 1f3fc 200d 1f9af 200d 27a1 / 1f9d1 1f3fd 200d 1f9af 200d 27a1 / 1f9d1 1f3fe 200d 1f9af 200d 27a1 / 1f9d1 1f3ff 200d 1f9af 200d 27a1 / 405 | 👨‍🦯‍➡️ 👨🏻‍🦯‍➡️ 👨🏼‍🦯‍➡️ 👨🏽‍🦯‍➡️ 👨🏾‍🦯‍➡️ 👨🏿‍🦯‍➡️ 1f468 200d 1f9af 200d 27a1 | 1f468 1f3fb 200d 1f9af 200d 27a1 / 1f468 1f3fc 200d 1f9af 200d 27a1 / 1f468 1f3fd 200d 1f9af 200d 27a1 / 1f468 1f3fe 200d 1f9af 200d 27a1 / 1f468 1f3ff 200d 1f9af 200d 27a1 / 406 | 🧎‍♀️ 🧎🏻‍♀️ 🧎🏼‍♀️ 🧎🏽‍♀️ 🧎🏾‍♀️ 🧎🏿‍♀️ 1f9ce 200d 2640 | 1f9ce 1f3fb 200d 2640 / 1f9ce 1f3fc 200d 2640 / 1f9ce 1f3fd 200d 2640 / 1f9ce 1f3fe 200d 2640 / 1f9ce 1f3ff 200d 2640 / 407 | 🧎 🧎🏻 🧎🏼 🧎🏽 🧎🏾 🧎🏿 1f9ce | 1f9ce 1f3fb / 1f9ce 1f3fc / 1f9ce 1f3fd / 1f9ce 1f3fe / 1f9ce 1f3ff / 408 | 🧎‍♂️ 🧎🏻‍♂️ 🧎🏼‍♂️ 🧎🏽‍♂️ 🧎🏾‍♂️ 🧎🏿‍♂️ 1f9ce 200d 2642 | 1f9ce 1f3fb 200d 2642 / 1f9ce 1f3fc 200d 2642 / 1f9ce 1f3fd 200d 2642 / 1f9ce 1f3fe 200d 2642 / 1f9ce 1f3ff 200d 2642 / 409 | 🏃‍♀️ 🏃🏻‍♀️ 🏃🏼‍♀️ 🏃🏽‍♀️ 🏃🏾‍♀️ 🏃🏿‍♀️ 1f3c3 200d 2640 | 1f3c3 1f3fb 200d 2640 / 1f3c3 1f3fc 200d 2640 / 1f3c3 1f3fd 200d 2640 / 1f3c3 1f3fe 200d 2640 / 1f3c3 1f3ff 200d 2640 / 410 | 🏃 🏃🏻 🏃🏼 🏃🏽 🏃🏾 🏃🏿 1f3c3 | 1f3c3 1f3fb / 1f3c3 1f3fc / 1f3c3 1f3fd / 1f3c3 1f3fe / 1f3c3 1f3ff / 411 | 🏃‍♂️ 🏃🏻‍♂️ 🏃🏼‍♂️ 🏃🏽‍♂️ 🏃🏾‍♂️ 🏃🏿‍♂️ 1f3c3 200d 2642 | 1f3c3 1f3fb 200d 2642 / 1f3c3 1f3fc 200d 2642 / 1f3c3 1f3fd 200d 2642 / 1f3c3 1f3fe 200d 2642 / 1f3c3 1f3ff 200d 2642 / 412 | 🏃‍♀️‍➡️ 🏃🏻‍♀️‍➡️ 🏃🏼‍♀️‍➡️ 🏃🏽‍♀️‍➡️ 🏃🏾‍♀️‍➡️ 🏃🏿‍♀️‍➡️ 1f3c3 200d 2640 fe0f 200d 27a1 | 1f3c3 1f3fb 200d 2640 fe0f 200d 27a1 / 1f3c3 1f3fc 200d 2640 fe0f 200d 27a1 / 1f3c3 1f3fd 200d 2640 fe0f 200d 27a1 / 1f3c3 1f3fe 200d 2640 fe0f 200d 27a1 / 1f3c3 1f3ff 200d 2640 fe0f 200d 27a1 / 413 | 🏃‍➡️ 🏃🏻‍➡️ 🏃🏼‍➡️ 🏃🏽‍➡️ 🏃🏾‍➡️ 🏃🏿‍➡️ 1f3c3 200d 27a1 | 1f3c3 1f3fb 200d 27a1 / 1f3c3 1f3fc 200d 27a1 / 1f3c3 1f3fd 200d 27a1 / 1f3c3 1f3fe 200d 27a1 / 1f3c3 1f3ff 200d 27a1 / 414 | 🏃‍♂️‍➡️ 🏃🏻‍♂️‍➡️ 🏃🏼‍♂️‍➡️ 🏃🏽‍♂️‍➡️ 🏃🏾‍♂️‍➡️ 🏃🏿‍♂️‍➡️ 1f3c3 200d 2642 fe0f 200d 27a1 | 1f3c3 1f3fb 200d 2642 fe0f 200d 27a1 / 1f3c3 1f3fc 200d 2642 fe0f 200d 27a1 / 1f3c3 1f3fd 200d 2642 fe0f 200d 27a1 / 1f3c3 1f3fe 200d 2642 fe0f 200d 27a1 / 1f3c3 1f3ff 200d 2642 fe0f 200d 27a1 / 415 | 🧎‍♀️‍➡️ 🧎🏻‍♀️‍➡️ 🧎🏼‍♀️‍➡️ 🧎🏽‍♀️‍➡️ 🧎🏾‍♀️‍➡️ 🧎🏿‍♀️‍➡️ 1f9ce 200d 2640 fe0f 200d 27a1 | 1f9ce 1f3fb 200d 2640 fe0f 200d 27a1 / 1f9ce 1f3fc 200d 2640 fe0f 200d 27a1 / 1f9ce 1f3fd 200d 2640 fe0f 200d 27a1 / 1f9ce 1f3fe 200d 2640 fe0f 200d 27a1 / 1f9ce 1f3ff 200d 2640 fe0f 200d 27a1 / 416 | 🧎‍➡️ 🧎🏻‍➡️ 🧎🏼‍➡️ 🧎🏽‍➡️ 🧎🏾‍➡️ 🧎🏿‍➡️ 1f9ce 200d 27a1 | 1f9ce 1f3fb 200d 27a1 / 1f9ce 1f3fc 200d 27a1 / 1f9ce 1f3fd 200d 27a1 / 1f9ce 1f3fe 200d 27a1 / 1f9ce 1f3ff 200d 27a1 / 417 | 🧎‍♂️‍➡️ 🧎🏻‍♂️‍➡️ 🧎🏼‍♂️‍➡️ 🧎🏽‍♂️‍➡️ 🧎🏾‍♂️‍➡️ 🧎🏿‍♂️‍➡️ 1f9ce 200d 2642 fe0f 200d 27a1 | 1f9ce 1f3fb 200d 2642 fe0f 200d 27a1 / 1f9ce 1f3fc 200d 2642 fe0f 200d 27a1 / 1f9ce 1f3fd 200d 2642 fe0f 200d 27a1 / 1f9ce 1f3fe 200d 2642 fe0f 200d 27a1 / 1f9ce 1f3ff 200d 2642 fe0f 200d 27a1 / 418 | 🧍‍♀️ 🧍🏻‍♀️ 🧍🏼‍♀️ 🧍🏽‍♀️ 🧍🏾‍♀️ 🧍🏿‍♀️ 1f9cd 200d 2640 | 1f9cd 1f3fb 200d 2640 / 1f9cd 1f3fc 200d 2640 / 1f9cd 1f3fd 200d 2640 / 1f9cd 1f3fe 200d 2640 / 1f9cd 1f3ff 200d 2640 / 419 | 🧍 🧍🏻 🧍🏼 🧍🏽 🧍🏾 🧍🏿 1f9cd | 1f9cd 1f3fb / 1f9cd 1f3fc / 1f9cd 1f3fd / 1f9cd 1f3fe / 1f9cd 1f3ff / 420 | 🧍‍♂️ 🧍🏻‍♂️ 🧍🏼‍♂️ 🧍🏽‍♂️ 🧍🏾‍♂️ 🧍🏿‍♂️ 1f9cd 200d 2642 | 1f9cd 1f3fb 200d 2642 / 1f9cd 1f3fc 200d 2642 / 1f9cd 1f3fd 200d 2642 / 1f9cd 1f3fe 200d 2642 / 1f9cd 1f3ff 200d 2642 / 421 | 👫 👫🏻 👩🏻‍🤝‍👨🏼 👩🏻‍🤝‍👨🏽 👩🏻‍🤝‍👨🏾 👩🏻‍🤝‍👨🏿 👩🏼‍🤝‍👨🏻 👫🏼 👩🏼‍🤝‍👨🏽 👩🏼‍🤝‍👨🏾 👩🏼‍🤝‍👨🏿 👩🏽‍🤝‍👨🏻 👩🏽‍🤝‍👨🏼 👫🏽 👩🏽‍🤝‍👨🏾 👩🏽‍🤝‍👨🏿 👩🏾‍🤝‍👨🏻 👩🏾‍🤝‍👨🏼 👩🏾‍🤝‍👨🏽 👫🏾 👩🏾‍🤝‍👨🏿 👩🏿‍🤝‍👨🏻 👩🏿‍🤝‍👨🏼 👩🏿‍🤝‍👨🏽 👩🏿‍🤝‍👨🏾 👫🏿 1f46b | 1f46b 1f3fb / 1f469 1f3fb 200d 1f91d 200d 1f468 1f3fc / 1f469 1f3fb 200d 1f91d 200d 1f468 1f3fd / 1f469 1f3fb 200d 1f91d 200d 1f468 1f3fe / 1f469 1f3fb 200d 1f91d 200d 1f468 1f3ff / 1f469 1f3fc 200d 1f91d 200d 1f468 1f3fb / 1f46b 1f3fc / 1f469 1f3fc 200d 1f91d 200d 1f468 1f3fd / 1f469 1f3fc 200d 1f91d 200d 1f468 1f3fe / 1f469 1f3fc 200d 1f91d 200d 1f468 1f3ff / 1f469 1f3fd 200d 1f91d 200d 1f468 1f3fb / 1f469 1f3fd 200d 1f91d 200d 1f468 1f3fc / 1f46b 1f3fd / 1f469 1f3fd 200d 1f91d 200d 1f468 1f3fe / 1f469 1f3fd 200d 1f91d 200d 1f468 1f3ff / 1f469 1f3fe 200d 1f91d 200d 1f468 1f3fb / 1f469 1f3fe 200d 1f91d 200d 1f468 1f3fc / 1f469 1f3fe 200d 1f91d 200d 1f468 1f3fd / 1f46b 1f3fe / 1f469 1f3fe 200d 1f91d 200d 1f468 1f3ff / 1f469 1f3ff 200d 1f91d 200d 1f468 1f3fb / 1f469 1f3ff 200d 1f91d 200d 1f468 1f3fc / 1f469 1f3ff 200d 1f91d 200d 1f468 1f3fd / 1f469 1f3ff 200d 1f91d 200d 1f468 1f3fe / 1f46b 1f3ff / 422 | 👭 👭🏻 👩🏻‍🤝‍👩🏼 👩🏻‍🤝‍👩🏽 👩🏻‍🤝‍👩🏾 👩🏻‍🤝‍👩🏿 👩🏼‍🤝‍👩🏻 👭🏼 👩🏼‍🤝‍👩🏽 👩🏼‍🤝‍👩🏾 👩🏼‍🤝‍👩🏿 👩🏽‍🤝‍👩🏻 👩🏽‍🤝‍👩🏼 👭🏽 👩🏽‍🤝‍👩🏾 👩🏽‍🤝‍👩🏿 👩🏾‍🤝‍👩🏻 👩🏾‍🤝‍👩🏼 👩🏾‍🤝‍👩🏽 👭🏾 👩🏾‍🤝‍👩🏿 👩🏿‍🤝‍👩🏻 👩🏿‍🤝‍👩🏼 👩🏿‍🤝‍👩🏽 👩🏿‍🤝‍👩🏾 👭🏿 1f46d | 1f46d 1f3fb / 1f469 1f3fb 200d 1f91d 200d 1f469 1f3fc / 1f469 1f3fb 200d 1f91d 200d 1f469 1f3fd / 1f469 1f3fb 200d 1f91d 200d 1f469 1f3fe / 1f469 1f3fb 200d 1f91d 200d 1f469 1f3ff / 1f469 1f3fc 200d 1f91d 200d 1f469 1f3fb / 1f46d 1f3fc / 1f469 1f3fc 200d 1f91d 200d 1f469 1f3fd / 1f469 1f3fc 200d 1f91d 200d 1f469 1f3fe / 1f469 1f3fc 200d 1f91d 200d 1f469 1f3ff / 1f469 1f3fd 200d 1f91d 200d 1f469 1f3fb / 1f469 1f3fd 200d 1f91d 200d 1f469 1f3fc / 1f46d 1f3fd / 1f469 1f3fd 200d 1f91d 200d 1f469 1f3fe / 1f469 1f3fd 200d 1f91d 200d 1f469 1f3ff / 1f469 1f3fe 200d 1f91d 200d 1f469 1f3fb / 1f469 1f3fe 200d 1f91d 200d 1f469 1f3fc / 1f469 1f3fe 200d 1f91d 200d 1f469 1f3fd / 1f46d 1f3fe / 1f469 1f3fe 200d 1f91d 200d 1f469 1f3ff / 1f469 1f3ff 200d 1f91d 200d 1f469 1f3fb / 1f469 1f3ff 200d 1f91d 200d 1f469 1f3fc / 1f469 1f3ff 200d 1f91d 200d 1f469 1f3fd / 1f469 1f3ff 200d 1f91d 200d 1f469 1f3fe / 1f46d 1f3ff / 423 | 👬 👬🏻 👨🏻‍🤝‍👨🏼 👨🏻‍🤝‍👨🏽 👨🏻‍🤝‍👨🏾 👨🏻‍🤝‍👨🏿 👨🏼‍🤝‍👨🏻 👬🏼 👨🏼‍🤝‍👨🏽 👨🏼‍🤝‍👨🏾 👨🏼‍🤝‍👨🏿 👨🏽‍🤝‍👨🏻 👨🏽‍🤝‍👨🏼 👬🏽 👨🏽‍🤝‍👨🏾 👨🏽‍🤝‍👨🏿 👨🏾‍🤝‍👨🏻 👨🏾‍🤝‍👨🏼 👨🏾‍🤝‍👨🏽 👬🏾 👨🏾‍🤝‍👨🏿 👨🏿‍🤝‍👨🏻 👨🏿‍🤝‍👨🏼 👨🏿‍🤝‍👨🏽 👨🏿‍🤝‍👨🏾 👬🏿 1f46c | 1f46c 1f3fb / 1f468 1f3fb 200d 1f91d 200d 1f468 1f3fc / 1f468 1f3fb 200d 1f91d 200d 1f468 1f3fd / 1f468 1f3fb 200d 1f91d 200d 1f468 1f3fe / 1f468 1f3fb 200d 1f91d 200d 1f468 1f3ff / 1f468 1f3fc 200d 1f91d 200d 1f468 1f3fb / 1f46c 1f3fc / 1f468 1f3fc 200d 1f91d 200d 1f468 1f3fd / 1f468 1f3fc 200d 1f91d 200d 1f468 1f3fe / 1f468 1f3fc 200d 1f91d 200d 1f468 1f3ff / 1f468 1f3fd 200d 1f91d 200d 1f468 1f3fb / 1f468 1f3fd 200d 1f91d 200d 1f468 1f3fc / 1f46c 1f3fd / 1f468 1f3fd 200d 1f91d 200d 1f468 1f3fe / 1f468 1f3fd 200d 1f91d 200d 1f468 1f3ff / 1f468 1f3fe 200d 1f91d 200d 1f468 1f3fb / 1f468 1f3fe 200d 1f91d 200d 1f468 1f3fc / 1f468 1f3fe 200d 1f91d 200d 1f468 1f3fd / 1f46c 1f3fe / 1f468 1f3fe 200d 1f91d 200d 1f468 1f3ff / 1f468 1f3ff 200d 1f91d 200d 1f468 1f3fb / 1f468 1f3ff 200d 1f91d 200d 1f468 1f3fc / 1f468 1f3ff 200d 1f91d 200d 1f468 1f3fd / 1f468 1f3ff 200d 1f91d 200d 1f468 1f3fe / 1f46c 1f3ff / 424 | 👩‍❤️‍👨 👩🏻‍❤️‍👨🏻 👩🏻‍❤️‍👨🏼 👩🏻‍❤️‍👨🏽 👩🏻‍❤️‍👨🏾 👩🏻‍❤️‍👨🏿 👩🏼‍❤️‍👨🏻 👩🏼‍❤️‍👨🏼 👩🏼‍❤️‍👨🏽 👩🏼‍❤️‍👨🏾 👩🏼‍❤️‍👨🏿 👩🏽‍❤️‍👨🏻 👩🏽‍❤️‍👨🏼 👩🏽‍❤️‍👨🏽 👩🏽‍❤️‍👨🏾 👩🏽‍❤️‍👨🏿 👩🏾‍❤️‍👨🏻 👩🏾‍❤️‍👨🏼 👩🏾‍❤️‍👨🏽 👩🏾‍❤️‍👨🏾 👩🏾‍❤️‍👨🏿 👩🏿‍❤️‍👨🏻 👩🏿‍❤️‍👨🏼 👩🏿‍❤️‍👨🏽 👩🏿‍❤️‍👨🏾 👩🏿‍❤️‍👨🏿 1f469 200d 2764 fe0f 200d 1f468 | 1f469 1f3fb 200d 2764 fe0f 200d 1f468 1f3fb / 1f469 1f3fb 200d 2764 fe0f 200d 1f468 1f3fc / 1f469 1f3fb 200d 2764 fe0f 200d 1f468 1f3fd / 1f469 1f3fb 200d 2764 fe0f 200d 1f468 1f3fe / 1f469 1f3fb 200d 2764 fe0f 200d 1f468 1f3ff / 1f469 1f3fc 200d 2764 fe0f 200d 1f468 1f3fb / 1f469 1f3fc 200d 2764 fe0f 200d 1f468 1f3fc / 1f469 1f3fc 200d 2764 fe0f 200d 1f468 1f3fd / 1f469 1f3fc 200d 2764 fe0f 200d 1f468 1f3fe / 1f469 1f3fc 200d 2764 fe0f 200d 1f468 1f3ff / 1f469 1f3fd 200d 2764 fe0f 200d 1f468 1f3fb / 1f469 1f3fd 200d 2764 fe0f 200d 1f468 1f3fc / 1f469 1f3fd 200d 2764 fe0f 200d 1f468 1f3fd / 1f469 1f3fd 200d 2764 fe0f 200d 1f468 1f3fe / 1f469 1f3fd 200d 2764 fe0f 200d 1f468 1f3ff / 1f469 1f3fe 200d 2764 fe0f 200d 1f468 1f3fb / 1f469 1f3fe 200d 2764 fe0f 200d 1f468 1f3fc / 1f469 1f3fe 200d 2764 fe0f 200d 1f468 1f3fd / 1f469 1f3fe 200d 2764 fe0f 200d 1f468 1f3fe / 1f469 1f3fe 200d 2764 fe0f 200d 1f468 1f3ff / 1f469 1f3ff 200d 2764 fe0f 200d 1f468 1f3fb / 1f469 1f3ff 200d 2764 fe0f 200d 1f468 1f3fc / 1f469 1f3ff 200d 2764 fe0f 200d 1f468 1f3fd / 1f469 1f3ff 200d 2764 fe0f 200d 1f468 1f3fe / 1f469 1f3ff 200d 2764 fe0f 200d 1f468 1f3ff / 425 | 👩‍❤️‍👩 👩🏻‍❤️‍👩🏻 👩🏻‍❤️‍👩🏼 👩🏻‍❤️‍👩🏽 👩🏻‍❤️‍👩🏾 👩🏻‍❤️‍👩🏿 👩🏼‍❤️‍👩🏻 👩🏼‍❤️‍👩🏼 👩🏼‍❤️‍👩🏽 👩🏼‍❤️‍👩🏾 👩🏼‍❤️‍👩🏿 👩🏽‍❤️‍👩🏻 👩🏽‍❤️‍👩🏼 👩🏽‍❤️‍👩🏽 👩🏽‍❤️‍👩🏾 👩🏽‍❤️‍👩🏿 👩🏾‍❤️‍👩🏻 👩🏾‍❤️‍👩🏼 👩🏾‍❤️‍👩🏽 👩🏾‍❤️‍👩🏾 👩🏾‍❤️‍👩🏿 👩🏿‍❤️‍👩🏻 👩🏿‍❤️‍👩🏼 👩🏿‍❤️‍👩🏽 👩🏿‍❤️‍👩🏾 👩🏿‍❤️‍👩🏿 1f469 200d 2764 fe0f 200d 1f469 | 1f469 1f3fb 200d 2764 fe0f 200d 1f469 1f3fb / 1f469 1f3fb 200d 2764 fe0f 200d 1f469 1f3fc / 1f469 1f3fb 200d 2764 fe0f 200d 1f469 1f3fd / 1f469 1f3fb 200d 2764 fe0f 200d 1f469 1f3fe / 1f469 1f3fb 200d 2764 fe0f 200d 1f469 1f3ff / 1f469 1f3fc 200d 2764 fe0f 200d 1f469 1f3fb / 1f469 1f3fc 200d 2764 fe0f 200d 1f469 1f3fc / 1f469 1f3fc 200d 2764 fe0f 200d 1f469 1f3fd / 1f469 1f3fc 200d 2764 fe0f 200d 1f469 1f3fe / 1f469 1f3fc 200d 2764 fe0f 200d 1f469 1f3ff / 1f469 1f3fd 200d 2764 fe0f 200d 1f469 1f3fb / 1f469 1f3fd 200d 2764 fe0f 200d 1f469 1f3fc / 1f469 1f3fd 200d 2764 fe0f 200d 1f469 1f3fd / 1f469 1f3fd 200d 2764 fe0f 200d 1f469 1f3fe / 1f469 1f3fd 200d 2764 fe0f 200d 1f469 1f3ff / 1f469 1f3fe 200d 2764 fe0f 200d 1f469 1f3fb / 1f469 1f3fe 200d 2764 fe0f 200d 1f469 1f3fc / 1f469 1f3fe 200d 2764 fe0f 200d 1f469 1f3fd / 1f469 1f3fe 200d 2764 fe0f 200d 1f469 1f3fe / 1f469 1f3fe 200d 2764 fe0f 200d 1f469 1f3ff / 1f469 1f3ff 200d 2764 fe0f 200d 1f469 1f3fb / 1f469 1f3ff 200d 2764 fe0f 200d 1f469 1f3fc / 1f469 1f3ff 200d 2764 fe0f 200d 1f469 1f3fd / 1f469 1f3ff 200d 2764 fe0f 200d 1f469 1f3fe / 1f469 1f3ff 200d 2764 fe0f 200d 1f469 1f3ff / 426 | 💑 🧑🏻‍❤️‍🧑🏻 🧑🏻‍❤️‍🧑🏼 🧑🏻‍❤️‍🧑🏽 🧑🏻‍❤️‍🧑🏾 🧑🏻‍❤️‍🧑🏿 🧑🏼‍❤️‍🧑🏻 🧑🏼‍❤️‍🧑🏼 🧑🏼‍❤️‍🧑🏽 🧑🏼‍❤️‍🧑🏾 🧑🏼‍❤️‍🧑🏿 🧑🏽‍❤️‍🧑🏻 🧑🏽‍❤️‍🧑🏼 🧑🏽‍❤️‍🧑🏽 🧑🏽‍❤️‍🧑🏾 🧑🏽‍❤️‍🧑🏿 🧑🏾‍❤️‍🧑🏻 🧑🏾‍❤️‍🧑🏼 🧑🏾‍❤️‍🧑🏽 🧑🏾‍❤️‍🧑🏾 🧑🏾‍❤️‍🧑🏿 🧑🏿‍❤️‍🧑🏻 🧑🏿‍❤️‍🧑🏼 🧑🏿‍❤️‍🧑🏽 🧑🏿‍❤️‍🧑🏾 🧑🏿‍❤️‍🧑🏿 1f491 | 1f9d1 1f3fb 200d 2764 fe0f 200d 1f9d1 1f3fb / 1f9d1 1f3fb 200d 2764 fe0f 200d 1f9d1 1f3fc / 1f9d1 1f3fb 200d 2764 fe0f 200d 1f9d1 1f3fd / 1f9d1 1f3fb 200d 2764 fe0f 200d 1f9d1 1f3fe / 1f9d1 1f3fb 200d 2764 fe0f 200d 1f9d1 1f3ff / 1f9d1 1f3fc 200d 2764 fe0f 200d 1f9d1 1f3fb / 1f9d1 1f3fc 200d 2764 fe0f 200d 1f9d1 1f3fc / 1f9d1 1f3fc 200d 2764 fe0f 200d 1f9d1 1f3fd / 1f9d1 1f3fc 200d 2764 fe0f 200d 1f9d1 1f3fe / 1f9d1 1f3fc 200d 2764 fe0f 200d 1f9d1 1f3ff / 1f9d1 1f3fd 200d 2764 fe0f 200d 1f9d1 1f3fb / 1f9d1 1f3fd 200d 2764 fe0f 200d 1f9d1 1f3fc / 1f9d1 1f3fd 200d 2764 fe0f 200d 1f9d1 1f3fd / 1f9d1 1f3fd 200d 2764 fe0f 200d 1f9d1 1f3fe / 1f9d1 1f3fd 200d 2764 fe0f 200d 1f9d1 1f3ff / 1f9d1 1f3fe 200d 2764 fe0f 200d 1f9d1 1f3fb / 1f9d1 1f3fe 200d 2764 fe0f 200d 1f9d1 1f3fc / 1f9d1 1f3fe 200d 2764 fe0f 200d 1f9d1 1f3fd / 1f9d1 1f3fe 200d 2764 fe0f 200d 1f9d1 1f3fe / 1f9d1 1f3fe 200d 2764 fe0f 200d 1f9d1 1f3ff / 1f9d1 1f3ff 200d 2764 fe0f 200d 1f9d1 1f3fb / 1f9d1 1f3ff 200d 2764 fe0f 200d 1f9d1 1f3fc / 1f9d1 1f3ff 200d 2764 fe0f 200d 1f9d1 1f3fd / 1f9d1 1f3ff 200d 2764 fe0f 200d 1f9d1 1f3fe / 1f9d1 1f3ff 200d 2764 fe0f 200d 1f9d1 1f3ff / 427 | 👨‍❤️‍👨 👨🏻‍❤️‍👨🏻 👨🏻‍❤️‍👨🏼 👨🏻‍❤️‍👨🏽 👨🏻‍❤️‍👨🏾 👨🏻‍❤️‍👨🏿 👨🏼‍❤️‍👨🏻 👨🏼‍❤️‍👨🏼 👨🏼‍❤️‍👨🏽 👨🏼‍❤️‍👨🏾 👨🏼‍❤️‍👨🏿 👨🏽‍❤️‍👨🏻 👨🏽‍❤️‍👨🏼 👨🏽‍❤️‍👨🏽 👨🏽‍❤️‍👨🏾 👨🏽‍❤️‍👨🏿 👨🏾‍❤️‍👨🏻 👨🏾‍❤️‍👨🏼 👨🏾‍❤️‍👨🏽 👨🏾‍❤️‍👨🏾 👨🏾‍❤️‍👨🏿 👨🏿‍❤️‍👨🏻 👨🏿‍❤️‍👨🏼 👨🏿‍❤️‍👨🏽 👨🏿‍❤️‍👨🏾 👨🏿‍❤️‍👨🏿 1f468 200d 2764 fe0f 200d 1f468 | 1f468 1f3fb 200d 2764 fe0f 200d 1f468 1f3fb / 1f468 1f3fb 200d 2764 fe0f 200d 1f468 1f3fc / 1f468 1f3fb 200d 2764 fe0f 200d 1f468 1f3fd / 1f468 1f3fb 200d 2764 fe0f 200d 1f468 1f3fe / 1f468 1f3fb 200d 2764 fe0f 200d 1f468 1f3ff / 1f468 1f3fc 200d 2764 fe0f 200d 1f468 1f3fb / 1f468 1f3fc 200d 2764 fe0f 200d 1f468 1f3fc / 1f468 1f3fc 200d 2764 fe0f 200d 1f468 1f3fd / 1f468 1f3fc 200d 2764 fe0f 200d 1f468 1f3fe / 1f468 1f3fc 200d 2764 fe0f 200d 1f468 1f3ff / 1f468 1f3fd 200d 2764 fe0f 200d 1f468 1f3fb / 1f468 1f3fd 200d 2764 fe0f 200d 1f468 1f3fc / 1f468 1f3fd 200d 2764 fe0f 200d 1f468 1f3fd / 1f468 1f3fd 200d 2764 fe0f 200d 1f468 1f3fe / 1f468 1f3fd 200d 2764 fe0f 200d 1f468 1f3ff / 1f468 1f3fe 200d 2764 fe0f 200d 1f468 1f3fb / 1f468 1f3fe 200d 2764 fe0f 200d 1f468 1f3fc / 1f468 1f3fe 200d 2764 fe0f 200d 1f468 1f3fd / 1f468 1f3fe 200d 2764 fe0f 200d 1f468 1f3fe / 1f468 1f3fe 200d 2764 fe0f 200d 1f468 1f3ff / 1f468 1f3ff 200d 2764 fe0f 200d 1f468 1f3fb / 1f468 1f3ff 200d 2764 fe0f 200d 1f468 1f3fc / 1f468 1f3ff 200d 2764 fe0f 200d 1f468 1f3fd / 1f468 1f3ff 200d 2764 fe0f 200d 1f468 1f3fe / 1f468 1f3ff 200d 2764 fe0f 200d 1f468 1f3ff / 428 | 👩‍❤️‍💋‍👨 👩🏻‍❤️‍💋‍👨🏻 👩🏻‍❤️‍💋‍👨🏼 👩🏻‍❤️‍💋‍👨🏽 👩🏻‍❤️‍💋‍👨🏾 👩🏻‍❤️‍💋‍👨🏿 👩🏼‍❤️‍💋‍👨🏻 👩🏼‍❤️‍💋‍👨🏼 👩🏼‍❤️‍💋‍👨🏽 👩🏼‍❤️‍💋‍👨🏾 👩🏼‍❤️‍💋‍👨🏿 👩🏽‍❤️‍💋‍👨🏻 👩🏽‍❤️‍💋‍👨🏼 👩🏽‍❤️‍💋‍👨🏽 👩🏽‍❤️‍💋‍👨🏾 👩🏽‍❤️‍💋‍👨🏿 👩🏾‍❤️‍💋‍👨🏻 👩🏾‍❤️‍💋‍👨🏼 👩🏾‍❤️‍💋‍👨🏽 👩🏾‍❤️‍💋‍👨🏾 👩🏾‍❤️‍💋‍👨🏿 👩🏿‍❤️‍💋‍👨🏻 👩🏿‍❤️‍💋‍👨🏼 👩🏿‍❤️‍💋‍👨🏽 👩🏿‍❤️‍💋‍👨🏾 👩🏿‍❤️‍💋‍👨🏿 1f469 200d 2764 fe0f 200d 1f48b 200d 1f468 | 1f469 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fb / 1f469 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fc / 1f469 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fd / 1f469 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fe / 1f469 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3ff / 1f469 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fb / 1f469 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fc / 1f469 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fd / 1f469 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fe / 1f469 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3ff / 1f469 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fb / 1f469 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fc / 1f469 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fd / 1f469 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fe / 1f469 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3ff / 1f469 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fb / 1f469 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fc / 1f469 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fd / 1f469 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fe / 1f469 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3ff / 1f469 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fb / 1f469 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fc / 1f469 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fd / 1f469 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fe / 1f469 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3ff / 429 | 👩‍❤️‍💋‍👩 👩🏻‍❤️‍💋‍👩🏻 👩🏻‍❤️‍💋‍👩🏼 👩🏻‍❤️‍💋‍👩🏽 👩🏻‍❤️‍💋‍👩🏾 👩🏻‍❤️‍💋‍👩🏿 👩🏼‍❤️‍💋‍👩🏻 👩🏼‍❤️‍💋‍👩🏼 👩🏼‍❤️‍💋‍👩🏽 👩🏼‍❤️‍💋‍👩🏾 👩🏼‍❤️‍💋‍👩🏿 👩🏽‍❤️‍💋‍👩🏻 👩🏽‍❤️‍💋‍👩🏼 👩🏽‍❤️‍💋‍👩🏽 👩🏽‍❤️‍💋‍👩🏾 👩🏽‍❤️‍💋‍👩🏿 👩🏾‍❤️‍💋‍👩🏻 👩🏾‍❤️‍💋‍👩🏼 👩🏾‍❤️‍💋‍👩🏽 👩🏾‍❤️‍💋‍👩🏾 👩🏾‍❤️‍💋‍👩🏿 👩🏿‍❤️‍💋‍👩🏻 👩🏿‍❤️‍💋‍👩🏼 👩🏿‍❤️‍💋‍👩🏽 👩🏿‍❤️‍💋‍👩🏾 👩🏿‍❤️‍💋‍👩🏿 1f469 200d 2764 fe0f 200d 1f48b 200d 1f469 | 1f469 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fb / 1f469 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fc / 1f469 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fd / 1f469 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fe / 1f469 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3ff / 1f469 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fb / 1f469 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fc / 1f469 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fd / 1f469 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fe / 1f469 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3ff / 1f469 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fb / 1f469 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fc / 1f469 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fd / 1f469 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fe / 1f469 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3ff / 1f469 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fb / 1f469 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fc / 1f469 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fd / 1f469 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fe / 1f469 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3ff / 1f469 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fb / 1f469 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fc / 1f469 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fd / 1f469 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3fe / 1f469 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f469 1f3ff / 430 | 💏 🧑🏻‍❤️‍💋‍🧑🏻 🧑🏻‍❤️‍💋‍🧑🏼 🧑🏻‍❤️‍💋‍🧑🏽 🧑🏻‍❤️‍💋‍🧑🏾 🧑🏻‍❤️‍💋‍🧑🏿 🧑🏼‍❤️‍💋‍🧑🏻 🧑🏼‍❤️‍💋‍🧑🏼 🧑🏼‍❤️‍💋‍🧑🏽 🧑🏼‍❤️‍💋‍🧑🏾 🧑🏼‍❤️‍💋‍🧑🏿 🧑🏽‍❤️‍💋‍🧑🏻 🧑🏽‍❤️‍💋‍🧑🏼 🧑🏽‍❤️‍💋‍🧑🏽 🧑🏽‍❤️‍💋‍🧑🏾 🧑🏽‍❤️‍💋‍🧑🏿 🧑🏾‍❤️‍💋‍🧑🏻 🧑🏾‍❤️‍💋‍🧑🏼 🧑🏾‍❤️‍💋‍🧑🏽 🧑🏾‍❤️‍💋‍🧑🏾 🧑🏾‍❤️‍💋‍🧑🏿 🧑🏿‍❤️‍💋‍🧑🏻 🧑🏿‍❤️‍💋‍🧑🏼 🧑🏿‍❤️‍💋‍🧑🏽 🧑🏿‍❤️‍💋‍🧑🏾 🧑🏿‍❤️‍💋‍🧑🏿 1f48f | 1f9d1 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fb / 1f9d1 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fc / 1f9d1 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fd / 1f9d1 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fe / 1f9d1 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3ff / 1f9d1 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fb / 1f9d1 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fc / 1f9d1 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fd / 1f9d1 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fe / 1f9d1 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3ff / 1f9d1 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fb / 1f9d1 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fc / 1f9d1 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fd / 1f9d1 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fe / 1f9d1 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3ff / 1f9d1 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fb / 1f9d1 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fc / 1f9d1 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fd / 1f9d1 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fe / 1f9d1 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3ff / 1f9d1 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fb / 1f9d1 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fc / 1f9d1 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fd / 1f9d1 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3fe / 1f9d1 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f9d1 1f3ff / 431 | 👨‍❤️‍💋‍👨 👨🏻‍❤️‍💋‍👨🏻 👨🏻‍❤️‍💋‍👨🏼 👨🏻‍❤️‍💋‍👨🏽 👨🏻‍❤️‍💋‍👨🏾 👨🏻‍❤️‍💋‍👨🏿 👨🏼‍❤️‍💋‍👨🏻 👨🏼‍❤️‍💋‍👨🏼 👨🏼‍❤️‍💋‍👨🏽 👨🏼‍❤️‍💋‍👨🏾 👨🏼‍❤️‍💋‍👨🏿 👨🏽‍❤️‍💋‍👨🏻 👨🏽‍❤️‍💋‍👨🏼 👨🏽‍❤️‍💋‍👨🏽 👨🏽‍❤️‍💋‍👨🏾 👨🏽‍❤️‍💋‍👨🏿 👨🏾‍❤️‍💋‍👨🏻 👨🏾‍❤️‍💋‍👨🏼 👨🏾‍❤️‍💋‍👨🏽 👨🏾‍❤️‍💋‍👨🏾 👨🏾‍❤️‍💋‍👨🏿 👨🏿‍❤️‍💋‍👨🏻 👨🏿‍❤️‍💋‍👨🏼 👨🏿‍❤️‍💋‍👨🏽 👨🏿‍❤️‍💋‍👨🏾 👨🏿‍❤️‍💋‍👨🏿 1f468 200d 2764 fe0f 200d 1f48b 200d 1f468 | 1f468 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fb / 1f468 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fc / 1f468 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fd / 1f468 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fe / 1f468 1f3fb 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3ff / 1f468 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fb / 1f468 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fc / 1f468 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fd / 1f468 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fe / 1f468 1f3fc 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3ff / 1f468 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fb / 1f468 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fc / 1f468 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fd / 1f468 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fe / 1f468 1f3fd 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3ff / 1f468 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fb / 1f468 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fc / 1f468 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fd / 1f468 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fe / 1f468 1f3fe 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3ff / 1f468 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fb / 1f468 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fc / 1f468 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fd / 1f468 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3fe / 1f468 1f3ff 200d 2764 fe0f 200d 1f48b 200d 1f468 1f3ff / 432 | 🪢 1faa2 433 | 🧶 1f9f6 434 | 🧵 1f9f5 435 | 🪡 1faa1 436 | 🧥 1f9e5 437 | 🥼 1f97c 438 | 🦺 1f9ba 439 | 👚 1f45a 440 | 👕 1f455 441 | 👖 1f456 442 | 🩲 1fa72 443 | 🩳 1fa73 444 | 👔 1f454 445 | 👗 1f457 446 | 👙 1f459 447 | 🩱 1fa71 448 | 👘 1f458 449 | 🥻 1f97b 450 | 🩴 1fa74 451 | 🥿 1f97f 452 | 👠 1f460 453 | 👡 1f461 454 | 👢 1f462 455 | 👞 1f45e 456 | 👟 1f45f 457 | 🥾 1f97e 458 | 🧦 1f9e6 459 | 🧤 1f9e4 460 | 🧣 1f9e3 461 | 🎩 1f3a9 462 | 🧢 1f9e2 463 | 👒 1f452 464 | 🎓 1f393 465 | ⛑️ 26d1 466 | 🪖 1fa96 467 | 👑 1f451 468 | 💍 1f48d 469 | 👝 1f45d 470 | 👛 1f45b 471 | 👜 1f45c 472 | 💼 1f4bc 473 | 🎒 1f392 474 | 🧳 1f9f3 475 | 👓 1f453 476 | 🕶️ 1f576 477 | 🥽 1f97d 478 | 🌂 1f302 479 | -------------------------------------------------------------------------------- /EmojiUIKit/EmojiPageControl.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | // iOS 5-6 4 | @interface EmojiPageControl : UIPageControl 5 | @end 6 | -------------------------------------------------------------------------------- /EmojiUIKit/EmojiUIKit-Structs.h: -------------------------------------------------------------------------------- 1 | typedef struct UIKBRects *UIKBRectsRef; 2 | typedef struct UIKBTheme *UIKBThemeRef; -------------------------------------------------------------------------------- /EmojiUIKit/EmojiUIKit.h: -------------------------------------------------------------------------------- 1 | #import "_UIBackdropViewSettingsLightEmojiKeyboard.h" 2 | #import "_UIEmojiPageControl.h" 3 | #import "EmojiUIKit-Structs.h" 4 | #import "EmojiPageControl.h" 5 | #import "UIKBKeyView+KBResize.h" 6 | #import "UIKBRenderConfig+iOS83UIModern.h" 7 | #import "UIKBRenderFactory_Emoji.h" 8 | #import "UIKBRenderFactoryEmoji_iPhone.h" 9 | #import "UIKBRenderFactoryiPhone_Emoji.h" 10 | #import "UIKeyboardEmoji+EmojiHUD.h" 11 | #import "UIKeyboardEmoji.h" 12 | #import "UIKeyboardEmojiCategoriesControl.h" 13 | #import "UIKeyboardEmojiCategoriesControl_iPad.h" 14 | #import "UIKeyboardEmojiCategoriesControl_iPhone.h" 15 | #import "UIKeyboardEmojiCategory+EmojiLocalization.h" 16 | #import "UIKeyboardEmojiCategory.h" 17 | #import "UIKeyboardEmojiCategoryBar.h" 18 | #import "UIKeyboardEmojiCategoryBar_iPad.h" 19 | #import "UIKeyboardEmojiCategoryBar_iPhone.h" 20 | #import "UIKeyboardEmojiCategoryController.h" 21 | #import "UIKeyboardEmojiCategoryUpdate.h" 22 | #import "UIKeyboardEmojiCollectionInputView.h" 23 | #import "UIKeyboardEmojiCollectionView.h" 24 | #import "UIKeyboardEmojiCollectionViewCell.h" 25 | #import "UIKeyboardEmojiDefaultsController.h" 26 | #import "UIKeyboardEmojiFactory.h" 27 | #import "UIKeyboardEmojiFamilyConfigurationView.h" 28 | #import "UIKeyboardEmojiGraphics.h" 29 | #import "UIKeyboardEmojiGraphicsTraits.h" 30 | #import "UIKeyboardEmojiImageView.h" 31 | #import "UIKeyboardEmojiInput.h" 32 | #import "UIKeyboardEmojiInputController.h" 33 | #import "UIKeyboardEmojiKeyDisplayController.h" 34 | #import "UIKeyboardEmojiKeyView.h" 35 | #import "UIKeyboardEmojiPage.h" 36 | #import "UIKeyboardEmojiPreferences.h" 37 | #import "UIKeyboardEmojiPressIndicationDelegate.h" 38 | #import "UIKeyboardEmojiRecentsController.h" 39 | #import "UIKeyboardEmojiScrollView.h" 40 | #import "UIKeyboardEmojiScrubBarView.h" 41 | #import "UIKeyboardEmojiSplit.h" 42 | #import "UIKeyboardEmojiSplitCategoryPicker.h" 43 | #import "UIKeyboardEmojiView.h" 44 | #import "UIKeyboardEmojiWellView.h" 45 | #import "UIKeyboardLayoutEmoji.h" 46 | #import "UIPeripheralHost+iOS83UIModern.h" 47 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKBKeyView+KBResize.h: -------------------------------------------------------------------------------- 1 | @class UIKBTree; 2 | #import 3 | 4 | @interface UIKBKeyView (KBResize) 5 | - (void)emoji83_positionFixForKeyplane:(UIKBTree *)keyplane key:(UIKBTree *)key; 6 | @end 7 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKBRenderConfig+iOS83UIModern.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | // iOS 7+ 4 | @interface UIKBRenderConfig (iOS83UiModern) 5 | @property (assign) BOOL useEmojiStyles; 6 | @end -------------------------------------------------------------------------------- /EmojiUIKit/UIKBRenderFactoryEmoji_iPhone.h: -------------------------------------------------------------------------------- 1 | #import "UIKBRenderFactory_Emoji.h" 2 | 3 | // iOS 7+ 4 | @interface UIKBRenderFactoryEmoji_iPhone : UIKBRenderFactory_Emoji 5 | @end 6 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKBRenderFactory_Emoji.h: -------------------------------------------------------------------------------- 1 | @class UIKBRenderGeometry; 2 | #import 3 | #import 4 | #import 5 | 6 | // iOS 7+ 7 | @interface UIKBRenderFactory_Emoji : UIKBRenderFactory 8 | - (UIKBRenderTraits *)_emojiCategoryControlKeyActiveTraits; 9 | - (UIKBRenderTraits *)_emojiCategoryControlKeyTraits; // iOS 7-8.3 10 | - (UIKBGradient *)_emojiSpaceKeyActiveBackgroundColorGradient; 11 | - (UIKBGradient *)_emojiSpaceKeyBackgroundColorGradient; 12 | - (UIKBGradient *)_emojiInputViewKeyBackgroundColorGradient; 13 | - (NSString *)_emojiBorderColor; // iOS 7-8.3 14 | @end 15 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKBRenderFactoryiPhone_Emoji.h: -------------------------------------------------------------------------------- 1 | #import "UIKBRenderFactory_Emoji.h" 2 | 3 | // iOS 7+ 4 | @interface UIKBRenderFactoryiPhone_Emoji : UIKBRenderFactory_Emoji 5 | @end 6 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmoji+EmojiHUD.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmoji.h" 2 | 3 | @interface UIKeyboardEmoji (EmojiHUD) 4 | @property (assign) BOOL supportsSkin; 5 | @end 6 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmoji.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface UIKeyboardEmoji : NSObject 5 | @property (nonatomic, strong, readwrite) NSString *emojiString; 6 | @property (assign) BOOL hasDingbat; // iOS 7-8.2 7 | @property (retain, nonatomic) NSString *name; // iOS 5.0 8 | @property (retain, nonatomic) NSString *imageName; // iOS 5.0 9 | @property (retain, nonatomic) NSString *publicCodePoint; // iOS 5.0 10 | @property (retain, nonatomic) NSString *privateCodePoint; // iOS 5.0 11 | @property (assign) unsigned short unicodeCharacter; // iOS 5.0 12 | @property (retain) NSString *codePoint; // iOS 5.0 13 | @property (assign) CGGlyph glyph; // iOS 6 14 | @property (atomic, assign, readwrite) NSUInteger variantMask; // iOS 8.3+ 15 | + (BOOL)shouldHighlightEmoji:(NSString *)emojiString; // iOS 14.5+ 16 | + (instancetype)emojiWithString:(NSString *)string; // iOS 6 17 | + (instancetype)emojiWithString:(NSString *)string hasDingbat:(BOOL)dingbat; // iOS 7-8.2 18 | + (instancetype)emojiWithString:(NSString *)string withVariantMask:(NSInteger)mask; // iOS 8.3+ 19 | - (instancetype)initWithString:(NSString *)string; // iOS 6 20 | - (instancetype)initWithString:(NSString *)string hasDingbat:(BOOL)dingbat; // iOS 7-8.2 21 | - (instancetype)initWithString:(NSString *)string withVariantMask:(NSInteger)mask; // iOS 8.3+ 22 | - (instancetype)initWithName:(id)name imageName:(id)imageName codePoint:(unsigned short)codePoint; // iOS 5.0 23 | - (BOOL)isEqual:(UIKeyboardEmoji *)emoji; 24 | - (NSString *)key; // -emojiString 25 | - (id)image; // iOS 5.0 26 | @end 27 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiCategoriesControl.h: -------------------------------------------------------------------------------- 1 | // iOS 5 2 | @interface UIKeyboardEmojiCategoriesControl : UIView 3 | @property (assign) int selectedIndex; 4 | @end 5 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiCategoriesControl_iPad.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmojiCategoriesControl.h" 2 | 3 | // iOS 5 4 | @interface UIKeyboardEmojiCategoriesControl_iPad : UIKeyboardEmojiCategoriesControl 5 | - (void)releaseImagesAndViews; 6 | - (void)updateSegmentAndDividers:(NSInteger)arg1; 7 | @end 8 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiCategoriesControl_iPhone.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmojiCategoriesControl.h" 2 | 3 | // iOS 5 4 | @interface UIKeyboardEmojiCategoriesControl_iPhone : UIKeyboardEmojiCategoriesControl 5 | - (void)releaseImagesAndViews; 6 | - (void)updateSegmentAndDividers:(NSInteger)arg1; 7 | @end 8 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiCategory+EmojiLocalization.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmojiCategory.h" 2 | 3 | @interface UIKeyboardEmojiCategory (EmojiLocalization) 4 | + (NSArray *)displayNames; 5 | + (NSArray *)categoriesMap; 6 | @end 7 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiCategory.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmoji.h" 2 | #import "../PSEmojiCategory.h" 3 | 4 | @interface UIKeyboardEmojiCategory : NSObject 5 | @property (assign) PSEmojiCategory categoryType; // iOS 6+ 6 | @property (assign) NSInteger lastViewedPage; 7 | @property (readonly) NSString *displaySymbol; // iOS 6+ 8 | @property (readonly) NSString *displayName; // iOS 7 9 | @property (retain) NSMutableArray *emoji; 10 | @property (assign) NSUInteger lastVisibleFirstEmojiIndex; 11 | @property (readonly) NSString *name; 12 | @property (readonly) NSString *recentDescription; // iOS 7+ 13 | + (instancetype)categoryForType:(PSEmojiCategory)categoryType; // iOS 6+ 14 | + (NSMutableArray *)categories; 15 | + (NSMutableArray *)emojiRecentsFromPreferences; 16 | + (NSArray *)enabledCategoryIndexes; // iOS 9.1+ 17 | + (NSUInteger)hasVariantsForEmoji:(NSString *)emoji; // iOS 7+ 18 | + (NSUInteger)categoryIndexForCategoryType:(PSEmojiCategory)categoryType; // iOS 9.1+ 19 | + (PSEmojiCategory)categoryTypeForCategoryIndex:(NSUInteger)index; // iOS 9.1+ 20 | + (NSInteger)numberOfCategories; // iOS 6+ 21 | + (NSString *)localizedStringForKey:(NSString *)key; // iOS 6+ 22 | + (NSString *)displayName:(NSInteger)categoryType; // iOS 8.3+ 23 | + (BOOL)emojiString:(NSString *)string inGroup:(UTF32Char *)group withGroupCount:(NSUInteger)count; // iOS 6-9 24 | + (BOOL)emojiString:(NSString *)string inGroup:(NSArray *)group; // iOS 10+ 25 | - (void)releaseCategories; 26 | 27 | // iOS < 10.2 28 | + (NSArray *)PeopleEmoji; 29 | + (NSArray *)NatureEmoji; 30 | + (NSArray *)FoodAndDrinkEmoji; 31 | + (NSArray *)CelebrationEmoji; 32 | + (NSArray *)ActivityEmoji; 33 | + (NSArray *)TravelAndPlacesEmoji; 34 | + (NSArray *)ObjectsAndSymbolsEmoji; 35 | + (NSArray *)ObjectsEmoji; 36 | + (NSArray *)SymbolsEmoji; 37 | + (NSArray *)flagEmojiCountryCodesCommon; 38 | + (NSArray *)flagEmojiCountryCodesReadyToUse; // blacklist check 39 | + (NSArray *)computeEmojiFlagsSortedByLanguage; // call -flagEmojiCountryCodesReadyToUse 40 | 41 | + (NSArray *)DingbatVariantsEmoji; 42 | + (NSArray *)SkinToneEmoji; 43 | + (NSArray *)GenderEmoji; 44 | + (NSArray *)NoneVariantEmoji; 45 | + (NSArray *)PrepopulatedEmoji; 46 | 47 | + (NSArray *)loadPrecomputedEmojiFlagCategory; // empty on iOS 10.2+ 48 | 49 | // iOS 10.2+ 50 | + (NSArray *)ProfessionEmoji; 51 | + (NSString *)professionSkinToneEmojiBaseKey:(NSString *)emoji; 52 | @end 53 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiCategoryBar.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmojiKeyView.h" 2 | 3 | @interface UIKeyboardEmojiCategoryBar : UIKeyboardEmojiKeyView { // UIKBKeyView for < 10 4 | NSArray *_dividerViews; // iOS < 8.3 5 | NSArray *_segmentViews; // iOS < 8.3 6 | NSInteger _total; // iOS < 8.3 7 | NSInteger _dividerTotal; // iOS < 8.3 8 | NSInteger _selected; 9 | } 10 | - (void)releaseImagesAndViews; // iOS < 8.3 11 | - (void)updateSegmentAndDividers:(NSInteger)arg1; // iOS < 8.3 12 | @end 13 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiCategoryBar_iPad.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmojiCategoryBar.h" 2 | 3 | @interface UIKeyboardEmojiCategoryBar_iPad : UIKeyboardEmojiCategoryBar { 4 | NSArray *_unselectedImages; // iOS < 8.3 5 | NSArray *_selectedImages; // iOS < 8.3 6 | } 7 | - (void)updateSegmentImages; // iOS < 8.3 8 | @end 9 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiCategoryBar_iPhone.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmojiCategoryBar.h" 2 | 3 | @interface UIKeyboardEmojiCategoryBar_iPhone : UIKeyboardEmojiCategoryBar { 4 | NSArray *_unselectedImages; // iOS < 8.3 5 | NSArray *_selectedImages; // iOS < 8.3 6 | } 7 | - (void)updateSegmentImages; // iOS < 8.3 8 | @end 9 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiCategoryController.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmojiCategory.h" 2 | 3 | // iOS 5 4 | @interface UIKeyboardEmojiCategoryController : NSObject 5 | - (UIKeyboardEmojiCategory *)categoryForKey:(NSString *)categoryKey; 6 | - (void)updateRecents; 7 | @end 8 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiCategoryUpdate.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmojiKeyDisplayController.h" 2 | 3 | @protocol UIKeyboardEmojiCategoryUpdate 4 | @property (retain, nonatomic) UIKeyboardEmojiKeyDisplayController *emojiKeyManager; 5 | - (void)updateToCategory:(NSInteger)categoryType; 6 | @optional 7 | - (void)updateToCategoryWithOffsetPercentage:(CGFloat)offsetPercentage; 8 | @end 9 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiCollectionInputView.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "UIKeyboardEmojiInput.h" 3 | #import "UIKeyboardEmojiCollectionView.h" 4 | 5 | // iOS 8.3+ 6 | @interface UIKeyboardEmojiCollectionInputView : UIKBKeyView { 7 | UIKeyboardEmojiCollectionView *_collectionView; 8 | } 9 | + (BOOL)shouldHighlightEmoji:(NSString *)emojiString; // iOS 13.2 - 14.4 10 | - (NSString *)emojiBaseUnicodeString:(NSString *)string; // iOS 8.3-9.3 11 | - (NSString *)emojiBaseString:(NSString *)string; // iOS >= 10 12 | - (NSString *)emojiBaseFirstCharacterString:(NSString *)string; // iOS >= 10 13 | - (BOOL)pointInside:(CGPoint)point forEvent:(void *)event; 14 | @end 15 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiCollectionView.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmojiInputController.h" 2 | #import "UIKeyboardEmojiGraphicsTraits.h" 3 | #import "UIKeyboardEmojiCollectionViewCell.h" 4 | 5 | // iOS 8.3+ 6 | @interface UIKeyboardEmojiCollectionView : UICollectionView 7 | @property (retain, nonatomic) UIKeyboardEmojiInputController *inputController; 8 | - (UIKeyboardEmojiGraphicsTraits *)emojiGraphicsTraits; 9 | - (UIKeyboardEmojiCollectionViewCell *)closestCellForPoint:(CGPoint)point; 10 | @end 11 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiCollectionViewCell.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmoji.h" 2 | 3 | // iOS 8.3+ 4 | @interface UIKeyboardEmojiCollectionViewCell : UICollectionViewCell 5 | @property NSInteger emojiFontSize; 6 | @property (retain, nonatomic) UIKeyboardEmoji *emoji; 7 | @end 8 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiDefaultsController.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | // iOS 5-9.2 4 | @interface UIKeyboardEmojiDefaultsController : NSObject 5 | + (instancetype)sharedController; 6 | @property NSInteger currentSequenceKey; 7 | @property (retain, nonatomic) id recentsKey; 8 | @property (retain, nonatomic) id usageHistoryKey; 9 | - (NSMutableDictionary *)emptyDefaultsDictionary; 10 | - (void)readEmojiDefaults; 11 | - (void)writeEmojiDefaults; 12 | @end 13 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiFactory.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmoji.h" 2 | 3 | // iOS 5 4 | @interface UIKeyboardEmojiFactory : NSObject { 5 | NSMutableDictionary *emojiMap; 6 | } 7 | - (UIKeyboardEmoji *)emojiWithKey:(id)key; 8 | - (UIKeyboardEmoji *)emojiWithPrivateCodePoint:(id)privateCodePoint; 9 | @end 10 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiFamilyConfigurationView.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "UIKeyboardEmojiWellView.h" 4 | 5 | @interface UIKeyboardEmojiFamilyConfigurationView : UIView // iOS 13.2+ 6 | @property (assign, nonatomic) BOOL usesDarkStyle; 7 | @property (retain, nonatomic) NSMutableArray *familyMemberStackViews; 8 | @property (retain, nonatomic) NSArray *> *skinToneVariantRows; 9 | @property (retain, nonatomic) NSArray *> *variantDisplayRows; // iOS 14.5+ 10 | @property (retain, nonatomic) UIKeyboardEmojiWellView *neutralWellView; 11 | @property (retain, nonatomic) UIKeyboardEmojiWellView *configuredWellView; 12 | @property (retain, nonatomic) UIStackView *previewWellStackView; 13 | @property (retain, nonatomic) NSString *baseEmojiString; 14 | + (UIColor *)_selectionAndSeparatorColorForDarkMode:(BOOL)darkMode; 15 | - (NSMutableArray *)selectedVariantIndices; 16 | - (NSArray *)_currentlySelectedSkinToneConfiguration; 17 | - (NSUInteger)_silhouetteFromCurrentSelections; // iOS 14.5+ 18 | - (void)_updatePreviewWellForCurrentSelection; 19 | - (void)_configureFamilyMemberWellStackViews; 20 | @end -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiGraphics.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "EmojiUIKit-Structs.h" 4 | #import "UIKeyboardEmojiCategory.h" 5 | 6 | @interface UIKeyboardEmojiGraphics : NSObject 7 | + (instancetype)sharedInstance; 8 | + (CGFloat)emojiPageControlYOffset:(BOOL)portrait; // iOS 7+ 9 | + (CGSize)emojiSize:(BOOL)portrait; 10 | + (CGPoint)margin:(BOOL)portrait; 11 | + (CGPoint)padding:(BOOL)portrait; 12 | + (NSInteger)rowCount:(BOOL)portrait; 13 | + (NSInteger)colCount:(BOOL)portrait; 14 | + (BOOL)isLandscape; // iOS 5-8.2 15 | + (NSString *)emojiCategoryImagePath:(UIKeyboardEmojiCategory *)category; // iOS 8.3-10.1 16 | + (NSString *)emojiCategoryImagePath:(UIKeyboardEmojiCategory *)category forRenderConfig:(UIKBRenderConfig *)renderConfig; // iOS 10.2+ 17 | + (UIImage *)imageWithRect:(CGRect)rect name:(NSString *)name pressed:(BOOL)pressed; 18 | - (UIImage *)categoryRecentsGenerator:(id)pressed; 19 | - (UIImage *)categoryPeopleGenerator:(id)pressed; 20 | - (UIImage *)categoryNatureGenerator:(id)pressed; 21 | - (UIImage *)categoryObjectsGenerator:(id)pressed; 22 | - (UIImage *)categoryPlacesGenerator:(id)pressed; 23 | - (UIImage *)categorySymbolsGenerator:(id)pressed; 24 | - (UIImage *)categoryWithSymbol:(NSString *)symbol pressed:(id)pressed; 25 | - (UIKBTree *)protoKeyboard; 26 | - (UIKBTree *)protoKeyWithDisplayString:(NSString *)displayString; 27 | - (UIKBThemeRef)createProtoThemeForKey:(UIKBTree *)key keyboard:(UIKBTree *)keyboard state:(int)state; 28 | @end 29 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiGraphicsTraits.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface UIKeyboardEmojiGraphicsTraits : NSObject 5 | - (CGFloat)emojiKeyWidth; 6 | - (NSInteger)prepolulatedRecentCount; 7 | @end 8 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiImageView.h: -------------------------------------------------------------------------------- 1 | @interface UIKeyboardEmojiImageView : UIImageView 2 | @end 3 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiInput.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmojiCategory.h" 2 | 3 | @protocol UIKeyboardEmojiInput 4 | - (void)reloadForCategory:(UIKeyboardEmojiCategory *)category; 5 | @end 6 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiInputController.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmoji.h" 2 | #import "UIKeyboardEmojiInput.h" 3 | 4 | @interface UIKeyboardEmojiInputController : NSObject 5 | + (UIKBKeyView *)activeInputView; // iOS < 8.3 (UIKeyboardEmojiScrollView), iOS 8.3+ (UIKeyboardEmojiCollectionInputView) 6 | - (void)emojiUsed:(UIKeyboardEmoji *)emoji; 7 | - (double)scoreForEmoji:(UIKeyboardEmoji *)emoji; 8 | - (NSMutableArray *)recents; 9 | - (NSMutableDictionary *)skinToneBaseKeyPreferences; // iOS 8.3+ 10 | @end 11 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiKeyDisplayController.h: -------------------------------------------------------------------------------- 1 | // iOS 10+ 2 | @interface UIKeyboardEmojiKeyDisplayController : NSObject 3 | @end 4 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiKeyView.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "UIKeyboardEmojiCategoryUpdate.h" 3 | #import "UIKeyboardEmojiKeyDisplayController.h" 4 | 5 | // iOS 10+ 6 | @interface UIKeyboardEmojiKeyView : UIKBKeyView 7 | @end 8 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiPage.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | // iOS 5-8.2 4 | @interface UIKeyboardEmojiPage : UIView { 5 | NSInteger _numCols; 6 | NSInteger _numRows; 7 | NSInteger _numPages; 8 | } 9 | @property (retain, nonatomic) NSDictionary *emojiAttributes; 10 | @property (retain, nonatomic) NSArray *emoji; 11 | - (CGRect)rectForRow:(NSInteger)row Col:(NSInteger)col; 12 | - (id)activeTouch; 13 | - (void)touchCancelled:(id)touch; 14 | @end 15 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiPreferences.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmojiCategory.h" 2 | 3 | // iOS 9.3+ 4 | @interface UIKeyboardEmojiPreferences : NSObject 5 | + (instancetype)sharedInstance; 6 | - (NSMutableDictionary *)emptyDefaultsDictionary; 7 | - (void)readEmojiDefaults; 8 | - (void)writeEmojiDefaults; 9 | - (NSInteger)selectedCategoryType; 10 | - (NSUInteger)emojiCategoryDefaultsIndex:(UIKeyboardEmojiCategory *)category; 11 | - (void)refreshLocalRecents; 12 | @end 13 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiPressIndicationDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @protocol UIKeyboardEmojiPressIndicationDelegate 4 | @optional 5 | - (void)installPressIndicatorAtPoint:(CGPoint)point; 6 | - (void)removePressIndicator; 7 | @end 8 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiRecentsController.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmoji.h" 2 | 3 | // iOS 5 4 | @interface UIKeyboardEmojiRecentsController : NSObject 5 | - (void)emojiUsed:(UIKeyboardEmoji *)emoji; 6 | @end 7 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiScrollView.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "UIKeyboardEmojiCategory.h" 4 | #import "UIKeyboardEmojiInput.h" 5 | #import "UIKeyboardEmojiPressIndicationDelegate.h" 6 | 7 | @interface UIKeyboardEmojiScrollView : UIKBKeyView 8 | @property (retain, nonatomic) UIKBRenderConfig *renderConfig; 9 | - (NSInteger)currentPage; 10 | - (void)doLayout; 11 | - (void)forceLayout; 12 | - (void)layoutPages; 13 | - (void)layoutRecents; 14 | - (void)setCategory:(UIKeyboardEmojiCategory *)category; // iOS 5 15 | @end 16 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiScrubBarView.h: -------------------------------------------------------------------------------- 1 | // iOS 8.3+ 2 | @interface UIKeyboardEmojiScrubBarView : UIView 3 | @end 4 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiSplit.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface UIKeyboardEmojiSplit : UIKBKeyView 4 | @end 5 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiSplitCategoryPicker.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmojiSplit.h" 2 | 3 | @interface UIKeyboardEmojiSplitCategoryPicker : UIKeyboardEmojiSplit 4 | @end 5 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiView.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmoji.h" 2 | #import "UIKeyboardEmojiImageView.h" 3 | #import "UIKeyboardEmojiPressIndicationDelegate.h" 4 | #import 5 | 6 | @interface UIKeyboardEmojiView : UIView 7 | @property (retain) UIKeyboardEmoji *emoji; 8 | @property (nonatomic, retain) UIKBRenderConfig *renderConfig; 9 | @property (retain) UIView *delegate; 10 | @property (retain) UIView *popup; 11 | @property (retain) UIKeyboardEmojiImageView *imageView; 12 | + (instancetype)emojiViewForEmoji:(UIKeyboardEmoji *)emoji withFrame:(CGRect)frame; 13 | + (void)recycleEmojiView:(UIKeyboardEmojiImageView *)emojiView; 14 | - (void)uninstallPopup; 15 | - (id)createAndInstallKeyPopupView; 16 | - (void)setEmoji:(UIKeyboardEmoji *)emoji withFrame:(CGRect)frame; 17 | - (instancetype)initWithFrame:(CGRect)frame emoji:(UIKeyboardEmoji *)emoji; 18 | @end 19 | -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardEmojiWellView.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface UIKeyboardEmojiWellView : UIView // iOS 13.2+ 5 | @property (retain, nonatomic) UIView *wellContentView; 6 | @property (retain, nonatomic) UIFont *labelFont; 7 | @property (retain, nonatomic) NSString *stringRepresentation; 8 | @property (retain, nonatomic) UIColor *selectionBackgroundColor; 9 | @property (retain, nonatomic) NSIndexPath *associatedIndexPath; 10 | - (UIFont *)fontUsingSilhouette:(NSUInteger)silhouette size:(CGFloat)size; // iOS 14.5+ 11 | - (void)setStringRepresentation:(NSString *)representation silhouette:(NSUInteger)silhouette; // iOS 14.5+ 12 | @end -------------------------------------------------------------------------------- /EmojiUIKit/UIKeyboardLayoutEmoji.h: -------------------------------------------------------------------------------- 1 | #import "UIKeyboardEmoji.h" 2 | 3 | // iOS 5 4 | @interface UIKeyboardLayoutEmoji : NSObject 5 | + (instancetype)emojiLayout; 6 | + (NSString *)localizedStringForKey:(NSString *)key; 7 | + (BOOL)isLandscape; 8 | - (NSMutableArray *)recents; 9 | - (UIKeyboardEmoji *)emojiWithString:(NSString *)emojiString; 10 | - (void)emojiSelected:(UIKeyboardEmoji *)emoji; 11 | - (void)emojiUsed:(UIKeyboardEmoji *)emoji; 12 | - (CGRect)categoryFrame; 13 | @end 14 | -------------------------------------------------------------------------------- /EmojiUIKit/UIPeripheralHost+iOS83UIModern.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface UIPeripheralHost (iOS83UIModern) 4 | - (void)_updateRenderConfigForCurrentResponder; 5 | @end -------------------------------------------------------------------------------- /EmojiUIKit/_UIBackdropViewSettingsLightEmojiKeyboard.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | // iOS 8.3+ 4 | @interface _UIBackdropViewSettingsLightEmojiKeyboard : _UIBackdropViewSettingsLightKeyboard 5 | @end -------------------------------------------------------------------------------- /EmojiUIKit/_UIEmojiPageControl.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | // iOS 7-8.2 4 | @interface _UIEmojiPageControl : UIPageControl 5 | @end 6 | -------------------------------------------------------------------------------- /Header.h: -------------------------------------------------------------------------------- 1 | #import "EmojiFoundation/EmojiFoundation.h" 2 | #if TARGET_OS_IOS 3 | #import "EmojiUIKit/EmojiUIKit.h" 4 | #endif 5 | 6 | #define containsString(str, substr) ([str rangeOfString:substr options:NSLiteralSearch].location != NSNotFound) 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 - 2025 PoomSmart 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(SIMULATOR),1) 2 | TARGET = simulator:clang:latest:8.0 3 | ARCHS = arm64 x86_64 i386 4 | else 5 | ifeq ($(THEOS_PACKAGE_SCHEME),rootless) 6 | TARGET = iphone:clang:latest:15.0 7 | else ifeq ($(THEOS_PACKAGE_SCHEME),roothide) 8 | TARGET = iphone:clang:latest:15.0 9 | else 10 | TARGET = iphone:clang:14.5:5.0 11 | export PREFIX = $(THEOS)/toolchain/Xcode11.xctoolchain/usr/bin/ 12 | endif 13 | endif 14 | 15 | include $(THEOS)/makefiles/common.mk 16 | 17 | LIBRARY_NAME = libEmojiLibrary 18 | $(LIBRARY_NAME)_FILES = PSEmojiUtilities.m PSEmojiUtilities+Emoji.m PSEmojiUtilities+Functions.m 19 | $(LIBRARY_NAME)_CFLAGS = -fobjc-arc 20 | 21 | include $(THEOS_MAKE_PATH)/library.mk 22 | # make setup SIMULATOR=1 PL_SIMULATOR_VERSION= 23 | ifeq ($(SIMULATOR),1) 24 | include ../../Simulator/preferenceloader-sim/locatesim.mk 25 | setup:: clean all 26 | @sudo rm -f $(PL_SIMULATOR_ROOT)/usr/lib/$(LIBRARY_NAME).dylib 27 | @sudo cp -v $(THEOS_OBJ_DIR)/$(LIBRARY_NAME).dylib $(PL_SIMULATOR_ROOT)/usr/lib/ 28 | endif 29 | -------------------------------------------------------------------------------- /NSString+MacExtras.m: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @implementation NSString (MacExtras) 4 | 5 | + (NSString *)stringWithUnichar:(unsigned int)value { 6 | unsigned short buffer[2]; 7 | NSUInteger length = 0; 8 | if (value - 0x10000 > 0xFFFFF) { 9 | buffer[0] = value; 10 | length = 1; 11 | } else { 12 | buffer[0] = (value >> 10) - 0x2840; 13 | buffer[1] = (value & 0x3FF) | 0xDC00; 14 | length = 2; 15 | } 16 | return [NSString stringWithCharacters:buffer length:length]; 17 | } 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /PSEmojiCategory.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /* 4 | iOS 5 - 8.2 5 | 6 | PSEmojiCategoryRecent = 0, 7 | PSEmojiCategoryPeople = 1, 8 | PSEmojiCategoryNature = 2, 9 | PSEmojiCategoryObjects = 3, 10 | PSEmojiCategoryPlaces = 4, 11 | PSEmojiCategorySymbols = 5 12 | 13 | */ 14 | 15 | /* 16 | iOS 8.3 - 8.4 17 | 18 | PSEmojiCategoryRecent = 0, 19 | PSEmojiCategoryPeople = 1, 20 | PSEmojiCategoryNature = 2, 21 | PSEmojiCategoryFoodAndDrink = 3, 22 | PSEmojiCategoryCelebration = 4, 23 | PSEmojiCategoryActivity = 5, 24 | PSEmojiCategoryTravelAndPlaces = 6, 25 | PSEmojiCategoryObjectsAndSymbols = 7, 26 | PSEmojiCategoryPrepopulated = 8 27 | 28 | */ 29 | 30 | /* 31 | iOS 9.0 32 | 33 | PSEmojiCategoryRecent = 0, 34 | PSEmojiCategoryPeople = 1, 35 | PSEmojiCategoryNature = 2, 36 | PSEmojiCategoryFoodAndDrink = 3, 37 | PSEmojiCategoryCelebration = 4, 38 | PSEmojiCategoryActivity = 5, 39 | PSEmojiCategoryTravelAndPlaces = 6, 40 | PSEmojiCategoryFlags = 7, 41 | PSEmojiCategoryObjectsAndSymbols = 8, 42 | PSEmojiCategoryPrepopulated = 9 43 | */ 44 | 45 | // Compatibility 46 | typedef NS_ENUM(NSInteger, IDXPSEmojiCategory) { 47 | IDXPSEmojiCategoryRecent = 0, 48 | IDXPSEmojiCategoryPeople = 1, 49 | IDXPSEmojiCategoryNature = 2, 50 | IDXPSEmojiCategoryFoodAndDrink = 3, 51 | IDXPSEmojiCategoryActivity = 4, 52 | IDXPSEmojiCategoryTravelAndPlaces = 5, 53 | IDXPSEmojiCategoryObjects = 6, 54 | IDXPSEmojiCategorySymbols = 7, 55 | IDXPSEmojiCategoryFlags = 8, 56 | IDXPSEmojiCategoryPrepopulated = 9 57 | }; 58 | 59 | // iOS 9.1+ 60 | typedef NS_ENUM(NSInteger, PSEmojiCategory) { 61 | PSEmojiCategoryRecent = 0, 62 | PSEmojiCategoryPeople = 1, 63 | PSEmojiCategoryNature = 2, 64 | PSEmojiCategoryFoodAndDrink = 3, 65 | PSEmojiCategoryCelebration = 4, 66 | PSEmojiCategoryActivity = 5, 67 | PSEmojiCategoryTravelAndPlaces = 6, 68 | PSEmojiCategoryFlags = 7, 69 | PSEmojiCategoryObjectsAndSymbols = 8, 70 | PSEmojiCategoryPrepopulated = 9, 71 | PSEmojiCategoryObjects = 10, 72 | PSEmojiCategorySymbols = 11 73 | }; 74 | 75 | // iOS 9.1+ default category order: 0, 1, 2, 3, 5, 6, 10, 11, 7 76 | -------------------------------------------------------------------------------- /PSEmojiType.h: -------------------------------------------------------------------------------- 1 | /* PSEmojiType: Emoji variants 2 | XXXX: 4 binary digits of (Profession)-(Gender)-(Skin)-(Dingbat) 3 | */ 4 | 5 | #import 6 | 7 | typedef NS_ENUM(NSUInteger, PSEmojiType) { 8 | PSEmojiTypeProfession = 1 << 3, // 10.2+ 9 | PSEmojiTypeGender = 1 << 2, // 10.0+ 10 | PSEmojiTypeSkin = 1 << 1, 11 | PSEmojiTypeDingbat = 1, 12 | PSEmojiTypeRegular = 0 13 | }; 14 | 15 | typedef NS_ENUM(NSInteger, PSEmojiMultiSkinType) { 16 | PSEmojiMultiSkinTypeFM = 1, 17 | PSEmojiMultiSkinTypeFF = 2, 18 | PSEmojiMultiSkinTypeMM = 3, 19 | PSEmojiMultiSkinTypeNN = 4, 20 | PSEmojiMultiSkinTypeHandshake = 5 21 | }; 22 | -------------------------------------------------------------------------------- /PSEmojiUtilities+Emoji.m: -------------------------------------------------------------------------------- 1 | // EmojiCategory > -readEmojis:YES withVariant:NO pretty:YES 2 | // The list of emojis per iOS-oriented category 3 | #import "PSEmojiUtilities.h" 4 | #import 5 | 6 | @implementation PSEmojiUtilities (Emoji) 7 | 8 | + (NSArray *)AsFakeSet:(NSArray *)array { 9 | if (IS_IOS_OR_NEWER(iOS_14_0)) 10 | return (NSArray *)[NSOrderedSet orderedSetWithArray:array]; 11 | return array; 12 | } 13 | 14 | + (NSArray *)PeopleEmoji { 15 | static dispatch_once_t onceToken; 16 | static NSArray *data; 17 | dispatch_once(&onceToken, ^{ 18 | data = [self AsFakeSet:@[ 19 | @"😀", @"😃", @"😄", @"😁", @"😆", @"🥹", @"😅", @"😂", @"🤣", @"🥲", 20 | @"☺️", @"😊", @"😇", @"🙂", @"🙃", @"😉", @"😌", @"😍", @"🥰", @"😘", 21 | @"😗", @"😙", @"😚", @"😋", @"😛", @"😝", @"😜", @"🤪", @"🤨", @"🧐", 22 | @"🤓", @"😎", @"🥸", @"🤩", @"🥳", @"🙂‍↕️", @"😏", @"😒", @"🙂‍↔️", @"😞", 23 | @"😔", @"😟", @"😕", @"🙁", @"☹️", @"😣", @"😖", @"😫", @"😩", @"🥺", 24 | @"😢", @"😭", @"😤", @"😠", @"😡", @"🤬", @"🤯", @"😳", @"🥵", @"🥶", 25 | @"😶‍🌫️", @"😱", @"😨", @"😰", @"😥", @"😓", @"🤗", @"🤔", @"🫣", @"🤭", 26 | @"🫢", @"🫡", @"🤫", @"🫠", @"🤥", @"😶", @"🫥", @"😐", @"🫤", @"😑", 27 | @"🫨", @"😬", @"🙄", @"😯", @"😦", @"😧", @"😮", @"😲", @"🥱", @"🫩", 28 | @"😴", @"🤤", @"😪", @"😮‍💨", @"😵", @"😵‍💫", @"🤐", @"🥴", @"🤢", @"🤮", 29 | @"🤧", @"😷", @"🤒", @"🤕", @"🤑", @"🤠", @"😈", @"👿", @"👹", @"👺", 30 | @"🤡", @"💩", @"👻", @"💀", @"☠️", @"👽", @"👾", @"🤖", @"🎃", @"😺", 31 | @"😸", @"😹", @"😻", @"😼", @"😽", @"🙀", @"😿", @"😾", @"🫶", @"🤲", 32 | @"👐", @"🙌", @"👏", @"🤝", @"👍", @"👎", @"👊", @"✊", @"🤛", @"🤜", 33 | @"🫷", @"🫸", @"🤞", @"✌️", @"🫰", @"🤟", @"🤘", @"👌", @"🤌", @"🤏", 34 | @"🫳", @"🫴", @"👈", @"👉", @"👆", @"👇", @"☝️", @"✋", @"🤚", @"🖐️", 35 | @"🖖", @"👋", @"🤙", @"🫲", @"🫱", @"💪", @"🦾", @"🖕", @"✍️", @"🙏", 36 | @"🫵", @"🦶", @"🦵", @"🦿", @"💄", @"💋", @"👄", @"🫦", @"🦷", @"👅", 37 | @"👂", @"🦻", @"👃", @"🫆", @"👣", @"👁️", @"👀", @"🫀", @"🫁", @"🧠", 38 | @"🗣️", @"👤", @"👥", @"🫂", @"👶", @"👧", @"🧒", @"👦", @"👩", @"🧑", 39 | @"👨", @"👩‍🦱", @"🧑‍🦱", @"👨‍🦱", @"👩‍🦰", @"🧑‍🦰", @"👨‍🦰", @"👱‍♀️", @"👱", @"👱‍♂️", 40 | @"👩‍🦳", @"🧑‍🦳", @"👨‍🦳", @"👩‍🦲", @"🧑‍🦲", @"👨‍🦲", @"🧔‍♀️", @"🧔", @"🧔‍♂️", @"👵", 41 | @"🧓", @"👴", @"👲", @"👳‍♀️", @"👳", @"👳‍♂️", @"🧕", @"👮‍♀️", @"👮", @"👮‍♂️", 42 | @"👷‍♀️", @"👷", @"👷‍♂️", @"💂‍♀️", @"💂", @"💂‍♂️", @"🕵️‍♀️", @"🕵️", @"🕵️‍♂️", @"👩‍⚕️", 43 | @"🧑‍⚕️", @"👨‍⚕️", @"👩‍🌾", @"🧑‍🌾", @"👨‍🌾", @"👩‍🍳", @"🧑‍🍳", @"👨‍🍳", @"👩‍🎓", @"🧑‍🎓", 44 | @"👨‍🎓", @"👩‍🎤", @"🧑‍🎤", @"👨‍🎤", @"👩‍🏫", @"🧑‍🏫", @"👨‍🏫", @"👩‍🏭", @"🧑‍🏭", @"👨‍🏭", 45 | @"👩‍💻", @"🧑‍💻", @"👨‍💻", @"👩‍💼", @"🧑‍💼", @"👨‍💼", @"👩‍🔧", @"🧑‍🔧", @"👨‍🔧", @"👩‍🔬", 46 | @"🧑‍🔬", @"👨‍🔬", @"👩‍🎨", @"🧑‍🎨", @"👨‍🎨", @"👩‍🚒", @"🧑‍🚒", @"👨‍🚒", @"👩‍✈️", @"🧑‍✈️", 47 | @"👨‍✈️", @"👩‍🚀", @"🧑‍🚀", @"👨‍🚀", @"👩‍⚖️", @"🧑‍⚖️", @"👨‍⚖️", @"👰‍♀️", @"👰", @"👰‍♂️", 48 | @"🤵‍♀️", @"🤵", @"🤵‍♂️", @"👸", @"🫅", @"🤴", @"🥷", @"🦸‍♀️", @"🦸", @"🦸‍♂️", 49 | @"🦹‍♀️", @"🦹", @"🦹‍♂️", @"🤶", @"🧑‍🎄", @"🎅", @"🧙‍♀️", @"🧙", @"🧙‍♂️", @"🧝‍♀️", 50 | @"🧝", @"🧝‍♂️", @"🧌", @"🧛‍♀️", @"🧛", @"🧛‍♂️", @"🧟‍♀️", @"🧟", @"🧟‍♂️", @"🧞‍♀️", 51 | @"🧞", @"🧞‍♂️", @"🧜‍♀️", @"🧜", @"🧜‍♂️", @"🧚‍♀️", @"🧚", @"🧚‍♂️", @"👼", @"🤰", 52 | @"🫄", @"🫃", @"🤱", @"👩‍🍼", @"🧑‍🍼", @"👨‍🍼", @"🙇‍♀️", @"🙇", @"🙇‍♂️", @"💁‍♀️", 53 | @"💁", @"💁‍♂️", @"🙅‍♀️", @"🙅", @"🙅‍♂️", @"🙆‍♀️", @"🙆", @"🙆‍♂️", @"🙋‍♀️", @"🙋", 54 | @"🙋‍♂️", @"🧏‍♀️", @"🧏", @"🧏‍♂️", @"🤦‍♀️", @"🤦", @"🤦‍♂️", @"🤷‍♀️", @"🤷", @"🤷‍♂️", 55 | @"🙎‍♀️", @"🙎", @"🙎‍♂️", @"🙍‍♀️", @"🙍", @"🙍‍♂️", @"💇‍♀️", @"💇", @"💇‍♂️", @"💆‍♀️", 56 | @"💆", @"💆‍♂️", @"🧖‍♀️", @"🧖", @"🧖‍♂️", @"💅", @"🤳", @"💃", @"🕺", @"👯‍♀️", 57 | @"👯", @"👯‍♂️", @"🕴️", @"👩‍🦽", @"🧑‍🦽", @"👨‍🦽", @"👩‍🦽‍➡️", @"🧑‍🦽‍➡️", @"👨‍🦽‍➡️", @"👩‍🦼", 58 | @"🧑‍🦼", @"👨‍🦼", @"👩‍🦼‍➡️", @"🧑‍🦼‍➡️", @"👨‍🦼‍➡️", @"🚶‍♀️", @"🚶", @"🚶‍♂️", @"🚶‍♀️‍➡️", @"🚶‍➡️", 59 | @"🚶‍♂️‍➡️", @"👩‍🦯", @"🧑‍🦯", @"👨‍🦯", @"👩‍🦯‍➡️", @"🧑‍🦯‍➡️", @"👨‍🦯‍➡️", @"🧎‍♀️", @"🧎", @"🧎‍♂️", 60 | @"🏃‍♀️", @"🏃", @"🏃‍♂️", @"🏃‍♀️‍➡️", @"🏃‍➡️", @"🏃‍♂️‍➡️", @"🧎‍♀️‍➡️", @"🧎‍➡️", @"🧎‍♂️‍➡️", @"🧍‍♀️", 61 | @"🧍", @"🧍‍♂️", @"👫", @"👭", @"👬", @"👩‍❤️‍👨", @"👩‍❤️‍👩", @"💑", @"👨‍❤️‍👨", @"👩‍❤️‍💋‍👨", 62 | @"👩‍❤️‍💋‍👩", @"💏", @"👨‍❤️‍💋‍👨", @"🪢", @"🧶", @"🧵", @"🪡", @"🧥", @"🥼", @"🦺", 63 | @"👚", @"👕", @"👖", @"🩲", @"🩳", @"👔", @"👗", @"👙", @"🩱", @"👘", 64 | @"🥻", @"🩴", @"🥿", @"👠", @"👡", @"👢", @"👞", @"👟", @"🥾", @"🧦", 65 | @"🧤", @"🧣", @"🎩", @"🧢", @"👒", @"🎓", @"⛑️", @"🪖", @"👑", @"💍", 66 | @"👝", @"👛", @"👜", @"💼", @"🎒", @"🧳", @"👓", @"🕶️", @"🥽", @"🌂", 67 | ]]; 68 | }); 69 | return data; 70 | } 71 | 72 | + (NSArray *)NatureEmoji { 73 | static dispatch_once_t onceToken; 74 | static NSArray *data; 75 | dispatch_once(&onceToken, ^{ 76 | data = [self AsFakeSet:@[ 77 | @"🐶", @"🐱", @"🐭", @"🐹", @"🐰", @"🦊", @"🐻", @"🐼", @"🐻‍❄️", @"🐨", 78 | @"🐯", @"🦁", @"🐮", @"🐷", @"🐽", @"🐸", @"🐵", @"🙈", @"🙉", @"🙊", 79 | @"🐒", @"🐔", @"🐧", @"🐦", @"🐤", @"🐣", @"🐥", @"🪿", @"🦆", @"🐦‍⬛", 80 | @"🦅", @"🦉", @"🦇", @"🐺", @"🐗", @"🐴", @"🦄", @"🫎", @"🐝", @"🪱", 81 | @"🐛", @"🦋", @"🐌", @"🐞", @"🐜", @"🪰", @"🪲", @"🪳", @"🦟", @"🦗", 82 | @"🕷️", @"🕸️", @"🦂", @"🐢", @"🐍", @"🦎", @"🦖", @"🦕", @"🐙", @"🦑", 83 | @"🪼", @"🦐", @"🦞", @"🦀", @"🐡", @"🐠", @"🐟", @"🐬", @"🐳", @"🐋", 84 | @"🦈", @"🦭", @"🐊", @"🐅", @"🐆", @"🦓", @"🦍", @"🦧", @"🦣", @"🐘", 85 | @"🦛", @"🦏", @"🐪", @"🐫", @"🦒", @"🦘", @"🦬", @"🐃", @"🐂", @"🐄", 86 | @"🫏", @"🐎", @"🐖", @"🐏", @"🐑", @"🦙", @"🐐", @"🦌", @"🐕", @"🐩", 87 | @"🦮", @"🐕‍🦺", @"🐈", @"🐈‍⬛", @"🪶", @"🪽", @"🐓", @"🦃", @"🦤", @"🦚", 88 | @"🦜", @"🦢", @"🦩", @"🕊️", @"🐇", @"🦝", @"🦨", @"🦡", @"🦫", @"🦦", 89 | @"🦥", @"🐁", @"🐀", @"🐿️", @"🦔", @"🐾", @"🐉", @"🐲", @"🐦‍🔥", @"🌵", 90 | @"🎄", @"🌲", @"🌳", @"🌴", @"🪾", @"🪵", @"🌱", @"🌿", @"☘️", @"🍀", 91 | @"🎍", @"🪴", @"🎋", @"🍃", @"🍂", @"🍁", @"🪺", @"🪹", @"🍄", @"🍄‍🟫", 92 | @"🐚", @"🪸", @"🪨", @"🌾", @"💐", @"🌷", @"🌹", @"🥀", @"🪻", @"🪷", 93 | @"🌺", @"🌸", @"🌼", @"🌻", @"🌞", @"🌝", @"🌛", @"🌜", @"🌚", @"🌕", 94 | @"🌖", @"🌗", @"🌘", @"🌑", @"🌒", @"🌓", @"🌔", @"🌙", @"🌎", @"🌍", 95 | @"🌏", @"🪐", @"💫", @"⭐️", @"🌟", @"✨", @"⚡️", @"☄️", @"💥", @"🔥", 96 | @"🌪️", @"🌈", @"☀️", @"🌤️", @"⛅️", @"🌥️", @"☁️", @"🌦️", @"🌧️", @"⛈️", 97 | @"🌩️", @"🌨️", @"❄️", @"☃️", @"⛄️", @"🌬️", @"💨", @"💧", @"💦", @"🫧", 98 | @"☔️", @"☂️", @"🌊", @"🌫️", 99 | ]]; 100 | }); 101 | return data; 102 | } 103 | 104 | + (NSArray *)FoodAndDrinkEmoji { 105 | static dispatch_once_t onceToken; 106 | static NSArray *data; 107 | dispatch_once(&onceToken, ^{ 108 | data = [self AsFakeSet:@[ 109 | @"🍏", @"🍎", @"🍐", @"🍊", @"🍋", @"🍋‍🟩", @"🍌", @"🍉", @"🍇", @"🍓", 110 | @"🫐", @"🍈", @"🍒", @"🍑", @"🥭", @"🍍", @"🥥", @"🥝", @"🍅", @"🍆", 111 | @"🥑", @"🫛", @"🥦", @"🥬", @"🥒", @"🌶️", @"🫑", @"🌽", @"🥕", @"🫒", 112 | @"🧄", @"🧅", @"🥔", @"🫜", @"🍠", @"🫚", @"🥐", @"🥯", @"🍞", @"🥖", 113 | @"🥨", @"🧀", @"🥚", @"🍳", @"🧈", @"🥞", @"🧇", @"🥓", @"🥩", @"🍗", 114 | @"🍖", @"🦴", @"🌭", @"🍔", @"🍟", @"🍕", @"🫓", @"🥪", @"🥙", @"🧆", 115 | @"🌮", @"🌯", @"🫔", @"🥗", @"🥘", @"🫕", @"🥫", @"🫙", @"🍝", @"🍜", 116 | @"🍲", @"🍛", @"🍣", @"🍱", @"🥟", @"🦪", @"🍤", @"🍙", @"🍚", @"🍘", 117 | @"🍥", @"🥠", @"🥮", @"🍢", @"🍡", @"🍧", @"🍨", @"🍦", @"🥧", @"🧁", 118 | @"🍰", @"🎂", @"🍮", @"🍭", @"🍬", @"🍫", @"🍿", @"🍩", @"🍪", @"🌰", 119 | @"🥜", @"🫘", @"🍯", @"🥛", @"🫗", @"🍼", @"🫖", @"☕️", @"🍵", @"🧃", 120 | @"🥤", @"🧋", @"🍶", @"🍺", @"🍻", @"🥂", @"🍷", @"🥃", @"🍸", @"🍹", 121 | @"🧉", @"🍾", @"🧊", @"🥄", @"🍴", @"🍽️", @"🥣", @"🥡", @"🥢", @"🧂", 122 | ]]; 123 | }); 124 | return data; 125 | } 126 | 127 | + (NSArray *)CelebrationEmoji { 128 | static dispatch_once_t onceToken; 129 | static NSArray *data; 130 | dispatch_once(&onceToken, ^{ 131 | data = [self AsFakeSet:@[ 132 | @"🎀", @"🎁", @"🎂", @"🎃", @"🎄", @"🎋", @"🎍", @"🎑", @"🎆", @"🎇", 133 | @"🎉", @"🎊", @"🎈", @"💫", @"✨", @"💥", @"🎓", @"👑", @"🎎", @"🎏", 134 | @"🎐", @"🎌", @"🏮", @"❤️", @"💔", @"💌", @"💕", @"💞", @"💓", @"💗", 135 | @"💖", @"💘", @"💝", @"💟", @"💜", @"💛", @"💚", @"💙", @"❣️", 136 | ]]; 137 | }); 138 | return data; 139 | } 140 | 141 | + (NSArray *)ActivityEmoji { 142 | static dispatch_once_t onceToken; 143 | static NSArray *data; 144 | dispatch_once(&onceToken, ^{ 145 | data = [self AsFakeSet:@[ 146 | @"⚽️", @"🏀", @"🏈", @"⚾️", @"🥎", @"🎾", @"🏐", @"🏉", @"🥏", @"🎱", 147 | @"🪀", @"🏓", @"🏸", @"🏒", @"🏑", @"🥍", @"🏏", @"🪃", @"🥅", @"⛳️", 148 | @"🪁", @"🛝", @"🏹", @"🎣", @"🤿", @"🥊", @"🥋", @"🎽", @"🛹", @"🛼", 149 | @"🛷", @"⛸️", @"🥌", @"🎿", @"⛷️", @"🏂", @"🪂", @"🏋️‍♀️", @"🏋️", @"🏋️‍♂️", 150 | @"🤼‍♀️", @"🤼", @"🤼‍♂️", @"🤸‍♀️", @"🤸", @"🤸‍♂️", @"⛹️‍♀️", @"⛹️", @"⛹️‍♂️", @"🤺", 151 | @"🤾‍♀️", @"🤾", @"🤾‍♂️", @"🏌️‍♀️", @"🏌️", @"🏌️‍♂️", @"🏇", @"🧘‍♀️", @"🧘", @"🧘‍♂️", 152 | @"🏄‍♀️", @"🏄", @"🏄‍♂️", @"🏊‍♀️", @"🏊", @"🏊‍♂️", @"🤽‍♀️", @"🤽", @"🤽‍♂️", @"🚣‍♀️", 153 | @"🚣", @"🚣‍♂️", @"🧗‍♀️", @"🧗", @"🧗‍♂️", @"🚵‍♀️", @"🚵", @"🚵‍♂️", @"🚴‍♀️", @"🚴", 154 | @"🚴‍♂️", @"🏆", @"🥇", @"🥈", @"🥉", @"🏅", @"🎖️", @"🏵️", @"🎗️", @"🎫", 155 | @"🎟️", @"🎪", @"🤹‍♀️", @"🤹", @"🤹‍♂️", @"🎭", @"🩰", @"🎨", @"🫟", @"🎬", 156 | @"🎤", @"🎧", @"🎼", @"🎹", @"🪇", @"🥁", @"🪘", @"🎷", @"🎺", @"🪗", 157 | @"🎸", @"🪕", @"🪉", @"🎻", @"🪈", @"🎲", @"♟️", @"🎯", @"🎳", @"🎮", 158 | @"🎰", @"🧩", 159 | ]]; 160 | }); 161 | return data; 162 | } 163 | 164 | + (NSArray *)TravelAndPlacesEmoji { 165 | static dispatch_once_t onceToken; 166 | static NSArray *data; 167 | dispatch_once(&onceToken, ^{ 168 | data = [self AsFakeSet:@[ 169 | @"🚗", @"🚕", @"🚙", @"🚌", @"🚎", @"🏎️", @"🚓", @"🚑", @"🚒", @"🚐", 170 | @"🛻", @"🚚", @"🚛", @"🚜", @"🦯", @"🦽", @"🦼", @"🩼", @"🛴", @"🚲", 171 | @"🛵", @"🏍️", @"🛺", @"🛞", @"🚨", @"🚔", @"🚍", @"🚘", @"🚖", @"🚡", 172 | @"🚠", @"🚟", @"🚃", @"🚋", @"🚞", @"🚝", @"🚄", @"🚅", @"🚈", @"🚂", 173 | @"🚆", @"🚇", @"🚊", @"🚉", @"✈️", @"🛫", @"🛬", @"🛩️", @"💺", @"🛰️", 174 | @"🚀", @"🛸", @"🚁", @"🛶", @"⛵️", @"🚤", @"🛥️", @"🛳️", @"⛴️", @"🚢", 175 | @"🛟", @"⚓️", @"🪝", @"⛽️", @"🚧", @"🚦", @"🚥", @"🚏", @"🗺️", @"🗿", 176 | @"🗽", @"🗼", @"🏰", @"🏯", @"🏟️", @"🎡", @"🎢", @"🎠", @"⛲️", @"⛱️", 177 | @"🏖️", @"🏝️", @"🏜️", @"🌋", @"⛰️", @"🏔️", @"🗻", @"🏕️", @"⛺️", @"🛖", 178 | @"🏠", @"🏡", @"🏘️", @"🏚️", @"🏗️", @"🏭", @"🏢", @"🏬", @"🏣", @"🏤", 179 | @"🏥", @"🏦", @"🏨", @"🏪", @"🏫", @"🏩", @"💒", @"🏛️", @"⛪️", @"🕌", 180 | @"🕍", @"🛕", @"🕋", @"⛩️", @"🛤️", @"🛣️", @"🗾", @"🎑", @"🏞️", @"🌅", 181 | @"🌄", @"🌠", @"🎇", @"🎆", @"🌇", @"🌆", @"🏙️", @"🌃", @"🌌", @"🌉", 182 | @"🌁", 183 | ]]; 184 | }); 185 | return data; 186 | } 187 | 188 | + (NSArray *)ObjectsEmoji { 189 | static dispatch_once_t onceToken; 190 | static NSArray *data; 191 | dispatch_once(&onceToken, ^{ 192 | data = [self AsFakeSet:@[ 193 | @"⌚️", @"📱", @"📲", @"💻", @"⌨️", @"🖥️", @"🖨️", @"🖱️", @"🖲️", @"🕹️", 194 | @"🗜️", @"💽", @"💾", @"💿", @"📀", @"📼", @"📷", @"📸", @"📹", @"🎥", 195 | @"📽️", @"🎞️", @"📞", @"☎️", @"📟", @"📠", @"📺", @"📻", @"🎙️", @"🎚️", 196 | @"🎛️", @"🧭", @"⏱️", @"⏲️", @"⏰", @"🕰️", @"⌛️", @"⏳", @"📡", @"🔋", 197 | @"🪫", @"🔌", @"💡", @"🔦", @"🕯️", @"🪔", @"🧯", @"🛢️", @"💸", @"💵", 198 | @"💴", @"💶", @"💷", @"🪙", @"💰", @"💳", @"🪪", @"💎", @"⚖️", @"🪜", 199 | @"🧰", @"🪛", @"🔧", @"🔨", @"⚒️", @"🛠️", @"⛏️", @"🪏", @"🪚", @"🔩", 200 | @"⚙️", @"🪤", @"🧱", @"⛓️", @"⛓️‍💥", @"🧲", @"🔫", @"💣", @"🧨", @"🪓", 201 | @"🔪", @"🗡️", @"⚔️", @"🛡️", @"🚬", @"⚰️", @"🪦", @"⚱️", @"🏺", @"🔮", 202 | @"📿", @"🧿", @"🪬", @"💈", @"⚗️", @"🔭", @"🔬", @"🕳️", @"🩻", @"🩹", 203 | @"🩺", @"💊", @"💉", @"🩸", @"🧬", @"🦠", @"🧫", @"🧪", @"🌡️", @"🧹", 204 | @"🪠", @"🧺", @"🧻", @"🚽", @"🚰", @"🚿", @"🛁", @"🛀", @"🧼", @"🪥", 205 | @"🪒", @"🪮", @"🧽", @"🪣", @"🧴", @"🛎️", @"🔑", @"🗝️", @"🚪", @"🪑", 206 | @"🛋️", @"🛏️", @"🛌", @"🧸", @"🪆", @"🖼️", @"🪞", @"🪟", @"🛍️", @"🛒", 207 | @"🎁", @"🎈", @"🎏", @"🎀", @"🪄", @"🪅", @"🎊", @"🎉", @"🎎", @"🪭", 208 | @"🏮", @"🎐", @"🪩", @"🧧", @"✉️", @"📩", @"📨", @"📧", @"💌", @"📥", 209 | @"📤", @"📦", @"🏷️", @"🪧", @"📪", @"📫", @"📬", @"📭", @"📮", @"📯", 210 | @"📜", @"📃", @"📄", @"📑", @"🧾", @"📊", @"📈", @"📉", @"🗒️", @"🗓️", 211 | @"📆", @"📅", @"🗑️", @"📇", @"🗃️", @"🗳️", @"🗄️", @"📋", @"📁", @"📂", 212 | @"🗂️", @"🗞️", @"📰", @"📓", @"📔", @"📒", @"📕", @"📗", @"📘", @"📙", 213 | @"📚", @"📖", @"🔖", @"🧷", @"🔗", @"📎", @"🖇️", @"📐", @"📏", @"🧮", 214 | @"📌", @"📍", @"✂️", @"🖊️", @"🖋️", @"✒️", @"🖌️", @"🖍️", @"📝", @"✏️", 215 | @"🔍", @"🔎", @"🔏", @"🔐", @"🔒", @"🔓", 216 | ]]; 217 | }); 218 | return data; 219 | } 220 | 221 | + (NSArray *)SymbolsEmoji { 222 | static dispatch_once_t onceToken; 223 | static NSArray *data; 224 | dispatch_once(&onceToken, ^{ 225 | data = [self AsFakeSet:@[ 226 | @"🩷", @"❤️", @"🧡", @"💛", @"💚", @"🩵", @"💙", @"💜", @"🖤", @"🩶", 227 | @"🤍", @"🤎", @"💔", @"❤️‍🔥", @"❤️‍🩹", @"❣️", @"💕", @"💞", @"💓", @"💗", 228 | @"💖", @"💘", @"💝", @"💟", @"☮️", @"✝️", @"☪️", @"🕉️", @"☸️", @"🪯", 229 | @"✡️", @"🔯", @"🕎", @"☯️", @"☦️", @"🛐", @"⛎", @"♈️", @"♉️", @"♊️", 230 | @"♋️", @"♌️", @"♍️", @"♎️", @"♏️", @"♐️", @"♑️", @"♒️", @"♓️", @"🆔", 231 | @"⚛️", @"🉑", @"☢️", @"☣️", @"📴", @"📳", @"🈶", @"🈚️", @"🈸", @"🈺", 232 | @"🈷️", @"✴️", @"🆚", @"💮", @"🉐", @"㊙️", @"㊗️", @"🈴", @"🈵", @"🈹", 233 | @"🈲", @"🅰️", @"🅱️", @"🆎", @"🆑", @"🅾️", @"🆘", @"❌", @"⭕️", @"🛑", 234 | @"⛔️", @"📛", @"🚫", @"💯", @"💢", @"♨️", @"🚷", @"🚯", @"🚳", @"🚱", 235 | @"🔞", @"📵", @"🚭", @"❗️", @"❕", @"❓", @"❔", @"‼️", @"⁉️", @"🔅", 236 | @"🔆", @"〽️", @"⚠️", @"🚸", @"🔱", @"⚜️", @"🔰", @"♻️", @"✅", @"🈯️", 237 | @"💹", @"❇️", @"✳️", @"❎", @"🌐", @"💠", @"Ⓜ️", @"🌀", @"💤", @"🏧", 238 | @"🚾", @"♿️", @"🅿️", @"🛗", @"🈳", @"🈂️", @"🛂", @"🛃", @"🛄", @"🛅", 239 | @"🛜", @"🚹", @"🚺", @"🚼", @"🧑‍🧑‍🧒", @"🧑‍🧑‍🧒‍🧒", @"🧑‍🧒", @"🧑‍🧒‍🧒", @"⚧️", @"🚻", 240 | @"🚮", @"🎦", @"📶", @"🈁", @"🔣", @"ℹ️", @"🔤", @"🔡", @"🔠", @"🆖", 241 | @"🆗", @"🆙", @"🆒", @"🆕", @"🆓", @"0️⃣", @"1️⃣", @"2️⃣", @"3️⃣", @"4️⃣", 242 | @"5️⃣", @"6️⃣", @"7️⃣", @"8️⃣", @"9️⃣", @"🔟", @"🔢", @"#️⃣", @"*️⃣", @"⏏️", 243 | @"▶️", @"⏸️", @"⏯️", @"⏹️", @"⏺️", @"⏭️", @"⏮️", @"⏩️", @"⏪️", @"⏫️", 244 | @"⏬️", @"◀️", @"🔼", @"🔽", @"➡️", @"⬅️", @"⬆️", @"⬇️", @"↗️", @"↘️", 245 | @"↙️", @"↖️", @"↕️", @"↔️", @"↪️", @"↩️", @"⤴️", @"⤵️", @"🔀", @"🔁", 246 | @"🔂", @"🔄", @"🔃", @"🎵", @"🎶", @"➕", @"➖", @"➗", @"✖️", @"🟰", 247 | @"♾️", @"💲", @"💱", @"™️", @"©️", @"®️", @"👁️‍🗨️", @"🔚", @"🔙", @"🔛", 248 | @"🔝", @"🔜", @"〰️", @"➰", @"➿", @"✔️", @"☑️", @"🔘", @"🔴", @"🟠", 249 | @"🟡", @"🟢", @"🔵", @"🟣", @"⚫️", @"⚪️", @"🟤", @"🔺", @"🔻", @"🔸", 250 | @"🔹", @"🔶", @"🔷", @"🔳", @"🔲", @"▪️", @"▫️", @"◾️", @"◽️", @"◼️", 251 | @"◻️", @"🟥", @"🟧", @"🟨", @"🟩", @"🟦", @"🟪", @"⬛️", @"⬜️", @"🟫", 252 | @"🔈", @"🔇", @"🔉", @"🔊", @"🔔", @"🔕", @"📣", @"📢", @"💬", @"💭", 253 | @"🗯️", @"♠️", @"♣️", @"♥️", @"♦️", @"🃏", @"🎴", @"🀄️", @"🕐", @"🕑", 254 | @"🕒", @"🕓", @"🕔", @"🕕", @"🕖", @"🕗", @"🕘", @"🕙", @"🕚", @"🕛", 255 | @"🕜", @"🕝", @"🕞", @"🕟", @"🕠", @"🕡", @"🕢", @"🕣", @"🕤", @"🕥", 256 | @"🕦", @"🕧", 257 | ]]; 258 | }); 259 | return data; 260 | } 261 | 262 | + (NSArray *)FlagsEmoji { 263 | static dispatch_once_t onceToken; 264 | static NSArray *data; 265 | dispatch_once(&onceToken, ^{ 266 | data = [self AsFakeSet:@[ 267 | @"🏳️", @"🏴", @"🏴‍☠️", @"🏁", @"🚩", @"🏳️‍🌈", @"🏳️‍⚧️", @"🇺🇳", @"🇦🇫", @"🇦🇽", 268 | @"🇦🇱", @"🇩🇿", @"🇦🇸", @"🇦🇩", @"🇦🇴", @"🇦🇮", @"🇦🇶", @"🇦🇬", @"🇦🇷", @"🇦🇲", 269 | @"🇦🇼", @"🇦🇺", @"🇦🇹", @"🇦🇿", @"🇧🇸", @"🇧🇭", @"🇧🇩", @"🇧🇧", @"🇧🇾", @"🇧🇪", 270 | @"🇧🇿", @"🇧🇯", @"🇧🇲", @"🇧🇹", @"🇧🇴", @"🇧🇦", @"🇧🇼", @"🇧🇷", @"🇻🇬", @"🇧🇳", 271 | @"🇧🇬", @"🇧🇫", @"🇧🇮", @"🇰🇭", @"🇨🇲", @"🇨🇦", @"🇮🇨", @"🇨🇻", @"🇧🇶", @"🇰🇾", 272 | @"🇨🇫", @"🇹🇩", @"🇮🇴", @"🇨🇱", @"🇨🇳", @"🇨🇽", @"🇨🇨", @"🇨🇴", @"🇰🇲", @"🇨🇬", 273 | @"🇨🇩", @"🇨🇰", @"🇨🇷", @"🇨🇮", @"🇭🇷", @"🇨🇺", @"🇨🇼", @"🇨🇾", @"🇨🇿", @"🇩🇰", 274 | @"🇩🇯", @"🇩🇲", @"🇩🇴", @"🇪🇨", @"🇪🇬", @"🇸🇻", @"🇬🇶", @"🇪🇷", @"🇪🇪", @"🇸🇿", 275 | @"🇪🇹", @"🇪🇺", @"🇫🇰", @"🇫🇴", @"🇫🇯", @"🇫🇮", @"🇫🇷", @"🇬🇫", @"🇵🇫", @"🇹🇫", 276 | @"🇬🇦", @"🇬🇲", @"🇬🇪", @"🇩🇪", @"🇬🇭", @"🇬🇮", @"🇬🇷", @"🇬🇱", @"🇬🇩", @"🇬🇵", 277 | @"🇬🇺", @"🇬🇹", @"🇬🇬", @"🇬🇳", @"🇬🇼", @"🇬🇾", @"🇭🇹", @"🇭🇳", @"🇭🇰", @"🇭🇺", 278 | @"🇮🇸", @"🇮🇳", @"🇮🇩", @"🇮🇷", @"🇮🇶", @"🇮🇪", @"🇮🇲", @"🇮🇱", @"🇮🇹", @"🇯🇲", 279 | @"🇯🇵", @"🎌", @"🇯🇪", @"🇯🇴", @"🇰🇿", @"🇰🇪", @"🇰🇮", @"🇽🇰", @"🇰🇼", @"🇰🇬", 280 | @"🇱🇦", @"🇱🇻", @"🇱🇧", @"🇱🇸", @"🇱🇷", @"🇱🇾", @"🇱🇮", @"🇱🇹", @"🇱🇺", @"🇲🇴", 281 | @"🇲🇬", @"🇲🇼", @"🇲🇾", @"🇲🇻", @"🇲🇱", @"🇲🇹", @"🇲🇭", @"🇲🇶", @"🇲🇷", @"🇲🇺", 282 | @"🇾🇹", @"🇲🇽", @"🇫🇲", @"🇲🇩", @"🇲🇨", @"🇲🇳", @"🇲🇪", @"🇲🇸", @"🇲🇦", @"🇲🇿", 283 | @"🇲🇲", @"🇳🇦", @"🇳🇷", @"🇳🇵", @"🇳🇱", @"🇳🇨", @"🇳🇿", @"🇳🇮", @"🇳🇪", @"🇳🇬", 284 | @"🇳🇺", @"🇳🇫", @"🇰🇵", @"🇲🇰", @"🇲🇵", @"🇳🇴", @"🇴🇲", @"🇵🇰", @"🇵🇼", @"🇵🇸", 285 | @"🇵🇦", @"🇵🇬", @"🇵🇾", @"🇵🇪", @"🇵🇭", @"🇵🇳", @"🇵🇱", @"🇵🇹", @"🇵🇷", @"🇶🇦", 286 | @"🇷🇪", @"🇷🇴", @"🇷🇺", @"🇷🇼", @"🇼🇸", @"🇸🇲", @"🇸🇹", @"🇨🇶", @"🇸🇦", @"🇸🇳", 287 | @"🇷🇸", @"🇸🇨", @"🇸🇱", @"🇸🇬", @"🇸🇽", @"🇸🇰", @"🇸🇮", @"🇬🇸", @"🇸🇧", @"🇸🇴", 288 | @"🇿🇦", @"🇰🇷", @"🇸🇸", @"🇪🇸", @"🇱🇰", @"🇧🇱", @"🇸🇭", @"🇰🇳", @"🇱🇨", @"🇵🇲", 289 | @"🇻🇨", @"🇸🇩", @"🇸🇷", @"🇸🇪", @"🇨🇭", @"🇸🇾", @"🇹🇼", @"🇹🇯", @"🇹🇿", @"🇹🇭", 290 | @"🇹🇱", @"🇹🇬", @"🇹🇰", @"🇹🇴", @"🇹🇹", @"🇹🇳", @"🇹🇷", @"🇹🇲", @"🇹🇨", @"🇹🇻", 291 | @"🇺🇬", @"🇺🇦", @"🇦🇪", @"🇬🇧", @"🏴󠁧󠁢󠁥󠁮󠁧󠁿", @"🏴󠁧󠁢󠁳󠁣󠁴󠁿", @"🏴󠁧󠁢󠁷󠁬󠁳󠁿", @"🇺🇸", @"🇺🇾", @"🇻🇮", 292 | @"🇺🇿", @"🇻🇺", @"🇻🇦", @"🇻🇪", @"🇻🇳", @"🇼🇫", @"🇪🇭", @"🇾🇪", @"🇿🇲", @"🇿🇼", 293 | ]]; 294 | }); 295 | return data; 296 | } 297 | 298 | + (NSArray *)OtherFlagsEmoji { 299 | static dispatch_once_t onceToken; 300 | static NSArray *data; 301 | dispatch_once(&onceToken, ^{ 302 | data = [self AsFakeSet:@[ 303 | @"🏳️", @"🏴", @"🏴‍☠️", @"🏁", @"🚩", @"🏳️‍🌈", @"🏳️‍⚧️", @"🇺🇳", 304 | ]]; 305 | }); 306 | return data; 307 | } 308 | 309 | + (NSArray *)DingbatVariantsEmoji { 310 | static dispatch_once_t onceToken; 311 | static NSArray *data; 312 | dispatch_once(&onceToken, ^{ 313 | data = [self AsFakeSet:@[ 314 | @"❤", @"♥", @"🅰", @"♦", @"🏕", @"🅱", @"🏖", @"♨", @"🗯", @"🏗", 315 | @"⛪", @"🏘", @"🖥", @"🏙", @"🗳", @"🏚", @"🏛", @"🖨", @"🏜", @"⛲", 316 | @"⛳", @"🏝", @"🏞", @"⛵", @"🏟", @"🗺", @"🛠", @"⛺", @"◻", @"♻", 317 | @"◼", @"🛡", @"◽", @"🅾", @"⛽", @"◾", @"🎖", @"🎗", @"🅿", @"♿", 318 | @"🛢", @"☀", @"🖱", @"🛣", @"☁", @"🛤", @"🖲", @"☂", @"🈚", @"✂", 319 | @"☃", @"🎙", @"🎚", @"☄", @"🛥", @"🎛", @"🀄", @"⬅", @"✈", @"⬆", 320 | @"✉", @"🛩", @"⬇", @"🎞", @"🎟", @"✌", @"✍", @"☎", @"✏", @"↔", 321 | @"☑", @"🕯", @"↕", @"🖼", @"✒", @"↖", @"⚓", @"↗", @"☔", @"⚔", 322 | @"↘", @"☕", @"✔", @"↙", @"⚖", @"✖", @"🐿", @"⚗", @"🛰", @"⌚", 323 | @"☘", @"🏳", @"⌛", @"⚙", @"👁", @"🕴", @"🛳", @"⚛", @"🏵", @"🕵", 324 | @"⚜", @"🗂", @"☝", @"🕶", @"✝", @"🗃", @"⬛", @"🏷", @"⬜", @"㊗", 325 | @"☠", @"⚠", @"🕷", @"🕸", @"⚡", @"✡", @"☢", @"➡", @"㊙", @"☣", 326 | @"🕹", @"🗄", @"🈯", @"↩", @"⌨", @"☦", @"↪", @"▪", @"☪", @"⚪", 327 | @"▫", @"⚫", @"☮", @"☯", @"⚰", @"⚱", @"🈷", @"✳", @"✴", @"🗑", 328 | @"ℹ", @"▶", @"⤴", @"⤵", @"🗒", @"‼", @"☸", @"🗓", @"☹", @"🌡", 329 | @"🖇", @"☺", @"⚽", @"⚾", @"🌤", @"🖊", @"◀", @"🌥", @"🖋", @"Ⓜ", 330 | @"🌦", @"🖌", @"🌧", @"〽", @"🖍", @"⛄", @"❄", @"⁉", @"⛅", @"🌨", 331 | @"🌩", @"❇", @"♈", @"🌪", @"🖐", @"♉", @"🗜", @"🗝", @"♊", @"🌫", 332 | @"♋", @"🗞", @"🌬", @"♌", @"♍", @"♎", @"♏", @"♐", @"🗡", @"♑", 333 | @"♒", @"🕉", @"♓", @"⭐", @"🍽", @"📽", @"⛔", @"🕊", @"🗣", @"🏋", 334 | @"🏌", @"🛋", @"❗", @"⭕", @"🏍", @"🈂", @"🏎", @"🛍", @"🛎", @"🌶", 335 | @"🛏", @"♠", @"♣", @"❣", @"🏔", 336 | ]]; 337 | }); 338 | return data; 339 | } 340 | 341 | + (NSArray *)SkinToneEmoji { 342 | static dispatch_once_t onceToken; 343 | static NSArray *data; 344 | dispatch_once(&onceToken, ^{ 345 | data = [self AsFakeSet:@[ 346 | @"👳", @"🤶", @"🧍", @"👴", @"👂", @"🤷", @"🧎", @"👵", @"👃", @"🤸", 347 | @"🧏", @"👶", @"🤹", @"👷", @"🧑", @"💪", @"👸", @"👆", @"🧒", @"🕴", 348 | @"👇", @"🧓", @"🕵", @"👈", @"🤽", @"🧔", @"🚣", @"👉", @"🤌", @"🤾", 349 | @"🧕", @"👼", @"👊", @"🧖", @"👋", @"🧗", @"👌", @"🤏", @"🧘", @"🕺", 350 | @"👍", @"🧙", @"👎", @"🧚", @"💁", @"👏", @"🙅", @"🧛", @"💂", @"👐", 351 | @"⛹", @"🙆", @"🥷", @"💃", @"🙇", @"🧜", @"🧝", @"💅", @"💆", @"💇", 352 | @"🙋", @"🤘", @"🙌", @"🤙", @"🙍", @"🤚", @"🙎", @"🤛", @"🙏", @"🤜", 353 | @"🚴", @"✊", @"🚵", @"✋", @"🤞", @"✌", @"🎅", @"🚶", @"✍", @"🤟", 354 | @"🦵", @"🦶", @"🦸", @"🦹", @"🦻", @"☝", @"🖐", @"🤦", @"🛀", @"👦", 355 | @"👧", @"🏃", @"🖕", @"👨", @"🏄", @"🖖", @"👩", @"🫰", @"🫱", @"🫲", 356 | @"🏇", @"🫳", @"🤰", @"🫴", @"👮", @"🤱", @"🫵", @"🏊", @"🫃", @"🤲", 357 | @"🫶", @"🏋", @"🫄", @"👰", @"🤳", @"🫷", @"🏌", @"🫅", @"👱", @"🤴", 358 | @"🫸", @"👲", @"🤵", 359 | ]]; 360 | }); 361 | return data; 362 | } 363 | 364 | + (NSArray *)GenderEmoji { 365 | static dispatch_once_t onceToken; 366 | static NSArray *data; 367 | dispatch_once(&onceToken, ^{ 368 | data = [self AsFakeSet:@[ 369 | @"🧙", @"🤽", @"💆", @"🙍", @"🤾", @"💇", @"🧚", @"🚣", @"🙎", @"🧍", 370 | @"🧛", @"🧜", @"🧎", @"🧝", @"🧏", @"🏃", @"🚴", @"👮", @"🧞", @"🏄", 371 | @"🚵", @"⛹", @"👯", @"🤦", @"🤵", @"🚶", @"👰", @"🧟", @"🙅", @"🫃", 372 | @"👱", @"🫄", @"🙆", @"🤷", @"🫅", @"🙇", @"🤸", @"💁", @"👳", @"🦸", 373 | @"🤹", @"💂", @"🦹", @"🧖", @"🏊", @"🕵", @"🏋", @"🧗", @"🙋", @"🏌", 374 | @"🧘", @"👷", 375 | ]]; 376 | }); 377 | return data; 378 | } 379 | 380 | + (NSArray *)NoneVariantEmoji { 381 | static dispatch_once_t onceToken; 382 | static NSArray *data; 383 | dispatch_once(&onceToken, ^{ 384 | data = [self AsFakeSet:@[ 385 | @"👩‍👩‍👦", @"👨‍👩‍👧‍👧", @"👨‍👩‍👧‍👦", @"👩‍👩‍👧‍👦", @"👩‍👩‍👧‍👧", @"👩‍👧‍👧", @"👨‍👧‍👦", @"👨‍👦‍👦", @"👨‍👨‍👦", @"👩‍👩‍👧", 386 | @"👨‍👨‍👦‍👦", @"👨‍👧", @"👨‍👧‍👧", @"👨‍👨‍👧", @"👨‍👩‍👦‍👦", @"👩‍👩‍👦‍👦", @"👨‍👩‍👧", @"👨‍👦", @"👩‍👧", @"👩‍👦‍👦", 387 | @"👁‍🗨", @"👩‍👦", @"👨‍👨‍👧‍👧", @"👨‍👨‍👧‍👦", @"👩‍👧‍👦", 388 | ]]; 389 | }); 390 | return data; 391 | } 392 | 393 | + (NSArray *)ProfessionEmoji { 394 | static dispatch_once_t onceToken; 395 | static NSArray *data; 396 | dispatch_once(&onceToken, ^{ 397 | data = [self AsFakeSet:@[ 398 | @"👨‍🦲", @"👩‍🦲", @"🧑‍🏫", @"🧑‍💼", @"👨‍💻", @"👩‍💻", @"🧑‍🌾", @"👨‍⚕️", @"👨‍🍳", @"👩‍⚕️", 399 | @"👩‍🍳", @"👩‍🔧", @"👨‍🔧", @"🧑‍🔬", @"🧑‍🎓", @"🧑‍🚒", @"🧑‍🍼", @"🧔‍♂️", @"🧑‍🦰", @"👨‍🦯", 400 | @"👩‍🦯", @"👨‍🦳", @"🧑‍🎄", @"👩‍🦳", @"👨‍🏫", @"👨‍💼", @"👩‍🏫", @"👩‍💼", @"🧑‍🦼", @"👨‍🌾", 401 | @"👩‍🌾", @"👨‍🔬", @"👩‍🔬", @"👨‍🎓", @"👨‍🚒", @"👩‍🎓", @"👨‍🍼", @"👩‍🚒", @"👩‍🍼", @"🧑‍🦱", 402 | @"👨‍🦰", @"🧑‍✈️", @"👩‍🦰", @"🧑‍🚀", @"🧑‍🏭", @"🧑‍🎤", @"🧑‍🦽", @"👨‍🦼", @"👩‍🦼", @"🧑‍⚖️", 403 | @"🧑‍🎨", @"🧔‍♀️", @"🧑‍🦲", @"👨‍🦱", @"👨‍✈️", @"👨‍🚀", @"👩‍✈️", @"🐕‍🦺", @"👩‍🚀", @"👩‍🦱", 404 | @"🧑‍💻", @"👨‍🏭", @"👩‍🏭", @"🧑‍⚕️", @"👨‍🎤", @"🧑‍🍳", @"👩‍🎤", @"👨‍🦽", @"👩‍🦽", @"👨‍⚖️", 405 | @"👨‍🎨", @"👩‍⚖️", @"👩‍🎨", @"🧑‍🔧", @"🧑‍🦯", @"🧑‍🦳", 406 | ]]; 407 | }); 408 | return data; 409 | } 410 | 411 | + (NSArray *)PrepopulatedEmoji { 412 | static dispatch_once_t onceToken; 413 | static NSArray *data; 414 | dispatch_once(&onceToken, ^{ 415 | data = [self AsFakeSet:@[ 416 | @"😂", @"❤️", @"😍", @"😒", @"👌", @"☺️", @"😊", @"😘", @"😭", @"😩", 417 | @"💕", @"😔", @"😏", @"😁", @"😳", @"👍", @"✌️", @"😉", @"😌", @"💁", 418 | @"🙈", @"😎", @"🎶", @"👀", @"😑", @"😴", @"😄", @"😜", @"😋", @"👏", 419 | ]]; 420 | }); 421 | return data; 422 | } 423 | 424 | + (NSArray *)ProfessionWithoutSkinToneEmoji { 425 | static dispatch_once_t onceToken; 426 | static NSArray *data; 427 | dispatch_once(&onceToken, ^{ 428 | data = [self AsFakeSet:@[ 429 | @"🐕‍🦺", 430 | ]]; 431 | }); 432 | return data; 433 | } 434 | 435 | + (NSArray *)CoupleMultiSkinToneEmoji { 436 | static dispatch_once_t onceToken; 437 | static NSArray *data; 438 | dispatch_once(&onceToken, ^{ 439 | data = [self AsFakeSet:@[ 440 | @"👭", @"👬", @"👫", @"🧑‍🤝‍🧑", 441 | ]]; 442 | }); 443 | return data; 444 | } 445 | 446 | + (NSArray *)ExtendedCoupleMultiSkinToneEmoji { 447 | static dispatch_once_t onceToken; 448 | static NSArray *data; 449 | dispatch_once(&onceToken, ^{ 450 | data = [self AsFakeSet:@[ 451 | @"💏", @"👩‍❤️‍💋‍👩", @"👨‍❤️‍💋‍👨", @"👨‍❤️‍👨", @"👩‍❤️‍💋‍👨", @"👩‍❤️‍👩", @"💑", @"👩‍❤️‍👨", 452 | ]]; 453 | }); 454 | return data; 455 | } 456 | 457 | + (NSArray *)MultiPersonFamilySkinToneEmoji { 458 | static dispatch_once_t onceToken; 459 | static NSArray *data; 460 | dispatch_once(&onceToken, ^{ 461 | data = [self AsFakeSet:@[ 462 | @"👩‍👩‍👦", @"👨‍👩‍👧‍👧", @"👨‍👩‍👧‍👦", @"👩‍👩‍👧‍👦", @"👩‍👩‍👧‍👧", @"👩‍👧‍👧", @"👨‍👧‍👦", @"👨‍👦‍👦", @"👨‍👨‍👦", @"🧑‍🧒", 463 | @"👩‍👩‍👧", @"👨‍👩‍👦", @"👨‍👨‍👦‍👦", @"👨‍👧", @"👨‍👧‍👧", @"🧑‍🧑‍🧒", @"🧑‍🧑‍🧒‍🧒", @"👨‍👨‍👧", @"🧑‍🤝‍🧑", @"👨‍👩‍👦‍👦", 464 | @"👩‍👩‍👦‍👦", @"👨‍👩‍👧", @"👨‍👦", @"👩‍👧", @"🧑‍🧒‍🧒", @"👩‍👦‍👦", @"👩‍👦", @"👨‍👨‍👧‍👧", @"👨‍👨‍👧‍👦", @"👩‍👧‍👦", 465 | ]]; 466 | }); 467 | return data; 468 | } 469 | 470 | @end 471 | -------------------------------------------------------------------------------- /PSEmojiUtilities+Functions.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import 4 | #include "Header.h" 5 | #include "PSEmojiType.h" 6 | #import "PSEmojiUtilities.h" 7 | #import "PSEmojiCategory.h" 8 | 9 | @implementation PSEmojiUtilities (Functions) 10 | 11 | + (NSArray *)skinModifiers { 12 | return @[ @"🏻", @"🏼", @"🏽", @"🏾", @"🏿" ]; 13 | } 14 | 15 | + (NSArray *)genderEmojiBaseStringsNeedVariantSelector { 16 | return @[ @"🏋", @"⛹", @"🕵", @"🏌" ]; 17 | } 18 | 19 | + (NSArray *)dingbatEmojiBaseStringsNeedVariantSelector { 20 | return @[ @"☝", @"✊", @"✋", @"✌", @"✍" ]; 21 | } 22 | 23 | + (UChar32)firstLongCharacter:(NSString *)string { 24 | #if __LP64__ && TARGET_OS_IOS 25 | return [string _firstLongCharacter]; 26 | #else 27 | UChar32 cbase = 0; 28 | if (string.length) { 29 | cbase = [string characterAtIndex:0]; 30 | if ((cbase & 0xFC00) == 0xD800 && string.length >= 2) { 31 | UChar32 y = [string characterAtIndex:1]; 32 | if ((y & 0xFC00) == 0xDC00) 33 | cbase = (cbase << 10) + y - 0x35FDC00; 34 | } 35 | } 36 | return cbase; 37 | #endif 38 | } 39 | 40 | + (BOOL)genderEmojiBaseStringNeedVariantSelector:(NSString *)emojiBaseString { 41 | return [[self genderEmojiBaseStringsNeedVariantSelector] containsObject:emojiBaseString]; 42 | } 43 | 44 | + (BOOL)emojiString:(NSString *)emojiString inGroup:(NSArray *)group { 45 | return [group containsObject:emojiString]; 46 | } 47 | 48 | + (NSString *)emojiBaseFirstCharacterString:(NSString *)emojiString { 49 | return [NSString stringWithUnichar:[self firstLongCharacter:emojiString]]; 50 | } 51 | 52 | + (NSString *)getGender:(NSString *)emojiString { 53 | if (containsString(emojiString, FEMALE)) 54 | return FEMALE; 55 | if (containsString(emojiString, MALE)) 56 | return MALE; 57 | return nil; 58 | } 59 | 60 | + (BOOL)hasGender:(NSString *)emojiString { 61 | return [self getGender:emojiString] != nil; 62 | } 63 | 64 | + (NSString *)professionSkinToneEmojiBaseKey:(NSString *)emojiString { 65 | for (NSString *skin in [self skinModifiers]) { 66 | if (containsString(emojiString, skin)) 67 | return [emojiString stringByReplacingOccurrencesOfString:skin withString:@"" options:NSLiteralSearch range:NSMakeRange(0, emojiString.length)]; 68 | } 69 | return emojiString; 70 | } 71 | 72 | + (NSString *)emojiStringWithoutVariantSelector:(NSString *)emojiString { 73 | return [emojiString stringByReplacingOccurrencesOfString:FE0F withString:@"" options:NSLiteralSearch range:NSMakeRange(0, emojiString.length)]; 74 | } 75 | 76 | + (NSString *)getSkin:(NSString *)emojiString { 77 | for (NSString *skin in [self skinModifiers]) { 78 | if (containsString(emojiString, skin)) 79 | return skin; 80 | } 81 | return nil; 82 | } 83 | 84 | + (BOOL)isComposedCoupleMultiSkinToneEmoji:(NSString *)emojiString { 85 | return containsString(emojiString, HANDSHAKE_JOINER) || containsString(emojiString, HEART_JOINER); 86 | } 87 | 88 | + (BOOL)isHandholdingCoupleEmoji:(NSString *)emojiString { 89 | return [[self CoupleMultiSkinToneEmoji] containsObject:[NSString stringWithUnichar:[self firstLongCharacter:emojiString]]] 90 | || containsString(emojiString, HANDSHAKE_JOINER); 91 | } 92 | 93 | + (BOOL)isBaseHandshakeOrHandshakeWithSkintonesEmoji:(NSString *)emojiString { 94 | return containsString(emojiString, HANDSHAKE) 95 | || (containsString(emojiString, LEFTHAND) && containsString(emojiString, RIGHTHAND)); 96 | } 97 | 98 | + (BOOL)supportsCoupleSkinToneSelection:(NSString *)emojiString { 99 | return [self isHandholdingCoupleEmoji:emojiString] || [self isCoupleMultiSkinToneEmoji:emojiString] || containsString(emojiString, @"‍❤️‍"); 100 | } 101 | 102 | + (NSArray *> *)coupleSkinToneChooserVariantsForString:(NSString *)emojiString { 103 | PSEmojiMultiSkinType multiSkinType = [self multiPersonTypeForString:emojiString]; 104 | if (multiSkinType) { 105 | NSString *joiner = [self joiningStringForCoupleString:emojiString] ?: HANDSHAKE_JOINER; 106 | return [self skinToneChooserArraysForCoupleType:multiSkinType joiner:joiner]; 107 | } 108 | return nil; 109 | } 110 | 111 | + (NSArray *)tokenizedMultiPersonFromString:(NSString *)emojiString { 112 | NSRange range = [emojiString rangeOfString:HANDSHAKE_JOINER options:NSLiteralSearch]; 113 | if (range.location != NSNotFound) { 114 | NSString *left = [emojiString substringToIndex:range.location]; 115 | NSString *right = [emojiString substringFromIndex:range.location + range.length]; 116 | if (left && right) return @[left, right]; 117 | } 118 | range = [emojiString rangeOfString:HEART_KISS_JOINER options:NSLiteralSearch]; 119 | if (range.location != NSNotFound) { 120 | NSString *left = [emojiString substringToIndex:range.location]; 121 | NSString *right = [emojiString substringFromIndex:range.location + range.length]; 122 | if (left && right) return @[left, right]; 123 | } 124 | range = [emojiString rangeOfString:HEART_JOINER options:NSLiteralSearch]; 125 | if (range.location != NSNotFound) { 126 | NSString *left = [emojiString substringToIndex:range.location]; 127 | NSString *right = [emojiString substringFromIndex:range.location + range.length]; 128 | if (left && right) return @[left, right]; 129 | } 130 | return @[]; 131 | } 132 | 133 | + (NSArray *)tokenizedHandshakeFromString:(NSString *)emojiString { 134 | static dispatch_once_t onceToken; 135 | static NSCharacterSet *zwjCharacterSet; 136 | dispatch_once(&onceToken, ^{ 137 | zwjCharacterSet = [NSMutableCharacterSet characterSetWithCharactersInString:ZWJ].copy; 138 | }); 139 | return [emojiString componentsSeparatedByCharactersInSet:zwjCharacterSet]; 140 | } 141 | 142 | + (PSEmojiMultiSkinType)multiPersonTypeForString:(NSString *)emojiString { 143 | if ([self isBaseHandshakeOrHandshakeWithSkintonesEmoji:emojiString]) 144 | return PSEmojiMultiSkinTypeHandshake; 145 | NSString *baseFirst = [self emojiBaseFirstCharacterString:emojiString]; 146 | if ([self isCoupleMultiSkinToneEmoji:baseFirst]) { 147 | if ([baseFirst isEqualToString:FM]) 148 | return PSEmojiMultiSkinTypeFM; 149 | if ([baseFirst isEqualToString:FF]) 150 | return PSEmojiMultiSkinTypeFF; 151 | if ([baseFirst isEqualToString:MM]) 152 | return PSEmojiMultiSkinTypeMM; 153 | if ([baseFirst isEqualToString:NN] || [baseFirst isEqualToString:@"💑"] || [baseFirst isEqualToString:@"💏"]) 154 | return PSEmojiMultiSkinTypeNN; 155 | } else if (emojiString && ([self isComposedCoupleMultiSkinToneEmoji:emojiString] || [self supportsCoupleSkinToneSelection:emojiString])) { 156 | NSArray *tokens = [self tokenizedMultiPersonFromString:emojiString]; 157 | NSString *baseLeft = [self emojiBaseFirstCharacterString:tokens[0]]; 158 | NSString *baseRight = [self emojiBaseFirstCharacterString:tokens[1]]; 159 | if ([baseLeft isEqualToString:WOMAN]) { 160 | if ([baseRight isEqualToString:WOMAN]) 161 | return PSEmojiMultiSkinTypeFF; 162 | if ([baseRight isEqualToString:MAN]) 163 | return PSEmojiMultiSkinTypeFM; 164 | } 165 | if ([baseLeft isEqualToString:MAN] && [baseRight isEqualToString:MAN]) 166 | return PSEmojiMultiSkinTypeMM; 167 | if ([baseLeft isEqualToString:NEUTRAL] && [baseRight isEqualToString:NEUTRAL]) 168 | return PSEmojiMultiSkinTypeNN; 169 | } 170 | return 0; 171 | } 172 | 173 | + (NSString *)joiningStringForCoupleString:(NSString *)emojiString { 174 | if (containsString(emojiString, HANDSHAKE_JOINER)) 175 | return HANDSHAKE_JOINER; 176 | if (containsString(emojiString, HEART_KISS_JOINER) || containsString(emojiString, @"💏")) 177 | return HEART_KISS_JOINER; 178 | if (containsString(emojiString, HEART_JOINER) || containsString(emojiString, @"💑")) 179 | return HEART_JOINER; 180 | if ([emojiString isEqualToString:HANDSHAKE]) 181 | return ZWJ; 182 | return nil; 183 | } 184 | 185 | + (NSArray *)skinToneSpecifiersForString:(NSString *)emojiString { 186 | if ([self isCoupleMultiSkinToneEmoji:emojiString] && ![self isBaseHandshakeOrHandshakeWithSkintonesEmoji:emojiString]) 187 | return @[@"EMFSkinToneSpecifierTypeFitzpatrickNone"]; 188 | NSString *baseFirst = [self emojiBaseFirstCharacterString:emojiString]; 189 | if ([baseFirst isEqualToString:FM] || [baseFirst isEqualToString:FF] || [baseFirst isEqualToString:MM]) { 190 | int skinTone = [self skinToneForString:emojiString]; 191 | if (!skinTone) 192 | return @[@"EMFSkinToneSpecifierTypeFitzpatrickNone"]; 193 | NSString *specifier = [self skinToneSpecifierTypeFromEmojiFitzpatrickModifier:skinTone]; 194 | return @[specifier, specifier]; 195 | } 196 | if ([self isComposedCoupleMultiSkinToneEmoji:emojiString]) { 197 | NSArray *tokens = [self tokenizedMultiPersonFromString:emojiString]; 198 | NSMutableArray *specifiers = [NSMutableArray arrayWithCapacity:tokens.count]; 199 | for (NSString *token in tokens) { 200 | int skinTone = [self skinToneForString:token]; 201 | if (skinTone) 202 | [specifiers addObject:[self skinToneSpecifierTypeFromEmojiFitzpatrickModifier:skinTone]]; 203 | } 204 | return specifiers; 205 | } 206 | if (![self isBaseHandshakeOrHandshakeWithSkintonesEmoji:emojiString]) 207 | return @[[self skinToneSpecifierTypeFromEmojiFitzpatrickModifier:[self skinToneForString:emojiString]]]; 208 | NSArray *tokens = [self tokenizedHandshakeFromString:emojiString]; 209 | NSMutableArray *specifiers = [NSMutableArray arrayWithCapacity:2]; 210 | for (NSString *token in tokens) { 211 | int skinTone = [self skinToneForString:token]; 212 | if (skinTone) 213 | [specifiers addObject:[self skinToneSpecifierTypeFromEmojiFitzpatrickModifier:skinTone]]; 214 | } 215 | return specifiers; 216 | } 217 | 218 | + (int)skinToneForString:(NSString *)emojiString { 219 | NSDictionary *map = @{ 220 | @1: @"🏻", 221 | @3: @"🏼", 222 | @4: @"🏽", 223 | @5: @"🏾", 224 | @6: @"🏿" 225 | }; 226 | __block int skinTone = 0; 227 | [map enumerateKeysAndObjectsUsingBlock:^(NSNumber *key, NSString *obj, BOOL *stop) { 228 | if (containsString(emojiString, obj)) { 229 | skinTone = [key intValue]; 230 | *stop = YES; 231 | } 232 | }]; 233 | return skinTone; 234 | } 235 | 236 | + (NSString *)skinToneSpecifierTypeFromEmojiFitzpatrickModifier:(int)modifier { 237 | switch (modifier) { 238 | case 1: 239 | return @"EMFSkinToneSpecifierTypeFitzpatrick1_2"; 240 | case 3: 241 | return @"EMFSkinToneSpecifierTypeFitzpatrick3"; 242 | case 4: 243 | return @"EMFSkinToneSpecifierTypeFitzpatrick4"; 244 | case 5: 245 | return @"EMFSkinToneSpecifierTypeFitzpatrick5"; 246 | case 6: 247 | return @"EMFSkinToneSpecifierTypeFitzpatrick6"; 248 | default: 249 | return @"EMFSkinToneSpecifierTypeFitzpatrickNone"; 250 | } 251 | } 252 | 253 | + (NSString *)skinToneSuffixFromSpecifierType:(NSString *)specifier { 254 | NSString *realSpecifier = [specifier stringByReplacingOccurrencesOfString:@"EMFSkinToneSpecifierTypeFitzpatrick" withString:@""]; 255 | if ([realSpecifier isEqualToString:@"1_2"]) 256 | return @"🏻"; 257 | if ([realSpecifier isEqualToString:@"3"]) 258 | return @"🏼"; 259 | if ([realSpecifier isEqualToString:@"4"]) 260 | return @"🏽"; 261 | if ([realSpecifier isEqualToString:@"5"]) 262 | return @"🏾"; 263 | if ([realSpecifier isEqualToString:@"6"]) 264 | return @"🏿"; 265 | return @""; 266 | } 267 | 268 | + (NSString *)multiPersonStringForString:(NSString *)emojiString skinToneVariantSpecifier:(NSArray *)specifier { 269 | PSEmojiMultiSkinType multiSkinType = [self multiPersonTypeForString:emojiString]; 270 | if (multiSkinType) { 271 | NSString *joiner = [self joiningStringForCoupleString:emojiString]; 272 | BOOL hasSilhouette = [specifier containsObject:@"EMFSkinToneSpecifierTypeFitzpatrickSilhouette"]; 273 | if (hasSilhouette) { 274 | NSString *first = [specifier firstObject]; 275 | NSString *last = [specifier lastObject]; 276 | BOOL firstSil = [first isEqualToString:@"EMFSkinToneSpecifierTypeFitzpatrickSilhouette"]; 277 | BOOL lastSil = [last isEqualToString:@"EMFSkinToneSpecifierTypeFitzpatrickSilhouette"]; 278 | if (firstSil) { 279 | if (lastSil && joiner == nil) 280 | specifier = @[@"EMFSkinToneSpecifierTypeFitzpatrick6", @"EMFSkinToneSpecifierTypeFitzpatrick6"]; 281 | else 282 | specifier = @[last, last]; 283 | } else 284 | specifier = @[first, first]; 285 | } 286 | NSString *solo = nil; 287 | NSString *firstSuffix = nil; 288 | NSString *lastSuffix = nil; 289 | NSString *first = [specifier firstObject]; 290 | firstSuffix = [self skinToneSuffixFromSpecifierType:first]; 291 | if (specifier.count == 2) { 292 | NSString *last = [specifier lastObject]; 293 | lastSuffix = [self skinToneSuffixFromSpecifierType:last]; 294 | } else 295 | lastSuffix = firstSuffix; 296 | if (joiner && ![joiner isEqualToString:HANDSHAKE_JOINER] && multiSkinType != PSEmojiMultiSkinTypeHandshake) { 297 | if (multiSkinType == PSEmojiMultiSkinTypeNN || firstSuffix.length) { 298 | NSArray *tokens = [self tokenizedMultiPersonFromString:emojiString]; 299 | if (tokens.count <= 1) 300 | tokens = @[NEUTRAL, NEUTRAL]; 301 | NSString *firstToken = [self emojiBaseString:[tokens firstObject]]; 302 | NSString *lastToken = [self emojiBaseString:[tokens lastObject]]; 303 | return [self coupleStringWithLeftPerson:firstToken leftVariant:firstSuffix joiningString:joiner rightPerson:lastToken rightVariant:lastSuffix]; 304 | } 305 | return [self emojiBaseString:emojiString]; 306 | } 307 | switch (multiSkinType) { 308 | case PSEmojiMultiSkinTypeMM: { 309 | if (firstSuffix == nil || lastSuffix == nil) 310 | return MM; 311 | if ([firstSuffix isEqualToString:lastSuffix] && !hasSilhouette) 312 | return [NSString stringWithFormat:@"%@%@", MM, firstSuffix]; 313 | solo = MAN; 314 | break; 315 | } 316 | case PSEmojiMultiSkinTypeFF: { 317 | if (firstSuffix == nil || lastSuffix == nil) 318 | return FF; 319 | if ([firstSuffix isEqualToString:lastSuffix] && !hasSilhouette) 320 | return [NSString stringWithFormat:@"%@%@", FF, firstSuffix]; 321 | solo = WOMAN; 322 | break; 323 | } 324 | case PSEmojiMultiSkinTypeFM: { 325 | if (firstSuffix == nil || lastSuffix == nil) 326 | return FM; 327 | if (![firstSuffix isEqualToString:lastSuffix] || hasSilhouette) 328 | return [NSString stringWithFormat:@"%@%@%@%@%@", WOMAN, firstSuffix, HANDSHAKE_JOINER, MAN, lastSuffix]; 329 | return [NSString stringWithFormat:@"%@%@", FM, firstSuffix]; 330 | } 331 | case PSEmojiMultiSkinTypeNN: 332 | break; 333 | case PSEmojiMultiSkinTypeHandshake: { 334 | if (firstSuffix == nil || lastSuffix == nil) 335 | return HANDSHAKE; 336 | if (![firstSuffix isEqualToString:lastSuffix] || hasSilhouette) 337 | return [NSString stringWithFormat:@"%@%@%@%@%@", LEFTHAND, firstSuffix, ZWJ, RIGHTHAND, lastSuffix]; 338 | return [NSString stringWithFormat:@"%@%@", HANDSHAKE, firstSuffix]; 339 | } 340 | } 341 | return [NSString stringWithFormat:@"%@%@%@%@%@", solo, firstSuffix, HANDSHAKE_JOINER, solo, lastSuffix]; 342 | } 343 | return nil; 344 | } 345 | 346 | + (NSArray *> *)skinToneChooserArraysForCoupleType:(PSEmojiMultiSkinType)coupleType joiner:(NSString *)joiner { 347 | NSMutableArray *first = [NSMutableArray arrayWithCapacity:5]; 348 | NSMutableArray *second = [NSMutableArray arrayWithCapacity:5]; 349 | NSString *leftEmoji = nil; 350 | NSString *rightEmoji = nil; 351 | NSString *pair; 352 | switch (coupleType) { 353 | case PSEmojiMultiSkinTypeFM: 354 | pair = FM; 355 | leftEmoji = WOMAN; 356 | rightEmoji = MAN; 357 | break; 358 | case PSEmojiMultiSkinTypeFF: 359 | pair = FF; 360 | leftEmoji = rightEmoji = WOMAN; 361 | break; 362 | case PSEmojiMultiSkinTypeMM: 363 | pair = MM; 364 | leftEmoji = rightEmoji = MAN; 365 | break; 366 | case PSEmojiMultiSkinTypeNN: 367 | pair = nil; 368 | leftEmoji = rightEmoji = NEUTRAL; 369 | break; 370 | case PSEmojiMultiSkinTypeHandshake: 371 | pair = nil; 372 | leftEmoji = LEFTHAND; 373 | rightEmoji = RIGHTHAND; 374 | break; 375 | } 376 | for (NSString *skin in [PSEmojiUtilities skinModifiers]) { 377 | NSString *emoji; 378 | if (joiner) 379 | emoji = [self coupleStringWithLeftPerson:leftEmoji leftVariant:skin joiningString:joiner rightPerson:rightEmoji rightVariant:skin]; 380 | else 381 | emoji = [NSString stringWithFormat:@"%@%@", pair, skin]; 382 | [first addObject:emoji]; 383 | [second addObject:emoji]; 384 | } 385 | return @[first, second]; 386 | } 387 | 388 | + (NSArray *> *)skinToneChooserVariantsForHandHoldingCoupleType:(PSEmojiMultiSkinType)coupleType { 389 | NSMutableArray *first = [NSMutableArray arrayWithCapacity:5]; 390 | NSMutableArray *second = [NSMutableArray arrayWithCapacity:5]; 391 | for (NSString *skin in [PSEmojiUtilities skinModifiers]) { 392 | switch (coupleType) { 393 | case PSEmojiMultiSkinTypeFM: { 394 | [first addObject:[NSString stringWithFormat:@"%@%@%@%@", WOMAN, skin, HANDSHAKE_JOINER, MAN]]; 395 | [second addObject:[NSString stringWithFormat:@"%@%@%@%@", WOMAN, HANDSHAKE_JOINER, MAN, skin]]; 396 | break; 397 | } 398 | case PSEmojiMultiSkinTypeFF: { 399 | [first addObject:[NSString stringWithFormat:@"%@%@%@%@", WOMAN, skin, HANDSHAKE_JOINER, WOMAN]]; 400 | [second addObject:[NSString stringWithFormat:@"%@%@%@%@", WOMAN, HANDSHAKE_JOINER, WOMAN, skin]]; 401 | break; 402 | } 403 | case PSEmojiMultiSkinTypeMM: { 404 | [first addObject:[NSString stringWithFormat:@"%@%@%@%@", MAN, skin, HANDSHAKE_JOINER, MAN]]; 405 | [second addObject:[NSString stringWithFormat:@"%@%@%@%@", MAN, HANDSHAKE_JOINER, MAN, skin]]; 406 | break; 407 | } 408 | case PSEmojiMultiSkinTypeNN: { 409 | [first addObject:[NSString stringWithFormat:@"%@%@%@%@", NEUTRAL, skin, HANDSHAKE_JOINER, NEUTRAL]]; 410 | [second addObject:[NSString stringWithFormat:@"%@%@%@%@", NEUTRAL, HANDSHAKE_JOINER, NEUTRAL, skin]]; 411 | break; 412 | } 413 | case PSEmojiMultiSkinTypeHandshake: { 414 | [first addObject:[NSString stringWithFormat:@"%@%@%@%@%@", LEFTHAND, skin, ZWJ, RIGHTHAND, ZWJ]]; 415 | [second addObject:[NSString stringWithFormat:@"%@%@%@%@%@", LEFTHAND, ZWJ, RIGHTHAND, skin, ZWJ]]; 416 | break; 417 | } 418 | default: 419 | break; 420 | } 421 | } 422 | return @[first, second]; 423 | } 424 | 425 | + (NSArray *> *)skinToneChooserVariantsForString:(NSString *)emojiString usesSilhouetteSpecifiers:(BOOL)silhouette { 426 | PSEmojiMultiSkinType multiSkinType = [self multiPersonTypeForString:emojiString]; 427 | if (multiSkinType) { 428 | if (silhouette) 429 | return [self skinToneChooserVariantsForHandHoldingCoupleType:multiSkinType]; 430 | NSString *joiner = [self joiningStringForCoupleString:emojiString] ?: HANDSHAKE_JOINER; 431 | return [self skinToneChooserArraysForCoupleType:multiSkinType joiner:joiner]; 432 | } 433 | return nil; 434 | } 435 | 436 | + (NSArray *> *)skinToneChooserVariantsForString:(NSString *)emojiString { 437 | PSEmojiMultiSkinType multiSkinType = [self multiPersonTypeForString:emojiString]; 438 | if (multiSkinType) 439 | return [self skinToneChooserVariantsForString:emojiString usesSilhouetteSpecifiers:YES]; 440 | return nil; 441 | } 442 | 443 | + (BOOL)hasSkin:(NSString *)emojiString { 444 | return [self getSkin:emojiString] != nil; 445 | } 446 | 447 | + (NSString *)changeEmojiSkin:(NSString *)emojiString toSkin:(NSString *)skin { 448 | NSString *oldSkin = [self getSkin:emojiString]; 449 | if (oldSkin == nil || [oldSkin isEqualToString:skin]) 450 | return emojiString; 451 | return [emojiString stringByReplacingOccurrencesOfString:oldSkin withString:skin options:NSLiteralSearch range:NSMakeRange(0, emojiString.length)]; 452 | } 453 | 454 | + (BOOL)isNoneVariantEmoji:(NSString *)emojiString { 455 | return [[self NoneVariantEmoji] containsObject:emojiString]; 456 | } 457 | 458 | + (BOOL)isSkinToneEmoji:(NSString *)emojiString { 459 | return [[self SkinToneEmoji] containsObject:emojiString]; 460 | } 461 | 462 | + (BOOL)isGenderEmoji:(NSString *)emojiString { 463 | return [[self GenderEmoji] containsObject:emojiString]; 464 | } 465 | 466 | + (BOOL)isProfessionEmoji:(NSString *)emojiString { 467 | return [[self ProfessionEmoji] containsObject:emojiString]; 468 | } 469 | 470 | + (BOOL)isFlagEmoji:(NSString *)emojiString { 471 | return [[self FlagsEmoji] containsObject:emojiString]; 472 | } 473 | 474 | + (BOOL)isDingbatVariantsEmoji:(NSString *)emojiString { 475 | return [[self DingbatVariantsEmoji] containsObject:emojiString]; 476 | } 477 | 478 | + (BOOL)isCoupleMultiSkinToneEmoji:(NSString *)emojiString { 479 | return [[self CoupleMultiSkinToneEmoji] containsObject:emojiString] || [[self ExtendedCoupleMultiSkinToneEmoji] containsObject:emojiString] || [self isBaseHandshakeOrHandshakeWithSkintonesEmoji:emojiString]; 480 | } 481 | 482 | + (BOOL)isMultiPersonFamilySkinToneEmoji:(NSString *)emojiString { 483 | return [[self MultiPersonFamilySkinToneEmoji] containsObject:emojiString]; 484 | } 485 | 486 | + (NSString *)emojiBaseString:(NSString *)emojiString { 487 | if ([self isProfessionEmoji:emojiString] 488 | || [self isFlagEmoji:emojiString] 489 | || ([self isCoupleMultiSkinToneEmoji:emojiString] && ![self isBaseHandshakeOrHandshakeWithSkintonesEmoji:emojiString]) 490 | || [self isMultiPersonFamilySkinToneEmoji:emojiString]) 491 | return emojiString; 492 | NSInteger multiSkinType = [self multiPersonTypeForString:emojiString]; 493 | if (multiSkinType) { 494 | NSString *joiner = [self joiningStringForCoupleString:emojiString]; 495 | if (joiner == nil || [self isHandholdingCoupleEmoji:emojiString] || [self isBaseHandshakeOrHandshakeWithSkintonesEmoji:emojiString]) { 496 | switch (multiSkinType) { 497 | case PSEmojiMultiSkinTypeFM: 498 | return FM; 499 | case PSEmojiMultiSkinTypeFF: 500 | return FF; 501 | case PSEmojiMultiSkinTypeMM: 502 | return MM; 503 | case PSEmojiMultiSkinTypeNN: 504 | return NN; 505 | case PSEmojiMultiSkinTypeHandshake: 506 | return HANDSHAKE; 507 | } 508 | } else { 509 | if (multiSkinType != PSEmojiMultiSkinTypeNN) { 510 | NSArray *tokens = [self tokenizedMultiPersonFromString:emojiString]; 511 | NSString *leftPerson = [tokens firstObject]; 512 | NSString *rightPerson = [tokens lastObject]; 513 | return [self coupleStringWithLeftPerson:leftPerson leftVariant:nil joiningString:joiner rightPerson:rightPerson rightVariant:nil]; 514 | } else { 515 | if ([joiner isEqualToString:HEART_JOINER]) 516 | return @"💑"; 517 | if ([joiner isEqualToString:HEART_KISS_JOINER]) 518 | return @"💏"; 519 | } 520 | } 521 | } 522 | NSString *baseEmoji = [self professionSkinToneEmojiBaseKey:emojiString]; 523 | if ([self isProfessionEmoji:baseEmoji]) 524 | return baseEmoji; 525 | // Extra 526 | baseEmoji = [baseEmoji stringByReplacingOccurrencesOfString:ZWJ27A1FE0F withString:@""]; 527 | if ([self isProfessionEmoji:baseEmoji]) 528 | return [baseEmoji stringByAppendingString:ZWJ27A1FE0F]; 529 | NSString *baseFirst = [self emojiBaseFirstCharacterString:emojiString]; 530 | if ([self hasGender:emojiString]) { 531 | NSString *variantSelector = [self genderEmojiBaseStringNeedVariantSelector:baseFirst] ? FE0F : @""; 532 | if (containsString(emojiString, FEMALE)) 533 | return [NSString stringWithFormat:@"%@%@%@", baseFirst, variantSelector, ZWJ2640FE0F]; 534 | if (containsString(emojiString, MALE)) 535 | return [NSString stringWithFormat:@"%@%@%@", baseFirst, variantSelector, ZWJ2642FE0F]; 536 | return nil; 537 | } 538 | if ([[self dingbatEmojiBaseStringsNeedVariantSelector] containsObject:baseFirst]) 539 | return [baseFirst stringByAppendingString:FE0F]; 540 | return baseFirst; 541 | } 542 | 543 | + (NSString *)coupleStringWithLeftPerson:(NSString *)leftPerson leftVariant:(NSString *)leftVariant joiningString:(NSString *)joiningString rightPerson:(NSString *)rightPerson rightVariant:(NSString *)rightVariant { 544 | NSString *finalLeftVariant = nil; 545 | NSString *finalRightVariant = nil; 546 | NSString *finalLeftPerson = nil; 547 | NSString *finalRightPerson = nil; 548 | if (leftVariant && leftVariant.length) { 549 | finalLeftPerson = leftPerson; 550 | finalLeftVariant = leftVariant; 551 | } else { 552 | finalLeftPerson = [self emojiBaseString:leftPerson]; 553 | finalLeftVariant = @""; 554 | } 555 | if (rightVariant && rightVariant.length) { 556 | finalRightPerson = rightPerson; 557 | finalRightVariant = rightVariant; 558 | } else { 559 | finalRightPerson = [self emojiBaseString:rightPerson]; 560 | finalRightVariant = @""; 561 | } 562 | return [NSString stringWithFormat:@"%@%@%@%@%@", finalLeftPerson, finalLeftVariant, joiningString, finalRightPerson, finalRightVariant]; 563 | } 564 | 565 | + (NSMutableArray *)skinToneVariantsForMultiPersonType:(PSEmojiMultiSkinType)multiSkinType { 566 | NSMutableArray *variants = [NSMutableArray array]; 567 | for (NSString *leftSkin in [PSEmojiUtilities skinModifiers]) { 568 | for (NSString *rightSkin in [PSEmojiUtilities skinModifiers]) { 569 | if ([leftSkin isEqualToString:rightSkin]) { 570 | NSString *emoji = nil; 571 | switch (multiSkinType) { 572 | case PSEmojiMultiSkinTypeFM: 573 | emoji = FM; 574 | break; 575 | case PSEmojiMultiSkinTypeFF: 576 | emoji = FF; 577 | break; 578 | case PSEmojiMultiSkinTypeMM: 579 | emoji = MM; 580 | break; 581 | case PSEmojiMultiSkinTypeNN: 582 | emoji = NN; 583 | break; 584 | case PSEmojiMultiSkinTypeHandshake: 585 | emoji = HANDSHAKE; 586 | break; 587 | } 588 | if (emoji) 589 | [variants addObject:[NSString stringWithFormat:@"%@%@", emoji, leftSkin]]; 590 | } else { 591 | switch (multiSkinType) { 592 | case PSEmojiMultiSkinTypeFM: 593 | [variants addObject:[NSString stringWithFormat:@"%@%@%@%@%@", WOMAN, leftSkin, HANDSHAKE_JOINER, MAN, rightSkin]]; 594 | break; 595 | case PSEmojiMultiSkinTypeFF: 596 | [variants addObject:[NSString stringWithFormat:@"%@%@%@%@%@", WOMAN, leftSkin, HANDSHAKE_JOINER, WOMAN, rightSkin]]; 597 | break; 598 | case PSEmojiMultiSkinTypeMM: 599 | [variants addObject:[NSString stringWithFormat:@"%@%@%@%@%@", MAN, leftSkin, HANDSHAKE_JOINER, MAN, rightSkin]]; 600 | break; 601 | case PSEmojiMultiSkinTypeNN: 602 | [variants addObjectsFromArray:[self skinToneVariantsForCouple:multiSkinType joiner:HANDSHAKE_JOINER]]; 603 | break; 604 | case PSEmojiMultiSkinTypeHandshake: 605 | [variants addObject:[NSString stringWithFormat:@"%@%@%@%@%@", LEFTHAND, leftSkin, ZWJ, RIGHTHAND, rightSkin]]; 606 | break; 607 | } 608 | } 609 | } 610 | } 611 | return variants; 612 | } 613 | 614 | + (NSMutableArray *)skinToneVariantsForCouple:(PSEmojiMultiSkinType)multiSkinType joiner:(NSString *)joiner { 615 | NSMutableArray *variants = [NSMutableArray array]; 616 | NSString *leftEmoji = nil; 617 | NSString *rightEmoji = nil; 618 | switch (multiSkinType) { 619 | case PSEmojiMultiSkinTypeFM: 620 | leftEmoji = WOMAN; 621 | rightEmoji = MAN; 622 | break; 623 | case PSEmojiMultiSkinTypeFF: 624 | leftEmoji = rightEmoji = WOMAN; 625 | break; 626 | case PSEmojiMultiSkinTypeMM: 627 | leftEmoji = rightEmoji = MAN; 628 | break; 629 | case PSEmojiMultiSkinTypeNN: 630 | leftEmoji = rightEmoji = NEUTRAL; 631 | break; 632 | default: 633 | break; 634 | } 635 | for (NSString *leftSkin in [PSEmojiUtilities skinModifiers]) { 636 | for (NSString *rightSkin in [PSEmojiUtilities skinModifiers]) { 637 | [variants addObject:[self coupleStringWithLeftPerson:leftEmoji leftVariant:leftSkin joiningString:joiner rightPerson:rightEmoji rightVariant:rightSkin]]; 638 | } 639 | } 640 | return variants; 641 | } 642 | 643 | + (NSMutableArray *)skinToneVariantsForString:(NSString *)emojiString withSelf:(BOOL)withSelf { 644 | PSEmojiMultiSkinType multiSkinType = [self multiPersonTypeForString:emojiString]; 645 | if (multiSkinType) { 646 | if (multiSkinType == PSEmojiMultiSkinTypeHandshake) 647 | return [self skinToneVariantsForMultiPersonType:PSEmojiMultiSkinTypeHandshake]; 648 | if ([self isHandholdingCoupleEmoji:emojiString]) 649 | return [self skinToneVariantsForMultiPersonType:multiSkinType]; 650 | NSString *joiner = [self joiningStringForCoupleString:emojiString] ?: HANDSHAKE_JOINER; 651 | return [self skinToneVariantsForCouple:multiSkinType joiner:joiner]; 652 | } 653 | NSString *baseFirst = [self emojiBaseFirstCharacterString:emojiString]; 654 | if (![self isSkinToneEmoji:baseFirst]) return nil; 655 | NSString *base = [self emojiBaseString:emojiString]; 656 | NSMutableArray *skins = [NSMutableArray array]; 657 | NSArray *skinModifiers = [self skinModifiers]; 658 | int index = -1; 659 | while (1) { 660 | NSString *emoji = nil; 661 | if ([self isGenderEmoji:baseFirst]) { 662 | NSString *third = @""; 663 | if (containsString(emojiString, MALE)) third = ZWJ2642FE0F; 664 | else if (containsString(emojiString, FEMALE)) third = ZWJ2640FE0F; 665 | NSString *second = [self genderEmojiBaseStringNeedVariantSelector:baseFirst] ? FE0F : @""; 666 | if (index == -1) 667 | emoji = [NSString stringWithFormat:@"%@%@%@", baseFirst, second, third]; 668 | else 669 | emoji = [NSString stringWithFormat:@"%@%@%@", baseFirst, skinModifiers[index], third]; 670 | if ([emojiString hasSuffix:ZWJ27A1FE0F]) 671 | emoji = [emoji stringByAppendingString:ZWJ27A1FE0F]; 672 | } else { 673 | BOOL isProfessionEmoji = [self isProfessionEmoji:base]; 674 | // Extra 675 | if (!isProfessionEmoji) 676 | isProfessionEmoji = [self isProfessionEmoji:[base stringByReplacingOccurrencesOfString:ZWJ27A1FE0F withString:@""]]; 677 | if (isProfessionEmoji) { 678 | if (index == -1) 679 | emoji = base; 680 | else { 681 | NSRange baseFirstRange = [base rangeOfString:baseFirst options:NSLiteralSearch]; 682 | NSString *out = [NSString stringWithFormat:@"%@%@", baseFirst, skinModifiers[index]]; 683 | emoji = [base stringByReplacingCharactersInRange:baseFirstRange withString:out]; 684 | } 685 | } else { 686 | if (index == -1) { 687 | if ([self isDingbatVariantsEmoji:baseFirst]) 688 | emoji = [NSString stringWithFormat:@"%@%@", baseFirst, FE0F]; 689 | else 690 | emoji = base; 691 | } else 692 | emoji = [NSString stringWithFormat:@"%@%@", baseFirst, skinModifiers[index]]; 693 | } 694 | } 695 | if (index != -1 || withSelf) 696 | [skins addObject:emoji]; 697 | if (++index == 5) break; 698 | } 699 | return skins; 700 | } 701 | 702 | + (NSMutableArray *)skinToneVariantsForString:(NSString *)emojiString { 703 | return [self skinToneVariantsForString:emojiString withSelf:YES]; 704 | } 705 | 706 | + (NSUInteger)hasVariantsForEmoji:(NSString *)emojiString { 707 | NSUInteger variant = PSEmojiTypeRegular; 708 | if (![self isNoneVariantEmoji:emojiString]) { 709 | if ([self isDingbatVariantsEmoji:emojiString]) 710 | variant |= PSEmojiTypeDingbat; 711 | if ([self hasSkinToneVariants:emojiString]) 712 | variant |= PSEmojiTypeSkin; 713 | if ([self isGenderEmoji:emojiString]) { 714 | if (containsString(emojiString, ZWJ2640) || containsString(emojiString, ZWJ2642)) 715 | variant |= PSEmojiTypeGender; 716 | } 717 | if ([self isProfessionEmoji:emojiString]) 718 | variant |= PSEmojiTypeProfession; 719 | } 720 | return variant; 721 | } 722 | 723 | + (BOOL)hasSkinToneVariants:(NSString *)emojiString { 724 | if ([self isMultiPersonFamilySkinToneEmoji:emojiString]) 725 | return NO; 726 | NSString *baseFirst = [self emojiBaseFirstCharacterString:emojiString]; 727 | return [self isSkinToneEmoji:baseFirst] || [self isCoupleMultiSkinToneEmoji:baseFirst]; 728 | } 729 | 730 | + (BOOL)hasDingbat:(NSString *)emojiString { 731 | return emojiString.length && [self isDingbatVariantsEmoji:emojiString]; 732 | } 733 | 734 | #if TARGET_OS_IOS 735 | 736 | #if !__arm64e__ 737 | 738 | + (BOOL)sectionHasSkin:(NSInteger)section { 739 | return section <= PSEmojiCategoryPeople || ((IS_IOS_OR_NEWER(iOS_9_1) && (section == PSEmojiCategoryActivity || section == PSEmojiCategoryObjects)) || (!IS_IOS_OR_NEWER(iOS_9_1) && (section == IDXPSEmojiCategoryActivity || section == IDXPSEmojiCategoryObjects))); 740 | } 741 | 742 | + (NSString *)overrideKBTreeEmoji:(NSString *)emojiString { 743 | if (emojiString.length >= 4) { 744 | NSString *skin = [self getSkin:emojiString]; 745 | if (skin) { 746 | NSString *emojiWithoutSkin = [self changeEmojiSkin:emojiString toSkin:@""]; 747 | NSArray *skins = [self skinToneVariantsForString:emojiWithoutSkin]; 748 | NSUInteger skinIndex = [[self skinModifiers] indexOfObject:skin]; 749 | NSString *result = skins[skinIndex]; 750 | return result; 751 | } 752 | } 753 | return emojiString; 754 | } 755 | 756 | + (UIKeyboardEmojiCollectionViewCell *)collectionView:(UICollectionView *)collectionView_ cellForItemAtIndexPath:(NSIndexPath *)indexPath inputView:(UIKeyboardEmojiCollectionInputView *)inputView { 757 | UIKeyboardEmojiCollectionView *collectionView = (UIKeyboardEmojiCollectionView *)[inputView valueForKey:@"_collectionView"]; 758 | UIKeyboardEmojiCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"kEmojiCellIdentifier" forIndexPath:indexPath]; 759 | if (indexPath.section == 0) { 760 | NSArray *recents = collectionView.inputController.recents; 761 | NSArray *prepopulatedEmojis = [self prepopulatedCategory].emoji; 762 | NSUInteger prepopulatedCount = [(UIKeyboardEmojiGraphicsTraits *)[inputView valueForKey:@"_emojiGraphicsTraits"] prepolulatedRecentCount]; 763 | NSRange range = NSMakeRange(0, prepopulatedCount); 764 | if (recents.count) { 765 | NSUInteger idx = 0; 766 | NSMutableArray *array = [NSMutableArray arrayWithArray:recents]; 767 | if (array.count < prepopulatedCount) { 768 | while (idx < prepopulatedEmojis.count && prepopulatedCount != array.count) { 769 | UIKeyboardEmoji *emoji = prepopulatedEmojis[idx++]; 770 | if (![array containsObject:emoji]) 771 | [array addObject:emoji]; 772 | } 773 | } 774 | cell.emoji = [array subarrayWithRange:range][indexPath.item]; 775 | } else 776 | cell.emoji = [prepopulatedEmojis subarrayWithRange:range][indexPath.item]; 777 | } else { 778 | NSInteger section = indexPath.section; 779 | if (IS_IOS_OR_NEWER(iOS_9_1)) 780 | section = [NSClassFromString(@"UIKeyboardEmojiCategory") categoryTypeForCategoryIndex:section]; 781 | UIKeyboardEmojiCategory *category = [NSClassFromString(@"UIKeyboardEmojiCategory") categoryForType:section]; 782 | NSArray *emojis = category.emoji; 783 | cell.emoji = emojis[indexPath.item]; 784 | if ((cell.emoji.variantMask & PSEmojiTypeSkin) && [PSEmojiUtilities sectionHasSkin:section]) { 785 | NSMutableDictionary *skinPrefs = [collectionView.inputController skinToneBaseKeyPreferences]; 786 | if (skinPrefs) { 787 | NSString *skinned = skinPrefs[[PSEmojiUtilities emojiBaseString:cell.emoji.emojiString]]; 788 | if (skinned) { 789 | cell.emoji.emojiString = skinned; 790 | cell.emoji = cell.emoji; 791 | } 792 | } 793 | } 794 | } 795 | cell.emojiFontSize = [collectionView emojiGraphicsTraits].emojiKeyWidth; 796 | return cell; 797 | } 798 | 799 | + (UIKeyboardEmoji *)emojiWithString:(NSString *)emojiString { 800 | UIKeyboardEmoji *emoji = nil; 801 | Class UIKeyboardEmoji = NSClassFromString(@"UIKeyboardEmoji"); 802 | if ([UIKeyboardEmoji respondsToSelector:@selector(emojiWithString:hasDingbat:)]) 803 | emoji = [UIKeyboardEmoji emojiWithString:emojiString hasDingbat:[self hasDingbat:emojiString]]; 804 | else if ([UIKeyboardEmoji respondsToSelector:@selector(emojiWithString:)]) 805 | emoji = [UIKeyboardEmoji emojiWithString:emojiString]; 806 | else 807 | emoji = [[UIKeyboardEmoji alloc] initWithString:emojiString]; 808 | if ([emoji respondsToSelector:@selector(setSupportsSkin:)]) 809 | emoji.supportsSkin = [self hasSkinToneVariants:emojiString]; 810 | return emoji; 811 | } 812 | 813 | + (UIKeyboardEmoji *)emojiWithString:(NSString *)emojiString withVariantMask:(NSInteger)variantMask { 814 | return [NSClassFromString(@"UIKeyboardEmoji") emojiWithString:emojiString withVariantMask:variantMask]; 815 | } 816 | 817 | + (UIKeyboardEmoji *)emojiWithStringUniversal:(NSString *)emojiString { 818 | if ([NSClassFromString(@"UIKeyboardEmoji") respondsToSelector:@selector(emojiWithString:withVariantMask:)]) 819 | return [self emojiWithString:emojiString withVariantMask:[self hasVariantsForEmoji:emojiString]]; 820 | return [self emojiWithString:emojiString]; 821 | } 822 | 823 | + (void)addEmoji:(NSMutableArray *)emojiArray emojiString:(NSString *)emojiString withVariantMask:(NSInteger)variantMask { 824 | if (emojiString == nil) 825 | return; 826 | UIKeyboardEmoji *emoji = [self emojiWithString:emojiString withVariantMask:variantMask]; 827 | if (emoji) 828 | [emojiArray addObject:emoji]; 829 | } 830 | 831 | + (void)addEmoji:(NSMutableArray *)emojiArray emojiString:(NSString *)emojiString { 832 | if (emojiString == nil) 833 | return; 834 | UIKeyboardEmoji *emoji = [self emojiWithString:emojiString]; 835 | if (emoji) 836 | [emojiArray addObject:emoji]; 837 | } 838 | 839 | + (UIKeyboardEmojiCategory *)prepopulatedCategory { 840 | static UIKeyboardEmojiCategory *category = nil; 841 | static dispatch_once_t onceToken; 842 | dispatch_once(&onceToken, ^{ 843 | category = [[NSClassFromString(@"UIKeyboardEmojiCategory") alloc] init]; 844 | category.categoryType = PSEmojiCategoryPrepopulated; 845 | NSArray *prepopulated = [self PrepopulatedEmoji]; 846 | NSMutableArray *emojis = [NSMutableArray arrayWithCapacity:prepopulated.count]; 847 | for (NSString *emojiString in prepopulated) 848 | [self addEmoji:emojis emojiString:emojiString withVariantMask:[self hasVariantsForEmoji:emojiString]]; 849 | category.emoji = emojis; 850 | }); 851 | return category; 852 | } 853 | 854 | #endif 855 | 856 | + (void)resetEmojiPreferences { 857 | id preferences = nil; 858 | id innerPreferences = nil; 859 | if (NSClassFromString(@"UIKeyboardEmojiPreferences")) { 860 | preferences = innerPreferences = [NSClassFromString(@"UIKeyboardEmojiPreferences") sharedInstance]; 861 | if (IS_IOS_OR_NEWER(iOS_10_2)) 862 | innerPreferences = [preferences valueForKey:@"_preferencesClient"]; 863 | } 864 | else 865 | preferences = innerPreferences = [NSClassFromString(@"UIKeyboardEmojiDefaultsController") sharedController]; 866 | if ([innerPreferences respondsToSelector:@selector(emptyDefaultsDictionary)]) 867 | [innerPreferences setValue:[(UIKeyboardEmojiDefaultsController *)preferences emptyDefaultsDictionary] forKey:@"_defaults"]; 868 | else 869 | [innerPreferences resetEmojiDefaults]; 870 | [innerPreferences setValue:@(YES) forKey:@"_isDefaultDirty"]; 871 | if ([preferences respondsToSelector:@selector(refreshLocalRecents)]) 872 | [(UIKeyboardEmojiPreferences *)preferences refreshLocalRecents]; 873 | [(UIKeyboardEmojiDefaultsController *)preferences writeEmojiDefaults]; 874 | } 875 | 876 | #if !__LP64__ 877 | 878 | + (CGGlyph)emojiGlyphShift:(CGGlyph)glyph { 879 | if (glyph >= 5 && glyph <= 16) // 0 - 9 880 | return glyph + 109; 881 | if (glyph == 4) // # 882 | return glyph + 108; 883 | if (glyph == 44) // * 884 | return glyph + 69; 885 | return glyph; 886 | } 887 | 888 | #endif 889 | 890 | #endif 891 | 892 | @end 893 | -------------------------------------------------------------------------------- /PSEmojiUtilities.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "Header.h" 3 | #import "PSEmojiType.h" 4 | 5 | #define ZWJ @"‍" 6 | #define FE0F @"️" 7 | #define FEMALE @"♀" 8 | #define MALE @"♂" 9 | #define ZWJ2640 @"‍♀" 10 | #define ZWJ2642 @"‍♂" 11 | #define ZWJ2640FE0F @"‍♀️" 12 | #define ZWJ2642FE0F @"‍♂️" 13 | #define ZWJ27A1FE0F @"‍➡️" 14 | #define HANDSHAKE @"🤝" 15 | #define HANDSHAKE_JOINER @"‍🤝‍" 16 | #define LEFTHAND @"🫱" 17 | #define RIGHTHAND @"🫲" 18 | #define HEART_JOINER @"‍❤️‍" 19 | #define HEART_KISS_JOINER @"‍❤️‍💋‍" 20 | #define WOMAN @"👩" 21 | #define MAN @"👨" 22 | #define NEUTRAL @"🧑" 23 | #define FM @"👫" 24 | #define FF @"👭" 25 | #define MM @"👬" 26 | #define NN @"🧑‍🤝‍🧑" 27 | 28 | #define CATEGORIES_COUNT 9 29 | 30 | @interface PSEmojiUtilities : NSObject 31 | @end 32 | 33 | @interface PSEmojiUtilities (Emoji) 34 | 35 | + (NSArray *)PeopleEmoji; 36 | + (NSArray *)NatureEmoji; 37 | + (NSArray *)FoodAndDrinkEmoji; 38 | + (NSArray *)CelebrationEmoji; 39 | + (NSArray *)ActivityEmoji; 40 | + (NSArray *)TravelAndPlacesEmoji; 41 | + (NSArray *)ObjectsEmoji; 42 | + (NSArray *)SymbolsEmoji; 43 | + (NSArray *)FlagsEmoji; 44 | + (NSArray *)OtherFlagsEmoji; 45 | + (NSArray *)DingbatVariantsEmoji; 46 | + (NSArray *)SkinToneEmoji; 47 | + (NSArray *)GenderEmoji; 48 | + (NSArray *)NoneVariantEmoji; 49 | + (NSArray *)ProfessionEmoji; 50 | + (NSArray *)PrepopulatedEmoji; 51 | + (NSArray *)ProfessionWithoutSkinToneEmoji; 52 | + (NSArray *)CoupleMultiSkinToneEmoji; 53 | + (NSArray *)MultiPersonFamilySkinToneEmoji; 54 | + (NSArray *)ExtendedCoupleMultiSkinToneEmoji; 55 | 56 | @end 57 | 58 | @interface PSEmojiUtilities (Functions) 59 | 60 | + (NSArray *)skinModifiers; 61 | + (NSArray *)genderEmojiBaseStringsNeedVariantSelector; 62 | + (NSArray *)dingbatEmojiBaseStringsNeedVariantSelector; 63 | + (NSArray *> *)coupleSkinToneChooserVariantsForString:(NSString *)emojiString; 64 | + (NSArray *> *)skinToneChooserVariantsForString:(NSString *)emojiString; 65 | + (NSArray *> *)skinToneChooserVariantsForString:(NSString *)emojiString usesSilhouetteSpecifiers:(BOOL)silhouette; 66 | + (NSArray *> *)skinToneChooserVariantsForHandHoldingCoupleType:(PSEmojiMultiSkinType)coupleType; 67 | + (NSArray *> *)skinToneChooserArraysForCoupleType:(PSEmojiMultiSkinType)multiSkinType joiner:(NSString *)joiner; 68 | 69 | + (UChar32)firstLongCharacter:(NSString *)string; 70 | 71 | + (NSString *)getGender:(NSString *)emojiString; 72 | + (NSString *)getSkin:(NSString *)emojiString; 73 | + (NSString *)changeEmojiSkin:(NSString *)emojiString toSkin:(NSString *)skin; 74 | + (NSString *)emojiBaseFirstCharacterString:(NSString *)emojiString; 75 | + (NSString *)professionSkinToneEmojiBaseKey:(NSString *)emojiString; 76 | + (NSString *)emojiBaseString:(NSString *)emojiString; 77 | + (NSString *)skinToneSpecifierTypeFromEmojiFitzpatrickModifier:(int)modifier; 78 | + (NSString *)multiPersonStringForString:(NSString *)emojiString skinToneVariantSpecifier:(NSArray *)specifier; 79 | + (NSString *)joiningStringForCoupleString:(NSString *)emojiString; 80 | 81 | + (BOOL)genderEmojiBaseStringNeedVariantSelector:(NSString *)emojiBaseString; 82 | + (BOOL)emojiString:(NSString *)emojiString inGroup:(NSArray *)group; 83 | + (BOOL)hasSkinToneVariants:(NSString *)emojiString; 84 | + (BOOL)hasGender:(NSString *)emojiString; 85 | + (BOOL)hasSkin:(NSString *)emojiString; 86 | + (BOOL)hasDingbat:(NSString *)emojiString; 87 | + (BOOL)isNoneVariantEmoji:(NSString *)emojiString; 88 | + (BOOL)isSkinToneEmoji:(NSString *)emojiString; 89 | + (BOOL)isGenderEmoji:(NSString *)emojiString; 90 | + (BOOL)isProfessionEmoji:(NSString *)emojiString; 91 | + (BOOL)isFlagEmoji:(NSString *)emojiString; 92 | + (BOOL)isDingbatVariantsEmoji:(NSString *)emojiString; 93 | + (BOOL)isCoupleMultiSkinToneEmoji:(NSString *)emojiString; 94 | + (BOOL)isComposedCoupleMultiSkinToneEmoji:(NSString *)emojiString; 95 | + (BOOL)isHandholdingCoupleEmoji:(NSString *)emojiString; 96 | + (BOOL)isBaseHandshakeOrHandshakeWithSkintonesEmoji:(NSString *)emojiString; 97 | + (BOOL)isMultiPersonFamilySkinToneEmoji:(NSString *)emojiString; 98 | + (BOOL)supportsCoupleSkinToneSelection:(NSString *)emojiString; 99 | 100 | + (PSEmojiMultiSkinType)multiPersonTypeForString:(NSString *)emojiString; 101 | + (NSUInteger)hasVariantsForEmoji:(NSString *)emojiString; 102 | 103 | + (NSArray *)tokenizedMultiPersonFromString:(NSString *)emojiString; 104 | + (NSArray *)tokenizedHandshakeFromString:(NSString *)emojiString; 105 | + (NSArray *)skinToneSpecifiersForString:(NSString *)emojiString; 106 | + (NSMutableArray *)skinToneVariantsForCouple:(PSEmojiMultiSkinType)multiSkinType joiner:(NSString *)joiner; 107 | + (NSMutableArray *)skinToneVariantsForString:(NSString *)emojiString; 108 | + (NSMutableArray *)skinToneVariantsForString:(NSString *)emojiString withSelf:(BOOL)withSelf; 109 | 110 | #if TARGET_OS_IOS 111 | 112 | #if !__arm64e__ 113 | 114 | + (NSString *)overrideKBTreeEmoji:(NSString *)emojiString; 115 | 116 | + (BOOL)sectionHasSkin:(NSInteger)section; 117 | 118 | + (UIKeyboardEmojiCollectionViewCell *)collectionView:(UICollectionView *)collectionView_ cellForItemAtIndexPath:(NSIndexPath *)indexPath inputView:(UIKeyboardEmojiCollectionInputView *)inputView; 119 | + (UIKeyboardEmojiCategory *)prepopulatedCategory; 120 | 121 | + (UIKeyboardEmoji *)emojiWithString:(NSString *)emojiString; 122 | + (UIKeyboardEmoji *)emojiWithString:(NSString *)emojiString withVariantMask:(NSInteger)variantMask; 123 | + (UIKeyboardEmoji *)emojiWithStringUniversal:(NSString *)emojiString; 124 | 125 | + (void)addEmoji:(NSMutableArray *)emojiArray emojiString:(NSString *)emojiString withVariantMask:(NSInteger)variantMask; 126 | + (void)addEmoji:(NSMutableArray *)emojiArray emojiString:(NSString *)emojiString; 127 | 128 | #endif 129 | 130 | + (void)resetEmojiPreferences; 131 | 132 | #if !__LP64__ 133 | + (CGGlyph)emojiGlyphShift:(CGGlyph)glyph; 134 | #endif 135 | 136 | #endif 137 | 138 | @end 139 | 140 | #define SoftPSEmojiUtilities NSClassFromString(@"PSEmojiUtilities") 141 | -------------------------------------------------------------------------------- /PSEmojiUtilities.m: -------------------------------------------------------------------------------- 1 | #import "PSEmojiUtilities.h" 2 | 3 | @implementation PSEmojiUtilities 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /buildUniversalLib.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | make clean 6 | make DEBUG=0 7 | cp .theos/obj/libEmojiLibrary.dylib libEmojiLibrary_arm.dylib 8 | make clean 9 | make DEBUG=0 SIMULATOR=1 10 | cp .theos/obj/iphone_simulator/libEmojiLibrary.dylib libEmojiLibrary_pc.dylib 11 | lipo -create libEmojiLibrary_arm.dylib libEmojiLibrary_pc.dylib -output libEmojiLibrary.dylib 12 | rm -f libEmojiLibrary_arm.dylib libEmojiLibrary_pc.dylib 13 | -------------------------------------------------------------------------------- /control: -------------------------------------------------------------------------------- 1 | Package: com.ps.emojilibrary 2 | Name: EmojiLibrary 3 | Version: 1.7.0 4 | Architecture: iphoneos-arm 5 | Description: Master library for PoomSmart's emoji tweaks. 6 | Maintainer: PoomSmart 7 | Author: PoomSmart 8 | Section: Development 9 | Depiction: https://poomsmart.github.io/repo/depictions/emojilibrary.html 10 | SileoDepiction: https://poomsmart.github.io/repo/sileodepictions/emojilibrary.json 11 | Tag: role::developer 12 | -------------------------------------------------------------------------------- /copyResources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | if [ "$EUID" -ne 0 ] 6 | then 7 | echo "This script must be run as root" 8 | exit 1 9 | fi 10 | 11 | if [[ -z $1 ]] 12 | then 13 | echo "Runtime version required" 14 | exit 1 15 | fi 16 | 17 | FOLDER=EmojiFont 18 | 19 | if [[ -z $2 ]] 20 | then 21 | echo "Font must be specified" 22 | exit 1 23 | fi 24 | 25 | if [[ ! -f "${FOLDER}/${2}" ]] 26 | then 27 | echo "Font not found" 28 | exit 1 29 | fi 30 | 31 | FONT="${2}" 32 | UNDERSCORE=0 33 | IS_14=0 34 | 35 | EL_RUNTIME_ROOT=/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS\ ${1}.simruntime/Contents/Resources/RuntimeRoot 36 | 37 | if (( $(echo "$1 >= 8.2" | bc -l) )) 38 | then 39 | if (( $(echo "$1 >= 14.0" | bc -l) )) 40 | then 41 | LOCATION="CoreAddition" 42 | IS_14=1 43 | else 44 | LOCATION="Core" 45 | fi 46 | if (( $(echo "$1 == 8.2" | bc -l) )) 47 | then 48 | UNDERSCORE=1 49 | fi 50 | else 51 | LOCATION="Cache" 52 | fi 53 | 54 | TOUCH="${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/installed" 55 | TTF_2X="${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/AppleColorEmoji@2x.ttf" 56 | TTF_2X_="${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/AppleColorEmoji_2x.ttf" 57 | CCF_2X="${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/AppleColorEmoji@2x.ccf" 58 | TTC_160="${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/AppleColorEmoji-160px.ttc" 59 | TTC_2X="${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/AppleColorEmoji@2x.ttc" 60 | TTF="${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/AppleColorEmoji.ttf" 61 | TTF_="${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/AppleColorEmoji_1x.ttf" 62 | CCF="${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/AppleColorEmoji.ccf" 63 | TTC="${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/AppleColorEmoji.ttc" 64 | 65 | function install { 66 | [[ -f "${TTC_2X}" ]] && mv -v "${TTC_2X}" "${TTC_2X/.ttc/.ttc.bak}" 67 | [[ -f "${TTF_2X}" ]] && mv -v "${TTF_2X}" "${TTF_2X/.ttf/.ttf.bak}" 68 | [[ -f "${CCF_2X}" ]] && mv -v "${CCF_2X}" "${CCF_2X/.ccf/.ccf.bak}" 69 | [[ -f "${TTF_2X_}" ]] && mv -v "${TTF_2X_}" "${TTF_2X_/.ttf/.ttf.bak}" 70 | [[ -f "${TTC_160}" ]] && mv -v "${TTC_160}" "${TTC_160/.ttc/.ttc.bak}" 71 | [[ -f "${TTC}" ]] && mv -v "${TTC}" "${TTC/.ttc/.ttc.bak}" 72 | [[ -f "${TTF}" ]] && mv -v "${TTF}" "${TTF/.ttf/.ttf.bak}" 73 | [[ -f "${TTF_}" ]] && mv -v "${TTF_}" "${TTF_/.ttf/.ttf.bak}" 74 | [[ -f "${CCF}" ]] && mv -v "${CCF}" "${CCF/.ccf/.ccf.bak}" 75 | TARGET_FONT_NAME=${FONT} 76 | if (( $(echo "$UNDERSCORE == 1" | bc -l) )) 77 | then 78 | TARGET_FONT_NAME="${TARGET_FONT_NAME/@/_}" 79 | cp -v "${PWD}/${FOLDER}/${FONT}" "${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/${TARGET_FONT_NAME}" 80 | cp -v "${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/${TARGET_FONT_NAME}" "${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/${TARGET_FONT_NAME/2x/1x}" 81 | else 82 | if [ $IS_14 ] 83 | then 84 | TARGET_FONT_NAME="AppleColorEmoji-160px.ttc" 85 | fi 86 | cp -v "${PWD}/${FOLDER}/${FONT}" "${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/${TARGET_FONT_NAME}" 87 | if [ $IS_14 -ne 1 ] 88 | then 89 | cp -v "${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/${FONT}" "${EL_RUNTIME_ROOT}/System/Library/Fonts/${LOCATION}/${TARGET_FONT_NAME/@2x/}" 90 | fi 91 | fi 92 | touch "${TOUCH}" 93 | } 94 | 95 | if [[ ! -f "${TOUCH}" ]] 96 | then 97 | install 98 | else 99 | if [ $IS_14 ] 100 | then 101 | [[ -f "${TTC_160/.ttc/.ttc.bak}" ]] && mv -v "${TTC_160/.ttc/.ttc.bak}" "${TTC_160}" 102 | else 103 | [[ -f "${TTC_2X/.ttc/.ttc.bak}" ]] && mv -v "${TTC_2X/.ttc/.ttc.bak}" "${TTC_2X}" 104 | [[ -f "${TTF_2X/.ttf/.ttf.bak}" ]] && mv -v "${TTF_2X/.ttf/.ttf.bak}" "${TTF_2X}" 105 | [[ -f "${CCF_2X/.ccf/.ccf.bak}" ]] && mv -v "${CCF_2X/.ccf/.ccf.bak}" "${CCF_2X}" 106 | [[ -f "${TTF_2X_/.ttf/.ttf.bak}" ]] && mv -v "${TTF_2X_/.ttf/.ttf.bak}" "${TTF_2X_}" 107 | [[ -f "${TTC/.ttc/.ttc.bak}" ]] && mv -v "${TTC/.ttc/.ttc.bak}" "${TTC}" 108 | [[ -f "${TTF/.ttf/.ttf.bak}" ]] && mv -v "${TTF/.ttf/.ttf.bak}" "${TTF}" 109 | [[ -f "${TTF_/.ttf/.ttf.bak}" ]] && mv -v "${TTF_/.ttf/.ttf.bak}" "${TTF_}" 110 | [[ -f "${CCF/.ccf/.ccf.bak}" ]] && mv -v "${CCF/.ccf/.ccf.bak}" "${CCF}" 111 | fi 112 | rm -f "${TOUCH}" 113 | install 114 | fi 115 | 116 | # sudo ./copyResource.sh AppleColorEmoji@2x.ttf 117 | -------------------------------------------------------------------------------- /generateHeaders.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | for d in $(find . -type d ! -name .git ! -name .theos ! -name obj ! -name packages ! -name 'Font*' -depth 1) 4 | do 5 | D=${d/\.\//} 6 | cd ${D} 7 | find . -type f -name '*.h' ! -name ${D}.h | sed 's/\.\///g' | sed '/^ *$/d;s/.*/#import "&"/' > ${D}.h 8 | cd .. 9 | done 10 | -------------------------------------------------------------------------------- /install_to_theos.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | mkdir -p $THEOS/lib/iphone/rootless 6 | mkdir -p $THEOS/lib/iphone/roothide 7 | 8 | cp libEmojiLibrary.tbd $THEOS/lib/ 9 | cp libEmojiLibrary.tbd $THEOS/lib/iphone/rootless/ 10 | cp libEmojiLibrary.tbd $THEOS/lib/iphone/roothide/ 11 | 12 | mkdir -p $THEOS/include/EmojiLibrary 13 | 14 | cp *.h $THEOS/include/EmojiLibrary/ 15 | cp -r EmojiFoundation $THEOS/include/EmojiLibrary/ 16 | cp -r EmojiUIKit $THEOS/include/EmojiLibrary/ 17 | -------------------------------------------------------------------------------- /libEmojiLibrary.tbd: -------------------------------------------------------------------------------- 1 | --- !tapi-tbd 2 | tbd-version: 4 3 | targets: [ i386-ios-simulator, x86_64-ios-simulator, armv7-ios, arm64-ios, 4 | arm64e-ios ] 5 | uuids: 6 | - target: i386-ios-simulator 7 | value: CF067CC2-C0A2-3B74-B6FF-15DCE13D9971 8 | - target: x86_64-ios-simulator 9 | value: 9177A39B-418E-3920-B3E3-9CD491853466 10 | - target: armv7-ios 11 | value: 66EA4095-5866-3AF0-A22A-F584F547DB47 12 | - target: arm64-ios 13 | value: 32AFC3E8-FB46-3E4A-B672-5D4724DA350D 14 | - target: arm64e-ios 15 | value: 45F13F0C-1B85-359C-ACF0-6B389E8DE1B3 16 | install-name: '@rpath/libEmojiLibrary.dylib' 17 | current-version: 0 18 | compatibility-version: 0 19 | exports: 20 | - targets: [ armv7-ios, x86_64-ios-simulator, i386-ios-simulator, arm64-ios, 21 | arm64e-ios ] 22 | objc-classes: [ PSEmojiUtilities ] 23 | ... 24 | --------------------------------------------------------------------------------