+
+
diff --git a/app/javascript/mastodon/components/scrollable_list.js b/app/javascript/mastodon/components/scrollable_list.js
index 723dd322b0..ff0540e5de 100644
--- a/app/javascript/mastodon/components/scrollable_list.js
+++ b/app/javascript/mastodon/components/scrollable_list.js
@@ -1,7 +1,7 @@
import React, { PureComponent } from 'react';
import { ScrollContainer } from 'react-router-scroll';
import PropTypes from 'prop-types';
-import IntersectionObserverArticle from './intersection_observer_article';
+import IntersectionObserverArticleContainer from '../containers/intersection_observer_article_container';
import LoadMore from './load_more';
import IntersectionObserverWrapper from '../features/ui/util/intersection_observer_wrapper';
import { throttle } from 'lodash';
@@ -9,6 +9,10 @@ import { List as ImmutableList } from 'immutable';
export default class ScrollableList extends PureComponent {
+ static contextTypes = {
+ router: PropTypes.object,
+ };
+
static propTypes = {
scrollKey: PropTypes.string.isRequired,
onScrollToBottom: PropTypes.func,
@@ -163,7 +167,7 @@ export default class ScrollableList extends PureComponent {
const { children, scrollKey, trackScroll, shouldUpdateScroll, isLoading, hasMore, prepend, emptyMessage } = this.props;
const childrenCount = React.Children.count(children);
- const loadMore =
0 && hasMore} onClick={this.handleLoadMore} />;
+ const loadMore = (hasMore && childrenCount > 0) ? : null;
let scrollableArea = null;
if (isLoading || childrenCount > 0 || !emptyMessage) {
@@ -173,9 +177,16 @@ export default class ScrollableList extends PureComponent {
{prepend}
{React.Children.map(this.props.children, (child, index) => (
-
+
{child}
-
+
))}
{loadMore}
diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js
index b8617018d2..9e65db85c6 100644
--- a/app/javascript/mastodon/components/status.js
+++ b/app/javascript/mastodon/components/status.js
@@ -12,7 +12,7 @@ import StatusContent from './status_content';
import StatusActionBar from './status_action_bar';
import { FormattedMessage } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component';
-import { MediaGallery, VideoPlayer } from '../features/ui/util/async-components';
+import { MediaGallery, Video } from '../features/ui/util/async-components';
// We use the component (and not the container) since we do not want
// to use the progress bar to show download progress
@@ -37,7 +37,7 @@ export default class Status extends ImmutablePureComponent {
onBlock: PropTypes.func,
onEmbed: PropTypes.func,
onHeightChange: PropTypes.func,
- me: PropTypes.number,
+ me: PropTypes.string,
boostModal: PropTypes.bool,
autoPlayGif: PropTypes.bool,
muted: PropTypes.bool,
@@ -73,7 +73,7 @@ export default class Status extends ImmutablePureComponent {
handleAccountClick = (e) => {
if (this.context.router && e.button === 0) {
- const id = Number(e.currentTarget.getAttribute('data-id'));
+ const id = e.currentTarget.getAttribute('data-id');
e.preventDefault();
this.context.router.history.push(`/accounts/${id}`);
}
@@ -91,6 +91,10 @@ export default class Status extends ImmutablePureComponent {
return
;
}
+ handleOpenVideo = startTime => {
+ this.props.onOpenVideo(this.props.status.getIn(['media_attachments', 0]), startTime);
+ }
+
render () {
let media = null;
let statusAvatar;
@@ -130,9 +134,18 @@ export default class Status extends ImmutablePureComponent {
if (status.get('media_attachments').some(item => item.get('type') === 'unknown')) {
} else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {
+ const video = status.getIn(['media_attachments', 0]);
+
media = (
-
- {Component => }
+
+ {Component => }
);
} else {
diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js
index b8f5dbce76..cf9c8fb539 100644
--- a/app/javascript/mastodon/components/status_action_bar.js
+++ b/app/javascript/mastodon/components/status_action_bar.js
@@ -49,7 +49,7 @@ export default class StatusActionBar extends ImmutablePureComponent {
onEmbed: PropTypes.func,
onMuteConversation: PropTypes.func,
onPin: PropTypes.func,
- me: PropTypes.number,
+ me: PropTypes.string,
withDismiss: PropTypes.bool,
intl: PropTypes.object.isRequired,
};
diff --git a/app/javascript/mastodon/containers/card_container.js b/app/javascript/mastodon/containers/card_container.js
new file mode 100644
index 0000000000..11b9f88d4c
--- /dev/null
+++ b/app/javascript/mastodon/containers/card_container.js
@@ -0,0 +1,18 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import Card from '../features/status/components/card';
+import { fromJS } from 'immutable';
+
+export default class CardContainer extends React.PureComponent {
+
+ static propTypes = {
+ locale: PropTypes.string,
+ card: PropTypes.array.isRequired,
+ };
+
+ render () {
+ const { card, ...props } = this.props;
+ return ;
+ }
+
+}
diff --git a/app/javascript/mastodon/containers/intersection_observer_article_container.js b/app/javascript/mastodon/containers/intersection_observer_article_container.js
new file mode 100644
index 0000000000..b6f162199a
--- /dev/null
+++ b/app/javascript/mastodon/containers/intersection_observer_article_container.js
@@ -0,0 +1,17 @@
+import { connect } from 'react-redux';
+import IntersectionObserverArticle from '../components/intersection_observer_article';
+import { setHeight } from '../actions/height_cache';
+
+const makeMapStateToProps = (state, props) => ({
+ cachedHeight: state.getIn(['height_cache', props.saveHeightKey, props.id]),
+});
+
+const mapDispatchToProps = (dispatch) => ({
+
+ onHeightChange (key, id, height) {
+ dispatch(setHeight(key, id, height));
+ },
+
+});
+
+export default connect(makeMapStateToProps, mapDispatchToProps)(IntersectionObserverArticle);
diff --git a/app/javascript/mastodon/containers/media_gallery_container.js b/app/javascript/mastodon/containers/media_gallery_container.js
new file mode 100644
index 0000000000..812c3d4e50
--- /dev/null
+++ b/app/javascript/mastodon/containers/media_gallery_container.js
@@ -0,0 +1,34 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { IntlProvider, addLocaleData } from 'react-intl';
+import { getLocale } from '../locales';
+import MediaGallery from '../components/media_gallery';
+import { fromJS } from 'immutable';
+
+const { localeData, messages } = getLocale();
+addLocaleData(localeData);
+
+export default class MediaGalleryContainer extends React.PureComponent {
+
+ static propTypes = {
+ locale: PropTypes.string.isRequired,
+ media: PropTypes.array.isRequired,
+ };
+
+ handleOpenMedia = () => {}
+
+ render () {
+ const { locale, media, ...props } = this.props;
+
+ return (
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/containers/status_container.js b/app/javascript/mastodon/containers/status_container.js
index 9dff79b725..e8821223da 100644
--- a/app/javascript/mastodon/containers/status_container.js
+++ b/app/javascript/mastodon/containers/status_container.js
@@ -21,7 +21,7 @@ import {
blockAccount,
muteAccount,
} from '../actions/accounts';
-import { muteStatus, unmuteStatus, deleteStatus, setStatusHeight } from '../actions/statuses';
+import { muteStatus, unmuteStatus, deleteStatus } from '../actions/statuses';
import { initReport } from '../actions/reports';
import { openModal } from '../actions/modal';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
@@ -141,10 +141,6 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
}
},
- onHeightChange (status, height) {
- dispatch(setStatusHeight(status.get('id'), height));
- },
-
});
export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Status));
diff --git a/app/javascript/mastodon/containers/video_container.js b/app/javascript/mastodon/containers/video_container.js
new file mode 100644
index 0000000000..2fd353096d
--- /dev/null
+++ b/app/javascript/mastodon/containers/video_container.js
@@ -0,0 +1,26 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { IntlProvider, addLocaleData } from 'react-intl';
+import { getLocale } from '../locales';
+import Video from '../features/video';
+
+const { localeData, messages } = getLocale();
+addLocaleData(localeData);
+
+export default class VideoContainer extends React.PureComponent {
+
+ static propTypes = {
+ locale: PropTypes.string.isRequired,
+ };
+
+ render () {
+ const { locale, ...props } = this.props;
+
+ return (
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/emoji.js b/app/javascript/mastodon/emoji.js
index a41dfdd1d2..d75f6f5982 100644
--- a/app/javascript/mastodon/emoji.js
+++ b/app/javascript/mastodon/emoji.js
@@ -3,24 +3,43 @@ import Trie from 'substring-trie';
const trie = new Trie(Object.keys(unicodeMapping));
-const emojify = str => {
+const assetHost = process.env.CDN_HOST || '';
+
+const emojify = (str, customEmojis = {}) => {
let rtn = '';
for (;;) {
- let match, i = 0;
- while (i < str.length && str[i] !== '<' && !(match = trie.search(str.slice(i)))) {
+ let match, i = 0, tag;
+ while (i < str.length && (tag = '<&'.indexOf(str[i])) === -1 && str[i] !== ':' && !(match = trie.search(str.slice(i)))) {
i += str.codePointAt(i) < 65536 ? 1 : 2;
}
if (i === str.length)
break;
- else if (str[i] === '<') {
- let tagend = str.indexOf('>', i + 1) + 1;
+ else if (tag >= 0) {
+ const tagend = str.indexOf('>;'[tag], i + 1) + 1;
if (!tagend)
break;
rtn += str.slice(0, tagend);
str = str.slice(tagend);
+ } else if (str[i] === ':') {
+ try {
+ // if replacing :shortname: succeed, exit this block with "continue"
+ const closeColon = str.indexOf(':', i + 1) + 1;
+ if (!closeColon) throw null; // no pair of ':'
+ const lt = str.indexOf('<', i + 1);
+ if (!(lt === -1 || lt >= closeColon)) throw null; // tag appeared before closing ':'
+ const shortname = str.slice(i, closeColon);
+ if (shortname in customEmojis) {
+ rtn += str.slice(0, i) + ` `;
+ str = str.slice(closeColon);
+ continue;
+ }
+ } catch (e) {}
+ // replacing :shortname: failed
+ rtn += str.slice(0, i + 1);
+ str = str.slice(i + 1);
} else {
const [filename, shortCode] = unicodeMapping[match];
- rtn += str.slice(0, i) + ` `;
+ rtn += str.slice(0, i) + ` `;
str = str.slice(i + match.length);
}
}
@@ -28,3 +47,26 @@ const emojify = str => {
};
export default emojify;
+
+export const buildCustomEmojis = customEmojis => {
+ const emojis = [];
+
+ customEmojis.forEach(emoji => {
+ const shortcode = emoji.get('shortcode');
+ const url = emoji.get('url');
+ const name = shortcode.replace(':', '');
+
+ emojis.push({
+ id: name,
+ name,
+ short_names: [name],
+ text: '',
+ emoticons: [],
+ keywords: [name],
+ imageUrl: url,
+ custom: true,
+ });
+ });
+
+ return emojis;
+};
diff --git a/app/javascript/mastodon/emoji_map.json b/app/javascript/mastodon/emoji_map.json
new file mode 100644
index 0000000000..13753ba84c
--- /dev/null
+++ b/app/javascript/mastodon/emoji_map.json
@@ -0,0 +1 @@
+{"😀":"1f600","😁":"1f601","😂":"1f602","🤣":"1f923","😃":"1f603","😄":"1f604","😅":"1f605","😆":"1f606","😉":"1f609","😊":"1f60a","😋":"1f60b","😎":"1f60e","😍":"1f60d","😘":"1f618","😗":"1f617","😙":"1f619","😚":"1f61a","☺":"263a","🙂":"1f642","🤗":"1f917","🤩":"1f929","🤔":"1f914","🤨":"1f928","😐":"1f610","😑":"1f611","😶":"1f636","🙄":"1f644","😏":"1f60f","😣":"1f623","😥":"1f625","😮":"1f62e","🤐":"1f910","😯":"1f62f","😪":"1f62a","😫":"1f62b","😴":"1f634","😌":"1f60c","😛":"1f61b","😜":"1f61c","😝":"1f61d","🤤":"1f924","😒":"1f612","😓":"1f613","😔":"1f614","😕":"1f615","🙃":"1f643","🤑":"1f911","😲":"1f632","☹":"2639","🙁":"1f641","😖":"1f616","😞":"1f61e","😟":"1f61f","😤":"1f624","😢":"1f622","😭":"1f62d","😦":"1f626","😧":"1f627","😨":"1f628","😩":"1f629","🤯":"1f92f","😬":"1f62c","😰":"1f630","😱":"1f631","😳":"1f633","🤪":"1f92a","😵":"1f635","😡":"1f621","😠":"1f620","🤬":"1f92c","😷":"1f637","🤒":"1f912","🤕":"1f915","🤢":"1f922","🤮":"1f92e","🤧":"1f927","😇":"1f607","🤠":"1f920","🤡":"1f921","🤥":"1f925","🤫":"1f92b","🤭":"1f92d","🧐":"1f9d0","🤓":"1f913","😈":"1f608","👿":"1f47f","👹":"1f479","👺":"1f47a","💀":"1f480","☠":"2620","👻":"1f47b","👽":"1f47d","👾":"1f47e","🤖":"1f916","💩":"1f4a9","😺":"1f63a","😸":"1f638","😹":"1f639","😻":"1f63b","😼":"1f63c","😽":"1f63d","🙀":"1f640","😿":"1f63f","😾":"1f63e","🙈":"1f648","🙉":"1f649","🙊":"1f64a","👶":"1f476","🧒":"1f9d2","👦":"1f466","👧":"1f467","🧑":"1f9d1","👨":"1f468","👩":"1f469","🧓":"1f9d3","👴":"1f474","👵":"1f475","👮":"1f46e","🕵":"1f575","💂":"1f482","👷":"1f477","🤴":"1f934","👸":"1f478","👳":"1f473","👲":"1f472","🧕":"1f9d5","🧔":"1f9d4","👱":"1f471","🤵":"1f935","👰":"1f470","🤰":"1f930","🤱":"1f931","👼":"1f47c","🎅":"1f385","🤶":"1f936","🧙":"1f9d9","🧚":"1f9da","🧛":"1f9db","🧜":"1f9dc","🧝":"1f9dd","🧞":"1f9de","🧟":"1f9df","🙍":"1f64d","🙎":"1f64e","🙅":"1f645","🙆":"1f646","💁":"1f481","🙋":"1f64b","🙇":"1f647","🤦":"1f926","🤷":"1f937","💆":"1f486","💇":"1f487","🚶":"1f6b6","🏃":"1f3c3","💃":"1f483","🕺":"1f57a","👯":"1f46f","🧖":"1f9d6","🧗":"1f9d7","🧘":"1f9d8","🛀":"1f6c0","🛌":"1f6cc","🕴":"1f574","🗣":"1f5e3","👤":"1f464","👥":"1f465","🤺":"1f93a","🏇":"1f3c7","⛷":"26f7","🏂":"1f3c2","🏌":"1f3cc","🏄":"1f3c4","🚣":"1f6a3","🏊":"1f3ca","⛹":"26f9","🏋":"1f3cb","🚴":"1f6b4","🚵":"1f6b5","🏎":"1f3ce","🏍":"1f3cd","🤸":"1f938","🤼":"1f93c","🤽":"1f93d","🤾":"1f93e","🤹":"1f939","👫":"1f46b","👬":"1f46c","👭":"1f46d","💏":"1f48f","💑":"1f491","👪":"1f46a","🤳":"1f933","💪":"1f4aa","👈":"1f448","👉":"1f449","☝":"261d","👆":"1f446","🖕":"1f595","👇":"1f447","✌":"270c","🤞":"1f91e","🖖":"1f596","🤘":"1f918","🤙":"1f919","🖐":"1f590","✋":"270b","👌":"1f44c","👍":"1f44d","👎":"1f44e","✊":"270a","👊":"1f44a","🤛":"1f91b","🤜":"1f91c","🤚":"1f91a","👋":"1f44b","🤟":"1f91f","✍":"270d","👏":"1f44f","👐":"1f450","🙌":"1f64c","🤲":"1f932","🙏":"1f64f","🤝":"1f91d","💅":"1f485","👂":"1f442","👃":"1f443","👣":"1f463","👀":"1f440","👁":"1f441","🧠":"1f9e0","👅":"1f445","👄":"1f444","💋":"1f48b","💘":"1f498","❤":"2764","💓":"1f493","💔":"1f494","💕":"1f495","💖":"1f496","💗":"1f497","💙":"1f499","💚":"1f49a","💛":"1f49b","🧡":"1f9e1","💜":"1f49c","🖤":"1f5a4","💝":"1f49d","💞":"1f49e","💟":"1f49f","❣":"2763","💌":"1f48c","💤":"1f4a4","💢":"1f4a2","💣":"1f4a3","💥":"1f4a5","💦":"1f4a6","💨":"1f4a8","💫":"1f4ab","💬":"1f4ac","🗨":"1f5e8","🗯":"1f5ef","💭":"1f4ad","🕳":"1f573","👓":"1f453","🕶":"1f576","👔":"1f454","👕":"1f455","👖":"1f456","🧣":"1f9e3","🧤":"1f9e4","🧥":"1f9e5","🧦":"1f9e6","👗":"1f457","👘":"1f458","👙":"1f459","👚":"1f45a","👛":"1f45b","👜":"1f45c","👝":"1f45d","🛍":"1f6cd","🎒":"1f392","👞":"1f45e","👟":"1f45f","👠":"1f460","👡":"1f461","👢":"1f462","👑":"1f451","👒":"1f452","🎩":"1f3a9","🎓":"1f393","🧢":"1f9e2","⛑":"26d1","📿":"1f4ff","💄":"1f484","💍":"1f48d","💎":"1f48e","🐵":"1f435","🐒":"1f412","🦍":"1f98d","🐶":"1f436","🐕":"1f415","🐩":"1f429","🐺":"1f43a","🦊":"1f98a","🐱":"1f431","🐈":"1f408","🦁":"1f981","🐯":"1f42f","🐅":"1f405","🐆":"1f406","🐴":"1f434","🐎":"1f40e","🦄":"1f984","🦓":"1f993","🦌":"1f98c","🐮":"1f42e","🐂":"1f402","🐃":"1f403","🐄":"1f404","🐷":"1f437","🐖":"1f416","🐗":"1f417","🐽":"1f43d","🐏":"1f40f","🐑":"1f411","🐐":"1f410","🐪":"1f42a","🐫":"1f42b","🦒":"1f992","🐘":"1f418","🦏":"1f98f","🐭":"1f42d","🐁":"1f401","🐀":"1f400","🐹":"1f439","🐰":"1f430","🐇":"1f407","🐿":"1f43f","🦔":"1f994","🦇":"1f987","🐻":"1f43b","🐨":"1f428","🐼":"1f43c","🐾":"1f43e","🦃":"1f983","🐔":"1f414","🐓":"1f413","🐣":"1f423","🐤":"1f424","🐥":"1f425","🐦":"1f426","🐧":"1f427","🕊":"1f54a","🦅":"1f985","🦆":"1f986","🦉":"1f989","🐸":"1f438","🐊":"1f40a","🐢":"1f422","🦎":"1f98e","🐍":"1f40d","🐲":"1f432","🐉":"1f409","🦕":"1f995","🦖":"1f996","🐳":"1f433","🐋":"1f40b","🐬":"1f42c","🐟":"1f41f","🐠":"1f420","🐡":"1f421","🦈":"1f988","🐙":"1f419","🐚":"1f41a","🦀":"1f980","🦐":"1f990","🦑":"1f991","🐌":"1f40c","🦋":"1f98b","🐛":"1f41b","🐜":"1f41c","🐝":"1f41d","🐞":"1f41e","🦗":"1f997","🕷":"1f577","🕸":"1f578","🦂":"1f982","💐":"1f490","🌸":"1f338","💮":"1f4ae","🏵":"1f3f5","🌹":"1f339","🥀":"1f940","🌺":"1f33a","🌻":"1f33b","🌼":"1f33c","🌷":"1f337","🌱":"1f331","🌲":"1f332","🌳":"1f333","🌴":"1f334","🌵":"1f335","🌾":"1f33e","🌿":"1f33f","☘":"2618","🍀":"1f340","🍁":"1f341","🍂":"1f342","🍃":"1f343","🍇":"1f347","🍈":"1f348","🍉":"1f349","🍊":"1f34a","🍋":"1f34b","🍌":"1f34c","🍍":"1f34d","🍎":"1f34e","🍏":"1f34f","🍐":"1f350","🍑":"1f351","🍒":"1f352","🍓":"1f353","🥝":"1f95d","🍅":"1f345","🥥":"1f965","🥑":"1f951","🍆":"1f346","🥔":"1f954","🥕":"1f955","🌽":"1f33d","🌶":"1f336","🥒":"1f952","🥦":"1f966","🍄":"1f344","🥜":"1f95c","🌰":"1f330","🍞":"1f35e","🥐":"1f950","🥖":"1f956","🥨":"1f968","🥞":"1f95e","🧀":"1f9c0","🍖":"1f356","🍗":"1f357","🥩":"1f969","🥓":"1f953","🍔":"1f354","🍟":"1f35f","🍕":"1f355","🌭":"1f32d","🥪":"1f96a","🌮":"1f32e","🌯":"1f32f","🥙":"1f959","🥚":"1f95a","🍳":"1f373","🥘":"1f958","🍲":"1f372","🥣":"1f963","🥗":"1f957","🍿":"1f37f","🥫":"1f96b","🍱":"1f371","🍘":"1f358","🍙":"1f359","🍚":"1f35a","🍛":"1f35b","🍜":"1f35c","🍝":"1f35d","🍠":"1f360","🍢":"1f362","🍣":"1f363","🍤":"1f364","🍥":"1f365","🍡":"1f361","🥟":"1f95f","🥠":"1f960","🥡":"1f961","🍦":"1f366","🍧":"1f367","🍨":"1f368","🍩":"1f369","🍪":"1f36a","🎂":"1f382","🍰":"1f370","🥧":"1f967","🍫":"1f36b","🍬":"1f36c","🍭":"1f36d","🍮":"1f36e","🍯":"1f36f","🍼":"1f37c","🥛":"1f95b","☕":"2615","🍵":"1f375","🍶":"1f376","🍾":"1f37e","🍷":"1f377","🍸":"1f378","🍹":"1f379","🍺":"1f37a","🍻":"1f37b","🥂":"1f942","🥃":"1f943","🥤":"1f964","🥢":"1f962","🍽":"1f37d","🍴":"1f374","🥄":"1f944","🔪":"1f52a","🏺":"1f3fa","🌍":"1f30d","🌎":"1f30e","🌏":"1f30f","🌐":"1f310","🗺":"1f5fa","🗾":"1f5fe","🏔":"1f3d4","⛰":"26f0","🌋":"1f30b","🗻":"1f5fb","🏕":"1f3d5","🏖":"1f3d6","🏜":"1f3dc","🏝":"1f3dd","🏞":"1f3de","🏟":"1f3df","🏛":"1f3db","🏗":"1f3d7","🏘":"1f3d8","🏙":"1f3d9","🏚":"1f3da","🏠":"1f3e0","🏡":"1f3e1","🏢":"1f3e2","🏣":"1f3e3","🏤":"1f3e4","🏥":"1f3e5","🏦":"1f3e6","🏨":"1f3e8","🏩":"1f3e9","🏪":"1f3ea","🏫":"1f3eb","🏬":"1f3ec","🏭":"1f3ed","🏯":"1f3ef","🏰":"1f3f0","💒":"1f492","🗼":"1f5fc","🗽":"1f5fd","⛪":"26ea","🕌":"1f54c","🕍":"1f54d","⛩":"26e9","🕋":"1f54b","⛲":"26f2","⛺":"26fa","🌁":"1f301","🌃":"1f303","🌄":"1f304","🌅":"1f305","🌆":"1f306","🌇":"1f307","🌉":"1f309","♨":"2668","🌌":"1f30c","🎠":"1f3a0","🎡":"1f3a1","🎢":"1f3a2","💈":"1f488","🎪":"1f3aa","🎭":"1f3ad","🖼":"1f5bc","🎨":"1f3a8","🎰":"1f3b0","🚂":"1f682","🚃":"1f683","🚄":"1f684","🚅":"1f685","🚆":"1f686","🚇":"1f687","🚈":"1f688","🚉":"1f689","🚊":"1f68a","🚝":"1f69d","🚞":"1f69e","🚋":"1f68b","🚌":"1f68c","🚍":"1f68d","🚎":"1f68e","🚐":"1f690","🚑":"1f691","🚒":"1f692","🚓":"1f693","🚔":"1f694","🚕":"1f695","🚖":"1f696","🚗":"1f697","🚘":"1f698","🚙":"1f699","🚚":"1f69a","🚛":"1f69b","🚜":"1f69c","🚲":"1f6b2","🛴":"1f6f4","🛵":"1f6f5","🚏":"1f68f","🛣":"1f6e3","🛤":"1f6e4","⛽":"26fd","🚨":"1f6a8","🚥":"1f6a5","🚦":"1f6a6","🚧":"1f6a7","🛑":"1f6d1","⚓":"2693","⛵":"26f5","🛶":"1f6f6","🚤":"1f6a4","🛳":"1f6f3","⛴":"26f4","🛥":"1f6e5","🚢":"1f6a2","✈":"2708","🛩":"1f6e9","🛫":"1f6eb","🛬":"1f6ec","💺":"1f4ba","🚁":"1f681","🚟":"1f69f","🚠":"1f6a0","🚡":"1f6a1","🛰":"1f6f0","🚀":"1f680","🛸":"1f6f8","🛎":"1f6ce","🚪":"1f6aa","🛏":"1f6cf","🛋":"1f6cb","🚽":"1f6bd","🚿":"1f6bf","🛁":"1f6c1","⌛":"231b","⏳":"23f3","⌚":"231a","⏰":"23f0","⏱":"23f1","⏲":"23f2","🕰":"1f570","🕛":"1f55b","🕧":"1f567","🕐":"1f550","🕜":"1f55c","🕑":"1f551","🕝":"1f55d","🕒":"1f552","🕞":"1f55e","🕓":"1f553","🕟":"1f55f","🕔":"1f554","🕠":"1f560","🕕":"1f555","🕡":"1f561","🕖":"1f556","🕢":"1f562","🕗":"1f557","🕣":"1f563","🕘":"1f558","🕤":"1f564","🕙":"1f559","🕥":"1f565","🕚":"1f55a","🕦":"1f566","🌑":"1f311","🌒":"1f312","🌓":"1f313","🌔":"1f314","🌕":"1f315","🌖":"1f316","🌗":"1f317","🌘":"1f318","🌙":"1f319","🌚":"1f31a","🌛":"1f31b","🌜":"1f31c","🌡":"1f321","☀":"2600","🌝":"1f31d","🌞":"1f31e","⭐":"2b50","🌟":"1f31f","🌠":"1f320","☁":"2601","⛅":"26c5","⛈":"26c8","🌤":"1f324","🌥":"1f325","🌦":"1f326","🌧":"1f327","🌨":"1f328","🌩":"1f329","🌪":"1f32a","🌫":"1f32b","🌬":"1f32c","🌀":"1f300","🌈":"1f308","🌂":"1f302","☂":"2602","☔":"2614","⛱":"26f1","⚡":"26a1","❄":"2744","☃":"2603","⛄":"26c4","☄":"2604","🔥":"1f525","💧":"1f4a7","🌊":"1f30a","🎃":"1f383","🎄":"1f384","🎆":"1f386","🎇":"1f387","✨":"2728","🎈":"1f388","🎉":"1f389","🎊":"1f38a","🎋":"1f38b","🎍":"1f38d","🎎":"1f38e","🎏":"1f38f","🎐":"1f390","🎑":"1f391","🎀":"1f380","🎁":"1f381","🎗":"1f397","🎟":"1f39f","🎫":"1f3ab","🎖":"1f396","🏆":"1f3c6","🏅":"1f3c5","🥇":"1f947","🥈":"1f948","🥉":"1f949","⚽":"26bd","⚾":"26be","🏀":"1f3c0","🏐":"1f3d0","🏈":"1f3c8","🏉":"1f3c9","🎾":"1f3be","🎱":"1f3b1","🎳":"1f3b3","🏏":"1f3cf","🏑":"1f3d1","🏒":"1f3d2","🏓":"1f3d3","🏸":"1f3f8","🥊":"1f94a","🥋":"1f94b","🥅":"1f945","🎯":"1f3af","⛳":"26f3","⛸":"26f8","🎣":"1f3a3","🎽":"1f3bd","🎿":"1f3bf","🛷":"1f6f7","🥌":"1f94c","🎮":"1f3ae","🕹":"1f579","🎲":"1f3b2","♠":"2660","♥":"2665","♦":"2666","♣":"2663","🃏":"1f0cf","🀄":"1f004","🎴":"1f3b4","🔇":"1f507","🔈":"1f508","🔉":"1f509","🔊":"1f50a","📢":"1f4e2","📣":"1f4e3","📯":"1f4ef","🔔":"1f514","🔕":"1f515","🎼":"1f3bc","🎵":"1f3b5","🎶":"1f3b6","🎙":"1f399","🎚":"1f39a","🎛":"1f39b","🎤":"1f3a4","🎧":"1f3a7","📻":"1f4fb","🎷":"1f3b7","🎸":"1f3b8","🎹":"1f3b9","🎺":"1f3ba","🎻":"1f3bb","🥁":"1f941","📱":"1f4f1","📲":"1f4f2","☎":"260e","📞":"1f4de","📟":"1f4df","📠":"1f4e0","🔋":"1f50b","🔌":"1f50c","💻":"1f4bb","🖥":"1f5a5","🖨":"1f5a8","⌨":"2328","🖱":"1f5b1","🖲":"1f5b2","💽":"1f4bd","💾":"1f4be","💿":"1f4bf","📀":"1f4c0","🎥":"1f3a5","🎞":"1f39e","📽":"1f4fd","🎬":"1f3ac","📺":"1f4fa","📷":"1f4f7","📸":"1f4f8","📹":"1f4f9","📼":"1f4fc","🔍":"1f50d","🔎":"1f50e","🔬":"1f52c","🔭":"1f52d","📡":"1f4e1","🕯":"1f56f","💡":"1f4a1","🔦":"1f526","🏮":"1f3ee","📔":"1f4d4","📕":"1f4d5","📖":"1f4d6","📗":"1f4d7","📘":"1f4d8","📙":"1f4d9","📚":"1f4da","📓":"1f4d3","📒":"1f4d2","📃":"1f4c3","📜":"1f4dc","📄":"1f4c4","📰":"1f4f0","🗞":"1f5de","📑":"1f4d1","🔖":"1f516","🏷":"1f3f7","💰":"1f4b0","💴":"1f4b4","💵":"1f4b5","💶":"1f4b6","💷":"1f4b7","💸":"1f4b8","💳":"1f4b3","💹":"1f4b9","💱":"1f4b1","💲":"1f4b2","✉":"2709","📧":"1f4e7","📨":"1f4e8","📩":"1f4e9","📤":"1f4e4","📥":"1f4e5","📦":"1f4e6","📫":"1f4eb","📪":"1f4ea","📬":"1f4ec","📭":"1f4ed","📮":"1f4ee","🗳":"1f5f3","✏":"270f","✒":"2712","🖋":"1f58b","🖊":"1f58a","🖌":"1f58c","🖍":"1f58d","📝":"1f4dd","💼":"1f4bc","📁":"1f4c1","📂":"1f4c2","🗂":"1f5c2","📅":"1f4c5","📆":"1f4c6","🗒":"1f5d2","🗓":"1f5d3","📇":"1f4c7","📈":"1f4c8","📉":"1f4c9","📊":"1f4ca","📋":"1f4cb","📌":"1f4cc","📍":"1f4cd","📎":"1f4ce","🖇":"1f587","📏":"1f4cf","📐":"1f4d0","✂":"2702","🗃":"1f5c3","🗄":"1f5c4","🗑":"1f5d1","🔒":"1f512","🔓":"1f513","🔏":"1f50f","🔐":"1f510","🔑":"1f511","🗝":"1f5dd","🔨":"1f528","⛏":"26cf","⚒":"2692","🛠":"1f6e0","🗡":"1f5e1","⚔":"2694","🔫":"1f52b","🏹":"1f3f9","🛡":"1f6e1","🔧":"1f527","🔩":"1f529","⚙":"2699","🗜":"1f5dc","⚗":"2697","⚖":"2696","🔗":"1f517","⛓":"26d3","💉":"1f489","💊":"1f48a","🚬":"1f6ac","⚰":"26b0","⚱":"26b1","🗿":"1f5ff","🛢":"1f6e2","🔮":"1f52e","🛒":"1f6d2","🏧":"1f3e7","🚮":"1f6ae","🚰":"1f6b0","♿":"267f","🚹":"1f6b9","🚺":"1f6ba","🚻":"1f6bb","🚼":"1f6bc","🚾":"1f6be","🛂":"1f6c2","🛃":"1f6c3","🛄":"1f6c4","🛅":"1f6c5","⚠":"26a0","🚸":"1f6b8","⛔":"26d4","🚫":"1f6ab","🚳":"1f6b3","🚭":"1f6ad","🚯":"1f6af","🚱":"1f6b1","🚷":"1f6b7","📵":"1f4f5","🔞":"1f51e","☢":"2622","☣":"2623","⬆":"2b06","↗":"2197","➡":"27a1","↘":"2198","⬇":"2b07","↙":"2199","⬅":"2b05","↖":"2196","↕":"2195","↔":"2194","↩":"21a9","↪":"21aa","⤴":"2934","⤵":"2935","🔃":"1f503","🔄":"1f504","🔙":"1f519","🔚":"1f51a","🔛":"1f51b","🔜":"1f51c","🔝":"1f51d","🛐":"1f6d0","⚛":"269b","🕉":"1f549","✡":"2721","☸":"2638","☯":"262f","✝":"271d","☦":"2626","☪":"262a","☮":"262e","🕎":"1f54e","🔯":"1f52f","♈":"2648","♉":"2649","♊":"264a","♋":"264b","♌":"264c","♍":"264d","♎":"264e","♏":"264f","♐":"2650","♑":"2651","♒":"2652","♓":"2653","⛎":"26ce","🔀":"1f500","🔁":"1f501","🔂":"1f502","▶":"25b6","⏩":"23e9","⏭":"23ed","⏯":"23ef","◀":"25c0","⏪":"23ea","⏮":"23ee","🔼":"1f53c","⏫":"23eb","🔽":"1f53d","⏬":"23ec","⏸":"23f8","⏹":"23f9","⏺":"23fa","⏏":"23cf","🎦":"1f3a6","🔅":"1f505","🔆":"1f506","📶":"1f4f6","📳":"1f4f3","📴":"1f4f4","♀":"2640","♂":"2642","⚕":"2695","♻":"267b","⚜":"269c","🔱":"1f531","📛":"1f4db","🔰":"1f530","⭕":"2b55","✅":"2705","☑":"2611","✔":"2714","✖":"2716","❌":"274c","❎":"274e","➕":"2795","➖":"2796","➗":"2797","➰":"27b0","➿":"27bf","〽":"303d","✳":"2733","✴":"2734","❇":"2747","‼":"203c","⁉":"2049","❓":"2753","❔":"2754","❕":"2755","❗":"2757","〰":"3030","©":"a9","®":"ae","™":"2122","🔟":"1f51f","💯":"1f4af","🔠":"1f520","🔡":"1f521","🔢":"1f522","🔣":"1f523","🔤":"1f524","🅰":"1f170","🆎":"1f18e","🅱":"1f171","🆑":"1f191","🆒":"1f192","🆓":"1f193","ℹ":"2139","🆔":"1f194","Ⓜ":"24c2","🆕":"1f195","🆖":"1f196","🅾":"1f17e","🆗":"1f197","🅿":"1f17f","🆘":"1f198","🆙":"1f199","🆚":"1f19a","🈁":"1f201","🈂":"1f202","🈷":"1f237","🈶":"1f236","🈯":"1f22f","🉐":"1f250","🈹":"1f239","🈚":"1f21a","🈲":"1f232","🉑":"1f251","🈸":"1f238","🈴":"1f234","🈳":"1f233","㊗":"3297","㊙":"3299","🈺":"1f23a","🈵":"1f235","▪":"25aa","▫":"25ab","◻":"25fb","◼":"25fc","◽":"25fd","◾":"25fe","⬛":"2b1b","⬜":"2b1c","🔶":"1f536","🔷":"1f537","🔸":"1f538","🔹":"1f539","🔺":"1f53a","🔻":"1f53b","💠":"1f4a0","🔘":"1f518","🔲":"1f532","🔳":"1f533","⚪":"26aa","⚫":"26ab","🔴":"1f534","🔵":"1f535","🏁":"1f3c1","🚩":"1f6a9","🎌":"1f38c","🏴":"1f3f4","🏳":"1f3f3","☺️":"263a","☹️":"2639","☠️":"2620","👶🏻":"1f476-1f3fb","👶🏼":"1f476-1f3fc","👶🏽":"1f476-1f3fd","👶🏾":"1f476-1f3fe","👶🏿":"1f476-1f3ff","🧒🏻":"1f9d2-1f3fb","🧒🏼":"1f9d2-1f3fc","🧒🏽":"1f9d2-1f3fd","🧒🏾":"1f9d2-1f3fe","🧒🏿":"1f9d2-1f3ff","👦🏻":"1f466-1f3fb","👦🏼":"1f466-1f3fc","👦🏽":"1f466-1f3fd","👦🏾":"1f466-1f3fe","👦🏿":"1f466-1f3ff","👧🏻":"1f467-1f3fb","👧🏼":"1f467-1f3fc","👧🏽":"1f467-1f3fd","👧🏾":"1f467-1f3fe","👧🏿":"1f467-1f3ff","🧑🏻":"1f9d1-1f3fb","🧑🏼":"1f9d1-1f3fc","🧑🏽":"1f9d1-1f3fd","🧑🏾":"1f9d1-1f3fe","🧑🏿":"1f9d1-1f3ff","👨🏻":"1f468-1f3fb","👨🏼":"1f468-1f3fc","👨🏽":"1f468-1f3fd","👨🏾":"1f468-1f3fe","👨🏿":"1f468-1f3ff","👩🏻":"1f469-1f3fb","👩🏼":"1f469-1f3fc","👩🏽":"1f469-1f3fd","👩🏾":"1f469-1f3fe","👩🏿":"1f469-1f3ff","🧓🏻":"1f9d3-1f3fb","🧓🏼":"1f9d3-1f3fc","🧓🏽":"1f9d3-1f3fd","🧓🏾":"1f9d3-1f3fe","🧓🏿":"1f9d3-1f3ff","👴🏻":"1f474-1f3fb","👴🏼":"1f474-1f3fc","👴🏽":"1f474-1f3fd","👴🏾":"1f474-1f3fe","👴🏿":"1f474-1f3ff","👵🏻":"1f475-1f3fb","👵🏼":"1f475-1f3fc","👵🏽":"1f475-1f3fd","👵🏾":"1f475-1f3fe","👵🏿":"1f475-1f3ff","👮🏻":"1f46e-1f3fb","👮🏼":"1f46e-1f3fc","👮🏽":"1f46e-1f3fd","👮🏾":"1f46e-1f3fe","👮🏿":"1f46e-1f3ff","🕵️":"1f575","🕵🏻":"1f575-1f3fb","🕵🏼":"1f575-1f3fc","🕵🏽":"1f575-1f3fd","🕵🏾":"1f575-1f3fe","🕵🏿":"1f575-1f3ff","💂🏻":"1f482-1f3fb","💂🏼":"1f482-1f3fc","💂🏽":"1f482-1f3fd","💂🏾":"1f482-1f3fe","💂🏿":"1f482-1f3ff","👷🏻":"1f477-1f3fb","👷🏼":"1f477-1f3fc","👷🏽":"1f477-1f3fd","👷🏾":"1f477-1f3fe","👷🏿":"1f477-1f3ff","🤴🏻":"1f934-1f3fb","🤴🏼":"1f934-1f3fc","🤴🏽":"1f934-1f3fd","🤴🏾":"1f934-1f3fe","🤴🏿":"1f934-1f3ff","👸🏻":"1f478-1f3fb","👸🏼":"1f478-1f3fc","👸🏽":"1f478-1f3fd","👸🏾":"1f478-1f3fe","👸🏿":"1f478-1f3ff","👳🏻":"1f473-1f3fb","👳🏼":"1f473-1f3fc","👳🏽":"1f473-1f3fd","👳🏾":"1f473-1f3fe","👳🏿":"1f473-1f3ff","👲🏻":"1f472-1f3fb","👲🏼":"1f472-1f3fc","👲🏽":"1f472-1f3fd","👲🏾":"1f472-1f3fe","👲🏿":"1f472-1f3ff","🧕🏻":"1f9d5-1f3fb","🧕🏼":"1f9d5-1f3fc","🧕🏽":"1f9d5-1f3fd","🧕🏾":"1f9d5-1f3fe","🧕🏿":"1f9d5-1f3ff","🧔🏻":"1f9d4-1f3fb","🧔🏼":"1f9d4-1f3fc","🧔🏽":"1f9d4-1f3fd","🧔🏾":"1f9d4-1f3fe","🧔🏿":"1f9d4-1f3ff","👱🏻":"1f471-1f3fb","👱🏼":"1f471-1f3fc","👱🏽":"1f471-1f3fd","👱🏾":"1f471-1f3fe","👱🏿":"1f471-1f3ff","🤵🏻":"1f935-1f3fb","🤵🏼":"1f935-1f3fc","🤵🏽":"1f935-1f3fd","🤵🏾":"1f935-1f3fe","🤵🏿":"1f935-1f3ff","👰🏻":"1f470-1f3fb","👰🏼":"1f470-1f3fc","👰🏽":"1f470-1f3fd","👰🏾":"1f470-1f3fe","👰🏿":"1f470-1f3ff","🤰🏻":"1f930-1f3fb","🤰🏼":"1f930-1f3fc","🤰🏽":"1f930-1f3fd","🤰🏾":"1f930-1f3fe","🤰🏿":"1f930-1f3ff","🤱🏻":"1f931-1f3fb","🤱🏼":"1f931-1f3fc","🤱🏽":"1f931-1f3fd","🤱🏾":"1f931-1f3fe","🤱🏿":"1f931-1f3ff","👼🏻":"1f47c-1f3fb","👼🏼":"1f47c-1f3fc","👼🏽":"1f47c-1f3fd","👼🏾":"1f47c-1f3fe","👼🏿":"1f47c-1f3ff","🎅🏻":"1f385-1f3fb","🎅🏼":"1f385-1f3fc","🎅🏽":"1f385-1f3fd","🎅🏾":"1f385-1f3fe","🎅🏿":"1f385-1f3ff","🤶🏻":"1f936-1f3fb","🤶🏼":"1f936-1f3fc","🤶🏽":"1f936-1f3fd","🤶🏾":"1f936-1f3fe","🤶🏿":"1f936-1f3ff","🧙🏻":"1f9d9-1f3fb","🧙🏼":"1f9d9-1f3fc","🧙🏽":"1f9d9-1f3fd","🧙🏾":"1f9d9-1f3fe","🧙🏿":"1f9d9-1f3ff","🧚🏻":"1f9da-1f3fb","🧚🏼":"1f9da-1f3fc","🧚🏽":"1f9da-1f3fd","🧚🏾":"1f9da-1f3fe","🧚🏿":"1f9da-1f3ff","🧛🏻":"1f9db-1f3fb","🧛🏼":"1f9db-1f3fc","🧛🏽":"1f9db-1f3fd","🧛🏾":"1f9db-1f3fe","🧛🏿":"1f9db-1f3ff","🧜🏻":"1f9dc-1f3fb","🧜🏼":"1f9dc-1f3fc","🧜🏽":"1f9dc-1f3fd","🧜🏾":"1f9dc-1f3fe","🧜🏿":"1f9dc-1f3ff","🧝🏻":"1f9dd-1f3fb","🧝🏼":"1f9dd-1f3fc","🧝🏽":"1f9dd-1f3fd","🧝🏾":"1f9dd-1f3fe","🧝🏿":"1f9dd-1f3ff","🙍🏻":"1f64d-1f3fb","🙍🏼":"1f64d-1f3fc","🙍🏽":"1f64d-1f3fd","🙍🏾":"1f64d-1f3fe","🙍🏿":"1f64d-1f3ff","🙎🏻":"1f64e-1f3fb","🙎🏼":"1f64e-1f3fc","🙎🏽":"1f64e-1f3fd","🙎🏾":"1f64e-1f3fe","🙎🏿":"1f64e-1f3ff","🙅🏻":"1f645-1f3fb","🙅🏼":"1f645-1f3fc","🙅🏽":"1f645-1f3fd","🙅🏾":"1f645-1f3fe","🙅🏿":"1f645-1f3ff","🙆🏻":"1f646-1f3fb","🙆🏼":"1f646-1f3fc","🙆🏽":"1f646-1f3fd","🙆🏾":"1f646-1f3fe","🙆🏿":"1f646-1f3ff","💁🏻":"1f481-1f3fb","💁🏼":"1f481-1f3fc","💁🏽":"1f481-1f3fd","💁🏾":"1f481-1f3fe","💁🏿":"1f481-1f3ff","🙋🏻":"1f64b-1f3fb","🙋🏼":"1f64b-1f3fc","🙋🏽":"1f64b-1f3fd","🙋🏾":"1f64b-1f3fe","🙋🏿":"1f64b-1f3ff","🙇🏻":"1f647-1f3fb","🙇🏼":"1f647-1f3fc","🙇🏽":"1f647-1f3fd","🙇🏾":"1f647-1f3fe","🙇🏿":"1f647-1f3ff","🤦🏻":"1f926-1f3fb","🤦🏼":"1f926-1f3fc","🤦🏽":"1f926-1f3fd","🤦🏾":"1f926-1f3fe","🤦🏿":"1f926-1f3ff","🤷🏻":"1f937-1f3fb","🤷🏼":"1f937-1f3fc","🤷🏽":"1f937-1f3fd","🤷🏾":"1f937-1f3fe","🤷🏿":"1f937-1f3ff","💆🏻":"1f486-1f3fb","💆🏼":"1f486-1f3fc","💆🏽":"1f486-1f3fd","💆🏾":"1f486-1f3fe","💆🏿":"1f486-1f3ff","💇🏻":"1f487-1f3fb","💇🏼":"1f487-1f3fc","💇🏽":"1f487-1f3fd","💇🏾":"1f487-1f3fe","💇🏿":"1f487-1f3ff","🚶🏻":"1f6b6-1f3fb","🚶🏼":"1f6b6-1f3fc","🚶🏽":"1f6b6-1f3fd","🚶🏾":"1f6b6-1f3fe","🚶🏿":"1f6b6-1f3ff","🏃🏻":"1f3c3-1f3fb","🏃🏼":"1f3c3-1f3fc","🏃🏽":"1f3c3-1f3fd","🏃🏾":"1f3c3-1f3fe","🏃🏿":"1f3c3-1f3ff","💃🏻":"1f483-1f3fb","💃🏼":"1f483-1f3fc","💃🏽":"1f483-1f3fd","💃🏾":"1f483-1f3fe","💃🏿":"1f483-1f3ff","🕺🏻":"1f57a-1f3fb","🕺🏼":"1f57a-1f3fc","🕺🏽":"1f57a-1f3fd","🕺🏾":"1f57a-1f3fe","🕺🏿":"1f57a-1f3ff","🧖🏻":"1f9d6-1f3fb","🧖🏼":"1f9d6-1f3fc","🧖🏽":"1f9d6-1f3fd","🧖🏾":"1f9d6-1f3fe","🧖🏿":"1f9d6-1f3ff","🧗🏻":"1f9d7-1f3fb","🧗🏼":"1f9d7-1f3fc","🧗🏽":"1f9d7-1f3fd","🧗🏾":"1f9d7-1f3fe","🧗🏿":"1f9d7-1f3ff","🧘🏻":"1f9d8-1f3fb","🧘🏼":"1f9d8-1f3fc","🧘🏽":"1f9d8-1f3fd","🧘🏾":"1f9d8-1f3fe","🧘🏿":"1f9d8-1f3ff","🛀🏻":"1f6c0-1f3fb","🛀🏼":"1f6c0-1f3fc","🛀🏽":"1f6c0-1f3fd","🛀🏾":"1f6c0-1f3fe","🛀🏿":"1f6c0-1f3ff","🛌🏻":"1f6cc-1f3fb","🛌🏼":"1f6cc-1f3fc","🛌🏽":"1f6cc-1f3fd","🛌🏾":"1f6cc-1f3fe","🛌🏿":"1f6cc-1f3ff","🕴️":"1f574","🕴🏻":"1f574-1f3fb","🕴🏼":"1f574-1f3fc","🕴🏽":"1f574-1f3fd","🕴🏾":"1f574-1f3fe","🕴🏿":"1f574-1f3ff","🗣️":"1f5e3","🏇🏻":"1f3c7-1f3fb","🏇🏼":"1f3c7-1f3fc","🏇🏽":"1f3c7-1f3fd","🏇🏾":"1f3c7-1f3fe","🏇🏿":"1f3c7-1f3ff","⛷️":"26f7","🏂🏻":"1f3c2-1f3fb","🏂🏼":"1f3c2-1f3fc","🏂🏽":"1f3c2-1f3fd","🏂🏾":"1f3c2-1f3fe","🏂🏿":"1f3c2-1f3ff","🏌️":"1f3cc","🏌🏻":"1f3cc-1f3fb","🏌🏼":"1f3cc-1f3fc","🏌🏽":"1f3cc-1f3fd","🏌🏾":"1f3cc-1f3fe","🏌🏿":"1f3cc-1f3ff","🏄🏻":"1f3c4-1f3fb","🏄🏼":"1f3c4-1f3fc","🏄🏽":"1f3c4-1f3fd","🏄🏾":"1f3c4-1f3fe","🏄🏿":"1f3c4-1f3ff","🚣🏻":"1f6a3-1f3fb","🚣🏼":"1f6a3-1f3fc","🚣🏽":"1f6a3-1f3fd","🚣🏾":"1f6a3-1f3fe","🚣🏿":"1f6a3-1f3ff","🏊🏻":"1f3ca-1f3fb","🏊🏼":"1f3ca-1f3fc","🏊🏽":"1f3ca-1f3fd","🏊🏾":"1f3ca-1f3fe","🏊🏿":"1f3ca-1f3ff","⛹️":"26f9","⛹🏻":"26f9-1f3fb","⛹🏼":"26f9-1f3fc","⛹🏽":"26f9-1f3fd","⛹🏾":"26f9-1f3fe","⛹🏿":"26f9-1f3ff","🏋️":"1f3cb","🏋🏻":"1f3cb-1f3fb","🏋🏼":"1f3cb-1f3fc","🏋🏽":"1f3cb-1f3fd","🏋🏾":"1f3cb-1f3fe","🏋🏿":"1f3cb-1f3ff","🚴🏻":"1f6b4-1f3fb","🚴🏼":"1f6b4-1f3fc","🚴🏽":"1f6b4-1f3fd","🚴🏾":"1f6b4-1f3fe","🚴🏿":"1f6b4-1f3ff","🚵🏻":"1f6b5-1f3fb","🚵🏼":"1f6b5-1f3fc","🚵🏽":"1f6b5-1f3fd","🚵🏾":"1f6b5-1f3fe","🚵🏿":"1f6b5-1f3ff","🏎️":"1f3ce","🏍️":"1f3cd","🤸🏻":"1f938-1f3fb","🤸🏼":"1f938-1f3fc","🤸🏽":"1f938-1f3fd","🤸🏾":"1f938-1f3fe","🤸🏿":"1f938-1f3ff","🤽🏻":"1f93d-1f3fb","🤽🏼":"1f93d-1f3fc","🤽🏽":"1f93d-1f3fd","🤽🏾":"1f93d-1f3fe","🤽🏿":"1f93d-1f3ff","🤾🏻":"1f93e-1f3fb","🤾🏼":"1f93e-1f3fc","🤾🏽":"1f93e-1f3fd","🤾🏾":"1f93e-1f3fe","🤾🏿":"1f93e-1f3ff","🤹🏻":"1f939-1f3fb","🤹🏼":"1f939-1f3fc","🤹🏽":"1f939-1f3fd","🤹🏾":"1f939-1f3fe","🤹🏿":"1f939-1f3ff","🤳🏻":"1f933-1f3fb","🤳🏼":"1f933-1f3fc","🤳🏽":"1f933-1f3fd","🤳🏾":"1f933-1f3fe","🤳🏿":"1f933-1f3ff","💪🏻":"1f4aa-1f3fb","💪🏼":"1f4aa-1f3fc","💪🏽":"1f4aa-1f3fd","💪🏾":"1f4aa-1f3fe","💪🏿":"1f4aa-1f3ff","👈🏻":"1f448-1f3fb","👈🏼":"1f448-1f3fc","👈🏽":"1f448-1f3fd","👈🏾":"1f448-1f3fe","👈🏿":"1f448-1f3ff","👉🏻":"1f449-1f3fb","👉🏼":"1f449-1f3fc","👉🏽":"1f449-1f3fd","👉🏾":"1f449-1f3fe","👉🏿":"1f449-1f3ff","☝️":"261d","☝🏻":"261d-1f3fb","☝🏼":"261d-1f3fc","☝🏽":"261d-1f3fd","☝🏾":"261d-1f3fe","☝🏿":"261d-1f3ff","👆🏻":"1f446-1f3fb","👆🏼":"1f446-1f3fc","👆🏽":"1f446-1f3fd","👆🏾":"1f446-1f3fe","👆🏿":"1f446-1f3ff","🖕🏻":"1f595-1f3fb","🖕🏼":"1f595-1f3fc","🖕🏽":"1f595-1f3fd","🖕🏾":"1f595-1f3fe","🖕🏿":"1f595-1f3ff","👇🏻":"1f447-1f3fb","👇🏼":"1f447-1f3fc","👇🏽":"1f447-1f3fd","👇🏾":"1f447-1f3fe","👇🏿":"1f447-1f3ff","✌️":"270c","✌🏻":"270c-1f3fb","✌🏼":"270c-1f3fc","✌🏽":"270c-1f3fd","✌🏾":"270c-1f3fe","✌🏿":"270c-1f3ff","🤞🏻":"1f91e-1f3fb","🤞🏼":"1f91e-1f3fc","🤞🏽":"1f91e-1f3fd","🤞🏾":"1f91e-1f3fe","🤞🏿":"1f91e-1f3ff","🖖🏻":"1f596-1f3fb","🖖🏼":"1f596-1f3fc","🖖🏽":"1f596-1f3fd","🖖🏾":"1f596-1f3fe","🖖🏿":"1f596-1f3ff","🤘🏻":"1f918-1f3fb","🤘🏼":"1f918-1f3fc","🤘🏽":"1f918-1f3fd","🤘🏾":"1f918-1f3fe","🤘🏿":"1f918-1f3ff","🤙🏻":"1f919-1f3fb","🤙🏼":"1f919-1f3fc","🤙🏽":"1f919-1f3fd","🤙🏾":"1f919-1f3fe","🤙🏿":"1f919-1f3ff","🖐️":"1f590","🖐🏻":"1f590-1f3fb","🖐🏼":"1f590-1f3fc","🖐🏽":"1f590-1f3fd","🖐🏾":"1f590-1f3fe","🖐🏿":"1f590-1f3ff","✋🏻":"270b-1f3fb","✋🏼":"270b-1f3fc","✋🏽":"270b-1f3fd","✋🏾":"270b-1f3fe","✋🏿":"270b-1f3ff","👌🏻":"1f44c-1f3fb","👌🏼":"1f44c-1f3fc","👌🏽":"1f44c-1f3fd","👌🏾":"1f44c-1f3fe","👌🏿":"1f44c-1f3ff","👍🏻":"1f44d-1f3fb","👍🏼":"1f44d-1f3fc","👍🏽":"1f44d-1f3fd","👍🏾":"1f44d-1f3fe","👍🏿":"1f44d-1f3ff","👎🏻":"1f44e-1f3fb","👎🏼":"1f44e-1f3fc","👎🏽":"1f44e-1f3fd","👎🏾":"1f44e-1f3fe","👎🏿":"1f44e-1f3ff","✊🏻":"270a-1f3fb","✊🏼":"270a-1f3fc","✊🏽":"270a-1f3fd","✊🏾":"270a-1f3fe","✊🏿":"270a-1f3ff","👊🏻":"1f44a-1f3fb","👊🏼":"1f44a-1f3fc","👊🏽":"1f44a-1f3fd","👊🏾":"1f44a-1f3fe","👊🏿":"1f44a-1f3ff","🤛🏻":"1f91b-1f3fb","🤛🏼":"1f91b-1f3fc","🤛🏽":"1f91b-1f3fd","🤛🏾":"1f91b-1f3fe","🤛🏿":"1f91b-1f3ff","🤜🏻":"1f91c-1f3fb","🤜🏼":"1f91c-1f3fc","🤜🏽":"1f91c-1f3fd","🤜🏾":"1f91c-1f3fe","🤜🏿":"1f91c-1f3ff","🤚🏻":"1f91a-1f3fb","🤚🏼":"1f91a-1f3fc","🤚🏽":"1f91a-1f3fd","🤚🏾":"1f91a-1f3fe","🤚🏿":"1f91a-1f3ff","👋🏻":"1f44b-1f3fb","👋🏼":"1f44b-1f3fc","👋🏽":"1f44b-1f3fd","👋🏾":"1f44b-1f3fe","👋🏿":"1f44b-1f3ff","🤟🏻":"1f91f-1f3fb","🤟🏼":"1f91f-1f3fc","🤟🏽":"1f91f-1f3fd","🤟🏾":"1f91f-1f3fe","🤟🏿":"1f91f-1f3ff","✍️":"270d","✍🏻":"270d-1f3fb","✍🏼":"270d-1f3fc","✍🏽":"270d-1f3fd","✍🏾":"270d-1f3fe","✍🏿":"270d-1f3ff","👏🏻":"1f44f-1f3fb","👏🏼":"1f44f-1f3fc","👏🏽":"1f44f-1f3fd","👏🏾":"1f44f-1f3fe","👏🏿":"1f44f-1f3ff","👐🏻":"1f450-1f3fb","👐🏼":"1f450-1f3fc","👐🏽":"1f450-1f3fd","👐🏾":"1f450-1f3fe","👐🏿":"1f450-1f3ff","🙌🏻":"1f64c-1f3fb","🙌🏼":"1f64c-1f3fc","🙌🏽":"1f64c-1f3fd","🙌🏾":"1f64c-1f3fe","🙌🏿":"1f64c-1f3ff","🤲🏻":"1f932-1f3fb","🤲🏼":"1f932-1f3fc","🤲🏽":"1f932-1f3fd","🤲🏾":"1f932-1f3fe","🤲🏿":"1f932-1f3ff","🙏🏻":"1f64f-1f3fb","🙏🏼":"1f64f-1f3fc","🙏🏽":"1f64f-1f3fd","🙏🏾":"1f64f-1f3fe","🙏🏿":"1f64f-1f3ff","💅🏻":"1f485-1f3fb","💅🏼":"1f485-1f3fc","💅🏽":"1f485-1f3fd","💅🏾":"1f485-1f3fe","💅🏿":"1f485-1f3ff","👂🏻":"1f442-1f3fb","👂🏼":"1f442-1f3fc","👂🏽":"1f442-1f3fd","👂🏾":"1f442-1f3fe","👂🏿":"1f442-1f3ff","👃🏻":"1f443-1f3fb","👃🏼":"1f443-1f3fc","👃🏽":"1f443-1f3fd","👃🏾":"1f443-1f3fe","👃🏿":"1f443-1f3ff","👁️":"1f441","❤️":"2764","❣️":"2763","🗨️":"1f5e8","🗯️":"1f5ef","🕳️":"1f573","🕶️":"1f576","🛍️":"1f6cd","⛑️":"26d1","🐿️":"1f43f","🕊️":"1f54a","🕷️":"1f577","🕸️":"1f578","🏵️":"1f3f5","☘️":"2618","🌶️":"1f336","🍽️":"1f37d","🗺️":"1f5fa","🏔️":"1f3d4","⛰️":"26f0","🏕️":"1f3d5","🏖️":"1f3d6","🏜️":"1f3dc","🏝️":"1f3dd","🏞️":"1f3de","🏟️":"1f3df","🏛️":"1f3db","🏗️":"1f3d7","🏘️":"1f3d8","🏙️":"1f3d9","🏚️":"1f3da","⛩️":"26e9","♨️":"2668","🖼️":"1f5bc","🛣️":"1f6e3","🛤️":"1f6e4","🛳️":"1f6f3","⛴️":"26f4","🛥️":"1f6e5","✈️":"2708","🛩️":"1f6e9","🛰️":"1f6f0","🛎️":"1f6ce","🛏️":"1f6cf","🛋️":"1f6cb","⏱️":"23f1","⏲️":"23f2","🕰️":"1f570","🌡️":"1f321","☀️":"2600","☁️":"2601","⛈️":"26c8","🌤️":"1f324","🌥️":"1f325","🌦️":"1f326","🌧️":"1f327","🌨️":"1f328","🌩️":"1f329","🌪️":"1f32a","🌫️":"1f32b","🌬️":"1f32c","☂️":"2602","⛱️":"26f1","❄️":"2744","☃️":"2603","☄️":"2604","🎗️":"1f397","🎟️":"1f39f","🎖️":"1f396","⛸️":"26f8","🕹️":"1f579","♠️":"2660","♥️":"2665","♦️":"2666","♣️":"2663","🎙️":"1f399","🎚️":"1f39a","🎛️":"1f39b","☎️":"260e","🖥️":"1f5a5","🖨️":"1f5a8","⌨️":"2328","🖱️":"1f5b1","🖲️":"1f5b2","🎞️":"1f39e","📽️":"1f4fd","🕯️":"1f56f","🗞️":"1f5de","🏷️":"1f3f7","✉️":"2709","🗳️":"1f5f3","✏️":"270f","✒️":"2712","🖋️":"1f58b","🖊️":"1f58a","🖌️":"1f58c","🖍️":"1f58d","🗂️":"1f5c2","🗒️":"1f5d2","🗓️":"1f5d3","🖇️":"1f587","✂️":"2702","🗃️":"1f5c3","🗄️":"1f5c4","🗑️":"1f5d1","🗝️":"1f5dd","⛏️":"26cf","⚒️":"2692","🛠️":"1f6e0","🗡️":"1f5e1","⚔️":"2694","🛡️":"1f6e1","⚙️":"2699","🗜️":"1f5dc","⚗️":"2697","⚖️":"2696","⛓️":"26d3","⚰️":"26b0","⚱️":"26b1","🛢️":"1f6e2","⚠️":"26a0","☢️":"2622","☣️":"2623","⬆️":"2b06","↗️":"2197","➡️":"27a1","↘️":"2198","⬇️":"2b07","↙️":"2199","⬅️":"2b05","↖️":"2196","↕️":"2195","↔️":"2194","↩️":"21a9","↪️":"21aa","⤴️":"2934","⤵️":"2935","⚛️":"269b","🕉️":"1f549","✡️":"2721","☸️":"2638","☯️":"262f","✝️":"271d","☦️":"2626","☪️":"262a","☮️":"262e","▶️":"25b6","⏭️":"23ed","⏯️":"23ef","◀️":"25c0","⏮️":"23ee","⏸️":"23f8","⏹️":"23f9","⏺️":"23fa","⏏️":"23cf","♀️":"2640","♂️":"2642","⚕️":"2695","♻️":"267b","⚜️":"269c","☑️":"2611","✔️":"2714","✖️":"2716","〽️":"303d","✳️":"2733","✴️":"2734","❇️":"2747","‼️":"203c","⁉️":"2049","〰️":"3030","©️":"a9","®️":"ae","™️":"2122","#⃣":"23-20e3","*⃣":"2a-20e3","0⃣":"30-20e3","1⃣":"31-20e3","2⃣":"32-20e3","3⃣":"33-20e3","4⃣":"34-20e3","5⃣":"35-20e3","6⃣":"36-20e3","7⃣":"37-20e3","8⃣":"38-20e3","9⃣":"39-20e3","🅰️":"1f170","🅱️":"1f171","ℹ️":"2139","Ⓜ️":"24c2","🅾️":"1f17e","🅿️":"1f17f","🈂️":"1f202","🈷️":"1f237","㊗️":"3297","㊙️":"3299","▪️":"25aa","▫️":"25ab","◻️":"25fb","◼️":"25fc","🏳️":"1f3f3","🇦🇨":"1f1e6-1f1e8","🇦🇩":"1f1e6-1f1e9","🇦🇪":"1f1e6-1f1ea","🇦🇫":"1f1e6-1f1eb","🇦🇬":"1f1e6-1f1ec","🇦🇮":"1f1e6-1f1ee","🇦🇱":"1f1e6-1f1f1","🇦🇲":"1f1e6-1f1f2","🇦🇴":"1f1e6-1f1f4","🇦🇶":"1f1e6-1f1f6","🇦🇷":"1f1e6-1f1f7","🇦🇸":"1f1e6-1f1f8","🇦🇹":"1f1e6-1f1f9","🇦🇺":"1f1e6-1f1fa","🇦🇼":"1f1e6-1f1fc","🇦🇽":"1f1e6-1f1fd","🇦🇿":"1f1e6-1f1ff","🇧🇦":"1f1e7-1f1e6","🇧🇧":"1f1e7-1f1e7","🇧🇩":"1f1e7-1f1e9","🇧🇪":"1f1e7-1f1ea","🇧🇫":"1f1e7-1f1eb","🇧🇬":"1f1e7-1f1ec","🇧🇭":"1f1e7-1f1ed","🇧🇮":"1f1e7-1f1ee","🇧🇯":"1f1e7-1f1ef","🇧🇱":"1f1e7-1f1f1","🇧🇲":"1f1e7-1f1f2","🇧🇳":"1f1e7-1f1f3","🇧🇴":"1f1e7-1f1f4","🇧🇶":"1f1e7-1f1f6","🇧🇷":"1f1e7-1f1f7","🇧🇸":"1f1e7-1f1f8","🇧🇹":"1f1e7-1f1f9","🇧🇻":"1f1e7-1f1fb","🇧🇼":"1f1e7-1f1fc","🇧🇾":"1f1e7-1f1fe","🇧🇿":"1f1e7-1f1ff","🇨🇦":"1f1e8-1f1e6","🇨🇨":"1f1e8-1f1e8","🇨🇩":"1f1e8-1f1e9","🇨🇫":"1f1e8-1f1eb","🇨🇬":"1f1e8-1f1ec","🇨🇭":"1f1e8-1f1ed","🇨🇮":"1f1e8-1f1ee","🇨🇰":"1f1e8-1f1f0","🇨🇱":"1f1e8-1f1f1","🇨🇲":"1f1e8-1f1f2","🇨🇳":"1f1e8-1f1f3","🇨🇴":"1f1e8-1f1f4","🇨🇵":"1f1e8-1f1f5","🇨🇷":"1f1e8-1f1f7","🇨🇺":"1f1e8-1f1fa","🇨🇻":"1f1e8-1f1fb","🇨🇼":"1f1e8-1f1fc","🇨🇽":"1f1e8-1f1fd","🇨🇾":"1f1e8-1f1fe","🇨🇿":"1f1e8-1f1ff","🇩🇪":"1f1e9-1f1ea","🇩🇬":"1f1e9-1f1ec","🇩🇯":"1f1e9-1f1ef","🇩🇰":"1f1e9-1f1f0","🇩🇲":"1f1e9-1f1f2","🇩🇴":"1f1e9-1f1f4","🇩🇿":"1f1e9-1f1ff","🇪🇦":"1f1ea-1f1e6","🇪🇨":"1f1ea-1f1e8","🇪🇪":"1f1ea-1f1ea","🇪🇬":"1f1ea-1f1ec","🇪🇭":"1f1ea-1f1ed","🇪🇷":"1f1ea-1f1f7","🇪🇸":"1f1ea-1f1f8","🇪🇹":"1f1ea-1f1f9","🇪🇺":"1f1ea-1f1fa","🇫🇮":"1f1eb-1f1ee","🇫🇯":"1f1eb-1f1ef","🇫🇰":"1f1eb-1f1f0","🇫🇲":"1f1eb-1f1f2","🇫🇴":"1f1eb-1f1f4","🇫🇷":"1f1eb-1f1f7","🇬🇦":"1f1ec-1f1e6","🇬🇧":"1f1ec-1f1e7","🇬🇩":"1f1ec-1f1e9","🇬🇪":"1f1ec-1f1ea","🇬🇫":"1f1ec-1f1eb","🇬🇬":"1f1ec-1f1ec","🇬🇭":"1f1ec-1f1ed","🇬🇮":"1f1ec-1f1ee","🇬🇱":"1f1ec-1f1f1","🇬🇲":"1f1ec-1f1f2","🇬🇳":"1f1ec-1f1f3","🇬🇵":"1f1ec-1f1f5","🇬🇶":"1f1ec-1f1f6","🇬🇷":"1f1ec-1f1f7","🇬🇸":"1f1ec-1f1f8","🇬🇹":"1f1ec-1f1f9","🇬🇺":"1f1ec-1f1fa","🇬🇼":"1f1ec-1f1fc","🇬🇾":"1f1ec-1f1fe","🇭🇰":"1f1ed-1f1f0","🇭🇲":"1f1ed-1f1f2","🇭🇳":"1f1ed-1f1f3","🇭🇷":"1f1ed-1f1f7","🇭🇹":"1f1ed-1f1f9","🇭🇺":"1f1ed-1f1fa","🇮🇨":"1f1ee-1f1e8","🇮🇩":"1f1ee-1f1e9","🇮🇪":"1f1ee-1f1ea","🇮🇱":"1f1ee-1f1f1","🇮🇲":"1f1ee-1f1f2","🇮🇳":"1f1ee-1f1f3","🇮🇴":"1f1ee-1f1f4","🇮🇶":"1f1ee-1f1f6","🇮🇷":"1f1ee-1f1f7","🇮🇸":"1f1ee-1f1f8","🇮🇹":"1f1ee-1f1f9","🇯🇪":"1f1ef-1f1ea","🇯🇲":"1f1ef-1f1f2","🇯🇴":"1f1ef-1f1f4","🇯🇵":"1f1ef-1f1f5","🇰🇪":"1f1f0-1f1ea","🇰🇬":"1f1f0-1f1ec","🇰🇭":"1f1f0-1f1ed","🇰🇮":"1f1f0-1f1ee","🇰🇲":"1f1f0-1f1f2","🇰🇳":"1f1f0-1f1f3","🇰🇵":"1f1f0-1f1f5","🇰🇷":"1f1f0-1f1f7","🇰🇼":"1f1f0-1f1fc","🇰🇾":"1f1f0-1f1fe","🇰🇿":"1f1f0-1f1ff","🇱🇦":"1f1f1-1f1e6","🇱🇧":"1f1f1-1f1e7","🇱🇨":"1f1f1-1f1e8","🇱🇮":"1f1f1-1f1ee","🇱🇰":"1f1f1-1f1f0","🇱🇷":"1f1f1-1f1f7","🇱🇸":"1f1f1-1f1f8","🇱🇹":"1f1f1-1f1f9","🇱🇺":"1f1f1-1f1fa","🇱🇻":"1f1f1-1f1fb","🇱🇾":"1f1f1-1f1fe","🇲🇦":"1f1f2-1f1e6","🇲🇨":"1f1f2-1f1e8","🇲🇩":"1f1f2-1f1e9","🇲🇪":"1f1f2-1f1ea","🇲🇫":"1f1f2-1f1eb","🇲🇬":"1f1f2-1f1ec","🇲🇭":"1f1f2-1f1ed","🇲🇰":"1f1f2-1f1f0","🇲🇱":"1f1f2-1f1f1","🇲🇲":"1f1f2-1f1f2","🇲🇳":"1f1f2-1f1f3","🇲🇴":"1f1f2-1f1f4","🇲🇵":"1f1f2-1f1f5","🇲🇶":"1f1f2-1f1f6","🇲🇷":"1f1f2-1f1f7","🇲🇸":"1f1f2-1f1f8","🇲🇹":"1f1f2-1f1f9","🇲🇺":"1f1f2-1f1fa","🇲🇻":"1f1f2-1f1fb","🇲🇼":"1f1f2-1f1fc","🇲🇽":"1f1f2-1f1fd","🇲🇾":"1f1f2-1f1fe","🇲🇿":"1f1f2-1f1ff","🇳🇦":"1f1f3-1f1e6","🇳🇨":"1f1f3-1f1e8","🇳🇪":"1f1f3-1f1ea","🇳🇫":"1f1f3-1f1eb","🇳🇬":"1f1f3-1f1ec","🇳🇮":"1f1f3-1f1ee","🇳🇱":"1f1f3-1f1f1","🇳🇴":"1f1f3-1f1f4","🇳🇵":"1f1f3-1f1f5","🇳🇷":"1f1f3-1f1f7","🇳🇺":"1f1f3-1f1fa","🇳🇿":"1f1f3-1f1ff","🇴🇲":"1f1f4-1f1f2","🇵🇦":"1f1f5-1f1e6","🇵🇪":"1f1f5-1f1ea","🇵🇫":"1f1f5-1f1eb","🇵🇬":"1f1f5-1f1ec","🇵🇭":"1f1f5-1f1ed","🇵🇰":"1f1f5-1f1f0","🇵🇱":"1f1f5-1f1f1","🇵🇲":"1f1f5-1f1f2","🇵🇳":"1f1f5-1f1f3","🇵🇷":"1f1f5-1f1f7","🇵🇸":"1f1f5-1f1f8","🇵🇹":"1f1f5-1f1f9","🇵🇼":"1f1f5-1f1fc","🇵🇾":"1f1f5-1f1fe","🇶🇦":"1f1f6-1f1e6","🇷🇪":"1f1f7-1f1ea","🇷🇴":"1f1f7-1f1f4","🇷🇸":"1f1f7-1f1f8","🇷🇺":"1f1f7-1f1fa","🇷🇼":"1f1f7-1f1fc","🇸🇦":"1f1f8-1f1e6","🇸🇧":"1f1f8-1f1e7","🇸🇨":"1f1f8-1f1e8","🇸🇩":"1f1f8-1f1e9","🇸🇪":"1f1f8-1f1ea","🇸🇬":"1f1f8-1f1ec","🇸🇭":"1f1f8-1f1ed","🇸🇮":"1f1f8-1f1ee","🇸🇯":"1f1f8-1f1ef","🇸🇰":"1f1f8-1f1f0","🇸🇱":"1f1f8-1f1f1","🇸🇲":"1f1f8-1f1f2","🇸🇳":"1f1f8-1f1f3","🇸🇴":"1f1f8-1f1f4","🇸🇷":"1f1f8-1f1f7","🇸🇸":"1f1f8-1f1f8","🇸🇹":"1f1f8-1f1f9","🇸🇻":"1f1f8-1f1fb","🇸🇽":"1f1f8-1f1fd","🇸🇾":"1f1f8-1f1fe","🇸🇿":"1f1f8-1f1ff","🇹🇦":"1f1f9-1f1e6","🇹🇨":"1f1f9-1f1e8","🇹🇩":"1f1f9-1f1e9","🇹🇫":"1f1f9-1f1eb","🇹🇬":"1f1f9-1f1ec","🇹🇭":"1f1f9-1f1ed","🇹🇯":"1f1f9-1f1ef","🇹🇰":"1f1f9-1f1f0","🇹🇱":"1f1f9-1f1f1","🇹🇲":"1f1f9-1f1f2","🇹🇳":"1f1f9-1f1f3","🇹🇴":"1f1f9-1f1f4","🇹🇷":"1f1f9-1f1f7","🇹🇹":"1f1f9-1f1f9","🇹🇻":"1f1f9-1f1fb","🇹🇼":"1f1f9-1f1fc","🇹🇿":"1f1f9-1f1ff","🇺🇦":"1f1fa-1f1e6","🇺🇬":"1f1fa-1f1ec","🇺🇲":"1f1fa-1f1f2","🇺🇳":"1f1fa-1f1f3","🇺🇸":"1f1fa-1f1f8","🇺🇾":"1f1fa-1f1fe","🇺🇿":"1f1fa-1f1ff","🇻🇦":"1f1fb-1f1e6","🇻🇨":"1f1fb-1f1e8","🇻🇪":"1f1fb-1f1ea","🇻🇬":"1f1fb-1f1ec","🇻🇮":"1f1fb-1f1ee","🇻🇳":"1f1fb-1f1f3","🇻🇺":"1f1fb-1f1fa","🇼🇫":"1f1fc-1f1eb","🇼🇸":"1f1fc-1f1f8","🇽🇰":"1f1fd-1f1f0","🇾🇪":"1f1fe-1f1ea","🇾🇹":"1f1fe-1f1f9","🇿🇦":"1f1ff-1f1e6","🇿🇲":"1f1ff-1f1f2","🇿🇼":"1f1ff-1f1fc","👨⚕":"1f468-200d-2695-fe0f","👩⚕":"1f469-200d-2695-fe0f","👨🎓":"1f468-200d-1f393","👩🎓":"1f469-200d-1f393","👨🏫":"1f468-200d-1f3eb","👩🏫":"1f469-200d-1f3eb","👨⚖":"1f468-200d-2696-fe0f","👩⚖":"1f469-200d-2696-fe0f","👨🌾":"1f468-200d-1f33e","👩🌾":"1f469-200d-1f33e","👨🍳":"1f468-200d-1f373","👩🍳":"1f469-200d-1f373","👨🔧":"1f468-200d-1f527","👩🔧":"1f469-200d-1f527","👨🏭":"1f468-200d-1f3ed","👩🏭":"1f469-200d-1f3ed","👨💼":"1f468-200d-1f4bc","👩💼":"1f469-200d-1f4bc","👨🔬":"1f468-200d-1f52c","👩🔬":"1f469-200d-1f52c","👨💻":"1f468-200d-1f4bb","👩💻":"1f469-200d-1f4bb","👨🎤":"1f468-200d-1f3a4","👩🎤":"1f469-200d-1f3a4","👨🎨":"1f468-200d-1f3a8","👩🎨":"1f469-200d-1f3a8","👨✈":"1f468-200d-2708-fe0f","👩✈":"1f469-200d-2708-fe0f","👨🚀":"1f468-200d-1f680","👩🚀":"1f469-200d-1f680","👨🚒":"1f468-200d-1f692","👩🚒":"1f469-200d-1f692","👮♂":"1f46e-200d-2642-fe0f","👮♀":"1f46e-200d-2640-fe0f","🕵♂":"1f575-fe0f-200d-2642-fe0f","🕵♀":"1f575-fe0f-200d-2640-fe0f","💂♂":"1f482-200d-2642-fe0f","💂♀":"1f482-200d-2640-fe0f","👷♂":"1f477-200d-2642-fe0f","👷♀":"1f477-200d-2640-fe0f","👳♂":"1f473-200d-2642-fe0f","👳♀":"1f473-200d-2640-fe0f","👱♂":"1f471-200d-2642-fe0f","👱♀":"1f471-200d-2640-fe0f","🧙♀":"1f9d9-200d-2640-fe0f","🧙♂":"1f9d9-200d-2642-fe0f","🧚♀":"1f9da-200d-2640-fe0f","🧚♂":"1f9da-200d-2642-fe0f","🧛♀":"1f9db-200d-2640-fe0f","🧛♂":"1f9db-200d-2642-fe0f","🧜♀":"1f9dc-200d-2640-fe0f","🧜♂":"1f9dc-200d-2642-fe0f","🧝♀":"1f9dd-200d-2640-fe0f","🧝♂":"1f9dd-200d-2642-fe0f","🧞♀":"1f9de-200d-2640-fe0f","🧞♂":"1f9de-200d-2642-fe0f","🧟♀":"1f9df-200d-2640-fe0f","🧟♂":"1f9df-200d-2642-fe0f","🙍♂":"1f64d-200d-2642-fe0f","🙍♀":"1f64d-200d-2640-fe0f","🙎♂":"1f64e-200d-2642-fe0f","🙎♀":"1f64e-200d-2640-fe0f","🙅♂":"1f645-200d-2642-fe0f","🙅♀":"1f645-200d-2640-fe0f","🙆♂":"1f646-200d-2642-fe0f","🙆♀":"1f646-200d-2640-fe0f","💁♂":"1f481-200d-2642-fe0f","💁♀":"1f481-200d-2640-fe0f","🙋♂":"1f64b-200d-2642-fe0f","🙋♀":"1f64b-200d-2640-fe0f","🙇♂":"1f647-200d-2642-fe0f","🙇♀":"1f647-200d-2640-fe0f","🤦♂":"1f926-200d-2642-fe0f","🤦♀":"1f926-200d-2640-fe0f","🤷♂":"1f937-200d-2642-fe0f","🤷♀":"1f937-200d-2640-fe0f","💆♂":"1f486-200d-2642-fe0f","💆♀":"1f486-200d-2640-fe0f","💇♂":"1f487-200d-2642-fe0f","💇♀":"1f487-200d-2640-fe0f","🚶♂":"1f6b6-200d-2642-fe0f","🚶♀":"1f6b6-200d-2640-fe0f","🏃♂":"1f3c3-200d-2642-fe0f","🏃♀":"1f3c3-200d-2640-fe0f","👯♂":"1f46f-200d-2642-fe0f","👯♀":"1f46f-200d-2640-fe0f","🧖♀":"1f9d6-200d-2640-fe0f","🧖♂":"1f9d6-200d-2642-fe0f","🧗♀":"1f9d7-200d-2640-fe0f","🧗♂":"1f9d7-200d-2642-fe0f","🧘♀":"1f9d8-200d-2640-fe0f","🧘♂":"1f9d8-200d-2642-fe0f","🏌♂":"1f3cc-fe0f-200d-2642-fe0f","🏌♀":"1f3cc-fe0f-200d-2640-fe0f","🏄♂":"1f3c4-200d-2642-fe0f","🏄♀":"1f3c4-200d-2640-fe0f","🚣♂":"1f6a3-200d-2642-fe0f","🚣♀":"1f6a3-200d-2640-fe0f","🏊♂":"1f3ca-200d-2642-fe0f","🏊♀":"1f3ca-200d-2640-fe0f","⛹♂":"26f9-fe0f-200d-2642-fe0f","⛹♀":"26f9-fe0f-200d-2640-fe0f","🏋♂":"1f3cb-fe0f-200d-2642-fe0f","🏋♀":"1f3cb-fe0f-200d-2640-fe0f","🚴♂":"1f6b4-200d-2642-fe0f","🚴♀":"1f6b4-200d-2640-fe0f","🚵♂":"1f6b5-200d-2642-fe0f","🚵♀":"1f6b5-200d-2640-fe0f","🤸♂":"1f938-200d-2642-fe0f","🤸♀":"1f938-200d-2640-fe0f","🤼♂":"1f93c-200d-2642-fe0f","🤼♀":"1f93c-200d-2640-fe0f","🤽♂":"1f93d-200d-2642-fe0f","🤽♀":"1f93d-200d-2640-fe0f","🤾♂":"1f93e-200d-2642-fe0f","🤾♀":"1f93e-200d-2640-fe0f","🤹♂":"1f939-200d-2642-fe0f","🤹♀":"1f939-200d-2640-fe0f","👨👦":"1f468-200d-1f466","👨👧":"1f468-200d-1f467","👩👦":"1f469-200d-1f466","👩👧":"1f469-200d-1f467","👁🗨":"1f441-200d-1f5e8","#️⃣":"23-20e3","*️⃣":"2a-20e3","0️⃣":"30-20e3","1️⃣":"31-20e3","2️⃣":"32-20e3","3️⃣":"33-20e3","4️⃣":"34-20e3","5️⃣":"35-20e3","6️⃣":"36-20e3","7️⃣":"37-20e3","8️⃣":"38-20e3","9️⃣":"39-20e3","🏳🌈":"1f3f3-fe0f-200d-1f308","👨⚕️":"1f468-200d-2695-fe0f","👨🏻⚕":"1f468-1f3fb-200d-2695-fe0f","👨🏼⚕":"1f468-1f3fc-200d-2695-fe0f","👨🏽⚕":"1f468-1f3fd-200d-2695-fe0f","👨🏾⚕":"1f468-1f3fe-200d-2695-fe0f","👨🏿⚕":"1f468-1f3ff-200d-2695-fe0f","👩⚕️":"1f469-200d-2695-fe0f","👩🏻⚕":"1f469-1f3fb-200d-2695-fe0f","👩🏼⚕":"1f469-1f3fc-200d-2695-fe0f","👩🏽⚕":"1f469-1f3fd-200d-2695-fe0f","👩🏾⚕":"1f469-1f3fe-200d-2695-fe0f","👩🏿⚕":"1f469-1f3ff-200d-2695-fe0f","👨🏻🎓":"1f468-1f3fb-200d-1f393","👨🏼🎓":"1f468-1f3fc-200d-1f393","👨🏽🎓":"1f468-1f3fd-200d-1f393","👨🏾🎓":"1f468-1f3fe-200d-1f393","👨🏿🎓":"1f468-1f3ff-200d-1f393","👩🏻🎓":"1f469-1f3fb-200d-1f393","👩🏼🎓":"1f469-1f3fc-200d-1f393","👩🏽🎓":"1f469-1f3fd-200d-1f393","👩🏾🎓":"1f469-1f3fe-200d-1f393","👩🏿🎓":"1f469-1f3ff-200d-1f393","👨🏻🏫":"1f468-1f3fb-200d-1f3eb","👨🏼🏫":"1f468-1f3fc-200d-1f3eb","👨🏽🏫":"1f468-1f3fd-200d-1f3eb","👨🏾🏫":"1f468-1f3fe-200d-1f3eb","👨🏿🏫":"1f468-1f3ff-200d-1f3eb","👩🏻🏫":"1f469-1f3fb-200d-1f3eb","👩🏼🏫":"1f469-1f3fc-200d-1f3eb","👩🏽🏫":"1f469-1f3fd-200d-1f3eb","👩🏾🏫":"1f469-1f3fe-200d-1f3eb","👩🏿🏫":"1f469-1f3ff-200d-1f3eb","👨⚖️":"1f468-200d-2696-fe0f","👨🏻⚖":"1f468-1f3fb-200d-2696-fe0f","👨🏼⚖":"1f468-1f3fc-200d-2696-fe0f","👨🏽⚖":"1f468-1f3fd-200d-2696-fe0f","👨🏾⚖":"1f468-1f3fe-200d-2696-fe0f","👨🏿⚖":"1f468-1f3ff-200d-2696-fe0f","👩⚖️":"1f469-200d-2696-fe0f","👩🏻⚖":"1f469-1f3fb-200d-2696-fe0f","👩🏼⚖":"1f469-1f3fc-200d-2696-fe0f","👩🏽⚖":"1f469-1f3fd-200d-2696-fe0f","👩🏾⚖":"1f469-1f3fe-200d-2696-fe0f","👩🏿⚖":"1f469-1f3ff-200d-2696-fe0f","👨🏻🌾":"1f468-1f3fb-200d-1f33e","👨🏼🌾":"1f468-1f3fc-200d-1f33e","👨🏽🌾":"1f468-1f3fd-200d-1f33e","👨🏾🌾":"1f468-1f3fe-200d-1f33e","👨🏿🌾":"1f468-1f3ff-200d-1f33e","👩🏻🌾":"1f469-1f3fb-200d-1f33e","👩🏼🌾":"1f469-1f3fc-200d-1f33e","👩🏽🌾":"1f469-1f3fd-200d-1f33e","👩🏾🌾":"1f469-1f3fe-200d-1f33e","👩🏿🌾":"1f469-1f3ff-200d-1f33e","👨🏻🍳":"1f468-1f3fb-200d-1f373","👨🏼🍳":"1f468-1f3fc-200d-1f373","👨🏽🍳":"1f468-1f3fd-200d-1f373","👨🏾🍳":"1f468-1f3fe-200d-1f373","👨🏿🍳":"1f468-1f3ff-200d-1f373","👩🏻🍳":"1f469-1f3fb-200d-1f373","👩🏼🍳":"1f469-1f3fc-200d-1f373","👩🏽🍳":"1f469-1f3fd-200d-1f373","👩🏾🍳":"1f469-1f3fe-200d-1f373","👩🏿🍳":"1f469-1f3ff-200d-1f373","👨🏻🔧":"1f468-1f3fb-200d-1f527","👨🏼🔧":"1f468-1f3fc-200d-1f527","👨🏽🔧":"1f468-1f3fd-200d-1f527","👨🏾🔧":"1f468-1f3fe-200d-1f527","👨🏿🔧":"1f468-1f3ff-200d-1f527","👩🏻🔧":"1f469-1f3fb-200d-1f527","👩🏼🔧":"1f469-1f3fc-200d-1f527","👩🏽🔧":"1f469-1f3fd-200d-1f527","👩🏾🔧":"1f469-1f3fe-200d-1f527","👩🏿🔧":"1f469-1f3ff-200d-1f527","👨🏻🏭":"1f468-1f3fb-200d-1f3ed","👨🏼🏭":"1f468-1f3fc-200d-1f3ed","👨🏽🏭":"1f468-1f3fd-200d-1f3ed","👨🏾🏭":"1f468-1f3fe-200d-1f3ed","👨🏿🏭":"1f468-1f3ff-200d-1f3ed","👩🏻🏭":"1f469-1f3fb-200d-1f3ed","👩🏼🏭":"1f469-1f3fc-200d-1f3ed","👩🏽🏭":"1f469-1f3fd-200d-1f3ed","👩🏾🏭":"1f469-1f3fe-200d-1f3ed","👩🏿🏭":"1f469-1f3ff-200d-1f3ed","👨🏻💼":"1f468-1f3fb-200d-1f4bc","👨🏼💼":"1f468-1f3fc-200d-1f4bc","👨🏽💼":"1f468-1f3fd-200d-1f4bc","👨🏾💼":"1f468-1f3fe-200d-1f4bc","👨🏿💼":"1f468-1f3ff-200d-1f4bc","👩🏻💼":"1f469-1f3fb-200d-1f4bc","👩🏼💼":"1f469-1f3fc-200d-1f4bc","👩🏽💼":"1f469-1f3fd-200d-1f4bc","👩🏾💼":"1f469-1f3fe-200d-1f4bc","👩🏿💼":"1f469-1f3ff-200d-1f4bc","👨🏻🔬":"1f468-1f3fb-200d-1f52c","👨🏼🔬":"1f468-1f3fc-200d-1f52c","👨🏽🔬":"1f468-1f3fd-200d-1f52c","👨🏾🔬":"1f468-1f3fe-200d-1f52c","👨🏿🔬":"1f468-1f3ff-200d-1f52c","👩🏻🔬":"1f469-1f3fb-200d-1f52c","👩🏼🔬":"1f469-1f3fc-200d-1f52c","👩🏽🔬":"1f469-1f3fd-200d-1f52c","👩🏾🔬":"1f469-1f3fe-200d-1f52c","👩🏿🔬":"1f469-1f3ff-200d-1f52c","👨🏻💻":"1f468-1f3fb-200d-1f4bb","👨🏼💻":"1f468-1f3fc-200d-1f4bb","👨🏽💻":"1f468-1f3fd-200d-1f4bb","👨🏾💻":"1f468-1f3fe-200d-1f4bb","👨🏿💻":"1f468-1f3ff-200d-1f4bb","👩🏻💻":"1f469-1f3fb-200d-1f4bb","👩🏼💻":"1f469-1f3fc-200d-1f4bb","👩🏽💻":"1f469-1f3fd-200d-1f4bb","👩🏾💻":"1f469-1f3fe-200d-1f4bb","👩🏿💻":"1f469-1f3ff-200d-1f4bb","👨🏻🎤":"1f468-1f3fb-200d-1f3a4","👨🏼🎤":"1f468-1f3fc-200d-1f3a4","👨🏽🎤":"1f468-1f3fd-200d-1f3a4","👨🏾🎤":"1f468-1f3fe-200d-1f3a4","👨🏿🎤":"1f468-1f3ff-200d-1f3a4","👩🏻🎤":"1f469-1f3fb-200d-1f3a4","👩🏼🎤":"1f469-1f3fc-200d-1f3a4","👩🏽🎤":"1f469-1f3fd-200d-1f3a4","👩🏾🎤":"1f469-1f3fe-200d-1f3a4","👩🏿🎤":"1f469-1f3ff-200d-1f3a4","👨🏻🎨":"1f468-1f3fb-200d-1f3a8","👨🏼🎨":"1f468-1f3fc-200d-1f3a8","👨🏽🎨":"1f468-1f3fd-200d-1f3a8","👨🏾🎨":"1f468-1f3fe-200d-1f3a8","👨🏿🎨":"1f468-1f3ff-200d-1f3a8","👩🏻🎨":"1f469-1f3fb-200d-1f3a8","👩🏼🎨":"1f469-1f3fc-200d-1f3a8","👩🏽🎨":"1f469-1f3fd-200d-1f3a8","👩🏾🎨":"1f469-1f3fe-200d-1f3a8","👩🏿🎨":"1f469-1f3ff-200d-1f3a8","👨✈️":"1f468-200d-2708-fe0f","👨🏻✈":"1f468-1f3fb-200d-2708-fe0f","👨🏼✈":"1f468-1f3fc-200d-2708-fe0f","👨🏽✈":"1f468-1f3fd-200d-2708-fe0f","👨🏾✈":"1f468-1f3fe-200d-2708-fe0f","👨🏿✈":"1f468-1f3ff-200d-2708-fe0f","👩✈️":"1f469-200d-2708-fe0f","👩🏻✈":"1f469-1f3fb-200d-2708-fe0f","👩🏼✈":"1f469-1f3fc-200d-2708-fe0f","👩🏽✈":"1f469-1f3fd-200d-2708-fe0f","👩🏾✈":"1f469-1f3fe-200d-2708-fe0f","👩🏿✈":"1f469-1f3ff-200d-2708-fe0f","👨🏻🚀":"1f468-1f3fb-200d-1f680","👨🏼🚀":"1f468-1f3fc-200d-1f680","👨🏽🚀":"1f468-1f3fd-200d-1f680","👨🏾🚀":"1f468-1f3fe-200d-1f680","👨🏿🚀":"1f468-1f3ff-200d-1f680","👩🏻🚀":"1f469-1f3fb-200d-1f680","👩🏼🚀":"1f469-1f3fc-200d-1f680","👩🏽🚀":"1f469-1f3fd-200d-1f680","👩🏾🚀":"1f469-1f3fe-200d-1f680","👩🏿🚀":"1f469-1f3ff-200d-1f680","👨🏻🚒":"1f468-1f3fb-200d-1f692","👨🏼🚒":"1f468-1f3fc-200d-1f692","👨🏽🚒":"1f468-1f3fd-200d-1f692","👨🏾🚒":"1f468-1f3fe-200d-1f692","👨🏿🚒":"1f468-1f3ff-200d-1f692","👩🏻🚒":"1f469-1f3fb-200d-1f692","👩🏼🚒":"1f469-1f3fc-200d-1f692","👩🏽🚒":"1f469-1f3fd-200d-1f692","👩🏾🚒":"1f469-1f3fe-200d-1f692","👩🏿🚒":"1f469-1f3ff-200d-1f692","👮♂️":"1f46e-200d-2642-fe0f","👮🏻♂":"1f46e-1f3fb-200d-2642-fe0f","👮🏼♂":"1f46e-1f3fc-200d-2642-fe0f","👮🏽♂":"1f46e-1f3fd-200d-2642-fe0f","👮🏾♂":"1f46e-1f3fe-200d-2642-fe0f","👮🏿♂":"1f46e-1f3ff-200d-2642-fe0f","👮♀️":"1f46e-200d-2640-fe0f","👮🏻♀":"1f46e-1f3fb-200d-2640-fe0f","👮🏼♀":"1f46e-1f3fc-200d-2640-fe0f","👮🏽♀":"1f46e-1f3fd-200d-2640-fe0f","👮🏾♀":"1f46e-1f3fe-200d-2640-fe0f","👮🏿♀":"1f46e-1f3ff-200d-2640-fe0f","🕵♂️":"1f575-fe0f-200d-2642-fe0f","🕵️♂":"1f575-fe0f-200d-2642-fe0f","🕵🏻♂":"1f575-1f3fb-200d-2642-fe0f","🕵🏼♂":"1f575-1f3fc-200d-2642-fe0f","🕵🏽♂":"1f575-1f3fd-200d-2642-fe0f","🕵🏾♂":"1f575-1f3fe-200d-2642-fe0f","🕵🏿♂":"1f575-1f3ff-200d-2642-fe0f","🕵♀️":"1f575-fe0f-200d-2640-fe0f","🕵️♀":"1f575-fe0f-200d-2640-fe0f","🕵🏻♀":"1f575-1f3fb-200d-2640-fe0f","🕵🏼♀":"1f575-1f3fc-200d-2640-fe0f","🕵🏽♀":"1f575-1f3fd-200d-2640-fe0f","🕵🏾♀":"1f575-1f3fe-200d-2640-fe0f","🕵🏿♀":"1f575-1f3ff-200d-2640-fe0f","💂♂️":"1f482-200d-2642-fe0f","💂🏻♂":"1f482-1f3fb-200d-2642-fe0f","💂🏼♂":"1f482-1f3fc-200d-2642-fe0f","💂🏽♂":"1f482-1f3fd-200d-2642-fe0f","💂🏾♂":"1f482-1f3fe-200d-2642-fe0f","💂🏿♂":"1f482-1f3ff-200d-2642-fe0f","💂♀️":"1f482-200d-2640-fe0f","💂🏻♀":"1f482-1f3fb-200d-2640-fe0f","💂🏼♀":"1f482-1f3fc-200d-2640-fe0f","💂🏽♀":"1f482-1f3fd-200d-2640-fe0f","💂🏾♀":"1f482-1f3fe-200d-2640-fe0f","💂🏿♀":"1f482-1f3ff-200d-2640-fe0f","👷♂️":"1f477-200d-2642-fe0f","👷🏻♂":"1f477-1f3fb-200d-2642-fe0f","👷🏼♂":"1f477-1f3fc-200d-2642-fe0f","👷🏽♂":"1f477-1f3fd-200d-2642-fe0f","👷🏾♂":"1f477-1f3fe-200d-2642-fe0f","👷🏿♂":"1f477-1f3ff-200d-2642-fe0f","👷♀️":"1f477-200d-2640-fe0f","👷🏻♀":"1f477-1f3fb-200d-2640-fe0f","👷🏼♀":"1f477-1f3fc-200d-2640-fe0f","👷🏽♀":"1f477-1f3fd-200d-2640-fe0f","👷🏾♀":"1f477-1f3fe-200d-2640-fe0f","👷🏿♀":"1f477-1f3ff-200d-2640-fe0f","👳♂️":"1f473-200d-2642-fe0f","👳🏻♂":"1f473-1f3fb-200d-2642-fe0f","👳🏼♂":"1f473-1f3fc-200d-2642-fe0f","👳🏽♂":"1f473-1f3fd-200d-2642-fe0f","👳🏾♂":"1f473-1f3fe-200d-2642-fe0f","👳🏿♂":"1f473-1f3ff-200d-2642-fe0f","👳♀️":"1f473-200d-2640-fe0f","👳🏻♀":"1f473-1f3fb-200d-2640-fe0f","👳🏼♀":"1f473-1f3fc-200d-2640-fe0f","👳🏽♀":"1f473-1f3fd-200d-2640-fe0f","👳🏾♀":"1f473-1f3fe-200d-2640-fe0f","👳🏿♀":"1f473-1f3ff-200d-2640-fe0f","👱♂️":"1f471-200d-2642-fe0f","👱🏻♂":"1f471-1f3fb-200d-2642-fe0f","👱🏼♂":"1f471-1f3fc-200d-2642-fe0f","👱🏽♂":"1f471-1f3fd-200d-2642-fe0f","👱🏾♂":"1f471-1f3fe-200d-2642-fe0f","👱🏿♂":"1f471-1f3ff-200d-2642-fe0f","👱♀️":"1f471-200d-2640-fe0f","👱🏻♀":"1f471-1f3fb-200d-2640-fe0f","👱🏼♀":"1f471-1f3fc-200d-2640-fe0f","👱🏽♀":"1f471-1f3fd-200d-2640-fe0f","👱🏾♀":"1f471-1f3fe-200d-2640-fe0f","👱🏿♀":"1f471-1f3ff-200d-2640-fe0f","🧙♀️":"1f9d9-200d-2640-fe0f","🧙🏻♀":"1f9d9-1f3fb-200d-2640-fe0f","🧙🏼♀":"1f9d9-1f3fc-200d-2640-fe0f","🧙🏽♀":"1f9d9-1f3fd-200d-2640-fe0f","🧙🏾♀":"1f9d9-1f3fe-200d-2640-fe0f","🧙🏿♀":"1f9d9-1f3ff-200d-2640-fe0f","🧙♂️":"1f9d9-200d-2642-fe0f","🧙🏻♂":"1f9d9-1f3fb-200d-2642-fe0f","🧙🏼♂":"1f9d9-1f3fc-200d-2642-fe0f","🧙🏽♂":"1f9d9-1f3fd-200d-2642-fe0f","🧙🏾♂":"1f9d9-1f3fe-200d-2642-fe0f","🧙🏿♂":"1f9d9-1f3ff-200d-2642-fe0f","🧚♀️":"1f9da-200d-2640-fe0f","🧚🏻♀":"1f9da-1f3fb-200d-2640-fe0f","🧚🏼♀":"1f9da-1f3fc-200d-2640-fe0f","🧚🏽♀":"1f9da-1f3fd-200d-2640-fe0f","🧚🏾♀":"1f9da-1f3fe-200d-2640-fe0f","🧚🏿♀":"1f9da-1f3ff-200d-2640-fe0f","🧚♂️":"1f9da-200d-2642-fe0f","🧚🏻♂":"1f9da-1f3fb-200d-2642-fe0f","🧚🏼♂":"1f9da-1f3fc-200d-2642-fe0f","🧚🏽♂":"1f9da-1f3fd-200d-2642-fe0f","🧚🏾♂":"1f9da-1f3fe-200d-2642-fe0f","🧚🏿♂":"1f9da-1f3ff-200d-2642-fe0f","🧛♀️":"1f9db-200d-2640-fe0f","🧛🏻♀":"1f9db-1f3fb-200d-2640-fe0f","🧛🏼♀":"1f9db-1f3fc-200d-2640-fe0f","🧛🏽♀":"1f9db-1f3fd-200d-2640-fe0f","🧛🏾♀":"1f9db-1f3fe-200d-2640-fe0f","🧛🏿♀":"1f9db-1f3ff-200d-2640-fe0f","🧛♂️":"1f9db-200d-2642-fe0f","🧛🏻♂":"1f9db-1f3fb-200d-2642-fe0f","🧛🏼♂":"1f9db-1f3fc-200d-2642-fe0f","🧛🏽♂":"1f9db-1f3fd-200d-2642-fe0f","🧛🏾♂":"1f9db-1f3fe-200d-2642-fe0f","🧛🏿♂":"1f9db-1f3ff-200d-2642-fe0f","🧜♀️":"1f9dc-200d-2640-fe0f","🧜🏻♀":"1f9dc-1f3fb-200d-2640-fe0f","🧜🏼♀":"1f9dc-1f3fc-200d-2640-fe0f","🧜🏽♀":"1f9dc-1f3fd-200d-2640-fe0f","🧜🏾♀":"1f9dc-1f3fe-200d-2640-fe0f","🧜🏿♀":"1f9dc-1f3ff-200d-2640-fe0f","🧜♂️":"1f9dc-200d-2642-fe0f","🧜🏻♂":"1f9dc-1f3fb-200d-2642-fe0f","🧜🏼♂":"1f9dc-1f3fc-200d-2642-fe0f","🧜🏽♂":"1f9dc-1f3fd-200d-2642-fe0f","🧜🏾♂":"1f9dc-1f3fe-200d-2642-fe0f","🧜🏿♂":"1f9dc-1f3ff-200d-2642-fe0f","🧝♀️":"1f9dd-200d-2640-fe0f","🧝🏻♀":"1f9dd-1f3fb-200d-2640-fe0f","🧝🏼♀":"1f9dd-1f3fc-200d-2640-fe0f","🧝🏽♀":"1f9dd-1f3fd-200d-2640-fe0f","🧝🏾♀":"1f9dd-1f3fe-200d-2640-fe0f","🧝🏿♀":"1f9dd-1f3ff-200d-2640-fe0f","🧝♂️":"1f9dd-200d-2642-fe0f","🧝🏻♂":"1f9dd-1f3fb-200d-2642-fe0f","🧝🏼♂":"1f9dd-1f3fc-200d-2642-fe0f","🧝🏽♂":"1f9dd-1f3fd-200d-2642-fe0f","🧝🏾♂":"1f9dd-1f3fe-200d-2642-fe0f","🧝🏿♂":"1f9dd-1f3ff-200d-2642-fe0f","🧞♀️":"1f9de-200d-2640-fe0f","🧞♂️":"1f9de-200d-2642-fe0f","🧟♀️":"1f9df-200d-2640-fe0f","🧟♂️":"1f9df-200d-2642-fe0f","🙍♂️":"1f64d-200d-2642-fe0f","🙍🏻♂":"1f64d-1f3fb-200d-2642-fe0f","🙍🏼♂":"1f64d-1f3fc-200d-2642-fe0f","🙍🏽♂":"1f64d-1f3fd-200d-2642-fe0f","🙍🏾♂":"1f64d-1f3fe-200d-2642-fe0f","🙍🏿♂":"1f64d-1f3ff-200d-2642-fe0f","🙍♀️":"1f64d-200d-2640-fe0f","🙍🏻♀":"1f64d-1f3fb-200d-2640-fe0f","🙍🏼♀":"1f64d-1f3fc-200d-2640-fe0f","🙍🏽♀":"1f64d-1f3fd-200d-2640-fe0f","🙍🏾♀":"1f64d-1f3fe-200d-2640-fe0f","🙍🏿♀":"1f64d-1f3ff-200d-2640-fe0f","🙎♂️":"1f64e-200d-2642-fe0f","🙎🏻♂":"1f64e-1f3fb-200d-2642-fe0f","🙎🏼♂":"1f64e-1f3fc-200d-2642-fe0f","🙎🏽♂":"1f64e-1f3fd-200d-2642-fe0f","🙎🏾♂":"1f64e-1f3fe-200d-2642-fe0f","🙎🏿♂":"1f64e-1f3ff-200d-2642-fe0f","🙎♀️":"1f64e-200d-2640-fe0f","🙎🏻♀":"1f64e-1f3fb-200d-2640-fe0f","🙎🏼♀":"1f64e-1f3fc-200d-2640-fe0f","🙎🏽♀":"1f64e-1f3fd-200d-2640-fe0f","🙎🏾♀":"1f64e-1f3fe-200d-2640-fe0f","🙎🏿♀":"1f64e-1f3ff-200d-2640-fe0f","🙅♂️":"1f645-200d-2642-fe0f","🙅🏻♂":"1f645-1f3fb-200d-2642-fe0f","🙅🏼♂":"1f645-1f3fc-200d-2642-fe0f","🙅🏽♂":"1f645-1f3fd-200d-2642-fe0f","🙅🏾♂":"1f645-1f3fe-200d-2642-fe0f","🙅🏿♂":"1f645-1f3ff-200d-2642-fe0f","🙅♀️":"1f645-200d-2640-fe0f","🙅🏻♀":"1f645-1f3fb-200d-2640-fe0f","🙅🏼♀":"1f645-1f3fc-200d-2640-fe0f","🙅🏽♀":"1f645-1f3fd-200d-2640-fe0f","🙅🏾♀":"1f645-1f3fe-200d-2640-fe0f","🙅🏿♀":"1f645-1f3ff-200d-2640-fe0f","🙆♂️":"1f646-200d-2642-fe0f","🙆🏻♂":"1f646-1f3fb-200d-2642-fe0f","🙆🏼♂":"1f646-1f3fc-200d-2642-fe0f","🙆🏽♂":"1f646-1f3fd-200d-2642-fe0f","🙆🏾♂":"1f646-1f3fe-200d-2642-fe0f","🙆🏿♂":"1f646-1f3ff-200d-2642-fe0f","🙆♀️":"1f646-200d-2640-fe0f","🙆🏻♀":"1f646-1f3fb-200d-2640-fe0f","🙆🏼♀":"1f646-1f3fc-200d-2640-fe0f","🙆🏽♀":"1f646-1f3fd-200d-2640-fe0f","🙆🏾♀":"1f646-1f3fe-200d-2640-fe0f","🙆🏿♀":"1f646-1f3ff-200d-2640-fe0f","💁♂️":"1f481-200d-2642-fe0f","💁🏻♂":"1f481-1f3fb-200d-2642-fe0f","💁🏼♂":"1f481-1f3fc-200d-2642-fe0f","💁🏽♂":"1f481-1f3fd-200d-2642-fe0f","💁🏾♂":"1f481-1f3fe-200d-2642-fe0f","💁🏿♂":"1f481-1f3ff-200d-2642-fe0f","💁♀️":"1f481-200d-2640-fe0f","💁🏻♀":"1f481-1f3fb-200d-2640-fe0f","💁🏼♀":"1f481-1f3fc-200d-2640-fe0f","💁🏽♀":"1f481-1f3fd-200d-2640-fe0f","💁🏾♀":"1f481-1f3fe-200d-2640-fe0f","💁🏿♀":"1f481-1f3ff-200d-2640-fe0f","🙋♂️":"1f64b-200d-2642-fe0f","🙋🏻♂":"1f64b-1f3fb-200d-2642-fe0f","🙋🏼♂":"1f64b-1f3fc-200d-2642-fe0f","🙋🏽♂":"1f64b-1f3fd-200d-2642-fe0f","🙋🏾♂":"1f64b-1f3fe-200d-2642-fe0f","🙋🏿♂":"1f64b-1f3ff-200d-2642-fe0f","🙋♀️":"1f64b-200d-2640-fe0f","🙋🏻♀":"1f64b-1f3fb-200d-2640-fe0f","🙋🏼♀":"1f64b-1f3fc-200d-2640-fe0f","🙋🏽♀":"1f64b-1f3fd-200d-2640-fe0f","🙋🏾♀":"1f64b-1f3fe-200d-2640-fe0f","🙋🏿♀":"1f64b-1f3ff-200d-2640-fe0f","🙇♂️":"1f647-200d-2642-fe0f","🙇🏻♂":"1f647-1f3fb-200d-2642-fe0f","🙇🏼♂":"1f647-1f3fc-200d-2642-fe0f","🙇🏽♂":"1f647-1f3fd-200d-2642-fe0f","🙇🏾♂":"1f647-1f3fe-200d-2642-fe0f","🙇🏿♂":"1f647-1f3ff-200d-2642-fe0f","🙇♀️":"1f647-200d-2640-fe0f","🙇🏻♀":"1f647-1f3fb-200d-2640-fe0f","🙇🏼♀":"1f647-1f3fc-200d-2640-fe0f","🙇🏽♀":"1f647-1f3fd-200d-2640-fe0f","🙇🏾♀":"1f647-1f3fe-200d-2640-fe0f","🙇🏿♀":"1f647-1f3ff-200d-2640-fe0f","🤦♂️":"1f926-200d-2642-fe0f","🤦🏻♂":"1f926-1f3fb-200d-2642-fe0f","🤦🏼♂":"1f926-1f3fc-200d-2642-fe0f","🤦🏽♂":"1f926-1f3fd-200d-2642-fe0f","🤦🏾♂":"1f926-1f3fe-200d-2642-fe0f","🤦🏿♂":"1f926-1f3ff-200d-2642-fe0f","🤦♀️":"1f926-200d-2640-fe0f","🤦🏻♀":"1f926-1f3fb-200d-2640-fe0f","🤦🏼♀":"1f926-1f3fc-200d-2640-fe0f","🤦🏽♀":"1f926-1f3fd-200d-2640-fe0f","🤦🏾♀":"1f926-1f3fe-200d-2640-fe0f","🤦🏿♀":"1f926-1f3ff-200d-2640-fe0f","🤷♂️":"1f937-200d-2642-fe0f","🤷🏻♂":"1f937-1f3fb-200d-2642-fe0f","🤷🏼♂":"1f937-1f3fc-200d-2642-fe0f","🤷🏽♂":"1f937-1f3fd-200d-2642-fe0f","🤷🏾♂":"1f937-1f3fe-200d-2642-fe0f","🤷🏿♂":"1f937-1f3ff-200d-2642-fe0f","🤷♀️":"1f937-200d-2640-fe0f","🤷🏻♀":"1f937-1f3fb-200d-2640-fe0f","🤷🏼♀":"1f937-1f3fc-200d-2640-fe0f","🤷🏽♀":"1f937-1f3fd-200d-2640-fe0f","🤷🏾♀":"1f937-1f3fe-200d-2640-fe0f","🤷🏿♀":"1f937-1f3ff-200d-2640-fe0f","💆♂️":"1f486-200d-2642-fe0f","💆🏻♂":"1f486-1f3fb-200d-2642-fe0f","💆🏼♂":"1f486-1f3fc-200d-2642-fe0f","💆🏽♂":"1f486-1f3fd-200d-2642-fe0f","💆🏾♂":"1f486-1f3fe-200d-2642-fe0f","💆🏿♂":"1f486-1f3ff-200d-2642-fe0f","💆♀️":"1f486-200d-2640-fe0f","💆🏻♀":"1f486-1f3fb-200d-2640-fe0f","💆🏼♀":"1f486-1f3fc-200d-2640-fe0f","💆🏽♀":"1f486-1f3fd-200d-2640-fe0f","💆🏾♀":"1f486-1f3fe-200d-2640-fe0f","💆🏿♀":"1f486-1f3ff-200d-2640-fe0f","💇♂️":"1f487-200d-2642-fe0f","💇🏻♂":"1f487-1f3fb-200d-2642-fe0f","💇🏼♂":"1f487-1f3fc-200d-2642-fe0f","💇🏽♂":"1f487-1f3fd-200d-2642-fe0f","💇🏾♂":"1f487-1f3fe-200d-2642-fe0f","💇🏿♂":"1f487-1f3ff-200d-2642-fe0f","💇♀️":"1f487-200d-2640-fe0f","💇🏻♀":"1f487-1f3fb-200d-2640-fe0f","💇🏼♀":"1f487-1f3fc-200d-2640-fe0f","💇🏽♀":"1f487-1f3fd-200d-2640-fe0f","💇🏾♀":"1f487-1f3fe-200d-2640-fe0f","💇🏿♀":"1f487-1f3ff-200d-2640-fe0f","🚶♂️":"1f6b6-200d-2642-fe0f","🚶🏻♂":"1f6b6-1f3fb-200d-2642-fe0f","🚶🏼♂":"1f6b6-1f3fc-200d-2642-fe0f","🚶🏽♂":"1f6b6-1f3fd-200d-2642-fe0f","🚶🏾♂":"1f6b6-1f3fe-200d-2642-fe0f","🚶🏿♂":"1f6b6-1f3ff-200d-2642-fe0f","🚶♀️":"1f6b6-200d-2640-fe0f","🚶🏻♀":"1f6b6-1f3fb-200d-2640-fe0f","🚶🏼♀":"1f6b6-1f3fc-200d-2640-fe0f","🚶🏽♀":"1f6b6-1f3fd-200d-2640-fe0f","🚶🏾♀":"1f6b6-1f3fe-200d-2640-fe0f","🚶🏿♀":"1f6b6-1f3ff-200d-2640-fe0f","🏃♂️":"1f3c3-200d-2642-fe0f","🏃🏻♂":"1f3c3-1f3fb-200d-2642-fe0f","🏃🏼♂":"1f3c3-1f3fc-200d-2642-fe0f","🏃🏽♂":"1f3c3-1f3fd-200d-2642-fe0f","🏃🏾♂":"1f3c3-1f3fe-200d-2642-fe0f","🏃🏿♂":"1f3c3-1f3ff-200d-2642-fe0f","🏃♀️":"1f3c3-200d-2640-fe0f","🏃🏻♀":"1f3c3-1f3fb-200d-2640-fe0f","🏃🏼♀":"1f3c3-1f3fc-200d-2640-fe0f","🏃🏽♀":"1f3c3-1f3fd-200d-2640-fe0f","🏃🏾♀":"1f3c3-1f3fe-200d-2640-fe0f","🏃🏿♀":"1f3c3-1f3ff-200d-2640-fe0f","👯♂️":"1f46f-200d-2642-fe0f","👯♀️":"1f46f-200d-2640-fe0f","🧖♀️":"1f9d6-200d-2640-fe0f","🧖🏻♀":"1f9d6-1f3fb-200d-2640-fe0f","🧖🏼♀":"1f9d6-1f3fc-200d-2640-fe0f","🧖🏽♀":"1f9d6-1f3fd-200d-2640-fe0f","🧖🏾♀":"1f9d6-1f3fe-200d-2640-fe0f","🧖🏿♀":"1f9d6-1f3ff-200d-2640-fe0f","🧖♂️":"1f9d6-200d-2642-fe0f","🧖🏻♂":"1f9d6-1f3fb-200d-2642-fe0f","🧖🏼♂":"1f9d6-1f3fc-200d-2642-fe0f","🧖🏽♂":"1f9d6-1f3fd-200d-2642-fe0f","🧖🏾♂":"1f9d6-1f3fe-200d-2642-fe0f","🧖🏿♂":"1f9d6-1f3ff-200d-2642-fe0f","🧗♀️":"1f9d7-200d-2640-fe0f","🧗🏻♀":"1f9d7-1f3fb-200d-2640-fe0f","🧗🏼♀":"1f9d7-1f3fc-200d-2640-fe0f","🧗🏽♀":"1f9d7-1f3fd-200d-2640-fe0f","🧗🏾♀":"1f9d7-1f3fe-200d-2640-fe0f","🧗🏿♀":"1f9d7-1f3ff-200d-2640-fe0f","🧗♂️":"1f9d7-200d-2642-fe0f","🧗🏻♂":"1f9d7-1f3fb-200d-2642-fe0f","🧗🏼♂":"1f9d7-1f3fc-200d-2642-fe0f","🧗🏽♂":"1f9d7-1f3fd-200d-2642-fe0f","🧗🏾♂":"1f9d7-1f3fe-200d-2642-fe0f","🧗🏿♂":"1f9d7-1f3ff-200d-2642-fe0f","🧘♀️":"1f9d8-200d-2640-fe0f","🧘🏻♀":"1f9d8-1f3fb-200d-2640-fe0f","🧘🏼♀":"1f9d8-1f3fc-200d-2640-fe0f","🧘🏽♀":"1f9d8-1f3fd-200d-2640-fe0f","🧘🏾♀":"1f9d8-1f3fe-200d-2640-fe0f","🧘🏿♀":"1f9d8-1f3ff-200d-2640-fe0f","🧘♂️":"1f9d8-200d-2642-fe0f","🧘🏻♂":"1f9d8-1f3fb-200d-2642-fe0f","🧘🏼♂":"1f9d8-1f3fc-200d-2642-fe0f","🧘🏽♂":"1f9d8-1f3fd-200d-2642-fe0f","🧘🏾♂":"1f9d8-1f3fe-200d-2642-fe0f","🧘🏿♂":"1f9d8-1f3ff-200d-2642-fe0f","🏌♂️":"1f3cc-fe0f-200d-2642-fe0f","🏌️♂":"1f3cc-fe0f-200d-2642-fe0f","🏌🏻♂":"1f3cc-1f3fb-200d-2642-fe0f","🏌🏼♂":"1f3cc-1f3fc-200d-2642-fe0f","🏌🏽♂":"1f3cc-1f3fd-200d-2642-fe0f","🏌🏾♂":"1f3cc-1f3fe-200d-2642-fe0f","🏌🏿♂":"1f3cc-1f3ff-200d-2642-fe0f","🏌♀️":"1f3cc-fe0f-200d-2640-fe0f","🏌️♀":"1f3cc-fe0f-200d-2640-fe0f","🏌🏻♀":"1f3cc-1f3fb-200d-2640-fe0f","🏌🏼♀":"1f3cc-1f3fc-200d-2640-fe0f","🏌🏽♀":"1f3cc-1f3fd-200d-2640-fe0f","🏌🏾♀":"1f3cc-1f3fe-200d-2640-fe0f","🏌🏿♀":"1f3cc-1f3ff-200d-2640-fe0f","🏄♂️":"1f3c4-200d-2642-fe0f","🏄🏻♂":"1f3c4-1f3fb-200d-2642-fe0f","🏄🏼♂":"1f3c4-1f3fc-200d-2642-fe0f","🏄🏽♂":"1f3c4-1f3fd-200d-2642-fe0f","🏄🏾♂":"1f3c4-1f3fe-200d-2642-fe0f","🏄🏿♂":"1f3c4-1f3ff-200d-2642-fe0f","🏄♀️":"1f3c4-200d-2640-fe0f","🏄🏻♀":"1f3c4-1f3fb-200d-2640-fe0f","🏄🏼♀":"1f3c4-1f3fc-200d-2640-fe0f","🏄🏽♀":"1f3c4-1f3fd-200d-2640-fe0f","🏄🏾♀":"1f3c4-1f3fe-200d-2640-fe0f","🏄🏿♀":"1f3c4-1f3ff-200d-2640-fe0f","🚣♂️":"1f6a3-200d-2642-fe0f","🚣🏻♂":"1f6a3-1f3fb-200d-2642-fe0f","🚣🏼♂":"1f6a3-1f3fc-200d-2642-fe0f","🚣🏽♂":"1f6a3-1f3fd-200d-2642-fe0f","🚣🏾♂":"1f6a3-1f3fe-200d-2642-fe0f","🚣🏿♂":"1f6a3-1f3ff-200d-2642-fe0f","🚣♀️":"1f6a3-200d-2640-fe0f","🚣🏻♀":"1f6a3-1f3fb-200d-2640-fe0f","🚣🏼♀":"1f6a3-1f3fc-200d-2640-fe0f","🚣🏽♀":"1f6a3-1f3fd-200d-2640-fe0f","🚣🏾♀":"1f6a3-1f3fe-200d-2640-fe0f","🚣🏿♀":"1f6a3-1f3ff-200d-2640-fe0f","🏊♂️":"1f3ca-200d-2642-fe0f","🏊🏻♂":"1f3ca-1f3fb-200d-2642-fe0f","🏊🏼♂":"1f3ca-1f3fc-200d-2642-fe0f","🏊🏽♂":"1f3ca-1f3fd-200d-2642-fe0f","🏊🏾♂":"1f3ca-1f3fe-200d-2642-fe0f","🏊🏿♂":"1f3ca-1f3ff-200d-2642-fe0f","🏊♀️":"1f3ca-200d-2640-fe0f","🏊🏻♀":"1f3ca-1f3fb-200d-2640-fe0f","🏊🏼♀":"1f3ca-1f3fc-200d-2640-fe0f","🏊🏽♀":"1f3ca-1f3fd-200d-2640-fe0f","🏊🏾♀":"1f3ca-1f3fe-200d-2640-fe0f","🏊🏿♀":"1f3ca-1f3ff-200d-2640-fe0f","⛹♂️":"26f9-fe0f-200d-2642-fe0f","⛹️♂":"26f9-fe0f-200d-2642-fe0f","⛹🏻♂":"26f9-1f3fb-200d-2642-fe0f","⛹🏼♂":"26f9-1f3fc-200d-2642-fe0f","⛹🏽♂":"26f9-1f3fd-200d-2642-fe0f","⛹🏾♂":"26f9-1f3fe-200d-2642-fe0f","⛹🏿♂":"26f9-1f3ff-200d-2642-fe0f","⛹♀️":"26f9-fe0f-200d-2640-fe0f","⛹️♀":"26f9-fe0f-200d-2640-fe0f","⛹🏻♀":"26f9-1f3fb-200d-2640-fe0f","⛹🏼♀":"26f9-1f3fc-200d-2640-fe0f","⛹🏽♀":"26f9-1f3fd-200d-2640-fe0f","⛹🏾♀":"26f9-1f3fe-200d-2640-fe0f","⛹🏿♀":"26f9-1f3ff-200d-2640-fe0f","🏋♂️":"1f3cb-fe0f-200d-2642-fe0f","🏋️♂":"1f3cb-fe0f-200d-2642-fe0f","🏋🏻♂":"1f3cb-1f3fb-200d-2642-fe0f","🏋🏼♂":"1f3cb-1f3fc-200d-2642-fe0f","🏋🏽♂":"1f3cb-1f3fd-200d-2642-fe0f","🏋🏾♂":"1f3cb-1f3fe-200d-2642-fe0f","🏋🏿♂":"1f3cb-1f3ff-200d-2642-fe0f","🏋♀️":"1f3cb-fe0f-200d-2640-fe0f","🏋️♀":"1f3cb-fe0f-200d-2640-fe0f","🏋🏻♀":"1f3cb-1f3fb-200d-2640-fe0f","🏋🏼♀":"1f3cb-1f3fc-200d-2640-fe0f","🏋🏽♀":"1f3cb-1f3fd-200d-2640-fe0f","🏋🏾♀":"1f3cb-1f3fe-200d-2640-fe0f","🏋🏿♀":"1f3cb-1f3ff-200d-2640-fe0f","🚴♂️":"1f6b4-200d-2642-fe0f","🚴🏻♂":"1f6b4-1f3fb-200d-2642-fe0f","🚴🏼♂":"1f6b4-1f3fc-200d-2642-fe0f","🚴🏽♂":"1f6b4-1f3fd-200d-2642-fe0f","🚴🏾♂":"1f6b4-1f3fe-200d-2642-fe0f","🚴🏿♂":"1f6b4-1f3ff-200d-2642-fe0f","🚴♀️":"1f6b4-200d-2640-fe0f","🚴🏻♀":"1f6b4-1f3fb-200d-2640-fe0f","🚴🏼♀":"1f6b4-1f3fc-200d-2640-fe0f","🚴🏽♀":"1f6b4-1f3fd-200d-2640-fe0f","🚴🏾♀":"1f6b4-1f3fe-200d-2640-fe0f","🚴🏿♀":"1f6b4-1f3ff-200d-2640-fe0f","🚵♂️":"1f6b5-200d-2642-fe0f","🚵🏻♂":"1f6b5-1f3fb-200d-2642-fe0f","🚵🏼♂":"1f6b5-1f3fc-200d-2642-fe0f","🚵🏽♂":"1f6b5-1f3fd-200d-2642-fe0f","🚵🏾♂":"1f6b5-1f3fe-200d-2642-fe0f","🚵🏿♂":"1f6b5-1f3ff-200d-2642-fe0f","🚵♀️":"1f6b5-200d-2640-fe0f","🚵🏻♀":"1f6b5-1f3fb-200d-2640-fe0f","🚵🏼♀":"1f6b5-1f3fc-200d-2640-fe0f","🚵🏽♀":"1f6b5-1f3fd-200d-2640-fe0f","🚵🏾♀":"1f6b5-1f3fe-200d-2640-fe0f","🚵🏿♀":"1f6b5-1f3ff-200d-2640-fe0f","🤸♂️":"1f938-200d-2642-fe0f","🤸🏻♂":"1f938-1f3fb-200d-2642-fe0f","🤸🏼♂":"1f938-1f3fc-200d-2642-fe0f","🤸🏽♂":"1f938-1f3fd-200d-2642-fe0f","🤸🏾♂":"1f938-1f3fe-200d-2642-fe0f","🤸🏿♂":"1f938-1f3ff-200d-2642-fe0f","🤸♀️":"1f938-200d-2640-fe0f","🤸🏻♀":"1f938-1f3fb-200d-2640-fe0f","🤸🏼♀":"1f938-1f3fc-200d-2640-fe0f","🤸🏽♀":"1f938-1f3fd-200d-2640-fe0f","🤸🏾♀":"1f938-1f3fe-200d-2640-fe0f","🤸🏿♀":"1f938-1f3ff-200d-2640-fe0f","🤼♂️":"1f93c-200d-2642-fe0f","🤼♀️":"1f93c-200d-2640-fe0f","🤽♂️":"1f93d-200d-2642-fe0f","🤽🏻♂":"1f93d-1f3fb-200d-2642-fe0f","🤽🏼♂":"1f93d-1f3fc-200d-2642-fe0f","🤽🏽♂":"1f93d-1f3fd-200d-2642-fe0f","🤽🏾♂":"1f93d-1f3fe-200d-2642-fe0f","🤽🏿♂":"1f93d-1f3ff-200d-2642-fe0f","🤽♀️":"1f93d-200d-2640-fe0f","🤽🏻♀":"1f93d-1f3fb-200d-2640-fe0f","🤽🏼♀":"1f93d-1f3fc-200d-2640-fe0f","🤽🏽♀":"1f93d-1f3fd-200d-2640-fe0f","🤽🏾♀":"1f93d-1f3fe-200d-2640-fe0f","🤽🏿♀":"1f93d-1f3ff-200d-2640-fe0f","🤾♂️":"1f93e-200d-2642-fe0f","🤾🏻♂":"1f93e-1f3fb-200d-2642-fe0f","🤾🏼♂":"1f93e-1f3fc-200d-2642-fe0f","🤾🏽♂":"1f93e-1f3fd-200d-2642-fe0f","🤾🏾♂":"1f93e-1f3fe-200d-2642-fe0f","🤾🏿♂":"1f93e-1f3ff-200d-2642-fe0f","🤾♀️":"1f93e-200d-2640-fe0f","🤾🏻♀":"1f93e-1f3fb-200d-2640-fe0f","🤾🏼♀":"1f93e-1f3fc-200d-2640-fe0f","🤾🏽♀":"1f93e-1f3fd-200d-2640-fe0f","🤾🏾♀":"1f93e-1f3fe-200d-2640-fe0f","🤾🏿♀":"1f93e-1f3ff-200d-2640-fe0f","🤹♂️":"1f939-200d-2642-fe0f","🤹🏻♂":"1f939-1f3fb-200d-2642-fe0f","🤹🏼♂":"1f939-1f3fc-200d-2642-fe0f","🤹🏽♂":"1f939-1f3fd-200d-2642-fe0f","🤹🏾♂":"1f939-1f3fe-200d-2642-fe0f","🤹🏿♂":"1f939-1f3ff-200d-2642-fe0f","🤹♀️":"1f939-200d-2640-fe0f","🤹🏻♀":"1f939-1f3fb-200d-2640-fe0f","🤹🏼♀":"1f939-1f3fc-200d-2640-fe0f","🤹🏽♀":"1f939-1f3fd-200d-2640-fe0f","🤹🏾♀":"1f939-1f3fe-200d-2640-fe0f","🤹🏿♀":"1f939-1f3ff-200d-2640-fe0f","👁🗨️":"1f441-200d-1f5e8","👁️🗨":"1f441-200d-1f5e8","🏳️🌈":"1f3f3-fe0f-200d-1f308","👨🏻⚕️":"1f468-1f3fb-200d-2695-fe0f","👨🏼⚕️":"1f468-1f3fc-200d-2695-fe0f","👨🏽⚕️":"1f468-1f3fd-200d-2695-fe0f","👨🏾⚕️":"1f468-1f3fe-200d-2695-fe0f","👨🏿⚕️":"1f468-1f3ff-200d-2695-fe0f","👩🏻⚕️":"1f469-1f3fb-200d-2695-fe0f","👩🏼⚕️":"1f469-1f3fc-200d-2695-fe0f","👩🏽⚕️":"1f469-1f3fd-200d-2695-fe0f","👩🏾⚕️":"1f469-1f3fe-200d-2695-fe0f","👩🏿⚕️":"1f469-1f3ff-200d-2695-fe0f","👨🏻⚖️":"1f468-1f3fb-200d-2696-fe0f","👨🏼⚖️":"1f468-1f3fc-200d-2696-fe0f","👨🏽⚖️":"1f468-1f3fd-200d-2696-fe0f","👨🏾⚖️":"1f468-1f3fe-200d-2696-fe0f","👨🏿⚖️":"1f468-1f3ff-200d-2696-fe0f","👩🏻⚖️":"1f469-1f3fb-200d-2696-fe0f","👩🏼⚖️":"1f469-1f3fc-200d-2696-fe0f","👩🏽⚖️":"1f469-1f3fd-200d-2696-fe0f","👩🏾⚖️":"1f469-1f3fe-200d-2696-fe0f","👩🏿⚖️":"1f469-1f3ff-200d-2696-fe0f","👨🏻✈️":"1f468-1f3fb-200d-2708-fe0f","👨🏼✈️":"1f468-1f3fc-200d-2708-fe0f","👨🏽✈️":"1f468-1f3fd-200d-2708-fe0f","👨🏾✈️":"1f468-1f3fe-200d-2708-fe0f","👨🏿✈️":"1f468-1f3ff-200d-2708-fe0f","👩🏻✈️":"1f469-1f3fb-200d-2708-fe0f","👩🏼✈️":"1f469-1f3fc-200d-2708-fe0f","👩🏽✈️":"1f469-1f3fd-200d-2708-fe0f","👩🏾✈️":"1f469-1f3fe-200d-2708-fe0f","👩🏿✈️":"1f469-1f3ff-200d-2708-fe0f","👮🏻♂️":"1f46e-1f3fb-200d-2642-fe0f","👮🏼♂️":"1f46e-1f3fc-200d-2642-fe0f","👮🏽♂️":"1f46e-1f3fd-200d-2642-fe0f","👮🏾♂️":"1f46e-1f3fe-200d-2642-fe0f","👮🏿♂️":"1f46e-1f3ff-200d-2642-fe0f","👮🏻♀️":"1f46e-1f3fb-200d-2640-fe0f","👮🏼♀️":"1f46e-1f3fc-200d-2640-fe0f","👮🏽♀️":"1f46e-1f3fd-200d-2640-fe0f","👮🏾♀️":"1f46e-1f3fe-200d-2640-fe0f","👮🏿♀️":"1f46e-1f3ff-200d-2640-fe0f","🕵️♂️":"1f575-fe0f-200d-2642-fe0f","🕵🏻♂️":"1f575-1f3fb-200d-2642-fe0f","🕵🏼♂️":"1f575-1f3fc-200d-2642-fe0f","🕵🏽♂️":"1f575-1f3fd-200d-2642-fe0f","🕵🏾♂️":"1f575-1f3fe-200d-2642-fe0f","🕵🏿♂️":"1f575-1f3ff-200d-2642-fe0f","🕵️♀️":"1f575-fe0f-200d-2640-fe0f","🕵🏻♀️":"1f575-1f3fb-200d-2640-fe0f","🕵🏼♀️":"1f575-1f3fc-200d-2640-fe0f","🕵🏽♀️":"1f575-1f3fd-200d-2640-fe0f","🕵🏾♀️":"1f575-1f3fe-200d-2640-fe0f","🕵🏿♀️":"1f575-1f3ff-200d-2640-fe0f","💂🏻♂️":"1f482-1f3fb-200d-2642-fe0f","💂🏼♂️":"1f482-1f3fc-200d-2642-fe0f","💂🏽♂️":"1f482-1f3fd-200d-2642-fe0f","💂🏾♂️":"1f482-1f3fe-200d-2642-fe0f","💂🏿♂️":"1f482-1f3ff-200d-2642-fe0f","💂🏻♀️":"1f482-1f3fb-200d-2640-fe0f","💂🏼♀️":"1f482-1f3fc-200d-2640-fe0f","💂🏽♀️":"1f482-1f3fd-200d-2640-fe0f","💂🏾♀️":"1f482-1f3fe-200d-2640-fe0f","💂🏿♀️":"1f482-1f3ff-200d-2640-fe0f","👷🏻♂️":"1f477-1f3fb-200d-2642-fe0f","👷🏼♂️":"1f477-1f3fc-200d-2642-fe0f","👷🏽♂️":"1f477-1f3fd-200d-2642-fe0f","👷🏾♂️":"1f477-1f3fe-200d-2642-fe0f","👷🏿♂️":"1f477-1f3ff-200d-2642-fe0f","👷🏻♀️":"1f477-1f3fb-200d-2640-fe0f","👷🏼♀️":"1f477-1f3fc-200d-2640-fe0f","👷🏽♀️":"1f477-1f3fd-200d-2640-fe0f","👷🏾♀️":"1f477-1f3fe-200d-2640-fe0f","👷🏿♀️":"1f477-1f3ff-200d-2640-fe0f","👳🏻♂️":"1f473-1f3fb-200d-2642-fe0f","👳🏼♂️":"1f473-1f3fc-200d-2642-fe0f","👳🏽♂️":"1f473-1f3fd-200d-2642-fe0f","👳🏾♂️":"1f473-1f3fe-200d-2642-fe0f","👳🏿♂️":"1f473-1f3ff-200d-2642-fe0f","👳🏻♀️":"1f473-1f3fb-200d-2640-fe0f","👳🏼♀️":"1f473-1f3fc-200d-2640-fe0f","👳🏽♀️":"1f473-1f3fd-200d-2640-fe0f","👳🏾♀️":"1f473-1f3fe-200d-2640-fe0f","👳🏿♀️":"1f473-1f3ff-200d-2640-fe0f","👱🏻♂️":"1f471-1f3fb-200d-2642-fe0f","👱🏼♂️":"1f471-1f3fc-200d-2642-fe0f","👱🏽♂️":"1f471-1f3fd-200d-2642-fe0f","👱🏾♂️":"1f471-1f3fe-200d-2642-fe0f","👱🏿♂️":"1f471-1f3ff-200d-2642-fe0f","👱🏻♀️":"1f471-1f3fb-200d-2640-fe0f","👱🏼♀️":"1f471-1f3fc-200d-2640-fe0f","👱🏽♀️":"1f471-1f3fd-200d-2640-fe0f","👱🏾♀️":"1f471-1f3fe-200d-2640-fe0f","👱🏿♀️":"1f471-1f3ff-200d-2640-fe0f","🧙🏻♀️":"1f9d9-1f3fb-200d-2640-fe0f","🧙🏼♀️":"1f9d9-1f3fc-200d-2640-fe0f","🧙🏽♀️":"1f9d9-1f3fd-200d-2640-fe0f","🧙🏾♀️":"1f9d9-1f3fe-200d-2640-fe0f","🧙🏿♀️":"1f9d9-1f3ff-200d-2640-fe0f","🧙🏻♂️":"1f9d9-1f3fb-200d-2642-fe0f","🧙🏼♂️":"1f9d9-1f3fc-200d-2642-fe0f","🧙🏽♂️":"1f9d9-1f3fd-200d-2642-fe0f","🧙🏾♂️":"1f9d9-1f3fe-200d-2642-fe0f","🧙🏿♂️":"1f9d9-1f3ff-200d-2642-fe0f","🧚🏻♀️":"1f9da-1f3fb-200d-2640-fe0f","🧚🏼♀️":"1f9da-1f3fc-200d-2640-fe0f","🧚🏽♀️":"1f9da-1f3fd-200d-2640-fe0f","🧚🏾♀️":"1f9da-1f3fe-200d-2640-fe0f","🧚🏿♀️":"1f9da-1f3ff-200d-2640-fe0f","🧚🏻♂️":"1f9da-1f3fb-200d-2642-fe0f","🧚🏼♂️":"1f9da-1f3fc-200d-2642-fe0f","🧚🏽♂️":"1f9da-1f3fd-200d-2642-fe0f","🧚🏾♂️":"1f9da-1f3fe-200d-2642-fe0f","🧚🏿♂️":"1f9da-1f3ff-200d-2642-fe0f","🧛🏻♀️":"1f9db-1f3fb-200d-2640-fe0f","🧛🏼♀️":"1f9db-1f3fc-200d-2640-fe0f","🧛🏽♀️":"1f9db-1f3fd-200d-2640-fe0f","🧛🏾♀️":"1f9db-1f3fe-200d-2640-fe0f","🧛🏿♀️":"1f9db-1f3ff-200d-2640-fe0f","🧛🏻♂️":"1f9db-1f3fb-200d-2642-fe0f","🧛🏼♂️":"1f9db-1f3fc-200d-2642-fe0f","🧛🏽♂️":"1f9db-1f3fd-200d-2642-fe0f","🧛🏾♂️":"1f9db-1f3fe-200d-2642-fe0f","🧛🏿♂️":"1f9db-1f3ff-200d-2642-fe0f","🧜🏻♀️":"1f9dc-1f3fb-200d-2640-fe0f","🧜🏼♀️":"1f9dc-1f3fc-200d-2640-fe0f","🧜🏽♀️":"1f9dc-1f3fd-200d-2640-fe0f","🧜🏾♀️":"1f9dc-1f3fe-200d-2640-fe0f","🧜🏿♀️":"1f9dc-1f3ff-200d-2640-fe0f","🧜🏻♂️":"1f9dc-1f3fb-200d-2642-fe0f","🧜🏼♂️":"1f9dc-1f3fc-200d-2642-fe0f","🧜🏽♂️":"1f9dc-1f3fd-200d-2642-fe0f","🧜🏾♂️":"1f9dc-1f3fe-200d-2642-fe0f","🧜🏿♂️":"1f9dc-1f3ff-200d-2642-fe0f","🧝🏻♀️":"1f9dd-1f3fb-200d-2640-fe0f","🧝🏼♀️":"1f9dd-1f3fc-200d-2640-fe0f","🧝🏽♀️":"1f9dd-1f3fd-200d-2640-fe0f","🧝🏾♀️":"1f9dd-1f3fe-200d-2640-fe0f","🧝🏿♀️":"1f9dd-1f3ff-200d-2640-fe0f","🧝🏻♂️":"1f9dd-1f3fb-200d-2642-fe0f","🧝🏼♂️":"1f9dd-1f3fc-200d-2642-fe0f","🧝🏽♂️":"1f9dd-1f3fd-200d-2642-fe0f","🧝🏾♂️":"1f9dd-1f3fe-200d-2642-fe0f","🧝🏿♂️":"1f9dd-1f3ff-200d-2642-fe0f","🙍🏻♂️":"1f64d-1f3fb-200d-2642-fe0f","🙍🏼♂️":"1f64d-1f3fc-200d-2642-fe0f","🙍🏽♂️":"1f64d-1f3fd-200d-2642-fe0f","🙍🏾♂️":"1f64d-1f3fe-200d-2642-fe0f","🙍🏿♂️":"1f64d-1f3ff-200d-2642-fe0f","🙍🏻♀️":"1f64d-1f3fb-200d-2640-fe0f","🙍🏼♀️":"1f64d-1f3fc-200d-2640-fe0f","🙍🏽♀️":"1f64d-1f3fd-200d-2640-fe0f","🙍🏾♀️":"1f64d-1f3fe-200d-2640-fe0f","🙍🏿♀️":"1f64d-1f3ff-200d-2640-fe0f","🙎🏻♂️":"1f64e-1f3fb-200d-2642-fe0f","🙎🏼♂️":"1f64e-1f3fc-200d-2642-fe0f","🙎🏽♂️":"1f64e-1f3fd-200d-2642-fe0f","🙎🏾♂️":"1f64e-1f3fe-200d-2642-fe0f","🙎🏿♂️":"1f64e-1f3ff-200d-2642-fe0f","🙎🏻♀️":"1f64e-1f3fb-200d-2640-fe0f","🙎🏼♀️":"1f64e-1f3fc-200d-2640-fe0f","🙎🏽♀️":"1f64e-1f3fd-200d-2640-fe0f","🙎🏾♀️":"1f64e-1f3fe-200d-2640-fe0f","🙎🏿♀️":"1f64e-1f3ff-200d-2640-fe0f","🙅🏻♂️":"1f645-1f3fb-200d-2642-fe0f","🙅🏼♂️":"1f645-1f3fc-200d-2642-fe0f","🙅🏽♂️":"1f645-1f3fd-200d-2642-fe0f","🙅🏾♂️":"1f645-1f3fe-200d-2642-fe0f","🙅🏿♂️":"1f645-1f3ff-200d-2642-fe0f","🙅🏻♀️":"1f645-1f3fb-200d-2640-fe0f","🙅🏼♀️":"1f645-1f3fc-200d-2640-fe0f","🙅🏽♀️":"1f645-1f3fd-200d-2640-fe0f","🙅🏾♀️":"1f645-1f3fe-200d-2640-fe0f","🙅🏿♀️":"1f645-1f3ff-200d-2640-fe0f","🙆🏻♂️":"1f646-1f3fb-200d-2642-fe0f","🙆🏼♂️":"1f646-1f3fc-200d-2642-fe0f","🙆🏽♂️":"1f646-1f3fd-200d-2642-fe0f","🙆🏾♂️":"1f646-1f3fe-200d-2642-fe0f","🙆🏿♂️":"1f646-1f3ff-200d-2642-fe0f","🙆🏻♀️":"1f646-1f3fb-200d-2640-fe0f","🙆🏼♀️":"1f646-1f3fc-200d-2640-fe0f","🙆🏽♀️":"1f646-1f3fd-200d-2640-fe0f","🙆🏾♀️":"1f646-1f3fe-200d-2640-fe0f","🙆🏿♀️":"1f646-1f3ff-200d-2640-fe0f","💁🏻♂️":"1f481-1f3fb-200d-2642-fe0f","💁🏼♂️":"1f481-1f3fc-200d-2642-fe0f","💁🏽♂️":"1f481-1f3fd-200d-2642-fe0f","💁🏾♂️":"1f481-1f3fe-200d-2642-fe0f","💁🏿♂️":"1f481-1f3ff-200d-2642-fe0f","💁🏻♀️":"1f481-1f3fb-200d-2640-fe0f","💁🏼♀️":"1f481-1f3fc-200d-2640-fe0f","💁🏽♀️":"1f481-1f3fd-200d-2640-fe0f","💁🏾♀️":"1f481-1f3fe-200d-2640-fe0f","💁🏿♀️":"1f481-1f3ff-200d-2640-fe0f","🙋🏻♂️":"1f64b-1f3fb-200d-2642-fe0f","🙋🏼♂️":"1f64b-1f3fc-200d-2642-fe0f","🙋🏽♂️":"1f64b-1f3fd-200d-2642-fe0f","🙋🏾♂️":"1f64b-1f3fe-200d-2642-fe0f","🙋🏿♂️":"1f64b-1f3ff-200d-2642-fe0f","🙋🏻♀️":"1f64b-1f3fb-200d-2640-fe0f","🙋🏼♀️":"1f64b-1f3fc-200d-2640-fe0f","🙋🏽♀️":"1f64b-1f3fd-200d-2640-fe0f","🙋🏾♀️":"1f64b-1f3fe-200d-2640-fe0f","🙋🏿♀️":"1f64b-1f3ff-200d-2640-fe0f","🙇🏻♂️":"1f647-1f3fb-200d-2642-fe0f","🙇🏼♂️":"1f647-1f3fc-200d-2642-fe0f","🙇🏽♂️":"1f647-1f3fd-200d-2642-fe0f","🙇🏾♂️":"1f647-1f3fe-200d-2642-fe0f","🙇🏿♂️":"1f647-1f3ff-200d-2642-fe0f","🙇🏻♀️":"1f647-1f3fb-200d-2640-fe0f","🙇🏼♀️":"1f647-1f3fc-200d-2640-fe0f","🙇🏽♀️":"1f647-1f3fd-200d-2640-fe0f","🙇🏾♀️":"1f647-1f3fe-200d-2640-fe0f","🙇🏿♀️":"1f647-1f3ff-200d-2640-fe0f","🤦🏻♂️":"1f926-1f3fb-200d-2642-fe0f","🤦🏼♂️":"1f926-1f3fc-200d-2642-fe0f","🤦🏽♂️":"1f926-1f3fd-200d-2642-fe0f","🤦🏾♂️":"1f926-1f3fe-200d-2642-fe0f","🤦🏿♂️":"1f926-1f3ff-200d-2642-fe0f","🤦🏻♀️":"1f926-1f3fb-200d-2640-fe0f","🤦🏼♀️":"1f926-1f3fc-200d-2640-fe0f","🤦🏽♀️":"1f926-1f3fd-200d-2640-fe0f","🤦🏾♀️":"1f926-1f3fe-200d-2640-fe0f","🤦🏿♀️":"1f926-1f3ff-200d-2640-fe0f","🤷🏻♂️":"1f937-1f3fb-200d-2642-fe0f","🤷🏼♂️":"1f937-1f3fc-200d-2642-fe0f","🤷🏽♂️":"1f937-1f3fd-200d-2642-fe0f","🤷🏾♂️":"1f937-1f3fe-200d-2642-fe0f","🤷🏿♂️":"1f937-1f3ff-200d-2642-fe0f","🤷🏻♀️":"1f937-1f3fb-200d-2640-fe0f","🤷🏼♀️":"1f937-1f3fc-200d-2640-fe0f","🤷🏽♀️":"1f937-1f3fd-200d-2640-fe0f","🤷🏾♀️":"1f937-1f3fe-200d-2640-fe0f","🤷🏿♀️":"1f937-1f3ff-200d-2640-fe0f","💆🏻♂️":"1f486-1f3fb-200d-2642-fe0f","💆🏼♂️":"1f486-1f3fc-200d-2642-fe0f","💆🏽♂️":"1f486-1f3fd-200d-2642-fe0f","💆🏾♂️":"1f486-1f3fe-200d-2642-fe0f","💆🏿♂️":"1f486-1f3ff-200d-2642-fe0f","💆🏻♀️":"1f486-1f3fb-200d-2640-fe0f","💆🏼♀️":"1f486-1f3fc-200d-2640-fe0f","💆🏽♀️":"1f486-1f3fd-200d-2640-fe0f","💆🏾♀️":"1f486-1f3fe-200d-2640-fe0f","💆🏿♀️":"1f486-1f3ff-200d-2640-fe0f","💇🏻♂️":"1f487-1f3fb-200d-2642-fe0f","💇🏼♂️":"1f487-1f3fc-200d-2642-fe0f","💇🏽♂️":"1f487-1f3fd-200d-2642-fe0f","💇🏾♂️":"1f487-1f3fe-200d-2642-fe0f","💇🏿♂️":"1f487-1f3ff-200d-2642-fe0f","💇🏻♀️":"1f487-1f3fb-200d-2640-fe0f","💇🏼♀️":"1f487-1f3fc-200d-2640-fe0f","💇🏽♀️":"1f487-1f3fd-200d-2640-fe0f","💇🏾♀️":"1f487-1f3fe-200d-2640-fe0f","💇🏿♀️":"1f487-1f3ff-200d-2640-fe0f","🚶🏻♂️":"1f6b6-1f3fb-200d-2642-fe0f","🚶🏼♂️":"1f6b6-1f3fc-200d-2642-fe0f","🚶🏽♂️":"1f6b6-1f3fd-200d-2642-fe0f","🚶🏾♂️":"1f6b6-1f3fe-200d-2642-fe0f","🚶🏿♂️":"1f6b6-1f3ff-200d-2642-fe0f","🚶🏻♀️":"1f6b6-1f3fb-200d-2640-fe0f","🚶🏼♀️":"1f6b6-1f3fc-200d-2640-fe0f","🚶🏽♀️":"1f6b6-1f3fd-200d-2640-fe0f","🚶🏾♀️":"1f6b6-1f3fe-200d-2640-fe0f","🚶🏿♀️":"1f6b6-1f3ff-200d-2640-fe0f","🏃🏻♂️":"1f3c3-1f3fb-200d-2642-fe0f","🏃🏼♂️":"1f3c3-1f3fc-200d-2642-fe0f","🏃🏽♂️":"1f3c3-1f3fd-200d-2642-fe0f","🏃🏾♂️":"1f3c3-1f3fe-200d-2642-fe0f","🏃🏿♂️":"1f3c3-1f3ff-200d-2642-fe0f","🏃🏻♀️":"1f3c3-1f3fb-200d-2640-fe0f","🏃🏼♀️":"1f3c3-1f3fc-200d-2640-fe0f","🏃🏽♀️":"1f3c3-1f3fd-200d-2640-fe0f","🏃🏾♀️":"1f3c3-1f3fe-200d-2640-fe0f","🏃🏿♀️":"1f3c3-1f3ff-200d-2640-fe0f","🧖🏻♀️":"1f9d6-1f3fb-200d-2640-fe0f","🧖🏼♀️":"1f9d6-1f3fc-200d-2640-fe0f","🧖🏽♀️":"1f9d6-1f3fd-200d-2640-fe0f","🧖🏾♀️":"1f9d6-1f3fe-200d-2640-fe0f","🧖🏿♀️":"1f9d6-1f3ff-200d-2640-fe0f","🧖🏻♂️":"1f9d6-1f3fb-200d-2642-fe0f","🧖🏼♂️":"1f9d6-1f3fc-200d-2642-fe0f","🧖🏽♂️":"1f9d6-1f3fd-200d-2642-fe0f","🧖🏾♂️":"1f9d6-1f3fe-200d-2642-fe0f","🧖🏿♂️":"1f9d6-1f3ff-200d-2642-fe0f","🧗🏻♀️":"1f9d7-1f3fb-200d-2640-fe0f","🧗🏼♀️":"1f9d7-1f3fc-200d-2640-fe0f","🧗🏽♀️":"1f9d7-1f3fd-200d-2640-fe0f","🧗🏾♀️":"1f9d7-1f3fe-200d-2640-fe0f","🧗🏿♀️":"1f9d7-1f3ff-200d-2640-fe0f","🧗🏻♂️":"1f9d7-1f3fb-200d-2642-fe0f","🧗🏼♂️":"1f9d7-1f3fc-200d-2642-fe0f","🧗🏽♂️":"1f9d7-1f3fd-200d-2642-fe0f","🧗🏾♂️":"1f9d7-1f3fe-200d-2642-fe0f","🧗🏿♂️":"1f9d7-1f3ff-200d-2642-fe0f","🧘🏻♀️":"1f9d8-1f3fb-200d-2640-fe0f","🧘🏼♀️":"1f9d8-1f3fc-200d-2640-fe0f","🧘🏽♀️":"1f9d8-1f3fd-200d-2640-fe0f","🧘🏾♀️":"1f9d8-1f3fe-200d-2640-fe0f","🧘🏿♀️":"1f9d8-1f3ff-200d-2640-fe0f","🧘🏻♂️":"1f9d8-1f3fb-200d-2642-fe0f","🧘🏼♂️":"1f9d8-1f3fc-200d-2642-fe0f","🧘🏽♂️":"1f9d8-1f3fd-200d-2642-fe0f","🧘🏾♂️":"1f9d8-1f3fe-200d-2642-fe0f","🧘🏿♂️":"1f9d8-1f3ff-200d-2642-fe0f","🏌️♂️":"1f3cc-fe0f-200d-2642-fe0f","🏌🏻♂️":"1f3cc-1f3fb-200d-2642-fe0f","🏌🏼♂️":"1f3cc-1f3fc-200d-2642-fe0f","🏌🏽♂️":"1f3cc-1f3fd-200d-2642-fe0f","🏌🏾♂️":"1f3cc-1f3fe-200d-2642-fe0f","🏌🏿♂️":"1f3cc-1f3ff-200d-2642-fe0f","🏌️♀️":"1f3cc-fe0f-200d-2640-fe0f","🏌🏻♀️":"1f3cc-1f3fb-200d-2640-fe0f","🏌🏼♀️":"1f3cc-1f3fc-200d-2640-fe0f","🏌🏽♀️":"1f3cc-1f3fd-200d-2640-fe0f","🏌🏾♀️":"1f3cc-1f3fe-200d-2640-fe0f","🏌🏿♀️":"1f3cc-1f3ff-200d-2640-fe0f","🏄🏻♂️":"1f3c4-1f3fb-200d-2642-fe0f","🏄🏼♂️":"1f3c4-1f3fc-200d-2642-fe0f","🏄🏽♂️":"1f3c4-1f3fd-200d-2642-fe0f","🏄🏾♂️":"1f3c4-1f3fe-200d-2642-fe0f","🏄🏿♂️":"1f3c4-1f3ff-200d-2642-fe0f","🏄🏻♀️":"1f3c4-1f3fb-200d-2640-fe0f","🏄🏼♀️":"1f3c4-1f3fc-200d-2640-fe0f","🏄🏽♀️":"1f3c4-1f3fd-200d-2640-fe0f","🏄🏾♀️":"1f3c4-1f3fe-200d-2640-fe0f","🏄🏿♀️":"1f3c4-1f3ff-200d-2640-fe0f","🚣🏻♂️":"1f6a3-1f3fb-200d-2642-fe0f","🚣🏼♂️":"1f6a3-1f3fc-200d-2642-fe0f","🚣🏽♂️":"1f6a3-1f3fd-200d-2642-fe0f","🚣🏾♂️":"1f6a3-1f3fe-200d-2642-fe0f","🚣🏿♂️":"1f6a3-1f3ff-200d-2642-fe0f","🚣🏻♀️":"1f6a3-1f3fb-200d-2640-fe0f","🚣🏼♀️":"1f6a3-1f3fc-200d-2640-fe0f","🚣🏽♀️":"1f6a3-1f3fd-200d-2640-fe0f","🚣🏾♀️":"1f6a3-1f3fe-200d-2640-fe0f","🚣🏿♀️":"1f6a3-1f3ff-200d-2640-fe0f","🏊🏻♂️":"1f3ca-1f3fb-200d-2642-fe0f","🏊🏼♂️":"1f3ca-1f3fc-200d-2642-fe0f","🏊🏽♂️":"1f3ca-1f3fd-200d-2642-fe0f","🏊🏾♂️":"1f3ca-1f3fe-200d-2642-fe0f","🏊🏿♂️":"1f3ca-1f3ff-200d-2642-fe0f","🏊🏻♀️":"1f3ca-1f3fb-200d-2640-fe0f","🏊🏼♀️":"1f3ca-1f3fc-200d-2640-fe0f","🏊🏽♀️":"1f3ca-1f3fd-200d-2640-fe0f","🏊🏾♀️":"1f3ca-1f3fe-200d-2640-fe0f","🏊🏿♀️":"1f3ca-1f3ff-200d-2640-fe0f","⛹️♂️":"26f9-fe0f-200d-2642-fe0f","⛹🏻♂️":"26f9-1f3fb-200d-2642-fe0f","⛹🏼♂️":"26f9-1f3fc-200d-2642-fe0f","⛹🏽♂️":"26f9-1f3fd-200d-2642-fe0f","⛹🏾♂️":"26f9-1f3fe-200d-2642-fe0f","⛹🏿♂️":"26f9-1f3ff-200d-2642-fe0f","⛹️♀️":"26f9-fe0f-200d-2640-fe0f","⛹🏻♀️":"26f9-1f3fb-200d-2640-fe0f","⛹🏼♀️":"26f9-1f3fc-200d-2640-fe0f","⛹🏽♀️":"26f9-1f3fd-200d-2640-fe0f","⛹🏾♀️":"26f9-1f3fe-200d-2640-fe0f","⛹🏿♀️":"26f9-1f3ff-200d-2640-fe0f","🏋️♂️":"1f3cb-fe0f-200d-2642-fe0f","🏋🏻♂️":"1f3cb-1f3fb-200d-2642-fe0f","🏋🏼♂️":"1f3cb-1f3fc-200d-2642-fe0f","🏋🏽♂️":"1f3cb-1f3fd-200d-2642-fe0f","🏋🏾♂️":"1f3cb-1f3fe-200d-2642-fe0f","🏋🏿♂️":"1f3cb-1f3ff-200d-2642-fe0f","🏋️♀️":"1f3cb-fe0f-200d-2640-fe0f","🏋🏻♀️":"1f3cb-1f3fb-200d-2640-fe0f","🏋🏼♀️":"1f3cb-1f3fc-200d-2640-fe0f","🏋🏽♀️":"1f3cb-1f3fd-200d-2640-fe0f","🏋🏾♀️":"1f3cb-1f3fe-200d-2640-fe0f","🏋🏿♀️":"1f3cb-1f3ff-200d-2640-fe0f","🚴🏻♂️":"1f6b4-1f3fb-200d-2642-fe0f","🚴🏼♂️":"1f6b4-1f3fc-200d-2642-fe0f","🚴🏽♂️":"1f6b4-1f3fd-200d-2642-fe0f","🚴🏾♂️":"1f6b4-1f3fe-200d-2642-fe0f","🚴🏿♂️":"1f6b4-1f3ff-200d-2642-fe0f","🚴🏻♀️":"1f6b4-1f3fb-200d-2640-fe0f","🚴🏼♀️":"1f6b4-1f3fc-200d-2640-fe0f","🚴🏽♀️":"1f6b4-1f3fd-200d-2640-fe0f","🚴🏾♀️":"1f6b4-1f3fe-200d-2640-fe0f","🚴🏿♀️":"1f6b4-1f3ff-200d-2640-fe0f","🚵🏻♂️":"1f6b5-1f3fb-200d-2642-fe0f","🚵🏼♂️":"1f6b5-1f3fc-200d-2642-fe0f","🚵🏽♂️":"1f6b5-1f3fd-200d-2642-fe0f","🚵🏾♂️":"1f6b5-1f3fe-200d-2642-fe0f","🚵🏿♂️":"1f6b5-1f3ff-200d-2642-fe0f","🚵🏻♀️":"1f6b5-1f3fb-200d-2640-fe0f","🚵🏼♀️":"1f6b5-1f3fc-200d-2640-fe0f","🚵🏽♀️":"1f6b5-1f3fd-200d-2640-fe0f","🚵🏾♀️":"1f6b5-1f3fe-200d-2640-fe0f","🚵🏿♀️":"1f6b5-1f3ff-200d-2640-fe0f","🤸🏻♂️":"1f938-1f3fb-200d-2642-fe0f","🤸🏼♂️":"1f938-1f3fc-200d-2642-fe0f","🤸🏽♂️":"1f938-1f3fd-200d-2642-fe0f","🤸🏾♂️":"1f938-1f3fe-200d-2642-fe0f","🤸🏿♂️":"1f938-1f3ff-200d-2642-fe0f","🤸🏻♀️":"1f938-1f3fb-200d-2640-fe0f","🤸🏼♀️":"1f938-1f3fc-200d-2640-fe0f","🤸🏽♀️":"1f938-1f3fd-200d-2640-fe0f","🤸🏾♀️":"1f938-1f3fe-200d-2640-fe0f","🤸🏿♀️":"1f938-1f3ff-200d-2640-fe0f","🤽🏻♂️":"1f93d-1f3fb-200d-2642-fe0f","🤽🏼♂️":"1f93d-1f3fc-200d-2642-fe0f","🤽🏽♂️":"1f93d-1f3fd-200d-2642-fe0f","🤽🏾♂️":"1f93d-1f3fe-200d-2642-fe0f","🤽🏿♂️":"1f93d-1f3ff-200d-2642-fe0f","🤽🏻♀️":"1f93d-1f3fb-200d-2640-fe0f","🤽🏼♀️":"1f93d-1f3fc-200d-2640-fe0f","🤽🏽♀️":"1f93d-1f3fd-200d-2640-fe0f","🤽🏾♀️":"1f93d-1f3fe-200d-2640-fe0f","🤽🏿♀️":"1f93d-1f3ff-200d-2640-fe0f","🤾🏻♂️":"1f93e-1f3fb-200d-2642-fe0f","🤾🏼♂️":"1f93e-1f3fc-200d-2642-fe0f","🤾🏽♂️":"1f93e-1f3fd-200d-2642-fe0f","🤾🏾♂️":"1f93e-1f3fe-200d-2642-fe0f","🤾🏿♂️":"1f93e-1f3ff-200d-2642-fe0f","🤾🏻♀️":"1f93e-1f3fb-200d-2640-fe0f","🤾🏼♀️":"1f93e-1f3fc-200d-2640-fe0f","🤾🏽♀️":"1f93e-1f3fd-200d-2640-fe0f","🤾🏾♀️":"1f93e-1f3fe-200d-2640-fe0f","🤾🏿♀️":"1f93e-1f3ff-200d-2640-fe0f","🤹🏻♂️":"1f939-1f3fb-200d-2642-fe0f","🤹🏼♂️":"1f939-1f3fc-200d-2642-fe0f","🤹🏽♂️":"1f939-1f3fd-200d-2642-fe0f","🤹🏾♂️":"1f939-1f3fe-200d-2642-fe0f","🤹🏿♂️":"1f939-1f3ff-200d-2642-fe0f","🤹🏻♀️":"1f939-1f3fb-200d-2640-fe0f","🤹🏼♀️":"1f939-1f3fc-200d-2640-fe0f","🤹🏽♀️":"1f939-1f3fd-200d-2640-fe0f","🤹🏾♀️":"1f939-1f3fe-200d-2640-fe0f","🤹🏿♀️":"1f939-1f3ff-200d-2640-fe0f","👩❤👨":"1f469-200d-2764-fe0f-200d-1f468","👨❤👨":"1f468-200d-2764-fe0f-200d-1f468","👩❤👩":"1f469-200d-2764-fe0f-200d-1f469","👨👩👦":"1f468-200d-1f469-200d-1f466","👨👩👧":"1f468-200d-1f469-200d-1f467","👨👨👦":"1f468-200d-1f468-200d-1f466","👨👨👧":"1f468-200d-1f468-200d-1f467","👩👩👦":"1f469-200d-1f469-200d-1f466","👩👩👧":"1f469-200d-1f469-200d-1f467","👨👦👦":"1f468-200d-1f466-200d-1f466","👨👧👦":"1f468-200d-1f467-200d-1f466","👨👧👧":"1f468-200d-1f467-200d-1f467","👩👦👦":"1f469-200d-1f466-200d-1f466","👩👧👦":"1f469-200d-1f467-200d-1f466","👩👧👧":"1f469-200d-1f467-200d-1f467","👁️🗨️":"1f441-200d-1f5e8","👩❤️👨":"1f469-200d-2764-fe0f-200d-1f468","👨❤️👨":"1f468-200d-2764-fe0f-200d-1f468","👩❤️👩":"1f469-200d-2764-fe0f-200d-1f469","👩❤💋👨":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f468","👨❤💋👨":"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468","👩❤💋👩":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469","👨👩👧👦":"1f468-200d-1f469-200d-1f467-200d-1f466","👨👩👦👦":"1f468-200d-1f469-200d-1f466-200d-1f466","👨👩👧👧":"1f468-200d-1f469-200d-1f467-200d-1f467","👨👨👧👦":"1f468-200d-1f468-200d-1f467-200d-1f466","👨👨👦👦":"1f468-200d-1f468-200d-1f466-200d-1f466","👨👨👧👧":"1f468-200d-1f468-200d-1f467-200d-1f467","👩👩👧👦":"1f469-200d-1f469-200d-1f467-200d-1f466","👩👩👦👦":"1f469-200d-1f469-200d-1f466-200d-1f466","👩👩👧👧":"1f469-200d-1f469-200d-1f467-200d-1f467","🏴":"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f","🏴":"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f","🏴":"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f","👩❤️💋👨":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f468","👨❤️💋👨":"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468","👩❤️💋👩":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469"}
\ No newline at end of file
diff --git a/app/javascript/mastodon/emojione_light.js b/app/javascript/mastodon/emojione_light.js
index 0d07d012f0..2296497b08 100644
--- a/app/javascript/mastodon/emojione_light.js
+++ b/app/javascript/mastodon/emojione_light.js
@@ -1,13 +1,38 @@
// @preval
-// Force tree shaking on emojione by exposing just a subset of its functionality
+// http://www.unicode.org/Public/emoji/5.0/emoji-test.txt
-const emojione = require('emojione');
+const emojis = require('./emoji_map.json');
+const { emojiIndex } = require('emoji-mart');
+const excluded = ['®', '©', '™'];
+const skins = ['🏻', '🏼', '🏽', '🏾', '🏿'];
+const shortcodeMap = {};
-const mappedUnicode = emojione.mapUnicodeToShort();
-const excluded = ['®', '©', '™'];
+Object.keys(emojiIndex.emojis).forEach(key => {
+ shortcodeMap[emojiIndex.emojis[key].native] = emojiIndex.emojis[key].id;
+});
-module.exports.unicodeMapping = Object.keys(emojione.jsEscapeMap)
- .filter(c => !excluded.includes(c))
- .map(unicodeStr => [unicodeStr, mappedUnicode[emojione.jsEscapeMap[unicodeStr]]])
- .map(([unicodeStr, shortCode]) => ({ [unicodeStr]: [emojione.emojioneList[shortCode].fname, shortCode.slice(1, shortCode.length - 1)] }))
- .reduce((x, y) => Object.assign(x, y), { });
+const stripModifiers = unicode => {
+ skins.forEach(tone => {
+ unicode = unicode.replace(tone, '');
+ });
+
+ return unicode;
+};
+
+Object.keys(emojis).forEach(key => {
+ if (excluded.includes(key)) {
+ delete emojis[key];
+ return;
+ }
+
+ const normalizedKey = stripModifiers(key);
+ let shortcode = shortcodeMap[normalizedKey];
+
+ if (!shortcode) {
+ shortcode = shortcodeMap[normalizedKey + '\uFE0F'];
+ }
+
+ emojis[key] = [emojis[key], shortcode];
+});
+
+module.exports.unicodeMapping = emojis;
diff --git a/app/javascript/mastodon/features/account/components/action_bar.js b/app/javascript/mastodon/features/account/components/action_bar.js
index c12c0889e4..9e8fea69d1 100644
--- a/app/javascript/mastodon/features/account/components/action_bar.js
+++ b/app/javascript/mastodon/features/account/components/action_bar.js
@@ -26,7 +26,7 @@ export default class ActionBar extends React.PureComponent {
static propTypes = {
account: ImmutablePropTypes.map.isRequired,
- me: PropTypes.number.isRequired,
+ me: PropTypes.string.isRequired,
onFollow: PropTypes.func,
onBlock: PropTypes.func.isRequired,
onMention: PropTypes.func.isRequired,
diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js
index 7ab4922250..5402d67535 100644
--- a/app/javascript/mastodon/features/account/components/header.js
+++ b/app/javascript/mastodon/features/account/components/header.js
@@ -80,7 +80,7 @@ export default class Header extends ImmutablePureComponent {
static propTypes = {
account: ImmutablePropTypes.map,
- me: PropTypes.number.isRequired,
+ me: PropTypes.string.isRequired,
onFollow: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
autoPlayGif: PropTypes.bool.isRequired,
diff --git a/app/javascript/mastodon/features/account_gallery/index.js b/app/javascript/mastodon/features/account_gallery/index.js
index 0cfd98f231..2a88addc42 100644
--- a/app/javascript/mastodon/features/account_gallery/index.js
+++ b/app/javascript/mastodon/features/account_gallery/index.js
@@ -16,9 +16,9 @@ import { ScrollContainer } from 'react-router-scroll';
import LoadMore from '../../components/load_more';
const mapStateToProps = (state, props) => ({
- medias: getAccountGallery(state, Number(props.params.accountId)),
- isLoading: state.getIn(['timelines', `account:${Number(props.params.accountId)}:media`, 'isLoading']),
- hasMore: !!state.getIn(['timelines', `account:${Number(props.params.accountId)}:media`, 'next']),
+ medias: getAccountGallery(state, props.params.accountId),
+ isLoading: state.getIn(['timelines', `account:${props.params.accountId}:media`, 'isLoading']),
+ hasMore: !!state.getIn(['timelines', `account:${props.params.accountId}:media`, 'next']),
autoPlayGif: state.getIn(['meta', 'auto_play_gif']),
});
@@ -35,20 +35,20 @@ export default class AccountGallery extends ImmutablePureComponent {
};
componentDidMount () {
- this.props.dispatch(fetchAccount(Number(this.props.params.accountId)));
- this.props.dispatch(refreshAccountMediaTimeline(Number(this.props.params.accountId)));
+ this.props.dispatch(fetchAccount(this.props.params.accountId));
+ this.props.dispatch(refreshAccountMediaTimeline(this.props.params.accountId));
}
componentWillReceiveProps (nextProps) {
if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {
- this.props.dispatch(fetchAccount(Number(nextProps.params.accountId)));
- this.props.dispatch(refreshAccountMediaTimeline(Number(this.props.params.accountId)));
+ this.props.dispatch(fetchAccount(nextProps.params.accountId));
+ this.props.dispatch(refreshAccountMediaTimeline(this.props.params.accountId));
}
}
handleScrollToBottom = () => {
if (this.props.hasMore) {
- this.props.dispatch(expandAccountMediaTimeline(Number(this.props.params.accountId)));
+ this.props.dispatch(expandAccountMediaTimeline(this.props.params.accountId));
}
}
diff --git a/app/javascript/mastodon/features/account_timeline/components/header.js b/app/javascript/mastodon/features/account_timeline/components/header.js
index 09883d7d65..c3cd4e55dd 100644
--- a/app/javascript/mastodon/features/account_timeline/components/header.js
+++ b/app/javascript/mastodon/features/account_timeline/components/header.js
@@ -10,7 +10,7 @@ export default class Header extends ImmutablePureComponent {
static propTypes = {
account: ImmutablePropTypes.map,
- me: PropTypes.number.isRequired,
+ me: PropTypes.string.isRequired,
onFollow: PropTypes.func.isRequired,
onBlock: PropTypes.func.isRequired,
onMention: PropTypes.func.isRequired,
diff --git a/app/javascript/mastodon/features/account_timeline/containers/header_container.js b/app/javascript/mastodon/features/account_timeline/containers/header_container.js
index ac1364441c..9ad13a2310 100644
--- a/app/javascript/mastodon/features/account_timeline/containers/header_container.js
+++ b/app/javascript/mastodon/features/account_timeline/containers/header_container.js
@@ -26,7 +26,7 @@ const makeMapStateToProps = () => {
const getAccount = makeGetAccount();
const mapStateToProps = (state, { accountId }) => ({
- account: getAccount(state, Number(accountId)),
+ account: getAccount(state, accountId),
me: state.getIn(['meta', 'me']),
unfollowModal: state.getIn(['meta', 'unfollow_modal']),
});
diff --git a/app/javascript/mastodon/features/account_timeline/index.js b/app/javascript/mastodon/features/account_timeline/index.js
index 3c8b63114f..fe92216d53 100644
--- a/app/javascript/mastodon/features/account_timeline/index.js
+++ b/app/javascript/mastodon/features/account_timeline/index.js
@@ -13,9 +13,9 @@ import { List as ImmutableList } from 'immutable';
import ImmutablePureComponent from 'react-immutable-pure-component';
const mapStateToProps = (state, props) => ({
- statusIds: state.getIn(['timelines', `account:${Number(props.params.accountId)}`, 'items'], ImmutableList()),
- isLoading: state.getIn(['timelines', `account:${Number(props.params.accountId)}`, 'isLoading']),
- hasMore: !!state.getIn(['timelines', `account:${Number(props.params.accountId)}`, 'next']),
+ statusIds: state.getIn(['timelines', `account:${props.params.accountId}`, 'items'], ImmutableList()),
+ isLoading: state.getIn(['timelines', `account:${props.params.accountId}`, 'isLoading']),
+ hasMore: !!state.getIn(['timelines', `account:${props.params.accountId}`, 'next']),
me: state.getIn(['meta', 'me']),
});
@@ -28,24 +28,24 @@ export default class AccountTimeline extends ImmutablePureComponent {
statusIds: ImmutablePropTypes.list,
isLoading: PropTypes.bool,
hasMore: PropTypes.bool,
- me: PropTypes.number.isRequired,
+ me: PropTypes.string.isRequired,
};
componentWillMount () {
- this.props.dispatch(fetchAccount(Number(this.props.params.accountId)));
- this.props.dispatch(refreshAccountTimeline(Number(this.props.params.accountId)));
+ this.props.dispatch(fetchAccount(this.props.params.accountId));
+ this.props.dispatch(refreshAccountTimeline(this.props.params.accountId));
}
componentWillReceiveProps (nextProps) {
if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {
- this.props.dispatch(fetchAccount(Number(nextProps.params.accountId)));
- this.props.dispatch(refreshAccountTimeline(Number(nextProps.params.accountId)));
+ this.props.dispatch(fetchAccount(nextProps.params.accountId));
+ this.props.dispatch(refreshAccountTimeline(nextProps.params.accountId));
}
}
handleScrollToBottom = () => {
if (!this.props.isLoading && this.props.hasMore) {
- this.props.dispatch(expandAccountTimeline(Number(this.props.params.accountId)));
+ this.props.dispatch(expandAccountTimeline(this.props.params.accountId));
}
}
diff --git a/app/javascript/mastodon/features/compose/components/autosuggest_shortcode.js b/app/javascript/mastodon/features/compose/components/autosuggest_shortcode.js
deleted file mode 100644
index 4a0ef96b34..0000000000
--- a/app/javascript/mastodon/features/compose/components/autosuggest_shortcode.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import React from 'react';
-import ImmutablePureComponent from 'react-immutable-pure-component';
-import PropTypes from 'prop-types';
-import emojione from 'emojione';
-
-// This is bad, but I don't know how to make it work without importing the entirety of emojione.
-// taken from some old version of mastodon before they gutted emojione to "emojione_light"
-const shortnameToImage = str => str.replace(emojione.regShortNames, shortname => {
- if (typeof shortname === 'undefined' || shortname === '' || !(shortname in emojione.emojioneList)) {
- return shortname;
- }
-
- const unicode = emojione.emojioneList[shortname].unicode[emojione.emojioneList[shortname].unicode.length - 1];
- const alt = emojione.convert(unicode.toUpperCase());
-
- return ` `;
-});
-
-export default class AutosuggestShortcode extends ImmutablePureComponent {
-
- static propTypes = {
- shortcode: PropTypes.string.isRequired,
- };
-
- render () {
- const { shortcode } = this.props;
-
- let emoji = shortnameToImage(shortcode);
-
- return (
-
- );
- }
-
-}
diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js
index 5befd03374..b85105c53e 100644
--- a/app/javascript/mastodon/features/compose/components/compose_form.js
+++ b/app/javascript/mastodon/features/compose/components/compose_form.js
@@ -13,7 +13,7 @@ import SpoilerButtonContainer from '../containers/spoiler_button_container';
import PrivacyDropdownContainer from '../containers/privacy_dropdown_container';
import ComposeAdvancedOptionsContainer from '../../../../glitch/components/compose/advanced_options/container';
import SensitiveButtonContainer from '../containers/sensitive_button_container';
-import EmojiPickerDropdown from './emoji_picker_dropdown';
+import EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container';
import UploadFormContainer from '../containers/upload_form_container';
import WarningContainer from '../containers/warning_container';
import { isMobile } from '../../../is_mobile';
@@ -46,7 +46,7 @@ export default class ComposeForm extends ImmutablePureComponent {
preselectDate: PropTypes.instanceOf(Date),
is_submitting: PropTypes.bool,
is_uploading: PropTypes.bool,
- me: PropTypes.number,
+ me: PropTypes.string,
onChange: PropTypes.func.isRequired,
onSubmit: PropTypes.func.isRequired,
onClearSuggestions: PropTypes.func.isRequired,
@@ -98,10 +98,6 @@ export default class ComposeForm extends ImmutablePureComponent {
this.props.onFetchSuggestions(token);
}, 500, { trailing: true })
- onLocalSuggestionsFetchRequested = debounce((token) => {
- this.props.onFetchSuggestions(token);
- }, 100, { trailing: true })
-
onSuggestionSelected = (tokenStart, token, value) => {
this._restoreCaret = null;
this.props.onSuggestionSelected(tokenStart, token, value);
@@ -154,7 +150,7 @@ export default class ComposeForm extends ImmutablePureComponent {
handleEmojiPick = (data) => {
const position = this.autosuggestTextarea.textarea.selectionStart;
- const emojiChar = data.unicode.split('-').map(code => String.fromCodePoint(parseInt(code, 16))).join('');
+ const emojiChar = data.native;
this._restoreCaret = position + emojiChar.length + 1;
this.props.onPickEmoji(position, data);
}
@@ -238,7 +234,6 @@ export default class ComposeForm extends ImmutablePureComponent {
suggestions={this.props.suggestions}
onKeyDown={this.handleKeyDown}
onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}
- onLocalSuggestionsFetchRequested={this.onLocalSuggestionsFetchRequested}
onSuggestionsClearRequested={this.onSuggestionsClearRequested}
onSuggestionSelected={this.onSuggestionSelected}
onPaste={onPaste}
diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
index 9d05b7a343..621cc21ceb 100644
--- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
@@ -1,12 +1,19 @@
import React from 'react';
-import Dropdown, { DropdownTrigger, DropdownContent } from 'react-simple-dropdown';
import PropTypes from 'prop-types';
import { defineMessages, injectIntl } from 'react-intl';
-import { EmojiPicker as EmojiPickerAsync } from '../../ui/util/async-components';
+import { Picker, Emoji } from 'emoji-mart';
+import { Overlay } from 'react-overlays';
+import classNames from 'classnames';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import detectPassiveEvents from 'detect-passive-events';
const messages = defineMessages({
emoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' },
emoji_search: { id: 'emoji_button.search', defaultMessage: 'Search...' },
+ emoji_not_found: { id: 'emoji_button.not_found', defaultMessage: 'No emojos!! (╯°□°)╯︵ ┻━┻' },
+ custom: { id: 'emoji_button.custom', defaultMessage: 'Custom' },
+ recent: { id: 'emoji_button.recent', defaultMessage: 'Frequently used' },
+ search_results: { id: 'emoji_button.search_results', defaultMessage: 'Search results' },
people: { id: 'emoji_button.people', defaultMessage: 'People' },
nature: { id: 'emoji_button.nature', defaultMessage: 'Nature' },
food: { id: 'emoji_button.food', defaultMessage: 'Food & Drink' },
@@ -17,48 +24,250 @@ const messages = defineMessages({
flags: { id: 'emoji_button.flags', defaultMessage: 'Flags' },
});
-const settings = {
- imageType: 'png',
- sprites: false,
- imagePathPNG: '/emoji/',
-};
+const assetHost = process.env.CDN_HOST || '';
+const backgroundImageFn = () => `${assetHost}/emoji/sheet.png`;
+const listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;
-let EmojiPicker; // load asynchronously
+class ModifierPickerMenu extends React.PureComponent {
+
+ static propTypes = {
+ active: PropTypes.bool,
+ onSelect: PropTypes.func.isRequired,
+ onClose: PropTypes.func.isRequired,
+ };
+
+ handleClick = (e) => {
+ const modifier = [].slice.call(e.currentTarget.parentNode.children).indexOf(e.target) + 1;
+ this.props.onSelect(modifier);
+ }
+
+ componentWillReceiveProps (nextProps) {
+ if (nextProps.active) {
+ this.attachListeners();
+ } else {
+ this.removeListeners();
+ }
+ }
+
+ componentWillUnmount () {
+ this.removeListeners();
+ }
+
+ handleDocumentClick = e => {
+ if (this.node && !this.node.contains(e.target)) {
+ this.props.onClose();
+ }
+ }
+
+ attachListeners () {
+ document.addEventListener('click', this.handleDocumentClick, false);
+ document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
+ }
+
+ removeListeners () {
+ document.removeEventListener('click', this.handleDocumentClick, false);
+ document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions);
+ }
+
+ setRef = c => {
+ this.node = c;
+ }
+
+ render () {
+ const { active } = this.props;
+
+ return (
+
+
+
+
+
+
+
+
+ );
+ }
+
+}
+
+class ModifierPicker extends React.PureComponent {
+
+ static propTypes = {
+ active: PropTypes.bool,
+ modifier: PropTypes.number,
+ onChange: PropTypes.func,
+ onClose: PropTypes.func,
+ onOpen: PropTypes.func,
+ };
+
+ handleClick = () => {
+ if (this.props.active) {
+ this.props.onClose();
+ } else {
+ this.props.onOpen();
+ }
+ }
+
+ handleSelect = modifier => {
+ this.props.onChange(modifier);
+ this.props.onClose();
+ }
+
+ render () {
+ const { active, modifier } = this.props;
+
+ return (
+
+
+
+
+ );
+ }
+
+}
+
+@injectIntl
+class EmojiPickerMenu extends React.PureComponent {
+
+ static propTypes = {
+ custom_emojis: ImmutablePropTypes.list,
+ onClose: PropTypes.func.isRequired,
+ onPick: PropTypes.func.isRequired,
+ style: PropTypes.object,
+ placement: PropTypes.string,
+ arrowOffsetLeft: PropTypes.string,
+ arrowOffsetTop: PropTypes.string,
+ intl: PropTypes.object.isRequired,
+ };
+
+ static defaultProps = {
+ style: {},
+ placement: 'bottom',
+ };
+
+ state = {
+ modifierOpen: false,
+ modifier: 1,
+ };
+
+ handleDocumentClick = e => {
+ if (this.node && !this.node.contains(e.target)) {
+ this.props.onClose();
+ }
+ }
+
+ componentDidMount () {
+ document.addEventListener('click', this.handleDocumentClick, false);
+ document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
+ }
+
+ componentWillUnmount () {
+ document.removeEventListener('click', this.handleDocumentClick, false);
+ document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions);
+ }
+
+ setRef = c => {
+ this.node = c;
+ }
+
+ getI18n = () => {
+ const { intl } = this.props;
+
+ return {
+ search: intl.formatMessage(messages.emoji_search),
+ notfound: intl.formatMessage(messages.emoji_not_found),
+ categories: {
+ search: intl.formatMessage(messages.search_results),
+ recent: intl.formatMessage(messages.recent),
+ people: intl.formatMessage(messages.people),
+ nature: intl.formatMessage(messages.nature),
+ foods: intl.formatMessage(messages.food),
+ activity: intl.formatMessage(messages.activity),
+ places: intl.formatMessage(messages.travel),
+ objects: intl.formatMessage(messages.objects),
+ symbols: intl.formatMessage(messages.symbols),
+ flags: intl.formatMessage(messages.flags),
+ custom: intl.formatMessage(messages.custom),
+ },
+ };
+ }
+
+ handleClick = emoji => {
+ if (!emoji.native) {
+ emoji.native = emoji.colons;
+ }
+
+ this.props.onClose();
+ this.props.onPick(emoji);
+ }
+
+ handleModifierOpen = () => {
+ this.setState({ modifierOpen: true });
+ }
+
+ handleModifierClose = () => {
+ this.setState({ modifierOpen: false });
+ }
+
+ handleModifierChange = modifier => {
+ if (modifier !== this.state.modifier) {
+ this.setState({ modifier });
+ }
+ }
+
+ render () {
+ const { style, intl } = this.props;
+ const title = intl.formatMessage(messages.emoji);
+ const { modifierOpen, modifier } = this.state;
+
+ return (
+
+ );
+ }
+
+}
@injectIntl
export default class EmojiPickerDropdown extends React.PureComponent {
static propTypes = {
+ custom_emojis: ImmutablePropTypes.list,
intl: PropTypes.object.isRequired,
onPickEmoji: PropTypes.func.isRequired,
};
state = {
active: false,
- loading: false,
};
setRef = (c) => {
this.dropdown = c;
}
- handleChange = (data) => {
- this.dropdown.hide();
- this.props.onPickEmoji(data);
- }
-
onShowDropdown = () => {
this.setState({ active: true });
- if (!EmojiPicker) {
- this.setState({ loading: true });
- EmojiPickerAsync().then(TheEmojiPicker => {
- EmojiPicker = TheEmojiPicker.default;
- this.setState({ loading: false });
- }).catch(() => {
- // TODO: show the user an error?
- this.setState({ loading: false });
- });
- }
}
onHideDropdown = () => {
@@ -66,7 +275,7 @@ export default class EmojiPickerDropdown extends React.PureComponent {
}
onToggle = (e) => {
- if (!this.state.loading && (!e.key || e.key === 'Enter')) {
+ if (!e.key || e.key === 'Enter') {
if (this.state.active) {
this.onHideDropdown();
} else {
@@ -75,70 +284,43 @@ export default class EmojiPickerDropdown extends React.PureComponent {
}
}
- onEmojiPickerKeyDown = (e) => {
+ handleKeyDown = e => {
if (e.key === 'Escape') {
this.onHideDropdown();
}
}
+ setTargetRef = c => {
+ this.target = c;
+ }
+
+ findTarget = () => {
+ return this.target;
+ }
+
render () {
- const { intl } = this.props;
-
- const categories = {
- people: {
- title: intl.formatMessage(messages.people),
- emoji: 'smile',
- },
- nature: {
- title: intl.formatMessage(messages.nature),
- emoji: 'hamster',
- },
- food: {
- title: intl.formatMessage(messages.food),
- emoji: 'pizza',
- },
- activity: {
- title: intl.formatMessage(messages.activity),
- emoji: 'soccer',
- },
- travel: {
- title: intl.formatMessage(messages.travel),
- emoji: 'earth_americas',
- },
- objects: {
- title: intl.formatMessage(messages.objects),
- emoji: 'bulb',
- },
- symbols: {
- title: intl.formatMessage(messages.symbols),
- emoji: 'clock9',
- },
- flags: {
- title: intl.formatMessage(messages.flags),
- emoji: 'flag_gb',
- },
- };
-
- const { active, loading } = this.state;
+ const { intl, onPickEmoji } = this.props;
const title = intl.formatMessage(messages.emoji);
+ const { active } = this.state;
return (
-
-
+
+
-
+
-
- {
- this.state.active && !this.state.loading &&
- ( )
- }
-
-
+
+
+
+
);
}
diff --git a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
index da3c0a0ab2..0474dfb4e3 100644
--- a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
@@ -2,6 +2,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import { injectIntl, defineMessages } from 'react-intl';
import IconButton from '../../../components/icon_button';
+import detectPassiveEvents from 'detect-passive-events';
const messages = defineMessages({
public_short: { id: 'privacy.public.short', defaultMessage: 'Public' },
@@ -89,12 +90,12 @@ export default class PrivacyDropdown extends React.PureComponent {
componentDidMount () {
window.addEventListener('click', this.onGlobalClick);
- window.addEventListener('touchstart', this.onGlobalClick);
+ window.addEventListener('touchstart', this.onGlobalClick, detectPassiveEvents.hasSupport ? { passive: true } : false);
}
componentWillUnmount () {
window.removeEventListener('click', this.onGlobalClick);
- window.removeEventListener('touchstart', this.onGlobalClick);
+ window.removeEventListener('touchstart', this.onGlobalClick, detectPassiveEvents.hasSupport ? { passive: true } : false);
}
setRef = (c) => {
diff --git a/app/javascript/mastodon/features/compose/components/upload_form.js b/app/javascript/mastodon/features/compose/components/upload_form.js
index 78473dab40..cf2d2658ae 100644
--- a/app/javascript/mastodon/features/compose/components/upload_form.js
+++ b/app/javascript/mastodon/features/compose/components/upload_form.js
@@ -21,7 +21,7 @@ export default class UploadForm extends React.PureComponent {
};
onRemoveFile = (e) => {
- const id = Number(e.currentTarget.parentElement.getAttribute('data-id'));
+ const id = e.currentTarget.parentElement.getAttribute('data-id');
this.props.onRemoveFile(id);
}
diff --git a/app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js b/app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js
new file mode 100644
index 0000000000..7a8026bbc6
--- /dev/null
+++ b/app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js
@@ -0,0 +1,8 @@
+import { connect } from 'react-redux';
+import EmojiPickerDropdown from '../components/emoji_picker_dropdown';
+
+const mapStateToProps = state => ({
+ custom_emojis: state.get('custom_emojis'),
+});
+
+export default connect(mapStateToProps)(EmojiPickerDropdown);
diff --git a/app/javascript/mastodon/features/compose/containers/warning_container.js b/app/javascript/mastodon/features/compose/containers/warning_container.js
index 6e7d11c634..35eab5976d 100644
--- a/app/javascript/mastodon/features/compose/containers/warning_container.js
+++ b/app/javascript/mastodon/features/compose/containers/warning_container.js
@@ -1,51 +1,23 @@
import React from 'react';
-import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
import Warning from '../components/warning';
-import { createSelector } from 'reselect';
import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
-import { OrderedSet } from 'immutable';
-const getMentionedUsernames = createSelector(state => state.getIn(['compose', 'text']), text => text.match(/(?:^|[^\/\w])@([a-z0-9_]+@[a-z0-9\.\-]+)/ig));
-
-const getMentionedDomains = createSelector(getMentionedUsernames, mentionedUsernamesWithDomains => {
- return OrderedSet(mentionedUsernamesWithDomains !== null ? mentionedUsernamesWithDomains.map(item => item.split('@')[2]) : []);
+const mapStateToProps = state => ({
+ needsLockWarning: state.getIn(['compose', 'privacy']) === 'private' && !state.getIn(['accounts', state.getIn(['meta', 'me']), 'locked']),
});
-const mapStateToProps = state => {
- const mentionedUsernames = getMentionedUsernames(state);
- const mentionedUsernamesWithDomains = getMentionedDomains(state);
-
- return {
- needsLeakWarning: (state.getIn(['compose', 'privacy']) === 'private' || state.getIn(['compose', 'privacy']) === 'direct') && mentionedUsernames !== null,
- mentionedDomains: mentionedUsernamesWithDomains,
- needsLockWarning: state.getIn(['compose', 'privacy']) === 'private' && !state.getIn(['accounts', state.getIn(['meta', 'me']), 'locked']),
- };
-};
-
-const WarningWrapper = ({ needsLeakWarning, needsLockWarning, mentionedDomains }) => {
+const WarningWrapper = ({ needsLockWarning }) => {
if (needsLockWarning) {
return }} />} />;
- } else if (needsLeakWarning) {
- return (
- {mentionedDomains.join(', ')}, domainsCount: mentionedDomains.size }}
- />}
- />
- );
}
return null;
};
WarningWrapper.propTypes = {
- needsLeakWarning: PropTypes.bool,
needsLockWarning: PropTypes.bool,
- mentionedDomains: ImmutablePropTypes.orderedSet.isRequired,
};
export default connect(mapStateToProps)(WarningWrapper);
diff --git a/app/javascript/mastodon/features/compose/util/counter.js b/app/javascript/mastodon/features/compose/util/counter.js
index f0fea1a0e5..588a372c6e 100644
--- a/app/javascript/mastodon/features/compose/util/counter.js
+++ b/app/javascript/mastodon/features/compose/util/counter.js
@@ -1,7 +1,9 @@
+import { urlRegex } from './url_regex';
+
const urlPlaceholder = 'xxxxxxxxxxxxxxxxxxxxxxx';
export function countableText(inputText) {
return inputText
- .replace(/https?:\/\/\S+/g, urlPlaceholder)
+ .replace(urlRegex, urlPlaceholder)
.replace(/(?:^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+)/ig, '@$2');
};
diff --git a/app/javascript/mastodon/features/compose/util/url_regex.js b/app/javascript/mastodon/features/compose/util/url_regex.js
new file mode 100644
index 0000000000..e676d18794
--- /dev/null
+++ b/app/javascript/mastodon/features/compose/util/url_regex.js
@@ -0,0 +1,196 @@
+const regexen = {};
+
+const regexSupplant = function(regex, flags) {
+ flags = flags || '';
+ if (typeof regex !== 'string') {
+ if (regex.global && flags.indexOf('g') < 0) {
+ flags += 'g';
+ }
+ if (regex.ignoreCase && flags.indexOf('i') < 0) {
+ flags += 'i';
+ }
+ if (regex.multiline && flags.indexOf('m') < 0) {
+ flags += 'm';
+ }
+
+ regex = regex.source;
+ }
+ return new RegExp(regex.replace(/#\{(\w+)\}/g, function(match, name) {
+ var newRegex = regexen[name] || '';
+ if (typeof newRegex !== 'string') {
+ newRegex = newRegex.source;
+ }
+ return newRegex;
+ }), flags);
+};
+
+const stringSupplant = function(str, values) {
+ return str.replace(/#\{(\w+)\}/g, function(match, name) {
+ return values[name] || '';
+ });
+};
+
+export const urlRegex = (function() {
+ regexen.spaces_group = /\x09-\x0D\x20\x85\xA0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000/;
+ regexen.invalid_chars_group = /\uFFFE\uFEFF\uFFFF\u202A-\u202E/;
+ regexen.punct = /\!'#%&'\(\)*\+,\\\-\.\/:;<=>\?@\[\]\^_{|}~\$/;
+ regexen.validUrlPrecedingChars = regexSupplant(/(?:[^A-Za-z0-9@@$###{invalid_chars_group}]|^)/);
+ regexen.invalidDomainChars = stringSupplant('#{punct}#{spaces_group}#{invalid_chars_group}', regexen);
+ regexen.validDomainChars = regexSupplant(/[^#{invalidDomainChars}]/);
+ regexen.validSubdomain = regexSupplant(/(?:(?:#{validDomainChars}(?:[_-]|#{validDomainChars})*)?#{validDomainChars}\.)/);
+ regexen.validDomainName = regexSupplant(/(?:(?:#{validDomainChars}(?:-|#{validDomainChars})*)?#{validDomainChars}\.)/);
+ regexen.validGTLD = regexSupplant(RegExp(
+ '(?:(?:' +
+ '삼성|닷컴|닷넷|香格里拉|餐厅|食品|飞利浦|電訊盈科|集团|通販|购物|谷歌|诺基亚|联通|网络|网站|网店|网址|组织机构|移动|珠宝|点看|游戏|淡马锡|机构|書籍|时尚|新闻|政府|' +
+ '政务|手表|手机|我爱你|慈善|微博|广东|工行|家電|娱乐|天主教|大拿|大众汽车|在线|嘉里大酒店|嘉里|商标|商店|商城|公益|公司|八卦|健康|信息|佛山|企业|中文网|中信|世界|' +
+ 'ポイント|ファッション|セール|ストア|コム|グーグル|クラウド|みんな|คอม|संगठन|नेट|कॉम|همراه|موقع|موبايلي|كوم|كاثوليك|عرب|شبكة|' +
+ 'بيتك|بازار|العليان|ارامكو|اتصالات|ابوظبي|קום|сайт|рус|орг|онлайн|москва|ком|католик|дети|' +
+ 'zuerich|zone|zippo|zip|zero|zara|zappos|yun|youtube|you|yokohama|yoga|yodobashi|yandex|yamaxun|' +
+ 'yahoo|yachts|xyz|xxx|xperia|xin|xihuan|xfinity|xerox|xbox|wtf|wtc|wow|world|works|work|woodside|' +
+ 'wolterskluwer|wme|winners|wine|windows|win|williamhill|wiki|wien|whoswho|weir|weibo|wedding|wed|' +
+ 'website|weber|webcam|weatherchannel|weather|watches|watch|warman|wanggou|wang|walter|walmart|' +
+ 'wales|vuelos|voyage|voto|voting|vote|volvo|volkswagen|vodka|vlaanderen|vivo|viva|vistaprint|' +
+ 'vista|vision|visa|virgin|vip|vin|villas|viking|vig|video|viajes|vet|versicherung|' +
+ 'vermögensberatung|vermögensberater|verisign|ventures|vegas|vanguard|vana|vacations|ups|uol|uno|' +
+ 'university|unicom|uconnect|ubs|ubank|tvs|tushu|tunes|tui|tube|trv|trust|travelersinsurance|' +
+ 'travelers|travelchannel|travel|training|trading|trade|toys|toyota|town|tours|total|toshiba|' +
+ 'toray|top|tools|tokyo|today|tmall|tkmaxx|tjx|tjmaxx|tirol|tires|tips|tiffany|tienda|tickets|' +
+ 'tiaa|theatre|theater|thd|teva|tennis|temasek|telefonica|telecity|tel|technology|tech|team|tdk|' +
+ 'tci|taxi|tax|tattoo|tatar|tatamotors|target|taobao|talk|taipei|tab|systems|symantec|sydney|' +
+ 'swiss|swiftcover|swatch|suzuki|surgery|surf|support|supply|supplies|sucks|style|study|studio|' +
+ 'stream|store|storage|stockholm|stcgroup|stc|statoil|statefarm|statebank|starhub|star|staples|' +
+ 'stada|srt|srl|spreadbetting|spot|spiegel|space|soy|sony|song|solutions|solar|sohu|software|' +
+ 'softbank|social|soccer|sncf|smile|smart|sling|skype|sky|skin|ski|site|singles|sina|silk|shriram|' +
+ 'showtime|show|shouji|shopping|shop|shoes|shiksha|shia|shell|shaw|sharp|shangrila|sfr|sexy|sex|' +
+ 'sew|seven|ses|services|sener|select|seek|security|secure|seat|search|scot|scor|scjohnson|' +
+ 'science|schwarz|schule|school|scholarships|schmidt|schaeffler|scb|sca|sbs|sbi|saxo|save|sas|' +
+ 'sarl|sapo|sap|sanofi|sandvikcoromant|sandvik|samsung|samsclub|salon|sale|sakura|safety|safe|' +
+ 'saarland|ryukyu|rwe|run|ruhr|rugby|rsvp|room|rogers|rodeo|rocks|rocher|rmit|rip|rio|ril|' +
+ 'rightathome|ricoh|richardli|rich|rexroth|reviews|review|restaurant|rest|republican|report|' +
+ 'repair|rentals|rent|ren|reliance|reit|reisen|reise|rehab|redumbrella|redstone|red|recipes|' +
+ 'realty|realtor|realestate|read|raid|radio|racing|qvc|quest|quebec|qpon|pwc|pub|prudential|pru|' +
+ 'protection|property|properties|promo|progressive|prof|productions|prod|pro|prime|press|praxi|' +
+ 'pramerica|post|porn|politie|poker|pohl|pnc|plus|plumbing|playstation|play|place|pizza|pioneer|' +
+ 'pink|ping|pin|pid|pictures|pictet|pics|piaget|physio|photos|photography|photo|phone|philips|phd|' +
+ 'pharmacy|pfizer|pet|pccw|pay|passagens|party|parts|partners|pars|paris|panerai|panasonic|' +
+ 'pamperedchef|page|ovh|ott|otsuka|osaka|origins|orientexpress|organic|org|orange|oracle|open|ooo|' +
+ 'onyourside|online|onl|ong|one|omega|ollo|oldnavy|olayangroup|olayan|okinawa|office|off|observer|' +
+ 'obi|nyc|ntt|nrw|nra|nowtv|nowruz|now|norton|northwesternmutual|nokia|nissay|nissan|ninja|nikon|' +
+ 'nike|nico|nhk|ngo|nfl|nexus|nextdirect|next|news|newholland|new|neustar|network|netflix|netbank|' +
+ 'net|nec|nba|navy|natura|nationwide|name|nagoya|nadex|nab|mutuelle|mutual|museum|mtr|mtpc|mtn|' +
+ 'msd|movistar|movie|mov|motorcycles|moto|moscow|mortgage|mormon|mopar|montblanc|monster|money|' +
+ 'monash|mom|moi|moe|moda|mobily|mobile|mobi|mma|mls|mlb|mitsubishi|mit|mint|mini|mil|microsoft|' +
+ 'miami|metlife|merckmsd|meo|menu|men|memorial|meme|melbourne|meet|media|med|mckinsey|mcdonalds|' +
+ 'mcd|mba|mattel|maserati|marshalls|marriott|markets|marketing|market|map|mango|management|man|' +
+ 'makeup|maison|maif|madrid|macys|luxury|luxe|lupin|lundbeck|ltda|ltd|lplfinancial|lpl|love|lotto|' +
+ 'lotte|london|lol|loft|locus|locker|loans|loan|lixil|living|live|lipsy|link|linde|lincoln|limo|' +
+ 'limited|lilly|like|lighting|lifestyle|lifeinsurance|life|lidl|liaison|lgbt|lexus|lego|legal|' +
+ 'lefrak|leclerc|lease|lds|lawyer|law|latrobe|latino|lat|lasalle|lanxess|landrover|land|lancome|' +
+ 'lancia|lancaster|lamer|lamborghini|ladbrokes|lacaixa|kyoto|kuokgroup|kred|krd|kpn|kpmg|kosher|' +
+ 'komatsu|koeln|kiwi|kitchen|kindle|kinder|kim|kia|kfh|kerryproperties|kerrylogistics|kerryhotels|' +
+ 'kddi|kaufen|juniper|juegos|jprs|jpmorgan|joy|jot|joburg|jobs|jnj|jmp|jll|jlc|jio|jewelry|jetzt|' +
+ 'jeep|jcp|jcb|java|jaguar|iwc|iveco|itv|itau|istanbul|ist|ismaili|iselect|irish|ipiranga|' +
+ 'investments|intuit|international|intel|int|insure|insurance|institute|ink|ing|info|infiniti|' +
+ 'industries|immobilien|immo|imdb|imamat|ikano|iinet|ifm|ieee|icu|ice|icbc|ibm|hyundai|hyatt|' +
+ 'hughes|htc|hsbc|how|house|hotmail|hotels|hoteles|hot|hosting|host|hospital|horse|honeywell|' +
+ 'honda|homesense|homes|homegoods|homedepot|holiday|holdings|hockey|hkt|hiv|hitachi|hisamitsu|' +
+ 'hiphop|hgtv|hermes|here|helsinki|help|healthcare|health|hdfcbank|hdfc|hbo|haus|hangout|hamburg|' +
+ 'hair|guru|guitars|guide|guge|gucci|guardian|group|grocery|gripe|green|gratis|graphics|grainger|' +
+ 'gov|got|gop|google|goog|goodyear|goodhands|goo|golf|goldpoint|gold|godaddy|gmx|gmo|gmbh|gmail|' +
+ 'globo|global|gle|glass|glade|giving|gives|gifts|gift|ggee|george|genting|gent|gea|gdn|gbiz|' +
+ 'garden|gap|games|game|gallup|gallo|gallery|gal|fyi|futbol|furniture|fund|fun|fujixerox|fujitsu|' +
+ 'ftr|frontier|frontdoor|frogans|frl|fresenius|free|fox|foundation|forum|forsale|forex|ford|' +
+ 'football|foodnetwork|food|foo|fly|flsmidth|flowers|florist|flir|flights|flickr|fitness|fit|' +
+ 'fishing|fish|firmdale|firestone|fire|financial|finance|final|film|fido|fidelity|fiat|ferrero|' +
+ 'ferrari|feedback|fedex|fast|fashion|farmers|farm|fans|fan|family|faith|fairwinds|fail|fage|' +
+ 'extraspace|express|exposed|expert|exchange|everbank|events|eus|eurovision|etisalat|esurance|' +
+ 'estate|esq|erni|ericsson|equipment|epson|epost|enterprises|engineering|engineer|energy|emerck|' +
+ 'email|education|edu|edeka|eco|eat|earth|dvr|dvag|durban|dupont|duns|dunlop|duck|dubai|dtv|drive|' +
+ 'download|dot|doosan|domains|doha|dog|dodge|doctor|docs|dnp|diy|dish|discover|discount|directory|' +
+ 'direct|digital|diet|diamonds|dhl|dev|design|desi|dentist|dental|democrat|delta|deloitte|dell|' +
+ 'delivery|degree|deals|dealer|deal|dds|dclk|day|datsun|dating|date|data|dance|dad|dabur|cyou|' +
+ 'cymru|cuisinella|csc|cruises|cruise|crs|crown|cricket|creditunion|creditcard|credit|courses|' +
+ 'coupons|coupon|country|corsica|coop|cool|cookingchannel|cooking|contractors|contact|consulting|' +
+ 'construction|condos|comsec|computer|compare|company|community|commbank|comcast|com|cologne|' +
+ 'college|coffee|codes|coach|clubmed|club|cloud|clothing|clinique|clinic|click|cleaning|claims|' +
+ 'cityeats|city|citic|citi|citadel|cisco|circle|cipriani|church|chrysler|chrome|christmas|chloe|' +
+ 'chintai|cheap|chat|chase|channel|chanel|cfd|cfa|cern|ceo|center|ceb|cbs|cbre|cbn|cba|catholic|' +
+ 'catering|cat|casino|cash|caseih|case|casa|cartier|cars|careers|career|care|cards|caravan|car|' +
+ 'capitalone|capital|capetown|canon|cancerresearch|camp|camera|cam|calvinklein|call|cal|cafe|cab|' +
+ 'bzh|buzz|buy|business|builders|build|bugatti|budapest|brussels|brother|broker|broadway|' +
+ 'bridgestone|bradesco|box|boutique|bot|boston|bostik|bosch|boots|booking|book|boo|bond|bom|bofa|' +
+ 'boehringer|boats|bnpparibas|bnl|bmw|bms|blue|bloomberg|blog|blockbuster|blanco|blackfriday|' +
+ 'black|biz|bio|bingo|bing|bike|bid|bible|bharti|bet|bestbuy|best|berlin|bentley|beer|beauty|' +
+ 'beats|bcn|bcg|bbva|bbt|bbc|bayern|bauhaus|basketball|baseball|bargains|barefoot|barclays|' +
+ 'barclaycard|barcelona|bar|bank|band|bananarepublic|banamex|baidu|baby|azure|axa|aws|avianca|' +
+ 'autos|auto|author|auspost|audio|audible|audi|auction|attorney|athleta|associates|asia|asda|arte|' +
+ 'art|arpa|army|archi|aramco|arab|aquarelle|apple|app|apartments|aol|anz|anquan|android|analytics|' +
+ 'amsterdam|amica|amfam|amex|americanfamily|americanexpress|alstom|alsace|ally|allstate|allfinanz|' +
+ 'alipay|alibaba|alfaromeo|akdn|airtel|airforce|airbus|aigo|aig|agency|agakhan|africa|afl|' +
+ 'afamilycompany|aetna|aero|aeg|adult|ads|adac|actor|active|aco|accountants|accountant|accenture|' +
+ 'academy|abudhabi|abogado|able|abc|abbvie|abbott|abb|abarth|aarp|aaa|onion' +
+ ')(?=[^0-9a-zA-Z@]|$))'));
+ regexen.validCCTLD = regexSupplant(RegExp(
+ '(?:(?:' +
+ '한국|香港|澳門|新加坡|台灣|台湾|中國|中国|გე|ไทย|ලංකා|ഭാരതം|ಭಾರತ|భారత్|சிங்கப்பூர்|இலங்கை|இந்தியா|ଭାରତ|ભારત|ਭਾਰਤ|' +
+ 'ভাৰত|ভারত|বাংলা|भारोत|भारतम्|भारत|ڀارت|پاکستان|مليسيا|مصر|قطر|فلسطين|عمان|عراق|سورية|سودان|تونس|' +
+ 'بھارت|بارت|ایران|امارات|المغرب|السعودية|الجزائر|الاردن|հայ|қаз|укр|срб|рф|мон|мкд|ею|бел|бг|ελ|' +
+ 'zw|zm|za|yt|ye|ws|wf|vu|vn|vi|vg|ve|vc|va|uz|uy|us|um|uk|ug|ua|tz|tw|tv|tt|tr|tp|to|tn|tm|tl|tk|' +
+ 'tj|th|tg|tf|td|tc|sz|sy|sx|sv|su|st|ss|sr|so|sn|sm|sl|sk|sj|si|sh|sg|se|sd|sc|sb|sa|rw|ru|rs|ro|' +
+ 're|qa|py|pw|pt|ps|pr|pn|pm|pl|pk|ph|pg|pf|pe|pa|om|nz|nu|nr|np|no|nl|ni|ng|nf|ne|nc|na|mz|my|mx|' +
+ 'mw|mv|mu|mt|ms|mr|mq|mp|mo|mn|mm|ml|mk|mh|mg|mf|me|md|mc|ma|ly|lv|lu|lt|ls|lr|lk|li|lc|lb|la|kz|' +
+ 'ky|kw|kr|kp|kn|km|ki|kh|kg|ke|jp|jo|jm|je|it|is|ir|iq|io|in|im|il|ie|id|hu|ht|hr|hn|hm|hk|gy|gw|' +
+ 'gu|gt|gs|gr|gq|gp|gn|gm|gl|gi|gh|gg|gf|ge|gd|gb|ga|fr|fo|fm|fk|fj|fi|eu|et|es|er|eh|eg|ee|ec|dz|' +
+ 'do|dm|dk|dj|de|cz|cy|cx|cw|cv|cu|cr|co|cn|cm|cl|ck|ci|ch|cg|cf|cd|cc|ca|bz|by|bw|bv|bt|bs|br|bq|' +
+ 'bo|bn|bm|bl|bj|bi|bh|bg|bf|be|bd|bb|ba|az|ax|aw|au|at|as|ar|aq|ao|an|am|al|ai|ag|af|ae|ad|ac' +
+ ')(?=[^0-9a-zA-Z@]|$))'));
+ regexen.validPunycode = /(?:xn--[0-9a-z]+)/;
+ regexen.validSpecialCCTLD = /(?:(?:co|tv)(?=[^0-9a-zA-Z@]|$))/;
+ regexen.validDomain = regexSupplant(/(?:#{validSubdomain}*#{validDomainName}(?:#{validGTLD}|#{validCCTLD}|#{validPunycode}))/);
+ regexen.validPortNumber = /[0-9]+/;
+ regexen.pd = /\u002d\u058a\u05be\u1400\u1806\u2010-\u2015\u2e17\u2e1a\u2e3a\u2e40\u301c\u3030\u30a0\ufe31\ufe58\ufe63\uff0d/;
+ regexen.validGeneralUrlPathChars = regexSupplant(/[^#{spaces_group}\(\)\?]/i);
+ // Allow URL paths to contain up to two nested levels of balanced parens
+ // 1. Used in Wikipedia URLs like /Primer_(film)
+ // 2. Used in IIS sessions like /S(dfd346)/
+ // 3. Used in Rdio URLs like /track/We_Up_(Album_Version_(Edited))/
+ regexen.validUrlBalancedParens = regexSupplant(
+ '\\(' +
+ '(?:' +
+ '#{validGeneralUrlPathChars}+' +
+ '|' +
+ // allow one nested level of balanced parentheses
+ '(?:' +
+ '#{validGeneralUrlPathChars}*' +
+ '\\(' +
+ '#{validGeneralUrlPathChars}+' +
+ '\\)' +
+ '#{validGeneralUrlPathChars}*' +
+ ')' +
+ ')' +
+ '\\)'
+ , 'i');
+ // Valid end-of-path chracters (so /foo. does not gobble the period).
+ // 1. Allow = for empty URL parameters and other URL-join artifacts
+ regexen.validUrlPathEndingChars = regexSupplant(/[^#{spaces_group}\(\)\?!\*';:=\,\.\$%\[\]#{pd}~&\|@]|(?:#{validUrlBalancedParens})/i);
+ // Allow @ in a url, but only in the middle. Catch things like http://example.com/@user/
+ regexen.validUrlPath = regexSupplant('(?:' +
+ '(?:' +
+ '#{validGeneralUrlPathChars}*' +
+ '(?:#{validUrlBalancedParens}#{validGeneralUrlPathChars}*)*' +
+ '#{validUrlPathEndingChars}'+
+ ')|(?:@#{validGeneralUrlPathChars}+\/)'+
+ ')', 'i');
+ regexen.validUrlQueryChars = /[a-z0-9!?\*'@\(\);:&=\+\$\/%#\[\]\-_\.,~|]/i;
+ regexen.validUrlQueryEndingChars = /[a-z0-9_&=#\/]/i;
+ regexen.validUrl = regexSupplant(
+ '(' + // $1 URL
+ '(https?:\\/\\/)' + // $2 Protocol
+ '(#{validDomain})' + // $3 Domain(s)
+ '(?::(#{validPortNumber}))?' + // $4 Port number (optional)
+ '(\\/#{validUrlPath}*)?' + // $5 URL Path
+ '(\\?#{validUrlQueryChars}*#{validUrlQueryEndingChars})?' + // $6 Query String
+ ')'
+ , 'gi');
+ return regexen.validUrl;
+}());
diff --git a/app/javascript/mastodon/features/favourites/index.js b/app/javascript/mastodon/features/favourites/index.js
index dc8109d16e..4dbfefd876 100644
--- a/app/javascript/mastodon/features/favourites/index.js
+++ b/app/javascript/mastodon/features/favourites/index.js
@@ -11,7 +11,7 @@ import ColumnBackButton from '../../components/column_back_button';
import ImmutablePureComponent from 'react-immutable-pure-component';
const mapStateToProps = (state, props) => ({
- accountIds: state.getIn(['user_lists', 'favourited_by', Number(props.params.statusId)]),
+ accountIds: state.getIn(['user_lists', 'favourited_by', props.params.statusId]),
});
@connect(mapStateToProps)
@@ -24,12 +24,12 @@ export default class Favourites extends ImmutablePureComponent {
};
componentWillMount () {
- this.props.dispatch(fetchFavourites(Number(this.props.params.statusId)));
+ this.props.dispatch(fetchFavourites(this.props.params.statusId));
}
componentWillReceiveProps (nextProps) {
if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) {
- this.props.dispatch(fetchFavourites(Number(nextProps.params.statusId)));
+ this.props.dispatch(fetchFavourites(nextProps.params.statusId));
}
}
diff --git a/app/javascript/mastodon/features/followers/index.js b/app/javascript/mastodon/features/followers/index.js
index 2d85b9cc0b..89445559fe 100644
--- a/app/javascript/mastodon/features/followers/index.js
+++ b/app/javascript/mastodon/features/followers/index.js
@@ -17,8 +17,8 @@ import ColumnBackButton from '../../components/column_back_button';
import ImmutablePureComponent from 'react-immutable-pure-component';
const mapStateToProps = (state, props) => ({
- accountIds: state.getIn(['user_lists', 'followers', Number(props.params.accountId), 'items']),
- hasMore: !!state.getIn(['user_lists', 'followers', Number(props.params.accountId), 'next']),
+ accountIds: state.getIn(['user_lists', 'followers', props.params.accountId, 'items']),
+ hasMore: !!state.getIn(['user_lists', 'followers', props.params.accountId, 'next']),
});
@connect(mapStateToProps)
@@ -32,14 +32,14 @@ export default class Followers extends ImmutablePureComponent {
};
componentWillMount () {
- this.props.dispatch(fetchAccount(Number(this.props.params.accountId)));
- this.props.dispatch(fetchFollowers(Number(this.props.params.accountId)));
+ this.props.dispatch(fetchAccount(this.props.params.accountId));
+ this.props.dispatch(fetchFollowers(this.props.params.accountId));
}
componentWillReceiveProps (nextProps) {
if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {
- this.props.dispatch(fetchAccount(Number(nextProps.params.accountId)));
- this.props.dispatch(fetchFollowers(Number(nextProps.params.accountId)));
+ this.props.dispatch(fetchAccount(nextProps.params.accountId));
+ this.props.dispatch(fetchFollowers(nextProps.params.accountId));
}
}
@@ -47,13 +47,13 @@ export default class Followers extends ImmutablePureComponent {
const { scrollTop, scrollHeight, clientHeight } = e.target;
if (scrollTop === scrollHeight - clientHeight && this.props.hasMore) {
- this.props.dispatch(expandFollowers(Number(this.props.params.accountId)));
+ this.props.dispatch(expandFollowers(this.props.params.accountId));
}
}
handleLoadMore = (e) => {
e.preventDefault();
- this.props.dispatch(expandFollowers(Number(this.props.params.accountId)));
+ this.props.dispatch(expandFollowers(this.props.params.accountId));
}
render () {
diff --git a/app/javascript/mastodon/features/following/index.js b/app/javascript/mastodon/features/following/index.js
index e4e2a4811e..c348302768 100644
--- a/app/javascript/mastodon/features/following/index.js
+++ b/app/javascript/mastodon/features/following/index.js
@@ -17,8 +17,8 @@ import ColumnBackButton from '../../components/column_back_button';
import ImmutablePureComponent from 'react-immutable-pure-component';
const mapStateToProps = (state, props) => ({
- accountIds: state.getIn(['user_lists', 'following', Number(props.params.accountId), 'items']),
- hasMore: !!state.getIn(['user_lists', 'following', Number(props.params.accountId), 'next']),
+ accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']),
+ hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),
});
@connect(mapStateToProps)
@@ -32,14 +32,14 @@ export default class Following extends ImmutablePureComponent {
};
componentWillMount () {
- this.props.dispatch(fetchAccount(Number(this.props.params.accountId)));
- this.props.dispatch(fetchFollowing(Number(this.props.params.accountId)));
+ this.props.dispatch(fetchAccount(this.props.params.accountId));
+ this.props.dispatch(fetchFollowing(this.props.params.accountId));
}
componentWillReceiveProps (nextProps) {
if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {
- this.props.dispatch(fetchAccount(Number(nextProps.params.accountId)));
- this.props.dispatch(fetchFollowing(Number(nextProps.params.accountId)));
+ this.props.dispatch(fetchAccount(nextProps.params.accountId));
+ this.props.dispatch(fetchFollowing(nextProps.params.accountId));
}
}
@@ -47,13 +47,13 @@ export default class Following extends ImmutablePureComponent {
const { scrollTop, scrollHeight, clientHeight } = e.target;
if (scrollTop === scrollHeight - clientHeight && this.props.hasMore) {
- this.props.dispatch(expandFollowing(Number(this.props.params.accountId)));
+ this.props.dispatch(expandFollowing(this.props.params.accountId));
}
}
handleLoadMore = (e) => {
e.preventDefault();
- this.props.dispatch(expandFollowing(Number(this.props.params.accountId)));
+ this.props.dispatch(expandFollowing(this.props.params.accountId));
}
render () {
diff --git a/app/javascript/mastodon/features/reblogs/index.js b/app/javascript/mastodon/features/reblogs/index.js
index dc940ae01a..f1904786a6 100644
--- a/app/javascript/mastodon/features/reblogs/index.js
+++ b/app/javascript/mastodon/features/reblogs/index.js
@@ -11,7 +11,7 @@ import ColumnBackButton from '../../components/column_back_button';
import ImmutablePureComponent from 'react-immutable-pure-component';
const mapStateToProps = (state, props) => ({
- accountIds: state.getIn(['user_lists', 'reblogged_by', Number(props.params.statusId)]),
+ accountIds: state.getIn(['user_lists', 'reblogged_by', props.params.statusId]),
});
@connect(mapStateToProps)
@@ -24,12 +24,12 @@ export default class Reblogs extends ImmutablePureComponent {
};
componentWillMount () {
- this.props.dispatch(fetchReblogs(Number(this.props.params.statusId)));
+ this.props.dispatch(fetchReblogs(this.props.params.statusId));
}
componentWillReceiveProps(nextProps) {
if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) {
- this.props.dispatch(fetchReblogs(Number(nextProps.params.statusId)));
+ this.props.dispatch(fetchReblogs(nextProps.params.statusId));
}
}
diff --git a/app/javascript/mastodon/features/standalone/compose/index.js b/app/javascript/mastodon/features/standalone/compose/index.js
index 96d07fefb8..0d764575fd 100644
--- a/app/javascript/mastodon/features/standalone/compose/index.js
+++ b/app/javascript/mastodon/features/standalone/compose/index.js
@@ -2,6 +2,7 @@ import React from 'react';
import ComposeFormContainer from '../../compose/containers/compose_form_container';
import NotificationsContainer from '../../ui/containers/notifications_container';
import LoadingBarContainer from '../../ui/containers/loading_bar_container';
+import ModalContainer from '../../ui/containers/modal_container';
export default class Compose extends React.PureComponent {
@@ -10,6 +11,7 @@ export default class Compose extends React.PureComponent {
+
);
diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js
index 4be013be73..3e94f7446d 100644
--- a/app/javascript/mastodon/features/status/components/action_bar.js
+++ b/app/javascript/mastodon/features/status/components/action_bar.js
@@ -36,7 +36,7 @@ export default class ActionBar extends React.PureComponent {
onReport: PropTypes.func,
onPin: PropTypes.func,
onEmbed: PropTypes.func,
- me: PropTypes.number.isRequired,
+ me: PropTypes.string.isRequired,
intl: PropTypes.object.isRequired,
};
diff --git a/app/javascript/mastodon/features/status/components/card.js b/app/javascript/mastodon/features/status/components/card.js
index 6b13e15ccd..41c4300d32 100644
--- a/app/javascript/mastodon/features/status/components/card.js
+++ b/app/javascript/mastodon/features/status/components/card.js
@@ -1,4 +1,5 @@
import React from 'react';
+import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import punycode from 'punycode';
import classnames from 'classnames';
@@ -22,10 +23,15 @@ export default class Card extends React.PureComponent {
static propTypes = {
card: ImmutablePropTypes.map,
+ maxDescription: PropTypes.number,
+ };
+
+ static defaultProps = {
+ maxDescription: 50,
};
renderLink () {
- const { card } = this.props;
+ const { card, maxDescription } = this.props;
let image = '';
let provider = card.get('provider_name');
@@ -52,7 +58,7 @@ export default class Card extends React.PureComponent {
{card.get('title')}
-
{(card.get('description') || '').substring(0, 50)}
+
{(card.get('description') || '').substring(0, maxDescription)}
{provider}
diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js
index b4979c6038..8cd5abd3f5 100644
--- a/app/javascript/mastodon/features/status/components/detailed_status.js
+++ b/app/javascript/mastodon/features/status/components/detailed_status.js
@@ -11,6 +11,7 @@ import Link from 'react-router-dom/Link';
import { FormattedDate, FormattedNumber } from 'react-intl';
import CardContainer from '../containers/card_container';
import ImmutablePureComponent from 'react-immutable-pure-component';
+import Video from '../../video';
import VisibilityIcon from '../../../../glitch/components/status/visibility_icon';
export default class DetailedStatus extends ImmutablePureComponent {
@@ -36,6 +37,10 @@ export default class DetailedStatus extends ImmutablePureComponent {
e.stopPropagation();
}
+ handleOpenVideo = startTime => {
+ this.props.onOpenVideo(this.props.status.getIn(['media_attachments', 0]), startTime);
+ }
+
render () {
const status = this.props.status.get('reblog') ? this.props.status.get('reblog') : this.props.status;
const { settings } = this.props;
diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js
index 03010cf0a3..fc45d5f211 100644
--- a/app/javascript/mastodon/features/status/index.js
+++ b/app/javascript/mastodon/features/status/index.js
@@ -38,10 +38,10 @@ const makeMapStateToProps = () => {
const getStatus = makeGetStatus();
const mapStateToProps = (state, props) => ({
- status: getStatus(state, Number(props.params.statusId)),
+ status: getStatus(state, props.params.statusId),
settings: state.get('local_settings'),
- ancestorsIds: state.getIn(['contexts', 'ancestors', Number(props.params.statusId)]),
- descendantsIds: state.getIn(['contexts', 'descendants', Number(props.params.statusId)]),
+ ancestorsIds: state.getIn(['contexts', 'ancestors', props.params.statusId]),
+ descendantsIds: state.getIn(['contexts', 'descendants', props.params.statusId]),
me: state.getIn(['meta', 'me']),
boostModal: state.getIn(['meta', 'boost_modal']),
deleteModal: state.getIn(['meta', 'delete_modal']),
@@ -66,7 +66,7 @@ export default class Status extends ImmutablePureComponent {
settings: ImmutablePropTypes.map.isRequired,
ancestorsIds: ImmutablePropTypes.list,
descendantsIds: ImmutablePropTypes.list,
- me: PropTypes.number,
+ me: PropTypes.string,
boostModal: PropTypes.bool,
deleteModal: PropTypes.bool,
autoPlayGif: PropTypes.bool,
@@ -74,12 +74,12 @@ export default class Status extends ImmutablePureComponent {
};
componentWillMount () {
- this.props.dispatch(fetchStatus(Number(this.props.params.statusId)));
+ this.props.dispatch(fetchStatus(this.props.params.statusId));
}
componentWillReceiveProps (nextProps) {
if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) {
- this.props.dispatch(fetchStatus(Number(nextProps.params.statusId)));
+ this.props.dispatch(fetchStatus(nextProps.params.statusId));
}
}
diff --git a/app/javascript/mastodon/features/ui/components/actions_modal.js b/app/javascript/mastodon/features/ui/components/actions_modal.js
index 3d40033be1..79a5a20ef6 100644
--- a/app/javascript/mastodon/features/ui/components/actions_modal.js
+++ b/app/javascript/mastodon/features/ui/components/actions_modal.js
@@ -1,32 +1,35 @@
import React from 'react';
import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import StatusContent from '../../../components/status_content';
import Avatar from '../../../components/avatar';
import RelativeTimestamp from '../../../components/relative_timestamp';
import DisplayName from '../../../components/display_name';
import IconButton from '../../../components/icon_button';
+import classNames from 'classnames';
export default class ActionsModal extends ImmutablePureComponent {
static propTypes = {
+ status: ImmutablePropTypes.map,
actions: PropTypes.array,
onClick: PropTypes.func,
};
renderAction = (action, i) => {
if (action === null) {
- return ;
+ return ;
}
const { icon = null, text, meta = null, active = false, href = '#' } = action;
return (
-
+
{icon && }
diff --git a/app/javascript/mastodon/features/ui/components/column_loading.js b/app/javascript/mastodon/features/ui/components/column_loading.js
index 1c4058926c..9503a7a1ac 100644
--- a/app/javascript/mastodon/features/ui/components/column_loading.js
+++ b/app/javascript/mastodon/features/ui/components/column_loading.js
@@ -3,17 +3,28 @@ import PropTypes from 'prop-types';
import Column from '../../../components/column';
import ColumnHeader from '../../../components/column_header';
+import ImmutablePureComponent from 'react-immutable-pure-component';
-const ColumnLoading = ({ title = '', icon = ' ' }) => (
-
-
-
-
-);
+export default class ColumnLoading extends ImmutablePureComponent {
-ColumnLoading.propTypes = {
- title: PropTypes.node,
- icon: PropTypes.string,
-};
+ static propTypes = {
+ title: PropTypes.oneOfType([PropTypes.node, PropTypes.string]),
+ icon: PropTypes.string,
+ };
-export default ColumnLoading;
+ static defaultProps = {
+ title: '',
+ icon: '',
+ };
+
+ render() {
+ let { title, icon } = this.props;
+ return (
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js
index 539af8ce33..5610095b99 100644
--- a/app/javascript/mastodon/features/ui/components/columns_area.js
+++ b/app/javascript/mastodon/features/ui/components/columns_area.js
@@ -78,7 +78,7 @@ export default class ColumnsArea extends ImmutablePureComponent {
handleChildrenContentChange() {
if (!this.props.singleColumn) {
- scrollRight(this.node, this.node.scrollWidth - window.innerWidth);
+ this._interruptScrollAnimation = scrollRight(this.node, this.node.scrollWidth - window.innerWidth);
}
}
diff --git a/app/javascript/mastodon/features/ui/components/onboarding_modal.js b/app/javascript/mastodon/features/ui/components/onboarding_modal.js
index 2facf9c441..daf6b485ce 100644
--- a/app/javascript/mastodon/features/ui/components/onboarding_modal.js
+++ b/app/javascript/mastodon/features/ui/components/onboarding_modal.js
@@ -10,7 +10,10 @@ import ComposeForm from '../../compose/components/compose_form';
import Search from '../../compose/components/search';
import NavigationBar from '../../compose/components/navigation_bar';
import ColumnHeader from './column_header';
-import { List as ImmutableList } from 'immutable';
+import {
+ List as ImmutableList,
+ Map as ImmutableMap,
+} from 'immutable';
const noop = () => { };
@@ -59,7 +62,9 @@ const PageTwo = ({ me }) => (
onClearSuggestions={noop}
onFetchSuggestions={noop}
onSuggestionSelected={noop}
+ onPrivacyChange={noop}
showSearch
+ settings={ImmutableMap.of('side_arm', 'none')}
/>
diff --git a/app/javascript/mastodon/features/ui/components/video_modal.js b/app/javascript/mastodon/features/ui/components/video_modal.js
index 9a9a49dfb9..867c73ed5b 100644
--- a/app/javascript/mastodon/features/ui/components/video_modal.js
+++ b/app/javascript/mastodon/features/ui/components/video_modal.js
@@ -1,35 +1,29 @@
import React from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
-import ExtendedVideoPlayer from '../../../components/extended_video_player';
-import { defineMessages, injectIntl } from 'react-intl';
-import IconButton from '../../../components/icon_button';
+import Video from '../../video';
import ImmutablePureComponent from 'react-immutable-pure-component';
-const messages = defineMessages({
- close: { id: 'lightbox.close', defaultMessage: 'Close' },
-});
-
-@injectIntl
export default class VideoModal extends ImmutablePureComponent {
static propTypes = {
media: ImmutablePropTypes.map.isRequired,
time: PropTypes.number,
onClose: PropTypes.func.isRequired,
- intl: PropTypes.object.isRequired,
};
render () {
- const { media, intl, time, onClose } = this.props;
-
- const url = media.get('url');
+ const { media, time, onClose } = this.props;
return (
);
diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js
index 7d12210bb5..73bd23432d 100644
--- a/app/javascript/mastodon/features/ui/index.js
+++ b/app/javascript/mastodon/features/ui/index.js
@@ -11,7 +11,7 @@ import { debounce } from 'lodash';
import { uploadCompose } from '../../actions/compose';
import { refreshHomeTimeline } from '../../actions/timelines';
import { refreshNotifications } from '../../actions/notifications';
-import { clearStatusesHeight } from '../../actions/statuses';
+import { clearHeight } from '../../actions/height_cache';
import { WrappedSwitch, WrappedRoute } from './util/react_router_helpers';
import UploadArea from './components/upload_area';
import ColumnsAreaContainer from './containers/columns_area_container';
@@ -57,7 +57,7 @@ export default class UI extends React.PureComponent {
static contextTypes = {
router: PropTypes.object.isRequired,
- }
+ };
static propTypes = {
dispatch: PropTypes.func.isRequired,
@@ -77,7 +77,7 @@ export default class UI extends React.PureComponent {
handleResize = debounce(() => {
// The cached heights are no longer accurate, invalidate
- this.props.dispatch(clearStatusesHeight());
+ this.props.dispatch(clearHeight());
this.setState({ width: window.innerWidth });
}, 500, {
@@ -193,14 +193,18 @@ export default class UI extends React.PureComponent {
document.removeEventListener('dragend', this.handleDragEnd);
}
- setRef = (c) => {
+ setRef = c => {
this.node = c;
}
- setColumnsAreaRef = (c) => {
+ setColumnsAreaRef = c => {
this.columnsAreaNode = c.getWrappedInstance().getWrappedInstance();
}
+ setOverlayRef = c => {
+ this.overlay = c;
+ }
+
render () {
const { width, draggingOver } = this.state;
const { children, layout, isWide, navbarUnder } = this.props;
diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js
index 2f5c52e9eb..5d640810f4 100644
--- a/app/javascript/mastodon/features/ui/util/async-components.js
+++ b/app/javascript/mastodon/features/ui/util/async-components.js
@@ -1,7 +1,3 @@
-export function EmojiPicker () {
- return import(/* webpackChunkName: "emojione_picker" */'emojione-picker');
-}
-
export function Compose () {
return import(/* webpackChunkName: "features/compose" */'../../compose');
}
@@ -109,6 +105,10 @@ export function VideoPlayer () {
return import(/* webpackChunkName: "status/video_player" */'../../../components/video_player');
}
+export function Video () {
+ return import(/* webpackChunkName: "features/video" */'../../video');
+}
+
export function EmbedModal () {
return import(/* webpackChunkName: "modals/embed_modal" */'../components/embed_modal');
}
diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js
new file mode 100644
index 0000000000..f228e434b3
--- /dev/null
+++ b/app/javascript/mastodon/features/video/index.js
@@ -0,0 +1,304 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import { throttle } from 'lodash';
+import classNames from 'classnames';
+
+const messages = defineMessages({
+ play: { id: 'video.play', defaultMessage: 'Play' },
+ pause: { id: 'video.pause', defaultMessage: 'Pause' },
+ mute: { id: 'video.mute', defaultMessage: 'Mute sound' },
+ unmute: { id: 'video.unmute', defaultMessage: 'Unmute sound' },
+ hide: { id: 'video.hide', defaultMessage: 'Hide video' },
+ expand: { id: 'video.expand', defaultMessage: 'Expand video' },
+ close: { id: 'video.close', defaultMessage: 'Close video' },
+ fullscreen: { id: 'video.fullscreen', defaultMessage: 'Full screen' },
+ exit_fullscreen: { id: 'video.exit_fullscreen', defaultMessage: 'Exit full screen' },
+});
+
+const findElementPosition = el => {
+ let box;
+
+ if (el.getBoundingClientRect && el.parentNode) {
+ box = el.getBoundingClientRect();
+ }
+
+ if (!box) {
+ return {
+ left: 0,
+ top: 0,
+ };
+ }
+
+ const docEl = document.documentElement;
+ const body = document.body;
+
+ const clientLeft = docEl.clientLeft || body.clientLeft || 0;
+ const scrollLeft = window.pageXOffset || body.scrollLeft;
+ const left = (box.left + scrollLeft) - clientLeft;
+
+ const clientTop = docEl.clientTop || body.clientTop || 0;
+ const scrollTop = window.pageYOffset || body.scrollTop;
+ const top = (box.top + scrollTop) - clientTop;
+
+ return {
+ left: Math.round(left),
+ top: Math.round(top),
+ };
+};
+
+const getPointerPosition = (el, event) => {
+ const position = {};
+ const box = findElementPosition(el);
+ const boxW = el.offsetWidth;
+ const boxH = el.offsetHeight;
+ const boxY = box.top;
+ const boxX = box.left;
+
+ let pageY = event.pageY;
+ let pageX = event.pageX;
+
+ if (event.changedTouches) {
+ pageX = event.changedTouches[0].pageX;
+ pageY = event.changedTouches[0].pageY;
+ }
+
+ position.y = Math.max(0, Math.min(1, ((boxY - pageY) + boxH) / boxH));
+ position.x = Math.max(0, Math.min(1, (pageX - boxX) / boxW));
+
+ return position;
+};
+
+const isFullscreen = () => document.fullscreenElement ||
+ document.webkitFullscreenElement ||
+ document.mozFullScreenElement ||
+ document.msFullscreenElement;
+
+const exitFullscreen = () => {
+ if (document.exitFullscreen) {
+ document.exitFullscreen();
+ } else if (document.webkitExitFullscreen) {
+ document.webkitExitFullscreen();
+ } else if (document.mozCancelFullScreen) {
+ document.mozCancelFullScreen();
+ } else if (document.msExitFullscreen) {
+ document.msExitFullscreen();
+ }
+};
+
+const requestFullscreen = el => {
+ if (el.requestFullscreen) {
+ el.requestFullscreen();
+ } else if (el.webkitRequestFullscreen) {
+ el.webkitRequestFullscreen();
+ } else if (el.mozRequestFullScreen) {
+ el.mozRequestFullScreen();
+ } else if (el.msRequestFullscreen) {
+ el.msRequestFullscreen();
+ }
+};
+
+@injectIntl
+export default class Video extends React.PureComponent {
+
+ static propTypes = {
+ preview: PropTypes.string,
+ src: PropTypes.string.isRequired,
+ width: PropTypes.number,
+ height: PropTypes.number,
+ sensitive: PropTypes.bool,
+ startTime: PropTypes.number,
+ onOpenVideo: PropTypes.func,
+ onCloseVideo: PropTypes.func,
+ intl: PropTypes.object.isRequired,
+ };
+
+ state = {
+ progress: 0,
+ paused: true,
+ dragging: false,
+ fullscreen: false,
+ hovered: false,
+ muted: false,
+ revealed: !this.props.sensitive,
+ };
+
+ setPlayerRef = c => {
+ this.player = c;
+ }
+
+ setVideoRef = c => {
+ this.video = c;
+ }
+
+ setSeekRef = c => {
+ this.seek = c;
+ }
+
+ handlePlay = () => {
+ this.setState({ paused: false });
+ }
+
+ handlePause = () => {
+ this.setState({ paused: true });
+ }
+
+ handleTimeUpdate = () => {
+ this.setState({ progress: 100 * (this.video.currentTime / this.video.duration) });
+ }
+
+ handleMouseDown = e => {
+ document.addEventListener('mousemove', this.handleMouseMove, true);
+ document.addEventListener('mouseup', this.handleMouseUp, true);
+ document.addEventListener('touchmove', this.handleMouseMove, true);
+ document.addEventListener('touchend', this.handleMouseUp, true);
+
+ this.setState({ dragging: true });
+ this.video.pause();
+ this.handleMouseMove(e);
+ }
+
+ handleMouseUp = () => {
+ document.removeEventListener('mousemove', this.handleMouseMove, true);
+ document.removeEventListener('mouseup', this.handleMouseUp, true);
+ document.removeEventListener('touchmove', this.handleMouseMove, true);
+ document.removeEventListener('touchend', this.handleMouseUp, true);
+
+ this.setState({ dragging: false });
+ this.video.play();
+ }
+
+ handleMouseMove = throttle(e => {
+ const { x } = getPointerPosition(this.seek, e);
+ this.video.currentTime = this.video.duration * x;
+ this.setState({ progress: x * 100 });
+ }, 60);
+
+ togglePlay = () => {
+ if (this.state.paused) {
+ this.video.play();
+ } else {
+ this.video.pause();
+ }
+ }
+
+ toggleFullscreen = () => {
+ if (isFullscreen()) {
+ exitFullscreen();
+ } else {
+ requestFullscreen(this.player);
+ }
+ }
+
+ componentDidMount () {
+ document.addEventListener('fullscreenchange', this.handleFullscreenChange, true);
+ document.addEventListener('webkitfullscreenchange', this.handleFullscreenChange, true);
+ document.addEventListener('mozfullscreenchange', this.handleFullscreenChange, true);
+ document.addEventListener('MSFullscreenChange', this.handleFullscreenChange, true);
+ }
+
+ componentWillUnmount () {
+ document.removeEventListener('fullscreenchange', this.handleFullscreenChange, true);
+ document.removeEventListener('webkitfullscreenchange', this.handleFullscreenChange, true);
+ document.removeEventListener('mozfullscreenchange', this.handleFullscreenChange, true);
+ document.removeEventListener('MSFullscreenChange', this.handleFullscreenChange, true);
+ }
+
+ handleFullscreenChange = () => {
+ this.setState({ fullscreen: isFullscreen() });
+ }
+
+ handleMouseEnter = () => {
+ this.setState({ hovered: true });
+ }
+
+ handleMouseLeave = () => {
+ this.setState({ hovered: false });
+ }
+
+ toggleMute = () => {
+ this.video.muted = !this.video.muted;
+ this.setState({ muted: this.video.muted });
+ }
+
+ toggleReveal = () => {
+ if (this.state.revealed) {
+ this.video.pause();
+ }
+
+ this.setState({ revealed: !this.state.revealed });
+ }
+
+ handleLoadedData = () => {
+ if (this.props.startTime) {
+ this.video.currentTime = this.props.startTime;
+ this.video.play();
+ }
+ }
+
+ handleOpenVideo = () => {
+ this.video.pause();
+ this.props.onOpenVideo(this.video.currentTime);
+ }
+
+ handleCloseVideo = () => {
+ this.video.pause();
+ this.props.onCloseVideo();
+ }
+
+ render () {
+ const { preview, src, width, height, startTime, onOpenVideo, onCloseVideo, intl } = this.props;
+ const { progress, dragging, paused, fullscreen, hovered, muted, revealed } = this.state;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {!onCloseVideo && }
+
+
+
+ {(!fullscreen && onOpenVideo) && }
+ {onCloseVideo && }
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/is_mobile.js b/app/javascript/mastodon/is_mobile.js
index 129d666821..80e8e0a8a8 100644
--- a/app/javascript/mastodon/is_mobile.js
+++ b/app/javascript/mastodon/is_mobile.js
@@ -1,4 +1,6 @@
-const LAYOUT_BREAKPOINT = 1024;
+import detectPassiveEvents from 'detect-passive-events';
+
+const LAYOUT_BREAKPOINT = 630;
export function isMobile(width, columns) {
switch (columns) {
@@ -12,11 +14,16 @@ export function isMobile(width, columns) {
};
const iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
-let userTouching = false;
-window.addEventListener('touchstart', () => {
+let userTouching = false;
+let listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;
+
+function touchListener() {
userTouching = true;
-}, { once: true });
+ window.removeEventListener('touchstart', touchListener, listenerOptions);
+}
+
+window.addEventListener('touchstart', touchListener, listenerOptions);
export function isUserTouching() {
return userTouching;
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 2ceb6eb9ab..bd09f19705 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -33,6 +33,7 @@
"column.home": "الرئيسية",
"column.mutes": "الحسابات المكتومة",
"column.notifications": "الإشعارات",
+ "column.pins": "Pinned toot",
"column.public": "الخيط العام الموحد",
"column_back_button.label": "العودة",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "حسابك ليس {locked}. يمكن لأي شخص متابعتك و عرض المنشورات.",
"compose_form.lock_disclaimer.lock": "مقفل",
"compose_form.placeholder": "فيمَ تفكّر؟",
- "compose_form.privacy_disclaimer": "Your private status will be delivered to mentioned users on {domains}. Do you trust {domainsCount, plural, one {that server} other {those servers}}? Post privacy only works on Mastodon instances. If {domains} {domainsCount, plural, one {is not a Mastodon instance} other {are not Mastodon instances}}, there will be no indication that your post is private, and it may be boosted or otherwise made visible to unintended recipients.",
"compose_form.publish": "بوّق",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "ضع علامة على الوسيط باعتباره حسّاس",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "الأنشطة",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "الأعلام",
"emoji_button.food": "الطعام والشراب",
"emoji_button.label": "أدرج إيموجي",
"emoji_button.nature": "الطبيعة",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "أشياء",
"emoji_button.people": "الناس",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "ابحث...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "رموز",
"emoji_button.travel": "أماكن و أسفار",
"empty_column.community": "الخط الزمني المحلي فارغ. اكتب شيئا ما للعامة كبداية.",
@@ -109,6 +113,7 @@
"navigation_bar.info": "معلومات إضافية",
"navigation_bar.logout": "خروج",
"navigation_bar.mutes": "الحسابات المكتومة",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "التفضيلات",
"navigation_bar.public_timeline": "الخيط العام الموحد",
"notification.favourite": "{name} أعجب بمنشورك",
@@ -193,6 +198,15 @@
"upload_button.label": "إضافة وسائط",
"upload_form.undo": "إلغاء",
"upload_progress.label": "يرفع...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "وسّع الفيديو",
"video_player.toggle_sound": "تبديل الصوت",
"video_player.toggle_visible": "إظهار / إخفاء الفيديو",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 183ba26730..d391a57ba0 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -33,6 +33,7 @@
"column.home": "Начало",
"column.mutes": "Muted users",
"column.notifications": "Известия",
+ "column.pins": "Pinned toot",
"column.public": "Публичен канал",
"column_back_button.label": "Назад",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
"compose_form.placeholder": "Какво си мислиш?",
- "compose_form.privacy_disclaimer": "Поверителни публикации ще бъдат изпратени до споменатите потребители на {domains}. Доверяваш ли се на {domainsCount, plural, one {that server} other {those servers}}, че няма да издаде твоята публикация?",
"compose_form.publish": "Раздумай",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Отбележи съдържанието като деликатно",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
"emoji_button.label": "Insert emoji",
"emoji_button.nature": "Nature",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objects",
"emoji_button.people": "People",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Search...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbols",
"emoji_button.travel": "Travel & Places",
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Extended information",
"navigation_bar.logout": "Излизане",
"navigation_bar.mutes": "Muted users",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Предпочитания",
"navigation_bar.public_timeline": "Публичен канал",
"notification.favourite": "{name} хареса твоята публикация",
@@ -193,6 +198,15 @@
"upload_button.label": "Добави медия",
"upload_form.undo": "Отмяна",
"upload_progress.label": "Uploading...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Expand video",
"video_player.toggle_sound": "Звук",
"video_player.toggle_visible": "Toggle visibility",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 0e3d2bc184..286da3ac67 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -33,6 +33,7 @@
"column.home": "Inici",
"column.mutes": "Usuaris silenciats",
"column.notifications": "Notificacions",
+ "column.pins": "Pinned toot",
"column.public": "Línia de temps federada",
"column_back_button.label": "Enrere",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "El teu compte no està bloquejat {locked}. Tothom pot seguir-te i veure els teus missatges a seguidors.",
"compose_form.lock_disclaimer.lock": "bloquejat",
"compose_form.placeholder": "En què estàs pensant?",
- "compose_form.privacy_disclaimer": "El teu missatge serà lliurat als usuaris esmentats en els dominis {domains}. Confies en {domainsCount, plural, one {that server} other {those servers}}? Els missatges privats només funcionen en instàncies Mastodon. Si {domains} {domainsCount, plural, one {is not a Mastodon instance} other {are not Mastodon instances}}, res indicarà que el teu missatge no es públic i pot ser impulsat (boosted) o ser visible per destinataris no desitjats.",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Marcar multimèdia com a sensible",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activitat",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Menjar i Beure",
"emoji_button.label": "Inserir emoji",
"emoji_button.nature": "Natura",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objectes",
"emoji_button.people": "Gent",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Cercar...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Símbols",
"emoji_button.travel": "Viatges i Llocs",
"empty_column.community": "La línia de temps local és buida. Escriu alguna cosa públicament per fer rodar la pilota!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Informació addicional",
"navigation_bar.logout": "Tancar sessió",
"navigation_bar.mutes": "Usuaris silenciats",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Preferències",
"navigation_bar.public_timeline": "Línia de temps federada",
"notification.favourite": "{name} ha afavorit el teu estat",
@@ -193,6 +198,15 @@
"upload_button.label": "Afegir multimèdia",
"upload_form.undo": "Desfer",
"upload_progress.label": "Pujant...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Ampliar el vídeo",
"video_player.toggle_sound": "Alternar so",
"video_player.toggle_visible": "Alternar visibilitat",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 3133238cd8..461e7e3043 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -33,6 +33,7 @@
"column.home": "Startseite",
"column.mutes": "Stummgeschaltete Profile",
"column.notifications": "Mitteilungen",
+ "column.pins": "Pinned toot",
"column.public": "Gesamtes bekanntes Netz",
"column_back_button.label": "Zurück",
"column_header.hide_settings": "Einstellungen verbergen",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Dein Profil ist nicht {locked}. Jeder kann dir jederzeit folgen, um deine privaten Beiträge einzusehen.",
"compose_form.lock_disclaimer.lock": "gesperrt",
"compose_form.placeholder": "Worüber möchtest du schreiben?",
- "compose_form.privacy_disclaimer": "Dein privater Status wird an die genannten Profile auf den Domains {domains} zugestellt. Vertraust du {domainsCount, plural, one {diesem Server} other {diesen Servern}}? Private Beiträge funktionieren nur auf Mastodon-Instanzen. Wenn {domains} {domainsCount, plural, one {keine Mastodon-Instanz ist} other {keine Mastodon-Instanzen sind}}, wird es dort kein Anzeichen geben, dass dein Beitrag privat ist und er könnte geteilt oder anderweitig für unerwünschte Empfänger sichtbar gemacht werden.",
"compose_form.publish": "Tröt",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Medien als heikel markieren",
@@ -66,13 +66,17 @@
"embed.instructions": "Du kannst diesen Beitrag auf deiner Webseite einbetten, in dem du den folgenden Code einfügst.",
"embed.preview": "So wird es aussehen:",
"emoji_button.activity": "Aktivitäten",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Flaggen",
"emoji_button.food": "Essen und Trinken",
"emoji_button.label": "Emoji einfügen",
"emoji_button.nature": "Natur",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Dinge",
"emoji_button.people": "Leute",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Suche…",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbole",
"emoji_button.travel": "Reise und Orte",
"empty_column.community": "Die lokale Zeitleiste ist leer. Schreibe etwas öffentlich, um den Ball ins Rollen zu bringen!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Erweiterte Informationen",
"navigation_bar.logout": "Abmelden",
"navigation_bar.mutes": "Stummgeschaltete Profile",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Einstellungen",
"navigation_bar.public_timeline": "Föderierte Zeitleiste",
"notification.favourite": "{name} favorisierte deinen Status",
@@ -193,6 +198,15 @@
"upload_button.label": "Mediendatei hinzufügen",
"upload_form.undo": "Entfernen",
"upload_progress.label": "Lade hoch…",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Videoanzeige vergrößern",
"video_player.toggle_sound": "Ton umschalten",
"video_player.toggle_visible": "Sichtbarkeit umschalten",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 89f74a56b3..5b711fd261 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -516,6 +516,22 @@
"defaultMessage": "Search...",
"id": "emoji_button.search"
},
+ {
+ "defaultMessage": "No emojos!! (╯°□°)╯︵ ┻━┻",
+ "id": "emoji_button.not_found"
+ },
+ {
+ "defaultMessage": "Custom",
+ "id": "emoji_button.custom"
+ },
+ {
+ "defaultMessage": "Frequently used",
+ "id": "emoji_button.recent"
+ },
+ {
+ "defaultMessage": "Search results",
+ "id": "emoji_button.search_results"
+ },
{
"defaultMessage": "People",
"id": "emoji_button.people"
@@ -682,10 +698,6 @@
{
"defaultMessage": "locked",
"id": "compose_form.lock_disclaimer.lock"
- },
- {
- "defaultMessage": "Your private status will be delivered to mentioned users on {domains}. Do you trust {domainsCount, plural, one {that server} other {those servers}}? Post privacy only works on Mastodon instances. If {domains} {domainsCount, plural, one {is not a Mastodon instance} other {are not Mastodon instances}}, there will be no indication that your post is private, and it may be boosted or otherwise made visible to unintended recipients.",
- "id": "compose_form.privacy_disclaimer"
}
],
"path": "app/javascript/mastodon/features/compose/containers/warning_container.json"
@@ -812,6 +824,10 @@
"defaultMessage": "Extended information",
"id": "navigation_bar.info"
},
+ {
+ "defaultMessage": "Pinned toots",
+ "id": "navigation_bar.pins"
+ },
{
"defaultMessage": "FAQ",
"id": "getting_started.faq"
@@ -992,6 +1008,15 @@
],
"path": "app/javascript/mastodon/features/notifications/index.json"
},
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "Pinned toot",
+ "id": "column.pins"
+ }
+ ],
+ "path": "app/javascript/mastodon/features/pinned_statuses/index.json"
+ },
{
"descriptors": [
{
@@ -1321,10 +1346,50 @@
{
"descriptors": [
{
- "defaultMessage": "Close",
- "id": "lightbox.close"
+ "defaultMessage": "Play",
+ "id": "video.play"
+ },
+ {
+ "defaultMessage": "Pause",
+ "id": "video.pause"
+ },
+ {
+ "defaultMessage": "Mute sound",
+ "id": "video.mute"
+ },
+ {
+ "defaultMessage": "Unmute sound",
+ "id": "video.unmute"
+ },
+ {
+ "defaultMessage": "Hide video",
+ "id": "video.hide"
+ },
+ {
+ "defaultMessage": "Expand video",
+ "id": "video.expand"
+ },
+ {
+ "defaultMessage": "Close video",
+ "id": "video.close"
+ },
+ {
+ "defaultMessage": "Full screen",
+ "id": "video.fullscreen"
+ },
+ {
+ "defaultMessage": "Exit full screen",
+ "id": "video.exit_fullscreen"
+ },
+ {
+ "defaultMessage": "Sensitive content",
+ "id": "status.sensitive_warning"
+ },
+ {
+ "defaultMessage": "Click to view",
+ "id": "status.sensitive_toggle"
}
],
- "path": "app/javascript/mastodon/features/ui/components/video_modal.json"
+ "path": "app/javascript/mastodon/features/video/index.json"
}
]
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index f42851f459..fc6aa4280f 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -33,8 +33,8 @@
"column.home": "Home",
"column.mutes": "Muted users",
"column.notifications": "Notifications",
- "column.public": "Federated timeline",
"column.pins": "Pinned toots",
+ "column.public": "Federated timeline",
"column_back_button.label": "Back",
"column_header.hide_settings": "Hide settings",
"column_header.moveLeft_settings": "Move column to the left",
@@ -47,7 +47,6 @@
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
"compose_form.placeholder": "What is on your mind?",
- "compose_form.privacy_disclaimer": "Your post will be delivered to mentioned users on {domains}. Do you trust {domainsCount, plural, one {that server} other {those servers}}? Post privacy only works on Mastodon instances. If {domains} {domainsCount, plural, one {is not a Mastodon instance} other {are not Mastodon instances}}, there will be no indication that your post is not a public post, and it may be boosted or otherwise made visible to unintended recipients.",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Mark media as sensitive",
@@ -67,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
"emoji_button.label": "Insert emoji",
"emoji_button.nature": "Nature",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objects",
"emoji_button.people": "People",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Search...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbols",
"emoji_button.travel": "Travel & Places",
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
@@ -110,9 +113,9 @@
"navigation_bar.info": "About this instance",
"navigation_bar.logout": "Logout",
"navigation_bar.mutes": "Muted users",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
- "navigation_bar.pins": "Pinned toots",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} followed you",
"notification.mention": "{name} mentioned you",
@@ -195,6 +198,15 @@
"upload_button.label": "Add media",
"upload_form.undo": "Undo",
"upload_progress.label": "Uploading...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Expand video",
"video_player.toggle_sound": "Toggle sound",
"video_player.toggle_visible": "Toggle visibility",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index d828d0858e..21b92ed3a1 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -33,6 +33,7 @@
"column.home": "Hejmo",
"column.mutes": "Muted users",
"column.notifications": "Sciigoj",
+ "column.pins": "Pinned toot",
"column.public": "Fratara tempolinio",
"column_back_button.label": "Reveni",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
"compose_form.placeholder": "Pri kio vi pensas?",
- "compose_form.privacy_disclaimer": "Via privata mesaĝo estos sendita nur al menciitaj uzantoj en {domains}. Ĉu vi fidas {domainsCount, plural, one {tiun servilon} other {tiujn servilojn}}? Mesaĝa privateco funkcias nur en aperaĵoj de Mastodon. Se {domains} {domainsCount, plural, one {ne estas aperaĵo de Mastodon} other {ne estas aperaĵoj de Mastodon}}, estos neniu indiko ke via mesaĝo estas privata, kaj ĝi povus esti diskonigita aŭ videbligita al necelitaj ricevantoj.",
"compose_form.publish": "Hup",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Marki ke la enhavo estas tikla",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
"emoji_button.label": "Insert emoji",
"emoji_button.nature": "Nature",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objects",
"emoji_button.people": "People",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Search...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbols",
"emoji_button.travel": "Travel & Places",
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Extended information",
"navigation_bar.logout": "Elsaluti",
"navigation_bar.mutes": "Muted users",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Preferoj",
"navigation_bar.public_timeline": "Fratara tempolinio",
"notification.favourite": "{name} favoris vian mesaĝon",
@@ -193,6 +198,15 @@
"upload_button.label": "Aldoni enhavaĵon",
"upload_form.undo": "Malfari",
"upload_progress.label": "Uploading...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Expand video",
"video_player.toggle_sound": "Aktivigi sonojn",
"video_player.toggle_visible": "Toggle visibility",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index d35eb84e7d..59c7dc5a72 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -1,106 +1,110 @@
{
"account.block": "Bloquear",
- "account.block_domain": "Hide everything from {domain}",
- "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
+ "account.block_domain": "Ocultar todo de {domain}",
+ "account.disclaimer_full": "La siguiente información del usuario puede estar incompleta.",
"account.edit_profile": "Editar perfil",
"account.follow": "Seguir",
"account.followers": "Seguidores",
- "account.follows": "Seguir",
+ "account.follows": "Sigue",
"account.follows_you": "Te sigue",
"account.media": "Media",
- "account.mention": "Mencionar",
- "account.mute": "Silenciar",
+ "account.mention": "Mencionar a @{name}",
+ "account.mute": "Silenciar a @{name}",
"account.posts": "Publicaciones",
- "account.report": "Report @{name}",
+ "account.report": "Reportar a @{name}",
"account.requested": "Esperando aprobación",
- "account.share": "Share @{name}'s profile",
- "account.unblock": "Desbloquear",
- "account.unblock_domain": "Unhide {domain}",
+ "account.share": "Compartir el perfil de @{name}",
+ "account.unblock": "Desbloquear a @{name}",
+ "account.unblock_domain": "Mostrar a {domain}",
"account.unfollow": "Dejar de seguir",
- "account.unmute": "Unmute @{name}",
- "account.view_full_profile": "View full profile",
- "boost_modal.combo": "You can press {combo} to skip this next time",
- "bundle_column_error.body": "Something went wrong while loading this component.",
- "bundle_column_error.retry": "Try again",
- "bundle_column_error.title": "Network error",
- "bundle_modal_error.close": "Close",
- "bundle_modal_error.message": "Something went wrong while loading this component.",
- "bundle_modal_error.retry": "Try again",
+ "account.unmute": "Dejar de silenciar a @{name}",
+ "account.view_full_profile": "Ver perfil completo",
+ "boost_modal.combo": "Puedes presionar {combo} para saltear este aviso la próxima vez",
+ "bundle_column_error.body": "Algo salió mal al cargar este componente.",
+ "bundle_column_error.retry": "Inténtalo de nuevo",
+ "bundle_column_error.title": "Error de red",
+ "bundle_modal_error.close": "Cerrar",
+ "bundle_modal_error.message": "Algo salió mal al cargar este componente.",
+ "bundle_modal_error.retry": "Inténtalo de nuevo",
"column.blocks": "Usuarios bloqueados",
- "column.community": "Historia local",
+ "column.community": "Línea de tiempo local",
"column.favourites": "Favoritos",
- "column.follow_requests": "Solicitudes para seguirte",
+ "column.follow_requests": "Solicitudes de seguimiento",
"column.home": "Inicio",
"column.mutes": "Usuarios silenciados",
"column.notifications": "Notificaciones",
+ "column.pins": "Toot fijado",
"column.public": "Historia federada",
"column_back_button.label": "Atrás",
- "column_header.hide_settings": "Hide settings",
- "column_header.moveLeft_settings": "Move column to the left",
- "column_header.moveRight_settings": "Move column to the right",
- "column_header.pin": "Pin",
- "column_header.show_settings": "Show settings",
- "column_header.unpin": "Unpin",
- "column_subheading.navigation": "Navigation",
- "column_subheading.settings": "Settings",
- "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
- "compose_form.lock_disclaimer.lock": "locked",
+ "column_header.hide_settings": "Ocultar ajustes",
+ "column_header.moveLeft_settings": "Mover columna a la izquierda",
+ "column_header.moveRight_settings": "Mover columna a la derecha",
+ "column_header.pin": "Fijar",
+ "column_header.show_settings": "Mostrar ajustes",
+ "column_header.unpin": "Dejar de fijar",
+ "column_subheading.navigation": "Navegación",
+ "column_subheading.settings": "Ajustes",
+ "compose_form.lock_disclaimer": "Tu cuenta no está bloqueada. Todos pueden seguirte para ver tus toots solo para seguidores.",
+ "compose_form.lock_disclaimer.lock": "bloqueado",
"compose_form.placeholder": "¿En qué estás pensando?",
- "compose_form.privacy_disclaimer": "Your private status will be delivered to mentioned users on {domains}. Do you trust {domainsCount, plural, one {that server} other {those servers}}? Post privacy only works on Mastodon instances. If {domains} {domainsCount, plural, one {is not a Mastodon instance} other {are not Mastodon instances}}, there will be no indication that your post is private, and it may be boosted or otherwise made visible to unintended recipients.",
"compose_form.publish": "Tootear",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Marcar contenido como sensible",
- "compose_form.spoiler": "Ocultar texto tras advertencia",
+ "compose_form.spoiler": "Ocultar texto tras una advertencia",
"compose_form.spoiler_placeholder": "Advertencia de contenido",
- "confirmation_modal.cancel": "Cancel",
- "confirmations.block.confirm": "Block",
- "confirmations.block.message": "Are you sure you want to block {name}?",
- "confirmations.delete.confirm": "Delete",
- "confirmations.delete.message": "Are you sure you want to delete this status?",
- "confirmations.domain_block.confirm": "Hide entire domain",
- "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.",
- "confirmations.mute.confirm": "Mute",
- "confirmations.mute.message": "Are you sure you want to mute {name}?",
- "confirmations.unfollow.confirm": "Unfollow",
- "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
- "embed.instructions": "Embed this status on your website by copying the code below.",
- "embed.preview": "Here is what it will look like:",
- "emoji_button.activity": "Activity",
- "emoji_button.flags": "Flags",
- "emoji_button.food": "Food & Drink",
+ "confirmation_modal.cancel": "Cancelar",
+ "confirmations.block.confirm": "Bloquear",
+ "confirmations.block.message": "¿Estás seguro de que quieres bloquear a {name}?",
+ "confirmations.delete.confirm": "Eliminar",
+ "confirmations.delete.message": "¿Estás seguro de que quieres borrar este toot?",
+ "confirmations.domain_block.confirm": "Ocultar dominio entero",
+ "confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio entero? En algunos casos es preferible bloquear o silenciar objetivos determinados.",
+ "confirmations.mute.confirm": "Silenciar",
+ "confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?",
+ "confirmations.unfollow.confirm": "Dejar de seguir",
+ "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?",
+ "embed.instructions": "Añade este toot a tu sitio web con el siguiente código.",
+ "embed.preview": "Así es como se verá:",
+ "emoji_button.activity": "Actividad",
+ "emoji_button.custom": "Custom",
+ "emoji_button.flags": "Marcas",
+ "emoji_button.food": "Comida y bebida",
"emoji_button.label": "Insertar emoji",
- "emoji_button.nature": "Nature",
- "emoji_button.objects": "Objects",
- "emoji_button.people": "People",
- "emoji_button.search": "Search...",
- "emoji_button.symbols": "Symbols",
- "emoji_button.travel": "Travel & Places",
- "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
- "empty_column.hashtag": "There is nothing in this hashtag yet.",
- "empty_column.home": "You aren't following anyone yet. Visit {public} or use search to get started and meet other users.",
- "empty_column.home.inactivity": "Your home feed is empty. If you have been inactive for a while, it will be regenerated for you soon.",
- "empty_column.home.public_timeline": "the public timeline",
- "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
- "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up",
- "follow_request.authorize": "Authorize",
- "follow_request.reject": "Reject",
- "getting_started.appsshort": "Apps",
+ "emoji_button.nature": "Naturaleza",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+ "emoji_button.objects": "Objetos",
+ "emoji_button.people": "Gente",
+ "emoji_button.recent": "Frequently used",
+ "emoji_button.search": "Buscar…",
+ "emoji_button.search_results": "Search results",
+ "emoji_button.symbols": "Símbolos",
+ "emoji_button.travel": "Viajes y lugares",
+ "empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!",
+ "empty_column.hashtag": "No hay nada en este hashtag aún.",
+ "empty_column.home": "No estás siguiendo a nadie aún. Visita {public} o haz búsquedas para empezar y conocer gente nueva.",
+ "empty_column.home.inactivity": "Tus notificaciones están vacías. Si has estado inactivo por un tiempo, se regenerará para ti pronto.",
+ "empty_column.home.public_timeline": "la línea de tiempo pública",
+ "empty_column.notifications": "No tienes ninguna notificación aún. Interactúa con otros para empezar una conversación.",
+ "empty_column.public": "¡No hay nada aquí! Escribe algo públicamente, o sigue usuarios de otras instancias manualmente para llenarlo.",
+ "follow_request.authorize": "Autorizar",
+ "follow_request.reject": "Rechazar",
+ "getting_started.appsshort": "Aplicaciones",
"getting_started.faq": "FAQ",
"getting_started.heading": "Primeros pasos",
"getting_started.open_source_notice": "Mastodon es software libre. Puedes contribuir o reportar errores en {github}.",
- "getting_started.userguide": "User Guide",
- "home.column_settings.advanced": "Advanced",
- "home.column_settings.basic": "Basic",
- "home.column_settings.filter_regex": "Filter out by regular expressions",
- "home.column_settings.show_reblogs": "Show boosts",
- "home.column_settings.show_replies": "Show replies",
- "home.settings": "Column settings",
+ "getting_started.userguide": "Guía de usuario",
+ "home.column_settings.advanced": "Avanzado",
+ "home.column_settings.basic": "Básico",
+ "home.column_settings.filter_regex": "Filtrar con expresiones regulares",
+ "home.column_settings.show_reblogs": "Mostrar retoots",
+ "home.column_settings.show_replies": "Mostrar respuestas",
+ "home.settings": "Ajustes de columna",
"lightbox.close": "Cerrar",
- "lightbox.next": "Next",
- "lightbox.previous": "Previous",
- "loading_indicator.label": "Cargando...",
- "media_gallery.toggle_visible": "Toggle visibility",
- "missing_indicator.label": "Not found",
+ "lightbox.next": "Siguiente",
+ "lightbox.previous": "Anterior",
+ "loading_indicator.label": "Cargando…",
+ "media_gallery.toggle_visible": "Cambiar visibilidad",
+ "missing_indicator.label": "No encontrado",
"navigation_bar.blocks": "Usuarios bloqueados",
"navigation_bar.community_timeline": "Historia local",
"navigation_bar.edit_profile": "Editar perfil",
@@ -109,43 +113,44 @@
"navigation_bar.info": "Información adicional",
"navigation_bar.logout": "Cerrar sesión",
"navigation_bar.mutes": "Usuarios silenciados",
+ "navigation_bar.pins": "Toots fijados",
"navigation_bar.preferences": "Preferencias",
"navigation_bar.public_timeline": "Historia federada",
"notification.favourite": "{name} marcó tu estado como favorito",
"notification.follow": "{name} te empezó a seguir",
"notification.mention": "{name} te ha mencionado",
"notification.reblog": "{name} ha retooteado tu estado",
- "notifications.clear": "Clear notifications",
- "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.clear": "Limpiar notificaciones",
+ "notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?",
"notifications.column_settings.alert": "Notificaciones de escritorio",
"notifications.column_settings.favourite": "Favoritos:",
"notifications.column_settings.follow": "Nuevos seguidores:",
"notifications.column_settings.mention": "Menciones:",
- "notifications.column_settings.push": "Push notifications",
- "notifications.column_settings.push_meta": "This device",
+ "notifications.column_settings.push": "Notificaciones push:",
+ "notifications.column_settings.push_meta": "Este dispositivo:",
"notifications.column_settings.reblog": "Retoots:",
"notifications.column_settings.show": "Mostrar en columna",
- "notifications.column_settings.sound": "Play sound",
- "onboarding.done": "Done",
- "onboarding.next": "Next",
- "onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
- "onboarding.page_four.home": "The home timeline shows posts from people you follow.",
- "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
- "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
- "onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
- "onboarding.page_one.welcome": "Welcome to Mastodon!",
- "onboarding.page_six.admin": "Your instance's admin is {admin}.",
- "onboarding.page_six.almost_done": "Almost done...",
- "onboarding.page_six.appetoot": "Bon Appetoot!",
- "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
- "onboarding.page_six.github": "Mastodon is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
- "onboarding.page_six.guidelines": "community guidelines",
- "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
- "onboarding.page_six.various_app": "mobile apps",
- "onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
- "onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
- "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
- "onboarding.skip": "Skip",
+ "notifications.column_settings.sound": "Reproducir sonido",
+ "onboarding.done": "Listo",
+ "onboarding.next": "Siguiente",
+ "onboarding.page_five.public_timelines": "La línea de tiempo local muestra toots públicos de todos en {domain}. La línea de tiempo federada muestra toots públicos de cualquiera a quien la gente de {domain} siga. Estas son las líneas de tiempo públicas, una buena forma de conocer gente nueva.",
+ "onboarding.page_four.home": "La línea de tiempo principal muestra toots de gente que sigues.",
+ "onboarding.page_four.notifications": "Las notificaciones se muestran cuando alguien interactúa contigo.",
+ "onboarding.page_one.federation": "Mastodon es una red de servidores federados que conforman una red social aún más grande. Llamamos a estos servidores instancias.",
+ "onboarding.page_one.handle": "Estás en {domain}, así que tu nombre de usuario completo es {handle}",
+ "onboarding.page_one.welcome": "¡Bienvenido a Mastodon!",
+ "onboarding.page_six.admin": "El administrador de tu instancia es {admin}.",
+ "onboarding.page_six.almost_done": "Ya casi…",
+ "onboarding.page_six.appetoot": "¡Bon Appetoot!",
+ "onboarding.page_six.apps_available": "Hay {apps} disponibles para iOS, Android y otras plataformas.",
+ "onboarding.page_six.github": "Mastodon es software libre. Puedes reportar errores, pedir funciones nuevas, o contribuir al código en {github}.",
+ "onboarding.page_six.guidelines": "guías de la comunidad",
+ "onboarding.page_six.read_guidelines": "¡Por favor lee las {guidelines} de {domain}!",
+ "onboarding.page_six.various_app": "aplicaciones móviles",
+ "onboarding.page_three.profile": "Edita tu perfil para cambiar tu avatar, biografía y nombre de cabecera. Ahí, también encontrarás otros ajustes.",
+ "onboarding.page_three.search": "Usa la barra de búsqueda y revisa hashtags, como {illustration} y {introductions}. Para ver a alguien que no es de tu propia instancia, usa su nombre de usuario completo.",
+ "onboarding.page_two.compose": "Escribe toots en la columna de redacción. Puedes subir imágenes, cambiar ajustes de privacidad, y añadir advertencias de contenido con los siguientes íconos.",
+ "onboarding.skip": "Saltar",
"privacy.change": "Ajustar privacidad",
"privacy.direct.long": "Sólo mostrar a los usuarios mencionados",
"privacy.direct.short": "Directo",
@@ -156,45 +161,54 @@
"privacy.unlisted.long": "No mostrar en la historia federada",
"privacy.unlisted.short": "Sin federar",
"reply_indicator.cancel": "Cancelar",
- "report.placeholder": "Additional comments",
- "report.submit": "Submit",
- "report.target": "Reporting",
+ "report.placeholder": "Comentarios adicionales",
+ "report.submit": "Publicar",
+ "report.target": "Reportando",
"search.placeholder": "Buscar",
- "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
- "standalone.public_title": "A look inside...",
- "status.cannot_reblog": "This post cannot be boosted",
+ "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
+ "standalone.public_title": "Un pequeño vistazo...",
+ "status.cannot_reblog": "Este toot no puede retootearse",
"status.delete": "Borrar",
- "status.embed": "Embed",
+ "status.embed": "Incrustado",
"status.favourite": "Favorito",
- "status.load_more": "Load more",
- "status.media_hidden": "Media hidden",
+ "status.load_more": "Cargar más",
+ "status.media_hidden": "Contenido multimedia oculto",
"status.mention": "Mencionar",
- "status.mute_conversation": "Mute conversation",
+ "status.mute_conversation": "Silenciar conversación",
"status.open": "Expandir estado",
- "status.pin": "Pin on profile",
- "status.reblog": "Retoot",
+ "status.pin": "Fijar",
+ "status.reblog": "Retootear",
"status.reblogged_by": "Retooteado por {name}",
"status.reply": "Responder",
- "status.replyAll": "Reply to thread",
+ "status.replyAll": "Responder al hilo",
"status.report": "Reportar",
- "status.sensitive_toggle": "Click para ver",
+ "status.sensitive_toggle": "Haz clic para ver",
"status.sensitive_warning": "Contenido sensible",
- "status.share": "Share",
+ "status.share": "Compartir",
"status.show_less": "Mostrar menos",
"status.show_more": "Mostrar más",
- "status.unmute_conversation": "Unmute conversation",
- "status.unpin": "Unpin from profile",
+ "status.unmute_conversation": "Dejar de silenciar conversación",
+ "status.unpin": "Dejar de fijar",
"tabs_bar.compose": "Redactar",
- "tabs_bar.federated_timeline": "Federated",
+ "tabs_bar.federated_timeline": "Federado",
"tabs_bar.home": "Inicio",
"tabs_bar.local_timeline": "Local",
"tabs_bar.notifications": "Notificaciones",
- "upload_area.title": "Drag & drop to upload",
+ "upload_area.title": "Arrastra y suelta para subir",
"upload_button.label": "Subir multimedia",
"upload_form.undo": "Deshacer",
- "upload_progress.label": "Uploading...",
- "video_player.expand": "Expand video",
- "video_player.toggle_sound": "Act/Desac. sonido",
- "video_player.toggle_visible": "Toggle visibility",
- "video_player.video_error": "Video could not be played"
+ "upload_progress.label": "Subiendo…",
+ "video.close": "Cerrar video",
+ "video.exit_fullscreen": "Salir de pantalla completa",
+ "video.expand": "Expandir vídeo",
+ "video.fullscreen": "Pantalla completa",
+ "video.hide": "Ocultar vídeo",
+ "video.mute": "Silenciar sonido",
+ "video.pause": "Pausar",
+ "video.play": "Reproducir",
+ "video.unmute": "Dejar de silenciar sonido",
+ "video_player.expand": "Expandir vídeo",
+ "video_player.toggle_sound": "Activar/Desactivar sonido",
+ "video_player.toggle_visible": "Cambiar visibilidad",
+ "video_player.video_error": "No se pudo reproducir el vídeo"
}
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index d05b26eb9f..6e4771392e 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -33,6 +33,7 @@
"column.home": "خانه",
"column.mutes": "کاربران بیصداشده",
"column.notifications": "اعلانها",
+ "column.pins": "نوشتههای ثابت",
"column.public": "نوشتههای همهجا",
"column_back_button.label": "بازگشت",
"column_header.hide_settings": "نهفتن تنظیمات",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "حساب شما {locked} نیست. هر کسی میتواند پیگیر شما شود و نوشتههای ویژهٔ پیگیران شما را ببیند.",
"compose_form.lock_disclaimer.lock": "قفل",
"compose_form.placeholder": "تازه چه خبر؟",
- "compose_form.privacy_disclaimer": "نوشتهٔ خصوصی شما به کاربران نامبردهشده در {domains} فرستاده میشود. آیا به {domainsCount, plural, one {آن سرور} other {آن سرورها}} اعتماد دارید؟ تنظیمات حریم خصوصی نوشتهها تنها در سرورهای ماستدون کار میکند. اگر {domains} {domainsCount, plural, one {یک سرور ماستدون نباشد} other {سرورهای ماستدون نباشند}}، اشارهای به خصوصیبودن نوشتهٔ شما نخواهد شد و شاید نوشتهٔ شما همرسان شود یا برای کاربرانی که نمیخواهید نمایش یابد.",
"compose_form.publish": "بوق",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "تصاویر حساس هستند",
@@ -66,13 +66,17 @@
"embed.instructions": "برای جاگذاری این نوشته در سایت خودتان، کد زیر را کپی کنید.",
"embed.preview": "نوشتهٔ جاگذاریشده این گونه به نظر خواهد رسید:",
"emoji_button.activity": "فعالیت",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "پرچمها",
"emoji_button.food": "غذا و نوشیدنی",
"emoji_button.label": "افزودن شکلک",
"emoji_button.nature": "طبیعت",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "اشیا",
"emoji_button.people": "مردم",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "جستجو...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "نمادها",
"emoji_button.travel": "سفر و مکان",
"empty_column.community": "فهرست نوشتههای محلی خالی است. چیزی بنویسید تا چرخش بچرخد!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "اطلاعات تکمیلی",
"navigation_bar.logout": "خروج",
"navigation_bar.mutes": "کاربران بیصداشده",
+ "navigation_bar.pins": "نوشتههای ثابت",
"navigation_bar.preferences": "ترجیحات",
"navigation_bar.public_timeline": "نوشتههای همهجا",
"notification.favourite": "{name} نوشتهٔ شما را پسندید",
@@ -193,6 +198,15 @@
"upload_button.label": "افزودن تصویر",
"upload_form.undo": "واگردانی",
"upload_progress.label": "بارگذاری...",
+ "video.close": "بستن ویدیو",
+ "video.exit_fullscreen": "خروج از حالت تمام صفحه",
+ "video.expand": "بزرگکردن ویدیو",
+ "video.fullscreen": "تمام صفحه",
+ "video.hide": "نهفتن ویدیو",
+ "video.mute": "قطع صدا",
+ "video.pause": "توقف",
+ "video.play": "پخش",
+ "video.unmute": "پخش صدا",
"video_player.expand": "بازکردن ویدیو",
"video_player.toggle_sound": "تغییر صداداری",
"video_player.toggle_visible": "تغییر پیدایی",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 926a57ff1d..ccdf19dd65 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -33,6 +33,7 @@
"column.home": "Koti",
"column.mutes": "Muted users",
"column.notifications": "Ilmoitukset",
+ "column.pins": "Pinned toot",
"column.public": "Yleinen aikajana",
"column_back_button.label": "Takaisin",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
"compose_form.placeholder": "Mitä sinulla on mielessä?",
- "compose_form.privacy_disclaimer": "Sinun yksityinen status toimitetaan mainitsemallesi käyttäjille domaineissa {domains}. Luotatko {domainsCount, plural, one {tähän palvelimeen} other {näihin palvelimiin}}? Postauksen yksityisyys toimii van Mastodon palvelimilla. Jos {domains} {domainsCount, plural, one {ei ole Mastodon palvelin} other {eivät ole Mastodon palvelin}}, viestiin ei tule Yksityinen-merkintää, ja sitä voidaan boostata tai muuten tehdä näkyväksi muille vastaanottajille.",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Merkitse media herkäksi",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
"emoji_button.label": "Insert emoji",
"emoji_button.nature": "Nature",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objects",
"emoji_button.people": "People",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Search...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbols",
"emoji_button.travel": "Travel & Places",
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Extended information",
"navigation_bar.logout": "Kirjaudu ulos",
"navigation_bar.mutes": "Muted users",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Ominaisuudet",
"navigation_bar.public_timeline": "Yleinen aikajana",
"notification.favourite": "{name} tykkäsi statuksestasi",
@@ -193,6 +198,15 @@
"upload_button.label": "Lisää mediaa",
"upload_form.undo": "Peru",
"upload_progress.label": "Uploading...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Expand video",
"video_player.toggle_sound": "Äänet päälle/pois",
"video_player.toggle_visible": "Toggle visibility",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 8ca632accd..417c1062a1 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -33,8 +33,8 @@
"column.home": "Accueil",
"column.mutes": "Comptes masqués",
"column.notifications": "Notifications",
- "column.public": "Fil public global",
"column.pins": "Pouets épinglés",
+ "column.public": "Fil public global",
"column_back_button.label": "Retour",
"column_header.hide_settings": "Masquer les paramètres",
"column_header.moveLeft_settings": "Déplacer la colonne vers la gauche",
@@ -47,7 +47,6 @@
"compose_form.lock_disclaimer": "Votre compte n’est pas {locked}. Tout le monde peut vous suivre et voir vos pouets privés.",
"compose_form.lock_disclaimer.lock": "verrouillé",
"compose_form.placeholder": "Qu’avez-vous en tête ?",
- "compose_form.privacy_disclaimer": "Votre statut privé va être transmis aux personnes mentionnées sur {domains}. Avez-vous confiance en {domainsCount, plural, one {ce serveur} other {ces serveurs}} pour ne pas divulguer votre statut ? Les statuts privés ne fonctionnent que sur les instances de Mastodon. Si {domains} {domainsCount, plural, one {n’est pas une instance de Mastodon} other {ne sont pas des instances de Mastodon}}, il n’y aura aucune indication que votre statut est privé, et il pourrait être partagé ou rendu visible d’une autre manière à d’autres personnes imprévues.",
"compose_form.publish": "Pouet ",
"compose_form.publish_loud": "{publish} !",
"compose_form.sensitive": "Marquer le média comme sensible",
@@ -67,13 +66,17 @@
"embed.instructions": "Intégrez ce statut à votre site en copiant ce code ci-dessous.",
"embed.preview": "Il apparaîtra comme cela : ",
"emoji_button.activity": "Activités",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Drapeaux",
"emoji_button.food": "Boire et manger",
"emoji_button.label": "Insérer un emoji",
"emoji_button.nature": "Nature",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objets",
"emoji_button.people": "Personnages",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Recherche…",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symboles",
"emoji_button.travel": "Lieux et voyages",
"empty_column.community": "Le fil public local est vide. Écrivez-donc quelque chose pour le remplir !",
@@ -110,9 +113,9 @@
"navigation_bar.info": "Plus d’informations",
"navigation_bar.logout": "Déconnexion",
"navigation_bar.mutes": "Comptes masqués",
+ "navigation_bar.pins": "Pouets épinglés",
"navigation_bar.preferences": "Préférences",
"navigation_bar.public_timeline": "Fil public global",
- "navigation_bar.pins": "Pouets épinglés",
"notification.favourite": "{name} a ajouté à ses favoris :",
"notification.follow": "{name} vous suit.",
"notification.mention": "{name} vous a mentionné⋅e :",
@@ -166,7 +169,7 @@
"standalone.public_title": "Jeter un coup d’œil…",
"status.cannot_reblog": "Cette publication ne peut être boostée",
"status.delete": "Effacer",
- "status.embed": "Embed",
+ "status.embed": "Intégrer",
"status.favourite": "Ajouter aux favoris",
"status.load_more": "Charger plus",
"status.media_hidden": "Média caché",
@@ -195,6 +198,15 @@
"upload_button.label": "Joindre un média",
"upload_form.undo": "Annuler",
"upload_progress.label": "Envoi en cours…",
+ "video.close": "Fermer la vidéo",
+ "video.exit_fullscreen": "Quitter plein écran",
+ "video.expand": "Agrandir la vidéo",
+ "video.fullscreen": "Plein écran",
+ "video.hide": "Masquer la vidéo",
+ "video.mute": "Couper le son",
+ "video.pause": "Pause",
+ "video.play": "Lecture",
+ "video.unmute": "Rétablir le son",
"video_player.expand": "Agrandir la vidéo",
"video_player.toggle_sound": "Activer/Désactiver le son",
"video_player.toggle_visible": "Afficher/Cacher la vidéo",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index 9ef9331086..f78c31a464 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -33,6 +33,7 @@
"column.home": "בבית",
"column.mutes": "השתקות",
"column.notifications": "התראות",
+ "column.pins": "Pinned toot",
"column.public": "בפרהסיה",
"column_back_button.label": "חזרה",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "חשבונך אינו {locked}. כל אחד יוכל לעקוב אחריך כדי לקרוא את הודעותיך המיועדות לעוקבים בלבד.",
"compose_form.lock_disclaimer.lock": "נעול",
"compose_form.placeholder": "מה עובר לך בראש?",
- "compose_form.privacy_disclaimer": "הודעתך הפרטית תשלח למשתמשים על {domains}. האם ניתן לסמוך על {domainsCount, plural, one {שרת זה} other {שרתים אלו}}? פרטיות ההודעה קיימת רק על שרתי מסטודון. אם {domains} {domainsCount, plural, one {הוא לא שרת מסטודון} other {הם לא שרתי מסטודון}}, לא יהיה שום סימן שההודעה פרטית, והוא עשוי להיות מקודם או להחשף למשתמשים שלא ברשימת היעד.",
"compose_form.publish": "ללחוש",
"compose_form.publish_loud": "לחצרץ!",
"compose_form.sensitive": "סימון תוכן כרגיש",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "פעילות",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "דגלים",
"emoji_button.food": "אוכל ושתיה",
"emoji_button.label": "הוספת אמוג'י",
"emoji_button.nature": "טבע",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "חפצים",
"emoji_button.people": "אנשים",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "חיפוש...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "סמלים",
"emoji_button.travel": "טיולים ואתרים",
"empty_column.community": "טור הסביבה ריק. יש לפרסם משהו כדי שדברים יתרחילו להתגלגל!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "מידע נוסף",
"navigation_bar.logout": "יציאה",
"navigation_bar.mutes": "השתקות",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "העדפות",
"navigation_bar.public_timeline": "ציר זמן בין-קהילתי",
"notification.favourite": "חצרוצך חובב על ידי {name}",
@@ -193,6 +198,15 @@
"upload_button.label": "הוספת מדיה",
"upload_form.undo": "ביטול",
"upload_progress.label": "עולה...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "הרחבת וידאו",
"video_player.toggle_sound": "הפעלת\\ביטול שמע",
"video_player.toggle_visible": "הפעלת\\ביטול תצוגה",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index f301723cf2..43fe95eb8e 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -33,6 +33,7 @@
"column.home": "Dom",
"column.mutes": "Utišani korisnici",
"column.notifications": "Notifikacije",
+ "column.pins": "Pinned toot",
"column.public": "Federalni timeline",
"column_back_button.label": "Natrag",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Tvoj račun nije {locked}. Svatko te može slijediti kako bi vidio postove namijenjene samo tvojim sljedbenicima.",
"compose_form.lock_disclaimer.lock": "zaključan",
"compose_form.placeholder": "Što ti je na umu?",
- "compose_form.privacy_disclaimer": "Tvoj privatni status će biti dostavljen spomenutim korisnicima na {domains}. Vjeruješ li {domainsCount, plural, one {that server} drugim {those servers}}? Privatnost postova radi samo na Mastodon instancama. Ako {domains} {domainsCount, plural, one {is not a Mastodon instance} other {are not Mastodon instances}}, neće biti indikacije da je tvoj post privatan, i mogao bi biti podignut ili biti učinjen vidljivim na drugi način neželjenim primateljima.",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Označi media sadržaj kao osjetljiv",
@@ -61,19 +61,22 @@
"confirmations.domain_block.message": "Jesi li zaista, zaista siguran da želiš potpuno blokirati {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.",
"confirmations.mute.confirm": "Utišaj",
"confirmations.mute.message": "Jesi li siguran da želiš utišati {name}?",
- "confirmations.mute.message": "Jesi li siguran da želiš utišati {name}?",
"confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Aktivnost",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Zastave",
"emoji_button.food": "Hrana & Piće",
"emoji_button.label": "Umetni smajlije",
"emoji_button.nature": "Priroda",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objekti",
"emoji_button.people": "Ljudi",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Traži...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Simboli",
"emoji_button.travel": "Putovanja & Mjesta",
"empty_column.community": "Lokalni timeline je prazan. Napiši nešto javno kako bi pokrenuo stvari!",
@@ -110,6 +113,7 @@
"navigation_bar.info": "Više informacija",
"navigation_bar.logout": "Odjavi se",
"navigation_bar.mutes": "Utišani korisnici",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Postavke",
"navigation_bar.public_timeline": "Federalni timeline",
"notification.favourite": "{name} je lajkao tvoj status",
@@ -194,6 +198,15 @@
"upload_button.label": "Dodaj media",
"upload_form.undo": "Poništi",
"upload_progress.label": "Uploadam...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Proširi video",
"video_player.toggle_sound": "Toggle zvuk",
"video_player.toggle_visible": "Preklopi vidljivost",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index a708ec6382..f73295dca2 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -33,6 +33,7 @@
"column.home": "Kezdőlap",
"column.mutes": "Muted users",
"column.notifications": "Értesítések",
+ "column.pins": "Pinned toot",
"column.public": "Nyilvános",
"column_back_button.label": "Vissza",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
"compose_form.placeholder": "Mire gondolsz?",
- "compose_form.privacy_disclaimer": "Your private status will be delivered to mentioned users on {domains}. Do you trust {domainsCount, plural, one {that server} other {those servers}}? Post privacy only works on Mastodon instances. If {domains} {domainsCount, plural, one {is not a Mastodon instance} other {are not Mastodon instances}}, there will be no indication that your post is private, and it may be boosted or otherwise made visible to unintended recipients.",
"compose_form.publish": "Tülk!",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Tartalom érzékenynek jelölése",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
"emoji_button.label": "Insert emoji",
"emoji_button.nature": "Nature",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objects",
"emoji_button.people": "People",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Search...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbols",
"emoji_button.travel": "Travel & Places",
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Extended information",
"navigation_bar.logout": "Kijelentkezés",
"navigation_bar.mutes": "Muted users",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Beállítások",
"navigation_bar.public_timeline": "Nyilvános időfolyam",
"notification.favourite": "{name} kedvencnek jelölte az állapotod",
@@ -193,6 +198,15 @@
"upload_button.label": "Média hozzáadása",
"upload_form.undo": "Mégsem",
"upload_progress.label": "Uploading...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Expand video",
"video_player.toggle_sound": "Hang kapcsolása",
"video_player.toggle_visible": "Toggle visibility",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index d71e293e8c..4d5f0a5d8d 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -33,6 +33,7 @@
"column.home": "Beranda",
"column.mutes": "Pengguna dibisukan",
"column.notifications": "Notifikasi",
+ "column.pins": "Pinned toot",
"column.public": "Linimasa gabunggan",
"column_back_button.label": "Kembali",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Akun anda tidak {locked}. Semua orang dapat mengikuti anda untuk melihat postingan khusus untuk pengikut anda.",
"compose_form.lock_disclaimer.lock": "dikunci",
"compose_form.placeholder": "Apa yang ada di pikiran anda?",
- "compose_form.privacy_disclaimer": "Status pribadi anda akan dikirim ke pengguna yang disebut dalam {domains}. Apa anda mempercayai {domainsCount, plural, one {server tersebut} other {server tersebut}}? Privasi postingan hanya bekerja dalam server Mastodon. Jika {domains} {domainsCount, plural, one {bukan server Mastodon} other {bukan server Mastodon}}, akan ada indikasi bahwa postingan anda adalah postingan pribadi, dan dapat di-boost atau dapat dilihat oleh orang lain.",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Tandai media sensitif",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Aktivitas",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Bendera",
"emoji_button.food": "Makanan & Minuman",
"emoji_button.label": "Tambahkan emoji",
"emoji_button.nature": "Alam",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Benda-benda",
"emoji_button.people": "Orang",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Cari...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Simbol",
"emoji_button.travel": "Tempat Wisata",
"empty_column.community": "Linimasa lokal masih kosong. Tulis sesuatu secara publik dan buat roda berputar!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Informasi selengkapnya",
"navigation_bar.logout": "Keluar",
"navigation_bar.mutes": "Pengguna dibisukan",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Pengaturan",
"navigation_bar.public_timeline": "Linimasa gabungan",
"notification.favourite": "{name} menyukai status anda",
@@ -193,6 +198,15 @@
"upload_button.label": "Tambahkan media",
"upload_form.undo": "Undo",
"upload_progress.label": "Mengunggah...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Tampilkan video",
"video_player.toggle_sound": "Suara",
"video_player.toggle_visible": "Tampilan",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index 5df5c59a1e..d2c1ee73d6 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -33,6 +33,7 @@
"column.home": "Hemo",
"column.mutes": "Celita uzeri",
"column.notifications": "Savigi",
+ "column.pins": "Pinned toot",
"column.public": "Federata tempolineo",
"column_back_button.label": "Retro",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
"compose_form.placeholder": "Quo esas en tua spirito?",
- "compose_form.privacy_disclaimer": "Tua privata mesajo livresos a mencionata uzeri en {domains}. Ka tu fidas {domainsCount, plural, one {ta servero} other {ta serveri}}? Privateso di mesaji funcionas nur en instaluri di Mastodon. Se {domains} {domainsCount, plural, one {ne esas instaluro di Mastodon} other {ne esas instaluri di Mastodon}}, esos nula indiko, ke tua mesajo esas privata, ed ol povos repetesar od altre divenar videbla da nedezirinda recevanti.",
"compose_form.publish": "Siflar",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Markizar kontenajo kom trubliva",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
"emoji_button.label": "Insertar emoji",
"emoji_button.nature": "Nature",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objects",
"emoji_button.people": "People",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Search...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbols",
"emoji_button.travel": "Travel & Places",
"empty_column.community": "La lokala tempolineo esas vakua. Skribez ulo publike por iniciar la agiveso!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Detaloza informi",
"navigation_bar.logout": "Ekirar",
"navigation_bar.mutes": "Celita uzeri",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Preferi",
"navigation_bar.public_timeline": "Federata tempolineo",
"notification.favourite": "{name} favorizis tua mesajo",
@@ -193,6 +198,15 @@
"upload_button.label": "Adjuntar kontenajo",
"upload_form.undo": "Desfacar",
"upload_progress.label": "Kargante...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Extensar video",
"video_player.toggle_sound": "Acendar sono",
"video_player.toggle_visible": "Chanjar videbleso",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index eec35a70ce..33f0e7fdce 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -33,6 +33,7 @@
"column.home": "Home",
"column.mutes": "Utenti silenziati",
"column.notifications": "Notifiche",
+ "column.pins": "Pinned toot",
"column.public": "Timeline federata",
"column_back_button.label": "Indietro",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
"compose_form.placeholder": "A cosa stai pensando?",
- "compose_form.privacy_disclaimer": "Il tuo status privato verrà condiviso con gli utenti menzionati su {domains}. Ti fidi di {domainsCount, plural, one {quel server} other {quei server}}? Le impostazioni sulla privacy valgono solo su server Mastodon. Se {domains} {domainsCount, plural, one {non è un server Mastodon} other {non sono server Mastodon}}, non ci saranno indicazioni sulla privacy del tuo status, e potrebbe essere condiviso o reso visibile a destinatari indesiderati.",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Segnala file come sensibile",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
"emoji_button.label": "Inserisci emoji",
"emoji_button.nature": "Nature",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objects",
"emoji_button.people": "People",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Search...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbols",
"emoji_button.travel": "Travel & Places",
"empty_column.community": "La timeline locale è vuota. Condividi qualcosa pubblicamente per dare inizio alla festa!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Informazioni estese",
"navigation_bar.logout": "Logout",
"navigation_bar.mutes": "Utenti silenziati",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Impostazioni",
"navigation_bar.public_timeline": "Timeline federata",
"notification.favourite": "{name} ha apprezzato il tuo post",
@@ -193,6 +198,15 @@
"upload_button.label": "Aggiungi file multimediale",
"upload_form.undo": "Annulla",
"upload_progress.label": "Sto caricando...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Espandi video",
"video_player.toggle_sound": "Attiva suono",
"video_player.toggle_visible": "Attiva visibilità",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 65838a3f80..c3d96baf37 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -33,8 +33,8 @@
"column.home": "ホーム",
"column.mutes": "ミュートしたユーザー",
"column.notifications": "通知",
- "column.public": "連合タイムライン",
"column.pins": "固定されたトゥート",
+ "column.public": "連合タイムライン",
"column_back_button.label": "戻る",
"column_header.hide_settings": "設定を隠す",
"column_header.moveLeft_settings": "カラムを左に移動する",
@@ -47,7 +47,6 @@
"compose_form.lock_disclaimer": "あなたのアカウントは{locked}になっていません。誰でもあなたをフォローすることができ、フォロワー限定の投稿を見ることができます。",
"compose_form.lock_disclaimer.lock": "非公開",
"compose_form.placeholder": "今なにしてる?",
- "compose_form.privacy_disclaimer": "あなたの非公開トゥートは返信先ユーザーが所属する{domains}に送信されます。{domainsCount, plural, one {このサーバー} other {これらのサーバー}}は信頼できますか? 投稿のプライバシー保護はMastodonサーバー内でのみ有効です。{domains}がMastodonインスタンスでない場合、あなたの投稿がプライベートなものとして扱われず、ブーストされたり予期しないユーザーに見られる可能性があります。",
"compose_form.publish": "トゥート",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "メディアを閲覧注意としてマークする",
@@ -67,13 +66,17 @@
"embed.instructions": "下記のコードをコピーしてウェブサイトに埋め込みます。",
"embed.preview": "表示例:",
"emoji_button.activity": "活動",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "国旗",
"emoji_button.food": "食べ物",
"emoji_button.label": "絵文字を追加",
"emoji_button.nature": "自然",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "物",
"emoji_button.people": "人々",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "検索...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "記号",
"emoji_button.travel": "旅行と場所",
"empty_column.community": "ローカルタイムラインはまだ使われていません。何か書いてみましょう!",
@@ -97,8 +100,8 @@
"home.column_settings.show_replies": "返信表示",
"home.settings": "カラム設定",
"lightbox.close": "閉じる",
- "lightbox.next": "Next",
- "lightbox.previous": "Previous",
+ "lightbox.next": "次",
+ "lightbox.previous": "前",
"loading_indicator.label": "読み込み中...",
"media_gallery.toggle_visible": "表示切り替え",
"missing_indicator.label": "見つかりません",
@@ -110,9 +113,9 @@
"navigation_bar.info": "このインスタンスについて",
"navigation_bar.logout": "ログアウト",
"navigation_bar.mutes": "ミュートしたユーザー",
+ "navigation_bar.pins": "固定されたトゥート",
"navigation_bar.preferences": "ユーザー設定",
"navigation_bar.public_timeline": "連合タイムライン",
- "navigation_bar.pins": "固定されたトゥート",
"notification.favourite": "{name}さんがあなたのトゥートをお気に入りに登録しました",
"notification.follow": "{name}さんにフォローされました",
"notification.mention": "{name}さんがあなたに返信しました",
@@ -195,6 +198,15 @@
"upload_button.label": "メディアを追加",
"upload_form.undo": "やり直す",
"upload_progress.label": "アップロード中...",
+ "video.close": "動画を閉じる",
+ "video.exit_fullscreen": "全画面を終了する",
+ "video.expand": "動画を拡大する",
+ "video.fullscreen": "全画面",
+ "video.hide": "動画を閉じる",
+ "video.mute": "ミュート",
+ "video.pause": "一時停止",
+ "video.play": "再生",
+ "video.unmute": "ミュートを解除する",
"video_player.expand": "動画の詳細",
"video_player.toggle_sound": "音の切り替え",
"video_player.toggle_visible": "表示切り替え",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 8393e82e57..c50bb2f340 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -33,8 +33,8 @@
"column.home": "홈",
"column.mutes": "뮤트 중인 사용자",
"column.notifications": "알림",
- "column.public": "연합 타임라인",
"column.pins": "고정된 Toot",
+ "column.public": "연합 타임라인",
"column_back_button.label": "돌아가기",
"column_header.hide_settings": "Hide settings",
"column_header.moveLeft_settings": "Move column to the left",
@@ -47,7 +47,6 @@
"compose_form.lock_disclaimer": "이 계정은 {locked}로 설정 되어 있지 않습니다. 누구나 이 계정을 팔로우 할 수 있으며, 팔로워 공개의 포스팅을 볼 수 있습니다.",
"compose_form.lock_disclaimer.lock": "비공개",
"compose_form.placeholder": "지금 무엇을 하고 있나요?",
- "compose_form.privacy_disclaimer": "이 계정의 비공개 포스트는 멘션된 사용자가 소속된 {domains}으로 전송됩니다. {domainsCount, plural, one {이 서버를} other {이 서버들을}} 신뢰할 수 있습니까? 포스팅의 프라이버시 보호는 Mastodon 서버에서만 유효합니다. {domains}가 Mastodon 인스턴스가 아닐 경우, 이 투고가 사적인 것으로 취급되지 않은 채 부스트 되거나 원하지 않는 사용자에게 보여질 가능성이 있습니다.",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "이 미디어를 민감한 미디어로 취급",
@@ -67,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "활동",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "국기",
"emoji_button.food": "음식",
"emoji_button.label": "emoji를 추가",
"emoji_button.nature": "자연",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "물건",
"emoji_button.people": "사람들",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "검색...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "기호",
"emoji_button.travel": "여행과 장소",
"empty_column.community": "로컬 타임라인에 아무 것도 없습니다. 아무거나 적어 보세요!",
@@ -110,9 +113,9 @@
"navigation_bar.info": "이 인스턴스에 대해서",
"navigation_bar.logout": "로그아웃",
"navigation_bar.mutes": "뮤트 중인 사용자",
+ "navigation_bar.pins": "고정된 Toot",
"navigation_bar.preferences": "사용자 설정",
"navigation_bar.public_timeline": "연합 타임라인",
- "navigation_bar.pins": "고정된 Toot",
"notification.favourite": "{name}님이 즐겨찾기 했습니다",
"notification.follow": "{name}님이 나를 팔로우 했습니다",
"notification.mention": "{name}님이 답글을 보냈습니다",
@@ -195,6 +198,15 @@
"upload_button.label": "미디어 추가",
"upload_form.undo": "재시도",
"upload_progress.label": "업로드 중...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "동영상 자세히 보기",
"video_player.toggle_sound": "소리 토글하기",
"video_player.toggle_visible": "표시 전환",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index d6775e1e4d..c333bec706 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -12,7 +12,7 @@
"account.mute": "Negeer @{name}",
"account.posts": "Toots",
"account.report": "Rapporteer @{name}",
- "account.requested": "Wacht op goedkeuring",
+ "account.requested": "Wacht op goedkeuring. Klik om volgverzoek te annuleren.",
"account.share": "Profiel van @{name} delen",
"account.unblock": "Deblokkeer @{name}",
"account.unblock_domain": "{domain} niet meer negeren",
@@ -33,11 +33,12 @@
"column.home": "Start",
"column.mutes": "Genegeerde gebruikers",
"column.notifications": "Meldingen",
+ "column.pins": "Vastgezette toots",
"column.public": "Globale tijdlijn",
"column_back_button.label": "terug",
"column_header.hide_settings": "Instellingen verbergen",
- "column_header.moveLeft_settings": "Move column to the left",
- "column_header.moveRight_settings": "Move column to the right",
+ "column_header.moveLeft_settings": "Kolom naar links verplaatsen",
+ "column_header.moveRight_settings": "Kolom naar rechts verplaatsen",
"column_header.pin": "Vastmaken",
"column_header.show_settings": "Instellingen tonen",
"column_header.unpin": "Losmaken",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Jouw account is niet {locked}. Iedereen kan jou volgen en toots zien die je alleen aan volgers hebt gericht.",
"compose_form.lock_disclaimer.lock": "besloten",
"compose_form.placeholder": "Wat wil je kwijt?",
- "compose_form.privacy_disclaimer": "Jouw privétoot wordt afgeleverd aan de vermelde gebruikers op {domains}. Vertrouw jij {domainsCount, plural, one {die server} other {die servers}}? Het privé plaatsen van toots werkt alleen op Mastodon-servers. Wanneer {domains} {domainsCount, plural, one {geen Mastodon-server is} other {geen Mastodon-servers zijn}}, dan wordt er niet aangegeven dat de toot privé is, waardoor het kan worden geboost of op een andere manier zichtbaar wordt gemaakt voor mensen waarvoor het niet was bedoeld.",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Media als gevoelig markeren (nsfw)",
@@ -63,16 +63,20 @@
"confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?",
"confirmations.unfollow.confirm": "Ontvolgen",
"confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?",
- "embed.instructions": "Embed this status on your website by copying the code below.",
- "embed.preview": "Here is what it will look like:",
+ "embed.instructions": "Embed deze toot op jouw website, door de onderstaande code te kopiëren.",
+ "embed.preview": "Zo komt het eruit te zien:",
"emoji_button.activity": "Activiteiten",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Vlaggen",
"emoji_button.food": "Eten en drinken",
"emoji_button.label": "Emoji toevoegen",
"emoji_button.nature": "Natuur",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Voorwerpen",
"emoji_button.people": "Mensen",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Zoeken...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbolen",
"emoji_button.travel": "Reizen en plekken",
"empty_column.community": "De lokale tijdlijn is nog leeg. Toot iets in het openbaar om de bal aan het rollen te krijgen!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Uitgebreide informatie",
"navigation_bar.logout": "Afmelden",
"navigation_bar.mutes": "Genegeerde gebruikers",
+ "navigation_bar.pins": "Vastgezette toots",
"navigation_bar.preferences": "Instellingen",
"navigation_bar.public_timeline": "Globale tijdlijn",
"notification.favourite": "{name} markeerde jouw toot als favoriet",
@@ -171,7 +176,7 @@
"status.mention": "Vermeld @{name}",
"status.mute_conversation": "Negeer conversatie",
"status.open": "Toot volledig tonen",
- "status.pin": "Pin on profile",
+ "status.pin": "Aan profielpagina vastmaken",
"status.reblog": "Boost",
"status.reblogged_by": "{name} boostte",
"status.reply": "Reageren",
@@ -183,7 +188,7 @@
"status.show_less": "Minder tonen",
"status.show_more": "Meer tonen",
"status.unmute_conversation": "Conversatie niet meer negeren",
- "status.unpin": "Unpin from profile",
+ "status.unpin": "Van profielpagina losmaken",
"tabs_bar.compose": "Schrijven",
"tabs_bar.federated_timeline": "Globaal",
"tabs_bar.home": "Start",
@@ -193,6 +198,15 @@
"upload_button.label": "Media toevoegen",
"upload_form.undo": "Ongedaan maken",
"upload_progress.label": "Uploaden...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Video groter maken",
+ "video.fullscreen": "Volledig scherm",
+ "video.hide": "Video verbergen",
+ "video.mute": "Geluid uitschakelen",
+ "video.pause": "Pauze",
+ "video.play": "Afspelen",
+ "video.unmute": "Geluid inschakelen",
"video_player.expand": "Video groter maken",
"video_player.toggle_sound": "Geluid in-/uitschakelen",
"video_player.toggle_visible": "Video wel/niet tonen",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index f3c24a8079..d28190faf7 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -33,6 +33,7 @@
"column.home": "Hjem",
"column.mutes": "Dempede brukere",
"column.notifications": "Varsler",
+ "column.pins": "Pinned toot",
"column.public": "Felles tidslinje",
"column_back_button.label": "Tilbake",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Din konto er ikke {locked}. Hvem som helst kan følge deg og se dine private poster.",
"compose_form.lock_disclaimer.lock": "låst",
"compose_form.placeholder": "Hva har du på hjertet?",
- "compose_form.privacy_disclaimer": "Din private status vil leveres til nevnte brukere på {domains}. Stoler du på {domainsCount, plural, one {den serveren} other {de serverne}}? Synlighet fungerer kun på Mastodon-instanser. Hvis {domains} {domainsCount, plural, one {ikke er en Mastodon-instans} other {ikke er Mastodon-instanser}}, vil det ikke indikeres at posten din er privat, og den kan kanskje bli fremhevd eller på annen måte bli synlig for uventede mottakere.",
"compose_form.publish": "Tut",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Merk media som følsomt",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Aktivitet",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Flagg",
"emoji_button.food": "Mat og drikke",
"emoji_button.label": "Sett inn emoji",
"emoji_button.nature": "Natur",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objekter",
"emoji_button.people": "Mennesker",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Søk...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symboler",
"emoji_button.travel": "Reise & steder",
"empty_column.community": "Den lokale tidslinjen er tom. Skriv noe offentlig for å få snøballen til å rulle!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Utvidet informasjon",
"navigation_bar.logout": "Logg ut",
"navigation_bar.mutes": "Dempede brukere",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Preferanser",
"navigation_bar.public_timeline": "Felles tidslinje",
"notification.favourite": "{name} likte din status",
@@ -193,6 +198,15 @@
"upload_button.label": "Legg til media",
"upload_form.undo": "Angre",
"upload_progress.label": "Laster opp...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Utvid video",
"video_player.toggle_sound": "Veksle lyd",
"video_player.toggle_visible": "Veksle synlighet",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index d2b2dd48f7..8e9d06642a 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -33,8 +33,8 @@
"column.home": "Acuèlh",
"column.mutes": "Personas en silenci",
"column.notifications": "Notificacions",
- "column.public": "Flux public global",
"column.pins": "Tuts penjats",
+ "column.public": "Flux public global",
"column_back_button.label": "Tornar",
"column_header.hide_settings": "Amagar los paramètres",
"column_header.moveLeft_settings": "Desplaçar la colomna a man drecha",
@@ -47,7 +47,6 @@
"compose_form.lock_disclaimer": "Vòstre compte es pas {locked}. Tot lo mond pòt vos sègre e veire los estatuts reservats als seguidors.",
"compose_form.lock_disclaimer.lock": "clavat",
"compose_form.placeholder": "A de qué pensatz ?",
- "compose_form.privacy_disclaimer": "Vòstre estatut privat serà enviat a las personas mencionadas sus {domains}. Vos fisatz d’aqueste {domainsCount, plural, one { servidor} other {s servidors}} per divulgar pas vòstre estatut ? Los estatuts privats foncionan pas que sus las instàncias de Mastodon. Se {domains} {domainsCount, plural, one {es pas una instància a Mastodon} other {son pas d'instàncias a Mastodon}}, i aurà pas d’indicacion disent que vòstre estatut es privat e poirà èsser partejat o èsser visible a de mond pas prevists",
"compose_form.publish": "Tut",
"compose_form.publish_loud": "{publish} !",
"compose_form.sensitive": "Marcar lo mèdia coma sensible",
@@ -64,16 +63,20 @@
"confirmations.mute.message": "Sètz segur de voler metre en silenci {name} ?",
"confirmations.unfollow.confirm": "Quitar de sègre",
"confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?",
- "embed.instructions": "Embarcar aqueste estatut per o far veire sus un site Internet en copiar lo còdi çai-jos.",
+ "embed.instructions": "Embarcar aqueste estatut per lo far veire sus un site Internet en copiar lo còdi çai-jos.",
"embed.preview": "Semblarà aquò : ",
"emoji_button.activity": "Activitats",
+ "emoji_button.custom": "Personalizats",
"emoji_button.flags": "Drapèus",
"emoji_button.food": "Beure e manjar",
"emoji_button.label": "Inserir un emoji",
"emoji_button.nature": "Natura",
+ "emoji_button.not_found": "Cap emoji ! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objèctes",
"emoji_button.people": "Gents",
+ "emoji_button.recent": "Sovent utilizats",
"emoji_button.search": "Cercar…",
+ "emoji_button.search_results": "Resultat de recèrca",
"emoji_button.symbols": "Simbòls",
"emoji_button.travel": "Viatges & lòcs",
"empty_column.community": "Lo flux public local es void. Escrivètz quicòm per lo garnir !",
@@ -110,9 +113,9 @@
"navigation_bar.info": "Mai informacions",
"navigation_bar.logout": "Desconnexion",
"navigation_bar.mutes": "Personas rescondudas",
+ "navigation_bar.pins": "Tuts penjats",
"navigation_bar.preferences": "Preferéncias",
"navigation_bar.public_timeline": "Flux public global",
- "navigation_bar.pins": "Tuts penjats",
"notification.favourite": "{name} a ajustat a sos favorits :",
"notification.follow": "{name} vos sèc",
"notification.mention": "{name} vos a mencionat :",
@@ -195,6 +198,15 @@
"upload_button.label": "Ajustar un mèdia",
"upload_form.undo": "Anullar",
"upload_progress.label": "Mandadís…",
+ "video.close": "Tampar la vidèo",
+ "video.exit_fullscreen": "Sortir plen ecran",
+ "video.expand": "Agrandir la vidèo",
+ "video.fullscreen": "Ecran complet",
+ "video.hide": "Amagar la vidèo",
+ "video.mute": "Copar lo son",
+ "video.pause": "Pausa",
+ "video.play": "Lectura",
+ "video.unmute": "Restablir lo son",
"video_player.expand": "Mostrar la vidèo",
"video_player.toggle_sound": "Activar/Desactivar lo son",
"video_player.toggle_visible": "Mostrar/Rescondre la vidèo",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index daa60128d5..35b1a31010 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -47,7 +47,6 @@
"compose_form.lock_disclaimer": "Twoje konto nie jest {locked}. Każdy, kto Cię śledzi, może wyświetlać Twoje wpisy przeznaczone tylko dla śledzących.",
"compose_form.lock_disclaimer.lock": "zablokowane",
"compose_form.placeholder": "Co Ci chodzi po głowie?",
- "compose_form.privacy_disclaimer": "Twój wpis zostanie dostarczony do użytkowników z {domains}. Czy ufasz {domainsCount, plural, one {temu serwerowi} other {tym serwerom}}? Prywatność wpisów obowiązuje tylko na instancjach Mastodona. Jeżeli {domains} {domainsCount, plural, one {nie jest instancją Mastodona} other {nie są instancjami Mastodona}}, wpis może być widoczny dla niewłaściwych osób.",
"compose_form.publish": "Wyślij",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Oznacz treści jako wrażliwe",
@@ -67,13 +66,17 @@
"embed.instructions": "Osadź ten status na swojej stronie wklejając poniższy kod.",
"embed.preview": "Tak będzie to wyglądać:",
"emoji_button.activity": "Aktywność",
+ "emoji_button.custom": "Niestandardowe",
"emoji_button.flags": "Flagi",
"emoji_button.food": "Żywność i napoje",
"emoji_button.label": "Wstaw emoji",
"emoji_button.nature": "Natura",
+ "emoji_button.not_found": "Brak emoji!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objekty",
"emoji_button.people": "Ludzie",
+ "emoji_button.recent": "Najczęściej używane",
"emoji_button.search": "Szukaj…",
+ "emoji_button.search_results": "Wyniki wyszukiwania",
"emoji_button.symbols": "Symbole",
"emoji_button.travel": "Podróże i miejsca",
"empty_column.community": "Lokalna oś czasu jest pusta. Napisz coś publicznie, aby zagaić!",
@@ -195,7 +198,16 @@
"upload_button.label": "Dodaj zawartość multimedialną",
"upload_form.undo": "Cofnij",
"upload_progress.label": "Wysyłanie",
- "video_player.expand": "Przełącz wideo",
+ "video.close": "Zamknij film",
+ "video.exit_fullscreen": "Opuść tryb pełnoekranowy",
+ "video.expand": "Rozszerz film",
+ "video.fullscreen": "Pełny ekran",
+ "video.hide": "Ukryj film",
+ "video.mute": "Wycisz",
+ "video.pause": "Pauzuj",
+ "video.play": "Odtwórz",
+ "video.unmute": "Cofnij wyciszenie",
+ "video_player.expand": "Rozszerz film",
"video_player.toggle_sound": "Przełącz dźwięk",
"video_player.toggle_visible": "Przełącz widoczność",
"video_player.video_error": "Nie można odtworzyć pliku wideo"
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index e861bf73ff..187343e83f 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -6,25 +6,25 @@
"account.follow": "Seguir",
"account.followers": "Seguidores",
"account.follows": "Segue",
- "account.follows_you": "É seu seguidor",
+ "account.follows_you": "Segue você",
"account.media": "Mídia",
"account.mention": "Mencionar @{name}",
"account.mute": "Silenciar @{name}",
"account.posts": "Posts",
"account.report": "Denunciar @{name}",
- "account.requested": "Aguardando aprovação",
+ "account.requested": "Aguardando aprovação. Clique para cancelar a solicitação.",
"account.share": "Compartilhar perfil de @{name}",
- "account.unblock": "Não bloquear @{name}",
+ "account.unblock": "Desbloquear @{name}",
"account.unblock_domain": "Desbloquear {domain}",
"account.unfollow": "Deixar de seguir",
"account.unmute": "Não silenciar @{name}",
"account.view_full_profile": "Ver perfil completo",
- "boost_modal.combo": "Pode clicar {combo} para não voltar a ver",
- "bundle_column_error.body": "Something went wrong while loading this component.",
+ "boost_modal.combo": "Você pode pressionar {combo} para ignorar este diálogo na próxima vez",
+ "bundle_column_error.body": "Algo de errado aconteceu enquanto este componente era carregado.",
"bundle_column_error.retry": "Tente novamente",
- "bundle_column_error.title": "Network error",
+ "bundle_column_error.title": "Erro de rede",
"bundle_modal_error.close": "Fechar",
- "bundle_modal_error.message": "Something went wrong while loading this component.",
+ "bundle_modal_error.message": "Algo de errado aconteceu enquanto este componente era carregado.",
"bundle_modal_error.retry": "Tente novamente",
"column.blocks": "Usuários bloqueados",
"column.community": "Local",
@@ -33,6 +33,7 @@
"column.home": "Página inicial",
"column.mutes": "Usuários silenciados",
"column.notifications": "Notificações",
+ "column.pins": "Postagens fixadas",
"column.public": "Global",
"column_back_button.label": "Voltar",
"column_header.hide_settings": "Esconder configurações",
@@ -43,156 +44,169 @@
"column_header.unpin": "Desafixar",
"column_subheading.navigation": "Navegação",
"column_subheading.settings": "Configurações",
- "compose_form.lock_disclaimer": "A sua conta não está {locked}. Qualquer pessoa pode te seguir e visualizar as suas postagens só para seguidores.",
- "compose_form.lock_disclaimer.lock": "locked",
+ "compose_form.lock_disclaimer": "A sua conta não está {locked}. Qualquer pessoa pode te seguir e visualizar postagens direcionadas a apenas seguidores.",
+ "compose_form.lock_disclaimer.lock": "trancado",
"compose_form.placeholder": "No que você está pensando?",
- "compose_form.privacy_disclaimer": "O seu conteúdo privado será compartilhado com os usuários do {domains}. Você confia {domainsCount, plural, one {neste servidor} other {nestes servidores}}? As configurações de privacidade só funcionam em instâncias do Mastodon. Se {domains} {domainsCount, plural, one {não é uma instância} other {não são instâncias}}, não há como garantir a privacidade de suas postagens, e elas podem ser compartilhadas com outros.",
"compose_form.publish": "Publicar",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Marcar mídia como conteúdo sensível",
- "compose_form.spoiler": "Esconder texto com aviso",
+ "compose_form.spoiler": "Esconder texto com aviso de conteúdo",
"compose_form.spoiler_placeholder": "Aviso de conteúdo",
"confirmation_modal.cancel": "Cancelar",
"confirmations.block.confirm": "Bloquear",
"confirmations.block.message": "Você tem certeza de que quer bloquear {name}?",
"confirmations.delete.confirm": "Excluir",
- "confirmations.delete.message": "Você tem certeza de que quer excluir este status?",
+ "confirmations.delete.message": "Você tem certeza de que quer excluir esta postagem?",
"confirmations.domain_block.confirm": "Esconder o domínio inteiro",
"confirmations.domain_block.message": "Você quer mesmo bloquear {domain} inteiro? Na maioria dos casos, silenciar ou bloquear alguns usuários é o suficiente e o recomendado.",
"confirmations.mute.confirm": "Silenciar",
"confirmations.mute.message": "Você tem certeza de que quer silenciar {name}?",
"confirmations.unfollow.confirm": "Deixar de seguir",
"confirmations.unfollow.message": "Você tem certeza de que quer deixar de seguir {name}?",
- "embed.instructions": "Embed this status on your website by copying the code below.",
- "embed.preview": "Here is what it will look like:",
- "emoji_button.activity": "Activity",
- "emoji_button.flags": "Flags",
- "emoji_button.food": "Food & Drink",
+ "embed.instructions": "Incorpore esta postagem em seu site copiando o código abaixo:",
+ "embed.preview": "Aqui está uma previsão de como ficará:",
+ "emoji_button.activity": "Atividades",
+ "emoji_button.custom": "Custom",
+ "emoji_button.flags": "Bandeiras",
+ "emoji_button.food": "Comidas & Bebidas",
"emoji_button.label": "Inserir Emoji",
- "emoji_button.nature": "Nature",
- "emoji_button.objects": "Objects",
- "emoji_button.people": "People",
- "emoji_button.search": "Search...",
- "emoji_button.symbols": "Symbols",
- "emoji_button.travel": "Travel & Places",
- "empty_column.community": "Ainda não existem conteúdo local para mostrar!",
- "empty_column.hashtag": "Ainda não existe qualquer conteúdo com essa hashtag",
- "empty_column.home": "Ainda não segues qualquer utilizador. Visita {public} ou utiliza a pesquisa para procurar outros utilizadores.",
- "empty_column.home.inactivity": "Your home feed is empty. If you have been inactive for a while, it will be regenerated for you soon.",
+ "emoji_button.nature": "Natureza",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+ "emoji_button.objects": "Objetos",
+ "emoji_button.people": "Pessoas",
+ "emoji_button.recent": "Frequently used",
+ "emoji_button.search": "Buscar...",
+ "emoji_button.search_results": "Search results",
+ "emoji_button.symbols": "Símbolos",
+ "emoji_button.travel": "Viagens & Lugares",
+ "empty_column.community": "A timeline local está vazia. Escreva algo publicamente para começar!",
+ "empty_column.hashtag": "Ainda não há qualquer conteúdo com essa hashtag",
+ "empty_column.home": "Você ainda não segue usuário algo. Visite a timeline {public} ou use o buscador para procurar e conhecer outros usuários.",
+ "empty_column.home.inactivity": "A sua página inicial está vazia. Se você esteve inativo por um tempo, ela irá se regenerar em alguns intantes.",
"empty_column.home.public_timeline": "global",
- "empty_column.notifications": "Não tens notificações. Interage com outros utilizadores para iniciar uma conversa.",
- "empty_column.public": "Não há nada aqui! Escreve algo publicamente ou segue outros utilizadores para ver aqui os conteúdos públicos.",
+ "empty_column.notifications": "Você ainda não possui notificações. Interaja com outros usuários para começar a conversar!",
+ "empty_column.public": "Não há nada aqui! Escreva algo publicamente ou siga manualmente usuários de outras instâncias.",
"follow_request.authorize": "Autorizar",
"follow_request.reject": "Rejeitar",
"getting_started.appsshort": "Apps",
"getting_started.faq": "FAQ",
"getting_started.heading": "Primeiros passos",
- "getting_started.open_source_notice": "Mastodon é software de fonte aberta. Podes contribuir ou repostar problemas no GitHub do projecto: {github}.",
- "getting_started.userguide": "User Guide",
+ "getting_started.open_source_notice": "Mastodon é um software de código aberto. Você pode contribuir ou reportar problemas na página do GitHub do projeto: {github}.",
+ "getting_started.userguide": "Guia de usuário",
"home.column_settings.advanced": "Avançado",
"home.column_settings.basic": "Básico",
"home.column_settings.filter_regex": "Filtrar com uma expressão regular",
- "home.column_settings.show_reblogs": "Mostrar as partilhas",
+ "home.column_settings.show_reblogs": "Mostrar compartilhamentos",
"home.column_settings.show_replies": "Mostrar as respostas",
- "home.settings": "Parâmetros da listagem",
+ "home.settings": "Configurações de colunas",
"lightbox.close": "Fechar",
- "lightbox.next": "Next",
- "lightbox.previous": "Previous",
+ "lightbox.next": "Próximo",
+ "lightbox.previous": "Anterior",
"loading_indicator.label": "Carregando...",
"media_gallery.toggle_visible": "Esconder/Mostrar",
"missing_indicator.label": "Não encontrado",
- "navigation_bar.blocks": "Utilizadores bloqueados",
+ "navigation_bar.blocks": "Usuários bloqueados",
"navigation_bar.community_timeline": "Local",
"navigation_bar.edit_profile": "Editar perfil",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.follow_requests": "Seguidores pendentes",
"navigation_bar.info": "Mais informações",
"navigation_bar.logout": "Sair",
- "navigation_bar.mutes": "Utilizadores silenciados",
+ "navigation_bar.mutes": "Usuários silenciados",
+ "navigation_bar.pins": "Postagens fixadas",
"navigation_bar.preferences": "Preferências",
"navigation_bar.public_timeline": "Global",
- "notification.favourite": "{name} adicionou o teu post aos favoritos",
- "notification.follow": "{name} seguiu-te",
- "notification.mention": "{name} mencionou-te",
- "notification.reblog": "{name} partilhou o teu post",
+ "notification.favourite": "{name} adicionou a sua postagem aos favoritos",
+ "notification.follow": "{name} te seguiu",
+ "notification.mention": "{name} te mencionou",
+ "notification.reblog": "{name} compartilhou a sua postagem",
"notifications.clear": "Limpar notificações",
- "notifications.clear_confirmation": "Queres mesmo limpar todas as notificações?",
+ "notifications.clear_confirmation": "Você tem certeza de que quer limpar todas as suas notificações permanentemente?",
"notifications.column_settings.alert": "Notificações no computador",
"notifications.column_settings.favourite": "Favoritos:",
"notifications.column_settings.follow": "Novos seguidores:",
"notifications.column_settings.mention": "Menções:",
- "notifications.column_settings.push": "Push notifications",
- "notifications.column_settings.push_meta": "This device",
- "notifications.column_settings.reblog": "Partilhas:",
+ "notifications.column_settings.push": "Enviar notificações",
+ "notifications.column_settings.push_meta": "Este aparelho",
+ "notifications.column_settings.reblog": "Compartilhamento:",
"notifications.column_settings.show": "Mostrar nas colunas",
"notifications.column_settings.sound": "Reproduzir som",
- "onboarding.done": "Done",
- "onboarding.next": "Next",
- "onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
- "onboarding.page_four.home": "The home timeline shows posts from people you follow.",
- "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
- "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
- "onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
- "onboarding.page_one.welcome": "Welcome to Mastodon!",
- "onboarding.page_six.admin": "Your instance's admin is {admin}.",
- "onboarding.page_six.almost_done": "Almost done...",
+ "onboarding.done": "Pronto",
+ "onboarding.next": "Próximo",
+ "onboarding.page_five.public_timelines": "A timeline local mostra postagens públicas de todos os usuários no {domain}. A timeline federada mostra todas as postagens de todas as pessoas que pessoas no {domain} seguem. Estas são as timelines públicas, uma ótima maneira de conhecer novas pessoas.",
+ "onboarding.page_four.home": "A página inicial mostra postagens de pessoas que você segue.",
+ "onboarding.page_four.notifications": "A coluna de notificações te mostra quando alguém interage com você.",
+ "onboarding.page_one.federation": "Mastodon é uma rede d servidores independentes se juntando para fazer uma grande rede social. Nós chamamos estes servidores de instâncias.",
+ "onboarding.page_one.handle": "Você está no {domain}, então o seu nome de usuário completo é {handle}",
+ "onboarding.page_one.welcome": "Seja bem-vindo(a) ao Mastodon!",
+ "onboarding.page_six.admin": "O administrador de sua instância é {admin}.",
+ "onboarding.page_six.almost_done": "Quase acabando...",
"onboarding.page_six.appetoot": "Bon Appetoot!",
- "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
- "onboarding.page_six.github": "Mastodon is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
- "onboarding.page_six.guidelines": "community guidelines",
- "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
- "onboarding.page_six.various_app": "mobile apps",
- "onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
- "onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
- "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
- "onboarding.skip": "Skip",
+ "onboarding.page_six.apps_available": "Há {apps} disponíveis para iOS, Android e outras plataformas.",
+ "onboarding.page_six.github": "Mastodon é um software gratuito e de código aberto. Você pode reportar bugs, prequisitar novas funções ou contribuir para o código no {github}.",
+ "onboarding.page_six.guidelines": "diretrizes da comunidade",
+ "onboarding.page_six.read_guidelines": "Por favor, leia as {guidelines} do {domain}!",
+ "onboarding.page_six.various_app": "aplicativos móveis",
+ "onboarding.page_three.profile": "Edite o seu perfil para mudar o seu o seu avatar, bio e nome de exibição. No menu de configurações, você também encontrará outras preferências.",
+ "onboarding.page_three.search": "Use a barra de buscas para encontrar pessoas e consultar hashtahs, como #illustrations e #introductions. Para procurar por uma pessoa que não estiver nesta instância, use o nome de usuário completo dela.",
+ "onboarding.page_two.compose": "Escreva postagens na coluna de escrita. Você pode hospedar imagens, mudar as configurações de privacidade e adicionar alertas de conteúdo através dos ícones abaixo.",
+ "onboarding.skip": "Pular",
"privacy.change": "Ajustar a privacidade da mensagem",
- "privacy.direct.long": "Apenas para utilizadores mencionados",
- "privacy.direct.short": "Directo",
- "privacy.private.long": "Apenas para os seguidores",
- "privacy.private.short": "Privado",
+ "privacy.direct.long": "Apenas para usuários mencionados",
+ "privacy.direct.short": "Direta",
+ "privacy.private.long": "Apenas para seus seguidores",
+ "privacy.private.short": "Privada",
"privacy.public.long": "Publicar em todos os feeds",
- "privacy.public.short": "Público",
- "privacy.unlisted.long": "Não publicar nos feeds públicos",
- "privacy.unlisted.short": "Não listar",
+ "privacy.public.short": "Pública",
+ "privacy.unlisted.long": "Não publicar em feeds públicos",
+ "privacy.unlisted.short": "Não listada",
"reply_indicator.cancel": "Cancelar",
"report.placeholder": "Comentários adicionais",
"report.submit": "Enviar",
"report.target": "Denunciar",
"search.placeholder": "Pesquisar",
"search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
- "standalone.public_title": "A look inside...",
- "status.cannot_reblog": "This post cannot be boosted",
+ "standalone.public_title": "Dê uma espiada...",
+ "status.cannot_reblog": "Esta postagem não pode ser compartilhada",
"status.delete": "Eliminar",
- "status.embed": "Embed",
+ "status.embed": "Incorporar",
"status.favourite": "Adicionar aos favoritos",
"status.load_more": "Carregar mais",
- "status.media_hidden": "Media escondida",
+ "status.media_hidden": "Mídia escondida",
"status.mention": "Mencionar @{name}",
- "status.mute_conversation": "Mute conversation",
+ "status.mute_conversation": "Silenciar conversa",
"status.open": "Expandir",
- "status.pin": "Pin on profile",
- "status.reblog": "Partilhar",
- "status.reblogged_by": "{name} partilhou",
+ "status.pin": "Fixar no perfil",
+ "status.reblog": "Compartilhar",
+ "status.reblogged_by": "{name} compartilhou",
"status.reply": "Responder",
- "status.replyAll": "Reply to thread",
- "status.report": "Denúnciar @{name}",
+ "status.replyAll": "Responder à sequência",
+ "status.report": "Denunciar @{name}",
"status.sensitive_toggle": "Clique para ver",
"status.sensitive_warning": "Conteúdo sensível",
- "status.share": "Share",
+ "status.share": "Compartilhar",
"status.show_less": "Mostrar menos",
"status.show_more": "Mostrar mais",
- "status.unmute_conversation": "Unmute conversation",
- "status.unpin": "Unpin from profile",
+ "status.unmute_conversation": "Desativar silêncio desta conversa",
+ "status.unpin": "Desafixar do perfil",
"tabs_bar.compose": "Criar",
"tabs_bar.federated_timeline": "Global",
- "tabs_bar.home": "Home",
+ "tabs_bar.home": "Página inicial",
"tabs_bar.local_timeline": "Local",
"tabs_bar.notifications": "Notificações",
"upload_area.title": "Arraste e solte para enviar",
- "upload_button.label": "Adicionar media",
+ "upload_button.label": "Adicionar mídia",
"upload_form.undo": "Anular",
- "upload_progress.label": "A gravar...",
+ "upload_progress.label": "Salvando...",
+ "video.close": "Fechar vídeo",
+ "video.exit_fullscreen": "Sair da tela cheia",
+ "video.expand": "Expandir vídeo",
+ "video.fullscreen": "Tela cheia",
+ "video.hide": "Esconder vídeo",
+ "video.mute": "Silenciar vídeo",
+ "video.pause": "Parar",
+ "video.play": "Reproduzir",
+ "video.unmute": "Retirar silêncio",
"video_player.expand": "Expandir vídeo",
"video_player.toggle_sound": "Ligar/Desligar som",
"video_player.toggle_visible": "Ligar/Desligar vídeo",
diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json
index f9e6864112..782aaf1143 100644
--- a/app/javascript/mastodon/locales/pt.json
+++ b/app/javascript/mastodon/locales/pt.json
@@ -33,6 +33,7 @@
"column.home": "Home",
"column.mutes": "Utilizadores silenciados",
"column.notifications": "Notificações",
+ "column.pins": "Pinned toot",
"column.public": "Global",
"column_back_button.label": "Voltar",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
"compose_form.placeholder": "Em que estás a pensar?",
- "compose_form.privacy_disclaimer": "O teu conteúdo privado vai ser partilhado com os utilizadores do {domains}. Confias {domainsCount, plural, one {neste servidor} other {nestes servidores}}? A privacidade só funciona em instâncias do Mastodon. Se {domains} {domainsCount, plural, one {não é uma instância} other {não são instâncias}}, não existem indicadores da privacidade da tua partilha, e podem ser partilhados com outros.",
"compose_form.publish": "Publicar",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Marcar media como conteúdo sensível",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
"emoji_button.label": "Inserir Emoji",
"emoji_button.nature": "Nature",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objects",
"emoji_button.people": "People",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Search...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbols",
"emoji_button.travel": "Travel & Places",
"empty_column.community": "Ainda não existem conteúdo local para mostrar!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Mais informações",
"navigation_bar.logout": "Sair",
"navigation_bar.mutes": "Utilizadores silenciados",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Preferências",
"navigation_bar.public_timeline": "Global",
"notification.favourite": "{name} adicionou o teu post aos favoritos",
@@ -193,6 +198,15 @@
"upload_button.label": "Adicionar media",
"upload_form.undo": "Anular",
"upload_progress.label": "A gravar...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Expandir vídeo",
"video_player.toggle_sound": "Ligar/Desligar som",
"video_player.toggle_visible": "Ligar/Desligar vídeo",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 0f78f4b174..6f39d098c2 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -33,6 +33,7 @@
"column.home": "Главная",
"column.mutes": "Список глушения",
"column.notifications": "Уведомления",
+ "column.pins": "Pinned toot",
"column.public": "Глобальная лента",
"column_back_button.label": "Назад",
"column_header.hide_settings": "Скрыть настройки",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Ваш аккаунт не {locked}. Любой человек может подписаться на Вас и просматривать посты для подписчиков.",
"compose_form.lock_disclaimer.lock": "закрыт",
"compose_form.placeholder": "О чем Вы думаете?",
- "compose_form.privacy_disclaimer": "Ваш приватный статус будет доставлен упомянутым пользователям на доменах {domains}. Доверяете ли вы {domainsCount, plural, one {этому серверу} other {этим серверам}}? Приватность постов работает только на узлах Mastodon. Если {domains} {domainsCount, plural, one {не является узлом Mastodon} other {не являются узлами Mastodon}}, приватность поста не будет указана, и он может оказаться продвинут или иным образом показан не обозначенным Вами пользователям.",
"compose_form.publish": "Трубить",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Отметить как чувствительный контент",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Занятия",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Флаги",
"emoji_button.food": "Еда и напитки",
"emoji_button.label": "Вставить эмодзи",
"emoji_button.nature": "Природа",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Предметы",
"emoji_button.people": "Люди",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Найти...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Символы",
"emoji_button.travel": "Путешествия",
"empty_column.community": "Локальная лента пуста. Напишите что-нибудь, чтобы разогреть народ!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Об узле",
"navigation_bar.logout": "Выйти",
"navigation_bar.mutes": "Список глушения",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Опции",
"navigation_bar.public_timeline": "Глобальная лента",
"notification.favourite": "{name} понравился Ваш статус",
@@ -193,6 +198,15 @@
"upload_button.label": "Добавить медиаконтент",
"upload_form.undo": "Отменить",
"upload_progress.label": "Загрузка...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Развернуть видео",
"video_player.toggle_sound": "Вкл./выкл. звук",
"video_player.toggle_visible": "Показать/скрыть",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 069fdf7c36..ecc7a00db7 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -33,6 +33,7 @@
"column.home": "Home",
"column.mutes": "Muted users",
"column.notifications": "Notifications",
+ "column.pins": "Pinned toot",
"column.public": "Federated timeline",
"column_back_button.label": "Back",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
"compose_form.placeholder": "What is on your mind?",
- "compose_form.privacy_disclaimer": "Your post will be delivered to mentioned users on {domains}. Do you trust {domainsCount, plural, one {that server} other {those servers}}? Post privacy only works on Mastodon instances. If {domains} {domainsCount, plural, one {is not a Mastodon instance} other {are not Mastodon instances}}, there will be no indication that your post is not a public post, and it may be boosted or otherwise made visible to unintended recipients.",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Mark media as sensitive",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
"emoji_button.label": "Insert emoji",
"emoji_button.nature": "Nature",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Objects",
"emoji_button.people": "People",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Search...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbols",
"emoji_button.travel": "Travel & Places",
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "About this instance",
"navigation_bar.logout": "Logout",
"navigation_bar.mutes": "Muted users",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"notification.favourite": "{name} favourited your status",
@@ -193,6 +198,15 @@
"upload_button.label": "Add media",
"upload_form.undo": "Undo",
"upload_progress.label": "Uploading...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Expand video",
"video_player.toggle_sound": "Toggle sound",
"video_player.toggle_visible": "Toggle visibility",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 8a36bd2079..b7ecd2cdb4 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -33,6 +33,7 @@
"column.home": "Anasayfa",
"column.mutes": "Susturulmuş kullanıcılar",
"column.notifications": "Bildirimler",
+ "column.pins": "Pinned toot",
"column.public": "Federe zaman tüneli",
"column_back_button.label": "Geri",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Hesabınız {locked} değil. Sadece takipçilerle paylaştığınız gönderileri görebilmek için sizi herhangi bir kullanıcı takip edebilir.",
"compose_form.lock_disclaimer.lock": "kilitli",
"compose_form.placeholder": "Ne düşünüyorsun?",
- "compose_form.privacy_disclaimer": "Gönderiniz {domains}’teki bahsettiğiniz kullanıcılara iletilecektir.{domainsCount, plural, one {bu sunucuya} other {bu sunuculara}} güveniyor musunuz? Gönderi gizliliği sadece Mastodon sunucularında çalışır. Eğer {domains} {domainsCount, plural, one {bir Mastodon sunucusu değilse} other {Mastodon sunucuları değilse}}, gönderinizin herkese açık bir gönderi olmadığına ilişkin bir gösterge bulunmayacaktır. Bu yüzden gönderiniz boost edilebilir veya istenmeyen alıcılara görünebilir.",
"compose_form.publish": "Toot",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Görseli hassas olarak işaretle",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Aktivite",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Bayraklar",
"emoji_button.food": "Yiyecek ve İçecek",
"emoji_button.label": "Emoji ekle",
"emoji_button.nature": "Doğa",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Nesneler",
"emoji_button.people": "İnsanlar",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Emoji ara...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Semboller",
"emoji_button.travel": "Seyahat ve Yerler",
"empty_column.community": "Yerel zaman tüneliniz boş. Daha fazla eğlence için herkese açık bir gönderi paylaşın.",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Genişletilmiş bilgi",
"navigation_bar.logout": "Çıkış",
"navigation_bar.mutes": "Sessize alınmış kullanıcılar",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Tercihler",
"navigation_bar.public_timeline": "Federe zaman tüneli",
"notification.favourite": "{name} senin durumunu favorilere ekledi",
@@ -193,6 +198,15 @@
"upload_button.label": "Görsel ekle",
"upload_form.undo": "Geri al",
"upload_progress.label": "Yükleniyor...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Videoyu genişlet",
"video_player.toggle_sound": "Sesi aç/kapa",
"video_player.toggle_visible": "Göster/gizle",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 1d06218e6a..45b2c2ee01 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -33,6 +33,7 @@
"column.home": "Головна",
"column.mutes": "Заглушені користувачі",
"column.notifications": "Сповіщення",
+ "column.pins": "Pinned toot",
"column.public": "Глобальна стрічка",
"column_back_button.label": "Назад",
"column_header.hide_settings": "Hide settings",
@@ -46,7 +47,6 @@
"compose_form.lock_disclaimer": "Ваш акаунт не {locked}. Кожен може підписатися на Вас та бачити Ваші приватні пости.",
"compose_form.lock_disclaimer.lock": "приватний",
"compose_form.placeholder": "Що у Вас на думці?",
- "compose_form.privacy_disclaimer": "Ваш приватний допис буде доставлено до згаданих користувачів на доменах {domains}. Ви довіряєте {domainsCount, plural, one {цьому серверу} other {цим серверам}}? Приватність постів працює тільки на інстанціях Mastodon. Якщо {domains} {domainsCount, plural, one {не є інстанцією Mastodon} other {не є інстанціями Mastodon}}, приватність поста не буде активована, та він може бути передмухнутий або іншим чином показаний не позначеним Вами користувачам.",
"compose_form.publish": "Дмухнути",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "Відмітити як непристойний зміст",
@@ -66,13 +66,17 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Заняття",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "Прапори",
"emoji_button.food": "Їжа та напої",
"emoji_button.label": "Вставити емодзі",
"emoji_button.nature": "Природа",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Предмети",
"emoji_button.people": "Люди",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "Знайти...",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "Символи",
"emoji_button.travel": "Подорожі",
"empty_column.community": "Локальна стрічка пуста. Напишіть щось, щоб розігріти народ!",
@@ -109,6 +113,7 @@
"navigation_bar.info": "Про інстанцію",
"navigation_bar.logout": "Вийти",
"navigation_bar.mutes": "Заглушені користувачі",
+ "navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Налаштування",
"navigation_bar.public_timeline": "Глобальна стрічка",
"notification.favourite": "{name} сподобався ваш допис",
@@ -193,6 +198,15 @@
"upload_button.label": "Додати медіаконтент",
"upload_form.undo": "Відмінити",
"upload_progress.label": "Завантаження...",
+ "video.close": "Close video",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound",
"video_player.expand": "Розгорнути ",
"video_player.toggle_sound": "Увімкнути/вимкнути звук",
"video_player.toggle_visible": "Показати/приховати",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 93faf88765..58e3d67803 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -1,13 +1,13 @@
{
"account.block": "屏蔽 @{name}",
- "account.block_domain": "Hide everything from {domain}",
- "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
+ "account.block_domain": "隐藏一切来自 {domain} 的嘟文",
+ "account.disclaimer_full": "下列资料不一定完整。",
"account.edit_profile": "修改个人资料",
"account.follow": "关注",
"account.followers": "关注者",
- "account.follows": "正在关注",
+ "account.follows": "正关注",
"account.follows_you": "关注你",
- "account.media": "Media",
+ "account.media": "媒体",
"account.mention": "提及 @{name}",
"account.mute": "将 @{name} 静音",
"account.posts": "嘟文",
@@ -15,40 +15,40 @@
"account.requested": "等待审批",
"account.share": "分享 @{name}的个人资料",
"account.unblock": "解除对 @{name} 的屏蔽",
- "account.unblock_domain": "解除封锁 {domain}",
+ "account.unblock_domain": "不再隐藏 {domain}",
"account.unfollow": "取消关注",
"account.unmute": "取消 @{name} 的静音",
"account.view_full_profile": "查看完整资料",
"boost_modal.combo": "如你想在下次路过时显示,请按{combo},",
"bundle_column_error.body": "载入组件出错。",
- "bundle_column_error.retry": "再次尝试",
+ "bundle_column_error.retry": "重试",
"bundle_column_error.title": "网络错误",
"bundle_modal_error.close": "关闭",
"bundle_modal_error.message": "载入组件出错。",
- "bundle_modal_error.retry": "再次尝试",
+ "bundle_modal_error.retry": "重试",
"column.blocks": "屏蔽用户",
"column.community": "本站时间轴",
- "column.favourites": "赞过的嘟文",
+ "column.favourites": "收藏过的嘟文",
"column.follow_requests": "关注请求",
"column.home": "主页",
"column.mutes": "被静音的用户",
"column.notifications": "通知",
+ "column.pins": "置顶嘟文",
"column.public": "跨站公共时间轴",
"column_back_button.label": "返回",
- "column_header.hide_settings": "Hide settings",
- "column_header.moveLeft_settings": "Move column to the left",
- "column_header.moveRight_settings": "Move column to the right",
- "column_header.pin": "Pin",
- "column_header.show_settings": "Show settings",
- "column_header.unpin": "Unpin",
+ "column_header.hide_settings": "隐藏设置",
+ "column_header.moveLeft_settings": "将栏左移",
+ "column_header.moveRight_settings": "将栏右移",
+ "column_header.pin": "固定",
+ "column_header.show_settings": "显示设置",
+ "column_header.unpin": "取下",
"column_subheading.navigation": "导航",
"column_subheading.settings": "设置",
- "compose_form.lock_disclaimer": "你的账户没 {locked}. 任何人可以通过关注你来查看只有关注者可见的嘟文.",
+ "compose_form.lock_disclaimer": "你的帐户没 {locked}. 任何人可以通过关注你来查看只有关注者可见的嘟文.",
"compose_form.lock_disclaimer.lock": "被保护",
"compose_form.placeholder": "在想啥?",
- "compose_form.privacy_disclaimer": "你的私人嘟文,将被发送至你所提及的 {domains} 用户。你是否信任{domainsCount, plural, one {这个网站} other {这些网站}}?请留意,嘟文隐私设置只适用于各 Mastodon 服务器实例,如果 {domains} {domainsCount, plural, one {不是 Mastodon 服务器实例} other {之中有些不是 Mastodon 服务器实例}},对方将无法收到这篇嘟文的隐私设置,然后可能被转嘟给不能预知的用户阅读。",
"compose_form.publish": "嘟嘟",
- "compose_form.publish_loud": "{publish}!",
+ "compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "将媒体文件标示为“敏感内容”",
"compose_form.spoiler": "将部分文本藏于警告消息之后",
"compose_form.spoiler_placeholder": "敏感内容的警告消息",
@@ -57,28 +57,32 @@
"confirmations.block.message": "想好了,真的要屏蔽 {name}?",
"confirmations.delete.confirm": "删除",
"confirmations.delete.message": "想好了,真的要删除这条嘟文?",
- "confirmations.domain_block.confirm": "Hide entire domain",
- "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.",
+ "confirmations.domain_block.confirm": "隐藏整个网站",
+ "confirmations.domain_block.message": "你真的真的确定要隐藏整个 {domain} ?多数情况下,封锁或静音几个特定目标就好。",
"confirmations.mute.confirm": "静音",
"confirmations.mute.message": "想好了,真的要静音 {name}?",
"confirmations.unfollow.confirm": "取消关注",
"confirmations.unfollow.message": "确定要取消关注 {name}吗?",
- "embed.instructions": "Embed this status on your website by copying the code below.",
- "embed.preview": "Here is what it will look like:",
+ "embed.instructions": "要内嵌此嘟文,请将以下代码贴进你的网站。",
+ "embed.preview": "到时大概长这样:",
"emoji_button.activity": "活动",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "旗帜",
"emoji_button.food": "食物和饮料",
"emoji_button.label": "加入表情符号",
"emoji_button.nature": "自然",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "物体",
"emoji_button.people": "人物",
- "emoji_button.search": "搜索...",
+ "emoji_button.recent": "Frequently used",
+ "emoji_button.search": "搜索…",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "符号",
"emoji_button.travel": "旅途和地点",
- "empty_column.community": "本站时间轴暂时未有内容,快贴文来抢头香啊!",
+ "empty_column.community": "本站时间轴暂时未有内容,快嘟几个来抢头香啊!",
"empty_column.hashtag": "这个标签暂时未有内容。",
"empty_column.home": "你还没有关注任何用户。快看看{public},向其他用户搭讪吧。",
- "empty_column.home.inactivity": "Your home feed is empty. If you have been inactive for a while, it will be regenerated for you soon.",
+ "empty_column.home.inactivity": "你的主页暂时没有内容。也许你太久没有来了?如果是这样,文章会慢慢出来,请稍后再看。",
"empty_column.home.public_timeline": "公共时间轴",
"empty_column.notifications": "你没有任何通知纪录,快向其他用户搭讪吧。",
"empty_column.public": "跨站公共时间轴暂时没有内容!快写一些公共的嘟文,或者关注另一些服务器实例的用户吧!你和本站、友站的交流,将决定这里出现的内容。",
@@ -96,33 +100,34 @@
"home.column_settings.show_replies": "显示回应嘟文",
"home.settings": "字段设置",
"lightbox.close": "关闭",
- "lightbox.next": "Next",
- "lightbox.previous": "Previous",
+ "lightbox.next": "下一步",
+ "lightbox.previous": "上一步",
"loading_indicator.label": "加载中……",
"media_gallery.toggle_visible": "打开或关上",
"missing_indicator.label": "找不到内容",
"navigation_bar.blocks": "被屏蔽的用户",
"navigation_bar.community_timeline": "本站时间轴",
"navigation_bar.edit_profile": "修改个人资料",
- "navigation_bar.favourites": "赞的内容",
+ "navigation_bar.favourites": "收藏的内容",
"navigation_bar.follow_requests": "关注请求",
"navigation_bar.info": "关于本站",
"navigation_bar.logout": "注销",
"navigation_bar.mutes": "被静音的用户",
+ "navigation_bar.pins": "置顶嘟文",
"navigation_bar.preferences": "首选项",
"navigation_bar.public_timeline": "跨站公共时间轴",
- "notification.favourite": "{name} 赞了你的嘟文",
+ "notification.favourite": "{name} 收藏了你的嘟文",
"notification.follow": "{name} 开始关注你",
"notification.mention": "{name} 提及你",
"notification.reblog": "{name} 转嘟了你的嘟文",
"notifications.clear": "清空通知纪录",
"notifications.clear_confirmation": "你确定要清空通知纪录吗?",
"notifications.column_settings.alert": "显示桌面通知",
- "notifications.column_settings.favourite": "你的嘟文被赞:",
+ "notifications.column_settings.favourite": "你的嘟文被收藏:",
"notifications.column_settings.follow": "关注你:",
"notifications.column_settings.mention": "提及你:",
- "notifications.column_settings.push": "Push notifications",
- "notifications.column_settings.push_meta": "This device",
+ "notifications.column_settings.push": "推送通知",
+ "notifications.column_settings.push_meta": "此设备",
"notifications.column_settings.reblog": "你的嘟文被转嘟:",
"notifications.column_settings.show": "在通知栏显示",
"notifications.column_settings.sound": "播放音效",
@@ -132,18 +137,18 @@
"onboarding.page_four.home": "你的主时间轴上是你关注的用户的嘟文.",
"onboarding.page_four.notifications": "如果你和他人产生了互动,便会出现在通知列上啦~",
"onboarding.page_one.federation": "Mastodon是由一系列独立的服务器共同打造的强大的社交网络,我们将这些独立但又相互连接的服务器叫做服务器实例。",
- "onboarding.page_one.handle": "你在 {domain}, {handle} 就是你的完整账户名称。",
+ "onboarding.page_one.handle": "你在 {domain}, {handle} 就是你的完整帐户名称。",
"onboarding.page_one.welcome": "欢迎来到 Mastodon!",
"onboarding.page_six.admin": "{admin} 是你所在服务器实例的管理员.",
- "onboarding.page_six.almost_done": "快完成了...",
+ "onboarding.page_six.almost_done": "差不多了…",
"onboarding.page_six.appetoot": "嗷呜~",
"onboarding.page_six.apps_available": "也有适用于 iOS, Android 和其它平台的 {apps} 咯~",
"onboarding.page_six.github": "Mastodon 是自由的开放源代码软件。欢迎来 {github} 报告问题,提交功能请求,或者贡献代码 :-)",
"onboarding.page_six.guidelines": "社区指南",
- "onboarding.page_six.read_guidelines": "别忘了看看 {domain} 的 {guidelines}!",
+ "onboarding.page_six.read_guidelines": "别忘了看看 {domain} 的 {guidelines}!",
"onboarding.page_six.various_app": "移动应用程序",
"onboarding.page_three.profile": "修改你的个人资料,比如头像、简介、和昵称等等。在那还可以找到其它首选项。",
- "onboarding.page_three.search": "用搜索来找人和标签吧,比如 {illustration} 或者 {introductions}。想找其它服务器实例上的人,用完整账户名称(用户名@域名)啦。",
+ "onboarding.page_three.search": "用搜索来找人和标签吧,比如 {illustration} 或者 {introductions}。想找其它服务器实例上的人,用完整帐户名称(用户名@域名)啦。",
"onboarding.page_two.compose": "从这里开始嘟!上面的按钮提供了上传图片,修改隐私设置和提示敏感内容等多种功能。.",
"onboarding.skip": "好啦好啦我知道啦",
"privacy.change": "调整隐私设置",
@@ -161,29 +166,29 @@
"report.target": "Reporting",
"search.placeholder": "搜索",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
- "standalone.public_title": "A look inside...",
+ "standalone.public_title": "大家都在干啥?",
"status.cannot_reblog": "没法转嘟这条嘟文啦……",
"status.delete": "删除",
- "status.embed": "Embed",
- "status.favourite": "赞",
+ "status.embed": "嵌入",
+ "status.favourite": "收藏",
"status.load_more": "加载更多",
"status.media_hidden": "隐藏媒体内容",
"status.mention": "提及 @{name}",
- "status.mute_conversation": "Mute conversation",
+ "status.mute_conversation": "静音对话",
"status.open": "展开嘟文",
- "status.pin": "Pin on profile",
+ "status.pin": "置顶到资料",
"status.reblog": "转嘟",
"status.reblogged_by": "{name} 转嘟",
"status.reply": "回应",
- "status.replyAll": "Reply to thread",
+ "status.replyAll": "回应整串",
"status.report": "举报 @{name}",
"status.sensitive_toggle": "点击显示",
"status.sensitive_warning": "敏感内容",
"status.share": "Share",
"status.show_less": "减少显示",
"status.show_more": "显示更多",
- "status.unmute_conversation": "Unmute conversation",
- "status.unpin": "Unpin from profile",
+ "status.unmute_conversation": "解禁对话",
+ "status.unpin": "解除置顶",
"tabs_bar.compose": "撰写",
"tabs_bar.federated_timeline": "跨站",
"tabs_bar.home": "主页",
@@ -193,6 +198,15 @@
"upload_button.label": "上传媒体文件",
"upload_form.undo": "还原",
"upload_progress.label": "上传中……",
+ "video.close": "关闭影片",
+ "video.exit_fullscreen": "退出全屏",
+ "video.expand": "展开影片",
+ "video.fullscreen": "全屏",
+ "video.hide": "隐藏影片",
+ "video.mute": "静音",
+ "video.pause": "暂停",
+ "video.play": "播放",
+ "video.unmute": "解除静音",
"video_player.expand": "展开影片",
"video_player.toggle_sound": "开关音效",
"video_player.toggle_visible": "打开或关上",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index d689cd5aef..610aa6dafa 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -1,54 +1,54 @@
{
"account.block": "封鎖 @{name}",
- "account.block_domain": "Hide everything from {domain}",
- "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
+ "account.block_domain": "隱藏來自 {domain} 的一切文章",
+ "account.disclaimer_full": "下列資料不一定完整。",
"account.edit_profile": "修改個人資料",
"account.follow": "關注",
"account.followers": "關注的人",
- "account.follows": "正在關注",
+ "account.follows": "正關注",
"account.follows_you": "關注你",
- "account.media": "Media",
+ "account.media": "媒體",
"account.mention": "提及 @{name}",
"account.mute": "將 @{name} 靜音",
"account.posts": "文章",
"account.report": "舉報 @{name}",
"account.requested": "等候審批",
- "account.share": "Share @{name}'s profile",
+ "account.share": "分享 @{name} 的個人資料",
"account.unblock": "解除對 @{name} 的封鎖",
- "account.unblock_domain": "Unhide {domain}",
+ "account.unblock_domain": "不再隱藏 {domain}",
"account.unfollow": "取消關注",
"account.unmute": "取消 @{name} 的靜音",
- "account.view_full_profile": "View full profile",
+ "account.view_full_profile": "查看完整資料",
"boost_modal.combo": "如你想在下次路過這顯示,請按{combo},",
- "bundle_column_error.body": "Something went wrong while loading this component.",
- "bundle_column_error.retry": "Try again",
- "bundle_column_error.title": "Network error",
- "bundle_modal_error.close": "Close",
- "bundle_modal_error.message": "Something went wrong while loading this component.",
- "bundle_modal_error.retry": "Try again",
+ "bundle_column_error.body": "加載本組件出錯。",
+ "bundle_column_error.retry": "重試",
+ "bundle_column_error.title": "網絡錯誤",
+ "bundle_modal_error.close": "關閉",
+ "bundle_modal_error.message": "加載本組件出錯。",
+ "bundle_modal_error.retry": "重試",
"column.blocks": "封鎖用戶",
"column.community": "本站時間軸",
- "column.favourites": "喜歡的文章",
+ "column.favourites": "最愛的文章",
"column.follow_requests": "關注請求",
"column.home": "主頁",
"column.mutes": "靜音名單",
"column.notifications": "通知",
+ "column.pins": "置頂文章",
"column.public": "跨站時間軸",
"column_back_button.label": "返回",
- "column_header.hide_settings": "Hide settings",
- "column_header.moveLeft_settings": "Move column to the left",
- "column_header.moveRight_settings": "Move column to the right",
- "column_header.pin": "Pin",
- "column_header.show_settings": "Show settings",
- "column_header.unpin": "Unpin",
+ "column_header.hide_settings": "隱藏設定",
+ "column_header.moveLeft_settings": "將欄左移",
+ "column_header.moveRight_settings": "將欄右移",
+ "column_header.pin": "固定",
+ "column_header.show_settings": "顯示設定",
+ "column_header.unpin": "取下",
"column_subheading.navigation": "瀏覽",
"column_subheading.settings": "設定",
"compose_form.lock_disclaimer": "你的用戶狀態為「{locked}」,任何人都能立即關注你,然後看到「只有關注者能看」的文章。",
"compose_form.lock_disclaimer.lock": "公共",
"compose_form.placeholder": "你在想甚麼?",
- "compose_form.privacy_disclaimer": "你的私人文章,將被遞送至 {domains}。你是否信任{domainsCount, plural, one {這個網站} other {這些網站}}?請留意,文章私隱設定只適用於 Mastodon 服務站,如果 {domains} {domainsCount, plural, one {不是 Mastodon 服務站} other {之中有些不是 Mastodon 服務站}},對方將可無視文章的私隱設定,轉推文章給其他用戶閱讀。",
"compose_form.publish": "發文",
- "compose_form.publish_loud": "{publish}!",
+ "compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "將媒體檔案標示為「敏感內容」",
"compose_form.spoiler": "將部份文字藏於警告訊息之後",
"compose_form.spoiler_placeholder": "敏感警告訊息",
@@ -57,25 +57,29 @@
"confirmations.block.message": "你確定要封鎖{name}嗎?",
"confirmations.delete.confirm": "刪除",
"confirmations.delete.message": "你確定要刪除{name}嗎?",
- "confirmations.domain_block.confirm": "Hide entire domain",
- "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.",
+ "confirmations.domain_block.confirm": "隱藏整個網站",
+ "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或靜音幾個特定目標就好。",
"confirmations.mute.confirm": "靜音",
"confirmations.mute.message": "你確定要將{name}靜音嗎?",
- "confirmations.unfollow.confirm": "Unfollow",
- "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
- "embed.instructions": "Embed this status on your website by copying the code below.",
- "embed.preview": "Here is what it will look like:",
+ "confirmations.unfollow.confirm": "取消關注",
+ "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?",
+ "embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。",
+ "embed.preview": "看上去會是這樣:",
"emoji_button.activity": "活動",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "旗幟",
"emoji_button.food": "飲飲食食",
"emoji_button.label": "加入表情符號",
"emoji_button.nature": "自然",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "物品",
"emoji_button.people": "人物",
+ "emoji_button.recent": "Frequently used",
"emoji_button.search": "搜尋…",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "符號",
"emoji_button.travel": "旅遊景物",
- "empty_column.community": "本站時間軸暫時未有內容,快貼文來搶頭香啊!",
+ "empty_column.community": "本站時間軸暫時未有內容,快文章來搶頭香啊!",
"empty_column.hashtag": "這個標籤暫時未有內容。",
"empty_column.home": "你還沒有關注任何用戶。快看看{public},向其他用戶搭訕吧。",
"empty_column.home.inactivity": "你的主頁暫時沒有內容。也許你太久沒有來?如果是這樣,文章會慢慢出來,請稍後再看。",
@@ -96,34 +100,35 @@
"home.column_settings.show_replies": "顯示回應文章",
"home.settings": "欄位設定",
"lightbox.close": "關閉",
- "lightbox.next": "Next",
- "lightbox.previous": "Previous",
+ "lightbox.next": "繼續",
+ "lightbox.previous": "回退",
"loading_indicator.label": "載入中...",
"media_gallery.toggle_visible": "打開或關上",
"missing_indicator.label": "找不到內容",
"navigation_bar.blocks": "被你封鎖的用戶",
"navigation_bar.community_timeline": "本站時間軸",
"navigation_bar.edit_profile": "修改個人資料",
- "navigation_bar.favourites": "喜歡的內容",
+ "navigation_bar.favourites": "最愛的內容",
"navigation_bar.follow_requests": "關注請求",
"navigation_bar.info": "關於本服務站",
"navigation_bar.logout": "登出",
"navigation_bar.mutes": "被你靜音的用戶",
+ "navigation_bar.pins": "置頂文章",
"navigation_bar.preferences": "偏好設定",
"navigation_bar.public_timeline": "跨站時間軸",
- "notification.favourite": "{name} 喜歡你的文章",
+ "notification.favourite": "{name} 收藏了你的文章",
"notification.follow": "{name} 開始關注你",
"notification.mention": "{name} 提及你",
"notification.reblog": "{name} 轉推你的文章",
"notifications.clear": "清空通知紀錄",
"notifications.clear_confirmation": "你確定要清空通知紀錄嗎?",
"notifications.column_settings.alert": "顯示桌面通知",
- "notifications.column_settings.favourite": "喜歡你的文章:",
- "notifications.column_settings.follow": "關注你:",
- "notifications.column_settings.mention": "提及你:",
- "notifications.column_settings.push": "Push notifications",
- "notifications.column_settings.push_meta": "This device",
- "notifications.column_settings.reblog": "轉推你的文章:",
+ "notifications.column_settings.favourite": "收藏了你的文章:",
+ "notifications.column_settings.follow": "關注你:",
+ "notifications.column_settings.mention": "提及你:",
+ "notifications.column_settings.push": "推送通知",
+ "notifications.column_settings.push_meta": "這臺設備",
+ "notifications.column_settings.reblog": "轉推你的文章:",
"notifications.column_settings.show": "在通知欄顯示",
"notifications.column_settings.sound": "播放音效",
"onboarding.done": "開始使用",
@@ -161,17 +166,17 @@
"report.target": "舉報",
"search.placeholder": "搜尋",
"search_results.total": "{count, number} 項結果",
- "standalone.public_title": "A look inside...",
+ "standalone.public_title": "站點一瞥…",
"status.cannot_reblog": "這篇文章無法被轉推",
"status.delete": "刪除",
- "status.embed": "Embed",
- "status.favourite": "喜歡",
+ "status.embed": "鑲嵌",
+ "status.favourite": "收藏",
"status.load_more": "載入更多",
"status.media_hidden": "隱藏媒體內容",
"status.mention": "提及 @{name}",
- "status.mute_conversation": "Mute conversation",
+ "status.mute_conversation": "靜音對話",
"status.open": "展開文章",
- "status.pin": "Pin on profile",
+ "status.pin": "置頂到資料頁",
"status.reblog": "轉推",
"status.reblogged_by": "{name} 轉推",
"status.reply": "回應",
@@ -182,8 +187,8 @@
"status.share": "Share",
"status.show_less": "減少顯示",
"status.show_more": "顯示更多",
- "status.unmute_conversation": "Unmute conversation",
- "status.unpin": "Unpin from profile",
+ "status.unmute_conversation": "解禁對話",
+ "status.unpin": "解除置頂",
"tabs_bar.compose": "撰寫",
"tabs_bar.federated_timeline": "跨站",
"tabs_bar.home": "主頁",
@@ -193,6 +198,15 @@
"upload_button.label": "上載媒體檔案",
"upload_form.undo": "還原",
"upload_progress.label": "上載中……",
+ "video.close": "關閉影片",
+ "video.exit_fullscreen": "退出全熒幕",
+ "video.expand": "展開影片",
+ "video.fullscreen": "全熒幕",
+ "video.hide": "隱藏影片",
+ "video.mute": "靜音",
+ "video.pause": "暫停",
+ "video.play": "播放",
+ "video.unmute": "解除靜音",
"video_player.expand": "展開影片",
"video_player.toggle_sound": "開關音效",
"video_player.toggle_visible": "打開或關上",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index dcb9d7f3c9..ad2f1a05ab 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -1,11 +1,11 @@
{
"account.block": "封鎖 @{name}",
- "account.block_domain": "隱藏來自 {domain} 的一切",
- "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
- "account.edit_profile": "編輯用戶資訊",
+ "account.block_domain": "隱藏來自 {domain} 的一切貼文",
+ "account.disclaimer_full": "下列資料不一定完整。",
+ "account.edit_profile": "編輯用者資訊",
"account.follow": "關注",
"account.followers": "專注者",
- "account.follows": "正在關注",
+ "account.follows": "正關注",
"account.follows_you": "關注你",
"account.media": "媒體",
"account.mention": "提到 @{name}",
@@ -13,19 +13,19 @@
"account.posts": "貼文",
"account.report": "檢舉 @{name}",
"account.requested": "正在等待許可",
- "account.share": "Share @{name}'s profile",
+ "account.share": "分享 @{name} 的用者資訊",
"account.unblock": "取消封鎖 @{name}",
"account.unblock_domain": "不再隱藏 {domain}",
"account.unfollow": "取消關注",
"account.unmute": "不再消音 @{name}",
- "account.view_full_profile": "View full profile",
+ "account.view_full_profile": "查看完整資訊",
"boost_modal.combo": "下次你可以按 {combo} 來跳過",
- "bundle_column_error.body": "Something went wrong while loading this component.",
- "bundle_column_error.retry": "Try again",
- "bundle_column_error.title": "Network error",
- "bundle_modal_error.close": "Close",
- "bundle_modal_error.message": "Something went wrong while loading this component.",
- "bundle_modal_error.retry": "Try again",
+ "bundle_column_error.body": "加載本組件出錯。",
+ "bundle_column_error.retry": "重試",
+ "bundle_column_error.title": "網路錯誤",
+ "bundle_modal_error.close": "關閉",
+ "bundle_modal_error.message": "加載本組件出錯。",
+ "bundle_modal_error.retry": "重試",
"column.blocks": "封鎖的使用者",
"column.community": "本地時間軸",
"column.favourites": "最愛",
@@ -33,21 +33,21 @@
"column.home": "家",
"column.mutes": "消音的使用者",
"column.notifications": "通知",
+ "column.pins": "置頂貼文",
"column.public": "聯盟時間軸",
"column_back_button.label": "上一頁",
- "column_header.hide_settings": "Hide settings",
- "column_header.moveLeft_settings": "Move column to the left",
- "column_header.moveRight_settings": "Move column to the right",
- "column_header.pin": "Pin",
- "column_header.show_settings": "Show settings",
- "column_header.unpin": "Unpin",
+ "column_header.hide_settings": "隱藏設定",
+ "column_header.moveLeft_settings": "將欄左移",
+ "column_header.moveRight_settings": "將欄右移",
+ "column_header.pin": "固定",
+ "column_header.show_settings": "顯示設定",
+ "column_header.unpin": "取下",
"column_subheading.navigation": "瀏覽",
"column_subheading.settings": "設定",
"compose_form.lock_disclaimer": "你的帳號沒有{locked}。任何人都可以關注你,看到發給關注者的貼文。",
"compose_form.lock_disclaimer.lock": "上鎖",
"compose_form.placeholder": "在想些什麼?",
- "compose_form.privacy_disclaimer": "你的貼文會被傳到 {domains} 上被提到的使用者。你信任 {domainsCount, plural, one {這個伺服器} other {這些伺服器}}嗎?貼文的隱私設定只會在 Mastodon 副本上生效。如果 {domains} {domainsCount, plural, one {不是一個 Mastodon 副本} other {都不是 Mastodon 副本}},就不會被標記為非公開貼文,而且可能會被轉推或是讓不預期的人看見。",
- "compose_form.publish": "推",
+ "compose_form.publish": "貼掉",
"compose_form.publish_loud": "{publish}!",
"compose_form.sensitive": "將此媒體標為敏感",
"compose_form.spoiler": "將訊息隱藏在警告訊息之後",
@@ -58,26 +58,30 @@
"confirmations.delete.confirm": "刪除",
"confirmations.delete.message": "你確定要刪除這個狀態?",
"confirmations.domain_block.confirm": "隱藏整個網域",
- "confirmations.domain_block.message": "你真的真的確定要封鎖整個 {domain} ?多數情況下,比較推薦封鎖或消音幾個特定目標就好。",
+ "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或消音幾個特定目標就好。",
"confirmations.mute.confirm": "消音",
"confirmations.mute.message": "你確定要消音 {name} ?",
- "confirmations.unfollow.confirm": "Unfollow",
- "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
- "embed.instructions": "Embed this status on your website by copying the code below.",
- "embed.preview": "Here is what it will look like:",
+ "confirmations.unfollow.confirm": "取消關注",
+ "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?",
+ "embed.instructions": "要內嵌此貼文,請將以下代碼貼進你的網站。",
+ "embed.preview": "看上去會變成這樣:",
"emoji_button.activity": "活動",
+ "emoji_button.custom": "Custom",
"emoji_button.flags": "旗幟",
"emoji_button.food": "食物與飲料",
"emoji_button.label": "插入表情符號",
"emoji_button.nature": "自然",
+ "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "物件",
"emoji_button.people": "人",
- "emoji_button.search": "搜尋...",
+ "emoji_button.recent": "Frequently used",
+ "emoji_button.search": "搜尋…",
+ "emoji_button.search_results": "Search results",
"emoji_button.symbols": "符號",
"emoji_button.travel": "旅遊與地點",
"empty_column.community": "本地時間軸是空的。公開寫點什麼吧!",
"empty_column.hashtag": "這個主題標籤下什麼都沒有。",
- "empty_column.home": "你還沒關注任何人。造訪{public}或利用搜尋功能找到其他用戶。",
+ "empty_column.home": "你還沒關注任何人。造訪{public}或利用搜尋功能找到其他用者。",
"empty_column.home.inactivity": "你家的訊息摘要是空的。如果你很久沒活動了,很快它就會重新產生。",
"empty_column.home.public_timeline": "公開時間軸",
"empty_column.notifications": "還沒有任何通知。和別的使用者互動來開始對話。",
@@ -96,22 +100,23 @@
"home.column_settings.show_replies": "顯示回應",
"home.settings": "欄位設定",
"lightbox.close": "關閉",
- "lightbox.next": "Next",
- "lightbox.previous": "Previous",
+ "lightbox.next": "繼續",
+ "lightbox.previous": "回退",
"loading_indicator.label": "讀取中...",
"media_gallery.toggle_visible": "切換可見性",
"missing_indicator.label": "找不到",
"navigation_bar.blocks": "封鎖的使用者",
"navigation_bar.community_timeline": "本地時間軸",
- "navigation_bar.edit_profile": "編輯用戶資訊",
+ "navigation_bar.edit_profile": "編輯用者資訊",
"navigation_bar.favourites": "最愛",
"navigation_bar.follow_requests": "關注請求",
"navigation_bar.info": "關於本站",
"navigation_bar.logout": "登出",
"navigation_bar.mutes": "消音的使用者",
+ "navigation_bar.pins": "置頂貼文",
"navigation_bar.preferences": "偏好設定",
"navigation_bar.public_timeline": "聯盟時間軸",
- "notification.favourite": "{name}喜歡你的狀態",
+ "notification.favourite": "{name}收藏了你的狀態",
"notification.follow": "{name}關注了你",
"notification.mention": "{name}提到了你",
"notification.reblog": "{name}推了你的狀態",
@@ -121,8 +126,8 @@
"notifications.column_settings.favourite": "最愛:",
"notifications.column_settings.follow": "新的關注者:",
"notifications.column_settings.mention": "提到:",
- "notifications.column_settings.push": "Push notifications",
- "notifications.column_settings.push_meta": "This device",
+ "notifications.column_settings.push": "推送通知",
+ "notifications.column_settings.push_meta": "這臺設備",
"notifications.column_settings.reblog": "轉推:",
"notifications.column_settings.show": "顯示在欄位中",
"notifications.column_settings.sound": "播放音效",
@@ -135,8 +140,8 @@
"onboarding.page_one.handle": "你在 {domain} 上,所以你的帳號全名是 {handle}",
"onboarding.page_one.welcome": "歡迎來到 Mastodon !",
"onboarding.page_six.admin": "你的副本的管理員是 {admin} 。",
- "onboarding.page_six.almost_done": "快好了...",
- "onboarding.page_six.appetoot": "推口大開!",
+ "onboarding.page_six.almost_done": "快好了…",
+ "onboarding.page_six.appetoot": "貼口大開!",
"onboarding.page_six.apps_available": "在 iOS 、 Android 和其他平台上有這些 {apps} 可以用。",
"onboarding.page_six.github": "Mastodon 是自由的開源軟體。你可以在 {github} 上回報臭蟲、請求新功能或是做出貢獻。",
"onboarding.page_six.guidelines": "社群指南",
@@ -161,17 +166,17 @@
"report.target": "通報中",
"search.placeholder": "搜尋",
"search_results.total": "{count, number} 項結果",
- "standalone.public_title": "A look inside...",
+ "standalone.public_title": "站點一瞥…",
"status.cannot_reblog": "此貼文無法轉推",
"status.delete": "刪除",
"status.embed": "Embed",
- "status.favourite": "喜愛",
+ "status.favourite": "收藏",
"status.load_more": "載入更多",
"status.media_hidden": "媒體已隱藏",
"status.mention": "提到 @{name}",
"status.mute_conversation": "消音對話",
"status.open": "展開這個狀態",
- "status.pin": "Pin on profile",
+ "status.pin": "置頂到個人資訊頁",
"status.reblog": "轉推",
"status.reblogged_by": "{name} 轉推了",
"status.reply": "回應",
@@ -183,7 +188,7 @@
"status.show_less": "看少點",
"status.show_more": "看更多",
"status.unmute_conversation": "不消音對話",
- "status.unpin": "Unpin from profile",
+ "status.unpin": "解除置頂",
"tabs_bar.compose": "編輯",
"tabs_bar.federated_timeline": "聯盟",
"tabs_bar.home": "家",
@@ -193,6 +198,15 @@
"upload_button.label": "增加媒體",
"upload_form.undo": "復原",
"upload_progress.label": "上傳中...",
+ "video.close": "關閉影片",
+ "video.exit_fullscreen": "退出全熒幕",
+ "video.expand": "展開影片",
+ "video.fullscreen": "全熒幕",
+ "video.hide": "隱藏影片",
+ "video.mute": "消音",
+ "video.pause": "暫停",
+ "video.play": "播放",
+ "video.unmute": "解除消音",
"video_player.expand": "展開影片",
"video_player.toggle_sound": "切換音效",
"video_player.toggle_visible": "切換可見性",
diff --git a/app/javascript/mastodon/reducers/accounts.js b/app/javascript/mastodon/reducers/accounts.js
index 6442d13bef..5391a93ae0 100644
--- a/app/javascript/mastodon/reducers/accounts.js
+++ b/app/javascript/mastodon/reducers/accounts.js
@@ -110,7 +110,7 @@ export default function accounts(state = initialState, action) {
case BLOCKS_EXPAND_SUCCESS:
case MUTES_FETCH_SUCCESS:
case MUTES_EXPAND_SUCCESS:
- return normalizeAccounts(state, action.accounts);
+ return action.accounts ? normalizeAccounts(state, action.accounts) : state;
case NOTIFICATIONS_REFRESH_SUCCESS:
case NOTIFICATIONS_EXPAND_SUCCESS:
case SEARCH_FETCH_SUCCESS:
diff --git a/app/javascript/mastodon/reducers/accounts_counters.js b/app/javascript/mastodon/reducers/accounts_counters.js
index 4423e1b50e..1ed0fe3e39 100644
--- a/app/javascript/mastodon/reducers/accounts_counters.js
+++ b/app/javascript/mastodon/reducers/accounts_counters.js
@@ -106,7 +106,7 @@ export default function accountsCounters(state = initialState, action) {
case BLOCKS_EXPAND_SUCCESS:
case MUTES_FETCH_SUCCESS:
case MUTES_EXPAND_SUCCESS:
- return normalizeAccounts(state, action.accounts);
+ return action.accounts ? normalizeAccounts(state, action.accounts) : state;
case NOTIFICATIONS_REFRESH_SUCCESS:
case NOTIFICATIONS_EXPAND_SUCCESS:
case SEARCH_FETCH_SUCCESS:
diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js
index d2b29721f4..5756a393f4 100644
--- a/app/javascript/mastodon/reducers/compose.js
+++ b/app/javascript/mastodon/reducers/compose.js
@@ -15,7 +15,6 @@ import {
COMPOSE_UPLOAD_PROGRESS,
COMPOSE_SUGGESTIONS_CLEAR,
COMPOSE_SUGGESTIONS_READY,
- COMPOSE_SUGGESTIONS_READY_TXT,
COMPOSE_SUGGESTION_SELECT,
COMPOSE_ADVANCED_OPTIONS_CHANGE,
COMPOSE_SENSITIVITY_CHANGE,
@@ -129,7 +128,7 @@ const insertSuggestion = (state, position, token, completion) => {
};
const insertEmoji = (state, position, emojiData) => {
- const emoji = emojiData.unicode.split('-').map(code => String.fromCodePoint(parseInt(code, 16))).join('');
+ const emoji = emojiData.native;
return state.withMutations(map => {
map.update('text', oldText => `${oldText.slice(0, position)}${emoji} ${oldText.slice(position)}`);
@@ -263,10 +262,7 @@ export default function compose(state = initialState, action) {
case COMPOSE_SUGGESTIONS_CLEAR:
return state.update('suggestions', ImmutableList(), list => list.clear()).set('suggestion_token', null);
case COMPOSE_SUGGESTIONS_READY:
- return state.set('suggestions', ImmutableList(action.accounts.map(item => item.id))).set('suggestion_token', action.token);
- case COMPOSE_SUGGESTIONS_READY_TXT:
- // suggestion received that is not an account - hashtag or emojo
- return state.set('suggestions', ImmutableList(action.items.map(item => item))).set('suggestion_token', action.token);
+ return state.set('suggestions', ImmutableList(action.accounts ? action.accounts.map(item => item.id) : action.emojis)).set('suggestion_token', action.token);
case COMPOSE_SUGGESTION_SELECT:
return insertSuggestion(state, action.position, action.token, action.completion);
case TIMELINE_DELETE:
diff --git a/app/javascript/mastodon/reducers/custom_emojis.js b/app/javascript/mastodon/reducers/custom_emojis.js
new file mode 100644
index 0000000000..d80c0d156a
--- /dev/null
+++ b/app/javascript/mastodon/reducers/custom_emojis.js
@@ -0,0 +1,16 @@
+import { List as ImmutableList } from 'immutable';
+import { STORE_HYDRATE } from '../actions/store';
+import { emojiIndex } from 'emoji-mart';
+import { buildCustomEmojis } from '../emoji';
+
+const initialState = ImmutableList();
+
+export default function custom_emojis(state = initialState, action) {
+ switch(action.type) {
+ case STORE_HYDRATE:
+ emojiIndex.search('', { custom: buildCustomEmojis(action.state.get('custom_emojis', [])) });
+ return action.state.get('custom_emojis');
+ default:
+ return state;
+ }
+};
diff --git a/app/javascript/mastodon/reducers/height_cache.js b/app/javascript/mastodon/reducers/height_cache.js
new file mode 100644
index 0000000000..2f5716fae9
--- /dev/null
+++ b/app/javascript/mastodon/reducers/height_cache.js
@@ -0,0 +1,23 @@
+import { Map as ImmutableMap } from 'immutable';
+import { HEIGHT_CACHE_SET, HEIGHT_CACHE_CLEAR } from '../actions/height_cache';
+
+const initialState = ImmutableMap();
+
+const setHeight = (state, key, id, height) => {
+ return state.update(key, ImmutableMap(), map => map.set(id, height));
+};
+
+const clearHeights = () => {
+ return ImmutableMap();
+};
+
+export default function statuses(state = initialState, action) {
+ switch(action.type) {
+ case HEIGHT_CACHE_SET:
+ return setHeight(state, action.key, action.id, action.height);
+ case HEIGHT_CACHE_CLEAR:
+ return clearHeights();
+ default:
+ return state;
+ }
+};
diff --git a/app/javascript/mastodon/reducers/index.js b/app/javascript/mastodon/reducers/index.js
index a54fca530c..593d0efa4a 100644
--- a/app/javascript/mastodon/reducers/index.js
+++ b/app/javascript/mastodon/reducers/index.js
@@ -21,6 +21,8 @@ import compose from './compose';
import search from './search';
import media_attachments from './media_attachments';
import notifications from './notifications';
+import height_cache from './height_cache';
+import custom_emojis from './custom_emojis';
const reducers = {
timelines,
@@ -45,6 +47,8 @@ const reducers = {
search,
media_attachments,
notifications,
+ height_cache,
+ custom_emojis,
};
export default combineReducers(reducers);
diff --git a/app/javascript/mastodon/reducers/statuses.js b/app/javascript/mastodon/reducers/statuses.js
index eec2a5f165..38b23504ed 100644
--- a/app/javascript/mastodon/reducers/statuses.js
+++ b/app/javascript/mastodon/reducers/statuses.js
@@ -15,8 +15,6 @@ import {
CONTEXT_FETCH_SUCCESS,
STATUS_MUTE_SUCCESS,
STATUS_UNMUTE_SUCCESS,
- STATUS_SET_HEIGHT,
- STATUSES_CLEAR_HEIGHT,
} from '../actions/statuses';
import {
TIMELINE_REFRESH_SUCCESS,
@@ -60,9 +58,14 @@ const normalizeStatus = (state, status) => {
}
const searchContent = [status.spoiler_text, status.content].join(' ').replace(/
/g, '\n').replace(/<\/p>
/g, '\n\n');
+ const emojiMap = normalStatus.emojis.reduce((obj, emoji) => {
+ obj[`:${emoji.shortcode}:`] = emoji.url;
+ return obj;
+ }, {});
+
normalStatus.search_index = domParser.parseFromString(searchContent, 'text/html').documentElement.textContent;
- normalStatus.contentHtml = emojify(normalStatus.content);
- normalStatus.spoilerHtml = emojify(escapeTextContentForBrowser(normalStatus.spoiler_text || ''));
+ normalStatus.contentHtml = emojify(normalStatus.content, emojiMap);
+ normalStatus.spoilerHtml = emojify(escapeTextContentForBrowser(normalStatus.spoiler_text || ''), emojiMap);
return state.update(status.id, ImmutableMap(), map => map.mergeDeep(fromJS(normalStatus)));
};
@@ -95,18 +98,6 @@ const filterStatuses = (state, relationship) => {
return state;
};
-const setHeight = (state, id, height) => {
- return state.update(id, ImmutableMap(), map => map.set('height', height));
-};
-
-const clearHeights = (state) => {
- state.forEach(status => {
- state = state.deleteIn([status.get('id'), 'height']);
- });
-
- return state;
-};
-
const initialState = ImmutableMap();
export default function statuses(state = initialState, action) {
@@ -148,10 +139,6 @@ export default function statuses(state = initialState, action) {
return deleteStatus(state, action.id, action.references);
case ACCOUNT_BLOCK_SUCCESS:
return filterStatuses(state, action.relationship);
- case STATUS_SET_HEIGHT:
- return setHeight(state, action.id, action.height);
- case STATUSES_CLEAR_HEIGHT:
- return clearHeights(state);
default:
return state;
}
diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js
index c06714dc14..aa94006c63 100644
--- a/app/javascript/packs/application.js
+++ b/app/javascript/packs/application.js
@@ -2,7 +2,7 @@ import loadPolyfills from '../mastodon/load_polyfills';
// import default stylesheet with variables
require('font-awesome/css/font-awesome.css');
-require('mastodon-application-style');
+import 'styles/application';
require.context('../images/', true);
diff --git a/app/javascript/packs/frontends/mastodon.js b/app/javascript/packs/frontends/mastodon.js
deleted file mode 100644
index a983de36f7..0000000000
--- a/app/javascript/packs/frontends/mastodon.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// This file replaces `app/javascript/packs/application.js` for use
-// with multiple frontends.
-
-import loadPolyfills from '../../mastodon/load_polyfills';
-
-// import default stylesheet with variables
-require('font-awesome/css/font-awesome.css');
-require('mastodon-application-style');
-
-require.context('../../images/', true);
-
-loadPolyfills().then(() => {
- require('../../mastodon/main').default();
-}).catch(e => {
- console.error(e);
-});
diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js
index 8b201ecf8a..8842d6dcb7 100644
--- a/app/javascript/packs/public.js
+++ b/app/javascript/packs/public.js
@@ -25,6 +25,11 @@ function main() {
const emojify = require('../mastodon/emoji').default;
const { getLocale } = require('../mastodon/locales');
const { localeData } = getLocale();
+ const VideoContainer = require('../mastodon/containers/video_container').default;
+ const MediaGalleryContainer = require('../mastodon/containers/media_gallery_container').default;
+ const CardContainer = require('../mastodon/containers/card_container').default;
+ const React = require('react');
+ const ReactDOM = require('react-dom');
localeData.forEach(IntlRelativeFormat.__addLocaleData);
@@ -66,22 +71,21 @@ function main() {
window.open(e.target.href, 'mastodon-intent', 'width=400,height=400,resizable=no,menubar=no,status=no,scrollbars=yes');
});
});
- });
- delegate(document, '.video-player video', 'click', ({ target }) => {
- if (target.paused) {
- target.play();
- } else {
- target.pause();
- }
- });
+ [].forEach.call(document.querySelectorAll('[data-component="Video"]'), (content) => {
+ const props = JSON.parse(content.getAttribute('data-props'));
+ ReactDOM.render( , content);
+ });
- delegate(document, '.activity-stream .media-spoiler-wrapper .media-spoiler', 'click', function() {
- this.parentNode.classList.add('media-spoiler-wrapper__visible');
- });
+ [].forEach.call(document.querySelectorAll('[data-component="MediaGallery"]'), (content) => {
+ const props = JSON.parse(content.getAttribute('data-props'));
+ ReactDOM.render( , content);
+ });
- delegate(document, '.activity-stream .media-spoiler-wrapper .spoiler-button', 'click', function() {
- this.parentNode.classList.remove('media-spoiler-wrapper__visible');
+ [].forEach.call(document.querySelectorAll('[data-component="Card"]'), (content) => {
+ const props = JSON.parse(content.getAttribute('data-props'));
+ ReactDOM.render( , content);
+ });
});
delegate(document, '.webapp-btn', 'click', ({ target, button }) => {
@@ -126,7 +130,7 @@ function main() {
delegate(document, '#account_avatar', 'change', ({ target }) => {
const avatar = document.querySelector('.card.compact .avatar img');
const [file] = target.files || [];
- const url = URL.createObjectURL(file);
+ const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc;
avatar.src = url;
});
@@ -134,7 +138,7 @@ function main() {
delegate(document, '#account_header', 'change', ({ target }) => {
const header = document.querySelector('.card.compact');
const [file] = target.files || [];
- const url = URL.createObjectURL(file);
+ const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc;
header.style.backgroundImage = `url(${url})`;
});
diff --git a/app/javascript/styles/about.scss b/app/javascript/styles/about.scss
index 28924738a2..2adcb5ba2d 100644
--- a/app/javascript/styles/about.scss
+++ b/app/javascript/styles/about.scss
@@ -124,6 +124,7 @@
box-sizing: border-box;
max-width: 800px;
margin: 0 auto;
+ word-wrap: break-word;
}
.header-wrapper {
@@ -137,7 +138,7 @@
padding-bottom: 15px;
.hero .heading {
- padding-bottom: 30px;
+ padding-bottom: 20px;
font-family: 'mastodon-font-sans-serif', sans-serif;
font-size: 16px;
font-weight: 400;
@@ -327,7 +328,7 @@
.about-short {
background: darken($ui-base-color, 4%);
- padding: 50px 0;
+ padding: 50px 0 30px;
font-family: 'mastodon-font-sans-serif', sans-serif;
font-size: 16px;
font-weight: 400;
@@ -640,8 +641,11 @@
.header-wrapper {
padding-top: 0;
+ &.compact {
+ padding-bottom: 0;
+ }
+
&.compact .hero .heading {
- padding-bottom: 20px;
text-align: initial;
}
}
diff --git a/app/javascript/styles/admin.scss b/app/javascript/styles/admin.scss
index fa7859e38f..87bc710af6 100644
--- a/app/javascript/styles/admin.scss
+++ b/app/javascript/styles/admin.scss
@@ -97,6 +97,14 @@
margin-bottom: 40px;
}
+ h3 {
+ color: $ui-secondary-color;
+ font-size: 20px;
+ line-height: 28px;
+ font-weight: 400;
+ margin-bottom: 30px;
+ }
+
h6 {
font-size: 16px;
color: $ui-secondary-color;
diff --git a/app/javascript/styles/application.scss b/app/javascript/styles/application.scss
index 33c7783f3e..e35937be13 100644
--- a/app/javascript/styles/application.scss
+++ b/app/javascript/styles/application.scss
@@ -13,6 +13,7 @@
@import 'accounts';
@import 'stream_entries';
@import 'components';
+@import 'emoji_picker';
@import 'about';
@import 'tables';
@import 'admin';
diff --git a/app/javascript/styles/basics.scss b/app/javascript/styles/basics.scss
index c5f98750cd..96f0023c3d 100644
--- a/app/javascript/styles/basics.scss
+++ b/app/javascript/styles/basics.scss
@@ -62,6 +62,26 @@ body {
height: 100%;
padding: 0;
}
+
+ &.error {
+ text-align: center;
+ color: $ui-primary-color;
+ padding: 20px;
+
+ .dialog img {
+ display: block;
+ margin: 0 auto;
+ max-width: 470px;
+ width: 100%;
+ height: auto;
+ }
+
+ .dialog h1 {
+ font-size: 20px;
+ line-height: 28px;
+ font-weight: 400;
+ }
+ }
}
button {
diff --git a/app/javascript/styles/compact_header.scss b/app/javascript/styles/compact_header.scss
index cf12fcfec3..90d98cc8c5 100644
--- a/app/javascript/styles/compact_header.scss
+++ b/app/javascript/styles/compact_header.scss
@@ -6,7 +6,7 @@
font-weight: 500;
margin-bottom: 20px;
padding: 0 10px;
- overflow-wrap: break-word;
+ word-wrap: break-word;
@media screen and (max-width: 740px) {
text-align: center;
diff --git a/app/javascript/styles/components.scss b/app/javascript/styles/components.scss
index af85b6b50f..2f02af0981 100644
--- a/app/javascript/styles/components.scss
+++ b/app/javascript/styles/components.scss
@@ -222,12 +222,16 @@
}
}
+.dropdown-menu {
+ position: absolute;
+}
+
.dropdown--active .icon-button {
color: $ui-highlight-color;
}
.dropdown--active::after {
- @media screen and (min-width: 1025px) {
+ @media screen and (min-width: 631px) {
content: "";
display: block;
position: absolute;
@@ -395,17 +399,11 @@
.compose-form__autosuggest-wrapper {
position: relative;
- .emoji-picker__dropdown {
+ .emoji-picker-dropdown {
position: absolute;
right: 5px;
top: 5px;
- &.dropdown--active::after {
- border-color: transparent transparent $base-border-color;
- bottom: -1px;
- right: 8px;
- }
-
::-webkit-scrollbar-track:hover,
::-webkit-scrollbar-track:active {
background-color: rgba($base-overlay-background, 0.3);
@@ -444,6 +442,7 @@
display: inline-block;
font-size: inherit;
vertical-align: middle;
+ object-fit: contain;
margin: -.2ex .15em .2ex;
width: 16px;
height: 16px;
@@ -631,6 +630,10 @@
opacity: 1;
animation: fade 150ms linear;
+ .video-player {
+ margin-top: 8px;
+ }
+
&.status-direct {
background: lighten($ui-base-color, 8%);
@@ -805,8 +808,8 @@
.status__action-bar-dropdown {
float: left;
- height: 18px;
- width: 18px;
+ height: 23.15px;
+ width: 23.15px;
// Dropdown style override for centering on the icon
.dropdown--active {
@@ -832,26 +835,6 @@
align-items: center;
justify-content: center;
position: relative;
-
- .dropdown {
- display: block;
- width: 18px;
- height: 18px;
- }
-
- .dropdown--active {
- .dropdown__content.dropdown__left {
- left: 20px;
- right: initial;
- }
-
- &::after {
- bottom: initial;
- margin-left: 7px;
- margin-top: -7px;
- right: initial;
- }
- }
}
.detailed-status {
@@ -867,6 +850,10 @@
height: 22px;
}
}
+
+ .video-player {
+ margin-top: 8px;
+ }
}
.detailed-status__meta {
@@ -1123,7 +1110,7 @@
}
.account__action-bar-dropdown {
- flex: 1 1 auto;
+ flex: 0 1 calc(50% - 140px);
padding: 10px;
.dropdown--active {
@@ -1150,7 +1137,7 @@
.account__action-bar__tab {
text-decoration: none;
overflow: hidden;
- width: 80px;
+ flex: 0 1 80px;
border-left: 1px solid lighten($ui-base-color, 8%);
padding: 10px 5px;
@@ -1437,10 +1424,80 @@
position: absolute;
}
-.dropdown__sep {
+.dropdown-menu__separator {
border-bottom: 1px solid darken($ui-secondary-color, 8%);
margin: 5px 7px 6px;
- padding-top: 1px;
+ height: 0;
+}
+
+.dropdown-menu {
+ background: $ui-secondary-color;
+ padding: 4px 0;
+ border-radius: 4px;
+ box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);
+
+ ul {
+ list-style: none;
+ }
+}
+
+.dropdown-menu__arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border: 0 solid transparent;
+
+ &.left {
+ right: -5px;
+ margin-top: -5px;
+ border-width: 5px 0 5px 5px;
+ border-left-color: $ui-secondary-color;
+ }
+
+ &.top {
+ bottom: -5px;
+ margin-left: -13px;
+ border-width: 5px 7px 0;
+ border-top-color: $ui-secondary-color;
+ }
+
+ &.bottom {
+ top: -5px;
+ margin-left: -13px;
+ border-width: 0 7px 5px;
+ border-bottom-color: $ui-secondary-color;
+ }
+
+ &.right {
+ left: -5px;
+ margin-top: -5px;
+ border-width: 5px 5px 5px 0;
+ border-right-color: $ui-secondary-color;
+ }
+}
+
+.dropdown-menu__item {
+ a {
+ font-size: 13px;
+ line-height: 18px;
+ display: block;
+ padding: 4px 14px;
+ box-sizing: border-box;
+ text-decoration: none;
+ background: $ui-secondary-color;
+ color: $ui-base-color;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+
+ &:focus,
+ &:hover,
+ &:active {
+ background: $ui-highlight-color;
+ color: $ui-secondary-color;
+ outline: 0;
+ }
+ }
}
.dropdown--active .dropdown__content {
@@ -1610,9 +1667,8 @@
.column,
.drawer {
- @supports(display: grid) { // hack to fix Chrome <57
- contain: strict;
- }
+ flex: 1 1 100%;
+ overflow: hidden;
}
@include limited-single-column('screen and (max-width: 360px)', $parent: null) {
@@ -1626,7 +1682,7 @@
}
:root { // Overrides .wide stylings for mobile view
- @include single-column('screen and (max-width: 1024px)', $parent: null) {
+ @include single-column('screen and (max-width: 630px)', $parent: null) {
.column,
.drawer {
flex: auto;
@@ -1647,7 +1703,7 @@
}
}
-@include multi-columns('screen and (min-width: 1025px)', $parent: null) {
+@include multi-columns('screen and (min-width: 631px)', $parent: null) {
.columns-area {
padding: 0;
}
@@ -1759,7 +1815,7 @@
&:hover,
&:focus,
&:active {
- @include multi-columns('screen and (min-width: 1025px)') {
+ @include multi-columns('screen and (min-width: 631px)') {
background: lighten($ui-base-color, 14%);
transition: all 100ms linear;
}
@@ -1779,7 +1835,7 @@
}
}
-@include multi-columns('screen and (min-width: 1025px)', $parent: null) {
+@include multi-columns('screen and (min-width: 631px)', $parent: null) {
.tabs-bar {
display: none;
}
@@ -1790,9 +1846,7 @@
overflow-x: hidden;
flex: 1 1 auto;
-webkit-overflow-scrolling: touch;
- @supports(display: grid) { // hack to fix Chrome <57
- contain: strict;
- }
+ will-change: transform; // improves perf in mobile Chrome
&.optionally-scrollable {
overflow-y: auto;
@@ -2038,17 +2092,18 @@
}
.autosuggest-textarea__suggestions {
+ box-sizing: border-box;
display: none;
position: absolute;
- max-height: 300px;
- overflow-y: auto;
top: 100%;
width: 100%;
z-index: 99;
- box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);
+ box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);
background: $ui-secondary-color;
+ border-radius: 0 0 4px 4px;
color: $ui-base-color;
font-size: 14px;
+ padding: 6px;
&.autosuggest-textarea__suggestions--visible {
display: block;
@@ -2058,34 +2113,36 @@
.autosuggest-textarea__suggestions__item {
padding: 10px;
cursor: pointer;
+ border-radius: 4px;
- &:hover {
+ &:hover,
+ &:focus,
+ &:active,
+ &.selected {
background: darken($ui-secondary-color, 10%);
}
-
- &.selected {
- background: $ui-highlight-color;
- color: $base-border-color;
- }
}
-.autosuggest-account {
- overflow: hidden;
+.autosuggest-account,
+.autosuggest-emoji {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-start;
+ line-height: 18px;
+ font-size: 14px;
}
-.autosuggest-account-icon {
- float: left;
- margin-right: 5px;
+.autosuggest-account-icon,
+.autosuggest-emoji img {
+ display: block;
+ margin-right: 8px;
+ width: 16px;
+ height: 16px;
}
-.autosuggest-status {
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
-
- strong {
- font-weight: 500;
- }
+.autosuggest-account .display-name__account {
+ color: lighten($ui-base-color, 36%);
}
.character-counter__wrapper {
@@ -2644,7 +2701,7 @@ button.icon-button.active i.fa-retweet {
.media-spoiler {
background: $base-overlay-background;
- color: $primary-text-color;
+ color: $ui-primary-color;
border: 0;
width: 100%;
height: 100%;
@@ -2834,198 +2891,62 @@ button.icon-button.active i.fa-retweet {
animation-direction: alternate;
}
-.emoji-dialog {
- width: 245px;
- height: 270px;
+.emoji-picker-dropdown__menu {
background: $simple-background-color;
- box-sizing: border-box;
+ position: absolute;
+ box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);
border-radius: 4px;
+ margin-top: 5px;
+
+ .emoji-mart-scroll {
+ transition: opacity 200ms ease;
+ }
+
+ &.selecting .emoji-mart-scroll {
+ opacity: 0.5;
+ }
+}
+
+.emoji-picker-dropdown__modifiers {
+ position: absolute;
+ top: 60px;
+ right: 11px;
+ cursor: pointer;
+}
+
+.emoji-picker-dropdown__modifiers__menu {
+ position: absolute;
+ z-index: 4;
+ top: -4px;
+ left: -8px;
+ background: $simple-background-color;
+ border-radius: 4px;
+ box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
overflow: hidden;
- position: relative;
- box-shadow: 0 0 8px rgba($base-shadow-color, 0.2);
- .emojione {
- margin: 0;
- width: 100%;
- height: auto;
- }
-
- .emoji-dialog-header {
- padding: 0 10px;
-
- ul {
- padding: 0;
- margin: 0;
- list-style: none;
- }
-
- li {
- display: inline-block;
- box-sizing: border-box;
- padding: 10px 5px;
- cursor: pointer;
- border-bottom: 2px solid transparent;
-
- .emoji {
- width: 18px;
- height: 18px;
- }
-
- img,
- svg {
- width: 18px;
- height: 18px;
- filter: grayscale(100%);
- }
-
- &:hover {
- img,
- svg {
- filter: grayscale(0);
- }
- }
-
- &.active {
- border-bottom-color: $ui-highlight-color;
-
- img,
- svg {
- filter: grayscale(0);
- }
- }
- }
- }
-
- .emoji-row {
- box-sizing: border-box;
- overflow-y: hidden;
- padding-left: 10px;
-
- .emoji {
- display: inline-block;
- padding: 2.5px;
- border-radius: 4px;
- }
- }
-
- .emoji-category-header {
- box-sizing: border-box;
- overflow-y: hidden;
- padding: 10px 8px 10px 16px;
- display: table;
-
- > * {
- display: table-cell;
- vertical-align: middle;
- }
- }
-
- .emoji-category-title {
- font-size: 12px;
- text-transform: uppercase;
- font-weight: 500;
- color: darken($ui-secondary-color, 18%);
- cursor: default;
- }
-
- .emoji-category-heading-decoration {
- text-align: right;
- }
-
- .modifiers {
- list-style: none;
- padding: 0;
- margin: 0;
- vertical-align: middle;
- white-space: nowrap;
- margin-top: 4px;
-
- li {
- display: inline-block;
- padding: 0 2px;
-
- &:last-of-type {
- padding-right: 0;
- }
- }
-
- .modifier {
- display: inline-block;
- border-radius: 10px;
- width: 15px;
- height: 15px;
- position: relative;
- cursor: pointer;
-
- &.active::after {
- content: "";
- display: block;
- position: absolute;
- width: 7px;
- height: 7px;
- border-radius: 10px;
- border: 2px solid $base-border-color;
- top: 2px;
- left: 2px;
- }
- }
- }
-
- .emoji-search-wrapper {
- padding: 10px;
- border-bottom: 1px solid lighten($ui-secondary-color, 4%);
- }
-
- .emoji-search {
- font-size: 14px;
- font-weight: 400;
- padding: 7px 9px;
- font-family: inherit;
+ button {
display: block;
- width: 100%;
- background: rgba($ui-secondary-color, 0.3);
- color: darken($ui-secondary-color, 18%);
- border: 1px solid $ui-secondary-color;
- border-radius: 4px;
- }
-
- .emoji-categories-wrapper {
- position: absolute;
- top: 42px;
- bottom: 0;
- left: 0;
- right: 0;
- }
-
- .emoji-search-wrapper + .emoji-categories-wrapper {
- top: 93px;
- }
-
- .emoji-row .emoji {
- img,
- svg {
- transition: transform 60ms ease-in-out;
- }
-
- &:hover {
- background: lighten($ui-secondary-color, 3%);
-
- img,
- svg {
- transform: translateZ(0) scale(1.2);
- }
- }
- }
-
- .emoji {
- width: 22px;
- height: 22px;
cursor: pointer;
+ border: 0;
+ padding: 4px 8px;
+ background: transparent;
- &:focus {
- outline: 0;
+ &:hover,
+ &:focus,
+ &:active {
+ background: rgba($ui-secondary-color, 0.4);
}
}
+
+ .emoji-mart-emoji {
+ height: 22px;
+ }
+}
+
+.emoji-mart-emoji {
+ span {
+ background-repeat: no-repeat;
+ }
}
.upload-area {
@@ -3311,8 +3232,6 @@ button.icon-button.active i.fa-retweet {
}
.search__input {
- padding-right: 30px;
- color: $ui-secondary-color;
outline: 0;
box-sizing: border-box;
display: block;
@@ -3848,6 +3767,10 @@ button.icon-button.active i.fa-retweet {
padding-top: 10px;
padding-bottom: 10px;
}
+
+ .dropdown-menu__separator {
+ border-bottom-color: $ui-secondary-color;
+ }
}
.boost-modal__container {
@@ -3926,6 +3849,10 @@ button.icon-button.active i.fa-retweet {
max-height: 80vh;
max-width: 80vw;
+ .actions-modal__item-label {
+ font-weight: 500;
+ }
+
ul {
overflow-y: auto;
flex-shrink: 0;
@@ -3938,11 +3865,20 @@ button.icon-button.active i.fa-retweet {
a {
color: $ui-base-color;
display: flex;
- padding: 10px;
+ padding: 12px 16px;
+ font-size: 15px;
align-items: center;
text-decoration: none;
- &.active {
+ &,
+ button {
+ transition: none;
+ }
+
+ &.active,
+ &:hover,
+ &:active,
+ &:focus {
&,
button {
background: $ui-highlight-color;
@@ -4099,6 +4035,12 @@ button.icon-button.active i.fa-retweet {
display: block;
float: left;
position: relative;
+
+ &.standalone {
+ .media-gallery__item-gifv-thumbnail {
+ transform: none;
+ }
+ }
}
.media-gallery__item-thumbnail {
@@ -4106,6 +4048,7 @@ button.icon-button.active i.fa-retweet {
text-decoration: none;
width: 100%;
height: 100%;
+ line-height: 0;
display: flex;
img {
@@ -4208,6 +4151,182 @@ button.icon-button.active i.fa-retweet {
z-index: 5;
}
+.video-player {
+ overflow: hidden;
+ position: relative;
+ background: $base-shadow-color;
+ max-width: 100%;
+
+ video {
+ height: 100%;
+ width: 100%;
+ z-index: 1;
+ }
+
+ &.fullscreen {
+ width: 100% !important;
+ height: 100% !important;
+ margin: 0;
+
+ video {
+ max-width: 100% !important;
+ max-height: 100% !important;
+ }
+ }
+
+ &.inline {
+ video {
+ object-fit: cover;
+ position: relative;
+ top: 50%;
+ transform: translateY(-50%);
+ }
+ }
+
+ &__controls {
+ position: absolute;
+ z-index: 2;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ box-sizing: border-box;
+ background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 60%, transparent);
+ padding: 0 10px;
+ opacity: 0;
+ transition: opacity .1s ease;
+
+ &.active {
+ opacity: 1;
+ }
+ }
+
+ &.inactive {
+ video,
+ .video-player__controls {
+ visibility: hidden;
+ }
+ }
+
+ &__spoiler {
+ display: none;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 4;
+ border: 0;
+ background: $base-shadow-color;
+ color: $ui-primary-color;
+ transition: none;
+ pointer-events: none;
+
+ &.active {
+ display: block;
+ pointer-events: auto;
+
+ &:hover,
+ &:active,
+ &:focus {
+ color: lighten($ui-primary-color, 8%);
+ }
+ }
+
+ &__title {
+ display: block;
+ font-size: 14px;
+ }
+
+ &__subtitle {
+ display: block;
+ font-size: 11px;
+ font-weight: 500;
+ }
+ }
+
+ &__buttons {
+ padding-bottom: 10px;
+ font-size: 16px;
+
+ &.left {
+ float: left;
+
+ button {
+ padding-right: 10px;
+ }
+ }
+
+ &.right {
+ float: right;
+
+ button {
+ padding-left: 10px;
+ }
+ }
+
+ button {
+ background: transparent;
+ padding: 0;
+ border: 0;
+ color: $white;
+
+ &:active,
+ &:hover,
+ &:focus {
+ color: $ui-highlight-color;
+ }
+ }
+ }
+
+ &__seek {
+ cursor: pointer;
+ height: 24px;
+ position: relative;
+
+ &::before {
+ content: "";
+ width: 100%;
+ background: rgba($white, 0.35);
+ display: block;
+ position: absolute;
+ height: 4px;
+ top: 10px;
+ }
+
+ &__progress {
+ display: block;
+ position: absolute;
+ height: 4px;
+ top: 10px;
+ background: $ui-highlight-color;
+ }
+
+ &__handle {
+ position: absolute;
+ z-index: 3;
+ opacity: 0;
+ border-radius: 50%;
+ width: 12px;
+ height: 12px;
+ top: 6px;
+ margin-left: -6px;
+ transition: opacity .1s ease;
+ background: $ui-highlight-color;
+ pointer-events: none;
+
+ &.active {
+ opacity: 1;
+ }
+ }
+
+ &:hover {
+ .video-player__seek__handle {
+ opacity: 1;
+ }
+ }
+ }
+}
+
.media-spoiler-video {
background-size: cover;
background-repeat: no-repeat;
@@ -4238,12 +4357,14 @@ button.icon-button.active i.fa-retweet {
.account-gallery__container {
margin: -2px;
padding: 4px;
+ display: flex;
+ flex-wrap: wrap;
}
.account-gallery__item {
- float: left;
- width: 96px;
- height: 96px;
+ flex: 1 1 auto;
+ width: calc(100% / 3 - 4px);
+ height: 95px;
margin: 2px;
a {
@@ -4254,6 +4375,14 @@ button.icon-button.active i.fa-retweet {
background-size: cover;
background-position: center;
position: relative;
+ color: inherit;
+ text-decoration: none;
+
+ &:hover,
+ &:active,
+ &:focus {
+ outline: 0;
+ }
}
}
@@ -4323,7 +4452,7 @@ noscript {
100% { opacity: 1; }
}
-@media screen and (max-width: 1024px) and (max-height: 400px) {
+@media screen and (max-width: 630px) and (max-height: 400px) {
$duration: 400ms;
$delay: 100ms;
diff --git a/app/javascript/styles/custom.scss b/app/javascript/styles/custom.scss
deleted file mode 100644
index 97a9812439..0000000000
--- a/app/javascript/styles/custom.scss
+++ /dev/null
@@ -1 +0,0 @@
-@import 'application';
diff --git a/app/javascript/styles/emoji_picker.scss b/app/javascript/styles/emoji_picker.scss
new file mode 100644
index 0000000000..2b46d30fce
--- /dev/null
+++ b/app/javascript/styles/emoji_picker.scss
@@ -0,0 +1,199 @@
+.emoji-mart {
+ &,
+ * {
+ box-sizing: border-box;
+ line-height: 1.15;
+ }
+
+ font-size: 13px;
+ display: inline-block;
+ color: $ui-base-color;
+
+ .emoji-mart-emoji {
+ padding: 6px;
+ }
+}
+
+.emoji-mart-bar {
+ border: 0 solid darken($ui-secondary-color, 8%);
+
+ &:first-child {
+ border-bottom-width: 1px;
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+ background: $ui-secondary-color;
+ }
+
+ &:last-child {
+ border-top-width: 1px;
+ border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px;
+ display: none;
+ }
+}
+
+.emoji-mart-anchors {
+ display: flex;
+ justify-content: space-between;
+ padding: 0 6px;
+ color: $ui-primary-color;
+ line-height: 0;
+}
+
+.emoji-mart-anchor {
+ position: relative;
+ flex: 1;
+ text-align: center;
+ padding: 12px 4px;
+ overflow: hidden;
+ transition: color .1s ease-out;
+ cursor: pointer;
+
+ &:hover {
+ color: darken($ui-primary-color, 4%);
+ }
+}
+
+.emoji-mart-anchor-selected {
+ color: darken($ui-highlight-color, 3%);
+
+ &:hover {
+ color: darken($ui-highlight-color, 3%);
+ }
+
+ .emoji-mart-anchor-bar {
+ bottom: 0;
+ }
+}
+
+.emoji-mart-anchor-bar {
+ position: absolute;
+ bottom: -3px;
+ left: 0;
+ width: 100%;
+ height: 3px;
+ background-color: darken($ui-highlight-color, 3%);
+}
+
+.emoji-mart-anchors {
+ i {
+ display: inline-block;
+ width: 100%;
+ max-width: 22px;
+ }
+
+ svg {
+ fill: currentColor;
+ max-height: 18px;
+ }
+}
+
+.emoji-mart-scroll {
+ overflow-y: scroll;
+ height: 270px;
+ max-height: 35vh;
+ padding: 0 6px 6px;
+ background: $simple-background-color;
+ will-change: transform;
+}
+
+.emoji-mart-search {
+ padding: 10px;
+ padding-right: 45px;
+ background: $simple-background-color;
+
+ input {
+ font-size: 14px;
+ font-weight: 400;
+ padding: 7px 9px;
+ font-family: inherit;
+ display: block;
+ width: 100%;
+ background: rgba($ui-secondary-color, 0.3);
+ color: $ui-primary-color;
+ border: 1px solid $ui-secondary-color;
+ border-radius: 4px;
+
+ &::-moz-focus-inner {
+ border: 0;
+ }
+
+ &::-moz-focus-inner,
+ &:focus,
+ &:active {
+ outline: 0 !important;
+ }
+ }
+}
+
+.emoji-mart-category .emoji-mart-emoji {
+ cursor: pointer;
+
+ span {
+ z-index: 1;
+ position: relative;
+ text-align: center;
+ }
+
+ &:hover::before {
+ z-index: 0;
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: rgba($ui-secondary-color, 0.7);
+ border-radius: 100%;
+ }
+}
+
+.emoji-mart-category-label {
+ z-index: 2;
+ position: relative;
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+
+ span {
+ display: block;
+ width: 100%;
+ font-weight: 500;
+ padding: 5px 6px;
+ background: $simple-background-color;
+ }
+}
+
+.emoji-mart-emoji {
+ position: relative;
+ display: inline-block;
+ font-size: 0;
+
+ span {
+ width: 22px;
+ height: 22px;
+ }
+}
+
+.emoji-mart-no-results {
+ font-size: 14px;
+ text-align: center;
+ padding-top: 70px;
+ color: $ui-primary-color;
+
+ .emoji-mart-category-label {
+ display: none;
+ }
+
+ .emoji-mart-no-results-label {
+ margin-top: .2em;
+ }
+
+ .emoji-mart-emoji:hover::before {
+ content: none;
+ }
+}
+
+.emoji-mart-preview {
+ display: none;
+}
diff --git a/app/javascript/styles/forms.scss b/app/javascript/styles/forms.scss
index 7476102373..0526f174c6 100644
--- a/app/javascript/styles/forms.scss
+++ b/app/javascript/styles/forms.scss
@@ -349,9 +349,46 @@ code {
box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);
text-align: center;
+ p {
+ margin-bottom: 15px;
+ }
+
+ .oauth-code {
+ color: $ui-secondary-color;
+ outline: 0;
+ box-sizing: border-box;
+ display: block;
+ width: 100%;
+ border: none;
+ padding: 10px;
+ font-family: 'mastodon-font-monospace', monospace;
+ background: $ui-base-color;
+ color: $ui-primary-color;
+ font-size: 14px;
+ margin: 0;
+
+ &::-moz-focus-inner {
+ border: 0;
+ }
+
+ &::-moz-focus-inner,
+ &:focus,
+ &:active {
+ outline: 0 !important;
+ }
+
+ &:focus {
+ background: lighten($ui-base-color, 4%);
+ }
+ }
+
strong {
font-weight: 500;
}
+
+ @media screen and (max-width: 740px) and (min-width: 441px) {
+ margin-top: 40px;
+ }
}
.form-footer {
diff --git a/app/javascript/styles/rtl.scss b/app/javascript/styles/rtl.scss
index 6c003d69ad..0fdeccd9c3 100644
--- a/app/javascript/styles/rtl.scss
+++ b/app/javascript/styles/rtl.scss
@@ -245,7 +245,7 @@ body.rtl {
margin-left: 30px;
}
- @media screen and (min-width: 1025px) {
+ @media screen and (min-width: 631px) {
.column,
.drawer {
padding-left: 5px;
diff --git a/app/javascript/styles/stream_entries.scss b/app/javascript/styles/stream_entries.scss
index 35225c045e..453070b7c3 100644
--- a/app/javascript/styles/stream_entries.scss
+++ b/app/javascript/styles/stream_entries.scss
@@ -140,19 +140,6 @@
}
}
}
-
- .status__attachments {
- margin-top: 8px;
- overflow: hidden;
- width: 100%;
- box-sizing: border-box;
- position: relative;
-
- .status__attachments__inner {
- display: flex;
- height: 214px;
- }
- }
}
.detailed-status.light {
@@ -233,139 +220,35 @@
}
}
- .detailed-status__attachments {
- margin-top: 8px;
- overflow: hidden;
- width: 100%;
- box-sizing: border-box;
- position: relative;
+ .status-card {
+ border-color: lighten($ui-secondary-color, 4%);
+ color: darken($ui-primary-color, 4%);
- .status__attachments__inner {
- display: flex;
- height: 360px;
+ &:hover {
+ background: lighten($ui-secondary-color, 4%);
}
}
- .video-player {
- margin-top: 8px;
- height: 300px;
- overflow: hidden;
- position: relative;
-
- video {
- position: relative;
- z-index: 1;
- width: 100%;
- height: 100%;
- object-fit: cover;
- top: 50%;
- transform: translateY(-50%);
- }
- }
- }
-
- .media-item,
- .video-item {
- box-sizing: border-box;
- position: relative;
- left: auto;
- top: auto;
- right: auto;
- bottom: auto;
- float: left;
- border: medium none;
- display: block;
- flex: 1 1 auto;
- width: 100%;
- height: 100%;
- overflow: hidden;
- margin-right: 2px;
-
- &:last-child {
- margin-right: 0;
+ .status-card__title,
+ .status-card__description {
+ color: $ui-base-color;
}
- a {
- display: block;
- width: 100%;
- height: 100%;
- background: no-repeat scroll center center / cover;
- text-decoration: none;
- cursor: zoom-in;
- }
-
- video {
- position: relative;
- z-index: 1;
- width: 100%;
- height: 100%;
- object-fit: cover;
- top: 50%;
- transform: translateY(-50%);
- }
- }
-
- .video-item {
- a {
- cursor: pointer;
- }
-
- .video-item__play {
- position: absolute;
- top: 50%;
- left: 50%;
- font-size: 36px;
- transform: translate(-50%, -50%);
- padding: 5px;
- border-radius: 100px;
- color: rgba($primary-text-color, 0.8);
- z-index: 1;
+ .status-card__image {
+ background: $ui-secondary-color;
}
}
.media-spoiler {
background: $ui-primary-color;
- width: 100%;
- height: 100%;
- cursor: pointer;
- position: absolute;
- top: 0;
- left: 0;
- display: flex;
- align-items: center;
- justify-content: center;
- flex-direction: column;
- text-align: center;
+ color: $white;
transition: all 100ms linear;
- z-index: 2;
- &:hover {
+ &:hover,
+ &:active,
+ &:focus {
background: darken($ui-primary-color, 5%);
- }
-
- span {
- display: block;
-
- &:first-child {
- font-size: 14px;
- }
-
- &:last-child {
- font-size: 11px;
- font-weight: 500;
- }
- }
- }
-
- .media-spoiler-wrapper {
- &.media-spoiler-wrapper__visible {
- .media-spoiler {
- display: none;
- }
-
- .spoiler-button {
- display: block;
- }
+ color: unset;
}
}
diff --git a/app/javascript/themes/default/theme.yml b/app/javascript/themes/default/theme.yml
new file mode 100644
index 0000000000..6a7a872b41
--- /dev/null
+++ b/app/javascript/themes/default/theme.yml
@@ -0,0 +1,9 @@
+# (REQUIRED) Name must be unique across all installed themes.
+name: default
+
+# (REQUIRED) The location of the pack file inside `pack_directory`.
+pack: application.js
+
+# (OPTIONAL) The directory which contains the pack file.
+# Defaults to the theme directory (`app/javascript/themes/[theme]`).
+pack_directory: app/javascript/packs
diff --git a/app/javascript/themes/spin/pack.js b/app/javascript/themes/spin/pack.js
new file mode 100644
index 0000000000..dab0e93a4e
--- /dev/null
+++ b/app/javascript/themes/spin/pack.js
@@ -0,0 +1,2 @@
+import 'packs/application';
+import 'themes/spin/style';
diff --git a/app/javascript/themes/spin/style.scss b/app/javascript/themes/spin/style.scss
new file mode 100644
index 0000000000..1a9381fd0d
--- /dev/null
+++ b/app/javascript/themes/spin/style.scss
@@ -0,0 +1,14 @@
+:root:root:root {
+ .button, .icon-button, .emoji-button, .account__avatar, .account__avatar-overlay {
+ animation: spin 4s linear infinite;
+ }
+}
+
+@keyframes spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
diff --git a/app/javascript/themes/spin/theme.yml b/app/javascript/themes/spin/theme.yml
new file mode 100644
index 0000000000..a684997dcb
--- /dev/null
+++ b/app/javascript/themes/spin/theme.yml
@@ -0,0 +1,2 @@
+name: spin
+pack: pack.js
\ No newline at end of file
diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb
index c4da405c7f..4516454e18 100644
--- a/app/lib/activitypub/activity/announce.rb
+++ b/app/lib/activitypub/activity/announce.rb
@@ -11,7 +11,12 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
return status unless status.nil?
- status = Status.create!(account: @account, reblog: original_status, uri: @json['id'])
+ status = Status.create!(
+ account: @account,
+ reblog: original_status,
+ uri: @json['id'],
+ created_at: @json['published'] || Time.now.utc
+ )
distribute(status)
status
end
@@ -20,6 +25,8 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
def fetch_remote_original_status
if object_uri.start_with?('http')
+ return if ActivityPub::TagManager.instance.local_uri?(object_uri)
+
ActivityPub::FetchRemoteStatusService.new.call(object_uri)
elsif @object['url'].present?
::FetchRemoteStatusService.new.call(@object['url'])
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 9a34484f5e..4e19b30964 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -4,26 +4,31 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
def perform
return if delete_arrived_first?(object_uri) || unsupported_object_type?
- status = find_existing_status
-
- return status unless status.nil?
-
- ApplicationRecord.transaction do
- status = Status.create!(status_params)
-
- process_tags(status)
- process_attachments(status)
+ RedisLock.acquire(lock_options) do |lock|
+ if lock.acquired?
+ @status = find_existing_status
+ process_status if @status.nil?
+ end
end
- resolve_thread(status)
- distribute(status)
- forward_for_reply if status.public_visibility? || status.unlisted_visibility?
-
- status
+ @status
end
private
+ def process_status
+ ApplicationRecord.transaction do
+ @status = Status.create!(status_params)
+
+ process_tags(@status)
+ process_attachments(@status)
+ end
+
+ resolve_thread(@status)
+ distribute(@status)
+ forward_for_reply if @status.public_visibility? || @status.unlisted_visibility?
+ end
+
def find_existing_status
status = status_from_uri(object_uri)
status ||= Status.find_by(uri: @object['atomUri']) if @object['atomUri'].present?
@@ -56,11 +61,15 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
process_hashtag tag, status
when 'Mention'
process_mention tag, status
+ when 'Emoji'
+ process_emoji tag, status
end
end
end
def process_hashtag(tag, status)
+ return if tag['name'].blank?
+
hashtag = tag['name'].gsub(/\A#/, '').mb_chars.downcase
hashtag = Tag.where(name: hashtag).first_or_initialize(name: hashtag)
@@ -68,17 +77,32 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
def process_mention(tag, status)
+ return if tag['href'].blank?
+
account = account_from_uri(tag['href'])
account = FetchRemoteAccountService.new.call(tag['href']) if account.nil?
return if account.nil?
account.mentions.create(status: status)
end
+ def process_emoji(tag, _status)
+ return if tag['name'].blank? || tag['href'].blank?
+
+ shortcode = tag['name'].delete(':')
+ emoji = CustomEmoji.find_by(shortcode: shortcode, domain: @account.domain)
+
+ return if !emoji.nil? || skip_download?
+
+ emoji = CustomEmoji.new(domain: @account.domain, shortcode: shortcode)
+ emoji.image_remote_url = tag['href']
+ emoji.save
+ end
+
def process_attachments(status)
return unless @object['attachment'].is_a?(Array)
@object['attachment'].each do |attachment|
- next if unsupported_media_type?(attachment['mediaType'])
+ next if unsupported_media_type?(attachment['mediaType']) || attachment['url'].blank?
href = Addressable::URI.parse(attachment['url']).normalize.to_s
media_attachment = MediaAttachment.create(status: status, account: status.account, remote_url: href)
@@ -88,6 +112,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
media_attachment.file_remote_url = href
media_attachment.save
end
+ rescue Addressable::URI::InvalidURIError => e
+ Rails.logger.debug e
end
def resolve_thread(status)
@@ -97,8 +123,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
def conversation_from_uri(uri)
return nil if uri.nil?
- return Conversation.find_by(id: TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')) if TagManager.instance.local_id?(uri)
- Conversation.find_by(uri: uri) || Conversation.create!(uri: uri)
+ return Conversation.find_by(id: OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')) if OStatus::TagManager.instance.local_id?(uri)
+ Conversation.find_by(uri: uri) || Conversation.create(uri: uri)
end
def visibility_from_audience
@@ -182,4 +208,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
return unless @json['signature'].present? && reply_to_local?
ActivityPub::RawDistributionWorker.perform_async(Oj.dump(@json), replied_to_status.account_id)
end
+
+ def lock_options
+ { redis: Redis.current, key: "create:#{@object['id']}" }
+ end
end
diff --git a/app/lib/activitypub/adapter.rb b/app/lib/activitypub/adapter.rb
index 6ed66a2393..790d2025cf 100644
--- a/app/lib/activitypub/adapter.rb
+++ b/app/lib/activitypub/adapter.rb
@@ -14,6 +14,8 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base
'atomUri' => 'ostatus:atomUri',
'inReplyToAtomUri' => 'ostatus:inReplyToAtomUri',
'conversation' => 'ostatus:conversation',
+ 'toot' => 'http://joinmastodon.org/ns#',
+ 'Emoji' => 'toot:Emoji',
},
],
}.freeze
@@ -28,7 +30,7 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base
def serializable_hash(options = nil)
options = serialization_options(options)
- serialized_hash = CONTEXT.merge(ActiveModelSerializers::Adapter::Attributes.new(serializer, instance_options).serializable_hash(options))
- self.class.transform_key_casing!(serialized_hash, instance_options)
+ serialized_hash = ActiveModelSerializers::Adapter::Attributes.new(serializer, instance_options).serializable_hash(options)
+ CONTEXT.merge(self.class.transform_key_casing!(serialized_hash, instance_options))
end
end
diff --git a/app/lib/activitypub/tag_manager.rb b/app/lib/activitypub/tag_manager.rb
index 929e87852c..4ec3b8c56e 100644
--- a/app/lib/activitypub/tag_manager.rb
+++ b/app/lib/activitypub/tag_manager.rb
@@ -37,7 +37,7 @@ class ActivityPub::TagManager
end
def activity_uri_for(target)
- return nil unless %i(note comment activity).include?(target.object_type) && target.local?
+ raise ArgumentError, 'target must be a local activity' unless %i(note comment activity).include?(target.object_type) && target.local?
activity_account_status_url(target.account, target)
end
@@ -98,8 +98,8 @@ class ActivityPub::TagManager
else
StatusFinder.new(uri).status
end
- elsif ::TagManager.instance.local_id?(uri)
- klass.find_by(id: ::TagManager.instance.unique_tag_to_local_id(uri, klass.to_s))
+ elsif OStatus::TagManager.instance.local_id?(uri)
+ klass.find_by(id: OStatus::TagManager.instance.unique_tag_to_local_id(uri, klass.to_s))
else
klass.find_by(uri: uri.split('#').first)
end
diff --git a/app/lib/emoji.rb b/app/lib/emoji.rb
deleted file mode 100644
index 45b7f53dec..0000000000
--- a/app/lib/emoji.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-require 'singleton'
-
-class Emoji
- include Singleton
-
- def initialize
- data = Oj.load(File.open(Rails.root.join('lib', 'assets', 'emoji.json')))
-
- @map = {}
-
- data.each do |_, emoji|
- keys = [emoji['shortname']] + emoji['aliases']
- unicode = codepoint_to_unicode(emoji['unicode'])
-
- keys.each do |key|
- @map[key] = unicode
- end
- end
- end
-
- def unicode(shortcode)
- @map[shortcode]
- end
-
- def names
- @map.keys
- end
-
- private
-
- def codepoint_to_unicode(codepoint)
- if codepoint.include?('-')
- codepoint.split('-').map(&:hex).pack('U*')
- else
- [codepoint.hex].pack('U')
- end
- end
-end
diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
index cacc0364fd..42cd729903 100644
--- a/app/lib/formatter.rb
+++ b/app/lib/formatter.rb
@@ -9,7 +9,7 @@ class Formatter
include ActionView::Helpers::TextHelper
- def format(status)
+ def format(status, options = {})
if status.reblog?
prepend_reblog = status.reblog.account.acct
status = status.proper
@@ -19,7 +19,11 @@ class Formatter
raw_content = status.text
- return reformat(raw_content) unless status.local?
+ unless status.local?
+ html = reformat(raw_content)
+ html = encode_custom_emojis(html, status.emojis) if options[:custom_emojify]
+ return html.html_safe # rubocop:disable Rails/OutputSafety
+ end
linkable_accounts = status.mentions.map(&:account)
linkable_accounts << status.account
@@ -27,6 +31,7 @@ class Formatter
html = raw_content
html = "RT @#{prepend_reblog} #{html}" if prepend_reblog
html = encode_and_link_urls(html, linkable_accounts)
+ html = encode_custom_emojis(html, status.emojis) if options[:custom_emojify]
html = simple_format(html, {}, sanitize: false)
html = html.delete("\n")
@@ -34,12 +39,14 @@ class Formatter
end
def reformat(html)
- sanitize(html, Sanitize::Config::MASTODON_STRICT).html_safe # rubocop:disable Rails/OutputSafety
+ sanitize(html, Sanitize::Config::MASTODON_STRICT)
end
def plaintext(status)
return status.text if status.local?
- strip_tags(status.text)
+
+ text = status.text.gsub(/( | |<\/p>)+/) { |match| "#{match}\n" }
+ strip_tags(text)
end
def simplified_format(account)
@@ -56,6 +63,12 @@ class Formatter
Sanitize.fragment(html, config)
end
+ def format_spoiler(status)
+ html = encode(status.spoiler_text)
+ html = encode_custom_emojis(html, status.emojis)
+ html.html_safe # rubocop:disable Rails/OutputSafety
+ end
+
private
def encode(html)
@@ -76,6 +89,47 @@ class Formatter
end
end
+ def encode_custom_emojis(html, emojis)
+ return html if emojis.empty?
+
+ emoji_map = emojis.map { |e| [e.shortcode, full_asset_url(e.image.url)] }.to_h
+
+ i = -1
+ inside_tag = false
+ inside_shortname = false
+ shortname_start_index = -1
+
+ while i + 1 < html.size
+ i += 1
+
+ if inside_shortname && html[i] == ':'
+ shortcode = html[shortname_start_index + 1..i - 1]
+ emoji = emoji_map[shortcode]
+
+ if emoji
+ replacement = " "
+ before_html = shortname_start_index.positive? ? html[0..shortname_start_index - 1] : ''
+ html = before_html + replacement + html[i + 1..-1]
+ i += replacement.size - (shortcode.size + 2) - 1
+ else
+ i -= 1
+ end
+
+ inside_shortname = false
+ elsif inside_tag && html[i] == '>'
+ inside_tag = false
+ elsif html[i] == '<'
+ inside_tag = true
+ inside_shortname = false
+ elsif !inside_tag && html[i] == ':'
+ inside_shortname = true
+ shortname_start_index = i
+ end
+ end
+
+ html
+ end
+
def rewrite(text, entities)
chars = text.to_s.to_char_a
@@ -131,13 +185,13 @@ class Formatter
end
def link_html(url)
- url = Addressable::URI.parse(url).display_uri.to_s
+ url = Addressable::URI.parse(url).to_s
prefix = url.match(/\Ahttps?:\/\/(www\.)?/).to_s
text = url[prefix.length, 30]
suffix = url[prefix.length + 30..-1]
cutoff = url[prefix.length..-1].length > 30
- "#{prefix} #{text} #{suffix} "
+ "#{encode(prefix)} #{encode(text)} #{encode(suffix)} "
end
def hashtag_html(tag)
diff --git a/app/lib/language_detector.rb b/app/lib/language_detector.rb
index 1d9932b528..a42460e109 100644
--- a/app/lib/language_detector.rb
+++ b/app/lib/language_detector.rb
@@ -1,26 +1,31 @@
# frozen_string_literal: true
class LanguageDetector
- attr_reader :text, :account
+ include Singleton
- def initialize(text, account = nil)
- @text = text
- @account = account
+ def initialize
@identifier = CLD3::NNetLanguageIdentifier.new(1, 2048)
end
- def to_iso_s
- detected_language_code || default_locale
+ def detect(text, account)
+ detect_language_code(text) || default_locale(account)
end
- def prepared_text
- simplified_text.strip
+ def language_names
+ @language_names =
+ CLD3::TaskContextParams::LANGUAGE_NAMES.map { |name| iso6391(name.to_s).to_sym }
+ .uniq
end
private
- def detected_language_code
- iso6391(result.language).to_sym if detected_language_reliable?
+ def prepare_text(text)
+ simplify_text(text).strip
+ end
+
+ def detect_language_code(text)
+ result = @identifier.find_language(prepare_text(text))
+ iso6391(result.language.to_s).to_sym if result.reliable?
end
def iso6391(bcp47)
@@ -32,15 +37,7 @@ class LanguageDetector
ISO_639.find(iso639).alpha2
end
- def result
- @result ||= @identifier.find_language(prepared_text)
- end
-
- def detected_language_reliable?
- result.reliable?
- end
-
- def simplified_text
+ def simplify_text(text)
text.dup.tap do |new_text|
new_text.gsub!(FetchLinkCardService::URL_PATTERN, '')
new_text.gsub!(Account::MENTION_RE, '')
@@ -49,7 +46,7 @@ class LanguageDetector
end
end
- def default_locale
- account&.user_locale&.to_sym || nil
+ def default_locale(account)
+ account.user_locale&.to_sym
end
end
diff --git a/app/lib/ostatus/activity/base.rb b/app/lib/ostatus/activity/base.rb
index 1dc7abee3f..0393813979 100644
--- a/app/lib/ostatus/activity/base.rb
+++ b/app/lib/ostatus/activity/base.rb
@@ -11,30 +11,30 @@ class OStatus::Activity::Base
end
def verb
- raw = @xml.at_xpath('./activity:verb', activity: TagManager::AS_XMLNS).content
- TagManager::VERBS.key(raw)
+ raw = @xml.at_xpath('./activity:verb', activity: OStatus::TagManager::AS_XMLNS).content
+ OStatus::TagManager::VERBS.key(raw)
rescue
:post
end
def type
- raw = @xml.at_xpath('./activity:object-type', activity: TagManager::AS_XMLNS).content
- TagManager::TYPES.key(raw)
+ raw = @xml.at_xpath('./activity:object-type', activity: OStatus::TagManager::AS_XMLNS).content
+ OStatus::TagManager::TYPES.key(raw)
rescue
:activity
end
def id
- @xml.at_xpath('./xmlns:id', xmlns: TagManager::XMLNS).content
+ @xml.at_xpath('./xmlns:id', xmlns: OStatus::TagManager::XMLNS).content
end
def url
- link = @xml.xpath('./xmlns:link[@rel="alternate"]', xmlns: TagManager::XMLNS).find { |link_candidate| link_candidate['type'] == 'text/html' }
+ link = @xml.xpath('./xmlns:link[@rel="alternate"]', xmlns: OStatus::TagManager::XMLNS).find { |link_candidate| link_candidate['type'] == 'text/html' }
link.nil? ? nil : link['href']
end
def activitypub_uri
- link = @xml.xpath('./xmlns:link[@rel="alternate"]', xmlns: TagManager::XMLNS).find { |link_candidate| ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].include?(link_candidate['type']) }
+ link = @xml.xpath('./xmlns:link[@rel="alternate"]', xmlns: OStatus::TagManager::XMLNS).find { |link_candidate| ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].include?(link_candidate['type']) }
link.nil? ? nil : link['href']
end
@@ -45,8 +45,8 @@ class OStatus::Activity::Base
private
def find_status(uri)
- if TagManager.instance.local_id?(uri)
- local_id = TagManager.instance.unique_tag_to_local_id(uri, 'Status')
+ if OStatus::TagManager.instance.local_id?(uri)
+ local_id = OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Status')
return Status.find_by(id: local_id)
elsif ActivityPub::TagManager.instance.local_uri?(uri)
local_id = ActivityPub::TagManager.instance.uri_to_local_id(uri)
diff --git a/app/lib/ostatus/activity/creation.rb b/app/lib/ostatus/activity/creation.rb
index 1a23c9efa3..2687776f94 100644
--- a/app/lib/ostatus/activity/creation.rb
+++ b/app/lib/ostatus/activity/creation.rb
@@ -14,14 +14,22 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
return result if result.first.present?
end
+ RedisLock.acquire(lock_options) do |lock|
+ if lock.acquired?
+ # Return early if status already exists in db
+ @status = find_status(id)
+ return [@status, false] unless @status.nil?
+ @status = process_status
+ end
+ end
+
+ [@status, true]
+ end
+
+ def process_status
Rails.logger.debug "Creating remote status #{id}"
-
- # Return early if status already exists in db
- status = find_status(id)
-
- return [status, false] unless status.nil?
-
cached_reblog = reblog
+ status = nil
ApplicationRecord.transaction do
status = Status.create!(
@@ -42,6 +50,7 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
save_mentions(status)
save_hashtags(status)
save_media(status)
+ save_emojis(status)
end
if thread? && status.thread.nil?
@@ -54,7 +63,7 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
LinkCrawlWorker.perform_async(status.id) unless status.spoiler_text?
DistributionWorker.perform_async(status.id)
- [status, true]
+ status
end
def perform_via_activitypub
@@ -62,42 +71,42 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
end
def content
- @xml.at_xpath('./xmlns:content', xmlns: TagManager::XMLNS).content
+ @xml.at_xpath('./xmlns:content', xmlns: OStatus::TagManager::XMLNS).content
end
def content_language
- @xml.at_xpath('./xmlns:content', xmlns: TagManager::XMLNS)['xml:lang']&.presence || 'en'
+ @xml.at_xpath('./xmlns:content', xmlns: OStatus::TagManager::XMLNS)['xml:lang']&.presence || 'en'
end
def content_warning
- @xml.at_xpath('./xmlns:summary', xmlns: TagManager::XMLNS)&.content || ''
+ @xml.at_xpath('./xmlns:summary', xmlns: OStatus::TagManager::XMLNS)&.content || ''
end
def visibility_scope
- @xml.at_xpath('./mastodon:scope', mastodon: TagManager::MTDN_XMLNS)&.content&.to_sym || :public
+ @xml.at_xpath('./mastodon:scope', mastodon: OStatus::TagManager::MTDN_XMLNS)&.content&.to_sym || :public
end
def published
- @xml.at_xpath('./xmlns:published', xmlns: TagManager::XMLNS).content
+ @xml.at_xpath('./xmlns:published', xmlns: OStatus::TagManager::XMLNS).content
end
def thread?
- !@xml.at_xpath('./thr:in-reply-to', thr: TagManager::THR_XMLNS).nil?
+ !@xml.at_xpath('./thr:in-reply-to', thr: OStatus::TagManager::THR_XMLNS).nil?
end
def thread
- thr = @xml.at_xpath('./thr:in-reply-to', thr: TagManager::THR_XMLNS)
+ thr = @xml.at_xpath('./thr:in-reply-to', thr: OStatus::TagManager::THR_XMLNS)
[thr['ref'], thr['href']]
end
private
def find_or_create_conversation
- uri = @xml.at_xpath('./ostatus:conversation', ostatus: TagManager::OS_XMLNS)&.attribute('ref')&.content
+ uri = @xml.at_xpath('./ostatus:conversation', ostatus: OStatus::TagManager::OS_XMLNS)&.attribute('ref')&.content
return if uri.nil?
- if TagManager.instance.local_id?(uri)
- local_id = TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')
+ if OStatus::TagManager.instance.local_id?(uri)
+ local_id = OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')
return Conversation.find_by(id: local_id)
end
@@ -107,8 +116,8 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
def save_mentions(parent)
processed_account_ids = []
- @xml.xpath('./xmlns:link[@rel="mentioned"]', xmlns: TagManager::XMLNS).each do |link|
- next if [TagManager::TYPES[:group], TagManager::TYPES[:collection]].include? link['ostatus:object-type']
+ @xml.xpath('./xmlns:link[@rel="mentioned"]', xmlns: OStatus::TagManager::XMLNS).each do |link|
+ next if [OStatus::TagManager::TYPES[:group], OStatus::TagManager::TYPES[:collection]].include? link['ostatus:object-type']
mentioned_account = account_from_href(link['href'])
@@ -122,14 +131,14 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
end
def save_hashtags(parent)
- tags = @xml.xpath('./xmlns:category', xmlns: TagManager::XMLNS).map { |category| category['term'] }.select(&:present?)
+ tags = @xml.xpath('./xmlns:category', xmlns: OStatus::TagManager::XMLNS).map { |category| category['term'] }.select(&:present?)
ProcessHashtagsService.new.call(parent, tags)
end
def save_media(parent)
do_not_download = DomainBlock.find_by(domain: parent.account.domain)&.reject_media?
- @xml.xpath('./xmlns:link[@rel="enclosure"]', xmlns: TagManager::XMLNS).each do |link|
+ @xml.xpath('./xmlns:link[@rel="enclosure"]', xmlns: OStatus::TagManager::XMLNS).each do |link|
next unless link['href']
media = MediaAttachment.where(status: parent, remote_url: link['href']).first_or_initialize(account: parent.account, status: parent, remote_url: link['href'])
@@ -150,6 +159,25 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
end
end
+ def save_emojis(parent)
+ do_not_download = DomainBlock.find_by(domain: parent.account.domain)&.reject_media?
+
+ return if do_not_download
+
+ @xml.xpath('./xmlns:link[@rel="emoji"]', xmlns: OStatus::TagManager::XMLNS).each do |link|
+ next unless link['href'] && link['name']
+
+ shortcode = link['name'].delete(':')
+ emoji = CustomEmoji.find_by(shortcode: shortcode, domain: parent.account.domain)
+
+ next unless emoji.nil?
+
+ emoji = CustomEmoji.new(shortcode: shortcode, domain: parent.account.domain)
+ emoji.image_remote_url = link['href']
+ emoji.save
+ end
+ end
+
def account_from_href(href)
url = Addressable::URI.parse(href).normalize
@@ -159,4 +187,8 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
Account.where(uri: href).or(Account.where(url: href)).first || FetchRemoteAccountService.new.call(href)
end
end
+
+ def lock_options
+ { redis: Redis.current, key: "create:#{id}" }
+ end
end
diff --git a/app/lib/ostatus/activity/share.rb b/app/lib/ostatus/activity/share.rb
index 2900080216..5ca6014154 100644
--- a/app/lib/ostatus/activity/share.rb
+++ b/app/lib/ostatus/activity/share.rb
@@ -10,7 +10,7 @@ class OStatus::Activity::Share < OStatus::Activity::Creation
end
def object
- @xml.at_xpath('.//activity:object', activity: TagManager::AS_XMLNS)
+ @xml.at_xpath('.//activity:object', activity: OStatus::TagManager::AS_XMLNS)
end
private
diff --git a/app/lib/ostatus/atom_serializer.rb b/app/lib/ostatus/atom_serializer.rb
index b8e22a3813..a1ac11a519 100644
--- a/app/lib/ostatus/atom_serializer.rb
+++ b/app/lib/ostatus/atom_serializer.rb
@@ -15,10 +15,10 @@ class OStatus::AtomSerializer
def author(account)
author = Ox::Element.new('author')
- uri = TagManager.instance.uri_for(account)
+ uri = OStatus::TagManager.instance.uri_for(account)
append_element(author, 'id', uri)
- append_element(author, 'activity:object-type', TagManager::TYPES[:person])
+ append_element(author, 'activity:object-type', OStatus::TagManager::TYPES[:person])
append_element(author, 'uri', uri)
append_element(author, 'name', account.username)
append_element(author, 'email', account.local? ? account.local_username_and_domain : account.acct)
@@ -65,15 +65,15 @@ class OStatus::AtomSerializer
add_namespaces(entry) if root
- append_element(entry, 'id', TagManager.instance.uri_for(stream_entry.status))
+ append_element(entry, 'id', OStatus::TagManager.instance.uri_for(stream_entry.status))
append_element(entry, 'published', stream_entry.created_at.iso8601)
append_element(entry, 'updated', stream_entry.updated_at.iso8601)
append_element(entry, 'title', stream_entry&.status&.title || "#{stream_entry.account.acct} deleted status")
entry << author(stream_entry.account) if root
- append_element(entry, 'activity:object-type', TagManager::TYPES[stream_entry.object_type])
- append_element(entry, 'activity:verb', TagManager::VERBS[stream_entry.verb])
+ append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[stream_entry.object_type])
+ append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[stream_entry.verb])
entry << object(stream_entry.target) if stream_entry.targeted?
@@ -88,7 +88,7 @@ class OStatus::AtomSerializer
append_element(entry, 'link', nil, rel: :alternate, type: 'text/html', href: TagManager.instance.url_for(stream_entry.status))
append_element(entry, 'link', nil, rel: :self, type: 'application/atom+xml', href: account_stream_entry_url(stream_entry.account, stream_entry, format: 'atom'))
- append_element(entry, 'thr:in-reply-to', nil, ref: TagManager.instance.uri_for(stream_entry.thread), href: TagManager.instance.url_for(stream_entry.thread)) if stream_entry.threaded?
+ append_element(entry, 'thr:in-reply-to', nil, ref: OStatus::TagManager.instance.uri_for(stream_entry.thread), href: TagManager.instance.url_for(stream_entry.thread)) if stream_entry.threaded?
append_element(entry, 'ostatus:conversation', nil, ref: conversation_uri(stream_entry.status.conversation)) unless stream_entry&.status&.conversation_id.nil?
entry
@@ -97,20 +97,20 @@ class OStatus::AtomSerializer
def object(status)
object = Ox::Element.new('activity:object')
- append_element(object, 'id', TagManager.instance.uri_for(status))
+ append_element(object, 'id', OStatus::TagManager.instance.uri_for(status))
append_element(object, 'published', status.created_at.iso8601)
append_element(object, 'updated', status.updated_at.iso8601)
append_element(object, 'title', status.title)
object << author(status.account)
- append_element(object, 'activity:object-type', TagManager::TYPES[status.object_type])
- append_element(object, 'activity:verb', TagManager::VERBS[status.verb])
+ append_element(object, 'activity:object-type', OStatus::TagManager::TYPES[status.object_type])
+ append_element(object, 'activity:verb', OStatus::TagManager::VERBS[status.verb])
serialize_status_attributes(object, status)
append_element(object, 'link', nil, rel: :alternate, type: 'text/html', href: TagManager.instance.url_for(status))
- append_element(object, 'thr:in-reply-to', nil, ref: TagManager.instance.uri_for(status.thread), href: TagManager.instance.url_for(status.thread)) unless status.thread.nil?
+ append_element(object, 'thr:in-reply-to', nil, ref: OStatus::TagManager.instance.uri_for(status.thread), href: TagManager.instance.url_for(status.thread)) unless status.thread.nil?
append_element(object, 'ostatus:conversation', nil, ref: conversation_uri(status.conversation)) unless status.conversation_id.nil?
object
@@ -122,14 +122,14 @@ class OStatus::AtomSerializer
description = "#{follow.account.acct} started following #{follow.target_account.acct}"
- append_element(entry, 'id', TagManager.instance.unique_tag(follow.created_at, follow.id, 'Follow'))
+ append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(follow.created_at, follow.id, 'Follow'))
append_element(entry, 'title', description)
append_element(entry, 'content', description, type: :html)
entry << author(follow.account)
- append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
- append_element(entry, 'activity:verb', TagManager::VERBS[:follow])
+ append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
+ append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:follow])
object = author(follow.target_account)
object.value = 'activity:object'
@@ -142,13 +142,13 @@ class OStatus::AtomSerializer
entry = Ox::Element.new('entry')
add_namespaces(entry)
- append_element(entry, 'id', TagManager.instance.unique_tag(follow_request.created_at, follow_request.id, 'FollowRequest'))
+ append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(follow_request.created_at, follow_request.id, 'FollowRequest'))
append_element(entry, 'title', "#{follow_request.account.acct} requested to follow #{follow_request.target_account.acct}")
entry << author(follow_request.account)
- append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
- append_element(entry, 'activity:verb', TagManager::VERBS[:request_friend])
+ append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
+ append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:request_friend])
object = author(follow_request.target_account)
object.value = 'activity:object'
@@ -161,19 +161,19 @@ class OStatus::AtomSerializer
entry = Ox::Element.new('entry')
add_namespaces(entry)
- append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, follow_request.id, 'FollowRequest'))
+ append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, follow_request.id, 'FollowRequest'))
append_element(entry, 'title', "#{follow_request.target_account.acct} authorizes follow request by #{follow_request.account.acct}")
entry << author(follow_request.target_account)
- append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
- append_element(entry, 'activity:verb', TagManager::VERBS[:authorize])
+ append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
+ append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:authorize])
object = Ox::Element.new('activity:object')
object << author(follow_request.account)
- append_element(object, 'activity:object-type', TagManager::TYPES[:activity])
- append_element(object, 'activity:verb', TagManager::VERBS[:request_friend])
+ append_element(object, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
+ append_element(object, 'activity:verb', OStatus::TagManager::VERBS[:request_friend])
inner_object = author(follow_request.target_account)
inner_object.value = 'activity:object'
@@ -187,19 +187,19 @@ class OStatus::AtomSerializer
entry = Ox::Element.new('entry')
add_namespaces(entry)
- append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, follow_request.id, 'FollowRequest'))
+ append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, follow_request.id, 'FollowRequest'))
append_element(entry, 'title', "#{follow_request.target_account.acct} rejects follow request by #{follow_request.account.acct}")
entry << author(follow_request.target_account)
- append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
- append_element(entry, 'activity:verb', TagManager::VERBS[:reject])
+ append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
+ append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:reject])
object = Ox::Element.new('activity:object')
object << author(follow_request.account)
- append_element(object, 'activity:object-type', TagManager::TYPES[:activity])
- append_element(object, 'activity:verb', TagManager::VERBS[:request_friend])
+ append_element(object, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
+ append_element(object, 'activity:verb', OStatus::TagManager::VERBS[:request_friend])
inner_object = author(follow_request.target_account)
inner_object.value = 'activity:object'
@@ -215,14 +215,14 @@ class OStatus::AtomSerializer
description = "#{follow.account.acct} is no longer following #{follow.target_account.acct}"
- append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, follow.id, 'Follow'))
+ append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, follow.id, 'Follow'))
append_element(entry, 'title', description)
append_element(entry, 'content', description, type: :html)
entry << author(follow.account)
- append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
- append_element(entry, 'activity:verb', TagManager::VERBS[:unfollow])
+ append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
+ append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:unfollow])
object = author(follow.target_account)
object.value = 'activity:object'
@@ -237,13 +237,13 @@ class OStatus::AtomSerializer
description = "#{block.account.acct} no longer wishes to interact with #{block.target_account.acct}"
- append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, block.id, 'Block'))
+ append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, block.id, 'Block'))
append_element(entry, 'title', description)
entry << author(block.account)
- append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
- append_element(entry, 'activity:verb', TagManager::VERBS[:block])
+ append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
+ append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:block])
object = author(block.target_account)
object.value = 'activity:object'
@@ -258,13 +258,13 @@ class OStatus::AtomSerializer
description = "#{block.account.acct} no longer blocks #{block.target_account.acct}"
- append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, block.id, 'Block'))
+ append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, block.id, 'Block'))
append_element(entry, 'title', description)
entry << author(block.account)
- append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
- append_element(entry, 'activity:verb', TagManager::VERBS[:unblock])
+ append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
+ append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:unblock])
object = author(block.target_account)
object.value = 'activity:object'
@@ -279,18 +279,18 @@ class OStatus::AtomSerializer
description = "#{favourite.account.acct} favourited a status by #{favourite.status.account.acct}"
- append_element(entry, 'id', TagManager.instance.unique_tag(favourite.created_at, favourite.id, 'Favourite'))
+ append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(favourite.created_at, favourite.id, 'Favourite'))
append_element(entry, 'title', description)
append_element(entry, 'content', description, type: :html)
entry << author(favourite.account)
- append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
- append_element(entry, 'activity:verb', TagManager::VERBS[:favorite])
+ append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
+ append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:favorite])
entry << object(favourite.status)
- append_element(entry, 'thr:in-reply-to', nil, ref: TagManager.instance.uri_for(favourite.status), href: TagManager.instance.url_for(favourite.status))
+ append_element(entry, 'thr:in-reply-to', nil, ref: OStatus::TagManager.instance.uri_for(favourite.status), href: TagManager.instance.url_for(favourite.status))
entry
end
@@ -301,18 +301,18 @@ class OStatus::AtomSerializer
description = "#{favourite.account.acct} no longer favourites a status by #{favourite.status.account.acct}"
- append_element(entry, 'id', TagManager.instance.unique_tag(Time.now.utc, favourite.id, 'Favourite'))
+ append_element(entry, 'id', OStatus::TagManager.instance.unique_tag(Time.now.utc, favourite.id, 'Favourite'))
append_element(entry, 'title', description)
append_element(entry, 'content', description, type: :html)
entry << author(favourite.account)
- append_element(entry, 'activity:object-type', TagManager::TYPES[:activity])
- append_element(entry, 'activity:verb', TagManager::VERBS[:unfavorite])
+ append_element(entry, 'activity:object-type', OStatus::TagManager::TYPES[:activity])
+ append_element(entry, 'activity:verb', OStatus::TagManager::VERBS[:unfavorite])
entry << object(favourite.status)
- append_element(entry, 'thr:in-reply-to', nil, ref: TagManager.instance.uri_for(favourite.status), href: TagManager.instance.url_for(favourite.status))
+ append_element(entry, 'thr:in-reply-to', nil, ref: OStatus::TagManager.instance.uri_for(favourite.status), href: TagManager.instance.url_for(favourite.status))
entry
end
@@ -332,17 +332,17 @@ class OStatus::AtomSerializer
def conversation_uri(conversation)
return conversation.uri if conversation.uri?
- TagManager.instance.unique_tag(conversation.created_at, conversation.id, 'Conversation')
+ OStatus::TagManager.instance.unique_tag(conversation.created_at, conversation.id, 'Conversation')
end
def add_namespaces(parent)
- parent['xmlns'] = TagManager::XMLNS
- parent['xmlns:thr'] = TagManager::THR_XMLNS
- parent['xmlns:activity'] = TagManager::AS_XMLNS
- parent['xmlns:poco'] = TagManager::POCO_XMLNS
- parent['xmlns:media'] = TagManager::MEDIA_XMLNS
- parent['xmlns:ostatus'] = TagManager::OS_XMLNS
- parent['xmlns:mastodon'] = TagManager::MTDN_XMLNS
+ parent['xmlns'] = OStatus::TagManager::XMLNS
+ parent['xmlns:thr'] = OStatus::TagManager::THR_XMLNS
+ parent['xmlns:activity'] = OStatus::TagManager::AS_XMLNS
+ parent['xmlns:poco'] = OStatus::TagManager::POCO_XMLNS
+ parent['xmlns:media'] = OStatus::TagManager::MEDIA_XMLNS
+ parent['xmlns:ostatus'] = OStatus::TagManager::OS_XMLNS
+ parent['xmlns:mastodon'] = OStatus::TagManager::MTDN_XMLNS
end
def serialize_status_attributes(entry, status)
@@ -352,10 +352,10 @@ class OStatus::AtomSerializer
append_element(entry, 'content', Formatter.instance.format(status).to_str, type: 'html', 'xml:lang': status.language)
status.mentions.each do |mentioned|
- append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': TagManager::TYPES[:person], href: TagManager.instance.uri_for(mentioned.account))
+ append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': OStatus::TagManager::TYPES[:person], href: OStatus::TagManager.instance.uri_for(mentioned.account))
end
- append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': TagManager::TYPES[:collection], href: TagManager::COLLECTIONS[:public]) if status.public_visibility?
+ append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': OStatus::TagManager::TYPES[:collection], href: OStatus::TagManager::COLLECTIONS[:public]) if status.public_visibility?
status.tags.each do |tag|
append_element(entry, 'category', nil, term: tag.name)
@@ -368,5 +368,9 @@ class OStatus::AtomSerializer
end
append_element(entry, 'mastodon:scope', status.visibility)
+
+ status.emojis.each do |emoji|
+ append_element(entry, 'link', nil, rel: :emoji, href: full_asset_url(emoji.image.url), name: emoji.shortcode)
+ end
end
end
diff --git a/app/lib/ostatus/tag_manager.rb b/app/lib/ostatus/tag_manager.rb
new file mode 100644
index 0000000000..4f45013126
--- /dev/null
+++ b/app/lib/ostatus/tag_manager.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+class OStatus::TagManager
+ include Singleton
+ include RoutingHelper
+
+ VERBS = {
+ post: 'http://activitystrea.ms/schema/1.0/post',
+ share: 'http://activitystrea.ms/schema/1.0/share',
+ favorite: 'http://activitystrea.ms/schema/1.0/favorite',
+ unfavorite: 'http://activitystrea.ms/schema/1.0/unfavorite',
+ delete: 'http://activitystrea.ms/schema/1.0/delete',
+ follow: 'http://activitystrea.ms/schema/1.0/follow',
+ request_friend: 'http://activitystrea.ms/schema/1.0/request-friend',
+ authorize: 'http://activitystrea.ms/schema/1.0/authorize',
+ reject: 'http://activitystrea.ms/schema/1.0/reject',
+ unfollow: 'http://ostatus.org/schema/1.0/unfollow',
+ block: 'http://mastodon.social/schema/1.0/block',
+ unblock: 'http://mastodon.social/schema/1.0/unblock',
+ }.freeze
+
+ TYPES = {
+ activity: 'http://activitystrea.ms/schema/1.0/activity',
+ note: 'http://activitystrea.ms/schema/1.0/note',
+ comment: 'http://activitystrea.ms/schema/1.0/comment',
+ person: 'http://activitystrea.ms/schema/1.0/person',
+ collection: 'http://activitystrea.ms/schema/1.0/collection',
+ group: 'http://activitystrea.ms/schema/1.0/group',
+ }.freeze
+
+ COLLECTIONS = {
+ public: 'http://activityschema.org/collection/public',
+ }.freeze
+
+ XMLNS = 'http://www.w3.org/2005/Atom'
+ MEDIA_XMLNS = 'http://purl.org/syndication/atommedia'
+ AS_XMLNS = 'http://activitystrea.ms/spec/1.0/'
+ THR_XMLNS = 'http://purl.org/syndication/thread/1.0'
+ POCO_XMLNS = 'http://portablecontacts.net/spec/1.0'
+ DFRN_XMLNS = 'http://purl.org/macgirvin/dfrn/1.0'
+ OS_XMLNS = 'http://ostatus.org/schema/1.0'
+ MTDN_XMLNS = 'http://mastodon.social/schema/1.0'
+
+ def unique_tag(date, id, type)
+ "tag:#{Rails.configuration.x.local_domain},#{date.strftime('%Y-%m-%d')}:objectId=#{id}:objectType=#{type}"
+ end
+
+ def unique_tag_to_local_id(tag, expected_type)
+ return nil unless local_id?(tag)
+
+ if ActivityPub::TagManager.instance.local_uri?(tag)
+ ActivityPub::TagManager.instance.uri_to_local_id(tag)
+ else
+ matches = Regexp.new("objectId=([\\d]+):objectType=#{expected_type}").match(tag)
+ return matches[1] unless matches.nil?
+ end
+ end
+
+ def local_id?(id)
+ id.start_with?("tag:#{Rails.configuration.x.local_domain}") || ActivityPub::TagManager.instance.local_uri?(id)
+ end
+
+ def uri_for(target)
+ return target.uri if target.respond_to?(:local?) && !target.local?
+
+ case target.object_type
+ when :person
+ account_url(target)
+ when :note, :comment, :activity
+ target.uri || unique_tag(target.created_at, target.id, 'Status')
+ end
+ end
+end
diff --git a/app/lib/request.rb b/app/lib/request.rb
index c01e079259..b083edaf77 100644
--- a/app/lib/request.rb
+++ b/app/lib/request.rb
@@ -31,6 +31,8 @@ class Request
def perform
http_client.headers(headers).public_send(@verb, @url.to_s, @options)
+ rescue => e
+ raise e.class, "#{e.message} on #{@url}"
end
def headers
diff --git a/app/lib/tag_manager.rb b/app/lib/tag_manager.rb
index f33a20c6f7..fb364cb98a 100644
--- a/app/lib/tag_manager.rb
+++ b/app/lib/tag_manager.rb
@@ -6,62 +6,6 @@ class TagManager
include Singleton
include RoutingHelper
- VERBS = {
- post: 'http://activitystrea.ms/schema/1.0/post',
- share: 'http://activitystrea.ms/schema/1.0/share',
- favorite: 'http://activitystrea.ms/schema/1.0/favorite',
- unfavorite: 'http://activitystrea.ms/schema/1.0/unfavorite',
- delete: 'http://activitystrea.ms/schema/1.0/delete',
- follow: 'http://activitystrea.ms/schema/1.0/follow',
- request_friend: 'http://activitystrea.ms/schema/1.0/request-friend',
- authorize: 'http://activitystrea.ms/schema/1.0/authorize',
- reject: 'http://activitystrea.ms/schema/1.0/reject',
- unfollow: 'http://ostatus.org/schema/1.0/unfollow',
- block: 'http://mastodon.social/schema/1.0/block',
- unblock: 'http://mastodon.social/schema/1.0/unblock',
- }.freeze
-
- TYPES = {
- activity: 'http://activitystrea.ms/schema/1.0/activity',
- note: 'http://activitystrea.ms/schema/1.0/note',
- comment: 'http://activitystrea.ms/schema/1.0/comment',
- person: 'http://activitystrea.ms/schema/1.0/person',
- collection: 'http://activitystrea.ms/schema/1.0/collection',
- group: 'http://activitystrea.ms/schema/1.0/group',
- }.freeze
-
- COLLECTIONS = {
- public: 'http://activityschema.org/collection/public',
- }.freeze
-
- XMLNS = 'http://www.w3.org/2005/Atom'
- MEDIA_XMLNS = 'http://purl.org/syndication/atommedia'
- AS_XMLNS = 'http://activitystrea.ms/spec/1.0/'
- THR_XMLNS = 'http://purl.org/syndication/thread/1.0'
- POCO_XMLNS = 'http://portablecontacts.net/spec/1.0'
- DFRN_XMLNS = 'http://purl.org/macgirvin/dfrn/1.0'
- OS_XMLNS = 'http://ostatus.org/schema/1.0'
- MTDN_XMLNS = 'http://mastodon.social/schema/1.0'
-
- def unique_tag(date, id, type)
- "tag:#{Rails.configuration.x.local_domain},#{date.strftime('%Y-%m-%d')}:objectId=#{id}:objectType=#{type}"
- end
-
- def unique_tag_to_local_id(tag, expected_type)
- return nil unless local_id?(tag)
-
- if ActivityPub::TagManager.instance.local_uri?(tag)
- ActivityPub::TagManager.instance.uri_to_local_id(tag)
- else
- matches = Regexp.new("objectId=([\\d]+):objectType=#{expected_type}").match(tag)
- return matches[1] unless matches.nil?
- end
- end
-
- def local_id?(id)
- id.start_with?("tag:#{Rails.configuration.x.local_domain}") || ActivityPub::TagManager.instance.local_uri?(id)
- end
-
def web_domain?(domain)
domain.nil? || domain.gsub(/[\/]/, '').casecmp(Rails.configuration.x.web_domain).zero?
end
@@ -87,18 +31,7 @@ class TagManager
def local_url?(url)
uri = Addressable::URI.parse(url).normalize
domain = uri.host + (uri.port ? ":#{uri.port}" : '')
- TagManager.instance.local_domain?(domain)
- end
-
- def uri_for(target)
- return target.uri if target.respond_to?(:local?) && !target.local?
-
- case target.object_type
- when :person
- account_url(target)
- when :note, :comment, :activity
- target.uri || unique_tag(target.created_at, target.id, 'Status')
- end
+ TagManager.instance.web_domain?(domain)
end
def url_for(target)
diff --git a/app/lib/themes.rb b/app/lib/themes.rb
new file mode 100644
index 0000000000..2dd188297e
--- /dev/null
+++ b/app/lib/themes.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'singleton'
+require 'yaml'
+
+class Themes
+ include Singleton
+
+ def initialize
+ result = Hash.new
+ Dir.glob(Rails.root.join('app', 'javascript', 'themes', '*', 'theme.yml')) do |path|
+ data = YAML.load_file(path)
+ if data['pack'] && data['name']
+ result[data['name']] = data
+ end
+ end
+ @conf = result
+ end
+
+ def names
+ @conf.keys
+ end
+end
diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb
index 62046ed726..3b156b98ce 100644
--- a/app/lib/user_settings_decorator.rb
+++ b/app/lib/user_settings_decorator.rb
@@ -25,6 +25,7 @@ class UserSettingsDecorator
user.settings['auto_play_gif'] = auto_play_gif_preference
user.settings['system_font_ui'] = system_font_ui_preference
user.settings['noindex'] = noindex_preference
+ user.settings['theme'] = theme_preference
end
def merged_notification_emails
@@ -67,6 +68,10 @@ class UserSettingsDecorator
boolean_cast_setting 'setting_noindex'
end
+ def theme_preference
+ settings['setting_theme']
+ end
+
def boolean_cast_setting(key)
settings[key] == '1'
end
diff --git a/app/mailers/notification_mailer.rb b/app/mailers/notification_mailer.rb
index 12b92bf451..80c9d8ccfa 100644
--- a/app/mailers/notification_mailer.rb
+++ b/app/mailers/notification_mailer.rb
@@ -8,6 +8,7 @@ class NotificationMailer < ApplicationMailer
@status = notification.target_status
locale_for_account(@me) do
+ thread_by_conversation(@status.conversation)
mail to: @me.user.email, subject: I18n.t('notification_mailer.mention.subject', name: @status.account.acct)
end
end
@@ -27,6 +28,7 @@ class NotificationMailer < ApplicationMailer
@status = notification.target_status
locale_for_account(@me) do
+ thread_by_conversation(@status.conversation)
mail to: @me.user.email, subject: I18n.t('notification_mailer.favourite.subject', name: @account.acct)
end
end
@@ -37,6 +39,7 @@ class NotificationMailer < ApplicationMailer
@status = notification.target_status
locale_for_account(@me) do
+ thread_by_conversation(@status.conversation)
mail to: @me.user.email, subject: I18n.t('notification_mailer.reblog.subject', name: @account.acct)
end
end
@@ -67,4 +70,13 @@ class NotificationMailer < ApplicationMailer
)
end
end
+
+ private
+
+ def thread_by_conversation(conversation)
+ return if conversation.nil?
+ msg_id = ""
+ headers['In-Reply-To'] = msg_id
+ headers['References'] = msg_id
+ end
end
diff --git a/app/models/account.rb b/app/models/account.rb
index ac27c7923f..de7998db43 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -52,7 +52,6 @@ class Account < ApplicationRecord
include AccountInteractions
include Attachmentable
include Remotable
- include EmojiHelper
MAX_NOTE_LENGTH = 500
@@ -106,6 +105,7 @@ class Account < ApplicationRecord
scope :by_domain_accounts, -> { group(:domain).select(:domain, 'COUNT(*) AS accounts_count').order('accounts_count desc') }
scope :matches_username, ->(value) { where(arel_table[:username].matches("#{value}%")) }
scope :matches_display_name, ->(value) { where(arel_table[:display_name].matches("#{value}%")) }
+ scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
delegate :email,
:current_sign_in_ip,
@@ -174,6 +174,10 @@ class Account < ApplicationRecord
end
class << self
+ def readonly_attributes
+ super - %w(statuses_count following_count followers_count)
+ end
+
def domains
reorder(nil).pluck('distinct accounts.domain')
end
@@ -266,9 +270,6 @@ class Account < ApplicationRecord
def prepare_contents
display_name&.strip!
note&.strip!
-
- self.display_name = emojify(display_name)
- self.note = emojify(note)
end
def generate_keys
diff --git a/app/models/concerns/remotable.rb b/app/models/concerns/remotable.rb
index 270043a9ef..990035b34b 100644
--- a/app/models/concerns/remotable.rb
+++ b/app/models/concerns/remotable.rb
@@ -27,9 +27,11 @@ module Remotable
matches = response.headers['content-disposition']&.match(/filename="([^"]*)"/)
filename = matches.nil? ? parsed_url.path.split('/').last : matches[1]
+ basename = SecureRandom.hex(8)
+ extname = File.extname(filename)
send("#{attachment_name}=", StringIO.new(response.to_s))
- send("#{attachment_name}_file_name=", filename)
+ send("#{attachment_name}_file_name=", basename + extname)
self[attribute_name] = url if has_attribute?(attribute_name)
rescue HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError, Paperclip::Errors::NotIdentifiedByImageMagickError, Addressable::URI::InvalidURIError => e
diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb
new file mode 100644
index 0000000000..e80c581553
--- /dev/null
+++ b/app/models/custom_emoji.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+# == Schema Information
+#
+# Table name: custom_emojis
+#
+# id :integer not null, primary key
+# shortcode :string default(""), not null
+# domain :string
+# image_file_name :string
+# image_content_type :string
+# image_file_size :integer
+# image_updated_at :datetime
+# created_at :datetime not null
+# updated_at :datetime not null
+#
+
+class CustomEmoji < ApplicationRecord
+ SHORTCODE_RE_FRAGMENT = '[a-zA-Z0-9_]{2,}'
+
+ SCAN_RE = /(?<=[^[:alnum:]:]|\n|^)
+ :(#{SHORTCODE_RE_FRAGMENT}):
+ (?=[^[:alnum:]:]|$)/x
+
+ has_attached_file :image
+
+ validates_attachment :image, content_type: { content_type: 'image/png' }, presence: true, size: { in: 0..50.kilobytes }
+ validates :shortcode, uniqueness: { scope: :domain }, format: { with: /\A#{SHORTCODE_RE_FRAGMENT}\z/ }, length: { minimum: 2 }
+
+ scope :local, -> { where(domain: nil) }
+
+ include Remotable
+
+ class << self
+ def from_text(text, domain)
+ return [] if text.blank?
+
+ shortcodes = text.scan(SCAN_RE).map(&:first).uniq
+
+ return [] if shortcodes.empty?
+
+ where(shortcode: shortcodes, domain: domain)
+ end
+ end
+end
diff --git a/app/models/instance_filter.rb b/app/models/instance_filter.rb
new file mode 100644
index 0000000000..5073cf1faa
--- /dev/null
+++ b/app/models/instance_filter.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class InstanceFilter
+ attr_reader :params
+
+ def initialize(params)
+ @params = params
+ end
+
+ def results
+ scope = Account.remote.by_domain_accounts
+ params.each do |key, value|
+ scope.merge!(scope_for(key, value)) if value.present?
+ end
+ scope
+ end
+
+ private
+
+ def scope_for(key, value)
+ case key.to_s
+ when 'domain_name'
+ Account.matches_domain(value)
+ else
+ raise "Unknown filter: #{key}"
+ end
+ end
+end
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index d83ca44f17..e4a974f968 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -25,6 +25,9 @@ class MediaAttachment < ApplicationRecord
enum type: [:image, :gifv, :video, :unknown]
+ IMAGE_FILE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif'].freeze
+ VIDEO_FILE_EXTENSIONS = ['.webm', '.mp4', '.m4v'].freeze
+
IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
VIDEO_MIME_TYPES = ['video/webm', 'video/mp4'].freeze
@@ -56,15 +59,21 @@ class MediaAttachment < ApplicationRecord
validates :account, presence: true
- scope :attached, -> { where.not(status_id: nil) }
+ scope :attached, -> { where.not(status_id: nil) }
scope :unattached, -> { where(status_id: nil) }
- scope :local, -> { where(remote_url: '') }
+ scope :local, -> { where(remote_url: '') }
+ scope :remote, -> { where.not(remote_url: '') }
+
default_scope { order(id: :asc) }
def local?
remote_url.blank?
end
+ def needs_redownload?
+ file.blank? && remote_url.present?
+ end
+
def to_param
shortcode
end
diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb
index b7efac354a..e2bf65d947 100644
--- a/app/models/preview_card.rb
+++ b/app/models/preview_card.rb
@@ -32,7 +32,7 @@ class PreviewCard < ApplicationRecord
has_and_belongs_to_many :statuses
- has_attached_file :image, styles: { original: '280x120>' }, convert_options: { all: '-quality 80 -strip' }
+ has_attached_file :image, styles: { original: '280x280>' }, convert_options: { all: '-quality 80 -strip' }
include Attachmentable
include Remotable
diff --git a/app/models/remote_profile.rb b/app/models/remote_profile.rb
index 93c7599309..613911c572 100644
--- a/app/models/remote_profile.rb
+++ b/app/models/remote_profile.rb
@@ -10,11 +10,11 @@ class RemoteProfile
end
def root
- @root ||= document.at_xpath('/atom:feed|/atom:entry', atom: TagManager::XMLNS)
+ @root ||= document.at_xpath('/atom:feed|/atom:entry', atom: OStatus::TagManager::XMLNS)
end
def author
- @author ||= root.at_xpath('./atom:author|./dfrn:owner', atom: TagManager::XMLNS, dfrn: TagManager::DFRN_XMLNS)
+ @author ||= root.at_xpath('./atom:author|./dfrn:owner', atom: OStatus::TagManager::XMLNS, dfrn: OStatus::TagManager::DFRN_XMLNS)
end
def hub_link
@@ -22,15 +22,15 @@ class RemoteProfile
end
def display_name
- @display_name ||= author.at_xpath('./poco:displayName', poco: TagManager::POCO_XMLNS)&.content
+ @display_name ||= author.at_xpath('./poco:displayName', poco: OStatus::TagManager::POCO_XMLNS)&.content
end
def note
- @note ||= author.at_xpath('./atom:summary|./poco:note', atom: TagManager::XMLNS, poco: TagManager::POCO_XMLNS)&.content
+ @note ||= author.at_xpath('./atom:summary|./poco:note', atom: OStatus::TagManager::XMLNS, poco: OStatus::TagManager::POCO_XMLNS)&.content
end
def scope
- @scope ||= author.at_xpath('./mastodon:scope', mastodon: TagManager::MTDN_XMLNS)&.content
+ @scope ||= author.at_xpath('./mastodon:scope', mastodon: OStatus::TagManager::MTDN_XMLNS)&.content
end
def avatar
@@ -48,6 +48,6 @@ class RemoteProfile
private
def link_href_from_xml(xml, type)
- xml.at_xpath(%(./atom:link[@rel="#{type}"]/@href), atom: TagManager::XMLNS)&.content
+ xml.at_xpath(%(./atom:link[@rel="#{type}"]/@href), atom: OStatus::TagManager::XMLNS)&.content
end
end
diff --git a/app/models/site_upload.rb b/app/models/site_upload.rb
new file mode 100644
index 0000000000..8ffdc83131
--- /dev/null
+++ b/app/models/site_upload.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+# == Schema Information
+#
+# Table name: site_uploads
+#
+# id :integer not null, primary key
+# var :string default(""), not null
+# file_file_name :string
+# file_content_type :string
+# file_file_size :integer
+# file_updated_at :datetime
+# meta :json
+# created_at :datetime not null
+# updated_at :datetime not null
+#
+
+class SiteUpload < ApplicationRecord
+ has_attached_file :file
+
+ validates_attachment_content_type :file, content_type: /\Aimage\/.*\z/
+ validates :var, presence: true, uniqueness: true
+
+ before_save :set_meta
+ after_commit :clear_cache
+
+ def cache_key
+ "site_uploads/#{var}"
+ end
+
+ private
+
+ def set_meta
+ tempfile = file.queued_for_write[:original]
+
+ return if tempfile.nil?
+
+ geometry = Paperclip::Geometry.from_file(tempfile)
+ self.meta = { width: geometry.width.to_i, height: geometry.height.to_i }
+ end
+
+ def clear_cache
+ Rails.cache.delete(cache_key)
+ end
+end
diff --git a/app/models/status.rb b/app/models/status.rb
index 514cab2e4d..ea4c097bfc 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -30,7 +30,6 @@ class Status < ApplicationRecord
include Streamable
include Cacheable
include StatusThreadingConcern
- include EmojiHelper
enum visibility: [:public, :unlisted, :private, :direct], _suffix: :visibility
@@ -55,7 +54,7 @@ class Status < ApplicationRecord
has_one :notification, as: :activity, dependent: :destroy
has_one :stream_entry, as: :activity, inverse_of: :status
- validates :uri, uniqueness: true, unless: :local?
+ validates :uri, uniqueness: true, presence: true, unless: :local?
validates :text, presence: true, unless: :reblog?
validates_with StatusLengthValidator
validates :reblog, uniqueness: { scope: :account }, if: :reblog?
@@ -70,7 +69,6 @@ class Status < ApplicationRecord
scope :without_reblogs, -> { where('statuses.reblog_of_id IS NULL') }
scope :with_public_visibility, -> { where(visibility: :public) }
scope :tagged_with, ->(tag) { joins(:statuses_tags).where(statuses_tags: { tag_id: tag }) }
- scope :local_only, -> { left_outer_joins(:account).where(accounts: { domain: nil }) }
scope :excluding_silenced_accounts, -> { left_outer_joins(:account).where(accounts: { silenced: false }) }
scope :including_silenced_accounts, -> { left_outer_joins(:account).where(accounts: { silenced: true }) }
scope :not_excluded_by_account, ->(account) { where.not(account_id: account.excluded_from_timeline_account_ids) }
@@ -132,6 +130,10 @@ class Status < ApplicationRecord
!sensitive? && media_attachments.any?
end
+ def emojis
+ CustomEmoji.from_text([spoiler_text, text].join(' '), account.domain)
+ end
+
after_create :store_uri, if: :local?
before_validation :prepare_contents, if: :local?
@@ -143,7 +145,7 @@ class Status < ApplicationRecord
class << self
def not_in_filtered_languages(account)
- where.not(language: account.filtered_languages)
+ where(language: nil).or where.not(language: account.filtered_languages)
end
def as_home_timeline(account)
@@ -221,7 +223,7 @@ class Status < ApplicationRecord
private
def timeline_scope(local_only = false)
- starting_scope = local_only ? Status.local_only : Status
+ starting_scope = local_only ? Status.local : Status
starting_scope
.with_public_visibility
.without_reblogs
@@ -264,9 +266,6 @@ class Status < ApplicationRecord
def prepare_contents
text&.strip!
spoiler_text&.strip!
-
- self.text = emojify(text)
- self.spoiler_text = emojify(spoiler_text)
end
def set_reblog
diff --git a/app/models/user.rb b/app/models/user.rb
index 5e548c1efb..3bf069a315 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -110,6 +110,10 @@ class User < ApplicationRecord
settings.noindex
end
+ def setting_theme
+ settings.theme
+ end
+
def token_for_app(a)
return nil if a.nil? || a.owner != self
Doorkeeper::AccessToken
diff --git a/app/presenters/activitypub/collection_presenter.rb b/app/presenters/activitypub/collection_presenter.rb
index 631d87cd03..39657276f7 100644
--- a/app/presenters/activitypub/collection_presenter.rb
+++ b/app/presenters/activitypub/collection_presenter.rb
@@ -1,5 +1,5 @@
# frozen_string_literal: true
class ActivityPub::CollectionPresenter < ActiveModelSerializers::Model
- attributes :id, :type, :size, :items
+ attributes :id, :type, :size, :items, :part_of, :first, :next, :prev
end
diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb
index b1afb9e1ff..1c08fb3bc0 100644
--- a/app/presenters/instance_presenter.rb
+++ b/app/presenters/instance_presenter.rb
@@ -21,7 +21,7 @@ class InstancePresenter
end
def status_count
- Rails.cache.fetch('local_status_count') { Status.local.count }
+ Rails.cache.fetch('local_status_count') { Account.local.sum(:statuses_count) }
end
def domain_count
@@ -44,4 +44,8 @@ class InstancePresenter
def source_url
Mastodon::Version.source_url
end
+
+ def thumbnail
+ @thumbnail ||= Rails.cache.fetch('site_uploads/thumbnail') { SiteUpload.find_by(var: 'thumbnail') }
+ end
end
diff --git a/app/presenters/status_relationships_presenter.rb b/app/presenters/status_relationships_presenter.rb
index 10b4495048..bc3887a446 100644
--- a/app/presenters/status_relationships_presenter.rb
+++ b/app/presenters/status_relationships_presenter.rb
@@ -11,7 +11,7 @@ class StatusRelationshipsPresenter
@pins_map = {}
else
statuses = statuses.compact
- status_ids = statuses.flat_map { |s| [s.id, s.reblog_of_id] }.uniq
+ status_ids = statuses.flat_map { |s| [s.id, s.reblog_of_id] }.uniq.compact
conversation_ids = statuses.map(&:conversation_id).compact.uniq
pinnable_status_ids = statuses.map(&:proper).select { |s| s.account_id == current_account_id && %w(public unlisted).include?(s.visibility) }.map(&:id)
diff --git a/app/serializers/activitypub/activity_serializer.rb b/app/serializers/activitypub/activity_serializer.rb
index 349495e84e..b252e008bd 100644
--- a/app/serializers/activitypub/activity_serializer.rb
+++ b/app/serializers/activitypub/activity_serializer.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class ActivityPub::ActivitySerializer < ActiveModel::Serializer
- attributes :id, :type, :actor, :to, :cc
+ attributes :id, :type, :actor, :published, :to, :cc
has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer
@@ -17,6 +17,10 @@ class ActivityPub::ActivitySerializer < ActiveModel::Serializer
ActivityPub::TagManager.instance.uri_for(object.account)
end
+ def published
+ object.created_at.iso8601
+ end
+
def to
ActivityPub::TagManager.instance.to(object)
end
diff --git a/app/serializers/activitypub/collection_serializer.rb b/app/serializers/activitypub/collection_serializer.rb
index d01dead289..9832133fc0 100644
--- a/app/serializers/activitypub/collection_serializer.rb
+++ b/app/serializers/activitypub/collection_serializer.rb
@@ -3,23 +3,38 @@
class ActivityPub::CollectionSerializer < ActiveModel::Serializer
def self.serializer_for(model, options)
return ActivityPub::ActivitySerializer if model.class.name == 'Status'
+ return ActivityPub::CollectionSerializer if model.class.name == 'ActivityPub::CollectionPresenter'
super
end
attributes :id, :type, :total_items
+ attribute :next, if: -> { object.next.present? }
+ attribute :prev, if: -> { object.prev.present? }
+ attribute :part_of, if: -> { object.part_of.present? }
- has_many :items, key: :ordered_items
+ has_one :first, if: -> { object.first.present? }
+ has_many :items, key: :items, if: -> { (object.items.present? || page?) && !ordered? }
+ has_many :items, key: :ordered_items, if: -> { (object.items.present? || page?) && ordered? }
def type
- case object.type
- when :ordered
- 'OrderedCollection'
+ if page?
+ ordered? ? 'OrderedCollectionPage' : 'CollectionPage'
else
- 'Collection'
+ ordered? ? 'OrderedCollection' : 'Collection'
end
end
def total_items
object.size
end
+
+ private
+
+ def ordered?
+ object.type == :ordered
+ end
+
+ def page?
+ object.part_of.present?
+ end
end
diff --git a/app/serializers/activitypub/delete_serializer.rb b/app/serializers/activitypub/delete_serializer.rb
index 87a43b95dc..2bb65135f7 100644
--- a/app/serializers/activitypub/delete_serializer.rb
+++ b/app/serializers/activitypub/delete_serializer.rb
@@ -13,7 +13,7 @@ class ActivityPub::DeleteSerializer < ActiveModel::Serializer
end
def atom_uri
- ::TagManager.instance.uri_for(object)
+ OStatus::TagManager.instance.uri_for(object)
end
end
diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb
index d42f542639..f94c3b9dc0 100644
--- a/app/serializers/activitypub/note_serializer.rb
+++ b/app/serializers/activitypub/note_serializer.rb
@@ -27,7 +27,7 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
end
def in_reply_to
- return unless object.reply?
+ return unless object.reply? && !object.thread.nil?
if object.thread.uri.nil? || object.thread.uri.start_with?('http')
ActivityPub::TagManager.instance.uri_for(object.thread)
@@ -57,26 +57,28 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
end
def virtual_tags
- object.mentions + object.tags
+ object.mentions + object.tags + object.emojis
end
def atom_uri
return unless object.local?
- ::TagManager.instance.uri_for(object)
+ OStatus::TagManager.instance.uri_for(object)
end
def in_reply_to_atom_uri
- return unless object.reply?
+ return unless object.reply? && !object.thread.nil?
- ::TagManager.instance.uri_for(object.thread)
+ OStatus::TagManager.instance.uri_for(object.thread)
end
def conversation
+ return if object.conversation.nil?
+
if object.conversation.uri?
object.conversation.uri
else
- TagManager.instance.unique_tag(object.conversation.created_at, object.conversation.id, 'Conversation')
+ OStatus::TagManager.instance.unique_tag(object.conversation.created_at, object.conversation.id, 'Conversation')
end
end
@@ -135,4 +137,22 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
"##{object.name}"
end
end
+
+ class CustomEmojiSerializer < ActiveModel::Serializer
+ include RoutingHelper
+
+ attributes :type, :href, :name
+
+ def type
+ 'Emoji'
+ end
+
+ def href
+ full_asset_url(object.image.url)
+ end
+
+ def name
+ ":#{object.shortcode}:"
+ end
+ end
end
diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb
index 32ffcc6880..e2f15a6010 100644
--- a/app/serializers/initial_state_serializer.rb
+++ b/app/serializers/initial_state_serializer.rb
@@ -4,17 +4,23 @@ class InitialStateSerializer < ActiveModel::Serializer
attributes :meta, :compose, :accounts,
:media_attachments, :settings, :push_subscription
+ has_many :custom_emojis, serializer: REST::CustomEmojiSerializer
+
+ def custom_emojis
+ CustomEmoji.local
+ end
+
def meta
store = {
streaming_api_base_url: Rails.configuration.x.streaming_api_base_url,
access_token: object.token,
locale: I18n.locale,
domain: Rails.configuration.x.local_domain,
- admin: object.admin&.id,
+ admin: object.admin&.id&.to_s,
}
if object.current_account
- store[:me] = object.current_account.id
+ store[:me] = object.current_account.id.to_s
store[:unfollow_modal] = object.current_account.user.setting_unfollow_modal
store[:boost_modal] = object.current_account.user.setting_boost_modal
store[:delete_modal] = object.current_account.user.setting_delete_modal
@@ -28,7 +34,7 @@ class InitialStateSerializer < ActiveModel::Serializer
store = {}
if object.current_account
- store[:me] = object.current_account.id
+ store[:me] = object.current_account.id.to_s
store[:default_privacy] = object.current_account.user.setting_default_privacy
store[:default_sensitive] = object.current_account.user.setting_default_sensitive
end
@@ -40,12 +46,12 @@ class InitialStateSerializer < ActiveModel::Serializer
def accounts
store = {}
- store[object.current_account.id] = ActiveModelSerializers::SerializableResource.new(object.current_account, serializer: REST::AccountSerializer) if object.current_account
- store[object.admin.id] = ActiveModelSerializers::SerializableResource.new(object.admin, serializer: REST::AccountSerializer) if object.admin
+ store[object.current_account.id.to_s] = ActiveModelSerializers::SerializableResource.new(object.current_account, serializer: REST::AccountSerializer) if object.current_account
+ store[object.admin.id.to_s] = ActiveModelSerializers::SerializableResource.new(object.admin, serializer: REST::AccountSerializer) if object.admin
store
end
def media_attachments
- { accept_content_types: MediaAttachment::IMAGE_MIME_TYPES + MediaAttachment::VIDEO_MIME_TYPES }
+ { accept_content_types: MediaAttachment::IMAGE_FILE_EXTENSIONS + MediaAttachment::VIDEO_FILE_EXTENSIONS + MediaAttachment::IMAGE_MIME_TYPES + MediaAttachment::VIDEO_MIME_TYPES }
end
end
diff --git a/app/serializers/oembed_serializer.rb b/app/serializers/oembed_serializer.rb
index af03fd47ac..0c8350e2d2 100644
--- a/app/serializers/oembed_serializer.rb
+++ b/app/serializers/oembed_serializer.rb
@@ -45,7 +45,7 @@ class OEmbedSerializer < ActiveModel::Serializer
height: height,
}
- content_tag(:iframe, nil, attributes) + content_tag(:script, nil, src: full_asset_url('embed.js'), async: true)
+ content_tag(:iframe, nil, attributes) + content_tag(:script, nil, src: full_asset_url('embed.js', skip_pipeline: true), async: true)
end
def width
diff --git a/app/serializers/rest/account_serializer.rb b/app/serializers/rest/account_serializer.rb
index 012a4fd18a..65fdb03081 100644
--- a/app/serializers/rest/account_serializer.rb
+++ b/app/serializers/rest/account_serializer.rb
@@ -7,6 +7,10 @@ class REST::AccountSerializer < ActiveModel::Serializer
:note, :url, :avatar, :avatar_static, :header, :header_static,
:followers_count, :following_count, :statuses_count
+ def id
+ object.id.to_s
+ end
+
def note
Formatter.instance.simplified_format(object)
end
diff --git a/app/serializers/rest/application_serializer.rb b/app/serializers/rest/application_serializer.rb
index 868a62f1e7..a8945f66ea 100644
--- a/app/serializers/rest/application_serializer.rb
+++ b/app/serializers/rest/application_serializer.rb
@@ -4,6 +4,10 @@ class REST::ApplicationSerializer < ActiveModel::Serializer
attributes :id, :name, :website, :redirect_uri,
:client_id, :client_secret
+ def id
+ object.id.to_s
+ end
+
def client_id
object.uid
end
diff --git a/app/serializers/rest/custom_emoji_serializer.rb b/app/serializers/rest/custom_emoji_serializer.rb
new file mode 100644
index 0000000000..b744dd4ec5
--- /dev/null
+++ b/app/serializers/rest/custom_emoji_serializer.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class REST::CustomEmojiSerializer < ActiveModel::Serializer
+ include RoutingHelper
+
+ attributes :shortcode, :url
+
+ def url
+ full_asset_url(object.image.url)
+ end
+end
diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb
index a971379094..2898011fd8 100644
--- a/app/serializers/rest/instance_serializer.rb
+++ b/app/serializers/rest/instance_serializer.rb
@@ -1,8 +1,10 @@
# frozen_string_literal: true
class REST::InstanceSerializer < ActiveModel::Serializer
+ include RoutingHelper
+
attributes :uri, :title, :description, :email,
- :version, :urls, :stats
+ :version, :urls, :stats, :thumbnail
def uri
Rails.configuration.x.local_domain
@@ -24,6 +26,10 @@ class REST::InstanceSerializer < ActiveModel::Serializer
Mastodon::Version.to_s
end
+ def thumbnail
+ full_asset_url(instance_presenter.thumbnail.file.url) if instance_presenter.thumbnail
+ end
+
def stats
{
user_count: instance_presenter.user_count,
diff --git a/app/serializers/rest/media_attachment_serializer.rb b/app/serializers/rest/media_attachment_serializer.rb
index 9055b8db47..f6e7c79d1f 100644
--- a/app/serializers/rest/media_attachment_serializer.rb
+++ b/app/serializers/rest/media_attachment_serializer.rb
@@ -6,12 +6,24 @@ class REST::MediaAttachmentSerializer < ActiveModel::Serializer
attributes :id, :type, :url, :preview_url,
:remote_url, :text_url, :meta
+ def id
+ object.id.to_s
+ end
+
def url
- full_asset_url(object.file.url(:original))
+ if object.needs_redownload?
+ media_proxy_url(object.id, :original)
+ else
+ full_asset_url(object.file.url(:original))
+ end
end
def preview_url
- full_asset_url(object.file.url(:small))
+ if object.needs_redownload?
+ media_proxy_url(object.id, :small)
+ else
+ full_asset_url(object.file.url(:small))
+ end
end
def text_url
diff --git a/app/serializers/rest/notification_serializer.rb b/app/serializers/rest/notification_serializer.rb
index f95d099a31..541a6b8b5c 100644
--- a/app/serializers/rest/notification_serializer.rb
+++ b/app/serializers/rest/notification_serializer.rb
@@ -6,6 +6,10 @@ class REST::NotificationSerializer < ActiveModel::Serializer
belongs_to :from_account, key: :account, serializer: REST::AccountSerializer
belongs_to :target_status, key: :status, if: :status_type?, serializer: REST::StatusSerializer
+ def id
+ object.id.to_s
+ end
+
def status_type?
[:favourite, :reblog, :mention].include?(object.type)
end
diff --git a/app/serializers/rest/relationship_serializer.rb b/app/serializers/rest/relationship_serializer.rb
index 1d431aa1b6..998727e37a 100644
--- a/app/serializers/rest/relationship_serializer.rb
+++ b/app/serializers/rest/relationship_serializer.rb
@@ -4,6 +4,10 @@ class REST::RelationshipSerializer < ActiveModel::Serializer
attributes :id, :following, :followed_by, :blocking,
:muting, :requested, :domain_blocking
+ def id
+ object.id.to_s
+ end
+
def following
instance_options[:relationships].following[object.id] || false
end
diff --git a/app/serializers/rest/report_serializer.rb b/app/serializers/rest/report_serializer.rb
index 0c6bd65567..ecb88d653f 100644
--- a/app/serializers/rest/report_serializer.rb
+++ b/app/serializers/rest/report_serializer.rb
@@ -2,4 +2,8 @@
class REST::ReportSerializer < ActiveModel::Serializer
attributes :id, :action_taken
+
+ def id
+ object.id.to_s
+ end
end
diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb
index 298a3bb40f..e6270f9024 100644
--- a/app/serializers/rest/status_serializer.rb
+++ b/app/serializers/rest/status_serializer.rb
@@ -17,13 +17,26 @@ class REST::StatusSerializer < ActiveModel::Serializer
has_many :media_attachments, serializer: REST::MediaAttachmentSerializer
has_many :mentions
has_many :tags
+ has_many :emojis, serializer: REST::CustomEmojiSerializer
+
+ def id
+ object.id.to_s
+ end
+
+ def in_reply_to_id
+ object.in_reply_to_id&.to_s
+ end
+
+ def in_reply_to_account_id
+ object.in_reply_to_account_id&.to_s
+ end
def current_user?
!current_user.nil?
end
def uri
- TagManager.instance.uri_for(object)
+ OStatus::TagManager.instance.uri_for(object)
end
def content
@@ -81,7 +94,7 @@ class REST::StatusSerializer < ActiveModel::Serializer
attributes :id, :username, :url, :acct
def id
- object.account_id
+ object.account_id.to_s
end
def username
diff --git a/app/services/activitypub/fetch_remote_status_service.rb b/app/services/activitypub/fetch_remote_status_service.rb
index 68ca58d629..a95931afe0 100644
--- a/app/services/activitypub/fetch_remote_status_service.rb
+++ b/app/services/activitypub/fetch_remote_status_service.rb
@@ -17,6 +17,8 @@ class ActivityPub::FetchRemoteStatusService < BaseService
actor = ActivityPub::TagManager.instance.uri_to_resource(actor_id, Account)
actor = ActivityPub::FetchRemoteAccountService.new.call(actor_id) if actor.nil?
+ return if actor.suspended?
+
ActivityPub::Activity.factory(activity, actor).perform
end
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index b54e447ad0..8112095377 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -12,12 +12,21 @@ class ActivityPub::ProcessAccountService < BaseService
@uri = @json['id']
@username = username
@domain = domain
- @account = Account.find_by(uri: @uri)
@collections = {}
- create_account if @account.nil?
- upgrade_account if @account.ostatus?
- update_account
+ RedisLock.acquire(lock_options) do |lock|
+ if lock.acquired?
+ @account = Account.find_by(uri: @uri)
+ @old_public_key = @account&.public_key
+ @old_protocol = @account&.protocol
+
+ create_account if @account.nil?
+ update_account
+ end
+ end
+
+ after_protocol_change! if protocol_changed?
+ after_key_change! if key_changed?
@account
rescue Oj::ParseError
@@ -35,33 +44,46 @@ class ActivityPub::ProcessAccountService < BaseService
@account.suspended = true if auto_suspend?
@account.silenced = true if auto_silence?
@account.private_key = nil
- @account.save!
end
def update_account
@account.last_webfingered_at = Time.now.utc
@account.protocol = :activitypub
- @account.inbox_url = @json['inbox'] || ''
- @account.outbox_url = @json['outbox'] || ''
- @account.shared_inbox_url = (@json['endpoints'].is_a?(Hash) ? @json['endpoints']['sharedInbox'] : @json['sharedInbox']) || ''
- @account.followers_url = @json['followers'] || ''
- @account.url = url || @uri
- @account.display_name = @json['name'] || ''
- @account.note = @json['summary'] || ''
- @account.avatar_remote_url = image_url('icon') unless skip_download?
- @account.header_remote_url = image_url('image') unless skip_download?
- @account.public_key = public_key || ''
- @account.locked = @json['manuallyApprovesFollowers'] || false
- @account.statuses_count = outbox_total_items if outbox_total_items.present?
- @account.following_count = following_total_items if following_total_items.present?
- @account.followers_count = followers_total_items if followers_total_items.present?
+
+ set_immediate_attributes!
+ set_fetchable_attributes!
+
@account.save_with_optional_media!
end
- def upgrade_account
+ def set_immediate_attributes!
+ @account.inbox_url = @json['inbox'] || ''
+ @account.outbox_url = @json['outbox'] || ''
+ @account.shared_inbox_url = (@json['endpoints'].is_a?(Hash) ? @json['endpoints']['sharedInbox'] : @json['sharedInbox']) || ''
+ @account.followers_url = @json['followers'] || ''
+ @account.url = url || @uri
+ @account.display_name = @json['name'] || ''
+ @account.note = @json['summary'] || ''
+ @account.locked = @json['manuallyApprovesFollowers'] || false
+ end
+
+ def set_fetchable_attributes!
+ @account.avatar_remote_url = image_url('icon') unless skip_download?
+ @account.header_remote_url = image_url('image') unless skip_download?
+ @account.public_key = public_key || ''
+ @account.statuses_count = outbox_total_items if outbox_total_items.present?
+ @account.following_count = following_total_items if following_total_items.present?
+ @account.followers_count = followers_total_items if followers_total_items.present?
+ end
+
+ def after_protocol_change!
ActivityPub::PostUpgradeWorker.perform_async(@account.domain)
end
+ def after_key_change!
+ RefollowWorker.perform_async(@account.id)
+ end
+
def image_url(key)
value = first_of_value(@json[key])
@@ -120,15 +142,27 @@ class ActivityPub::ProcessAccountService < BaseService
end
def auto_suspend?
- domain_block && domain_block.suspend?
+ domain_block&.suspend?
end
def auto_silence?
- domain_block && domain_block.silence?
+ domain_block&.silence?
end
def domain_block
return @domain_block if defined?(@domain_block)
@domain_block = DomainBlock.find_by(domain: @domain)
end
+
+ def key_changed?
+ !@old_public_key.nil? && @old_public_key != @account.public_key
+ end
+
+ def protocol_changed?
+ !@old_protocol.nil? && @old_protocol != @account.protocol
+ end
+
+ def lock_options
+ { redis: Redis.current, key: "process_account:#{@uri}" }
+ end
end
diff --git a/app/services/activitypub/process_collection_service.rb b/app/services/activitypub/process_collection_service.rb
index bc04c50ba1..59cb65c65e 100644
--- a/app/services/activitypub/process_collection_service.rb
+++ b/app/services/activitypub/process_collection_service.rb
@@ -7,9 +7,9 @@ class ActivityPub::ProcessCollectionService < BaseService
@account = account
@json = Oj.load(body, mode: :strict)
- return if @account.suspended? || !supported_context?
-
+ return unless supported_context?
return if different_actor? && verify_account!.nil?
+ return if @account.suspended? || @account.local?
case @json['type']
when 'Collection', 'CollectionPage'
diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb
index 86eaa5735f..2fd623922f 100644
--- a/app/services/batched_remove_status_service.rb
+++ b/app/services/batched_remove_status_service.rb
@@ -18,7 +18,7 @@ class BatchedRemoveStatusService < BaseService
@stream_entry_batches = []
@salmon_batches = []
@activity_json_batches = []
- @json_payloads = statuses.map { |s| [s.id, Oj.dump(event: :delete, payload: s.id)] }.to_h
+ @json_payloads = statuses.map { |s| [s.id, Oj.dump(event: :delete, payload: s.id.to_s)] }.to_h
@activity_json = {}
@activity_xml = {}
@@ -84,6 +84,8 @@ class BatchedRemoveStatusService < BaseService
end
def unpush_from_public_timelines(status)
+ return unless status.public_visibility?
+
payload = @json_payloads[status.id]
redis.pipelined do
diff --git a/app/services/block_domain_service.rb b/app/services/block_domain_service.rb
index 1473bc841f..eefdc0dbf9 100644
--- a/app/services/block_domain_service.rb
+++ b/app/services/block_domain_service.rb
@@ -26,6 +26,7 @@ class BlockDomainService < BaseService
def clear_media!
clear_account_images
clear_account_attachments
+ clear_emojos
end
def suspend_accounts!
@@ -51,6 +52,10 @@ class BlockDomainService < BaseService
end
end
+ def clear_emojos
+ emojis_from_blocked_domains.destroy_all
+ end
+
def blocked_domain
domain_block.domain
end
@@ -62,4 +67,8 @@ class BlockDomainService < BaseService
def media_from_blocked_domain
MediaAttachment.joins(:account).merge(blocked_domain_accounts).reorder(nil)
end
+
+ def emojis_from_blocked_domains
+ CustomEmoji.where(domain: blocked_domain)
+ end
end
diff --git a/app/services/concerns/author_extractor.rb b/app/services/concerns/author_extractor.rb
index 867d6dc259..c2366188ab 100644
--- a/app/services/concerns/author_extractor.rb
+++ b/app/services/concerns/author_extractor.rb
@@ -5,12 +5,12 @@ module AuthorExtractor
return nil if xml.nil?
# Try for acct
- acct = xml.at_xpath('./xmlns:author/xmlns:email', xmlns: TagManager::XMLNS)&.content
+ acct = xml.at_xpath('./xmlns:author/xmlns:email', xmlns: OStatus::TagManager::XMLNS)&.content
# Try +
if acct.blank?
- username = xml.at_xpath('./xmlns:author/xmlns:name', xmlns: TagManager::XMLNS)&.content
- uri = xml.at_xpath('./xmlns:author/xmlns:uri', xmlns: TagManager::XMLNS)&.content
+ username = xml.at_xpath('./xmlns:author/xmlns:name', xmlns: OStatus::TagManager::XMLNS)&.content
+ uri = xml.at_xpath('./xmlns:author/xmlns:uri', xmlns: OStatus::TagManager::XMLNS)&.content
return nil if username.blank? || uri.blank?
diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb
index c38e9e7dfb..4acbfae7a0 100644
--- a/app/services/fetch_link_card_service.rb
+++ b/app/services/fetch_link_card_service.rb
@@ -1,7 +1,15 @@
# frozen_string_literal: true
class FetchLinkCardService < BaseService
- URL_PATTERN = %r{https?://\S+}
+ URL_PATTERN = %r{
+ ( # $1 URL
+ (https?:\/\/)? # $2 Protocol (optional)
+ (#{Twitter::Regex[:valid_domain]}) # $3 Domain(s)
+ (?::(#{Twitter::Regex[:valid_port_number]}))? # $4 Port number (optional)
+ (/#{Twitter::Regex[:valid_url_path]}*)? # $5 URL Path and anchor
+ (\?#{Twitter::Regex[:valid_url_query_chars]}*#{Twitter::Regex[:valid_url_query_ending_chars]})? # $6 Query String
+ )
+ }iox
def call(status)
@status = status
@@ -14,11 +22,11 @@ class FetchLinkCardService < BaseService
RedisLock.acquire(lock_options) do |lock|
if lock.acquired?
@card = PreviewCard.find_by(url: @url)
- process_url if @card.nil?
+ process_url if @card.nil? || @card.updated_at <= 2.weeks.ago
end
end
- attach_card unless @card.nil?
+ attach_card if @card&.persisted?
rescue HTTP::ConnectionError, OpenSSL::SSL::SSLError
nil
end
@@ -26,8 +34,8 @@ class FetchLinkCardService < BaseService
private
def process_url
- @card = PreviewCard.new(url: @url)
- res = Request.new(:head, @url).perform
+ @card ||= PreviewCard.new(url: @url)
+ res = Request.new(:head, @url).perform
return if res.code != 200 || res.mime_type != 'text/html'
@@ -40,7 +48,7 @@ class FetchLinkCardService < BaseService
def parse_urls
if @status.local?
- urls = @status.text.match(URL_PATTERN).to_a.map { |uri| Addressable::URI.parse(uri).normalize }
+ urls = @status.text.scan(URL_PATTERN).map { |array| Addressable::URI.parse(array[0]).normalize }
else
html = Nokogiri::HTML(@status.text)
links = html.css('a')
@@ -106,12 +114,25 @@ class FetchLinkCardService < BaseService
guess = detector.detect(html, response.charset)
page = Nokogiri::HTML(html, nil, guess&.fetch(:encoding))
- @card.type = :link
- @card.title = meta_property(page, 'og:title') || page.at_xpath('//title')&.content || ''
- @card.description = meta_property(page, 'og:description') || meta_property(page, 'description') || ''
- @card.image_remote_url = meta_property(page, 'og:image') if meta_property(page, 'og:image')
+ if meta_property(page, 'twitter:player')
+ @card.type = :video
+ @card.width = meta_property(page, 'twitter:player:width') || 0
+ @card.height = meta_property(page, 'twitter:player:height') || 0
+ @card.html = content_tag(:iframe, nil, src: meta_property(page, 'twitter:player'),
+ width: @card.width,
+ height: @card.height,
+ allowtransparency: 'true',
+ scrolling: 'no',
+ frameborder: '0')
+ else
+ @card.type = :link
+ @card.image_remote_url = meta_property(page, 'og:image') if meta_property(page, 'og:image')
+ end
- return if @card.title.blank?
+ @card.title = meta_property(page, 'og:title').presence || page.at_xpath('//title')&.content || ''
+ @card.description = meta_property(page, 'og:description').presence || meta_property(page, 'description') || ''
+
+ return if @card.title.blank? && @card.html.blank?
@card.save_with_optional_image!
end
diff --git a/app/services/fetch_remote_account_service.rb b/app/services/fetch_remote_account_service.rb
index 7c618a0b0c..bd98e70d1b 100644
--- a/app/services/fetch_remote_account_service.rb
+++ b/app/services/fetch_remote_account_service.rb
@@ -25,7 +25,7 @@ class FetchRemoteAccountService < BaseService
xml = Nokogiri::XML(body)
xml.encoding = 'utf-8'
- account = author_from_xml(xml.at_xpath('/xmlns:feed', xmlns: TagManager::XMLNS), false)
+ account = author_from_xml(xml.at_xpath('/xmlns:feed', xmlns: OStatus::TagManager::XMLNS), false)
UpdateRemoteProfileService.new.call(xml, account) unless account.nil?
diff --git a/app/services/fetch_remote_status_service.rb b/app/services/fetch_remote_status_service.rb
index 18af18059b..1b90854c4a 100644
--- a/app/services/fetch_remote_status_service.rb
+++ b/app/services/fetch_remote_status_service.rb
@@ -27,7 +27,7 @@ class FetchRemoteStatusService < BaseService
xml = Nokogiri::XML(body)
xml.encoding = 'utf-8'
- account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: TagManager::XMLNS))
+ account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: OStatus::TagManager::XMLNS))
domain = Addressable::URI.parse(url).normalized_host
return nil unless !account.nil? && confirmed_domain?(domain, account)
diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
index e5b0fe438e..d1b8f42c77 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -28,7 +28,7 @@ class PostStatusService < BaseService
sensitive: options[:sensitive],
spoiler_text: options[:spoiler_text] || '',
visibility: options[:visibility] || account.user&.setting_default_privacy,
- language: detect_language_for(text, account),
+ language: LanguageDetector.instance.detect(text, account),
application: options[:application])
attach_media(status, media)
@@ -73,10 +73,6 @@ class PostStatusService < BaseService
media.update(status_id: status.id)
end
- def detect_language_for(text, account)
- LanguageDetector.new(text, account).to_iso_s
- end
-
def process_mentions_service
@process_mentions_service ||= ProcessMentionsService.new
end
diff --git a/app/services/process_feed_service.rb b/app/services/process_feed_service.rb
index 31191a818f..2a5f1e2bc4 100644
--- a/app/services/process_feed_service.rb
+++ b/app/services/process_feed_service.rb
@@ -16,7 +16,7 @@ class ProcessFeedService < BaseService
end
def process_entries(xml, account)
- xml.xpath('//xmlns:entry', xmlns: TagManager::XMLNS).reverse_each.map { |entry| process_entry(entry, account) }.compact
+ xml.xpath('//xmlns:entry', xmlns: OStatus::TagManager::XMLNS).reverse_each.map { |entry| process_entry(entry, account) }.compact
end
def process_entry(xml, account)
diff --git a/app/services/process_interaction_service.rb b/app/services/process_interaction_service.rb
index d04e926e7d..1fca3832b7 100644
--- a/app/services/process_interaction_service.rb
+++ b/app/services/process_interaction_service.rb
@@ -13,7 +13,7 @@ class ProcessInteractionService < BaseService
xml = Nokogiri::XML(body)
xml.encoding = 'utf-8'
- account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: TagManager::XMLNS))
+ account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: OStatus::TagManager::XMLNS))
return if account.nil? || account.suspended?
@@ -54,13 +54,13 @@ class ProcessInteractionService < BaseService
private
def mentions_account?(xml, account)
- xml.xpath('/xmlns:entry/xmlns:link[@rel="mentioned"]', xmlns: TagManager::XMLNS).each { |mention_link| return true if [TagManager.instance.uri_for(account), TagManager.instance.url_for(account)].include?(mention_link.attribute('href').value) }
+ xml.xpath('/xmlns:entry/xmlns:link[@rel="mentioned"]', xmlns: OStatus::TagManager::XMLNS).each { |mention_link| return true if [OStatus::TagManager.instance.uri_for(account), OStatus::TagManager.instance.url_for(account)].include?(mention_link.attribute('href').value) }
false
end
def verb(xml)
- raw = xml.at_xpath('//activity:verb', activity: TagManager::AS_XMLNS).content
- TagManager::VERBS.key(raw)
+ raw = xml.at_xpath('//activity:verb', activity: OStatus::TagManager::AS_XMLNS).content
+ OStatus::TagManager::VERBS.key(raw)
rescue
:post
end
@@ -104,7 +104,7 @@ class ProcessInteractionService < BaseService
end
def delete_post!(xml, account)
- status = Status.find(xml.at_xpath('//xmlns:id', xmlns: TagManager::XMLNS).content)
+ status = Status.find(xml.at_xpath('//xmlns:id', xmlns: OStatus::TagManager::XMLNS).content)
return if status.nil?
@@ -137,12 +137,12 @@ class ProcessInteractionService < BaseService
def status(xml)
uri = activity_id(xml)
- return nil unless TagManager.instance.local_id?(uri)
- Status.find(TagManager.instance.unique_tag_to_local_id(uri, 'Status'))
+ return nil unless OStatus::TagManager.instance.local_id?(uri)
+ Status.find(OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Status'))
end
def activity_id(xml)
- xml.at_xpath('//activity:object', activity: TagManager::AS_XMLNS).at_xpath('./xmlns:id', xmlns: TagManager::XMLNS).content
+ xml.at_xpath('//activity:object', activity: OStatus::TagManager::AS_XMLNS).at_xpath('./xmlns:id', xmlns: OStatus::TagManager::XMLNS).content
end
def salmon
diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb
index f123bf8697..1c3eea3697 100644
--- a/app/services/process_mentions_service.rb
+++ b/app/services/process_mentions_service.rb
@@ -39,7 +39,7 @@ class ProcessMentionsService < BaseService
if mentioned_account.local?
NotifyService.new.call(mentioned_account, mention)
- elsif mentioned_account.ostatus? && (Rails.configuration.x.use_ostatus_privacy || !status.stream_entry.hidden?)
+ elsif mentioned_account.ostatus? && !status.stream_entry.hidden?
NotificationWorker.perform_async(stream_entry_to_xml(status.stream_entry), status.account_id, mentioned_account.id)
elsif mentioned_account.activitypub?
ActivityPub::DeliveryWorker.perform_async(build_json(mention.status), mention.status.account_id, mentioned_account.inbox_url)
diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb
index 83fc77043b..14f24908c8 100644
--- a/app/services/remove_status_service.rb
+++ b/app/services/remove_status_service.rb
@@ -4,7 +4,7 @@ class RemoveStatusService < BaseService
include StreamEntryRenderer
def call(status)
- @payload = Oj.dump(event: :delete, payload: status.id)
+ @payload = Oj.dump(event: :delete, payload: status.id.to_s)
@status = status
@account = status.account
@tags = status.tags.pluck(:name).to_a
@@ -14,6 +14,7 @@ class RemoveStatusService < BaseService
remove_from_self if status.account.local?
remove_from_followers
+ remove_from_affected
remove_reblogs
remove_from_hashtags
remove_from_public
@@ -38,6 +39,12 @@ class RemoveStatusService < BaseService
end
end
+ def remove_from_affected
+ @mentions.map(&:account).select(&:local?).each do |account|
+ Redis.current.publish("timeline:#{account.id}", @payload)
+ end
+ end
+
def remove_from_remote_affected
# People who got mentioned in the status, or who
# reblogged it from someone else might not follow
@@ -105,6 +112,8 @@ class RemoveStatusService < BaseService
end
def remove_from_hashtags
+ return unless @status.public_visibility?
+
@tags.each do |hashtag|
Redis.current.publish("timeline:hashtag:#{hashtag}", @payload)
Redis.current.publish("timeline:hashtag:#{hashtag}:local", @payload) if @status.local?
@@ -112,6 +121,8 @@ class RemoveStatusService < BaseService
end
def remove_from_public
+ return unless @status.public_visibility?
+
Redis.current.publish('timeline:public', @payload)
Redis.current.publish('timeline:public:local', @payload) if @status.local?
end
diff --git a/app/services/resolve_remote_account_service.rb b/app/services/resolve_remote_account_service.rb
index 7031c98f5e..57c80fc82d 100644
--- a/app/services/resolve_remote_account_service.rb
+++ b/app/services/resolve_remote_account_service.rb
@@ -80,6 +80,7 @@ class ResolveRemoteAccountService < BaseService
def activitypub_ready?
!@webfinger.link('self').nil? &&
['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].include?(@webfinger.link('self').type) &&
+ !actor_json.nil? &&
actor_json['inbox'].present?
end
diff --git a/app/services/verify_salmon_service.rb b/app/services/verify_salmon_service.rb
index cd674837dc..205b35d8b1 100644
--- a/app/services/verify_salmon_service.rb
+++ b/app/services/verify_salmon_service.rb
@@ -9,7 +9,7 @@ class VerifySalmonService < BaseService
xml = Nokogiri::XML(body)
xml.encoding = 'utf-8'
- account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: TagManager::XMLNS))
+ account = author_from_xml(xml.at_xpath('/xmlns:entry', xmlns: OStatus::TagManager::XMLNS))
if account.nil?
false
diff --git a/app/validators/status_pin_validator.rb b/app/validators/status_pin_validator.rb
index f557df6af6..9760e1138c 100644
--- a/app/validators/status_pin_validator.rb
+++ b/app/validators/status_pin_validator.rb
@@ -5,5 +5,6 @@ class StatusPinValidator < ActiveModel::Validator
pin.errors.add(:status, I18n.t('statuses.pin_errors.reblog')) if pin.status.reblog?
pin.errors.add(:status, I18n.t('statuses.pin_errors.ownership')) if pin.account_id != pin.status.account_id
pin.errors.add(:status, I18n.t('statuses.pin_errors.private')) unless %w(public unlisted).include?(pin.status.visibility)
+ pin.errors.add(:status, I18n.t('statuses.pin_errors.limit')) if pin.account.status_pins.count > 4
end
end
diff --git a/app/views/about/_og.html.haml b/app/views/about/_og.html.haml
new file mode 100644
index 0000000000..dbd476915b
--- /dev/null
+++ b/app/views/about/_og.html.haml
@@ -0,0 +1,10 @@
+- thumbnail = @instance_presenter.thumbnail
+= opengraph 'og:site_name', t('about.hosted_on', domain: site_hostname)
+= opengraph 'og:url', about_url
+= opengraph 'og:type', 'website'
+= opengraph 'og:title', @instance_presenter.site_title
+= opengraph 'og:description', strip_tags(@instance_presenter.site_description.presence || t('about.about_mastodon_html'))
+= opengraph 'og:image', full_asset_url(thumbnail&.file&.url || asset_pack_path('preview.jpg', protocol: :request))
+= opengraph 'og:image:width', thumbnail ? thumbnail.meta['width'] : '1200'
+= opengraph 'og:image:height', thumbnail ? thumbnail.meta['height'] : '630'
+= opengraph 'twitter:card', 'summary_large_image'
diff --git a/app/views/about/_registration.html.haml b/app/views/about/_registration.html.haml
index f1c6e6b9d2..7a28f97388 100644
--- a/app/views/about/_registration.html.haml
+++ b/app/views/about/_registration.html.haml
@@ -1,26 +1,13 @@
= simple_form_for(new_user, url: user_registration_path) do |f|
= f.simple_fields_for :account do |account_fields|
.input-with-append
- = account_fields.input :username,
- autofocus: true,
- placeholder: t('simple_form.labels.defaults.username'),
- required: true,
- input_html: { 'aria-label' => t('simple_form.labels.defaults.username') }
+ = account_fields.input :username, autofocus: true, placeholder: t('simple_form.labels.defaults.username'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username'), :autocomplete => 'off' }
.append
= "@#{site_hostname}"
- = f.input :email,
- placeholder: t('simple_form.labels.defaults.email'),
- required: true,
- input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }
- = f.input :password,
- placeholder: t('simple_form.labels.defaults.password'),
- required: true,
- input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' }
- = f.input :password_confirmation,
- placeholder: t('simple_form.labels.defaults.confirm_password'),
- required: true,
- input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password'), :autocomplete => 'off' }
+ = f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email'), :autocomplete => 'off' }
+ = f.input :password, placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' }
+ = f.input :password_confirmation, placeholder: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password'), :autocomplete => 'off' }
.actions
= f.button :button, t('auth.register'), type: :submit, class: 'button button-alternative'
diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml
index 99d7d29725..6e4d0cdd1b 100644
--- a/app/views/about/more.html.haml
+++ b/app/views/about/more.html.haml
@@ -3,16 +3,7 @@
- content_for :header_tags do
= javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous'
-
- %meta{ property: 'og:site_name', content: site_title }/
- %meta{ property: 'og:url', content: about_url }/
- %meta{ property: 'og:type', content: 'website' }/
- %meta{ property: 'og:title', content: site_hostname }/
- %meta{ property: 'og:description', content: strip_tags(@instance_presenter.site_description.presence || t('about.about_mastodon_html')) }/
- %meta{ property: 'og:image', content: asset_pack_path('mastodon_small.jpg', protocol: :request) }/
- %meta{ property: 'og:image:width', content: '400' }/
- %meta{ property: 'og:image:height', content: '400' }/
- %meta{ property: 'twitter:card', content: 'summary' }/
+ = render partial: 'og'
.landing-page
.header-wrapper.compact
diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml
index 5962436fc3..737dbbcef9 100644
--- a/app/views/about/show.html.haml
+++ b/app/views/about/show.html.haml
@@ -4,16 +4,7 @@
- content_for :header_tags do
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json)
= javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous'
-
- %meta{ property: 'og:site_name', content: site_title }/
- %meta{ property: 'og:url', content: about_url }/
- %meta{ property: 'og:type', content: 'website' }/
- %meta{ property: 'og:title', content: site_hostname }/
- %meta{ property: 'og:description', content: strip_tags(@instance_presenter.site_description.presence || t('about.about_mastodon_html')) }/
- %meta{ property: 'og:image', content: asset_pack_path('mastodon_small.jpg', protocol: :request) }/
- %meta{ property: 'og:image:width', content: '400' }/
- %meta{ property: 'og:image:height', content: '400' }/
- %meta{ property: 'twitter:card', content: 'summary' }/
+ = render partial: 'og'
.landing-page
.header-wrapper
diff --git a/app/views/accounts/_header.html.haml b/app/views/accounts/_header.html.haml
index c16b7bf1fe..dcc6661bac 100644
--- a/app/views/accounts/_header.html.haml
+++ b/app/views/accounts/_header.html.haml
@@ -43,15 +43,15 @@
.details-counters
.counter{ class: active_nav_class(short_account_url(account)) }
= link_to short_account_url(account), class: 'u-url u-uid' do
- %span.counter-number= number_to_human account.statuses_count
+ %span.counter-number= number_to_human account.statuses_count, strip_insignificant_zeros: true
%span.counter-label= t('accounts.posts')
.counter{ class: active_nav_class(account_following_index_url(account)) }
= link_to account_following_index_url(account) do
- %span.counter-number= number_to_human account.following_count
+ %span.counter-number= number_to_human account.following_count, strip_insignificant_zeros: true
%span.counter-label= t('accounts.following')
.counter{ class: active_nav_class(account_followers_url(account)) }
= link_to account_followers_url(account) do
- %span.counter-number= number_to_human account.followers_count
+ %span.counter-number= number_to_human account.followers_count, strip_insignificant_zeros: true
%span.counter-label= t('accounts.followers')
diff --git a/app/views/accounts/_og.html.haml b/app/views/accounts/_og.html.haml
index 3ad39f391d..1d16be590a 100644
--- a/app/views/accounts/_og.html.haml
+++ b/app/views/accounts/_og.html.haml
@@ -1,8 +1,9 @@
-%meta{ property: 'og:url', content: url }/
-%meta{ property: 'og:site_name', content: site_title }/
-%meta{ property: 'og:title', content: [yield(:page_title).strip.presence, site_title].compact.join(' - ') }/
-%meta{ property: 'og:description', content: account.note }/
-%meta{ property: 'og:image', content: full_asset_url(account.avatar.url(:original)) }/
-%meta{ property: 'og:image:width', content: '120' }/
-%meta{ property: 'og:image:height', content: '120' }/
-%meta{ property: 'twitter:card', content: 'summary' }/
+= opengraph 'og:url', url
+= opengraph 'og:site_name', site_title
+= opengraph 'og:title', [yield(:page_title).strip.presence, site_title].compact.join(' - ')
+= opengraph 'og:description', account.note
+= opengraph 'og:image', full_asset_url(account.avatar.url(:original))
+= opengraph 'og:image:width', '120'
+= opengraph 'og:image:height', '120'
+= opengraph 'twitter:card', 'summary'
+= opengraph 'profile:username', account.local_username_and_domain
diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml
index e0f9f869ac..6c90b2c04f 100644
--- a/app/views/accounts/show.html.haml
+++ b/app/views/accounts/show.html.haml
@@ -9,7 +9,7 @@
%link{ rel: 'alternate', type: 'application/atom+xml', href: account_url(@account, format: 'atom') }/
%link{ rel: 'alternate', type: 'application/activity+json', href: ActivityPub::TagManager.instance.uri_for(@account) }/
- %meta{ property: 'og:type', content: 'profile' }/
+ = opengraph 'og:type', 'profile'
= render 'og', account: @account, url: short_account_url(@account, only_path: false)
- if show_landing_strip?
diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml
index 89355281a3..3775b67216 100644
--- a/app/views/admin/accounts/show.html.haml
+++ b/app/views/admin/accounts/show.html.haml
@@ -37,29 +37,6 @@
%th= t('admin.accounts.protocol')
%td= @account.protocol.humanize
- - if @account.ostatus?
- %tr
- %th= t('admin.accounts.feed_url')
- %td= link_to @account.remote_url, @account.remote_url
- %tr
- %th= t('admin.accounts.push_subscription_expires')
- %td
- - if @account.subscribed?
- %time.formatted{ datetime: @account.subscription_expires_at.iso8601, title: l(@account.subscription_expires_at) }
- = l @account.subscription_expires_at
- - else
- = t('admin.accounts.not_subscribed')
- %tr
- %th= t('admin.accounts.salmon_url')
- %td= link_to @account.salmon_url, @account.salmon_url
- - elsif @account.activitypub?
- %tr
- %th= t('admin.accounts.inbox_url')
- %td= link_to @account.inbox_url, @account.inbox_url
- %tr
- %th= t('admin.accounts.outbox_url')
- %td= link_to @account.outbox_url, @account.outbox_url
-
%tr
%th= t('admin.accounts.follows')
%td= @account.following_count
@@ -82,29 +59,73 @@
%th= t('.targeted_reports')
%td= link_to pluralize(@account.targeted_reports.count, t('.report')), admin_reports_path(target_account_id: @account.id)
-%div{ style: 'float: right' }
- - if @account.local?
- = link_to t('admin.accounts.reset_password'), admin_account_reset_path(@account.id), method: :create, class: 'button'
- - if @account.user&.otp_required_for_login?
- = link_to t('admin.accounts.disable_two_factor_authentication'), admin_user_two_factor_authentication_path(@account.user.id), method: :delete, class: 'button'
- - else
- - if @account.ostatus?
+%div{ style: 'overflow: hidden' }
+ %div{ style: 'float: right' }
+ - if @account.local?
+ = link_to t('admin.accounts.reset_password'), admin_account_reset_path(@account.id), method: :create, class: 'button'
+ - if @account.user&.otp_required_for_login?
+ = link_to t('admin.accounts.disable_two_factor_authentication'), admin_user_two_factor_authentication_path(@account.user.id), method: :delete, class: 'button'
+ - else
+ = link_to t('admin.accounts.redownload'), redownload_admin_account_path(@account.id), method: :post, class: 'button'
+
+ %div{ style: 'float: left' }
+ - if @account.silenced?
+ = link_to t('admin.accounts.undo_silenced'), admin_account_silence_path(@account.id), method: :delete, class: 'button'
+ - else
+ = link_to t('admin.accounts.silence'), admin_account_silence_path(@account.id), method: :post, class: 'button'
+
+ - if @account.local?
+ - unless @account.user_confirmed?
+ = link_to t('admin.accounts.confirm'), admin_account_confirmation_path(@account.id), method: :post, class: 'button'
+
+ - if @account.suspended?
+ = link_to t('admin.accounts.undo_suspension'), admin_account_suspension_path(@account.id), method: :delete, class: 'button'
+ - else
+ = link_to t('admin.accounts.perform_full_suspension'), admin_account_suspension_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button'
+
+- unless @account.local?
+ %hr
+ %h3 OStatus
+
+ .table-wrapper
+ %table.table
+ %tbody
+ %tr
+ %th= t('admin.accounts.feed_url')
+ %td= link_to @account.remote_url, @account.remote_url
+ %tr
+ %th= t('admin.accounts.push_subscription_expires')
+ %td
+ - if @account.subscribed?
+ %time.formatted{ datetime: @account.subscription_expires_at.iso8601, title: l(@account.subscription_expires_at) }
+ = l @account.subscription_expires_at
+ - else
+ = t('admin.accounts.not_subscribed')
+ %tr
+ %th= t('admin.accounts.salmon_url')
+ %td= link_to @account.salmon_url, @account.salmon_url
+
+ %div{ style: 'overflow: hidden' }
+ %div{ style: 'float: right' }
= link_to @account.subscribed? ? t('admin.accounts.resubscribe') : t('admin.accounts.subscribe'), subscribe_admin_account_path(@account.id), method: :post, class: 'button'
- if @account.subscribed?
= link_to t('admin.accounts.unsubscribe'), unsubscribe_admin_account_path(@account.id), method: :post, class: 'button negative'
- = link_to t('admin.accounts.redownload'), redownload_admin_account_path(@account.id), method: :post, class: 'button'
-%div{ style: 'float: left' }
- - if @account.silenced?
- = link_to t('admin.accounts.undo_silenced'), admin_account_silence_path(@account.id), method: :delete, class: 'button'
- - else
- = link_to t('admin.accounts.silence'), admin_account_silence_path(@account.id), method: :post, class: 'button'
+ %hr
+ %h3 ActivityPub
- - if @account.local?
- - unless @account.user_confirmed?
- = link_to t('admin.accounts.confirm'), admin_account_confirmation_path(@account.id), method: :post, class: 'button'
-
- - if @account.suspended?
- = link_to t('admin.accounts.undo_suspension'), admin_account_suspension_path(@account.id), method: :delete, class: 'button'
- - else
- = link_to t('admin.accounts.perform_full_suspension'), admin_account_suspension_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button'
+ .table-wrapper
+ %table.table
+ %tbody
+ %tr
+ %th= t('admin.accounts.inbox_url')
+ %td= link_to @account.inbox_url, @account.inbox_url
+ %tr
+ %th= t('admin.accounts.outbox_url')
+ %td= link_to @account.outbox_url, @account.outbox_url
+ %tr
+ %th= t('admin.accounts.shared_inbox_url')
+ %td= link_to @account.shared_inbox_url, @account.shared_inbox_url
+ %tr
+ %th= t('admin.accounts.followers_url')
+ %td= link_to @account.followers_url, @account.followers_url
diff --git a/app/views/admin/custom_emojis/_custom_emoji.html.haml b/app/views/admin/custom_emojis/_custom_emoji.html.haml
new file mode 100644
index 0000000000..ff1aa9925b
--- /dev/null
+++ b/app/views/admin/custom_emojis/_custom_emoji.html.haml
@@ -0,0 +1,7 @@
+%tr
+ %td
+ = image_tag custom_emoji.image.url, class: 'emojione', alt: ":#{custom_emoji.shortcode}:"
+ %td
+ %samp= ":#{custom_emoji.shortcode}:"
+ %td
+ = table_link_to 'times', t('admin.custom_emojis.delete'), admin_custom_emoji_path(custom_emoji), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') }
diff --git a/app/views/admin/custom_emojis/index.html.haml b/app/views/admin/custom_emojis/index.html.haml
new file mode 100644
index 0000000000..d5f32e84b4
--- /dev/null
+++ b/app/views/admin/custom_emojis/index.html.haml
@@ -0,0 +1,14 @@
+- content_for :page_title do
+ = t('admin.custom_emojis.title')
+
+.table-wrapper
+ %table.table
+ %thead
+ %tr
+ %th= t('admin.custom_emojis.emoji')
+ %th= t('admin.custom_emojis.shortcode')
+ %th
+ %tbody
+ = render @custom_emojis
+
+= link_to t('admin.custom_emojis.upload'), new_admin_custom_emoji_path, class: 'button'
diff --git a/app/views/admin/custom_emojis/new.html.haml b/app/views/admin/custom_emojis/new.html.haml
new file mode 100644
index 0000000000..672afe435f
--- /dev/null
+++ b/app/views/admin/custom_emojis/new.html.haml
@@ -0,0 +1,12 @@
+- content_for :page_title do
+ = t('.title')
+
+= simple_form_for @custom_emoji, url: admin_custom_emojis_path do |f|
+ = render 'shared/error_messages', object: @custom_emoji
+
+ .fields-group
+ = f.input :shortcode, placeholder: t('admin.custom_emojis.shortcode'), hint: t('admin.custom_emojis.shortcode_hint')
+ = f.input :image, input_html: { accept: 'image/png' }, hint: t('admin.custom_emojis.image_hint')
+
+ .actions
+ = f.button :button, t('admin.custom_emojis.upload'), type: :submit
diff --git a/app/views/admin/instances/_instance.html.haml b/app/views/admin/instances/_instance.html.haml
index 435cd8f642..6efbbbe60a 100644
--- a/app/views/admin/instances/_instance.html.haml
+++ b/app/views/admin/instances/_instance.html.haml
@@ -1,6 +1,6 @@
%tr
%td.domain
- = instance.domain
+ = link_to instance.domain, admin_accounts_path(by_domain: instance.domain)
%td.count
= instance.accounts_count
%td
diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml
index edbd3b2173..3314ce0778 100644
--- a/app/views/admin/instances/index.html.haml
+++ b/app/views/admin/instances/index.html.haml
@@ -1,6 +1,16 @@
- content_for :page_title do
= t('admin.instances.title')
+= form_tag admin_instances_url, method: 'GET', class: 'simple_form' do
+ .fields-group
+ - %i(domain_name).each do |key|
+ .input.string.optional
+ = text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.instances.#{key}")
+
+ .actions
+ %button= t('admin.instances.search')
+ = link_to t('admin.instances.reset'), admin_instances_path, class: 'button negative'
+
.table-wrapper
%table.table
%thead
diff --git a/app/views/admin/settings/edit.html.haml b/app/views/admin/settings/edit.html.haml
index 50d019ec42..468166035f 100644
--- a/app/views/admin/settings/edit.html.haml
+++ b/app/views/admin/settings/edit.html.haml
@@ -10,6 +10,11 @@
%hr/
+ .fields-group
+ = f.input :thumbnail, as: :file, wrapper: :with_block_label, label: t('admin.settings.thumbnail.title'), hint: t('admin.settings.thumbnail.desc_html')
+
+ %hr/
+
.fields-group
= f.input :timeline_preview, as: :boolean, wrapper: :with_label, label: t('admin.settings.timeline_preview.title'), hint: t('admin.settings.timeline_preview.desc_html')
diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml
index d0529a20c2..8070203103 100644
--- a/app/views/auth/registrations/new.html.haml
+++ b/app/views/auth/registrations/new.html.haml
@@ -6,11 +6,11 @@
= f.simple_fields_for :account do |ff|
.input-with-append
- = ff.input :username, autofocus: true, placeholder: t('simple_form.labels.defaults.username'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username') }
+ = ff.input :username, autofocus: true, placeholder: t('simple_form.labels.defaults.username'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username'), :autocomplete => 'off' }
.append
= "@#{site_hostname}"
- = f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }
+ = f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email'), :autocomplete => 'off' }
= f.input :password, placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' }
= f.input :password_confirmation, placeholder: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password'), :autocomplete => 'off' }
diff --git a/app/views/auth/sessions/two_factor.html.haml b/app/views/auth/sessions/two_factor.html.haml
index cb5e32f3e2..2b07c923be 100644
--- a/app/views/auth/sessions/two_factor.html.haml
+++ b/app/views/auth/sessions/two_factor.html.haml
@@ -2,9 +2,7 @@
= t('auth.login')
= simple_form_for(resource, as: resource_name, url: session_path(resource_name), method: :post) do |f|
- = f.input :otp_attempt, type: :number, placeholder: t('simple_form.labels.defaults.otp_attempt'),
- input_html: { 'aria-label' => t('simple_form.labels.defaults.otp_attempt'), :autocomplete => 'off' }, required: true, autofocus: true,
- hint: t('simple_form.hints.sessions.otp')
+ = f.input :otp_attempt, type: :number, placeholder: t('simple_form.labels.defaults.otp_attempt'), input_html: { 'aria-label' => t('simple_form.labels.defaults.otp_attempt'), :autocomplete => 'off' }, required: true, autofocus: true, hint: t('simple_form.hints.sessions.otp')
.actions
= f.button :button, t('auth.login'), type: :submit
diff --git a/app/views/errors/500.html.haml b/app/views/errors/500.html.haml
new file mode 100644
index 0000000000..6244ff209f
--- /dev/null
+++ b/app/views/errors/500.html.haml
@@ -0,0 +1,5 @@
+- content_for :page_title do
+ = t('errors.500.title')
+
+- content_for :content do
+ = t('errors.500.content')
diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml
index a13d0702bf..3b4219c561 100644
--- a/app/views/home/index.html.haml
+++ b/app/views/home/index.html.haml
@@ -2,8 +2,8 @@
%meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key}
%script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json)
- = javascript_pack_tag "frontends/#{@frontend}", integrity: true, crossorigin: 'anonymous'
- = stylesheet_pack_tag "frontends/#{@frontend}", integrity: true, media: 'all'
+ = javascript_pack_tag "themes/#{current_theme}", integrity: true, crossorigin: 'anonymous'
+ = stylesheet_pack_tag "themes/#{current_theme}", integrity: true, media: 'all'
.app-holder#mastodon{ data: { props: Oj.dump(default_props) } }
%noscript
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index 6fd39c88ea..e6190f7e2a 100755
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -27,7 +27,6 @@
%link{ href: asset_pack_path('features/notifications.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/
%link{ href: asset_pack_path('features/community_timeline.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/
%link{ href: asset_pack_path('features/public_timeline.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/
- %link{ href: asset_pack_path('emojione_picker.js'), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/
= javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous'
= csrf_meta_tags
diff --git a/app/views/layouts/error.html.haml b/app/views/layouts/error.html.haml
index 08b94af54a..8b260c6192 100644
--- a/app/views/layouts/error.html.haml
+++ b/app/views/layouts/error.html.haml
@@ -3,34 +3,12 @@
%head
%meta{ content: 'text/html; charset=UTF-8', 'http-equiv' => 'Content-Type' }/
%meta{ charset: 'utf-8' }/
- %title= yield :page_title
+ %title= safe_join([yield(:page_title), title], ' - ')
%meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/
- %link{ href: 'https://fonts.googleapis.com/css?family=Roboto:400', rel: 'stylesheet' }/
- :css
- body {
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
- background: #282c37;
- color: #9baec8;
- text-align: center;
- margin: 0;
- padding: 20px;
- }
-
- .dialog img {
- display: block;
- margin: 20px auto;
- margin-top: 50px;
- max-width: 600px;
- width: 100%;
- height: auto;
- }
-
- .dialog h1 {
- font: 20px/28px -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
- font-weight: 400;
- }
- %body
+ = stylesheet_pack_tag 'common', media: 'all'
+ = stylesheet_pack_tag 'application', integrity: true, media: 'all'
+ %body.error
.dialog
- %img{ alt: 'Mastodon', src: '/oops.png' }/
+ %img{ alt: title, src: '/oops.gif' }/
%div
%h1= yield :content
diff --git a/app/views/oauth/authorizations/show.html.haml b/app/views/oauth/authorizations/show.html.haml
index b56667f352..ad52360074 100644
--- a/app/views/oauth/authorizations/show.html.haml
+++ b/app/views/oauth/authorizations/show.html.haml
@@ -1,3 +1,4 @@
.form-container
.flash-message
- %code= params[:code]
+ %p= t('doorkeeper.authorizations.show.title')
+ %input{ type: 'text', class: 'oauth-code', readonly: true, value: params[:code], onClick: 'select()' }
diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml
index f42f925080..5efd538e4e 100644
--- a/app/views/settings/preferences/show.html.haml
+++ b/app/views/settings/preferences/show.html.haml
@@ -5,6 +5,8 @@
= render 'shared/error_messages', object: current_user
.fields-group
+ = f.input :setting_theme, collection: Themes.instance.names, label_method: lambda { |theme| safe_join([I18n.t("themes.#{theme}", default: theme)])}, wrapper: :with_label, include_blank: false
+
= f.input :locale,
collection: I18n.available_locales,
wrapper: :with_label,
diff --git a/app/views/settings/profiles/show.html.haml b/app/views/settings/profiles/show.html.haml
index 3fa540bbaf..551a7ca493 100644
--- a/app/views/settings/profiles/show.html.haml
+++ b/app/views/settings/profiles/show.html.haml
@@ -8,8 +8,8 @@
= f.input :display_name, placeholder: t('simple_form.labels.defaults.display_name'), hint: t('simple_form.hints.defaults.display_name', count: 30 - @account.display_name.size).html_safe
= f.input :note, placeholder: t('simple_form.labels.defaults.note'), hint: t('simple_form.hints.defaults.note', count: 500 - @account.note.size).html_safe
- .card.compact{ style: "background-image: url(#{@account.header.url(:original)})" }
- .avatar= image_tag @account.avatar.url(:original)
+ .card.compact{ style: "background-image: url(#{@account.header.url(:original)})", data: { original_src: @account.header.url(:original) } }
+ .avatar= image_tag @account.avatar.url(:original), data: { original_src: @account.avatar.url(:original) }
.fields-group
= f.input :avatar, wrapper: :with_label, input_html: { accept: AccountAvatar::IMAGE_MIME_TYPES.join(',') }, hint: t('simple_form.hints.defaults.avatar')
diff --git a/app/views/stream_entries/_detailed_status.html.haml b/app/views/stream_entries/_detailed_status.html.haml
index 1d943a2ca9..9a26d2c0b6 100644
--- a/app/views/stream_entries/_detailed_status.html.haml
+++ b/app/views/stream_entries/_detailed_status.html.haml
@@ -15,22 +15,19 @@
.status__content.p-name.emojify<
- if status.spoiler_text?
%p{ style: 'margin-bottom: 0' }<
- %span.p-summary> #{status.spoiler_text}
+ %span.p-summary> #{Formatter.instance.format_spoiler(status)}
%a.status__content__spoiler-link{ href: '#' }= t('statuses.show_more')
- .e-content{ lang: status.language, style: "display: #{status.spoiler_text? ? 'none' : 'block'}; direction: #{rtl_status?(status) ? 'rtl' : 'ltr'}" }<
- = Formatter.instance.format(status)
+ .e-content{ lang: status.language, style: "display: #{status.spoiler_text? ? 'none' : 'block'}; direction: #{rtl_status?(status) ? 'rtl' : 'ltr'}" }
+ = Formatter.instance.format(status, custom_emojify: true)
- - unless status.media_attachments.empty?
+ - if !status.media_attachments.empty?
- if status.media_attachments.first.video?
- .video-player><
- = render partial: 'stream_entries/content_spoiler', locals: { sensitive: status.sensitive? }
- %video.u-video{ src: status.media_attachments.first.file.url(:original), loop: true }
+ - video = status.media_attachments.first
+ %div{ data: { component: 'Video', props: Oj.dump(src: video.file.url(:original), preview: video.file.url(:small), sensitive: status.sensitive?, width: 670, height: 380) }}><
- else
- .detailed-status__attachments><
- = render partial: 'stream_entries/content_spoiler', locals: { sensitive: status.sensitive? }
- .status__attachments__inner<
- - status.media_attachments.each do |media|
- = render partial: 'stream_entries/media', locals: { media: media }
+ %div{ data: { component: 'MediaGallery', props: Oj.dump(height: 380, sensitive: status.sensitive?, standalone: true, 'autoPlayGif': current_account&.user&.setting_auto_play_gif, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }) }}><
+ - elsif status.preview_cards.first
+ %div{ data: { component: 'Card', props: Oj.dump('maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_cards.first, serializer: REST::PreviewCardSerializer).as_json) }}><
.detailed-status__meta
%data.dt-published{ value: status.created_at.to_time.iso8601 }
diff --git a/app/views/stream_entries/_og_description.html.haml b/app/views/stream_entries/_og_description.html.haml
index 5762aca041..d2fa99e63e 100644
--- a/app/views/stream_entries/_og_description.html.haml
+++ b/app/views/stream_entries/_og_description.html.haml
@@ -1,4 +1,4 @@
- if activity.is_a?(Status) && activity.spoiler_text?
- %meta{ property: 'og:description', content: activity.spoiler_text }/
+ = opengraph 'og:description', activity.spoiler_text
- else
- %meta{ property: 'og:description', content: activity.content }/
+ = opengraph 'og:description', activity.content
diff --git a/app/views/stream_entries/_og_image.html.haml b/app/views/stream_entries/_og_image.html.haml
index f725209d82..b5058583b3 100644
--- a/app/views/stream_entries/_og_image.html.haml
+++ b/app/views/stream_entries/_og_image.html.haml
@@ -1,6 +1,23 @@
- if activity.is_a?(Status) && activity.non_sensitive_with_media?
- %meta{ property: 'og:image', content: full_asset_url(activity.media_attachments.first.file.url(:small)) }/
+ - activity.media_attachments.each do |media|
+ - if media.image?
+ = opengraph 'og:image', full_asset_url(media.file.url(:original))
+ = opengraph 'og:image:type', media.file_content_type
+ - unless media.file.meta.nil?
+ = opengraph 'og:image:width', media.file.meta['original']['width']
+ = opengraph 'og:image:height', media.file.meta['original']['height']
+ - elsif media.video?
+ = opengraph 'og:image', full_asset_url(media.file.url(:small))
+ = opengraph 'og:image:type', 'image/png'
+ - unless media.file.meta.nil?
+ = opengraph 'og:image:width', media.file.meta['small']['width']
+ = opengraph 'og:image:height', media.file.meta['small']['height']
+ = opengraph 'og:video', full_asset_url(media.file.url(:original))
+ = opengraph 'og:video:type', media.file_content_type
+ - unless media.file.meta.nil?
+ = opengraph 'og:video:width', media.file.meta['small']['width']
+ = opengraph 'og:video:height', media.file.meta['small']['height']
- else
- %meta{ property: 'og:image', content: full_asset_url(account.avatar.url(:original)) }/
- %meta{ property: 'og:image:width', content: '120' }/
- %meta{ property: 'og:image:height', content: '120' }/
+ = opengraph 'og:image', full_asset_url(account.avatar.url(:original))
+ = opengraph 'og:image:width', '120'
+ = opengraph 'og:image:height','120'
diff --git a/app/views/stream_entries/_simple_status.html.haml b/app/views/stream_entries/_simple_status.html.haml
index b44f9820fb..9a2524219c 100644
--- a/app/views/stream_entries/_simple_status.html.haml
+++ b/app/views/stream_entries/_simple_status.html.haml
@@ -16,21 +16,14 @@
.status__content.p-name.emojify<
- if status.spoiler_text?
%p{ style: 'margin-bottom: 0' }<
- %span.p-summary> #{status.spoiler_text}
+ %span.p-summary> #{Formatter.instance.format_spoiler(status)}
%a.status__content__spoiler-link{ href: '#' }= t('statuses.show_more')
- .e-content{ lang: status.language, style: "display: #{status.spoiler_text? ? 'none' : 'block'}; direction: #{rtl_status?(status) ? 'rtl' : 'ltr'}" }<
- = Formatter.instance.format(status)
+ .e-content{ lang: status.language, style: "display: #{status.spoiler_text? ? 'none' : 'block'}; direction: #{rtl_status?(status) ? 'rtl' : 'ltr'}" }
+ = Formatter.instance.format(status, custom_emojify: true)
- unless status.media_attachments.empty?
- .status__attachments><
- = render partial: 'stream_entries/content_spoiler', locals: { sensitive: status.sensitive? }
- - if status.media_attachments.first.video?
- .status__attachments__inner<
- .video-item<
- = link_to (status.media_attachments.first.remote_url.blank? ? status.media_attachments.first.file.url(:original) : status.media_attachments.first.remote_url), style: "background-image: url(#{status.media_attachments.first.file.url(:small)})", target: '_blank', rel: 'noopener', class: 'u-video' do
- .video-item__play
- = fa_icon('play')
- - else
- .status__attachments__inner<
- - status.media_attachments.each do |media|
- = render partial: 'stream_entries/media', locals: { media: media }
+ - if status.media_attachments.first.video?
+ - video = status.media_attachments.first
+ %div{ data: { component: 'Video', props: Oj.dump(src: video.file.url(:original), preview: video.file.url(:small), sensitive: status.sensitive?, width: 610, height: 343) }}><
+ - else
+ %div{ data: { component: 'MediaGallery', props: Oj.dump(height: 343, sensitive: status.sensitive?, 'autoPlayGif': current_account&.user&.setting_auto_play_gif, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }) }}><
diff --git a/app/views/stream_entries/show.html.haml b/app/views/stream_entries/show.html.haml
index 5ef72f8041..1bb8a32b25 100644
--- a/app/views/stream_entries/show.html.haml
+++ b/app/views/stream_entries/show.html.haml
@@ -6,15 +6,15 @@
%link{ rel: 'alternate', type: 'application/json+oembed', href: api_oembed_url(url: account_stream_entry_url(@account, @stream_entry), format: 'json') }/
%link{ rel: 'alternate', type: 'application/activity+json', href: ActivityPub::TagManager.instance.uri_for(@stream_entry.activity) }/
- %meta{ property: 'og:site_name', content: site_title }/
- %meta{ property: 'og:type', content: 'article' }/
- %meta{ property: 'og:title', content: "#{@account.username} on #{site_hostname}" }/
- %meta{ property: 'og:url', content: account_stream_entry_url(@account, @stream_entry) }/
+ = opengraph 'og:site_name', site_title
+ = opengraph 'og:type', 'article'
+ = opengraph 'og:title', "#{@account.username} on #{site_hostname}"
+ = opengraph 'og:url', account_stream_entry_url(@account, @stream_entry)
= render 'stream_entries/og_description', activity: @stream_entry.activity
= render 'stream_entries/og_image', activity: @stream_entry.activity, account: @account
- %meta{ property: 'twitter:card', content: 'summary' }/
+ = opengraph 'twitter:card', 'summary_large_image'
- if show_landing_strip?
= render partial: 'shared/landing_strip', locals: { account: @stream_entry.account }
diff --git a/app/views/user_mailer/confirmation_instructions.es.html.erb b/app/views/user_mailer/confirmation_instructions.es.html.erb
new file mode 100644
index 0000000000..1d46a12c0d
--- /dev/null
+++ b/app/views/user_mailer/confirmation_instructions.es.html.erb
@@ -0,0 +1,12 @@
+¡Bienvenido, <%= @resource.email %>!
+
+Acabas de crear una cuenta en <%= @instance %>.
+
+Para confirmar tu registro, por favor ingresa al siguiente enlace:
+<%= link_to 'Confirmar mi cuenta', confirmation_url(@resource, confirmation_token: @token) %>
+
+
También revisa nuestros <%= link_to 'términos y condiciones', terms_url %>.
+
+Sinceramente,
+
+
El equipo de <%= @instance %>
\ No newline at end of file
diff --git a/app/views/user_mailer/confirmation_instructions.es.text.erb b/app/views/user_mailer/confirmation_instructions.es.text.erb
new file mode 100644
index 0000000000..e9d83b3f8e
--- /dev/null
+++ b/app/views/user_mailer/confirmation_instructions.es.text.erb
@@ -0,0 +1,12 @@
+¡Bienvenido, <%= @resource.email %>!
+
+Acabas de crear una cuenta en <%= @instance %>.
+
+Para confirmar tu registro, por favor ingresa al siguiente enlace:
+<%= confirmation_url(@resource, confirmation_token: @token) %>
+
+Por favor, también revisa nuestros términos y condiciones <%= terms_url %>
+
+Sinceramente,
+
+El equipo de <%= @instance %>
\ No newline at end of file
diff --git a/app/views/user_mailer/confirmation_instructions.pt-BR.html.erb b/app/views/user_mailer/confirmation_instructions.pt-BR.html.erb
new file mode 100644
index 0000000000..80edcfda7b
--- /dev/null
+++ b/app/views/user_mailer/confirmation_instructions.pt-BR.html.erb
@@ -0,0 +1,12 @@
+Boas vindas, <%= @resource.email %>!
+
+Você acabou de criar uma conta no <%= @instance %>.
+
+Para confirmar o seu cadastro, por favor clique no link a seguir:
+<%= link_to 'Confirmar cadastro', confirmation_url(@resource, confirmation_token: @token) %>
+
+
Por favor, leia também os nossos <%= link_to 'termos de serviços', terms_url %>.
+
+Atenciosamente,
+
+
A equipe do <%= @instance %>
diff --git a/app/views/user_mailer/confirmation_instructions.pt-BR.text.erb b/app/views/user_mailer/confirmation_instructions.pt-BR.text.erb
new file mode 100644
index 0000000000..95efb3436a
--- /dev/null
+++ b/app/views/user_mailer/confirmation_instructions.pt-BR.text.erb
@@ -0,0 +1,12 @@
+Boas vindas, <%= @resource.email %>!
+
+Você acabou de criar uma conta no <%= @instance %>.
+
+Para confirmar o seu cadastro, por favor clique no link a seguir:
+<%= confirmation_url(@resource, confirmation_token: @token) %>
+
+Por favor, leia também os nossos termos e condições de uso <%= terms_url %>
+
+Atenciosamente,
+
+A equipe do <%= @instance %>
diff --git a/app/views/user_mailer/confirmation_instructions.zh-cn.html.erb b/app/views/user_mailer/confirmation_instructions.zh-cn.html.erb
index 575b2ff9ee..de2f8b6e0f 100644
--- a/app/views/user_mailer/confirmation_instructions.zh-cn.html.erb
+++ b/app/views/user_mailer/confirmation_instructions.zh-cn.html.erb
@@ -3,7 +3,7 @@
你刚刚在 <%= @instance %> 创建了帐号。
点击下面的链接来完成注册啦 :
-<%= link_to '确认账户', confirmation_url(@resource, confirmation_token: @token) %>
+<%= link_to '确认帐户', confirmation_url(@resource, confirmation_token: @token) %>
别忘了看看 <%= link_to '使用条款', terms_url %>。
diff --git a/app/views/user_mailer/confirmation_instructions.zh-cn.text.erb b/app/views/user_mailer/confirmation_instructions.zh-cn.text.erb
index ce237a32d8..d7d4b4b236 100644
--- a/app/views/user_mailer/confirmation_instructions.zh-cn.text.erb
+++ b/app/views/user_mailer/confirmation_instructions.zh-cn.text.erb
@@ -3,7 +3,7 @@
你刚刚在 <%= @instance %> 创建了帐号。
点击下面的链接来完成注册啦 :
-<%= link_to '确认账户', confirmation_url(@resource, confirmation_token: @token) %>
+<%= link_to '确认帐户', confirmation_url(@resource, confirmation_token: @token) %>
别忘了看看 <%= link_to 'terms and conditions', terms_url %>。
diff --git a/app/views/user_mailer/password_change.es.html.erb b/app/views/user_mailer/password_change.es.html.erb
new file mode 100644
index 0000000000..0a9eb4c4c5
--- /dev/null
+++ b/app/views/user_mailer/password_change.es.html.erb
@@ -0,0 +1,3 @@
+¡Hola, <%= @resource.email %>!
+
+Te contactamos para notificarte que tu contraseña en <%= @instance %> ha sido modificada.
\ No newline at end of file
diff --git a/app/views/user_mailer/password_change.es.text.erb b/app/views/user_mailer/password_change.es.text.erb
new file mode 100644
index 0000000000..192faf9ad9
--- /dev/null
+++ b/app/views/user_mailer/password_change.es.text.erb
@@ -0,0 +1,3 @@
+¡Hola, <%= @resource.email %>!
+
+Te contactamos para notificarte que tu contraseña en <%= @instance %> ha sido modificada.
\ No newline at end of file
diff --git a/app/views/user_mailer/password_change.pt-BR.html.erb b/app/views/user_mailer/password_change.pt-BR.html.erb
new file mode 100644
index 0000000000..5f707ba094
--- /dev/null
+++ b/app/views/user_mailer/password_change.pt-BR.html.erb
@@ -0,0 +1,3 @@
+Olá, <%= @resource.email %>!
+
+Estamos te contatando para te notificar que a senha senha no <%= @instance %> foi modificada.
diff --git a/app/views/user_mailer/password_change.pt-BR.text.erb b/app/views/user_mailer/password_change.pt-BR.text.erb
new file mode 100644
index 0000000000..d8b76648cf
--- /dev/null
+++ b/app/views/user_mailer/password_change.pt-BR.text.erb
@@ -0,0 +1,3 @@
+Olá, <%= @resource.email %>!
+
+Estamos te contatando para te notificar que a senha senha no <%= @instance %> foi modificada.
diff --git a/app/views/user_mailer/reset_password_instructions.es.html.erb b/app/views/user_mailer/reset_password_instructions.es.html.erb
new file mode 100644
index 0000000000..4eeb6601db
--- /dev/null
+++ b/app/views/user_mailer/reset_password_instructions.es.html.erb
@@ -0,0 +1,8 @@
+¡Hola, <%= @resource.email %>!
+
+Alguien pidió un enlace para cambiar tu contraseña en <%= @instance %>. Puedes hacer esto con el siguiente enlace.
+
+<%= link_to 'Cambiar mi contraseña', edit_password_url(@resource, reset_password_token: @token) %>
+
+Si no fuiste tú, por favor ignora este mensaje.
+Tu contraseña no cambiará hasta que ingreses al enlace y crees una nueva.
diff --git a/app/views/user_mailer/reset_password_instructions.es.text.erb b/app/views/user_mailer/reset_password_instructions.es.text.erb
new file mode 100644
index 0000000000..8abafcc99f
--- /dev/null
+++ b/app/views/user_mailer/reset_password_instructions.es.text.erb
@@ -0,0 +1,8 @@
+¡Hola, <%= @resource.email %>!
+
+Alguien pidió un enlace para cambiar tu contraseña en <%= @instance %>. Puedes hacer esto con el siguiente enlace.
+
+<%= edit_password_url(@resource, reset_password_token: @token) %>
+
+Si no fuiste tú, por favor ignora este mensaje.
+Tu contraseña no cambiará hasta que ingreses al enlace y crees una nueva.
diff --git a/app/views/user_mailer/reset_password_instructions.pt-BR.html.erb b/app/views/user_mailer/reset_password_instructions.pt-BR.html.erb
new file mode 100644
index 0000000000..940438b7cb
--- /dev/null
+++ b/app/views/user_mailer/reset_password_instructions.pt-BR.html.erb
@@ -0,0 +1,8 @@
+Olá, <%= @resource.email %>!
+
+Alguém solicitou um link para mudar a sua senha no <%= @instance %>. Você pode fazer isso através do link abaixo:
+
+<%= link_to 'Mudar a minha senha', edit_password_url(@resource, reset_password_token: @token) %>
+
+Se você não solicitou isso, por favor ignore este e-mail.
+A senha senha não será modificada até que você acesse o link acima e crie uma nova.
diff --git a/app/views/user_mailer/reset_password_instructions.pt-BR.text.erb b/app/views/user_mailer/reset_password_instructions.pt-BR.text.erb
new file mode 100644
index 0000000000..f574fe08f9
--- /dev/null
+++ b/app/views/user_mailer/reset_password_instructions.pt-BR.text.erb
@@ -0,0 +1,8 @@
+Olá, <%= @resource.email %>!
+
+Alguém solicitou um link para mudar a sua senha no <%= @instance %>. Você pode fazer isso através do link abaixo:
+
+<%= edit_password_url(@resource, reset_password_token: @token) %>
+
+Se você não solicitou isso, por favor ignore este e-mail.
+A senha senha não será modificada até que você acesse o link acima e crie uma nova.
diff --git a/app/views/user_mailer/reset_password_instructions.zh-cn.html.erb b/app/views/user_mailer/reset_password_instructions.zh-cn.html.erb
index 245382b2cd..51e3073f14 100644
--- a/app/views/user_mailer/reset_password_instructions.zh-cn.html.erb
+++ b/app/views/user_mailer/reset_password_instructions.zh-cn.html.erb
@@ -1,6 +1,6 @@
<%= @resource.email %> ,嗨呀!!
-有人(但愿是你)请求更改你Mastodon账户的密码。如果是你的话,请点击下面的链接:
+有人(但愿是你)请求更改你Mastodon帐户的密码。如果是你的话,请点击下面的链接:
<%= link_to '更改密码', edit_password_url(@resource, reset_password_token: @token) %>
diff --git a/app/views/user_mailer/reset_password_instructions.zh-cn.text.erb b/app/views/user_mailer/reset_password_instructions.zh-cn.text.erb
index 574a0bb2e6..7df590f788 100644
--- a/app/views/user_mailer/reset_password_instructions.zh-cn.text.erb
+++ b/app/views/user_mailer/reset_password_instructions.zh-cn.text.erb
@@ -1,6 +1,6 @@
<%= @resource.email %> ,嗨呀!!
-有人(但愿是你)请求更改你Mastodon账户的密码。如果是你的话,请点击下面的链接:
+有人(但愿是你)请求更改你Mastodon帐户的密码。如果是你的话,请点击下面的链接:
<%= link_to '更改密码', edit_password_url(@resource, reset_password_token: @token) %>
diff --git a/app/workers/activitypub/delivery_worker.rb b/app/workers/activitypub/delivery_worker.rb
index cd67b67108..a4e8293434 100644
--- a/app/workers/activitypub/delivery_worker.rb
+++ b/app/workers/activitypub/delivery_worker.rb
@@ -16,7 +16,7 @@ class ActivityPub::DeliveryWorker
raise Mastodon::UnexpectedResponseError, @response unless response_successful?
rescue => e
- raise e.class, "Delivery failed for #{inbox_url}: #{e.message}"
+ raise e.class, "Delivery failed for #{inbox_url}: #{e.message}", e.backtrace[0]
end
private
diff --git a/app/workers/activitypub/reply_distribution_worker.rb b/app/workers/activitypub/reply_distribution_worker.rb
index f9127340f7..fe99fc05f2 100644
--- a/app/workers/activitypub/reply_distribution_worker.rb
+++ b/app/workers/activitypub/reply_distribution_worker.rb
@@ -7,9 +7,9 @@ class ActivityPub::ReplyDistributionWorker
def perform(status_id)
@status = Status.find(status_id)
- @account = @status.thread.account
+ @account = @status.thread&.account
- return if skip_distribution?
+ return if @account.nil? || skip_distribution?
ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url|
[signed_payload, @status.account_id, inbox_url]
diff --git a/app/workers/pubsubhubbub/delivery_worker.rb b/app/workers/pubsubhubbub/delivery_worker.rb
index 88645cf338..110b8bf162 100644
--- a/app/workers/pubsubhubbub/delivery_worker.rb
+++ b/app/workers/pubsubhubbub/delivery_worker.rb
@@ -17,7 +17,7 @@ class Pubsubhubbub::DeliveryWorker
@payload = payload
process_delivery unless blocked_domain?
rescue => e
- raise e.class, "Delivery failed for #{subscription&.callback_url}: #{e.message}"
+ raise e.class, "Delivery failed for #{subscription&.callback_url}: #{e.message}", e.backtrace[0]
end
private
diff --git a/app/workers/pubsubhubbub/distribution_worker.rb b/app/workers/pubsubhubbub/distribution_worker.rb
index 524f6849fc..fed5e917d3 100644
--- a/app/workers/pubsubhubbub/distribution_worker.rb
+++ b/app/workers/pubsubhubbub/distribution_worker.rb
@@ -6,45 +6,27 @@ class Pubsubhubbub::DistributionWorker
sidekiq_options queue: 'push'
def perform(stream_entry_ids)
- stream_entries = StreamEntry.where(id: stream_entry_ids).includes(:status).reject { |e| e.status.nil? || e.status.direct_visibility? }
+ stream_entries = StreamEntry.where(id: stream_entry_ids).includes(:status).reject { |e| e.status.nil? || e.status.hidden? }
return if stream_entries.empty?
@account = stream_entries.first.account
@subscriptions = active_subscriptions.to_a
- distribute_public!(stream_entries.reject(&:hidden?))
- distribute_hidden!(stream_entries.select(&:hidden?)) if Rails.configuration.x.use_ostatus_privacy
+ distribute_public!(stream_entries)
end
private
def distribute_public!(stream_entries)
- return if stream_entries.empty?
-
@payload = OStatus::AtomSerializer.render(OStatus::AtomSerializer.new.feed(@account, stream_entries))
- Pubsubhubbub::DeliveryWorker.push_bulk(@subscriptions) do |subscription|
- [subscription.id, @payload]
- end
- end
-
- def distribute_hidden!(stream_entries)
- return if stream_entries.empty?
-
- @payload = OStatus::AtomSerializer.render(OStatus::AtomSerializer.new.feed(@account, stream_entries))
- @domains = @account.followers.domains
-
- Pubsubhubbub::DeliveryWorker.push_bulk(@subscriptions.select { |s| allowed_to_receive?(s.callback_url, s.domain) }) do |subscription|
- [subscription.id, @payload]
+ Pubsubhubbub::DeliveryWorker.push_bulk(@subscriptions) do |subscription_id|
+ [subscription_id, @payload]
end
end
def active_subscriptions
- Subscription.where(account: @account).active.select('id, callback_url, domain')
- end
-
- def allowed_to_receive?(callback_url, domain)
- (!domain.nil? && @domains.include?(domain)) || @domains.include?(Addressable::URI.parse(callback_url).host)
+ Subscription.where(account: @account).active.pluck(:id)
end
end
diff --git a/app/workers/pubsubhubbub/subscribe_worker.rb b/app/workers/pubsubhubbub/subscribe_worker.rb
index 130c967e02..e350973e1e 100644
--- a/app/workers/pubsubhubbub/subscribe_worker.rb
+++ b/app/workers/pubsubhubbub/subscribe_worker.rb
@@ -3,7 +3,7 @@
class Pubsubhubbub::SubscribeWorker
include Sidekiq::Worker
- sidekiq_options queue: 'push', retry: 10, unique: :until_executed, dead: false, unique_retry: true
+ sidekiq_options queue: 'push', retry: 10, unique: :until_executed, dead: false
sidekiq_retry_in do |count|
case count
@@ -29,6 +29,6 @@ class Pubsubhubbub::SubscribeWorker
logger.debug "PuSH re-subscribing to #{account.acct}"
::SubscribeService.new.call(account)
rescue => e
- raise e.class, "Subscribe failed for #{account&.acct}: #{e.message}"
+ raise e.class, "Subscribe failed for #{account&.acct}: #{e.message}", e.backtrace[0]
end
end
diff --git a/app/workers/refollow_worker.rb b/app/workers/refollow_worker.rb
new file mode 100644
index 0000000000..66bcd27c3e
--- /dev/null
+++ b/app/workers/refollow_worker.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class RefollowWorker
+ include Sidekiq::Worker
+
+ sidekiq_options queue: 'pull', retry: false
+
+ def perform(target_account_id)
+ target_account = Account.find(target_account_id)
+ return unless target_account.protocol == :activitypub
+
+ target_account.followers.where(domain: nil).find_each do |follower|
+ # Locally unfollow remote account
+ follower.unfollow!(target_account)
+
+ # Schedule re-follow
+ begin
+ FollowService.new.call(follower, target_account)
+ rescue Mastodon::NotPermittedError, ActiveRecord::RecordNotFound, Mastodon::UnexpectedResponseError, HTTP::Error, OpenSSL::SSL::SSLError
+ next
+ end
+ end
+ end
+end
diff --git a/app/workers/scheduler/ip_cleanup_scheduler.rb b/app/workers/scheduler/ip_cleanup_scheduler.rb
new file mode 100644
index 0000000000..9f1593c915
--- /dev/null
+++ b/app/workers/scheduler/ip_cleanup_scheduler.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+require 'sidekiq-scheduler'
+
+class Scheduler::IpCleanupScheduler
+ include Sidekiq::Worker
+
+ def perform
+ time_ago = 5.years.ago
+ SessionActivation.where('updated_at < ?', time_ago).destroy_all
+ User.where('last_sign_in_at < ?', time_ago).update_all(last_sign_in_ip: nil)
+ end
+end
diff --git a/bin/webpack b/bin/webpack
index 867550eb8f..528233a784 100755
--- a/bin/webpack
+++ b/bin/webpack
@@ -2,7 +2,6 @@
$stdout.sync = true
require "shellwords"
-require "yaml"
ENV["RAILS_ENV"] ||= "development"
RAILS_ENV = ENV["RAILS_ENV"]
@@ -20,9 +19,9 @@ unless File.exist?(WEBPACK_CONFIG)
exit!
end
-newenv = { "NODE_PATH" => NODE_MODULES_PATH.shellescape }
-cmdline = ["yarn", "run", "webpack", "--", "--config", WEBPACK_CONFIG] + ARGV
+env = { "NODE_PATH" => NODE_MODULES_PATH.shellescape }
+cmd = [ "#{NODE_MODULES_PATH}/.bin/webpack", "--config", WEBPACK_CONFIG ] + ARGV
Dir.chdir(APP_PATH) do
- exec newenv, *cmdline
+ exec env, *cmd
end
diff --git a/bin/webpack-dev-server b/bin/webpack-dev-server
index 0beec31753..c9672f6633 100755
--- a/bin/webpack-dev-server
+++ b/bin/webpack-dev-server
@@ -3,6 +3,7 @@ $stdout.sync = true
require "shellwords"
require "yaml"
+require "socket"
ENV["RAILS_ENV"] ||= "development"
RAILS_ENV = ENV["RAILS_ENV"]
@@ -13,7 +14,9 @@ NODE_ENV = ENV["NODE_ENV"]
APP_PATH = File.expand_path("../", __dir__)
CONFIG_FILE = File.join(APP_PATH, "config/webpacker.yml")
NODE_MODULES_PATH = File.join(APP_PATH, "node_modules")
-WEBPACK_CONFIG = File.join(APP_PATH, "config/webpack/development.js")
+WEBPACK_CONFIG = File.join(APP_PATH, "config/webpack/#{NODE_ENV}.js")
+
+DEFAULT_LISTEN_HOST_ADDR = NODE_ENV == 'development' ? 'localhost' : '0.0.0.0'
def args(key)
index = ARGV.index(key)
@@ -21,23 +24,45 @@ def args(key)
end
begin
- dev_server = YAML.load_file(CONFIG_FILE)["development"]["dev_server"]
+ dev_server = YAML.load_file(CONFIG_FILE)[RAILS_ENV]["dev_server"]
- DEV_SERVER_HOST = "http#{"s" if args('--https') || dev_server["https"]}://#{dev_server["host"]}:#{args('--port') || dev_server["port"]}"
+ HOSTNAME = args('--host') || dev_server["host"]
+ PORT = args('--port') || dev_server["port"]
+ HTTPS = ARGV.include?('--https') || dev_server["https"]
+ DEV_SERVER_ADDR = "http#{"s" if HTTPS}://#{HOSTNAME}:#{PORT}"
+ LISTEN_HOST_ADDR = args('--listen-host') || DEFAULT_LISTEN_HOST_ADDR
rescue Errno::ENOENT, NoMethodError
- puts "Webpack dev_server configuration not found in #{CONFIG_FILE}."
- puts "Please run bundle exec rails webpacker:install to install webpacker"
+ $stdout.puts "Webpack dev_server configuration not found in #{CONFIG_FILE}."
+ $stdout.puts "Please run bundle exec rails webpacker:install to install webpacker"
exit!
end
-newenv = {
- "NODE_PATH" => NODE_MODULES_PATH.shellescape,
- "ASSET_HOST" => DEV_SERVER_HOST.shellescape
-}.freeze
+begin
+ server = TCPServer.new(LISTEN_HOST_ADDR, PORT)
+ server.close
-cmdline = ["yarn", "run", "webpack-dev-server", "--", "--progress", "--color", "--config", WEBPACK_CONFIG] + ARGV
+rescue Errno::EADDRINUSE
+ $stdout.puts "Another program is running on port #{PORT}. Set a new port in #{CONFIG_FILE} for dev_server"
+ exit!
+end
+
+# Delete supplied host, port and listen-host CLI arguments
+["--host", "--port", "--listen-host"].each do |arg|
+ ARGV.delete(args(arg))
+ ARGV.delete(arg)
+end
+
+env = { "NODE_PATH" => NODE_MODULES_PATH.shellescape }
+
+cmd = [
+ "#{NODE_MODULES_PATH}/.bin/webpack-dev-server", "--progress", "--color",
+ "--config", WEBPACK_CONFIG,
+ "--host", LISTEN_HOST_ADDR,
+ "--public", "#{HOSTNAME}:#{PORT}",
+ "--port", PORT.to_s
+] + ARGV
Dir.chdir(APP_PATH) do
- exec newenv, *cmdline
+ exec env, *cmd
end
diff --git a/config/application.rb b/config/application.rb
index 49382c2b92..eb89f0a105 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -10,7 +10,6 @@ require_relative '../app/lib/exceptions'
require_relative '../lib/paperclip/gif_transcoder'
require_relative '../lib/paperclip/video_transcoder'
require_relative '../lib/mastodon/version'
-require_relative '../lib/mastodon/unique_retry_job_middleware'
Dotenv::Railtie.load
diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml
index b51cf46df9..b35e5c09ae 100644
--- a/config/i18n-tasks.yml
+++ b/config/i18n-tasks.yml
@@ -45,6 +45,7 @@ ignore_missing:
- 'sessions.{browsers,platforms}.*'
- 'terms.body_html'
- 'application_mailer.salutation'
+ - 'errors.500'
ignore_unused:
- 'activemodel.errors.*'
- 'activerecord.attributes.*'
diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index 689e2ac4a5..074f8c410b 100644
--- a/config/initializers/doorkeeper.rb
+++ b/config/initializers/doorkeeper.rb
@@ -7,15 +7,14 @@ Doorkeeper.configure do
current_user || redirect_to(new_user_session_url)
end
- resource_owner_from_credentials do |routes|
- request.params[:user] = { email: request.params[:username], password: request.params[:password] }
- request.env["devise.allow_params_authentication"] = true
- request.env["warden"].authenticate!(scope: :user)
+ resource_owner_from_credentials do |_routes|
+ user = User.find_by(email: request.params[:username])
+ user if !user&.otp_required_for_login? && user&.valid_password?(request.params[:password])
end
# If you want to restrict access to the web interface for adding oauth authorized applications, you need to declare the block below.
admin_authenticator do
- (current_user && current_user.admin?) || redirect_to(new_user_session_url)
+ current_user&.admin? || redirect_to(new_user_session_url)
end
# Authorization Code expiration time (default 10 minutes).
diff --git a/config/initializers/frontends.rb b/config/initializers/frontends.rb
deleted file mode 100644
index 2cb68cc61a..0000000000
--- a/config/initializers/frontends.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# Be sure to restart your server when you modify this file.
-
-Rails.application.configure do
- frontends = []
- Rails.root.join('app', 'javascript', 'packs', 'frontends').each_child(false) { |f| frontends.push f.to_s }
- config.x.available_frontends = frontends
-end
diff --git a/config/initializers/ostatus.rb b/config/initializers/ostatus.rb
index c00aba0ded..ba96fda22c 100644
--- a/config/initializers/ostatus.rb
+++ b/config/initializers/ostatus.rb
@@ -18,7 +18,6 @@ Rails.application.configure do
config.action_mailer.default_url_options = { host: web_host, protocol: https ? 'https://' : 'http://', trailing_slash: false }
config.x.streaming_api_base_url = 'ws://localhost:4000'
- config.x.use_ostatus_privacy = true
if Rails.env.production?
config.x.streaming_api_base_url = ENV.fetch('STREAMING_API_BASE_URL') { "ws#{https ? 's' : ''}://#{web_host}" }
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
index e9f455251b..f27aae7ec9 100644
--- a/config/initializers/paperclip.rb
+++ b/config/initializers/paperclip.rb
@@ -47,9 +47,12 @@ elsif ENV['SWIFT_ENABLED'] == 'true'
fog_credentials: {
provider: 'OpenStack',
openstack_username: ENV.fetch('SWIFT_USERNAME'),
- openstack_tenant: ENV.fetch('SWIFT_TENANT'),
+ openstack_project_name: ENV.fetch('SWIFT_TENANT'),
openstack_api_key: ENV.fetch('SWIFT_PASSWORD'),
openstack_auth_url: ENV.fetch('SWIFT_AUTH_URL'),
+ openstack_domain_name: ENV['SWIFT_DOMAIN_NAME'] || 'default',
+ openstack_region: ENV['SWIFT_REGION'],
+ openstack_cache_ttl: ENV['SWIFT_CACHE_TTL'] || 60,
},
fog_directory: ENV.fetch('SWIFT_CONTAINER'),
fog_host: ENV.fetch('SWIFT_OBJECT_URL'),
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index 0ee77730e8..b70784d79a 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -9,14 +9,8 @@ end
Sidekiq.configure_server do |config|
config.redis = redis_params
- config.client_middleware do |chain|
- chain.add Mastodon::UniqueRetryJobMiddleware
- end
end
Sidekiq.configure_client do |config|
config.redis = redis_params
- config.client_middleware do |chain|
- chain.add Mastodon::UniqueRetryJobMiddleware
- end
end
diff --git a/config/initializers/strong_migrations.rb b/config/initializers/strong_migrations.rb
new file mode 100644
index 0000000000..3d7beac9ff
--- /dev/null
+++ b/config/initializers/strong_migrations.rb
@@ -0,0 +1,3 @@
+# frozen_string_literal: true
+
+StrongMigrations.start_after = 20170924022025 if Rails.env.development?
diff --git a/config/initializers/twitter_regex.rb b/config/initializers/twitter_regex.rb
new file mode 100644
index 0000000000..e924fac228
--- /dev/null
+++ b/config/initializers/twitter_regex.rb
@@ -0,0 +1,42 @@
+module Twitter
+ class Regex
+
+ REGEXEN[:valid_general_url_path_chars] = /[^\p{White_Space}\(\)\?]/iou
+ REGEXEN[:valid_url_path_ending_chars] = /[^\p{White_Space}\(\)\?!\*';:=\,\.\$%\[\]\p{Pd}~&\|@]|(?:#{REGEXEN[:valid_url_balanced_parens]})/iou
+ REGEXEN[:valid_url_balanced_parens] = /
+ \(
+ (?:
+ #{REGEXEN[:valid_general_url_path_chars]}+
+ |
+ # allow one nested level of balanced parentheses
+ (?:
+ #{REGEXEN[:valid_general_url_path_chars]}*
+ \(
+ #{REGEXEN[:valid_general_url_path_chars]}+
+ \)
+ #{REGEXEN[:valid_general_url_path_chars]}*
+ )
+ )
+ \)
+ /iox
+ REGEXEN[:valid_url_path] = /(?:
+ (?:
+ #{REGEXEN[:valid_general_url_path_chars]}*
+ (?:#{REGEXEN[:valid_url_balanced_parens]} #{REGEXEN[:valid_general_url_path_chars]}*)*
+ #{REGEXEN[:valid_url_path_ending_chars]}
+ )|(?:#{REGEXEN[:valid_general_url_path_chars]}+\/)
+ )/iox
+ REGEXEN[:valid_url] = %r{
+ ( # $1 total match
+ (#{REGEXEN[:valid_url_preceding_chars]}) # $2 Preceeding chracter
+ ( # $3 URL
+ (https?:\/\/)? # $4 Protocol (optional)
+ (#{REGEXEN[:valid_domain]}) # $5 Domain(s)
+ (?::(#{REGEXEN[:valid_port_number]}))? # $6 Port number (optional)
+ (/#{REGEXEN[:valid_url_path]}*)? # $7 URL Path and anchor
+ (\?#{REGEXEN[:valid_url_query_chars]}*#{REGEXEN[:valid_url_query_ending_chars]})? # $8 Query String
+ )
+ )
+ }iox
+ end
+end
diff --git a/config/locales/activerecord.ca.yml b/config/locales/activerecord.ca.yml
index d4d3d1e401..12e347ad95 100644
--- a/config/locales/activerecord.ca.yml
+++ b/config/locales/activerecord.ca.yml
@@ -1,3 +1,4 @@
+---
ca:
activerecord:
errors:
diff --git a/config/locales/activerecord.en.yml b/config/locales/activerecord.en.yml
index c3354fa257..428aaf7273 100644
--- a/config/locales/activerecord.en.yml
+++ b/config/locales/activerecord.en.yml
@@ -1,3 +1,4 @@
+---
en:
activerecord:
errors:
diff --git a/config/locales/activerecord.fa.yml b/config/locales/activerecord.fa.yml
index eaff8f077e..1cd50eec79 100644
--- a/config/locales/activerecord.fa.yml
+++ b/config/locales/activerecord.fa.yml
@@ -1,3 +1,4 @@
+---
fa:
activerecord:
errors:
diff --git a/config/locales/activerecord.fr.yml b/config/locales/activerecord.fr.yml
index 858777c0e4..c4b04c73ad 100644
--- a/config/locales/activerecord.fr.yml
+++ b/config/locales/activerecord.fr.yml
@@ -1,3 +1,4 @@
+---
fr:
activerecord:
errors:
diff --git a/config/locales/activerecord.he.yml b/config/locales/activerecord.he.yml
index e4b16d289f..e3b363efca 100644
--- a/config/locales/activerecord.he.yml
+++ b/config/locales/activerecord.he.yml
@@ -1,3 +1,4 @@
+---
he:
activerecord:
errors:
diff --git a/config/locales/activerecord.id.yml b/config/locales/activerecord.id.yml
index fd606cd3a3..9fa093e9dd 100644
--- a/config/locales/activerecord.id.yml
+++ b/config/locales/activerecord.id.yml
@@ -1,3 +1,4 @@
+---
id:
activerecord:
errors:
diff --git a/config/locales/activerecord.it.yml b/config/locales/activerecord.it.yml
index be2f0b4c17..4cec9fb63c 100644
--- a/config/locales/activerecord.it.yml
+++ b/config/locales/activerecord.it.yml
@@ -1,3 +1,4 @@
+---
it:
activerecord:
errors:
diff --git a/config/locales/activerecord.ja.yml b/config/locales/activerecord.ja.yml
index 975912f0f2..7bc4fc3081 100644
--- a/config/locales/activerecord.ja.yml
+++ b/config/locales/activerecord.ja.yml
@@ -1,3 +1,4 @@
+---
ja:
activerecord:
attributes:
diff --git a/config/locales/activerecord.nl.yml b/config/locales/activerecord.nl.yml
index b39c8cd780..eeabab34aa 100644
--- a/config/locales/activerecord.nl.yml
+++ b/config/locales/activerecord.nl.yml
@@ -1,3 +1,4 @@
+---
nl:
activerecord:
errors:
diff --git a/config/locales/activerecord.oc.yml b/config/locales/activerecord.oc.yml
index a26018f432..e52f791887 100644
--- a/config/locales/activerecord.oc.yml
+++ b/config/locales/activerecord.oc.yml
@@ -1,3 +1,4 @@
+---
oc:
activerecord:
errors:
diff --git a/config/locales/activerecord.pl.yml b/config/locales/activerecord.pl.yml
index f82e1b8758..bd8e40a6a7 100644
--- a/config/locales/activerecord.pl.yml
+++ b/config/locales/activerecord.pl.yml
@@ -1,3 +1,4 @@
+---
pl:
activerecord:
attributes:
diff --git a/config/locales/activerecord.ru.yml b/config/locales/activerecord.ru.yml
index 316637888c..1a7ac99784 100644
--- a/config/locales/activerecord.ru.yml
+++ b/config/locales/activerecord.ru.yml
@@ -1,3 +1,4 @@
+---
ru:
activerecord:
errors:
diff --git a/config/locales/activerecord.uk.yml b/config/locales/activerecord.uk.yml
index 24febc1bce..00b2b8d8b1 100644
--- a/config/locales/activerecord.uk.yml
+++ b/config/locales/activerecord.uk.yml
@@ -1,3 +1,4 @@
+---
uk:
activerecord:
errors:
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 604b096000..666b8cb978 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -94,7 +94,7 @@ ar:
one: "إشعار واحد منذ زيارتك الأخيرة \U0001F418"
other: "%{count} إشعارات جديدة منذ زيارتك الأخيرة \U0001F418"
favourite:
- body: 'أُعجب %{name} بمنشورك'
+ body: أُعجب %{name} بمنشورك
subject: "%{name} favourited your status"
follow:
body: "%{name} من متتبعيك الآن !"
diff --git a/config/locales/devise.bg.yml b/config/locales/devise.bg.yml
index 7485b8236c..8e1ba6eb48 100644
--- a/config/locales/devise.bg.yml
+++ b/config/locales/devise.bg.yml
@@ -11,7 +11,7 @@ bg:
invalid: Невалиден имейл адрес или парола.
last_attempt: Разполагаш с още един опит преди профилът ти да бъде заключен.
locked: Профилът ти е заключен.
- not_found_in_database: "Невалидни стойности за %{authentication_keys} или парола."
+ not_found_in_database: Невалидни стойности за %{authentication_keys} или парола.
timeout: Сесията ти изтече, моля влез отново, за да продължиш.
unauthenticated: Преди да продължиш, трябва да влезеш в профила си или да се регистрираш.
unconfirmed: Преди да продължиш, трябва да потвърдиш регистрацията си.
@@ -21,12 +21,12 @@ bg:
password_change:
subject: 'Mastodon: Паролата е променена'
reset_password_instructions:
- subject: 'Инструкции за смяна на паролата'
+ subject: Инструкции за смяна на паролата
unlock_instructions:
- subject: 'Инструкции за отключване'
+ subject: Инструкции за отключване
omniauth_callbacks:
- failure: "Не успяхме да те упълномощим чрез %{kind}, защото \"%{reason}\"."
- success: "Успешно упълномощаване чрез %{kind} профил."
+ failure: Не успяхме да те упълномощим чрез %{kind}, защото "%{reason}".
+ success: Успешно упълномощаване чрез %{kind} профил.
passwords:
no_token: Може да достъпваш тази страница само от имейл за промяна на паролата. Ако тази страница е отворена от такъв имейл, увери се, че използваш целия URL-адрес, който сме ти изпратили.
send_instructions: Ще получиш писмо с инструкции как да промениш паролата си до няколко минути.
@@ -52,10 +52,10 @@ bg:
errors:
messages:
already_confirmed: е вече потвърден, моля опитай да влезеш в профила си с него
- confirmation_period_expired: "трябва да се потвърди в рамките на %{period}, моля направи нова заявка за потвърждение"
+ confirmation_period_expired: трябва да се потвърди в рамките на %{period}, моля направи нова заявка за потвърждение
expired: е изтекъл, моля заяви нов
not_found: не е намерен
not_locked: не бе заключен
not_saved:
- one: "Една грешка попречи този %{resource} да бъде записан:"
+ one: 'Една грешка попречи този %{resource} да бъде записан:'
other: "%{count} грешки попречиха този %{resource} да бъде записан:"
diff --git a/config/locales/devise.de.yml b/config/locales/devise.de.yml
index 58bfaa3d68..035a4713cb 100644
--- a/config/locales/devise.de.yml
+++ b/config/locales/devise.de.yml
@@ -2,60 +2,60 @@
de:
devise:
confirmations:
- confirmed: "Vielen Dank für deine Registrierung. Bitte melde dich jetzt an."
- send_instructions: "Du erhältst in wenigen Minuten eine E-Mail, mit der du deine Registrierung bestätigen kannst."
- send_paranoid_instructions: "Falls Deine E-Mail-Adresse in unserer Datenbank existiert, erhältst Du in wenigen Minuten eine E-Mail mit der du deine Registrierung bestätigen kannst."
+ confirmed: Vielen Dank für deine Registrierung. Bitte melde dich jetzt an.
+ send_instructions: Du erhältst in wenigen Minuten eine E-Mail, mit der du deine Registrierung bestätigen kannst.
+ send_paranoid_instructions: Falls Deine E-Mail-Adresse in unserer Datenbank existiert, erhältst Du in wenigen Minuten eine E-Mail mit der du deine Registrierung bestätigen kannst.
failure:
- already_authenticated: "Du bist bereits angemeldet."
- inactive: "Dein Account ist nicht aktiv."
- invalid: "Ungültige Anmeldedaten."
- last_attempt: "Du hast noch einen Versuch bevor dein Account gesperrt wird."
- locked: "Dein Account ist gesperrt."
- not_found_in_database: "E-Mail-Adresse oder Passwort ungültig."
- timeout: "Deine Sitzung ist abgelaufen, bitte melde dich erneut an."
- unauthenticated: "Du musst Dich anmelden oder registrieren, bevor du fortfahren kannst."
- unconfirmed: "Du musst deinen Account bestätigen, bevor du fortfahren kannst."
+ already_authenticated: Du bist bereits angemeldet.
+ inactive: Dein Account ist nicht aktiv.
+ invalid: Ungültige Anmeldedaten.
+ last_attempt: Du hast noch einen Versuch bevor dein Account gesperrt wird.
+ locked: Dein Account ist gesperrt.
+ not_found_in_database: E-Mail-Adresse oder Passwort ungültig.
+ timeout: Deine Sitzung ist abgelaufen, bitte melde dich erneut an.
+ unauthenticated: Du musst Dich anmelden oder registrieren, bevor du fortfahren kannst.
+ unconfirmed: Du musst deinen Account bestätigen, bevor du fortfahren kannst.
mailer:
confirmation_instructions:
- subject: "Mastodon: Anleitung zur Bestätigung deines Accounts"
+ subject: 'Mastodon: Anleitung zur Bestätigung deines Accounts'
password_change:
subject: 'Mastodon: Passwort wurde geändert'
reset_password_instructions:
- subject: "Mastodon: Anleitung um dein Passwort zurückzusetzen"
+ subject: 'Mastodon: Anleitung um dein Passwort zurückzusetzen'
unlock_instructions:
- subject: "Mastodon: Anleitung um deinen Account freizuschalten"
+ subject: 'Mastodon: Anleitung um deinen Account freizuschalten'
omniauth_callbacks:
- failure: "Du konntest nicht mit deinem %{kind}-Account angemeldet werden, weil '%{reason}'."
- success: "Du hast dich erfolgreich mit Deinem %{kind}-Account angemeldet."
+ failure: Du konntest nicht mit deinem %{kind}-Account angemeldet werden, weil '%{reason}'.
+ success: Du hast dich erfolgreich mit Deinem %{kind}-Account angemeldet.
passwords:
- no_token: "Du kannst diese Seite nur über den Link aus der E-Mail zum Passwort-Zurücksetzen aufrufen. Wenn du einen solchen Link aufgerufen hast, stelle bitte sicher, dass du die vollständige Adresse aufrufst."
- send_instructions: "Du erhältst in wenigen Minuten eine E-Mail mit der Anleitung, wie du dein Passwort zurücksetzen kannst."
- send_paranoid_instructions: "Falls deine E-Mail-Adresse in unserer Datenbank existiert erhältst du in wenigen Minuten eine E-Mail mit der Anleitung, wie du dein Passwort zurücksetzen kannst."
- updated: "Dein Passwort wurde geändert. Du bist jetzt angemeldet."
- updated_not_active: "Dein Passwort wurde geändert."
+ no_token: Du kannst diese Seite nur über den Link aus der E-Mail zum Passwort-Zurücksetzen aufrufen. Wenn du einen solchen Link aufgerufen hast, stelle bitte sicher, dass du die vollständige Adresse aufrufst.
+ send_instructions: Du erhältst in wenigen Minuten eine E-Mail mit der Anleitung, wie du dein Passwort zurücksetzen kannst.
+ send_paranoid_instructions: Falls deine E-Mail-Adresse in unserer Datenbank existiert erhältst du in wenigen Minuten eine E-Mail mit der Anleitung, wie du dein Passwort zurücksetzen kannst.
+ updated: Dein Passwort wurde geändert. Du bist jetzt angemeldet.
+ updated_not_active: Dein Passwort wurde geändert.
registrations:
- destroyed: "Dein Account wurde gelöscht."
- signed_up: "Du hast dich erfolgreich registriert."
- signed_up_but_inactive: "Du hast dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Account inaktiv ist."
- signed_up_but_locked: "Du hast dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Account gesperrt ist."
- signed_up_but_unconfirmed: "Du hast Dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Account noch nicht bestätigt ist. Du erhältst in Kürze eine E-Mail mit der Anleitung, wie Du Deinen Account freischalten kannst."
- update_needs_confirmation: "Deine Daten wurden aktualisiert, aber du musst deine neue E-Mail-Adresse bestätigen. Du erhälst in wenigen Minuten eine E-Mail, mit der du die Änderung deiner E-Mail-Adresse abschließen kannst."
- updated: "Deine Daten wurden aktualisiert."
+ destroyed: Dein Account wurde gelöscht.
+ signed_up: Du hast dich erfolgreich registriert.
+ signed_up_but_inactive: Du hast dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Account inaktiv ist.
+ signed_up_but_locked: Du hast dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Account gesperrt ist.
+ signed_up_but_unconfirmed: Du hast Dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Account noch nicht bestätigt ist. Du erhältst in Kürze eine E-Mail mit der Anleitung, wie Du Deinen Account freischalten kannst.
+ update_needs_confirmation: Deine Daten wurden aktualisiert, aber du musst deine neue E-Mail-Adresse bestätigen. Du erhälst in wenigen Minuten eine E-Mail, mit der du die Änderung deiner E-Mail-Adresse abschließen kannst.
+ updated: Deine Daten wurden aktualisiert.
sessions:
- already_signed_out: "Erfolgreich abgemeldet."
- signed_in: "Erfolgreich angemeldet."
- signed_out: "Erfolgreich abgemeldet."
+ already_signed_out: Erfolgreich abgemeldet.
+ signed_in: Erfolgreich angemeldet.
+ signed_out: Erfolgreich abgemeldet.
unlocks:
- send_instructions: "Du erhältst in wenigen Minuten eine E-Mail mit der Anleitung, wie du deinen Account entsperren können."
- send_paranoid_instructions: "Falls deine E-Mail-Adresse in unserer Datenbank existiert erhältst du in wenigen Minuten eine E-Mail mit der Anleitung, wie du deinen Account entsperren kannst."
- unlocked: "Dein Account wurde entsperrt. Du bist jetzt angemeldet."
+ send_instructions: Du erhältst in wenigen Minuten eine E-Mail mit der Anleitung, wie du deinen Account entsperren können.
+ send_paranoid_instructions: Falls deine E-Mail-Adresse in unserer Datenbank existiert erhältst du in wenigen Minuten eine E-Mail mit der Anleitung, wie du deinen Account entsperren kannst.
+ unlocked: Dein Account wurde entsperrt. Du bist jetzt angemeldet.
errors:
messages:
- already_confirmed: "wurde bereits bestätigt."
- confirmation_period_expired: "muss innerhalb %{period} bestätigt werden, bitte fordere einen neuen Link an."
- expired: "ist abgelaufen, bitte neu anfordern."
- not_found: "wurde nicht gefunden."
- not_locked: "ist nicht gesperrt"
+ already_confirmed: wurde bereits bestätigt.
+ confirmation_period_expired: muss innerhalb %{period} bestätigt werden, bitte fordere einen neuen Link an.
+ expired: ist abgelaufen, bitte neu anfordern.
+ not_found: wurde nicht gefunden.
+ not_locked: ist nicht gesperrt
not_saved:
- one: "Konnte %{resource} nicht speichern: ein Fehler."
- other: "Konnte %{resource} nicht speichern: %{count} Fehler."
+ one: 'Konnte %{resource} nicht speichern: ein Fehler.'
+ other: 'Konnte %{resource} nicht speichern: %{count} Fehler.'
diff --git a/config/locales/devise.eo.yml b/config/locales/devise.eo.yml
index b786647dd7..a2303ec1e3 100644
--- a/config/locales/devise.eo.yml
+++ b/config/locales/devise.eo.yml
@@ -58,4 +58,4 @@ eo:
not_locked: ne estis ŝlosita
not_saved:
one: '1 eraro malpermesis al tiu %{resource} esti konservita:'
- other: '%{count} eraroj malpermesis al tiu %{resource} esti konservita:'
+ other: "%{count} eraroj malpermesis al tiu %{resource} esti konservita:"
diff --git a/config/locales/devise.es.yml b/config/locales/devise.es.yml
index 634a5e97f6..5a689f3473 100644
--- a/config/locales/devise.es.yml
+++ b/config/locales/devise.es.yml
@@ -34,8 +34,8 @@ es:
updated: Su contraseña ha sido cambiada con éxito. Ahora ya está registrado.
updated_not_active: Su contraseña ha sido cambiada con éxito.
registrations:
- destroyed: ¡Adios! Su cuenta ha sido cancelada con éxito. Esperamos verle pronto de nuevo.
- signed_up: ¡Bienvenido! Se ha registrado con éxito.
+ destroyed: "¡Adios! Su cuenta ha sido cancelada con éxito. Esperamos verle pronto de nuevo."
+ signed_up: "¡Bienvenido! Se ha registrado con éxito."
signed_up_but_inactive: Se ha registrado con éxito. Sin embargo, no podemos identificarle porque su cuenta no ha sido activada todavía.
signed_up_but_locked: Se ha registrado con éxito. Sin embargo, no podemos identificarle porque su cuenta está bloqueada.
signed_up_but_unconfirmed: Un mensaje con un enlace de confirmación ha sido enviado a su correo electrónico. Por favor siga el enlace para activar su cuenta.
diff --git a/config/locales/devise.fa.yml b/config/locales/devise.fa.yml
index 18f63b25dc..f78412f91d 100644
--- a/config/locales/devise.fa.yml
+++ b/config/locales/devise.fa.yml
@@ -57,5 +57,5 @@ fa:
not_found: پیدا نشد
not_locked: قفل نبود
not_saved:
- one: 'خطایی نگذاشت که این %{resource} ذخیره شود'
- other: "به خاطر %{count} خطا، این %{resource} ذخیره نشد"
+ one: خطایی نگذاشت که این %{resource} ذخیره شود
+ other: به خاطر %{count} خطا، این %{resource} ذخیره نشد
diff --git a/config/locales/devise.fi.yml b/config/locales/devise.fi.yml
index bf4f530dc3..91ab9559ce 100644
--- a/config/locales/devise.fi.yml
+++ b/config/locales/devise.fi.yml
@@ -29,7 +29,7 @@ fi:
success: Onnistuneesti varmennettu %{kind} tilillä.
passwords:
no_token: Et pääse tälle sivulle ilman salasanan vaihto sähköpostia. Jos tulet tämmöisestä postista, varmista että sinulla on täydellinen URL.
- send_instructions: Jos sähköpostisi on meidän tietokannassa, saat pian ohjeet salasanan palautukseen.
+ send_instructions: Jos sähköpostisi on meidän tietokannassa, saat pian ohjeet salasanan palautukseen.
send_paranoid_instructions: Jos sähköpostisi on meidän tietokannassa, saat pian ohjeet salasanan palautukseen.
updated: Salasanasi vaihdettu onnistuneesti. Olet nyt kirjautunut sisään.
updated_not_active: Salasanasi vaihdettu onnistuneesti.
diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml
index 6805e4f38b..237ae8f6f6 100644
--- a/config/locales/devise.fr.yml
+++ b/config/locales/devise.fr.yml
@@ -17,7 +17,7 @@ fr:
unconfirmed: Vous devez valider votre compte pour continuer.
mailer:
confirmation_instructions:
- subject: "Merci de confirmer votre inscription sur %{instance}"
+ subject: Merci de confirmer votre inscription sur %{instance}
password_change:
subject: Votre mot de passe a été modifié avec succés.
reset_password_instructions:
@@ -58,4 +58,4 @@ fr:
not_locked: n’était pas verrouillé⋅e
not_saved:
one: 'Une erreur a empêché ce(tte) %{resource} d’être sauvegardé⋅e :'
- other: '%{count} erreurs ont empêché %{resource} d’être sauvegardé⋅e :'
+ other: "%{count} erreurs ont empêché %{resource} d’être sauvegardé⋅e :"
diff --git a/config/locales/devise.he.yml b/config/locales/devise.he.yml
index 975c2a3605..ddb6886251 100644
--- a/config/locales/devise.he.yml
+++ b/config/locales/devise.he.yml
@@ -2,19 +2,19 @@
he:
devise:
confirmations:
- confirmed: 'כתובת הדוא"ל אומתה בהצלחה.'
- send_instructions: 'נשלח אליך דוא"ל עם הוראות לאימות כתובת הדוא"ל שאמור להתקבל בדקות הקרובות. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.'
- send_paranoid_instructions: 'אם כתובת הדוא"ל שלך קיימת במסד הנתונים, יתקבל בדקות הקרובות דוא"ל עם הוראות לאימות כתובתך. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.'
+ confirmed: כתובת הדוא"ל אומתה בהצלחה.
+ send_instructions: נשלח אליך דוא"ל עם הוראות לאימות כתובת הדוא"ל שאמור להתקבל בדקות הקרובות. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.
+ send_paranoid_instructions: אם כתובת הדוא"ל שלך קיימת במסד הנתונים, יתקבל בדקות הקרובות דוא"ל עם הוראות לאימות כתובתך. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.
failure:
- already_authenticated: 'חשבון זה כבר מחובר.'
- inactive: 'חשבון זה טרם הופעל.'
- invalid: '%{authentication_keys} או סיסמא לא נכונים.'
- last_attempt: 'יש לך עוד ניסיון אחד לפני נעילת החשבון.'
- locked: 'חשבון זה נעול.'
+ already_authenticated: חשבון זה כבר מחובר.
+ inactive: חשבון זה טרם הופעל.
+ invalid: "%{authentication_keys} או סיסמא לא נכונים."
+ last_attempt: יש לך עוד ניסיון אחד לפני נעילת החשבון.
+ locked: חשבון זה נעול.
not_found_in_database: "%{authentication_keys} או סיסמא לא נכונים."
- timeout: 'פג תוקף השהיה בחשבון. נא להכנס מחדש על מנת להמשיך.'
- unauthenticated: 'יש להרשם או להכנס לחשבון על מנת להמשיך.'
- unconfirmed: 'יש לאמת את כתובת הדוא"ל על מנת להמשיך.'
+ timeout: פג תוקף השהיה בחשבון. נא להכנס מחדש על מנת להמשיך.
+ unauthenticated: יש להרשם או להכנס לחשבון על מנת להמשיך.
+ unconfirmed: יש לאמת את כתובת הדוא"ל על מנת להמשיך.
mailer:
confirmation_instructions:
subject: 'מסטודון: הוראות אימות'
@@ -25,29 +25,29 @@ he:
unlock_instructions:
subject: 'מסטודון: הוראות לביטול נעילה'
omniauth_callbacks:
- failure: "לא ניתן לאמת את חשבונך מ־%{kind} מהסיבה: \"%{reason}\"."
- success: "נכשל אימות מחשבון %{kind}."
+ failure: 'לא ניתן לאמת את חשבונך מ־%{kind} מהסיבה: "%{reason}".'
+ success: נכשל אימות מחשבון %{kind}.
passwords:
- no_token: 'לא ניתן לגשת לעמוד זה, אלא מדוא"ל איפוס סיסמא. אם לא הגעת מדוא"ל איפוס סיסמא, יש לוודא שכתובת הקישורית הוקלדה בשלמותה.'
- send_instructions: 'בדקות הקרובות יתקבל דוא"ל עם הוראות לאיפוס סיסמתך. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.'
- send_paranoid_instructions: 'אם כתובת הדוא"ל שלך קיימת במסד הנתונים, יתקבל בדקות הקרובות דוא"ל עם הוראות לאחזור סיסמא. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.'
- updated: 'סיסמתך שונתה בהצלחה. הינך כעת במצב מחובר.'
- updated_not_active: 'סיסמתך שונתה בהצלחה.'
+ no_token: לא ניתן לגשת לעמוד זה, אלא מדוא"ל איפוס סיסמא. אם לא הגעת מדוא"ל איפוס סיסמא, יש לוודא שכתובת הקישורית הוקלדה בשלמותה.
+ send_instructions: בדקות הקרובות יתקבל דוא"ל עם הוראות לאיפוס סיסמתך. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.
+ send_paranoid_instructions: אם כתובת הדוא"ל שלך קיימת במסד הנתונים, יתקבל בדקות הקרובות דוא"ל עם הוראות לאחזור סיסמא. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.
+ updated: סיסמתך שונתה בהצלחה. הינך כעת במצב מחובר.
+ updated_not_active: סיסמתך שונתה בהצלחה.
registrations:
- destroyed: 'בייוש! חשבונך בוטל בהצלחה. אנחנו מקווים לראות אותך שוב בקרוב.'
- signed_up: 'ברוכים הבאים! נרשמת בהצלחה.'
- signed_up_but_inactive: 'נרשמת בהצלחה. למרות זאת לא הצליחה הכניסה לחשבון מאחר וחשבונך עוד לא הופעל.'
- signed_up_but_locked: 'נרשמת בהצלחה. למרות זאת לא הצליחה הכניסה לחשבון מאחר וחשבונך נעול.'
- signed_up_but_unconfirmed: 'דוא"ל עם קישורית לאימות נשלך לכתובתך. נא לעקוב אחר הקישורית על מנת להפעיל את החשבון. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.'
- update_needs_confirmation: 'עדכת את חשבונך בהצלחה, אך יש צורך לאמת את כתובת הדוא"ל החדשה שלך. נא לבדוק בחשבון הדוא"ל לקבלת קישורית אימות על מנת לאמת את הכתובת החדשה. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.'
+ destroyed: בייוש! חשבונך בוטל בהצלחה. אנחנו מקווים לראות אותך שוב בקרוב.
+ signed_up: ברוכים הבאים! נרשמת בהצלחה.
+ signed_up_but_inactive: נרשמת בהצלחה. למרות זאת לא הצליחה הכניסה לחשבון מאחר וחשבונך עוד לא הופעל.
+ signed_up_but_locked: נרשמת בהצלחה. למרות זאת לא הצליחה הכניסה לחשבון מאחר וחשבונך נעול.
+ signed_up_but_unconfirmed: דוא"ל עם קישורית לאימות נשלך לכתובתך. נא לעקוב אחר הקישורית על מנת להפעיל את החשבון. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.
+ update_needs_confirmation: עדכת את חשבונך בהצלחה, אך יש צורך לאמת את כתובת הדוא"ל החדשה שלך. נא לבדוק בחשבון הדוא"ל לקבלת קישורית אימות על מנת לאמת את הכתובת החדשה. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.
updated: חשבונך עודכן בהצלחה.
sessions:
already_signed_out: יצאת מהחשבון בהצלחה.
signed_in: נכנסת לחשבון בהצלחה.
signed_out: יצאת מהחשבון בהצלחה.
unlocks:
- send_instructions: 'בדקות הקרובות ישלח אליך דוא"ל עם הוראות לביטול נעילת החשבון. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.'
- send_paranoid_instructions: 'אם חשבונך קיים, בדקות הקרובות ישלח אליך דוא"ל עם הוראות לביטול נעילת החשבון. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.'
+ send_instructions: בדקות הקרובות ישלח אליך דוא"ל עם הוראות לביטול נעילת החשבון. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.
+ send_paranoid_instructions: אם חשבונך קיים, בדקות הקרובות ישלח אליך דוא"ל עם הוראות לביטול נעילת החשבון. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.
unlocked: נעילת חשבונך בוטלה בהצלחה. נא להכנס לחשבון על מנת להמשיך.
errors:
messages:
diff --git a/config/locales/devise.hu.yml b/config/locales/devise.hu.yml
index 2eb7da45c9..911ba7b945 100644
--- a/config/locales/devise.hu.yml
+++ b/config/locales/devise.hu.yml
@@ -28,7 +28,7 @@ hu:
failure: "%{kind} nem hitelesíthető, mert %{reason}."
success: Sikeres hitelesítés %{kind} fiókról.
passwords:
- no_token: Nem férhetsz hozzá az oldalhoz jelszó visszaállító e-mail nélkül. Ha egy jelszó visszaállító e-mail hozott ide, ellenőrizd, hogy a megadott teljes URL-t használd.
+ no_token: Nem férhetsz hozzá az oldalhoz jelszó visszaállító e-mail nélkül. Ha egy jelszó visszaállító e-mail hozott ide, ellenőrizd, hogy a megadott teljes URL-t használd.
send_instructions: Pár percen belül kapni fogsz egy e-mailt arról, hogy hogyan tudod visszaállítani a jelszavadat.
send_paranoid_instructions: Ha létezik az e-mail cím, pár percen belül kapni fogsz egy e-mailt arról, hogy hogyan tudod visszaállítani a jelszavadat.
updated: Jelszavad sikeresen frissült. Bejelentkeztél.
@@ -36,7 +36,7 @@ hu:
registrations:
destroyed: Viszlát! A fiókod sikeresen törölve. Reméljük hamarosan viszontláthatunk.
signed_up: Üdvözlünk! Sikeresen regisztráltál.
- signed_up_but_inactive: Sikeresen regisztráltál. Ennek ellenére nem tudunk beléptetni, ugyanis a fiókod még nem lett aktiválva.
+ signed_up_but_inactive: Sikeresen regisztráltál. Ennek ellenére nem tudunk beléptetni, ugyanis a fiókod még nem lett aktiválva.
signed_up_but_locked: Sikeresen regisztráltál. Ennek ellenére nem tudunk beléptetni, ugyanis a fiókod le lett zárva.
signed_up_but_unconfirmed: Egy üzenet a megerősítési linkkel kiküldésre került az e-mail címedre. Kérjük használd a linket a fiókod aktiválásához.
update_needs_confirmation: Sikeresen frissítetted a fiókodat, de szükségünk van az e-mail címed megerősítésére. Kérlek ellenőrizd az e-mailedet és kövesd a levélben szereplő megerősítési linket az e-mail címed megerősítéséhez.
diff --git a/config/locales/devise.ja.yml b/config/locales/devise.ja.yml
index 5d61ccdec5..aa333920e9 100644
--- a/config/locales/devise.ja.yml
+++ b/config/locales/devise.ja.yml
@@ -8,10 +8,10 @@ ja:
failure:
already_authenticated: 既にログイン済みです。
inactive: あなたのアカウントはまだ有効化されていません。
- invalid: '%{authentication_keys}かパスワードが誤っています。'
+ invalid: "%{authentication_keys}かパスワードが誤っています。"
last_attempt: あと1回失敗するとアカウントがロックされます。
locked: アカウントはロックされました。
- not_found_in_database: '%{authentication_keys}かパスワードが誤っています'
+ not_found_in_database: "%{authentication_keys}かパスワードが誤っています。"
timeout: セッションの有効期限が切れました。続行するには再度ログインしてください。
unauthenticated: 続行するにはログインするか、アカウントを作成してください。
unconfirmed: 続行するにはメールアドレスを確認する必要があります。
@@ -25,8 +25,8 @@ ja:
unlock_instructions:
subject: 'Mastodon: アカウントのロックの解除'
omniauth_callbacks:
- failure: '%{reason}によって%{kind}からのアクセスを認証できませんでした。'
- success: '%{kind}からのアクセスは正常に認証されました。'
+ failure: "%{reason}によって%{kind}からのアクセスを認証できませんでした。"
+ success: "%{kind}からのアクセスは正常に認証されました。"
passwords:
no_token: パスワード再発行のメール以外からこのページにアクセスすることはできません。 パスワード再発行のメールからアクセスしたのにもかかわらずこのメッセージが表示される場合は、アクセスしたURLが間違っていないか確認してください。
send_instructions: パスワード再発行の方法が記載されたメールが間もなく送信されます。
@@ -52,10 +52,10 @@ ja:
errors:
messages:
already_confirmed: は確認されました。ログインを試してください。
- confirmation_period_expired: '%{period}以内に確認が必要です。再度試してください。'
+ confirmation_period_expired: "%{period}以内に確認が必要です。再度試してください。"
expired: は期限切れです。再度試してください。
not_found: 見つかりません。
not_locked: ロックされていません。
not_saved:
- one: 'エラーが発生したため、%{resource}の保存に失敗しました。'
+ one: エラーが発生したため、%{resource}の保存に失敗しました。
other: "%{count}個のエラーが発生したため、保存に失敗しました。 %{resource}"
diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml
index f8f59e6608..ff79d036ee 100644
--- a/config/locales/devise.nl.yml
+++ b/config/locales/devise.nl.yml
@@ -24,7 +24,7 @@ nl:
reset_password_instructions:
subject: 'Mastodon: Wachtwoord opnieuw instellen'
unlock_instructions:
- subject: 'Mastodon: Instructies om opschorten account ongedaan te maken'
+ subject: 'Mastodon: Instructies om opschorten account ongedaan te maken'
omniauth_callbacks:
failure: Kon je niet aanmelden met jouw %{kind} account, omdat "%{reason}".
success: Successvol aangemeld met jouw %{kind} account.
diff --git a/config/locales/devise.oc.yml b/config/locales/devise.oc.yml
index 99e62a10e4..5cccb48ffc 100644
--- a/config/locales/devise.oc.yml
+++ b/config/locales/devise.oc.yml
@@ -17,13 +17,13 @@ oc:
unconfirmed: Vos cal confirmar vòstra adreça de corrièl abans de contunhar.
mailer:
confirmation_instructions:
- subject: "Mercés de confirmar vòstra inscripcion sus %{instance}"
+ subject: Mercés de confirmar vòstra inscripcion sus %{instance}
password_change:
- subject: 'Mastodon : senhal cambiat'
+ subject: Mastodon : senhal cambiat
reset_password_instructions:
- subject: 'Mastodon : instruccions per reïnicializar lo senhal'
+ subject: Mastodon : instruccions per reïnicializar lo senhal
unlock_instructions:
- subject: 'Mastodon : instuccions de desblocatge'
+ subject: Mastodon : instuccions de desblocatge
omniauth_callbacks:
failure: Fracàs al moment de vos autentificar de %{kind} perque "%{reason}".
success: Sètz ben autentificat dempuèi lo compte %{kind}.
diff --git a/config/locales/devise.pl.yml b/config/locales/devise.pl.yml
index d537efc6eb..4b1eb2c60e 100644
--- a/config/locales/devise.pl.yml
+++ b/config/locales/devise.pl.yml
@@ -58,4 +58,4 @@ pl:
not_locked: było zablokowane
not_saved:
one: '1 błąd uniemożliwił zapisanie zasobu %{resource}:'
- other: "Błędy (%{count}) uniemożliwiły zapisanie zasobu %{resource}:"
+ other: 'Błędy (%{count}) uniemożliwiły zapisanie zasobu %{resource}:'
diff --git a/config/locales/devise.pt-BR.yml b/config/locales/devise.pt-BR.yml
index c647fabbd8..13736b3a35 100644
--- a/config/locales/devise.pt-BR.yml
+++ b/config/locales/devise.pt-BR.yml
@@ -2,60 +2,60 @@
pt-BR:
devise:
confirmations:
- confirmed: O seu endereço de email foi confirmado.
- send_instructions: Você irá receber um email com instruções em como confirmar o seu endereço de email dentro de alguns minutos.
- send_paranoid_instructions: Se o seu endereço de email já existir na nossa base de dados, irá receber um email com instruções em como confirmá-lo dentro de alguns minutos.
+ confirmed: O seu endereço de e-mail foi confirmado.
+ send_instructions: Você receberá uma mensagem em sua caixa de entrada com instruções sobre como confirmar o seu endereço de e-mail dentro de alguns minutos. Por favor, cheque a sua pasta de spam caso não tenha recebido esta mensagem.
+ send_paranoid_instructions: Se o seu endereço de e-mail já existir em nossa base de dados, você receberá uma mensagem em sua caixa de entrada com instruções sobre confirmá-lo dentro de alguns minutos. Por favor, cheque a sua pasta de spam caso não tenha recebido esta mensagem.
failure:
already_authenticated: A sua sessão já está aberta.
inactive: A sua contra ainda não está ativada.
- invalid: "%{authentication_keys} ou password inválidos."
- last_attempt: Tem mais uma tentativa antes de a sua conta ser protegida.
- locked: A sua conta está protegida
- not_found_in_database: "%{authentication_keys} ou password inválidos."
- timeout: A sua sessão expirou. Por favore entre de novo para continuar.
- unauthenticated: Você precsa de entrar ou registar-se antes de continuar.
- unconfirmed: Você tem de confirmar o seu endereço de email antes de continuar.
+ invalid: "%{authentication_keys} ou senha inválida."
+ last_attempt: Você tem apenas mais uma tentativa sobrando antes que a sua conta seja bloqueada.
+ locked: A sua conta está bloqueada.
+ not_found_in_database: "%{authentication_keys} ou senha inválida."
+ timeout: A sua sessão expirou. Por favor, entre novamente para continuar.
+ unauthenticated: Você precisa entrar ou registar-se antes de continuar.
+ unconfirmed: Você precisa confirmar o seu endereço de e-mail antes de continuar.
mailer:
confirmation_instructions:
subject: 'Mastodon: Instruções de confirmação'
password_change:
- subject: 'Mastodon: Password nova'
+ subject: 'Mastodon: Senha modificada'
reset_password_instructions:
- subject: 'Mastodon: Instruções para editar a password'
+ subject: 'Mastodon: Instruções para mudança de senha'
unlock_instructions:
- subject: 'Mastodon: Instruções para desproteger a sua conta'
+ subject: 'Mastodon: Instruções de desbloqueio'
omniauth_callbacks:
- failure: Could not authenticate you from %{kind} because "%{reason}".
- success: Successfully authenticated from %{kind} account.
+ failure: Não foi possível autenticá-lo como %{kind} porque "%{reason}".
+ success: Autenticado com sucesso como %{kind}.
passwords:
- no_token: Você não pode aceder a esta página sem ter vindo de um email para mudar a password. Se este for o case, por favor faça questão de verificar que usou o URL no email.
- send_instructions: Irá receber um email com instruções em como mudar a sua password dentro de algns minutos.
- send_paranoid_instructions: Se seu endereço de email existe na nossa base de dados, irá receber um link para recuperar a sua password dentro de alguns minutos.
- updated: A sua password foi alterada. A sua sessão está aberta.
- updated_not_active: A sua password foi alterada.
+ no_token: Você não pode acessar esta página se não tiver vindo de uma mensagem de mudança de senha. Se este for o caso, por favor verifique se a URL utilizada está completa.
+ send_instructions: Se o seu endereço de e-mail já estiver cadastrado em nossa base de dados, você receberá uma mensagem com um link para realizar a mudança de senha em alguns minutos. Por favor, cheque a sua pasta de spam caso não tenha recebido esta mensagem.
+ send_paranoid_instructions: Se o seu endereço de e-mail já estiver cadastrado em nossa base de dados, você receberá uma mensagem com um link para realizar a mudança de senha em alguns minutos. Por favor, cheque a sua pasta de spam caso não tenha recebido esta mensagem.
+ updated: A sua senha foi alterada. A sua sessão está aberta.
+ updated_not_active: A sua senha foi alterada.
registrations:
destroyed: Adeus! A sua conta foi cancelada. Esperamos vê-lo em breve.
- signed_up: Bem vindo! A sua conta foi registada com sucesso.
- signed_up_but_inactive: A sua conta foi registada. No entanto, não abrimos a sua sessão porque a sua conta ainda não foi ativada.
- signed_up_but_locked: A sua conta foi registada. No entanto, não abrimos a sua sessão porque a sua conta está protegida.
- signed_up_but_unconfirmed: Uma mensagem com um link de confirmação foi enviada para o seu email. Por favor siga o link para ativar a sua conta.
- update_needs_confirmation: Você mudou o seu endereço de email ou password, mas é necessário confirmar a mudança. Por favor siga o link que foi enviado para o seu novo endereço de email.
+ signed_up: Bem vindo! A sua conta foi registrada com sucesso.
+ signed_up_but_inactive: A sua conta foi registrada. No entanto, não abrimos a sua sessão porque a sua conta ainda não foi ativada.
+ signed_up_but_locked: A sua conta foi registrada. No entanto, não abrimos a sua sessão porque a sua conta está bloqueada.
+ signed_up_but_unconfirmed: Uma mensagem com um link de confirmação foi enviada para o seu endereço de e-mail. Por favor, siga o link para ativar a sua conta e, caso não tenha recebido esta mensagem, cheque a sua pasta de spam.
+ update_needs_confirmation: Você mudou o seu endereço de e-mail ou a sua senha, mas é necessário confirmar a mudança. Por favor siga o link que foi enviado para o seu novo endereço de e-mail e, caso não tenha recebido esta mensagem, cheque a sua pasta de spam.
updated: A sua conta foi alterada com sucesso.
sessions:
- already_signed_out: Sessão fechada.
+ already_signed_out: Sessão encerrada.
signed_in: Sessão iniciada.
- signed_out: Sessão fechada.
+ signed_out: Sessão encerrada.
unlocks:
- send_instructions: Irá receber um email com instruções para desproteger a sua conta dentro de alguns minutos.
- send_paranoid_instructions: Se a sua conta existe, irá receber um email com instruções a detalhar como a desproteger dentro de alguns minutos.
- unlocked: A sua conta foi desprotegida. Por favor inicie sessão para continuar.
+ send_instructions: Você receberá uma mensagem com instruções para desbloquear a sua conta em alguns instantes. Por favor, cheque a sua pasta de spam caso não tenha recebido esta mensagem.
+ send_paranoid_instructions: Se a sua conta já existe, você receberá uma mensagem com instruções para desbloquear a sua conta em alguns instantes. Por favor, cheque a sua pasta de spam caso não tenha recebido esta mensagem.
+ unlocked: A sua conta foi desbloqueada com sucesso. Por favor inicie sessão para continuar.
errors:
messages:
already_confirmed: já foi confirmado, por favor tente iniciar sessão
- confirmation_period_expired: tem de ser confirmado dentro de %{period}, por favor tente outra vez
- expired: expirou, por favor tente outra vez
+ confirmation_period_expired: precisa ser confirmada em até %{period}, por favor, solicite novo link de confirmação
+ expired: expirou, por favor solicite uma nova
not_found: não encontrado
- not_locked: não está protegido
+ not_locked: não está bloqueada
not_saved:
- one: '1 erro impediu este %{resource} de ser guardado:'
- other: "%{count} erros impediram este %{resource} de ser guardado:"
+ one: '1 erro impediu este %{resource} de ser salvo(a):'
+ other: "%{count} erros impediram este %{resource} de ser salvo(a):"
diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml
index c38839b9ab..e627653f1f 100644
--- a/config/locales/devise.zh-TW.yml
+++ b/config/locales/devise.zh-TW.yml
@@ -57,5 +57,5 @@ zh-TW:
not_found: 找不到
not_locked: 並未被鎖定
not_saved:
- one: '1 個錯誤使 %{resource} 無法被儲存︰'
+ one: 1 個錯誤使 %{resource} 無法被儲存︰
other: "%{count} 個錯誤使 %{resource} 無法被儲存︰"
diff --git a/config/locales/doorkeeper.ar.yml b/config/locales/doorkeeper.ar.yml
index cd4a9cb50c..7980e107a7 100644
--- a/config/locales/doorkeeper.ar.yml
+++ b/config/locales/doorkeeper.ar.yml
@@ -57,7 +57,7 @@ ar:
prompt: طلبَ تطبيق %{client_name} تصريحا لاستعمال حسابك.
title: إذن بالتصريح
show:
- title: رمز الترخيص
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: إبطال التصريح
diff --git a/config/locales/doorkeeper.bg.yml b/config/locales/doorkeeper.bg.yml
index 6fafdfc554..24de4aee0a 100644
--- a/config/locales/doorkeeper.bg.yml
+++ b/config/locales/doorkeeper.bg.yml
@@ -57,7 +57,7 @@ bg:
prompt: Приложението %{client_name} заявява достъп до твоя акаунт
title: Изисква се упълномощаване
show:
- title: Код за упълномощаване
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Отмяна
diff --git a/config/locales/doorkeeper.ca.yml b/config/locales/doorkeeper.ca.yml
index ef937c4e63..38dbbdde97 100644
--- a/config/locales/doorkeeper.ca.yml
+++ b/config/locales/doorkeeper.ca.yml
@@ -57,7 +57,7 @@ ca:
prompt: La aplicació %{client_name} sol⋅licita tenir accés al teu compte
title: Es requereix autorizació
show:
- title: Codi de autorització
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Revocar
diff --git a/config/locales/doorkeeper.de.yml b/config/locales/doorkeeper.de.yml
index b0ba2fb98b..1588e4f9ec 100644
--- a/config/locales/doorkeeper.de.yml
+++ b/config/locales/doorkeeper.de.yml
@@ -57,7 +57,7 @@ de:
prompt: Soll %{client_name} für die Benutzung dieses Accounts autorisiert werden?
title: Autorisierung erforderlich
show:
- title: Autorisierungscode
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Ungültig machen
diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml
index efbd81d43c..33d544bed5 100644
--- a/config/locales/doorkeeper.en.yml
+++ b/config/locales/doorkeeper.en.yml
@@ -63,7 +63,7 @@ en:
prompt: Application %{client_name} requests access to your account
title: Authorization required
show:
- title: Authorization code
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Revoke
diff --git a/config/locales/doorkeeper.eo.yml b/config/locales/doorkeeper.eo.yml
index 33cc7cc199..ce39f3bd12 100644
--- a/config/locales/doorkeeper.eo.yml
+++ b/config/locales/doorkeeper.eo.yml
@@ -57,7 +57,7 @@ eo:
prompt: La aplikaĵo %{client_name} petas aliron al via konto
title: Rajtigo bezonata
show:
- title: Rajtiga kodo
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Malrajtigi
diff --git a/config/locales/doorkeeper.es.yml b/config/locales/doorkeeper.es.yml
index f3efb23012..ca6e620d88 100644
--- a/config/locales/doorkeeper.es.yml
+++ b/config/locales/doorkeeper.es.yml
@@ -5,6 +5,8 @@ es:
doorkeeper/application:
name: Nombre
redirect_uri: URI para redirección
+ scopes: Ámbitos
+ website: Sitio web
errors:
models:
doorkeeper/application:
@@ -23,26 +25,30 @@ es:
edit: Editar
submit: Enviar
confirmations:
- destroy: ¿Está seguro?
+ destroy: "¿Está seguro?"
edit:
title: Editar aplicación
form:
- error: ¡Uuups! Compruebe su formulario
+ error: "¡Uuups! Compruebe su formulario"
help:
native_redirect_uri: Utilice %{native_redirect_uri} para pruebas locales
redirect_uri: Utilice una línea por URI
scopes: Separe los ámbitos con espacios. Déjelo en blanco para utilizar los ámbitos por defecto.
index:
+ application: Aplicación
callback_url: Callback URL
+ delete: Eliminar
name: Nombre
new: Nueva aplicación
+ scopes: Ámbitos
+ show: Mostrar
title: Sus aplicaciones
new:
title: Nueva aplicación
show:
actions: Acciones
application_id: Id de la aplicación
- callback_urls: Callback urls
+ callback_urls: Callback URLs
scopes: Ámbitos
secret: Secreto
title: 'Aplicación: %{name}'
@@ -57,16 +63,17 @@ es:
prompt: La aplicación %{client_name} solicita tener acceso a su cuenta
title: Se requiere autorización
show:
- title: Código de autorización
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Revocar
confirmations:
- revoke: ¿Está seguro?
+ revoke: "¿Está seguro?"
index:
application: Aplicación
created_at: Creado el
date_format: "%A-%m-%d %H:%M:%S"
+ scopes: Ámbitos
title: Sus aplicaciones autorizadas
errors:
messages:
diff --git a/config/locales/doorkeeper.fa.yml b/config/locales/doorkeeper.fa.yml
index 3435805307..6a4be575e0 100644
--- a/config/locales/doorkeeper.fa.yml
+++ b/config/locales/doorkeeper.fa.yml
@@ -63,7 +63,7 @@ fa:
prompt: Application %{client_name} requests access to your account
title: Authorization required
show:
- title: Authorization code
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Revoke
diff --git a/config/locales/doorkeeper.fi.yml b/config/locales/doorkeeper.fi.yml
index cd1a9d0584..44aceec4cc 100644
--- a/config/locales/doorkeeper.fi.yml
+++ b/config/locales/doorkeeper.fi.yml
@@ -57,7 +57,7 @@ fi:
prompt: Applikaatio %{client_name} pyytää lupaa tilillesi
title: Valtuutus vaaditaan
show:
- title: Valtuutus koodi
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Evää
diff --git a/config/locales/doorkeeper.fr.yml b/config/locales/doorkeeper.fr.yml
index 4870182092..3398b248d6 100644
--- a/config/locales/doorkeeper.fr.yml
+++ b/config/locales/doorkeeper.fr.yml
@@ -59,7 +59,7 @@ fr:
prompt: Autoriser %{client_name} à utiliser votre compte ?
title: Autorisation requise
show:
- title: Code d’autorisation
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Annuler
diff --git a/config/locales/doorkeeper.he.yml b/config/locales/doorkeeper.he.yml
index 7789027888..78e72a56f2 100644
--- a/config/locales/doorkeeper.he.yml
+++ b/config/locales/doorkeeper.he.yml
@@ -1,5 +1,5 @@
---
-he :
+he:
activerecord:
attributes:
doorkeeper/application:
@@ -57,7 +57,7 @@ he :
prompt: ישום %{client_name} מבקש גישה לחשבונך
title: נדרשת הרשאה
show:
- title: קוד הרשאה
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: ביטול
@@ -72,7 +72,7 @@ he :
errors:
messages:
access_denied: בעלי המשאב או שרת ההרשאה דחו את הבקשה.
- credential_flow_not_configured: 'התהליך "Resource Owner Password Credentials" נכשל בשל חוסר בתצורת Doorkeeper.configure.resource_owner_from_credentials.'
+ credential_flow_not_configured: התהליך "Resource Owner Password Credentials" נכשל בשל חוסר בתצורת Doorkeeper.configure.resource_owner_from_credentials.
invalid_client: הרשאת הלקוח נכשלה עקב לקוח שאינו ידוע, חוסר בהרשאת לקוח או שיטת הרשאה שאינה נתמכת.
invalid_grant: חוזה ההרשאה המצורף אינו חוקי, אינו תקף, מבוטל, או שאינו מתאים לקישורית ההפניה שבשימוש על ידי בקשת ההרשאה, או שהופק על ידי לקוח אחר.
invalid_redirect_uri: קישורית ההפניה המצורפת אינה חוקית.
diff --git a/config/locales/doorkeeper.hr.yml b/config/locales/doorkeeper.hr.yml
index 26d21c10da..e0240938ea 100644
--- a/config/locales/doorkeeper.hr.yml
+++ b/config/locales/doorkeeper.hr.yml
@@ -57,7 +57,7 @@ hr:
prompt: Aplikacija %{client_name} je zatražila pristup tvom računu
title: Traži se autorizacija
show:
- title: Autorizacijski kod
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Odbij
diff --git a/config/locales/doorkeeper.hu.yml b/config/locales/doorkeeper.hu.yml
index b1c6dd6c96..54e732f0c7 100644
--- a/config/locales/doorkeeper.hu.yml
+++ b/config/locales/doorkeeper.hu.yml
@@ -57,7 +57,7 @@ hu:
prompt: "%{client_name} nevű alkalmazás engedélyt kér a fiókodhoz való hozzáféréshez."
title: Engedély szükséges
show:
- title: Engedély kódja
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Visszavonás
@@ -84,7 +84,7 @@ hu:
unknown: Hozzáférési kulcs érvénytelen
resource_owner_authenticator_not_configured: Erőforrás tulajdonos keresés megszakadt, ugyanis a Doorkeeper.configure.resource_owner_authenticator beállítatlan.
server_error: Hitelesítő szervert váratlan esemény érte, mely meggátolta a kérés teljesítését.
- temporarily_unavailable: A hitelesítő szerver jelenleg nem tudja teljesíteni a kérést egy átmeneti túlterheltség vagy a kiszolgáló karbantartása miatt.
+ temporarily_unavailable: A hitelesítő szerver jelenleg nem tudja teljesíteni a kérést egy átmeneti túlterheltség vagy a kiszolgáló karbantartása miatt.
unauthorized_client: A kliens nincs feljogosítva a kérés teljesítésére.
unsupported_grant_type: A hitelesítés módja nem támogatott a hitelesítő kiszolgálón.
unsupported_response_type: A hitelesítő kiszolgáló nem támogatja ezt a választ.
diff --git a/config/locales/doorkeeper.id.yml b/config/locales/doorkeeper.id.yml
index 4ae97c5df4..95560ecf91 100644
--- a/config/locales/doorkeeper.id.yml
+++ b/config/locales/doorkeeper.id.yml
@@ -57,7 +57,7 @@ id:
prompt: Aplikasi %{client_name} meminta akses pada akun anda
title: Izin diperlukan
show:
- title: Kode izin
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Cabut izin
diff --git a/config/locales/doorkeeper.io.yml b/config/locales/doorkeeper.io.yml
index 8c093a9d82..28466d3aef 100644
--- a/config/locales/doorkeeper.io.yml
+++ b/config/locales/doorkeeper.io.yml
@@ -57,7 +57,7 @@ io:
prompt: Application %{client_name} requests access to your account
title: Authorization required
show:
- title: Authorization code
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Revoke
diff --git a/config/locales/doorkeeper.it.yml b/config/locales/doorkeeper.it.yml
index 4b5e463b0a..e5a2d3f6e2 100644
--- a/config/locales/doorkeeper.it.yml
+++ b/config/locales/doorkeeper.it.yml
@@ -57,7 +57,7 @@ it:
prompt: L'applicazione %{client_name} richiede l'accesso al tuo account
title: Autorizzazione richiesta
show:
- title: Codice autorizzazione
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Disabilita
diff --git a/config/locales/doorkeeper.ja.yml b/config/locales/doorkeeper.ja.yml
index 9e3b727612..1f145eaa3e 100644
--- a/config/locales/doorkeeper.ja.yml
+++ b/config/locales/doorkeeper.ja.yml
@@ -25,14 +25,14 @@ ja:
edit: 編集
submit: 送信
confirmations:
- destroy: 本当に削除しますか?
+ destroy: 本当に削除しますか?
edit:
title: アプリの編集
form:
error: フォームにエラーが無いか確認してください。
help:
native_redirect_uri: ローカルテストに %{native_redirect_uri} を使用
- redirect_uri: 一行に一つのURLを入力してください
+ redirect_uri: 一行に一つのURLを入力してください。
scopes: アクセス権は半角スペースで区切ることができます。 空白のままにするとデフォルトを使用します。
index:
application: アプリ
@@ -63,7 +63,7 @@ ja:
prompt: アプリ %{client_name} があなたのアカウントへのアクセスを要求しています。
title: 認証が必要です。
show:
- title: 認証コード
+ title: 認証コードをコピーしてアプリに貼り付けて下さい。
authorized_applications:
buttons:
revoke: 取消
diff --git a/config/locales/doorkeeper.nl.yml b/config/locales/doorkeeper.nl.yml
index 77cf2503b4..f97aa81114 100644
--- a/config/locales/doorkeeper.nl.yml
+++ b/config/locales/doorkeeper.nl.yml
@@ -3,9 +3,10 @@ nl:
activerecord:
attributes:
doorkeeper/application:
- name: Naam
+ name: Naam toepassing
redirect_uri: Redirect-URI
- scopes: Scopes
+ scopes: Toestemmingen
+ website: Website toepassing
errors:
models:
doorkeeper/application:
@@ -26,27 +27,31 @@ nl:
confirmations:
destroy: Weet je het zeker?
edit:
- title: Applicatie bewerken
+ title: Toepassing bewerken
form:
error: Oops! Controleer het formulier op fouten
help:
native_redirect_uri: Gebruik %{native_redirect_uri} voor lokale tests
redirect_uri: 'Gebruik één regel per URI. '
- scopes: Scopes met spaties van elkaar scheiden. Laat leeg om de standaardscopes te gebruiken.
+ scopes: Toestemmingen met spaties van elkaar scheiden. Laat leeg om de standaardtoestemmingen te gebruiken.
index:
+ application: Toepassing
callback_url: Callback-URL
+ delete: Verwijderen
name: Naam
- new: Nieuwe applicatie
- title: Jouw applicaties
+ new: Nieuwe toepassing
+ scopes: Toestemmingen
+ show: Tonen
+ title: Jouw toepassingen
new:
- title: Nieuwe applicatie
+ title: Nieuwe toepassing
show:
actions: Acties
- application_id: Applicatie-ID
+ application_id: Client-key
callback_urls: Callback-URL's
- scopes: Scopes
- secret: Secret
- title: 'Applicatie: %{name}'
+ scopes: Toestemmingen
+ secret: Client-secret
+ title: 'Toepassing: %{name}'
authorizations:
buttons:
authorize: Autoriseren
@@ -54,21 +59,21 @@ nl:
error:
title: Er is een fout opgetreden
new:
- able_to: Deze applicatie zal in staat zijn om
+ able_to: Deze toepassing zal in staat zijn om
prompt: "%{client_name} autoriseren om uw account te gebruiken?"
title: Autorisatie vereist
show:
- title: Autorisatie-code
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Intrekken
confirmations:
revoke: Weet je het zeker?
index:
- application: Applicatie
+ application: Toepassing
created_at: Aangemaakt op
date_format: "%d-%m-%Y %H:%M:%S"
- title: Jouw geautoriseerde applicaties
+ title: Jouw geautoriseerde toepassingen
errors:
messages:
access_denied: De resource-eigenaar of autorisatie-server weigerde het verzoek.
@@ -87,28 +92,28 @@ nl:
server_error: De autorisatieserver is is een onverwachte situatie tegengekomen die het verzoek verhinderde.
temporarily_unavailable: De autorisatieserver is momenteel niet in staat het verzoek te behandelen als gevolg van een tijdelijke overbelasting of onderhoud aan de server.
unauthorized_client: De client is niet bevoegd om dit verzoek op deze manier uit te voeren.
- unsupported_grant_type: Het type autorisatie wordt niet door de autorisatieserver ondersteund
+ unsupported_grant_type: Het type autorisatie wordt niet door de autorisatieserver ondersteund
unsupported_response_type: De autorisatieserver ondersteund dit antwoordtype niet
flash:
applications:
create:
- notice: Applicatie aangemaakt.
+ notice: Toepassing aangemaakt.
destroy:
- notice: Applicatie verwijderd.
+ notice: Toepassing verwijderd.
update:
- notice: Applicatie bewerkt.
+ notice: Toepassing bewerkt.
authorized_applications:
destroy:
- notice: Applicatie ingetrokken.
+ notice: Toepassing ingetrokken.
layouts:
admin:
nav:
- applications: Applicaties
+ applications: Toepassingen
home: Home
oauth2_provider: OAuth2-provider
application:
title: OAuth-autorisatie vereist
scopes:
- follow: accounts te volgen, te negeren en te blokkeren.
- read: jouw accountgegevens te lezen
- write: namens jou berichten te plaatsen
+ follow: accounts volgen, negeren en blokkeren
+ read: berichten lezen
+ write: berichten plaatsen
diff --git a/config/locales/doorkeeper.no.yml b/config/locales/doorkeeper.no.yml
index 23ca61d4dd..ba061e0cac 100644
--- a/config/locales/doorkeeper.no.yml
+++ b/config/locales/doorkeeper.no.yml
@@ -57,7 +57,7 @@
prompt: Applikasjon %{client_name} spør om tilgang til din konto
title: Autorisasjon påkrevd
show:
- title: Autoriserings kode
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Opphev
diff --git a/config/locales/doorkeeper.oc.yml b/config/locales/doorkeeper.oc.yml
index b6aebea487..1ec1b69e82 100644
--- a/config/locales/doorkeeper.oc.yml
+++ b/config/locales/doorkeeper.oc.yml
@@ -6,7 +6,7 @@ oc:
name: Nom
redirect_uri: URL de redireccion
scopes: Encastres
- website: Aplicacion web
+ website: Site de l’aplicacion
errors:
models:
doorkeeper/application:
@@ -51,7 +51,7 @@ oc:
callback_urls: urls de rapèls
scopes: Encastres
secret: Secret
- title: 'Aplicacion : %{name}'
+ title: Aplicacion : %{name}
authorizations:
buttons:
authorize: Autorizar
@@ -63,7 +63,7 @@ oc:
prompt: L’aplicacion %{client_name} demanda l’accès al vòstre compte.
title: Cal l’autorizacion
show:
- title: Còdi d’autorizacion
+ title: Copiatz lo còdi d’autorizacion e pegatz-lo dins l’aplicacion.
authorized_applications:
buttons:
revoke: Revocar
@@ -71,8 +71,8 @@ oc:
revoke: Ne sètz segur ?
index:
application: Aplicacion
- created_at: Creada lo
- date_format: "%d-%m-%Y %Ho%M %S"
+ created_at: Creacion
+ date_format: "%-d %b. de %Y %Ho%M %S"
scopes: Encastres
title: Las vòstras aplicacions autorizadas
errors:
diff --git a/config/locales/doorkeeper.pl.yml b/config/locales/doorkeeper.pl.yml
index ee3f4cad87..fa4324e4de 100644
--- a/config/locales/doorkeeper.pl.yml
+++ b/config/locales/doorkeeper.pl.yml
@@ -63,7 +63,7 @@ pl:
prompt: Aplikacja %{client_name} prosi o dostęp do Twojego konta
title: Wymagana jest autoryzacja
show:
- title: Kod autoryzacji
+ title: Skopiuj kod uwierzytelniający i wklej go w aplikacji.
authorized_applications:
buttons:
revoke: Unieważnij
diff --git a/config/locales/doorkeeper.pt-BR.yml b/config/locales/doorkeeper.pt-BR.yml
index 85ea3bfccf..53cadec381 100644
--- a/config/locales/doorkeeper.pt-BR.yml
+++ b/config/locales/doorkeeper.pt-BR.yml
@@ -3,17 +3,19 @@ pt-BR:
activerecord:
attributes:
doorkeeper/application:
- name: Nome
- redirect_uri: Redirect URI
+ name: Nome do aplicativo
+ redirect_uri: URI de redirecionamento
+ scopes: Autorizações
+ website: Website do aplicativo
errors:
models:
doorkeeper/application:
attributes:
redirect_uri:
fragment_present: não pode conter um fragmento.
- invalid_uri: tem de ser um URI válido.
- relative_uri: tem de ser um URI absoluto.
- secured_uri: tem de ser um HTTPS/SSL URI.
+ invalid_uri: precisa ser uma URI válida.
+ relative_uri: precisa ser uma URI absoluta.
+ secured_uri: precisa ser uma URI HTTPS/SSL.
doorkeeper:
applications:
buttons:
@@ -21,92 +23,97 @@ pt-BR:
cancel: Cancelar
destroy: Destruir
edit: Editar
- submit: Submeter
+ submit: Enviar
confirmations:
- destroy: Tem a certeza?
+ destroy: Você tem certeza?
edit:
- title: Editar aplicação
+ title: Editar aplicativo
form:
- error: Oops! Verifique que o formulário não tem erros
+ error: Oops! Verifique o seu formulário para saber de possíveis erros
help:
native_redirect_uri: Use %{native_redirect_uri} para testes locais
- redirect_uri: Utilize uma linha por URI
- scopes: Separate scopes with spaces. Leave blank to use the default scopes.
+ redirect_uri: Use uma linha para cada URI
+ scopes: Separe autorizações com espaços. Deixe em branco para usar autorizações padrões.
index:
- callback_url: Callback URL
+ application: Aplicativos
+ callback_url: URL de retorno
+ delete: Excluir
name: Nome
- new: Nova Aplicação
- title: As suas aplicações
+ new: Novo aplicativo
+ scopes: Autorizações
+ show: Mostrar
+ title: Seus aplicativos
new:
- title: Nova aplicação
+ title: Novos aplicativos
show:
actions: Ações
- application_id: Id de Aplicação
- callback_urls: Callback urls
- scopes: Scopes
- secret: Segredo
- title: 'Aplicação: %{name}'
+ application_id: Chave do cliente
+ callback_urls: URLs de retorno
+ scopes: Autorizações
+ secret: Segredo do cliente
+ title: 'Application: %{name}'
authorizations:
buttons:
- authorize: Autorize
- deny: Não autorize
+ authorize: Autorizar
+ deny: Negar
error:
title: Ocorreu um erro
new:
- able_to: Vai poder
- prompt: Aplicação %{client_name} requisita acesso à sua conta
- title: Autorização é necessária
+ able_to: Será capaz de
+ prompt: O aplicativo %{client_name} solicita acesso à sua conta
+ title: Autorização necessária
show:
- title: Código de autorização
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Revogar
confirmations:
- revoke: Tem a certeza?
+ revoke: Você tem certeza?
index:
- application: Aplicação
- created_at: Criada em
- date_format: "%Y-%m-%d %H:%M:%S"
- title: As suas aplicações autorizadas
+ application: Aplicativos
+ created_at: Autorizados
+ date_format: "%d-%m-%Y %H:%M:%S"
+ scopes: Autorizações
+ title: Aplicativos autorizados
errors:
messages:
- access_denied: The resource owner or authorization server denied the request.
- credential_flow_not_configured: Resource Owner Password Credentials flow failed due to Doorkeeper.configure.resource_owner_from_credentials being unconfigured.
- invalid_client: Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method.
- invalid_grant: The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.
- invalid_redirect_uri: The redirect uri included is not valid.
- invalid_request: The request is missing a required parameter, includes an unsupported parameter value, or is otherwise malformed.
- invalid_resource_owner: The provided resource owner credentials are not valid, or resource owner cannot be found
- invalid_scope: The requested scope is invalid, unknown, or malformed.
+ access_denied: O proprietário ou servidor de autorização negou a solicitação.
+ credential_flow_not_configured: Cadeira de Credenciais de Senha do Proprietário falhou porque Doorkeeper.configure.resource_owner_from_credentials não foram configuradas.
+ invalid_client: Autenticação do cliente falhou por causa de um cliente desconhecido, nenhum cliente de autenticação incluído ou método de autenticação não suportado.
+ invalid_grant: A garantia de autorização é inválida, expirou, foi revogada, não é equivalente à URI de redirecionamento usada da solicitação de autorização ou foi emitida por outro cliente.
+ invalid_redirect_uri: A URI de redirecionamento incluída não é válida.
+ invalid_request: A solicitação não possui um parâmetro obrigatório, inclui um valor não suportado ou está mal formatada.
+ invalid_resource_owner: As credenciais do proprietário não são válidas ou o proprietário não pôde ser encontrado.
+ invalid_scope: A autorização requirida é inválida, desconhecida ou está mal formatada.
invalid_token:
expired: O token de acesso expirou
revoked: O token de acesso foi revogado
unknown: O token de acesso é inválido
- resource_owner_authenticator_not_configured: Resource Owner find failed due to Doorkeeper.configure.resource_owner_authenticator being unconfiged.
- server_error: The authorization server encountered an unexpected condition which prevented it from fulfilling the request.
- temporarily_unavailable: The authorization server is currently unable to handle the request due to a temporary overloading or maintenance of the server.
- unauthorized_client: The client is not authorized to perform this request using this method.
- unsupported_grant_type: The authorization grant type is not supported by the authorization server.
- unsupported_response_type: The authorization server does not support this response type.
+ resource_owner_authenticator_not_configured: Procura pelo proprietário falhou porque Doorkeeper.configure.resource_owner_authenticator não foi configurado.
+ server_error: O servidor de autorização encontrou uma condição inesperada que preveniu a solicitação de ser respondida.
+ temporarily_unavailable: O servidor de autorização é incapaz de lidar com a solicitação no momento por causa d múltiplas requisições ou manutenção programada.
+ unauthorized_client: O cliente não possui autorização para performar esta solicitação usando este método.
+ unsupported_grant_type: O tipo de garantia de autorização não é suportada pelo servidor de autorização.
+ unsupported_response_type: O servidor de autorização não suporta este tipo de resposta.
flash:
applications:
create:
- notice: Aplicação criada.
+ notice: Aplicativo criado.
destroy:
- notice: Aplicação eliminada.
+ notice: Aplicativo deletado.
update:
- notice: Aplicação alterada.
+ notice: Aplicativo atualizado.
authorized_applications:
destroy:
- notice: Aplicação revogada.
+ notice: Aplicativo revogado.
layouts:
admin:
nav:
- applications: Aplicações
- oauth2_provider: OAuth2 Provider
+ applications: Aplicativo
+ oauth2_provider: Provedor de OAuth2
application:
- title: Autorização OAuth necessária
+ title: Autorização OAuth obrigatória
scopes:
- follow: siga, bloqueie, desbloqueie, e deixe de seguir contas
- read: tenha acesso aos dados da sua conta
- write: públique por si
+ follow: seguir, bloquear, desbloquear e deixar de seguir outras contas
+ read: ler os dados da sua conta
+ write: postar em seu nome
diff --git a/config/locales/doorkeeper.pt.yml b/config/locales/doorkeeper.pt.yml
index 87e01ba940..30d9f7f5ac 100644
--- a/config/locales/doorkeeper.pt.yml
+++ b/config/locales/doorkeeper.pt.yml
@@ -57,7 +57,7 @@ pt:
prompt: Aplicação %{client_name} pede acesso à tua conta
title: Autorização é necessária
show:
- title: Código de autorização
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Revogar
diff --git a/config/locales/doorkeeper.ru.yml b/config/locales/doorkeeper.ru.yml
index 8862936dc2..2234a9bbec 100644
--- a/config/locales/doorkeeper.ru.yml
+++ b/config/locales/doorkeeper.ru.yml
@@ -57,7 +57,7 @@ ru:
prompt: Приложение %{client_name} запрашивает доступ к Вашему аккаунту
title: Требуется авторизация
show:
- title: Код авторизации
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Отозвать авторизацию
diff --git a/config/locales/doorkeeper.th.yml b/config/locales/doorkeeper.th.yml
index 29673971be..60edae1e4c 100644
--- a/config/locales/doorkeeper.th.yml
+++ b/config/locales/doorkeeper.th.yml
@@ -57,7 +57,7 @@ th:
prompt: Application %{client_name} requests access to your account
title: Authorization required
show:
- title: Authorization code
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: ยกเลิกการอนุญาติ
diff --git a/config/locales/doorkeeper.uk.yml b/config/locales/doorkeeper.uk.yml
index a5289541bd..d80abf01a6 100644
--- a/config/locales/doorkeeper.uk.yml
+++ b/config/locales/doorkeeper.uk.yml
@@ -57,7 +57,7 @@ uk:
prompt: Податок %{client_name} просить доступу до вашого акаунту
title: Необхідна авторизація
show:
- title: Код авторизації
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: Відкликати авторизацію
diff --git a/config/locales/doorkeeper.zh-CN.yml b/config/locales/doorkeeper.zh-CN.yml
index 6db8697b8e..12b38b81ff 100644
--- a/config/locales/doorkeeper.zh-CN.yml
+++ b/config/locales/doorkeeper.zh-CN.yml
@@ -58,7 +58,7 @@ zh-CN:
prompt: 授权 %{client_name} 使用你的帐号?
title: 需要你授权
show:
- title: 授权码
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: 注销
diff --git a/config/locales/doorkeeper.zh-HK.yml b/config/locales/doorkeeper.zh-HK.yml
index bb44c272bb..c8edc2b725 100644
--- a/config/locales/doorkeeper.zh-HK.yml
+++ b/config/locales/doorkeeper.zh-HK.yml
@@ -57,7 +57,7 @@ zh-HK:
prompt: 應用程式 %{client_name} 要求得到你用戶的部份權限
title: 需要用戶授權
show:
- title: 授權代碼
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: 取消授權
@@ -72,12 +72,9 @@ zh-HK:
errors:
messages:
access_denied: 資源擁有者或授權伺服器不接受請求。
- credential_flow_not_configured: 資源擁有者密碼認證程序 (Resource Owner Password Credentials
- flow) 失敗,原因是 Doorkeeper.configure.resource_owner_from_credentials 沒有設定。
- invalid_client: 用戶程式認證 (Client authentication) 失敗,原因是用戶程式未有登記、沒有指定用戶程式 (client)、或者使用了不支援的認證方法
- (method)。
- invalid_grant: 授權申請 (authorization grant) 不正確、過期、已被取消,或者無法對應授權請求 (authorization
- request) 內的轉接 URI,或者屬於別的用戶程式。
+ credential_flow_not_configured: 資源擁有者密碼認證程序 (Resource Owner Password Credentials flow) 失敗,原因是 Doorkeeper.configure.resource_owner_from_credentials 沒有設定。
+ invalid_client: 用戶程式認證 (Client authentication) 失敗,原因是用戶程式未有登記、沒有指定用戶程式 (client)、或者使用了不支援的認證方法 (method)。
+ invalid_grant: 授權申請 (authorization grant) 不正確、過期、已被取消,或者無法對應授權請求 (authorization request) 內的轉接 URI,或者屬於別的用戶程式。
invalid_redirect_uri: 不正確的轉接網址。
invalid_request: 請求缺少了必要的參數、包含了不支援的參數、或者其他輸入錯誤。
invalid_resource_owner: 資源擁有者的登入資訊錯誤、或者無法找到該資源擁有者。
@@ -86,8 +83,7 @@ zh-HK:
expired: access token 已經過期
revoked: access token 已被取消
unknown: access token 不正確
- resource_owner_authenticator_not_configured: 無法找到資源擁有者,原因是 Doorkeeper.configure.resource_owner_authenticator
- 沒有設定。
+ resource_owner_authenticator_not_configured: 無法找到資源擁有者,原因是 Doorkeeper.configure.resource_owner_authenticator 沒有設定。
server_error: 認證伺服器遇上未知狀況,令請求無法通過。
temporarily_unavailable: 認證伺服器由於臨時負荷過重或者維護,目前未能處理請求。
unauthorized_client: 用戶程式無權用此方法 (method) 請行這個請求。
diff --git a/config/locales/doorkeeper.zh-TW.yml b/config/locales/doorkeeper.zh-TW.yml
index 7e8c78cd95..01e62df730 100644
--- a/config/locales/doorkeeper.zh-TW.yml
+++ b/config/locales/doorkeeper.zh-TW.yml
@@ -10,7 +10,7 @@ zh-TW:
doorkeeper/application:
attributes:
redirect_uri:
- fragment_present: 'URI 不可包含 "#fragment" 部份'
+ fragment_present: URI 不可包含 "#fragment" 部份
invalid_uri: 必需有正確的 URI.
relative_uri: 必需為絕對 URI.
secured_uri: 必需使用有 HTTPS/SSL 加密的 URI.
@@ -45,7 +45,7 @@ zh-TW:
callback_urls: 回傳網址
scopes: 權限範圍
secret: 密碼
- title: '應用程式︰ %{name}'
+ title: 應用程式︰ %{name}
authorizations:
buttons:
authorize: 允許
@@ -57,7 +57,7 @@ zh-TW:
prompt: 應用程式 %{client_name} 要求取得您帳號的部份權限
title: 需要授權
show:
- title: 授權代碼
+ title: Copy this authorization code and paste it to the application.
authorized_applications:
buttons:
revoke: 取消授權
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 64fc556f3d..f87d8532c5 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -60,6 +60,7 @@ en:
email: E-mail
feed_url: Feed URL
followers: Followers
+ followers_url: Followers URL
follows: Follows
inbox_url: Inbox URL
ip: IP
@@ -93,6 +94,7 @@ en:
resubscribe: Resubscribe
salmon_url: Salmon URL
search: Search
+ shared_inbox_url: Shared Inbox URL
show:
created_reports: Reports created by this account
report: report
@@ -106,6 +108,18 @@ en:
unsubscribe: Unsubscribe
username: Username
web: Web
+ custom_emojis:
+ created_msg: Emoji successfully created!
+ delete: Delete
+ destroyed_msg: Emojo successfully destroyed!
+ emoji: Emoji
+ image_hint: PNG up to 50KB
+ new:
+ title: Add new custom emoji
+ shortcode: Shortcode
+ shortcode_hint: At least 2 characters, only alphanumeric characters and underscores
+ title: Custom emojis
+ upload: Upload
domain_blocks:
add_new: Add new
created_msg: Domain block is now being processed
@@ -141,6 +155,8 @@ en:
instances:
account_count: Known accounts
domain_name: Domain
+ reset: Reset
+ search: Search
title: Known Instances
reports:
action_taken_by: Action taken by
@@ -193,6 +209,9 @@ en:
desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML tags
title: Custom terms of service
site_title: Instance name
+ thumbnail:
+ desc_html: Used for previews via OpenGraph and API. 1200x630px recommended
+ title: Instance thumbnail
timeline_preview:
desc_html: Display public timeline on landing page
title: Timeline preview
@@ -291,6 +310,9 @@ en:
content: Security verification failed. Are you blocking cookies?
title: Security verification failed
'429': Throttled
+ '500':
+ content: We're sorry, but something went wrong on our end.
+ title: This page is not correct
noscript_html: To use the Mastodon web application, please enable JavaScript. Alternatively, try one of the native apps for Mastodon for your platform.
exports:
blocks: You block
@@ -446,6 +468,7 @@ en:
open_in_web: Open in web
over_character_limit: character limit of %{max} exceeded
pin_errors:
+ limit: Too many toots pinned
ownership: Someone else's toot cannot be pinned
private: Non-public toot cannot be pinned
reblog: A boost cannot be pinned
@@ -532,6 +555,8 @@ en:
Originally adapted from the Discourse privacy policy .
title: "%{instance} Terms of Service and Privacy Policy"
+ themes:
+ default: Mastodon
time:
formats:
default: "%b %d, %Y, %H:%M"
diff --git a/config/locales/es.yml b/config/locales/es.yml
index a02330521b..ca3bdd9838 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -5,35 +5,251 @@ es:
about_this: Acerca de esta instancia
closed_registrations: Los registros están actualmente cerrados en esta instancia.
contact: Contacto
+ contact_missing: No especificado
+ contact_unavailable: N/A
description_headline: "¿Qué es %{domain}?"
domain_count_after: otras instancias
domain_count_before: Conectado a
+ extended_description_html: |
+ Un buen lugar para las reglas
+ La descripción extendida no se ha colocado aún.
+ features:
+ humane_approach_body: Aprendiendo de los errores de otras redes, Mastodon apunta a las decisiones de diseño ético para combatir el desuso de las redes sociales.
+ humane_approach_title: Una misión más humana
+ not_a_product_body: Mastodon no es una red comercial. Nada de publicidad, nada de minado de datos, nada de jardines murados. No hay ninguna autoridad central.
+ not_a_product_title: Eres una persona, no un producto
+ real_conversation_body: Con 500 caracteres a tu disposición y soporte para contenido granular y advertencias de contenido, puedes expresarte como quieras.
+ real_conversation_title: Hecho para verdaderas conversaciones
+ within_reach_body: Aplicaciones múltiples para iOS, Android, y otras plataformas gracias a un ecosistema de APIs amigable al desarrollador para permitirte estar con tus amigos donde sea.
+ within_reach_title: Always within reach
+ find_another_instance: Busca otra instancia
+ generic_description: "%{domain} es un servidor en la red"
+ hosted_on: Mastodon hosteado en %{domain}
+ learn_more: Aprende más
other_instances: Otras instancias
source_code: Código fuente
status_count_after: estados
- status_count_before: Que han escrito
+ status_count_before: Qué han escrito
user_count_after: usuarios registrados
user_count_before: Tenemos
+ what_is_mastodon: "¿Qué es Mastodon?"
accounts:
follow: Seguir
followers: Seguidores
following: Siguiendo
+ media: Media
nothing_here: "¡No hay nada aquí!"
people_followed_by: Usuarios a quien %{name} sigue
people_who_follow: Usuarios que siguen a %{name}
posts: Toots
+ posts_with_replies: Toots con respuestas
remote_follow: Seguir
+ reserved_username: El nombre de usuario está reservado
+ roles:
+ admin: Administrador
unfollow: Dejar de seguir
+ admin:
+ accounts:
+ are_you_sure: "¿Estás seguro?"
+ confirm: Confirmar
+ confirmed: Confirmado
+ disable_two_factor_authentication: Desactivar autenticación de dos factores
+ display_name: Nombre
+ domain: Dominio
+ edit: Editar
+ email: E-mail
+ feed_url: URL de notificaciones
+ followers: Seguidores
+ followers_url: URL de los seguidores
+ follows: Sigue
+ inbox_url: URL de la bandeja de entrada
+ ip: IP
+ location:
+ all: Todos
+ local: Local
+ remote: Remoto
+ title: Localización
+ media_attachments: Multimedia
+ moderation:
+ all: Todos
+ silenced: Silenciados
+ suspended: Suspendidos
+ title: Moderación
+ most_recent_activity: Actividad más reciente
+ most_recent_ip: IP más reciente
+ not_subscribed: No se está suscrito
+ order:
+ alphabetic: Alfabético
+ most_recent: Más reciente
+ title: Orden
+ outbox_url: URL de bandeja de salida
+ perform_full_suspension: Performar suspensión completa
+ profile_url: URL del perfil
+ protocol: Protocolo
+ public: Público
+ push_subscription_expires: Expiración de la suscripción PuSH
+ redownload: Refrescar avatar
+ reset: Reiniciar
+ reset_password: Reiniciar contraseña
+ resubscribe: Re-suscribir
+ salmon_url: URL de salmón
+ search: Buscar
+ shared_inbox_url: URL de bandeja compartida
+ show:
+ created_reports: Reportes hechos por esta cuenta
+ report: reportar
+ targeted_reports: Reportes hechos sobre esta cuenta
+ silence: Silenciar
+ statuses: Estados
+ subscribe: Suscribir
+ title: Cuentas
+ undo_silenced: Des-silenciar
+ undo_suspension: Des-suspender
+ unsubscribe: Desuscribir
+ username: Nombre de usuario
+ web: Web
+ domain_blocks:
+ add_new: Añadir nuevo
+ created_msg: El bloque de dominio está siendo procesado
+ destroyed_msg: El bloque de dominio se deshizo
+ domain: Dominio
+ new:
+ create: Crear bloque
+ hint: El bloque de dominio no prevendrá la creación de entradas de cuenta en la base de datos, pero aplicará retroactiva y automáticamente métodos de moderación específica en dichas cuentas.
+ severity:
+ desc_html: "Silenciar hará los posts de la cuenta invisibles a cualquiera que no lo esté siguiendo. Suspender eliminará todo el contenido, media, y datos del perfil. Usa Ninguno si solo quieres rechazar archivos multimedia."
+ noop: Ninguno
+ silence: Silenciar
+ suspend: Suspender
+ title: Nuevo bloque de dominio
+ reject_media: Rechazar archivos multimedia
+ reject_media_hint: Remueve localmente archivos multimedia almacenados para descargar cualquiera en el futuro. Irrelevante para suspensiones
+ severities:
+ noop: Ninguno
+ silence: Silenciar
+ suspend: Suspender
+ severity: Severidad
+ show:
+ affected_accounts:
+ one: Una cuenta en la base de datos afectada
+ other: "%{count} cuentas en la base de datos afectadas"
+ retroactive:
+ silence: Des-silenciar todas las cuentas existentes de este dominio
+ suspend: Des-suspender todas las cuentas existentes de este dominio
+ title: Deshacer bloque de dominio para %{domain}
+ undo: Deshacer
+ title: Bloques de Dominio
+ undo: Deshacer
+ instances:
+ account_count: Cuentas conocidas
+ domain_name: Dominio
+ reset: Reiniciar
+ search: Buscar
+ title: Instancias conocidas
+ reports:
+ action_taken_by: Acción tomada por
+ are_you_sure: "¿Estás seguro?"
+ comment:
+ label: Comentario
+ none: Ninguno
+ delete: Eliminar
+ id: ID
+ mark_as_resolved: Marcar como resuelto
+ nsfw:
+ 'false': Mostrar multimedia
+ 'true': Ocultar multimedia
+ report: 'Reportar #%{id}'
+ report_contents: Contenido
+ reported_account: Cuenta reportada
+ reported_by: Reportado por
+ resolved: Resuelto
+ silence_account: Silenciar cuenta
+ status: Estado
+ suspend_account: Suspender cuenta
+ target: Objetivo
+ title: Reportes
+ unresolved: No resuelto
+ view: Ver
+ settings:
+ bootstrap_timeline_accounts:
+ desc_html: Separa nombres de usuarios múltiples con coma. Solo funcionará con cuentas desbloqueadas. Si está vacío, el predeterminado son todos los administradores locales
+ title: Seguimientos predeterminados para usuarios nuevos
+ contact_information:
+ email: Correo de trabajo
+ username: Nombre de usuario
+ registrations:
+ closed_message:
+ desc_html: Se muestra en la portada cuando los registros están cerrados. Puedes usar tags HTML
+ title: Mensaje de registro cerrado
+ deletion:
+ desc_html: Permite a cualquiera a eliminar su cuenta
+ title: Eliminación de cuenta abierta
+ open:
+ desc_html: Permite a cualquiera a registrar una cuenta
+ title: Registro abierto
+ site_description:
+ desc_html: Párrafo introductorio en la portada y en meta tags. Puedes usar tags HTML, en particular <a>
y <em>
.
+ title: Descripción de instancia
+ site_description_extended:
+ desc_html: Un buen lugar para tu código de conducta, reglas, guías y otras cosas que estén impuestas aparte en tu instancia. Puedes usar tags HTML
+ title: Información extendida personalizada
+ site_terms:
+ desc_html: Puedes escribir tus propias políticas de privacidad, términos de servicio u otras legalidades. Puedes usar tags HTML
+ title: Términos de servicio personalizados
+ site_title: Nombre de instancia
+ thumbnail:
+ desc_html: Se usa para muestras con OpenGraph y APIs. Se recomienda 1200x630px
+ title: Portada de instancia
+ timeline_preview:
+ desc_html: Mostrar línea de tiempo pública en la portada
+ title: Previsualización
+ title: Ajustes del sitio
+ statuses:
+ back_to_account: Volver a la cuenta
+ batch:
+ delete: Eliminar
+ nsfw_off: NSFW OFF
+ nsfw_on: NSFW ON
+ execute: Ejecutar
+ failed_to_execute: Falló al ejecutar
+ media:
+ hide: Ocultar multimedia
+ show: Mostrar multimedia
+ title: Multimedia
+ no_media: No hay multimedia
+ title: Estado de las cuentas
+ with_media: Con multimedia
+ subscriptions:
+ callback_url: URL del callback
+ confirmed: Confirmado
+ expires_in: Expira en
+ last_delivery: Última entrega
+ title: WebSub
+ topic: Tópico
+ title: Administración
+ admin_mailer:
+ new_report:
+ body: "%{reporter} ha reportado a %{target}"
+ subject: Nuevo reporte para la %{instance} (#%{id})
application_mailer:
settings: 'Cambiar preferencias de correo: %{link}'
signature: Notificaciones de Mastodon desde %{instance}
view: 'Vista:'
applications:
+ created: Aplicación creada exitosamente
+ destroyed: Apicación eliminada exitosamente
invalid_url: La URL proporcionada es incorrecta
+ regenerate_token: Regenerar token de acceso
+ token_regenerated: Token de acceso regenerado exitosamente
+ warning: Ten mucho cuidado con estos datos. ¡No los compartas con nadie!
+ your_token: Tu token de acceso
auth:
+ agreement_html: Al registrarte aceptas nuestros y términos y condiciones del servicio y nuestras políticas de privacidda .
change_password: Cambiar contraseña
+ delete_account_html: Si desea eliminar su cuenta, puede proceder aquí . Será pedido de una confirmación.
didnt_get_confirmation: "¿No recibió el correo de confirmación?"
forgot_password: "¿Olvidaste tu contraseña?"
+ invalid_reset_password_token: El token de reinicio de contraseña es inválido o expiró. Por favor pide uno nuevo.
login: Iniciar sesión
logout: Cerrar sesión
register: Registrarse
@@ -43,7 +259,13 @@ es:
authorize_follow:
error: Desafortunadamente, ha ocurrido un error buscando la cuenta remota
follow: Seguir
- title: Seguir %{acct}
+ follow_request: 'Tienes una solicitud de seguimiento de:'
+ following: "¡Éxito! Ahora estás siguiendo a:"
+ post_follow:
+ close: O, puedes simplemente cerrar esta ventana.
+ return: Regresar al perfil del usuario
+ web: Ir al sitio web
+ title: Seguir a %{acct}
datetime:
distance_in_words:
about_x_hours: "%{count}h"
@@ -58,14 +280,43 @@ es:
x_minutes: "%{count}m"
x_months: "%{count}m"
x_seconds: "%{count}s"
+ deletes:
+ bad_password_msg: "¡Buen intento, hackers! Contraseña incorrecta"
+ confirm_password: Ingresa tu contraseña actual para demostrar tu identidad
+ description_html: Esto removerá el contenido de tu cuenta y la desactivará permanente e irrevesiblemente . Tu nombre de usuario quedará reservado para prevenir futuros robos de identidad.
+ proceed: Eliminar cuenta
+ success_msg: Tu cuenta se eliminó con éxito
+ warning_html: Se garantiza únicamente la eliminación del contenido de esta instancia. El contenido que se haya compartido extensamente dejará sus huellas. Los servidores fuera de línea y los que se hayan desuscrito de tus actualizaciones ya no actualizarán sus bases de datos.
+ warning_title: Disponibilidad diseminada del contenido
+ errors:
+ '403': No tienes permiso para acceder a esta página.
+ '404': La página que estabas buscando no existe.
+ '410': La página que estabas buscando no existe más.
+ '422':
+ content: Verificación de seguridad fallida. ¿Estás bloqueando algunas cookies?
+ title: Verificación de seguridad fallida
+ '429': Asfixiado
+ noscript_html: Para usar la aplicación web de Mastodon, por favor activa Javascript. Alternativamente, prueba alguna de las aplicaciones nativas para Mastodon para tu plataforma.
exports:
blocks: Personas que has bloqueado
csv: CSV
follows: Personas que sigues
storage: Almacenamiento
+ followers:
+ domain: Dominio
+ explanation_html: Si deseas asegurar la privacidad de tus estados, tienes que cuidarte de quién te sigue. Tus estados privados son enviados a todas las instancias de tus seguidores . Puede que desees revisarlas, y remover seguidores si no confías en tu privacidad para ser respetado por el staff o software de esas instancias.
+ followers_count: Número de seguidores
+ lock_link: Bloquear tu cuenta
+ purge: Remover de los seguidores
+ success:
+ one: En el proceso de bloquear suavemente usuarios de un solo dominio...
+ other: En el proceso de bloquear suavemente usuarios de %{count} dominios...
+ true_privacy_html: Por favor ten en cuenta que la verdadera privacidad se consigue con encriptación de punto a punto .
+ unlocked_warning_html: Todos pueden seguirte para ver tus estados privados inmediatamente. %{lock_link} para poder chequear y rechazar seguidores.
+ unlocked_warning_title: Tu cuenta no está bloqueada
generic:
changes_saved_msg: "¡Cambios guardados con éxito!"
- powered_by: powered by %{link}
+ powered_by: gracias a %{link}
save_changes: Guardar cambios
validation_errors:
one: "¡Algo no está bien! Por favor, revisa el error"
@@ -76,9 +327,10 @@ es:
types:
blocking: Lista de bloqueados
following: Lista de seguidos
+ muting: Lista de silenciados
upload: Cargar
landing_strip_html: "%{name} es un usuario en %{link_to_root_path}. Puedes seguirlo(a) o interactuar con el o ella si tienes una cuenta en cualquier parte del fediverse."
- landing_strip_signup_html: Si no tienes una, puedes registrar aquí .
+ landing_strip_signup_html: Si no tienes una, puedes registrarte aquí .
media_attachments:
validations:
images_and_video: No se puede adjuntar un video a un estado que ya contenga imágenes
@@ -88,8 +340,8 @@ es:
body: 'Un resumen de lo que te perdiste en %{instance} desde tu última visita el %{since}:'
mention: "%{name} te ha mencionado en:"
new_followers_summary:
- one: "¡Hurra!. Alguien más te ha comenzado a seguir"
- other: "¡Genial!. Te han seguido %{count} nuevas personas"
+ one: "¡Hurra! Alguien más te ha comenzado a seguir"
+ other: "¡Genial! Te han seguido %{count} nuevas personas"
subject:
one: "1 nueva notificación desde tu última visita \U0001F418"
other: "%{count} nuevas notificaciones desde tu última visita \U0001F418"
@@ -122,11 +374,65 @@ es:
pagination:
next: Próximo
prev: Anterior
+ truncate: "…"
+ push_notifications:
+ favourite:
+ title: "%A {name} le gustó tu estado"
+ follow:
+ title: "%{name} te ha empezado a seguir"
+ group:
+ title: "%{count} notificaciones"
+ mention:
+ action_boost: Boost
+ action_expand: Mostrar más
+ action_favourite: Me Gusta
+ title: "%{name} te mencionó"
+ reblog:
+ title: "%{name} boosteó tu estado"
remote_follow:
acct: Ingesa el usuario@dominio de la persona que quieres seguir
missing_resource: No se pudo encontrar la URL de redirección necesaria para su cuenta.
proceed: Proceder a seguir
prompt: 'Vas a seguir a:'
+ sessions:
+ activity: Última actividad
+ browser: Navegador
+ browsers:
+ alipay: Alipay
+ blackberry: Blackberry
+ chrome: Chrome
+ edge: Microsoft Edge
+ firefox: Firefox
+ generic: Desconocido
+ ie: Internet Explorer
+ micro_messenger: MicroMessenger
+ nokia: Nokia S40 Ovi Browser
+ opera: Opera
+ phantom_js: PhantomJS
+ qq: QQ Browser
+ safari: Safari
+ uc_browser: UCBrowser
+ weibo: Weibo
+ current_session: Sesión actual
+ description: "%{browser} en %{platform}"
+ explanation: Estos son los navegadores web conectados actualmente en tu cuenta de Mastodon.
+ ip: IP
+ platforms:
+ adobe_air: Adobe Air
+ android: Android
+ blackberry: Blackberry
+ chrome_os: ChromeOS
+ firefox_os: Firefox OS
+ ios: iOS
+ linux: Linux
+ mac: Mac
+ other: Desconocido
+ windows: Windows
+ windows_mobile: Windows Mobile
+ windows_phone: Windows Phone
+ revoke: Revoke
+ revoke_success: Sesión revocada exitosamente
+ title: Sesiones
settings:
authorized_apps: Aplicaciones autorizadas
back: Volver al inicio
@@ -136,26 +442,115 @@ es:
preferences: Preferencias
settings: Ajustes
two_factor_authentication: Autenticación de dos factores
+ your_apps: Tus aplicaciones
statuses:
open_in_web: Abrir en web
over_character_limit: Límite de caracteres de %{max} superado
+ pin_errors:
+ limit: Demasiados toots fijados
+ ownership: El toot de alguien más no puede fijarse
+ private: Los toots no-públicos no pueden fijarse
+ reblog: Un boost no puede fijarse
show_more: Mostrar más
visibilities:
private: Sólo mostrar a seguidores
+ private_long: Solo mostrar a tus seguidores
public: Público
+ public_long: Todos pueden ver
unlisted: Público, pero no mostrar en la historia federada
+ unlisted_long: Todos pueden ver, pero no está listado en las líneas de tiempo públicas
stream_entries:
click_to_show: Click para mostrar
+ pinned: Toot fijado
reblogged: retooteado
sensitive_content: Contenido sensible
+ terms:
+ body_html: |
+ Políticas de privacidad
+
+ ¿Qué información recolectamos?
+
+ Recolectamos información tuya cuando te registras en nuestro sitio y adquirimos datos cuando participas en el foro leyendo, escribiendo, y evaluando el contenido compartido aquí.
+
+ Cuando te registras en nuestro sitio, puede que se te pida tu nombre y dirección de correo electrónico. De todas formas, puedes visitar nuestro sitio sin registrarte. Tu dirección de correo electrónico será verificada por un e-mail conteniendo un enlace único. Si ese enlace es visitado, sabemos que tú controlas esa dirección.
+
+ Cuando te registras y posteas, grabamos la IP de la que se origina esa acción. También puede que retengamos logs del servidor, que incluyen la dirección IP de todos los pedidos a nuestro servidor.
+
+ ¿Para qué usamos tu información?
+
+ Toda la información que recolectamos de ti puede usarse en una de las siguientes maneras:
+
+
+ Para personalizar tu experiencia — tu información nos ayuda a responder mejor tus necesidades individuales.
+ Para mejorar nuestro sitio — nos esforzamos continuamente en mejorar nuestras ofertas del sitio basándonos en la información y apoyo que recibimos de ti.
+ Para mejorar el servicio al cliente — tu información nos ayuda a responder más efectivamente al servicio al cliente y otras necesidades.
+ Para enviar e-mails periódicos — la dirección de e-mail que provees puede usarse para enviarte información, notificaciones que pides sobre cambios en tópicos o en respuesta a tu nombre de usuario, responder consultas, y/u otros pedidos o preguntas.
+
+
+ ¿Cómo protegemos tu información?
+
+ Implementamos una variedad de medidas de seguridad para mantener a salvo tu información personal cuando entras, publicas, o accesas a ella.
+
+ ¿Cuáles son sus políticas de retención de datos?
+
+ Haremos un gran esfuerzo en:
+
+
+ Retener logs del servidor conteniendo la dirección IP de todos los pedidos a este servidor en no más de 90 días.
+ Retener las direcciones IP asociadas con usuarios registrados y sus posts no más de 5 años.
+
+
+
+
+ Sí. Las cookies son pequeños archivos que un sitio web o su proveedor de servicio transfieren al disco duro de tu computadora a través de tu navegador web (si se le permite). Estas cookies permiten al sitio reconocer tu navegador y, si y tienes una cuenta registrada, asociarlo con ella.
+
+ Usamos cookies para entender y guardar tus preferencias para futuras visitas y agregar datos compilados sobre el tráfico del sitio e interacción para que podamos ofrecer una mejor experiencia y herramientas en el futuro. Puede que contratemos con proveedores de servicio de tercera mano para que nos asistan en el mejor entendimiento de nuestros visitantes del sitio. A estos proveedores de servicio no se les permite usar la información recolectada a nuestras espaldas excepto para ayudarnos a conducir y mejorar nuestro trabajo.
+
+ ¿Revelamos alguna información a terceras manos?
+
+ No vendemos, intercambiamos, ni de ninguna otra manera transferimos tu información personal identificable a terceras partes. Esto no incluye las terceras manos que nos asisten en operar nuestro sitio, conducción o trabajo, o en servirte, tanto como que éstas acepten en mantener esta información confidencial. Puede que también liberemos tu información cuando creamos que es apropiado para cumplir con la ley, enforzar nuestras políticas del sitio, o proteger la nuestra u otros derechos, propiedad, o seguridad. De todas formas, la información del visitante autorizado no-personal puede proveerse a otras partes por marketing, publicidad, u otros usos.
+
+ Enlaces de terceras partes
+
+ Ocasionalmente, a nuestra discreción, puede que incluyamos u ofrezcamos productos de terceras partes o servicios en nuestro sitio. Estas terceras partes tienen políticas de privacidad separadas e independientes. Por lo tanto no tenemos responsabilidad u obligación por el contenido y actividades de estos sitios enlazados. Sin embargo, buscamos proteger la integridad de nuestro sitio y dar la bienvenida a cualquier ayuda sobre estos sitios.
+
+ Children's Online Privacy Protection Act Compliance (Cumplimiento de la Ley de la Protección Privada en Línea del Niño)
+
+ Nuestro sitio y todos nuestros productos y servicios están dirigidos a gente que tiene al menos 13 años de edad. Si el servidor está alojado en EE.UU, y tienes menos de 13 años, no uses este sitio por los requerimientos del COPPA (Children's Online Privacy Protection Act ).
+
+ Solo Políticas de Privacidad en Línea
+
+ Estas políticas de privacidad aplican únicamente a la información recolectada a través de nuestro sitio y no a información recolectada offline .
+
+ Tu Consentimiento
+
+ Al usar nuestro sitio, estás consentido a nuestras políticas de privacidad del sitio.
+
+ Cambios a nuestras Políticas de Privacidad
+
+ Si decidimos cambiar nuestras políticas de privacidad, las publicaremos en esta página.
+
+ Este documento está publicado bajo la licencia CC-BY-SA. Última vez actualizado el 31 de Mayo del 2013.
+
+ Adaptado originalmente del discurso de las políticas de privacidad .
+ title: Términos del Servicio y Políticas de Privacidad de %{instance}
time:
formats:
- default: "%b %d, %Y, %H:%M"
+ default: "%d de %b del %Y, %H:%M"
two_factor_authentication:
- description_html: Sí habilitas la autenticación de dos factores , se requerirá estar en posesión de su teléfono, lo que generará tokens para que usted pueda iniciar sesión.
+ code_hint: Ingresa el código generado por tu aplicación de autenticación para confirmar
+ description_html: Si habilitas la autenticación de dos factores , se requerirá estar en posesión de su teléfono, lo que generará tokens para que usted pueda iniciar sesión.
disable: Deshabilitar
enable: Habilitar
+ enabled_success: Verificación de dos factores activada exitosamente
+ generate_recovery_codes: generar códigos de recuperación
instructions_html: "Escanea este código QR desde Google Authenticator o una aplicación similar en su teléfono . Desde ahora, esta aplicación va a generar tokens que tienes que ingresar cuando quieras iniciar sesión."
+ lost_recovery_codes: Los códigos de recuperación te permiten obtener acceso a tu cuenta si pierdes tu teléfono. Si has perdido tus códigos de recuperación, puedes regenerarlos aquí. Tus viejos códigos de recuperación se harán inválidos.
+ recovery_codes: Hacer copias de seguridad de tus códigos de recuperación
+ recovery_instructions_html: Si pierdes acceso a tu teléfono, puedes usar uno de los siguientes códigos de recuperación para obtener acceso a tu cuenta. Mantenlos a salvo . Por ejemplo, puedes imprimirlos y guardarlos con otros documentos importantes.
+ setup: Configurar
+ wrong_code: "¡El código ingresado es inválido! ¿El dispositivo y tiempo del servidor están correctos?"
users:
invalid_email: La dirección de correo es incorrecta
invalid_otp_token: Código de dos factores incorrecto
+ signed_in_as: 'Sesión iniciada como:'
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index ba726fc75a..f7921b1cf2 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -37,12 +37,16 @@ fa:
follow: پی بگیرید
followers: پیگیران
following: پی میگیرد
+ media: عکس و ویدیو
nothing_here: اینجا چیزی نیست!
people_followed_by: کسانی که %{name} پی میگیرد
people_who_follow: کسانی که %{name} را پی میگیرند
- posts: نوشته
+ posts: نوشتهها
+ posts_with_replies: نوشتهها و پاسخها
remote_follow: پیگیری غیرمستقیم
reserved_username: این نام کاربری در دسترس نیست
+ roles:
+ admin: مدیر
unfollow: پایان پیگیری
admin:
accounts:
@@ -56,7 +60,9 @@ fa:
email: ایمیل
feed_url: نشانی فید
followers: پیگیران
+ followers_url: نشانی پیگیران
follows: پی میگیرد
+ inbox_url: نشانی صندوق ورودی
ip: IP
location:
all: همه
@@ -76,8 +82,10 @@ fa:
alphabetic: الفبایی
most_recent: تازهترینها
title: ترتیب
+ outbox_url: نشانی صندوق خروجی
perform_full_suspension: انجام تعلیق کامل
profile_url: نشانی نمایه
+ protocol: پروتکل
public: عمومی
push_subscription_expires: عضویت از راه PuSH منقضی شد
redownload: بهروزرسانی تصویر نمایه
@@ -86,6 +94,7 @@ fa:
resubscribe: اشتراک دوباره
salmon_url: نشانی Salmon
search: جستجو
+ shared_inbox_url: نشانی صندوق ورودی مشترک
show:
created_reports: گزارشها از طرف این حساب
report: گزارش
@@ -160,6 +169,9 @@ fa:
unresolved: حلنشده
view: نمایش
settings:
+ bootstrap_timeline_accounts:
+ desc_html: نامهای کاربری را با ویرگول از هم جدا کنید. تنها حسابهای محلی و قفلنشده کار میکنند. اگر اینجا را خالی بگذارید، به طور پیشفرض همهٔ مدیرهای این سرور پیگرفته خواهند شد.
+ title: پیگیریهای پیشفرض برای کاربران تازه
contact_information:
email: ایمیل کاری
username: نام کاربری
@@ -183,6 +195,9 @@ fa:
desc_html: میتوانید سیاست رازداری، شرایط استفاده، یا سایر مسائل قانونی را به دلخواه خود بنویسید. تگهای HTML هم مجاز است
title: شرایط استفادهٔ سفارشی
site_title: نام سرور
+ thumbnail:
+ desc_html: برای دیدن با OpenGraph و رابط برنامهنویسی. وضوح پیشنهادی ۱۲۰۰×۶۳۰ پیکسل
+ title: تصویر کوچک فوری
timeline_preview:
desc_html: نوشتههای عمومی این سرور را در صفحهٔ آغازین نشان دهید
title: پیشنمایش نوشتهها
@@ -220,7 +235,13 @@ fa:
signature: اعلانهای ماستدون از %{instance}
view: 'نمایش:'
applications:
+ created: برنامه با موفقیت ساخته شد
+ destroyed: برنامه با موفقیت پاک شد
invalid_url: نشانی واردشده معتبر نیست
+ regenerate_token: دوبارهسازی کد دسترسی
+ token_regenerated: کد دسترسی با موفقیت ساخته شد
+ warning: خیلی مواظب این اطلاعات باشید و آن را به هیچ کس ندهید!
+ your_token: کد دسترسی شما
auth:
agreement_html: پیش از عضو شدن باید شرایط استفاده و سیاست رازداری ما را بپذیرید.
change_password: امنیت
@@ -228,6 +249,7 @@ fa:
delete_account_html: اگر میخواهید حساب خود را پاک کنید، از اینجا پیش بروید. از شما درخواست تأیید خواهد شد.
didnt_get_confirmation: راهنمایی برای تأیید را دریافت نکردید؟
forgot_password: رمزتان را گم کردهاید؟
+ invalid_reset_password_token: Password reset token is invalid or expired. Please request a new one.
login: ورود
logout: خروج
register: عضو شوید
@@ -416,6 +438,7 @@ fa:
authorized_apps: برنامههای مجاز
back: بازگشت به ماستدون
delete: پاککردن حساب
+ development: Development
edit_profile: ویرایش نمایه
export: برونسپاری دادهها
followers: پیگیران مورد تأیید
@@ -423,9 +446,15 @@ fa:
preferences: ترجیحات
settings: تنظیمات
two_factor_authentication: ورود دومرحلهای
+ your_apps: برنامهٔ شما
statuses:
open_in_web: بازکردن در وب
over_character_limit: از حد مجاز %{max} حرف فراتر رفتید
+ pin_errors:
+ limit: نوشتههای ثابت بیش از حد
+ ownership: نوشتههای دیگران را نمیتوان ثابت کرد
+ private: نوشتههای غیرعمومی را نمیتوان ثابت کرد
+ reblog: بازبوقها را نمیتوان ثابت کرد
show_more: نمایش
visibilities:
private: خصوصی
@@ -436,6 +465,7 @@ fa:
unlisted_long: عمومی، ولی در فهرست نوشتهها نمایش نمییابد
stream_entries:
click_to_show: برای نمایش کلیک کنید
+ pinned: نوشتههای ثابت
reblogged: بازبوقید
sensitive_content: محتوای حساس
terms:
@@ -530,3 +560,4 @@ fa:
users:
invalid_email: نشانی ایمیل نامعتبر است
invalid_otp_token: کد ورود دومرحلهای نامعتبر است
+ signed_in_as: 'واردشده به نام:'
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index fcaa64dab4..5ffc09ab98 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -50,7 +50,7 @@ ja:
unfollow: フォロー解除
admin:
accounts:
- are_you_sure: 本当に実行しますか?
+ are_you_sure: 本当に実行しますか?
confirm: 確認
confirmed: 確認済み
disable_two_factor_authentication: 二段階認証を無効にする
@@ -60,6 +60,7 @@ ja:
email: E-mail
feed_url: フィードURL
followers: フォロワー数
+ followers_url: Followers URL
follows: フォロー数
inbox_url: Inbox URL
ip: IP
@@ -93,6 +94,7 @@ ja:
resubscribe: 再講読
salmon_url: Salmon URL
search: 検索
+ shared_inbox_url: Shared Inbox URL
show:
created_reports: このアカウントで作られたレポート
report: レポート
@@ -106,6 +108,18 @@ ja:
unsubscribe: 購読の解除
username: ユーザー名
web: Web
+ custom_emojis:
+ created_msg: 絵文字の追加に成功しました
+ delete: 削除
+ destroyed_msg: 絵文字の削除に成功しました
+ emoji: 絵文字
+ image_hint: 50KBまでのPNG画像を利用できます。
+ new:
+ title: 新規カスタム絵文字の追加
+ shortcode: ショートコード
+ shortcode_hint: 2文字以上の半角英数字とアンダーバーのみ利用できます。
+ title: カスタム絵文字
+ upload: アップロード
domain_blocks:
add_new: 新規追加
created_msg: ドメインブロック処理を完了しました
@@ -141,6 +155,8 @@ ja:
instances:
account_count: 既知のアカウント数
domain_name: ドメイン名
+ reset: リセット
+ search: 検索
title: 既知のインスタンス
reports:
action_taken_by: レポート処理者
@@ -175,7 +191,7 @@ ja:
username: 連絡先のユーザー名
registrations:
closed_message:
- desc_html: 新規登録を停止しているときにフロントページに表示されます。HTMLタグが使えます
+ desc_html: 新規登録を停止しているときにフロントページに表示されます。HTMLタグが使えます。
title: 新規登録停止時のメッセージ
deletion:
desc_html: 誰でも自分のアカウントを削除できるようにします
@@ -187,12 +203,15 @@ ja:
desc_html: フロントページへの表示と meta タグに使用される紹介文です。HTMLタグ、特に<a>
と <em>
が使えます。
title: インスタンスの説明
site_description_extended:
- desc_html: あなたのインスタンスにおける行動規範やルール、ガイドライン、そのほかの記述をする際に最適な場所です。HTMLタグが使えます
+ desc_html: あなたのインスタンスにおける行動規範やルール、ガイドライン、そのほかの記述をする際に最適な場所です。HTMLタグが使えます。
title: カスタム詳細説明
site_terms:
- desc_html: あなたは独自のプライバシーポリシーや利用規約、そのほかの法的根拠を書くことができます。HTMLタグが使えます
+ desc_html: あなたは独自のプライバシーポリシーや利用規約、そのほかの法的根拠を書くことができます。HTMLタグが使えます。
title: カスタム利用規約
site_title: インスタンスの名前
+ thumbnail:
+ desc_html: OpenGraphとAPIによるプレビューに使用されます。サイズは1200×630px推奨です。
+ title: インスタンスのサムネイル
timeline_preview:
desc_html: ランディングページに公開タイムラインを表示します
title: タイムラインプレビュー
@@ -254,7 +273,7 @@ ja:
error: 残念ながら、リモートアカウント情報の取得中にエラーが発生しました。
follow: フォロー
follow_request: 'あなたは以下のアカウントにフォローリクエストを送信しました:'
- following: '成功! あなたは現在以下のアカウントをフォローしています:'
+ following: '成功! あなたは現在以下のアカウントをフォローしています:'
post_follow:
close: またはこのウィンドウを閉じます
return: ユーザーのプロフィールに戻る
@@ -283,7 +302,7 @@ ja:
warning_html: 削除が保証されるのはこのインスタンス上のコンテンツのみです。他のインスタンス等、外部に広く共有されたコンテンツについては痕跡が残ることがあります。また、現在接続できないサーバーや、あなたの更新を受け取らなくなったサーバーに対しては、削除は反映されません。
warning_title: 共有されたコンテンツについて
errors:
- '403': このページを表示する権限がありません
+ '403': このページを表示する権限がありません。
'404': お探しのページは見つかりませんでした。
'410': お探しのページはもう存在しません。
'422':
@@ -314,11 +333,11 @@ ja:
powered_by: powered by %{link}
save_changes: 変更を保存
validation_errors:
- one: エラーが発生しました。以下のエラーを確認してください
- other: エラーが発生しました。以下の%{count}個のエラーを確認してください
+ one: エラーが発生しました。以下のエラーを確認してください。
+ other: エラーが発生しました。以下の%{count}個のエラーを確認してください。
imports:
preface: 他のインスタンスでエクスポートされたファイルから、フォロー/ブロックした情報をこのインスタンス上のアカウントにインポートできます。
- success: ファイルは正常にアップロードされ、現在処理中です。しばらくしてから確認してください
+ success: ファイルは正常にアップロードされ、現在処理中です。しばらくしてから確認してください。
types:
blocking: ブロックしたアカウントリスト
following: フォロー中のアカウントリスト
@@ -347,7 +366,7 @@ ja:
body: "%{name} さんにフォローされています"
subject: "%{name} さんにフォローされています"
follow_request:
- body: "%{name} さんがあなたにフォローをリクエストしました。"
+ body: "%{name} さんがあなたにフォローをリクエストしました"
subject: "%{name} さんからのフォローリクエスト"
mention:
body: "%{name} さんから返信がありました:"
@@ -445,6 +464,7 @@ ja:
open_in_web: Webで開く
over_character_limit: 上限は %{max}文字までです
pin_errors:
+ limit: 固定されているトゥートが多すぎます
ownership: 他人のトゥートを固定することはできません
private: 非公開のトゥートを固定することはできません
reblog: ブーストされたトゥートを固定することはできません
@@ -531,11 +551,13 @@ ja:
オリジナルの出典 Discourse privacy policy .
title: "%{instance} 利用規約・プライバシーポリシー"
+ themes:
+ default: Mastodon
time:
formats:
default: "%Y年%m月%d日 %H:%M"
two_factor_authentication:
- code_hint: 確認するには認証アプリで表示されたコードを入力してください
+ code_hint: 確認するには認証アプリで表示されたコードを入力してください。
description_html: "二段階認証 を有効にするとログイン時、電話でコードを受け取る必要があります。"
disable: 無効
enable: 有効
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 2b7a1a5115..06035b6c58 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -41,8 +41,11 @@ nl:
people_followed_by: Mensen die %{name} volgt
people_who_follow: Mensen die %{name} volgen
posts: Toots
+ posts_with_replies: Toots met reacties
remote_follow: Extern volgen
reserved_username: Deze gebruikersnaam is gereserveerd
+ roles:
+ admin: Beheerder
unfollow: Ontvolgen
admin:
accounts:
@@ -56,7 +59,9 @@ nl:
email: E-mail
feed_url: Feed-URL
followers: Volgers
+ followers_url: Volgers-URL
follows: Volgt
+ inbox_url: Inbox-URL
ip: IP
location:
all: Alles
@@ -86,6 +91,7 @@ nl:
resubscribe: Opnieuw abonneren
salmon_url: Salmon-URL
search: Zoeken
+ shared_inbox_url: Gedeelde inbox-URL
show:
created_reports: Toots door dit account gerapporteerd
report: gerapporteerd
@@ -160,6 +166,9 @@ nl:
unresolved: Onopgelost
view: Weergeven
settings:
+ bootstrap_timeline_accounts:
+ desc_html: Meerdere gebruikersnamen met komma's scheiden. Alleen lokale en niet opgeschorte accounts werken. Laat leeg voor alle lokale beheerders.
+ title: Standaard te volgen accounts voor nieuwe gebruikers
contact_information:
email: Vul een openbaar gebruikt e-mailadres in
username: Vul een gebruikersnaam in
@@ -183,6 +192,9 @@ nl:
desc_html: Je kan hier jouw eigen privacybeleid, gebruikersvoorwaarden en ander juridisch jargon kwijt. Je kan HTML gebruiken.
title: Aangepaste gebruikersvoorwaarden
site_title: Naam Mastodon-server
+ thumbnail:
+ desc_html: Gebruikt als voorvertoning voor OpenGraph en de API. 1200x630px aanbevolen.
+ title: Thumbnail Mastodon-server
timeline_preview:
desc_html: Toon de openbare tijdlijn op de startpagina
title: Voorbeeld tijdlijn
@@ -272,7 +284,7 @@ nl:
content: Veiligheidsverificatie mislukt. Blokkeer je toevallig cookies?
title: Veiligheidsverificatie mislukt
'429': Te veel verbindingsaanvragen.
- noscript_html: Schakel JavaScript in om de webapplicatie van Mastodon te gebruiken. Als alternatief kan je een Mastodon-app zoeken voor jouw platform.
+ noscript_html: Schakel JavaScript in om de webapp van Mastodon te kunnen gebruiken. Als alternatief kan je een Mastodon-app zoeken voor jouw platform.
exports:
blocks: Jij blokkeert
csv: CSV
@@ -412,6 +424,7 @@ nl:
authorized_apps: Geautoriseerde apps
back: Terug naar Mastodon
delete: Account deletion
+ development: Ontwikkelaars
edit_profile: Profiel bewerken
export: Export
followers: Geautoriseerde volgers
@@ -419,9 +432,15 @@ nl:
preferences: Voorkeuren
settings: Instellingen
two_factor_authentication: Tweestapsverificatie
+ your_apps: Jouw toepassingen
statuses:
open_in_web: In de webapp openen
over_character_limit: Limiet van %{max} tekens overschreden
+ pin_errors:
+ limit: Te veel toots vastgezet
+ ownership: Een toot van iemand anders kan niet worden vastgezet
+ private: Alleen openbare toots kunnen worden vastgezet
+ reblog: Een boost kan niet worden vastgezet
show_more: Meer tonen
visibilities:
private: Alleen volgers
@@ -432,6 +451,7 @@ nl:
unlisted_long: Aan iedereen tonen, maar niet op openbare tijdlijnen
stream_entries:
click_to_show: Klik om te tonen
+ pinned: Vastgemaakte toot
reblogged: boostte
sensitive_content: Gevoelige inhoud
terms:
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index c3807428b1..584f4c6094 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -60,6 +60,7 @@ oc:
email: Corrièl
feed_url: Flux URL
followers: Seguidors
+ followers_url: URL dels seguidors
follows: Abonaments
inbox_url: URL de recepcion
ip: IP
@@ -92,6 +93,7 @@ oc:
reset_password: Reïnicializar lo senhal
resubscribe: Se tornar abonar
salmon_url: URL Salmon
+ shared_inbox_url: URL de recepcion partejada
search: Cercar
show:
created_reports: Rapòrts creat per aqueste compte
@@ -106,6 +108,18 @@ oc:
unsubscribe: Se desabonar
username: Nom d’utilizaire
web: Web
+ custom_emojis:
+ created_msg: Emoji ben creat !
+ delete: Suprimir
+ destroyed_msg: Emojo ben suprimit !
+ emoji: Emoji
+ image_hint: PNG cap a 50Ko
+ new:
+ title: Ajustar un nòu emoji personal
+ shortcode: Acorchi
+ shortcode_hint: Almens 2 caractèrs, solament alfanumerics e jonhent bas
+ title: Emojis personals
+ upload: Enviar
domain_blocks:
add_new: N’ajustar un nòu
created_msg: Domeni blocat es a èsser tractat
@@ -141,6 +155,8 @@ oc:
instances:
account_count: Comptes coneguts
domain_name: Domeni
+ reset: Reïnicializar
+ search: Cercar
title: Instàncias conegudas
reports:
action_taken_by: Mesura menada per
@@ -167,6 +183,9 @@ oc:
unresolved: Pas resolguts
view: Veire
settings:
+ bootstrap_timeline_accounts:
+ desc_html: Separatz los noms d’utilizaire amb de virgula. Pas que los comptes locals e pas clavats foncionaràn. Se lo camp es void los admins seràn selecionats.
+ title: Per defaut los nouvenguts sègon
contact_information:
email: Picatz una adreça de corrièl
username: Picatz un nom d’utilizaire
@@ -190,6 +209,9 @@ oc:
desc_html: Afichada sus la pagina de las condicions d’utilizacion Podètz utilizar de balisas HTML
title: Politica de confidencialitat del site
site_title: Títol del site
+ thumbnail:
+ desc_html: Servís pels apercebuts via OpenGraph e las API. Talha de 1200x630px recomandada.
+ title: Miniatura de l’instància
timeline_preview:
desc_html: Mostrar lo flux public sus la pagina d’acuèlh
title: Apercebut flux public
@@ -291,8 +313,8 @@ oc:
- dissabte
formats:
default: "%e/%m/%Y"
- long: Lo %e %B de %Y
- short: "%e %b"
+ long: Lo %-d %b de %Y
+ short: "%e %B"
month_names:
-
- de genièr
@@ -521,6 +543,7 @@ oc:
open_in_web: Dobrir sul web
over_character_limit: limit de %{max} caractèrs passat
pin_errors:
+ limit: Tròp de tuts penjats
ownership: Se pòt pas penjar lo tut de qualqu’un mai
private: Se pòt pas penjar los tuts pas publics
reblog: Se pòt pas penjar un tut partejat
@@ -607,6 +630,8 @@ oc:
Prima adaptacion de la politica de confidencialitat de Discourse .
title: Condicions d’utilizacion e politica de confidencialitat de %{instance}
+ themes:
+ default: Mastodon
time:
formats:
default: Lo %d %b de %Y a %Ho%M
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 88125f6923..9bf57e38b0 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -60,7 +60,9 @@ pl:
email: Adres e-mail
feed_url: Adres kanału
followers: Śledzący
+ followers_url: Adres śledzących
follows: Śledzeni
+ inbox: Adres skrzynki
ip: Adres IP
location:
all: Wszystkie
@@ -90,6 +92,7 @@ pl:
resubscribe: Ponów subskrypcję
salmon_url: Adres Salmon
search: Szukaj
+ shared_inbox_url: Adres udostępnianej skrzynki
show:
created_reports: Zgłoszenia tego użytkownika
report: zgłoszeń
@@ -103,6 +106,18 @@ pl:
unsubscribe: Przestań subskrybować
username: Nazwa użytkownika
web: Sieć
+ custom_emojis:
+ created_msg: Pomyślnie utworzono emoji!
+ delete: Usuń
+ destroyed_msg: Pomyślnie usunięto emoji!
+ emoji: Emoji
+ image_hint: Plik PNG ważący do 50KB
+ new:
+ title: Dodaj nowe niestandardowe emoji
+ shortcode: Shortcode
+ shortcode_hint: Co najmniej 2 znaki, tylko znaki alfanumeryczne i podkreślniki
+ title: Niestandardowe emoji
+ upload: Wyślij
domain_blocks:
add_new: Dodaj nową
created_msg: Blokada domen jest przetwarzana
@@ -165,6 +180,9 @@ pl:
unresolved: Nierozwiązane
view: Wyświetl
settings:
+ bootstrap_timeline_accounts:
+ desc_html: Oddzielaj nazwy użytkowników przecinkami. Działa tylko dla niezablokowanych kont w obrębie instancji. Jeżeli puste, zostaną użyte konta administratorów instancji.
+ title: Domyślne obserwacje nowych użytkowników
contact_information:
email: Służbowy adres e-mail
username: Nazwa użytkownika do kontaktu
@@ -188,6 +206,9 @@ pl:
desc_html: Miejsce na własną politykę prywatności, zasady użytkowania i inne unormowania prawne. Możesz korzystać z tagów HTML
title: Niestandardowe zasady użytkowania
site_title: Nazwa instancji
+ thumbnail:
+ desc_html: 'Używana w podglądzie przez OpenGraph i API. Zalecany rozmiar: 1200x630 pikseli.'
+ title: Miniatura instancji
timeline_preview:
desc_html: Wyświetlaj publiczną oś czasu na stronie widocznej dla niezalogowanych
title: Podgląd osi czasu
@@ -286,6 +307,9 @@ pl:
content: Sprawdzanie bezpieczeństwa nie powiodło się. Czy blokujesz pliki cookie?
title: Sprawdzanie bezpieczeństwa nie powiodło się
'429': Uduszono
+ '500':
+ content: Przepraszamy, coś poszło nie tak…
+ title: Ta strona jest nieprawidłowa
noscript_html: Aby korzystać z aplikacji Mastodon, włącz JavaScript. Możesz też skorzystać z jednej z natywnych aplikacji obsługującej Twoje urządzenie.
exports:
blocks: Zablokowani
@@ -445,6 +469,7 @@ pl:
open_in_web: Otwórz w przeglądarce
over_character_limit: limit %{max} znaków przekroczony
pin_errors:
+ limit: Nie możesz przypiąć więcej wpisów
ownership: Nie możesz przypiąć cudzego wpisu
private: Nie możesz przypiąć niepublicznego wpisu
reblog: Nie możesz przypiąć podbicia wpisu
@@ -531,6 +556,8 @@ pl:
Tekst bazuje na polityce prywatności Discourse .
title: Zasady korzystania i polityka prywatności %{instance}
+ themes:
+ default: Mastodon
time:
formats:
default: "%b %d, %Y, %H:%M"
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 7501202995..f2b46927bf 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -1,52 +1,76 @@
---
pt-BR:
about:
- about_mastodon_html: Mastodon é um servidor de rede social grátis, e open-source . Uma alternativa descentralizada ás plataformas comerciais, que evita o risco de uma única empresa monopolizar a sua comunicação. Escolha um servidor que você confie — qualquer um que escolher, você poderá interagir com todo o resto. Qualquer um pode ter uma instância Mastodon e assim participar na rede social federada sem problemas.
- about_this: Sobre essa instância
- closed_registrations: Registros estão fechadas para essa instância.
+ about_mastodon_html: Mastodon é uma rede social baseada em protocolos abertos e software gratuito e de código aberto. É descentralizada como e-mail.
+ about_this: Sobre
+ closed_registrations: Cadastros estão atualmente fechados nesta instância. No entanto! Você pode procurar uma instância diferente na qual possa criar uma conta e acessar a mesma rede por lá.
contact: Contato
+ contact_missing: Não definido
+ contact_unavailable: N/A
description_headline: O que é %{domain}?
domain_count_after: outras instâncias
domain_count_before: Conectado a
- other_instances: Outras instâncias
- source_code: Source code
- status_count_after: status
- status_count_before: Quem autorizou
+ extended_description_html: "Um bom lugar para as regras A descrição extendida ainda não foi definida.
"
+ features:
+ humane_approach_body: Aprendendo com erros de outras redes, Mastodon tem como objetivo fazer decisões éticas de design para combater o desuso de redes sociais.
+ humane_approach_title: Uma abordagem mais humana
+ not_a_product_body: Mastodon não é uma rede comercial. Sem propagandas, coleta de dados, jardins fechados. Não há uma autoridade central.
+ not_a_product_title: Você é uma pessoa e não um produto
+ real_conversation_body: Com 500 caracteres à sua disposição e suporte para conteúdo granular e avisos de conteúdo, você pode se expressar da maneira que desejar.
+ real_conversation_title: Feito para conversas reais
+ within_reach_body: Vários apps para iOS, Android e outras plataformas graças a um ecossistema de API amigável para desenvolvedores proporcionam que você possa se manter atualizado sobre seus amigos de qualquer lugar.
+ within_reach_title: Sempre a seu alcance
+ find_another_instance: Encontre outra instância
+ generic_description: "%{domain} é um servidor na rede"
+ hosted_on: Mastodon hospedado em %{domain}
+ learn_more: Saiba mais
+ other_instances: Lista de instâncias
+ source_code: Código fonte
+ status_count_after: postagens
+ status_count_before: Autores de
user_count_after: usuários
- user_count_before: Lugar de
+ user_count_before: Casa de
+ what_is_mastodon: O que é Mastodon?
accounts:
follow: Seguir
followers: Seguidores
following: Seguindo
+ media: Mídia
nothing_here: Não há nada aqui!
- people_followed_by: Pessoas seguidas por %{name}
+ people_followed_by: Pessoas que %{name} segue
people_who_follow: Pessoas que seguem %{name}
- posts: Posts
- remote_follow: Acesso remoto
- unfollow: Unfollow
+ posts: Toots
+ posts_with_replies: Toots com respostas
+ remote_follow: Siga remotamente
+ reserved_username: Este usuário está reservado
+ roles:
+ admin: Administrador
+ unfollow: Deixar de seguir
admin:
accounts:
are_you_sure: Você tem certeza?
- confirm: Confirme
+ confirm: Confirmar
confirmed: Confirmado
- disable_two_factor_authentication: Desabilitar senha de 2 passos
- display_name: Nome mostrado
- domain: Domain
+ disable_two_factor_authentication: Desativar 2FA
+ display_name: Nome de exibição
+ domain: Domínio
edit: Editar
email: E-mail
- feed_url: URL do Feed
+ feed_url: Feed URL
followers: Seguidores
- follows: Seguindo
+ follows: Segue
+ inbox_url: Inbox URL
+ ip: IP
location:
all: Todos
local: Local
remote: Remoto
- title: Local
- media_attachments: Mídia anexadas
+ title: Localização
+ media_attachments: Mídia(s) anexada(s)
moderation:
all: Todos
- silenced: Silenciado
- suspended: Supenso
+ silenced: Silenciados
+ suspended: Suspensos
title: Moderação
most_recent_activity: Atividade mais recente
most_recent_ip: IP mais recente
@@ -55,206 +79,281 @@ pt-BR:
alphabetic: Alfabética
most_recent: Mais recente
title: Ordem
- perform_full_suspension: Fazer suspensão completa
+ outbox_url: Outbox URL
+ perform_full_suspension: Efetue suspensão total
profile_url: URL do perfil
+ protocol: Protocolo
public: Público
- push_subscription_expires: PuSH subscription expires
- reset_password: Resetar senha
+ push_subscription_expires: Inscrição PuSH expira
+ redownload: Atualizar avatar
+ reset: Anular
+ reset_password: Modificar senha
+ resubscribe: Reinscrever-se
salmon_url: Salmon URL
+ search: Pesquisar
show:
- created_reports: Reports criados por esta conta
- report: report
- targeted_reports: Reports feitos sobre esta conta
+ created_reports: Relatórios criados por esta conta
+ report: relatórios
+ targeted_reports: Relatórios feitos sobre esta conta
silence: Silêncio
- statuses: Status
+ statuses: Postagens
+ subscribe: Inscrever-se
title: Contas
- undo_silenced: Desfazer silenciar
- undo_suspension: Desfazer supensão
- username: Usuário
+ undo_silenced: Retirar silêncio
+ undo_suspension: Retirar suspensão
+ unsubscribe: Desinscrever-se
+ username: Nome de usuário
web: Web
domain_blocks:
- add_new: Adicionar nova
- created_msg: Bloqueio do domínio está sendo processado
- destroyed_msg: Bloqueio de domínio está sendo desfeito
+ add_new: Adicionar novo
+ created_msg: Bloqueio de domínio está sendo processado
+ destroyed_msg: Bloqueio de domínio desfeito
domain: Domínio
new:
create: Criar bloqueio
- hint: O bloqueio de dominio não vai previnir a criação de entradas no banco de dados, mas irá, retroativamente e automaticamente aplicar métodos de moderação específica nessas contas.
+ hint: O bloqueio de domínio não prevenirá a criação de entradas de contas na base de dados, mas vai reatroativa e automaticamente aplicar métodos específicos de moderação nestas contas.
severity:
- desc_html: "Silenciar irá fazer com que os posts dessas contas sejam invisíveis para todos que não a seguem. Supender irá remover todos o conteúdo das contas, mídia e dados do perfil."
- silence: Silenciar
- suspend: Suspender
+ desc_html: O Silêncio fará com que as postagens da conta fiquem invisíveis para qualquer um que não a esteja seguindo. A Suspensão removerá todo o conteúdo da conta, mídia e dados de perfil. Use Nenhum se você apenas deseja rejeitar arquivos de mídia.
+ noop: Nenhum
+ silence: Silêncio
+ suspend: Suspensão
title: Novo bloqueio de domínio
reject_media: Rejeitar arquivos de mídia
- reject_media_hint: Remove localmente arquivos armazenados e rejeita fazer o download de novos no futuro. Irrelevante em suspensões.
+ reject_media_hint: Remove arquivos de mídia armazenados localmente e recusa quaisquer outros no futuro. Irrelevante para suspensões.
severities:
- silence: Silenciar
- suspend: Suspender
- severity: Severidade
+ noop: Nenhum
+ silence: Silêncio
+ suspend: Suspensão
+ severity: Rigidez
show:
affected_accounts:
- one: Uma conta no banco de dados afetada
- other: "%{count} contas no banco de dados afetada"
+ one: Uma conta no banco de dados foi afetada
+ other: "%{count} contas no banco de dados foram afetadas"
retroactive:
- silence: Desilenciar todas as contas existentes nesse domínio
- suspend: Desuspender todas as contas existentes nesse domínio
- title: Desfazer bloqueio de domínio para %{domain}
- title: Bloqueio de domínio
- undo: Desfazer
+ silence: Retirar silêncio de todas as contas existentes neste domínio
+ suspend: Retirar suspensão de todas as contas neste domínio
+ title: Retirar bloqueio de domínio de %{domain}
+ undo: Retirar
+ title: Bloqueios de domínio
+ undo: Retirar
instances:
account_count: Contas conhecidas
domain_name: Domínio
title: Instâncias conhecidas
reports:
+ action_taken_by: Ação realizada por
+ are_you_sure: Você tem certeza?
comment:
- label: Commentário
- none: None
- delete: Deletar
+ label: Comentário
+ none: Nenhum
+ delete: Excluir
id: ID
- mark_as_resolved: Marque como resolvido
- report: 'Report #%{id}'
- report_contents: Conteúdo
+ mark_as_resolved: Marcar como resolvido
+ nsfw:
+ 'false': Mostrar mídias anexadas
+ 'true': Esconder mídias anexadas
+ report: 'Reportar #%{id}'
+ report_contents: Conteúdos
reported_account: Conta reportada
- reported_by: Reportado por
+ reported_by: Reportada por
resolved: Resolvido
- silence_account: Conta silenciada
+ silence_account: Silenciar conta
status: Status
- suspend_account: Conta suspensa
- target: Target
- title: Reports
- unresolved: Unresolved
- view: View
+ suspend_account: Suspender conta
+ target: Alvo
+ title: Denúncias
+ unresolved: Não resolvido
+ view: Visualizar
settings:
+ bootstrap_timeline_accounts:
+ desc_html: Separe nomes de usuário através de vírgulas. Funciona apenas com contas locais e destrancadas. O padrão quando vazio são todos os administradores locais.
+ title: Usuários a serem seguidos por padrão por novas contas
contact_information:
- email: Entre um endereço de email público
- username: Entre com usuário
+ email: E-mail
+ username: Contate usuário
registrations:
closed_message:
- desc_html: Mostrar na página inicial quando registros estão fecados Você pode usar tags HTML
- title: Mensagem de registro fechados
+ desc_html: Exibido na página inicial quando cadastros estão fechados. Você pode usar tags HTML.
+ title: Mensagem de cadastros fechados
+ deletion:
+ desc_html: Permitir que qualquer um delete a sua conta
+ title: Exclusão aberta de contas
open:
- title: Aberto para registro
+ desc_html: Permitir que qualquer um crie uma conta
+ title: Cadastro aberto
site_description:
- desc_html: Mostrar como parágrafo e usado como meta tag. Vôce pode usar tags HTML, em particular <a>
e <em>
.
- title: Descrição do site
+ desc_html: Parágrafo introdutório na página inicial e em meta tags. Você pode usar tags HTML, em especial <a>
e <em>
.
+ title: Descrição da instância
site_description_extended:
- desc_html: Mostrar na página de informação extendiada Você pode usar tags HTML
- title: Descrição extendida do site
- site_title: Título do site
- title: Preferências do site
+ desc_html: Um ótimo lugar para seu código de conduta, regras, diretrizes e outras coisas para diferenciar a sua instância. Você pode usar tags HTML.
+ title: Informação estendida customizada
+ site_terms:
+ desc_html: Você pode escrever a sua própria política de privacidade, termos de serviço, entre outras coisas.Você pode usar tags HTML.
+ title: Termos de serviço customizados
+ site_title: Nome da instância
+ timeline_preview:
+ desc_html: Exibir a timeline pública na página inicial
+ title: Prévia da timeline
+ title: Configurações do site
+ statuses:
+ back_to_account: Voltar para página da conta
+ batch:
+ delete: Deletar
+ nsfw_off: NSFW OFF
+ nsfw_on: NSFW ON
+ execute: Executar
+ failed_to_execute: Falha em executar
+ media:
+ hide: Esconder mídia
+ show: Mostrar mídia
+ title: Mídia
+ no_media: Não há mídia
+ title: Postagens da conta
+ with_media: Com mídia
subscriptions:
- callback_url: URL de Callback
+ callback_url: Callback URL
confirmed: Confirmado
expires_in: Expira em
last_delivery: Última entrega
title: WebSub
topic: Tópico
title: Administração
+ admin_mailer:
+ new_report:
+ body: "%{reporter} reportou %{target}"
+ subject: Nova denúncia sobre %{instance} (#%{id})
application_mailer:
- settings: 'Mudar preferências de email: %{link}'
- signature: notificações Mastodon de %{instance}
- view: 'View:'
+ salutation: "%{name},"
+ settings: 'Change e-mail preferences: %{link}'
+ signature: Notificações do Mastodon de %{instance}
+ view: 'Visualizar:'
applications:
- invalid_url: URL dada é inválida
+ created: Aplicação criada com sucesso
+ destroyed: Aplicação excluída com sucesso
+ invalid_url: A URL provida é inválida
+ regenerate_token: Regenerar token de acesso
+ token_regenerated: Token de acesso renegerado com sucesso
+ warning: Tenha cuidado com estes dados. Nunca compartilhe com alguém!
+ your_token: Seu token de acesso
auth:
- change_password: Mudar senha
+ agreement_html: Cadastrando-se você concorda com nossos termos de serviço e política de privacidade .
+ change_password: Segurança
+ delete_account: Excluir conta
+ delete_account_html: Se você deseja excluir a sua conta, você pode prosseguir para cá . Uma confirmação será requisitada.
didnt_get_confirmation: Não recebeu instruções de confirmação?
- forgot_password: Esqueceu a senha?
+ forgot_password: Esqueceu a sua senha?
+ invalid_reset_password_token: Token de modificação de senha é inválido ou expirou. Por favor, requisite um novo.
login: Entrar
logout: Sair
- register: Registar
+ register: Cadastrar-se
resend_confirmation: Reenviar instruções de confirmação
- reset_password: Resetar senha
- set_new_password: Editar password
+ reset_password: Modificar senha
+ set_new_password: Definir uma nova senha
authorize_follow:
- error: Infelizmente houve um erro olhando uma conta remota
+ error: Infelizmente, ocorreu um erro quando visualizando a conta remota.
follow: Seguir
+ follow_request: 'Você mandou uma solicitação de seguidor para:'
+ following: 'Sucesso! Você agora está seguindo:'
+ post_follow:
+ close: Ou você pode simplesmente fechar esta janela.
+ return: Retornar ao perfil do usuário
+ web: Voltar para a página inicial
title: Seguir %{acct}
datetime:
distance_in_words:
about_x_hours: "%{count}h"
- about_x_months: "%{count}mo"
- about_x_years: "%{count}y"
- almost_x_years: "%{count}y"
+ about_x_months: "%{count} meses"
+ about_x_years: "%{count} anos"
+ almost_x_years: "%{count} anos"
half_a_minute: Agora
- less_than_x_minutes: "%{count}m"
+ less_than_x_minutes: "%{count} meses"
less_than_x_seconds: Agora
- over_x_years: "%{count}y"
- x_days: "%{count}d"
- x_minutes: "%{count}m"
- x_months: "%{count}mo"
- x_seconds: "%{count}s"
+ over_x_years: "%{count} anos"
+ x_days: "%{count} dias"
+ x_minutes: "%{count} minutos"
+ x_months: "%{count} meses"
+ x_seconds: "%{count} segundos"
+ deletes:
+ bad_password_msg: Boa tentativa, hackers! Senha incorreta.
+ confirm_password: Insira a sua senha atual para verificar a sua identidade
+ description_html: Isto vai permanente e irreversivelmente remover conteúdo de sua conta e desativá-la. O seu nome de usuário permanecerá reservado para previnir futuros roubos de identidade.
+ proceed: Excluir conta
+ success_msg: A sua conta foi excluída com sucesso
+ warning_html: Apenas a exclusão de conteúdo desta instância em particular é garantida. Conteúdo que tenha sido largamente compartilhado muito provavelmente deixará traços. Servidores offline e servidores que se desinscreveram de suas atualizações não irão atualizar as suas bases de dados.
+ warning_title: Disponibilidade de conteúdo disseminado
errors:
- '403': Você não tem permissão para ver essa página.
- '404': A página que você procura não existe.
- '410': A página que você procura não existe mais.
+ '403': Você não tem permissão para ver esta página.
+ '404': A página pela qual você está procurando não existe.
+ '410': A página pela qual você está procurando não existe mais.
'422':
- content: Verificação de segurança falhou. Você está bloqueando cookies?
- title: Verificação de segurança falhou
+ content: A verificação de segurança falhou. Você desativou o uso de cookies?
+ title: Falha na verificação de segurança
+ '429': Muitas requisições
+ noscript_html: Para usar o aplicativo web do Mastodon, por favor ative o JavaScript. Alternativamente, experimente um dos apps nativos para o Mastodon para a sua plataforma.
exports:
- blocks: Você bloqueia
+ blocks: Você bloqueou
csv: CSV
follows: Você segue
- mutes: Você selencia
- storage: Mídia de dados
+ mutes: Você silenciou
+ storage: Armazenamento de mídia
followers:
domain: Domínio
- explanation_html: Se você quer garantir a privacidade doe seu status, você precisa saber quem te segue. Seu status privado é enviado a todas as instancias que você tem seguidores . Você pode querer reavaliar e remover os seguidores que você não confia que sua privacidade vai ser mantida pelos administradores ou softwares de outras instancias.
- followers_count: Númbero de seguidores
- lock_link: Bloquear sua conta
- purge: Remove dos seguidores
+ explanation_html: Se você quer garantir a privacidade de suas postagens, você deve ficar atento a quem está te seguindo.Suas postagens privadas são enviadas para todas as instâncias em que você tem seguidores . Convém revisá-las e remover seguidores se você acredita que a sua privacidade não será respeitada pela equipe ou software destas instâncias.
+ followers_count: Número de seguidores
+ lock_link: Tranque a sua conta
+ purge: Remover de seus seguidores
success:
- one: Em processo de bloquear seguidores de um domínio...
- other: Em processo de bloqueio-leve dos seguidores de %{count} domínios...
- true_privacy_html: Saiba que privaicade de verdade só pode ser atingida com criptografia ponto-a-ponto .
- unlocked_warning_html: Qualquer um que te seguir para ver seus status privado imediatamente. %{lock_link} para poder rever e rejeitar seguidores.
- unlocked_warning_title: Sua conta não está bloqueada
+ one: No processo de bloqueio suave de seguidores de outro domínio...
+ other: No processo de bloqueio suave de seguidores de outros %{count} domínios...
+ true_privacy_html: Lembre-se de que a verdadeira privacidade só pode ser alcançada através de encriptação ponto-a-ponto .
+ unlocked_warning_html: Qualquer pessoa pode te seguir e ver as suas postagens privadas. %{lock_link} para ser capaz de revisar e rejeitar seguidores.
+ unlocked_warning_title: A sua conta não está trancada
generic:
- changes_saved_msg: Mudanças guardadas!
+ changes_saved_msg: Mudanças salvas com sucesso!
powered_by: powered by %{link}
- save_changes: Guardar alterações
+ save_changes: Salvar mudanças
validation_errors:
- one: Algo não está correto. Por favor reveja o erro abaixo
- other: Algo não está correto. Por favor reveja os %{count} erros abaixo
+ one: Algo não está certo! Por favor, reveja o erro abaixo
+ other: Algo não está certo! Por favor, reveja os %{count} erros abaixo
imports:
- preface: Você pode importar certos dados, como as pessoas que você segue ou estão bloqueadas para sua conta nessa instancia, de arquivos com dados criados por outra instancia.
- success: Seus dados foram carregados com sucesso and serão processados em algum tempo
+ preface: Você pode importar dados que você exportou de outra instância, como a lista de pessoas que você segue ou bloqueou.
+ success: Os seus dados foram enviados com sucesso e serão processados em instantes
types:
blocking: Lista de bloqueio
- following: Lista de seguidos
- muting: Lista de silenciados
- upload: Carregar
- landing_strip_html: "%{name} is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse."
- landing_strip_signup_html: If you don't, you can sign up here .
+ following: Pessoas que você segue
+ muting: Lista de silêncio
+ upload: Enviar
+ landing_strip_html: "%{name} é um usuário no %{link_to_root_path}. Você pode segui-lo ou interagir com ele se você tiver uma conta em qualquer lugar no fediverso."
+ landing_strip_signup_html: Se não, você pode se cadastrar aqui .
media_attachments:
validations:
- images_and_video: Cannot attach a video to a status that already contains images
- too_many: Cannot attach more than 4 files
+ images_and_video: Não é possível anexar um vídeo a uma postagem que já contém imagens.
+ too_many: Não é possível anexar mais de quatro imagens.
notification_mailer:
digest:
- body: 'Isto é um resumo do que você perdeu em %{instance} desde sua última visita %{since}:'
- mention: "%{name} mencionou você em:"
+ body: 'Aqui está um resumo do que você perdeu no %{instance} desde o seu último acesso em %{since}:'
+ mention: "%{name} te mencionou em:"
new_followers_summary:
- one: Você tem um novo seguidor!
- other: Você conseguiu %{count} novos seguidores! Incrível
+ one: Você tem um novo seguidor! Yay!
+ other: Você tem %{count} novos seguidores! Maravilha!
subject:
- one: "1 nova notificação desde sua última visita \U0001F418"
- other: "%{count} novas notificações desde a última visita \U0001F418"
+ one: "Uma nova notificação desde o seu último acesso \U0001F418"
+ other: "%{count} novas notificações desde o seu último acesso \U0001F418"
favourite:
- body: 'O seu post foi favoritado por %{name}:'
- subject: "%{name} favouritou o seu post"
+ body: 'Sua postagem foi favoritada por %{name}:'
+ subject: "%{name} favoritou a sua postagem"
follow:
- body: "%{name} seguiu você!"
- subject: "%{name} segue você"
+ body: "%{name} está te seguindo!"
+ subject: "%{name} está te seguindo"
follow_request:
- body: "%{name} pediu para te seguir"
- subject: 'Seguidor pendente: %{name}'
+ body: "%{name} requisitou autorização para te seguir"
+ subject: 'Pending follower: %{name}'
mention:
body: 'Você foi mencionado por %{name} em:'
- subject: Foi mencionado por %{name}
+ subject: Você foi mencionado por %{name}
reblog:
- body: 'O seu post foi reblogado por %{name}:'
- subject: "%{name} reblogou o seu post"
+ body: 'Sua postagem foi compartilhada por %{name}:'
+ subject: "%{name} compartilhou a sua postagem"
number:
human:
decimal_units:
@@ -267,56 +366,190 @@ pt-BR:
trillion: T
unit: ''
pagination:
- next: Next
- prev: Prev
+ next: Próximo
+ prev: Anterior
truncate: "…"
+ push_notifications:
+ favourite:
+ title: "%{name} favoritou a sua postagem"
+ follow:
+ title: "%{name} está te seguindo"
+ group:
+ title: "%{count} notificações"
+ mention:
+ action_boost: Compartilhar
+ action_expand: Mostrar mais
+ action_favourite: Favoritar
+ title: "%{name} mencionou você"
+ reblog:
+ title: "%{name} compartilhou a sua postagem"
remote_follow:
- acct: Entre seu usuário@domínio do qual quer seguir
- missing_resource: Não foi possível achar a URL de redirecionamento para sua conta
- proceed: Prossiga para seguir
- prompt: 'Você vai seguir:'
+ acct: Insira o seu usuário@domínio do qual você quer seguir
+ missing_resource: Não foi possível encontrar a URL de direcionamento para a sua conta
+ proceed: Prosseguir para seguir
+ prompt: 'Você irá seguir:'
+ sessions:
+ activity: Última atividade
+ browser: Navegador
+ browsers:
+ alipay: Alipay
+ blackberry: Blackberry
+ chrome: Chrome
+ edge: Microsoft Edge
+ firefox: Firefox
+ generic: Unknown browser
+ ie: Internet Explorer
+ micro_messenger: MicroMessenger
+ nokia: Nokia S40 Ovi Browser
+ opera: Opera
+ phantom_js: PhantomJS
+ qq: QQ Browser
+ safari: Safari
+ uc_browser: UCBrowser
+ weibo: Weibo
+ current_session: Sessão atual
+ description: "%{browser} em %{platform}"
+ explanation: Estes são os navegadores que estão conectados com a sua conta do Mastodon.
+ ip: IP
+ platforms:
+ adobe_air: Adobe Air
+ android: Android
+ blackberry: Blackberry
+ chrome_os: ChromeOS
+ firefox_os: Firefox OS
+ ios: iOS
+ linux: Linux
+ mac: Mac
+ other: unknown platform
+ windows: Windows
+ windows_mobile: Windows Mobile
+ windows_phone: Windows Phone
+ revoke: Revogar
+ revoke_success: Sessão revogada com sucesso
+ title: Sessões
settings:
- authorized_apps: Aplicativos autorizados
- back: Voltar ao Mastodon
+ authorized_apps: Apps autorizados
+ back: Voltar para o Mastodon
+ delete: Exclusão de conta
+ development: Desenvolvimento
edit_profile: Editar perfil
- export: Importar dados
+ export: Exportar dados
followers: Seguidores autorizados
import: Importar
preferences: Preferências
- settings: Settings
- two_factor_authentication: Autenticação Two-factor
+ settings: Configurações
+ two_factor_authentication: Autenticação em dois passos
+ your_apps: Seus aplicativos
statuses:
- open_in_web: Abrir no browser
- over_character_limit: limite de caracter excedeu %{max}
+ open_in_web: Abrir na web
+ over_character_limit: limite de caracteres de %{max} excedido
+ pin_errors:
+ ownership: Toots de outras pessoas não podem ser fixados
+ private: Toot não-público não pode ser fixado
+ reblog: Um compartilhamento não pode ser fixado
show_more: Mostrar mais
visibilities:
- private: Seguidores-apenas
+ private: Apenas seguidores
private_long: Mostrar apenas para seguidores
public: Público
- public_long: Qualquer um pode ver
- unlisted: Público, mas não mostre no timeline público
- unlisted_long: Todo mundo pode ver mas não será listado nas timeline públicas
+ public_long: Todos podem ver
+ unlisted: Não listado
+ unlisted_long: Todos podem ver, porém não será postado nas timelines públicas
stream_entries:
- click_to_show: Clique pra mostrar
- reblogged: boosted
+ click_to_show: Clique para mostrar
+ pinned: Toot fixado
+ reblogged: compartilhado
sensitive_content: Conteúdo sensível
+ terms:
+ body_html: |
+ Política de privacidade
+
+ Que informações nós coletamos?
+
+ Coletamos informações quando você se cadastra em nosso site e capturamos dados quando você participa do fórum lendo, escrevendo e analisando o conteúdo aqui compartilhado.
+
+ Quando você se registrar em nosso site, será requisitado que você ceda seu nome e endereço de e-mail. Você pode, porém, visitar nosso site sem se cadastrar. Seu endereço de e-mail será verificado por uma mensagem contendo um link único. Se este link for visitado, saberemos que você controla este endereço de e-mail.
+
+ Quando registrado e postando, nós gravamos o endereço de IP de onde a postagem se originou. Nós também podemos reter logs de serviores que incluem o endereço de IP em cada requisição para o nosso servidor.
+
+ Para que usamos essas informações?
+
+ Quaisquer das informações que coletamos podem ser usadas das seguintes formas:
+
+
+ Para personalizar a sua experiência — suas informações nos ajudam a nos adequar melhor às suas necessidades individuais.
+ Para melhorar nosso site — nós continuamente nos esforçamos para aprimorar nosso site baseados na informação e no feedback que recebemos de você.
+ Para aprimorar o serviço ao consumidor — suas informações nos ajudam a responder efetivamente às suas requisições e solicitações por suporte.
+ Para mandar e-mails periódicos — O endereço de e-mail que você forneceu pode ser usado para lhe enviar informações, notificações que você requisitar sobre mudanças a determinados tópicos ou menções ao seu nome de usuário, responder requisições e/ou solicitações e perguntas.
+
+
+ Como protegemos as suas informações?
+
+ Nós implementamos uma variedade de medidas de segurança para manter a segurança de suas informações pessoais quando você insere, submete ou acessa as suas informações pessoais.
+
+ Qual a sua política de retenção de dados?
+
+ Faremos esforços de boa fé para:
+
+
+ Reter logs de servidor contendo o endereço IP de todas as requisições a este servidor por não mais que 90 dias.
+ Reter os endereços IP associados a usuários cadastrados e suas postagens por não mais que 5 anos.
+
+
+ Nós usamos cookies?
+
+ Sim. Cookies são pequenos arquivos que um site ou o provedor de serviço transfere para o armazenamento interno de seu computador através de seu navegador (se você permitir). Estes cookies habilitam o site para reconhecer o seu navegador e, se você ter um cadastro, associá-lo a esta conta.
+
+ Nós usamos cookies para entender e salvar as suas preferências para futuras visitas e compilar dados agregados sobre o tráfego do site para que possamos oferecer melhores experiências e ferramentas no futuro. Nós podemos contratar serviços de terceiros para nos auxiliar a entender melhor nossos visitantes. Estes provedores de serviço não são autoriza usar as informações coletadas em nosso nome exceto para nos ajudar a conduzir e aprimorar nosso funcionamento.
+
+ Nós revelamos informações para terceiros?
+
+ Nós não vendemos, tocamos ou transferimos para terceiros informações pessoais que te identificam. Isso não inclui partes em que confiamos para nos ajudar a operar nosso site, conduzir nosso funcionamento ou servir você desde que estes terceiros concordem em manter essas informações em segredo. Nós também podemos prover as suas informações para obedecer ordens judiciais, reforçar nossas políticas ou proteger nossos direitos ou de outrem, propriedades ou segurança. Entretanto, informações pessoais não identificáveis podem ser enviadas para outras partes para marketing, propaganda e outros usos.
+
+ Links de terceiros
+
+ Ocasionalmente, à nossa discrição, podemos icluir ou oferecer produtos ou serviços de terceiros em nosso site. Estes terceiros têm políticas de privacidade separadas e independentes. Nós, portanto, não nos responsabilizamos pelo conteúdo e atividades destes sites de terceiros. Occasionally, at our discretion, we may include or offer third party products or services on our site. Não obstante, nós procuramos proteger a integridade de nosso site e todo feedback sobre estes sites de terceiros é bem-vindo.
+
+ Obediência ao Ato de Proteção da Privacidade Online de Crianças
+
+ Nosso site, produtos e serviços são todos direcionados a pessoas que têm pelo menos 13 anos de idade. Se este servidor estiver nos EUA, e você tiver menos de 13 anos, pelos requerimentos da COPPA (Children's Online Privacy Protection Act ) não use este site.
+
+ Política de Apenas Privacidade Online
+
+ Esta política de privacidade online se aplica somente a informações coletadas por nosso site e não a informações coletadas offline.
+
+ Seu Consentimento
+
+ Usando o nosso site, você concorda com a nossa política de privacidade.
+
+ Mudanças em nossa Política de Privacidade
+
+ Se decidirmos mudar a nossa política de privacidade, publicaremos as mudanças nesta página.
+
+ Este documento é CC-BY-SA. A sua última atualização aconteceu em 31 de maio de 2013.
+
+ Originalmente adaptado da política de privacidade do Discourse .
+ title: "%{instance} Termos de Serviço e Política de Privacidade"
time:
formats:
- default: "%d %b, %Y, %H:%M"
+ default: "%b %d, %Y, %H:%M"
two_factor_authentication:
- code_hint: Entre o código gerado pelo seu aplicativo para confirmar
- description_html: Se você habilitar autenticação two-factor , quando logar será necessário o seu telefone que vai gerar os tokens usado.
- disable: Disabilitar
- enable: Habilitar
- enabled_success: Autenticador Two-factor habilitador com sucesso
- generate_recovery_codes: Gerar códigos para recuperar conta
- instructions_html: "Scaneie este código QR no seu Google Authenticator ou aplicativo similar no seu telefone . A partir de agora seu aplicativo irá gerar tokens que deverão ser digitados para você logar."
- lost_recovery_codes: Códigos de recuperação permite que você recupere o acesso a sua conta se você perder seu telefone. Se você perder os códigos de recuperação, você pode regera-los aqui. Seus códigos antigos serão invalidados.
- manual_instructions: 'Se você não puder scanear o código QR e precisa digita-los manualmente, aqui está o segredo em texto.:'
- recovery_codes_regenerated: Códigos de recuperação foram gerados com sucesso
- recovery_instructions_html: Se algum dia você perder o acesso ao seu telefone, você pode usar um dos códigos de abaixo para recupera o acesso a sua conta. Guarde os códigos de acesso em local seguro, por exemplo imprimindo ou guardados com documentos importantes.
+ code_hint: Insira o código gerado pelo seu aplicativo auteticador para confirmar
+ description_html: Se você ativar a autenticação em dois passos , o acesso à sua conta exigirá posse de seu celular, que irá gerar tokens para validação.
+ disable: Desativar
+ enable: Ativar
+ enabled: A autenticação em dois passos está ativada
+ enabled_success: Autenticação em dois passos ativada com sucesso
+ generate_recovery_codes: Gerar códigos de recuperação
+ instructions_html: "Escaneie este QR Code no Google Authenticator ou aplicativo TOTP similar com o seu celular . De agora em diante, este aplicativo irá gerar tokens que você terá que inserir quando desejar acessar a sua conta."
+ lost_recovery_codes: Códigos de recuperação permitem que você recupere acesso à sua conta caso perca o seu celular. Se você perdeu seus códigos de recuperação, você pode gerá-los novamente aqui. Seus códigos de recuperaçãp anteriores serão invalidados.
+ manual_instructions: 'Se você não pode escanear o QR code e precisa inserí-lo manualmente, aqui está o segredo em texto:'
+ recovery_codes: Códigos de recuperação de reserva
+ recovery_codes_regenerated: Códigos de recuperação regenerados com sucesso
+ recovery_instructions_html: Se você perder acesso ao seu celular, você pode usar um dos códigos de recuperação abaixo para reganhar acesso à sua conta. Mantenha os códigos de recuperação em um local seguro . Por exemplo, você pode imprimi-los e guardá-los com outros documentos importantes.
setup: Configurar
- wrong_code: O código digitado é inválido! Os relógios do servidor e do dispositivo estão corretos?
+ wrong_code: O código inserido é invalido! O horário do servidor e o horário do seu aparelho estão corretos?
users:
- invalid_email: Endereço e-mail inválido
- invalid_otp_token: Código two-factor inválido
+ invalid_email: O endereço de e-mail é inválido
+ invalid_otp_token: Código de autenticação inválido
+ signed_in_as: 'Acesso como:'
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index b2b33c8ff0..932b166d75 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -4,10 +4,10 @@ ar:
hints:
defaults:
avatar: PNG, GIF أو JPG. على الأكثر 2 ميغابيت . سوف يتم تصغيرها إلى 120x120px
- display_name: '%{count} أحرف متبقية'
+ display_name: %{count} أحرف متبقية
header: PNG, GIF or JPG. على الأكثر 2 ميغابيت . سوف يتم تصغيرها إلى 700x335px
locked: يتطلب منك الموافقة يدويا على كل طلب للإشتراك بحسابك و منشوراتك تعرض لمتابعيك فقط دون غيرهم
- note: '%{count} أحرف متبقية'
+ note: %{count} أحرف متبقية
imports:
data: ملف CSV تم تصديره من خادوم مثيل آخر لماستدون
sessions:
diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml
index 55b80277d7..2ea70d51c8 100644
--- a/config/locales/simple_form.bg.yml
+++ b/config/locales/simple_form.bg.yml
@@ -39,8 +39,8 @@ bg:
follow_request: Изпращай e-mail, когато някой пожелае да те последва
mention: Изпращай e-mail, когато някой те спомене
reblog: Изпращай e-mail, когато някой сподели твоя публикация
- 'no': 'Не'
+ 'no': Не
required:
mark: "*"
text: задължително
- 'yes': 'Да'
+ 'yes': Да
diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml
index 7bcc21e66f..b5b7f26d2b 100644
--- a/config/locales/simple_form.ca.yml
+++ b/config/locales/simple_form.ca.yml
@@ -8,8 +8,8 @@ ca:
one: 1 character left
other: %{count} characters left
header: PNG, GIF o JPG. Màxim 2MB. Serà escalat a 700x335px
- locked: Requereix que aprovis manualment seguidors i les publicacions seran mostrades només als teus seguidors
- note:
+ locked: Requereix que aprovis manualment seguidors i les publicacions seran mostrades només als teus seguidors
+ note:
one: 1 character left
other: %{count} characters left
imports:
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index c07dc28464..a6ba839c61 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -4,10 +4,10 @@ de:
hints:
defaults:
avatar: PNG, GIF oder JPG. Maximal 2MB. Wird auf 120x120px herunterskaliert
- display_name: '%{count} Zeichen verbleiben'
+ display_name: %{count} Zeichen verbleiben
header: PNG, GIF oder JPG. Maximal 2MB. Wird auf 700x335px herunterskaliert
locked: Erlaubt dir, Profile zu überprüfen, bevor sie dir folgen können
- note: '%{count} Zeichen verbleiben'
+ note: %{count} Zeichen verbleiben
imports:
data: CSV-Datei, die von einer anderen Mastodon-Instanz exportiert wurde
sessions:
@@ -44,8 +44,8 @@ de:
follow_request: E-Mail senden, wenn mir jemand folgen möchte
mention: E-Mail senden, wenn mich jemand erwähnt
reblog: E-Mail senden, wenn jemand meinen Beitrag teilt
- 'no': 'Nein'
+ 'no': Nein
required:
mark: "*"
text: Pflichtfeld
- 'yes': 'Ja'
+ 'yes': Ja
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index fb8524a24c..f9d4e2e52e 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -13,6 +13,7 @@ en:
one: 1 character left
other: %{count} characters left
setting_noindex: Affects your public profile and status pages
+ setting_theme: Affects how Mastodon looks when you're logged in from any device.
imports:
data: CSV file exported from another Mastodon instance
sessions:
@@ -44,6 +45,7 @@ en:
setting_noindex: Opt-out of search engine indexing
setting_system_font_ui: Use system's default font
setting_unfollow_modal: Show confirmation dialog before unfollowing someone
+ setting_theme: Site theme
severity: Severity
type: Import type
username: Username
diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml
index 7c501bb93e..a3824d349b 100644
--- a/config/locales/simple_form.eo.yml
+++ b/config/locales/simple_form.eo.yml
@@ -39,8 +39,8 @@ eo:
follow_request: Sendi retpoŝt-mesaĝon, kiam iu petas sekvi vin
mention: Sendi retpoŝt-mesaĝon, kiam iu mencias vin
reblog: Sendi retpoŝt-mesaĝon, kiam iu diskonigas mesaĝon de vi
- 'no': 'Ne'
+ 'no': Ne
required:
mark: "*"
text: bezonata
- 'yes': 'Jes'
+ 'yes': Jes
diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml
index f260e600cd..63a0710d1e 100644
--- a/config/locales/simple_form.es.yml
+++ b/config/locales/simple_form.es.yml
@@ -4,12 +4,21 @@ es:
hints:
defaults:
avatar: PNG, GIF o JPG. Máximo 2MB. Será escalado a 120x120px
- display_name: Máximo 30 caracteres
+ display_name:
+ one: 1 caracter restante
+ other: %{count} caracteres restantes
header: PNG, GIF o JPG. Máximo 2MB. Será escalado a 700x335px
- locked: Requiere que manualmente apruebes seguidores y las publicaciones serán mostradas solamente a tus seguidores
- note: Máximo 160 caracteres
+ locked: Requiere que manualmente apruebes seguidores y las publicaciones serán mostradas solamente a tus seguidores
+ note:
+ one: 1 caracter restante
+ other: %{count} caracteres restantes
+ setting_noindex: Afecta a tu perfil público y páginas de estado
imports:
data: Archivo CSV exportado desde otra instancia de Mastodon
+ sessions:
+ otp: Ingresa el código de autenticación de dos factores de tu teléfono o usa uno de tus códigos de recuperación.
+ user:
+ filtered_languages: Los lenguajes seleccionados serán removidos de tus líneas de tiempo públicas.
labels:
defaults:
avatar: Avatar
diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml
index dd72a19bda..bdc4f32bf5 100644
--- a/config/locales/simple_form.fa.yml
+++ b/config/locales/simple_form.fa.yml
@@ -5,13 +5,13 @@ fa:
defaults:
avatar: یکی از قالبهای PNG یا GIF یا JPG. بیشترین اندازه ۲ مگابایت. تصویر به اندازهٔ ۱۲۰×۱۲۰ پیکسل تبدیل خواهد شد.
display_name:
- one: '1 حرف باقی مانده'
- other: '%{count} حرف باقی مانده'
+ one: 1 حرف باقی مانده
+ other: %{count} حرف باقی مانده
header: یکی از قالبهای PNG یا GIF یا JPG. بیشترین اندازه ۲ مگابایت. تصویر به اندازهٔ ۳۳۵×۷۰۰ پیکسل تبدیل خواهد شد
locked: باید پیگیران تازه را خودتان تأیید کنید. حریم خصوصی پیشفرض نوشتهها را روی پیگیران تنظیم میکند
note:
- one: '1 حرف باقی مانده'
- other: '%{count} حرف باقی مانده'
+ one: 1 حرف باقی مانده
+ other: %{count} حرف باقی مانده
setting_noindex: روی نمایهٔ عمومی و صفحهٔ نوشتههای شما تأثیر میگذارد
imports:
data: پروندهٔ CSV که از سرور ماستدون دیگری برونسپاری شده
@@ -57,8 +57,8 @@ fa:
follow_request: وقتی کسی درخواست پیگیری کرد ایمیل بفرست
mention: وقتی کسی از شما نام برد ایمیل بفرست
reblog: وقتی کسی نوشتهٔ شما را بازبوقید ایمیل بفرست
- 'no': 'خیر'
+ 'no': خیر
required:
mark: "*"
text: ضروری
- 'yes': 'بله'
+ 'yes': بله
diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml
index 2bacd6d2c8..8ca4378b1d 100644
--- a/config/locales/simple_form.fi.yml
+++ b/config/locales/simple_form.fi.yml
@@ -39,8 +39,8 @@ fi:
follow_request: Lähetä s-posti kun joku pyytää seurata sinua
mention: Lähetä s-posti kun joku mainitsee sinut
reblog: Lähetä s-posti kun joku buustaa julkaisusi
- 'no': 'Ei'
+ 'no': Ei
required:
mark: "*"
text: vaaditaan
- 'yes': 'Kyllä'
+ 'yes': Kyllä
diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml
index 5320544495..d6af5e7acd 100644
--- a/config/locales/simple_form.he.yml
+++ b/config/locales/simple_form.he.yml
@@ -3,19 +3,19 @@ he:
simple_form:
hints:
defaults:
- avatar: 'PNG, GIF או JPG. מקסימום 2MB. גודל התמונה יוקטן ל-120x120px'
+ avatar: PNG, GIF או JPG. מקסימום 2MB. גודל התמונה יוקטן ל-120x120px
display_name:
- one: 'נותרה אותאחת '
- other: 'נותרו%{count} אותיות'
- header: 'PNG, GIF או JPG. מקסימום 2MB. גודל התמונה יוקטן 700x335px'
- locked: 'מחייב אישור עוקבים באופן ידני. פרטיות ההודעות תהיה עוקבים-בלבד אלא אם יצוין אחרת'
+ one: נותרה אותאחת
+ other: נותרו%{count} אותיות
+ header: PNG, GIF או JPG. מקסימום 2MB. גודל התמונה יוקטן 700x335px
+ locked: מחייב אישור עוקבים באופן ידני. פרטיות ההודעות תהיה עוקבים-בלבד אלא אם יצוין אחרת
note:
- one: 'נותרה אותאחת '
- other: 'נותרו %{count} אותיות'
+ one: נותרה אותאחת
+ other: נותרו %{count} אותיות
imports:
- data: 'קובץ CSV שיוצא משרת מסטודון אחר'
+ data: קובץ CSV שיוצא משרת מסטודון אחר
sessions:
- otp: 'נא להקליד קוד אימות דו-שלבי ממכשירך או קוד אחזור גישה.'
+ otp: נא להקליד קוד אימות דו-שלבי ממכשירך או קוד אחזור גישה.
user:
filtered_languages: בחירת שפות להסתרה מציר הזמן הציבורי שלך.
labels:
@@ -26,7 +26,7 @@ he:
current_password: סיסמא נוכחית
data: מידע
display_name: שם להצגה
- email: 'כתובת דוא"ל'
+ email: כתובת דוא"ל
header: ראשה
locale: שפה
locked: הפוך חשבון לפרטי
@@ -44,14 +44,14 @@ he:
must_be_follower: חסימת התראות משאינם עוקבים
must_be_following: חסימת התראות משאינם נעקבים
notification_emails:
- digest: 'שליחת הודעות דוא"ל מסכמות'
- favourite: 'שליחת דוא"ל כשמחבבים חצרוץ'
- follow: 'שליחת דוא"ל כשנוספות עוקבות'
- follow_request: 'שליחת דוא"ל כשמבקשים לעקוב'
- mention: 'שליחת דוא"ל כשפונים אלייך'
- reblog: 'שליחת דוא"ל כשמהדהדים חצרוץ שלך'
- 'no': 'לא'
+ digest: שליחת הודעות דוא"ל מסכמות
+ favourite: שליחת דוא"ל כשמחבבים חצרוץ
+ follow: שליחת דוא"ל כשנוספות עוקבות
+ follow_request: שליחת דוא"ל כשמבקשים לעקוב
+ mention: שליחת דוא"ל כשפונים אלייך
+ reblog: שליחת דוא"ל כשמהדהדים חצרוץ שלך
+ 'no': לא
required:
mark: "*"
text: שדה חובה
- 'yes': 'כן'
+ 'yes': כן
diff --git a/config/locales/simple_form.hr.yml b/config/locales/simple_form.hr.yml
index 0b7761a7fd..3010423a75 100644
--- a/config/locales/simple_form.hr.yml
+++ b/config/locales/simple_form.hr.yml
@@ -40,8 +40,8 @@ hr:
follow_request: Pošalji mi e-mail kad mi netko pošalje zahtjev da me želi slijediti
mention: Pošalji mi e-mail kad me netko spomene
reblog: Pošalji mi e-mail kad netko rebloga moj status
- 'no': 'Ne'
+ 'no': Ne
required:
mark: "*"
text: traženo
- 'yes': 'Da'
+ 'yes': Da
diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml
index 89eb707673..c4dc3aead3 100644
--- a/config/locales/simple_form.hu.yml
+++ b/config/locales/simple_form.hu.yml
@@ -20,8 +20,8 @@ hu:
follow: E-mail küldése amikor valaki követni kezd téged
mention: E-mail küldése amikor valaki megemlít téged
reblog: E-mail küldése amikor valaki reblogolja az állapotod
- 'no': 'Nem'
+ 'no': Nem
required:
mark: "*"
text: kötelező
- 'yes': 'Igen'
+ 'yes': Igen
diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml
index a6e6a77a14..b00b4ef4f2 100644
--- a/config/locales/simple_form.id.yml
+++ b/config/locales/simple_form.id.yml
@@ -43,8 +43,8 @@ id:
follow_request: Kirim email saat seseorang meminta untuk mengikuti anda
mention: Kirim email saat seseorang menyebut anda
reblog: Kirim email saat seseorang mem-boost status anda
- 'no': 'Tidak'
+ 'no': Tidak
required:
mark: "*"
text: wajib
- 'yes': 'Ya'
+ 'yes': Ya
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index 70389e9482..17b35ba8f2 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -6,11 +6,12 @@ ja:
avatar: 2MBまでのPNGやGIF、JPGが利用可能です。120x120pxまで縮小されます。
display_name: あと%{count} 文字入力できます。
header: 2MBまでのPNGやGIF、JPGが利用可能です。 700x335pxまで縮小されます。
- locked: フォロワーを手動で承認する必要があります。
+ locked: フォロワーを手動で承認する必要があります
note: あと%{count} 文字入力できます。
setting_noindex: 公開プロフィールおよび各投稿ページに影響します
+ setting_theme: ログインしている全てのデバイスで適用されるデザインです。
imports:
- data: 他の Mastodon インスタンスからエクスポートしたCSVファイルを選択して下さい
+ data: 他の Mastodon インスタンスからエクスポートしたCSVファイルを選択して下さい。
sessions:
otp: 携帯電話に表示された2段階認証コードを入力するか、生成したリカバリーコードを使用してください。
user:
@@ -39,6 +40,7 @@ ja:
setting_delete_modal: トゥートを削除する前に確認ダイアログを表示する
setting_noindex: 検索エンジンによるインデックスを拒否する
setting_system_font_ui: システムのデフォルトフォントを使う
+ setting_theme: サイトテーマ
setting_unfollow_modal: フォロー解除する前に確認ダイアログを表示する
severity: 重大性
type: インポートする項目
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index b7dbc8bef8..abbad7430b 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -51,8 +51,8 @@ ko:
follow_request: 누군가 나를 팔로우 하길 원할 때 이메일 보내기
mention: 누군가 나에게 답장했을 때 이메일 보내기
reblog: 누군가 내 Toot을 부스트 했을 때 이메일 보내기
- 'no': '아니오'
+ 'no': 아니오
required:
mark: "*"
text: 필수 항목
- 'yes': '네'
+ 'yes': 네
diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml
index 351d1800c1..fabb5840aa 100644
--- a/config/locales/simple_form.nl.yml
+++ b/config/locales/simple_form.nl.yml
@@ -7,13 +7,16 @@ nl:
display_name: Maximaal 30 tekens
header: PNG, GIF of JPG. Maximaal 2MB. Wordt teruggeschaald naar 700x335px
locked: Vereist dat je handmatig volgers moet accepteren en stelt de privacy van toots standaard in op alleen volgers
- note: Maximaal 160 tekens
+ note:
+ one: 1 teken over
+ other: %{count} tekens over
+ setting_noindex: Heeft invloed op jouw openbare profiel en toots
imports:
- data: CSV-bestand dat op een andere Mastodon-server werd geëxporteerd
+ data: CSV-bestand dat op een andere Mastodon-server werd geëxporteerd
sessions:
- otp: Voer de tweestaps-aanmeldcode vanaf jouw mobiele telefoon in of gebruik een van jouw herstelcode's.
+ otp: Voer de tweestaps-aanmeldcode vanaf jouw mobiele telefoon in of gebruik een van jouw herstelcode's.
user:
- filtered_languages: De geselecteerde talen worden uit de lokale en globale tijdlijn verwijderd.
+ filtered_languages: De geselecteerde talen worden uit de lokale en globale tijdlijn verwijderd.
labels:
defaults:
avatar: Avatar
@@ -32,8 +35,13 @@ nl:
otp_attempt: Tweestaps-aanmeldcode
password: Wachtwoord
setting_auto_play_gif: Speel geanimeerde GIF's automatisch af
- setting_boost_modal: Vraag voor het boosten een bevestiging
- setting_default_privacy: Tootprivacy
+ setting_boost_modal: Vraag voor het boosten van een toot een bevestiging
+ setting_default_privacy: Zichtbaarheid toots
+ setting_default_sensitive: Media altijd als gevoelig markeren
+ setting_delete_modal: Vraag voor het verwijderen van een toot een bevestiging
+ setting_noindex: Jouw toots niet door zoekmachines laten indexeren
+ setting_system_font_ui: Standaardlettertype van jouw systeem gebruiken
+ setting_unfollow_modal: Vraag voor het ontvolgen van iemand een bevestiging
type: Importtype
username: gebruikersnaam
interactions:
@@ -46,8 +54,8 @@ nl:
follow_request: Verstuur een e-mail wanneer iemand jou wilt volgen
mention: Verstuur een e-mail wanneer iemand jou vermeld
reblog: Verstuur een e-mail wanneer iemand jouw toot heeft geboost
- 'no': 'Nee'
+ 'no': Nee
required:
mark: "*"
text: vereist
- 'yes': 'Ja'
+ 'yes': Ja
diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml
index cc9ad4c6f8..194e1582f3 100644
--- a/config/locales/simple_form.no.yml
+++ b/config/locales/simple_form.no.yml
@@ -1,19 +1,17 @@
+---
'no':
simple_form:
hints:
defaults:
- avatar: 'PNG, GIF eller JPG. Maksimalt 2MB. Vil bli nedskalert til 120x120px'
+ avatar: PNG, GIF eller JPG. Maksimalt 2MB. Vil bli nedskalert til 120x120px
display_name: Maksimalt 30 tegn
- header: 'PNG, GIF eller JPG. Maksimalt 2MB. Vil bli nedskalert til 700x335px'
- locked: >-
- Krever at du manuelt godkjenner følgere og setter standardbeskyttelse
- av poster til kun-følgere
+ header: PNG, GIF eller JPG. Maksimalt 2MB. Vil bli nedskalert til 700x335px
+ locked: Krever at du manuelt godkjenner følgere og setter standardbeskyttelse av poster til kun-følgere
note: Maksimalt 160 tegn
imports:
data: CSV-fil eksportert fra en annen Mastodon instans
sessions:
- otp: >-
- Skriv tofaktorkoden fra din telefon eller bruk en av gjenopprettingskodene.
+ otp: Skriv tofaktorkoden fra din telefon eller bruk en av gjenopprettingskodene.
labels:
defaults:
avatar: Profilbilde
@@ -48,7 +46,6 @@
reblog: Send e-post når noen fremhever din status
'no': Nei
required:
- mark: '*'
+ mark: "*"
text: påkrevd
'yes': Ja
-
diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml
index 43cb52201a..d45f98e66b 100644
--- a/config/locales/simple_form.oc.yml
+++ b/config/locales/simple_form.oc.yml
@@ -12,6 +12,8 @@ oc:
note:
one: Demòra encara 1 caractèr
other: Demòran encara %{count} caractèrs
+ setting_noindex: Aquò es destinat a vòstre perfil public e vòstra pagina d’estatuts
+ setting_theme: Aquò càmbia lo tèma grafic de Mastodon quand sètz connectat qualque siaque lo periferic.
imports:
data: Fichièr CSV exportat d’una autra instància Mastodon
sessions:
@@ -42,6 +44,7 @@ oc:
setting_delete_modal: Afichar una fenèstra de confirmacion abans de suprimir un estatut
setting_noindex: Èsser pas indexat pels motors de recèrca
setting_system_font_ui: Utilizar la policia Font del sisèma
+ setting_theme: Tèma del site
setting_unfollow_modal: Afichar una confirmacion abans de quitar de sègre qualqu’un
severity: Severitat
type: Tip d’impòrt
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index e2eba3dd8a..d5de2dcd36 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -17,6 +17,7 @@ pl:
one: Pozostał 1 znak.
other: Pozostało %{count} znaków
setting_noindex: Wpływa na widoczność strony profilu i Twoich wpisów
+ setting_theme: Zmienia wygląd Mastodona po zalogowaniu z dowolnego urządzenia.
imports:
data: Plik CSV wyeksportowany z innej instancji Mastodona
sessions:
@@ -47,6 +48,7 @@ pl:
setting_delete_modal: Pytaj o potwierdzenie przed usunięciem wpisu
setting_noindex: Nie indeksuj mojego profilu w wyszukiwarkach internetowych
setting_system_font_ui: Używaj domyślnej czcionki systemu
+ setting_theme: Motyw strony
setting_unfollow_modal: Pytaj o potwierdzenie przed cofnięciem śledzenia
severity: Priorytet
type: Typ importu
diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml
index 733e168926..22cae52717 100644
--- a/config/locales/simple_form.pt-BR.yml
+++ b/config/locales/simple_form.pt-BR.yml
@@ -1,51 +1,64 @@
---
pt-BR:
simple_form:
- labels:
+ hints:
defaults:
- avatar: PNG, GIF or JPG. Máximo 2MB. Será reduzido para 120x120px
- display_name: '%{count} caracteres restantes'
- header: PNG, GIF or JPG. Máximo 2MB. Será reduzido para 700x335px
- locked: Requer você aprovação manualmente seguidores e posts padrão de privacidade para seguidores-apenas
- note: '%{count} caracteres restantes'
+ avatar: PNG, GIF or JPG. Arquivos de até 2MB. Eles serão diminuídos para 120x120px
+ display_name:
+ one: 1 caracter restante
+ other: %{count} caracteres restantes
+ header: PNG, GIF or JPG. Arquivos de até 2MB. Eles serão diminuídos para 700x335px
+ locked: Requer aprovação manual de seguidores
+ note:
+ one: 1 caracter restante
+ other: %{count} caracteres restantes
+ setting_noindex: Afeta seu perfil público e as páginas de suas postagens
imports:
- data: Arquivo CSV exportado de outra instancia Mastodon
+ data: Arquivo CSV exportado de outra instância do Mastodon
sessions:
- otp: Entre com o código de 2 passos do seu telefone ou use os códiogos de recuperação.
+ otp: Insira o código de autenticação do seu celular ou use um dos códigos de recuperação.
+ user:
+ filtered_languages: Selecione os idiomas que devem ser removidos de suas timelines públicas.
labels:
defaults:
avatar: Avatar
- confirm_new_password: Confirme nova senha
- confirm_password: Confirme a senha
+ confirm_new_password: Confirmar nova senha
+ confirm_password: Confirmar senha
current_password: Senha atual
data: Dados
- display_name: Nome
- email: Endereço de email
- header: Header
- locale: Linguagem
- locked: Conta bloqueada
+ display_name: Nome de exibição
+ email: Endereço de e-mail
+ filtered_languages: Idiomas filtrados
+ header: Cabeçalho
+ locale: Idioma
+ locked: Trancar conta
new_password: Nova senha
- note: Biografia
- otp_attempt: Autenticação 2 passos
+ note: Bio
+ otp_attempt: Código de autenticação em dois passos
password: Senha
- setting_auto_play_gif: Tocar GIFs animados automaticamente
- setting_boost_modal: Mostrar dialogo de confirmação antes de fazer boost
- setting_default_privacy: Postar privacidade
- severity: Severidade
- type: Importar tipo
- username: Usuário
+ setting_auto_play_gif: Reproduzir GIFs automaticamente
+ setting_boost_modal: Mostrar diálogo de confirmação antes de compartilhar postagem
+ setting_default_privacy: Privacidade das postagens
+ setting_default_sensitive: Sempre marcar mídia como sensível
+ setting_delete_modal: Mostrar diálogo de confirmação antes de deletar uma postagem
+ setting_noindex: Não quero ser indexado por mecanismos de busca
+ setting_system_font_ui: Usar a fonte padrão de seu sistema
+ setting_unfollow_modal: Mostrar diálogo de confirmação antes de deixar de seguir alguém
+ severity: Gravidade
+ type: Tipo de importação
+ username: Nome de usuário
interactions:
must_be_follower: Bloquear notificações de não-seguidores
- must_be_following: Bloquear notificações de pessoas que você
+ must_be_following: Bloquear notificações de pessoas que você não segue
notification_emails:
- digest: Enviar resumo de emails
- favourite: Enviar email quando alguém favorita um post seu
- follow: Enviar email quando alguém seguir você
- follow_request: Enviar email quando alguém requisitar te seguir
- mention: Enviar email quando alguém mencionar você
- reblog: Enviar email quando alguém reblogar um post seu
- 'no': 'Não'
+ digest: Mandar e-mails com relatórios
+ favourite: Mandar um e-mail quando alguém favoritar suas postagens
+ follow: Mandar um e-mail quando alguém te seguir
+ follow_request: Mandar um e-maill quando alguém solicitar ser seu seguidor
+ mention: Mandar um e-mail quando alguém te mencionar
+ reblog: Mandar um e-mail quando alguém compartilhar suas postagens
+ 'no': Não
required:
mark: "*"
- text: necessário
- 'yes': 'Sim'
+ text: obrigatório
+ 'yes': Sim
diff --git a/config/locales/simple_form.pt.yml b/config/locales/simple_form.pt.yml
index ba3326b230..0df7a9bb98 100644
--- a/config/locales/simple_form.pt.yml
+++ b/config/locales/simple_form.pt.yml
@@ -42,8 +42,8 @@ pt:
follow: Enviar email quando alguém te segue
mention: Enviar email quando alguém te menciona
reblog: Enviar email quando alguém partilhar um post teu
- 'no': 'Não'
+ 'no': Não
required:
mark: "*"
text: necessário
- 'yes': 'Sim'
+ 'yes': Sim
diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml
index c58758da4b..87c6736002 100644
--- a/config/locales/simple_form.th.yml
+++ b/config/locales/simple_form.th.yml
@@ -5,13 +5,13 @@ th:
defaults:
avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 120x120px
display_name:
- one: '1 character left'
- other: '%{count} characters left'
+ one: 1 character left
+ other: %{count} characters left
header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px
locked: Requires you to manually approve followers and defaults post privacy to followers-only
note:
- one: '1 character left'
- other: '%{count} characters left'
+ one: 1 character left
+ other: %{count} characters left
imports:
data: CSV file exported from another Mastodon instance
sessions:
@@ -48,8 +48,8 @@ th:
follow_request: Send e-mail when someone requests to follow you
mention: Send e-mail when someone mentions you
reblog: Send e-mail when someone boosts your status
- 'no': 'ไม่'
+ 'no': ไม่
required:
mark: "*"
text: required
- 'yes': 'ใช่'
+ 'yes': ใช่
diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml
index 80b6c771ca..0e171b7931 100644
--- a/config/locales/simple_form.tr.yml
+++ b/config/locales/simple_form.tr.yml
@@ -1,14 +1,13 @@
-
---
tr:
simple_form:
hints:
defaults:
avatar: En fazla 2MB olacak şekilde PNG, GIF veya JPG formatında yükleyiniz. 120x120px büyüklüğüne indirgenecektir
- display_name: '%{count} karakter kaldı'
+ display_name: %{count} karakter kaldı
header: En fazla 2MB olacak şekilde PNG, GIF veya JPG formatında yükleyiniz. 700x335px büyüklüğüne indirgenecektir.
locked: Takipçilerinizi manuel olarak kabul etmenizi ve gönderilerinizi varsayılan olarak sadece takipçilerinizin göreceği şekilde paylaşmanızı sağlar.
- note: '%{count} karakter kaldı'
+ note: %{count} karakter kaldı
imports:
data: Diğer Mastodon sunucusundan dışarı aktardığınız CSV dosyası
sessions:
@@ -45,9 +44,8 @@ tr:
follow_request: Biri bana takip isteği gönderdiğinde, bana e-posta gönder
mention: Biri benden bahsettiğinde, bana e-posta gönder
reblog: Biri durumumu paylaştığında, bana e-posta gönder
- 'no': 'Hayır'
+ 'no': Hayır
required:
mark: "*"
text: gerekli
- 'yes': 'Evet'
-
+ 'yes': Evet
diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml
index 16608c1296..ff7f2d4caa 100644
--- a/config/locales/simple_form.uk.yml
+++ b/config/locales/simple_form.uk.yml
@@ -44,8 +44,8 @@ uk:
follow_request: Надсилати листа, коли хтось запитує дозволу на підписку
mention: Надсилати листа, коли хтось згадує Вас
reblog: Надсилати листа, коли хтось передмухує Ваш статус
- 'no': 'Ні'
+ 'no': Ні
required:
mark: "*"
text: обов'язкове
- 'yes': 'Так'
+ 'yes': Так
diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml
index 6f4edaf488..eafaa972ec 100644
--- a/config/locales/simple_form.zh-CN.yml
+++ b/config/locales/simple_form.zh-CN.yml
@@ -46,8 +46,8 @@ zh-CN:
follow_request: 当有用户要求关注你时,发电邮通知
mention: 当有用户在嘟文中提及你时,发电邮通知
reblog: 当有用户转嘟了你的嘟文时,发电邮通知
- 'no': '否'
+ 'no': 否
required:
mark: "*"
text: 必填
- 'yes': '是'
+ 'yes': 是
diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml
index 0bb135ca19..c82f07e2dc 100644
--- a/config/locales/simple_form.zh-TW.yml
+++ b/config/locales/simple_form.zh-TW.yml
@@ -42,8 +42,8 @@ zh-TW:
follow_request: 當有使用者要求關注您時,發信通知
mention: 當有使用者在文章提及您時,發信通知
reblog: 當有使用者轉推您的文章時,發信通知
- 'no': '否'
+ 'no': 否
required:
mark: "*"
text: 必填
- 'yes': '是'
+ 'yes': 是
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 95c24d0bc6..44d0f38030 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -65,9 +65,9 @@ zh-CN:
salmon_url: Salmon 反馈 URL
search: 搜索
show:
- created_reports: 这个账户创建的报告
+ created_reports: 这个帐户创建的报告
report: 报告
- targeted_reports: 关于这个账户的报告
+ targeted_reports: 关于这个帐户的报告
silence: 静音
statuses: 嘟文
title: 用户
@@ -82,7 +82,7 @@ zh-CN:
domain: 域名阻隔
new:
create: 添加域名阻隔
- hint: "「域名阻隔」不会隔绝该域名用户的嘟账户入本站数据库,但会嘟文抵达后,自动套用特定的审批操作。"
+ hint: "「域名阻隔」不会隔绝该域名用户的嘟帐户入本站数据库,但会嘟文抵达后,自动套用特定的审批操作。"
severity:
desc_html: "「自动静音 」令该域名用户的嘟文,设为只对关注者显示,没有关注的人会看不到。 「自动除名 」会自动将该域名用户的嘟文、媒体文件、个人资料从本服务器实例删除。"
silence: 自动静音
@@ -96,11 +96,11 @@ zh-CN:
severity: 阻隔程度
show:
affected_accounts:
- one: 数据库中有1个账户受影响
- other: 数据库中有%{count}个账户受影响
+ one: 数据库中有1个帐户受影响
+ other: 数据库中有%{count}个帐户受影响
retroactive:
- silence: 对此域名的所有账户取消静音
- suspend: 对此域名的所有账户取消除名
+ silence: 对此域名的所有帐户取消静音
+ suspend: 对此域名的所有帐户取消除名
title: 撤销 %{domain} 的域名阻隔
undo: 撤销
title: 域名阻隔
@@ -209,12 +209,12 @@ zh-CN:
domain: 域名
explanation_html: 想要保护你的嘟文的话,请慎重考虑关注你的人。你的受保护的嘟文会发送到有你的关注者的所有实例上 。你也许想要复查一下关注者列表来移除那些你无法信任的关注者。
followers_count: 关注者数量
- lock_link: 保护你的账户
+ lock_link: 保护你的帐户
purge: 从关注者中移除
success: 从 %{count} 个域名中移除了关注者。
true_privacy_html: "真正的隐私只能靠端到端加密来实现 !"
unlocked_warning_html: 任何人都可以关注你然后查看被保护的嘟文, %{lock_link} 可以复核和拒绝关注请求。
- unlocked_warning_title: 你的账户没被保护
+ unlocked_warning_title: 你的帐户没被保护
generic:
changes_saved_msg: 更改已被保存。
powered_by: 基于 %{link} 构建
@@ -231,7 +231,7 @@ zh-CN:
muting: 静音名单
upload: 上载
landing_strip_html: "%{name} 是一个在 %{link_to_root_path} 的用户。只要你是象毛世界里(Mastodon、GNU social)任一服务器实例的用户,便可以跨站关注此站用户并与其沟通。"
- landing_strip_signup_html: 如果你没有这类账户,欢迎在此处登记 。
+ landing_strip_signup_html: 如果你没有这类帐户,欢迎在此处登记 。
media_attachments:
validations:
images_and_video: 无法添加视频到一个已经包含图片的嘟文中
@@ -247,8 +247,8 @@ zh-CN:
one: "你有一个新通知 \U0001F418"
other: "%{count} 个通知太多,赶快去看看 \U0001F418"
favourite:
- body: "%{name} 赞你"
- subject: "%{name} 对你点赞"
+ body: "%{name} 收藏了你"
+ subject: "%{name} 给你点了收藏"
follow:
body: "%{name} 关注了你"
subject: "%{name} 关注了你"
@@ -278,7 +278,7 @@ zh-CN:
truncate: "……"
remote_follow:
acct: 请输入你的︰用户名称@实例域名
- missing_resource: 无法找到您的账户转接网址
+ missing_resource: 无法找到您的帐户转接网址
proceed: 下一步
prompt: 你正准备关注︰
settings:
@@ -317,10 +317,10 @@ zh-CN:
enabled_success: 已成功启用两步认证
generate_recovery_codes: 生成恢复代码
instructions_html: "请用你手机的认证器应用(如 Google Authenticator、Authy),扫描这里的 QR 二维码 。在两步认证启用后,你登录时将需要使用此应用程序产生的认证码。"
- lost_recovery_codes: 如果你丢了手机,你可以用恢复代码重新访问你的账户。如果你丢了恢复代码,也可以在这里重新生成一个,不过以前的恢复代码就失效了。(废话)
+ lost_recovery_codes: 如果你丢了手机,你可以用恢复代码重新访问你的帐户。如果你丢了恢复代码,也可以在这里重新生成一个,不过以前的恢复代码就失效了。(废话)
manual_instructions: 如果你无法扫描 QR 二维码,请手动输入这个文本密码︰
recovery_codes_regenerated: 已成功重新生成恢复代码
- recovery_instructions_html: 如果你的手机无法使用,你可以使用下面的任何恢复代码来恢复你的账号。请保管好你的恢复代码以防泄漏(例如你可以打印好它们并和重要文档一起保存)。
+ recovery_instructions_html: 如果你的手机无法使用,你可以使用下面的任何恢复代码来恢复你的帐号。请保管好你的恢复代码以防泄漏(例如你可以打印好它们并和重要文档一起保存)。
setup: 设置
wrong_code: 你输入的认证码并不正确!可能服务器时间和你手机不一致,请检查你手机的时钟,或与本站管理员联系。
users:
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index aa6b1ea6af..8ff6d1bf8c 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -242,8 +242,8 @@ zh-HK:
one: "自從上次登入以來,你收到 1 則新的通知 \U0001F418"
other: "自從上次登入以來,你收到 %{count} 則新的通知 \U0001F418"
favourite:
- body: 你的文章獲得 %{name} 的喜愛
- subject: "%{name} 喜歡你的文章"
+ body: 你的文章是 %{name} 的最愛!
+ subject: "%{name} 收藏了你的文章"
follow:
body: "%{name} 開始關注你!"
subject: "%{name} 現正關注你"
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 299a92da7b..7a66a64cad 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -197,8 +197,8 @@ zh-TW:
one: "自從上次登入以來,您收到 1 則新的通知 \U0001F418"
other: "自從上次登入以來,您收到 %{count} 則新的通知 \U0001F418"
favourite:
- body: 您的文章被 %{name} 喜歡
- subject: "%{name} 喜歡您的文章"
+ body: 您的文章被 %{name} 收藏
+ subject: "%{name} 將您的文章加入了最愛"
follow:
body: "%{name} 開始關注您!"
subject: "%{name} 開始關注您"
diff --git a/config/navigation.rb b/config/navigation.rb
index 4b454b3fc2..0a6ab6d3db 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -28,6 +28,7 @@ SimpleNavigation::Configuration.run do |navigation|
admin.item :sidekiq, safe_join([fa_icon('diamond fw'), 'Sidekiq']), sidekiq_url, link_html: { target: 'sidekiq' }
admin.item :pghero, safe_join([fa_icon('database fw'), 'PgHero']), pghero_url, link_html: { target: 'pghero' }
admin.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), edit_admin_settings_url
+ admin.item :custom_emojis, safe_join([fa_icon('smile-o fw'), t('admin.custom_emojis.title')]), admin_custom_emojis_url, highlights_on: %r{/admin/custom_emojis}
end
primary.item :logout, safe_join([fa_icon('sign-out fw'), t('auth.logout')]), destroy_user_session_url, link_html: { 'data-method' => 'delete' }
diff --git a/config/routes.rb b/config/routes.rb
index dc93fc6fe6..2c41c24e94 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -98,6 +98,8 @@ Rails.application.routes.draw do
resources :media, only: [:show]
resources :tags, only: [:show]
+ get '/media_proxy/:id/(*any)', to: 'media_proxy#show', as: :media_proxy
+
# Remote follow
resource :authorize_follow, only: [:show, :create]
resource :share, only: [:show, :create]
@@ -134,6 +136,8 @@ Rails.application.routes.draw do
resources :users, only: [] do
resource :two_factor_authentication, only: [:destroy]
end
+
+ resources :custom_emojis, only: [:index, :new, :create, :destroy]
end
get '/admin', to: redirect('/admin/settings/edit', status: 302)
@@ -184,6 +188,7 @@ Rails.application.routes.draw do
end
resources :streaming, only: [:index]
+ resources :custom_emojis, only: [:index]
get '/search', to: 'search#index', as: :search
diff --git a/config/settings.yml b/config/settings.yml
index 39dfb8f552..3cd3307f40 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -24,6 +24,7 @@ defaults: &defaults
auto_play_gif: false
system_font_ui: false
noindex: false
+ theme: 'default'
notification_emails:
follow: false
reblog: false
diff --git a/config/sidekiq.yml b/config/sidekiq.yml
index a502f55933..4c35dcd43a 100644
--- a/config/sidekiq.yml
+++ b/config/sidekiq.yml
@@ -7,20 +7,23 @@
- mailers
:schedule:
subscriptions_scheduler:
- cron: '0 5 * * *'
+ cron: '<%= Random.rand(0..59) %> <%= Random.rand(4..6) %> * * *'
class: Scheduler::SubscriptionsScheduler
media_cleanup_scheduler:
- cron: '5 4 * * *'
+ cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *'
class: Scheduler::MediaCleanupScheduler
feed_cleanup_scheduler:
- cron: '0 0 * * *'
+ cron: '<%= Random.rand(0..59) %> <%= Random.rand(0..2) %> * * *'
class: Scheduler::FeedCleanupScheduler
doorkeeper_cleanup_scheduler:
- cron: '1 1 * * 0'
+ cron: '<%= Random.rand(0..59) %> <%= Random.rand(0..2) %> * * 0'
class: Scheduler::DoorkeeperCleanupScheduler
user_cleanup_scheduler:
- cron: '4 5 * * *'
+ cron: '<%= Random.rand(0..59) %> <%= Random.rand(4..6) %> * * *'
class: Scheduler::UserCleanupScheduler
subscriptions_cleanup_scheduler:
- cron: '2 2 * * 0'
+ cron: '<%= Random.rand(0..59) %> <%= Random.rand(1..3) %> * * 0'
class: Scheduler::SubscriptionsCleanupScheduler
+ ip_cleanup_scheduler:
+ cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *'
+ class: Scheduler::IpCleanupScheduler
diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js
index 6ef484c3a6..606eb97f1a 100644
--- a/config/webpack/configuration.js
+++ b/config/webpack/configuration.js
@@ -1,13 +1,27 @@
// Common configuration for webpacker loaded from config/webpacker.yml
-const { join, resolve } = require('path');
+const { dirname, join, resolve } = require('path');
const { env } = require('process');
const { safeLoad } = require('js-yaml');
const { readFileSync } = require('fs');
+const glob = require('glob');
const configPath = resolve('config', 'webpacker.yml');
const loadersDir = join(__dirname, 'loaders');
const settings = safeLoad(readFileSync(configPath), 'utf8')[env.NODE_ENV];
+const themeFiles = glob.sync('app/javascript/themes/*/theme.yml');
+const themes = {};
+
+for (let i = 0; i < themeFiles.length; i++) {
+ const themeFile = themeFiles[i];
+ const data = safeLoad(readFileSync(themeFile), 'utf8');
+ if (!data.pack_directory) {
+ data.pack_directory = dirname(themeFile);
+ }
+ if (data.name && data.pack) {
+ themes[data.name] = data;
+ }
+}
function removeOuterSlashes(string) {
return string.replace(/^\/*/, '').replace(/\/*$/, '');
@@ -29,6 +43,7 @@ const output = {
module.exports = {
settings,
+ themes,
env,
loadersDir,
output,
diff --git a/config/webpack/loaders/sass.js b/config/webpack/loaders/sass.js
index 40e81b43b9..96ad7abe8c 100644
--- a/config/webpack/loaders/sass.js
+++ b/config/webpack/loaders/sass.js
@@ -9,7 +9,7 @@ module.exports = {
{ loader: 'css-loader', options: { minimize: env.NODE_ENV === 'production' } },
{ loader: 'postcss-loader', options: { sourceMap: true } },
'resolve-url-loader',
- { loader: 'sass-loader', options: { includePaths: ['app/javascript/styles'] } },
+ { loader: 'sass-loader', options: { includePaths: ['app/javascript'] } },
],
}),
};
diff --git a/config/webpack/shared.js b/config/webpack/shared.js
index be1b494217..99f4dec1a9 100644
--- a/config/webpack/shared.js
+++ b/config/webpack/shared.js
@@ -1,13 +1,12 @@
// Note: You must restart bin/webpack-dev-server for changes to take effect
-const { existsSync } = require('fs');
const webpack = require('webpack');
const { basename, dirname, join, relative, resolve } = require('path');
const { sync } = require('glob');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const ManifestPlugin = require('webpack-manifest-plugin');
const extname = require('path-complete-extname');
-const { env, settings, output, loadersDir } = require('./configuration.js');
+const { env, settings, themes, output, loadersDir } = require('./configuration.js');
const localePackPaths = require('./generateLocalePacks');
const extensionGlob = `**/*{${settings.extensions.join(',')}}*`;
@@ -15,20 +14,27 @@ const entryPath = join(settings.source_path, settings.source_entry_path);
const packPaths = sync(join(entryPath, extensionGlob));
const entryPacks = [...packPaths, ...localePackPaths].filter(path => path !== join(entryPath, 'custom.js'));
-const customApplicationStyle = resolve(join(settings.source_path, 'styles/custom.scss'));
-const originalApplicationStyle = resolve(join(settings.source_path, 'styles/application.scss'));
+const themePaths = Object.keys(themes).reduce(
+ (themePaths, name) => {
+ const themeData = themes[name];
+ themePaths[`themes/${name}`] = resolve(themeData.pack_directory, themeData.pack);
+ return themePaths;
+ }, {}
+);
module.exports = {
- entry: entryPacks.reduce(
- (map, entry) => {
- const localMap = map;
- let namespace = relative(join(entryPath), dirname(entry));
- if (namespace === join('..', '..', '..', 'tmp', 'packs')) {
- namespace = ''; // generated by generateLocalePacks.js
- }
- localMap[join(namespace, basename(entry, extname(entry)))] = resolve(entry);
- return localMap;
- }, {}
+ entry: Object.assign(
+ entryPacks.reduce(
+ (map, entry) => {
+ const localMap = map;
+ let namespace = relative(join(entryPath), dirname(entry));
+ if (namespace === join('..', '..', '..', 'tmp', 'packs')) {
+ namespace = ''; // generated by generateLocalePacks.js
+ }
+ localMap[join(namespace, basename(entry, extname(entry)))] = resolve(entry);
+ return localMap;
+ }, {}
+ ), themePaths
),
output: {
@@ -59,10 +65,6 @@ module.exports = {
],
resolve: {
- alias: {
- 'mastodon-application-style': existsSync(customApplicationStyle) ?
- customApplicationStyle : originalApplicationStyle,
- },
extensions: settings.extensions,
modules: [
resolve(settings.source_path),
diff --git a/config/webpacker.yml b/config/webpacker.yml
index aa429a1dda..8d8470651a 100644
--- a/config/webpacker.yml
+++ b/config/webpacker.yml
@@ -4,6 +4,15 @@ default: &default
source_path: app/javascript
source_entry_path: packs
public_output_path: packs
+ cache_path: tmp/cache/webpacker
+
+ # Additional paths webpack should lookup modules
+ # ['app/assets', 'engine/foo/app/assets']
+ resolved_paths: []
+
+ # Reload manifest.json on all requests so we reload latest compiled packs
+ cache_manifest: false
+
extensions:
- .js
- .sass
@@ -17,16 +26,25 @@ default: &default
development:
<<: *default
+ compile: true
dev_server:
- host: 127.0.0.1
- port: 8080
+ host: localhost
+ port: 3035
+ hmr: false
https: false
test:
<<: *default
+ # Compile test packs to a separate directory
public_output_path: packs-test
production:
<<: *default
+
+ # Production depends on precompilation of packs prior to booting for performance.
+ compile: false
+
+ # Cache manifest.json for performance
+ cache_manifest: true
diff --git a/db/migrate/20170913000752_create_site_uploads.rb b/db/migrate/20170913000752_create_site_uploads.rb
new file mode 100644
index 0000000000..2246e48cdd
--- /dev/null
+++ b/db/migrate/20170913000752_create_site_uploads.rb
@@ -0,0 +1,10 @@
+class CreateSiteUploads < ActiveRecord::Migration[5.1]
+ def change
+ create_table :site_uploads do |t|
+ t.string :var, default: '', null: false, index: { unique: true }
+ t.attachment :file
+ t.json :meta
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20170917153509_create_custom_emojis.rb b/db/migrate/20170917153509_create_custom_emojis.rb
new file mode 100644
index 0000000000..4040c83125
--- /dev/null
+++ b/db/migrate/20170917153509_create_custom_emojis.rb
@@ -0,0 +1,13 @@
+class CreateCustomEmojis < ActiveRecord::Migration[5.1]
+ def change
+ create_table :custom_emojis do |t|
+ t.string :shortcode, null: false, default: ''
+ t.string :domain
+ t.attachment :image
+
+ t.timestamps
+ end
+
+ add_index :custom_emojis, [:shortcode, :domain], unique: true
+ end
+end
diff --git a/db/migrate/20170918125918_ids_to_bigints.rb b/db/migrate/20170918125918_ids_to_bigints.rb
new file mode 100644
index 0000000000..7483dd77a4
--- /dev/null
+++ b/db/migrate/20170918125918_ids_to_bigints.rb
@@ -0,0 +1,127 @@
+class IdsToBigints < ActiveRecord::Migration[5.1]
+ def up
+ change_column :account_domain_blocks, :account_id, :bigint
+ change_column :account_domain_blocks, :id, :bigint
+ change_column :accounts, :id, :bigint
+ change_column :blocks, :account_id, :bigint
+ change_column :blocks, :id, :bigint
+ change_column :blocks, :target_account_id, :bigint
+ change_column :conversation_mutes, :account_id, :bigint
+ change_column :conversation_mutes, :id, :bigint
+ change_column :deprecated_preview_cards, :id, :bigint if table_exists?(:deprecated_preview_cards)
+ change_column :domain_blocks, :id, :bigint
+ change_column :favourites, :account_id, :bigint
+ change_column :favourites, :id, :bigint
+ change_column :favourites, :status_id, :bigint
+ change_column :follow_requests, :account_id, :bigint
+ change_column :follow_requests, :id, :bigint
+ change_column :follow_requests, :target_account_id, :bigint
+ change_column :follows, :account_id, :bigint
+ change_column :follows, :id, :bigint
+ change_column :follows, :target_account_id, :bigint
+ change_column :imports, :account_id, :bigint
+ change_column :imports, :id, :bigint
+ change_column :media_attachments, :account_id, :bigint
+ change_column :media_attachments, :id, :bigint
+ change_column :mentions, :account_id, :bigint
+ change_column :mentions, :id, :bigint
+ change_column :mutes, :account_id, :bigint
+ change_column :mutes, :id, :bigint
+ change_column :mutes, :target_account_id, :bigint
+ change_column :notifications, :account_id, :bigint
+ change_column :notifications, :from_account_id, :bigint
+ change_column :notifications, :id, :bigint
+ change_column :oauth_access_grants, :application_id, :bigint
+ change_column :oauth_access_grants, :id, :bigint
+ change_column :oauth_access_grants, :resource_owner_id, :bigint
+ change_column :oauth_access_tokens, :application_id, :bigint
+ change_column :oauth_access_tokens, :id, :bigint
+ change_column :oauth_access_tokens, :resource_owner_id, :bigint
+ change_column :oauth_applications, :id, :bigint
+ change_column :oauth_applications, :owner_id, :bigint
+ change_column :reports, :account_id, :bigint
+ change_column :reports, :action_taken_by_account_id, :bigint
+ change_column :reports, :id, :bigint
+ change_column :reports, :target_account_id, :bigint
+ change_column :session_activations, :access_token_id, :bigint
+ change_column :session_activations, :user_id, :bigint
+ change_column :session_activations, :web_push_subscription_id, :bigint
+ change_column :settings, :id, :bigint
+ change_column :settings, :thing_id, :bigint
+ change_column :statuses, :account_id, :bigint
+ change_column :statuses, :application_id, :bigint
+ change_column :statuses, :in_reply_to_account_id, :bigint
+ change_column :stream_entries, :account_id, :bigint
+ change_column :stream_entries, :id, :bigint
+ change_column :subscriptions, :account_id, :bigint
+ change_column :subscriptions, :id, :bigint
+ change_column :tags, :id, :bigint
+ change_column :users, :account_id, :bigint
+ change_column :users, :id, :bigint
+ change_column :web_settings, :id, :bigint
+ change_column :web_settings, :user_id, :bigint
+ end
+
+ def down
+ change_column :account_domain_blocks, :account_id, :integer
+ change_column :account_domain_blocks, :id, :integer
+ change_column :accounts, :id, :integer
+ change_column :blocks, :account_id, :integer
+ change_column :blocks, :id, :integer
+ change_column :blocks, :target_account_id, :integer
+ change_column :conversation_mutes, :account_id, :integer
+ change_column :conversation_mutes, :id, :integer
+ change_column :deprecated_preview_cards, :id, :integer if table_exists?(:deprecated_preview_cards)
+ change_column :domain_blocks, :id, :integer
+ change_column :favourites, :account_id, :integer
+ change_column :favourites, :id, :integer
+ change_column :favourites, :status_id, :integer
+ change_column :follow_requests, :account_id, :integer
+ change_column :follow_requests, :id, :integer
+ change_column :follow_requests, :target_account_id, :integer
+ change_column :follows, :account_id, :integer
+ change_column :follows, :id, :integer
+ change_column :follows, :target_account_id, :integer
+ change_column :imports, :account_id, :integer
+ change_column :imports, :id, :integer
+ change_column :media_attachments, :account_id, :integer
+ change_column :media_attachments, :id, :integer
+ change_column :mentions, :account_id, :integer
+ change_column :mentions, :id, :integer
+ change_column :mutes, :account_id, :integer
+ change_column :mutes, :id, :integer
+ change_column :mutes, :target_account_id, :integer
+ change_column :notifications, :account_id, :integer
+ change_column :notifications, :from_account_id, :integer
+ change_column :notifications, :id, :integer
+ change_column :oauth_access_grants, :application_id, :integer
+ change_column :oauth_access_grants, :id, :integer
+ change_column :oauth_access_grants, :resource_owner_id, :integer
+ change_column :oauth_access_tokens, :application_id, :integer
+ change_column :oauth_access_tokens, :id, :integer
+ change_column :oauth_access_tokens, :resource_owner_id, :integer
+ change_column :oauth_applications, :id, :integer
+ change_column :oauth_applications, :owner_id, :integer
+ change_column :reports, :account_id, :integer
+ change_column :reports, :action_taken_by_account_id, :integer
+ change_column :reports, :id, :integer
+ change_column :reports, :target_account_id, :integer
+ change_column :session_activations, :access_token_id, :integer
+ change_column :session_activations, :user_id, :integer
+ change_column :session_activations, :web_push_subscription_id, :integer
+ change_column :settings, :id, :integer
+ change_column :settings, :thing_id, :integer
+ change_column :statuses, :account_id, :integer
+ change_column :statuses, :application_id, :integer
+ change_column :statuses, :in_reply_to_account_id, :integer
+ change_column :stream_entries, :account_id, :integer
+ change_column :stream_entries, :id, :integer
+ change_column :subscriptions, :account_id, :integer
+ change_column :subscriptions, :id, :integer
+ change_column :tags, :id, :integer
+ change_column :users, :account_id, :integer
+ change_column :users, :id, :integer
+ change_column :web_settings, :id, :integer
+ change_column :web_settings, :user_id, :integer
+ end
+end
diff --git a/db/migrate/20170924022025_ids_to_bigints2.rb b/db/migrate/20170924022025_ids_to_bigints2.rb
new file mode 100644
index 0000000000..db8ccd919a
--- /dev/null
+++ b/db/migrate/20170924022025_ids_to_bigints2.rb
@@ -0,0 +1,9 @@
+class IdsToBigints2 < ActiveRecord::Migration[5.1]
+ def up
+ change_column :statuses_tags, :tag_id, :bigint
+ end
+
+ def down
+ change_column :statuses_tags, :tag_id, :integer
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 52edfa4976..6b73ebb943 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,20 +10,20 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20170914032032) do
+ActiveRecord::Schema.define(version: 20170924022025) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
- create_table "account_domain_blocks", id: :serial, force: :cascade do |t|
- t.integer "account_id"
+ create_table "account_domain_blocks", force: :cascade do |t|
+ t.bigint "account_id"
t.string "domain"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["account_id", "domain"], name: "index_account_domain_blocks_on_account_id_and_domain", unique: true
end
- create_table "accounts", id: :serial, force: :cascade do |t|
+ create_table "accounts", force: :cascade do |t|
t.string "username", default: "", null: false
t.string "domain"
t.string "secret", default: "", null: false
@@ -68,16 +68,16 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.index ["username", "domain"], name: "index_accounts_on_username_and_domain", unique: true
end
- create_table "blocks", id: :serial, force: :cascade do |t|
- t.integer "account_id", null: false
- t.integer "target_account_id", null: false
+ create_table "blocks", force: :cascade do |t|
+ t.bigint "account_id", null: false
+ t.bigint "target_account_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["account_id", "target_account_id"], name: "index_blocks_on_account_id_and_target_account_id", unique: true
end
- create_table "conversation_mutes", id: :serial, force: :cascade do |t|
- t.integer "account_id", null: false
+ create_table "conversation_mutes", force: :cascade do |t|
+ t.bigint "account_id", null: false
t.bigint "conversation_id", null: false
t.index ["account_id", "conversation_id"], name: "index_conversation_mutes_on_account_id_and_conversation_id", unique: true
end
@@ -89,7 +89,19 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.index ["uri"], name: "index_conversations_on_uri", unique: true
end
- create_table "domain_blocks", id: :serial, force: :cascade do |t|
+ create_table "custom_emojis", force: :cascade do |t|
+ t.string "shortcode", default: "", null: false
+ t.string "domain"
+ t.string "image_file_name"
+ t.string "image_content_type"
+ t.integer "image_file_size"
+ t.datetime "image_updated_at"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["shortcode", "domain"], name: "index_custom_emojis_on_shortcode_and_domain", unique: true
+ end
+
+ create_table "domain_blocks", force: :cascade do |t|
t.string "domain", default: "", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
@@ -98,9 +110,9 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.index ["domain"], name: "index_domain_blocks_on_domain", unique: true
end
- create_table "favourites", id: :serial, force: :cascade do |t|
- t.integer "account_id", null: false
- t.integer "status_id", null: false
+ create_table "favourites", force: :cascade do |t|
+ t.bigint "account_id", null: false
+ t.bigint "status_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["account_id", "id"], name: "index_favourites_on_account_id_and_id"
@@ -108,24 +120,24 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.index ["status_id"], name: "index_favourites_on_status_id"
end
- create_table "follow_requests", id: :serial, force: :cascade do |t|
- t.integer "account_id", null: false
- t.integer "target_account_id", null: false
+ create_table "follow_requests", force: :cascade do |t|
+ t.bigint "account_id", null: false
+ t.bigint "target_account_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["account_id", "target_account_id"], name: "index_follow_requests_on_account_id_and_target_account_id", unique: true
end
- create_table "follows", id: :serial, force: :cascade do |t|
- t.integer "account_id", null: false
- t.integer "target_account_id", null: false
+ create_table "follows", force: :cascade do |t|
+ t.bigint "account_id", null: false
+ t.bigint "target_account_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["account_id", "target_account_id"], name: "index_follows_on_account_id_and_target_account_id", unique: true
end
- create_table "imports", id: :serial, force: :cascade do |t|
- t.integer "account_id", null: false
+ create_table "imports", force: :cascade do |t|
+ t.bigint "account_id", null: false
t.integer "type", null: false
t.boolean "approved", default: false, null: false
t.datetime "created_at", null: false
@@ -136,14 +148,14 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.datetime "data_updated_at"
end
- create_table "media_attachments", id: :serial, force: :cascade do |t|
+ create_table "media_attachments", force: :cascade do |t|
t.bigint "status_id"
t.string "file_file_name"
t.string "file_content_type"
t.integer "file_file_size"
t.datetime "file_updated_at"
t.string "remote_url", default: "", null: false
- t.integer "account_id"
+ t.bigint "account_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "shortcode"
@@ -154,8 +166,8 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.index ["status_id"], name: "index_media_attachments_on_status_id"
end
- create_table "mentions", id: :serial, force: :cascade do |t|
- t.integer "account_id"
+ create_table "mentions", force: :cascade do |t|
+ t.bigint "account_id"
t.bigint "status_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
@@ -163,30 +175,30 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.index ["status_id"], name: "index_mentions_on_status_id"
end
- create_table "mutes", id: :serial, force: :cascade do |t|
- t.integer "account_id", null: false
- t.integer "target_account_id", null: false
+ create_table "mutes", force: :cascade do |t|
+ t.bigint "account_id", null: false
+ t.bigint "target_account_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "hide_notifications", default: true, null: false
t.index ["account_id", "target_account_id"], name: "index_mutes_on_account_id_and_target_account_id", unique: true
end
- create_table "notifications", id: :serial, force: :cascade do |t|
- t.integer "account_id"
+ create_table "notifications", force: :cascade do |t|
+ t.bigint "account_id"
t.bigint "activity_id"
t.string "activity_type"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
- t.integer "from_account_id"
+ t.bigint "from_account_id"
t.index ["account_id", "activity_id", "activity_type"], name: "account_activity", unique: true
t.index ["activity_id", "activity_type"], name: "index_notifications_on_activity_id_and_activity_type"
t.index ["id", "account_id", "activity_type"], name: "index_notifications_on_id_and_account_id_and_activity_type", order: { id: :desc }
end
- create_table "oauth_access_grants", id: :serial, force: :cascade do |t|
- t.integer "resource_owner_id", null: false
- t.integer "application_id", null: false
+ create_table "oauth_access_grants", force: :cascade do |t|
+ t.bigint "resource_owner_id", null: false
+ t.bigint "application_id", null: false
t.string "token", null: false
t.integer "expires_in", null: false
t.text "redirect_uri", null: false
@@ -196,9 +208,9 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.index ["token"], name: "index_oauth_access_grants_on_token", unique: true
end
- create_table "oauth_access_tokens", id: :serial, force: :cascade do |t|
- t.integer "resource_owner_id"
- t.integer "application_id"
+ create_table "oauth_access_tokens", force: :cascade do |t|
+ t.bigint "resource_owner_id"
+ t.bigint "application_id"
t.string "token", null: false
t.string "refresh_token"
t.integer "expires_in"
@@ -210,7 +222,7 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.index ["token"], name: "index_oauth_access_tokens_on_token", unique: true
end
- create_table "oauth_applications", id: :serial, force: :cascade do |t|
+ create_table "oauth_applications", force: :cascade do |t|
t.string "name", null: false
t.string "uid", null: false
t.string "secret", null: false
@@ -220,7 +232,7 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.datetime "updated_at"
t.boolean "superapp", default: false, null: false
t.string "website"
- t.integer "owner_id"
+ t.bigint "owner_id"
t.string "owner_type"
t.index ["owner_id", "owner_type"], name: "index_oauth_applications_on_owner_id_and_owner_type"
t.index ["uid"], name: "index_oauth_applications_on_uid", unique: true
@@ -253,42 +265,54 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.index ["status_id", "preview_card_id"], name: "index_preview_cards_statuses_on_status_id_and_preview_card_id"
end
- create_table "reports", id: :serial, force: :cascade do |t|
- t.integer "account_id", null: false
- t.integer "target_account_id", null: false
+ create_table "reports", force: :cascade do |t|
+ t.bigint "account_id", null: false
+ t.bigint "target_account_id", null: false
t.bigint "status_ids", default: [], null: false, array: true
t.text "comment", default: "", null: false
t.boolean "action_taken", default: false, null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
- t.integer "action_taken_by_account_id"
+ t.bigint "action_taken_by_account_id"
t.index ["account_id"], name: "index_reports_on_account_id"
t.index ["target_account_id"], name: "index_reports_on_target_account_id"
end
create_table "session_activations", force: :cascade do |t|
- t.integer "user_id", null: false
+ t.bigint "user_id", null: false
t.string "session_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "user_agent", default: "", null: false
t.inet "ip"
- t.integer "access_token_id"
- t.integer "web_push_subscription_id"
+ t.bigint "access_token_id"
+ t.bigint "web_push_subscription_id"
t.index ["session_id"], name: "index_session_activations_on_session_id", unique: true
t.index ["user_id"], name: "index_session_activations_on_user_id"
end
- create_table "settings", id: :serial, force: :cascade do |t|
+ create_table "settings", force: :cascade do |t|
t.string "var", null: false
t.text "value"
t.string "thing_type"
- t.integer "thing_id"
+ t.bigint "thing_id"
t.datetime "created_at"
t.datetime "updated_at"
t.index ["thing_type", "thing_id", "var"], name: "index_settings_on_thing_type_and_thing_id_and_var", unique: true
end
+ create_table "site_uploads", force: :cascade do |t|
+ t.string "var", default: "", null: false
+ t.string "file_file_name"
+ t.string "file_content_type"
+ t.integer "file_file_size"
+ t.datetime "file_updated_at"
+ t.json "meta"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["var"], name: "index_site_uploads_on_var", unique: true
+ end
+
create_table "status_pins", force: :cascade do |t|
t.bigint "account_id", null: false
t.bigint "status_id", null: false
@@ -299,7 +323,7 @@ ActiveRecord::Schema.define(version: 20170914032032) do
create_table "statuses", force: :cascade do |t|
t.string "uri"
- t.integer "account_id", null: false
+ t.bigint "account_id", null: false
t.text "text", default: "", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
@@ -308,8 +332,8 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.string "url"
t.boolean "sensitive", default: false, null: false
t.integer "visibility", default: 0, null: false
- t.integer "in_reply_to_account_id"
- t.integer "application_id"
+ t.bigint "in_reply_to_account_id"
+ t.bigint "application_id"
t.text "spoiler_text", default: "", null: false
t.boolean "reply", default: false, null: false
t.integer "favourites_count", default: 0, null: false
@@ -326,13 +350,13 @@ ActiveRecord::Schema.define(version: 20170914032032) do
create_table "statuses_tags", id: false, force: :cascade do |t|
t.bigint "status_id", null: false
- t.integer "tag_id", null: false
+ t.bigint "tag_id", null: false
t.index ["status_id"], name: "index_statuses_tags_on_status_id"
t.index ["tag_id", "status_id"], name: "index_statuses_tags_on_tag_id_and_status_id", unique: true
end
- create_table "stream_entries", id: :serial, force: :cascade do |t|
- t.integer "account_id"
+ create_table "stream_entries", force: :cascade do |t|
+ t.bigint "account_id"
t.bigint "activity_id"
t.string "activity_type"
t.datetime "created_at", null: false
@@ -342,12 +366,12 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.index ["activity_id", "activity_type"], name: "index_stream_entries_on_activity_id_and_activity_type"
end
- create_table "subscriptions", id: :serial, force: :cascade do |t|
+ create_table "subscriptions", force: :cascade do |t|
t.string "callback_url", default: "", null: false
t.string "secret"
t.datetime "expires_at"
t.boolean "confirmed", default: false, null: false
- t.integer "account_id", null: false
+ t.bigint "account_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "last_successful_delivery_at"
@@ -355,7 +379,7 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.index ["account_id", "callback_url"], name: "index_subscriptions_on_account_id_and_callback_url", unique: true
end
- create_table "tags", id: :serial, force: :cascade do |t|
+ create_table "tags", force: :cascade do |t|
t.string "name", default: "", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
@@ -363,9 +387,9 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.index ["name"], name: "index_tags_on_name", unique: true
end
- create_table "users", id: :serial, force: :cascade do |t|
+ create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
- t.integer "account_id", null: false
+ t.bigint "account_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "encrypted_password", default: "", null: false
@@ -407,8 +431,8 @@ ActiveRecord::Schema.define(version: 20170914032032) do
t.datetime "updated_at", null: false
end
- create_table "web_settings", id: :serial, force: :cascade do |t|
- t.integer "user_id"
+ create_table "web_settings", force: :cascade do |t|
+ t.bigint "user_id"
t.json "data"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
diff --git a/lib/assets/emoji.json b/lib/assets/emoji.json
deleted file mode 100644
index b12b760240..0000000000
--- a/lib/assets/emoji.json
+++ /dev/null
@@ -1 +0,0 @@
-{"grinning":{"unicode":"1f600","unicode_alt":"","code_decimal":"😀","name":"grinning face","shortname":":grinning:","category":"people","emoji_order":"1","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion"]},"grin":{"unicode":"1f601","unicode_alt":"","code_decimal":"😁","name":"grinning face with smiling eyes","shortname":":grin:","category":"people","emoji_order":"2","aliases":[],"aliases_ascii":[],"keywords":["happy","silly","smiley","emotion","good","selfie"]},"joy":{"unicode":"1f602","unicode_alt":"","code_decimal":"😂","name":"face with tears of joy","shortname":":joy:","category":"people","emoji_order":"3","aliases":[],"aliases_ascii":[":')",":'-)"],"keywords":["happy","silly","smiley","cry","laugh","emotion","sarcastic"]},"rofl":{"unicode":"1f923","unicode_alt":"","code_decimal":"🤣","name":"rolling on the floor laughing","shortname":":rofl:","category":"people","emoji_order":"4","aliases":[":rolling_on_the_floor_laughing:"],"aliases_ascii":[],"keywords":[]},"smiley":{"unicode":"1f603","unicode_alt":"","code_decimal":"😃","name":"smiling face with open mouth","shortname":":smiley:","category":"people","emoji_order":"5","aliases":[],"aliases_ascii":[":D",":-D","=D"],"keywords":["happy","smiley","emotion","good"]},"smile":{"unicode":"1f604","unicode_alt":"","code_decimal":"😄","name":"smiling face with open mouth and smiling eyes","shortname":":smile:","category":"people","emoji_order":"6","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion"]},"sweat_smile":{"unicode":"1f605","unicode_alt":"","code_decimal":"😅","name":"smiling face with open mouth and cold sweat","shortname":":sweat_smile:","category":"people","emoji_order":"7","aliases":[],"aliases_ascii":["':)","':-)","'=)","':D","':-D","'=D"],"keywords":["smiley","workout","sweat","emotion"]},"laughing":{"unicode":"1f606","unicode_alt":"","code_decimal":"😆","name":"smiling face with open mouth and tightly-closed eyes","shortname":":laughing:","category":"people","emoji_order":"8","aliases":[":satisfied:"],"aliases_ascii":[">:)",">;)",">:-)",">=)"],"keywords":["happy","smiley","laugh","emotion"]},"wink":{"unicode":"1f609","unicode_alt":"","code_decimal":"😉","name":"winking face","shortname":":wink:","category":"people","emoji_order":"9","aliases":[],"aliases_ascii":[";)",";-)","*-)","*)",";-]",";]",";D",";^)"],"keywords":["silly","smiley","emotion"]},"blush":{"unicode":"1f60a","unicode_alt":"","code_decimal":"😊","name":"smiling face with smiling eyes","shortname":":blush:","category":"people","emoji_order":"10","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion","good","beautiful"]},"yum":{"unicode":"1f60b","unicode_alt":"","code_decimal":"😋","name":"face savouring delicious food","shortname":":yum:","category":"people","emoji_order":"11","aliases":[],"aliases_ascii":[],"keywords":["happy","silly","smiley","emotion","sarcastic","good"]},"sunglasses":{"unicode":"1f60e","unicode_alt":"","code_decimal":"😎","name":"smiling face with sunglasses","shortname":":sunglasses:","category":"people","emoji_order":"12","aliases":[],"aliases_ascii":["B-)","B)","8)","8-)","B-D","8-D"],"keywords":["silly","smiley","emojione","glasses","boys night"]},"heart_eyes":{"unicode":"1f60d","unicode_alt":"","code_decimal":"😍","name":"smiling face with heart-shaped eyes","shortname":":heart_eyes:","category":"people","emoji_order":"13","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","love","sex","heart eyes","emotion","beautiful"]},"kissing_heart":{"unicode":"1f618","unicode_alt":"","code_decimal":"😘","name":"face throwing a kiss","shortname":":kissing_heart:","category":"people","emoji_order":"14","aliases":[],"aliases_ascii":[":*",":-*","=*",":^*"],"keywords":["smiley","love","sexy"]},"kissing":{"unicode":"1f617","unicode_alt":"","code_decimal":"😗","name":"kissing face","shortname":":kissing:","category":"people","emoji_order":"15","aliases":[],"aliases_ascii":[],"keywords":["smiley","sexy"]},"kissing_smiling_eyes":{"unicode":"1f619","unicode_alt":"","code_decimal":"😙","name":"kissing face with smiling eyes","shortname":":kissing_smiling_eyes:","category":"people","emoji_order":"16","aliases":[],"aliases_ascii":[],"keywords":["smiley","sexy"]},"kissing_closed_eyes":{"unicode":"1f61a","unicode_alt":"","code_decimal":"😚","name":"kissing face with closed eyes","shortname":":kissing_closed_eyes:","category":"people","emoji_order":"17","aliases":[],"aliases_ascii":[],"keywords":["smiley","sexy"]},"relaxed":{"unicode":"263a","unicode_alt":"263a-fe0f","code_decimal":"☺","name":"white smiling face","shortname":":relaxed:","category":"people","emoji_order":"18","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley"]},"slight_smile":{"unicode":"1f642","unicode_alt":"","code_decimal":"🙂","name":"slightly smiling face","shortname":":slight_smile:","category":"people","emoji_order":"19","aliases":[":slightly_smiling_face:"],"aliases_ascii":[":)",":-)","=]","=)",":]"],"keywords":["happy","smiley"]},"hugging":{"unicode":"1f917","unicode_alt":"","code_decimal":"🤗","name":"hugging face","shortname":":hugging:","category":"people","emoji_order":"20","aliases":[":hugging_face:"],"aliases_ascii":[],"keywords":["smiley","hug","thank you"]},"thinking":{"unicode":"1f914","unicode_alt":"","code_decimal":"🤔","name":"thinking face","shortname":":thinking:","category":"people","emoji_order":"21","aliases":[":thinking_face:"],"aliases_ascii":[],"keywords":["smiley","thinking","boys night"]},"neutral_face":{"unicode":"1f610","unicode_alt":"","code_decimal":"😐","name":"neutral face","shortname":":neutral_face:","category":"people","emoji_order":"22","aliases":[],"aliases_ascii":[],"keywords":["mad","smiley","shrug","neutral","emotion"]},"expressionless":{"unicode":"1f611","unicode_alt":"","code_decimal":"😑","name":"expressionless face","shortname":":expressionless:","category":"people","emoji_order":"23","aliases":[],"aliases_ascii":["-_-","-__-","-___-"],"keywords":["mad","smiley","neutral","emotion"]},"no_mouth":{"unicode":"1f636","unicode_alt":"","code_decimal":"😶","name":"face without mouth","shortname":":no_mouth:","category":"people","emoji_order":"24","aliases":[],"aliases_ascii":[":-X",":X",":-#",":#","=X","=x",":x",":-x","=#"],"keywords":["mad","smiley","neutral","emotion"]},"rolling_eyes":{"unicode":"1f644","unicode_alt":"","code_decimal":"🙄","name":"face with rolling eyes","shortname":":rolling_eyes:","category":"people","emoji_order":"25","aliases":[":face_with_rolling_eyes:"],"aliases_ascii":[],"keywords":["mad","smiley","rolling eyes","emotion","sarcastic"]},"smirk":{"unicode":"1f60f","unicode_alt":"","code_decimal":"😏","name":"smirking face","shortname":":smirk:","category":"people","emoji_order":"26","aliases":[],"aliases_ascii":[],"keywords":["silly","smiley","sexy","sarcastic"]},"persevere":{"unicode":"1f623","unicode_alt":"","code_decimal":"😣","name":"persevering face","shortname":":persevere:","category":"people","emoji_order":"27","aliases":[],"aliases_ascii":[">.<"],"keywords":["sad","smiley","angry","emotion"]},"disappointed_relieved":{"unicode":"1f625","unicode_alt":"","code_decimal":"😥","name":"disappointed but relieved face","shortname":":disappointed_relieved:","category":"people","emoji_order":"28","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","stressed","sweat","cry","emotion"]},"open_mouth":{"unicode":"1f62e","unicode_alt":"","code_decimal":"😮","name":"face with open mouth","shortname":":open_mouth:","category":"people","emoji_order":"29","aliases":[],"aliases_ascii":[":-O",":O",":-o",":o","O_O",">:O"],"keywords":["smiley","surprised","wow","emotion"]},"zipper_mouth":{"unicode":"1f910","unicode_alt":"","code_decimal":"🤐","name":"zipper-mouth face","shortname":":zipper_mouth:","category":"people","emoji_order":"30","aliases":[":zipper_mouth_face:"],"aliases_ascii":[],"keywords":["mad","smiley"]},"hushed":{"unicode":"1f62f","unicode_alt":"","code_decimal":"😯","name":"hushed face","shortname":":hushed:","category":"people","emoji_order":"31","aliases":[],"aliases_ascii":[],"keywords":["smiley","surprised","wow"]},"sleepy":{"unicode":"1f62a","unicode_alt":"","code_decimal":"😪","name":"sleepy face","shortname":":sleepy:","category":"people","emoji_order":"32","aliases":[],"aliases_ascii":[],"keywords":["smiley","sick","emotion"]},"tired_face":{"unicode":"1f62b","unicode_alt":"","code_decimal":"😫","name":"tired face","shortname":":tired_face:","category":"people","emoji_order":"33","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","tired","emotion"]},"sleeping":{"unicode":"1f634","unicode_alt":"","code_decimal":"😴","name":"sleeping face","shortname":":sleeping:","category":"people","emoji_order":"34","aliases":[],"aliases_ascii":[],"keywords":["smiley","tired","emotion","goodnight"]},"relieved":{"unicode":"1f60c","unicode_alt":"","code_decimal":"😌","name":"relieved face","shortname":":relieved:","category":"people","emoji_order":"35","aliases":[],"aliases_ascii":[],"keywords":["smiley","emotion"]},"nerd":{"unicode":"1f913","unicode_alt":"","code_decimal":"🤓","name":"nerd face","shortname":":nerd:","category":"people","emoji_order":"36","aliases":[":nerd_face:"],"aliases_ascii":[],"keywords":["smiley","glasses"]},"stuck_out_tongue":{"unicode":"1f61b","unicode_alt":"","code_decimal":"😛","name":"face with stuck-out tongue","shortname":":stuck_out_tongue:","category":"people","emoji_order":"37","aliases":[],"aliases_ascii":[":P",":-P","=P",":-p",":p","=p",":-\u00de",":\u00de",":\u00fe",":-\u00fe",":-b",":b","d:"],"keywords":["smiley","sex","emotion"]},"stuck_out_tongue_winking_eye":{"unicode":"1f61c","unicode_alt":"","code_decimal":"😜","name":"face with stuck-out tongue and winking eye","shortname":":stuck_out_tongue_winking_eye:","category":"people","emoji_order":"38","aliases":[],"aliases_ascii":[">:P","X-P","x-p"],"keywords":["happy","smiley","emotion","parties"]},"stuck_out_tongue_closed_eyes":{"unicode":"1f61d","unicode_alt":"","code_decimal":"😝","name":"face with stuck-out tongue and tightly-closed eyes","shortname":":stuck_out_tongue_closed_eyes:","category":"people","emoji_order":"39","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion"]},"drooling_face":{"unicode":"1f924","unicode_alt":"","code_decimal":"🤤","name":"drooling face","shortname":":drooling_face:","category":"people","emoji_order":"40","aliases":[":drool:"],"aliases_ascii":[],"keywords":[]},"unamused":{"unicode":"1f612","unicode_alt":"","code_decimal":"😒","name":"unamused face","shortname":":unamused:","category":"people","emoji_order":"41","aliases":[],"aliases_ascii":[],"keywords":["sad","mad","smiley","tired","emotion"]},"sweat":{"unicode":"1f613","unicode_alt":"","code_decimal":"😓","name":"face with cold sweat","shortname":":sweat:","category":"people","emoji_order":"42","aliases":[],"aliases_ascii":["':(","':-(","'=("],"keywords":["sad","smiley","stressed","sweat","emotion"]},"pensive":{"unicode":"1f614","unicode_alt":"","code_decimal":"😔","name":"pensive face","shortname":":pensive:","category":"people","emoji_order":"43","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","emotion","rip"]},"confused":{"unicode":"1f615","unicode_alt":"","code_decimal":"😕","name":"confused face","shortname":":confused:","category":"people","emoji_order":"44","aliases":[],"aliases_ascii":[">:\\",">:\/",":-\/",":-.",":\/",":\\","=\/","=\\",":L","=L"],"keywords":["smiley","surprised","emotion"]},"upside_down":{"unicode":"1f643","unicode_alt":"","code_decimal":"🙃","name":"upside-down face","shortname":":upside_down:","category":"people","emoji_order":"45","aliases":[":upside_down_face:"],"aliases_ascii":[],"keywords":["silly","smiley","sarcastic"]},"money_mouth":{"unicode":"1f911","unicode_alt":"","code_decimal":"🤑","name":"money-mouth face","shortname":":money_mouth:","category":"people","emoji_order":"46","aliases":[":money_mouth_face:"],"aliases_ascii":[],"keywords":["smiley","win","money","emotion","boys night"]},"astonished":{"unicode":"1f632","unicode_alt":"","code_decimal":"😲","name":"astonished face","shortname":":astonished:","category":"people","emoji_order":"47","aliases":[],"aliases_ascii":[],"keywords":["smiley","surprised","wow","emotion","omg"]},"frowning2":{"unicode":"2639","unicode_alt":"2639-fe0f","code_decimal":"☹","name":"white frowning face","shortname":":frowning2:","category":"people","emoji_order":"48","aliases":[":white_frowning_face:"],"aliases_ascii":[],"keywords":["sad","smiley","emotion"]},"slight_frown":{"unicode":"1f641","unicode_alt":"","code_decimal":"🙁","name":"slightly frowning face","shortname":":slight_frown:","category":"people","emoji_order":"49","aliases":[":slightly_frowning_face:"],"aliases_ascii":[],"keywords":["sad","smiley","emotion"]},"confounded":{"unicode":"1f616","unicode_alt":"","code_decimal":"😖","name":"confounded face","shortname":":confounded:","category":"people","emoji_order":"50","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","angry","emotion"]},"disappointed":{"unicode":"1f61e","unicode_alt":"","code_decimal":"😞","name":"disappointed face","shortname":":disappointed:","category":"people","emoji_order":"51","aliases":[],"aliases_ascii":[">:[",":-(",":(",":-[",":[","=("],"keywords":["sad","smiley","tired","emotion"]},"worried":{"unicode":"1f61f","unicode_alt":"","code_decimal":"😟","name":"worried face","shortname":":worried:","category":"people","emoji_order":"52","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","emotion"]},"triumph":{"unicode":"1f624","unicode_alt":"","code_decimal":"😤","name":"face with look of triumph","shortname":":triumph:","category":"people","emoji_order":"53","aliases":[],"aliases_ascii":[],"keywords":["mad","smiley","angry","emotion","steam"]},"cry":{"unicode":"1f622","unicode_alt":"","code_decimal":"😢","name":"crying face","shortname":":cry:","category":"people","emoji_order":"54","aliases":[],"aliases_ascii":[":'(",":'-(",";(",";-("],"keywords":["sad","smiley","cry","emotion","rip","heartbreak"]},"sob":{"unicode":"1f62d","unicode_alt":"","code_decimal":"😭","name":"loudly crying face","shortname":":sob:","category":"people","emoji_order":"55","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","cry","emotion","heartbreak"]},"frowning":{"unicode":"1f626","unicode_alt":"","code_decimal":"😦","name":"frowning face with open mouth","shortname":":frowning:","category":"people","emoji_order":"56","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","surprised","emotion"]},"anguished":{"unicode":"1f627","unicode_alt":"","code_decimal":"😧","name":"anguished face","shortname":":anguished:","category":"people","emoji_order":"57","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","surprised","emotion"]},"fearful":{"unicode":"1f628","unicode_alt":"","code_decimal":"😨","name":"fearful face","shortname":":fearful:","category":"people","emoji_order":"58","aliases":[],"aliases_ascii":["D:"],"keywords":["smiley","surprised","emotion"]},"weary":{"unicode":"1f629","unicode_alt":"","code_decimal":"😩","name":"weary face","shortname":":weary:","category":"people","emoji_order":"59","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","tired","stressed","emotion"]},"grimacing":{"unicode":"1f62c","unicode_alt":"","code_decimal":"😬","name":"grimacing face","shortname":":grimacing:","category":"people","emoji_order":"60","aliases":[],"aliases_ascii":[],"keywords":["silly","smiley","emotion","selfie"]},"cold_sweat":{"unicode":"1f630","unicode_alt":"","code_decimal":"😰","name":"face with open mouth and cold sweat","shortname":":cold_sweat:","category":"people","emoji_order":"61","aliases":[],"aliases_ascii":[],"keywords":["smiley","sweat","emotion"]},"scream":{"unicode":"1f631","unicode_alt":"","code_decimal":"😱","name":"face screaming in fear","shortname":":scream:","category":"people","emoji_order":"62","aliases":[],"aliases_ascii":[],"keywords":["smiley","surprised","wow","emotion","omg"]},"flushed":{"unicode":"1f633","unicode_alt":"","code_decimal":"😳","name":"flushed face","shortname":":flushed:","category":"people","emoji_order":"63","aliases":[],"aliases_ascii":[":$","=$"],"keywords":["smiley","emotion","omg"]},"dizzy_face":{"unicode":"1f635","unicode_alt":"","code_decimal":"😵","name":"dizzy face","shortname":":dizzy_face:","category":"people","emoji_order":"64","aliases":[],"aliases_ascii":["#-)","#)","%-)","%)","X)","X-)"],"keywords":["smiley","surprised","dead","wow","emotion","omg"]},"rage":{"unicode":"1f621","unicode_alt":"","code_decimal":"😡","name":"pouting face","shortname":":rage:","category":"people","emoji_order":"65","aliases":[],"aliases_ascii":[],"keywords":["mad","smiley","angry","emotion"]},"angry":{"unicode":"1f620","unicode_alt":"","code_decimal":"😠","name":"angry face","shortname":":angry:","category":"people","emoji_order":"66","aliases":[],"aliases_ascii":[">:(",">:-(",":@"],"keywords":["mad","smiley","emotion"]},"innocent":{"unicode":"1f607","unicode_alt":"","code_decimal":"😇","name":"smiling face with halo","shortname":":innocent:","category":"people","emoji_order":"67","aliases":[],"aliases_ascii":["O:-)","0:-3","0:3","0:-)","0:)","0;^)","O:)","O;-)","O=)","0;-)","O:-3","O:3"],"keywords":["smiley","emotion"]},"cowboy":{"unicode":"1f920","unicode_alt":"","code_decimal":"🤠","name":"face with cowboy hat","shortname":":cowboy:","category":"people","emoji_order":"68","aliases":[":face_with_cowboy_hat:"],"aliases_ascii":[],"keywords":[]},"clown":{"unicode":"1f921","unicode_alt":"","code_decimal":"🤡","name":"clown face","shortname":":clown:","category":"people","emoji_order":"69","aliases":[":clown_face:"],"aliases_ascii":[],"keywords":[]},"lying_face":{"unicode":"1f925","unicode_alt":"","code_decimal":"🤥","name":"lying face","shortname":":lying_face:","category":"people","emoji_order":"70","aliases":[":liar:"],"aliases_ascii":[],"keywords":[]},"mask":{"unicode":"1f637","unicode_alt":"","code_decimal":"😷","name":"face with medical mask","shortname":":mask:","category":"people","emoji_order":"71","aliases":[],"aliases_ascii":[],"keywords":["smiley","dead","health","sick"]},"thermometer_face":{"unicode":"1f912","unicode_alt":"","code_decimal":"🤒","name":"face with thermometer","shortname":":thermometer_face:","category":"people","emoji_order":"72","aliases":[":face_with_thermometer:"],"aliases_ascii":[],"keywords":["smiley","health","sick","emotion"]},"head_bandage":{"unicode":"1f915","unicode_alt":"","code_decimal":"🤕","name":"face with head-bandage","shortname":":head_bandage:","category":"people","emoji_order":"73","aliases":[":face_with_head_bandage:"],"aliases_ascii":[],"keywords":["smiley","health","sick","emotion"]},"nauseated_face":{"unicode":"1f922","unicode_alt":"","code_decimal":"🤢","name":"nauseated face","shortname":":nauseated_face:","category":"people","emoji_order":"74","aliases":[":sick:"],"aliases_ascii":[],"keywords":[]},"sneezing_face":{"unicode":"1f927","unicode_alt":"","code_decimal":"🤧","name":"sneezing face","shortname":":sneezing_face:","category":"people","emoji_order":"75","aliases":[":sneeze:"],"aliases_ascii":[],"keywords":[]},"smiling_imp":{"unicode":"1f608","unicode_alt":"","code_decimal":"😈","name":"smiling face with horns","shortname":":smiling_imp:","category":"people","emoji_order":"76","aliases":[],"aliases_ascii":[],"keywords":["silly","smiley","angry","monster","devil","boys night"]},"imp":{"unicode":"1f47f","unicode_alt":"","code_decimal":"👿","name":"imp","shortname":":imp:","category":"people","emoji_order":"77","aliases":[],"aliases_ascii":[],"keywords":["smiley","monster","devil","wth"]},"japanese_ogre":{"unicode":"1f479","unicode_alt":"","code_decimal":"👹","name":"japanese ogre","shortname":":japanese_ogre:","category":"people","emoji_order":"78","aliases":[],"aliases_ascii":[],"keywords":["monster"]},"japanese_goblin":{"unicode":"1f47a","unicode_alt":"","code_decimal":"👺","name":"japanese goblin","shortname":":japanese_goblin:","category":"people","emoji_order":"79","aliases":[],"aliases_ascii":[],"keywords":["angry","monster"]},"skull":{"unicode":"1f480","unicode_alt":"","code_decimal":"💀","name":"skull","shortname":":skull:","category":"people","emoji_order":"80","aliases":[":skeleton:"],"aliases_ascii":[],"keywords":["dead","halloween","skull"]},"skull_crossbones":{"unicode":"2620","unicode_alt":"2620-fe0f","code_decimal":"☠","name":"skull and crossbones","shortname":":skull_crossbones:","category":"objects","emoji_order":"81","aliases":[":skull_and_crossbones:"],"aliases_ascii":[],"keywords":["symbol","dead","skull"]},"ghost":{"unicode":"1f47b","unicode_alt":"","code_decimal":"👻","name":"ghost","shortname":":ghost:","category":"people","emoji_order":"82","aliases":[],"aliases_ascii":[],"keywords":["holidays","halloween","monster"]},"alien":{"unicode":"1f47d","unicode_alt":"","code_decimal":"👽","name":"extraterrestrial alien","shortname":":alien:","category":"people","emoji_order":"83","aliases":[],"aliases_ascii":[],"keywords":["space","monster","alien","scientology"]},"space_invader":{"unicode":"1f47e","unicode_alt":"","code_decimal":"👾","name":"alien monster","shortname":":space_invader:","category":"activity","emoji_order":"84","aliases":[],"aliases_ascii":[],"keywords":["monster","alien"]},"robot":{"unicode":"1f916","unicode_alt":"","code_decimal":"🤖","name":"robot face","shortname":":robot:","category":"people","emoji_order":"85","aliases":[":robot_face:"],"aliases_ascii":[],"keywords":["monster","robot"]},"poop":{"unicode":"1f4a9","unicode_alt":"","code_decimal":"💩","name":"pile of poo","shortname":":poop:","category":"people","emoji_order":"86","aliases":[":shit:",":hankey:",":poo:"],"aliases_ascii":[],"keywords":["bathroom","shit","sol","diarrhea"]},"smiley_cat":{"unicode":"1f63a","unicode_alt":"","code_decimal":"😺","name":"smiling cat face with open mouth","shortname":":smiley_cat:","category":"people","emoji_order":"87","aliases":[],"aliases_ascii":[],"keywords":["happy","cat","animal"]},"smile_cat":{"unicode":"1f638","unicode_alt":"","code_decimal":"😸","name":"grinning cat face with smiling eyes","shortname":":smile_cat:","category":"people","emoji_order":"88","aliases":[],"aliases_ascii":[],"keywords":["happy","cat","animal"]},"joy_cat":{"unicode":"1f639","unicode_alt":"","code_decimal":"😹","name":"cat face with tears of joy","shortname":":joy_cat:","category":"people","emoji_order":"89","aliases":[],"aliases_ascii":[],"keywords":["happy","silly","cry","laugh","cat","animal","sarcastic"]},"heart_eyes_cat":{"unicode":"1f63b","unicode_alt":"","code_decimal":"😻","name":"smiling cat face with heart-shaped eyes","shortname":":heart_eyes_cat:","category":"people","emoji_order":"90","aliases":[],"aliases_ascii":[],"keywords":["heart eyes","cat","animal","beautiful"]},"smirk_cat":{"unicode":"1f63c","unicode_alt":"","code_decimal":"😼","name":"cat face with wry smile","shortname":":smirk_cat:","category":"people","emoji_order":"91","aliases":[],"aliases_ascii":[],"keywords":["cat","animal"]},"kissing_cat":{"unicode":"1f63d","unicode_alt":"","code_decimal":"😽","name":"kissing cat face with closed eyes","shortname":":kissing_cat:","category":"people","emoji_order":"92","aliases":[],"aliases_ascii":[],"keywords":["cat","animal"]},"scream_cat":{"unicode":"1f640","unicode_alt":"","code_decimal":"🙀","name":"weary cat face","shortname":":scream_cat:","category":"people","emoji_order":"93","aliases":[],"aliases_ascii":[],"keywords":["cat","animal"]},"crying_cat_face":{"unicode":"1f63f","unicode_alt":"","code_decimal":"😿","name":"crying cat face","shortname":":crying_cat_face:","category":"people","emoji_order":"94","aliases":[],"aliases_ascii":[],"keywords":["cry","cat","animal"]},"pouting_cat":{"unicode":"1f63e","unicode_alt":"","code_decimal":"😾","name":"pouting cat face","shortname":":pouting_cat:","category":"people","emoji_order":"95","aliases":[],"aliases_ascii":[],"keywords":["cat","animal"]},"see_no_evil":{"unicode":"1f648","unicode_alt":"","code_decimal":"🙈","name":"see-no-evil monkey","shortname":":see_no_evil:","category":"nature","emoji_order":"96","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"hear_no_evil":{"unicode":"1f649","unicode_alt":"","code_decimal":"🙉","name":"hear-no-evil monkey","shortname":":hear_no_evil:","category":"nature","emoji_order":"97","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"speak_no_evil":{"unicode":"1f64a","unicode_alt":"","code_decimal":"🙊","name":"speak-no-evil monkey","shortname":":speak_no_evil:","category":"nature","emoji_order":"98","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"boy":{"unicode":"1f466","unicode_alt":"","code_decimal":"👦","name":"boy","shortname":":boy:","category":"people","emoji_order":"99","aliases":[],"aliases_ascii":[],"keywords":["people","baby","diversity"]},"boy_tone1":{"unicode":"1f466-1f3fb","unicode_alt":"","code_decimal":"👦🏻","name":"boy tone 1","shortname":":boy_tone1:","category":"people","emoji_order":"100","aliases":[],"aliases_ascii":[],"keywords":[]},"boy_tone2":{"unicode":"1f466-1f3fc","unicode_alt":"","code_decimal":"👦🏼","name":"boy tone 2","shortname":":boy_tone2:","category":"people","emoji_order":"101","aliases":[],"aliases_ascii":[],"keywords":[]},"boy_tone3":{"unicode":"1f466-1f3fd","unicode_alt":"","code_decimal":"👦🏽","name":"boy tone 3","shortname":":boy_tone3:","category":"people","emoji_order":"102","aliases":[],"aliases_ascii":[],"keywords":[]},"boy_tone4":{"unicode":"1f466-1f3fe","unicode_alt":"","code_decimal":"👦🏾","name":"boy tone 4","shortname":":boy_tone4:","category":"people","emoji_order":"103","aliases":[],"aliases_ascii":[],"keywords":[]},"boy_tone5":{"unicode":"1f466-1f3ff","unicode_alt":"","code_decimal":"👦🏿","name":"boy tone 5","shortname":":boy_tone5:","category":"people","emoji_order":"104","aliases":[],"aliases_ascii":[],"keywords":[]},"girl":{"unicode":"1f467","unicode_alt":"","code_decimal":"👧","name":"girl","shortname":":girl:","category":"people","emoji_order":"105","aliases":[],"aliases_ascii":[],"keywords":["people","women","baby","diversity"]},"girl_tone1":{"unicode":"1f467-1f3fb","unicode_alt":"","code_decimal":"👧🏻","name":"girl tone 1","shortname":":girl_tone1:","category":"people","emoji_order":"106","aliases":[],"aliases_ascii":[],"keywords":[]},"girl_tone2":{"unicode":"1f467-1f3fc","unicode_alt":"","code_decimal":"👧🏼","name":"girl tone 2","shortname":":girl_tone2:","category":"people","emoji_order":"107","aliases":[],"aliases_ascii":[],"keywords":[]},"girl_tone3":{"unicode":"1f467-1f3fd","unicode_alt":"","code_decimal":"👧🏽","name":"girl tone 3","shortname":":girl_tone3:","category":"people","emoji_order":"108","aliases":[],"aliases_ascii":[],"keywords":[]},"girl_tone4":{"unicode":"1f467-1f3fe","unicode_alt":"","code_decimal":"👧🏾","name":"girl tone 4","shortname":":girl_tone4:","category":"people","emoji_order":"109","aliases":[],"aliases_ascii":[],"keywords":[]},"girl_tone5":{"unicode":"1f467-1f3ff","unicode_alt":"","code_decimal":"👧🏿","name":"girl tone 5","shortname":":girl_tone5:","category":"people","emoji_order":"110","aliases":[],"aliases_ascii":[],"keywords":[]},"man":{"unicode":"1f468","unicode_alt":"","code_decimal":"👨","name":"man","shortname":":man:","category":"people","emoji_order":"111","aliases":[],"aliases_ascii":[],"keywords":["people","men","sex","diversity","selfie","boys night"]},"man_tone1":{"unicode":"1f468-1f3fb","unicode_alt":"","code_decimal":"👨🏻","name":"man tone 1","shortname":":man_tone1:","category":"people","emoji_order":"112","aliases":[],"aliases_ascii":[],"keywords":[]},"man_tone2":{"unicode":"1f468-1f3fc","unicode_alt":"","code_decimal":"👨🏼","name":"man tone 2","shortname":":man_tone2:","category":"people","emoji_order":"113","aliases":[],"aliases_ascii":[],"keywords":[]},"man_tone3":{"unicode":"1f468-1f3fd","unicode_alt":"","code_decimal":"👨🏽","name":"man tone 3","shortname":":man_tone3:","category":"people","emoji_order":"114","aliases":[],"aliases_ascii":[],"keywords":[]},"man_tone4":{"unicode":"1f468-1f3fe","unicode_alt":"","code_decimal":"👨🏾","name":"man tone 4","shortname":":man_tone4:","category":"people","emoji_order":"115","aliases":[],"aliases_ascii":[],"keywords":[]},"man_tone5":{"unicode":"1f468-1f3ff","unicode_alt":"","code_decimal":"👨🏿","name":"man tone 5","shortname":":man_tone5:","category":"people","emoji_order":"116","aliases":[],"aliases_ascii":[],"keywords":[]},"woman":{"unicode":"1f469","unicode_alt":"","code_decimal":"👩","name":"woman","shortname":":woman:","category":"people","emoji_order":"117","aliases":[],"aliases_ascii":[],"keywords":["people","women","sex","diversity","feminist","selfie","girls night"]},"woman_tone1":{"unicode":"1f469-1f3fb","unicode_alt":"","code_decimal":"👩🏻","name":"woman tone 1","shortname":":woman_tone1:","category":"people","emoji_order":"118","aliases":[],"aliases_ascii":[],"keywords":[]},"woman_tone2":{"unicode":"1f469-1f3fc","unicode_alt":"","code_decimal":"👩🏼","name":"woman tone 2","shortname":":woman_tone2:","category":"people","emoji_order":"119","aliases":[],"aliases_ascii":[],"keywords":[]},"woman_tone3":{"unicode":"1f469-1f3fd","unicode_alt":"","code_decimal":"👩🏽","name":"woman tone 3","shortname":":woman_tone3:","category":"people","emoji_order":"120","aliases":[],"aliases_ascii":[],"keywords":[]},"woman_tone4":{"unicode":"1f469-1f3fe","unicode_alt":"","code_decimal":"👩🏾","name":"woman tone 4","shortname":":woman_tone4:","category":"people","emoji_order":"121","aliases":[],"aliases_ascii":[],"keywords":[]},"woman_tone5":{"unicode":"1f469-1f3ff","unicode_alt":"","code_decimal":"👩🏿","name":"woman tone 5","shortname":":woman_tone5:","category":"people","emoji_order":"122","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man":{"unicode":"1f474","unicode_alt":"","code_decimal":"👴","name":"older man","shortname":":older_man:","category":"people","emoji_order":"123","aliases":[],"aliases_ascii":[],"keywords":["people","men","old people","diversity"]},"older_man_tone1":{"unicode":"1f474-1f3fb","unicode_alt":"","code_decimal":"👴🏻","name":"older man tone 1","shortname":":older_man_tone1:","category":"people","emoji_order":"124","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man_tone2":{"unicode":"1f474-1f3fc","unicode_alt":"","code_decimal":"👴🏼","name":"older man tone 2","shortname":":older_man_tone2:","category":"people","emoji_order":"125","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man_tone3":{"unicode":"1f474-1f3fd","unicode_alt":"","code_decimal":"👴🏽","name":"older man tone 3","shortname":":older_man_tone3:","category":"people","emoji_order":"126","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man_tone4":{"unicode":"1f474-1f3fe","unicode_alt":"","code_decimal":"👴🏾","name":"older man tone 4","shortname":":older_man_tone4:","category":"people","emoji_order":"127","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man_tone5":{"unicode":"1f474-1f3ff","unicode_alt":"","code_decimal":"👴🏿","name":"older man tone 5","shortname":":older_man_tone5:","category":"people","emoji_order":"128","aliases":[],"aliases_ascii":[],"keywords":[]},"older_woman":{"unicode":"1f475","unicode_alt":"","code_decimal":"👵","name":"older woman","shortname":":older_woman:","category":"people","emoji_order":"129","aliases":[":grandma:"],"aliases_ascii":[],"keywords":["people","old people","diversity"]},"older_woman_tone1":{"unicode":"1f475-1f3fb","unicode_alt":"","code_decimal":"👵🏻","name":"older woman tone 1","shortname":":older_woman_tone1:","category":"people","emoji_order":"130","aliases":[":grandma_tone1:"],"aliases_ascii":[],"keywords":[]},"older_woman_tone2":{"unicode":"1f475-1f3fc","unicode_alt":"","code_decimal":"👵🏼","name":"older woman tone 2","shortname":":older_woman_tone2:","category":"people","emoji_order":"131","aliases":[":grandma_tone2:"],"aliases_ascii":[],"keywords":[]},"older_woman_tone3":{"unicode":"1f475-1f3fd","unicode_alt":"","code_decimal":"👵🏽","name":"older woman tone 3","shortname":":older_woman_tone3:","category":"people","emoji_order":"132","aliases":[":grandma_tone3:"],"aliases_ascii":[],"keywords":[]},"older_woman_tone4":{"unicode":"1f475-1f3fe","unicode_alt":"","code_decimal":"👵🏾","name":"older woman tone 4","shortname":":older_woman_tone4:","category":"people","emoji_order":"133","aliases":[":grandma_tone4:"],"aliases_ascii":[],"keywords":[]},"older_woman_tone5":{"unicode":"1f475-1f3ff","unicode_alt":"","code_decimal":"👵🏿","name":"older woman tone 5","shortname":":older_woman_tone5:","category":"people","emoji_order":"134","aliases":[":grandma_tone5:"],"aliases_ascii":[],"keywords":[]},"baby":{"unicode":"1f476","unicode_alt":"","code_decimal":"👶","name":"baby","shortname":":baby:","category":"people","emoji_order":"135","aliases":[],"aliases_ascii":[],"keywords":["people","baby","diversity"]},"baby_tone1":{"unicode":"1f476-1f3fb","unicode_alt":"","code_decimal":"👶🏻","name":"baby tone 1","shortname":":baby_tone1:","category":"people","emoji_order":"136","aliases":[],"aliases_ascii":[],"keywords":[]},"baby_tone2":{"unicode":"1f476-1f3fc","unicode_alt":"","code_decimal":"👶🏼","name":"baby tone 2","shortname":":baby_tone2:","category":"people","emoji_order":"137","aliases":[],"aliases_ascii":[],"keywords":[]},"baby_tone3":{"unicode":"1f476-1f3fd","unicode_alt":"","code_decimal":"👶🏽","name":"baby tone 3","shortname":":baby_tone3:","category":"people","emoji_order":"138","aliases":[],"aliases_ascii":[],"keywords":[]},"baby_tone4":{"unicode":"1f476-1f3fe","unicode_alt":"","code_decimal":"👶🏾","name":"baby tone 4","shortname":":baby_tone4:","category":"people","emoji_order":"139","aliases":[],"aliases_ascii":[],"keywords":[]},"baby_tone5":{"unicode":"1f476-1f3ff","unicode_alt":"","code_decimal":"👶🏿","name":"baby tone 5","shortname":":baby_tone5:","category":"people","emoji_order":"140","aliases":[],"aliases_ascii":[],"keywords":[]},"angel":{"unicode":"1f47c","unicode_alt":"","code_decimal":"👼","name":"baby angel","shortname":":angel:","category":"people","emoji_order":"141","aliases":[],"aliases_ascii":[],"keywords":["people","diversity","omg"]},"angel_tone1":{"unicode":"1f47c-1f3fb","unicode_alt":"","code_decimal":"👼🏻","name":"baby angel tone 1","shortname":":angel_tone1:","category":"people","emoji_order":"142","aliases":[],"aliases_ascii":[],"keywords":[]},"angel_tone2":{"unicode":"1f47c-1f3fc","unicode_alt":"","code_decimal":"👼🏼","name":"baby angel tone 2","shortname":":angel_tone2:","category":"people","emoji_order":"143","aliases":[],"aliases_ascii":[],"keywords":[]},"angel_tone3":{"unicode":"1f47c-1f3fd","unicode_alt":"","code_decimal":"👼🏽","name":"baby angel tone 3","shortname":":angel_tone3:","category":"people","emoji_order":"144","aliases":[],"aliases_ascii":[],"keywords":[]},"angel_tone4":{"unicode":"1f47c-1f3fe","unicode_alt":"","code_decimal":"👼🏾","name":"baby angel tone 4","shortname":":angel_tone4:","category":"people","emoji_order":"145","aliases":[],"aliases_ascii":[],"keywords":[]},"angel_tone5":{"unicode":"1f47c-1f3ff","unicode_alt":"","code_decimal":"👼🏿","name":"baby angel tone 5","shortname":":angel_tone5:","category":"people","emoji_order":"146","aliases":[],"aliases_ascii":[],"keywords":[]},"cop":{"unicode":"1f46e","unicode_alt":"","code_decimal":"👮","name":"police officer","shortname":":cop:","category":"people","emoji_order":"339","aliases":[],"aliases_ascii":[],"keywords":["people","hat","men","diversity","job","police","911"]},"cop_tone1":{"unicode":"1f46e-1f3fb","unicode_alt":"","code_decimal":"👮🏻","name":"police officer tone 1","shortname":":cop_tone1:","category":"people","emoji_order":"340","aliases":[],"aliases_ascii":[],"keywords":[]},"cop_tone2":{"unicode":"1f46e-1f3fc","unicode_alt":"","code_decimal":"👮🏼","name":"police officer tone 2","shortname":":cop_tone2:","category":"people","emoji_order":"341","aliases":[],"aliases_ascii":[],"keywords":[]},"cop_tone3":{"unicode":"1f46e-1f3fd","unicode_alt":"","code_decimal":"👮🏽","name":"police officer tone 3","shortname":":cop_tone3:","category":"people","emoji_order":"342","aliases":[],"aliases_ascii":[],"keywords":[]},"cop_tone4":{"unicode":"1f46e-1f3fe","unicode_alt":"","code_decimal":"👮🏾","name":"police officer tone 4","shortname":":cop_tone4:","category":"people","emoji_order":"343","aliases":[],"aliases_ascii":[],"keywords":[]},"cop_tone5":{"unicode":"1f46e-1f3ff","unicode_alt":"","code_decimal":"👮🏿","name":"police officer tone 5","shortname":":cop_tone5:","category":"people","emoji_order":"344","aliases":[],"aliases_ascii":[],"keywords":[]},"spy":{"unicode":"1f575","unicode_alt":"1f575-fe0f","code_decimal":"🕵","name":"sleuth or spy","shortname":":spy:","category":"people","emoji_order":"357","aliases":[":sleuth_or_spy:"],"aliases_ascii":[],"keywords":["people","hat","men","glasses","diversity","job"]},"spy_tone1":{"unicode":"1f575-1f3fb","unicode_alt":"","code_decimal":"🕵🏻","name":"sleuth or spy tone 1","shortname":":spy_tone1:","category":"people","emoji_order":"358","aliases":[":sleuth_or_spy_tone1:"],"aliases_ascii":[],"keywords":[]},"spy_tone2":{"unicode":"1f575-1f3fc","unicode_alt":"","code_decimal":"🕵🏼","name":"sleuth or spy tone 2","shortname":":spy_tone2:","category":"people","emoji_order":"359","aliases":[":sleuth_or_spy_tone2:"],"aliases_ascii":[],"keywords":[]},"spy_tone3":{"unicode":"1f575-1f3fd","unicode_alt":"","code_decimal":"🕵🏽","name":"sleuth or spy tone 3","shortname":":spy_tone3:","category":"people","emoji_order":"360","aliases":[":sleuth_or_spy_tone3:"],"aliases_ascii":[],"keywords":[]},"spy_tone4":{"unicode":"1f575-1f3fe","unicode_alt":"","code_decimal":"🕵🏾","name":"sleuth or spy tone 4","shortname":":spy_tone4:","category":"people","emoji_order":"361","aliases":[":sleuth_or_spy_tone4:"],"aliases_ascii":[],"keywords":[]},"spy_tone5":{"unicode":"1f575-1f3ff","unicode_alt":"","code_decimal":"🕵🏿","name":"sleuth or spy tone 5","shortname":":spy_tone5:","category":"people","emoji_order":"362","aliases":[":sleuth_or_spy_tone5:"],"aliases_ascii":[],"keywords":[]},"guardsman":{"unicode":"1f482","unicode_alt":"","code_decimal":"💂","name":"guardsman","shortname":":guardsman:","category":"people","emoji_order":"375","aliases":[],"aliases_ascii":[],"keywords":["people","hat","men","diversity","job"]},"guardsman_tone1":{"unicode":"1f482-1f3fb","unicode_alt":"","code_decimal":"💂🏻","name":"guardsman tone 1","shortname":":guardsman_tone1:","category":"people","emoji_order":"376","aliases":[],"aliases_ascii":[],"keywords":[]},"guardsman_tone2":{"unicode":"1f482-1f3fc","unicode_alt":"","code_decimal":"💂🏼","name":"guardsman tone 2","shortname":":guardsman_tone2:","category":"people","emoji_order":"377","aliases":[],"aliases_ascii":[],"keywords":[]},"guardsman_tone3":{"unicode":"1f482-1f3fd","unicode_alt":"","code_decimal":"💂🏽","name":"guardsman tone 3","shortname":":guardsman_tone3:","category":"people","emoji_order":"378","aliases":[],"aliases_ascii":[],"keywords":[]},"guardsman_tone4":{"unicode":"1f482-1f3fe","unicode_alt":"","code_decimal":"💂🏾","name":"guardsman tone 4","shortname":":guardsman_tone4:","category":"people","emoji_order":"379","aliases":[],"aliases_ascii":[],"keywords":[]},"guardsman_tone5":{"unicode":"1f482-1f3ff","unicode_alt":"","code_decimal":"💂🏿","name":"guardsman tone 5","shortname":":guardsman_tone5:","category":"people","emoji_order":"380","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker":{"unicode":"1f477","unicode_alt":"","code_decimal":"👷","name":"construction worker","shortname":":construction_worker:","category":"people","emoji_order":"393","aliases":[],"aliases_ascii":[],"keywords":["people","hat","men","diversity","job"]},"construction_worker_tone1":{"unicode":"1f477-1f3fb","unicode_alt":"","code_decimal":"👷🏻","name":"construction worker tone 1","shortname":":construction_worker_tone1:","category":"people","emoji_order":"394","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker_tone2":{"unicode":"1f477-1f3fc","unicode_alt":"","code_decimal":"👷🏼","name":"construction worker tone 2","shortname":":construction_worker_tone2:","category":"people","emoji_order":"395","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker_tone3":{"unicode":"1f477-1f3fd","unicode_alt":"","code_decimal":"👷🏽","name":"construction worker tone 3","shortname":":construction_worker_tone3:","category":"people","emoji_order":"396","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker_tone4":{"unicode":"1f477-1f3fe","unicode_alt":"","code_decimal":"👷🏾","name":"construction worker tone 4","shortname":":construction_worker_tone4:","category":"people","emoji_order":"397","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker_tone5":{"unicode":"1f477-1f3ff","unicode_alt":"","code_decimal":"👷🏿","name":"construction worker tone 5","shortname":":construction_worker_tone5:","category":"people","emoji_order":"398","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban":{"unicode":"1f473","unicode_alt":"","code_decimal":"👳","name":"man with turban","shortname":":man_with_turban:","category":"people","emoji_order":"411","aliases":[],"aliases_ascii":[],"keywords":["people","hat","diversity"]},"man_with_turban_tone1":{"unicode":"1f473-1f3fb","unicode_alt":"","code_decimal":"👳🏻","name":"man with turban tone 1","shortname":":man_with_turban_tone1:","category":"people","emoji_order":"412","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban_tone2":{"unicode":"1f473-1f3fc","unicode_alt":"","code_decimal":"👳🏼","name":"man with turban tone 2","shortname":":man_with_turban_tone2:","category":"people","emoji_order":"413","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban_tone3":{"unicode":"1f473-1f3fd","unicode_alt":"","code_decimal":"👳🏽","name":"man with turban tone 3","shortname":":man_with_turban_tone3:","category":"people","emoji_order":"414","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban_tone4":{"unicode":"1f473-1f3fe","unicode_alt":"","code_decimal":"👳🏾","name":"man with turban tone 4","shortname":":man_with_turban_tone4:","category":"people","emoji_order":"415","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban_tone5":{"unicode":"1f473-1f3ff","unicode_alt":"","code_decimal":"👳🏿","name":"man with turban tone 5","shortname":":man_with_turban_tone5:","category":"people","emoji_order":"416","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair":{"unicode":"1f471","unicode_alt":"","code_decimal":"👱","name":"person with blond hair","shortname":":person_with_blond_hair:","category":"people","emoji_order":"429","aliases":[],"aliases_ascii":[],"keywords":["people","men","diversity"]},"person_with_blond_hair_tone1":{"unicode":"1f471-1f3fb","unicode_alt":"","code_decimal":"👱🏻","name":"person with blond hair tone 1","shortname":":person_with_blond_hair_tone1:","category":"people","emoji_order":"430","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair_tone2":{"unicode":"1f471-1f3fc","unicode_alt":"","code_decimal":"👱🏼","name":"person with blond hair tone 2","shortname":":person_with_blond_hair_tone2:","category":"people","emoji_order":"431","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair_tone3":{"unicode":"1f471-1f3fd","unicode_alt":"","code_decimal":"👱🏽","name":"person with blond hair tone 3","shortname":":person_with_blond_hair_tone3:","category":"people","emoji_order":"432","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair_tone4":{"unicode":"1f471-1f3fe","unicode_alt":"","code_decimal":"👱🏾","name":"person with blond hair tone 4","shortname":":person_with_blond_hair_tone4:","category":"people","emoji_order":"433","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair_tone5":{"unicode":"1f471-1f3ff","unicode_alt":"","code_decimal":"👱🏿","name":"person with blond hair tone 5","shortname":":person_with_blond_hair_tone5:","category":"people","emoji_order":"434","aliases":[],"aliases_ascii":[],"keywords":[]},"santa":{"unicode":"1f385","unicode_alt":"","code_decimal":"🎅","name":"father christmas","shortname":":santa:","category":"people","emoji_order":"447","aliases":[],"aliases_ascii":[],"keywords":["people","hat","winter","holidays","christmas","diversity","santa"]},"santa_tone1":{"unicode":"1f385-1f3fb","unicode_alt":"","code_decimal":"🎅🏻","name":"father christmas tone 1","shortname":":santa_tone1:","category":"people","emoji_order":"448","aliases":[],"aliases_ascii":[],"keywords":[]},"santa_tone2":{"unicode":"1f385-1f3fc","unicode_alt":"","code_decimal":"🎅🏼","name":"father christmas tone 2","shortname":":santa_tone2:","category":"people","emoji_order":"449","aliases":[],"aliases_ascii":[],"keywords":[]},"santa_tone3":{"unicode":"1f385-1f3fd","unicode_alt":"","code_decimal":"🎅🏽","name":"father christmas tone 3","shortname":":santa_tone3:","category":"people","emoji_order":"450","aliases":[],"aliases_ascii":[],"keywords":[]},"santa_tone4":{"unicode":"1f385-1f3fe","unicode_alt":"","code_decimal":"🎅🏾","name":"father christmas tone 4","shortname":":santa_tone4:","category":"people","emoji_order":"451","aliases":[],"aliases_ascii":[],"keywords":[]},"santa_tone5":{"unicode":"1f385-1f3ff","unicode_alt":"","code_decimal":"🎅🏿","name":"father christmas tone 5","shortname":":santa_tone5:","category":"people","emoji_order":"452","aliases":[],"aliases_ascii":[],"keywords":[]},"mrs_claus":{"unicode":"1f936","unicode_alt":"","code_decimal":"🤶","name":"mother christmas","shortname":":mrs_claus:","category":"people","emoji_order":"453","aliases":[":mother_christmas:"],"aliases_ascii":[],"keywords":[]},"mrs_claus_tone1":{"unicode":"1f936-1f3fb","unicode_alt":"","code_decimal":"🤶🏻","name":"mother christmas tone 1","shortname":":mrs_claus_tone1:","category":"people","emoji_order":"454","aliases":[":mother_christmas_tone1:"],"aliases_ascii":[],"keywords":[]},"mrs_claus_tone2":{"unicode":"1f936-1f3fc","unicode_alt":"","code_decimal":"🤶🏼","name":"mother christmas tone 2","shortname":":mrs_claus_tone2:","category":"people","emoji_order":"455","aliases":[":mother_christmas_tone2:"],"aliases_ascii":[],"keywords":[]},"mrs_claus_tone3":{"unicode":"1f936-1f3fd","unicode_alt":"","code_decimal":"🤶🏽","name":"mother christmas tone 3","shortname":":mrs_claus_tone3:","category":"people","emoji_order":"456","aliases":[":mother_christmas_tone3:"],"aliases_ascii":[],"keywords":[]},"mrs_claus_tone4":{"unicode":"1f936-1f3fe","unicode_alt":"","code_decimal":"🤶🏾","name":"mother christmas tone 4","shortname":":mrs_claus_tone4:","category":"people","emoji_order":"457","aliases":[":mother_christmas_tone4:"],"aliases_ascii":[],"keywords":[]},"mrs_claus_tone5":{"unicode":"1f936-1f3ff","unicode_alt":"","code_decimal":"🤶🏿","name":"mother christmas tone 5","shortname":":mrs_claus_tone5:","category":"people","emoji_order":"458","aliases":[":mother_christmas_tone5:"],"aliases_ascii":[],"keywords":[]},"princess":{"unicode":"1f478","unicode_alt":"","code_decimal":"👸","name":"princess","shortname":":princess:","category":"people","emoji_order":"459","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","beautiful","girls night"]},"princess_tone1":{"unicode":"1f478-1f3fb","unicode_alt":"","code_decimal":"👸🏻","name":"princess tone 1","shortname":":princess_tone1:","category":"people","emoji_order":"460","aliases":[],"aliases_ascii":[],"keywords":[]},"princess_tone2":{"unicode":"1f478-1f3fc","unicode_alt":"","code_decimal":"👸🏼","name":"princess tone 2","shortname":":princess_tone2:","category":"people","emoji_order":"461","aliases":[],"aliases_ascii":[],"keywords":[]},"princess_tone3":{"unicode":"1f478-1f3fd","unicode_alt":"","code_decimal":"👸🏽","name":"princess tone 3","shortname":":princess_tone3:","category":"people","emoji_order":"462","aliases":[],"aliases_ascii":[],"keywords":[]},"princess_tone4":{"unicode":"1f478-1f3fe","unicode_alt":"","code_decimal":"👸🏾","name":"princess tone 4","shortname":":princess_tone4:","category":"people","emoji_order":"463","aliases":[],"aliases_ascii":[],"keywords":[]},"princess_tone5":{"unicode":"1f478-1f3ff","unicode_alt":"","code_decimal":"👸🏿","name":"princess tone 5","shortname":":princess_tone5:","category":"people","emoji_order":"464","aliases":[],"aliases_ascii":[],"keywords":[]},"prince":{"unicode":"1f934","unicode_alt":"","code_decimal":"🤴","name":"prince","shortname":":prince:","category":"people","emoji_order":"465","aliases":[],"aliases_ascii":[],"keywords":[]},"prince_tone1":{"unicode":"1f934-1f3fb","unicode_alt":"","code_decimal":"🤴🏻","name":"prince tone 1","shortname":":prince_tone1:","category":"people","emoji_order":"466","aliases":[],"aliases_ascii":[],"keywords":[]},"prince_tone2":{"unicode":"1f934-1f3fc","unicode_alt":"","code_decimal":"🤴🏼","name":"prince tone 2","shortname":":prince_tone2:","category":"people","emoji_order":"467","aliases":[],"aliases_ascii":[],"keywords":[]},"prince_tone3":{"unicode":"1f934-1f3fd","unicode_alt":"","code_decimal":"🤴🏽","name":"prince tone 3","shortname":":prince_tone3:","category":"people","emoji_order":"468","aliases":[],"aliases_ascii":[],"keywords":[]},"prince_tone4":{"unicode":"1f934-1f3fe","unicode_alt":"","code_decimal":"🤴🏾","name":"prince tone 4","shortname":":prince_tone4:","category":"people","emoji_order":"469","aliases":[],"aliases_ascii":[],"keywords":[]},"prince_tone5":{"unicode":"1f934-1f3ff","unicode_alt":"","code_decimal":"🤴🏿","name":"prince tone 5","shortname":":prince_tone5:","category":"people","emoji_order":"470","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil":{"unicode":"1f470","unicode_alt":"","code_decimal":"👰","name":"bride with veil","shortname":":bride_with_veil:","category":"people","emoji_order":"471","aliases":[],"aliases_ascii":[],"keywords":["people","wedding","women","diversity"]},"bride_with_veil_tone1":{"unicode":"1f470-1f3fb","unicode_alt":"","code_decimal":"👰🏻","name":"bride with veil tone 1","shortname":":bride_with_veil_tone1:","category":"people","emoji_order":"472","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil_tone2":{"unicode":"1f470-1f3fc","unicode_alt":"","code_decimal":"👰🏼","name":"bride with veil tone 2","shortname":":bride_with_veil_tone2:","category":"people","emoji_order":"473","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil_tone3":{"unicode":"1f470-1f3fd","unicode_alt":"","code_decimal":"👰🏽","name":"bride with veil tone 3","shortname":":bride_with_veil_tone3:","category":"people","emoji_order":"474","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil_tone4":{"unicode":"1f470-1f3fe","unicode_alt":"","code_decimal":"👰🏾","name":"bride with veil tone 4","shortname":":bride_with_veil_tone4:","category":"people","emoji_order":"475","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil_tone5":{"unicode":"1f470-1f3ff","unicode_alt":"","code_decimal":"👰🏿","name":"bride with veil tone 5","shortname":":bride_with_veil_tone5:","category":"people","emoji_order":"476","aliases":[],"aliases_ascii":[],"keywords":[]},"man_in_tuxedo":{"unicode":"1f935","unicode_alt":"","code_decimal":"🤵","name":"man in tuxedo","shortname":":man_in_tuxedo:","category":"people","emoji_order":"477","aliases":[],"aliases_ascii":[],"keywords":[]},"man_in_tuxedo_tone1":{"unicode":"1f935-1f3fb","unicode_alt":"","code_decimal":"🤵🏻","name":"man in tuxedo tone 1","shortname":":man_in_tuxedo_tone1:","category":"people","emoji_order":"478","aliases":[":tuxedo_tone1:"],"aliases_ascii":[],"keywords":[]},"man_in_tuxedo_tone2":{"unicode":"1f935-1f3fc","unicode_alt":"","code_decimal":"🤵🏼","name":"man in tuxedo tone 2","shortname":":man_in_tuxedo_tone2:","category":"people","emoji_order":"479","aliases":[":tuxedo_tone2:"],"aliases_ascii":[],"keywords":[]},"man_in_tuxedo_tone3":{"unicode":"1f935-1f3fd","unicode_alt":"","code_decimal":"🤵🏽","name":"man in tuxedo tone 3","shortname":":man_in_tuxedo_tone3:","category":"people","emoji_order":"480","aliases":[":tuxedo_tone3:"],"aliases_ascii":[],"keywords":[]},"man_in_tuxedo_tone4":{"unicode":"1f935-1f3fe","unicode_alt":"","code_decimal":"🤵🏾","name":"man in tuxedo tone 4","shortname":":man_in_tuxedo_tone4:","category":"people","emoji_order":"481","aliases":[":tuxedo_tone4:"],"aliases_ascii":[],"keywords":[]},"man_in_tuxedo_tone5":{"unicode":"1f935-1f3ff","unicode_alt":"","code_decimal":"🤵🏿","name":"man in tuxedo tone 5","shortname":":man_in_tuxedo_tone5:","category":"people","emoji_order":"482","aliases":[":tuxedo_tone5:"],"aliases_ascii":[],"keywords":[]},"pregnant_woman":{"unicode":"1f930","unicode_alt":"","code_decimal":"🤰","name":"pregnant woman","shortname":":pregnant_woman:","category":"people","emoji_order":"483","aliases":[":expecting_woman:"],"aliases_ascii":[],"keywords":[]},"pregnant_woman_tone1":{"unicode":"1f930-1f3fb","unicode_alt":"","code_decimal":"🤰🏻","name":"pregnant woman tone 1","shortname":":pregnant_woman_tone1:","category":"people","emoji_order":"484","aliases":[":expecting_woman_tone1:"],"aliases_ascii":[],"keywords":[]},"pregnant_woman_tone2":{"unicode":"1f930-1f3fc","unicode_alt":"","code_decimal":"🤰🏼","name":"pregnant woman tone 2","shortname":":pregnant_woman_tone2:","category":"people","emoji_order":"485","aliases":[":expecting_woman_tone2:"],"aliases_ascii":[],"keywords":[]},"pregnant_woman_tone3":{"unicode":"1f930-1f3fd","unicode_alt":"","code_decimal":"🤰🏽","name":"pregnant woman tone 3","shortname":":pregnant_woman_tone3:","category":"people","emoji_order":"486","aliases":[":expecting_woman_tone3:"],"aliases_ascii":[],"keywords":[]},"pregnant_woman_tone4":{"unicode":"1f930-1f3fe","unicode_alt":"","code_decimal":"🤰🏾","name":"pregnant woman tone 4","shortname":":pregnant_woman_tone4:","category":"people","emoji_order":"487","aliases":[":expecting_woman_tone4:"],"aliases_ascii":[],"keywords":[]},"pregnant_woman_tone5":{"unicode":"1f930-1f3ff","unicode_alt":"","code_decimal":"🤰🏿","name":"pregnant woman tone 5","shortname":":pregnant_woman_tone5:","category":"people","emoji_order":"488","aliases":[":expecting_woman_tone5:"],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao":{"unicode":"1f472","unicode_alt":"","code_decimal":"👲","name":"man with gua pi mao","shortname":":man_with_gua_pi_mao:","category":"people","emoji_order":"489","aliases":[],"aliases_ascii":[],"keywords":["people","hat","men","diversity"]},"man_with_gua_pi_mao_tone1":{"unicode":"1f472-1f3fb","unicode_alt":"","code_decimal":"👲🏻","name":"man with gua pi mao tone 1","shortname":":man_with_gua_pi_mao_tone1:","category":"people","emoji_order":"490","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao_tone2":{"unicode":"1f472-1f3fc","unicode_alt":"","code_decimal":"👲🏼","name":"man with gua pi mao tone 2","shortname":":man_with_gua_pi_mao_tone2:","category":"people","emoji_order":"491","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao_tone3":{"unicode":"1f472-1f3fd","unicode_alt":"","code_decimal":"👲🏽","name":"man with gua pi mao tone 3","shortname":":man_with_gua_pi_mao_tone3:","category":"people","emoji_order":"492","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao_tone4":{"unicode":"1f472-1f3fe","unicode_alt":"","code_decimal":"👲🏾","name":"man with gua pi mao tone 4","shortname":":man_with_gua_pi_mao_tone4:","category":"people","emoji_order":"493","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao_tone5":{"unicode":"1f472-1f3ff","unicode_alt":"","code_decimal":"👲🏿","name":"man with gua pi mao tone 5","shortname":":man_with_gua_pi_mao_tone5:","category":"people","emoji_order":"494","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning":{"unicode":"1f64d","unicode_alt":"","code_decimal":"🙍","name":"person frowning","shortname":":person_frowning:","category":"people","emoji_order":"495","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity"]},"person_frowning_tone1":{"unicode":"1f64d-1f3fb","unicode_alt":"","code_decimal":"🙍🏻","name":"person frowning tone 1","shortname":":person_frowning_tone1:","category":"people","emoji_order":"496","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning_tone2":{"unicode":"1f64d-1f3fc","unicode_alt":"","code_decimal":"🙍🏼","name":"person frowning tone 2","shortname":":person_frowning_tone2:","category":"people","emoji_order":"497","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning_tone3":{"unicode":"1f64d-1f3fd","unicode_alt":"","code_decimal":"🙍🏽","name":"person frowning tone 3","shortname":":person_frowning_tone3:","category":"people","emoji_order":"498","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning_tone4":{"unicode":"1f64d-1f3fe","unicode_alt":"","code_decimal":"🙍🏾","name":"person frowning tone 4","shortname":":person_frowning_tone4:","category":"people","emoji_order":"499","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning_tone5":{"unicode":"1f64d-1f3ff","unicode_alt":"","code_decimal":"🙍🏿","name":"person frowning tone 5","shortname":":person_frowning_tone5:","category":"people","emoji_order":"500","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face":{"unicode":"1f64e","unicode_alt":"","code_decimal":"🙎","name":"person with pouting face","shortname":":person_with_pouting_face:","category":"people","emoji_order":"513","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity"]},"person_with_pouting_face_tone1":{"unicode":"1f64e-1f3fb","unicode_alt":"","code_decimal":"🙎🏻","name":"person with pouting face tone1","shortname":":person_with_pouting_face_tone1:","category":"people","emoji_order":"514","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face_tone2":{"unicode":"1f64e-1f3fc","unicode_alt":"","code_decimal":"🙎🏼","name":"person with pouting face tone2","shortname":":person_with_pouting_face_tone2:","category":"people","emoji_order":"515","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face_tone3":{"unicode":"1f64e-1f3fd","unicode_alt":"","code_decimal":"🙎🏽","name":"person with pouting face tone3","shortname":":person_with_pouting_face_tone3:","category":"people","emoji_order":"516","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face_tone4":{"unicode":"1f64e-1f3fe","unicode_alt":"","code_decimal":"🙎🏾","name":"person with pouting face tone4","shortname":":person_with_pouting_face_tone4:","category":"people","emoji_order":"517","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face_tone5":{"unicode":"1f64e-1f3ff","unicode_alt":"","code_decimal":"🙎🏿","name":"person with pouting face tone5","shortname":":person_with_pouting_face_tone5:","category":"people","emoji_order":"518","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good":{"unicode":"1f645","unicode_alt":"","code_decimal":"🙅","name":"face with no good gesture","shortname":":no_good:","category":"people","emoji_order":"531","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","girls night"]},"no_good_tone1":{"unicode":"1f645-1f3fb","unicode_alt":"","code_decimal":"🙅🏻","name":"face with no good gesture tone 1","shortname":":no_good_tone1:","category":"people","emoji_order":"532","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good_tone2":{"unicode":"1f645-1f3fc","unicode_alt":"","code_decimal":"🙅🏼","name":"face with no good gesture tone 2","shortname":":no_good_tone2:","category":"people","emoji_order":"533","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good_tone3":{"unicode":"1f645-1f3fd","unicode_alt":"","code_decimal":"🙅🏽","name":"face with no good gesture tone 3","shortname":":no_good_tone3:","category":"people","emoji_order":"534","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good_tone4":{"unicode":"1f645-1f3fe","unicode_alt":"","code_decimal":"🙅🏾","name":"face with no good gesture tone 4","shortname":":no_good_tone4:","category":"people","emoji_order":"535","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good_tone5":{"unicode":"1f645-1f3ff","unicode_alt":"","code_decimal":"🙅🏿","name":"face with no good gesture tone 5","shortname":":no_good_tone5:","category":"people","emoji_order":"536","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman":{"unicode":"1f646","unicode_alt":"","code_decimal":"🙆","name":"face with ok gesture","shortname":":ok_woman:","category":"people","emoji_order":"549","aliases":[],"aliases_ascii":["*\\0\/*","\\0\/","*\\O\/*","\\O\/"],"keywords":["people","women","diversity"]},"ok_woman_tone1":{"unicode":"1f646-1f3fb","unicode_alt":"","code_decimal":"🙆🏻","name":"face with ok gesture tone1","shortname":":ok_woman_tone1:","category":"people","emoji_order":"550","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman_tone2":{"unicode":"1f646-1f3fc","unicode_alt":"","code_decimal":"🙆🏼","name":"face with ok gesture tone2","shortname":":ok_woman_tone2:","category":"people","emoji_order":"551","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman_tone3":{"unicode":"1f646-1f3fd","unicode_alt":"","code_decimal":"🙆🏽","name":"face with ok gesture tone3","shortname":":ok_woman_tone3:","category":"people","emoji_order":"552","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman_tone4":{"unicode":"1f646-1f3fe","unicode_alt":"","code_decimal":"🙆🏾","name":"face with ok gesture tone4","shortname":":ok_woman_tone4:","category":"people","emoji_order":"553","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman_tone5":{"unicode":"1f646-1f3ff","unicode_alt":"","code_decimal":"🙆🏿","name":"face with ok gesture tone5","shortname":":ok_woman_tone5:","category":"people","emoji_order":"554","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person":{"unicode":"1f481","unicode_alt":"","code_decimal":"💁","name":"information desk person","shortname":":information_desk_person:","category":"people","emoji_order":"567","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity"]},"information_desk_person_tone1":{"unicode":"1f481-1f3fb","unicode_alt":"","code_decimal":"💁🏻","name":"information desk person tone 1","shortname":":information_desk_person_tone1:","category":"people","emoji_order":"568","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person_tone2":{"unicode":"1f481-1f3fc","unicode_alt":"","code_decimal":"💁🏼","name":"information desk person tone 2","shortname":":information_desk_person_tone2:","category":"people","emoji_order":"569","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person_tone3":{"unicode":"1f481-1f3fd","unicode_alt":"","code_decimal":"💁🏽","name":"information desk person tone 3","shortname":":information_desk_person_tone3:","category":"people","emoji_order":"570","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person_tone4":{"unicode":"1f481-1f3fe","unicode_alt":"","code_decimal":"💁🏾","name":"information desk person tone 4","shortname":":information_desk_person_tone4:","category":"people","emoji_order":"571","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person_tone5":{"unicode":"1f481-1f3ff","unicode_alt":"","code_decimal":"💁🏿","name":"information desk person tone 5","shortname":":information_desk_person_tone5:","category":"people","emoji_order":"572","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand":{"unicode":"1f64b","unicode_alt":"","code_decimal":"🙋","name":"happy person raising one hand","shortname":":raising_hand:","category":"people","emoji_order":"585","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity"]},"raising_hand_tone1":{"unicode":"1f64b-1f3fb","unicode_alt":"","code_decimal":"🙋🏻","name":"happy person raising one hand tone1","shortname":":raising_hand_tone1:","category":"people","emoji_order":"586","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand_tone2":{"unicode":"1f64b-1f3fc","unicode_alt":"","code_decimal":"🙋🏼","name":"happy person raising one hand tone2","shortname":":raising_hand_tone2:","category":"people","emoji_order":"587","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand_tone3":{"unicode":"1f64b-1f3fd","unicode_alt":"","code_decimal":"🙋🏽","name":"happy person raising one hand tone3","shortname":":raising_hand_tone3:","category":"people","emoji_order":"588","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand_tone4":{"unicode":"1f64b-1f3fe","unicode_alt":"","code_decimal":"🙋🏾","name":"happy person raising one hand tone4","shortname":":raising_hand_tone4:","category":"people","emoji_order":"589","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand_tone5":{"unicode":"1f64b-1f3ff","unicode_alt":"","code_decimal":"🙋🏿","name":"happy person raising one hand tone5","shortname":":raising_hand_tone5:","category":"people","emoji_order":"590","aliases":[],"aliases_ascii":[],"keywords":[]},"bow":{"unicode":"1f647","unicode_alt":"","code_decimal":"🙇","name":"person bowing deeply","shortname":":bow:","category":"people","emoji_order":"603","aliases":[],"aliases_ascii":[],"keywords":["people","pray","diversity"]},"bow_tone1":{"unicode":"1f647-1f3fb","unicode_alt":"","code_decimal":"🙇🏻","name":"person bowing deeply tone 1","shortname":":bow_tone1:","category":"people","emoji_order":"604","aliases":[],"aliases_ascii":[],"keywords":[]},"bow_tone2":{"unicode":"1f647-1f3fc","unicode_alt":"","code_decimal":"🙇🏼","name":"person bowing deeply tone 2","shortname":":bow_tone2:","category":"people","emoji_order":"605","aliases":[],"aliases_ascii":[],"keywords":[]},"bow_tone3":{"unicode":"1f647-1f3fd","unicode_alt":"","code_decimal":"🙇🏽","name":"person bowing deeply tone 3","shortname":":bow_tone3:","category":"people","emoji_order":"606","aliases":[],"aliases_ascii":[],"keywords":[]},"bow_tone4":{"unicode":"1f647-1f3fe","unicode_alt":"","code_decimal":"🙇🏾","name":"person bowing deeply tone 4","shortname":":bow_tone4:","category":"people","emoji_order":"607","aliases":[],"aliases_ascii":[],"keywords":[]},"bow_tone5":{"unicode":"1f647-1f3ff","unicode_alt":"","code_decimal":"🙇🏿","name":"person bowing deeply tone 5","shortname":":bow_tone5:","category":"people","emoji_order":"608","aliases":[],"aliases_ascii":[],"keywords":[]},"face_palm":{"unicode":"1f926","unicode_alt":"","code_decimal":"🤦","name":"face palm","shortname":":face_palm:","category":"people","emoji_order":"621","aliases":[":facepalm:"],"aliases_ascii":[],"keywords":[]},"face_palm_tone1":{"unicode":"1f926-1f3fb","unicode_alt":"","code_decimal":"🤦🏻","name":"face palm tone 1","shortname":":face_palm_tone1:","category":"people","emoji_order":"622","aliases":[":facepalm_tone1:"],"aliases_ascii":[],"keywords":[]},"face_palm_tone2":{"unicode":"1f926-1f3fc","unicode_alt":"","code_decimal":"🤦🏼","name":"face palm tone 2","shortname":":face_palm_tone2:","category":"people","emoji_order":"623","aliases":[":facepalm_tone2:"],"aliases_ascii":[],"keywords":[]},"face_palm_tone3":{"unicode":"1f926-1f3fd","unicode_alt":"","code_decimal":"🤦🏽","name":"face palm tone 3","shortname":":face_palm_tone3:","category":"people","emoji_order":"624","aliases":[":facepalm_tone3:"],"aliases_ascii":[],"keywords":[]},"face_palm_tone4":{"unicode":"1f926-1f3fe","unicode_alt":"","code_decimal":"🤦🏾","name":"face palm tone 4","shortname":":face_palm_tone4:","category":"people","emoji_order":"625","aliases":[":facepalm_tone4:"],"aliases_ascii":[],"keywords":[]},"face_palm_tone5":{"unicode":"1f926-1f3ff","unicode_alt":"","code_decimal":"🤦🏿","name":"face palm tone 5","shortname":":face_palm_tone5:","category":"people","emoji_order":"626","aliases":[":facepalm_tone5:"],"aliases_ascii":[],"keywords":[]},"shrug":{"unicode":"1f937","unicode_alt":"","code_decimal":"🤷","name":"shrug","shortname":":shrug:","category":"people","emoji_order":"639","aliases":[],"aliases_ascii":[],"keywords":[]},"shrug_tone1":{"unicode":"1f937-1f3fb","unicode_alt":"","code_decimal":"🤷🏻","name":"shrug tone 1","shortname":":shrug_tone1:","category":"people","emoji_order":"640","aliases":[],"aliases_ascii":[],"keywords":[]},"shrug_tone2":{"unicode":"1f937-1f3fc","unicode_alt":"","code_decimal":"🤷🏼","name":"shrug tone 2","shortname":":shrug_tone2:","category":"people","emoji_order":"641","aliases":[],"aliases_ascii":[],"keywords":[]},"shrug_tone3":{"unicode":"1f937-1f3fd","unicode_alt":"","code_decimal":"🤷🏽","name":"shrug tone 3","shortname":":shrug_tone3:","category":"people","emoji_order":"642","aliases":[],"aliases_ascii":[],"keywords":[]},"shrug_tone4":{"unicode":"1f937-1f3fe","unicode_alt":"","code_decimal":"🤷🏾","name":"shrug tone 4","shortname":":shrug_tone4:","category":"people","emoji_order":"643","aliases":[],"aliases_ascii":[],"keywords":[]},"shrug_tone5":{"unicode":"1f937-1f3ff","unicode_alt":"","code_decimal":"🤷🏿","name":"shrug tone 5","shortname":":shrug_tone5:","category":"people","emoji_order":"644","aliases":[],"aliases_ascii":[],"keywords":[]},"massage":{"unicode":"1f486","unicode_alt":"","code_decimal":"💆","name":"face massage","shortname":":massage:","category":"people","emoji_order":"657","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity"]},"massage_tone1":{"unicode":"1f486-1f3fb","unicode_alt":"","code_decimal":"💆🏻","name":"face massage tone 1","shortname":":massage_tone1:","category":"people","emoji_order":"658","aliases":[],"aliases_ascii":[],"keywords":[]},"massage_tone2":{"unicode":"1f486-1f3fc","unicode_alt":"","code_decimal":"💆🏼","name":"face massage tone 2","shortname":":massage_tone2:","category":"people","emoji_order":"659","aliases":[],"aliases_ascii":[],"keywords":[]},"massage_tone3":{"unicode":"1f486-1f3fd","unicode_alt":"","code_decimal":"💆🏽","name":"face massage tone 3","shortname":":massage_tone3:","category":"people","emoji_order":"660","aliases":[],"aliases_ascii":[],"keywords":[]},"massage_tone4":{"unicode":"1f486-1f3fe","unicode_alt":"","code_decimal":"💆🏾","name":"face massage tone 4","shortname":":massage_tone4:","category":"people","emoji_order":"661","aliases":[],"aliases_ascii":[],"keywords":[]},"massage_tone5":{"unicode":"1f486-1f3ff","unicode_alt":"","code_decimal":"💆🏿","name":"face massage tone 5","shortname":":massage_tone5:","category":"people","emoji_order":"662","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut":{"unicode":"1f487","unicode_alt":"","code_decimal":"💇","name":"haircut","shortname":":haircut:","category":"people","emoji_order":"675","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity"]},"haircut_tone1":{"unicode":"1f487-1f3fb","unicode_alt":"","code_decimal":"💇🏻","name":"haircut tone 1","shortname":":haircut_tone1:","category":"people","emoji_order":"676","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut_tone2":{"unicode":"1f487-1f3fc","unicode_alt":"","code_decimal":"💇🏼","name":"haircut tone 2","shortname":":haircut_tone2:","category":"people","emoji_order":"677","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut_tone3":{"unicode":"1f487-1f3fd","unicode_alt":"","code_decimal":"💇🏽","name":"haircut tone 3","shortname":":haircut_tone3:","category":"people","emoji_order":"678","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut_tone4":{"unicode":"1f487-1f3fe","unicode_alt":"","code_decimal":"💇🏾","name":"haircut tone 4","shortname":":haircut_tone4:","category":"people","emoji_order":"679","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut_tone5":{"unicode":"1f487-1f3ff","unicode_alt":"","code_decimal":"💇🏿","name":"haircut tone 5","shortname":":haircut_tone5:","category":"people","emoji_order":"680","aliases":[],"aliases_ascii":[],"keywords":[]},"walking":{"unicode":"1f6b6","unicode_alt":"","code_decimal":"🚶","name":"pedestrian","shortname":":walking:","category":"people","emoji_order":"693","aliases":[],"aliases_ascii":[],"keywords":["people","men","diversity"]},"walking_tone1":{"unicode":"1f6b6-1f3fb","unicode_alt":"","code_decimal":"🚶🏻","name":"pedestrian tone 1","shortname":":walking_tone1:","category":"people","emoji_order":"694","aliases":[],"aliases_ascii":[],"keywords":[]},"walking_tone2":{"unicode":"1f6b6-1f3fc","unicode_alt":"","code_decimal":"🚶🏼","name":"pedestrian tone 2","shortname":":walking_tone2:","category":"people","emoji_order":"695","aliases":[],"aliases_ascii":[],"keywords":[]},"walking_tone3":{"unicode":"1f6b6-1f3fd","unicode_alt":"","code_decimal":"🚶🏽","name":"pedestrian tone 3","shortname":":walking_tone3:","category":"people","emoji_order":"696","aliases":[],"aliases_ascii":[],"keywords":[]},"walking_tone4":{"unicode":"1f6b6-1f3fe","unicode_alt":"","code_decimal":"🚶🏾","name":"pedestrian tone 4","shortname":":walking_tone4:","category":"people","emoji_order":"697","aliases":[],"aliases_ascii":[],"keywords":[]},"walking_tone5":{"unicode":"1f6b6-1f3ff","unicode_alt":"","code_decimal":"🚶🏿","name":"pedestrian tone 5","shortname":":walking_tone5:","category":"people","emoji_order":"698","aliases":[],"aliases_ascii":[],"keywords":[]},"runner":{"unicode":"1f3c3","unicode_alt":"","code_decimal":"🏃","name":"runner","shortname":":runner:","category":"people","emoji_order":"711","aliases":[],"aliases_ascii":[],"keywords":["people","men","diversity","boys night","run"]},"runner_tone1":{"unicode":"1f3c3-1f3fb","unicode_alt":"","code_decimal":"🏃🏻","name":"runner tone 1","shortname":":runner_tone1:","category":"people","emoji_order":"712","aliases":[],"aliases_ascii":[],"keywords":[]},"runner_tone2":{"unicode":"1f3c3-1f3fc","unicode_alt":"","code_decimal":"🏃🏼","name":"runner tone 2","shortname":":runner_tone2:","category":"people","emoji_order":"713","aliases":[],"aliases_ascii":[],"keywords":[]},"runner_tone3":{"unicode":"1f3c3-1f3fd","unicode_alt":"","code_decimal":"🏃🏽","name":"runner tone 3","shortname":":runner_tone3:","category":"people","emoji_order":"714","aliases":[],"aliases_ascii":[],"keywords":[]},"runner_tone4":{"unicode":"1f3c3-1f3fe","unicode_alt":"","code_decimal":"🏃🏾","name":"runner tone 4","shortname":":runner_tone4:","category":"people","emoji_order":"715","aliases":[],"aliases_ascii":[],"keywords":[]},"runner_tone5":{"unicode":"1f3c3-1f3ff","unicode_alt":"","code_decimal":"🏃🏿","name":"runner tone 5","shortname":":runner_tone5:","category":"people","emoji_order":"716","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer":{"unicode":"1f483","unicode_alt":"","code_decimal":"💃","name":"dancer","shortname":":dancer:","category":"people","emoji_order":"729","aliases":[],"aliases_ascii":[],"keywords":["people","women","sexy","diversity","girls night","dance"]},"dancer_tone1":{"unicode":"1f483-1f3fb","unicode_alt":"","code_decimal":"💃🏻","name":"dancer tone 1","shortname":":dancer_tone1:","category":"people","emoji_order":"730","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer_tone2":{"unicode":"1f483-1f3fc","unicode_alt":"","code_decimal":"💃🏼","name":"dancer tone 2","shortname":":dancer_tone2:","category":"people","emoji_order":"731","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer_tone3":{"unicode":"1f483-1f3fd","unicode_alt":"","code_decimal":"💃🏽","name":"dancer tone 3","shortname":":dancer_tone3:","category":"people","emoji_order":"732","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer_tone4":{"unicode":"1f483-1f3fe","unicode_alt":"","code_decimal":"💃🏾","name":"dancer tone 4","shortname":":dancer_tone4:","category":"people","emoji_order":"733","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer_tone5":{"unicode":"1f483-1f3ff","unicode_alt":"","code_decimal":"💃🏿","name":"dancer tone 5","shortname":":dancer_tone5:","category":"people","emoji_order":"734","aliases":[],"aliases_ascii":[],"keywords":[]},"man_dancing":{"unicode":"1f57a","unicode_alt":"","code_decimal":"🕺","name":"man dancing","shortname":":man_dancing:","category":"people","emoji_order":"735","aliases":[":male_dancer:"],"aliases_ascii":[],"keywords":[]},"man_dancing_tone1":{"unicode":"1f57a-1f3fb","unicode_alt":"","code_decimal":"🕺🏻","name":"man dancing tone 1","shortname":":man_dancing_tone1:","category":"people","emoji_order":"736","aliases":[":male_dancer_tone1:"],"aliases_ascii":[],"keywords":[]},"man_dancing_tone2":{"unicode":"1f57a-1f3fc","unicode_alt":"","code_decimal":"🕺🏼","name":"man dancing tone 2","shortname":":man_dancing_tone2:","category":"people","emoji_order":"737","aliases":[":male_dancer_tone2:"],"aliases_ascii":[],"keywords":[]},"man_dancing_tone3":{"unicode":"1f57a-1f3fd","unicode_alt":"","code_decimal":"🕺🏽","name":"man dancing tone 3","shortname":":man_dancing_tone3:","category":"people","emoji_order":"738","aliases":[":male_dancer_tone3:"],"aliases_ascii":[],"keywords":[]},"man_dancing_tone4":{"unicode":"1f57a-1f3fe","unicode_alt":"","code_decimal":"🕺🏾","name":"man dancing tone 4","shortname":":man_dancing_tone4:","category":"people","emoji_order":"739","aliases":[":male_dancer_tone4:"],"aliases_ascii":[],"keywords":[]},"man_dancing_tone5":{"unicode":"1f57a-1f3ff","unicode_alt":"","code_decimal":"🕺🏿","name":"man dancing tone 5","shortname":":man_dancing_tone5:","category":"people","emoji_order":"740","aliases":[":male_dancer_tone5:"],"aliases_ascii":[],"keywords":[]},"dancers":{"unicode":"1f46f","unicode_alt":"","code_decimal":"👯","name":"woman with bunny ears","shortname":":dancers:","category":"people","emoji_order":"741","aliases":[],"aliases_ascii":[],"keywords":["people","women","sexy","girls night","boys night","parties","dance"]},"levitate":{"unicode":"1f574","unicode_alt":"1f574-fe0f","code_decimal":"🕴","name":"man in business suit levitating","shortname":":levitate:","category":"activity","emoji_order":"759","aliases":[":man_in_business_suit_levitating:"],"aliases_ascii":[],"keywords":["men","job"]},"speaking_head":{"unicode":"1f5e3","unicode_alt":"1f5e3-fe0f","code_decimal":"🗣","name":"speaking head in silhouette","shortname":":speaking_head:","category":"people","emoji_order":"765","aliases":[":speaking_head_in_silhouette:"],"aliases_ascii":[],"keywords":["people","talk"]},"bust_in_silhouette":{"unicode":"1f464","unicode_alt":"","code_decimal":"👤","name":"bust in silhouette","shortname":":bust_in_silhouette:","category":"people","emoji_order":"766","aliases":[],"aliases_ascii":[],"keywords":["people"]},"busts_in_silhouette":{"unicode":"1f465","unicode_alt":"","code_decimal":"👥","name":"busts in silhouette","shortname":":busts_in_silhouette:","category":"people","emoji_order":"767","aliases":[],"aliases_ascii":[],"keywords":["people"]},"fencer":{"unicode":"1f93a","unicode_alt":"","code_decimal":"🤺","name":"fencer","shortname":":fencer:","category":"activity","emoji_order":"768","aliases":[":fencing:"],"aliases_ascii":[],"keywords":[]},"horse_racing":{"unicode":"1f3c7","unicode_alt":"","code_decimal":"🏇","name":"horse racing","shortname":":horse_racing:","category":"activity","emoji_order":"769","aliases":[],"aliases_ascii":[],"keywords":["men","sport","horse racing"]},"horse_racing_tone1":{"unicode":"1f3c7-1f3fb","unicode_alt":"","code_decimal":"🏇🏻","name":"horse racing tone 1","shortname":":horse_racing_tone1:","category":"activity","emoji_order":"770","aliases":[],"aliases_ascii":[],"keywords":[]},"horse_racing_tone2":{"unicode":"1f3c7-1f3fc","unicode_alt":"","code_decimal":"🏇🏼","name":"horse racing tone 2","shortname":":horse_racing_tone2:","category":"activity","emoji_order":"771","aliases":[],"aliases_ascii":[],"keywords":[]},"horse_racing_tone3":{"unicode":"1f3c7-1f3fd","unicode_alt":"","code_decimal":"🏇🏽","name":"horse racing tone 3","shortname":":horse_racing_tone3:","category":"activity","emoji_order":"772","aliases":[],"aliases_ascii":[],"keywords":[]},"horse_racing_tone4":{"unicode":"1f3c7-1f3fe","unicode_alt":"","code_decimal":"🏇🏾","name":"horse racing tone 4","shortname":":horse_racing_tone4:","category":"activity","emoji_order":"773","aliases":[],"aliases_ascii":[],"keywords":[]},"horse_racing_tone5":{"unicode":"1f3c7-1f3ff","unicode_alt":"","code_decimal":"🏇🏿","name":"horse racing tone 5","shortname":":horse_racing_tone5:","category":"activity","emoji_order":"774","aliases":[],"aliases_ascii":[],"keywords":[]},"skier":{"unicode":"26f7","unicode_alt":"26f7-fe0f","code_decimal":"⛷","name":"skier","shortname":":skier:","category":"activity","emoji_order":"775","aliases":[],"aliases_ascii":[],"keywords":["hat","vacation","cold","sport","skiing"]},"snowboarder":{"unicode":"1f3c2","unicode_alt":"","code_decimal":"🏂","name":"snowboarder","shortname":":snowboarder:","category":"activity","emoji_order":"776","aliases":[],"aliases_ascii":[],"keywords":["hat","vacation","cold","sport","snowboarding"]},"golfer":{"unicode":"1f3cc","unicode_alt":"1f3cc-fe0f","code_decimal":"🏌","name":"golfer","shortname":":golfer:","category":"activity","emoji_order":"782","aliases":[],"aliases_ascii":[],"keywords":["men","game","ball","vacation","sport","golf"]},"surfer":{"unicode":"1f3c4","unicode_alt":"","code_decimal":"🏄","name":"surfer","shortname":":surfer:","category":"activity","emoji_order":"800","aliases":[],"aliases_ascii":[],"keywords":["men","vacation","tropical","sport","diversity"]},"surfer_tone1":{"unicode":"1f3c4-1f3fb","unicode_alt":"","code_decimal":"🏄🏻","name":"surfer tone 1","shortname":":surfer_tone1:","category":"activity","emoji_order":"801","aliases":[],"aliases_ascii":[],"keywords":[]},"surfer_tone2":{"unicode":"1f3c4-1f3fc","unicode_alt":"","code_decimal":"🏄🏼","name":"surfer tone 2","shortname":":surfer_tone2:","category":"activity","emoji_order":"802","aliases":[],"aliases_ascii":[],"keywords":[]},"surfer_tone3":{"unicode":"1f3c4-1f3fd","unicode_alt":"","code_decimal":"🏄🏽","name":"surfer tone 3","shortname":":surfer_tone3:","category":"activity","emoji_order":"803","aliases":[],"aliases_ascii":[],"keywords":[]},"surfer_tone4":{"unicode":"1f3c4-1f3fe","unicode_alt":"","code_decimal":"🏄🏾","name":"surfer tone 4","shortname":":surfer_tone4:","category":"activity","emoji_order":"804","aliases":[],"aliases_ascii":[],"keywords":[]},"surfer_tone5":{"unicode":"1f3c4-1f3ff","unicode_alt":"","code_decimal":"🏄🏿","name":"surfer tone 5","shortname":":surfer_tone5:","category":"activity","emoji_order":"805","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat":{"unicode":"1f6a3","unicode_alt":"","code_decimal":"🚣","name":"rowboat","shortname":":rowboat:","category":"activity","emoji_order":"818","aliases":[],"aliases_ascii":[],"keywords":["men","workout","sport","rowing","diversity"]},"rowboat_tone1":{"unicode":"1f6a3-1f3fb","unicode_alt":"","code_decimal":"🚣🏻","name":"rowboat tone 1","shortname":":rowboat_tone1:","category":"activity","emoji_order":"819","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat_tone2":{"unicode":"1f6a3-1f3fc","unicode_alt":"","code_decimal":"🚣🏼","name":"rowboat tone 2","shortname":":rowboat_tone2:","category":"activity","emoji_order":"820","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat_tone3":{"unicode":"1f6a3-1f3fd","unicode_alt":"","code_decimal":"🚣🏽","name":"rowboat tone 3","shortname":":rowboat_tone3:","category":"activity","emoji_order":"821","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat_tone4":{"unicode":"1f6a3-1f3fe","unicode_alt":"","code_decimal":"🚣🏾","name":"rowboat tone 4","shortname":":rowboat_tone4:","category":"activity","emoji_order":"822","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat_tone5":{"unicode":"1f6a3-1f3ff","unicode_alt":"","code_decimal":"🚣🏿","name":"rowboat tone 5","shortname":":rowboat_tone5:","category":"activity","emoji_order":"823","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer":{"unicode":"1f3ca","unicode_alt":"","code_decimal":"🏊","name":"swimmer","shortname":":swimmer:","category":"activity","emoji_order":"836","aliases":[],"aliases_ascii":[],"keywords":["workout","sport","swim","diversity"]},"swimmer_tone1":{"unicode":"1f3ca-1f3fb","unicode_alt":"","code_decimal":"🏊🏻","name":"swimmer tone 1","shortname":":swimmer_tone1:","category":"activity","emoji_order":"837","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer_tone2":{"unicode":"1f3ca-1f3fc","unicode_alt":"","code_decimal":"🏊🏼","name":"swimmer tone 2","shortname":":swimmer_tone2:","category":"activity","emoji_order":"838","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer_tone3":{"unicode":"1f3ca-1f3fd","unicode_alt":"","code_decimal":"🏊🏽","name":"swimmer tone 3","shortname":":swimmer_tone3:","category":"activity","emoji_order":"839","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer_tone4":{"unicode":"1f3ca-1f3fe","unicode_alt":"","code_decimal":"🏊🏾","name":"swimmer tone 4","shortname":":swimmer_tone4:","category":"activity","emoji_order":"840","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer_tone5":{"unicode":"1f3ca-1f3ff","unicode_alt":"","code_decimal":"🏊🏿","name":"swimmer tone 5","shortname":":swimmer_tone5:","category":"activity","emoji_order":"841","aliases":[],"aliases_ascii":[],"keywords":[]},"basketball_player":{"unicode":"26f9","unicode_alt":"26f9-fe0f","code_decimal":"⛹","name":"person with ball","shortname":":basketball_player:","category":"activity","emoji_order":"854","aliases":[":person_with_ball:"],"aliases_ascii":[],"keywords":["men","game","ball","sport","basketball","diversity"]},"basketball_player_tone1":{"unicode":"26f9-1f3fb","unicode_alt":"","code_decimal":"⛹🏻","name":"person with ball tone 1","shortname":":basketball_player_tone1:","category":"activity","emoji_order":"855","aliases":[":person_with_ball_tone1:"],"aliases_ascii":[],"keywords":[]},"basketball_player_tone2":{"unicode":"26f9-1f3fc","unicode_alt":"","code_decimal":"⛹🏼","name":"person with ball tone 2","shortname":":basketball_player_tone2:","category":"activity","emoji_order":"856","aliases":[":person_with_ball_tone2:"],"aliases_ascii":[],"keywords":[]},"basketball_player_tone3":{"unicode":"26f9-1f3fd","unicode_alt":"","code_decimal":"⛹🏽","name":"person with ball tone 3","shortname":":basketball_player_tone3:","category":"activity","emoji_order":"857","aliases":[":person_with_ball_tone3:"],"aliases_ascii":[],"keywords":[]},"basketball_player_tone4":{"unicode":"26f9-1f3fe","unicode_alt":"","code_decimal":"⛹🏾","name":"person with ball tone 4","shortname":":basketball_player_tone4:","category":"activity","emoji_order":"858","aliases":[":person_with_ball_tone4:"],"aliases_ascii":[],"keywords":[]},"basketball_player_tone5":{"unicode":"26f9-1f3ff","unicode_alt":"","code_decimal":"⛹🏿","name":"person with ball tone 5","shortname":":basketball_player_tone5:","category":"activity","emoji_order":"859","aliases":[":person_with_ball_tone5:"],"aliases_ascii":[],"keywords":[]},"lifter":{"unicode":"1f3cb","unicode_alt":"1f3cb-fe0f","code_decimal":"🏋","name":"weight lifter","shortname":":lifter:","category":"activity","emoji_order":"872","aliases":[":weight_lifter:"],"aliases_ascii":[],"keywords":["men","workout","flex","sport","weight lifting","win","diversity"]},"lifter_tone1":{"unicode":"1f3cb-1f3fb","unicode_alt":"","code_decimal":"🏋🏻","name":"weight lifter tone 1","shortname":":lifter_tone1:","category":"activity","emoji_order":"873","aliases":[":weight_lifter_tone1:"],"aliases_ascii":[],"keywords":[]},"lifter_tone2":{"unicode":"1f3cb-1f3fc","unicode_alt":"","code_decimal":"🏋🏼","name":"weight lifter tone 2","shortname":":lifter_tone2:","category":"activity","emoji_order":"874","aliases":[":weight_lifter_tone2:"],"aliases_ascii":[],"keywords":[]},"lifter_tone3":{"unicode":"1f3cb-1f3fd","unicode_alt":"","code_decimal":"🏋🏽","name":"weight lifter tone 3","shortname":":lifter_tone3:","category":"activity","emoji_order":"875","aliases":[":weight_lifter_tone3:"],"aliases_ascii":[],"keywords":[]},"lifter_tone4":{"unicode":"1f3cb-1f3fe","unicode_alt":"","code_decimal":"🏋🏾","name":"weight lifter tone 4","shortname":":lifter_tone4:","category":"activity","emoji_order":"876","aliases":[":weight_lifter_tone4:"],"aliases_ascii":[],"keywords":[]},"lifter_tone5":{"unicode":"1f3cb-1f3ff","unicode_alt":"","code_decimal":"🏋🏿","name":"weight lifter tone 5","shortname":":lifter_tone5:","category":"activity","emoji_order":"877","aliases":[":weight_lifter_tone5:"],"aliases_ascii":[],"keywords":[]},"bicyclist":{"unicode":"1f6b4","unicode_alt":"","code_decimal":"🚴","name":"bicyclist","shortname":":bicyclist:","category":"activity","emoji_order":"890","aliases":[],"aliases_ascii":[],"keywords":["men","workout","sport","bike","diversity"]},"bicyclist_tone1":{"unicode":"1f6b4-1f3fb","unicode_alt":"","code_decimal":"🚴🏻","name":"bicyclist tone 1","shortname":":bicyclist_tone1:","category":"activity","emoji_order":"891","aliases":[],"aliases_ascii":[],"keywords":[]},"bicyclist_tone2":{"unicode":"1f6b4-1f3fc","unicode_alt":"","code_decimal":"🚴🏼","name":"bicyclist tone 2","shortname":":bicyclist_tone2:","category":"activity","emoji_order":"892","aliases":[],"aliases_ascii":[],"keywords":[]},"bicyclist_tone3":{"unicode":"1f6b4-1f3fd","unicode_alt":"","code_decimal":"🚴🏽","name":"bicyclist tone 3","shortname":":bicyclist_tone3:","category":"activity","emoji_order":"893","aliases":[],"aliases_ascii":[],"keywords":[]},"bicyclist_tone4":{"unicode":"1f6b4-1f3fe","unicode_alt":"","code_decimal":"🚴🏾","name":"bicyclist tone 4","shortname":":bicyclist_tone4:","category":"activity","emoji_order":"894","aliases":[],"aliases_ascii":[],"keywords":[]},"bicyclist_tone5":{"unicode":"1f6b4-1f3ff","unicode_alt":"","code_decimal":"🚴🏿","name":"bicyclist tone 5","shortname":":bicyclist_tone5:","category":"activity","emoji_order":"895","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist":{"unicode":"1f6b5","unicode_alt":"","code_decimal":"🚵","name":"mountain bicyclist","shortname":":mountain_bicyclist:","category":"activity","emoji_order":"908","aliases":[],"aliases_ascii":[],"keywords":["men","sport","bike","diversity"]},"mountain_bicyclist_tone1":{"unicode":"1f6b5-1f3fb","unicode_alt":"","code_decimal":"🚵🏻","name":"mountain bicyclist tone 1","shortname":":mountain_bicyclist_tone1:","category":"activity","emoji_order":"909","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist_tone2":{"unicode":"1f6b5-1f3fc","unicode_alt":"","code_decimal":"🚵🏼","name":"mountain bicyclist tone 2","shortname":":mountain_bicyclist_tone2:","category":"activity","emoji_order":"910","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist_tone3":{"unicode":"1f6b5-1f3fd","unicode_alt":"","code_decimal":"🚵🏽","name":"mountain bicyclist tone 3","shortname":":mountain_bicyclist_tone3:","category":"activity","emoji_order":"911","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist_tone4":{"unicode":"1f6b5-1f3fe","unicode_alt":"","code_decimal":"🚵🏾","name":"mountain bicyclist tone 4","shortname":":mountain_bicyclist_tone4:","category":"activity","emoji_order":"912","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist_tone5":{"unicode":"1f6b5-1f3ff","unicode_alt":"","code_decimal":"🚵🏿","name":"mountain bicyclist tone 5","shortname":":mountain_bicyclist_tone5:","category":"activity","emoji_order":"913","aliases":[],"aliases_ascii":[],"keywords":[]},"race_car":{"unicode":"1f3ce","unicode_alt":"1f3ce-fe0f","code_decimal":"🏎","name":"racing car","shortname":":race_car:","category":"travel","emoji_order":"926","aliases":[":racing_car:"],"aliases_ascii":[],"keywords":["transportation","car"]},"motorcycle":{"unicode":"1f3cd","unicode_alt":"1f3cd-fe0f","code_decimal":"🏍","name":"racing motorcycle","shortname":":motorcycle:","category":"travel","emoji_order":"927","aliases":[":racing_motorcycle:"],"aliases_ascii":[],"keywords":["transportation","travel","bike"]},"cartwheel":{"unicode":"1f938","unicode_alt":"","code_decimal":"🤸","name":"person doing cartwheel","shortname":":cartwheel:","category":"activity","emoji_order":"928","aliases":[":person_doing_cartwheel:"],"aliases_ascii":[],"keywords":[]},"cartwheel_tone1":{"unicode":"1f938-1f3fb","unicode_alt":"","code_decimal":"🤸🏻","name":"person doing cartwheel tone 1","shortname":":cartwheel_tone1:","category":"activity","emoji_order":"929","aliases":[":person_doing_cartwheel_tone1:"],"aliases_ascii":[],"keywords":[]},"cartwheel_tone2":{"unicode":"1f938-1f3fc","unicode_alt":"","code_decimal":"🤸🏼","name":"person doing cartwheel tone 2","shortname":":cartwheel_tone2:","category":"activity","emoji_order":"930","aliases":[":person_doing_cartwheel_tone2:"],"aliases_ascii":[],"keywords":[]},"cartwheel_tone3":{"unicode":"1f938-1f3fd","unicode_alt":"","code_decimal":"🤸🏽","name":"person doing cartwheel tone 3","shortname":":cartwheel_tone3:","category":"activity","emoji_order":"931","aliases":[":person_doing_cartwheel_tone3:"],"aliases_ascii":[],"keywords":[]},"cartwheel_tone4":{"unicode":"1f938-1f3fe","unicode_alt":"","code_decimal":"🤸🏾","name":"person doing cartwheel tone 4","shortname":":cartwheel_tone4:","category":"activity","emoji_order":"932","aliases":[":person_doing_cartwheel_tone4:"],"aliases_ascii":[],"keywords":[]},"cartwheel_tone5":{"unicode":"1f938-1f3ff","unicode_alt":"","code_decimal":"🤸🏿","name":"person doing cartwheel tone 5","shortname":":cartwheel_tone5:","category":"activity","emoji_order":"933","aliases":[":person_doing_cartwheel_tone5:"],"aliases_ascii":[],"keywords":[]},"wrestlers":{"unicode":"1f93c","unicode_alt":"","code_decimal":"🤼","name":"wrestlers","shortname":":wrestlers:","category":"activity","emoji_order":"946","aliases":[":wrestling:"],"aliases_ascii":[],"keywords":[]},"wrestlers_tone1":{"unicode":"1f93c-1f3fb","unicode_alt":"","code_decimal":"🤼🏻","name":"wrestlers tone 1","shortname":":wrestlers_tone1:","category":"activity","emoji_order":"947","aliases":[":wrestling_tone1:"],"aliases_ascii":[],"keywords":[]},"wrestlers_tone2":{"unicode":"1f93c-1f3fc","unicode_alt":"","code_decimal":"🤼🏼","name":"wrestlers tone 2","shortname":":wrestlers_tone2:","category":"activity","emoji_order":"948","aliases":[":wrestling_tone2:"],"aliases_ascii":[],"keywords":[]},"wrestlers_tone3":{"unicode":"1f93c-1f3fd","unicode_alt":"","code_decimal":"🤼🏽","name":"wrestlers tone 3","shortname":":wrestlers_tone3:","category":"activity","emoji_order":"949","aliases":[":wrestling_tone3:"],"aliases_ascii":[],"keywords":[]},"wrestlers_tone4":{"unicode":"1f93c-1f3fe","unicode_alt":"","code_decimal":"🤼🏾","name":"wrestlers tone 4","shortname":":wrestlers_tone4:","category":"activity","emoji_order":"950","aliases":[":wrestling_tone4:"],"aliases_ascii":[],"keywords":[]},"wrestlers_tone5":{"unicode":"1f93c-1f3ff","unicode_alt":"","code_decimal":"🤼🏿","name":"wrestlers tone 5","shortname":":wrestlers_tone5:","category":"activity","emoji_order":"951","aliases":[":wrestling_tone5:"],"aliases_ascii":[],"keywords":[]},"water_polo":{"unicode":"1f93d","unicode_alt":"","code_decimal":"🤽","name":"water polo","shortname":":water_polo:","category":"activity","emoji_order":"964","aliases":[],"aliases_ascii":[],"keywords":[]},"water_polo_tone1":{"unicode":"1f93d-1f3fb","unicode_alt":"","code_decimal":"🤽🏻","name":"water polo tone 1","shortname":":water_polo_tone1:","category":"activity","emoji_order":"965","aliases":[],"aliases_ascii":[],"keywords":[]},"water_polo_tone2":{"unicode":"1f93d-1f3fc","unicode_alt":"","code_decimal":"🤽🏼","name":"water polo tone 2","shortname":":water_polo_tone2:","category":"activity","emoji_order":"966","aliases":[],"aliases_ascii":[],"keywords":[]},"water_polo_tone3":{"unicode":"1f93d-1f3fd","unicode_alt":"","code_decimal":"🤽🏽","name":"water polo tone 3","shortname":":water_polo_tone3:","category":"activity","emoji_order":"967","aliases":[],"aliases_ascii":[],"keywords":[]},"water_polo_tone4":{"unicode":"1f93d-1f3fe","unicode_alt":"","code_decimal":"🤽🏾","name":"water polo tone 4","shortname":":water_polo_tone4:","category":"activity","emoji_order":"968","aliases":[],"aliases_ascii":[],"keywords":[]},"water_polo_tone5":{"unicode":"1f93d-1f3ff","unicode_alt":"","code_decimal":"🤽🏿","name":"water polo tone 5","shortname":":water_polo_tone5:","category":"activity","emoji_order":"969","aliases":[],"aliases_ascii":[],"keywords":[]},"handball":{"unicode":"1f93e","unicode_alt":"","code_decimal":"🤾","name":"handball","shortname":":handball:","category":"activity","emoji_order":"982","aliases":[],"aliases_ascii":[],"keywords":[]},"handball_tone1":{"unicode":"1f93e-1f3fb","unicode_alt":"","code_decimal":"🤾🏻","name":"handball tone 1","shortname":":handball_tone1:","category":"activity","emoji_order":"983","aliases":[],"aliases_ascii":[],"keywords":[]},"handball_tone2":{"unicode":"1f93e-1f3fc","unicode_alt":"","code_decimal":"🤾🏼","name":"handball tone 2","shortname":":handball_tone2:","category":"activity","emoji_order":"984","aliases":[],"aliases_ascii":[],"keywords":[]},"handball_tone3":{"unicode":"1f93e-1f3fd","unicode_alt":"","code_decimal":"🤾🏽","name":"handball tone 3","shortname":":handball_tone3:","category":"activity","emoji_order":"985","aliases":[],"aliases_ascii":[],"keywords":[]},"handball_tone4":{"unicode":"1f93e-1f3fe","unicode_alt":"","code_decimal":"🤾🏾","name":"handball tone 4","shortname":":handball_tone4:","category":"activity","emoji_order":"986","aliases":[],"aliases_ascii":[],"keywords":[]},"handball_tone5":{"unicode":"1f93e-1f3ff","unicode_alt":"","code_decimal":"🤾🏿","name":"handball tone 5","shortname":":handball_tone5:","category":"activity","emoji_order":"987","aliases":[],"aliases_ascii":[],"keywords":[]},"juggling":{"unicode":"1f939","unicode_alt":"","code_decimal":"🤹","name":"juggling","shortname":":juggling:","category":"activity","emoji_order":"1000","aliases":[":juggler:"],"aliases_ascii":[],"keywords":[]},"juggling_tone1":{"unicode":"1f939-1f3fb","unicode_alt":"","code_decimal":"🤹🏻","name":"juggling tone 1","shortname":":juggling_tone1:","category":"activity","emoji_order":"1001","aliases":[":juggler_tone1:"],"aliases_ascii":[],"keywords":[]},"juggling_tone2":{"unicode":"1f939-1f3fc","unicode_alt":"","code_decimal":"🤹🏼","name":"juggling tone 2","shortname":":juggling_tone2:","category":"activity","emoji_order":"1002","aliases":[":juggler_tone2:"],"aliases_ascii":[],"keywords":[]},"juggling_tone3":{"unicode":"1f939-1f3fd","unicode_alt":"","code_decimal":"🤹🏽","name":"juggling tone 3","shortname":":juggling_tone3:","category":"activity","emoji_order":"1003","aliases":[":juggler_tone3:"],"aliases_ascii":[],"keywords":[]},"juggling_tone4":{"unicode":"1f939-1f3fe","unicode_alt":"","code_decimal":"🤹🏾","name":"juggling tone 4","shortname":":juggling_tone4:","category":"activity","emoji_order":"1004","aliases":[":juggler_tone4:"],"aliases_ascii":[],"keywords":[]},"juggling_tone5":{"unicode":"1f939-1f3ff","unicode_alt":"","code_decimal":"🤹🏿","name":"juggling tone 5","shortname":":juggling_tone5:","category":"activity","emoji_order":"1005","aliases":[":juggler_tone5:"],"aliases_ascii":[],"keywords":[]},"couple":{"unicode":"1f46b","unicode_alt":"","code_decimal":"👫","name":"man and woman holding hands","shortname":":couple:","category":"people","emoji_order":"1018","aliases":[],"aliases_ascii":[],"keywords":["people","sex","creationism"]},"two_men_holding_hands":{"unicode":"1f46c","unicode_alt":"","code_decimal":"👬","name":"two men holding hands","shortname":":two_men_holding_hands:","category":"people","emoji_order":"1024","aliases":[],"aliases_ascii":[],"keywords":["people","gay","men","sex","lgbt"]},"two_women_holding_hands":{"unicode":"1f46d","unicode_alt":"","code_decimal":"👭","name":"two women holding hands","shortname":":two_women_holding_hands:","category":"people","emoji_order":"1030","aliases":[],"aliases_ascii":[],"keywords":["people","women","sex","lgbt","lesbian","girls night"]},"couplekiss":{"unicode":"1f48f","unicode_alt":"","code_decimal":"💏","name":"kiss","shortname":":couplekiss:","category":"people","emoji_order":"1036","aliases":[],"aliases_ascii":[],"keywords":["people","love","sex"]},"kiss_mm":{"unicode":"1f468-2764-1f48b-1f468","unicode_alt":"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468","code_decimal":"👨❤💋👨","name":"kiss (man,man)","shortname":":kiss_mm:","category":"people","emoji_order":"1038","aliases":[":couplekiss_mm:"],"aliases_ascii":[],"keywords":["people","gay","men","love","sex","lgbt"]},"kiss_ww":{"unicode":"1f469-2764-1f48b-1f469","unicode_alt":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469","code_decimal":"👩❤💋👩","name":"kiss (woman,woman)","shortname":":kiss_ww:","category":"people","emoji_order":"1039","aliases":[":couplekiss_ww:"],"aliases_ascii":[],"keywords":["people","women","love","sex","lgbt","lesbian"]},"couple_with_heart":{"unicode":"1f491","unicode_alt":"","code_decimal":"💑","name":"couple with heart","shortname":":couple_with_heart:","category":"people","emoji_order":"1040","aliases":[],"aliases_ascii":[],"keywords":["people","love","sex"]},"couple_mm":{"unicode":"1f468-2764-1f468","unicode_alt":"1f468-200d-2764-fe0f-200d-1f468","code_decimal":"👨❤👨","name":"couple (man,man)","shortname":":couple_mm:","category":"people","emoji_order":"1042","aliases":[":couple_with_heart_mm:"],"aliases_ascii":[],"keywords":["people","gay","men","love","sex","lgbt"]},"couple_ww":{"unicode":"1f469-2764-1f469","unicode_alt":"1f469-200d-2764-fe0f-200d-1f469","code_decimal":"👩❤👩","name":"couple (woman,woman)","shortname":":couple_ww:","category":"people","emoji_order":"1043","aliases":[":couple_with_heart_ww:"],"aliases_ascii":[],"keywords":["people","women","love","sex","lgbt"]},"family":{"unicode":"1f46a","unicode_alt":"","code_decimal":"👪","name":"family","shortname":":family:","category":"people","emoji_order":"1044","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_mwg":{"unicode":"1f468-1f469-1f467","unicode_alt":"1f468-200d-1f469-200d-1f467","code_decimal":"👨👩👧","name":"family (man,woman,girl)","shortname":":family_mwg:","category":"people","emoji_order":"1051","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_mwgb":{"unicode":"1f468-1f469-1f467-1f466","unicode_alt":"1f468-200d-1f469-200d-1f467-200d-1f466","code_decimal":"👨👩👧👦","name":"family (man,woman,girl,boy)","shortname":":family_mwgb:","category":"people","emoji_order":"1052","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_mwbb":{"unicode":"1f468-1f469-1f466-1f466","unicode_alt":"1f468-200d-1f469-200d-1f466-200d-1f466","code_decimal":"👨👩👦👦","name":"family (man,woman,boy,boy)","shortname":":family_mwbb:","category":"people","emoji_order":"1053","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_mwgg":{"unicode":"1f468-1f469-1f467-1f467","unicode_alt":"1f468-200d-1f469-200d-1f467-200d-1f467","code_decimal":"👨👩👧👧","name":"family (man,woman,girl,girl)","shortname":":family_mwgg:","category":"people","emoji_order":"1054","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_mmb":{"unicode":"1f468-1f468-1f466","unicode_alt":"1f468-200d-1f468-200d-1f466","code_decimal":"👨👨👦","name":"family (man,man,boy)","shortname":":family_mmb:","category":"people","emoji_order":"1055","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt"]},"family_mmg":{"unicode":"1f468-1f468-1f467","unicode_alt":"1f468-200d-1f468-200d-1f467","code_decimal":"👨👨👧","name":"family (man,man,girl)","shortname":":family_mmg:","category":"people","emoji_order":"1056","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt"]},"family_mmgb":{"unicode":"1f468-1f468-1f467-1f466","unicode_alt":"1f468-200d-1f468-200d-1f467-200d-1f466","code_decimal":"👨👨👧👦","name":"family (man,man,girl,boy)","shortname":":family_mmgb:","category":"people","emoji_order":"1057","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt"]},"family_mmbb":{"unicode":"1f468-1f468-1f466-1f466","unicode_alt":"1f468-200d-1f468-200d-1f466-200d-1f466","code_decimal":"👨👨👦👦","name":"family (man,man,boy,boy)","shortname":":family_mmbb:","category":"people","emoji_order":"1058","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt"]},"family_mmgg":{"unicode":"1f468-1f468-1f467-1f467","unicode_alt":"1f468-200d-1f468-200d-1f467-200d-1f467","code_decimal":"👨👨👧👧","name":"family (man,man,girl,girl)","shortname":":family_mmgg:","category":"people","emoji_order":"1059","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt"]},"family_wwb":{"unicode":"1f469-1f469-1f466","unicode_alt":"1f469-200d-1f469-200d-1f466","code_decimal":"👩👩👦","name":"family (woman,woman,boy)","shortname":":family_wwb:","category":"people","emoji_order":"1060","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lesbian"]},"family_wwg":{"unicode":"1f469-1f469-1f467","unicode_alt":"1f469-200d-1f469-200d-1f467","code_decimal":"👩👩👧","name":"family (woman,woman,girl)","shortname":":family_wwg:","category":"people","emoji_order":"1061","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lesbian"]},"family_wwgb":{"unicode":"1f469-1f469-1f467-1f466","unicode_alt":"1f469-200d-1f469-200d-1f467-200d-1f466","code_decimal":"👩👩👧👦","name":"family (woman,woman,girl,boy)","shortname":":family_wwgb:","category":"people","emoji_order":"1062","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lesbian"]},"family_wwbb":{"unicode":"1f469-1f469-1f466-1f466","unicode_alt":"1f469-200d-1f469-200d-1f466-200d-1f466","code_decimal":"👩👩👦👦","name":"family (woman,woman,boy,boy)","shortname":":family_wwbb:","category":"people","emoji_order":"1063","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lesbian"]},"family_wwgg":{"unicode":"1f469-1f469-1f467-1f467","unicode_alt":"1f469-200d-1f469-200d-1f467-200d-1f467","code_decimal":"👩👩👧👧","name":"family (woman,woman,girl,girl)","shortname":":family_wwgg:","category":"people","emoji_order":"1064","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lesbian"]},"tone1":{"unicode":"1f3fb","unicode_alt":"","code_decimal":"🏻","name":"emoji modifier Fitzpatrick type-1-2","shortname":":tone1:","category":"modifier","emoji_order":"1075","aliases":[],"aliases_ascii":[],"keywords":[]},"tone2":{"unicode":"1f3fc","unicode_alt":"","code_decimal":"🏼","name":"emoji modifier Fitzpatrick type-3","shortname":":tone2:","category":"modifier","emoji_order":"1076","aliases":[],"aliases_ascii":[],"keywords":[]},"tone3":{"unicode":"1f3fd","unicode_alt":"","code_decimal":"🏽","name":"emoji modifier Fitzpatrick type-4","shortname":":tone3:","category":"modifier","emoji_order":"1077","aliases":[],"aliases_ascii":[],"keywords":[]},"tone4":{"unicode":"1f3fe","unicode_alt":"","code_decimal":"🏾","name":"emoji modifier Fitzpatrick type-5","shortname":":tone4:","category":"modifier","emoji_order":"1078","aliases":[],"aliases_ascii":[],"keywords":[]},"tone5":{"unicode":"1f3ff","unicode_alt":"","code_decimal":"🏿","name":"emoji modifier Fitzpatrick type-6","shortname":":tone5:","category":"modifier","emoji_order":"1079","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle":{"unicode":"1f4aa","unicode_alt":"","code_decimal":"💪","name":"flexed biceps","shortname":":muscle:","category":"people","emoji_order":"1080","aliases":[],"aliases_ascii":[],"keywords":["body","hands","workout","flex","win","diversity","feminist","boys night"]},"muscle_tone1":{"unicode":"1f4aa-1f3fb","unicode_alt":"","code_decimal":"💪🏻","name":"flexed biceps tone 1","shortname":":muscle_tone1:","category":"people","emoji_order":"1081","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle_tone2":{"unicode":"1f4aa-1f3fc","unicode_alt":"","code_decimal":"💪🏼","name":"flexed biceps tone 2","shortname":":muscle_tone2:","category":"people","emoji_order":"1082","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle_tone3":{"unicode":"1f4aa-1f3fd","unicode_alt":"","code_decimal":"💪🏽","name":"flexed biceps tone 3","shortname":":muscle_tone3:","category":"people","emoji_order":"1083","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle_tone4":{"unicode":"1f4aa-1f3fe","unicode_alt":"","code_decimal":"💪🏾","name":"flexed biceps tone 4","shortname":":muscle_tone4:","category":"people","emoji_order":"1084","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle_tone5":{"unicode":"1f4aa-1f3ff","unicode_alt":"","code_decimal":"💪🏿","name":"flexed biceps tone 5","shortname":":muscle_tone5:","category":"people","emoji_order":"1085","aliases":[],"aliases_ascii":[],"keywords":[]},"selfie":{"unicode":"1f933","unicode_alt":"","code_decimal":"🤳","name":"selfie","shortname":":selfie:","category":"people","emoji_order":"1086","aliases":[],"aliases_ascii":[],"keywords":[]},"selfie_tone1":{"unicode":"1f933-1f3fb","unicode_alt":"","code_decimal":"🤳🏻","name":"selfie tone 1","shortname":":selfie_tone1:","category":"people","emoji_order":"1087","aliases":[],"aliases_ascii":[],"keywords":[]},"selfie_tone2":{"unicode":"1f933-1f3fc","unicode_alt":"","code_decimal":"🤳🏼","name":"selfie tone 2","shortname":":selfie_tone2:","category":"people","emoji_order":"1088","aliases":[],"aliases_ascii":[],"keywords":[]},"selfie_tone3":{"unicode":"1f933-1f3fd","unicode_alt":"","code_decimal":"🤳🏽","name":"selfie tone 3","shortname":":selfie_tone3:","category":"people","emoji_order":"1089","aliases":[],"aliases_ascii":[],"keywords":[]},"selfie_tone4":{"unicode":"1f933-1f3fe","unicode_alt":"","code_decimal":"🤳🏾","name":"selfie tone 4","shortname":":selfie_tone4:","category":"people","emoji_order":"1090","aliases":[],"aliases_ascii":[],"keywords":[]},"selfie_tone5":{"unicode":"1f933-1f3ff","unicode_alt":"","code_decimal":"🤳🏿","name":"selfie tone 5","shortname":":selfie_tone5:","category":"people","emoji_order":"1091","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left":{"unicode":"1f448","unicode_alt":"","code_decimal":"👈","name":"white left pointing backhand index","shortname":":point_left:","category":"people","emoji_order":"1092","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity"]},"point_left_tone1":{"unicode":"1f448-1f3fb","unicode_alt":"","code_decimal":"👈🏻","name":"white left pointing backhand index tone 1","shortname":":point_left_tone1:","category":"people","emoji_order":"1093","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left_tone2":{"unicode":"1f448-1f3fc","unicode_alt":"","code_decimal":"👈🏼","name":"white left pointing backhand index tone 2","shortname":":point_left_tone2:","category":"people","emoji_order":"1094","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left_tone3":{"unicode":"1f448-1f3fd","unicode_alt":"","code_decimal":"👈🏽","name":"white left pointing backhand index tone 3","shortname":":point_left_tone3:","category":"people","emoji_order":"1095","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left_tone4":{"unicode":"1f448-1f3fe","unicode_alt":"","code_decimal":"👈🏾","name":"white left pointing backhand index tone 4","shortname":":point_left_tone4:","category":"people","emoji_order":"1096","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left_tone5":{"unicode":"1f448-1f3ff","unicode_alt":"","code_decimal":"👈🏿","name":"white left pointing backhand index tone 5","shortname":":point_left_tone5:","category":"people","emoji_order":"1097","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right":{"unicode":"1f449","unicode_alt":"","code_decimal":"👉","name":"white right pointing backhand index","shortname":":point_right:","category":"people","emoji_order":"1098","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity"]},"point_right_tone1":{"unicode":"1f449-1f3fb","unicode_alt":"","code_decimal":"👉🏻","name":"white right pointing backhand index tone 1","shortname":":point_right_tone1:","category":"people","emoji_order":"1099","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right_tone2":{"unicode":"1f449-1f3fc","unicode_alt":"","code_decimal":"👉🏼","name":"white right pointing backhand index tone 2","shortname":":point_right_tone2:","category":"people","emoji_order":"1100","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right_tone3":{"unicode":"1f449-1f3fd","unicode_alt":"","code_decimal":"👉🏽","name":"white right pointing backhand index tone 3","shortname":":point_right_tone3:","category":"people","emoji_order":"1101","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right_tone4":{"unicode":"1f449-1f3fe","unicode_alt":"","code_decimal":"👉🏾","name":"white right pointing backhand index tone 4","shortname":":point_right_tone4:","category":"people","emoji_order":"1102","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right_tone5":{"unicode":"1f449-1f3ff","unicode_alt":"","code_decimal":"👉🏿","name":"white right pointing backhand index tone 5","shortname":":point_right_tone5:","category":"people","emoji_order":"1103","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up":{"unicode":"261d","unicode_alt":"261d-fe0f","code_decimal":"☝","name":"white up pointing index","shortname":":point_up:","category":"people","emoji_order":"1104","aliases":[],"aliases_ascii":[],"keywords":["body","hands","emojione","diversity"]},"point_up_tone1":{"unicode":"261d-1f3fb","unicode_alt":"","code_decimal":"☝🏻","name":"white up pointing index tone 1","shortname":":point_up_tone1:","category":"people","emoji_order":"1105","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_tone2":{"unicode":"261d-1f3fc","unicode_alt":"","code_decimal":"☝🏼","name":"white up pointing index tone 2","shortname":":point_up_tone2:","category":"people","emoji_order":"1106","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_tone3":{"unicode":"261d-1f3fd","unicode_alt":"","code_decimal":"☝🏽","name":"white up pointing index tone 3","shortname":":point_up_tone3:","category":"people","emoji_order":"1107","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_tone4":{"unicode":"261d-1f3fe","unicode_alt":"","code_decimal":"☝🏾","name":"white up pointing index tone 4","shortname":":point_up_tone4:","category":"people","emoji_order":"1108","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_tone5":{"unicode":"261d-1f3ff","unicode_alt":"","code_decimal":"☝🏿","name":"white up pointing index tone 5","shortname":":point_up_tone5:","category":"people","emoji_order":"1109","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2":{"unicode":"1f446","unicode_alt":"","code_decimal":"👆","name":"white up pointing backhand index","shortname":":point_up_2:","category":"people","emoji_order":"1110","aliases":[],"aliases_ascii":[],"keywords":["body","hands","diversity"]},"point_up_2_tone1":{"unicode":"1f446-1f3fb","unicode_alt":"","code_decimal":"👆🏻","name":"white up pointing backhand index tone 1","shortname":":point_up_2_tone1:","category":"people","emoji_order":"1111","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2_tone2":{"unicode":"1f446-1f3fc","unicode_alt":"","code_decimal":"👆🏼","name":"white up pointing backhand index tone 2","shortname":":point_up_2_tone2:","category":"people","emoji_order":"1112","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2_tone3":{"unicode":"1f446-1f3fd","unicode_alt":"","code_decimal":"👆🏽","name":"white up pointing backhand index tone 3","shortname":":point_up_2_tone3:","category":"people","emoji_order":"1113","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2_tone4":{"unicode":"1f446-1f3fe","unicode_alt":"","code_decimal":"👆🏾","name":"white up pointing backhand index tone 4","shortname":":point_up_2_tone4:","category":"people","emoji_order":"1114","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2_tone5":{"unicode":"1f446-1f3ff","unicode_alt":"","code_decimal":"👆🏿","name":"white up pointing backhand index tone 5","shortname":":point_up_2_tone5:","category":"people","emoji_order":"1115","aliases":[],"aliases_ascii":[],"keywords":[]},"middle_finger":{"unicode":"1f595","unicode_alt":"","code_decimal":"🖕","name":"reversed hand with middle finger extended","shortname":":middle_finger:","category":"people","emoji_order":"1116","aliases":[":reversed_hand_with_middle_finger_extended:"],"aliases_ascii":[],"keywords":["body","hands","middle finger","diversity"]},"middle_finger_tone1":{"unicode":"1f595-1f3fb","unicode_alt":"","code_decimal":"🖕🏻","name":"reversed hand with middle finger extended tone 1","shortname":":middle_finger_tone1:","category":"people","emoji_order":"1117","aliases":[":reversed_hand_with_middle_finger_extended_tone1:"],"aliases_ascii":[],"keywords":[]},"middle_finger_tone2":{"unicode":"1f595-1f3fc","unicode_alt":"","code_decimal":"🖕🏼","name":"reversed hand with middle finger extended tone 2","shortname":":middle_finger_tone2:","category":"people","emoji_order":"1118","aliases":[":reversed_hand_with_middle_finger_extended_tone2:"],"aliases_ascii":[],"keywords":[]},"middle_finger_tone3":{"unicode":"1f595-1f3fd","unicode_alt":"","code_decimal":"🖕🏽","name":"reversed hand with middle finger extended tone 3","shortname":":middle_finger_tone3:","category":"people","emoji_order":"1119","aliases":[":reversed_hand_with_middle_finger_extended_tone3:"],"aliases_ascii":[],"keywords":[]},"middle_finger_tone4":{"unicode":"1f595-1f3fe","unicode_alt":"","code_decimal":"🖕🏾","name":"reversed hand with middle finger extended tone 4","shortname":":middle_finger_tone4:","category":"people","emoji_order":"1120","aliases":[":reversed_hand_with_middle_finger_extended_tone4:"],"aliases_ascii":[],"keywords":[]},"middle_finger_tone5":{"unicode":"1f595-1f3ff","unicode_alt":"","code_decimal":"🖕🏿","name":"reversed hand with middle finger extended tone 5","shortname":":middle_finger_tone5:","category":"people","emoji_order":"1121","aliases":[":reversed_hand_with_middle_finger_extended_tone5:"],"aliases_ascii":[],"keywords":[]},"point_down":{"unicode":"1f447","unicode_alt":"","code_decimal":"👇","name":"white down pointing backhand index","shortname":":point_down:","category":"people","emoji_order":"1122","aliases":[],"aliases_ascii":[],"keywords":["body","hands","diversity"]},"point_down_tone1":{"unicode":"1f447-1f3fb","unicode_alt":"","code_decimal":"👇🏻","name":"white down pointing backhand index tone 1","shortname":":point_down_tone1:","category":"people","emoji_order":"1123","aliases":[],"aliases_ascii":[],"keywords":[]},"point_down_tone2":{"unicode":"1f447-1f3fc","unicode_alt":"","code_decimal":"👇🏼","name":"white down pointing backhand index tone 2","shortname":":point_down_tone2:","category":"people","emoji_order":"1124","aliases":[],"aliases_ascii":[],"keywords":[]},"point_down_tone3":{"unicode":"1f447-1f3fd","unicode_alt":"","code_decimal":"👇🏽","name":"white down pointing backhand index tone 3","shortname":":point_down_tone3:","category":"people","emoji_order":"1125","aliases":[],"aliases_ascii":[],"keywords":[]},"point_down_tone4":{"unicode":"1f447-1f3fe","unicode_alt":"","code_decimal":"👇🏾","name":"white down pointing backhand index tone 4","shortname":":point_down_tone4:","category":"people","emoji_order":"1126","aliases":[],"aliases_ascii":[],"keywords":[]},"point_down_tone5":{"unicode":"1f447-1f3ff","unicode_alt":"","code_decimal":"👇🏿","name":"white down pointing backhand index tone 5","shortname":":point_down_tone5:","category":"people","emoji_order":"1127","aliases":[],"aliases_ascii":[],"keywords":[]},"v":{"unicode":"270c","unicode_alt":"270c-fe0f","code_decimal":"✌","name":"victory hand","shortname":":v:","category":"people","emoji_order":"1128","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","thank you","peace","diversity","girls night"]},"v_tone1":{"unicode":"270c-1f3fb","unicode_alt":"","code_decimal":"✌🏻","name":"victory hand tone 1","shortname":":v_tone1:","category":"people","emoji_order":"1129","aliases":[],"aliases_ascii":[],"keywords":[]},"v_tone2":{"unicode":"270c-1f3fc","unicode_alt":"","code_decimal":"✌🏼","name":"victory hand tone 2","shortname":":v_tone2:","category":"people","emoji_order":"1130","aliases":[],"aliases_ascii":[],"keywords":[]},"v_tone3":{"unicode":"270c-1f3fd","unicode_alt":"","code_decimal":"✌🏽","name":"victory hand tone 3","shortname":":v_tone3:","category":"people","emoji_order":"1131","aliases":[],"aliases_ascii":[],"keywords":[]},"v_tone4":{"unicode":"270c-1f3fe","unicode_alt":"","code_decimal":"✌🏾","name":"victory hand tone 4","shortname":":v_tone4:","category":"people","emoji_order":"1132","aliases":[],"aliases_ascii":[],"keywords":[]},"v_tone5":{"unicode":"270c-1f3ff","unicode_alt":"","code_decimal":"✌🏿","name":"victory hand tone 5","shortname":":v_tone5:","category":"people","emoji_order":"1133","aliases":[],"aliases_ascii":[],"keywords":[]},"fingers_crossed":{"unicode":"1f91e","unicode_alt":"","code_decimal":"🤞","name":"hand with first and index finger crossed","shortname":":fingers_crossed:","category":"people","emoji_order":"1134","aliases":[":hand_with_index_and_middle_finger_crossed:"],"aliases_ascii":[],"keywords":[]},"fingers_crossed_tone1":{"unicode":"1f91e-1f3fb","unicode_alt":"","code_decimal":"🤞🏻","name":"hand with index and middle fingers crossed tone 1","shortname":":fingers_crossed_tone1:","category":"people","emoji_order":"1135","aliases":[":hand_with_index_and_middle_fingers_crossed_tone1:"],"aliases_ascii":[],"keywords":[]},"fingers_crossed_tone2":{"unicode":"1f91e-1f3fc","unicode_alt":"","code_decimal":"🤞🏼","name":"hand with index and middle fingers crossed tone 2","shortname":":fingers_crossed_tone2:","category":"people","emoji_order":"1136","aliases":[":hand_with_index_and_middle_fingers_crossed_tone2:"],"aliases_ascii":[],"keywords":[]},"fingers_crossed_tone3":{"unicode":"1f91e-1f3fd","unicode_alt":"","code_decimal":"🤞🏽","name":"hand with index and middle fingers crossed tone 3","shortname":":fingers_crossed_tone3:","category":"people","emoji_order":"1137","aliases":[":hand_with_index_and_middle_fingers_crossed_tone3:"],"aliases_ascii":[],"keywords":[]},"fingers_crossed_tone4":{"unicode":"1f91e-1f3fe","unicode_alt":"","code_decimal":"🤞🏾","name":"hand with index and middle fingers crossed tone 4","shortname":":fingers_crossed_tone4:","category":"people","emoji_order":"1138","aliases":[":hand_with_index_and_middle_fingers_crossed_tone4:"],"aliases_ascii":[],"keywords":[]},"fingers_crossed_tone5":{"unicode":"1f91e-1f3ff","unicode_alt":"","code_decimal":"🤞🏿","name":"hand with index and middle fingers crossed tone 5","shortname":":fingers_crossed_tone5:","category":"people","emoji_order":"1139","aliases":[":hand_with_index_and_middle_fingers_crossed_tone5:"],"aliases_ascii":[],"keywords":[]},"vulcan":{"unicode":"1f596","unicode_alt":"","code_decimal":"🖖","name":"raised hand with part between middle and ring fingers","shortname":":vulcan:","category":"people","emoji_order":"1140","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers:"],"aliases_ascii":[],"keywords":["body","hands","hi","diversity"]},"vulcan_tone1":{"unicode":"1f596-1f3fb","unicode_alt":"","code_decimal":"🖖🏻","name":"raised hand with part between middle and ring fingers tone 1","shortname":":vulcan_tone1:","category":"people","emoji_order":"1141","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone1:"],"aliases_ascii":[],"keywords":[]},"vulcan_tone2":{"unicode":"1f596-1f3fc","unicode_alt":"","code_decimal":"🖖🏼","name":"raised hand with part between middle and ring fingers tone 2","shortname":":vulcan_tone2:","category":"people","emoji_order":"1142","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone2:"],"aliases_ascii":[],"keywords":[]},"vulcan_tone3":{"unicode":"1f596-1f3fd","unicode_alt":"","code_decimal":"🖖🏽","name":"raised hand with part between middle and ring fingers tone 3","shortname":":vulcan_tone3:","category":"people","emoji_order":"1143","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone3:"],"aliases_ascii":[],"keywords":[]},"vulcan_tone4":{"unicode":"1f596-1f3fe","unicode_alt":"","code_decimal":"🖖🏾","name":"raised hand with part between middle and ring fingers tone 4","shortname":":vulcan_tone4:","category":"people","emoji_order":"1144","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone4:"],"aliases_ascii":[],"keywords":[]},"vulcan_tone5":{"unicode":"1f596-1f3ff","unicode_alt":"","code_decimal":"🖖🏿","name":"raised hand with part between middle and ring fingers tone 5","shortname":":vulcan_tone5:","category":"people","emoji_order":"1145","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone5:"],"aliases_ascii":[],"keywords":[]},"metal":{"unicode":"1f918","unicode_alt":"","code_decimal":"🤘","name":"sign of the horns","shortname":":metal:","category":"people","emoji_order":"1146","aliases":[":sign_of_the_horns:"],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","boys night","parties"]},"metal_tone1":{"unicode":"1f918-1f3fb","unicode_alt":"","code_decimal":"🤘🏻","name":"sign of the horns tone 1","shortname":":metal_tone1:","category":"people","emoji_order":"1147","aliases":[":sign_of_the_horns_tone1:"],"aliases_ascii":[],"keywords":[]},"metal_tone2":{"unicode":"1f918-1f3fc","unicode_alt":"","code_decimal":"🤘🏼","name":"sign of the horns tone 2","shortname":":metal_tone2:","category":"people","emoji_order":"1148","aliases":[":sign_of_the_horns_tone2:"],"aliases_ascii":[],"keywords":[]},"metal_tone3":{"unicode":"1f918-1f3fd","unicode_alt":"","code_decimal":"🤘🏽","name":"sign of the horns tone 3","shortname":":metal_tone3:","category":"people","emoji_order":"1149","aliases":[":sign_of_the_horns_tone3:"],"aliases_ascii":[],"keywords":[]},"metal_tone4":{"unicode":"1f918-1f3fe","unicode_alt":"","code_decimal":"🤘🏾","name":"sign of the horns tone 4","shortname":":metal_tone4:","category":"people","emoji_order":"1150","aliases":[":sign_of_the_horns_tone4:"],"aliases_ascii":[],"keywords":[]},"metal_tone5":{"unicode":"1f918-1f3ff","unicode_alt":"","code_decimal":"🤘🏿","name":"sign of the horns tone 5","shortname":":metal_tone5:","category":"people","emoji_order":"1151","aliases":[":sign_of_the_horns_tone5:"],"aliases_ascii":[],"keywords":[]},"call_me":{"unicode":"1f919","unicode_alt":"","code_decimal":"🤙","name":"call me hand","shortname":":call_me:","category":"people","emoji_order":"1152","aliases":[":call_me_hand:"],"aliases_ascii":[],"keywords":[]},"call_me_tone1":{"unicode":"1f919-1f3fb","unicode_alt":"","code_decimal":"🤙🏻","name":"call me hand tone 1","shortname":":call_me_tone1:","category":"people","emoji_order":"1153","aliases":[":call_me_hand_tone1:"],"aliases_ascii":[],"keywords":[]},"call_me_tone2":{"unicode":"1f919-1f3fc","unicode_alt":"","code_decimal":"🤙🏼","name":"call me hand tone 2","shortname":":call_me_tone2:","category":"people","emoji_order":"1154","aliases":[":call_me_hand_tone2:"],"aliases_ascii":[],"keywords":[]},"call_me_tone3":{"unicode":"1f919-1f3fd","unicode_alt":"","code_decimal":"🤙🏽","name":"call me hand tone 3","shortname":":call_me_tone3:","category":"people","emoji_order":"1155","aliases":[":call_me_hand_tone3:"],"aliases_ascii":[],"keywords":[]},"call_me_tone4":{"unicode":"1f919-1f3fe","unicode_alt":"","code_decimal":"🤙🏾","name":"call me hand tone 4","shortname":":call_me_tone4:","category":"people","emoji_order":"1156","aliases":[":call_me_hand_tone4:"],"aliases_ascii":[],"keywords":[]},"call_me_tone5":{"unicode":"1f919-1f3ff","unicode_alt":"","code_decimal":"🤙🏿","name":"call me hand tone 5","shortname":":call_me_tone5:","category":"people","emoji_order":"1157","aliases":[":call_me_hand_tone5:"],"aliases_ascii":[],"keywords":[]},"hand_splayed":{"unicode":"1f590","unicode_alt":"1f590-fe0f","code_decimal":"🖐","name":"raised hand with fingers splayed","shortname":":hand_splayed:","category":"people","emoji_order":"1158","aliases":[":raised_hand_with_fingers_splayed:"],"aliases_ascii":[],"keywords":["body","hands","hi","diversity"]},"hand_splayed_tone1":{"unicode":"1f590-1f3fb","unicode_alt":"","code_decimal":"🖐🏻","name":"raised hand with fingers splayed tone 1","shortname":":hand_splayed_tone1:","category":"people","emoji_order":"1159","aliases":[":raised_hand_with_fingers_splayed_tone1:"],"aliases_ascii":[],"keywords":[]},"hand_splayed_tone2":{"unicode":"1f590-1f3fc","unicode_alt":"","code_decimal":"🖐🏼","name":"raised hand with fingers splayed tone 2","shortname":":hand_splayed_tone2:","category":"people","emoji_order":"1160","aliases":[":raised_hand_with_fingers_splayed_tone2:"],"aliases_ascii":[],"keywords":[]},"hand_splayed_tone3":{"unicode":"1f590-1f3fd","unicode_alt":"","code_decimal":"🖐🏽","name":"raised hand with fingers splayed tone 3","shortname":":hand_splayed_tone3:","category":"people","emoji_order":"1161","aliases":[":raised_hand_with_fingers_splayed_tone3:"],"aliases_ascii":[],"keywords":[]},"hand_splayed_tone4":{"unicode":"1f590-1f3fe","unicode_alt":"","code_decimal":"🖐🏾","name":"raised hand with fingers splayed tone 4","shortname":":hand_splayed_tone4:","category":"people","emoji_order":"1162","aliases":[":raised_hand_with_fingers_splayed_tone4:"],"aliases_ascii":[],"keywords":[]},"hand_splayed_tone5":{"unicode":"1f590-1f3ff","unicode_alt":"","code_decimal":"🖐🏿","name":"raised hand with fingers splayed tone 5","shortname":":hand_splayed_tone5:","category":"people","emoji_order":"1163","aliases":[":raised_hand_with_fingers_splayed_tone5:"],"aliases_ascii":[],"keywords":[]},"raised_hand":{"unicode":"270b","unicode_alt":"","code_decimal":"✋","name":"raised hand","shortname":":raised_hand:","category":"people","emoji_order":"1164","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","girls night"]},"raised_hand_tone1":{"unicode":"270b-1f3fb","unicode_alt":"","code_decimal":"✋🏻","name":"raised hand tone 1","shortname":":raised_hand_tone1:","category":"people","emoji_order":"1165","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hand_tone2":{"unicode":"270b-1f3fc","unicode_alt":"","code_decimal":"✋🏼","name":"raised hand tone 2","shortname":":raised_hand_tone2:","category":"people","emoji_order":"1166","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hand_tone3":{"unicode":"270b-1f3fd","unicode_alt":"","code_decimal":"✋🏽","name":"raised hand tone 3","shortname":":raised_hand_tone3:","category":"people","emoji_order":"1167","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hand_tone4":{"unicode":"270b-1f3fe","unicode_alt":"","code_decimal":"✋🏾","name":"raised hand tone 4","shortname":":raised_hand_tone4:","category":"people","emoji_order":"1168","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hand_tone5":{"unicode":"270b-1f3ff","unicode_alt":"","code_decimal":"✋🏿","name":"raised hand tone 5","shortname":":raised_hand_tone5:","category":"people","emoji_order":"1169","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand":{"unicode":"1f44c","unicode_alt":"","code_decimal":"👌","name":"ok hand sign","shortname":":ok_hand:","category":"people","emoji_order":"1170","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","perfect","good","beautiful"]},"ok_hand_tone1":{"unicode":"1f44c-1f3fb","unicode_alt":"","code_decimal":"👌🏻","name":"ok hand sign tone 1","shortname":":ok_hand_tone1:","category":"people","emoji_order":"1171","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand_tone2":{"unicode":"1f44c-1f3fc","unicode_alt":"","code_decimal":"👌🏼","name":"ok hand sign tone 2","shortname":":ok_hand_tone2:","category":"people","emoji_order":"1172","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand_tone3":{"unicode":"1f44c-1f3fd","unicode_alt":"","code_decimal":"👌🏽","name":"ok hand sign tone 3","shortname":":ok_hand_tone3:","category":"people","emoji_order":"1173","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand_tone4":{"unicode":"1f44c-1f3fe","unicode_alt":"","code_decimal":"👌🏾","name":"ok hand sign tone 4","shortname":":ok_hand_tone4:","category":"people","emoji_order":"1174","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand_tone5":{"unicode":"1f44c-1f3ff","unicode_alt":"","code_decimal":"👌🏿","name":"ok hand sign tone 5","shortname":":ok_hand_tone5:","category":"people","emoji_order":"1175","aliases":[],"aliases_ascii":[],"keywords":[]},"thumbsup":{"unicode":"1f44d","unicode_alt":"","code_decimal":"👍","name":"thumbs up sign","shortname":":thumbsup:","category":"people","emoji_order":"1176","aliases":[":+1:",":thumbup:"],"aliases_ascii":[],"keywords":["body","hands","hi","luck","thank you","diversity","perfect","good","beautiful"]},"thumbsup_tone1":{"unicode":"1f44d-1f3fb","unicode_alt":"","code_decimal":"👍🏻","name":"thumbs up sign tone 1","shortname":":thumbsup_tone1:","category":"people","emoji_order":"1177","aliases":[":+1_tone1:",":thumbup_tone1:"],"aliases_ascii":[],"keywords":[]},"thumbsup_tone2":{"unicode":"1f44d-1f3fc","unicode_alt":"","code_decimal":"👍🏼","name":"thumbs up sign tone 2","shortname":":thumbsup_tone2:","category":"people","emoji_order":"1178","aliases":[":+1_tone2:",":thumbup_tone2:"],"aliases_ascii":[],"keywords":[]},"thumbsup_tone3":{"unicode":"1f44d-1f3fd","unicode_alt":"","code_decimal":"👍🏽","name":"thumbs up sign tone 3","shortname":":thumbsup_tone3:","category":"people","emoji_order":"1179","aliases":[":+1_tone3:",":thumbup_tone3:"],"aliases_ascii":[],"keywords":[]},"thumbsup_tone4":{"unicode":"1f44d-1f3fe","unicode_alt":"","code_decimal":"👍🏾","name":"thumbs up sign tone 4","shortname":":thumbsup_tone4:","category":"people","emoji_order":"1180","aliases":[":+1_tone4:",":thumbup_tone4:"],"aliases_ascii":[],"keywords":[]},"thumbsup_tone5":{"unicode":"1f44d-1f3ff","unicode_alt":"","code_decimal":"👍🏿","name":"thumbs up sign tone 5","shortname":":thumbsup_tone5:","category":"people","emoji_order":"1181","aliases":[":+1_tone5:",":thumbup_tone5:"],"aliases_ascii":[],"keywords":[]},"thumbsdown":{"unicode":"1f44e","unicode_alt":"","code_decimal":"👎","name":"thumbs down sign","shortname":":thumbsdown:","category":"people","emoji_order":"1182","aliases":[":-1:",":thumbdown:"],"aliases_ascii":[],"keywords":["body","hands","diversity"]},"thumbsdown_tone1":{"unicode":"1f44e-1f3fb","unicode_alt":"","code_decimal":"👎🏻","name":"thumbs down sign tone 1","shortname":":thumbsdown_tone1:","category":"people","emoji_order":"1183","aliases":[":-1_tone1:",":thumbdown_tone1:"],"aliases_ascii":[],"keywords":[]},"thumbsdown_tone2":{"unicode":"1f44e-1f3fc","unicode_alt":"","code_decimal":"👎🏼","name":"thumbs down sign tone 2","shortname":":thumbsdown_tone2:","category":"people","emoji_order":"1184","aliases":[":-1_tone2:",":thumbdown_tone2:"],"aliases_ascii":[],"keywords":[]},"thumbsdown_tone3":{"unicode":"1f44e-1f3fd","unicode_alt":"","code_decimal":"👎🏽","name":"thumbs down sign tone 3","shortname":":thumbsdown_tone3:","category":"people","emoji_order":"1185","aliases":[":-1_tone3:",":thumbdown_tone3:"],"aliases_ascii":[],"keywords":[]},"thumbsdown_tone4":{"unicode":"1f44e-1f3fe","unicode_alt":"","code_decimal":"👎🏾","name":"thumbs down sign tone 4","shortname":":thumbsdown_tone4:","category":"people","emoji_order":"1186","aliases":[":-1_tone4:",":thumbdown_tone4:"],"aliases_ascii":[],"keywords":[]},"thumbsdown_tone5":{"unicode":"1f44e-1f3ff","unicode_alt":"","code_decimal":"👎🏿","name":"thumbs down sign tone 5","shortname":":thumbsdown_tone5:","category":"people","emoji_order":"1187","aliases":[":-1_tone5:",":thumbdown_tone5:"],"aliases_ascii":[],"keywords":[]},"fist":{"unicode":"270a","unicode_alt":"","code_decimal":"✊","name":"raised fist","shortname":":fist:","category":"people","emoji_order":"1188","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","fist bump","diversity","condolence"]},"fist_tone1":{"unicode":"270a-1f3fb","unicode_alt":"","code_decimal":"✊🏻","name":"raised fist tone 1","shortname":":fist_tone1:","category":"people","emoji_order":"1189","aliases":[],"aliases_ascii":[],"keywords":[]},"fist_tone2":{"unicode":"270a-1f3fc","unicode_alt":"","code_decimal":"✊🏼","name":"raised fist tone 2","shortname":":fist_tone2:","category":"people","emoji_order":"1190","aliases":[],"aliases_ascii":[],"keywords":[]},"fist_tone3":{"unicode":"270a-1f3fd","unicode_alt":"","code_decimal":"✊🏽","name":"raised fist tone 3","shortname":":fist_tone3:","category":"people","emoji_order":"1191","aliases":[],"aliases_ascii":[],"keywords":[]},"fist_tone4":{"unicode":"270a-1f3fe","unicode_alt":"","code_decimal":"✊🏾","name":"raised fist tone 4","shortname":":fist_tone4:","category":"people","emoji_order":"1192","aliases":[],"aliases_ascii":[],"keywords":[]},"fist_tone5":{"unicode":"270a-1f3ff","unicode_alt":"","code_decimal":"✊🏿","name":"raised fist tone 5","shortname":":fist_tone5:","category":"people","emoji_order":"1193","aliases":[],"aliases_ascii":[],"keywords":[]},"punch":{"unicode":"1f44a","unicode_alt":"","code_decimal":"👊","name":"fisted hand sign","shortname":":punch:","category":"people","emoji_order":"1194","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","fist bump","diversity","boys night"]},"punch_tone1":{"unicode":"1f44a-1f3fb","unicode_alt":"","code_decimal":"👊🏻","name":"fisted hand sign tone 1","shortname":":punch_tone1:","category":"people","emoji_order":"1195","aliases":[],"aliases_ascii":[],"keywords":[]},"punch_tone2":{"unicode":"1f44a-1f3fc","unicode_alt":"","code_decimal":"👊🏼","name":"fisted hand sign tone 2","shortname":":punch_tone2:","category":"people","emoji_order":"1196","aliases":[],"aliases_ascii":[],"keywords":[]},"punch_tone3":{"unicode":"1f44a-1f3fd","unicode_alt":"","code_decimal":"👊🏽","name":"fisted hand sign tone 3","shortname":":punch_tone3:","category":"people","emoji_order":"1197","aliases":[],"aliases_ascii":[],"keywords":[]},"punch_tone4":{"unicode":"1f44a-1f3fe","unicode_alt":"","code_decimal":"👊🏾","name":"fisted hand sign tone 4","shortname":":punch_tone4:","category":"people","emoji_order":"1198","aliases":[],"aliases_ascii":[],"keywords":[]},"punch_tone5":{"unicode":"1f44a-1f3ff","unicode_alt":"","code_decimal":"👊🏿","name":"fisted hand sign tone 5","shortname":":punch_tone5:","category":"people","emoji_order":"1199","aliases":[],"aliases_ascii":[],"keywords":[]},"left_facing_fist":{"unicode":"1f91b","unicode_alt":"","code_decimal":"🤛","name":"left-facing fist","shortname":":left_facing_fist:","category":"people","emoji_order":"1200","aliases":[":left_fist:"],"aliases_ascii":[],"keywords":[]},"left_facing_fist_tone1":{"unicode":"1f91b-1f3fb","unicode_alt":"","code_decimal":"🤛🏻","name":"left facing fist tone 1","shortname":":left_facing_fist_tone1:","category":"people","emoji_order":"1201","aliases":[":left_fist_tone1:"],"aliases_ascii":[],"keywords":[]},"left_facing_fist_tone2":{"unicode":"1f91b-1f3fc","unicode_alt":"","code_decimal":"🤛🏼","name":"left facing fist tone 2","shortname":":left_facing_fist_tone2:","category":"people","emoji_order":"1202","aliases":[":left_fist_tone2:"],"aliases_ascii":[],"keywords":[]},"left_facing_fist_tone3":{"unicode":"1f91b-1f3fd","unicode_alt":"","code_decimal":"🤛🏽","name":"left facing fist tone 3","shortname":":left_facing_fist_tone3:","category":"people","emoji_order":"1203","aliases":[":left_fist_tone3:"],"aliases_ascii":[],"keywords":[]},"left_facing_fist_tone4":{"unicode":"1f91b-1f3fe","unicode_alt":"","code_decimal":"🤛🏾","name":"left facing fist tone 4","shortname":":left_facing_fist_tone4:","category":"people","emoji_order":"1204","aliases":[":left_fist_tone4:"],"aliases_ascii":[],"keywords":[]},"left_facing_fist_tone5":{"unicode":"1f91b-1f3ff","unicode_alt":"","code_decimal":"🤛🏿","name":"left facing fist tone 5","shortname":":left_facing_fist_tone5:","category":"people","emoji_order":"1205","aliases":[":left_fist_tone5:"],"aliases_ascii":[],"keywords":[]},"right_facing_fist":{"unicode":"1f91c","unicode_alt":"","code_decimal":"🤜","name":"right-facing fist","shortname":":right_facing_fist:","category":"people","emoji_order":"1206","aliases":[":right_fist:"],"aliases_ascii":[],"keywords":[]},"right_facing_fist_tone1":{"unicode":"1f91c-1f3fb","unicode_alt":"","code_decimal":"🤜🏻","name":"right facing fist tone 1","shortname":":right_facing_fist_tone1:","category":"people","emoji_order":"1207","aliases":[":right_fist_tone1:"],"aliases_ascii":[],"keywords":[]},"right_facing_fist_tone2":{"unicode":"1f91c-1f3fc","unicode_alt":"","code_decimal":"🤜🏼","name":"right facing fist tone 2","shortname":":right_facing_fist_tone2:","category":"people","emoji_order":"1208","aliases":[":right_fist_tone2:"],"aliases_ascii":[],"keywords":[]},"right_facing_fist_tone3":{"unicode":"1f91c-1f3fd","unicode_alt":"","code_decimal":"🤜🏽","name":"right facing fist tone 3","shortname":":right_facing_fist_tone3:","category":"people","emoji_order":"1209","aliases":[":right_fist_tone3:"],"aliases_ascii":[],"keywords":[]},"right_facing_fist_tone4":{"unicode":"1f91c-1f3fe","unicode_alt":"","code_decimal":"🤜🏾","name":"right facing fist tone 4","shortname":":right_facing_fist_tone4:","category":"people","emoji_order":"1210","aliases":[":right_fist_tone4:"],"aliases_ascii":[],"keywords":[]},"right_facing_fist_tone5":{"unicode":"1f91c-1f3ff","unicode_alt":"","code_decimal":"🤜🏿","name":"right facing fist tone 5","shortname":":right_facing_fist_tone5:","category":"people","emoji_order":"1211","aliases":[":right_fist_tone5:"],"aliases_ascii":[],"keywords":[]},"raised_back_of_hand":{"unicode":"1f91a","unicode_alt":"","code_decimal":"🤚","name":"raised back of hand","shortname":":raised_back_of_hand:","category":"people","emoji_order":"1212","aliases":[":back_of_hand:"],"aliases_ascii":[],"keywords":[]},"raised_back_of_hand_tone1":{"unicode":"1f91a-1f3fb","unicode_alt":"","code_decimal":"🤚🏻","name":"raised back of hand tone 1","shortname":":raised_back_of_hand_tone1:","category":"people","emoji_order":"1213","aliases":[":back_of_hand_tone1:"],"aliases_ascii":[],"keywords":[]},"raised_back_of_hand_tone2":{"unicode":"1f91a-1f3fc","unicode_alt":"","code_decimal":"🤚🏼","name":"raised back of hand tone 2","shortname":":raised_back_of_hand_tone2:","category":"people","emoji_order":"1214","aliases":[":back_of_hand_tone2:"],"aliases_ascii":[],"keywords":[]},"raised_back_of_hand_tone3":{"unicode":"1f91a-1f3fd","unicode_alt":"","code_decimal":"🤚🏽","name":"raised back of hand tone 3","shortname":":raised_back_of_hand_tone3:","category":"people","emoji_order":"1215","aliases":[":back_of_hand_tone3:"],"aliases_ascii":[],"keywords":[]},"raised_back_of_hand_tone4":{"unicode":"1f91a-1f3fe","unicode_alt":"","code_decimal":"🤚🏾","name":"raised back of hand tone 4","shortname":":raised_back_of_hand_tone4:","category":"people","emoji_order":"1216","aliases":[":back_of_hand_tone4:"],"aliases_ascii":[],"keywords":[]},"raised_back_of_hand_tone5":{"unicode":"1f91a-1f3ff","unicode_alt":"","code_decimal":"🤚🏿","name":"raised back of hand tone 5","shortname":":raised_back_of_hand_tone5:","category":"people","emoji_order":"1217","aliases":[":back_of_hand_tone5:"],"aliases_ascii":[],"keywords":[]},"wave":{"unicode":"1f44b","unicode_alt":"","code_decimal":"👋","name":"waving hand sign","shortname":":wave:","category":"people","emoji_order":"1218","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity"]},"wave_tone1":{"unicode":"1f44b-1f3fb","unicode_alt":"","code_decimal":"👋🏻","name":"waving hand sign tone 1","shortname":":wave_tone1:","category":"people","emoji_order":"1219","aliases":[],"aliases_ascii":[],"keywords":[]},"wave_tone2":{"unicode":"1f44b-1f3fc","unicode_alt":"","code_decimal":"👋🏼","name":"waving hand sign tone 2","shortname":":wave_tone2:","category":"people","emoji_order":"1220","aliases":[],"aliases_ascii":[],"keywords":[]},"wave_tone3":{"unicode":"1f44b-1f3fd","unicode_alt":"","code_decimal":"👋🏽","name":"waving hand sign tone 3","shortname":":wave_tone3:","category":"people","emoji_order":"1221","aliases":[],"aliases_ascii":[],"keywords":[]},"wave_tone4":{"unicode":"1f44b-1f3fe","unicode_alt":"","code_decimal":"👋🏾","name":"waving hand sign tone 4","shortname":":wave_tone4:","category":"people","emoji_order":"1222","aliases":[],"aliases_ascii":[],"keywords":[]},"wave_tone5":{"unicode":"1f44b-1f3ff","unicode_alt":"","code_decimal":"👋🏿","name":"waving hand sign tone 5","shortname":":wave_tone5:","category":"people","emoji_order":"1223","aliases":[],"aliases_ascii":[],"keywords":[]},"clap":{"unicode":"1f44f","unicode_alt":"","code_decimal":"👏","name":"clapping hands sign","shortname":":clap:","category":"people","emoji_order":"1224","aliases":[],"aliases_ascii":[],"keywords":["body","hands","win","diversity","good","beautiful"]},"clap_tone1":{"unicode":"1f44f-1f3fb","unicode_alt":"","code_decimal":"👏🏻","name":"clapping hands sign tone 1","shortname":":clap_tone1:","category":"people","emoji_order":"1225","aliases":[],"aliases_ascii":[],"keywords":[]},"clap_tone2":{"unicode":"1f44f-1f3fc","unicode_alt":"","code_decimal":"👏🏼","name":"clapping hands sign tone 2","shortname":":clap_tone2:","category":"people","emoji_order":"1226","aliases":[],"aliases_ascii":[],"keywords":[]},"clap_tone3":{"unicode":"1f44f-1f3fd","unicode_alt":"","code_decimal":"👏🏽","name":"clapping hands sign tone 3","shortname":":clap_tone3:","category":"people","emoji_order":"1227","aliases":[],"aliases_ascii":[],"keywords":[]},"clap_tone4":{"unicode":"1f44f-1f3fe","unicode_alt":"","code_decimal":"👏🏾","name":"clapping hands sign tone 4","shortname":":clap_tone4:","category":"people","emoji_order":"1228","aliases":[],"aliases_ascii":[],"keywords":[]},"clap_tone5":{"unicode":"1f44f-1f3ff","unicode_alt":"","code_decimal":"👏🏿","name":"clapping hands sign tone 5","shortname":":clap_tone5:","category":"people","emoji_order":"1229","aliases":[],"aliases_ascii":[],"keywords":[]},"writing_hand":{"unicode":"270d","unicode_alt":"270d-fe0f","code_decimal":"✍","name":"writing hand","shortname":":writing_hand:","category":"people","emoji_order":"1230","aliases":[],"aliases_ascii":[],"keywords":["body","hands","write","diversity"]},"writing_hand_tone1":{"unicode":"270d-1f3fb","unicode_alt":"","code_decimal":"✍🏻","name":"writing hand tone 1","shortname":":writing_hand_tone1:","category":"people","emoji_order":"1231","aliases":[],"aliases_ascii":[],"keywords":[]},"writing_hand_tone2":{"unicode":"270d-1f3fc","unicode_alt":"","code_decimal":"✍🏼","name":"writing hand tone 2","shortname":":writing_hand_tone2:","category":"people","emoji_order":"1232","aliases":[],"aliases_ascii":[],"keywords":[]},"writing_hand_tone3":{"unicode":"270d-1f3fd","unicode_alt":"","code_decimal":"✍🏽","name":"writing hand tone 3","shortname":":writing_hand_tone3:","category":"people","emoji_order":"1233","aliases":[],"aliases_ascii":[],"keywords":[]},"writing_hand_tone4":{"unicode":"270d-1f3fe","unicode_alt":"","code_decimal":"✍🏾","name":"writing hand tone 4","shortname":":writing_hand_tone4:","category":"people","emoji_order":"1234","aliases":[],"aliases_ascii":[],"keywords":[]},"writing_hand_tone5":{"unicode":"270d-1f3ff","unicode_alt":"","code_decimal":"✍🏿","name":"writing hand tone 5","shortname":":writing_hand_tone5:","category":"people","emoji_order":"1235","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands":{"unicode":"1f450","unicode_alt":"","code_decimal":"👐","name":"open hands sign","shortname":":open_hands:","category":"people","emoji_order":"1236","aliases":[],"aliases_ascii":[],"keywords":["body","hands","diversity","condolence"]},"open_hands_tone1":{"unicode":"1f450-1f3fb","unicode_alt":"","code_decimal":"👐🏻","name":"open hands sign tone 1","shortname":":open_hands_tone1:","category":"people","emoji_order":"1237","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands_tone2":{"unicode":"1f450-1f3fc","unicode_alt":"","code_decimal":"👐🏼","name":"open hands sign tone 2","shortname":":open_hands_tone2:","category":"people","emoji_order":"1238","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands_tone3":{"unicode":"1f450-1f3fd","unicode_alt":"","code_decimal":"👐🏽","name":"open hands sign tone 3","shortname":":open_hands_tone3:","category":"people","emoji_order":"1239","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands_tone4":{"unicode":"1f450-1f3fe","unicode_alt":"","code_decimal":"👐🏾","name":"open hands sign tone 4","shortname":":open_hands_tone4:","category":"people","emoji_order":"1240","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands_tone5":{"unicode":"1f450-1f3ff","unicode_alt":"","code_decimal":"👐🏿","name":"open hands sign tone 5","shortname":":open_hands_tone5:","category":"people","emoji_order":"1241","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hands":{"unicode":"1f64c","unicode_alt":"","code_decimal":"🙌","name":"person raising both hands in celebration","shortname":":raised_hands:","category":"people","emoji_order":"1242","aliases":[],"aliases_ascii":[],"keywords":["body","hands","diversity","perfect","good","parties"]},"raised_hands_tone1":{"unicode":"1f64c-1f3fb","unicode_alt":"","code_decimal":"🙌🏻","name":"person raising both hands in celebration tone 1","shortname":":raised_hands_tone1:","category":"people","emoji_order":"1243","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hands_tone2":{"unicode":"1f64c-1f3fc","unicode_alt":"","code_decimal":"🙌🏼","name":"person raising both hands in celebration tone 2","shortname":":raised_hands_tone2:","category":"people","emoji_order":"1244","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hands_tone3":{"unicode":"1f64c-1f3fd","unicode_alt":"","code_decimal":"🙌🏽","name":"person raising both hands in celebration tone 3","shortname":":raised_hands_tone3:","category":"people","emoji_order":"1245","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hands_tone4":{"unicode":"1f64c-1f3fe","unicode_alt":"","code_decimal":"🙌🏾","name":"person raising both hands in celebration tone 4","shortname":":raised_hands_tone4:","category":"people","emoji_order":"1246","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hands_tone5":{"unicode":"1f64c-1f3ff","unicode_alt":"","code_decimal":"🙌🏿","name":"person raising both hands in celebration tone 5","shortname":":raised_hands_tone5:","category":"people","emoji_order":"1247","aliases":[],"aliases_ascii":[],"keywords":[]},"pray":{"unicode":"1f64f","unicode_alt":"","code_decimal":"🙏","name":"person with folded hands","shortname":":pray:","category":"people","emoji_order":"1248","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","luck","thank you","pray","diversity","scientology"]},"pray_tone1":{"unicode":"1f64f-1f3fb","unicode_alt":"","code_decimal":"🙏🏻","name":"person with folded hands tone 1","shortname":":pray_tone1:","category":"people","emoji_order":"1249","aliases":[],"aliases_ascii":[],"keywords":[]},"pray_tone2":{"unicode":"1f64f-1f3fc","unicode_alt":"","code_decimal":"🙏🏼","name":"person with folded hands tone 2","shortname":":pray_tone2:","category":"people","emoji_order":"1250","aliases":[],"aliases_ascii":[],"keywords":[]},"pray_tone3":{"unicode":"1f64f-1f3fd","unicode_alt":"","code_decimal":"🙏🏽","name":"person with folded hands tone 3","shortname":":pray_tone3:","category":"people","emoji_order":"1251","aliases":[],"aliases_ascii":[],"keywords":[]},"pray_tone4":{"unicode":"1f64f-1f3fe","unicode_alt":"","code_decimal":"🙏🏾","name":"person with folded hands tone 4","shortname":":pray_tone4:","category":"people","emoji_order":"1252","aliases":[],"aliases_ascii":[],"keywords":[]},"pray_tone5":{"unicode":"1f64f-1f3ff","unicode_alt":"","code_decimal":"🙏🏿","name":"person with folded hands tone 5","shortname":":pray_tone5:","category":"people","emoji_order":"1253","aliases":[],"aliases_ascii":[],"keywords":[]},"handshake":{"unicode":"1f91d","unicode_alt":"","code_decimal":"🤝","name":"handshake","shortname":":handshake:","category":"people","emoji_order":"1254","aliases":[":shaking_hands:"],"aliases_ascii":[],"keywords":[]},"handshake_tone1":{"unicode":"1f91d-1f3fb","unicode_alt":"","code_decimal":"🤝🏻","name":"handshake tone 1","shortname":":handshake_tone1:","category":"people","emoji_order":"1255","aliases":[":shaking_hands_tone1:"],"aliases_ascii":[],"keywords":[]},"handshake_tone2":{"unicode":"1f91d-1f3fc","unicode_alt":"","code_decimal":"🤝🏼","name":"handshake tone 2","shortname":":handshake_tone2:","category":"people","emoji_order":"1256","aliases":[":shaking_hands_tone2:"],"aliases_ascii":[],"keywords":[]},"handshake_tone3":{"unicode":"1f91d-1f3fd","unicode_alt":"","code_decimal":"🤝🏽","name":"handshake tone 3","shortname":":handshake_tone3:","category":"people","emoji_order":"1257","aliases":[":shaking_hands_tone3:"],"aliases_ascii":[],"keywords":[]},"handshake_tone4":{"unicode":"1f91d-1f3fe","unicode_alt":"","code_decimal":"🤝🏾","name":"handshake tone 4","shortname":":handshake_tone4:","category":"people","emoji_order":"1258","aliases":[":shaking_hands_tone4:"],"aliases_ascii":[],"keywords":[]},"handshake_tone5":{"unicode":"1f91d-1f3ff","unicode_alt":"","code_decimal":"🤝🏿","name":"handshake tone 5","shortname":":handshake_tone5:","category":"people","emoji_order":"1259","aliases":[":shaking_hands_tone5:"],"aliases_ascii":[],"keywords":[]},"nail_care":{"unicode":"1f485","unicode_alt":"","code_decimal":"💅","name":"nail polish","shortname":":nail_care:","category":"people","emoji_order":"1260","aliases":[],"aliases_ascii":[],"keywords":["women","body","hands","nailpolish","diversity","girls night"]},"nail_care_tone1":{"unicode":"1f485-1f3fb","unicode_alt":"","code_decimal":"💅🏻","name":"nail polish tone 1","shortname":":nail_care_tone1:","category":"people","emoji_order":"1261","aliases":[],"aliases_ascii":[],"keywords":[]},"nail_care_tone2":{"unicode":"1f485-1f3fc","unicode_alt":"","code_decimal":"💅🏼","name":"nail polish tone 2","shortname":":nail_care_tone2:","category":"people","emoji_order":"1262","aliases":[],"aliases_ascii":[],"keywords":[]},"nail_care_tone3":{"unicode":"1f485-1f3fd","unicode_alt":"","code_decimal":"💅🏽","name":"nail polish tone 3","shortname":":nail_care_tone3:","category":"people","emoji_order":"1263","aliases":[],"aliases_ascii":[],"keywords":[]},"nail_care_tone4":{"unicode":"1f485-1f3fe","unicode_alt":"","code_decimal":"💅🏾","name":"nail polish tone 4","shortname":":nail_care_tone4:","category":"people","emoji_order":"1264","aliases":[],"aliases_ascii":[],"keywords":[]},"nail_care_tone5":{"unicode":"1f485-1f3ff","unicode_alt":"","code_decimal":"💅🏿","name":"nail polish tone 5","shortname":":nail_care_tone5:","category":"people","emoji_order":"1265","aliases":[],"aliases_ascii":[],"keywords":[]},"ear":{"unicode":"1f442","unicode_alt":"","code_decimal":"👂","name":"ear","shortname":":ear:","category":"people","emoji_order":"1266","aliases":[],"aliases_ascii":[],"keywords":["body","diversity"]},"ear_tone1":{"unicode":"1f442-1f3fb","unicode_alt":"","code_decimal":"👂🏻","name":"ear tone 1","shortname":":ear_tone1:","category":"people","emoji_order":"1267","aliases":[],"aliases_ascii":[],"keywords":[]},"ear_tone2":{"unicode":"1f442-1f3fc","unicode_alt":"","code_decimal":"👂🏼","name":"ear tone 2","shortname":":ear_tone2:","category":"people","emoji_order":"1268","aliases":[],"aliases_ascii":[],"keywords":[]},"ear_tone3":{"unicode":"1f442-1f3fd","unicode_alt":"","code_decimal":"👂🏽","name":"ear tone 3","shortname":":ear_tone3:","category":"people","emoji_order":"1269","aliases":[],"aliases_ascii":[],"keywords":[]},"ear_tone4":{"unicode":"1f442-1f3fe","unicode_alt":"","code_decimal":"👂🏾","name":"ear tone 4","shortname":":ear_tone4:","category":"people","emoji_order":"1270","aliases":[],"aliases_ascii":[],"keywords":[]},"ear_tone5":{"unicode":"1f442-1f3ff","unicode_alt":"","code_decimal":"👂🏿","name":"ear tone 5","shortname":":ear_tone5:","category":"people","emoji_order":"1271","aliases":[],"aliases_ascii":[],"keywords":[]},"nose":{"unicode":"1f443","unicode_alt":"","code_decimal":"👃","name":"nose","shortname":":nose:","category":"people","emoji_order":"1272","aliases":[],"aliases_ascii":[],"keywords":["body","diversity"]},"nose_tone1":{"unicode":"1f443-1f3fb","unicode_alt":"","code_decimal":"👃🏻","name":"nose tone 1","shortname":":nose_tone1:","category":"people","emoji_order":"1273","aliases":[],"aliases_ascii":[],"keywords":[]},"nose_tone2":{"unicode":"1f443-1f3fc","unicode_alt":"","code_decimal":"👃🏼","name":"nose tone 2","shortname":":nose_tone2:","category":"people","emoji_order":"1274","aliases":[],"aliases_ascii":[],"keywords":[]},"nose_tone3":{"unicode":"1f443-1f3fd","unicode_alt":"","code_decimal":"👃🏽","name":"nose tone 3","shortname":":nose_tone3:","category":"people","emoji_order":"1275","aliases":[],"aliases_ascii":[],"keywords":[]},"nose_tone4":{"unicode":"1f443-1f3fe","unicode_alt":"","code_decimal":"👃🏾","name":"nose tone 4","shortname":":nose_tone4:","category":"people","emoji_order":"1276","aliases":[],"aliases_ascii":[],"keywords":[]},"nose_tone5":{"unicode":"1f443-1f3ff","unicode_alt":"","code_decimal":"👃🏿","name":"nose tone 5","shortname":":nose_tone5:","category":"people","emoji_order":"1277","aliases":[],"aliases_ascii":[],"keywords":[]},"footprints":{"unicode":"1f463","unicode_alt":"","code_decimal":"👣","name":"footprints","shortname":":footprints:","category":"people","emoji_order":"1278","aliases":[],"aliases_ascii":[],"keywords":[]},"eyes":{"unicode":"1f440","unicode_alt":"","code_decimal":"👀","name":"eyes","shortname":":eyes:","category":"people","emoji_order":"1279","aliases":[],"aliases_ascii":[],"keywords":["body","eyes"]},"eye":{"unicode":"1f441","unicode_alt":"1f441-fe0f","code_decimal":"👁","name":"eye","shortname":":eye:","category":"people","emoji_order":"1280","aliases":[],"aliases_ascii":[],"keywords":["body","eyes"]},"eye_in_speech_bubble":{"unicode":"1f441-1f5e8","unicode_alt":"1f441-200d-1f5e8","code_decimal":"👁🗨","name":"eye in speech bubble","shortname":":eye_in_speech_bubble:","category":"symbols","emoji_order":"1281","aliases":[],"aliases_ascii":[],"keywords":["object","symbol","eyes","talk"]},"tongue":{"unicode":"1f445","unicode_alt":"","code_decimal":"👅","name":"tongue","shortname":":tongue:","category":"people","emoji_order":"1282","aliases":[],"aliases_ascii":[],"keywords":["body","sexy","lip"]},"lips":{"unicode":"1f444","unicode_alt":"","code_decimal":"👄","name":"mouth","shortname":":lips:","category":"people","emoji_order":"1283","aliases":[],"aliases_ascii":[],"keywords":["women","body","sexy","lip"]},"kiss":{"unicode":"1f48b","unicode_alt":"","code_decimal":"💋","name":"kiss mark","shortname":":kiss:","category":"people","emoji_order":"1284","aliases":[],"aliases_ascii":[],"keywords":["women","love","sexy","lip","beautiful","girls night"]},"cupid":{"unicode":"1f498","unicode_alt":"","code_decimal":"💘","name":"heart with arrow","shortname":":cupid:","category":"symbols","emoji_order":"1285","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"heart":{"unicode":"2764","unicode_alt":"2764-fe0f","code_decimal":"❤","name":"heavy black heart","shortname":":heart:","category":"symbols","emoji_order":"1286","aliases":[],"aliases_ascii":["<3"],"keywords":["love","symbol","parties"]},"heartbeat":{"unicode":"1f493","unicode_alt":"","code_decimal":"💓","name":"beating heart","shortname":":heartbeat:","category":"symbols","emoji_order":"1287","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"broken_heart":{"unicode":"1f494","unicode_alt":"","code_decimal":"💔","name":"broken heart","shortname":":broken_heart:","category":"symbols","emoji_order":"1288","aliases":[],"aliases_ascii":["<\/3"],"keywords":["love","symbol","heartbreak"]},"two_hearts":{"unicode":"1f495","unicode_alt":"","code_decimal":"💕","name":"two hearts","shortname":":two_hearts:","category":"symbols","emoji_order":"1289","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"sparkling_heart":{"unicode":"1f496","unicode_alt":"","code_decimal":"💖","name":"sparkling heart","shortname":":sparkling_heart:","category":"symbols","emoji_order":"1290","aliases":[],"aliases_ascii":[],"keywords":["love","symbol","girls night"]},"heartpulse":{"unicode":"1f497","unicode_alt":"","code_decimal":"💗","name":"growing heart","shortname":":heartpulse:","category":"symbols","emoji_order":"1291","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"blue_heart":{"unicode":"1f499","unicode_alt":"","code_decimal":"💙","name":"blue heart","shortname":":blue_heart:","category":"symbols","emoji_order":"1292","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"green_heart":{"unicode":"1f49a","unicode_alt":"","code_decimal":"💚","name":"green heart","shortname":":green_heart:","category":"symbols","emoji_order":"1293","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"yellow_heart":{"unicode":"1f49b","unicode_alt":"","code_decimal":"💛","name":"yellow heart","shortname":":yellow_heart:","category":"symbols","emoji_order":"1294","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"purple_heart":{"unicode":"1f49c","unicode_alt":"","code_decimal":"💜","name":"purple heart","shortname":":purple_heart:","category":"symbols","emoji_order":"1295","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"black_heart":{"unicode":"1f5a4","unicode_alt":"","code_decimal":"🖤","name":"black heart","shortname":":black_heart:","category":"symbols","emoji_order":"1296","aliases":[],"aliases_ascii":[],"keywords":[]},"gift_heart":{"unicode":"1f49d","unicode_alt":"","code_decimal":"💝","name":"heart with ribbon","shortname":":gift_heart:","category":"symbols","emoji_order":"1297","aliases":[],"aliases_ascii":[],"keywords":["love","symbol","condolence"]},"revolving_hearts":{"unicode":"1f49e","unicode_alt":"","code_decimal":"💞","name":"revolving hearts","shortname":":revolving_hearts:","category":"symbols","emoji_order":"1298","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"heart_decoration":{"unicode":"1f49f","unicode_alt":"","code_decimal":"💟","name":"heart decoration","shortname":":heart_decoration:","category":"symbols","emoji_order":"1299","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"heart_exclamation":{"unicode":"2763","unicode_alt":"2763-fe0f","code_decimal":"❣","name":"heavy heart exclamation mark ornament","shortname":":heart_exclamation:","category":"symbols","emoji_order":"1300","aliases":[":heavy_heart_exclamation_mark_ornament:"],"aliases_ascii":[],"keywords":["love","symbol"]},"love_letter":{"unicode":"1f48c","unicode_alt":"","code_decimal":"💌","name":"love letter","shortname":":love_letter:","category":"objects","emoji_order":"1301","aliases":[],"aliases_ascii":[],"keywords":["object"]},"zzz":{"unicode":"1f4a4","unicode_alt":"","code_decimal":"💤","name":"sleeping symbol","shortname":":zzz:","category":"people","emoji_order":"1302","aliases":[],"aliases_ascii":[],"keywords":["tired","goodnight"]},"anger":{"unicode":"1f4a2","unicode_alt":"","code_decimal":"💢","name":"anger symbol","shortname":":anger:","category":"symbols","emoji_order":"1303","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"bomb":{"unicode":"1f4a3","unicode_alt":"","code_decimal":"💣","name":"bomb","shortname":":bomb:","category":"objects","emoji_order":"1304","aliases":[],"aliases_ascii":[],"keywords":["object","weapon","dead","blast"]},"boom":{"unicode":"1f4a5","unicode_alt":"","code_decimal":"💥","name":"collision symbol","shortname":":boom:","category":"symbols","emoji_order":"1305","aliases":[],"aliases_ascii":[],"keywords":["symbol","blast"]},"sweat_drops":{"unicode":"1f4a6","unicode_alt":"","code_decimal":"💦","name":"splashing sweat symbol","shortname":":sweat_drops:","category":"nature","emoji_order":"1306","aliases":[],"aliases_ascii":[],"keywords":["rain","stressed","sweat"]},"dash":{"unicode":"1f4a8","unicode_alt":"","code_decimal":"💨","name":"dash symbol","shortname":":dash:","category":"nature","emoji_order":"1307","aliases":[],"aliases_ascii":[],"keywords":["cloud","cold","smoking"]},"dizzy":{"unicode":"1f4ab","unicode_alt":"","code_decimal":"💫","name":"dizzy symbol","shortname":":dizzy:","category":"symbols","emoji_order":"1308","aliases":[],"aliases_ascii":[],"keywords":["star","symbol"]},"speech_balloon":{"unicode":"1f4ac","unicode_alt":"","code_decimal":"💬","name":"speech balloon","shortname":":speech_balloon:","category":"symbols","emoji_order":"1309","aliases":[],"aliases_ascii":[],"keywords":["symbol","free speech"]},"speech_left":{"unicode":"1f5e8","unicode_alt":"1f5e8-fe0f","code_decimal":"🗨","name":"left speech bubble","shortname":":speech_left:","category":"symbols","emoji_order":"1310","aliases":[":left_speech_bubble:"],"aliases_ascii":[],"keywords":[]},"anger_right":{"unicode":"1f5ef","unicode_alt":"1f5ef-fe0f","code_decimal":"🗯","name":"right anger bubble","shortname":":anger_right:","category":"symbols","emoji_order":"1311","aliases":[":right_anger_bubble:"],"aliases_ascii":[],"keywords":["symbol"]},"thought_balloon":{"unicode":"1f4ad","unicode_alt":"","code_decimal":"💭","name":"thought balloon","shortname":":thought_balloon:","category":"symbols","emoji_order":"1312","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"hole":{"unicode":"1f573","unicode_alt":"1f573-fe0f","code_decimal":"🕳","name":"hole","shortname":":hole:","category":"objects","emoji_order":"1313","aliases":[],"aliases_ascii":[],"keywords":["object"]},"eyeglasses":{"unicode":"1f453","unicode_alt":"","code_decimal":"👓","name":"eyeglasses","shortname":":eyeglasses:","category":"people","emoji_order":"1314","aliases":[],"aliases_ascii":[],"keywords":["fashion","glasses","accessories"]},"dark_sunglasses":{"unicode":"1f576","unicode_alt":"1f576-fe0f","code_decimal":"🕶","name":"dark sunglasses","shortname":":dark_sunglasses:","category":"people","emoji_order":"1315","aliases":[],"aliases_ascii":[],"keywords":["fashion","glasses","accessories"]},"necktie":{"unicode":"1f454","unicode_alt":"","code_decimal":"👔","name":"necktie","shortname":":necktie:","category":"people","emoji_order":"1316","aliases":[],"aliases_ascii":[],"keywords":["fashion"]},"shirt":{"unicode":"1f455","unicode_alt":"","code_decimal":"👕","name":"t-shirt","shortname":":shirt:","category":"people","emoji_order":"1317","aliases":[],"aliases_ascii":[],"keywords":["fashion"]},"jeans":{"unicode":"1f456","unicode_alt":"","code_decimal":"👖","name":"jeans","shortname":":jeans:","category":"people","emoji_order":"1318","aliases":[],"aliases_ascii":[],"keywords":["fashion"]},"dress":{"unicode":"1f457","unicode_alt":"","code_decimal":"👗","name":"dress","shortname":":dress:","category":"people","emoji_order":"1319","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","sexy","girls night"]},"kimono":{"unicode":"1f458","unicode_alt":"","code_decimal":"👘","name":"kimono","shortname":":kimono:","category":"people","emoji_order":"1320","aliases":[],"aliases_ascii":[],"keywords":["fashion"]},"bikini":{"unicode":"1f459","unicode_alt":"","code_decimal":"👙","name":"bikini","shortname":":bikini:","category":"people","emoji_order":"1321","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","sexy","vacation","tropical","swim"]},"womans_clothes":{"unicode":"1f45a","unicode_alt":"","code_decimal":"👚","name":"womans clothes","shortname":":womans_clothes:","category":"people","emoji_order":"1322","aliases":[],"aliases_ascii":[],"keywords":["women","fashion"]},"purse":{"unicode":"1f45b","unicode_alt":"","code_decimal":"👛","name":"purse","shortname":":purse:","category":"people","emoji_order":"1323","aliases":[],"aliases_ascii":[],"keywords":["bag","women","fashion","accessories","money"]},"handbag":{"unicode":"1f45c","unicode_alt":"","code_decimal":"👜","name":"handbag","shortname":":handbag:","category":"people","emoji_order":"1324","aliases":[],"aliases_ascii":[],"keywords":["bag","women","fashion","vacation","accessories"]},"pouch":{"unicode":"1f45d","unicode_alt":"","code_decimal":"👝","name":"pouch","shortname":":pouch:","category":"people","emoji_order":"1325","aliases":[],"aliases_ascii":[],"keywords":["bag","women","fashion","accessories"]},"shopping_bags":{"unicode":"1f6cd","unicode_alt":"1f6cd-fe0f","code_decimal":"🛍","name":"shopping bags","shortname":":shopping_bags:","category":"objects","emoji_order":"1326","aliases":[],"aliases_ascii":[],"keywords":["object","birthday","parties"]},"school_satchel":{"unicode":"1f392","unicode_alt":"","code_decimal":"🎒","name":"school satchel","shortname":":school_satchel:","category":"people","emoji_order":"1327","aliases":[],"aliases_ascii":[],"keywords":["bag","fashion","office","vacation","accessories"]},"mans_shoe":{"unicode":"1f45e","unicode_alt":"","code_decimal":"👞","name":"mans shoe","shortname":":mans_shoe:","category":"people","emoji_order":"1328","aliases":[],"aliases_ascii":[],"keywords":["fashion","shoe","accessories"]},"athletic_shoe":{"unicode":"1f45f","unicode_alt":"","code_decimal":"👟","name":"athletic shoe","shortname":":athletic_shoe:","category":"people","emoji_order":"1329","aliases":[],"aliases_ascii":[],"keywords":["fashion","shoe","accessories","boys night"]},"high_heel":{"unicode":"1f460","unicode_alt":"","code_decimal":"👠","name":"high-heeled shoe","shortname":":high_heel:","category":"people","emoji_order":"1330","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","shoe","sexy","accessories","girls night"]},"sandal":{"unicode":"1f461","unicode_alt":"","code_decimal":"👡","name":"womans sandal","shortname":":sandal:","category":"people","emoji_order":"1331","aliases":[],"aliases_ascii":[],"keywords":["fashion","shoe","accessories"]},"boot":{"unicode":"1f462","unicode_alt":"","code_decimal":"👢","name":"womans boots","shortname":":boot:","category":"people","emoji_order":"1332","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","shoe","sexy","accessories"]},"crown":{"unicode":"1f451","unicode_alt":"","code_decimal":"👑","name":"crown","shortname":":crown:","category":"people","emoji_order":"1333","aliases":[],"aliases_ascii":[],"keywords":["object","gem","accessories"]},"womans_hat":{"unicode":"1f452","unicode_alt":"","code_decimal":"👒","name":"womans hat","shortname":":womans_hat:","category":"people","emoji_order":"1334","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","accessories"]},"tophat":{"unicode":"1f3a9","unicode_alt":"","code_decimal":"🎩","name":"top hat","shortname":":tophat:","category":"people","emoji_order":"1335","aliases":[],"aliases_ascii":[],"keywords":["hat","fashion","accessories"]},"mortar_board":{"unicode":"1f393","unicode_alt":"","code_decimal":"🎓","name":"graduation cap","shortname":":mortar_board:","category":"people","emoji_order":"1336","aliases":[],"aliases_ascii":[],"keywords":["hat","office","accessories"]},"helmet_with_cross":{"unicode":"26d1","unicode_alt":"26d1-fe0f","code_decimal":"⛑","name":"helmet with white cross","shortname":":helmet_with_cross:","category":"people","emoji_order":"1337","aliases":[":helmet_with_white_cross:"],"aliases_ascii":[],"keywords":["object","hat","accessories","job"]},"prayer_beads":{"unicode":"1f4ff","unicode_alt":"","code_decimal":"📿","name":"prayer beads","shortname":":prayer_beads:","category":"objects","emoji_order":"1338","aliases":[],"aliases_ascii":[],"keywords":["object","rosary"]},"lipstick":{"unicode":"1f484","unicode_alt":"","code_decimal":"💄","name":"lipstick","shortname":":lipstick:","category":"people","emoji_order":"1339","aliases":[],"aliases_ascii":[],"keywords":["object","women","fashion","sexy","lip"]},"ring":{"unicode":"1f48d","unicode_alt":"","code_decimal":"💍","name":"ring","shortname":":ring:","category":"people","emoji_order":"1340","aliases":[],"aliases_ascii":[],"keywords":["wedding","object","fashion","gem","accessories"]},"gem":{"unicode":"1f48e","unicode_alt":"","code_decimal":"💎","name":"gem stone","shortname":":gem:","category":"objects","emoji_order":"1341","aliases":[],"aliases_ascii":[],"keywords":["object","gem"]},"monkey_face":{"unicode":"1f435","unicode_alt":"","code_decimal":"🐵","name":"monkey face","shortname":":monkey_face:","category":"nature","emoji_order":"1342","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"monkey":{"unicode":"1f412","unicode_alt":"","code_decimal":"🐒","name":"monkey","shortname":":monkey:","category":"nature","emoji_order":"1343","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"gorilla":{"unicode":"1f98d","unicode_alt":"","code_decimal":"🦍","name":"gorilla","shortname":":gorilla:","category":"nature","emoji_order":"1344","aliases":[],"aliases_ascii":[],"keywords":[]},"dog":{"unicode":"1f436","unicode_alt":"","code_decimal":"🐶","name":"dog face","shortname":":dog:","category":"nature","emoji_order":"1345","aliases":[],"aliases_ascii":[],"keywords":["dog","pug","animal"]},"dog2":{"unicode":"1f415","unicode_alt":"","code_decimal":"🐕","name":"dog","shortname":":dog2:","category":"nature","emoji_order":"1346","aliases":[],"aliases_ascii":[],"keywords":["dog","pug","animal"]},"poodle":{"unicode":"1f429","unicode_alt":"","code_decimal":"🐩","name":"poodle","shortname":":poodle:","category":"nature","emoji_order":"1347","aliases":[],"aliases_ascii":[],"keywords":["dog","animal"]},"wolf":{"unicode":"1f43a","unicode_alt":"","code_decimal":"🐺","name":"wolf face","shortname":":wolf:","category":"nature","emoji_order":"1348","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal"]},"fox":{"unicode":"1f98a","unicode_alt":"","code_decimal":"🦊","name":"fox face","shortname":":fox:","category":"nature","emoji_order":"1349","aliases":[":fox_face:"],"aliases_ascii":[],"keywords":[]},"cat":{"unicode":"1f431","unicode_alt":"","code_decimal":"🐱","name":"cat face","shortname":":cat:","category":"nature","emoji_order":"1350","aliases":[],"aliases_ascii":[],"keywords":["halloween","vagina","cat","animal"]},"cat2":{"unicode":"1f408","unicode_alt":"","code_decimal":"🐈","name":"cat","shortname":":cat2:","category":"nature","emoji_order":"1351","aliases":[],"aliases_ascii":[],"keywords":["halloween","cat","animal"]},"lion_face":{"unicode":"1f981","unicode_alt":"","code_decimal":"🦁","name":"lion face","shortname":":lion_face:","category":"nature","emoji_order":"1352","aliases":[":lion:"],"aliases_ascii":[],"keywords":["wildlife","roar","cat","animal"]},"tiger":{"unicode":"1f42f","unicode_alt":"","code_decimal":"🐯","name":"tiger face","shortname":":tiger:","category":"nature","emoji_order":"1353","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","cat","animal"]},"tiger2":{"unicode":"1f405","unicode_alt":"","code_decimal":"🐅","name":"tiger","shortname":":tiger2:","category":"nature","emoji_order":"1354","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal"]},"leopard":{"unicode":"1f406","unicode_alt":"","code_decimal":"🐆","name":"leopard","shortname":":leopard:","category":"nature","emoji_order":"1355","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal"]},"horse":{"unicode":"1f434","unicode_alt":"","code_decimal":"🐴","name":"horse face","shortname":":horse:","category":"nature","emoji_order":"1356","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"racehorse":{"unicode":"1f40e","unicode_alt":"","code_decimal":"🐎","name":"horse","shortname":":racehorse:","category":"nature","emoji_order":"1357","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"deer":{"unicode":"1f98c","unicode_alt":"","code_decimal":"🦌","name":"deer","shortname":":deer:","category":"nature","emoji_order":"1358","aliases":[],"aliases_ascii":[],"keywords":[]},"unicorn":{"unicode":"1f984","unicode_alt":"","code_decimal":"🦄","name":"unicorn face","shortname":":unicorn:","category":"nature","emoji_order":"1359","aliases":[":unicorn_face:"],"aliases_ascii":[],"keywords":["animal"]},"cow":{"unicode":"1f42e","unicode_alt":"","code_decimal":"🐮","name":"cow face","shortname":":cow:","category":"nature","emoji_order":"1360","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"ox":{"unicode":"1f402","unicode_alt":"","code_decimal":"🐂","name":"ox","shortname":":ox:","category":"nature","emoji_order":"1361","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"water_buffalo":{"unicode":"1f403","unicode_alt":"","code_decimal":"🐃","name":"water buffalo","shortname":":water_buffalo:","category":"nature","emoji_order":"1362","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"cow2":{"unicode":"1f404","unicode_alt":"","code_decimal":"🐄","name":"cow","shortname":":cow2:","category":"nature","emoji_order":"1363","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"pig":{"unicode":"1f437","unicode_alt":"","code_decimal":"🐷","name":"pig face","shortname":":pig:","category":"nature","emoji_order":"1364","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"pig2":{"unicode":"1f416","unicode_alt":"","code_decimal":"🐖","name":"pig","shortname":":pig2:","category":"nature","emoji_order":"1365","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"boar":{"unicode":"1f417","unicode_alt":"","code_decimal":"🐗","name":"boar","shortname":":boar:","category":"nature","emoji_order":"1366","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"pig_nose":{"unicode":"1f43d","unicode_alt":"","code_decimal":"🐽","name":"pig nose","shortname":":pig_nose:","category":"nature","emoji_order":"1367","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"ram":{"unicode":"1f40f","unicode_alt":"","code_decimal":"🐏","name":"ram","shortname":":ram:","category":"nature","emoji_order":"1368","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"sheep":{"unicode":"1f411","unicode_alt":"","code_decimal":"🐑","name":"sheep","shortname":":sheep:","category":"nature","emoji_order":"1369","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"goat":{"unicode":"1f410","unicode_alt":"","code_decimal":"🐐","name":"goat","shortname":":goat:","category":"nature","emoji_order":"1370","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"dromedary_camel":{"unicode":"1f42a","unicode_alt":"","code_decimal":"🐪","name":"dromedary camel","shortname":":dromedary_camel:","category":"nature","emoji_order":"1371","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"camel":{"unicode":"1f42b","unicode_alt":"","code_decimal":"🐫","name":"bactrian camel","shortname":":camel:","category":"nature","emoji_order":"1372","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","hump day"]},"elephant":{"unicode":"1f418","unicode_alt":"","code_decimal":"🐘","name":"elephant","shortname":":elephant:","category":"nature","emoji_order":"1373","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"rhino":{"unicode":"1f98f","unicode_alt":"","code_decimal":"🦏","name":"rhinoceros","shortname":":rhino:","category":"nature","emoji_order":"1374","aliases":[":rhinoceros:"],"aliases_ascii":[],"keywords":[]},"mouse":{"unicode":"1f42d","unicode_alt":"","code_decimal":"🐭","name":"mouse face","shortname":":mouse:","category":"nature","emoji_order":"1375","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"mouse2":{"unicode":"1f401","unicode_alt":"","code_decimal":"🐁","name":"mouse","shortname":":mouse2:","category":"nature","emoji_order":"1376","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"rat":{"unicode":"1f400","unicode_alt":"","code_decimal":"🐀","name":"rat","shortname":":rat:","category":"nature","emoji_order":"1377","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"hamster":{"unicode":"1f439","unicode_alt":"","code_decimal":"🐹","name":"hamster face","shortname":":hamster:","category":"nature","emoji_order":"1378","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"rabbit":{"unicode":"1f430","unicode_alt":"","code_decimal":"🐰","name":"rabbit face","shortname":":rabbit:","category":"nature","emoji_order":"1379","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"rabbit2":{"unicode":"1f407","unicode_alt":"","code_decimal":"🐇","name":"rabbit","shortname":":rabbit2:","category":"nature","emoji_order":"1380","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"chipmunk":{"unicode":"1f43f","unicode_alt":"1f43f-fe0f","code_decimal":"🐿","name":"chipmunk","shortname":":chipmunk:","category":"nature","emoji_order":"1381","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"bat":{"unicode":"1f987","unicode_alt":"","code_decimal":"🦇","name":"bat","shortname":":bat:","category":"nature","emoji_order":"1382","aliases":[],"aliases_ascii":[],"keywords":[]},"bear":{"unicode":"1f43b","unicode_alt":"","code_decimal":"🐻","name":"bear face","shortname":":bear:","category":"nature","emoji_order":"1383","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal"]},"koala":{"unicode":"1f428","unicode_alt":"","code_decimal":"🐨","name":"koala","shortname":":koala:","category":"nature","emoji_order":"1384","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"panda_face":{"unicode":"1f43c","unicode_alt":"","code_decimal":"🐼","name":"panda face","shortname":":panda_face:","category":"nature","emoji_order":"1385","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal"]},"feet":{"unicode":"1f43e","unicode_alt":"","code_decimal":"🐾","name":"paw prints","shortname":":feet:","category":"nature","emoji_order":"1386","aliases":[":paw_prints:"],"aliases_ascii":[],"keywords":["animal"]},"turkey":{"unicode":"1f983","unicode_alt":"","code_decimal":"🦃","name":"turkey","shortname":":turkey:","category":"nature","emoji_order":"1387","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"chicken":{"unicode":"1f414","unicode_alt":"","code_decimal":"🐔","name":"chicken","shortname":":chicken:","category":"nature","emoji_order":"1388","aliases":[],"aliases_ascii":[],"keywords":["animal","chicken"]},"rooster":{"unicode":"1f413","unicode_alt":"","code_decimal":"🐓","name":"rooster","shortname":":rooster:","category":"nature","emoji_order":"1389","aliases":[],"aliases_ascii":[],"keywords":["animal"]},"hatching_chick":{"unicode":"1f423","unicode_alt":"","code_decimal":"🐣","name":"hatching chick","shortname":":hatching_chick:","category":"nature","emoji_order":"1390","aliases":[],"aliases_ascii":[],"keywords":["animal","chicken"]},"baby_chick":{"unicode":"1f424","unicode_alt":"","code_decimal":"🐤","name":"baby chick","shortname":":baby_chick:","category":"nature","emoji_order":"1391","aliases":[],"aliases_ascii":[],"keywords":["animal","chicken"]},"hatched_chick":{"unicode":"1f425","unicode_alt":"","code_decimal":"🐥","name":"front-facing baby chick","shortname":":hatched_chick:","category":"nature","emoji_order":"1392","aliases":[],"aliases_ascii":[],"keywords":["animal","chicken"]},"bird":{"unicode":"1f426","unicode_alt":"","code_decimal":"🐦","name":"bird","shortname":":bird:","category":"nature","emoji_order":"1393","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"penguin":{"unicode":"1f427","unicode_alt":"","code_decimal":"🐧","name":"penguin","shortname":":penguin:","category":"nature","emoji_order":"1394","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"dove":{"unicode":"1f54a","unicode_alt":"1f54a-fe0f","code_decimal":"🕊","name":"dove of peace","shortname":":dove:","category":"nature","emoji_order":"1395","aliases":[":dove_of_peace:"],"aliases_ascii":[],"keywords":["animal"]},"eagle":{"unicode":"1f985","unicode_alt":"","code_decimal":"🦅","name":"eagle","shortname":":eagle:","category":"nature","emoji_order":"1396","aliases":[],"aliases_ascii":[],"keywords":[]},"duck":{"unicode":"1f986","unicode_alt":"","code_decimal":"🦆","name":"duck","shortname":":duck:","category":"nature","emoji_order":"1397","aliases":[],"aliases_ascii":[],"keywords":[]},"owl":{"unicode":"1f989","unicode_alt":"","code_decimal":"🦉","name":"owl","shortname":":owl:","category":"nature","emoji_order":"1398","aliases":[],"aliases_ascii":[],"keywords":[]},"frog":{"unicode":"1f438","unicode_alt":"","code_decimal":"🐸","name":"frog face","shortname":":frog:","category":"nature","emoji_order":"1399","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"crocodile":{"unicode":"1f40a","unicode_alt":"","code_decimal":"🐊","name":"crocodile","shortname":":crocodile:","category":"nature","emoji_order":"1400","aliases":[],"aliases_ascii":[],"keywords":["wildlife","reptile","animal"]},"turtle":{"unicode":"1f422","unicode_alt":"","code_decimal":"🐢","name":"turtle","shortname":":turtle:","category":"nature","emoji_order":"1401","aliases":[],"aliases_ascii":[],"keywords":["wildlife","reptile","animal"]},"lizard":{"unicode":"1f98e","unicode_alt":"","code_decimal":"🦎","name":"lizard","shortname":":lizard:","category":"nature","emoji_order":"1402","aliases":[],"aliases_ascii":[],"keywords":[]},"snake":{"unicode":"1f40d","unicode_alt":"","code_decimal":"🐍","name":"snake","shortname":":snake:","category":"nature","emoji_order":"1403","aliases":[],"aliases_ascii":[],"keywords":["wildlife","reptile","animal","creationism"]},"dragon_face":{"unicode":"1f432","unicode_alt":"","code_decimal":"🐲","name":"dragon face","shortname":":dragon_face:","category":"nature","emoji_order":"1404","aliases":[],"aliases_ascii":[],"keywords":["roar","monster","reptile","animal"]},"dragon":{"unicode":"1f409","unicode_alt":"","code_decimal":"🐉","name":"dragon","shortname":":dragon:","category":"nature","emoji_order":"1405","aliases":[],"aliases_ascii":[],"keywords":["roar","reptile","animal"]},"whale":{"unicode":"1f433","unicode_alt":"","code_decimal":"🐳","name":"spouting whale","shortname":":whale:","category":"nature","emoji_order":"1406","aliases":[],"aliases_ascii":[],"keywords":["wildlife","tropical","whales","animal"]},"whale2":{"unicode":"1f40b","unicode_alt":"","code_decimal":"🐋","name":"whale","shortname":":whale2:","category":"nature","emoji_order":"1407","aliases":[],"aliases_ascii":[],"keywords":["wildlife","tropical","whales","animal"]},"dolphin":{"unicode":"1f42c","unicode_alt":"","code_decimal":"🐬","name":"dolphin","shortname":":dolphin:","category":"nature","emoji_order":"1408","aliases":[],"aliases_ascii":[],"keywords":["wildlife","tropical","animal"]},"fish":{"unicode":"1f41f","unicode_alt":"","code_decimal":"🐟","name":"fish","shortname":":fish:","category":"nature","emoji_order":"1409","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"tropical_fish":{"unicode":"1f420","unicode_alt":"","code_decimal":"🐠","name":"tropical fish","shortname":":tropical_fish:","category":"nature","emoji_order":"1410","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"blowfish":{"unicode":"1f421","unicode_alt":"","code_decimal":"🐡","name":"blowfish","shortname":":blowfish:","category":"nature","emoji_order":"1411","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"shark":{"unicode":"1f988","unicode_alt":"","code_decimal":"🦈","name":"shark","shortname":":shark:","category":"nature","emoji_order":"1412","aliases":[],"aliases_ascii":[],"keywords":[]},"octopus":{"unicode":"1f419","unicode_alt":"","code_decimal":"🐙","name":"octopus","shortname":":octopus:","category":"nature","emoji_order":"1413","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal"]},"shell":{"unicode":"1f41a","unicode_alt":"","code_decimal":"🐚","name":"spiral shell","shortname":":shell:","category":"nature","emoji_order":"1414","aliases":[],"aliases_ascii":[],"keywords":[]},"crab":{"unicode":"1f980","unicode_alt":"","code_decimal":"🦀","name":"crab","shortname":":crab:","category":"nature","emoji_order":"1415","aliases":[],"aliases_ascii":[],"keywords":["tropical","animal"]},"shrimp":{"unicode":"1f990","unicode_alt":"","code_decimal":"🦐","name":"shrimp","shortname":":shrimp:","category":"nature","emoji_order":"1416","aliases":[],"aliases_ascii":[],"keywords":[]},"squid":{"unicode":"1f991","unicode_alt":"","code_decimal":"🦑","name":"squid","shortname":":squid:","category":"nature","emoji_order":"1417","aliases":[],"aliases_ascii":[],"keywords":[]},"butterfly":{"unicode":"1f98b","unicode_alt":"","code_decimal":"🦋","name":"butterfly","shortname":":butterfly:","category":"nature","emoji_order":"1418","aliases":[],"aliases_ascii":[],"keywords":[]},"snail":{"unicode":"1f40c","unicode_alt":"","code_decimal":"🐌","name":"snail","shortname":":snail:","category":"nature","emoji_order":"1419","aliases":[],"aliases_ascii":[],"keywords":["insects","animal"]},"bug":{"unicode":"1f41b","unicode_alt":"","code_decimal":"🐛","name":"bug","shortname":":bug:","category":"nature","emoji_order":"1420","aliases":[],"aliases_ascii":[],"keywords":["insects","animal"]},"ant":{"unicode":"1f41c","unicode_alt":"","code_decimal":"🐜","name":"ant","shortname":":ant:","category":"nature","emoji_order":"1421","aliases":[],"aliases_ascii":[],"keywords":["insects","animal"]},"bee":{"unicode":"1f41d","unicode_alt":"","code_decimal":"🐝","name":"honeybee","shortname":":bee:","category":"nature","emoji_order":"1422","aliases":[],"aliases_ascii":[],"keywords":["insects","animal"]},"beetle":{"unicode":"1f41e","unicode_alt":"","code_decimal":"🐞","name":"lady beetle","shortname":":beetle:","category":"nature","emoji_order":"1423","aliases":[],"aliases_ascii":[],"keywords":["insects","animal"]},"spider":{"unicode":"1f577","unicode_alt":"1f577-fe0f","code_decimal":"🕷","name":"spider","shortname":":spider:","category":"nature","emoji_order":"1424","aliases":[],"aliases_ascii":[],"keywords":["insects","halloween","animal"]},"spider_web":{"unicode":"1f578","unicode_alt":"1f578-fe0f","code_decimal":"🕸","name":"spider web","shortname":":spider_web:","category":"nature","emoji_order":"1425","aliases":[],"aliases_ascii":[],"keywords":["halloween"]},"scorpion":{"unicode":"1f982","unicode_alt":"","code_decimal":"🦂","name":"scorpion","shortname":":scorpion:","category":"nature","emoji_order":"1426","aliases":[],"aliases_ascii":[],"keywords":["insects","reptile","animal"]},"bouquet":{"unicode":"1f490","unicode_alt":"","code_decimal":"💐","name":"bouquet","shortname":":bouquet:","category":"nature","emoji_order":"1427","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","rip","condolence"]},"cherry_blossom":{"unicode":"1f338","unicode_alt":"","code_decimal":"🌸","name":"cherry blossom","shortname":":cherry_blossom:","category":"nature","emoji_order":"1428","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","tropical"]},"white_flower":{"unicode":"1f4ae","unicode_alt":"","code_decimal":"💮","name":"white flower","shortname":":white_flower:","category":"symbols","emoji_order":"1429","aliases":[],"aliases_ascii":[],"keywords":["flower","symbol"]},"rosette":{"unicode":"1f3f5","unicode_alt":"1f3f5-fe0f","code_decimal":"🏵","name":"rosette","shortname":":rosette:","category":"nature","emoji_order":"1430","aliases":[],"aliases_ascii":[],"keywords":["tropical"]},"rose":{"unicode":"1f339","unicode_alt":"","code_decimal":"🌹","name":"rose","shortname":":rose:","category":"nature","emoji_order":"1431","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","rip","condolence","beautiful"]},"wilted_rose":{"unicode":"1f940","unicode_alt":"","code_decimal":"🥀","name":"wilted flower","shortname":":wilted_rose:","category":"nature","emoji_order":"1432","aliases":[":wilted_flower:"],"aliases_ascii":[],"keywords":[]},"hibiscus":{"unicode":"1f33a","unicode_alt":"","code_decimal":"🌺","name":"hibiscus","shortname":":hibiscus:","category":"nature","emoji_order":"1433","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","tropical"]},"sunflower":{"unicode":"1f33b","unicode_alt":"","code_decimal":"🌻","name":"sunflower","shortname":":sunflower:","category":"nature","emoji_order":"1434","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant"]},"blossom":{"unicode":"1f33c","unicode_alt":"","code_decimal":"🌼","name":"blossom","shortname":":blossom:","category":"nature","emoji_order":"1435","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant"]},"tulip":{"unicode":"1f337","unicode_alt":"","code_decimal":"🌷","name":"tulip","shortname":":tulip:","category":"nature","emoji_order":"1436","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","vagina","girls night"]},"seedling":{"unicode":"1f331","unicode_alt":"","code_decimal":"🌱","name":"seedling","shortname":":seedling:","category":"nature","emoji_order":"1437","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf"]},"evergreen_tree":{"unicode":"1f332","unicode_alt":"","code_decimal":"🌲","name":"evergreen tree","shortname":":evergreen_tree:","category":"nature","emoji_order":"1438","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","holidays","christmas","camp","trees"]},"deciduous_tree":{"unicode":"1f333","unicode_alt":"","code_decimal":"🌳","name":"deciduous tree","shortname":":deciduous_tree:","category":"nature","emoji_order":"1439","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","camp","trees"]},"palm_tree":{"unicode":"1f334","unicode_alt":"","code_decimal":"🌴","name":"palm tree","shortname":":palm_tree:","category":"nature","emoji_order":"1440","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","tropical","trees"]},"cactus":{"unicode":"1f335","unicode_alt":"","code_decimal":"🌵","name":"cactus","shortname":":cactus:","category":"nature","emoji_order":"1441","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","trees"]},"ear_of_rice":{"unicode":"1f33e","unicode_alt":"","code_decimal":"🌾","name":"ear of rice","shortname":":ear_of_rice:","category":"nature","emoji_order":"1442","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf"]},"herb":{"unicode":"1f33f","unicode_alt":"","code_decimal":"🌿","name":"herb","shortname":":herb:","category":"nature","emoji_order":"1443","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf"]},"shamrock":{"unicode":"2618","unicode_alt":"2618-fe0f","code_decimal":"☘","name":"shamrock","shortname":":shamrock:","category":"nature","emoji_order":"1444","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","luck","leaf"]},"four_leaf_clover":{"unicode":"1f340","unicode_alt":"","code_decimal":"🍀","name":"four leaf clover","shortname":":four_leaf_clover:","category":"nature","emoji_order":"1445","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","luck","leaf","sol"]},"maple_leaf":{"unicode":"1f341","unicode_alt":"","code_decimal":"🍁","name":"maple leaf","shortname":":maple_leaf:","category":"nature","emoji_order":"1446","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf"]},"fallen_leaf":{"unicode":"1f342","unicode_alt":"","code_decimal":"🍂","name":"fallen leaf","shortname":":fallen_leaf:","category":"nature","emoji_order":"1447","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf"]},"leaves":{"unicode":"1f343","unicode_alt":"","code_decimal":"🍃","name":"leaf fluttering in wind","shortname":":leaves:","category":"nature","emoji_order":"1448","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf"]},"grapes":{"unicode":"1f347","unicode_alt":"","code_decimal":"🍇","name":"grapes","shortname":":grapes:","category":"food","emoji_order":"1449","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"melon":{"unicode":"1f348","unicode_alt":"","code_decimal":"🍈","name":"melon","shortname":":melon:","category":"food","emoji_order":"1450","aliases":[],"aliases_ascii":[],"keywords":["fruit","boobs","food"]},"watermelon":{"unicode":"1f349","unicode_alt":"","code_decimal":"🍉","name":"watermelon","shortname":":watermelon:","category":"food","emoji_order":"1451","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"tangerine":{"unicode":"1f34a","unicode_alt":"","code_decimal":"🍊","name":"tangerine","shortname":":tangerine:","category":"food","emoji_order":"1452","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"lemon":{"unicode":"1f34b","unicode_alt":"","code_decimal":"🍋","name":"lemon","shortname":":lemon:","category":"food","emoji_order":"1453","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"banana":{"unicode":"1f34c","unicode_alt":"","code_decimal":"🍌","name":"banana","shortname":":banana:","category":"food","emoji_order":"1454","aliases":[],"aliases_ascii":[],"keywords":["fruit","penis","food"]},"pineapple":{"unicode":"1f34d","unicode_alt":"","code_decimal":"🍍","name":"pineapple","shortname":":pineapple:","category":"food","emoji_order":"1455","aliases":[],"aliases_ascii":[],"keywords":["fruit","food","tropical"]},"apple":{"unicode":"1f34e","unicode_alt":"","code_decimal":"🍎","name":"red apple","shortname":":apple:","category":"food","emoji_order":"1456","aliases":[],"aliases_ascii":[],"keywords":["fruit","food","creationism"]},"green_apple":{"unicode":"1f34f","unicode_alt":"","code_decimal":"🍏","name":"green apple","shortname":":green_apple:","category":"food","emoji_order":"1457","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"pear":{"unicode":"1f350","unicode_alt":"","code_decimal":"🍐","name":"pear","shortname":":pear:","category":"food","emoji_order":"1458","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"peach":{"unicode":"1f351","unicode_alt":"","code_decimal":"🍑","name":"peach","shortname":":peach:","category":"food","emoji_order":"1459","aliases":[],"aliases_ascii":[],"keywords":["fruit","butt","food"]},"cherries":{"unicode":"1f352","unicode_alt":"","code_decimal":"🍒","name":"cherries","shortname":":cherries:","category":"food","emoji_order":"1460","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"strawberry":{"unicode":"1f353","unicode_alt":"","code_decimal":"🍓","name":"strawberry","shortname":":strawberry:","category":"food","emoji_order":"1461","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"kiwi":{"unicode":"1f95d","unicode_alt":"","code_decimal":"🥝","name":"kiwifruit","shortname":":kiwi:","category":"food","emoji_order":"1462","aliases":[":kiwifruit:"],"aliases_ascii":[],"keywords":[]},"tomato":{"unicode":"1f345","unicode_alt":"","code_decimal":"🍅","name":"tomato","shortname":":tomato:","category":"food","emoji_order":"1463","aliases":[],"aliases_ascii":[],"keywords":["fruit","vegetables","food"]},"avocado":{"unicode":"1f951","unicode_alt":"","code_decimal":"🥑","name":"avocado","shortname":":avocado:","category":"food","emoji_order":"1464","aliases":[],"aliases_ascii":[],"keywords":[]},"eggplant":{"unicode":"1f346","unicode_alt":"","code_decimal":"🍆","name":"aubergine","shortname":":eggplant:","category":"food","emoji_order":"1465","aliases":[],"aliases_ascii":[],"keywords":["vegetables","penis","food"]},"potato":{"unicode":"1f954","unicode_alt":"","code_decimal":"🥔","name":"potato","shortname":":potato:","category":"food","emoji_order":"1466","aliases":[],"aliases_ascii":[],"keywords":[]},"carrot":{"unicode":"1f955","unicode_alt":"","code_decimal":"🥕","name":"carrot","shortname":":carrot:","category":"food","emoji_order":"1467","aliases":[],"aliases_ascii":[],"keywords":[]},"corn":{"unicode":"1f33d","unicode_alt":"","code_decimal":"🌽","name":"ear of maize","shortname":":corn:","category":"food","emoji_order":"1468","aliases":[],"aliases_ascii":[],"keywords":["vegetables","food"]},"hot_pepper":{"unicode":"1f336","unicode_alt":"1f336-fe0f","code_decimal":"🌶","name":"hot pepper","shortname":":hot_pepper:","category":"food","emoji_order":"1469","aliases":[],"aliases_ascii":[],"keywords":["vegetables","food"]},"cucumber":{"unicode":"1f952","unicode_alt":"","code_decimal":"🥒","name":"cucumber","shortname":":cucumber:","category":"food","emoji_order":"1470","aliases":[],"aliases_ascii":[],"keywords":[]},"mushroom":{"unicode":"1f344","unicode_alt":"","code_decimal":"🍄","name":"mushroom","shortname":":mushroom:","category":"nature","emoji_order":"1471","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","drugs"]},"peanuts":{"unicode":"1f95c","unicode_alt":"","code_decimal":"🥜","name":"peanuts","shortname":":peanuts:","category":"food","emoji_order":"1472","aliases":[":shelled_peanut:"],"aliases_ascii":[],"keywords":[]},"chestnut":{"unicode":"1f330","unicode_alt":"","code_decimal":"🌰","name":"chestnut","shortname":":chestnut:","category":"nature","emoji_order":"1473","aliases":[],"aliases_ascii":[],"keywords":["nature","plant"]},"bread":{"unicode":"1f35e","unicode_alt":"","code_decimal":"🍞","name":"bread","shortname":":bread:","category":"food","emoji_order":"1474","aliases":[],"aliases_ascii":[],"keywords":["food"]},"croissant":{"unicode":"1f950","unicode_alt":"","code_decimal":"🥐","name":"croissant","shortname":":croissant:","category":"food","emoji_order":"1475","aliases":[],"aliases_ascii":[],"keywords":[]},"french_bread":{"unicode":"1f956","unicode_alt":"","code_decimal":"🥖","name":"baguette bread","shortname":":french_bread:","category":"food","emoji_order":"1476","aliases":[":baguette_bread:"],"aliases_ascii":[],"keywords":[]},"pancakes":{"unicode":"1f95e","unicode_alt":"","code_decimal":"🥞","name":"pancakes","shortname":":pancakes:","category":"food","emoji_order":"1477","aliases":[],"aliases_ascii":[],"keywords":[]},"cheese":{"unicode":"1f9c0","unicode_alt":"","code_decimal":"🧀","name":"cheese wedge","shortname":":cheese:","category":"food","emoji_order":"1478","aliases":[":cheese_wedge:"],"aliases_ascii":[],"keywords":["food"]},"meat_on_bone":{"unicode":"1f356","unicode_alt":"","code_decimal":"🍖","name":"meat on bone","shortname":":meat_on_bone:","category":"food","emoji_order":"1479","aliases":[],"aliases_ascii":[],"keywords":["food"]},"poultry_leg":{"unicode":"1f357","unicode_alt":"","code_decimal":"🍗","name":"poultry leg","shortname":":poultry_leg:","category":"food","emoji_order":"1480","aliases":[],"aliases_ascii":[],"keywords":["food","holidays"]},"bacon":{"unicode":"1f953","unicode_alt":"","code_decimal":"🥓","name":"bacon","shortname":":bacon:","category":"food","emoji_order":"1481","aliases":[],"aliases_ascii":[],"keywords":["pig"]},"hamburger":{"unicode":"1f354","unicode_alt":"","code_decimal":"🍔","name":"hamburger","shortname":":hamburger:","category":"food","emoji_order":"1482","aliases":[],"aliases_ascii":[],"keywords":["america","food"]},"fries":{"unicode":"1f35f","unicode_alt":"","code_decimal":"🍟","name":"french fries","shortname":":fries:","category":"food","emoji_order":"1483","aliases":[],"aliases_ascii":[],"keywords":["america","food"]},"pizza":{"unicode":"1f355","unicode_alt":"","code_decimal":"🍕","name":"slice of pizza","shortname":":pizza:","category":"food","emoji_order":"1484","aliases":[],"aliases_ascii":[],"keywords":["italian","food","boys night"]},"hotdog":{"unicode":"1f32d","unicode_alt":"","code_decimal":"🌭","name":"hot dog","shortname":":hotdog:","category":"food","emoji_order":"1485","aliases":[":hot_dog:"],"aliases_ascii":[],"keywords":["america","food"]},"taco":{"unicode":"1f32e","unicode_alt":"","code_decimal":"🌮","name":"taco","shortname":":taco:","category":"food","emoji_order":"1486","aliases":[],"aliases_ascii":[],"keywords":["food","mexican","vagina"]},"burrito":{"unicode":"1f32f","unicode_alt":"","code_decimal":"🌯","name":"burrito","shortname":":burrito:","category":"food","emoji_order":"1487","aliases":[],"aliases_ascii":[],"keywords":["food","mexican"]},"stuffed_flatbread":{"unicode":"1f959","unicode_alt":"","code_decimal":"🥙","name":"stuffed flatbread","shortname":":stuffed_flatbread:","category":"food","emoji_order":"1488","aliases":[":stuffed_pita:"],"aliases_ascii":[],"keywords":[]},"egg":{"unicode":"1f95a","unicode_alt":"","code_decimal":"🥚","name":"egg","shortname":":egg:","category":"food","emoji_order":"1489","aliases":[],"aliases_ascii":[],"keywords":[]},"cooking":{"unicode":"1f373","unicode_alt":"","code_decimal":"🍳","name":"cooking","shortname":":cooking:","category":"food","emoji_order":"1490","aliases":[],"aliases_ascii":[],"keywords":["food"]},"shallow_pan_of_food":{"unicode":"1f958","unicode_alt":"","code_decimal":"🥘","name":"shallow pan of food","shortname":":shallow_pan_of_food:","category":"food","emoji_order":"1491","aliases":[":paella:"],"aliases_ascii":[],"keywords":["pan of food"]},"stew":{"unicode":"1f372","unicode_alt":"","code_decimal":"🍲","name":"pot of food","shortname":":stew:","category":"food","emoji_order":"1492","aliases":[],"aliases_ascii":[],"keywords":["food","steam"]},"salad":{"unicode":"1f957","unicode_alt":"","code_decimal":"🥗","name":"green salad","shortname":":salad:","category":"food","emoji_order":"1493","aliases":[":green_salad:"],"aliases_ascii":[],"keywords":[]},"popcorn":{"unicode":"1f37f","unicode_alt":"","code_decimal":"🍿","name":"popcorn","shortname":":popcorn:","category":"food","emoji_order":"1494","aliases":[],"aliases_ascii":[],"keywords":["food","parties"]},"bento":{"unicode":"1f371","unicode_alt":"","code_decimal":"🍱","name":"bento box","shortname":":bento:","category":"food","emoji_order":"1495","aliases":[],"aliases_ascii":[],"keywords":["object","sushi","japan","food"]},"rice_cracker":{"unicode":"1f358","unicode_alt":"","code_decimal":"🍘","name":"rice cracker","shortname":":rice_cracker:","category":"food","emoji_order":"1496","aliases":[],"aliases_ascii":[],"keywords":["sushi","food"]},"rice_ball":{"unicode":"1f359","unicode_alt":"","code_decimal":"🍙","name":"rice ball","shortname":":rice_ball:","category":"food","emoji_order":"1497","aliases":[],"aliases_ascii":[],"keywords":["sushi","japan","food"]},"rice":{"unicode":"1f35a","unicode_alt":"","code_decimal":"🍚","name":"cooked rice","shortname":":rice:","category":"food","emoji_order":"1498","aliases":[],"aliases_ascii":[],"keywords":["sushi","japan","food"]},"curry":{"unicode":"1f35b","unicode_alt":"","code_decimal":"🍛","name":"curry and rice","shortname":":curry:","category":"food","emoji_order":"1499","aliases":[],"aliases_ascii":[],"keywords":["food"]},"ramen":{"unicode":"1f35c","unicode_alt":"","code_decimal":"🍜","name":"steaming bowl","shortname":":ramen:","category":"food","emoji_order":"1500","aliases":[],"aliases_ascii":[],"keywords":["noodles","ramen","japan","food"]},"spaghetti":{"unicode":"1f35d","unicode_alt":"","code_decimal":"🍝","name":"spaghetti","shortname":":spaghetti:","category":"food","emoji_order":"1501","aliases":[],"aliases_ascii":[],"keywords":["noodles","pasta","italian","food"]},"sweet_potato":{"unicode":"1f360","unicode_alt":"","code_decimal":"🍠","name":"roasted sweet potato","shortname":":sweet_potato:","category":"food","emoji_order":"1502","aliases":[],"aliases_ascii":[],"keywords":["vegetables","food"]},"oden":{"unicode":"1f362","unicode_alt":"","code_decimal":"🍢","name":"oden","shortname":":oden:","category":"food","emoji_order":"1503","aliases":[],"aliases_ascii":[],"keywords":["food"]},"sushi":{"unicode":"1f363","unicode_alt":"","code_decimal":"🍣","name":"sushi","shortname":":sushi:","category":"food","emoji_order":"1504","aliases":[],"aliases_ascii":[],"keywords":["sushi","japan","food"]},"fried_shrimp":{"unicode":"1f364","unicode_alt":"","code_decimal":"🍤","name":"fried shrimp","shortname":":fried_shrimp:","category":"food","emoji_order":"1505","aliases":[],"aliases_ascii":[],"keywords":["food"]},"fish_cake":{"unicode":"1f365","unicode_alt":"","code_decimal":"🍥","name":"fish cake with swirl design","shortname":":fish_cake:","category":"food","emoji_order":"1506","aliases":[],"aliases_ascii":[],"keywords":["sushi","food"]},"dango":{"unicode":"1f361","unicode_alt":"","code_decimal":"🍡","name":"dango","shortname":":dango:","category":"food","emoji_order":"1507","aliases":[],"aliases_ascii":[],"keywords":["food"]},"icecream":{"unicode":"1f366","unicode_alt":"","code_decimal":"🍦","name":"soft ice cream","shortname":":icecream:","category":"food","emoji_order":"1508","aliases":[],"aliases_ascii":[],"keywords":["food"]},"shaved_ice":{"unicode":"1f367","unicode_alt":"","code_decimal":"🍧","name":"shaved ice","shortname":":shaved_ice:","category":"food","emoji_order":"1509","aliases":[],"aliases_ascii":[],"keywords":["food"]},"ice_cream":{"unicode":"1f368","unicode_alt":"","code_decimal":"🍨","name":"ice cream","shortname":":ice_cream:","category":"food","emoji_order":"1510","aliases":[],"aliases_ascii":[],"keywords":["food"]},"doughnut":{"unicode":"1f369","unicode_alt":"","code_decimal":"🍩","name":"doughnut","shortname":":doughnut:","category":"food","emoji_order":"1511","aliases":[],"aliases_ascii":[],"keywords":["food"]},"cookie":{"unicode":"1f36a","unicode_alt":"","code_decimal":"🍪","name":"cookie","shortname":":cookie:","category":"food","emoji_order":"1512","aliases":[],"aliases_ascii":[],"keywords":["food","vagina"]},"birthday":{"unicode":"1f382","unicode_alt":"","code_decimal":"🎂","name":"birthday cake","shortname":":birthday:","category":"food","emoji_order":"1513","aliases":[],"aliases_ascii":[],"keywords":["birthday","food","parties"]},"cake":{"unicode":"1f370","unicode_alt":"","code_decimal":"🍰","name":"shortcake","shortname":":cake:","category":"food","emoji_order":"1514","aliases":[],"aliases_ascii":[],"keywords":["food"]},"chocolate_bar":{"unicode":"1f36b","unicode_alt":"","code_decimal":"🍫","name":"chocolate bar","shortname":":chocolate_bar:","category":"food","emoji_order":"1515","aliases":[],"aliases_ascii":[],"keywords":["food","halloween"]},"candy":{"unicode":"1f36c","unicode_alt":"","code_decimal":"🍬","name":"candy","shortname":":candy:","category":"food","emoji_order":"1516","aliases":[],"aliases_ascii":[],"keywords":["food","halloween"]},"lollipop":{"unicode":"1f36d","unicode_alt":"","code_decimal":"🍭","name":"lollipop","shortname":":lollipop:","category":"food","emoji_order":"1517","aliases":[],"aliases_ascii":[],"keywords":["food","halloween"]},"custard":{"unicode":"1f36e","unicode_alt":"","code_decimal":"🍮","name":"custard","shortname":":custard:","category":"food","emoji_order":"1518","aliases":[":pudding:",":flan:"],"aliases_ascii":[],"keywords":["food"]},"honey_pot":{"unicode":"1f36f","unicode_alt":"","code_decimal":"🍯","name":"honey pot","shortname":":honey_pot:","category":"food","emoji_order":"1519","aliases":[],"aliases_ascii":[],"keywords":["food","vagina"]},"baby_bottle":{"unicode":"1f37c","unicode_alt":"","code_decimal":"🍼","name":"baby bottle","shortname":":baby_bottle:","category":"food","emoji_order":"1520","aliases":[],"aliases_ascii":[],"keywords":["drink","object","food","baby"]},"milk":{"unicode":"1f95b","unicode_alt":"","code_decimal":"🥛","name":"glass of milk","shortname":":milk:","category":"food","emoji_order":"1521","aliases":[":glass_of_milk:"],"aliases_ascii":[],"keywords":[]},"coffee":{"unicode":"2615","unicode_alt":"2615-fe0f","code_decimal":"☕","name":"hot beverage","shortname":":coffee:","category":"food","emoji_order":"1522","aliases":[],"aliases_ascii":[],"keywords":["drink","caffeine","steam","morning"]},"tea":{"unicode":"1f375","unicode_alt":"","code_decimal":"🍵","name":"teacup without handle","shortname":":tea:","category":"food","emoji_order":"1523","aliases":[],"aliases_ascii":[],"keywords":["drink","japan","caffeine","steam","morning"]},"sake":{"unicode":"1f376","unicode_alt":"","code_decimal":"🍶","name":"sake bottle and cup","shortname":":sake:","category":"food","emoji_order":"1524","aliases":[],"aliases_ascii":[],"keywords":["drink","japan","sake","alcohol","girls night"]},"champagne":{"unicode":"1f37e","unicode_alt":"","code_decimal":"🍾","name":"bottle with popping cork","shortname":":champagne:","category":"food","emoji_order":"1525","aliases":[":bottle_with_popping_cork:"],"aliases_ascii":[],"keywords":["drink","cheers","alcohol","parties"]},"wine_glass":{"unicode":"1f377","unicode_alt":"","code_decimal":"🍷","name":"wine glass","shortname":":wine_glass:","category":"food","emoji_order":"1526","aliases":[],"aliases_ascii":[],"keywords":["drink","italian","alcohol","girls night","parties"]},"cocktail":{"unicode":"1f378","unicode_alt":"","code_decimal":"🍸","name":"cocktail glass","shortname":":cocktail:","category":"food","emoji_order":"1527","aliases":[],"aliases_ascii":[],"keywords":["drink","cocktail","alcohol","girls night","parties"]},"tropical_drink":{"unicode":"1f379","unicode_alt":"","code_decimal":"🍹","name":"tropical drink","shortname":":tropical_drink:","category":"food","emoji_order":"1528","aliases":[],"aliases_ascii":[],"keywords":["drink","cocktail","tropical","alcohol"]},"beer":{"unicode":"1f37a","unicode_alt":"","code_decimal":"🍺","name":"beer mug","shortname":":beer:","category":"food","emoji_order":"1529","aliases":[],"aliases_ascii":[],"keywords":["drink","beer","alcohol","parties"]},"beers":{"unicode":"1f37b","unicode_alt":"","code_decimal":"🍻","name":"clinking beer mugs","shortname":":beers:","category":"food","emoji_order":"1530","aliases":[],"aliases_ascii":[],"keywords":["drink","cheers","beer","alcohol","thank you","boys night","parties"]},"champagne_glass":{"unicode":"1f942","unicode_alt":"","code_decimal":"🥂","name":"clinking glasses","shortname":":champagne_glass:","category":"food","emoji_order":"1531","aliases":[":clinking_glass:"],"aliases_ascii":[],"keywords":[]},"tumbler_glass":{"unicode":"1f943","unicode_alt":"","code_decimal":"🥃","name":"tumbler glass","shortname":":tumbler_glass:","category":"food","emoji_order":"1532","aliases":[":whisky:"],"aliases_ascii":[],"keywords":["booze"]},"fork_knife_plate":{"unicode":"1f37d","unicode_alt":"1f37d-fe0f","code_decimal":"🍽","name":"fork and knife with plate","shortname":":fork_knife_plate:","category":"food","emoji_order":"1533","aliases":[":fork_and_knife_with_plate:"],"aliases_ascii":[],"keywords":["object","food"]},"fork_and_knife":{"unicode":"1f374","unicode_alt":"","code_decimal":"🍴","name":"fork and knife","shortname":":fork_and_knife:","category":"food","emoji_order":"1534","aliases":[],"aliases_ascii":[],"keywords":["object","weapon","food"]},"spoon":{"unicode":"1f944","unicode_alt":"","code_decimal":"🥄","name":"spoon","shortname":":spoon:","category":"food","emoji_order":"1535","aliases":[],"aliases_ascii":[],"keywords":[]},"knife":{"unicode":"1f52a","unicode_alt":"","code_decimal":"🔪","name":"hocho","shortname":":knife:","category":"objects","emoji_order":"1536","aliases":[],"aliases_ascii":[],"keywords":["object","weapon"]},"amphora":{"unicode":"1f3fa","unicode_alt":"","code_decimal":"🏺","name":"amphora","shortname":":amphora:","category":"objects","emoji_order":"1537","aliases":[],"aliases_ascii":[],"keywords":["object"]},"earth_africa":{"unicode":"1f30d","unicode_alt":"","code_decimal":"🌍","name":"earth globe europe-africa","shortname":":earth_africa:","category":"nature","emoji_order":"1538","aliases":[],"aliases_ascii":[],"keywords":["map","vacation","globe"]},"earth_americas":{"unicode":"1f30e","unicode_alt":"","code_decimal":"🌎","name":"earth globe americas","shortname":":earth_americas:","category":"nature","emoji_order":"1539","aliases":[],"aliases_ascii":[],"keywords":["map","vacation","globe"]},"earth_asia":{"unicode":"1f30f","unicode_alt":"","code_decimal":"🌏","name":"earth globe asia-australia","shortname":":earth_asia:","category":"nature","emoji_order":"1540","aliases":[],"aliases_ascii":[],"keywords":["map","vacation","globe"]},"globe_with_meridians":{"unicode":"1f310","unicode_alt":"","code_decimal":"🌐","name":"globe with meridians","shortname":":globe_with_meridians:","category":"symbols","emoji_order":"1541","aliases":[],"aliases_ascii":[],"keywords":["symbol","globe"]},"map":{"unicode":"1f5fa","unicode_alt":"1f5fa-fe0f","code_decimal":"🗺","name":"world map","shortname":":map:","category":"objects","emoji_order":"1542","aliases":[":world_map:"],"aliases_ascii":[],"keywords":["travel","map","vacation"]},"japan":{"unicode":"1f5fe","unicode_alt":"","code_decimal":"🗾","name":"silhouette of japan","shortname":":japan:","category":"travel","emoji_order":"1543","aliases":[],"aliases_ascii":[],"keywords":["places","travel","map","vacation","tropical"]},"mountain_snow":{"unicode":"1f3d4","unicode_alt":"1f3d4-fe0f","code_decimal":"🏔","name":"snow capped mountain","shortname":":mountain_snow:","category":"travel","emoji_order":"1544","aliases":[":snow_capped_mountain:"],"aliases_ascii":[],"keywords":["places","travel","vacation","cold","camp"]},"mountain":{"unicode":"26f0","unicode_alt":"26f0-fe0f","code_decimal":"⛰","name":"mountain","shortname":":mountain:","category":"travel","emoji_order":"1545","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","camp"]},"volcano":{"unicode":"1f30b","unicode_alt":"","code_decimal":"🌋","name":"volcano","shortname":":volcano:","category":"travel","emoji_order":"1546","aliases":[],"aliases_ascii":[],"keywords":["places","tropical"]},"mount_fuji":{"unicode":"1f5fb","unicode_alt":"","code_decimal":"🗻","name":"mount fuji","shortname":":mount_fuji:","category":"travel","emoji_order":"1547","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","cold","camp"]},"camping":{"unicode":"1f3d5","unicode_alt":"1f3d5-fe0f","code_decimal":"🏕","name":"camping","shortname":":camping:","category":"travel","emoji_order":"1548","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","camp"]},"beach":{"unicode":"1f3d6","unicode_alt":"1f3d6-fe0f","code_decimal":"🏖","name":"beach with umbrella","shortname":":beach:","category":"travel","emoji_order":"1549","aliases":[":beach_with_umbrella:"],"aliases_ascii":[],"keywords":["places","travel","vacation","tropical","beach","swim"]},"desert":{"unicode":"1f3dc","unicode_alt":"1f3dc-fe0f","code_decimal":"🏜","name":"desert","shortname":":desert:","category":"travel","emoji_order":"1550","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","hot"]},"island":{"unicode":"1f3dd","unicode_alt":"1f3dd-fe0f","code_decimal":"🏝","name":"desert island","shortname":":island:","category":"travel","emoji_order":"1551","aliases":[":desert_island:"],"aliases_ascii":[],"keywords":["places","travel","vacation","tropical","beach","swim"]},"park":{"unicode":"1f3de","unicode_alt":"1f3de-fe0f","code_decimal":"🏞","name":"national park","shortname":":park:","category":"travel","emoji_order":"1552","aliases":[":national_park:"],"aliases_ascii":[],"keywords":["travel","vacation","park","camp"]},"stadium":{"unicode":"1f3df","unicode_alt":"1f3df-fe0f","code_decimal":"🏟","name":"stadium","shortname":":stadium:","category":"travel","emoji_order":"1553","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation","boys night"]},"classical_building":{"unicode":"1f3db","unicode_alt":"1f3db-fe0f","code_decimal":"🏛","name":"classical building","shortname":":classical_building:","category":"travel","emoji_order":"1554","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation"]},"construction_site":{"unicode":"1f3d7","unicode_alt":"1f3d7-fe0f","code_decimal":"🏗","name":"building construction","shortname":":construction_site:","category":"travel","emoji_order":"1555","aliases":[":building_construction:"],"aliases_ascii":[],"keywords":["building","crane"]},"homes":{"unicode":"1f3d8","unicode_alt":"1f3d8-fe0f","code_decimal":"🏘","name":"house buildings","shortname":":homes:","category":"travel","emoji_order":"1556","aliases":[":house_buildings:"],"aliases_ascii":[],"keywords":["places","building","house"]},"cityscape":{"unicode":"1f3d9","unicode_alt":"1f3d9-fe0f","code_decimal":"🏙","name":"cityscape","shortname":":cityscape:","category":"travel","emoji_order":"1557","aliases":[],"aliases_ascii":[],"keywords":["places","building","vacation"]},"house_abandoned":{"unicode":"1f3da","unicode_alt":"1f3da-fe0f","code_decimal":"🏚","name":"derelict house building","shortname":":house_abandoned:","category":"travel","emoji_order":"1558","aliases":[":derelict_house_building:"],"aliases_ascii":[],"keywords":["places","building","house"]},"house":{"unicode":"1f3e0","unicode_alt":"","code_decimal":"🏠","name":"house building","shortname":":house:","category":"travel","emoji_order":"1559","aliases":[],"aliases_ascii":[],"keywords":["places","building","house"]},"house_with_garden":{"unicode":"1f3e1","unicode_alt":"","code_decimal":"🏡","name":"house with garden","shortname":":house_with_garden:","category":"travel","emoji_order":"1560","aliases":[],"aliases_ascii":[],"keywords":["places","building","house"]},"office":{"unicode":"1f3e2","unicode_alt":"","code_decimal":"🏢","name":"office building","shortname":":office:","category":"travel","emoji_order":"1561","aliases":[],"aliases_ascii":[],"keywords":["places","building","work"]},"post_office":{"unicode":"1f3e3","unicode_alt":"","code_decimal":"🏣","name":"japanese post office","shortname":":post_office:","category":"travel","emoji_order":"1562","aliases":[],"aliases_ascii":[],"keywords":["places","building","post office"]},"european_post_office":{"unicode":"1f3e4","unicode_alt":"","code_decimal":"🏤","name":"european post office","shortname":":european_post_office:","category":"travel","emoji_order":"1563","aliases":[],"aliases_ascii":[],"keywords":["places","building","post office"]},"hospital":{"unicode":"1f3e5","unicode_alt":"","code_decimal":"🏥","name":"hospital","shortname":":hospital:","category":"travel","emoji_order":"1564","aliases":[],"aliases_ascii":[],"keywords":["places","building","health","911"]},"bank":{"unicode":"1f3e6","unicode_alt":"","code_decimal":"🏦","name":"bank","shortname":":bank:","category":"travel","emoji_order":"1565","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"hotel":{"unicode":"1f3e8","unicode_alt":"","code_decimal":"🏨","name":"hotel","shortname":":hotel:","category":"travel","emoji_order":"1566","aliases":[],"aliases_ascii":[],"keywords":["places","building","vacation"]},"love_hotel":{"unicode":"1f3e9","unicode_alt":"","code_decimal":"🏩","name":"love hotel","shortname":":love_hotel:","category":"travel","emoji_order":"1567","aliases":[],"aliases_ascii":[],"keywords":["places","building","love"]},"convenience_store":{"unicode":"1f3ea","unicode_alt":"","code_decimal":"🏪","name":"convenience store","shortname":":convenience_store:","category":"travel","emoji_order":"1568","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"school":{"unicode":"1f3eb","unicode_alt":"","code_decimal":"🏫","name":"school","shortname":":school:","category":"travel","emoji_order":"1569","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"department_store":{"unicode":"1f3ec","unicode_alt":"","code_decimal":"🏬","name":"department store","shortname":":department_store:","category":"travel","emoji_order":"1570","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"factory":{"unicode":"1f3ed","unicode_alt":"","code_decimal":"🏭","name":"factory","shortname":":factory:","category":"travel","emoji_order":"1571","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","steam"]},"japanese_castle":{"unicode":"1f3ef","unicode_alt":"","code_decimal":"🏯","name":"japanese castle","shortname":":japanese_castle:","category":"travel","emoji_order":"1572","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation"]},"european_castle":{"unicode":"1f3f0","unicode_alt":"","code_decimal":"🏰","name":"european castle","shortname":":european_castle:","category":"travel","emoji_order":"1573","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation"]},"wedding":{"unicode":"1f492","unicode_alt":"","code_decimal":"💒","name":"wedding","shortname":":wedding:","category":"travel","emoji_order":"1574","aliases":[],"aliases_ascii":[],"keywords":["places","wedding","building","love","parties"]},"tokyo_tower":{"unicode":"1f5fc","unicode_alt":"","code_decimal":"🗼","name":"tokyo tower","shortname":":tokyo_tower:","category":"travel","emoji_order":"1575","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","eiffel tower"]},"statue_of_liberty":{"unicode":"1f5fd","unicode_alt":"","code_decimal":"🗽","name":"statue of liberty","shortname":":statue_of_liberty:","category":"travel","emoji_order":"1576","aliases":[],"aliases_ascii":[],"keywords":["places","america","travel","vacation","statue of liberty","free speech"]},"church":{"unicode":"26ea","unicode_alt":"26ea-fe0f","code_decimal":"⛪","name":"church","shortname":":church:","category":"travel","emoji_order":"1577","aliases":[],"aliases_ascii":[],"keywords":["places","wedding","religion","building","condolence"]},"mosque":{"unicode":"1f54c","unicode_alt":"","code_decimal":"🕌","name":"mosque","shortname":":mosque:","category":"travel","emoji_order":"1578","aliases":[],"aliases_ascii":[],"keywords":["places","religion","building","vacation","condolence"]},"synagogue":{"unicode":"1f54d","unicode_alt":"","code_decimal":"🕍","name":"synagogue","shortname":":synagogue:","category":"travel","emoji_order":"1579","aliases":[],"aliases_ascii":[],"keywords":["places","religion","building","travel","vacation","condolence"]},"shinto_shrine":{"unicode":"26e9","unicode_alt":"26e9-fe0f","code_decimal":"⛩","name":"shinto shrine","shortname":":shinto_shrine:","category":"travel","emoji_order":"1580","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation"]},"kaaba":{"unicode":"1f54b","unicode_alt":"","code_decimal":"🕋","name":"kaaba","shortname":":kaaba:","category":"travel","emoji_order":"1581","aliases":[],"aliases_ascii":[],"keywords":["places","religion","building","condolence"]},"fountain":{"unicode":"26f2","unicode_alt":"26f2-fe0f","code_decimal":"⛲","name":"fountain","shortname":":fountain:","category":"travel","emoji_order":"1582","aliases":[],"aliases_ascii":[],"keywords":["travel","vacation"]},"tent":{"unicode":"26fa","unicode_alt":"26fa-fe0f","code_decimal":"⛺","name":"tent","shortname":":tent:","category":"travel","emoji_order":"1583","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","camp"]},"foggy":{"unicode":"1f301","unicode_alt":"","code_decimal":"🌁","name":"foggy","shortname":":foggy:","category":"travel","emoji_order":"1584","aliases":[],"aliases_ascii":[],"keywords":["places","building","sky","travel","vacation"]},"night_with_stars":{"unicode":"1f303","unicode_alt":"","code_decimal":"🌃","name":"night with stars","shortname":":night_with_stars:","category":"travel","emoji_order":"1585","aliases":[],"aliases_ascii":[],"keywords":["places","building","sky","vacation","goodnight"]},"sunrise_over_mountains":{"unicode":"1f304","unicode_alt":"","code_decimal":"🌄","name":"sunrise over mountains","shortname":":sunrise_over_mountains:","category":"travel","emoji_order":"1586","aliases":[],"aliases_ascii":[],"keywords":["places","sky","travel","vacation","day","sun","camp","morning"]},"sunrise":{"unicode":"1f305","unicode_alt":"","code_decimal":"🌅","name":"sunrise","shortname":":sunrise:","category":"travel","emoji_order":"1587","aliases":[],"aliases_ascii":[],"keywords":["places","sky","travel","vacation","tropical","day","sun","hump day","morning"]},"city_dusk":{"unicode":"1f306","unicode_alt":"","code_decimal":"🌆","name":"cityscape at dusk","shortname":":city_dusk:","category":"travel","emoji_order":"1588","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"city_sunset":{"unicode":"1f307","unicode_alt":"","code_decimal":"🌇","name":"sunset over buildings","shortname":":city_sunset:","category":"travel","emoji_order":"1589","aliases":[":city_sunrise:"],"aliases_ascii":[],"keywords":["places","building","sky","vacation"]},"bridge_at_night":{"unicode":"1f309","unicode_alt":"","code_decimal":"🌉","name":"bridge at night","shortname":":bridge_at_night:","category":"travel","emoji_order":"1590","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","goodnight"]},"hotsprings":{"unicode":"2668","unicode_alt":"2668-fe0f","code_decimal":"♨","name":"hot springs","shortname":":hotsprings:","category":"symbols","emoji_order":"1591","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"milky_way":{"unicode":"1f30c","unicode_alt":"","code_decimal":"🌌","name":"milky way","shortname":":milky_way:","category":"travel","emoji_order":"1592","aliases":[],"aliases_ascii":[],"keywords":["places","space","sky","travel","vacation"]},"carousel_horse":{"unicode":"1f3a0","unicode_alt":"","code_decimal":"🎠","name":"carousel horse","shortname":":carousel_horse:","category":"travel","emoji_order":"1593","aliases":[],"aliases_ascii":[],"keywords":["places","object","vacation","roller coaster","carousel"]},"ferris_wheel":{"unicode":"1f3a1","unicode_alt":"","code_decimal":"🎡","name":"ferris wheel","shortname":":ferris_wheel:","category":"travel","emoji_order":"1594","aliases":[],"aliases_ascii":[],"keywords":["places","vacation","ferris wheel"]},"roller_coaster":{"unicode":"1f3a2","unicode_alt":"","code_decimal":"🎢","name":"roller coaster","shortname":":roller_coaster:","category":"travel","emoji_order":"1595","aliases":[],"aliases_ascii":[],"keywords":["places","vacation","roller coaster"]},"barber":{"unicode":"1f488","unicode_alt":"","code_decimal":"💈","name":"barber pole","shortname":":barber:","category":"objects","emoji_order":"1596","aliases":[],"aliases_ascii":[],"keywords":["object"]},"circus_tent":{"unicode":"1f3aa","unicode_alt":"","code_decimal":"🎪","name":"circus tent","shortname":":circus_tent:","category":"activity","emoji_order":"1597","aliases":[],"aliases_ascii":[],"keywords":["circus tent"]},"performing_arts":{"unicode":"1f3ad","unicode_alt":"","code_decimal":"🎭","name":"performing arts","shortname":":performing_arts:","category":"activity","emoji_order":"1598","aliases":[],"aliases_ascii":[],"keywords":["theatre","movie"]},"frame_photo":{"unicode":"1f5bc","unicode_alt":"1f5bc-fe0f","code_decimal":"🖼","name":"frame with picture","shortname":":frame_photo:","category":"objects","emoji_order":"1599","aliases":[":frame_with_picture:"],"aliases_ascii":[],"keywords":["travel","vacation"]},"art":{"unicode":"1f3a8","unicode_alt":"","code_decimal":"🎨","name":"artist palette","shortname":":art:","category":"activity","emoji_order":"1600","aliases":[],"aliases_ascii":[],"keywords":[]},"slot_machine":{"unicode":"1f3b0","unicode_alt":"","code_decimal":"🎰","name":"slot machine","shortname":":slot_machine:","category":"activity","emoji_order":"1601","aliases":[],"aliases_ascii":[],"keywords":["game","boys night"]},"steam_locomotive":{"unicode":"1f682","unicode_alt":"","code_decimal":"🚂","name":"steam locomotive","shortname":":steam_locomotive:","category":"travel","emoji_order":"1602","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train","steam"]},"railway_car":{"unicode":"1f683","unicode_alt":"","code_decimal":"🚃","name":"railway car","shortname":":railway_car:","category":"travel","emoji_order":"1603","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"bullettrain_side":{"unicode":"1f684","unicode_alt":"","code_decimal":"🚄","name":"high-speed train","shortname":":bullettrain_side:","category":"travel","emoji_order":"1604","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"bullettrain_front":{"unicode":"1f685","unicode_alt":"","code_decimal":"🚅","name":"high-speed train with bullet nose","shortname":":bullettrain_front:","category":"travel","emoji_order":"1605","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"train2":{"unicode":"1f686","unicode_alt":"","code_decimal":"🚆","name":"train","shortname":":train2:","category":"travel","emoji_order":"1606","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"metro":{"unicode":"1f687","unicode_alt":"","code_decimal":"🚇","name":"metro","shortname":":metro:","category":"travel","emoji_order":"1607","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"light_rail":{"unicode":"1f688","unicode_alt":"","code_decimal":"🚈","name":"light rail","shortname":":light_rail:","category":"travel","emoji_order":"1608","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"station":{"unicode":"1f689","unicode_alt":"","code_decimal":"🚉","name":"station","shortname":":station:","category":"travel","emoji_order":"1609","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"tram":{"unicode":"1f68a","unicode_alt":"","code_decimal":"🚊","name":"tram","shortname":":tram:","category":"travel","emoji_order":"1610","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"monorail":{"unicode":"1f69d","unicode_alt":"","code_decimal":"🚝","name":"monorail","shortname":":monorail:","category":"travel","emoji_order":"1611","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train","vacation"]},"mountain_railway":{"unicode":"1f69e","unicode_alt":"","code_decimal":"🚞","name":"mountain railway","shortname":":mountain_railway:","category":"travel","emoji_order":"1612","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"train":{"unicode":"1f68b","unicode_alt":"","code_decimal":"🚋","name":"tram car","shortname":":train:","category":"travel","emoji_order":"1613","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"bus":{"unicode":"1f68c","unicode_alt":"","code_decimal":"🚌","name":"bus","shortname":":bus:","category":"travel","emoji_order":"1614","aliases":[],"aliases_ascii":[],"keywords":["transportation","bus","office"]},"oncoming_bus":{"unicode":"1f68d","unicode_alt":"","code_decimal":"🚍","name":"oncoming bus","shortname":":oncoming_bus:","category":"travel","emoji_order":"1615","aliases":[],"aliases_ascii":[],"keywords":["transportation","bus","travel"]},"trolleybus":{"unicode":"1f68e","unicode_alt":"","code_decimal":"🚎","name":"trolleybus","shortname":":trolleybus:","category":"travel","emoji_order":"1616","aliases":[],"aliases_ascii":[],"keywords":["transportation","bus","travel"]},"minibus":{"unicode":"1f690","unicode_alt":"","code_decimal":"🚐","name":"minibus","shortname":":minibus:","category":"travel","emoji_order":"1617","aliases":[],"aliases_ascii":[],"keywords":["transportation","bus"]},"ambulance":{"unicode":"1f691","unicode_alt":"","code_decimal":"🚑","name":"ambulance","shortname":":ambulance:","category":"travel","emoji_order":"1618","aliases":[],"aliases_ascii":[],"keywords":["transportation","911"]},"fire_engine":{"unicode":"1f692","unicode_alt":"","code_decimal":"🚒","name":"fire engine","shortname":":fire_engine:","category":"travel","emoji_order":"1619","aliases":[],"aliases_ascii":[],"keywords":["transportation","truck","911"]},"police_car":{"unicode":"1f693","unicode_alt":"","code_decimal":"🚓","name":"police car","shortname":":police_car:","category":"travel","emoji_order":"1620","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","police","911"]},"oncoming_police_car":{"unicode":"1f694","unicode_alt":"","code_decimal":"🚔","name":"oncoming police car","shortname":":oncoming_police_car:","category":"travel","emoji_order":"1621","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","police","911"]},"taxi":{"unicode":"1f695","unicode_alt":"","code_decimal":"🚕","name":"taxi","shortname":":taxi:","category":"travel","emoji_order":"1622","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"oncoming_taxi":{"unicode":"1f696","unicode_alt":"","code_decimal":"🚖","name":"oncoming taxi","shortname":":oncoming_taxi:","category":"travel","emoji_order":"1623","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"red_car":{"unicode":"1f697","unicode_alt":"","code_decimal":"🚗","name":"automobile","shortname":":red_car:","category":"travel","emoji_order":"1624","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"oncoming_automobile":{"unicode":"1f698","unicode_alt":"","code_decimal":"🚘","name":"oncoming automobile","shortname":":oncoming_automobile:","category":"travel","emoji_order":"1625","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"blue_car":{"unicode":"1f699","unicode_alt":"","code_decimal":"🚙","name":"recreational vehicle","shortname":":blue_car:","category":"travel","emoji_order":"1626","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"truck":{"unicode":"1f69a","unicode_alt":"","code_decimal":"🚚","name":"delivery truck","shortname":":truck:","category":"travel","emoji_order":"1627","aliases":[],"aliases_ascii":[],"keywords":["transportation","truck"]},"articulated_lorry":{"unicode":"1f69b","unicode_alt":"","code_decimal":"🚛","name":"articulated lorry","shortname":":articulated_lorry:","category":"travel","emoji_order":"1628","aliases":[],"aliases_ascii":[],"keywords":["transportation","truck"]},"tractor":{"unicode":"1f69c","unicode_alt":"","code_decimal":"🚜","name":"tractor","shortname":":tractor:","category":"travel","emoji_order":"1629","aliases":[],"aliases_ascii":[],"keywords":["transportation"]},"bike":{"unicode":"1f6b2","unicode_alt":"","code_decimal":"🚲","name":"bicycle","shortname":":bike:","category":"travel","emoji_order":"1630","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","bike"]},"scooter":{"unicode":"1f6f4","unicode_alt":"","code_decimal":"🛴","name":"scooter","shortname":":scooter:","category":"travel","emoji_order":"1631","aliases":[],"aliases_ascii":[],"keywords":[]},"motor_scooter":{"unicode":"1f6f5","unicode_alt":"","code_decimal":"🛵","name":"motor scooter","shortname":":motor_scooter:","category":"travel","emoji_order":"1632","aliases":[":motorbike:"],"aliases_ascii":[],"keywords":["moped"]},"busstop":{"unicode":"1f68f","unicode_alt":"","code_decimal":"🚏","name":"bus stop","shortname":":busstop:","category":"travel","emoji_order":"1633","aliases":[],"aliases_ascii":[],"keywords":["object"]},"motorway":{"unicode":"1f6e3","unicode_alt":"1f6e3-fe0f","code_decimal":"🛣","name":"motorway","shortname":":motorway:","category":"travel","emoji_order":"1634","aliases":[],"aliases_ascii":[],"keywords":["travel","vacation","camp"]},"railway_track":{"unicode":"1f6e4","unicode_alt":"1f6e4-fe0f","code_decimal":"🛤","name":"railway track","shortname":":railway_track:","category":"travel","emoji_order":"1635","aliases":[":railroad_track:"],"aliases_ascii":[],"keywords":["travel","train","vacation"]},"fuelpump":{"unicode":"26fd","unicode_alt":"26fd-fe0f","code_decimal":"⛽","name":"fuel pump","shortname":":fuelpump:","category":"travel","emoji_order":"1636","aliases":[],"aliases_ascii":[],"keywords":["object","gas pump"]},"rotating_light":{"unicode":"1f6a8","unicode_alt":"","code_decimal":"🚨","name":"police cars revolving light","shortname":":rotating_light:","category":"travel","emoji_order":"1637","aliases":[],"aliases_ascii":[],"keywords":["transportation","object","police","911"]},"traffic_light":{"unicode":"1f6a5","unicode_alt":"","code_decimal":"🚥","name":"horizontal traffic light","shortname":":traffic_light:","category":"travel","emoji_order":"1638","aliases":[],"aliases_ascii":[],"keywords":["object","stop light"]},"vertical_traffic_light":{"unicode":"1f6a6","unicode_alt":"","code_decimal":"🚦","name":"vertical traffic light","shortname":":vertical_traffic_light:","category":"travel","emoji_order":"1639","aliases":[],"aliases_ascii":[],"keywords":["object","stop light"]},"construction":{"unicode":"1f6a7","unicode_alt":"","code_decimal":"🚧","name":"construction sign","shortname":":construction:","category":"travel","emoji_order":"1640","aliases":[],"aliases_ascii":[],"keywords":["object"]},"octagonal_sign":{"unicode":"1f6d1","unicode_alt":"","code_decimal":"🛑","name":"octagonal sign","shortname":":octagonal_sign:","category":"symbols","emoji_order":"1641","aliases":[":stop_sign:"],"aliases_ascii":[],"keywords":[]},"anchor":{"unicode":"2693","unicode_alt":"2693-fe0f","code_decimal":"⚓","name":"anchor","shortname":":anchor:","category":"travel","emoji_order":"1642","aliases":[],"aliases_ascii":[],"keywords":["object","travel","boat","vacation"]},"sailboat":{"unicode":"26f5","unicode_alt":"26f5-fe0f","code_decimal":"⛵","name":"sailboat","shortname":":sailboat:","category":"travel","emoji_order":"1643","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation"]},"canoe":{"unicode":"1f6f6","unicode_alt":"","code_decimal":"🛶","name":"canoe","shortname":":canoe:","category":"travel","emoji_order":"1644","aliases":[":kayak:"],"aliases_ascii":[],"keywords":[]},"speedboat":{"unicode":"1f6a4","unicode_alt":"","code_decimal":"🚤","name":"speedboat","shortname":":speedboat:","category":"travel","emoji_order":"1645","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation","tropical"]},"cruise_ship":{"unicode":"1f6f3","unicode_alt":"1f6f3-fe0f","code_decimal":"🛳","name":"passenger ship","shortname":":cruise_ship:","category":"travel","emoji_order":"1646","aliases":[":passenger_ship:"],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation"]},"ferry":{"unicode":"26f4","unicode_alt":"26f4-fe0f","code_decimal":"⛴","name":"ferry","shortname":":ferry:","category":"travel","emoji_order":"1647","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation"]},"motorboat":{"unicode":"1f6e5","unicode_alt":"1f6e5-fe0f","code_decimal":"🛥","name":"motorboat","shortname":":motorboat:","category":"travel","emoji_order":"1648","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat"]},"ship":{"unicode":"1f6a2","unicode_alt":"","code_decimal":"🚢","name":"ship","shortname":":ship:","category":"travel","emoji_order":"1649","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation"]},"airplane":{"unicode":"2708","unicode_alt":"2708-fe0f","code_decimal":"✈","name":"airplane","shortname":":airplane:","category":"travel","emoji_order":"1650","aliases":[],"aliases_ascii":[],"keywords":["transportation","plane","travel","vacation","fly"]},"airplane_small":{"unicode":"1f6e9","unicode_alt":"1f6e9-fe0f","code_decimal":"🛩","name":"small airplane","shortname":":airplane_small:","category":"travel","emoji_order":"1651","aliases":[":small_airplane:"],"aliases_ascii":[],"keywords":["transportation","plane","travel","vacation","fly"]},"airplane_departure":{"unicode":"1f6eb","unicode_alt":"","code_decimal":"🛫","name":"airplane departure","shortname":":airplane_departure:","category":"travel","emoji_order":"1652","aliases":[],"aliases_ascii":[],"keywords":["transportation","plane","travel","vacation","fly"]},"airplane_arriving":{"unicode":"1f6ec","unicode_alt":"","code_decimal":"🛬","name":"airplane arriving","shortname":":airplane_arriving:","category":"travel","emoji_order":"1653","aliases":[],"aliases_ascii":[],"keywords":["transportation","plane","travel","vacation","fly"]},"seat":{"unicode":"1f4ba","unicode_alt":"","code_decimal":"💺","name":"seat","shortname":":seat:","category":"travel","emoji_order":"1654","aliases":[],"aliases_ascii":[],"keywords":["transportation","object","travel","vacation"]},"helicopter":{"unicode":"1f681","unicode_alt":"","code_decimal":"🚁","name":"helicopter","shortname":":helicopter:","category":"travel","emoji_order":"1655","aliases":[],"aliases_ascii":[],"keywords":["transportation","plane","travel","fly"]},"suspension_railway":{"unicode":"1f69f","unicode_alt":"","code_decimal":"🚟","name":"suspension railway","shortname":":suspension_railway:","category":"travel","emoji_order":"1656","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"mountain_cableway":{"unicode":"1f6a0","unicode_alt":"","code_decimal":"🚠","name":"mountain cableway","shortname":":mountain_cableway:","category":"travel","emoji_order":"1657","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"aerial_tramway":{"unicode":"1f6a1","unicode_alt":"","code_decimal":"🚡","name":"aerial tramway","shortname":":aerial_tramway:","category":"travel","emoji_order":"1658","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"rocket":{"unicode":"1f680","unicode_alt":"","code_decimal":"🚀","name":"rocket","shortname":":rocket:","category":"travel","emoji_order":"1659","aliases":[],"aliases_ascii":[],"keywords":["transportation","object","space","fly","blast"]},"satellite_orbital":{"unicode":"1f6f0","unicode_alt":"1f6f0-fe0f","code_decimal":"🛰","name":"satellite","shortname":":satellite_orbital:","category":"travel","emoji_order":"1660","aliases":[],"aliases_ascii":[],"keywords":["object"]},"bellhop":{"unicode":"1f6ce","unicode_alt":"1f6ce-fe0f","code_decimal":"🛎","name":"bellhop bell","shortname":":bellhop:","category":"objects","emoji_order":"1661","aliases":[":bellhop_bell:"],"aliases_ascii":[],"keywords":["object"]},"door":{"unicode":"1f6aa","unicode_alt":"","code_decimal":"🚪","name":"door","shortname":":door:","category":"objects","emoji_order":"1662","aliases":[],"aliases_ascii":[],"keywords":["object"]},"sleeping_accommodation":{"unicode":"1f6cc","unicode_alt":"","code_decimal":"🛌","name":"sleeping accommodation","shortname":":sleeping_accommodation:","category":"objects","emoji_order":"1663","aliases":[],"aliases_ascii":[],"keywords":["tired"]},"bed":{"unicode":"1f6cf","unicode_alt":"1f6cf-fe0f","code_decimal":"🛏","name":"bed","shortname":":bed:","category":"objects","emoji_order":"1669","aliases":[],"aliases_ascii":[],"keywords":["object","tired"]},"couch":{"unicode":"1f6cb","unicode_alt":"1f6cb-fe0f","code_decimal":"🛋","name":"couch and lamp","shortname":":couch:","category":"objects","emoji_order":"1670","aliases":[":couch_and_lamp:"],"aliases_ascii":[],"keywords":["object"]},"toilet":{"unicode":"1f6bd","unicode_alt":"","code_decimal":"🚽","name":"toilet","shortname":":toilet:","category":"objects","emoji_order":"1671","aliases":[],"aliases_ascii":[],"keywords":["object","bathroom"]},"shower":{"unicode":"1f6bf","unicode_alt":"","code_decimal":"🚿","name":"shower","shortname":":shower:","category":"objects","emoji_order":"1672","aliases":[],"aliases_ascii":[],"keywords":["object","bathroom"]},"bath":{"unicode":"1f6c0","unicode_alt":"","code_decimal":"🛀","name":"bath","shortname":":bath:","category":"activity","emoji_order":"1673","aliases":[],"aliases_ascii":[],"keywords":["bathroom","tired","diversity","steam"]},"bath_tone1":{"unicode":"1f6c0-1f3fb","unicode_alt":"","code_decimal":"🛀🏻","name":"bath tone 1","shortname":":bath_tone1:","category":"activity","emoji_order":"1674","aliases":[],"aliases_ascii":[],"keywords":[]},"bath_tone2":{"unicode":"1f6c0-1f3fc","unicode_alt":"","code_decimal":"🛀🏼","name":"bath tone 2","shortname":":bath_tone2:","category":"activity","emoji_order":"1675","aliases":[],"aliases_ascii":[],"keywords":[]},"bath_tone3":{"unicode":"1f6c0-1f3fd","unicode_alt":"","code_decimal":"🛀🏽","name":"bath tone 3","shortname":":bath_tone3:","category":"activity","emoji_order":"1676","aliases":[],"aliases_ascii":[],"keywords":[]},"bath_tone4":{"unicode":"1f6c0-1f3fe","unicode_alt":"","code_decimal":"🛀🏾","name":"bath tone 4","shortname":":bath_tone4:","category":"activity","emoji_order":"1677","aliases":[],"aliases_ascii":[],"keywords":[]},"bath_tone5":{"unicode":"1f6c0-1f3ff","unicode_alt":"","code_decimal":"🛀🏿","name":"bath tone 5","shortname":":bath_tone5:","category":"activity","emoji_order":"1678","aliases":[],"aliases_ascii":[],"keywords":[]},"bathtub":{"unicode":"1f6c1","unicode_alt":"","code_decimal":"🛁","name":"bathtub","shortname":":bathtub:","category":"objects","emoji_order":"1679","aliases":[],"aliases_ascii":[],"keywords":["object","bathroom","tired","steam"]},"hourglass":{"unicode":"231b","unicode_alt":"231b-fe0f","code_decimal":"⌛","name":"hourglass","shortname":":hourglass:","category":"objects","emoji_order":"1680","aliases":[],"aliases_ascii":[],"keywords":["object","time"]},"hourglass_flowing_sand":{"unicode":"23f3","unicode_alt":"","code_decimal":"⏳","name":"hourglass with flowing sand","shortname":":hourglass_flowing_sand:","category":"objects","emoji_order":"1681","aliases":[],"aliases_ascii":[],"keywords":["object","time"]},"watch":{"unicode":"231a","unicode_alt":"231a-fe0f","code_decimal":"⌚","name":"watch","shortname":":watch:","category":"objects","emoji_order":"1682","aliases":[],"aliases_ascii":[],"keywords":["electronics","time"]},"alarm_clock":{"unicode":"23f0","unicode_alt":"","code_decimal":"⏰","name":"alarm clock","shortname":":alarm_clock:","category":"objects","emoji_order":"1683","aliases":[],"aliases_ascii":[],"keywords":["object","time"]},"stopwatch":{"unicode":"23f1","unicode_alt":"23f1-fe0f","code_decimal":"⏱","name":"stopwatch","shortname":":stopwatch:","category":"objects","emoji_order":"1684","aliases":[],"aliases_ascii":[],"keywords":["electronics","time"]},"timer":{"unicode":"23f2","unicode_alt":"23f2-fe0f","code_decimal":"⏲","name":"timer clock","shortname":":timer:","category":"objects","emoji_order":"1685","aliases":[":timer_clock:"],"aliases_ascii":[],"keywords":["object","time"]},"clock":{"unicode":"1f570","unicode_alt":"1f570-fe0f","code_decimal":"🕰","name":"mantlepiece clock","shortname":":clock:","category":"objects","emoji_order":"1686","aliases":[":mantlepiece_clock:"],"aliases_ascii":[],"keywords":["object","time"]},"clock12":{"unicode":"1f55b","unicode_alt":"","code_decimal":"🕛","name":"clock face twelve oclock","shortname":":clock12:","category":"symbols","emoji_order":"1687","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock1230":{"unicode":"1f567","unicode_alt":"","code_decimal":"🕧","name":"clock face twelve-thirty","shortname":":clock1230:","category":"symbols","emoji_order":"1688","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock1":{"unicode":"1f550","unicode_alt":"","code_decimal":"🕐","name":"clock face one oclock","shortname":":clock1:","category":"symbols","emoji_order":"1689","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock130":{"unicode":"1f55c","unicode_alt":"","code_decimal":"🕜","name":"clock face one-thirty","shortname":":clock130:","category":"symbols","emoji_order":"1690","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock2":{"unicode":"1f551","unicode_alt":"","code_decimal":"🕑","name":"clock face two oclock","shortname":":clock2:","category":"symbols","emoji_order":"1691","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock230":{"unicode":"1f55d","unicode_alt":"","code_decimal":"🕝","name":"clock face two-thirty","shortname":":clock230:","category":"symbols","emoji_order":"1692","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock3":{"unicode":"1f552","unicode_alt":"","code_decimal":"🕒","name":"clock face three oclock","shortname":":clock3:","category":"symbols","emoji_order":"1693","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock330":{"unicode":"1f55e","unicode_alt":"","code_decimal":"🕞","name":"clock face three-thirty","shortname":":clock330:","category":"symbols","emoji_order":"1694","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock4":{"unicode":"1f553","unicode_alt":"","code_decimal":"🕓","name":"clock face four oclock","shortname":":clock4:","category":"symbols","emoji_order":"1695","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock430":{"unicode":"1f55f","unicode_alt":"","code_decimal":"🕟","name":"clock face four-thirty","shortname":":clock430:","category":"symbols","emoji_order":"1696","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock5":{"unicode":"1f554","unicode_alt":"","code_decimal":"🕔","name":"clock face five oclock","shortname":":clock5:","category":"symbols","emoji_order":"1697","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock530":{"unicode":"1f560","unicode_alt":"","code_decimal":"🕠","name":"clock face five-thirty","shortname":":clock530:","category":"symbols","emoji_order":"1698","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock6":{"unicode":"1f555","unicode_alt":"","code_decimal":"🕕","name":"clock face six oclock","shortname":":clock6:","category":"symbols","emoji_order":"1699","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock630":{"unicode":"1f561","unicode_alt":"","code_decimal":"🕡","name":"clock face six-thirty","shortname":":clock630:","category":"symbols","emoji_order":"1700","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock7":{"unicode":"1f556","unicode_alt":"","code_decimal":"🕖","name":"clock face seven oclock","shortname":":clock7:","category":"symbols","emoji_order":"1701","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock730":{"unicode":"1f562","unicode_alt":"","code_decimal":"🕢","name":"clock face seven-thirty","shortname":":clock730:","category":"symbols","emoji_order":"1702","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock8":{"unicode":"1f557","unicode_alt":"","code_decimal":"🕗","name":"clock face eight oclock","shortname":":clock8:","category":"symbols","emoji_order":"1703","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock830":{"unicode":"1f563","unicode_alt":"","code_decimal":"🕣","name":"clock face eight-thirty","shortname":":clock830:","category":"symbols","emoji_order":"1704","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock9":{"unicode":"1f558","unicode_alt":"","code_decimal":"🕘","name":"clock face nine oclock","shortname":":clock9:","category":"symbols","emoji_order":"1705","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock930":{"unicode":"1f564","unicode_alt":"","code_decimal":"🕤","name":"clock face nine-thirty","shortname":":clock930:","category":"symbols","emoji_order":"1706","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock10":{"unicode":"1f559","unicode_alt":"","code_decimal":"🕙","name":"clock face ten oclock","shortname":":clock10:","category":"symbols","emoji_order":"1707","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock1030":{"unicode":"1f565","unicode_alt":"","code_decimal":"🕥","name":"clock face ten-thirty","shortname":":clock1030:","category":"symbols","emoji_order":"1708","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock11":{"unicode":"1f55a","unicode_alt":"","code_decimal":"🕚","name":"clock face eleven oclock","shortname":":clock11:","category":"symbols","emoji_order":"1709","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock1130":{"unicode":"1f566","unicode_alt":"","code_decimal":"🕦","name":"clock face eleven-thirty","shortname":":clock1130:","category":"symbols","emoji_order":"1710","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"new_moon":{"unicode":"1f311","unicode_alt":"","code_decimal":"🌑","name":"new moon symbol","shortname":":new_moon:","category":"nature","emoji_order":"1711","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon"]},"waxing_crescent_moon":{"unicode":"1f312","unicode_alt":"","code_decimal":"🌒","name":"waxing crescent moon symbol","shortname":":waxing_crescent_moon:","category":"nature","emoji_order":"1712","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon"]},"first_quarter_moon":{"unicode":"1f313","unicode_alt":"","code_decimal":"🌓","name":"first quarter moon symbol","shortname":":first_quarter_moon:","category":"nature","emoji_order":"1713","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon"]},"waxing_gibbous_moon":{"unicode":"1f314","unicode_alt":"","code_decimal":"🌔","name":"waxing gibbous moon symbol","shortname":":waxing_gibbous_moon:","category":"nature","emoji_order":"1714","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon"]},"full_moon":{"unicode":"1f315","unicode_alt":"","code_decimal":"🌕","name":"full moon symbol","shortname":":full_moon:","category":"nature","emoji_order":"1715","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon"]},"waning_gibbous_moon":{"unicode":"1f316","unicode_alt":"","code_decimal":"🌖","name":"waning gibbous moon symbol","shortname":":waning_gibbous_moon:","category":"nature","emoji_order":"1716","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon"]},"last_quarter_moon":{"unicode":"1f317","unicode_alt":"","code_decimal":"🌗","name":"last quarter moon symbol","shortname":":last_quarter_moon:","category":"nature","emoji_order":"1717","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon"]},"waning_crescent_moon":{"unicode":"1f318","unicode_alt":"","code_decimal":"🌘","name":"waning crescent moon symbol","shortname":":waning_crescent_moon:","category":"nature","emoji_order":"1718","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon"]},"crescent_moon":{"unicode":"1f319","unicode_alt":"","code_decimal":"🌙","name":"crescent moon","shortname":":crescent_moon:","category":"nature","emoji_order":"1719","aliases":[],"aliases_ascii":[],"keywords":["space","sky","goodnight","moon"]},"new_moon_with_face":{"unicode":"1f31a","unicode_alt":"","code_decimal":"🌚","name":"new moon with face","shortname":":new_moon_with_face:","category":"nature","emoji_order":"1720","aliases":[],"aliases_ascii":[],"keywords":["space","sky","goodnight","moon"]},"first_quarter_moon_with_face":{"unicode":"1f31b","unicode_alt":"","code_decimal":"🌛","name":"first quarter moon with face","shortname":":first_quarter_moon_with_face:","category":"nature","emoji_order":"1721","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon"]},"last_quarter_moon_with_face":{"unicode":"1f31c","unicode_alt":"","code_decimal":"🌜","name":"last quarter moon with face","shortname":":last_quarter_moon_with_face:","category":"nature","emoji_order":"1722","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon"]},"thermometer":{"unicode":"1f321","unicode_alt":"1f321-fe0f","code_decimal":"🌡","name":"thermometer","shortname":":thermometer:","category":"objects","emoji_order":"1723","aliases":[],"aliases_ascii":[],"keywords":["object","science","health","hot"]},"sunny":{"unicode":"2600","unicode_alt":"2600-fe0f","code_decimal":"☀","name":"black sun with rays","shortname":":sunny:","category":"nature","emoji_order":"1724","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","day","sun","hot","morning"]},"full_moon_with_face":{"unicode":"1f31d","unicode_alt":"","code_decimal":"🌝","name":"full moon with face","shortname":":full_moon_with_face:","category":"nature","emoji_order":"1725","aliases":[],"aliases_ascii":[],"keywords":["space","sky","goodnight","moon"]},"sun_with_face":{"unicode":"1f31e","unicode_alt":"","code_decimal":"🌞","name":"sun with face","shortname":":sun_with_face:","category":"nature","emoji_order":"1726","aliases":[],"aliases_ascii":[],"keywords":["sky","day","sun","hump day","morning"]},"star":{"unicode":"2b50","unicode_alt":"2b50-fe0f","code_decimal":"⭐","name":"white medium star","shortname":":star:","category":"nature","emoji_order":"1727","aliases":[],"aliases_ascii":[],"keywords":["space","sky","star"]},"star2":{"unicode":"1f31f","unicode_alt":"","code_decimal":"🌟","name":"glowing star","shortname":":star2:","category":"nature","emoji_order":"1728","aliases":[],"aliases_ascii":[],"keywords":["space","sky","star"]},"stars":{"unicode":"1f320","unicode_alt":"","code_decimal":"🌠","name":"shooting star","shortname":":stars:","category":"travel","emoji_order":"1729","aliases":[],"aliases_ascii":[],"keywords":["space"]},"cloud":{"unicode":"2601","unicode_alt":"2601-fe0f","code_decimal":"☁","name":"cloud","shortname":":cloud:","category":"nature","emoji_order":"1730","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","rain"]},"partly_sunny":{"unicode":"26c5","unicode_alt":"26c5-fe0f","code_decimal":"⛅","name":"sun behind cloud","shortname":":partly_sunny:","category":"nature","emoji_order":"1731","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","cloud","sun"]},"thunder_cloud_rain":{"unicode":"26c8","unicode_alt":"26c8-fe0f","code_decimal":"⛈","name":"thunder cloud and rain","shortname":":thunder_cloud_rain:","category":"nature","emoji_order":"1732","aliases":[":thunder_cloud_and_rain:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","rain"]},"white_sun_small_cloud":{"unicode":"1f324","unicode_alt":"1f324-fe0f","code_decimal":"🌤","name":"white sun with small cloud","shortname":":white_sun_small_cloud:","category":"nature","emoji_order":"1733","aliases":[":white_sun_with_small_cloud:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","sun"]},"white_sun_cloud":{"unicode":"1f325","unicode_alt":"1f325-fe0f","code_decimal":"🌥","name":"white sun behind cloud","shortname":":white_sun_cloud:","category":"nature","emoji_order":"1734","aliases":[":white_sun_behind_cloud:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","sun"]},"white_sun_rain_cloud":{"unicode":"1f326","unicode_alt":"1f326-fe0f","code_decimal":"🌦","name":"white sun behind cloud with rain","shortname":":white_sun_rain_cloud:","category":"nature","emoji_order":"1735","aliases":[":white_sun_behind_cloud_with_rain:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","rain","sun"]},"cloud_rain":{"unicode":"1f327","unicode_alt":"1f327-fe0f","code_decimal":"🌧","name":"cloud with rain","shortname":":cloud_rain:","category":"nature","emoji_order":"1736","aliases":[":cloud_with_rain:"],"aliases_ascii":[],"keywords":["weather","winter","sky","cloud","cold","rain"]},"cloud_snow":{"unicode":"1f328","unicode_alt":"1f328-fe0f","code_decimal":"🌨","name":"cloud with snow","shortname":":cloud_snow:","category":"nature","emoji_order":"1737","aliases":[":cloud_with_snow:"],"aliases_ascii":[],"keywords":["weather","winter","sky","cloud","cold","snow"]},"cloud_lightning":{"unicode":"1f329","unicode_alt":"1f329-fe0f","code_decimal":"🌩","name":"cloud with lightning","shortname":":cloud_lightning:","category":"nature","emoji_order":"1738","aliases":[":cloud_with_lightning:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","rain"]},"cloud_tornado":{"unicode":"1f32a","unicode_alt":"1f32a-fe0f","code_decimal":"🌪","name":"cloud with tornado","shortname":":cloud_tornado:","category":"nature","emoji_order":"1739","aliases":[":cloud_with_tornado:"],"aliases_ascii":[],"keywords":["weather","sky","cold"]},"fog":{"unicode":"1f32b","unicode_alt":"1f32b-fe0f","code_decimal":"🌫","name":"fog","shortname":":fog:","category":"nature","emoji_order":"1740","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","cold"]},"wind_blowing_face":{"unicode":"1f32c","unicode_alt":"1f32c-fe0f","code_decimal":"🌬","name":"wind blowing face","shortname":":wind_blowing_face:","category":"nature","emoji_order":"1741","aliases":[],"aliases_ascii":[],"keywords":["weather","cold"]},"cyclone":{"unicode":"1f300","unicode_alt":"","code_decimal":"🌀","name":"cyclone","shortname":":cyclone:","category":"symbols","emoji_order":"1742","aliases":[],"aliases_ascii":[],"keywords":["symbol","drugs"]},"rainbow":{"unicode":"1f308","unicode_alt":"","code_decimal":"🌈","name":"rainbow","shortname":":rainbow:","category":"travel","emoji_order":"1743","aliases":[],"aliases_ascii":[],"keywords":["weather","gay","sky","rain"]},"closed_umbrella":{"unicode":"1f302","unicode_alt":"","code_decimal":"🌂","name":"closed umbrella","shortname":":closed_umbrella:","category":"people","emoji_order":"1744","aliases":[],"aliases_ascii":[],"keywords":["object","sky","rain","accessories"]},"umbrella2":{"unicode":"2602","unicode_alt":"2602-fe0f","code_decimal":"☂","name":"umbrella","shortname":":umbrella2:","category":"nature","emoji_order":"1745","aliases":[],"aliases_ascii":[],"keywords":["weather","object","sky","cold"]},"umbrella":{"unicode":"2614","unicode_alt":"2614-fe0f","code_decimal":"☔","name":"umbrella with rain drops","shortname":":umbrella:","category":"nature","emoji_order":"1746","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","cold","rain"]},"beach_umbrella":{"unicode":"26f1","unicode_alt":"26f1-fe0f","code_decimal":"⛱","name":"umbrella on ground","shortname":":beach_umbrella:","category":"objects","emoji_order":"1747","aliases":[":umbrella_on_ground:"],"aliases_ascii":[],"keywords":["travel","vacation","tropical"]},"zap":{"unicode":"26a1","unicode_alt":"26a1-fe0f","code_decimal":"⚡","name":"high voltage sign","shortname":":zap:","category":"nature","emoji_order":"1748","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","diarrhea"]},"snowflake":{"unicode":"2744","unicode_alt":"2744-fe0f","code_decimal":"❄","name":"snowflake","shortname":":snowflake:","category":"nature","emoji_order":"1749","aliases":[],"aliases_ascii":[],"keywords":["weather","winter","sky","holidays","cold","snow"]},"snowman2":{"unicode":"2603","unicode_alt":"2603-fe0f","code_decimal":"☃","name":"snowman","shortname":":snowman2:","category":"nature","emoji_order":"1750","aliases":[],"aliases_ascii":[],"keywords":["weather","winter","holidays","christmas","cold","snow"]},"snowman":{"unicode":"26c4","unicode_alt":"26c4-fe0f","code_decimal":"⛄","name":"snowman without snow","shortname":":snowman:","category":"nature","emoji_order":"1751","aliases":[],"aliases_ascii":[],"keywords":["weather","winter","holidays","cold","snow"]},"comet":{"unicode":"2604","unicode_alt":"2604-fe0f","code_decimal":"☄","name":"comet","shortname":":comet:","category":"nature","emoji_order":"1752","aliases":[],"aliases_ascii":[],"keywords":["space","sky"]},"fire":{"unicode":"1f525","unicode_alt":"","code_decimal":"🔥","name":"fire","shortname":":fire:","category":"nature","emoji_order":"1753","aliases":[":flame:"],"aliases_ascii":[],"keywords":["wth","hot"]},"droplet":{"unicode":"1f4a7","unicode_alt":"","code_decimal":"💧","name":"droplet","shortname":":droplet:","category":"nature","emoji_order":"1754","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","rain"]},"ocean":{"unicode":"1f30a","unicode_alt":"","code_decimal":"🌊","name":"water wave","shortname":":ocean:","category":"nature","emoji_order":"1755","aliases":[],"aliases_ascii":[],"keywords":["weather","boat","tropical","swim"]},"jack_o_lantern":{"unicode":"1f383","unicode_alt":"","code_decimal":"🎃","name":"jack-o-lantern","shortname":":jack_o_lantern:","category":"nature","emoji_order":"1756","aliases":[],"aliases_ascii":[],"keywords":["holidays","halloween"]},"christmas_tree":{"unicode":"1f384","unicode_alt":"","code_decimal":"🎄","name":"christmas tree","shortname":":christmas_tree:","category":"nature","emoji_order":"1757","aliases":[],"aliases_ascii":[],"keywords":["plant","holidays","christmas","trees"]},"fireworks":{"unicode":"1f386","unicode_alt":"","code_decimal":"🎆","name":"fireworks","shortname":":fireworks:","category":"travel","emoji_order":"1758","aliases":[],"aliases_ascii":[],"keywords":["parties"]},"sparkler":{"unicode":"1f387","unicode_alt":"","code_decimal":"🎇","name":"firework sparkler","shortname":":sparkler:","category":"travel","emoji_order":"1759","aliases":[],"aliases_ascii":[],"keywords":["parties"]},"sparkles":{"unicode":"2728","unicode_alt":"","code_decimal":"✨","name":"sparkles","shortname":":sparkles:","category":"nature","emoji_order":"1760","aliases":[],"aliases_ascii":[],"keywords":["star","girls night"]},"balloon":{"unicode":"1f388","unicode_alt":"","code_decimal":"🎈","name":"balloon","shortname":":balloon:","category":"objects","emoji_order":"1761","aliases":[],"aliases_ascii":[],"keywords":["object","birthday","good","parties"]},"tada":{"unicode":"1f389","unicode_alt":"","code_decimal":"🎉","name":"party popper","shortname":":tada:","category":"objects","emoji_order":"1762","aliases":[],"aliases_ascii":[],"keywords":["object","birthday","holidays","cheers","good","girls night","boys night","parties"]},"confetti_ball":{"unicode":"1f38a","unicode_alt":"","code_decimal":"🎊","name":"confetti ball","shortname":":confetti_ball:","category":"objects","emoji_order":"1763","aliases":[],"aliases_ascii":[],"keywords":["object","birthday","holidays","cheers","girls night","boys night","parties"]},"tanabata_tree":{"unicode":"1f38b","unicode_alt":"","code_decimal":"🎋","name":"tanabata tree","shortname":":tanabata_tree:","category":"nature","emoji_order":"1764","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","trees"]},"bamboo":{"unicode":"1f38d","unicode_alt":"","code_decimal":"🎍","name":"pine decoration","shortname":":bamboo:","category":"nature","emoji_order":"1765","aliases":[],"aliases_ascii":[],"keywords":["nature","plant"]},"dolls":{"unicode":"1f38e","unicode_alt":"","code_decimal":"🎎","name":"japanese dolls","shortname":":dolls:","category":"objects","emoji_order":"1766","aliases":[],"aliases_ascii":[],"keywords":["people","japan"]},"flags":{"unicode":"1f38f","unicode_alt":"","code_decimal":"🎏","name":"carp streamer","shortname":":flags:","category":"objects","emoji_order":"1767","aliases":[],"aliases_ascii":[],"keywords":["object","japan"]},"wind_chime":{"unicode":"1f390","unicode_alt":"","code_decimal":"🎐","name":"wind chime","shortname":":wind_chime:","category":"objects","emoji_order":"1768","aliases":[],"aliases_ascii":[],"keywords":["object","japan"]},"rice_scene":{"unicode":"1f391","unicode_alt":"","code_decimal":"🎑","name":"moon viewing ceremony","shortname":":rice_scene:","category":"travel","emoji_order":"1769","aliases":[],"aliases_ascii":[],"keywords":["places","space","sky","travel"]},"ribbon":{"unicode":"1f380","unicode_alt":"","code_decimal":"🎀","name":"ribbon","shortname":":ribbon:","category":"objects","emoji_order":"1770","aliases":[],"aliases_ascii":[],"keywords":["object","gift","birthday"]},"gift":{"unicode":"1f381","unicode_alt":"","code_decimal":"🎁","name":"wrapped present","shortname":":gift:","category":"objects","emoji_order":"1771","aliases":[],"aliases_ascii":[],"keywords":["object","gift","birthday","holidays","christmas","parties"]},"reminder_ribbon":{"unicode":"1f397","unicode_alt":"1f397-fe0f","code_decimal":"🎗","name":"reminder ribbon","shortname":":reminder_ribbon:","category":"activity","emoji_order":"1772","aliases":[],"aliases_ascii":[],"keywords":["award"]},"tickets":{"unicode":"1f39f","unicode_alt":"1f39f-fe0f","code_decimal":"🎟","name":"admission tickets","shortname":":tickets:","category":"activity","emoji_order":"1773","aliases":[":admission_tickets:"],"aliases_ascii":[],"keywords":["theatre","movie","parties"]},"ticket":{"unicode":"1f3ab","unicode_alt":"","code_decimal":"🎫","name":"ticket","shortname":":ticket:","category":"activity","emoji_order":"1774","aliases":[],"aliases_ascii":[],"keywords":["theatre","movie","parties"]},"military_medal":{"unicode":"1f396","unicode_alt":"1f396-fe0f","code_decimal":"🎖","name":"military medal","shortname":":military_medal:","category":"activity","emoji_order":"1775","aliases":[],"aliases_ascii":[],"keywords":["object","award","win"]},"trophy":{"unicode":"1f3c6","unicode_alt":"","code_decimal":"🏆","name":"trophy","shortname":":trophy:","category":"activity","emoji_order":"1776","aliases":[],"aliases_ascii":[],"keywords":["object","game","award","win","perfect","parties"]},"medal":{"unicode":"1f3c5","unicode_alt":"","code_decimal":"🏅","name":"sports medal","shortname":":medal:","category":"activity","emoji_order":"1777","aliases":[":sports_medal:"],"aliases_ascii":[],"keywords":["object","award","sport","win","perfect"]},"first_place":{"unicode":"1f947","unicode_alt":"","code_decimal":"🥇","name":"first place medal","shortname":":first_place:","category":"activity","emoji_order":"1778","aliases":[":first_place_medal:"],"aliases_ascii":[],"keywords":[]},"second_place":{"unicode":"1f948","unicode_alt":"","code_decimal":"🥈","name":"second place medal","shortname":":second_place:","category":"activity","emoji_order":"1779","aliases":[":second_place_medal:"],"aliases_ascii":[],"keywords":[]},"third_place":{"unicode":"1f949","unicode_alt":"","code_decimal":"🥉","name":"third place medal","shortname":":third_place:","category":"activity","emoji_order":"1780","aliases":[":third_place_medal:"],"aliases_ascii":[],"keywords":[]},"soccer":{"unicode":"26bd","unicode_alt":"26bd-fe0f","code_decimal":"⚽","name":"soccer ball","shortname":":soccer:","category":"activity","emoji_order":"1781","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","soccer","football"]},"baseball":{"unicode":"26be","unicode_alt":"26be-fe0f","code_decimal":"⚾","name":"baseball","shortname":":baseball:","category":"activity","emoji_order":"1782","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","baseball"]},"basketball":{"unicode":"1f3c0","unicode_alt":"","code_decimal":"🏀","name":"basketball and hoop","shortname":":basketball:","category":"activity","emoji_order":"1783","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","basketball"]},"volleyball":{"unicode":"1f3d0","unicode_alt":"","code_decimal":"🏐","name":"volleyball","shortname":":volleyball:","category":"activity","emoji_order":"1784","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","volleyball"]},"football":{"unicode":"1f3c8","unicode_alt":"","code_decimal":"🏈","name":"american football","shortname":":football:","category":"activity","emoji_order":"1785","aliases":[],"aliases_ascii":[],"keywords":["america","game","ball","sport","football"]},"rugby_football":{"unicode":"1f3c9","unicode_alt":"","code_decimal":"🏉","name":"rugby football","shortname":":rugby_football:","category":"activity","emoji_order":"1786","aliases":[],"aliases_ascii":[],"keywords":["game","sport","football"]},"tennis":{"unicode":"1f3be","unicode_alt":"","code_decimal":"🎾","name":"tennis racquet and ball","shortname":":tennis:","category":"activity","emoji_order":"1787","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","tennis"]},"8ball":{"unicode":"1f3b1","unicode_alt":"","code_decimal":"🎱","name":"billiards","shortname":":8ball:","category":"activity","emoji_order":"1788","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","billiards","luck","boys night"]},"bowling":{"unicode":"1f3b3","unicode_alt":"","code_decimal":"🎳","name":"bowling","shortname":":bowling:","category":"activity","emoji_order":"1789","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","boys night"]},"cricket":{"unicode":"1f3cf","unicode_alt":"","code_decimal":"🏏","name":"cricket bat and ball","shortname":":cricket:","category":"activity","emoji_order":"1790","aliases":[":cricket_bat_ball:"],"aliases_ascii":[],"keywords":["ball","sport","cricket"]},"field_hockey":{"unicode":"1f3d1","unicode_alt":"","code_decimal":"🏑","name":"field hockey stick and ball","shortname":":field_hockey:","category":"activity","emoji_order":"1791","aliases":[],"aliases_ascii":[],"keywords":["ball","sport","hockey"]},"hockey":{"unicode":"1f3d2","unicode_alt":"","code_decimal":"🏒","name":"ice hockey stick and puck","shortname":":hockey:","category":"activity","emoji_order":"1792","aliases":[],"aliases_ascii":[],"keywords":["game","sport","hockey"]},"ping_pong":{"unicode":"1f3d3","unicode_alt":"","code_decimal":"🏓","name":"table tennis paddle and ball","shortname":":ping_pong:","category":"activity","emoji_order":"1793","aliases":[":table_tennis:"],"aliases_ascii":[],"keywords":["game","ball","sport","ping pong"]},"badminton":{"unicode":"1f3f8","unicode_alt":"","code_decimal":"🏸","name":"badminton racquet","shortname":":badminton:","category":"activity","emoji_order":"1794","aliases":[],"aliases_ascii":[],"keywords":["game","sport","badminton"]},"boxing_glove":{"unicode":"1f94a","unicode_alt":"","code_decimal":"🥊","name":"boxing glove","shortname":":boxing_glove:","category":"activity","emoji_order":"1795","aliases":[":boxing_gloves:"],"aliases_ascii":[],"keywords":[]},"martial_arts_uniform":{"unicode":"1f94b","unicode_alt":"","code_decimal":"🥋","name":"martial arts uniform","shortname":":martial_arts_uniform:","category":"activity","emoji_order":"1796","aliases":[":karate_uniform:"],"aliases_ascii":[],"keywords":[]},"goal":{"unicode":"1f945","unicode_alt":"","code_decimal":"🥅","name":"goal net","shortname":":goal:","category":"activity","emoji_order":"1797","aliases":[":goal_net:"],"aliases_ascii":[],"keywords":[]},"dart":{"unicode":"1f3af","unicode_alt":"","code_decimal":"🎯","name":"direct hit","shortname":":dart:","category":"activity","emoji_order":"1798","aliases":[],"aliases_ascii":[],"keywords":["game","sport","boys night"]},"golf":{"unicode":"26f3","unicode_alt":"26f3-fe0f","code_decimal":"⛳","name":"flag in hole","shortname":":golf:","category":"activity","emoji_order":"1799","aliases":[],"aliases_ascii":[],"keywords":["game","ball","vacation","sport","golf"]},"ice_skate":{"unicode":"26f8","unicode_alt":"26f8-fe0f","code_decimal":"⛸","name":"ice skate","shortname":":ice_skate:","category":"activity","emoji_order":"1800","aliases":[],"aliases_ascii":[],"keywords":["cold","sport","ice skating"]},"fishing_pole_and_fish":{"unicode":"1f3a3","unicode_alt":"","code_decimal":"🎣","name":"fishing pole and fish","shortname":":fishing_pole_and_fish:","category":"activity","emoji_order":"1801","aliases":[],"aliases_ascii":[],"keywords":["vacation","sport","fishing"]},"running_shirt_with_sash":{"unicode":"1f3bd","unicode_alt":"","code_decimal":"🎽","name":"running shirt with sash","shortname":":running_shirt_with_sash:","category":"activity","emoji_order":"1802","aliases":[],"aliases_ascii":[],"keywords":["award"]},"ski":{"unicode":"1f3bf","unicode_alt":"","code_decimal":"🎿","name":"ski and ski boot","shortname":":ski:","category":"activity","emoji_order":"1803","aliases":[],"aliases_ascii":[],"keywords":["cold","sport","skiing"]},"video_game":{"unicode":"1f3ae","unicode_alt":"","code_decimal":"🎮","name":"video game","shortname":":video_game:","category":"activity","emoji_order":"1804","aliases":[],"aliases_ascii":[],"keywords":["electronics","game","boys night"]},"joystick":{"unicode":"1f579","unicode_alt":"1f579-fe0f","code_decimal":"🕹","name":"joystick","shortname":":joystick:","category":"objects","emoji_order":"1805","aliases":[],"aliases_ascii":[],"keywords":["electronics","game","boys night"]},"game_die":{"unicode":"1f3b2","unicode_alt":"","code_decimal":"🎲","name":"game die","shortname":":game_die:","category":"activity","emoji_order":"1806","aliases":[],"aliases_ascii":[],"keywords":["object","game","boys night"]},"spades":{"unicode":"2660","unicode_alt":"2660-fe0f","code_decimal":"♠","name":"black spade suit","shortname":":spades:","category":"symbols","emoji_order":"1807","aliases":[],"aliases_ascii":[],"keywords":["symbol","game"]},"hearts":{"unicode":"2665","unicode_alt":"2665-fe0f","code_decimal":"♥","name":"black heart suit","shortname":":hearts:","category":"symbols","emoji_order":"1808","aliases":[],"aliases_ascii":[],"keywords":["love","symbol","game"]},"diamonds":{"unicode":"2666","unicode_alt":"2666-fe0f","code_decimal":"♦","name":"black diamond suit","shortname":":diamonds:","category":"symbols","emoji_order":"1809","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","game"]},"clubs":{"unicode":"2663","unicode_alt":"2663-fe0f","code_decimal":"♣","name":"black club suit","shortname":":clubs:","category":"symbols","emoji_order":"1810","aliases":[],"aliases_ascii":[],"keywords":["symbol","game"]},"black_joker":{"unicode":"1f0cf","unicode_alt":"","code_decimal":"🃏","name":"playing card black joker","shortname":":black_joker:","category":"symbols","emoji_order":"1811","aliases":[],"aliases_ascii":[],"keywords":["object","symbol","game"]},"mahjong":{"unicode":"1f004","unicode_alt":"1f004-fe0f","code_decimal":"🀄","name":"mahjong tile red dragon","shortname":":mahjong:","category":"symbols","emoji_order":"1812","aliases":[],"aliases_ascii":[],"keywords":["object","symbol","game"]},"flower_playing_cards":{"unicode":"1f3b4","unicode_alt":"","code_decimal":"🎴","name":"flower playing cards","shortname":":flower_playing_cards:","category":"symbols","emoji_order":"1813","aliases":[],"aliases_ascii":[],"keywords":["object","symbol"]},"mute":{"unicode":"1f507","unicode_alt":"","code_decimal":"🔇","name":"speaker with cancellation stroke","shortname":":mute:","category":"symbols","emoji_order":"1814","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"speaker":{"unicode":"1f508","unicode_alt":"","code_decimal":"🔈","name":"speaker","shortname":":speaker:","category":"symbols","emoji_order":"1815","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"sound":{"unicode":"1f509","unicode_alt":"","code_decimal":"🔉","name":"speaker with one sound wave","shortname":":sound:","category":"symbols","emoji_order":"1816","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"loud_sound":{"unicode":"1f50a","unicode_alt":"","code_decimal":"🔊","name":"speaker with three sound waves","shortname":":loud_sound:","category":"symbols","emoji_order":"1817","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"loudspeaker":{"unicode":"1f4e2","unicode_alt":"","code_decimal":"📢","name":"public address loudspeaker","shortname":":loudspeaker:","category":"symbols","emoji_order":"1818","aliases":[],"aliases_ascii":[],"keywords":["object","alarm","symbol"]},"mega":{"unicode":"1f4e3","unicode_alt":"","code_decimal":"📣","name":"cheering megaphone","shortname":":mega:","category":"symbols","emoji_order":"1819","aliases":[],"aliases_ascii":[],"keywords":["object","sport"]},"postal_horn":{"unicode":"1f4ef","unicode_alt":"","code_decimal":"📯","name":"postal horn","shortname":":postal_horn:","category":"objects","emoji_order":"1820","aliases":[],"aliases_ascii":[],"keywords":["object"]},"bell":{"unicode":"1f514","unicode_alt":"","code_decimal":"🔔","name":"bell","shortname":":bell:","category":"symbols","emoji_order":"1821","aliases":[],"aliases_ascii":[],"keywords":["object","alarm","symbol"]},"no_bell":{"unicode":"1f515","unicode_alt":"","code_decimal":"🔕","name":"bell with cancellation stroke","shortname":":no_bell:","category":"symbols","emoji_order":"1822","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"musical_score":{"unicode":"1f3bc","unicode_alt":"","code_decimal":"🎼","name":"musical score","shortname":":musical_score:","category":"activity","emoji_order":"1823","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"musical_note":{"unicode":"1f3b5","unicode_alt":"","code_decimal":"🎵","name":"musical note","shortname":":musical_note:","category":"symbols","emoji_order":"1824","aliases":[],"aliases_ascii":[],"keywords":["instruments","symbol"]},"notes":{"unicode":"1f3b6","unicode_alt":"","code_decimal":"🎶","name":"multiple musical notes","shortname":":notes:","category":"symbols","emoji_order":"1825","aliases":[],"aliases_ascii":[],"keywords":["instruments","symbol"]},"microphone2":{"unicode":"1f399","unicode_alt":"1f399-fe0f","code_decimal":"🎙","name":"studio microphone","shortname":":microphone2:","category":"objects","emoji_order":"1826","aliases":[":studio_microphone:"],"aliases_ascii":[],"keywords":["electronics","object"]},"level_slider":{"unicode":"1f39a","unicode_alt":"1f39a-fe0f","code_decimal":"🎚","name":"level slider","shortname":":level_slider:","category":"objects","emoji_order":"1827","aliases":[],"aliases_ascii":[],"keywords":[]},"control_knobs":{"unicode":"1f39b","unicode_alt":"1f39b-fe0f","code_decimal":"🎛","name":"control knobs","shortname":":control_knobs:","category":"objects","emoji_order":"1828","aliases":[],"aliases_ascii":[],"keywords":["time"]},"microphone":{"unicode":"1f3a4","unicode_alt":"","code_decimal":"🎤","name":"microphone","shortname":":microphone:","category":"activity","emoji_order":"1829","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"headphones":{"unicode":"1f3a7","unicode_alt":"","code_decimal":"🎧","name":"headphone","shortname":":headphones:","category":"activity","emoji_order":"1830","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"radio":{"unicode":"1f4fb","unicode_alt":"","code_decimal":"📻","name":"radio","shortname":":radio:","category":"objects","emoji_order":"1831","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"saxophone":{"unicode":"1f3b7","unicode_alt":"","code_decimal":"🎷","name":"saxophone","shortname":":saxophone:","category":"activity","emoji_order":"1832","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"guitar":{"unicode":"1f3b8","unicode_alt":"","code_decimal":"🎸","name":"guitar","shortname":":guitar:","category":"activity","emoji_order":"1833","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"musical_keyboard":{"unicode":"1f3b9","unicode_alt":"","code_decimal":"🎹","name":"musical keyboard","shortname":":musical_keyboard:","category":"activity","emoji_order":"1834","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"trumpet":{"unicode":"1f3ba","unicode_alt":"","code_decimal":"🎺","name":"trumpet","shortname":":trumpet:","category":"activity","emoji_order":"1835","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"violin":{"unicode":"1f3bb","unicode_alt":"","code_decimal":"🎻","name":"violin","shortname":":violin:","category":"activity","emoji_order":"1836","aliases":[],"aliases_ascii":[],"keywords":["instruments","sarcastic"]},"drum":{"unicode":"1f941","unicode_alt":"","code_decimal":"🥁","name":"drum with drumsticks","shortname":":drum:","category":"activity","emoji_order":"1837","aliases":[":drum_with_drumsticks:"],"aliases_ascii":[],"keywords":[]},"iphone":{"unicode":"1f4f1","unicode_alt":"","code_decimal":"📱","name":"mobile phone","shortname":":iphone:","category":"objects","emoji_order":"1838","aliases":[],"aliases_ascii":[],"keywords":["electronics","phone","selfie"]},"calling":{"unicode":"1f4f2","unicode_alt":"","code_decimal":"📲","name":"mobile phone with rightwards arrow at left","shortname":":calling:","category":"objects","emoji_order":"1839","aliases":[],"aliases_ascii":[],"keywords":["electronics","phone","selfie"]},"telephone":{"unicode":"260e","unicode_alt":"260e-fe0f","code_decimal":"☎","name":"black telephone","shortname":":telephone:","category":"objects","emoji_order":"1840","aliases":[],"aliases_ascii":[],"keywords":["electronics","phone"]},"telephone_receiver":{"unicode":"1f4de","unicode_alt":"","code_decimal":"📞","name":"telephone receiver","shortname":":telephone_receiver:","category":"objects","emoji_order":"1841","aliases":[],"aliases_ascii":[],"keywords":["electronics","phone"]},"pager":{"unicode":"1f4df","unicode_alt":"","code_decimal":"📟","name":"pager","shortname":":pager:","category":"objects","emoji_order":"1842","aliases":[],"aliases_ascii":[],"keywords":["electronics","work"]},"fax":{"unicode":"1f4e0","unicode_alt":"","code_decimal":"📠","name":"fax machine","shortname":":fax:","category":"objects","emoji_order":"1843","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","office"]},"battery":{"unicode":"1f50b","unicode_alt":"","code_decimal":"🔋","name":"battery","shortname":":battery:","category":"objects","emoji_order":"1844","aliases":[],"aliases_ascii":[],"keywords":["object"]},"electric_plug":{"unicode":"1f50c","unicode_alt":"","code_decimal":"🔌","name":"electric plug","shortname":":electric_plug:","category":"objects","emoji_order":"1845","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"computer":{"unicode":"1f4bb","unicode_alt":"","code_decimal":"💻","name":"personal computer","shortname":":computer:","category":"objects","emoji_order":"1846","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","office"]},"desktop":{"unicode":"1f5a5","unicode_alt":"1f5a5-fe0f","code_decimal":"🖥","name":"desktop computer","shortname":":desktop:","category":"objects","emoji_order":"1847","aliases":[":desktop_computer:"],"aliases_ascii":[],"keywords":["electronics","work"]},"printer":{"unicode":"1f5a8","unicode_alt":"1f5a8-fe0f","code_decimal":"🖨","name":"printer","shortname":":printer:","category":"objects","emoji_order":"1848","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","office"]},"keyboard":{"unicode":"2328","unicode_alt":"2328-fe0f","code_decimal":"⌨","name":"keyboard","shortname":":keyboard:","category":"objects","emoji_order":"1849","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","office"]},"mouse_three_button":{"unicode":"1f5b1","unicode_alt":"1f5b1-fe0f","code_decimal":"🖱","name":"three button mouse","shortname":":mouse_three_button:","category":"objects","emoji_order":"1850","aliases":[":three_button_mouse:"],"aliases_ascii":[],"keywords":["electronics","work","game","office"]},"trackball":{"unicode":"1f5b2","unicode_alt":"1f5b2-fe0f","code_decimal":"🖲","name":"trackball","shortname":":trackball:","category":"objects","emoji_order":"1851","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","game","office"]},"minidisc":{"unicode":"1f4bd","unicode_alt":"","code_decimal":"💽","name":"minidisc","shortname":":minidisc:","category":"objects","emoji_order":"1852","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"floppy_disk":{"unicode":"1f4be","unicode_alt":"","code_decimal":"💾","name":"floppy disk","shortname":":floppy_disk:","category":"objects","emoji_order":"1853","aliases":[],"aliases_ascii":[],"keywords":["electronics","office"]},"cd":{"unicode":"1f4bf","unicode_alt":"","code_decimal":"💿","name":"optical disc","shortname":":cd:","category":"objects","emoji_order":"1854","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"dvd":{"unicode":"1f4c0","unicode_alt":"","code_decimal":"📀","name":"dvd","shortname":":dvd:","category":"objects","emoji_order":"1855","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"movie_camera":{"unicode":"1f3a5","unicode_alt":"","code_decimal":"🎥","name":"movie camera","shortname":":movie_camera:","category":"objects","emoji_order":"1856","aliases":[],"aliases_ascii":[],"keywords":["object","camera","movie"]},"film_frames":{"unicode":"1f39e","unicode_alt":"1f39e-fe0f","code_decimal":"🎞","name":"film frames","shortname":":film_frames:","category":"objects","emoji_order":"1857","aliases":[],"aliases_ascii":[],"keywords":["object","camera","movie"]},"projector":{"unicode":"1f4fd","unicode_alt":"1f4fd-fe0f","code_decimal":"📽","name":"film projector","shortname":":projector:","category":"objects","emoji_order":"1858","aliases":[":film_projector:"],"aliases_ascii":[],"keywords":["object","camera","movie"]},"clapper":{"unicode":"1f3ac","unicode_alt":"","code_decimal":"🎬","name":"clapper board","shortname":":clapper:","category":"activity","emoji_order":"1859","aliases":[],"aliases_ascii":[],"keywords":["movie"]},"tv":{"unicode":"1f4fa","unicode_alt":"","code_decimal":"📺","name":"television","shortname":":tv:","category":"objects","emoji_order":"1860","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"camera":{"unicode":"1f4f7","unicode_alt":"","code_decimal":"📷","name":"camera","shortname":":camera:","category":"objects","emoji_order":"1861","aliases":[],"aliases_ascii":[],"keywords":["electronics","camera","selfie"]},"camera_with_flash":{"unicode":"1f4f8","unicode_alt":"","code_decimal":"📸","name":"camera with flash","shortname":":camera_with_flash:","category":"objects","emoji_order":"1862","aliases":[],"aliases_ascii":[],"keywords":["electronics","camera"]},"video_camera":{"unicode":"1f4f9","unicode_alt":"","code_decimal":"📹","name":"video camera","shortname":":video_camera:","category":"objects","emoji_order":"1863","aliases":[],"aliases_ascii":[],"keywords":["electronics","camera","movie"]},"vhs":{"unicode":"1f4fc","unicode_alt":"","code_decimal":"📼","name":"videocassette","shortname":":vhs:","category":"objects","emoji_order":"1864","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"mag":{"unicode":"1f50d","unicode_alt":"","code_decimal":"🔍","name":"left-pointing magnifying glass","shortname":":mag:","category":"objects","emoji_order":"1865","aliases":[],"aliases_ascii":[],"keywords":["object"]},"mag_right":{"unicode":"1f50e","unicode_alt":"","code_decimal":"🔎","name":"right-pointing magnifying glass","shortname":":mag_right:","category":"objects","emoji_order":"1866","aliases":[],"aliases_ascii":[],"keywords":["object"]},"microscope":{"unicode":"1f52c","unicode_alt":"","code_decimal":"🔬","name":"microscope","shortname":":microscope:","category":"objects","emoji_order":"1867","aliases":[],"aliases_ascii":[],"keywords":["object","science"]},"telescope":{"unicode":"1f52d","unicode_alt":"","code_decimal":"🔭","name":"telescope","shortname":":telescope:","category":"objects","emoji_order":"1868","aliases":[],"aliases_ascii":[],"keywords":["object","space","science"]},"satellite":{"unicode":"1f4e1","unicode_alt":"","code_decimal":"📡","name":"satellite antenna","shortname":":satellite:","category":"objects","emoji_order":"1869","aliases":[],"aliases_ascii":[],"keywords":["object"]},"candle":{"unicode":"1f56f","unicode_alt":"1f56f-fe0f","code_decimal":"🕯","name":"candle","shortname":":candle:","category":"objects","emoji_order":"1870","aliases":[],"aliases_ascii":[],"keywords":["object"]},"bulb":{"unicode":"1f4a1","unicode_alt":"","code_decimal":"💡","name":"electric light bulb","shortname":":bulb:","category":"objects","emoji_order":"1871","aliases":[],"aliases_ascii":[],"keywords":["object","science"]},"flashlight":{"unicode":"1f526","unicode_alt":"","code_decimal":"🔦","name":"electric torch","shortname":":flashlight:","category":"objects","emoji_order":"1872","aliases":[],"aliases_ascii":[],"keywords":["electronics","object"]},"izakaya_lantern":{"unicode":"1f3ee","unicode_alt":"","code_decimal":"🏮","name":"izakaya lantern","shortname":":izakaya_lantern:","category":"objects","emoji_order":"1873","aliases":[],"aliases_ascii":[],"keywords":["object","japan"]},"notebook_with_decorative_cover":{"unicode":"1f4d4","unicode_alt":"","code_decimal":"📔","name":"notebook with decorative cover","shortname":":notebook_with_decorative_cover:","category":"objects","emoji_order":"1874","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"closed_book":{"unicode":"1f4d5","unicode_alt":"","code_decimal":"📕","name":"closed book","shortname":":closed_book:","category":"objects","emoji_order":"1875","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"book":{"unicode":"1f4d6","unicode_alt":"","code_decimal":"📖","name":"open book","shortname":":book:","category":"objects","emoji_order":"1876","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"green_book":{"unicode":"1f4d7","unicode_alt":"","code_decimal":"📗","name":"green book","shortname":":green_book:","category":"objects","emoji_order":"1877","aliases":[],"aliases_ascii":[],"keywords":["object","office","book"]},"blue_book":{"unicode":"1f4d8","unicode_alt":"","code_decimal":"📘","name":"blue book","shortname":":blue_book:","category":"objects","emoji_order":"1878","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"orange_book":{"unicode":"1f4d9","unicode_alt":"","code_decimal":"📙","name":"orange book","shortname":":orange_book:","category":"objects","emoji_order":"1879","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"books":{"unicode":"1f4da","unicode_alt":"","code_decimal":"📚","name":"books","shortname":":books:","category":"objects","emoji_order":"1880","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"notebook":{"unicode":"1f4d3","unicode_alt":"","code_decimal":"📓","name":"notebook","shortname":":notebook:","category":"objects","emoji_order":"1881","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"ledger":{"unicode":"1f4d2","unicode_alt":"","code_decimal":"📒","name":"ledger","shortname":":ledger:","category":"objects","emoji_order":"1882","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"page_with_curl":{"unicode":"1f4c3","unicode_alt":"","code_decimal":"📃","name":"page with curl","shortname":":page_with_curl:","category":"objects","emoji_order":"1883","aliases":[],"aliases_ascii":[],"keywords":["office","write"]},"scroll":{"unicode":"1f4dc","unicode_alt":"","code_decimal":"📜","name":"scroll","shortname":":scroll:","category":"objects","emoji_order":"1884","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"page_facing_up":{"unicode":"1f4c4","unicode_alt":"","code_decimal":"📄","name":"page facing up","shortname":":page_facing_up:","category":"objects","emoji_order":"1885","aliases":[],"aliases_ascii":[],"keywords":["work","office","write"]},"newspaper":{"unicode":"1f4f0","unicode_alt":"","code_decimal":"📰","name":"newspaper","shortname":":newspaper:","category":"objects","emoji_order":"1886","aliases":[],"aliases_ascii":[],"keywords":["office","write"]},"newspaper2":{"unicode":"1f5de","unicode_alt":"1f5de-fe0f","code_decimal":"🗞","name":"rolled-up newspaper","shortname":":newspaper2:","category":"objects","emoji_order":"1887","aliases":[":rolled_up_newspaper:"],"aliases_ascii":[],"keywords":["office","write"]},"bookmark_tabs":{"unicode":"1f4d1","unicode_alt":"","code_decimal":"📑","name":"bookmark tabs","shortname":":bookmark_tabs:","category":"objects","emoji_order":"1888","aliases":[],"aliases_ascii":[],"keywords":["office","write"]},"bookmark":{"unicode":"1f516","unicode_alt":"","code_decimal":"🔖","name":"bookmark","shortname":":bookmark:","category":"objects","emoji_order":"1889","aliases":[],"aliases_ascii":[],"keywords":["object","book"]},"label":{"unicode":"1f3f7","unicode_alt":"1f3f7-fe0f","code_decimal":"🏷","name":"label","shortname":":label:","category":"objects","emoji_order":"1890","aliases":[],"aliases_ascii":[],"keywords":["object"]},"moneybag":{"unicode":"1f4b0","unicode_alt":"","code_decimal":"💰","name":"money bag","shortname":":moneybag:","category":"objects","emoji_order":"1891","aliases":[],"aliases_ascii":[],"keywords":["bag","award","money"]},"yen":{"unicode":"1f4b4","unicode_alt":"","code_decimal":"💴","name":"banknote with yen sign","shortname":":yen:","category":"objects","emoji_order":"1892","aliases":[],"aliases_ascii":[],"keywords":["money"]},"dollar":{"unicode":"1f4b5","unicode_alt":"","code_decimal":"💵","name":"banknote with dollar sign","shortname":":dollar:","category":"objects","emoji_order":"1893","aliases":[],"aliases_ascii":[],"keywords":["money"]},"euro":{"unicode":"1f4b6","unicode_alt":"","code_decimal":"💶","name":"banknote with euro sign","shortname":":euro:","category":"objects","emoji_order":"1894","aliases":[],"aliases_ascii":[],"keywords":["money"]},"pound":{"unicode":"1f4b7","unicode_alt":"","code_decimal":"💷","name":"banknote with pound sign","shortname":":pound:","category":"objects","emoji_order":"1895","aliases":[],"aliases_ascii":[],"keywords":["money"]},"money_with_wings":{"unicode":"1f4b8","unicode_alt":"","code_decimal":"💸","name":"money with wings","shortname":":money_with_wings:","category":"objects","emoji_order":"1896","aliases":[],"aliases_ascii":[],"keywords":["money","boys night"]},"credit_card":{"unicode":"1f4b3","unicode_alt":"","code_decimal":"💳","name":"credit card","shortname":":credit_card:","category":"objects","emoji_order":"1897","aliases":[],"aliases_ascii":[],"keywords":["object","money","boys night"]},"chart":{"unicode":"1f4b9","unicode_alt":"","code_decimal":"💹","name":"chart with upwards trend and yen sign","shortname":":chart:","category":"symbols","emoji_order":"1898","aliases":[],"aliases_ascii":[],"keywords":["symbol","money"]},"currency_exchange":{"unicode":"1f4b1","unicode_alt":"","code_decimal":"💱","name":"currency exchange","shortname":":currency_exchange:","category":"symbols","emoji_order":"1899","aliases":[],"aliases_ascii":[],"keywords":["symbol","money"]},"heavy_dollar_sign":{"unicode":"1f4b2","unicode_alt":"","code_decimal":"💲","name":"heavy dollar sign","shortname":":heavy_dollar_sign:","category":"symbols","emoji_order":"1900","aliases":[],"aliases_ascii":[],"keywords":["math","symbol","money"]},"envelope":{"unicode":"2709","unicode_alt":"2709-fe0f","code_decimal":"✉","name":"envelope","shortname":":envelope:","category":"objects","emoji_order":"1901","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"e-mail":{"unicode":"1f4e7","unicode_alt":"","code_decimal":"📧","name":"e-mail symbol","shortname":":e-mail:","category":"objects","emoji_order":"1902","aliases":[":email:"],"aliases_ascii":[],"keywords":["office"]},"incoming_envelope":{"unicode":"1f4e8","unicode_alt":"","code_decimal":"📨","name":"incoming envelope","shortname":":incoming_envelope:","category":"objects","emoji_order":"1903","aliases":[],"aliases_ascii":[],"keywords":["object"]},"envelope_with_arrow":{"unicode":"1f4e9","unicode_alt":"","code_decimal":"📩","name":"envelope with downwards arrow above","shortname":":envelope_with_arrow:","category":"objects","emoji_order":"1904","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"outbox_tray":{"unicode":"1f4e4","unicode_alt":"","code_decimal":"📤","name":"outbox tray","shortname":":outbox_tray:","category":"objects","emoji_order":"1905","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"inbox_tray":{"unicode":"1f4e5","unicode_alt":"","code_decimal":"📥","name":"inbox tray","shortname":":inbox_tray:","category":"objects","emoji_order":"1906","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"package":{"unicode":"1f4e6","unicode_alt":"","code_decimal":"📦","name":"package","shortname":":package:","category":"objects","emoji_order":"1907","aliases":[],"aliases_ascii":[],"keywords":["object","gift","office"]},"mailbox":{"unicode":"1f4eb","unicode_alt":"","code_decimal":"📫","name":"closed mailbox with raised flag","shortname":":mailbox:","category":"objects","emoji_order":"1908","aliases":[],"aliases_ascii":[],"keywords":["object"]},"mailbox_closed":{"unicode":"1f4ea","unicode_alt":"","code_decimal":"📪","name":"closed mailbox with lowered flag","shortname":":mailbox_closed:","category":"objects","emoji_order":"1909","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"mailbox_with_mail":{"unicode":"1f4ec","unicode_alt":"","code_decimal":"📬","name":"open mailbox with raised flag","shortname":":mailbox_with_mail:","category":"objects","emoji_order":"1910","aliases":[],"aliases_ascii":[],"keywords":["object"]},"mailbox_with_no_mail":{"unicode":"1f4ed","unicode_alt":"","code_decimal":"📭","name":"open mailbox with lowered flag","shortname":":mailbox_with_no_mail:","category":"objects","emoji_order":"1911","aliases":[],"aliases_ascii":[],"keywords":["object"]},"postbox":{"unicode":"1f4ee","unicode_alt":"","code_decimal":"📮","name":"postbox","shortname":":postbox:","category":"objects","emoji_order":"1912","aliases":[],"aliases_ascii":[],"keywords":["object"]},"ballot_box":{"unicode":"1f5f3","unicode_alt":"1f5f3-fe0f","code_decimal":"🗳","name":"ballot box with ballot","shortname":":ballot_box:","category":"objects","emoji_order":"1913","aliases":[":ballot_box_with_ballot:"],"aliases_ascii":[],"keywords":["object","office"]},"pencil2":{"unicode":"270f","unicode_alt":"270f-fe0f","code_decimal":"✏","name":"pencil","shortname":":pencil2:","category":"objects","emoji_order":"1914","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"black_nib":{"unicode":"2712","unicode_alt":"2712-fe0f","code_decimal":"✒","name":"black nib","shortname":":black_nib:","category":"objects","emoji_order":"1915","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"pen_fountain":{"unicode":"1f58b","unicode_alt":"1f58b-fe0f","code_decimal":"🖋","name":"lower left fountain pen","shortname":":pen_fountain:","category":"objects","emoji_order":"1916","aliases":[":lower_left_fountain_pen:"],"aliases_ascii":[],"keywords":["object","office","write"]},"pen_ballpoint":{"unicode":"1f58a","unicode_alt":"1f58a-fe0f","code_decimal":"🖊","name":"lower left ballpoint pen","shortname":":pen_ballpoint:","category":"objects","emoji_order":"1917","aliases":[":lower_left_ballpoint_pen:"],"aliases_ascii":[],"keywords":["object","office","write"]},"paintbrush":{"unicode":"1f58c","unicode_alt":"1f58c-fe0f","code_decimal":"🖌","name":"lower left paintbrush","shortname":":paintbrush:","category":"objects","emoji_order":"1918","aliases":[":lower_left_paintbrush:"],"aliases_ascii":[],"keywords":["object","office","write"]},"crayon":{"unicode":"1f58d","unicode_alt":"1f58d-fe0f","code_decimal":"🖍","name":"lower left crayon","shortname":":crayon:","category":"objects","emoji_order":"1919","aliases":[":lower_left_crayon:"],"aliases_ascii":[],"keywords":["object","office","write"]},"pencil":{"unicode":"1f4dd","unicode_alt":"","code_decimal":"📝","name":"memo","shortname":":pencil:","category":"objects","emoji_order":"1920","aliases":[],"aliases_ascii":[],"keywords":["work","office","write"]},"briefcase":{"unicode":"1f4bc","unicode_alt":"","code_decimal":"💼","name":"briefcase","shortname":":briefcase:","category":"people","emoji_order":"1921","aliases":[],"aliases_ascii":[],"keywords":["bag","work","accessories","nutcase","job"]},"file_folder":{"unicode":"1f4c1","unicode_alt":"","code_decimal":"📁","name":"file folder","shortname":":file_folder:","category":"objects","emoji_order":"1922","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"open_file_folder":{"unicode":"1f4c2","unicode_alt":"","code_decimal":"📂","name":"open file folder","shortname":":open_file_folder:","category":"objects","emoji_order":"1923","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"dividers":{"unicode":"1f5c2","unicode_alt":"1f5c2-fe0f","code_decimal":"🗂","name":"card index dividers","shortname":":dividers:","category":"objects","emoji_order":"1924","aliases":[":card_index_dividers:"],"aliases_ascii":[],"keywords":["work","office"]},"date":{"unicode":"1f4c5","unicode_alt":"","code_decimal":"📅","name":"calendar","shortname":":date:","category":"objects","emoji_order":"1925","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"calendar":{"unicode":"1f4c6","unicode_alt":"","code_decimal":"📆","name":"tear-off calendar","shortname":":calendar:","category":"objects","emoji_order":"1926","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"notepad_spiral":{"unicode":"1f5d2","unicode_alt":"1f5d2-fe0f","code_decimal":"🗒","name":"spiral note pad","shortname":":notepad_spiral:","category":"objects","emoji_order":"1927","aliases":[":spiral_note_pad:"],"aliases_ascii":[],"keywords":["work","office","write"]},"calendar_spiral":{"unicode":"1f5d3","unicode_alt":"1f5d3-fe0f","code_decimal":"🗓","name":"spiral calendar pad","shortname":":calendar_spiral:","category":"objects","emoji_order":"1928","aliases":[":spiral_calendar_pad:"],"aliases_ascii":[],"keywords":["object","office"]},"card_index":{"unicode":"1f4c7","unicode_alt":"","code_decimal":"📇","name":"card index","shortname":":card_index:","category":"objects","emoji_order":"1929","aliases":[],"aliases_ascii":[],"keywords":["object","work","office"]},"chart_with_upwards_trend":{"unicode":"1f4c8","unicode_alt":"","code_decimal":"📈","name":"chart with upwards trend","shortname":":chart_with_upwards_trend:","category":"objects","emoji_order":"1930","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"chart_with_downwards_trend":{"unicode":"1f4c9","unicode_alt":"","code_decimal":"📉","name":"chart with downwards trend","shortname":":chart_with_downwards_trend:","category":"objects","emoji_order":"1931","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"bar_chart":{"unicode":"1f4ca","unicode_alt":"","code_decimal":"📊","name":"bar chart","shortname":":bar_chart:","category":"objects","emoji_order":"1932","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"clipboard":{"unicode":"1f4cb","unicode_alt":"","code_decimal":"📋","name":"clipboard","shortname":":clipboard:","category":"objects","emoji_order":"1933","aliases":[],"aliases_ascii":[],"keywords":["object","work","office","write"]},"pushpin":{"unicode":"1f4cc","unicode_alt":"","code_decimal":"📌","name":"pushpin","shortname":":pushpin:","category":"objects","emoji_order":"1934","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"round_pushpin":{"unicode":"1f4cd","unicode_alt":"","code_decimal":"📍","name":"round pushpin","shortname":":round_pushpin:","category":"objects","emoji_order":"1935","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"paperclip":{"unicode":"1f4ce","unicode_alt":"","code_decimal":"📎","name":"paperclip","shortname":":paperclip:","category":"objects","emoji_order":"1936","aliases":[],"aliases_ascii":[],"keywords":["object","work","office"]},"paperclips":{"unicode":"1f587","unicode_alt":"1f587-fe0f","code_decimal":"🖇","name":"linked paperclips","shortname":":paperclips:","category":"objects","emoji_order":"1937","aliases":[":linked_paperclips:"],"aliases_ascii":[],"keywords":["object","work","office"]},"straight_ruler":{"unicode":"1f4cf","unicode_alt":"","code_decimal":"📏","name":"straight ruler","shortname":":straight_ruler:","category":"objects","emoji_order":"1938","aliases":[],"aliases_ascii":[],"keywords":["object","tool","office"]},"triangular_ruler":{"unicode":"1f4d0","unicode_alt":"","code_decimal":"📐","name":"triangular ruler","shortname":":triangular_ruler:","category":"objects","emoji_order":"1939","aliases":[],"aliases_ascii":[],"keywords":["object","tool","office"]},"scissors":{"unicode":"2702","unicode_alt":"2702-fe0f","code_decimal":"✂","name":"black scissors","shortname":":scissors:","category":"objects","emoji_order":"1940","aliases":[],"aliases_ascii":[],"keywords":["object","tool","weapon","office"]},"card_box":{"unicode":"1f5c3","unicode_alt":"1f5c3-fe0f","code_decimal":"🗃","name":"card file box","shortname":":card_box:","category":"objects","emoji_order":"1941","aliases":[":card_file_box:"],"aliases_ascii":[],"keywords":["object","work","office"]},"file_cabinet":{"unicode":"1f5c4","unicode_alt":"1f5c4-fe0f","code_decimal":"🗄","name":"file cabinet","shortname":":file_cabinet:","category":"objects","emoji_order":"1942","aliases":[],"aliases_ascii":[],"keywords":["object","work","office"]},"wastebasket":{"unicode":"1f5d1","unicode_alt":"1f5d1-fe0f","code_decimal":"🗑","name":"wastebasket","shortname":":wastebasket:","category":"objects","emoji_order":"1943","aliases":[],"aliases_ascii":[],"keywords":["object","work"]},"lock":{"unicode":"1f512","unicode_alt":"","code_decimal":"🔒","name":"lock","shortname":":lock:","category":"objects","emoji_order":"1944","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"unlock":{"unicode":"1f513","unicode_alt":"","code_decimal":"🔓","name":"open lock","shortname":":unlock:","category":"objects","emoji_order":"1945","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"lock_with_ink_pen":{"unicode":"1f50f","unicode_alt":"","code_decimal":"🔏","name":"lock with ink pen","shortname":":lock_with_ink_pen:","category":"objects","emoji_order":"1946","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"closed_lock_with_key":{"unicode":"1f510","unicode_alt":"","code_decimal":"🔐","name":"closed lock with key","shortname":":closed_lock_with_key:","category":"objects","emoji_order":"1947","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"key":{"unicode":"1f511","unicode_alt":"","code_decimal":"🔑","name":"key","shortname":":key:","category":"objects","emoji_order":"1948","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"key2":{"unicode":"1f5dd","unicode_alt":"1f5dd-fe0f","code_decimal":"🗝","name":"old key","shortname":":key2:","category":"objects","emoji_order":"1949","aliases":[":old_key:"],"aliases_ascii":[],"keywords":["object","lock"]},"hammer":{"unicode":"1f528","unicode_alt":"","code_decimal":"🔨","name":"hammer","shortname":":hammer:","category":"objects","emoji_order":"1950","aliases":[],"aliases_ascii":[],"keywords":["object","tool","weapon"]},"pick":{"unicode":"26cf","unicode_alt":"26cf-fe0f","code_decimal":"⛏","name":"pick","shortname":":pick:","category":"objects","emoji_order":"1951","aliases":[],"aliases_ascii":[],"keywords":["object","tool","weapon"]},"hammer_pick":{"unicode":"2692","unicode_alt":"2692-fe0f","code_decimal":"⚒","name":"hammer and pick","shortname":":hammer_pick:","category":"objects","emoji_order":"1952","aliases":[":hammer_and_pick:"],"aliases_ascii":[],"keywords":["object","tool","weapon"]},"tools":{"unicode":"1f6e0","unicode_alt":"1f6e0-fe0f","code_decimal":"🛠","name":"hammer and wrench","shortname":":tools:","category":"objects","emoji_order":"1953","aliases":[":hammer_and_wrench:"],"aliases_ascii":[],"keywords":["object","tool"]},"dagger":{"unicode":"1f5e1","unicode_alt":"1f5e1-fe0f","code_decimal":"🗡","name":"dagger knife","shortname":":dagger:","category":"objects","emoji_order":"1954","aliases":[":dagger_knife:"],"aliases_ascii":[],"keywords":["object","weapon"]},"crossed_swords":{"unicode":"2694","unicode_alt":"2694-fe0f","code_decimal":"⚔","name":"crossed swords","shortname":":crossed_swords:","category":"objects","emoji_order":"1955","aliases":[],"aliases_ascii":[],"keywords":["object","weapon"]},"gun":{"unicode":"1f52b","unicode_alt":"","code_decimal":"🔫","name":"pistol","shortname":":gun:","category":"objects","emoji_order":"1956","aliases":[],"aliases_ascii":[],"keywords":["object","weapon","dead","gun","sarcastic"]},"bow_and_arrow":{"unicode":"1f3f9","unicode_alt":"","code_decimal":"🏹","name":"bow and arrow","shortname":":bow_and_arrow:","category":"activity","emoji_order":"1957","aliases":[":archery:"],"aliases_ascii":[],"keywords":["weapon","sport"]},"shield":{"unicode":"1f6e1","unicode_alt":"1f6e1-fe0f","code_decimal":"🛡","name":"shield","shortname":":shield:","category":"objects","emoji_order":"1958","aliases":[],"aliases_ascii":[],"keywords":["object"]},"wrench":{"unicode":"1f527","unicode_alt":"","code_decimal":"🔧","name":"wrench","shortname":":wrench:","category":"objects","emoji_order":"1959","aliases":[],"aliases_ascii":[],"keywords":["object","tool"]},"nut_and_bolt":{"unicode":"1f529","unicode_alt":"","code_decimal":"🔩","name":"nut and bolt","shortname":":nut_and_bolt:","category":"objects","emoji_order":"1960","aliases":[],"aliases_ascii":[],"keywords":["object","tool","nutcase"]},"gear":{"unicode":"2699","unicode_alt":"2699-fe0f","code_decimal":"⚙","name":"gear","shortname":":gear:","category":"objects","emoji_order":"1961","aliases":[],"aliases_ascii":[],"keywords":["object","tool"]},"compression":{"unicode":"1f5dc","unicode_alt":"1f5dc-fe0f","code_decimal":"🗜","name":"compression","shortname":":compression:","category":"objects","emoji_order":"1962","aliases":[],"aliases_ascii":[],"keywords":[]},"alembic":{"unicode":"2697","unicode_alt":"2697-fe0f","code_decimal":"⚗","name":"alembic","shortname":":alembic:","category":"objects","emoji_order":"1963","aliases":[],"aliases_ascii":[],"keywords":["object","science"]},"scales":{"unicode":"2696","unicode_alt":"2696-fe0f","code_decimal":"⚖","name":"scales","shortname":":scales:","category":"objects","emoji_order":"1964","aliases":[],"aliases_ascii":[],"keywords":["object"]},"link":{"unicode":"1f517","unicode_alt":"","code_decimal":"🔗","name":"link symbol","shortname":":link:","category":"objects","emoji_order":"1965","aliases":[],"aliases_ascii":[],"keywords":["symbol","office"]},"chains":{"unicode":"26d3","unicode_alt":"26d3-fe0f","code_decimal":"⛓","name":"chains","shortname":":chains:","category":"objects","emoji_order":"1966","aliases":[],"aliases_ascii":[],"keywords":["object","tool"]},"syringe":{"unicode":"1f489","unicode_alt":"","code_decimal":"💉","name":"syringe","shortname":":syringe:","category":"objects","emoji_order":"1967","aliases":[],"aliases_ascii":[],"keywords":["object","weapon","health","drugs"]},"pill":{"unicode":"1f48a","unicode_alt":"","code_decimal":"💊","name":"pill","shortname":":pill:","category":"objects","emoji_order":"1968","aliases":[],"aliases_ascii":[],"keywords":["object","health","drugs"]},"smoking":{"unicode":"1f6ac","unicode_alt":"","code_decimal":"🚬","name":"smoking symbol","shortname":":smoking:","category":"objects","emoji_order":"1969","aliases":[],"aliases_ascii":[],"keywords":["symbol","drugs","smoking"]},"coffin":{"unicode":"26b0","unicode_alt":"26b0-fe0f","code_decimal":"⚰","name":"coffin","shortname":":coffin:","category":"objects","emoji_order":"1970","aliases":[],"aliases_ascii":[],"keywords":["object","dead","rip"]},"urn":{"unicode":"26b1","unicode_alt":"26b1-fe0f","code_decimal":"⚱","name":"funeral urn","shortname":":urn:","category":"objects","emoji_order":"1971","aliases":[":funeral_urn:"],"aliases_ascii":[],"keywords":["object","dead","rip"]},"moyai":{"unicode":"1f5ff","unicode_alt":"","code_decimal":"🗿","name":"moyai","shortname":":moyai:","category":"objects","emoji_order":"1972","aliases":[],"aliases_ascii":[],"keywords":["travel","vacation"]},"oil":{"unicode":"1f6e2","unicode_alt":"1f6e2-fe0f","code_decimal":"🛢","name":"oil drum","shortname":":oil:","category":"objects","emoji_order":"1973","aliases":[":oil_drum:"],"aliases_ascii":[],"keywords":["object"]},"crystal_ball":{"unicode":"1f52e","unicode_alt":"","code_decimal":"🔮","name":"crystal ball","shortname":":crystal_ball:","category":"objects","emoji_order":"1974","aliases":[],"aliases_ascii":[],"keywords":["object","ball"]},"shopping_cart":{"unicode":"1f6d2","unicode_alt":"","code_decimal":"🛒","name":"shopping trolley","shortname":":shopping_cart:","category":"objects","emoji_order":"1975","aliases":[":shopping_trolley:"],"aliases_ascii":[],"keywords":[]},"atm":{"unicode":"1f3e7","unicode_alt":"","code_decimal":"🏧","name":"automated teller machine","shortname":":atm:","category":"symbols","emoji_order":"1976","aliases":[],"aliases_ascii":[],"keywords":["electronics","symbol","money"]},"put_litter_in_its_place":{"unicode":"1f6ae","unicode_alt":"","code_decimal":"🚮","name":"put litter in its place symbol","shortname":":put_litter_in_its_place:","category":"symbols","emoji_order":"1977","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"potable_water":{"unicode":"1f6b0","unicode_alt":"","code_decimal":"🚰","name":"potable water symbol","shortname":":potable_water:","category":"symbols","emoji_order":"1978","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"wheelchair":{"unicode":"267f","unicode_alt":"267f-fe0f","code_decimal":"♿","name":"wheelchair symbol","shortname":":wheelchair:","category":"symbols","emoji_order":"1979","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"mens":{"unicode":"1f6b9","unicode_alt":"","code_decimal":"🚹","name":"mens symbol","shortname":":mens:","category":"symbols","emoji_order":"1980","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"womens":{"unicode":"1f6ba","unicode_alt":"","code_decimal":"🚺","name":"womens symbol","shortname":":womens:","category":"symbols","emoji_order":"1981","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"restroom":{"unicode":"1f6bb","unicode_alt":"","code_decimal":"🚻","name":"restroom","shortname":":restroom:","category":"symbols","emoji_order":"1982","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"baby_symbol":{"unicode":"1f6bc","unicode_alt":"","code_decimal":"🚼","name":"baby symbol","shortname":":baby_symbol:","category":"symbols","emoji_order":"1983","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"wc":{"unicode":"1f6be","unicode_alt":"","code_decimal":"🚾","name":"water closet","shortname":":wc:","category":"symbols","emoji_order":"1984","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"passport_control":{"unicode":"1f6c2","unicode_alt":"","code_decimal":"🛂","name":"passport control","shortname":":passport_control:","category":"symbols","emoji_order":"1985","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"customs":{"unicode":"1f6c3","unicode_alt":"","code_decimal":"🛃","name":"customs","shortname":":customs:","category":"symbols","emoji_order":"1986","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"baggage_claim":{"unicode":"1f6c4","unicode_alt":"","code_decimal":"🛄","name":"baggage claim","shortname":":baggage_claim:","category":"symbols","emoji_order":"1987","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"left_luggage":{"unicode":"1f6c5","unicode_alt":"","code_decimal":"🛅","name":"left luggage","shortname":":left_luggage:","category":"symbols","emoji_order":"1988","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"warning":{"unicode":"26a0","unicode_alt":"26a0-fe0f","code_decimal":"⚠","name":"warning sign","shortname":":warning:","category":"symbols","emoji_order":"1989","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"children_crossing":{"unicode":"1f6b8","unicode_alt":"","code_decimal":"🚸","name":"children crossing","shortname":":children_crossing:","category":"symbols","emoji_order":"1990","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"no_entry":{"unicode":"26d4","unicode_alt":"26d4-fe0f","code_decimal":"⛔","name":"no entry","shortname":":no_entry:","category":"symbols","emoji_order":"1991","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle"]},"no_entry_sign":{"unicode":"1f6ab","unicode_alt":"","code_decimal":"🚫","name":"no entry sign","shortname":":no_entry_sign:","category":"symbols","emoji_order":"1992","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle"]},"no_bicycles":{"unicode":"1f6b3","unicode_alt":"","code_decimal":"🚳","name":"no bicycles","shortname":":no_bicycles:","category":"symbols","emoji_order":"1993","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"no_smoking":{"unicode":"1f6ad","unicode_alt":"","code_decimal":"🚭","name":"no smoking symbol","shortname":":no_smoking:","category":"symbols","emoji_order":"1994","aliases":[],"aliases_ascii":[],"keywords":["symbol","smoking"]},"do_not_litter":{"unicode":"1f6af","unicode_alt":"","code_decimal":"🚯","name":"do not litter symbol","shortname":":do_not_litter:","category":"symbols","emoji_order":"1995","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"non-potable_water":{"unicode":"1f6b1","unicode_alt":"","code_decimal":"🚱","name":"non-potable water symbol","shortname":":non-potable_water:","category":"symbols","emoji_order":"1996","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"no_pedestrians":{"unicode":"1f6b7","unicode_alt":"","code_decimal":"🚷","name":"no pedestrians","shortname":":no_pedestrians:","category":"symbols","emoji_order":"1997","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"no_mobile_phones":{"unicode":"1f4f5","unicode_alt":"","code_decimal":"📵","name":"no mobile phones","shortname":":no_mobile_phones:","category":"symbols","emoji_order":"1998","aliases":[],"aliases_ascii":[],"keywords":["symbol","phone"]},"underage":{"unicode":"1f51e","unicode_alt":"","code_decimal":"🔞","name":"no one under eighteen symbol","shortname":":underage:","category":"symbols","emoji_order":"1999","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"radioactive":{"unicode":"2622","unicode_alt":"2622-fe0f","code_decimal":"☢","name":"radioactive sign","shortname":":radioactive:","category":"symbols","emoji_order":"2000","aliases":[":radioactive_sign:"],"aliases_ascii":[],"keywords":["symbol","science"]},"biohazard":{"unicode":"2623","unicode_alt":"2623-fe0f","code_decimal":"☣","name":"biohazard sign","shortname":":biohazard:","category":"symbols","emoji_order":"2001","aliases":[":biohazard_sign:"],"aliases_ascii":[],"keywords":["symbol","science"]},"arrow_up":{"unicode":"2b06","unicode_alt":"2b06-fe0f","code_decimal":"⬆","name":"upwards black arrow","shortname":":arrow_up:","category":"symbols","emoji_order":"2002","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_upper_right":{"unicode":"2197","unicode_alt":"2197-fe0f","code_decimal":"↗","name":"north east arrow","shortname":":arrow_upper_right:","category":"symbols","emoji_order":"2003","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_right":{"unicode":"27a1","unicode_alt":"27a1-fe0f","code_decimal":"➡","name":"black rightwards arrow","shortname":":arrow_right:","category":"symbols","emoji_order":"2004","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_lower_right":{"unicode":"2198","unicode_alt":"2198-fe0f","code_decimal":"↘","name":"south east arrow","shortname":":arrow_lower_right:","category":"symbols","emoji_order":"2005","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_down":{"unicode":"2b07","unicode_alt":"2b07-fe0f","code_decimal":"⬇","name":"downwards black arrow","shortname":":arrow_down:","category":"symbols","emoji_order":"2006","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_lower_left":{"unicode":"2199","unicode_alt":"2199-fe0f","code_decimal":"↙","name":"south west arrow","shortname":":arrow_lower_left:","category":"symbols","emoji_order":"2007","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_left":{"unicode":"2b05","unicode_alt":"2b05-fe0f","code_decimal":"⬅","name":"leftwards black arrow","shortname":":arrow_left:","category":"symbols","emoji_order":"2008","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_upper_left":{"unicode":"2196","unicode_alt":"2196-fe0f","code_decimal":"↖","name":"north west arrow","shortname":":arrow_upper_left:","category":"symbols","emoji_order":"2009","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_up_down":{"unicode":"2195","unicode_alt":"2195-fe0f","code_decimal":"↕","name":"up down arrow","shortname":":arrow_up_down:","category":"symbols","emoji_order":"2010","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"left_right_arrow":{"unicode":"2194","unicode_alt":"2194-fe0f","code_decimal":"↔","name":"left right arrow","shortname":":left_right_arrow:","category":"symbols","emoji_order":"2011","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"leftwards_arrow_with_hook":{"unicode":"21a9","unicode_alt":"21a9-fe0f","code_decimal":"↩","name":"leftwards arrow with hook","shortname":":leftwards_arrow_with_hook:","category":"symbols","emoji_order":"2012","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_right_hook":{"unicode":"21aa","unicode_alt":"21aa-fe0f","code_decimal":"↪","name":"rightwards arrow with hook","shortname":":arrow_right_hook:","category":"symbols","emoji_order":"2013","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_heading_up":{"unicode":"2934","unicode_alt":"2934-fe0f","code_decimal":"⤴","name":"arrow pointing rightwards then curving upwards","shortname":":arrow_heading_up:","category":"symbols","emoji_order":"2014","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_heading_down":{"unicode":"2935","unicode_alt":"2935-fe0f","code_decimal":"⤵","name":"arrow pointing rightwards then curving downwards","shortname":":arrow_heading_down:","category":"symbols","emoji_order":"2015","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrows_clockwise":{"unicode":"1f503","unicode_alt":"","code_decimal":"🔃","name":"clockwise downwards and upwards open circle arrows","shortname":":arrows_clockwise:","category":"symbols","emoji_order":"2016","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrows_counterclockwise":{"unicode":"1f504","unicode_alt":"","code_decimal":"🔄","name":"anticlockwise downwards and upwards open circle arrows","shortname":":arrows_counterclockwise:","category":"symbols","emoji_order":"2017","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"back":{"unicode":"1f519","unicode_alt":"","code_decimal":"🔙","name":"back with leftwards arrow above","shortname":":back:","category":"symbols","emoji_order":"2018","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"end":{"unicode":"1f51a","unicode_alt":"","code_decimal":"🔚","name":"end with leftwards arrow above","shortname":":end:","category":"symbols","emoji_order":"2019","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"on":{"unicode":"1f51b","unicode_alt":"","code_decimal":"🔛","name":"on with exclamation mark with left right arrow abo","shortname":":on:","category":"symbols","emoji_order":"2020","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"soon":{"unicode":"1f51c","unicode_alt":"","code_decimal":"🔜","name":"soon with rightwards arrow above","shortname":":soon:","category":"symbols","emoji_order":"2021","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"top":{"unicode":"1f51d","unicode_alt":"","code_decimal":"🔝","name":"top with upwards arrow above","shortname":":top:","category":"symbols","emoji_order":"2022","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"place_of_worship":{"unicode":"1f6d0","unicode_alt":"","code_decimal":"🛐","name":"place of worship","shortname":":place_of_worship:","category":"symbols","emoji_order":"2023","aliases":[":worship_symbol:"],"aliases_ascii":[],"keywords":["religion","symbol","pray"]},"atom":{"unicode":"269b","unicode_alt":"269b-fe0f","code_decimal":"⚛","name":"atom symbol","shortname":":atom:","category":"symbols","emoji_order":"2024","aliases":[":atom_symbol:"],"aliases_ascii":[],"keywords":["symbol","science"]},"om_symbol":{"unicode":"1f549","unicode_alt":"1f549-fe0f","code_decimal":"🕉","name":"om symbol","shortname":":om_symbol:","category":"symbols","emoji_order":"2025","aliases":[],"aliases_ascii":[],"keywords":["religion","symbol"]},"star_of_david":{"unicode":"2721","unicode_alt":"2721-fe0f","code_decimal":"✡","name":"star of david","shortname":":star_of_david:","category":"symbols","emoji_order":"2026","aliases":[],"aliases_ascii":[],"keywords":["religion","jew","star","symbol"]},"wheel_of_dharma":{"unicode":"2638","unicode_alt":"2638-fe0f","code_decimal":"☸","name":"wheel of dharma","shortname":":wheel_of_dharma:","category":"symbols","emoji_order":"2027","aliases":[],"aliases_ascii":[],"keywords":["religion","symbol"]},"yin_yang":{"unicode":"262f","unicode_alt":"262f-fe0f","code_decimal":"☯","name":"yin yang","shortname":":yin_yang:","category":"symbols","emoji_order":"2028","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"cross":{"unicode":"271d","unicode_alt":"271d-fe0f","code_decimal":"✝","name":"latin cross","shortname":":cross:","category":"symbols","emoji_order":"2029","aliases":[":latin_cross:"],"aliases_ascii":[],"keywords":["religion","symbol"]},"orthodox_cross":{"unicode":"2626","unicode_alt":"2626-fe0f","code_decimal":"☦","name":"orthodox cross","shortname":":orthodox_cross:","category":"symbols","emoji_order":"2030","aliases":[],"aliases_ascii":[],"keywords":["religion","symbol"]},"star_and_crescent":{"unicode":"262a","unicode_alt":"262a-fe0f","code_decimal":"☪","name":"star and crescent","shortname":":star_and_crescent:","category":"symbols","emoji_order":"2031","aliases":[],"aliases_ascii":[],"keywords":["religion","symbol"]},"peace":{"unicode":"262e","unicode_alt":"262e-fe0f","code_decimal":"☮","name":"peace symbol","shortname":":peace:","category":"symbols","emoji_order":"2032","aliases":[":peace_symbol:"],"aliases_ascii":[],"keywords":["symbol","peace","drugs"]},"menorah":{"unicode":"1f54e","unicode_alt":"","code_decimal":"🕎","name":"menorah with nine branches","shortname":":menorah:","category":"symbols","emoji_order":"2033","aliases":[],"aliases_ascii":[],"keywords":["religion","object","jew","symbol","holidays"]},"six_pointed_star":{"unicode":"1f52f","unicode_alt":"","code_decimal":"🔯","name":"six pointed star with middle dot","shortname":":six_pointed_star:","category":"symbols","emoji_order":"2034","aliases":[],"aliases_ascii":[],"keywords":["religion","jew","star","symbol"]},"aries":{"unicode":"2648","unicode_alt":"2648-fe0f","code_decimal":"♈","name":"aries","shortname":":aries:","category":"symbols","emoji_order":"2035","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"taurus":{"unicode":"2649","unicode_alt":"2649-fe0f","code_decimal":"♉","name":"taurus","shortname":":taurus:","category":"symbols","emoji_order":"2036","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"gemini":{"unicode":"264a","unicode_alt":"264a-fe0f","code_decimal":"♊","name":"gemini","shortname":":gemini:","category":"symbols","emoji_order":"2037","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"cancer":{"unicode":"264b","unicode_alt":"264b-fe0f","code_decimal":"♋","name":"cancer","shortname":":cancer:","category":"symbols","emoji_order":"2038","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"leo":{"unicode":"264c","unicode_alt":"264c-fe0f","code_decimal":"♌","name":"leo","shortname":":leo:","category":"symbols","emoji_order":"2039","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"virgo":{"unicode":"264d","unicode_alt":"264d-fe0f","code_decimal":"♍","name":"virgo","shortname":":virgo:","category":"symbols","emoji_order":"2040","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"libra":{"unicode":"264e","unicode_alt":"264e-fe0f","code_decimal":"♎","name":"libra","shortname":":libra:","category":"symbols","emoji_order":"2041","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"scorpius":{"unicode":"264f","unicode_alt":"264f-fe0f","code_decimal":"♏","name":"scorpius","shortname":":scorpius:","category":"symbols","emoji_order":"2042","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"sagittarius":{"unicode":"2650","unicode_alt":"2650-fe0f","code_decimal":"♐","name":"sagittarius","shortname":":sagittarius:","category":"symbols","emoji_order":"2043","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"capricorn":{"unicode":"2651","unicode_alt":"2651-fe0f","code_decimal":"♑","name":"capricorn","shortname":":capricorn:","category":"symbols","emoji_order":"2044","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"aquarius":{"unicode":"2652","unicode_alt":"2652-fe0f","code_decimal":"♒","name":"aquarius","shortname":":aquarius:","category":"symbols","emoji_order":"2045","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"pisces":{"unicode":"2653","unicode_alt":"2653-fe0f","code_decimal":"♓","name":"pisces","shortname":":pisces:","category":"symbols","emoji_order":"2046","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"ophiuchus":{"unicode":"26ce","unicode_alt":"","code_decimal":"⛎","name":"ophiuchus","shortname":":ophiuchus:","category":"symbols","emoji_order":"2047","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"twisted_rightwards_arrows":{"unicode":"1f500","unicode_alt":"","code_decimal":"🔀","name":"twisted rightwards arrows","shortname":":twisted_rightwards_arrows:","category":"symbols","emoji_order":"2048","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"repeat":{"unicode":"1f501","unicode_alt":"","code_decimal":"🔁","name":"clockwise rightwards and leftwards open circle arrows","shortname":":repeat:","category":"symbols","emoji_order":"2049","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"repeat_one":{"unicode":"1f502","unicode_alt":"","code_decimal":"🔂","name":"clockwise rightwards and leftwards open circle arrows with circled one overlay","shortname":":repeat_one:","category":"symbols","emoji_order":"2050","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_forward":{"unicode":"25b6","unicode_alt":"25b6-fe0f","code_decimal":"▶","name":"black right-pointing triangle","shortname":":arrow_forward:","category":"symbols","emoji_order":"2051","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol","triangle"]},"fast_forward":{"unicode":"23e9","unicode_alt":"","code_decimal":"⏩","name":"black right-pointing double triangle","shortname":":fast_forward:","category":"symbols","emoji_order":"2052","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"track_next":{"unicode":"23ed","unicode_alt":"23ed-fe0f","code_decimal":"⏭","name":"black right-pointing double triangle with vertical bar","shortname":":track_next:","category":"symbols","emoji_order":"2053","aliases":[":next_track:"],"aliases_ascii":[],"keywords":["arrow","symbol"]},"play_pause":{"unicode":"23ef","unicode_alt":"23ef-fe0f","code_decimal":"⏯","name":"black right-pointing double triangle with double vertical bar","shortname":":play_pause:","category":"symbols","emoji_order":"2054","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_backward":{"unicode":"25c0","unicode_alt":"25c0-fe0f","code_decimal":"◀","name":"black left-pointing triangle","shortname":":arrow_backward:","category":"symbols","emoji_order":"2055","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol","triangle"]},"rewind":{"unicode":"23ea","unicode_alt":"","code_decimal":"⏪","name":"black left-pointing double triangle","shortname":":rewind:","category":"symbols","emoji_order":"2056","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"track_previous":{"unicode":"23ee","unicode_alt":"23ee-fe0f","code_decimal":"⏮","name":"black left-pointing double triangle with vertical bar","shortname":":track_previous:","category":"symbols","emoji_order":"2057","aliases":[":previous_track:"],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_up_small":{"unicode":"1f53c","unicode_alt":"","code_decimal":"🔼","name":"up-pointing small red triangle","shortname":":arrow_up_small:","category":"symbols","emoji_order":"2058","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol","triangle"]},"arrow_double_up":{"unicode":"23eb","unicode_alt":"","code_decimal":"⏫","name":"black up-pointing double triangle","shortname":":arrow_double_up:","category":"symbols","emoji_order":"2059","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_down_small":{"unicode":"1f53d","unicode_alt":"","code_decimal":"🔽","name":"down-pointing small red triangle","shortname":":arrow_down_small:","category":"symbols","emoji_order":"2060","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol","triangle"]},"arrow_double_down":{"unicode":"23ec","unicode_alt":"","code_decimal":"⏬","name":"black down-pointing double triangle","shortname":":arrow_double_down:","category":"symbols","emoji_order":"2061","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"pause_button":{"unicode":"23f8","unicode_alt":"23f8-fe0f","code_decimal":"⏸","name":"double vertical bar","shortname":":pause_button:","category":"symbols","emoji_order":"2062","aliases":[":double_vertical_bar:"],"aliases_ascii":[],"keywords":["symbol"]},"stop_button":{"unicode":"23f9","unicode_alt":"23f9-fe0f","code_decimal":"⏹","name":"black square for stop","shortname":":stop_button:","category":"symbols","emoji_order":"2063","aliases":[],"aliases_ascii":[],"keywords":["symbol","square"]},"record_button":{"unicode":"23fa","unicode_alt":"23fa-fe0f","code_decimal":"⏺","name":"black circle for record","shortname":":record_button:","category":"symbols","emoji_order":"2064","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle"]},"eject":{"unicode":"23cf","unicode_alt":"23cf-fe0f","code_decimal":"⏏","name":"eject symbol","shortname":":eject:","category":"symbols","emoji_order":"2065","aliases":[":eject_symbol:"],"aliases_ascii":[],"keywords":[]},"cinema":{"unicode":"1f3a6","unicode_alt":"","code_decimal":"🎦","name":"cinema","shortname":":cinema:","category":"symbols","emoji_order":"2066","aliases":[],"aliases_ascii":[],"keywords":["symbol","camera","movie"]},"low_brightness":{"unicode":"1f505","unicode_alt":"","code_decimal":"🔅","name":"low brightness symbol","shortname":":low_brightness:","category":"symbols","emoji_order":"2067","aliases":[],"aliases_ascii":[],"keywords":["symbol","sun"]},"high_brightness":{"unicode":"1f506","unicode_alt":"","code_decimal":"🔆","name":"high brightness symbol","shortname":":high_brightness:","category":"symbols","emoji_order":"2068","aliases":[],"aliases_ascii":[],"keywords":["symbol","sun"]},"signal_strength":{"unicode":"1f4f6","unicode_alt":"","code_decimal":"📶","name":"antenna with bars","shortname":":signal_strength:","category":"symbols","emoji_order":"2069","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"vibration_mode":{"unicode":"1f4f3","unicode_alt":"","code_decimal":"📳","name":"vibration mode","shortname":":vibration_mode:","category":"symbols","emoji_order":"2070","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"mobile_phone_off":{"unicode":"1f4f4","unicode_alt":"","code_decimal":"📴","name":"mobile phone off","shortname":":mobile_phone_off:","category":"symbols","emoji_order":"2071","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"recycle":{"unicode":"267b","unicode_alt":"267b-fe0f","code_decimal":"♻","name":"black universal recycling symbol","shortname":":recycle:","category":"symbols","emoji_order":"2072","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"name_badge":{"unicode":"1f4db","unicode_alt":"","code_decimal":"📛","name":"name badge","shortname":":name_badge:","category":"symbols","emoji_order":"2073","aliases":[],"aliases_ascii":[],"keywords":["work"]},"fleur-de-lis":{"unicode":"269c","unicode_alt":"269c-fe0f","code_decimal":"⚜","name":"fleur-de-lis","shortname":":fleur-de-lis:","category":"symbols","emoji_order":"2074","aliases":[],"aliases_ascii":[],"keywords":["object","symbol"]},"beginner":{"unicode":"1f530","unicode_alt":"","code_decimal":"🔰","name":"japanese symbol for beginner","shortname":":beginner:","category":"symbols","emoji_order":"2075","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"trident":{"unicode":"1f531","unicode_alt":"","code_decimal":"🔱","name":"trident emblem","shortname":":trident:","category":"symbols","emoji_order":"2076","aliases":[],"aliases_ascii":[],"keywords":["object","symbol"]},"o":{"unicode":"2b55","unicode_alt":"2b55-fe0f","code_decimal":"⭕","name":"heavy large circle","shortname":":o:","category":"symbols","emoji_order":"2077","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle"]},"white_check_mark":{"unicode":"2705","unicode_alt":"","code_decimal":"✅","name":"white heavy check mark","shortname":":white_check_mark:","category":"symbols","emoji_order":"2078","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"ballot_box_with_check":{"unicode":"2611","unicode_alt":"2611-fe0f","code_decimal":"☑","name":"ballot box with check","shortname":":ballot_box_with_check:","category":"symbols","emoji_order":"2079","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"heavy_check_mark":{"unicode":"2714","unicode_alt":"2714-fe0f","code_decimal":"✔","name":"heavy check mark","shortname":":heavy_check_mark:","category":"symbols","emoji_order":"2080","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"heavy_multiplication_x":{"unicode":"2716","unicode_alt":"2716-fe0f","code_decimal":"✖","name":"heavy multiplication x","shortname":":heavy_multiplication_x:","category":"symbols","emoji_order":"2081","aliases":[],"aliases_ascii":[],"keywords":["math","symbol"]},"x":{"unicode":"274c","unicode_alt":"","code_decimal":"❌","name":"cross mark","shortname":":x:","category":"symbols","emoji_order":"2082","aliases":[],"aliases_ascii":[],"keywords":["symbol","sol"]},"negative_squared_cross_mark":{"unicode":"274e","unicode_alt":"","code_decimal":"❎","name":"negative squared cross mark","shortname":":negative_squared_cross_mark:","category":"symbols","emoji_order":"2083","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"heavy_plus_sign":{"unicode":"2795","unicode_alt":"","code_decimal":"➕","name":"heavy plus sign","shortname":":heavy_plus_sign:","category":"symbols","emoji_order":"2084","aliases":[],"aliases_ascii":[],"keywords":["math","symbol"]},"heavy_minus_sign":{"unicode":"2796","unicode_alt":"","code_decimal":"➖","name":"heavy minus sign","shortname":":heavy_minus_sign:","category":"symbols","emoji_order":"2088","aliases":[],"aliases_ascii":[],"keywords":["math","symbol"]},"heavy_division_sign":{"unicode":"2797","unicode_alt":"","code_decimal":"➗","name":"heavy division sign","shortname":":heavy_division_sign:","category":"symbols","emoji_order":"2089","aliases":[],"aliases_ascii":[],"keywords":["math","symbol"]},"curly_loop":{"unicode":"27b0","unicode_alt":"","code_decimal":"➰","name":"curly loop","shortname":":curly_loop:","category":"symbols","emoji_order":"2090","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"loop":{"unicode":"27bf","unicode_alt":"","code_decimal":"➿","name":"double curly loop","shortname":":loop:","category":"symbols","emoji_order":"2091","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"part_alternation_mark":{"unicode":"303d","unicode_alt":"303d-fe0f","code_decimal":"〽","name":"part alternation mark","shortname":":part_alternation_mark:","category":"symbols","emoji_order":"2092","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"eight_spoked_asterisk":{"unicode":"2733","unicode_alt":"2733-fe0f","code_decimal":"✳","name":"eight spoked asterisk","shortname":":eight_spoked_asterisk:","category":"symbols","emoji_order":"2093","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"eight_pointed_black_star":{"unicode":"2734","unicode_alt":"2734-fe0f","code_decimal":"✴","name":"eight pointed black star","shortname":":eight_pointed_black_star:","category":"symbols","emoji_order":"2094","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"sparkle":{"unicode":"2747","unicode_alt":"2747-fe0f","code_decimal":"❇","name":"sparkle","shortname":":sparkle:","category":"symbols","emoji_order":"2095","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"bangbang":{"unicode":"203c","unicode_alt":"203c-fe0f","code_decimal":"‼","name":"double exclamation mark","shortname":":bangbang:","category":"symbols","emoji_order":"2096","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"interrobang":{"unicode":"2049","unicode_alt":"2049-fe0f","code_decimal":"⁉","name":"exclamation question mark","shortname":":interrobang:","category":"symbols","emoji_order":"2097","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"question":{"unicode":"2753","unicode_alt":"","code_decimal":"❓","name":"black question mark ornament","shortname":":question:","category":"symbols","emoji_order":"2098","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation","wth"]},"grey_question":{"unicode":"2754","unicode_alt":"","code_decimal":"❔","name":"white question mark ornament","shortname":":grey_question:","category":"symbols","emoji_order":"2099","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"grey_exclamation":{"unicode":"2755","unicode_alt":"","code_decimal":"❕","name":"white exclamation mark ornament","shortname":":grey_exclamation:","category":"symbols","emoji_order":"2100","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"exclamation":{"unicode":"2757","unicode_alt":"2757-fe0f","code_decimal":"❗","name":"heavy exclamation mark symbol","shortname":":exclamation:","category":"symbols","emoji_order":"2101","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"wavy_dash":{"unicode":"3030","unicode_alt":"3030-fe0f","code_decimal":"〰","name":"wavy dash","shortname":":wavy_dash:","category":"symbols","emoji_order":"2102","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"copyright":{"unicode":"00a9","unicode_alt":"00a9-fe0f","code_decimal":"©","name":"copyright sign","shortname":":copyright:","category":"symbols","emoji_order":"2103","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"registered":{"unicode":"00ae","unicode_alt":"00ae-fe0f","code_decimal":"®","name":"registered sign","shortname":":registered:","category":"symbols","emoji_order":"2104","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"tm":{"unicode":"2122","unicode_alt":"2122-fe0f","code_decimal":"™","name":"trade mark sign","shortname":":tm:","category":"symbols","emoji_order":"2105","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"hash":{"unicode":"0023-20e3","unicode_alt":"0023-fe0f-20e3","code_decimal":"#⃣","name":"keycap number sign","shortname":":hash:","category":"symbols","emoji_order":"2106","aliases":[],"aliases_ascii":[],"keywords":["number","symbol"]},"asterisk":{"unicode":"002a-20e3","unicode_alt":"002a-fe0f-20e3","code_decimal":"*⃣","name":"keycap asterisk","shortname":":asterisk:","category":"symbols","emoji_order":"2107","aliases":[":keycap_asterisk:"],"aliases_ascii":[],"keywords":["symbol"]},"zero":{"unicode":"0030-20e3","unicode_alt":"0030-fe0f-20e3","code_decimal":"0⃣","name":"keycap digit zero","shortname":":zero:","category":"symbols","emoji_order":"2108","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"one":{"unicode":"0031-20e3","unicode_alt":"0031-fe0f-20e3","code_decimal":"1⃣","name":"keycap digit one","shortname":":one:","category":"symbols","emoji_order":"2109","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"two":{"unicode":"0032-20e3","unicode_alt":"0032-fe0f-20e3","code_decimal":"2⃣","name":"keycap digit two","shortname":":two:","category":"symbols","emoji_order":"2110","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"three":{"unicode":"0033-20e3","unicode_alt":"0033-fe0f-20e3","code_decimal":"3⃣","name":"keycap digit three","shortname":":three:","category":"symbols","emoji_order":"2111","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"four":{"unicode":"0034-20e3","unicode_alt":"0034-fe0f-20e3","code_decimal":"4⃣","name":"keycap digit four","shortname":":four:","category":"symbols","emoji_order":"2112","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"five":{"unicode":"0035-20e3","unicode_alt":"0035-fe0f-20e3","code_decimal":"5⃣","name":"keycap digit five","shortname":":five:","category":"symbols","emoji_order":"2113","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"six":{"unicode":"0036-20e3","unicode_alt":"0036-fe0f-20e3","code_decimal":"6⃣","name":"keycap digit six","shortname":":six:","category":"symbols","emoji_order":"2114","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"seven":{"unicode":"0037-20e3","unicode_alt":"0037-fe0f-20e3","code_decimal":"7⃣","name":"keycap digit seven","shortname":":seven:","category":"symbols","emoji_order":"2115","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"eight":{"unicode":"0038-20e3","unicode_alt":"0038-fe0f-20e3","code_decimal":"8⃣","name":"keycap digit eight","shortname":":eight:","category":"symbols","emoji_order":"2116","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"nine":{"unicode":"0039-20e3","unicode_alt":"0039-fe0f-20e3","code_decimal":"9⃣","name":"keycap digit nine","shortname":":nine:","category":"symbols","emoji_order":"2117","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"keycap_ten":{"unicode":"1f51f","unicode_alt":"","code_decimal":"🔟","name":"keycap ten","shortname":":keycap_ten:","category":"symbols","emoji_order":"2118","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"100":{"unicode":"1f4af","unicode_alt":"","code_decimal":"💯","name":"hundred points symbol","shortname":":100:","category":"symbols","emoji_order":"2119","aliases":[],"aliases_ascii":[],"keywords":["symbol","wow","win","perfect","parties"]},"capital_abcd":{"unicode":"1f520","unicode_alt":"","code_decimal":"🔠","name":"input symbol for latin capital letters","shortname":":capital_abcd:","category":"symbols","emoji_order":"2120","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"abcd":{"unicode":"1f521","unicode_alt":"","code_decimal":"🔡","name":"input symbol for latin small letters","shortname":":abcd:","category":"symbols","emoji_order":"2121","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"1234":{"unicode":"1f522","unicode_alt":"","code_decimal":"🔢","name":"input symbol for numbers","shortname":":1234:","category":"symbols","emoji_order":"2122","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"symbols":{"unicode":"1f523","unicode_alt":"","code_decimal":"🔣","name":"input symbol for symbols","shortname":":symbols:","category":"symbols","emoji_order":"2123","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"abc":{"unicode":"1f524","unicode_alt":"","code_decimal":"🔤","name":"input symbol for latin letters","shortname":":abc:","category":"symbols","emoji_order":"2124","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"a":{"unicode":"1f170","unicode_alt":"","code_decimal":"🅰","name":"negative squared latin capital letter a","shortname":":a:","category":"symbols","emoji_order":"2125","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"ab":{"unicode":"1f18e","unicode_alt":"","code_decimal":"🆎","name":"negative squared ab","shortname":":ab:","category":"symbols","emoji_order":"2126","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"b":{"unicode":"1f171","unicode_alt":"","code_decimal":"🅱","name":"negative squared latin capital letter b","shortname":":b:","category":"symbols","emoji_order":"2127","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"cl":{"unicode":"1f191","unicode_alt":"","code_decimal":"🆑","name":"squared cl","shortname":":cl:","category":"symbols","emoji_order":"2128","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"cool":{"unicode":"1f192","unicode_alt":"","code_decimal":"🆒","name":"squared cool","shortname":":cool:","category":"symbols","emoji_order":"2129","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"free":{"unicode":"1f193","unicode_alt":"","code_decimal":"🆓","name":"squared free","shortname":":free:","category":"symbols","emoji_order":"2130","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"information_source":{"unicode":"2139","unicode_alt":"2139-fe0f","code_decimal":"ℹ","name":"information source","shortname":":information_source:","category":"symbols","emoji_order":"2131","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"id":{"unicode":"1f194","unicode_alt":"","code_decimal":"🆔","name":"squared id","shortname":":id:","category":"symbols","emoji_order":"2132","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"m":{"unicode":"24c2","unicode_alt":"24c2-fe0f","code_decimal":"Ⓜ","name":"circled latin capital letter m","shortname":":m:","category":"symbols","emoji_order":"2133","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"new":{"unicode":"1f195","unicode_alt":"","code_decimal":"🆕","name":"squared new","shortname":":new:","category":"symbols","emoji_order":"2134","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"ng":{"unicode":"1f196","unicode_alt":"","code_decimal":"🆖","name":"squared ng","shortname":":ng:","category":"symbols","emoji_order":"2135","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"o2":{"unicode":"1f17e","unicode_alt":"","code_decimal":"🅾","name":"negative squared latin capital letter o","shortname":":o2:","category":"symbols","emoji_order":"2136","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"ok":{"unicode":"1f197","unicode_alt":"","code_decimal":"🆗","name":"squared ok","shortname":":ok:","category":"symbols","emoji_order":"2137","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"parking":{"unicode":"1f17f","unicode_alt":"1f17f-fe0f","code_decimal":"🅿","name":"negative squared latin capital letter p","shortname":":parking:","category":"symbols","emoji_order":"2138","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"sos":{"unicode":"1f198","unicode_alt":"","code_decimal":"🆘","name":"squared sos","shortname":":sos:","category":"symbols","emoji_order":"2139","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"up":{"unicode":"1f199","unicode_alt":"","code_decimal":"🆙","name":"squared up with exclamation mark","shortname":":up:","category":"symbols","emoji_order":"2140","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"vs":{"unicode":"1f19a","unicode_alt":"","code_decimal":"🆚","name":"squared vs","shortname":":vs:","category":"symbols","emoji_order":"2141","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"koko":{"unicode":"1f201","unicode_alt":"","code_decimal":"🈁","name":"squared katakana koko","shortname":":koko:","category":"symbols","emoji_order":"2142","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"sa":{"unicode":"1f202","unicode_alt":"1f202-fe0f","code_decimal":"🈂","name":"squared katakana sa","shortname":":sa:","category":"symbols","emoji_order":"2143","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u6708":{"unicode":"1f237","unicode_alt":"1f237-fe0f","code_decimal":"🈷","name":"squared cjk unified ideograph-6708","shortname":":u6708:","category":"symbols","emoji_order":"2144","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u6709":{"unicode":"1f236","unicode_alt":"","code_decimal":"🈶","name":"squared cjk unified ideograph-6709","shortname":":u6709:","category":"symbols","emoji_order":"2145","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u6307":{"unicode":"1f22f","unicode_alt":"1f22f-fe0f","code_decimal":"🈯","name":"squared cjk unified ideograph-6307","shortname":":u6307:","category":"symbols","emoji_order":"2146","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"ideograph_advantage":{"unicode":"1f250","unicode_alt":"","code_decimal":"🉐","name":"circled ideograph advantage","shortname":":ideograph_advantage:","category":"symbols","emoji_order":"2147","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"u5272":{"unicode":"1f239","unicode_alt":"","code_decimal":"🈹","name":"squared cjk unified ideograph-5272","shortname":":u5272:","category":"symbols","emoji_order":"2148","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u7121":{"unicode":"1f21a","unicode_alt":"1f21a-fe0f","code_decimal":"🈚","name":"squared cjk unified ideograph-7121","shortname":":u7121:","category":"symbols","emoji_order":"2149","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u7981":{"unicode":"1f232","unicode_alt":"","code_decimal":"🈲","name":"squared cjk unified ideograph-7981","shortname":":u7981:","category":"symbols","emoji_order":"2150","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"accept":{"unicode":"1f251","unicode_alt":"","code_decimal":"🉑","name":"circled ideograph accept","shortname":":accept:","category":"symbols","emoji_order":"2151","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u7533":{"unicode":"1f238","unicode_alt":"","code_decimal":"🈸","name":"squared cjk unified ideograph-7533","shortname":":u7533:","category":"symbols","emoji_order":"2152","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u5408":{"unicode":"1f234","unicode_alt":"","code_decimal":"🈴","name":"squared cjk unified ideograph-5408","shortname":":u5408:","category":"symbols","emoji_order":"2153","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"u7a7a":{"unicode":"1f233","unicode_alt":"","code_decimal":"🈳","name":"squared cjk unified ideograph-7a7a","shortname":":u7a7a:","category":"symbols","emoji_order":"2154","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"congratulations":{"unicode":"3297","unicode_alt":"3297-fe0f","code_decimal":"㊗","name":"circled ideograph congratulation","shortname":":congratulations:","category":"symbols","emoji_order":"2155","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"secret":{"unicode":"3299","unicode_alt":"3299-fe0f","code_decimal":"㊙","name":"circled ideograph secret","shortname":":secret:","category":"symbols","emoji_order":"2156","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"u55b6":{"unicode":"1f23a","unicode_alt":"","code_decimal":"🈺","name":"squared cjk unified ideograph-55b6","shortname":":u55b6:","category":"symbols","emoji_order":"2157","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u6e80":{"unicode":"1f235","unicode_alt":"","code_decimal":"🈵","name":"squared cjk unified ideograph-6e80","shortname":":u6e80:","category":"symbols","emoji_order":"2158","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"black_small_square":{"unicode":"25aa","unicode_alt":"25aa-fe0f","code_decimal":"▪","name":"black small square","shortname":":black_small_square:","category":"symbols","emoji_order":"2159","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square"]},"white_small_square":{"unicode":"25ab","unicode_alt":"25ab-fe0f","code_decimal":"▫","name":"white small square","shortname":":white_small_square:","category":"symbols","emoji_order":"2160","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square"]},"white_medium_square":{"unicode":"25fb","unicode_alt":"25fb-fe0f","code_decimal":"◻","name":"white medium square","shortname":":white_medium_square:","category":"symbols","emoji_order":"2161","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square"]},"black_medium_square":{"unicode":"25fc","unicode_alt":"25fc-fe0f","code_decimal":"◼","name":"black medium square","shortname":":black_medium_square:","category":"symbols","emoji_order":"2162","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square"]},"white_medium_small_square":{"unicode":"25fd","unicode_alt":"25fd-fe0f","code_decimal":"◽","name":"white medium small square","shortname":":white_medium_small_square:","category":"symbols","emoji_order":"2163","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square"]},"black_medium_small_square":{"unicode":"25fe","unicode_alt":"25fe-fe0f","code_decimal":"◾","name":"black medium small square","shortname":":black_medium_small_square:","category":"symbols","emoji_order":"2164","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square"]},"black_large_square":{"unicode":"2b1b","unicode_alt":"2b1b-fe0f","code_decimal":"⬛","name":"black large square","shortname":":black_large_square:","category":"symbols","emoji_order":"2165","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square"]},"white_large_square":{"unicode":"2b1c","unicode_alt":"2b1c-fe0f","code_decimal":"⬜","name":"white large square","shortname":":white_large_square:","category":"symbols","emoji_order":"2166","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square"]},"large_orange_diamond":{"unicode":"1f536","unicode_alt":"","code_decimal":"🔶","name":"large orange diamond","shortname":":large_orange_diamond:","category":"symbols","emoji_order":"2167","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol"]},"large_blue_diamond":{"unicode":"1f537","unicode_alt":"","code_decimal":"🔷","name":"large blue diamond","shortname":":large_blue_diamond:","category":"symbols","emoji_order":"2168","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol"]},"small_orange_diamond":{"unicode":"1f538","unicode_alt":"","code_decimal":"🔸","name":"small orange diamond","shortname":":small_orange_diamond:","category":"symbols","emoji_order":"2169","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol"]},"small_blue_diamond":{"unicode":"1f539","unicode_alt":"","code_decimal":"🔹","name":"small blue diamond","shortname":":small_blue_diamond:","category":"symbols","emoji_order":"2170","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol"]},"small_red_triangle":{"unicode":"1f53a","unicode_alt":"","code_decimal":"🔺","name":"up-pointing red triangle","shortname":":small_red_triangle:","category":"symbols","emoji_order":"2171","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","triangle"]},"small_red_triangle_down":{"unicode":"1f53b","unicode_alt":"","code_decimal":"🔻","name":"down-pointing red triangle","shortname":":small_red_triangle_down:","category":"symbols","emoji_order":"2172","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","triangle"]},"diamond_shape_with_a_dot_inside":{"unicode":"1f4a0","unicode_alt":"","code_decimal":"💠","name":"diamond shape with a dot inside","shortname":":diamond_shape_with_a_dot_inside:","category":"symbols","emoji_order":"2173","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"radio_button":{"unicode":"1f518","unicode_alt":"","code_decimal":"🔘","name":"radio button","shortname":":radio_button:","category":"symbols","emoji_order":"2174","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle"]},"black_square_button":{"unicode":"1f532","unicode_alt":"","code_decimal":"🔲","name":"black square button","shortname":":black_square_button:","category":"symbols","emoji_order":"2175","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square"]},"white_square_button":{"unicode":"1f533","unicode_alt":"","code_decimal":"🔳","name":"white square button","shortname":":white_square_button:","category":"symbols","emoji_order":"2176","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square"]},"white_circle":{"unicode":"26aa","unicode_alt":"26aa-fe0f","code_decimal":"⚪","name":"white circle","shortname":":white_circle:","category":"symbols","emoji_order":"2177","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","circle"]},"black_circle":{"unicode":"26ab","unicode_alt":"26ab-fe0f","code_decimal":"⚫","name":"black circle","shortname":":black_circle:","category":"symbols","emoji_order":"2178","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","circle"]},"red_circle":{"unicode":"1f534","unicode_alt":"","code_decimal":"🔴","name":"red circle","shortname":":red_circle:","category":"symbols","emoji_order":"2179","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","circle"]},"blue_circle":{"unicode":"1f535","unicode_alt":"","code_decimal":"🔵","name":"blue circle","shortname":":blue_circle:","category":"symbols","emoji_order":"2180","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","circle"]},"checkered_flag":{"unicode":"1f3c1","unicode_alt":"","code_decimal":"🏁","name":"chequered flag","shortname":":checkered_flag:","category":"travel","emoji_order":"2181","aliases":[],"aliases_ascii":[],"keywords":["object"]},"triangular_flag_on_post":{"unicode":"1f6a9","unicode_alt":"","code_decimal":"🚩","name":"triangular flag on post","shortname":":triangular_flag_on_post:","category":"objects","emoji_order":"2182","aliases":[],"aliases_ascii":[],"keywords":["object"]},"crossed_flags":{"unicode":"1f38c","unicode_alt":"","code_decimal":"🎌","name":"crossed flags","shortname":":crossed_flags:","category":"objects","emoji_order":"2183","aliases":[],"aliases_ascii":[],"keywords":["object","japan"]},"flag_black":{"unicode":"1f3f4","unicode_alt":"","code_decimal":"🏴","name":"waving black flag","shortname":":flag_black:","category":"objects","emoji_order":"2184","aliases":[":waving_black_flag:"],"aliases_ascii":[],"keywords":["object"]},"flag_white":{"unicode":"1f3f3","unicode_alt":"1f3f3-fe0f","code_decimal":"🏳","name":"waving white flag","shortname":":flag_white:","category":"objects","emoji_order":"2185","aliases":[":waving_white_flag:"],"aliases_ascii":[],"keywords":["object"]},"rainbow_flag":{"unicode":"1f3f3-1f308","unicode_alt":"","code_decimal":"🏳🌈","name":"rainbow_flag","shortname":":rainbow_flag:","category":"objects","emoji_order":"2186","aliases":[":gay_pride_flag:"],"aliases_ascii":[],"keywords":[]},"flag_ac":{"unicode":"1f1e6-1f1e8","unicode_alt":"","code_decimal":"🇦🇨","name":"ascension","shortname":":flag_ac:","category":"flags","emoji_order":"2187","aliases":[":ac:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ad":{"unicode":"1f1e6-1f1e9","unicode_alt":"","code_decimal":"🇦🇩","name":"andorra","shortname":":flag_ad:","category":"flags","emoji_order":"2188","aliases":[":ad:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ae":{"unicode":"1f1e6-1f1ea","unicode_alt":"","code_decimal":"🇦🇪","name":"the united arab emirates","shortname":":flag_ae:","category":"flags","emoji_order":"2189","aliases":[":ae:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_af":{"unicode":"1f1e6-1f1eb","unicode_alt":"","code_decimal":"🇦🇫","name":"afghanistan","shortname":":flag_af:","category":"flags","emoji_order":"2190","aliases":[":af:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ag":{"unicode":"1f1e6-1f1ec","unicode_alt":"","code_decimal":"🇦🇬","name":"antigua and barbuda","shortname":":flag_ag:","category":"flags","emoji_order":"2191","aliases":[":ag:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ai":{"unicode":"1f1e6-1f1ee","unicode_alt":"","code_decimal":"🇦🇮","name":"anguilla","shortname":":flag_ai:","category":"flags","emoji_order":"2192","aliases":[":ai:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_al":{"unicode":"1f1e6-1f1f1","unicode_alt":"","code_decimal":"🇦🇱","name":"albania","shortname":":flag_al:","category":"flags","emoji_order":"2193","aliases":[":al:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_am":{"unicode":"1f1e6-1f1f2","unicode_alt":"","code_decimal":"🇦🇲","name":"armenia","shortname":":flag_am:","category":"flags","emoji_order":"2194","aliases":[":am:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ao":{"unicode":"1f1e6-1f1f4","unicode_alt":"","code_decimal":"🇦🇴","name":"angola","shortname":":flag_ao:","category":"flags","emoji_order":"2195","aliases":[":ao:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_aq":{"unicode":"1f1e6-1f1f6","unicode_alt":"","code_decimal":"🇦🇶","name":"antarctica","shortname":":flag_aq:","category":"flags","emoji_order":"2196","aliases":[":aq:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ar":{"unicode":"1f1e6-1f1f7","unicode_alt":"","code_decimal":"🇦🇷","name":"argentina","shortname":":flag_ar:","category":"flags","emoji_order":"2197","aliases":[":ar:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_as":{"unicode":"1f1e6-1f1f8","unicode_alt":"","code_decimal":"🇦🇸","name":"american samoa","shortname":":flag_as:","category":"flags","emoji_order":"2198","aliases":[":as:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_at":{"unicode":"1f1e6-1f1f9","unicode_alt":"","code_decimal":"🇦🇹","name":"austria","shortname":":flag_at:","category":"flags","emoji_order":"2199","aliases":[":at:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_au":{"unicode":"1f1e6-1f1fa","unicode_alt":"","code_decimal":"🇦🇺","name":"australia","shortname":":flag_au:","category":"flags","emoji_order":"2200","aliases":[":au:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_aw":{"unicode":"1f1e6-1f1fc","unicode_alt":"","code_decimal":"🇦🇼","name":"aruba","shortname":":flag_aw:","category":"flags","emoji_order":"2201","aliases":[":aw:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ax":{"unicode":"1f1e6-1f1fd","unicode_alt":"","code_decimal":"🇦🇽","name":"\u00e5land islands","shortname":":flag_ax:","category":"flags","emoji_order":"2202","aliases":[":ax:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_az":{"unicode":"1f1e6-1f1ff","unicode_alt":"","code_decimal":"🇦🇿","name":"azerbaijan","shortname":":flag_az:","category":"flags","emoji_order":"2203","aliases":[":az:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ba":{"unicode":"1f1e7-1f1e6","unicode_alt":"","code_decimal":"🇧🇦","name":"bosnia and herzegovina","shortname":":flag_ba:","category":"flags","emoji_order":"2204","aliases":[":ba:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bb":{"unicode":"1f1e7-1f1e7","unicode_alt":"","code_decimal":"🇧🇧","name":"barbados","shortname":":flag_bb:","category":"flags","emoji_order":"2205","aliases":[":bb:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bd":{"unicode":"1f1e7-1f1e9","unicode_alt":"","code_decimal":"🇧🇩","name":"bangladesh","shortname":":flag_bd:","category":"flags","emoji_order":"2206","aliases":[":bd:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_be":{"unicode":"1f1e7-1f1ea","unicode_alt":"","code_decimal":"🇧🇪","name":"belgium","shortname":":flag_be:","category":"flags","emoji_order":"2207","aliases":[":be:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bf":{"unicode":"1f1e7-1f1eb","unicode_alt":"","code_decimal":"🇧🇫","name":"burkina faso","shortname":":flag_bf:","category":"flags","emoji_order":"2208","aliases":[":bf:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bg":{"unicode":"1f1e7-1f1ec","unicode_alt":"","code_decimal":"🇧🇬","name":"bulgaria","shortname":":flag_bg:","category":"flags","emoji_order":"2209","aliases":[":bg:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bh":{"unicode":"1f1e7-1f1ed","unicode_alt":"","code_decimal":"🇧🇭","name":"bahrain","shortname":":flag_bh:","category":"flags","emoji_order":"2210","aliases":[":bh:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bi":{"unicode":"1f1e7-1f1ee","unicode_alt":"","code_decimal":"🇧🇮","name":"burundi","shortname":":flag_bi:","category":"flags","emoji_order":"2211","aliases":[":bi:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bj":{"unicode":"1f1e7-1f1ef","unicode_alt":"","code_decimal":"🇧🇯","name":"benin","shortname":":flag_bj:","category":"flags","emoji_order":"2212","aliases":[":bj:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bl":{"unicode":"1f1e7-1f1f1","unicode_alt":"","code_decimal":"🇧🇱","name":"saint barth\u00e9lemy","shortname":":flag_bl:","category":"flags","emoji_order":"2213","aliases":[":bl:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bm":{"unicode":"1f1e7-1f1f2","unicode_alt":"","code_decimal":"🇧🇲","name":"bermuda","shortname":":flag_bm:","category":"flags","emoji_order":"2214","aliases":[":bm:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bn":{"unicode":"1f1e7-1f1f3","unicode_alt":"","code_decimal":"🇧🇳","name":"brunei","shortname":":flag_bn:","category":"flags","emoji_order":"2215","aliases":[":bn:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bo":{"unicode":"1f1e7-1f1f4","unicode_alt":"","code_decimal":"🇧🇴","name":"bolivia","shortname":":flag_bo:","category":"flags","emoji_order":"2216","aliases":[":bo:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bq":{"unicode":"1f1e7-1f1f6","unicode_alt":"","code_decimal":"🇧🇶","name":"caribbean netherlands","shortname":":flag_bq:","category":"flags","emoji_order":"2217","aliases":[":bq:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_br":{"unicode":"1f1e7-1f1f7","unicode_alt":"","code_decimal":"🇧🇷","name":"brazil","shortname":":flag_br:","category":"flags","emoji_order":"2218","aliases":[":br:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bs":{"unicode":"1f1e7-1f1f8","unicode_alt":"","code_decimal":"🇧🇸","name":"the bahamas","shortname":":flag_bs:","category":"flags","emoji_order":"2219","aliases":[":bs:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bt":{"unicode":"1f1e7-1f1f9","unicode_alt":"","code_decimal":"🇧🇹","name":"bhutan","shortname":":flag_bt:","category":"flags","emoji_order":"2220","aliases":[":bt:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bv":{"unicode":"1f1e7-1f1fb","unicode_alt":"","code_decimal":"🇧🇻","name":"bouvet island","shortname":":flag_bv:","category":"flags","emoji_order":"2221","aliases":[":bv:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bw":{"unicode":"1f1e7-1f1fc","unicode_alt":"","code_decimal":"🇧🇼","name":"botswana","shortname":":flag_bw:","category":"flags","emoji_order":"2222","aliases":[":bw:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_by":{"unicode":"1f1e7-1f1fe","unicode_alt":"","code_decimal":"🇧🇾","name":"belarus","shortname":":flag_by:","category":"flags","emoji_order":"2223","aliases":[":by:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_bz":{"unicode":"1f1e7-1f1ff","unicode_alt":"","code_decimal":"🇧🇿","name":"belize","shortname":":flag_bz:","category":"flags","emoji_order":"2224","aliases":[":bz:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ca":{"unicode":"1f1e8-1f1e6","unicode_alt":"","code_decimal":"🇨🇦","name":"canada","shortname":":flag_ca:","category":"flags","emoji_order":"2225","aliases":[":ca:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cc":{"unicode":"1f1e8-1f1e8","unicode_alt":"","code_decimal":"🇨🇨","name":"cocos (keeling) islands","shortname":":flag_cc:","category":"flags","emoji_order":"2226","aliases":[":cc:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cd":{"unicode":"1f1e8-1f1e9","unicode_alt":"","code_decimal":"🇨🇩","name":"the democratic republic of the congo","shortname":":flag_cd:","category":"flags","emoji_order":"2227","aliases":[":congo:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cf":{"unicode":"1f1e8-1f1eb","unicode_alt":"","code_decimal":"🇨🇫","name":"central african republic","shortname":":flag_cf:","category":"flags","emoji_order":"2228","aliases":[":cf:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cg":{"unicode":"1f1e8-1f1ec","unicode_alt":"","code_decimal":"🇨🇬","name":"the republic of the congo","shortname":":flag_cg:","category":"flags","emoji_order":"2229","aliases":[":cg:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ch":{"unicode":"1f1e8-1f1ed","unicode_alt":"","code_decimal":"🇨🇭","name":"switzerland","shortname":":flag_ch:","category":"flags","emoji_order":"2230","aliases":[":ch:"],"aliases_ascii":[],"keywords":["country","neutral","flag"]},"flag_ci":{"unicode":"1f1e8-1f1ee","unicode_alt":"","code_decimal":"🇨🇮","name":"c\u00f4te d\u2019ivoire","shortname":":flag_ci:","category":"flags","emoji_order":"2231","aliases":[":ci:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ck":{"unicode":"1f1e8-1f1f0","unicode_alt":"","code_decimal":"🇨🇰","name":"cook islands","shortname":":flag_ck:","category":"flags","emoji_order":"2232","aliases":[":ck:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cl":{"unicode":"1f1e8-1f1f1","unicode_alt":"","code_decimal":"🇨🇱","name":"chile","shortname":":flag_cl:","category":"flags","emoji_order":"2233","aliases":[":chile:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cm":{"unicode":"1f1e8-1f1f2","unicode_alt":"","code_decimal":"🇨🇲","name":"cameroon","shortname":":flag_cm:","category":"flags","emoji_order":"2234","aliases":[":cm:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cn":{"unicode":"1f1e8-1f1f3","unicode_alt":"","code_decimal":"🇨🇳","name":"china","shortname":":flag_cn:","category":"flags","emoji_order":"2235","aliases":[":cn:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_co":{"unicode":"1f1e8-1f1f4","unicode_alt":"","code_decimal":"🇨🇴","name":"colombia","shortname":":flag_co:","category":"flags","emoji_order":"2236","aliases":[":co:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cp":{"unicode":"1f1e8-1f1f5","unicode_alt":"","code_decimal":"🇨🇵","name":"clipperton island","shortname":":flag_cp:","category":"flags","emoji_order":"2237","aliases":[":cp:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cr":{"unicode":"1f1e8-1f1f7","unicode_alt":"","code_decimal":"🇨🇷","name":"costa rica","shortname":":flag_cr:","category":"flags","emoji_order":"2238","aliases":[":cr:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cu":{"unicode":"1f1e8-1f1fa","unicode_alt":"","code_decimal":"🇨🇺","name":"cuba","shortname":":flag_cu:","category":"flags","emoji_order":"2239","aliases":[":cu:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cv":{"unicode":"1f1e8-1f1fb","unicode_alt":"","code_decimal":"🇨🇻","name":"cape verde","shortname":":flag_cv:","category":"flags","emoji_order":"2240","aliases":[":cv:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cw":{"unicode":"1f1e8-1f1fc","unicode_alt":"","code_decimal":"🇨🇼","name":"cura\u00e7ao","shortname":":flag_cw:","category":"flags","emoji_order":"2241","aliases":[":cw:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cx":{"unicode":"1f1e8-1f1fd","unicode_alt":"","code_decimal":"🇨🇽","name":"christmas island","shortname":":flag_cx:","category":"flags","emoji_order":"2242","aliases":[":cx:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cy":{"unicode":"1f1e8-1f1fe","unicode_alt":"","code_decimal":"🇨🇾","name":"cyprus","shortname":":flag_cy:","category":"flags","emoji_order":"2243","aliases":[":cy:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_cz":{"unicode":"1f1e8-1f1ff","unicode_alt":"","code_decimal":"🇨🇿","name":"the czech republic","shortname":":flag_cz:","category":"flags","emoji_order":"2244","aliases":[":cz:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_de":{"unicode":"1f1e9-1f1ea","unicode_alt":"","code_decimal":"🇩🇪","name":"germany","shortname":":flag_de:","category":"flags","emoji_order":"2245","aliases":[":de:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_dg":{"unicode":"1f1e9-1f1ec","unicode_alt":"","code_decimal":"🇩🇬","name":"diego garcia","shortname":":flag_dg:","category":"flags","emoji_order":"2246","aliases":[":dg:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_dj":{"unicode":"1f1e9-1f1ef","unicode_alt":"","code_decimal":"🇩🇯","name":"djibouti","shortname":":flag_dj:","category":"flags","emoji_order":"2247","aliases":[":dj:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_dk":{"unicode":"1f1e9-1f1f0","unicode_alt":"","code_decimal":"🇩🇰","name":"denmark","shortname":":flag_dk:","category":"flags","emoji_order":"2248","aliases":[":dk:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_dm":{"unicode":"1f1e9-1f1f2","unicode_alt":"","code_decimal":"🇩🇲","name":"dominica","shortname":":flag_dm:","category":"flags","emoji_order":"2249","aliases":[":dm:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_do":{"unicode":"1f1e9-1f1f4","unicode_alt":"","code_decimal":"🇩🇴","name":"the dominican republic","shortname":":flag_do:","category":"flags","emoji_order":"2250","aliases":[":do:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_dz":{"unicode":"1f1e9-1f1ff","unicode_alt":"","code_decimal":"🇩🇿","name":"algeria","shortname":":flag_dz:","category":"flags","emoji_order":"2251","aliases":[":dz:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ea":{"unicode":"1f1ea-1f1e6","unicode_alt":"","code_decimal":"🇪🇦","name":"ceuta, melilla","shortname":":flag_ea:","category":"flags","emoji_order":"2252","aliases":[":ea:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ec":{"unicode":"1f1ea-1f1e8","unicode_alt":"","code_decimal":"🇪🇨","name":"ecuador","shortname":":flag_ec:","category":"flags","emoji_order":"2253","aliases":[":ec:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ee":{"unicode":"1f1ea-1f1ea","unicode_alt":"","code_decimal":"🇪🇪","name":"estonia","shortname":":flag_ee:","category":"flags","emoji_order":"2254","aliases":[":ee:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_eg":{"unicode":"1f1ea-1f1ec","unicode_alt":"","code_decimal":"🇪🇬","name":"egypt","shortname":":flag_eg:","category":"flags","emoji_order":"2255","aliases":[":eg:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_eh":{"unicode":"1f1ea-1f1ed","unicode_alt":"","code_decimal":"🇪🇭","name":"western sahara","shortname":":flag_eh:","category":"flags","emoji_order":"2256","aliases":[":eh:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_er":{"unicode":"1f1ea-1f1f7","unicode_alt":"","code_decimal":"🇪🇷","name":"eritrea","shortname":":flag_er:","category":"flags","emoji_order":"2257","aliases":[":er:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_es":{"unicode":"1f1ea-1f1f8","unicode_alt":"","code_decimal":"🇪🇸","name":"spain","shortname":":flag_es:","category":"flags","emoji_order":"2258","aliases":[":es:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_et":{"unicode":"1f1ea-1f1f9","unicode_alt":"","code_decimal":"🇪🇹","name":"ethiopia","shortname":":flag_et:","category":"flags","emoji_order":"2259","aliases":[":et:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_eu":{"unicode":"1f1ea-1f1fa","unicode_alt":"","code_decimal":"🇪🇺","name":"european union","shortname":":flag_eu:","category":"flags","emoji_order":"2260","aliases":[":eu:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_fi":{"unicode":"1f1eb-1f1ee","unicode_alt":"","code_decimal":"🇫🇮","name":"finland","shortname":":flag_fi:","category":"flags","emoji_order":"2261","aliases":[":fi:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_fj":{"unicode":"1f1eb-1f1ef","unicode_alt":"","code_decimal":"🇫🇯","name":"fiji","shortname":":flag_fj:","category":"flags","emoji_order":"2262","aliases":[":fj:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_fk":{"unicode":"1f1eb-1f1f0","unicode_alt":"","code_decimal":"🇫🇰","name":"falkland islands","shortname":":flag_fk:","category":"flags","emoji_order":"2263","aliases":[":fk:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_fm":{"unicode":"1f1eb-1f1f2","unicode_alt":"","code_decimal":"🇫🇲","name":"micronesia","shortname":":flag_fm:","category":"flags","emoji_order":"2264","aliases":[":fm:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_fo":{"unicode":"1f1eb-1f1f4","unicode_alt":"","code_decimal":"🇫🇴","name":"faroe islands","shortname":":flag_fo:","category":"flags","emoji_order":"2265","aliases":[":fo:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_fr":{"unicode":"1f1eb-1f1f7","unicode_alt":"","code_decimal":"🇫🇷","name":"france","shortname":":flag_fr:","category":"flags","emoji_order":"2266","aliases":[":fr:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ga":{"unicode":"1f1ec-1f1e6","unicode_alt":"","code_decimal":"🇬🇦","name":"gabon","shortname":":flag_ga:","category":"flags","emoji_order":"2267","aliases":[":ga:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gb":{"unicode":"1f1ec-1f1e7","unicode_alt":"","code_decimal":"🇬🇧","name":"great britain","shortname":":flag_gb:","category":"flags","emoji_order":"2268","aliases":[":gb:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gd":{"unicode":"1f1ec-1f1e9","unicode_alt":"","code_decimal":"🇬🇩","name":"grenada","shortname":":flag_gd:","category":"flags","emoji_order":"2269","aliases":[":gd:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ge":{"unicode":"1f1ec-1f1ea","unicode_alt":"","code_decimal":"🇬🇪","name":"georgia","shortname":":flag_ge:","category":"flags","emoji_order":"2270","aliases":[":ge:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gf":{"unicode":"1f1ec-1f1eb","unicode_alt":"","code_decimal":"🇬🇫","name":"french guiana","shortname":":flag_gf:","category":"flags","emoji_order":"2271","aliases":[":gf:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gg":{"unicode":"1f1ec-1f1ec","unicode_alt":"","code_decimal":"🇬🇬","name":"guernsey","shortname":":flag_gg:","category":"flags","emoji_order":"2272","aliases":[":gg:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gh":{"unicode":"1f1ec-1f1ed","unicode_alt":"","code_decimal":"🇬🇭","name":"ghana","shortname":":flag_gh:","category":"flags","emoji_order":"2273","aliases":[":gh:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gi":{"unicode":"1f1ec-1f1ee","unicode_alt":"","code_decimal":"🇬🇮","name":"gibraltar","shortname":":flag_gi:","category":"flags","emoji_order":"2274","aliases":[":gi:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gl":{"unicode":"1f1ec-1f1f1","unicode_alt":"","code_decimal":"🇬🇱","name":"greenland","shortname":":flag_gl:","category":"flags","emoji_order":"2275","aliases":[":gl:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gm":{"unicode":"1f1ec-1f1f2","unicode_alt":"","code_decimal":"🇬🇲","name":"the gambia","shortname":":flag_gm:","category":"flags","emoji_order":"2276","aliases":[":gm:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gn":{"unicode":"1f1ec-1f1f3","unicode_alt":"","code_decimal":"🇬🇳","name":"guinea","shortname":":flag_gn:","category":"flags","emoji_order":"2277","aliases":[":gn:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gp":{"unicode":"1f1ec-1f1f5","unicode_alt":"","code_decimal":"🇬🇵","name":"guadeloupe","shortname":":flag_gp:","category":"flags","emoji_order":"2278","aliases":[":gp:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gq":{"unicode":"1f1ec-1f1f6","unicode_alt":"","code_decimal":"🇬🇶","name":"equatorial guinea","shortname":":flag_gq:","category":"flags","emoji_order":"2279","aliases":[":gq:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gr":{"unicode":"1f1ec-1f1f7","unicode_alt":"","code_decimal":"🇬🇷","name":"greece","shortname":":flag_gr:","category":"flags","emoji_order":"2280","aliases":[":gr:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gs":{"unicode":"1f1ec-1f1f8","unicode_alt":"","code_decimal":"🇬🇸","name":"south georgia","shortname":":flag_gs:","category":"flags","emoji_order":"2281","aliases":[":gs:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gt":{"unicode":"1f1ec-1f1f9","unicode_alt":"","code_decimal":"🇬🇹","name":"guatemala","shortname":":flag_gt:","category":"flags","emoji_order":"2282","aliases":[":gt:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gu":{"unicode":"1f1ec-1f1fa","unicode_alt":"","code_decimal":"🇬🇺","name":"guam","shortname":":flag_gu:","category":"flags","emoji_order":"2283","aliases":[":gu:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gw":{"unicode":"1f1ec-1f1fc","unicode_alt":"","code_decimal":"🇬🇼","name":"guinea-bissau","shortname":":flag_gw:","category":"flags","emoji_order":"2284","aliases":[":gw:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_gy":{"unicode":"1f1ec-1f1fe","unicode_alt":"","code_decimal":"🇬🇾","name":"guyana","shortname":":flag_gy:","category":"flags","emoji_order":"2285","aliases":[":gy:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_hk":{"unicode":"1f1ed-1f1f0","unicode_alt":"","code_decimal":"🇭🇰","name":"hong kong","shortname":":flag_hk:","category":"flags","emoji_order":"2286","aliases":[":hk:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_hm":{"unicode":"1f1ed-1f1f2","unicode_alt":"","code_decimal":"🇭🇲","name":"heard island and mcdonald islands","shortname":":flag_hm:","category":"flags","emoji_order":"2287","aliases":[":hm:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_hn":{"unicode":"1f1ed-1f1f3","unicode_alt":"","code_decimal":"🇭🇳","name":"honduras","shortname":":flag_hn:","category":"flags","emoji_order":"2288","aliases":[":hn:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_hr":{"unicode":"1f1ed-1f1f7","unicode_alt":"","code_decimal":"🇭🇷","name":"croatia","shortname":":flag_hr:","category":"flags","emoji_order":"2289","aliases":[":hr:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ht":{"unicode":"1f1ed-1f1f9","unicode_alt":"","code_decimal":"🇭🇹","name":"haiti","shortname":":flag_ht:","category":"flags","emoji_order":"2290","aliases":[":ht:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_hu":{"unicode":"1f1ed-1f1fa","unicode_alt":"","code_decimal":"🇭🇺","name":"hungary","shortname":":flag_hu:","category":"flags","emoji_order":"2291","aliases":[":hu:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ic":{"unicode":"1f1ee-1f1e8","unicode_alt":"","code_decimal":"🇮🇨","name":"canary islands","shortname":":flag_ic:","category":"flags","emoji_order":"2292","aliases":[":ic:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_id":{"unicode":"1f1ee-1f1e9","unicode_alt":"","code_decimal":"🇮🇩","name":"indonesia","shortname":":flag_id:","category":"flags","emoji_order":"2293","aliases":[":indonesia:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ie":{"unicode":"1f1ee-1f1ea","unicode_alt":"","code_decimal":"🇮🇪","name":"ireland","shortname":":flag_ie:","category":"flags","emoji_order":"2294","aliases":[":ie:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_il":{"unicode":"1f1ee-1f1f1","unicode_alt":"","code_decimal":"🇮🇱","name":"israel","shortname":":flag_il:","category":"flags","emoji_order":"2295","aliases":[":il:"],"aliases_ascii":[],"keywords":["jew","country","flag"]},"flag_im":{"unicode":"1f1ee-1f1f2","unicode_alt":"","code_decimal":"🇮🇲","name":"isle of man","shortname":":flag_im:","category":"flags","emoji_order":"2296","aliases":[":im:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_in":{"unicode":"1f1ee-1f1f3","unicode_alt":"","code_decimal":"🇮🇳","name":"india","shortname":":flag_in:","category":"flags","emoji_order":"2297","aliases":[":in:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_io":{"unicode":"1f1ee-1f1f4","unicode_alt":"","code_decimal":"🇮🇴","name":"british indian ocean territory","shortname":":flag_io:","category":"flags","emoji_order":"2298","aliases":[":io:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_iq":{"unicode":"1f1ee-1f1f6","unicode_alt":"","code_decimal":"🇮🇶","name":"iraq","shortname":":flag_iq:","category":"flags","emoji_order":"2299","aliases":[":iq:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ir":{"unicode":"1f1ee-1f1f7","unicode_alt":"","code_decimal":"🇮🇷","name":"iran","shortname":":flag_ir:","category":"flags","emoji_order":"2300","aliases":[":ir:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_is":{"unicode":"1f1ee-1f1f8","unicode_alt":"","code_decimal":"🇮🇸","name":"iceland","shortname":":flag_is:","category":"flags","emoji_order":"2301","aliases":[":is:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_it":{"unicode":"1f1ee-1f1f9","unicode_alt":"","code_decimal":"🇮🇹","name":"italy","shortname":":flag_it:","category":"flags","emoji_order":"2302","aliases":[":it:"],"aliases_ascii":[],"keywords":["italian","country","flag"]},"flag_je":{"unicode":"1f1ef-1f1ea","unicode_alt":"","code_decimal":"🇯🇪","name":"jersey","shortname":":flag_je:","category":"flags","emoji_order":"2303","aliases":[":je:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_jm":{"unicode":"1f1ef-1f1f2","unicode_alt":"","code_decimal":"🇯🇲","name":"jamaica","shortname":":flag_jm:","category":"flags","emoji_order":"2304","aliases":[":jm:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_jo":{"unicode":"1f1ef-1f1f4","unicode_alt":"","code_decimal":"🇯🇴","name":"jordan","shortname":":flag_jo:","category":"flags","emoji_order":"2305","aliases":[":jo:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_jp":{"unicode":"1f1ef-1f1f5","unicode_alt":"","code_decimal":"🇯🇵","name":"japan","shortname":":flag_jp:","category":"flags","emoji_order":"2306","aliases":[":jp:"],"aliases_ascii":[],"keywords":["japan","country","flag"]},"flag_ke":{"unicode":"1f1f0-1f1ea","unicode_alt":"","code_decimal":"🇰🇪","name":"kenya","shortname":":flag_ke:","category":"flags","emoji_order":"2307","aliases":[":ke:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_kg":{"unicode":"1f1f0-1f1ec","unicode_alt":"","code_decimal":"🇰🇬","name":"kyrgyzstan","shortname":":flag_kg:","category":"flags","emoji_order":"2308","aliases":[":kg:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_kh":{"unicode":"1f1f0-1f1ed","unicode_alt":"","code_decimal":"🇰🇭","name":"cambodia","shortname":":flag_kh:","category":"flags","emoji_order":"2309","aliases":[":kh:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ki":{"unicode":"1f1f0-1f1ee","unicode_alt":"","code_decimal":"🇰🇮","name":"kiribati","shortname":":flag_ki:","category":"flags","emoji_order":"2310","aliases":[":ki:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_km":{"unicode":"1f1f0-1f1f2","unicode_alt":"","code_decimal":"🇰🇲","name":"the comoros","shortname":":flag_km:","category":"flags","emoji_order":"2311","aliases":[":km:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_kn":{"unicode":"1f1f0-1f1f3","unicode_alt":"","code_decimal":"🇰🇳","name":"saint kitts and nevis","shortname":":flag_kn:","category":"flags","emoji_order":"2312","aliases":[":kn:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_kp":{"unicode":"1f1f0-1f1f5","unicode_alt":"","code_decimal":"🇰🇵","name":"north korea","shortname":":flag_kp:","category":"flags","emoji_order":"2313","aliases":[":kp:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_kr":{"unicode":"1f1f0-1f1f7","unicode_alt":"","code_decimal":"🇰🇷","name":"korea","shortname":":flag_kr:","category":"flags","emoji_order":"2314","aliases":[":kr:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_kw":{"unicode":"1f1f0-1f1fc","unicode_alt":"","code_decimal":"🇰🇼","name":"kuwait","shortname":":flag_kw:","category":"flags","emoji_order":"2315","aliases":[":kw:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ky":{"unicode":"1f1f0-1f1fe","unicode_alt":"","code_decimal":"🇰🇾","name":"cayman islands","shortname":":flag_ky:","category":"flags","emoji_order":"2316","aliases":[":ky:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_kz":{"unicode":"1f1f0-1f1ff","unicode_alt":"","code_decimal":"🇰🇿","name":"kazakhstan","shortname":":flag_kz:","category":"flags","emoji_order":"2317","aliases":[":kz:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_la":{"unicode":"1f1f1-1f1e6","unicode_alt":"","code_decimal":"🇱🇦","name":"laos","shortname":":flag_la:","category":"flags","emoji_order":"2318","aliases":[":la:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_lb":{"unicode":"1f1f1-1f1e7","unicode_alt":"","code_decimal":"🇱🇧","name":"lebanon","shortname":":flag_lb:","category":"flags","emoji_order":"2319","aliases":[":lb:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_lc":{"unicode":"1f1f1-1f1e8","unicode_alt":"","code_decimal":"🇱🇨","name":"saint lucia","shortname":":flag_lc:","category":"flags","emoji_order":"2320","aliases":[":lc:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_li":{"unicode":"1f1f1-1f1ee","unicode_alt":"","code_decimal":"🇱🇮","name":"liechtenstein","shortname":":flag_li:","category":"flags","emoji_order":"2321","aliases":[":li:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_lk":{"unicode":"1f1f1-1f1f0","unicode_alt":"","code_decimal":"🇱🇰","name":"sri lanka","shortname":":flag_lk:","category":"flags","emoji_order":"2322","aliases":[":lk:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_lr":{"unicode":"1f1f1-1f1f7","unicode_alt":"","code_decimal":"🇱🇷","name":"liberia","shortname":":flag_lr:","category":"flags","emoji_order":"2323","aliases":[":lr:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ls":{"unicode":"1f1f1-1f1f8","unicode_alt":"","code_decimal":"🇱🇸","name":"lesotho","shortname":":flag_ls:","category":"flags","emoji_order":"2324","aliases":[":ls:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_lt":{"unicode":"1f1f1-1f1f9","unicode_alt":"","code_decimal":"🇱🇹","name":"lithuania","shortname":":flag_lt:","category":"flags","emoji_order":"2325","aliases":[":lt:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_lu":{"unicode":"1f1f1-1f1fa","unicode_alt":"","code_decimal":"🇱🇺","name":"luxembourg","shortname":":flag_lu:","category":"flags","emoji_order":"2326","aliases":[":lu:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_lv":{"unicode":"1f1f1-1f1fb","unicode_alt":"","code_decimal":"🇱🇻","name":"latvia","shortname":":flag_lv:","category":"flags","emoji_order":"2327","aliases":[":lv:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ly":{"unicode":"1f1f1-1f1fe","unicode_alt":"","code_decimal":"🇱🇾","name":"libya","shortname":":flag_ly:","category":"flags","emoji_order":"2328","aliases":[":ly:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ma":{"unicode":"1f1f2-1f1e6","unicode_alt":"","code_decimal":"🇲🇦","name":"morocco","shortname":":flag_ma:","category":"flags","emoji_order":"2329","aliases":[":ma:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mc":{"unicode":"1f1f2-1f1e8","unicode_alt":"","code_decimal":"🇲🇨","name":"monaco","shortname":":flag_mc:","category":"flags","emoji_order":"2330","aliases":[":mc:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_md":{"unicode":"1f1f2-1f1e9","unicode_alt":"","code_decimal":"🇲🇩","name":"moldova","shortname":":flag_md:","category":"flags","emoji_order":"2331","aliases":[":md:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_me":{"unicode":"1f1f2-1f1ea","unicode_alt":"","code_decimal":"🇲🇪","name":"montenegro","shortname":":flag_me:","category":"flags","emoji_order":"2332","aliases":[":me:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mf":{"unicode":"1f1f2-1f1eb","unicode_alt":"","code_decimal":"🇲🇫","name":"saint martin","shortname":":flag_mf:","category":"flags","emoji_order":"2333","aliases":[":mf:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mg":{"unicode":"1f1f2-1f1ec","unicode_alt":"","code_decimal":"🇲🇬","name":"madagascar","shortname":":flag_mg:","category":"flags","emoji_order":"2334","aliases":[":mg:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mh":{"unicode":"1f1f2-1f1ed","unicode_alt":"","code_decimal":"🇲🇭","name":"the marshall islands","shortname":":flag_mh:","category":"flags","emoji_order":"2335","aliases":[":mh:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mk":{"unicode":"1f1f2-1f1f0","unicode_alt":"","code_decimal":"🇲🇰","name":"macedonia","shortname":":flag_mk:","category":"flags","emoji_order":"2336","aliases":[":mk:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ml":{"unicode":"1f1f2-1f1f1","unicode_alt":"","code_decimal":"🇲🇱","name":"mali","shortname":":flag_ml:","category":"flags","emoji_order":"2337","aliases":[":ml:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mm":{"unicode":"1f1f2-1f1f2","unicode_alt":"","code_decimal":"🇲🇲","name":"myanmar","shortname":":flag_mm:","category":"flags","emoji_order":"2338","aliases":[":mm:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mn":{"unicode":"1f1f2-1f1f3","unicode_alt":"","code_decimal":"🇲🇳","name":"mongolia","shortname":":flag_mn:","category":"flags","emoji_order":"2339","aliases":[":mn:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mo":{"unicode":"1f1f2-1f1f4","unicode_alt":"","code_decimal":"🇲🇴","name":"macau","shortname":":flag_mo:","category":"flags","emoji_order":"2340","aliases":[":mo:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mp":{"unicode":"1f1f2-1f1f5","unicode_alt":"","code_decimal":"🇲🇵","name":"northern mariana islands","shortname":":flag_mp:","category":"flags","emoji_order":"2341","aliases":[":mp:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mq":{"unicode":"1f1f2-1f1f6","unicode_alt":"","code_decimal":"🇲🇶","name":"martinique","shortname":":flag_mq:","category":"flags","emoji_order":"2342","aliases":[":mq:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mr":{"unicode":"1f1f2-1f1f7","unicode_alt":"","code_decimal":"🇲🇷","name":"mauritania","shortname":":flag_mr:","category":"flags","emoji_order":"2343","aliases":[":mr:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ms":{"unicode":"1f1f2-1f1f8","unicode_alt":"","code_decimal":"🇲🇸","name":"montserrat","shortname":":flag_ms:","category":"flags","emoji_order":"2344","aliases":[":ms:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mt":{"unicode":"1f1f2-1f1f9","unicode_alt":"","code_decimal":"🇲🇹","name":"malta","shortname":":flag_mt:","category":"flags","emoji_order":"2345","aliases":[":mt:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mu":{"unicode":"1f1f2-1f1fa","unicode_alt":"","code_decimal":"🇲🇺","name":"mauritius","shortname":":flag_mu:","category":"flags","emoji_order":"2346","aliases":[":mu:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mv":{"unicode":"1f1f2-1f1fb","unicode_alt":"","code_decimal":"🇲🇻","name":"maldives","shortname":":flag_mv:","category":"flags","emoji_order":"2347","aliases":[":mv:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mw":{"unicode":"1f1f2-1f1fc","unicode_alt":"","code_decimal":"🇲🇼","name":"malawi","shortname":":flag_mw:","category":"flags","emoji_order":"2348","aliases":[":mw:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mx":{"unicode":"1f1f2-1f1fd","unicode_alt":"","code_decimal":"🇲🇽","name":"mexico","shortname":":flag_mx:","category":"flags","emoji_order":"2349","aliases":[":mx:"],"aliases_ascii":[],"keywords":["country","mexican","flag"]},"flag_my":{"unicode":"1f1f2-1f1fe","unicode_alt":"","code_decimal":"🇲🇾","name":"malaysia","shortname":":flag_my:","category":"flags","emoji_order":"2350","aliases":[":my:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_mz":{"unicode":"1f1f2-1f1ff","unicode_alt":"","code_decimal":"🇲🇿","name":"mozambique","shortname":":flag_mz:","category":"flags","emoji_order":"2351","aliases":[":mz:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_na":{"unicode":"1f1f3-1f1e6","unicode_alt":"","code_decimal":"🇳🇦","name":"namibia","shortname":":flag_na:","category":"flags","emoji_order":"2352","aliases":[":na:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_nc":{"unicode":"1f1f3-1f1e8","unicode_alt":"","code_decimal":"🇳🇨","name":"new caledonia","shortname":":flag_nc:","category":"flags","emoji_order":"2353","aliases":[":nc:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ne":{"unicode":"1f1f3-1f1ea","unicode_alt":"","code_decimal":"🇳🇪","name":"niger","shortname":":flag_ne:","category":"flags","emoji_order":"2354","aliases":[":ne:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_nf":{"unicode":"1f1f3-1f1eb","unicode_alt":"","code_decimal":"🇳🇫","name":"norfolk island","shortname":":flag_nf:","category":"flags","emoji_order":"2355","aliases":[":nf:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ng":{"unicode":"1f1f3-1f1ec","unicode_alt":"","code_decimal":"🇳🇬","name":"nigeria","shortname":":flag_ng:","category":"flags","emoji_order":"2356","aliases":[":nigeria:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ni":{"unicode":"1f1f3-1f1ee","unicode_alt":"","code_decimal":"🇳🇮","name":"nicaragua","shortname":":flag_ni:","category":"flags","emoji_order":"2357","aliases":[":ni:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_nl":{"unicode":"1f1f3-1f1f1","unicode_alt":"","code_decimal":"🇳🇱","name":"the netherlands","shortname":":flag_nl:","category":"flags","emoji_order":"2358","aliases":[":nl:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_no":{"unicode":"1f1f3-1f1f4","unicode_alt":"","code_decimal":"🇳🇴","name":"norway","shortname":":flag_no:","category":"flags","emoji_order":"2359","aliases":[":no:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_np":{"unicode":"1f1f3-1f1f5","unicode_alt":"","code_decimal":"🇳🇵","name":"nepal","shortname":":flag_np:","category":"flags","emoji_order":"2360","aliases":[":np:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_nr":{"unicode":"1f1f3-1f1f7","unicode_alt":"","code_decimal":"🇳🇷","name":"nauru","shortname":":flag_nr:","category":"flags","emoji_order":"2361","aliases":[":nr:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_nu":{"unicode":"1f1f3-1f1fa","unicode_alt":"","code_decimal":"🇳🇺","name":"niue","shortname":":flag_nu:","category":"flags","emoji_order":"2362","aliases":[":nu:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_nz":{"unicode":"1f1f3-1f1ff","unicode_alt":"","code_decimal":"🇳🇿","name":"new zealand","shortname":":flag_nz:","category":"flags","emoji_order":"2363","aliases":[":nz:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_om":{"unicode":"1f1f4-1f1f2","unicode_alt":"","code_decimal":"🇴🇲","name":"oman","shortname":":flag_om:","category":"flags","emoji_order":"2364","aliases":[":om:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_pa":{"unicode":"1f1f5-1f1e6","unicode_alt":"","code_decimal":"🇵🇦","name":"panama","shortname":":flag_pa:","category":"flags","emoji_order":"2365","aliases":[":pa:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_pe":{"unicode":"1f1f5-1f1ea","unicode_alt":"","code_decimal":"🇵🇪","name":"peru","shortname":":flag_pe:","category":"flags","emoji_order":"2366","aliases":[":pe:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_pf":{"unicode":"1f1f5-1f1eb","unicode_alt":"","code_decimal":"🇵🇫","name":"french polynesia","shortname":":flag_pf:","category":"flags","emoji_order":"2367","aliases":[":pf:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_pg":{"unicode":"1f1f5-1f1ec","unicode_alt":"","code_decimal":"🇵🇬","name":"papua new guinea","shortname":":flag_pg:","category":"flags","emoji_order":"2368","aliases":[":pg:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ph":{"unicode":"1f1f5-1f1ed","unicode_alt":"","code_decimal":"🇵🇭","name":"the philippines","shortname":":flag_ph:","category":"flags","emoji_order":"2369","aliases":[":ph:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_pk":{"unicode":"1f1f5-1f1f0","unicode_alt":"","code_decimal":"🇵🇰","name":"pakistan","shortname":":flag_pk:","category":"flags","emoji_order":"2370","aliases":[":pk:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_pl":{"unicode":"1f1f5-1f1f1","unicode_alt":"","code_decimal":"🇵🇱","name":"poland","shortname":":flag_pl:","category":"flags","emoji_order":"2371","aliases":[":pl:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_pm":{"unicode":"1f1f5-1f1f2","unicode_alt":"","code_decimal":"🇵🇲","name":"saint pierre and miquelon","shortname":":flag_pm:","category":"flags","emoji_order":"2372","aliases":[":pm:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_pn":{"unicode":"1f1f5-1f1f3","unicode_alt":"","code_decimal":"🇵🇳","name":"pitcairn","shortname":":flag_pn:","category":"flags","emoji_order":"2373","aliases":[":pn:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_pr":{"unicode":"1f1f5-1f1f7","unicode_alt":"","code_decimal":"🇵🇷","name":"puerto rico","shortname":":flag_pr:","category":"flags","emoji_order":"2374","aliases":[":pr:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ps":{"unicode":"1f1f5-1f1f8","unicode_alt":"","code_decimal":"🇵🇸","name":"palestinian authority","shortname":":flag_ps:","category":"flags","emoji_order":"2375","aliases":[":ps:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_pt":{"unicode":"1f1f5-1f1f9","unicode_alt":"","code_decimal":"🇵🇹","name":"portugal","shortname":":flag_pt:","category":"flags","emoji_order":"2376","aliases":[":pt:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_pw":{"unicode":"1f1f5-1f1fc","unicode_alt":"","code_decimal":"🇵🇼","name":"palau","shortname":":flag_pw:","category":"flags","emoji_order":"2377","aliases":[":pw:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_py":{"unicode":"1f1f5-1f1fe","unicode_alt":"","code_decimal":"🇵🇾","name":"paraguay","shortname":":flag_py:","category":"flags","emoji_order":"2378","aliases":[":py:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_qa":{"unicode":"1f1f6-1f1e6","unicode_alt":"","code_decimal":"🇶🇦","name":"qatar","shortname":":flag_qa:","category":"flags","emoji_order":"2379","aliases":[":qa:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_re":{"unicode":"1f1f7-1f1ea","unicode_alt":"","code_decimal":"🇷🇪","name":"r\u00e9union","shortname":":flag_re:","category":"flags","emoji_order":"2380","aliases":[":re:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ro":{"unicode":"1f1f7-1f1f4","unicode_alt":"","code_decimal":"🇷🇴","name":"romania","shortname":":flag_ro:","category":"flags","emoji_order":"2381","aliases":[":ro:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_rs":{"unicode":"1f1f7-1f1f8","unicode_alt":"","code_decimal":"🇷🇸","name":"serbia","shortname":":flag_rs:","category":"flags","emoji_order":"2382","aliases":[":rs:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ru":{"unicode":"1f1f7-1f1fa","unicode_alt":"","code_decimal":"🇷🇺","name":"russia","shortname":":flag_ru:","category":"flags","emoji_order":"2383","aliases":[":ru:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_rw":{"unicode":"1f1f7-1f1fc","unicode_alt":"","code_decimal":"🇷🇼","name":"rwanda","shortname":":flag_rw:","category":"flags","emoji_order":"2384","aliases":[":rw:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sa":{"unicode":"1f1f8-1f1e6","unicode_alt":"","code_decimal":"🇸🇦","name":"saudi arabia","shortname":":flag_sa:","category":"flags","emoji_order":"2385","aliases":[":saudiarabia:",":saudi:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sb":{"unicode":"1f1f8-1f1e7","unicode_alt":"","code_decimal":"🇸🇧","name":"the solomon islands","shortname":":flag_sb:","category":"flags","emoji_order":"2386","aliases":[":sb:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sc":{"unicode":"1f1f8-1f1e8","unicode_alt":"","code_decimal":"🇸🇨","name":"the seychelles","shortname":":flag_sc:","category":"flags","emoji_order":"2387","aliases":[":sc:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sd":{"unicode":"1f1f8-1f1e9","unicode_alt":"","code_decimal":"🇸🇩","name":"sudan","shortname":":flag_sd:","category":"flags","emoji_order":"2388","aliases":[":sd:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_se":{"unicode":"1f1f8-1f1ea","unicode_alt":"","code_decimal":"🇸🇪","name":"sweden","shortname":":flag_se:","category":"flags","emoji_order":"2389","aliases":[":se:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sg":{"unicode":"1f1f8-1f1ec","unicode_alt":"","code_decimal":"🇸🇬","name":"singapore","shortname":":flag_sg:","category":"flags","emoji_order":"2390","aliases":[":sg:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sh":{"unicode":"1f1f8-1f1ed","unicode_alt":"","code_decimal":"🇸🇭","name":"saint helena","shortname":":flag_sh:","category":"flags","emoji_order":"2391","aliases":[":sh:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_si":{"unicode":"1f1f8-1f1ee","unicode_alt":"","code_decimal":"🇸🇮","name":"slovenia","shortname":":flag_si:","category":"flags","emoji_order":"2392","aliases":[":si:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sj":{"unicode":"1f1f8-1f1ef","unicode_alt":"","code_decimal":"🇸🇯","name":"svalbard and jan mayen","shortname":":flag_sj:","category":"flags","emoji_order":"2393","aliases":[":sj:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sk":{"unicode":"1f1f8-1f1f0","unicode_alt":"","code_decimal":"🇸🇰","name":"slovakia","shortname":":flag_sk:","category":"flags","emoji_order":"2394","aliases":[":sk:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sl":{"unicode":"1f1f8-1f1f1","unicode_alt":"","code_decimal":"🇸🇱","name":"sierra leone","shortname":":flag_sl:","category":"flags","emoji_order":"2395","aliases":[":sl:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sm":{"unicode":"1f1f8-1f1f2","unicode_alt":"","code_decimal":"🇸🇲","name":"san marino","shortname":":flag_sm:","category":"flags","emoji_order":"2396","aliases":[":sm:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sn":{"unicode":"1f1f8-1f1f3","unicode_alt":"","code_decimal":"🇸🇳","name":"senegal","shortname":":flag_sn:","category":"flags","emoji_order":"2397","aliases":[":sn:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_so":{"unicode":"1f1f8-1f1f4","unicode_alt":"","code_decimal":"🇸🇴","name":"somalia","shortname":":flag_so:","category":"flags","emoji_order":"2398","aliases":[":so:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sr":{"unicode":"1f1f8-1f1f7","unicode_alt":"","code_decimal":"🇸🇷","name":"suriname","shortname":":flag_sr:","category":"flags","emoji_order":"2399","aliases":[":sr:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ss":{"unicode":"1f1f8-1f1f8","unicode_alt":"","code_decimal":"🇸🇸","name":"south sudan","shortname":":flag_ss:","category":"flags","emoji_order":"2400","aliases":[":ss:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_st":{"unicode":"1f1f8-1f1f9","unicode_alt":"","code_decimal":"🇸🇹","name":"s\u00e3o tom\u00e9 and pr\u00edncipe","shortname":":flag_st:","category":"flags","emoji_order":"2401","aliases":[":st:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sv":{"unicode":"1f1f8-1f1fb","unicode_alt":"","code_decimal":"🇸🇻","name":"el salvador","shortname":":flag_sv:","category":"flags","emoji_order":"2402","aliases":[":sv:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sx":{"unicode":"1f1f8-1f1fd","unicode_alt":"","code_decimal":"🇸🇽","name":"sint maarten","shortname":":flag_sx:","category":"flags","emoji_order":"2403","aliases":[":sx:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sy":{"unicode":"1f1f8-1f1fe","unicode_alt":"","code_decimal":"🇸🇾","name":"syria","shortname":":flag_sy:","category":"flags","emoji_order":"2404","aliases":[":sy:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_sz":{"unicode":"1f1f8-1f1ff","unicode_alt":"","code_decimal":"🇸🇿","name":"swaziland","shortname":":flag_sz:","category":"flags","emoji_order":"2405","aliases":[":sz:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ta":{"unicode":"1f1f9-1f1e6","unicode_alt":"","code_decimal":"🇹🇦","name":"tristan da cunha","shortname":":flag_ta:","category":"flags","emoji_order":"2406","aliases":[":ta:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_tc":{"unicode":"1f1f9-1f1e8","unicode_alt":"","code_decimal":"🇹🇨","name":"turks and caicos islands","shortname":":flag_tc:","category":"flags","emoji_order":"2407","aliases":[":tc:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_td":{"unicode":"1f1f9-1f1e9","unicode_alt":"","code_decimal":"🇹🇩","name":"chad","shortname":":flag_td:","category":"flags","emoji_order":"2408","aliases":[":td:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_tf":{"unicode":"1f1f9-1f1eb","unicode_alt":"","code_decimal":"🇹🇫","name":"french southern territories","shortname":":flag_tf:","category":"flags","emoji_order":"2409","aliases":[":tf:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_tg":{"unicode":"1f1f9-1f1ec","unicode_alt":"","code_decimal":"🇹🇬","name":"togo","shortname":":flag_tg:","category":"flags","emoji_order":"2410","aliases":[":tg:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_th":{"unicode":"1f1f9-1f1ed","unicode_alt":"","code_decimal":"🇹🇭","name":"thailand","shortname":":flag_th:","category":"flags","emoji_order":"2411","aliases":[":th:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_tj":{"unicode":"1f1f9-1f1ef","unicode_alt":"","code_decimal":"🇹🇯","name":"tajikistan","shortname":":flag_tj:","category":"flags","emoji_order":"2412","aliases":[":tj:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_tk":{"unicode":"1f1f9-1f1f0","unicode_alt":"","code_decimal":"🇹🇰","name":"tokelau","shortname":":flag_tk:","category":"flags","emoji_order":"2413","aliases":[":tk:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_tl":{"unicode":"1f1f9-1f1f1","unicode_alt":"","code_decimal":"🇹🇱","name":"timor-leste","shortname":":flag_tl:","category":"flags","emoji_order":"2414","aliases":[":tl:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_tm":{"unicode":"1f1f9-1f1f2","unicode_alt":"","code_decimal":"🇹🇲","name":"turkmenistan","shortname":":flag_tm:","category":"flags","emoji_order":"2415","aliases":[":turkmenistan:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_tn":{"unicode":"1f1f9-1f1f3","unicode_alt":"","code_decimal":"🇹🇳","name":"tunisia","shortname":":flag_tn:","category":"flags","emoji_order":"2416","aliases":[":tn:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_to":{"unicode":"1f1f9-1f1f4","unicode_alt":"","code_decimal":"🇹🇴","name":"tonga","shortname":":flag_to:","category":"flags","emoji_order":"2417","aliases":[":to:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_tr":{"unicode":"1f1f9-1f1f7","unicode_alt":"","code_decimal":"🇹🇷","name":"turkey","shortname":":flag_tr:","category":"flags","emoji_order":"2418","aliases":[":tr:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_tt":{"unicode":"1f1f9-1f1f9","unicode_alt":"","code_decimal":"🇹🇹","name":"trinidad and tobago","shortname":":flag_tt:","category":"flags","emoji_order":"2419","aliases":[":tt:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_tv":{"unicode":"1f1f9-1f1fb","unicode_alt":"","code_decimal":"🇹🇻","name":"tuvalu","shortname":":flag_tv:","category":"flags","emoji_order":"2420","aliases":[":tuvalu:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_tw":{"unicode":"1f1f9-1f1fc","unicode_alt":"","code_decimal":"🇹🇼","name":"the republic of china","shortname":":flag_tw:","category":"flags","emoji_order":"2421","aliases":[":tw:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_tz":{"unicode":"1f1f9-1f1ff","unicode_alt":"","code_decimal":"🇹🇿","name":"tanzania","shortname":":flag_tz:","category":"flags","emoji_order":"2422","aliases":[":tz:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ua":{"unicode":"1f1fa-1f1e6","unicode_alt":"","code_decimal":"🇺🇦","name":"ukraine","shortname":":flag_ua:","category":"flags","emoji_order":"2423","aliases":[":ua:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ug":{"unicode":"1f1fa-1f1ec","unicode_alt":"","code_decimal":"🇺🇬","name":"uganda","shortname":":flag_ug:","category":"flags","emoji_order":"2424","aliases":[":ug:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_um":{"unicode":"1f1fa-1f1f2","unicode_alt":"","code_decimal":"🇺🇲","name":"united states minor outlying islands","shortname":":flag_um:","category":"flags","emoji_order":"2425","aliases":[":um:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_us":{"unicode":"1f1fa-1f1f8","unicode_alt":"","code_decimal":"🇺🇸","name":"united states","shortname":":flag_us:","category":"flags","emoji_order":"2427","aliases":[":us:"],"aliases_ascii":[],"keywords":["america","country","flag"]},"flag_uy":{"unicode":"1f1fa-1f1fe","unicode_alt":"","code_decimal":"🇺🇾","name":"uruguay","shortname":":flag_uy:","category":"flags","emoji_order":"2428","aliases":[":uy:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_uz":{"unicode":"1f1fa-1f1ff","unicode_alt":"","code_decimal":"🇺🇿","name":"uzbekistan","shortname":":flag_uz:","category":"flags","emoji_order":"2429","aliases":[":uz:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_va":{"unicode":"1f1fb-1f1e6","unicode_alt":"","code_decimal":"🇻🇦","name":"the vatican city","shortname":":flag_va:","category":"flags","emoji_order":"2430","aliases":[":va:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_vc":{"unicode":"1f1fb-1f1e8","unicode_alt":"","code_decimal":"🇻🇨","name":"saint vincent and the grenadines","shortname":":flag_vc:","category":"flags","emoji_order":"2431","aliases":[":vc:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ve":{"unicode":"1f1fb-1f1ea","unicode_alt":"","code_decimal":"🇻🇪","name":"venezuela","shortname":":flag_ve:","category":"flags","emoji_order":"2432","aliases":[":ve:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_vg":{"unicode":"1f1fb-1f1ec","unicode_alt":"","code_decimal":"🇻🇬","name":"british virgin islands","shortname":":flag_vg:","category":"flags","emoji_order":"2433","aliases":[":vg:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_vi":{"unicode":"1f1fb-1f1ee","unicode_alt":"","code_decimal":"🇻🇮","name":"u.s. virgin islands","shortname":":flag_vi:","category":"flags","emoji_order":"2434","aliases":[":vi:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_vn":{"unicode":"1f1fb-1f1f3","unicode_alt":"","code_decimal":"🇻🇳","name":"vietnam","shortname":":flag_vn:","category":"flags","emoji_order":"2435","aliases":[":vn:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_vu":{"unicode":"1f1fb-1f1fa","unicode_alt":"","code_decimal":"🇻🇺","name":"vanuatu","shortname":":flag_vu:","category":"flags","emoji_order":"2436","aliases":[":vu:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_wf":{"unicode":"1f1fc-1f1eb","unicode_alt":"","code_decimal":"🇼🇫","name":"wallis and futuna","shortname":":flag_wf:","category":"flags","emoji_order":"2437","aliases":[":wf:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ws":{"unicode":"1f1fc-1f1f8","unicode_alt":"","code_decimal":"🇼🇸","name":"samoa","shortname":":flag_ws:","category":"flags","emoji_order":"2438","aliases":[":ws:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_xk":{"unicode":"1f1fd-1f1f0","unicode_alt":"","code_decimal":"🇽🇰","name":"kosovo","shortname":":flag_xk:","category":"flags","emoji_order":"2439","aliases":[":xk:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_ye":{"unicode":"1f1fe-1f1ea","unicode_alt":"","code_decimal":"🇾🇪","name":"yemen","shortname":":flag_ye:","category":"flags","emoji_order":"2440","aliases":[":ye:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_yt":{"unicode":"1f1fe-1f1f9","unicode_alt":"","code_decimal":"🇾🇹","name":"mayotte","shortname":":flag_yt:","category":"flags","emoji_order":"2441","aliases":[":yt:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_za":{"unicode":"1f1ff-1f1e6","unicode_alt":"","code_decimal":"🇿🇦","name":"south africa","shortname":":flag_za:","category":"flags","emoji_order":"2442","aliases":[":za:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_zm":{"unicode":"1f1ff-1f1f2","unicode_alt":"","code_decimal":"🇿🇲","name":"zambia","shortname":":flag_zm:","category":"flags","emoji_order":"2443","aliases":[":zm:"],"aliases_ascii":[],"keywords":["country","flag"]},"flag_zw":{"unicode":"1f1ff-1f1fc","unicode_alt":"","code_decimal":"🇿🇼","name":"zimbabwe","shortname":":flag_zw:","category":"flags","emoji_order":"2444","aliases":[":zw:"],"aliases_ascii":[],"keywords":["country","flag"]},"regional_indicator_z":{"unicode":"1f1ff","unicode_alt":"","code_decimal":"🇿","name":"regional indicator symbol letter z","shortname":":regional_indicator_z:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_y":{"unicode":"1f1fe","unicode_alt":"","code_decimal":"🇾","name":"regional indicator symbol letter y","shortname":":regional_indicator_y:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_x":{"unicode":"1f1fd","unicode_alt":"","code_decimal":"🇽","name":"regional indicator symbol letter x","shortname":":regional_indicator_x:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_w":{"unicode":"1f1fc","unicode_alt":"","code_decimal":"🇼","name":"regional indicator symbol letter w","shortname":":regional_indicator_w:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_v":{"unicode":"1f1fb","unicode_alt":"","code_decimal":"🇻","name":"regional indicator symbol letter v","shortname":":regional_indicator_v:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_u":{"unicode":"1f1fa","unicode_alt":"","code_decimal":"🇺","name":"regional indicator symbol letter u","shortname":":regional_indicator_u:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_t":{"unicode":"1f1f9","unicode_alt":"","code_decimal":"🇹","name":"regional indicator symbol letter t","shortname":":regional_indicator_t:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_s":{"unicode":"1f1f8","unicode_alt":"","code_decimal":"🇸","name":"regional indicator symbol letter s","shortname":":regional_indicator_s:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_r":{"unicode":"1f1f7","unicode_alt":"","code_decimal":"🇷","name":"regional indicator symbol letter r","shortname":":regional_indicator_r:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_q":{"unicode":"1f1f6","unicode_alt":"","code_decimal":"🇶","name":"regional indicator symbol letter q","shortname":":regional_indicator_q:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_p":{"unicode":"1f1f5","unicode_alt":"","code_decimal":"🇵","name":"regional indicator symbol letter p","shortname":":regional_indicator_p:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_o":{"unicode":"1f1f4","unicode_alt":"","code_decimal":"🇴","name":"regional indicator symbol letter o","shortname":":regional_indicator_o:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_n":{"unicode":"1f1f3","unicode_alt":"","code_decimal":"🇳","name":"regional indicator symbol letter n","shortname":":regional_indicator_n:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_m":{"unicode":"1f1f2","unicode_alt":"","code_decimal":"🇲","name":"regional indicator symbol letter m","shortname":":regional_indicator_m:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_l":{"unicode":"1f1f1","unicode_alt":"","code_decimal":"🇱","name":"regional indicator symbol letter l","shortname":":regional_indicator_l:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_k":{"unicode":"1f1f0","unicode_alt":"","code_decimal":"🇰","name":"regional indicator symbol letter k","shortname":":regional_indicator_k:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_j":{"unicode":"1f1ef","unicode_alt":"","code_decimal":"🇯","name":"regional indicator symbol letter j","shortname":":regional_indicator_j:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_i":{"unicode":"1f1ee","unicode_alt":"","code_decimal":"🇮","name":"regional indicator symbol letter i","shortname":":regional_indicator_i:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_h":{"unicode":"1f1ed","unicode_alt":"","code_decimal":"🇭","name":"regional indicator symbol letter h","shortname":":regional_indicator_h:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_g":{"unicode":"1f1ec","unicode_alt":"","code_decimal":"🇬","name":"regional indicator symbol letter g","shortname":":regional_indicator_g:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_f":{"unicode":"1f1eb","unicode_alt":"","code_decimal":"🇫","name":"regional indicator symbol letter f","shortname":":regional_indicator_f:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_e":{"unicode":"1f1ea","unicode_alt":"","code_decimal":"🇪","name":"regional indicator symbol letter e","shortname":":regional_indicator_e:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_d":{"unicode":"1f1e9","unicode_alt":"","code_decimal":"🇩","name":"regional indicator symbol letter d","shortname":":regional_indicator_d:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_c":{"unicode":"1f1e8","unicode_alt":"","code_decimal":"🇨","name":"regional indicator symbol letter c","shortname":":regional_indicator_c:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_b":{"unicode":"1f1e7","unicode_alt":"","code_decimal":"🇧","name":"regional indicator symbol letter b","shortname":":regional_indicator_b:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]},"regional_indicator_a":{"unicode":"1f1e6","unicode_alt":"","code_decimal":"🇦","name":"regional indicator symbol letter a","shortname":":regional_indicator_a:","category":"regional","emoji_order":"12345","aliases":[],"aliases_ascii":[],"keywords":[]}}
\ No newline at end of file
diff --git a/lib/mastodon/unique_retry_job_middleware.rb b/lib/mastodon/unique_retry_job_middleware.rb
deleted file mode 100644
index 75da8a0c94..0000000000
--- a/lib/mastodon/unique_retry_job_middleware.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class Mastodon::UniqueRetryJobMiddleware
- def call(_worker_class, item, _queue, _redis_pool)
- return if item['unique_retry'] && retried?(item)
- yield
- end
-
- private
-
- def retried?(item)
- # Use unique digest key of SidekiqUniqueJobs
- unique_key = SidekiqUniqueJobs::UNIQUE_DIGEST_KEY
- unique_digest = item[unique_key]
- class_name = item['class']
- retries = Sidekiq::RetrySet.new
-
- retries.any? { |job| job.item['class'] == class_name && job.item[unique_key] == unique_digest }
- end
-end
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index b6fdb10c67..8b692c29da 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -13,7 +13,7 @@ module Mastodon
end
def patch
- 0
+ 1
end
def pre
diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake
new file mode 100644
index 0000000000..44896afc7b
--- /dev/null
+++ b/lib/tasks/assets.rake
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+def render_static_page(action, dest:, **opts)
+ I18n.with_locale(ENV['DEFAULT_LOCALE'] || I18n.default_locale) do
+ html = ApplicationController.render(action, opts)
+ File.write(dest, html)
+ end
+end
+
+namespace :assets do
+ desc 'Generate static pages'
+ task :generate_static_pages do
+ render_static_page 'errors/500', layout: 'error', dest: Rails.root.join('public', '500.html')
+ end
+end
+
+if Rake::Task.task_defined?('assets:precompile')
+ Rake::Task['assets:precompile'].enhance do
+ Webpacker.manifest.refresh
+ Rake::Task['assets:generate_static_pages'].invoke
+ end
+end
diff --git a/lib/tasks/emojis.rake b/lib/tasks/emojis.rake
new file mode 100644
index 0000000000..cd5e30e968
--- /dev/null
+++ b/lib/tasks/emojis.rake
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+def codepoints_to_filename(codepoints)
+ codepoints.downcase.gsub(/\A[0]+/, '').tr(' ', '-')
+end
+
+def codepoints_to_unicode(codepoints)
+ if codepoints.include?(' ')
+ codepoints.split(' ').map(&:hex).pack('U*')
+ else
+ [codepoints.hex].pack('U')
+ end
+end
+
+namespace :emojis do
+ desc 'Generate a unicode to filename mapping'
+ task :generate do
+ source = 'http://www.unicode.org/Public/emoji/5.0/emoji-test.txt'
+ codes = []
+ dest = Rails.root.join('app', 'javascript', 'mastodon', 'emoji_map.json')
+
+ puts "Downloading emojos from source... (#{source})"
+
+ HTTP.get(source).to_s.split("\n").each do |line|
+ next if line.start_with? '#'
+ parts = line.split(';').map(&:strip)
+ next if parts.size < 2
+ codes << [parts[0], parts[1].start_with?('fully-qualified')]
+ end
+
+ grouped_codes = codes.reduce([]) do |agg, current|
+ if current[1]
+ agg << [current[0]]
+ else
+ agg.last << current[0]
+ agg
+ end
+ end
+
+ existence_maps = grouped_codes.map { |c| c.map { |cc| [cc, File.exist?(Rails.root.join('public', 'emoji', codepoints_to_filename(cc) + '.svg'))] }.to_h }
+ map = {}
+
+ existence_maps.each do |group|
+ existing_one = group.key(true)
+
+ group.each_key do |key|
+ map[codepoints_to_unicode(key)] = codepoints_to_filename(existing_one)
+ end
+ end
+
+ map = map.sort { |a, b| a[0].size <=> b[0].size }.to_h
+
+ File.write(dest, Oj.dump(map))
+ puts "Wrote emojo to destination! (#{dest})"
+ end
+end
diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake
index 3c65ece4be..5614ddf48f 100644
--- a/lib/tasks/mastodon.rake
+++ b/lib/tasks/mastodon.rake
@@ -83,16 +83,15 @@ namespace :mastodon do
MediaAttachment.where.not(remote_url: '').where('created_at < ?', time_ago).find_each do |media|
media.file.destroy
- media.type = :unknown
media.save
end
end
desc 'Set unknown attachment type for remote-only attachments'
task set_unknown: :environment do
- Rails.logger.debug 'Setting unknown attachment type for remote-only attachments...'
+ puts 'Setting unknown attachment type for remote-only attachments...'
MediaAttachment.where(file_file_name: nil).where.not(type: :unknown).in_batches.update_all(type: :unknown)
- Rails.logger.debug 'Done!'
+ puts 'Done!'
end
desc 'Redownload avatars/headers of remote users. Optionally limit to a particular domain with DOMAIN'
@@ -188,24 +187,24 @@ namespace :mastodon do
namespace :maintenance do
desc 'Update counter caches'
task update_counter_caches: :environment do
- Rails.logger.debug 'Updating counter caches for accounts...'
+ puts 'Updating counter caches for accounts...'
- Account.unscoped.select('id').find_in_batches do |batch|
+ Account.unscoped.where.not(protocol: :activitypub).select('id').find_in_batches do |batch|
Account.where(id: batch.map(&:id)).update_all('statuses_count = (select count(*) from statuses where account_id = accounts.id), followers_count = (select count(*) from follows where target_account_id = accounts.id), following_count = (select count(*) from follows where account_id = accounts.id)')
end
- Rails.logger.debug 'Updating counter caches for statuses...'
+ puts 'Updating counter caches for statuses...'
Status.unscoped.select('id').find_in_batches do |batch|
Status.where(id: batch.map(&:id)).update_all('favourites_count = (select count(*) from favourites where favourites.status_id = statuses.id), reblogs_count = (select count(*) from statuses as reblogs where reblogs.reblog_of_id = statuses.id)')
end
- Rails.logger.debug 'Done!'
+ puts 'Done!'
end
desc 'Generate static versions of GIF avatars/headers'
task add_static_avatars: :environment do
- Rails.logger.debug 'Generating static avatars/headers for GIF ones...'
+ puts 'Generating static avatars/headers for GIF ones...'
Account.unscoped.where(avatar_content_type: 'image/gif').or(Account.unscoped.where(header_content_type: 'image/gif')).find_each do |account|
begin
@@ -217,7 +216,7 @@ namespace :mastodon do
end
end
- Rails.logger.debug 'Done!'
+ puts 'Done!'
end
desc 'Ensure referencial integrity'
diff --git a/package.json b/package.json
index 228dd1f257..7835a04408 100644
--- a/package.json
+++ b/package.json
@@ -45,6 +45,7 @@
"css-loader": "^0.28.4",
"detect-passive-events": "^1.0.2",
"dotenv": "^4.0.0",
+ "emoji-mart": "^1.0.1",
"emojione": "^2.2.7",
"emojione-picker": "^2.2.1",
"es6-symbol": "^3.1.1",
@@ -88,11 +89,13 @@
"react-intl": "^2.4.0",
"react-motion": "^0.5.0",
"react-notification": "^6.7.1",
+ "react-overlays": "^0.8.1",
"react-redux": "^5.0.4",
"react-redux-loading-bar": "^2.9.2",
"react-router-dom": "^4.1.1",
"react-router-scroll": "ytase/react-router-scroll#build",
"react-simple-dropdown": "^3.0.0",
+ "react-sizeme": "^2.3.5",
"react-swipeable-views": "^0.12.3",
"react-textarea-autosize": "^5.0.7",
"react-toggle": "^4.0.1",
diff --git a/public/500.html b/public/500.html
index 5812bb476b..e69de29bb2 100644
--- a/public/500.html
+++ b/public/500.html
@@ -1,43 +0,0 @@
-
-
-
-
- We're sorry, but something went wrong
-
-
-
-
-
-
-
-
-
-
-
We're sorry, but something went wrong.
-
-
-
-
diff --git a/public/emoji/0023-20e3.png b/public/emoji/0023-20e3.png
deleted file mode 100644
index 6e26f0070b..0000000000
Binary files a/public/emoji/0023-20e3.png and /dev/null differ
diff --git a/public/emoji/0023-20e3.svg b/public/emoji/0023-20e3.svg
deleted file mode 100644
index a29d90113c..0000000000
--- a/public/emoji/0023-20e3.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0023.png b/public/emoji/0023.png
deleted file mode 100644
index 811f22af83..0000000000
Binary files a/public/emoji/0023.png and /dev/null differ
diff --git a/public/emoji/0023.svg b/public/emoji/0023.svg
deleted file mode 100644
index 76c606dd03..0000000000
--- a/public/emoji/0023.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/002a-20e3.png b/public/emoji/002a-20e3.png
deleted file mode 100644
index 2f8e511380..0000000000
Binary files a/public/emoji/002a-20e3.png and /dev/null differ
diff --git a/public/emoji/002a-20e3.svg b/public/emoji/002a-20e3.svg
deleted file mode 100644
index bc3b2e6eb9..0000000000
--- a/public/emoji/002a-20e3.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/002a.png b/public/emoji/002a.png
deleted file mode 100644
index c39443e24a..0000000000
Binary files a/public/emoji/002a.png and /dev/null differ
diff --git a/public/emoji/002a.svg b/public/emoji/002a.svg
deleted file mode 100644
index 2584149042..0000000000
--- a/public/emoji/002a.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0030-20e3.png b/public/emoji/0030-20e3.png
deleted file mode 100644
index 13aca83e01..0000000000
Binary files a/public/emoji/0030-20e3.png and /dev/null differ
diff --git a/public/emoji/0030-20e3.svg b/public/emoji/0030-20e3.svg
deleted file mode 100644
index 57dc889092..0000000000
--- a/public/emoji/0030-20e3.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0030.png b/public/emoji/0030.png
deleted file mode 100644
index e730b28dfe..0000000000
Binary files a/public/emoji/0030.png and /dev/null differ
diff --git a/public/emoji/0030.svg b/public/emoji/0030.svg
deleted file mode 100644
index 8ea076ce9c..0000000000
--- a/public/emoji/0030.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0031-20e3.png b/public/emoji/0031-20e3.png
deleted file mode 100644
index e6d84b8012..0000000000
Binary files a/public/emoji/0031-20e3.png and /dev/null differ
diff --git a/public/emoji/0031-20e3.svg b/public/emoji/0031-20e3.svg
deleted file mode 100644
index e18178a177..0000000000
--- a/public/emoji/0031-20e3.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0031.png b/public/emoji/0031.png
deleted file mode 100644
index 9c4cbd6f7f..0000000000
Binary files a/public/emoji/0031.png and /dev/null differ
diff --git a/public/emoji/0031.svg b/public/emoji/0031.svg
deleted file mode 100644
index c0ca63e68d..0000000000
--- a/public/emoji/0031.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0032-20e3.png b/public/emoji/0032-20e3.png
deleted file mode 100644
index 927339c9bf..0000000000
Binary files a/public/emoji/0032-20e3.png and /dev/null differ
diff --git a/public/emoji/0032-20e3.svg b/public/emoji/0032-20e3.svg
deleted file mode 100644
index c2eb5bd504..0000000000
--- a/public/emoji/0032-20e3.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0032.png b/public/emoji/0032.png
deleted file mode 100644
index 9a0b49a0e0..0000000000
Binary files a/public/emoji/0032.png and /dev/null differ
diff --git a/public/emoji/0032.svg b/public/emoji/0032.svg
deleted file mode 100644
index abd01370ae..0000000000
--- a/public/emoji/0032.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0033-20e3.png b/public/emoji/0033-20e3.png
deleted file mode 100644
index dbaa6183e7..0000000000
Binary files a/public/emoji/0033-20e3.png and /dev/null differ
diff --git a/public/emoji/0033-20e3.svg b/public/emoji/0033-20e3.svg
deleted file mode 100644
index 2952760137..0000000000
--- a/public/emoji/0033-20e3.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0033.png b/public/emoji/0033.png
deleted file mode 100644
index bc898b986e..0000000000
Binary files a/public/emoji/0033.png and /dev/null differ
diff --git a/public/emoji/0033.svg b/public/emoji/0033.svg
deleted file mode 100644
index 3136230ffd..0000000000
--- a/public/emoji/0033.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0034-20e3.png b/public/emoji/0034-20e3.png
deleted file mode 100644
index b0e914aac4..0000000000
Binary files a/public/emoji/0034-20e3.png and /dev/null differ
diff --git a/public/emoji/0034-20e3.svg b/public/emoji/0034-20e3.svg
deleted file mode 100644
index f530a75424..0000000000
--- a/public/emoji/0034-20e3.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0034.png b/public/emoji/0034.png
deleted file mode 100644
index 7216ee32bd..0000000000
Binary files a/public/emoji/0034.png and /dev/null differ
diff --git a/public/emoji/0034.svg b/public/emoji/0034.svg
deleted file mode 100644
index 1722ee9586..0000000000
--- a/public/emoji/0034.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0035-20e3.png b/public/emoji/0035-20e3.png
deleted file mode 100644
index d14371f3f2..0000000000
Binary files a/public/emoji/0035-20e3.png and /dev/null differ
diff --git a/public/emoji/0035-20e3.svg b/public/emoji/0035-20e3.svg
deleted file mode 100644
index dc4e1d81a5..0000000000
--- a/public/emoji/0035-20e3.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0035.png b/public/emoji/0035.png
deleted file mode 100644
index c64709a7e7..0000000000
Binary files a/public/emoji/0035.png and /dev/null differ
diff --git a/public/emoji/0035.svg b/public/emoji/0035.svg
deleted file mode 100644
index 3e7717f08b..0000000000
--- a/public/emoji/0035.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0036-20e3.png b/public/emoji/0036-20e3.png
deleted file mode 100644
index 371b3acef2..0000000000
Binary files a/public/emoji/0036-20e3.png and /dev/null differ
diff --git a/public/emoji/0036-20e3.svg b/public/emoji/0036-20e3.svg
deleted file mode 100644
index 9ce3a594fe..0000000000
--- a/public/emoji/0036-20e3.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0036.png b/public/emoji/0036.png
deleted file mode 100644
index 68e1e71e4b..0000000000
Binary files a/public/emoji/0036.png and /dev/null differ
diff --git a/public/emoji/0036.svg b/public/emoji/0036.svg
deleted file mode 100644
index 2ff6d93906..0000000000
--- a/public/emoji/0036.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0037-20e3.png b/public/emoji/0037-20e3.png
deleted file mode 100644
index 9b3476ae7c..0000000000
Binary files a/public/emoji/0037-20e3.png and /dev/null differ
diff --git a/public/emoji/0037-20e3.svg b/public/emoji/0037-20e3.svg
deleted file mode 100644
index 1f01b9db89..0000000000
--- a/public/emoji/0037-20e3.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0037.png b/public/emoji/0037.png
deleted file mode 100644
index e4aa065c62..0000000000
Binary files a/public/emoji/0037.png and /dev/null differ
diff --git a/public/emoji/0037.svg b/public/emoji/0037.svg
deleted file mode 100644
index 6079e49306..0000000000
--- a/public/emoji/0037.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0038-20e3.png b/public/emoji/0038-20e3.png
deleted file mode 100644
index 8c95874d4c..0000000000
Binary files a/public/emoji/0038-20e3.png and /dev/null differ
diff --git a/public/emoji/0038-20e3.svg b/public/emoji/0038-20e3.svg
deleted file mode 100644
index b6ed90a32c..0000000000
--- a/public/emoji/0038-20e3.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0038.png b/public/emoji/0038.png
deleted file mode 100644
index 27eae28e69..0000000000
Binary files a/public/emoji/0038.png and /dev/null differ
diff --git a/public/emoji/0038.svg b/public/emoji/0038.svg
deleted file mode 100644
index 014bf26318..0000000000
--- a/public/emoji/0038.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0039-20e3.png b/public/emoji/0039-20e3.png
deleted file mode 100644
index 9fce3d1eca..0000000000
Binary files a/public/emoji/0039-20e3.png and /dev/null differ
diff --git a/public/emoji/0039-20e3.svg b/public/emoji/0039-20e3.svg
deleted file mode 100644
index c883419705..0000000000
--- a/public/emoji/0039-20e3.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/0039.png b/public/emoji/0039.png
deleted file mode 100644
index fd9e980552..0000000000
Binary files a/public/emoji/0039.png and /dev/null differ
diff --git a/public/emoji/0039.svg b/public/emoji/0039.svg
deleted file mode 100644
index afda6d7b6d..0000000000
--- a/public/emoji/0039.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/00a9.png b/public/emoji/00a9.png
deleted file mode 100644
index 6b9a6adbfd..0000000000
Binary files a/public/emoji/00a9.png and /dev/null differ
diff --git a/public/emoji/00a9.svg b/public/emoji/00a9.svg
deleted file mode 100644
index 68a7702274..0000000000
--- a/public/emoji/00a9.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/00ae.png b/public/emoji/00ae.png
deleted file mode 100644
index 53ef9f2d4e..0000000000
Binary files a/public/emoji/00ae.png and /dev/null differ
diff --git a/public/emoji/00ae.svg b/public/emoji/00ae.svg
deleted file mode 100644
index 8b084f6bf6..0000000000
--- a/public/emoji/00ae.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f004.png b/public/emoji/1f004.png
deleted file mode 100644
index 66fd32025b..0000000000
Binary files a/public/emoji/1f004.png and /dev/null differ
diff --git a/public/emoji/1f004.svg b/public/emoji/1f004.svg
index 45867fb5a2..f6f39e4338 100644
--- a/public/emoji/1f004.svg
+++ b/public/emoji/1f004.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f0cf.png b/public/emoji/1f0cf.png
deleted file mode 100644
index 3d0924b68a..0000000000
Binary files a/public/emoji/1f0cf.png and /dev/null differ
diff --git a/public/emoji/1f0cf.svg b/public/emoji/1f0cf.svg
index 45ae8abccd..ae95b99541 100644
--- a/public/emoji/1f0cf.svg
+++ b/public/emoji/1f0cf.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f170.png b/public/emoji/1f170.png
deleted file mode 100644
index 8603ff05a1..0000000000
Binary files a/public/emoji/1f170.png and /dev/null differ
diff --git a/public/emoji/1f170.svg b/public/emoji/1f170.svg
index a2ed41f334..c9fc32b717 100644
--- a/public/emoji/1f170.svg
+++ b/public/emoji/1f170.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f171.png b/public/emoji/1f171.png
deleted file mode 100644
index 25875bc6a1..0000000000
Binary files a/public/emoji/1f171.png and /dev/null differ
diff --git a/public/emoji/1f171.svg b/public/emoji/1f171.svg
index d0f8e64940..f7251222d1 100644
--- a/public/emoji/1f171.svg
+++ b/public/emoji/1f171.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f17e.png b/public/emoji/1f17e.png
deleted file mode 100644
index 73278ba194..0000000000
Binary files a/public/emoji/1f17e.png and /dev/null differ
diff --git a/public/emoji/1f17e.svg b/public/emoji/1f17e.svg
index 8844efa531..96c14b4c39 100644
--- a/public/emoji/1f17e.svg
+++ b/public/emoji/1f17e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f17f.png b/public/emoji/1f17f.png
deleted file mode 100644
index 7be7dac27e..0000000000
Binary files a/public/emoji/1f17f.png and /dev/null differ
diff --git a/public/emoji/1f17f.svg b/public/emoji/1f17f.svg
index 5d85644448..33db94984a 100644
--- a/public/emoji/1f17f.svg
+++ b/public/emoji/1f17f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f18e.png b/public/emoji/1f18e.png
deleted file mode 100644
index d9f2d17dea..0000000000
Binary files a/public/emoji/1f18e.png and /dev/null differ
diff --git a/public/emoji/1f18e.svg b/public/emoji/1f18e.svg
index 6c5e8866f9..207d4cf090 100644
--- a/public/emoji/1f18e.svg
+++ b/public/emoji/1f18e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f191.png b/public/emoji/1f191.png
deleted file mode 100644
index 8b01b4343e..0000000000
Binary files a/public/emoji/1f191.png and /dev/null differ
diff --git a/public/emoji/1f191.svg b/public/emoji/1f191.svg
index ef2cbf8962..7334171fdf 100644
--- a/public/emoji/1f191.svg
+++ b/public/emoji/1f191.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f192.png b/public/emoji/1f192.png
deleted file mode 100644
index 74674978d0..0000000000
Binary files a/public/emoji/1f192.png and /dev/null differ
diff --git a/public/emoji/1f192.svg b/public/emoji/1f192.svg
index 4bcdb3b914..86fd7df12b 100644
--- a/public/emoji/1f192.svg
+++ b/public/emoji/1f192.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f193.png b/public/emoji/1f193.png
deleted file mode 100644
index b71956eb48..0000000000
Binary files a/public/emoji/1f193.png and /dev/null differ
diff --git a/public/emoji/1f193.svg b/public/emoji/1f193.svg
index d26b8c27c0..72a80ae583 100644
--- a/public/emoji/1f193.svg
+++ b/public/emoji/1f193.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f194.png b/public/emoji/1f194.png
deleted file mode 100644
index 5bf69bf7ba..0000000000
Binary files a/public/emoji/1f194.png and /dev/null differ
diff --git a/public/emoji/1f194.svg b/public/emoji/1f194.svg
index 0c36d517b7..9d72b800c9 100644
--- a/public/emoji/1f194.svg
+++ b/public/emoji/1f194.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f195.png b/public/emoji/1f195.png
deleted file mode 100644
index b4f85488d1..0000000000
Binary files a/public/emoji/1f195.png and /dev/null differ
diff --git a/public/emoji/1f195.svg b/public/emoji/1f195.svg
index ad6466f5e5..22dad4cf84 100644
--- a/public/emoji/1f195.svg
+++ b/public/emoji/1f195.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f196.png b/public/emoji/1f196.png
deleted file mode 100644
index ee8d20f5eb..0000000000
Binary files a/public/emoji/1f196.png and /dev/null differ
diff --git a/public/emoji/1f196.svg b/public/emoji/1f196.svg
index fe38c95a46..50bf800347 100644
--- a/public/emoji/1f196.svg
+++ b/public/emoji/1f196.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f197.png b/public/emoji/1f197.png
deleted file mode 100644
index d0d775532f..0000000000
Binary files a/public/emoji/1f197.png and /dev/null differ
diff --git a/public/emoji/1f197.svg b/public/emoji/1f197.svg
index c45e4e1c9b..9f43d676fe 100644
--- a/public/emoji/1f197.svg
+++ b/public/emoji/1f197.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f198.png b/public/emoji/1f198.png
deleted file mode 100644
index d7d8c9953e..0000000000
Binary files a/public/emoji/1f198.png and /dev/null differ
diff --git a/public/emoji/1f198.svg b/public/emoji/1f198.svg
index fef773a90c..36cf601170 100644
--- a/public/emoji/1f198.svg
+++ b/public/emoji/1f198.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f199.png b/public/emoji/1f199.png
deleted file mode 100644
index 0d42142ba0..0000000000
Binary files a/public/emoji/1f199.png and /dev/null differ
diff --git a/public/emoji/1f199.svg b/public/emoji/1f199.svg
index f5bc638ac5..1f2d8e60af 100644
--- a/public/emoji/1f199.svg
+++ b/public/emoji/1f199.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f19a.png b/public/emoji/1f19a.png
deleted file mode 100644
index e1180f4a46..0000000000
Binary files a/public/emoji/1f19a.png and /dev/null differ
diff --git a/public/emoji/1f19a.svg b/public/emoji/1f19a.svg
index 6d2545d60d..af8f685dcc 100644
--- a/public/emoji/1f19a.svg
+++ b/public/emoji/1f19a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1e8.png b/public/emoji/1f1e6-1f1e8.png
deleted file mode 100644
index 286239920c..0000000000
Binary files a/public/emoji/1f1e6-1f1e8.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1e8.svg b/public/emoji/1f1e6-1f1e8.svg
index 23d7009995..588d4e8bfd 100644
--- a/public/emoji/1f1e6-1f1e8.svg
+++ b/public/emoji/1f1e6-1f1e8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1e9.png b/public/emoji/1f1e6-1f1e9.png
deleted file mode 100644
index 20f4b14e8a..0000000000
Binary files a/public/emoji/1f1e6-1f1e9.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1e9.svg b/public/emoji/1f1e6-1f1e9.svg
index 0340b9d6d0..e0e8608b88 100644
--- a/public/emoji/1f1e6-1f1e9.svg
+++ b/public/emoji/1f1e6-1f1e9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1ea.png b/public/emoji/1f1e6-1f1ea.png
deleted file mode 100644
index d16ffe4b86..0000000000
Binary files a/public/emoji/1f1e6-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1ea.svg b/public/emoji/1f1e6-1f1ea.svg
index 6610e894cd..571251753c 100644
--- a/public/emoji/1f1e6-1f1ea.svg
+++ b/public/emoji/1f1e6-1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1eb.png b/public/emoji/1f1e6-1f1eb.png
deleted file mode 100644
index a51533b554..0000000000
Binary files a/public/emoji/1f1e6-1f1eb.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1eb.svg b/public/emoji/1f1e6-1f1eb.svg
index e1998a6b2e..9e880f92e3 100644
--- a/public/emoji/1f1e6-1f1eb.svg
+++ b/public/emoji/1f1e6-1f1eb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1ec.png b/public/emoji/1f1e6-1f1ec.png
deleted file mode 100644
index 07f2ce397d..0000000000
Binary files a/public/emoji/1f1e6-1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1ec.svg b/public/emoji/1f1e6-1f1ec.svg
index 0bcf4ebdc0..10d53620ba 100644
--- a/public/emoji/1f1e6-1f1ec.svg
+++ b/public/emoji/1f1e6-1f1ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1ee.png b/public/emoji/1f1e6-1f1ee.png
deleted file mode 100644
index 500b5ab09f..0000000000
Binary files a/public/emoji/1f1e6-1f1ee.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1ee.svg b/public/emoji/1f1e6-1f1ee.svg
index c117d60875..cf17878e07 100644
--- a/public/emoji/1f1e6-1f1ee.svg
+++ b/public/emoji/1f1e6-1f1ee.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1f1.png b/public/emoji/1f1e6-1f1f1.png
deleted file mode 100644
index 03a20132cc..0000000000
Binary files a/public/emoji/1f1e6-1f1f1.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1f1.svg b/public/emoji/1f1e6-1f1f1.svg
index 62c373cb04..5de35c369b 100644
--- a/public/emoji/1f1e6-1f1f1.svg
+++ b/public/emoji/1f1e6-1f1f1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1f2.png b/public/emoji/1f1e6-1f1f2.png
deleted file mode 100644
index 2ad60a273e..0000000000
Binary files a/public/emoji/1f1e6-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1f2.svg b/public/emoji/1f1e6-1f1f2.svg
index 619935b02a..0b87990ccf 100644
--- a/public/emoji/1f1e6-1f1f2.svg
+++ b/public/emoji/1f1e6-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1f4.png b/public/emoji/1f1e6-1f1f4.png
deleted file mode 100644
index cb46c31f86..0000000000
Binary files a/public/emoji/1f1e6-1f1f4.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1f4.svg b/public/emoji/1f1e6-1f1f4.svg
index 7440d2d238..32692e12dd 100644
--- a/public/emoji/1f1e6-1f1f4.svg
+++ b/public/emoji/1f1e6-1f1f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1f6.png b/public/emoji/1f1e6-1f1f6.png
deleted file mode 100644
index b272021d37..0000000000
Binary files a/public/emoji/1f1e6-1f1f6.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1f6.svg b/public/emoji/1f1e6-1f1f6.svg
index 476eac8817..8f82509901 100644
--- a/public/emoji/1f1e6-1f1f6.svg
+++ b/public/emoji/1f1e6-1f1f6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1f7.png b/public/emoji/1f1e6-1f1f7.png
deleted file mode 100644
index 73136caf3b..0000000000
Binary files a/public/emoji/1f1e6-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1f7.svg b/public/emoji/1f1e6-1f1f7.svg
index 040ef76bb4..983c6df9dc 100644
--- a/public/emoji/1f1e6-1f1f7.svg
+++ b/public/emoji/1f1e6-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1f8.png b/public/emoji/1f1e6-1f1f8.png
deleted file mode 100644
index 3db45a0d9f..0000000000
Binary files a/public/emoji/1f1e6-1f1f8.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1f8.svg b/public/emoji/1f1e6-1f1f8.svg
index 158d0c6f41..d4334d65cd 100644
--- a/public/emoji/1f1e6-1f1f8.svg
+++ b/public/emoji/1f1e6-1f1f8.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1f9.png b/public/emoji/1f1e6-1f1f9.png
deleted file mode 100644
index c43769dcb1..0000000000
Binary files a/public/emoji/1f1e6-1f1f9.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1f9.svg b/public/emoji/1f1e6-1f1f9.svg
index 407ac40351..ea3c039e5f 100644
--- a/public/emoji/1f1e6-1f1f9.svg
+++ b/public/emoji/1f1e6-1f1f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1fa.png b/public/emoji/1f1e6-1f1fa.png
deleted file mode 100644
index 7794309c78..0000000000
Binary files a/public/emoji/1f1e6-1f1fa.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1fa.svg b/public/emoji/1f1e6-1f1fa.svg
index 48ab1dc09a..986705ff93 100644
--- a/public/emoji/1f1e6-1f1fa.svg
+++ b/public/emoji/1f1e6-1f1fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1fc.png b/public/emoji/1f1e6-1f1fc.png
deleted file mode 100644
index 02c840d12c..0000000000
Binary files a/public/emoji/1f1e6-1f1fc.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1fc.svg b/public/emoji/1f1e6-1f1fc.svg
index ab3f2d0574..3ec298915e 100644
--- a/public/emoji/1f1e6-1f1fc.svg
+++ b/public/emoji/1f1e6-1f1fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1fd.png b/public/emoji/1f1e6-1f1fd.png
deleted file mode 100644
index fc5466174b..0000000000
Binary files a/public/emoji/1f1e6-1f1fd.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1fd.svg b/public/emoji/1f1e6-1f1fd.svg
index 81ab225514..939ea37c7e 100644
--- a/public/emoji/1f1e6-1f1fd.svg
+++ b/public/emoji/1f1e6-1f1fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6-1f1ff.png b/public/emoji/1f1e6-1f1ff.png
deleted file mode 100644
index 89d3d15fd9..0000000000
Binary files a/public/emoji/1f1e6-1f1ff.png and /dev/null differ
diff --git a/public/emoji/1f1e6-1f1ff.svg b/public/emoji/1f1e6-1f1ff.svg
index 4ac419fbcf..d05dffbc2a 100644
--- a/public/emoji/1f1e6-1f1ff.svg
+++ b/public/emoji/1f1e6-1f1ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e6.png b/public/emoji/1f1e6.png
deleted file mode 100644
index 2b6c439561..0000000000
Binary files a/public/emoji/1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1e6.svg b/public/emoji/1f1e6.svg
index 5670a81a09..845aea33b6 100644
--- a/public/emoji/1f1e6.svg
+++ b/public/emoji/1f1e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1e6.png b/public/emoji/1f1e7-1f1e6.png
deleted file mode 100644
index 25fe407e13..0000000000
Binary files a/public/emoji/1f1e7-1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1e6.svg b/public/emoji/1f1e7-1f1e6.svg
index 9c14bd4b67..e30dd2cb30 100644
--- a/public/emoji/1f1e7-1f1e6.svg
+++ b/public/emoji/1f1e7-1f1e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1e7.png b/public/emoji/1f1e7-1f1e7.png
deleted file mode 100644
index bccd8c5c9b..0000000000
Binary files a/public/emoji/1f1e7-1f1e7.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1e7.svg b/public/emoji/1f1e7-1f1e7.svg
index 6bf8ae2cdd..2eeb182555 100644
--- a/public/emoji/1f1e7-1f1e7.svg
+++ b/public/emoji/1f1e7-1f1e7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1e9.png b/public/emoji/1f1e7-1f1e9.png
deleted file mode 100644
index b0597a3149..0000000000
Binary files a/public/emoji/1f1e7-1f1e9.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1e9.svg b/public/emoji/1f1e7-1f1e9.svg
index e2713372a6..5d16a3f3a1 100644
--- a/public/emoji/1f1e7-1f1e9.svg
+++ b/public/emoji/1f1e7-1f1e9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1ea.png b/public/emoji/1f1e7-1f1ea.png
deleted file mode 100644
index 551f086e3c..0000000000
Binary files a/public/emoji/1f1e7-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1ea.svg b/public/emoji/1f1e7-1f1ea.svg
index 085c2cdb6d..18a9d1bb16 100644
--- a/public/emoji/1f1e7-1f1ea.svg
+++ b/public/emoji/1f1e7-1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1eb.png b/public/emoji/1f1e7-1f1eb.png
deleted file mode 100644
index 444d4829f9..0000000000
Binary files a/public/emoji/1f1e7-1f1eb.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1eb.svg b/public/emoji/1f1e7-1f1eb.svg
index eeb129a771..769b898c90 100644
--- a/public/emoji/1f1e7-1f1eb.svg
+++ b/public/emoji/1f1e7-1f1eb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1ec.png b/public/emoji/1f1e7-1f1ec.png
deleted file mode 100644
index 821eee5e17..0000000000
Binary files a/public/emoji/1f1e7-1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1ec.svg b/public/emoji/1f1e7-1f1ec.svg
index f6a6723c04..4caa980b1b 100644
--- a/public/emoji/1f1e7-1f1ec.svg
+++ b/public/emoji/1f1e7-1f1ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1ed.png b/public/emoji/1f1e7-1f1ed.png
deleted file mode 100644
index f33724249f..0000000000
Binary files a/public/emoji/1f1e7-1f1ed.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1ed.svg b/public/emoji/1f1e7-1f1ed.svg
index f708818b1f..8ee8c0818b 100644
--- a/public/emoji/1f1e7-1f1ed.svg
+++ b/public/emoji/1f1e7-1f1ed.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1ee.png b/public/emoji/1f1e7-1f1ee.png
deleted file mode 100644
index ea20ac9321..0000000000
Binary files a/public/emoji/1f1e7-1f1ee.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1ee.svg b/public/emoji/1f1e7-1f1ee.svg
index 7ea0077c0d..4b0122f058 100644
--- a/public/emoji/1f1e7-1f1ee.svg
+++ b/public/emoji/1f1e7-1f1ee.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1ef.png b/public/emoji/1f1e7-1f1ef.png
deleted file mode 100644
index 7cca4f8045..0000000000
Binary files a/public/emoji/1f1e7-1f1ef.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1ef.svg b/public/emoji/1f1e7-1f1ef.svg
index 0e99fb00dc..d3d3435ffd 100644
--- a/public/emoji/1f1e7-1f1ef.svg
+++ b/public/emoji/1f1e7-1f1ef.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1f1.png b/public/emoji/1f1e7-1f1f1.png
deleted file mode 100644
index 1082e78999..0000000000
Binary files a/public/emoji/1f1e7-1f1f1.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1f1.svg b/public/emoji/1f1e7-1f1f1.svg
index ad59884c60..77b2b07bcb 100644
--- a/public/emoji/1f1e7-1f1f1.svg
+++ b/public/emoji/1f1e7-1f1f1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1f2.png b/public/emoji/1f1e7-1f1f2.png
deleted file mode 100644
index ab8cafdac6..0000000000
Binary files a/public/emoji/1f1e7-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1f2.svg b/public/emoji/1f1e7-1f1f2.svg
index ba96edd0eb..723f285770 100644
--- a/public/emoji/1f1e7-1f1f2.svg
+++ b/public/emoji/1f1e7-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1f3.png b/public/emoji/1f1e7-1f1f3.png
deleted file mode 100644
index caa9329a89..0000000000
Binary files a/public/emoji/1f1e7-1f1f3.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1f3.svg b/public/emoji/1f1e7-1f1f3.svg
index 3271af93cc..669fd4045c 100644
--- a/public/emoji/1f1e7-1f1f3.svg
+++ b/public/emoji/1f1e7-1f1f3.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1f4.png b/public/emoji/1f1e7-1f1f4.png
deleted file mode 100644
index 98af62b3da..0000000000
Binary files a/public/emoji/1f1e7-1f1f4.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1f4.svg b/public/emoji/1f1e7-1f1f4.svg
index 49a94e9e91..f702e40b6d 100644
--- a/public/emoji/1f1e7-1f1f4.svg
+++ b/public/emoji/1f1e7-1f1f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1f6.png b/public/emoji/1f1e7-1f1f6.png
deleted file mode 100644
index cb978ef9de..0000000000
Binary files a/public/emoji/1f1e7-1f1f6.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1f6.svg b/public/emoji/1f1e7-1f1f6.svg
index a835cb570c..25fad13939 100644
--- a/public/emoji/1f1e7-1f1f6.svg
+++ b/public/emoji/1f1e7-1f1f6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1f7.png b/public/emoji/1f1e7-1f1f7.png
deleted file mode 100644
index b139366a42..0000000000
Binary files a/public/emoji/1f1e7-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1f7.svg b/public/emoji/1f1e7-1f1f7.svg
index 3191070a20..f9b120d64f 100644
--- a/public/emoji/1f1e7-1f1f7.svg
+++ b/public/emoji/1f1e7-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1f8.png b/public/emoji/1f1e7-1f1f8.png
deleted file mode 100644
index d36bcd2fb5..0000000000
Binary files a/public/emoji/1f1e7-1f1f8.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1f8.svg b/public/emoji/1f1e7-1f1f8.svg
index a353225a21..48f72d7f8c 100644
--- a/public/emoji/1f1e7-1f1f8.svg
+++ b/public/emoji/1f1e7-1f1f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1f9.png b/public/emoji/1f1e7-1f1f9.png
deleted file mode 100644
index ed57aa0360..0000000000
Binary files a/public/emoji/1f1e7-1f1f9.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1f9.svg b/public/emoji/1f1e7-1f1f9.svg
index fb5784cc72..ac8ba9d373 100644
--- a/public/emoji/1f1e7-1f1f9.svg
+++ b/public/emoji/1f1e7-1f1f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1fb.png b/public/emoji/1f1e7-1f1fb.png
deleted file mode 100644
index 5884e64822..0000000000
Binary files a/public/emoji/1f1e7-1f1fb.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1fb.svg b/public/emoji/1f1e7-1f1fb.svg
index e9f5672c6f..75ed1e94a3 100644
--- a/public/emoji/1f1e7-1f1fb.svg
+++ b/public/emoji/1f1e7-1f1fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1fc.png b/public/emoji/1f1e7-1f1fc.png
deleted file mode 100644
index cb12f34739..0000000000
Binary files a/public/emoji/1f1e7-1f1fc.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1fc.svg b/public/emoji/1f1e7-1f1fc.svg
index 05f152a377..f29ad45ce9 100644
--- a/public/emoji/1f1e7-1f1fc.svg
+++ b/public/emoji/1f1e7-1f1fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1fe.png b/public/emoji/1f1e7-1f1fe.png
deleted file mode 100644
index 859c05beb1..0000000000
Binary files a/public/emoji/1f1e7-1f1fe.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1fe.svg b/public/emoji/1f1e7-1f1fe.svg
index f27068ab6a..b7ba015c3f 100644
--- a/public/emoji/1f1e7-1f1fe.svg
+++ b/public/emoji/1f1e7-1f1fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7-1f1ff.png b/public/emoji/1f1e7-1f1ff.png
deleted file mode 100644
index 34761cd03d..0000000000
Binary files a/public/emoji/1f1e7-1f1ff.png and /dev/null differ
diff --git a/public/emoji/1f1e7-1f1ff.svg b/public/emoji/1f1e7-1f1ff.svg
index a2e5cffc0e..36f0d2e6c5 100644
--- a/public/emoji/1f1e7-1f1ff.svg
+++ b/public/emoji/1f1e7-1f1ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e7.png b/public/emoji/1f1e7.png
deleted file mode 100644
index 8f69fa973e..0000000000
Binary files a/public/emoji/1f1e7.png and /dev/null differ
diff --git a/public/emoji/1f1e7.svg b/public/emoji/1f1e7.svg
index 7590fdd8ea..70bee81333 100644
--- a/public/emoji/1f1e7.svg
+++ b/public/emoji/1f1e7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1e6.png b/public/emoji/1f1e8-1f1e6.png
deleted file mode 100644
index 7c5b390e85..0000000000
Binary files a/public/emoji/1f1e8-1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1e6.svg b/public/emoji/1f1e8-1f1e6.svg
index 886c66e27c..555d21808b 100644
--- a/public/emoji/1f1e8-1f1e6.svg
+++ b/public/emoji/1f1e8-1f1e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1e8.png b/public/emoji/1f1e8-1f1e8.png
deleted file mode 100644
index b6555a23d8..0000000000
Binary files a/public/emoji/1f1e8-1f1e8.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1e8.svg b/public/emoji/1f1e8-1f1e8.svg
index 8d002807ba..a8d74a752d 100644
--- a/public/emoji/1f1e8-1f1e8.svg
+++ b/public/emoji/1f1e8-1f1e8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1e9.png b/public/emoji/1f1e8-1f1e9.png
deleted file mode 100644
index fa92009771..0000000000
Binary files a/public/emoji/1f1e8-1f1e9.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1e9.svg b/public/emoji/1f1e8-1f1e9.svg
index c635b47e7a..1495355e4a 100644
--- a/public/emoji/1f1e8-1f1e9.svg
+++ b/public/emoji/1f1e8-1f1e9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1eb.png b/public/emoji/1f1e8-1f1eb.png
deleted file mode 100644
index b969ae29ea..0000000000
Binary files a/public/emoji/1f1e8-1f1eb.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1eb.svg b/public/emoji/1f1e8-1f1eb.svg
index 919121cd3e..d9fcde0a93 100644
--- a/public/emoji/1f1e8-1f1eb.svg
+++ b/public/emoji/1f1e8-1f1eb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1ec.png b/public/emoji/1f1e8-1f1ec.png
deleted file mode 100644
index 3a38a40a95..0000000000
Binary files a/public/emoji/1f1e8-1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1ec.svg b/public/emoji/1f1e8-1f1ec.svg
index d511520b95..c9496fe12a 100644
--- a/public/emoji/1f1e8-1f1ec.svg
+++ b/public/emoji/1f1e8-1f1ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1ed.png b/public/emoji/1f1e8-1f1ed.png
deleted file mode 100644
index 5ff86b8a3b..0000000000
Binary files a/public/emoji/1f1e8-1f1ed.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1ed.svg b/public/emoji/1f1e8-1f1ed.svg
index 507afb3701..46e47864f0 100644
--- a/public/emoji/1f1e8-1f1ed.svg
+++ b/public/emoji/1f1e8-1f1ed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1ee.png b/public/emoji/1f1e8-1f1ee.png
deleted file mode 100644
index e3b4d15c7f..0000000000
Binary files a/public/emoji/1f1e8-1f1ee.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1ee.svg b/public/emoji/1f1e8-1f1ee.svg
index 4ae397b288..47188a220b 100644
--- a/public/emoji/1f1e8-1f1ee.svg
+++ b/public/emoji/1f1e8-1f1ee.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1f0.png b/public/emoji/1f1e8-1f1f0.png
deleted file mode 100644
index b6b53dbc1c..0000000000
Binary files a/public/emoji/1f1e8-1f1f0.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1f0.svg b/public/emoji/1f1e8-1f1f0.svg
index 683223e296..bec3a08369 100644
--- a/public/emoji/1f1e8-1f1f0.svg
+++ b/public/emoji/1f1e8-1f1f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1f1.png b/public/emoji/1f1e8-1f1f1.png
deleted file mode 100644
index c9390da549..0000000000
Binary files a/public/emoji/1f1e8-1f1f1.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1f1.svg b/public/emoji/1f1e8-1f1f1.svg
index 51be06e674..6ebd464530 100644
--- a/public/emoji/1f1e8-1f1f1.svg
+++ b/public/emoji/1f1e8-1f1f1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1f2.png b/public/emoji/1f1e8-1f1f2.png
deleted file mode 100644
index 2d3f6ec451..0000000000
Binary files a/public/emoji/1f1e8-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1f2.svg b/public/emoji/1f1e8-1f1f2.svg
index e86d029a4d..e7651a5136 100644
--- a/public/emoji/1f1e8-1f1f2.svg
+++ b/public/emoji/1f1e8-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1f3.png b/public/emoji/1f1e8-1f1f3.png
deleted file mode 100644
index 0a7f350a6d..0000000000
Binary files a/public/emoji/1f1e8-1f1f3.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1f3.svg b/public/emoji/1f1e8-1f1f3.svg
index 9e5bd6650f..646cea9d95 100644
--- a/public/emoji/1f1e8-1f1f3.svg
+++ b/public/emoji/1f1e8-1f1f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1f4.png b/public/emoji/1f1e8-1f1f4.png
deleted file mode 100644
index 7e0f5e0dc3..0000000000
Binary files a/public/emoji/1f1e8-1f1f4.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1f4.svg b/public/emoji/1f1e8-1f1f4.svg
index 387be03c36..e9cb4f814a 100644
--- a/public/emoji/1f1e8-1f1f4.svg
+++ b/public/emoji/1f1e8-1f1f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1f5.png b/public/emoji/1f1e8-1f1f5.png
deleted file mode 100644
index 70c761036b..0000000000
Binary files a/public/emoji/1f1e8-1f1f5.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1f5.svg b/public/emoji/1f1e8-1f1f5.svg
index 16bfba0cfe..359779e7f0 100644
--- a/public/emoji/1f1e8-1f1f5.svg
+++ b/public/emoji/1f1e8-1f1f5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1f7.png b/public/emoji/1f1e8-1f1f7.png
deleted file mode 100644
index a5fce12651..0000000000
Binary files a/public/emoji/1f1e8-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1f7.svg b/public/emoji/1f1e8-1f1f7.svg
index e8510bc058..18dabbc4e1 100644
--- a/public/emoji/1f1e8-1f1f7.svg
+++ b/public/emoji/1f1e8-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1fa.png b/public/emoji/1f1e8-1f1fa.png
deleted file mode 100644
index 447328f7df..0000000000
Binary files a/public/emoji/1f1e8-1f1fa.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1fa.svg b/public/emoji/1f1e8-1f1fa.svg
index ae73709b63..d8c05766c9 100644
--- a/public/emoji/1f1e8-1f1fa.svg
+++ b/public/emoji/1f1e8-1f1fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1fb.png b/public/emoji/1f1e8-1f1fb.png
deleted file mode 100644
index 43faf4d64d..0000000000
Binary files a/public/emoji/1f1e8-1f1fb.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1fb.svg b/public/emoji/1f1e8-1f1fb.svg
index c3c11d6218..d9055e7f3e 100644
--- a/public/emoji/1f1e8-1f1fb.svg
+++ b/public/emoji/1f1e8-1f1fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1fc.png b/public/emoji/1f1e8-1f1fc.png
deleted file mode 100644
index eb39e8d007..0000000000
Binary files a/public/emoji/1f1e8-1f1fc.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1fc.svg b/public/emoji/1f1e8-1f1fc.svg
index cecfdbffd1..e05eae77f6 100644
--- a/public/emoji/1f1e8-1f1fc.svg
+++ b/public/emoji/1f1e8-1f1fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1fd.png b/public/emoji/1f1e8-1f1fd.png
deleted file mode 100644
index 09d21359f3..0000000000
Binary files a/public/emoji/1f1e8-1f1fd.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1fd.svg b/public/emoji/1f1e8-1f1fd.svg
index 2811542007..30857e46b3 100644
--- a/public/emoji/1f1e8-1f1fd.svg
+++ b/public/emoji/1f1e8-1f1fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1fe.png b/public/emoji/1f1e8-1f1fe.png
deleted file mode 100644
index 154a7aa317..0000000000
Binary files a/public/emoji/1f1e8-1f1fe.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1fe.svg b/public/emoji/1f1e8-1f1fe.svg
index 4529030d14..fe7b2b05f8 100644
--- a/public/emoji/1f1e8-1f1fe.svg
+++ b/public/emoji/1f1e8-1f1fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8-1f1ff.png b/public/emoji/1f1e8-1f1ff.png
deleted file mode 100644
index 9737ca223c..0000000000
Binary files a/public/emoji/1f1e8-1f1ff.png and /dev/null differ
diff --git a/public/emoji/1f1e8-1f1ff.svg b/public/emoji/1f1e8-1f1ff.svg
index 3226720bec..3dd8a789c9 100644
--- a/public/emoji/1f1e8-1f1ff.svg
+++ b/public/emoji/1f1e8-1f1ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e8.png b/public/emoji/1f1e8.png
deleted file mode 100644
index f94e668a2c..0000000000
Binary files a/public/emoji/1f1e8.png and /dev/null differ
diff --git a/public/emoji/1f1e8.svg b/public/emoji/1f1e8.svg
index 1aa1eabd4d..c2a6d71f10 100644
--- a/public/emoji/1f1e8.svg
+++ b/public/emoji/1f1e8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e9-1f1ea.png b/public/emoji/1f1e9-1f1ea.png
deleted file mode 100644
index 98ed76b3ba..0000000000
Binary files a/public/emoji/1f1e9-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1e9-1f1ea.svg b/public/emoji/1f1e9-1f1ea.svg
index b2015a77ae..ef390466f7 100644
--- a/public/emoji/1f1e9-1f1ea.svg
+++ b/public/emoji/1f1e9-1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e9-1f1ec.png b/public/emoji/1f1e9-1f1ec.png
deleted file mode 100644
index aae927d14b..0000000000
Binary files a/public/emoji/1f1e9-1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1e9-1f1ec.svg b/public/emoji/1f1e9-1f1ec.svg
index 04d9b4ee65..0266453dd1 100644
--- a/public/emoji/1f1e9-1f1ec.svg
+++ b/public/emoji/1f1e9-1f1ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e9-1f1ef.png b/public/emoji/1f1e9-1f1ef.png
deleted file mode 100644
index 73c2a2acbd..0000000000
Binary files a/public/emoji/1f1e9-1f1ef.png and /dev/null differ
diff --git a/public/emoji/1f1e9-1f1ef.svg b/public/emoji/1f1e9-1f1ef.svg
index f4ae5eafa0..a4daa6f94c 100644
--- a/public/emoji/1f1e9-1f1ef.svg
+++ b/public/emoji/1f1e9-1f1ef.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e9-1f1f0.png b/public/emoji/1f1e9-1f1f0.png
deleted file mode 100644
index e5a60b0625..0000000000
Binary files a/public/emoji/1f1e9-1f1f0.png and /dev/null differ
diff --git a/public/emoji/1f1e9-1f1f0.svg b/public/emoji/1f1e9-1f1f0.svg
index fd2d704d08..ceda13d974 100644
--- a/public/emoji/1f1e9-1f1f0.svg
+++ b/public/emoji/1f1e9-1f1f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e9-1f1f2.png b/public/emoji/1f1e9-1f1f2.png
deleted file mode 100644
index 50f8a53981..0000000000
Binary files a/public/emoji/1f1e9-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1e9-1f1f2.svg b/public/emoji/1f1e9-1f1f2.svg
index 27fc817ba9..66d850adc8 100644
--- a/public/emoji/1f1e9-1f1f2.svg
+++ b/public/emoji/1f1e9-1f1f2.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e9-1f1f4.png b/public/emoji/1f1e9-1f1f4.png
deleted file mode 100644
index 037a45d7c2..0000000000
Binary files a/public/emoji/1f1e9-1f1f4.png and /dev/null differ
diff --git a/public/emoji/1f1e9-1f1f4.svg b/public/emoji/1f1e9-1f1f4.svg
index 133278cbb3..48967b1c97 100644
--- a/public/emoji/1f1e9-1f1f4.svg
+++ b/public/emoji/1f1e9-1f1f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e9-1f1ff.png b/public/emoji/1f1e9-1f1ff.png
deleted file mode 100644
index 24945b10f2..0000000000
Binary files a/public/emoji/1f1e9-1f1ff.png and /dev/null differ
diff --git a/public/emoji/1f1e9-1f1ff.svg b/public/emoji/1f1e9-1f1ff.svg
index 081674e2a6..243c153f30 100644
--- a/public/emoji/1f1e9-1f1ff.svg
+++ b/public/emoji/1f1e9-1f1ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1e9.png b/public/emoji/1f1e9.png
deleted file mode 100644
index 4a36666e5f..0000000000
Binary files a/public/emoji/1f1e9.png and /dev/null differ
diff --git a/public/emoji/1f1e9.svg b/public/emoji/1f1e9.svg
index e7085af164..b96b27d1f7 100644
--- a/public/emoji/1f1e9.svg
+++ b/public/emoji/1f1e9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ea-1f1e6.png b/public/emoji/1f1ea-1f1e6.png
deleted file mode 100644
index 356ff34783..0000000000
Binary files a/public/emoji/1f1ea-1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1ea-1f1e6.svg b/public/emoji/1f1ea-1f1e6.svg
index 0a39cf63e2..97f8ad0117 100644
--- a/public/emoji/1f1ea-1f1e6.svg
+++ b/public/emoji/1f1ea-1f1e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ea-1f1e8.png b/public/emoji/1f1ea-1f1e8.png
deleted file mode 100644
index 1381459461..0000000000
Binary files a/public/emoji/1f1ea-1f1e8.png and /dev/null differ
diff --git a/public/emoji/1f1ea-1f1e8.svg b/public/emoji/1f1ea-1f1e8.svg
index 2d7bf4d1b4..d8af4a1928 100644
--- a/public/emoji/1f1ea-1f1e8.svg
+++ b/public/emoji/1f1ea-1f1e8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ea-1f1ea.png b/public/emoji/1f1ea-1f1ea.png
deleted file mode 100644
index 84f317e774..0000000000
Binary files a/public/emoji/1f1ea-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1ea-1f1ea.svg b/public/emoji/1f1ea-1f1ea.svg
index 0f3f6d8ed7..e8359c64b3 100644
--- a/public/emoji/1f1ea-1f1ea.svg
+++ b/public/emoji/1f1ea-1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ea-1f1ec.png b/public/emoji/1f1ea-1f1ec.png
deleted file mode 100644
index 57786064a9..0000000000
Binary files a/public/emoji/1f1ea-1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1ea-1f1ec.svg b/public/emoji/1f1ea-1f1ec.svg
index ee47f26c9f..9018d1c60a 100644
--- a/public/emoji/1f1ea-1f1ec.svg
+++ b/public/emoji/1f1ea-1f1ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ea-1f1ed.png b/public/emoji/1f1ea-1f1ed.png
deleted file mode 100644
index 4d7a76687f..0000000000
Binary files a/public/emoji/1f1ea-1f1ed.png and /dev/null differ
diff --git a/public/emoji/1f1ea-1f1ed.svg b/public/emoji/1f1ea-1f1ed.svg
index 63f1fe8ac2..a4bbad3099 100644
--- a/public/emoji/1f1ea-1f1ed.svg
+++ b/public/emoji/1f1ea-1f1ed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ea-1f1f7.png b/public/emoji/1f1ea-1f1f7.png
deleted file mode 100644
index 0c3c724c1f..0000000000
Binary files a/public/emoji/1f1ea-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1ea-1f1f7.svg b/public/emoji/1f1ea-1f1f7.svg
index 616efd6cc8..067278b027 100644
--- a/public/emoji/1f1ea-1f1f7.svg
+++ b/public/emoji/1f1ea-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ea-1f1f8.png b/public/emoji/1f1ea-1f1f8.png
deleted file mode 100644
index 3e73597a22..0000000000
Binary files a/public/emoji/1f1ea-1f1f8.png and /dev/null differ
diff --git a/public/emoji/1f1ea-1f1f8.svg b/public/emoji/1f1ea-1f1f8.svg
index 891a2597b9..97f8ad0117 100644
--- a/public/emoji/1f1ea-1f1f8.svg
+++ b/public/emoji/1f1ea-1f1f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ea-1f1f9.png b/public/emoji/1f1ea-1f1f9.png
deleted file mode 100644
index 9560a134c9..0000000000
Binary files a/public/emoji/1f1ea-1f1f9.png and /dev/null differ
diff --git a/public/emoji/1f1ea-1f1f9.svg b/public/emoji/1f1ea-1f1f9.svg
index ab724478ea..7e7a5194d7 100644
--- a/public/emoji/1f1ea-1f1f9.svg
+++ b/public/emoji/1f1ea-1f1f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ea-1f1fa.png b/public/emoji/1f1ea-1f1fa.png
deleted file mode 100644
index 0b456cf333..0000000000
Binary files a/public/emoji/1f1ea-1f1fa.png and /dev/null differ
diff --git a/public/emoji/1f1ea-1f1fa.svg b/public/emoji/1f1ea-1f1fa.svg
index 40416b4bad..76f6485a8d 100644
--- a/public/emoji/1f1ea-1f1fa.svg
+++ b/public/emoji/1f1ea-1f1fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ea.png b/public/emoji/1f1ea.png
deleted file mode 100644
index 66f7e8d8cf..0000000000
Binary files a/public/emoji/1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1ea.svg b/public/emoji/1f1ea.svg
index 6727438c4d..d1521bb00a 100644
--- a/public/emoji/1f1ea.svg
+++ b/public/emoji/1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1eb-1f1ee.png b/public/emoji/1f1eb-1f1ee.png
deleted file mode 100644
index ebcf58abfc..0000000000
Binary files a/public/emoji/1f1eb-1f1ee.png and /dev/null differ
diff --git a/public/emoji/1f1eb-1f1ee.svg b/public/emoji/1f1eb-1f1ee.svg
index 0894ffc582..ce60e2d95d 100644
--- a/public/emoji/1f1eb-1f1ee.svg
+++ b/public/emoji/1f1eb-1f1ee.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1eb-1f1ef.png b/public/emoji/1f1eb-1f1ef.png
deleted file mode 100644
index 9cc8c37fe3..0000000000
Binary files a/public/emoji/1f1eb-1f1ef.png and /dev/null differ
diff --git a/public/emoji/1f1eb-1f1ef.svg b/public/emoji/1f1eb-1f1ef.svg
index 0bbbeae0fd..198e69ed6a 100644
--- a/public/emoji/1f1eb-1f1ef.svg
+++ b/public/emoji/1f1eb-1f1ef.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1eb-1f1f0.png b/public/emoji/1f1eb-1f1f0.png
deleted file mode 100644
index 61372fd254..0000000000
Binary files a/public/emoji/1f1eb-1f1f0.png and /dev/null differ
diff --git a/public/emoji/1f1eb-1f1f0.svg b/public/emoji/1f1eb-1f1f0.svg
index 29f0c8548f..e2c5a49178 100644
--- a/public/emoji/1f1eb-1f1f0.svg
+++ b/public/emoji/1f1eb-1f1f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1eb-1f1f2.png b/public/emoji/1f1eb-1f1f2.png
deleted file mode 100644
index 0889825c8e..0000000000
Binary files a/public/emoji/1f1eb-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1eb-1f1f2.svg b/public/emoji/1f1eb-1f1f2.svg
index ca329d00ae..01e5dd223a 100644
--- a/public/emoji/1f1eb-1f1f2.svg
+++ b/public/emoji/1f1eb-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1eb-1f1f4.png b/public/emoji/1f1eb-1f1f4.png
deleted file mode 100644
index 9a4431b083..0000000000
Binary files a/public/emoji/1f1eb-1f1f4.png and /dev/null differ
diff --git a/public/emoji/1f1eb-1f1f4.svg b/public/emoji/1f1eb-1f1f4.svg
index d5b522ebec..c1fd7e9772 100644
--- a/public/emoji/1f1eb-1f1f4.svg
+++ b/public/emoji/1f1eb-1f1f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1eb-1f1f7.png b/public/emoji/1f1eb-1f1f7.png
deleted file mode 100644
index 62ca19c3fc..0000000000
Binary files a/public/emoji/1f1eb-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1eb-1f1f7.svg b/public/emoji/1f1eb-1f1f7.svg
index 7f9d0ab327..359779e7f0 100644
--- a/public/emoji/1f1eb-1f1f7.svg
+++ b/public/emoji/1f1eb-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1eb.png b/public/emoji/1f1eb.png
deleted file mode 100644
index 913b230fde..0000000000
Binary files a/public/emoji/1f1eb.png and /dev/null differ
diff --git a/public/emoji/1f1eb.svg b/public/emoji/1f1eb.svg
index 2d54ed2388..c5907a4a44 100644
--- a/public/emoji/1f1eb.svg
+++ b/public/emoji/1f1eb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1e6.png b/public/emoji/1f1ec-1f1e6.png
deleted file mode 100644
index 2e68e527a3..0000000000
Binary files a/public/emoji/1f1ec-1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1e6.svg b/public/emoji/1f1ec-1f1e6.svg
index f30f1e0445..809addb476 100644
--- a/public/emoji/1f1ec-1f1e6.svg
+++ b/public/emoji/1f1ec-1f1e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1e7.png b/public/emoji/1f1ec-1f1e7.png
deleted file mode 100644
index 3ed10f6234..0000000000
Binary files a/public/emoji/1f1ec-1f1e7.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1e7.svg b/public/emoji/1f1ec-1f1e7.svg
index f745d658d0..9628d4f2b4 100644
--- a/public/emoji/1f1ec-1f1e7.svg
+++ b/public/emoji/1f1ec-1f1e7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1e9.png b/public/emoji/1f1ec-1f1e9.png
deleted file mode 100644
index 527aad3380..0000000000
Binary files a/public/emoji/1f1ec-1f1e9.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1e9.svg b/public/emoji/1f1ec-1f1e9.svg
index c33b39dfc6..33a1f9b844 100644
--- a/public/emoji/1f1ec-1f1e9.svg
+++ b/public/emoji/1f1ec-1f1e9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1ea.png b/public/emoji/1f1ec-1f1ea.png
deleted file mode 100644
index a75d142480..0000000000
Binary files a/public/emoji/1f1ec-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1ea.svg b/public/emoji/1f1ec-1f1ea.svg
index 044d07dcab..e1dc358f4d 100644
--- a/public/emoji/1f1ec-1f1ea.svg
+++ b/public/emoji/1f1ec-1f1ea.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1eb.png b/public/emoji/1f1ec-1f1eb.png
deleted file mode 100644
index 0cf96f327c..0000000000
Binary files a/public/emoji/1f1ec-1f1eb.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1eb.svg b/public/emoji/1f1ec-1f1eb.svg
index 328baf2635..4aef797025 100644
--- a/public/emoji/1f1ec-1f1eb.svg
+++ b/public/emoji/1f1ec-1f1eb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1ec.png b/public/emoji/1f1ec-1f1ec.png
deleted file mode 100644
index 970002c7f7..0000000000
Binary files a/public/emoji/1f1ec-1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1ec.svg b/public/emoji/1f1ec-1f1ec.svg
index 3e4098e429..8bd725600d 100644
--- a/public/emoji/1f1ec-1f1ec.svg
+++ b/public/emoji/1f1ec-1f1ec.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1ed.png b/public/emoji/1f1ec-1f1ed.png
deleted file mode 100644
index f31b5eb7b4..0000000000
Binary files a/public/emoji/1f1ec-1f1ed.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1ed.svg b/public/emoji/1f1ec-1f1ed.svg
index f3558ad051..ea91d25084 100644
--- a/public/emoji/1f1ec-1f1ed.svg
+++ b/public/emoji/1f1ec-1f1ed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1ee.png b/public/emoji/1f1ec-1f1ee.png
deleted file mode 100644
index e554a2a1d0..0000000000
Binary files a/public/emoji/1f1ec-1f1ee.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1ee.svg b/public/emoji/1f1ec-1f1ee.svg
index c980311a08..77ac932899 100644
--- a/public/emoji/1f1ec-1f1ee.svg
+++ b/public/emoji/1f1ec-1f1ee.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1f1.png b/public/emoji/1f1ec-1f1f1.png
deleted file mode 100644
index 2e795dd4e3..0000000000
Binary files a/public/emoji/1f1ec-1f1f1.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1f1.svg b/public/emoji/1f1ec-1f1f1.svg
index 484b80c08b..aa1713855f 100644
--- a/public/emoji/1f1ec-1f1f1.svg
+++ b/public/emoji/1f1ec-1f1f1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1f2.png b/public/emoji/1f1ec-1f1f2.png
deleted file mode 100644
index bb69c0975a..0000000000
Binary files a/public/emoji/1f1ec-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1f2.svg b/public/emoji/1f1ec-1f1f2.svg
index 5fa53d532b..38e8738de4 100644
--- a/public/emoji/1f1ec-1f1f2.svg
+++ b/public/emoji/1f1ec-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1f3.png b/public/emoji/1f1ec-1f1f3.png
deleted file mode 100644
index 1981f61dbf..0000000000
Binary files a/public/emoji/1f1ec-1f1f3.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1f3.svg b/public/emoji/1f1ec-1f1f3.svg
index ea98260a48..94758e5377 100644
--- a/public/emoji/1f1ec-1f1f3.svg
+++ b/public/emoji/1f1ec-1f1f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1f5.png b/public/emoji/1f1ec-1f1f5.png
deleted file mode 100644
index 10e42e672b..0000000000
Binary files a/public/emoji/1f1ec-1f1f5.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1f5.svg b/public/emoji/1f1ec-1f1f5.svg
index f044d48d20..5cba069782 100644
--- a/public/emoji/1f1ec-1f1f5.svg
+++ b/public/emoji/1f1ec-1f1f5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1f6.png b/public/emoji/1f1ec-1f1f6.png
deleted file mode 100644
index 11475e61ee..0000000000
Binary files a/public/emoji/1f1ec-1f1f6.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1f6.svg b/public/emoji/1f1ec-1f1f6.svg
index 6c4a1581a5..0b7c182362 100644
--- a/public/emoji/1f1ec-1f1f6.svg
+++ b/public/emoji/1f1ec-1f1f6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1f7.png b/public/emoji/1f1ec-1f1f7.png
deleted file mode 100644
index 0f6bb1b6b9..0000000000
Binary files a/public/emoji/1f1ec-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1f7.svg b/public/emoji/1f1ec-1f1f7.svg
index 75c9bc6a45..686ca152e5 100644
--- a/public/emoji/1f1ec-1f1f7.svg
+++ b/public/emoji/1f1ec-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1f8.png b/public/emoji/1f1ec-1f1f8.png
deleted file mode 100644
index 6fc9278045..0000000000
Binary files a/public/emoji/1f1ec-1f1f8.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1f8.svg b/public/emoji/1f1ec-1f1f8.svg
index 68772ee199..f51cd5dfc8 100644
--- a/public/emoji/1f1ec-1f1f8.svg
+++ b/public/emoji/1f1ec-1f1f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1f9.png b/public/emoji/1f1ec-1f1f9.png
deleted file mode 100644
index 7213d4139e..0000000000
Binary files a/public/emoji/1f1ec-1f1f9.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1f9.svg b/public/emoji/1f1ec-1f1f9.svg
index bc4f58471a..3e86ce5202 100644
--- a/public/emoji/1f1ec-1f1f9.svg
+++ b/public/emoji/1f1ec-1f1f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1fa.png b/public/emoji/1f1ec-1f1fa.png
deleted file mode 100644
index 4027549ca3..0000000000
Binary files a/public/emoji/1f1ec-1f1fa.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1fa.svg b/public/emoji/1f1ec-1f1fa.svg
index 6cdd6bf36a..4718442acc 100644
--- a/public/emoji/1f1ec-1f1fa.svg
+++ b/public/emoji/1f1ec-1f1fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1fc.png b/public/emoji/1f1ec-1f1fc.png
deleted file mode 100644
index 6357f6225f..0000000000
Binary files a/public/emoji/1f1ec-1f1fc.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1fc.svg b/public/emoji/1f1ec-1f1fc.svg
index 30ed7effb9..9c121c5645 100644
--- a/public/emoji/1f1ec-1f1fc.svg
+++ b/public/emoji/1f1ec-1f1fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec-1f1fe.png b/public/emoji/1f1ec-1f1fe.png
deleted file mode 100644
index 746e2fb7e4..0000000000
Binary files a/public/emoji/1f1ec-1f1fe.png and /dev/null differ
diff --git a/public/emoji/1f1ec-1f1fe.svg b/public/emoji/1f1ec-1f1fe.svg
index b4f6743d2b..37faeaf905 100644
--- a/public/emoji/1f1ec-1f1fe.svg
+++ b/public/emoji/1f1ec-1f1fe.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ec.png b/public/emoji/1f1ec.png
deleted file mode 100644
index 2711630753..0000000000
Binary files a/public/emoji/1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1ec.svg b/public/emoji/1f1ec.svg
index 2fb8014307..a8c44210fa 100644
--- a/public/emoji/1f1ec.svg
+++ b/public/emoji/1f1ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ed-1f1f0.png b/public/emoji/1f1ed-1f1f0.png
deleted file mode 100644
index cf0c7151b5..0000000000
Binary files a/public/emoji/1f1ed-1f1f0.png and /dev/null differ
diff --git a/public/emoji/1f1ed-1f1f0.svg b/public/emoji/1f1ed-1f1f0.svg
index 20f6508bed..8152b768b0 100644
--- a/public/emoji/1f1ed-1f1f0.svg
+++ b/public/emoji/1f1ed-1f1f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ed-1f1f2.png b/public/emoji/1f1ed-1f1f2.png
deleted file mode 100644
index b613509e46..0000000000
Binary files a/public/emoji/1f1ed-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1ed-1f1f2.svg b/public/emoji/1f1ed-1f1f2.svg
index ee741bb195..986705ff93 100644
--- a/public/emoji/1f1ed-1f1f2.svg
+++ b/public/emoji/1f1ed-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ed-1f1f3.png b/public/emoji/1f1ed-1f1f3.png
deleted file mode 100644
index 402cdcefdf..0000000000
Binary files a/public/emoji/1f1ed-1f1f3.png and /dev/null differ
diff --git a/public/emoji/1f1ed-1f1f3.svg b/public/emoji/1f1ed-1f1f3.svg
index 0b56c947bb..9ffdb103ce 100644
--- a/public/emoji/1f1ed-1f1f3.svg
+++ b/public/emoji/1f1ed-1f1f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ed-1f1f7.png b/public/emoji/1f1ed-1f1f7.png
deleted file mode 100644
index 46f4f06b4f..0000000000
Binary files a/public/emoji/1f1ed-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1ed-1f1f7.svg b/public/emoji/1f1ed-1f1f7.svg
index 938504a0db..3d757816ac 100644
--- a/public/emoji/1f1ed-1f1f7.svg
+++ b/public/emoji/1f1ed-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ed-1f1f9.png b/public/emoji/1f1ed-1f1f9.png
deleted file mode 100644
index d8d0c88849..0000000000
Binary files a/public/emoji/1f1ed-1f1f9.png and /dev/null differ
diff --git a/public/emoji/1f1ed-1f1f9.svg b/public/emoji/1f1ed-1f1f9.svg
index 6162c6a4d2..6bc1872294 100644
--- a/public/emoji/1f1ed-1f1f9.svg
+++ b/public/emoji/1f1ed-1f1f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ed-1f1fa.png b/public/emoji/1f1ed-1f1fa.png
deleted file mode 100644
index a898de636a..0000000000
Binary files a/public/emoji/1f1ed-1f1fa.png and /dev/null differ
diff --git a/public/emoji/1f1ed-1f1fa.svg b/public/emoji/1f1ed-1f1fa.svg
index 48b8aced60..bb04c1863b 100644
--- a/public/emoji/1f1ed-1f1fa.svg
+++ b/public/emoji/1f1ed-1f1fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ed.png b/public/emoji/1f1ed.png
deleted file mode 100644
index ca88e46bfc..0000000000
Binary files a/public/emoji/1f1ed.png and /dev/null differ
diff --git a/public/emoji/1f1ed.svg b/public/emoji/1f1ed.svg
index 6add3c7e04..337b2f0a98 100644
--- a/public/emoji/1f1ed.svg
+++ b/public/emoji/1f1ed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ee-1f1e8.png b/public/emoji/1f1ee-1f1e8.png
deleted file mode 100644
index 69fd990aa9..0000000000
Binary files a/public/emoji/1f1ee-1f1e8.png and /dev/null differ
diff --git a/public/emoji/1f1ee-1f1e8.svg b/public/emoji/1f1ee-1f1e8.svg
index 540234ef7a..7741ac37d1 100644
--- a/public/emoji/1f1ee-1f1e8.svg
+++ b/public/emoji/1f1ee-1f1e8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ee-1f1e9.png b/public/emoji/1f1ee-1f1e9.png
deleted file mode 100644
index 85b4c063a4..0000000000
Binary files a/public/emoji/1f1ee-1f1e9.png and /dev/null differ
diff --git a/public/emoji/1f1ee-1f1e9.svg b/public/emoji/1f1ee-1f1e9.svg
index d92e0a0090..2e35859dd4 100644
--- a/public/emoji/1f1ee-1f1e9.svg
+++ b/public/emoji/1f1ee-1f1e9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ee-1f1ea.png b/public/emoji/1f1ee-1f1ea.png
deleted file mode 100644
index a28295838c..0000000000
Binary files a/public/emoji/1f1ee-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1ee-1f1ea.svg b/public/emoji/1f1ee-1f1ea.svg
index c3f32f72d1..449c639469 100644
--- a/public/emoji/1f1ee-1f1ea.svg
+++ b/public/emoji/1f1ee-1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ee-1f1f1.png b/public/emoji/1f1ee-1f1f1.png
deleted file mode 100644
index 85c410d45f..0000000000
Binary files a/public/emoji/1f1ee-1f1f1.png and /dev/null differ
diff --git a/public/emoji/1f1ee-1f1f1.svg b/public/emoji/1f1ee-1f1f1.svg
index 4118fdf99d..a9680cc922 100644
--- a/public/emoji/1f1ee-1f1f1.svg
+++ b/public/emoji/1f1ee-1f1f1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ee-1f1f2.png b/public/emoji/1f1ee-1f1f2.png
deleted file mode 100644
index 60a2458e38..0000000000
Binary files a/public/emoji/1f1ee-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1ee-1f1f2.svg b/public/emoji/1f1ee-1f1f2.svg
index 17632dc76d..7dc6a44fef 100644
--- a/public/emoji/1f1ee-1f1f2.svg
+++ b/public/emoji/1f1ee-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ee-1f1f3.png b/public/emoji/1f1ee-1f1f3.png
deleted file mode 100644
index feccc8952c..0000000000
Binary files a/public/emoji/1f1ee-1f1f3.png and /dev/null differ
diff --git a/public/emoji/1f1ee-1f1f3.svg b/public/emoji/1f1ee-1f1f3.svg
index 0f8b13d572..c8720d0eab 100644
--- a/public/emoji/1f1ee-1f1f3.svg
+++ b/public/emoji/1f1ee-1f1f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ee-1f1f4.png b/public/emoji/1f1ee-1f1f4.png
deleted file mode 100644
index aae927d14b..0000000000
Binary files a/public/emoji/1f1ee-1f1f4.png and /dev/null differ
diff --git a/public/emoji/1f1ee-1f1f4.svg b/public/emoji/1f1ee-1f1f4.svg
index 04d9b4ee65..0266453dd1 100644
--- a/public/emoji/1f1ee-1f1f4.svg
+++ b/public/emoji/1f1ee-1f1f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ee-1f1f6.png b/public/emoji/1f1ee-1f1f6.png
deleted file mode 100644
index 41fd1db6f8..0000000000
Binary files a/public/emoji/1f1ee-1f1f6.png and /dev/null differ
diff --git a/public/emoji/1f1ee-1f1f6.svg b/public/emoji/1f1ee-1f1f6.svg
index c260e29258..cde68d8e77 100644
--- a/public/emoji/1f1ee-1f1f6.svg
+++ b/public/emoji/1f1ee-1f1f6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ee-1f1f7.png b/public/emoji/1f1ee-1f1f7.png
deleted file mode 100644
index ff7aaf62ba..0000000000
Binary files a/public/emoji/1f1ee-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1ee-1f1f7.svg b/public/emoji/1f1ee-1f1f7.svg
index d7b36f5e80..79a88385b1 100644
--- a/public/emoji/1f1ee-1f1f7.svg
+++ b/public/emoji/1f1ee-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ee-1f1f8.png b/public/emoji/1f1ee-1f1f8.png
deleted file mode 100644
index ad8d4131dd..0000000000
Binary files a/public/emoji/1f1ee-1f1f8.png and /dev/null differ
diff --git a/public/emoji/1f1ee-1f1f8.svg b/public/emoji/1f1ee-1f1f8.svg
index 485bbd003d..06b977391d 100644
--- a/public/emoji/1f1ee-1f1f8.svg
+++ b/public/emoji/1f1ee-1f1f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ee-1f1f9.png b/public/emoji/1f1ee-1f1f9.png
deleted file mode 100644
index f21563ec53..0000000000
Binary files a/public/emoji/1f1ee-1f1f9.png and /dev/null differ
diff --git a/public/emoji/1f1ee-1f1f9.svg b/public/emoji/1f1ee-1f1f9.svg
index f14b06522b..9278ea01a8 100644
--- a/public/emoji/1f1ee-1f1f9.svg
+++ b/public/emoji/1f1ee-1f1f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ee.png b/public/emoji/1f1ee.png
deleted file mode 100644
index 48dc167889..0000000000
Binary files a/public/emoji/1f1ee.png and /dev/null differ
diff --git a/public/emoji/1f1ee.svg b/public/emoji/1f1ee.svg
index dc8d231b86..a344801737 100644
--- a/public/emoji/1f1ee.svg
+++ b/public/emoji/1f1ee.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ef-1f1ea.png b/public/emoji/1f1ef-1f1ea.png
deleted file mode 100644
index 198a918f6a..0000000000
Binary files a/public/emoji/1f1ef-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1ef-1f1ea.svg b/public/emoji/1f1ef-1f1ea.svg
index d71bf48eef..79576ef1f0 100644
--- a/public/emoji/1f1ef-1f1ea.svg
+++ b/public/emoji/1f1ef-1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ef-1f1f2.png b/public/emoji/1f1ef-1f1f2.png
deleted file mode 100644
index f84e4f9e8d..0000000000
Binary files a/public/emoji/1f1ef-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1ef-1f1f2.svg b/public/emoji/1f1ef-1f1f2.svg
index 810f5ab715..9a2c61823d 100644
--- a/public/emoji/1f1ef-1f1f2.svg
+++ b/public/emoji/1f1ef-1f1f2.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ef-1f1f4.png b/public/emoji/1f1ef-1f1f4.png
deleted file mode 100644
index 20bfa147e3..0000000000
Binary files a/public/emoji/1f1ef-1f1f4.png and /dev/null differ
diff --git a/public/emoji/1f1ef-1f1f4.svg b/public/emoji/1f1ef-1f1f4.svg
index 2acfb9a8eb..76695fd2ac 100644
--- a/public/emoji/1f1ef-1f1f4.svg
+++ b/public/emoji/1f1ef-1f1f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ef-1f1f5.png b/public/emoji/1f1ef-1f1f5.png
deleted file mode 100644
index 8d8838e470..0000000000
Binary files a/public/emoji/1f1ef-1f1f5.png and /dev/null differ
diff --git a/public/emoji/1f1ef-1f1f5.svg b/public/emoji/1f1ef-1f1f5.svg
index 8ffa66be68..e7d4edf6b7 100644
--- a/public/emoji/1f1ef-1f1f5.svg
+++ b/public/emoji/1f1ef-1f1f5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ef.png b/public/emoji/1f1ef.png
deleted file mode 100644
index 16599daa7d..0000000000
Binary files a/public/emoji/1f1ef.png and /dev/null differ
diff --git a/public/emoji/1f1ef.svg b/public/emoji/1f1ef.svg
index 249efde293..c36897e373 100644
--- a/public/emoji/1f1ef.svg
+++ b/public/emoji/1f1ef.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f0-1f1ea.png b/public/emoji/1f1f0-1f1ea.png
deleted file mode 100644
index 9e417ab300..0000000000
Binary files a/public/emoji/1f1f0-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1f0-1f1ea.svg b/public/emoji/1f1f0-1f1ea.svg
index 65828fd765..7448af9f4a 100644
--- a/public/emoji/1f1f0-1f1ea.svg
+++ b/public/emoji/1f1f0-1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f0-1f1ec.png b/public/emoji/1f1f0-1f1ec.png
deleted file mode 100644
index 2f2d848fe5..0000000000
Binary files a/public/emoji/1f1f0-1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1f0-1f1ec.svg b/public/emoji/1f1f0-1f1ec.svg
index c2b532f660..88eb576130 100644
--- a/public/emoji/1f1f0-1f1ec.svg
+++ b/public/emoji/1f1f0-1f1ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f0-1f1ed.png b/public/emoji/1f1f0-1f1ed.png
deleted file mode 100644
index 9a2877dd62..0000000000
Binary files a/public/emoji/1f1f0-1f1ed.png and /dev/null differ
diff --git a/public/emoji/1f1f0-1f1ed.svg b/public/emoji/1f1f0-1f1ed.svg
index a28e0243e1..7ef576703a 100644
--- a/public/emoji/1f1f0-1f1ed.svg
+++ b/public/emoji/1f1f0-1f1ed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f0-1f1ee.png b/public/emoji/1f1f0-1f1ee.png
deleted file mode 100644
index 10e507e324..0000000000
Binary files a/public/emoji/1f1f0-1f1ee.png and /dev/null differ
diff --git a/public/emoji/1f1f0-1f1ee.svg b/public/emoji/1f1f0-1f1ee.svg
index 81f5fc9e52..4ff9bc2637 100644
--- a/public/emoji/1f1f0-1f1ee.svg
+++ b/public/emoji/1f1f0-1f1ee.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f0-1f1f2.png b/public/emoji/1f1f0-1f1f2.png
deleted file mode 100644
index bd5a0588e0..0000000000
Binary files a/public/emoji/1f1f0-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1f0-1f1f2.svg b/public/emoji/1f1f0-1f1f2.svg
index 8e9ba574d0..576e2fa22a 100644
--- a/public/emoji/1f1f0-1f1f2.svg
+++ b/public/emoji/1f1f0-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f0-1f1f3.png b/public/emoji/1f1f0-1f1f3.png
deleted file mode 100644
index 776207c960..0000000000
Binary files a/public/emoji/1f1f0-1f1f3.png and /dev/null differ
diff --git a/public/emoji/1f1f0-1f1f3.svg b/public/emoji/1f1f0-1f1f3.svg
index 505ac748dd..86a2dd6bbd 100644
--- a/public/emoji/1f1f0-1f1f3.svg
+++ b/public/emoji/1f1f0-1f1f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f0-1f1f5.png b/public/emoji/1f1f0-1f1f5.png
deleted file mode 100644
index 6b3fd89eaa..0000000000
Binary files a/public/emoji/1f1f0-1f1f5.png and /dev/null differ
diff --git a/public/emoji/1f1f0-1f1f5.svg b/public/emoji/1f1f0-1f1f5.svg
index dc4d679813..c4ff6ac31b 100644
--- a/public/emoji/1f1f0-1f1f5.svg
+++ b/public/emoji/1f1f0-1f1f5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f0-1f1f7.png b/public/emoji/1f1f0-1f1f7.png
deleted file mode 100644
index 833a88116e..0000000000
Binary files a/public/emoji/1f1f0-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1f0-1f1f7.svg b/public/emoji/1f1f0-1f1f7.svg
index 5b28e35952..7b5c679047 100644
--- a/public/emoji/1f1f0-1f1f7.svg
+++ b/public/emoji/1f1f0-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f0-1f1fc.png b/public/emoji/1f1f0-1f1fc.png
deleted file mode 100644
index 4d19bfa6ca..0000000000
Binary files a/public/emoji/1f1f0-1f1fc.png and /dev/null differ
diff --git a/public/emoji/1f1f0-1f1fc.svg b/public/emoji/1f1f0-1f1fc.svg
index f3076ffb40..735085fa90 100644
--- a/public/emoji/1f1f0-1f1fc.svg
+++ b/public/emoji/1f1f0-1f1fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f0-1f1fe.png b/public/emoji/1f1f0-1f1fe.png
deleted file mode 100644
index 40daa4da59..0000000000
Binary files a/public/emoji/1f1f0-1f1fe.png and /dev/null differ
diff --git a/public/emoji/1f1f0-1f1fe.svg b/public/emoji/1f1f0-1f1fe.svg
index 6d0432cb82..ae4088997f 100644
--- a/public/emoji/1f1f0-1f1fe.svg
+++ b/public/emoji/1f1f0-1f1fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f0-1f1ff.png b/public/emoji/1f1f0-1f1ff.png
deleted file mode 100644
index 2f97a8fd3c..0000000000
Binary files a/public/emoji/1f1f0-1f1ff.png and /dev/null differ
diff --git a/public/emoji/1f1f0-1f1ff.svg b/public/emoji/1f1f0-1f1ff.svg
index 107bf17ac7..0c398a457d 100644
--- a/public/emoji/1f1f0-1f1ff.svg
+++ b/public/emoji/1f1f0-1f1ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f0.png b/public/emoji/1f1f0.png
deleted file mode 100644
index 204b95d1b5..0000000000
Binary files a/public/emoji/1f1f0.png and /dev/null differ
diff --git a/public/emoji/1f1f0.svg b/public/emoji/1f1f0.svg
index 0ae3f9a3b0..d9294f183c 100644
--- a/public/emoji/1f1f0.svg
+++ b/public/emoji/1f1f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f1-1f1e6.png b/public/emoji/1f1f1-1f1e6.png
deleted file mode 100644
index 4d4179f34f..0000000000
Binary files a/public/emoji/1f1f1-1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1f1-1f1e6.svg b/public/emoji/1f1f1-1f1e6.svg
index a9ebf083c8..251d2bdec6 100644
--- a/public/emoji/1f1f1-1f1e6.svg
+++ b/public/emoji/1f1f1-1f1e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f1-1f1e7.png b/public/emoji/1f1f1-1f1e7.png
deleted file mode 100644
index 3d59446701..0000000000
Binary files a/public/emoji/1f1f1-1f1e7.png and /dev/null differ
diff --git a/public/emoji/1f1f1-1f1e7.svg b/public/emoji/1f1f1-1f1e7.svg
index d000185e59..3b47f5895d 100644
--- a/public/emoji/1f1f1-1f1e7.svg
+++ b/public/emoji/1f1f1-1f1e7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f1-1f1e8.png b/public/emoji/1f1f1-1f1e8.png
deleted file mode 100644
index 45547b1e43..0000000000
Binary files a/public/emoji/1f1f1-1f1e8.png and /dev/null differ
diff --git a/public/emoji/1f1f1-1f1e8.svg b/public/emoji/1f1f1-1f1e8.svg
index 9f5255714c..255cbe8f04 100644
--- a/public/emoji/1f1f1-1f1e8.svg
+++ b/public/emoji/1f1f1-1f1e8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f1-1f1ee.png b/public/emoji/1f1f1-1f1ee.png
deleted file mode 100644
index 0eafa6a221..0000000000
Binary files a/public/emoji/1f1f1-1f1ee.png and /dev/null differ
diff --git a/public/emoji/1f1f1-1f1ee.svg b/public/emoji/1f1f1-1f1ee.svg
index 51b11472b4..5b878c9d75 100644
--- a/public/emoji/1f1f1-1f1ee.svg
+++ b/public/emoji/1f1f1-1f1ee.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f1-1f1f0.png b/public/emoji/1f1f1-1f1f0.png
deleted file mode 100644
index ab4fe10c40..0000000000
Binary files a/public/emoji/1f1f1-1f1f0.png and /dev/null differ
diff --git a/public/emoji/1f1f1-1f1f0.svg b/public/emoji/1f1f1-1f1f0.svg
index 5eb3cd7ee4..18ce60f466 100644
--- a/public/emoji/1f1f1-1f1f0.svg
+++ b/public/emoji/1f1f1-1f1f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f1-1f1f7.png b/public/emoji/1f1f1-1f1f7.png
deleted file mode 100644
index f66f267fea..0000000000
Binary files a/public/emoji/1f1f1-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1f1-1f1f7.svg b/public/emoji/1f1f1-1f1f7.svg
index 13995a6bf4..60815efb69 100644
--- a/public/emoji/1f1f1-1f1f7.svg
+++ b/public/emoji/1f1f1-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f1-1f1f8.png b/public/emoji/1f1f1-1f1f8.png
deleted file mode 100644
index 24745631e3..0000000000
Binary files a/public/emoji/1f1f1-1f1f8.png and /dev/null differ
diff --git a/public/emoji/1f1f1-1f1f8.svg b/public/emoji/1f1f1-1f1f8.svg
index ef9b0346c5..437f875ba9 100644
--- a/public/emoji/1f1f1-1f1f8.svg
+++ b/public/emoji/1f1f1-1f1f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f1-1f1f9.png b/public/emoji/1f1f1-1f1f9.png
deleted file mode 100644
index d644b56d62..0000000000
Binary files a/public/emoji/1f1f1-1f1f9.png and /dev/null differ
diff --git a/public/emoji/1f1f1-1f1f9.svg b/public/emoji/1f1f1-1f1f9.svg
index 513d722c0c..464ae5e046 100644
--- a/public/emoji/1f1f1-1f1f9.svg
+++ b/public/emoji/1f1f1-1f1f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f1-1f1fa.png b/public/emoji/1f1f1-1f1fa.png
deleted file mode 100644
index a2df9c9299..0000000000
Binary files a/public/emoji/1f1f1-1f1fa.png and /dev/null differ
diff --git a/public/emoji/1f1f1-1f1fa.svg b/public/emoji/1f1f1-1f1fa.svg
index 78de148357..ce8ff86f7b 100644
--- a/public/emoji/1f1f1-1f1fa.svg
+++ b/public/emoji/1f1f1-1f1fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f1-1f1fb.png b/public/emoji/1f1f1-1f1fb.png
deleted file mode 100644
index ae680d5f0e..0000000000
Binary files a/public/emoji/1f1f1-1f1fb.png and /dev/null differ
diff --git a/public/emoji/1f1f1-1f1fb.svg b/public/emoji/1f1f1-1f1fb.svg
index b3fa271e08..7265ac5074 100644
--- a/public/emoji/1f1f1-1f1fb.svg
+++ b/public/emoji/1f1f1-1f1fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f1-1f1fe.png b/public/emoji/1f1f1-1f1fe.png
deleted file mode 100644
index f6e77b0f3b..0000000000
Binary files a/public/emoji/1f1f1-1f1fe.png and /dev/null differ
diff --git a/public/emoji/1f1f1-1f1fe.svg b/public/emoji/1f1f1-1f1fe.svg
index dd29b3b31e..74add1f6f6 100644
--- a/public/emoji/1f1f1-1f1fe.svg
+++ b/public/emoji/1f1f1-1f1fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f1.png b/public/emoji/1f1f1.png
deleted file mode 100644
index 7992b4f681..0000000000
Binary files a/public/emoji/1f1f1.png and /dev/null differ
diff --git a/public/emoji/1f1f1.svg b/public/emoji/1f1f1.svg
index 9239d516eb..dc299d45f1 100644
--- a/public/emoji/1f1f1.svg
+++ b/public/emoji/1f1f1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1e6.png b/public/emoji/1f1f2-1f1e6.png
deleted file mode 100644
index c4a056722c..0000000000
Binary files a/public/emoji/1f1f2-1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1e6.svg b/public/emoji/1f1f2-1f1e6.svg
index f2e7c5aab8..77421f18da 100644
--- a/public/emoji/1f1f2-1f1e6.svg
+++ b/public/emoji/1f1f2-1f1e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1e8.png b/public/emoji/1f1f2-1f1e8.png
deleted file mode 100644
index d479eab98c..0000000000
Binary files a/public/emoji/1f1f2-1f1e8.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1e8.svg b/public/emoji/1f1f2-1f1e8.svg
index a0228346b4..abc6746dcf 100644
--- a/public/emoji/1f1f2-1f1e8.svg
+++ b/public/emoji/1f1f2-1f1e8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1e9.png b/public/emoji/1f1f2-1f1e9.png
deleted file mode 100644
index a7a7253987..0000000000
Binary files a/public/emoji/1f1f2-1f1e9.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1e9.svg b/public/emoji/1f1f2-1f1e9.svg
index 76845b662f..b4f1fe18fe 100644
--- a/public/emoji/1f1f2-1f1e9.svg
+++ b/public/emoji/1f1f2-1f1e9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1ea.png b/public/emoji/1f1f2-1f1ea.png
deleted file mode 100644
index 7c771e7e12..0000000000
Binary files a/public/emoji/1f1f2-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1ea.svg b/public/emoji/1f1f2-1f1ea.svg
index 7eb38ad815..45e00923e6 100644
--- a/public/emoji/1f1f2-1f1ea.svg
+++ b/public/emoji/1f1f2-1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1eb.png b/public/emoji/1f1f2-1f1eb.png
deleted file mode 100644
index 70c761036b..0000000000
Binary files a/public/emoji/1f1f2-1f1eb.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1eb.svg b/public/emoji/1f1f2-1f1eb.svg
index 16bfba0cfe..359779e7f0 100644
--- a/public/emoji/1f1f2-1f1eb.svg
+++ b/public/emoji/1f1f2-1f1eb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1ec.png b/public/emoji/1f1f2-1f1ec.png
deleted file mode 100644
index 2f3ccdda76..0000000000
Binary files a/public/emoji/1f1f2-1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1ec.svg b/public/emoji/1f1f2-1f1ec.svg
index 3571c0a7f4..016e1c3601 100644
--- a/public/emoji/1f1f2-1f1ec.svg
+++ b/public/emoji/1f1f2-1f1ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1ed.png b/public/emoji/1f1f2-1f1ed.png
deleted file mode 100644
index 598016481c..0000000000
Binary files a/public/emoji/1f1f2-1f1ed.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1ed.svg b/public/emoji/1f1f2-1f1ed.svg
index bc53ad9667..9a82f6e4a6 100644
--- a/public/emoji/1f1f2-1f1ed.svg
+++ b/public/emoji/1f1f2-1f1ed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1f0.png b/public/emoji/1f1f2-1f1f0.png
deleted file mode 100644
index 7ba775ee75..0000000000
Binary files a/public/emoji/1f1f2-1f1f0.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1f0.svg b/public/emoji/1f1f2-1f1f0.svg
index 8a3bc3e7c6..d5602de7c7 100644
--- a/public/emoji/1f1f2-1f1f0.svg
+++ b/public/emoji/1f1f2-1f1f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1f1.png b/public/emoji/1f1f2-1f1f1.png
deleted file mode 100644
index 6834378546..0000000000
Binary files a/public/emoji/1f1f2-1f1f1.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1f1.svg b/public/emoji/1f1f2-1f1f1.svg
index 650d974a97..729816534f 100644
--- a/public/emoji/1f1f2-1f1f1.svg
+++ b/public/emoji/1f1f2-1f1f1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1f2.png b/public/emoji/1f1f2-1f1f2.png
deleted file mode 100644
index 37dc7d7159..0000000000
Binary files a/public/emoji/1f1f2-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1f2.svg b/public/emoji/1f1f2-1f1f2.svg
index 2df73cff5c..011a6a4d7d 100644
--- a/public/emoji/1f1f2-1f1f2.svg
+++ b/public/emoji/1f1f2-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1f3.png b/public/emoji/1f1f2-1f1f3.png
deleted file mode 100644
index 1f146bbcd1..0000000000
Binary files a/public/emoji/1f1f2-1f1f3.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1f3.svg b/public/emoji/1f1f2-1f1f3.svg
index bfb46eb047..6987e12624 100644
--- a/public/emoji/1f1f2-1f1f3.svg
+++ b/public/emoji/1f1f2-1f1f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1f4.png b/public/emoji/1f1f2-1f1f4.png
deleted file mode 100644
index 7edde31f64..0000000000
Binary files a/public/emoji/1f1f2-1f1f4.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1f4.svg b/public/emoji/1f1f2-1f1f4.svg
index 30c75b65a1..9c7fb53658 100644
--- a/public/emoji/1f1f2-1f1f4.svg
+++ b/public/emoji/1f1f2-1f1f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1f5.png b/public/emoji/1f1f2-1f1f5.png
deleted file mode 100644
index 17ec1c441e..0000000000
Binary files a/public/emoji/1f1f2-1f1f5.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1f5.svg b/public/emoji/1f1f2-1f1f5.svg
index 823a275f35..ea7005e64f 100644
--- a/public/emoji/1f1f2-1f1f5.svg
+++ b/public/emoji/1f1f2-1f1f5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1f6.png b/public/emoji/1f1f2-1f1f6.png
deleted file mode 100644
index 1e672dc908..0000000000
Binary files a/public/emoji/1f1f2-1f1f6.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1f6.svg b/public/emoji/1f1f2-1f1f6.svg
index 79c46fd4a1..3a12ec0501 100644
--- a/public/emoji/1f1f2-1f1f6.svg
+++ b/public/emoji/1f1f2-1f1f6.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1f7.png b/public/emoji/1f1f2-1f1f7.png
deleted file mode 100644
index f87de46eff..0000000000
Binary files a/public/emoji/1f1f2-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1f7.svg b/public/emoji/1f1f2-1f1f7.svg
index 7878b6bbfc..1cc8a6fff4 100644
--- a/public/emoji/1f1f2-1f1f7.svg
+++ b/public/emoji/1f1f2-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1f8.png b/public/emoji/1f1f2-1f1f8.png
deleted file mode 100644
index 480b0d4ebd..0000000000
Binary files a/public/emoji/1f1f2-1f1f8.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1f8.svg b/public/emoji/1f1f2-1f1f8.svg
index 97cb964c84..24d149b0ad 100644
--- a/public/emoji/1f1f2-1f1f8.svg
+++ b/public/emoji/1f1f2-1f1f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1f9.png b/public/emoji/1f1f2-1f1f9.png
deleted file mode 100644
index c9e1dbdce8..0000000000
Binary files a/public/emoji/1f1f2-1f1f9.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1f9.svg b/public/emoji/1f1f2-1f1f9.svg
index f244732753..98a364da95 100644
--- a/public/emoji/1f1f2-1f1f9.svg
+++ b/public/emoji/1f1f2-1f1f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1fa.png b/public/emoji/1f1f2-1f1fa.png
deleted file mode 100644
index 55b33cb7c3..0000000000
Binary files a/public/emoji/1f1f2-1f1fa.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1fa.svg b/public/emoji/1f1f2-1f1fa.svg
index 03c638846b..223c786e68 100644
--- a/public/emoji/1f1f2-1f1fa.svg
+++ b/public/emoji/1f1f2-1f1fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1fb.png b/public/emoji/1f1f2-1f1fb.png
deleted file mode 100644
index ce5867126a..0000000000
Binary files a/public/emoji/1f1f2-1f1fb.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1fb.svg b/public/emoji/1f1f2-1f1fb.svg
index 9326ae793a..87eba9d93f 100644
--- a/public/emoji/1f1f2-1f1fb.svg
+++ b/public/emoji/1f1f2-1f1fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1fc.png b/public/emoji/1f1f2-1f1fc.png
deleted file mode 100644
index 003d854840..0000000000
Binary files a/public/emoji/1f1f2-1f1fc.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1fc.svg b/public/emoji/1f1f2-1f1fc.svg
index 4fd4f5aefe..2dd553add9 100644
--- a/public/emoji/1f1f2-1f1fc.svg
+++ b/public/emoji/1f1f2-1f1fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1fd.png b/public/emoji/1f1f2-1f1fd.png
deleted file mode 100644
index 42572bcd0b..0000000000
Binary files a/public/emoji/1f1f2-1f1fd.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1fd.svg b/public/emoji/1f1f2-1f1fd.svg
index 7ccbceb6a4..fbb2ae056e 100644
--- a/public/emoji/1f1f2-1f1fd.svg
+++ b/public/emoji/1f1f2-1f1fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1fe.png b/public/emoji/1f1f2-1f1fe.png
deleted file mode 100644
index 17526c2674..0000000000
Binary files a/public/emoji/1f1f2-1f1fe.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1fe.svg b/public/emoji/1f1f2-1f1fe.svg
index 580bc7f9f4..97f472e19e 100644
--- a/public/emoji/1f1f2-1f1fe.svg
+++ b/public/emoji/1f1f2-1f1fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2-1f1ff.png b/public/emoji/1f1f2-1f1ff.png
deleted file mode 100644
index 2352a78e78..0000000000
Binary files a/public/emoji/1f1f2-1f1ff.png and /dev/null differ
diff --git a/public/emoji/1f1f2-1f1ff.svg b/public/emoji/1f1f2-1f1ff.svg
index 42ff00ceff..ddca4a7bd2 100644
--- a/public/emoji/1f1f2-1f1ff.svg
+++ b/public/emoji/1f1f2-1f1ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f2.png b/public/emoji/1f1f2.png
deleted file mode 100644
index 7b848b2ce2..0000000000
Binary files a/public/emoji/1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1f2.svg b/public/emoji/1f1f2.svg
index c04f37116d..595c1a8a72 100644
--- a/public/emoji/1f1f2.svg
+++ b/public/emoji/1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f3-1f1e6.png b/public/emoji/1f1f3-1f1e6.png
deleted file mode 100644
index ed31c3df04..0000000000
Binary files a/public/emoji/1f1f3-1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1f3-1f1e6.svg b/public/emoji/1f1f3-1f1e6.svg
index c53c7ddc6d..d8224397a7 100644
--- a/public/emoji/1f1f3-1f1e6.svg
+++ b/public/emoji/1f1f3-1f1e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f3-1f1e8.png b/public/emoji/1f1f3-1f1e8.png
deleted file mode 100644
index 90b3afebfa..0000000000
Binary files a/public/emoji/1f1f3-1f1e8.png and /dev/null differ
diff --git a/public/emoji/1f1f3-1f1e8.svg b/public/emoji/1f1f3-1f1e8.svg
index 7a9113f808..5a4999f5af 100644
--- a/public/emoji/1f1f3-1f1e8.svg
+++ b/public/emoji/1f1f3-1f1e8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f3-1f1ea.png b/public/emoji/1f1f3-1f1ea.png
deleted file mode 100644
index f98a1173c2..0000000000
Binary files a/public/emoji/1f1f3-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1f3-1f1ea.svg b/public/emoji/1f1f3-1f1ea.svg
index b7f4707888..b7d32ca125 100644
--- a/public/emoji/1f1f3-1f1ea.svg
+++ b/public/emoji/1f1f3-1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f3-1f1eb.png b/public/emoji/1f1f3-1f1eb.png
deleted file mode 100644
index 9099e76742..0000000000
Binary files a/public/emoji/1f1f3-1f1eb.png and /dev/null differ
diff --git a/public/emoji/1f1f3-1f1eb.svg b/public/emoji/1f1f3-1f1eb.svg
index 21005fb0d2..d8d25ec549 100644
--- a/public/emoji/1f1f3-1f1eb.svg
+++ b/public/emoji/1f1f3-1f1eb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f3-1f1ec.png b/public/emoji/1f1f3-1f1ec.png
deleted file mode 100644
index ea0abeff1a..0000000000
Binary files a/public/emoji/1f1f3-1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1f3-1f1ec.svg b/public/emoji/1f1f3-1f1ec.svg
index 0701d0cdf1..2e68813ae6 100644
--- a/public/emoji/1f1f3-1f1ec.svg
+++ b/public/emoji/1f1f3-1f1ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f3-1f1ee.png b/public/emoji/1f1f3-1f1ee.png
deleted file mode 100644
index 772920dfa1..0000000000
Binary files a/public/emoji/1f1f3-1f1ee.png and /dev/null differ
diff --git a/public/emoji/1f1f3-1f1ee.svg b/public/emoji/1f1f3-1f1ee.svg
index 8792eddc8d..d61e76bcdd 100644
--- a/public/emoji/1f1f3-1f1ee.svg
+++ b/public/emoji/1f1f3-1f1ee.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f3-1f1f1.png b/public/emoji/1f1f3-1f1f1.png
deleted file mode 100644
index 83a0e817e4..0000000000
Binary files a/public/emoji/1f1f3-1f1f1.png and /dev/null differ
diff --git a/public/emoji/1f1f3-1f1f1.svg b/public/emoji/1f1f3-1f1f1.svg
index c150ee5942..80adf56ddb 100644
--- a/public/emoji/1f1f3-1f1f1.svg
+++ b/public/emoji/1f1f3-1f1f1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f3-1f1f4.png b/public/emoji/1f1f3-1f1f4.png
deleted file mode 100644
index 99d3142eb7..0000000000
Binary files a/public/emoji/1f1f3-1f1f4.png and /dev/null differ
diff --git a/public/emoji/1f1f3-1f1f4.svg b/public/emoji/1f1f3-1f1f4.svg
index 85182d9839..f9a01310c6 100644
--- a/public/emoji/1f1f3-1f1f4.svg
+++ b/public/emoji/1f1f3-1f1f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f3-1f1f5.png b/public/emoji/1f1f3-1f1f5.png
deleted file mode 100644
index 87425a8dfe..0000000000
Binary files a/public/emoji/1f1f3-1f1f5.png and /dev/null differ
diff --git a/public/emoji/1f1f3-1f1f5.svg b/public/emoji/1f1f3-1f1f5.svg
index a1e7545bad..4c816f7a4e 100644
--- a/public/emoji/1f1f3-1f1f5.svg
+++ b/public/emoji/1f1f3-1f1f5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f3-1f1f7.png b/public/emoji/1f1f3-1f1f7.png
deleted file mode 100644
index b3e3a5d562..0000000000
Binary files a/public/emoji/1f1f3-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1f3-1f1f7.svg b/public/emoji/1f1f3-1f1f7.svg
index eba929277a..dcf7aa255e 100644
--- a/public/emoji/1f1f3-1f1f7.svg
+++ b/public/emoji/1f1f3-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f3-1f1fa.png b/public/emoji/1f1f3-1f1fa.png
deleted file mode 100644
index f03614443e..0000000000
Binary files a/public/emoji/1f1f3-1f1fa.png and /dev/null differ
diff --git a/public/emoji/1f1f3-1f1fa.svg b/public/emoji/1f1f3-1f1fa.svg
index f4b61fd5e6..20fa1fbfa7 100644
--- a/public/emoji/1f1f3-1f1fa.svg
+++ b/public/emoji/1f1f3-1f1fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f3-1f1ff.png b/public/emoji/1f1f3-1f1ff.png
deleted file mode 100644
index a4eeeab9cd..0000000000
Binary files a/public/emoji/1f1f3-1f1ff.png and /dev/null differ
diff --git a/public/emoji/1f1f3-1f1ff.svg b/public/emoji/1f1f3-1f1ff.svg
index 688b145c19..3d76eaf879 100644
--- a/public/emoji/1f1f3-1f1ff.svg
+++ b/public/emoji/1f1f3-1f1ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f3.png b/public/emoji/1f1f3.png
deleted file mode 100644
index 4a11e50438..0000000000
Binary files a/public/emoji/1f1f3.png and /dev/null differ
diff --git a/public/emoji/1f1f3.svg b/public/emoji/1f1f3.svg
index a32f055903..4736cc6eb3 100644
--- a/public/emoji/1f1f3.svg
+++ b/public/emoji/1f1f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f4-1f1f2.png b/public/emoji/1f1f4-1f1f2.png
deleted file mode 100644
index ea824ba31e..0000000000
Binary files a/public/emoji/1f1f4-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1f4-1f1f2.svg b/public/emoji/1f1f4-1f1f2.svg
index 3a23ddcb9f..95682a7bee 100644
--- a/public/emoji/1f1f4-1f1f2.svg
+++ b/public/emoji/1f1f4-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f4.png b/public/emoji/1f1f4.png
deleted file mode 100644
index 2a0760b315..0000000000
Binary files a/public/emoji/1f1f4.png and /dev/null differ
diff --git a/public/emoji/1f1f4.svg b/public/emoji/1f1f4.svg
index 079e2b1a9d..96fc0b1f49 100644
--- a/public/emoji/1f1f4.svg
+++ b/public/emoji/1f1f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5-1f1e6.png b/public/emoji/1f1f5-1f1e6.png
deleted file mode 100644
index c3091d8988..0000000000
Binary files a/public/emoji/1f1f5-1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1f5-1f1e6.svg b/public/emoji/1f1f5-1f1e6.svg
index cbeb3037f5..aa4edaa8ff 100644
--- a/public/emoji/1f1f5-1f1e6.svg
+++ b/public/emoji/1f1f5-1f1e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5-1f1ea.png b/public/emoji/1f1f5-1f1ea.png
deleted file mode 100644
index 39223aa9db..0000000000
Binary files a/public/emoji/1f1f5-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1f5-1f1ea.svg b/public/emoji/1f1f5-1f1ea.svg
index dab27b6367..17e8abe250 100644
--- a/public/emoji/1f1f5-1f1ea.svg
+++ b/public/emoji/1f1f5-1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5-1f1eb.png b/public/emoji/1f1f5-1f1eb.png
deleted file mode 100644
index 113445f8f6..0000000000
Binary files a/public/emoji/1f1f5-1f1eb.png and /dev/null differ
diff --git a/public/emoji/1f1f5-1f1eb.svg b/public/emoji/1f1f5-1f1eb.svg
index d68516daa7..8d2d874941 100644
--- a/public/emoji/1f1f5-1f1eb.svg
+++ b/public/emoji/1f1f5-1f1eb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5-1f1ec.png b/public/emoji/1f1f5-1f1ec.png
deleted file mode 100644
index 825e9dcb76..0000000000
Binary files a/public/emoji/1f1f5-1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1f5-1f1ec.svg b/public/emoji/1f1f5-1f1ec.svg
index 094bf895f5..a39a0e987c 100644
--- a/public/emoji/1f1f5-1f1ec.svg
+++ b/public/emoji/1f1f5-1f1ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5-1f1ed.png b/public/emoji/1f1f5-1f1ed.png
deleted file mode 100644
index 8260e15bd2..0000000000
Binary files a/public/emoji/1f1f5-1f1ed.png and /dev/null differ
diff --git a/public/emoji/1f1f5-1f1ed.svg b/public/emoji/1f1f5-1f1ed.svg
index 57ebde425a..17965b9eb3 100644
--- a/public/emoji/1f1f5-1f1ed.svg
+++ b/public/emoji/1f1f5-1f1ed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5-1f1f0.png b/public/emoji/1f1f5-1f1f0.png
deleted file mode 100644
index a7b6a1c507..0000000000
Binary files a/public/emoji/1f1f5-1f1f0.png and /dev/null differ
diff --git a/public/emoji/1f1f5-1f1f0.svg b/public/emoji/1f1f5-1f1f0.svg
index 3a8cfd9b26..f3cfa46689 100644
--- a/public/emoji/1f1f5-1f1f0.svg
+++ b/public/emoji/1f1f5-1f1f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5-1f1f1.png b/public/emoji/1f1f5-1f1f1.png
deleted file mode 100644
index 19de2edec1..0000000000
Binary files a/public/emoji/1f1f5-1f1f1.png and /dev/null differ
diff --git a/public/emoji/1f1f5-1f1f1.svg b/public/emoji/1f1f5-1f1f1.svg
index bf78dbbce8..bbc7f1ba91 100644
--- a/public/emoji/1f1f5-1f1f1.svg
+++ b/public/emoji/1f1f5-1f1f1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5-1f1f2.png b/public/emoji/1f1f5-1f1f2.png
deleted file mode 100644
index 2ca6055419..0000000000
Binary files a/public/emoji/1f1f5-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1f5-1f1f2.svg b/public/emoji/1f1f5-1f1f2.svg
index 517c6682a5..44e7282b8b 100644
--- a/public/emoji/1f1f5-1f1f2.svg
+++ b/public/emoji/1f1f5-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5-1f1f3.png b/public/emoji/1f1f5-1f1f3.png
deleted file mode 100644
index f2263b154b..0000000000
Binary files a/public/emoji/1f1f5-1f1f3.png and /dev/null differ
diff --git a/public/emoji/1f1f5-1f1f3.svg b/public/emoji/1f1f5-1f1f3.svg
index adf57ca1ab..e9d1c474e2 100644
--- a/public/emoji/1f1f5-1f1f3.svg
+++ b/public/emoji/1f1f5-1f1f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5-1f1f7.png b/public/emoji/1f1f5-1f1f7.png
deleted file mode 100644
index d0209cddb7..0000000000
Binary files a/public/emoji/1f1f5-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1f5-1f1f7.svg b/public/emoji/1f1f5-1f1f7.svg
index 9008a55851..5a384c0e75 100644
--- a/public/emoji/1f1f5-1f1f7.svg
+++ b/public/emoji/1f1f5-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5-1f1f8.png b/public/emoji/1f1f5-1f1f8.png
deleted file mode 100644
index 7ccab09778..0000000000
Binary files a/public/emoji/1f1f5-1f1f8.png and /dev/null differ
diff --git a/public/emoji/1f1f5-1f1f8.svg b/public/emoji/1f1f5-1f1f8.svg
index e3f5f42489..08f8d7f13f 100644
--- a/public/emoji/1f1f5-1f1f8.svg
+++ b/public/emoji/1f1f5-1f1f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5-1f1f9.png b/public/emoji/1f1f5-1f1f9.png
deleted file mode 100644
index cc93f27c64..0000000000
Binary files a/public/emoji/1f1f5-1f1f9.png and /dev/null differ
diff --git a/public/emoji/1f1f5-1f1f9.svg b/public/emoji/1f1f5-1f1f9.svg
index f4866075c2..81defcf3ad 100644
--- a/public/emoji/1f1f5-1f1f9.svg
+++ b/public/emoji/1f1f5-1f1f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5-1f1fc.png b/public/emoji/1f1f5-1f1fc.png
deleted file mode 100644
index 154b2f12d3..0000000000
Binary files a/public/emoji/1f1f5-1f1fc.png and /dev/null differ
diff --git a/public/emoji/1f1f5-1f1fc.svg b/public/emoji/1f1f5-1f1fc.svg
index a88c9f8fb1..4eaf0143ce 100644
--- a/public/emoji/1f1f5-1f1fc.svg
+++ b/public/emoji/1f1f5-1f1fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5-1f1fe.png b/public/emoji/1f1f5-1f1fe.png
deleted file mode 100644
index 662ad2f6ff..0000000000
Binary files a/public/emoji/1f1f5-1f1fe.png and /dev/null differ
diff --git a/public/emoji/1f1f5-1f1fe.svg b/public/emoji/1f1f5-1f1fe.svg
index 93e40d091d..1853d28da9 100644
--- a/public/emoji/1f1f5-1f1fe.svg
+++ b/public/emoji/1f1f5-1f1fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f5.png b/public/emoji/1f1f5.png
deleted file mode 100644
index bcb3298f99..0000000000
Binary files a/public/emoji/1f1f5.png and /dev/null differ
diff --git a/public/emoji/1f1f5.svg b/public/emoji/1f1f5.svg
index 2a769ae73a..c111c03866 100644
--- a/public/emoji/1f1f5.svg
+++ b/public/emoji/1f1f5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f6-1f1e6.png b/public/emoji/1f1f6-1f1e6.png
deleted file mode 100644
index a01d8b05cc..0000000000
Binary files a/public/emoji/1f1f6-1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1f6-1f1e6.svg b/public/emoji/1f1f6-1f1e6.svg
index 6c5ce7947f..0df0124967 100644
--- a/public/emoji/1f1f6-1f1e6.svg
+++ b/public/emoji/1f1f6-1f1e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f6.png b/public/emoji/1f1f6.png
deleted file mode 100644
index 6c92a9dfbc..0000000000
Binary files a/public/emoji/1f1f6.png and /dev/null differ
diff --git a/public/emoji/1f1f6.svg b/public/emoji/1f1f6.svg
index ea3e84d3c0..b3de8efbda 100644
--- a/public/emoji/1f1f6.svg
+++ b/public/emoji/1f1f6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f7-1f1ea.png b/public/emoji/1f1f7-1f1ea.png
deleted file mode 100644
index 57f2bbe9df..0000000000
Binary files a/public/emoji/1f1f7-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1f7-1f1ea.svg b/public/emoji/1f1f7-1f1ea.svg
index 634a34f5c2..ef15739e2d 100644
--- a/public/emoji/1f1f7-1f1ea.svg
+++ b/public/emoji/1f1f7-1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f7-1f1f4.png b/public/emoji/1f1f7-1f1f4.png
deleted file mode 100644
index 3e48c44770..0000000000
Binary files a/public/emoji/1f1f7-1f1f4.png and /dev/null differ
diff --git a/public/emoji/1f1f7-1f1f4.svg b/public/emoji/1f1f7-1f1f4.svg
index 20553c7714..3b3b6ab864 100644
--- a/public/emoji/1f1f7-1f1f4.svg
+++ b/public/emoji/1f1f7-1f1f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f7-1f1f8.png b/public/emoji/1f1f7-1f1f8.png
deleted file mode 100644
index 9df6c9a523..0000000000
Binary files a/public/emoji/1f1f7-1f1f8.png and /dev/null differ
diff --git a/public/emoji/1f1f7-1f1f8.svg b/public/emoji/1f1f7-1f1f8.svg
index 276ec5da58..5a2a165288 100644
--- a/public/emoji/1f1f7-1f1f8.svg
+++ b/public/emoji/1f1f7-1f1f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f7-1f1fa.png b/public/emoji/1f1f7-1f1fa.png
deleted file mode 100644
index e50c9db90e..0000000000
Binary files a/public/emoji/1f1f7-1f1fa.png and /dev/null differ
diff --git a/public/emoji/1f1f7-1f1fa.svg b/public/emoji/1f1f7-1f1fa.svg
index ba85d44e80..0c0949e69c 100644
--- a/public/emoji/1f1f7-1f1fa.svg
+++ b/public/emoji/1f1f7-1f1fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f7-1f1fc.png b/public/emoji/1f1f7-1f1fc.png
deleted file mode 100644
index c238c874e1..0000000000
Binary files a/public/emoji/1f1f7-1f1fc.png and /dev/null differ
diff --git a/public/emoji/1f1f7-1f1fc.svg b/public/emoji/1f1f7-1f1fc.svg
index d02fc12bac..11651f29b6 100644
--- a/public/emoji/1f1f7-1f1fc.svg
+++ b/public/emoji/1f1f7-1f1fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f7.png b/public/emoji/1f1f7.png
deleted file mode 100644
index 627892c912..0000000000
Binary files a/public/emoji/1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1f7.svg b/public/emoji/1f1f7.svg
index 1e8673ffa8..545c7700fa 100644
--- a/public/emoji/1f1f7.svg
+++ b/public/emoji/1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1e6.png b/public/emoji/1f1f8-1f1e6.png
deleted file mode 100644
index 4941be7d19..0000000000
Binary files a/public/emoji/1f1f8-1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1e6.svg b/public/emoji/1f1f8-1f1e6.svg
index 73d0b056b0..86d6527578 100644
--- a/public/emoji/1f1f8-1f1e6.svg
+++ b/public/emoji/1f1f8-1f1e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1e7.png b/public/emoji/1f1f8-1f1e7.png
deleted file mode 100644
index 7d8f1ac613..0000000000
Binary files a/public/emoji/1f1f8-1f1e7.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1e7.svg b/public/emoji/1f1f8-1f1e7.svg
index 1253585e93..f5629076f5 100644
--- a/public/emoji/1f1f8-1f1e7.svg
+++ b/public/emoji/1f1f8-1f1e7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1e8.png b/public/emoji/1f1f8-1f1e8.png
deleted file mode 100644
index 6ae4d90765..0000000000
Binary files a/public/emoji/1f1f8-1f1e8.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1e8.svg b/public/emoji/1f1f8-1f1e8.svg
index c1632e6964..2bafbc20c6 100644
--- a/public/emoji/1f1f8-1f1e8.svg
+++ b/public/emoji/1f1f8-1f1e8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1e9.png b/public/emoji/1f1f8-1f1e9.png
deleted file mode 100644
index 963be1b36f..0000000000
Binary files a/public/emoji/1f1f8-1f1e9.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1e9.svg b/public/emoji/1f1f8-1f1e9.svg
index 4fe07ce327..387ad34056 100644
--- a/public/emoji/1f1f8-1f1e9.svg
+++ b/public/emoji/1f1f8-1f1e9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1ea.png b/public/emoji/1f1f8-1f1ea.png
deleted file mode 100644
index fc0d0e0ce8..0000000000
Binary files a/public/emoji/1f1f8-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1ea.svg b/public/emoji/1f1f8-1f1ea.svg
index ccd38777ba..a84f573df1 100644
--- a/public/emoji/1f1f8-1f1ea.svg
+++ b/public/emoji/1f1f8-1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1ec.png b/public/emoji/1f1f8-1f1ec.png
deleted file mode 100644
index de3c7737c4..0000000000
Binary files a/public/emoji/1f1f8-1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1ec.svg b/public/emoji/1f1f8-1f1ec.svg
index 91caccd4ad..3d77757f4c 100644
--- a/public/emoji/1f1f8-1f1ec.svg
+++ b/public/emoji/1f1f8-1f1ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1ed.png b/public/emoji/1f1f8-1f1ed.png
deleted file mode 100644
index 40cd9e44e9..0000000000
Binary files a/public/emoji/1f1f8-1f1ed.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1ed.svg b/public/emoji/1f1f8-1f1ed.svg
index ac8dfd1a03..5ceca0d3f0 100644
--- a/public/emoji/1f1f8-1f1ed.svg
+++ b/public/emoji/1f1f8-1f1ed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1ee.png b/public/emoji/1f1f8-1f1ee.png
deleted file mode 100644
index e308999dba..0000000000
Binary files a/public/emoji/1f1f8-1f1ee.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1ee.svg b/public/emoji/1f1f8-1f1ee.svg
index 85338c99ca..aa66a1599c 100644
--- a/public/emoji/1f1f8-1f1ee.svg
+++ b/public/emoji/1f1f8-1f1ee.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1ef.png b/public/emoji/1f1f8-1f1ef.png
deleted file mode 100644
index 5884e64822..0000000000
Binary files a/public/emoji/1f1f8-1f1ef.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1ef.svg b/public/emoji/1f1f8-1f1ef.svg
index e9f5672c6f..f9a01310c6 100644
--- a/public/emoji/1f1f8-1f1ef.svg
+++ b/public/emoji/1f1f8-1f1ef.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1f0.png b/public/emoji/1f1f8-1f1f0.png
deleted file mode 100644
index 4259d0e141..0000000000
Binary files a/public/emoji/1f1f8-1f1f0.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1f0.svg b/public/emoji/1f1f8-1f1f0.svg
index 5b0e543563..d3a88c1dae 100644
--- a/public/emoji/1f1f8-1f1f0.svg
+++ b/public/emoji/1f1f8-1f1f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1f1.png b/public/emoji/1f1f8-1f1f1.png
deleted file mode 100644
index d2cc68830a..0000000000
Binary files a/public/emoji/1f1f8-1f1f1.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1f1.svg b/public/emoji/1f1f8-1f1f1.svg
index 50fafc2775..a03423c129 100644
--- a/public/emoji/1f1f8-1f1f1.svg
+++ b/public/emoji/1f1f8-1f1f1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1f2.png b/public/emoji/1f1f8-1f1f2.png
deleted file mode 100644
index 03b8708754..0000000000
Binary files a/public/emoji/1f1f8-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1f2.svg b/public/emoji/1f1f8-1f1f2.svg
index abe63183d3..d26d90e38c 100644
--- a/public/emoji/1f1f8-1f1f2.svg
+++ b/public/emoji/1f1f8-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1f3.png b/public/emoji/1f1f8-1f1f3.png
deleted file mode 100644
index 5368bbe93d..0000000000
Binary files a/public/emoji/1f1f8-1f1f3.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1f3.svg b/public/emoji/1f1f8-1f1f3.svg
index 548243e3b3..308ef03422 100644
--- a/public/emoji/1f1f8-1f1f3.svg
+++ b/public/emoji/1f1f8-1f1f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1f4.png b/public/emoji/1f1f8-1f1f4.png
deleted file mode 100644
index 68a0597365..0000000000
Binary files a/public/emoji/1f1f8-1f1f4.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1f4.svg b/public/emoji/1f1f8-1f1f4.svg
index 967be6174a..c205b1b37b 100644
--- a/public/emoji/1f1f8-1f1f4.svg
+++ b/public/emoji/1f1f8-1f1f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1f7.png b/public/emoji/1f1f8-1f1f7.png
deleted file mode 100644
index d325132703..0000000000
Binary files a/public/emoji/1f1f8-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1f7.svg b/public/emoji/1f1f8-1f1f7.svg
index 6348d1a785..d2b6e0fb50 100644
--- a/public/emoji/1f1f8-1f1f7.svg
+++ b/public/emoji/1f1f8-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1f8.png b/public/emoji/1f1f8-1f1f8.png
deleted file mode 100644
index 122977e798..0000000000
Binary files a/public/emoji/1f1f8-1f1f8.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1f8.svg b/public/emoji/1f1f8-1f1f8.svg
index 9bbb665424..e18f9e697b 100644
--- a/public/emoji/1f1f8-1f1f8.svg
+++ b/public/emoji/1f1f8-1f1f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1f9.png b/public/emoji/1f1f8-1f1f9.png
deleted file mode 100644
index f83a863d61..0000000000
Binary files a/public/emoji/1f1f8-1f1f9.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1f9.svg b/public/emoji/1f1f8-1f1f9.svg
index 08a1d8fbb4..2d5ef73c5c 100644
--- a/public/emoji/1f1f8-1f1f9.svg
+++ b/public/emoji/1f1f8-1f1f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1fb.png b/public/emoji/1f1f8-1f1fb.png
deleted file mode 100644
index efb83e2f25..0000000000
Binary files a/public/emoji/1f1f8-1f1fb.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1fb.svg b/public/emoji/1f1f8-1f1fb.svg
index 9c93704758..5081fb9482 100644
--- a/public/emoji/1f1f8-1f1fb.svg
+++ b/public/emoji/1f1f8-1f1fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1fd.png b/public/emoji/1f1f8-1f1fd.png
deleted file mode 100644
index 94b760fbed..0000000000
Binary files a/public/emoji/1f1f8-1f1fd.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1fd.svg b/public/emoji/1f1f8-1f1fd.svg
index b0cd97a077..00d7eb4d57 100644
--- a/public/emoji/1f1f8-1f1fd.svg
+++ b/public/emoji/1f1f8-1f1fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1fe.png b/public/emoji/1f1f8-1f1fe.png
deleted file mode 100644
index 09a8ee8f78..0000000000
Binary files a/public/emoji/1f1f8-1f1fe.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1fe.svg b/public/emoji/1f1f8-1f1fe.svg
index 62fbea40bf..d7c1df75a1 100644
--- a/public/emoji/1f1f8-1f1fe.svg
+++ b/public/emoji/1f1f8-1f1fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8-1f1ff.png b/public/emoji/1f1f8-1f1ff.png
deleted file mode 100644
index f74e82ea1f..0000000000
Binary files a/public/emoji/1f1f8-1f1ff.png and /dev/null differ
diff --git a/public/emoji/1f1f8-1f1ff.svg b/public/emoji/1f1f8-1f1ff.svg
index deafce4e2c..d6c470dd07 100644
--- a/public/emoji/1f1f8-1f1ff.svg
+++ b/public/emoji/1f1f8-1f1ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f8.png b/public/emoji/1f1f8.png
deleted file mode 100644
index 9d0dbf93af..0000000000
Binary files a/public/emoji/1f1f8.png and /dev/null differ
diff --git a/public/emoji/1f1f8.svg b/public/emoji/1f1f8.svg
index a39d2010ee..a73e5074c2 100644
--- a/public/emoji/1f1f8.svg
+++ b/public/emoji/1f1f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1e6.png b/public/emoji/1f1f9-1f1e6.png
deleted file mode 100644
index b44283e90e..0000000000
Binary files a/public/emoji/1f1f9-1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1e6.svg b/public/emoji/1f1f9-1f1e6.svg
index 68e6e9ce7c..84b5c1e7d9 100644
--- a/public/emoji/1f1f9-1f1e6.svg
+++ b/public/emoji/1f1f9-1f1e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1e8.png b/public/emoji/1f1f9-1f1e8.png
deleted file mode 100644
index 156b33d1ba..0000000000
Binary files a/public/emoji/1f1f9-1f1e8.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1e8.svg b/public/emoji/1f1f9-1f1e8.svg
index ba12e33df8..5f2b42d62c 100644
--- a/public/emoji/1f1f9-1f1e8.svg
+++ b/public/emoji/1f1f9-1f1e8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1e9.png b/public/emoji/1f1f9-1f1e9.png
deleted file mode 100644
index ebe7f59282..0000000000
Binary files a/public/emoji/1f1f9-1f1e9.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1e9.svg b/public/emoji/1f1f9-1f1e9.svg
index 3976073fb3..0e48d2772a 100644
--- a/public/emoji/1f1f9-1f1e9.svg
+++ b/public/emoji/1f1f9-1f1e9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1eb.png b/public/emoji/1f1f9-1f1eb.png
deleted file mode 100644
index a1a3ad68ee..0000000000
Binary files a/public/emoji/1f1f9-1f1eb.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1eb.svg b/public/emoji/1f1f9-1f1eb.svg
index f374f23f69..015fbf976e 100644
--- a/public/emoji/1f1f9-1f1eb.svg
+++ b/public/emoji/1f1f9-1f1eb.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1ec.png b/public/emoji/1f1f9-1f1ec.png
deleted file mode 100644
index 826b73c9ac..0000000000
Binary files a/public/emoji/1f1f9-1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1ec.svg b/public/emoji/1f1f9-1f1ec.svg
index 1c9e70f452..e4dc6d6d3d 100644
--- a/public/emoji/1f1f9-1f1ec.svg
+++ b/public/emoji/1f1f9-1f1ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1ed.png b/public/emoji/1f1f9-1f1ed.png
deleted file mode 100644
index 93ff542c5a..0000000000
Binary files a/public/emoji/1f1f9-1f1ed.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1ed.svg b/public/emoji/1f1f9-1f1ed.svg
index d5a54a4d89..426a60c8e3 100644
--- a/public/emoji/1f1f9-1f1ed.svg
+++ b/public/emoji/1f1f9-1f1ed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1ef.png b/public/emoji/1f1f9-1f1ef.png
deleted file mode 100644
index 7a8a0b6190..0000000000
Binary files a/public/emoji/1f1f9-1f1ef.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1ef.svg b/public/emoji/1f1f9-1f1ef.svg
index a7d29de9d0..126bc7c5aa 100644
--- a/public/emoji/1f1f9-1f1ef.svg
+++ b/public/emoji/1f1f9-1f1ef.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1f0.png b/public/emoji/1f1f9-1f1f0.png
deleted file mode 100644
index 2fa5a21b1b..0000000000
Binary files a/public/emoji/1f1f9-1f1f0.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1f0.svg b/public/emoji/1f1f9-1f1f0.svg
index 7c869591e2..ba9c6a1a6a 100644
--- a/public/emoji/1f1f9-1f1f0.svg
+++ b/public/emoji/1f1f9-1f1f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1f1.png b/public/emoji/1f1f9-1f1f1.png
deleted file mode 100644
index 5b120eccc6..0000000000
Binary files a/public/emoji/1f1f9-1f1f1.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1f1.svg b/public/emoji/1f1f9-1f1f1.svg
index 43e983ac30..1da3e65029 100644
--- a/public/emoji/1f1f9-1f1f1.svg
+++ b/public/emoji/1f1f9-1f1f1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1f2.png b/public/emoji/1f1f9-1f1f2.png
deleted file mode 100644
index c3c4f53230..0000000000
Binary files a/public/emoji/1f1f9-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1f2.svg b/public/emoji/1f1f9-1f1f2.svg
index 785f91cbbc..5dcd737a7a 100644
--- a/public/emoji/1f1f9-1f1f2.svg
+++ b/public/emoji/1f1f9-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1f3.png b/public/emoji/1f1f9-1f1f3.png
deleted file mode 100644
index 58ef161229..0000000000
Binary files a/public/emoji/1f1f9-1f1f3.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1f3.svg b/public/emoji/1f1f9-1f1f3.svg
index b27930a659..09b34992ae 100644
--- a/public/emoji/1f1f9-1f1f3.svg
+++ b/public/emoji/1f1f9-1f1f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1f4.png b/public/emoji/1f1f9-1f1f4.png
deleted file mode 100644
index 1ffa7bb9d1..0000000000
Binary files a/public/emoji/1f1f9-1f1f4.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1f4.svg b/public/emoji/1f1f9-1f1f4.svg
index 4adcb03430..cd4ae3094b 100644
--- a/public/emoji/1f1f9-1f1f4.svg
+++ b/public/emoji/1f1f9-1f1f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1f7.png b/public/emoji/1f1f9-1f1f7.png
deleted file mode 100644
index 325251fae8..0000000000
Binary files a/public/emoji/1f1f9-1f1f7.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1f7.svg b/public/emoji/1f1f9-1f1f7.svg
index 57ab90b7dd..d8fd78213e 100644
--- a/public/emoji/1f1f9-1f1f7.svg
+++ b/public/emoji/1f1f9-1f1f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1f9.png b/public/emoji/1f1f9-1f1f9.png
deleted file mode 100644
index ed3bb39a30..0000000000
Binary files a/public/emoji/1f1f9-1f1f9.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1f9.svg b/public/emoji/1f1f9-1f1f9.svg
index d0322a71a8..00bf8643a6 100644
--- a/public/emoji/1f1f9-1f1f9.svg
+++ b/public/emoji/1f1f9-1f1f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1fb.png b/public/emoji/1f1f9-1f1fb.png
deleted file mode 100644
index e82c65c7bb..0000000000
Binary files a/public/emoji/1f1f9-1f1fb.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1fb.svg b/public/emoji/1f1f9-1f1fb.svg
index e911e865f6..1a3d48f7e3 100644
--- a/public/emoji/1f1f9-1f1fb.svg
+++ b/public/emoji/1f1f9-1f1fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1fc.png b/public/emoji/1f1f9-1f1fc.png
deleted file mode 100644
index 3a8f00b592..0000000000
Binary files a/public/emoji/1f1f9-1f1fc.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1fc.svg b/public/emoji/1f1f9-1f1fc.svg
index 8ac4ed8312..948f05efe4 100644
--- a/public/emoji/1f1f9-1f1fc.svg
+++ b/public/emoji/1f1f9-1f1fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9-1f1ff.png b/public/emoji/1f1f9-1f1ff.png
deleted file mode 100644
index 2a020853d4..0000000000
Binary files a/public/emoji/1f1f9-1f1ff.png and /dev/null differ
diff --git a/public/emoji/1f1f9-1f1ff.svg b/public/emoji/1f1f9-1f1ff.svg
index 9e65b4b844..8a5cbf6804 100644
--- a/public/emoji/1f1f9-1f1ff.svg
+++ b/public/emoji/1f1f9-1f1ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1f9.png b/public/emoji/1f1f9.png
deleted file mode 100644
index 2d882f66b1..0000000000
Binary files a/public/emoji/1f1f9.png and /dev/null differ
diff --git a/public/emoji/1f1f9.svg b/public/emoji/1f1f9.svg
index 6d8e6eda82..c230bbcfc0 100644
--- a/public/emoji/1f1f9.svg
+++ b/public/emoji/1f1f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fa-1f1e6.png b/public/emoji/1f1fa-1f1e6.png
deleted file mode 100644
index cd84d1bbd3..0000000000
Binary files a/public/emoji/1f1fa-1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1fa-1f1e6.svg b/public/emoji/1f1fa-1f1e6.svg
index 3d4e0e3b59..6d7254dced 100644
--- a/public/emoji/1f1fa-1f1e6.svg
+++ b/public/emoji/1f1fa-1f1e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fa-1f1ec.png b/public/emoji/1f1fa-1f1ec.png
deleted file mode 100644
index dc97690eb5..0000000000
Binary files a/public/emoji/1f1fa-1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1fa-1f1ec.svg b/public/emoji/1f1fa-1f1ec.svg
index 450937689a..cc3422c620 100644
--- a/public/emoji/1f1fa-1f1ec.svg
+++ b/public/emoji/1f1fa-1f1ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fa-1f1f2.png b/public/emoji/1f1fa-1f1f2.png
deleted file mode 100644
index 4a7ee3cdf1..0000000000
Binary files a/public/emoji/1f1fa-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1fa-1f1f2.svg b/public/emoji/1f1fa-1f1f2.svg
index 48488ea245..a7e325796a 100644
--- a/public/emoji/1f1fa-1f1f2.svg
+++ b/public/emoji/1f1fa-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fa-1f1f3.svg b/public/emoji/1f1fa-1f1f3.svg
new file mode 100644
index 0000000000..825b32daca
--- /dev/null
+++ b/public/emoji/1f1fa-1f1f3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f1fa-1f1f8.png b/public/emoji/1f1fa-1f1f8.png
deleted file mode 100644
index 9f73030586..0000000000
Binary files a/public/emoji/1f1fa-1f1f8.png and /dev/null differ
diff --git a/public/emoji/1f1fa-1f1f8.svg b/public/emoji/1f1fa-1f1f8.svg
index 28e8578e17..a7e325796a 100644
--- a/public/emoji/1f1fa-1f1f8.svg
+++ b/public/emoji/1f1fa-1f1f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fa-1f1fe.png b/public/emoji/1f1fa-1f1fe.png
deleted file mode 100644
index b8002a697a..0000000000
Binary files a/public/emoji/1f1fa-1f1fe.png and /dev/null differ
diff --git a/public/emoji/1f1fa-1f1fe.svg b/public/emoji/1f1fa-1f1fe.svg
index bc4ad70037..dfd2535a09 100644
--- a/public/emoji/1f1fa-1f1fe.svg
+++ b/public/emoji/1f1fa-1f1fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fa-1f1ff.png b/public/emoji/1f1fa-1f1ff.png
deleted file mode 100644
index d56ca9bc42..0000000000
Binary files a/public/emoji/1f1fa-1f1ff.png and /dev/null differ
diff --git a/public/emoji/1f1fa-1f1ff.svg b/public/emoji/1f1fa-1f1ff.svg
index a6bb6cbfd2..b9997256eb 100644
--- a/public/emoji/1f1fa-1f1ff.svg
+++ b/public/emoji/1f1fa-1f1ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fa.png b/public/emoji/1f1fa.png
deleted file mode 100644
index ae0cabeb1c..0000000000
Binary files a/public/emoji/1f1fa.png and /dev/null differ
diff --git a/public/emoji/1f1fa.svg b/public/emoji/1f1fa.svg
index 9966d13230..1e7d298696 100644
--- a/public/emoji/1f1fa.svg
+++ b/public/emoji/1f1fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fb-1f1e6.png b/public/emoji/1f1fb-1f1e6.png
deleted file mode 100644
index ddaf5e3141..0000000000
Binary files a/public/emoji/1f1fb-1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1fb-1f1e6.svg b/public/emoji/1f1fb-1f1e6.svg
index d0078effe3..af4d696034 100644
--- a/public/emoji/1f1fb-1f1e6.svg
+++ b/public/emoji/1f1fb-1f1e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fb-1f1e8.png b/public/emoji/1f1fb-1f1e8.png
deleted file mode 100644
index 43703c62a7..0000000000
Binary files a/public/emoji/1f1fb-1f1e8.png and /dev/null differ
diff --git a/public/emoji/1f1fb-1f1e8.svg b/public/emoji/1f1fb-1f1e8.svg
index 5cafb43d9d..06ffac6988 100644
--- a/public/emoji/1f1fb-1f1e8.svg
+++ b/public/emoji/1f1fb-1f1e8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fb-1f1ea.png b/public/emoji/1f1fb-1f1ea.png
deleted file mode 100644
index 1b62796824..0000000000
Binary files a/public/emoji/1f1fb-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1fb-1f1ea.svg b/public/emoji/1f1fb-1f1ea.svg
index 8274ed0b4c..a4ed2d2aa1 100644
--- a/public/emoji/1f1fb-1f1ea.svg
+++ b/public/emoji/1f1fb-1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fb-1f1ec.png b/public/emoji/1f1fb-1f1ec.png
deleted file mode 100644
index 536f780f1c..0000000000
Binary files a/public/emoji/1f1fb-1f1ec.png and /dev/null differ
diff --git a/public/emoji/1f1fb-1f1ec.svg b/public/emoji/1f1fb-1f1ec.svg
index e5afefcad8..6357a52fac 100644
--- a/public/emoji/1f1fb-1f1ec.svg
+++ b/public/emoji/1f1fb-1f1ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fb-1f1ee.png b/public/emoji/1f1fb-1f1ee.png
deleted file mode 100644
index 64102012cf..0000000000
Binary files a/public/emoji/1f1fb-1f1ee.png and /dev/null differ
diff --git a/public/emoji/1f1fb-1f1ee.svg b/public/emoji/1f1fb-1f1ee.svg
index 2364a0c8c2..2f0b931945 100644
--- a/public/emoji/1f1fb-1f1ee.svg
+++ b/public/emoji/1f1fb-1f1ee.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fb-1f1f3.png b/public/emoji/1f1fb-1f1f3.png
deleted file mode 100644
index 427036046b..0000000000
Binary files a/public/emoji/1f1fb-1f1f3.png and /dev/null differ
diff --git a/public/emoji/1f1fb-1f1f3.svg b/public/emoji/1f1fb-1f1f3.svg
index a35b203fd6..d0b7daeb44 100644
--- a/public/emoji/1f1fb-1f1f3.svg
+++ b/public/emoji/1f1fb-1f1f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fb-1f1fa.png b/public/emoji/1f1fb-1f1fa.png
deleted file mode 100644
index 706eba4407..0000000000
Binary files a/public/emoji/1f1fb-1f1fa.png and /dev/null differ
diff --git a/public/emoji/1f1fb-1f1fa.svg b/public/emoji/1f1fb-1f1fa.svg
index 51ac13f4f6..7595f2f72d 100644
--- a/public/emoji/1f1fb-1f1fa.svg
+++ b/public/emoji/1f1fb-1f1fa.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fb.png b/public/emoji/1f1fb.png
deleted file mode 100644
index e01e179b45..0000000000
Binary files a/public/emoji/1f1fb.png and /dev/null differ
diff --git a/public/emoji/1f1fb.svg b/public/emoji/1f1fb.svg
index fd7586dca7..946cf36a1b 100644
--- a/public/emoji/1f1fb.svg
+++ b/public/emoji/1f1fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fc-1f1eb.png b/public/emoji/1f1fc-1f1eb.png
deleted file mode 100644
index 70c761036b..0000000000
Binary files a/public/emoji/1f1fc-1f1eb.png and /dev/null differ
diff --git a/public/emoji/1f1fc-1f1eb.svg b/public/emoji/1f1fc-1f1eb.svg
index 16bfba0cfe..b7d01ea663 100644
--- a/public/emoji/1f1fc-1f1eb.svg
+++ b/public/emoji/1f1fc-1f1eb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fc-1f1f8.png b/public/emoji/1f1fc-1f1f8.png
deleted file mode 100644
index a1ea070314..0000000000
Binary files a/public/emoji/1f1fc-1f1f8.png and /dev/null differ
diff --git a/public/emoji/1f1fc-1f1f8.svg b/public/emoji/1f1fc-1f1f8.svg
index 67b769ca6e..6e11aab766 100644
--- a/public/emoji/1f1fc-1f1f8.svg
+++ b/public/emoji/1f1fc-1f1f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fc.png b/public/emoji/1f1fc.png
deleted file mode 100644
index e8f614ac84..0000000000
Binary files a/public/emoji/1f1fc.png and /dev/null differ
diff --git a/public/emoji/1f1fc.svg b/public/emoji/1f1fc.svg
index 3f2ce79fd6..aed47a8820 100644
--- a/public/emoji/1f1fc.svg
+++ b/public/emoji/1f1fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fd-1f1f0.png b/public/emoji/1f1fd-1f1f0.png
deleted file mode 100644
index e587a44663..0000000000
Binary files a/public/emoji/1f1fd-1f1f0.png and /dev/null differ
diff --git a/public/emoji/1f1fd-1f1f0.svg b/public/emoji/1f1fd-1f1f0.svg
index 4a771e9381..4499d2cfd2 100644
--- a/public/emoji/1f1fd-1f1f0.svg
+++ b/public/emoji/1f1fd-1f1f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fd.png b/public/emoji/1f1fd.png
deleted file mode 100644
index e3bedba0be..0000000000
Binary files a/public/emoji/1f1fd.png and /dev/null differ
diff --git a/public/emoji/1f1fd.svg b/public/emoji/1f1fd.svg
index 0b95b597c0..9af21b8df4 100644
--- a/public/emoji/1f1fd.svg
+++ b/public/emoji/1f1fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fe-1f1ea.png b/public/emoji/1f1fe-1f1ea.png
deleted file mode 100644
index eadfebd5f6..0000000000
Binary files a/public/emoji/1f1fe-1f1ea.png and /dev/null differ
diff --git a/public/emoji/1f1fe-1f1ea.svg b/public/emoji/1f1fe-1f1ea.svg
index beeca62293..667d2ae899 100644
--- a/public/emoji/1f1fe-1f1ea.svg
+++ b/public/emoji/1f1fe-1f1ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1fe-1f1f9.png b/public/emoji/1f1fe-1f1f9.png
deleted file mode 100644
index c81fa6d886..0000000000
Binary files a/public/emoji/1f1fe-1f1f9.png and /dev/null differ
diff --git a/public/emoji/1f1fe-1f1f9.svg b/public/emoji/1f1fe-1f1f9.svg
index b2627bf9b9..5560649cba 100644
--- a/public/emoji/1f1fe-1f1f9.svg
+++ b/public/emoji/1f1fe-1f1f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml MAYOTTE
diff --git a/public/emoji/1f1fe.png b/public/emoji/1f1fe.png
deleted file mode 100644
index 9bfa7f2db9..0000000000
Binary files a/public/emoji/1f1fe.png and /dev/null differ
diff --git a/public/emoji/1f1fe.svg b/public/emoji/1f1fe.svg
index fe9e109c05..49eecb7d67 100644
--- a/public/emoji/1f1fe.svg
+++ b/public/emoji/1f1fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ff-1f1e6.png b/public/emoji/1f1ff-1f1e6.png
deleted file mode 100644
index f397ef5072..0000000000
Binary files a/public/emoji/1f1ff-1f1e6.png and /dev/null differ
diff --git a/public/emoji/1f1ff-1f1e6.svg b/public/emoji/1f1ff-1f1e6.svg
index 5253e63600..cb41b2ef6f 100644
--- a/public/emoji/1f1ff-1f1e6.svg
+++ b/public/emoji/1f1ff-1f1e6.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ff-1f1f2.png b/public/emoji/1f1ff-1f1f2.png
deleted file mode 100644
index 2494a31f66..0000000000
Binary files a/public/emoji/1f1ff-1f1f2.png and /dev/null differ
diff --git a/public/emoji/1f1ff-1f1f2.svg b/public/emoji/1f1ff-1f1f2.svg
index 16306c7393..25e86be032 100644
--- a/public/emoji/1f1ff-1f1f2.svg
+++ b/public/emoji/1f1ff-1f1f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ff-1f1fc.png b/public/emoji/1f1ff-1f1fc.png
deleted file mode 100644
index e09b9652be..0000000000
Binary files a/public/emoji/1f1ff-1f1fc.png and /dev/null differ
diff --git a/public/emoji/1f1ff-1f1fc.svg b/public/emoji/1f1ff-1f1fc.svg
index 77f539e5f4..aeb9a3c81c 100644
--- a/public/emoji/1f1ff-1f1fc.svg
+++ b/public/emoji/1f1ff-1f1fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f1ff.png b/public/emoji/1f1ff.png
deleted file mode 100644
index 5bf03f100c..0000000000
Binary files a/public/emoji/1f1ff.png and /dev/null differ
diff --git a/public/emoji/1f1ff.svg b/public/emoji/1f1ff.svg
index 133cd3cf3c..f8f7989891 100644
--- a/public/emoji/1f1ff.svg
+++ b/public/emoji/1f1ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f201.png b/public/emoji/1f201.png
deleted file mode 100644
index 6450eb44d9..0000000000
Binary files a/public/emoji/1f201.png and /dev/null differ
diff --git a/public/emoji/1f201.svg b/public/emoji/1f201.svg
index 44714e7ea3..824d957c38 100644
--- a/public/emoji/1f201.svg
+++ b/public/emoji/1f201.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f202.png b/public/emoji/1f202.png
deleted file mode 100644
index 900f963324..0000000000
Binary files a/public/emoji/1f202.png and /dev/null differ
diff --git a/public/emoji/1f202.svg b/public/emoji/1f202.svg
index a6e36bc7d9..b2c039cb77 100644
--- a/public/emoji/1f202.svg
+++ b/public/emoji/1f202.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f21a.png b/public/emoji/1f21a.png
deleted file mode 100644
index d3a19b420d..0000000000
Binary files a/public/emoji/1f21a.png and /dev/null differ
diff --git a/public/emoji/1f21a.svg b/public/emoji/1f21a.svg
index 74c92f22c7..1992f1d494 100644
--- a/public/emoji/1f21a.svg
+++ b/public/emoji/1f21a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f22f.png b/public/emoji/1f22f.png
deleted file mode 100644
index 078e23e4ff..0000000000
Binary files a/public/emoji/1f22f.png and /dev/null differ
diff --git a/public/emoji/1f22f.svg b/public/emoji/1f22f.svg
index 07d785adfb..265e896a91 100644
--- a/public/emoji/1f22f.svg
+++ b/public/emoji/1f22f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f232.png b/public/emoji/1f232.png
deleted file mode 100644
index 4c704e0343..0000000000
Binary files a/public/emoji/1f232.png and /dev/null differ
diff --git a/public/emoji/1f232.svg b/public/emoji/1f232.svg
index 5cc5826cef..442d11dcea 100644
--- a/public/emoji/1f232.svg
+++ b/public/emoji/1f232.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f233.png b/public/emoji/1f233.png
deleted file mode 100644
index 47966c1ea9..0000000000
Binary files a/public/emoji/1f233.png and /dev/null differ
diff --git a/public/emoji/1f233.svg b/public/emoji/1f233.svg
index ae8c7bdad5..c9de760809 100644
--- a/public/emoji/1f233.svg
+++ b/public/emoji/1f233.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f234.png b/public/emoji/1f234.png
deleted file mode 100644
index 8375ad9d9a..0000000000
Binary files a/public/emoji/1f234.png and /dev/null differ
diff --git a/public/emoji/1f234.svg b/public/emoji/1f234.svg
index ea346b6664..8d24fe0b14 100644
--- a/public/emoji/1f234.svg
+++ b/public/emoji/1f234.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f235.png b/public/emoji/1f235.png
deleted file mode 100644
index f9dea8b883..0000000000
Binary files a/public/emoji/1f235.png and /dev/null differ
diff --git a/public/emoji/1f235.svg b/public/emoji/1f235.svg
index ed4265dc3b..69992bd9b2 100644
--- a/public/emoji/1f235.svg
+++ b/public/emoji/1f235.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f236.png b/public/emoji/1f236.png
deleted file mode 100644
index a4510de41c..0000000000
Binary files a/public/emoji/1f236.png and /dev/null differ
diff --git a/public/emoji/1f236.svg b/public/emoji/1f236.svg
index 8d2d4e38f5..161b138988 100644
--- a/public/emoji/1f236.svg
+++ b/public/emoji/1f236.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f237.png b/public/emoji/1f237.png
deleted file mode 100644
index c41bd36a26..0000000000
Binary files a/public/emoji/1f237.png and /dev/null differ
diff --git a/public/emoji/1f237.svg b/public/emoji/1f237.svg
index 01c87d7759..a0590d6a3d 100644
--- a/public/emoji/1f237.svg
+++ b/public/emoji/1f237.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f238.png b/public/emoji/1f238.png
deleted file mode 100644
index 6b7af0ee22..0000000000
Binary files a/public/emoji/1f238.png and /dev/null differ
diff --git a/public/emoji/1f238.svg b/public/emoji/1f238.svg
index 2bec669007..913f6ee104 100644
--- a/public/emoji/1f238.svg
+++ b/public/emoji/1f238.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f239.png b/public/emoji/1f239.png
deleted file mode 100644
index c4f837fe68..0000000000
Binary files a/public/emoji/1f239.png and /dev/null differ
diff --git a/public/emoji/1f239.svg b/public/emoji/1f239.svg
index c989838cc6..a85431febc 100644
--- a/public/emoji/1f239.svg
+++ b/public/emoji/1f239.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f23a.png b/public/emoji/1f23a.png
deleted file mode 100644
index d21cb30eaf..0000000000
Binary files a/public/emoji/1f23a.png and /dev/null differ
diff --git a/public/emoji/1f23a.svg b/public/emoji/1f23a.svg
index 2c743f7f91..3b7447811b 100644
--- a/public/emoji/1f23a.svg
+++ b/public/emoji/1f23a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f250.png b/public/emoji/1f250.png
deleted file mode 100644
index 0c0d589caf..0000000000
Binary files a/public/emoji/1f250.png and /dev/null differ
diff --git a/public/emoji/1f250.svg b/public/emoji/1f250.svg
index 0518c4af6a..b33576a7a9 100644
--- a/public/emoji/1f250.svg
+++ b/public/emoji/1f250.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f251.png b/public/emoji/1f251.png
deleted file mode 100644
index 8afd7ce99c..0000000000
Binary files a/public/emoji/1f251.png and /dev/null differ
diff --git a/public/emoji/1f251.svg b/public/emoji/1f251.svg
index 4da18fa198..c47e05b218 100644
--- a/public/emoji/1f251.svg
+++ b/public/emoji/1f251.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f300.png b/public/emoji/1f300.png
deleted file mode 100644
index ff00b1afe7..0000000000
Binary files a/public/emoji/1f300.png and /dev/null differ
diff --git a/public/emoji/1f300.svg b/public/emoji/1f300.svg
index 00f6030869..2dc5286f77 100644
--- a/public/emoji/1f300.svg
+++ b/public/emoji/1f300.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f301.png b/public/emoji/1f301.png
deleted file mode 100644
index 57702d8d3a..0000000000
Binary files a/public/emoji/1f301.png and /dev/null differ
diff --git a/public/emoji/1f301.svg b/public/emoji/1f301.svg
index a94c77a88c..0ab7d698b4 100644
--- a/public/emoji/1f301.svg
+++ b/public/emoji/1f301.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f302.png b/public/emoji/1f302.png
deleted file mode 100644
index ecefba9e44..0000000000
Binary files a/public/emoji/1f302.png and /dev/null differ
diff --git a/public/emoji/1f302.svg b/public/emoji/1f302.svg
index 2e02d28950..881160d3a4 100644
--- a/public/emoji/1f302.svg
+++ b/public/emoji/1f302.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f303.png b/public/emoji/1f303.png
deleted file mode 100644
index ca2018f456..0000000000
Binary files a/public/emoji/1f303.png and /dev/null differ
diff --git a/public/emoji/1f303.svg b/public/emoji/1f303.svg
index cb533e58f4..958318bc8c 100644
--- a/public/emoji/1f303.svg
+++ b/public/emoji/1f303.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f304.png b/public/emoji/1f304.png
deleted file mode 100644
index 2b99307344..0000000000
Binary files a/public/emoji/1f304.png and /dev/null differ
diff --git a/public/emoji/1f304.svg b/public/emoji/1f304.svg
index 1d032f0828..9b9aab4d62 100644
--- a/public/emoji/1f304.svg
+++ b/public/emoji/1f304.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f305.png b/public/emoji/1f305.png
deleted file mode 100644
index 4ad36003c2..0000000000
Binary files a/public/emoji/1f305.png and /dev/null differ
diff --git a/public/emoji/1f305.svg b/public/emoji/1f305.svg
index dfc8498031..df6b2f0d56 100644
--- a/public/emoji/1f305.svg
+++ b/public/emoji/1f305.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f306.png b/public/emoji/1f306.png
deleted file mode 100644
index 80cdff7cf5..0000000000
Binary files a/public/emoji/1f306.png and /dev/null differ
diff --git a/public/emoji/1f306.svg b/public/emoji/1f306.svg
index 0bf2b32a9a..49a62d4990 100644
--- a/public/emoji/1f306.svg
+++ b/public/emoji/1f306.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f307.png b/public/emoji/1f307.png
deleted file mode 100644
index 7cded0ba55..0000000000
Binary files a/public/emoji/1f307.png and /dev/null differ
diff --git a/public/emoji/1f307.svg b/public/emoji/1f307.svg
index d6648a4902..03edebae16 100644
--- a/public/emoji/1f307.svg
+++ b/public/emoji/1f307.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f308.png b/public/emoji/1f308.png
deleted file mode 100644
index 154735d714..0000000000
Binary files a/public/emoji/1f308.png and /dev/null differ
diff --git a/public/emoji/1f308.svg b/public/emoji/1f308.svg
index 22ae3f5f84..000d18debd 100644
--- a/public/emoji/1f308.svg
+++ b/public/emoji/1f308.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f309.png b/public/emoji/1f309.png
deleted file mode 100644
index 1d444e0be6..0000000000
Binary files a/public/emoji/1f309.png and /dev/null differ
diff --git a/public/emoji/1f309.svg b/public/emoji/1f309.svg
index cdaab3191f..20776394b6 100644
--- a/public/emoji/1f309.svg
+++ b/public/emoji/1f309.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f30a.png b/public/emoji/1f30a.png
deleted file mode 100644
index 45ff1e8770..0000000000
Binary files a/public/emoji/1f30a.png and /dev/null differ
diff --git a/public/emoji/1f30a.svg b/public/emoji/1f30a.svg
index efdfafca58..e72edf1e6a 100644
--- a/public/emoji/1f30a.svg
+++ b/public/emoji/1f30a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f30b.png b/public/emoji/1f30b.png
deleted file mode 100644
index 931d569294..0000000000
Binary files a/public/emoji/1f30b.png and /dev/null differ
diff --git a/public/emoji/1f30b.svg b/public/emoji/1f30b.svg
index 51ce7a82ef..9d4ca18181 100644
--- a/public/emoji/1f30b.svg
+++ b/public/emoji/1f30b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f30c.png b/public/emoji/1f30c.png
deleted file mode 100644
index b2b8ac59c5..0000000000
Binary files a/public/emoji/1f30c.png and /dev/null differ
diff --git a/public/emoji/1f30c.svg b/public/emoji/1f30c.svg
index de7a0212d6..d6764f50fe 100644
--- a/public/emoji/1f30c.svg
+++ b/public/emoji/1f30c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f30d.png b/public/emoji/1f30d.png
deleted file mode 100644
index 66c3348c23..0000000000
Binary files a/public/emoji/1f30d.png and /dev/null differ
diff --git a/public/emoji/1f30d.svg b/public/emoji/1f30d.svg
index efe3dee5d4..d34b7012d1 100644
--- a/public/emoji/1f30d.svg
+++ b/public/emoji/1f30d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f30e.png b/public/emoji/1f30e.png
deleted file mode 100644
index 538c3cddd6..0000000000
Binary files a/public/emoji/1f30e.png and /dev/null differ
diff --git a/public/emoji/1f30e.svg b/public/emoji/1f30e.svg
index 96eb2c4a4b..609dd5c938 100644
--- a/public/emoji/1f30e.svg
+++ b/public/emoji/1f30e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f30f.png b/public/emoji/1f30f.png
deleted file mode 100644
index d8df97fec3..0000000000
Binary files a/public/emoji/1f30f.png and /dev/null differ
diff --git a/public/emoji/1f30f.svg b/public/emoji/1f30f.svg
index 3766698ba5..21b702ddbe 100644
--- a/public/emoji/1f30f.svg
+++ b/public/emoji/1f30f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f310.png b/public/emoji/1f310.png
deleted file mode 100644
index 82450c1a4b..0000000000
Binary files a/public/emoji/1f310.png and /dev/null differ
diff --git a/public/emoji/1f310.svg b/public/emoji/1f310.svg
index 5290ca39f7..fa1e93b6c9 100644
--- a/public/emoji/1f310.svg
+++ b/public/emoji/1f310.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f311.png b/public/emoji/1f311.png
deleted file mode 100644
index ecff72caa4..0000000000
Binary files a/public/emoji/1f311.png and /dev/null differ
diff --git a/public/emoji/1f311.svg b/public/emoji/1f311.svg
index 78fd41ea06..6b7dd3d8df 100644
--- a/public/emoji/1f311.svg
+++ b/public/emoji/1f311.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f312.png b/public/emoji/1f312.png
deleted file mode 100644
index 687125173d..0000000000
Binary files a/public/emoji/1f312.png and /dev/null differ
diff --git a/public/emoji/1f312.svg b/public/emoji/1f312.svg
index 7bae646ded..6b7680e369 100644
--- a/public/emoji/1f312.svg
+++ b/public/emoji/1f312.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f313.png b/public/emoji/1f313.png
deleted file mode 100644
index 5dccaf72a4..0000000000
Binary files a/public/emoji/1f313.png and /dev/null differ
diff --git a/public/emoji/1f313.svg b/public/emoji/1f313.svg
index 2a604a0f77..8ade662c72 100644
--- a/public/emoji/1f313.svg
+++ b/public/emoji/1f313.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f314.png b/public/emoji/1f314.png
deleted file mode 100644
index 3a80815631..0000000000
Binary files a/public/emoji/1f314.png and /dev/null differ
diff --git a/public/emoji/1f314.svg b/public/emoji/1f314.svg
index 8fd4cf6a78..1609b18e96 100644
--- a/public/emoji/1f314.svg
+++ b/public/emoji/1f314.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f315.png b/public/emoji/1f315.png
deleted file mode 100644
index c9a2d6aa7c..0000000000
Binary files a/public/emoji/1f315.png and /dev/null differ
diff --git a/public/emoji/1f315.svg b/public/emoji/1f315.svg
index cdcbea5971..e0143639f3 100644
--- a/public/emoji/1f315.svg
+++ b/public/emoji/1f315.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f316.png b/public/emoji/1f316.png
deleted file mode 100644
index 24e1626611..0000000000
Binary files a/public/emoji/1f316.png and /dev/null differ
diff --git a/public/emoji/1f316.svg b/public/emoji/1f316.svg
index 0e1aa7b986..c7a3390eb0 100644
--- a/public/emoji/1f316.svg
+++ b/public/emoji/1f316.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f317.png b/public/emoji/1f317.png
deleted file mode 100644
index 0842a0dd40..0000000000
Binary files a/public/emoji/1f317.png and /dev/null differ
diff --git a/public/emoji/1f317.svg b/public/emoji/1f317.svg
index fe9e6db9d5..2c63c0179d 100644
--- a/public/emoji/1f317.svg
+++ b/public/emoji/1f317.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f318.png b/public/emoji/1f318.png
deleted file mode 100644
index cf68706b87..0000000000
Binary files a/public/emoji/1f318.png and /dev/null differ
diff --git a/public/emoji/1f318.svg b/public/emoji/1f318.svg
index 0cc59a6d05..0cd9693b57 100644
--- a/public/emoji/1f318.svg
+++ b/public/emoji/1f318.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f319.png b/public/emoji/1f319.png
deleted file mode 100644
index 765420ecec..0000000000
Binary files a/public/emoji/1f319.png and /dev/null differ
diff --git a/public/emoji/1f319.svg b/public/emoji/1f319.svg
index 3fd5b28f93..a05283d37c 100644
--- a/public/emoji/1f319.svg
+++ b/public/emoji/1f319.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f31a.png b/public/emoji/1f31a.png
deleted file mode 100644
index 150dd12400..0000000000
Binary files a/public/emoji/1f31a.png and /dev/null differ
diff --git a/public/emoji/1f31a.svg b/public/emoji/1f31a.svg
index 201d831f2a..ea21d3f3d7 100644
--- a/public/emoji/1f31a.svg
+++ b/public/emoji/1f31a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f31b.png b/public/emoji/1f31b.png
deleted file mode 100644
index cd8a3d7acd..0000000000
Binary files a/public/emoji/1f31b.png and /dev/null differ
diff --git a/public/emoji/1f31b.svg b/public/emoji/1f31b.svg
index 1f67f817da..14707c9d2c 100644
--- a/public/emoji/1f31b.svg
+++ b/public/emoji/1f31b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f31c.png b/public/emoji/1f31c.png
deleted file mode 100644
index 94099343c5..0000000000
Binary files a/public/emoji/1f31c.png and /dev/null differ
diff --git a/public/emoji/1f31c.svg b/public/emoji/1f31c.svg
index 53b98ca502..b1c8b52509 100644
--- a/public/emoji/1f31c.svg
+++ b/public/emoji/1f31c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f31d.png b/public/emoji/1f31d.png
deleted file mode 100644
index a5c25bbaf6..0000000000
Binary files a/public/emoji/1f31d.png and /dev/null differ
diff --git a/public/emoji/1f31d.svg b/public/emoji/1f31d.svg
index 90c6d5019e..cc75e8a567 100644
--- a/public/emoji/1f31d.svg
+++ b/public/emoji/1f31d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f31e.png b/public/emoji/1f31e.png
deleted file mode 100644
index 14a4ea971d..0000000000
Binary files a/public/emoji/1f31e.png and /dev/null differ
diff --git a/public/emoji/1f31e.svg b/public/emoji/1f31e.svg
index f86c173d6e..f694aa74aa 100644
--- a/public/emoji/1f31e.svg
+++ b/public/emoji/1f31e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f31f.png b/public/emoji/1f31f.png
deleted file mode 100644
index 2f5cba592d..0000000000
Binary files a/public/emoji/1f31f.png and /dev/null differ
diff --git a/public/emoji/1f31f.svg b/public/emoji/1f31f.svg
index 13565256fd..ac88d0d942 100644
--- a/public/emoji/1f31f.svg
+++ b/public/emoji/1f31f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f320.png b/public/emoji/1f320.png
deleted file mode 100644
index aa45384d1c..0000000000
Binary files a/public/emoji/1f320.png and /dev/null differ
diff --git a/public/emoji/1f320.svg b/public/emoji/1f320.svg
index c79d56a39b..5d54372e39 100644
--- a/public/emoji/1f320.svg
+++ b/public/emoji/1f320.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f321.png b/public/emoji/1f321.png
deleted file mode 100644
index b114739242..0000000000
Binary files a/public/emoji/1f321.png and /dev/null differ
diff --git a/public/emoji/1f321.svg b/public/emoji/1f321.svg
index b6419126b8..8f55e77e1f 100644
--- a/public/emoji/1f321.svg
+++ b/public/emoji/1f321.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f324.png b/public/emoji/1f324.png
deleted file mode 100644
index cead0bfa52..0000000000
Binary files a/public/emoji/1f324.png and /dev/null differ
diff --git a/public/emoji/1f324.svg b/public/emoji/1f324.svg
index 0bfacd23d6..b5d8293cee 100644
--- a/public/emoji/1f324.svg
+++ b/public/emoji/1f324.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f325.png b/public/emoji/1f325.png
deleted file mode 100644
index 0a4cc10026..0000000000
Binary files a/public/emoji/1f325.png and /dev/null differ
diff --git a/public/emoji/1f325.svg b/public/emoji/1f325.svg
index 41fc0560ce..8155577a34 100644
--- a/public/emoji/1f325.svg
+++ b/public/emoji/1f325.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f326.png b/public/emoji/1f326.png
deleted file mode 100644
index 491f9ca483..0000000000
Binary files a/public/emoji/1f326.png and /dev/null differ
diff --git a/public/emoji/1f326.svg b/public/emoji/1f326.svg
index 8f83b295f2..383aa2e972 100644
--- a/public/emoji/1f326.svg
+++ b/public/emoji/1f326.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f327.png b/public/emoji/1f327.png
deleted file mode 100644
index 385685e051..0000000000
Binary files a/public/emoji/1f327.png and /dev/null differ
diff --git a/public/emoji/1f327.svg b/public/emoji/1f327.svg
index 52e6a1eff2..2ff8cdfa3e 100644
--- a/public/emoji/1f327.svg
+++ b/public/emoji/1f327.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f328.png b/public/emoji/1f328.png
deleted file mode 100644
index 9720384eb9..0000000000
Binary files a/public/emoji/1f328.png and /dev/null differ
diff --git a/public/emoji/1f328.svg b/public/emoji/1f328.svg
index dc0e858a89..35476fa954 100644
--- a/public/emoji/1f328.svg
+++ b/public/emoji/1f328.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f329.png b/public/emoji/1f329.png
deleted file mode 100644
index 0831e88aa3..0000000000
Binary files a/public/emoji/1f329.png and /dev/null differ
diff --git a/public/emoji/1f329.svg b/public/emoji/1f329.svg
index d7844b627b..88bf05d374 100644
--- a/public/emoji/1f329.svg
+++ b/public/emoji/1f329.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f32a.png b/public/emoji/1f32a.png
deleted file mode 100644
index 4821c89da1..0000000000
Binary files a/public/emoji/1f32a.png and /dev/null differ
diff --git a/public/emoji/1f32a.svg b/public/emoji/1f32a.svg
index 87326d990b..ca5c1694a2 100644
--- a/public/emoji/1f32a.svg
+++ b/public/emoji/1f32a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f32b.png b/public/emoji/1f32b.png
deleted file mode 100644
index 4e73c2de27..0000000000
Binary files a/public/emoji/1f32b.png and /dev/null differ
diff --git a/public/emoji/1f32b.svg b/public/emoji/1f32b.svg
index a294ee341f..f22dfdd849 100644
--- a/public/emoji/1f32b.svg
+++ b/public/emoji/1f32b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f32c.png b/public/emoji/1f32c.png
deleted file mode 100644
index df81b652eb..0000000000
Binary files a/public/emoji/1f32c.png and /dev/null differ
diff --git a/public/emoji/1f32c.svg b/public/emoji/1f32c.svg
index 652f28b7c9..cb0615f1b6 100644
--- a/public/emoji/1f32c.svg
+++ b/public/emoji/1f32c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f32d.png b/public/emoji/1f32d.png
deleted file mode 100644
index 3c3354d94c..0000000000
Binary files a/public/emoji/1f32d.png and /dev/null differ
diff --git a/public/emoji/1f32d.svg b/public/emoji/1f32d.svg
index e9acb62da3..e4c7c5b617 100644
--- a/public/emoji/1f32d.svg
+++ b/public/emoji/1f32d.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f32e.png b/public/emoji/1f32e.png
deleted file mode 100644
index 10e847a461..0000000000
Binary files a/public/emoji/1f32e.png and /dev/null differ
diff --git a/public/emoji/1f32e.svg b/public/emoji/1f32e.svg
index 7ce2afabed..1ed1f80c85 100644
--- a/public/emoji/1f32e.svg
+++ b/public/emoji/1f32e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f32f.png b/public/emoji/1f32f.png
deleted file mode 100644
index 02bd5601df..0000000000
Binary files a/public/emoji/1f32f.png and /dev/null differ
diff --git a/public/emoji/1f32f.svg b/public/emoji/1f32f.svg
index 6ae9039022..78023dd5de 100644
--- a/public/emoji/1f32f.svg
+++ b/public/emoji/1f32f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f330.png b/public/emoji/1f330.png
deleted file mode 100644
index e9fb40468e..0000000000
Binary files a/public/emoji/1f330.png and /dev/null differ
diff --git a/public/emoji/1f330.svg b/public/emoji/1f330.svg
index 5def656045..2bdaacc0ce 100644
--- a/public/emoji/1f330.svg
+++ b/public/emoji/1f330.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f331.png b/public/emoji/1f331.png
deleted file mode 100644
index ae0948bcfd..0000000000
Binary files a/public/emoji/1f331.png and /dev/null differ
diff --git a/public/emoji/1f331.svg b/public/emoji/1f331.svg
index 90f17ee296..3fbe3c8198 100644
--- a/public/emoji/1f331.svg
+++ b/public/emoji/1f331.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f332.png b/public/emoji/1f332.png
deleted file mode 100644
index f679d8dd77..0000000000
Binary files a/public/emoji/1f332.png and /dev/null differ
diff --git a/public/emoji/1f332.svg b/public/emoji/1f332.svg
index be20988631..6c6ce55050 100644
--- a/public/emoji/1f332.svg
+++ b/public/emoji/1f332.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f333.png b/public/emoji/1f333.png
deleted file mode 100644
index 785fc1c30e..0000000000
Binary files a/public/emoji/1f333.png and /dev/null differ
diff --git a/public/emoji/1f333.svg b/public/emoji/1f333.svg
index 4f29da350e..27070cdc13 100644
--- a/public/emoji/1f333.svg
+++ b/public/emoji/1f333.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f334.png b/public/emoji/1f334.png
deleted file mode 100644
index 4bbb10f4f1..0000000000
Binary files a/public/emoji/1f334.png and /dev/null differ
diff --git a/public/emoji/1f334.svg b/public/emoji/1f334.svg
index b0cec6d92d..e20f94e276 100644
--- a/public/emoji/1f334.svg
+++ b/public/emoji/1f334.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f335.png b/public/emoji/1f335.png
deleted file mode 100644
index 9b48ccf3d0..0000000000
Binary files a/public/emoji/1f335.png and /dev/null differ
diff --git a/public/emoji/1f335.svg b/public/emoji/1f335.svg
index b980aad283..972a1fc9ba 100644
--- a/public/emoji/1f335.svg
+++ b/public/emoji/1f335.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f336.png b/public/emoji/1f336.png
deleted file mode 100644
index 266675bd57..0000000000
Binary files a/public/emoji/1f336.png and /dev/null differ
diff --git a/public/emoji/1f336.svg b/public/emoji/1f336.svg
index 3763d91d28..a5f14a3bb5 100644
--- a/public/emoji/1f336.svg
+++ b/public/emoji/1f336.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f337.png b/public/emoji/1f337.png
deleted file mode 100644
index f799d75c18..0000000000
Binary files a/public/emoji/1f337.png and /dev/null differ
diff --git a/public/emoji/1f337.svg b/public/emoji/1f337.svg
index 6512189415..0c5a2c362d 100644
--- a/public/emoji/1f337.svg
+++ b/public/emoji/1f337.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f338.png b/public/emoji/1f338.png
deleted file mode 100644
index 282f3e7bc8..0000000000
Binary files a/public/emoji/1f338.png and /dev/null differ
diff --git a/public/emoji/1f338.svg b/public/emoji/1f338.svg
index eb6d6da7b9..8188ae92ae 100644
--- a/public/emoji/1f338.svg
+++ b/public/emoji/1f338.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f339.png b/public/emoji/1f339.png
deleted file mode 100644
index 52c286d31c..0000000000
Binary files a/public/emoji/1f339.png and /dev/null differ
diff --git a/public/emoji/1f339.svg b/public/emoji/1f339.svg
index e7122eb323..66a4b9c6a0 100644
--- a/public/emoji/1f339.svg
+++ b/public/emoji/1f339.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f33a.png b/public/emoji/1f33a.png
deleted file mode 100644
index 39dd352423..0000000000
Binary files a/public/emoji/1f33a.png and /dev/null differ
diff --git a/public/emoji/1f33a.svg b/public/emoji/1f33a.svg
index 557788787f..19e7e30010 100644
--- a/public/emoji/1f33a.svg
+++ b/public/emoji/1f33a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f33b.png b/public/emoji/1f33b.png
deleted file mode 100644
index 08cc07761e..0000000000
Binary files a/public/emoji/1f33b.png and /dev/null differ
diff --git a/public/emoji/1f33b.svg b/public/emoji/1f33b.svg
index 3834929fe1..b39eabf1c4 100644
--- a/public/emoji/1f33b.svg
+++ b/public/emoji/1f33b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f33c.png b/public/emoji/1f33c.png
deleted file mode 100644
index 4083026c15..0000000000
Binary files a/public/emoji/1f33c.png and /dev/null differ
diff --git a/public/emoji/1f33c.svg b/public/emoji/1f33c.svg
index 15d4207358..3242c56f70 100644
--- a/public/emoji/1f33c.svg
+++ b/public/emoji/1f33c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f33d.png b/public/emoji/1f33d.png
deleted file mode 100644
index 36e2012793..0000000000
Binary files a/public/emoji/1f33d.png and /dev/null differ
diff --git a/public/emoji/1f33d.svg b/public/emoji/1f33d.svg
index 074139da8c..8e542a0381 100644
--- a/public/emoji/1f33d.svg
+++ b/public/emoji/1f33d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f33e.png b/public/emoji/1f33e.png
deleted file mode 100644
index 3564d9d643..0000000000
Binary files a/public/emoji/1f33e.png and /dev/null differ
diff --git a/public/emoji/1f33e.svg b/public/emoji/1f33e.svg
index 5b02cf7cb7..ce4151b06b 100644
--- a/public/emoji/1f33e.svg
+++ b/public/emoji/1f33e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f33f.png b/public/emoji/1f33f.png
deleted file mode 100644
index d984d1562b..0000000000
Binary files a/public/emoji/1f33f.png and /dev/null differ
diff --git a/public/emoji/1f33f.svg b/public/emoji/1f33f.svg
index 174e90223c..48fb3f3fd9 100644
--- a/public/emoji/1f33f.svg
+++ b/public/emoji/1f33f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f340.png b/public/emoji/1f340.png
deleted file mode 100644
index fdedfcc2b4..0000000000
Binary files a/public/emoji/1f340.png and /dev/null differ
diff --git a/public/emoji/1f340.svg b/public/emoji/1f340.svg
index 0b06567d5e..1685a7ca1e 100644
--- a/public/emoji/1f340.svg
+++ b/public/emoji/1f340.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f341.png b/public/emoji/1f341.png
deleted file mode 100644
index c49acea67f..0000000000
Binary files a/public/emoji/1f341.png and /dev/null differ
diff --git a/public/emoji/1f341.svg b/public/emoji/1f341.svg
index 35a4563626..2b65956e15 100644
--- a/public/emoji/1f341.svg
+++ b/public/emoji/1f341.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f342.png b/public/emoji/1f342.png
deleted file mode 100644
index 0d60e7bdf2..0000000000
Binary files a/public/emoji/1f342.png and /dev/null differ
diff --git a/public/emoji/1f342.svg b/public/emoji/1f342.svg
index 7ca377c873..e03bcc4de1 100644
--- a/public/emoji/1f342.svg
+++ b/public/emoji/1f342.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f343.png b/public/emoji/1f343.png
deleted file mode 100644
index 1e43e1af82..0000000000
Binary files a/public/emoji/1f343.png and /dev/null differ
diff --git a/public/emoji/1f343.svg b/public/emoji/1f343.svg
index c19539d9d0..ec4e9d7f66 100644
--- a/public/emoji/1f343.svg
+++ b/public/emoji/1f343.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f344.png b/public/emoji/1f344.png
deleted file mode 100644
index dd85742ba2..0000000000
Binary files a/public/emoji/1f344.png and /dev/null differ
diff --git a/public/emoji/1f344.svg b/public/emoji/1f344.svg
index 853a49d20c..2ebc9dd2ea 100644
--- a/public/emoji/1f344.svg
+++ b/public/emoji/1f344.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f345.png b/public/emoji/1f345.png
deleted file mode 100644
index 497da8f6b2..0000000000
Binary files a/public/emoji/1f345.png and /dev/null differ
diff --git a/public/emoji/1f345.svg b/public/emoji/1f345.svg
index b0f3efc4e0..6921847d17 100644
--- a/public/emoji/1f345.svg
+++ b/public/emoji/1f345.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f346.png b/public/emoji/1f346.png
deleted file mode 100644
index fafd7c1a14..0000000000
Binary files a/public/emoji/1f346.png and /dev/null differ
diff --git a/public/emoji/1f346.svg b/public/emoji/1f346.svg
index 78a52f6c8e..a6eb936473 100644
--- a/public/emoji/1f346.svg
+++ b/public/emoji/1f346.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f347.png b/public/emoji/1f347.png
deleted file mode 100644
index 30d2221889..0000000000
Binary files a/public/emoji/1f347.png and /dev/null differ
diff --git a/public/emoji/1f347.svg b/public/emoji/1f347.svg
index e924fc2163..bbcc06a293 100644
--- a/public/emoji/1f347.svg
+++ b/public/emoji/1f347.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f348.png b/public/emoji/1f348.png
deleted file mode 100644
index c01232d419..0000000000
Binary files a/public/emoji/1f348.png and /dev/null differ
diff --git a/public/emoji/1f348.svg b/public/emoji/1f348.svg
index d715aaa252..ddd15f6312 100644
--- a/public/emoji/1f348.svg
+++ b/public/emoji/1f348.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f349.png b/public/emoji/1f349.png
deleted file mode 100644
index 0761488b4c..0000000000
Binary files a/public/emoji/1f349.png and /dev/null differ
diff --git a/public/emoji/1f349.svg b/public/emoji/1f349.svg
index 0f7a175f77..4ba2a40d95 100644
--- a/public/emoji/1f349.svg
+++ b/public/emoji/1f349.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f34a.png b/public/emoji/1f34a.png
deleted file mode 100644
index ab14e5378d..0000000000
Binary files a/public/emoji/1f34a.png and /dev/null differ
diff --git a/public/emoji/1f34a.svg b/public/emoji/1f34a.svg
index a6c48c5ff0..8dc08a76cc 100644
--- a/public/emoji/1f34a.svg
+++ b/public/emoji/1f34a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f34b.png b/public/emoji/1f34b.png
deleted file mode 100644
index 9a7d95ca22..0000000000
Binary files a/public/emoji/1f34b.png and /dev/null differ
diff --git a/public/emoji/1f34b.svg b/public/emoji/1f34b.svg
index e6dafd4c74..6a4aea458c 100644
--- a/public/emoji/1f34b.svg
+++ b/public/emoji/1f34b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f34c.png b/public/emoji/1f34c.png
deleted file mode 100644
index f498727958..0000000000
Binary files a/public/emoji/1f34c.png and /dev/null differ
diff --git a/public/emoji/1f34c.svg b/public/emoji/1f34c.svg
index 9f7af936f1..19a2413fe5 100644
--- a/public/emoji/1f34c.svg
+++ b/public/emoji/1f34c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f34d.png b/public/emoji/1f34d.png
deleted file mode 100644
index c89a160646..0000000000
Binary files a/public/emoji/1f34d.png and /dev/null differ
diff --git a/public/emoji/1f34d.svg b/public/emoji/1f34d.svg
index 350c11f281..ed6150475e 100644
--- a/public/emoji/1f34d.svg
+++ b/public/emoji/1f34d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f34e.png b/public/emoji/1f34e.png
deleted file mode 100644
index da650c60f6..0000000000
Binary files a/public/emoji/1f34e.png and /dev/null differ
diff --git a/public/emoji/1f34e.svg b/public/emoji/1f34e.svg
index 1353d5dd57..47576d4e58 100644
--- a/public/emoji/1f34e.svg
+++ b/public/emoji/1f34e.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f34f.png b/public/emoji/1f34f.png
deleted file mode 100644
index 5fd51bd391..0000000000
Binary files a/public/emoji/1f34f.png and /dev/null differ
diff --git a/public/emoji/1f34f.svg b/public/emoji/1f34f.svg
index 27561bc31d..8210910416 100644
--- a/public/emoji/1f34f.svg
+++ b/public/emoji/1f34f.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f350.png b/public/emoji/1f350.png
deleted file mode 100644
index 3869f718bc..0000000000
Binary files a/public/emoji/1f350.png and /dev/null differ
diff --git a/public/emoji/1f350.svg b/public/emoji/1f350.svg
index 467a86e13a..161fe7a943 100644
--- a/public/emoji/1f350.svg
+++ b/public/emoji/1f350.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f351.png b/public/emoji/1f351.png
deleted file mode 100644
index 9ab57cbb75..0000000000
Binary files a/public/emoji/1f351.png and /dev/null differ
diff --git a/public/emoji/1f351.svg b/public/emoji/1f351.svg
index 574969a8e8..2f6beeebe3 100644
--- a/public/emoji/1f351.svg
+++ b/public/emoji/1f351.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f352.png b/public/emoji/1f352.png
deleted file mode 100644
index 9b10cbaac5..0000000000
Binary files a/public/emoji/1f352.png and /dev/null differ
diff --git a/public/emoji/1f352.svg b/public/emoji/1f352.svg
index d43aca6dcf..ba6f99a596 100644
--- a/public/emoji/1f352.svg
+++ b/public/emoji/1f352.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f353.png b/public/emoji/1f353.png
deleted file mode 100644
index 7bb86f0b29..0000000000
Binary files a/public/emoji/1f353.png and /dev/null differ
diff --git a/public/emoji/1f353.svg b/public/emoji/1f353.svg
index 709e0db4b4..0243a55b70 100644
--- a/public/emoji/1f353.svg
+++ b/public/emoji/1f353.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f354.png b/public/emoji/1f354.png
deleted file mode 100644
index 3573b28a1f..0000000000
Binary files a/public/emoji/1f354.png and /dev/null differ
diff --git a/public/emoji/1f354.svg b/public/emoji/1f354.svg
index 34608757f3..7c954be89d 100644
--- a/public/emoji/1f354.svg
+++ b/public/emoji/1f354.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f355.png b/public/emoji/1f355.png
deleted file mode 100644
index e07365cb39..0000000000
Binary files a/public/emoji/1f355.png and /dev/null differ
diff --git a/public/emoji/1f355.svg b/public/emoji/1f355.svg
index 4bd17b70e0..1bd819aca3 100644
--- a/public/emoji/1f355.svg
+++ b/public/emoji/1f355.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f356.png b/public/emoji/1f356.png
deleted file mode 100644
index b20a59d169..0000000000
Binary files a/public/emoji/1f356.png and /dev/null differ
diff --git a/public/emoji/1f356.svg b/public/emoji/1f356.svg
index d1b3e056e9..bb4e72396e 100644
--- a/public/emoji/1f356.svg
+++ b/public/emoji/1f356.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f357.png b/public/emoji/1f357.png
deleted file mode 100644
index eea4a53a2f..0000000000
Binary files a/public/emoji/1f357.png and /dev/null differ
diff --git a/public/emoji/1f357.svg b/public/emoji/1f357.svg
index dca233f0be..6096785dec 100644
--- a/public/emoji/1f357.svg
+++ b/public/emoji/1f357.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f358.png b/public/emoji/1f358.png
deleted file mode 100644
index 7fbd08e4ff..0000000000
Binary files a/public/emoji/1f358.png and /dev/null differ
diff --git a/public/emoji/1f358.svg b/public/emoji/1f358.svg
index 5e38bb4fbe..f59e71bc02 100644
--- a/public/emoji/1f358.svg
+++ b/public/emoji/1f358.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f359.png b/public/emoji/1f359.png
deleted file mode 100644
index d3d8ee25cb..0000000000
Binary files a/public/emoji/1f359.png and /dev/null differ
diff --git a/public/emoji/1f359.svg b/public/emoji/1f359.svg
index 0c7cf7952b..7d6ececa89 100644
--- a/public/emoji/1f359.svg
+++ b/public/emoji/1f359.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f35a.png b/public/emoji/1f35a.png
deleted file mode 100644
index 6e3ac7956b..0000000000
Binary files a/public/emoji/1f35a.png and /dev/null differ
diff --git a/public/emoji/1f35a.svg b/public/emoji/1f35a.svg
index 08398ca6cd..ebbc452f5a 100644
--- a/public/emoji/1f35a.svg
+++ b/public/emoji/1f35a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f35b.png b/public/emoji/1f35b.png
deleted file mode 100644
index 69657ca810..0000000000
Binary files a/public/emoji/1f35b.png and /dev/null differ
diff --git a/public/emoji/1f35b.svg b/public/emoji/1f35b.svg
index 5880aea591..f265581010 100644
--- a/public/emoji/1f35b.svg
+++ b/public/emoji/1f35b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f35c.png b/public/emoji/1f35c.png
deleted file mode 100644
index c1cb7cd738..0000000000
Binary files a/public/emoji/1f35c.png and /dev/null differ
diff --git a/public/emoji/1f35c.svg b/public/emoji/1f35c.svg
index 93c4cdbf2b..f5371889f1 100644
--- a/public/emoji/1f35c.svg
+++ b/public/emoji/1f35c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f35d.png b/public/emoji/1f35d.png
deleted file mode 100644
index 89c24a321f..0000000000
Binary files a/public/emoji/1f35d.png and /dev/null differ
diff --git a/public/emoji/1f35d.svg b/public/emoji/1f35d.svg
index 52f7db9cab..6c795af573 100644
--- a/public/emoji/1f35d.svg
+++ b/public/emoji/1f35d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f35e.png b/public/emoji/1f35e.png
deleted file mode 100644
index 6676510aaa..0000000000
Binary files a/public/emoji/1f35e.png and /dev/null differ
diff --git a/public/emoji/1f35e.svg b/public/emoji/1f35e.svg
index bbaae9cc6c..1df731d9d4 100644
--- a/public/emoji/1f35e.svg
+++ b/public/emoji/1f35e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f35f.png b/public/emoji/1f35f.png
deleted file mode 100644
index 4e2a4caace..0000000000
Binary files a/public/emoji/1f35f.png and /dev/null differ
diff --git a/public/emoji/1f35f.svg b/public/emoji/1f35f.svg
index fe9e1bac70..15661bc929 100644
--- a/public/emoji/1f35f.svg
+++ b/public/emoji/1f35f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f360.png b/public/emoji/1f360.png
deleted file mode 100644
index 92a425f2e2..0000000000
Binary files a/public/emoji/1f360.png and /dev/null differ
diff --git a/public/emoji/1f360.svg b/public/emoji/1f360.svg
index bfbbd9c500..6ad2c85689 100644
--- a/public/emoji/1f360.svg
+++ b/public/emoji/1f360.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f361.png b/public/emoji/1f361.png
deleted file mode 100644
index f73f37b01c..0000000000
Binary files a/public/emoji/1f361.png and /dev/null differ
diff --git a/public/emoji/1f361.svg b/public/emoji/1f361.svg
index 6cc82e3d9a..e74a76be2c 100644
--- a/public/emoji/1f361.svg
+++ b/public/emoji/1f361.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f362.png b/public/emoji/1f362.png
deleted file mode 100644
index d38a849fec..0000000000
Binary files a/public/emoji/1f362.png and /dev/null differ
diff --git a/public/emoji/1f362.svg b/public/emoji/1f362.svg
index f00dbf6dfa..c7dda46dca 100644
--- a/public/emoji/1f362.svg
+++ b/public/emoji/1f362.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f363.png b/public/emoji/1f363.png
deleted file mode 100644
index f171fd2f7a..0000000000
Binary files a/public/emoji/1f363.png and /dev/null differ
diff --git a/public/emoji/1f363.svg b/public/emoji/1f363.svg
index 93aed08074..ec00279f90 100644
--- a/public/emoji/1f363.svg
+++ b/public/emoji/1f363.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f364.png b/public/emoji/1f364.png
deleted file mode 100644
index 752ba7f139..0000000000
Binary files a/public/emoji/1f364.png and /dev/null differ
diff --git a/public/emoji/1f364.svg b/public/emoji/1f364.svg
index c64f84077d..3bc480d47d 100644
--- a/public/emoji/1f364.svg
+++ b/public/emoji/1f364.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f365.png b/public/emoji/1f365.png
deleted file mode 100644
index 157bded65d..0000000000
Binary files a/public/emoji/1f365.png and /dev/null differ
diff --git a/public/emoji/1f365.svg b/public/emoji/1f365.svg
index 9932d3438a..bd9130486c 100644
--- a/public/emoji/1f365.svg
+++ b/public/emoji/1f365.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f366.png b/public/emoji/1f366.png
deleted file mode 100644
index 8f6546e31a..0000000000
Binary files a/public/emoji/1f366.png and /dev/null differ
diff --git a/public/emoji/1f366.svg b/public/emoji/1f366.svg
index aab1e61fd3..bf9a7609c4 100644
--- a/public/emoji/1f366.svg
+++ b/public/emoji/1f366.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f367.png b/public/emoji/1f367.png
deleted file mode 100644
index 36dfb53ca9..0000000000
Binary files a/public/emoji/1f367.png and /dev/null differ
diff --git a/public/emoji/1f367.svg b/public/emoji/1f367.svg
index 296c4f7177..0d3c276dd5 100644
--- a/public/emoji/1f367.svg
+++ b/public/emoji/1f367.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f368.png b/public/emoji/1f368.png
deleted file mode 100644
index 94267b9c43..0000000000
Binary files a/public/emoji/1f368.png and /dev/null differ
diff --git a/public/emoji/1f368.svg b/public/emoji/1f368.svg
index c1524bf373..693e2afe7b 100644
--- a/public/emoji/1f368.svg
+++ b/public/emoji/1f368.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f369.png b/public/emoji/1f369.png
deleted file mode 100644
index 0ca4cd0bde..0000000000
Binary files a/public/emoji/1f369.png and /dev/null differ
diff --git a/public/emoji/1f369.svg b/public/emoji/1f369.svg
index 6620235bcd..ae1d58f028 100644
--- a/public/emoji/1f369.svg
+++ b/public/emoji/1f369.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f36a.png b/public/emoji/1f36a.png
deleted file mode 100644
index 1b6bcb1554..0000000000
Binary files a/public/emoji/1f36a.png and /dev/null differ
diff --git a/public/emoji/1f36a.svg b/public/emoji/1f36a.svg
index 8daf31164c..31f6bf342a 100644
--- a/public/emoji/1f36a.svg
+++ b/public/emoji/1f36a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f36b.png b/public/emoji/1f36b.png
deleted file mode 100644
index 318bbd40ef..0000000000
Binary files a/public/emoji/1f36b.png and /dev/null differ
diff --git a/public/emoji/1f36b.svg b/public/emoji/1f36b.svg
index 493e7b34ae..1ac9c24d25 100644
--- a/public/emoji/1f36b.svg
+++ b/public/emoji/1f36b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f36c.png b/public/emoji/1f36c.png
deleted file mode 100644
index 8c67ace3a3..0000000000
Binary files a/public/emoji/1f36c.png and /dev/null differ
diff --git a/public/emoji/1f36c.svg b/public/emoji/1f36c.svg
index 2c26a67d9a..d12a6545a7 100644
--- a/public/emoji/1f36c.svg
+++ b/public/emoji/1f36c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f36d.png b/public/emoji/1f36d.png
deleted file mode 100644
index ad76d7bf91..0000000000
Binary files a/public/emoji/1f36d.png and /dev/null differ
diff --git a/public/emoji/1f36d.svg b/public/emoji/1f36d.svg
index 887f57c003..2dc9f0c597 100644
--- a/public/emoji/1f36d.svg
+++ b/public/emoji/1f36d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f36e.png b/public/emoji/1f36e.png
deleted file mode 100644
index fa3df67b8f..0000000000
Binary files a/public/emoji/1f36e.png and /dev/null differ
diff --git a/public/emoji/1f36e.svg b/public/emoji/1f36e.svg
index de1d4317ee..4e251e450e 100644
--- a/public/emoji/1f36e.svg
+++ b/public/emoji/1f36e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f36f.png b/public/emoji/1f36f.png
deleted file mode 100644
index 9d8f592955..0000000000
Binary files a/public/emoji/1f36f.png and /dev/null differ
diff --git a/public/emoji/1f36f.svg b/public/emoji/1f36f.svg
index 031903fc19..b29e9bf7f2 100644
--- a/public/emoji/1f36f.svg
+++ b/public/emoji/1f36f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f370.png b/public/emoji/1f370.png
deleted file mode 100644
index 4368177be9..0000000000
Binary files a/public/emoji/1f370.png and /dev/null differ
diff --git a/public/emoji/1f370.svg b/public/emoji/1f370.svg
index c42ca1b6f1..7156f048d3 100644
--- a/public/emoji/1f370.svg
+++ b/public/emoji/1f370.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f371.png b/public/emoji/1f371.png
deleted file mode 100644
index 83d41ca7eb..0000000000
Binary files a/public/emoji/1f371.png and /dev/null differ
diff --git a/public/emoji/1f371.svg b/public/emoji/1f371.svg
index dbc80e5b30..da1195afa2 100644
--- a/public/emoji/1f371.svg
+++ b/public/emoji/1f371.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f372.png b/public/emoji/1f372.png
deleted file mode 100644
index 6b3f010c17..0000000000
Binary files a/public/emoji/1f372.png and /dev/null differ
diff --git a/public/emoji/1f372.svg b/public/emoji/1f372.svg
index 52663af16d..65a5fcacc2 100644
--- a/public/emoji/1f372.svg
+++ b/public/emoji/1f372.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f373.png b/public/emoji/1f373.png
deleted file mode 100644
index 918c980577..0000000000
Binary files a/public/emoji/1f373.png and /dev/null differ
diff --git a/public/emoji/1f373.svg b/public/emoji/1f373.svg
index 4f80ed53c0..33e20b7282 100644
--- a/public/emoji/1f373.svg
+++ b/public/emoji/1f373.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f374.png b/public/emoji/1f374.png
deleted file mode 100644
index 09f1feaea1..0000000000
Binary files a/public/emoji/1f374.png and /dev/null differ
diff --git a/public/emoji/1f374.svg b/public/emoji/1f374.svg
index e9d6b48ef9..3585bc0eae 100644
--- a/public/emoji/1f374.svg
+++ b/public/emoji/1f374.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f375.png b/public/emoji/1f375.png
deleted file mode 100644
index b53b98f0c4..0000000000
Binary files a/public/emoji/1f375.png and /dev/null differ
diff --git a/public/emoji/1f375.svg b/public/emoji/1f375.svg
index 7f210fc769..deabda3ddf 100644
--- a/public/emoji/1f375.svg
+++ b/public/emoji/1f375.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f376.png b/public/emoji/1f376.png
deleted file mode 100644
index 2933f5672c..0000000000
Binary files a/public/emoji/1f376.png and /dev/null differ
diff --git a/public/emoji/1f376.svg b/public/emoji/1f376.svg
index b573b4566a..f8df7b4fb2 100644
--- a/public/emoji/1f376.svg
+++ b/public/emoji/1f376.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f377.png b/public/emoji/1f377.png
deleted file mode 100644
index 3cc9868919..0000000000
Binary files a/public/emoji/1f377.png and /dev/null differ
diff --git a/public/emoji/1f377.svg b/public/emoji/1f377.svg
index e2652b0a32..4df8c35fa6 100644
--- a/public/emoji/1f377.svg
+++ b/public/emoji/1f377.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f378.png b/public/emoji/1f378.png
deleted file mode 100644
index 2e50c57e98..0000000000
Binary files a/public/emoji/1f378.png and /dev/null differ
diff --git a/public/emoji/1f378.svg b/public/emoji/1f378.svg
index a8c9960d86..ed6ca0eb0d 100644
--- a/public/emoji/1f378.svg
+++ b/public/emoji/1f378.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f379.png b/public/emoji/1f379.png
deleted file mode 100644
index cd714f81b3..0000000000
Binary files a/public/emoji/1f379.png and /dev/null differ
diff --git a/public/emoji/1f379.svg b/public/emoji/1f379.svg
index b96f8f05cf..7b4f6eebf4 100644
--- a/public/emoji/1f379.svg
+++ b/public/emoji/1f379.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f37a.png b/public/emoji/1f37a.png
deleted file mode 100644
index b6d73dc0b7..0000000000
Binary files a/public/emoji/1f37a.png and /dev/null differ
diff --git a/public/emoji/1f37a.svg b/public/emoji/1f37a.svg
index 85e65ba62d..575e03bd50 100644
--- a/public/emoji/1f37a.svg
+++ b/public/emoji/1f37a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f37b.png b/public/emoji/1f37b.png
deleted file mode 100644
index b55deb66b4..0000000000
Binary files a/public/emoji/1f37b.png and /dev/null differ
diff --git a/public/emoji/1f37b.svg b/public/emoji/1f37b.svg
index 76c8bdc071..c4bd4c7192 100644
--- a/public/emoji/1f37b.svg
+++ b/public/emoji/1f37b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f37c.png b/public/emoji/1f37c.png
deleted file mode 100644
index 2bd1052418..0000000000
Binary files a/public/emoji/1f37c.png and /dev/null differ
diff --git a/public/emoji/1f37c.svg b/public/emoji/1f37c.svg
index 1491a98b88..0f776fcb74 100644
--- a/public/emoji/1f37c.svg
+++ b/public/emoji/1f37c.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f37d.png b/public/emoji/1f37d.png
deleted file mode 100644
index 7411755f70..0000000000
Binary files a/public/emoji/1f37d.png and /dev/null differ
diff --git a/public/emoji/1f37d.svg b/public/emoji/1f37d.svg
index 95bd3821f5..469593c05d 100644
--- a/public/emoji/1f37d.svg
+++ b/public/emoji/1f37d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f37e.png b/public/emoji/1f37e.png
deleted file mode 100644
index 285a79a93d..0000000000
Binary files a/public/emoji/1f37e.png and /dev/null differ
diff --git a/public/emoji/1f37e.svg b/public/emoji/1f37e.svg
index 24714015c4..604147b6ec 100644
--- a/public/emoji/1f37e.svg
+++ b/public/emoji/1f37e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f37f.png b/public/emoji/1f37f.png
deleted file mode 100644
index 36853e381d..0000000000
Binary files a/public/emoji/1f37f.png and /dev/null differ
diff --git a/public/emoji/1f37f.svg b/public/emoji/1f37f.svg
index 74510dcbe4..0902f28801 100644
--- a/public/emoji/1f37f.svg
+++ b/public/emoji/1f37f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f380.png b/public/emoji/1f380.png
deleted file mode 100644
index 0f253c3d8c..0000000000
Binary files a/public/emoji/1f380.png and /dev/null differ
diff --git a/public/emoji/1f380.svg b/public/emoji/1f380.svg
index 12c535e99c..d031920efe 100644
--- a/public/emoji/1f380.svg
+++ b/public/emoji/1f380.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f381.png b/public/emoji/1f381.png
deleted file mode 100644
index 844e216456..0000000000
Binary files a/public/emoji/1f381.png and /dev/null differ
diff --git a/public/emoji/1f381.svg b/public/emoji/1f381.svg
index bd62608c9a..bbe0fa9e0c 100644
--- a/public/emoji/1f381.svg
+++ b/public/emoji/1f381.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f382.png b/public/emoji/1f382.png
deleted file mode 100644
index 317e9a4194..0000000000
Binary files a/public/emoji/1f382.png and /dev/null differ
diff --git a/public/emoji/1f382.svg b/public/emoji/1f382.svg
index 0bbef8ccc5..955152aada 100644
--- a/public/emoji/1f382.svg
+++ b/public/emoji/1f382.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f383.png b/public/emoji/1f383.png
deleted file mode 100644
index 44c3fc0aec..0000000000
Binary files a/public/emoji/1f383.png and /dev/null differ
diff --git a/public/emoji/1f383.svg b/public/emoji/1f383.svg
index 21144b72ea..bdab6d2907 100644
--- a/public/emoji/1f383.svg
+++ b/public/emoji/1f383.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f384.png b/public/emoji/1f384.png
deleted file mode 100644
index 4197d37a52..0000000000
Binary files a/public/emoji/1f384.png and /dev/null differ
diff --git a/public/emoji/1f384.svg b/public/emoji/1f384.svg
index 27bbe5fc5a..d8f76bc7f1 100644
--- a/public/emoji/1f384.svg
+++ b/public/emoji/1f384.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f385-1f3fb.png b/public/emoji/1f385-1f3fb.png
deleted file mode 100644
index 5233ffb717..0000000000
Binary files a/public/emoji/1f385-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f385-1f3fb.svg b/public/emoji/1f385-1f3fb.svg
index 13c2657c34..2eef1d1d0f 100644
--- a/public/emoji/1f385-1f3fb.svg
+++ b/public/emoji/1f385-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f385-1f3fc.png b/public/emoji/1f385-1f3fc.png
deleted file mode 100644
index 4e84543819..0000000000
Binary files a/public/emoji/1f385-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f385-1f3fc.svg b/public/emoji/1f385-1f3fc.svg
index 4089865318..ce5e991ff7 100644
--- a/public/emoji/1f385-1f3fc.svg
+++ b/public/emoji/1f385-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f385-1f3fd.png b/public/emoji/1f385-1f3fd.png
deleted file mode 100644
index 7fc4f33b60..0000000000
Binary files a/public/emoji/1f385-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f385-1f3fd.svg b/public/emoji/1f385-1f3fd.svg
index 9286b2f809..e6b9f14875 100644
--- a/public/emoji/1f385-1f3fd.svg
+++ b/public/emoji/1f385-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f385-1f3fe.png b/public/emoji/1f385-1f3fe.png
deleted file mode 100644
index d1d5a15132..0000000000
Binary files a/public/emoji/1f385-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f385-1f3fe.svg b/public/emoji/1f385-1f3fe.svg
index 3745e8eef1..4e6a2efebf 100644
--- a/public/emoji/1f385-1f3fe.svg
+++ b/public/emoji/1f385-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f385-1f3ff.png b/public/emoji/1f385-1f3ff.png
deleted file mode 100644
index 4d697a01f2..0000000000
Binary files a/public/emoji/1f385-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f385-1f3ff.svg b/public/emoji/1f385-1f3ff.svg
index af8c96721c..91b20f10be 100644
--- a/public/emoji/1f385-1f3ff.svg
+++ b/public/emoji/1f385-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f385.png b/public/emoji/1f385.png
deleted file mode 100644
index bc83ab80d5..0000000000
Binary files a/public/emoji/1f385.png and /dev/null differ
diff --git a/public/emoji/1f385.svg b/public/emoji/1f385.svg
index 9f07458bae..55e0d6c56c 100644
--- a/public/emoji/1f385.svg
+++ b/public/emoji/1f385.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f386.png b/public/emoji/1f386.png
deleted file mode 100644
index 176c8b5826..0000000000
Binary files a/public/emoji/1f386.png and /dev/null differ
diff --git a/public/emoji/1f386.svg b/public/emoji/1f386.svg
index 9b8995a4e6..712a7f0110 100644
--- a/public/emoji/1f386.svg
+++ b/public/emoji/1f386.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f387.png b/public/emoji/1f387.png
deleted file mode 100644
index 30339cd6e0..0000000000
Binary files a/public/emoji/1f387.png and /dev/null differ
diff --git a/public/emoji/1f387.svg b/public/emoji/1f387.svg
index 2014225233..3e81c5c2d7 100644
--- a/public/emoji/1f387.svg
+++ b/public/emoji/1f387.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f388.png b/public/emoji/1f388.png
deleted file mode 100644
index 07916fe6df..0000000000
Binary files a/public/emoji/1f388.png and /dev/null differ
diff --git a/public/emoji/1f388.svg b/public/emoji/1f388.svg
index d29c08e05d..d799bc41ba 100644
--- a/public/emoji/1f388.svg
+++ b/public/emoji/1f388.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f389.png b/public/emoji/1f389.png
deleted file mode 100644
index 0244d60f26..0000000000
Binary files a/public/emoji/1f389.png and /dev/null differ
diff --git a/public/emoji/1f389.svg b/public/emoji/1f389.svg
index b0adb4c725..0e5d08936a 100644
--- a/public/emoji/1f389.svg
+++ b/public/emoji/1f389.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f38a.png b/public/emoji/1f38a.png
deleted file mode 100644
index ba4fd9b12b..0000000000
Binary files a/public/emoji/1f38a.png and /dev/null differ
diff --git a/public/emoji/1f38a.svg b/public/emoji/1f38a.svg
index a29c16a78c..961ed4fb65 100644
--- a/public/emoji/1f38a.svg
+++ b/public/emoji/1f38a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f38b.png b/public/emoji/1f38b.png
deleted file mode 100644
index 46fcb3a1aa..0000000000
Binary files a/public/emoji/1f38b.png and /dev/null differ
diff --git a/public/emoji/1f38b.svg b/public/emoji/1f38b.svg
index ad576db713..80bdcf94a8 100644
--- a/public/emoji/1f38b.svg
+++ b/public/emoji/1f38b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f38c.png b/public/emoji/1f38c.png
deleted file mode 100644
index 273bd0f0fe..0000000000
Binary files a/public/emoji/1f38c.png and /dev/null differ
diff --git a/public/emoji/1f38c.svg b/public/emoji/1f38c.svg
index 959e66865c..8ec2b57f66 100644
--- a/public/emoji/1f38c.svg
+++ b/public/emoji/1f38c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f38d.png b/public/emoji/1f38d.png
deleted file mode 100644
index 5d5e0e728a..0000000000
Binary files a/public/emoji/1f38d.png and /dev/null differ
diff --git a/public/emoji/1f38d.svg b/public/emoji/1f38d.svg
index 952e4c4c65..f3bc7cfe43 100644
--- a/public/emoji/1f38d.svg
+++ b/public/emoji/1f38d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f38e.png b/public/emoji/1f38e.png
deleted file mode 100644
index 1095561511..0000000000
Binary files a/public/emoji/1f38e.png and /dev/null differ
diff --git a/public/emoji/1f38e.svg b/public/emoji/1f38e.svg
index 05628ca3ac..beb21af5cf 100644
--- a/public/emoji/1f38e.svg
+++ b/public/emoji/1f38e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f38f.png b/public/emoji/1f38f.png
deleted file mode 100644
index 3b451035a3..0000000000
Binary files a/public/emoji/1f38f.png and /dev/null differ
diff --git a/public/emoji/1f38f.svg b/public/emoji/1f38f.svg
index 8f1261b6c3..51c1fbde8e 100644
--- a/public/emoji/1f38f.svg
+++ b/public/emoji/1f38f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f390.png b/public/emoji/1f390.png
deleted file mode 100644
index 3c9ef3a95f..0000000000
Binary files a/public/emoji/1f390.png and /dev/null differ
diff --git a/public/emoji/1f390.svg b/public/emoji/1f390.svg
index 6a2c3ac902..f2c5c6ea8f 100644
--- a/public/emoji/1f390.svg
+++ b/public/emoji/1f390.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f391.png b/public/emoji/1f391.png
deleted file mode 100644
index 1a28426592..0000000000
Binary files a/public/emoji/1f391.png and /dev/null differ
diff --git a/public/emoji/1f391.svg b/public/emoji/1f391.svg
index 7a1e114284..5fae1c37bf 100644
--- a/public/emoji/1f391.svg
+++ b/public/emoji/1f391.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f392.png b/public/emoji/1f392.png
deleted file mode 100644
index 9997c86e7d..0000000000
Binary files a/public/emoji/1f392.png and /dev/null differ
diff --git a/public/emoji/1f392.svg b/public/emoji/1f392.svg
index 812ae04099..67c626e867 100644
--- a/public/emoji/1f392.svg
+++ b/public/emoji/1f392.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f393.png b/public/emoji/1f393.png
deleted file mode 100644
index 8b17ddd9d0..0000000000
Binary files a/public/emoji/1f393.png and /dev/null differ
diff --git a/public/emoji/1f393.svg b/public/emoji/1f393.svg
index 743f8c1d98..b3e6d83e1c 100644
--- a/public/emoji/1f393.svg
+++ b/public/emoji/1f393.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f396.png b/public/emoji/1f396.png
deleted file mode 100644
index ecd3fb0358..0000000000
Binary files a/public/emoji/1f396.png and /dev/null differ
diff --git a/public/emoji/1f396.svg b/public/emoji/1f396.svg
index 316e3a49eb..b9102321af 100644
--- a/public/emoji/1f396.svg
+++ b/public/emoji/1f396.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f397.png b/public/emoji/1f397.png
deleted file mode 100644
index 3988bbd094..0000000000
Binary files a/public/emoji/1f397.png and /dev/null differ
diff --git a/public/emoji/1f397.svg b/public/emoji/1f397.svg
index 11875061e1..9c6a7b4083 100644
--- a/public/emoji/1f397.svg
+++ b/public/emoji/1f397.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f399.png b/public/emoji/1f399.png
deleted file mode 100644
index cd9167654f..0000000000
Binary files a/public/emoji/1f399.png and /dev/null differ
diff --git a/public/emoji/1f399.svg b/public/emoji/1f399.svg
index 44c4b3f0a2..853475c237 100644
--- a/public/emoji/1f399.svg
+++ b/public/emoji/1f399.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f39a.png b/public/emoji/1f39a.png
deleted file mode 100644
index 720a3b3411..0000000000
Binary files a/public/emoji/1f39a.png and /dev/null differ
diff --git a/public/emoji/1f39a.svg b/public/emoji/1f39a.svg
index 426ccd12ff..28cd6ecd04 100644
--- a/public/emoji/1f39a.svg
+++ b/public/emoji/1f39a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f39b.png b/public/emoji/1f39b.png
deleted file mode 100644
index 6635ac93b5..0000000000
Binary files a/public/emoji/1f39b.png and /dev/null differ
diff --git a/public/emoji/1f39b.svg b/public/emoji/1f39b.svg
index 54dda727d2..4bb880b277 100644
--- a/public/emoji/1f39b.svg
+++ b/public/emoji/1f39b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f39e.png b/public/emoji/1f39e.png
deleted file mode 100644
index 30143aedbe..0000000000
Binary files a/public/emoji/1f39e.png and /dev/null differ
diff --git a/public/emoji/1f39e.svg b/public/emoji/1f39e.svg
index 1a65cc86ec..2823df68cc 100644
--- a/public/emoji/1f39e.svg
+++ b/public/emoji/1f39e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f39f.png b/public/emoji/1f39f.png
deleted file mode 100644
index e510f4a7a5..0000000000
Binary files a/public/emoji/1f39f.png and /dev/null differ
diff --git a/public/emoji/1f39f.svg b/public/emoji/1f39f.svg
index 6e4c9b6922..59db5eb8ce 100644
--- a/public/emoji/1f39f.svg
+++ b/public/emoji/1f39f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3a0.png b/public/emoji/1f3a0.png
deleted file mode 100644
index a17074edf0..0000000000
Binary files a/public/emoji/1f3a0.png and /dev/null differ
diff --git a/public/emoji/1f3a0.svg b/public/emoji/1f3a0.svg
index 1c1feb0901..fd3e3464fa 100644
--- a/public/emoji/1f3a0.svg
+++ b/public/emoji/1f3a0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3a1.png b/public/emoji/1f3a1.png
deleted file mode 100644
index 55c8ff0475..0000000000
Binary files a/public/emoji/1f3a1.png and /dev/null differ
diff --git a/public/emoji/1f3a1.svg b/public/emoji/1f3a1.svg
index 72c71cd421..70b23f1e46 100644
--- a/public/emoji/1f3a1.svg
+++ b/public/emoji/1f3a1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3a2.png b/public/emoji/1f3a2.png
deleted file mode 100644
index 5b849e071e..0000000000
Binary files a/public/emoji/1f3a2.png and /dev/null differ
diff --git a/public/emoji/1f3a2.svg b/public/emoji/1f3a2.svg
index e8efa01a22..350ee1c326 100644
--- a/public/emoji/1f3a2.svg
+++ b/public/emoji/1f3a2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3a3.png b/public/emoji/1f3a3.png
deleted file mode 100644
index dfcdf07eb5..0000000000
Binary files a/public/emoji/1f3a3.png and /dev/null differ
diff --git a/public/emoji/1f3a3.svg b/public/emoji/1f3a3.svg
index daa26dc601..8a41469416 100644
--- a/public/emoji/1f3a3.svg
+++ b/public/emoji/1f3a3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3a4.png b/public/emoji/1f3a4.png
deleted file mode 100644
index d4e6b0def2..0000000000
Binary files a/public/emoji/1f3a4.png and /dev/null differ
diff --git a/public/emoji/1f3a4.svg b/public/emoji/1f3a4.svg
index 810538abda..854679bc75 100644
--- a/public/emoji/1f3a4.svg
+++ b/public/emoji/1f3a4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3a5.png b/public/emoji/1f3a5.png
deleted file mode 100644
index 4e73b13015..0000000000
Binary files a/public/emoji/1f3a5.png and /dev/null differ
diff --git a/public/emoji/1f3a5.svg b/public/emoji/1f3a5.svg
index da84a9fc61..7d6255d803 100644
--- a/public/emoji/1f3a5.svg
+++ b/public/emoji/1f3a5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3a6.png b/public/emoji/1f3a6.png
deleted file mode 100644
index 65f27b386f..0000000000
Binary files a/public/emoji/1f3a6.png and /dev/null differ
diff --git a/public/emoji/1f3a6.svg b/public/emoji/1f3a6.svg
index 1dca8b5178..20804c9778 100644
--- a/public/emoji/1f3a6.svg
+++ b/public/emoji/1f3a6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3a7.png b/public/emoji/1f3a7.png
deleted file mode 100644
index e9fd34041d..0000000000
Binary files a/public/emoji/1f3a7.png and /dev/null differ
diff --git a/public/emoji/1f3a7.svg b/public/emoji/1f3a7.svg
index 15d0289022..ef591d6b15 100644
--- a/public/emoji/1f3a7.svg
+++ b/public/emoji/1f3a7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3a8.png b/public/emoji/1f3a8.png
deleted file mode 100644
index bd6afe9ff0..0000000000
Binary files a/public/emoji/1f3a8.png and /dev/null differ
diff --git a/public/emoji/1f3a8.svg b/public/emoji/1f3a8.svg
index c70f95ee6c..184cb761b8 100644
--- a/public/emoji/1f3a8.svg
+++ b/public/emoji/1f3a8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3a9.png b/public/emoji/1f3a9.png
deleted file mode 100644
index 131b657b10..0000000000
Binary files a/public/emoji/1f3a9.png and /dev/null differ
diff --git a/public/emoji/1f3a9.svg b/public/emoji/1f3a9.svg
index d61f2f3d01..6fd99395d6 100644
--- a/public/emoji/1f3a9.svg
+++ b/public/emoji/1f3a9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3aa.png b/public/emoji/1f3aa.png
deleted file mode 100644
index b0379775b1..0000000000
Binary files a/public/emoji/1f3aa.png and /dev/null differ
diff --git a/public/emoji/1f3aa.svg b/public/emoji/1f3aa.svg
index 6d0fdff84d..e68ca8a78c 100644
--- a/public/emoji/1f3aa.svg
+++ b/public/emoji/1f3aa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ab.png b/public/emoji/1f3ab.png
deleted file mode 100644
index 605936bb6b..0000000000
Binary files a/public/emoji/1f3ab.png and /dev/null differ
diff --git a/public/emoji/1f3ab.svg b/public/emoji/1f3ab.svg
index 4e2c9b8ebc..c29ba29172 100644
--- a/public/emoji/1f3ab.svg
+++ b/public/emoji/1f3ab.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ac.png b/public/emoji/1f3ac.png
deleted file mode 100644
index 8139088311..0000000000
Binary files a/public/emoji/1f3ac.png and /dev/null differ
diff --git a/public/emoji/1f3ac.svg b/public/emoji/1f3ac.svg
index 7e70040c5e..1a91c024e4 100644
--- a/public/emoji/1f3ac.svg
+++ b/public/emoji/1f3ac.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ad.png b/public/emoji/1f3ad.png
deleted file mode 100644
index 685441fdaa..0000000000
Binary files a/public/emoji/1f3ad.png and /dev/null differ
diff --git a/public/emoji/1f3ad.svg b/public/emoji/1f3ad.svg
index f94769858f..de1ca17bb2 100644
--- a/public/emoji/1f3ad.svg
+++ b/public/emoji/1f3ad.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ae.png b/public/emoji/1f3ae.png
deleted file mode 100644
index 316a9106a5..0000000000
Binary files a/public/emoji/1f3ae.png and /dev/null differ
diff --git a/public/emoji/1f3ae.svg b/public/emoji/1f3ae.svg
index 534a483de1..c96c63589c 100644
--- a/public/emoji/1f3ae.svg
+++ b/public/emoji/1f3ae.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3af.png b/public/emoji/1f3af.png
deleted file mode 100644
index f6704aeb8b..0000000000
Binary files a/public/emoji/1f3af.png and /dev/null differ
diff --git a/public/emoji/1f3af.svg b/public/emoji/1f3af.svg
index fe4adfa486..fffbf85a5e 100644
--- a/public/emoji/1f3af.svg
+++ b/public/emoji/1f3af.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3b0.png b/public/emoji/1f3b0.png
deleted file mode 100644
index ee71b6c268..0000000000
Binary files a/public/emoji/1f3b0.png and /dev/null differ
diff --git a/public/emoji/1f3b0.svg b/public/emoji/1f3b0.svg
index bf844ef632..94d62408f0 100644
--- a/public/emoji/1f3b0.svg
+++ b/public/emoji/1f3b0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3b1.png b/public/emoji/1f3b1.png
deleted file mode 100644
index 38ca662ede..0000000000
Binary files a/public/emoji/1f3b1.png and /dev/null differ
diff --git a/public/emoji/1f3b1.svg b/public/emoji/1f3b1.svg
index c4dcbfe7f8..29ad506831 100644
--- a/public/emoji/1f3b1.svg
+++ b/public/emoji/1f3b1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3b2.png b/public/emoji/1f3b2.png
deleted file mode 100644
index ad3626fe5e..0000000000
Binary files a/public/emoji/1f3b2.png and /dev/null differ
diff --git a/public/emoji/1f3b2.svg b/public/emoji/1f3b2.svg
index 56434d024d..036835dc78 100644
--- a/public/emoji/1f3b2.svg
+++ b/public/emoji/1f3b2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3b3.png b/public/emoji/1f3b3.png
deleted file mode 100644
index 63add89e53..0000000000
Binary files a/public/emoji/1f3b3.png and /dev/null differ
diff --git a/public/emoji/1f3b3.svg b/public/emoji/1f3b3.svg
index 3fe632fcbf..997b5d3098 100644
--- a/public/emoji/1f3b3.svg
+++ b/public/emoji/1f3b3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3b4.png b/public/emoji/1f3b4.png
deleted file mode 100644
index 6766b044d9..0000000000
Binary files a/public/emoji/1f3b4.png and /dev/null differ
diff --git a/public/emoji/1f3b4.svg b/public/emoji/1f3b4.svg
index 9618a3cb19..e0dcba142d 100644
--- a/public/emoji/1f3b4.svg
+++ b/public/emoji/1f3b4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3b5.png b/public/emoji/1f3b5.png
deleted file mode 100644
index 06691ef61b..0000000000
Binary files a/public/emoji/1f3b5.png and /dev/null differ
diff --git a/public/emoji/1f3b5.svg b/public/emoji/1f3b5.svg
index 7ce21dd8d1..d748d57ac8 100644
--- a/public/emoji/1f3b5.svg
+++ b/public/emoji/1f3b5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3b6.png b/public/emoji/1f3b6.png
deleted file mode 100644
index 57d499aa18..0000000000
Binary files a/public/emoji/1f3b6.png and /dev/null differ
diff --git a/public/emoji/1f3b6.svg b/public/emoji/1f3b6.svg
index 9c0b8a81e8..f1e96a1438 100644
--- a/public/emoji/1f3b6.svg
+++ b/public/emoji/1f3b6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3b7.png b/public/emoji/1f3b7.png
deleted file mode 100644
index a392faec29..0000000000
Binary files a/public/emoji/1f3b7.png and /dev/null differ
diff --git a/public/emoji/1f3b7.svg b/public/emoji/1f3b7.svg
index a3bf5ca27d..146331c503 100644
--- a/public/emoji/1f3b7.svg
+++ b/public/emoji/1f3b7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3b8.png b/public/emoji/1f3b8.png
deleted file mode 100644
index 43d752f1e3..0000000000
Binary files a/public/emoji/1f3b8.png and /dev/null differ
diff --git a/public/emoji/1f3b8.svg b/public/emoji/1f3b8.svg
index e31145b883..9253fa7122 100644
--- a/public/emoji/1f3b8.svg
+++ b/public/emoji/1f3b8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3b9.png b/public/emoji/1f3b9.png
deleted file mode 100644
index 442b745684..0000000000
Binary files a/public/emoji/1f3b9.png and /dev/null differ
diff --git a/public/emoji/1f3b9.svg b/public/emoji/1f3b9.svg
index 4605d3fbd5..f3dc5d6fbf 100644
--- a/public/emoji/1f3b9.svg
+++ b/public/emoji/1f3b9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ba.png b/public/emoji/1f3ba.png
deleted file mode 100644
index 864ccbcd04..0000000000
Binary files a/public/emoji/1f3ba.png and /dev/null differ
diff --git a/public/emoji/1f3ba.svg b/public/emoji/1f3ba.svg
index 248ae7d2aa..69c96b2bcf 100644
--- a/public/emoji/1f3ba.svg
+++ b/public/emoji/1f3ba.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3bb.png b/public/emoji/1f3bb.png
deleted file mode 100644
index e1e76cce24..0000000000
Binary files a/public/emoji/1f3bb.png and /dev/null differ
diff --git a/public/emoji/1f3bb.svg b/public/emoji/1f3bb.svg
index 3e9cf6e764..bb41fa03ad 100644
--- a/public/emoji/1f3bb.svg
+++ b/public/emoji/1f3bb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3bc.png b/public/emoji/1f3bc.png
deleted file mode 100644
index 47dc05a8ef..0000000000
Binary files a/public/emoji/1f3bc.png and /dev/null differ
diff --git a/public/emoji/1f3bc.svg b/public/emoji/1f3bc.svg
index c07402486c..5a6b2c5432 100644
--- a/public/emoji/1f3bc.svg
+++ b/public/emoji/1f3bc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3bd.png b/public/emoji/1f3bd.png
deleted file mode 100644
index 6d83c06b80..0000000000
Binary files a/public/emoji/1f3bd.png and /dev/null differ
diff --git a/public/emoji/1f3bd.svg b/public/emoji/1f3bd.svg
index b612348f3f..5afc205fc0 100644
--- a/public/emoji/1f3bd.svg
+++ b/public/emoji/1f3bd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3be.png b/public/emoji/1f3be.png
deleted file mode 100644
index 7e68ba8f30..0000000000
Binary files a/public/emoji/1f3be.png and /dev/null differ
diff --git a/public/emoji/1f3be.svg b/public/emoji/1f3be.svg
index 25ead517e9..a32596c85e 100644
--- a/public/emoji/1f3be.svg
+++ b/public/emoji/1f3be.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3bf.png b/public/emoji/1f3bf.png
deleted file mode 100644
index 4a2d2c1230..0000000000
Binary files a/public/emoji/1f3bf.png and /dev/null differ
diff --git a/public/emoji/1f3bf.svg b/public/emoji/1f3bf.svg
index c18b6706dd..8fc9b173d8 100644
--- a/public/emoji/1f3bf.svg
+++ b/public/emoji/1f3bf.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c0.png b/public/emoji/1f3c0.png
deleted file mode 100644
index 64c76b79c6..0000000000
Binary files a/public/emoji/1f3c0.png and /dev/null differ
diff --git a/public/emoji/1f3c0.svg b/public/emoji/1f3c0.svg
index 4c88cd07ed..19fe48e475 100644
--- a/public/emoji/1f3c0.svg
+++ b/public/emoji/1f3c0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c1.png b/public/emoji/1f3c1.png
deleted file mode 100644
index 5a71eecb89..0000000000
Binary files a/public/emoji/1f3c1.png and /dev/null differ
diff --git a/public/emoji/1f3c1.svg b/public/emoji/1f3c1.svg
index a57b1b0014..a8b2718646 100644
--- a/public/emoji/1f3c1.svg
+++ b/public/emoji/1f3c1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c2-1f3fb.svg b/public/emoji/1f3c2-1f3fb.svg
new file mode 100644
index 0000000000..80f18eae43
--- /dev/null
+++ b/public/emoji/1f3c2-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c2-1f3fc.svg b/public/emoji/1f3c2-1f3fc.svg
new file mode 100644
index 0000000000..d9d27bd1b4
--- /dev/null
+++ b/public/emoji/1f3c2-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c2-1f3fd.svg b/public/emoji/1f3c2-1f3fd.svg
new file mode 100644
index 0000000000..93bdecc58b
--- /dev/null
+++ b/public/emoji/1f3c2-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c2-1f3fe.svg b/public/emoji/1f3c2-1f3fe.svg
new file mode 100644
index 0000000000..076c81b98b
--- /dev/null
+++ b/public/emoji/1f3c2-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c2-1f3ff.svg b/public/emoji/1f3c2-1f3ff.svg
new file mode 100644
index 0000000000..b2d6ad96e7
--- /dev/null
+++ b/public/emoji/1f3c2-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c2.png b/public/emoji/1f3c2.png
deleted file mode 100644
index 6361c0f2c9..0000000000
Binary files a/public/emoji/1f3c2.png and /dev/null differ
diff --git a/public/emoji/1f3c2.svg b/public/emoji/1f3c2.svg
index 347e2d7f78..7239e12522 100644
--- a/public/emoji/1f3c2.svg
+++ b/public/emoji/1f3c2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f3c3-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..570fc7cc05
--- /dev/null
+++ b/public/emoji/1f3c3-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f3c3-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..dfff62b71c
--- /dev/null
+++ b/public/emoji/1f3c3-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3fb.png b/public/emoji/1f3c3-1f3fb.png
deleted file mode 100644
index 9355239a52..0000000000
Binary files a/public/emoji/1f3c3-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f3c3-1f3fb.svg b/public/emoji/1f3c3-1f3fb.svg
index 4b9b89b068..dfff62b71c 100644
--- a/public/emoji/1f3c3-1f3fb.svg
+++ b/public/emoji/1f3c3-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f3c3-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..ab219949db
--- /dev/null
+++ b/public/emoji/1f3c3-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f3c3-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..093f4ba69c
--- /dev/null
+++ b/public/emoji/1f3c3-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3fc.png b/public/emoji/1f3c3-1f3fc.png
deleted file mode 100644
index 6112fd5c37..0000000000
Binary files a/public/emoji/1f3c3-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f3c3-1f3fc.svg b/public/emoji/1f3c3-1f3fc.svg
index fd2a61abd9..093f4ba69c 100644
--- a/public/emoji/1f3c3-1f3fc.svg
+++ b/public/emoji/1f3c3-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f3c3-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..c7d77e2afd
--- /dev/null
+++ b/public/emoji/1f3c3-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f3c3-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..fc486856e8
--- /dev/null
+++ b/public/emoji/1f3c3-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3fd.png b/public/emoji/1f3c3-1f3fd.png
deleted file mode 100644
index 625ec708f4..0000000000
Binary files a/public/emoji/1f3c3-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f3c3-1f3fd.svg b/public/emoji/1f3c3-1f3fd.svg
index 6e8a3ba0d9..fc486856e8 100644
--- a/public/emoji/1f3c3-1f3fd.svg
+++ b/public/emoji/1f3c3-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f3c3-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..ec6cb8d7bd
--- /dev/null
+++ b/public/emoji/1f3c3-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f3c3-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..ebf10ebdeb
--- /dev/null
+++ b/public/emoji/1f3c3-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3fe.png b/public/emoji/1f3c3-1f3fe.png
deleted file mode 100644
index 242f1b5633..0000000000
Binary files a/public/emoji/1f3c3-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f3c3-1f3fe.svg b/public/emoji/1f3c3-1f3fe.svg
index 819f33c333..ebf10ebdeb 100644
--- a/public/emoji/1f3c3-1f3fe.svg
+++ b/public/emoji/1f3c3-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f3c3-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..6a6be6cb8e
--- /dev/null
+++ b/public/emoji/1f3c3-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f3c3-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..870bf9f5bc
--- /dev/null
+++ b/public/emoji/1f3c3-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c3-1f3ff.png b/public/emoji/1f3c3-1f3ff.png
deleted file mode 100644
index 2976c6f019..0000000000
Binary files a/public/emoji/1f3c3-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f3c3-1f3ff.svg b/public/emoji/1f3c3-1f3ff.svg
index 622c252e46..870bf9f5bc 100644
--- a/public/emoji/1f3c3-1f3ff.svg
+++ b/public/emoji/1f3c3-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c3-200d-2640-fe0f.svg b/public/emoji/1f3c3-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..267f23f2a2
--- /dev/null
+++ b/public/emoji/1f3c3-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c3-200d-2642-fe0f.svg b/public/emoji/1f3c3-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..2916e58975
--- /dev/null
+++ b/public/emoji/1f3c3-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c3.png b/public/emoji/1f3c3.png
deleted file mode 100644
index e914915976..0000000000
Binary files a/public/emoji/1f3c3.png and /dev/null differ
diff --git a/public/emoji/1f3c3.svg b/public/emoji/1f3c3.svg
index e292a290c6..2916e58975 100644
--- a/public/emoji/1f3c3.svg
+++ b/public/emoji/1f3c3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f3c4-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..1e6a1bb30b
--- /dev/null
+++ b/public/emoji/1f3c4-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f3c4-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..10680958eb
--- /dev/null
+++ b/public/emoji/1f3c4-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3fb.png b/public/emoji/1f3c4-1f3fb.png
deleted file mode 100644
index b5faaa524c..0000000000
Binary files a/public/emoji/1f3c4-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f3c4-1f3fb.svg b/public/emoji/1f3c4-1f3fb.svg
index b76cc56bcd..10680958eb 100644
--- a/public/emoji/1f3c4-1f3fb.svg
+++ b/public/emoji/1f3c4-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f3c4-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..63730d1c09
--- /dev/null
+++ b/public/emoji/1f3c4-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f3c4-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..02facb5ce7
--- /dev/null
+++ b/public/emoji/1f3c4-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3fc.png b/public/emoji/1f3c4-1f3fc.png
deleted file mode 100644
index 6d92e412ff..0000000000
Binary files a/public/emoji/1f3c4-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f3c4-1f3fc.svg b/public/emoji/1f3c4-1f3fc.svg
index f595853c7a..02facb5ce7 100644
--- a/public/emoji/1f3c4-1f3fc.svg
+++ b/public/emoji/1f3c4-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f3c4-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..03e18b72d1
--- /dev/null
+++ b/public/emoji/1f3c4-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f3c4-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..bf3a8b32be
--- /dev/null
+++ b/public/emoji/1f3c4-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3fd.png b/public/emoji/1f3c4-1f3fd.png
deleted file mode 100644
index f05ef59496..0000000000
Binary files a/public/emoji/1f3c4-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f3c4-1f3fd.svg b/public/emoji/1f3c4-1f3fd.svg
index 5ddcf250fe..bf3a8b32be 100644
--- a/public/emoji/1f3c4-1f3fd.svg
+++ b/public/emoji/1f3c4-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f3c4-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..866a81364a
--- /dev/null
+++ b/public/emoji/1f3c4-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f3c4-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..d3529de70d
--- /dev/null
+++ b/public/emoji/1f3c4-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3fe.png b/public/emoji/1f3c4-1f3fe.png
deleted file mode 100644
index 35e143d19d..0000000000
Binary files a/public/emoji/1f3c4-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f3c4-1f3fe.svg b/public/emoji/1f3c4-1f3fe.svg
index bf0fa36f2c..d3529de70d 100644
--- a/public/emoji/1f3c4-1f3fe.svg
+++ b/public/emoji/1f3c4-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f3c4-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..40c4e2605f
--- /dev/null
+++ b/public/emoji/1f3c4-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f3c4-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..5c4f2a5e46
--- /dev/null
+++ b/public/emoji/1f3c4-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c4-1f3ff.png b/public/emoji/1f3c4-1f3ff.png
deleted file mode 100644
index 38917658ea..0000000000
Binary files a/public/emoji/1f3c4-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f3c4-1f3ff.svg b/public/emoji/1f3c4-1f3ff.svg
index 294226da2d..5c4f2a5e46 100644
--- a/public/emoji/1f3c4-1f3ff.svg
+++ b/public/emoji/1f3c4-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c4-200d-2640-fe0f.svg b/public/emoji/1f3c4-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..ea334a12a6
--- /dev/null
+++ b/public/emoji/1f3c4-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c4-200d-2642-fe0f.svg b/public/emoji/1f3c4-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..88bd36f1aa
--- /dev/null
+++ b/public/emoji/1f3c4-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3c4.png b/public/emoji/1f3c4.png
deleted file mode 100644
index 3ab017adf4..0000000000
Binary files a/public/emoji/1f3c4.png and /dev/null differ
diff --git a/public/emoji/1f3c4.svg b/public/emoji/1f3c4.svg
index 53b845c633..88bd36f1aa 100644
--- a/public/emoji/1f3c4.svg
+++ b/public/emoji/1f3c4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c5.png b/public/emoji/1f3c5.png
deleted file mode 100644
index b85896b14d..0000000000
Binary files a/public/emoji/1f3c5.png and /dev/null differ
diff --git a/public/emoji/1f3c5.svg b/public/emoji/1f3c5.svg
index 4862d3c692..1514714dc5 100644
--- a/public/emoji/1f3c5.svg
+++ b/public/emoji/1f3c5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c6.png b/public/emoji/1f3c6.png
deleted file mode 100644
index ac2895c189..0000000000
Binary files a/public/emoji/1f3c6.png and /dev/null differ
diff --git a/public/emoji/1f3c6.svg b/public/emoji/1f3c6.svg
index 025592e6df..6ecc234aff 100644
--- a/public/emoji/1f3c6.svg
+++ b/public/emoji/1f3c6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c7-1f3fb.png b/public/emoji/1f3c7-1f3fb.png
deleted file mode 100644
index e9bf4092e9..0000000000
Binary files a/public/emoji/1f3c7-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f3c7-1f3fb.svg b/public/emoji/1f3c7-1f3fb.svg
index 308dd7abef..47ac7e4180 100644
--- a/public/emoji/1f3c7-1f3fb.svg
+++ b/public/emoji/1f3c7-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c7-1f3fc.png b/public/emoji/1f3c7-1f3fc.png
deleted file mode 100644
index 031bbc3d86..0000000000
Binary files a/public/emoji/1f3c7-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f3c7-1f3fc.svg b/public/emoji/1f3c7-1f3fc.svg
index f841b3e2d7..b8509d9d10 100644
--- a/public/emoji/1f3c7-1f3fc.svg
+++ b/public/emoji/1f3c7-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c7-1f3fd.png b/public/emoji/1f3c7-1f3fd.png
deleted file mode 100644
index b40ef891f9..0000000000
Binary files a/public/emoji/1f3c7-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f3c7-1f3fd.svg b/public/emoji/1f3c7-1f3fd.svg
index ca972a62fc..67944e2882 100644
--- a/public/emoji/1f3c7-1f3fd.svg
+++ b/public/emoji/1f3c7-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c7-1f3fe.png b/public/emoji/1f3c7-1f3fe.png
deleted file mode 100644
index e286cb8506..0000000000
Binary files a/public/emoji/1f3c7-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f3c7-1f3fe.svg b/public/emoji/1f3c7-1f3fe.svg
index c8f3850849..5bea32d7c6 100644
--- a/public/emoji/1f3c7-1f3fe.svg
+++ b/public/emoji/1f3c7-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c7-1f3ff.png b/public/emoji/1f3c7-1f3ff.png
deleted file mode 100644
index 453c51c600..0000000000
Binary files a/public/emoji/1f3c7-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f3c7-1f3ff.svg b/public/emoji/1f3c7-1f3ff.svg
index 1ee4554df1..a6c6031f70 100644
--- a/public/emoji/1f3c7-1f3ff.svg
+++ b/public/emoji/1f3c7-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c7.png b/public/emoji/1f3c7.png
deleted file mode 100644
index addf9edac5..0000000000
Binary files a/public/emoji/1f3c7.png and /dev/null differ
diff --git a/public/emoji/1f3c7.svg b/public/emoji/1f3c7.svg
index f790b68859..b6b0ecc8ef 100644
--- a/public/emoji/1f3c7.svg
+++ b/public/emoji/1f3c7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c8.png b/public/emoji/1f3c8.png
deleted file mode 100644
index 10366f41fc..0000000000
Binary files a/public/emoji/1f3c8.png and /dev/null differ
diff --git a/public/emoji/1f3c8.svg b/public/emoji/1f3c8.svg
index 85ecdbf9cb..3a7e9ea5ca 100644
--- a/public/emoji/1f3c8.svg
+++ b/public/emoji/1f3c8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3c9.png b/public/emoji/1f3c9.png
deleted file mode 100644
index b187227343..0000000000
Binary files a/public/emoji/1f3c9.png and /dev/null differ
diff --git a/public/emoji/1f3c9.svg b/public/emoji/1f3c9.svg
index dca5f04935..c61d5e1049 100644
--- a/public/emoji/1f3c9.svg
+++ b/public/emoji/1f3c9.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f3ca-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..b566b0b495
--- /dev/null
+++ b/public/emoji/1f3ca-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f3ca-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..4adae1bee6
--- /dev/null
+++ b/public/emoji/1f3ca-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3fb.png b/public/emoji/1f3ca-1f3fb.png
deleted file mode 100644
index 38441c9ca9..0000000000
Binary files a/public/emoji/1f3ca-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f3ca-1f3fb.svg b/public/emoji/1f3ca-1f3fb.svg
index 8484a53049..4adae1bee6 100644
--- a/public/emoji/1f3ca-1f3fb.svg
+++ b/public/emoji/1f3ca-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f3ca-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..938af613b4
--- /dev/null
+++ b/public/emoji/1f3ca-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f3ca-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..b7bad31957
--- /dev/null
+++ b/public/emoji/1f3ca-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3fc.png b/public/emoji/1f3ca-1f3fc.png
deleted file mode 100644
index b0d4311244..0000000000
Binary files a/public/emoji/1f3ca-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f3ca-1f3fc.svg b/public/emoji/1f3ca-1f3fc.svg
index 456bee3b39..b7bad31957 100644
--- a/public/emoji/1f3ca-1f3fc.svg
+++ b/public/emoji/1f3ca-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f3ca-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..fb1f38e4b4
--- /dev/null
+++ b/public/emoji/1f3ca-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f3ca-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..87d970d38b
--- /dev/null
+++ b/public/emoji/1f3ca-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3fd.png b/public/emoji/1f3ca-1f3fd.png
deleted file mode 100644
index 211e77e2aa..0000000000
Binary files a/public/emoji/1f3ca-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f3ca-1f3fd.svg b/public/emoji/1f3ca-1f3fd.svg
index 57e0642245..87d970d38b 100644
--- a/public/emoji/1f3ca-1f3fd.svg
+++ b/public/emoji/1f3ca-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f3ca-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..c506400824
--- /dev/null
+++ b/public/emoji/1f3ca-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f3ca-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..68084d89a1
--- /dev/null
+++ b/public/emoji/1f3ca-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3fe.png b/public/emoji/1f3ca-1f3fe.png
deleted file mode 100644
index f34c34db9d..0000000000
Binary files a/public/emoji/1f3ca-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f3ca-1f3fe.svg b/public/emoji/1f3ca-1f3fe.svg
index 12d607b4bb..68084d89a1 100644
--- a/public/emoji/1f3ca-1f3fe.svg
+++ b/public/emoji/1f3ca-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f3ca-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..7f97b5f07b
--- /dev/null
+++ b/public/emoji/1f3ca-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f3ca-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..0e93a98c93
--- /dev/null
+++ b/public/emoji/1f3ca-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3ca-1f3ff.png b/public/emoji/1f3ca-1f3ff.png
deleted file mode 100644
index 3e9231ff86..0000000000
Binary files a/public/emoji/1f3ca-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f3ca-1f3ff.svg b/public/emoji/1f3ca-1f3ff.svg
index 99fe3f240e..0e93a98c93 100644
--- a/public/emoji/1f3ca-1f3ff.svg
+++ b/public/emoji/1f3ca-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ca-200d-2640-fe0f.svg b/public/emoji/1f3ca-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..1d4abfd761
--- /dev/null
+++ b/public/emoji/1f3ca-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3ca-200d-2642-fe0f.svg b/public/emoji/1f3ca-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..7611ea22ab
--- /dev/null
+++ b/public/emoji/1f3ca-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3ca.png b/public/emoji/1f3ca.png
deleted file mode 100644
index 55b4d72f9a..0000000000
Binary files a/public/emoji/1f3ca.png and /dev/null differ
diff --git a/public/emoji/1f3ca.svg b/public/emoji/1f3ca.svg
index 5b62b5cc77..7611ea22ab 100644
--- a/public/emoji/1f3ca.svg
+++ b/public/emoji/1f3ca.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f3cb-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..70fdc084fe
--- /dev/null
+++ b/public/emoji/1f3cb-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f3cb-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..3938ed9cc2
--- /dev/null
+++ b/public/emoji/1f3cb-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3fb.png b/public/emoji/1f3cb-1f3fb.png
deleted file mode 100644
index febaad123e..0000000000
Binary files a/public/emoji/1f3cb-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f3cb-1f3fb.svg b/public/emoji/1f3cb-1f3fb.svg
index 1d993f5b36..3938ed9cc2 100644
--- a/public/emoji/1f3cb-1f3fb.svg
+++ b/public/emoji/1f3cb-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f3cb-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..5f84387930
--- /dev/null
+++ b/public/emoji/1f3cb-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f3cb-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..11f1a17280
--- /dev/null
+++ b/public/emoji/1f3cb-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3fc.png b/public/emoji/1f3cb-1f3fc.png
deleted file mode 100644
index 27ae794a18..0000000000
Binary files a/public/emoji/1f3cb-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f3cb-1f3fc.svg b/public/emoji/1f3cb-1f3fc.svg
index 4b386c0119..11f1a17280 100644
--- a/public/emoji/1f3cb-1f3fc.svg
+++ b/public/emoji/1f3cb-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f3cb-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..310e485338
--- /dev/null
+++ b/public/emoji/1f3cb-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f3cb-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..8f7a557280
--- /dev/null
+++ b/public/emoji/1f3cb-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3fd.png b/public/emoji/1f3cb-1f3fd.png
deleted file mode 100644
index 45c4c22c70..0000000000
Binary files a/public/emoji/1f3cb-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f3cb-1f3fd.svg b/public/emoji/1f3cb-1f3fd.svg
index 06778330e1..8f7a557280 100644
--- a/public/emoji/1f3cb-1f3fd.svg
+++ b/public/emoji/1f3cb-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f3cb-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..7026af4e9f
--- /dev/null
+++ b/public/emoji/1f3cb-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f3cb-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..4e06d696b0
--- /dev/null
+++ b/public/emoji/1f3cb-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3fe.png b/public/emoji/1f3cb-1f3fe.png
deleted file mode 100644
index 67dd21d246..0000000000
Binary files a/public/emoji/1f3cb-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f3cb-1f3fe.svg b/public/emoji/1f3cb-1f3fe.svg
index 7df96c44d2..4e06d696b0 100644
--- a/public/emoji/1f3cb-1f3fe.svg
+++ b/public/emoji/1f3cb-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f3cb-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..27cfbeef62
--- /dev/null
+++ b/public/emoji/1f3cb-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f3cb-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..08e998ed92
--- /dev/null
+++ b/public/emoji/1f3cb-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cb-1f3ff.png b/public/emoji/1f3cb-1f3ff.png
deleted file mode 100644
index fa0152038b..0000000000
Binary files a/public/emoji/1f3cb-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f3cb-1f3ff.svg b/public/emoji/1f3cb-1f3ff.svg
index 252bf0e4a8..08e998ed92 100644
--- a/public/emoji/1f3cb-1f3ff.svg
+++ b/public/emoji/1f3cb-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3cb-fe0f-200d-2640-fe0f.svg b/public/emoji/1f3cb-fe0f-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..3e6f21e92c
--- /dev/null
+++ b/public/emoji/1f3cb-fe0f-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cb-fe0f-200d-2642-fe0f.svg b/public/emoji/1f3cb-fe0f-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..01306a7538
--- /dev/null
+++ b/public/emoji/1f3cb-fe0f-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cb.png b/public/emoji/1f3cb.png
deleted file mode 100644
index afdeaa476a..0000000000
Binary files a/public/emoji/1f3cb.png and /dev/null differ
diff --git a/public/emoji/1f3cb.svg b/public/emoji/1f3cb.svg
index 606b0076bc..01306a7538 100644
--- a/public/emoji/1f3cb.svg
+++ b/public/emoji/1f3cb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f3cc-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..24b0ade254
--- /dev/null
+++ b/public/emoji/1f3cc-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f3cc-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..ca733cb955
--- /dev/null
+++ b/public/emoji/1f3cc-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3fb.svg b/public/emoji/1f3cc-1f3fb.svg
new file mode 100644
index 0000000000..ca733cb955
--- /dev/null
+++ b/public/emoji/1f3cc-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f3cc-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..e3379b1e3a
--- /dev/null
+++ b/public/emoji/1f3cc-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f3cc-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..c0c7941621
--- /dev/null
+++ b/public/emoji/1f3cc-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3fc.svg b/public/emoji/1f3cc-1f3fc.svg
new file mode 100644
index 0000000000..c0c7941621
--- /dev/null
+++ b/public/emoji/1f3cc-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f3cc-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..0fb927c829
--- /dev/null
+++ b/public/emoji/1f3cc-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f3cc-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..6e67fa7ab0
--- /dev/null
+++ b/public/emoji/1f3cc-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3fd.svg b/public/emoji/1f3cc-1f3fd.svg
new file mode 100644
index 0000000000..6e67fa7ab0
--- /dev/null
+++ b/public/emoji/1f3cc-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f3cc-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..150fc0e212
--- /dev/null
+++ b/public/emoji/1f3cc-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f3cc-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..c891ce67ae
--- /dev/null
+++ b/public/emoji/1f3cc-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3fe.svg b/public/emoji/1f3cc-1f3fe.svg
new file mode 100644
index 0000000000..c891ce67ae
--- /dev/null
+++ b/public/emoji/1f3cc-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f3cc-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..78031ea857
--- /dev/null
+++ b/public/emoji/1f3cc-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f3cc-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..703b6c66e5
--- /dev/null
+++ b/public/emoji/1f3cc-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-1f3ff.svg b/public/emoji/1f3cc-1f3ff.svg
new file mode 100644
index 0000000000..703b6c66e5
--- /dev/null
+++ b/public/emoji/1f3cc-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-fe0f-200d-2640-fe0f.svg b/public/emoji/1f3cc-fe0f-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..a51cba2e14
--- /dev/null
+++ b/public/emoji/1f3cc-fe0f-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc-fe0f-200d-2642-fe0f.svg b/public/emoji/1f3cc-fe0f-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..23c4ae77ed
--- /dev/null
+++ b/public/emoji/1f3cc-fe0f-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3cc.png b/public/emoji/1f3cc.png
deleted file mode 100644
index 39c552de86..0000000000
Binary files a/public/emoji/1f3cc.png and /dev/null differ
diff --git a/public/emoji/1f3cc.svg b/public/emoji/1f3cc.svg
index 25cce198a9..23c4ae77ed 100644
--- a/public/emoji/1f3cc.svg
+++ b/public/emoji/1f3cc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3cd.png b/public/emoji/1f3cd.png
deleted file mode 100644
index 3d1d567e8e..0000000000
Binary files a/public/emoji/1f3cd.png and /dev/null differ
diff --git a/public/emoji/1f3cd.svg b/public/emoji/1f3cd.svg
index ea58df55be..7384d6b0e7 100644
--- a/public/emoji/1f3cd.svg
+++ b/public/emoji/1f3cd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ce.png b/public/emoji/1f3ce.png
deleted file mode 100644
index fe3f045f44..0000000000
Binary files a/public/emoji/1f3ce.png and /dev/null differ
diff --git a/public/emoji/1f3ce.svg b/public/emoji/1f3ce.svg
index f6bb1d8f9c..3fc893c907 100644
--- a/public/emoji/1f3ce.svg
+++ b/public/emoji/1f3ce.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3cf.png b/public/emoji/1f3cf.png
deleted file mode 100644
index d602294a2c..0000000000
Binary files a/public/emoji/1f3cf.png and /dev/null differ
diff --git a/public/emoji/1f3cf.svg b/public/emoji/1f3cf.svg
index 1723dfe48f..c9f934012e 100644
--- a/public/emoji/1f3cf.svg
+++ b/public/emoji/1f3cf.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3d0.png b/public/emoji/1f3d0.png
deleted file mode 100644
index 7a0e49d4b0..0000000000
Binary files a/public/emoji/1f3d0.png and /dev/null differ
diff --git a/public/emoji/1f3d0.svg b/public/emoji/1f3d0.svg
index bf0a613239..6f3923c6ac 100644
--- a/public/emoji/1f3d0.svg
+++ b/public/emoji/1f3d0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3d1.png b/public/emoji/1f3d1.png
deleted file mode 100644
index 839637716e..0000000000
Binary files a/public/emoji/1f3d1.png and /dev/null differ
diff --git a/public/emoji/1f3d1.svg b/public/emoji/1f3d1.svg
index 22278e5754..3cd95b2990 100644
--- a/public/emoji/1f3d1.svg
+++ b/public/emoji/1f3d1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3d2.png b/public/emoji/1f3d2.png
deleted file mode 100644
index be94e9cbf7..0000000000
Binary files a/public/emoji/1f3d2.png and /dev/null differ
diff --git a/public/emoji/1f3d2.svg b/public/emoji/1f3d2.svg
index 84c1cd5099..25513203cc 100644
--- a/public/emoji/1f3d2.svg
+++ b/public/emoji/1f3d2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3d3.png b/public/emoji/1f3d3.png
deleted file mode 100644
index ff3c51727d..0000000000
Binary files a/public/emoji/1f3d3.png and /dev/null differ
diff --git a/public/emoji/1f3d3.svg b/public/emoji/1f3d3.svg
index f7ecc84613..f9fe5dedb5 100644
--- a/public/emoji/1f3d3.svg
+++ b/public/emoji/1f3d3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3d4.png b/public/emoji/1f3d4.png
deleted file mode 100644
index 76e1cfd831..0000000000
Binary files a/public/emoji/1f3d4.png and /dev/null differ
diff --git a/public/emoji/1f3d4.svg b/public/emoji/1f3d4.svg
index fad85a34ee..06a703edb5 100644
--- a/public/emoji/1f3d4.svg
+++ b/public/emoji/1f3d4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3d5.png b/public/emoji/1f3d5.png
deleted file mode 100644
index d589cc1f44..0000000000
Binary files a/public/emoji/1f3d5.png and /dev/null differ
diff --git a/public/emoji/1f3d5.svg b/public/emoji/1f3d5.svg
index 166f1a74f3..2aec636dcc 100644
--- a/public/emoji/1f3d5.svg
+++ b/public/emoji/1f3d5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3d6.png b/public/emoji/1f3d6.png
deleted file mode 100644
index 69108c8ea1..0000000000
Binary files a/public/emoji/1f3d6.png and /dev/null differ
diff --git a/public/emoji/1f3d6.svg b/public/emoji/1f3d6.svg
index 7aa2ca8b9a..0e9cc80767 100644
--- a/public/emoji/1f3d6.svg
+++ b/public/emoji/1f3d6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3d7.png b/public/emoji/1f3d7.png
deleted file mode 100644
index 8206a20f63..0000000000
Binary files a/public/emoji/1f3d7.png and /dev/null differ
diff --git a/public/emoji/1f3d7.svg b/public/emoji/1f3d7.svg
index a29f1db270..271e35a240 100644
--- a/public/emoji/1f3d7.svg
+++ b/public/emoji/1f3d7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3d8.png b/public/emoji/1f3d8.png
deleted file mode 100644
index 6ab4a2a265..0000000000
Binary files a/public/emoji/1f3d8.png and /dev/null differ
diff --git a/public/emoji/1f3d8.svg b/public/emoji/1f3d8.svg
index ba838e874f..805e0aa149 100644
--- a/public/emoji/1f3d8.svg
+++ b/public/emoji/1f3d8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3d9.png b/public/emoji/1f3d9.png
deleted file mode 100644
index d7b9844a0b..0000000000
Binary files a/public/emoji/1f3d9.png and /dev/null differ
diff --git a/public/emoji/1f3d9.svg b/public/emoji/1f3d9.svg
index 3deabda452..b740e61a2e 100644
--- a/public/emoji/1f3d9.svg
+++ b/public/emoji/1f3d9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3da.png b/public/emoji/1f3da.png
deleted file mode 100644
index c55e81de99..0000000000
Binary files a/public/emoji/1f3da.png and /dev/null differ
diff --git a/public/emoji/1f3da.svg b/public/emoji/1f3da.svg
index bf6c30621f..df78c98e8e 100644
--- a/public/emoji/1f3da.svg
+++ b/public/emoji/1f3da.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3db.png b/public/emoji/1f3db.png
deleted file mode 100644
index de7b559daa..0000000000
Binary files a/public/emoji/1f3db.png and /dev/null differ
diff --git a/public/emoji/1f3db.svg b/public/emoji/1f3db.svg
index 501ea5c8b6..85a7984275 100644
--- a/public/emoji/1f3db.svg
+++ b/public/emoji/1f3db.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3dc.png b/public/emoji/1f3dc.png
deleted file mode 100644
index e9966ff8c6..0000000000
Binary files a/public/emoji/1f3dc.png and /dev/null differ
diff --git a/public/emoji/1f3dc.svg b/public/emoji/1f3dc.svg
index f95f15ea75..5dd33f2b98 100644
--- a/public/emoji/1f3dc.svg
+++ b/public/emoji/1f3dc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3dd.png b/public/emoji/1f3dd.png
deleted file mode 100644
index 7fd834389b..0000000000
Binary files a/public/emoji/1f3dd.png and /dev/null differ
diff --git a/public/emoji/1f3dd.svg b/public/emoji/1f3dd.svg
index c9bf170125..ef5d06435e 100644
--- a/public/emoji/1f3dd.svg
+++ b/public/emoji/1f3dd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3de.png b/public/emoji/1f3de.png
deleted file mode 100644
index 63ec701630..0000000000
Binary files a/public/emoji/1f3de.png and /dev/null differ
diff --git a/public/emoji/1f3de.svg b/public/emoji/1f3de.svg
index c3c729a29d..d0d38a8a1e 100644
--- a/public/emoji/1f3de.svg
+++ b/public/emoji/1f3de.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3df.png b/public/emoji/1f3df.png
deleted file mode 100644
index 00cd6db5e2..0000000000
Binary files a/public/emoji/1f3df.png and /dev/null differ
diff --git a/public/emoji/1f3df.svg b/public/emoji/1f3df.svg
index 579a720258..4b9818a8ee 100644
--- a/public/emoji/1f3df.svg
+++ b/public/emoji/1f3df.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3e0.png b/public/emoji/1f3e0.png
deleted file mode 100644
index 01c98a0ba9..0000000000
Binary files a/public/emoji/1f3e0.png and /dev/null differ
diff --git a/public/emoji/1f3e0.svg b/public/emoji/1f3e0.svg
index 5edbccef4d..c6b274a315 100644
--- a/public/emoji/1f3e0.svg
+++ b/public/emoji/1f3e0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3e1.png b/public/emoji/1f3e1.png
deleted file mode 100644
index 0aae41598e..0000000000
Binary files a/public/emoji/1f3e1.png and /dev/null differ
diff --git a/public/emoji/1f3e1.svg b/public/emoji/1f3e1.svg
index 8c1751eefc..b7fb3cc8a3 100644
--- a/public/emoji/1f3e1.svg
+++ b/public/emoji/1f3e1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3e2.png b/public/emoji/1f3e2.png
deleted file mode 100644
index 7eee927d1b..0000000000
Binary files a/public/emoji/1f3e2.png and /dev/null differ
diff --git a/public/emoji/1f3e2.svg b/public/emoji/1f3e2.svg
index 0f38711e03..71a4330611 100644
--- a/public/emoji/1f3e2.svg
+++ b/public/emoji/1f3e2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3e3.png b/public/emoji/1f3e3.png
deleted file mode 100644
index a23848f9aa..0000000000
Binary files a/public/emoji/1f3e3.png and /dev/null differ
diff --git a/public/emoji/1f3e3.svg b/public/emoji/1f3e3.svg
index db2004f55f..697b1bd85f 100644
--- a/public/emoji/1f3e3.svg
+++ b/public/emoji/1f3e3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3e4.png b/public/emoji/1f3e4.png
deleted file mode 100644
index 3745aff8dd..0000000000
Binary files a/public/emoji/1f3e4.png and /dev/null differ
diff --git a/public/emoji/1f3e4.svg b/public/emoji/1f3e4.svg
index 8359ad4f10..62040366aa 100644
--- a/public/emoji/1f3e4.svg
+++ b/public/emoji/1f3e4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3e5.png b/public/emoji/1f3e5.png
deleted file mode 100644
index 1cbce4ae76..0000000000
Binary files a/public/emoji/1f3e5.png and /dev/null differ
diff --git a/public/emoji/1f3e5.svg b/public/emoji/1f3e5.svg
index 448460d267..f115d2de48 100644
--- a/public/emoji/1f3e5.svg
+++ b/public/emoji/1f3e5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3e6.png b/public/emoji/1f3e6.png
deleted file mode 100644
index dffdcef36a..0000000000
Binary files a/public/emoji/1f3e6.png and /dev/null differ
diff --git a/public/emoji/1f3e6.svg b/public/emoji/1f3e6.svg
index dee2c6fa7c..99f5f1ff0f 100644
--- a/public/emoji/1f3e6.svg
+++ b/public/emoji/1f3e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3e7.png b/public/emoji/1f3e7.png
deleted file mode 100644
index 4d935307b9..0000000000
Binary files a/public/emoji/1f3e7.png and /dev/null differ
diff --git a/public/emoji/1f3e7.svg b/public/emoji/1f3e7.svg
index 770f019591..520b821148 100644
--- a/public/emoji/1f3e7.svg
+++ b/public/emoji/1f3e7.svg
@@ -1,3 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3e8.png b/public/emoji/1f3e8.png
deleted file mode 100644
index ea8f4c4979..0000000000
Binary files a/public/emoji/1f3e8.png and /dev/null differ
diff --git a/public/emoji/1f3e8.svg b/public/emoji/1f3e8.svg
index 6aaa759886..667bffaf71 100644
--- a/public/emoji/1f3e8.svg
+++ b/public/emoji/1f3e8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3e9.png b/public/emoji/1f3e9.png
deleted file mode 100644
index 5e136be6f8..0000000000
Binary files a/public/emoji/1f3e9.png and /dev/null differ
diff --git a/public/emoji/1f3e9.svg b/public/emoji/1f3e9.svg
index 5842ed57f8..036f2cb6ee 100644
--- a/public/emoji/1f3e9.svg
+++ b/public/emoji/1f3e9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ea.png b/public/emoji/1f3ea.png
deleted file mode 100644
index 26b53b5669..0000000000
Binary files a/public/emoji/1f3ea.png and /dev/null differ
diff --git a/public/emoji/1f3ea.svg b/public/emoji/1f3ea.svg
index c423a1ef7e..73b3620281 100644
--- a/public/emoji/1f3ea.svg
+++ b/public/emoji/1f3ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3eb.png b/public/emoji/1f3eb.png
deleted file mode 100644
index 269759534f..0000000000
Binary files a/public/emoji/1f3eb.png and /dev/null differ
diff --git a/public/emoji/1f3eb.svg b/public/emoji/1f3eb.svg
index 67a04c9213..e02359f960 100644
--- a/public/emoji/1f3eb.svg
+++ b/public/emoji/1f3eb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ec.png b/public/emoji/1f3ec.png
deleted file mode 100644
index 58867c7a6e..0000000000
Binary files a/public/emoji/1f3ec.png and /dev/null differ
diff --git a/public/emoji/1f3ec.svg b/public/emoji/1f3ec.svg
index d39eedf566..da4dac4488 100644
--- a/public/emoji/1f3ec.svg
+++ b/public/emoji/1f3ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ed.png b/public/emoji/1f3ed.png
deleted file mode 100644
index e1d2ddf4a2..0000000000
Binary files a/public/emoji/1f3ed.png and /dev/null differ
diff --git a/public/emoji/1f3ed.svg b/public/emoji/1f3ed.svg
index 43aaa5a076..2303b92e1e 100644
--- a/public/emoji/1f3ed.svg
+++ b/public/emoji/1f3ed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ee.png b/public/emoji/1f3ee.png
deleted file mode 100644
index dfd933f6f3..0000000000
Binary files a/public/emoji/1f3ee.png and /dev/null differ
diff --git a/public/emoji/1f3ee.svg b/public/emoji/1f3ee.svg
index 664a33340e..3fa57346ba 100644
--- a/public/emoji/1f3ee.svg
+++ b/public/emoji/1f3ee.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ef.png b/public/emoji/1f3ef.png
deleted file mode 100644
index 64b4e33a1a..0000000000
Binary files a/public/emoji/1f3ef.png and /dev/null differ
diff --git a/public/emoji/1f3ef.svg b/public/emoji/1f3ef.svg
index f4ba33581f..19127e6ff4 100644
--- a/public/emoji/1f3ef.svg
+++ b/public/emoji/1f3ef.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3f0.png b/public/emoji/1f3f0.png
deleted file mode 100644
index 888d11332c..0000000000
Binary files a/public/emoji/1f3f0.png and /dev/null differ
diff --git a/public/emoji/1f3f0.svg b/public/emoji/1f3f0.svg
index b0b4b12cc6..a8a08cdc2d 100644
--- a/public/emoji/1f3f0.svg
+++ b/public/emoji/1f3f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3f3-1f308.png b/public/emoji/1f3f3-1f308.png
deleted file mode 100644
index 1bec5f2ffd..0000000000
Binary files a/public/emoji/1f3f3-1f308.png and /dev/null differ
diff --git a/public/emoji/1f3f3-1f308.svg b/public/emoji/1f3f3-1f308.svg
deleted file mode 100644
index e082546b2b..0000000000
--- a/public/emoji/1f3f3-1f308.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f3f3-fe0f-200d-1f308.svg b/public/emoji/1f3f3-fe0f-200d-1f308.svg
new file mode 100644
index 0000000000..f3994d389a
--- /dev/null
+++ b/public/emoji/1f3f3-fe0f-200d-1f308.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3f3.png b/public/emoji/1f3f3.png
deleted file mode 100644
index 86d6e96d5e..0000000000
Binary files a/public/emoji/1f3f3.png and /dev/null differ
diff --git a/public/emoji/1f3f3.svg b/public/emoji/1f3f3.svg
index d1421b827d..2c792674e6 100644
--- a/public/emoji/1f3f3.svg
+++ b/public/emoji/1f3f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3f4-200d-2620-fe0f.svg b/public/emoji/1f3f4-200d-2620-fe0f.svg
new file mode 100644
index 0000000000..4c8a343446
--- /dev/null
+++ b/public/emoji/1f3f4-200d-2620-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.svg b/public/emoji/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.svg
new file mode 100644
index 0000000000..a929886b8b
--- /dev/null
+++ b/public/emoji/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.svg b/public/emoji/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.svg
new file mode 100644
index 0000000000..f732be741f
--- /dev/null
+++ b/public/emoji/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.svg b/public/emoji/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.svg
new file mode 100644
index 0000000000..76ac4e04fb
--- /dev/null
+++ b/public/emoji/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f3f4.png b/public/emoji/1f3f4.png
deleted file mode 100644
index 0e28d05d5a..0000000000
Binary files a/public/emoji/1f3f4.png and /dev/null differ
diff --git a/public/emoji/1f3f4.svg b/public/emoji/1f3f4.svg
index 0e6202dc16..82a6942b3f 100644
--- a/public/emoji/1f3f4.svg
+++ b/public/emoji/1f3f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3f5.png b/public/emoji/1f3f5.png
deleted file mode 100644
index 8030e494bc..0000000000
Binary files a/public/emoji/1f3f5.png and /dev/null differ
diff --git a/public/emoji/1f3f5.svg b/public/emoji/1f3f5.svg
index b6576ae999..624353dea5 100644
--- a/public/emoji/1f3f5.svg
+++ b/public/emoji/1f3f5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3f7.png b/public/emoji/1f3f7.png
deleted file mode 100644
index d41c9b4f1e..0000000000
Binary files a/public/emoji/1f3f7.png and /dev/null differ
diff --git a/public/emoji/1f3f7.svg b/public/emoji/1f3f7.svg
index 372a35f5ef..3851970f97 100644
--- a/public/emoji/1f3f7.svg
+++ b/public/emoji/1f3f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3f8.png b/public/emoji/1f3f8.png
deleted file mode 100644
index 7ba1570899..0000000000
Binary files a/public/emoji/1f3f8.png and /dev/null differ
diff --git a/public/emoji/1f3f8.svg b/public/emoji/1f3f8.svg
index c9e2b401ed..e4ade6338f 100644
--- a/public/emoji/1f3f8.svg
+++ b/public/emoji/1f3f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3f9.png b/public/emoji/1f3f9.png
deleted file mode 100644
index 6a538bf475..0000000000
Binary files a/public/emoji/1f3f9.png and /dev/null differ
diff --git a/public/emoji/1f3f9.svg b/public/emoji/1f3f9.svg
index e73e45cc3a..bc367fc4e5 100644
--- a/public/emoji/1f3f9.svg
+++ b/public/emoji/1f3f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3fa.png b/public/emoji/1f3fa.png
deleted file mode 100644
index 96de505605..0000000000
Binary files a/public/emoji/1f3fa.png and /dev/null differ
diff --git a/public/emoji/1f3fa.svg b/public/emoji/1f3fa.svg
index bf02dbddaf..e2c6cd44f0 100644
--- a/public/emoji/1f3fa.svg
+++ b/public/emoji/1f3fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3fb.png b/public/emoji/1f3fb.png
deleted file mode 100644
index 7c9d7cdc49..0000000000
Binary files a/public/emoji/1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f3fb.svg b/public/emoji/1f3fb.svg
index 95d9113d7e..dd5723819d 100644
--- a/public/emoji/1f3fb.svg
+++ b/public/emoji/1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3fc.png b/public/emoji/1f3fc.png
deleted file mode 100644
index c0fc8338c5..0000000000
Binary files a/public/emoji/1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f3fc.svg b/public/emoji/1f3fc.svg
index 98674ab9a5..6352920954 100644
--- a/public/emoji/1f3fc.svg
+++ b/public/emoji/1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3fd.png b/public/emoji/1f3fd.png
deleted file mode 100644
index 4814822f23..0000000000
Binary files a/public/emoji/1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f3fd.svg b/public/emoji/1f3fd.svg
index 3216c0c48e..efeab639ca 100644
--- a/public/emoji/1f3fd.svg
+++ b/public/emoji/1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3fe.png b/public/emoji/1f3fe.png
deleted file mode 100644
index 60599fa6b7..0000000000
Binary files a/public/emoji/1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f3fe.svg b/public/emoji/1f3fe.svg
index f4e86c3367..ac82ddb055 100644
--- a/public/emoji/1f3fe.svg
+++ b/public/emoji/1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f3ff.png b/public/emoji/1f3ff.png
deleted file mode 100644
index 4c528eaf6d..0000000000
Binary files a/public/emoji/1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f3ff.svg b/public/emoji/1f3ff.svg
index b99182a777..d0683b4279 100644
--- a/public/emoji/1f3ff.svg
+++ b/public/emoji/1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f400.png b/public/emoji/1f400.png
deleted file mode 100644
index 86219144f1..0000000000
Binary files a/public/emoji/1f400.png and /dev/null differ
diff --git a/public/emoji/1f400.svg b/public/emoji/1f400.svg
index 8dcadea17b..b3a80271c3 100644
--- a/public/emoji/1f400.svg
+++ b/public/emoji/1f400.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f401.png b/public/emoji/1f401.png
deleted file mode 100644
index 20fb041f09..0000000000
Binary files a/public/emoji/1f401.png and /dev/null differ
diff --git a/public/emoji/1f401.svg b/public/emoji/1f401.svg
index 944b4a2e58..54852c8f43 100644
--- a/public/emoji/1f401.svg
+++ b/public/emoji/1f401.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f402.png b/public/emoji/1f402.png
deleted file mode 100644
index badf5708f2..0000000000
Binary files a/public/emoji/1f402.png and /dev/null differ
diff --git a/public/emoji/1f402.svg b/public/emoji/1f402.svg
index 491e8d181b..b06f60b19b 100644
--- a/public/emoji/1f402.svg
+++ b/public/emoji/1f402.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f403.png b/public/emoji/1f403.png
deleted file mode 100644
index 80446615ca..0000000000
Binary files a/public/emoji/1f403.png and /dev/null differ
diff --git a/public/emoji/1f403.svg b/public/emoji/1f403.svg
index 96982688c7..cc5483e9f2 100644
--- a/public/emoji/1f403.svg
+++ b/public/emoji/1f403.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f404.png b/public/emoji/1f404.png
deleted file mode 100644
index 4d0ca534ff..0000000000
Binary files a/public/emoji/1f404.png and /dev/null differ
diff --git a/public/emoji/1f404.svg b/public/emoji/1f404.svg
index 1bf1728714..d0dca2b507 100644
--- a/public/emoji/1f404.svg
+++ b/public/emoji/1f404.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f405.png b/public/emoji/1f405.png
deleted file mode 100644
index 871a8b74d5..0000000000
Binary files a/public/emoji/1f405.png and /dev/null differ
diff --git a/public/emoji/1f405.svg b/public/emoji/1f405.svg
index 27db054c5b..383ee31f86 100644
--- a/public/emoji/1f405.svg
+++ b/public/emoji/1f405.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f406.png b/public/emoji/1f406.png
deleted file mode 100644
index 8aac3d4944..0000000000
Binary files a/public/emoji/1f406.png and /dev/null differ
diff --git a/public/emoji/1f406.svg b/public/emoji/1f406.svg
index 7093fe41ff..59a2e0585a 100644
--- a/public/emoji/1f406.svg
+++ b/public/emoji/1f406.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f407.png b/public/emoji/1f407.png
deleted file mode 100644
index 2c8a29c642..0000000000
Binary files a/public/emoji/1f407.png and /dev/null differ
diff --git a/public/emoji/1f407.svg b/public/emoji/1f407.svg
index f673e966de..54f4d69654 100644
--- a/public/emoji/1f407.svg
+++ b/public/emoji/1f407.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f408.png b/public/emoji/1f408.png
deleted file mode 100644
index 46abe8cbc1..0000000000
Binary files a/public/emoji/1f408.png and /dev/null differ
diff --git a/public/emoji/1f408.svg b/public/emoji/1f408.svg
index 4eadb2c416..68fe8f2a16 100644
--- a/public/emoji/1f408.svg
+++ b/public/emoji/1f408.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f409.png b/public/emoji/1f409.png
deleted file mode 100644
index d6311cf542..0000000000
Binary files a/public/emoji/1f409.png and /dev/null differ
diff --git a/public/emoji/1f409.svg b/public/emoji/1f409.svg
index aaf9cd252c..ab05374fb5 100644
--- a/public/emoji/1f409.svg
+++ b/public/emoji/1f409.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f40a.png b/public/emoji/1f40a.png
deleted file mode 100644
index 3005c46f17..0000000000
Binary files a/public/emoji/1f40a.png and /dev/null differ
diff --git a/public/emoji/1f40a.svg b/public/emoji/1f40a.svg
index d5dd7c6abc..1d3f3be012 100644
--- a/public/emoji/1f40a.svg
+++ b/public/emoji/1f40a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f40b.png b/public/emoji/1f40b.png
deleted file mode 100644
index 0df9d3c73a..0000000000
Binary files a/public/emoji/1f40b.png and /dev/null differ
diff --git a/public/emoji/1f40b.svg b/public/emoji/1f40b.svg
index 31bb7393f6..b6d3c6032f 100644
--- a/public/emoji/1f40b.svg
+++ b/public/emoji/1f40b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f40c.png b/public/emoji/1f40c.png
deleted file mode 100644
index f4ea071e2d..0000000000
Binary files a/public/emoji/1f40c.png and /dev/null differ
diff --git a/public/emoji/1f40c.svg b/public/emoji/1f40c.svg
index b4204fae0a..75393adf4c 100644
--- a/public/emoji/1f40c.svg
+++ b/public/emoji/1f40c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f40d.png b/public/emoji/1f40d.png
deleted file mode 100644
index d0278a28d8..0000000000
Binary files a/public/emoji/1f40d.png and /dev/null differ
diff --git a/public/emoji/1f40d.svg b/public/emoji/1f40d.svg
index 6ad56b8d9b..7e2fc51c23 100644
--- a/public/emoji/1f40d.svg
+++ b/public/emoji/1f40d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f40e.png b/public/emoji/1f40e.png
deleted file mode 100644
index b3e73cc890..0000000000
Binary files a/public/emoji/1f40e.png and /dev/null differ
diff --git a/public/emoji/1f40e.svg b/public/emoji/1f40e.svg
index b7ba4df3fb..ac2eab05a2 100644
--- a/public/emoji/1f40e.svg
+++ b/public/emoji/1f40e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f40f.png b/public/emoji/1f40f.png
deleted file mode 100644
index 52a44464c9..0000000000
Binary files a/public/emoji/1f40f.png and /dev/null differ
diff --git a/public/emoji/1f40f.svg b/public/emoji/1f40f.svg
index 2cf3e57155..5905609098 100644
--- a/public/emoji/1f40f.svg
+++ b/public/emoji/1f40f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f410.png b/public/emoji/1f410.png
deleted file mode 100644
index f9d9e38a12..0000000000
Binary files a/public/emoji/1f410.png and /dev/null differ
diff --git a/public/emoji/1f410.svg b/public/emoji/1f410.svg
index 445e63f8c9..056f6ba061 100644
--- a/public/emoji/1f410.svg
+++ b/public/emoji/1f410.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f411.png b/public/emoji/1f411.png
deleted file mode 100644
index 102b8a52b2..0000000000
Binary files a/public/emoji/1f411.png and /dev/null differ
diff --git a/public/emoji/1f411.svg b/public/emoji/1f411.svg
index 19d8b9e770..58cf59a30a 100644
--- a/public/emoji/1f411.svg
+++ b/public/emoji/1f411.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f412.png b/public/emoji/1f412.png
deleted file mode 100644
index 9fae29448e..0000000000
Binary files a/public/emoji/1f412.png and /dev/null differ
diff --git a/public/emoji/1f412.svg b/public/emoji/1f412.svg
index 713e48da89..f6335f3678 100644
--- a/public/emoji/1f412.svg
+++ b/public/emoji/1f412.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f413.png b/public/emoji/1f413.png
deleted file mode 100644
index bbf2bbff97..0000000000
Binary files a/public/emoji/1f413.png and /dev/null differ
diff --git a/public/emoji/1f413.svg b/public/emoji/1f413.svg
index 349de85521..b952ce5be5 100644
--- a/public/emoji/1f413.svg
+++ b/public/emoji/1f413.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f414.png b/public/emoji/1f414.png
deleted file mode 100644
index 9a6992e55b..0000000000
Binary files a/public/emoji/1f414.png and /dev/null differ
diff --git a/public/emoji/1f414.svg b/public/emoji/1f414.svg
index 34dfab5779..1fd1333457 100644
--- a/public/emoji/1f414.svg
+++ b/public/emoji/1f414.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f415.png b/public/emoji/1f415.png
deleted file mode 100644
index 976143dbdb..0000000000
Binary files a/public/emoji/1f415.png and /dev/null differ
diff --git a/public/emoji/1f415.svg b/public/emoji/1f415.svg
index 7fded5c112..3626f8a363 100644
--- a/public/emoji/1f415.svg
+++ b/public/emoji/1f415.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f416.png b/public/emoji/1f416.png
deleted file mode 100644
index 5f31c1a2d7..0000000000
Binary files a/public/emoji/1f416.png and /dev/null differ
diff --git a/public/emoji/1f416.svg b/public/emoji/1f416.svg
index a3f0422a51..d6fbe7c172 100644
--- a/public/emoji/1f416.svg
+++ b/public/emoji/1f416.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f417.png b/public/emoji/1f417.png
deleted file mode 100644
index fead972633..0000000000
Binary files a/public/emoji/1f417.png and /dev/null differ
diff --git a/public/emoji/1f417.svg b/public/emoji/1f417.svg
index d134de16ac..39715ce4eb 100644
--- a/public/emoji/1f417.svg
+++ b/public/emoji/1f417.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f418.png b/public/emoji/1f418.png
deleted file mode 100644
index b8a6d14059..0000000000
Binary files a/public/emoji/1f418.png and /dev/null differ
diff --git a/public/emoji/1f418.svg b/public/emoji/1f418.svg
index 80479aa3d7..595a808053 100644
--- a/public/emoji/1f418.svg
+++ b/public/emoji/1f418.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f419.png b/public/emoji/1f419.png
deleted file mode 100644
index 72c84074aa..0000000000
Binary files a/public/emoji/1f419.png and /dev/null differ
diff --git a/public/emoji/1f419.svg b/public/emoji/1f419.svg
index fa59238e2e..0f00d078e3 100644
--- a/public/emoji/1f419.svg
+++ b/public/emoji/1f419.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f41a.png b/public/emoji/1f41a.png
deleted file mode 100644
index 55721629f6..0000000000
Binary files a/public/emoji/1f41a.png and /dev/null differ
diff --git a/public/emoji/1f41a.svg b/public/emoji/1f41a.svg
index fb691d49bf..e4aef0416e 100644
--- a/public/emoji/1f41a.svg
+++ b/public/emoji/1f41a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f41b.png b/public/emoji/1f41b.png
deleted file mode 100644
index e64e72f259..0000000000
Binary files a/public/emoji/1f41b.png and /dev/null differ
diff --git a/public/emoji/1f41b.svg b/public/emoji/1f41b.svg
index 64bcedb14d..ddc70682e6 100644
--- a/public/emoji/1f41b.svg
+++ b/public/emoji/1f41b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f41c.png b/public/emoji/1f41c.png
deleted file mode 100644
index 994127ed6b..0000000000
Binary files a/public/emoji/1f41c.png and /dev/null differ
diff --git a/public/emoji/1f41c.svg b/public/emoji/1f41c.svg
index 2f90d0615a..8d8d18afd4 100644
--- a/public/emoji/1f41c.svg
+++ b/public/emoji/1f41c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f41d.png b/public/emoji/1f41d.png
deleted file mode 100644
index 4615606009..0000000000
Binary files a/public/emoji/1f41d.png and /dev/null differ
diff --git a/public/emoji/1f41d.svg b/public/emoji/1f41d.svg
index eb1819b075..956227a51f 100644
--- a/public/emoji/1f41d.svg
+++ b/public/emoji/1f41d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f41e.png b/public/emoji/1f41e.png
deleted file mode 100644
index 3d93174d7f..0000000000
Binary files a/public/emoji/1f41e.png and /dev/null differ
diff --git a/public/emoji/1f41e.svg b/public/emoji/1f41e.svg
index 0cbee7332c..179f097ddf 100644
--- a/public/emoji/1f41e.svg
+++ b/public/emoji/1f41e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f41f.png b/public/emoji/1f41f.png
deleted file mode 100644
index c2d2faaacd..0000000000
Binary files a/public/emoji/1f41f.png and /dev/null differ
diff --git a/public/emoji/1f41f.svg b/public/emoji/1f41f.svg
index d4ddc1a59f..4ad0515626 100644
--- a/public/emoji/1f41f.svg
+++ b/public/emoji/1f41f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f420.png b/public/emoji/1f420.png
deleted file mode 100644
index 252105235a..0000000000
Binary files a/public/emoji/1f420.png and /dev/null differ
diff --git a/public/emoji/1f420.svg b/public/emoji/1f420.svg
index 339bfce51c..0dc45ffe75 100644
--- a/public/emoji/1f420.svg
+++ b/public/emoji/1f420.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f421.png b/public/emoji/1f421.png
deleted file mode 100644
index a10f4f84e3..0000000000
Binary files a/public/emoji/1f421.png and /dev/null differ
diff --git a/public/emoji/1f421.svg b/public/emoji/1f421.svg
index 51e96024a1..1c24b12d02 100644
--- a/public/emoji/1f421.svg
+++ b/public/emoji/1f421.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f422.png b/public/emoji/1f422.png
deleted file mode 100644
index c22f7519fe..0000000000
Binary files a/public/emoji/1f422.png and /dev/null differ
diff --git a/public/emoji/1f422.svg b/public/emoji/1f422.svg
index 48be9dc54f..4ad52f2ee2 100644
--- a/public/emoji/1f422.svg
+++ b/public/emoji/1f422.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f423.png b/public/emoji/1f423.png
deleted file mode 100644
index c5b0e8f3bc..0000000000
Binary files a/public/emoji/1f423.png and /dev/null differ
diff --git a/public/emoji/1f423.svg b/public/emoji/1f423.svg
index 7d8abff5fd..b3635cdd0a 100644
--- a/public/emoji/1f423.svg
+++ b/public/emoji/1f423.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f424.png b/public/emoji/1f424.png
deleted file mode 100644
index dccd96576e..0000000000
Binary files a/public/emoji/1f424.png and /dev/null differ
diff --git a/public/emoji/1f424.svg b/public/emoji/1f424.svg
index f9269d1487..9766792867 100644
--- a/public/emoji/1f424.svg
+++ b/public/emoji/1f424.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f425.png b/public/emoji/1f425.png
deleted file mode 100644
index 31dfb511e0..0000000000
Binary files a/public/emoji/1f425.png and /dev/null differ
diff --git a/public/emoji/1f425.svg b/public/emoji/1f425.svg
index fabfbf927c..24dbec2aa5 100644
--- a/public/emoji/1f425.svg
+++ b/public/emoji/1f425.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f426.png b/public/emoji/1f426.png
deleted file mode 100644
index e201c22be3..0000000000
Binary files a/public/emoji/1f426.png and /dev/null differ
diff --git a/public/emoji/1f426.svg b/public/emoji/1f426.svg
index 225d767777..2760fec59f 100644
--- a/public/emoji/1f426.svg
+++ b/public/emoji/1f426.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f427.png b/public/emoji/1f427.png
deleted file mode 100644
index c0064fb973..0000000000
Binary files a/public/emoji/1f427.png and /dev/null differ
diff --git a/public/emoji/1f427.svg b/public/emoji/1f427.svg
index ce85cadf29..b83882c127 100644
--- a/public/emoji/1f427.svg
+++ b/public/emoji/1f427.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f428.png b/public/emoji/1f428.png
deleted file mode 100644
index a0aa437a98..0000000000
Binary files a/public/emoji/1f428.png and /dev/null differ
diff --git a/public/emoji/1f428.svg b/public/emoji/1f428.svg
index 88832b7022..9a54a0d287 100644
--- a/public/emoji/1f428.svg
+++ b/public/emoji/1f428.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f429.png b/public/emoji/1f429.png
deleted file mode 100644
index 8ec39e396a..0000000000
Binary files a/public/emoji/1f429.png and /dev/null differ
diff --git a/public/emoji/1f429.svg b/public/emoji/1f429.svg
index 7b56afe0d7..33c5b7ec09 100644
--- a/public/emoji/1f429.svg
+++ b/public/emoji/1f429.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f42a.png b/public/emoji/1f42a.png
deleted file mode 100644
index 5271637c7c..0000000000
Binary files a/public/emoji/1f42a.png and /dev/null differ
diff --git a/public/emoji/1f42a.svg b/public/emoji/1f42a.svg
index 63e30c13ae..e7f97340d5 100644
--- a/public/emoji/1f42a.svg
+++ b/public/emoji/1f42a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f42b.png b/public/emoji/1f42b.png
deleted file mode 100644
index b421d07a80..0000000000
Binary files a/public/emoji/1f42b.png and /dev/null differ
diff --git a/public/emoji/1f42b.svg b/public/emoji/1f42b.svg
index fbd4b0e1b1..a6b76e272f 100644
--- a/public/emoji/1f42b.svg
+++ b/public/emoji/1f42b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f42c.png b/public/emoji/1f42c.png
deleted file mode 100644
index 8143480900..0000000000
Binary files a/public/emoji/1f42c.png and /dev/null differ
diff --git a/public/emoji/1f42c.svg b/public/emoji/1f42c.svg
index abd84802ea..dc57e89abb 100644
--- a/public/emoji/1f42c.svg
+++ b/public/emoji/1f42c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f42d.png b/public/emoji/1f42d.png
deleted file mode 100644
index 50afcd3262..0000000000
Binary files a/public/emoji/1f42d.png and /dev/null differ
diff --git a/public/emoji/1f42d.svg b/public/emoji/1f42d.svg
index 0b215006dd..60fec435e9 100644
--- a/public/emoji/1f42d.svg
+++ b/public/emoji/1f42d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f42e.png b/public/emoji/1f42e.png
deleted file mode 100644
index 718a3986d6..0000000000
Binary files a/public/emoji/1f42e.png and /dev/null differ
diff --git a/public/emoji/1f42e.svg b/public/emoji/1f42e.svg
index f6d7c9a04b..a3d5d0305e 100644
--- a/public/emoji/1f42e.svg
+++ b/public/emoji/1f42e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f42f.png b/public/emoji/1f42f.png
deleted file mode 100644
index a4d3ef086d..0000000000
Binary files a/public/emoji/1f42f.png and /dev/null differ
diff --git a/public/emoji/1f42f.svg b/public/emoji/1f42f.svg
index 834981944b..934ec15ece 100644
--- a/public/emoji/1f42f.svg
+++ b/public/emoji/1f42f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f430.png b/public/emoji/1f430.png
deleted file mode 100644
index ea75ab0426..0000000000
Binary files a/public/emoji/1f430.png and /dev/null differ
diff --git a/public/emoji/1f430.svg b/public/emoji/1f430.svg
index ec8d17c081..4d80f7cb52 100644
--- a/public/emoji/1f430.svg
+++ b/public/emoji/1f430.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f431.png b/public/emoji/1f431.png
deleted file mode 100644
index efd82c2abf..0000000000
Binary files a/public/emoji/1f431.png and /dev/null differ
diff --git a/public/emoji/1f431.svg b/public/emoji/1f431.svg
index bacd52c388..7576d6bf34 100644
--- a/public/emoji/1f431.svg
+++ b/public/emoji/1f431.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f432.png b/public/emoji/1f432.png
deleted file mode 100644
index 3c2720446c..0000000000
Binary files a/public/emoji/1f432.png and /dev/null differ
diff --git a/public/emoji/1f432.svg b/public/emoji/1f432.svg
index b4b3669092..4f099dc736 100644
--- a/public/emoji/1f432.svg
+++ b/public/emoji/1f432.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f433.png b/public/emoji/1f433.png
deleted file mode 100644
index 9f19b44257..0000000000
Binary files a/public/emoji/1f433.png and /dev/null differ
diff --git a/public/emoji/1f433.svg b/public/emoji/1f433.svg
index dc6f7f1ecb..6085b47936 100644
--- a/public/emoji/1f433.svg
+++ b/public/emoji/1f433.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f434.png b/public/emoji/1f434.png
deleted file mode 100644
index 7cb1172f4e..0000000000
Binary files a/public/emoji/1f434.png and /dev/null differ
diff --git a/public/emoji/1f434.svg b/public/emoji/1f434.svg
index 5935149308..ae01857998 100644
--- a/public/emoji/1f434.svg
+++ b/public/emoji/1f434.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f435.png b/public/emoji/1f435.png
deleted file mode 100644
index 7cab9b91a8..0000000000
Binary files a/public/emoji/1f435.png and /dev/null differ
diff --git a/public/emoji/1f435.svg b/public/emoji/1f435.svg
index 5e796ada85..671de74ec7 100644
--- a/public/emoji/1f435.svg
+++ b/public/emoji/1f435.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f436.png b/public/emoji/1f436.png
deleted file mode 100644
index 281b81d58b..0000000000
Binary files a/public/emoji/1f436.png and /dev/null differ
diff --git a/public/emoji/1f436.svg b/public/emoji/1f436.svg
index b6af6c613f..d30951d4e3 100644
--- a/public/emoji/1f436.svg
+++ b/public/emoji/1f436.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f437.png b/public/emoji/1f437.png
deleted file mode 100644
index afe05ca167..0000000000
Binary files a/public/emoji/1f437.png and /dev/null differ
diff --git a/public/emoji/1f437.svg b/public/emoji/1f437.svg
index 30d534b087..41fe6ff8a9 100644
--- a/public/emoji/1f437.svg
+++ b/public/emoji/1f437.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f438.png b/public/emoji/1f438.png
deleted file mode 100644
index 8825d1ad57..0000000000
Binary files a/public/emoji/1f438.png and /dev/null differ
diff --git a/public/emoji/1f438.svg b/public/emoji/1f438.svg
index a45c14aaa6..4b2e5bbb8c 100644
--- a/public/emoji/1f438.svg
+++ b/public/emoji/1f438.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f439.png b/public/emoji/1f439.png
deleted file mode 100644
index 9a04388e4e..0000000000
Binary files a/public/emoji/1f439.png and /dev/null differ
diff --git a/public/emoji/1f439.svg b/public/emoji/1f439.svg
index 4027ed9b5b..a61817e293 100644
--- a/public/emoji/1f439.svg
+++ b/public/emoji/1f439.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f43a.png b/public/emoji/1f43a.png
deleted file mode 100644
index ba7220f2de..0000000000
Binary files a/public/emoji/1f43a.png and /dev/null differ
diff --git a/public/emoji/1f43a.svg b/public/emoji/1f43a.svg
index 7b2fd57512..5287eeea75 100644
--- a/public/emoji/1f43a.svg
+++ b/public/emoji/1f43a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f43b.png b/public/emoji/1f43b.png
deleted file mode 100644
index 272d56bbbc..0000000000
Binary files a/public/emoji/1f43b.png and /dev/null differ
diff --git a/public/emoji/1f43b.svg b/public/emoji/1f43b.svg
index 681e20a575..5b3c33d01d 100644
--- a/public/emoji/1f43b.svg
+++ b/public/emoji/1f43b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f43c.png b/public/emoji/1f43c.png
deleted file mode 100644
index 978382775c..0000000000
Binary files a/public/emoji/1f43c.png and /dev/null differ
diff --git a/public/emoji/1f43c.svg b/public/emoji/1f43c.svg
index 247aacc06c..f8964d903b 100644
--- a/public/emoji/1f43c.svg
+++ b/public/emoji/1f43c.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f43d.png b/public/emoji/1f43d.png
deleted file mode 100644
index 3610ae4a91..0000000000
Binary files a/public/emoji/1f43d.png and /dev/null differ
diff --git a/public/emoji/1f43d.svg b/public/emoji/1f43d.svg
index 6014a8b708..57642b28ae 100644
--- a/public/emoji/1f43d.svg
+++ b/public/emoji/1f43d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f43e.png b/public/emoji/1f43e.png
deleted file mode 100644
index 5fe568cee9..0000000000
Binary files a/public/emoji/1f43e.png and /dev/null differ
diff --git a/public/emoji/1f43e.svg b/public/emoji/1f43e.svg
index c6b2b83af7..846abe58e0 100644
--- a/public/emoji/1f43e.svg
+++ b/public/emoji/1f43e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f43f.png b/public/emoji/1f43f.png
deleted file mode 100644
index 2aac560cb2..0000000000
Binary files a/public/emoji/1f43f.png and /dev/null differ
diff --git a/public/emoji/1f43f.svg b/public/emoji/1f43f.svg
index 243ee89441..1363021ee5 100644
--- a/public/emoji/1f43f.svg
+++ b/public/emoji/1f43f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f440.png b/public/emoji/1f440.png
deleted file mode 100644
index 2102ada7e0..0000000000
Binary files a/public/emoji/1f440.png and /dev/null differ
diff --git a/public/emoji/1f440.svg b/public/emoji/1f440.svg
index 8caf9aafe4..b4f59a98b5 100644
--- a/public/emoji/1f440.svg
+++ b/public/emoji/1f440.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f441-1f5e8.png b/public/emoji/1f441-1f5e8.png
deleted file mode 100644
index 21bd22bbcc..0000000000
Binary files a/public/emoji/1f441-1f5e8.png and /dev/null differ
diff --git a/public/emoji/1f441-1f5e8.svg b/public/emoji/1f441-1f5e8.svg
deleted file mode 100644
index facc5a21ae..0000000000
--- a/public/emoji/1f441-1f5e8.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f441-200d-1f5e8.svg b/public/emoji/1f441-200d-1f5e8.svg
new file mode 100644
index 0000000000..fd23adad74
--- /dev/null
+++ b/public/emoji/1f441-200d-1f5e8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f441.png b/public/emoji/1f441.png
deleted file mode 100644
index 9d989cdd37..0000000000
Binary files a/public/emoji/1f441.png and /dev/null differ
diff --git a/public/emoji/1f441.svg b/public/emoji/1f441.svg
index 3ce3327d16..ae4257faac 100644
--- a/public/emoji/1f441.svg
+++ b/public/emoji/1f441.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f442-1f3fb.png b/public/emoji/1f442-1f3fb.png
deleted file mode 100644
index d09e1e4199..0000000000
Binary files a/public/emoji/1f442-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f442-1f3fb.svg b/public/emoji/1f442-1f3fb.svg
index e203744eaf..fcbaf73536 100644
--- a/public/emoji/1f442-1f3fb.svg
+++ b/public/emoji/1f442-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f442-1f3fc.png b/public/emoji/1f442-1f3fc.png
deleted file mode 100644
index 300d60a994..0000000000
Binary files a/public/emoji/1f442-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f442-1f3fc.svg b/public/emoji/1f442-1f3fc.svg
index e9b24783b9..103d6aca1a 100644
--- a/public/emoji/1f442-1f3fc.svg
+++ b/public/emoji/1f442-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f442-1f3fd.png b/public/emoji/1f442-1f3fd.png
deleted file mode 100644
index 2a56eebe44..0000000000
Binary files a/public/emoji/1f442-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f442-1f3fd.svg b/public/emoji/1f442-1f3fd.svg
index 717877f319..50708efd1d 100644
--- a/public/emoji/1f442-1f3fd.svg
+++ b/public/emoji/1f442-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f442-1f3fe.png b/public/emoji/1f442-1f3fe.png
deleted file mode 100644
index bd270f7763..0000000000
Binary files a/public/emoji/1f442-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f442-1f3fe.svg b/public/emoji/1f442-1f3fe.svg
index aaf77d80b3..1099e81510 100644
--- a/public/emoji/1f442-1f3fe.svg
+++ b/public/emoji/1f442-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f442-1f3ff.png b/public/emoji/1f442-1f3ff.png
deleted file mode 100644
index b96bb441df..0000000000
Binary files a/public/emoji/1f442-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f442-1f3ff.svg b/public/emoji/1f442-1f3ff.svg
index c8f653bba9..7e451d62b9 100644
--- a/public/emoji/1f442-1f3ff.svg
+++ b/public/emoji/1f442-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f442.png b/public/emoji/1f442.png
deleted file mode 100644
index f84f9ff154..0000000000
Binary files a/public/emoji/1f442.png and /dev/null differ
diff --git a/public/emoji/1f442.svg b/public/emoji/1f442.svg
index 3063df796c..6af51d61dc 100644
--- a/public/emoji/1f442.svg
+++ b/public/emoji/1f442.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f443-1f3fb.png b/public/emoji/1f443-1f3fb.png
deleted file mode 100644
index 8008d17506..0000000000
Binary files a/public/emoji/1f443-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f443-1f3fb.svg b/public/emoji/1f443-1f3fb.svg
index db943dbf4f..22d8710ab5 100644
--- a/public/emoji/1f443-1f3fb.svg
+++ b/public/emoji/1f443-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f443-1f3fc.png b/public/emoji/1f443-1f3fc.png
deleted file mode 100644
index ac17f26e82..0000000000
Binary files a/public/emoji/1f443-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f443-1f3fc.svg b/public/emoji/1f443-1f3fc.svg
index e909c446df..dc165861c2 100644
--- a/public/emoji/1f443-1f3fc.svg
+++ b/public/emoji/1f443-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f443-1f3fd.png b/public/emoji/1f443-1f3fd.png
deleted file mode 100644
index d8b6cbe0f8..0000000000
Binary files a/public/emoji/1f443-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f443-1f3fd.svg b/public/emoji/1f443-1f3fd.svg
index 61fe537698..1fb7a658b5 100644
--- a/public/emoji/1f443-1f3fd.svg
+++ b/public/emoji/1f443-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f443-1f3fe.png b/public/emoji/1f443-1f3fe.png
deleted file mode 100644
index 004b2631e2..0000000000
Binary files a/public/emoji/1f443-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f443-1f3fe.svg b/public/emoji/1f443-1f3fe.svg
index 4b9d466163..38bb79d05b 100644
--- a/public/emoji/1f443-1f3fe.svg
+++ b/public/emoji/1f443-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f443-1f3ff.png b/public/emoji/1f443-1f3ff.png
deleted file mode 100644
index 7b33821f6c..0000000000
Binary files a/public/emoji/1f443-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f443-1f3ff.svg b/public/emoji/1f443-1f3ff.svg
index a1daed04fd..c3d6381118 100644
--- a/public/emoji/1f443-1f3ff.svg
+++ b/public/emoji/1f443-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f443.png b/public/emoji/1f443.png
deleted file mode 100644
index 2f04ac5f98..0000000000
Binary files a/public/emoji/1f443.png and /dev/null differ
diff --git a/public/emoji/1f443.svg b/public/emoji/1f443.svg
index 6f1613804e..6aa7857d49 100644
--- a/public/emoji/1f443.svg
+++ b/public/emoji/1f443.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f444.png b/public/emoji/1f444.png
deleted file mode 100644
index 35f3cc2006..0000000000
Binary files a/public/emoji/1f444.png and /dev/null differ
diff --git a/public/emoji/1f444.svg b/public/emoji/1f444.svg
index 1bdb5440fa..0d8e7cf6fd 100644
--- a/public/emoji/1f444.svg
+++ b/public/emoji/1f444.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f445.png b/public/emoji/1f445.png
deleted file mode 100644
index 70ce9c1225..0000000000
Binary files a/public/emoji/1f445.png and /dev/null differ
diff --git a/public/emoji/1f445.svg b/public/emoji/1f445.svg
index 8a5af77fa8..86d4ea2007 100644
--- a/public/emoji/1f445.svg
+++ b/public/emoji/1f445.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f446-1f3fb.png b/public/emoji/1f446-1f3fb.png
deleted file mode 100644
index a12a7e7843..0000000000
Binary files a/public/emoji/1f446-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f446-1f3fb.svg b/public/emoji/1f446-1f3fb.svg
index 0b774dd4dd..d3797818f2 100644
--- a/public/emoji/1f446-1f3fb.svg
+++ b/public/emoji/1f446-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f446-1f3fc.png b/public/emoji/1f446-1f3fc.png
deleted file mode 100644
index cdff40ceab..0000000000
Binary files a/public/emoji/1f446-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f446-1f3fc.svg b/public/emoji/1f446-1f3fc.svg
index 8931e2428a..478b8d0974 100644
--- a/public/emoji/1f446-1f3fc.svg
+++ b/public/emoji/1f446-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f446-1f3fd.png b/public/emoji/1f446-1f3fd.png
deleted file mode 100644
index a07ce9e5ae..0000000000
Binary files a/public/emoji/1f446-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f446-1f3fd.svg b/public/emoji/1f446-1f3fd.svg
index 1bf90d5203..f3f5c4d62d 100644
--- a/public/emoji/1f446-1f3fd.svg
+++ b/public/emoji/1f446-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f446-1f3fe.png b/public/emoji/1f446-1f3fe.png
deleted file mode 100644
index 4f86c88ba4..0000000000
Binary files a/public/emoji/1f446-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f446-1f3fe.svg b/public/emoji/1f446-1f3fe.svg
index cfeb3e0a5d..75943fadf3 100644
--- a/public/emoji/1f446-1f3fe.svg
+++ b/public/emoji/1f446-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f446-1f3ff.png b/public/emoji/1f446-1f3ff.png
deleted file mode 100644
index ed1b26c35d..0000000000
Binary files a/public/emoji/1f446-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f446-1f3ff.svg b/public/emoji/1f446-1f3ff.svg
index 845edc3301..21289fae2d 100644
--- a/public/emoji/1f446-1f3ff.svg
+++ b/public/emoji/1f446-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f446.png b/public/emoji/1f446.png
deleted file mode 100644
index bc496dfeae..0000000000
Binary files a/public/emoji/1f446.png and /dev/null differ
diff --git a/public/emoji/1f446.svg b/public/emoji/1f446.svg
index fc4d2b1fd4..73464961d9 100644
--- a/public/emoji/1f446.svg
+++ b/public/emoji/1f446.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f447-1f3fb.png b/public/emoji/1f447-1f3fb.png
deleted file mode 100644
index 140f157d8c..0000000000
Binary files a/public/emoji/1f447-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f447-1f3fb.svg b/public/emoji/1f447-1f3fb.svg
index b6d347e66c..942fadfdb5 100644
--- a/public/emoji/1f447-1f3fb.svg
+++ b/public/emoji/1f447-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f447-1f3fc.png b/public/emoji/1f447-1f3fc.png
deleted file mode 100644
index d518544f7f..0000000000
Binary files a/public/emoji/1f447-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f447-1f3fc.svg b/public/emoji/1f447-1f3fc.svg
index cd98682fb5..891ba70886 100644
--- a/public/emoji/1f447-1f3fc.svg
+++ b/public/emoji/1f447-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f447-1f3fd.png b/public/emoji/1f447-1f3fd.png
deleted file mode 100644
index 018b688b8b..0000000000
Binary files a/public/emoji/1f447-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f447-1f3fd.svg b/public/emoji/1f447-1f3fd.svg
index a63fe57414..e363bcc3c6 100644
--- a/public/emoji/1f447-1f3fd.svg
+++ b/public/emoji/1f447-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f447-1f3fe.png b/public/emoji/1f447-1f3fe.png
deleted file mode 100644
index 98845bf6f7..0000000000
Binary files a/public/emoji/1f447-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f447-1f3fe.svg b/public/emoji/1f447-1f3fe.svg
index cdb5c4a813..a61d203139 100644
--- a/public/emoji/1f447-1f3fe.svg
+++ b/public/emoji/1f447-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f447-1f3ff.png b/public/emoji/1f447-1f3ff.png
deleted file mode 100644
index 9a9b039a9f..0000000000
Binary files a/public/emoji/1f447-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f447-1f3ff.svg b/public/emoji/1f447-1f3ff.svg
index 62fa984100..aca3691d91 100644
--- a/public/emoji/1f447-1f3ff.svg
+++ b/public/emoji/1f447-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f447.png b/public/emoji/1f447.png
deleted file mode 100644
index 00d3d13ab5..0000000000
Binary files a/public/emoji/1f447.png and /dev/null differ
diff --git a/public/emoji/1f447.svg b/public/emoji/1f447.svg
index 25b2490a24..9c0e528533 100644
--- a/public/emoji/1f447.svg
+++ b/public/emoji/1f447.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f448-1f3fb.png b/public/emoji/1f448-1f3fb.png
deleted file mode 100644
index 88e2c30607..0000000000
Binary files a/public/emoji/1f448-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f448-1f3fb.svg b/public/emoji/1f448-1f3fb.svg
index 16ef6409e5..f3b7f99d30 100644
--- a/public/emoji/1f448-1f3fb.svg
+++ b/public/emoji/1f448-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f448-1f3fc.png b/public/emoji/1f448-1f3fc.png
deleted file mode 100644
index d3c89d87c5..0000000000
Binary files a/public/emoji/1f448-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f448-1f3fc.svg b/public/emoji/1f448-1f3fc.svg
index e37282ab88..cd2a2d02bd 100644
--- a/public/emoji/1f448-1f3fc.svg
+++ b/public/emoji/1f448-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f448-1f3fd.png b/public/emoji/1f448-1f3fd.png
deleted file mode 100644
index b23b916735..0000000000
Binary files a/public/emoji/1f448-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f448-1f3fd.svg b/public/emoji/1f448-1f3fd.svg
index 09d730d4fe..b00149aafd 100644
--- a/public/emoji/1f448-1f3fd.svg
+++ b/public/emoji/1f448-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f448-1f3fe.png b/public/emoji/1f448-1f3fe.png
deleted file mode 100644
index 3093f325c2..0000000000
Binary files a/public/emoji/1f448-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f448-1f3fe.svg b/public/emoji/1f448-1f3fe.svg
index 07f16f2e93..970dcb2ce1 100644
--- a/public/emoji/1f448-1f3fe.svg
+++ b/public/emoji/1f448-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f448-1f3ff.png b/public/emoji/1f448-1f3ff.png
deleted file mode 100644
index 2b4cbfa120..0000000000
Binary files a/public/emoji/1f448-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f448-1f3ff.svg b/public/emoji/1f448-1f3ff.svg
index a382bfd7b0..0c4851b8de 100644
--- a/public/emoji/1f448-1f3ff.svg
+++ b/public/emoji/1f448-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f448.png b/public/emoji/1f448.png
deleted file mode 100644
index 599fa2e3cf..0000000000
Binary files a/public/emoji/1f448.png and /dev/null differ
diff --git a/public/emoji/1f448.svg b/public/emoji/1f448.svg
index 63e25672e3..800ff09aa3 100644
--- a/public/emoji/1f448.svg
+++ b/public/emoji/1f448.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f449-1f3fb.png b/public/emoji/1f449-1f3fb.png
deleted file mode 100644
index 4a28c6bbc8..0000000000
Binary files a/public/emoji/1f449-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f449-1f3fb.svg b/public/emoji/1f449-1f3fb.svg
index 150e78be99..c810f2a897 100644
--- a/public/emoji/1f449-1f3fb.svg
+++ b/public/emoji/1f449-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f449-1f3fc.png b/public/emoji/1f449-1f3fc.png
deleted file mode 100644
index 7cb1323173..0000000000
Binary files a/public/emoji/1f449-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f449-1f3fc.svg b/public/emoji/1f449-1f3fc.svg
index d30c03fe17..049a07e345 100644
--- a/public/emoji/1f449-1f3fc.svg
+++ b/public/emoji/1f449-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f449-1f3fd.png b/public/emoji/1f449-1f3fd.png
deleted file mode 100644
index 5514807d71..0000000000
Binary files a/public/emoji/1f449-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f449-1f3fd.svg b/public/emoji/1f449-1f3fd.svg
index 421e7e5af3..d5b62df749 100644
--- a/public/emoji/1f449-1f3fd.svg
+++ b/public/emoji/1f449-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f449-1f3fe.png b/public/emoji/1f449-1f3fe.png
deleted file mode 100644
index b8541d6440..0000000000
Binary files a/public/emoji/1f449-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f449-1f3fe.svg b/public/emoji/1f449-1f3fe.svg
index 43db2b7b2e..850a672de1 100644
--- a/public/emoji/1f449-1f3fe.svg
+++ b/public/emoji/1f449-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f449-1f3ff.png b/public/emoji/1f449-1f3ff.png
deleted file mode 100644
index 1b7aab07bb..0000000000
Binary files a/public/emoji/1f449-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f449-1f3ff.svg b/public/emoji/1f449-1f3ff.svg
index c3fde3f9d7..a04f4c9e3b 100644
--- a/public/emoji/1f449-1f3ff.svg
+++ b/public/emoji/1f449-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f449.png b/public/emoji/1f449.png
deleted file mode 100644
index 93a3cd34aa..0000000000
Binary files a/public/emoji/1f449.png and /dev/null differ
diff --git a/public/emoji/1f449.svg b/public/emoji/1f449.svg
index 815e08efb5..93f79ee855 100644
--- a/public/emoji/1f449.svg
+++ b/public/emoji/1f449.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44a-1f3fb.png b/public/emoji/1f44a-1f3fb.png
deleted file mode 100644
index 93c7d17fb4..0000000000
Binary files a/public/emoji/1f44a-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f44a-1f3fb.svg b/public/emoji/1f44a-1f3fb.svg
index 6b68ade7ea..f4e937b74e 100644
--- a/public/emoji/1f44a-1f3fb.svg
+++ b/public/emoji/1f44a-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44a-1f3fc.png b/public/emoji/1f44a-1f3fc.png
deleted file mode 100644
index c0a1af6e10..0000000000
Binary files a/public/emoji/1f44a-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f44a-1f3fc.svg b/public/emoji/1f44a-1f3fc.svg
index 7bb10f2fa3..a24a0a1051 100644
--- a/public/emoji/1f44a-1f3fc.svg
+++ b/public/emoji/1f44a-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44a-1f3fd.png b/public/emoji/1f44a-1f3fd.png
deleted file mode 100644
index 1458b02120..0000000000
Binary files a/public/emoji/1f44a-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f44a-1f3fd.svg b/public/emoji/1f44a-1f3fd.svg
index 1543e53a8b..5d0cb8ee95 100644
--- a/public/emoji/1f44a-1f3fd.svg
+++ b/public/emoji/1f44a-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44a-1f3fe.png b/public/emoji/1f44a-1f3fe.png
deleted file mode 100644
index c1466bfcde..0000000000
Binary files a/public/emoji/1f44a-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f44a-1f3fe.svg b/public/emoji/1f44a-1f3fe.svg
index 6485deb721..dabe7559b2 100644
--- a/public/emoji/1f44a-1f3fe.svg
+++ b/public/emoji/1f44a-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44a-1f3ff.png b/public/emoji/1f44a-1f3ff.png
deleted file mode 100644
index 00b4ddb895..0000000000
Binary files a/public/emoji/1f44a-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f44a-1f3ff.svg b/public/emoji/1f44a-1f3ff.svg
index 2eded30724..e064185462 100644
--- a/public/emoji/1f44a-1f3ff.svg
+++ b/public/emoji/1f44a-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44a.png b/public/emoji/1f44a.png
deleted file mode 100644
index b14ca5f521..0000000000
Binary files a/public/emoji/1f44a.png and /dev/null differ
diff --git a/public/emoji/1f44a.svg b/public/emoji/1f44a.svg
index 20b808db58..6d8336dafa 100644
--- a/public/emoji/1f44a.svg
+++ b/public/emoji/1f44a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44b-1f3fb.png b/public/emoji/1f44b-1f3fb.png
deleted file mode 100644
index 6b2b34b106..0000000000
Binary files a/public/emoji/1f44b-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f44b-1f3fb.svg b/public/emoji/1f44b-1f3fb.svg
index 981d4d4749..86471187bf 100644
--- a/public/emoji/1f44b-1f3fb.svg
+++ b/public/emoji/1f44b-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44b-1f3fc.png b/public/emoji/1f44b-1f3fc.png
deleted file mode 100644
index b857119732..0000000000
Binary files a/public/emoji/1f44b-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f44b-1f3fc.svg b/public/emoji/1f44b-1f3fc.svg
index 0e3fb5f890..490e479a4c 100644
--- a/public/emoji/1f44b-1f3fc.svg
+++ b/public/emoji/1f44b-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44b-1f3fd.png b/public/emoji/1f44b-1f3fd.png
deleted file mode 100644
index 6283b670f4..0000000000
Binary files a/public/emoji/1f44b-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f44b-1f3fd.svg b/public/emoji/1f44b-1f3fd.svg
index 801f13f4d7..8988c6e17a 100644
--- a/public/emoji/1f44b-1f3fd.svg
+++ b/public/emoji/1f44b-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44b-1f3fe.png b/public/emoji/1f44b-1f3fe.png
deleted file mode 100644
index fe6b2baa74..0000000000
Binary files a/public/emoji/1f44b-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f44b-1f3fe.svg b/public/emoji/1f44b-1f3fe.svg
index 687ff445f9..6c35abe524 100644
--- a/public/emoji/1f44b-1f3fe.svg
+++ b/public/emoji/1f44b-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44b-1f3ff.png b/public/emoji/1f44b-1f3ff.png
deleted file mode 100644
index 4bd168ebb7..0000000000
Binary files a/public/emoji/1f44b-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f44b-1f3ff.svg b/public/emoji/1f44b-1f3ff.svg
index 68636c28d4..5ef6da63f0 100644
--- a/public/emoji/1f44b-1f3ff.svg
+++ b/public/emoji/1f44b-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44b.png b/public/emoji/1f44b.png
deleted file mode 100644
index e0cd79b45f..0000000000
Binary files a/public/emoji/1f44b.png and /dev/null differ
diff --git a/public/emoji/1f44b.svg b/public/emoji/1f44b.svg
index 2118c9b43d..5860e81599 100644
--- a/public/emoji/1f44b.svg
+++ b/public/emoji/1f44b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44c-1f3fb.png b/public/emoji/1f44c-1f3fb.png
deleted file mode 100644
index cecf7b2ab5..0000000000
Binary files a/public/emoji/1f44c-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f44c-1f3fb.svg b/public/emoji/1f44c-1f3fb.svg
index 988b464e53..7c8564a1d8 100644
--- a/public/emoji/1f44c-1f3fb.svg
+++ b/public/emoji/1f44c-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44c-1f3fc.png b/public/emoji/1f44c-1f3fc.png
deleted file mode 100644
index c19239bcd3..0000000000
Binary files a/public/emoji/1f44c-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f44c-1f3fc.svg b/public/emoji/1f44c-1f3fc.svg
index c03cb353f1..606e6a14a8 100644
--- a/public/emoji/1f44c-1f3fc.svg
+++ b/public/emoji/1f44c-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44c-1f3fd.png b/public/emoji/1f44c-1f3fd.png
deleted file mode 100644
index 94b65b03ec..0000000000
Binary files a/public/emoji/1f44c-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f44c-1f3fd.svg b/public/emoji/1f44c-1f3fd.svg
index e6d0d54753..0477988343 100644
--- a/public/emoji/1f44c-1f3fd.svg
+++ b/public/emoji/1f44c-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44c-1f3fe.png b/public/emoji/1f44c-1f3fe.png
deleted file mode 100644
index 03d26f08e6..0000000000
Binary files a/public/emoji/1f44c-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f44c-1f3fe.svg b/public/emoji/1f44c-1f3fe.svg
index c28d64a332..3136ab5a91 100644
--- a/public/emoji/1f44c-1f3fe.svg
+++ b/public/emoji/1f44c-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44c-1f3ff.png b/public/emoji/1f44c-1f3ff.png
deleted file mode 100644
index d4b2408636..0000000000
Binary files a/public/emoji/1f44c-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f44c-1f3ff.svg b/public/emoji/1f44c-1f3ff.svg
index 6d2a3a4370..6c60c5cce4 100644
--- a/public/emoji/1f44c-1f3ff.svg
+++ b/public/emoji/1f44c-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44c.png b/public/emoji/1f44c.png
deleted file mode 100644
index 028d69b0de..0000000000
Binary files a/public/emoji/1f44c.png and /dev/null differ
diff --git a/public/emoji/1f44c.svg b/public/emoji/1f44c.svg
index bb3a06657a..3ccac82651 100644
--- a/public/emoji/1f44c.svg
+++ b/public/emoji/1f44c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44d-1f3fb.png b/public/emoji/1f44d-1f3fb.png
deleted file mode 100644
index 39684cd5cc..0000000000
Binary files a/public/emoji/1f44d-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f44d-1f3fb.svg b/public/emoji/1f44d-1f3fb.svg
index c50c59f9ff..f2ea302f93 100644
--- a/public/emoji/1f44d-1f3fb.svg
+++ b/public/emoji/1f44d-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44d-1f3fc.png b/public/emoji/1f44d-1f3fc.png
deleted file mode 100644
index a9b5972357..0000000000
Binary files a/public/emoji/1f44d-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f44d-1f3fc.svg b/public/emoji/1f44d-1f3fc.svg
index 54d7d6a19e..be40cb6423 100644
--- a/public/emoji/1f44d-1f3fc.svg
+++ b/public/emoji/1f44d-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44d-1f3fd.png b/public/emoji/1f44d-1f3fd.png
deleted file mode 100644
index c5e2916701..0000000000
Binary files a/public/emoji/1f44d-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f44d-1f3fd.svg b/public/emoji/1f44d-1f3fd.svg
index 1fc72ebe93..534a37fb2d 100644
--- a/public/emoji/1f44d-1f3fd.svg
+++ b/public/emoji/1f44d-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44d-1f3fe.png b/public/emoji/1f44d-1f3fe.png
deleted file mode 100644
index 5bf4857a88..0000000000
Binary files a/public/emoji/1f44d-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f44d-1f3fe.svg b/public/emoji/1f44d-1f3fe.svg
index 4db4b58eff..682fed7d46 100644
--- a/public/emoji/1f44d-1f3fe.svg
+++ b/public/emoji/1f44d-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44d-1f3ff.png b/public/emoji/1f44d-1f3ff.png
deleted file mode 100644
index d829f787c6..0000000000
Binary files a/public/emoji/1f44d-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f44d-1f3ff.svg b/public/emoji/1f44d-1f3ff.svg
index e64edfb135..280fed6aca 100644
--- a/public/emoji/1f44d-1f3ff.svg
+++ b/public/emoji/1f44d-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44d.png b/public/emoji/1f44d.png
deleted file mode 100644
index f9e6f13a34..0000000000
Binary files a/public/emoji/1f44d.png and /dev/null differ
diff --git a/public/emoji/1f44d.svg b/public/emoji/1f44d.svg
index 100df67076..de2963f8b9 100644
--- a/public/emoji/1f44d.svg
+++ b/public/emoji/1f44d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44e-1f3fb.png b/public/emoji/1f44e-1f3fb.png
deleted file mode 100644
index a1631af8e9..0000000000
Binary files a/public/emoji/1f44e-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f44e-1f3fb.svg b/public/emoji/1f44e-1f3fb.svg
index 298cda3697..98af17fe31 100644
--- a/public/emoji/1f44e-1f3fb.svg
+++ b/public/emoji/1f44e-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44e-1f3fc.png b/public/emoji/1f44e-1f3fc.png
deleted file mode 100644
index 85fff82d59..0000000000
Binary files a/public/emoji/1f44e-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f44e-1f3fc.svg b/public/emoji/1f44e-1f3fc.svg
index 79398ad090..4504b3b671 100644
--- a/public/emoji/1f44e-1f3fc.svg
+++ b/public/emoji/1f44e-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44e-1f3fd.png b/public/emoji/1f44e-1f3fd.png
deleted file mode 100644
index eeba3be80f..0000000000
Binary files a/public/emoji/1f44e-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f44e-1f3fd.svg b/public/emoji/1f44e-1f3fd.svg
index e0bf3be99a..b25cfcfbcc 100644
--- a/public/emoji/1f44e-1f3fd.svg
+++ b/public/emoji/1f44e-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44e-1f3fe.png b/public/emoji/1f44e-1f3fe.png
deleted file mode 100644
index 1addafdaed..0000000000
Binary files a/public/emoji/1f44e-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f44e-1f3fe.svg b/public/emoji/1f44e-1f3fe.svg
index 17fa30ceaf..fb26a9e6d1 100644
--- a/public/emoji/1f44e-1f3fe.svg
+++ b/public/emoji/1f44e-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44e-1f3ff.png b/public/emoji/1f44e-1f3ff.png
deleted file mode 100644
index 37ec07b572..0000000000
Binary files a/public/emoji/1f44e-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f44e-1f3ff.svg b/public/emoji/1f44e-1f3ff.svg
index c58da806fc..9d064d53a5 100644
--- a/public/emoji/1f44e-1f3ff.svg
+++ b/public/emoji/1f44e-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44e.png b/public/emoji/1f44e.png
deleted file mode 100644
index b63da2f20a..0000000000
Binary files a/public/emoji/1f44e.png and /dev/null differ
diff --git a/public/emoji/1f44e.svg b/public/emoji/1f44e.svg
index cd5ce20eeb..05c5a1f97a 100644
--- a/public/emoji/1f44e.svg
+++ b/public/emoji/1f44e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44f-1f3fb.png b/public/emoji/1f44f-1f3fb.png
deleted file mode 100644
index de4bc837b9..0000000000
Binary files a/public/emoji/1f44f-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f44f-1f3fb.svg b/public/emoji/1f44f-1f3fb.svg
index 4728186ef1..d11ee40be3 100644
--- a/public/emoji/1f44f-1f3fb.svg
+++ b/public/emoji/1f44f-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44f-1f3fc.png b/public/emoji/1f44f-1f3fc.png
deleted file mode 100644
index 1323de775b..0000000000
Binary files a/public/emoji/1f44f-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f44f-1f3fc.svg b/public/emoji/1f44f-1f3fc.svg
index ffb3d7e717..562ec07996 100644
--- a/public/emoji/1f44f-1f3fc.svg
+++ b/public/emoji/1f44f-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44f-1f3fd.png b/public/emoji/1f44f-1f3fd.png
deleted file mode 100644
index d448ca19dd..0000000000
Binary files a/public/emoji/1f44f-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f44f-1f3fd.svg b/public/emoji/1f44f-1f3fd.svg
index 138e7bde1e..ca3e19e1c5 100644
--- a/public/emoji/1f44f-1f3fd.svg
+++ b/public/emoji/1f44f-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44f-1f3fe.png b/public/emoji/1f44f-1f3fe.png
deleted file mode 100644
index c49f44ee91..0000000000
Binary files a/public/emoji/1f44f-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f44f-1f3fe.svg b/public/emoji/1f44f-1f3fe.svg
index 56107c4337..83b18c50e1 100644
--- a/public/emoji/1f44f-1f3fe.svg
+++ b/public/emoji/1f44f-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44f-1f3ff.png b/public/emoji/1f44f-1f3ff.png
deleted file mode 100644
index 29ee9bdf37..0000000000
Binary files a/public/emoji/1f44f-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f44f-1f3ff.svg b/public/emoji/1f44f-1f3ff.svg
index d4361ab361..c214a9b51d 100644
--- a/public/emoji/1f44f-1f3ff.svg
+++ b/public/emoji/1f44f-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f44f.png b/public/emoji/1f44f.png
deleted file mode 100644
index b0ffe92892..0000000000
Binary files a/public/emoji/1f44f.png and /dev/null differ
diff --git a/public/emoji/1f44f.svg b/public/emoji/1f44f.svg
index c611e5d3b1..d190887b75 100644
--- a/public/emoji/1f44f.svg
+++ b/public/emoji/1f44f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f450-1f3fb.png b/public/emoji/1f450-1f3fb.png
deleted file mode 100644
index 352d2614f1..0000000000
Binary files a/public/emoji/1f450-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f450-1f3fb.svg b/public/emoji/1f450-1f3fb.svg
index 3da933cf3b..fc3e988048 100644
--- a/public/emoji/1f450-1f3fb.svg
+++ b/public/emoji/1f450-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f450-1f3fc.png b/public/emoji/1f450-1f3fc.png
deleted file mode 100644
index 70824a50c7..0000000000
Binary files a/public/emoji/1f450-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f450-1f3fc.svg b/public/emoji/1f450-1f3fc.svg
index 4463814f00..da95cf19a5 100644
--- a/public/emoji/1f450-1f3fc.svg
+++ b/public/emoji/1f450-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f450-1f3fd.png b/public/emoji/1f450-1f3fd.png
deleted file mode 100644
index d7d136bd3d..0000000000
Binary files a/public/emoji/1f450-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f450-1f3fd.svg b/public/emoji/1f450-1f3fd.svg
index 715fb59fc8..3dfa45374b 100644
--- a/public/emoji/1f450-1f3fd.svg
+++ b/public/emoji/1f450-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f450-1f3fe.png b/public/emoji/1f450-1f3fe.png
deleted file mode 100644
index df4eaa711e..0000000000
Binary files a/public/emoji/1f450-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f450-1f3fe.svg b/public/emoji/1f450-1f3fe.svg
index d3c412ec00..f15104c537 100644
--- a/public/emoji/1f450-1f3fe.svg
+++ b/public/emoji/1f450-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f450-1f3ff.png b/public/emoji/1f450-1f3ff.png
deleted file mode 100644
index 7dc04eaebd..0000000000
Binary files a/public/emoji/1f450-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f450-1f3ff.svg b/public/emoji/1f450-1f3ff.svg
index d7dc9146f6..888cc644ed 100644
--- a/public/emoji/1f450-1f3ff.svg
+++ b/public/emoji/1f450-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f450.png b/public/emoji/1f450.png
deleted file mode 100644
index 1cf75c9101..0000000000
Binary files a/public/emoji/1f450.png and /dev/null differ
diff --git a/public/emoji/1f450.svg b/public/emoji/1f450.svg
index d910626503..5f4edc4c00 100644
--- a/public/emoji/1f450.svg
+++ b/public/emoji/1f450.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f451.png b/public/emoji/1f451.png
deleted file mode 100644
index 93b82d92f0..0000000000
Binary files a/public/emoji/1f451.png and /dev/null differ
diff --git a/public/emoji/1f451.svg b/public/emoji/1f451.svg
index ce7da0aab7..c8e31dfd55 100644
--- a/public/emoji/1f451.svg
+++ b/public/emoji/1f451.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f452.png b/public/emoji/1f452.png
deleted file mode 100644
index b837b6a2e4..0000000000
Binary files a/public/emoji/1f452.png and /dev/null differ
diff --git a/public/emoji/1f452.svg b/public/emoji/1f452.svg
index 0ef14ae7af..19c624995d 100644
--- a/public/emoji/1f452.svg
+++ b/public/emoji/1f452.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f453.png b/public/emoji/1f453.png
deleted file mode 100644
index 865d8274ac..0000000000
Binary files a/public/emoji/1f453.png and /dev/null differ
diff --git a/public/emoji/1f453.svg b/public/emoji/1f453.svg
index 0356c31efe..0e0451ea27 100644
--- a/public/emoji/1f453.svg
+++ b/public/emoji/1f453.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f454.png b/public/emoji/1f454.png
deleted file mode 100644
index 1804e7f3ff..0000000000
Binary files a/public/emoji/1f454.png and /dev/null differ
diff --git a/public/emoji/1f454.svg b/public/emoji/1f454.svg
index b72e4dc9e2..de9f10fee0 100644
--- a/public/emoji/1f454.svg
+++ b/public/emoji/1f454.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f455.png b/public/emoji/1f455.png
deleted file mode 100644
index af08dec8b5..0000000000
Binary files a/public/emoji/1f455.png and /dev/null differ
diff --git a/public/emoji/1f455.svg b/public/emoji/1f455.svg
index 33900afbbb..13581c7b6d 100644
--- a/public/emoji/1f455.svg
+++ b/public/emoji/1f455.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f456.png b/public/emoji/1f456.png
deleted file mode 100644
index 2a6869d674..0000000000
Binary files a/public/emoji/1f456.png and /dev/null differ
diff --git a/public/emoji/1f456.svg b/public/emoji/1f456.svg
index eed2f86df7..8f07c20785 100644
--- a/public/emoji/1f456.svg
+++ b/public/emoji/1f456.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f457.png b/public/emoji/1f457.png
deleted file mode 100644
index a697ca5c57..0000000000
Binary files a/public/emoji/1f457.png and /dev/null differ
diff --git a/public/emoji/1f457.svg b/public/emoji/1f457.svg
index 2a20f802b9..c00c84a045 100644
--- a/public/emoji/1f457.svg
+++ b/public/emoji/1f457.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f458.png b/public/emoji/1f458.png
deleted file mode 100644
index abe851115d..0000000000
Binary files a/public/emoji/1f458.png and /dev/null differ
diff --git a/public/emoji/1f458.svg b/public/emoji/1f458.svg
index 7f7bed9af8..6917bbc779 100644
--- a/public/emoji/1f458.svg
+++ b/public/emoji/1f458.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f459.png b/public/emoji/1f459.png
deleted file mode 100644
index 77a8a0aae5..0000000000
Binary files a/public/emoji/1f459.png and /dev/null differ
diff --git a/public/emoji/1f459.svg b/public/emoji/1f459.svg
index e0a1ca75df..6480f8f855 100644
--- a/public/emoji/1f459.svg
+++ b/public/emoji/1f459.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f45a.png b/public/emoji/1f45a.png
deleted file mode 100644
index 01410dc810..0000000000
Binary files a/public/emoji/1f45a.png and /dev/null differ
diff --git a/public/emoji/1f45a.svg b/public/emoji/1f45a.svg
index 294d86ef6f..4312f4ca5e 100644
--- a/public/emoji/1f45a.svg
+++ b/public/emoji/1f45a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f45b.png b/public/emoji/1f45b.png
deleted file mode 100644
index 981346193c..0000000000
Binary files a/public/emoji/1f45b.png and /dev/null differ
diff --git a/public/emoji/1f45b.svg b/public/emoji/1f45b.svg
index 2bb632f3ed..615cb606c3 100644
--- a/public/emoji/1f45b.svg
+++ b/public/emoji/1f45b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f45c.png b/public/emoji/1f45c.png
deleted file mode 100644
index cbf75c5d25..0000000000
Binary files a/public/emoji/1f45c.png and /dev/null differ
diff --git a/public/emoji/1f45c.svg b/public/emoji/1f45c.svg
index 39165931c8..ffa83ff157 100644
--- a/public/emoji/1f45c.svg
+++ b/public/emoji/1f45c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f45d.png b/public/emoji/1f45d.png
deleted file mode 100644
index 8795c6c66f..0000000000
Binary files a/public/emoji/1f45d.png and /dev/null differ
diff --git a/public/emoji/1f45d.svg b/public/emoji/1f45d.svg
index b877d3ed88..4cadb52c7a 100644
--- a/public/emoji/1f45d.svg
+++ b/public/emoji/1f45d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f45e.png b/public/emoji/1f45e.png
deleted file mode 100644
index 4bf7541032..0000000000
Binary files a/public/emoji/1f45e.png and /dev/null differ
diff --git a/public/emoji/1f45e.svg b/public/emoji/1f45e.svg
index 7dbe5d8bf1..5b71d31ff7 100644
--- a/public/emoji/1f45e.svg
+++ b/public/emoji/1f45e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f45f.png b/public/emoji/1f45f.png
deleted file mode 100644
index 423fa07dd5..0000000000
Binary files a/public/emoji/1f45f.png and /dev/null differ
diff --git a/public/emoji/1f45f.svg b/public/emoji/1f45f.svg
index a54733edcd..3b94ca3ce0 100644
--- a/public/emoji/1f45f.svg
+++ b/public/emoji/1f45f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f460.png b/public/emoji/1f460.png
deleted file mode 100644
index b331cbccc9..0000000000
Binary files a/public/emoji/1f460.png and /dev/null differ
diff --git a/public/emoji/1f460.svg b/public/emoji/1f460.svg
index 57b7e17fb9..334ea75ecd 100644
--- a/public/emoji/1f460.svg
+++ b/public/emoji/1f460.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f461.png b/public/emoji/1f461.png
deleted file mode 100644
index 9d9f5122b7..0000000000
Binary files a/public/emoji/1f461.png and /dev/null differ
diff --git a/public/emoji/1f461.svg b/public/emoji/1f461.svg
index e17e173db8..4da080d37e 100644
--- a/public/emoji/1f461.svg
+++ b/public/emoji/1f461.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f462.png b/public/emoji/1f462.png
deleted file mode 100644
index 11f1065ed0..0000000000
Binary files a/public/emoji/1f462.png and /dev/null differ
diff --git a/public/emoji/1f462.svg b/public/emoji/1f462.svg
index 72c94f379f..47948a9319 100644
--- a/public/emoji/1f462.svg
+++ b/public/emoji/1f462.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f463.png b/public/emoji/1f463.png
deleted file mode 100644
index b2673c5a1a..0000000000
Binary files a/public/emoji/1f463.png and /dev/null differ
diff --git a/public/emoji/1f463.svg b/public/emoji/1f463.svg
index 2330610517..c4ee494e6b 100644
--- a/public/emoji/1f463.svg
+++ b/public/emoji/1f463.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f464.png b/public/emoji/1f464.png
deleted file mode 100644
index 123b2cbe1f..0000000000
Binary files a/public/emoji/1f464.png and /dev/null differ
diff --git a/public/emoji/1f464.svg b/public/emoji/1f464.svg
index 9c0e92dadb..515da2c577 100644
--- a/public/emoji/1f464.svg
+++ b/public/emoji/1f464.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f465.png b/public/emoji/1f465.png
deleted file mode 100644
index d7656860a1..0000000000
Binary files a/public/emoji/1f465.png and /dev/null differ
diff --git a/public/emoji/1f465.svg b/public/emoji/1f465.svg
index 4ca629e3dc..9ac02e6dc0 100644
--- a/public/emoji/1f465.svg
+++ b/public/emoji/1f465.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f466-1f3fb.png b/public/emoji/1f466-1f3fb.png
deleted file mode 100644
index 2fc436ea51..0000000000
Binary files a/public/emoji/1f466-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f466-1f3fb.svg b/public/emoji/1f466-1f3fb.svg
index f0c2365dd3..ae20d77b54 100644
--- a/public/emoji/1f466-1f3fb.svg
+++ b/public/emoji/1f466-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f466-1f3fc.png b/public/emoji/1f466-1f3fc.png
deleted file mode 100644
index 09a5f18d36..0000000000
Binary files a/public/emoji/1f466-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f466-1f3fc.svg b/public/emoji/1f466-1f3fc.svg
index 296576e85b..380488720d 100644
--- a/public/emoji/1f466-1f3fc.svg
+++ b/public/emoji/1f466-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f466-1f3fd.png b/public/emoji/1f466-1f3fd.png
deleted file mode 100644
index 3cfe675dd3..0000000000
Binary files a/public/emoji/1f466-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f466-1f3fd.svg b/public/emoji/1f466-1f3fd.svg
index eafb2511db..12d0d0f067 100644
--- a/public/emoji/1f466-1f3fd.svg
+++ b/public/emoji/1f466-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f466-1f3fe.png b/public/emoji/1f466-1f3fe.png
deleted file mode 100644
index 780be0ace3..0000000000
Binary files a/public/emoji/1f466-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f466-1f3fe.svg b/public/emoji/1f466-1f3fe.svg
index 1623d305eb..5c9c55d97d 100644
--- a/public/emoji/1f466-1f3fe.svg
+++ b/public/emoji/1f466-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f466-1f3ff.png b/public/emoji/1f466-1f3ff.png
deleted file mode 100644
index f32fe22e35..0000000000
Binary files a/public/emoji/1f466-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f466-1f3ff.svg b/public/emoji/1f466-1f3ff.svg
index 051400b1c6..d0e4deca1c 100644
--- a/public/emoji/1f466-1f3ff.svg
+++ b/public/emoji/1f466-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f466.png b/public/emoji/1f466.png
deleted file mode 100644
index 8ecfb0a4e9..0000000000
Binary files a/public/emoji/1f466.png and /dev/null differ
diff --git a/public/emoji/1f466.svg b/public/emoji/1f466.svg
index 5e233fc8b6..3ef0fcc58a 100644
--- a/public/emoji/1f466.svg
+++ b/public/emoji/1f466.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f467-1f3fb.png b/public/emoji/1f467-1f3fb.png
deleted file mode 100644
index bb667e8865..0000000000
Binary files a/public/emoji/1f467-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f467-1f3fb.svg b/public/emoji/1f467-1f3fb.svg
index eeb7738dac..1836aaa671 100644
--- a/public/emoji/1f467-1f3fb.svg
+++ b/public/emoji/1f467-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f467-1f3fc.png b/public/emoji/1f467-1f3fc.png
deleted file mode 100644
index a59ed4a3f0..0000000000
Binary files a/public/emoji/1f467-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f467-1f3fc.svg b/public/emoji/1f467-1f3fc.svg
index 4088b48a76..08eae438e7 100644
--- a/public/emoji/1f467-1f3fc.svg
+++ b/public/emoji/1f467-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f467-1f3fd.png b/public/emoji/1f467-1f3fd.png
deleted file mode 100644
index 517e7f2a7b..0000000000
Binary files a/public/emoji/1f467-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f467-1f3fd.svg b/public/emoji/1f467-1f3fd.svg
index 18a76f65de..477ffe9ee7 100644
--- a/public/emoji/1f467-1f3fd.svg
+++ b/public/emoji/1f467-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f467-1f3fe.png b/public/emoji/1f467-1f3fe.png
deleted file mode 100644
index 542d96c848..0000000000
Binary files a/public/emoji/1f467-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f467-1f3fe.svg b/public/emoji/1f467-1f3fe.svg
index dbb0f5fc60..190ba22292 100644
--- a/public/emoji/1f467-1f3fe.svg
+++ b/public/emoji/1f467-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f467-1f3ff.png b/public/emoji/1f467-1f3ff.png
deleted file mode 100644
index 66b7c28c2d..0000000000
Binary files a/public/emoji/1f467-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f467-1f3ff.svg b/public/emoji/1f467-1f3ff.svg
index 80e424ed2b..8d2ca56367 100644
--- a/public/emoji/1f467-1f3ff.svg
+++ b/public/emoji/1f467-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f467.png b/public/emoji/1f467.png
deleted file mode 100644
index dc1d4d08b3..0000000000
Binary files a/public/emoji/1f467.png and /dev/null differ
diff --git a/public/emoji/1f467.svg b/public/emoji/1f467.svg
index 1cb7f67a65..a3bc670640 100644
--- a/public/emoji/1f467.svg
+++ b/public/emoji/1f467.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-1f33e.svg b/public/emoji/1f468-1f3fb-200d-1f33e.svg
new file mode 100644
index 0000000000..2b4b3e2dd9
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-1f33e.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-1f373.svg b/public/emoji/1f468-1f3fb-200d-1f373.svg
new file mode 100644
index 0000000000..80e793c79d
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-1f373.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-1f393.svg b/public/emoji/1f468-1f3fb-200d-1f393.svg
new file mode 100644
index 0000000000..1b9ca687a1
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-1f393.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-1f3a4.svg b/public/emoji/1f468-1f3fb-200d-1f3a4.svg
new file mode 100644
index 0000000000..3c51ea9595
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-1f3a4.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-1f3a8.svg b/public/emoji/1f468-1f3fb-200d-1f3a8.svg
new file mode 100644
index 0000000000..b884ed15d5
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-1f3a8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-1f3eb.svg b/public/emoji/1f468-1f3fb-200d-1f3eb.svg
new file mode 100644
index 0000000000..e33cca230a
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-1f3eb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-1f3ed.svg b/public/emoji/1f468-1f3fb-200d-1f3ed.svg
new file mode 100644
index 0000000000..53b9e25b46
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-1f3ed.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-1f4bb.svg b/public/emoji/1f468-1f3fb-200d-1f4bb.svg
new file mode 100644
index 0000000000..15601f70c8
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-1f4bb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-1f4bc.svg b/public/emoji/1f468-1f3fb-200d-1f4bc.svg
new file mode 100644
index 0000000000..f5987b48e0
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-1f4bc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-1f527.svg b/public/emoji/1f468-1f3fb-200d-1f527.svg
new file mode 100644
index 0000000000..7b44dc1737
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-1f527.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-1f52c.svg b/public/emoji/1f468-1f3fb-200d-1f52c.svg
new file mode 100644
index 0000000000..f14434d228
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-1f52c.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-1f680.svg b/public/emoji/1f468-1f3fb-200d-1f680.svg
new file mode 100644
index 0000000000..eab6f4e662
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-1f680.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-1f692.svg b/public/emoji/1f468-1f3fb-200d-1f692.svg
new file mode 100644
index 0000000000..e562eadeef
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-1f692.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-2695-fe0f.svg b/public/emoji/1f468-1f3fb-200d-2695-fe0f.svg
new file mode 100644
index 0000000000..73027bb864
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-2695-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-2696-fe0f.svg b/public/emoji/1f468-1f3fb-200d-2696-fe0f.svg
new file mode 100644
index 0000000000..9418cad316
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-2696-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb-200d-2708-fe0f.svg b/public/emoji/1f468-1f3fb-200d-2708-fe0f.svg
new file mode 100644
index 0000000000..119142aec7
--- /dev/null
+++ b/public/emoji/1f468-1f3fb-200d-2708-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fb.png b/public/emoji/1f468-1f3fb.png
deleted file mode 100644
index bb86e963a8..0000000000
Binary files a/public/emoji/1f468-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f468-1f3fb.svg b/public/emoji/1f468-1f3fb.svg
index 9ffc40139f..6c3bfe333d 100644
--- a/public/emoji/1f468-1f3fb.svg
+++ b/public/emoji/1f468-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-1f33e.svg b/public/emoji/1f468-1f3fc-200d-1f33e.svg
new file mode 100644
index 0000000000..6b9dff148b
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-1f33e.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-1f373.svg b/public/emoji/1f468-1f3fc-200d-1f373.svg
new file mode 100644
index 0000000000..3834a6fcac
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-1f373.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-1f393.svg b/public/emoji/1f468-1f3fc-200d-1f393.svg
new file mode 100644
index 0000000000..4c665c3073
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-1f393.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-1f3a4.svg b/public/emoji/1f468-1f3fc-200d-1f3a4.svg
new file mode 100644
index 0000000000..924e63cbb4
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-1f3a4.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-1f3a8.svg b/public/emoji/1f468-1f3fc-200d-1f3a8.svg
new file mode 100644
index 0000000000..340b2c74c1
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-1f3a8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-1f3eb.svg b/public/emoji/1f468-1f3fc-200d-1f3eb.svg
new file mode 100644
index 0000000000..891c080bc1
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-1f3eb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-1f3ed.svg b/public/emoji/1f468-1f3fc-200d-1f3ed.svg
new file mode 100644
index 0000000000..1e65941de4
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-1f3ed.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-1f4bb.svg b/public/emoji/1f468-1f3fc-200d-1f4bb.svg
new file mode 100644
index 0000000000..916faf9244
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-1f4bb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-1f4bc.svg b/public/emoji/1f468-1f3fc-200d-1f4bc.svg
new file mode 100644
index 0000000000..68a4145906
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-1f4bc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-1f527.svg b/public/emoji/1f468-1f3fc-200d-1f527.svg
new file mode 100644
index 0000000000..6ce9580f85
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-1f527.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-1f52c.svg b/public/emoji/1f468-1f3fc-200d-1f52c.svg
new file mode 100644
index 0000000000..054ab00962
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-1f52c.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-1f680.svg b/public/emoji/1f468-1f3fc-200d-1f680.svg
new file mode 100644
index 0000000000..523fe1c985
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-1f680.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-1f692.svg b/public/emoji/1f468-1f3fc-200d-1f692.svg
new file mode 100644
index 0000000000..4f05f832f3
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-1f692.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-2695-fe0f.svg b/public/emoji/1f468-1f3fc-200d-2695-fe0f.svg
new file mode 100644
index 0000000000..16625d4579
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-2695-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-2696-fe0f.svg b/public/emoji/1f468-1f3fc-200d-2696-fe0f.svg
new file mode 100644
index 0000000000..f2d87d2d70
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-2696-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc-200d-2708-fe0f.svg b/public/emoji/1f468-1f3fc-200d-2708-fe0f.svg
new file mode 100644
index 0000000000..e2496e389e
--- /dev/null
+++ b/public/emoji/1f468-1f3fc-200d-2708-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fc.png b/public/emoji/1f468-1f3fc.png
deleted file mode 100644
index fdeeaff46f..0000000000
Binary files a/public/emoji/1f468-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f468-1f3fc.svg b/public/emoji/1f468-1f3fc.svg
index e0e8d5fd30..19a37a4328 100644
--- a/public/emoji/1f468-1f3fc.svg
+++ b/public/emoji/1f468-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-1f33e.svg b/public/emoji/1f468-1f3fd-200d-1f33e.svg
new file mode 100644
index 0000000000..9eb2585981
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-1f33e.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-1f373.svg b/public/emoji/1f468-1f3fd-200d-1f373.svg
new file mode 100644
index 0000000000..5e723978b1
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-1f373.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-1f393.svg b/public/emoji/1f468-1f3fd-200d-1f393.svg
new file mode 100644
index 0000000000..15aa6ce23a
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-1f393.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-1f3a4.svg b/public/emoji/1f468-1f3fd-200d-1f3a4.svg
new file mode 100644
index 0000000000..9fec651300
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-1f3a4.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-1f3a8.svg b/public/emoji/1f468-1f3fd-200d-1f3a8.svg
new file mode 100644
index 0000000000..979e5bc52e
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-1f3a8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-1f3eb.svg b/public/emoji/1f468-1f3fd-200d-1f3eb.svg
new file mode 100644
index 0000000000..0ccca9bdef
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-1f3eb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-1f3ed.svg b/public/emoji/1f468-1f3fd-200d-1f3ed.svg
new file mode 100644
index 0000000000..b8d6cacae9
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-1f3ed.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-1f4bb.svg b/public/emoji/1f468-1f3fd-200d-1f4bb.svg
new file mode 100644
index 0000000000..d26aa9ae2b
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-1f4bb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-1f4bc.svg b/public/emoji/1f468-1f3fd-200d-1f4bc.svg
new file mode 100644
index 0000000000..3f59dbcbff
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-1f4bc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-1f527.svg b/public/emoji/1f468-1f3fd-200d-1f527.svg
new file mode 100644
index 0000000000..06b41a20c8
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-1f527.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-1f52c.svg b/public/emoji/1f468-1f3fd-200d-1f52c.svg
new file mode 100644
index 0000000000..98f161a81f
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-1f52c.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-1f680.svg b/public/emoji/1f468-1f3fd-200d-1f680.svg
new file mode 100644
index 0000000000..fd08434235
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-1f680.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-1f692.svg b/public/emoji/1f468-1f3fd-200d-1f692.svg
new file mode 100644
index 0000000000..5d9619e153
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-1f692.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-2695-fe0f.svg b/public/emoji/1f468-1f3fd-200d-2695-fe0f.svg
new file mode 100644
index 0000000000..4a53e82bd2
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-2695-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-2696-fe0f.svg b/public/emoji/1f468-1f3fd-200d-2696-fe0f.svg
new file mode 100644
index 0000000000..7815ddb92a
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-2696-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd-200d-2708-fe0f.svg b/public/emoji/1f468-1f3fd-200d-2708-fe0f.svg
new file mode 100644
index 0000000000..caf7f3dfd4
--- /dev/null
+++ b/public/emoji/1f468-1f3fd-200d-2708-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fd.png b/public/emoji/1f468-1f3fd.png
deleted file mode 100644
index 7ae0b5df9c..0000000000
Binary files a/public/emoji/1f468-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f468-1f3fd.svg b/public/emoji/1f468-1f3fd.svg
index 4fc71c6d81..42f34b8b0d 100644
--- a/public/emoji/1f468-1f3fd.svg
+++ b/public/emoji/1f468-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-1f33e.svg b/public/emoji/1f468-1f3fe-200d-1f33e.svg
new file mode 100644
index 0000000000..96a2bf5bf1
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-1f33e.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-1f373.svg b/public/emoji/1f468-1f3fe-200d-1f373.svg
new file mode 100644
index 0000000000..e608c4e26c
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-1f373.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-1f393.svg b/public/emoji/1f468-1f3fe-200d-1f393.svg
new file mode 100644
index 0000000000..da6f2b1003
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-1f393.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-1f3a4.svg b/public/emoji/1f468-1f3fe-200d-1f3a4.svg
new file mode 100644
index 0000000000..4eb5cd9c56
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-1f3a4.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-1f3a8.svg b/public/emoji/1f468-1f3fe-200d-1f3a8.svg
new file mode 100644
index 0000000000..d01f1b275e
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-1f3a8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-1f3eb.svg b/public/emoji/1f468-1f3fe-200d-1f3eb.svg
new file mode 100644
index 0000000000..ae70e8a4a0
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-1f3eb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-1f3ed.svg b/public/emoji/1f468-1f3fe-200d-1f3ed.svg
new file mode 100644
index 0000000000..1663a9c959
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-1f3ed.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-1f4bb.svg b/public/emoji/1f468-1f3fe-200d-1f4bb.svg
new file mode 100644
index 0000000000..7bcc7ecf43
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-1f4bb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-1f4bc.svg b/public/emoji/1f468-1f3fe-200d-1f4bc.svg
new file mode 100644
index 0000000000..094ce5d7e7
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-1f4bc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-1f527.svg b/public/emoji/1f468-1f3fe-200d-1f527.svg
new file mode 100644
index 0000000000..176da65b13
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-1f527.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-1f52c.svg b/public/emoji/1f468-1f3fe-200d-1f52c.svg
new file mode 100644
index 0000000000..ef4187208b
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-1f52c.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-1f680.svg b/public/emoji/1f468-1f3fe-200d-1f680.svg
new file mode 100644
index 0000000000..56fc2b18b0
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-1f680.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-1f692.svg b/public/emoji/1f468-1f3fe-200d-1f692.svg
new file mode 100644
index 0000000000..0408f4d359
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-1f692.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-2695-fe0f.svg b/public/emoji/1f468-1f3fe-200d-2695-fe0f.svg
new file mode 100644
index 0000000000..385369bf5e
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-2695-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-2696-fe0f.svg b/public/emoji/1f468-1f3fe-200d-2696-fe0f.svg
new file mode 100644
index 0000000000..ceb83559f5
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-2696-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe-200d-2708-fe0f.svg b/public/emoji/1f468-1f3fe-200d-2708-fe0f.svg
new file mode 100644
index 0000000000..799fd409b1
--- /dev/null
+++ b/public/emoji/1f468-1f3fe-200d-2708-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3fe.png b/public/emoji/1f468-1f3fe.png
deleted file mode 100644
index db14cde99b..0000000000
Binary files a/public/emoji/1f468-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f468-1f3fe.svg b/public/emoji/1f468-1f3fe.svg
index 9dc4c6df70..62054625af 100644
--- a/public/emoji/1f468-1f3fe.svg
+++ b/public/emoji/1f468-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-1f33e.svg b/public/emoji/1f468-1f3ff-200d-1f33e.svg
new file mode 100644
index 0000000000..e5edce8149
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-1f33e.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-1f373.svg b/public/emoji/1f468-1f3ff-200d-1f373.svg
new file mode 100644
index 0000000000..30eba86edb
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-1f373.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-1f393.svg b/public/emoji/1f468-1f3ff-200d-1f393.svg
new file mode 100644
index 0000000000..7d5672e850
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-1f393.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-1f3a4.svg b/public/emoji/1f468-1f3ff-200d-1f3a4.svg
new file mode 100644
index 0000000000..28d5059edd
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-1f3a4.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-1f3a8.svg b/public/emoji/1f468-1f3ff-200d-1f3a8.svg
new file mode 100644
index 0000000000..e63e974c66
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-1f3a8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-1f3eb.svg b/public/emoji/1f468-1f3ff-200d-1f3eb.svg
new file mode 100644
index 0000000000..2565b202fb
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-1f3eb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-1f3ed.svg b/public/emoji/1f468-1f3ff-200d-1f3ed.svg
new file mode 100644
index 0000000000..a3de0981d9
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-1f3ed.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-1f4bb.svg b/public/emoji/1f468-1f3ff-200d-1f4bb.svg
new file mode 100644
index 0000000000..401bfb9eb7
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-1f4bb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-1f4bc.svg b/public/emoji/1f468-1f3ff-200d-1f4bc.svg
new file mode 100644
index 0000000000..6e48ee3532
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-1f4bc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-1f527.svg b/public/emoji/1f468-1f3ff-200d-1f527.svg
new file mode 100644
index 0000000000..b188a3d21e
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-1f527.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-1f52c.svg b/public/emoji/1f468-1f3ff-200d-1f52c.svg
new file mode 100644
index 0000000000..e0eccb44bd
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-1f52c.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-1f680.svg b/public/emoji/1f468-1f3ff-200d-1f680.svg
new file mode 100644
index 0000000000..21f0babefb
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-1f680.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-1f692.svg b/public/emoji/1f468-1f3ff-200d-1f692.svg
new file mode 100644
index 0000000000..e99af4b65b
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-1f692.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-2695-fe0f.svg b/public/emoji/1f468-1f3ff-200d-2695-fe0f.svg
new file mode 100644
index 0000000000..515da8684d
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-2695-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-2696-fe0f.svg b/public/emoji/1f468-1f3ff-200d-2696-fe0f.svg
new file mode 100644
index 0000000000..96f7b0b85e
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-2696-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff-200d-2708-fe0f.svg b/public/emoji/1f468-1f3ff-200d-2708-fe0f.svg
new file mode 100644
index 0000000000..713423a789
--- /dev/null
+++ b/public/emoji/1f468-1f3ff-200d-2708-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-1f3ff.png b/public/emoji/1f468-1f3ff.png
deleted file mode 100644
index 7c67a70529..0000000000
Binary files a/public/emoji/1f468-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f468-1f3ff.svg b/public/emoji/1f468-1f3ff.svg
index fab2b43492..f8f629a42f 100644
--- a/public/emoji/1f468-1f3ff.svg
+++ b/public/emoji/1f468-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f468-1f468-1f466-1f466.png b/public/emoji/1f468-1f468-1f466-1f466.png
deleted file mode 100644
index 81e6c0fc0e..0000000000
Binary files a/public/emoji/1f468-1f468-1f466-1f466.png and /dev/null differ
diff --git a/public/emoji/1f468-1f468-1f466-1f466.svg b/public/emoji/1f468-1f468-1f466-1f466.svg
deleted file mode 100644
index 5c348147b6..0000000000
--- a/public/emoji/1f468-1f468-1f466-1f466.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f468-1f468-1f466.png b/public/emoji/1f468-1f468-1f466.png
deleted file mode 100644
index 7a2e4e2c49..0000000000
Binary files a/public/emoji/1f468-1f468-1f466.png and /dev/null differ
diff --git a/public/emoji/1f468-1f468-1f466.svg b/public/emoji/1f468-1f468-1f466.svg
deleted file mode 100644
index 7f5946500f..0000000000
--- a/public/emoji/1f468-1f468-1f466.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f468-1f468-1f467-1f466.png b/public/emoji/1f468-1f468-1f467-1f466.png
deleted file mode 100644
index 41e3516667..0000000000
Binary files a/public/emoji/1f468-1f468-1f467-1f466.png and /dev/null differ
diff --git a/public/emoji/1f468-1f468-1f467-1f466.svg b/public/emoji/1f468-1f468-1f467-1f466.svg
deleted file mode 100644
index 555c8bd84b..0000000000
--- a/public/emoji/1f468-1f468-1f467-1f466.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f468-1f468-1f467-1f467.png b/public/emoji/1f468-1f468-1f467-1f467.png
deleted file mode 100644
index 8e8ccfe6c7..0000000000
Binary files a/public/emoji/1f468-1f468-1f467-1f467.png and /dev/null differ
diff --git a/public/emoji/1f468-1f468-1f467-1f467.svg b/public/emoji/1f468-1f468-1f467-1f467.svg
deleted file mode 100644
index 1e35ca4eb1..0000000000
--- a/public/emoji/1f468-1f468-1f467-1f467.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f468-1f468-1f467.png b/public/emoji/1f468-1f468-1f467.png
deleted file mode 100644
index 932a85e1fe..0000000000
Binary files a/public/emoji/1f468-1f468-1f467.png and /dev/null differ
diff --git a/public/emoji/1f468-1f468-1f467.svg b/public/emoji/1f468-1f468-1f467.svg
deleted file mode 100644
index 6dfa7e98eb..0000000000
--- a/public/emoji/1f468-1f468-1f467.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f468-1f469-1f466-1f466.png b/public/emoji/1f468-1f469-1f466-1f466.png
deleted file mode 100644
index b544fbe573..0000000000
Binary files a/public/emoji/1f468-1f469-1f466-1f466.png and /dev/null differ
diff --git a/public/emoji/1f468-1f469-1f466-1f466.svg b/public/emoji/1f468-1f469-1f466-1f466.svg
deleted file mode 100644
index f877a886c9..0000000000
--- a/public/emoji/1f468-1f469-1f466-1f466.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f468-1f469-1f467-1f466.png b/public/emoji/1f468-1f469-1f467-1f466.png
deleted file mode 100644
index 40dbf1f7a1..0000000000
Binary files a/public/emoji/1f468-1f469-1f467-1f466.png and /dev/null differ
diff --git a/public/emoji/1f468-1f469-1f467-1f466.svg b/public/emoji/1f468-1f469-1f467-1f466.svg
deleted file mode 100644
index 0ab0a6b2bc..0000000000
--- a/public/emoji/1f468-1f469-1f467-1f466.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f468-1f469-1f467-1f467.png b/public/emoji/1f468-1f469-1f467-1f467.png
deleted file mode 100644
index bfefa4879c..0000000000
Binary files a/public/emoji/1f468-1f469-1f467-1f467.png and /dev/null differ
diff --git a/public/emoji/1f468-1f469-1f467-1f467.svg b/public/emoji/1f468-1f469-1f467-1f467.svg
deleted file mode 100644
index ca1285f9be..0000000000
--- a/public/emoji/1f468-1f469-1f467-1f467.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f468-1f469-1f467.png b/public/emoji/1f468-1f469-1f467.png
deleted file mode 100644
index 71d2681c32..0000000000
Binary files a/public/emoji/1f468-1f469-1f467.png and /dev/null differ
diff --git a/public/emoji/1f468-1f469-1f467.svg b/public/emoji/1f468-1f469-1f467.svg
deleted file mode 100644
index 0afec9c1b9..0000000000
--- a/public/emoji/1f468-1f469-1f467.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f468-200d-1f33e.svg b/public/emoji/1f468-200d-1f33e.svg
new file mode 100644
index 0000000000..315a53f07b
--- /dev/null
+++ b/public/emoji/1f468-200d-1f33e.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f373.svg b/public/emoji/1f468-200d-1f373.svg
new file mode 100644
index 0000000000..e999b54938
--- /dev/null
+++ b/public/emoji/1f468-200d-1f373.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f393.svg b/public/emoji/1f468-200d-1f393.svg
new file mode 100644
index 0000000000..701bc5f3aa
--- /dev/null
+++ b/public/emoji/1f468-200d-1f393.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f3a4.svg b/public/emoji/1f468-200d-1f3a4.svg
new file mode 100644
index 0000000000..48bbd13e8e
--- /dev/null
+++ b/public/emoji/1f468-200d-1f3a4.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f3a8.svg b/public/emoji/1f468-200d-1f3a8.svg
new file mode 100644
index 0000000000..861521d275
--- /dev/null
+++ b/public/emoji/1f468-200d-1f3a8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f3eb.svg b/public/emoji/1f468-200d-1f3eb.svg
new file mode 100644
index 0000000000..ff49105fc4
--- /dev/null
+++ b/public/emoji/1f468-200d-1f3eb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f3ed.svg b/public/emoji/1f468-200d-1f3ed.svg
new file mode 100644
index 0000000000..178acc73aa
--- /dev/null
+++ b/public/emoji/1f468-200d-1f3ed.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f466-200d-1f466.svg b/public/emoji/1f468-200d-1f466-200d-1f466.svg
new file mode 100644
index 0000000000..8edd3a9c56
--- /dev/null
+++ b/public/emoji/1f468-200d-1f466-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f466.svg b/public/emoji/1f468-200d-1f466.svg
new file mode 100644
index 0000000000..6ef28200c0
--- /dev/null
+++ b/public/emoji/1f468-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f467-200d-1f466.svg b/public/emoji/1f468-200d-1f467-200d-1f466.svg
new file mode 100644
index 0000000000..a12e1379f8
--- /dev/null
+++ b/public/emoji/1f468-200d-1f467-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f467-200d-1f467.svg b/public/emoji/1f468-200d-1f467-200d-1f467.svg
new file mode 100644
index 0000000000..b9b029f59a
--- /dev/null
+++ b/public/emoji/1f468-200d-1f467-200d-1f467.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f467.svg b/public/emoji/1f468-200d-1f467.svg
new file mode 100644
index 0000000000..9b0ded754a
--- /dev/null
+++ b/public/emoji/1f468-200d-1f467.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f468-200d-1f466-200d-1f466.svg b/public/emoji/1f468-200d-1f468-200d-1f466-200d-1f466.svg
new file mode 100644
index 0000000000..621d66ec97
--- /dev/null
+++ b/public/emoji/1f468-200d-1f468-200d-1f466-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f468-200d-1f466.svg b/public/emoji/1f468-200d-1f468-200d-1f466.svg
new file mode 100644
index 0000000000..b44243a480
--- /dev/null
+++ b/public/emoji/1f468-200d-1f468-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f468-200d-1f467-200d-1f466.svg b/public/emoji/1f468-200d-1f468-200d-1f467-200d-1f466.svg
new file mode 100644
index 0000000000..613d824d38
--- /dev/null
+++ b/public/emoji/1f468-200d-1f468-200d-1f467-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f468-200d-1f467-200d-1f467.svg b/public/emoji/1f468-200d-1f468-200d-1f467-200d-1f467.svg
new file mode 100644
index 0000000000..8dcf9c6348
--- /dev/null
+++ b/public/emoji/1f468-200d-1f468-200d-1f467-200d-1f467.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f468-200d-1f467.svg b/public/emoji/1f468-200d-1f468-200d-1f467.svg
new file mode 100644
index 0000000000..f5395db98d
--- /dev/null
+++ b/public/emoji/1f468-200d-1f468-200d-1f467.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f469-200d-1f466-200d-1f466.svg b/public/emoji/1f468-200d-1f469-200d-1f466-200d-1f466.svg
new file mode 100644
index 0000000000..4146ccc4f7
--- /dev/null
+++ b/public/emoji/1f468-200d-1f469-200d-1f466-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f469-200d-1f466.svg b/public/emoji/1f468-200d-1f469-200d-1f466.svg
new file mode 100644
index 0000000000..ce5ccdd204
--- /dev/null
+++ b/public/emoji/1f468-200d-1f469-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f469-200d-1f467-200d-1f466.svg b/public/emoji/1f468-200d-1f469-200d-1f467-200d-1f466.svg
new file mode 100644
index 0000000000..de683b2563
--- /dev/null
+++ b/public/emoji/1f468-200d-1f469-200d-1f467-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f469-200d-1f467-200d-1f467.svg b/public/emoji/1f468-200d-1f469-200d-1f467-200d-1f467.svg
new file mode 100644
index 0000000000..bbc2e5b404
--- /dev/null
+++ b/public/emoji/1f468-200d-1f469-200d-1f467-200d-1f467.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f469-200d-1f467.svg b/public/emoji/1f468-200d-1f469-200d-1f467.svg
new file mode 100644
index 0000000000..6eecb56bbc
--- /dev/null
+++ b/public/emoji/1f468-200d-1f469-200d-1f467.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f4bb.svg b/public/emoji/1f468-200d-1f4bb.svg
new file mode 100644
index 0000000000..d5721aa9cd
--- /dev/null
+++ b/public/emoji/1f468-200d-1f4bb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f4bc.svg b/public/emoji/1f468-200d-1f4bc.svg
new file mode 100644
index 0000000000..62b3870a9d
--- /dev/null
+++ b/public/emoji/1f468-200d-1f4bc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f527.svg b/public/emoji/1f468-200d-1f527.svg
new file mode 100644
index 0000000000..22e44a25b9
--- /dev/null
+++ b/public/emoji/1f468-200d-1f527.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f52c.svg b/public/emoji/1f468-200d-1f52c.svg
new file mode 100644
index 0000000000..084d54a684
--- /dev/null
+++ b/public/emoji/1f468-200d-1f52c.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f680.svg b/public/emoji/1f468-200d-1f680.svg
new file mode 100644
index 0000000000..5a5e3c84b2
--- /dev/null
+++ b/public/emoji/1f468-200d-1f680.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-1f692.svg b/public/emoji/1f468-200d-1f692.svg
new file mode 100644
index 0000000000..134d977222
--- /dev/null
+++ b/public/emoji/1f468-200d-1f692.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-2695-fe0f.svg b/public/emoji/1f468-200d-2695-fe0f.svg
new file mode 100644
index 0000000000..4c83450a2f
--- /dev/null
+++ b/public/emoji/1f468-200d-2695-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-2696-fe0f.svg b/public/emoji/1f468-200d-2696-fe0f.svg
new file mode 100644
index 0000000000..01dc234b65
--- /dev/null
+++ b/public/emoji/1f468-200d-2696-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-2708-fe0f.svg b/public/emoji/1f468-200d-2708-fe0f.svg
new file mode 100644
index 0000000000..e787f82751
--- /dev/null
+++ b/public/emoji/1f468-200d-2708-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-2764-fe0f-200d-1f468.svg b/public/emoji/1f468-200d-2764-fe0f-200d-1f468.svg
new file mode 100644
index 0000000000..42220fc2e0
--- /dev/null
+++ b/public/emoji/1f468-200d-2764-fe0f-200d-1f468.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg b/public/emoji/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg
new file mode 100644
index 0000000000..0a0955d14e
--- /dev/null
+++ b/public/emoji/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f468-2764-1f468.png b/public/emoji/1f468-2764-1f468.png
deleted file mode 100644
index 8759fa5db8..0000000000
Binary files a/public/emoji/1f468-2764-1f468.png and /dev/null differ
diff --git a/public/emoji/1f468-2764-1f468.svg b/public/emoji/1f468-2764-1f468.svg
deleted file mode 100644
index 727c3fc949..0000000000
--- a/public/emoji/1f468-2764-1f468.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f468-2764-1f48b-1f468.png b/public/emoji/1f468-2764-1f48b-1f468.png
deleted file mode 100644
index a9a0edae17..0000000000
Binary files a/public/emoji/1f468-2764-1f48b-1f468.png and /dev/null differ
diff --git a/public/emoji/1f468-2764-1f48b-1f468.svg b/public/emoji/1f468-2764-1f48b-1f468.svg
deleted file mode 100644
index 5e84506824..0000000000
--- a/public/emoji/1f468-2764-1f48b-1f468.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f468.png b/public/emoji/1f468.png
deleted file mode 100644
index 857a02e514..0000000000
Binary files a/public/emoji/1f468.png and /dev/null differ
diff --git a/public/emoji/1f468.svg b/public/emoji/1f468.svg
index 0f27a28365..9148131936 100644
--- a/public/emoji/1f468.svg
+++ b/public/emoji/1f468.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-1f33e.svg b/public/emoji/1f469-1f3fb-200d-1f33e.svg
new file mode 100644
index 0000000000..a393ab23e6
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-1f33e.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-1f373.svg b/public/emoji/1f469-1f3fb-200d-1f373.svg
new file mode 100644
index 0000000000..49513c95f5
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-1f373.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-1f393.svg b/public/emoji/1f469-1f3fb-200d-1f393.svg
new file mode 100644
index 0000000000..15b1261679
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-1f393.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-1f3a4.svg b/public/emoji/1f469-1f3fb-200d-1f3a4.svg
new file mode 100644
index 0000000000..a0648002f7
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-1f3a4.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-1f3a8.svg b/public/emoji/1f469-1f3fb-200d-1f3a8.svg
new file mode 100644
index 0000000000..ab51794347
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-1f3a8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-1f3eb.svg b/public/emoji/1f469-1f3fb-200d-1f3eb.svg
new file mode 100644
index 0000000000..68f3a9e4e7
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-1f3eb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-1f3ed.svg b/public/emoji/1f469-1f3fb-200d-1f3ed.svg
new file mode 100644
index 0000000000..3586f5448c
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-1f3ed.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-1f4bb.svg b/public/emoji/1f469-1f3fb-200d-1f4bb.svg
new file mode 100644
index 0000000000..01efc523f6
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-1f4bb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-1f4bc.svg b/public/emoji/1f469-1f3fb-200d-1f4bc.svg
new file mode 100644
index 0000000000..60bf352906
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-1f4bc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-1f527.svg b/public/emoji/1f469-1f3fb-200d-1f527.svg
new file mode 100644
index 0000000000..db0ba00c29
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-1f527.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-1f52c.svg b/public/emoji/1f469-1f3fb-200d-1f52c.svg
new file mode 100644
index 0000000000..95fbcb49b4
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-1f52c.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-1f680.svg b/public/emoji/1f469-1f3fb-200d-1f680.svg
new file mode 100644
index 0000000000..5913cc9b60
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-1f680.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-1f692.svg b/public/emoji/1f469-1f3fb-200d-1f692.svg
new file mode 100644
index 0000000000..c3442f9551
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-1f692.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-2695-fe0f.svg b/public/emoji/1f469-1f3fb-200d-2695-fe0f.svg
new file mode 100644
index 0000000000..1873ac8c3d
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-2695-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-2696-fe0f.svg b/public/emoji/1f469-1f3fb-200d-2696-fe0f.svg
new file mode 100644
index 0000000000..92cf6553e8
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-2696-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb-200d-2708-fe0f.svg b/public/emoji/1f469-1f3fb-200d-2708-fe0f.svg
new file mode 100644
index 0000000000..3d9d0cecad
--- /dev/null
+++ b/public/emoji/1f469-1f3fb-200d-2708-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fb.png b/public/emoji/1f469-1f3fb.png
deleted file mode 100644
index ff089b8889..0000000000
Binary files a/public/emoji/1f469-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f469-1f3fb.svg b/public/emoji/1f469-1f3fb.svg
index 62b4b63227..7866eff41f 100644
--- a/public/emoji/1f469-1f3fb.svg
+++ b/public/emoji/1f469-1f3fb.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-1f33e.svg b/public/emoji/1f469-1f3fc-200d-1f33e.svg
new file mode 100644
index 0000000000..442deaec1f
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-1f33e.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-1f373.svg b/public/emoji/1f469-1f3fc-200d-1f373.svg
new file mode 100644
index 0000000000..a4161eaca4
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-1f373.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-1f393.svg b/public/emoji/1f469-1f3fc-200d-1f393.svg
new file mode 100644
index 0000000000..5aa6c0ec0e
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-1f393.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-1f3a4.svg b/public/emoji/1f469-1f3fc-200d-1f3a4.svg
new file mode 100644
index 0000000000..9f26f9fda7
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-1f3a4.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-1f3a8.svg b/public/emoji/1f469-1f3fc-200d-1f3a8.svg
new file mode 100644
index 0000000000..11017c8002
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-1f3a8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-1f3eb.svg b/public/emoji/1f469-1f3fc-200d-1f3eb.svg
new file mode 100644
index 0000000000..e0f456b98a
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-1f3eb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-1f3ed.svg b/public/emoji/1f469-1f3fc-200d-1f3ed.svg
new file mode 100644
index 0000000000..0cef02e69d
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-1f3ed.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-1f4bb.svg b/public/emoji/1f469-1f3fc-200d-1f4bb.svg
new file mode 100644
index 0000000000..37c0eb59c7
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-1f4bb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-1f4bc.svg b/public/emoji/1f469-1f3fc-200d-1f4bc.svg
new file mode 100644
index 0000000000..3daf9c47bb
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-1f4bc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-1f527.svg b/public/emoji/1f469-1f3fc-200d-1f527.svg
new file mode 100644
index 0000000000..3b6fc5c200
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-1f527.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-1f52c.svg b/public/emoji/1f469-1f3fc-200d-1f52c.svg
new file mode 100644
index 0000000000..47d03225af
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-1f52c.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-1f680.svg b/public/emoji/1f469-1f3fc-200d-1f680.svg
new file mode 100644
index 0000000000..11378acaef
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-1f680.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-1f692.svg b/public/emoji/1f469-1f3fc-200d-1f692.svg
new file mode 100644
index 0000000000..35e271ba47
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-1f692.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-2695-fe0f.svg b/public/emoji/1f469-1f3fc-200d-2695-fe0f.svg
new file mode 100644
index 0000000000..dabd93e1dd
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-2695-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-2696-fe0f.svg b/public/emoji/1f469-1f3fc-200d-2696-fe0f.svg
new file mode 100644
index 0000000000..f0a3ea40c0
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-2696-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc-200d-2708-fe0f.svg b/public/emoji/1f469-1f3fc-200d-2708-fe0f.svg
new file mode 100644
index 0000000000..81c041eebe
--- /dev/null
+++ b/public/emoji/1f469-1f3fc-200d-2708-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fc.png b/public/emoji/1f469-1f3fc.png
deleted file mode 100644
index 0719c37801..0000000000
Binary files a/public/emoji/1f469-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f469-1f3fc.svg b/public/emoji/1f469-1f3fc.svg
index 2556b3a2d3..8328828e1e 100644
--- a/public/emoji/1f469-1f3fc.svg
+++ b/public/emoji/1f469-1f3fc.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-1f33e.svg b/public/emoji/1f469-1f3fd-200d-1f33e.svg
new file mode 100644
index 0000000000..31787ece26
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-1f33e.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-1f373.svg b/public/emoji/1f469-1f3fd-200d-1f373.svg
new file mode 100644
index 0000000000..9abc408961
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-1f373.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-1f393.svg b/public/emoji/1f469-1f3fd-200d-1f393.svg
new file mode 100644
index 0000000000..25fd3caaa1
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-1f393.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-1f3a4.svg b/public/emoji/1f469-1f3fd-200d-1f3a4.svg
new file mode 100644
index 0000000000..ad6deb4d01
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-1f3a4.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-1f3a8.svg b/public/emoji/1f469-1f3fd-200d-1f3a8.svg
new file mode 100644
index 0000000000..c6233010ea
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-1f3a8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-1f3eb.svg b/public/emoji/1f469-1f3fd-200d-1f3eb.svg
new file mode 100644
index 0000000000..d059eb64a6
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-1f3eb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-1f3ed.svg b/public/emoji/1f469-1f3fd-200d-1f3ed.svg
new file mode 100644
index 0000000000..d242300ab7
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-1f3ed.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-1f4bb.svg b/public/emoji/1f469-1f3fd-200d-1f4bb.svg
new file mode 100644
index 0000000000..3f16d298a8
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-1f4bb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-1f4bc.svg b/public/emoji/1f469-1f3fd-200d-1f4bc.svg
new file mode 100644
index 0000000000..b9cb8782d0
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-1f4bc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-1f527.svg b/public/emoji/1f469-1f3fd-200d-1f527.svg
new file mode 100644
index 0000000000..01b65f1e10
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-1f527.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-1f52c.svg b/public/emoji/1f469-1f3fd-200d-1f52c.svg
new file mode 100644
index 0000000000..89158a2333
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-1f52c.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-1f680.svg b/public/emoji/1f469-1f3fd-200d-1f680.svg
new file mode 100644
index 0000000000..df8627aacb
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-1f680.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-1f692.svg b/public/emoji/1f469-1f3fd-200d-1f692.svg
new file mode 100644
index 0000000000..bbc2e7cad6
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-1f692.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-2695-fe0f.svg b/public/emoji/1f469-1f3fd-200d-2695-fe0f.svg
new file mode 100644
index 0000000000..5c96c15c3c
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-2695-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-2696-fe0f.svg b/public/emoji/1f469-1f3fd-200d-2696-fe0f.svg
new file mode 100644
index 0000000000..5c34de7b88
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-2696-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd-200d-2708-fe0f.svg b/public/emoji/1f469-1f3fd-200d-2708-fe0f.svg
new file mode 100644
index 0000000000..e149723f0c
--- /dev/null
+++ b/public/emoji/1f469-1f3fd-200d-2708-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fd.png b/public/emoji/1f469-1f3fd.png
deleted file mode 100644
index 5672e2fd52..0000000000
Binary files a/public/emoji/1f469-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f469-1f3fd.svg b/public/emoji/1f469-1f3fd.svg
index c026985664..0c25028ae7 100644
--- a/public/emoji/1f469-1f3fd.svg
+++ b/public/emoji/1f469-1f3fd.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-1f33e.svg b/public/emoji/1f469-1f3fe-200d-1f33e.svg
new file mode 100644
index 0000000000..ee03115ffa
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-1f33e.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-1f373.svg b/public/emoji/1f469-1f3fe-200d-1f373.svg
new file mode 100644
index 0000000000..ca0215f9c4
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-1f373.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-1f393.svg b/public/emoji/1f469-1f3fe-200d-1f393.svg
new file mode 100644
index 0000000000..2998bbc9b8
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-1f393.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-1f3a4.svg b/public/emoji/1f469-1f3fe-200d-1f3a4.svg
new file mode 100644
index 0000000000..f1d48b1d8f
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-1f3a4.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-1f3a8.svg b/public/emoji/1f469-1f3fe-200d-1f3a8.svg
new file mode 100644
index 0000000000..5e7049c806
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-1f3a8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-1f3eb.svg b/public/emoji/1f469-1f3fe-200d-1f3eb.svg
new file mode 100644
index 0000000000..70e1044b0f
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-1f3eb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-1f3ed.svg b/public/emoji/1f469-1f3fe-200d-1f3ed.svg
new file mode 100644
index 0000000000..a8a3c3479d
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-1f3ed.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-1f4bb.svg b/public/emoji/1f469-1f3fe-200d-1f4bb.svg
new file mode 100644
index 0000000000..51fb3f47da
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-1f4bb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-1f4bc.svg b/public/emoji/1f469-1f3fe-200d-1f4bc.svg
new file mode 100644
index 0000000000..61aef57240
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-1f4bc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-1f527.svg b/public/emoji/1f469-1f3fe-200d-1f527.svg
new file mode 100644
index 0000000000..fe47e22fab
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-1f527.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-1f52c.svg b/public/emoji/1f469-1f3fe-200d-1f52c.svg
new file mode 100644
index 0000000000..ba7c0e68d0
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-1f52c.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-1f680.svg b/public/emoji/1f469-1f3fe-200d-1f680.svg
new file mode 100644
index 0000000000..e2734a3553
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-1f680.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-1f692.svg b/public/emoji/1f469-1f3fe-200d-1f692.svg
new file mode 100644
index 0000000000..6ad50f7401
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-1f692.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-2695-fe0f.svg b/public/emoji/1f469-1f3fe-200d-2695-fe0f.svg
new file mode 100644
index 0000000000..1f1492f76b
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-2695-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-2696-fe0f.svg b/public/emoji/1f469-1f3fe-200d-2696-fe0f.svg
new file mode 100644
index 0000000000..021c287232
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-2696-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe-200d-2708-fe0f.svg b/public/emoji/1f469-1f3fe-200d-2708-fe0f.svg
new file mode 100644
index 0000000000..c82832cb5f
--- /dev/null
+++ b/public/emoji/1f469-1f3fe-200d-2708-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3fe.png b/public/emoji/1f469-1f3fe.png
deleted file mode 100644
index 5754aab558..0000000000
Binary files a/public/emoji/1f469-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f469-1f3fe.svg b/public/emoji/1f469-1f3fe.svg
index 8c977082dd..2aa3fef23d 100644
--- a/public/emoji/1f469-1f3fe.svg
+++ b/public/emoji/1f469-1f3fe.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-1f33e.svg b/public/emoji/1f469-1f3ff-200d-1f33e.svg
new file mode 100644
index 0000000000..36db97cc3f
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-1f33e.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-1f373.svg b/public/emoji/1f469-1f3ff-200d-1f373.svg
new file mode 100644
index 0000000000..02cd40205e
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-1f373.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-1f393.svg b/public/emoji/1f469-1f3ff-200d-1f393.svg
new file mode 100644
index 0000000000..6822832bab
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-1f393.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-1f3a4.svg b/public/emoji/1f469-1f3ff-200d-1f3a4.svg
new file mode 100644
index 0000000000..b23847530a
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-1f3a4.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-1f3a8.svg b/public/emoji/1f469-1f3ff-200d-1f3a8.svg
new file mode 100644
index 0000000000..930d5ed5d0
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-1f3a8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-1f3eb.svg b/public/emoji/1f469-1f3ff-200d-1f3eb.svg
new file mode 100644
index 0000000000..925977b395
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-1f3eb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-1f3ed.svg b/public/emoji/1f469-1f3ff-200d-1f3ed.svg
new file mode 100644
index 0000000000..cde71c216e
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-1f3ed.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-1f4bb.svg b/public/emoji/1f469-1f3ff-200d-1f4bb.svg
new file mode 100644
index 0000000000..a41064af8d
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-1f4bb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-1f4bc.svg b/public/emoji/1f469-1f3ff-200d-1f4bc.svg
new file mode 100644
index 0000000000..eea06ae801
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-1f4bc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-1f527.svg b/public/emoji/1f469-1f3ff-200d-1f527.svg
new file mode 100644
index 0000000000..cf2c4e3106
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-1f527.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-1f52c.svg b/public/emoji/1f469-1f3ff-200d-1f52c.svg
new file mode 100644
index 0000000000..06e8d253d1
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-1f52c.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-1f680.svg b/public/emoji/1f469-1f3ff-200d-1f680.svg
new file mode 100644
index 0000000000..35fe42f5f3
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-1f680.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-1f692.svg b/public/emoji/1f469-1f3ff-200d-1f692.svg
new file mode 100644
index 0000000000..861b1ff043
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-1f692.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-2695-fe0f.svg b/public/emoji/1f469-1f3ff-200d-2695-fe0f.svg
new file mode 100644
index 0000000000..40fe1cb157
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-2695-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-2696-fe0f.svg b/public/emoji/1f469-1f3ff-200d-2696-fe0f.svg
new file mode 100644
index 0000000000..2385f231a3
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-2696-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff-200d-2708-fe0f.svg b/public/emoji/1f469-1f3ff-200d-2708-fe0f.svg
new file mode 100644
index 0000000000..273621927b
--- /dev/null
+++ b/public/emoji/1f469-1f3ff-200d-2708-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-1f3ff.png b/public/emoji/1f469-1f3ff.png
deleted file mode 100644
index fc252af3a3..0000000000
Binary files a/public/emoji/1f469-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f469-1f3ff.svg b/public/emoji/1f469-1f3ff.svg
index 3078858cd0..523ac98cc8 100644
--- a/public/emoji/1f469-1f3ff.svg
+++ b/public/emoji/1f469-1f3ff.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f469-1f469-1f466-1f466.png b/public/emoji/1f469-1f469-1f466-1f466.png
deleted file mode 100644
index 6c6ba45e7b..0000000000
Binary files a/public/emoji/1f469-1f469-1f466-1f466.png and /dev/null differ
diff --git a/public/emoji/1f469-1f469-1f466-1f466.svg b/public/emoji/1f469-1f469-1f466-1f466.svg
deleted file mode 100644
index 8bd5911037..0000000000
--- a/public/emoji/1f469-1f469-1f466-1f466.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f469-1f469-1f466.png b/public/emoji/1f469-1f469-1f466.png
deleted file mode 100644
index 836feae7c7..0000000000
Binary files a/public/emoji/1f469-1f469-1f466.png and /dev/null differ
diff --git a/public/emoji/1f469-1f469-1f466.svg b/public/emoji/1f469-1f469-1f466.svg
deleted file mode 100644
index ece9c72c43..0000000000
--- a/public/emoji/1f469-1f469-1f466.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f469-1f469-1f467-1f466.png b/public/emoji/1f469-1f469-1f467-1f466.png
deleted file mode 100644
index 284d29ab5d..0000000000
Binary files a/public/emoji/1f469-1f469-1f467-1f466.png and /dev/null differ
diff --git a/public/emoji/1f469-1f469-1f467-1f466.svg b/public/emoji/1f469-1f469-1f467-1f466.svg
deleted file mode 100644
index 2f4951e980..0000000000
--- a/public/emoji/1f469-1f469-1f467-1f466.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f469-1f469-1f467-1f467.png b/public/emoji/1f469-1f469-1f467-1f467.png
deleted file mode 100644
index d8d3f49b85..0000000000
Binary files a/public/emoji/1f469-1f469-1f467-1f467.png and /dev/null differ
diff --git a/public/emoji/1f469-1f469-1f467-1f467.svg b/public/emoji/1f469-1f469-1f467-1f467.svg
deleted file mode 100644
index 73760fbb4d..0000000000
--- a/public/emoji/1f469-1f469-1f467-1f467.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f469-1f469-1f467.png b/public/emoji/1f469-1f469-1f467.png
deleted file mode 100644
index 41225c6fa5..0000000000
Binary files a/public/emoji/1f469-1f469-1f467.png and /dev/null differ
diff --git a/public/emoji/1f469-1f469-1f467.svg b/public/emoji/1f469-1f469-1f467.svg
deleted file mode 100644
index bbc72da228..0000000000
--- a/public/emoji/1f469-1f469-1f467.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f469-200d-1f33e.svg b/public/emoji/1f469-200d-1f33e.svg
new file mode 100644
index 0000000000..e1a146570b
--- /dev/null
+++ b/public/emoji/1f469-200d-1f33e.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f373.svg b/public/emoji/1f469-200d-1f373.svg
new file mode 100644
index 0000000000..4883fffcba
--- /dev/null
+++ b/public/emoji/1f469-200d-1f373.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f393.svg b/public/emoji/1f469-200d-1f393.svg
new file mode 100644
index 0000000000..0edec9c295
--- /dev/null
+++ b/public/emoji/1f469-200d-1f393.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f3a4.svg b/public/emoji/1f469-200d-1f3a4.svg
new file mode 100644
index 0000000000..b8da6c8d3e
--- /dev/null
+++ b/public/emoji/1f469-200d-1f3a4.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f3a8.svg b/public/emoji/1f469-200d-1f3a8.svg
new file mode 100644
index 0000000000..2db8c4a317
--- /dev/null
+++ b/public/emoji/1f469-200d-1f3a8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f3eb.svg b/public/emoji/1f469-200d-1f3eb.svg
new file mode 100644
index 0000000000..fe46827cc2
--- /dev/null
+++ b/public/emoji/1f469-200d-1f3eb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f3ed.svg b/public/emoji/1f469-200d-1f3ed.svg
new file mode 100644
index 0000000000..450cf4496e
--- /dev/null
+++ b/public/emoji/1f469-200d-1f3ed.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f466-200d-1f466.svg b/public/emoji/1f469-200d-1f466-200d-1f466.svg
new file mode 100644
index 0000000000..2f20655efd
--- /dev/null
+++ b/public/emoji/1f469-200d-1f466-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f466.svg b/public/emoji/1f469-200d-1f466.svg
new file mode 100644
index 0000000000..df6d988201
--- /dev/null
+++ b/public/emoji/1f469-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f467-200d-1f466.svg b/public/emoji/1f469-200d-1f467-200d-1f466.svg
new file mode 100644
index 0000000000..7c02a27bd5
--- /dev/null
+++ b/public/emoji/1f469-200d-1f467-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f467-200d-1f467.svg b/public/emoji/1f469-200d-1f467-200d-1f467.svg
new file mode 100644
index 0000000000..f016ce89c8
--- /dev/null
+++ b/public/emoji/1f469-200d-1f467-200d-1f467.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f467.svg b/public/emoji/1f469-200d-1f467.svg
new file mode 100644
index 0000000000..1c5d811eef
--- /dev/null
+++ b/public/emoji/1f469-200d-1f467.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f469-200d-1f466-200d-1f466.svg b/public/emoji/1f469-200d-1f469-200d-1f466-200d-1f466.svg
new file mode 100644
index 0000000000..38198b363b
--- /dev/null
+++ b/public/emoji/1f469-200d-1f469-200d-1f466-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f469-200d-1f466.svg b/public/emoji/1f469-200d-1f469-200d-1f466.svg
new file mode 100644
index 0000000000..eeb0c80e14
--- /dev/null
+++ b/public/emoji/1f469-200d-1f469-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f469-200d-1f467-200d-1f466.svg b/public/emoji/1f469-200d-1f469-200d-1f467-200d-1f466.svg
new file mode 100644
index 0000000000..1e84cdd354
--- /dev/null
+++ b/public/emoji/1f469-200d-1f469-200d-1f467-200d-1f466.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f469-200d-1f467-200d-1f467.svg b/public/emoji/1f469-200d-1f469-200d-1f467-200d-1f467.svg
new file mode 100644
index 0000000000..689084de1c
--- /dev/null
+++ b/public/emoji/1f469-200d-1f469-200d-1f467-200d-1f467.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f469-200d-1f467.svg b/public/emoji/1f469-200d-1f469-200d-1f467.svg
new file mode 100644
index 0000000000..ac18f5515c
--- /dev/null
+++ b/public/emoji/1f469-200d-1f469-200d-1f467.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f4bb.svg b/public/emoji/1f469-200d-1f4bb.svg
new file mode 100644
index 0000000000..bc0eda085b
--- /dev/null
+++ b/public/emoji/1f469-200d-1f4bb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f4bc.svg b/public/emoji/1f469-200d-1f4bc.svg
new file mode 100644
index 0000000000..e84decf7af
--- /dev/null
+++ b/public/emoji/1f469-200d-1f4bc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f527.svg b/public/emoji/1f469-200d-1f527.svg
new file mode 100644
index 0000000000..c020914a93
--- /dev/null
+++ b/public/emoji/1f469-200d-1f527.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f52c.svg b/public/emoji/1f469-200d-1f52c.svg
new file mode 100644
index 0000000000..6a05dde12c
--- /dev/null
+++ b/public/emoji/1f469-200d-1f52c.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f680.svg b/public/emoji/1f469-200d-1f680.svg
new file mode 100644
index 0000000000..54b41f7dc7
--- /dev/null
+++ b/public/emoji/1f469-200d-1f680.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-1f692.svg b/public/emoji/1f469-200d-1f692.svg
new file mode 100644
index 0000000000..e95a70cf9c
--- /dev/null
+++ b/public/emoji/1f469-200d-1f692.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-2695-fe0f.svg b/public/emoji/1f469-200d-2695-fe0f.svg
new file mode 100644
index 0000000000..a24749665f
--- /dev/null
+++ b/public/emoji/1f469-200d-2695-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-2696-fe0f.svg b/public/emoji/1f469-200d-2696-fe0f.svg
new file mode 100644
index 0000000000..69eb8c537a
--- /dev/null
+++ b/public/emoji/1f469-200d-2696-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-2708-fe0f.svg b/public/emoji/1f469-200d-2708-fe0f.svg
new file mode 100644
index 0000000000..25ab72a34b
--- /dev/null
+++ b/public/emoji/1f469-200d-2708-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-2764-fe0f-200d-1f468.svg b/public/emoji/1f469-200d-2764-fe0f-200d-1f468.svg
new file mode 100644
index 0000000000..9f42ccee84
--- /dev/null
+++ b/public/emoji/1f469-200d-2764-fe0f-200d-1f468.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-2764-fe0f-200d-1f469.svg b/public/emoji/1f469-200d-2764-fe0f-200d-1f469.svg
new file mode 100644
index 0000000000..804903c75c
--- /dev/null
+++ b/public/emoji/1f469-200d-2764-fe0f-200d-1f469.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg b/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg
new file mode 100644
index 0000000000..0bae3004bc
--- /dev/null
+++ b/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg b/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg
new file mode 100644
index 0000000000..529eff4d15
--- /dev/null
+++ b/public/emoji/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f469-2764-1f469.png b/public/emoji/1f469-2764-1f469.png
deleted file mode 100644
index 08fdabcdc5..0000000000
Binary files a/public/emoji/1f469-2764-1f469.png and /dev/null differ
diff --git a/public/emoji/1f469-2764-1f469.svg b/public/emoji/1f469-2764-1f469.svg
deleted file mode 100644
index 5f188ca18c..0000000000
--- a/public/emoji/1f469-2764-1f469.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f469-2764-1f48b-1f469.png b/public/emoji/1f469-2764-1f48b-1f469.png
deleted file mode 100644
index fdac73cbb1..0000000000
Binary files a/public/emoji/1f469-2764-1f48b-1f469.png and /dev/null differ
diff --git a/public/emoji/1f469-2764-1f48b-1f469.svg b/public/emoji/1f469-2764-1f48b-1f469.svg
deleted file mode 100644
index c236906195..0000000000
--- a/public/emoji/1f469-2764-1f48b-1f469.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f469.png b/public/emoji/1f469.png
deleted file mode 100644
index ece440e7a6..0000000000
Binary files a/public/emoji/1f469.png and /dev/null differ
diff --git a/public/emoji/1f469.svg b/public/emoji/1f469.svg
index 8a7fada151..6f7dde41f7 100644
--- a/public/emoji/1f469.svg
+++ b/public/emoji/1f469.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f46a.png b/public/emoji/1f46a.png
deleted file mode 100644
index 2642196579..0000000000
Binary files a/public/emoji/1f46a.png and /dev/null differ
diff --git a/public/emoji/1f46a.svg b/public/emoji/1f46a.svg
index e0fc9893bc..ab47f4abc7 100644
--- a/public/emoji/1f46a.svg
+++ b/public/emoji/1f46a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f46b.png b/public/emoji/1f46b.png
deleted file mode 100644
index 960323f3c1..0000000000
Binary files a/public/emoji/1f46b.png and /dev/null differ
diff --git a/public/emoji/1f46b.svg b/public/emoji/1f46b.svg
index 4e7dcce0fd..8115fe984c 100644
--- a/public/emoji/1f46b.svg
+++ b/public/emoji/1f46b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f46c.png b/public/emoji/1f46c.png
deleted file mode 100644
index a511fda822..0000000000
Binary files a/public/emoji/1f46c.png and /dev/null differ
diff --git a/public/emoji/1f46c.svg b/public/emoji/1f46c.svg
index 376a18dddc..7feab42c0c 100644
--- a/public/emoji/1f46c.svg
+++ b/public/emoji/1f46c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f46d.png b/public/emoji/1f46d.png
deleted file mode 100644
index b077cd3e40..0000000000
Binary files a/public/emoji/1f46d.png and /dev/null differ
diff --git a/public/emoji/1f46d.svg b/public/emoji/1f46d.svg
index ed12b05e15..fae1da2d4b 100644
--- a/public/emoji/1f46d.svg
+++ b/public/emoji/1f46d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f46e-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..58bcfd77a7
--- /dev/null
+++ b/public/emoji/1f46e-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f46e-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..2bff6d5727
--- /dev/null
+++ b/public/emoji/1f46e-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3fb.png b/public/emoji/1f46e-1f3fb.png
deleted file mode 100644
index 6ccba3879d..0000000000
Binary files a/public/emoji/1f46e-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f46e-1f3fb.svg b/public/emoji/1f46e-1f3fb.svg
index 98a019fff4..2bff6d5727 100644
--- a/public/emoji/1f46e-1f3fb.svg
+++ b/public/emoji/1f46e-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f46e-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..d3d127b3bf
--- /dev/null
+++ b/public/emoji/1f46e-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f46e-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..873359cd27
--- /dev/null
+++ b/public/emoji/1f46e-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3fc.png b/public/emoji/1f46e-1f3fc.png
deleted file mode 100644
index 7814ea9f52..0000000000
Binary files a/public/emoji/1f46e-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f46e-1f3fc.svg b/public/emoji/1f46e-1f3fc.svg
index 9e44350629..873359cd27 100644
--- a/public/emoji/1f46e-1f3fc.svg
+++ b/public/emoji/1f46e-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f46e-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..b94c792bd3
--- /dev/null
+++ b/public/emoji/1f46e-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f46e-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..b0d9e6ae19
--- /dev/null
+++ b/public/emoji/1f46e-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3fd.png b/public/emoji/1f46e-1f3fd.png
deleted file mode 100644
index d78e88ec87..0000000000
Binary files a/public/emoji/1f46e-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f46e-1f3fd.svg b/public/emoji/1f46e-1f3fd.svg
index fe8b6f4513..b0d9e6ae19 100644
--- a/public/emoji/1f46e-1f3fd.svg
+++ b/public/emoji/1f46e-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f46e-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..3e6a0c7ccb
--- /dev/null
+++ b/public/emoji/1f46e-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f46e-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..1fdabb297f
--- /dev/null
+++ b/public/emoji/1f46e-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3fe.png b/public/emoji/1f46e-1f3fe.png
deleted file mode 100644
index 2e13c50831..0000000000
Binary files a/public/emoji/1f46e-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f46e-1f3fe.svg b/public/emoji/1f46e-1f3fe.svg
index d880766e58..1fdabb297f 100644
--- a/public/emoji/1f46e-1f3fe.svg
+++ b/public/emoji/1f46e-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f46e-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..1b1ffa1075
--- /dev/null
+++ b/public/emoji/1f46e-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f46e-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..f6c19165aa
--- /dev/null
+++ b/public/emoji/1f46e-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f46e-1f3ff.png b/public/emoji/1f46e-1f3ff.png
deleted file mode 100644
index 2980d61cc2..0000000000
Binary files a/public/emoji/1f46e-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f46e-1f3ff.svg b/public/emoji/1f46e-1f3ff.svg
index 9ec2135b5e..f6c19165aa 100644
--- a/public/emoji/1f46e-1f3ff.svg
+++ b/public/emoji/1f46e-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f46e-200d-2640-fe0f.svg b/public/emoji/1f46e-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..79963b5e6b
--- /dev/null
+++ b/public/emoji/1f46e-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f46e-200d-2642-fe0f.svg b/public/emoji/1f46e-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..f38c573d01
--- /dev/null
+++ b/public/emoji/1f46e-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f46e.png b/public/emoji/1f46e.png
deleted file mode 100644
index 0b16d7c17b..0000000000
Binary files a/public/emoji/1f46e.png and /dev/null differ
diff --git a/public/emoji/1f46e.svg b/public/emoji/1f46e.svg
index 3631cdd540..f38c573d01 100644
--- a/public/emoji/1f46e.svg
+++ b/public/emoji/1f46e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f46f-200d-2640-fe0f.svg b/public/emoji/1f46f-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..e3d470d6fe
--- /dev/null
+++ b/public/emoji/1f46f-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f46f-200d-2642-fe0f.svg b/public/emoji/1f46f-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..d58f55fae0
--- /dev/null
+++ b/public/emoji/1f46f-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f46f.png b/public/emoji/1f46f.png
deleted file mode 100644
index 67e6ffacb7..0000000000
Binary files a/public/emoji/1f46f.png and /dev/null differ
diff --git a/public/emoji/1f46f.svg b/public/emoji/1f46f.svg
index 32985cc36b..e3d470d6fe 100644
--- a/public/emoji/1f46f.svg
+++ b/public/emoji/1f46f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f470-1f3fb.png b/public/emoji/1f470-1f3fb.png
deleted file mode 100644
index c4fb141ae8..0000000000
Binary files a/public/emoji/1f470-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f470-1f3fb.svg b/public/emoji/1f470-1f3fb.svg
index cb221eee12..b1eeedb6d7 100644
--- a/public/emoji/1f470-1f3fb.svg
+++ b/public/emoji/1f470-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f470-1f3fc.png b/public/emoji/1f470-1f3fc.png
deleted file mode 100644
index c248769fc0..0000000000
Binary files a/public/emoji/1f470-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f470-1f3fc.svg b/public/emoji/1f470-1f3fc.svg
index b571839713..09a8ed7e36 100644
--- a/public/emoji/1f470-1f3fc.svg
+++ b/public/emoji/1f470-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f470-1f3fd.png b/public/emoji/1f470-1f3fd.png
deleted file mode 100644
index 962c0a6eed..0000000000
Binary files a/public/emoji/1f470-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f470-1f3fd.svg b/public/emoji/1f470-1f3fd.svg
index 6c9874f778..e5b73e6af4 100644
--- a/public/emoji/1f470-1f3fd.svg
+++ b/public/emoji/1f470-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f470-1f3fe.png b/public/emoji/1f470-1f3fe.png
deleted file mode 100644
index 740ca208cd..0000000000
Binary files a/public/emoji/1f470-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f470-1f3fe.svg b/public/emoji/1f470-1f3fe.svg
index e4ff8c92d8..6fe5fe6076 100644
--- a/public/emoji/1f470-1f3fe.svg
+++ b/public/emoji/1f470-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f470-1f3ff.png b/public/emoji/1f470-1f3ff.png
deleted file mode 100644
index 5cc5598587..0000000000
Binary files a/public/emoji/1f470-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f470-1f3ff.svg b/public/emoji/1f470-1f3ff.svg
index 29633af92d..149a6fc242 100644
--- a/public/emoji/1f470-1f3ff.svg
+++ b/public/emoji/1f470-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f470.png b/public/emoji/1f470.png
deleted file mode 100644
index eaf4bd9789..0000000000
Binary files a/public/emoji/1f470.png and /dev/null differ
diff --git a/public/emoji/1f470.svg b/public/emoji/1f470.svg
index dc9e6c7301..3445fc8d6a 100644
--- a/public/emoji/1f470.svg
+++ b/public/emoji/1f470.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f471-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f471-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..b112f6a4ed
--- /dev/null
+++ b/public/emoji/1f471-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f471-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f471-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..b3b6a74d70
--- /dev/null
+++ b/public/emoji/1f471-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f471-1f3fb.png b/public/emoji/1f471-1f3fb.png
deleted file mode 100644
index 7d18ef2444..0000000000
Binary files a/public/emoji/1f471-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f471-1f3fb.svg b/public/emoji/1f471-1f3fb.svg
index eee7e7a2c9..b3b6a74d70 100644
--- a/public/emoji/1f471-1f3fb.svg
+++ b/public/emoji/1f471-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f471-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f471-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..8328828e1e
--- /dev/null
+++ b/public/emoji/1f471-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f471-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f471-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..9f0eceb397
--- /dev/null
+++ b/public/emoji/1f471-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f471-1f3fc.png b/public/emoji/1f471-1f3fc.png
deleted file mode 100644
index dae1307315..0000000000
Binary files a/public/emoji/1f471-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f471-1f3fc.svg b/public/emoji/1f471-1f3fc.svg
index 6bdf858863..9f0eceb397 100644
--- a/public/emoji/1f471-1f3fc.svg
+++ b/public/emoji/1f471-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f471-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f471-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..259f8ccbd5
--- /dev/null
+++ b/public/emoji/1f471-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f471-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f471-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..e1431d851e
--- /dev/null
+++ b/public/emoji/1f471-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f471-1f3fd.png b/public/emoji/1f471-1f3fd.png
deleted file mode 100644
index 684677e8e5..0000000000
Binary files a/public/emoji/1f471-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f471-1f3fd.svg b/public/emoji/1f471-1f3fd.svg
index b08ba66848..e1431d851e 100644
--- a/public/emoji/1f471-1f3fd.svg
+++ b/public/emoji/1f471-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f471-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f471-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..b4ff0c9916
--- /dev/null
+++ b/public/emoji/1f471-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f471-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f471-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..994afaf962
--- /dev/null
+++ b/public/emoji/1f471-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f471-1f3fe.png b/public/emoji/1f471-1f3fe.png
deleted file mode 100644
index 012be0b51f..0000000000
Binary files a/public/emoji/1f471-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f471-1f3fe.svg b/public/emoji/1f471-1f3fe.svg
index 72a38d2188..994afaf962 100644
--- a/public/emoji/1f471-1f3fe.svg
+++ b/public/emoji/1f471-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f471-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f471-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..b28b077d2a
--- /dev/null
+++ b/public/emoji/1f471-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f471-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f471-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..151970867a
--- /dev/null
+++ b/public/emoji/1f471-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f471-1f3ff.png b/public/emoji/1f471-1f3ff.png
deleted file mode 100644
index d4ecc4cf44..0000000000
Binary files a/public/emoji/1f471-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f471-1f3ff.svg b/public/emoji/1f471-1f3ff.svg
index dcfd094c80..151970867a 100644
--- a/public/emoji/1f471-1f3ff.svg
+++ b/public/emoji/1f471-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f471-200d-2640-fe0f.svg b/public/emoji/1f471-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..a3f7c19988
--- /dev/null
+++ b/public/emoji/1f471-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f471-200d-2642-fe0f.svg b/public/emoji/1f471-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..2c49aa3d5a
--- /dev/null
+++ b/public/emoji/1f471-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f471.png b/public/emoji/1f471.png
deleted file mode 100644
index ad6f01a7dd..0000000000
Binary files a/public/emoji/1f471.png and /dev/null differ
diff --git a/public/emoji/1f471.svg b/public/emoji/1f471.svg
index 2f56b379c9..2c49aa3d5a 100644
--- a/public/emoji/1f471.svg
+++ b/public/emoji/1f471.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f472-1f3fb.png b/public/emoji/1f472-1f3fb.png
deleted file mode 100644
index 5b7b3def19..0000000000
Binary files a/public/emoji/1f472-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f472-1f3fb.svg b/public/emoji/1f472-1f3fb.svg
index f02094dcbe..d3c168207f 100644
--- a/public/emoji/1f472-1f3fb.svg
+++ b/public/emoji/1f472-1f3fb.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f472-1f3fc.png b/public/emoji/1f472-1f3fc.png
deleted file mode 100644
index c8b9cf87f4..0000000000
Binary files a/public/emoji/1f472-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f472-1f3fc.svg b/public/emoji/1f472-1f3fc.svg
index 9933af021d..652c004127 100644
--- a/public/emoji/1f472-1f3fc.svg
+++ b/public/emoji/1f472-1f3fc.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f472-1f3fd.png b/public/emoji/1f472-1f3fd.png
deleted file mode 100644
index effdd0c4c8..0000000000
Binary files a/public/emoji/1f472-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f472-1f3fd.svg b/public/emoji/1f472-1f3fd.svg
index f2884ff0a8..9c8e135cec 100644
--- a/public/emoji/1f472-1f3fd.svg
+++ b/public/emoji/1f472-1f3fd.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f472-1f3fe.png b/public/emoji/1f472-1f3fe.png
deleted file mode 100644
index f885ff46fa..0000000000
Binary files a/public/emoji/1f472-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f472-1f3fe.svg b/public/emoji/1f472-1f3fe.svg
index 6bb5fad55e..2a80ac6263 100644
--- a/public/emoji/1f472-1f3fe.svg
+++ b/public/emoji/1f472-1f3fe.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f472-1f3ff.png b/public/emoji/1f472-1f3ff.png
deleted file mode 100644
index a6d55ca138..0000000000
Binary files a/public/emoji/1f472-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f472-1f3ff.svg b/public/emoji/1f472-1f3ff.svg
index c28a77da85..122e20c2b4 100644
--- a/public/emoji/1f472-1f3ff.svg
+++ b/public/emoji/1f472-1f3ff.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f472.png b/public/emoji/1f472.png
deleted file mode 100644
index 7841e13608..0000000000
Binary files a/public/emoji/1f472.png and /dev/null differ
diff --git a/public/emoji/1f472.svg b/public/emoji/1f472.svg
index 8274a23037..3f059078c0 100644
--- a/public/emoji/1f472.svg
+++ b/public/emoji/1f472.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f473-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f473-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..ffe17f1681
--- /dev/null
+++ b/public/emoji/1f473-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f473-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f473-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..9d8c687727
--- /dev/null
+++ b/public/emoji/1f473-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f473-1f3fb.png b/public/emoji/1f473-1f3fb.png
deleted file mode 100644
index 1e12ee4b23..0000000000
Binary files a/public/emoji/1f473-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f473-1f3fb.svg b/public/emoji/1f473-1f3fb.svg
index 43c2e9d581..9d8c687727 100644
--- a/public/emoji/1f473-1f3fb.svg
+++ b/public/emoji/1f473-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f473-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f473-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..1487c58f38
--- /dev/null
+++ b/public/emoji/1f473-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f473-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f473-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..d08a57f69e
--- /dev/null
+++ b/public/emoji/1f473-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f473-1f3fc.png b/public/emoji/1f473-1f3fc.png
deleted file mode 100644
index 37de4cceb2..0000000000
Binary files a/public/emoji/1f473-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f473-1f3fc.svg b/public/emoji/1f473-1f3fc.svg
index 86edb085ff..d08a57f69e 100644
--- a/public/emoji/1f473-1f3fc.svg
+++ b/public/emoji/1f473-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f473-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f473-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..8a5a251465
--- /dev/null
+++ b/public/emoji/1f473-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f473-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f473-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..1a2a155a35
--- /dev/null
+++ b/public/emoji/1f473-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f473-1f3fd.png b/public/emoji/1f473-1f3fd.png
deleted file mode 100644
index f607afd345..0000000000
Binary files a/public/emoji/1f473-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f473-1f3fd.svg b/public/emoji/1f473-1f3fd.svg
index 4567f58000..1a2a155a35 100644
--- a/public/emoji/1f473-1f3fd.svg
+++ b/public/emoji/1f473-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f473-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f473-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..be875ee376
--- /dev/null
+++ b/public/emoji/1f473-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f473-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f473-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..bca472d816
--- /dev/null
+++ b/public/emoji/1f473-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f473-1f3fe.png b/public/emoji/1f473-1f3fe.png
deleted file mode 100644
index c05695888a..0000000000
Binary files a/public/emoji/1f473-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f473-1f3fe.svg b/public/emoji/1f473-1f3fe.svg
index ddb3d5beb6..bca472d816 100644
--- a/public/emoji/1f473-1f3fe.svg
+++ b/public/emoji/1f473-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f473-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f473-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..a01f89ddad
--- /dev/null
+++ b/public/emoji/1f473-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f473-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f473-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..ca21b96511
--- /dev/null
+++ b/public/emoji/1f473-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f473-1f3ff.png b/public/emoji/1f473-1f3ff.png
deleted file mode 100644
index 4b4ff64720..0000000000
Binary files a/public/emoji/1f473-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f473-1f3ff.svg b/public/emoji/1f473-1f3ff.svg
index 19b2e728f8..ca21b96511 100644
--- a/public/emoji/1f473-1f3ff.svg
+++ b/public/emoji/1f473-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f473-200d-2640-fe0f.svg b/public/emoji/1f473-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..ecd3fb021c
--- /dev/null
+++ b/public/emoji/1f473-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f473-200d-2642-fe0f.svg b/public/emoji/1f473-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..627d773214
--- /dev/null
+++ b/public/emoji/1f473-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f473.png b/public/emoji/1f473.png
deleted file mode 100644
index 51cf047f96..0000000000
Binary files a/public/emoji/1f473.png and /dev/null differ
diff --git a/public/emoji/1f473.svg b/public/emoji/1f473.svg
index 5112808128..627d773214 100644
--- a/public/emoji/1f473.svg
+++ b/public/emoji/1f473.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f474-1f3fb.png b/public/emoji/1f474-1f3fb.png
deleted file mode 100644
index ab459baace..0000000000
Binary files a/public/emoji/1f474-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f474-1f3fb.svg b/public/emoji/1f474-1f3fb.svg
index 77aacc5a93..fd2ff9dcf9 100644
--- a/public/emoji/1f474-1f3fb.svg
+++ b/public/emoji/1f474-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f474-1f3fc.png b/public/emoji/1f474-1f3fc.png
deleted file mode 100644
index f4dfc7694e..0000000000
Binary files a/public/emoji/1f474-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f474-1f3fc.svg b/public/emoji/1f474-1f3fc.svg
index 03c13c515a..c4f43282b8 100644
--- a/public/emoji/1f474-1f3fc.svg
+++ b/public/emoji/1f474-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f474-1f3fd.png b/public/emoji/1f474-1f3fd.png
deleted file mode 100644
index 5ffd11792f..0000000000
Binary files a/public/emoji/1f474-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f474-1f3fd.svg b/public/emoji/1f474-1f3fd.svg
index 2a73bef919..4e532e6e25 100644
--- a/public/emoji/1f474-1f3fd.svg
+++ b/public/emoji/1f474-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f474-1f3fe.png b/public/emoji/1f474-1f3fe.png
deleted file mode 100644
index b350a764bf..0000000000
Binary files a/public/emoji/1f474-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f474-1f3fe.svg b/public/emoji/1f474-1f3fe.svg
index 0c9133ecee..1f19763a29 100644
--- a/public/emoji/1f474-1f3fe.svg
+++ b/public/emoji/1f474-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f474-1f3ff.png b/public/emoji/1f474-1f3ff.png
deleted file mode 100644
index 05fe24a170..0000000000
Binary files a/public/emoji/1f474-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f474-1f3ff.svg b/public/emoji/1f474-1f3ff.svg
index 14a6554c36..8d8bc09289 100644
--- a/public/emoji/1f474-1f3ff.svg
+++ b/public/emoji/1f474-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f474.png b/public/emoji/1f474.png
deleted file mode 100644
index 4ace4e6f30..0000000000
Binary files a/public/emoji/1f474.png and /dev/null differ
diff --git a/public/emoji/1f474.svg b/public/emoji/1f474.svg
index 79bd197e15..5f1c83bbc1 100644
--- a/public/emoji/1f474.svg
+++ b/public/emoji/1f474.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f475-1f3fb.png b/public/emoji/1f475-1f3fb.png
deleted file mode 100644
index b49e821402..0000000000
Binary files a/public/emoji/1f475-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f475-1f3fb.svg b/public/emoji/1f475-1f3fb.svg
index 1e1c55669a..86c69bae92 100644
--- a/public/emoji/1f475-1f3fb.svg
+++ b/public/emoji/1f475-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f475-1f3fc.png b/public/emoji/1f475-1f3fc.png
deleted file mode 100644
index e86bf5ab3b..0000000000
Binary files a/public/emoji/1f475-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f475-1f3fc.svg b/public/emoji/1f475-1f3fc.svg
index fd7cea0fc1..7207298c85 100644
--- a/public/emoji/1f475-1f3fc.svg
+++ b/public/emoji/1f475-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f475-1f3fd.png b/public/emoji/1f475-1f3fd.png
deleted file mode 100644
index 83fc14b087..0000000000
Binary files a/public/emoji/1f475-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f475-1f3fd.svg b/public/emoji/1f475-1f3fd.svg
index 121b50ba09..15c14c1447 100644
--- a/public/emoji/1f475-1f3fd.svg
+++ b/public/emoji/1f475-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f475-1f3fe.png b/public/emoji/1f475-1f3fe.png
deleted file mode 100644
index e4aa8a424d..0000000000
Binary files a/public/emoji/1f475-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f475-1f3fe.svg b/public/emoji/1f475-1f3fe.svg
index c1246e568a..e9950c3857 100644
--- a/public/emoji/1f475-1f3fe.svg
+++ b/public/emoji/1f475-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f475-1f3ff.png b/public/emoji/1f475-1f3ff.png
deleted file mode 100644
index 4009012bb0..0000000000
Binary files a/public/emoji/1f475-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f475-1f3ff.svg b/public/emoji/1f475-1f3ff.svg
index b1ae7cd6c5..31cb9f003b 100644
--- a/public/emoji/1f475-1f3ff.svg
+++ b/public/emoji/1f475-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f475.png b/public/emoji/1f475.png
deleted file mode 100644
index 52dc498714..0000000000
Binary files a/public/emoji/1f475.png and /dev/null differ
diff --git a/public/emoji/1f475.svg b/public/emoji/1f475.svg
index a2ac6131e0..a2d61af950 100644
--- a/public/emoji/1f475.svg
+++ b/public/emoji/1f475.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f476-1f3fb.png b/public/emoji/1f476-1f3fb.png
deleted file mode 100644
index d20911d40d..0000000000
Binary files a/public/emoji/1f476-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f476-1f3fb.svg b/public/emoji/1f476-1f3fb.svg
index aa85b9bd05..38e1aa8f68 100644
--- a/public/emoji/1f476-1f3fb.svg
+++ b/public/emoji/1f476-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f476-1f3fc.png b/public/emoji/1f476-1f3fc.png
deleted file mode 100644
index b0a9b30ed1..0000000000
Binary files a/public/emoji/1f476-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f476-1f3fc.svg b/public/emoji/1f476-1f3fc.svg
index 50f5f8c94d..d1fc49a2ca 100644
--- a/public/emoji/1f476-1f3fc.svg
+++ b/public/emoji/1f476-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f476-1f3fd.png b/public/emoji/1f476-1f3fd.png
deleted file mode 100644
index 7de5286fac..0000000000
Binary files a/public/emoji/1f476-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f476-1f3fd.svg b/public/emoji/1f476-1f3fd.svg
index 9d3946dcd5..85b9fa85cd 100644
--- a/public/emoji/1f476-1f3fd.svg
+++ b/public/emoji/1f476-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f476-1f3fe.png b/public/emoji/1f476-1f3fe.png
deleted file mode 100644
index 9b7a86ac61..0000000000
Binary files a/public/emoji/1f476-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f476-1f3fe.svg b/public/emoji/1f476-1f3fe.svg
index 75c1a67471..3905353f8a 100644
--- a/public/emoji/1f476-1f3fe.svg
+++ b/public/emoji/1f476-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f476-1f3ff.png b/public/emoji/1f476-1f3ff.png
deleted file mode 100644
index fe1be34cb8..0000000000
Binary files a/public/emoji/1f476-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f476-1f3ff.svg b/public/emoji/1f476-1f3ff.svg
index 27a4a6d7f9..e4807abad5 100644
--- a/public/emoji/1f476-1f3ff.svg
+++ b/public/emoji/1f476-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f476.png b/public/emoji/1f476.png
deleted file mode 100644
index a4af92c63c..0000000000
Binary files a/public/emoji/1f476.png and /dev/null differ
diff --git a/public/emoji/1f476.svg b/public/emoji/1f476.svg
index 6bbcb0c2ee..1d66193889 100644
--- a/public/emoji/1f476.svg
+++ b/public/emoji/1f476.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f477-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f477-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..46f7d64021
--- /dev/null
+++ b/public/emoji/1f477-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f477-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f477-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..759fd81ba0
--- /dev/null
+++ b/public/emoji/1f477-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f477-1f3fb.png b/public/emoji/1f477-1f3fb.png
deleted file mode 100644
index 2f24a2bab2..0000000000
Binary files a/public/emoji/1f477-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f477-1f3fb.svg b/public/emoji/1f477-1f3fb.svg
index 1c078948d0..759fd81ba0 100644
--- a/public/emoji/1f477-1f3fb.svg
+++ b/public/emoji/1f477-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f477-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f477-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..12173b62d2
--- /dev/null
+++ b/public/emoji/1f477-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f477-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f477-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..6cbec13d82
--- /dev/null
+++ b/public/emoji/1f477-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f477-1f3fc.png b/public/emoji/1f477-1f3fc.png
deleted file mode 100644
index 93c8fec5a7..0000000000
Binary files a/public/emoji/1f477-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f477-1f3fc.svg b/public/emoji/1f477-1f3fc.svg
index 2baad92838..6cbec13d82 100644
--- a/public/emoji/1f477-1f3fc.svg
+++ b/public/emoji/1f477-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f477-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f477-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..cef8bb79ca
--- /dev/null
+++ b/public/emoji/1f477-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f477-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f477-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..5634fa7e1c
--- /dev/null
+++ b/public/emoji/1f477-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f477-1f3fd.png b/public/emoji/1f477-1f3fd.png
deleted file mode 100644
index abc1f2af2e..0000000000
Binary files a/public/emoji/1f477-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f477-1f3fd.svg b/public/emoji/1f477-1f3fd.svg
index 9bd5a803fe..5634fa7e1c 100644
--- a/public/emoji/1f477-1f3fd.svg
+++ b/public/emoji/1f477-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f477-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f477-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..13ef34ba5e
--- /dev/null
+++ b/public/emoji/1f477-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f477-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f477-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..902261cc25
--- /dev/null
+++ b/public/emoji/1f477-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f477-1f3fe.png b/public/emoji/1f477-1f3fe.png
deleted file mode 100644
index eed83289ae..0000000000
Binary files a/public/emoji/1f477-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f477-1f3fe.svg b/public/emoji/1f477-1f3fe.svg
index ee7b228237..902261cc25 100644
--- a/public/emoji/1f477-1f3fe.svg
+++ b/public/emoji/1f477-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f477-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f477-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..6e9b84dfab
--- /dev/null
+++ b/public/emoji/1f477-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f477-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f477-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..1fc22a6a88
--- /dev/null
+++ b/public/emoji/1f477-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f477-1f3ff.png b/public/emoji/1f477-1f3ff.png
deleted file mode 100644
index acbb220b8b..0000000000
Binary files a/public/emoji/1f477-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f477-1f3ff.svg b/public/emoji/1f477-1f3ff.svg
index 2cfb7cf1b9..1fc22a6a88 100644
--- a/public/emoji/1f477-1f3ff.svg
+++ b/public/emoji/1f477-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f477-200d-2640-fe0f.svg b/public/emoji/1f477-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..1d9d18d314
--- /dev/null
+++ b/public/emoji/1f477-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f477-200d-2642-fe0f.svg b/public/emoji/1f477-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..cb161f83aa
--- /dev/null
+++ b/public/emoji/1f477-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f477.png b/public/emoji/1f477.png
deleted file mode 100644
index a9970a8900..0000000000
Binary files a/public/emoji/1f477.png and /dev/null differ
diff --git a/public/emoji/1f477.svg b/public/emoji/1f477.svg
index 56ae64c82c..cb161f83aa 100644
--- a/public/emoji/1f477.svg
+++ b/public/emoji/1f477.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f478-1f3fb.png b/public/emoji/1f478-1f3fb.png
deleted file mode 100644
index c28078cdc3..0000000000
Binary files a/public/emoji/1f478-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f478-1f3fb.svg b/public/emoji/1f478-1f3fb.svg
index ded39faa2e..88cc313912 100644
--- a/public/emoji/1f478-1f3fb.svg
+++ b/public/emoji/1f478-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f478-1f3fc.png b/public/emoji/1f478-1f3fc.png
deleted file mode 100644
index dcd20e6ecd..0000000000
Binary files a/public/emoji/1f478-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f478-1f3fc.svg b/public/emoji/1f478-1f3fc.svg
index e815e485a6..8aed00f803 100644
--- a/public/emoji/1f478-1f3fc.svg
+++ b/public/emoji/1f478-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f478-1f3fd.png b/public/emoji/1f478-1f3fd.png
deleted file mode 100644
index cde6f315c5..0000000000
Binary files a/public/emoji/1f478-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f478-1f3fd.svg b/public/emoji/1f478-1f3fd.svg
index 7d5b77783f..6fdfb919b6 100644
--- a/public/emoji/1f478-1f3fd.svg
+++ b/public/emoji/1f478-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f478-1f3fe.png b/public/emoji/1f478-1f3fe.png
deleted file mode 100644
index c71e69caae..0000000000
Binary files a/public/emoji/1f478-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f478-1f3fe.svg b/public/emoji/1f478-1f3fe.svg
index 18edf0cbc0..f88d49e9f4 100644
--- a/public/emoji/1f478-1f3fe.svg
+++ b/public/emoji/1f478-1f3fe.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f478-1f3ff.png b/public/emoji/1f478-1f3ff.png
deleted file mode 100644
index 063e264591..0000000000
Binary files a/public/emoji/1f478-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f478-1f3ff.svg b/public/emoji/1f478-1f3ff.svg
index 6b8053df1b..19f06ed2f7 100644
--- a/public/emoji/1f478-1f3ff.svg
+++ b/public/emoji/1f478-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f478.png b/public/emoji/1f478.png
deleted file mode 100644
index 879e9fa8c5..0000000000
Binary files a/public/emoji/1f478.png and /dev/null differ
diff --git a/public/emoji/1f478.svg b/public/emoji/1f478.svg
index 939f660d4a..06d437fa6d 100644
--- a/public/emoji/1f478.svg
+++ b/public/emoji/1f478.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f479.png b/public/emoji/1f479.png
deleted file mode 100644
index fe8670fdaf..0000000000
Binary files a/public/emoji/1f479.png and /dev/null differ
diff --git a/public/emoji/1f479.svg b/public/emoji/1f479.svg
index 4aa1df93b5..d085499955 100644
--- a/public/emoji/1f479.svg
+++ b/public/emoji/1f479.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f47a.png b/public/emoji/1f47a.png
deleted file mode 100644
index 515c6a2250..0000000000
Binary files a/public/emoji/1f47a.png and /dev/null differ
diff --git a/public/emoji/1f47a.svg b/public/emoji/1f47a.svg
index a20c6c44e4..81c1ef39da 100644
--- a/public/emoji/1f47a.svg
+++ b/public/emoji/1f47a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f47b.png b/public/emoji/1f47b.png
deleted file mode 100644
index 5650bc0ed1..0000000000
Binary files a/public/emoji/1f47b.png and /dev/null differ
diff --git a/public/emoji/1f47b.svg b/public/emoji/1f47b.svg
index 37f0680391..e5a2ee7394 100644
--- a/public/emoji/1f47b.svg
+++ b/public/emoji/1f47b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f47c-1f3fb.png b/public/emoji/1f47c-1f3fb.png
deleted file mode 100644
index 391694dc07..0000000000
Binary files a/public/emoji/1f47c-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f47c-1f3fb.svg b/public/emoji/1f47c-1f3fb.svg
index b33f37c471..58a4fe2da4 100644
--- a/public/emoji/1f47c-1f3fb.svg
+++ b/public/emoji/1f47c-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f47c-1f3fc.png b/public/emoji/1f47c-1f3fc.png
deleted file mode 100644
index 700cbe6ed2..0000000000
Binary files a/public/emoji/1f47c-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f47c-1f3fc.svg b/public/emoji/1f47c-1f3fc.svg
index 0095920c43..4618465f79 100644
--- a/public/emoji/1f47c-1f3fc.svg
+++ b/public/emoji/1f47c-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f47c-1f3fd.png b/public/emoji/1f47c-1f3fd.png
deleted file mode 100644
index be597437d2..0000000000
Binary files a/public/emoji/1f47c-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f47c-1f3fd.svg b/public/emoji/1f47c-1f3fd.svg
index ce453f4b7c..d6c44bf629 100644
--- a/public/emoji/1f47c-1f3fd.svg
+++ b/public/emoji/1f47c-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f47c-1f3fe.png b/public/emoji/1f47c-1f3fe.png
deleted file mode 100644
index b06d3c853e..0000000000
Binary files a/public/emoji/1f47c-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f47c-1f3fe.svg b/public/emoji/1f47c-1f3fe.svg
index bbff87d413..3b861ff042 100644
--- a/public/emoji/1f47c-1f3fe.svg
+++ b/public/emoji/1f47c-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f47c-1f3ff.png b/public/emoji/1f47c-1f3ff.png
deleted file mode 100644
index 17bd677e33..0000000000
Binary files a/public/emoji/1f47c-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f47c-1f3ff.svg b/public/emoji/1f47c-1f3ff.svg
index 5e7bb9f044..1be099a01f 100644
--- a/public/emoji/1f47c-1f3ff.svg
+++ b/public/emoji/1f47c-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f47c.png b/public/emoji/1f47c.png
deleted file mode 100644
index 66ea97a3b9..0000000000
Binary files a/public/emoji/1f47c.png and /dev/null differ
diff --git a/public/emoji/1f47c.svg b/public/emoji/1f47c.svg
index fd6002a209..f83cb77043 100644
--- a/public/emoji/1f47c.svg
+++ b/public/emoji/1f47c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f47d.png b/public/emoji/1f47d.png
deleted file mode 100644
index 3b90e97433..0000000000
Binary files a/public/emoji/1f47d.png and /dev/null differ
diff --git a/public/emoji/1f47d.svg b/public/emoji/1f47d.svg
index fff8d2f2bb..d58d819120 100644
--- a/public/emoji/1f47d.svg
+++ b/public/emoji/1f47d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f47e.png b/public/emoji/1f47e.png
deleted file mode 100644
index 2e73f5f32e..0000000000
Binary files a/public/emoji/1f47e.png and /dev/null differ
diff --git a/public/emoji/1f47e.svg b/public/emoji/1f47e.svg
index 0d4c47cfea..2ac86c206f 100644
--- a/public/emoji/1f47e.svg
+++ b/public/emoji/1f47e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f47f.png b/public/emoji/1f47f.png
deleted file mode 100644
index 9f9a960553..0000000000
Binary files a/public/emoji/1f47f.png and /dev/null differ
diff --git a/public/emoji/1f47f.svg b/public/emoji/1f47f.svg
index a2bf45a632..3ceaefa4d3 100644
--- a/public/emoji/1f47f.svg
+++ b/public/emoji/1f47f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f480.png b/public/emoji/1f480.png
deleted file mode 100644
index 26abb17296..0000000000
Binary files a/public/emoji/1f480.png and /dev/null differ
diff --git a/public/emoji/1f480.svg b/public/emoji/1f480.svg
index 300fed8885..7097d6ee03 100644
--- a/public/emoji/1f480.svg
+++ b/public/emoji/1f480.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f481-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f481-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..579847c43a
--- /dev/null
+++ b/public/emoji/1f481-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f481-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f481-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..9fce17c57e
--- /dev/null
+++ b/public/emoji/1f481-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f481-1f3fb.png b/public/emoji/1f481-1f3fb.png
deleted file mode 100644
index 3d9e224794..0000000000
Binary files a/public/emoji/1f481-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f481-1f3fb.svg b/public/emoji/1f481-1f3fb.svg
index 94f0d9fa83..579847c43a 100644
--- a/public/emoji/1f481-1f3fb.svg
+++ b/public/emoji/1f481-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f481-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f481-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..873f4dc5df
--- /dev/null
+++ b/public/emoji/1f481-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f481-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f481-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..bcf9e0cd9f
--- /dev/null
+++ b/public/emoji/1f481-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f481-1f3fc.png b/public/emoji/1f481-1f3fc.png
deleted file mode 100644
index 879e8b7966..0000000000
Binary files a/public/emoji/1f481-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f481-1f3fc.svg b/public/emoji/1f481-1f3fc.svg
index 4094b088f5..873f4dc5df 100644
--- a/public/emoji/1f481-1f3fc.svg
+++ b/public/emoji/1f481-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f481-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f481-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..f22657d8ac
--- /dev/null
+++ b/public/emoji/1f481-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f481-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f481-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..ef182a4bdd
--- /dev/null
+++ b/public/emoji/1f481-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f481-1f3fd.png b/public/emoji/1f481-1f3fd.png
deleted file mode 100644
index 307514eab6..0000000000
Binary files a/public/emoji/1f481-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f481-1f3fd.svg b/public/emoji/1f481-1f3fd.svg
index 502cf7baae..f22657d8ac 100644
--- a/public/emoji/1f481-1f3fd.svg
+++ b/public/emoji/1f481-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f481-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f481-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..c836fb1d52
--- /dev/null
+++ b/public/emoji/1f481-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f481-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f481-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..48e59176e9
--- /dev/null
+++ b/public/emoji/1f481-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f481-1f3fe.png b/public/emoji/1f481-1f3fe.png
deleted file mode 100644
index 297395dcb3..0000000000
Binary files a/public/emoji/1f481-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f481-1f3fe.svg b/public/emoji/1f481-1f3fe.svg
index d233832084..c836fb1d52 100644
--- a/public/emoji/1f481-1f3fe.svg
+++ b/public/emoji/1f481-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f481-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f481-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..c93ce31f5a
--- /dev/null
+++ b/public/emoji/1f481-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f481-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f481-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..1dcc0745c2
--- /dev/null
+++ b/public/emoji/1f481-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f481-1f3ff.png b/public/emoji/1f481-1f3ff.png
deleted file mode 100644
index 26f8f22b28..0000000000
Binary files a/public/emoji/1f481-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f481-1f3ff.svg b/public/emoji/1f481-1f3ff.svg
index 64f4c49695..c93ce31f5a 100644
--- a/public/emoji/1f481-1f3ff.svg
+++ b/public/emoji/1f481-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f481-200d-2640-fe0f.svg b/public/emoji/1f481-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..a06e256ad8
--- /dev/null
+++ b/public/emoji/1f481-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f481-200d-2642-fe0f.svg b/public/emoji/1f481-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..e97a32a391
--- /dev/null
+++ b/public/emoji/1f481-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f481.png b/public/emoji/1f481.png
deleted file mode 100644
index 55fc6294d2..0000000000
Binary files a/public/emoji/1f481.png and /dev/null differ
diff --git a/public/emoji/1f481.svg b/public/emoji/1f481.svg
index 324606f263..a06e256ad8 100644
--- a/public/emoji/1f481.svg
+++ b/public/emoji/1f481.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f482-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f482-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..2662a46e24
--- /dev/null
+++ b/public/emoji/1f482-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f482-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f482-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..95a2c5bdcc
--- /dev/null
+++ b/public/emoji/1f482-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f482-1f3fb.png b/public/emoji/1f482-1f3fb.png
deleted file mode 100644
index cea9ba2746..0000000000
Binary files a/public/emoji/1f482-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f482-1f3fb.svg b/public/emoji/1f482-1f3fb.svg
index 12ecea3c44..95a2c5bdcc 100644
--- a/public/emoji/1f482-1f3fb.svg
+++ b/public/emoji/1f482-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f482-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f482-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..1d07ec5af3
--- /dev/null
+++ b/public/emoji/1f482-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f482-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f482-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..9459a537bd
--- /dev/null
+++ b/public/emoji/1f482-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f482-1f3fc.png b/public/emoji/1f482-1f3fc.png
deleted file mode 100644
index 037464e402..0000000000
Binary files a/public/emoji/1f482-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f482-1f3fc.svg b/public/emoji/1f482-1f3fc.svg
index 0a822b81e6..9459a537bd 100644
--- a/public/emoji/1f482-1f3fc.svg
+++ b/public/emoji/1f482-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f482-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f482-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..21368fe456
--- /dev/null
+++ b/public/emoji/1f482-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f482-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f482-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..48eef95564
--- /dev/null
+++ b/public/emoji/1f482-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f482-1f3fd.png b/public/emoji/1f482-1f3fd.png
deleted file mode 100644
index 0f6726fbe8..0000000000
Binary files a/public/emoji/1f482-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f482-1f3fd.svg b/public/emoji/1f482-1f3fd.svg
index 3048f05b89..48eef95564 100644
--- a/public/emoji/1f482-1f3fd.svg
+++ b/public/emoji/1f482-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f482-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f482-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..93f02ff998
--- /dev/null
+++ b/public/emoji/1f482-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f482-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f482-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..6def55dcf9
--- /dev/null
+++ b/public/emoji/1f482-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f482-1f3fe.png b/public/emoji/1f482-1f3fe.png
deleted file mode 100644
index 85fcf9a3b9..0000000000
Binary files a/public/emoji/1f482-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f482-1f3fe.svg b/public/emoji/1f482-1f3fe.svg
index ece9fd37d9..6def55dcf9 100644
--- a/public/emoji/1f482-1f3fe.svg
+++ b/public/emoji/1f482-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f482-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f482-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..9251000275
--- /dev/null
+++ b/public/emoji/1f482-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f482-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f482-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..41e80851c8
--- /dev/null
+++ b/public/emoji/1f482-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f482-1f3ff.png b/public/emoji/1f482-1f3ff.png
deleted file mode 100644
index e5f9ca7d5a..0000000000
Binary files a/public/emoji/1f482-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f482-1f3ff.svg b/public/emoji/1f482-1f3ff.svg
index c59625be53..41e80851c8 100644
--- a/public/emoji/1f482-1f3ff.svg
+++ b/public/emoji/1f482-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f482-200d-2640-fe0f.svg b/public/emoji/1f482-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..11be3310a6
--- /dev/null
+++ b/public/emoji/1f482-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f482-200d-2642-fe0f.svg b/public/emoji/1f482-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..349a3c03cc
--- /dev/null
+++ b/public/emoji/1f482-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f482.png b/public/emoji/1f482.png
deleted file mode 100644
index 8d7ab3c473..0000000000
Binary files a/public/emoji/1f482.png and /dev/null differ
diff --git a/public/emoji/1f482.svg b/public/emoji/1f482.svg
index a2828629ee..349a3c03cc 100644
--- a/public/emoji/1f482.svg
+++ b/public/emoji/1f482.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f483-1f3fb.png b/public/emoji/1f483-1f3fb.png
deleted file mode 100644
index 2c7b11c3a6..0000000000
Binary files a/public/emoji/1f483-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f483-1f3fb.svg b/public/emoji/1f483-1f3fb.svg
index 23026b5a5e..5e28fb0f36 100644
--- a/public/emoji/1f483-1f3fb.svg
+++ b/public/emoji/1f483-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f483-1f3fc.png b/public/emoji/1f483-1f3fc.png
deleted file mode 100644
index cb04b1f907..0000000000
Binary files a/public/emoji/1f483-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f483-1f3fc.svg b/public/emoji/1f483-1f3fc.svg
index df65e02a36..57ded55283 100644
--- a/public/emoji/1f483-1f3fc.svg
+++ b/public/emoji/1f483-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f483-1f3fd.png b/public/emoji/1f483-1f3fd.png
deleted file mode 100644
index 98c5bca7b6..0000000000
Binary files a/public/emoji/1f483-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f483-1f3fd.svg b/public/emoji/1f483-1f3fd.svg
index e4c1d7b9dd..dc1ff5363a 100644
--- a/public/emoji/1f483-1f3fd.svg
+++ b/public/emoji/1f483-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f483-1f3fe.png b/public/emoji/1f483-1f3fe.png
deleted file mode 100644
index fdb1e00cbb..0000000000
Binary files a/public/emoji/1f483-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f483-1f3fe.svg b/public/emoji/1f483-1f3fe.svg
index e163cfbc5b..b80348375a 100644
--- a/public/emoji/1f483-1f3fe.svg
+++ b/public/emoji/1f483-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f483-1f3ff.png b/public/emoji/1f483-1f3ff.png
deleted file mode 100644
index 0e34e0e23f..0000000000
Binary files a/public/emoji/1f483-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f483-1f3ff.svg b/public/emoji/1f483-1f3ff.svg
index bb4dcfe494..80f37167d7 100644
--- a/public/emoji/1f483-1f3ff.svg
+++ b/public/emoji/1f483-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f483.png b/public/emoji/1f483.png
deleted file mode 100644
index 04b166991c..0000000000
Binary files a/public/emoji/1f483.png and /dev/null differ
diff --git a/public/emoji/1f483.svg b/public/emoji/1f483.svg
index 25ff89a2cd..436f9ae58a 100644
--- a/public/emoji/1f483.svg
+++ b/public/emoji/1f483.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f484.png b/public/emoji/1f484.png
deleted file mode 100644
index 61a0c084c9..0000000000
Binary files a/public/emoji/1f484.png and /dev/null differ
diff --git a/public/emoji/1f484.svg b/public/emoji/1f484.svg
index 99bc7908ba..86892d2f29 100644
--- a/public/emoji/1f484.svg
+++ b/public/emoji/1f484.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f485-1f3fb.png b/public/emoji/1f485-1f3fb.png
deleted file mode 100644
index 26e883dd24..0000000000
Binary files a/public/emoji/1f485-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f485-1f3fb.svg b/public/emoji/1f485-1f3fb.svg
index f31a7a2984..0ca21402e4 100644
--- a/public/emoji/1f485-1f3fb.svg
+++ b/public/emoji/1f485-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f485-1f3fc.png b/public/emoji/1f485-1f3fc.png
deleted file mode 100644
index 61257b47ea..0000000000
Binary files a/public/emoji/1f485-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f485-1f3fc.svg b/public/emoji/1f485-1f3fc.svg
index 442102a4bd..e20634f6c3 100644
--- a/public/emoji/1f485-1f3fc.svg
+++ b/public/emoji/1f485-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f485-1f3fd.png b/public/emoji/1f485-1f3fd.png
deleted file mode 100644
index 29871b05f6..0000000000
Binary files a/public/emoji/1f485-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f485-1f3fd.svg b/public/emoji/1f485-1f3fd.svg
index daa1db1997..c2d3ade12b 100644
--- a/public/emoji/1f485-1f3fd.svg
+++ b/public/emoji/1f485-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f485-1f3fe.png b/public/emoji/1f485-1f3fe.png
deleted file mode 100644
index 2881de0b17..0000000000
Binary files a/public/emoji/1f485-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f485-1f3fe.svg b/public/emoji/1f485-1f3fe.svg
index 759366904f..a47022a922 100644
--- a/public/emoji/1f485-1f3fe.svg
+++ b/public/emoji/1f485-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f485-1f3ff.png b/public/emoji/1f485-1f3ff.png
deleted file mode 100644
index a0b7c0a45a..0000000000
Binary files a/public/emoji/1f485-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f485-1f3ff.svg b/public/emoji/1f485-1f3ff.svg
index 36a0f84030..3c6a2a135a 100644
--- a/public/emoji/1f485-1f3ff.svg
+++ b/public/emoji/1f485-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f485.png b/public/emoji/1f485.png
deleted file mode 100644
index aa52af7050..0000000000
Binary files a/public/emoji/1f485.png and /dev/null differ
diff --git a/public/emoji/1f485.svg b/public/emoji/1f485.svg
index 91fd2c51f3..3f956cbd30 100644
--- a/public/emoji/1f485.svg
+++ b/public/emoji/1f485.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f486-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f486-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..9a67284b5a
--- /dev/null
+++ b/public/emoji/1f486-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f486-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f486-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..68b072cfcd
--- /dev/null
+++ b/public/emoji/1f486-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f486-1f3fb.png b/public/emoji/1f486-1f3fb.png
deleted file mode 100644
index e0f415d318..0000000000
Binary files a/public/emoji/1f486-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f486-1f3fb.svg b/public/emoji/1f486-1f3fb.svg
index dc1aef549a..9a67284b5a 100644
--- a/public/emoji/1f486-1f3fb.svg
+++ b/public/emoji/1f486-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f486-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f486-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..9ebc012da5
--- /dev/null
+++ b/public/emoji/1f486-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f486-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f486-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..1eaa098c1c
--- /dev/null
+++ b/public/emoji/1f486-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f486-1f3fc.png b/public/emoji/1f486-1f3fc.png
deleted file mode 100644
index 0bb244a270..0000000000
Binary files a/public/emoji/1f486-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f486-1f3fc.svg b/public/emoji/1f486-1f3fc.svg
index ccea5085ed..9ebc012da5 100644
--- a/public/emoji/1f486-1f3fc.svg
+++ b/public/emoji/1f486-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f486-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f486-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..52e52636c9
--- /dev/null
+++ b/public/emoji/1f486-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f486-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f486-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..8852a1efc3
--- /dev/null
+++ b/public/emoji/1f486-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f486-1f3fd.png b/public/emoji/1f486-1f3fd.png
deleted file mode 100644
index a117ee81a2..0000000000
Binary files a/public/emoji/1f486-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f486-1f3fd.svg b/public/emoji/1f486-1f3fd.svg
index 245ca4b6d9..52e52636c9 100644
--- a/public/emoji/1f486-1f3fd.svg
+++ b/public/emoji/1f486-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f486-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f486-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..ad9c254bd8
--- /dev/null
+++ b/public/emoji/1f486-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f486-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f486-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..caa12c4796
--- /dev/null
+++ b/public/emoji/1f486-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f486-1f3fe.png b/public/emoji/1f486-1f3fe.png
deleted file mode 100644
index 6f42ab017f..0000000000
Binary files a/public/emoji/1f486-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f486-1f3fe.svg b/public/emoji/1f486-1f3fe.svg
index a56ff48dd7..ad9c254bd8 100644
--- a/public/emoji/1f486-1f3fe.svg
+++ b/public/emoji/1f486-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f486-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f486-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..3fb4f84208
--- /dev/null
+++ b/public/emoji/1f486-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f486-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f486-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..2242f1b8af
--- /dev/null
+++ b/public/emoji/1f486-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f486-1f3ff.png b/public/emoji/1f486-1f3ff.png
deleted file mode 100644
index 6a388c0d0b..0000000000
Binary files a/public/emoji/1f486-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f486-1f3ff.svg b/public/emoji/1f486-1f3ff.svg
index bf24cb0684..3fb4f84208 100644
--- a/public/emoji/1f486-1f3ff.svg
+++ b/public/emoji/1f486-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f486-200d-2640-fe0f.svg b/public/emoji/1f486-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..39ffd8bdcb
--- /dev/null
+++ b/public/emoji/1f486-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f486-200d-2642-fe0f.svg b/public/emoji/1f486-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..e9d1cff1d1
--- /dev/null
+++ b/public/emoji/1f486-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f486.png b/public/emoji/1f486.png
deleted file mode 100644
index b91d845e37..0000000000
Binary files a/public/emoji/1f486.png and /dev/null differ
diff --git a/public/emoji/1f486.svg b/public/emoji/1f486.svg
index 04a2727138..39ffd8bdcb 100644
--- a/public/emoji/1f486.svg
+++ b/public/emoji/1f486.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f487-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f487-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..0625e084cf
--- /dev/null
+++ b/public/emoji/1f487-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f487-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f487-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..9325536687
--- /dev/null
+++ b/public/emoji/1f487-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f487-1f3fb.png b/public/emoji/1f487-1f3fb.png
deleted file mode 100644
index c743b74abe..0000000000
Binary files a/public/emoji/1f487-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f487-1f3fb.svg b/public/emoji/1f487-1f3fb.svg
index 793781e7ee..0625e084cf 100644
--- a/public/emoji/1f487-1f3fb.svg
+++ b/public/emoji/1f487-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f487-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f487-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..9457987a0d
--- /dev/null
+++ b/public/emoji/1f487-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f487-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f487-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..1e91c663a9
--- /dev/null
+++ b/public/emoji/1f487-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f487-1f3fc.png b/public/emoji/1f487-1f3fc.png
deleted file mode 100644
index f144f8e55c..0000000000
Binary files a/public/emoji/1f487-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f487-1f3fc.svg b/public/emoji/1f487-1f3fc.svg
index ac7e41cfc1..9457987a0d 100644
--- a/public/emoji/1f487-1f3fc.svg
+++ b/public/emoji/1f487-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f487-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f487-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..607df1e22a
--- /dev/null
+++ b/public/emoji/1f487-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f487-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f487-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..5f32e63385
--- /dev/null
+++ b/public/emoji/1f487-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f487-1f3fd.png b/public/emoji/1f487-1f3fd.png
deleted file mode 100644
index d5ad19563a..0000000000
Binary files a/public/emoji/1f487-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f487-1f3fd.svg b/public/emoji/1f487-1f3fd.svg
index b581fe54ab..607df1e22a 100644
--- a/public/emoji/1f487-1f3fd.svg
+++ b/public/emoji/1f487-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f487-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f487-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..d0cccfc8fa
--- /dev/null
+++ b/public/emoji/1f487-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f487-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f487-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..6f4de3161a
--- /dev/null
+++ b/public/emoji/1f487-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f487-1f3fe.png b/public/emoji/1f487-1f3fe.png
deleted file mode 100644
index 244fd3af00..0000000000
Binary files a/public/emoji/1f487-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f487-1f3fe.svg b/public/emoji/1f487-1f3fe.svg
index 2c2be850cd..d0cccfc8fa 100644
--- a/public/emoji/1f487-1f3fe.svg
+++ b/public/emoji/1f487-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f487-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f487-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..8edd33e3f3
--- /dev/null
+++ b/public/emoji/1f487-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f487-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f487-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..4246251e85
--- /dev/null
+++ b/public/emoji/1f487-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f487-1f3ff.png b/public/emoji/1f487-1f3ff.png
deleted file mode 100644
index 20a94a8862..0000000000
Binary files a/public/emoji/1f487-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f487-1f3ff.svg b/public/emoji/1f487-1f3ff.svg
index 0d4ee4cb52..8edd33e3f3 100644
--- a/public/emoji/1f487-1f3ff.svg
+++ b/public/emoji/1f487-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f487-200d-2640-fe0f.svg b/public/emoji/1f487-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..f6c2fd7d46
--- /dev/null
+++ b/public/emoji/1f487-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f487-200d-2642-fe0f.svg b/public/emoji/1f487-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..257d6d08ce
--- /dev/null
+++ b/public/emoji/1f487-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f487.png b/public/emoji/1f487.png
deleted file mode 100644
index 91266b1293..0000000000
Binary files a/public/emoji/1f487.png and /dev/null differ
diff --git a/public/emoji/1f487.svg b/public/emoji/1f487.svg
index 0d345e70b7..f6c2fd7d46 100644
--- a/public/emoji/1f487.svg
+++ b/public/emoji/1f487.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f488.png b/public/emoji/1f488.png
deleted file mode 100644
index 896f4d716c..0000000000
Binary files a/public/emoji/1f488.png and /dev/null differ
diff --git a/public/emoji/1f488.svg b/public/emoji/1f488.svg
index 8db2bdc7d8..e9ae2255ca 100644
--- a/public/emoji/1f488.svg
+++ b/public/emoji/1f488.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f489.png b/public/emoji/1f489.png
deleted file mode 100644
index 71c1a9528d..0000000000
Binary files a/public/emoji/1f489.png and /dev/null differ
diff --git a/public/emoji/1f489.svg b/public/emoji/1f489.svg
index 0a2fe96675..9c4caf5c1d 100644
--- a/public/emoji/1f489.svg
+++ b/public/emoji/1f489.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f48a.png b/public/emoji/1f48a.png
deleted file mode 100644
index 1d4530e77a..0000000000
Binary files a/public/emoji/1f48a.png and /dev/null differ
diff --git a/public/emoji/1f48a.svg b/public/emoji/1f48a.svg
index ea0a9a8cc8..c7bd668018 100644
--- a/public/emoji/1f48a.svg
+++ b/public/emoji/1f48a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f48b.png b/public/emoji/1f48b.png
deleted file mode 100644
index 85e6dcfc4e..0000000000
Binary files a/public/emoji/1f48b.png and /dev/null differ
diff --git a/public/emoji/1f48b.svg b/public/emoji/1f48b.svg
index a2d76f20de..492398c52b 100644
--- a/public/emoji/1f48b.svg
+++ b/public/emoji/1f48b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f48c.png b/public/emoji/1f48c.png
deleted file mode 100644
index 3c3c767e78..0000000000
Binary files a/public/emoji/1f48c.png and /dev/null differ
diff --git a/public/emoji/1f48c.svg b/public/emoji/1f48c.svg
index ae73beac1f..b2f85697a1 100644
--- a/public/emoji/1f48c.svg
+++ b/public/emoji/1f48c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f48d.png b/public/emoji/1f48d.png
deleted file mode 100644
index 87d227adb7..0000000000
Binary files a/public/emoji/1f48d.png and /dev/null differ
diff --git a/public/emoji/1f48d.svg b/public/emoji/1f48d.svg
index 51da1763cb..8bbab8ac61 100644
--- a/public/emoji/1f48d.svg
+++ b/public/emoji/1f48d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f48e.png b/public/emoji/1f48e.png
deleted file mode 100644
index db122d26a1..0000000000
Binary files a/public/emoji/1f48e.png and /dev/null differ
diff --git a/public/emoji/1f48e.svg b/public/emoji/1f48e.svg
index c7a3719a28..d89d981903 100644
--- a/public/emoji/1f48e.svg
+++ b/public/emoji/1f48e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f48f.png b/public/emoji/1f48f.png
deleted file mode 100644
index 9aa519da9e..0000000000
Binary files a/public/emoji/1f48f.png and /dev/null differ
diff --git a/public/emoji/1f48f.svg b/public/emoji/1f48f.svg
index cd4f66f04d..0bae3004bc 100644
--- a/public/emoji/1f48f.svg
+++ b/public/emoji/1f48f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f490.png b/public/emoji/1f490.png
deleted file mode 100644
index 11455af6df..0000000000
Binary files a/public/emoji/1f490.png and /dev/null differ
diff --git a/public/emoji/1f490.svg b/public/emoji/1f490.svg
index 8f15a96523..79b996eedd 100644
--- a/public/emoji/1f490.svg
+++ b/public/emoji/1f490.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f491.png b/public/emoji/1f491.png
deleted file mode 100644
index 62111601b3..0000000000
Binary files a/public/emoji/1f491.png and /dev/null differ
diff --git a/public/emoji/1f491.svg b/public/emoji/1f491.svg
index 38085503c0..9ec3083f4d 100644
--- a/public/emoji/1f491.svg
+++ b/public/emoji/1f491.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f492.png b/public/emoji/1f492.png
deleted file mode 100644
index d0d8aa0bfa..0000000000
Binary files a/public/emoji/1f492.png and /dev/null differ
diff --git a/public/emoji/1f492.svg b/public/emoji/1f492.svg
index e7008d4232..e2873f71e6 100644
--- a/public/emoji/1f492.svg
+++ b/public/emoji/1f492.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f493.png b/public/emoji/1f493.png
deleted file mode 100644
index 0bcf2d1d56..0000000000
Binary files a/public/emoji/1f493.png and /dev/null differ
diff --git a/public/emoji/1f493.svg b/public/emoji/1f493.svg
index 41388626b9..1a0a8a054b 100644
--- a/public/emoji/1f493.svg
+++ b/public/emoji/1f493.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f494.png b/public/emoji/1f494.png
deleted file mode 100644
index 718e26ee12..0000000000
Binary files a/public/emoji/1f494.png and /dev/null differ
diff --git a/public/emoji/1f494.svg b/public/emoji/1f494.svg
index a8b9e1b05f..5236cebce6 100644
--- a/public/emoji/1f494.svg
+++ b/public/emoji/1f494.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f495.png b/public/emoji/1f495.png
deleted file mode 100644
index 4d8c338604..0000000000
Binary files a/public/emoji/1f495.png and /dev/null differ
diff --git a/public/emoji/1f495.svg b/public/emoji/1f495.svg
index 6f51fbd1ff..b8e0e292be 100644
--- a/public/emoji/1f495.svg
+++ b/public/emoji/1f495.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f496.png b/public/emoji/1f496.png
deleted file mode 100644
index 6709269454..0000000000
Binary files a/public/emoji/1f496.png and /dev/null differ
diff --git a/public/emoji/1f496.svg b/public/emoji/1f496.svg
index 27457d5b78..75a875b3a9 100644
--- a/public/emoji/1f496.svg
+++ b/public/emoji/1f496.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f497.png b/public/emoji/1f497.png
deleted file mode 100644
index d6e694e972..0000000000
Binary files a/public/emoji/1f497.png and /dev/null differ
diff --git a/public/emoji/1f497.svg b/public/emoji/1f497.svg
index a3da17e1f1..1f586cd457 100644
--- a/public/emoji/1f497.svg
+++ b/public/emoji/1f497.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f498.png b/public/emoji/1f498.png
deleted file mode 100644
index 2df0078ddd..0000000000
Binary files a/public/emoji/1f498.png and /dev/null differ
diff --git a/public/emoji/1f498.svg b/public/emoji/1f498.svg
index 66b99f3304..619c6aa24e 100644
--- a/public/emoji/1f498.svg
+++ b/public/emoji/1f498.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f499.png b/public/emoji/1f499.png
deleted file mode 100644
index bdf1287e55..0000000000
Binary files a/public/emoji/1f499.png and /dev/null differ
diff --git a/public/emoji/1f499.svg b/public/emoji/1f499.svg
index 6db134a92d..9d48cbf892 100644
--- a/public/emoji/1f499.svg
+++ b/public/emoji/1f499.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f49a.png b/public/emoji/1f49a.png
deleted file mode 100644
index c52d60a58b..0000000000
Binary files a/public/emoji/1f49a.png and /dev/null differ
diff --git a/public/emoji/1f49a.svg b/public/emoji/1f49a.svg
index 2d718b516b..41990800e5 100644
--- a/public/emoji/1f49a.svg
+++ b/public/emoji/1f49a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f49b.png b/public/emoji/1f49b.png
deleted file mode 100644
index 7901a9d010..0000000000
Binary files a/public/emoji/1f49b.png and /dev/null differ
diff --git a/public/emoji/1f49b.svg b/public/emoji/1f49b.svg
index c642502054..b6e1978628 100644
--- a/public/emoji/1f49b.svg
+++ b/public/emoji/1f49b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f49c.png b/public/emoji/1f49c.png
deleted file mode 100644
index 95c53a9ade..0000000000
Binary files a/public/emoji/1f49c.png and /dev/null differ
diff --git a/public/emoji/1f49c.svg b/public/emoji/1f49c.svg
index 7adf079397..29c4300462 100644
--- a/public/emoji/1f49c.svg
+++ b/public/emoji/1f49c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f49d.png b/public/emoji/1f49d.png
deleted file mode 100644
index 902ceafe4d..0000000000
Binary files a/public/emoji/1f49d.png and /dev/null differ
diff --git a/public/emoji/1f49d.svg b/public/emoji/1f49d.svg
index 2e8a496880..aab714aaf2 100644
--- a/public/emoji/1f49d.svg
+++ b/public/emoji/1f49d.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f49e.png b/public/emoji/1f49e.png
deleted file mode 100644
index 7b9d1948f7..0000000000
Binary files a/public/emoji/1f49e.png and /dev/null differ
diff --git a/public/emoji/1f49e.svg b/public/emoji/1f49e.svg
index f90aae90f7..d25ef6ba9c 100644
--- a/public/emoji/1f49e.svg
+++ b/public/emoji/1f49e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f49f.png b/public/emoji/1f49f.png
deleted file mode 100644
index 5443f60bc6..0000000000
Binary files a/public/emoji/1f49f.png and /dev/null differ
diff --git a/public/emoji/1f49f.svg b/public/emoji/1f49f.svg
index 2c1c7d2701..0276b32a89 100644
--- a/public/emoji/1f49f.svg
+++ b/public/emoji/1f49f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4a0.png b/public/emoji/1f4a0.png
deleted file mode 100644
index 2a22a26d1e..0000000000
Binary files a/public/emoji/1f4a0.png and /dev/null differ
diff --git a/public/emoji/1f4a0.svg b/public/emoji/1f4a0.svg
index 77363d1998..37291c912e 100644
--- a/public/emoji/1f4a0.svg
+++ b/public/emoji/1f4a0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4a1.png b/public/emoji/1f4a1.png
deleted file mode 100644
index 38e32e02d9..0000000000
Binary files a/public/emoji/1f4a1.png and /dev/null differ
diff --git a/public/emoji/1f4a1.svg b/public/emoji/1f4a1.svg
index 7e44d418a6..dc2aa4d218 100644
--- a/public/emoji/1f4a1.svg
+++ b/public/emoji/1f4a1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4a2.png b/public/emoji/1f4a2.png
deleted file mode 100644
index d63c2e000e..0000000000
Binary files a/public/emoji/1f4a2.png and /dev/null differ
diff --git a/public/emoji/1f4a2.svg b/public/emoji/1f4a2.svg
index d816b49346..6ba7cd3a01 100644
--- a/public/emoji/1f4a2.svg
+++ b/public/emoji/1f4a2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4a3.png b/public/emoji/1f4a3.png
deleted file mode 100644
index c7f8f81c93..0000000000
Binary files a/public/emoji/1f4a3.png and /dev/null differ
diff --git a/public/emoji/1f4a3.svg b/public/emoji/1f4a3.svg
index b9a7e0f747..803d57e9e7 100644
--- a/public/emoji/1f4a3.svg
+++ b/public/emoji/1f4a3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4a4.png b/public/emoji/1f4a4.png
deleted file mode 100644
index 9bc72b4469..0000000000
Binary files a/public/emoji/1f4a4.png and /dev/null differ
diff --git a/public/emoji/1f4a4.svg b/public/emoji/1f4a4.svg
index 625c724827..83df1a48d1 100644
--- a/public/emoji/1f4a4.svg
+++ b/public/emoji/1f4a4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4a5.png b/public/emoji/1f4a5.png
deleted file mode 100644
index 9b0f027b1a..0000000000
Binary files a/public/emoji/1f4a5.png and /dev/null differ
diff --git a/public/emoji/1f4a5.svg b/public/emoji/1f4a5.svg
index 5ae4d00dba..f7d71d3eae 100644
--- a/public/emoji/1f4a5.svg
+++ b/public/emoji/1f4a5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4a6.png b/public/emoji/1f4a6.png
deleted file mode 100644
index 4106117ebc..0000000000
Binary files a/public/emoji/1f4a6.png and /dev/null differ
diff --git a/public/emoji/1f4a6.svg b/public/emoji/1f4a6.svg
index d33061edc1..c57213860a 100644
--- a/public/emoji/1f4a6.svg
+++ b/public/emoji/1f4a6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4a7.png b/public/emoji/1f4a7.png
deleted file mode 100644
index 71241ec306..0000000000
Binary files a/public/emoji/1f4a7.png and /dev/null differ
diff --git a/public/emoji/1f4a7.svg b/public/emoji/1f4a7.svg
index e56136fe51..99699f6f0b 100644
--- a/public/emoji/1f4a7.svg
+++ b/public/emoji/1f4a7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4a8.png b/public/emoji/1f4a8.png
deleted file mode 100644
index 064b8525c1..0000000000
Binary files a/public/emoji/1f4a8.png and /dev/null differ
diff --git a/public/emoji/1f4a8.svg b/public/emoji/1f4a8.svg
index 5807909d14..13a086ec5c 100644
--- a/public/emoji/1f4a8.svg
+++ b/public/emoji/1f4a8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4a9.png b/public/emoji/1f4a9.png
deleted file mode 100644
index 10b15e72d5..0000000000
Binary files a/public/emoji/1f4a9.png and /dev/null differ
diff --git a/public/emoji/1f4a9.svg b/public/emoji/1f4a9.svg
index 342ac404bc..ef0d55c1f7 100644
--- a/public/emoji/1f4a9.svg
+++ b/public/emoji/1f4a9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4aa-1f3fb.png b/public/emoji/1f4aa-1f3fb.png
deleted file mode 100644
index 1522942ce5..0000000000
Binary files a/public/emoji/1f4aa-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f4aa-1f3fb.svg b/public/emoji/1f4aa-1f3fb.svg
index 174dc99d27..9781796896 100644
--- a/public/emoji/1f4aa-1f3fb.svg
+++ b/public/emoji/1f4aa-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4aa-1f3fc.png b/public/emoji/1f4aa-1f3fc.png
deleted file mode 100644
index 569c6e832c..0000000000
Binary files a/public/emoji/1f4aa-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f4aa-1f3fc.svg b/public/emoji/1f4aa-1f3fc.svg
index be0b9c70b0..f572f93a02 100644
--- a/public/emoji/1f4aa-1f3fc.svg
+++ b/public/emoji/1f4aa-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4aa-1f3fd.png b/public/emoji/1f4aa-1f3fd.png
deleted file mode 100644
index 0a76b00fa8..0000000000
Binary files a/public/emoji/1f4aa-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f4aa-1f3fd.svg b/public/emoji/1f4aa-1f3fd.svg
index fa50395b98..1d0ca6d95e 100644
--- a/public/emoji/1f4aa-1f3fd.svg
+++ b/public/emoji/1f4aa-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4aa-1f3fe.png b/public/emoji/1f4aa-1f3fe.png
deleted file mode 100644
index f0cf31328e..0000000000
Binary files a/public/emoji/1f4aa-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f4aa-1f3fe.svg b/public/emoji/1f4aa-1f3fe.svg
index 820211811b..ae067f1c42 100644
--- a/public/emoji/1f4aa-1f3fe.svg
+++ b/public/emoji/1f4aa-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4aa-1f3ff.png b/public/emoji/1f4aa-1f3ff.png
deleted file mode 100644
index 4fda92460e..0000000000
Binary files a/public/emoji/1f4aa-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f4aa-1f3ff.svg b/public/emoji/1f4aa-1f3ff.svg
index 109ded67dc..30b3fa6262 100644
--- a/public/emoji/1f4aa-1f3ff.svg
+++ b/public/emoji/1f4aa-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4aa.png b/public/emoji/1f4aa.png
deleted file mode 100644
index 7e67c1880f..0000000000
Binary files a/public/emoji/1f4aa.png and /dev/null differ
diff --git a/public/emoji/1f4aa.svg b/public/emoji/1f4aa.svg
index 772927cc41..dcf6e9ede1 100644
--- a/public/emoji/1f4aa.svg
+++ b/public/emoji/1f4aa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4ab.png b/public/emoji/1f4ab.png
deleted file mode 100644
index 85f52efad2..0000000000
Binary files a/public/emoji/1f4ab.png and /dev/null differ
diff --git a/public/emoji/1f4ab.svg b/public/emoji/1f4ab.svg
index 6f4ba8a7b2..9df115d2c2 100644
--- a/public/emoji/1f4ab.svg
+++ b/public/emoji/1f4ab.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4ac.png b/public/emoji/1f4ac.png
deleted file mode 100644
index a34ef74173..0000000000
Binary files a/public/emoji/1f4ac.png and /dev/null differ
diff --git a/public/emoji/1f4ac.svg b/public/emoji/1f4ac.svg
index 663533c822..fa87690187 100644
--- a/public/emoji/1f4ac.svg
+++ b/public/emoji/1f4ac.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4ad.png b/public/emoji/1f4ad.png
deleted file mode 100644
index 72fe8fa702..0000000000
Binary files a/public/emoji/1f4ad.png and /dev/null differ
diff --git a/public/emoji/1f4ad.svg b/public/emoji/1f4ad.svg
index b9883d63aa..6ff056df19 100644
--- a/public/emoji/1f4ad.svg
+++ b/public/emoji/1f4ad.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4ae.png b/public/emoji/1f4ae.png
deleted file mode 100644
index d6af8b6007..0000000000
Binary files a/public/emoji/1f4ae.png and /dev/null differ
diff --git a/public/emoji/1f4ae.svg b/public/emoji/1f4ae.svg
index 3703f53e2e..be4d941926 100644
--- a/public/emoji/1f4ae.svg
+++ b/public/emoji/1f4ae.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4af.png b/public/emoji/1f4af.png
deleted file mode 100644
index 6903ff0304..0000000000
Binary files a/public/emoji/1f4af.png and /dev/null differ
diff --git a/public/emoji/1f4af.svg b/public/emoji/1f4af.svg
index 8bb5a8027d..80a08e0166 100644
--- a/public/emoji/1f4af.svg
+++ b/public/emoji/1f4af.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4b0.png b/public/emoji/1f4b0.png
deleted file mode 100644
index b9296be090..0000000000
Binary files a/public/emoji/1f4b0.png and /dev/null differ
diff --git a/public/emoji/1f4b0.svg b/public/emoji/1f4b0.svg
index 5dcbf7d1cd..a232587328 100644
--- a/public/emoji/1f4b0.svg
+++ b/public/emoji/1f4b0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4b1.png b/public/emoji/1f4b1.png
deleted file mode 100644
index 4d46c6050e..0000000000
Binary files a/public/emoji/1f4b1.png and /dev/null differ
diff --git a/public/emoji/1f4b1.svg b/public/emoji/1f4b1.svg
index 350402b9d6..66cee5e038 100644
--- a/public/emoji/1f4b1.svg
+++ b/public/emoji/1f4b1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4b2.png b/public/emoji/1f4b2.png
deleted file mode 100644
index ef2c2e2059..0000000000
Binary files a/public/emoji/1f4b2.png and /dev/null differ
diff --git a/public/emoji/1f4b2.svg b/public/emoji/1f4b2.svg
index 12419774cb..12abc53234 100644
--- a/public/emoji/1f4b2.svg
+++ b/public/emoji/1f4b2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4b3.png b/public/emoji/1f4b3.png
deleted file mode 100644
index 372777d5c6..0000000000
Binary files a/public/emoji/1f4b3.png and /dev/null differ
diff --git a/public/emoji/1f4b3.svg b/public/emoji/1f4b3.svg
index 289be20ad4..2a7941970e 100644
--- a/public/emoji/1f4b3.svg
+++ b/public/emoji/1f4b3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4b4.png b/public/emoji/1f4b4.png
deleted file mode 100644
index 63ee4799d6..0000000000
Binary files a/public/emoji/1f4b4.png and /dev/null differ
diff --git a/public/emoji/1f4b4.svg b/public/emoji/1f4b4.svg
index 73ada09a2f..6d9d73854d 100644
--- a/public/emoji/1f4b4.svg
+++ b/public/emoji/1f4b4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4b5.png b/public/emoji/1f4b5.png
deleted file mode 100644
index a9904c2829..0000000000
Binary files a/public/emoji/1f4b5.png and /dev/null differ
diff --git a/public/emoji/1f4b5.svg b/public/emoji/1f4b5.svg
index a6723a2be5..1288e2638a 100644
--- a/public/emoji/1f4b5.svg
+++ b/public/emoji/1f4b5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4b6.png b/public/emoji/1f4b6.png
deleted file mode 100644
index a49020820e..0000000000
Binary files a/public/emoji/1f4b6.png and /dev/null differ
diff --git a/public/emoji/1f4b6.svg b/public/emoji/1f4b6.svg
index 4ab37625bf..54ca3194d4 100644
--- a/public/emoji/1f4b6.svg
+++ b/public/emoji/1f4b6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4b7.png b/public/emoji/1f4b7.png
deleted file mode 100644
index a0d4c4099e..0000000000
Binary files a/public/emoji/1f4b7.png and /dev/null differ
diff --git a/public/emoji/1f4b7.svg b/public/emoji/1f4b7.svg
index 59a5f522ac..c619edaad8 100644
--- a/public/emoji/1f4b7.svg
+++ b/public/emoji/1f4b7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4b8.png b/public/emoji/1f4b8.png
deleted file mode 100644
index f022b04b3c..0000000000
Binary files a/public/emoji/1f4b8.png and /dev/null differ
diff --git a/public/emoji/1f4b8.svg b/public/emoji/1f4b8.svg
index 8e90f8e501..f51e8fbb3a 100644
--- a/public/emoji/1f4b8.svg
+++ b/public/emoji/1f4b8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4b9.png b/public/emoji/1f4b9.png
deleted file mode 100644
index 9773f03be2..0000000000
Binary files a/public/emoji/1f4b9.png and /dev/null differ
diff --git a/public/emoji/1f4b9.svg b/public/emoji/1f4b9.svg
index b794bad1cd..eff7d7351a 100644
--- a/public/emoji/1f4b9.svg
+++ b/public/emoji/1f4b9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4ba.png b/public/emoji/1f4ba.png
deleted file mode 100644
index a6d72d95ad..0000000000
Binary files a/public/emoji/1f4ba.png and /dev/null differ
diff --git a/public/emoji/1f4ba.svg b/public/emoji/1f4ba.svg
index a961080f26..1ae3854de1 100644
--- a/public/emoji/1f4ba.svg
+++ b/public/emoji/1f4ba.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4bb.png b/public/emoji/1f4bb.png
deleted file mode 100644
index c1fee27e3a..0000000000
Binary files a/public/emoji/1f4bb.png and /dev/null differ
diff --git a/public/emoji/1f4bb.svg b/public/emoji/1f4bb.svg
index de2b1388a8..e995d48561 100644
--- a/public/emoji/1f4bb.svg
+++ b/public/emoji/1f4bb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4bc.png b/public/emoji/1f4bc.png
deleted file mode 100644
index b9912ba214..0000000000
Binary files a/public/emoji/1f4bc.png and /dev/null differ
diff --git a/public/emoji/1f4bc.svg b/public/emoji/1f4bc.svg
index 16fd4d5722..9556a69ecc 100644
--- a/public/emoji/1f4bc.svg
+++ b/public/emoji/1f4bc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4bd.png b/public/emoji/1f4bd.png
deleted file mode 100644
index 9fa94cfbe7..0000000000
Binary files a/public/emoji/1f4bd.png and /dev/null differ
diff --git a/public/emoji/1f4bd.svg b/public/emoji/1f4bd.svg
index f37c1636ce..e02677feeb 100644
--- a/public/emoji/1f4bd.svg
+++ b/public/emoji/1f4bd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4be.png b/public/emoji/1f4be.png
deleted file mode 100644
index 072a76d3c1..0000000000
Binary files a/public/emoji/1f4be.png and /dev/null differ
diff --git a/public/emoji/1f4be.svg b/public/emoji/1f4be.svg
index 9eba4f910a..4a2be4b03b 100644
--- a/public/emoji/1f4be.svg
+++ b/public/emoji/1f4be.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4bf.png b/public/emoji/1f4bf.png
deleted file mode 100644
index e6b01449cd..0000000000
Binary files a/public/emoji/1f4bf.png and /dev/null differ
diff --git a/public/emoji/1f4bf.svg b/public/emoji/1f4bf.svg
index eac0a2aabe..78c4bdafd5 100644
--- a/public/emoji/1f4bf.svg
+++ b/public/emoji/1f4bf.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4c0.png b/public/emoji/1f4c0.png
deleted file mode 100644
index 045a6f7a08..0000000000
Binary files a/public/emoji/1f4c0.png and /dev/null differ
diff --git a/public/emoji/1f4c0.svg b/public/emoji/1f4c0.svg
index 2547f71c1b..341784d8e2 100644
--- a/public/emoji/1f4c0.svg
+++ b/public/emoji/1f4c0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4c1.png b/public/emoji/1f4c1.png
deleted file mode 100644
index addedaf087..0000000000
Binary files a/public/emoji/1f4c1.png and /dev/null differ
diff --git a/public/emoji/1f4c1.svg b/public/emoji/1f4c1.svg
index 8eaf3c99c3..1fd3ac19c6 100644
--- a/public/emoji/1f4c1.svg
+++ b/public/emoji/1f4c1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4c2.png b/public/emoji/1f4c2.png
deleted file mode 100644
index 3993b09222..0000000000
Binary files a/public/emoji/1f4c2.png and /dev/null differ
diff --git a/public/emoji/1f4c2.svg b/public/emoji/1f4c2.svg
index 85fc741489..74498396df 100644
--- a/public/emoji/1f4c2.svg
+++ b/public/emoji/1f4c2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4c3.png b/public/emoji/1f4c3.png
deleted file mode 100644
index 06355319c7..0000000000
Binary files a/public/emoji/1f4c3.png and /dev/null differ
diff --git a/public/emoji/1f4c3.svg b/public/emoji/1f4c3.svg
index 46b14fcc86..a275b27352 100644
--- a/public/emoji/1f4c3.svg
+++ b/public/emoji/1f4c3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4c4.png b/public/emoji/1f4c4.png
deleted file mode 100644
index ba4ed757e0..0000000000
Binary files a/public/emoji/1f4c4.png and /dev/null differ
diff --git a/public/emoji/1f4c4.svg b/public/emoji/1f4c4.svg
index b782c61461..3b2d58b31a 100644
--- a/public/emoji/1f4c4.svg
+++ b/public/emoji/1f4c4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4c5.png b/public/emoji/1f4c5.png
deleted file mode 100644
index f05b3da97b..0000000000
Binary files a/public/emoji/1f4c5.png and /dev/null differ
diff --git a/public/emoji/1f4c5.svg b/public/emoji/1f4c5.svg
index 5b18759b06..2defa94058 100644
--- a/public/emoji/1f4c5.svg
+++ b/public/emoji/1f4c5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4c6.png b/public/emoji/1f4c6.png
deleted file mode 100644
index 47353b7444..0000000000
Binary files a/public/emoji/1f4c6.png and /dev/null differ
diff --git a/public/emoji/1f4c6.svg b/public/emoji/1f4c6.svg
index a82a590856..1356a920e0 100644
--- a/public/emoji/1f4c6.svg
+++ b/public/emoji/1f4c6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4c7.png b/public/emoji/1f4c7.png
deleted file mode 100644
index 151e11cb3b..0000000000
Binary files a/public/emoji/1f4c7.png and /dev/null differ
diff --git a/public/emoji/1f4c7.svg b/public/emoji/1f4c7.svg
index 21c4b7730f..d8f8fb4470 100644
--- a/public/emoji/1f4c7.svg
+++ b/public/emoji/1f4c7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4c8.png b/public/emoji/1f4c8.png
deleted file mode 100644
index f13cfcf995..0000000000
Binary files a/public/emoji/1f4c8.png and /dev/null differ
diff --git a/public/emoji/1f4c8.svg b/public/emoji/1f4c8.svg
index 69c80f6b8f..6500ccbb7c 100644
--- a/public/emoji/1f4c8.svg
+++ b/public/emoji/1f4c8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4c9.png b/public/emoji/1f4c9.png
deleted file mode 100644
index 5222ec72d8..0000000000
Binary files a/public/emoji/1f4c9.png and /dev/null differ
diff --git a/public/emoji/1f4c9.svg b/public/emoji/1f4c9.svg
index 6210970020..1989d48faf 100644
--- a/public/emoji/1f4c9.svg
+++ b/public/emoji/1f4c9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4ca.png b/public/emoji/1f4ca.png
deleted file mode 100644
index 53c8945500..0000000000
Binary files a/public/emoji/1f4ca.png and /dev/null differ
diff --git a/public/emoji/1f4ca.svg b/public/emoji/1f4ca.svg
index 619ce84e4d..b7aee13b66 100644
--- a/public/emoji/1f4ca.svg
+++ b/public/emoji/1f4ca.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4cb.png b/public/emoji/1f4cb.png
deleted file mode 100644
index 7edcfc5250..0000000000
Binary files a/public/emoji/1f4cb.png and /dev/null differ
diff --git a/public/emoji/1f4cb.svg b/public/emoji/1f4cb.svg
index 29f1ef7fbf..b2577d99a1 100644
--- a/public/emoji/1f4cb.svg
+++ b/public/emoji/1f4cb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4cc.png b/public/emoji/1f4cc.png
deleted file mode 100644
index 57e07d7f4c..0000000000
Binary files a/public/emoji/1f4cc.png and /dev/null differ
diff --git a/public/emoji/1f4cc.svg b/public/emoji/1f4cc.svg
index 5403772287..ebc2187e45 100644
--- a/public/emoji/1f4cc.svg
+++ b/public/emoji/1f4cc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4cd.png b/public/emoji/1f4cd.png
deleted file mode 100644
index 28b9d72866..0000000000
Binary files a/public/emoji/1f4cd.png and /dev/null differ
diff --git a/public/emoji/1f4cd.svg b/public/emoji/1f4cd.svg
index fa9f105cf8..e86e5d8edb 100644
--- a/public/emoji/1f4cd.svg
+++ b/public/emoji/1f4cd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4ce.png b/public/emoji/1f4ce.png
deleted file mode 100644
index 8cd8d4f875..0000000000
Binary files a/public/emoji/1f4ce.png and /dev/null differ
diff --git a/public/emoji/1f4ce.svg b/public/emoji/1f4ce.svg
index 47c8d2c6a0..7d2e463ec2 100644
--- a/public/emoji/1f4ce.svg
+++ b/public/emoji/1f4ce.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4cf.png b/public/emoji/1f4cf.png
deleted file mode 100644
index 1017b7433a..0000000000
Binary files a/public/emoji/1f4cf.png and /dev/null differ
diff --git a/public/emoji/1f4cf.svg b/public/emoji/1f4cf.svg
index 3d66c06746..50062de145 100644
--- a/public/emoji/1f4cf.svg
+++ b/public/emoji/1f4cf.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4d0.png b/public/emoji/1f4d0.png
deleted file mode 100644
index 77dee9ee84..0000000000
Binary files a/public/emoji/1f4d0.png and /dev/null differ
diff --git a/public/emoji/1f4d0.svg b/public/emoji/1f4d0.svg
index 5d4c52db9f..08704eacf1 100644
--- a/public/emoji/1f4d0.svg
+++ b/public/emoji/1f4d0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4d1.png b/public/emoji/1f4d1.png
deleted file mode 100644
index f8d9e01b42..0000000000
Binary files a/public/emoji/1f4d1.png and /dev/null differ
diff --git a/public/emoji/1f4d1.svg b/public/emoji/1f4d1.svg
index b0ff586436..573134838e 100644
--- a/public/emoji/1f4d1.svg
+++ b/public/emoji/1f4d1.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4d2.png b/public/emoji/1f4d2.png
deleted file mode 100644
index 13e7561a4b..0000000000
Binary files a/public/emoji/1f4d2.png and /dev/null differ
diff --git a/public/emoji/1f4d2.svg b/public/emoji/1f4d2.svg
index 93fecc88c6..32f4570648 100644
--- a/public/emoji/1f4d2.svg
+++ b/public/emoji/1f4d2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4d3.png b/public/emoji/1f4d3.png
deleted file mode 100644
index f6c28b4915..0000000000
Binary files a/public/emoji/1f4d3.png and /dev/null differ
diff --git a/public/emoji/1f4d3.svg b/public/emoji/1f4d3.svg
index 604ba14e9f..65c7642c2e 100644
--- a/public/emoji/1f4d3.svg
+++ b/public/emoji/1f4d3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4d4.png b/public/emoji/1f4d4.png
deleted file mode 100644
index 03f566b6d2..0000000000
Binary files a/public/emoji/1f4d4.png and /dev/null differ
diff --git a/public/emoji/1f4d4.svg b/public/emoji/1f4d4.svg
index 211f080c97..9f269a7e41 100644
--- a/public/emoji/1f4d4.svg
+++ b/public/emoji/1f4d4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4d5.png b/public/emoji/1f4d5.png
deleted file mode 100644
index 6395cf2151..0000000000
Binary files a/public/emoji/1f4d5.png and /dev/null differ
diff --git a/public/emoji/1f4d5.svg b/public/emoji/1f4d5.svg
index be6b7fa3cc..821ba57432 100644
--- a/public/emoji/1f4d5.svg
+++ b/public/emoji/1f4d5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4d6.png b/public/emoji/1f4d6.png
deleted file mode 100644
index 0f4447ed39..0000000000
Binary files a/public/emoji/1f4d6.png and /dev/null differ
diff --git a/public/emoji/1f4d6.svg b/public/emoji/1f4d6.svg
index 40a387e31f..47e6ccb63f 100644
--- a/public/emoji/1f4d6.svg
+++ b/public/emoji/1f4d6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4d7.png b/public/emoji/1f4d7.png
deleted file mode 100644
index e5e411cf3b..0000000000
Binary files a/public/emoji/1f4d7.png and /dev/null differ
diff --git a/public/emoji/1f4d7.svg b/public/emoji/1f4d7.svg
index 5ef4524b9a..8c5f2c7f78 100644
--- a/public/emoji/1f4d7.svg
+++ b/public/emoji/1f4d7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4d8.png b/public/emoji/1f4d8.png
deleted file mode 100644
index e1e455401c..0000000000
Binary files a/public/emoji/1f4d8.png and /dev/null differ
diff --git a/public/emoji/1f4d8.svg b/public/emoji/1f4d8.svg
index 3e1ba1c8fa..e20be569c9 100644
--- a/public/emoji/1f4d8.svg
+++ b/public/emoji/1f4d8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4d9.png b/public/emoji/1f4d9.png
deleted file mode 100644
index ab40e6ae6a..0000000000
Binary files a/public/emoji/1f4d9.png and /dev/null differ
diff --git a/public/emoji/1f4d9.svg b/public/emoji/1f4d9.svg
index 0758e63e0b..aa9ac8ac7e 100644
--- a/public/emoji/1f4d9.svg
+++ b/public/emoji/1f4d9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4da.png b/public/emoji/1f4da.png
deleted file mode 100644
index 59a8bafeb0..0000000000
Binary files a/public/emoji/1f4da.png and /dev/null differ
diff --git a/public/emoji/1f4da.svg b/public/emoji/1f4da.svg
index 8469d334ed..fd830ccbab 100644
--- a/public/emoji/1f4da.svg
+++ b/public/emoji/1f4da.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4db.png b/public/emoji/1f4db.png
deleted file mode 100644
index ec5ee213e2..0000000000
Binary files a/public/emoji/1f4db.png and /dev/null differ
diff --git a/public/emoji/1f4db.svg b/public/emoji/1f4db.svg
index 616945d2dd..ad86629b79 100644
--- a/public/emoji/1f4db.svg
+++ b/public/emoji/1f4db.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4dc.png b/public/emoji/1f4dc.png
deleted file mode 100644
index 50ee5dcd4b..0000000000
Binary files a/public/emoji/1f4dc.png and /dev/null differ
diff --git a/public/emoji/1f4dc.svg b/public/emoji/1f4dc.svg
index 6b1d35971c..b29dfd1d58 100644
--- a/public/emoji/1f4dc.svg
+++ b/public/emoji/1f4dc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4dd.png b/public/emoji/1f4dd.png
deleted file mode 100644
index edc6155e16..0000000000
Binary files a/public/emoji/1f4dd.png and /dev/null differ
diff --git a/public/emoji/1f4dd.svg b/public/emoji/1f4dd.svg
index 5e6f46c8b1..583017b87d 100644
--- a/public/emoji/1f4dd.svg
+++ b/public/emoji/1f4dd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4de.png b/public/emoji/1f4de.png
deleted file mode 100644
index 69388316c3..0000000000
Binary files a/public/emoji/1f4de.png and /dev/null differ
diff --git a/public/emoji/1f4de.svg b/public/emoji/1f4de.svg
index a4039435d6..e253cab80f 100644
--- a/public/emoji/1f4de.svg
+++ b/public/emoji/1f4de.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4df.png b/public/emoji/1f4df.png
deleted file mode 100644
index b24b99306a..0000000000
Binary files a/public/emoji/1f4df.png and /dev/null differ
diff --git a/public/emoji/1f4df.svg b/public/emoji/1f4df.svg
index a46aa37d0d..f8a0609f8d 100644
--- a/public/emoji/1f4df.svg
+++ b/public/emoji/1f4df.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4e0.png b/public/emoji/1f4e0.png
deleted file mode 100644
index 6f929e294c..0000000000
Binary files a/public/emoji/1f4e0.png and /dev/null differ
diff --git a/public/emoji/1f4e0.svg b/public/emoji/1f4e0.svg
index 7e52dbfd0e..cf9dfd4f14 100644
--- a/public/emoji/1f4e0.svg
+++ b/public/emoji/1f4e0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4e1.png b/public/emoji/1f4e1.png
deleted file mode 100644
index db0372795f..0000000000
Binary files a/public/emoji/1f4e1.png and /dev/null differ
diff --git a/public/emoji/1f4e1.svg b/public/emoji/1f4e1.svg
index f15cb8a0e3..e345be12db 100644
--- a/public/emoji/1f4e1.svg
+++ b/public/emoji/1f4e1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4e2.png b/public/emoji/1f4e2.png
deleted file mode 100644
index 5fd76a95b8..0000000000
Binary files a/public/emoji/1f4e2.png and /dev/null differ
diff --git a/public/emoji/1f4e2.svg b/public/emoji/1f4e2.svg
index 44179fefca..e6250d2bf3 100644
--- a/public/emoji/1f4e2.svg
+++ b/public/emoji/1f4e2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4e3.png b/public/emoji/1f4e3.png
deleted file mode 100644
index 4e6735188e..0000000000
Binary files a/public/emoji/1f4e3.png and /dev/null differ
diff --git a/public/emoji/1f4e3.svg b/public/emoji/1f4e3.svg
index 0967abab91..e217cdaf27 100644
--- a/public/emoji/1f4e3.svg
+++ b/public/emoji/1f4e3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4e4.png b/public/emoji/1f4e4.png
deleted file mode 100644
index 46493ed5b2..0000000000
Binary files a/public/emoji/1f4e4.png and /dev/null differ
diff --git a/public/emoji/1f4e4.svg b/public/emoji/1f4e4.svg
index b7b006630a..69fce0a9ba 100644
--- a/public/emoji/1f4e4.svg
+++ b/public/emoji/1f4e4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4e5.png b/public/emoji/1f4e5.png
deleted file mode 100644
index 41a6be2b0e..0000000000
Binary files a/public/emoji/1f4e5.png and /dev/null differ
diff --git a/public/emoji/1f4e5.svg b/public/emoji/1f4e5.svg
index 75df61a63b..10c940b95d 100644
--- a/public/emoji/1f4e5.svg
+++ b/public/emoji/1f4e5.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4e6.png b/public/emoji/1f4e6.png
deleted file mode 100644
index 85431756ad..0000000000
Binary files a/public/emoji/1f4e6.png and /dev/null differ
diff --git a/public/emoji/1f4e6.svg b/public/emoji/1f4e6.svg
index 95182fd1bf..d0b8d6d1d4 100644
--- a/public/emoji/1f4e6.svg
+++ b/public/emoji/1f4e6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4e7.png b/public/emoji/1f4e7.png
deleted file mode 100644
index d22e654a20..0000000000
Binary files a/public/emoji/1f4e7.png and /dev/null differ
diff --git a/public/emoji/1f4e7.svg b/public/emoji/1f4e7.svg
index c296f50704..60b6967621 100644
--- a/public/emoji/1f4e7.svg
+++ b/public/emoji/1f4e7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4e8.png b/public/emoji/1f4e8.png
deleted file mode 100644
index fd22e88182..0000000000
Binary files a/public/emoji/1f4e8.png and /dev/null differ
diff --git a/public/emoji/1f4e8.svg b/public/emoji/1f4e8.svg
index 694c04ee94..d2379e22af 100644
--- a/public/emoji/1f4e8.svg
+++ b/public/emoji/1f4e8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4e9.png b/public/emoji/1f4e9.png
deleted file mode 100644
index 7448a6b767..0000000000
Binary files a/public/emoji/1f4e9.png and /dev/null differ
diff --git a/public/emoji/1f4e9.svg b/public/emoji/1f4e9.svg
index 2e5dd66c45..bde5374d42 100644
--- a/public/emoji/1f4e9.svg
+++ b/public/emoji/1f4e9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4ea.png b/public/emoji/1f4ea.png
deleted file mode 100644
index ddc705db0d..0000000000
Binary files a/public/emoji/1f4ea.png and /dev/null differ
diff --git a/public/emoji/1f4ea.svg b/public/emoji/1f4ea.svg
index b825c02f22..6c7e0d1145 100644
--- a/public/emoji/1f4ea.svg
+++ b/public/emoji/1f4ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4eb.png b/public/emoji/1f4eb.png
deleted file mode 100644
index ef5174e40d..0000000000
Binary files a/public/emoji/1f4eb.png and /dev/null differ
diff --git a/public/emoji/1f4eb.svg b/public/emoji/1f4eb.svg
index fcd20da499..a48e2210e5 100644
--- a/public/emoji/1f4eb.svg
+++ b/public/emoji/1f4eb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4ec.png b/public/emoji/1f4ec.png
deleted file mode 100644
index 5460616a5b..0000000000
Binary files a/public/emoji/1f4ec.png and /dev/null differ
diff --git a/public/emoji/1f4ec.svg b/public/emoji/1f4ec.svg
index 2393774c73..0ebfec4c59 100644
--- a/public/emoji/1f4ec.svg
+++ b/public/emoji/1f4ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4ed.png b/public/emoji/1f4ed.png
deleted file mode 100644
index f9aeee6b15..0000000000
Binary files a/public/emoji/1f4ed.png and /dev/null differ
diff --git a/public/emoji/1f4ed.svg b/public/emoji/1f4ed.svg
index c4fddbace2..ebecab75e0 100644
--- a/public/emoji/1f4ed.svg
+++ b/public/emoji/1f4ed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4ee.png b/public/emoji/1f4ee.png
deleted file mode 100644
index 07c9c4ab3d..0000000000
Binary files a/public/emoji/1f4ee.png and /dev/null differ
diff --git a/public/emoji/1f4ee.svg b/public/emoji/1f4ee.svg
index 2c53c56e2b..4806b51ff8 100644
--- a/public/emoji/1f4ee.svg
+++ b/public/emoji/1f4ee.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4ef.png b/public/emoji/1f4ef.png
deleted file mode 100644
index c173b8dbd6..0000000000
Binary files a/public/emoji/1f4ef.png and /dev/null differ
diff --git a/public/emoji/1f4ef.svg b/public/emoji/1f4ef.svg
index 6ead0b07b4..e60c3067e4 100644
--- a/public/emoji/1f4ef.svg
+++ b/public/emoji/1f4ef.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4f0.png b/public/emoji/1f4f0.png
deleted file mode 100644
index 2aa8f060bd..0000000000
Binary files a/public/emoji/1f4f0.png and /dev/null differ
diff --git a/public/emoji/1f4f0.svg b/public/emoji/1f4f0.svg
index 51f9f85a07..d5a70ea3c8 100644
--- a/public/emoji/1f4f0.svg
+++ b/public/emoji/1f4f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4f1.png b/public/emoji/1f4f1.png
deleted file mode 100644
index fd377acf87..0000000000
Binary files a/public/emoji/1f4f1.png and /dev/null differ
diff --git a/public/emoji/1f4f1.svg b/public/emoji/1f4f1.svg
index bbb0684ac5..e0387a1c4a 100644
--- a/public/emoji/1f4f1.svg
+++ b/public/emoji/1f4f1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4f2.png b/public/emoji/1f4f2.png
deleted file mode 100644
index e2f308f8e4..0000000000
Binary files a/public/emoji/1f4f2.png and /dev/null differ
diff --git a/public/emoji/1f4f2.svg b/public/emoji/1f4f2.svg
index 9f323e496f..95437b263d 100644
--- a/public/emoji/1f4f2.svg
+++ b/public/emoji/1f4f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4f3.png b/public/emoji/1f4f3.png
deleted file mode 100644
index cc46510e48..0000000000
Binary files a/public/emoji/1f4f3.png and /dev/null differ
diff --git a/public/emoji/1f4f3.svg b/public/emoji/1f4f3.svg
index 7f2e947b18..5c2e1a4f50 100644
--- a/public/emoji/1f4f3.svg
+++ b/public/emoji/1f4f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4f4.png b/public/emoji/1f4f4.png
deleted file mode 100644
index 8b661ec1c9..0000000000
Binary files a/public/emoji/1f4f4.png and /dev/null differ
diff --git a/public/emoji/1f4f4.svg b/public/emoji/1f4f4.svg
index 3f7fd7f152..5dc3755689 100644
--- a/public/emoji/1f4f4.svg
+++ b/public/emoji/1f4f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4f5.png b/public/emoji/1f4f5.png
deleted file mode 100644
index 7b1ae6ea57..0000000000
Binary files a/public/emoji/1f4f5.png and /dev/null differ
diff --git a/public/emoji/1f4f5.svg b/public/emoji/1f4f5.svg
index dfeb0985c8..86b5a5df38 100644
--- a/public/emoji/1f4f5.svg
+++ b/public/emoji/1f4f5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4f6.png b/public/emoji/1f4f6.png
deleted file mode 100644
index ee2b5a4b51..0000000000
Binary files a/public/emoji/1f4f6.png and /dev/null differ
diff --git a/public/emoji/1f4f6.svg b/public/emoji/1f4f6.svg
index f6033621b0..b9eee1d413 100644
--- a/public/emoji/1f4f6.svg
+++ b/public/emoji/1f4f6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4f7.png b/public/emoji/1f4f7.png
deleted file mode 100644
index 0a3429f72e..0000000000
Binary files a/public/emoji/1f4f7.png and /dev/null differ
diff --git a/public/emoji/1f4f7.svg b/public/emoji/1f4f7.svg
index ed7884b415..6cc2096bee 100644
--- a/public/emoji/1f4f7.svg
+++ b/public/emoji/1f4f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4f8.png b/public/emoji/1f4f8.png
deleted file mode 100644
index 27471da202..0000000000
Binary files a/public/emoji/1f4f8.png and /dev/null differ
diff --git a/public/emoji/1f4f8.svg b/public/emoji/1f4f8.svg
index 7814bdd929..e9f242d9e6 100644
--- a/public/emoji/1f4f8.svg
+++ b/public/emoji/1f4f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4f9.png b/public/emoji/1f4f9.png
deleted file mode 100644
index 85b300d425..0000000000
Binary files a/public/emoji/1f4f9.png and /dev/null differ
diff --git a/public/emoji/1f4f9.svg b/public/emoji/1f4f9.svg
index 8c71d01a14..c279f12e93 100644
--- a/public/emoji/1f4f9.svg
+++ b/public/emoji/1f4f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4fa.png b/public/emoji/1f4fa.png
deleted file mode 100644
index 999f1fb5c6..0000000000
Binary files a/public/emoji/1f4fa.png and /dev/null differ
diff --git a/public/emoji/1f4fa.svg b/public/emoji/1f4fa.svg
index 3d446fd6e7..b967aef26a 100644
--- a/public/emoji/1f4fa.svg
+++ b/public/emoji/1f4fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4fb.png b/public/emoji/1f4fb.png
deleted file mode 100644
index dec381fa24..0000000000
Binary files a/public/emoji/1f4fb.png and /dev/null differ
diff --git a/public/emoji/1f4fb.svg b/public/emoji/1f4fb.svg
index 4a7bff1725..88b7b95181 100644
--- a/public/emoji/1f4fb.svg
+++ b/public/emoji/1f4fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4fc.png b/public/emoji/1f4fc.png
deleted file mode 100644
index b9eb78ecd9..0000000000
Binary files a/public/emoji/1f4fc.png and /dev/null differ
diff --git a/public/emoji/1f4fc.svg b/public/emoji/1f4fc.svg
index 6b1e3d0c26..991e95f54b 100644
--- a/public/emoji/1f4fc.svg
+++ b/public/emoji/1f4fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4fd.png b/public/emoji/1f4fd.png
deleted file mode 100644
index ce9ab0daa2..0000000000
Binary files a/public/emoji/1f4fd.png and /dev/null differ
diff --git a/public/emoji/1f4fd.svg b/public/emoji/1f4fd.svg
index a440cbfe49..922c71b8d1 100644
--- a/public/emoji/1f4fd.svg
+++ b/public/emoji/1f4fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f4ff.png b/public/emoji/1f4ff.png
deleted file mode 100644
index a4b6dfcc62..0000000000
Binary files a/public/emoji/1f4ff.png and /dev/null differ
diff --git a/public/emoji/1f4ff.svg b/public/emoji/1f4ff.svg
index 1fa2a4abf0..b5adfabe4b 100644
--- a/public/emoji/1f4ff.svg
+++ b/public/emoji/1f4ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f500.png b/public/emoji/1f500.png
deleted file mode 100644
index 5904badde6..0000000000
Binary files a/public/emoji/1f500.png and /dev/null differ
diff --git a/public/emoji/1f500.svg b/public/emoji/1f500.svg
index 81a5389c75..25b1bf27b5 100644
--- a/public/emoji/1f500.svg
+++ b/public/emoji/1f500.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f501.png b/public/emoji/1f501.png
deleted file mode 100644
index 540ce4e0fb..0000000000
Binary files a/public/emoji/1f501.png and /dev/null differ
diff --git a/public/emoji/1f501.svg b/public/emoji/1f501.svg
index fccd8243cf..2b59af7c2f 100644
--- a/public/emoji/1f501.svg
+++ b/public/emoji/1f501.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f502.png b/public/emoji/1f502.png
deleted file mode 100644
index 9567e83337..0000000000
Binary files a/public/emoji/1f502.png and /dev/null differ
diff --git a/public/emoji/1f502.svg b/public/emoji/1f502.svg
index 3372590bd8..7ab33b25f2 100644
--- a/public/emoji/1f502.svg
+++ b/public/emoji/1f502.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f503.png b/public/emoji/1f503.png
deleted file mode 100644
index 26e49c3838..0000000000
Binary files a/public/emoji/1f503.png and /dev/null differ
diff --git a/public/emoji/1f503.svg b/public/emoji/1f503.svg
index 3aa0d63ba6..716355f635 100644
--- a/public/emoji/1f503.svg
+++ b/public/emoji/1f503.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f504.png b/public/emoji/1f504.png
deleted file mode 100644
index 8d06d8e091..0000000000
Binary files a/public/emoji/1f504.png and /dev/null differ
diff --git a/public/emoji/1f504.svg b/public/emoji/1f504.svg
index 2eefda0d3f..61b0c0459f 100644
--- a/public/emoji/1f504.svg
+++ b/public/emoji/1f504.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f505.png b/public/emoji/1f505.png
deleted file mode 100644
index 543011d396..0000000000
Binary files a/public/emoji/1f505.png and /dev/null differ
diff --git a/public/emoji/1f505.svg b/public/emoji/1f505.svg
index 206610ecf2..0609962794 100644
--- a/public/emoji/1f505.svg
+++ b/public/emoji/1f505.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f506.png b/public/emoji/1f506.png
deleted file mode 100644
index c41f2d5fd5..0000000000
Binary files a/public/emoji/1f506.png and /dev/null differ
diff --git a/public/emoji/1f506.svg b/public/emoji/1f506.svg
index dc65b9a6d6..251d4ffa7a 100644
--- a/public/emoji/1f506.svg
+++ b/public/emoji/1f506.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f507.png b/public/emoji/1f507.png
deleted file mode 100644
index 7c1788e507..0000000000
Binary files a/public/emoji/1f507.png and /dev/null differ
diff --git a/public/emoji/1f507.svg b/public/emoji/1f507.svg
index 4d10ceb248..9dc1fe9037 100644
--- a/public/emoji/1f507.svg
+++ b/public/emoji/1f507.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f508.png b/public/emoji/1f508.png
deleted file mode 100644
index 7bcffb8fc4..0000000000
Binary files a/public/emoji/1f508.png and /dev/null differ
diff --git a/public/emoji/1f508.svg b/public/emoji/1f508.svg
index 9eac4a0d00..33b12bddad 100644
--- a/public/emoji/1f508.svg
+++ b/public/emoji/1f508.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f509.png b/public/emoji/1f509.png
deleted file mode 100644
index e75ddca53b..0000000000
Binary files a/public/emoji/1f509.png and /dev/null differ
diff --git a/public/emoji/1f509.svg b/public/emoji/1f509.svg
index 5460d8e986..7566b83e8d 100644
--- a/public/emoji/1f509.svg
+++ b/public/emoji/1f509.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f50a.png b/public/emoji/1f50a.png
deleted file mode 100644
index 8370033a53..0000000000
Binary files a/public/emoji/1f50a.png and /dev/null differ
diff --git a/public/emoji/1f50a.svg b/public/emoji/1f50a.svg
index eb2e94c838..8614d3e92a 100644
--- a/public/emoji/1f50a.svg
+++ b/public/emoji/1f50a.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f50b.png b/public/emoji/1f50b.png
deleted file mode 100644
index f593e2bdb6..0000000000
Binary files a/public/emoji/1f50b.png and /dev/null differ
diff --git a/public/emoji/1f50b.svg b/public/emoji/1f50b.svg
index 370d5cfe0b..d8b375c150 100644
--- a/public/emoji/1f50b.svg
+++ b/public/emoji/1f50b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f50c.png b/public/emoji/1f50c.png
deleted file mode 100644
index 31d1eb215b..0000000000
Binary files a/public/emoji/1f50c.png and /dev/null differ
diff --git a/public/emoji/1f50c.svg b/public/emoji/1f50c.svg
index bbbcf0a5a5..d3ecea9ab8 100644
--- a/public/emoji/1f50c.svg
+++ b/public/emoji/1f50c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f50d.png b/public/emoji/1f50d.png
deleted file mode 100644
index 55487156ac..0000000000
Binary files a/public/emoji/1f50d.png and /dev/null differ
diff --git a/public/emoji/1f50d.svg b/public/emoji/1f50d.svg
index 7f1758d676..098d5e0818 100644
--- a/public/emoji/1f50d.svg
+++ b/public/emoji/1f50d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f50e.png b/public/emoji/1f50e.png
deleted file mode 100644
index 0f4b1bca87..0000000000
Binary files a/public/emoji/1f50e.png and /dev/null differ
diff --git a/public/emoji/1f50e.svg b/public/emoji/1f50e.svg
index a60c2aa113..22c9309059 100644
--- a/public/emoji/1f50e.svg
+++ b/public/emoji/1f50e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f50f.png b/public/emoji/1f50f.png
deleted file mode 100644
index 19a07d162f..0000000000
Binary files a/public/emoji/1f50f.png and /dev/null differ
diff --git a/public/emoji/1f50f.svg b/public/emoji/1f50f.svg
index eb3c3fb477..a6fbfdbf14 100644
--- a/public/emoji/1f50f.svg
+++ b/public/emoji/1f50f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f510.png b/public/emoji/1f510.png
deleted file mode 100644
index 1c1cd5d074..0000000000
Binary files a/public/emoji/1f510.png and /dev/null differ
diff --git a/public/emoji/1f510.svg b/public/emoji/1f510.svg
index 2d9a97df66..0f9f441bfb 100644
--- a/public/emoji/1f510.svg
+++ b/public/emoji/1f510.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f511.png b/public/emoji/1f511.png
deleted file mode 100644
index 319cd1b884..0000000000
Binary files a/public/emoji/1f511.png and /dev/null differ
diff --git a/public/emoji/1f511.svg b/public/emoji/1f511.svg
index 74b38d18c4..9a720cdf4c 100644
--- a/public/emoji/1f511.svg
+++ b/public/emoji/1f511.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f512.png b/public/emoji/1f512.png
deleted file mode 100644
index 5a739c4664..0000000000
Binary files a/public/emoji/1f512.png and /dev/null differ
diff --git a/public/emoji/1f512.svg b/public/emoji/1f512.svg
index fac55a2f0b..f0f1bb1534 100644
--- a/public/emoji/1f512.svg
+++ b/public/emoji/1f512.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f513.png b/public/emoji/1f513.png
deleted file mode 100644
index 4a74a69391..0000000000
Binary files a/public/emoji/1f513.png and /dev/null differ
diff --git a/public/emoji/1f513.svg b/public/emoji/1f513.svg
index 4d650b67e4..4333237220 100644
--- a/public/emoji/1f513.svg
+++ b/public/emoji/1f513.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f514.png b/public/emoji/1f514.png
deleted file mode 100644
index 5b3b046199..0000000000
Binary files a/public/emoji/1f514.png and /dev/null differ
diff --git a/public/emoji/1f514.svg b/public/emoji/1f514.svg
index e64706564c..5210eece67 100644
--- a/public/emoji/1f514.svg
+++ b/public/emoji/1f514.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f515.png b/public/emoji/1f515.png
deleted file mode 100644
index 15cb38dd1e..0000000000
Binary files a/public/emoji/1f515.png and /dev/null differ
diff --git a/public/emoji/1f515.svg b/public/emoji/1f515.svg
index a37acaff3b..f9cd1368bd 100644
--- a/public/emoji/1f515.svg
+++ b/public/emoji/1f515.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f516.png b/public/emoji/1f516.png
deleted file mode 100644
index bbb444611f..0000000000
Binary files a/public/emoji/1f516.png and /dev/null differ
diff --git a/public/emoji/1f516.svg b/public/emoji/1f516.svg
index 555079664e..a8baaeb5c6 100644
--- a/public/emoji/1f516.svg
+++ b/public/emoji/1f516.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f517.png b/public/emoji/1f517.png
deleted file mode 100644
index ae20f0f8ee..0000000000
Binary files a/public/emoji/1f517.png and /dev/null differ
diff --git a/public/emoji/1f517.svg b/public/emoji/1f517.svg
index 777545a172..f34d202583 100644
--- a/public/emoji/1f517.svg
+++ b/public/emoji/1f517.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f518.png b/public/emoji/1f518.png
deleted file mode 100644
index 3a23449d91..0000000000
Binary files a/public/emoji/1f518.png and /dev/null differ
diff --git a/public/emoji/1f518.svg b/public/emoji/1f518.svg
index a894198e86..aa5d9a4290 100644
--- a/public/emoji/1f518.svg
+++ b/public/emoji/1f518.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f519.png b/public/emoji/1f519.png
deleted file mode 100644
index d32c5d4f17..0000000000
Binary files a/public/emoji/1f519.png and /dev/null differ
diff --git a/public/emoji/1f519.svg b/public/emoji/1f519.svg
index b8fe574e26..d723bae402 100644
--- a/public/emoji/1f519.svg
+++ b/public/emoji/1f519.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f51a.png b/public/emoji/1f51a.png
deleted file mode 100644
index ef3ccd5f36..0000000000
Binary files a/public/emoji/1f51a.png and /dev/null differ
diff --git a/public/emoji/1f51a.svg b/public/emoji/1f51a.svg
index 1925646d18..27825d360c 100644
--- a/public/emoji/1f51a.svg
+++ b/public/emoji/1f51a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f51b.png b/public/emoji/1f51b.png
deleted file mode 100644
index a0c371ae21..0000000000
Binary files a/public/emoji/1f51b.png and /dev/null differ
diff --git a/public/emoji/1f51b.svg b/public/emoji/1f51b.svg
index f9bb3d8332..8e41094fef 100644
--- a/public/emoji/1f51b.svg
+++ b/public/emoji/1f51b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f51c.png b/public/emoji/1f51c.png
deleted file mode 100644
index 8cdfd86690..0000000000
Binary files a/public/emoji/1f51c.png and /dev/null differ
diff --git a/public/emoji/1f51c.svg b/public/emoji/1f51c.svg
index 62c2ffb2f7..9e308a4668 100644
--- a/public/emoji/1f51c.svg
+++ b/public/emoji/1f51c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f51d.png b/public/emoji/1f51d.png
deleted file mode 100644
index 49dea8c08b..0000000000
Binary files a/public/emoji/1f51d.png and /dev/null differ
diff --git a/public/emoji/1f51d.svg b/public/emoji/1f51d.svg
index cc4db6763d..0fc2ed653a 100644
--- a/public/emoji/1f51d.svg
+++ b/public/emoji/1f51d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f51e.png b/public/emoji/1f51e.png
deleted file mode 100644
index 6dfe6da51e..0000000000
Binary files a/public/emoji/1f51e.png and /dev/null differ
diff --git a/public/emoji/1f51e.svg b/public/emoji/1f51e.svg
index 19ac9d2bd2..8a7bd20173 100644
--- a/public/emoji/1f51e.svg
+++ b/public/emoji/1f51e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f51f.png b/public/emoji/1f51f.png
deleted file mode 100644
index 782d400496..0000000000
Binary files a/public/emoji/1f51f.png and /dev/null differ
diff --git a/public/emoji/1f51f.svg b/public/emoji/1f51f.svg
index f717fa7f06..40d2560e35 100644
--- a/public/emoji/1f51f.svg
+++ b/public/emoji/1f51f.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f520.png b/public/emoji/1f520.png
deleted file mode 100644
index fe9482d2d8..0000000000
Binary files a/public/emoji/1f520.png and /dev/null differ
diff --git a/public/emoji/1f520.svg b/public/emoji/1f520.svg
index 04d626dcd0..6771c23285 100644
--- a/public/emoji/1f520.svg
+++ b/public/emoji/1f520.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f521.png b/public/emoji/1f521.png
deleted file mode 100644
index 0996a87057..0000000000
Binary files a/public/emoji/1f521.png and /dev/null differ
diff --git a/public/emoji/1f521.svg b/public/emoji/1f521.svg
index a127d19343..4cc64b9e7b 100644
--- a/public/emoji/1f521.svg
+++ b/public/emoji/1f521.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f522.png b/public/emoji/1f522.png
deleted file mode 100644
index 248dc7e55b..0000000000
Binary files a/public/emoji/1f522.png and /dev/null differ
diff --git a/public/emoji/1f522.svg b/public/emoji/1f522.svg
index 5710ed9718..75de7d6daa 100644
--- a/public/emoji/1f522.svg
+++ b/public/emoji/1f522.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f523.png b/public/emoji/1f523.png
deleted file mode 100644
index ac2fc1f358..0000000000
Binary files a/public/emoji/1f523.png and /dev/null differ
diff --git a/public/emoji/1f523.svg b/public/emoji/1f523.svg
index 7de6af1d7d..c30182b501 100644
--- a/public/emoji/1f523.svg
+++ b/public/emoji/1f523.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f524.png b/public/emoji/1f524.png
deleted file mode 100644
index 7688de692a..0000000000
Binary files a/public/emoji/1f524.png and /dev/null differ
diff --git a/public/emoji/1f524.svg b/public/emoji/1f524.svg
index 236a41ce9b..6f9f763f02 100644
--- a/public/emoji/1f524.svg
+++ b/public/emoji/1f524.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f525.png b/public/emoji/1f525.png
deleted file mode 100644
index bd3775a460..0000000000
Binary files a/public/emoji/1f525.png and /dev/null differ
diff --git a/public/emoji/1f525.svg b/public/emoji/1f525.svg
index 23dd30a75d..4c5a36a6f1 100644
--- a/public/emoji/1f525.svg
+++ b/public/emoji/1f525.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f526.png b/public/emoji/1f526.png
deleted file mode 100644
index eee36c2506..0000000000
Binary files a/public/emoji/1f526.png and /dev/null differ
diff --git a/public/emoji/1f526.svg b/public/emoji/1f526.svg
index 1d9dcdfdf9..f934e9d5cc 100644
--- a/public/emoji/1f526.svg
+++ b/public/emoji/1f526.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f527.png b/public/emoji/1f527.png
deleted file mode 100644
index c16b743969..0000000000
Binary files a/public/emoji/1f527.png and /dev/null differ
diff --git a/public/emoji/1f527.svg b/public/emoji/1f527.svg
index 5ca5cf38e2..26775fd0a5 100644
--- a/public/emoji/1f527.svg
+++ b/public/emoji/1f527.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f528.png b/public/emoji/1f528.png
deleted file mode 100644
index 00736cce47..0000000000
Binary files a/public/emoji/1f528.png and /dev/null differ
diff --git a/public/emoji/1f528.svg b/public/emoji/1f528.svg
index 0285e2d1a5..d506977e1c 100644
--- a/public/emoji/1f528.svg
+++ b/public/emoji/1f528.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f529.png b/public/emoji/1f529.png
deleted file mode 100644
index 4b9ae15531..0000000000
Binary files a/public/emoji/1f529.png and /dev/null differ
diff --git a/public/emoji/1f529.svg b/public/emoji/1f529.svg
index b43444715b..3da1ee7381 100644
--- a/public/emoji/1f529.svg
+++ b/public/emoji/1f529.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f52a.png b/public/emoji/1f52a.png
deleted file mode 100644
index 1acb9f3077..0000000000
Binary files a/public/emoji/1f52a.png and /dev/null differ
diff --git a/public/emoji/1f52a.svg b/public/emoji/1f52a.svg
index cbf2319491..d260eaf875 100644
--- a/public/emoji/1f52a.svg
+++ b/public/emoji/1f52a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f52b.png b/public/emoji/1f52b.png
deleted file mode 100644
index 89c5c244c7..0000000000
Binary files a/public/emoji/1f52b.png and /dev/null differ
diff --git a/public/emoji/1f52b.svg b/public/emoji/1f52b.svg
index 7ce6a43f1d..fa4e11d882 100644
--- a/public/emoji/1f52b.svg
+++ b/public/emoji/1f52b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f52c.png b/public/emoji/1f52c.png
deleted file mode 100644
index 90f5acf6a7..0000000000
Binary files a/public/emoji/1f52c.png and /dev/null differ
diff --git a/public/emoji/1f52c.svg b/public/emoji/1f52c.svg
index 149eb3797b..511a102e26 100644
--- a/public/emoji/1f52c.svg
+++ b/public/emoji/1f52c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f52d.png b/public/emoji/1f52d.png
deleted file mode 100644
index d63154614b..0000000000
Binary files a/public/emoji/1f52d.png and /dev/null differ
diff --git a/public/emoji/1f52d.svg b/public/emoji/1f52d.svg
index e4dc0106eb..67df6ece7d 100644
--- a/public/emoji/1f52d.svg
+++ b/public/emoji/1f52d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f52e.png b/public/emoji/1f52e.png
deleted file mode 100644
index 485d5c888f..0000000000
Binary files a/public/emoji/1f52e.png and /dev/null differ
diff --git a/public/emoji/1f52e.svg b/public/emoji/1f52e.svg
index 72eff081e1..1fbcefcb9f 100644
--- a/public/emoji/1f52e.svg
+++ b/public/emoji/1f52e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f52f.png b/public/emoji/1f52f.png
deleted file mode 100644
index 2eb1707458..0000000000
Binary files a/public/emoji/1f52f.png and /dev/null differ
diff --git a/public/emoji/1f52f.svg b/public/emoji/1f52f.svg
index 5783decc39..e31b3e04c4 100644
--- a/public/emoji/1f52f.svg
+++ b/public/emoji/1f52f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f530.png b/public/emoji/1f530.png
deleted file mode 100644
index bc434fb7cb..0000000000
Binary files a/public/emoji/1f530.png and /dev/null differ
diff --git a/public/emoji/1f530.svg b/public/emoji/1f530.svg
index b0677aae78..8ed169ae58 100644
--- a/public/emoji/1f530.svg
+++ b/public/emoji/1f530.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f531.png b/public/emoji/1f531.png
deleted file mode 100644
index 777a1dad12..0000000000
Binary files a/public/emoji/1f531.png and /dev/null differ
diff --git a/public/emoji/1f531.svg b/public/emoji/1f531.svg
index 09cb93cd89..ded2962712 100644
--- a/public/emoji/1f531.svg
+++ b/public/emoji/1f531.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f532.png b/public/emoji/1f532.png
deleted file mode 100644
index a78fc2f6b6..0000000000
Binary files a/public/emoji/1f532.png and /dev/null differ
diff --git a/public/emoji/1f532.svg b/public/emoji/1f532.svg
index 4234050bae..8d17e17576 100644
--- a/public/emoji/1f532.svg
+++ b/public/emoji/1f532.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f533.png b/public/emoji/1f533.png
deleted file mode 100644
index 934b1cedfd..0000000000
Binary files a/public/emoji/1f533.png and /dev/null differ
diff --git a/public/emoji/1f533.svg b/public/emoji/1f533.svg
index 478b8cde77..485afa9208 100644
--- a/public/emoji/1f533.svg
+++ b/public/emoji/1f533.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f534.png b/public/emoji/1f534.png
deleted file mode 100644
index 4bef930d92..0000000000
Binary files a/public/emoji/1f534.png and /dev/null differ
diff --git a/public/emoji/1f534.svg b/public/emoji/1f534.svg
index a8ac9f77dc..fe221ca004 100644
--- a/public/emoji/1f534.svg
+++ b/public/emoji/1f534.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f535.png b/public/emoji/1f535.png
deleted file mode 100644
index 84078ef312..0000000000
Binary files a/public/emoji/1f535.png and /dev/null differ
diff --git a/public/emoji/1f535.svg b/public/emoji/1f535.svg
index 3df8731d3b..fc3f6e9a00 100644
--- a/public/emoji/1f535.svg
+++ b/public/emoji/1f535.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f536.png b/public/emoji/1f536.png
deleted file mode 100644
index 73ff0ac36c..0000000000
Binary files a/public/emoji/1f536.png and /dev/null differ
diff --git a/public/emoji/1f536.svg b/public/emoji/1f536.svg
index 351f0db4e5..fdcbdce96f 100644
--- a/public/emoji/1f536.svg
+++ b/public/emoji/1f536.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f537.png b/public/emoji/1f537.png
deleted file mode 100644
index 416a58bd5a..0000000000
Binary files a/public/emoji/1f537.png and /dev/null differ
diff --git a/public/emoji/1f537.svg b/public/emoji/1f537.svg
index 2d35144486..3ef69732f4 100644
--- a/public/emoji/1f537.svg
+++ b/public/emoji/1f537.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f538.png b/public/emoji/1f538.png
deleted file mode 100644
index e1c6ed9b2f..0000000000
Binary files a/public/emoji/1f538.png and /dev/null differ
diff --git a/public/emoji/1f538.svg b/public/emoji/1f538.svg
index 10ba0449aa..7b78e0bd82 100644
--- a/public/emoji/1f538.svg
+++ b/public/emoji/1f538.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f539.png b/public/emoji/1f539.png
deleted file mode 100644
index b86b5bc4db..0000000000
Binary files a/public/emoji/1f539.png and /dev/null differ
diff --git a/public/emoji/1f539.svg b/public/emoji/1f539.svg
index 344ca59560..9798bdd624 100644
--- a/public/emoji/1f539.svg
+++ b/public/emoji/1f539.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f53a.png b/public/emoji/1f53a.png
deleted file mode 100644
index 785887c195..0000000000
Binary files a/public/emoji/1f53a.png and /dev/null differ
diff --git a/public/emoji/1f53a.svg b/public/emoji/1f53a.svg
index 321041237a..11a872d9e4 100644
--- a/public/emoji/1f53a.svg
+++ b/public/emoji/1f53a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f53b.png b/public/emoji/1f53b.png
deleted file mode 100644
index a83beff191..0000000000
Binary files a/public/emoji/1f53b.png and /dev/null differ
diff --git a/public/emoji/1f53b.svg b/public/emoji/1f53b.svg
index 57d6ad4676..2e6655267e 100644
--- a/public/emoji/1f53b.svg
+++ b/public/emoji/1f53b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f53c.png b/public/emoji/1f53c.png
deleted file mode 100644
index 20a13dcd5c..0000000000
Binary files a/public/emoji/1f53c.png and /dev/null differ
diff --git a/public/emoji/1f53c.svg b/public/emoji/1f53c.svg
index 6836e6e049..08d218b67e 100644
--- a/public/emoji/1f53c.svg
+++ b/public/emoji/1f53c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f53d.png b/public/emoji/1f53d.png
deleted file mode 100644
index 5870b9a224..0000000000
Binary files a/public/emoji/1f53d.png and /dev/null differ
diff --git a/public/emoji/1f53d.svg b/public/emoji/1f53d.svg
index a624cea78e..47ef8e021a 100644
--- a/public/emoji/1f53d.svg
+++ b/public/emoji/1f53d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f549.png b/public/emoji/1f549.png
deleted file mode 100644
index a35c63c459..0000000000
Binary files a/public/emoji/1f549.png and /dev/null differ
diff --git a/public/emoji/1f549.svg b/public/emoji/1f549.svg
index f068cd7397..cb310e3627 100644
--- a/public/emoji/1f549.svg
+++ b/public/emoji/1f549.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f54a.png b/public/emoji/1f54a.png
deleted file mode 100644
index 9580c4917d..0000000000
Binary files a/public/emoji/1f54a.png and /dev/null differ
diff --git a/public/emoji/1f54a.svg b/public/emoji/1f54a.svg
index 37fa3aaf1b..ac560ea662 100644
--- a/public/emoji/1f54a.svg
+++ b/public/emoji/1f54a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f54b.png b/public/emoji/1f54b.png
deleted file mode 100644
index 1778c1138e..0000000000
Binary files a/public/emoji/1f54b.png and /dev/null differ
diff --git a/public/emoji/1f54b.svg b/public/emoji/1f54b.svg
index 687e4d776a..92bc70f83a 100644
--- a/public/emoji/1f54b.svg
+++ b/public/emoji/1f54b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f54c.png b/public/emoji/1f54c.png
deleted file mode 100644
index ef770b26d9..0000000000
Binary files a/public/emoji/1f54c.png and /dev/null differ
diff --git a/public/emoji/1f54c.svg b/public/emoji/1f54c.svg
index 071b498d39..446c3c6f11 100644
--- a/public/emoji/1f54c.svg
+++ b/public/emoji/1f54c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f54d.png b/public/emoji/1f54d.png
deleted file mode 100644
index ee347904c8..0000000000
Binary files a/public/emoji/1f54d.png and /dev/null differ
diff --git a/public/emoji/1f54d.svg b/public/emoji/1f54d.svg
index e334855070..5f33b368b0 100644
--- a/public/emoji/1f54d.svg
+++ b/public/emoji/1f54d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f54e.png b/public/emoji/1f54e.png
deleted file mode 100644
index b429736286..0000000000
Binary files a/public/emoji/1f54e.png and /dev/null differ
diff --git a/public/emoji/1f54e.svg b/public/emoji/1f54e.svg
index 82e1ca3385..aa69dd7e1e 100644
--- a/public/emoji/1f54e.svg
+++ b/public/emoji/1f54e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f550.png b/public/emoji/1f550.png
deleted file mode 100644
index d6e34941f2..0000000000
Binary files a/public/emoji/1f550.png and /dev/null differ
diff --git a/public/emoji/1f550.svg b/public/emoji/1f550.svg
index bd5bb075bd..3b8391d079 100644
--- a/public/emoji/1f550.svg
+++ b/public/emoji/1f550.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f551.png b/public/emoji/1f551.png
deleted file mode 100644
index a54253d7d5..0000000000
Binary files a/public/emoji/1f551.png and /dev/null differ
diff --git a/public/emoji/1f551.svg b/public/emoji/1f551.svg
index 2e55177120..9094bf4ff1 100644
--- a/public/emoji/1f551.svg
+++ b/public/emoji/1f551.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f552.png b/public/emoji/1f552.png
deleted file mode 100644
index 27ec4b1f51..0000000000
Binary files a/public/emoji/1f552.png and /dev/null differ
diff --git a/public/emoji/1f552.svg b/public/emoji/1f552.svg
index 834d2ddc5b..d7627919ef 100644
--- a/public/emoji/1f552.svg
+++ b/public/emoji/1f552.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f553.png b/public/emoji/1f553.png
deleted file mode 100644
index 60a1ef4cc1..0000000000
Binary files a/public/emoji/1f553.png and /dev/null differ
diff --git a/public/emoji/1f553.svg b/public/emoji/1f553.svg
index 9f67b69581..c8825cbab0 100644
--- a/public/emoji/1f553.svg
+++ b/public/emoji/1f553.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f554.png b/public/emoji/1f554.png
deleted file mode 100644
index c9382d1e09..0000000000
Binary files a/public/emoji/1f554.png and /dev/null differ
diff --git a/public/emoji/1f554.svg b/public/emoji/1f554.svg
index 073f85721a..1002512b49 100644
--- a/public/emoji/1f554.svg
+++ b/public/emoji/1f554.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f555.png b/public/emoji/1f555.png
deleted file mode 100644
index 8fd5d3f5bd..0000000000
Binary files a/public/emoji/1f555.png and /dev/null differ
diff --git a/public/emoji/1f555.svg b/public/emoji/1f555.svg
index 0fc34642b9..8f4cf5d8a9 100644
--- a/public/emoji/1f555.svg
+++ b/public/emoji/1f555.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f556.png b/public/emoji/1f556.png
deleted file mode 100644
index 8c7084036f..0000000000
Binary files a/public/emoji/1f556.png and /dev/null differ
diff --git a/public/emoji/1f556.svg b/public/emoji/1f556.svg
index 5289190672..b160ba8dee 100644
--- a/public/emoji/1f556.svg
+++ b/public/emoji/1f556.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f557.png b/public/emoji/1f557.png
deleted file mode 100644
index fcddf722e9..0000000000
Binary files a/public/emoji/1f557.png and /dev/null differ
diff --git a/public/emoji/1f557.svg b/public/emoji/1f557.svg
index f5bc3aff5a..bf351fd081 100644
--- a/public/emoji/1f557.svg
+++ b/public/emoji/1f557.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f558.png b/public/emoji/1f558.png
deleted file mode 100644
index dfbe011798..0000000000
Binary files a/public/emoji/1f558.png and /dev/null differ
diff --git a/public/emoji/1f558.svg b/public/emoji/1f558.svg
index 7e4eda3865..ff38ea75b9 100644
--- a/public/emoji/1f558.svg
+++ b/public/emoji/1f558.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f559.png b/public/emoji/1f559.png
deleted file mode 100644
index e62b245cdb..0000000000
Binary files a/public/emoji/1f559.png and /dev/null differ
diff --git a/public/emoji/1f559.svg b/public/emoji/1f559.svg
index 21e380e625..e341eb5cc1 100644
--- a/public/emoji/1f559.svg
+++ b/public/emoji/1f559.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f55a.png b/public/emoji/1f55a.png
deleted file mode 100644
index 0983345273..0000000000
Binary files a/public/emoji/1f55a.png and /dev/null differ
diff --git a/public/emoji/1f55a.svg b/public/emoji/1f55a.svg
index 6d7a3531c8..0f916d26d0 100644
--- a/public/emoji/1f55a.svg
+++ b/public/emoji/1f55a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f55b.png b/public/emoji/1f55b.png
deleted file mode 100644
index e61caa4b3e..0000000000
Binary files a/public/emoji/1f55b.png and /dev/null differ
diff --git a/public/emoji/1f55b.svg b/public/emoji/1f55b.svg
index 1381b3bc67..1e99036069 100644
--- a/public/emoji/1f55b.svg
+++ b/public/emoji/1f55b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f55c.png b/public/emoji/1f55c.png
deleted file mode 100644
index 86b7689b84..0000000000
Binary files a/public/emoji/1f55c.png and /dev/null differ
diff --git a/public/emoji/1f55c.svg b/public/emoji/1f55c.svg
index 9972f542dd..d98c288848 100644
--- a/public/emoji/1f55c.svg
+++ b/public/emoji/1f55c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f55d.png b/public/emoji/1f55d.png
deleted file mode 100644
index 7a787e018e..0000000000
Binary files a/public/emoji/1f55d.png and /dev/null differ
diff --git a/public/emoji/1f55d.svg b/public/emoji/1f55d.svg
index 86f24116ec..efdbe5ca45 100644
--- a/public/emoji/1f55d.svg
+++ b/public/emoji/1f55d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f55e.png b/public/emoji/1f55e.png
deleted file mode 100644
index c6860395ce..0000000000
Binary files a/public/emoji/1f55e.png and /dev/null differ
diff --git a/public/emoji/1f55e.svg b/public/emoji/1f55e.svg
index da97799684..e8a5b47a84 100644
--- a/public/emoji/1f55e.svg
+++ b/public/emoji/1f55e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f55f.png b/public/emoji/1f55f.png
deleted file mode 100644
index 3c05b36212..0000000000
Binary files a/public/emoji/1f55f.png and /dev/null differ
diff --git a/public/emoji/1f55f.svg b/public/emoji/1f55f.svg
index 8185d206be..46d2f6098d 100644
--- a/public/emoji/1f55f.svg
+++ b/public/emoji/1f55f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f560.png b/public/emoji/1f560.png
deleted file mode 100644
index c21fa926db..0000000000
Binary files a/public/emoji/1f560.png and /dev/null differ
diff --git a/public/emoji/1f560.svg b/public/emoji/1f560.svg
index 54ef72628b..6b1eeabaa7 100644
--- a/public/emoji/1f560.svg
+++ b/public/emoji/1f560.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f561.png b/public/emoji/1f561.png
deleted file mode 100644
index 2aec87fefc..0000000000
Binary files a/public/emoji/1f561.png and /dev/null differ
diff --git a/public/emoji/1f561.svg b/public/emoji/1f561.svg
index fea0cde951..5510c23754 100644
--- a/public/emoji/1f561.svg
+++ b/public/emoji/1f561.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f562.png b/public/emoji/1f562.png
deleted file mode 100644
index f7a1135e03..0000000000
Binary files a/public/emoji/1f562.png and /dev/null differ
diff --git a/public/emoji/1f562.svg b/public/emoji/1f562.svg
index 5cf968fb8c..d600d0e195 100644
--- a/public/emoji/1f562.svg
+++ b/public/emoji/1f562.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f563.png b/public/emoji/1f563.png
deleted file mode 100644
index 799b4aebc0..0000000000
Binary files a/public/emoji/1f563.png and /dev/null differ
diff --git a/public/emoji/1f563.svg b/public/emoji/1f563.svg
index ce973153f5..7b1bf93598 100644
--- a/public/emoji/1f563.svg
+++ b/public/emoji/1f563.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f564.png b/public/emoji/1f564.png
deleted file mode 100644
index 4a2092ee6f..0000000000
Binary files a/public/emoji/1f564.png and /dev/null differ
diff --git a/public/emoji/1f564.svg b/public/emoji/1f564.svg
index d7d214fa1c..1ee190a632 100644
--- a/public/emoji/1f564.svg
+++ b/public/emoji/1f564.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f565.png b/public/emoji/1f565.png
deleted file mode 100644
index 0802b3c65b..0000000000
Binary files a/public/emoji/1f565.png and /dev/null differ
diff --git a/public/emoji/1f565.svg b/public/emoji/1f565.svg
index d7d8b48d14..e68c2eb3ab 100644
--- a/public/emoji/1f565.svg
+++ b/public/emoji/1f565.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f566.png b/public/emoji/1f566.png
deleted file mode 100644
index d970d03b80..0000000000
Binary files a/public/emoji/1f566.png and /dev/null differ
diff --git a/public/emoji/1f566.svg b/public/emoji/1f566.svg
index 77030c048a..67e850cbf8 100644
--- a/public/emoji/1f566.svg
+++ b/public/emoji/1f566.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f567.png b/public/emoji/1f567.png
deleted file mode 100644
index f2b1d26172..0000000000
Binary files a/public/emoji/1f567.png and /dev/null differ
diff --git a/public/emoji/1f567.svg b/public/emoji/1f567.svg
index 02e81326a3..b5bb0e0a69 100644
--- a/public/emoji/1f567.svg
+++ b/public/emoji/1f567.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f56f.png b/public/emoji/1f56f.png
deleted file mode 100644
index 0b56444e35..0000000000
Binary files a/public/emoji/1f56f.png and /dev/null differ
diff --git a/public/emoji/1f56f.svg b/public/emoji/1f56f.svg
index af4c60634a..8264304352 100644
--- a/public/emoji/1f56f.svg
+++ b/public/emoji/1f56f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f570.png b/public/emoji/1f570.png
deleted file mode 100644
index ffdb451e3a..0000000000
Binary files a/public/emoji/1f570.png and /dev/null differ
diff --git a/public/emoji/1f570.svg b/public/emoji/1f570.svg
index c2808cbacc..4086334598 100644
--- a/public/emoji/1f570.svg
+++ b/public/emoji/1f570.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f573.png b/public/emoji/1f573.png
deleted file mode 100644
index 517d2ae0de..0000000000
Binary files a/public/emoji/1f573.png and /dev/null differ
diff --git a/public/emoji/1f573.svg b/public/emoji/1f573.svg
index 4ccc4369f4..d45030a303 100644
--- a/public/emoji/1f573.svg
+++ b/public/emoji/1f573.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f574-1f3fb.svg b/public/emoji/1f574-1f3fb.svg
new file mode 100644
index 0000000000..557e7da46e
--- /dev/null
+++ b/public/emoji/1f574-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f574-1f3fc.svg b/public/emoji/1f574-1f3fc.svg
new file mode 100644
index 0000000000..e7934589d1
--- /dev/null
+++ b/public/emoji/1f574-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f574-1f3fd.svg b/public/emoji/1f574-1f3fd.svg
new file mode 100644
index 0000000000..e0fc839fa6
--- /dev/null
+++ b/public/emoji/1f574-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f574-1f3fe.svg b/public/emoji/1f574-1f3fe.svg
new file mode 100644
index 0000000000..ea17439972
--- /dev/null
+++ b/public/emoji/1f574-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f574-1f3ff.svg b/public/emoji/1f574-1f3ff.svg
new file mode 100644
index 0000000000..bae73e2050
--- /dev/null
+++ b/public/emoji/1f574-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f574.png b/public/emoji/1f574.png
deleted file mode 100644
index 3dc315a3d9..0000000000
Binary files a/public/emoji/1f574.png and /dev/null differ
diff --git a/public/emoji/1f574.svg b/public/emoji/1f574.svg
index cfaf2a7896..cf6aa4b7ee 100644
--- a/public/emoji/1f574.svg
+++ b/public/emoji/1f574.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f575-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f575-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..22d2265a6b
--- /dev/null
+++ b/public/emoji/1f575-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f575-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f575-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..87429276e7
--- /dev/null
+++ b/public/emoji/1f575-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f575-1f3fb.png b/public/emoji/1f575-1f3fb.png
deleted file mode 100644
index 2d1c022cae..0000000000
Binary files a/public/emoji/1f575-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f575-1f3fb.svg b/public/emoji/1f575-1f3fb.svg
index 9e0d53872e..87429276e7 100644
--- a/public/emoji/1f575-1f3fb.svg
+++ b/public/emoji/1f575-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f575-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f575-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..110603c479
--- /dev/null
+++ b/public/emoji/1f575-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f575-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f575-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..a76aeba518
--- /dev/null
+++ b/public/emoji/1f575-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f575-1f3fc.png b/public/emoji/1f575-1f3fc.png
deleted file mode 100644
index 548b9c26f5..0000000000
Binary files a/public/emoji/1f575-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f575-1f3fc.svg b/public/emoji/1f575-1f3fc.svg
index 1eb13a65ec..a76aeba518 100644
--- a/public/emoji/1f575-1f3fc.svg
+++ b/public/emoji/1f575-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f575-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f575-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..5ed697977a
--- /dev/null
+++ b/public/emoji/1f575-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f575-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f575-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..85821083d5
--- /dev/null
+++ b/public/emoji/1f575-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f575-1f3fd.png b/public/emoji/1f575-1f3fd.png
deleted file mode 100644
index b023f4b18e..0000000000
Binary files a/public/emoji/1f575-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f575-1f3fd.svg b/public/emoji/1f575-1f3fd.svg
index 6eaa233c32..85821083d5 100644
--- a/public/emoji/1f575-1f3fd.svg
+++ b/public/emoji/1f575-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f575-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f575-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..4099bdc92a
--- /dev/null
+++ b/public/emoji/1f575-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f575-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f575-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..917dc17774
--- /dev/null
+++ b/public/emoji/1f575-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f575-1f3fe.png b/public/emoji/1f575-1f3fe.png
deleted file mode 100644
index d8300af492..0000000000
Binary files a/public/emoji/1f575-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f575-1f3fe.svg b/public/emoji/1f575-1f3fe.svg
index f3f11e430f..917dc17774 100644
--- a/public/emoji/1f575-1f3fe.svg
+++ b/public/emoji/1f575-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f575-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f575-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..f1e2b8c5e1
--- /dev/null
+++ b/public/emoji/1f575-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f575-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f575-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..04dc79582a
--- /dev/null
+++ b/public/emoji/1f575-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f575-1f3ff.png b/public/emoji/1f575-1f3ff.png
deleted file mode 100644
index ca1462595f..0000000000
Binary files a/public/emoji/1f575-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f575-1f3ff.svg b/public/emoji/1f575-1f3ff.svg
index 5fc5575469..04dc79582a 100644
--- a/public/emoji/1f575-1f3ff.svg
+++ b/public/emoji/1f575-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f575-fe0f-200d-2640-fe0f.svg b/public/emoji/1f575-fe0f-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..625c83007b
--- /dev/null
+++ b/public/emoji/1f575-fe0f-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f575-fe0f-200d-2642-fe0f.svg b/public/emoji/1f575-fe0f-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..89e86fd2c6
--- /dev/null
+++ b/public/emoji/1f575-fe0f-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f575.png b/public/emoji/1f575.png
deleted file mode 100644
index a729e9584d..0000000000
Binary files a/public/emoji/1f575.png and /dev/null differ
diff --git a/public/emoji/1f575.svg b/public/emoji/1f575.svg
index 9612edafbc..89e86fd2c6 100644
--- a/public/emoji/1f575.svg
+++ b/public/emoji/1f575.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f576.png b/public/emoji/1f576.png
deleted file mode 100644
index b1b6db0acf..0000000000
Binary files a/public/emoji/1f576.png and /dev/null differ
diff --git a/public/emoji/1f576.svg b/public/emoji/1f576.svg
index 3f1075ec43..07dfcf0458 100644
--- a/public/emoji/1f576.svg
+++ b/public/emoji/1f576.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f577.png b/public/emoji/1f577.png
deleted file mode 100644
index 3849fa90b9..0000000000
Binary files a/public/emoji/1f577.png and /dev/null differ
diff --git a/public/emoji/1f577.svg b/public/emoji/1f577.svg
index 21bb089013..35c53883bf 100644
--- a/public/emoji/1f577.svg
+++ b/public/emoji/1f577.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f578.png b/public/emoji/1f578.png
deleted file mode 100644
index ba448ee7fb..0000000000
Binary files a/public/emoji/1f578.png and /dev/null differ
diff --git a/public/emoji/1f578.svg b/public/emoji/1f578.svg
index 8a5a419592..a09fb444aa 100644
--- a/public/emoji/1f578.svg
+++ b/public/emoji/1f578.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f579.png b/public/emoji/1f579.png
deleted file mode 100644
index 1ee1905434..0000000000
Binary files a/public/emoji/1f579.png and /dev/null differ
diff --git a/public/emoji/1f579.svg b/public/emoji/1f579.svg
index b2e6440130..a8290299be 100644
--- a/public/emoji/1f579.svg
+++ b/public/emoji/1f579.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f57a-1f3fb.png b/public/emoji/1f57a-1f3fb.png
deleted file mode 100644
index e0b9f82d90..0000000000
Binary files a/public/emoji/1f57a-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f57a-1f3fb.svg b/public/emoji/1f57a-1f3fb.svg
index fc47b48f68..4e375b9f1d 100644
--- a/public/emoji/1f57a-1f3fb.svg
+++ b/public/emoji/1f57a-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f57a-1f3fc.png b/public/emoji/1f57a-1f3fc.png
deleted file mode 100644
index a5beed56e2..0000000000
Binary files a/public/emoji/1f57a-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f57a-1f3fc.svg b/public/emoji/1f57a-1f3fc.svg
index 289dcb68af..f88efc7512 100644
--- a/public/emoji/1f57a-1f3fc.svg
+++ b/public/emoji/1f57a-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f57a-1f3fd.png b/public/emoji/1f57a-1f3fd.png
deleted file mode 100644
index 2fa20180a6..0000000000
Binary files a/public/emoji/1f57a-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f57a-1f3fd.svg b/public/emoji/1f57a-1f3fd.svg
index 0356c2ac96..b2e430355b 100644
--- a/public/emoji/1f57a-1f3fd.svg
+++ b/public/emoji/1f57a-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f57a-1f3fe.png b/public/emoji/1f57a-1f3fe.png
deleted file mode 100644
index bd3528c83b..0000000000
Binary files a/public/emoji/1f57a-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f57a-1f3fe.svg b/public/emoji/1f57a-1f3fe.svg
index 70bb51fb95..efec3c0e4a 100644
--- a/public/emoji/1f57a-1f3fe.svg
+++ b/public/emoji/1f57a-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f57a-1f3ff.png b/public/emoji/1f57a-1f3ff.png
deleted file mode 100644
index 41fd4f880c..0000000000
Binary files a/public/emoji/1f57a-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f57a-1f3ff.svg b/public/emoji/1f57a-1f3ff.svg
index 61633d21d7..f8b9c9c0fc 100644
--- a/public/emoji/1f57a-1f3ff.svg
+++ b/public/emoji/1f57a-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f57a.png b/public/emoji/1f57a.png
deleted file mode 100644
index ccff3bede5..0000000000
Binary files a/public/emoji/1f57a.png and /dev/null differ
diff --git a/public/emoji/1f57a.svg b/public/emoji/1f57a.svg
index 11d2247c7d..6dd7710058 100644
--- a/public/emoji/1f57a.svg
+++ b/public/emoji/1f57a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f587.png b/public/emoji/1f587.png
deleted file mode 100644
index 76021e8c70..0000000000
Binary files a/public/emoji/1f587.png and /dev/null differ
diff --git a/public/emoji/1f587.svg b/public/emoji/1f587.svg
index b2dafc18b5..8f33de38d6 100644
--- a/public/emoji/1f587.svg
+++ b/public/emoji/1f587.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f58a.png b/public/emoji/1f58a.png
deleted file mode 100644
index 6ef7a34243..0000000000
Binary files a/public/emoji/1f58a.png and /dev/null differ
diff --git a/public/emoji/1f58a.svg b/public/emoji/1f58a.svg
index 1b61284ce0..88dafbf5cb 100644
--- a/public/emoji/1f58a.svg
+++ b/public/emoji/1f58a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f58b.png b/public/emoji/1f58b.png
deleted file mode 100644
index 3ca4bd2c23..0000000000
Binary files a/public/emoji/1f58b.png and /dev/null differ
diff --git a/public/emoji/1f58b.svg b/public/emoji/1f58b.svg
index a15d1aa50e..a73b058839 100644
--- a/public/emoji/1f58b.svg
+++ b/public/emoji/1f58b.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f58c.png b/public/emoji/1f58c.png
deleted file mode 100644
index 28bffbaa3c..0000000000
Binary files a/public/emoji/1f58c.png and /dev/null differ
diff --git a/public/emoji/1f58c.svg b/public/emoji/1f58c.svg
index 25a6916601..ccff7f8f61 100644
--- a/public/emoji/1f58c.svg
+++ b/public/emoji/1f58c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f58d.png b/public/emoji/1f58d.png
deleted file mode 100644
index 8d7b427aaa..0000000000
Binary files a/public/emoji/1f58d.png and /dev/null differ
diff --git a/public/emoji/1f58d.svg b/public/emoji/1f58d.svg
index 5a76528b55..69bc06e759 100644
--- a/public/emoji/1f58d.svg
+++ b/public/emoji/1f58d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f590-1f3fb.png b/public/emoji/1f590-1f3fb.png
deleted file mode 100644
index a7888e6bd2..0000000000
Binary files a/public/emoji/1f590-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f590-1f3fb.svg b/public/emoji/1f590-1f3fb.svg
index 5154c0bb03..bd1bf5aaeb 100644
--- a/public/emoji/1f590-1f3fb.svg
+++ b/public/emoji/1f590-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f590-1f3fc.png b/public/emoji/1f590-1f3fc.png
deleted file mode 100644
index cc10fbc272..0000000000
Binary files a/public/emoji/1f590-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f590-1f3fc.svg b/public/emoji/1f590-1f3fc.svg
index 00e624a29e..9082d2b684 100644
--- a/public/emoji/1f590-1f3fc.svg
+++ b/public/emoji/1f590-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f590-1f3fd.png b/public/emoji/1f590-1f3fd.png
deleted file mode 100644
index 707236ae8a..0000000000
Binary files a/public/emoji/1f590-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f590-1f3fd.svg b/public/emoji/1f590-1f3fd.svg
index 79c9644089..1eaeadc293 100644
--- a/public/emoji/1f590-1f3fd.svg
+++ b/public/emoji/1f590-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f590-1f3fe.png b/public/emoji/1f590-1f3fe.png
deleted file mode 100644
index 1430df9c61..0000000000
Binary files a/public/emoji/1f590-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f590-1f3fe.svg b/public/emoji/1f590-1f3fe.svg
index 1e01c773ba..1fe6d0be70 100644
--- a/public/emoji/1f590-1f3fe.svg
+++ b/public/emoji/1f590-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f590-1f3ff.png b/public/emoji/1f590-1f3ff.png
deleted file mode 100644
index 80bec971b6..0000000000
Binary files a/public/emoji/1f590-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f590-1f3ff.svg b/public/emoji/1f590-1f3ff.svg
index feae919776..5a2ece62ca 100644
--- a/public/emoji/1f590-1f3ff.svg
+++ b/public/emoji/1f590-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f590.png b/public/emoji/1f590.png
deleted file mode 100644
index fb5ae8ebb5..0000000000
Binary files a/public/emoji/1f590.png and /dev/null differ
diff --git a/public/emoji/1f590.svg b/public/emoji/1f590.svg
index daefb13e62..5d7b83f464 100644
--- a/public/emoji/1f590.svg
+++ b/public/emoji/1f590.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f595-1f3fb.png b/public/emoji/1f595-1f3fb.png
deleted file mode 100644
index 61ef12a154..0000000000
Binary files a/public/emoji/1f595-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f595-1f3fb.svg b/public/emoji/1f595-1f3fb.svg
index 74a6b8c401..29cb0ad89c 100644
--- a/public/emoji/1f595-1f3fb.svg
+++ b/public/emoji/1f595-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f595-1f3fc.png b/public/emoji/1f595-1f3fc.png
deleted file mode 100644
index c31a69be9a..0000000000
Binary files a/public/emoji/1f595-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f595-1f3fc.svg b/public/emoji/1f595-1f3fc.svg
index 57bccaa789..b8a18628ed 100644
--- a/public/emoji/1f595-1f3fc.svg
+++ b/public/emoji/1f595-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f595-1f3fd.png b/public/emoji/1f595-1f3fd.png
deleted file mode 100644
index 73ac216ce6..0000000000
Binary files a/public/emoji/1f595-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f595-1f3fd.svg b/public/emoji/1f595-1f3fd.svg
index 8ae95508b3..35a676a204 100644
--- a/public/emoji/1f595-1f3fd.svg
+++ b/public/emoji/1f595-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f595-1f3fe.png b/public/emoji/1f595-1f3fe.png
deleted file mode 100644
index 80b8ab7706..0000000000
Binary files a/public/emoji/1f595-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f595-1f3fe.svg b/public/emoji/1f595-1f3fe.svg
index b571c15532..0f3c877bc8 100644
--- a/public/emoji/1f595-1f3fe.svg
+++ b/public/emoji/1f595-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f595-1f3ff.png b/public/emoji/1f595-1f3ff.png
deleted file mode 100644
index a8826b196e..0000000000
Binary files a/public/emoji/1f595-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f595-1f3ff.svg b/public/emoji/1f595-1f3ff.svg
index 63062da9a4..a5592dda93 100644
--- a/public/emoji/1f595-1f3ff.svg
+++ b/public/emoji/1f595-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f595.png b/public/emoji/1f595.png
deleted file mode 100644
index 697f7a25eb..0000000000
Binary files a/public/emoji/1f595.png and /dev/null differ
diff --git a/public/emoji/1f595.svg b/public/emoji/1f595.svg
index a4247910c9..2ca84e3bae 100644
--- a/public/emoji/1f595.svg
+++ b/public/emoji/1f595.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f596-1f3fb.png b/public/emoji/1f596-1f3fb.png
deleted file mode 100644
index 8aff5d8fa1..0000000000
Binary files a/public/emoji/1f596-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f596-1f3fb.svg b/public/emoji/1f596-1f3fb.svg
index 73de3c32db..1a7d5d6d57 100644
--- a/public/emoji/1f596-1f3fb.svg
+++ b/public/emoji/1f596-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f596-1f3fc.png b/public/emoji/1f596-1f3fc.png
deleted file mode 100644
index 82b7ad519b..0000000000
Binary files a/public/emoji/1f596-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f596-1f3fc.svg b/public/emoji/1f596-1f3fc.svg
index acd4f53b64..da22363826 100644
--- a/public/emoji/1f596-1f3fc.svg
+++ b/public/emoji/1f596-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f596-1f3fd.png b/public/emoji/1f596-1f3fd.png
deleted file mode 100644
index d1400e1dd2..0000000000
Binary files a/public/emoji/1f596-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f596-1f3fd.svg b/public/emoji/1f596-1f3fd.svg
index ab308598ef..c688db96ac 100644
--- a/public/emoji/1f596-1f3fd.svg
+++ b/public/emoji/1f596-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f596-1f3fe.png b/public/emoji/1f596-1f3fe.png
deleted file mode 100644
index 47e2b28014..0000000000
Binary files a/public/emoji/1f596-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f596-1f3fe.svg b/public/emoji/1f596-1f3fe.svg
index 6104d999df..2fc051573e 100644
--- a/public/emoji/1f596-1f3fe.svg
+++ b/public/emoji/1f596-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f596-1f3ff.png b/public/emoji/1f596-1f3ff.png
deleted file mode 100644
index 60b5c6077b..0000000000
Binary files a/public/emoji/1f596-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f596-1f3ff.svg b/public/emoji/1f596-1f3ff.svg
index e936d88aaa..8819883971 100644
--- a/public/emoji/1f596-1f3ff.svg
+++ b/public/emoji/1f596-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f596.png b/public/emoji/1f596.png
deleted file mode 100644
index 54728bcaf5..0000000000
Binary files a/public/emoji/1f596.png and /dev/null differ
diff --git a/public/emoji/1f596.svg b/public/emoji/1f596.svg
index b2fb218f74..8126598d25 100644
--- a/public/emoji/1f596.svg
+++ b/public/emoji/1f596.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5a4.png b/public/emoji/1f5a4.png
deleted file mode 100644
index b4068c3e6e..0000000000
Binary files a/public/emoji/1f5a4.png and /dev/null differ
diff --git a/public/emoji/1f5a4.svg b/public/emoji/1f5a4.svg
index 5cedc5fb2f..8d3556c4eb 100644
--- a/public/emoji/1f5a4.svg
+++ b/public/emoji/1f5a4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5a5.png b/public/emoji/1f5a5.png
deleted file mode 100644
index 909bd42b5e..0000000000
Binary files a/public/emoji/1f5a5.png and /dev/null differ
diff --git a/public/emoji/1f5a5.svg b/public/emoji/1f5a5.svg
index 852287cf99..36b9da1feb 100644
--- a/public/emoji/1f5a5.svg
+++ b/public/emoji/1f5a5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5a8.png b/public/emoji/1f5a8.png
deleted file mode 100644
index 027c830f0f..0000000000
Binary files a/public/emoji/1f5a8.png and /dev/null differ
diff --git a/public/emoji/1f5a8.svg b/public/emoji/1f5a8.svg
index 4eb491f2e3..a34359e13f 100644
--- a/public/emoji/1f5a8.svg
+++ b/public/emoji/1f5a8.svg
@@ -1,3 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5b1.png b/public/emoji/1f5b1.png
deleted file mode 100644
index e84e96ff6e..0000000000
Binary files a/public/emoji/1f5b1.png and /dev/null differ
diff --git a/public/emoji/1f5b1.svg b/public/emoji/1f5b1.svg
index ed83ffe0fa..cbad4fd06c 100644
--- a/public/emoji/1f5b1.svg
+++ b/public/emoji/1f5b1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5b2.png b/public/emoji/1f5b2.png
deleted file mode 100644
index 3bea84ad7c..0000000000
Binary files a/public/emoji/1f5b2.png and /dev/null differ
diff --git a/public/emoji/1f5b2.svg b/public/emoji/1f5b2.svg
index 35468b2c8d..fd464c0964 100644
--- a/public/emoji/1f5b2.svg
+++ b/public/emoji/1f5b2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5bc.png b/public/emoji/1f5bc.png
deleted file mode 100644
index 9fe84607bf..0000000000
Binary files a/public/emoji/1f5bc.png and /dev/null differ
diff --git a/public/emoji/1f5bc.svg b/public/emoji/1f5bc.svg
index a0f89d0d62..8d935157a7 100644
--- a/public/emoji/1f5bc.svg
+++ b/public/emoji/1f5bc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5c2.png b/public/emoji/1f5c2.png
deleted file mode 100644
index 46a7e403f9..0000000000
Binary files a/public/emoji/1f5c2.png and /dev/null differ
diff --git a/public/emoji/1f5c2.svg b/public/emoji/1f5c2.svg
index d2046e806f..b63f3914cf 100644
--- a/public/emoji/1f5c2.svg
+++ b/public/emoji/1f5c2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5c3.png b/public/emoji/1f5c3.png
deleted file mode 100644
index f2e764ce59..0000000000
Binary files a/public/emoji/1f5c3.png and /dev/null differ
diff --git a/public/emoji/1f5c3.svg b/public/emoji/1f5c3.svg
index 4ab8e1b1cf..743f964e64 100644
--- a/public/emoji/1f5c3.svg
+++ b/public/emoji/1f5c3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5c4.png b/public/emoji/1f5c4.png
deleted file mode 100644
index fddc65dde9..0000000000
Binary files a/public/emoji/1f5c4.png and /dev/null differ
diff --git a/public/emoji/1f5c4.svg b/public/emoji/1f5c4.svg
index e27bdf1b3d..d3986817f0 100644
--- a/public/emoji/1f5c4.svg
+++ b/public/emoji/1f5c4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5d1.png b/public/emoji/1f5d1.png
deleted file mode 100644
index 2b3c484b49..0000000000
Binary files a/public/emoji/1f5d1.png and /dev/null differ
diff --git a/public/emoji/1f5d1.svg b/public/emoji/1f5d1.svg
index a83f728e25..d9ea71a060 100644
--- a/public/emoji/1f5d1.svg
+++ b/public/emoji/1f5d1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5d2.png b/public/emoji/1f5d2.png
deleted file mode 100644
index 85faa10d8e..0000000000
Binary files a/public/emoji/1f5d2.png and /dev/null differ
diff --git a/public/emoji/1f5d2.svg b/public/emoji/1f5d2.svg
index edfd8d0e63..61e735eb94 100644
--- a/public/emoji/1f5d2.svg
+++ b/public/emoji/1f5d2.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5d3.png b/public/emoji/1f5d3.png
deleted file mode 100644
index dec8d49bfa..0000000000
Binary files a/public/emoji/1f5d3.png and /dev/null differ
diff --git a/public/emoji/1f5d3.svg b/public/emoji/1f5d3.svg
index abe8a94103..cd3ce27577 100644
--- a/public/emoji/1f5d3.svg
+++ b/public/emoji/1f5d3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5dc.png b/public/emoji/1f5dc.png
deleted file mode 100644
index d7eda7f362..0000000000
Binary files a/public/emoji/1f5dc.png and /dev/null differ
diff --git a/public/emoji/1f5dc.svg b/public/emoji/1f5dc.svg
index 7d7fcab04f..412bf6bf70 100644
--- a/public/emoji/1f5dc.svg
+++ b/public/emoji/1f5dc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5dd.png b/public/emoji/1f5dd.png
deleted file mode 100644
index e11d706c6c..0000000000
Binary files a/public/emoji/1f5dd.png and /dev/null differ
diff --git a/public/emoji/1f5dd.svg b/public/emoji/1f5dd.svg
index 9bbf4f2acd..bd1d995814 100644
--- a/public/emoji/1f5dd.svg
+++ b/public/emoji/1f5dd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5de.png b/public/emoji/1f5de.png
deleted file mode 100644
index f64748df2b..0000000000
Binary files a/public/emoji/1f5de.png and /dev/null differ
diff --git a/public/emoji/1f5de.svg b/public/emoji/1f5de.svg
index fc37886336..f99430638d 100644
--- a/public/emoji/1f5de.svg
+++ b/public/emoji/1f5de.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5e1.png b/public/emoji/1f5e1.png
deleted file mode 100644
index 66e97b0aa2..0000000000
Binary files a/public/emoji/1f5e1.png and /dev/null differ
diff --git a/public/emoji/1f5e1.svg b/public/emoji/1f5e1.svg
index 8802fe08c1..9f4d1b5da1 100644
--- a/public/emoji/1f5e1.svg
+++ b/public/emoji/1f5e1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5e3.png b/public/emoji/1f5e3.png
deleted file mode 100644
index 2df93aaae0..0000000000
Binary files a/public/emoji/1f5e3.png and /dev/null differ
diff --git a/public/emoji/1f5e3.svg b/public/emoji/1f5e3.svg
index 9ba8a6ca6a..ded1caa613 100644
--- a/public/emoji/1f5e3.svg
+++ b/public/emoji/1f5e3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5e8.png b/public/emoji/1f5e8.png
deleted file mode 100644
index 00c05959bc..0000000000
Binary files a/public/emoji/1f5e8.png and /dev/null differ
diff --git a/public/emoji/1f5e8.svg b/public/emoji/1f5e8.svg
index b8c77e4115..d158c6e251 100644
--- a/public/emoji/1f5e8.svg
+++ b/public/emoji/1f5e8.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5ef.png b/public/emoji/1f5ef.png
deleted file mode 100644
index f5c97c4d29..0000000000
Binary files a/public/emoji/1f5ef.png and /dev/null differ
diff --git a/public/emoji/1f5ef.svg b/public/emoji/1f5ef.svg
index ed82900988..f9f4c9be12 100644
--- a/public/emoji/1f5ef.svg
+++ b/public/emoji/1f5ef.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5f3.png b/public/emoji/1f5f3.png
deleted file mode 100644
index 9b6767aea9..0000000000
Binary files a/public/emoji/1f5f3.png and /dev/null differ
diff --git a/public/emoji/1f5f3.svg b/public/emoji/1f5f3.svg
index c0cfc83074..4aa277eb0a 100644
--- a/public/emoji/1f5f3.svg
+++ b/public/emoji/1f5f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5fa.png b/public/emoji/1f5fa.png
deleted file mode 100644
index 15efe32c79..0000000000
Binary files a/public/emoji/1f5fa.png and /dev/null differ
diff --git a/public/emoji/1f5fa.svg b/public/emoji/1f5fa.svg
index 182a68f7f5..b6e48a7c17 100644
--- a/public/emoji/1f5fa.svg
+++ b/public/emoji/1f5fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5fb.png b/public/emoji/1f5fb.png
deleted file mode 100644
index 88a5475245..0000000000
Binary files a/public/emoji/1f5fb.png and /dev/null differ
diff --git a/public/emoji/1f5fb.svg b/public/emoji/1f5fb.svg
index 17545f8cc3..68b542bc1e 100644
--- a/public/emoji/1f5fb.svg
+++ b/public/emoji/1f5fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5fc.png b/public/emoji/1f5fc.png
deleted file mode 100644
index 37df7fc65b..0000000000
Binary files a/public/emoji/1f5fc.png and /dev/null differ
diff --git a/public/emoji/1f5fc.svg b/public/emoji/1f5fc.svg
index cb64daa5f2..40ee1e93bf 100644
--- a/public/emoji/1f5fc.svg
+++ b/public/emoji/1f5fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5fd.png b/public/emoji/1f5fd.png
deleted file mode 100644
index 05df8289b5..0000000000
Binary files a/public/emoji/1f5fd.png and /dev/null differ
diff --git a/public/emoji/1f5fd.svg b/public/emoji/1f5fd.svg
index fc4d834596..bbdd9f727c 100644
--- a/public/emoji/1f5fd.svg
+++ b/public/emoji/1f5fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5fe.png b/public/emoji/1f5fe.png
deleted file mode 100644
index d86d0a59e1..0000000000
Binary files a/public/emoji/1f5fe.png and /dev/null differ
diff --git a/public/emoji/1f5fe.svg b/public/emoji/1f5fe.svg
index 2b86ffcad1..02b5e88d60 100644
--- a/public/emoji/1f5fe.svg
+++ b/public/emoji/1f5fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f5ff.png b/public/emoji/1f5ff.png
deleted file mode 100644
index e6a7779c45..0000000000
Binary files a/public/emoji/1f5ff.png and /dev/null differ
diff --git a/public/emoji/1f5ff.svg b/public/emoji/1f5ff.svg
index 3b6c02afd5..ebe1791929 100644
--- a/public/emoji/1f5ff.svg
+++ b/public/emoji/1f5ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f600.png b/public/emoji/1f600.png
deleted file mode 100644
index 3e8e0dab78..0000000000
Binary files a/public/emoji/1f600.png and /dev/null differ
diff --git a/public/emoji/1f600.svg b/public/emoji/1f600.svg
index 33a476929c..d7e74f2d72 100644
--- a/public/emoji/1f600.svg
+++ b/public/emoji/1f600.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f601.png b/public/emoji/1f601.png
deleted file mode 100644
index 418d94c811..0000000000
Binary files a/public/emoji/1f601.png and /dev/null differ
diff --git a/public/emoji/1f601.svg b/public/emoji/1f601.svg
index e3939db53c..5f3b93ea05 100644
--- a/public/emoji/1f601.svg
+++ b/public/emoji/1f601.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f602.png b/public/emoji/1f602.png
deleted file mode 100644
index 0ba3b1859d..0000000000
Binary files a/public/emoji/1f602.png and /dev/null differ
diff --git a/public/emoji/1f602.svg b/public/emoji/1f602.svg
index ad3522a9d6..09650895a8 100644
--- a/public/emoji/1f602.svg
+++ b/public/emoji/1f602.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f603.png b/public/emoji/1f603.png
deleted file mode 100644
index 30957a6596..0000000000
Binary files a/public/emoji/1f603.png and /dev/null differ
diff --git a/public/emoji/1f603.svg b/public/emoji/1f603.svg
index a526b1541b..3b0f5413f1 100644
--- a/public/emoji/1f603.svg
+++ b/public/emoji/1f603.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f604.png b/public/emoji/1f604.png
deleted file mode 100644
index aa47ffe978..0000000000
Binary files a/public/emoji/1f604.png and /dev/null differ
diff --git a/public/emoji/1f604.svg b/public/emoji/1f604.svg
index 9d3a8409e1..c0d62c68da 100644
--- a/public/emoji/1f604.svg
+++ b/public/emoji/1f604.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f605.png b/public/emoji/1f605.png
deleted file mode 100644
index cb18d9c899..0000000000
Binary files a/public/emoji/1f605.png and /dev/null differ
diff --git a/public/emoji/1f605.svg b/public/emoji/1f605.svg
index da20875452..2d9c1104c7 100644
--- a/public/emoji/1f605.svg
+++ b/public/emoji/1f605.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f606.png b/public/emoji/1f606.png
deleted file mode 100644
index d94e9505ba..0000000000
Binary files a/public/emoji/1f606.png and /dev/null differ
diff --git a/public/emoji/1f606.svg b/public/emoji/1f606.svg
index a16e007eb4..b802bce3e0 100644
--- a/public/emoji/1f606.svg
+++ b/public/emoji/1f606.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f607.png b/public/emoji/1f607.png
deleted file mode 100644
index 57f5151124..0000000000
Binary files a/public/emoji/1f607.png and /dev/null differ
diff --git a/public/emoji/1f607.svg b/public/emoji/1f607.svg
index 7109c83712..c5139cb9de 100644
--- a/public/emoji/1f607.svg
+++ b/public/emoji/1f607.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f608.png b/public/emoji/1f608.png
deleted file mode 100644
index cc2c5f1ec7..0000000000
Binary files a/public/emoji/1f608.png and /dev/null differ
diff --git a/public/emoji/1f608.svg b/public/emoji/1f608.svg
index bdf4236168..770f118d92 100644
--- a/public/emoji/1f608.svg
+++ b/public/emoji/1f608.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f609.png b/public/emoji/1f609.png
deleted file mode 100644
index 7ea7810a37..0000000000
Binary files a/public/emoji/1f609.png and /dev/null differ
diff --git a/public/emoji/1f609.svg b/public/emoji/1f609.svg
index 2e4509e57e..0a7bf7fb81 100644
--- a/public/emoji/1f609.svg
+++ b/public/emoji/1f609.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f60a.png b/public/emoji/1f60a.png
deleted file mode 100644
index aac1a424ad..0000000000
Binary files a/public/emoji/1f60a.png and /dev/null differ
diff --git a/public/emoji/1f60a.svg b/public/emoji/1f60a.svg
index 797c06386d..ad888b5811 100644
--- a/public/emoji/1f60a.svg
+++ b/public/emoji/1f60a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f60b.png b/public/emoji/1f60b.png
deleted file mode 100644
index 2df15753ca..0000000000
Binary files a/public/emoji/1f60b.png and /dev/null differ
diff --git a/public/emoji/1f60b.svg b/public/emoji/1f60b.svg
index 932ca7d7ce..1439ed01e3 100644
--- a/public/emoji/1f60b.svg
+++ b/public/emoji/1f60b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f60c.png b/public/emoji/1f60c.png
deleted file mode 100644
index 715ad0bf53..0000000000
Binary files a/public/emoji/1f60c.png and /dev/null differ
diff --git a/public/emoji/1f60c.svg b/public/emoji/1f60c.svg
index 4af17f1440..bad14b74ff 100644
--- a/public/emoji/1f60c.svg
+++ b/public/emoji/1f60c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f60d.png b/public/emoji/1f60d.png
deleted file mode 100644
index 73fbee29d4..0000000000
Binary files a/public/emoji/1f60d.png and /dev/null differ
diff --git a/public/emoji/1f60d.svg b/public/emoji/1f60d.svg
index 4237d7e3f6..ea5dce36a6 100644
--- a/public/emoji/1f60d.svg
+++ b/public/emoji/1f60d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f60e.png b/public/emoji/1f60e.png
deleted file mode 100644
index 2001173511..0000000000
Binary files a/public/emoji/1f60e.png and /dev/null differ
diff --git a/public/emoji/1f60e.svg b/public/emoji/1f60e.svg
index 945ae68db6..4dfb1d675e 100644
--- a/public/emoji/1f60e.svg
+++ b/public/emoji/1f60e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f60f.png b/public/emoji/1f60f.png
deleted file mode 100644
index 8785210998..0000000000
Binary files a/public/emoji/1f60f.png and /dev/null differ
diff --git a/public/emoji/1f60f.svg b/public/emoji/1f60f.svg
index 68a3db63b7..886ea2e1b4 100644
--- a/public/emoji/1f60f.svg
+++ b/public/emoji/1f60f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f610.png b/public/emoji/1f610.png
deleted file mode 100644
index 065d193afe..0000000000
Binary files a/public/emoji/1f610.png and /dev/null differ
diff --git a/public/emoji/1f610.svg b/public/emoji/1f610.svg
index 23a11f7c55..69a7a3816f 100644
--- a/public/emoji/1f610.svg
+++ b/public/emoji/1f610.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f611.png b/public/emoji/1f611.png
deleted file mode 100644
index 2954017f6c..0000000000
Binary files a/public/emoji/1f611.png and /dev/null differ
diff --git a/public/emoji/1f611.svg b/public/emoji/1f611.svg
index 7938d2c1d8..71a6155a5b 100644
--- a/public/emoji/1f611.svg
+++ b/public/emoji/1f611.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f612.png b/public/emoji/1f612.png
deleted file mode 100644
index 25e3677f2e..0000000000
Binary files a/public/emoji/1f612.png and /dev/null differ
diff --git a/public/emoji/1f612.svg b/public/emoji/1f612.svg
index e557627484..bc67b3aa0b 100644
--- a/public/emoji/1f612.svg
+++ b/public/emoji/1f612.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f613.png b/public/emoji/1f613.png
deleted file mode 100644
index f0dae7b789..0000000000
Binary files a/public/emoji/1f613.png and /dev/null differ
diff --git a/public/emoji/1f613.svg b/public/emoji/1f613.svg
index 607726762c..82838f4198 100644
--- a/public/emoji/1f613.svg
+++ b/public/emoji/1f613.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f614.png b/public/emoji/1f614.png
deleted file mode 100644
index 490fb56695..0000000000
Binary files a/public/emoji/1f614.png and /dev/null differ
diff --git a/public/emoji/1f614.svg b/public/emoji/1f614.svg
index 28de02f248..5125d919a3 100644
--- a/public/emoji/1f614.svg
+++ b/public/emoji/1f614.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f615.png b/public/emoji/1f615.png
deleted file mode 100644
index 502b6bf0e0..0000000000
Binary files a/public/emoji/1f615.png and /dev/null differ
diff --git a/public/emoji/1f615.svg b/public/emoji/1f615.svg
index 534330c3b2..0c29da5c27 100644
--- a/public/emoji/1f615.svg
+++ b/public/emoji/1f615.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f616.png b/public/emoji/1f616.png
deleted file mode 100644
index aa4b29e937..0000000000
Binary files a/public/emoji/1f616.png and /dev/null differ
diff --git a/public/emoji/1f616.svg b/public/emoji/1f616.svg
index 5f038264f7..cbdeaa055d 100644
--- a/public/emoji/1f616.svg
+++ b/public/emoji/1f616.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f617.png b/public/emoji/1f617.png
deleted file mode 100644
index 39d325fd8e..0000000000
Binary files a/public/emoji/1f617.png and /dev/null differ
diff --git a/public/emoji/1f617.svg b/public/emoji/1f617.svg
index be878012b8..4b0b62d8ba 100644
--- a/public/emoji/1f617.svg
+++ b/public/emoji/1f617.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f618.png b/public/emoji/1f618.png
deleted file mode 100644
index 0ff808fd61..0000000000
Binary files a/public/emoji/1f618.png and /dev/null differ
diff --git a/public/emoji/1f618.svg b/public/emoji/1f618.svg
index 983b37b47e..2d920d99f1 100644
--- a/public/emoji/1f618.svg
+++ b/public/emoji/1f618.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f619.png b/public/emoji/1f619.png
deleted file mode 100644
index e181f17099..0000000000
Binary files a/public/emoji/1f619.png and /dev/null differ
diff --git a/public/emoji/1f619.svg b/public/emoji/1f619.svg
index 1ac00e32f9..e265c02f19 100644
--- a/public/emoji/1f619.svg
+++ b/public/emoji/1f619.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f61a.png b/public/emoji/1f61a.png
deleted file mode 100644
index b684d7d4d6..0000000000
Binary files a/public/emoji/1f61a.png and /dev/null differ
diff --git a/public/emoji/1f61a.svg b/public/emoji/1f61a.svg
index 7a3cf76044..414193a78c 100644
--- a/public/emoji/1f61a.svg
+++ b/public/emoji/1f61a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f61b.png b/public/emoji/1f61b.png
deleted file mode 100644
index 25757341f9..0000000000
Binary files a/public/emoji/1f61b.png and /dev/null differ
diff --git a/public/emoji/1f61b.svg b/public/emoji/1f61b.svg
index ccef634ecb..eb39b55261 100644
--- a/public/emoji/1f61b.svg
+++ b/public/emoji/1f61b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f61c.png b/public/emoji/1f61c.png
deleted file mode 100644
index 4817eaa3dc..0000000000
Binary files a/public/emoji/1f61c.png and /dev/null differ
diff --git a/public/emoji/1f61c.svg b/public/emoji/1f61c.svg
index 413c3d2a8c..20dd42d426 100644
--- a/public/emoji/1f61c.svg
+++ b/public/emoji/1f61c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f61d.png b/public/emoji/1f61d.png
deleted file mode 100644
index 5c0401e9b1..0000000000
Binary files a/public/emoji/1f61d.png and /dev/null differ
diff --git a/public/emoji/1f61d.svg b/public/emoji/1f61d.svg
index 5157da9377..8d5e50cc79 100644
--- a/public/emoji/1f61d.svg
+++ b/public/emoji/1f61d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f61e.png b/public/emoji/1f61e.png
deleted file mode 100644
index efe4e67e23..0000000000
Binary files a/public/emoji/1f61e.png and /dev/null differ
diff --git a/public/emoji/1f61e.svg b/public/emoji/1f61e.svg
index 143c2f4319..8ebcdf3983 100644
--- a/public/emoji/1f61e.svg
+++ b/public/emoji/1f61e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f61f.png b/public/emoji/1f61f.png
deleted file mode 100644
index 7074afcf5b..0000000000
Binary files a/public/emoji/1f61f.png and /dev/null differ
diff --git a/public/emoji/1f61f.svg b/public/emoji/1f61f.svg
index a1eec054ec..0ac3e37e1e 100644
--- a/public/emoji/1f61f.svg
+++ b/public/emoji/1f61f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f620.png b/public/emoji/1f620.png
deleted file mode 100644
index cfc4a6ecde..0000000000
Binary files a/public/emoji/1f620.png and /dev/null differ
diff --git a/public/emoji/1f620.svg b/public/emoji/1f620.svg
index a32acbcdd0..70cc96a730 100644
--- a/public/emoji/1f620.svg
+++ b/public/emoji/1f620.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f621.png b/public/emoji/1f621.png
deleted file mode 100644
index 9d739bd40a..0000000000
Binary files a/public/emoji/1f621.png and /dev/null differ
diff --git a/public/emoji/1f621.svg b/public/emoji/1f621.svg
index f7c72270fa..8913846df2 100644
--- a/public/emoji/1f621.svg
+++ b/public/emoji/1f621.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f622.png b/public/emoji/1f622.png
deleted file mode 100644
index b7877f8a17..0000000000
Binary files a/public/emoji/1f622.png and /dev/null differ
diff --git a/public/emoji/1f622.svg b/public/emoji/1f622.svg
index e39209c80e..2d960b5695 100644
--- a/public/emoji/1f622.svg
+++ b/public/emoji/1f622.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f623.png b/public/emoji/1f623.png
deleted file mode 100644
index 646a05fe90..0000000000
Binary files a/public/emoji/1f623.png and /dev/null differ
diff --git a/public/emoji/1f623.svg b/public/emoji/1f623.svg
index 94826839a8..69e670b15a 100644
--- a/public/emoji/1f623.svg
+++ b/public/emoji/1f623.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f624.png b/public/emoji/1f624.png
deleted file mode 100644
index 0be7a50196..0000000000
Binary files a/public/emoji/1f624.png and /dev/null differ
diff --git a/public/emoji/1f624.svg b/public/emoji/1f624.svg
index fe5de95fc9..a3b73f63ef 100644
--- a/public/emoji/1f624.svg
+++ b/public/emoji/1f624.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f625.png b/public/emoji/1f625.png
deleted file mode 100644
index aef864d2b3..0000000000
Binary files a/public/emoji/1f625.png and /dev/null differ
diff --git a/public/emoji/1f625.svg b/public/emoji/1f625.svg
index c52759e691..1d06587ec5 100644
--- a/public/emoji/1f625.svg
+++ b/public/emoji/1f625.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f626.png b/public/emoji/1f626.png
deleted file mode 100644
index 43ab6b0a1c..0000000000
Binary files a/public/emoji/1f626.png and /dev/null differ
diff --git a/public/emoji/1f626.svg b/public/emoji/1f626.svg
index c037c085a4..11a2a0bf67 100644
--- a/public/emoji/1f626.svg
+++ b/public/emoji/1f626.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f627.png b/public/emoji/1f627.png
deleted file mode 100644
index f99026a3bc..0000000000
Binary files a/public/emoji/1f627.png and /dev/null differ
diff --git a/public/emoji/1f627.svg b/public/emoji/1f627.svg
index b97c18b3aa..94aee7d3c1 100644
--- a/public/emoji/1f627.svg
+++ b/public/emoji/1f627.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f628.png b/public/emoji/1f628.png
deleted file mode 100644
index eb8b347cef..0000000000
Binary files a/public/emoji/1f628.png and /dev/null differ
diff --git a/public/emoji/1f628.svg b/public/emoji/1f628.svg
index 38cfe0bb28..d4cc4aa7c3 100644
--- a/public/emoji/1f628.svg
+++ b/public/emoji/1f628.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f629.png b/public/emoji/1f629.png
deleted file mode 100644
index 98bfbd24a1..0000000000
Binary files a/public/emoji/1f629.png and /dev/null differ
diff --git a/public/emoji/1f629.svg b/public/emoji/1f629.svg
index 248da5b2e0..200c69f7da 100644
--- a/public/emoji/1f629.svg
+++ b/public/emoji/1f629.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f62a.png b/public/emoji/1f62a.png
deleted file mode 100644
index 836b410771..0000000000
Binary files a/public/emoji/1f62a.png and /dev/null differ
diff --git a/public/emoji/1f62a.svg b/public/emoji/1f62a.svg
index d2dd9f7b43..26f5e93a3a 100644
--- a/public/emoji/1f62a.svg
+++ b/public/emoji/1f62a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f62b.png b/public/emoji/1f62b.png
deleted file mode 100644
index 4e01eff5b2..0000000000
Binary files a/public/emoji/1f62b.png and /dev/null differ
diff --git a/public/emoji/1f62b.svg b/public/emoji/1f62b.svg
index 3ba1a6c02f..094fd685d5 100644
--- a/public/emoji/1f62b.svg
+++ b/public/emoji/1f62b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f62c.png b/public/emoji/1f62c.png
deleted file mode 100644
index 871b2f071c..0000000000
Binary files a/public/emoji/1f62c.png and /dev/null differ
diff --git a/public/emoji/1f62c.svg b/public/emoji/1f62c.svg
index 75c5b7dcb4..6ef38ff1c4 100644
--- a/public/emoji/1f62c.svg
+++ b/public/emoji/1f62c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f62d.png b/public/emoji/1f62d.png
deleted file mode 100644
index 52e3517a1e..0000000000
Binary files a/public/emoji/1f62d.png and /dev/null differ
diff --git a/public/emoji/1f62d.svg b/public/emoji/1f62d.svg
index 0fb4ba9bd6..87a656b31e 100644
--- a/public/emoji/1f62d.svg
+++ b/public/emoji/1f62d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f62e.png b/public/emoji/1f62e.png
deleted file mode 100644
index a62cd27e14..0000000000
Binary files a/public/emoji/1f62e.png and /dev/null differ
diff --git a/public/emoji/1f62e.svg b/public/emoji/1f62e.svg
index 855b53c66c..4b54e4c742 100644
--- a/public/emoji/1f62e.svg
+++ b/public/emoji/1f62e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f62f.png b/public/emoji/1f62f.png
deleted file mode 100644
index cad0e23132..0000000000
Binary files a/public/emoji/1f62f.png and /dev/null differ
diff --git a/public/emoji/1f62f.svg b/public/emoji/1f62f.svg
index d9b0801f72..192838a675 100644
--- a/public/emoji/1f62f.svg
+++ b/public/emoji/1f62f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f630.png b/public/emoji/1f630.png
deleted file mode 100644
index 85b2231bbf..0000000000
Binary files a/public/emoji/1f630.png and /dev/null differ
diff --git a/public/emoji/1f630.svg b/public/emoji/1f630.svg
index 9ae7444e71..3463630bc3 100644
--- a/public/emoji/1f630.svg
+++ b/public/emoji/1f630.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f631.png b/public/emoji/1f631.png
deleted file mode 100644
index c3bea9f251..0000000000
Binary files a/public/emoji/1f631.png and /dev/null differ
diff --git a/public/emoji/1f631.svg b/public/emoji/1f631.svg
index 686c983555..cd901c7c15 100644
--- a/public/emoji/1f631.svg
+++ b/public/emoji/1f631.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f632.png b/public/emoji/1f632.png
deleted file mode 100644
index bd0ac55ec8..0000000000
Binary files a/public/emoji/1f632.png and /dev/null differ
diff --git a/public/emoji/1f632.svg b/public/emoji/1f632.svg
index 703ddf123d..6c07237f42 100644
--- a/public/emoji/1f632.svg
+++ b/public/emoji/1f632.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f633.png b/public/emoji/1f633.png
deleted file mode 100644
index 829220bc47..0000000000
Binary files a/public/emoji/1f633.png and /dev/null differ
diff --git a/public/emoji/1f633.svg b/public/emoji/1f633.svg
index 8be56d39a9..b4a717fabc 100644
--- a/public/emoji/1f633.svg
+++ b/public/emoji/1f633.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f634.png b/public/emoji/1f634.png
deleted file mode 100644
index 9ecf600d6d..0000000000
Binary files a/public/emoji/1f634.png and /dev/null differ
diff --git a/public/emoji/1f634.svg b/public/emoji/1f634.svg
index 41beef906a..53b486a9df 100644
--- a/public/emoji/1f634.svg
+++ b/public/emoji/1f634.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f635.png b/public/emoji/1f635.png
deleted file mode 100644
index 3120316ab5..0000000000
Binary files a/public/emoji/1f635.png and /dev/null differ
diff --git a/public/emoji/1f635.svg b/public/emoji/1f635.svg
index 6556452471..45a8bbed73 100644
--- a/public/emoji/1f635.svg
+++ b/public/emoji/1f635.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f636.png b/public/emoji/1f636.png
deleted file mode 100644
index b642f6c117..0000000000
Binary files a/public/emoji/1f636.png and /dev/null differ
diff --git a/public/emoji/1f636.svg b/public/emoji/1f636.svg
index 9ad70bc517..3eb385b1dc 100644
--- a/public/emoji/1f636.svg
+++ b/public/emoji/1f636.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f637.png b/public/emoji/1f637.png
deleted file mode 100644
index 1e800acd1c..0000000000
Binary files a/public/emoji/1f637.png and /dev/null differ
diff --git a/public/emoji/1f637.svg b/public/emoji/1f637.svg
index 2fcc6b50f8..c2de94b08d 100644
--- a/public/emoji/1f637.svg
+++ b/public/emoji/1f637.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f638.png b/public/emoji/1f638.png
deleted file mode 100644
index 6f25f11dd3..0000000000
Binary files a/public/emoji/1f638.png and /dev/null differ
diff --git a/public/emoji/1f638.svg b/public/emoji/1f638.svg
index 6e8aa84356..470dd72660 100644
--- a/public/emoji/1f638.svg
+++ b/public/emoji/1f638.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f639.png b/public/emoji/1f639.png
deleted file mode 100644
index aac353179a..0000000000
Binary files a/public/emoji/1f639.png and /dev/null differ
diff --git a/public/emoji/1f639.svg b/public/emoji/1f639.svg
index 1eb62f35c7..4cd1a535a0 100644
--- a/public/emoji/1f639.svg
+++ b/public/emoji/1f639.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f63a.png b/public/emoji/1f63a.png
deleted file mode 100644
index 163b57a342..0000000000
Binary files a/public/emoji/1f63a.png and /dev/null differ
diff --git a/public/emoji/1f63a.svg b/public/emoji/1f63a.svg
index c708d746e0..c5d85658de 100644
--- a/public/emoji/1f63a.svg
+++ b/public/emoji/1f63a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f63b.png b/public/emoji/1f63b.png
deleted file mode 100644
index bc5a833f9a..0000000000
Binary files a/public/emoji/1f63b.png and /dev/null differ
diff --git a/public/emoji/1f63b.svg b/public/emoji/1f63b.svg
index b7388254b8..7fbf39f0b0 100644
--- a/public/emoji/1f63b.svg
+++ b/public/emoji/1f63b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f63c.png b/public/emoji/1f63c.png
deleted file mode 100644
index 9ac5954c19..0000000000
Binary files a/public/emoji/1f63c.png and /dev/null differ
diff --git a/public/emoji/1f63c.svg b/public/emoji/1f63c.svg
index 7cebf3d67c..496d0bfea0 100644
--- a/public/emoji/1f63c.svg
+++ b/public/emoji/1f63c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f63d.png b/public/emoji/1f63d.png
deleted file mode 100644
index 6e0bcc7754..0000000000
Binary files a/public/emoji/1f63d.png and /dev/null differ
diff --git a/public/emoji/1f63d.svg b/public/emoji/1f63d.svg
index 8d029f9605..147c3e5c03 100644
--- a/public/emoji/1f63d.svg
+++ b/public/emoji/1f63d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f63e.png b/public/emoji/1f63e.png
deleted file mode 100644
index 41ddfeab42..0000000000
Binary files a/public/emoji/1f63e.png and /dev/null differ
diff --git a/public/emoji/1f63e.svg b/public/emoji/1f63e.svg
index aa7be0f644..edb262e0f6 100644
--- a/public/emoji/1f63e.svg
+++ b/public/emoji/1f63e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f63f.png b/public/emoji/1f63f.png
deleted file mode 100644
index b4f49715e0..0000000000
Binary files a/public/emoji/1f63f.png and /dev/null differ
diff --git a/public/emoji/1f63f.svg b/public/emoji/1f63f.svg
index 5b17e95238..1a0b5017ee 100644
--- a/public/emoji/1f63f.svg
+++ b/public/emoji/1f63f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f640.png b/public/emoji/1f640.png
deleted file mode 100644
index 15803ad8e6..0000000000
Binary files a/public/emoji/1f640.png and /dev/null differ
diff --git a/public/emoji/1f640.svg b/public/emoji/1f640.svg
index 5c1c25786a..95462021ac 100644
--- a/public/emoji/1f640.svg
+++ b/public/emoji/1f640.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f641.png b/public/emoji/1f641.png
deleted file mode 100644
index b2f1d983d3..0000000000
Binary files a/public/emoji/1f641.png and /dev/null differ
diff --git a/public/emoji/1f641.svg b/public/emoji/1f641.svg
index aeb3b4f24f..af09e8205b 100644
--- a/public/emoji/1f641.svg
+++ b/public/emoji/1f641.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f642.png b/public/emoji/1f642.png
deleted file mode 100644
index ddd7d65dd3..0000000000
Binary files a/public/emoji/1f642.png and /dev/null differ
diff --git a/public/emoji/1f642.svg b/public/emoji/1f642.svg
index 753ef7c23f..0eab08c539 100644
--- a/public/emoji/1f642.svg
+++ b/public/emoji/1f642.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f643.png b/public/emoji/1f643.png
deleted file mode 100644
index 128f31c982..0000000000
Binary files a/public/emoji/1f643.png and /dev/null differ
diff --git a/public/emoji/1f643.svg b/public/emoji/1f643.svg
index bdb24a7e51..b44e813c77 100644
--- a/public/emoji/1f643.svg
+++ b/public/emoji/1f643.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f644.png b/public/emoji/1f644.png
deleted file mode 100644
index 2f77b9fc3b..0000000000
Binary files a/public/emoji/1f644.png and /dev/null differ
diff --git a/public/emoji/1f644.svg b/public/emoji/1f644.svg
index dcb222cefb..0d6bfd3543 100644
--- a/public/emoji/1f644.svg
+++ b/public/emoji/1f644.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f645-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f645-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..74f9b85fdb
--- /dev/null
+++ b/public/emoji/1f645-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f645-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f645-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..71db02cbab
--- /dev/null
+++ b/public/emoji/1f645-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f645-1f3fb.png b/public/emoji/1f645-1f3fb.png
deleted file mode 100644
index 5c1a3cbb88..0000000000
Binary files a/public/emoji/1f645-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f645-1f3fb.svg b/public/emoji/1f645-1f3fb.svg
index ac2255ef78..74f9b85fdb 100644
--- a/public/emoji/1f645-1f3fb.svg
+++ b/public/emoji/1f645-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f645-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f645-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..af386803ea
--- /dev/null
+++ b/public/emoji/1f645-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f645-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f645-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..67aae6cd5e
--- /dev/null
+++ b/public/emoji/1f645-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f645-1f3fc.png b/public/emoji/1f645-1f3fc.png
deleted file mode 100644
index 80d8021f8f..0000000000
Binary files a/public/emoji/1f645-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f645-1f3fc.svg b/public/emoji/1f645-1f3fc.svg
index 621160c36d..af386803ea 100644
--- a/public/emoji/1f645-1f3fc.svg
+++ b/public/emoji/1f645-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f645-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f645-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..420a4d3181
--- /dev/null
+++ b/public/emoji/1f645-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f645-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f645-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..d6d2b153b4
--- /dev/null
+++ b/public/emoji/1f645-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f645-1f3fd.png b/public/emoji/1f645-1f3fd.png
deleted file mode 100644
index 635e6a0081..0000000000
Binary files a/public/emoji/1f645-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f645-1f3fd.svg b/public/emoji/1f645-1f3fd.svg
index 446067544e..420a4d3181 100644
--- a/public/emoji/1f645-1f3fd.svg
+++ b/public/emoji/1f645-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f645-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f645-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..fb7d1118b6
--- /dev/null
+++ b/public/emoji/1f645-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f645-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f645-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..ee5efbf77f
--- /dev/null
+++ b/public/emoji/1f645-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f645-1f3fe.png b/public/emoji/1f645-1f3fe.png
deleted file mode 100644
index b96e412a37..0000000000
Binary files a/public/emoji/1f645-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f645-1f3fe.svg b/public/emoji/1f645-1f3fe.svg
index 2a99eabc2e..fb7d1118b6 100644
--- a/public/emoji/1f645-1f3fe.svg
+++ b/public/emoji/1f645-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f645-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f645-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..4bd472200f
--- /dev/null
+++ b/public/emoji/1f645-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f645-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f645-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..ff3880c728
--- /dev/null
+++ b/public/emoji/1f645-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f645-1f3ff.png b/public/emoji/1f645-1f3ff.png
deleted file mode 100644
index 9a7084afa0..0000000000
Binary files a/public/emoji/1f645-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f645-1f3ff.svg b/public/emoji/1f645-1f3ff.svg
index b32480b4a1..4bd472200f 100644
--- a/public/emoji/1f645-1f3ff.svg
+++ b/public/emoji/1f645-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f645-200d-2640-fe0f.svg b/public/emoji/1f645-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..4d88d71eb4
--- /dev/null
+++ b/public/emoji/1f645-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f645-200d-2642-fe0f.svg b/public/emoji/1f645-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..eae7e5fdb6
--- /dev/null
+++ b/public/emoji/1f645-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f645.png b/public/emoji/1f645.png
deleted file mode 100644
index ed57710032..0000000000
Binary files a/public/emoji/1f645.png and /dev/null differ
diff --git a/public/emoji/1f645.svg b/public/emoji/1f645.svg
index d735d25d78..4d88d71eb4 100644
--- a/public/emoji/1f645.svg
+++ b/public/emoji/1f645.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f646-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f646-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..df103cc7a9
--- /dev/null
+++ b/public/emoji/1f646-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f646-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f646-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..0838f2dde9
--- /dev/null
+++ b/public/emoji/1f646-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f646-1f3fb.png b/public/emoji/1f646-1f3fb.png
deleted file mode 100644
index c99543e785..0000000000
Binary files a/public/emoji/1f646-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f646-1f3fb.svg b/public/emoji/1f646-1f3fb.svg
index b8d8dfddb7..df103cc7a9 100644
--- a/public/emoji/1f646-1f3fb.svg
+++ b/public/emoji/1f646-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f646-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f646-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..271cf8fd0b
--- /dev/null
+++ b/public/emoji/1f646-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f646-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f646-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..3a1069e0b8
--- /dev/null
+++ b/public/emoji/1f646-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f646-1f3fc.png b/public/emoji/1f646-1f3fc.png
deleted file mode 100644
index ad5fae813d..0000000000
Binary files a/public/emoji/1f646-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f646-1f3fc.svg b/public/emoji/1f646-1f3fc.svg
index f16fa5a953..271cf8fd0b 100644
--- a/public/emoji/1f646-1f3fc.svg
+++ b/public/emoji/1f646-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f646-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f646-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..16995b6a81
--- /dev/null
+++ b/public/emoji/1f646-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f646-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f646-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..910658dd27
--- /dev/null
+++ b/public/emoji/1f646-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f646-1f3fd.png b/public/emoji/1f646-1f3fd.png
deleted file mode 100644
index 51bf4fab40..0000000000
Binary files a/public/emoji/1f646-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f646-1f3fd.svg b/public/emoji/1f646-1f3fd.svg
index 9bc563c6b5..16995b6a81 100644
--- a/public/emoji/1f646-1f3fd.svg
+++ b/public/emoji/1f646-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f646-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f646-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..7ddb98d58b
--- /dev/null
+++ b/public/emoji/1f646-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f646-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f646-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..125caa0c67
--- /dev/null
+++ b/public/emoji/1f646-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f646-1f3fe.png b/public/emoji/1f646-1f3fe.png
deleted file mode 100644
index ee3f9dc640..0000000000
Binary files a/public/emoji/1f646-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f646-1f3fe.svg b/public/emoji/1f646-1f3fe.svg
index 5392c73753..7ddb98d58b 100644
--- a/public/emoji/1f646-1f3fe.svg
+++ b/public/emoji/1f646-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f646-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f646-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..2d91be69f8
--- /dev/null
+++ b/public/emoji/1f646-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f646-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f646-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..964fa29827
--- /dev/null
+++ b/public/emoji/1f646-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f646-1f3ff.png b/public/emoji/1f646-1f3ff.png
deleted file mode 100644
index 62a9d9237f..0000000000
Binary files a/public/emoji/1f646-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f646-1f3ff.svg b/public/emoji/1f646-1f3ff.svg
index 6a43d0b1a5..2d91be69f8 100644
--- a/public/emoji/1f646-1f3ff.svg
+++ b/public/emoji/1f646-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f646-200d-2640-fe0f.svg b/public/emoji/1f646-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..6f357f8e70
--- /dev/null
+++ b/public/emoji/1f646-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f646-200d-2642-fe0f.svg b/public/emoji/1f646-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..236602e9fa
--- /dev/null
+++ b/public/emoji/1f646-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f646.png b/public/emoji/1f646.png
deleted file mode 100644
index 90a2c7469c..0000000000
Binary files a/public/emoji/1f646.png and /dev/null differ
diff --git a/public/emoji/1f646.svg b/public/emoji/1f646.svg
index 8a9a9648e4..6f357f8e70 100644
--- a/public/emoji/1f646.svg
+++ b/public/emoji/1f646.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f647-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f647-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..fee297b9cd
--- /dev/null
+++ b/public/emoji/1f647-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f647-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f647-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..8b367d523f
--- /dev/null
+++ b/public/emoji/1f647-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f647-1f3fb.png b/public/emoji/1f647-1f3fb.png
deleted file mode 100644
index 87afb7b54c..0000000000
Binary files a/public/emoji/1f647-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f647-1f3fb.svg b/public/emoji/1f647-1f3fb.svg
index bce8d4babd..8b367d523f 100644
--- a/public/emoji/1f647-1f3fb.svg
+++ b/public/emoji/1f647-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f647-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f647-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..a6e77cca7a
--- /dev/null
+++ b/public/emoji/1f647-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f647-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f647-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..43f2bcb9c5
--- /dev/null
+++ b/public/emoji/1f647-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f647-1f3fc.png b/public/emoji/1f647-1f3fc.png
deleted file mode 100644
index 3ccf7dc085..0000000000
Binary files a/public/emoji/1f647-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f647-1f3fc.svg b/public/emoji/1f647-1f3fc.svg
index c492d09783..43f2bcb9c5 100644
--- a/public/emoji/1f647-1f3fc.svg
+++ b/public/emoji/1f647-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f647-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f647-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..8ee53b8167
--- /dev/null
+++ b/public/emoji/1f647-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f647-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f647-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..4b07a08827
--- /dev/null
+++ b/public/emoji/1f647-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f647-1f3fd.png b/public/emoji/1f647-1f3fd.png
deleted file mode 100644
index 8b9eb64f92..0000000000
Binary files a/public/emoji/1f647-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f647-1f3fd.svg b/public/emoji/1f647-1f3fd.svg
index e615034036..4b07a08827 100644
--- a/public/emoji/1f647-1f3fd.svg
+++ b/public/emoji/1f647-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f647-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f647-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..fc989b227d
--- /dev/null
+++ b/public/emoji/1f647-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f647-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f647-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..851dae93d6
--- /dev/null
+++ b/public/emoji/1f647-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f647-1f3fe.png b/public/emoji/1f647-1f3fe.png
deleted file mode 100644
index 683795ff40..0000000000
Binary files a/public/emoji/1f647-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f647-1f3fe.svg b/public/emoji/1f647-1f3fe.svg
index 090651faac..851dae93d6 100644
--- a/public/emoji/1f647-1f3fe.svg
+++ b/public/emoji/1f647-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f647-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f647-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..1d3cfa1f1a
--- /dev/null
+++ b/public/emoji/1f647-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f647-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f647-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..8fea01051f
--- /dev/null
+++ b/public/emoji/1f647-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f647-1f3ff.png b/public/emoji/1f647-1f3ff.png
deleted file mode 100644
index 7969d97175..0000000000
Binary files a/public/emoji/1f647-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f647-1f3ff.svg b/public/emoji/1f647-1f3ff.svg
index f726d47a80..8fea01051f 100644
--- a/public/emoji/1f647-1f3ff.svg
+++ b/public/emoji/1f647-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f647-200d-2640-fe0f.svg b/public/emoji/1f647-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..f4353ee985
--- /dev/null
+++ b/public/emoji/1f647-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f647-200d-2642-fe0f.svg b/public/emoji/1f647-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..da2f281d4b
--- /dev/null
+++ b/public/emoji/1f647-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f647.png b/public/emoji/1f647.png
deleted file mode 100644
index d8f793088d..0000000000
Binary files a/public/emoji/1f647.png and /dev/null differ
diff --git a/public/emoji/1f647.svg b/public/emoji/1f647.svg
index e5dedddd30..da2f281d4b 100644
--- a/public/emoji/1f647.svg
+++ b/public/emoji/1f647.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f648.png b/public/emoji/1f648.png
deleted file mode 100644
index 5187e47453..0000000000
Binary files a/public/emoji/1f648.png and /dev/null differ
diff --git a/public/emoji/1f648.svg b/public/emoji/1f648.svg
index b8b51161e4..1d1f0924e3 100644
--- a/public/emoji/1f648.svg
+++ b/public/emoji/1f648.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f649.png b/public/emoji/1f649.png
deleted file mode 100644
index 74b6be0c6c..0000000000
Binary files a/public/emoji/1f649.png and /dev/null differ
diff --git a/public/emoji/1f649.svg b/public/emoji/1f649.svg
index ab6b6844c8..db494cc26d 100644
--- a/public/emoji/1f649.svg
+++ b/public/emoji/1f649.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64a.png b/public/emoji/1f64a.png
deleted file mode 100644
index 9d9e07c974..0000000000
Binary files a/public/emoji/1f64a.png and /dev/null differ
diff --git a/public/emoji/1f64a.svg b/public/emoji/1f64a.svg
index 47df40a8c8..7c87f05eb8 100644
--- a/public/emoji/1f64a.svg
+++ b/public/emoji/1f64a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f64b-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..231fcade40
--- /dev/null
+++ b/public/emoji/1f64b-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f64b-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..ef3c817b00
--- /dev/null
+++ b/public/emoji/1f64b-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3fb.png b/public/emoji/1f64b-1f3fb.png
deleted file mode 100644
index 1c90e3e268..0000000000
Binary files a/public/emoji/1f64b-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f64b-1f3fb.svg b/public/emoji/1f64b-1f3fb.svg
index e9e7e3b3af..231fcade40 100644
--- a/public/emoji/1f64b-1f3fb.svg
+++ b/public/emoji/1f64b-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f64b-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..7157d7421d
--- /dev/null
+++ b/public/emoji/1f64b-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f64b-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..a0915c0712
--- /dev/null
+++ b/public/emoji/1f64b-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3fc.png b/public/emoji/1f64b-1f3fc.png
deleted file mode 100644
index 82c3ef2bfc..0000000000
Binary files a/public/emoji/1f64b-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f64b-1f3fc.svg b/public/emoji/1f64b-1f3fc.svg
index 9e6ac9c2ca..7157d7421d 100644
--- a/public/emoji/1f64b-1f3fc.svg
+++ b/public/emoji/1f64b-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f64b-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..45eb562ca9
--- /dev/null
+++ b/public/emoji/1f64b-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f64b-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..c9634b8d64
--- /dev/null
+++ b/public/emoji/1f64b-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3fd.png b/public/emoji/1f64b-1f3fd.png
deleted file mode 100644
index 1b1da2aa0c..0000000000
Binary files a/public/emoji/1f64b-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f64b-1f3fd.svg b/public/emoji/1f64b-1f3fd.svg
index d4e4a75f81..45eb562ca9 100644
--- a/public/emoji/1f64b-1f3fd.svg
+++ b/public/emoji/1f64b-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f64b-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..7d3b14a387
--- /dev/null
+++ b/public/emoji/1f64b-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f64b-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..7b2c719bd5
--- /dev/null
+++ b/public/emoji/1f64b-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3fe.png b/public/emoji/1f64b-1f3fe.png
deleted file mode 100644
index e453855c01..0000000000
Binary files a/public/emoji/1f64b-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f64b-1f3fe.svg b/public/emoji/1f64b-1f3fe.svg
index 39a1150008..7d3b14a387 100644
--- a/public/emoji/1f64b-1f3fe.svg
+++ b/public/emoji/1f64b-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f64b-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..1dd14746a2
--- /dev/null
+++ b/public/emoji/1f64b-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f64b-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..ce0d45a1d2
--- /dev/null
+++ b/public/emoji/1f64b-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64b-1f3ff.png b/public/emoji/1f64b-1f3ff.png
deleted file mode 100644
index b86200fd84..0000000000
Binary files a/public/emoji/1f64b-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f64b-1f3ff.svg b/public/emoji/1f64b-1f3ff.svg
index f8cb017efd..1dd14746a2 100644
--- a/public/emoji/1f64b-1f3ff.svg
+++ b/public/emoji/1f64b-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64b-200d-2640-fe0f.svg b/public/emoji/1f64b-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..e1a2f19dc7
--- /dev/null
+++ b/public/emoji/1f64b-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64b-200d-2642-fe0f.svg b/public/emoji/1f64b-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..9f9aea0bf4
--- /dev/null
+++ b/public/emoji/1f64b-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64b.png b/public/emoji/1f64b.png
deleted file mode 100644
index 2880708c0c..0000000000
Binary files a/public/emoji/1f64b.png and /dev/null differ
diff --git a/public/emoji/1f64b.svg b/public/emoji/1f64b.svg
index d221b1846d..e1a2f19dc7 100644
--- a/public/emoji/1f64b.svg
+++ b/public/emoji/1f64b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64c-1f3fb.png b/public/emoji/1f64c-1f3fb.png
deleted file mode 100644
index 1168b8236b..0000000000
Binary files a/public/emoji/1f64c-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f64c-1f3fb.svg b/public/emoji/1f64c-1f3fb.svg
index 2bec077d90..4a0b194f13 100644
--- a/public/emoji/1f64c-1f3fb.svg
+++ b/public/emoji/1f64c-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64c-1f3fc.png b/public/emoji/1f64c-1f3fc.png
deleted file mode 100644
index 322de62290..0000000000
Binary files a/public/emoji/1f64c-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f64c-1f3fc.svg b/public/emoji/1f64c-1f3fc.svg
index f90b8825c1..077ea85a02 100644
--- a/public/emoji/1f64c-1f3fc.svg
+++ b/public/emoji/1f64c-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64c-1f3fd.png b/public/emoji/1f64c-1f3fd.png
deleted file mode 100644
index 2aa24e05ae..0000000000
Binary files a/public/emoji/1f64c-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f64c-1f3fd.svg b/public/emoji/1f64c-1f3fd.svg
index 0b0ed18ce4..8b2e1e9ebd 100644
--- a/public/emoji/1f64c-1f3fd.svg
+++ b/public/emoji/1f64c-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64c-1f3fe.png b/public/emoji/1f64c-1f3fe.png
deleted file mode 100644
index f31bf0db99..0000000000
Binary files a/public/emoji/1f64c-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f64c-1f3fe.svg b/public/emoji/1f64c-1f3fe.svg
index 413708003b..e5b98fcfca 100644
--- a/public/emoji/1f64c-1f3fe.svg
+++ b/public/emoji/1f64c-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64c-1f3ff.png b/public/emoji/1f64c-1f3ff.png
deleted file mode 100644
index 5e95067f98..0000000000
Binary files a/public/emoji/1f64c-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f64c-1f3ff.svg b/public/emoji/1f64c-1f3ff.svg
index e13a1d7b3b..65e7f1b2dc 100644
--- a/public/emoji/1f64c-1f3ff.svg
+++ b/public/emoji/1f64c-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64c.png b/public/emoji/1f64c.png
deleted file mode 100644
index c0155f728e..0000000000
Binary files a/public/emoji/1f64c.png and /dev/null differ
diff --git a/public/emoji/1f64c.svg b/public/emoji/1f64c.svg
index 0f7f86cfd6..4ff308a9de 100644
--- a/public/emoji/1f64c.svg
+++ b/public/emoji/1f64c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f64d-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..ba73233300
--- /dev/null
+++ b/public/emoji/1f64d-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f64d-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..174369312a
--- /dev/null
+++ b/public/emoji/1f64d-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3fb.png b/public/emoji/1f64d-1f3fb.png
deleted file mode 100644
index 21d3bb4392..0000000000
Binary files a/public/emoji/1f64d-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f64d-1f3fb.svg b/public/emoji/1f64d-1f3fb.svg
index 7a858ef2c8..ba73233300 100644
--- a/public/emoji/1f64d-1f3fb.svg
+++ b/public/emoji/1f64d-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f64d-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..31ad900f61
--- /dev/null
+++ b/public/emoji/1f64d-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f64d-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..461dd9dc17
--- /dev/null
+++ b/public/emoji/1f64d-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3fc.png b/public/emoji/1f64d-1f3fc.png
deleted file mode 100644
index 973f5fc838..0000000000
Binary files a/public/emoji/1f64d-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f64d-1f3fc.svg b/public/emoji/1f64d-1f3fc.svg
index 10458b13f4..31ad900f61 100644
--- a/public/emoji/1f64d-1f3fc.svg
+++ b/public/emoji/1f64d-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f64d-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..46f7a8c8d9
--- /dev/null
+++ b/public/emoji/1f64d-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f64d-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..aa1741bc7a
--- /dev/null
+++ b/public/emoji/1f64d-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3fd.png b/public/emoji/1f64d-1f3fd.png
deleted file mode 100644
index 41fbcc7881..0000000000
Binary files a/public/emoji/1f64d-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f64d-1f3fd.svg b/public/emoji/1f64d-1f3fd.svg
index f9842d0e4c..46f7a8c8d9 100644
--- a/public/emoji/1f64d-1f3fd.svg
+++ b/public/emoji/1f64d-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f64d-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..5e2e2fb7a8
--- /dev/null
+++ b/public/emoji/1f64d-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f64d-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..2fb851f37a
--- /dev/null
+++ b/public/emoji/1f64d-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3fe.png b/public/emoji/1f64d-1f3fe.png
deleted file mode 100644
index 5a37c74103..0000000000
Binary files a/public/emoji/1f64d-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f64d-1f3fe.svg b/public/emoji/1f64d-1f3fe.svg
index 57de38b919..5e2e2fb7a8 100644
--- a/public/emoji/1f64d-1f3fe.svg
+++ b/public/emoji/1f64d-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f64d-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..e6acfa6f62
--- /dev/null
+++ b/public/emoji/1f64d-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f64d-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..3a24ff123b
--- /dev/null
+++ b/public/emoji/1f64d-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64d-1f3ff.png b/public/emoji/1f64d-1f3ff.png
deleted file mode 100644
index e08141f3ef..0000000000
Binary files a/public/emoji/1f64d-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f64d-1f3ff.svg b/public/emoji/1f64d-1f3ff.svg
index 64af62a9b6..e6acfa6f62 100644
--- a/public/emoji/1f64d-1f3ff.svg
+++ b/public/emoji/1f64d-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64d-200d-2640-fe0f.svg b/public/emoji/1f64d-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..293e6e48c4
--- /dev/null
+++ b/public/emoji/1f64d-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64d-200d-2642-fe0f.svg b/public/emoji/1f64d-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..2ae727a4aa
--- /dev/null
+++ b/public/emoji/1f64d-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64d.png b/public/emoji/1f64d.png
deleted file mode 100644
index 579324959a..0000000000
Binary files a/public/emoji/1f64d.png and /dev/null differ
diff --git a/public/emoji/1f64d.svg b/public/emoji/1f64d.svg
index 6309a63219..293e6e48c4 100644
--- a/public/emoji/1f64d.svg
+++ b/public/emoji/1f64d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f64e-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..08dd179a04
--- /dev/null
+++ b/public/emoji/1f64e-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f64e-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..262ae3afec
--- /dev/null
+++ b/public/emoji/1f64e-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3fb.png b/public/emoji/1f64e-1f3fb.png
deleted file mode 100644
index 57e826b75a..0000000000
Binary files a/public/emoji/1f64e-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f64e-1f3fb.svg b/public/emoji/1f64e-1f3fb.svg
index 8d869fd6e4..08dd179a04 100644
--- a/public/emoji/1f64e-1f3fb.svg
+++ b/public/emoji/1f64e-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f64e-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..497b5f03b6
--- /dev/null
+++ b/public/emoji/1f64e-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f64e-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..b6acfce325
--- /dev/null
+++ b/public/emoji/1f64e-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3fc.png b/public/emoji/1f64e-1f3fc.png
deleted file mode 100644
index 3f317c0c25..0000000000
Binary files a/public/emoji/1f64e-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f64e-1f3fc.svg b/public/emoji/1f64e-1f3fc.svg
index 2dfd81c70d..497b5f03b6 100644
--- a/public/emoji/1f64e-1f3fc.svg
+++ b/public/emoji/1f64e-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f64e-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..d034260afc
--- /dev/null
+++ b/public/emoji/1f64e-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f64e-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..206cae502e
--- /dev/null
+++ b/public/emoji/1f64e-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3fd.png b/public/emoji/1f64e-1f3fd.png
deleted file mode 100644
index d2fbb6c20b..0000000000
Binary files a/public/emoji/1f64e-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f64e-1f3fd.svg b/public/emoji/1f64e-1f3fd.svg
index 7cf16e6813..d034260afc 100644
--- a/public/emoji/1f64e-1f3fd.svg
+++ b/public/emoji/1f64e-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f64e-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..88f0cbf524
--- /dev/null
+++ b/public/emoji/1f64e-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f64e-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..f66526e39f
--- /dev/null
+++ b/public/emoji/1f64e-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3fe.png b/public/emoji/1f64e-1f3fe.png
deleted file mode 100644
index 643ceb4a5c..0000000000
Binary files a/public/emoji/1f64e-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f64e-1f3fe.svg b/public/emoji/1f64e-1f3fe.svg
index 84d91ba6a4..88f0cbf524 100644
--- a/public/emoji/1f64e-1f3fe.svg
+++ b/public/emoji/1f64e-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f64e-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..2adddb911a
--- /dev/null
+++ b/public/emoji/1f64e-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f64e-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..8bc4352d58
--- /dev/null
+++ b/public/emoji/1f64e-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64e-1f3ff.png b/public/emoji/1f64e-1f3ff.png
deleted file mode 100644
index b2eb6859c3..0000000000
Binary files a/public/emoji/1f64e-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f64e-1f3ff.svg b/public/emoji/1f64e-1f3ff.svg
index 00882dd2fa..2adddb911a 100644
--- a/public/emoji/1f64e-1f3ff.svg
+++ b/public/emoji/1f64e-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64e-200d-2640-fe0f.svg b/public/emoji/1f64e-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..f63e4da853
--- /dev/null
+++ b/public/emoji/1f64e-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64e-200d-2642-fe0f.svg b/public/emoji/1f64e-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..5f5c1e1d9f
--- /dev/null
+++ b/public/emoji/1f64e-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f64e.png b/public/emoji/1f64e.png
deleted file mode 100644
index 10eb057107..0000000000
Binary files a/public/emoji/1f64e.png and /dev/null differ
diff --git a/public/emoji/1f64e.svg b/public/emoji/1f64e.svg
index b23b54491b..f63e4da853 100644
--- a/public/emoji/1f64e.svg
+++ b/public/emoji/1f64e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64f-1f3fb.png b/public/emoji/1f64f-1f3fb.png
deleted file mode 100644
index 060ef25717..0000000000
Binary files a/public/emoji/1f64f-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f64f-1f3fb.svg b/public/emoji/1f64f-1f3fb.svg
index eddfe82f00..15e30c292e 100644
--- a/public/emoji/1f64f-1f3fb.svg
+++ b/public/emoji/1f64f-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64f-1f3fc.png b/public/emoji/1f64f-1f3fc.png
deleted file mode 100644
index 56dc607c07..0000000000
Binary files a/public/emoji/1f64f-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f64f-1f3fc.svg b/public/emoji/1f64f-1f3fc.svg
index 05011796d3..24fc1b4947 100644
--- a/public/emoji/1f64f-1f3fc.svg
+++ b/public/emoji/1f64f-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64f-1f3fd.png b/public/emoji/1f64f-1f3fd.png
deleted file mode 100644
index 0f33b86200..0000000000
Binary files a/public/emoji/1f64f-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f64f-1f3fd.svg b/public/emoji/1f64f-1f3fd.svg
index 40c74cf906..00a919804a 100644
--- a/public/emoji/1f64f-1f3fd.svg
+++ b/public/emoji/1f64f-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64f-1f3fe.png b/public/emoji/1f64f-1f3fe.png
deleted file mode 100644
index 2ea8dc1165..0000000000
Binary files a/public/emoji/1f64f-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f64f-1f3fe.svg b/public/emoji/1f64f-1f3fe.svg
index 1e8149f520..f18b44e140 100644
--- a/public/emoji/1f64f-1f3fe.svg
+++ b/public/emoji/1f64f-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64f-1f3ff.png b/public/emoji/1f64f-1f3ff.png
deleted file mode 100644
index 2128a6c470..0000000000
Binary files a/public/emoji/1f64f-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f64f-1f3ff.svg b/public/emoji/1f64f-1f3ff.svg
index 3c7a1b6cb9..f92564f7fe 100644
--- a/public/emoji/1f64f-1f3ff.svg
+++ b/public/emoji/1f64f-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f64f.png b/public/emoji/1f64f.png
deleted file mode 100644
index 8347f2435b..0000000000
Binary files a/public/emoji/1f64f.png and /dev/null differ
diff --git a/public/emoji/1f64f.svg b/public/emoji/1f64f.svg
index a6b0bca048..085c2c9726 100644
--- a/public/emoji/1f64f.svg
+++ b/public/emoji/1f64f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f680.png b/public/emoji/1f680.png
deleted file mode 100644
index 0d8da089a3..0000000000
Binary files a/public/emoji/1f680.png and /dev/null differ
diff --git a/public/emoji/1f680.svg b/public/emoji/1f680.svg
index 4ba418a05a..b26ded5ccb 100644
--- a/public/emoji/1f680.svg
+++ b/public/emoji/1f680.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f681.png b/public/emoji/1f681.png
deleted file mode 100644
index 7ec5f39a51..0000000000
Binary files a/public/emoji/1f681.png and /dev/null differ
diff --git a/public/emoji/1f681.svg b/public/emoji/1f681.svg
index fa2ce38e44..cf0480df52 100644
--- a/public/emoji/1f681.svg
+++ b/public/emoji/1f681.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f682.png b/public/emoji/1f682.png
deleted file mode 100644
index 9ac0d999c4..0000000000
Binary files a/public/emoji/1f682.png and /dev/null differ
diff --git a/public/emoji/1f682.svg b/public/emoji/1f682.svg
index 829f6e2aa2..2ea090c6f1 100644
--- a/public/emoji/1f682.svg
+++ b/public/emoji/1f682.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f683.png b/public/emoji/1f683.png
deleted file mode 100644
index a9acbf1300..0000000000
Binary files a/public/emoji/1f683.png and /dev/null differ
diff --git a/public/emoji/1f683.svg b/public/emoji/1f683.svg
index 8042882656..30f3c027be 100644
--- a/public/emoji/1f683.svg
+++ b/public/emoji/1f683.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f684.png b/public/emoji/1f684.png
deleted file mode 100644
index ed61c67bf0..0000000000
Binary files a/public/emoji/1f684.png and /dev/null differ
diff --git a/public/emoji/1f684.svg b/public/emoji/1f684.svg
index 291c00a185..e2c14f916f 100644
--- a/public/emoji/1f684.svg
+++ b/public/emoji/1f684.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f685.png b/public/emoji/1f685.png
deleted file mode 100644
index 4f698e056f..0000000000
Binary files a/public/emoji/1f685.png and /dev/null differ
diff --git a/public/emoji/1f685.svg b/public/emoji/1f685.svg
index e6e4a7a6ac..cc80bc4aaa 100644
--- a/public/emoji/1f685.svg
+++ b/public/emoji/1f685.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f686.png b/public/emoji/1f686.png
deleted file mode 100644
index 367c7bc5d3..0000000000
Binary files a/public/emoji/1f686.png and /dev/null differ
diff --git a/public/emoji/1f686.svg b/public/emoji/1f686.svg
index 15d5e1ebbe..647ab08153 100644
--- a/public/emoji/1f686.svg
+++ b/public/emoji/1f686.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f687.png b/public/emoji/1f687.png
deleted file mode 100644
index 1de8f0551f..0000000000
Binary files a/public/emoji/1f687.png and /dev/null differ
diff --git a/public/emoji/1f687.svg b/public/emoji/1f687.svg
index 5f075abdae..60c3d8268b 100644
--- a/public/emoji/1f687.svg
+++ b/public/emoji/1f687.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f688.png b/public/emoji/1f688.png
deleted file mode 100644
index a64829f507..0000000000
Binary files a/public/emoji/1f688.png and /dev/null differ
diff --git a/public/emoji/1f688.svg b/public/emoji/1f688.svg
index f5fc3b02b4..cb6e6d42b3 100644
--- a/public/emoji/1f688.svg
+++ b/public/emoji/1f688.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f689.png b/public/emoji/1f689.png
deleted file mode 100644
index 5c26fee529..0000000000
Binary files a/public/emoji/1f689.png and /dev/null differ
diff --git a/public/emoji/1f689.svg b/public/emoji/1f689.svg
index 6c3953aa30..1c5c465c00 100644
--- a/public/emoji/1f689.svg
+++ b/public/emoji/1f689.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f68a.png b/public/emoji/1f68a.png
deleted file mode 100644
index b6f0e69038..0000000000
Binary files a/public/emoji/1f68a.png and /dev/null differ
diff --git a/public/emoji/1f68a.svg b/public/emoji/1f68a.svg
index e98a079b01..829df7f8d4 100644
--- a/public/emoji/1f68a.svg
+++ b/public/emoji/1f68a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f68b.png b/public/emoji/1f68b.png
deleted file mode 100644
index 3c80321f7e..0000000000
Binary files a/public/emoji/1f68b.png and /dev/null differ
diff --git a/public/emoji/1f68b.svg b/public/emoji/1f68b.svg
index 8c64b51112..5cb3696fd6 100644
--- a/public/emoji/1f68b.svg
+++ b/public/emoji/1f68b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f68c.png b/public/emoji/1f68c.png
deleted file mode 100644
index 641ddc56ca..0000000000
Binary files a/public/emoji/1f68c.png and /dev/null differ
diff --git a/public/emoji/1f68c.svg b/public/emoji/1f68c.svg
index 99862d5116..8b5db4e4b4 100644
--- a/public/emoji/1f68c.svg
+++ b/public/emoji/1f68c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f68d.png b/public/emoji/1f68d.png
deleted file mode 100644
index ad91e256c7..0000000000
Binary files a/public/emoji/1f68d.png and /dev/null differ
diff --git a/public/emoji/1f68d.svg b/public/emoji/1f68d.svg
index d2d2f59c74..7bde4113e3 100644
--- a/public/emoji/1f68d.svg
+++ b/public/emoji/1f68d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f68e.png b/public/emoji/1f68e.png
deleted file mode 100644
index 139a9931b5..0000000000
Binary files a/public/emoji/1f68e.png and /dev/null differ
diff --git a/public/emoji/1f68e.svg b/public/emoji/1f68e.svg
index ec3e927f81..bac04094af 100644
--- a/public/emoji/1f68e.svg
+++ b/public/emoji/1f68e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f68f.png b/public/emoji/1f68f.png
deleted file mode 100644
index b2b62208bf..0000000000
Binary files a/public/emoji/1f68f.png and /dev/null differ
diff --git a/public/emoji/1f68f.svg b/public/emoji/1f68f.svg
index 3e9cb1d116..e224dbc7e7 100644
--- a/public/emoji/1f68f.svg
+++ b/public/emoji/1f68f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f690.png b/public/emoji/1f690.png
deleted file mode 100644
index c60dd8f47a..0000000000
Binary files a/public/emoji/1f690.png and /dev/null differ
diff --git a/public/emoji/1f690.svg b/public/emoji/1f690.svg
index 5357258cc3..b2a3b1cc13 100644
--- a/public/emoji/1f690.svg
+++ b/public/emoji/1f690.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f691.png b/public/emoji/1f691.png
deleted file mode 100644
index 6fb8076d76..0000000000
Binary files a/public/emoji/1f691.png and /dev/null differ
diff --git a/public/emoji/1f691.svg b/public/emoji/1f691.svg
index 2bcbcffa60..7c969bef88 100644
--- a/public/emoji/1f691.svg
+++ b/public/emoji/1f691.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f692.png b/public/emoji/1f692.png
deleted file mode 100644
index 2cd45b7cf7..0000000000
Binary files a/public/emoji/1f692.png and /dev/null differ
diff --git a/public/emoji/1f692.svg b/public/emoji/1f692.svg
index d82b254833..a7672c43df 100644
--- a/public/emoji/1f692.svg
+++ b/public/emoji/1f692.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f693.png b/public/emoji/1f693.png
deleted file mode 100644
index 3da4253de7..0000000000
Binary files a/public/emoji/1f693.png and /dev/null differ
diff --git a/public/emoji/1f693.svg b/public/emoji/1f693.svg
index 7964668dff..3241874c6c 100644
--- a/public/emoji/1f693.svg
+++ b/public/emoji/1f693.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f694.png b/public/emoji/1f694.png
deleted file mode 100644
index c9109c85b5..0000000000
Binary files a/public/emoji/1f694.png and /dev/null differ
diff --git a/public/emoji/1f694.svg b/public/emoji/1f694.svg
index 680a097595..91e5aea9c9 100644
--- a/public/emoji/1f694.svg
+++ b/public/emoji/1f694.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f695.png b/public/emoji/1f695.png
deleted file mode 100644
index 55f4cc8479..0000000000
Binary files a/public/emoji/1f695.png and /dev/null differ
diff --git a/public/emoji/1f695.svg b/public/emoji/1f695.svg
index c6bdad8ba9..0d7a21a7c0 100644
--- a/public/emoji/1f695.svg
+++ b/public/emoji/1f695.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f696.png b/public/emoji/1f696.png
deleted file mode 100644
index fea14e4584..0000000000
Binary files a/public/emoji/1f696.png and /dev/null differ
diff --git a/public/emoji/1f696.svg b/public/emoji/1f696.svg
index 6a02e812fd..da0c6c583f 100644
--- a/public/emoji/1f696.svg
+++ b/public/emoji/1f696.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f697.png b/public/emoji/1f697.png
deleted file mode 100644
index b3e6a774de..0000000000
Binary files a/public/emoji/1f697.png and /dev/null differ
diff --git a/public/emoji/1f697.svg b/public/emoji/1f697.svg
index da85c344d2..03e094c257 100644
--- a/public/emoji/1f697.svg
+++ b/public/emoji/1f697.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f698.png b/public/emoji/1f698.png
deleted file mode 100644
index 3c7e1d52e6..0000000000
Binary files a/public/emoji/1f698.png and /dev/null differ
diff --git a/public/emoji/1f698.svg b/public/emoji/1f698.svg
index cd0a8881ad..9adc06efb3 100644
--- a/public/emoji/1f698.svg
+++ b/public/emoji/1f698.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f699.png b/public/emoji/1f699.png
deleted file mode 100644
index e8ba817d39..0000000000
Binary files a/public/emoji/1f699.png and /dev/null differ
diff --git a/public/emoji/1f699.svg b/public/emoji/1f699.svg
index 12d1b6d10d..18d132b01d 100644
--- a/public/emoji/1f699.svg
+++ b/public/emoji/1f699.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f69a.png b/public/emoji/1f69a.png
deleted file mode 100644
index 130de047f8..0000000000
Binary files a/public/emoji/1f69a.png and /dev/null differ
diff --git a/public/emoji/1f69a.svg b/public/emoji/1f69a.svg
index c543e98625..8a0d04a4ae 100644
--- a/public/emoji/1f69a.svg
+++ b/public/emoji/1f69a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f69b.png b/public/emoji/1f69b.png
deleted file mode 100644
index c821731713..0000000000
Binary files a/public/emoji/1f69b.png and /dev/null differ
diff --git a/public/emoji/1f69b.svg b/public/emoji/1f69b.svg
index 5f0fbc1ca6..b5b3522a34 100644
--- a/public/emoji/1f69b.svg
+++ b/public/emoji/1f69b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f69c.png b/public/emoji/1f69c.png
deleted file mode 100644
index c1bf8cae44..0000000000
Binary files a/public/emoji/1f69c.png and /dev/null differ
diff --git a/public/emoji/1f69c.svg b/public/emoji/1f69c.svg
index 794c2d369e..3c2d4ff5b8 100644
--- a/public/emoji/1f69c.svg
+++ b/public/emoji/1f69c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f69d.png b/public/emoji/1f69d.png
deleted file mode 100644
index 11eb1f574b..0000000000
Binary files a/public/emoji/1f69d.png and /dev/null differ
diff --git a/public/emoji/1f69d.svg b/public/emoji/1f69d.svg
index 4244515a24..f7cd69eea4 100644
--- a/public/emoji/1f69d.svg
+++ b/public/emoji/1f69d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f69e.png b/public/emoji/1f69e.png
deleted file mode 100644
index ade2218e46..0000000000
Binary files a/public/emoji/1f69e.png and /dev/null differ
diff --git a/public/emoji/1f69e.svg b/public/emoji/1f69e.svg
index 2bbbd3a020..edab9bc152 100644
--- a/public/emoji/1f69e.svg
+++ b/public/emoji/1f69e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f69f.png b/public/emoji/1f69f.png
deleted file mode 100644
index a59d5f48c2..0000000000
Binary files a/public/emoji/1f69f.png and /dev/null differ
diff --git a/public/emoji/1f69f.svg b/public/emoji/1f69f.svg
index 9f1974860f..f98920fd2e 100644
--- a/public/emoji/1f69f.svg
+++ b/public/emoji/1f69f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a0.png b/public/emoji/1f6a0.png
deleted file mode 100644
index 1dea73ca53..0000000000
Binary files a/public/emoji/1f6a0.png and /dev/null differ
diff --git a/public/emoji/1f6a0.svg b/public/emoji/1f6a0.svg
index e8eb108975..58ce005cda 100644
--- a/public/emoji/1f6a0.svg
+++ b/public/emoji/1f6a0.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a1.png b/public/emoji/1f6a1.png
deleted file mode 100644
index 3eb4b61bf1..0000000000
Binary files a/public/emoji/1f6a1.png and /dev/null differ
diff --git a/public/emoji/1f6a1.svg b/public/emoji/1f6a1.svg
index 84de8fddf0..c06e2d34a9 100644
--- a/public/emoji/1f6a1.svg
+++ b/public/emoji/1f6a1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a2.png b/public/emoji/1f6a2.png
deleted file mode 100644
index 62d54f7d6c..0000000000
Binary files a/public/emoji/1f6a2.png and /dev/null differ
diff --git a/public/emoji/1f6a2.svg b/public/emoji/1f6a2.svg
index 032a22c98f..015a830cbb 100644
--- a/public/emoji/1f6a2.svg
+++ b/public/emoji/1f6a2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f6a3-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..dc8b2470e1
--- /dev/null
+++ b/public/emoji/1f6a3-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f6a3-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..373293e11e
--- /dev/null
+++ b/public/emoji/1f6a3-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3fb.png b/public/emoji/1f6a3-1f3fb.png
deleted file mode 100644
index 5e5d18548c..0000000000
Binary files a/public/emoji/1f6a3-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f6a3-1f3fb.svg b/public/emoji/1f6a3-1f3fb.svg
index a97ed61b21..373293e11e 100644
--- a/public/emoji/1f6a3-1f3fb.svg
+++ b/public/emoji/1f6a3-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f6a3-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..cbf4088544
--- /dev/null
+++ b/public/emoji/1f6a3-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f6a3-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..afcfc9d112
--- /dev/null
+++ b/public/emoji/1f6a3-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3fc.png b/public/emoji/1f6a3-1f3fc.png
deleted file mode 100644
index 9b123ef887..0000000000
Binary files a/public/emoji/1f6a3-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f6a3-1f3fc.svg b/public/emoji/1f6a3-1f3fc.svg
index 4579d7f998..afcfc9d112 100644
--- a/public/emoji/1f6a3-1f3fc.svg
+++ b/public/emoji/1f6a3-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f6a3-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..dfb4cc90c9
--- /dev/null
+++ b/public/emoji/1f6a3-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f6a3-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..a68a297358
--- /dev/null
+++ b/public/emoji/1f6a3-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3fd.png b/public/emoji/1f6a3-1f3fd.png
deleted file mode 100644
index 8ebd89a55f..0000000000
Binary files a/public/emoji/1f6a3-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f6a3-1f3fd.svg b/public/emoji/1f6a3-1f3fd.svg
index 30f40ace80..a68a297358 100644
--- a/public/emoji/1f6a3-1f3fd.svg
+++ b/public/emoji/1f6a3-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f6a3-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..b8125596f8
--- /dev/null
+++ b/public/emoji/1f6a3-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f6a3-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..4a0bdc0fd8
--- /dev/null
+++ b/public/emoji/1f6a3-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3fe.png b/public/emoji/1f6a3-1f3fe.png
deleted file mode 100644
index 2b0d04f872..0000000000
Binary files a/public/emoji/1f6a3-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f6a3-1f3fe.svg b/public/emoji/1f6a3-1f3fe.svg
index 3b64992808..4a0bdc0fd8 100644
--- a/public/emoji/1f6a3-1f3fe.svg
+++ b/public/emoji/1f6a3-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f6a3-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..ef0025a7fd
--- /dev/null
+++ b/public/emoji/1f6a3-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f6a3-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..11b8650dd1
--- /dev/null
+++ b/public/emoji/1f6a3-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6a3-1f3ff.png b/public/emoji/1f6a3-1f3ff.png
deleted file mode 100644
index b346f2dfc8..0000000000
Binary files a/public/emoji/1f6a3-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f6a3-1f3ff.svg b/public/emoji/1f6a3-1f3ff.svg
index 57bd8c0feb..11b8650dd1 100644
--- a/public/emoji/1f6a3-1f3ff.svg
+++ b/public/emoji/1f6a3-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a3-200d-2640-fe0f.svg b/public/emoji/1f6a3-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..923ed2b077
--- /dev/null
+++ b/public/emoji/1f6a3-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6a3-200d-2642-fe0f.svg b/public/emoji/1f6a3-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..fb16b9148c
--- /dev/null
+++ b/public/emoji/1f6a3-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6a3.png b/public/emoji/1f6a3.png
deleted file mode 100644
index dd4dfc095d..0000000000
Binary files a/public/emoji/1f6a3.png and /dev/null differ
diff --git a/public/emoji/1f6a3.svg b/public/emoji/1f6a3.svg
index 89eb387dc9..fb16b9148c 100644
--- a/public/emoji/1f6a3.svg
+++ b/public/emoji/1f6a3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a4.png b/public/emoji/1f6a4.png
deleted file mode 100644
index 74059d12de..0000000000
Binary files a/public/emoji/1f6a4.png and /dev/null differ
diff --git a/public/emoji/1f6a4.svg b/public/emoji/1f6a4.svg
index 70aa1adc20..796817aa3e 100644
--- a/public/emoji/1f6a4.svg
+++ b/public/emoji/1f6a4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a5.png b/public/emoji/1f6a5.png
deleted file mode 100644
index 6b312285b0..0000000000
Binary files a/public/emoji/1f6a5.png and /dev/null differ
diff --git a/public/emoji/1f6a5.svg b/public/emoji/1f6a5.svg
index 30aa0d0923..d720e00434 100644
--- a/public/emoji/1f6a5.svg
+++ b/public/emoji/1f6a5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a6.png b/public/emoji/1f6a6.png
deleted file mode 100644
index 8085973eec..0000000000
Binary files a/public/emoji/1f6a6.png and /dev/null differ
diff --git a/public/emoji/1f6a6.svg b/public/emoji/1f6a6.svg
index 7f6e697b40..9949ca9275 100644
--- a/public/emoji/1f6a6.svg
+++ b/public/emoji/1f6a6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a7.png b/public/emoji/1f6a7.png
deleted file mode 100644
index ef8db5f471..0000000000
Binary files a/public/emoji/1f6a7.png and /dev/null differ
diff --git a/public/emoji/1f6a7.svg b/public/emoji/1f6a7.svg
index c48a759c1e..39dbfd5af3 100644
--- a/public/emoji/1f6a7.svg
+++ b/public/emoji/1f6a7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a8.png b/public/emoji/1f6a8.png
deleted file mode 100644
index cad66b0afe..0000000000
Binary files a/public/emoji/1f6a8.png and /dev/null differ
diff --git a/public/emoji/1f6a8.svg b/public/emoji/1f6a8.svg
index 2a00519110..dce1260baa 100644
--- a/public/emoji/1f6a8.svg
+++ b/public/emoji/1f6a8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6a9.png b/public/emoji/1f6a9.png
deleted file mode 100644
index c12d8b0688..0000000000
Binary files a/public/emoji/1f6a9.png and /dev/null differ
diff --git a/public/emoji/1f6a9.svg b/public/emoji/1f6a9.svg
index d07347b59a..44a68cf207 100644
--- a/public/emoji/1f6a9.svg
+++ b/public/emoji/1f6a9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6aa.png b/public/emoji/1f6aa.png
deleted file mode 100644
index 36ae3e2749..0000000000
Binary files a/public/emoji/1f6aa.png and /dev/null differ
diff --git a/public/emoji/1f6aa.svg b/public/emoji/1f6aa.svg
index ac7fa2f073..6743f42f6a 100644
--- a/public/emoji/1f6aa.svg
+++ b/public/emoji/1f6aa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6ab.png b/public/emoji/1f6ab.png
deleted file mode 100644
index d2efd65e74..0000000000
Binary files a/public/emoji/1f6ab.png and /dev/null differ
diff --git a/public/emoji/1f6ab.svg b/public/emoji/1f6ab.svg
index 1877e1d63d..deecfc9d54 100644
--- a/public/emoji/1f6ab.svg
+++ b/public/emoji/1f6ab.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6ac.png b/public/emoji/1f6ac.png
deleted file mode 100644
index 910f648c8f..0000000000
Binary files a/public/emoji/1f6ac.png and /dev/null differ
diff --git a/public/emoji/1f6ac.svg b/public/emoji/1f6ac.svg
index 2f44e929de..19d8f162db 100644
--- a/public/emoji/1f6ac.svg
+++ b/public/emoji/1f6ac.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6ad.png b/public/emoji/1f6ad.png
deleted file mode 100644
index 586b8d29d0..0000000000
Binary files a/public/emoji/1f6ad.png and /dev/null differ
diff --git a/public/emoji/1f6ad.svg b/public/emoji/1f6ad.svg
index f02dd41b38..504d2aaf38 100644
--- a/public/emoji/1f6ad.svg
+++ b/public/emoji/1f6ad.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6ae.png b/public/emoji/1f6ae.png
deleted file mode 100644
index 82a84f9a37..0000000000
Binary files a/public/emoji/1f6ae.png and /dev/null differ
diff --git a/public/emoji/1f6ae.svg b/public/emoji/1f6ae.svg
index 54cbd381e1..1a5d6ae557 100644
--- a/public/emoji/1f6ae.svg
+++ b/public/emoji/1f6ae.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6af.png b/public/emoji/1f6af.png
deleted file mode 100644
index 341d2575f4..0000000000
Binary files a/public/emoji/1f6af.png and /dev/null differ
diff --git a/public/emoji/1f6af.svg b/public/emoji/1f6af.svg
index bfc991b078..1e311893a1 100644
--- a/public/emoji/1f6af.svg
+++ b/public/emoji/1f6af.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b0.png b/public/emoji/1f6b0.png
deleted file mode 100644
index 2c61004945..0000000000
Binary files a/public/emoji/1f6b0.png and /dev/null differ
diff --git a/public/emoji/1f6b0.svg b/public/emoji/1f6b0.svg
index 504d3cec07..19c4240e90 100644
--- a/public/emoji/1f6b0.svg
+++ b/public/emoji/1f6b0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b1.png b/public/emoji/1f6b1.png
deleted file mode 100644
index 827d4193f4..0000000000
Binary files a/public/emoji/1f6b1.png and /dev/null differ
diff --git a/public/emoji/1f6b1.svg b/public/emoji/1f6b1.svg
index 0eec893e11..de985691e7 100644
--- a/public/emoji/1f6b1.svg
+++ b/public/emoji/1f6b1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b2.png b/public/emoji/1f6b2.png
deleted file mode 100644
index 556ed70f1a..0000000000
Binary files a/public/emoji/1f6b2.png and /dev/null differ
diff --git a/public/emoji/1f6b2.svg b/public/emoji/1f6b2.svg
index 0a4447d6cd..e5638ad79f 100644
--- a/public/emoji/1f6b2.svg
+++ b/public/emoji/1f6b2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b3.png b/public/emoji/1f6b3.png
deleted file mode 100644
index 19c85421ce..0000000000
Binary files a/public/emoji/1f6b3.png and /dev/null differ
diff --git a/public/emoji/1f6b3.svg b/public/emoji/1f6b3.svg
index 320cc23716..0b1eee9703 100644
--- a/public/emoji/1f6b3.svg
+++ b/public/emoji/1f6b3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f6b4-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..c949abec10
--- /dev/null
+++ b/public/emoji/1f6b4-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f6b4-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..4a6d96ff9c
--- /dev/null
+++ b/public/emoji/1f6b4-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3fb.png b/public/emoji/1f6b4-1f3fb.png
deleted file mode 100644
index decc2f728f..0000000000
Binary files a/public/emoji/1f6b4-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f6b4-1f3fb.svg b/public/emoji/1f6b4-1f3fb.svg
index 23c64dcb0f..4a6d96ff9c 100644
--- a/public/emoji/1f6b4-1f3fb.svg
+++ b/public/emoji/1f6b4-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f6b4-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..10144b26f5
--- /dev/null
+++ b/public/emoji/1f6b4-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f6b4-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..0916f96a4b
--- /dev/null
+++ b/public/emoji/1f6b4-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3fc.png b/public/emoji/1f6b4-1f3fc.png
deleted file mode 100644
index 0067717b80..0000000000
Binary files a/public/emoji/1f6b4-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f6b4-1f3fc.svg b/public/emoji/1f6b4-1f3fc.svg
index 3451fe9ba5..0916f96a4b 100644
--- a/public/emoji/1f6b4-1f3fc.svg
+++ b/public/emoji/1f6b4-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f6b4-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..a14652605a
--- /dev/null
+++ b/public/emoji/1f6b4-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f6b4-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..488a0859f9
--- /dev/null
+++ b/public/emoji/1f6b4-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3fd.png b/public/emoji/1f6b4-1f3fd.png
deleted file mode 100644
index a4f7b5e277..0000000000
Binary files a/public/emoji/1f6b4-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f6b4-1f3fd.svg b/public/emoji/1f6b4-1f3fd.svg
index a5b9598664..488a0859f9 100644
--- a/public/emoji/1f6b4-1f3fd.svg
+++ b/public/emoji/1f6b4-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f6b4-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..f667db53e7
--- /dev/null
+++ b/public/emoji/1f6b4-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f6b4-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..e3989ddb8b
--- /dev/null
+++ b/public/emoji/1f6b4-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3fe.png b/public/emoji/1f6b4-1f3fe.png
deleted file mode 100644
index a3c8a797db..0000000000
Binary files a/public/emoji/1f6b4-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f6b4-1f3fe.svg b/public/emoji/1f6b4-1f3fe.svg
index 1dcaae8621..e3989ddb8b 100644
--- a/public/emoji/1f6b4-1f3fe.svg
+++ b/public/emoji/1f6b4-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f6b4-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..d0be70885e
--- /dev/null
+++ b/public/emoji/1f6b4-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f6b4-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..1c37cb1107
--- /dev/null
+++ b/public/emoji/1f6b4-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b4-1f3ff.png b/public/emoji/1f6b4-1f3ff.png
deleted file mode 100644
index 1606a87405..0000000000
Binary files a/public/emoji/1f6b4-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f6b4-1f3ff.svg b/public/emoji/1f6b4-1f3ff.svg
index 44fc622fed..1c37cb1107 100644
--- a/public/emoji/1f6b4-1f3ff.svg
+++ b/public/emoji/1f6b4-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b4-200d-2640-fe0f.svg b/public/emoji/1f6b4-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..69480c8310
--- /dev/null
+++ b/public/emoji/1f6b4-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b4-200d-2642-fe0f.svg b/public/emoji/1f6b4-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..68ec2c479a
--- /dev/null
+++ b/public/emoji/1f6b4-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b4.png b/public/emoji/1f6b4.png
deleted file mode 100644
index 9274da1104..0000000000
Binary files a/public/emoji/1f6b4.png and /dev/null differ
diff --git a/public/emoji/1f6b4.svg b/public/emoji/1f6b4.svg
index d66ad5c6ce..68ec2c479a 100644
--- a/public/emoji/1f6b4.svg
+++ b/public/emoji/1f6b4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f6b5-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..86185f8508
--- /dev/null
+++ b/public/emoji/1f6b5-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f6b5-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..f65d701a41
--- /dev/null
+++ b/public/emoji/1f6b5-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3fb.png b/public/emoji/1f6b5-1f3fb.png
deleted file mode 100644
index e9f1daf5e4..0000000000
Binary files a/public/emoji/1f6b5-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f6b5-1f3fb.svg b/public/emoji/1f6b5-1f3fb.svg
index 5ce96f5b24..f65d701a41 100644
--- a/public/emoji/1f6b5-1f3fb.svg
+++ b/public/emoji/1f6b5-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f6b5-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..f876528ea1
--- /dev/null
+++ b/public/emoji/1f6b5-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f6b5-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..82785c12e1
--- /dev/null
+++ b/public/emoji/1f6b5-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3fc.png b/public/emoji/1f6b5-1f3fc.png
deleted file mode 100644
index 555b9e29d4..0000000000
Binary files a/public/emoji/1f6b5-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f6b5-1f3fc.svg b/public/emoji/1f6b5-1f3fc.svg
index 9b088b9f7d..82785c12e1 100644
--- a/public/emoji/1f6b5-1f3fc.svg
+++ b/public/emoji/1f6b5-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f6b5-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..29711f85fb
--- /dev/null
+++ b/public/emoji/1f6b5-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f6b5-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..19f190291c
--- /dev/null
+++ b/public/emoji/1f6b5-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3fd.png b/public/emoji/1f6b5-1f3fd.png
deleted file mode 100644
index 7df5508ec8..0000000000
Binary files a/public/emoji/1f6b5-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f6b5-1f3fd.svg b/public/emoji/1f6b5-1f3fd.svg
index 561ba2d1cb..19f190291c 100644
--- a/public/emoji/1f6b5-1f3fd.svg
+++ b/public/emoji/1f6b5-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f6b5-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..89b33acec4
--- /dev/null
+++ b/public/emoji/1f6b5-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f6b5-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..c57df8b116
--- /dev/null
+++ b/public/emoji/1f6b5-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3fe.png b/public/emoji/1f6b5-1f3fe.png
deleted file mode 100644
index f94b345069..0000000000
Binary files a/public/emoji/1f6b5-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f6b5-1f3fe.svg b/public/emoji/1f6b5-1f3fe.svg
index a1153c343f..c57df8b116 100644
--- a/public/emoji/1f6b5-1f3fe.svg
+++ b/public/emoji/1f6b5-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f6b5-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..46b9a62069
--- /dev/null
+++ b/public/emoji/1f6b5-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f6b5-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..86402bd907
--- /dev/null
+++ b/public/emoji/1f6b5-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b5-1f3ff.png b/public/emoji/1f6b5-1f3ff.png
deleted file mode 100644
index 16a45861e1..0000000000
Binary files a/public/emoji/1f6b5-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f6b5-1f3ff.svg b/public/emoji/1f6b5-1f3ff.svg
index ca9993afc3..86402bd907 100644
--- a/public/emoji/1f6b5-1f3ff.svg
+++ b/public/emoji/1f6b5-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b5-200d-2640-fe0f.svg b/public/emoji/1f6b5-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..fa1a7a3984
--- /dev/null
+++ b/public/emoji/1f6b5-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b5-200d-2642-fe0f.svg b/public/emoji/1f6b5-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..ec9d2b0e16
--- /dev/null
+++ b/public/emoji/1f6b5-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b5.png b/public/emoji/1f6b5.png
deleted file mode 100644
index 41d3dc3ac6..0000000000
Binary files a/public/emoji/1f6b5.png and /dev/null differ
diff --git a/public/emoji/1f6b5.svg b/public/emoji/1f6b5.svg
index 0d5eb712df..ec9d2b0e16 100644
--- a/public/emoji/1f6b5.svg
+++ b/public/emoji/1f6b5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f6b6-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..6680792c36
--- /dev/null
+++ b/public/emoji/1f6b6-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f6b6-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..b1ba458912
--- /dev/null
+++ b/public/emoji/1f6b6-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3fb.png b/public/emoji/1f6b6-1f3fb.png
deleted file mode 100644
index 4e391b45a0..0000000000
Binary files a/public/emoji/1f6b6-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f6b6-1f3fb.svg b/public/emoji/1f6b6-1f3fb.svg
index b4d3ddee2d..b1ba458912 100644
--- a/public/emoji/1f6b6-1f3fb.svg
+++ b/public/emoji/1f6b6-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f6b6-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..a6d74f765a
--- /dev/null
+++ b/public/emoji/1f6b6-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f6b6-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..5376c07171
--- /dev/null
+++ b/public/emoji/1f6b6-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3fc.png b/public/emoji/1f6b6-1f3fc.png
deleted file mode 100644
index 31f94a1bce..0000000000
Binary files a/public/emoji/1f6b6-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f6b6-1f3fc.svg b/public/emoji/1f6b6-1f3fc.svg
index 8c15b9be79..5376c07171 100644
--- a/public/emoji/1f6b6-1f3fc.svg
+++ b/public/emoji/1f6b6-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f6b6-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..cab4ccb79d
--- /dev/null
+++ b/public/emoji/1f6b6-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f6b6-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..0bb556b989
--- /dev/null
+++ b/public/emoji/1f6b6-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3fd.png b/public/emoji/1f6b6-1f3fd.png
deleted file mode 100644
index f7ed8e39c2..0000000000
Binary files a/public/emoji/1f6b6-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f6b6-1f3fd.svg b/public/emoji/1f6b6-1f3fd.svg
index 69ef31ca4f..0bb556b989 100644
--- a/public/emoji/1f6b6-1f3fd.svg
+++ b/public/emoji/1f6b6-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f6b6-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..3930cfc730
--- /dev/null
+++ b/public/emoji/1f6b6-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f6b6-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..a1cc9c8222
--- /dev/null
+++ b/public/emoji/1f6b6-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3fe.png b/public/emoji/1f6b6-1f3fe.png
deleted file mode 100644
index e58dc04c7b..0000000000
Binary files a/public/emoji/1f6b6-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f6b6-1f3fe.svg b/public/emoji/1f6b6-1f3fe.svg
index 82b4e83346..a1cc9c8222 100644
--- a/public/emoji/1f6b6-1f3fe.svg
+++ b/public/emoji/1f6b6-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f6b6-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..dcc4ea187a
--- /dev/null
+++ b/public/emoji/1f6b6-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f6b6-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..a1b476a853
--- /dev/null
+++ b/public/emoji/1f6b6-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b6-1f3ff.png b/public/emoji/1f6b6-1f3ff.png
deleted file mode 100644
index ba4e1b58fc..0000000000
Binary files a/public/emoji/1f6b6-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f6b6-1f3ff.svg b/public/emoji/1f6b6-1f3ff.svg
index 454b2a99d7..a1b476a853 100644
--- a/public/emoji/1f6b6-1f3ff.svg
+++ b/public/emoji/1f6b6-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b6-200d-2640-fe0f.svg b/public/emoji/1f6b6-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..8299d1af04
--- /dev/null
+++ b/public/emoji/1f6b6-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b6-200d-2642-fe0f.svg b/public/emoji/1f6b6-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..db08fa81ef
--- /dev/null
+++ b/public/emoji/1f6b6-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6b6.png b/public/emoji/1f6b6.png
deleted file mode 100644
index 06dc169a3f..0000000000
Binary files a/public/emoji/1f6b6.png and /dev/null differ
diff --git a/public/emoji/1f6b6.svg b/public/emoji/1f6b6.svg
index 8ba1d28556..db08fa81ef 100644
--- a/public/emoji/1f6b6.svg
+++ b/public/emoji/1f6b6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b7.png b/public/emoji/1f6b7.png
deleted file mode 100644
index 286aa577a2..0000000000
Binary files a/public/emoji/1f6b7.png and /dev/null differ
diff --git a/public/emoji/1f6b7.svg b/public/emoji/1f6b7.svg
index ff92a91ca0..c857019e42 100644
--- a/public/emoji/1f6b7.svg
+++ b/public/emoji/1f6b7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b8.png b/public/emoji/1f6b8.png
deleted file mode 100644
index fa4c091c7c..0000000000
Binary files a/public/emoji/1f6b8.png and /dev/null differ
diff --git a/public/emoji/1f6b8.svg b/public/emoji/1f6b8.svg
index 8b9b118396..0c007f6138 100644
--- a/public/emoji/1f6b8.svg
+++ b/public/emoji/1f6b8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6b9.png b/public/emoji/1f6b9.png
deleted file mode 100644
index f5a1e1ba0c..0000000000
Binary files a/public/emoji/1f6b9.png and /dev/null differ
diff --git a/public/emoji/1f6b9.svg b/public/emoji/1f6b9.svg
index 962b094007..2cea4e4edd 100644
--- a/public/emoji/1f6b9.svg
+++ b/public/emoji/1f6b9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6ba.png b/public/emoji/1f6ba.png
deleted file mode 100644
index d4ecc22e7b..0000000000
Binary files a/public/emoji/1f6ba.png and /dev/null differ
diff --git a/public/emoji/1f6ba.svg b/public/emoji/1f6ba.svg
index b98439e380..354a204c48 100644
--- a/public/emoji/1f6ba.svg
+++ b/public/emoji/1f6ba.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6bb.png b/public/emoji/1f6bb.png
deleted file mode 100644
index 9588e0f0ef..0000000000
Binary files a/public/emoji/1f6bb.png and /dev/null differ
diff --git a/public/emoji/1f6bb.svg b/public/emoji/1f6bb.svg
index 8ece75fe5b..851ec0cf03 100644
--- a/public/emoji/1f6bb.svg
+++ b/public/emoji/1f6bb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6bc.png b/public/emoji/1f6bc.png
deleted file mode 100644
index 64a10b7171..0000000000
Binary files a/public/emoji/1f6bc.png and /dev/null differ
diff --git a/public/emoji/1f6bc.svg b/public/emoji/1f6bc.svg
index 4741117419..8c6a12e03f 100644
--- a/public/emoji/1f6bc.svg
+++ b/public/emoji/1f6bc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6bd.png b/public/emoji/1f6bd.png
deleted file mode 100644
index 1392f76183..0000000000
Binary files a/public/emoji/1f6bd.png and /dev/null differ
diff --git a/public/emoji/1f6bd.svg b/public/emoji/1f6bd.svg
index 5a108e201c..7caf812079 100644
--- a/public/emoji/1f6bd.svg
+++ b/public/emoji/1f6bd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6be.png b/public/emoji/1f6be.png
deleted file mode 100644
index aa433e84ba..0000000000
Binary files a/public/emoji/1f6be.png and /dev/null differ
diff --git a/public/emoji/1f6be.svg b/public/emoji/1f6be.svg
index 71390fb19f..791c101222 100644
--- a/public/emoji/1f6be.svg
+++ b/public/emoji/1f6be.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6bf.png b/public/emoji/1f6bf.png
deleted file mode 100644
index 156776a2e5..0000000000
Binary files a/public/emoji/1f6bf.png and /dev/null differ
diff --git a/public/emoji/1f6bf.svg b/public/emoji/1f6bf.svg
index dd21474ebd..e4bf5e2236 100644
--- a/public/emoji/1f6bf.svg
+++ b/public/emoji/1f6bf.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6c0-1f3fb.png b/public/emoji/1f6c0-1f3fb.png
deleted file mode 100644
index 2152eabf2f..0000000000
Binary files a/public/emoji/1f6c0-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f6c0-1f3fb.svg b/public/emoji/1f6c0-1f3fb.svg
index fa9921fc40..8f47a3cfaf 100644
--- a/public/emoji/1f6c0-1f3fb.svg
+++ b/public/emoji/1f6c0-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6c0-1f3fc.png b/public/emoji/1f6c0-1f3fc.png
deleted file mode 100644
index 2102e6133e..0000000000
Binary files a/public/emoji/1f6c0-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f6c0-1f3fc.svg b/public/emoji/1f6c0-1f3fc.svg
index 62648e5590..958169f37f 100644
--- a/public/emoji/1f6c0-1f3fc.svg
+++ b/public/emoji/1f6c0-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6c0-1f3fd.png b/public/emoji/1f6c0-1f3fd.png
deleted file mode 100644
index fae66181e9..0000000000
Binary files a/public/emoji/1f6c0-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f6c0-1f3fd.svg b/public/emoji/1f6c0-1f3fd.svg
index 4c4957f24f..2975ade603 100644
--- a/public/emoji/1f6c0-1f3fd.svg
+++ b/public/emoji/1f6c0-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6c0-1f3fe.png b/public/emoji/1f6c0-1f3fe.png
deleted file mode 100644
index 1f8959d0d9..0000000000
Binary files a/public/emoji/1f6c0-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f6c0-1f3fe.svg b/public/emoji/1f6c0-1f3fe.svg
index 43c665f094..30a4a8cd3b 100644
--- a/public/emoji/1f6c0-1f3fe.svg
+++ b/public/emoji/1f6c0-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6c0-1f3ff.png b/public/emoji/1f6c0-1f3ff.png
deleted file mode 100644
index c8a08e84f2..0000000000
Binary files a/public/emoji/1f6c0-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f6c0-1f3ff.svg b/public/emoji/1f6c0-1f3ff.svg
index c03631844c..15ae1a6e42 100644
--- a/public/emoji/1f6c0-1f3ff.svg
+++ b/public/emoji/1f6c0-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6c0.png b/public/emoji/1f6c0.png
deleted file mode 100644
index 43fba5c8a2..0000000000
Binary files a/public/emoji/1f6c0.png and /dev/null differ
diff --git a/public/emoji/1f6c0.svg b/public/emoji/1f6c0.svg
index 6985f1feef..be47a8dda6 100644
--- a/public/emoji/1f6c0.svg
+++ b/public/emoji/1f6c0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6c1.png b/public/emoji/1f6c1.png
deleted file mode 100644
index 9a5f09361e..0000000000
Binary files a/public/emoji/1f6c1.png and /dev/null differ
diff --git a/public/emoji/1f6c1.svg b/public/emoji/1f6c1.svg
index cef7b67c38..baa62d48e2 100644
--- a/public/emoji/1f6c1.svg
+++ b/public/emoji/1f6c1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6c2.png b/public/emoji/1f6c2.png
deleted file mode 100644
index 079e34ee4d..0000000000
Binary files a/public/emoji/1f6c2.png and /dev/null differ
diff --git a/public/emoji/1f6c2.svg b/public/emoji/1f6c2.svg
index f29b9c724a..cb55bd4882 100644
--- a/public/emoji/1f6c2.svg
+++ b/public/emoji/1f6c2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6c3.png b/public/emoji/1f6c3.png
deleted file mode 100644
index 21b7ce2c69..0000000000
Binary files a/public/emoji/1f6c3.png and /dev/null differ
diff --git a/public/emoji/1f6c3.svg b/public/emoji/1f6c3.svg
index 618ee799a0..95062ee873 100644
--- a/public/emoji/1f6c3.svg
+++ b/public/emoji/1f6c3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6c4.png b/public/emoji/1f6c4.png
deleted file mode 100644
index 409b593e78..0000000000
Binary files a/public/emoji/1f6c4.png and /dev/null differ
diff --git a/public/emoji/1f6c4.svg b/public/emoji/1f6c4.svg
index b7c8c1cb53..9a0ce13dd9 100644
--- a/public/emoji/1f6c4.svg
+++ b/public/emoji/1f6c4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6c5.png b/public/emoji/1f6c5.png
deleted file mode 100644
index 887b23f3f2..0000000000
Binary files a/public/emoji/1f6c5.png and /dev/null differ
diff --git a/public/emoji/1f6c5.svg b/public/emoji/1f6c5.svg
index dea7416552..c8396313c1 100644
--- a/public/emoji/1f6c5.svg
+++ b/public/emoji/1f6c5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6cb.png b/public/emoji/1f6cb.png
deleted file mode 100644
index 27b19b13bb..0000000000
Binary files a/public/emoji/1f6cb.png and /dev/null differ
diff --git a/public/emoji/1f6cb.svg b/public/emoji/1f6cb.svg
index a33ada16bb..c452194bcd 100644
--- a/public/emoji/1f6cb.svg
+++ b/public/emoji/1f6cb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6cc-1f3fb.svg b/public/emoji/1f6cc-1f3fb.svg
new file mode 100644
index 0000000000..f1b1641693
--- /dev/null
+++ b/public/emoji/1f6cc-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6cc-1f3fc.svg b/public/emoji/1f6cc-1f3fc.svg
new file mode 100644
index 0000000000..cdae6beb8a
--- /dev/null
+++ b/public/emoji/1f6cc-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6cc-1f3fd.svg b/public/emoji/1f6cc-1f3fd.svg
new file mode 100644
index 0000000000..c13dd711fc
--- /dev/null
+++ b/public/emoji/1f6cc-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6cc-1f3fe.svg b/public/emoji/1f6cc-1f3fe.svg
new file mode 100644
index 0000000000..0bde531d05
--- /dev/null
+++ b/public/emoji/1f6cc-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6cc-1f3ff.svg b/public/emoji/1f6cc-1f3ff.svg
new file mode 100644
index 0000000000..cddf398acc
--- /dev/null
+++ b/public/emoji/1f6cc-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6cc.png b/public/emoji/1f6cc.png
deleted file mode 100644
index c739e7fb69..0000000000
Binary files a/public/emoji/1f6cc.png and /dev/null differ
diff --git a/public/emoji/1f6cc.svg b/public/emoji/1f6cc.svg
index 8446d6d7c9..cf6a9fac9f 100644
--- a/public/emoji/1f6cc.svg
+++ b/public/emoji/1f6cc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6cd.png b/public/emoji/1f6cd.png
deleted file mode 100644
index 99f2a2b13a..0000000000
Binary files a/public/emoji/1f6cd.png and /dev/null differ
diff --git a/public/emoji/1f6cd.svg b/public/emoji/1f6cd.svg
index 1daf857d80..0ca3ece26c 100644
--- a/public/emoji/1f6cd.svg
+++ b/public/emoji/1f6cd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6ce.png b/public/emoji/1f6ce.png
deleted file mode 100644
index 6b3297ceaf..0000000000
Binary files a/public/emoji/1f6ce.png and /dev/null differ
diff --git a/public/emoji/1f6ce.svg b/public/emoji/1f6ce.svg
index 96f9fef0b6..dab1704eef 100644
--- a/public/emoji/1f6ce.svg
+++ b/public/emoji/1f6ce.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6cf.png b/public/emoji/1f6cf.png
deleted file mode 100644
index 86f964e245..0000000000
Binary files a/public/emoji/1f6cf.png and /dev/null differ
diff --git a/public/emoji/1f6cf.svg b/public/emoji/1f6cf.svg
index f2fb4aad66..59bc17175a 100644
--- a/public/emoji/1f6cf.svg
+++ b/public/emoji/1f6cf.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6d0.png b/public/emoji/1f6d0.png
deleted file mode 100644
index 207d59cce8..0000000000
Binary files a/public/emoji/1f6d0.png and /dev/null differ
diff --git a/public/emoji/1f6d0.svg b/public/emoji/1f6d0.svg
index 65314e5f64..0ec8b1a12d 100644
--- a/public/emoji/1f6d0.svg
+++ b/public/emoji/1f6d0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6d1.png b/public/emoji/1f6d1.png
deleted file mode 100644
index 5ed6100404..0000000000
Binary files a/public/emoji/1f6d1.png and /dev/null differ
diff --git a/public/emoji/1f6d1.svg b/public/emoji/1f6d1.svg
index 4107a857f1..96da3bba8b 100644
--- a/public/emoji/1f6d1.svg
+++ b/public/emoji/1f6d1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6d2.png b/public/emoji/1f6d2.png
deleted file mode 100644
index 1086fe6e45..0000000000
Binary files a/public/emoji/1f6d2.png and /dev/null differ
diff --git a/public/emoji/1f6d2.svg b/public/emoji/1f6d2.svg
index b820572d75..fa7ec4adfd 100644
--- a/public/emoji/1f6d2.svg
+++ b/public/emoji/1f6d2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6e0.png b/public/emoji/1f6e0.png
deleted file mode 100644
index 3c6049273a..0000000000
Binary files a/public/emoji/1f6e0.png and /dev/null differ
diff --git a/public/emoji/1f6e0.svg b/public/emoji/1f6e0.svg
index af26bdb17b..f7ac133b59 100644
--- a/public/emoji/1f6e0.svg
+++ b/public/emoji/1f6e0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6e1.png b/public/emoji/1f6e1.png
deleted file mode 100644
index 610bf033ce..0000000000
Binary files a/public/emoji/1f6e1.png and /dev/null differ
diff --git a/public/emoji/1f6e1.svg b/public/emoji/1f6e1.svg
index e9a41aa3a1..1f0c881fb4 100644
--- a/public/emoji/1f6e1.svg
+++ b/public/emoji/1f6e1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6e2.png b/public/emoji/1f6e2.png
deleted file mode 100644
index c4c4d42da8..0000000000
Binary files a/public/emoji/1f6e2.png and /dev/null differ
diff --git a/public/emoji/1f6e2.svg b/public/emoji/1f6e2.svg
index c5a60a82c1..9405fe36d0 100644
--- a/public/emoji/1f6e2.svg
+++ b/public/emoji/1f6e2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6e3.png b/public/emoji/1f6e3.png
deleted file mode 100644
index 8c3d3d03e3..0000000000
Binary files a/public/emoji/1f6e3.png and /dev/null differ
diff --git a/public/emoji/1f6e3.svg b/public/emoji/1f6e3.svg
index 2ccec72c45..69e58f8504 100644
--- a/public/emoji/1f6e3.svg
+++ b/public/emoji/1f6e3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6e4.png b/public/emoji/1f6e4.png
deleted file mode 100644
index e1a7a0d143..0000000000
Binary files a/public/emoji/1f6e4.png and /dev/null differ
diff --git a/public/emoji/1f6e4.svg b/public/emoji/1f6e4.svg
index 4828d4248f..f6a4a6b316 100644
--- a/public/emoji/1f6e4.svg
+++ b/public/emoji/1f6e4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6e5.png b/public/emoji/1f6e5.png
deleted file mode 100644
index 0506db1a40..0000000000
Binary files a/public/emoji/1f6e5.png and /dev/null differ
diff --git a/public/emoji/1f6e5.svg b/public/emoji/1f6e5.svg
index db896dbc98..50e7c3d365 100644
--- a/public/emoji/1f6e5.svg
+++ b/public/emoji/1f6e5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6e9.png b/public/emoji/1f6e9.png
deleted file mode 100644
index b731b15e3a..0000000000
Binary files a/public/emoji/1f6e9.png and /dev/null differ
diff --git a/public/emoji/1f6e9.svg b/public/emoji/1f6e9.svg
index 191a114094..2f42c60bf1 100644
--- a/public/emoji/1f6e9.svg
+++ b/public/emoji/1f6e9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6eb.png b/public/emoji/1f6eb.png
deleted file mode 100644
index a5766f9f4a..0000000000
Binary files a/public/emoji/1f6eb.png and /dev/null differ
diff --git a/public/emoji/1f6eb.svg b/public/emoji/1f6eb.svg
index 5220fb3a72..5a76b58c21 100644
--- a/public/emoji/1f6eb.svg
+++ b/public/emoji/1f6eb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6ec.png b/public/emoji/1f6ec.png
deleted file mode 100644
index d66841962f..0000000000
Binary files a/public/emoji/1f6ec.png and /dev/null differ
diff --git a/public/emoji/1f6ec.svg b/public/emoji/1f6ec.svg
index c170f90af8..0493a97eb8 100644
--- a/public/emoji/1f6ec.svg
+++ b/public/emoji/1f6ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6f0.png b/public/emoji/1f6f0.png
deleted file mode 100644
index 4ba55d6e29..0000000000
Binary files a/public/emoji/1f6f0.png and /dev/null differ
diff --git a/public/emoji/1f6f0.svg b/public/emoji/1f6f0.svg
index 1d11f7aa78..d3b7ec6d43 100644
--- a/public/emoji/1f6f0.svg
+++ b/public/emoji/1f6f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6f3.png b/public/emoji/1f6f3.png
deleted file mode 100644
index 19d4acbe40..0000000000
Binary files a/public/emoji/1f6f3.png and /dev/null differ
diff --git a/public/emoji/1f6f3.svg b/public/emoji/1f6f3.svg
index 81b10ac490..cede9fbc3d 100644
--- a/public/emoji/1f6f3.svg
+++ b/public/emoji/1f6f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6f4.png b/public/emoji/1f6f4.png
deleted file mode 100644
index 4ab7ef59cd..0000000000
Binary files a/public/emoji/1f6f4.png and /dev/null differ
diff --git a/public/emoji/1f6f4.svg b/public/emoji/1f6f4.svg
index a0f4a49abe..d23b8a0770 100644
--- a/public/emoji/1f6f4.svg
+++ b/public/emoji/1f6f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6f5.png b/public/emoji/1f6f5.png
deleted file mode 100644
index c5afa72d80..0000000000
Binary files a/public/emoji/1f6f5.png and /dev/null differ
diff --git a/public/emoji/1f6f5.svg b/public/emoji/1f6f5.svg
index 7d7f7383b6..d7b49c603f 100644
--- a/public/emoji/1f6f5.svg
+++ b/public/emoji/1f6f5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6f6.png b/public/emoji/1f6f6.png
deleted file mode 100644
index e26cdb9da6..0000000000
Binary files a/public/emoji/1f6f6.png and /dev/null differ
diff --git a/public/emoji/1f6f6.svg b/public/emoji/1f6f6.svg
index 3d86164533..9ec5a06c67 100644
--- a/public/emoji/1f6f6.svg
+++ b/public/emoji/1f6f6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f6f7.svg b/public/emoji/1f6f7.svg
new file mode 100644
index 0000000000..91f5653730
--- /dev/null
+++ b/public/emoji/1f6f7.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f6f8.svg b/public/emoji/1f6f8.svg
new file mode 100644
index 0000000000..5cc00c6a0f
--- /dev/null
+++ b/public/emoji/1f6f8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f910.png b/public/emoji/1f910.png
deleted file mode 100644
index f8ced2502a..0000000000
Binary files a/public/emoji/1f910.png and /dev/null differ
diff --git a/public/emoji/1f910.svg b/public/emoji/1f910.svg
index 51851ff014..0c238b55fe 100644
--- a/public/emoji/1f910.svg
+++ b/public/emoji/1f910.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f911.png b/public/emoji/1f911.png
deleted file mode 100644
index 75fd1e90cb..0000000000
Binary files a/public/emoji/1f911.png and /dev/null differ
diff --git a/public/emoji/1f911.svg b/public/emoji/1f911.svg
index 19404ab8ec..c3c3f6b6f3 100644
--- a/public/emoji/1f911.svg
+++ b/public/emoji/1f911.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f912.png b/public/emoji/1f912.png
deleted file mode 100644
index 8fc5738756..0000000000
Binary files a/public/emoji/1f912.png and /dev/null differ
diff --git a/public/emoji/1f912.svg b/public/emoji/1f912.svg
index 2b9d9b0beb..37e1ee294c 100644
--- a/public/emoji/1f912.svg
+++ b/public/emoji/1f912.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f913.png b/public/emoji/1f913.png
deleted file mode 100644
index 7820bd581d..0000000000
Binary files a/public/emoji/1f913.png and /dev/null differ
diff --git a/public/emoji/1f913.svg b/public/emoji/1f913.svg
index 1dc83d7646..50cbdd2ba5 100644
--- a/public/emoji/1f913.svg
+++ b/public/emoji/1f913.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f914.png b/public/emoji/1f914.png
deleted file mode 100644
index c18f6fd14a..0000000000
Binary files a/public/emoji/1f914.png and /dev/null differ
diff --git a/public/emoji/1f914.svg b/public/emoji/1f914.svg
index 3b5fe136f6..a7a571aa68 100644
--- a/public/emoji/1f914.svg
+++ b/public/emoji/1f914.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f915.png b/public/emoji/1f915.png
deleted file mode 100644
index 0be723085e..0000000000
Binary files a/public/emoji/1f915.png and /dev/null differ
diff --git a/public/emoji/1f915.svg b/public/emoji/1f915.svg
index 26dfd8cf44..16bec115fd 100644
--- a/public/emoji/1f915.svg
+++ b/public/emoji/1f915.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f916.png b/public/emoji/1f916.png
deleted file mode 100644
index 7cc62612c6..0000000000
Binary files a/public/emoji/1f916.png and /dev/null differ
diff --git a/public/emoji/1f916.svg b/public/emoji/1f916.svg
index 047eae18ff..9a9cf4b3ec 100644
--- a/public/emoji/1f916.svg
+++ b/public/emoji/1f916.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f917.png b/public/emoji/1f917.png
deleted file mode 100644
index 5bba6dc6d5..0000000000
Binary files a/public/emoji/1f917.png and /dev/null differ
diff --git a/public/emoji/1f917.svg b/public/emoji/1f917.svg
index 238b5a7825..cc3524873e 100644
--- a/public/emoji/1f917.svg
+++ b/public/emoji/1f917.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f918-1f3fb.png b/public/emoji/1f918-1f3fb.png
deleted file mode 100644
index c080d2addb..0000000000
Binary files a/public/emoji/1f918-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f918-1f3fb.svg b/public/emoji/1f918-1f3fb.svg
index 2ac3beae05..bcc91553a8 100644
--- a/public/emoji/1f918-1f3fb.svg
+++ b/public/emoji/1f918-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f918-1f3fc.png b/public/emoji/1f918-1f3fc.png
deleted file mode 100644
index 12313529bc..0000000000
Binary files a/public/emoji/1f918-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f918-1f3fc.svg b/public/emoji/1f918-1f3fc.svg
index edbd0b2089..25497767f3 100644
--- a/public/emoji/1f918-1f3fc.svg
+++ b/public/emoji/1f918-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f918-1f3fd.png b/public/emoji/1f918-1f3fd.png
deleted file mode 100644
index ca9be6ae67..0000000000
Binary files a/public/emoji/1f918-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f918-1f3fd.svg b/public/emoji/1f918-1f3fd.svg
index 39f8819a5a..4dbb31ef34 100644
--- a/public/emoji/1f918-1f3fd.svg
+++ b/public/emoji/1f918-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f918-1f3fe.png b/public/emoji/1f918-1f3fe.png
deleted file mode 100644
index abe28cbf89..0000000000
Binary files a/public/emoji/1f918-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f918-1f3fe.svg b/public/emoji/1f918-1f3fe.svg
index b8b1f4500a..e74fe32567 100644
--- a/public/emoji/1f918-1f3fe.svg
+++ b/public/emoji/1f918-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f918-1f3ff.png b/public/emoji/1f918-1f3ff.png
deleted file mode 100644
index 0c6b5dd34e..0000000000
Binary files a/public/emoji/1f918-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f918-1f3ff.svg b/public/emoji/1f918-1f3ff.svg
index 1dfaceff89..8727eccb9c 100644
--- a/public/emoji/1f918-1f3ff.svg
+++ b/public/emoji/1f918-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f918.png b/public/emoji/1f918.png
deleted file mode 100644
index 4aa6e7e0a4..0000000000
Binary files a/public/emoji/1f918.png and /dev/null differ
diff --git a/public/emoji/1f918.svg b/public/emoji/1f918.svg
index 125c338544..ba3822b96f 100644
--- a/public/emoji/1f918.svg
+++ b/public/emoji/1f918.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f919-1f3fb.png b/public/emoji/1f919-1f3fb.png
deleted file mode 100644
index 2c93201181..0000000000
Binary files a/public/emoji/1f919-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f919-1f3fb.svg b/public/emoji/1f919-1f3fb.svg
index 6798a545f6..231703d303 100644
--- a/public/emoji/1f919-1f3fb.svg
+++ b/public/emoji/1f919-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f919-1f3fc.png b/public/emoji/1f919-1f3fc.png
deleted file mode 100644
index c39f45a41e..0000000000
Binary files a/public/emoji/1f919-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f919-1f3fc.svg b/public/emoji/1f919-1f3fc.svg
index 1c604faa35..1e096efd4d 100644
--- a/public/emoji/1f919-1f3fc.svg
+++ b/public/emoji/1f919-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f919-1f3fd.png b/public/emoji/1f919-1f3fd.png
deleted file mode 100644
index 83a57f63c2..0000000000
Binary files a/public/emoji/1f919-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f919-1f3fd.svg b/public/emoji/1f919-1f3fd.svg
index 7270638042..ee2567aa0b 100644
--- a/public/emoji/1f919-1f3fd.svg
+++ b/public/emoji/1f919-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f919-1f3fe.png b/public/emoji/1f919-1f3fe.png
deleted file mode 100644
index 65b3468fe4..0000000000
Binary files a/public/emoji/1f919-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f919-1f3fe.svg b/public/emoji/1f919-1f3fe.svg
index c7d9afa184..b6301bf75b 100644
--- a/public/emoji/1f919-1f3fe.svg
+++ b/public/emoji/1f919-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f919-1f3ff.png b/public/emoji/1f919-1f3ff.png
deleted file mode 100644
index 94ef68ff3b..0000000000
Binary files a/public/emoji/1f919-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f919-1f3ff.svg b/public/emoji/1f919-1f3ff.svg
index 7f95819862..a4126d45e0 100644
--- a/public/emoji/1f919-1f3ff.svg
+++ b/public/emoji/1f919-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f919.png b/public/emoji/1f919.png
deleted file mode 100644
index a10c59ba71..0000000000
Binary files a/public/emoji/1f919.png and /dev/null differ
diff --git a/public/emoji/1f919.svg b/public/emoji/1f919.svg
index 84df19cce0..05c6e76d3b 100644
--- a/public/emoji/1f919.svg
+++ b/public/emoji/1f919.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91a-1f3fb.png b/public/emoji/1f91a-1f3fb.png
deleted file mode 100644
index 813d28499b..0000000000
Binary files a/public/emoji/1f91a-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f91a-1f3fb.svg b/public/emoji/1f91a-1f3fb.svg
index 7a7baa8540..d7767b7b58 100644
--- a/public/emoji/1f91a-1f3fb.svg
+++ b/public/emoji/1f91a-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91a-1f3fc.png b/public/emoji/1f91a-1f3fc.png
deleted file mode 100644
index 192ff795e3..0000000000
Binary files a/public/emoji/1f91a-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f91a-1f3fc.svg b/public/emoji/1f91a-1f3fc.svg
index 7343906b1c..beb8fc5d74 100644
--- a/public/emoji/1f91a-1f3fc.svg
+++ b/public/emoji/1f91a-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91a-1f3fd.png b/public/emoji/1f91a-1f3fd.png
deleted file mode 100644
index 61a727abe6..0000000000
Binary files a/public/emoji/1f91a-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f91a-1f3fd.svg b/public/emoji/1f91a-1f3fd.svg
index 55f936d152..1c62d98f58 100644
--- a/public/emoji/1f91a-1f3fd.svg
+++ b/public/emoji/1f91a-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91a-1f3fe.png b/public/emoji/1f91a-1f3fe.png
deleted file mode 100644
index 2e83da511f..0000000000
Binary files a/public/emoji/1f91a-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f91a-1f3fe.svg b/public/emoji/1f91a-1f3fe.svg
index 6dc3b2210d..1026fca8de 100644
--- a/public/emoji/1f91a-1f3fe.svg
+++ b/public/emoji/1f91a-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91a-1f3ff.png b/public/emoji/1f91a-1f3ff.png
deleted file mode 100644
index d7a5b95a02..0000000000
Binary files a/public/emoji/1f91a-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f91a-1f3ff.svg b/public/emoji/1f91a-1f3ff.svg
index d27a387c6d..0a6024a203 100644
--- a/public/emoji/1f91a-1f3ff.svg
+++ b/public/emoji/1f91a-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91a.png b/public/emoji/1f91a.png
deleted file mode 100644
index 479234294b..0000000000
Binary files a/public/emoji/1f91a.png and /dev/null differ
diff --git a/public/emoji/1f91a.svg b/public/emoji/1f91a.svg
index 74d0015f65..8579efff7a 100644
--- a/public/emoji/1f91a.svg
+++ b/public/emoji/1f91a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91b-1f3fb.png b/public/emoji/1f91b-1f3fb.png
deleted file mode 100644
index 1262a6b4b6..0000000000
Binary files a/public/emoji/1f91b-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f91b-1f3fb.svg b/public/emoji/1f91b-1f3fb.svg
index 00f854072d..2eb0c149a0 100644
--- a/public/emoji/1f91b-1f3fb.svg
+++ b/public/emoji/1f91b-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91b-1f3fc.png b/public/emoji/1f91b-1f3fc.png
deleted file mode 100644
index 40bf70b82b..0000000000
Binary files a/public/emoji/1f91b-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f91b-1f3fc.svg b/public/emoji/1f91b-1f3fc.svg
index 92dd89993e..10dd4d02a4 100644
--- a/public/emoji/1f91b-1f3fc.svg
+++ b/public/emoji/1f91b-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91b-1f3fd.png b/public/emoji/1f91b-1f3fd.png
deleted file mode 100644
index 93f5814511..0000000000
Binary files a/public/emoji/1f91b-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f91b-1f3fd.svg b/public/emoji/1f91b-1f3fd.svg
index 6254ca9ae9..3b4cd2153d 100644
--- a/public/emoji/1f91b-1f3fd.svg
+++ b/public/emoji/1f91b-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91b-1f3fe.png b/public/emoji/1f91b-1f3fe.png
deleted file mode 100644
index d82b5ec91f..0000000000
Binary files a/public/emoji/1f91b-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f91b-1f3fe.svg b/public/emoji/1f91b-1f3fe.svg
index 074eca3480..66bccaef20 100644
--- a/public/emoji/1f91b-1f3fe.svg
+++ b/public/emoji/1f91b-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91b-1f3ff.png b/public/emoji/1f91b-1f3ff.png
deleted file mode 100644
index 09ae4cd492..0000000000
Binary files a/public/emoji/1f91b-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f91b-1f3ff.svg b/public/emoji/1f91b-1f3ff.svg
index 163866bbac..2324d4aeee 100644
--- a/public/emoji/1f91b-1f3ff.svg
+++ b/public/emoji/1f91b-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91b.png b/public/emoji/1f91b.png
deleted file mode 100644
index a9d9fd8d59..0000000000
Binary files a/public/emoji/1f91b.png and /dev/null differ
diff --git a/public/emoji/1f91b.svg b/public/emoji/1f91b.svg
index ea97a80a0b..c554fffc59 100644
--- a/public/emoji/1f91b.svg
+++ b/public/emoji/1f91b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91c-1f3fb.png b/public/emoji/1f91c-1f3fb.png
deleted file mode 100644
index 33ded2f61a..0000000000
Binary files a/public/emoji/1f91c-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f91c-1f3fb.svg b/public/emoji/1f91c-1f3fb.svg
index d3c0de370f..3207b4b584 100644
--- a/public/emoji/1f91c-1f3fb.svg
+++ b/public/emoji/1f91c-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91c-1f3fc.png b/public/emoji/1f91c-1f3fc.png
deleted file mode 100644
index 88054e335c..0000000000
Binary files a/public/emoji/1f91c-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f91c-1f3fc.svg b/public/emoji/1f91c-1f3fc.svg
index 9459974002..678d3db735 100644
--- a/public/emoji/1f91c-1f3fc.svg
+++ b/public/emoji/1f91c-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91c-1f3fd.png b/public/emoji/1f91c-1f3fd.png
deleted file mode 100644
index 84b9f5da7f..0000000000
Binary files a/public/emoji/1f91c-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f91c-1f3fd.svg b/public/emoji/1f91c-1f3fd.svg
index c540bb048a..c619612bdc 100644
--- a/public/emoji/1f91c-1f3fd.svg
+++ b/public/emoji/1f91c-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91c-1f3fe.png b/public/emoji/1f91c-1f3fe.png
deleted file mode 100644
index e741cfea68..0000000000
Binary files a/public/emoji/1f91c-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f91c-1f3fe.svg b/public/emoji/1f91c-1f3fe.svg
index c3a410c28c..e1dc9efa9a 100644
--- a/public/emoji/1f91c-1f3fe.svg
+++ b/public/emoji/1f91c-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91c-1f3ff.png b/public/emoji/1f91c-1f3ff.png
deleted file mode 100644
index cf66d760c1..0000000000
Binary files a/public/emoji/1f91c-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f91c-1f3ff.svg b/public/emoji/1f91c-1f3ff.svg
index 1ff1b64f36..a7b1723c05 100644
--- a/public/emoji/1f91c-1f3ff.svg
+++ b/public/emoji/1f91c-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91c.png b/public/emoji/1f91c.png
deleted file mode 100644
index 754ed066d2..0000000000
Binary files a/public/emoji/1f91c.png and /dev/null differ
diff --git a/public/emoji/1f91c.svg b/public/emoji/1f91c.svg
index 80a75c9cde..a320968b29 100644
--- a/public/emoji/1f91c.svg
+++ b/public/emoji/1f91c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91d-1f3fb.png b/public/emoji/1f91d-1f3fb.png
deleted file mode 100644
index 8f8fbb9bdc..0000000000
Binary files a/public/emoji/1f91d-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f91d-1f3fb.svg b/public/emoji/1f91d-1f3fb.svg
deleted file mode 100644
index bc7cf60e8c..0000000000
--- a/public/emoji/1f91d-1f3fb.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f91d-1f3fc.png b/public/emoji/1f91d-1f3fc.png
deleted file mode 100644
index 336a77a6d7..0000000000
Binary files a/public/emoji/1f91d-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f91d-1f3fc.svg b/public/emoji/1f91d-1f3fc.svg
deleted file mode 100644
index c13f18ba6e..0000000000
--- a/public/emoji/1f91d-1f3fc.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f91d-1f3fd.png b/public/emoji/1f91d-1f3fd.png
deleted file mode 100644
index 95f62d4fec..0000000000
Binary files a/public/emoji/1f91d-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f91d-1f3fd.svg b/public/emoji/1f91d-1f3fd.svg
deleted file mode 100644
index 76871fcba7..0000000000
--- a/public/emoji/1f91d-1f3fd.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f91d-1f3fe.png b/public/emoji/1f91d-1f3fe.png
deleted file mode 100644
index 2b0a643388..0000000000
Binary files a/public/emoji/1f91d-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f91d-1f3fe.svg b/public/emoji/1f91d-1f3fe.svg
deleted file mode 100644
index 45a6c8204b..0000000000
--- a/public/emoji/1f91d-1f3fe.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f91d-1f3ff.png b/public/emoji/1f91d-1f3ff.png
deleted file mode 100644
index 40189ee68e..0000000000
Binary files a/public/emoji/1f91d-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f91d-1f3ff.svg b/public/emoji/1f91d-1f3ff.svg
deleted file mode 100644
index 4444426701..0000000000
--- a/public/emoji/1f91d-1f3ff.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f91d.png b/public/emoji/1f91d.png
deleted file mode 100644
index c5d35fd813..0000000000
Binary files a/public/emoji/1f91d.png and /dev/null differ
diff --git a/public/emoji/1f91d.svg b/public/emoji/1f91d.svg
index 185bf3bc70..d6b87a93f6 100644
--- a/public/emoji/1f91d.svg
+++ b/public/emoji/1f91d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91e-1f3fb.png b/public/emoji/1f91e-1f3fb.png
deleted file mode 100644
index dd2384a6cd..0000000000
Binary files a/public/emoji/1f91e-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f91e-1f3fb.svg b/public/emoji/1f91e-1f3fb.svg
index aa4cd73ac1..571240a9ff 100644
--- a/public/emoji/1f91e-1f3fb.svg
+++ b/public/emoji/1f91e-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91e-1f3fc.png b/public/emoji/1f91e-1f3fc.png
deleted file mode 100644
index 6228401bef..0000000000
Binary files a/public/emoji/1f91e-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f91e-1f3fc.svg b/public/emoji/1f91e-1f3fc.svg
index bf4eff677b..b38874554f 100644
--- a/public/emoji/1f91e-1f3fc.svg
+++ b/public/emoji/1f91e-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91e-1f3fd.png b/public/emoji/1f91e-1f3fd.png
deleted file mode 100644
index b1074da15f..0000000000
Binary files a/public/emoji/1f91e-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f91e-1f3fd.svg b/public/emoji/1f91e-1f3fd.svg
index 5562818e40..6afd877e79 100644
--- a/public/emoji/1f91e-1f3fd.svg
+++ b/public/emoji/1f91e-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91e-1f3fe.png b/public/emoji/1f91e-1f3fe.png
deleted file mode 100644
index 75e05e4d33..0000000000
Binary files a/public/emoji/1f91e-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f91e-1f3fe.svg b/public/emoji/1f91e-1f3fe.svg
index 5067aaebaa..62816622dc 100644
--- a/public/emoji/1f91e-1f3fe.svg
+++ b/public/emoji/1f91e-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91e-1f3ff.png b/public/emoji/1f91e-1f3ff.png
deleted file mode 100644
index 761aebdc30..0000000000
Binary files a/public/emoji/1f91e-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f91e-1f3ff.svg b/public/emoji/1f91e-1f3ff.svg
index 741dc66408..00b44e88dd 100644
--- a/public/emoji/1f91e-1f3ff.svg
+++ b/public/emoji/1f91e-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91e.png b/public/emoji/1f91e.png
deleted file mode 100644
index 4cd18514ea..0000000000
Binary files a/public/emoji/1f91e.png and /dev/null differ
diff --git a/public/emoji/1f91e.svg b/public/emoji/1f91e.svg
index 574dcc17f9..ee5f2430d4 100644
--- a/public/emoji/1f91e.svg
+++ b/public/emoji/1f91e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f91f-1f3fb.svg b/public/emoji/1f91f-1f3fb.svg
new file mode 100644
index 0000000000..24b951fc11
--- /dev/null
+++ b/public/emoji/1f91f-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f91f-1f3fc.svg b/public/emoji/1f91f-1f3fc.svg
new file mode 100644
index 0000000000..0dff66ba44
--- /dev/null
+++ b/public/emoji/1f91f-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f91f-1f3fd.svg b/public/emoji/1f91f-1f3fd.svg
new file mode 100644
index 0000000000..0140134559
--- /dev/null
+++ b/public/emoji/1f91f-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f91f-1f3fe.svg b/public/emoji/1f91f-1f3fe.svg
new file mode 100644
index 0000000000..74b318c0c6
--- /dev/null
+++ b/public/emoji/1f91f-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f91f-1f3ff.svg b/public/emoji/1f91f-1f3ff.svg
new file mode 100644
index 0000000000..c059eb6e52
--- /dev/null
+++ b/public/emoji/1f91f-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f91f.svg b/public/emoji/1f91f.svg
new file mode 100644
index 0000000000..8f93518655
--- /dev/null
+++ b/public/emoji/1f91f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f920.png b/public/emoji/1f920.png
deleted file mode 100644
index 70dd5d0d9d..0000000000
Binary files a/public/emoji/1f920.png and /dev/null differ
diff --git a/public/emoji/1f920.svg b/public/emoji/1f920.svg
index 11437ce6dd..a240ae0b50 100644
--- a/public/emoji/1f920.svg
+++ b/public/emoji/1f920.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f921.png b/public/emoji/1f921.png
deleted file mode 100644
index 02b7ff7004..0000000000
Binary files a/public/emoji/1f921.png and /dev/null differ
diff --git a/public/emoji/1f921.svg b/public/emoji/1f921.svg
index 63812e7311..f078661320 100644
--- a/public/emoji/1f921.svg
+++ b/public/emoji/1f921.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f922.png b/public/emoji/1f922.png
deleted file mode 100644
index a566c109c2..0000000000
Binary files a/public/emoji/1f922.png and /dev/null differ
diff --git a/public/emoji/1f922.svg b/public/emoji/1f922.svg
index 893e564de5..1815d4965a 100644
--- a/public/emoji/1f922.svg
+++ b/public/emoji/1f922.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f923.png b/public/emoji/1f923.png
deleted file mode 100644
index b1736fedfe..0000000000
Binary files a/public/emoji/1f923.png and /dev/null differ
diff --git a/public/emoji/1f923.svg b/public/emoji/1f923.svg
index e029257016..1ca89f33ae 100644
--- a/public/emoji/1f923.svg
+++ b/public/emoji/1f923.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f924.png b/public/emoji/1f924.png
deleted file mode 100644
index a546053259..0000000000
Binary files a/public/emoji/1f924.png and /dev/null differ
diff --git a/public/emoji/1f924.svg b/public/emoji/1f924.svg
index 4e30304dfc..c81e62d6c5 100644
--- a/public/emoji/1f924.svg
+++ b/public/emoji/1f924.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f925.png b/public/emoji/1f925.png
deleted file mode 100644
index 02827e2628..0000000000
Binary files a/public/emoji/1f925.png and /dev/null differ
diff --git a/public/emoji/1f925.svg b/public/emoji/1f925.svg
index 7446d3f45f..a78baff89d 100644
--- a/public/emoji/1f925.svg
+++ b/public/emoji/1f925.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f926-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f926-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..61cab88bec
--- /dev/null
+++ b/public/emoji/1f926-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f926-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f926-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..45a0c293d4
--- /dev/null
+++ b/public/emoji/1f926-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f926-1f3fb.png b/public/emoji/1f926-1f3fb.png
deleted file mode 100644
index 2f4b010bb4..0000000000
Binary files a/public/emoji/1f926-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f926-1f3fb.svg b/public/emoji/1f926-1f3fb.svg
index 60e2089a4b..61cab88bec 100644
--- a/public/emoji/1f926-1f3fb.svg
+++ b/public/emoji/1f926-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f926-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f926-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..9d28aecc95
--- /dev/null
+++ b/public/emoji/1f926-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f926-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f926-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..55f32a525a
--- /dev/null
+++ b/public/emoji/1f926-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f926-1f3fc.png b/public/emoji/1f926-1f3fc.png
deleted file mode 100644
index 97fb683168..0000000000
Binary files a/public/emoji/1f926-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f926-1f3fc.svg b/public/emoji/1f926-1f3fc.svg
index a5fc0ae04c..9d28aecc95 100644
--- a/public/emoji/1f926-1f3fc.svg
+++ b/public/emoji/1f926-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f926-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f926-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..a23fe91cc1
--- /dev/null
+++ b/public/emoji/1f926-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f926-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f926-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..0c349e099c
--- /dev/null
+++ b/public/emoji/1f926-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f926-1f3fd.png b/public/emoji/1f926-1f3fd.png
deleted file mode 100644
index b5b5c1e530..0000000000
Binary files a/public/emoji/1f926-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f926-1f3fd.svg b/public/emoji/1f926-1f3fd.svg
index ea86bb8cba..a23fe91cc1 100644
--- a/public/emoji/1f926-1f3fd.svg
+++ b/public/emoji/1f926-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f926-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f926-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..6ec0c9edba
--- /dev/null
+++ b/public/emoji/1f926-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f926-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f926-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..af75656a57
--- /dev/null
+++ b/public/emoji/1f926-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f926-1f3fe.png b/public/emoji/1f926-1f3fe.png
deleted file mode 100644
index 2840b11348..0000000000
Binary files a/public/emoji/1f926-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f926-1f3fe.svg b/public/emoji/1f926-1f3fe.svg
index 27bb43a42b..6ec0c9edba 100644
--- a/public/emoji/1f926-1f3fe.svg
+++ b/public/emoji/1f926-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f926-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f926-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..e4ba1179b4
--- /dev/null
+++ b/public/emoji/1f926-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f926-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f926-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..cc2122284d
--- /dev/null
+++ b/public/emoji/1f926-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f926-1f3ff.png b/public/emoji/1f926-1f3ff.png
deleted file mode 100644
index 6f070db98b..0000000000
Binary files a/public/emoji/1f926-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f926-1f3ff.svg b/public/emoji/1f926-1f3ff.svg
index 2f70443759..e4ba1179b4 100644
--- a/public/emoji/1f926-1f3ff.svg
+++ b/public/emoji/1f926-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f926-200d-2640-fe0f.svg b/public/emoji/1f926-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..9e134f05d2
--- /dev/null
+++ b/public/emoji/1f926-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f926-200d-2642-fe0f.svg b/public/emoji/1f926-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..1e51ec0459
--- /dev/null
+++ b/public/emoji/1f926-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f926.png b/public/emoji/1f926.png
deleted file mode 100644
index defc796cf1..0000000000
Binary files a/public/emoji/1f926.png and /dev/null differ
diff --git a/public/emoji/1f926.svg b/public/emoji/1f926.svg
index bff8effe6b..9e134f05d2 100644
--- a/public/emoji/1f926.svg
+++ b/public/emoji/1f926.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f927.png b/public/emoji/1f927.png
deleted file mode 100644
index ccf07d4b64..0000000000
Binary files a/public/emoji/1f927.png and /dev/null differ
diff --git a/public/emoji/1f927.svg b/public/emoji/1f927.svg
index 1c513dd280..ad0eb94a52 100644
--- a/public/emoji/1f927.svg
+++ b/public/emoji/1f927.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f928.svg b/public/emoji/1f928.svg
new file mode 100644
index 0000000000..5b7fda886f
--- /dev/null
+++ b/public/emoji/1f928.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f929.svg b/public/emoji/1f929.svg
new file mode 100644
index 0000000000..cd16d001e7
--- /dev/null
+++ b/public/emoji/1f929.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f92a.svg b/public/emoji/1f92a.svg
new file mode 100644
index 0000000000..579fb1c9db
--- /dev/null
+++ b/public/emoji/1f92a.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f92b.svg b/public/emoji/1f92b.svg
new file mode 100644
index 0000000000..819a7c792a
--- /dev/null
+++ b/public/emoji/1f92b.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f92c.svg b/public/emoji/1f92c.svg
new file mode 100644
index 0000000000..e19b92f452
--- /dev/null
+++ b/public/emoji/1f92c.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f92d.svg b/public/emoji/1f92d.svg
new file mode 100644
index 0000000000..ee9649f89e
--- /dev/null
+++ b/public/emoji/1f92d.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f92e.svg b/public/emoji/1f92e.svg
new file mode 100644
index 0000000000..dbf0ad3ff5
--- /dev/null
+++ b/public/emoji/1f92e.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f92f.svg b/public/emoji/1f92f.svg
new file mode 100644
index 0000000000..03198605d1
--- /dev/null
+++ b/public/emoji/1f92f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f930-1f3fb.png b/public/emoji/1f930-1f3fb.png
deleted file mode 100644
index a78703b33a..0000000000
Binary files a/public/emoji/1f930-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f930-1f3fb.svg b/public/emoji/1f930-1f3fb.svg
index 4b1d23ff29..324864905a 100644
--- a/public/emoji/1f930-1f3fb.svg
+++ b/public/emoji/1f930-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f930-1f3fc.png b/public/emoji/1f930-1f3fc.png
deleted file mode 100644
index 0068c6c4a7..0000000000
Binary files a/public/emoji/1f930-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f930-1f3fc.svg b/public/emoji/1f930-1f3fc.svg
index b168358928..f7771ab08c 100644
--- a/public/emoji/1f930-1f3fc.svg
+++ b/public/emoji/1f930-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f930-1f3fd.png b/public/emoji/1f930-1f3fd.png
deleted file mode 100644
index 3206296b68..0000000000
Binary files a/public/emoji/1f930-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f930-1f3fd.svg b/public/emoji/1f930-1f3fd.svg
index dbb32eac3a..34000f5a24 100644
--- a/public/emoji/1f930-1f3fd.svg
+++ b/public/emoji/1f930-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f930-1f3fe.png b/public/emoji/1f930-1f3fe.png
deleted file mode 100644
index 120fda5cd8..0000000000
Binary files a/public/emoji/1f930-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f930-1f3fe.svg b/public/emoji/1f930-1f3fe.svg
index a3bab2cba4..3a6ac0c1f4 100644
--- a/public/emoji/1f930-1f3fe.svg
+++ b/public/emoji/1f930-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f930-1f3ff.png b/public/emoji/1f930-1f3ff.png
deleted file mode 100644
index 569bfdf05c..0000000000
Binary files a/public/emoji/1f930-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f930-1f3ff.svg b/public/emoji/1f930-1f3ff.svg
index ad37b4b16f..5ca9e492fe 100644
--- a/public/emoji/1f930-1f3ff.svg
+++ b/public/emoji/1f930-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f930.png b/public/emoji/1f930.png
deleted file mode 100644
index 084e83a414..0000000000
Binary files a/public/emoji/1f930.png and /dev/null differ
diff --git a/public/emoji/1f930.svg b/public/emoji/1f930.svg
index 768b902b88..b5820f4f3e 100644
--- a/public/emoji/1f930.svg
+++ b/public/emoji/1f930.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f931-1f3fb.svg b/public/emoji/1f931-1f3fb.svg
new file mode 100644
index 0000000000..988b5d57d5
--- /dev/null
+++ b/public/emoji/1f931-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f931-1f3fc.svg b/public/emoji/1f931-1f3fc.svg
new file mode 100644
index 0000000000..2883d9ef56
--- /dev/null
+++ b/public/emoji/1f931-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f931-1f3fd.svg b/public/emoji/1f931-1f3fd.svg
new file mode 100644
index 0000000000..b42dc9fb5f
--- /dev/null
+++ b/public/emoji/1f931-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f931-1f3fe.svg b/public/emoji/1f931-1f3fe.svg
new file mode 100644
index 0000000000..41c6f1c75e
--- /dev/null
+++ b/public/emoji/1f931-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f931-1f3ff.svg b/public/emoji/1f931-1f3ff.svg
new file mode 100644
index 0000000000..428a21dcb0
--- /dev/null
+++ b/public/emoji/1f931-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f931.svg b/public/emoji/1f931.svg
new file mode 100644
index 0000000000..6533abf711
--- /dev/null
+++ b/public/emoji/1f931.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f932-1f3fb.svg b/public/emoji/1f932-1f3fb.svg
new file mode 100644
index 0000000000..8d826d9751
--- /dev/null
+++ b/public/emoji/1f932-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f932-1f3fc.svg b/public/emoji/1f932-1f3fc.svg
new file mode 100644
index 0000000000..5ab9964ff3
--- /dev/null
+++ b/public/emoji/1f932-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f932-1f3fd.svg b/public/emoji/1f932-1f3fd.svg
new file mode 100644
index 0000000000..e64b1fba47
--- /dev/null
+++ b/public/emoji/1f932-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f932-1f3fe.svg b/public/emoji/1f932-1f3fe.svg
new file mode 100644
index 0000000000..34728c5ab9
--- /dev/null
+++ b/public/emoji/1f932-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f932-1f3ff.svg b/public/emoji/1f932-1f3ff.svg
new file mode 100644
index 0000000000..dff0c8e43e
--- /dev/null
+++ b/public/emoji/1f932-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f932.svg b/public/emoji/1f932.svg
new file mode 100644
index 0000000000..457e04c2c0
--- /dev/null
+++ b/public/emoji/1f932.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f933-1f3fb.png b/public/emoji/1f933-1f3fb.png
deleted file mode 100644
index 290e075b56..0000000000
Binary files a/public/emoji/1f933-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f933-1f3fb.svg b/public/emoji/1f933-1f3fb.svg
index 891ddd1322..1f0bbf5b46 100644
--- a/public/emoji/1f933-1f3fb.svg
+++ b/public/emoji/1f933-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f933-1f3fc.png b/public/emoji/1f933-1f3fc.png
deleted file mode 100644
index fcd9595b64..0000000000
Binary files a/public/emoji/1f933-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f933-1f3fc.svg b/public/emoji/1f933-1f3fc.svg
index 8e9e654444..db84bbe088 100644
--- a/public/emoji/1f933-1f3fc.svg
+++ b/public/emoji/1f933-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f933-1f3fd.png b/public/emoji/1f933-1f3fd.png
deleted file mode 100644
index f3a22fdf43..0000000000
Binary files a/public/emoji/1f933-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f933-1f3fd.svg b/public/emoji/1f933-1f3fd.svg
index d40f5f75d0..34d5842fec 100644
--- a/public/emoji/1f933-1f3fd.svg
+++ b/public/emoji/1f933-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f933-1f3fe.png b/public/emoji/1f933-1f3fe.png
deleted file mode 100644
index cdecf6d9f4..0000000000
Binary files a/public/emoji/1f933-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f933-1f3fe.svg b/public/emoji/1f933-1f3fe.svg
index d19b5ea811..1d313cf183 100644
--- a/public/emoji/1f933-1f3fe.svg
+++ b/public/emoji/1f933-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f933-1f3ff.png b/public/emoji/1f933-1f3ff.png
deleted file mode 100644
index 86acbb6c20..0000000000
Binary files a/public/emoji/1f933-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f933-1f3ff.svg b/public/emoji/1f933-1f3ff.svg
index 3be274394f..8badf905fc 100644
--- a/public/emoji/1f933-1f3ff.svg
+++ b/public/emoji/1f933-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f933.png b/public/emoji/1f933.png
deleted file mode 100644
index 6a1ba75c7e..0000000000
Binary files a/public/emoji/1f933.png and /dev/null differ
diff --git a/public/emoji/1f933.svg b/public/emoji/1f933.svg
index 009221c6ab..c031fc001e 100644
--- a/public/emoji/1f933.svg
+++ b/public/emoji/1f933.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f934-1f3fb.png b/public/emoji/1f934-1f3fb.png
deleted file mode 100644
index 849930c888..0000000000
Binary files a/public/emoji/1f934-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f934-1f3fb.svg b/public/emoji/1f934-1f3fb.svg
index 9688cead97..841a50ec3f 100644
--- a/public/emoji/1f934-1f3fb.svg
+++ b/public/emoji/1f934-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f934-1f3fc.png b/public/emoji/1f934-1f3fc.png
deleted file mode 100644
index 23d8b3b128..0000000000
Binary files a/public/emoji/1f934-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f934-1f3fc.svg b/public/emoji/1f934-1f3fc.svg
index cc27b532de..7624b4dae5 100644
--- a/public/emoji/1f934-1f3fc.svg
+++ b/public/emoji/1f934-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f934-1f3fd.png b/public/emoji/1f934-1f3fd.png
deleted file mode 100644
index db6dfff064..0000000000
Binary files a/public/emoji/1f934-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f934-1f3fd.svg b/public/emoji/1f934-1f3fd.svg
index 44a0524d41..43ee1573ef 100644
--- a/public/emoji/1f934-1f3fd.svg
+++ b/public/emoji/1f934-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f934-1f3fe.png b/public/emoji/1f934-1f3fe.png
deleted file mode 100644
index 8e10f8be6a..0000000000
Binary files a/public/emoji/1f934-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f934-1f3fe.svg b/public/emoji/1f934-1f3fe.svg
index 71c66cb95e..d2d890f828 100644
--- a/public/emoji/1f934-1f3fe.svg
+++ b/public/emoji/1f934-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f934-1f3ff.png b/public/emoji/1f934-1f3ff.png
deleted file mode 100644
index 138d4ea704..0000000000
Binary files a/public/emoji/1f934-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f934-1f3ff.svg b/public/emoji/1f934-1f3ff.svg
index d45a0f05aa..845726b1b0 100644
--- a/public/emoji/1f934-1f3ff.svg
+++ b/public/emoji/1f934-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f934.png b/public/emoji/1f934.png
deleted file mode 100644
index 38d69344c8..0000000000
Binary files a/public/emoji/1f934.png and /dev/null differ
diff --git a/public/emoji/1f934.svg b/public/emoji/1f934.svg
index a075a6b44c..700e4dd8ee 100644
--- a/public/emoji/1f934.svg
+++ b/public/emoji/1f934.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f935-1f3fb.png b/public/emoji/1f935-1f3fb.png
deleted file mode 100644
index 7b6b3acd99..0000000000
Binary files a/public/emoji/1f935-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f935-1f3fb.svg b/public/emoji/1f935-1f3fb.svg
index b5259d659d..76431d58f8 100644
--- a/public/emoji/1f935-1f3fb.svg
+++ b/public/emoji/1f935-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f935-1f3fc.png b/public/emoji/1f935-1f3fc.png
deleted file mode 100644
index 7975191b36..0000000000
Binary files a/public/emoji/1f935-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f935-1f3fc.svg b/public/emoji/1f935-1f3fc.svg
index d57750ac50..af8c199d5b 100644
--- a/public/emoji/1f935-1f3fc.svg
+++ b/public/emoji/1f935-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f935-1f3fd.png b/public/emoji/1f935-1f3fd.png
deleted file mode 100644
index a2816f600a..0000000000
Binary files a/public/emoji/1f935-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f935-1f3fd.svg b/public/emoji/1f935-1f3fd.svg
index 9c816e3033..3d796d873e 100644
--- a/public/emoji/1f935-1f3fd.svg
+++ b/public/emoji/1f935-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f935-1f3fe.png b/public/emoji/1f935-1f3fe.png
deleted file mode 100644
index ea8291760f..0000000000
Binary files a/public/emoji/1f935-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f935-1f3fe.svg b/public/emoji/1f935-1f3fe.svg
index e15d176572..bdfbf85df3 100644
--- a/public/emoji/1f935-1f3fe.svg
+++ b/public/emoji/1f935-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f935-1f3ff.png b/public/emoji/1f935-1f3ff.png
deleted file mode 100644
index c743e05fc5..0000000000
Binary files a/public/emoji/1f935-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f935-1f3ff.svg b/public/emoji/1f935-1f3ff.svg
index f8655dbe7b..da7f013d0d 100644
--- a/public/emoji/1f935-1f3ff.svg
+++ b/public/emoji/1f935-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f935.png b/public/emoji/1f935.png
deleted file mode 100644
index 5f7e9303f8..0000000000
Binary files a/public/emoji/1f935.png and /dev/null differ
diff --git a/public/emoji/1f935.svg b/public/emoji/1f935.svg
index 228b84a0a4..14d2a46ae4 100644
--- a/public/emoji/1f935.svg
+++ b/public/emoji/1f935.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f936-1f3fb.png b/public/emoji/1f936-1f3fb.png
deleted file mode 100644
index d8a695d703..0000000000
Binary files a/public/emoji/1f936-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f936-1f3fb.svg b/public/emoji/1f936-1f3fb.svg
index 42ba4e6339..de4f37f67b 100644
--- a/public/emoji/1f936-1f3fb.svg
+++ b/public/emoji/1f936-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f936-1f3fc.png b/public/emoji/1f936-1f3fc.png
deleted file mode 100644
index 0e17e8c51f..0000000000
Binary files a/public/emoji/1f936-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f936-1f3fc.svg b/public/emoji/1f936-1f3fc.svg
index 039a576614..b1a535d2fc 100644
--- a/public/emoji/1f936-1f3fc.svg
+++ b/public/emoji/1f936-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f936-1f3fd.png b/public/emoji/1f936-1f3fd.png
deleted file mode 100644
index c3ee4d1dfa..0000000000
Binary files a/public/emoji/1f936-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f936-1f3fd.svg b/public/emoji/1f936-1f3fd.svg
index a28a074bba..f99d06457c 100644
--- a/public/emoji/1f936-1f3fd.svg
+++ b/public/emoji/1f936-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f936-1f3fe.png b/public/emoji/1f936-1f3fe.png
deleted file mode 100644
index 68a556da2f..0000000000
Binary files a/public/emoji/1f936-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f936-1f3fe.svg b/public/emoji/1f936-1f3fe.svg
index bac1e4678a..44bbb6b573 100644
--- a/public/emoji/1f936-1f3fe.svg
+++ b/public/emoji/1f936-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f936-1f3ff.png b/public/emoji/1f936-1f3ff.png
deleted file mode 100644
index ccab3c40ff..0000000000
Binary files a/public/emoji/1f936-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f936-1f3ff.svg b/public/emoji/1f936-1f3ff.svg
index bd8eb1babd..b972cf0b23 100644
--- a/public/emoji/1f936-1f3ff.svg
+++ b/public/emoji/1f936-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f936.png b/public/emoji/1f936.png
deleted file mode 100644
index 9cf2458df1..0000000000
Binary files a/public/emoji/1f936.png and /dev/null differ
diff --git a/public/emoji/1f936.svg b/public/emoji/1f936.svg
index c2c0e9862e..aad36267b0 100644
--- a/public/emoji/1f936.svg
+++ b/public/emoji/1f936.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f937-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f937-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..3fb8aa608a
--- /dev/null
+++ b/public/emoji/1f937-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f937-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f937-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..6fa8b48608
--- /dev/null
+++ b/public/emoji/1f937-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f937-1f3fb.png b/public/emoji/1f937-1f3fb.png
deleted file mode 100644
index 1c895e6446..0000000000
Binary files a/public/emoji/1f937-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f937-1f3fb.svg b/public/emoji/1f937-1f3fb.svg
index e654bcd6a7..3fb8aa608a 100644
--- a/public/emoji/1f937-1f3fb.svg
+++ b/public/emoji/1f937-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f937-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f937-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..df88b238b4
--- /dev/null
+++ b/public/emoji/1f937-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f937-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f937-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..9690008e39
--- /dev/null
+++ b/public/emoji/1f937-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f937-1f3fc.png b/public/emoji/1f937-1f3fc.png
deleted file mode 100644
index 4e3ca8f8ba..0000000000
Binary files a/public/emoji/1f937-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f937-1f3fc.svg b/public/emoji/1f937-1f3fc.svg
index 8686bdf2bd..df88b238b4 100644
--- a/public/emoji/1f937-1f3fc.svg
+++ b/public/emoji/1f937-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f937-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f937-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..38047209f5
--- /dev/null
+++ b/public/emoji/1f937-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f937-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f937-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..7a7807e03b
--- /dev/null
+++ b/public/emoji/1f937-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f937-1f3fd.png b/public/emoji/1f937-1f3fd.png
deleted file mode 100644
index d1b16a19bb..0000000000
Binary files a/public/emoji/1f937-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f937-1f3fd.svg b/public/emoji/1f937-1f3fd.svg
index ee50fbbd74..38047209f5 100644
--- a/public/emoji/1f937-1f3fd.svg
+++ b/public/emoji/1f937-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f937-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f937-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..d7c4702e3e
--- /dev/null
+++ b/public/emoji/1f937-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f937-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f937-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..8f2eb7f48f
--- /dev/null
+++ b/public/emoji/1f937-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f937-1f3fe.png b/public/emoji/1f937-1f3fe.png
deleted file mode 100644
index 5fbef3f225..0000000000
Binary files a/public/emoji/1f937-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f937-1f3fe.svg b/public/emoji/1f937-1f3fe.svg
index 4a7bc965e3..d7c4702e3e 100644
--- a/public/emoji/1f937-1f3fe.svg
+++ b/public/emoji/1f937-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f937-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f937-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..769929c569
--- /dev/null
+++ b/public/emoji/1f937-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f937-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f937-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..7384bbb320
--- /dev/null
+++ b/public/emoji/1f937-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f937-1f3ff.png b/public/emoji/1f937-1f3ff.png
deleted file mode 100644
index 4af2e28bc5..0000000000
Binary files a/public/emoji/1f937-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f937-1f3ff.svg b/public/emoji/1f937-1f3ff.svg
index 25bfd9ef71..769929c569 100644
--- a/public/emoji/1f937-1f3ff.svg
+++ b/public/emoji/1f937-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f937-200d-2640-fe0f.svg b/public/emoji/1f937-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..4277e9ddb4
--- /dev/null
+++ b/public/emoji/1f937-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f937-200d-2642-fe0f.svg b/public/emoji/1f937-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..d202027282
--- /dev/null
+++ b/public/emoji/1f937-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f937.png b/public/emoji/1f937.png
deleted file mode 100644
index 76e63bfac7..0000000000
Binary files a/public/emoji/1f937.png and /dev/null differ
diff --git a/public/emoji/1f937.svg b/public/emoji/1f937.svg
index c2ab59fe01..4277e9ddb4 100644
--- a/public/emoji/1f937.svg
+++ b/public/emoji/1f937.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f938-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f938-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..11c961dfde
--- /dev/null
+++ b/public/emoji/1f938-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f938-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f938-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..beb1698b00
--- /dev/null
+++ b/public/emoji/1f938-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f938-1f3fb.png b/public/emoji/1f938-1f3fb.png
deleted file mode 100644
index db6d65895f..0000000000
Binary files a/public/emoji/1f938-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f938-1f3fb.svg b/public/emoji/1f938-1f3fb.svg
index 41bb168869..11c961dfde 100644
--- a/public/emoji/1f938-1f3fb.svg
+++ b/public/emoji/1f938-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f938-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f938-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..5e568ea251
--- /dev/null
+++ b/public/emoji/1f938-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f938-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f938-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..136338d4ab
--- /dev/null
+++ b/public/emoji/1f938-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f938-1f3fc.png b/public/emoji/1f938-1f3fc.png
deleted file mode 100644
index e00ffbc27a..0000000000
Binary files a/public/emoji/1f938-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f938-1f3fc.svg b/public/emoji/1f938-1f3fc.svg
index 17ccde4bb5..5e568ea251 100644
--- a/public/emoji/1f938-1f3fc.svg
+++ b/public/emoji/1f938-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f938-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f938-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..86abb59e3c
--- /dev/null
+++ b/public/emoji/1f938-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f938-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f938-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..e580c1f446
--- /dev/null
+++ b/public/emoji/1f938-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f938-1f3fd.png b/public/emoji/1f938-1f3fd.png
deleted file mode 100644
index 49321be391..0000000000
Binary files a/public/emoji/1f938-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f938-1f3fd.svg b/public/emoji/1f938-1f3fd.svg
index e76db7a6ea..86abb59e3c 100644
--- a/public/emoji/1f938-1f3fd.svg
+++ b/public/emoji/1f938-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f938-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f938-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..06c5f27ce3
--- /dev/null
+++ b/public/emoji/1f938-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f938-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f938-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..ee81b8e943
--- /dev/null
+++ b/public/emoji/1f938-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f938-1f3fe.png b/public/emoji/1f938-1f3fe.png
deleted file mode 100644
index d4562b5e3d..0000000000
Binary files a/public/emoji/1f938-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f938-1f3fe.svg b/public/emoji/1f938-1f3fe.svg
index 83a3dd3bd7..06c5f27ce3 100644
--- a/public/emoji/1f938-1f3fe.svg
+++ b/public/emoji/1f938-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f938-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f938-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..492866a6d9
--- /dev/null
+++ b/public/emoji/1f938-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f938-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f938-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..3846f7e814
--- /dev/null
+++ b/public/emoji/1f938-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f938-1f3ff.png b/public/emoji/1f938-1f3ff.png
deleted file mode 100644
index 6e09a87076..0000000000
Binary files a/public/emoji/1f938-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f938-1f3ff.svg b/public/emoji/1f938-1f3ff.svg
index 347df3bc0e..492866a6d9 100644
--- a/public/emoji/1f938-1f3ff.svg
+++ b/public/emoji/1f938-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f938-200d-2640-fe0f.svg b/public/emoji/1f938-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..d4108d7067
--- /dev/null
+++ b/public/emoji/1f938-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f938-200d-2642-fe0f.svg b/public/emoji/1f938-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..1335d4f0a4
--- /dev/null
+++ b/public/emoji/1f938-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f938.png b/public/emoji/1f938.png
deleted file mode 100644
index cbcaa57825..0000000000
Binary files a/public/emoji/1f938.png and /dev/null differ
diff --git a/public/emoji/1f938.svg b/public/emoji/1f938.svg
index d3c2a1ad83..d4108d7067 100644
--- a/public/emoji/1f938.svg
+++ b/public/emoji/1f938.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f939-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f939-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..ecbe04f58d
--- /dev/null
+++ b/public/emoji/1f939-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f939-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f939-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..cc2e8f3dcc
--- /dev/null
+++ b/public/emoji/1f939-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f939-1f3fb.png b/public/emoji/1f939-1f3fb.png
deleted file mode 100644
index c18eda4003..0000000000
Binary files a/public/emoji/1f939-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f939-1f3fb.svg b/public/emoji/1f939-1f3fb.svg
index db37b39a0b..cc2e8f3dcc 100644
--- a/public/emoji/1f939-1f3fb.svg
+++ b/public/emoji/1f939-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f939-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f939-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..54b97ed10f
--- /dev/null
+++ b/public/emoji/1f939-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f939-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f939-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..883eb1cde9
--- /dev/null
+++ b/public/emoji/1f939-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f939-1f3fc.png b/public/emoji/1f939-1f3fc.png
deleted file mode 100644
index de3b7a555b..0000000000
Binary files a/public/emoji/1f939-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f939-1f3fc.svg b/public/emoji/1f939-1f3fc.svg
index bb834f73f8..883eb1cde9 100644
--- a/public/emoji/1f939-1f3fc.svg
+++ b/public/emoji/1f939-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f939-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f939-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..b49b5d176b
--- /dev/null
+++ b/public/emoji/1f939-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f939-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f939-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..1675762c87
--- /dev/null
+++ b/public/emoji/1f939-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f939-1f3fd.png b/public/emoji/1f939-1f3fd.png
deleted file mode 100644
index 74ab6d8545..0000000000
Binary files a/public/emoji/1f939-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f939-1f3fd.svg b/public/emoji/1f939-1f3fd.svg
index 8c2b703d85..1675762c87 100644
--- a/public/emoji/1f939-1f3fd.svg
+++ b/public/emoji/1f939-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f939-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f939-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..9fa47f6ed3
--- /dev/null
+++ b/public/emoji/1f939-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f939-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f939-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..fa0ea01556
--- /dev/null
+++ b/public/emoji/1f939-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f939-1f3fe.png b/public/emoji/1f939-1f3fe.png
deleted file mode 100644
index 1c57823203..0000000000
Binary files a/public/emoji/1f939-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f939-1f3fe.svg b/public/emoji/1f939-1f3fe.svg
index fcf0992085..fa0ea01556 100644
--- a/public/emoji/1f939-1f3fe.svg
+++ b/public/emoji/1f939-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f939-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f939-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..e2128cc2e1
--- /dev/null
+++ b/public/emoji/1f939-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f939-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f939-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..ec09828104
--- /dev/null
+++ b/public/emoji/1f939-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f939-1f3ff.png b/public/emoji/1f939-1f3ff.png
deleted file mode 100644
index c343d6ee98..0000000000
Binary files a/public/emoji/1f939-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f939-1f3ff.svg b/public/emoji/1f939-1f3ff.svg
index b1d6168a07..ec09828104 100644
--- a/public/emoji/1f939-1f3ff.svg
+++ b/public/emoji/1f939-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f939-200d-2640-fe0f.svg b/public/emoji/1f939-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..c2f071c5be
--- /dev/null
+++ b/public/emoji/1f939-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f939-200d-2642-fe0f.svg b/public/emoji/1f939-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..532cd15cf6
--- /dev/null
+++ b/public/emoji/1f939-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f939.png b/public/emoji/1f939.png
deleted file mode 100644
index a37f6224a4..0000000000
Binary files a/public/emoji/1f939.png and /dev/null differ
diff --git a/public/emoji/1f939.svg b/public/emoji/1f939.svg
index 3859ff275f..532cd15cf6 100644
--- a/public/emoji/1f939.svg
+++ b/public/emoji/1f939.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f93a.png b/public/emoji/1f93a.png
deleted file mode 100644
index 5288c920eb..0000000000
Binary files a/public/emoji/1f93a.png and /dev/null differ
diff --git a/public/emoji/1f93a.svg b/public/emoji/1f93a.svg
index f566e0605c..663bae152a 100644
--- a/public/emoji/1f93a.svg
+++ b/public/emoji/1f93a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f93c-1f3fb.png b/public/emoji/1f93c-1f3fb.png
deleted file mode 100644
index 379070fd03..0000000000
Binary files a/public/emoji/1f93c-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f93c-1f3fb.svg b/public/emoji/1f93c-1f3fb.svg
deleted file mode 100644
index 107ff2667e..0000000000
--- a/public/emoji/1f93c-1f3fb.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f93c-1f3fc.png b/public/emoji/1f93c-1f3fc.png
deleted file mode 100644
index 6863ea9209..0000000000
Binary files a/public/emoji/1f93c-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f93c-1f3fc.svg b/public/emoji/1f93c-1f3fc.svg
deleted file mode 100644
index e417df2d85..0000000000
--- a/public/emoji/1f93c-1f3fc.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f93c-1f3fd.png b/public/emoji/1f93c-1f3fd.png
deleted file mode 100644
index b7e6291012..0000000000
Binary files a/public/emoji/1f93c-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f93c-1f3fd.svg b/public/emoji/1f93c-1f3fd.svg
deleted file mode 100644
index 5b897f9dbb..0000000000
--- a/public/emoji/1f93c-1f3fd.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f93c-1f3fe.png b/public/emoji/1f93c-1f3fe.png
deleted file mode 100644
index 750f958923..0000000000
Binary files a/public/emoji/1f93c-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f93c-1f3fe.svg b/public/emoji/1f93c-1f3fe.svg
deleted file mode 100644
index 7f34250217..0000000000
--- a/public/emoji/1f93c-1f3fe.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f93c-1f3ff.png b/public/emoji/1f93c-1f3ff.png
deleted file mode 100644
index 36ab9bb3f4..0000000000
Binary files a/public/emoji/1f93c-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f93c-1f3ff.svg b/public/emoji/1f93c-1f3ff.svg
deleted file mode 100644
index a4e5ecc507..0000000000
--- a/public/emoji/1f93c-1f3ff.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/emoji/1f93c-200d-2640-fe0f.svg b/public/emoji/1f93c-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..2380abf71e
--- /dev/null
+++ b/public/emoji/1f93c-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93c-200d-2642-fe0f.svg b/public/emoji/1f93c-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..d568b453c0
--- /dev/null
+++ b/public/emoji/1f93c-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93c.png b/public/emoji/1f93c.png
deleted file mode 100644
index 71e67cfad8..0000000000
Binary files a/public/emoji/1f93c.png and /dev/null differ
diff --git a/public/emoji/1f93c.svg b/public/emoji/1f93c.svg
index 694ce76624..d568b453c0 100644
--- a/public/emoji/1f93c.svg
+++ b/public/emoji/1f93c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f93d-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..c725abbce3
--- /dev/null
+++ b/public/emoji/1f93d-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f93d-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..a7515d5dbc
--- /dev/null
+++ b/public/emoji/1f93d-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3fb.png b/public/emoji/1f93d-1f3fb.png
deleted file mode 100644
index bed1a908d6..0000000000
Binary files a/public/emoji/1f93d-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f93d-1f3fb.svg b/public/emoji/1f93d-1f3fb.svg
index ab8d140df0..a7515d5dbc 100644
--- a/public/emoji/1f93d-1f3fb.svg
+++ b/public/emoji/1f93d-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f93d-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..80bc3501b1
--- /dev/null
+++ b/public/emoji/1f93d-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f93d-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..b304277916
--- /dev/null
+++ b/public/emoji/1f93d-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3fc.png b/public/emoji/1f93d-1f3fc.png
deleted file mode 100644
index ec5a43b4d4..0000000000
Binary files a/public/emoji/1f93d-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f93d-1f3fc.svg b/public/emoji/1f93d-1f3fc.svg
index 85395e007b..b304277916 100644
--- a/public/emoji/1f93d-1f3fc.svg
+++ b/public/emoji/1f93d-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f93d-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..cf169c961b
--- /dev/null
+++ b/public/emoji/1f93d-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f93d-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..2e55ad5707
--- /dev/null
+++ b/public/emoji/1f93d-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3fd.png b/public/emoji/1f93d-1f3fd.png
deleted file mode 100644
index b081a4a5a9..0000000000
Binary files a/public/emoji/1f93d-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f93d-1f3fd.svg b/public/emoji/1f93d-1f3fd.svg
index 3977b73773..2e55ad5707 100644
--- a/public/emoji/1f93d-1f3fd.svg
+++ b/public/emoji/1f93d-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f93d-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..605d328d9b
--- /dev/null
+++ b/public/emoji/1f93d-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f93d-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..5459f0f98b
--- /dev/null
+++ b/public/emoji/1f93d-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3fe.png b/public/emoji/1f93d-1f3fe.png
deleted file mode 100644
index 82cfbc3b0c..0000000000
Binary files a/public/emoji/1f93d-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f93d-1f3fe.svg b/public/emoji/1f93d-1f3fe.svg
index d25f2bfb0c..5459f0f98b 100644
--- a/public/emoji/1f93d-1f3fe.svg
+++ b/public/emoji/1f93d-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f93d-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..c01fa423bd
--- /dev/null
+++ b/public/emoji/1f93d-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f93d-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..c84f230dce
--- /dev/null
+++ b/public/emoji/1f93d-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93d-1f3ff.png b/public/emoji/1f93d-1f3ff.png
deleted file mode 100644
index bd3366eb06..0000000000
Binary files a/public/emoji/1f93d-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f93d-1f3ff.svg b/public/emoji/1f93d-1f3ff.svg
index 16cd1bbe49..c84f230dce 100644
--- a/public/emoji/1f93d-1f3ff.svg
+++ b/public/emoji/1f93d-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f93d-200d-2640-fe0f.svg b/public/emoji/1f93d-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..4f22a638fc
--- /dev/null
+++ b/public/emoji/1f93d-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93d-200d-2642-fe0f.svg b/public/emoji/1f93d-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..1cbe1e8e38
--- /dev/null
+++ b/public/emoji/1f93d-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93d.png b/public/emoji/1f93d.png
deleted file mode 100644
index cb44576780..0000000000
Binary files a/public/emoji/1f93d.png and /dev/null differ
diff --git a/public/emoji/1f93d.svg b/public/emoji/1f93d.svg
index 1ba0ab89ed..1cbe1e8e38 100644
--- a/public/emoji/1f93d.svg
+++ b/public/emoji/1f93d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f93e-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..cc9a5e8377
--- /dev/null
+++ b/public/emoji/1f93e-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f93e-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..b7f07e45f9
--- /dev/null
+++ b/public/emoji/1f93e-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3fb.png b/public/emoji/1f93e-1f3fb.png
deleted file mode 100644
index c26cac2df9..0000000000
Binary files a/public/emoji/1f93e-1f3fb.png and /dev/null differ
diff --git a/public/emoji/1f93e-1f3fb.svg b/public/emoji/1f93e-1f3fb.svg
index 58ad79fadd..cc9a5e8377 100644
--- a/public/emoji/1f93e-1f3fb.svg
+++ b/public/emoji/1f93e-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f93e-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..8c0d7576f3
--- /dev/null
+++ b/public/emoji/1f93e-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f93e-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..2d25b7a5bd
--- /dev/null
+++ b/public/emoji/1f93e-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3fc.png b/public/emoji/1f93e-1f3fc.png
deleted file mode 100644
index 7baaf95a9a..0000000000
Binary files a/public/emoji/1f93e-1f3fc.png and /dev/null differ
diff --git a/public/emoji/1f93e-1f3fc.svg b/public/emoji/1f93e-1f3fc.svg
index fb609bac76..8c0d7576f3 100644
--- a/public/emoji/1f93e-1f3fc.svg
+++ b/public/emoji/1f93e-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f93e-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..1aa9f7d2d2
--- /dev/null
+++ b/public/emoji/1f93e-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f93e-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..e270a92f94
--- /dev/null
+++ b/public/emoji/1f93e-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3fd.png b/public/emoji/1f93e-1f3fd.png
deleted file mode 100644
index 0e3a37c3d4..0000000000
Binary files a/public/emoji/1f93e-1f3fd.png and /dev/null differ
diff --git a/public/emoji/1f93e-1f3fd.svg b/public/emoji/1f93e-1f3fd.svg
index facf15d779..1aa9f7d2d2 100644
--- a/public/emoji/1f93e-1f3fd.svg
+++ b/public/emoji/1f93e-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f93e-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..0d46f89068
--- /dev/null
+++ b/public/emoji/1f93e-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f93e-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..5e0c971405
--- /dev/null
+++ b/public/emoji/1f93e-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3fe.png b/public/emoji/1f93e-1f3fe.png
deleted file mode 100644
index e1233f3826..0000000000
Binary files a/public/emoji/1f93e-1f3fe.png and /dev/null differ
diff --git a/public/emoji/1f93e-1f3fe.svg b/public/emoji/1f93e-1f3fe.svg
index 2b3023fce5..0d46f89068 100644
--- a/public/emoji/1f93e-1f3fe.svg
+++ b/public/emoji/1f93e-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f93e-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..34be64b016
--- /dev/null
+++ b/public/emoji/1f93e-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f93e-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..a868dcc319
--- /dev/null
+++ b/public/emoji/1f93e-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93e-1f3ff.png b/public/emoji/1f93e-1f3ff.png
deleted file mode 100644
index 6b1eb9b64b..0000000000
Binary files a/public/emoji/1f93e-1f3ff.png and /dev/null differ
diff --git a/public/emoji/1f93e-1f3ff.svg b/public/emoji/1f93e-1f3ff.svg
index 65220a5394..34be64b016 100644
--- a/public/emoji/1f93e-1f3ff.svg
+++ b/public/emoji/1f93e-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f93e-200d-2640-fe0f.svg b/public/emoji/1f93e-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..817bb49f59
--- /dev/null
+++ b/public/emoji/1f93e-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93e-200d-2642-fe0f.svg b/public/emoji/1f93e-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..4dfcc53762
--- /dev/null
+++ b/public/emoji/1f93e-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f93e.png b/public/emoji/1f93e.png
deleted file mode 100644
index 1152f1344c..0000000000
Binary files a/public/emoji/1f93e.png and /dev/null differ
diff --git a/public/emoji/1f93e.svg b/public/emoji/1f93e.svg
index d3a20ac8a2..817bb49f59 100644
--- a/public/emoji/1f93e.svg
+++ b/public/emoji/1f93e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f940.png b/public/emoji/1f940.png
deleted file mode 100644
index 62412b143a..0000000000
Binary files a/public/emoji/1f940.png and /dev/null differ
diff --git a/public/emoji/1f940.svg b/public/emoji/1f940.svg
index dda76b81bc..08d5986def 100644
--- a/public/emoji/1f940.svg
+++ b/public/emoji/1f940.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f941.png b/public/emoji/1f941.png
deleted file mode 100644
index b038727cc9..0000000000
Binary files a/public/emoji/1f941.png and /dev/null differ
diff --git a/public/emoji/1f941.svg b/public/emoji/1f941.svg
index 3a07224db3..7a7027b7e3 100644
--- a/public/emoji/1f941.svg
+++ b/public/emoji/1f941.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f942.png b/public/emoji/1f942.png
deleted file mode 100644
index 31937ae939..0000000000
Binary files a/public/emoji/1f942.png and /dev/null differ
diff --git a/public/emoji/1f942.svg b/public/emoji/1f942.svg
index 41384a1ac3..1540a6b852 100644
--- a/public/emoji/1f942.svg
+++ b/public/emoji/1f942.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f943.png b/public/emoji/1f943.png
deleted file mode 100644
index 7bf0922987..0000000000
Binary files a/public/emoji/1f943.png and /dev/null differ
diff --git a/public/emoji/1f943.svg b/public/emoji/1f943.svg
index 025cd0b8a3..dc49c48728 100644
--- a/public/emoji/1f943.svg
+++ b/public/emoji/1f943.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f944.png b/public/emoji/1f944.png
deleted file mode 100644
index 3c4da766ae..0000000000
Binary files a/public/emoji/1f944.png and /dev/null differ
diff --git a/public/emoji/1f944.svg b/public/emoji/1f944.svg
index f69528ca7a..d17ec31ca4 100644
--- a/public/emoji/1f944.svg
+++ b/public/emoji/1f944.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f945.png b/public/emoji/1f945.png
deleted file mode 100644
index df3a53da0f..0000000000
Binary files a/public/emoji/1f945.png and /dev/null differ
diff --git a/public/emoji/1f945.svg b/public/emoji/1f945.svg
index 181c852244..6e1648f308 100644
--- a/public/emoji/1f945.svg
+++ b/public/emoji/1f945.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f947.png b/public/emoji/1f947.png
deleted file mode 100644
index 15612b6649..0000000000
Binary files a/public/emoji/1f947.png and /dev/null differ
diff --git a/public/emoji/1f947.svg b/public/emoji/1f947.svg
index abb7620a09..6403a34712 100644
--- a/public/emoji/1f947.svg
+++ b/public/emoji/1f947.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f948.png b/public/emoji/1f948.png
deleted file mode 100644
index 17b011268b..0000000000
Binary files a/public/emoji/1f948.png and /dev/null differ
diff --git a/public/emoji/1f948.svg b/public/emoji/1f948.svg
index 2da21e1386..75283797e1 100644
--- a/public/emoji/1f948.svg
+++ b/public/emoji/1f948.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f949.png b/public/emoji/1f949.png
deleted file mode 100644
index 636e04a595..0000000000
Binary files a/public/emoji/1f949.png and /dev/null differ
diff --git a/public/emoji/1f949.svg b/public/emoji/1f949.svg
index 1322b555fe..d3f5f03f8b 100644
--- a/public/emoji/1f949.svg
+++ b/public/emoji/1f949.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f94a.png b/public/emoji/1f94a.png
deleted file mode 100644
index 9838f24e51..0000000000
Binary files a/public/emoji/1f94a.png and /dev/null differ
diff --git a/public/emoji/1f94a.svg b/public/emoji/1f94a.svg
index 752af12e30..9821f08b97 100644
--- a/public/emoji/1f94a.svg
+++ b/public/emoji/1f94a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f94b.png b/public/emoji/1f94b.png
deleted file mode 100644
index 8d6114761f..0000000000
Binary files a/public/emoji/1f94b.png and /dev/null differ
diff --git a/public/emoji/1f94b.svg b/public/emoji/1f94b.svg
index 44fc92b840..f4c48eaf79 100644
--- a/public/emoji/1f94b.svg
+++ b/public/emoji/1f94b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f94c.svg b/public/emoji/1f94c.svg
new file mode 100644
index 0000000000..1d4067c6af
--- /dev/null
+++ b/public/emoji/1f94c.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f950.png b/public/emoji/1f950.png
deleted file mode 100644
index fb33feb1a3..0000000000
Binary files a/public/emoji/1f950.png and /dev/null differ
diff --git a/public/emoji/1f950.svg b/public/emoji/1f950.svg
index 184e56c466..4c325029a1 100644
--- a/public/emoji/1f950.svg
+++ b/public/emoji/1f950.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f951.png b/public/emoji/1f951.png
deleted file mode 100644
index 06f0d124ae..0000000000
Binary files a/public/emoji/1f951.png and /dev/null differ
diff --git a/public/emoji/1f951.svg b/public/emoji/1f951.svg
index b8c26d2a41..093bf6984d 100644
--- a/public/emoji/1f951.svg
+++ b/public/emoji/1f951.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f952.png b/public/emoji/1f952.png
deleted file mode 100644
index 500807059d..0000000000
Binary files a/public/emoji/1f952.png and /dev/null differ
diff --git a/public/emoji/1f952.svg b/public/emoji/1f952.svg
index d72b1ceba0..72e66de084 100644
--- a/public/emoji/1f952.svg
+++ b/public/emoji/1f952.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f953.png b/public/emoji/1f953.png
deleted file mode 100644
index f38a485fbe..0000000000
Binary files a/public/emoji/1f953.png and /dev/null differ
diff --git a/public/emoji/1f953.svg b/public/emoji/1f953.svg
index d702dc50c4..9617ade964 100644
--- a/public/emoji/1f953.svg
+++ b/public/emoji/1f953.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f954.png b/public/emoji/1f954.png
deleted file mode 100644
index 70350ca2c0..0000000000
Binary files a/public/emoji/1f954.png and /dev/null differ
diff --git a/public/emoji/1f954.svg b/public/emoji/1f954.svg
index 15d99ff471..4f3744519e 100644
--- a/public/emoji/1f954.svg
+++ b/public/emoji/1f954.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f955.png b/public/emoji/1f955.png
deleted file mode 100644
index c68829b58e..0000000000
Binary files a/public/emoji/1f955.png and /dev/null differ
diff --git a/public/emoji/1f955.svg b/public/emoji/1f955.svg
index 468c7a216b..cf125d4f11 100644
--- a/public/emoji/1f955.svg
+++ b/public/emoji/1f955.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f956.png b/public/emoji/1f956.png
deleted file mode 100644
index 4c2c563982..0000000000
Binary files a/public/emoji/1f956.png and /dev/null differ
diff --git a/public/emoji/1f956.svg b/public/emoji/1f956.svg
index dc1e86fc37..4e00b5746f 100644
--- a/public/emoji/1f956.svg
+++ b/public/emoji/1f956.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f957.png b/public/emoji/1f957.png
deleted file mode 100644
index c89f934115..0000000000
Binary files a/public/emoji/1f957.png and /dev/null differ
diff --git a/public/emoji/1f957.svg b/public/emoji/1f957.svg
index e0a2a01edb..6368a14b46 100644
--- a/public/emoji/1f957.svg
+++ b/public/emoji/1f957.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f958.png b/public/emoji/1f958.png
deleted file mode 100644
index 663a1006ac..0000000000
Binary files a/public/emoji/1f958.png and /dev/null differ
diff --git a/public/emoji/1f958.svg b/public/emoji/1f958.svg
index 2062eae7fb..a90551e1c2 100644
--- a/public/emoji/1f958.svg
+++ b/public/emoji/1f958.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f959.png b/public/emoji/1f959.png
deleted file mode 100644
index a2e10df40a..0000000000
Binary files a/public/emoji/1f959.png and /dev/null differ
diff --git a/public/emoji/1f959.svg b/public/emoji/1f959.svg
index 8be63ab158..dcf10698f8 100644
--- a/public/emoji/1f959.svg
+++ b/public/emoji/1f959.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f95a.png b/public/emoji/1f95a.png
deleted file mode 100644
index c171974d99..0000000000
Binary files a/public/emoji/1f95a.png and /dev/null differ
diff --git a/public/emoji/1f95a.svg b/public/emoji/1f95a.svg
index 005e3e6af0..292ed7e8ef 100644
--- a/public/emoji/1f95a.svg
+++ b/public/emoji/1f95a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f95b.png b/public/emoji/1f95b.png
deleted file mode 100644
index e4fcf2e64f..0000000000
Binary files a/public/emoji/1f95b.png and /dev/null differ
diff --git a/public/emoji/1f95b.svg b/public/emoji/1f95b.svg
index 877c0521c6..7157c078b8 100644
--- a/public/emoji/1f95b.svg
+++ b/public/emoji/1f95b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f95c.png b/public/emoji/1f95c.png
deleted file mode 100644
index b64fadad01..0000000000
Binary files a/public/emoji/1f95c.png and /dev/null differ
diff --git a/public/emoji/1f95c.svg b/public/emoji/1f95c.svg
index 3866204ec2..3f8f0244fd 100644
--- a/public/emoji/1f95c.svg
+++ b/public/emoji/1f95c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f95d.png b/public/emoji/1f95d.png
deleted file mode 100644
index dfbd825807..0000000000
Binary files a/public/emoji/1f95d.png and /dev/null differ
diff --git a/public/emoji/1f95d.svg b/public/emoji/1f95d.svg
index d60d50f87e..f25a06289e 100644
--- a/public/emoji/1f95d.svg
+++ b/public/emoji/1f95d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f95e.png b/public/emoji/1f95e.png
deleted file mode 100644
index 6223d1a28e..0000000000
Binary files a/public/emoji/1f95e.png and /dev/null differ
diff --git a/public/emoji/1f95e.svg b/public/emoji/1f95e.svg
index 603a3470d7..1a1769b0c0 100644
--- a/public/emoji/1f95e.svg
+++ b/public/emoji/1f95e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f95f.svg b/public/emoji/1f95f.svg
new file mode 100644
index 0000000000..9044b39980
--- /dev/null
+++ b/public/emoji/1f95f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f960.svg b/public/emoji/1f960.svg
new file mode 100644
index 0000000000..bc2052056f
--- /dev/null
+++ b/public/emoji/1f960.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f961.svg b/public/emoji/1f961.svg
new file mode 100644
index 0000000000..81fbe98f57
--- /dev/null
+++ b/public/emoji/1f961.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f962.svg b/public/emoji/1f962.svg
new file mode 100644
index 0000000000..fc03175484
--- /dev/null
+++ b/public/emoji/1f962.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f963.svg b/public/emoji/1f963.svg
new file mode 100644
index 0000000000..c5d61ee6c9
--- /dev/null
+++ b/public/emoji/1f963.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f964.svg b/public/emoji/1f964.svg
new file mode 100644
index 0000000000..a229dbbcdf
--- /dev/null
+++ b/public/emoji/1f964.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f965.svg b/public/emoji/1f965.svg
new file mode 100644
index 0000000000..d80d0d9f45
--- /dev/null
+++ b/public/emoji/1f965.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f966.svg b/public/emoji/1f966.svg
new file mode 100644
index 0000000000..e0ae9476d2
--- /dev/null
+++ b/public/emoji/1f966.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f967.svg b/public/emoji/1f967.svg
new file mode 100644
index 0000000000..e4c0fc39a7
--- /dev/null
+++ b/public/emoji/1f967.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f968.svg b/public/emoji/1f968.svg
new file mode 100644
index 0000000000..7aaef3251c
--- /dev/null
+++ b/public/emoji/1f968.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f969.svg b/public/emoji/1f969.svg
new file mode 100644
index 0000000000..3b9d7741d5
--- /dev/null
+++ b/public/emoji/1f969.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f96a.svg b/public/emoji/1f96a.svg
new file mode 100644
index 0000000000..c708089af1
--- /dev/null
+++ b/public/emoji/1f96a.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f96b.svg b/public/emoji/1f96b.svg
new file mode 100644
index 0000000000..bef3815b1e
--- /dev/null
+++ b/public/emoji/1f96b.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f980.png b/public/emoji/1f980.png
deleted file mode 100644
index 19f3047ab6..0000000000
Binary files a/public/emoji/1f980.png and /dev/null differ
diff --git a/public/emoji/1f980.svg b/public/emoji/1f980.svg
index 1f7936f4a7..5c98af4a57 100644
--- a/public/emoji/1f980.svg
+++ b/public/emoji/1f980.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f981.png b/public/emoji/1f981.png
deleted file mode 100644
index 5062ab47ec..0000000000
Binary files a/public/emoji/1f981.png and /dev/null differ
diff --git a/public/emoji/1f981.svg b/public/emoji/1f981.svg
index 965e4ef210..51707e184a 100644
--- a/public/emoji/1f981.svg
+++ b/public/emoji/1f981.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f982.png b/public/emoji/1f982.png
deleted file mode 100644
index 449a6b281c..0000000000
Binary files a/public/emoji/1f982.png and /dev/null differ
diff --git a/public/emoji/1f982.svg b/public/emoji/1f982.svg
index a1afc315cd..c6c3fe93ff 100644
--- a/public/emoji/1f982.svg
+++ b/public/emoji/1f982.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f983.png b/public/emoji/1f983.png
deleted file mode 100644
index 344af94c9e..0000000000
Binary files a/public/emoji/1f983.png and /dev/null differ
diff --git a/public/emoji/1f983.svg b/public/emoji/1f983.svg
index 59cc30fe36..c35118cc4a 100644
--- a/public/emoji/1f983.svg
+++ b/public/emoji/1f983.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f984.png b/public/emoji/1f984.png
deleted file mode 100644
index 05a97969f7..0000000000
Binary files a/public/emoji/1f984.png and /dev/null differ
diff --git a/public/emoji/1f984.svg b/public/emoji/1f984.svg
index 507937d7a0..a996b38614 100644
--- a/public/emoji/1f984.svg
+++ b/public/emoji/1f984.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f985.png b/public/emoji/1f985.png
deleted file mode 100644
index 4f277debee..0000000000
Binary files a/public/emoji/1f985.png and /dev/null differ
diff --git a/public/emoji/1f985.svg b/public/emoji/1f985.svg
index afba6f983f..c96b06e7af 100644
--- a/public/emoji/1f985.svg
+++ b/public/emoji/1f985.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f986.png b/public/emoji/1f986.png
deleted file mode 100644
index 74330b77ca..0000000000
Binary files a/public/emoji/1f986.png and /dev/null differ
diff --git a/public/emoji/1f986.svg b/public/emoji/1f986.svg
index ee80f71d87..d047b47cb5 100644
--- a/public/emoji/1f986.svg
+++ b/public/emoji/1f986.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f987.png b/public/emoji/1f987.png
deleted file mode 100644
index 3152c047e0..0000000000
Binary files a/public/emoji/1f987.png and /dev/null differ
diff --git a/public/emoji/1f987.svg b/public/emoji/1f987.svg
index 77c26c9842..2a73047926 100644
--- a/public/emoji/1f987.svg
+++ b/public/emoji/1f987.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f988.png b/public/emoji/1f988.png
deleted file mode 100644
index c75076d57d..0000000000
Binary files a/public/emoji/1f988.png and /dev/null differ
diff --git a/public/emoji/1f988.svg b/public/emoji/1f988.svg
index c1fffcd291..81409bbc4d 100644
--- a/public/emoji/1f988.svg
+++ b/public/emoji/1f988.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f989.png b/public/emoji/1f989.png
deleted file mode 100644
index fa6815480c..0000000000
Binary files a/public/emoji/1f989.png and /dev/null differ
diff --git a/public/emoji/1f989.svg b/public/emoji/1f989.svg
index bde42fe1c9..10a2cbaa25 100644
--- a/public/emoji/1f989.svg
+++ b/public/emoji/1f989.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f98a.png b/public/emoji/1f98a.png
deleted file mode 100644
index 1ab339bf05..0000000000
Binary files a/public/emoji/1f98a.png and /dev/null differ
diff --git a/public/emoji/1f98a.svg b/public/emoji/1f98a.svg
index 28f9072f55..8603d9180e 100644
--- a/public/emoji/1f98a.svg
+++ b/public/emoji/1f98a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f98b.png b/public/emoji/1f98b.png
deleted file mode 100644
index 5631fe9922..0000000000
Binary files a/public/emoji/1f98b.png and /dev/null differ
diff --git a/public/emoji/1f98b.svg b/public/emoji/1f98b.svg
index 794e94d395..457b722a52 100644
--- a/public/emoji/1f98b.svg
+++ b/public/emoji/1f98b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f98c.png b/public/emoji/1f98c.png
deleted file mode 100644
index d8698195ff..0000000000
Binary files a/public/emoji/1f98c.png and /dev/null differ
diff --git a/public/emoji/1f98c.svg b/public/emoji/1f98c.svg
index a70a64169e..5a753e0d1b 100644
--- a/public/emoji/1f98c.svg
+++ b/public/emoji/1f98c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f98d.png b/public/emoji/1f98d.png
deleted file mode 100644
index acc51e1362..0000000000
Binary files a/public/emoji/1f98d.png and /dev/null differ
diff --git a/public/emoji/1f98d.svg b/public/emoji/1f98d.svg
index 2c27214fd6..8cf5a02bba 100644
--- a/public/emoji/1f98d.svg
+++ b/public/emoji/1f98d.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f98e.png b/public/emoji/1f98e.png
deleted file mode 100644
index 8363876050..0000000000
Binary files a/public/emoji/1f98e.png and /dev/null differ
diff --git a/public/emoji/1f98e.svg b/public/emoji/1f98e.svg
index 4f15955dbc..21f1b5d27a 100644
--- a/public/emoji/1f98e.svg
+++ b/public/emoji/1f98e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f98f.png b/public/emoji/1f98f.png
deleted file mode 100644
index 12f4e0d9d9..0000000000
Binary files a/public/emoji/1f98f.png and /dev/null differ
diff --git a/public/emoji/1f98f.svg b/public/emoji/1f98f.svg
index 7329b384e6..cda2c04d03 100644
--- a/public/emoji/1f98f.svg
+++ b/public/emoji/1f98f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f990.png b/public/emoji/1f990.png
deleted file mode 100644
index 49eff28a71..0000000000
Binary files a/public/emoji/1f990.png and /dev/null differ
diff --git a/public/emoji/1f990.svg b/public/emoji/1f990.svg
index 7cf07ad10b..741d889d71 100644
--- a/public/emoji/1f990.svg
+++ b/public/emoji/1f990.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f991.png b/public/emoji/1f991.png
deleted file mode 100644
index d2af223f0c..0000000000
Binary files a/public/emoji/1f991.png and /dev/null differ
diff --git a/public/emoji/1f991.svg b/public/emoji/1f991.svg
index c7e876402e..8ef80f8ff9 100644
--- a/public/emoji/1f991.svg
+++ b/public/emoji/1f991.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f992.svg b/public/emoji/1f992.svg
new file mode 100644
index 0000000000..5e43bb4a8e
--- /dev/null
+++ b/public/emoji/1f992.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f993.svg b/public/emoji/1f993.svg
new file mode 100644
index 0000000000..afec3170d6
--- /dev/null
+++ b/public/emoji/1f993.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f994.svg b/public/emoji/1f994.svg
new file mode 100644
index 0000000000..52361720ce
--- /dev/null
+++ b/public/emoji/1f994.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f995.svg b/public/emoji/1f995.svg
new file mode 100644
index 0000000000..c424c6a2e3
--- /dev/null
+++ b/public/emoji/1f995.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f996.svg b/public/emoji/1f996.svg
new file mode 100644
index 0000000000..71bb2c5f9b
--- /dev/null
+++ b/public/emoji/1f996.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f997.svg b/public/emoji/1f997.svg
new file mode 100644
index 0000000000..91ab418c95
--- /dev/null
+++ b/public/emoji/1f997.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9c0.png b/public/emoji/1f9c0.png
deleted file mode 100644
index 00e9976228..0000000000
Binary files a/public/emoji/1f9c0.png and /dev/null differ
diff --git a/public/emoji/1f9c0.svg b/public/emoji/1f9c0.svg
index 3cbd809688..a9ebf6cccc 100644
--- a/public/emoji/1f9c0.svg
+++ b/public/emoji/1f9c0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/1f9d0.svg b/public/emoji/1f9d0.svg
new file mode 100644
index 0000000000..e07680481b
--- /dev/null
+++ b/public/emoji/1f9d0.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d1-1f3fb.svg b/public/emoji/1f9d1-1f3fb.svg
new file mode 100644
index 0000000000..915e141710
--- /dev/null
+++ b/public/emoji/1f9d1-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d1-1f3fc.svg b/public/emoji/1f9d1-1f3fc.svg
new file mode 100644
index 0000000000..9872b9b895
--- /dev/null
+++ b/public/emoji/1f9d1-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d1-1f3fd.svg b/public/emoji/1f9d1-1f3fd.svg
new file mode 100644
index 0000000000..87ad5b5329
--- /dev/null
+++ b/public/emoji/1f9d1-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d1-1f3fe.svg b/public/emoji/1f9d1-1f3fe.svg
new file mode 100644
index 0000000000..f63bc5a2a2
--- /dev/null
+++ b/public/emoji/1f9d1-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d1-1f3ff.svg b/public/emoji/1f9d1-1f3ff.svg
new file mode 100644
index 0000000000..199a8bf447
--- /dev/null
+++ b/public/emoji/1f9d1-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d1.svg b/public/emoji/1f9d1.svg
new file mode 100644
index 0000000000..18aae372f5
--- /dev/null
+++ b/public/emoji/1f9d1.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d2-1f3fb.svg b/public/emoji/1f9d2-1f3fb.svg
new file mode 100644
index 0000000000..ee17b4cbed
--- /dev/null
+++ b/public/emoji/1f9d2-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d2-1f3fc.svg b/public/emoji/1f9d2-1f3fc.svg
new file mode 100644
index 0000000000..eb8dc7832b
--- /dev/null
+++ b/public/emoji/1f9d2-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d2-1f3fd.svg b/public/emoji/1f9d2-1f3fd.svg
new file mode 100644
index 0000000000..6a202d60e3
--- /dev/null
+++ b/public/emoji/1f9d2-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d2-1f3fe.svg b/public/emoji/1f9d2-1f3fe.svg
new file mode 100644
index 0000000000..b4cd560c46
--- /dev/null
+++ b/public/emoji/1f9d2-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d2-1f3ff.svg b/public/emoji/1f9d2-1f3ff.svg
new file mode 100644
index 0000000000..b805d80a99
--- /dev/null
+++ b/public/emoji/1f9d2-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d2.svg b/public/emoji/1f9d2.svg
new file mode 100644
index 0000000000..f352b41dda
--- /dev/null
+++ b/public/emoji/1f9d2.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d3-1f3fb.svg b/public/emoji/1f9d3-1f3fb.svg
new file mode 100644
index 0000000000..6721beb4ae
--- /dev/null
+++ b/public/emoji/1f9d3-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d3-1f3fc.svg b/public/emoji/1f9d3-1f3fc.svg
new file mode 100644
index 0000000000..ba61f7f162
--- /dev/null
+++ b/public/emoji/1f9d3-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d3-1f3fd.svg b/public/emoji/1f9d3-1f3fd.svg
new file mode 100644
index 0000000000..78868e3e02
--- /dev/null
+++ b/public/emoji/1f9d3-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d3-1f3fe.svg b/public/emoji/1f9d3-1f3fe.svg
new file mode 100644
index 0000000000..472ee9c7bf
--- /dev/null
+++ b/public/emoji/1f9d3-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d3-1f3ff.svg b/public/emoji/1f9d3-1f3ff.svg
new file mode 100644
index 0000000000..efaff91a81
--- /dev/null
+++ b/public/emoji/1f9d3-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d3.svg b/public/emoji/1f9d3.svg
new file mode 100644
index 0000000000..3576010394
--- /dev/null
+++ b/public/emoji/1f9d3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d4-1f3fb.svg b/public/emoji/1f9d4-1f3fb.svg
new file mode 100644
index 0000000000..f4583cc92d
--- /dev/null
+++ b/public/emoji/1f9d4-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d4-1f3fc.svg b/public/emoji/1f9d4-1f3fc.svg
new file mode 100644
index 0000000000..0b6de72fdb
--- /dev/null
+++ b/public/emoji/1f9d4-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d4-1f3fd.svg b/public/emoji/1f9d4-1f3fd.svg
new file mode 100644
index 0000000000..413b79b825
--- /dev/null
+++ b/public/emoji/1f9d4-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d4-1f3fe.svg b/public/emoji/1f9d4-1f3fe.svg
new file mode 100644
index 0000000000..9f6dbcad71
--- /dev/null
+++ b/public/emoji/1f9d4-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d4-1f3ff.svg b/public/emoji/1f9d4-1f3ff.svg
new file mode 100644
index 0000000000..7da8277651
--- /dev/null
+++ b/public/emoji/1f9d4-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d4.svg b/public/emoji/1f9d4.svg
new file mode 100644
index 0000000000..8dc1733562
--- /dev/null
+++ b/public/emoji/1f9d4.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d5-1f3fb.svg b/public/emoji/1f9d5-1f3fb.svg
new file mode 100644
index 0000000000..c41266b7c3
--- /dev/null
+++ b/public/emoji/1f9d5-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d5-1f3fc.svg b/public/emoji/1f9d5-1f3fc.svg
new file mode 100644
index 0000000000..0ee84dfcfd
--- /dev/null
+++ b/public/emoji/1f9d5-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d5-1f3fd.svg b/public/emoji/1f9d5-1f3fd.svg
new file mode 100644
index 0000000000..bc4cac0dc5
--- /dev/null
+++ b/public/emoji/1f9d5-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d5-1f3fe.svg b/public/emoji/1f9d5-1f3fe.svg
new file mode 100644
index 0000000000..aa5081bae4
--- /dev/null
+++ b/public/emoji/1f9d5-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d5-1f3ff.svg b/public/emoji/1f9d5-1f3ff.svg
new file mode 100644
index 0000000000..827bfaf9de
--- /dev/null
+++ b/public/emoji/1f9d5-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d5.svg b/public/emoji/1f9d5.svg
new file mode 100644
index 0000000000..6ddfb5a499
--- /dev/null
+++ b/public/emoji/1f9d5.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f9d6-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..9a65636b36
--- /dev/null
+++ b/public/emoji/1f9d6-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f9d6-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..5a623944af
--- /dev/null
+++ b/public/emoji/1f9d6-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3fb.svg b/public/emoji/1f9d6-1f3fb.svg
new file mode 100644
index 0000000000..9a65636b36
--- /dev/null
+++ b/public/emoji/1f9d6-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f9d6-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..435e88fe98
--- /dev/null
+++ b/public/emoji/1f9d6-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f9d6-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..d6f1beb07b
--- /dev/null
+++ b/public/emoji/1f9d6-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3fc.svg b/public/emoji/1f9d6-1f3fc.svg
new file mode 100644
index 0000000000..435e88fe98
--- /dev/null
+++ b/public/emoji/1f9d6-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f9d6-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..b7392561aa
--- /dev/null
+++ b/public/emoji/1f9d6-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f9d6-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..515cb688dd
--- /dev/null
+++ b/public/emoji/1f9d6-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3fd.svg b/public/emoji/1f9d6-1f3fd.svg
new file mode 100644
index 0000000000..b7392561aa
--- /dev/null
+++ b/public/emoji/1f9d6-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f9d6-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..6d101a5692
--- /dev/null
+++ b/public/emoji/1f9d6-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f9d6-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..e43dde27a8
--- /dev/null
+++ b/public/emoji/1f9d6-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3fe.svg b/public/emoji/1f9d6-1f3fe.svg
new file mode 100644
index 0000000000..6d101a5692
--- /dev/null
+++ b/public/emoji/1f9d6-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f9d6-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..205eb57472
--- /dev/null
+++ b/public/emoji/1f9d6-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f9d6-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..f271c855f6
--- /dev/null
+++ b/public/emoji/1f9d6-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-1f3ff.svg b/public/emoji/1f9d6-1f3ff.svg
new file mode 100644
index 0000000000..205eb57472
--- /dev/null
+++ b/public/emoji/1f9d6-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-200d-2640-fe0f.svg b/public/emoji/1f9d6-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..fea6a9391e
--- /dev/null
+++ b/public/emoji/1f9d6-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6-200d-2642-fe0f.svg b/public/emoji/1f9d6-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..d9c9c1534b
--- /dev/null
+++ b/public/emoji/1f9d6-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d6.svg b/public/emoji/1f9d6.svg
new file mode 100644
index 0000000000..fea6a9391e
--- /dev/null
+++ b/public/emoji/1f9d6.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f9d7-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..fca1a442ab
--- /dev/null
+++ b/public/emoji/1f9d7-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f9d7-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..144d2f4f52
--- /dev/null
+++ b/public/emoji/1f9d7-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3fb.svg b/public/emoji/1f9d7-1f3fb.svg
new file mode 100644
index 0000000000..144d2f4f52
--- /dev/null
+++ b/public/emoji/1f9d7-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f9d7-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..570da6962b
--- /dev/null
+++ b/public/emoji/1f9d7-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f9d7-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..fd28bf2f42
--- /dev/null
+++ b/public/emoji/1f9d7-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3fc.svg b/public/emoji/1f9d7-1f3fc.svg
new file mode 100644
index 0000000000..fd28bf2f42
--- /dev/null
+++ b/public/emoji/1f9d7-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f9d7-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..8da25887cc
--- /dev/null
+++ b/public/emoji/1f9d7-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f9d7-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..c4a08dab1e
--- /dev/null
+++ b/public/emoji/1f9d7-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3fd.svg b/public/emoji/1f9d7-1f3fd.svg
new file mode 100644
index 0000000000..c4a08dab1e
--- /dev/null
+++ b/public/emoji/1f9d7-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f9d7-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..e0b694853c
--- /dev/null
+++ b/public/emoji/1f9d7-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f9d7-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..470762e1f5
--- /dev/null
+++ b/public/emoji/1f9d7-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3fe.svg b/public/emoji/1f9d7-1f3fe.svg
new file mode 100644
index 0000000000..470762e1f5
--- /dev/null
+++ b/public/emoji/1f9d7-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f9d7-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..8856dc16e0
--- /dev/null
+++ b/public/emoji/1f9d7-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f9d7-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..4bff510717
--- /dev/null
+++ b/public/emoji/1f9d7-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-1f3ff.svg b/public/emoji/1f9d7-1f3ff.svg
new file mode 100644
index 0000000000..4bff510717
--- /dev/null
+++ b/public/emoji/1f9d7-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-200d-2640-fe0f.svg b/public/emoji/1f9d7-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..36f14c8ccb
--- /dev/null
+++ b/public/emoji/1f9d7-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7-200d-2642-fe0f.svg b/public/emoji/1f9d7-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..95db1647f7
--- /dev/null
+++ b/public/emoji/1f9d7-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d7.svg b/public/emoji/1f9d7.svg
new file mode 100644
index 0000000000..95db1647f7
--- /dev/null
+++ b/public/emoji/1f9d7.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f9d8-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..8bd6178dc1
--- /dev/null
+++ b/public/emoji/1f9d8-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f9d8-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..6a65728f4c
--- /dev/null
+++ b/public/emoji/1f9d8-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3fb.svg b/public/emoji/1f9d8-1f3fb.svg
new file mode 100644
index 0000000000..8bd6178dc1
--- /dev/null
+++ b/public/emoji/1f9d8-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f9d8-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..25eb489e3e
--- /dev/null
+++ b/public/emoji/1f9d8-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f9d8-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..426c5de953
--- /dev/null
+++ b/public/emoji/1f9d8-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3fc.svg b/public/emoji/1f9d8-1f3fc.svg
new file mode 100644
index 0000000000..25eb489e3e
--- /dev/null
+++ b/public/emoji/1f9d8-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f9d8-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..0f015f02dc
--- /dev/null
+++ b/public/emoji/1f9d8-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f9d8-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..8a15c25454
--- /dev/null
+++ b/public/emoji/1f9d8-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3fd.svg b/public/emoji/1f9d8-1f3fd.svg
new file mode 100644
index 0000000000..0f015f02dc
--- /dev/null
+++ b/public/emoji/1f9d8-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f9d8-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..71f6a958d5
--- /dev/null
+++ b/public/emoji/1f9d8-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f9d8-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..ea2cd80cf1
--- /dev/null
+++ b/public/emoji/1f9d8-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3fe.svg b/public/emoji/1f9d8-1f3fe.svg
new file mode 100644
index 0000000000..71f6a958d5
--- /dev/null
+++ b/public/emoji/1f9d8-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f9d8-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..0fcf4b16b3
--- /dev/null
+++ b/public/emoji/1f9d8-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f9d8-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..bfbf1da807
--- /dev/null
+++ b/public/emoji/1f9d8-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-1f3ff.svg b/public/emoji/1f9d8-1f3ff.svg
new file mode 100644
index 0000000000..0fcf4b16b3
--- /dev/null
+++ b/public/emoji/1f9d8-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-200d-2640-fe0f.svg b/public/emoji/1f9d8-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..344e7ce05c
--- /dev/null
+++ b/public/emoji/1f9d8-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8-200d-2642-fe0f.svg b/public/emoji/1f9d8-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..6e6ffdd620
--- /dev/null
+++ b/public/emoji/1f9d8-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d8.svg b/public/emoji/1f9d8.svg
new file mode 100644
index 0000000000..344e7ce05c
--- /dev/null
+++ b/public/emoji/1f9d8.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f9d9-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..b0960fa6e1
--- /dev/null
+++ b/public/emoji/1f9d9-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f9d9-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..4710995116
--- /dev/null
+++ b/public/emoji/1f9d9-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3fb.svg b/public/emoji/1f9d9-1f3fb.svg
new file mode 100644
index 0000000000..4710995116
--- /dev/null
+++ b/public/emoji/1f9d9-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f9d9-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..111b4d80f8
--- /dev/null
+++ b/public/emoji/1f9d9-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f9d9-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..d82ff1c2d0
--- /dev/null
+++ b/public/emoji/1f9d9-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3fc.svg b/public/emoji/1f9d9-1f3fc.svg
new file mode 100644
index 0000000000..d82ff1c2d0
--- /dev/null
+++ b/public/emoji/1f9d9-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f9d9-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..0899b523c6
--- /dev/null
+++ b/public/emoji/1f9d9-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f9d9-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..05564a9bff
--- /dev/null
+++ b/public/emoji/1f9d9-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3fd.svg b/public/emoji/1f9d9-1f3fd.svg
new file mode 100644
index 0000000000..05564a9bff
--- /dev/null
+++ b/public/emoji/1f9d9-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f9d9-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..6bfe7c68f8
--- /dev/null
+++ b/public/emoji/1f9d9-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f9d9-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..9db5339945
--- /dev/null
+++ b/public/emoji/1f9d9-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3fe.svg b/public/emoji/1f9d9-1f3fe.svg
new file mode 100644
index 0000000000..9db5339945
--- /dev/null
+++ b/public/emoji/1f9d9-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f9d9-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..4c4a326d02
--- /dev/null
+++ b/public/emoji/1f9d9-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f9d9-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..2967e532fa
--- /dev/null
+++ b/public/emoji/1f9d9-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-1f3ff.svg b/public/emoji/1f9d9-1f3ff.svg
new file mode 100644
index 0000000000..2967e532fa
--- /dev/null
+++ b/public/emoji/1f9d9-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-200d-2640-fe0f.svg b/public/emoji/1f9d9-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..95b8b5f7b1
--- /dev/null
+++ b/public/emoji/1f9d9-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9-200d-2642-fe0f.svg b/public/emoji/1f9d9-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..814783e13c
--- /dev/null
+++ b/public/emoji/1f9d9-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9d9.svg b/public/emoji/1f9d9.svg
new file mode 100644
index 0000000000..814783e13c
--- /dev/null
+++ b/public/emoji/1f9d9.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f9da-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..ca2a9a0218
--- /dev/null
+++ b/public/emoji/1f9da-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f9da-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..a2a8c0ec32
--- /dev/null
+++ b/public/emoji/1f9da-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3fb.svg b/public/emoji/1f9da-1f3fb.svg
new file mode 100644
index 0000000000..ca2a9a0218
--- /dev/null
+++ b/public/emoji/1f9da-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f9da-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..e7a2657171
--- /dev/null
+++ b/public/emoji/1f9da-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f9da-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..f832ccb7ad
--- /dev/null
+++ b/public/emoji/1f9da-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3fc.svg b/public/emoji/1f9da-1f3fc.svg
new file mode 100644
index 0000000000..e7a2657171
--- /dev/null
+++ b/public/emoji/1f9da-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f9da-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..1cf49450fa
--- /dev/null
+++ b/public/emoji/1f9da-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f9da-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..11393bdf7e
--- /dev/null
+++ b/public/emoji/1f9da-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3fd.svg b/public/emoji/1f9da-1f3fd.svg
new file mode 100644
index 0000000000..1cf49450fa
--- /dev/null
+++ b/public/emoji/1f9da-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f9da-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..c79b2ff9c5
--- /dev/null
+++ b/public/emoji/1f9da-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f9da-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..7393eedaa7
--- /dev/null
+++ b/public/emoji/1f9da-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3fe.svg b/public/emoji/1f9da-1f3fe.svg
new file mode 100644
index 0000000000..c79b2ff9c5
--- /dev/null
+++ b/public/emoji/1f9da-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f9da-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..fa73e9e790
--- /dev/null
+++ b/public/emoji/1f9da-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f9da-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..7b23d046ae
--- /dev/null
+++ b/public/emoji/1f9da-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-1f3ff.svg b/public/emoji/1f9da-1f3ff.svg
new file mode 100644
index 0000000000..fa73e9e790
--- /dev/null
+++ b/public/emoji/1f9da-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-200d-2640-fe0f.svg b/public/emoji/1f9da-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..9a0b3b4c50
--- /dev/null
+++ b/public/emoji/1f9da-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da-200d-2642-fe0f.svg b/public/emoji/1f9da-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..3634760fc8
--- /dev/null
+++ b/public/emoji/1f9da-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9da.svg b/public/emoji/1f9da.svg
new file mode 100644
index 0000000000..9a0b3b4c50
--- /dev/null
+++ b/public/emoji/1f9da.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f9db-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..b32bfd5ba4
--- /dev/null
+++ b/public/emoji/1f9db-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f9db-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..6a2e57e6cb
--- /dev/null
+++ b/public/emoji/1f9db-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3fb.svg b/public/emoji/1f9db-1f3fb.svg
new file mode 100644
index 0000000000..6a2e57e6cb
--- /dev/null
+++ b/public/emoji/1f9db-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f9db-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..5b45c6a5d6
--- /dev/null
+++ b/public/emoji/1f9db-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f9db-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..977d040202
--- /dev/null
+++ b/public/emoji/1f9db-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3fc.svg b/public/emoji/1f9db-1f3fc.svg
new file mode 100644
index 0000000000..977d040202
--- /dev/null
+++ b/public/emoji/1f9db-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f9db-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..f4b3aea671
--- /dev/null
+++ b/public/emoji/1f9db-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f9db-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..97a93aac06
--- /dev/null
+++ b/public/emoji/1f9db-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3fd.svg b/public/emoji/1f9db-1f3fd.svg
new file mode 100644
index 0000000000..97a93aac06
--- /dev/null
+++ b/public/emoji/1f9db-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f9db-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..70aa844e99
--- /dev/null
+++ b/public/emoji/1f9db-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f9db-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..6afba45ce8
--- /dev/null
+++ b/public/emoji/1f9db-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3fe.svg b/public/emoji/1f9db-1f3fe.svg
new file mode 100644
index 0000000000..6afba45ce8
--- /dev/null
+++ b/public/emoji/1f9db-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f9db-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..532b32ce16
--- /dev/null
+++ b/public/emoji/1f9db-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f9db-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..30adcd8646
--- /dev/null
+++ b/public/emoji/1f9db-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-1f3ff.svg b/public/emoji/1f9db-1f3ff.svg
new file mode 100644
index 0000000000..30adcd8646
--- /dev/null
+++ b/public/emoji/1f9db-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-200d-2640-fe0f.svg b/public/emoji/1f9db-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..d0aa04d0da
--- /dev/null
+++ b/public/emoji/1f9db-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db-200d-2642-fe0f.svg b/public/emoji/1f9db-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..9719a1de4f
--- /dev/null
+++ b/public/emoji/1f9db-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9db.svg b/public/emoji/1f9db.svg
new file mode 100644
index 0000000000..9719a1de4f
--- /dev/null
+++ b/public/emoji/1f9db.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f9dc-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..e237ae2929
--- /dev/null
+++ b/public/emoji/1f9dc-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f9dc-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..c6d8341d51
--- /dev/null
+++ b/public/emoji/1f9dc-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3fb.svg b/public/emoji/1f9dc-1f3fb.svg
new file mode 100644
index 0000000000..e237ae2929
--- /dev/null
+++ b/public/emoji/1f9dc-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f9dc-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..3198168825
--- /dev/null
+++ b/public/emoji/1f9dc-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f9dc-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..fd1d1b6ddd
--- /dev/null
+++ b/public/emoji/1f9dc-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3fc.svg b/public/emoji/1f9dc-1f3fc.svg
new file mode 100644
index 0000000000..3198168825
--- /dev/null
+++ b/public/emoji/1f9dc-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f9dc-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..29ae6e9a26
--- /dev/null
+++ b/public/emoji/1f9dc-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f9dc-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..c71ebcaf03
--- /dev/null
+++ b/public/emoji/1f9dc-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3fd.svg b/public/emoji/1f9dc-1f3fd.svg
new file mode 100644
index 0000000000..29ae6e9a26
--- /dev/null
+++ b/public/emoji/1f9dc-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f9dc-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..4d74cce5c8
--- /dev/null
+++ b/public/emoji/1f9dc-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f9dc-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..33a7228537
--- /dev/null
+++ b/public/emoji/1f9dc-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3fe.svg b/public/emoji/1f9dc-1f3fe.svg
new file mode 100644
index 0000000000..4d74cce5c8
--- /dev/null
+++ b/public/emoji/1f9dc-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f9dc-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..abdd82796f
--- /dev/null
+++ b/public/emoji/1f9dc-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f9dc-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..51b1d082e2
--- /dev/null
+++ b/public/emoji/1f9dc-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-1f3ff.svg b/public/emoji/1f9dc-1f3ff.svg
new file mode 100644
index 0000000000..abdd82796f
--- /dev/null
+++ b/public/emoji/1f9dc-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-200d-2640-fe0f.svg b/public/emoji/1f9dc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..ce3976137e
--- /dev/null
+++ b/public/emoji/1f9dc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc-200d-2642-fe0f.svg b/public/emoji/1f9dc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..2fc5df5240
--- /dev/null
+++ b/public/emoji/1f9dc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dc.svg b/public/emoji/1f9dc.svg
new file mode 100644
index 0000000000..ce3976137e
--- /dev/null
+++ b/public/emoji/1f9dc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3fb-200d-2640-fe0f.svg b/public/emoji/1f9dd-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..5214ac009a
--- /dev/null
+++ b/public/emoji/1f9dd-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3fb-200d-2642-fe0f.svg b/public/emoji/1f9dd-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..84d9dd8f5c
--- /dev/null
+++ b/public/emoji/1f9dd-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3fb.svg b/public/emoji/1f9dd-1f3fb.svg
new file mode 100644
index 0000000000..84d9dd8f5c
--- /dev/null
+++ b/public/emoji/1f9dd-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3fc-200d-2640-fe0f.svg b/public/emoji/1f9dd-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..fe418bcac5
--- /dev/null
+++ b/public/emoji/1f9dd-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3fc-200d-2642-fe0f.svg b/public/emoji/1f9dd-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..3399fdde42
--- /dev/null
+++ b/public/emoji/1f9dd-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3fc.svg b/public/emoji/1f9dd-1f3fc.svg
new file mode 100644
index 0000000000..3399fdde42
--- /dev/null
+++ b/public/emoji/1f9dd-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3fd-200d-2640-fe0f.svg b/public/emoji/1f9dd-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..fc11d24c6f
--- /dev/null
+++ b/public/emoji/1f9dd-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3fd-200d-2642-fe0f.svg b/public/emoji/1f9dd-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..181feba5a7
--- /dev/null
+++ b/public/emoji/1f9dd-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3fd.svg b/public/emoji/1f9dd-1f3fd.svg
new file mode 100644
index 0000000000..181feba5a7
--- /dev/null
+++ b/public/emoji/1f9dd-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3fe-200d-2640-fe0f.svg b/public/emoji/1f9dd-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..5c0123f832
--- /dev/null
+++ b/public/emoji/1f9dd-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3fe-200d-2642-fe0f.svg b/public/emoji/1f9dd-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..f7b2c321e4
--- /dev/null
+++ b/public/emoji/1f9dd-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3fe.svg b/public/emoji/1f9dd-1f3fe.svg
new file mode 100644
index 0000000000..f7b2c321e4
--- /dev/null
+++ b/public/emoji/1f9dd-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3ff-200d-2640-fe0f.svg b/public/emoji/1f9dd-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..9b6f37fb01
--- /dev/null
+++ b/public/emoji/1f9dd-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3ff-200d-2642-fe0f.svg b/public/emoji/1f9dd-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..c05267d4b5
--- /dev/null
+++ b/public/emoji/1f9dd-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-1f3ff.svg b/public/emoji/1f9dd-1f3ff.svg
new file mode 100644
index 0000000000..c05267d4b5
--- /dev/null
+++ b/public/emoji/1f9dd-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-200d-2640-fe0f.svg b/public/emoji/1f9dd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..49c6a4ba98
--- /dev/null
+++ b/public/emoji/1f9dd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd-200d-2642-fe0f.svg b/public/emoji/1f9dd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..c9714d2a90
--- /dev/null
+++ b/public/emoji/1f9dd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9dd.svg b/public/emoji/1f9dd.svg
new file mode 100644
index 0000000000..c9714d2a90
--- /dev/null
+++ b/public/emoji/1f9dd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9de-200d-2640-fe0f.svg b/public/emoji/1f9de-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..dfcd6d61c4
--- /dev/null
+++ b/public/emoji/1f9de-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9de-200d-2642-fe0f.svg b/public/emoji/1f9de-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..0301523635
--- /dev/null
+++ b/public/emoji/1f9de-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9de.svg b/public/emoji/1f9de.svg
new file mode 100644
index 0000000000..0301523635
--- /dev/null
+++ b/public/emoji/1f9de.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9df-200d-2640-fe0f.svg b/public/emoji/1f9df-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..deb582f562
--- /dev/null
+++ b/public/emoji/1f9df-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9df-200d-2642-fe0f.svg b/public/emoji/1f9df-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..60e086314e
--- /dev/null
+++ b/public/emoji/1f9df-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9df.svg b/public/emoji/1f9df.svg
new file mode 100644
index 0000000000..60e086314e
--- /dev/null
+++ b/public/emoji/1f9df.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9e0.svg b/public/emoji/1f9e0.svg
new file mode 100644
index 0000000000..df291e7405
--- /dev/null
+++ b/public/emoji/1f9e0.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9e1.svg b/public/emoji/1f9e1.svg
new file mode 100644
index 0000000000..2a35e7788c
--- /dev/null
+++ b/public/emoji/1f9e1.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9e2.svg b/public/emoji/1f9e2.svg
new file mode 100644
index 0000000000..68e9079ffe
--- /dev/null
+++ b/public/emoji/1f9e2.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9e3.svg b/public/emoji/1f9e3.svg
new file mode 100644
index 0000000000..09643e41a2
--- /dev/null
+++ b/public/emoji/1f9e3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9e4.svg b/public/emoji/1f9e4.svg
new file mode 100644
index 0000000000..4f34ac5650
--- /dev/null
+++ b/public/emoji/1f9e4.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9e5.svg b/public/emoji/1f9e5.svg
new file mode 100644
index 0000000000..778d9dc873
--- /dev/null
+++ b/public/emoji/1f9e5.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/1f9e6.svg b/public/emoji/1f9e6.svg
new file mode 100644
index 0000000000..a9ccf1e848
--- /dev/null
+++ b/public/emoji/1f9e6.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/203c.png b/public/emoji/203c.png
deleted file mode 100644
index 58a9c528fc..0000000000
Binary files a/public/emoji/203c.png and /dev/null differ
diff --git a/public/emoji/203c.svg b/public/emoji/203c.svg
index 7d2d0dfd1d..955e9dc6a4 100644
--- a/public/emoji/203c.svg
+++ b/public/emoji/203c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2049.png b/public/emoji/2049.png
deleted file mode 100644
index 509813e9bb..0000000000
Binary files a/public/emoji/2049.png and /dev/null differ
diff --git a/public/emoji/2049.svg b/public/emoji/2049.svg
index b39038bb0a..457aab8ea4 100644
--- a/public/emoji/2049.svg
+++ b/public/emoji/2049.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2122.png b/public/emoji/2122.png
deleted file mode 100644
index 7a0c44a2c2..0000000000
Binary files a/public/emoji/2122.png and /dev/null differ
diff --git a/public/emoji/2122.svg b/public/emoji/2122.svg
index 321c2026e3..554777689c 100644
--- a/public/emoji/2122.svg
+++ b/public/emoji/2122.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2139.png b/public/emoji/2139.png
deleted file mode 100644
index 871f2db931..0000000000
Binary files a/public/emoji/2139.png and /dev/null differ
diff --git a/public/emoji/2139.svg b/public/emoji/2139.svg
index 93e13a8aaf..cc2df8c695 100644
--- a/public/emoji/2139.svg
+++ b/public/emoji/2139.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2194.png b/public/emoji/2194.png
deleted file mode 100644
index 7937f24f2a..0000000000
Binary files a/public/emoji/2194.png and /dev/null differ
diff --git a/public/emoji/2194.svg b/public/emoji/2194.svg
index 8ffc7d1db7..7f97d90c9c 100644
--- a/public/emoji/2194.svg
+++ b/public/emoji/2194.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2195.png b/public/emoji/2195.png
deleted file mode 100644
index dfa32b9718..0000000000
Binary files a/public/emoji/2195.png and /dev/null differ
diff --git a/public/emoji/2195.svg b/public/emoji/2195.svg
index 803b79d385..afe63739c9 100644
--- a/public/emoji/2195.svg
+++ b/public/emoji/2195.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2196.png b/public/emoji/2196.png
deleted file mode 100644
index f38718fbe3..0000000000
Binary files a/public/emoji/2196.png and /dev/null differ
diff --git a/public/emoji/2196.svg b/public/emoji/2196.svg
index 7049c485f2..9c3ce342cd 100644
--- a/public/emoji/2196.svg
+++ b/public/emoji/2196.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2197.png b/public/emoji/2197.png
deleted file mode 100644
index c43e12d0f6..0000000000
Binary files a/public/emoji/2197.png and /dev/null differ
diff --git a/public/emoji/2197.svg b/public/emoji/2197.svg
index 73cc6a7e5f..4982e3790a 100644
--- a/public/emoji/2197.svg
+++ b/public/emoji/2197.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2198.png b/public/emoji/2198.png
deleted file mode 100644
index 7e807da739..0000000000
Binary files a/public/emoji/2198.png and /dev/null differ
diff --git a/public/emoji/2198.svg b/public/emoji/2198.svg
index 7a5e9677f3..92a8638844 100644
--- a/public/emoji/2198.svg
+++ b/public/emoji/2198.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2199.png b/public/emoji/2199.png
deleted file mode 100644
index 88b3771607..0000000000
Binary files a/public/emoji/2199.png and /dev/null differ
diff --git a/public/emoji/2199.svg b/public/emoji/2199.svg
index 29c9464255..a0753f6be3 100644
--- a/public/emoji/2199.svg
+++ b/public/emoji/2199.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/21a9.png b/public/emoji/21a9.png
deleted file mode 100644
index ba45c2ad9e..0000000000
Binary files a/public/emoji/21a9.png and /dev/null differ
diff --git a/public/emoji/21a9.svg b/public/emoji/21a9.svg
index 03a61def71..b9a5f59915 100644
--- a/public/emoji/21a9.svg
+++ b/public/emoji/21a9.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/21aa.png b/public/emoji/21aa.png
deleted file mode 100644
index e7258ad326..0000000000
Binary files a/public/emoji/21aa.png and /dev/null differ
diff --git a/public/emoji/21aa.svg b/public/emoji/21aa.svg
index fd4773fd23..d7ecd3656c 100644
--- a/public/emoji/21aa.svg
+++ b/public/emoji/21aa.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23-20e3.svg b/public/emoji/23-20e3.svg
new file mode 100644
index 0000000000..6ec3750246
--- /dev/null
+++ b/public/emoji/23-20e3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/231a.png b/public/emoji/231a.png
deleted file mode 100644
index 64819bc6e2..0000000000
Binary files a/public/emoji/231a.png and /dev/null differ
diff --git a/public/emoji/231a.svg b/public/emoji/231a.svg
index 31cbd09c99..2183609011 100644
--- a/public/emoji/231a.svg
+++ b/public/emoji/231a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/231b.png b/public/emoji/231b.png
deleted file mode 100644
index a5db2d1d3f..0000000000
Binary files a/public/emoji/231b.png and /dev/null differ
diff --git a/public/emoji/231b.svg b/public/emoji/231b.svg
index 18acf0a3ec..4c001222d6 100644
--- a/public/emoji/231b.svg
+++ b/public/emoji/231b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2328.png b/public/emoji/2328.png
deleted file mode 100644
index 75027cb9af..0000000000
Binary files a/public/emoji/2328.png and /dev/null differ
diff --git a/public/emoji/2328.svg b/public/emoji/2328.svg
index c282cf73f8..1004347b07 100644
--- a/public/emoji/2328.svg
+++ b/public/emoji/2328.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23cf.png b/public/emoji/23cf.png
deleted file mode 100644
index ec5cfc4897..0000000000
Binary files a/public/emoji/23cf.png and /dev/null differ
diff --git a/public/emoji/23cf.svg b/public/emoji/23cf.svg
index 2229e4437f..c85f114fa5 100644
--- a/public/emoji/23cf.svg
+++ b/public/emoji/23cf.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23e9.png b/public/emoji/23e9.png
deleted file mode 100644
index c406fedfdb..0000000000
Binary files a/public/emoji/23e9.png and /dev/null differ
diff --git a/public/emoji/23e9.svg b/public/emoji/23e9.svg
index 60d4f822a7..9bbfc6fcba 100644
--- a/public/emoji/23e9.svg
+++ b/public/emoji/23e9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23ea.png b/public/emoji/23ea.png
deleted file mode 100644
index e22e2bd3da..0000000000
Binary files a/public/emoji/23ea.png and /dev/null differ
diff --git a/public/emoji/23ea.svg b/public/emoji/23ea.svg
index 2530af199c..65c35a904e 100644
--- a/public/emoji/23ea.svg
+++ b/public/emoji/23ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23eb.png b/public/emoji/23eb.png
deleted file mode 100644
index 13543d5eef..0000000000
Binary files a/public/emoji/23eb.png and /dev/null differ
diff --git a/public/emoji/23eb.svg b/public/emoji/23eb.svg
index fcc82a94eb..b045d90352 100644
--- a/public/emoji/23eb.svg
+++ b/public/emoji/23eb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23ec.png b/public/emoji/23ec.png
deleted file mode 100644
index 90193bfcb4..0000000000
Binary files a/public/emoji/23ec.png and /dev/null differ
diff --git a/public/emoji/23ec.svg b/public/emoji/23ec.svg
index 17d697dfe8..8c258ce462 100644
--- a/public/emoji/23ec.svg
+++ b/public/emoji/23ec.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23ed.png b/public/emoji/23ed.png
deleted file mode 100644
index f8880d33ba..0000000000
Binary files a/public/emoji/23ed.png and /dev/null differ
diff --git a/public/emoji/23ed.svg b/public/emoji/23ed.svg
index 4202a012d9..179100aa3b 100644
--- a/public/emoji/23ed.svg
+++ b/public/emoji/23ed.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23ee.png b/public/emoji/23ee.png
deleted file mode 100644
index 1ffd0566cf..0000000000
Binary files a/public/emoji/23ee.png and /dev/null differ
diff --git a/public/emoji/23ee.svg b/public/emoji/23ee.svg
index e8d3c4ffe0..7c69b690b8 100644
--- a/public/emoji/23ee.svg
+++ b/public/emoji/23ee.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23ef.png b/public/emoji/23ef.png
deleted file mode 100644
index a9f857139a..0000000000
Binary files a/public/emoji/23ef.png and /dev/null differ
diff --git a/public/emoji/23ef.svg b/public/emoji/23ef.svg
index 2fc2c46d04..bdf3a2f046 100644
--- a/public/emoji/23ef.svg
+++ b/public/emoji/23ef.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23f0.png b/public/emoji/23f0.png
deleted file mode 100644
index cdbc2fbb95..0000000000
Binary files a/public/emoji/23f0.png and /dev/null differ
diff --git a/public/emoji/23f0.svg b/public/emoji/23f0.svg
index fe98612202..5c9c6c9f77 100644
--- a/public/emoji/23f0.svg
+++ b/public/emoji/23f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23f1.png b/public/emoji/23f1.png
deleted file mode 100644
index 8fae1c9a89..0000000000
Binary files a/public/emoji/23f1.png and /dev/null differ
diff --git a/public/emoji/23f1.svg b/public/emoji/23f1.svg
index 051d3d5499..f7bab6c11c 100644
--- a/public/emoji/23f1.svg
+++ b/public/emoji/23f1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23f2.png b/public/emoji/23f2.png
deleted file mode 100644
index 8a3be574c2..0000000000
Binary files a/public/emoji/23f2.png and /dev/null differ
diff --git a/public/emoji/23f2.svg b/public/emoji/23f2.svg
index c8f4446e0a..d5fd91b47a 100644
--- a/public/emoji/23f2.svg
+++ b/public/emoji/23f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23f3.png b/public/emoji/23f3.png
deleted file mode 100644
index b93b15ed6d..0000000000
Binary files a/public/emoji/23f3.png and /dev/null differ
diff --git a/public/emoji/23f3.svg b/public/emoji/23f3.svg
index 803f932307..cab22a1f1b 100644
--- a/public/emoji/23f3.svg
+++ b/public/emoji/23f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23f8.png b/public/emoji/23f8.png
deleted file mode 100644
index 4f07e7ebfd..0000000000
Binary files a/public/emoji/23f8.png and /dev/null differ
diff --git a/public/emoji/23f8.svg b/public/emoji/23f8.svg
index 3247d55a89..9e8995e4ce 100644
--- a/public/emoji/23f8.svg
+++ b/public/emoji/23f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23f9.png b/public/emoji/23f9.png
deleted file mode 100644
index cfa99988ac..0000000000
Binary files a/public/emoji/23f9.png and /dev/null differ
diff --git a/public/emoji/23f9.svg b/public/emoji/23f9.svg
index 874ad6dbc2..608fd561fa 100644
--- a/public/emoji/23f9.svg
+++ b/public/emoji/23f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/23fa.png b/public/emoji/23fa.png
deleted file mode 100644
index ada52830fc..0000000000
Binary files a/public/emoji/23fa.png and /dev/null differ
diff --git a/public/emoji/23fa.svg b/public/emoji/23fa.svg
index 668d682890..4583b10da8 100644
--- a/public/emoji/23fa.svg
+++ b/public/emoji/23fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/24c2.png b/public/emoji/24c2.png
deleted file mode 100644
index 8a3506fc1d..0000000000
Binary files a/public/emoji/24c2.png and /dev/null differ
diff --git a/public/emoji/24c2.svg b/public/emoji/24c2.svg
index fbbf6f8eed..bd4ca96a7e 100644
--- a/public/emoji/24c2.svg
+++ b/public/emoji/24c2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/25aa.png b/public/emoji/25aa.png
deleted file mode 100644
index 48595d3e1a..0000000000
Binary files a/public/emoji/25aa.png and /dev/null differ
diff --git a/public/emoji/25aa.svg b/public/emoji/25aa.svg
index 2d0fa0a394..9d8c004aa7 100644
--- a/public/emoji/25aa.svg
+++ b/public/emoji/25aa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/25ab.png b/public/emoji/25ab.png
deleted file mode 100644
index d7ebdb0c0e..0000000000
Binary files a/public/emoji/25ab.png and /dev/null differ
diff --git a/public/emoji/25ab.svg b/public/emoji/25ab.svg
index ab1ec4d2e3..2da27bef38 100644
--- a/public/emoji/25ab.svg
+++ b/public/emoji/25ab.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/25b6.png b/public/emoji/25b6.png
deleted file mode 100644
index 4e2b682857..0000000000
Binary files a/public/emoji/25b6.png and /dev/null differ
diff --git a/public/emoji/25b6.svg b/public/emoji/25b6.svg
index f7ac18377a..a208b0ec8a 100644
--- a/public/emoji/25b6.svg
+++ b/public/emoji/25b6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/25c0.png b/public/emoji/25c0.png
deleted file mode 100644
index ee38e3b038..0000000000
Binary files a/public/emoji/25c0.png and /dev/null differ
diff --git a/public/emoji/25c0.svg b/public/emoji/25c0.svg
index d67bffccfb..99baa87e31 100644
--- a/public/emoji/25c0.svg
+++ b/public/emoji/25c0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/25fb.png b/public/emoji/25fb.png
deleted file mode 100644
index 8daacf5705..0000000000
Binary files a/public/emoji/25fb.png and /dev/null differ
diff --git a/public/emoji/25fb.svg b/public/emoji/25fb.svg
index c3dd9d3f2b..44c97a58fb 100644
--- a/public/emoji/25fb.svg
+++ b/public/emoji/25fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/25fc.png b/public/emoji/25fc.png
deleted file mode 100644
index 05a30a6aa2..0000000000
Binary files a/public/emoji/25fc.png and /dev/null differ
diff --git a/public/emoji/25fc.svg b/public/emoji/25fc.svg
index bf2f030161..b3cbc0ab32 100644
--- a/public/emoji/25fc.svg
+++ b/public/emoji/25fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/25fd.png b/public/emoji/25fd.png
deleted file mode 100644
index ae87412675..0000000000
Binary files a/public/emoji/25fd.png and /dev/null differ
diff --git a/public/emoji/25fd.svg b/public/emoji/25fd.svg
index 5f5ab3f58b..0d86db1716 100644
--- a/public/emoji/25fd.svg
+++ b/public/emoji/25fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/25fe.png b/public/emoji/25fe.png
deleted file mode 100644
index 39765bba61..0000000000
Binary files a/public/emoji/25fe.png and /dev/null differ
diff --git a/public/emoji/25fe.svg b/public/emoji/25fe.svg
index b2a4c8150c..0224ef0aee 100644
--- a/public/emoji/25fe.svg
+++ b/public/emoji/25fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2600.png b/public/emoji/2600.png
deleted file mode 100644
index fd521ae31a..0000000000
Binary files a/public/emoji/2600.png and /dev/null differ
diff --git a/public/emoji/2600.svg b/public/emoji/2600.svg
index aec6212d72..734d6d2341 100644
--- a/public/emoji/2600.svg
+++ b/public/emoji/2600.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2601.png b/public/emoji/2601.png
deleted file mode 100644
index 5b4f57f77b..0000000000
Binary files a/public/emoji/2601.png and /dev/null differ
diff --git a/public/emoji/2601.svg b/public/emoji/2601.svg
index 3df7fa6e30..76dd8ef5bb 100644
--- a/public/emoji/2601.svg
+++ b/public/emoji/2601.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2602.png b/public/emoji/2602.png
deleted file mode 100644
index 97fe859e74..0000000000
Binary files a/public/emoji/2602.png and /dev/null differ
diff --git a/public/emoji/2602.svg b/public/emoji/2602.svg
index 2105cf10ab..6712133473 100644
--- a/public/emoji/2602.svg
+++ b/public/emoji/2602.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2603.png b/public/emoji/2603.png
deleted file mode 100644
index 896f28502a..0000000000
Binary files a/public/emoji/2603.png and /dev/null differ
diff --git a/public/emoji/2603.svg b/public/emoji/2603.svg
index 8bfcae8fe6..0e3ce22606 100644
--- a/public/emoji/2603.svg
+++ b/public/emoji/2603.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2604.png b/public/emoji/2604.png
deleted file mode 100644
index a99751f79b..0000000000
Binary files a/public/emoji/2604.png and /dev/null differ
diff --git a/public/emoji/2604.svg b/public/emoji/2604.svg
index 7ad1c661d5..3d525c4c55 100644
--- a/public/emoji/2604.svg
+++ b/public/emoji/2604.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/260e.png b/public/emoji/260e.png
deleted file mode 100644
index a1e69f566b..0000000000
Binary files a/public/emoji/260e.png and /dev/null differ
diff --git a/public/emoji/260e.svg b/public/emoji/260e.svg
index 2be32eb0aa..f71c5595da 100644
--- a/public/emoji/260e.svg
+++ b/public/emoji/260e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2611.png b/public/emoji/2611.png
deleted file mode 100644
index 284d957384..0000000000
Binary files a/public/emoji/2611.png and /dev/null differ
diff --git a/public/emoji/2611.svg b/public/emoji/2611.svg
index 42ff8d4554..719f46c104 100644
--- a/public/emoji/2611.svg
+++ b/public/emoji/2611.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2614.png b/public/emoji/2614.png
deleted file mode 100644
index 5b35b7ff6a..0000000000
Binary files a/public/emoji/2614.png and /dev/null differ
diff --git a/public/emoji/2614.svg b/public/emoji/2614.svg
index 01ad0ed439..bdeb12e645 100644
--- a/public/emoji/2614.svg
+++ b/public/emoji/2614.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2615.png b/public/emoji/2615.png
deleted file mode 100644
index 553061471b..0000000000
Binary files a/public/emoji/2615.png and /dev/null differ
diff --git a/public/emoji/2615.svg b/public/emoji/2615.svg
index cd98ff4a23..9742612082 100644
--- a/public/emoji/2615.svg
+++ b/public/emoji/2615.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2618.png b/public/emoji/2618.png
deleted file mode 100644
index f202aecfe6..0000000000
Binary files a/public/emoji/2618.png and /dev/null differ
diff --git a/public/emoji/2618.svg b/public/emoji/2618.svg
index d9a9acd471..f4b39ae449 100644
--- a/public/emoji/2618.svg
+++ b/public/emoji/2618.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/261d-1f3fb.png b/public/emoji/261d-1f3fb.png
deleted file mode 100644
index 6a9db21d64..0000000000
Binary files a/public/emoji/261d-1f3fb.png and /dev/null differ
diff --git a/public/emoji/261d-1f3fb.svg b/public/emoji/261d-1f3fb.svg
index 6a8b95a104..52bf74379c 100644
--- a/public/emoji/261d-1f3fb.svg
+++ b/public/emoji/261d-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/261d-1f3fc.png b/public/emoji/261d-1f3fc.png
deleted file mode 100644
index 15aa9ea0e0..0000000000
Binary files a/public/emoji/261d-1f3fc.png and /dev/null differ
diff --git a/public/emoji/261d-1f3fc.svg b/public/emoji/261d-1f3fc.svg
index d43f1a7b3a..1c188d0e37 100644
--- a/public/emoji/261d-1f3fc.svg
+++ b/public/emoji/261d-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/261d-1f3fd.png b/public/emoji/261d-1f3fd.png
deleted file mode 100644
index 652b73a9c5..0000000000
Binary files a/public/emoji/261d-1f3fd.png and /dev/null differ
diff --git a/public/emoji/261d-1f3fd.svg b/public/emoji/261d-1f3fd.svg
index c548d5dbb5..b377f9f81b 100644
--- a/public/emoji/261d-1f3fd.svg
+++ b/public/emoji/261d-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/261d-1f3fe.png b/public/emoji/261d-1f3fe.png
deleted file mode 100644
index 692bad926e..0000000000
Binary files a/public/emoji/261d-1f3fe.png and /dev/null differ
diff --git a/public/emoji/261d-1f3fe.svg b/public/emoji/261d-1f3fe.svg
index 4b63a6b24f..324f88f9cb 100644
--- a/public/emoji/261d-1f3fe.svg
+++ b/public/emoji/261d-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/261d-1f3ff.png b/public/emoji/261d-1f3ff.png
deleted file mode 100644
index 1e1b10fb71..0000000000
Binary files a/public/emoji/261d-1f3ff.png and /dev/null differ
diff --git a/public/emoji/261d-1f3ff.svg b/public/emoji/261d-1f3ff.svg
index e422854ac6..1522274150 100644
--- a/public/emoji/261d-1f3ff.svg
+++ b/public/emoji/261d-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/261d.png b/public/emoji/261d.png
deleted file mode 100644
index f4978ff0f0..0000000000
Binary files a/public/emoji/261d.png and /dev/null differ
diff --git a/public/emoji/261d.svg b/public/emoji/261d.svg
index 2d47296e53..8d0720ac90 100644
--- a/public/emoji/261d.svg
+++ b/public/emoji/261d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2620.png b/public/emoji/2620.png
deleted file mode 100644
index b459df9227..0000000000
Binary files a/public/emoji/2620.png and /dev/null differ
diff --git a/public/emoji/2620.svg b/public/emoji/2620.svg
index c8858de6ef..6275f091d8 100644
--- a/public/emoji/2620.svg
+++ b/public/emoji/2620.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2622.png b/public/emoji/2622.png
deleted file mode 100644
index 3b46199fe3..0000000000
Binary files a/public/emoji/2622.png and /dev/null differ
diff --git a/public/emoji/2622.svg b/public/emoji/2622.svg
index b2068336e1..22fe96a7bf 100644
--- a/public/emoji/2622.svg
+++ b/public/emoji/2622.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2623.png b/public/emoji/2623.png
deleted file mode 100644
index 007b4fc2d8..0000000000
Binary files a/public/emoji/2623.png and /dev/null differ
diff --git a/public/emoji/2623.svg b/public/emoji/2623.svg
index 60a22e51b7..2240cd6d92 100644
--- a/public/emoji/2623.svg
+++ b/public/emoji/2623.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2626.png b/public/emoji/2626.png
deleted file mode 100644
index 0530e33a4d..0000000000
Binary files a/public/emoji/2626.png and /dev/null differ
diff --git a/public/emoji/2626.svg b/public/emoji/2626.svg
index cc62ecdb01..a1fccfed45 100644
--- a/public/emoji/2626.svg
+++ b/public/emoji/2626.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/262a.png b/public/emoji/262a.png
deleted file mode 100644
index e182636457..0000000000
Binary files a/public/emoji/262a.png and /dev/null differ
diff --git a/public/emoji/262a.svg b/public/emoji/262a.svg
index 87fd9c7040..478d46894f 100644
--- a/public/emoji/262a.svg
+++ b/public/emoji/262a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/262e.png b/public/emoji/262e.png
deleted file mode 100644
index 86033faf47..0000000000
Binary files a/public/emoji/262e.png and /dev/null differ
diff --git a/public/emoji/262e.svg b/public/emoji/262e.svg
index 01a035a556..7ff833d39c 100644
--- a/public/emoji/262e.svg
+++ b/public/emoji/262e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/262f.png b/public/emoji/262f.png
deleted file mode 100644
index f2900f6338..0000000000
Binary files a/public/emoji/262f.png and /dev/null differ
diff --git a/public/emoji/262f.svg b/public/emoji/262f.svg
index e232b66922..48aec61aeb 100644
--- a/public/emoji/262f.svg
+++ b/public/emoji/262f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2638.png b/public/emoji/2638.png
deleted file mode 100644
index 3666db0016..0000000000
Binary files a/public/emoji/2638.png and /dev/null differ
diff --git a/public/emoji/2638.svg b/public/emoji/2638.svg
index 8c09aa21ad..c65083aade 100644
--- a/public/emoji/2638.svg
+++ b/public/emoji/2638.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2639.png b/public/emoji/2639.png
deleted file mode 100644
index 6ae71f233b..0000000000
Binary files a/public/emoji/2639.png and /dev/null differ
diff --git a/public/emoji/2639.svg b/public/emoji/2639.svg
index ead0eb5b3b..b6f0b04a26 100644
--- a/public/emoji/2639.svg
+++ b/public/emoji/2639.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/263a.png b/public/emoji/263a.png
deleted file mode 100644
index e9e53c03d4..0000000000
Binary files a/public/emoji/263a.png and /dev/null differ
diff --git a/public/emoji/263a.svg b/public/emoji/263a.svg
index f8a5cb762d..2b358e7dc9 100644
--- a/public/emoji/263a.svg
+++ b/public/emoji/263a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2640.svg b/public/emoji/2640.svg
new file mode 100644
index 0000000000..9605f80234
--- /dev/null
+++ b/public/emoji/2640.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/2642.svg b/public/emoji/2642.svg
new file mode 100644
index 0000000000..2eb7e7fc03
--- /dev/null
+++ b/public/emoji/2642.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/2648.png b/public/emoji/2648.png
deleted file mode 100644
index 21a189d0ed..0000000000
Binary files a/public/emoji/2648.png and /dev/null differ
diff --git a/public/emoji/2648.svg b/public/emoji/2648.svg
index f85279e573..bc556d9f4f 100644
--- a/public/emoji/2648.svg
+++ b/public/emoji/2648.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2649.png b/public/emoji/2649.png
deleted file mode 100644
index b2a370df42..0000000000
Binary files a/public/emoji/2649.png and /dev/null differ
diff --git a/public/emoji/2649.svg b/public/emoji/2649.svg
index a569cb32ba..eca8d4a547 100644
--- a/public/emoji/2649.svg
+++ b/public/emoji/2649.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/264a.png b/public/emoji/264a.png
deleted file mode 100644
index 1a09698cf0..0000000000
Binary files a/public/emoji/264a.png and /dev/null differ
diff --git a/public/emoji/264a.svg b/public/emoji/264a.svg
index f87603f68e..954e211dcd 100644
--- a/public/emoji/264a.svg
+++ b/public/emoji/264a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/264b.png b/public/emoji/264b.png
deleted file mode 100644
index a64af07cb5..0000000000
Binary files a/public/emoji/264b.png and /dev/null differ
diff --git a/public/emoji/264b.svg b/public/emoji/264b.svg
index 703fda7ffe..f8f82b780f 100644
--- a/public/emoji/264b.svg
+++ b/public/emoji/264b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/264c.png b/public/emoji/264c.png
deleted file mode 100644
index 30158d34de..0000000000
Binary files a/public/emoji/264c.png and /dev/null differ
diff --git a/public/emoji/264c.svg b/public/emoji/264c.svg
index e5a2ad1c49..8529aac4e8 100644
--- a/public/emoji/264c.svg
+++ b/public/emoji/264c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/264d.png b/public/emoji/264d.png
deleted file mode 100644
index a6b56c2cb5..0000000000
Binary files a/public/emoji/264d.png and /dev/null differ
diff --git a/public/emoji/264d.svg b/public/emoji/264d.svg
index 24f569cc70..74919add45 100644
--- a/public/emoji/264d.svg
+++ b/public/emoji/264d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/264e.png b/public/emoji/264e.png
deleted file mode 100644
index 8fd133a357..0000000000
Binary files a/public/emoji/264e.png and /dev/null differ
diff --git a/public/emoji/264e.svg b/public/emoji/264e.svg
index a7c8e0a710..3879b8a685 100644
--- a/public/emoji/264e.svg
+++ b/public/emoji/264e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/264f.png b/public/emoji/264f.png
deleted file mode 100644
index c31a992045..0000000000
Binary files a/public/emoji/264f.png and /dev/null differ
diff --git a/public/emoji/264f.svg b/public/emoji/264f.svg
index 78de283a6b..b8a7bf8d67 100644
--- a/public/emoji/264f.svg
+++ b/public/emoji/264f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2650.png b/public/emoji/2650.png
deleted file mode 100644
index f8d94ff292..0000000000
Binary files a/public/emoji/2650.png and /dev/null differ
diff --git a/public/emoji/2650.svg b/public/emoji/2650.svg
index 0e7fcde6e6..a4d391290b 100644
--- a/public/emoji/2650.svg
+++ b/public/emoji/2650.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2651.png b/public/emoji/2651.png
deleted file mode 100644
index 6293d31d4b..0000000000
Binary files a/public/emoji/2651.png and /dev/null differ
diff --git a/public/emoji/2651.svg b/public/emoji/2651.svg
index d632096556..7eabb46aae 100644
--- a/public/emoji/2651.svg
+++ b/public/emoji/2651.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2652.png b/public/emoji/2652.png
deleted file mode 100644
index 641a4f6888..0000000000
Binary files a/public/emoji/2652.png and /dev/null differ
diff --git a/public/emoji/2652.svg b/public/emoji/2652.svg
index 7b262f869d..8644b787e3 100644
--- a/public/emoji/2652.svg
+++ b/public/emoji/2652.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2653.png b/public/emoji/2653.png
deleted file mode 100644
index 7f6f646a95..0000000000
Binary files a/public/emoji/2653.png and /dev/null differ
diff --git a/public/emoji/2653.svg b/public/emoji/2653.svg
index d50acfc893..c529897f80 100644
--- a/public/emoji/2653.svg
+++ b/public/emoji/2653.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2660.png b/public/emoji/2660.png
deleted file mode 100644
index f822f184cb..0000000000
Binary files a/public/emoji/2660.png and /dev/null differ
diff --git a/public/emoji/2660.svg b/public/emoji/2660.svg
index 0d9699bd5f..687a3c1504 100644
--- a/public/emoji/2660.svg
+++ b/public/emoji/2660.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2663.png b/public/emoji/2663.png
deleted file mode 100644
index 4f2abf791c..0000000000
Binary files a/public/emoji/2663.png and /dev/null differ
diff --git a/public/emoji/2663.svg b/public/emoji/2663.svg
index 2ee52dd62f..d1afd90e12 100644
--- a/public/emoji/2663.svg
+++ b/public/emoji/2663.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2665.png b/public/emoji/2665.png
deleted file mode 100644
index 393c3ed526..0000000000
Binary files a/public/emoji/2665.png and /dev/null differ
diff --git a/public/emoji/2665.svg b/public/emoji/2665.svg
index 6659eb13c8..a4d85a5123 100644
--- a/public/emoji/2665.svg
+++ b/public/emoji/2665.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2666.png b/public/emoji/2666.png
deleted file mode 100644
index 1f25f51f97..0000000000
Binary files a/public/emoji/2666.png and /dev/null differ
diff --git a/public/emoji/2666.svg b/public/emoji/2666.svg
index 654b2f4b63..561a85b2f9 100644
--- a/public/emoji/2666.svg
+++ b/public/emoji/2666.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2668.png b/public/emoji/2668.png
deleted file mode 100644
index 3d9df2d947..0000000000
Binary files a/public/emoji/2668.png and /dev/null differ
diff --git a/public/emoji/2668.svg b/public/emoji/2668.svg
index e65cbcb1a0..8aa2f4b6b6 100644
--- a/public/emoji/2668.svg
+++ b/public/emoji/2668.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/267b.png b/public/emoji/267b.png
deleted file mode 100644
index 9221f095c3..0000000000
Binary files a/public/emoji/267b.png and /dev/null differ
diff --git a/public/emoji/267b.svg b/public/emoji/267b.svg
index 7d80b6fe73..118b9a7b97 100644
--- a/public/emoji/267b.svg
+++ b/public/emoji/267b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/267f.png b/public/emoji/267f.png
deleted file mode 100644
index 4e5b2698ea..0000000000
Binary files a/public/emoji/267f.png and /dev/null differ
diff --git a/public/emoji/267f.svg b/public/emoji/267f.svg
index 3ee86eb6ca..a082dbd57b 100644
--- a/public/emoji/267f.svg
+++ b/public/emoji/267f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2692.png b/public/emoji/2692.png
deleted file mode 100644
index 3bee30ec58..0000000000
Binary files a/public/emoji/2692.png and /dev/null differ
diff --git a/public/emoji/2692.svg b/public/emoji/2692.svg
index 10516b7bf5..0bb18a1ab0 100644
--- a/public/emoji/2692.svg
+++ b/public/emoji/2692.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2693.png b/public/emoji/2693.png
deleted file mode 100644
index b036f70a00..0000000000
Binary files a/public/emoji/2693.png and /dev/null differ
diff --git a/public/emoji/2693.svg b/public/emoji/2693.svg
index b5f5418d10..752c9d2427 100644
--- a/public/emoji/2693.svg
+++ b/public/emoji/2693.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2694.png b/public/emoji/2694.png
deleted file mode 100644
index 907e960713..0000000000
Binary files a/public/emoji/2694.png and /dev/null differ
diff --git a/public/emoji/2694.svg b/public/emoji/2694.svg
index 368fdc0541..3fe031fe88 100644
--- a/public/emoji/2694.svg
+++ b/public/emoji/2694.svg
@@ -1,3 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2695.svg b/public/emoji/2695.svg
new file mode 100644
index 0000000000..636f7ed26b
--- /dev/null
+++ b/public/emoji/2695.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/2696.png b/public/emoji/2696.png
deleted file mode 100644
index 0757eda168..0000000000
Binary files a/public/emoji/2696.png and /dev/null differ
diff --git a/public/emoji/2696.svg b/public/emoji/2696.svg
index c8042bbcbc..77d5349aba 100644
--- a/public/emoji/2696.svg
+++ b/public/emoji/2696.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2697.png b/public/emoji/2697.png
deleted file mode 100644
index 307a732424..0000000000
Binary files a/public/emoji/2697.png and /dev/null differ
diff --git a/public/emoji/2697.svg b/public/emoji/2697.svg
index 6e63dacb8f..3e8b73d51d 100644
--- a/public/emoji/2697.svg
+++ b/public/emoji/2697.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2699.png b/public/emoji/2699.png
deleted file mode 100644
index 2a1cc2c0ff..0000000000
Binary files a/public/emoji/2699.png and /dev/null differ
diff --git a/public/emoji/2699.svg b/public/emoji/2699.svg
index 9230ed01a4..616e7960f9 100644
--- a/public/emoji/2699.svg
+++ b/public/emoji/2699.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/269b.png b/public/emoji/269b.png
deleted file mode 100644
index 5f4567aa09..0000000000
Binary files a/public/emoji/269b.png and /dev/null differ
diff --git a/public/emoji/269b.svg b/public/emoji/269b.svg
index 0b02d3cd4c..67f33674f1 100644
--- a/public/emoji/269b.svg
+++ b/public/emoji/269b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/269c.png b/public/emoji/269c.png
deleted file mode 100644
index c9250d27fa..0000000000
Binary files a/public/emoji/269c.png and /dev/null differ
diff --git a/public/emoji/269c.svg b/public/emoji/269c.svg
index ce5bad9515..da380fdb08 100644
--- a/public/emoji/269c.svg
+++ b/public/emoji/269c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26a0.png b/public/emoji/26a0.png
deleted file mode 100644
index 35691c2ed9..0000000000
Binary files a/public/emoji/26a0.png and /dev/null differ
diff --git a/public/emoji/26a0.svg b/public/emoji/26a0.svg
index e6b14203c2..81952f7d5c 100644
--- a/public/emoji/26a0.svg
+++ b/public/emoji/26a0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26a1.png b/public/emoji/26a1.png
deleted file mode 100644
index 47e68e48e4..0000000000
Binary files a/public/emoji/26a1.png and /dev/null differ
diff --git a/public/emoji/26a1.svg b/public/emoji/26a1.svg
index ac811c568c..2e816f4375 100644
--- a/public/emoji/26a1.svg
+++ b/public/emoji/26a1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26aa.png b/public/emoji/26aa.png
deleted file mode 100644
index c19e15684d..0000000000
Binary files a/public/emoji/26aa.png and /dev/null differ
diff --git a/public/emoji/26aa.svg b/public/emoji/26aa.svg
index fb39d3ebbd..edf7f09793 100644
--- a/public/emoji/26aa.svg
+++ b/public/emoji/26aa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26ab.png b/public/emoji/26ab.png
deleted file mode 100644
index b62b87170e..0000000000
Binary files a/public/emoji/26ab.png and /dev/null differ
diff --git a/public/emoji/26ab.svg b/public/emoji/26ab.svg
index 137a56b1f5..c7f93882cb 100644
--- a/public/emoji/26ab.svg
+++ b/public/emoji/26ab.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26b0.png b/public/emoji/26b0.png
deleted file mode 100644
index fb2932aa5f..0000000000
Binary files a/public/emoji/26b0.png and /dev/null differ
diff --git a/public/emoji/26b0.svg b/public/emoji/26b0.svg
index 8fb8eb1177..fb6a252760 100644
--- a/public/emoji/26b0.svg
+++ b/public/emoji/26b0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26b1.png b/public/emoji/26b1.png
deleted file mode 100644
index 6b5b350343..0000000000
Binary files a/public/emoji/26b1.png and /dev/null differ
diff --git a/public/emoji/26b1.svg b/public/emoji/26b1.svg
index a752a31832..2bbe1e997a 100644
--- a/public/emoji/26b1.svg
+++ b/public/emoji/26b1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26bd.png b/public/emoji/26bd.png
deleted file mode 100644
index 28cfa218d6..0000000000
Binary files a/public/emoji/26bd.png and /dev/null differ
diff --git a/public/emoji/26bd.svg b/public/emoji/26bd.svg
index dc2380edd3..5aad1297f3 100644
--- a/public/emoji/26bd.svg
+++ b/public/emoji/26bd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26be.png b/public/emoji/26be.png
deleted file mode 100644
index f8463f1538..0000000000
Binary files a/public/emoji/26be.png and /dev/null differ
diff --git a/public/emoji/26be.svg b/public/emoji/26be.svg
index efe314bc6a..6e7f410280 100644
--- a/public/emoji/26be.svg
+++ b/public/emoji/26be.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26c4.png b/public/emoji/26c4.png
deleted file mode 100644
index 20c177c2af..0000000000
Binary files a/public/emoji/26c4.png and /dev/null differ
diff --git a/public/emoji/26c4.svg b/public/emoji/26c4.svg
index 3d083f6ce6..f202eaea4c 100644
--- a/public/emoji/26c4.svg
+++ b/public/emoji/26c4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26c5.png b/public/emoji/26c5.png
deleted file mode 100644
index a55e59c344..0000000000
Binary files a/public/emoji/26c5.png and /dev/null differ
diff --git a/public/emoji/26c5.svg b/public/emoji/26c5.svg
index ea9730cc16..d8d053b71c 100644
--- a/public/emoji/26c5.svg
+++ b/public/emoji/26c5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26c8.png b/public/emoji/26c8.png
deleted file mode 100644
index 31a26a1b6e..0000000000
Binary files a/public/emoji/26c8.png and /dev/null differ
diff --git a/public/emoji/26c8.svg b/public/emoji/26c8.svg
index 03409bb69c..86e3c01caa 100644
--- a/public/emoji/26c8.svg
+++ b/public/emoji/26c8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26ce.png b/public/emoji/26ce.png
deleted file mode 100644
index 0a780a700d..0000000000
Binary files a/public/emoji/26ce.png and /dev/null differ
diff --git a/public/emoji/26ce.svg b/public/emoji/26ce.svg
index bacb7e3e8a..9fc2d99ce8 100644
--- a/public/emoji/26ce.svg
+++ b/public/emoji/26ce.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26cf.png b/public/emoji/26cf.png
deleted file mode 100644
index 6370fe6d79..0000000000
Binary files a/public/emoji/26cf.png and /dev/null differ
diff --git a/public/emoji/26cf.svg b/public/emoji/26cf.svg
index 3c30f7f3c9..5e434df615 100644
--- a/public/emoji/26cf.svg
+++ b/public/emoji/26cf.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26d1.png b/public/emoji/26d1.png
deleted file mode 100644
index 7140a67603..0000000000
Binary files a/public/emoji/26d1.png and /dev/null differ
diff --git a/public/emoji/26d1.svg b/public/emoji/26d1.svg
index bcdd92d683..3ab886e577 100644
--- a/public/emoji/26d1.svg
+++ b/public/emoji/26d1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26d3.png b/public/emoji/26d3.png
deleted file mode 100644
index 57f46139a0..0000000000
Binary files a/public/emoji/26d3.png and /dev/null differ
diff --git a/public/emoji/26d3.svg b/public/emoji/26d3.svg
index a34973b8c2..636fc4edcc 100644
--- a/public/emoji/26d3.svg
+++ b/public/emoji/26d3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26d4.png b/public/emoji/26d4.png
deleted file mode 100644
index 476800fc5c..0000000000
Binary files a/public/emoji/26d4.png and /dev/null differ
diff --git a/public/emoji/26d4.svg b/public/emoji/26d4.svg
index 61545291b1..433994c942 100644
--- a/public/emoji/26d4.svg
+++ b/public/emoji/26d4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26e9.png b/public/emoji/26e9.png
deleted file mode 100644
index 5a344975bf..0000000000
Binary files a/public/emoji/26e9.png and /dev/null differ
diff --git a/public/emoji/26e9.svg b/public/emoji/26e9.svg
index 570b46d899..28a4e20e44 100644
--- a/public/emoji/26e9.svg
+++ b/public/emoji/26e9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26ea.png b/public/emoji/26ea.png
deleted file mode 100644
index 8242fd272b..0000000000
Binary files a/public/emoji/26ea.png and /dev/null differ
diff --git a/public/emoji/26ea.svg b/public/emoji/26ea.svg
index 6d8236c253..66daae9731 100644
--- a/public/emoji/26ea.svg
+++ b/public/emoji/26ea.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26f0.png b/public/emoji/26f0.png
deleted file mode 100644
index 6722ebdd29..0000000000
Binary files a/public/emoji/26f0.png and /dev/null differ
diff --git a/public/emoji/26f0.svg b/public/emoji/26f0.svg
index ae954cfb07..25a3d7608c 100644
--- a/public/emoji/26f0.svg
+++ b/public/emoji/26f0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26f1.png b/public/emoji/26f1.png
deleted file mode 100644
index 220a74f813..0000000000
Binary files a/public/emoji/26f1.png and /dev/null differ
diff --git a/public/emoji/26f1.svg b/public/emoji/26f1.svg
index 641b4551d0..582dceb0d1 100644
--- a/public/emoji/26f1.svg
+++ b/public/emoji/26f1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26f2.png b/public/emoji/26f2.png
deleted file mode 100644
index 293f5d91c0..0000000000
Binary files a/public/emoji/26f2.png and /dev/null differ
diff --git a/public/emoji/26f2.svg b/public/emoji/26f2.svg
index 377ecf8429..b12362cbf6 100644
--- a/public/emoji/26f2.svg
+++ b/public/emoji/26f2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26f3.png b/public/emoji/26f3.png
deleted file mode 100644
index f65a21d8a4..0000000000
Binary files a/public/emoji/26f3.png and /dev/null differ
diff --git a/public/emoji/26f3.svg b/public/emoji/26f3.svg
index cd35a12deb..380db9ad11 100644
--- a/public/emoji/26f3.svg
+++ b/public/emoji/26f3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26f4.png b/public/emoji/26f4.png
deleted file mode 100644
index 41816b3ae3..0000000000
Binary files a/public/emoji/26f4.png and /dev/null differ
diff --git a/public/emoji/26f4.svg b/public/emoji/26f4.svg
index 306970ebc3..ecdfb117e7 100644
--- a/public/emoji/26f4.svg
+++ b/public/emoji/26f4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26f5.png b/public/emoji/26f5.png
deleted file mode 100644
index 772ef11da5..0000000000
Binary files a/public/emoji/26f5.png and /dev/null differ
diff --git a/public/emoji/26f5.svg b/public/emoji/26f5.svg
index e69f924b9d..7cc9620fdc 100644
--- a/public/emoji/26f5.svg
+++ b/public/emoji/26f5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26f7-1f3fb.svg b/public/emoji/26f7-1f3fb.svg
new file mode 100644
index 0000000000..fb061e6143
--- /dev/null
+++ b/public/emoji/26f7-1f3fb.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f7-1f3fc.svg b/public/emoji/26f7-1f3fc.svg
new file mode 100644
index 0000000000..2dd9d8b6a2
--- /dev/null
+++ b/public/emoji/26f7-1f3fc.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f7-1f3fd.svg b/public/emoji/26f7-1f3fd.svg
new file mode 100644
index 0000000000..74313649bb
--- /dev/null
+++ b/public/emoji/26f7-1f3fd.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f7-1f3fe.svg b/public/emoji/26f7-1f3fe.svg
new file mode 100644
index 0000000000..665d80d24c
--- /dev/null
+++ b/public/emoji/26f7-1f3fe.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f7-1f3ff.svg b/public/emoji/26f7-1f3ff.svg
new file mode 100644
index 0000000000..125156eca1
--- /dev/null
+++ b/public/emoji/26f7-1f3ff.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f7.png b/public/emoji/26f7.png
deleted file mode 100644
index 2eb3bdce2a..0000000000
Binary files a/public/emoji/26f7.png and /dev/null differ
diff --git a/public/emoji/26f7.svg b/public/emoji/26f7.svg
index a9fb9b84df..24a5ee2d74 100644
--- a/public/emoji/26f7.svg
+++ b/public/emoji/26f7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26f8.png b/public/emoji/26f8.png
deleted file mode 100644
index 8c449b0c03..0000000000
Binary files a/public/emoji/26f8.png and /dev/null differ
diff --git a/public/emoji/26f8.svg b/public/emoji/26f8.svg
index 60adcaf3c6..081c919469 100644
--- a/public/emoji/26f8.svg
+++ b/public/emoji/26f8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26f9-1f3fb-200d-2640-fe0f.svg b/public/emoji/26f9-1f3fb-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..aaa5e9b8d3
--- /dev/null
+++ b/public/emoji/26f9-1f3fb-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f9-1f3fb-200d-2642-fe0f.svg b/public/emoji/26f9-1f3fb-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..e54effa503
--- /dev/null
+++ b/public/emoji/26f9-1f3fb-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f9-1f3fb.png b/public/emoji/26f9-1f3fb.png
deleted file mode 100644
index cd12c7ab9b..0000000000
Binary files a/public/emoji/26f9-1f3fb.png and /dev/null differ
diff --git a/public/emoji/26f9-1f3fb.svg b/public/emoji/26f9-1f3fb.svg
index 480994ca90..e54effa503 100644
--- a/public/emoji/26f9-1f3fb.svg
+++ b/public/emoji/26f9-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26f9-1f3fc-200d-2640-fe0f.svg b/public/emoji/26f9-1f3fc-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..dcfff64d7d
--- /dev/null
+++ b/public/emoji/26f9-1f3fc-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f9-1f3fc-200d-2642-fe0f.svg b/public/emoji/26f9-1f3fc-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..41e49a818d
--- /dev/null
+++ b/public/emoji/26f9-1f3fc-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f9-1f3fc.png b/public/emoji/26f9-1f3fc.png
deleted file mode 100644
index f892fd596d..0000000000
Binary files a/public/emoji/26f9-1f3fc.png and /dev/null differ
diff --git a/public/emoji/26f9-1f3fc.svg b/public/emoji/26f9-1f3fc.svg
index dd18a65d3b..41e49a818d 100644
--- a/public/emoji/26f9-1f3fc.svg
+++ b/public/emoji/26f9-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26f9-1f3fd-200d-2640-fe0f.svg b/public/emoji/26f9-1f3fd-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..3c67cdb51a
--- /dev/null
+++ b/public/emoji/26f9-1f3fd-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f9-1f3fd-200d-2642-fe0f.svg b/public/emoji/26f9-1f3fd-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..25e93c8b5c
--- /dev/null
+++ b/public/emoji/26f9-1f3fd-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f9-1f3fd.png b/public/emoji/26f9-1f3fd.png
deleted file mode 100644
index e109997a91..0000000000
Binary files a/public/emoji/26f9-1f3fd.png and /dev/null differ
diff --git a/public/emoji/26f9-1f3fd.svg b/public/emoji/26f9-1f3fd.svg
index 0af260864d..25e93c8b5c 100644
--- a/public/emoji/26f9-1f3fd.svg
+++ b/public/emoji/26f9-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26f9-1f3fe-200d-2640-fe0f.svg b/public/emoji/26f9-1f3fe-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..79ebd4ebaa
--- /dev/null
+++ b/public/emoji/26f9-1f3fe-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f9-1f3fe-200d-2642-fe0f.svg b/public/emoji/26f9-1f3fe-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..07ff374472
--- /dev/null
+++ b/public/emoji/26f9-1f3fe-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f9-1f3fe.png b/public/emoji/26f9-1f3fe.png
deleted file mode 100644
index 3b90b946af..0000000000
Binary files a/public/emoji/26f9-1f3fe.png and /dev/null differ
diff --git a/public/emoji/26f9-1f3fe.svg b/public/emoji/26f9-1f3fe.svg
index b0b9d36420..07ff374472 100644
--- a/public/emoji/26f9-1f3fe.svg
+++ b/public/emoji/26f9-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26f9-1f3ff-200d-2640-fe0f.svg b/public/emoji/26f9-1f3ff-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..8976d8fd8f
--- /dev/null
+++ b/public/emoji/26f9-1f3ff-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f9-1f3ff-200d-2642-fe0f.svg b/public/emoji/26f9-1f3ff-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..1e4c967176
--- /dev/null
+++ b/public/emoji/26f9-1f3ff-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f9-1f3ff.png b/public/emoji/26f9-1f3ff.png
deleted file mode 100644
index bafed7828a..0000000000
Binary files a/public/emoji/26f9-1f3ff.png and /dev/null differ
diff --git a/public/emoji/26f9-1f3ff.svg b/public/emoji/26f9-1f3ff.svg
index f7ee9300db..1e4c967176 100644
--- a/public/emoji/26f9-1f3ff.svg
+++ b/public/emoji/26f9-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26f9-fe0f-200d-2640-fe0f.svg b/public/emoji/26f9-fe0f-200d-2640-fe0f.svg
new file mode 100644
index 0000000000..72d0a9b234
--- /dev/null
+++ b/public/emoji/26f9-fe0f-200d-2640-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f9-fe0f-200d-2642-fe0f.svg b/public/emoji/26f9-fe0f-200d-2642-fe0f.svg
new file mode 100644
index 0000000000..28bef1b8d5
--- /dev/null
+++ b/public/emoji/26f9-fe0f-200d-2642-fe0f.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/26f9.png b/public/emoji/26f9.png
deleted file mode 100644
index 8ce90c5cad..0000000000
Binary files a/public/emoji/26f9.png and /dev/null differ
diff --git a/public/emoji/26f9.svg b/public/emoji/26f9.svg
index ad4502b149..28bef1b8d5 100644
--- a/public/emoji/26f9.svg
+++ b/public/emoji/26f9.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26fa.png b/public/emoji/26fa.png
deleted file mode 100644
index 3fddcfc56e..0000000000
Binary files a/public/emoji/26fa.png and /dev/null differ
diff --git a/public/emoji/26fa.svg b/public/emoji/26fa.svg
index 73bb5136fd..3fd15c4671 100644
--- a/public/emoji/26fa.svg
+++ b/public/emoji/26fa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/26fd.png b/public/emoji/26fd.png
deleted file mode 100644
index 05b1879447..0000000000
Binary files a/public/emoji/26fd.png and /dev/null differ
diff --git a/public/emoji/26fd.svg b/public/emoji/26fd.svg
index cfc136ba86..d234f20df1 100644
--- a/public/emoji/26fd.svg
+++ b/public/emoji/26fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2702.png b/public/emoji/2702.png
deleted file mode 100644
index 270571c8cd..0000000000
Binary files a/public/emoji/2702.png and /dev/null differ
diff --git a/public/emoji/2702.svg b/public/emoji/2702.svg
index a5e934da6d..eb14f2d344 100644
--- a/public/emoji/2702.svg
+++ b/public/emoji/2702.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2705.png b/public/emoji/2705.png
deleted file mode 100644
index e55f087e54..0000000000
Binary files a/public/emoji/2705.png and /dev/null differ
diff --git a/public/emoji/2705.svg b/public/emoji/2705.svg
index 4f0474ade5..2aba51916b 100644
--- a/public/emoji/2705.svg
+++ b/public/emoji/2705.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2708.png b/public/emoji/2708.png
deleted file mode 100644
index 268d2ac3c8..0000000000
Binary files a/public/emoji/2708.png and /dev/null differ
diff --git a/public/emoji/2708.svg b/public/emoji/2708.svg
index 92d5f73194..12fb9b5c37 100644
--- a/public/emoji/2708.svg
+++ b/public/emoji/2708.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2709.png b/public/emoji/2709.png
deleted file mode 100644
index ec77ac375a..0000000000
Binary files a/public/emoji/2709.png and /dev/null differ
diff --git a/public/emoji/2709.svg b/public/emoji/2709.svg
index 4337c482eb..0c37fcb8b5 100644
--- a/public/emoji/2709.svg
+++ b/public/emoji/2709.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270a-1f3fb.png b/public/emoji/270a-1f3fb.png
deleted file mode 100644
index 02809e2dd6..0000000000
Binary files a/public/emoji/270a-1f3fb.png and /dev/null differ
diff --git a/public/emoji/270a-1f3fb.svg b/public/emoji/270a-1f3fb.svg
index 425a770958..d15ffb8438 100644
--- a/public/emoji/270a-1f3fb.svg
+++ b/public/emoji/270a-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270a-1f3fc.png b/public/emoji/270a-1f3fc.png
deleted file mode 100644
index 5de3481038..0000000000
Binary files a/public/emoji/270a-1f3fc.png and /dev/null differ
diff --git a/public/emoji/270a-1f3fc.svg b/public/emoji/270a-1f3fc.svg
index 64c091bdab..d3ef802951 100644
--- a/public/emoji/270a-1f3fc.svg
+++ b/public/emoji/270a-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270a-1f3fd.png b/public/emoji/270a-1f3fd.png
deleted file mode 100644
index 0d5240129b..0000000000
Binary files a/public/emoji/270a-1f3fd.png and /dev/null differ
diff --git a/public/emoji/270a-1f3fd.svg b/public/emoji/270a-1f3fd.svg
index ac29bb90cb..658e9d48ab 100644
--- a/public/emoji/270a-1f3fd.svg
+++ b/public/emoji/270a-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270a-1f3fe.png b/public/emoji/270a-1f3fe.png
deleted file mode 100644
index a95c0dd634..0000000000
Binary files a/public/emoji/270a-1f3fe.png and /dev/null differ
diff --git a/public/emoji/270a-1f3fe.svg b/public/emoji/270a-1f3fe.svg
index 6b2ae91c60..dec8e82fed 100644
--- a/public/emoji/270a-1f3fe.svg
+++ b/public/emoji/270a-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270a-1f3ff.png b/public/emoji/270a-1f3ff.png
deleted file mode 100644
index a2f092fd8c..0000000000
Binary files a/public/emoji/270a-1f3ff.png and /dev/null differ
diff --git a/public/emoji/270a-1f3ff.svg b/public/emoji/270a-1f3ff.svg
index ab9f9952ec..5be8afe572 100644
--- a/public/emoji/270a-1f3ff.svg
+++ b/public/emoji/270a-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270a.png b/public/emoji/270a.png
deleted file mode 100644
index de33592bf9..0000000000
Binary files a/public/emoji/270a.png and /dev/null differ
diff --git a/public/emoji/270a.svg b/public/emoji/270a.svg
index 7f6e6cee72..de19462651 100644
--- a/public/emoji/270a.svg
+++ b/public/emoji/270a.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270b-1f3fb.png b/public/emoji/270b-1f3fb.png
deleted file mode 100644
index 3b752902c0..0000000000
Binary files a/public/emoji/270b-1f3fb.png and /dev/null differ
diff --git a/public/emoji/270b-1f3fb.svg b/public/emoji/270b-1f3fb.svg
index 5345aea135..0641793ea9 100644
--- a/public/emoji/270b-1f3fb.svg
+++ b/public/emoji/270b-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270b-1f3fc.png b/public/emoji/270b-1f3fc.png
deleted file mode 100644
index 44e2a514c6..0000000000
Binary files a/public/emoji/270b-1f3fc.png and /dev/null differ
diff --git a/public/emoji/270b-1f3fc.svg b/public/emoji/270b-1f3fc.svg
index 99d1359be7..f0352b8da9 100644
--- a/public/emoji/270b-1f3fc.svg
+++ b/public/emoji/270b-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270b-1f3fd.png b/public/emoji/270b-1f3fd.png
deleted file mode 100644
index 5bb62a7528..0000000000
Binary files a/public/emoji/270b-1f3fd.png and /dev/null differ
diff --git a/public/emoji/270b-1f3fd.svg b/public/emoji/270b-1f3fd.svg
index 258c678f94..77154d0704 100644
--- a/public/emoji/270b-1f3fd.svg
+++ b/public/emoji/270b-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270b-1f3fe.png b/public/emoji/270b-1f3fe.png
deleted file mode 100644
index c7f8c9ec27..0000000000
Binary files a/public/emoji/270b-1f3fe.png and /dev/null differ
diff --git a/public/emoji/270b-1f3fe.svg b/public/emoji/270b-1f3fe.svg
index 3b7b55ff50..6d44c9b38b 100644
--- a/public/emoji/270b-1f3fe.svg
+++ b/public/emoji/270b-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270b-1f3ff.png b/public/emoji/270b-1f3ff.png
deleted file mode 100644
index c601b58a73..0000000000
Binary files a/public/emoji/270b-1f3ff.png and /dev/null differ
diff --git a/public/emoji/270b-1f3ff.svg b/public/emoji/270b-1f3ff.svg
index b1e851268a..35e7bb3ec9 100644
--- a/public/emoji/270b-1f3ff.svg
+++ b/public/emoji/270b-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270b.png b/public/emoji/270b.png
deleted file mode 100644
index 6b2954315d..0000000000
Binary files a/public/emoji/270b.png and /dev/null differ
diff --git a/public/emoji/270b.svg b/public/emoji/270b.svg
index 8aca81b82b..8287246378 100644
--- a/public/emoji/270b.svg
+++ b/public/emoji/270b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270c-1f3fb.png b/public/emoji/270c-1f3fb.png
deleted file mode 100644
index 6ac54a745f..0000000000
Binary files a/public/emoji/270c-1f3fb.png and /dev/null differ
diff --git a/public/emoji/270c-1f3fb.svg b/public/emoji/270c-1f3fb.svg
index 2053e46dc4..447137caa3 100644
--- a/public/emoji/270c-1f3fb.svg
+++ b/public/emoji/270c-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270c-1f3fc.png b/public/emoji/270c-1f3fc.png
deleted file mode 100644
index 6dd9669866..0000000000
Binary files a/public/emoji/270c-1f3fc.png and /dev/null differ
diff --git a/public/emoji/270c-1f3fc.svg b/public/emoji/270c-1f3fc.svg
index 7be61714c9..908add91ce 100644
--- a/public/emoji/270c-1f3fc.svg
+++ b/public/emoji/270c-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270c-1f3fd.png b/public/emoji/270c-1f3fd.png
deleted file mode 100644
index a615e53f02..0000000000
Binary files a/public/emoji/270c-1f3fd.png and /dev/null differ
diff --git a/public/emoji/270c-1f3fd.svg b/public/emoji/270c-1f3fd.svg
index fb5387e105..1a814abd83 100644
--- a/public/emoji/270c-1f3fd.svg
+++ b/public/emoji/270c-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270c-1f3fe.png b/public/emoji/270c-1f3fe.png
deleted file mode 100644
index 33a34bd5a7..0000000000
Binary files a/public/emoji/270c-1f3fe.png and /dev/null differ
diff --git a/public/emoji/270c-1f3fe.svg b/public/emoji/270c-1f3fe.svg
index 2b8a95d8e6..a8ee7f0ed5 100644
--- a/public/emoji/270c-1f3fe.svg
+++ b/public/emoji/270c-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270c-1f3ff.png b/public/emoji/270c-1f3ff.png
deleted file mode 100644
index 45ad14b6c9..0000000000
Binary files a/public/emoji/270c-1f3ff.png and /dev/null differ
diff --git a/public/emoji/270c-1f3ff.svg b/public/emoji/270c-1f3ff.svg
index 8d41bbcdc4..bcff574adf 100644
--- a/public/emoji/270c-1f3ff.svg
+++ b/public/emoji/270c-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270c.png b/public/emoji/270c.png
deleted file mode 100644
index 70c5516ffe..0000000000
Binary files a/public/emoji/270c.png and /dev/null differ
diff --git a/public/emoji/270c.svg b/public/emoji/270c.svg
index 78682b572e..0fbd3b5fff 100644
--- a/public/emoji/270c.svg
+++ b/public/emoji/270c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270d-1f3fb.png b/public/emoji/270d-1f3fb.png
deleted file mode 100644
index 7923d8ebb1..0000000000
Binary files a/public/emoji/270d-1f3fb.png and /dev/null differ
diff --git a/public/emoji/270d-1f3fb.svg b/public/emoji/270d-1f3fb.svg
index 438ab1a8ad..4dc08a519f 100644
--- a/public/emoji/270d-1f3fb.svg
+++ b/public/emoji/270d-1f3fb.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270d-1f3fc.png b/public/emoji/270d-1f3fc.png
deleted file mode 100644
index bcb304e15d..0000000000
Binary files a/public/emoji/270d-1f3fc.png and /dev/null differ
diff --git a/public/emoji/270d-1f3fc.svg b/public/emoji/270d-1f3fc.svg
index 3ff16a807c..fdd4d48c60 100644
--- a/public/emoji/270d-1f3fc.svg
+++ b/public/emoji/270d-1f3fc.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270d-1f3fd.png b/public/emoji/270d-1f3fd.png
deleted file mode 100644
index fd885fd2d9..0000000000
Binary files a/public/emoji/270d-1f3fd.png and /dev/null differ
diff --git a/public/emoji/270d-1f3fd.svg b/public/emoji/270d-1f3fd.svg
index 57884c07e5..d47a6f868b 100644
--- a/public/emoji/270d-1f3fd.svg
+++ b/public/emoji/270d-1f3fd.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270d-1f3fe.png b/public/emoji/270d-1f3fe.png
deleted file mode 100644
index d065b8c64a..0000000000
Binary files a/public/emoji/270d-1f3fe.png and /dev/null differ
diff --git a/public/emoji/270d-1f3fe.svg b/public/emoji/270d-1f3fe.svg
index 089e890d5d..dd8efc41e0 100644
--- a/public/emoji/270d-1f3fe.svg
+++ b/public/emoji/270d-1f3fe.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270d-1f3ff.png b/public/emoji/270d-1f3ff.png
deleted file mode 100644
index a44b3dd757..0000000000
Binary files a/public/emoji/270d-1f3ff.png and /dev/null differ
diff --git a/public/emoji/270d-1f3ff.svg b/public/emoji/270d-1f3ff.svg
index 863dbaae55..f92699de14 100644
--- a/public/emoji/270d-1f3ff.svg
+++ b/public/emoji/270d-1f3ff.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270d.png b/public/emoji/270d.png
deleted file mode 100644
index 85639f8ac4..0000000000
Binary files a/public/emoji/270d.png and /dev/null differ
diff --git a/public/emoji/270d.svg b/public/emoji/270d.svg
index 9370c8c390..b452ab986f 100644
--- a/public/emoji/270d.svg
+++ b/public/emoji/270d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/270f.png b/public/emoji/270f.png
deleted file mode 100644
index 3833d590fa..0000000000
Binary files a/public/emoji/270f.png and /dev/null differ
diff --git a/public/emoji/270f.svg b/public/emoji/270f.svg
index 55eec77285..417e2d1f98 100644
--- a/public/emoji/270f.svg
+++ b/public/emoji/270f.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2712.png b/public/emoji/2712.png
deleted file mode 100644
index 872d0ae159..0000000000
Binary files a/public/emoji/2712.png and /dev/null differ
diff --git a/public/emoji/2712.svg b/public/emoji/2712.svg
index 28a3968a72..91b747d93e 100644
--- a/public/emoji/2712.svg
+++ b/public/emoji/2712.svg
@@ -1,2 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2714.png b/public/emoji/2714.png
deleted file mode 100644
index 03bd695377..0000000000
Binary files a/public/emoji/2714.png and /dev/null differ
diff --git a/public/emoji/2714.svg b/public/emoji/2714.svg
index 20a0826183..6208932b40 100644
--- a/public/emoji/2714.svg
+++ b/public/emoji/2714.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2716.png b/public/emoji/2716.png
deleted file mode 100644
index e47cc1b685..0000000000
Binary files a/public/emoji/2716.png and /dev/null differ
diff --git a/public/emoji/2716.svg b/public/emoji/2716.svg
index 1117a75958..be81d594f9 100644
--- a/public/emoji/2716.svg
+++ b/public/emoji/2716.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/271d.png b/public/emoji/271d.png
deleted file mode 100644
index 42b10e8225..0000000000
Binary files a/public/emoji/271d.png and /dev/null differ
diff --git a/public/emoji/271d.svg b/public/emoji/271d.svg
index 850e144406..dd13a3b990 100644
--- a/public/emoji/271d.svg
+++ b/public/emoji/271d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2721.png b/public/emoji/2721.png
deleted file mode 100644
index fc59d0dde2..0000000000
Binary files a/public/emoji/2721.png and /dev/null differ
diff --git a/public/emoji/2721.svg b/public/emoji/2721.svg
index 073f604291..6d83966e9a 100644
--- a/public/emoji/2721.svg
+++ b/public/emoji/2721.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2728.png b/public/emoji/2728.png
deleted file mode 100644
index 169bc10b02..0000000000
Binary files a/public/emoji/2728.png and /dev/null differ
diff --git a/public/emoji/2728.svg b/public/emoji/2728.svg
index 37c088090c..3e5591e040 100644
--- a/public/emoji/2728.svg
+++ b/public/emoji/2728.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2733.png b/public/emoji/2733.png
deleted file mode 100644
index 3307ffa62e..0000000000
Binary files a/public/emoji/2733.png and /dev/null differ
diff --git a/public/emoji/2733.svg b/public/emoji/2733.svg
index fc0a0d5cc0..2b133c2b5c 100644
--- a/public/emoji/2733.svg
+++ b/public/emoji/2733.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2734.png b/public/emoji/2734.png
deleted file mode 100644
index 820179bda5..0000000000
Binary files a/public/emoji/2734.png and /dev/null differ
diff --git a/public/emoji/2734.svg b/public/emoji/2734.svg
index c8f50edc76..9f1cefd96b 100644
--- a/public/emoji/2734.svg
+++ b/public/emoji/2734.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2744.png b/public/emoji/2744.png
deleted file mode 100644
index db319a77ec..0000000000
Binary files a/public/emoji/2744.png and /dev/null differ
diff --git a/public/emoji/2744.svg b/public/emoji/2744.svg
index 145818394d..26d6d72ad0 100644
--- a/public/emoji/2744.svg
+++ b/public/emoji/2744.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2747.png b/public/emoji/2747.png
deleted file mode 100644
index 6aa7b6ec9c..0000000000
Binary files a/public/emoji/2747.png and /dev/null differ
diff --git a/public/emoji/2747.svg b/public/emoji/2747.svg
index 9c179d6ea3..812425abc9 100644
--- a/public/emoji/2747.svg
+++ b/public/emoji/2747.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/274c.png b/public/emoji/274c.png
deleted file mode 100644
index 9f9ed0f7ad..0000000000
Binary files a/public/emoji/274c.png and /dev/null differ
diff --git a/public/emoji/274c.svg b/public/emoji/274c.svg
index 5f60701d2a..5aa21e8fd4 100644
--- a/public/emoji/274c.svg
+++ b/public/emoji/274c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/274e.png b/public/emoji/274e.png
deleted file mode 100644
index dae487f1f9..0000000000
Binary files a/public/emoji/274e.png and /dev/null differ
diff --git a/public/emoji/274e.svg b/public/emoji/274e.svg
index b65d3ec9e9..c74d9f134a 100644
--- a/public/emoji/274e.svg
+++ b/public/emoji/274e.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2753.png b/public/emoji/2753.png
deleted file mode 100644
index 5a58f3458a..0000000000
Binary files a/public/emoji/2753.png and /dev/null differ
diff --git a/public/emoji/2753.svg b/public/emoji/2753.svg
index d4b28c81cb..9d78e0a433 100644
--- a/public/emoji/2753.svg
+++ b/public/emoji/2753.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2754.png b/public/emoji/2754.png
deleted file mode 100644
index 6e7824c75f..0000000000
Binary files a/public/emoji/2754.png and /dev/null differ
diff --git a/public/emoji/2754.svg b/public/emoji/2754.svg
index d04a83c311..14f5a84308 100644
--- a/public/emoji/2754.svg
+++ b/public/emoji/2754.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2755.png b/public/emoji/2755.png
deleted file mode 100644
index 9b64da8bf7..0000000000
Binary files a/public/emoji/2755.png and /dev/null differ
diff --git a/public/emoji/2755.svg b/public/emoji/2755.svg
index 714e2103ff..9cb804adc5 100644
--- a/public/emoji/2755.svg
+++ b/public/emoji/2755.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2757.png b/public/emoji/2757.png
deleted file mode 100644
index 2c14406422..0000000000
Binary files a/public/emoji/2757.png and /dev/null differ
diff --git a/public/emoji/2757.svg b/public/emoji/2757.svg
index d064e7e125..963356add2 100644
--- a/public/emoji/2757.svg
+++ b/public/emoji/2757.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2763.png b/public/emoji/2763.png
deleted file mode 100644
index 91b520be40..0000000000
Binary files a/public/emoji/2763.png and /dev/null differ
diff --git a/public/emoji/2763.svg b/public/emoji/2763.svg
index df6ebedfb1..e22110bb0c 100644
--- a/public/emoji/2763.svg
+++ b/public/emoji/2763.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2764.png b/public/emoji/2764.png
deleted file mode 100644
index 638cb72dc4..0000000000
Binary files a/public/emoji/2764.png and /dev/null differ
diff --git a/public/emoji/2764.svg b/public/emoji/2764.svg
index 12c6742e25..6dc97e26ce 100644
--- a/public/emoji/2764.svg
+++ b/public/emoji/2764.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2795.png b/public/emoji/2795.png
deleted file mode 100644
index 40799798aa..0000000000
Binary files a/public/emoji/2795.png and /dev/null differ
diff --git a/public/emoji/2795.svg b/public/emoji/2795.svg
index c572fec5c0..cc6c542683 100644
--- a/public/emoji/2795.svg
+++ b/public/emoji/2795.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2796.png b/public/emoji/2796.png
deleted file mode 100644
index 054211caf1..0000000000
Binary files a/public/emoji/2796.png and /dev/null differ
diff --git a/public/emoji/2796.svg b/public/emoji/2796.svg
index 844614dd60..fb069dfe14 100644
--- a/public/emoji/2796.svg
+++ b/public/emoji/2796.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2797.png b/public/emoji/2797.png
deleted file mode 100644
index df32ab21be..0000000000
Binary files a/public/emoji/2797.png and /dev/null differ
diff --git a/public/emoji/2797.svg b/public/emoji/2797.svg
index 8b3945c9c5..0bf64b5070 100644
--- a/public/emoji/2797.svg
+++ b/public/emoji/2797.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/27a1.png b/public/emoji/27a1.png
deleted file mode 100644
index 4755670b5c..0000000000
Binary files a/public/emoji/27a1.png and /dev/null differ
diff --git a/public/emoji/27a1.svg b/public/emoji/27a1.svg
index 125d7d47f5..6eca574543 100644
--- a/public/emoji/27a1.svg
+++ b/public/emoji/27a1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/27b0.png b/public/emoji/27b0.png
deleted file mode 100644
index 440aa56d50..0000000000
Binary files a/public/emoji/27b0.png and /dev/null differ
diff --git a/public/emoji/27b0.svg b/public/emoji/27b0.svg
index 5bf1eac01a..f1c056454f 100644
--- a/public/emoji/27b0.svg
+++ b/public/emoji/27b0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/27bf.png b/public/emoji/27bf.png
deleted file mode 100644
index 0b82c8fe31..0000000000
Binary files a/public/emoji/27bf.png and /dev/null differ
diff --git a/public/emoji/27bf.svg b/public/emoji/27bf.svg
index 83d211d28b..351493bb8f 100644
--- a/public/emoji/27bf.svg
+++ b/public/emoji/27bf.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2934.png b/public/emoji/2934.png
deleted file mode 100644
index f29bfcfc0d..0000000000
Binary files a/public/emoji/2934.png and /dev/null differ
diff --git a/public/emoji/2934.svg b/public/emoji/2934.svg
index 2d7a211d1f..d40c272528 100644
--- a/public/emoji/2934.svg
+++ b/public/emoji/2934.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2935.png b/public/emoji/2935.png
deleted file mode 100644
index 2d9d24bca8..0000000000
Binary files a/public/emoji/2935.png and /dev/null differ
diff --git a/public/emoji/2935.svg b/public/emoji/2935.svg
index 00a8a92ab3..1db0a9cb24 100644
--- a/public/emoji/2935.svg
+++ b/public/emoji/2935.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2a-20e3.svg b/public/emoji/2a-20e3.svg
new file mode 100644
index 0000000000..e3ace72022
--- /dev/null
+++ b/public/emoji/2a-20e3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/2b05.png b/public/emoji/2b05.png
deleted file mode 100644
index 8c685e0a81..0000000000
Binary files a/public/emoji/2b05.png and /dev/null differ
diff --git a/public/emoji/2b05.svg b/public/emoji/2b05.svg
index 9583aec7fc..b56d8fd84b 100644
--- a/public/emoji/2b05.svg
+++ b/public/emoji/2b05.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2b06.png b/public/emoji/2b06.png
deleted file mode 100644
index af8218a87f..0000000000
Binary files a/public/emoji/2b06.png and /dev/null differ
diff --git a/public/emoji/2b06.svg b/public/emoji/2b06.svg
index efa332284a..f54dcb999e 100644
--- a/public/emoji/2b06.svg
+++ b/public/emoji/2b06.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2b07.png b/public/emoji/2b07.png
deleted file mode 100644
index b8eefd0b19..0000000000
Binary files a/public/emoji/2b07.png and /dev/null differ
diff --git a/public/emoji/2b07.svg b/public/emoji/2b07.svg
index bbd2213f8c..623ea5074f 100644
--- a/public/emoji/2b07.svg
+++ b/public/emoji/2b07.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2b1b.png b/public/emoji/2b1b.png
deleted file mode 100644
index 162f2bb429..0000000000
Binary files a/public/emoji/2b1b.png and /dev/null differ
diff --git a/public/emoji/2b1b.svg b/public/emoji/2b1b.svg
index b908105f3f..75820ed0e2 100644
--- a/public/emoji/2b1b.svg
+++ b/public/emoji/2b1b.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2b1c.png b/public/emoji/2b1c.png
deleted file mode 100644
index 6f06c1c79d..0000000000
Binary files a/public/emoji/2b1c.png and /dev/null differ
diff --git a/public/emoji/2b1c.svg b/public/emoji/2b1c.svg
index a58c77bd04..e9ce9710b9 100644
--- a/public/emoji/2b1c.svg
+++ b/public/emoji/2b1c.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2b50.png b/public/emoji/2b50.png
deleted file mode 100644
index c930947076..0000000000
Binary files a/public/emoji/2b50.png and /dev/null differ
diff --git a/public/emoji/2b50.svg b/public/emoji/2b50.svg
index 487bf321c6..d2bc202e99 100644
--- a/public/emoji/2b50.svg
+++ b/public/emoji/2b50.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/2b55.png b/public/emoji/2b55.png
deleted file mode 100644
index 3fe75ce467..0000000000
Binary files a/public/emoji/2b55.png and /dev/null differ
diff --git a/public/emoji/2b55.svg b/public/emoji/2b55.svg
index 46265062f1..056ad641a9 100644
--- a/public/emoji/2b55.svg
+++ b/public/emoji/2b55.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/30-20e3.svg b/public/emoji/30-20e3.svg
new file mode 100644
index 0000000000..6b9454e667
--- /dev/null
+++ b/public/emoji/30-20e3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/3030.png b/public/emoji/3030.png
deleted file mode 100644
index 001c8d6e47..0000000000
Binary files a/public/emoji/3030.png and /dev/null differ
diff --git a/public/emoji/3030.svg b/public/emoji/3030.svg
index ce6c005994..85addce189 100644
--- a/public/emoji/3030.svg
+++ b/public/emoji/3030.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/303d.png b/public/emoji/303d.png
deleted file mode 100644
index 70453d4152..0000000000
Binary files a/public/emoji/303d.png and /dev/null differ
diff --git a/public/emoji/303d.svg b/public/emoji/303d.svg
index 3b7e1508aa..8a8b08c0e8 100644
--- a/public/emoji/303d.svg
+++ b/public/emoji/303d.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/31-20e3.svg b/public/emoji/31-20e3.svg
new file mode 100644
index 0000000000..d56800d4a8
--- /dev/null
+++ b/public/emoji/31-20e3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/32-20e3.svg b/public/emoji/32-20e3.svg
new file mode 100644
index 0000000000..546488da1f
--- /dev/null
+++ b/public/emoji/32-20e3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/3297.png b/public/emoji/3297.png
deleted file mode 100644
index ba8c89d95e..0000000000
Binary files a/public/emoji/3297.png and /dev/null differ
diff --git a/public/emoji/3297.svg b/public/emoji/3297.svg
index c57b1ab8a4..b525207fbb 100644
--- a/public/emoji/3297.svg
+++ b/public/emoji/3297.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/3299.png b/public/emoji/3299.png
deleted file mode 100644
index 5fd72608e6..0000000000
Binary files a/public/emoji/3299.png and /dev/null differ
diff --git a/public/emoji/3299.svg b/public/emoji/3299.svg
index 3e750322ec..ffe9e7757a 100644
--- a/public/emoji/3299.svg
+++ b/public/emoji/3299.svg
@@ -1 +1 @@
-
\ No newline at end of file
+image/svg+xml
diff --git a/public/emoji/33-20e3.svg b/public/emoji/33-20e3.svg
new file mode 100644
index 0000000000..9d70003df3
--- /dev/null
+++ b/public/emoji/33-20e3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/34-20e3.svg b/public/emoji/34-20e3.svg
new file mode 100644
index 0000000000..5fdef5829c
--- /dev/null
+++ b/public/emoji/34-20e3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/35-20e3.svg b/public/emoji/35-20e3.svg
new file mode 100644
index 0000000000..2afa988d6f
--- /dev/null
+++ b/public/emoji/35-20e3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/36-20e3.svg b/public/emoji/36-20e3.svg
new file mode 100644
index 0000000000..153c581d60
--- /dev/null
+++ b/public/emoji/36-20e3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/37-20e3.svg b/public/emoji/37-20e3.svg
new file mode 100644
index 0000000000..abbb8d654b
--- /dev/null
+++ b/public/emoji/37-20e3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/38-20e3.svg b/public/emoji/38-20e3.svg
new file mode 100644
index 0000000000..11e7176503
--- /dev/null
+++ b/public/emoji/38-20e3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/39-20e3.svg b/public/emoji/39-20e3.svg
new file mode 100644
index 0000000000..c82bb1a1b9
--- /dev/null
+++ b/public/emoji/39-20e3.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/a9.svg b/public/emoji/a9.svg
new file mode 100644
index 0000000000..a56a396950
--- /dev/null
+++ b/public/emoji/a9.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/ae.svg b/public/emoji/ae.svg
new file mode 100644
index 0000000000..012e11635e
--- /dev/null
+++ b/public/emoji/ae.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/e50a.svg b/public/emoji/e50a.svg
new file mode 100644
index 0000000000..7c28b8f06a
--- /dev/null
+++ b/public/emoji/e50a.svg
@@ -0,0 +1 @@
+image/svg+xml
diff --git a/public/emoji/sheet.png b/public/emoji/sheet.png
new file mode 100644
index 0000000000..e9a3f23f86
Binary files /dev/null and b/public/emoji/sheet.png differ
diff --git a/public/oops.gif b/public/oops.gif
new file mode 100644
index 0000000000..ad19c4e105
Binary files /dev/null and b/public/oops.gif differ
diff --git a/public/oops.png b/public/oops.png
deleted file mode 100644
index 0abddad3e8..0000000000
Binary files a/public/oops.png and /dev/null differ
diff --git a/spec/controllers/api/v1/accounts/relationships_controller_spec.rb b/spec/controllers/api/v1/accounts/relationships_controller_spec.rb
index a9073b197a..431fc21941 100644
--- a/spec/controllers/api/v1/accounts/relationships_controller_spec.rb
+++ b/spec/controllers/api/v1/accounts/relationships_controller_spec.rb
@@ -50,14 +50,14 @@ describe Api::V1::Accounts::RelationshipsController do
json = body_as_json
expect(json).to be_a Enumerable
- expect(json.first[:id]).to eq simon.id
+ expect(json.first[:id]).to eq simon.id.to_s
expect(json.first[:following]).to be true
expect(json.first[:followed_by]).to be false
expect(json.first[:muting]).to be false
expect(json.first[:requested]).to be false
expect(json.first[:domain_blocking]).to be false
- expect(json.second[:id]).to eq lewis.id
+ expect(json.second[:id]).to eq lewis.id.to_s
expect(json.second[:following]).to be false
expect(json.second[:followed_by]).to be true
expect(json.second[:muting]).to be false
diff --git a/spec/controllers/api/v1/custom_emojis_controller_spec.rb b/spec/controllers/api/v1/custom_emojis_controller_spec.rb
new file mode 100644
index 0000000000..9f3522812b
--- /dev/null
+++ b/spec/controllers/api/v1/custom_emojis_controller_spec.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe Api::V1::CustomEmojisController, type: :controller do
+ render_views
+
+ describe 'GET #index' do
+ before do
+ Fabricate(:custom_emoji)
+ get :index
+ end
+
+ it 'returns http success' do
+ expect(response).to have_http_status(:success)
+ end
+ end
+end
diff --git a/spec/controllers/api/v1/media_controller_spec.rb b/spec/controllers/api/v1/media_controller_spec.rb
index 6bad3f05d8..baa22d7e48 100644
--- a/spec/controllers/api/v1/media_controller_spec.rb
+++ b/spec/controllers/api/v1/media_controller_spec.rb
@@ -53,7 +53,7 @@ RSpec.describe Api::V1::MediaController, type: :controller do
end
it 'returns media ID in JSON' do
- expect(body_as_json[:id]).to eq MediaAttachment.first.id
+ expect(body_as_json[:id]).to eq MediaAttachment.first.id.to_s
end
end
@@ -75,7 +75,7 @@ RSpec.describe Api::V1::MediaController, type: :controller do
end
it 'returns media ID in JSON' do
- expect(body_as_json[:id]).to eq MediaAttachment.first.id
+ expect(body_as_json[:id]).to eq MediaAttachment.first.id.to_s
end
end
@@ -97,7 +97,7 @@ RSpec.describe Api::V1::MediaController, type: :controller do
end
xit 'returns media ID in JSON' do
- expect(body_as_json[:id]).to eq MediaAttachment.first.id
+ expect(body_as_json[:id]).to eq MediaAttachment.first.id.to_s
end
end
end
diff --git a/spec/controllers/api/v1/statuses/favourites_controller_spec.rb b/spec/controllers/api/v1/statuses/favourites_controller_spec.rb
index 2a029230d7..aba7cd4588 100644
--- a/spec/controllers/api/v1/statuses/favourites_controller_spec.rb
+++ b/spec/controllers/api/v1/statuses/favourites_controller_spec.rb
@@ -36,7 +36,7 @@ describe Api::V1::Statuses::FavouritesController do
it 'return json with updated attributes' do
hash_body = body_as_json
- expect(hash_body[:id]).to eq status.id
+ expect(hash_body[:id]).to eq status.id.to_s
expect(hash_body[:favourites_count]).to eq 1
expect(hash_body[:favourited]).to be true
end
diff --git a/spec/controllers/api/v1/statuses/pins_controller_spec.rb b/spec/controllers/api/v1/statuses/pins_controller_spec.rb
index 2e170da240..79005c9dec 100644
--- a/spec/controllers/api/v1/statuses/pins_controller_spec.rb
+++ b/spec/controllers/api/v1/statuses/pins_controller_spec.rb
@@ -32,7 +32,7 @@ describe Api::V1::Statuses::PinsController do
it 'return json with updated attributes' do
hash_body = body_as_json
- expect(hash_body[:id]).to eq status.id
+ expect(hash_body[:id]).to eq status.id.to_s
expect(hash_body[:pinned]).to be true
end
end
diff --git a/spec/controllers/api/v1/statuses/reblogs_controller_spec.rb b/spec/controllers/api/v1/statuses/reblogs_controller_spec.rb
index d6d36c1b2f..7417ff672f 100644
--- a/spec/controllers/api/v1/statuses/reblogs_controller_spec.rb
+++ b/spec/controllers/api/v1/statuses/reblogs_controller_spec.rb
@@ -36,7 +36,7 @@ describe Api::V1::Statuses::ReblogsController do
it 'return json with updated attributes' do
hash_body = body_as_json
- expect(hash_body[:reblog][:id]).to eq status.id
+ expect(hash_body[:reblog][:id]).to eq status.id.to_s
expect(hash_body[:reblog][:reblogs_count]).to eq 1
expect(hash_body[:reblog][:reblogged]).to be true
end
diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb
index d44d720b14..1077a7288b 100644
--- a/spec/controllers/home_controller_spec.rb
+++ b/spec/controllers/home_controller_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe HomeController, type: :controller do
describe 'GET #index' do
context 'when not signed in' do
it 'redirects to about page' do
+ @request.path = '/'
get :index
expect(response).to redirect_to(about_path)
end
@@ -13,6 +14,7 @@ RSpec.describe HomeController, type: :controller do
context 'when signed in' do
let(:user) { Fabricate(:user) }
+
subject do
sign_in(user)
get :index
diff --git a/spec/fabricators/custom_emoji_fabricator.rb b/spec/fabricators/custom_emoji_fabricator.rb
new file mode 100644
index 0000000000..18a7d23dc4
--- /dev/null
+++ b/spec/fabricators/custom_emoji_fabricator.rb
@@ -0,0 +1,5 @@
+Fabricator(:custom_emoji) do
+ shortcode 'coolcat'
+ domain nil
+ image { File.open(Rails.root.join('spec', 'fixtures', 'files', 'emojo.png')) }
+end
diff --git a/spec/fabricators/site_upload_fabricator.rb b/spec/fabricators/site_upload_fabricator.rb
new file mode 100644
index 0000000000..8f4e43ac9b
--- /dev/null
+++ b/spec/fabricators/site_upload_fabricator.rb
@@ -0,0 +1,3 @@
+Fabricator(:site_upload) do
+
+end
diff --git a/spec/fixtures/files/emojo.png b/spec/fixtures/files/emojo.png
new file mode 100644
index 0000000000..cb5993499f
Binary files /dev/null and b/spec/fixtures/files/emojo.png differ
diff --git a/spec/fixtures/requests/activitypub-actor-noinbox.txt b/spec/fixtures/requests/activitypub-actor-noinbox.txt
new file mode 100644
index 0000000000..95b4650e00
--- /dev/null
+++ b/spec/fixtures/requests/activitypub-actor-noinbox.txt
@@ -0,0 +1,9 @@
+HTTP/1.1 200 OK
+Date: Sun, 17 Sep 2017 06:51:23 GMT
+Content-Type: application/json; charset=utf-8
+X-XSS-Protection: 1; mode=block
+Link: ; rel="lrdd"; type="application/xrd+xml", ; rel="alternate"; type="application/atom+xml"
+Vary: Accept-Encoding
+Cache-Control: max-age=0, private, must-revalidate
+
+{"@context":"https://www.w3.org/ns/activitystreams","id":"https://ap.example.com/users/foo","type":"Person","following":"https://ap.example.com/users/foo/following","followers":"https://ap.example.com/users/foo/followers","inbox":null,"outbox":"https://ap.example.com/users/foo/outbox","preferredUsername":"foo","name":"","summary":"\u003cp\u003etest\u003c/p\u003e","icon":"https://quitter.no/avatar/7477-300-20160211190340.png","image":"/headers/original/missing.png","publicKey":{"id":"https://ap.example.com/users/foo#main-key","owner":"https://ap.example.com/users/foo","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu3L4vnpNLzVH31MeWI39\n4F0wKeJFsLDAsNXGeOu0QF2x+h1zLWZw/agqD2R3JPU9/kaDJGPIV2Sn5zLyUA9S\n6swCCMOtn7BBR9g9sucgXJmUFB0tACH2QSgHywMAybGfmSb3LsEMNKsGJ9VsvYoh\n8lDET6X4Pyw+ZJU0/OLo/41q9w+OrGtlsTm/PuPIeXnxa6BLqnDaxC+4IcjG/FiP\nahNCTINl/1F/TgSSDZ4Taf4U9XFEIFw8wmgploELozzIzKq+t8nhQYkgAkt64euW\npva3qL5KD1mTIZQEP+LZvh3s2WHrLi3fhbdRuwQ2c0KkJA2oSTFPDpqqbPGZ3Qvu\nHQIDAQAB\n-----END PUBLIC KEY-----\n"}}
\ No newline at end of file
diff --git a/spec/fixtures/requests/activitypub-actor.txt b/spec/fixtures/requests/activitypub-actor.txt
new file mode 100644
index 0000000000..6514241cb3
--- /dev/null
+++ b/spec/fixtures/requests/activitypub-actor.txt
@@ -0,0 +1,9 @@
+HTTP/1.1 200 OK
+Cache-Control: max-age=0, private, must-revalidate
+Content-Type: application/activity+json; charset=utf-8
+Link: ; rel="lrdd"; type="application/xrd+xml", ; rel="alternate"; type="application/atom+xml", ; rel="alternate"; type="application/activity+json"
+Vary: Accept-Encoding
+X-Content-Type-Options: nosniff
+X-Xss-Protection: 1; mode=block
+
+{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"manuallyApprovesFollowers":"as:manuallyApprovesFollowers","sensitive":"as:sensitive","Hashtag":"as:Hashtag","ostatus":"http://ostatus.org#","atomUri":"ostatus:atomUri","inReplyToAtomUri":"ostatus:inReplyToAtomUri","conversation":"ostatus:conversation"}],"id":"https://ap.example.com/users/foo","type":"Person","following":"https://ap.example.com/users/foo/following","followers":"https://ap.example.com/users/foo/followers","inbox":"https://ap.example.com/users/foo/inbox","outbox":"https://ap.example.com/users/foo/outbox","preferredUsername":"foo","name":"","summary":"\u003cp\u003etest\u003c/p\u003e","url":"https://ap.example.com/@foo","manuallyApprovesFollowers":false,"publicKey":{"id":"https://ap.example.com/users/foo#main-key","owner":"https://ap.example.com/users/foo","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu3L4vnpNLzVH31MeWI39\n4F0wKeJFsLDAsNXGeOu0QF2x+h1zLWZw/agqD2R3JPU9/kaDJGPIV2Sn5zLyUA9S\n6swCCMOtn7BBR9g9sucgXJmUFB0tACH2QSgHywMAybGfmSb3LsEMNKsGJ9VsvYoh\n8lDET6X4Pyw+ZJU0/OLo/41q9w+OrGtlsTm/PuPIeXnxa6BLqnDaxC+4IcjG/FiP\nahNCTINl/1F/TgSSDZ4Taf4U9XFEIFw8wmgploELozzIzKq+t8nhQYkgAkt64euW\npva3qL5KD1mTIZQEP+LZvh3s2WHrLi3fhbdRuwQ2c0KkJA2oSTFPDpqqbPGZ3Qvu\nHQIDAQAB\n-----END PUBLIC KEY-----\n"},"endpoints":{"sharedInbox":"https://ap.example.com/inbox"},"icon":{"type":"Image","url":"https://quitter.no/avatar/7477-300-20160211190340.png"}}
\ No newline at end of file
diff --git a/spec/fixtures/requests/activitypub-feed.txt b/spec/fixtures/requests/activitypub-feed.txt
new file mode 100644
index 0000000000..84fd414c37
--- /dev/null
+++ b/spec/fixtures/requests/activitypub-feed.txt
@@ -0,0 +1,47 @@
+HTTP/1.1 200 OK
+Cache-Control: max-age=0, private, must-revalidate
+Content-Type: application/atom+xml; charset=utf-8
+Link: ; rel="lrdd"; type="application/xrd+xml", ; rel="alternate"; type="application/atom+xml", ; rel="alternate"; type="application/activity+json"
+Vary: Accept-Encoding
+Date: Sun, 17 Sep 2017 06:33:53 GMT
+
+
+
+ https://ap.example.com/users/foo.atom
+ foo
+ test
+ 2017-09-16T18:50:09Z
+ https://ap.example.com/system/accounts/avatars/000/000/001/original/141ee5846d159cba.png?1505587809
+
+ https://ap.example.com/users/foo
+ http://activitystrea.ms/schema/1.0/person
+ https://ap.example.com/users/foo
+ foo
+ foo@ap.example.com
+ <p>test</p>
+
+
+ foo
+ test
+ public
+
+
+
+
+
+
+ https://ap.example.com/users/foo/statuses/11076
+ 2017-09-13T01:23:19Z
+ 2017-09-13T01:23:19Z
+ New status by foo
+ http://activitystrea.ms/schema/1.0/note
+ http://activitystrea.ms/schema/1.0/post
+
+ <p>test</p>
+
+ public
+
+
+
+
+
diff --git a/spec/fixtures/requests/activitypub-webfinger.txt b/spec/fixtures/requests/activitypub-webfinger.txt
new file mode 100644
index 0000000000..465066d84e
--- /dev/null
+++ b/spec/fixtures/requests/activitypub-webfinger.txt
@@ -0,0 +1,7 @@
+HTTP/1.1 200 OK
+Cache-Control: max-age=0, private, must-revalidate
+Content-Type: application/jrd+json; charset=utf-8
+X-Content-Type-Options: nosniff
+Date: Sun, 17 Sep 2017 06:22:50 GMT
+
+{"subject":"acct:foo@ap.example.com","aliases":["https://ap.example.com/@foo","https://ap.example.com/users/foo"],"links":[{"rel":"http://webfinger.net/rel/profile-page","type":"text/html","href":"https://ap.example.com/@foo"},{"rel":"http://schemas.google.com/g/2010#updates-from","type":"application/atom+xml","href":"https://ap.example.com/users/foo.atom"},{"rel":"self","type":"application/activity+json","href":"https://ap.example.com/users/foo"},{"rel":"salmon","href":"https://ap.example.com/api/salmon/1"},{"rel":"magic-public-key","href":"data:application/magic-public-key,RSA.u3L4vnpNLzVH31MeWI394F0wKeJFsLDAsNXGeOu0QF2x-h1zLWZw_agqD2R3JPU9_kaDJGPIV2Sn5zLyUA9S6swCCMOtn7BBR9g9sucgXJmUFB0tACH2QSgHywMAybGfmSb3LsEMNKsGJ9VsvYoh8lDET6X4Pyw-ZJU0_OLo_41q9w-OrGtlsTm_PuPIeXnxa6BLqnDaxC-4IcjG_FiPahNCTINl_1F_TgSSDZ4Taf4U9XFEIFw8wmgploELozzIzKq-t8nhQYkgAkt64euWpva3qL5KD1mTIZQEP-LZvh3s2WHrLi3fhbdRuwQ2c0KkJA2oSTFPDpqqbPGZ3QvuHQ==.AQAB"},{"rel":"http://ostatus.org/schema/1.0/subscribe","template":"https://ap.example.com/authorize_follow?acct={uri}"}]}
\ No newline at end of file
diff --git a/spec/helpers/emoji_helper_spec.rb b/spec/helpers/emoji_helper_spec.rb
deleted file mode 100644
index 6edf7672f7..0000000000
--- a/spec/helpers/emoji_helper_spec.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe EmojiHelper, type: :helper do
- describe '#emojify' do
- it 'converts shortcodes to unicode' do
- text = ':book: Book'
- expect(emojify(text)).to eq '📖 Book'
- end
-
- it 'converts composite emoji shortcodes to unicode' do
- text = ':couple_ww:'
- expect(emojify(text)).to eq '👩❤👩'
- end
-
- it 'does not convert shortcodes that are part of a string into unicode' do
- text = ':see_no_evil::hear_no_evil::speak_no_evil:'
- expect(emojify(text)).to eq text
- end
- end
-end
diff --git a/spec/javascript/components/dropdown_menu.test.js b/spec/javascript/components/dropdown_menu.test.js
deleted file mode 100644
index a5af730efe..0000000000
--- a/spec/javascript/components/dropdown_menu.test.js
+++ /dev/null
@@ -1,132 +0,0 @@
-import { expect } from 'chai';
-import { shallow, mount } from 'enzyme';
-import sinon from 'sinon';
-import React from 'react';
-import DropdownMenu from '../../../app/javascript/mastodon/components/dropdown_menu';
-import Dropdown, { DropdownTrigger, DropdownContent } from 'react-simple-dropdown';
-
-const isTrue = () => true;
-
-describe(' ', () => {
- const icon = 'my-icon';
- const size = 123;
- let items;
- let wrapper;
- let action;
-
- beforeEach(() => {
- action = sinon.spy();
-
- items = [
- { text: 'first item', action: action, href: '/some/url' },
- { text: 'second item', action: 'noop' },
- ];
- wrapper = shallow( );
- });
-
- it('contains one ', () => {
- expect(wrapper).to.have.exactly(1).descendants(Dropdown);
- });
-
- it('contains one ', () => {
- expect(wrapper.find(Dropdown)).to.have.exactly(1).descendants(DropdownTrigger);
- });
-
- it('contains one ', () => {
- expect(wrapper.find(Dropdown)).to.have.exactly(1).descendants(DropdownContent);
- });
-
- it('does not contain a if isUserTouching', () => {
- const touchingWrapper = shallow( );
- expect(touchingWrapper.find(Dropdown)).to.have.exactly(0).descendants(DropdownContent);
- });
-
- it('does not contain a if isUserTouching', () => {
- const touchingWrapper = shallow( );
- expect(touchingWrapper.find(Dropdown)).to.have.exactly(0).descendants(DropdownContent);
- });
-
- it('uses props.size for style values', () => {
- ['font-size', 'width', 'line-height'].map((property) => {
- expect(wrapper.find(DropdownTrigger)).to.have.style(property, `${size}px`);
- });
- });
-
- it('uses props.icon as icon class name', () => {
- expect(wrapper.find(DropdownTrigger).find('i')).to.have.className(`fa-${icon}`);
- });
-
- it('is not expanded by default', () => {
- expect(wrapper.state('expanded')).to.be.equal(false);
- });
-
- it('does not render the list elements if not expanded', () => {
- const lis = wrapper.find(DropdownContent).find('li');
- expect(lis.length).to.be.equal(0);
- });
-
- it('sets expanded to true when clicking the trigger', () => {
- const wrapper = mount( );
- wrapper.find(DropdownTrigger).first().simulate('click');
- expect(wrapper.state('expanded')).to.be.equal(true);
- });
-
- it('calls onModalOpen when clicking the trigger if isUserTouching', () => {
- const onModalOpen = sinon.spy();
- const touchingWrapper = mount( );
- touchingWrapper.find(DropdownTrigger).first().simulate('click');
- expect(onModalOpen.calledOnce).to.be.equal(true);
- expect(onModalOpen.args[0][0]).to.be.deep.equal({ status: 3.14, actions: items, onClick: touchingWrapper.node.handleClick });
- });
-
- it('calls onModalClose when clicking an action if isUserTouching and isModalOpen', () => {
- const onModalOpen = sinon.spy();
- const onModalClose = sinon.spy();
- const touchingWrapper = mount( );
- touchingWrapper.find(DropdownTrigger).first().simulate('click');
- touchingWrapper.node.handleClick({ currentTarget: { getAttribute: () => '0' }, preventDefault: () => null });
- expect(onModalClose.calledOnce).to.be.equal(true);
- });
-
- // Error: ReactWrapper::state() can only be called on the root
- /*it('sets expanded to false when clicking outside', () => {
- const wrapper = mount((
-
-
-
-
- ));
-
- wrapper.find(DropdownTrigger).first().simulate('click');
- expect(wrapper.find(DropdownMenu).first().state('expanded')).to.be.equal(true);
-
- wrapper.find('span').first().simulate('click');
- expect(wrapper.find(DropdownMenu).first().state('expanded')).to.be.equal(false);
- })*/
-
- it('renders list elements for each props.items if expanded', () => {
- const wrapper = mount( );
- wrapper.find(DropdownTrigger).first().simulate('click');
- const lis = wrapper.find(DropdownContent).find('li');
- expect(lis.length).to.be.equal(items.length);
- });
-
- it('uses the href passed in via props.items', () => {
- wrapper
- .find(DropdownContent).find('li a')
- .forEach((a, i) => expect(a).to.have.attr('href', items[i].href));
- });
-
- it('uses the text passed in via props.items', () => {
- wrapper
- .find(DropdownContent).find('li a')
- .forEach((a, i) => expect(a).to.have.text(items[i].text));
- });
-
- it('uses the action passed in via props.items as click handler', () => {
- const wrapper = mount( );
- wrapper.find(DropdownTrigger).first().simulate('click');
- wrapper.find(DropdownContent).find('li a').first().simulate('click');
- expect(action.calledOnce).to.equal(true);
- });
-});
diff --git a/spec/javascript/components/emojify.test.js b/spec/javascript/components/emojify.test.js
index e165b4519f..6e73c92514 100644
--- a/spec/javascript/components/emojify.test.js
+++ b/spec/javascript/components/emojify.test.js
@@ -22,23 +22,23 @@ describe('emojify', () => {
it('does unicode', () => {
expect(emojify('\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66')).to.equal(
- ' ');
- expect(emojify('\uD83D\uDC68\uD83D\uDC69\uD83D\uDC67\uD83D\uDC67')).to.equal(
- ' ');
- expect(emojify('\uD83D\uDC69\uD83D\uDC69\uD83D\uDC66')).to.equal(' ');
+ ' ');
+ expect(emojify('👨👩👧👧')).to.equal(
+ ' ');
+ expect(emojify('👩👩👦')).to.equal(' ');
expect(emojify('\u2757')).to.equal(
' ');
});
it('does multiple unicode', () => {
expect(emojify('\u2757 #\uFE0F\u20E3')).to.equal(
- ' ');
+ ' ');
expect(emojify('\u2757#\uFE0F\u20E3')).to.equal(
- ' ');
+ ' ');
expect(emojify('\u2757 #\uFE0F\u20E3 \u2757')).to.equal(
- ' ');
+ ' ');
expect(emojify('foo \u2757 #\uFE0F\u20E3 bar')).to.equal(
- 'foo bar');
+ 'foo bar');
});
it('ignores unicode inside of tags', () => {
diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb
index fcb044ebcb..cdd4991505 100644
--- a/spec/lib/activitypub/activity/create_spec.rb
+++ b/spec/lib/activitypub/activity/create_spec.rb
@@ -17,6 +17,7 @@ RSpec.describe ActivityPub::Activity::Create do
before do
stub_request(:get, 'http://example.com/attachment.png').to_return(request_fixture('avatar.txt'))
+ stub_request(:get, 'http://example.com/emoji.png').to_return(body: attachment_fixture('emojo.png'))
end
describe '#perform' do
@@ -170,6 +171,26 @@ RSpec.describe ActivityPub::Activity::Create do
end
end
+ context 'with mentions missing href' do
+ let(:object_json) do
+ {
+ id: 'bar',
+ type: 'Note',
+ content: 'Lorem ipsum',
+ tag: [
+ {
+ type: 'Mention',
+ },
+ ],
+ }
+ end
+
+ it 'creates status' do
+ status = sender.statuses.first
+ expect(status).to_not be_nil
+ end
+ end
+
context 'with media attachments' do
let(:object_json) do
{
@@ -194,6 +215,27 @@ RSpec.describe ActivityPub::Activity::Create do
end
end
+ context 'with media attachments missing url' do
+ let(:object_json) do
+ {
+ id: 'bar',
+ type: 'Note',
+ content: 'Lorem ipsum',
+ attachment: [
+ {
+ type: 'Document',
+ mime_type: 'image/png',
+ },
+ ],
+ }
+ end
+
+ it 'creates status' do
+ status = sender.statuses.first
+ expect(status).to_not be_nil
+ end
+ end
+
context 'with hashtags' do
let(:object_json) do
{
@@ -217,5 +259,92 @@ RSpec.describe ActivityPub::Activity::Create do
expect(status.tags.map(&:name)).to include('test')
end
end
+
+ context 'with hashtags missing name' do
+ let(:object_json) do
+ {
+ id: 'bar',
+ type: 'Note',
+ content: 'Lorem ipsum',
+ tag: [
+ {
+ type: 'Hashtag',
+ href: 'http://example.com/blah',
+ },
+ ],
+ }
+ end
+
+ it 'creates status' do
+ status = sender.statuses.first
+ expect(status).to_not be_nil
+ end
+ end
+
+ context 'with emojis' do
+ let(:object_json) do
+ {
+ id: 'bar',
+ type: 'Note',
+ content: 'Lorem ipsum :tinking:',
+ tag: [
+ {
+ type: 'Emoji',
+ href: 'http://example.com/emoji.png',
+ name: 'tinking',
+ },
+ ],
+ }
+ end
+
+ it 'creates status' do
+ status = sender.statuses.first
+
+ expect(status).to_not be_nil
+ expect(status.emojis.map(&:shortcode)).to include('tinking')
+ end
+ end
+
+ context 'with emojis missing name' do
+ let(:object_json) do
+ {
+ id: 'bar',
+ type: 'Note',
+ content: 'Lorem ipsum :tinking:',
+ tag: [
+ {
+ type: 'Emoji',
+ href: 'http://example.com/emoji.png',
+ },
+ ],
+ }
+ end
+
+ it 'creates status' do
+ status = sender.statuses.first
+ expect(status).to_not be_nil
+ end
+ end
+
+ context 'with emojis missing href' do
+ let(:object_json) do
+ {
+ id: 'bar',
+ type: 'Note',
+ content: 'Lorem ipsum :tinking:',
+ tag: [
+ {
+ type: 'Emoji',
+ name: 'tinking',
+ },
+ ],
+ }
+ end
+
+ it 'creates status' do
+ status = sender.statuses.first
+ expect(status).to_not be_nil
+ end
+ end
end
end
diff --git a/spec/lib/activitypub/tag_manager_spec.rb b/spec/lib/activitypub/tag_manager_spec.rb
index dea8abc655..0d16652169 100644
--- a/spec/lib/activitypub/tag_manager_spec.rb
+++ b/spec/lib/activitypub/tag_manager_spec.rb
@@ -108,7 +108,7 @@ RSpec.describe ActivityPub::TagManager do
it 'returns the local status for OStatus tag: URI' do
status = Fabricate(:status)
- expect(subject.uri_to_resource(::TagManager.instance.uri_for(status), Status)).to eq status
+ expect(subject.uri_to_resource(OStatus::TagManager.instance.uri_for(status), Status)).to eq status
end
it 'returns the local status for OStatus StreamEntry URL' do
diff --git a/spec/lib/emoji_spec.rb b/spec/lib/emoji_spec.rb
deleted file mode 100644
index 04931ccfba..0000000000
--- a/spec/lib/emoji_spec.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe Emoji do
- describe '#unicode' do
- it 'returns a unicode for a shortcode' do
- expect(Emoji.instance.unicode(':joy:')).to eq '😂'
- end
- end
-
- describe '#names' do
- it 'returns an array' do
- expect(Emoji.instance.names).to be_an Array
- end
- end
-end
diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb
index ab04ccbabb..71b6b78d2f 100644
--- a/spec/lib/formatter_spec.rb
+++ b/spec/lib/formatter_spec.rb
@@ -89,6 +89,54 @@ RSpec.describe Formatter do
end
end
+ context 'matches a URL with Japanese path string' do
+ let(:text) { 'https://ja.wikipedia.org/wiki/日本' }
+
+ it 'has valid URL' do
+ is_expected.to include 'href="https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC"'
+ end
+ end
+
+ context 'matches a URL with Korean path string' do
+ let(:text) { 'https://ko.wikipedia.org/wiki/대한민국' }
+
+ it 'has valid URL' do
+ is_expected.to include 'href="https://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD"'
+ end
+ end
+
+ context 'matches a URL with Simplified Chinese path string' do
+ let(:text) { 'https://baike.baidu.com/item/中华人民共和国' }
+
+ it 'has valid URL' do
+ is_expected.to include 'href="https://baike.baidu.com/item/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD"'
+ end
+ end
+
+ context 'matches a URL with Traditional Chinese path string' do
+ let(:text) { 'https://zh.wikipedia.org/wiki/臺灣' }
+
+ it 'has valid URL' do
+ is_expected.to include 'href="https://zh.wikipedia.org/wiki/%E8%87%BA%E7%81%A3"'
+ end
+ end
+
+ context 'contains unsafe URL (XSS attack, visible part)' do
+ let(:text) { %q{http://example.com/bb} }
+
+ it 'has escaped HTML' do
+ is_expected.to include '<del>b</del>'
+ end
+ end
+
+ context 'contains unsafe URL (XSS attack, invisible part)' do
+ let(:text) { %q{http://example.com/blahblahblahblah/a} }
+
+ it 'has escaped HTML' do
+ is_expected.to include '<script>alert("Hello")</script>'
+ end
+ end
+
context 'contains HTML (script tag)' do
let(:text) { '' }
@@ -175,6 +223,45 @@ RSpec.describe Formatter do
include_examples 'encode and link URLs'
end
+
+ context 'with custom_emojify option' do
+ let!(:emoji) { Fabricate(:custom_emoji) }
+ let(:status) { Fabricate(:status, account: local_account, text: text) }
+
+ subject { Formatter.instance.format(status, custom_emojify: true) }
+
+ context 'with emoji at the start' do
+ let(:text) { ':coolcat: Beep boop' }
+
+ it 'converts shortcode to image tag' do
+ is_expected.to match(/ :coolcat: Beep boop ' }
+
+ it 'converts shortcode to image tag' do
+ is_expected.to match(/
Beep :coolcat: boop
' }
+
+ it 'converts shortcode to image tag' do
+ is_expected.to match(/Beep :coolcat::coolcat:
' }
+
+ it 'does not touch the shortcodes' do
+ is_expected.to match(/
:coolcat::coolcat:<\/p>/)
+ end
+ end
+
+ context 'with emoji at the end' do
+ let(:text) { '
Beep boop :coolcat:
' }
+
+ it 'converts shortcode to image tag' do
+ is_expected.to match(/
Hello :coolcat:' }
+
+ it 'returns records used via shortcodes in text' do
+ is_expected.to include(emojo)
+ end
+ end
+ end
+end
diff --git a/spec/models/site_upload_spec.rb b/spec/models/site_upload_spec.rb
new file mode 100644
index 0000000000..8745d54b8f
--- /dev/null
+++ b/spec/models/site_upload_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe SiteUpload, type: :model do
+
+end
diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb
index 484effd5e1..9cb71d715d 100644
--- a/spec/models/status_spec.rb
+++ b/spec/models/status_spec.rb
@@ -173,16 +173,19 @@ RSpec.describe Status, type: :model do
end
end
- describe '.local_only' do
- it 'returns only statuses from local accounts' do
- local_account = Fabricate(:account, domain: nil)
- remote_account = Fabricate(:account, domain: 'test.com')
- local_status = Fabricate(:status, account: local_account)
- remote_status = Fabricate(:status, account: remote_account)
+ describe '.not_in_filtered_languages' do
+ context 'for accounts with language filters' do
+ let(:user) { Fabricate(:user, filtered_languages: ['en']) }
- results = described_class.local_only
- expect(results).to include(local_status)
- expect(results).not_to include(remote_status)
+ it 'does not include statuses in filtered languages' do
+ status = Fabricate(:status, language: 'en')
+ expect(Status.not_in_filtered_languages(user.account)).not_to include status
+ end
+
+ it 'includes status with unknown language' do
+ status = Fabricate(:status, language: nil)
+ expect(Status.not_in_filtered_languages(user.account)).to include status
+ end
end
end
@@ -529,6 +532,14 @@ RSpec.describe Status, type: :model do
end
end
+ describe 'validation' do
+ it 'disallow empty uri for remote status' do
+ alice.update(domain: 'example.com')
+ status = Fabricate.build(:status, uri: '', account: alice)
+ expect(status).to model_have_error_on_field(:uri)
+ end
+ end
+
describe 'after_create' do
it 'saves ActivityPub uri as uri for local status' do
status = Status.create(account: alice, text: 'foo')
diff --git a/spec/services/activitypub/process_collection_service_spec.rb b/spec/services/activitypub/process_collection_service_spec.rb
index 249b12470e..c1cc22523c 100644
--- a/spec/services/activitypub/process_collection_service_spec.rb
+++ b/spec/services/activitypub/process_collection_service_spec.rb
@@ -1,7 +1,7 @@
require 'rails_helper'
RSpec.describe ActivityPub::ProcessCollectionService do
- let(:actor) { Fabricate(:account) }
+ let(:actor) { Fabricate(:account, domain: 'example.com', uri: 'http://example.com/account') }
let(:payload) do
{
@@ -24,7 +24,7 @@ RSpec.describe ActivityPub::ProcessCollectionService do
describe '#call' do
context 'when actor is the sender'
context 'when actor differs from sender' do
- let(:forwarder) { Fabricate(:account) }
+ let(:forwarder) { Fabricate(:account, domain: 'example.com', uri: 'http://example.com/other_account') }
it 'processes payload with sender if no signature exists' do
expect_any_instance_of(ActivityPub::LinkedDataSignature).not_to receive(:verify_account!)
diff --git a/spec/services/authorize_follow_service_spec.rb b/spec/services/authorize_follow_service_spec.rb
index d74eb41a2c..6ea4d83da3 100644
--- a/spec/services/authorize_follow_service_spec.rb
+++ b/spec/services/authorize_follow_service_spec.rb
@@ -42,7 +42,7 @@ RSpec.describe AuthorizeFollowService do
it 'sends a follow request authorization salmon slap' do
expect(a_request(:post, "http://salmon.example.com/").with { |req|
xml = OStatus2::Salmon.new.unpack(req.body)
- xml.match(TagManager::VERBS[:authorize])
+ xml.match(OStatus::TagManager::VERBS[:authorize])
}).to have_been_made.once
end
end
diff --git a/spec/services/batched_remove_status_service_spec.rb b/spec/services/batched_remove_status_service_spec.rb
index b1e9ac567b..f5c9adfb54 100644
--- a/spec/services/batched_remove_status_service_spec.rb
+++ b/spec/services/batched_remove_status_service_spec.rb
@@ -50,14 +50,14 @@ RSpec.describe BatchedRemoveStatusService do
it 'sends PuSH update to PuSH subscribers' do
expect(a_request(:post, 'http://example.com/push').with { |req|
- matches = req.body.match(TagManager::VERBS[:delete])
+ matches = req.body.match(OStatus::TagManager::VERBS[:delete])
}).to have_been_made.at_least_once
end
it 'sends Salmon slap to previously mentioned users' do
expect(a_request(:post, "http://example.com/salmon").with { |req|
xml = OStatus2::Salmon.new.unpack(req.body)
- xml.match(TagManager::VERBS[:delete])
+ xml.match(OStatus::TagManager::VERBS[:delete])
}).to have_been_made.once
end
diff --git a/spec/services/block_service_spec.rb b/spec/services/block_service_spec.rb
index bd2ab3d53e..c69ff78047 100644
--- a/spec/services/block_service_spec.rb
+++ b/spec/services/block_service_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe BlockService do
it 'sends a block salmon slap' do
expect(a_request(:post, "http://salmon.example.com/").with { |req|
xml = OStatus2::Salmon.new.unpack(req.body)
- xml.match(TagManager::VERBS[:block])
+ xml.match(OStatus::TagManager::VERBS[:block])
}).to have_been_made.once
end
end
diff --git a/spec/services/favourite_service_spec.rb b/spec/services/favourite_service_spec.rb
index 2ab1f32ca2..5bf2c74a91 100644
--- a/spec/services/favourite_service_spec.rb
+++ b/spec/services/favourite_service_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe FavouriteService do
it 'sends a salmon slap' do
expect(a_request(:post, "http://salmon.example.com/").with { |req|
xml = OStatus2::Salmon.new.unpack(req.body)
- xml.match(TagManager::VERBS[:favorite])
+ xml.match(OStatus::TagManager::VERBS[:favorite])
}).to have_been_made.once
end
end
diff --git a/spec/services/fetch_link_card_service_spec.rb b/spec/services/fetch_link_card_service_spec.rb
index b0aa740ac9..ba61d22c34 100644
--- a/spec/services/fetch_link_card_service_spec.rb
+++ b/spec/services/fetch_link_card_service_spec.rb
@@ -12,6 +12,8 @@ RSpec.describe FetchLinkCardService do
stub_request(:get, 'http://example.com/sjis_with_wrong_charset').to_return(request_fixture('sjis_with_wrong_charset.txt'))
stub_request(:head, 'http://example.com/koi8-r').to_return(status: 200, headers: { 'Content-Type' => 'text/html' })
stub_request(:get, 'http://example.com/koi8-r').to_return(request_fixture('koi8-r.txt'))
+ stub_request(:head, 'http://example.com/日本語').to_return(status: 200, headers: { 'Content-Type' => 'text/html' })
+ stub_request(:get, 'http://example.com/日本語').to_return(request_fixture('sjis.txt'))
stub_request(:head, 'https://github.com/qbi/WannaCry').to_return(status: 404)
subject.call(status)
@@ -52,6 +54,15 @@ RSpec.describe FetchLinkCardService do
expect(status.preview_cards.first.title).to eq("Московя начинаетъ только въ XVI ст. привлекать внимане иностранцевъ.")
end
end
+
+ context do
+ let(:status) { Fabricate(:status, text: 'テストhttp://example.com/日本語') }
+
+ it 'works with Japanese path string' do
+ expect(a_request(:get, 'http://example.com/日本語')).to have_been_made.at_least_once
+ expect(status.preview_cards.first.title).to eq("SJISのページ")
+ end
+ end
end
context 'in a remote status' do
diff --git a/spec/services/follow_service_spec.rb b/spec/services/follow_service_spec.rb
index 1e23780316..ceb39e5e6e 100644
--- a/spec/services/follow_service_spec.rb
+++ b/spec/services/follow_service_spec.rb
@@ -60,7 +60,7 @@ RSpec.describe FollowService do
it 'sends a follow request salmon slap' do
expect(a_request(:post, "http://salmon.example.com/").with { |req|
xml = OStatus2::Salmon.new.unpack(req.body)
- xml.match(TagManager::VERBS[:request_friend])
+ xml.match(OStatus::TagManager::VERBS[:request_friend])
}).to have_been_made.once
end
end
@@ -81,7 +81,7 @@ RSpec.describe FollowService do
it 'sends a follow salmon slap' do
expect(a_request(:post, "http://salmon.example.com/").with { |req|
xml = OStatus2::Salmon.new.unpack(req.body)
- xml.match(TagManager::VERBS[:follow])
+ xml.match(OStatus::TagManager::VERBS[:follow])
}).to have_been_made.once
end
diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb
index 4182c4e1fa..91902ff69d 100644
--- a/spec/services/post_status_service_spec.rb
+++ b/spec/services/post_status_service_spec.rb
@@ -65,15 +65,12 @@ RSpec.describe PostStatusService do
end
it 'creates a status with a language set' do
- detector = double(to_iso_s: :en)
- allow(LanguageDetector).to receive(:new).and_return(detector)
-
account = Fabricate(:account)
- text = 'test status text'
+ text = 'This is an English text.'
- subject.call(account, text)
+ status = subject.call(account, text)
- expect(LanguageDetector).to have_received(:new).with(text, account)
+ expect(status.language).to eq 'en'
end
it 'processes mentions' do
diff --git a/spec/services/reject_follow_service_spec.rb b/spec/services/reject_follow_service_spec.rb
index 2e06345b36..bf49dd2c94 100644
--- a/spec/services/reject_follow_service_spec.rb
+++ b/spec/services/reject_follow_service_spec.rb
@@ -42,7 +42,7 @@ RSpec.describe RejectFollowService do
it 'sends a follow request rejection salmon slap' do
expect(a_request(:post, "http://salmon.example.com/").with { |req|
xml = OStatus2::Salmon.new.unpack(req.body)
- xml.match(TagManager::VERBS[:reject])
+ xml.match(OStatus::TagManager::VERBS[:reject])
}).to have_been_made.once
end
end
diff --git a/spec/services/remove_status_service_spec.rb b/spec/services/remove_status_service_spec.rb
index 8b34bdb6b6..b60015928b 100644
--- a/spec/services/remove_status_service_spec.rb
+++ b/spec/services/remove_status_service_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe RemoveStatusService do
it 'sends PuSH update to PuSH subscribers' do
expect(a_request(:post, 'http://example.com/push').with { |req|
- req.body.match(TagManager::VERBS[:delete])
+ req.body.match(OStatus::TagManager::VERBS[:delete])
}).to have_been_made
end
@@ -45,7 +45,7 @@ RSpec.describe RemoveStatusService do
it 'sends Salmon slap to previously mentioned users' do
expect(a_request(:post, "http://example.com/salmon").with { |req|
xml = OStatus2::Salmon.new.unpack(req.body)
- xml.match(TagManager::VERBS[:delete])
+ xml.match(OStatus::TagManager::VERBS[:delete])
}).to have_been_made.once
end
diff --git a/spec/services/resolve_remote_account_service_spec.rb b/spec/services/resolve_remote_account_service_spec.rb
index d0eab2310b..d0bb6a1373 100644
--- a/spec/services/resolve_remote_account_service_spec.rb
+++ b/spec/services/resolve_remote_account_service_spec.rb
@@ -72,6 +72,39 @@ RSpec.describe ResolveRemoteAccountService do
end
context 'with an ActivityPub account' do
+ before do
+ stub_request(:get, "https://ap.example.com/.well-known/webfinger?resource=acct:foo@ap.example.com").to_return(request_fixture('activitypub-webfinger.txt'))
+ stub_request(:get, "https://ap.example.com/users/foo").to_return(request_fixture('activitypub-actor.txt'))
+ stub_request(:get, "https://ap.example.com/users/foo.atom").to_return(request_fixture('activitypub-feed.txt'))
+ stub_request(:get, %r{https://ap.example.com/users/foo/\w+}).to_return(status: 404)
+ end
+
+ it 'fallback to OStatus if actor json could not be fetched' do
+ stub_request(:get, "https://ap.example.com/users/foo").to_return(status: 404)
+
+ account = subject.call('foo@ap.example.com')
+
+ expect(account.ostatus?).to eq true
+ expect(account.remote_url).to eq 'https://ap.example.com/users/foo.atom'
+ end
+
+ it 'fallback to OStatus if actor json did not have inbox_url' do
+ stub_request(:get, "https://ap.example.com/users/foo").to_return(request_fixture('activitypub-actor-noinbox.txt'))
+
+ account = subject.call('foo@ap.example.com')
+
+ expect(account.ostatus?).to eq true
+ expect(account.remote_url).to eq 'https://ap.example.com/users/foo.atom'
+ end
+
+ it 'returns new remote account' do
+ account = subject.call('foo@ap.example.com')
+
+ expect(account.activitypub?).to eq true
+ expect(account.domain).to eq 'ap.example.com'
+ expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox'
+ end
+
pending
end
diff --git a/spec/services/unblock_service_spec.rb b/spec/services/unblock_service_spec.rb
index def4981e72..ca7a6b77e8 100644
--- a/spec/services/unblock_service_spec.rb
+++ b/spec/services/unblock_service_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe UnblockService do
it 'sends an unblock salmon slap' do
expect(a_request(:post, "http://salmon.example.com/").with { |req|
xml = OStatus2::Salmon.new.unpack(req.body)
- xml.match(TagManager::VERBS[:unblock])
+ xml.match(OStatus::TagManager::VERBS[:unblock])
}).to have_been_made.once
end
end
diff --git a/spec/services/unfollow_service_spec.rb b/spec/services/unfollow_service_spec.rb
index 29040431e5..021e767826 100644
--- a/spec/services/unfollow_service_spec.rb
+++ b/spec/services/unfollow_service_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe UnfollowService do
it 'sends an unfollow salmon slap' do
expect(a_request(:post, "http://salmon.example.com/").with { |req|
xml = OStatus2::Salmon.new.unpack(req.body)
- xml.match(TagManager::VERBS[:unfollow])
+ xml.match(OStatus::TagManager::VERBS[:unfollow])
}).to have_been_made.once
end
end
diff --git a/spec/views/about/show.html.haml_spec.rb b/spec/views/about/show.html.haml_spec.rb
index 95a8a63234..b2f2658de8 100644
--- a/spec/views/about/show.html.haml_spec.rb
+++ b/spec/views/about/show.html.haml_spec.rb
@@ -17,6 +17,7 @@ describe 'about/show.html.haml', without_verify_partial_doubles: true do
version_number: '1.0',
source_url: 'https://github.com/tootsuite/mastodon',
open_registrations: false,
+ thumbnail: nil,
closed_registrations_message: 'yes',
commit_hash: commit_hash)
diff --git a/spec/views/stream_entries/show.html.haml_spec.rb b/spec/views/stream_entries/show.html.haml_spec.rb
index 6cc3b117aa..59ea409907 100644
--- a/spec/views/stream_entries/show.html.haml_spec.rb
+++ b/spec/views/stream_entries/show.html.haml_spec.rb
@@ -80,9 +80,9 @@ describe 'stream_entries/show.html.haml', without_verify_partial_doubles: true d
header_tags = view.content_for(:header_tags)
- expect(header_tags).to match(%r{
})
- expect(header_tags).to match(%r{
})
- expect(header_tags).to match(%r{
})
- expect(header_tags).to match(%r{
})
+ expect(header_tags).to match(%r{
})
+ expect(header_tags).to match(%r{
})
+ expect(header_tags).to match(%r{
})
+ expect(header_tags).to match(%r{
})
end
end
diff --git a/spec/workers/pubsubhubbub/distribution_worker_spec.rb b/spec/workers/pubsubhubbub/distribution_worker_spec.rb
index 5c22e7fa8e..5844850795 100644
--- a/spec/workers/pubsubhubbub/distribution_worker_spec.rb
+++ b/spec/workers/pubsubhubbub/distribution_worker_spec.rb
@@ -18,48 +18,11 @@ describe Pubsubhubbub::DistributionWorker do
it 'delivers payload to all subscriptions' do
allow(Pubsubhubbub::DeliveryWorker).to receive(:push_bulk)
subject.perform(status.stream_entry.id)
- expect(Pubsubhubbub::DeliveryWorker).to have_received(:push_bulk).with([anonymous_subscription, subscription_with_follower])
- end
- end
-
- context 'when OStatus privacy is used' do
- around do |example|
- before_val = Rails.configuration.x.use_ostatus_privacy
- Rails.configuration.x.use_ostatus_privacy = true
- example.run
- Rails.configuration.x.use_ostatus_privacy = before_val
- end
-
- describe 'with private status' do
- let(:status) { Fabricate(:status, account: alice, text: 'Hello', visibility: :private) }
-
- it 'delivers payload only to subscriptions with followers' do
- allow(Pubsubhubbub::DeliveryWorker).to receive(:push_bulk)
- subject.perform(status.stream_entry.id)
- expect(Pubsubhubbub::DeliveryWorker).to have_received(:push_bulk).with([subscription_with_follower])
- expect(Pubsubhubbub::DeliveryWorker).to_not have_received(:push_bulk).with([anonymous_subscription])
- end
- end
-
- describe 'with direct status' do
- let(:status) { Fabricate(:status, account: alice, text: 'Hello', visibility: :direct) }
-
- it 'does not deliver payload' do
- allow(Pubsubhubbub::DeliveryWorker).to receive(:push_bulk)
- subject.perform(status.stream_entry.id)
- expect(Pubsubhubbub::DeliveryWorker).to_not have_received(:push_bulk)
- end
+ expect(Pubsubhubbub::DeliveryWorker).to have_received(:push_bulk).with([anonymous_subscription.id, subscription_with_follower.id])
end
end
context 'when OStatus privacy is not used' do
- around do |example|
- before_val = Rails.configuration.x.use_ostatus_privacy
- Rails.configuration.x.use_ostatus_privacy = false
- example.run
- Rails.configuration.x.use_ostatus_privacy = before_val
- end
-
describe 'with private status' do
let(:status) { Fabricate(:status, account: alice, text: 'Hello', visibility: :private) }
diff --git a/streaming/index.js b/streaming/index.js
index 3e80c8b308..017073fa11 100644
--- a/streaming/index.js
+++ b/streaming/index.js
@@ -264,7 +264,7 @@ const startWorker = (workerId) => {
const transmit = () => {
const now = new Date().getTime();
const delta = now - queued_at;
- const encodedPayload = typeof payload === 'number' ? payload : JSON.stringify(payload);
+ const encodedPayload = typeof payload === 'object' ? JSON.stringify(payload) : payload;
log.silly(req.requestId, `Transmitting for ${req.accountId}: ${event} ${encodedPayload} Delay: ${delta}ms`);
output(event, encodedPayload);
diff --git a/yarn.lock b/yarn.lock
index c1c27a615c..640d06a102 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -982,6 +982,10 @@ base64-js@^1.0.2:
version "1.2.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886"
+batch-processor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8"
+
batch@0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
@@ -1234,6 +1238,10 @@ chai@^4.1.0:
pathval "^1.0.0"
type-detect "^4.0.0"
+chain-function@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc"
+
chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
@@ -1972,7 +1980,7 @@ doctrine@^2.0.0:
esutils "^2.0.2"
isarray "^1.0.0"
-"dom-helpers@^2.4.0 || ^3.0.0", dom-helpers@^3.0.0, dom-helpers@^3.2.1:
+"dom-helpers@^2.4.0 || ^3.0.0", dom-helpers@^3.0.0, dom-helpers@^3.2.0, dom-helpers@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a"
@@ -2049,6 +2057,12 @@ electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.14:
version "1.3.15"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz#08397934891cbcfaebbd18b82a95b5a481138369"
+element-resize-detector@^1.1.12:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.1.12.tgz#8b3fd6eedda17f9c00b360a0ea2df9927ae80ba2"
+ dependencies:
+ batch-processor "^1.0.0"
+
elliptic@^6.0.0:
version "6.4.0"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
@@ -2061,6 +2075,12 @@ elliptic@^6.0.0:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.0"
+emoji-mart@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/emoji-mart/-/emoji-mart-1.0.1.tgz#0ef2fd2bf4b6762aab7486c26c574387f034e392"
+ dependencies:
+ measure-scrollbar "^0.1.0"
+
emoji-regex@^6.1.0:
version "6.4.3"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.4.3.tgz#6ac2ac58d4b78def5e39b33fcbf395688af3076c"
@@ -3853,6 +3873,10 @@ mathjs@^3.11.5:
tiny-emitter "2.0.0"
typed-function "0.10.5"
+measure-scrollbar@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/measure-scrollbar/-/measure-scrollbar-0.1.0.tgz#2bbfac6773bcbb98d814e6890554c0b92846fe6f"
+
media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@@ -5131,6 +5155,12 @@ promise@^7.1.1:
dependencies:
asap "~2.0.3"
+prop-types-extra@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.0.1.tgz#a57bd4810e82d27a3ff4317ecc1b4ad005f79a82"
+ dependencies:
+ warning "^3.0.0"
+
prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.8:
version "15.5.10"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154"
@@ -5329,6 +5359,17 @@ react-notification@^6.7.1:
dependencies:
prop-types "^15.5.10"
+react-overlays@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.8.1.tgz#26e480003c2fd6f581a4a66c0c86cb3dff17e626"
+ dependencies:
+ classnames "^2.2.5"
+ dom-helpers "^3.2.1"
+ prop-types "^15.5.10"
+ prop-types-extra "^1.0.1"
+ react-transition-group "^2.0.0-beta.0"
+ warning "^3.0.0"
+
react-redux-loading-bar@^2.9.2:
version "2.9.2"
resolved "https://registry.yarnpkg.com/react-redux-loading-bar/-/react-redux-loading-bar-2.9.2.tgz#f0e604ee35af5ecb25addb10bf24ca3d478c95a8"
@@ -5382,6 +5423,14 @@ react-simple-dropdown@^3.0.0:
classnames "^2.1.2"
prop-types "^15.5.8"
+react-sizeme@^2.3.5:
+ version "2.3.5"
+ resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-2.3.5.tgz#f14c0a15f9b24d7b8b6f196871b0af19aa01a422"
+ dependencies:
+ element-resize-detector "^1.1.12"
+ invariant "^2.2.2"
+ lodash "^4.17.4"
+
react-swipeable-views-core@^0.11.1:
version "0.11.1"
resolved "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.11.1.tgz#61d046799f90725bbf91a0eb3abcab805c774cac"
@@ -5430,6 +5479,17 @@ react-toggle@^4.0.1:
dependencies:
classnames "^2.2.5"
+react-transition-group@^2.0.0-beta.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.2.0.tgz#793bf8cb15bfe91b3101b24bce1c1d2891659575"
+ dependencies:
+ chain-function "^1.0.0"
+ classnames "^2.2.5"
+ dom-helpers "^3.2.0"
+ loose-envify "^1.3.1"
+ prop-types "^15.5.8"
+ warning "^3.0.0"
+
react-virtualized@^9.7.4:
version "9.9.0"
resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.9.0.tgz#799a6f23819eeb82860d59b82fad33d1d420325e"